ai: call transcripts (each side recorded, merged by time) and summaries; search on Recordings
ci / check (push) Successful in 1m22s
ci / images (push) Successful in 27s

This commit is contained in:
iamdoubz committed 2026-10-21 19:10:02 -05:00
1 parent d9f9c6e444
commit 4d331fb70e
56 files changed
+5186 -37

No files matched your search

+12
View File
@@ -70,6 +70,11 @@ export type RecordingDto = {
startedAt: string;
durationMs: number | null;
sizeBytes: number | null;
/** Spec 10 §3, when call transcripts (and summaries) are on. */
summary: string | null;
hasTranscript: boolean;
/** Why there's no transcript or summary. */
aiError: string | null;
call: {
id: string;
direction: CallDirection;
@@ -79,6 +84,13 @@ export type RecordingDto = {
} | null;
};
/** GET /api/recordings/:id/transcript: who said what, from which second of the recording. */
export type TranscriptDto = {
lines: { side: 'caller' | 'other'; at: number; text: string }[];
summary: string | null;
aiError: string | null;
};
/** GET /api/reports/summary and /api/reports/queues (04 §7.3). Both default to the last 30 days. */
export const ReportRangeSchema = z
.object({ from: z.iso.date().optional(), to: z.iso.date().optional() })
+4
View File
@@ -100,6 +100,10 @@ export const SettingsSchemas = {
'ai.stt': AiEndpointSchema.nullable().default(null),
'ai.tts': AiTtsEndpointSchema.nullable().default(null),
'ai.voicemailTranscripts': z.boolean().default(false),
/** Recorded calls: each side recorded on its own, then written out (spec 10 §3). */
'ai.callTranscripts': z.boolean().default(false),
/** …and summarized by ai.llm. */
'ai.callSummaries': z.boolean().default(false),
// Not in 02 §3's table but used by the generator (03 §3).
'system.transportHash': z.string().nullable().default(null),
};