Agentes y automatización
Guía de producción para agentes de programación con IA, workers backend y pipelines multimedia.
Clientes de referencia copiables
Ejemplos sin dependencias para descubrir modelos, crear tareas, reintentar tareas fallidas, consultar todos los estados terminales, limitar la espera y tratar la idempotencia y los errores. Una tarea aceptada no se puede cancelar.
Son ejemplos de documentación, no paquetes npm/PyPI publicados. Diez minutos es un límite local, no un SLA.
Esta guía está pensada para agentes de programación con IA y backends automatizados que integran SpicyAPI. Convierte la referencia de la API en un flujo acotado, recuperable y verificable: descubrir el contrato, validar la entrada, crear una sola vez, esperar con seguridad, confirmar el estado final y guardar los resultados antes de que caduquen.
La clave API solo debe existir en el servidor
Nunca incluyas SPICY_API_KEY en JavaScript del navegador, una app móvil, un prompt público, un repositorio ni el historial de un agente. La interfaz llama a tu backend y el backend llama a SpicyAPI. Entrega al agente una referencia como SPICY_API_KEY, no el valor del secreto.
Descubrimiento legible por máquinas
Empieza por el artefacto más pequeño que resuelva la pregunta actual. Así reduces el contexto y evitas suposiciones obsoletas.
| Ruta | Para qué sirve |
|---|---|
/agent.md | Política breve de integración y flujo seguro por defecto |
/llms.txt | Índice público del producto, modelos y documentación |
/llms-full.txt | Corpus ampliado cuando el índice corto no basta |
/api/agent | Manifiesto JSON estructurado para herramientas y clientes autónomos |
/openapi.yaml | Formas canónicas de solicitudes y respuestas |
OpenAPI y el catálogo de modelos actual son el contrato. Los ejemplos comerciales son ilustrativos, no una fuente de Schema. Actualiza los documentos de descubrimiento antes de generar código o cuando aparezcan nuevos errores de validación.
Integraciones npm oficiales
SDK, CLI, MCP y el Agent Skill portátil son cuatro paquetes npm MIT independientes. Instala solo las herramientas que necesites. @spicyapi/skill sigue el formato portátil Agent Skills y no está limitado a Codex.
npm install @spicyapi/sdk
npx --yes --package=@spicyapi/cli spicyapi --help
npx --yes --package=@spicyapi/mcp spicyapi-mcp
npx --yes --package=@spicyapi/skill spicyapi-skill installEl Skill se instala en ~/.agents/skills/spicyapi de forma predeterminada. Si un Agent usa otro directorio Skills, indica el destino exacto con --target /ruta/exacta/spicyapi.
Usarlo dentro de un agente de código
El servidor MCP se ejecuta en local por stdio y entrega al agente el catálogo de modelos, los presupuestos, la creación de tareas y la recogida de resultados. Toda acción facturable se detiene en una confirmación que el agente no puede saltarse. Abajo está la forma que recomienda hoy cada cliente; la ubicación y el formato de la configuración los define el cliente y cambian entre versiones, así que su documentación es la referencia.
Claude Code
claude mcp add spicyapi \
-e SPICY_API_KEY=$SPICY_API_KEY \
-- npx --yes --package=@spicyapi/mcp spicyapi-mcp
npx --yes --package=@spicyapi/skill spicyapi-skill install \
--target ~/.claude/skills/spicyapiCodex CLI
codex mcp add spicyapi \
--env SPICY_API_KEY=$SPICY_API_KEY \
-- npx --yes --package=@spicyapi/mcp spicyapi-mcp
npx --yes --package=@spicyapi/skill spicyapi-skill install \
--target ~/.codex/skills/spicyapiAmbos comandos copian SPICY_API_KEY de tu shell actual a la configuración local de ese cliente, así que ejecútalos en una terminal donde la clave ya esté exportada. Se queda en tu máquina: nunca la subas al repositorio.
Cursor, Windsurf y Gemini CLI
Sus archivos de configuración son ~/.cursor/mcp.json, ~/.codeium/windsurf/mcp_config.json y ~/.gemini/settings.json, con la misma forma:
{
"mcpServers": {
"spicyapi": {
"command": "npx",
"args": ["--yes", "--package=@spicyapi/mcp", "spicyapi-mcp"],
"env": { "SPICY_API_KEY": "YOUR_SERVER_SIDE_KEY" }
}
}
}Son archivos de usuario fuera de tu repositorio. Cuando YOUR_SERVER_SIDE_KEY tenga una clave real, no copies este bloque a ningún archivo del proyecto que se versione.
VS Code
.vscode/mcp.json se versiona con tu repositorio, así que la clave no puede vivir dentro. Deja que VS Code pida el valor la primera vez que arranca el servidor y lo guarde en su propio almacén de secretos:
{
"inputs": [
{
"id": "spicyapi-key",
"type": "promptString",
"description": "SpicyAPI key",
"password": true
}
],
"servers": {
"spicyapi": {
"type": "stdio",
"command": "npx",
"args": ["--yes", "--package=@spicyapi/mcp", "spicyapi-mcp"],
"env": { "SPICY_API_KEY": "${input:spicyapi-key}" }
}
}
}Una vez conectado
Pídele al agente algo real:
Con SpicyAPI, lista los modelos de imagen que puedo llamar, elige uno barato, genera un retrato nocturno cinematográfico y dame el enlace del resultado cuando termine.
El agente lee el catálogo, obtiene el esquema de ese modelo y un presupuesto exacto, y se detiene para que confirmes antes de cobrar nada. Con el Skill instalado, además mantiene una sola clave de idempotencia y lee los enlaces de resultado ya listos en lugar de sondear repetidamente.
Flujo de producción
- Resuelve el modelo y la entrada. Elige el endpoint de la modalidad correcta y valida contra su Schema actual. No adivines campos ni descartes silenciosamente los desconocidos.
- Crea una sola vez. Genera un
Idempotency-Keyestable para cada generación lógica y guárdalo antes de la primera llamada. Reutilízalo al reenviar la misma solicitud durante su vigencia de 24 horas; una generación nueva necesita otra clave. Consulta Idempotencia. - Guarda
taskIdde inmediato. Es la identidad duradera para consultar estado, conciliar Webhooks, soporte y facturación. Un reintento puede devolver el mismo ID y no debe crear un segundo registro local. - Espera con un límite. Prioriza un Webhook firmado. Si necesitas polling, empieza cerca de 2 segundos, multiplica por 1,5, limita el intervalo a 15 segundos y fija además un plazo total.
succeeded,failed,canceledyexpiredson estados terminales. - Verifica el callback antes de actuar. Comprueba
X-Webhook-Timestamp, el hash del cuerpo sin transformar y la firma HMAC. Deduplica con elrequest_idde entrega, responde rápido con 2xx y procesa después en una cola. Consulta Webhooks. - Copia el resultado a tiempo. Usa las URL de resultado incluidas en la respuesta de estado o en el webhook y copia los archivos que quieras conservar a tu propio almacenamiento. Si utilizas una URL firmada, respeta su vencimiento; no es necesario solicitar otra URL para cada resultado. Revisa también Multimedia y Retención.
POST /api/v1/jobs/createTask
Authorization: Bearer $SPICY_API_KEY
Content-Type: application/json
Idempotency-Key: project-42-scene-07-v1const deadline = Date.now() + 10 * 60_000;
let delay = 2_000;
while (Date.now() < deadline) {
await sleep(delay);
const task = await recordInfo(taskId);
if (['succeeded', 'failed', 'canceled', 'expired'].includes(task.state)) return task;
delay = Math.min(Math.round(delay * 1.5), 15_000);
}
throw new Error(`task ${taskId} exceeded the polling deadline`);Un timeout local no demuestra que la generación haya fallado. Conserva taskId y concilia el estado más tarde. Tampoco interpretes HTTP 200 como éxito del contenido: lee data.state.
Registro duradero mínimo
Guarda localRequestId, idempotencyKey, taskId, model, state, lastCheckedAt, webhookDeliveryId y outputKeys para poder continuar después de un reinicio. Una URL de descarga temporal nunca debe ser el identificador permanente del archivo.
Mock y pruebas de aceptación
Crea un mock contractual local con las envolturas documentadas en Tareas, Webhooks y Errores. Debe cubrir como mínimo:
- queued → running → succeeded y un fallo terminal con
code: 200ydata.state: "failed"; - creación duplicada que devuelve el mismo
taskId; - firma válida, firma inválida y reenvío del mismo Webhook;
429,503, timeout de transporte y vencimiento del plazo de polling;- reemisión de una URL de descarga caducada.
El mock valida la orquestación, no la calidad del modelo. Antes del lanzamiento ejecuta una tarea real pequeña con el mismo modelo y estructura de entrada de producción.
Lista de aceptación
- Los secretos solo viven en el almacén del servidor y se ocultan en los logs.
- La integración lee el Schema actual del modelo en vez de inventar campos.
- Cada solicitud lógica tiene un único
Idempotency-Keypersistido. -
taskIdse guarda antes de continuar y sobrevive a un reinicio. - El polling tiene backoff, intervalo máximo y plazo total.
- Los Webhooks verifican tiempo, cuerpo original y HMAC, y deduplican entregas.
- El resultado final se lee de
data.state, no del estado HTTP ni decode. - Los resultados se copian antes de caducar; las claves de objeto son la referencia duradera.
- Los logs incluyen
request_id,taskId, modelo e intento, pero no secretos ni prompts completos.
El informe final del agente debe incluir endpoint elegido, hora de lectura del Schema, estrategia de idempotencia, plazo de polling, verificación de Webhook y esta lista completada.

