diff --git a/src/backend/src/services/ai/chat/providers/OpenRouterProvider/OpenRouterProvider.ts b/src/backend/src/services/ai/chat/providers/OpenRouterProvider/OpenRouterProvider.ts index 00e2d59ca..194f985c5 100644 --- a/src/backend/src/services/ai/chat/providers/OpenRouterProvider/OpenRouterProvider.ts +++ b/src/backend/src/services/ai/chat/providers/OpenRouterProvider/OpenRouterProvider.ts @@ -84,7 +84,7 @@ export class OpenRouterProvider implements IChatProvider { messages = await OpenAIUtil.process_input_messages(messages); - const completion = await this.#openai.chat.completions.create({ + const completionParams = { messages, model: modelIdForParams, ...(tools ? { tools } : {}), @@ -95,7 +95,23 @@ export class OpenRouterProvider implements IChatProvider { stream_options: { include_usage: true }, } : {}), usage: { include: true }, - } as ChatCompletionCreateParams); + } as ChatCompletionCreateParams; + + let completion; + try { + completion = await this.#openai.chat.completions.create(completionParams); + } catch ( e: any ) { + // If you overestimate allowed max_tokens on openrouter then it will throw an error. + // Since we know the user has enough for the query anyways, we should reexecute the + // request without max_tokens. + if ( e && e.error && e.error.message && e.error.message.startsWith("This endpoint's maximum context length is ") ) { + delete completionParams.max_tokens; + completion = await this.#openai.chat.completions.create(completionParams); + } else { + console.log('Openarouter error: ', e.error.message); + throw e; + } + } return OpenAIUtil.handle_completion_output({ usage_calculator: ({ usage }) => {