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

243 lines
14 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 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.txt`Claude 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 注入テンプレート」の集合体
- 例: `opencode``OPENCODE_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.go``GenerateHandler` / `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/v1`OpenAI 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/v1`OpenAI SDK 互換)
- 特徴: LPU で TTFT <100msモデル別 TPS 5001000`gpt-oss:120b` 500 tok/s
- 主要モデル:
- GPT-OSS 120B $0.15/$0.60 /1M tok128K ctx
- Kimi K2-0905 $1.00/$3.00256K ctxopen モデル最強クラス
- Llama 3.3 70B Versatile $0.59/$0.79131K ctx
- Qwen3 32B $0.29/$0.59131K 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/sthroughput CerebrasTTFT 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_id`、`reasoning.effort` (minimal/low/medium/high/xhigh)、`reasoning.summary: "auto"`、`store=false` / ZDR 組織で強制
- 高次ツール: `web_search` / `code_interpreter` / `computer_use`
- `max_tokens` `max_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 Completions** `request_id` による非同期取得
- Live Search
### Groq
- `service_tier: on_demand / flex / auto`flex 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` ) で起動設定を受け入れる作り