ERNIE 5.1は2026年5月9日にリリースされ、1週間以内にQianfan APIが公開されました。独自コードからモデルを呼び出す、ツールコールをルーティングする、またはApidogでエージェントループに接続する場合に必要な、アカウント作成、APIキー、リクエストボディ、ストリーミング、ツール使用、エラー処理を実装手順としてまとめます。
この記事では実装に必要な部分だけを扱います。最終的に、動作するcurl、Python、Node.jsのサンプルと、Apidogに取り込んで比較検証できるリクエスト構成を作れます。
まだ読んでいない場合は、先にERNIE 5.1の発表詳細を確認してください。DeepSeek V4やKimi K2.6とのベンチマークやトレードオフが整理されています。この記事は、その実装編です。
ステップ1:Qianfan APIキーを取得する
ERNIE 5.1は、Baidu Intelligent CloudのQianfanプラットフォーム経由で提供されます。独立した「ERNIE API」ではなく、API呼び出しはすべてQianfan経由です。
手順は次のとおりです。
- cloud.baidu.comにアクセスし、Baidu Intelligent Cloudアカウントを作成またはサインインします。国際開発者はメールで登録できますが、一部のエンタープライズ機能には中国本土の電話番号が必要です。
- console.bce.baidu.com/qianfanでQianfanコンソールを開きます。
-
API Key Management(
API Key 管理)で、Create API Keyをクリックします。 - ワークスペースを選択し、チャット補完サービスへのアクセスを許可します。
- APIキーをコピーします。形式は
bce-v3/ALTAK-xxxx/xxxxのようになります。 - キーはソースコードに直書きせず、環境変数に保存します。
export QIANFAN_API_KEY="bce-v3/ALTAK-xxxx/xxxx"
実装前に確認すべき点は2つあります。
- 新しいv2エンドポイントは単一のBearerトークンを使います。古いv1 OAuth
access_tokenフローは非推奨なので、新規実装では使わないでください。 - ERNIE 5.1はリリース初日から有料モデルです。最初のリクエスト前に少額の残高をチャージしてください。テスト用途なら¥10程度で十分です。
ステップ2:OpenAI互換エンドポイントをcurlで叩く
QianfanはOpenAI互換のチャット補完エンドポイントを提供しています。既存のOpenAI形式のクライアントやラッパーがある場合、多くはベースURLとモデルIDの変更だけで動きます。
-
ベースURL:
https://qianfan.baidubce.com/v2 -
モデルID:
ernie-5.1 -
早期アクセス機能:
ernie-5.1-previewも利用可能
最小構成のリクエストは次のとおりです。
curl https://qianfan.baidubce.com/v2/chat/completions \
-H "Authorization: Bearer $QIANFAN_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"model": "ernie-5.1",
"messages": [
{"role": "system", "content": "You are a senior API designer."},
{"role": "user", "content": "Sketch a REST schema for a GitHub-style PR review API. Be concise."}
],
"temperature": 0.3
}'
レスポンスは標準的なOpenAI形式です。
{
"id": "chatcmpl-...",
"object": "chat.completion",
"created": 1746780000,
"model": "ernie-5.1",
"choices": [
{
"index": 0,
"message": { "role": "assistant", "content": "..." },
"finish_reason": "stop"
}
],
"usage": {
"prompt_tokens": 42,
"completion_tokens": 318,
"total_tokens": 360
}
}
エラー時は、まず次を確認してください。
-
401 Unauthorized: APIキーが誤っている、または期限切れです。キーを再生成してください。 -
403: キーは有効ですが、ワークスペースでERNIE 5.1が有効化されていません。Qianfanコンソールでモデル許可を追加してください。
ステップ3:PythonからERNIE 5.1を呼び出す
OpenAI互換エンドポイントなので、公式のopenai Python SDKをそのまま使えます。base_urlをQianfanに向けるだけです。
import os
from openai import OpenAI
client = OpenAI(
api_key=os.environ["QIANFAN_API_KEY"],
base_url="https://qianfan.baidubce.com/v2",
)
response = client.chat.completions.create(
model="ernie-5.1",
messages=[
{"role": "system", "content": "You explain APIs in plain English."},
{"role": "user", "content": "Why would I use server-sent events over WebSockets for a chat UI?"},
],
temperature=0.4,
)
print(response.choices[0].message.content)
print(f"\nTokens used: {response.usage.total_tokens}")
既存コードでOpenAI SDKのラッパーを使っている場合、A/Bテスト用にERNIE 5.1へ切り替える変更は最小限で済みます。DeepSeekのAPIや他の多くの中国系モデルプロバイダーでも、同じアプローチが使えます。
ステップ4:チャットUI向けにトークンをストリーミングする
ユーザー向けチャットUIでは、レスポンス全体を待つよりもストリーミング表示が適しています。stream: trueを指定し、Server-Sent Eventsを消費します。
stream = client.chat.completions.create(
model="ernie-5.1",
messages=[{"role": "user", "content": "Write a haiku about API versioning."}],
stream=True,
)
for chunk in stream:
delta = chunk.choices[0].delta.content
if delta:
print(delta, end="", flush=True)
curlでデバッグする場合は、--no-bufferを付けます。
curl https://qianfan.baidubce.com/v2/chat/completions \
-H "Authorization: Bearer $QIANFAN_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"model": "ernie-5.1",
"stream": true,
"messages": [{"role": "user", "content": "Stream a 3-sentence joke."}]
}' \
--no-buffer
ストリーム形式はOpenAIと同じです。data: {...}の行が連続し、最後にdata: [DONE]が返ります。
ステップ5:ツールでERNIE 5.1を使う(エージェント機能)
ERNIE 5.1は、τ³-benchとSpreadsheetBench-VerifiedでDeepSeek-V4-Proを上回るスコアを記録しています。つまり、ツール呼び出しはデモ用途だけでなく、本番向けエージェント設計でも検討対象になります。
ツール定義のスキーマはOpenAIの関数呼び出しと同じです。
tools = [
{
"type": "function",
"function": {
"name": "get_weather",
"description": "Get current weather for a city.",
"parameters": {
"type": "object",
"properties": {
"city": {"type": "string", "description": "City name, e.g. Singapore"},
"unit": {"type": "string", "enum": ["celsius", "fahrenheit"]},
},
"required": ["city"],
},
},
}
]
response = client.chat.completions.create(
model="ernie-5.1",
messages=[{"role": "user", "content": "What's the weather in Tokyo right now?"}],
tools=tools,
tool_choice="auto",
)
tool_calls = response.choices[0].message.tool_calls
if tool_calls:
call = tool_calls[0]
print(f"Model wants to call: {call.function.name}({call.function.arguments})")
実装時の基本ループは次の流れです。
- ユーザー入力とツール定義をモデルに渡す。
-
tool_callsが返ったら、アプリケーション側で実際のツールを実行する。 - 実行結果を
toolロールのメッセージとして会話履歴に追加する。 - 再度モデルを呼び出す。
-
finish_reason == "stop"かつtool_callsが空なら終了する。
注意点として、ERNIE 5.1はツール引数を常にクリーンなJSON文字列として返すとは限りません。文字列化されたJSONがコードフェンス内に入って返る場合があります。json.loads()はtry/exceptでラップし、失敗した場合は
## ステップ6:Node.jsからERNIE 5.1を呼び出す
`openai` v5+を使っているNode.jsプロジェクトなら、同じように`baseURL`をQianfanへ向けます。
javascript
import OpenAI from "openai";
const client = new OpenAI({
apiKey: process.env.QIANFAN_API_KEY,
baseURL: "https://qianfan.baidubce.com/v2",
});
const completion = await client.chat.completions.create({
model: "ernie-5.1",
messages: [
{ role: "user", content: "Return a JSON object with 3 API design tips." },
],
response_format: { type: "json_object" },
});
console.log(completion.choices[0].message.content);
`response_format: { type: "json_object" }`は利用できます。ただし、厳密なJSONスキーマ指定(`json_schema`)はQianfanでまだ展開中です。スキーマ制約をモデル側に完全に任せず、アプリケーション側でもレスポンス形式を検証してください。
## ステップ7:Apidogでテストと比較を行う
ERNIE 5.1、DeepSeek V4、Kimi K2.6のどれを使うか比較するなら、ターミナルで個別に`curl`するより、[Apidog](https://apidog.com?utm_source=dev.to&utm_medium=wanda&utm_content=n8n-post-automation)で同じ条件のリクエストを管理する方が再現性を確保しやすくなります。
推奨構成は次のとおりです。
1. Apidogを開き、「LLM bake-off」という新しいプロジェクトを作成します。
<figure class="kg-card kg-image-card"><img src="https://assets.apidog.com/blog-next/2026/05/image-81.png" class="kg-image" alt="" loading="lazy" width="2784" height="1824"></figure>
2. 環境変数として、次を追加します。
text
QIANFAN_API_KEY
DEEPSEEK_API_KEY
MOONSHOT_API_KEY
<figure class="kg-card kg-image-card"><img src="https://assets.apidog.com/blog-next/2026/05/image-82.png" class="kg-image" alt="" loading="lazy" width="2784" height="1824"></figure>
3. プロバイダーごとにリクエストを作成します。
- Qianfan: `model`を`ernie-5.1`に設定
- DeepSeek: `model`を`deepseek-chat`に設定
- Moonshot/Kimi: `model`を`kimi-k2-6`に設定
4. 3つのリクエストで同じ`messages`配列を使います。
5. Apidogの「Run」機能で並行実行し、出力を比較します。
無料枠でもこの比較は扱いやすいです。[Apidog](https://apidog.com?utm_source=dev.to&utm_medium=wanda&utm_content=n8n-post-automation)は環境ごとにリクエスト履歴を保存するため、後日同じ評価を新しいモデルバージョンに対して再実行できます。tmuxペインで複数の`curl`を監視するより、比較結果を残しやすくなります。
マルチプロバイダーテストの詳細は、[Test local LLMs as APIs](http://apidog.com/blog/test-local-llms-as-apis?utm_source=dev.to&utm_medium=wanda&utm_content=n8n-post-automation)と[GLM 5.1 APIガイド](http://apidog.com/blog/how-to-use-glm-5-1-api?utm_source=dev.to&utm_medium=wanda&utm_content=n8n-post-automation)も参考にしてください。
## 料金、レート制限、クォータ
ERNIE 5.1のQianfan公開料金は、リリース投稿には記載されていません。社内資料や見積もりで数値を使う前に、必ずライブコンソールの料金表を確認してください。
実装時は、少なくとも次の3点を考慮します。
- **デフォルトのレート制限はワークスペース単位です。** 新規アカウントは低いQPS制限から始まります。テスト完了後、本番投入前にコンソールから引き上げを申請してください。
- **トークン使用量はレスポンスに含まれます。** `usage`フィールドに`prompt_tokens`、`completion_tokens`、`total_tokens`が入ります。コスト把握のため、リクエストごとにログへ記録してください。
- **キャッシュは自動ではありません。** Anthropicとは異なり、Qianfanは現時点でERNIE 5.1向けのプロンプトキャッシュプリミティブを公開していません。2,000トークンのシステムプロンプトを毎回送る場合、その分のコストが毎回発生します。
## エラー処理を実装する
実際に遭遇しやすいエラーは次のとおりです。
<table>
<thead>
<tr>
<th>ステータス</th>
<th>意味</th>
<th>解決策</th>
</tr>
</thead>
<tbody>
<tr>
<td>401</td>
<td>Bearerトークンが不正または期限切れ</td>
<td>コンソールから再生成</td>
</tr>
<tr>
<td>403</td>
<td>このワークスペースでモデルが有効になっていない</td>
<td>コンソールでERNIE 5.1を追加</td>
</tr>
<tr>
<td>429</td>
<td>レート制限に達した</td>
<td>バックオフ + ジッター付きリトライ</td>
</tr>
<tr>
<td>400 (<code>invalid messages</code>)</td>
<td>メッセージロールの順序が不正</td>
<td>ユーザー/アシスタントの交互表示を確認</td>
</tr>
<tr>
<td>500/502</td>
<td>Qianfan側の一時的な問題</td>
<td>一度リトライ。継続する場合はステータスページを確認</td>
</tr>
</tbody>
</table>
すべてのAPI呼び出しは、指数バックオフ付きのリトライでラップしてください。上限は3回程度が実用的です。本番環境では、レスポンスヘッダーの`request_id`もログに残してください。Baiduサポートに問い合わせる際、調査に必要になります。
## 最小限の本番向けラッパー
今日ERNIE 5.1をアプリケーションに組み込むなら、まずは次のような薄いラッパーを用意します。
python
import os, time, random, json
from openai import OpenAI, RateLimitError, APIError
client = OpenAI(
api_key=os.environ["QIANFAN_API_KEY"],
base_url="https://qianfan.baidubce.com/v2",
)
def chat(messages, , model="ernie-5.1", temperature=0.3, max_retries=3):
for attempt in range(max_retries):
try:
return client.chat.completions.create(
model=model,
messages=messages,
temperature=temperature,
)
except RateLimitError:
time.sleep((2 * attempt) + random.random())
except APIError as e:
if e.status_code and e.status_code >= 500 and attempt < max_retries - 1:
time.sleep(1 + attempt)
continue
raise
raise RuntimeError("ERNIE 5.1 retries exhausted")
このラッパーで、同期的なチャット補完の多くはカバーできます。ツールループやストリーミングは、この上に追加してください。
## よくある質問
**ERNIE 5.1 APIは無料ですか?**
いいえ。Qianfanは従量課金制です。永続的な無料枠はありません。新規アカウントには試用クレジットが付与される場合があります。無料で試したい場合は、[ernie.baidu.com](https://ernie.baidu.com)のチャットUI、または[無料LLMの選択肢](http://apidog.com/blog/free-llm-openclaw-web-search?utm_source=dev.to&utm_medium=wanda&utm_content=n8n-post-automation)を検討してください。
**ERNIE 5.1をローカルで実行できますか?**
いいえ。公開されている重みはありません。オンプレミス実行が必須の場合は、代わりに[DeepSeek V4をローカルで実行する方法](http://apidog.com/blog/how-to-run-deepseek-v4-locally?utm_source=dev.to&utm_medium=wanda&utm_content=n8n-post-automation)または[2026年の最高のローカルLLM](http://apidog.com/blog/best-local-llms-2026?utm_source=dev.to&utm_medium=wanda&utm_content=n8n-post-automation)を参照してください。
**OpenAI SDKは変更なしで動作しますか?**
はい。`base_url`を`https://qianfan.baidubce.com/v2`に、`api_key`をQianfanキーに設定すれば動作します。ただし、`model`フィールドにはOpenAIのモデルIDではなく、QianfanのモデルIDを指定します。関数呼び出し、ストリーミング、`response_format: json_object`は利用できます。厳密な`json_schema`検証はまだ展開中です。
**ERNIE 5.1は中国語と英語のプロンプトをどのように扱いますか?**
どちらも第一級の扱いです。Arena Searchスコア1,223は、混合言語の投票者プールから得られました。技術的な英語タスク、たとえばコードやAPI設計ではクローズドな最先端モデルと競合し、中国語のクリエイティブライティングでは中国モデルの中でも最高クラスです。
**最大出力長はどのくらいですか?**
公式には公開されていません。実運用では、シングルターン応答はモデルが完了するまでに約8Kトークンで上限に達します。長文生成では、タスクを分割して続行する設計にしてください。
ERNIE 5.1でエージェントを構築する場合は、[Apidogをダウンロード](https://apidog.com/download?utm_source=dev.to&utm_medium=wanda&utm_content=n8n-post-automation)し、OpenAI互換のリクエストコレクションを使って、Qianfanエンドポイントを他のサービスと一緒にモック、テスト、ドキュメント化してください。
<div style="position: relative; width: 100%; padding-top: 56.25%;">
<iframe src="https://www.youtube.com/embed/UMl4Vo_RwkU?si=NcqL2Sz2ckCxX4iX" title="Apidogで公開APIドキュメントを生成する方法" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen="" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%;">
</iframe>
</div>

Top comments (0)