From ce8b85020b9327f5d421e11bde2241b4bf2420ab Mon Sep 17 00:00:00 2001 From: Camol Date: Fri, 9 May 2025 20:20:16 +0800 Subject: [PATCH] feat: support both function call and system prompt for MCP tools (#5499) * feat: support both function call and system prompt for MCP tools - Add support for using both function call and system prompt to implement MCP tool calls - Refactor tool handling logic to be more flexible and maintainable - Improve code readability with better variable naming and comments - Fix potential issues with tool call implementation * fix: Add tool_calls in OpenAI streaming logic * refactor: enhance OpenAICompatibleProvider and BaseOpenAiProvider structure * feat: add tool call setting to SettingsTab component * fix: enhance tool call handling in OpenAICompatibleProvider * fix: enhance content handling in GeminiProvider for nonstreaming response * refactor: improve tool property filtering logic in OpenAIProvider and mcp-tools utility * fix: resolve eslint errors * fix: add history for function call message in GeminiProvider * refactor: unify MCP tool response handling across providers for consistency * refactor: update mcp tools conversion logic in OpenAICompatibleProvider and OpenAIProvider * refactor: enhance AihubmixProvider and BaseProvider with MCP tool handling methods * refactor: introduce SYSTEM_PROMPT_THRESHOLD constant in BaseProvider for improved readability * refactor: rename tool_call to enable_tool_use for clarity and consistency across the application * refactor: remove unnecessary onChunk call in processStream for cleaner code * fix: add toolCallId to response structure and enhance content handling in AnthropicProvider * fix: respond image data to llm while using function call * fix: add reasoning handling in OpenAICompatibleProvider for improved response processing --------- Co-authored-by: kanweiwei Co-authored-by: jay --- src/renderer/src/i18n/locales/en-us.json | 1 + src/renderer/src/i18n/locales/ja-jp.json | 1 + src/renderer/src/i18n/locales/ru-ru.json | 1 + src/renderer/src/i18n/locales/zh-cn.json | 1 + src/renderer/src/i18n/locales/zh-tw.json | 1 + .../src/pages/home/Messages/MessageTools.tsx | 2 +- .../src/pages/home/Tabs/SettingsTab.tsx | 13 + .../AssistantModelSettings.tsx | 13 + .../providers/AiProvider/AihubmixProvider.ts | 15 +- .../providers/AiProvider/AnthropicProvider.ts | 154 +++++-- .../src/providers/AiProvider/BaseProvider.ts | 42 ++ .../providers/AiProvider/GeminiProvider.ts | 397 ++++++++++++------ .../AiProvider/OpenAICompatibleProvider.ts | 262 +++++++++--- .../providers/AiProvider/OpenAIProvider.ts | 260 ++++++++++-- src/renderer/src/services/AssistantService.ts | 1 + src/renderer/src/store/thunk/messageThunk.ts | 12 +- src/renderer/src/types/index.ts | 20 +- src/renderer/src/utils/mcp-tools.ts | 383 ++++++++++------- src/renderer/src/utils/prompt.ts | 2 +- 19 files changed, 1178 insertions(+), 403 deletions(-) diff --git a/src/renderer/src/i18n/locales/en-us.json b/src/renderer/src/i18n/locales/en-us.json index dae4ed6ca5..3d8ab74b96 100644 --- a/src/renderer/src/i18n/locales/en-us.json +++ b/src/renderer/src/i18n/locales/en-us.json @@ -705,6 +705,7 @@ "rerank_model_tooltip": "Click the Manage button in Settings -> Model Services to add.", "search": "Search models...", "stream_output": "Stream output", + "enable_tool_use": "Enable Tool Use", "type": { "embedding": "Embedding", "free": "Free", diff --git a/src/renderer/src/i18n/locales/ja-jp.json b/src/renderer/src/i18n/locales/ja-jp.json index 046d2ff589..f1b12358d8 100644 --- a/src/renderer/src/i18n/locales/ja-jp.json +++ b/src/renderer/src/i18n/locales/ja-jp.json @@ -705,6 +705,7 @@ "rerank_model_tooltip": "設定->モデルサービスに移動し、管理ボタンをクリックして追加します。", "search": "モデルを検索...", "stream_output": "ストリーム出力", + "enable_tool_use": "ツール呼び出し", "type": { "embedding": "埋め込み", "free": "無料", diff --git a/src/renderer/src/i18n/locales/ru-ru.json b/src/renderer/src/i18n/locales/ru-ru.json index 41242b74c3..2692e1c270 100644 --- a/src/renderer/src/i18n/locales/ru-ru.json +++ b/src/renderer/src/i18n/locales/ru-ru.json @@ -705,6 +705,7 @@ "rerank_model_tooltip": "В настройках -> Служба модели нажмите кнопку \"Управление\", чтобы добавить.", "search": "Поиск моделей...", "stream_output": "Потоковый вывод", + "enable_tool_use": "Вызов инструмента", "type": { "embedding": "Встраиваемые", "free": "Бесплатные", diff --git a/src/renderer/src/i18n/locales/zh-cn.json b/src/renderer/src/i18n/locales/zh-cn.json index a57c106b49..e68409a642 100644 --- a/src/renderer/src/i18n/locales/zh-cn.json +++ b/src/renderer/src/i18n/locales/zh-cn.json @@ -705,6 +705,7 @@ "rerank_model_tooltip": "在设置->模型服务中点击管理按钮添加", "search": "搜索模型...", "stream_output": "流式输出", + "enable_tool_use": "工具调用", "type": { "embedding": "嵌入", "free": "免费", diff --git a/src/renderer/src/i18n/locales/zh-tw.json b/src/renderer/src/i18n/locales/zh-tw.json index d91d8fb257..893a7b75a1 100644 --- a/src/renderer/src/i18n/locales/zh-tw.json +++ b/src/renderer/src/i18n/locales/zh-tw.json @@ -705,6 +705,7 @@ "rerank_model_tooltip": "在設定->模型服務中點擊管理按鈕添加", "search": "搜尋模型...", "stream_output": "串流輸出", + "enable_tool_use": "工具調用", "type": { "embedding": "嵌入", "free": "免費", diff --git a/src/renderer/src/pages/home/Messages/MessageTools.tsx b/src/renderer/src/pages/home/Messages/MessageTools.tsx index 495c56cf10..b281e40642 100644 --- a/src/renderer/src/pages/home/Messages/MessageTools.tsx +++ b/src/renderer/src/pages/home/Messages/MessageTools.tsx @@ -67,7 +67,7 @@ const MessageTools: FC = ({ blocks }) => { const isDone = status === 'done' const hasError = isDone && response?.isError === true const result = { - params: tool.inputSchema, + params: toolResponse.arguments, response: toolResponse.response } diff --git a/src/renderer/src/pages/home/Tabs/SettingsTab.tsx b/src/renderer/src/pages/home/Tabs/SettingsTab.tsx index 9a21b1c808..0c8972db6d 100644 --- a/src/renderer/src/pages/home/Tabs/SettingsTab.tsx +++ b/src/renderer/src/pages/home/Tabs/SettingsTab.tsx @@ -70,6 +70,7 @@ const SettingsTab: FC = (props) => { const [maxTokens, setMaxTokens] = useState(assistant?.settings?.maxTokens ?? 0) const [fontSizeValue, setFontSizeValue] = useState(fontSize) const [streamOutput, setStreamOutput] = useState(assistant?.settings?.streamOutput ?? true) + const [enableToolUse, setEnableToolUse] = useState(assistant?.settings?.enableToolUse ?? false) const { t } = useTranslation() const dispatch = useAppDispatch() @@ -222,6 +223,18 @@ const SettingsTab: FC = (props) => { /> + + {t('models.enable_tool_use')} + { + setEnableToolUse(checked) + updateAssistantSettings({ enableToolUse: checked }) + }} + /> + + diff --git a/src/renderer/src/pages/settings/AssistantSettings/AssistantModelSettings.tsx b/src/renderer/src/pages/settings/AssistantSettings/AssistantModelSettings.tsx index 31075ebbb7..9ea4559b47 100644 --- a/src/renderer/src/pages/settings/AssistantSettings/AssistantModelSettings.tsx +++ b/src/renderer/src/pages/settings/AssistantSettings/AssistantModelSettings.tsx @@ -24,6 +24,7 @@ const AssistantModelSettings: FC = ({ assistant, updateAssistant, updateA const [enableMaxTokens, setEnableMaxTokens] = useState(assistant?.settings?.enableMaxTokens ?? false) const [maxTokens, setMaxTokens] = useState(assistant?.settings?.maxTokens ?? 0) const [streamOutput, setStreamOutput] = useState(assistant?.settings?.streamOutput ?? true) + const [enableToolUse, setEnableToolUse] = useState(assistant?.settings?.enableToolUse ?? false) const [defaultModel, setDefaultModel] = useState(assistant?.defaultModel) const [topP, setTopP] = useState(assistant?.settings?.topP ?? 1) const [customParameters, setCustomParameters] = useState( @@ -377,6 +378,18 @@ const AssistantModelSettings: FC = ({ assistant, updateAssistant, updateA /> + + + { + setEnableToolUse(checked) + updateAssistantSettings({ enableToolUse: checked }) + }} + /> + +