Recalculate costs
diff --git a/ui/app/workspace/logs/views/logChatMessageView.tsx b/ui/app/workspace/logs/views/logChatMessageView.tsx
index d7424ff3d..5b0c821cf 100644
--- a/ui/app/workspace/logs/views/logChatMessageView.tsx
+++ b/ui/app/workspace/logs/views/logChatMessageView.tsx
@@ -1,9 +1,11 @@
import { ChatMessage, ContentBlock } from "@/lib/types/logs";
import { CodeEditor } from "./codeEditor";
import { isJson, cleanJson } from "@/lib/utils/validation";
+import AudioPlayer from "./audioPlayer";
interface LogChatMessageViewProps {
message: ChatMessage;
+ audioFormat?: string; // Optional audio format from request params
}
const renderContentBlock = (block: ContentBlock, index: number) => {
@@ -62,7 +64,7 @@ const renderContentBlock = (block: ContentBlock, index: number) => {
);
};
-export default function LogChatMessageView({ message }: LogChatMessageViewProps) {
+export default function LogChatMessageView({ message, audioFormat }: LogChatMessageViewProps) {
return (
@@ -178,6 +180,35 @@ export default function LogChatMessageView({ message }: LogChatMessageViewProps)
/>
)}
+
+ {/* Handle audio output */}
+ {message.audio && (
+
+
Audio Output
+
+ {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"}
+
+ )}
+
+
+ )}
);
}
diff --git a/ui/app/workspace/logs/views/logDetailsSheet.tsx b/ui/app/workspace/logs/views/logDetailsSheet.tsx
index 084c22a4b..57f673e5f 100644
--- a/ui/app/workspace/logs/views/logDetailsSheet.tsx
+++ b/ui/app/workspace/logs/views/logDetailsSheet.tsx
@@ -34,6 +34,10 @@ export function LogDetailSheet({ log, open, onOpenChange, handleDelete }: LogDet
} catch (ignored) {}
}
+ // Extract audio format from request params
+ // Format can be in params.audio?.format or params.extra_params?.audio?.format
+ const audioFormat = (log.params as any)?.audio?.format || (log.params as any)?.extra_params?.audio?.format || undefined;
+
return (
@@ -115,10 +119,22 @@ export function LogDetailSheet({ log, open, onOpenChange, handleDelete }: LogDet
{log.fallback_index > 0 && }
{log.virtual_key && }
+ {/* Display audio params if present */}
+ {(log.params as any)?.audio && (
+ <>
+ {(log.params as any).audio.format && (
+
+ )}
+ {(log.params as any).audio.voice && (
+
+ )}
+ >
+ )}
+
{log.params &&
Object.keys(log.params).length > 0 &&
Object.entries(log.params)
- .filter(([key]) => key !== "tools" && key !== "instructions")
+ .filter(([key]) => key !== "tools" && key !== "instructions" && key !== "audio")
.filter(([_, value]) => typeof value === "boolean" || typeof value === "number" || typeof value === "string")
.map(([key, value]) => )}
@@ -360,7 +376,7 @@ export function LogDetailSheet({ log, open, onOpenChange, handleDelete }: LogDet
<>