QFIN API Management の使い方

PLaMo と Azure OpenAI のモデルを、1つの OpenAI 互換 API から呼び出せます。モデルを切り替えるときは、リクエストの model を変えるだけです。

1. APIキーを取得する

上部メニューの Products から Qfin API を選び、Subscribe してください。承認待ちはなく、その場で使えるようになります。発行されたキーは Profile ページで確認できます。

キーは秘密情報です。コードやGitに直接書かず、環境変数などで渡してください。

2. Base URL は2つ

OpenAI SDK の api_key にキーを入れるだけで使えるのはこちら (Compatibility Proxy が認証形式を変換します):

https://qfin-apim-test-proxy.ashywater-e0acd8b4.japaneast.azurecontainerapps.io/llm/v1

APIM を直接呼ぶ場合はこちら。キーは Ocp-Apim-Subscription-Key ヘッダーで渡します:

https://qfin-apim-test.azure-api.net/llm/v1

3. 呼び出す (Python)

pip install openai

import os

from openai import OpenAI

client = OpenAI(api_key=os.environ["QFIN_API_KEY"], base_url="https://qfin-apim-test-proxy.ashywater-e0acd8b4.japaneast.azurecontainerapps.io/llm/v1")

r = client.chat.completions.create(model="plamo-3.0-prime", messages=[{"role": "user", "content": "こんにちは"}])

print(r.choices[0].message.content)

APIM を直接呼ぶ場合は、キーをヘッダーでも渡します:

client = OpenAI(api_key=os.environ["QFIN_API_KEY"], base_url="https://qfin-apim-test.azure-api.net/llm/v1", default_headers={"Ocp-Apim-Subscription-Key": os.environ["QFIN_API_KEY"]})

4. curl で試す

curl -X POST "https://qfin-apim-test.azure-api.net/llm/v1/chat/completions" -H "Ocp-Apim-Subscription-Key: $QFIN_API_KEY" -H "Content-Type: application/json" -d '{"model":"plamo-3.0-prime","messages":[{"role":"user","content":"こんにちは"}]}'

5. streaming

そのまま動きます。

s = client.chat.completions.create(model="gpt-5.6-luna", messages=[{"role": "user", "content": "1から5まで"}], stream=True)

for chunk in s: print(chunk.choices[0].delta.content or "", end="")

6. 使えるモデル

Azure OpenAI (gpt-4.1、gpt-5.6-luna など) と PLaMo (plamo-3.0-prime など) が同じ名前空間に並びます。一覧は上部メニューの APIs か、次で取得できます:

print([m.id for m in client.models.list().data])

生成のほかに /responses、/tokenize (PLaMoのみ) が使えます。

7. provider固有のAPI (native)

通常は /llm/v1 で足ります。provider 固有の機能が必要なときだけ、次の2系統も使えます。キー・上限・予算の扱いは /llm/v1 と同じです。

Azure OpenAI は target ごとに分かれています。Azure OpenAI 側のパスをそのまま使えます (GET/POST/PUT/PATCH/DELETE)。現在公開しているモデルはすべて sweden-central です:

https://qfin-apim-test.azure-api.net/azure-oai-isol-qfin-sweden-central/openai/v1

https://qfin-apim-test.azure-api.net/azure-oai-isol-qfin-west-us/openai/v1

west-us はエンドポイントだけ用意してあり、いまはこの target に公開中のモデルがありません (指定すると 403 になります)。

PLaMo (公開しているのは GET /models・POST /chat/completions・POST /tokenize の3つです):

https://qfin-apim-test.azure-api.net/plamo/openai/v1

使い方は /llm/v1 と同じで、Base URL を差し替えるだけです:

client = OpenAI(api_key=os.environ["QFIN_API_KEY"], base_url="https://qfin-apim-test.azure-api.net/azure-oai-isol-qfin-sweden-central/openai/v1", default_headers={"Ocp-Apim-Subscription-Key": os.environ["QFIN_API_KEY"]})

r = client.chat.completions.create(model="gpt-5.6-luna", messages=[{"role": "user", "content": "こんにちは"}])

native の model には Azure 側のデプロイ名を指定します。QFIN で公開しているモデルは公開名とデプロイ名が同じなので、/llm/v1 と同じ名前で通ります。

注意: native の /models はバックエンドの一覧をそのまま返すため、QFIN で公開していないモデルも見えます。指定しても 403 になります。使えるのは /llm/v1/models に出るモデルだけです。

8. 利用量と上限

上限はユーザーとモデルの組ごとに、分間トークン (TPM)・月間トークン・USD予算の3つで管理しています。今月の使用量と残りは Usage ページで確認できます (サインインが必要です)。

応答ヘッダーにも残量が入ります:

X-QFIN-Remaining-Tokens-Minute

X-QFIN-Remaining-Tokens-Month

X-QFIN-Remaining-USD-Month

X-QFIN-Tokens-Consumed

SDKから読むときは with_raw_response を使います:

raw = client.chat.completions.with_raw_response.create(model="plamo-3.0-prime", messages=[{"role": "user", "content": "hi"}])

print(raw.headers.get("X-QFIN-Remaining-USD-Month"))

Azure AI サービス (音声・翻訳・文書解析)

Azure AI Foundry の非LLMサービス (音声・翻訳・文書解析) を、Azure本来のパスのまま /azure-foundry-service/... で使えます。認証はQFINのAPIキーだけで、Azure側のキーは要りません。

テキスト読み上げ
POST /azure-foundry-service/tts/cognitiveservices/v1 … SSMLを送るとMP3が返ります

音声の文字起こし
POST /azure-foundry-service/speechtotext/transcriptions:transcribe?api-version=2025-10-15 … 音声ファイルを multipart で送ります

テキスト翻訳
POST /azure-foundry-service/translator/text/v3.0/translate?api-version=3.0&to=en

言語検出・PIIマスキング・医療テキスト解析
POST /azure-foundry-service/language/:analyze-text?api-version=2024-11-01

文書の解析 (OCR・レイアウト・請求書など)
POST /azure-foundry-service/documentintelligence/documentModels/prebuilt-layout:analyze?pages=1-3
ページ課金です。pages= で範囲を宣言してください (未指定だと100ページ分を確保します)。1リクエスト100ページまでで、超える範囲を指定すると403になります。

音声・画像・映像の解析 (Content Understanding)
POST /azure-foundry-service/contentunderstanding/analyzers/prebuilt-audio:analyzeBinary?api-version=2025-11-01
非同期です。受付時に返る Operation-Location をそのまま叩くと結果が取れます (URLはgateway側に書き換えてあります)。返ってきたURLをそのまま使ってください — 結果の取得には投入した本人だけが持つ署名が必要で、URLを自分で組み立てると403になります。

使ってみる
curl -s "https://qfin-apim-test.azure-api.net/azure-foundry-service/translator/text/v3.0/translate?api-version=3.0&to=en" -H "Ocp-Apim-Subscription-Key: $QFIN_API_KEY" -H "Content-Type: application/json" -d '[{"Text":"こんにちは"}]'

課金
リクエストの大きさから実費の上限を見積もって予約し、精算します(文字数・音声の長さ・ページ数のいずれか)。Content-Length が必要です (chunkedでの送信は411になります)。一覧やポーリング (GET) は課金されません。

できないこと
・文書のアナライザーは Content Understanding では使えません(ページ課金で費用の上限を見積もれないため)。文書は上の documentintelligence を使ってください
・保存先URLを入力にする一括ジョブ (translator/document/batches, speechtotext/.../transcriptions) は使えません。同期のエンドポイントを使ってください
・DELETE は自分が投入したジョブの後始末にだけ使えます
・モデル管理・カスタム学習のパスは通しません
・レート制限は Content Understanding の解析投入が 10 req/分、GETが 300 req/分、その他は 60 req/分です

9. エラーが返るとき

429 … 分間トークン上限 (TPM)。少し待ってから再送してください。

403 … 月間トークン上限かUSD予算の超過、もしくは公開していないモデルの指定です。使えるモデル名は /llm/v1/models で確認できます。

401 … キーが無効です。400 は2種類の認証方式を同時に送った場合です。

503 … 予算チェック基盤の一時的な応答です。間隔を空けて数回まで再送してください。

10. 上限を引き上げたいとき

上限の設定はGitリポジトリで管理しています。引き上げが必要な場合は、対象のモデル名と用途を添えて管理者へ連絡してください。