01 — Read an LLM Request End to End¶
Previous: Setup · Workshop home · Next: Prompt Management
Goal¶
Generate production-like traffic in LibreChat, then use Langfuse to explain what happened, which model ran, how long it took, and what it cost in tokens.
Generate three useful traces¶
Open LibreChat at http://localhost:3080. Confirm that Workshop Model / auto is selected.
Send these as separate new conversations so they are easy to find:
Normal support request¶
Structured-output request¶
Return JSON only with keys category, urgency, and summary.
Customer message: My invoice doubled and I cannot see why.
Deliberate edge case¶
The edge case gives later monitoring and dataset modules something meaningful to work with. A small local model may not follow every formatting instruction; that is quality evidence, not an infrastructure failure.
Find the observation¶
Open Langfuse at http://localhost:3000 and enter the LLMOps Workshop project.
- Open the tracing/observability area.
- Set the time range to include the last 15 minutes.
- Open the newest trace or generation.
- Find the generation named:
sonnet/responsein Anthropic modelocal/responsein local-model mode
Langfuse UI labels may evolve between v4 releases. Use Tracing, Traces, Observations, or Generations—whichever table exposes the recent model call.
Trace-reading checklist¶
Record the following in your evidence notes:
| Field | Question to answer |
|---|---|
| Name | Does it identify sonnet or local? |
| Input | Is the user message present and correctly serialized? |
| Output | Is the assistant response complete? |
| Model | Which provider/model name did LiteLLM report? |
| Start/end | What is the end-to-end duration? |
| Time to first token | Is it available for this request type? |
| Usage | How many input and output tokens were recorded? |
| Cost | Is provider cost available, or zero for the local model? |
| Status | Did the call complete without an error? |
| Tags | Do you see self-service-workshop and the backend tag? |
| Metadata | Does routed_model match the setup choice? |
Understand the data model¶
- A trace represents one end-to-end interaction or request context.
- An observation is one operation inside that trace.
- A generation is an observation that called a generative model.
- A span represents non-generation work such as retrieval or a tool call.
- A score is a quality judgment attached later to a trace, observation, session, or experiment run.
This stack observes LiteLLM through an OpenTelemetry callback. The current application is intentionally simple, so most learner traffic appears as one key generation rather than a deeply nested agent graph.
Prove the route is explicit¶
The callback adds a backend tag and does not implement fallback. Inspecting both the running services and observation name proves the selected route.
sonnet/responseplus no running Ollama means Anthropic was selected.local/responseplus a running Ollama means the selected local model was used.- A model failure remains visible as a failure instead of silently moving to another provider.
Call the gateway without LibreChat¶
This isolates LiteLLM from the UI and is useful during incident triage.
set -a
source .env
set +a
curl --fail --silent --show-error \
http://localhost:4000/v1/chat/completions \
-H "Authorization: Bearer $LITELLM_MASTER_KEY" \
-H "Content-Type: application/json" \
-d '{
"model": "auto",
"messages": [
{"role": "user", "content": "Reply with exactly: observability verified"}
],
"max_tokens": 30
}'
Refresh Langfuse and find the additional generation. If the API succeeds but no generation appears after 10 seconds, inspect:
Optional exploration¶
Use table filters to compare the three requests:
- latency by request
- token usage by request
- successful structured output versus malformed output
- the edge case versus the normal support request
Bookmark the most interesting failure. You will turn it into evaluation data later.
Checkpoint¶
- Three learner requests appear in Langfuse.
- You identified input, output, model, latency, usage, tags, and status.
- The observation name and running services agree on the selected backend.
- A direct LiteLLM request creates another observation.
Continue to 02 — Prompt Management.