見出し画像

OpenAIの裏APIを叩いて利用状況を取得する

OpenAIのAPIはAI時代を生き抜く我々にとっては、クレジットカードぐらいに重要なものです。
そのカギと使用状況はかなり真面目に管理したいところ。

そういうOpenAI公式のAPIはないのか…?たとえば Billing API、Usage API…なんとなく存在は感じるのですが…ちゃんと使いたいんだけどドキュメントがない…。
とかTwitterで書いていると知らない人が「llm.report」なるサイトを紹介してくれました。


llm.report

んまあすてき!使っているAPI種類によって可視化してくれるのね!
まあそうなんですが、OpenAIのキーを他に記録したくない。
(このサイトは外部保存しません、って書いてあるのでそれは信用してもいいのかもしれないけど)その実装が大丈夫なのかを調べる時間が勿体ない。

これで"驚きツイート"しておわり!でもいいのですが、
(例:「これはすごい!OpenAI APIの使用状況が一目で…」)

世界の開発者の皆さんが勝手にダッシュボードを見て穿り出しているので。さすが開発者だな~と思ったので紹介します。しかも結構前。

OpenAI Usage を取得する(htnosmさん 2023-04-02)

2021-08-21にはOpenAI公式のフォーラムでこんなやりとりがありました。
Separating usage reporting and billing by project - General API discussion - OpenAI API Community Forum

https://community.openai.com/t/separating-usage-reporting-and-billing-by-project/8672


こんにちは、私は機械学習エンジニアとして複数のクライアントにコンサルティングを行っています。あるクライアントのプロジェクトでGPT-3を使い、GPT-3のコストを研究開発費の一部としてクライアントに透過的に渡すために、しばらくGPT-3を研究していました。
今回、別のクライアントのプロジェクトでもGPT-3を使いたいのですが、プロジェクト単位でGPT-3の使用や課金を分ける方法が見つかりません。
何か見落としているのでしょうか?APIキーで利用を分けたり、私のアカウントに関連する別の組織を作ることは可能でしょうか?それとも、他に推奨される方法があるのでしょうか?

https://community.openai.com/t/separating-usage-reporting-and-billing-by-project/8672

いやほんとそれですよ…!その当時の公式の回答は…

support@openai.com、状況を説明し、適切な解決策を見つけ出します!

https://community.openai.com/t/separating-usage-reporting-and-billing-by-project/8672

だったのですが、その1年後(2022-1-19)にこんなハッキングが。

https://community.openai.com/t/separating-usage-reporting-and-billing-by-project/8672/5

簡単に意訳解説すると、
ブラウザの「検証」→「Network」→Recして操作→usage?で始まるリクエストがキャプチャできるのでそれを右クリックしてcURLのリクエスト文字列が取得できる~。

そうやって取得した文字列がこんな感じ

curl "https://api.openai.com/dashboard/billing/usage?end_date=2023-06-01&start_date=2023-05-01" ^
  -H "authority: api.openai.com" ^
  -H "accept: */*" ^
  -H "accept-language: ja-JP,ja;q=0.9,en-US;q=0.8,en;q=0.7,fr;q=0.6" ^
  -H "authorization: Barer sess-hogehoge" ^
  -H "openai-organization: org-hogehoge" ^
  -H "origin: https://platform.openai.com" ^
  -H "referer: https://platform.openai.com/" ^
  -H "sec-ch-ua: ^\^"Chromium^\^";v=^\^"112^\^", ^\^"Google Chrome^\^";v=^\^"112^\^", ^\^"Not:A-Brand^\^";v=^\^"99^\^"" ^
  -H "sec-ch-ua-mobile: ?0" ^
  -H "sec-ch-ua-platform: ^\^"Windows^\^"" ^
  -H "sec-fetch-dest: empty" ^
  -H "sec-fetch-mode: cors" ^
  -H "sec-fetch-site: same-site" ^
  -H "user-agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/112.0.0.0 Safari/537.36" ^
  --compressed

※sess-がセッショントークンです。
これを以下のようなPythonコードに落とせば…

!curl 'https://api.openai.com/dashboard/billing/usage?end_date=2023-02-01&start_date=2023-01-01' \
  # ... WHATEVER
  --compressed > usage.json

d = json.load(open("usage.json"))

# compute price for "Base"
price_base = 0 # Base
price_embeddings = 0 # Embeddings
ft_training = 0 # FT Training
ft_inference = 0 # FT Inference
dalle = 0 # DALL-E API
for e in d["daily_costs"]:
    for b in e["line_items"]:
        if b["name"] == "Base":
            price_base += b["cost"]
        if b["name"] == "Embeddings":
            price_embeddings += b["cost"]
        if b["name"] == "FT Training":
            ft_training += b["cost"]
        if b["name"] == "FT Inference":
            ft_inference += b["cost"]
        if b["name"] == "DALL-E API":
            dalle += b["cost"]
print(f"Text generation price: {price_base}")
print(f"Embeddings price: {price_embeddings}")
print(f"FT Training price: {ft_training}")
print(f"FT Inference price: {ft_inference}")
print(f"DALL-E API price: {dalle}")

という話なのですが、まあそうよね。
これを参考にしたSlackボットへの実装例は前掲に紹介あり。

でも僕はこんな回りくどいことはしたくない!
今すぐに使用状況を見たいんだ!
というわけでVSCodeのREST Client機能拡張から叩きます。

※ここから先は、何の保証もない作業なので開発者だけが参考にしてくださいね!筆者は何の責任も持ちません


こんな感じです

ReES Clientをインストールして[Send Request]を押すだけ
https://api.openai.com/dashboard/billing/usage?end_date=2023-06-01&start_date=2023-05-01
 Content-Type: application/json
 Authorization: Bearer {{OpenAI}}

便利なリクエストは openai.http なるファイルに保存しておけばOK、そして大事なことだけどAPIキーはこんなところに保存しない。上記のコードにあるように {{OpenAI}} という形で環境変数に保存しよう。

setting.json に記載します。やり方はこの辺みてね。

これを集計する関数などはPythonで書いてもいいし、GASで集計を書いてメールするでもいい。

ちなみにデイリーの使用状況、つまり1件1件のリクエスト、消費したトークンなどはこのエンドポイントで見れるっぽい。

https://api.openai.com/v1/usage?date=2023-05-05

リクエストの返答例

んまあ結局、公式フォーラムの質問者にあったような「プロジェクトごとの集計」はいまだに実装されていないっぽいのだけど、上記のリクエストでBearerトークンを切り替えれば、アカウントごと(gmail認証のアカウント)の集計ぐらいはできる。逆いえばAPI KEYごとの消費はあいかわらずカウントできない。

これについても上記の方法で、裏APIが取得できます。

https://api.openai.com/dashboard/user/api_keys

これで、Webダッシュボードに表示されているとおり、キーごとの最終利用時刻が獲得できます。ほんとはキーごとの残量を見て切り替えるとか、細かな通知をするとかやりたいんだが~。

上記の方法は公開されていないAPIなので今後仕様が変わったりする可能性は大いにあるし、何の保証もないのでご注意ください。

公式側は「Authentication」というAPIを用意しています。

https://platform.openai.com/docs/api-reference/authentication

curl https://api.openai.com/v1/models \
  -H "Authorization: Bearer $OPENAI_API_KEY" \
  -H "OpenAI-Organization: org-hogehoge"

複数の組織に属するユーザーの場合、API 要求に使用される組織を指定するヘッダーを渡すことができます。これらの API リクエストからの使用は、指定された組織のサブスクリプション クォータに対してカウントされます。

https://platform.openai.com/docs/api-reference/authentication

ということなので、細かくカウントしたかったらorg(組織)を増やすしかなさそう。

以上、OpenAIの裏APIについて現場からお送りしました。

おまけ

お楽しみカバーイラストメイキングです。
有料パートはプロンプトの掲載があります。
購入されるたびに値段が上がります(応援感謝です!)

a white hacker girl, crawling to the keyboard, innocent eyes, opened mouth, curvey, attractive, neon colors, ultra realistic, highest quality --niji 5 --style expressive --ar 16:9
a white hacker girl, crawling to the keyboard, innocent eyes, opened mouth, curvey, attractive, neon colors, 3D rendering, dramatic, intricate details, ultra realistic, highest quality --niji 5 --style expressive --ar 16:9


男子も描いてる(好き)

ここから先は

1,453字 / 7画像

¥ 200

この記事が気に入ったらチップで応援してみませんか?