【Claude Code Router】Raspberry PiでClaude CodeをOpenRouterのAPIで使う
作成日時2025-07-16 18:20
TagAI, Raspberry Pi
今回はClaude CodeでOpenRouter APIを使い、自分の好きなAIモデルを利用する方法。
ClaudeのMaxプランに入らず、かと言ってClaudeのAPIを使うわけでもなく、Claude Codeを使ったVibe Codingを格安で楽しめるかも。
そのために、オープンソース(MITライセンス)のClaude Code Routerを使います。
Claude Code Routerって何?
Claude Code Routerは、Anthropicが開発したエージェントコーディング用のコマンドラインツールであるClaude Codeの拡張機能です。
ユーザーは様々なAIモデルにリクエストを送信できるため、選択の柔軟性が向上します。
インストール
大前提としてNode.jsとnpmがインストールされていること
まずClaude Code自体をインストールする
bash
sudo npm install -g @anthropic-ai/claude-code
次にClaude Code Routerをインストール
bash
sudo npm install -g @musistudio/claude-code-router
設定
以下のように設定する(例: OpenRouter/Google/Gemini 2.5 Flashの場合)
bash
sudo nano /root/.claude-code-router/config.json
json
{
"Providers": [
{
"name": "openrouter",
"api_base_url": "https://openrouter.ai/api/v1/chat/completions",
"api_key": "ここにOpenRouter APIキー",
"models": [
"google/gemini-2.5-flash"
]
}
],
"Router": {
"default": "openrouter,google/gemini-2.5-flash",
"background": "openrouter,google/gemini-2.5-flash",
"think": "openrouter,google/gemini-2.5-flash",
"longContext": "openrouter,google/gemini-2.5-flash"
}
}
起動
アップデート
bash
sudo npm update -g @anthropic-ai/claude-code
sudo npm update -g @musistudio/claude-code-router
アンインストール
bash
sudo rm /root/.claude-code-router/config.json
sudo npm uninstall -g @anthropic-ai/claude-code
sudo npm uninstall -g @musistudio/claude-code-router
参考
OpenAI Responses APIの履歴を削除する
作成日時2025-07-02 19:49
TagAI
Responses API
2025年になって、OpenAIが突如として推して来た「Responses API」。
最近では新しいツールやMCPなどの利用はResponses APIに限られるため、OpenAIのAPIを使う場合には半強制な状況。
これまでの「Chat Completions API」と違う流儀で、他社APIとも互換性が失われ、非常に使いにくくなった。
Responses APIは、これまでと異なり、会話の履歴を入れずとも、「会話のid」を与えれば、過去の会話履歴が参照される。
かと言って、トークンが節約されるわけではない。
そして、Responses APIにおいてこのidの発行と履歴の保存はデフォルトでオンになっている。
つまり、最初の会話で必ずidが発行され、履歴が保存される。
以下に例を示す。
bash
curl https://api.openai.com/v1/responses \
-H "Content-Type: application/json" \
-H "Authorization: Bearer $OPENAI_API_KEY" \
-d '{
"model": "o4-mini",
"input": [{"role": "user", "content": "日本一の山は?"}],
}'
json
{
"id": "resp_xxxxx",
"object": "response",
"created_at": 1751000000,
"status": "completed",
"background": false,
"error": null,
"incomplete_details": null,
"instructions": null,
"max_output_tokens": null,
"max_tool_calls": null,
"model": "o4-mini-2025-04-16",
"output": [
{
"id": "rs_xxxxx",
"type": "reasoning",
"summary": []
},
{
"id": "msg_xxxxx",
"type": "message",
"status": "completed",
"content": [
{
"type": "output_text",
"annotations": [],
"logprobs": [],
"text": "\u65e5\u672c\u4e00\u306e\u5c71\u306f\u5bcc\u58eb\u5c71\u3067\u3059\u3002 \n\u6a19\u9ad8\u306f3,776\u30e1\u30fc\u30c8\u30eb\u3067\u3001\u5c71\u68a8\u770c\u3068\u9759\u5ca1\u770c\u306e\u5883\u306b\u4f4d\u7f6e\u3057\u3066\u3044\u307e\u3059\u3002\u65e5\u672c\u306e\u8c61\u5fb4\u3068\u3055\u308c\u3001\u53e4\u304f\u304b\u3089\u4fe1\u4ef0\u3084\u82b8\u8853\u306e\u984c\u6750\u306b\u3082\u306a\u3063\u3066\u304d\u307e\u3057\u305f\u3002"
}
],
"role": "assistant"
}
],
"parallel_tool_calls": true,
"previous_response_id": null,
"reasoning": {
"effort": "medium",
"summary": null
},
"service_tier": "default",
"store": true,
"temperature": 1.0,
"text": {
"format": {
"type": "text"
}
},
"tool_choice": "auto",
"tools": [],
"top_logprobs": 0,
"top_p": 1.0,
"truncation": "disabled",
"usage": {
"input_tokens": 12,
"input_tokens_details": {
"cached_tokens": 0
},
"output_tokens": 322,
"output_tokens_details": {
"reasoning_tokens": 256
},
"total_tokens": 334
},
"user": null,
"metadata": {}
}
このレスポンスの「resp_xxxxx」が会話のidである。
APIとしての利便性が向上したと思いきや、実はOpenAIのサーバーにこの履歴が半永久的に残るのだ。
これまでの履歴が残っていないか、以下からぜひ確認してみてほしい。
履歴は「30日で消える」と解釈できるような説明書きがあるが、実際には消えない(少なくともすでに数ヶ月経つが消えていない)。
これは人によっては気分が悪いだろう。
履歴を保存しない
もし履歴を残したくなければ、APIを呼び出す際に「store」のオプションを「false」にする必要がある。
このように明示的にオフにすれば履歴は保存されない(idは発行されるようだ)。
以下に例を示す。
bash
curl https://api.openai.com/v1/responses \
-H "Content-Type: application/json" \
-H "Authorization: Bearer $OPENAI_API_KEY" \
-d '{
"model": "o4-mini",
"input": [{"role": "user", "content": "日本一の山は?"}],
"store": false
}'
そうすると過去の履歴が参照できないため、そのままでは連続する会話が出来ないが、それはこれまで通りの流儀で、過去の会話履歴を毎回全て入力すればいい。
上述のように入力のトークン数も変わらない。
履歴を消す
次に、履歴を消したい場合だが、これが非常に面倒くさい。
OpenAIのコンソール画面では、履歴(Logs)の閲覧はできるが、削除はできないため非常にもどかしい。
それでも消す方法は一応あり、まず履歴からidを確認し、そのidを指定してAPIを叩いて消す。
以下にコード例を示す。
python
import os
import httpx
# OPENAI APIキー
API_KEY = "sk-abc"
# 削除したいIDを配列で指定
ids_to_delete = [
"resp_xxx",
"resp_yyy",
"resp_zzz"
]
def delete_openai_response(response_id: str) -> dict:
url = f"https://api.openai.com/v1/responses/{response_id}"
headers = {
"Authorization": f"Bearer {API_KEY}",
"Content-Type": "application/json",
}
with httpx.Client(timeout=30) as client:
response = client.delete(url, headers=headers)
response.raise_for_status()
return response.json()
print("削除処理を開始します。\n")
for an_id in ids_to_delete:
try:
print(f"id: {an_id} の削除を試みます。")
response = delete_openai_response(an_id)
print(f" > 応答: {response}")
if response.get("deleted"):
print(f" > 結果: ✅ 正常に削除されました。")
else:
print(f" > 結果: ❓ 削除されませんでした。")
except Exception as e:
print(f" > エラー: {an_id} の処理中に予期せぬエラーが発生しました。\n{e}")
print(" > 次のIDの処理へ進みます。")
finally:
print("-" * 20)
print("\nすべての処理が完了しました。")
input("Enterキーを押して終了します。")
参考
ただしこの方法は、会話idを1つ1つ確認する必要があり、手間がかかる(全idを取得するような方法はどうやらなさそう)。
結論
履歴の保存はオフにすることが推奨される。
そしてなるべくならResponses APIは使わない。
作成日時2025-06-27 20:11
TagRaspberry Pi
はじめに
ここではRaspberry Piの初期設定を行い、SSHで外部端末から接続するまでの手順を書きます。
前提は、ディスプレイ、キーボード、マウスがない場合です。
つまり、Raspberry Piの本体を買って、USBケーブルと電源、SDカードと、設定するPCがあるだけの状態を想定しています。
💡【警告】この情報を利用したことによって生じた損害について、私は一切の責任を負いません。全て自己責任で行ってください。
OSインストール
まず、Raspberry PiのOSを用意します。色んなOSが使えるのですが、基本的には「Raspberry Pi OS」というのを使います。
以前に比べて簡単になり、WindowsやMacなどで最新のOSをダウンロードしてそのままSDカードにインストールできるようになりました。
以下からお使いのOS用のソフト「Raspberry Pi Imager」をダウンロードします。
PCでダウンロードしたソフトを立ち上げ、「デバイス」「OS」「ストレージ」を選択し、OSをSDカードにインストールします。
デバイスは手元のRaspberry Piを選びます。OSはRaspberry Pi OS (64-bit)を選べばいいでしょう。ストレージはインストールするSDカードを選びます。
「次へ」を押すと以下のような画面が出ます。
ここで「設定を編集する」を選びます。
そうしたら以下のような設定が行えます。これは本来、Raspberry Piを立ち上げて初期設定を行う内容ですが、予めSDカードにこれら情報も書き込むことで、ディスプレイなどがなくても初期設定が完了できる裏技です。この設定をしないと、ディスプレイなどが必要になります。
ホスト名は内部ネットワークで接続するためのものです。
ユーザー名とパスワードは今後も使うので控えておいてください。
Wi-Fiは後から変更するのが難しくなったようです。今現在設定をしている場所(自宅など)で普段使う、インターネットに繋がるWi-Fiルーターの設定をしてください。国は必ずJPにしてください。電波法関連のようです。
ロケール設定は日本のにしてください。
次に、サービスのタブでSSHを有効にしてください。
公開鍵認証がよりセキュアですが、ここではパスワード認証とします。
その後、設定を「保存」し、「はい」で進め、警告も最終確認して「はい」で進めます。
書き込みが始まりますので、終わるまで待ちます。それなりに時間がかかります。
書き込みが終了したらPCからSDカードを取り出します。
SSHで接続
OSを書き込んだSDカードをRaspberry PiのSDカードスロットに入れます。
USBケーブルをRaspberry Piに繋ぎ、USB ACアダプタに繋いで電源を入れます。
💡Raspberry Pi 4以上は電源の推奨要求が高いです。電流が3A、5だと5Aです。確実に電圧降下するので、電圧も5.1Vなど高めに出る物が望ましいと思います。純正品がベターでしょう。
電源を入れて、少し時間が経ったら(立ち上がるのに時間がかかる)、PCなどの外部端末からSSHで繋ぎましょう(外部端末はRaspberry Piと同じネットワークに繋いでください)。
もしRaspberry PiのIPアドレスが分かるならそのIPアドレスで、分からないなら先に設定したホスト名で繋ぎます。
bash
# コマンドの例(ユーザー名が「pi」でホスト名が「raspberrypi.local」の場合)
ssh pi@raspberrypi.local
# 初回はこんな感じで尋ねられると思うので「yes」
Are you sure you want to continue connecting (yes/no/[fingerprint])?
# 設定したパスワードを入力
pi@raspberrypi.local's password:
このような表示なったら成功です!
外部端末からRaspberry Piに接続できています。
あとは好きなようにソフトを入れたりして楽しんでください。
家の外から繋ぐ
SSHで家の外からでもアクセスできるようにします。
まず、自分の家のIPアドレスを確認します。
あなたのIPアドレス(IPv4)で表示されるIPv4のIPアドレスが自分のグローバルなIPアドレスです。
bash
ssh pi@ここにグローバルIPアドレス
つまり、このようなコマンドで接続します。
しかし、ほとんどの場合、接続が失敗すると思います。
それは、外(インターネット側)と自宅のRaspberry Piの間にルーターがあるためです。
そこで、ルーターに接続を通すための穴(ポート)を開ける必要があります。
通常SSHは22番ポートを使いますが(上記のコマンドでも22番ポート)、ルーターの22番ポートを開放するとセキュリティ的に良くないです。
そこで、インターネット側は別のポートを開放し、ルーター内部で22番ポートにフォワーディングするのが望ましいです。
いずれにしろ、ルーターの設定で、ポートを開放してSSHが通るようにしてください。
上記は一例です。この例では、外部に対しては8022番ポートを開放し、ルーター内部で22番ポートに繋いでいます。
LAN側の向け先IPアドレスをRaspberry PiのローカルIPアドレスにしてください。
お使いのルーターのマニュアルをご確認の上、セキュリティに十分配慮して設定してください。
bash
ssh -p 8022 pi@ここにグローバルIPアドレス
正しく設定できれば、上のようなコマンドで、出先から自宅のRaspberry Piに接続できるはずです。
終わりに
これで家の外からもRaspberry Piに接続できるようになりました。
iPhoneなどスマートフォンからでも接続できるので、Raspberry PiにGemini CLIなどをインストールすれば、出先でもVibe Codingできるでしょう。
Enjoy!