Cotizaciones y compatibilidad
Confirma el precio exacto antes de llamar a la API.
Guarda la solicitud completa en request.json según el esquema actual del modelo: model, input y callBackUrl opcional. La cotización no crea tareas ni reserva saldo. Vincula la identidad, el modelo y la solicitud durante cinco minutos.
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 y quantity son cadenas decimales; currency es USD. Muestra el importe, el máximo y expiresAt. Tras la confirmación, envía la misma solicitud con quoteId y expectedCost. Los cambios de entrada, caducidad o precio devuelven 40901 al aceptar una solicitud nueva: vuelve a cotizar y confirmar.
Si se pierde la respuesta, reutiliza el Idempotency-Key original; no crees otra tarea con una clave nueva. Una solicitud ya aceptada puede repetirse tras caducar la cotización. La tarifa final figura en cost y settled de recordInfo; una estimación o el final del texto no acreditan la liquidación.
SDK, CLI y MCP
CLI tasks create cotiza antes de confirmar; el modo no interactivo exige --yes explícito. MCP spicyapi_task_quote solo cotiza. spicyapi_task_create vincula la cotización al estado firmado y pide confirmación al usuario mediante el protocolo. El agente no debe confirmar por él.
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" --waitCompatibilidad de texto y video
La URL base del formato OpenAI es https://api.spicyapi.ai/v1; en los SDK de Anthropic y Google GenAI, indica https://api.spicyapi.ai como URL base y ellos añaden /v1 o /v1beta por su cuenta. Todas las API compatibles usan la misma clave API, en la cabecera Authorization: Bearer; también se aceptan x-api-key, la que usa el SDK de Anthropic, y x-goog-api-key, la del SDK de Google GenAI. En cambio, ?key= en la URL no se acepta. Selecciona un modelo chat exacto del catálogo actual; las llamadas a herramientas, los mensajes con imágenes y los parámetros de generación dependen del esquema del modelo. Las respuestas siguen el formato del protocolo correspondiente, sin la envoltura JSON de la plataforma. La correspondencia de parámetros de cada protocolo, cómo termina el flujo y la forma de los errores se explican en Texto y streaming.
| Protocolo | Ruta |
|---|---|
| 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 |
Los modelos Chat que muestran texto de razonamiento pueden devolver la cadena opcional message.reasoning_content, o delta.reasoning_content en streaming. Al continuar después de una llamada a herramientas, puedes conservarla en el mensaje assistant correspondiente si el esquema actual del modelo lo admite. usage.completion_tokens_details.reasoning_tokens solo indica la parte de razonamiento de los tokens de salida y ya está incluido en completion_tokens; no lo sumes de nuevo. No todos los modelos devuelven razonamiento ni detalles de tokens.
Responses necesita toda la conversación en input; previous_response_id no es compatible. Videos recibe JSON con model, prompt, input_reference, seconds y size. El endpoint content redirige con HTTP 302 a una URL firmada temporal. Consulta todos los campos y estados en OpenAPI.
Los datos de cotización quoteId y expectedCost se aplican a jobs/createTask y jobs/stream. Las API compatibles /v1 y /v1beta usan el precio vigente al aceptar la solicitud. Usa la API nativa de tareas cuando necesites confirmar un límite de cargo.
Streaming con el cliente oficial de OpenAI
Para Chat Completions, usa directamente el cliente oficial openai. @spicyapi/sdk gestiona tareas nativas, cotizaciones y subidas. Instala openai por separado y ejecuta el ejemplo en tu servidor, con el ID exacto de un modelo de chat disponible y una clave de idempotencia persistente por acción del usuario.
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();
}La señal de cancelación cubre la conexión y toda la lectura del flujo. Interrumpirlo detiene la recepción local; no cancela una tarea aceptada ni garantiza un reembolso. Sin streaming, usa stream: false y lee choices[0].message.content. Une los fragmentos de llamadas a herramientas por index, conserva el mensaje assistant completo y añade después los resultados con su tool_call_id. Activa herramientas y campos de razonamiento solo si el schema del modelo los admite.
CLI y MCP envían y siguen tareas nativas; no ofrecen streaming de tokens de chat. Usa este cliente para una interfaz en directo, o jobs/stream si necesitas confirmar una cotización.
Contrato Spicy Schema
Solicitud común, campos canónicos, esquema de formulario, estados asíncronos, errores, almacenamiento de resultados y compatibilidad.
Texto y streaming
Llama a modelos de texto con el formato oficial de OpenAI, Anthropic o Google Gemini y gestiona bien conversaciones, herramientas, streaming y costos.

