DeepSeek Everywhere:Claude Codeとローカルエージェントスタック
- カテゴリ
- AIとローカルLLM
- 公開日
- 2026年7月11日
- 更新日
- 2026年9月16日
- 著者
- Jacob Lloyd — プロジェクト完了後、AIの支援を受けて執筆
- 読了時間
- 約17分で読めます
かんたんに言うと: 非常に安価なクラウドAIサービスであるDeepSeekを、より高価なサービスに料金を払う代わりに、既存のAIツールに組み込む方法を解説したガイドです。すぐにコピーして使える3つの設定例が紹介されており、そのうちの1つは秘密のアクセスキーを安全に隠しておけるものです。1メッセージあたり数セントの何分の1かのコストで、十分に機能するAI支援を得られます。
2026年7月時点で、DeepSeekは私の自宅環境で3つの異なるものを支えていました。エージェントスタックの中枢、Claude Code CLI、そしてフォールバックのはしごのクラウド段です。接続にかかった作業は、JSONの記述、いくつかの環境変数の設定、そして一晩を費やすことになったsystemdのエスケープのバグだけでした。
更新情報 2026-09-16:その後、私のエージェントスタックは6体のエージェントに統合され、2026年8月下旬以降は、メインのエージェントがMiniMax M3上で動作し、DeepSeekは従量制のフォールバックとして利用されています。以下に記載している8体のエージェント構成は、本稿執筆時点での状況を示したものです。接続方法に変更はなく、現在もDeepSeekは同じように接続されています。
要約
- 概要: DeepSeekの有料クラウドAPIを、マルチエージェントのホームスタックの頭脳として、またClaude Code CLIのドロップインバックエンドとして利用する方法です。「自分のGPUで動かす」別のガイドではありません。
- 費用: 低価格プランではメッセージ1件あたり数セントの何分の1かです。サブスクリプションは不要で、APIキーだけあれば利用できます。
- 必要なもの: DeepSeekのAPIキー、OpenAI形式のチャット補完に対応するもの、そしてClaude Codeの仕組みを利用したい場合はsystemdです。
- 得られるもの: そのままコピーして使える3つの設定、クラウドとローカルの選択基準リスト、そしてAPIキーを
ps、systemctl show、ログに漏れ出さないようにする秘匿テクニックです。
最終的に得られるもの
手順を説明する前に、7月に私が実際に構築した仕組みの概要を紹介します。私はOpenClawというエージェントゲートウェイを動かし、チャットUIの背後に8つのエージェントを用意しました。また、これらのエージェントが実際のコーディング作業用に起動するのがClaude Code CLIです。両方の処理の裏側ではDeepSeekがサポートしています。
| パターン | 機能内容 | コスト |
|---|---|---|
| 1. エージェント用バックエンド | ゲートウェイ設定においてDeepSeekをプロバイダーとして指定。どのエージェントもこれを優先的またはフォールバック用として利用可能 | 100万トークンあたり0.14~0.87ドル |
| 2. Claude Code用バックエンド | systemdの仕組みを活用し、CLIがDeepSeekのAnthropic互換エンドポイントを利用するように再設定。再インストールの必要なし | トークン単価は上記と同様 |
| 3. フォールバック処理 | 処理内容に応じてDeepSeekかローカルモデルを選択するための判定リスト | ローカルモデルが使用される場合は0ドル |
これら全てを可能にしている鍵となる要素は、DeepSeekがhttps://api.deepseek.com/anthropicというAnthropic互換のエンドポイントを提供している点です。Claude向けに作られたあらゆるシステム――Claude Code CLIも含め――は、環境変数を設定するだけでこのエンドポイントを利用できます。ラッパースクリプトやフォークの必要は一切ありません。
パターン1:DeepSeekをエージェントの脳として利用する
ゲートウェイ設定内にプロバイダーブロックが1つ存在します。実際の設定例ですが、キー部分は伏せてあります:
"deepseek": {
"baseUrl": "https://api.deepseek.com/v1",
"api": "openai-completions",
"apiKey": "CHANGE_ME",
"timeoutSeconds": 450,
"models": [
{
"id": "deepseek-v4-pro",
"name": "deepseek-v4-pro",
"reasoning": true,
"input": ["text"],
"cost": { "input": 0.435, "output": 0.87,
"cacheRead": 0.003625, "cacheWrite": 0.435 },
"contextWindow": 1000000,
"maxTokens": 384000
},
{
"id": "deepseek-v4-flash",
"name": "deepseek-v4-flash",
"reasoning": true,
"input": ["text"],
"cost": { "input": 0.14, "output": 0.28,
"cacheRead": 0.0028, "cacheWrite": 0.14 },
"contextWindow": 1000000,
"maxTokens": 384000
}
]
}
各エージェントはそれぞれ、プライマリモデルとフォールバック用のモデルチェーンを選択します:
"model": {
"primary": "deepseek/deepseek-v4-flash",
"fallbacks": ["deepseek/deepseek-v4-pro", "vllm/google/gemma-4-31b"]
}
このルーティング経由でメッセージが送られてきた際の流れは次の通りです:
2026年8月時点での各エージェントの役割別構成です。ほとんどのエージェントはDeepSeekをプライマリモデルとし、ローカルモデルへフォールバックする設定でしたが、ローカル用のメインエージェントだけは意図的に逆の順序にしてあります:
| エージェント | プライマリモデル | フォールバック先 |
|---|---|---|
| メインのチャットエージェント | DeepSeek flash | DeepSeek pro → ローカルのgemma-4-31b |
| 推論用エージェント | DeepSeek pro | ローカルのgemma-4-31b |
| 高速処理用エージェント | DeepSeek flash | DeepSeek pro → ローカルモデル |
| デプロイ用エージェント | DeepSeek pro | DeepSeek flash → ローカルモデル |
| 家族向け安全モードのエージェント | DeepSeek flash | DeepSeek pro → ローカルモデル |
| ローカル用メインエージェント | ローカルの120Bモデル | DeepSeek flash (逆順:ローカルモデルが優先) |
| もう1つの家族向け安全モードエージェント | ローカルモデル | DeepSeek flash → DeepSeek pro |
| 画像認識用エージェント | ローカルのgemma-31b | DeepSeek pro → DeepSeek flash |
ここで特に重要なのが画像認識用エージェントです。記載されているDeepSeek関連設定はテキストのみを対象としています("input": ["text"])。そのため、たとえフォールバックチェーンがどうなっていようとも画像処理は常にローカルモデルで行われます。また、エイリアス機能(ds-flash、ds-brain)を利用すれば、設定を編集せずに会話中でもモデルを切り替えることが可能です。
以下の2つの設定を省略すると問題が生じる可能性があります:
"reasoning": trueは推論用モデルにおいて必須です。こうしたモデルでは実際の返答に先立ちreasoning_contentがストリーム配信されます。このフラグをオフにするとゲートウェイ側は何も受信せず、モデルが応答不能状態にあると判断して390秒程度で処理を打ち切ってしまいます。どうしてそうなるかは私自身が経験済みです。timeoutSecondsの値を引き上げる必要があります。デフォルトのリクエストタイムアウトは120秒でしたが、長時間にわたる推論処理ではこの制限を超えてしまい、不規則に「失敗」として扱われるケースが発生しました。ここでは450秒に設定することで問題が解消されました。なおプロバイダー設定はホットリロードに対応しているため、ゲートウェイの再起動も不要です。
パターン2:DeepSeek上でClaude CodeのCLIを利用する
Claude CodeのCLIは、環境変数からANTHROPIC_BASE_URL、ANTHROPIC_MODEL、そしてANTHROPIC_AUTH_TOKEN/ANTHROPIC_API_KEYを読み取ります。また、DeepSeekが提供する/anthropicエンドポイントも、Claudeと同じ通信形式を用いています。したがって、CLIのルーティングを変更するには、ゲートウェイが起動させる各Claude Codeサブプロセスに渡される環境変数を変更するだけでよく、CLI自体は標準の状態のままで構いません。
このファイルは systemd 用のユーザー設定ファイルです。7月の時点では、私が作成した GTKアプリによって生成されました。このアプリは「ローカルの LM Studio」「DeepSeek」「Anthropic Cloud」「オフ」という4つのモードを切り替える機能を持っています。ただし、実際の設定内容はごく簡単なものなので手書きでも作成可能です。
# ~/.config/systemd/user/openclaw-gateway.service.d/60-subagent-routing.conf
[Service]
# Routes Claude Code CLI sub-processes to DeepSeek's Anthropic-compatible
# endpoint. The key is NOT copied here: $$DEEPSEEK_API_KEY is systemd's escape
# for a literal $DEEPSEEK_API_KEY, which bash expands at runtime from the
# gateway EnvironmentFile -- the secret never enters the unit or the argv.
Environment="ANTHROPIC_BASE_URL=https://api.deepseek.com/anthropic"
Environment="ANTHROPIC_MODEL=deepseek-v4-pro"
ExecStart=
ExecStart=/usr/bin/bash -c 'export ANTHROPIC_AUTH_TOKEN="$$DEEPSEEK_API_KEY"; export ANTHROPIC_API_KEY="$$DEEPSEEK_API_KEY"; exec node /path/to/openclaw/dist/index.js gateway --port 18789'
そのキー自体は、正確に一か所にのみ存在します。それがサービスのEnvironmentFileです(ゲートウェイが所有する環境変数ファイルで、chmod 600となっております)。このファイルには単にDEEPSEEK_API_KEY=CHANGE_MEという内容が記載されているだけです。
$$の落とし穴(この記事が存在する理由そのものです)
初めての試みでは、単に $ を使っただけでした。うまくいきませんでした。ユニットファイル内においては、$VAR という記述が systemd自体によって起動時に展開され、その値が直接コマンドラインに埋め込まれてしまいます。この様子は ps や /proc/<pid>/cmdline、さらには systemctl show でも確認できます。秘密情報を置く場所としては適切ではないでしょう。
$$VARは、systemdにおけるそのままの文字列として扱うための表記法であり、$VARと同じ役割を果たします。つまり、systemdはその文字列をそのまま通過させ、実行時にEnvironmentFileに既に設定されている環境変数からBashがそれを展開するのです。結果として、秘密情報はchmod 600で保護された1つのファイル内にのみ存在し、ユニットファイルやsystemctl show、あるいは任意の引数の中には一切現れません。これは、systemdとBashを利用して作られた簡易的なシークレット管理機能であり、実際に機能します。
実際にこれを実行してみた際の注意点が他にもあります:
- 認証用の変数を両方とも設定してください。 異なるCLIのバージョンでは
ANTHROPIC_AUTH_TOKENまたはANTHROPIC_API_KEYが読み込まれます。片方だけを設定しても適切に機能するかどうかは運次第です。 ANTHROPIC_MODELも指定してください。 そうしないと、CLIが通常使う sonnet/opus といったエイリアスが DeepSeekのエンドポイントに送信されてしまい、404エラーになることがあります。- このドロップイン機能は、実際のAnthropic用キーを上書きしてしまいます。 一つの環境変数設定がCLI全体に影響します。私は「実際のClaudeへルーティングする」ためのエイリアスが静かに機能しなくなったことでこの事実に気付きました。
- まず
ExecStart=の行を空欄にしてください。 オーバーライド前に空行を入れないと、systemdが元のコマンドを置き換える代わりに新しいコマンドを追加してしまいます。 - パッケージの更新によってこのラッパーが無効化される可能性もあります。 起動コマンドがハードコーディングされているため、実際の
ExecStartが変更されるとドロップインを再生成する必要があります。私が作成したジェネレーターは、該当ユニットのFragmentPathから正しいコマンドを読み取り、すでに$$DEEPSEEK_API_KEYが含まれているものについてはラップ処理を行いません。 - 最後にリロードを行ってください:
systemctl --user daemon-reload && systemctl --user restart <service>となります。
パス全体が正しく機能するかを確認するため、CLIは使わずにcurlで実行してみてください:
curl https://api.deepseek.com/anthropic/v1/messages \
-H "x-api-key: $DEEPSEEK_API_KEY" \
-H "anthropic-version: 2023-06-01" \
-H "content-type: application/json" \
-d '{"model":"deepseek-v4-pro","max_tokens":16,"messages":[{"role":"user","content":"ping"}]}'
"type":"message"という応答が返ってくるということは、Anthropic互換の処理経路が実際に正常に機能していることを意味します。
パターン3:実際にDeepSeekを使うべき場面と、ローカルモデルを使うべき場面
両方を用意していても、すべての処理をクラウドで行うわけではありません。100万トークンあたりのコストについては、Claudeの定価を基準にします(Opusが5ドル/25ドル、Sonnetが3ドル/15ドル、Haikuが1ドル/5ドル)。
| 選択肢 | 入力コスト | 出力コスト | 備考 |
|---|---|---|---|
| DeepSeek flash | 0.14ドル | 0.28ドル | キャッシュ読み込み料は0.0028ドル。チャットエージェントとしての利用コストは1日あたり数ペニー程度です。 |
| DeepSeek pro | 0.435ドル | 0.87ドル | 「思考型」モデルであり、それでもSonnetより7〜17倍も安価です。 |
| ローカルモデル(同一マシン) | 0ドル | 0ドル | 電気代のみがコストとなります。 |
驚くべき点は速度です。ローカルの100Bクラスのモデルでは、応答時間のタイムアウト値を20〜30分に設定する必要があり、さらに複数のエージェントが同一GPUを共有すると互いに処理が遅延してしまいます。一方でDeepSeekは数秒で回答を返します。450秒という上限は、最悪の状況下での推論処理時のみ問題となります。もう一つの差異はコンテキストの長さです。DeepSeekは100万トークンまで対応可能ですが、ローカルモデルは約12万8千トークン程度しか扱えません。そのため、長時間にわたるエージェント処理や大規模なコードベースの開発作業にはDeepSeekが適しています。一方で画像認識機能に関しては逆になります。私の利用例ではDeepSeekはテキストのみを扱うため、「この画像を見てください」といった要望にはローカルの画像認識モデルを使っています。
実際に私が用いているプライバシーに関する判断基準は「メールで送信しても問題ない内容だけをクラウドに送る」というものです。
フォールバックの仕組みは双方向に機能します。これが私が最も気に入っている点です。インターネットやAPIが利用不可な状況では、クラウド主体のエージェントもローカルモデルへ切り替わります。また、ローカルモデルを主として利用している環境でも、サーバーが混雑したり停止したりした際にはDeepSeek flashに自動的に切り替わります。つまり、どちらか一方だけが完全に機能しなくなることはありません。
注意点、簡単なリスト
reasoning: trueフラグ、120秒のタイムアウト設定、$$によるエスケープ処理、そして本物のAnthropicキーを隠すための仕組みなどは、パターン1およびパターン2の中で詳しく説明しています。さらに2点だけ追加します。
- プラグイン許可リストが空でない場合は厳格に適用されます。 OpenClawにおいて、
plugins.allowに記載されていない有効なプロバイダーエントリは一切読み込まれません。エラーも警告も出ず、ただ何も起こらないだけです。 - ここでのDeepSeekはテキストのみ対応です。 画像処理関連のジョブを送信する前に、モデル設定内の
"input"項目を必ず確認してください。
もしAPIキーもクラウド料金も一切使わず、完全にローカル環境だけで利用したい場合はどうすればよいか?その方法も記事にしてあります:DeepSeek:完全ローカルでの実行 — 4ステップガイド。この手順に従えば、Ollama、Docker、Open WebUIを使って自分のGPU上でDeepSeekを動かせます。これが初心者向けの方法です。一方、より重い処理にはGPUの能力が足りなくなった場合でも、機密情報は自宅内に留めておきたいという方向けの方法も存在します。
関連記事:この仕組みが動作するローカルAIエージェントスタック、Claude Code用の代替機能を作成するOpenClawモデルマネージャー、DeepSeekを完全ローカルで動かす方法、そしてLLMアシスタントのセットアップ方法もご覧ください。