RU ▾
Получить API-ключ

URL API Kimi Code: настройка Base URL для клиентов OpenAI

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

Обновлено

Кабель, соединяющий клиентский терминал с сервером API, представляющий настройку базового URL

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-ключ