このフレーズの意味
人々は「ローカル LLM OpenAI API」という言葉を、関連する 2 つのことに使用しています。1 つは、ラップトップやホームサーバー上で自分で実行し、ローカルポートでリッスンし、OpenAI チャット形式を話す言語モデルです。2 つ目は、その背後のモデルを交換できるように、アプリをその形式に対して記述する習慣です。
この形式は単純な契約です。アプリは model 名と、システム、ユーザー、アシスタントの役割を持つ messages のリストを含む JSON 本文を送信します。サーバーは生成されたメッセージを含む JSON オブジェクト、またはストリーミングをリクエストした場合、小さなチャンクのストリームで応答します。Python と JavaScript の公式 SDK はこれをラップし、ベース URL をオーバーライドできるため、これが全体のコツです。
多くのローカルツールはこのAPI仕様を公開しています。Ollama、LM Studio、llama.cppサーバー、vLLMはそれぞれOpenAIスタイルのエンドポイントを提供しています。ホスト型サービスも同様です。そのため、同じ20行のクライアントコードでどちらにも接続できます。本サイトのエンドポイントもその一種です。POST /v1/chat/completionsとGET /v1/modelsを受け付け、https://api.onekeyllmapi.com/v1でアクセスできます。
ローカルとホスト型の比較
どちらが一般的に優れているわけではありません。コントロールと労力のトレードオフです。この表は、特定の製品ではなく、カテゴリ全体に適用される違いに焦点を当てています。
| 質問 | ローカルランナー | ホスト型 OpenAI 風 API |
|---|---|---|
| プロンプトの宛先 | あなたのマシン上に留まる | HTTPS を介してプロバイダーに接続 |
| ハードウェア | GPU または CPU とメモリを提供 | クライアント側には不要 |
| モデルサイズ | あなたのメモリによって制限されます | プロバイダーが提供するもの |
| コストモデル | ハードウェアと電力 | トークンあたり、前払いクレジットから |
| 可用性 | マシンが稼働している限り | 常時稼働サーバー、共有制限 |
| セットアップ | インストール、ウェイトのダウンロード、チューニング | キーの作成、Base URL の設定 |
データが制御するマシンから決して離れてはならない場合、ローカルが優位でホスト型は適切なツールではありません。ハードウェアで収まらないより大きなモデルが必要、または多くの場所からアクセス可能なボットが必要な場合、ホスト型が優位です。一般的なセットアップでは両方を使用し、タスクごとに選択します。
クライアントをローカルからホスト型に切り替える
コードがローカルランナーと通信している場合、切り替えには3つの値の変更が必要です。メッセージの構築方法やストリーミングチャンクの読み込み方など、それ以外はすべて同じです。
- ベース URL。 ローカルアドレスの代わりに
https://api.onekeyllmapi.com/v1を使用します。 - API キー。 ローカルサーバーはキーを無視することがよくあります。ホスト版では
Authorization: Bearer <key>として必要であり、SDK が代わりに送信します。 - モデル ID。 ローカルの名前は取得したものです。ここでは ID が
uncensoredです。
これを柔軟に保つための簡潔な方法は、3つすべてを環境変数から読み込むことです。そうすれば、1つのファイルで両方の環境で動作します。
import os
from openai import OpenAI
client = OpenAI(
base_url=os.environ.get("LLM_BASE_URL", "https://api.onekeyllmapi.com/v1"),
api_key=os.environ.get("LLM_API_KEY", "YOUR_KEY"),
)
MODEL = os.environ.get("LLM_MODEL", "uncensored")
models = client.models.list()
print([m.id for m in models.data])
resp = client.chat.completions.create(
model=MODEL,
messages=[
{"role": "system", "content": "Answer in two sentences."},
{"role": "user", "content": "Why do OpenAI-style endpoints make switching models easy?"},
],
temperature=0.5,
)
print(resp.choices[0].message.content)
コマンドラインからの同じ呼び出しは、クイックスモークテストに役立ちます:
curl https://api.onekeyllmapi.com/v1/chat/completions \
-H "Authorization: Bearer YOUR_KEY" \
-H "Content-Type: application/json" \
-d '{"model": "uncensored", "messages": [{"role": "user", "content": "ping"}], "max_tokens": 20}'
Node.js では、パターンは同じです:
import OpenAI from "openai";
const client = new OpenAI({
baseURL: process.env.LLM_BASE_URL ?? "https://api.onekeyllmapi.com/v1",
apiKey: process.env.LLM_API_KEY,
});
const res = await client.chat.completions.create({
model: process.env.LLM_MODEL ?? "uncensored",
messages: [{ role: "user", content: "Name three uses for JSON mode." }],
});
console.log(res.choices[0].message.content);
OpenAI 互換がカバーするものとしないもの
互換性とは、ワイヤーフォーマットが一致することを意味します。元のサービスが提供するすべての機能が含まれることを約束するものではありません。実際のアプリを移行する前に、ターゲットに対してこれらすべてを確認してください。
この API がサポートする機能
- チャット完了は
POST /v1/chat/completions、モデル一覧はGET /v1/modelsで取得します。 - サーバーサイドイベントによるストリーミング
stream: true、ストリームの最後に使用量が報告されます。 toolsとtool_choiceによるツール呼び出し、ストリーミングtool_calls、およびrole: "tool"メッセージとして結果の送信。response_format: {"type": "json_object"}による JSON モード。- サンプリング制御:temperature、top_p、stop、seed、ペナルティパラメータはそのまま渡されます。
これが行わないこと
- 画像、オーディオ、ビデオの生成はありません。テキストのみです。
- 埋め込みエンドポイントやファインチューニングはありません。アプリがベクトルインデックスを構築する場合は、別の埋め込みソースが必要です。
- 1 つのモデルのみ。このモデルは独立したプロバイダーが運営するオープンウェイトモデルです。大手ベンダーの公式 API ではなく、ベンダー間のルーターでもないので、ID を変更してモデルファミリー間で選択することはできません。
ローカルランナーは逆のケースで異なることもあります:ローカルサーバーは埋め込みエンドポイントを提供したり、複数のモデルをロードしたり、コンテキストサイズを自由に設定できたりします。各ターゲットのドキュメントを読み、アプリが実際に使用する機能の短いリストを保持してください。クイックスタートドキュメント にはリクエストフィールドがすべて記載されています。
コンテキスト、制限、コストの違い
ローカルサーバーから離れると、3 つの数字が変わります。1 つ目はウィンドウです。ローカルランナーのコンテキスト長はメモリに紐づく設定です。ここではプロンプトと完了の両方で共有される 100,000 トークンに固定されており、max_tokens はオプションです。2 つ目は同時実行です。自分のマシンは好きなだけキューに入れることができますが、ここではフルキーで 8 の同時リクエストと 1 分あたり 300 リクエスト、トライアルキーで 2 と 60 が許可されます。3 つ目は請求です。
ホスト利用料は入力トークン100万トークンあたり$0.15、出力トークン100万トークンあたり$0.50で、前払いクレジットから従量課金されます。日次ジョブの例として:サマライザーは1日あたり400件のドキュメントを処理し、各ドキュメントの入力は3,000トークン、出力は300トークンです。入力は 400 x 3,000 = 1,200,000 トークンで、コストは 1.2 x $0.15 = $0.18 です。出力は 400 x 300 = 120,000 トークンで、コストは 0.12 x $0.50 = $0.06 です。1日の合計は$0.24、30日の月は$7.20 です。GPU の稼働コストやカード自体のコストと比較して、判断してください。
制限を超えると、API は HTTP 429 を返し、コードは rate_limited または concurrency です。一時的な過負荷には Retry-After: 5 が追加されます。待機して再試行するリトライロジックを保持してください。失敗または拒否されたリクエストは請求されません。クレジットは期限切れにならないため、アイドル状態の月はコストがかかりません。
ストリーミングリクエストはストリームが終了するまで同時実行スロットを保持するため、読み込みを停止したストリームは閉じてください。チャージは$20から開始します。ティアとボーナスは 料金ページ に記載されています。
スイッチの動作がおかしい場合のデバッグ
移行失敗のほとんどは限られた原因に集約されます。以下の順序で確認してください。
- 404または接続エラー。 ベースURLに
/v1の接尾辞が含まれていないか、余分なパスが含まれている可能性があります。https://api.onekeyllmapi.com/v1を正確に使用してください。 - 認証エラー。 キーが不足しているか、誤ったヘッダーで送信されています。形式は
Authorization: Bearer <key>です。SDKユーザーは環境変数が実際に読み込まれていることを確認してください。 - モデルが見つかりません。 古いローカルモデル名がまだ設定されています。
GET /v1/modelsを呼び出し、リストされているID(uncensored)を使用してください。 - 負荷時の429エラー。 同時リクエストが8件を超えたか、フルキーで1分間に300件のリクエストを超えています。キューまたはセマフォを追加してください。
- パラメータが無視されているようです。 上記の透過的に渡されるフィールドのいずれかであることを確認し、固定の
seedと低い temperature で動作を比較してください。
すべてのレスポンスにはX-Request-Idヘッダーが含まれます。後で問題のある回答を追跡できるよう、自分のリクエストIDの横にログに記録してください。本番環境のトラフィックを運用しており、時間経過に伴う品質を測定したい場合は、サイト記事LLM Observability: Myths vs Factsが次の良い読み物です。レスポンスヘッダーX-Balance-USD、X-RateLimit-Limit-Requests、X-RateLimit-Limit-Concurrencyもキャプチャする価値があります。
コミットメントなしで試す
コードがクリーンに移植できるかどうかをテストする最も安価な方法は、1回実行することです。Google またはメールとパスワードでアカウントを作成し、キーページから$0.50 の無料トライアルクレジットを受け取ってください。ワンクリックで完了し、カードは不要で、1人1回限り、7日間有効です。 API キーページ でキーを取得し、上記の3つの環境変数を設定して既存のテストスイートを実行してください。
テストがパスし、使用量が予算に収まる場合は、カード(Visa、Mastercard、Apple Pay、Google Pay)または暗号資産(TRC20上のUSDT、Base上のUSDC)で$20からチャージしてください。プロンプトはトレーニングに使用されません。このモデルは、法的な成人向け利用においてコンテンツ拒否なしで回答するようにチューニングされていますが、1つの固定ルールがあります:未成年者を含む性的コンテンツは禁止です。
