Models
連携
言語モデルと通信するツールのほとんどは、すでに 2 つのワイヤフォーマットのどちらかに対応しています。Grafilab は 1 つのホストから両方を提供するので、エディタやチャット UI、SDK を Grafilab に向ける作業はたいてい 2 つの設定だけで済みます。ベース URL と API キーです。
https://llm.grafilab.ai は、同じカタログ、同じキー、同じウォレットに対して 2 つのリクエスト形式を公開しています。
- OpenAI chat completions —
POST /v1/chat/completionsに加えて、埋め込み、画像、動画、モデル一覧。多くのツールが「OpenAI 互換」や「カスタム OpenAI エンドポイント」と呼ぶのはこれです。 - Anthropic messages —
POST /v1/messages。Claude Code と Anthropic SDK が使います。
どちらを使っても、呼び出すモデル ID は同じ、消費するクレジット残高も同じで、使用状況はリクエストを認証したキーに紐づいて記録されます。ツールがすでに対応している形式を選んでください。ツールが特定の形式を要求しない限り、一方をもう一方より優先する利点はありません。
ツールが求めるベース URL はどちらか
Section titled “ツールが求めるベース URL はどちらか”最もよくある間違いは /v1 を付けるか付けないかです。ルールは単純で、OpenAI 形式のクライアントはすでに /v1 で終わるベースにパスを追加し、Anthropic 形式のクライアントは自分で /v1/messages を追加します。
| Your tool speaks… | Base URL | Notes |
|---|---|---|
| OpenAI (chat completions, embeddings, images, videos, SDKs) | https://llm.grafilab.ai/v1 | Clients append /chat/completions, /models, and so on. |
| Anthropic (Messages API, Claude Code, Anthropic SDK) | https://llm.grafilab.ai | Clients append /v1/messages themselves — do not add /v1. |
このサイトで扱うツールの場合は次のとおりです。
| ツール | 形式 | 貼り付ける値 |
|---|---|---|
| Cursor | OpenAI | https://llm.grafilab.ai/v1 |
| Cline | OpenAI(Anthropic も利用可) | https://llm.grafilab.ai/v1 |
| Claude Code | Anthropic | https://llm.grafilab.ai |
| Open WebUI | OpenAI | https://llm.grafilab.ai/v1 |
| OpenAI SDK(Python、TypeScript) | OpenAI | https://llm.grafilab.ai/v1 |
| Anthropic SDK | Anthropic | https://llm.grafilab.ai |
| その他の OpenAI 互換ツール | OpenAI | https://llm.grafilab.ai/v1 |
キーを取得する
Section titled “キーを取得する”- A Grafilab API key. In the console open API (
https://app.grafilab.ai/api) and click Generate New Key — see API Keys.
ツールごとに別のキーを作り、そのツールの名前を付けてください。使用状況は各リクエストを認証したキーに対して記録されるので、ツールごとに 1 つのキーにしておけばキーごとの使用状況がそのままツールごとのコスト内訳になります。また、あるツールのアクセスを取り消しても他のツールには影響しません。
OpenAI 互換 API はキーを Authorization: Bearer から読み取ります。Anthropic 互換 API は x-api-key と Authorization: Bearer のどちらも受け付けるので、片方しか用意していないツールでも動作します。
モデル ID を選ぶ
Section titled “モデル ID を選ぶ”The model catalog is live, so list it rather than copying ids from a page. Every entry’s id is the exact string to use in any tool or SDK.
curl https://llm.grafilab.ai/v1/models \ -H "Authorization: Bearer $GRAFILAB_API_KEY" | jq -r '.data[].id'from openai import OpenAI
client = OpenAI(api_key="sk-grafilab-...", base_url="https://llm.grafilab.ai/v1")for model in client.models.list(): print(model.id)import OpenAI from "openai";
const client = new OpenAI({ apiKey: "sk-grafilab-...", baseURL: "https://llm.grafilab.ai/v1" });for await (const model of client.models.list()) { console.log(model.id);}The same ids appear as cards in the Playground, with context size and prices.
モデル一覧は OpenAI 互換 API にのみあります。ツールが Anthropic 形式で Grafilab と通信する場合でも、カタログの一覧は GET /v1/models と Bearer トークンで取得し、使いたい id をツールに貼り付けてください。
両方の API を試す
Section titled “両方の API を試す”ツールの設定に触れる前に、ターミナルからキーと URL を確認してください。curl が通るなら、その後の失敗はアカウントではなくツールの設定が原因だとわかります。
curl https://llm.grafilab.ai/v1/chat/completions \ -H "Authorization: Bearer $GRAFILAB_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "model": "grafilab/qwen3.6-flash", "messages": [{"role": "user", "content": "Say hi in five words."}] }'curl https://llm.grafilab.ai/v1/messages \ -H "x-api-key: $GRAFILAB_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "model": "grafilab/qwen3.6-flash", "max_tokens": 64, "messages": [{"role": "user", "content": "Say hi in five words."}] }'max_tokens は /v1/messages では必須、/v1/chat/completions では任意です。どちらの呼び出しも content または choices フィールドを持つ JSON ボディを返すはずです。401 はキーの文字列が誤っているか余分な空白が混じっていること、404 はモデル ID がカタログの id と一致していないこと、429 は送信が速すぎるのではなくクレジット残高が空であることを意味します。
Anthropic 互換 API が対応していないこと
Section titled “Anthropic 互換 API が対応していないこと”/v1/messages は Messages プロトコルのサブセットを実装しています。コーディングエージェントやチャットクライアントには十分ですが、いくつかの点で Anthropic 自身のエンドポイントとは挙動が異なります。
- サーバーサイドツールは拒否されます。
web_search_*、bash_*、およびtypeがcustom以外のツールは、黙って落とされるのではなく400が返ります。未知のコンテンツブロック型や未知のメッセージロールも同様です。 - 5 つのフィールドは受け付けられますが無視されます:
top_k、thinking、output_config、context_management、そして現れる場所を問わずcache_control。これらを含むリクエストは成功しますが、フィールドは何の効果も持ちません。 - キャッシュ書き込みは報告されません。 モデルが対応していればプロンプトキャッシュ自体は機能し、キャッシュされた入力は
usage.cache_read_input_tokensに現れますが、usage.cache_creation_input_tokensは常に0です。 usage.input_tokensはキャッシュされたトークンを含みません。Anthropic の慣例に従っています。- モデル一覧はありません。 OpenAI 互換 API の
GET /v1/modelsを使ってください。 anthropic-versionは読み取られません。 送っても害はなく、省略しても構いません。- ストリーミングに終端フレームはありません。 シーケンスは
message_stopで終わり、最初のフレームより後で失敗した場合は HTTP200のままevent: errorとしてインバンドで届きます。
対応するコンテンツブロックは、ユーザーのターンでは text、image、tool_result、アシスタントのターンでは text、tool_use、thinking、redacted_thinking です。それ以外は 400 を返します。Claude Code のページでは、これらのそれぞれが実際にどんな症状として現れるかを対応づけています。

