Kimi Code APIのURL:OpenAI互換クライアント用のベースURL設定
このサービスに必要なKimi Code APIのURLは https://api.kimicode.cc/v1 です。これをOpenAI互換クライアントのベースURLとして設定し、キーを追加して、モデルIDに uncensored を使用してください。
更新

URL と各部分の意味
kimi code api urlをお探しの場合は、Kimi自身のサービスのアドレスをお探しかもしれません。それについてはベンダーのドキュメントを使用してください(当サイトが保証するものではないため)。このサイトは異なるものを提供しています:独立したプロバイダーが運営する、単一のオープンウェイトモデルの前面にあるホスト型OpenAI互換APIです。そのアドレスは次の通りです:
https://api.kimicode.cc/v1
その文字列が ベースURL です。これはすべてのリクエストで共有される部分です。SDKが残りの部分を付加します。chat.completions.create を呼び出すと、OpenAIライブラリは https://api.kimicode.cc/v1/chat/completions へPOSTを送信します。モデルリストは https://api.kimicode.cc/v1/models にあり、GETを使用します。
このAPIが提供するメソッドは次の2つだけです:POST /v1/chat/completions と GET /v1/models。画像、音声、または埋め込みエンドポイントをお探しの場合は、それらはここには存在しません。これはテキスト専用APIです。
重要なのは3つの設定だけで、既存のOpenAIコードの他の部分は変更する必要はありません:ベースURL、APIキー、およびモデルID uncensored です。
base URL が唯一のスイッチである理由
OpenAIスタイルのクライアントは1つのアイデアに基づいて構築されています:リクエスト形式は固定されており、ホストは設定です。ライブラリには元のベンダーを指すデフォルトのホストがあります。これを別のベースURLに置き換えると、同じリクエストボディが別の場所へ送信されます。プロンプト、メッセージ配列、またはレスポンスの解析に変更は必要ありません。
そのため、他の OpenAI 互換プロバイダーからの移行は通常、3つの編集で完了します:base URL、API キー、およびモデル名です。choices、message、finish_reason、usageなどのレスポンスフィールドは同じ名前であるため、それらを読み取るコードはそのまま機能し続けます。
これは、人々が遭遇する奇妙なエラーの説明にもなります。「サーバーURL」を求められた場合にホストのみを貼り付けると、パスが不足します。「完全なエンドポイント」を求められた場合にベースURLを貼り付けると、リクエストが誤った場所へ送信されます。設定画面が不明瞭な場合は、まずベースURLを試して返されるステータスコードを確認してください。ドキュメントのクイックスタートでは、さらに1つの例を交えて同じ移行手順を説明しています。
編集できないツール用の環境変数
多くのコマンドラインツールやフレームワークは、コンストラクタをいじることなく OpenAI クライアントを構築します。これらは通常標準の環境変数を読み取るため、それらを設定するだけで十分です:
export OPENAI_BASE_URL="https://api.kimicode.cc/v1"
export OPENAI_API_KEY="YOUR_KEY"
一部の古いツールは代わりに OPENAI_API_BASE を探すため、1 つ目の名前を無視する場合は 2 つ目も試してください。設定後、別のターミナルウィンドウで設定された変数は共有されないため、同じシェルセッション内でツールを起動してください。
ツールにはモデル名が必要です。ホストされたモデルがハードコードされている場合は、それを変更するフラグまたは設定行を探し、uncensored を使用してください。変更できない場合、そのツールは適さないため、上記のような小さなスクリプトの方が良い方法です。
まずキーを取得
リクエストは Authorization: Bearer YOUR_KEY 形式のヘッダーで認証されます。すべての公式SDKは、api_key 引数からこのヘッダーを生成します。Googleまたはメールアドレスとパスワードでログイン後にAPI キーを作成できます。
新規アカウントは、API キーページ でワンクリックで $0.50 のトライアルクレジットを取得できます。カードは不要で、7 日間有効です。これは以下のすべての例を何度も実行するのに十分です。トライアルキーは同時 2 リクエスト、1 分あたり 60 リクエストまで許可されるため、例は一度に 1 つずつ実行してください。
キーをソースファイルではなく環境変数に保存してください。公開リポジトリにコミットされたキーは数時間以内に他のユーザーによって発見され使用され、そのキーに紐づくクレジットはあなたのものです。
curl での最初のリクエスト
Curl は、すべてのライブラリを除外するため URL が機能することを確認する最速の方法です。この呼び出しが成功すれば、後で遭遇する問題のすべてはクライアント設定にあります。
export KIMICODE_KEY="YOUR_KEY"
curl https://api.kimicode.cc/v1/models -H "Authorization: Bearer $KIMICODE_KEY"
curl https://api.kimicode.cc/v1/chat/completions -H "Authorization: Bearer $KIMICODE_KEY" -H "Content-Type: application/json" -d '{
"model": "uncensored",
"messages": [
{"role": "user", "content": "Say hello in five words."}
]
}'
最初の呼び出しはモデルリストを返し、そこには uncensored が含まれているはずです。2 番目の呼び出しは標準的なチャット完了オブジェクトを返します。curl -i でレスポンスヘッダーを確認すると、X-Request-Id、X-Balance-USD、X-RateLimit-Limit-Requests、X-RateLimit-Limit-Concurrency が表示されます。特定の呼び出しについて サポート に連絡する場合は、リクエスト ID を保持してください。
OpenAI SDKを使用したPython
pip install openai でライブラリをインストールし、クライアントコンストラクタの 2 つの引数を変更します。
import os
from openai import OpenAI
client = OpenAI(
base_url="https://api.kimicode.cc/v1",
api_key=os.environ["KIMICODE_KEY"],
)
resp = client.chat.completions.create(
model="uncensored",
messages=[
{"role": "system", "content": "You are a concise assistant."},
{"role": "user", "content": "Explain what a base URL is in two sentences."},
],
temperature=0.7,
)
print(resp.choices[0].message.content)
print(resp.usage)
temperature、top_p、stop、seedなどのパラメータや、頻度ペナルティや存在ペナルティはモデルに渡されます。max_tokensの値はオプションです。指定しない場合、100,000トークンのコンテキストウィンドウの残りを、プロンプトと生成結果を合わせて使用できます。
引数を渡さない場合、SDK は 2 つの環境変数も読み取ります:OPENAI_BASE_URL と OPENAI_API_KEY。これは編集できないツールに役立ちます。両方を設定し、ツールを起動すると、そのツールはこの API と通信します。
Node、ストリーミング、JSON モード
Node の設定は Python と同じ構成です。npm install openai でインストールしてください。
import OpenAI from "openai";
const client = new OpenAI({
baseURL: "https://api.kimicode.cc/v1",
apiKey: process.env.KIMICODE_KEY,
});
// Streaming over SSE
const stream = await client.chat.completions.create({
model: "uncensored",
stream: true,
messages: [{ role: "user", content: "Write a four-line poem about routers." }],
});
for await (const chunk of stream) {
process.stdout.write(chunk.choices[0]?.delta?.content ?? "");
}
// JSON mode
const json = await client.chat.completions.create({
model: "uncensored",
response_format: { type: "json_object" },
messages: [
{ role: "system", content: "Reply with a JSON object only." },
{ role: "user", content: "Give me keys name and port for a local dev server." },
],
});
console.log(JSON.parse(json.choices[0].message.content));
ストリーミングはサーバー送信イベントを使用し、使用状況はストリームの終了時に報告されます。ストリーミングリクエストはストリームが終了するまで同時実行スロットを保持するため、ストリームを開いて読み取らないクライアントはスロットをブロックします。JSON モードでは、プロンプトで JSON で回答するようモデルに指示してください。フラグは出力形式を制約しますが、明確な指示がより良いフィールド名を提供します。
ツール呼び出し
ツールは通常の OpenAI の形式を使用します:tools リスト、オプションの tool_choice、および role: "tool" のメッセージとして返されるツール結果です。ストリーミング時は、tool_calls がチャンク全体にわたって分割して届きます。
import json, os
from openai import OpenAI
client = OpenAI(base_url="https://api.kimicode.cc/v1", api_key=os.environ["KIMICODE_KEY"])
tools = [{
"type": "function",
"function": {
"name": "get_port",
"description": "Look up the port of a named local service",
"parameters": {
"type": "object",
"properties": {"service": {"type": "string"}},
"required": ["service"],
},
},
}]
messages = [{"role": "user", "content": "Which port does the api service use?"}]
first = client.chat.completions.create(model="uncensored", messages=messages, tools=tools)
call = first.choices[0].message.tool_calls[0]
messages.append(first.choices[0].message)
messages.append({
"role": "tool",
"tool_call_id": call.id,
"content": json.dumps({"service": "api", "port": 8080}),
})
final = client.chat.completions.create(model="uncensored", messages=messages, tools=tools)
print(final.choices[0].message.content)
モデルからの引数は信頼できない入力として扱ってください。何かを実行する前に検証してください。モデルはツール呼び出しをスキップしたり、誤ったフィールドで呼び出したりする可能性があります(どのモデルでも可能であるため)、ループ内にフォールバックパスを保持してください。
URL が失敗した場合
ほとんどの失敗は短いリストに分類されます。
- 404 Not Found. パスが誤っています。一般的な原因:Base URL が
https://api.kimicode.ccに設定されており/v1が不足している、またはhttps://api.kimicode.cc/v1/chat/completionsに設定されているため、クライアントがパスを 2 回付加している。上記の Base URL を正確に使用してください。 - 401 Unauthorized. キーが不足している、余分なスペースや改行がある、またはヘッダーが Bearer トークンではない。変数の長さを印刷して確認してください。
- コード
rate_limitedの429。1分あたりの上限を超えました:フルキーの場合は300リクエスト、トライアルキーの場合は60リクエストです。 - 429 コード
concurrency. 一度に多すぎるリクエスト:フルキーの場合は 8、トライアルキーの場合は 2。 Retry-After: 5ヘッダー付きの 429。 一時的な過負荷です。5 秒待ってから再試行してください。- リクエストが大きすぎます。 ボディの制限は 8 MB で、プロンプトと完了は 100,000 トークン以内に収まる必要があります。
Retry-After を尊重し、他の 2 つのコードでバックオフするリトライループは、これのほとんどを処理します。呼び出しあたりのコストは小さく、価格ページ にトークンごとのレートがあり、ドキュメントのクイックスタート に他の OpenAI 互換プロバイダーからの移行手順が示されています。
リトライと運用上の習慣
最初の呼び出しが成功したら、出荷前にリトライラッパーを追加してください。Retry-After ヘッダーが存在する場合はそれを尊重し、それ以外の場合は短いランダム遅延でバックオフしてください。
import os, time, random
from openai import OpenAI, RateLimitError
client = OpenAI(base_url="https://api.kimicode.cc/v1", api_key=os.environ["KIMICODE_KEY"])
def ask(messages, tries=5):
for attempt in range(tries):
try:
return client.chat.completions.create(model="uncensored", messages=messages)
except RateLimitError as err:
retry_after = 5
if getattr(err, "response", None) is not None:
retry_after = int(err.response.headers.get("retry-after", 5))
time.sleep(retry_after + random.random())
raise RuntimeError("still rate limited after retries")
キーに合わせて独自の同時実行数を制限してください:フルキーの場合は 8 のスレッドプール、トライアルキーの場合は 2。これにより、concurrency エラーを未然に防ぎ、各呼び出しに数秒以上かかる場合に、1 分あたりの 300 リクエストの制限内に収まります。
最後に、トークン単位で課金されることを覚えておいてください。各呼び出しで usage オブジェクトをログに記録し、X-Balance-USD ヘッダーを確認してください。入力トークン 100 万あたり $0.15、出力トークン 100 万あたり $0.50 の場合、通常のチャットターンはセントのわずかな部分ですが、ループや長い履歴は累積し、ログがその場所を示します。
その他のガイド
質問と回答
この API の Base URL は何ですか?
https://api.kimicode.cc/v1 を OpenAI 互換クライアントの base URL として設定し、その後のパスはライブラリに任せてください。
どのモデルIDを送信すればよいですか?
モデル値として uncensored を送信します。キーを使用して GET /v1/models を呼び出すことで確認できます。
ここで取得したキーを使って、公式のKimiエンドポイントを利用できますか?
いいえ。これは別のサービスで、独自のAPI キーと単一のオープンウェイトモデルを持ち、どのベンダーの公式APIでもありません。API キーはどちらの方向にも引き継がれません。
チャット完了 API で 404 が発生するのはなぜですか?
ベースURLに /v1 が不足しているか、すでに /chat/completions が含まれています。https://api.kimicode.cc/v1 をそのまま使用してください。