Choose an interface
MCP is optional. It is useful for agent-driven investigation, but the dashboard, SDK, and REST API expose deployment observability without it.
What you can see, by provider
Request, latency, token, cost, and engine telemetry (queue depth, KV-cache usage) work identically everywhere — they come from the request path and the engine, not the hardware. The GPU hardware snapshot (per-GPU utilization, memory used/total, power draw, temperature, plus aggregates) rides the replica heartbeat and depends on what the serving agent can reach on each provider’s boxes:
GCP and DigitalOcean serving are not enabled yet (see Serving providers); their rows describe what those providers will report.
Two design contracts worth knowing: the snapshot is fail-soft (a box where no GPU library works simply omits the readings — GPU telemetry can never break the heartbeat that liveness monitoring depends on), and it is vendor-neutral in shape — NVIDIA and AMD boxes emit the identical schema, so dashboards and Prometheus queries never branch on vendor.
Verify observability end to end
1. Select a serving deployment
id and export it for the REST examples:
2. Generate buffered and streaming traffic
Send a regular request with the Veri CLI:include_usage. Setting it means your client also receives the final usage-only chunk (empty choices, populated usage), which makes the test self-documenting.
3. Inspect the dashboard
Open Analytics in the Veri dashboard and select the deployment. Choose Past hour, then click refresh. After the two requests finish, expect:- Request and token volume to be non-zero.
- The recent requests table to contain both requests.
- End-to-end latency samples for successful buffered and streaming requests.
- TTFT and TPOT samples for the streaming request.
- A zero or near-zero error rate.
- Cost-efficiency values once the window contains successful requests with output tokens.
4. Verify with the Python SDK
datetime values are serialized as RFC 3339 timestamps. You can also pass RFC 3339 strings directly.
A minimal automated smoke test can assert:
5. Verify with REST
Lifetime counters, plus latency and error stats for the past 24 hours:total_requests, total_prompt_tokens, and total_completion_tokens count every request you sent since the deployment was created (eval calls excluded). avg_latency_ms, p50_latency_ms through p99_latency_ms, and error_rate cover the past 24 hours only (null latency when there were no requests in that window). For any other window, use metrics/timeseries, whose summary carries the same stats for the range you ask for.
Time-series metrics default to the past seven days when from and to are omitted:
Scope results to a single replica
Themetrics/timeseries, metrics/engine-timeseries, and requests endpoints accept an optional replica_id query parameter. List replica IDs with GET /v1/deployments/$DEPLOYMENT_ID/replicas:
replica_id is set, buckets, the window summary, engine gauges (queue depth and KV-cache utilization), and recent requests are scoped to that replica. Cost efficiency becomes replica-scoped as well: window cost is the replica’s own active interval multiplied by its per-box GPU rate. Without replica_id, window cost is the sum of every replica’s billed time in the window. Each bucket also carries cost_usd, the GPU cost billed inside that bucket, so cost lands where the boxes actually ran. Scoped metrics responses echo replica_id at the top level. The ID must be a replica of the deployment; unknown IDs return 404. Omit the parameter to keep deployment-wide aggregates.
Evaluation traffic
Requests that Veri evaluators and experiments send to a deployment are recorded with origineval and kept out of your production numbers. The lifetime counters, metrics, metrics/timeseries, the dashboard charts, and the default requests listing count only your own API traffic. List the eval calls with origin=eval:
Retention
Older rows are deleted automatically. Deleting a deployment removes all of it at once.
See the interactive API reference for complete response schemas.
Request traces
Request telemetry (above) records that requests happened; traces additionally capture the full request and response bodies so you can see exactly what was asked and what the model answered. Traces are opt-in per deployment and off by default, because enabling them stores your end users’ prompt and completion content. Opt in at create time:client.deployments.create(..., trace_bodies=True).
Browse traces from the deployment page in the dashboard, the CLI, or the API:
- Cross-linking. Every trace’s
metadata.veri_request_idmatches an id fromdeployments.requests(), so you can join body-level traces with the timing, token, and error telemetry for the same request. - Model version identity. When the request was answered by a registered
model version (an adapter alias on a multi-adapter fleet (beta), or a fleet built from a
registered model),
metadata.model_version_idcarries that version’s id — the same value as the request log’smodel_version_id— so per-version quality can group traces by identity instead of by a serve-name string that moves on every promote. - Retention.
basetraces are deleted after 14 days,extendedafter 400. - Pricing. The first 5,000 base-retention traces per workspace each month are free; beyond that, $2.50 per 1k traces at base retention and $5.00 per 1k at extended, metered from credits at month end.
- Never in the request path. Capture is asynchronous and drop-tolerant: if the trace store is unavailable, requests are unaffected and the affected traces are dropped.
- Streaming. Streamed (
stream: true) responses are captured once the stream completes: content, reasoning, tool calls, and finish reason are assembled into one response. A stream that is cut off, errors, or exceeds 1 MiB is not captured; the request still appears in request telemetry. - Threads. Send the same
X-Veri-Thread-Idheader (1-128 characters ofA-Z a-z 0-9 . _ : -) on every request of a conversation to group its traces into a thread; the SDK’ssession_idsends the equivalentX-Veri-Session-Id. The thread id is stored on the request and in trace metadata, and thread evaluators score the whole conversation. The dashboard and API views of threads are in Agent conversations. - Scores. Each trace carries its evaluator scores
(from your own harness, experiments, or human review) under
scores. - Traces to training data. A time window of traces can be imported into a
dataset stream as
chatorpromptrows (veri datasets import-traces), snapshotted, and trained on — production traffic feeding the next fine-tune.
Agent conversations
When an agent calls a deployment, two optional headers let Veri group its requests into conversations:
A header value outside these rules is rejected with
400 before the request reaches the model, for example {"error": {"message": "X-Veri-Agent must be 1-64 characters of [A-Za-z0-9._:-]"}}. The SDK’s session_id sends X-Veri-Session-Id, which also counts as the thread id when it follows the same rules.
key: agent:<X-Veri-Agent value>, deployment:<deployment id> for threads sent without an agent name, or env:<environment id> for a managed agent. Eval calls are left out.
The window is
from and to (RFC 3339), by default the past 24 hours, at most 30 days, starting no earlier than 2000-01-01. A next_cursor keeps the first page’s window end, so page on without to (or repeat the same to): a different to with a cursor is a 400.
To turn one conversation into a dataset row (the dashboard’s Add to dataset), call POST /v1/datasets/{dataset_id}/import-traces with deployment and thread_id. Importing the same conversation into the same dataset again while its newest stored message is unchanged returns 409 export_thread_duplicate, naming the earlier import; send "force": true to append it again.
Export metrics to Prometheus
GET /v1/metrics/export returns your account’s deployment and replica metrics in Prometheus text exposition format (text/plain; version=0.0.4). Authenticate with your API key as a Bearer credential, exactly like every other endpoint. The response covers your deployments only.
Exposed metrics
Per-deployment metrics carrydeployment_id and model labels:
Per-replica metrics add
replica_id, gpu_type, and region labels. Only live replicas (queued, provisioning, serving, or draining) are exported:
Metrics only appear when the underlying data exists: a replica that has not reported a heartbeat yet exports no series, and GPU series are absent where the agent has no hardware telemetry backend (see What you can see, by provider — NVIDIA boxes use NVML, ROCm boxes use amdsmi/rocm-smi, and docker-isolated providers omit them for now).
Prometheus scrape configuration
prometheus.yml
credentials_file at it.
Grafana Cloud
Grafana Alloy forwards the scrape to your Grafana Cloud Prometheus instance:config.alloy
Datadog agent
Use the OpenMetrics check:conf.d/openmetrics.d/conf.yaml
Example alert rule
Alert when requests queue up faster than a replica drains them, and when telemetry goes stale:alerts.yml
Investigate with MCP
Set up Veri MCP by following Model Context Protocol. In read-only mode, all observability tools remain available; only tools that create, cancel, stop, or rescore resources are removed. Useful deployment tools:
Try these prompts:
Inspect deployment <deployment-id> over the past hour. Summarize request volume, p50/p95/p99 TTFT and end-to-end latency, token throughput, error rate, and cost efficiency. Then list failed requests and group them by error category. Do not modify resources.
Compare the past 24 hours with the preceding 24 hours for deployment <deployment-id>. Identify latency, error-rate, throughput, or cost regressions and cite the metric values behind each conclusion.
Review deployment <deployment-id> and my billing overview. Explain whether request volume, output-token efficiency, errors, or the current GPU burn rate is the main cost risk. Do not modify resources.
Agent responses are only as complete as the telemetry window. Include the deployment ID and an explicit period in prompts when you need reproducible results.
Metric semantics
Request timing
TTFT and TPOT are most meaningful for streaming responses. TPOT is only calculated when the upstream engine reports usage. Latency percentiles use successful requests so application and transport failures do not distort the serving-latency distribution.
Traffic and errors
Each terminal request record can include:- Prompt, cached prompt, and completion tokens.
- Request and response byte counts.
- HTTP status and finish reason.
- Whether the response streamed and whether usage was reported.
- A bounded error category and diagnostic message.
- Client cancellation or disconnection state.
- Request start and completion timestamps.
error_category and message.
Cost efficiency
The dashboard and time-series response derive:- Cost per successful request.
- Cost per million output tokens.
- Tokens per dollar.
- Total deployment cost for the selected window.
usage_reported when investigating missing efficiency data.
Engine health
Replica heartbeats provide:- Running and waiting requests.
- KV-cache utilization.
- Prefix-cache hit rate.
- Generation token throughput.
- Active replica count.
- GPU hardware telemetry: utilization, memory used and total, power draw, and temperature.
GPU hardware telemetry
Each replica reports NVML readings with its heartbeat.GET /v1/deployments/$DEPLOYMENT_ID/replicas returns the latest snapshot per replica:
The
metrics/engine-timeseries endpoint adds gpu_utilization (mean across reporting replicas) and gpu_memory_used_bytes (summed) to each bucket and to each per-replica series. All GPU fields are absent or null when a replica does not report telemetry, for example on hardware without NVML.
GPU utilization is a debugging metric, not a scaling signal: it measures the share of time any kernel was resident on the chip, not how much load the engine is under. Scale on queue depth (waiting requests) and KV-cache utilization instead.
Troubleshooting
Where to go next
MCP setup
Let an agent query deployment, training, and billing context.
Deployment commands
Generate traffic, benchmark an endpoint, and inspect recent requests.
API reference
Integrate metrics and request history into your own systems.
Deployment billing
Understand hourly GPU billing and scale-to-zero behavior.

