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 && (
)}
{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"}
)}
)}
);
}