From 6bcc21c5789e207003eeb77df89a44e594ef34a6 Mon Sep 17 00:00:00 2001 From: kangfenmao Date: Tue, 11 Mar 2025 13:53:06 +0800 Subject: [PATCH] refactor(Providers): Optimize tool handling and message filtering - Move MCP tool utilities to a dedicated utils folder - Update import paths for MCP tool functions across providers - Add isEmpty check for tools in Anthropic provider - Enhance message filtering in OpenAI provider with filterEmptyMessages - Simplify tool and message preparation logic --- .../src/pages/home/Messages/Messages.tsx | 2 +- .../src/providers/AnthropicProvider.ts | 14 +++++------ src/renderer/src/providers/GeminiProvider.ts | 14 +++++------ src/renderer/src/providers/OpenAIProvider.ts | 25 ++++++++++++------- 4 files changed, 31 insertions(+), 24 deletions(-) diff --git a/src/renderer/src/pages/home/Messages/Messages.tsx b/src/renderer/src/pages/home/Messages/Messages.tsx index efd63a8c..2113b103 100644 --- a/src/renderer/src/pages/home/Messages/Messages.tsx +++ b/src/renderer/src/pages/home/Messages/Messages.tsx @@ -212,7 +212,7 @@ const Messages: React.FC = ({ assistant, topic, setActiveTopic }) inverse={true} scrollableTarget="messages"> - + {Object.entries(getGroupedMessages(displayMessages)).map(([key, groupMessages]) => ( diff --git a/src/renderer/src/providers/AnthropicProvider.ts b/src/renderer/src/providers/AnthropicProvider.ts index 92c63585..cd66ca5f 100644 --- a/src/renderer/src/providers/AnthropicProvider.ts +++ b/src/renderer/src/providers/AnthropicProvider.ts @@ -18,18 +18,18 @@ import { } from '@renderer/services/MessagesService' import { Assistant, FileTypes, MCPToolResponse, Message, Model, Provider, Suggestion } from '@renderer/types' import { removeSpecialCharactersForTopicName } from '@renderer/utils' -import { first, flatten, sum, takeRight } from 'lodash' -import OpenAI from 'openai' - -import { CompletionsParams } from '.' -import BaseProvider from './BaseProvider' import { anthropicToolUseToMcpTool, callMCPTool, filterMCPTools, mcpToolsToAnthropicTools, upsertMCPToolResponse -} from './mcpToolUtils' +} from '@renderer/utils/mcp-tools' +import { first, flatten, isEmpty, sum, takeRight } from 'lodash' +import OpenAI from 'openai' + +import { CompletionsParams } from '.' +import BaseProvider from './BaseProvider' type ReasoningEffort = 'high' | 'medium' | 'low' @@ -159,7 +159,7 @@ export default class AnthropicProvider extends BaseProvider { const body: MessageCreateParamsNonStreaming = { model: model.id, messages: userMessages, - tools: tools, + tools: isEmpty(tools) ? undefined : tools, max_tokens: maxTokens || DEFAULT_MAX_TOKENS, temperature: this.getTemperature(assistant, model), top_p: this.getTopP(assistant, model), diff --git a/src/renderer/src/providers/GeminiProvider.ts b/src/renderer/src/providers/GeminiProvider.ts index 35042fa1..dd04fed3 100644 --- a/src/renderer/src/providers/GeminiProvider.ts +++ b/src/renderer/src/providers/GeminiProvider.ts @@ -21,19 +21,19 @@ import { EVENT_NAMES } from '@renderer/services/EventService' import { filterContextMessages, filterUserRoleStartMessages } from '@renderer/services/MessagesService' import { Assistant, FileType, FileTypes, MCPToolResponse, Message, Model, Provider, Suggestion } from '@renderer/types' import { removeSpecialCharactersForTopicName } from '@renderer/utils' -import axios from 'axios' -import { isEmpty, takeRight } from 'lodash' -import OpenAI from 'openai' - -import { CompletionsParams } from '.' -import BaseProvider from './BaseProvider' import { callMCPTool, filterMCPTools, geminiFunctionCallToMcpTool, mcpToolsToGeminiTools, upsertMCPToolResponse -} from './mcpToolUtils' +} from '@renderer/utils/mcp-tools' +import axios from 'axios' +import { isEmpty, takeRight } from 'lodash' +import OpenAI from 'openai' + +import { CompletionsParams } from '.' +import BaseProvider from './BaseProvider' export default class GeminiProvider extends BaseProvider { private sdk: GoogleGenerativeAI diff --git a/src/renderer/src/providers/OpenAIProvider.ts b/src/renderer/src/providers/OpenAIProvider.ts index 57ee85dd..6f957697 100644 --- a/src/renderer/src/providers/OpenAIProvider.ts +++ b/src/renderer/src/providers/OpenAIProvider.ts @@ -10,7 +10,11 @@ import { getStoreSetting } from '@renderer/hooks/useSettings' import i18n from '@renderer/i18n' import { getAssistantSettings, getDefaultModel, getTopNamingModel } from '@renderer/services/AssistantService' import { EVENT_NAMES } from '@renderer/services/EventService' -import { filterContextMessages, filterUserRoleStartMessages } from '@renderer/services/MessagesService' +import { + filterContextMessages, + filterEmptyMessages, + filterUserRoleStartMessages +} from '@renderer/services/MessagesService' import { Assistant, FileTypes, @@ -22,6 +26,13 @@ import { Suggestion } from '@renderer/types' import { removeSpecialCharactersForTopicName } from '@renderer/utils' +import { + callMCPTool, + filterMCPTools, + mcpToolsToOpenAITools, + openAIToolsToMcpTool, + upsertMCPToolResponse +} from '@renderer/utils/mcp-tools' import { takeRight } from 'lodash' import OpenAI, { AzureOpenAI } from 'openai' import { @@ -35,13 +46,6 @@ import { import { CompletionsParams } from '.' import BaseProvider from './BaseProvider' -import { - callMCPTool, - filterMCPTools, - mcpToolsToOpenAITools, - openAIToolsToMcpTool, - upsertMCPToolResponse -} from './mcpToolUtils' type ReasoningEffort = 'high' | 'medium' | 'low' @@ -248,7 +252,10 @@ export default class OpenAIProvider extends BaseProvider { const userMessages: ChatCompletionMessageParam[] = [] - const _messages = filterUserRoleStartMessages(filterContextMessages(takeRight(messages, contextCount + 1))) + const _messages = filterUserRoleStartMessages( + filterContextMessages(filterEmptyMessages(takeRight(messages, contextCount + 1))) + ) + onFilterMessages(_messages) for (const message of _messages) {