AstrApp
Docs

Spans

Un span es un paso dentro de una traza: la llamada al modelo, una búsqueda o una herramienta. Te dice en qué parte de la operación se fue el tiempo o apareció el error.

¿Qué es un span?

Cada span pertenece a una traza y puede colgar de otro span. Su tipo dice qué clase de paso fue:

TipoPara qué
generalCualquier paso que no encaje en los demás. Es el tipo por defecto.
llmUna llamada a un modelo de lenguaje, con su uso de tokens.
retrievalUna búsqueda en una base de conocimiento (RAG).
toolEl uso de una herramienta (function calling).
guardrailUna validación o control de seguridad sobre la entrada o la salida.

En la app

Cuando usas el chat o la inferencia de tu modelo, AstrApp agrega a cada traza un span de tipo llm con el modelo y los tokens usados. En las conversaciones que llegan por Kommo, registra un span por turno (ver Auto-tracing).

La app no tiene una pantalla de spans: los consultas por API.

API

Rutas bajo /api/v1/projects/{projectId}. Funcionan con la sesión de la app o con API key.

GET/opik/spans
Lista los spans de una traza
POST/opik/spans
Crea un span

Listar los spans de una traza

ParámetroTipoDescripción
trace_idtextoObligatorio. Id de la traza.
typetextoFiltra por tipo de span.
pagenúmeroPágina, desde 1. Por defecto 1.
sizenúmeroSpans por página. Por defecto 50.
bash
curl "https://app.astrapp.lat/api/v1/projects/$PROJECT_ID/opik/spans?trace_id=$TRACE_ID&type=llm" \
  -H "Authorization: Bearer sk_live_xxxxxxxxxxxxx"
Respuesta 200
{
  "success": true,
  "data": {
    "spans": [
      {
        "id": "…",
        "traceId": "…",
        "parentSpanId": null,
        "name": "llm-litellm",
        "type": "llm",
        "startTime": "2026-09-20T10:30:00.000Z",
        "endTime": "2026-09-20T10:30:01.800Z",
        "durationMs": 1800,
        "input": { "messages": [] },
        "output": { "content": "…" },
        "metadata": {},
        "tags": [],
        "model": "mi-modelo-v2",
        "usage": { "promptTokens": 150, "completionTokens": 80, "totalTokens": 230 },
        "hasError": false
      }
    ],
    "pagination": { "page": 1, "size": 50, "total": 1, "totalPages": 1 }
  }
}

Crear un span

CampoTipoDescripción
trace_idtextoObligatorio. Id de la traza a la que pertenece.
nametextoObligatorio. Nombre del paso.
typetextoUno de los tipos de arriba. Por defecto general.
parent_span_idtextoId del span padre, para anidar pasos.
input / outputcualquieraEntrada y salida del paso.
modeltextoModelo usado, en spans de tipo llm.
usageobjetoprompt_tokens, completion_tokens y total_tokens.
metadata / tagsobjeto / texto[]Datos y etiquetas libres.
start_time / end_timefechaISO 8601. Si faltan, se usa la hora de la petición.
bash
curl -X POST "https://app.astrapp.lat/api/v1/projects/$PROJECT_ID/opik/spans" \
  -H "Authorization: Bearer sk_live_xxxxxxxxxxxxx" \
  -H "Content-Type: application/json" \
  -d '{
    "trace_id": "ID_DE_LA_TRAZA",
    "name": "respuesta-del-modelo",
    "type": "llm",
    "input": { "prompt": "Analiza este documento…" },
    "output": { "analysis": "…" },
    "model": "mi-modelo-v2",
    "usage": { "prompt_tokens": 500, "completion_tokens": 200, "total_tokens": 700 }
  }'
Respuesta 201
{
  "success": true,
  "data": {
    "span": {
      "id": "…",
      "traceId": "…",
      "name": "respuesta-del-modelo",
      "type": "llm",
      "createdAt": "2026-09-20T10:30:00.000Z"
    },
    "message": "Span creado exitosamente"
  }
}

Límites y notas

  • A diferencia de las trazas, aquí los campos van en snake_case: trace_id, start_time, end_time.
  • El filtro type se aplica sobre la página ya leída: una página puede traer menos de size spans.
  • Si Opik no responde, el listado devuelve spans: [] con un campo warning, y la creación responde 500.