add-opencode
OpenCodeをエージェントプロバイダーとして使用できます(AGENT_PROVIDER=opencode)。OpenCodeの設定を通じて、OpenRouter、OpenAI、Google、DeepSeekなど複数のプロバイダーに対応します。Anthropic Agent SDKではなく、OpenCodeを経由してアクセスします。agent_providerパラメータでセッション単位またはグループ単位での設定が可能です。ホストはコンテナ起動時にOPENCODE_*とXDGマウントを渡します。
description の原文を見る
Use OpenCode as an agent provider (AGENT_PROVIDER=opencode). OpenRouter, OpenAI, Google, DeepSeek, etc. via OpenCode config — not the Anthropic Agent SDK. Per-session and per-group via agent_provider; host passes OPENCODE_* and XDG mount when spawning containers.
SKILL.md 本文
OpenCode エージェントプロバイダー
NanoClaw はコンテナ内の長時間実行されるポーリングループでエージェントを実行します。バックエンドは AGENT_PROVIDER (claude | opencode | mock) で選択されます。
Trunk には claude プロバイダーのみが組み込まれています。このスキルは providers ブランチから OpenCode プロバイダーファイルをコピーし、ホストとコンテナのバレルに配線して、依存関係をインストールし、イメージをリビルドします。
インストール
事前確認
以下のすべてが既に存在する場合は、設定にスキップしてください:
src/providers/opencode.tscontainer/agent-runner/src/providers/opencode.tssrc/providers/index.ts内のimport './opencode.js';行container/agent-runner/src/providers/index.ts内のimport './opencode.js';行container/agent-runner/package.json内の@opencode-ai/sdkcontainer/Dockerfileの pnpm グローバルインストールブロック内のopencode-ai@${OPENCODE_VERSION}
不足している部分がある場合は、以下を続行してください。すべてのステップは冪等です。再実行しても安全です。
1. providers ブランチをフェッチ
git fetch origin providers
2. OpenCode ソースファイルをコピー
完全コピー(このスキルが全体を管理 — ユーザーの編集は再実行時に保持されません。意図的な設計です):
git show origin/providers:src/providers/opencode.ts > src/providers/opencode.ts
git show origin/providers:container/agent-runner/src/providers/opencode.ts > container/agent-runner/src/providers/opencode.ts
git show origin/providers:container/agent-runner/src/providers/mcp-to-opencode.ts > container/agent-runner/src/providers/mcp-to-opencode.ts
git show origin/providers:container/agent-runner/src/providers/mcp-to-opencode.test.ts > container/agent-runner/src/providers/mcp-to-opencode.test.ts
git show origin/providers:container/agent-runner/src/providers/opencode.factory.test.ts > container/agent-runner/src/providers/opencode.factory.test.ts
3. 自己登録インポートを追加
各バレルの末尾に 1 行追加します — 既に存在する場合はスキップしてください。
src/providers/index.ts:
import './opencode.js';
container/agent-runner/src/providers/index.ts:
import './opencode.js';
4. agent-runner 依存関係を追加
固定バージョンです。意図的にバンプしてください。bun update は使用しないでください。1.4.17 を使用してください — ステップ 5 で固定された opencode-ai CLI バージョンと一致する必要があります。1.14.x SDK は完全に異なる API を持ち、現在のプロバイダーコードと互換性がありません。
cd container/agent-runner && bun add @opencode-ai/sdk@1.4.17 && cd -
5. コンテナ Dockerfile に opencode-ai を追加
container/Dockerfile への 2 つの編集。両方とも冪等です(既に存在する場合はスキップしてください):
(a) 「CLI バージョンを固定」ARG ブロック(18 行目付近)内の ARG VERCEL_VERSION=latest の後に追加:
ARG OPENCODE_VERSION=1.4.17
latestは使用しないでください — CLI と SDK は同じバージョンである必要があります。latestは CLI を 1.14.x にサイレントにアップグレードします。これは SDK 1.4.x と互換性がないセッション API の破壊的変更(UUID セッション ID →ses_プレフィックス)を含みます。
(b) pnpm install -g ブロック(80 行目付近)内のリストに "opencode-ai@${OPENCODE_VERSION}" を追加:
pnpm install -g \
"@anthropic-ai/claude-code@${CLAUDE_CODE_VERSION}" \
"agent-browser@${AGENT_BROWSER_VERSION}" \
"vercel@${VERCEL_VERSION}" \
"opencode-ai@${OPENCODE_VERSION}"
6. ビルド
pnpm run build # host
pnpm exec tsc -p container/agent-runner/tsconfig.json --noEmit # container typecheck
./container/build.sh # agent image
ビルドキャッシュの落とし穴: コンテナ buildkit は COPY ステップを積極的にキャッシュします。プロバイダーファイルがビルドコンテキスト内に既に存在していた場合、新しいファイルがピックアップされないかもしれません。ビルド後に「Unknown provider: opencode」が表示される場合は、ビルダーをプルーンしてリビルドしてください:
docker builder prune -f && ./container/build.sh
7. 既存のグループごとのオーバーレイに伝播
各エージェントグループは data/v2-sessions/<group-id>/agent-runner-src/providers/ にライブソースオーバーレイを持ち、これは実行時にイメージをオーバーライドします。このオーバーレイはグループが最初に配線されるときに作成され、イメージのリビルドによって自動更新されません。このスキルが実行される前に既に存在していたグループは、新しいファイルを手動でコピーする必要があります。
for overlay in data/v2-sessions/*/agent-runner-src/providers/; do
[ -d "$overlay" ] || continue
cp container/agent-runner/src/providers/opencode.ts "$overlay"
cp container/agent-runner/src/providers/mcp-to-opencode.ts "$overlay"
cp container/agent-runner/src/providers/index.ts "$overlay"
echo "Updated: $overlay"
done
設定
ホスト .env (典型的)
OpenCode が期待する形式でモデル/プロバイダー文字列を設定します(多くの場合 provider/model-id)。コメントは独立した行に置いてください — 値内の # はそのまま保持され、モデル ID を破壊します。
これらの変数はホスト上で読み込まれ、有効なプロバイダーが opencode の場合にのみコンテナに渡されます。プロバイダーを単体で切り替えません。DB は引き続き agent_provider を設定する必要があります(以下を参照)。
OPENCODE_PROVIDER— OpenCode プロバイダー ID。例:openrouter、anthropic、deepseek。OPENCODE_MODEL—provider/model形式の完全なモデル ID。例:deepseek/deepseek-chat。OPENCODE_SMALL_MODEL— オプション。軽いタスク用の 2 番目のモデル。未設定の場合はOPENCODE_MODELがデフォルトです。ANTHROPIC_BASE_URL— 非anthropicプロバイダーで必須。 opencode コンテナプロバイダーはこれを上流プロバイダー設定のbaseURLとして渡すため、リクエストは OneCLI の認証情報プロキシまたはプロバイダーの API に直接ルーティングされます。プロバイダーの API ベース URL に設定します(例:https://api.deepseek.com/v1、https://openrouter.ai/api/v1)。
認証情報: OneCLI でマッチングする --host-pattern のプロバイダー API キーを登録します(例: api.deepseek.com、openrouter.ai)。OneCLI はコンテナ内で HTTPS_PROXY 経由でそれらを挿入します — キーは .env またはコンテナ環境内に存在しません。
シークレットを追加した後、エージェントにアクセスを付与します — selective モードのエージェントは明示的に割り当てられたシークレットのみを受け取ります:
# エージェント ID とシークレット ID を見つけてから:
onecli agents set-secrets --id <agent-id> --secret-ids <existing-ids>,<new-secret-id>
リストに既存のシークレット ID を常に含めてください — set-secrets は追加ではなく置き換えます。
例: DeepSeek
OPENCODE_PROVIDER=deepseek
OPENCODE_MODEL=deepseek/deepseek-chat
OPENCODE_SMALL_MODEL=deepseek/deepseek-chat
ANTHROPIC_BASE_URL=https://api.deepseek.com/v1
キーを登録:
onecli secrets create --name "DeepSeek" --type generic \
--value YOUR_KEY --host-pattern "api.deepseek.com" \
--header-name "Authorization" --value-format "Bearer {value}"
例: OpenRouter
OPENCODE_PROVIDER=openrouter
OPENCODE_MODEL=openrouter/anthropic/claude-sonnet-4
OPENCODE_SMALL_MODEL=openrouter/anthropic/claude-haiku-4.5
ANTHROPIC_BASE_URL=https://openrouter.ai/api/v1
キーを登録:
onecli secrets create --name "OpenRouter" --type generic \
--value YOUR_KEY --host-pattern "openrouter.ai" \
--header-name "Authorization" --value-format "Bearer {value}"
例: Anthropic (ANTHROPIC_BASE_URL 不要)
OPENCODE_PROVIDER が anthropic の場合、OpenCode はコンテナ内で通常の Anthropic env を使用します — プロキシ + プレースホルダーキーパターンは変わらず、ANTHROPIC_BASE_URL は必須ではありません。
OPENCODE_PROVIDER=anthropic
OPENCODE_MODEL=anthropic/claude-sonnet-4-20250514
OPENCODE_SMALL_MODEL=anthropic/claude-haiku-4-5-20251001
OpenCode Zen (x-api-key, Bearer ではなく)
Zen の HTTP API(例: POST …/zen/v1/messages)は**x-api-key** ヘッダーのキーを期待します。OneCLI が**Authorization: Bearer …** のみを挿入する場合、ゲートウェイが機能していても Zen はしばしば 401 / "Missing API key" を返します。
命名: NanoClaw の AGENT_PROVIDER=opencode(DB agent_provider)は「OpenCode エージェントプロバイダーを実行」を意味します。一方、.env の OPENCODE_PROVIDER=opencode は OpenCode 設定内の OpenCode の Zen プロバイダー ID です(Zen ドキュメントを参照)。
ホスト .env (典型的な Zen 形式):
OPENCODE_PROVIDER=opencode
OPENCODE_MODEL=opencode/big-pickle
OPENCODE_SMALL_MODEL=opencode/big-pickle
ANTHROPIC_BASE_URL=https://opencode.ai/zen/v1
ドキュメントから実際の Zen モデル ID を使用してください。big-pickle は一例です。
OneCLI: Zen キーを**x-api-key**(Bearer ではなく)で登録:
onecli secrets create --name "OpenCode Zen" --type generic \
--value YOUR_ZEN_KEY --host-pattern opencode.ai \
--header-name "x-api-key" --value-format "{value}"
グループごと / セッションごと
スキーマ: agent_groups.agent_provider と sessions.agent_provider。OpenCode を使用するグループまたはセッションに opencode を設定します。コンテナは解決された値から AGENT_PROVIDER を受け取ります(セッションがグループをオーバーライド)。
追加の MCP サーバーは引き続き NANOCLAW_MCP_SERVERS / ホストの container_config.mcpServers から来ます。ランナーはそれらを Claude と OpenCode プロバイダーの両方に渡される同じ mcpServers オブジェクトにマージします。
運用上の注意事項
- OpenCode はローカルな
opencode serveプロセスと SSE サブスクリプションを保持します。プロバイダーはstream.returnとabort()/ 共有ランタイムリセット時のサーバープロセスへの SIGKILL で破棄され、MCP/ゾンビハングを避けます。 - セッション継続は UUID 形式を使用します(SDK 1.4.x / CLI 1.4.x)。古いセッションは OpenCode 固有のエラーパターンで
isSessionInvalidによってクリアされます。CLI の意図しないアップグレード後に UUID 関連のエラーが表示される場合は、outbound.dbのsession_stateをクリアし、セッションフォルダ内のopencode-xdgディレクトリをワイプしてください。 NO_PROXY(localhost 用)は、OpenCode クライアントが HTTP(S)_PROXY が設定されている(例: OneCLI)状況でコンテナ内から127.0.0.1と通信するときに重要です。
検証
grep -q "./opencode.js" container/agent-runner/src/providers/index.ts && echo "container barrel: OK"
grep -q "./opencode.js" src/providers/index.ts && echo "host barrel: OK"
grep -q "@opencode-ai/sdk" container/agent-runner/package.json && echo "agent-runner dep: OK"
grep -q "opencode-ai@" container/Dockerfile && echo "Dockerfile install: OK"
cd container/agent-runner && bun test src/providers/ && cd -
ライセンス: MIT(寛容ライセンスのため全文を引用しています) · 原本リポジトリ
詳細情報
- 作者
- thmtz
- リポジトリ
- thmtz/nanoclaw-fleet
- ライセンス
- MIT
- 最終更新
- 2026/5/9
Source: https://github.com/thmtz/nanoclaw-fleet / ライセンス: MIT