import cls from 'classnames'; import React, { useState } from 'react'; import { useInjectable } from '@opensumi/ide-core-browser'; import { Icon } from '@opensumi/ide-core-browser/lib/components'; import { Loading } from '@opensumi/ide-core-browser/lib/components/ai-native'; import { IChatToolContent, uuid } from '@opensumi/ide-core-common'; import { localize } from '@opensumi/ide-core-common/lib/localize'; import { IMCPServerRegistry, TokenMCPServerRegistry } from '../types'; import { CodeEditorWithHighlight } from './ChatEditor'; import styles from './ChatToolRender.module.less'; import { ChatToolResult } from './ChatToolResult'; export const ChatToolRender = (props: { value: IChatToolContent['content']; messageId?: string }) => { const { value, messageId } = props; const [isExpanded, setIsExpanded] = useState(false); const mcpServerFeatureRegistry = useInjectable(TokenMCPServerRegistry); if (!value || !value.function || !value.id) { return null; } const label = mcpServerFeatureRegistry.getMCPTool(value.function.name)?.label || value.function.name; const ToolComponent = mcpServerFeatureRegistry.getToolComponent(value.function.name); const getStateInfo = (state?: string): { label: string; icon: React.ReactNode } => { switch (state) { case 'streaming-start': case 'streaming': return { label: 'Generating', icon: }; case 'complete': return { label: 'Complete', icon: }; case 'result': return { label: 'Result Ready', icon: }; default: return { label: state || 'Unknown', icon: }; } }; const getParsedArgs = () => { try { // TODO: 流式输出中function_call的参数还不完整,需要等待complete状态 if (value.state !== 'complete' && value.state !== 'result') { return {}; } return JSON.parse(value.function?.arguments || '{}'); } catch (error) { return {}; } }; const toggleExpand = () => { setIsExpanded(!isExpanded); }; const stateInfo = getStateInfo(value.state); return ToolComponent && (value.state === 'complete' || value.state === 'result') ? ( ) : (
{label}
{value.state && (
{stateInfo.icon}
)}
{value?.function?.arguments && (
{localize('ai.native.mcp.tool.arguments')}:
)} {value?.result && (
{localize('ai.native.mcp.tool.results')}:
)}
); };