OpenAIの裏APIを叩いて利用状況を取得する
OpenAIのAPIはAI時代を生き抜く我々にとっては、クレジットカードぐらいに重要なものです。
そのカギと使用状況はかなり真面目に管理したいところ。
そういうOpenAI公式のAPIはないのか…?たとえば Billing API、Usage API…なんとなく存在は感じるのですが…ちゃんと使いたいんだけどドキュメントがない…。
とかTwitterで書いていると知らない人が「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
いやほんとそれですよ…!その当時の公式の回答は…
だったのですが、その1年後(2022-1-19)にこんなハッキングが。
簡単に意訳解説すると、
ブラウザの「検証」→「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機能拡張から叩きます。
※ここから先は、何の保証もない作業なので開発者だけが参考にしてくださいね!筆者は何の責任も持ちません
こんな感じです
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"
ということなので、細かくカウントしたかったらorg(組織)を増やすしかなさそう。
以上、OpenAIの裏APIについて現場からお送りしました。
おまけ
お楽しみカバーイラストメイキングです。
有料パートはプロンプトの掲載があります。
購入されるたびに値段が上がります(応援感謝です!)
ここから先は
¥ 200
この記事が気に入ったらチップで応援してみませんか?