Foundry Portal(New)からAI Gatewayとして、Token管理が非常にしやすくなり、調べてみました。
特に10万リクエストまで無料となったのは、検証時などにありがたいです。
Free for up to 100,000 requests when created as an AI Gateway in Azure AI Foundry.
設定
1. API Managementリソース作成
1.1. AI Gateway 作成
Foundry Portal(New)のメニュー Operate -> Admin で AI Gatewayタブを選択し、「Add AI Gatway」ボタンをクリック

1.2. API Managementリソース確認
AI Gateway(API Management)ができました

API Management 画面でも確認
リソースグループなかったですが、勝手にFoundryと同じリソースグループに割りあたりました。
レベルは「Basic V2」で作成されました。

バックエンドにFoundryリソースが登録されていて、マネージドIDでの認可を使うようです。


製品もできています(他作業をやった後に確認したので、このタイミングでできていないかもしれません)。

2. Token管理設定
2.1. (1分あたりの)Limits 設定
Foundry Portal(New)画面でLimitsタブから1分あたりのLimits 設定

2.2. (規定時間あたりの)Quotas設定
Foundry Portal(New)画面でLimitsタブから単位時間あたりのQuotas 設定。今回は300Token/時間。

2.3. 設定値を API Managementで確認
Azure Portalの製品のポリシーに設定値が反映されていることを確認

サンプルコード
環境
Ubuntu22.04(WSL)でPython3.11で動かしています。
以下のパッケージを使用
| Package | Version | 備考 |
|---|---|---|
| openai | 2.11 |
Python Script
LLM呼出
プレイグラウンドで見えるコードを参考に作りました。
エンドポイントがAPIMのものに置き換わっています。意外と細かいことをしてくれている。Project API KeyがAPI Management の Subscription Keyにもなってくれています。

from openai import OpenAI
endpoint = "https://<foundry resource>.azure-api.net/<foundry resource>/openai/v1/"
deployment_name = "gpt-5-mini"
api_key = "<key>"
client = OpenAI(
base_url=endpoint,
api_key=api_key
)
def chat(number: str):
completion = client.chat.completions.create(
model=deployment_name,
extra_headers={"api-key": api_key},
messages=[
{
"role": "user",
"content": f"{number}から連想する話をして?",
}
],
)
return completion
completion = chat("42")
print(completion.choices[0].message)
for i in range(10):
print(f"===== {i} =====")
completion = chat(str(i))
print(completion.choices[0].message)
エラー確認
先ほどのプログラムを実行。
(1分あたりの)Limits 設定超過エラー
1分あたりのLimits 設定エラー発生時のエラー。403で出ます。
PermissionDeniedError: Error code: 403 -
{'statusCode': 403, 'message': 'Token quota is exceeded. Try again in 55 minutes and 58 seconds.'}
(規定時間あたりの)Quotas 設定超過エラー
1時間あたり300Tokenで設定したQuotasのエラーは429で出ます。
RateLimitError: Error code: 429 -
{'statusCode': 429, 'message': 'Token limit is exceeded. Try again in 164 seconds.'}

