Added a toggle to control model optimization in OpenCode with status bar display and plugin access.
The bottom status bar now shows the optimization state next to the model info:
anthropic claude-sonnet-4-5 OPTIMIZE: ON
- Green "ON" when enabled
- Gray "OFF" when disabled
Access via command palette (Cmd+O or configured keybind):
- Command: "Toggle model optimization (ON/OFF)"
- Category: Agent
- Keybind:
optimize_toggle(can be configured in keybindings)
Plugins can now access the optimization state via the prompt.before hook:
export const MyPlugin = async () => {
return {
"prompt.before": async (input, output) => {
// Check if optimization is enabled
if (input.optimizeEnabled) {
// Apply optimizations
if (input.prompt.includes("simple")) {
output.model = {
providerID: "anthropic",
modelID: "claude-3-5-haiku-20241022"
}
}
} else {
// Skip optimization - use default model
console.log("Optimization disabled, using default model")
}
}
}
}The toggle state is saved to ~/.opencode/state/optimize.json and persists across sessions.
-
packages/opencode/src/cli/cmd/tui/context/local.tsx
- Added
optimizestate management - Provides
enabled,toggle(), andset()methods - Persists state to disk
- Added
-
packages/opencode/src/cli/cmd/tui/component/prompt/index.tsx
- Added "OPTIMIZE: ON/OFF" display in status bar
- Shows next to model info with color coding
-
packages/opencode/src/cli/cmd/tui/app.tsx
- Added "Toggle model optimization" command
- Accessible via command palette
-
packages/opencode/src/session/prompt.ts
- Added
optimizeEnabledtoPromptInputschema - Passes state to
prompt.beforehook
- Added
-
packages/plugin/src/index.ts
- Added
optimizeEnabled: booleantoprompt.beforeinput type - Plugins can now check optimization state
- Added
-
Toggle optimization:
- Press
Cmd+O(or your command palette key) - Type "toggle model"
- Select "Toggle model optimization"
- Or configure a dedicated keybinding for
optimize_toggle
- Press
-
Check current state:
- Look at the bottom status bar
- You'll see "OPTIMIZE: ON" (green) or "OPTIMIZE: OFF" (gray)
Update your plugin to respect the optimization toggle:
export const ModelOptimizerPlugin = async () => {
return {
"prompt.before": async (input, output) => {
// Only optimize if user has it enabled
if (!input.optimizeEnabled) {
return // Skip optimization
}
// Your optimization logic here
if (isSimpleTask(input.prompt)) {
output.model = cheapModel
} else if (isComplexTask(input.prompt)) {
output.model = powerfulModel
}
}
}
}export const TestPlugin = async () => {
console.log("🎯 Test Plugin Loaded!")
return {
"prompt.before": async (input: any, output: any) => {
console.log("\n" + "=".repeat(60))
console.log("🔥 PROMPT.BEFORE HOOK FIRED!")
console.log("=".repeat(60))
console.log("Session:", input.sessionID)
console.log("Agent:", input.agent)
console.log("Prompt:", input.prompt)
console.log("Optimize Enabled:", input.optimizeEnabled ? "✅ ON" : "❌ OFF")
console.log("=".repeat(60) + "\n")
// Only apply model optimization if enabled
if (input.optimizeEnabled) {
if (input.prompt.toLowerCase().includes("simple")) {
output.model = {
providerID: "anthropic",
modelID: "claude-3-5-haiku-20241022"
}
console.log("✅ SWITCHED TO HAIKU (optimization enabled)\n")
}
} else {
console.log("⏭️ Skipping optimization (disabled by user)\n")
}
}
}
}-
Start OpenCode:
cd ~/Development/ai/opencode-auto bun dev
-
Check initial state:
- Bottom status bar should show "OPTIMIZE: ON" (default)
-
Toggle it:
- Press
Cmd+O - Type "toggle model"
- Select the command
- Status bar should update to "OPTIMIZE: OFF"
- Toast message confirms the change
- Press
-
Test with plugin:
- Send prompt: "This is a simple task"
- With OPTIMIZE ON: Should switch to Haiku
- With OPTIMIZE OFF: Should use default model
- User Control: Users can enable/disable model optimization without changing plugins
- Cost Savings: Users can turn off optimization to always use their preferred model
- Debugging: Easy to test with/without optimization
- Plugin Respect: Plugins can check the user's preference instead of forcing optimization
- Add keybinding configuration documentation
- Consider adding optimization profiles (aggressive/balanced/conservative)
- Add metrics tracking (how much $ saved with optimization ON)