unify model selection

This commit is contained in:
weishu
2026-03-16 18:29:09 +08:00
parent 1f02bb7de1
commit 02c8e12e80
27 changed files with 454 additions and 41 deletions
+17 -1
View File
@@ -1,5 +1,5 @@
import { describe, expect, it } from 'vitest'
import { resolveClaudeSessionModelMode } from './modelMode'
import { resolveClaudePersistedModel, resolveClaudeSessionModelMode } from './modelMode'
describe('resolveClaudeSessionModelMode', () => {
it('returns default when model is missing', () => {
@@ -21,3 +21,19 @@ describe('resolveClaudeSessionModelMode', () => {
expect(resolveClaudeSessionModelMode('opus[1m]')).toBe('opus[1m]')
})
})
describe('resolveClaudePersistedModel', () => {
it('skips missing, auto, default, and representable mode names', () => {
expect(resolveClaudePersistedModel()).toBeUndefined()
expect(resolveClaudePersistedModel('')).toBeUndefined()
expect(resolveClaudePersistedModel('auto')).toBeUndefined()
expect(resolveClaudePersistedModel('default')).toBeUndefined()
expect(resolveClaudePersistedModel('sonnet')).toBeUndefined()
expect(resolveClaudePersistedModel('opus[1m]')).toBeUndefined()
})
it('persists unsupported custom Claude model strings', () => {
expect(resolveClaudePersistedModel('claude-3-7-sonnet-latest')).toBe('claude-3-7-sonnet-latest')
expect(resolveClaudePersistedModel(' claude-opus-4-1-20250805 ')).toBe('claude-opus-4-1-20250805')
})
})
+15 -3
View File
@@ -8,11 +8,23 @@ const CLAUDE_SESSION_MODEL_MODES = new Set<SessionModelMode>([
])
export function resolveClaudeSessionModelMode(model?: string): SessionModelMode {
if (!model) {
const trimmedModel = model?.trim()
if (!trimmedModel) {
return 'default'
}
return CLAUDE_SESSION_MODEL_MODES.has(model as SessionModelMode)
? model as SessionModelMode
return CLAUDE_SESSION_MODEL_MODES.has(trimmedModel as SessionModelMode)
? trimmedModel as SessionModelMode
: 'default'
}
export function resolveClaudePersistedModel(model?: string): string | undefined {
const trimmedModel = model?.trim()
if (!trimmedModel || trimmedModel === 'auto' || trimmedModel === 'default') {
return undefined
}
return resolveClaudeSessionModelMode(trimmedModel) === 'default'
? trimmedModel
: undefined
}
+3 -2
View File
@@ -17,7 +17,7 @@ import { createModeChangeHandler, createRunnerLifecycle, setControlledByUser } f
import { isModelModeAllowedForFlavor, isPermissionModeAllowedForFlavor } from '@hapi/protocol';
import { ModelModeSchema, PermissionModeSchema } from '@hapi/protocol/schemas';
import { formatMessageWithAttachments } from '@/utils/attachmentFormatter';
import { resolveClaudeSessionModelMode } from './modelMode';
import { resolveClaudePersistedModel, resolveClaudeSessionModelMode } from './modelMode';
export interface StartOptions {
model?: string
@@ -50,7 +50,8 @@ export async function runClaude(options: StartOptions = {}): Promise<void> {
flavor: 'claude',
startedBy,
workingDirectory,
agentState: initialState
agentState: initialState,
model: resolveClaudePersistedModel(options.model)
});
logger.debug(`Session created: ${sessionInfo.id}`);