Расчёт цены и совместимость
Подтвердите точную цену до вызова API.
Сохраните полный запрос в request.json по актуальной схеме модели: model, input и необязательный callBackUrl. Расчёт не создаёт задачу и не резервирует деньги. Он привязан к пользователю, модели и запросу на пять минут.
curl https://api.spicyapi.ai/api/v1/jobs/quote \
-H "Authorization: Bearer $SPICY_API_KEY" \
-H "Content-Type: application/json" \
--data-binary @request.jsonestimatedCost, maxCharge и quantity — десятичные строки; currency равна USD. Покажите сумму, предел списания и expiresAt. После подтверждения отправьте тот же запрос с quoteId и expectedCost. Изменение входных данных, истечение срока или новая цена дают 40901 при новом принятии: получите и подтвердите новый расчёт.
При потере ответа используйте исходный Idempotency-Key, не создавая вторую задачу с новым ключом. Уже принятый запрос можно повторить после истечения расчёта. Итоговое списание проверяется по cost и settled в recordInfo. Предварительная оценка или завершение текстового потока не подтверждают окончательный расчёт.
SDK, CLI и MCP
CLI tasks create получает цену перед подтверждением; без диалога требуется явный --yes. MCP spicyapi_task_quote только рассчитывает цену. spicyapi_task_create связывает её с подписанным состоянием и запрашивает подтверждение пользователя по протоколу. Агент не должен подтверждать вместо пользователя.
spicyapi tasks quote --model "$SPICY_MODEL" --input-file input.json
spicyapi tasks create --model "$SPICY_MODEL" --input-file input.json \
--idempotency-key "$SPICY_IDEMPOTENCY_KEY" --waitСовместимость текста и видео
Базовый URL для формата OpenAI — https://api.spicyapi.ai/v1. В SDK Anthropic и Google GenAI укажите базовый URL https://api.spicyapi.ai — они сами добавляют /v1 или /v1beta. Все совместимые API работают с одним и тем же API-ключом. Передавайте его в заголовке Authorization: Bearer; также принимаются x-api-key, который использует SDK Anthropic, и x-goog-api-key, который использует SDK Google GenAI. Параметр ?key= в URL не принимается. Выберите точную chat-модель из актуального каталога. Инструменты, сообщения с изображениями и параметры генерации зависят от схемы модели. Ответы имеют формат соответствующего протокола, без JSON-обёртки платформы. Соответствие параметров, завершение потока и формат ошибок для каждого протокола описаны в разделе Текст и потоковые ответы.
| Протокол | Метод |
|---|---|
| Models | GET /v1/models |
| Chat Completions | POST /v1/chat/completions |
| Responses | POST /v1/responses |
| Messages | POST /v1/messages |
| Gemini generateContent | POST /v1beta/models/{model}:generateContent |
| Gemini streamGenerateContent | POST /v1beta/models/{model}:streamGenerateContent |
| Videos | POST /v1/videos |
| Video status | GET /v1/videos/{videoId} |
| Video content | GET /v1/videos/{videoId}/content |
Модели Chat, предоставляющие текст рассуждений, могут вернуть необязательную строку message.reasoning_content, а при потоковой передаче — delta.reasoning_content. Продолжая диалог после вызова инструмента, можно сохранить её в соответствующем сообщении assistant, если это поддерживает актуальная схема модели. usage.completion_tokens_details.reasoning_tokens уже входит в completion_tokens; прибавлять это значение повторно не нужно. Не все модели возвращают текст рассуждений или подробную статистику токенов.
Responses требует полный разговор в input; previous_response_id не поддерживается. Videos принимает JSON с model, prompt, input_reference, seconds и size. Метод content перенаправляет кодом 302 на краткосрочный подписанный URL. Все поля и состояния описаны в OpenAPI.
quoteId и expectedCost применяются к jobs/createTask и jobs/stream. Совместимые API /v1 и /v1beta используют цену на момент принятия. Для подтверждённого предела списания используйте нативный API задач.
Потоковый ответ через официальный клиент OpenAI
Для Chat Completions используйте официальный клиент openai напрямую. @spicyapi/sdk обслуживает нативные задачи, оценки и загрузки. Установите openai отдельно и запускайте пример на своём сервере с точным ID доступной чат-модели и сохранённым ключом идемпотентности для каждого действия пользователя.
npm install openaiimport OpenAI from "openai";
const client = new OpenAI({
apiKey: process.env.SPICY_API_KEY,
baseURL: "https://api.spicyapi.ai/v1",
maxRetries: 0,
});
const signal = AbortSignal.timeout(120_000);
const stream = await client.chat.completions.create({
model: process.env.SPICY_MODEL,
messages: [{ role: "user", content: "Explain a rainbow in one sentence." }],
stream: true,
stream_options: { include_usage: true },
}, {
signal,
headers: { "Idempotency-Key": process.env.SPICY_IDEMPOTENCY_KEY },
});
try {
for await (const chunk of stream) {
process.stdout.write(chunk.choices[0]?.delta.content ?? "");
if (chunk.usage) process.stderr.write(JSON.stringify(chunk.usage) + "\n");
}
} finally {
stream.controller.abort();
}Сигнал прерывания действует при подключении и на протяжении чтения потока. Прерывание останавливает локальный приём, но не отменяет принятую задачу и не гарантирует возврат. Без потока задайте stream: false и читайте choices[0].message.content. Собирайте фрагменты вызовов инструментов по index, сохраняйте полное сообщение assistant, затем добавляйте результаты с соответствующим tool_call_id. Инструменты и поля рассуждения должны поддерживаться схемой модели.
CLI и MCP отправляют и отслеживают нативные задачи, но не передают токены чата в реальном времени. Для такого интерфейса используйте этот клиент; если нужны подтверждение цены, используйте jobs/stream.
Контракт Spicy Schema
Общий запрос, канонические поля, schema формы, асинхронные состояния, ошибки, хранение результатов и совместимость.
Текст и потоковые ответы
Вызывайте текстовые модели в официальном формате OpenAI, Anthropic или Google Gemini и правильно обрабатывайте диалоги, инструменты, потоки и оплату.

