Las cuatro tienen la misma forma: preguntan por una ejecución concreta, no por una media. Un log agregado no te devuelve una ejecución; te devuelve líneas sueltas que tú tienes que volver a coser a mano.
El detalle que importa: un span contiene a otros. La anidación es el dato. Sin ella tienes una lista de eventos y has vuelto al problema original.
| Concepto | LangFuse | LangSmith |
|---|---|---|
| Contenedor de trabajo | Proyecto | Proyecto |
| Ejecución raíz | trace | trace (el run raíz) |
| Paso intermedio | span / observation | Run con run_type: chain, tool, retriever |
| Llamada al modelo | generation | Run con run_type="llm" |
| Nota de calidad | score | feedback |
LangSmith no usa clases distintas: todo es un Run y el
run_type dice qué clase de paso es. LangFuse sí separa
span de generation. Es la misma información con dos
etiquetados; en cuanto lo ves así, cambiar de herramienta deja de ser aprender de
cero.
Con el árbol montado aparecen tres cosas que el log plano no puede darte. Latencia atribuida: no "la petición tardó 4 s", sino qué rama se llevó el tiempo. Coste desglosado: el coste de la traza es la suma de sus generations, así que una traza anómala te dice en qué rama se disparó. Y el prompt final: no la plantilla, el texto exacto que salió hacia el modelo con las variables ya sustituidas.
Los dos SDK mandan los datos en segundo plano, en lotes, para no meter
latencia en tu petición. Consecuencia directa: si tu script termina antes de que
el lote salga, la traza no llega nunca. Por eso los dos ofrecen un flush()
y por eso la guía lo repite en tres troubleshootings distintos.
La guía explica este mismo árbol dos veces — una en la primera lección de LangFuse y otra en la primera de LangSmith — con casi las mismas palabras, cambiando el vocabulario y sin decir en ningún momento que es la misma estructura. Deja la impresión de que son dos modelos mentales, y no lo son.
Y una que sí te va a costar tiempo: los bloques .env de LangSmith
de la guía y de los dos ejercicios usan
LANGSMITH_TRACING_V2=true. Las variables documentadas son
LANGCHAIN_TRACING_V2 (nombre heredado) y LANGSMITH_TRACING
(nombre actual). LANGSMITH_TRACING_V2 mezcla las dos convenciones.
¿Existe esa variable? Si no, no activa nada — y el síntoma
sería exactamente el primer caso de la tabla de troubleshooting de la propia
guía. Comprueba el nombre en la documentación oficial antes de dar tu
configuración por buena.
Instrumenta la función más tonta que se te ocurra — una que llame al
modelo una sola vez — y ejecútala sin llamar a
flush(). Mira el dashboard. Después añade el
flush() y vuelve a ejecutar.
Anota cuánto tarda la traza en aparecer en el segundo caso. Ese número es tu latencia de indexación, y es la razón por la que un script que crea runs y los consulta acto seguido puede devolverte una lista vacía sin que nada esté roto.