diff --git a/src/server/__tests__/conversation-service.test.ts b/src/server/__tests__/conversation-service.test.ts index dc678359..9e812b76 100644 --- a/src/server/__tests__/conversation-service.test.ts +++ b/src/server/__tests__/conversation-service.test.ts @@ -165,6 +165,32 @@ describe('ConversationService', () => { expect(env.CLAUDE_CODE_ENTRYPOINT).toBeUndefined() }) + test('buildChildEnv uses the session-selected model for session-scoped providers', async () => { + const providerService = new ProviderService() + const provider = await providerService.addProvider({ + presetId: 'custom', + name: 'Switchable', + apiKey: 'provider-key', + baseUrl: 'https://api.switchable.example', + apiFormat: 'openai_chat', + models: { + main: 'old-provider-main', + haiku: 'new-provider-haiku', + sonnet: 'new-provider-sonnet', + opus: 'new-provider-opus', + }, + }) + + const service = new ConversationService() as any + const env = (await service.buildChildEnv('/tmp', undefined, { + providerId: provider.id, + model: 'new-provider-sonnet', + })) as Record + + expect(env.ANTHROPIC_BASE_URL).toBe(`http://127.0.0.1:3456/proxy/providers/${provider.id}`) + expect(env.ANTHROPIC_MODEL).toBe('new-provider-sonnet') + }) + test('buildChildEnv can force official auth even when a custom default provider exists', async () => { const ccHahaDir = path.join(tmpDir, 'cc-haha') await fs.mkdir(ccHahaDir, { recursive: true }) diff --git a/src/server/services/conversationService.ts b/src/server/services/conversationService.ts index 08e2d807..0db3170d 100644 --- a/src/server/services/conversationService.ts +++ b/src/server/services/conversationService.ts @@ -556,6 +556,9 @@ export class ConversationService { typeof options?.providerId === 'string' ? await this.providerService.getProviderRuntimeEnv(options.providerId) : null + if (explicitProviderEnv && options?.model?.trim()) { + explicitProviderEnv.ANTHROPIC_MODEL = options.model.trim() + } return { ...cleanEnv,