Протокол OpenAI Compatible
Протокол, совместимый с OpenAI, является наиболее широко поддерживаемым стандартом AI API в отрасли. RouteAPI полностью реализует спецификацию OpenAI API, что позволяет вам легко интегрироваться с существующими SDK, инструментами и клиентами OpenAI, просто изменив Base URL и API Key.
Обзор протокола
Section titled “Обзор протокола”OpenAI API определяет стандартизированный набор REST интерфейсов для генерации диалогов, текстовых эмбеддингов, списка моделей и других возможностей. Его основное преимущество заключается в зрелой экосистеме: официальные SDK OpenAI, LangChain, LiteLLM, Cursor и различные ассистенты для программирования нативно поддерживают этот протокол.
Область совместимости RouteAPI:
- Полная совместимость с эндпоинтами OpenAI Chat Completions, Responses, Embeddings и Models
- Единообразная аутентификация с использованием заголовков запроса
Authorization: Bearer - Единообразные форматы запросов/ответов, включая потоковую передачу SSE и структуры ошибок
- Более широкий диапазон ID моделей, можно вызывать OpenAI, Claude, Gemini, Mistral и других провайдеров
- Сохранение явных нулевых значений параметров, явно переданные
0/falseне отбрасываются
Миграция с официального OpenAI API на RouteAPI требует только двух изменений в конфигурации:
from openai import OpenAI
client = OpenAI( api_key="sk-your-routeapi-token", # Переключить на RouteAPI Token base_url="https://api.routeapi.ai/v1" # Переключить на RouteAPI Base URL)Весь остальной код остается неизменным.
Base URL
Section titled “Base URL”https://api.routeapi.ai/v1Все эндпоинты, совместимые с OpenAI, используют этот базовый URL. Если вашему клиенту или SDK требуется полный URL, просто добавьте путь эндпоинта, например, https://api.routeapi.ai/v1/chat/completions.
Аутентификация
Section titled “Аутентификация”Идентична официальному OpenAI API, с использованием HTTP заголовка запроса Authorization:
Authorization: Bearer sk-your-routeapi-tokenContent-Type: application/jsonRouteAPI токены начинаются с sk- и генерируются на странице API Keys в консоли. Храните токены на стороне сервера и не раскрывайте их в браузерах, мобильных приложениях или публичных репозиториях.
Обзор поддерживаемых эндпоинтов
Section titled “Обзор поддерживаемых эндпоинтов”| Эндпоинт | Назначение | Подробная документация |
|---|---|---|
/v1/chat/completions | Генерация диалогов, поддерживает многооборотные диалоги, вызовы инструментов, структурированный вывод | Chat Completions |
/v1/responses | Протокол OpenAI Responses, подходит для агентов программирования и фреймворков приложений нового поколения | Responses |
/v1/embeddings | Векторные эмбеддинги текста для семантического поиска, RAG, расчета сходства | Embeddings |
/v1/models | Получить список моделей, доступных для текущей учетной записи | Ниже на этой странице |
Сравнение вариантов использования
Section titled “Сравнение вариантов использования”| Сценарий | Рекомендуемый эндпоинт | Причина |
|---|---|---|
| Общий чат, Q&A, резюмирование, классификация | /v1/chat/completions | Наиболее зрелая экосистема, самая широкая совместимость |
| Агенты программирования (Cursor, Claude Code, Copilot) | /v1/responses или /v1/chat/completions | Зависит от протокола, нативно поддерживаемого клиентом |
| Многооборотный диалог, история разговоров | /v1/chat/completions | Массив messages естественно поддерживает несколько раундов |
| Вызов инструментов, вызов функций | /v1/chat/completions | Наиболее стандартная структура определения инструментов и передачи результатов |
| Семантический поиск, RAG, поиск документов | /v1/embeddings | Возвращает векторные представления |
| Структурированный вывод, JSON Schema | /v1/chat/completions или /v1/responses | Управляется через параметр response_format |
Конкретный выбор эндпоинта должен отдавать приоритет нативной поддержке клиента и SDK. Если клиент явно требует определенный протокол, следуйте требованиям клиента.
Конфигурация SDK
Section titled “Конфигурация SDK”OpenAI Python SDK
Section titled “OpenAI Python SDK”Установка:
pip install openaiНастройка RouteAPI:
import osfrom openai import OpenAI
client = OpenAI( api_key=os.environ["ROUTEAPI_KEY"], base_url="https://api.routeapi.ai/v1")
response = client.chat.completions.create( model="gpt-5.5", messages=[ {"role": "user", "content": "Пожалуйста, представьте RouteAPI одним предложением"} ])
print(response.choices[0].message.content)Необходимо установить только параметры api_key и base_url; весь остальной код идентичен официальному API.
OpenAI Node.js SDK
Section titled “OpenAI Node.js SDK”Установка:
npm install openaiНастройка RouteAPI:
import OpenAI from 'openai';
const client = new OpenAI({ apiKey: process.env.ROUTEAPI_KEY, baseURL: 'https://api.routeapi.ai/v1'});
const response = await client.chat.completions.create({ model: 'gpt-5.5', messages: [ { role: 'user', content: 'Пожалуйста, представьте RouteAPI одним предложением' } ]});
console.log(response.choices[0].message.content);LangChain
Section titled “LangChain”Класс ChatOpenAI в LangChain поддерживает настраиваемый base_url:
from langchain_openai import ChatOpenAI
llm = ChatOpenAI( model="gpt-5.5", openai_api_key=os.environ["ROUTEAPI_KEY"], openai_api_base="https://api.routeapi.ai/v1")
response = llm.invoke("Пожалуйста, представьте RouteAPI одним предложением")print(response.content)LiteLLM
Section titled “LiteLLM”Функция completion() в LiteLLM поддерживает настраиваемый api_base:
import litellm
response = litellm.completion( model="gpt-5.5", messages=[{"role": "user", "content": "Пожалуйста, представьте RouteAPI одним предложением"}], api_key=os.environ["ROUTEAPI_KEY"], api_base="https://api.routeapi.ai/v1")
print(response.choices[0].message.content)Другие совместимые клиенты
Section titled “Другие совместимые клиенты”Любой клиент, инструмент или фреймворк, поддерживающий OpenAI API, может интегрироваться с RouteAPI через следующую конфигурацию:
- API Key установить на RouteAPI Token (начинается с
sk-) - Base URL установить на
https://api.routeapi.ai/v1 - Model ID использовать имена моделей, поддерживаемые RouteAPI (запрос через
/v1/models)
Основные параметры запроса
Section titled “Основные параметры запроса”Основные эндпоинты протокола, совместимого с OpenAI, имеют общий набор ключевых параметров. Ниже приведена справочная таблица для общих параметров; подробные объяснения находятся в специальной документации каждого эндпоинта.
Параметры Chat Completions
Section titled “Параметры Chat Completions”| Параметр | Тип | Обязательный | Описание |
|---|---|---|---|
model | string | Да | ID модели, должна быть доступна для текущей учетной записи |
messages | array | Да | Список сообщений диалога, каждое сообщение содержит role и content |
stream | boolean | Нет | Использовать ли потоковый вывод SSE, по умолчанию false |
temperature | number | Нет | Температура выборки, диапазон от 0 до 2, по умолчанию 1 |
top_p | number | Нет | Параметр nucleus sampling, диапазон от 0 до 1 |
max_tokens | number | Нет | Максимальное количество выходных токенов (устаревшее имя параметра, все еще требуется некоторыми моделями) |
max_completion_tokens | number | Нет | Максимальное количество выходных токенов (новое имя параметра) |
tools | array | Нет | Список определений инструментов для вызова функций |
tool_choice | string/object | Нет | Стратегия выбора инструмента (auto / required / none / конкретный инструмент) |
response_format | object | Нет | Ограничение формата вывода (режим JSON / JSON Schema) |
stream_options | object | Нет | Дополнительные опции потоковой передачи, такие как include_usage |
stop | string/array | Нет | Пользовательские последовательности остановки |
presence_penalty | number | Нет | Штраф за присутствие, диапазон от -2 до 2 |
frequency_penalty | number | Нет | Штраф за частоту, диапазон от -2 до 2 |
user | string | Нет | Идентификатор конечного пользователя для обнаружения злоупотреблений |
Для подробных объяснений и дополнительных параметров обратитесь к документации Chat Completions.
Параметры Embeddings
Section titled “Параметры Embeddings”| Параметр | Тип | Обязательный | Описание |
|---|---|---|---|
model | string | Да | ID модели эмбеддингов |
input | string/array | Да | Текст для встраивания, поддерживает одну строку или массив строк |
encoding_format | string | Нет | Формат возврата, float (по умолчанию) или base64 |
dimensions | number | Нет | Размерность выходного вектора, зависит от поддержки модели |
user | string | Нет | Идентификатор конечного пользователя |
Для подробных объяснений обратитесь к документации Embeddings.
Форматы ответов
Section titled “Форматы ответов”Стандартный ответ (не потоковый)
Section titled “Стандартный ответ (не потоковый)”Пример стандартного ответа Chat Completions:
{ "id": "chatcmpl_xxx", "object": "chat.completion", "created": 1730000000, "model": "gpt-5.5", "choices": [ { "index": 0, "message": { "role": "assistant", "content": "RouteAPI — это API-шлюз, объединяющий доступ к нескольким провайдерам моделей AI." }, "finish_reason": "stop" } ], "usage": { "prompt_tokens": 24, "completion_tokens": 18, "total_tokens": 42 }}Ключевые поля:
choices[0].message.content— текстовый ответ моделиchoices[0].finish_reason— причина завершения (stop/length/tool_calls/content_filter)usage— статистика использования токенов
Потоковый ответ (SSE)
Section titled “Потоковый ответ (SSE)”Установка stream: true возвращает инкрементные данные в формате Server-Sent Events (SSE):
data: {"id":"chatcmpl_xxx","object":"chat.completion.chunk","created":1730000000,"model":"gpt-5.5","choices":[{"index":0,"delta":{"role":"assistant","content":""},"finish_reason":null}]}
data: {"id":"chatcmpl_xxx","object":"chat.completion.chunk","created":1730000000,"model":"gpt-5.5","choices":[{"index":0,"delta":{"content":"RouteAPI"},"finish_reason":null}]}
data: {"id":"chatcmpl_xxx","object":"chat.completion.chunk","created":1730000000,"model":"gpt-5.5","choices":[{"index":0,"delta":{"content":" —"},"finish_reason":null}]}
data: {"id":"chatcmpl_xxx","object":"chat.completion.chunk","created":1730000000,"model":"gpt-5.5","choices":[{"index":0,"delta":{},"finish_reason":"stop"}],"usage":{"prompt_tokens":24,"completion_tokens":18,"total_tokens":42}}
data: [DONE]Характеристики потокового ответа:
- Каждая строка начинается с
data:, за которой следует объект JSON - Инкрементный контент находится в
choices[0].delta.content - При завершении
finish_reasonне равенnull - Последняя строка —
data: [DONE]
Если вам нужна статистика использования токенов в потоковом режиме, установите stream_options: { "include_usage": true }, и информация об использовании будет возвращена в последнем фрагменте данных.
Ответ с ошибкой
Section titled “Ответ с ошибкой”Ответы с ошибками следуют стандартному формату OpenAI:
{ "error": { "message": "Invalid API key provided", "type": "invalid_request_error", "code": "invalid_api_key" }}Распространенные типы ошибок:
| HTTP код статуса | type | Описание |
|---|---|---|
| 401 | invalid_request_error | Недействительный или отсутствующий API Key |
| 429 | rate_limit_error | Превышен лимит скорости |
| 500 | api_error | Внутренняя ошибка сервера |
| 503 | overloaded_error | Сервис перегружен |
Для подробной обработки ошибок обратитесь к документации по обработке ошибок.
Отличия от официального OpenAI API
Section titled “Отличия от официального OpenAI API”Протокол RouteAPI, совместимый с OpenAI, полностью совместим на уровне протокола, но имеет некоторые отличия в возможностях моделей, биллинге и ограничении скорости:
Более широкий диапазон ID моделей
Section titled “Более широкий диапазон ID моделей”Официальный OpenAI API может вызывать только собственные модели OpenAI (gpt-4o, gpt-5.5 и т.д.). RouteAPI поддерживает модели от нескольких провайдеров:
- OpenAI:
gpt-4o,gpt-5.5,o3-miniи т.д. - Anthropic Claude:
claude-sonnet-4-5,claude-opus-4и т.д. - Google Gemini:
gemini-2.0-flash,gemini-2.5-proи т.д. - Mistral:
mistral-large,mistral-smallи т.д. - Другие: DeepSeek, Qwen, LLaMA и т.д.
Запросите полный список моделей, доступных для текущей учетной записи, через эндпоинт /v1/models.
Биллинг и ограничение скорости управляются RouteAPI
Section titled “Биллинг и ограничение скорости управляются RouteAPI”- Биллинг: Оплата согласно прайс-листу RouteAPI, который может отличаться от официальных цен вышестоящих провайдеров
- Ограничение скорости: Контролируется политиками ограничения скорости RouteAPI, а не лимитами вышестоящих провайдеров
- Квоты: Баланс учетной записи и квоты управляются RouteAPI, пополнение и просмотр в консоли
Поддержка параметров зависит от базовой модели
Section titled “Поддержка параметров зависит от базовой модели”Протокол, совместимый с OpenAI, определяет полный набор параметров, но фактическая поддержка зависит от выбранной модели:
| Возможность | Описание |
|---|---|
Вызов инструментов (tools) | Зависит от того, поддерживает ли модель вызов функций |
Структурированный вывод (response_format) | Зависит от того, поддерживает ли модель режим JSON или JSON Schema |
Визуальный ввод (image_url) | Зависит от того, поддерживает ли модель мультимодальный ввод |
Использование при потоковой передаче (stream_options.include_usage) | Зависит от того, поддерживают ли модель и канал статистику использования при потоковой передаче |
Управление рассуждениями (reasoning_effort) | Поддерживается только некоторыми моделями рассуждений |
Рекомендуется проверить поддержку выбранной моделью ключевых параметров в тестовой среде перед включением в продакшн.
Обработка явных нулевых значений параметров
Section titled “Обработка явных нулевых значений параметров”Это тонкое, но важное отличие. В протоколе, совместимом с OpenAI, если необязательные параметры явно переданы как 0, 0.0 или false, RouteAPI рассматривает их как явную настройку пользователя, а не отбрасывает как значения по умолчанию.
Например:
{ "model": "gpt-5.5", "messages": [...], "temperature": 0, "top_p": 1.0}Здесь temperature: 0 будет сохранен и передан вышестоящей модели, а не будет рассматриваться как неустановленный, потому что “значение равно 0”. Это гарантирует, что клиенты могут точно контролировать параметры выборки.
Если вы не хотите передавать определенный параметр, просто удалите это поле из запроса; не передавайте null или 0.
Примечания по совместимости
Section titled “Примечания по совместимости”Возможности зависят от выбранной модели
Section titled “Возможности зависят от выбранной модели”Протокол, совместимый с OpenAI, является стандартным определением интерфейса, но конкретные возможности зависят от базовой модели:
- Вызов инструментов: Требуется, чтобы модель поддерживала вызов функций, и формат определения инструмента соответствовал требованиям модели
- Структурированный вывод: Требуется, чтобы модель поддерживала режим JSON или JSON Schema
- Визуальный ввод: Требуется, чтобы модель поддерживала изображения или мультимодальный ввод
- Использование при потоковой передаче: Требуется, чтобы модель и канал поддерживали возврат использования токенов в потоковом режиме
Если запрос включает параметры, которые модель не поддерживает, поведение зависит от типа параметра:
- Игнорируемые параметры (такие как
frequency_penalty) будут тихо проигнорированы - Критические параметры (такие как
tools) могут вызвать ошибки
В продакшн рекомендуется фиксировать ID моделей и подготовить резервные стратегии для критических бизнес-потоков.
Валидация параметров и сообщения об ошибках
Section titled “Валидация параметров и сообщения об ошибках”RouteAPI выполняет базовую валидацию параметров запроса, например:
- Отсутствующие обязательные параметры (такие как
model,messages) - Неправильные типы параметров (такие как передача строки для
temperature) - Значения параметров вне диапазона (такие как
temperature: 3)
При сбое валидации возвращается 400 Bad Request с подробной информацией об ошибке. Если запрос проходит валидацию RouteAPI, но отклоняется вышестоящей моделью, возвращается 500 или 502 вместе с исходным сообщением об ошибке от вышестоящего источника.
Соображения при миграции между моделями
Section titled “Соображения при миграции между моделями”При переключении с одной модели на другую, даже если обе используют протокол, совместимый с OpenAI, необходимо обратить внимание на следующие моменты:
- Длина контекста: Разные модели имеют разную максимальную длину контекста; слишком длинные запросы могут быть отклонены
- Формат вызова инструментов: Некоторые модели имеют более строгие требования к форматам описания инструментов
- Стиль вывода: Один и тот же промпт может производить разные стили вывода, длину и форматы в разных моделях
- Подсчет токенов: Разные модели имеют разные токенизаторы; один и тот же текст может иметь разное количество токенов
- Цена биллинга: Разные модели имеют разные удельные цены; переключение моделей может повлиять на затраты
Рекомендуется проверить полный рабочий процесс в тестовой среде перед переключением моделей в продакшн.
Эндпоинт /v1/models
Section titled “Эндпоинт /v1/models”Эндпоинт /v1/models возвращает список моделей, доступных для текущей учетной записи, в формате, согласованном с официальным OpenAI API.
Пример запроса
Section titled “Пример запроса”curl https://api.routeapi.ai/v1/models \ -H "Authorization: Bearer $ROUTEAPI_KEY"Пример ответа
Section titled “Пример ответа”{ "success": true, "object": "list", "data": [ { "id": "gpt-5.5", "object": "model", "created": 1626777600, "owned_by": "openai", "supported_endpoint_types": ["openai", "openai-response"] }, { "id": "claude-sonnet-4-5", "object": "model", "created": 1626777600, "owned_by": "anthropic", "supported_endpoint_types": ["openai", "anthropic"] } ]}Возвращаемый массив data содержит модели, доступные текущему токену, а не полный каталог платформы. Каждый объект модели включает:
id— ID модели, используйте это значение при выполнении запросовobject— Фиксированное значение"model"owned_by— Тип канала, которому принадлежит модель; для собственных моделей платформы указываетсяcustomsupported_endpoint_types— Расширенное поле RouteAPI, типы эндпоинтов, доступные для этой моделиcreated— Фиксированное значение-заполнитель1626777600, это не реальное время появления модели, не используйте его для сортировки
Дополнительное поле success верхнего уровня — расширение RouteAPI; OpenAI SDK читают только data, поэтому разбор не нарушается. Порядок элементов в data не гарантируется стабильным.
Рекомендуется вызывать /v1/models один раз при запуске приложения, кэшировать список доступных моделей и избегать запросов при каждом запросе. Значения полей и правила фильтрации подробно описаны в Models.
Полные примеры
Section titled “Полные примеры”curl базовый диалог
Section titled “curl базовый диалог”curl https://api.routeapi.ai/v1/chat/completions \ -H "Authorization: Bearer $ROUTEAPI_KEY" \ -H "Content-Type: application/json" \ -d '{ "model": "gpt-5.5", "messages": [ { "role": "system", "content": "Вы строгий технический ассистент. Давайте краткие ответы." }, { "role": "user", "content": "Пожалуйста, представьте RouteAPI одним предложением" } ], "temperature": 0.7 }'Python SDK полный пример
Section titled “Python SDK полный пример”import osfrom openai import OpenAI
# Инициализация клиентаclient = OpenAI( api_key=os.environ["ROUTEAPI_KEY"], base_url="https://api.routeapi.ai/v1")
# Базовый диалогdef basic_chat(): response = client.chat.completions.create( model="gpt-5.5", messages=[ {"role": "system", "content": "Вы строгий технический ассистент."}, {"role": "user", "content": "Пожалуйста, представьте RouteAPI одним предложением"} ], temperature=0.7 ) print(response.choices[0].message.content) print(f"Использование: {response.usage.total_tokens} токенов")
# Потоковый диалогdef streaming_chat(): stream = client.chat.completions.create( model="gpt-5.5", messages=[ {"role": "user", "content": "Объясните пошагово, что такое API-шлюз"} ], stream=True, stream_options={"include_usage": True} )
for chunk in stream: if chunk.choices: delta = chunk.choices[0].delta if delta.content: print(delta.content, end="", flush=True) # Последний фрагмент содержит использование if hasattr(chunk, 'usage') and chunk.usage: print(f"\nИспользование: {chunk.usage.total_tokens} токенов")
# Вызов инструментовdef tool_calling(): tools = [ { "type": "function", "function": { "name": "get_weather", "description": "Запросить текущую погоду для указанного города", "parameters": { "type": "object", "properties": { "city": { "type": "string", "description": "Название города, например, Москва" }, "unit": { "type": "string", "enum": ["celsius", "fahrenheit"] } }, "required": ["city"] } } } ]
messages = [{"role": "user", "content": "Какая погода сейчас в Москве?"}]
# Первый раунд: модель запрашивает вызов инструмента response = client.chat.completions.create( model="gpt-5.5", messages=messages, tools=tools, tool_choice="auto" )
# Проверка на вызовы инструментов if response.choices[0].message.tool_calls: # Симуляция выполнения инструмента tool_call = response.choices[0].message.tool_calls[0] tool_result = "Москва, солнечно, температура 23 градуса Цельсия, влажность 45%."
# Построение запроса второго раунда messages.append(response.choices[0].message) messages.append({ "role": "tool", "tool_call_id": tool_call.id, "content": tool_result })
# Второй раунд: модель генерирует ответ на основе результата инструмента final_response = client.chat.completions.create( model="gpt-5.5", messages=messages, tools=tools ) print(final_response.choices[0].message.content)
# Структурированный выводdef structured_output(): response = client.chat.completions.create( model="gpt-5.5", messages=[ {"role": "user", "content": "Извлеките ключевую информацию из следующего текста: RouteAPI — это AI API-шлюз, поддерживающий OpenAI, Claude, Gemini и другие модели."} ], response_format={ "type": "json_schema", "json_schema": { "name": "key_info", "strict": True, "schema": { "type": "object", "properties": { "product_name": {"type": "string"}, "category": {"type": "string"}, "supported_models": { "type": "array", "items": {"type": "string"} } }, "required": ["product_name", "category", "supported_models"], "additionalProperties": False } } } ) print(response.choices[0].message.content)
if __name__ == "__main__": basic_chat() print("\n" + "="*50 + "\n") streaming_chat() print("\n" + "="*50 + "\n") tool_calling() print("\n" + "="*50 + "\n") structured_output()Node.js SDK полный пример
Section titled “Node.js SDK полный пример”import OpenAI from 'openai';
// Инициализация клиентаconst client = new OpenAI({ apiKey: process.env.ROUTEAPI_KEY, baseURL: 'https://api.routeapi.ai/v1'});
// Базовый диалогasync function basicChat() { const response = await client.chat.completions.create({ model: 'gpt-5.5', messages: [ { role: 'system', content: 'Вы строгий технический ассистент.' }, { role: 'user', content: 'Пожалуйста, представьте RouteAPI одним предложением' } ], temperature: 0.7 });
console.log(response.choices[0].message.content); console.log(`Использование: ${response.usage.total_tokens} токенов`);}
// Потоковый диалогasync function streamingChat() { const stream = await client.chat.completions.create({ model: 'gpt-5.5', messages: [ { role: 'user', content: 'Объясните пошагово, что такое API-шлюз' } ], stream: true, stream_options: { include_usage: true } });
for await (const chunk of stream) { if (chunk.choices[0]?.delta?.content) { process.stdout.write(chunk.choices[0].delta.content); } if (chunk.usage) { console.log(`\nИспользование: ${chunk.usage.total_tokens} токенов`); } }}
// Вызов инструментовasync function toolCalling() { const tools = [ { type: 'function', function: { name: 'get_weather', description: 'Запросить текущую погоду для указанного города', parameters: { type: 'object', properties: { city: { type: 'string', description: 'Название города, например, Москва' }, unit: { type: 'string', enum: ['celsius', 'fahrenheit'] } }, required: ['city'] } } } ];
const messages = [ { role: 'user', content: 'Какая погода сейчас в Москве?' } ];
// Первый раунд const response = await client.chat.completions.create({ model: 'gpt-5.5', messages: messages, tools: tools, tool_choice: 'auto' });
// Проверка на вызовы инструментов if (response.choices[0].message.tool_calls) { const toolCall = response.choices[0].message.tool_calls[0]; const toolResult = 'Москва, солнечно, температура 23 градуса Цельсия, влажность 45%.';
// Второй раунд messages.push(response.choices[0].message); messages.push({ role: 'tool', tool_call_id: toolCall.id, content: toolResult });
const finalResponse = await client.chat.completions.create({ model: 'gpt-5.5', messages: messages, tools: tools });
console.log(finalResponse.choices[0].message.content); }}
// Структурированный выводasync function structuredOutput() { const response = await client.chat.completions.create({ model: 'gpt-5.5', messages: [ { role: 'user', content: 'Извлеките ключевую информацию из следующего текста: RouteAPI — это AI API-шлюз, поддерживающий OpenAI, Claude, Gemini и другие модели.' } ], response_format: { type: 'json_schema', json_schema: { name: 'key_info', strict: true, schema: { type: 'object', properties: { product_name: { type: 'string' }, category: { type: 'string' }, supported_models: { type: 'array', items: { type: 'string' } } }, required: ['product_name', 'category', 'supported_models'], additionalProperties: false } } } });
console.log(response.choices[0].message.content);}
// Запуск примеровasync function main() { await basicChat(); console.log('\n' + '='.repeat(50) + '\n'); await streamingChat(); console.log('\n' + '='.repeat(50) + '\n'); await toolCalling(); console.log('\n' + '='.repeat(50) + '\n'); await structuredOutput();}
main().catch(console.error);Рекомендации по интеграции
Section titled “Рекомендации по интеграции”- Отдавайте приоритет протоколу, совместимому с OpenAI, если ваш клиент, SDK или инструмент нативно поддерживает OpenAI API
- Фиксируйте ID моделей, не полагайтесь на временные псевдонимы или отображаемые имена в продакшн
- Записывайте метаданные запросов, включая ID запроса, ID модели, код статуса, задержку и использование токенов
- Включите повторные попытки при сбоях, включите повторные попытки клиента и опции альтернативных моделей для основных бизнес-потоков
- Проверяйте необязательные возможности, сначала протестируйте вызов инструментов, структурированный вывод, визуальный ввод и другие возможности в тестовой среде
- Контролируйте расходы и квоты, регулярно проверяйте журналы использования и детали биллинга в консоли
- Защищайте API Keys, инкапсулируйте RouteAPI токены на стороне сервера и избегайте прямого раскрытия ключей бизнес-фронтендам
Если клиент поддерживает только протокол Claude Messages или Google Gemini, используйте соответствующие эндпоинты протокола; обратитесь к документации Claude Messages и Gemini API.