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(),