JavaScript Execution Sandbox
+ + diff --git a/tools/server/webui/src/components/ChatMessage.tsx b/tools/server/webui/src/components/ChatMessage.tsx index ee59de450d1ff..e914c8833cf98 100644 --- a/tools/server/webui/src/components/ChatMessage.tsx +++ b/tools/server/webui/src/components/ChatMessage.tsx @@ -1,8 +1,10 @@ import { useMemo, useState } from 'react'; import { useAppContext } from '../utils/app.context'; import { Message, PendingMessage } from '../utils/types'; -import { classNames } from '../utils/misc'; +import { classNames, parseThoughtContent } from '../utils/misc'; import MarkdownDisplay, { CopyButton } from './MarkdownDisplay'; +import { ToolCallArgsDisplay } from './tool_calling/ToolCallArgsDisplay'; +import { ToolCallResultDisplay } from './tool_calling/ToolCallResultDisplay'; import { ArrowPathIcon, ChevronLeftIcon, @@ -18,8 +20,87 @@ interface SplitMessage { isThinking?: boolean; } +// Helper function to extract thoughts using shared parseThoughtContent +function extractThoughts(content: string | null, role: string): SplitMessage { + if (content === null || (role !== 'assistant' && role !== 'tool')) { + return { content }; + } + + const { filteredContent, thoughtContent, isThinking } = + parseThoughtContent(content); + + return { + content: filteredContent, + thought: thoughtContent, + isThinking, + }; +} + +// Helper component to render a single message part +function MessagePart({ + message, + isPending, + showThoughts = true, + className = '', + baseClassName = '', + isMainMessage = false, +}: { + message: Message | PendingMessage; + isPending?: boolean; + showThoughts?: boolean; + className?: string; + baseClassName?: string; + isMainMessage?: boolean; +}) { + const { config } = useAppContext(); + const { content, thought, isThinking } = extractThoughts( + message.content, + message.role + ); + + if (message.role === 'tool' && baseClassName) { + return ( +