API
Chat Completions
Публичный эндпоинт POST /v1/chat/completions. Формат совместим с OpenAI Chat Completions и поддерживает расширения ZvenoAI: fallback по моделям, provider preferences, reasoning и мультимодальные части контента.
Базовый запрос
import OpenAI from 'openai';
const client = new OpenAI({
apiKey: process.env.ZVENOAI_API_KEY,
baseURL: 'https://api.zveno.ai/v1',
});
const completion = await client.chat.completions.create({
model: 'openai/gpt-4o',
messages: [
{ role: 'system', content: 'You are a helpful assistant.' },
{ role: 'user', content: 'Привет! Сгенерируй краткое письмо клиенту.' },
],
});
console.log(completion.choices[0].message.content);Fallback по моделям (`models`)
Если провайдер недоступен, ограничен лимитами или вернул ошибку, ZvenoAI попробует следующую модель из списка models.
{
"model": "openai/gpt-4o",
"models": [
"openai/gpt-4o",
"anthropic/claude-3.5-sonnet",
"google/gemini-2.5-pro"
],
"messages": [{ "role": "user", "content": "Привет!" }]
}Настройки провайдера (`provider`)
Поле provider задаёт правила выбора upstream-провайдера (это отдельное понятие от vendor в slug модели).
Поля max_price.prompt и max_price.completion задаются в ₽ за 1k токенов.
{
"model": "openai/gpt-4o",
"provider": {
"order": ["openrouter", "openai"],
"only": ["openrouter"],
"ignore": ["together"],
"sort": "price",
"allow_fallbacks": true,
"require_parameters": true,
"data_collection": "deny",
"zdr": true,
"quantizations": ["fp16"],
"max_price": { "prompt": 1.0, "completion": 3.0 }
},
"messages": [{ "role": "user", "content": "Сделай summary." }]
}Мультимодальные сообщения
В messages[].content можно передать строку или массив частей. Поддерживаемые части: text, image_url, input_audio.
{
"model": "openai/gpt-4o",
"messages": [
{
"role": "user",
"content": [
{ "type": "text", "text": "Что изображено на картинке?" },
{
"type": "image_url",
"image_url": { "url": "https://example.com/image.jpg", "detail": "auto" }
}
]
}
]
}Streaming (SSE)
Для потокового ответа установите stream: true. Ответ будет в формате text/event-stream с кадрами data: <json> и финальным data: [DONE].