Add support for claude 1M context. close #291

This commit is contained in:
weishu
2026-03-16 08:51:40 +08:00
parent fedc8e79eb
commit ce5edc42e1
12 changed files with 103 additions and 11 deletions
+2 -3
View File
@@ -8,6 +8,7 @@ import { claudeRemoteLauncher } from "./claudeRemoteLauncher"
import { ApiClient } from "@/lib"
import type { SessionModelMode } from "@/api/types"
import type { ClaudePermissionMode } from "@hapi/protocol/types"
import { resolveClaudeSessionModelMode } from "./modelMode"
export type PermissionMode = ClaudePermissionMode;
@@ -45,9 +46,7 @@ export async function loop(opts: LoopOptions) {
const logPath = logger.logFilePath;
const startedBy = opts.startedBy ?? 'terminal';
const startingMode = opts.startingMode ?? 'local';
const modelMode: SessionModelMode = opts.model === 'sonnet' || opts.model === 'opus'
? opts.model
: 'default';
const modelMode: SessionModelMode = resolveClaudeSessionModelMode(opts.model)
const session = new Session({
api: opts.api,
client: opts.session,
+23
View File
@@ -0,0 +1,23 @@
import { describe, expect, it } from 'vitest'
import { resolveClaudeSessionModelMode } from './modelMode'
describe('resolveClaudeSessionModelMode', () => {
it('returns default when model is missing', () => {
expect(resolveClaudeSessionModelMode()).toBe('default')
})
it('returns default for auto and unsupported models', () => {
expect(resolveClaudeSessionModelMode('auto')).toBe('default')
expect(resolveClaudeSessionModelMode('claude-sonnet-4-5')).toBe('default')
})
it('returns standard Claude session model modes', () => {
expect(resolveClaudeSessionModelMode('sonnet')).toBe('sonnet')
expect(resolveClaudeSessionModelMode('opus')).toBe('opus')
})
it('returns 1m Claude session model modes', () => {
expect(resolveClaudeSessionModelMode('sonnet[1m]')).toBe('sonnet[1m]')
expect(resolveClaudeSessionModelMode('opus[1m]')).toBe('opus[1m]')
})
})
+18
View File
@@ -0,0 +1,18 @@
import type { SessionModelMode } from '@/api/types'
const CLAUDE_SESSION_MODEL_MODES = new Set<SessionModelMode>([
'sonnet',
'sonnet[1m]',
'opus',
'opus[1m]'
])
export function resolveClaudeSessionModelMode(model?: string): SessionModelMode {
if (!model) {
return 'default'
}
return CLAUDE_SESSION_MODEL_MODES.has(model as SessionModelMode)
? model as SessionModelMode
: 'default'
}
+2 -1
View File
@@ -17,6 +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';
export interface StartOptions {
model?: string
@@ -143,7 +144,7 @@ export async function runClaude(options: StartOptions = {}): Promise<void> {
// Forward messages to the queue
let currentPermissionMode: PermissionMode = options.permissionMode ?? 'default';
let currentModelMode: SessionModelMode = options.model === 'sonnet' || options.model === 'opus' ? options.model : 'default';
let currentModelMode: SessionModelMode = resolveClaudeSessionModelMode(options.model);
let currentFallbackModel: string | undefined = undefined; // Track current fallback model
let currentCustomSystemPrompt: string | undefined = undefined; // Track current custom system prompt
let currentAppendSystemPrompt: string | undefined = undefined; // Track current append system prompt