TL;DR
- Claude Code の
ANTHROPIC_API_KEYを OpenRouter 経由に向けることで、無料枠モデルを LLM バックエンドとして利用できる - Qwen3-235B-A22B (無料枠) は補完・リファクタ・テスト生成の大半をカバーできる性能を持つ
- 7日間の実運用でかかった LLM コストは $0.00(OpenRouter Free Tier 範囲内)
- ただし rate limit・コンテキスト上限・ストリーミング挙動の違いに注意が必要
背景
Claude Code は強力な AI コーディング支援 CLI だが、バックエンドに Anthropic の有料 API を使うとトークン消費がかさむ。長い codebase を継続的に読ませると、1 日あたり数ドルになることも珍しくない。
一方 OpenRouter は複数の LLM プロバイダをまとめて叩ける API ゲートウェイで、各モデルの :free バリアントを無料で提供している。Claude Code はエンドポイントを差し替えられるので、この 2 つを組み合わせることで コスト $0 の AI コーディング環境 を構築できる。
本記事では実際に 7 日間この構成で開発作業を行い、何が動いて何が動かなかったかを報告する。
構成の仕組み
Claude Code のエンドポイント差し替え
Claude Code は内部で anthropic Node.js SDK を使って API を叩いている。SDK は以下の環境変数でエンドポイントを切り替えられる。
export ANTHROPIC_BASE_URL="https://openrouter.ai/api/v1"
export ANTHROPIC_API_KEY="sk-or-v1-xxxxxxxxxx" # OpenRouter の API キー
ANTHROPIC_BASE_URL を差し替えると、Claude Code はそのまま OpenRouter のエンドポイントにリクエストを投げる。OpenRouter 側は Anthropic 互換の /v1/messages エンドポイントを実装しているため、SDK のリクエスト形式がほぼそのまま通る。
使用するモデルの指定
Claude Code がデフォルトで使おうとするモデル名(claude-opus-4-5 など)は OpenRouter には存在しない。~/.claude/settings.json または環境変数 ANTHROPIC_MODEL でモデルを上書きする。
export ANTHROPIC_MODEL="qwen/qwen3-235b-a22b:free"
2025〜2026 年時点で OpenRouter の :free バリアントとして提供されているモデルのうち、コーディング用途で実用的なものを下表に示す。
| モデル | コンテキスト | コーディング評価 | 備考 |
|---|---|---|---|
qwen/qwen3-235b-a22b:free |
32k | ★★★★☆ | 推論品質が高く補完に強い |
google/gemini-2.0-flash-exp:free |
1M | ★★★★☆ | 長大コンテキストが武器 |
meta-llama/llama-4-maverick:free |
128k | ★★★☆☆ | 英語コードは安定 |
microsoft/phi-4:free |
16k | ★★★☆☆ | 軽量・低レイテンシ |
deepseek/deepseek-r1:free |
64k | ★★★★☆ | 推論系タスクに強い |
⚠️
:freeモデルの提供状況は変動する。https://openrouter.ai/modelsで最新の無料モデル一覧を確認すること。
セットアップ手順
1. OpenRouter のアカウント作成
openrouter.ai でアカウントを作成し、API キーを発行する。クレジットカード登録なしで :free モデルのみ利用可能。
2. 環境変数の設定
# ~/.zshrc または ~/.bashrc に追記
export ANTHROPIC_BASE_URL="https://openrouter.ai/api/v1"
export ANTHROPIC_API_KEY="sk-or-v1-<your-key>"
export ANTHROPIC_MODEL="qwen/qwen3-235b-a22b:free"
source ~/.zshrc
3. Claude Code のインストール(未導入の場合)
npm install -g @anthropic-ai/claude-code
4. 動作確認
claude --version
claude "hello, what model are you using?"
レスポンスに Qwen3 の特徴的な出力パターン(<think> タグ付き推論)が見えれば成功。
7日間の実運用レポート
Day 1-2: 基本補完・コードレビュー
Rust の axum を使った Web API の実装補助。関数シグネチャを見せてリファクタを依頼するタスクでは Qwen3-235B はほぼ期待通りの品質 を出した。
入力例:
"この handler を Result<Json<Res>, AppError> 形式に統一して"
出力: 適切なエラー型への変換 + ? 演算子の整合 → 品質問題なし
Day 3: テスト生成
既存の関数に対して #[tokio::test] 形式のユニットテストを生成させた。
-
assert_eq!を使った境界値テストは概ね正確 - モック生成(
mockallクレート)は Rust 固有のマクロ構文を少し誤ることがあった(2/5 件要修正)
Day 4-5: ドキュメント生成・型補完
TypeScript の複雑な generics 周りで ANTHROPIC_MODEL を deepseek/deepseek-r1:free に切り替えて試した。DeepSeek R1 の推論プロセスが型エラーの原因特定に役立つ場面があった。
// こういう型エラーの説明・修正提案
type ExtractPromise<T> = T extends Promise<infer U> ? U : T;
Day 6: rate limit の壁
:free モデルには リクエスト数の上限 がある。Qwen3-235B は 1 分間に約 10〜20 リクエスト程度が上限(2026年5月時点)。連続してプロンプトを投げる操作(大きなファイルを一度に渡す等)では 429 Too Many Requests が返ることがあった。
対処法:
# リトライ間隔を設けるシェル関数
claude_safe() {
local max_retries=3
local delay=30
for i in $(seq 1 $max_retries); do
claude "$@" && return 0
echo "Rate limited. Waiting ${delay}s... (attempt $i/$max_retries)"
sleep $delay
done
echo "Failed after $max_retries attempts"
return 1
}
Day 7: コンテキスト長の問題
Rust の中規模プロジェクト(ファイル数 40、合計 8,000 行程度)全体を /add で読み込ませると、32k トークン制限に当たる。
-
gemini-2.0-flash-exp:freeは 1M コンテキストを謳っており、大規模ファイル読み込みには有利 - ただし Gemini Flash の
:freeは別の rate limit(1分3リクエスト程度)が厳しい
実用的な運用パターン:タスクの性質でモデルを使い分ける
# 関数単位の補完・リファクタ → Qwen3(品質優先)
export ANTHROPIC_MODEL="qwen/qwen3-235b-a22b:free"
# 大きいコンテキストを渡す必要がある場面 → Gemini Flash
export ANTHROPIC_MODEL="google/gemini-2.0-flash-exp:free"
# 推論・型エラー分析 → DeepSeek R1
export ANTHROPIC_MODEL="deepseek/deepseek-r1:free"
注意点・既知の問題
ストリーミングの挙動差異
OpenRouter を経由すると、モデルによってはストリーミングレスポンスのデルタ形式が微妙に異なる場合がある。Claude Code が途中でハングしたように見えるときは、実際には待機中のことが多い。30 秒ほど待つと完了することがある。
<think> タグのノイズ
Qwen3 や DeepSeek R1 は推論プロセスを <think>...</think> タグで出力する。Claude Code の UI 上にそのまま表示されることがあり、出力が長く見える。最終的なコード提案には影響しないが、視覚的にノイズになる。
モデル側の設定で思考を無効化したい場合は、システムプロンプト側に /no_think を渡す(Qwen3 対応)か、OpenRouter のリクエストパラメータに provider: { parameters: { enable_thinking: false } } を指定する。ただし Claude Code のリクエストを直接カスタマイズする口は限られるため、現状は割り切って使う方が現実的。
function calling / tool use の互換性
Claude Code は内部で tool_use 系のコンテンツブロックを使う。:free モデルの中には tool use に完全対応していないものもある。Qwen3-235B と Gemini Flash は対応済みだが、他モデルで挙動が不安定な場合はこの点を疑う。
コスト比較(参考)
7日間で実行したプロンプト数は概算で約 400 件。同等の作業を Anthropic API 直接(Claude Sonnet 系)で行った場合の試算:
| 項目 | OpenRouter :free | Anthropic API 直接 (参考) |
|---|---|---|
| Input tokens (推定 400k) | $0 | ~$1.20 |
| Output tokens (推定 80k) | $0 | ~$1.20 |
| 7日間合計 | $0 | ~$2.40 |
月換算(稼働日 20日)で換算すると、Claude Sonnet 直接比で月 $6〜10 程度の節約になる計算。「劇的に安くなった」というより、無料で始めて品質に満足したら有料モデルに移行する判断基準を得られる という使い方が合っている。
まとめ
| 観点 | 評価 |
|---|---|
| セットアップのシンプルさ | 環境変数 2 本だけ → ★★★★★ |
| Qwen3-235B のコーディング品質 | 日常タスクは十分 → ★★★★☆ |
| rate limit | 個人開発なら許容範囲 → ★★★☆☆ |
| コンテキスト長 | モデルを使い分ければ対処可 → ★★★☆☆ |
| コスト | $0 → ★★★★★ |
Claude Code の有料 API に踏み切る前に、まず :free モデルで 1 週間試すことを強く勧める。特に Qwen3-235B はコーディング支援として現時点で最も実用的な無料選択肢 の一つだと感じた。
参考リンク
- OpenRouter 公式ドキュメント
- OpenRouter モデル一覧(:free フィルタ可)
- Claude Code ドキュメント — Environment Variables
- Qwen3 技術レポート(Qwen公式 HuggingFace)
- DeepSeek R1 論文 (arXiv:2501.12948)
✍️ 本記事の著者: 合同会社ジモラボ
ジモラボは、八王子を拠点に AI を活用した SaaS を多数開発しています。本記事の技術検証もそうした開発過程の副産物です。
- 🌐 公式サイト: https://locallab.jp
- 🔍 AI SEO 最適化 SaaS: lookupai.jp
- 📺 YouTube: @locallab_llc
- ✉️ お問い合わせ: info@locallab.jp
興味を持っていただけたら、ぜひ各 SNS のフォローもお願いします!