Un minuto de silencio hay que llenarlo con algo mejor que tres puntos animados, y lo que puedes decir con honestidad depende de cómo se ejecute el conjunto de herramientas.
Cuando las herramientas se ejecutan del lado del proveedor, la llamada y su resultado llegan juntos —así que sólo te enteras de que un paso ocurrió después de que haya terminado:
// What the turn has just done, for the waiting indicator. The toolset runs
// server-side, so the use and the result arrive together and we only ever
// learn about a step once it has finished — hence "did", not "doing".
$state['activity'] = self::lastStep($toolUseBlocks) ?? ($state['activity'] ?? '');
Pasado, por tanto: comprobó esa dirección, no comprobando esa dirección. Afirmar el presente sería una pequeña mentira, y se desincroniza de la realidad en cuanto un paso tarda más que el intervalo de consulta.
El segundo detalle es más sutil y muerde a todo el mundo una vez:
// Returned as a bare key, never a sentence: the job runs on the queue with no
// request locale, so translating here would pin every visitor to the app
// default. The widget resolves it.
Un job en cola no tiene contexto de petición. Ni sesión, ni idioma, ni usuario autenticado salvo que se lo pases. Traduce una cadena dentro del job y todos los usuarios reciben el idioma por defecto de la aplicación, escriban en el que escriban. Emite una clave; deja que la capa que sí tiene idioma la convierta en palabras.
Por último, degrada a silencio antes que a jerga. Los nombres de paso se comparan con una lista conocida, y uno no reconocido devuelve null —así que un renombrado aguas arriba no muestra nada en lugar de imprimirle a un cliente el nombre interno de una herramienta.
Lo que sostiene este capítulo
- Noventa segundos es el caso normal, no el malo. Diseña para eso en lugar de confiar.
- Un turno de modelo que agota su tiempo cuesta el turno entero. Pagas por trabajo que la conexión cerrada tiró.
- Pon el turno en una cola y deja que el frontend consulte un estado publicado.
- Fija
tries = 1. Reintentar un turno que ha gastado dinero y llamado a herramientas no es resiliencia. - Anida tres relojes: tiempo de espera por llamada dentro de tu propio plazo dentro del tiempo de espera del job —con margen para que el job siempre llegue a su escritura final.
- Deriva el tiempo de espera por llamada de lo que queda, y niégate a empezar una llamada que no da tiempo a terminar.
- Publica tras cada iteración, con una bandera
doneexplícita como contrato con el cliente. - Guarda puntos de control y escribe un
failed()de verdad que recupere estado parcial, fijedoney limpie sus claves. - Haz la parada cooperativa y compruébala antes de la llamada, para que como mucho se desperdicie una ida y vuelta —y trata «parado» como su propio estado, no como un error.
- Un job en cola no tiene idioma. Emite claves y resuélvelas donde vive el contexto de la petición.
- Di lo que acaba de pasar, en pasado, y degrada a silencio antes que mostrar nombres internos.