yoi/docs/ref/llm-provider-landscape.md
2026-06-01 18:49:23 +09:00

14 KiB
Raw Blame History

LLM プロバイダ統合の外部事例

調査日: 2026-04-19。プロバイダ認証経路・ollama launch 等の時事的項目は陳腐化が早い。数値・URLは一次ソースで再確認すること。

各ハーネスのプロバイダ対応方式

Zed

  • ネイティブ: Anthropic / OpenAI / Google / Ollama / DeepSeek / Mistral / OpenRouter / Vercel AI Gateway
  • openai_compatible スロットで任意プロバイダ追加
  • OpenRouter は宣言型: available_models[]max_tokens / supports_tools 等の capability を書く。自動 discovery ではない
  • Ollama は auto_discover: bool でローカル tag 自動列挙
  • https://zed.dev/docs/ai/llm-providers

OpenCode (sst/opencode)

  • Vercel AI SDK + Models.dev で 75+ プロバイダ
  • 認証は ~/.local/share/opencode/auth.json に統一保存OAuth / APIキー / その他の3種別
  • 2026-03-19 に Anthropic OAuth 対応を削除PR #18186。詳細は後述
  • ChatGPT ブラウザ認証 (/connect) は存続
  • https://opencode.ai/docs/providers/

OpenClaw

  • Peter Steinberger らの個人向け self-hosted AIOpenCode と別物)
  • 30+ プロバイダ対応
  • Anthropic 独自 OAuth 実装は縮小、現在は claude -p (Claude Code CLI) の subprocess 再利用を推奨
  • OpenRouter は「OpenAI 互換プロキシ」扱いで固有機能 (serviceTier, prompt-cache hints) は転送しない
  • https://docs.openclaw.ai/concepts/model-providers

Aider / Cline / Roo / Continue.dev

  • Aider は LiteLLM 経由、他は直叩き
  • BLACKBOX 等マイナー系は OpenAI 互換枠で収容するのが一般パターン

認証経路の現状

Anthropic (Claude Pro / Max) ── 封鎖済み

  • 2026-01-09: Anthropic がサーバ側で Pro/Max OAuth トークンに This credential is only authorized for use with Claude Code and cannot be used for other API requests の制限導入
  • 2026-02-19: Claude Code の Legal & Compliance ページに "Authentication and credential use" セクション追加。「OAuth 認証は Claude Code 等の通常利用のため専用」「Agent SDK を含む第三者製ツールで Free/Pro/Max 資格情報を経由するのは許可しない」と明記
  • 2026-03-19: OpenCode が PR #18186 で以下を削除
    • packages/opencode/src/session/prompt/anthropic-20250930.txtClaude Code 風システムプロンプト)
    • opencode-anthropic-auth@0.0.13 ビルトインプラグイン
    • claude-code-20250219 beta ヘッダ
  • 代替検討: claude -p (Claude Code の headless mode) を subprocess で呼ぶ方式。ACP ではなく素朴な CLI fork であり、yoi では採用しない
  • https://code.claude.com/docs/en/legal-and-compliance
  • https://github.com/sst/opencode/pull/18186

OpenAI (Codex CLI / Responses)

  • Codex CLI は Apache-2.0 で公開されている。yoi の Codex OAuth 経路は、Codex CLI と同じ Responses 系 wire behavior に寄せる
  • Codex CLI の認証ストアと conversation header / request compression / SSE behavior を参考にする
  • OpenCode の /connect で ChatGPT ブラウザ認証が通る
  • コミュニティ評価: 「Anthropic は walled garden、OpenAI はむしろ取り込みに来た」
  • https://github.com/openai/codex/discussions/8338
  • https://developers.openai.com/codex/auth

CLI fork 方式 (claude -p)

  • claude --print / claude -p は Claude Code の非対話headlessモード。プロンプトを stdin/引数で受け stdout に返す
  • ACP ではなく素朴な subprocess 呼び出し
  • OpenClaw と OpenCode コミュニティフォーク (griffinmartin/opencode-claude-auth) が採用
  • yoi では専用 API integration ではないため採用しない

Ollama の統合機構

ollama launch <tool>

  • v0.14.0 (2026-01) 以降、Ollama サーバ本体に Anthropic Messages API 互換レイヤーが組み込まれた
  • 別プロセスのプロキシは起動しない。Ollama コア (localhost:11434) が /v1/messages 相当を喋るstreaming / system prompt / tool calling / extended thinking / vision 対応)
  • ollama launch claude はサブコマンドバイナリを fork し、子プロセスに env を注入
    • ANTHROPIC_BASE_URL=http://localhost:11434
    • ANTHROPIC_AUTH_TOKEN=ollama
    • ANTHROPIC_API_KEY=(空)
  • 設定ファイル書き換えやシェル rc 操作はしない
  • ANTHROPIC_BASE_URL はハードコードで OLLAMA_HOST を見ないissue #13936
  • サブコマンド claude / codex / opencode / droid / clawdbot は「ツール毎の env 注入テンプレート」の集合体
    • 例: opencodeOPENCODE_CONFIG_CONTENT に JSON を流し込み OpenCode 側で deep-merge
    • codex は OpenAI 互換 (/v1/chat/completions) を向けるので Anthropic 系ではなく OpenAI 系 env を設定
  • https://ollama.com/blog/launch
  • https://ollama.com/blog/claude
  • https://github.com/ollama/ollama/issues/13936

Ollama クラウド

  • ollama signin は OAuth ではなく Ed25519 鍵ペア登録~/.ollama/id_ed25519(秘密鍵)と .pub(公開鍵)をローカル保存、ブラウザで ollama.com/connect から公開鍵をアカウントに紐付け
  • ルーティング: server/routes.goGenerateHandler / ChatHandler がモデル名をパースし、:cloud サフィックスなら server/cloud_proxy.go 経由で ollama.com:443 に中継
  • 署名: タイムスタンプ付きチャレンジを Ed25519 秘密鍵で署名し Authorization ヘッダに載せる
  • レスポンスは 32KB バッファで chunk 中継
  • クライアントは localhost:11434 のままでよい。ローカル Ollama デーモンが透過プロキシ役を果たす
  • ollama.com/api を直叩きしたいときのみ OLLAMA_API_KEY を別途発行
  • https://github.com/ollama/ollama/blob/main/server/cloud_proxy.go

OpenAI 互換プロバイダ事例

「共通 OpenAI 互換枠」で収容する代表的プロバイダ。base_url + API key 差し替えで動く。

xAI (Grok)

  • base_url: https://api.x.ai/v1OpenAI SDK 互換、Anthropic SDK 互換レイヤーも提供)
  • 主要モデル:
    • grok-code-fast-1 — 256K ctx、$0.20/$1.50 /1M tok、SWE-bench 70.8%、142 tok/sSonnet の 1/10 以下の単価)
    • grok-4-1-fast — 2M ctx、$0.20/$0.50 /1M tok長文向け差別化
    • grok-4 — 256K ctx、$3.00/$15.00 /1M tok
  • プロンプトキャッシュあり5075% 引、Batch API 50% 引
  • 認証は API key のみ、OAuth なし
  • サブスクX Premium+ / SuperGrok / SuperGrok Heavyは UI 専用で API 枠を含まない
  • Zed / OpenCode / Cline / Cursor に第一級サポートあり
  • https://docs.x.ai/developers/models

Groq

  • base_url: https://api.groq.com/openai/v1OpenAI SDK 互換)
  • 特徴: LPU で TTFT <100ms、モデル別 TPS 5001000gpt-oss:120b で 500 tok/s 等)
  • 主要モデル:
    • GPT-OSS 120B — $0.15/$0.60 /1M tok、128K ctx
    • Kimi K2-0905 — $1.00/$3.00、256K ctxopen モデル最強クラス)
    • Llama 3.3 70B Versatile — $0.59/$0.79、131K ctx
    • Qwen3 32B — $0.29/$0.59、131K ctx
  • tool_use / JSON mode / streaming すべて OpenAI 互換
  • プロンプトキャッシュ 50% 引、Batch API 50% 引
  • Qwen3-Coder-480B は未提供。Coder 用途は Together / Cerebras 等で補完する前提
  • Cerebras 比較: GPT-OSS 120B で Cerebras ~3000 tok/s vs Groq ~476 tok/s。throughput は Cerebras、TTFT は Groq
  • 月額サブスクは Enterprise のみ、通常は従量
  • https://groq.com/pricing
  • https://console.groq.com/docs/api-reference

BLACKBOX AI

  • base_url: https://cloud.blackbox.ai/api (OpenAI 互換 REST)、Bearer bb_* トークン
  • 主要ハーネスに専用サポートなし。共通枠で登録するのが実用
  • Unlimited プランは FUP 非公開で実態不明
  • https://docs.blackbox.ai/api-reference/authentication

OpenRouter

  • base_url: https://openrouter.ai/api/v1
  • 多数のプロバイダを単一 API で束ねる(料金は passthrough + プリペイド手数料 5.5%
  • BYOK: 月 100 万 req 無料、超過で元コストの 5%
  • :free モデル 50 req/日($10 入金で 1000 req/日)
  • https://openrouter.ai/docs

プロバイダ独自拡張

各プロバイダが OpenAI 互換エンドポイントに載せている独自機能。詳細は llm-pricing-2026-04.md と合わせて参照。

OpenAI 本家

  • /v1/responses stateful API、previous_response_idreasoning.effort (minimal/low/medium/high/xhigh)、reasoning.summary: "auto"store=false / ZDR 組織で強制
  • 高次ツール: web_search / code_interpreter / computer_use
  • max_tokensmax_completion_tokens (o系) → max_output_tokens (Responses) のリネーム

xAI (Grok)

  • OpenAI + Anthropic 両 SDK 互換(Anthropic 互換は deprecated、native 推奨)
  • reasoning_effort: low/high は Grok-3 mini 系のみ、Grok-4 系は常時 reasoning
  • Deferred Chat Completionsrequest_id による非同期取得
  • Live Search

Groq

  • service_tier: on_demand / flex / autoflex は 10x rate、失敗許容、paid 限定)
  • prompt caching は自動・追加料金なし・コード変更なし
  • reasoning_format で reasoning の提示方式制御JSON 出力との両立)

DeepSeek

  • deepseek-reasoner はレスポンスに reasoning_content 別フィールド
  • reasoner では function calling 非対応
  • 入力に reasoning_content を含めると 400
  • 自動 prefix cache (64 tok 単位、hit で 90% 割引)

Cerebras / Together AI

  • JSON schema / tool calling / multi-turn tool calling / streaming + structured を全モデル対応

Fireworks

  • Grammar mode (BNF) が独自、任意出力形式を制約可能

OpenRouter

  • provider でルーティング/フォールバック、transforms で自動中抜き
  • reasoning 統一インターフェースで各社差を吸収

Ollama

  • /v1/chat/completions"experimental" 明記
  • stream + tools で単一ブロック返却のバグ (#9092)
  • context size は Modelfile の num_ctx で固定API 側で設定不可)
  • native /api/chat の方が機能フル
  • v0.14+ で /v1/messages (Anthropic 互換) も追加

Azure OpenAI

  • URL が {resource}/openai/deployments/{name}/chat/completions?api-version=...model_id ではなく deployment 名
  • content filter が finish_reason: content_filter や 400 で観測

Capability 軸

モデル/プロバイダごとの機能差を表現する軸。プロバイダ側高次ツール (web_search / code_interpreter / computer_use / Live Search) は yoi では使用しない方針のため capability 軸から除外。

1. tool calling

parallel tool calls 可否、tool_choice 対応度。DeepSeek reasoner のような「reasoner + tool 非対応」ケースあり。

2. structured output

  • json_object のみ
  • json_schema 対応
  • Grammar (Fireworks 独自)

3. reasoning

  • reasoning.effort (OpenAI / xAI)
  • thinking.budget_tokens (Anthropic)
  • reasoning_content 別フィールド出力 (DeepSeek)
  • reasoning_format (Groq)
  • OpenRouter は reasoning に統一投影

4. vision

モデル依存度が大

5. prompt caching

呼び出し側ロジックから見て 2 値に集約:

  • Explicit: cache_control マーカー挿入Anthropic のみ)
  • Auto: scheme はマーカー挿入しないOpenAI / DeepSeek / Groq の自動 prefix も、サーバ側で何もしないケースも同じ扱い)

付随パラメータ

  • max_tokens 名の差(max_tokens / max_completion_tokens / max_output_tokens、Anthropic は必須
  • stateful (previous_response_id) は OpenAI Responses のみ
  • streaming SSE の delta 粒度・usage 到達タイミング差

ToolCall streaming の差異

プロバイダ ToolCall 引数の streaming
Anthropic input_json_delta partial streaming — 安定
OpenAI (chat) tool_calls[i].function.arguments partial — 安定、parallel 時は複数 index 並走
OpenAI Responses reasoning item が別構造(summary[] / encrypted_content
xAI / Groq / DeepSeek OpenAI 互換、chat と同じ
Gemini function_call は delta なし、一括で返る
Ollama /v1 stream + tools で delta が欠けるバグ (#9092)
Ollama /api/chat native API、安定

→ Gemini / Ollama /v1 は scheme アダプタで「BlockStart → InputJson(全体 1 回) → BlockStop」の擬似ストリーム化で共通化可能。

yoi での採用方針

第一級サポート(専用アダプタ)

  • Ollama API — ローカル + :cloud サフィックスで透過的にクラウド中継。エンドポイントは localhost:11434 で統一
  • Codex OAuth~/.codex/auth.json を読み、Codex CLI 互換の Responses 経路として扱う。conversation header / compression / SSE behavior は公開実装に合わせる
  • Anthropic API — 従量 API key 経路のみ

二次サポート(共通 OpenAI 互換枠)

  • provider_kind: openai_compatible + base_url + available_models[] の共通スロットで OpenRouter / xAI / Groq / Together / Fireworks / DeepInfra / BLACKBOX 等を一括収容
  • ルーター系は後追いで追加しやすい宣言型設計

非サポート

  • Claude Pro/Max OAuth 経路 — 2026-01-09 サーバ側ブロック、2026-02-19 に第三者ツール経由の利用制限を明文化。第一級機能としては採用しない
  • claude -p CLI fork も専用 API integration ではないため実装しない

実装原則

  • 認証アダプタ(外部 CLI の認証ストアを読む類)は llm-worker 直下ではなく上位アダプタ層に配置。llm-worker は低レベル基盤に留める原則project memoryと整合
  • モデル列挙は auto_discover と宣言型の両輪。Ollama は自動、ルーター系は宣言
  • ollama launch yoi 対応を視野に入れ、env 注入 (ANTHROPIC_BASE_URL / OPENAI_BASE_URL 等) で起動設定を受け入れる作り