import { CodeEditor } from "@/components/ui/codeEditor"; import { ChatMessage, ContentBlock } from "@/lib/types/logs"; import { cleanJson, isJson } from "@/lib/utils/validation"; import AudioPlayer from "./audioPlayer"; import CollapsibleBox from "./collapsibleBox"; interface LogChatMessageViewProps { message: ChatMessage; audioFormat?: string; // Optional audio format from request params } function ContentBlockView({ block }: { block: ContentBlock; index: number }) { const blockType = block.type.replaceAll("_", " "); // Handle text content if (block.text) { if (isJson(block.text)) { const jsonContent = JSON.stringify(cleanJson(block.text), null, 2); return ( jsonContent} collapsedHeight={100}> ); } return ( block.text || ""} collapsedHeight={100}>
{block.text}
); } // Handle image content if (block.image_url) { const jsonContent = JSON.stringify(block.image_url, null, 2); return ( jsonContent} collapsedHeight={100}> ); } // Handle audio content if (block.input_audio) { const jsonContent = JSON.stringify(block.input_audio, null, 2); return ( jsonContent} collapsedHeight={100}> ); } return null; } export default function LogChatMessageView({ message, audioFormat }: LogChatMessageViewProps) { return (
{/* Role header */}
{message.role} {message.tool_call_id && Tool Call ID: {message.tool_call_id}}
{/* Handle reasoning content */} {message.reasoning && ( <> {isJson(message.reasoning) ? ( JSON.stringify(cleanJson(message.reasoning), null, 2)} collapsedHeight={100}> ) : ( message.reasoning || ""} collapsedHeight={100}>
{message.reasoning}
)} )} {/* Handle refusal content */} {message.refusal && ( <> {isJson(message.refusal) ? ( JSON.stringify(cleanJson(message.refusal), null, 2)} collapsedHeight={100}> ) : ( message.refusal || ""} collapsedHeight={100}>
{message.refusal}
)} )} {/* Handle content */} {message.content && ( <> {typeof message.content === "string" ? ( <> {isJson(message.content) ? ( JSON.stringify(cleanJson(message.content as string), null, 2)} collapsedHeight={100} > ) : ( (message.content as string) || ""} collapsedHeight={100}>
{message.content}
)} ) : ( Array.isArray(message.content) && message.content.map((block, blockIndex) => ) )} )} {/* Handle tool calls */} {message.tool_calls && message.tool_calls.length > 0 && ( <> {message.tool_calls.map((toolCall, index) => { const jsonContent = JSON.stringify(toolCall, null, 2); return ( jsonContent} collapsedHeight={100}> ); })} )} {/* Handle annotations */} {message.annotations && message.annotations.length > 0 && ( JSON.stringify(message.annotations, null, 2)} collapsedHeight={100}> )} {/* Handle audio output */} {message.audio && (
{message.audio.transcript && (
Transcript:
{message.audio.transcript}
)} {message.audio.data && (
Audio:
)} {message.audio.id && (
ID: {message.audio.id} | Expires:{" "} {message.audio.expires_at && Number.isFinite(message.audio.expires_at) ? new Date(message.audio.expires_at * 1000).toLocaleString() : "N/A"}
)}
)}
); }