diff --git a/README.md b/README.md index 48a87f0..1c2cb94 100644 --- a/README.md +++ b/README.md @@ -169,6 +169,21 @@ Add the plugin to your `opencode.json` or `opencode.jsonc`: "max": { "thinkingConfig": { "thinkingBudget": 32768 } } } }, + "claude-opus-5": { + "name": "Claude Opus 5", + "limit": { "context": 1000000, "output": 64000 }, + "modalities": { "input": ["text", "image", "pdf"], "output": ["text"] } + }, + "claude-opus-5-thinking": { + "name": "Claude Opus 5 Thinking", + "limit": { "context": 1000000, "output": 64000 }, + "modalities": { "input": ["text", "image", "pdf"], "output": ["text"] }, + "variants": { + "low": { "thinkingConfig": { "thinkingBudget": 8192 } }, + "medium": { "thinkingConfig": { "thinkingBudget": 16384 } }, + "max": { "thinkingConfig": { "thinkingBudget": 32768 } } + } + }, "claude-sonnet-4-5-1m": { "name": "Claude Sonnet 4.5 (1M Context)", "limit": { "context": 1000000, "output": 64000 }, diff --git a/src/__tests__/effort.test.ts b/src/__tests__/effort.test.ts index 9aad0ec..760b9a3 100644 --- a/src/__tests__/effort.test.ts +++ b/src/__tests__/effort.test.ts @@ -16,6 +16,7 @@ describe('effort module', () => { expect(supportsEffort('claude-sonnet-4.6-1m')).toBe(true) expect(supportsEffort('claude-sonnet-5')).toBe(true) expect(supportsEffort('claude-sonnet-5-1m')).toBe(true) + expect(supportsEffort('claude-opus-5')).toBe(true) }) test('returns false for unsupported models', () => { @@ -25,9 +26,10 @@ describe('effort module', () => { }) describe('supportsXHighEffort', () => { - test('returns true for opus 4.7 and 4.8', () => { + test('returns true for opus 4.7, 4.8 and 5', () => { expect(supportsXHighEffort('claude-opus-4.8')).toBe(true) expect(supportsXHighEffort('claude-opus-4.7')).toBe(true) + expect(supportsXHighEffort('claude-opus-5')).toBe(true) }) test('returns false for other models', () => { @@ -45,6 +47,8 @@ describe('effort module', () => { expect(resolveEffort('claude-opus-4.8', 'low')).toBe('low') expect(resolveEffort('claude-opus-4.8', 'max')).toBe('max') expect(resolveEffort('claude-opus-4.8', 'xhigh')).toBe('xhigh') + expect(resolveEffort('claude-opus-5', 'xhigh')).toBe('xhigh') + expect(resolveEffort('claude-opus-5', 'max')).toBe('max') }) test('clamps xhigh to max for models without xhigh support', () => { @@ -88,6 +92,8 @@ describe('effort module', () => { test('uses budget mapping when thinking and auto-mapping enabled', () => { expect(getEffectiveEffort('claude-opus-4.8', true, 128000, undefined, true)).toBe('max') expect(getEffectiveEffort('claude-opus-4.8', true, 20000, undefined, true)).toBe('medium') + expect(getEffectiveEffort('claude-opus-5', true, 32768, undefined, true)).toBe('max') + expect(getEffectiveEffort('claude-opus-5', true, 8192, undefined, true)).toBe('low') }) test('falls back to medium when auto-mapping disabled', () => { diff --git a/src/constants.ts b/src/constants.ts index 8ed3cb0..fdb25f3 100644 --- a/src/constants.ts +++ b/src/constants.ts @@ -78,6 +78,8 @@ export const MODEL_MAPPING: Record = { 'claude-opus-4-7-thinking': 'claude-opus-4.7', 'claude-opus-4-8': 'claude-opus-4.8', 'claude-opus-4-8-thinking': 'claude-opus-4.8', + 'claude-opus-5': 'claude-opus-5', + 'claude-opus-5-thinking': 'claude-opus-5', // Auto auto: 'auto', // Open weight models diff --git a/src/plugin/effort.ts b/src/plugin/effort.ts index 4c2ab54..d3babe1 100644 --- a/src/plugin/effort.ts +++ b/src/plugin/effort.ts @@ -9,7 +9,7 @@ export const EFFORT_LEVELS: readonly Effort[] = ['low', 'medium', 'high', 'xhigh * Models that support the 5-value effort enum (including xhigh). * These models support up to 128k thinking tokens with max effort. */ -const XHIGH_CAPABLE_MODELS = new Set(['claude-opus-4.7', 'claude-opus-4.8']) +const XHIGH_CAPABLE_MODELS = new Set(['claude-opus-4.7', 'claude-opus-4.8', 'claude-opus-5']) /** * Models that support the 4-value effort enum (no xhigh).