
TL;DR
How much of an AI session can you actually take with you? Store defaults, encrypted reasoning, opaque compaction, hidden search, and subagent ciphertext compared across OpenAI, Anthropic, and Gemini - all verified against live docs.
Direct answer
How much of an AI session can you actually take with you? Store defaults, encrypted reasoning, opaque compaction, hidden search, and subagent ciphertext compared across OpenAI, Anthropic, and Gemini - all verified against live docs.
Best for
Developers comparing real tool tradeoffs before choosing a stack.
Covers
Verdict, tradeoffs, pricing signals, workflow fit, and related alternatives.
Last updated: July 31, 2026
A July 30 essay by the Earendil engineering team hit the top of Hacker News with a question most developers had not thought to ask: how much of an AI session do you actually own? The original promise of an inference API was simple - send input, receive output, and if you kept both, you had the conversation. You could archive it, replay it, or hand it to a different model.
That is increasingly not how the big providers work. Reasoning tokens arrive as encrypted blobs. Server-side compaction produces state only the original provider can decrypt. Hosted web search feeds the model evidence you never see. Subagent messages are sealed ciphertext. The transcript on your machine is becoming a partial view of a session whose operational state lives on the provider's servers.
This is a comparison of session portability across the three major providers, grounded in their live documentation (all links verified July 31, 2026). The practical question is not philosophical. It is: if a model is retired, a policy blocks your next request, a price change makes a competitor attractive, or an auditor needs to reconstruct what happened, what can you actually move?
The Earendil essay proposes a practical test: a portable session is one where another model can continue from your transcript without the old provider dereferencing an ID, decrypting a blob, or reconstructing a summary. Five sub-tests follow:
A response ID is not a transcript. A ciphertext is not user-controlled state. A citation list is not the evidence that was placed in the model's context. On those five tests, the three providers score very differently.
| OpenAI (Responses API) | Anthropic (Messages API) | Gemini (Interactions API) | |
|---|---|---|---|
| Conversation storage default | Stored (30-day TTL) | Not stored by default | Stored (55 days paid / 1 day free) |
| Opt-out | store: false | N/A (stateless by default) | store: false |
| Reasoning visibility | Encrypted items by default | Summarized or omitted; encrypted signature field | Model thoughts recorded in interaction steps |
| Compaction output | Encrypted, opaque ("not intended to be human-interpretable") | Readable summary in a compaction block | Stateless via explicit history |
| Subagent messages | Encrypted (Codex multi-agent v2) | Depends on client; SDK-visible tool calls | Tool calls visible in execution steps |
| Client-side history sufficient to continue elsewhere? | Partially - encrypted items block full replay | Mostly - readable blocks, but thinking must be stripped when switching models | Partially - interaction history retrievable via API |
Verified July 31, 2026 against the OpenAI conversation state guide, OpenAI compaction guide, Anthropic extended thinking docs, Anthropic compaction docs, and Gemini Interactions API docs.
OpenAI's Responses API stores responses by default. Per the conversation state docs, response objects are saved for 30 days unless you set store: false - which the docs recommend for stateless use. Stored responses give you previous_response_id chaining: you send a response ID and a new user message, and the server reconstructs the context.
The portability problem is what rides along inside those stored responses. Two features in particular make the local transcript incomplete:
Encrypted reasoning. The Responses API returns encrypted reasoning items by default. Replaying the complete output preserves them for the same provider, and models that support persisted reasoning can use reasoning.context: "all_turns". But the items are opaque to you. A different provider cannot consume them, and even you cannot inspect the actual reasoning - you can only pass the blob back unchanged. That is provider-sealed state: it works within OpenAI, it does not create a portable record.
Opaque compaction. OpenAI's compaction guide describes two modes. Server-side compaction triggers at a compact_threshold you set, and the response stream includes "the encrypted compaction item". The standalone /responses/compact endpoint returns "a new compacted context window" that the docs describe as opaque and "not intended to be human-interpretable". The docs are explicit: do not prune the output, pass it into the next call as-is. That is the definition of non-portable state - the meaning of the compaction item exists only inside OpenAI's infrastructure.
To OpenAI's credit, store: false is documented, easy, and makes the flow ZDR-friendly. The encryption can even serve a real privacy purpose: encrypted reasoning with store: false avoids persisting intermediate state on OpenAI's servers. But the encryption hides the reasoning from you as much as from the network. The Codex CLI encryption change shows the pattern applied to agents: since June 2026, Codex multi-agent v2 stores inter-agent messages as encrypted_content with the readable content field empty. An open Codex issue asking for a readable audit copy alongside encrypted delivery remains unresolved on upstream main as of July 22, 2026.
From the archive
Jul 31, 2026 • 10 min read
Jul 31, 2026 • 7 min read
Jul 31, 2026 • 7 min read
Jul 31, 2026 • 6 min read
Anthropic's API is stateless by default - there is no server-side conversation store to opt out of. You pass the full message history each turn, which means your client owns the transcript. On the inspection, export, and deletion tests, that is the strongest starting position of the three.
Two features complicate the picture:
Thinking signatures. Anthropic's extended thinking returns thinking blocks with a signature field - "an encrypted copy of the full reasoning that you pass back unchanged". With display: "omitted" (the default on Opus 5, Sonnet 5, and the rest of the current lineup), the readable thinking field is empty and only the signature carries the reasoning. The docs are explicit about what that means for portability: "When you switch between any two models... strip thinking and redacted_thinking blocks from prior assistant turns. Thinking blocks are tied to the model that produced them." The signature is only meaningful to Anthropic's models, and the docs tell you to delete it when switching. Your transcript preserves continuity within Anthropic, not across providers.
Readable compaction. Anthropic's server-side compaction returns a compaction block containing an actual summary - readable text you can inspect, edit, and pass to another model. The docs show the default summarization prompt producing a <summary></summary> block with "the state, next steps, learnings etc." This is the model the other providers should copy: compaction that preserves the provider's quality advantages without locking the meaning inside ciphertext.
Google's new Interactions API - the model-agnostic surface where all new Gemini features land - stores requests by default. The docs: "By default, the API stores all Interaction objects (store=true) in order to simplify use of server-side state management features." Paid-tier interactions are retained for 55 days, free-tier for 1 day. You can set store: false, but with a real tradeoff: it is incompatible with background execution and prevents previous_interaction_id continuation.
The Interactions API is actually the most transparent of the three on the state question. An interaction is "a session record, containing the entire history... as a chronological sequence of execution steps", including "model thoughts", tool calls and results, and the final output. Stored interactions can be retrieved via interactions.get and deleted programmatically. If you are inside Google's ecosystem, the audit surface is genuinely good.
The portability gap is structural rather than hidden: the canonical record lives on Google's servers. Your local copy is whatever your client logged. store: false and previous_interaction_id are mutually exclusive, so the two paths are "stateless but manually reconstructable" or "stateful but server-hosted". There is no mode where a full-fidelity transcript exists on both sides.
The theoretical concern (can I switch providers?) matters less than the practical ones, because most teams do not switch models mid-session. The Earendil essay names the scenarios where portability is not an abstraction:
Whatever provider you standardize on, you can improve your position with five practices:
store: false where you do not need server state. OpenAI and Gemini both document it; it is the single biggest control you have. OpenAI's docs note that server-side compaction is ZDR-friendly when you also pass store: false.The honest counterargument: for most teams, most of the time, provider-sealed state is a fair trade. Stored conversations reduce payloads, encrypted reasoning is a genuine ZDR benefit, and server-side compaction lowers latency and cost. The Earendil essay's own framing is careful - it does not object to stateful APIs, only to "better performance being coupled to less user control."
Skip the portability work if you are a solo developer with short sessions, no compliance requirements, and no plan to switch providers. The overhead of maintaining a full local event log is real. Add it when sessions get long, when you route between models, or when anyone will ever ask you "what did the agent do and why?"
Session portability is the ability to take the record of a conversation - messages, tool calls, reasoning, and state - from one provider and continue it with another model or in another system. A portable session can be inspected, exported, replayed, audited, and deleted without the original provider dereferencing internal IDs or decrypting sealed state.
By default, yes. Responses API response objects are saved for 30 days and can be viewed in dashboard logs or retrieved via the API. Setting store: false on your requests disables storage. Conversations API objects are not subject to the 30-day TTL.
Yes, by default. The Interactions API stores all interaction objects (store: true default) - 55 days on the paid tier, 1 day on the free tier. Setting store: false opts out but is incompatible with background execution and previous_interaction_id continuation.
No. The Anthropic API is stateless by default - you pass the full message history with each request and there is no server-side conversation store. However, thinking blocks carry an encrypted signature field that must be passed back unchanged and must be stripped when switching models, which limits cross-provider portability.
Partially. If you kept the visible text, tool calls, and results (which store: false chaining encourages), another model can understand and continue the conversation. What does not transfer is encrypted reasoning items and opaque compaction state, whose meaning only exists inside OpenAI's infrastructure. Anthropic's docs also require stripping thinking blocks when switching models, so the reverse direction has its own caveat.
Anthropic's compaction block is the reference design: server-side summarization that returns a readable summary you can inspect, edit, and pass to any model. OpenAI's compaction returns an opaque encrypted item that the docs explicitly say is not human-interpretable. If portability matters, prefer providers and configurations that give you readable summaries over sealed blobs.
| Source | What it verifies | Last verified |
|---|---|---|
| OpenAI conversation state guide | 30-day response storage, store: false, encrypted reasoning, previous_response_id | July 31, 2026 |
| OpenAI compaction guide | Server-side and standalone compaction, opaque encrypted compaction item | July 31, 2026 |
| Anthropic extended thinking docs | signature field, display: "omitted" default, strip-on-model-switch rule | July 31, 2026 |
| Anthropic compaction docs | Readable compaction block, default summarization prompt, pause_after_compaction | July 31, 2026 |
| Gemini Interactions API docs | store: true default, 55-day/1-day retention, store: false tradeoffs | July 31, 2026 |
| Codex issue #28058 | Encrypted multi-agent v2 messages, missing readable audit trail, open status | July 31, 2026 |
| Earendil: The Session You Cannot Take With You | The five-test portability framework, HN front page July 30-31, 2026 | July 31, 2026 |
Read next
OpenAI's Codex CLI now encrypts inter-agent communications for Sol and Terra models, leaving users unable to inspect what their agents are actually doing.
5 min readTerminal agents like Claude Code, Codex CLI, OpenCode, Copilot CLI, and DeepSeek-TUI are converging on the same runtime layer: permissions, sandboxing, rollback, diagnostics, subagents, receipts, and cost controls.
9 min readGitHub Trending is full of agent memory and context tools. The useful version is not magic recall. It is a context ledger: source-linked, scoped, expiring memory that agents can inspect and users can audit.
8 min readTechnical content at the intersection of AI and development. Building with AI agents, Claude Code, and modern dev tools - then showing you exactly how it works.
The TypeScript toolkit for building AI apps. Unified API across OpenAI, Anthropic, Google. Streaming, tool calling, stru...
View ToolUnified API for 200+ models. One API key, one billing dashboard. OpenAI, Anthropic, Google, Meta, Mistral, and more. Aut...
View ToolFactory AI's terminal coding agent. Runs Anthropic and OpenAI models in one subscription. Handles full tasks end-to-end...
View ToolAnthropic's agentic coding CLI. Runs in your terminal, edits files autonomously, spawns sub-agents, and maintains memory...
View ToolDeep comparison of the top AI agent frameworks - LangGraph, CrewAI, Mastra, CopilotKit, AutoGen, and Claude Code.
AI AgentsManaged scheduling on Anthropic infrastructure with API and GitHub triggers.
Claude CodeContinue a subagent's work across sessions.
Claude Code
In this video, I dive into an in-depth comparison between the latest AI models GPT-4.5 and Claude 3.7 Sonnet. 📊 You'll learn about the strengths and weaknesses of each model, as well as...

Sign up for Runbear with the below link to receive a 25% discount! https://runbear.io/?utm_source=developerdigest Coupon Code: DEVELOPERDIGEST Valid until February 2025 In this video, I demonstrat...

Getting Started with OpenAI's New TypeScript Agents SDK: A Comprehensive Guide OpenAI has recently unveiled their Agents SDK within TypeScript, and this video provides a detailed walkthrough...

OpenAI's Codex CLI now encrypts inter-agent communications for Sol and Terra models, leaving users unable to inspect wha...

Terminal agents like Claude Code, Codex CLI, OpenCode, Copilot CLI, and DeepSeek-TUI are converging on the same runtime...

GitHub Trending is full of agent memory and context tools. The useful version is not magic recall. It is a context ledge...

Agent runs are opaque. TraceTrail turns a Claude Code JSONL into a public share link with a stepped timeline of messages...

OpenAI's June 2026 API changelog looks like scattered platform plumbing. Read together, moderation scores, workload iden...

Cut Claude API spend by up to 90% with prompt caching. Real numbers, TypeScript SDK code, and the gotchas Anthropic's do...

A frontier model disappeared overnight by government order. If your product, agents, or CI depend on one closed model, h...

New tutorials, open-source projects, and deep dives on coding agents - delivered weekly.