Чтобы использовать Kimi в приложении, получите ключ нужного провайдера и выберите точный ID модели. Прямой Kimi API работает через https://api.moonshot.ai/v1; доступ Zenith использует другой ключ и https://api.zenithmarket.dev/v1. Балансы этих сервисов не взаимозаменяемы.
Kimi API нужен, если вы подключаете модель к своему приложению или коду: K3 в документации предназначен, в частности, для длинной инженерной работы и больших кодовых баз, а K2.7 Code — специализированная coding-модель. Если задача требует контекста больше 256K токенов, по указанному параметру подходит K3 с контекстом до 1 млн; если нужен режим без рассуждений, K2.7 Code не подходит. Это выбор по опубликованным характеристикам, а не гарантия результата на конкретной задаче. K3; K2.7 Code.
Kimi K3 — предыдущая флагманская модель, а K2.7 Code — отдельная модель для программирования. Ниже приведены официальные характеристики моделей и отдельно — исторический расчёт по данным Zenith от 27.10.2026; эти цены не являются текущей котировкой или сравнением качества.
Получить официальный ключ Kimi
Официальная платформа Kimi позволяет создать API-ключ в разделе API Keys и рекомендует не встраивать его в приложение, а хранить в переменной окружения. Источник.
Справочник Kimi заявляет совместимость официального API с OpenAI и Anthropic; это утверждение относится только к официальному Kimi API. Форматы конкретного SKU Zenith из него не следуют: пример ниже использует его проверяемый по каталогу Chat Completions endpoint. Для K 2.7 Code здесь рассматривается только отдельно документированный OpenAI-совместимый Chat Completions. Это не утверждение о поддержке этой моделью всех форматов и не описание возможностей Zenith. Источник.
Kimi K2.7 Code не поддерживает non-thinking mode, поэтому в инструкции нельзя обещать переключение этой модели в обычный режим без рассуждений. Источник.
На платформе Kimi откройте API Keys, создайте ключ и сохраните его в менеджере секретов. Для локальной программы можно использовать скрытый ввод или переменную окружения. Не вставляйте его в браузерную сборку, пример на GitHub или лог ошибки. При компрометации немедленно отзовите и замените ключ, затем по возможности удалите секрет из доступных журналов и репозиториев. Очистка журнала не отменяет утечку и не делает старый ключ безопасным.
K 3 и K 2.7 Code: что влияет на выбор
Официальный quickstart K3 указывает контекст до 1 млн токенов, нативное понимание изображений и постоянно включённый reasoning; для K3 доступны low, high и max, по умолчанию — max. Quickstart K2.7 Code описывает специализированную coding-модель с контекстом 256K, OpenAI-совместимым форматом и без non-thinking mode. Опубликованное сравнение K2.7 Code относится к K2.6, а не к карточке kimi-k3 в Zenith.
| Критерий | K3, официальный паспорт | K2.7 Code, официальный паспорт |
|---|---|---|
| Назначение | Длинная инженерная работа, большие кодовые базы, визуальные сценарии | Специализированная coding-модель |
| Контекст | До 1 млн токенов | 256K |
| Рассуждения | Всегда включены; low, high или max | Non-thinking mode не поддерживается |
Практический выбор: для задачи, которой нужен контекст свыше 256K, по документированному пределу рассматривайте K3; для специализированной работы с кодом — K2.7 Code, если её контекстного окна достаточно. Если условие требует отключить рассуждения, K2.7 Code ему не соответствует; K3 также описан как модель с постоянно включённым reasoning.
Первый запрос: официальный Kimi API и отдельный маршрут Zenith
Ниже сначала приведён прямой запрос к официальному Kimi API: ему нужен ключ, созданный в разделе API Keys платформы Kimi, сохранённый в переменной MOONSHOT_API_KEY. Базовый URL и ID соответствуют официальному quickstart K3. Это документированный пример, не проведённый платный тест.
import os
from openai import OpenAI, APIError
key = os.environ.get("MOONSHOT_API_KEY")
if not key:
raise SystemExit("Задайте MOONSHOT_API_KEY")
client = OpenAI(api_key=key, base_url="https://api.moonshot.ai/v1",
timeout=60, max_retries=0)
try:
result = client.chat.completions.create(
model="kimi-k3",
messages=[{"role": "user", "content": "Ответь ровно одним словом: ok"}],
reasoning_effort="low",
max_tokens=1024,
stream=False,
)
except APIError as error:
print(type(error).__name__, getattr(error, "status_code", None))
raise SystemExit(1)
if not result.choices:
raise SystemExit("В ответе нет choices")
choice = result.choices[0]
print("finish_reason:", choice.finish_reason)
print(choice.message.content or "")
print("usage:", result.usage)
if choice.finish_reason == "length" or not choice.message.content:
raise SystemExit("Текстовый ответ не завершён: проверьте finish_reason и увеличьте max_tokens")
Установите SDK командой python -m pip install openai, задайте официальный ключ в окружении, сохраните пример как kimi_official.py и запустите python kimi_official.py. Ожидаемый результат — текст ok и метаданные ответа; если завершение отмечено как length либо текст пуст, пример не получил ожидаемый ответ. Параметр reasoning_effort="low" задаёт низкий уровень reasoning, но не отключает его: для K3 он всегда включён.
Для Zenith нужен отдельный ключ, получаемый через документированный бот, и другой базовый URL. Следующий пример запускает запрос только через Zenith; официальный ключ Kimi в нём использовать нельзя. Сначала он читает модельный каталог, проверяет ID, тип endpoint и опубликованные ставки, затем отправляет запрос. Установите тот же SDK, задайте ZENITH_API_KEY, сохраните как kimi_first.py и выполните python kimi_first.py. Это документальная инструкция, не платный прогон редакции.
import json
import os
import urllib.error
import urllib.request
from openai import OpenAI, APIError
key = os.environ.get("ZENITH_API_KEY")
if not key:
raise SystemExit("Задайте ZENITH_API_KEY")
model_id = "kimi-k3"
request = urllib.request.Request(
"https://api.zenithmarket.dev/v1/models",
headers={"Authorization": "Bearer " + key,
"User-Agent": "Comrad404SourceReview/1.0"},
)
try:
with urllib.request.urlopen(request, timeout=30) as response:
catalog = json.load(response)
except urllib.error.HTTPError as error:
print("Catalog HTTP", error.code)
raise SystemExit(1)
if isinstance(catalog, list):
rows = catalog
elif isinstance(catalog, dict) and isinstance(catalog.get("data"), list):
rows = catalog["data"]
else:
raise SystemExit("Неизвестная форма каталога; запрос генерации не отправлен")
row = next((item for item in rows
if isinstance(item, dict) and item.get("id") == model_id), None)
if row is None:
raise SystemExit("Нужного ID нет в каталоге")
types = row.get("supported_endpoint_types")
if not isinstance(types, list) or "chat_completions" not in types:
raise SystemExit("Каталог не подтверждает chat_completions; запрос остановлен")
for field in ("inputCostMicrousdPerMillion",
"outputCostMicrousdPerMillion"):
value = row.get(field)
if type(value) is not int:
raise SystemExit("Цена не указана; запрос остановлен")
print(field, "microUSD/MTok:", value, "USD/MTok:", value / 1_000_000)
client = OpenAI(api_key=key, base_url="https://api.zenithmarket.dev/v1",
timeout=60, max_retries=0)
try:
raw = client.chat.completions.with_raw_response.create(
model=model_id,
messages=[{"role": "user", "content": "Ответь ровно одним словом: ok"}],
max_tokens=1024,
stream=False,
)
print("requestId:", raw.headers.get("x-request-id"))
result = raw.parse()
except APIError as error:
print(type(error).__name__, getattr(error, "status_code", None))
raise SystemExit(1)
if not result.choices:
raise SystemExit("Ошибка контракта: нет choices")
choice = result.choices[0]
print("finish_reason:", choice.finish_reason)
print(choice.message.content or "")
print("usage:", result.usage)
if choice.finish_reason == "length" or not choice.message.content:
raise SystemExit("Ответ не завершён; сверьте finish_reason и историю запроса")
Чтобы попробовать K2.7 Code через Zenith, замените model_id на kimi-k2.7-code; пример продолжит работу лишь если каталог вернёт этот ID с chat_completions и ценами. Ожидаемое ok подтверждает только текстовый обмен через выбранный маршрут, а не работу терминала, чтение изображений или полный агентный цикл. Официальный quickstart K2.7 Code содержит отдельный пример для прямого API; возможности официального API нельзя автоматически приписывать маршруту Zenith. Quickstart K2.7 Code.
Проверяемый сценарий: исправление регрессии API
Возьмите небольшой проект, где публичное API возвращало дату в формате YYYY-MM-DD, а после рефакторинга стало возвращать timestamp. Укажите модели явно: kimi-k3 и kimi-k2.7-code. Для K3 задайте документированный reasoning_effort="low"; у K2.7 Code не просите включить или отключить non-thinking mode — он не поддерживается. Используйте одинаковые входные файлы и одинаковую задачу, один запрос на модель, одинаковый лимит max_tokens=4096 и не включайте инструменты. Это настройки сравнения, а не утверждение о проведённом запуске или равных возможностях маршрутов.
Попросите каждую модель вернуть только JSON вида {"reason":"...","patch":"...","tests":["...","..."]}. Примените патч к отдельной копии проекта и оцените по четырём пунктам: JSON разбирается; объяснена причина смены формата; патч сохраняет публичный YYYY-MM-DD и не меняет посторонние файлы; два теста воспроизводят регрессию и проверяют исправление. По каждому пункту поставьте pass или fail, затем запустите тесты проекта. Модель проходит проверку только при pass по всем четырём пунктам и успешном запуске тестов; если ответ оборван или не является валидным JSON, это fail, а не основание домысливать патч.
Сценарий оценивает только текстовый патч на заданном проекте. Он не проверяет работу терминального агента, визуальный ввод или производительность, а стоимость нескольких исправительных запросов в расчёт одного запроса не входит.
Сколько стоит условный запрос
С авторизованным ключом Zenith запросите GET /v1/models и сверьте ID/цену; без ключа этот скрипт каталог не читает. Данные статьи — исторический снимок 27.10.2026, не сегодняшняя котировка. Таблица — снимок 27.10.2026; после изменения ставки пересчитайте итог той же формулой.
| ID Zenith, 27.10.2026 | Вход / выход, $ за миллион | 4 000/800, $ | 10 000 запросов, $ |
|---|---|---|---|
| kimi-k3 | 0,30 / 1,50 | 0,0024 | 24,00 |
| kimi-k2.7-code | 0,19 / 0,80 | 0,0014 | 14,00 |
Для K 3: 4000 × 0,30 / 1 000 000 + 800 × 1,50 / 1 000 000 = $0,0024. Это снимок предложения Zenith без кэша, комиссий и инструментов, не официальный прайс Kimi. Для рефакторинга считайте все обращения агента и оплаченные исправления, а не один запрос. Неизвестный результат тайм-аута сначала сверяют с историей, затем решают вопрос о повторе.
Сверка отдельного запроса с историей Zenith
Следующий документальный скрипт рассчитан на форму ответа data.usage с полями requestId, model, createdAt, status и costMicrousd. Для неизвестной формы он останавливается; эту схему нельзя считать гарантированной для любого ключа. Стоимость в microUSD переводится в USD делением на 1000000.
Сохраните идентификатор запроса из ответа, если он присутствует (например, x-request-id); без него однозначная сверка может быть невозможна. Следующий файл zenith_usage_match.py читает историю и ищет только точное совпадение requestId; генерацию он не повторяет. Запустите python zenith_usage_match.py, введите ключ и идентификатор. Если ID не получен или совпадения нет, исход остаётся неопределённым: не заменяйте его догадкой по одному изменению баланса.
import getpass, json, urllib.request, urllib.error
key=getpass.getpass("Zenith API key: ")
request_id=input("x-request-id исходного ответа: ").strip()
if not key or not request_id: raise SystemExit("Нужны ключ и ID")
req=urllib.request.Request("https://api.zenithmarket.dev/v1/zenith/key/usage",
headers={"Authorization":"Bearer "+key,"User-Agent":"Comrad404SourceReview/1.0"})
try:
with urllib.request.urlopen(req,timeout=30) as response: obj=json.load(response)
except urllib.error.HTTPError as error:
print("HTTP",error.code,error.read().decode(errors="replace").replace(key,"[REDACTED]")[:700])
raise SystemExit(1)
rows=obj.get("data",{}).get("usage") if isinstance(obj,dict) else None
if not isinstance(rows,list): raise SystemExit("Неизвестная схема истории; повтор остановлен")
matches=[r for r in rows if r.get("requestId")==request_id]
if len(matches)!=1: raise SystemExit("Нет единственной записи; проверьте период/историю в сервисе")
r=matches[0]
print({k:r.get(k) for k in ("requestId","model","createdAt","status","inputTokens",
"outputTokens","cachedInputTokens","cacheCreationInputTokens","costMicrousd")})
if isinstance(r.get("costMicrousd"),int): print("USD:",r["costMicrousd"]/1_000_000)
Для текстового запроса сопоставьте ID, модель, время, статус и счётчики с исходным usage, сверьте отображённую стоимость операции; этот скрипт не выполняет автоматический тарифный пересчёт. История ограничена возвращённой выборкой: отсутствие записи не доказывает бесплатность или отмену.
Код чтения различает массив и объект с data; это две явно обработанные формы, не гарантия будущего контракта. Нормализованный исторический снимок цен не является исходным wire-ответом или тестом генерации.
В снимке Zenith27.10 присутствовал kimi-k3; наличие kimi-k3.1-pro здесь не проверено. Смета исключает инструменты, комиссии и кэш; для kimi-k3 чтение кэшированного входа в снимке стоит $0,03/MTok. При отдельно учтённом cache hit эту часть входа считают по данной ставке вместо обычной, не прибавляют её второй раз.



