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
+1 -1
View File
@@ -46,7 +46,7 @@ export default {
'session.item.path': '路径',
'session.item.agent': '代理',
'session.item.model': '模型',
'session.item.modelMode': '模',
'session.item.modelMode': '模',
'session.item.worktree': '工作树',
'session.item.pending': '待处理',
'session.item.thinking': '思考中',
+22
View File
@@ -0,0 +1,22 @@
import { describe, expect, it } from 'vitest'
import { getSessionModelLabel } from './sessionModelLabel'
describe('getSessionModelLabel', () => {
it('prefers the explicit session model', () => {
expect(getSessionModelLabel({ model: 'gpt-5.4', modelMode: 'default' })).toEqual({
key: 'session.item.model',
value: 'gpt-5.4'
})
})
it('falls back to Claude model mode when no explicit model exists', () => {
expect(getSessionModelLabel({ modelMode: 'opus' })).toEqual({
key: 'session.item.modelMode',
value: 'Opus'
})
})
it('returns null when neither model nor mode is available', () => {
expect(getSessionModelLabel({})).toBeNull()
})
})
+28
View File
@@ -0,0 +1,28 @@
import { getModelModeLabel } from '@hapi/protocol'
import type { Session, SessionSummary } from '@/types/api'
type SessionModelSource = Pick<Session, 'model' | 'modelMode'> | Pick<SessionSummary, 'model' | 'modelMode'>
export type SessionModelLabel = {
key: 'session.item.model' | 'session.item.modelMode'
value: string
}
export function getSessionModelLabel(session: SessionModelSource): SessionModelLabel | null {
const explicitModel = typeof session.model === 'string' ? session.model.trim() : ''
if (explicitModel) {
return {
key: 'session.item.model',
value: explicitModel
}
}
if (session.modelMode) {
return {
key: 'session.item.modelMode',
value: getModelModeLabel(session.modelMode)
}
}
return null
}