結論から
外出先のiPadから自宅のMacBookでAI開発させる構成を作りました。最終形はこれです。
iPad → Telegram → Hermes → Claude Code → DeepSeek → Git
そして、この記事で一番伝えたいのはここです。
1つのAIエージェントに全部やらせてはいけない。
Hermesに直接コードを書かせた瞬間、Tokenが目に見えて溶けました。
「遠隔操作するやつ」と「コードを書くやつ」を分けたら、体感が完全に変わりました。以下、失敗込みで書きます。
そもそもの動機:iPadでVS Codeを触るのは、わりと地獄
外出中に「あ、あの修正やっておきたい」と思うことがあります。
最初に考えるのはリモートデスクトップです。実際にできます。できますが、iPadの11インチの画面でVS Codeのサイドバーを開いて、ターミナルを分割して、カーソルをタップで動かして……というのを電車の中で15分やると、だいたい心が折れます。
で、あるとき気づきました。
そもそも自分がコードを書く必要、なくないか?
書くのはAIでいい。自分がやりたいのは「指示」と「確認」だけです。だとしたら必要なのは画面じゃなくて、チャットの入り口です。
最初の構成:Hermesに全部やらせて、Tokenが溶けた
最初はシンプルにこう考えました。
Hermes(汎用AIエージェント)にDeepSeekを繋いで、全部やらせればいいのでは?
Hermesは Terminal / File / Web / Browser / Cron / Messaging など何でも持っている汎用エージェントです。TelegramからMacBookのシェルを叩けるので、理屈の上ではこれ1つで完結します。
やってみました。
ログイン機能のバグを修正して
動きました。動いたんですが、Token残量の減り方がおかしい。
Claude CodeにDeepSeekを繋いで同じことをさせた場合と比べて、明らかに速く減っていく。最初は「気のせいかな」と思っていましたが、何度か試して確信しました。気のせいではありませんでした。
なぜ溶けるのか:犯人は2人いた
犯人①:毎回ついてくるTool Definition
Hermesは汎用エージェントなので、大量のツールを持っています。
Terminal / File / Web / Browser / Vision
Image / Todo / Cron / Messaging / Skills
そしてAIモデルに問い合わせるときは、これらのツール定義とSystem Promptを毎回Contextに載せる必要があります。
つまり1リクエストの入力は、こうなります。
ユーザーの指示
+ 会話履歴
+ System Prompt
+ Tool Definition(全部)
+ 読んだファイルの中身
+ Terminalの出力
+ 過去のTool Call履歴
一言送っただけなのに、入力Tokenは全然一言じゃないわけです。
犯人②:Agent Loopは「1タスク = 1リクエスト」ではない
こっちのほうが効きます。
「ログイン機能のバグを修正して」というたった1行の指示が、内部ではこうなります。
DeepSeekに質問 → ファイルを読む
DeepSeekに質問 → コード検索
DeepSeekに質問 → ファイル編集
DeepSeekに質問 → テスト実行
DeepSeekに質問 → エラー解析
DeepSeekに質問 → 再修正
人間の感覚では1タスク。API的には6回以上のリクエストで、しかも後半になるほどContextが膨らんでいます。
そして重要なのは、このループのたびに犯人①のTool Definitionも一緒に運ばれていることです。掛け算になります。溶けます。
発想の転換:Hermesは「書く人」ではなく「振る人」
ここで役割を分けました。
自分 = 何を作るか決める
Hermes = 誰にやらせるか決める(AI秘書 / マネージャー)
Claude Code = どう実装するか決める(AIエンジニア)
DeepSeek = 考える(頭脳)
Hermesにコードを書かせるのをやめて、Claude Codeを起動するだけの係にする。これだけです。
こうすると、Hermes側のContextに乗るのは「起動コマンド」と「最終結果のサマリ」だけになります。ソースコードの中身も、テストの出力も、Hermesは抱えません。重い仕事は、コーディング用に最適化されたClaude Code側のループで完結させます。
図にするとこうです。
外出先
│
iPad
│
Telegram
│
▼
┌─────────────┐
│ Hermes │ ← タスクを受けて振るだけ
│ AI Manager │
└──────┬──────┘
│
自宅のMacBook
│
▼
┌─────────────┐
│ Claude Code │ ← ここで全部やる
│ AI Engineer │
└──────┬──────┘
│
▼
DeepSeek
│
▼
Git Repository
作り方(4ステップ)
ステップ1:MacBookをAIサーバーにする
MacBook上で常時動かすのは以下です。
Hermes Server
Claude Code
Git / Node.js / Python
開発プロジェクト
ここが最大の落とし穴なんですが、MacBookがスリープするとHermesもClaude Codeも死にます。
外出先から意気揚々と指示を送って、無反応で「あっ」となるやつです。1回やりました。以下は必ず確認してください。
- 電源に繋いだままにする
- スリープ設定(
caffeinateでもいいですが、蓋を閉じる運用ならクラムシェル設定を見直す) - ネットワークが切れない場所に置く
ステップ2:Telegramを入り口にする
Telegram BotをHermesの受付にします。iPadからは、これだけ送ります。
shopプロジェクトの現在の状態を確認して。
ステップ3:Hermesには「コードを書け」と言わない
これがTokenを守る一番のコツです。
❌ 溶ける言い方
このRepositoryを全部調査して、
問題を見つけて、ファイルを編集して、テストして。
Hermesが自分でAgent Loopを回し始めます。
✅ 溶けない言い方
Claude Codeを起動して、
このRepositoryの問題を修正させて。
主語がClaude Codeになっているのがポイントです。
ステップ4:Claude Codeをプログラマーとして起動する
HermesからはヘッドレスモードでClaude Codeを叩きます。-p(--print)を付けると、対話UIを開かずに1ターン実行して結果を出力し、終了します。
cd ~/Projects/shop
claude -p "
現在のgit diffとTODOを確認してください。
決済機能の実装を続けてください。
既存コードの設計を尊重し、無関係なファイルは変更しないでください。
実装後にテストを実行し、失敗した場合は原因を修正してください。
最終的に変更内容とテスト結果をまとめてください。
" --allowedTools "Read,Edit,Bash"
--allowedTools で使わせるツールを絞れます。無人で走らせる以上、ここは指定しておいたほうが精神衛生上いいです。
Hermes側の仕事は、これだけになります。
Claude Code起動 → 結果待ち → 結果をTelegramへ送信
コピペ用:外出先から投げるプロンプトの型
実際に電車の中から送っているのがこれです。
~/Projects/shop を確認。
まず現在のGit状況を確認して。
未完成の決済機能をClaude Codeに実装させて。
既存テストを全部実行。エラーが出た場合は修正。
全部成功したらcommitして、
変更ファイル / 変更内容 / テスト結果 をまとめて報告して。
送ったらiPadを閉じます。しばらくするとTelegramにこう返ってきます。
変更ファイル:5件
実装:
・PaymentService追加
・Stripe webhook処理修正
・重複決済防止処理追加
Test:148 passed / 0 failed
Commit:feat: complete payment processing
人間はコードを1行も打っていません。 これがやりたかったやつです。
Token節約:さらに効いた2つのこと
① Hermesのツールを削る
コーディングのリモート操作用途なら、必要なのはこのくらいです。
Telegram:
- terminal
- file
- web
- todo
逆に Vision / Image Generation / TTS / Browser あたりを普段使わないなら、毎回モデルに渡す理由がありません。Tool Definitionが減れば、犯人①の分がそのまま軽くなります。
② 「Token使用量」と「請求額」を混同しない
これ、地味に重要です。
DeepSeekのようにPrompt Cacheに対応しているAPIでは、System PromptやTool Definitionのような毎回同じ部分がCache Hitになります。つまり「1,000,000 Token使った」と表示されても、1,000,000 Token分を通常の入力単価で払っているとは限りません。
見るべきはここです。
Input Token / Cached Input Token / Output Token / 実際の請求額
なお、Claude Code側は --output-format json を付けると、レスポンスに total_cost_usd とモデル別のコスト内訳が入ってきます。使用ダッシュボードを見に行かなくても、実行ごとのコストをスクリプトで拾えます(クライアント側の推定値なので、実際の請求と多少ずれる点だけ注意)。
claude -p "..." --output-format json
「体感で溶けている気がする」を、数字で潰せるようになります。
参考:https://code.claude.com/docs/en/headless
それでもリモートデスクトップは捨てないでください
Hermesで99%は回りますが、残り1%で確実に詰みます。
- macOSの権限ダイアログが出た
- ログインが必要になった
- CAPTCHA / 2段階認証
- AIが謎の場所で止まっている
- IDEの画面を自分の目で見たい
このとき、チャットの入り口しか持っていないと何もできません。予備の回線としてJump Desktopなどを入れておきます。
┌─ Telegram → Hermes → AI自動操作
iPad ──────────┤
└─ Jump Desktop → MacBook(緊急時のみ)
普段はTelegram、詰んだときだけJump Desktop。この二段構えがかなり快適です。iPad + Magic Keyboardならなおさら安心できます。
結局どっちに何をやらせるのか
| タスク | Hermes | Claude Code |
|---|---|---|
| コードを書く | ○ | ◎ |
| 大規模Repository解析 | △ | ◎ |
| Debug / Refactoring | ○ | ◎ |
| テスト実行 | ○ | ◎ |
| Telegram操作 | ◎ | △ |
| 遠隔操作 | ◎ | △ |
| 定期実行 | ◎ | △ |
| ブラウザ操作 | ◎ | △ |
| 複数ツール連携 | ◎ | △ |
| 個人AIアシスタント | ◎ | △ |
きれいに逆になります。だから分けたほうがいい、という話でした。
まとめ
Hermes = Manager(誰にやらせるか)
Claude Code = Programmer(どう実装するか)
DeepSeek = Brain(考える)
- 汎用エージェントに直接コードを書かせると、Tool Definition × Agent Loop でTokenが溶ける
- 重い仕事は、コーディング特化のClaude Codeに
claude -pで丸投げする - Hermesには結果だけ持たせる
- MacBookのスリープだけは本当に気をつける
- リモートデスクトップは保険として残す
「iPadだけ持って外出して、自宅のMacBookにAIで開発させる」をやりたい人には、この構成はかなり相性がいいはずです。
同じことをやっている方の構成、特に「Hermes側をどこまで削ったか」はぜひコメントで教えてください。