Эндпоинты моделей
Справочник запросов и ответов для Messages, Chat Completions, Responses, Gemini и списка моделей в Half Off Dev с заголовками, которые принимает каждый эндпоинт.
Это собственные эндпоинты вендоров, отвечающие по адресу https://halfoff.dev. Тела запросов следуют схеме каждого вендора и передаются без изменений, поэтому в справочнике собраны параметры, которые нужны чаще всего, а за остальным мы отсылаем к документации вендоров. Поведение, общее для всех эндпоинтов, например переключение каналов и кеширование, описано в разделе Как работает шлюз.
Любой эндпоинт принимает ваш ключ как Authorization: Bearer, x-api-key, x-goog-api-key или параметр запроса ?key=. Ошибки используют формат вызванного эндпоинта; см. Ошибки.
Response headers
x-halfoff-request-idstringId вызова, например req_6f1c0b9e2d4a47a1b8c3d5e7, он же указан в Логах. Отправляется в успешных ответах и в ошибках ёмкости 429 и 502.
x-halfoff-groupstringГруппа каналов, которая ответила.
x-halfoff-channelstringМетка канала этой группы в URL-кодировке.
x-halfoff-queued-msintegerМиллисекунды ожидания ёмкости. Отсутствует, если ожидания не было.
retry-afterintegerСколько секунд подождать. Отправляется с ответами 429 из-за лимитов ключа или занятой ёмкости.
Список моделей#
/v1/modelsВозвращает все модели, которые можно вызвать прямо сейчас, с контекстным окном, ценами и группами каналов, которые их обслуживают. Ключ не нужен. Формат совместим с models.list() в SDK OpenAI и Anthropic. Цены — это то, что списывает Half Off Dev, то есть половина официальной цены. Подробности полей в разделе Модели и цены.
Response fields
dataarrayОдна запись на модель.
has_morebooleanВсегда false: полный список приходит в одном ответе.
curl https://halfoff.dev/v1/models{
"object": "list",
"data": [
{
"id": "claude-sonnet-5.5",
"object": "model",
"type": "model",
"display_name": "Claude Sonnet 5.5",
"created": 1700000000,
"created_at": "2025-01-01T00:00:00Z",
"owned_by": "Anthropic",
"context_length": 1000000,
"pricing": {
"input": 1,
"output": 5,
"cache_read": 0.05,
"cache_write": 1.25,
"unit": "USD per 1M tokens"
},
"groups": ["claude-value"]
}
],
"has_more": false,
"first_id": "claude-fable-5.1",
"last_id": "gpt-5.6-luna"
}Создание сообщения#
/v1/messagesAnthropic Messages API. Укажите stream, чтобы получать серверные события. Расширенное мышление, использование инструментов и кеширование промптов работают точно так, как описывает Anthropic. Руководство: Anthropic Messages.
Headers
x-api-keystringОбязательноВаш ключ Half Off Dev. Authorization: Bearer тоже принимается.
anthropic-versionstringПо умолчанию 2023-06-01Передаётся модели.
anthropic-betastringПередаётся без изменений.
x-halfoff-groupstringГруппа каналов для этого вызова, например claude-value. Игнорируется, если ключ привязан к группе.
x-session-idstringСтабильный id диалога, чтобы каждый ход шёл на канал, где лежит его кеш.
Body parameters
modelstringОбязательноId модели из GET /v1/models, например claude-sonnet-5.5. Варианты вроде claude-sonnet-5-5 разрешаются в ту же модель.
messagesarrayОбязательноДиалог на данный момент, чередующиеся ходы user и assistant.
max_tokensintegerОбязательноМаксимум токенов, которые может сгенерировать модель.
systemstring or arrayСистемный промпт. Текстовые блоки принимают cache_control.
streambooleanПо умолчанию falseПередавать ответ серверными событиями.
thinkingobjectНастройки расширенного мышления.
output_configobjectНастройки вывода, например effort и format.
toolsarrayИнструменты, которые может вызывать модель.
tool_choiceobjectКак модель выбирает инструмент.
metadataobjectМетаданные запроса.
curl https://halfoff.dev/v1/messages \
-H "x-api-key: $HALFOFF_API_KEY" \
-H "anthropic-version: 2023-06-01" \
-H "content-type: application/json" \
-d '{
"model": "claude-sonnet-5.5",
"max_tokens": 512,
"messages": [{"role": "user", "content": "Suggest a name for a budget tracking app."}]
}'{
"id": "msg_01XFDUDYJgAACzvnptvVoYEL",
"type": "message",
"role": "assistant",
"model": "claude-sonnet-5-5",
"content": [
{"type": "text", "text": "How about \"Pennywise\"?"}
],
"stop_reason": "end_turn",
"stop_sequence": null,
"usage": {
"input_tokens": 16,
"cache_creation_input_tokens": 0,
"cache_read_input_tokens": 0,
"output_tokens": 9
}
}Подсчёт токенов сообщения#
/v1/messages/count_tokensОценивает, сколько входных токенов использовал бы запрос Messages, не выполняя его. Бесплатно и работает даже при нулевом балансе. Число приблизительное: подходит для проверки контекстного окна и планирования бюджета, а фактическое списание определяется usage настоящего вызова. См. руководство Anthropic по подсчёту токенов.
Headers
x-api-keystringОбязательноВаш ключ Half Off Dev. Authorization: Bearer тоже принимается.
x-halfoff-groupstringГруппа каналов, в которой нужно проверить модель. Игнорируется, если ключ привязан к группе.
Body parameters
modelstringОбязательноId модели, как для POST /v1/messages.
messagesarrayОбязательноСообщения для подсчёта.
systemstring or arrayСистемный промпт, который нужно учесть.
toolsarrayОпределения инструментов, которые нужно учесть.
curl https://halfoff.dev/v1/messages/count_tokens \
-H "x-api-key: $HALFOFF_API_KEY" \
-H "anthropic-version: 2023-06-01" \
-H "content-type: application/json" \
-d '{"model": "claude-sonnet-5.5",
"messages": [{"role": "user", "content": "How long is this prompt?"}]}'{
"input_tokens": 15
}Создание chat completion#
/v1/chat/completionsOpenAI Chat Completions API. В этом формате отвечает любая модель из GET /v1/models, включая Claude и Gemini. Потоковые запросы всегда получают stream_options.include_usage: true, так что последний фрагмент содержит usage. Руководство: OpenAI Chat Completions.
Headers
AuthorizationstringОбязательноBearer и ваш ключ Half Off Dev.
openai-betastringПередаётся без изменений.
x-halfoff-groupstringГруппа каналов для этого вызова, например gpt-value. Игнорируется, если ключ привязан к группе.
x-session-idstringСтабильный id диалога, чтобы каждый ход шёл на канал, где лежит его кеш.
Body parameters
modelstringОбязательноId модели из GET /v1/models, например gpt-6.1-sol.
messagesarrayОбязательноДиалог на данный момент: сообщения system или developer, user, assistant и tool.
streambooleanПо умолчанию falseПередавать серверные события, завершающиеся data: [DONE].
max_completion_tokensintegerПредел генерируемых токенов, включая токены рассуждений.
reasoning_effortstringНасколько усердно думает модель с рассуждением. Допустимые значения зависят от модели.
toolsarrayФункции, которые может вызывать модель.
tool_choicestring or objectКак модель выбирает функцию.
response_formatobjectЗапросить вывод в JSON или по JSON Schema.
prompt_cache_keystringПовышает долю попаданий в кеш; используется также как id диалога для маршрутизации.
userstringId вашего конечного пользователя. Используется как id диалога, если не передано ничего более конкретного.
curl https://halfoff.dev/v1/chat/completions \
-H "Authorization: Bearer $HALFOFF_API_KEY" \
-H "content-type: application/json" \
-d '{
"model": "gpt-6.1-sol",
"messages": [{"role": "user", "content": "Translate \"good morning\" into French."}]
}'{
"id": "chatcmpl-B9MHDbslfkBeAs8l4bebGdFOJ6PeG",
"object": "chat.completion",
"created": 1791700000,
"model": "gpt-6.1-sol",
"choices": [
{
"index": 0,
"message": {"role": "assistant", "content": "Bonjour."},
"finish_reason": "stop"
}
],
"usage": {
"prompt_tokens": 15,
"completion_tokens": 3,
"total_tokens": 18,
"prompt_tokens_details": {"cached_tokens": 0},
"completion_tokens_details": {"reasoning_tokens": 0}
}
}Создание ответа#
/v1/responsesOpenAI Responses API, который использует Codex CLI. Только модели GPT; любая другая модель возвращает 404. Между вызовами ничего не сохраняется, поэтому каждый раз отправляйте весь диалог в input. Руководство: OpenAI Chat Completions.
Headers
AuthorizationstringОбязательноBearer и ваш ключ Half Off Dev.
openai-betastringПередаётся без изменений.
x-halfoff-groupstringГруппа каналов для этого вызова, например gpt-value. Игнорируется, если ключ привязан к группе.
x-session-idstringСтабильный id диалога, чтобы каждый ход шёл на канал, где лежит его кеш.
Body parameters
modelstringОбязательноId модели GPT из GET /v1/models, например gpt-6.1-sol.
inputstring or arrayОбязательноПромпт или диалог в виде списка входных элементов.
instructionsstringСистемные инструкции. Ответ возвращает их обратно или null.
streambooleanПо умолчанию falseПередавать типизированные серверные события, завершающиеся response.completed, который содержит usage.
max_output_tokensintegerПредел генерируемых токенов, включая токены рассуждений.
reasoningobjectНастройки рассуждения, например effort. Допустимые значения зависят от модели.
toolsarrayФункции и другие инструменты, которые может вызывать модель.
storebooleanОтправляйте false: ответы не сохраняются для последующего получения.
prompt_cache_keystringПовышает долю попаданий в кеш; используется также как id диалога для маршрутизации.
curl https://halfoff.dev/v1/responses \
-H "Authorization: Bearer $HALFOFF_API_KEY" \
-H "content-type: application/json" \
-d '{
"model": "gpt-6.1-sol",
"input": "Give me a one-line git tip.",
"store": false
}'Генерация контента#
/v1beta/models/{model}:generateContentGemini API. Руководство: Gemini.
Path parameters
modelstringОбязательноId модели, например gemini-3.1-pro. Написания Google вроде gemini-3.1-pro-preview разрешаются в ту же модель.
Headers
x-goog-api-keystringОбязательноВаш ключ Half Off Dev. Authorization: Bearer или параметр запроса ?key= тоже работают.
x-halfoff-groupstringГруппа каналов для этого вызова, например gemini-value. Игнорируется, если ключ привязан к группе.
x-session-idstringСтабильный id диалога, чтобы каждый ход шёл на канал, где лежит его кеш.
Body parameters
contentsarrayОбязательноДиалог на данный момент в виде ходов user и model, составленных из parts.
systemInstructionobjectСистемная инструкция в виде объекта контента с текстовыми частями.
generationConfigobjectНастройки вывода: maxOutputTokens, temperature, responseMimeType, thinkingConfig и другие.
toolsarrayОбъявления функций и другие инструменты.
toolConfigobjectКак модель выбирает функции.
safetySettingsarrayПороги безопасности по категориям.
curl "https://halfoff.dev/v1beta/models/gemini-3.1-pro:generateContent" \
-H "x-goog-api-key: $HALFOFF_API_KEY" \
-H "content-type: application/json" \
-d '{"contents": [{"role": "user", "parts": [{"text": "What is a haiku?"}]}]}'{
"candidates": [
{
"content": {"role": "model", "parts": [{"text": "A haiku is a three-line Japanese poem of 5, 7 and 5 syllables."}]},
"finishReason": "STOP",
"index": 0
}
],
"usageMetadata": {
"promptTokenCount": 5,
"candidatesTokenCount": 18,
"thoughtsTokenCount": 84,
"totalTokenCount": 107
},
"responseId": "mFHoaNC1Lo3HqtsP"
}Потоковая генерация контента#
/v1beta/models/{model}:streamGenerateContentТот же запрос, что и generateContent, но ответ приходит потоком. Добавьте alt=sse, чтобы получать серверные события, по одному частичному ответу на событие; SDK добавляют его сами. Без него вы получите один JSON-массив, передаваемый по частям. См. Потоковая передача.
Query parameters
altstringsse для серверных событий. Рекомендуется.
Параметр пути, заголовки и тело такие же, как в Генерации контента.
curl -N "https://halfoff.dev/v1beta/models/gemini-3-flash:streamGenerateContent?alt=sse" \
-H "x-goog-api-key: $HALFOFF_API_KEY" \
-H "content-type: application/json" \
-d '{"contents": [{"role": "user", "parts": [{"text": "List three primary colors."}]}]}'data: {"candidates":[{"content":{"role":"model","parts":[{"text":"Red, yellow"}]}}],"usageMetadata":{"promptTokenCount":6,"candidatesTokenCount":3,"totalTokenCount":9}}
data: {"candidates":[{"content":{"role":"model","parts":[{"text":" and blue."}]},"finishReason":"STOP"}],"usageMetadata":{"promptTokenCount":6,"candidatesTokenCount":6,"totalTokenCount":12}}Подсчёт токенов Gemini#
/v1beta/models/{model}:countTokensОценивает число токенов в contents, не запуская модель. Бесплатно и работает даже при нулевом балансе. Число приблизительное. Справочник Gemini.
Body parameters
contentsarrayОбязательноКонтент для подсчёта в том же формате, что и для generateContent.
Параметр пути и заголовки такие же, как в Генерации контента.
curl "https://halfoff.dev/v1beta/models/gemini-3.1-pro:countTokens" \
-H "x-goog-api-key: $HALFOFF_API_KEY" \
-H "content-type: application/json" \
-d '{"contents": [{"role": "user", "parts": [{"text": "How long is this prompt?"}]}]}'{
"totalTokens": 7
}Список моделей в формате Gemini#
/v1beta/modelsПеречисляет модели, доступные через эндпоинты Gemini, в формате Gemini API. Ключ не нужен. Google Gen AI SDK вызывают его из models.list(). Цены есть только в GET /v1/models.
curl https://halfoff.dev/v1beta/models{
"models": [
{
"name": "models/gemini-3.1-pro",
"displayName": "Gemini 3.1 Pro",
"inputTokenLimit": 1048576,
"supportedGenerationMethods": ["generateContent", "streamGenerateContent", "countTokens"]
}
]
}