Guía y visión

Trabajos por lotes unificados a través de una puerta de enlace API de IA: colas duraderas, adaptadores de proveedores y facturación a nivel de inquilino

Una arquitectura práctica para ejecutar cargas de trabajo de IA tolerantes a la latencia a través de una API multimodelo: registros de trabajos duraderos, adaptadores por lotes de proveedores, ingesta de resultados idempotentes, reserva de presupuesto y análisis a nivel de inquilino.

El procesamiento por lotes no debe tratarse como una puerta lateral a su puerta de enlace API de IA. Si las evaluaciones, el enriquecimiento de documentos, la extracción, los barridos de moderación o los trabajos de incrustación abandonan la ruta de solicitud sincrónica, aún necesitan controles de inquilinos, atribución de costos, reintentos, auditabilidad y análisis de uso.

El patrón de implementación es hacer de la ejecución por lotes un subsistema de puerta de enlace de primera clase. La puerta de enlace debe exponer un contrato de trabajo neutral para el proveedor mientras se adapta a OpenAI, Anthropic, Gemini y futuras API por lotes de proveedores entre bastidores.

El problema del lector: las API por lotes son similares en intención, diferentes en funcionamiento

Las cargas de trabajo tolerantes a la latencia son una opción natural para la ejecución por lotes. Lo difícil no es decidir si un trabajo puede esperar. La parte difícil es operar el trabajo por lotes de manera consistente entre proveedores.

Hechos verificados: la API Batch de OpenAI es asincrónica, lee solicitudes de un archivo cargado, escribe respuestas en un archivo de salida y actualmente usa una ventana de procesamiento de 24 horas. OpenAI enumera estados como validando, fallido, en_progreso, finalizando, completado, expirado, cancelando y cancelado. La API Message Batches de Anthropic procesa muchas solicitudes de mensajes de forma asincrónica, maneja cada solicitud de forma independiente, requiere sondeo y devuelve resultados una vez finalizado el procesamiento. Anthropic también recomienda valores custom_id significativos porque el orden de los resultados no está garantizado. La API Batch de Gemini expone métodos de estilo operativo de larga duración, como métodos de lista, cancelación, eliminación y actualización, y su operación de cancelación se describe como la de mejor esfuerzo.

Esas diferencias son importantes una vez que agrega requisitos comerciales reales:

  • ¿Qué inquilino, cliente, proyecto o clave de API posee cada elemento?
  • ¿Se reservó el presupuesto antes de que el trabajo saliera de la puerta de enlace?
  • ¿Qué elementos completados se facturan si el lote vence o se cancela? ¿Se cancelan?
  • ¿Cómo se reintentan los errores parciales sin duplicar el trabajo exitoso?
  • ¿Durante cuánto tiempo se pueden recuperar los archivos de resultados y qué debe almacenar la puerta de enlace?
  • ¿Puede un socio crear un procesamiento por lotes centrado en el cliente sin exponer las credenciales del proveedor ascendente?

La respuesta no es ocultar todas las diferencias entre proveedores. La respuesta es normalizar el contrato operativo y al mismo tiempo preservar los metadatos nativos del proveedor para la depuración, la conciliación y el soporte.

API pública recomendada: separar los trabajos por lotes de las finalizaciones sincrónicas

Recomendación: exponer los trabajos por lotes como su propia superficie API, no como una marca especial en las finalizaciones del chat. Una solicitud sincrónica y un trabajo por lotes asincrónico tienen diferentes semánticas de ciclo de vida, facturación, reintento y recuperación de resultados.

Un contrato de puerta de enlace práctico incluye estas operaciones:

  • create_job: crea un borrador de trabajo propiedad de un cliente inquilino, proyecto, clave o socio.
  • append_items o upload_manifest: agrega solicitudes individuales con un elemento estable identificadores.
  • enviar: validar, reservar presupuesto, seleccionar proveedor, enviar y bloquear el manifiesto enviado.
  • get_status: devolver trabajos normalizados y recuentos de artículos.
  • list_results: revisar resultados, errores y uso de artículos normalizados.
  • cancelar: solicitar cancelación, sin prometer algo inmediato terminación.
  • export_usage: exporta registros de costos a nivel de trabajo y de artículo para sistemas de análisis o facturación.

Ejemplo de objeto de trabajo público:

{
  "job_id": "job_01j7...",
  "tenant_id": "tenant_acme",
  "customer_id": "cust_123",
  "punto final": "chat.completions",
  "modelo": "análisis grande",
  "estado": "en ejecución",
  "cuenta": {
    "enviado": 50000,
    "completado": 31240,
    "fallido": 180,
    "caducado": 0
  },
  "costo": {
    "estimado": "184,20",
    "reservado": "205.00",
    "resuelto": "117.43",
    "moneda": "USD"
  },
  "created_at": "2026-08-19T10:00:00Z",
  "submitted_at": "2026-08-19T10:05:00Z",
  "retrieval_deadline": "2026-09-17T10:00:00Z"
}

El objeto público no debe exponer los ID de los archivos del proveedor, los nombres de las operaciones ni los errores ascendentes sin procesar de forma predeterminada. Estos pertenecen a los metadatos de cara al operador.

Utilice registros de trabajo duraderos como fuente de verdad

Una capa por lotes propiedad de la puerta de enlace necesita un estado duradero antes de que se envíe algo en sentido ascendente. No confíe en los registros de lotes del proveedor como su único almacén estatal. Los registros de proveedores son necesarios, pero no conocen su jerarquía de inquilinos, reservas de presupuesto, alias de modelos internos, clientes asociados ni requisitos de análisis.

Modelo de base de datos mínimo

Un esquema útil tiene tres niveles:

1. Trabajo por lotes

batch_jobs
- id_trabajo
- id_inquilino
- id_proyecto
- id_cliente anulable- api_key_id
- punto final
- modelo_solicitado
- proveedor_resuelto
- modelo_proveedor_resuelto
- estado
- recuento_artículo
- tokens_de_entrada_estimados
- tokens_de_salida_estimados
- cantidad_reservada
- importe_liquidado
- creado_en
- enviado_en
- completado_en
- expira_en
- recuperación_fecha límite
- cancelación_requested_at

2. Artículo de lote

batch_items
- id_trabajo
-id_artículo
- id_personalizado
- clave_idempotencia
- solicitud_hash
- estado
- proveedor_request_index anulable
- tokens_estimados
- tokens_input_actuales anulables
- tokens_de_salida_actuales anulables
- cantidad_liquidada anulable
- result_pointer anulable
- código_error anulable
- retry_of_item_id anulable
- creado_en
- asentamiento_at

3. Metadatos del proveedor

batch_provider_metadata
- id_trabajo
- proveedor
- proveedor_batch_id anulable
- input_file_id anulable
- id_archivo_salida anulable
- error_file_id anulable
- nombre_operación anulable
- punto final
- región anulable
- estado_nativo
-native_request_counts jsonb
- last_polled_at
- raw_error_pointer nullable

Mantener los metadatos del proveedor separados del contrato de trabajo público permite que la puerta de enlace desarrolle adaptadores de proveedor sin romper las API orientadas al inquilino.

Requerir identificadores de elementos estables antes del envío

Recomendación: genere un job_id de puerta de enlace y requiera un custom_id por elemento o una clave de idempotencia antes del envío. Nunca concilie los resultados por orden.

Anthropic advierte explícitamente que el orden de los resultados no está garantizado y recomienda valores custom_id significativos. Incluso cuando un proveedor parece preservar el orden, una puerta de enlace no debería depender de él. Los trabajos se fragmentan, se reintentan, se cancelan, se completan parcialmente y se vuelven a incorporar. Las suposiciones de pedido eventualmente fallan.

Un formato de identificador de artículo seguro es descriptivo pero no confidencial:

tenantA.invoice_extraction.2026-08-19.row_000381

Evite incluir correos electrónicos, nombres, títulos de documentos o secretos de clientes sin procesar en los identificadores. Almacene datos de correlación confidenciales dentro de su propia base de datos de inquilinos, no dentro de ID visibles para el proveedor.

Normalice los estados sin borrar los detalles del proveedor

Las API por lotes del proveedor exponen diferentes ciclos de vida. La puerta de enlace debe normalizarlos en una pequeña máquina de estado interna que los paneles, la facturación y la automatización puedan entender.

Ciclo de vida normalizado recomendado:

  • borrador: el trabajo existe pero aún se puede editar.
  • validando: la validación de la puerta de enlace o del proveedor se está ejecutando.
  • en cola: aceptado pero aún no procesando.
  • en ejecución: el proveedor está procesando elementos.
  • finalizando: el proveedor ha finalizado el cálculo y está preparando los artefactos de resultados.
  • completado: todos los elementos aceptados alcanzaron el éxito terminal.
  • completed_with_errors: algunos elementos se realizaron correctamente y otros fallaron.
  • expirado: la ventana del proveedor finalizó antes de todo el trabajo completado.
  • cancel_requested: el inquilino solicitó cancelar, pero el trabajo final facturable no se liquidó.
  • cancelled: cancelación liquidada.
  • falló: una falla a nivel de trabajo impidió una ejecución útil.

No colapse los errores del proveedor nativo en etiquetas genéricas demasiado pronto. Los operadores aún necesitan acceso a estados nativos, errores de validación, recuentos de solicitudes, ID de archivos y nombres de operaciones durante la depuración.

Validar con una matriz de capacidades antes del envío

Recomendación: ejecute la validación previa antes de la reserva del presupuesto y el envío del proveedor. El modo por lotes no es solo un modo síncrono con retraso. Es posible que algunos modelos, puntos finales, funciones de solicitud, regiones y configuraciones de herramientas no sean compatibles con la API por lotes de un proveedor.

Su matriz de capacidad interna debe verificar:

  • Puntos finales admitidos: chat, mensajes, incrustaciones, moderación o generación.
  • Elegibilidad del modelo para el modo por lotes.
  • Tamaño máximo de trabajo, recuento de elementos, tamaño de solicitud y tamaño de archivo cargado.
  • Si la transmisión es prohibido.
  • Uso de herramientas y compatibilidad con llamadas a funciones.
  • Salida estructurada o compatibilidad con esquemas JSON.
  • Compatibilidad con imágenes, audio o entradas multimodales.
  • Restricciones de región y residencia.
  • Ventanas de retención de proveedores y recuperación de resultados.
  • Límites de velocidad y colas específicos de lotes.
  • Semántica de cancelación.

Una buena respuesta de verificación previa es específico:

{
  "error": "batch_capability_not_supported",
  "message": "El adaptador por lotes del proveedor seleccionado no admite respuestas de transmisión. Elimine stream=true o elija un punto final sincrónico.",
  "campo": "elementos[*].request.stream"}

Esto es más útil que aceptar el trabajo y reprobarlo después de un paso de validación ascendente.

Reservar el presupuesto del inquilino y luego liquidar el uso real

La ejecución por lotes complica la facturación porque la puerta de enlace puede perder el acceso sincrónico al uso exacto hasta que los archivos de resultados estén disponibles. El patrón seguro es cotizar, reservar, enviar, ingerir, liquidar y conciliar.

Hechos verificados: OpenAI afirma que el precio de la API por lotes se ofrece con un descuento en comparación con las API sincrónicas, y los lotes vencidos o cancelados aún pueden devolver el trabajo completado que es facturable. Anthropic señala que el procesamiento por lotes de alto rendimiento puede exceder levemente el límite de gasto del espacio de trabajo, lo que hace que la reserva en el lado de la puerta de enlace y la posliquidación sean importantes.

Recomendación: reserve el presupuesto del inquilino antes del envío utilizando tokens estimados, reglas de precios de proveedores seleccionados y un margen de seguridad. Una vez ingeridos los resultados, liquide el uso real a nivel de artículo. Si la estimación fue demasiado alta, libere la reserva no utilizada. Si era demasiado bajo, aplique la política de excedente configurada por el inquilino.

Eventos prácticos del libro mayor:

batch.estimated
lote.reservado
lote.enviado
lote.artículo.liquidado
lote.artículo.reembolsado
lote.cancel_requested
lote.expiradolote.reconciliado

El libro mayor a nivel de artículo es esencial. Si se completan 45 000 elementos y caducan 5000, se debe facturar al inquilino por el trabajo completado del proveedor, no por el manifiesto original como un único blob indiferenciado.

Construya adaptadores de proveedor como traductores, no propietarios de la lógica de negocios

Cada adaptador de proveedor debe saber cómo transformar el trabajo de puerta de enlace al formato por lotes del proveedor, enviarlo, sondear o recuperar el estado, descargar resultados y asignar resultados nativos de nuevo a los normalizados. registros.

Mantenga la política del inquilino fuera del adaptador. El adaptador no debe decidir si un cliente tiene suficiente presupuesto, si se suspende a un cliente asociado o si se pueden almacenar avisos. Esas son decisiones de puerta de enlace.

Responsabilidades del adaptador

  • Presentar manifiestos de solicitud específicos del proveedor.
  • Cargar archivos de entrada o crear operaciones de proveedor.
  • Almacenar identificadores de proveedor en metadatos.
  • Asignar estado nativo a estado normalizado.
  • Recuperar artefactos de salida y error.
  • Analizar resultados a nivel de elemento.
  • Devolver registros de uso nativo cuando disponible.
  • Superficie reintentable frente a errores de terminal.

Responsabilidades de la puerta de enlace

  • Autenticar el inquilino y la clave API.
  • Aplicar controles de equipo, proyecto y cliente.
  • Resolver alias de modelo y política de enrutamiento de proveedores.
  • Validar capacidades por lotes.
  • Reservar y liquidar presupuesto.
  • Conservar trabajo y artículo estado.
  • Aplicar la política de retención.
  • Exponer análisis y exportaciones.

Esta separación hace que sea más fácil agregar un nuevo proveedor sin reescribir la facturación, los análisis o la gobernanza de inquilinos.

Ingerir resultados de forma idempotente

La ingestión de resultados ocurre cuando muchos sistemas por lotes duplican accidentalmente cargos o pierden trabajo parcial. Trate la ingestión como un proceso repetible. Debería ser seguro descargar el mismo archivo de salida dos veces, procesar la misma operación del proveedor dos veces o reproducir el mismo evento de webhook dos veces.

Recomendación: utilice claves de idempotencia a nivel de elemento y restricciones de unicidad del libro mayor. Un resultado para job_id + custom_id debe establecerse exactamente una vez, incluso si se vuelve a intentar la ingestión.

Un flujo de ingestión sólido:

  1. Adquirir un bloqueo de corta duración para el trabajo o artefacto de resultado.
  2. Obtener artefactos de error y salida del proveedor.
  3. Analizar registros en eventos de resultados de elementos normalizados.
  4. Hacer coincidir cada registro por custom_id o elemento de puerta de enlace ID.
  5. Escribir los metadatos de los resultados y el uso en una transacción.
  6. Crear un evento de liquidación del libro mayor solo si aún no existe uno.
  7. Actualizar los recuentos de trabajos a partir de los estados de los elementos, no de las suposiciones.
  8. Liberar la reserva de presupuesto no utilizada cuando se conozcan todos los estados terminales.

Si hay webhooks disponibles, verifique las firmas y proteja contra la repetición. Si es necesario realizar un sondeo, utilice el sondeo adaptativo: sondee frecuentemente cerca de su finalización prevista, retroceda durante períodos de ejecución prolongados y deténgase después de la liquidación terminal.

Vuelva a intentar elementos, no trabajos completos

Recomendación: vuelva a intentarlo a nivel de elemento siempre que sea posible. Los reintentos de todo el trabajo son simples, pero aumentan el riesgo de trabajo duplicado y dificultan la facturación.

Clasifique las fallas antes de volver a intentarlo:

  • Errores de validación: generalmente terminan hasta que se soluciona la solicitud.
  • Errores 5xx del proveedor: a menudo se pueden volver a intentar con una interrupción.
  • Errores de cuota o límite de velocidad: reintente solo después de que se agote la capacidad disponible.
  • Bloqueos de seguridad: no lo vuelva a intentar a ciegas; ruta al manejo de políticas.
  • Elementos caducados: se pueden volver a intentar en un nuevo trabajo si el inquilino todavía quiere el trabajo y el presupuesto lo permite.

Un reintento debe crear un nuevo elemento vinculado al original:

{
  "item_id": "item_retry_002",
  "retry_of_item_id": "item_001",
  "custom_id": "tenantA.eval.row_901.retry_1"
}

No vuelva a enviar elementos completados solo porque eran parte de un trabajo que terminó como completado_con_errores o expirado.

Decida qué almacenar: resultados sin procesar, punteros o hashes

Los sistemas por lotes son lugares tentadores para acumular indicaciones y resultados. Esto puede resultar útil para las exportaciones y la depuración, pero aumenta la responsabilidad de retención de datos.

Recomendación: haga que la política de almacenamiento sea configurable para los inquilinos. Para cargas de trabajo confidenciales, almacene metadatos, hashes, uso y punteros de resultados en lugar de indicaciones y resultados sin formato.Para cargas de trabajo menos sensibles, el almacenamiento de resultados normalizado puede ser aceptable si las ventanas de retención, los controles de acceso y los flujos de trabajo de eliminación son claros.

Realice un seguimiento de al menos:

  • Si se almacenó la entrada sin procesar.
  • Si se almacenó la salida sin procesar.
  • Dónde se encuentran los artefactos de resultados del proveedor.
  • Fecha límite de recuperación del proveedor.
  • Fecha límite de eliminación de la puerta de enlace.
  • Hash de solicitud y respuesta para auditoría sin exposición de contenido.

Dato verificado: Los resultados por lotes de estados antrópicos están disponibles durante 29 días después de la creación y están aislados dentro del espacio de trabajo. Este tipo de ventana de recuperación específica del proveedor debe reflejarse en los metadatos de la puerta de enlace y en las exportaciones orientadas a los inquilinos.

Exponer análisis que coincidan con la forma en que operan los equipos

Los análisis por lotes deben existir tanto a nivel de trabajo como de elemento. El propietario de un producto quiere saber si se completó un enriquecimiento nocturno. Un administrador de finanzas quiere costos por inquilino, modelo y cliente. Un ingeniero quiere saber qué clase de error volver a intentar.

Las métricas útiles incluyen:

  • Recuento de elementos enviados, completados, fallidos, caducados y cancelados.
  • Costo estimado versus liquidado.
  • El presupuesto reservado aún se mantiene.
  • Tokens de entrada y salida por proveedor y modelo.
  • Indicadores de aciertos en caché donde los proveedores los exponen.
  • Recuento de reintentos y reintentos exitosos tasa.
  • Tiempo promedio en los estados de cola, ejecución y finalización.
  • Errores de validación principales por punto final y modelo.
  • Atribución del cliente asociado.

Para los usuarios de API de socios, exponga los trabajos por lotes como recursos con alcance del cliente. Esto permite a las agencias y a los creadores de SaaS ofrecer procesamiento de IA fuera de línea mientras mantienen las credenciales de los proveedores anteriores, la conciliación de facturación y el manejo de límites de tarifas dentro de la puerta de enlace.

Compensaciones para hacer explícitas

Abstracción de la puerta de enlace versus capacidad específica del proveedor: un contrato unificado simplifica la integración, pero no puede hacer que todas las características de los proveedores sean idénticas. Mantenga explícitos los errores de capacidad.

Reserva de presupuesto versus precisión de estimación: la reserva protege a los inquilinos de trabajos descontrolados, pero las estimaciones pueden ser incorrectas. El libro mayor debe admitir ajustes, reembolsos y manejo de excedentes.

Encuestas versus webhooks: las encuestas son simples y confiables, pero pueden desperdiciar llamadas a la API y retrasar la finalización. Los webhooks son más rápidos, pero requieren verificación de firmas, protección de reproducción y monitoreo.

Almacenamiento de resultados sin procesar versus minimización de retención: almacenar resultados normalizados mejora las exportaciones y los análisis, pero aumenta la carga de cumplimiento. Los inquilinos sensibles pueden preferir punteros y hashes.

Lotes grandes versus lotes fragmentados: los lotes grandes pueden mejorar la eficiencia del lado del proveedor, pero los fragmentos más pequeños reducen el radio de explosión y facilitan los reintentos.

Lista de verificación de implementación

  • Cree una superficie API de trabajos por lotes separada.
  • Conserve los registros de trabajos y elementos antes del envío al proveedor.
  • Requiera ID de trabajo de puerta de enlace y por elemento ID personalizados.
  • Normalizar estados mientras se almacenan metadatos de proveedores nativos.
  • Crear una matriz de capacidades para cada adaptador por lotes de proveedores.
  • Validar manifiestos antes de reservar el presupuesto.
  • Reservar el presupuesto del inquilino antes del envío.
  • Establecer el uso real a nivel de elemento después de la ingestión.
  • Hacer que la ingestión de resultados sea idempotente.
  • Reintentar los elementos fallidos de forma selectiva, no los trabajos completos a ciegas.
  • Seguimiento de los plazos de recuperación del proveedor y la política de retención de la puerta de enlace.
  • Exponer análisis de trabajos y elementos a inquilinos y clientes asociados.

Predicciones: hacia dónde se dirige este patrón

Predicción: la ejecución por lotes se convertirá en una parte normal de la infraestructura de automatización de IA, no solo en un mecanismo de descuento. A medida que los equipos ejecuten más evaluaciones, tareas de limpieza de datos, revisiones de seguridad y canalizaciones de enriquecimiento, esperarán que las cargas de trabajo asincrónicas tengan la misma gobernanza que las llamadas API sincrónicas.

Predicción: las API por lotes de los proveedores seguirán divergiendo de maneras útiles. Algunos se optimizarán para archivos, otros para operaciones de larga duración y otros para conjuntos de datos administrados o devoluciones de llamadas de eventos. Una capa de adaptador de puerta de enlace será más valiosa, no menos, porque el contrato operativo por encima de los adaptadores puede permanecer estable.

Conclusión práctica

No conecte el procesamiento por lotes a una puerta de enlace API de IA como una vía de escape específica del proveedor. Constrúyalo como un subsistema duradero con sus propios registros de trabajo, identificadores de artículos, modelo de estado, adaptadores de proveedores, reserva de presupuesto, ingesta idempotente y análisis.

La elección de diseño más importante es la contabilidad a nivel de artículos. Una vez que cada solicitud dentro de un lote tiene una identidad estable, la puerta de enlace puede conciliar resultados desordenados, reintentar solo el trabajo fallido, facturar solo el trabajo completado del proveedor y mostrar a los inquilinos lo que sucedió.Esa es la diferencia entre enviar archivos a un proveedor y operar una API multimodelo confiable para cargas de trabajo asíncronas.

Lectura relacionada

FAQ

Preguntas frecuentes

¿Debería una puerta de enlace exponer directamente las API por lotes nativas del proveedor?
Generalmente no. La exposición de las API nativas brinda a los desarrolladores acceso directo a las funciones del proveedor, pero debilita la facturación, el análisis, los reintentos y la gobernanza a nivel de inquilino. Un mejor patrón es un contrato de trabajo neutral con el proveedor con metadatos específicos del proveedor disponibles para los operadores.
¿Por qué se requiere custom_id por elemento?
Es posible que los resultados del lote no se devuelvan en el mismo orden en que se enviaron. Un identificador estable por artículo permite a la puerta de enlace conciliar resultados, liquidar el uso, reintentar artículos fallidos y evitar cargos duplicados.
¿Cómo se deben facturar los lotes cancelados o caducados?
Facture solo por el trabajo completado del proveedor después de que los resultados se hayan ingerido y conciliado. Los trabajos cancelados o vencidos aún pueden contener elementos completados, por lo que el estado del nivel del trabajo por sí solo no es suficiente para una facturación precisa.
¿Debería la puerta de enlace almacenar mensajes sin procesar y resultados de trabajos por lotes?
No de forma predeterminada para inquilinos sensibles. Almacene metadatos, hashes, uso y punteros de resultados, a menos que el inquilino habilite explícitamente el almacenamiento de resultados sin procesar con una política de retención clara.