UNPKG

@kaifronsdal/transcript-viewer

Version:

A web-based viewer for AI conversation transcripts with rollback support

87 lines (85 loc) 3.39 kB
function extractSystemPrompt(transcript) { if (!transcript?.events || !Array.isArray(transcript.events)) { console.warn("extractSystemPrompt: transcript.events is not a valid array:", transcript?.events); return void 0; } for (const event of transcript.events) { if (event.type === "transcript_event") { if (event.edit.operation === "add" && event.edit.message?.role === "system") { const content = event.edit.message.content; return typeof content === "string" ? content : JSON.stringify(content); } } } return void 0; } function extractTargetModel(transcript) { if (transcript.metadata.target_model && transcript.metadata.target_model !== "unknown") { return transcript.metadata.target_model; } const systemPrompt = extractSystemPrompt(transcript); if (systemPrompt) { const match = systemPrompt.match(/The target AI is a `([^`]+)` model/); if (match && match[1]) { return match[1]; } } return "unknown"; } function extractModelName(targetModel) { if (!targetModel || targetModel === "unknown") { return "unknown"; } const parts = targetModel.split(":"); if (parts.length > 1) { return parts[1]; } return targetModel; } function extractFirstSentence(text) { if (!text) return ""; const sentenceEndings = /[.!?](?:\s|$)/; const match = text.match(sentenceEndings); if (match) { const endIndex = match.index + match[0].length - (match[0].endsWith(" ") ? 1 : 0); return text.substring(0, endIndex).trim(); } return text.length > 150 ? text.substring(0, 150) + "..." : text; } function collectScoreDescriptions(transcripts) { const allDescriptions = {}; for (const transcript of transcripts) { if (transcript.scoreDescriptions) { for (const [scoreName, description] of Object.entries(transcript.scoreDescriptions)) { if (!allDescriptions[scoreName] && description) { allDescriptions[scoreName] = description; } } } } return allDescriptions; } function createTranscriptDisplay(transcript, filePath) { const targetModel = extractTargetModel(transcript); const pathParts = filePath.split("/"); const behaviorDir = pathParts.length > 1 ? pathParts[pathParts.length - 2] : ""; const fileName = pathParts[pathParts.length - 1]; const transcriptNumber = fileName.endsWith(".json") ? fileName.slice(0, -5) : fileName; return { id: transcript.metadata.transcript_id || transcriptNumber, model: extractModelName(targetModel), split: behaviorDir, concerningScore: transcript.metadata.judge_output?.scores?.concerning || 0, summary: transcript.metadata.judge_output?.summary || transcript.metadata.description || "No summary available", scores: transcript.metadata.judge_output?.scores || {}, scoreDescriptions: transcript.metadata.judge_output?.score_descriptions, judgeSummary: transcript.metadata.judge_output?.summary || "No judgment summary available", justification: transcript.metadata.judge_output?.justification || "No justification available", tags: transcript.metadata.tags || [], systemPrompt: extractSystemPrompt(transcript), transcript, _filePath: filePath }; } export { collectScoreDescriptions as a, extractFirstSentence as b, createTranscriptDisplay as c, extractModelName as e }; //# sourceMappingURL=transcript-utils-BY7i01oF.js.map