Перейти к основному содержанию
LocoPal AiLocoPal Ai
Подключение к APIИнтерфейсы моделей и генерации

Руководство

Модели и текстовый интерфейс

Запрос списка доступных моделей, правила запросов и ответов для текстового диалога (включая потоковый режим)

Показать Markdown

Модели и текстовый интерфейс

Каталог моделей и текстовый диалог используют один и тот же платформенный API Key. Общие соглашения (базовый адрес, аутентификация, ограничение частоты запросов, повторные попытки) см. в разделе Аутентификация и базовые соглашения.

Получение списка моделей

GET/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"

Параметры ответа

ПараметрТипОписание
objectstringВсегда list
successbooleantrue при успешном запросе
dataarrayСписок моделей, доступных текущему ключу
data[].idstringID модели; указывайте его как есть при отправке запросов
data[].objectstringВсегда model
data[].createdintegerВремя записи в каталоге (Unix-секунды)
data[].owned_bystringИдентификатор провайдера модели, носит справочный характер
data[].supported_endpoint_typesstring[]Типы интерфейсов, доступные для этой модели

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"}}Ошибка запроса каталога; сохраните идентификатор запроса и повторите

Текстовый диалог

POST/v1/chat/completions

Способ аутентификации

Authorization: Bearer <API_KEY>.

Тело запроса · application/json

ПараметрТипОбязательноОписание
modelstringДаID текстовой модели, возвращённый /v1/models
messagesarrayДаСообщения в хронологическом порядке
messages[].rolestringДаsystem, user или assistant
messages[].contentstringДаСодержимое текущего сообщения
streambooleanНетПри true используется потоковый ответ SSE, завершение — по [DONE]
temperaturenumberНетПоддержка зависит от фактических возможностей текущей модели
max_tokensintegerНетПоддержка зависит от фактических возможностей текущей модели

Пример запроса

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

Параметры ответа

ПараметрТипОписание
idstringИдентификатор этого ответа, используется для диагностики и сверки
objectstringПри не потоковом режиме — chat.completion
createdintegerВремя ответа (Unix-секунды)
modelstringID модели, использованной в этом запросе
choicesarrayСписок результатов
choices[].indexintegerПорядковый номер результата
choices[].message.rolestringВсегда assistant
choices[].message.contentstringСгенерированный текст
choices[].finish_reasonstringПричина завершения; length означает усечение по длине
usage.prompt_tokensintegerОбъём входных данных
usage.completion_tokensintegerОбъём выходных данных
usage.total_tokensintegerОбщий объём
choices[].message.refusalstring / nullПояснение при отказе модели от содержимого; для обычного ответа обычно null
choices[].message.annotationsarrayДополнительные пометки модели, могут быть пустыми

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
401Invalid tokenAPI Key отсутствует, указан неверно или истёк
503{"error":{"code":"model_not_found","message":"No available channel for model ..."}}В текущей группе нет доступного канала для этой модели; выберите модель того же типа или обратитесь в поддержку платформы
429Превышена частота запросовПовторите с задержкой

Полное описание см. в разделе Коды ошибок и диагностика.

Эта страница была полезной?

На этой странице