DeepSeekをそこら中に:格安クラウドの頭脳をClaude Codeとローカルエージェント基盤に配線する
- カテゴリ
- AIとローカルLLM
- 公開日
- 2026年7月11日
- 著者
- Jacob Lloyd — プロジェクト完了後、AIの支援を受けて執筆
- 読了時間
- 約14分で読めます
かんたんに言うと: 格安のクラウドAIサービス「DeepSeek」を、手持ちのAIツールに組み込んで使う方法のガイドです。そのままコピーして使える設定を3パターン紹介し、秘密のアクセスキーを安全に隠すコツも解説。1メッセージあたりほんの数銭で、高性能なAIを活用できます。
うちではいま、DeepSeekが3つの役割を担っています。エージェント基盤の頭脳、Claude Code CLIのバックエンド、そしてフォールバックはしごのクラウド段。配線に必要だったのはJSON少々と環境変数いくつか、あとはひと晩を溶かしたsystemdのエスケープバグが1件です。
tl;dr
- これは何:DeepSeekの有料クラウドAPIを、マルチエージェント自宅基盤の頭脳として、そしてClaude Code CLIの差し替えバックエンドとして使う話。「自前のGPUで動かそう」系の記事ではありません。
- 費用:安いモデルなら1メッセージあたり1円のさらに何分の一か。サブスクは不要で、必要なのはAPIキーだけです。
- 必要なもの:DeepSeekのAPIキー、OpenAI形式のchat completionsを話せる何か、そしてClaude Codeの小技を使うならsystemd。
- 得られるもの:コピペで使える設定3つ、クラウドとローカルの使い分けリスト、そしてキーを
psにもsystemctl showにもログにも残さないシークレット管理の小技。
最終的にこうなる
手順の前に、全体像から。うちではエージェントゲートウェイのOpenClawを動かしていて、チャットUIの後ろに8体の名前つきエージェント、さらに本格的なコーディング用にそのエージェントたちが起動するClaude Code CLIがいます。その両方をDeepSeekが支えています。
| パターン | 役割 | コスト |
|---|---|---|
| 1. エージェントの頭脳 | ゲートウェイ設定のプロバイダーとしてDeepSeekを登録。どのエージェントもprimaryにもfallbackにも指定できる | $0.14〜$0.87 / 100万トークン |
| 2. Claude Codeのバックエンド | systemdのdrop-inで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
}
]
}
あとは各エージェントがprimaryモデルとフォールバックチェーンを選ぶだけです:
"model": {
"primary": "deepseek/deepseek-v4-flash",
"fallbacks": ["deepseek/deepseek-v4-pro", "vllm/google/gemma-4-31b"]
}
このルーティングでメッセージが届くと、こう流れます:
実際のロスターがこちら。ほとんどのエージェントはDeepSeek先発でローカルに退避しますが、Doxyだけはわざと逆にしてあります:
| エージェント | プライマリ | フォールバック |
|---|---|---|
| Bits(メインチャット) | DeepSeek flash | DeepSeek pro → ローカル gemma-4-31b |
| Brains | DeepSeek pro | ローカル gemma-4-31b |
| Flash | DeepSeek flash | DeepSeek pro → ローカル |
| Hermes(デプロイ担当) | DeepSeek pro | DeepSeek flash → ローカル |
| Alpha(家族用セーフ) | DeepSeek flash | DeepSeek pro → ローカル |
| Doxy(ローカル主力) | ローカル 120B | DeepSeek flash (逆張り:ローカルが先発) |
| beta | ローカル | DeepSeek flash → DeepSeek pro |
| Charley(画像担当) | ローカル gemma-31b | DeepSeek pro → DeepSeek flash |
ここで効いてくるのがCharleyです。このDeepSeekエントリはテキスト専用("input": ["text"])なので、チェーンがどうなっていようと画像仕事はローカルに残ります。エイリアス(ds-flash、ds-brain)を使えば、設定を書き換えずに会話の途中でモデルを切り替えられます。
次の2つの設定は、サボると確実に噛みつかれます:
- 推論モデルには
"reasoning": trueが必須。推論モデルは本回答の前にreasoning_contentをストリームします。このフラグがオフだと、ゲートウェイには沈黙にしか聞こえず、モデルが固まったと判断して390秒あたりでターンを打ち切ります。なぜ知っているかは、聞かないでください。 timeoutSecondsは引き上げること。デフォルトのリクエストタイムアウトは120秒。長い推論はあっさり超えて、ランダムに「失敗」します。うちは450で解決しました。プロバイダー設定はホットリロードされるので、ゲートウェイの再起動は不要です。
パターン2:Claude Code CLIをDeepSeekで動かす
Claude Code CLIは環境変数からANTHROPIC_BASE_URL、ANTHROPIC_MODEL、ANTHROPIC_AUTH_TOKEN/ANTHROPIC_API_KEYを読みます。そしてDeepSeekの/anthropicエンドポイントはClaudeと同じワイヤーフォーマットを話します。つまりCLIの向き先を変えるには、ゲートウェイが各Claude Codeサブプロセスに渡す環境を変えるだけ。CLI本体は素のインストールのままです。
ファイルの正体はsystemdのユーザーdrop-inです。うちでは自作の小さなGTKアプリが4つのモード(Local LM Studio / DeepSeek / Anthropic Cloud / Off)を切り替えて生成していますが、手書きできる程度の短さです:
# ~/.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'
キーそのものの置き場所はただ1か所、サービスのEnvironmentFile(~/.openclaw/gateway.systemd.env、chmod 600)です。中身はDEEPSEEK_API_KEY=CHANGE_MEの1行だけ。
$$ の罠(この記事が存在する理由そのもの)
最初は$1個で書きました。結果は散々でした。unitファイルの中の$VARは、起動時にsystemd自身が展開します。つまりキーがコマンドラインに直接焼き込まれ、psでも/proc/<pid>/cmdlineでもsystemctl showでも丸見えになります。シークレットの置き場所としては、なかなかの最悪さです。
$$VARはsystemdにおけるリテラルの$VARのエスケープです。systemdは文字列に触らずそのまま渡し、実行時にbashが展開します。参照先はEnvironmentFileがすでに読み込んでおいた環境。結果として、シークレットはchmod 600のファイル1つにだけ存在し、それ以外のどこにも現れません。unitファイルにも、systemctl showにも、どのargvにも。systemdとbashで組んだ貧乏シークレットマネージャーですが、ちゃんと仕事をします。
実運用で踏んだ罠、続き:
- 認証系の変数は両方セットする。CLIのバージョンによって
ANTHROPIC_AUTH_TOKENを読むものとANTHROPIC_API_KEYを読むものがあり、片方だけだとコイントスになります。 ANTHROPIC_MODELを固定する。固定しないと、CLIおなじみのsonnet/opusエイリアスがそのままDeepSeekのエンドポイントに送られて404になります。- drop-inは本物のAnthropicキーを覆い隠します。CLI全体をひとつの環境が支配します。私は「本物のClaudeにつなぐ」エイリアスが黙って壊れたときに、それを学びました。
- 先に空の
ExecStart=を書く。上書き行の前のあの空行がないと、systemdは元のコマンドを置き換えず、追記扱いにします。 - パッケージ更新でラッパーが置き去りになることがあります。drop-inは起動コマンドをハードコードしているので、本来の
ExecStartが変わる更新が来たらdrop-inの再生成が必要です。うちのジェネレーターはunitの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分の1 |
| ローカル(同一マシン) | $0 | $0 | 電気代のみ |
より大きな驚きは速度でした。ローカルの100B級モデルではターンのタイムアウトを20〜30分まで引き上げる羽目になり、1台のGPUマシンを2エージェントで共有すると互いに詰まります。DeepSeekは数秒で返してきます。450秒の上限が効いたのは最悪ケースの推論くらい。もうひとつの差はコンテキストで、ローカル勢の約128kに対して100万トークン。なので長いエージェントセッションや大規模コードベースのコーディング仕事は、デフォルトでDeepSeek行きです。画像は逆方向で、うちのDeepSeekエントリはテキスト専用なので、「この画像を見て」はローカルの視覚モデルに残ります。
プライバシーについて実際に使っている経験則はひとつだけ。メールに書けないものは、クラウドにも送らない。
フォールバックチェーンは双方向に効きます。ここが一番のお気に入りです。クラウド先発のエージェントはネットやAPIが死ぬとローカルモデルに降り、ローカル先発の主力はローカルサーバーが混んでいたり落ちていたりするとDeepSeek flashに退避します。誰も完全には沈黙しません。
罠の一覧(短縮版)
reasoning: trueフラグ、120秒のタイムアウト、$$エスケープ、そしてdrop-inが本物のAnthropicキーを覆い隠す件は、いずれもパターン1と2の中で触れました。あと2つだけ:
- 空でないプラグインallowlistは厳格です。OpenClawでは、有効化済みでも
plugins.allowに載っていないプロバイダーエントリは一切ロードされません。エラーなし、警告なし、ただの沈黙です。 - ここでのDeepSeekはテキスト専用です。画像仕事を投げる前に、モデルエントリの
"input"を確認してください。
APIキーもクラウド課金もなしの完全ローカル派でいきたい?それも書いてあります:DeepSeekをローカルで動かす:4ステップガイド。Ollama、Docker、Open WebUIで、DeepSeekの蒸留モデルを自分のGPUで動かす話です。あちらは初心者向けの道。こちらは、重い仕事がGPUの手に余るようになっても、プライベートなものは家に置いておきたい人向けです。