The two planes
Collector — data plane
Runs inside your VPC. Exposes an OpenAI-compatible endpoint, forwards each call to the upstream provider, prices it, and writes the full record to a local Postgres you own. Prompts, RAG chunks and responses live here and stay here.
Firedog cloud — control plane
The dashboard. Receives metadata only through the ingest API — tokens, cost, latency, model, and the attribution tags you set. It attributes and charts the spend. It never receives prompt or response content.
The collector speaks the OpenAI Chat Completions API, so most apps adopt it with a base-URL swap or the
@firedog/sdk client. See /quickstart to route your first call.What crosses the boundary, and what does not
- Stays in your VPC (CallRecord)
- Crosses to Firedog cloud (CallMetadata)
The full record is written to your local Postgres and is never emitted:
- Prompt messages
- Any RAG chunks or retrieved context
- The model’s response
- The priced usage and latency for that call
callId. It is never copied to the cloud.callId is a ULID minted client-side. It is the only thing that links the full VPC record to the cloud metadata, which is what lets a dashboard drill-down reach back into the collector for detail without the content ever having left.
The life of a call
Your app calls the collector
Your application sends a normal Chat Completions request, either through the
@firedog/sdk client or a plain base-URL swap. Attribution context travels as headers — x-firedog-call-id, x-firedog-team, x-firedog-workflow, x-firedog-user — so the collector knows which desk and workflow to file the call under.The collector mints or receives the callId
If the SDK already minted a
callId, the collector uses it; otherwise it mints one. This ULID will correlate the full local record with the cloud metadata for the rest of the call’s life.It forwards to the upstream provider
The collector forwards the request to the real provider using your
apiKey, and receives the completion. It is a transparent proxy on the request path.It prices the call
Using a shared pricing table (per-model input/output rates), the collector computes the exact cost from the returned token counts — for example
opus at 15/75 USD per 1M tokens.It writes the full record to local Postgres
The complete
CallRecord — prompt, chunks, response, usage — is persisted to the Postgres instance in your VPC. This is the audit-grade source of truth, and it never leaves your network.It emits metadata-only to Firedog cloud
The collector sends
CallMetadata to the ingest API. What it is permitted to include is decided by your sensitivity profile. Content is never part of this payload.A drop-in proxy user who does not use the SDK sets the same
x-firedog-* headers directly. The attribution model is identical either way.The two planes, drawn
The solid arrows are the request path and the full record, all inside your VPC. The dashed arrow crossing the boundary carries metadata only. The return dashed arrow shows a drill-down: the dashboard asks for detail bycallId, but that detail is fetched from the collector within your VPC — it is never stored in the cloud.
What the dashboard shows
Once metadata is flowing, the same reconciled dollars are sliced five ways:Home
The reconciled bill per workflow, where tagged plus untagged equals the vendor total to the cent.
Cost allocation
The same dollars sliced by workflow, desk, tool, model and use-case, with an exportable spend report.
Workflow detail
Step by step why one run costs what it does — the re-read tax, made visible.
Answer quality
LLM-judge pass rates per model and use-case, from a sampled score.
Audit trail
A per-call evidence ledger, plus measured cheaper-model savings from shadow testing.
