nanobot は、2026年9月15日に公開された v0.3.5 から x-opencode-session ヘッダーの送信を開始しました。v0.3.0 までのリリースでは汎用の x-session-affinity ID のみを送信しており、このバージョン間の差が、OpenCode Go に対するリクエストでセッションヘッダーが欠落して失敗する原因です。 ほかの変更を加える前に nanobot --version を実行してください。表示されるバージョンが v0.3.0 以前であれば、このヘッダーの問題はアップグレードだけで完全に解決します。ただし、アップグレードでは OpenCode Go がクライアントに要求する残りの仕様への対応までは解決しません。そのため、このルートが正常に動作していると判断する前に、その部分を読んでおく価値があります。
まず、名前が似ているため、1点を区別しておきます。ここでいう OpenCode Go は、月額 $10 の現在提供中のモデルサブスクリプションであり、opencode.ai/docs/go に記載されています。これは、アーカイブ済みの Go 言語製 OpenCode ターミナルエージェントではありません。その README には、元の作者と Charm チームによってプロジェクトが Crush という名前で継続されたと記載されています。これは廃止製品からの移行に関する注記ではなく、クライアント要件が厳格化された、現在販売中のサービスに関するトラブルシューティングページです。また、ここでいう nanobot は HKUDS/nanobot、MIT ライセンスの Python 製パーソナルエージェントフレームワークです。2026年9月21日時点で 48,459 スターがあり、アーカイブされておらず、この確認日に最後の push が行われています(GitHub API)。同名の obot-platform の Go プロジェクトではありません。
エラーと、それを含む nanobot のバージョン
この件の発端となった通知は、ドキュメントではなくプロバイダーからの通知として購読者に届きました。ユーザーが anomalyco/opencode#47438 で逐語的に引用しています。この issue は OpenCode 自身のクライアントについて 2026年9月5日に開かれ、その通知はモデルプロバイダーからメールで届いたものとして説明されています:「OpenCode Go へのリクエストの一部に x-opencode-session ヘッダーがありません。これがない場合、サービスを適切に最適化できません。09/06 以降、このヘッダーがないリクエストはエラーになる可能性があります。」この文言は、私たちが確認できた OpenCode のドキュメントには掲載されていません。 OpenCode の変更履歴を 2026年9月21日に確認したところ、v1.18.31 における 2026年8月4日から9月14日までの変更が対象でしたが、x-opencode-session に言及する項目はまったくありませんでした。Go ドキュメントはこれを拒否ではなく要求として表現しています:「ルーティングとプロンプトキャッシュを最適化できるよう、会話ごとに x-opencode-session に安定したセッション ID を送信してください。」
09/06 という日付自体には、ドキュメントではないものの公式な公開ソースがあります。nanobot の issue #5661 と PR #5662 は、2026年9月3日付の X 上の @opencode 投稿を引用しています。その投稿は、ヘッダーがないツールではプロンプトキャッシュの最適化が失われ、「09/06 以降、このヘッダーがないリクエストはエラーになる可能性があります」と述べているとされています。この投稿を前提に nanobot の修正が作成されましたが、このページでは独自に取得していません。
完全な失敗が示されているのは第三者の資料だけです。2026年9月7日に開かれて同日にクローズされた vastsa/PI-Desktop#48 には、"type": "MissingSessionID" を伴う HTTP 400 と、リクエストに x-opencode-session がなく効率的にルーティングできないというメッセージが記録されており、Go ドキュメントの該当アンカーを指しています。OpenCode の Go ドキュメントには、そのステータスコードやタイプ文字列を掲載したエラーリファレンスがありません。そのため、文書化された義務と報告された拒否は、同じベンダーによる主張であっても強さが異なるものとして読んでください。
| nanobot のバージョン | x-opencode-sessionを送信しますか? | 根拠 |
|---|---|---|
| v0.3.0(2026年7月25日)以前 | いいえ。汎用的なプロセスごとの x-session-affinity ID のみ | 2026年9月4日に開かれ、9月9日にクローズされた Issue #5661 |
2026年9月9日より後の main | はい | 20f115bf コミット、PR #5662 からマージ |
| v0.3.5(2026年9月15日) | はい | v0.3.5 のリリースノートにその PR が記載されています |
タグ履歴には v0.3.1 から v0.3.4 が存在しないため、「v0.3.0 以前」が影響を受ける範囲のすべてです。2026年9月21日、推測ではなく2つの確認によってリリース対応関係を確認しました。リリース本文には PR #5662 が番号で記載され、GitHub の compare 呼び出しでは、v0.3.5 が 20f115bf より84コミット進んでおり、遅れているコミットは0と報告されています。これにより、このコミットがタグに含まれることが分かります。nanobot の v0.3.5 ドキュメントには、このヘッダーへの言及がない点に注意してください。変更の記録は、リリースノート、PR、issue だけです。
修正が実際に行うことと、それを発動する条件
nanobot/providers/openai_compat_provider.py のタグ v0.3.5 を読むと、ロジックは小さいものの、正確に把握する価値があります。プロバイダー仕様が opencode、opencode_zen、opencode_go のいずれかである場合、またはベース URL のホスト名が opencode.ai もしくはそのサブドメインである場合、nanobot は対象を OpenCode の対象として扱います。会話コンテキストがある場合、ヘッダー値はセッション ID の SHA-256 16進ダイジェストです。これにより、非 ASCII の ID に対しても不透明かつ ASCII セーフになります。会話コンテキストがない場合、プロバイダーインスタンスは、その存続期間中固定されるランダム UUID にフォールバックします。これはそのインスタンスでは安定しますが、会話ごとではありません。自分で設定したヘッダーは、名前を大文字と小文字を区別せずに照合され、どちらよりも優先されます。
覚えておくべき文はホスト名に関する部分です。ヘッダーが付加される理由は、どのプロバイダーブロックを記述したかではなく、リクエストの送信先です。 providers.custom ブロックを opencode.ai ベース URL に向けても、ヘッダーは付加されます。その他のホストへのリクエストには付加されません。そのホストが代わりに要求するものは、そのベンダー独自の問題であり、ここでは回答しません。
アップグレードは通常の手順です。PyPI パッケージは nanobot-ai で、そのタグの pyproject.toml では 0.3.5 です。v0.3.5 の README には uv tool install nanobot-ai と python -m pip install nanobot-ai が記載されています。nanobot --version で確認してください。エントリーポイントが PATH 上にない場合は python -m nanobot --version を使い、その後 nanobot status を実行します。CLI リファレンスでは、これはモデルを呼び出さずにプロバイダーとモデルの準備状態を確認するコマンドと説明されています。
OpenCode Go が単純な OpenAI 互換エンドポイントではない理由
ここが、ヘッダーの修正だけでは不十分に感じられる部分です。OpenCode Go は、通常の OpenAI 互換ベース URL にはない、クライアント側の複数の条件を定めています。セッションヘッダーはそのうちの1つにすぎません。以下のすべての行は、2026年9月21日に確認した同サービス自身のドキュメントに基づいています。
| 要件 | OpenCode Go が求めるもの | v0.3.5 へのアップグレードで解決しますか? |
|---|---|---|
| サブスクリプション | 「OpenCode Go は低コストの月額 $10 サブスクリプション」。キーは購読後に TUI で /connect を実行すると取得します | いいえ。別途購入が必要です |
| セッションヘッダー | 各会話の x-opencode-session に設定する安定したセッション ID | はい |
| ユーザーエージェント | 「汎用的な SDK 名や HTTP ライブラリ名ではなく、my-coding-agent/1.0 のような独自のユーザーエージェントで自分自身を識別する」 | 実証されていません。以下を参照してください |
| 利用ウィンドウ | モデルごとの月間ドル上限。5時間のサブ上限は20%、週次のサブ上限は50% | いいえ |
| モデルごとのエンドポイント | 3つのサーフェス — /zen/go/v1/responses、/chat/completions、/messages — があり、モデルが通信形式を決定します | いいえ。nanobot はさらに限定します |
| トラフィックの形態 | 「同様の種類のリクエストを生成する OpenCode やその他のコーディングエージェント向けに設計」されており、トラフィックは不正利用の監視対象です | いいえ |
ユーザーエージェントの行には注意が必要です。 PR #5662 が変更したのはセッションヘッダーだけです。nanobot v0.3.5 のソースを読むと、opencode、opencode_zen、opencode_go 仕様を提供する OpenAI 互換プロバイダーモジュールは、どこにも User-Agent を設定していません。一方、GitHub Copilot、xAI Grok、OpenAI Codex の各プロバイダーモジュールは、nanobot ブランドのものを設定しています。そのため、この経路では、基盤となる SDK がデフォルトで送信する値がリクエストに含まれます。値を観測するため、ここでは実際のリクエストを送信していません。また、OpenCode はこの項目について強制適用を公開していないため、これは再現された失敗ではなく、ソースを読んだ結果です。文書化された対処法は、自分で設定するヘッダーです。nanobot のリファレンスでは、providers.<name>.extraHeaders をプロバイダーのリクエストに統合されるヘッダーとして説明しています。
{
"providers": {
"opencodeGo": {
"apiKey": "${OPENCODE_API_KEY}",
"extraHeaders": { "User-Agent": "nanobot/0.3.5" }
}
},
"modelPresets": {
"primary": {
"provider": "opencode_go",
"model": "opencode-go/<a model OpenCode lists under chat/completions>",
"maxTokens": 8192,
"contextWindowTokens": 65536
}
}
}そこでは、自分のクライアントを正確に名乗ってください。そのフィールドに OpenCode の検証済みクライアント名を入れるのは、識別ではなくなりすましです。ドキュメントが求めているものでもありません。
エンドポイントの行には、ヘッダーでは解決できない nanobot 固有の結果があります。v0.3.5 のプロバイダーリファレンスでは、OpenCode が chat/completions エンドポイント配下に掲載しているモデル ID を使用するよう求めています。responses、messages、またはプロバイダー固有のエンドポイントにのみ掲載されているモデルは、この OpenAI 互換経路では処理されません。設定では、OpenCode Go は providers.opencodeGo であり、プリセットの provider は opencode_go です。モデル ID には opencode-go/ プレフィックスが付き、nanobot は送信前にそれを取り除きます。最後に、OpenCode の Go ページには、検証済みクライアントの一覧(Hermes、Claude Code、Codex、ZCode、Pi、jcode、Kilo Code CLI)と、セッションサポートが欠落または不完全な一覧(DeepSeek Harness、GitHub Copilot Chat、Kimi Code、MiMo Code)が掲載されています。2026年9月21日時点で nanobot はどちらの一覧にもありません。これは公開された判定がないということであり、推奨でもブロックでもありません。このページにはクライアントごとのバージョン要件も記載されていますが、ここでは取得していないため、これらのクライアントについて最低バージョンを読み取らないでください。
マスキングしたリクエストで確認する
nanobot の v0.3.5 ドキュメントには、送信するヘッダーを表示する方法が記載されていません。そのため、クライアントについて何かを結論づける前に、自分のサブスクリプションに対して契約を直接確認してください。ステータス行だけを読んでください。
# Read the status line only. Key redacted; session id is your own, stable per conversation.
curl -sS -o /dev/null -D - https://opencode.ai/zen/go/v1/chat/completions \
-H "authorization: Bearer $OPENCODE_API_KEY" \
-H "x-opencode-session: $(printf 'my-conversation-1' | shasum -a 256 | cut -d' ' -f1)" \
-H "user-agent: nanobot/0.3.5" \
-H "content-type: application/json" \
-d '{"model":"<model-id>","messages":[{"role":"user","content":"ping"}],"max_tokens":8}'これにより、2つの失敗を明確に分けられます。MissingSessionID を示す 400 はヘッダーの問題であり、それ以外はヘッダーの問題ではありません。エラーを消すためにリクエストごとに新しいランダム ID を生成したり、別のクライアント名を借用したりしないでください。 ドキュメントが会話ごとに安定した ID を求めているのは、ルーティングとプロンプトキャッシュがその ID をキーにするためです。したがって、リクエストごとの ID は料金を支払っているキャッシュを無効にし、修正のように見えるだけです。正当な答えは、アップグレードするか、その要件を持たないルートに処理を移すかの2つです。
費用と、どのルートが有利か
ソフトウェアとトークンを分けて考えてください。2026年9月21日に確認したリポジトリの記録によれば、nanobot 自体は $0 です。MIT ライセンスでセルフホストできます。したがって、以下はすべてモデル料金と、それを実行するマシンの費用です。
| ルート | 課金方法 | 失うもの |
|---|---|---|
| OpenCode Go サブスクリプション | 月額 $10。その後、モデルごとの月間ドル上限が設定され、5時間および週次のサブ上限はそれぞれ上限の20%と50% | 2つのクライアント義務、モデルごとの3つのエンドポイント、そして一般的なパーソナルエージェントフレームワークが対象外となる可能性のある、明示された想定トラフィックの境界 |
| OpenCode Zen | 100万トークン単位の従量課金。カード手数料は実費転嫁(1取引あたり 4.4% + $0.30)。残高が $5 未満になると $20 を自動チャージ | Go とは別製品で、独自の料金表があります。無料モデルには、データ利用に関する明示された注意事項があります |
| ベンダーの直接 API | ベンダー独自のトークン単価 | 別のベンダーを使う場合は、別のキーと別のプリセットが必要です |
| OpenAI 互換ゲートウェイ | 従量制トークン、キー1つ、残高1つ、サブスクリプションなし | Go のリストではなく、そのゲートウェイのカタログから選択します。OpenCode のセッションヘッダー要件は opencode.ai に限定され、nanobot はそれ以外の場所ではヘッダーを付加しません |
| ローカルモデル | リクエストごとの料金なし。Ollama、vLLM、LM Studio は nanobot に組み込まれたプロバイダーです | ハードウェアと、ホスト型フロンティアモデルに対する機能差 |
Zen の行は、2026年9月21日に確認した同サービス自身のドキュメントに基づいています。Zen と Go は別々に課金される製品であるため、Zen の料金は Go 購読者が支払う料金ではありません。また、Zen 自身のリストでは、プロバイダーがフィードバックを集めている間、複数のモデルが一時的に無料と示されています。OpenCode の料金は、クライアント側のコストを扱います。
サブスクリプションを以下の表に変換することはできません。そう見なすのが、ここで最も起こりやすい間違いです。Go の利用枠は、Go 独自のモデルごとの料金におけるドルで表され、各モデルに独自の上限があります。ドキュメントの計算例では、月額 $60 のモデルに対して、5時間あたり $12、週あたり $30 の利用が許可されています。2026年9月21日に確認したモデル行では、GLM-5.3-Flash は入力 100万トークンあたり $0.15、出力 100万トークンあたり $0.50、月間上限 $60、月間推定リクエスト数 31,580 です。これらは OpenCode 自身のカタログに対する推定であり、保証ではありません。また、1つの行には、執筆直後に期限切れとなる日付付きプロモーションが含まれていました。Go のモデルリストと利用ウィンドウに収まるワークロードであれば、$10 で多くの従量利用ができます。比較の本質は、利用するモデルとバーストがその中に収まるかどうかです。
従量制ゲートウェイでは、同じワークロードでも料金が異なります。これらは実測したタスク費用でも請求上限でもなく、トークン計算の例です。1か月に、nanobot アシスタント1つがキャッシュされていない入力トークン 3,000,000 と出力トークン 300,000 を消費すると仮定し、100万トークンあたりの現在のKunavo カタログ料金を使います。
| モデル | 100万トークンあたりの入力/出力 | 想定した月の見積もり |
|---|---|---|
| Claude Haiku 4.5 | $0.70 / $3.50 | $3.15 |
| Claude Sonnet 5 | $1.40 / $7.00 | $6.30 |
| Claude Opus 5 | $3.50 / $17.50 | $15.75 |
予算として扱う前に、自分のトラフィックに合わせてこれらを拡大してください。また、バックグラウンドスケジュールによっては、モデルの選択よりも入力列の方が大きく変わる可能性がある点に注意してください。nanobot API の料金とセットアップでは、nanobot がデフォルトで有効にする実行頻度を扱っています。Kunavo のカタログ金額は上限ではなく請求下限です。アップストリームが料金を報告した場合、請求額はカタログ費用と、適用されるマークアップを掛けたアップストリーム費用の大きい方になります。キャッシュ料金、ツール、ホスティングはこの例の対象外です。最低チャージ額は前払いクレジットの $10 であり、資金投入の最低額であって、タスク料金でもサブスクリプションでもありません。請求の詳細を参照してください。
Kunavo が役立つことと、役立たないこと
変換よりも、ここでは率直に説明することが重要です。Kunavo は OpenCode Go や Zen を再販しておらず、nanobot を https://api.kunavo.com/v1 に向けても OpenCode Go のサブスクリプションは修復されません。 要件を回避するだけです。x-opencode-session は opencode.ai ホストに属するためです。また、v0.3.5 のソースにおけるホスト名ルールにより、nanobot はそれ以外のベース URL でもそのヘッダーを付加しません。このようなヘッダーを Kunavo のエンドポイントがどう扱うかはここではテストしておらず、Kunavo に対する nanobot もテストしていません。nanobot の統合ページはなく、上記の設定に関する記述はすべて、互換性の結果ではなく、ベンダーのドキュメントと出荷済みソースを読んだ結果です。
したがって、これらのルートは修正と回避策ではなく、異なるトレードオフを持つ選択肢として扱ってください。従量制の OpenAI 互換ルートがワークロードに適している場合、クイックスタートでエンドポイントの規則を確認し、Kunavo アカウントを作成することがキーに資金を投入する前の手順です。試す間は動作するルートを維持し、範囲を限定したタスクを1つ実行してから、アカウントに記録された内容を確認してください。サブスクリプションではなく、アーカイブ済みの Go ターミナルエージェントを探して来た場合は、Crush 統合ドキュメントで後継製品を、OpenCode 統合ドキュメントで現在の TypeScript クライアントを扱っています。より広い比較については、OpenAI 互換 APIとエージェント API ディレクトリを参照してください。別の OpenCode の失敗については、プロバイダーまたはモデルが見つからないが診断ページです。
よくある質問
x-opencode-sessionヘッダーを送信するnanobotのバージョンはどれですか?
2026年9月15日に公開されたv0.3.5が、この機能を含む最初のリリースです。この変更はHKUDS/nanobotのPR #5662で、2026年9月9日にコミット20f115bf4699bffcc786263cb999e7701986e179としてマージされ、v0.3.5のリリースノートにも記載されています。GitHubのタグ履歴にはv0.3.1からv0.3.4が存在せず、前のタグは2026年7月25日のv0.3.0です。そのため、影響を受ける範囲はv0.3.0以前です。2026年9月9日より後にmainをgit checkoutした場合も、タグ付きリリースでなくてもこの変更が含まれます。2026年9月21日にGitHub APIで確認しました。比較呼び出しでは、v0.3.5がそのコミットより84コミット先行し、遅れているコミットは0件であることも確認しています。
なぜ nanobot は OpenCode Go から 400 MissingSessionID を受け取るのですか?
v0.3.0 までのリリースでは、プロセスごとの汎用的な x-session-affinity ID しか送信されず、OpenCode Go が要求する会話スコープの x-opencode-session ヘッダーが送信されなかったためです。これは、元となった nanobot issue #5661 が説明している動作であり、v0.3.5 のプロバイダーソースにも、新しいヘッダーとともに汎用ヘッダーが引き続き確認できます。ステータスコードとエラータイプ文字列は、2026年9月7日の第三者バグレポート vastsa/PI-Desktop#48 に由来します。このレポートでは、type が MissingSessionID の HTTP 400 と、リクエストを効率的にルーティングできないというメッセージが示されています。OpenCode の Go ドキュメントには、そのコードやタイプを掲載したエラーリファレンスがないため、正確な契約は文書化されたものではなく、ユーザーから報告されたものとして扱ってください。
nanobot をアップグレードする代わりに、x-opencode-session ヘッダーを手動で設定できますか?
できます。v0.3.5 のソースはその設定を尊重します。自分で設定したヘッダーが優先され、名前は大文字と小文字を区別せずに照合されます。ただし、これは適切な修正方法ではありません。nanobot の providers.<name>.extraHeaders は、プロバイダーのリクエストに統合されるヘッダーとして文書化されているため、静的な値を1つ設定すると、そのプロバイダーブロックから送信されるすべてのリクエスト、すべての会話に同じ値が送られます。OpenCode Go のドキュメントは、ルーティングとプロンプトキャッシュを最適化できるよう、会話ごとに安定したセッション ID を求めています。そのため、1つの共有値や、リクエストごとに新しいランダム値を使うことは、料金を支払っているキャッシュの仕組みに逆効果です。v0.3.5 にアップグレードするか、その要件を持たないルートに処理を移してください。
nanobot を v0.3.5 にアップグレードすれば、OpenCode Go と完全に互換性がありますか?
解決するのはセッションヘッダーだけであり、それ以外は解決しません。OpenCode Go はクライアントに複数の義務を課しています。ドキュメントでは、汎用的な SDK 名や HTTP ライブラリ名ではなく、my-coding-agent/1.0 のように独自のユーザーエージェントでクライアントを識別することも求めています。nanobot v0.3.5 のソースを読むと、OpenCode プロバイダーを提供する OpenAI 互換プロバイダーモジュールは User-Agent をまったく設定していません。一方、GitHub Copilot、xAI Grok、OpenAI Codex の各プロバイダーモジュールは nanobot ブランドのものを設定しています。そのため、この経路では、基盤となる SDK がデフォルトで送信する値がリクエストに含まれます。この値を確認するため、ここでは実際のリクエストを送信していません。nanobot 自身の v0.3.5 プロバイダーリファレンスには、もう1つの制限があります。その経路では、OpenCode が chat/completions エンドポイント配下に掲載しているモデル ID を使用してください。responses、messages、またはプロバイダー固有のエンドポイントにのみ掲載されているモデルは、その経路では処理されません。OpenCode の Go ドキュメントには、検証済みクライアントが7つ、セッションサポートが欠落または不完全なクライアントが4つ掲載されています。2026年9月21日時点で nanobot はどちらのリストにもありません。これは公開された判定がないということであり、推奨でもブロックでもありません。
OpenCode Go は、以前の OpenCode Go CLI と同じものですか?
いいえ。両者を混同すると、誤ったドキュメントにたどり着きます。OpenCode Go は opencode.ai で販売されている月額 $10 の現在提供中のモデルサブスクリプションで、https://opencode.ai/zen/go/v1/ エンドポイントを通じてモデルを提供し、呼び出し側に満たすよう求めるクライアント契約を公開しています。アーカイブ済みの Go 言語製 OpenCode ターミナルエージェントは別のプロジェクトです。その README には、元の作者と Charm チームによって、プロジェクトが Crush という名前で継続されていると記載されています。こちらはクライアントソフトウェアであり、モデルサービスではありません。また、x-opencode-session ヘッダーとは無関係です。ターミナルエージェントを探してここに来た場合は、Kunavo の Crush 統合ドキュメントが対象です。
nanobot を別のゲートウェイにルーティングすれば、このエラーは解消しますか?
エラーを修正するのではなく回避します。この違いは重要です。x-opencode-session の要件は、特に opencode.ai ホストに属します。nanobot v0.3.5 では、リクエストの送信先に基づいてヘッダーが付加されます。プロバイダー仕様が opencode、opencode_zen、opencode_go のいずれかである場合、またはベース URL のホスト名が opencode.ai もしくはそのサブドメインである場合です。プロバイダーブロックを別のホストに向けると、nanobot はそのヘッダーを送信しません。そのホストが代わりに要求するものは、そのベンダー独自の契約であり、このページでは扱いません。これはモデルも課金も異なる別のルートであり、すでに料金を支払った OpenCode Go サブスクリプションの修復ではありません。
2026年9月21日時点で確認:opencode.aiのGoおよびZenドキュメントと変更履歴、HKUDS/nanobotのリリース、タグ、PR #5662、issue #5661、ならびにコミットがv0.3.5タグに含まれることを示すcompare呼び出しに対するGitHub API;引用された通知と報告された400エラーについてはanomalyco/opencode#47438およびvastsa/PI-Desktop#48;nanobotが送信する内容に関するすべての主張についてはv0.3.5のソースtarballを確認した。09/06という日付は、nanobotのissueとPRが引用している、2026年9月3日付の@opencodeによるXの投稿に由来するが、このページではその投稿を取得していない。引用された購読者向け通知と400エラーの契約はユーザー報告であり、OpenCodeのドキュメントや変更履歴にはいずれも記載されていない。ここでは誰もnanobotをOpenCode GoまたはKunavoに対して実行しておらず、障害も再現していない。Kunavoのトークン料金はライブカタログに基づき、すべてのドル額は記載された前提に基づく例示的な算術である。