Mira cada span de tus agentes.
Cada llamada LLM, herramienta MCP y token de coste. Sin nube, sin API keys.
$npx lookspan
Dashboard en http://127.0.0.1:3100.
- planneragent_step1284
- plan.completionllm_call421
- search_webtool_call268
- vector.lookupretrieval154
- synth.completionllm_call462
Vista de traza (waterfall de spans).
Funciona con tu stack
Cuando un agente falla, te quedas a ciegas.
Las herramientas clásicas exigen cuenta en la nube, claves de API y tus datos en servidores ajenos.
-
Cuenta + facturación + API keys
Tus prompts salen fuera
Coste por evento o GB
Latencia de red
Observabilidad local-first
- Todo en tu máquina, los datos nunca salen
- SQLite en
~/.lookspan/lookspan.db - Infraestructura cero
- Un comando:
npx lookspan
Todo para depurar agentes, en local
Trazas, grafo de spans, costes y alertas.
Nativo para MCP
@lookspan/mcp emite un span por llamada.
Streaming en tiempo real
SSE en /api/stream: trazas en vivo, sin polling.
Grafo de spans interactivo
Cada traza como grafo navegable: jerarquía, duraciones, estados.
Seguimiento de costes
cost_usd por traza, con desglose por modelo.
SQLite local
~/.lookspan/lookspan.db. Tus datos, tu disco.
CLI en una línea
npx lookspan arranca servidor y dashboard.
Alertas configurables
Avísate cuando una traza falla, cuesta o tarda de más.
Privado por defecto
Escucha en 127.0.0.1 y redacta credenciales.
OpenTelemetry (OTLP)
Receptor en /v1/traces. Los gen_ai.* se mapean solos.
De tu agente al dashboard en tres pasos
Instrumenta, arranca y observa.
POST /api/ingest
SSE /api/stream
Instrumenta
Envuelve tu cliente MCP o añade el callback. Una línea.
Arranca
npx lookspan escucha en :3100 y sirve el dashboard.
Observa
Cada span en vivo: duraciones, estados, tokens y coste.
Instrumentar tu agente es una línea
Elige tu framework. O cualquier agente que pueda hacer un POST.
// Cada callTool emite un span
import { wrapMcpClient, HttpSpanExporter } from '@lookspan/mcp';
const exporter = new HttpSpanExporter({
endpoint: 'http://127.0.0.1:3100/api/ingest',
});
const { client } = wrapMcpClient(mcpClient, {
exporter,
agentId: 'mi-agente',
});
// Úsalo exactamente igual que antes
await client.callTool({ name: 'read_file', arguments: { path: '/tmp/foo.txt' } });
from lookspan import LookspanClient
from lookspan_langgraph import LookspanCallbackHandler
client = LookspanClient(endpoint="http://127.0.0.1:3100/api/ingest")
handler = LookspanCallbackHandler(client=client, agent_id="mi-agente")
# Pásalo como callback — LangGraph hace el resto
result = graph.invoke({"messages": []}, config={"callbacks": [handler]})
client.flush()
from crewai import Crew
from lookspan import LookspanClient
from lookspan_crewai import attach_lookspan
client = LookspanClient(endpoint="http://127.0.0.1:3100/api/ingest")
attach_lookspan(client, agent_id="research-crew")
# Una llamada instrumenta toda la crew
crew = Crew(agents=[...], tasks=[...])
crew.kickoff()
client.flush()
# Cualquier lenguaje que pueda hacer un POST
curl -X POST http://127.0.0.1:3100/api/ingest \
-H "Content-Type: application/json" \
-d '{
"source": "mi-agente",
"spans": [{
"traceId": "tr_abc123",
"spanId": "sp_def456",
"type": "llm_call",
"name": "completion",
"status": "ok",
"framework": "custom",
"model": "gpt-4o",
"provider": "openai"
}]
}'
# Reutiliza tu instrumentación OpenTelemetry
export OTEL_EXPORTER_OTLP_TRACES_ENDPOINT=http://127.0.0.1:3100/v1/traces
export OTEL_EXPORTER_OTLP_PROTOCOL=http/json
# Los atributos gen_ai.* se mapean a modelo, proveedor y tokens.
Sabe cuánto cuesta cada agente
Coste en USD por traza, por modelo. Ninguna factura te pillará por sorpresa.
-
cost_usdpor span y por traza - Desglose por modelo y proveedor
- Latencia p50 / p95 / p99 y tasa de error
- Alerta automática al superar tu umbral
Ve tus agentes en 30 segundos.
Sin cuenta, sin claves, sin nube.
$npx lookspan