このエントリは2024/11/22現在の情報に基づいています。将来の機能追加や変更に伴い、記載事項からの乖離が発生する可能性があります。
問い合わせ
昨日のStream有効時のtoken usageの最新状況を問い合わせてきたいつもの人から、更問をもらった。
今後社内でAOAIを使ってもらうときに、利用モデル、トークンに応じて課金し、各部署に請求しようと思っているのだが、Azureのトークン単価をPricingのページからコピー&ペーストするのはどうにもつらい。最新に追随しやすく、かつ自動化できる仕組みってないの?
「気持ちはわかるぞ、気持ちは…。でもAzureの単価にちょっと上乗せするんだったら、上前がばれるんちゃうの?知らんけど」と思ったのはないしょ。
解決策
AzureのPricingページの情報は、Azure Retail Prices REST APIで取得できる。
Azure 小売価格の概要 / Azure Retail Prices overview
https://learn.microsoft.com/rest/api/cost-management/retail-prices/azure-retail-prices
ドキュメントに重要と記載があるように、サービス価格はUSDで決まる(JPYはその時々の為替で金額が変わる)ので、単価を取得する際にはUSDで取得しておくのが確実。
The currency that Microsoft uses to price all Azure services is USD. Prices shown in USD currency are Microsoft retail prices. Other non-USD prices returned by the API are for your reference to help you estimate budget expenses.(Microsoft がすべての Azure サービスの価格を設定するために使用する通貨は USD です。 USD 通貨で表示される価格は、Microsoft の小売価格です。 API によって返されるその他の米国ドル以外の価格は、予算経費を見積もるのに役立つ参照用です。)
使ってみる
最新バージョンは https://prices.azure.com/api/retail/prices?api-version=2023-01-01-preview 。単純にGETで呼びだしてもいいが、サービスSKUの個数が大量にあるので、1,000件でページネーションするようになっている。
GET https://prices.azure.com/api/retail/prices?api-version=2023-01-01-preview&meterRegion='primary'
{
"BillingCurrency": "USD",
"CustomerEntityId": "Default",
"CustomerEntityType": "Retail",
"Items": [{...}],
"NextPageLink": "https://prices.azure.com:443/api/retail/prices?api-version=2023-01-01-preview&meterRegion=%27primary%27&$skip=1000",
"Count": 1000
}
例えばJapan East、Azure OpenAI Serviceの価格を知りたい場合には、条件式として
$filter=armRegionName eq 'japaneast' and productName eq 'Azure OpenAI'
をクエリ文字列として追加すればよい。
Pricingのページとちょっと違うのでは?
APIからの出力単価と違うのでは、という指摘をもらったが、これはAPIレスポンスに含まれるunitOfMeasureが同じではないから。APIの結果は1Kあたりの単価であり、Pricingページの単価は1Mあたりの単価なので、注意が必要。
参考のため、2024/11/22現在の東日本リージョンにおけるGPT-4o Realtime Preview (Global) の単価を例示する(行数が大きいため、jqで整形済み)。
# 東日本、Azure OpenAIの、GPT-4o Realtime Preview (Global)
# GET https://prices.azure.com/api/retail/prices?api-version=2023-01-01-preview&meterRegion='primary'&$filter=armRegionName eq 'japaneast' and productName eq 'Azure OpenAI' and contains(meterName, 'realtime')
cat response.json | jq -rc '.Items[] | "\(.skuName): (Unit \(.unitOfMeasure)) UnitPrice: \(.unitPrice)"'
gpt4o realtimePrvw audio inp glbl: (Unit 1K) UnitPrice: 0.1
gpt4o realtime prvw text outp glbl: (Unit 1K) UnitPrice: 0.02
gpt4o realtimePrvw audio outp glbl: (Unit 1K) UnitPrice: 0.2
gpt4o realtime prvw text inp glbl: (Unit 1K) UnitPrice: 0.005
対して、Pricingのページ。Pricingページでは、1Mあたりになっていることがわかる。
