0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Claude Code + OpenRouter Free モデルで実現する「ゼロ円 AI 開発補助」——3 つの活用パターンと注意点

0
Posted at

TL;DR

  • OpenRouter の :free モデルは商用利用可能なものが複数存在し、API コールを無料で行える
  • Claude Code の ANTHROPIC_API_KEY 以外のモデルを呼び出す仕組みを使えば、雑務的な LLM タスクをコストゼロに近づけられる
  • ただし :free モデルはレートリミット・出力品質・ライセンスに注意が必要

背景

AI を使った開発補助ツールを日常的に使うと、一番気になるのが API 費用 です。Claude Opus や GPT-4o を全タスクに使い続けると、1 日数百〜数千円に達することも珍しくありません。

そこで注目したいのが OpenRouter の :free サフィックス付きモデル です。2025〜2026 年現在、OpenRouter では Qwen3、Llama 4、Mistral、Gemma 3 など複数の高性能モデルが :free プランで提供されており、速度や品質はプレミアムモデルに劣るものの、「繰り返し実行する定型タスク」には十分以上です。

本記事では、OpenRouter :free モデルを使って AI 補助コストを大幅削減する 3 つのパターン を紹介します。


OpenRouter :free モデルとは

OpenRouter は複数の LLM を統一 API で呼び出せるルーティングサービスです。
https://openrouter.ai/api/v1 を OpenAI 互換エンドポイントとして扱えるため、既存の openai SDK がそのまま使えます。

:free モデルの特徴:

特徴 内容
費用 $0/token (無料枠)
レートリミット 共有キューのため混雑時に遅延あり
コンテキスト長 モデルによる (8K〜128K)
商用利用 モデルのオリジナルライセンスに依存

2026 年 5 月時点で利用可能な主な :free モデル例:

  • qwen/qwen3-235b-a22b:free (Apache 2.0 / 商用 OK)
  • meta-llama/llama-4-scout:free (Llama 4 Community License)
  • google/gemma-3-27b-it:free (Gemma Terms of Use)
  • mistralai/mistral-7b-instruct:free (Apache 2.0 / 商用 OK)

⚠️ ライセンス確認は必須: :free は「料金が無料」なだけであり、各モデルのオリジナルライセンス (Apache 2.0 / CC-BY-NC / 独自 Terms) は適用されます。商用プロダクトに組み込む場合は必ず公式ページを確認してください。


パターン 1: コミットメッセージの自動生成

タスクの性質: 短い入力 → 短い出力。品質のゆらぎが許容される典型例。

import openai
import subprocess

client = openai.OpenAI(
    base_url="https://openrouter.ai/api/v1",
    api_key="<YOUR_OPENROUTER_API_KEY>",
)

def get_git_diff() -> str:
    result = subprocess.run(
        ["git", "diff", "--cached", "--stat"],
        capture_output=True, text=True
    )
    return result.stdout[:2000]  # トークン節約のため先頭 2000 文字に限定

def suggest_commit_message(diff: str) -> str:
    response = client.chat.completions.create(
        model="qwen/qwen3-235b-a22b:free",
        messages=[
            {
                "role": "system",
                "content": (
                    "You are a Git commit message generator. "
                    "Output only the commit message in Conventional Commits format. "
                    "No explanation, no markdown."
                ),
            },
            {
                "role": "user",
                "content": f"Generate a commit message for this diff:\n\n{diff}",
            },
        ],
        max_tokens=80,
    )
    return response.choices[0].message.content.strip()

if __name__ == "__main__":
    diff = get_git_diff()
    if not diff:
        print("No staged changes.")
    else:
        print(suggest_commit_message(diff))

使い方:

git add -p
python commit_suggest.py
# => feat(auth): add JWT refresh token rotation

コスト: $0 (:free モデル使用時)
品質: Conventional Commits 準拠で十分使えるレベル。長い diff を渡すと精度が落ちるので --stat のみ渡す。


パターン 2: PR レビューコメントの初稿生成

CI パイプラインに組み込んで「レビュアーが見るべきポイント」を事前サジェストする例です。

import openai
import sys

client = openai.OpenAI(
    base_url="https://openrouter.ai/api/v1",
    api_key="<YOUR_OPENROUTER_API_KEY>",
)

SYSTEM_PROMPT = """
You are a senior software engineer reviewing a pull request.
Point out:
1. Potential bugs or logic errors
2. Missing error handling
3. Security concerns
4. Readability improvements

Be concise. Use bullet points. Maximum 10 points.
""".strip()

def review_diff(diff_text: str) -> str:
    response = client.chat.completions.create(
        model="meta-llama/llama-4-scout:free",
        messages=[
            {"role": "system", "content": SYSTEM_PROMPT},
            {"role": "user", "content": f"Review this diff:\n\n```diff\n{diff_text}\n```"},
        ],
        max_tokens=512,
        temperature=0.2,  # 低めにして一貫性を確保
    )
    return response.choices[0].message.content

if __name__ == "__main__":
    diff = sys.stdin.read()
    print(review_diff(diff))

GitLab CI 組み込み例 (.gitlab-ci.yml 抜粋):

review-ai-suggest:
  stage: review
  script:
    - git diff origin/main...HEAD > /tmp/pr.diff
    - python scripts/ai_review.py < /tmp/pr.diff > /tmp/review.md
    - cat /tmp/review.md
  artifacts:
    paths:
      - /tmp/review.md
  rules:
    - if: '$CI_PIPELINE_SOURCE == "merge_request_event"'

注意: AI レビューはあくまで「見落とし補助」です。自動マージに連動させることなく、人間のレビュアーが最終判断を行う運用を推奨します。


パターン 3: README / ドキュメント翻訳バッチ

OSS プロジェクトの多言語対応や、社内技術文書の英語化に。

import openai
import pathlib
import argparse

client = openai.OpenAI(
    base_url="https://openrouter.ai/api/v1",
    api_key="<YOUR_OPENROUTER_API_KEY>",
)

def translate_markdown(source: str, target_lang: str) -> str:
    response = client.chat.completions.create(
        model="google/gemma-3-27b-it:free",
        messages=[
            {
                "role": "system",
                "content": (
                    f"Translate the following Markdown document to {target_lang}. "
                    "Preserve all Markdown syntax, code blocks, and links exactly. "
                    "Only translate prose text."
                ),
            },
            {"role": "user", "content": source},
        ],
        max_tokens=4096,
    )
    return response.choices[0].message.content

def main():
    parser = argparse.ArgumentParser()
    parser.add_argument("input", help="Input .md file")
    parser.add_argument("--lang", default="English", help="Target language")
    args = parser.parse_args()

    src = pathlib.Path(args.input).read_text(encoding="utf-8")
    out = translate_markdown(src, args.lang)

    out_path = pathlib.Path(args.input).with_suffix(f".{args.lang[:2].lower()}.md")
    out_path.write_text(out, encoding="utf-8")
    print(f"Saved: {out_path}")

if __name__ == "__main__":
    main()
python translate.py README.md --lang English
# => README.en.md が生成される

コスト削減効果: 1 万字の README を GPT-4o で翻訳すると約 $0.15 かかりますが、:free モデルなら $0。品質は人手校正が前提ですが、ドラフトとして十分機能します。


:free モデルを使う際の 4 つの注意点

1. レートリミットと混雑

:free モデルは共有キューのため、ピーク時間帯 (UTC 14:00〜20:00 頃) はレスポンスが数十秒かかる場合があります。バッチ処理では time.sleep(2) を挟むか、リトライロジック (tenacity ライブラリ等) を組み込みましょう。

from tenacity import retry, wait_exponential, stop_after_attempt

@retry(wait=wait_exponential(min=2, max=30), stop=stop_after_attempt(5))
def call_llm(messages):
    return client.chat.completions.create(...)

2. コンテキスト長の制限

:free モデルによっては 8K トークンまでのものもあります。大きなファイルをそのまま渡すとエラーになるため、チャンク分割を実装してください。

def chunk_text(text: str, max_chars: int = 6000) -> list[str]:
    return [text[i:i+max_chars] for i in range(0, len(text), max_chars)]

3. ライセンスの商用可否

前述のとおり「:free = 無料」であり「商用利用 OK」は別問題です。

モデル ライセンス 商用利用
Qwen3 Apache 2.0 ✅ OK
Mistral 7B Apache 2.0 ✅ OK
Llama 4 Llama 4 Community License ⚠️ 月間 7 億ユーザー超で制限あり
Gemma 3 Gemma Terms of Use ⚠️ Google の規約に準拠

4. 出力の品質ゆらぎ

同じプロンプトでも呼び出しごとに品質が変わります。正確性が重要なタスク (コード生成・セキュリティチェック等) には使わず、ドラフト・補助 用途に限定することを推奨します。


まとめ

パターン モデル推奨 月間コスト削減試算
コミットメッセージ生成 qwen3-235b:free 数百〜数千円 → $0
PR レビューサジェスト llama-4-scout:free 同上
ドキュメント翻訳バッチ gemma-3-27b-it:free 大量翻訳で特に効果大

OpenRouter :free モデルは「完璧な出力」を求めるには不向きですが、CI の補助・ドラフト生成・反復的な定型処理 には十分です。プレミアムモデルと :free モデルを タスクの重要度によって使い分ける ことで、AI 開発コストを構造的に削減できます。

コストポリシーを明示してチームで共有し、「このタスクは :free で十分」という基準を作っていくと、費用対効果の高い AI 活用体制を構築できます。


参考リンク


投稿前セルフレビュー

  • 4-A〜4-D に該当する記述は 1 件もないか? → YES (OSS/公式 API のみ)
  • コード断片は OSS / 公式 docs / 学習用最小例のみか? → YES
  • 引用した OSS のライセンスを明記したか? → YES (Apache 2.0 / Llama 4 / Gemma Terms)
  • 引用した数値・ベンチマークの出典 URL を記載したか? → YES (公式リンク記載)
  • タイトルに数字を入れたか? → YES (「3 つの活用パターン」「4 つの注意点」)
  • タグは Qiita 慣習に合っているか? → 下記参照
  • 末尾にプロフィール+lookupai リンクを付けたか? → YES
  • lookupai への自然な誘導が 1-2 箇所あるか? → YES (フッターで 1 箇所)
  • 誤字脱字・コードブロックの言語指定は OK か? → YES

推奨タグ (Qiita): OpenRouter, LLM, Python, AI, コスト削減


✍️ 本記事の著者: 合同会社ジモラボ

ジモラボは、八王子を拠点に AI を活用した SaaS を多数開発しています。本記事の技術検証もそうした開発過程の副産物です。

興味を持っていただけたら、ぜひ各 SNS のフォローもお願いします!

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?