Ir al contenido principal
Laravel, thinking fast.

El mejor registro de esta base de código existe para zanjar una discusión concreta antes de que se convirtiera en una reescritura.

Nuestro chat llega a sus herramientas pidiéndole al proveedor que las llame. Así que una sola invocación cruza internet dos veces más de lo necesario: navegador → proveedor → nosotros → proveedor → navegador. Hay un arreglo arquitectónico evidente, y es una semana de trabajo.

Nadie había medido el salto.

/**
 * Record how long this service takes to answer an MCP call.
 *
 * The number this exists to produce is not our own speed — it is the cost of
 * the hop. merchants can time the whole round-trip but cannot see how much of
 * it was us, so the two numbers only mean something together.
 *
 * suggest-options-tool and suggest-palettes-tool are the useful probes. They
 * perform no I/O at all — they validate their input and hand back a reshaped
 * copy — so whatever merchants observes for one of those iterations, minus
 * what we report here, is inference plus transport and nothing else.
 */

Tres cosas hacen de esto un instrumento y no un número.

Nombra una sonda. No «mide las herramientas»: mide estas dos, que no hacen entrada/salida alguna, de modo que la resta aísla el transporte. Diseñar la medición es casi todo el trabajo.

Registra dos relojes, y explica cuál usar:

// Time inside the handler. Small for every tool that does no I/O,
// which is exactly why it is not the number to subtract.
'duration_ms' => (int) round((hrtime(true) - $started) / 1_000_000),

// Time since the request entered PHP. This is the one to subtract from what
// merchants observed: middleware timing starts after the framework has
// booted, and locally that gap was 80ms against 2ms of actual work — so
// `duration_ms` alone would flatter us badly and make the hop look far more
// expensive than it is.
'request_ms' => defined('LARAVEL_START')
    ? (int) round((microtime(true) - LARAVEL_START) * 1000)
    : null,

Ochenta milisegundos de arranque del framework frente a dos de trabajo real. Registra sólo el tiempo del manejador y concluirías que el salto cuesta ochenta milisegundos más de lo que cuesta —y luego dedicarías una semana a eliminarlo apoyándote en tu propio error de medición.

Separa tu tráfico del de los demás:

// Distinguishes our own widget's traffic (which arrives via the provider's
// connector on a valid token) from third-party agents, whose latency profile
// is somebody else's network.
'via_token' => $request->bearerToken() !== null,

Un endpoint de herramientas público lo llama gente que no conoces, por redes que no ves. Mezclar su latencia con tus percentiles produce un número que no describe a nadie.

El principio: mide antes de reconstruir. Adivinar ese salto habría sido una mala razón para rehacer el bucle de agente, y una razón igual de mala para no hacerlo.

Registra la pregunta que te van a hacer

Cada campo de este capítulo existe porque alguien preguntó algo concreto.

¿Por qué va lento?duration_ms, request_ms, iterations. ¿Por qué es caro? → los recuentos de tokens, tool_count. ¿Por qué paró ahí?stop_reason, y el tope reportado. ¿Funciona el cacheo del prompt?cache_read_input_tokens. ¿Es tráfico nuestro?via_token. ¿Merece la pena rehacer el bucle? → la sonda.

Registrarlo todo no es observabilidad; es una factura y un pajar. Escribe las preguntas que esperas que te hagan sobre una función que no puedes reproducir, registra exactamente los campos que las responden, y borra los campos que nadie ha consultado nunca.

Lo que sostiene este capítulo

  • Reproducir no está disponible. Lo que registraste en su momento es todo lo que tendrás.
  • Nombres y tamaños, nunca entradas ni resultados. Los argumentos de las herramientas son las palabras del propio usuario.
  • Registra recuentos de caracteres en vez de texto para separar una respuesta larga de una lenta sin almacenarla.
  • Una línea estructurada por ida y vuelta, con el número de iteración, para poder reconstruir un turno.
  • Diseña la sonda, no pongas sólo un cronómetro. Elige las operaciones que no hacen entrada/salida para que una resta signifique algo.
  • Registra dos relojes y di cuál restar. El arranque del framework eclipsaba el trabajo real y habría falseado el resultado.
  • Separa tu propio tráfico del de terceros antes de citar un percentil.
  • Mide antes de reconstruir. Una suposición es mala razón para una semana de trabajo, e igual de mala para no hacerla.