mirror of
https://github.com/CherryHQ/cherry-studio.git
synced 2026-01-02 02:09:03 +08:00
refactor: remove deprecated MCP server handling and knowledge base ID logic from Inputbar and related services (#7339)
- Removed unused MCP server handling from Inputbar and MessagesService. - Updated ApiService to fetch active MCP servers directly from the store. - Deprecated knowledgeBaseIds and enabledMCPs in Message types and related functions. - Cleaned up related utility functions to enhance code clarity and maintainability.
This commit is contained in:
parent
c18a346098
commit
9d1b8bd9cd
@ -13,7 +13,6 @@ import {
|
|||||||
import db from '@renderer/databases'
|
import db from '@renderer/databases'
|
||||||
import { useAssistant } from '@renderer/hooks/useAssistant'
|
import { useAssistant } from '@renderer/hooks/useAssistant'
|
||||||
import { useKnowledgeBases } from '@renderer/hooks/useKnowledge'
|
import { useKnowledgeBases } from '@renderer/hooks/useKnowledge'
|
||||||
import { useMCPServers } from '@renderer/hooks/useMCPServers'
|
|
||||||
import { useMessageOperations, useTopicLoading } from '@renderer/hooks/useMessageOperations'
|
import { useMessageOperations, useTopicLoading } from '@renderer/hooks/useMessageOperations'
|
||||||
import { modelGenerating, useRuntime } from '@renderer/hooks/useRuntime'
|
import { modelGenerating, useRuntime } from '@renderer/hooks/useRuntime'
|
||||||
import { useMessageStyle, useSettings } from '@renderer/hooks/useSettings'
|
import { useMessageStyle, useSettings } from '@renderer/hooks/useSettings'
|
||||||
@ -105,7 +104,6 @@ const Inputbar: FC<Props> = ({ assistant: _assistant, setActiveTopic, topic }) =
|
|||||||
const currentMessageId = useRef<string>('')
|
const currentMessageId = useRef<string>('')
|
||||||
const isVision = useMemo(() => isVisionModel(model), [model])
|
const isVision = useMemo(() => isVisionModel(model), [model])
|
||||||
const supportExts = useMemo(() => [...textExts, ...documentExts, ...(isVision ? imageExts : [])], [isVision])
|
const supportExts = useMemo(() => [...textExts, ...documentExts, ...(isVision ? imageExts : [])], [isVision])
|
||||||
const { activedMcpServers } = useMCPServers()
|
|
||||||
const { bases: knowledgeBases } = useKnowledgeBases()
|
const { bases: knowledgeBases } = useKnowledgeBases()
|
||||||
const isMultiSelectMode = useAppSelector((state) => state.runtime.chat.isMultiSelectMode)
|
const isMultiSelectMode = useAppSelector((state) => state.runtime.chat.isMultiSelectMode)
|
||||||
|
|
||||||
@ -176,22 +174,11 @@ const Inputbar: FC<Props> = ({ assistant: _assistant, setActiveTopic, topic }) =
|
|||||||
if (uploadedFiles) {
|
if (uploadedFiles) {
|
||||||
baseUserMessage.files = uploadedFiles
|
baseUserMessage.files = uploadedFiles
|
||||||
}
|
}
|
||||||
const knowledgeBaseIds = selectedKnowledgeBases?.map((base) => base.id)
|
|
||||||
|
|
||||||
if (knowledgeBaseIds) {
|
|
||||||
baseUserMessage.knowledgeBaseIds = knowledgeBaseIds
|
|
||||||
}
|
|
||||||
|
|
||||||
if (mentionModels) {
|
if (mentionModels) {
|
||||||
baseUserMessage.mentions = mentionModels
|
baseUserMessage.mentions = mentionModels
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!isEmpty(assistant.mcpServers) && !isEmpty(activedMcpServers)) {
|
|
||||||
baseUserMessage.enabledMCPs = activedMcpServers.filter((server) =>
|
|
||||||
assistant.mcpServers?.some((s) => s.id === server.id)
|
|
||||||
)
|
|
||||||
}
|
|
||||||
|
|
||||||
const assistantWithTopicPrompt = topic.prompt
|
const assistantWithTopicPrompt = topic.prompt
|
||||||
? { ...assistant, prompt: `${assistant.prompt}\n${topic.prompt}` }
|
? { ...assistant, prompt: `${assistant.prompt}\n${topic.prompt}` }
|
||||||
: assistant
|
: assistant
|
||||||
@ -212,19 +199,7 @@ const Inputbar: FC<Props> = ({ assistant: _assistant, setActiveTopic, topic }) =
|
|||||||
} catch (error) {
|
} catch (error) {
|
||||||
console.error('Failed to send message:', error)
|
console.error('Failed to send message:', error)
|
||||||
}
|
}
|
||||||
}, [
|
}, [assistant, dispatch, files, inputEmpty, loading, mentionModels, resizeTextArea, text, topic])
|
||||||
activedMcpServers,
|
|
||||||
assistant,
|
|
||||||
dispatch,
|
|
||||||
files,
|
|
||||||
inputEmpty,
|
|
||||||
loading,
|
|
||||||
mentionModels,
|
|
||||||
resizeTextArea,
|
|
||||||
selectedKnowledgeBases,
|
|
||||||
text,
|
|
||||||
topic
|
|
||||||
])
|
|
||||||
|
|
||||||
const translate = useCallback(async () => {
|
const translate = useCallback(async () => {
|
||||||
if (isTranslating) {
|
if (isTranslating) {
|
||||||
|
|||||||
@ -33,10 +33,11 @@ import { SdkModel } from '@renderer/types/sdk'
|
|||||||
import { removeSpecialCharactersForTopicName } from '@renderer/utils'
|
import { removeSpecialCharactersForTopicName } from '@renderer/utils'
|
||||||
import { isAbortError } from '@renderer/utils/error'
|
import { isAbortError } from '@renderer/utils/error'
|
||||||
import { extractInfoFromXML, ExtractResults } from '@renderer/utils/extract'
|
import { extractInfoFromXML, ExtractResults } from '@renderer/utils/extract'
|
||||||
import { findFileBlocks, getKnowledgeBaseIds, getMainTextContent } from '@renderer/utils/messageUtils/find'
|
import { findFileBlocks, getMainTextContent } from '@renderer/utils/messageUtils/find'
|
||||||
import { findLast, isEmpty, takeRight } from 'lodash'
|
import { findLast, isEmpty, takeRight } from 'lodash'
|
||||||
|
|
||||||
import AiProvider from '../aiCore'
|
import AiProvider from '../aiCore'
|
||||||
|
import store from '../store'
|
||||||
import {
|
import {
|
||||||
getAssistantProvider,
|
getAssistantProvider,
|
||||||
getAssistantSettings,
|
getAssistantSettings,
|
||||||
@ -63,7 +64,7 @@ async function fetchExternalTool(
|
|||||||
lastAnswer?: Message
|
lastAnswer?: Message
|
||||||
): Promise<ExternalToolResult> {
|
): Promise<ExternalToolResult> {
|
||||||
// 可能会有重复?
|
// 可能会有重复?
|
||||||
const knowledgeBaseIds = getKnowledgeBaseIds(lastUserMessage)
|
const knowledgeBaseIds = assistant.knowledge_bases?.map((base) => base.id)
|
||||||
const hasKnowledgeBase = !isEmpty(knowledgeBaseIds)
|
const hasKnowledgeBase = !isEmpty(knowledgeBaseIds)
|
||||||
const knowledgeRecognition = assistant.knowledgeRecognition || 'on'
|
const knowledgeRecognition = assistant.knowledgeRecognition || 'on'
|
||||||
const webSearchProvider = WebSearchService.getWebSearchProvider(assistant.webSearchProviderId)
|
const webSearchProvider = WebSearchService.getWebSearchProvider(assistant.webSearchProviderId)
|
||||||
@ -251,7 +252,12 @@ async function fetchExternalTool(
|
|||||||
|
|
||||||
// Get MCP tools (Fix duplicate declaration)
|
// Get MCP tools (Fix duplicate declaration)
|
||||||
let mcpTools: MCPTool[] = [] // Initialize as empty array
|
let mcpTools: MCPTool[] = [] // Initialize as empty array
|
||||||
const enabledMCPs = assistant.mcpServers
|
const allMcpServers = store.getState().mcp.servers || []
|
||||||
|
const activedMcpServers = allMcpServers.filter((s) => s.isActive)
|
||||||
|
const assistantMcpServers = assistant.mcpServers || []
|
||||||
|
|
||||||
|
const enabledMCPs = activedMcpServers.filter((server) => assistantMcpServers.some((s) => s.id === server.id))
|
||||||
|
|
||||||
if (enabledMCPs && enabledMCPs.length > 0) {
|
if (enabledMCPs && enabledMCPs.length > 0) {
|
||||||
try {
|
try {
|
||||||
const toolPromises = enabledMCPs.map<Promise<MCPTool[]>>(async (mcpServer) => {
|
const toolPromises = enabledMCPs.map<Promise<MCPTool[]>>(async (mcpServer) => {
|
||||||
|
|||||||
@ -6,7 +6,7 @@ import { fetchMessagesSummary } from '@renderer/services/ApiService'
|
|||||||
import store from '@renderer/store'
|
import store from '@renderer/store'
|
||||||
import { messageBlocksSelectors, removeManyBlocks } from '@renderer/store/messageBlock'
|
import { messageBlocksSelectors, removeManyBlocks } from '@renderer/store/messageBlock'
|
||||||
import { selectMessagesForTopic } from '@renderer/store/newMessage'
|
import { selectMessagesForTopic } from '@renderer/store/newMessage'
|
||||||
import type { Assistant, FileType, MCPServer, Model, Topic, Usage } from '@renderer/types'
|
import type { Assistant, FileType, Model, Topic, Usage } from '@renderer/types'
|
||||||
import { FileTypes } from '@renderer/types'
|
import { FileTypes } from '@renderer/types'
|
||||||
import type { Message, MessageBlock } from '@renderer/types/newMessage'
|
import type { Message, MessageBlock } from '@renderer/types/newMessage'
|
||||||
import { AssistantMessageStatus, MessageBlockStatus, MessageBlockType } from '@renderer/types/newMessage'
|
import { AssistantMessageStatus, MessageBlockStatus, MessageBlockType } from '@renderer/types/newMessage'
|
||||||
@ -108,9 +108,7 @@ export function getUserMessage({
|
|||||||
content,
|
content,
|
||||||
files,
|
files,
|
||||||
// Keep other potential params if needed by createMessage
|
// Keep other potential params if needed by createMessage
|
||||||
knowledgeBaseIds,
|
|
||||||
mentions,
|
mentions,
|
||||||
enabledMCPs,
|
|
||||||
usage
|
usage
|
||||||
}: {
|
}: {
|
||||||
assistant: Assistant
|
assistant: Assistant
|
||||||
@ -120,7 +118,6 @@ export function getUserMessage({
|
|||||||
files?: FileType[]
|
files?: FileType[]
|
||||||
knowledgeBaseIds?: string[]
|
knowledgeBaseIds?: string[]
|
||||||
mentions?: Model[]
|
mentions?: Model[]
|
||||||
enabledMCPs?: MCPServer[]
|
|
||||||
usage?: Usage
|
usage?: Usage
|
||||||
}): { message: Message; blocks: MessageBlock[] } {
|
}): { message: Message; blocks: MessageBlock[] } {
|
||||||
const defaultModel = getDefaultModel()
|
const defaultModel = getDefaultModel()
|
||||||
@ -133,8 +130,7 @@ export function getUserMessage({
|
|||||||
if (content !== undefined) {
|
if (content !== undefined) {
|
||||||
// Pass messageId when creating blocks
|
// Pass messageId when creating blocks
|
||||||
const textBlock = createMainTextBlock(messageId, content, {
|
const textBlock = createMainTextBlock(messageId, content, {
|
||||||
status: MessageBlockStatus.SUCCESS,
|
status: MessageBlockStatus.SUCCESS
|
||||||
knowledgeBaseIds
|
|
||||||
})
|
})
|
||||||
blocks.push(textBlock)
|
blocks.push(textBlock)
|
||||||
blockIds.push(textBlock.id)
|
blockIds.push(textBlock.id)
|
||||||
@ -165,7 +161,7 @@ export function getUserMessage({
|
|||||||
blocks: blockIds,
|
blocks: blockIds,
|
||||||
// 移除knowledgeBaseIds
|
// 移除knowledgeBaseIds
|
||||||
mentions,
|
mentions,
|
||||||
enabledMCPs,
|
// 移除mcp
|
||||||
type,
|
type,
|
||||||
usage
|
usage
|
||||||
}
|
}
|
||||||
@ -203,7 +199,6 @@ export function resetAssistantMessage(message: Message, model?: Model): Message
|
|||||||
useful: undefined,
|
useful: undefined,
|
||||||
askId: undefined,
|
askId: undefined,
|
||||||
mentions: undefined,
|
mentions: undefined,
|
||||||
enabledMCPs: undefined,
|
|
||||||
blocks: [],
|
blocks: [],
|
||||||
createdAt: new Date().toISOString()
|
createdAt: new Date().toISOString()
|
||||||
}
|
}
|
||||||
|
|||||||
@ -173,6 +173,9 @@ export type Message = {
|
|||||||
useful?: boolean
|
useful?: boolean
|
||||||
askId?: string // 关联的问题消息ID
|
askId?: string // 关联的问题消息ID
|
||||||
mentions?: Model[]
|
mentions?: Model[]
|
||||||
|
/**
|
||||||
|
* @deprecated
|
||||||
|
*/
|
||||||
enabledMCPs?: MCPServer[]
|
enabledMCPs?: MCPServer[]
|
||||||
|
|
||||||
usage?: Usage
|
usage?: Usage
|
||||||
@ -204,8 +207,14 @@ export interface MessageInputBaseParams {
|
|||||||
topic: Topic
|
topic: Topic
|
||||||
content?: string
|
content?: string
|
||||||
files?: FileType[]
|
files?: FileType[]
|
||||||
|
/**
|
||||||
|
* @deprecated
|
||||||
|
*/
|
||||||
knowledgeBaseIds?: string[]
|
knowledgeBaseIds?: string[]
|
||||||
mentions?: Model[]
|
mentions?: Model[]
|
||||||
|
/**
|
||||||
|
* @deprecated
|
||||||
|
*/
|
||||||
enabledMCPs?: MCPServer[]
|
enabledMCPs?: MCPServer[]
|
||||||
usage?: CompletionUsage
|
usage?: CompletionUsage
|
||||||
}
|
}
|
||||||
|
|||||||
@ -140,17 +140,6 @@ export const getCitationContent = (message: Message): string => {
|
|||||||
.join('\n\n')
|
.join('\n\n')
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* Gets the knowledgeBaseIds array from the *first* MainTextMessageBlock of a message.
|
|
||||||
* Note: Assumes knowledgeBaseIds are only relevant on the first text block, adjust if needed.
|
|
||||||
* @param message - The message object.
|
|
||||||
* @returns The knowledgeBaseIds array or undefined if not found.
|
|
||||||
*/
|
|
||||||
export const getKnowledgeBaseIds = (message: Message): string[] | undefined => {
|
|
||||||
const firstTextBlock = findMainTextBlocks(message)
|
|
||||||
return firstTextBlock?.flatMap((block) => block.knowledgeBaseIds).filter((id): id is string => Boolean(id))
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Gets the file content from all FileMessageBlocks and ImageMessageBlocks of a message.
|
* Gets the file content from all FileMessageBlocks and ImageMessageBlocks of a message.
|
||||||
* @param message - The message object.
|
* @param message - The message object.
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user