From dd9d8adbf8ac1838666d193570dd7ed009417239 Mon Sep 17 00:00:00 2001 From: DarkSky <25152247+darkskygit@users.noreply.github.com> Date: Wed, 13 Aug 2025 16:10:42 +0800 Subject: [PATCH] fix(server): multi step tool call (#13486) ## Summary by CodeRabbit - Bug Fixes - Enforced a consistent step limit for AI responses across providers, preventing excessively long generations in both text and streaming modes for more predictable results. - Refactor - Centralized step limit configuration into a shared provider, ensuring uniform behavior across providers and simplifying future maintenance. - Standardized application of step limits in text generation and streaming flows to align provider behavior and improve overall reliability. --- .../src/plugins/copilot/providers/anthropic/anthropic.ts | 2 -- .../server/src/plugins/copilot/providers/gemini/gemini.ts | 3 +++ .../backend/server/src/plugins/copilot/providers/openai.ts | 2 -- .../backend/server/src/plugins/copilot/providers/provider.ts | 1 + 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/packages/backend/server/src/plugins/copilot/providers/anthropic/anthropic.ts b/packages/backend/server/src/plugins/copilot/providers/anthropic/anthropic.ts index 2bd16a47e..483188cf6 100644 --- a/packages/backend/server/src/plugins/copilot/providers/anthropic/anthropic.ts +++ b/packages/backend/server/src/plugins/copilot/providers/anthropic/anthropic.ts @@ -26,8 +26,6 @@ import { } from '../utils'; export abstract class AnthropicProvider extends CopilotProvider { - private readonly MAX_STEPS = 20; - protected abstract instance: | AnthropicSDKProvider | GoogleVertexAnthropicProvider; diff --git a/packages/backend/server/src/plugins/copilot/providers/gemini/gemini.ts b/packages/backend/server/src/plugins/copilot/providers/gemini/gemini.ts index f2d200492..8525f3035 100644 --- a/packages/backend/server/src/plugins/copilot/providers/gemini/gemini.ts +++ b/packages/backend/server/src/plugins/copilot/providers/gemini/gemini.ts @@ -9,6 +9,7 @@ import { generateObject, generateText, JSONParseError, + stepCountIs, streamText, } from 'ai'; @@ -85,6 +86,7 @@ export abstract class GeminiProvider extends CopilotProvider { google: this.getGeminiOptions(options, model.id), }, tools: await this.getTools(options, model.id), + stopWhen: stepCountIs(this.MAX_STEPS), }); if (!text) throw new Error('Failed to generate text'); @@ -276,6 +278,7 @@ export abstract class GeminiProvider extends CopilotProvider { google: this.getGeminiOptions(options, model.id), }, tools: await this.getTools(options, model.id), + stopWhen: stepCountIs(this.MAX_STEPS), }); return fullStream; } diff --git a/packages/backend/server/src/plugins/copilot/providers/openai.ts b/packages/backend/server/src/plugins/copilot/providers/openai.ts index 48991cac2..12160a1ad 100644 --- a/packages/backend/server/src/plugins/copilot/providers/openai.ts +++ b/packages/backend/server/src/plugins/copilot/providers/openai.ts @@ -296,8 +296,6 @@ export class OpenAIProvider extends CopilotProvider { }, ]; - private readonly MAX_STEPS = 20; - #instance!: VercelOpenAIProvider; override configured(): boolean { diff --git a/packages/backend/server/src/plugins/copilot/providers/provider.ts b/packages/backend/server/src/plugins/copilot/providers/provider.ts index 41f95cce8..f18035448 100644 --- a/packages/backend/server/src/plugins/copilot/providers/provider.ts +++ b/packages/backend/server/src/plugins/copilot/providers/provider.ts @@ -55,6 +55,7 @@ import { @Injectable() export abstract class CopilotProvider { protected readonly logger = new Logger(this.constructor.name); + protected readonly MAX_STEPS = 20; protected onlineModelList: string[] = []; abstract readonly type: CopilotProviderType; abstract readonly models: CopilotProviderModel[];