X-Comfy-Error-Type y un ID de solicitud en X-Comfy-Request-Id. Conserva los tres datos, además de la Idempotency-Key que enviaste, antes de decidir si reintentar.
Leer los errores de forma defensiva
Una solicitud fallida puede devolver la página de error HTML de un proxy, JSON truncado o texto sin formato. No dejes que un error de análisis de JSON oculte el estado HTTP ni el ID de solicitud. Estos auxiliares usan unhttpx.Response en Python y un Response de Fetch en TypeScript; los SDK ya exponen campos de error para las llamadas normales del SDK.
Errores de validación
Un422 de Router significa que la validación falló antes de la llamada al proveedor y no se factura. Su cuerpo tiene un arreglo detail[], con una entrada por cada campo rechazado. La categoría del error está en X-Comfy-Error-Type, no en el cuerpo. Por ejemplo:
422 de Router.
400 describe un problema a nivel de solicitud, como un cursor mal formado, en lugar de este cuerpo de validación por campo. La referencia de errores enumera las categorías admitidas. Trata una categoría desconocida como internal_error para el control de flujo, pero conserva el valor original para el diagnóstico. No rechaces de forma estricta un nuevo valor de error ni implementes categorías de error previstas como si ya ocurrieran.
Reintentar de forma segura
Conserva la clave junto con el ID del modelo y el cuerpo de la solicitud antes de enviar. Reutilízala en cada intento de esa llamada lógica. Router no te devuelve elIdempotency-Key en su respuesta. El SDK de Python incluye su clave en las excepciones generadas; en TypeScript, conserva tú mismo la clave que proporcionaste.
Las claves se comparten dentro del espacio de trabajo que incluye la credencial, o se limitan al usuario cuando esta no incluye ningún espacio de trabajo. Usa un UUID único en todo ese ámbito y reintenta con la misma credencial. Reutilizar la clave de otro miembro del espacio de trabajo puede devolver su resultado registrado o un conflicto; cambiar las credenciales puede iniciar una llamada independiente y facturable.
Router conserva el estado de respuesta o de colección vinculado a la clave durante 24 horas; un reintento no inicia una nueva ventana de retención. Una vez que ese estado expire, no esperes que la clave anterior recupere un resultado ni que impida un nuevo envío. Una clave tampoco vuelve a habilitar una URL de recurso que haya expirado.
Resultados de reintento
Los conflictos comparan el método, la ruta del modelo, los parámetros de consulta y el cuerpo. Una clave puede volverse no reproducible después de una respuesta demasiado grande, de un error al escribir la respuesta o de un recurso que no se puede reproducir de forma segura. Esperar no recupera un resultado ya consumido. Una nueva clave inicia una nueva llamada; no recupera la salida anterior.
Un rechazo antes del despacho al proveedor libera la clave. Una llamada despachada puede conservar un identificador del proveedor o volverse no reproducible. No deduzcas el estado de la clave ni la facturación a partir del código de estado únicamente.
No generes una clave completamente nueva solo porque una llamada agotó el tiempo de espera o la conexión se interrumpió. Si el router ya aceptó la generación, una nueva clave puede crear una segunda ejecución lógica y, por lo tanto, un segundo resultado facturable. Reutiliza la misma clave hasta que sepas que la llamada original no se puede recuperar.
Tiempos de espera y recopilación
Una llamada a Router puede mantener la conexión durante 10 minutos de forma predeterminada. Configura el tiempo de espera de tu cliente por encima de ese límite para conservar el504 tipado y el ID de solicitud en lugar de un aborto local opaco. Si tu aplicación no puede mantener una conexión durante tanto tiempo, entrega en cola devuelve un request_id de inmediato y te permite recopilar el resultado más tarde.
deadline_exceeded es el límite de espera de Router; provider_timeout es el plazo límite del proveedor. Una generación del proveedor que se completa puede facturarse aunque el llamador haya recibido un tiempo de espera agotado o se haya desconectado. La cancelación del cliente detiene la espera y los reintentos del SDK, pero no necesariamente cancela el trabajo ya aceptado por el proveedor.
Para los proveedores de tipo enviar y consultar, un identificador conservado permite que una solicitud con la misma clave siga recopilando la generación original. Las llamadas despachadas y cortadas sin un identificador recuperable pueden consumir la clave sin un resultado reproducible; un reintento con la misma clave devuelve entonces 409. Las fallas transitorias atribuidas al proveedor sin un éxito capturado aún pueden liberar la clave para otro intento. La ausencia de un identificador por sí sola no te indica cuál de los resultados aplica.
Los SDK reintentan algunas fallas dentro de un presupuesto acotado. Una vez que devuelven un error, conserva la solicitud y la clave en lugar de generar una nueva. Para HTTP sin procesar, este ejemplo reintenta solo las dos pistas explícitas de recopilación:
Retry-After. Los errores HTTP conservan la respuesta para su inspección; los errores de transporte se propagan sin reemplazar la clave. Programa la recopilación posterior con la clave guardada si tu aplicación necesita una ventana de recuperación más larga.
Próximos pasos
- Facturación: qué cuesta un rechazo, un tiempo de espera agotado o una repetición.
- Encabezados: idempotencia, IDs de solicitud y encabezados de cadencia de reintentos.
- Referencia de API: cada categoría de errores que devuelve Router.