01Что это
API к моделям — продукт xWires для команд разработки. Компания подключает его по заявке, xWires выдаёт каждой команде или сервису свой ключ, а расход токенов по ключам админ компании видит в кабинете. API совместим с API OpenAI: готовый код и инструменты работают, если поменять адрес, ключ и модель.
Вызвать модель можно двумя способами:
| Chat Completions | Responses | |
|---|---|---|
| Путь | Chat Completions/chat/completions | Responses/responses |
| В SDK OpenAI | Chat Completionsclient.chat.completions.create() | Responsesclient.responses.create() |
| Что отправляете | Chat Completionsmessages: сообщения с ролями | Responsesinput: сообщения или блоки |
| Поиск в интернете | Chat CompletionsТолько своими функциями (function calling) на вашей стороне | ResponsesВстроенный: инструмент web_search |
| Когда брать | Chat CompletionsЧат, генерация текста и кода, перенос готового кода с OpenAI | ResponsesОтветы со свежими данными из интернета, агенты |
Сейчас в руководстве Kimi K3 (раздел 4) и DeepSeek V4 Pro (раздел 5). GLM появится здесь своим разделом.
Это не API управления компанией. Тот нужен кадровой и учётной системам для подписок ChatGPT, у него свой адрес и свои ключи, и он описан в отдельном руководстве. Ключ API управления к моделям не подходит, и наоборот.
02Быстрый старт
- Админ компании открывает в кабинете xWires «Компания → API к моделям»: там адрес API и ID моделей. Раздел появляется, когда xWires выдал компании первый ключ. Если API ещё не подключено, оставьте заявку на странице «API к моделям».
- Ключ команды выдаёт xWires. Положите адрес, ключ и ID модели в переменные окружения сервера:
export XWIRES_BASE_URL="адрес API из кабинета" export XWIRES_API_KEY="ключ вашей команды" export XWIRES_MODEL="ID модели из кабинета"
- Отправьте первый запрос:
curl "$XWIRES_BASE_URL/chat/completions" \
-H "Authorization: Bearer $XWIRES_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"model": "'"$XWIRES_MODEL"'",
"messages": [
{"role": "system", "content": "Ты — помощник разработчика. Отвечай кратко."},
{"role": "user", "content": "Привет! Что ты умеешь?"}
]
}'{
"id": "0217923680000000000000000000000000000000000000000000",
"object": "chat.completion",
"created": 1792368000,
"model": "<ID модели>",
"choices": [
{
"index": 0,
"message": {
"role": "assistant",
"content": "Помогаю с разработкой: пишу, объясняю и отлаживаю код, отвечаю на технические вопросы.",
"reasoning_content": "The user greets me and asks what I can do, in one short answer…"
},
"finish_reason": "stop"
}
],
"usage": {
"prompt_tokens": 131,
"completion_tokens": 184,
"total_tokens": 315,
"prompt_tokens_details": {
"cached_tokens": 0
},
"completion_tokens_details": {
"reasoning_tokens": 124
}
}
}В агентах для программирования, LangChain и других инструментах выберите OpenAI-совместимого провайдера (OpenAI compatible) и укажите те же три значения: адрес API (base URL), ключ и ID модели. Код на Python и Node.js — в раздел 6.
03Адрес, ключ и модель
Адрес API
Базовый адрес, к которому добавляется путь: /chat/completions или /responses. Все запросы — HTTPS POST с телом JSON и заголовком Content-Type: application/json. Адрес — в кабинете, «Компания → API к моделям»; в SDK OpenAI он передаётся как base_url (Python) или baseURL (Node.js).
Ключ
Ключ идёт в заголовке Authorization: Bearer каждого запроса. У каждой команды или сервиса свой ключ: по нему считается расход, и в кабинете он подписан названием команды. Ключи выдаёт xWires; целиком ключ есть только у команды, а в кабинете видны его начало и конец.
- Ключ живёт только на сервере: в переменной окружения или хранилище секретов. В код, репозиторий, браузер и мобильное приложение он не попадает: из них его легко достать, и тратить токены компании сможет кто угодно.
- Ключ потерян, попал в репозиторий или мог оказаться у посторонних — напишите на support@xwires.ai, и мы его заменим.
- Новой команде или сервису нужен свой ключ — напишите туда же.
ID модели
Модель выбирается полем model в каждом запросе. ID моделей — в кабинете, рядом с адресом API. В примерах этого руководства ID берётся из переменной XWIRES_MODEL: положите в неё ID нужной модели.
Рассуждение перед ответом
Модели сначала рассуждают, потом отвечают. Рассуждение приходит вместе с ответом: в Chat Completions — в message.reasoning_content, в Responses — отдельным элементом reasoning перед сообщением. Показывать его пользователю не обязательно, а язык у него бывает другим, чем у ответа. Токены рассуждения входят в токены ответа (completion_tokens, из них reasoning_tokens) и в предел max_tokens: если предел мал, модель потратит его на рассуждение и вернёт пустой ответ с finish_reason: length. Поэтому max_tokens не задавайте вовсе или оставляйте запас на сотни токенов.
04Kimi K3
Модель Moonshot AI для агентов, которые работают с кодом и инструментами.
| Kimi K3 | |
|---|---|
| Разработчик | Kimi K3Moonshot AI |
| Для чего | Kimi K3Агенты с кодом и инструментами |
| Контекст | Kimi K3До 1 млн токенов, ответ — до 128 тыс. |
| Способы вызова | Kimi K3Chat Completions и Responses |
| Поиск в интернете | Kimi K3Встроенный, через Responses: инструмент web_search |
| Вызов функций | Kimi K3Да: tools в Chat Completions, с возвратом результата модели |
| Рассуждение | Kimi K3Перед ответом, в reasoning_content или элементе reasoning; его токены входят в ответ |
| Ответ по частям | Kimi K3stream: true в обоих способах |
| ID модели | Kimi K3В кабинете, «Компания → API к моделям» |
Рассуждает Kimi K3 по-английски, даже когда вопрос и ответ на русском.
05DeepSeek V4 Pro
Флагман DeepSeek: код, анализ данных и задачи, где нужно рассуждать.
| DeepSeek V4 Pro | |
|---|---|
| Разработчик | DeepSeek V4 ProDeepSeek |
| Для чего | DeepSeek V4 ProКод, анализ данных и рассуждения |
| Контекст | DeepSeek V4 ProДо 1 млн токенов, ответ — до 384 тыс. |
| Способы вызова | DeepSeek V4 ProChat Completions и Responses |
| Поиск в интернете | DeepSeek V4 ProВстроенный, через Responses: инструмент web_search |
| Вызов функций | DeepSeek V4 ProДа: tools в Chat Completions, с возвратом результата модели |
| Рассуждение | DeepSeek V4 ProПеред ответом, в reasoning_content или элементе reasoning; его токены входят в ответ |
| Ответ по частям | DeepSeek V4 Prostream: true в обоих способах |
| ID модели | DeepSeek V4 ProВ кабинете, «Компания → API к моделям» |
DeepSeek V4 Pro рассуждает на языке вопроса. На сложных задачах — коде, математике, анализе — рассуждение длинное, и ответ целиком может идти минуты: увеличьте таймаут или получайте ответ по частям (раздел 9).
06Chat Completions
POST на адрес API с путём /chat/completions — тот же запрос, что у OpenAI, поэтому подходят официальные SDK и готовый код. Пример на curl — в раздел 2.
Параметры
| Параметр | Тип | Обязательный | Что значит |
|---|---|---|---|
model | Типстрока | Обязательныйда | Что значитID модели из кабинета |
messages | Типмассив | Обязательныйда | Что значитДиалог по порядку: сообщения с role (system, user или assistant) и content |
stream | Типлогический | Обязательныйнет | Что значитtrue — ответ приходит по частям, событиями SSE, по мере того как модель его пишет. По умолчанию false |
temperature | Типчисло | Обязательныйнет | Что значитСлучайность ответа, обычно от 0 до 1: чем выше, тем разнообразнее ответ, чем ниже, тем предсказуемее |
max_tokens | Типцелое | Обязательныйнет | Что значитПредел токенов ответа вместе с рассуждением модели: слишком малый оставит ответ пустым |
Python
Нужен официальный SDK OpenAI версии 1.0 или новее: pip install --upgrade "openai>=1.0".
import os
from openai import OpenAI
client = OpenAI(
base_url=os.environ["XWIRES_BASE_URL"],
api_key=os.environ["XWIRES_API_KEY"],
timeout=120,
)
MODEL = os.environ["XWIRES_MODEL"]
messages = [
{"role": "system", "content": "Ты — помощник разработчика. Отвечай кратко."},
{"role": "user", "content": "Привет! Что ты умеешь?"},
]
# Ответ целиком
completion = client.chat.completions.create(model=MODEL, messages=messages)
print(completion.choices[0].message.content)
print(completion.usage)
# Ответ по частям, по мере того как модель его пишет
stream = client.chat.completions.create(model=MODEL, messages=messages, stream=True)
for chunk in stream:
if chunk.choices and chunk.choices[0].delta.content:
print(chunk.choices[0].delta.content, end="", flush=True)
print()Node.js
Официальный SDK OpenAI: npm install openai.
import OpenAI from "openai";
const client = new OpenAI({
baseURL: process.env.XWIRES_BASE_URL,
apiKey: process.env.XWIRES_API_KEY,
timeout: 120_000,
});
const model = process.env.XWIRES_MODEL;
const messages = [
{ role: "system", content: "Ты — помощник разработчика. Отвечай кратко." },
{ role: "user", content: "Привет! Что ты умеешь?" },
];
// Ответ целиком
const completion = await client.chat.completions.create({ model, messages });
console.log(completion.choices[0].message.content);
console.log(completion.usage);
// Ответ по частям, по мере того как модель его пишет
const stream = await client.chat.completions.create({ model, messages, stream: true });
for await (const chunk of stream) {
process.stdout.write(chunk.choices[0]?.delta?.content ?? "");
}
process.stdout.write("\n");Ответ
choices[0].message.content— текст ответа,choices[0].message.reasoning_content— рассуждение модели перед ним.choices[0].finish_reason— почему модель остановилась:stop— ответ закончен,length— ответ с рассуждением дошёл доmax_tokens.usage— токены запроса (prompt_tokens, из них взятые из кэша —prompt_tokens_details.cached_tokens), ответа (completion_tokens, из них рассуждение —completion_tokens_details.reasoning_tokens) и всего (total_tokens).- В ответе по частям сначала идут куски с
choices[0].delta.reasoning_content, потом с текстом ответа вchoices[0].delta.content; примеры выше печатают только текст. С"stream_options": {"include_usage": true}в запросе последним придёт кусок безchoicesи сusage; кусок безchoicesпропускайте, как в примерах.
07Responses и веб-поиск
POST на адрес API с путём /responses — интерфейс со встроенными инструментами на стороне сервера. Главный из них — поиск в интернете, web_search: модель сама ищет и отвечает со свежими данными, без вашего поискового API и цикла вызова функций.
Параметры
| Параметр | Тип | Обязательный | Что значит |
|---|---|---|---|
model | Типстрока | Обязательныйда | Что значитID модели из кабинета |
input | Типмассив | Обязательныйда | Что значитСообщения с role и content. content — строка или список блоков, например {"type": "input_text", "text": "…"} |
tools | Типмассив | Обязательныйнет | Что значитВстроенные инструменты. {"type": "web_search"} включает поиск в интернете |
tools[].max_keyword | Типцелое | Обязательныйнет | Что значитСколько поисковых запросов модель может сделать за ход, например 2 или 3 |
stream | Типлогический | Обязательныйнет | Что значитtrue — ответ по частям, событиями SSE. По умолчанию false |
Python
Тот же SDK OpenAI: в input можно передать сообщения со строкой в content. В output ответа приходят рассуждение (элемент reasoning) и сообщение с блоком output_text, а свойство SDK output_text собирает из них только текст ответа.
import os
from openai import OpenAI
client = OpenAI(
base_url=os.environ["XWIRES_BASE_URL"],
api_key=os.environ["XWIRES_API_KEY"],
timeout=120,
)
response = client.responses.create(
model=os.environ["XWIRES_MODEL"],
input=[{"role": "user", "content": "Какие новости в мире ИИ за эту неделю?"}],
tools=[{"type": "web_search", "max_keyword": 2}],
)
print(response.output_text)curl, ответ по частям
В REST-запросе content — список блоков input_text. С stream: true ответ приходит событиями SSE.
curl "$XWIRES_BASE_URL/responses" \
-H "Authorization: Bearer $XWIRES_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"model": "'"$XWIRES_MODEL"'",
"stream": true,
"tools": [{"type": "web_search", "max_keyword": 3}],
"input": [
{
"role": "user",
"content": [{"type": "input_text", "text": "Какие новости в мире ИИ за эту неделю?"}]
}
]
}'Запросы с поиском видны в «Расходе токенов» в кабинете: среди запросов отдельно указано, сколько было с поиском в интернете.
08Ошибки
Ошибка приходит с кодом HTTP и телом, как у OpenAI: {"error": {"code": "…", "message": "…", "type": "…"}}. SDK OpenAI превращают её в исключение с этим кодом. Если пишете нам, приложите message: в нём есть Request id.
| Код | Что случилось | Что делать |
|---|---|---|
| 400 Bad Request | Что случилосьНеверный JSON, нет обязательного поля (model, messages или input) или недопустимое значение | Что делатьИсправьте запрос: повтор не поможет |
| 401 Unauthorized | Что случилосьНет ключа, ключ неверный или отключён (AuthenticationError) | Что делатьПроверьте заголовок Authorization: Bearer и ключ. Если ключ верный, напишите на support@xwires.ai |
| 403 Forbidden | Что случилосьКлючу не открыта эта модель, или доступ приостановлен | Что делатьСверьте ID модели с кабинетом. Если он верный, напишите на support@xwires.ai |
| 404 Not Found | Что случилосьОшибка в ID модели (InvalidEndpointOrModel.NotFound), в адресе API или пути | Что делатьСверьте адрес и ID модели с кабинетом |
| 429 Too Many Requests | Что случилосьПревышен лимит запросов или токенов в минуту | Что делатьПовторите с нарастающей паузой (раздел 9). Если лимита не хватает постоянно, напишите на support@xwires.ai |
| 500, 503 | Что случилосьВременная перегрузка или сбой на стороне модели | Что делатьПовторите с нарастающей паузой |
09В продакшене
- Таймаут. Для ответа целиком начните с 60–120 секунд и подстройте по своим запросам; DeepSeek V4 Pro на сложных задачах рассуждает дольше. Длинный ответ лучше получать по частям (
stream): первые слова придут сразу, а соединение не простаивает. - Повторы. 429, 500, 503 и обрыв соединения повторяйте с нарастающей паузой — 1, 2, 4, 8 секунд с небольшим случайным разбросом — и ограничьте число попыток. 400, 401, 403 и 404 повтором не исправить. SDK OpenAI повторяют такие ошибки сами, по умолчанию дважды (
max_retriesв Python,maxRetriesв Node.js). - Учёт. Пишите
usageиз ответа в свои логи вместе с командой или сервисом: так расход виден сразу, а не на следующий день. В ответе по частямusageпридёт, если в запросе есть"stream_options": {"include_usage": true}. - Кэш. Агенты раз за разом отправляют одно и то же начало запроса: системный промпт, код, историю. Держите это начало неизменным, а то, что меняется, ставьте в конец: повторяющееся начало модель берёт из кэша, и такие токены стоят дешевле нового ввода. Кэш включается сам, а сколько токенов запроса пришло из него, показывает
usage.prompt_tokens_details.cached_tokens.
10Расход и лимиты
Админ компании видит расход в кабинете, «Компания → Расход токенов»: токены ввода, из кэша и ответа, запросы и ошибки по дням, моделям и ключам. Данные приходят раз в сутки, поэтому сегодняшние запросы появятся там завтра.
Лимиты на запросы и токены в минуту подбираем под объём компании. Если упираетесь в 429 или ждёте рост нагрузки, напишите на support@xwires.ai: сколько запросов в минуту и сколько одновременных запросов нужно в пике.
11Безопасность
- Ключ — секрет компании: только на сервере, у каждой команды свой (раздел 3).
- Вопросы о подключении, ключах и лимитах — на support@xwires.ai.