Summary
The preemptive-compaction hook currently uses the same model as the conversation for summarization. This causes 400 errors when using Claude thinking models (e.g., antigravity-claude-opus-4-5-thinking-medium) because the compaction request format is incompatible with Claude's thinking API.
Problem
When a session uses a Claude thinking model via Antigravity:
- Context grows past the threshold (e.g., 70%)
- Preemptive compaction triggers
- Hook calls
session.summarize() with the same model (Claude Opus 4.5 Thinking)
- API returns 400 "Request contains an invalid argument"
Error from session logs:
{
"error": {
"code": 400,
"message": "Request contains an invalid argument.\n\n[Debug Info]\nRequested Model: antigravity-claude-opus-4-5-thinking-medium\nEffective Model: claude-opus-4-5-thinking\nStatus: 400"
}
}
Root Cause
In src/hooks/preemptive-compaction/index.ts (lines 114-115, 172-177):
const modelID = lastAssistant.modelID ?? ""
const providerID = lastAssistant.providerID ?? ""
// ...
const summarizeBody = { providerID, modelID, auto: true }
The hook unconditionally uses the conversation's model for compaction.
Proposed Solution
Add a compaction_model config option under experimental:
{
"experimental": {
"preemptive_compaction": true,
"preemptive_compaction_threshold": 0.70,
"compaction_model": "google/antigravity-gemini-3-pro-low"
}
}
When set, the hook should use this model instead of the session's model:
const configModel = config.experimental?.compaction_model
const modelID = configModel ? parseModelID(configModel) : lastAssistant.modelID ?? ""
const providerID = configModel ? parseProviderID(configModel) : lastAssistant.providerID ?? ""
Benefits
- Avoid API errors with thinking models that don't support compaction requests
- Cost savings by using cheaper models (e.g., Gemini Flash) for summarization
- Consistency with how
small_model works in opencode.json
Workaround
Currently disabling preemptive compaction entirely:
{
"experimental": {
"preemptive_compaction": false
}
}
Environment
- oh-my-opencode: 2.14.0
- Model: google/antigravity-claude-opus-4-5-thinking-medium
- Provider: Google Antigravity
Summary
The preemptive-compaction hook currently uses the same model as the conversation for summarization. This causes 400 errors when using Claude thinking models (e.g.,
antigravity-claude-opus-4-5-thinking-medium) because the compaction request format is incompatible with Claude's thinking API.Problem
When a session uses a Claude thinking model via Antigravity:
session.summarize()with the same model (Claude Opus 4.5 Thinking)Error from session logs:
{ "error": { "code": 400, "message": "Request contains an invalid argument.\n\n[Debug Info]\nRequested Model: antigravity-claude-opus-4-5-thinking-medium\nEffective Model: claude-opus-4-5-thinking\nStatus: 400" } }Root Cause
In
src/hooks/preemptive-compaction/index.ts(lines 114-115, 172-177):The hook unconditionally uses the conversation's model for compaction.
Proposed Solution
Add a
compaction_modelconfig option underexperimental:{ "experimental": { "preemptive_compaction": true, "preemptive_compaction_threshold": 0.70, "compaction_model": "google/antigravity-gemini-3-pro-low" } }When set, the hook should use this model instead of the session's model:
Benefits
small_modelworks in opencode.jsonWorkaround
Currently disabling preemptive compaction entirely:
{ "experimental": { "preemptive_compaction": false } }Environment