-
Notifications
You must be signed in to change notification settings - Fork 6.6k
Open
Labels
discussionUsed for feature requests, proposals, ideas, etc. Open discussionUsed for feature requests, proposals, ideas, etc. Open discussion
Description
Summary
Add a provider-agnostic /compact command and auto-compaction support to opencode core, along with fork-aware conversation IDs that play nicely with Codex-style prompt_cache_key semantics.
Background
In openai/codex (codex-rs), compaction is a first-class feature:
codex-rs/core/src/compact.rs,core/src/tasks/compact.rs, anddocs/slash_commands.mddefine:- A
/compactslash command that summarizes conversation history. - An
auto_compact_token_limitbased on model metadata (openai_model_info.rs). - A
SUMMARIZATION_PROMPTused to create a handoff summary.
- A
- Tests like
core/tests/suite/compact_resume_fork.rsverify interactions between compaction, resume, and forks, especially with respect toprompt_cache_key.
In the Codex OAuth plugin for opencode:
- We currently strip OpenCode’s own auto-compaction system prompts in CODEX_MODE because they reference a
summary filepath that doesn’t exist for our stateless ChatGPT backend. - We rely on
store: false+include: ["reasoning.encrypted_content"]to preserve context, but we do not have a coherent/compactstory at the host level.
Problem
Without core support for compaction and fork-aware conversation IDs:
- Each provider has to reinvent compaction semantics (or avoid them entirely), leading to inconsistent behavior across backends.
- Codex-style
prompt_cache_keyreuse across resume/fork flows is hard to get right because opencode doesn’t expose explicit fork events to providers. - The Codex plugin can emulate compaction internally, but it cannot:
- Register a shared
/compactslash command. - Coordinate auto-compaction decisions across sessions in a provider-agnostic way.
- Register a shared
Proposed Changes
-
Add a generic
/compactcommand in opencode core- Define a new slash command (e.g.
/compact) that:- Requests a summary of the current conversation from the active provider.
- Replaces (or augments) conversation history with the returned summary so future turns operate on a compacted context.
- Design the protocol so that providers receive a clear “compact this conversation” signal, not just a normal user message.
- Define a new slash command (e.g.
-
Introduce
autoCompactTokenLimitin core configuration- Add a per-provider and per-model
autoCompactTokenLimitfield in opencode’s config model (analogous to Codex’sauto_compact_token_limit). - Track approximate token usage per conversation (input + output), and when a configurable threshold is crossed:
- Automatically trigger the compact action (e.g. run
/compactunder the hood) before sending the next user prompt.
- Automatically trigger the compact action (e.g. run
- Allow users to override or disable auto-compaction globally and per-project.
- Add a per-provider and per-model
-
Fork-aware conversation IDs and provider hooks
- Extend the core session manager so that:
- Conversations have explicit, stable IDs.
- Forks (branching from an existing conversation) are modeled as first-class operations with
parentConversationIdand optionalforkId/branchId.
- Provide a provider hook (e.g.
onConversationFork) that:- Allows providers to adjust their own cache keys (
prompt_cache_keyfor Codex) when forks occur. - Enables Codex-like semantics where:
- Overrides do not change
prompt_cache_key. - Forks do generate new cache keys derived from the parent.
- Overrides do not change
- Allows providers to adjust their own cache keys (
- Extend the core session manager so that:
-
Provider API surface for compaction
- Define a provider capability flag (e.g.
supportsCompaction) and a method likecompactConversation(context) -> summary. - Implement this in the Codex plugin by:
- Reusing the official
compactprompt from Codex CLI or a close approximation. - Leveraging encrypted reasoning content to maintain continuity.
- Reusing the official
- Other providers (OpenAI Platform, local models, etc.) can opt in with their own prompts.
- Define a provider capability flag (e.g.
Why This Belongs in Core
- Compaction and conversation forking are cross-provider concerns: every backend has context limits and benefits from summarization.
- A generic
/compactcommand and auto-compaction framework let plugins focus on the prompt and model details instead of reimplementing session semantics. - Codex-specific details (like
prompt_cache_key) become easier to integrate cleanly when opencode’s session model exposes the right hooks.
Acceptance Criteria
- There is a new
/compactcommand in opencode that providers can implement. - Configuration supports
autoCompactTokenLimit(or similar) per provider/model. - Conversations and forks have explicit IDs exposed to providers.
- Providers can implement fork-aware caching (Codex:
prompt_cache_key, others: own fields) with clear lifecycle events. - The Codex OAuth plugin and at least one non-Codex provider are able to adopt the new compaction hooks in a consistent way.
artem-zinnatullin and vikyw89
Metadata
Metadata
Assignees
Labels
discussionUsed for feature requests, proposals, ideas, etc. Open discussionUsed for feature requests, proposals, ideas, etc. Open discussion