URL API Kimi Code: настройка Base URL для клиентов OpenAI
Базовый URL API Kimi Code, который вам нужен для этого сервиса: https://api.kimicode.cc/v1. Укажите его в любом клиенте OpenAI как базовый URL, добавьте свой ключ и используйте идентификатор модели uncensored.
Обновлено

URL и значение каждой его части
Если вы ищете kimi code api url, возможно, вам нужен адрес собственного сервиса Kimi. Для этого используйте документацию от вендора, так как я не могу поручиться за него. Этот сайт предлагает другое: размещённый API, совместимый с OpenAI, поверх одной модели с открытыми весами, управляемой независимым провайдером. Его адрес:
https://api.kimicode.cc/v1
Эта строка — базовый URL. Это часть, которую разделяет каждый запрос. SDK добавляет остальное. Когда вы вызываете chat.completions.create, библиотека OpenAI отправляет POST на https://api.kimicode.cc/v1/chat/completions. Список моделей находится по адресу https://api.kimicode.cc/v1/models и требует GET.
Это два единственных метода, которые обслуживает этот API: POST /v1/chat/completions и GET /v1/models. Если вы надеялись на эндпоинты для изображений, аудио или эмбеддингов, их здесь нет. Это текстовый API.
Важны три настройки, и ничего больше не должно меняться в вашем существующем коде OpenAI: базовый URL, API-ключ и идентификатор модели uncensored.
Почему базовый URL — единственный переключатель
Клиенты в стиле OpenAI построены вокруг одной идеи: формат запроса фиксирован, а хост — это настройка. У библиотеки есть хост по умолчанию, указывающий на оригинального поставщика. Когда вы заменяете его другим базовым URL, тот же самый запрос отправляется в другое место. Ничего в ваших промптах, массивах сообщений или разборе ответов менять не нужно.
Именно поэтому миграция с другого OpenAI-совместимого провайдера обычно сводится к трём правкам: базовый URL, ключ и имя модели. Поля в ответе, такие как choices, message, finish_reason и usage, имеют те же имена, поэтому код, который их читает, продолжает работать.
Это также объясняет странные ошибки, с которыми сталкиваются пользователи. Если инструмент запрашивает «URL сервера», а вы вставляете только хост, путь отсутствует. Если инструмент запрашивает «полный эндпоинт», а вы вставляете базовый URL, запрос уходит не туда. Если экран настроек непонятен, сначала попробуйте базовый URL и посмотрите код состояния, который вернётся. Быстрый старт в документации проходит через ту же миграцию с ещё одним примером.
Переменные окружения для инструментов, которые вы не можете редактировать
Многие инструменты командной строки и фреймворки создают клиент OpenAI, не позволяя вам трогать конструктор. Они обычно читают стандартные переменные окружения, поэтому достаточно их задать:
export OPENAI_BASE_URL="https://api.kimicode.cc/v1"
export OPENAI_API_KEY="YOUR_KEY"
Некоторые старые инструменты ищут OPENAI_API_BASE, поэтому, если какой-то из них игнорирует первое имя, попробуйте второй. После их настройки запустите инструмент в той же сессии оболочки, поскольку переменные, заданные в другом окне терминала, не передаются.
Инструменту всё равно потребуется имя модели. Если в нём жёстко задана размещённая модель, найдите флаг или строку конфигурации, которая её задаёт, и используйте uncensored. Если это нельзя изменить, инструмент вам не подходит, и лучше использовать небольшой скрипт, подобный приведённым выше.
Сначала получите ключ
Запросы аутентифицируются заголовком вида Authorization: Bearer YOUR_KEY. Каждый официальный SDK формирует этот заголовок для вас из аргумента api_key. Вы можете создать ключ после входа через Google или с помощью электронной почты и пароля.
Новые аккаунты могут получить $0.50 пробного баланса в один клик на странице API-ключей. Для этого не нужна карта, и он действует 7 дней. Этого достаточно, чтобы много раз запустить каждый пример ниже. Пробные ключи позволяют 2 параллельных запроса и 60 запросов в минуту, поэтому запускайте примеры по одному.
Храните ключ в переменной окружения, а не в исходных файлах. Ключ, зафиксированный в публичном репозитории, будет найден и использован кем-то другим в течение нескольких часов, и баланс на нём — ваши деньги.
Первый запрос в 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. Второй возвращает стандартный объект завершения чата. Посмотрите заголовки ответа с помощью curl -i, и вы увидите X-Request-Id, X-Balance-USD, X-RateLimit-Limit-Requests и X-RateLimit-Limit-Concurrency. Сохраните идентификатор запроса, если когда-либо обратитесь в поддержку по поводу конкретного вызова.
Python с SDK OpenAI
Установите библиотеку с помощью pip install openai, затем измените два аргумента в конструкторе клиента.
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 также читает две переменные окружения, если вы не передаёте аргументы: 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));
Потоковая передача использует серверные события (SSE), а данные об использовании (usage) передаются в конце потока. Потоковый запрос удерживает слот параллельных запросов до завершения потока, поэтому клиент, открывший поток и не читающий его, заблокирует слот. В 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. Путь неверен. Общие причины: базовый URL установлен как
https://api.kimicode.ccбез/v1, или какhttps://api.kimicode.cc/v1/chat/completions, так что клиент добавляет путь дважды. Используйте именно тот базовый URL, что указан выше. - 401 Unauthorized. Ключ отсутствует, содержит лишний пробел или новую строку, или заголовок не является токеном Bearer. Выведите длину переменной для проверки.
- 429 с кодом
rate_limited. Вы превысили лимит в минуту: 300 запросов для полного ключа, 60 для пробного. - 429 с кодом
concurrency. Слишком много запросов одновременно: 8 для полного ключа, 2 для пробного. - 429 с заголовком
Retry-After: 5. Временная перегрузка. Подождите пять секунд и повторите. - Запрос слишком большой. Лимит тела составляет 8 МБ, а промпт плюс завершение должны укладываться в 100 000 токенов.
Цикл повторных попыток, который учитывает заголовок Retry-After и увеличивает задержку при двух других кодах, решает почти все эти проблемы. Стоимость одного вызова мала; на странице с тарифами указаны цены за токен, а в быстром старте документации показаны шаги миграции с другого провайдера в стиле 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 до её возникновения, а также удержит вас в пределах лимита 300 запросов в минуту, если каждый вызов занимает более нескольких секунд.
Наконец, помните, что вы платите за токены. Логируйте объект usage для каждого вызова и следите за заголовком X-Balance-USD. При цене $0.15 за 1 млн входных токенов и $0.50 за 1 млн выходных токенов типичный ход чата стоит долю цента, но циклы и длинные истории накапливаются, и лог показывает, где именно.
Дополнительные руководства
Вопросы и ответы
Какой базовый URL у этого API?
https://api.kimicode.cc/v1. Установите его как базовый URL в любом OpenAI-совместимом клиенте и оставьте путь после него для библиотеки.
Какой идентификатор модели мне отправлять?
Укажите uncensored в качестве значения модели. Вы можете проверить это, вызвав GET /v1/models с вашим ключом.
Можно ли использовать официальный эндпоинт Kimi с моим ключом отсюда?
Нет. Это отдельный сервис со своими ключами и одной моделью с открытыми весами, а не официальный API какого-либо поставщика. Ключи не передаются ни в одном направлении.
Почему возникает ошибка 404 на chat completions?
Вероятно, базовый URL не содержит /v1 или уже включает /chat/completions. Используйте https://api.kimicode.cc/v1 и ничего более.
Ваш ключ можно получить, заполнив одну форму
Создайте аккаунт, скопируйте ключ, измените базовый URL. Это вся настройка.
Получить API-ключ