OpenCodeにプライベートAIをつなぐ設定ガイド
OpenCodeからTEE付きAPI・無検閲モデル・ローカルLLMを呼ぶための設定手順。opencode.jsonの書き方、鍵の扱い、モデルごとにツールを切る方法まで実例で示します。
- 公開:
- 著者:
- Private AI Navi 編集部
- 読了目安:
- 約17分
広告について: 本ページには広告・アフィリエイトリンクが含まれます。掲載順位や評価は報酬額だけで決定せず、編集方針に基づいて作成しています。 広告掲載ポリシー
目次
OpenCodeを選ぶ理由
コーディングエージェントから外部のAPIを使うとき、いちばん効いてくるのは乗り換えられる状態を保てるかです。特定のベンダーに紐づいたクライアントだと、規約変更や価格改定が起きたときに身動きが取れません。
OpenCode(外部サイト・新しいタブで開きます) は、OpenAI互換のエンドポイントであれば設定ファイルにプロバイダを足すだけで使えます。TEE付きのAPIも、無検閲モデルも、手元のローカルLLMも、同じ書き方で並べられます。
もうひとつの利点が、エージェント単位でモデルを切り替えられることです。「普段の作業はこれ、調べ物はこれ」といった使い分けを、設定ファイルだけで用意できます。
設定ファイルの基本形
設定は ~/.config/opencode/opencode.json に置きます。カスタムプロバイダに必要なのは4つだけです。
| フィールド | 意味 |
|---|---|
npm | 使うSDK。OpenAI互換なら @ai-sdk/openai-compatible |
name | 画面に出る表示名 |
options.baseURL | APIのエンドポイント |
models | 使うモデルIDの一覧 |
APIキーは options.apiKey に {env:変数名} と書くと環境変数から読まれます。設定ファイルに平文で書かないでください。 設定ファイルはバックアップや共有の対象になりやすく、そこに鍵が入っていると気づかないまま流出します。
TEE付きのAPIをつなぐ
保護された実行環境(TEE)で動くモデルを使う場合の例です。ここでは Phala の推論APIを指しています。
{
"provider": {
"phala": {
"npm": "@ai-sdk/openai-compatible",
"name": "Phala (TEE)",
"options": {
"baseURL": "https://inference.phala.com/v1",
"apiKey": "{env:PHALA_API_KEY}"
},
"models": {
"deepseek/deepseek-v4-flash-0731": { "name": "DeepSeek V4 Flash (TEE)" },
"phala/qwen3.6-35b-a3b-uncensored": { "name": "Qwen3.6 35B-A3B Uncensored" }
}
}
}
}
モデルIDは /v1/models から取れます。このエンドポイントは認証なしで読める(2026-08-14 確認)ので、契約前に中身を確かめられます。
curl -s https://inference.phala.com/v1/models | jq -r '.data[] | "\(.id)\t\(.is_tee)\t\(.providers|join(","))"'
なお、アテステーション(実行環境の証明)が取得できても、それはリクエストを受け取ったゲートウェイに対する証明であって、指定したモデルがTEEで動いた証明ではありません。詳しくはPhalaとは?TEE対応AI APIの仕組みを解説を参照してください。
エージェントごとにモデルを分ける
agent を定義すると、用途別にモデルと挙動を切り替えられます。
{
"agent": {
"tee": {
"description": "TEE内で動くモデルで作業する",
"mode": "primary",
"model": "phala/deepseek/deepseek-v4-flash-0731",
"steps": 25,
"temperature": 0.3
}
}
}
model は プロバイダID/モデルID の形で書きます。上の例ではプロバイダIDが phala、モデルIDが deepseek/deepseek-v4-flash-0731 なので、つなげて phala/deepseek/deepseek-v4-flash-0731 になります。スラッシュが3つ並ぶのは間違いではありません。
steps は1回の指示で実行するステップ数の上限です。エージェントが同じ操作を繰り返す状態に陥ったとき、ここで止まります。上限を設けずに走らせると、気づかないうちにトークンを消費し続けます。
無検閲モデルはツール呼び出しで詰まる
ここが実際にいちばん引っかかるところです。エージェント動作(ファイルを読む・コマンドを実行する)は、すべて tool calling に依存します。無検閲モデルには、これに対応していないものがあります。
編集部の環境では、あるゲートウェイ経由の無検閲モデルを指定したところ、起動した瞬間にこう返ってきました。
No endpoints found that support tool use. Try disabling "bash".
このタイプのモデルを使うには、そのエージェントのツールを全部切ります。
{
"agent": {
"writing": {
"description": "ツール非対応のモデルで文章を書く",
"mode": "primary",
"model": "openrouter/<provider>/<model>",
"tools": {
"bash": false, "edit": false, "write": false, "read": false,
"grep": false, "glob": false, "list": false, "patch": false,
"webfetch": false, "websearch": false, "todowrite": false,
"todoread": false, "task": false, "skill": false
}
}
}
}
こうすると、ファイル操作はできませんが、文章生成の相手としては使えます。
確認は curl 1回で済みます。finish_reason が tool_calls になれば対応しています。
curl -s "$BASE_URL/chat/completions" \
-H "Authorization: Bearer $API_KEY" -H "Content-Type: application/json" \
-d '{"model":"<MODEL_ID>","max_tokens":300,
"messages":[{"role":"user","content":"What is the weather in Tokyo? Use the tool."}],
"tools":[{"type":"function","function":{"name":"get_weather",
"parameters":{"type":"object","properties":{"city":{"type":"string"}},
"required":["city"]}}}]}' | jq '.choices[0].finish_reason'
ゲートウェイ経由でつなぐ
OpenRouter のようなゲートウェイを使う場合も同じ書き方です。OpenRouter は組み込みで対応しているので、options.apiKey だけで足ります。
{
"provider": {
"openrouter": {
"options": { "apiKey": "{env:OPENROUTER_API_KEY}" }
}
}
}
ゲートウェイを使うときは、実行先プロバイダによってデータの扱いが変わる点に注意してください。OpenRouter の場合、データを保存しないエンドポイントのみへ実行先を限定する設定があり、フォールバックなしで動きます。機密性を要件にするなら、この種の設定を有効にしたうえで使ってください。
ローカルLLMをつなぐ
手元で動かすなら、そもそも外部に送りません。ローカルの推論サーバーもOpenAI互換なので、同じ形で書けます。公式ドキュメントに記載されている既定のエンドポイントは次のとおりです。
| ランタイム | ベースURL |
|---|---|
| Ollama | http://localhost:11434/v1 |
| LM Studio | http://127.0.0.1:1234/v1 |
| llama.cpp | http://127.0.0.1:8080/v1 |
{
"provider": {
"ollama": {
"npm": "@ai-sdk/openai-compatible",
"name": "Ollama (local)",
"options": { "baseURL": "http://localhost:11434/v1", "apiKey": "ollama" },
"models": { "<モデル名>": { "name": "Local model" } }
}
}
}
Ollama の公式ドキュメントは、APIキーについて「必須だが無視される」と明記しています。値は何でも構いません。モデル名は、そのローカルサーバーの /v1/models が返すものと一致させます。
| サービス | プライバシー方式 | 提供形態 | 総合スコア | 情報の状態 |
|---|---|---|---|---|
| Ollama | ローカル処理 | local / api | 74/100 | 一部検証・26日前 |
| LM Studio | ローカル処理 | local / chat / api | 73/100 | 一部検証・26日前 |
| Jan | ローカル処理 | local / chat / api | 70/100 | 一部検証・26日前 |
スコアの算出方法は編集方針に記載しています。料金・機能は変更される場合があります。
組まずに買う選択肢
ここまでは「自分で組む」話でしたが、TEE内で動くエージェントを製品として買う道もあります。
NEAR AI の IronClaw(外部サイト・新しいタブで開きます) は、その代表例です。NEAR Foundation が開発するOSSのエージェントで、NEAR AI Cloud 上にデプロイすると Trusted Execution Environment の中で起動します。公式サイトは「暗号化されたenclave内で動き、あなたの秘密がモデルに触れることはない」「クラウド事業者ですら中身を見られない」と説明しています。セルフホストも可能です。
料金は2026-08-15時点でエージェント数による3段階です。
| プラン | 月額 | エージェント数 |
|---|---|---|
| Starter | $5 | 1 |
| Basic | $20 | 2 |
| Pro+ | $200 | 5(優先サポート付き) |
いずれも推論用のクレジットが毎月付きます。
なお NEAR AI 自身も OpenAI 互換のAPIを提供していて、OpenCode から使う手順を公式ドキュメントが用意しています。ゲートウェイ経由(https://cloud-api.near.ai/v1)と、モデルのTEEへ直接つなぐ経路(https://<model>.completions.near.ai/v1)のどちらでも同じAPIキーで動きます。後者は検証対象がゲートウェイ抜きの1つに絞れるのが利点です。
| サービス | プライバシー方式 | 提供形態 | 総合スコア | 情報の状態 |
|---|---|---|---|---|
| NEAR AI | E2EE + TEE | api / confidential-ai | 51.5/100 | 一部検証・14日前 |
| Phala | TEE | api / confidential-ai / gpu-cloud | 64/100 | 一部検証・15日前 |
スコアの算出方法は編集方針に記載しています。料金・機能は変更される場合があります。
動かす前に知っておきたいこと
コスト表示が$0のままになる
カスタムプロバイダとして登録した場合、OpenCode 側がそのサービスの単価表を持っていないため、セッションのコスト表示は$0のままです。請求が発生していないという意味ではありません。実額を知るには、消費トークンを自分で単価に掛ける必要があります。
コンテキスト上限は出力枠に圧迫される
上限の小さいモデルでは、確保した出力枠がそのまま入力を圧迫します。編集部の実測では、131,072トークンのモデルに対して出力32,000トークンを要求した結果、入力が99,073トークンの時点で上限超過になりました。無検閲モデルは上限が小さいものが多いので、max_tokens は調整する前提で考えてください。
推論(reasoning)がトークン枠を食う
推論を出すモデルでは、短い応答でも内部の思考にトークンが使われます。枠が足りないと、本文が空のまま返ってくることがあります。エラーメッセージがモデルIDの誤りを示唆する場合もありますが、原因は枠不足のほうです。
実際の運用でどれくらいのコストと速度になるかは、OpenCode × Phala の実測記録にまとめています。
対応サービス
| サービス | プライバシー方式 | 提供形態 | 総合スコア | 情報の状態 |
|---|---|---|---|---|
| Phala | TEE | api / confidential-ai / gpu-cloud | 64/100 | 一部検証・15日前 |
| RedPill | TEE | api / marketplace / chat / confidential-ai | 57.5/100 | 一部検証・15日前 |
| NEAR AI | E2EE + TEE | api / confidential-ai | 51.5/100 | 一部検証・14日前 |
| OpenRouter | ZDR | api / marketplace / chat | 36.3/100 | 一部検証・25日前 |
| Venice AI | E2EE + TEE | chat / api | 61.5/100 | 一部検証・25日前 |
| Ollama | ローカル処理 | local / api | 74/100 | 一部検証・26日前 |
スコアの算出方法は編集方針に記載しています。料金・機能は変更される場合があります。
よくある質問
設定ファイルはどこに置きますか?
~/.config/opencode/opencode.json です。プロジェクトごとに設定を分けることもできます。
APIキーを設定ファイルに書いてもよいですか?
避けてください。{env:変数名} の形で環境変数から読ませられます。設定ファイルはバックアップや共有の対象になりやすく、平文の鍵が入っていると気づかないまま流出します。
無検閲モデルをエージェントとして使えますか?
モデルによります。ツール呼び出しに対応していないものは、起動時に「tool use に対応したエンドポイントが無い」というエラーで落ちます。その場合はそのエージェントのツールを全部無効にすれば、文章生成の相手としては使えます。
TEE対応と書いてあれば、そのモデルは保護されますか?
窓口によってカタログの中身が違うため、モデルごとの is_tee を確認してください。編集部が2026-08-14に確認した時点では、ある窓口は25モデル全てがTEE対応、別の窓口は66モデル中25モデルだけがTEE対応でした。
本記事の掲載内容の最終確認日: 2026-08-14(15日前)
出典
- #OpenCode
- #コーディングエージェント
- #OpenAI互換
- #設定
- #ローカルLLM
本記事の内容は執筆時点の公開情報にもとづきます。料金・機能・ポリシーは変更される場合があります。 誤りを見つけた場合はお問い合わせからご連絡ください。確認のうえ修正し、更新日を明記します。