spicyapiДокументация
Основное содержимое

Расчёт цены и совместимость

Подтвердите точную цену до вызова 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.json

estimatedCost, 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-обёртки платформы. Соответствие параметров, завершение потока и формат ошибок для каждого протокола описаны в разделе Текст и потоковые ответы.

ПротоколМетод
ModelsGET /v1/models
Chat CompletionsPOST /v1/chat/completions
ResponsesPOST /v1/responses
MessagesPOST /v1/messages
Gemini generateContentPOST /v1beta/models/{model}:generateContent
Gemini streamGenerateContentPOST /v1beta/models/{model}:streamGenerateContent
VideosPOST /v1/videos
Video statusGET /v1/videos/{videoId}
Video contentGET /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 задач.

OpenAPI · API

Потоковый ответ через официальный клиент OpenAI

Для Chat Completions используйте официальный клиент openai напрямую. @spicyapi/sdk обслуживает нативные задачи, оценки и загрузки. Установите openai отдельно и запускайте пример на своём сервере с точным ID доступной чат-модели и сохранённым ключом идемпотентности для каждого действия пользователя.

npm install openai
import 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.

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