diff --git a/crates/mesh-llm-ui/src/features/chat/api/build-input.test.ts b/crates/mesh-llm-ui/src/features/chat/api/build-input.test.ts index 12245f7e86..852e7ac7e2 100644 --- a/crates/mesh-llm-ui/src/features/chat/api/build-input.test.ts +++ b/crates/mesh-llm-ui/src/features/chat/api/build-input.test.ts @@ -88,6 +88,18 @@ describe('buildResponsesInput', () => { expect(request.input).toEqual([{ role: 'user', content: 'Hello mesh' }]) }) + it('asks for minimal reasoning effort', async () => { + const request = await buildResponsesInput( + [createMessage([{ type: 'text', content: 'what is updog' }])], + 'model-a', + 'client-123', + 'request-456' + ) + + expect(request.reasoning_effort).toBe('minimal') + expect(request).not.toHaveProperty('chat_template_kwargs') + }) + it('prepends the saved system prompt as a responses system message', async () => { const request = await buildResponsesInput( [createMessage([{ type: 'text', content: 'Explain the cluster status' }])], diff --git a/crates/mesh-llm-ui/src/features/chat/api/build-input.ts b/crates/mesh-llm-ui/src/features/chat/api/build-input.ts index 066d06fc6d..32e084445e 100644 --- a/crates/mesh-llm-ui/src/features/chat/api/build-input.ts +++ b/crates/mesh-llm-ui/src/features/chat/api/build-input.ts @@ -186,6 +186,11 @@ export async function buildResponsesInput( request_id: requestId, input: messagesWithSystemPrompt, stream: true, - stream_options: { include_usage: true } + stream_options: { include_usage: true }, + // Reasoning models deliberate for tens of seconds over a casual question + // when nothing asks them not to. The console keeps thinking -- it renders + // the trace -- but asks for the least of it. API callers are unaffected: + // they choose their own reasoning controls. + reasoning_effort: 'minimal' } } diff --git a/crates/mesh-llm-ui/src/lib/api/types.ts b/crates/mesh-llm-ui/src/lib/api/types.ts index 18f51e6193..a16a19b6af 100644 --- a/crates/mesh-llm-ui/src/lib/api/types.ts +++ b/crates/mesh-llm-ui/src/lib/api/types.ts @@ -301,6 +301,7 @@ export interface ResponsesRequest { input: ResponsesInputMessage[] stream: boolean stream_options?: { include_usage: boolean } + reasoning_effort?: 'none' | 'minimal' | 'low' | 'medium' | 'high' | 'xhigh' | 'max' } export interface ChatSSEDeltaEvent {