<?xml version="1.0" encoding="utf-8" ?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
<channel>
<title>LLM APIメモ帳</title>
<link>https://ameblo.jp/apigototeam/</link>
<atom:link href="https://rssblog.ameba.jp/apigototeam/rss20.xml" rel="self" type="application/rss+xml" />
<atom:link rel="hub" href="http://pubsubhubbub.appspot.com" />
<description>APIGOTOチームで働いています。OpenAI互換APIを使って複数のLLMを扱う方法や、つまずきやすい点を実体験ベースでまとめています。APIGOTOはOpenAI・Anthropic・Googleとは関係のない独立したサービスです。</description>
<language>ja</language>
<item>
<title>OpenAI互換APIでbase_urlだけ変えて複数LLMを使う方法</title>
<description>
<![CDATA[ <p>※はじめにお知らせです。私はAPIGOTOチームで働いています。APIGOTOは独立したOpenAI互換APIゲートウェイで、OpenAI・Anthropic・Googleとは関係ありません。この記事ではAPIGOTOを例にしていますが、手順はOpenAI互換のエンドポイント（Ollama、vLLM、LiteLLMなど）ならどれでも同じです。</p><p>「Claude系もGPT系もGemini系も試したいけど、SDKを3つ入れて書き分けるのは面倒…」という方向けに、OpenAI互換APIを使って<strong>接続先（base_url）だけ変えて</strong>複数のモデルを呼ぶ方法をまとめます。</p><h2>仕組み：base_urlを差し替えるだけ</h2><p>PythonのOpenAI SDK（<code>openai</code>パッケージ）には <code>base_url</code> という引数があります。OpenAIと同じ形式の <code>/v1/chat/completions</code> を提供しているサーバーなら、コードはそのままで接続先だけ切り替えられます。</p><pre><code class="language-bash">pip install openai</code></pre><h2>最小のサンプル</h2><pre><code class="language-python">import osfrom openai import OpenAIclient = OpenAI(    base_url="https://api.china-aiapi.com/v1",  # Ollamaなら http://localhost:11434/v1    api_key=os.environ["APIGOTO_API_KEY"],    timeout=30.0,    # 秒。デフォルトは10分なので短めに    max_retries=2,   # 接続エラー・429・5xxなどを自動で再試行（デフォルト2回）)resp = client.chat.completions.create(    model="MODEL_ID",    messages=[{"role": "user", "content": "base_urlとは何か、一文で説明して"}],)print(resp.choices[0].message.content)</code></pre><p><code>MODEL_ID</code> には、APIGOTOのダッシュボードに表示されているモデルIDをそのまま入れてください（他のサービスなら <code>GET /v1/models</code> の一覧から）。ネットで見かけた名前を推測で入れると400や404になります。</p><h2>複数モデルを順番に試す（簡易フォールバック）</h2><p>SDKの再試行は<strong>同じモデル</strong>へのやり直しです。別のモデルに切り替えたい場合は、ループで書けます。</p><pre><code class="language-python">from openai import APIConnectionError, RateLimitError, InternalServerErrorMODELS = ["MODEL_ID_MAIN", "MODEL_ID_BACKUP"]  # ダッシュボードのIDを優先順にdef ask(prompt):    last_err = None    for m in MODELS:        try:            r = client.chat.completions.create(                model=m, messages=[{"role": "user", "content": prompt}]            )            return m, r.choices[0].message.content        except (APIConnectionError, RateLimitError, InternalServerError) as e:            last_err = e  # タイムアウトもAPIConnectionErrorの一種    raise last_errmodel, text = ask("こんにちは")print(model, text)</code></pre><h2>つまずきやすいポイント</h2><ul><li><strong>400/401では切り替えない</strong>：リクエストの誤りやキーの間違いは、モデルを変えても直りません。一時的なエラーだけフォールバック対象にします。</li><li><strong>再試行の重ねすぎに注意</strong>：ゲートウェイ側でも再試行していると（APIGOTOは自動フェイルオーバーで最大3回まで再試行します）、SDKの再試行やアプリ側のループと重なって待ち時間が長くなります。どの層で再試行するかを決めておくと安心です。</li><li><strong>機能はモデルによって違う</strong>：同じAPI形式でも、ツール呼び出し（function calling）やJSON出力への対応はモデルごとに異なります。使う機能は各モデルで一度テストしましょう。</li><li><strong>どのモデルが答えたかを記録する</strong>：ログに残しておかないと、メインのモデルが頻繁に失敗していても気づけません。</li></ul><h2>まとめ</h2><ul><li><code>base_url</code> を差し替えるだけで、同じコードのまま複数のLLMを呼べる</li><li><code>timeout</code> は明示的に短めに、<code>max_retries</code> は他の層の再試行とのバランスで決める</li><li>別モデルへの切り替えは、一時的なエラーのときだけ行う</li></ul><p>例に使ったAPIGOTOについて補足すると、Claude・GPT・Gemini系のモデルを1つのOpenAI互換 <code>base_url</code> で使えて、自動フェイルオーバー（最大3回再試行）、リクエストごとのログ、BYOK（自分のキーの持ち込み）、従量課金に対応しています。ドキュメントは英語と中国語です。詳しくは <a href="https://www.china-aiapi.com/grokbot">www.china-aiapi.com</a> をご覧ください。</p><hr><p><strong>お問い合わせ</strong><br>運営会社：聚元创新（深圳）科技有限公司（Juyuan Innovation (Shenzhen) Technology Co., Ltd.）<br>メール：postmaster@apigoto.com</p>
]]>
</description>
<link>https://ameblo.jp/apigototeam/entry-12981928693.html</link>
<pubDate>Sun, 18 Oct 2026 14:55:43 +0900</pubDate>
</item>
</channel>
</rss>
