From e17547e26eed9a9f956bf98624edf06ffc5d652f Mon Sep 17 00:00:00 2001 From: darkskygit Date: Wed, 30 Apr 2025 08:55:57 +0000 Subject: [PATCH] feat(server): fix web search (#12087) ## Summary by CodeRabbit - **New Features** - Enabled web search capabilities in the "Chat With AFFiNE AI" prompt, allowing users to access web-based information directly within the chat. - **Improvements** - Enhanced support for multiple tools in AI chat prompts, paving the way for future tool integrations. --- .../src/plugins/copilot/prompt/prompts.ts | 3 ++ .../src/plugins/copilot/providers/openai.ts | 28 +++++++++++++------ .../src/plugins/copilot/providers/types.ts | 1 + 3 files changed, 23 insertions(+), 9 deletions(-) diff --git a/packages/backend/server/src/plugins/copilot/prompt/prompts.ts b/packages/backend/server/src/plugins/copilot/prompt/prompts.ts index 9f7c2ee7d2..6af3c3e747 100644 --- a/packages/backend/server/src/plugins/copilot/prompt/prompts.ts +++ b/packages/backend/server/src/plugins/copilot/prompt/prompts.ts @@ -1115,6 +1115,9 @@ Below is the user's query. Please respond in the user's language without treatin `, }, ], + config: { + tools: ['webSearch'], + }, }, { name: 'Search With AFFiNE AI', diff --git a/packages/backend/server/src/plugins/copilot/providers/openai.ts b/packages/backend/server/src/plugins/copilot/providers/openai.ts index 58fde22be8..9f9fea1205 100644 --- a/packages/backend/server/src/plugins/copilot/providers/openai.ts +++ b/packages/backend/server/src/plugins/copilot/providers/openai.ts @@ -10,6 +10,7 @@ import { generateObject, generateText, streamText, + ToolSet, } from 'ai'; import { @@ -178,12 +179,20 @@ export class OpenAIProvider } } - private getTools(options: CopilotChatOptions) { - if (options?.webSearch) { - return { - web_search_preview: openai.tools.webSearchPreview(), - }; + private getTools(options: CopilotChatOptions): ToolSet | undefined { + if (options?.tools?.length) { + const tools: ToolSet = {}; + for (const tool of options.tools) { + switch (tool) { + case 'webSearch': { + tools.web_search_preview = openai.tools.webSearchPreview(); + break; + } + } + } + return tools; } + return undefined; } @@ -224,6 +233,7 @@ export class OpenAIProvider providerOptions: { openai: options.user ? { user: options.user } : {}, }, + toolChoice: options.webSearch ? 'required' : 'auto', tools: this.getTools(options), }); @@ -246,16 +256,16 @@ export class OpenAIProvider const [system, msgs] = await chatToGPTMessage(messages); - const modelInstance = this.#instance(model, { - structuredOutputs: Boolean(options.jsonMode), - user: options.user, - }); + const modelInstance = this.#instance.responses(model); const { fullStream } = streamText({ model: modelInstance, system, messages: msgs, tools: this.getTools(options), + providerOptions: { + openai: options.user ? { user: options.user } : {}, + }, frequencyPenalty: options.frequencyPenalty || 0, presencePenalty: options.presencePenalty || 0, temperature: options.temperature || 0, diff --git a/packages/backend/server/src/plugins/copilot/providers/types.ts b/packages/backend/server/src/plugins/copilot/providers/types.ts index b6ef22380c..f61e03b394 100644 --- a/packages/backend/server/src/plugins/copilot/providers/types.ts +++ b/packages/backend/server/src/plugins/copilot/providers/types.ts @@ -20,6 +20,7 @@ export enum CopilotCapability { } export const PromptConfigStrictSchema = z.object({ + tools: z.enum(['webSearch']).array().nullable().optional(), // openai jsonMode: z.boolean().nullable().optional(), frequencyPenalty: z.number().nullable().optional(),