The model-API landscape
four providers, one shape
The request-lifecycle walk took apart one provider. Widen the lens: Claude, OpenAI, Gemini, and xAI expose the same core — a single endpoint, tool-calling, a prefix cache — and differ on the things that actually cost you: who holds the conversation state, who runs the tools, who bills per call. And above all of them sits a harness like Cursor, which is not a model at all. Two interactive maps: where the four split, and how every proprietary piece is reproduced in open source.
- the fourClaude · OpenAI · Gemini · xAI
- convergenceone endpoint + tools + prefix cache
- the splitwho holds state, who bills per-call
- the harnessCursor ≠ a model provider
00 Same core, different edges
In the request-lifecycle walk we took one provider apart: a stateless endpoint, a content-addressed prefix cache, a tool loop that runs on your machine. The natural next question is whether the others work the same way. Mostly — yes. All four frontier APIs have converged on one shape: a single chat/generate endpoint, function / tool calling,structured output, and a prefix cache that makes re-sending context cheap.
What they don’t share is the stuff that quietly changes your architecture and your bill: whether the server keeps your conversation for you or you resend it every turn; whether a search or a code-run happens on their side or yours; and how server-hosted tools are priced. Click a provider to focus its column, or click any row to see what the axis means and its open-source equivalent:
| axis | Claude | OpenAI | Gemini | xAI · Grok |
|---|
Read the columns and the pattern falls out. Claude is the purist stateless design — you always hold the transcript, caching is an explicit cache_control breakpoint. OpenAI’s Responses API lets you flip store:true and continue with previous_response_id, moving state to the server. Gemini offers context caching plus its own interaction-id continuation. xAI · Grokis OpenAI-shaped, and prices its server tools (Live Search) per call rather than folding them into tokens — a genuinely different cost model.
01 The common shape
Strip away the branding and every one of these APIs is the same object. You POST a list of messagesplus a set of tool definitions; you get back either text or a request to call a tool; you run the tool (or the server does) and post the result back. State is either your job (resend) or theirs (an id). Caching sits underneath, invisible, making the resend cheap.
┌──────────────────────── your client / harness ────────────────────────┐
│ messages[] + tools[] + model:"…" (you keep the transcript) │
└───────────────────────────────────┬─────────────────────────────────────┘
│ POST (whole context, every turn)
▼
┌───────────────────────────────────────────────────────────────────────────────────┐
│ ONE ENDPOINT /v1/messages · /v1/responses · :generateContent · /chat/completions │
│ ┌───────────────┐ ┌───────────────┐ ┌───────────────┐ ┌───────────────────┐ │
│ │ prefix cache │──▶│ the model │──▶│ tool-call req │──▶│ structured output │ │
│ │ (skip recompute) (forward pass) (function call) (JSON / grammar) │ │
│ └───────────────┘ └───────────────┘ └──────┬────────┘ └───────────────────┘ │
└────────────────────────────────────────────────┼──────────────────────────────────┘
│ "call search(...)" / "call grep(...)"
┌──────────────────────────┴───────────────────────────┐
▼ ▼
SERVER-SIDE tool CLIENT-SIDE tool
(Live Search, code-exec, managed agent) (your grep / your DB / your API)
billed per-call or per-token runs on your machine, free
└───────────────────────────┬──────────────────────────┘
│ result posted back as the next message
▼
loop until the model stops askingThe one axis that’s genuinely moving is state. The original design (Claude, classic completions) is stateless: the client is the source of truth and resends everything. The newer tier (OpenAI Responses withstore, Gemini interactions, and every provider’s managed-agent product) lets the server hold the session, run the loop, and host the sandbox. Same core; the boundary of “who remembers” is sliding from client to server — and that’s the thing to watch, because it changes where the GPU work lives.
02 Cursor is a harness, not a model
model string and the same harness now speaks to a different provider. Claude Code, Aider, and OpenHands occupy the exact same role.This is why the distinction matters for the map: a harness adds no new model capability — it’s orchestration around the common shape. Everything Cursor does to your repo is the client-side tool loop from the previous walk, wrapped in a nice UI. Which means it’s all reproducible in the open, and it is — the second map shows exactly which project fills each slot.
03 The whole thing, in open source
None of this requires a frontier lab. Every proprietary piece — the serving endpoint, the prefix cache, structured output, the agent harness, the sandbox, server-side search, the vector store, the reasoning tier — has a mature open-source equivalent you can host. Pick a capability to see the real projects that fill it; each chip links to its repository:
Put together, this is a self-hosted rebuild of the whole landscape: vLLM or SGLang as the endpoint (with RadixAttention giving you the prefix cache for free), Outlines / XGrammarfor structured output, OpenHands / Aider as the harness, E2B for the sandbox,SearxNG for server-side search, pgvector / Qdrant for retrieval, andDeepSeek-R1 for the reasoning tier — all wired together with LiteLLM so the calling code never has to know which one it’s talking to. The convergence the first map showed is exactly what makes this swap possible.
04 Why an observability company cares
Four providers, one harness category, a full open-source mirror — and every single one of them runs on GPUs. Whether it’s Anthropic’s stateless endpoint, OpenAI’s stored session, or your own vLLM box, the box that actually answers is a rack of accelerators doing forward passes. The prefix cache that all four converged on is, physically, the GPUs choosing not to recompute attention over a prefix — the exact gap this company measures.
And the observability gap is provider-agnostic. `nvidia-smi` reads ~100% on a cache-heavy serving node and on a cold one alike; it can’t tell you which fraction of that silicon-time was fresh, useful work. That’s true for Anthropic, for xAI, and for the open stack you host yourself. TheFrontier Stack is the layers; this page is the industry’s serving edge; Plasmient is the instrument that reads the truth across all of it. See it at the operation where the gap is widest — the attention deep-dive.
↗ Full references — go to the source
Primary provider docs first, then the open-source projects that reproduce each capability — this page is deliberately open-source-heavy. Read the four API references side by side and the convergence is obvious.
- docsAnthropicMessages API — the stateless POST /v1/messages every Claude call is built on
- docsOpenAIResponses API — store:true + previous_response_id, the server-side-state option
- docsGoogleGemini API — generateContent, context caching, and the interaction-id state model
- docsxAIGrok API — OpenAI-compatible chat/completions + per-call server tools (Live Search)
- docsCursorThe harness, not a model: Agent, Background Agents, and the CLI that drive any of the four
- repovLLMThe open serving engine — PagedAttention, continuous batching, an OpenAI-compatible server you host
- repoSGLangRadixAttention — automatic prefix caching, the open version of “prompt caching”
- repoLiteLLMOne OpenAI-shaped interface over 100+ providers — the convergence, as a proxy
- repoOutlinesStructured / JSON-schema output enforced client-side — the open “response_format”
- repoXGrammarFast grammar-constrained decoding, the engine behind structured output in vLLM/SGLang
- repoOpenHandsThe open coding-agent harness — the Cursor/Claude-Code role, fully inspectable
- repoAiderTerminal coding agent — the client-side tool loop in a few thousand lines of Python
- repoModel Context ProtocolThe open standard for wiring tools/data into any model — cross-provider tool use
- repoE2BOpen sandboxes for agent code execution — the container the managed tiers hide
- repoDeepSeek-R1Open reasoning model — the “thinking” tier you can host instead of o-series/Grok-reasoning