diff --git a/src/renderer/src/aiCore/middleware/AiSdkMiddlewareBuilder.ts b/src/renderer/src/aiCore/middleware/AiSdkMiddlewareBuilder.ts index 20b89cf2e5..6034a88586 100644 --- a/src/renderer/src/aiCore/middleware/AiSdkMiddlewareBuilder.ts +++ b/src/renderer/src/aiCore/middleware/AiSdkMiddlewareBuilder.ts @@ -4,6 +4,8 @@ import type { MCPTool, Message, Model, Provider } from '@renderer/types' import type { Chunk } from '@renderer/types/chunk' import { extractReasoningMiddleware, LanguageModelMiddleware, simulateStreamingMiddleware } from 'ai' +import { noThinkMiddleware } from './noThinkMiddleware' + const logger = loggerService.withContext('AiSdkMiddlewareBuilder') /** @@ -186,6 +188,14 @@ function addProviderSpecificMiddlewares(builder: AiSdkMiddlewareBuilder, config: // 其他provider的通用处理 break } + + // OVMS+MCP's specific middleware + if (config.provider.id === 'ovms' && config.mcpTools && config.mcpTools.length > 0) { + builder.add({ + name: 'no-think', + middleware: noThinkMiddleware() + }) + } } /** diff --git a/src/renderer/src/aiCore/middleware/noThinkMiddleware.ts b/src/renderer/src/aiCore/middleware/noThinkMiddleware.ts new file mode 100644 index 0000000000..9d7d933bc1 --- /dev/null +++ b/src/renderer/src/aiCore/middleware/noThinkMiddleware.ts @@ -0,0 +1,52 @@ +import { loggerService } from '@logger' +import { LanguageModelMiddleware } from 'ai' + +const logger = loggerService.withContext('noThinkMiddleware') + +/** + * No Think Middleware + * Automatically appends ' /no_think' string to the end of user messages for the provider + * This prevents the model from generating unnecessary thinking process and returns results directly + * @returns LanguageModelMiddleware + */ +export function noThinkMiddleware(): LanguageModelMiddleware { + return { + middlewareVersion: 'v2', + + transformParams: async ({ params }) => { + const transformedParams = { ...params } + // Process messages in prompt + if (transformedParams.prompt && Array.isArray(transformedParams.prompt)) { + transformedParams.prompt = transformedParams.prompt.map((message) => { + // Only process user messages + if (message.role === 'user') { + // Process content array + if (Array.isArray(message.content)) { + const lastContent = message.content[message.content.length - 1] + // If the last content is text type, append ' /no_think' + if (lastContent && lastContent.type === 'text' && typeof lastContent.text === 'string') { + // Avoid duplicate additions + if (!lastContent.text.endsWith('/no_think')) { + logger.debug('Adding /no_think to user message') + return { + ...message, + content: [ + ...message.content.slice(0, -1), + { + ...lastContent, + text: lastContent.text + ' /no_think' + } + ] + } + } + } + } + } + return message + }) + } + + return transformedParams + } + } +}