Руководство
Модели и текстовый интерфейс
Запрос списка доступных моделей, правила запросов и ответов для текстового диалога (включая потоковый режим)
Модели и текстовый интерфейс
Каталог моделей и текстовый диалог используют один и тот же платформенный API Key. Общие соглашения (базовый адрес, аутентификация, ограничение частоты запросов, повторные попытки) см. в разделе Аутентификация и базовые соглашения.
Получение списка моделей
/v1/modelsСпособ аутентификации
Authorization: Bearer <API_KEY>.
Параметры запроса
Тело запроса не требуется; достаточно передать API Key в заголовке запроса.
Пример запроса
На этом шаге тело запроса не нужно, достаточно передать API Key в заголовке запроса.
Возвращённый data[].id и есть ID модели, который понадобится для всех последующих вызовов.
Запрос
curl "https://locopalai.com/v1/models" \
-H "Authorization: Bearer $LOCOPAL_API_KEY"Параметры ответа
| Параметр | Тип | Описание |
|---|---|---|
object | string | Всегда list |
success | boolean | true при успешном запросе |
data | array | Список моделей, доступных текущему ключу |
data[].id | string | ID модели; указывайте его как есть при отправке запросов |
data[].object | string | Всегда model |
data[].created | integer | Время записи в каталоге (Unix-секунды) |
data[].owned_by | string | Идентификатор провайдера модели, носит справочный характер |
data[].supported_endpoint_types | string[] | Типы интерфейсов, доступные для этой модели |
objectиsuccess— поля верхнего уровня, они не входят вdata[].objectвсегдаlist,successпри успехе равенtrue. Успешность запроса определяйте по коду состояния HTTP;successносит лишь вспомогательный характер.
Тело ответа
{
"data": [
{
"id": "doubao-seedance-2.0",
"object": "model",
"created": 1626777600,
"owned_by": "doubaovideo",
"supported_endpoint_types": ["openai"]
},
{
"id": "claude-sonnet-4-5-20250929",
"object": "model",
"created": 1626777600,
"owned_by": "claude",
"supported_endpoint_types": ["anthropic", "openai"]
}
],
"object": "list",
"success": true
}Ответ "data": [] означает, что в группе вызовов текущего ключа нет доступных моделей: сначала проверьте конфигурацию группы или обратитесь в поддержку платформы, не пытайтесь повторять с отображаемым на странице названием. Каталог моделей меняется вместе с правами доступа и доступностью платформы, поэтому рекомендуется обновлять его при запуске сервиса, при выборе модели пользователем или при получении сообщения «модель недоступна».
Ответ с ошибкой
| HTTP | Ответ | Описание |
|---|---|---|
401 | {"error":{"code":"","message":"Invalid token (request id: ...)","type":"new_api_error"}} | API Key отсутствует, указан неверно или истёк |
500 | {"error":{"message":"...","type":"new_api_error"}} | Ошибка запроса каталога; сохраните идентификатор запроса и повторите |
Текстовый диалог
/v1/chat/completionsСпособ аутентификации
Authorization: Bearer <API_KEY>.
Тело запроса · application/json
| Параметр | Тип | Обязательно | Описание |
|---|---|---|---|
model | string | Да | ID текстовой модели, возвращённый /v1/models |
messages | array | Да | Сообщения в хронологическом порядке |
messages[].role | string | Да | system, user или assistant |
messages[].content | string | Да | Содержимое текущего сообщения |
stream | boolean | Нет | При true используется потоковый ответ SSE, завершение — по [DONE] |
temperature | number | Нет | Поддержка зависит от фактических возможностей текущей модели |
max_tokens | integer | Нет | Поддержка зависит от фактических возможностей текущей модели |
Пример запроса
model должен быть записан как id, возвращённый /v1/models; не используйте отображаемое на странице название.
При stream = true ответ возвращается по частям через SSE и завершается при получении [DONE].
Справа приведены эквивалентные примеры на трёх языках — переключайте вкладки для сравнения.
curl -X POST "https://locopalai.com/v1/chat/completions" \
-H "Authorization: Bearer $LOCOPAL_API_KEY" \
-H "Content-Type: application/json" \
--data-binary @- <<'JSON'
{
"model": "从 /v1/models 选择的文本模型 ID",
"messages": [{ "role": "user", "content": "只回复两个字:你好" }],
"stream": false
}
JSONПараметры ответа
| Параметр | Тип | Описание |
|---|---|---|
id | string | Идентификатор этого ответа, используется для диагностики и сверки |
object | string | При не потоковом режиме — chat.completion |
created | integer | Время ответа (Unix-секунды) |
model | string | ID модели, использованной в этом запросе |
choices | array | Список результатов |
choices[].index | integer | Порядковый номер результата |
choices[].message.role | string | Всегда assistant |
choices[].message.content | string | Сгенерированный текст |
choices[].finish_reason | string | Причина завершения; length означает усечение по длине |
usage.prompt_tokens | integer | Объём входных данных |
usage.completion_tokens | integer | Объём выходных данных |
usage.total_tokens | integer | Общий объём |
choices[].message.refusal | string / null | Пояснение при отказе модели от содержимого; для обычного ответа обычно null |
choices[].message.annotations | array | Дополнительные пометки модели, могут быть пустыми |
usage также может содержать подробные поля учёта для тарификации (попадания в кэш, разделение входных/выходных данных и т. п.); ориентируйтесь на фактический ответ. Некоторые каналы также возвращают расширенные поля latency_checkpoint, routing, system_fingerprint и др.; клиент должен игнорировать незнакомые поля и не разбирать ответ как фиксированный полный набор полей.
Тело ответа
{
"id": "msg_011CevNtsfivFKb6YP3WcL7A",
"model": "claude-haiku-4-5-20251001",
"object": "chat.completion",
"created": 1789071575,
"choices": [
{
"index": 0,
"message": { "role": "assistant", "content": "你好" },
"finish_reason": "stop"
}
],
"usage": {
"prompt_tokens": 20587,
"completion_tokens": 6,
"total_tokens": 20593
}
}Потоковый ответ (в тело запроса добавляется "stream": true, ответ имеет тип text/event-stream):
data: {"choices":[{"delta":{"content":"这是"}}]}
data: {"choices":[{"delta":{"content":"模型输出"}}]}
data: [DONE]Клиент должен читать поток до [DONE]; промежуточные слои не должны кэшировать потоковый ответ или склеивать его в дублирующееся содержимое. Последний блок данных может содержать только usage, и тогда choices может быть пустым.
Рассуждающие модели могут вернуть пустое содержимое
Некоторые рассуждающие модели расходуют квоту вывода в первую очередь на скрытые рассуждения. На практике при запросе к gpt-5-nano со слишком малым max_tokens HTTP возвращает 200, но message.content пуст, finish_reason равен length, а usage.completion_tokens_details.reasoning_tokens равен лимиту вывода. В этом случае увеличьте квоту или перейдите на нерассуждающую текстовую модель; нельзя считать пустую строку сбоем модели или ошибкой интерфейса.
Пример для сервера
const response = await fetch('https://locopalai.com/v1/chat/completions', {
method: 'POST',
headers: {
Authorization: `Bearer ${process.env.LOCOPAL_API_KEY}`,
'Content-Type': 'application/json',
},
body: JSON.stringify({
model: '从 /v1/models 选择的模型 ID',
messages: [{ role: 'user', content: '写一条产品简介。' }],
}),
})
if (!response.ok) throw new Error(await response.text())
const data = await response.json()Не помещайте API Key в код браузера; запросы фронтенда должны сначала поступать на ваш бизнес-бэкенд, а затем перенаправляться им.
Ответ с ошибкой
{
"error": {
"code": "model_not_found",
"message": "No available channel for model xxx under group xxx (distributor) (request id: ...)",
"type": "new_api_error"
}
}| HTTP | Ответ / причина | Действие |
|---|---|---|
400 | {"error":{"code":"","message":"Model name not specified, model name cannot be empty (request id: ...)","type":"new_api_error"}} | В теле запроса отсутствует model |
401 | Invalid token | API Key отсутствует, указан неверно или истёк |
503 | {"error":{"code":"model_not_found","message":"No available channel for model ..."}} | В текущей группе нет доступного канала для этой модели; выберите модель того же типа или обратитесь в поддержку платформы |
429 | Превышена частота запросов | Повторите с задержкой |
Полное описание см. в разделе Коды ошибок и диагностика.
