@absolutejs/voice 0.0.21 → 0.0.22-beta.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +1046 -2
- package/dist/agent.d.ts +113 -0
- package/dist/angular/index.js +90 -0
- package/dist/angular/voice-controller.service.d.ts +6 -0
- package/dist/angular/voice-stream.service.d.ts +6 -0
- package/dist/client/actions.d.ts +41 -0
- package/dist/client/audioPlayer.d.ts +40 -0
- package/dist/client/duplex.d.ts +3 -0
- package/dist/client/htmxBootstrap.js +84 -0
- package/dist/client/index.d.ts +2 -0
- package/dist/client/index.js +507 -5
- package/dist/correction.d.ts +18 -1
- package/dist/fileStore.d.ts +37 -0
- package/dist/index.d.ts +32 -1
- package/dist/index.js +8379 -1245
- package/dist/ops.d.ts +327 -0
- package/dist/opsPresets.d.ts +19 -0
- package/dist/opsRuntime.d.ts +66 -0
- package/dist/opsSinks.d.ts +149 -0
- package/dist/outcomeRecipes.d.ts +18 -0
- package/dist/postgresStore.d.ts +31 -0
- package/dist/queue.d.ts +276 -0
- package/dist/react/index.js +86 -0
- package/dist/react/useVoiceController.d.ts +6 -0
- package/dist/react/useVoiceStream.d.ts +6 -0
- package/dist/routing.d.ts +3 -0
- package/dist/runtimeOps.d.ts +23 -0
- package/dist/s3Store.d.ts +14 -0
- package/dist/sqliteStore.d.ts +26 -0
- package/dist/svelte/index.js +84 -0
- package/dist/telephony/response.d.ts +7 -0
- package/dist/telephony/twilio.d.ts +116 -0
- package/dist/testing/benchmark.d.ts +59 -4
- package/dist/testing/corrected.d.ts +41 -0
- package/dist/testing/duplex.d.ts +59 -0
- package/dist/testing/fixtures.d.ts +18 -2
- package/dist/testing/index.d.ts +5 -0
- package/dist/testing/index.js +5094 -284
- package/dist/testing/review.d.ts +143 -0
- package/dist/testing/sessionBenchmark.d.ts +25 -0
- package/dist/testing/stt.d.ts +2 -1
- package/dist/testing/telephony.d.ts +70 -0
- package/dist/testing/tts.d.ts +73 -0
- package/dist/trace.d.ts +236 -0
- package/dist/types.d.ts +320 -3
- package/dist/vue/index.js +90 -0
- package/dist/vue/useVoiceController.d.ts +11 -0
- package/dist/vue/useVoiceStream.d.ts +11 -0
- package/package.json +115 -1
|
@@ -0,0 +1,143 @@
|
|
|
1
|
+
import type { VoiceCallDisposition, VoiceServerMessage } from '../types';
|
|
2
|
+
type ReviewTimelineSource = 'benchmark' | 'stt' | 'turn' | 'twilio';
|
|
3
|
+
export type VoiceCallReviewTimelineEvent = {
|
|
4
|
+
atMs: number;
|
|
5
|
+
event: string;
|
|
6
|
+
source: ReviewTimelineSource;
|
|
7
|
+
bytes?: number;
|
|
8
|
+
chunkDurationMs?: number;
|
|
9
|
+
chunkIndex?: number;
|
|
10
|
+
confidence?: number;
|
|
11
|
+
name?: string;
|
|
12
|
+
reason?: string;
|
|
13
|
+
text?: string;
|
|
14
|
+
track?: string;
|
|
15
|
+
};
|
|
16
|
+
export type VoiceCallReviewConfig = {
|
|
17
|
+
preset?: string;
|
|
18
|
+
stt?: Record<string, unknown>;
|
|
19
|
+
tts?: Record<string, unknown>;
|
|
20
|
+
turnDetection?: Record<string, unknown>;
|
|
21
|
+
};
|
|
22
|
+
export type VoiceCallReviewPostCallSummary = {
|
|
23
|
+
label: string;
|
|
24
|
+
recommendedAction: string;
|
|
25
|
+
reason?: string;
|
|
26
|
+
summary: string;
|
|
27
|
+
target?: string;
|
|
28
|
+
};
|
|
29
|
+
export type VoiceCallReviewSummary = {
|
|
30
|
+
clearLatencyMs?: number;
|
|
31
|
+
elapsedMs?: number;
|
|
32
|
+
firstOutboundMediaLatencyMs?: number;
|
|
33
|
+
firstTurnLatencyMs?: number;
|
|
34
|
+
markLatencyMs?: number;
|
|
35
|
+
outcome?: VoiceCallDisposition;
|
|
36
|
+
outboundMediaCount?: number;
|
|
37
|
+
pass: boolean;
|
|
38
|
+
termRecall?: number;
|
|
39
|
+
turnCount?: number;
|
|
40
|
+
wordErrorRate?: number;
|
|
41
|
+
};
|
|
42
|
+
export type VoiceCallReviewArtifact = {
|
|
43
|
+
id?: string;
|
|
44
|
+
config?: VoiceCallReviewConfig;
|
|
45
|
+
errors: string[];
|
|
46
|
+
expectedText?: string;
|
|
47
|
+
fixtureId?: string;
|
|
48
|
+
generatedAt?: number;
|
|
49
|
+
latencyBreakdown: Array<{
|
|
50
|
+
label: string;
|
|
51
|
+
valueMs: number;
|
|
52
|
+
}>;
|
|
53
|
+
notes: string[];
|
|
54
|
+
path?: string;
|
|
55
|
+
postCall?: VoiceCallReviewPostCallSummary;
|
|
56
|
+
summary: VoiceCallReviewSummary;
|
|
57
|
+
title: string;
|
|
58
|
+
timeline: VoiceCallReviewTimelineEvent[];
|
|
59
|
+
transcript: {
|
|
60
|
+
actual: string;
|
|
61
|
+
expected?: string;
|
|
62
|
+
};
|
|
63
|
+
};
|
|
64
|
+
export type StoredVoiceCallReviewArtifact = VoiceCallReviewArtifact & {
|
|
65
|
+
id: string;
|
|
66
|
+
};
|
|
67
|
+
export type VoiceCallReviewStore<TArtifact extends StoredVoiceCallReviewArtifact = StoredVoiceCallReviewArtifact> = {
|
|
68
|
+
get: (id: string) => Promise<TArtifact | undefined> | TArtifact | undefined;
|
|
69
|
+
list: () => Promise<TArtifact[]> | TArtifact[];
|
|
70
|
+
remove: (id: string) => Promise<void> | void;
|
|
71
|
+
set: (id: string, artifact: TArtifact) => Promise<void> | void;
|
|
72
|
+
};
|
|
73
|
+
type LiveTelephonyFixture = {
|
|
74
|
+
actualText: string;
|
|
75
|
+
clearLatencyMs?: number;
|
|
76
|
+
elapsedMs?: number;
|
|
77
|
+
errors?: string[];
|
|
78
|
+
expectedText?: string;
|
|
79
|
+
fixtureId?: string;
|
|
80
|
+
firstOutboundMediaLatencyMs?: number;
|
|
81
|
+
firstTurnLatencyMs?: number;
|
|
82
|
+
markLatencyMs?: number;
|
|
83
|
+
outboundMediaCount?: number;
|
|
84
|
+
passes: boolean;
|
|
85
|
+
termRecall?: number;
|
|
86
|
+
title?: string;
|
|
87
|
+
turnCount?: number;
|
|
88
|
+
wordErrorRate?: number;
|
|
89
|
+
};
|
|
90
|
+
type LiveTelephonyTraceEvent = VoiceCallReviewTimelineEvent;
|
|
91
|
+
type LiveTelephonyReviewInput = {
|
|
92
|
+
fixtures?: LiveTelephonyFixture[];
|
|
93
|
+
generatedAt?: number;
|
|
94
|
+
trace?: LiveTelephonyTraceEvent[];
|
|
95
|
+
ttsConfig?: Record<string, unknown>;
|
|
96
|
+
turnDetectionConfig?: Record<string, unknown>;
|
|
97
|
+
variant?: {
|
|
98
|
+
description?: string;
|
|
99
|
+
id?: string;
|
|
100
|
+
model?: string;
|
|
101
|
+
};
|
|
102
|
+
};
|
|
103
|
+
export type VoiceCallReviewRecorderOptions = {
|
|
104
|
+
config?: VoiceCallReviewConfig;
|
|
105
|
+
fixtureId?: string;
|
|
106
|
+
now?: () => number;
|
|
107
|
+
path?: string;
|
|
108
|
+
title?: string;
|
|
109
|
+
};
|
|
110
|
+
export type VoiceCallReviewRecorder = {
|
|
111
|
+
finalize: () => VoiceCallReviewArtifact;
|
|
112
|
+
recordError: (error: unknown) => void;
|
|
113
|
+
recordTwilioInbound: (input: {
|
|
114
|
+
bytes?: number;
|
|
115
|
+
chunkDurationMs?: number;
|
|
116
|
+
event: 'connected' | 'mark' | 'media' | 'start' | 'stop';
|
|
117
|
+
name?: string;
|
|
118
|
+
reason?: string;
|
|
119
|
+
text?: string;
|
|
120
|
+
track?: string;
|
|
121
|
+
}) => void;
|
|
122
|
+
recordTwilioOutbound: (input: {
|
|
123
|
+
bytes?: number;
|
|
124
|
+
chunkDurationMs?: number;
|
|
125
|
+
event: 'clear' | 'mark' | 'media';
|
|
126
|
+
name?: string;
|
|
127
|
+
reason?: string;
|
|
128
|
+
text?: string;
|
|
129
|
+
track?: string;
|
|
130
|
+
}) => void;
|
|
131
|
+
recordVoiceMessage: (message: VoiceServerMessage) => void;
|
|
132
|
+
};
|
|
133
|
+
export declare const withVoiceCallReviewId: <TArtifact extends VoiceCallReviewArtifact = VoiceCallReviewArtifact>(id: string, artifact: TArtifact) => TArtifact & {
|
|
134
|
+
id: string;
|
|
135
|
+
};
|
|
136
|
+
export declare const createVoiceCallReviewFromLiveTelephonyReport: (report: LiveTelephonyReviewInput, options?: {
|
|
137
|
+
path?: string;
|
|
138
|
+
preset?: string;
|
|
139
|
+
}) => VoiceCallReviewArtifact;
|
|
140
|
+
export declare const createVoiceCallReviewRecorder: (options?: VoiceCallReviewRecorderOptions) => VoiceCallReviewRecorder;
|
|
141
|
+
export declare const renderVoiceCallReviewMarkdown: (artifact: VoiceCallReviewArtifact) => string;
|
|
142
|
+
export declare const renderVoiceCallReviewHTML: (artifact: VoiceCallReviewArtifact) => string;
|
|
143
|
+
export {};
|
|
@@ -5,7 +5,9 @@ export type VoiceSessionBenchmarkScenario = VoiceTestFixture & {
|
|
|
5
5
|
expectedTurnTexts: string[];
|
|
6
6
|
phraseHints?: VoicePhraseHint[];
|
|
7
7
|
reconnectAtChunkIndex?: number;
|
|
8
|
+
reconnectAtChunkIndices?: number[];
|
|
8
9
|
reconnectPauseMs?: number;
|
|
10
|
+
reconnectPauseMsByIndex?: number[];
|
|
9
11
|
silenceMs?: number;
|
|
10
12
|
speechThreshold?: number;
|
|
11
13
|
transcriptStabilityMs?: number;
|
|
@@ -29,14 +31,20 @@ export type VoiceSessionBenchmarkTurnResult = {
|
|
|
29
31
|
};
|
|
30
32
|
export type VoiceSessionBenchmarkScenarioResult = {
|
|
31
33
|
actualTurns: string[];
|
|
34
|
+
averageRelativeCostUnits: number;
|
|
32
35
|
duplicateTurnCount: number;
|
|
33
36
|
elapsedMs: number;
|
|
37
|
+
fallbackReplayAudioMs: number;
|
|
38
|
+
expectedReconnectCount: number;
|
|
34
39
|
expectedTurns: string[];
|
|
35
40
|
fixtureId: string;
|
|
41
|
+
primaryAudioMs: number;
|
|
36
42
|
passes: boolean;
|
|
43
|
+
reconnectCount: number;
|
|
37
44
|
reconnectTriggered: boolean;
|
|
38
45
|
tags: string[];
|
|
39
46
|
title: string;
|
|
47
|
+
turnPassRate: number;
|
|
40
48
|
turnCountDelta: number;
|
|
41
49
|
turnResults: VoiceSessionBenchmarkTurnResult[];
|
|
42
50
|
trace?: VoiceSessionBenchmarkTraceEntry[];
|
|
@@ -44,10 +52,16 @@ export type VoiceSessionBenchmarkScenarioResult = {
|
|
|
44
52
|
export type VoiceSessionBenchmarkSummary = {
|
|
45
53
|
adapterId: string;
|
|
46
54
|
averageElapsedMs: number;
|
|
55
|
+
averageFallbackReplayAudioMs: number;
|
|
56
|
+
averagePrimaryAudioMs: number;
|
|
57
|
+
averageReconnectCount: number;
|
|
58
|
+
averageRelativeCostUnits: number;
|
|
59
|
+
averageTurnPassRate: number;
|
|
47
60
|
averageWordErrorRate: number;
|
|
48
61
|
duplicateTurnRate: number;
|
|
49
62
|
passCount: number;
|
|
50
63
|
passRate: number;
|
|
64
|
+
reconnectCoverageRate: number;
|
|
51
65
|
reconnectSuccessRate: number;
|
|
52
66
|
scenarioCount: number;
|
|
53
67
|
scenariosWithDuplicateTurns: number;
|
|
@@ -61,6 +75,11 @@ export type VoiceSessionBenchmarkReport = {
|
|
|
61
75
|
};
|
|
62
76
|
export type VoiceSessionBenchmarkScenarioAggregate = {
|
|
63
77
|
averageElapsedMs: number;
|
|
78
|
+
averageFallbackReplayAudioMs: number;
|
|
79
|
+
averagePrimaryAudioMs: number;
|
|
80
|
+
averageReconnectCount: number;
|
|
81
|
+
averageRelativeCostUnits: number;
|
|
82
|
+
averageTurnPassRate: number;
|
|
64
83
|
averageWordErrorRate: number;
|
|
65
84
|
bestWordErrorRate: number;
|
|
66
85
|
fixtureId: string;
|
|
@@ -75,10 +94,16 @@ export type VoiceSessionBenchmarkScenarioAggregate = {
|
|
|
75
94
|
export type VoiceSessionBenchmarkSeriesSummary = {
|
|
76
95
|
adapterId: string;
|
|
77
96
|
averageElapsedMs: number;
|
|
97
|
+
averageFallbackReplayAudioMs: number;
|
|
78
98
|
averagePassRate: number;
|
|
99
|
+
averagePrimaryAudioMs: number;
|
|
100
|
+
averageReconnectCount: number;
|
|
101
|
+
averageRelativeCostUnits: number;
|
|
102
|
+
averageTurnPassRate: number;
|
|
79
103
|
averageWordErrorRate: number;
|
|
80
104
|
flakyScenarioCount: number;
|
|
81
105
|
generatedRunCount: number;
|
|
106
|
+
reconnectCoverageRate: number;
|
|
82
107
|
reconnectSuccessRate: number;
|
|
83
108
|
scenarioCount: number;
|
|
84
109
|
stableScenarioCount: number;
|
package/dist/testing/stt.d.ts
CHANGED
|
@@ -1,9 +1,10 @@
|
|
|
1
1
|
import { type VoiceTranscriptAccuracy } from './accuracy';
|
|
2
|
-
import type { STTAdapter, VoiceCloseEvent, VoiceEndOfTurnEvent, VoiceErrorEvent, VoiceFinalEvent, VoicePartialEvent } from '../types';
|
|
2
|
+
import type { STTAdapter, STTAdapterOpenOptions, VoiceCloseEvent, VoiceEndOfTurnEvent, VoiceErrorEvent, VoiceFinalEvent, VoicePartialEvent } from '../types';
|
|
3
3
|
import type { VoiceTestFixture } from './fixtures';
|
|
4
4
|
export type VoiceSTTAdapterHarnessOptions = {
|
|
5
5
|
chunkDurationMs?: number;
|
|
6
6
|
idleTimeoutMs?: number;
|
|
7
|
+
openOptions?: Partial<STTAdapterOpenOptions> | ((fixture: VoiceTestFixture) => Partial<STTAdapterOpenOptions> | undefined);
|
|
7
8
|
settleMs?: number;
|
|
8
9
|
tailPaddingMs?: number;
|
|
9
10
|
transcriptThreshold?: number;
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
export type VoiceTelephonyBenchmarkScenario = {
|
|
2
|
+
expectClear: boolean;
|
|
3
|
+
expectMark: boolean;
|
|
4
|
+
expectOutboundMedia: boolean;
|
|
5
|
+
id: string;
|
|
6
|
+
secondInboundDelayMs?: number;
|
|
7
|
+
sttDelayMs?: number;
|
|
8
|
+
title: string;
|
|
9
|
+
ttsChunkCount?: number;
|
|
10
|
+
ttsChunkDelayMs?: number;
|
|
11
|
+
};
|
|
12
|
+
export type VoiceTelephonyBenchmarkScenarioResult = {
|
|
13
|
+
clearCount: number;
|
|
14
|
+
clearLatencyMs?: number;
|
|
15
|
+
elapsedMs: number;
|
|
16
|
+
expectClear: boolean;
|
|
17
|
+
expectMark: boolean;
|
|
18
|
+
expectOutboundMedia: boolean;
|
|
19
|
+
fixtureId: string;
|
|
20
|
+
firstOutboundMediaLatencyMs?: number;
|
|
21
|
+
markCount: number;
|
|
22
|
+
markLatencyMs?: number;
|
|
23
|
+
outboundMediaCount: number;
|
|
24
|
+
passes: boolean;
|
|
25
|
+
receivedAudioBytes: number;
|
|
26
|
+
title: string;
|
|
27
|
+
};
|
|
28
|
+
export type VoiceTelephonyBenchmarkSummary = {
|
|
29
|
+
averageClearLatencyMs?: number;
|
|
30
|
+
averageElapsedMs: number;
|
|
31
|
+
averageFirstOutboundMediaLatencyMs?: number;
|
|
32
|
+
averageMarkLatencyMs?: number;
|
|
33
|
+
passCount: number;
|
|
34
|
+
passRate: number;
|
|
35
|
+
scenarioCount: number;
|
|
36
|
+
totalOutboundMediaCount: number;
|
|
37
|
+
};
|
|
38
|
+
export type VoiceTelephonyBenchmarkReport = {
|
|
39
|
+
fixtures: VoiceTelephonyBenchmarkScenarioResult[];
|
|
40
|
+
generatedAt: number;
|
|
41
|
+
summary: VoiceTelephonyBenchmarkSummary;
|
|
42
|
+
};
|
|
43
|
+
type VoiceTelephonyBenchmarkOptions = {
|
|
44
|
+
timeoutMs?: number;
|
|
45
|
+
};
|
|
46
|
+
export declare const getDefaultVoiceTelephonyBenchmarkScenarios: () => {
|
|
47
|
+
expectClear: boolean;
|
|
48
|
+
expectMark: boolean;
|
|
49
|
+
expectOutboundMedia: boolean;
|
|
50
|
+
id: string;
|
|
51
|
+
secondInboundDelayMs?: number;
|
|
52
|
+
sttDelayMs?: number;
|
|
53
|
+
title: string;
|
|
54
|
+
ttsChunkCount?: number;
|
|
55
|
+
ttsChunkDelayMs?: number;
|
|
56
|
+
}[];
|
|
57
|
+
export declare const runVoiceTelephonyBenchmarkScenario: (scenario: VoiceTelephonyBenchmarkScenario, options?: VoiceTelephonyBenchmarkOptions) => Promise<VoiceTelephonyBenchmarkScenarioResult>;
|
|
58
|
+
export declare const summarizeVoiceTelephonyBenchmark: (fixtures: VoiceTelephonyBenchmarkScenarioResult[]) => VoiceTelephonyBenchmarkSummary;
|
|
59
|
+
export declare const runVoiceTelephonyBenchmark: (scenarios?: {
|
|
60
|
+
expectClear: boolean;
|
|
61
|
+
expectMark: boolean;
|
|
62
|
+
expectOutboundMedia: boolean;
|
|
63
|
+
id: string;
|
|
64
|
+
secondInboundDelayMs?: number;
|
|
65
|
+
sttDelayMs?: number;
|
|
66
|
+
title: string;
|
|
67
|
+
ttsChunkCount?: number;
|
|
68
|
+
ttsChunkDelayMs?: number;
|
|
69
|
+
}[], options?: VoiceTelephonyBenchmarkOptions) => Promise<VoiceTelephonyBenchmarkReport>;
|
|
70
|
+
export {};
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
import type { AudioFormat, RealtimeAdapter, RealtimeAdapterOpenOptions, TTSAdapter, TTSAdapterOpenOptions } from '../types';
|
|
2
|
+
export type VoiceTTSBenchmarkFixture = {
|
|
3
|
+
id: string;
|
|
4
|
+
tags?: string[];
|
|
5
|
+
text: string;
|
|
6
|
+
title: string;
|
|
7
|
+
};
|
|
8
|
+
export type VoiceTTSBenchmarkFixtureResult = {
|
|
9
|
+
audioChunkCount: number;
|
|
10
|
+
audioDurationMs: number;
|
|
11
|
+
audioFormat?: AudioFormat;
|
|
12
|
+
closeCount: number;
|
|
13
|
+
elapsedMs: number;
|
|
14
|
+
errorCount: number;
|
|
15
|
+
fixtureId: string;
|
|
16
|
+
firstAudioLatencyMs?: number;
|
|
17
|
+
interruptionLatencyMs?: number;
|
|
18
|
+
interruptionRequestedAtMs?: number;
|
|
19
|
+
passes: boolean;
|
|
20
|
+
postInterruptAudioBytes?: number;
|
|
21
|
+
preInterruptAudioBytes?: number;
|
|
22
|
+
tags: string[];
|
|
23
|
+
textLength: number;
|
|
24
|
+
title: string;
|
|
25
|
+
totalAudioBytes: number;
|
|
26
|
+
};
|
|
27
|
+
export type VoiceTTSBenchmarkSummary = {
|
|
28
|
+
adapterId: string;
|
|
29
|
+
averageAudioChunkCount: number;
|
|
30
|
+
averageAudioDurationMs: number;
|
|
31
|
+
averageElapsedMs: number;
|
|
32
|
+
averageFirstAudioLatencyMs?: number;
|
|
33
|
+
averageInterruptionLatencyMs?: number;
|
|
34
|
+
averageTextLength: number;
|
|
35
|
+
fixtureCount: number;
|
|
36
|
+
passCount: number;
|
|
37
|
+
passRate: number;
|
|
38
|
+
totalAudioBytes: number;
|
|
39
|
+
totalErrorCount: number;
|
|
40
|
+
};
|
|
41
|
+
export type VoiceTTSBenchmarkReport = {
|
|
42
|
+
adapterId: string;
|
|
43
|
+
fixtures: VoiceTTSBenchmarkFixtureResult[];
|
|
44
|
+
generatedAt: number;
|
|
45
|
+
profileId?: string;
|
|
46
|
+
summary: VoiceTTSBenchmarkSummary;
|
|
47
|
+
};
|
|
48
|
+
export type VoiceTTSBenchmarkOptions = {
|
|
49
|
+
idleTimeoutMs?: number;
|
|
50
|
+
interruptAfterFirstAudioMs?: number;
|
|
51
|
+
minAudioBytes?: number;
|
|
52
|
+
openOptions?: Partial<TTSAdapterOpenOptions & RealtimeAdapterOpenOptions> | ((fixture: VoiceTTSBenchmarkFixture) => Partial<TTSAdapterOpenOptions & RealtimeAdapterOpenOptions> | undefined);
|
|
53
|
+
realtimeFormat?: AudioFormat;
|
|
54
|
+
settleMs?: number;
|
|
55
|
+
waitForFirstAudioMs?: number;
|
|
56
|
+
waitForCloseAfterInterruptMs?: number;
|
|
57
|
+
};
|
|
58
|
+
type VoiceOutputAdapter = TTSAdapter | RealtimeAdapter;
|
|
59
|
+
export declare const getDefaultTTSBenchmarkFixtures: () => {
|
|
60
|
+
id: string;
|
|
61
|
+
tags?: string[];
|
|
62
|
+
text: string;
|
|
63
|
+
title: string;
|
|
64
|
+
}[];
|
|
65
|
+
export declare const runTTSAdapterFixture: (adapter: VoiceOutputAdapter, fixture: VoiceTTSBenchmarkFixture, options?: VoiceTTSBenchmarkOptions) => Promise<VoiceTTSBenchmarkFixtureResult>;
|
|
66
|
+
export declare const runTTSAdapterBenchmark: (adapterId: string, adapter: VoiceOutputAdapter, fixtures?: {
|
|
67
|
+
id: string;
|
|
68
|
+
tags?: string[];
|
|
69
|
+
text: string;
|
|
70
|
+
title: string;
|
|
71
|
+
}[], options?: VoiceTTSBenchmarkOptions) => Promise<VoiceTTSBenchmarkReport>;
|
|
72
|
+
export declare const summarizeTTSBenchmark: (adapterId: string, fixtures: VoiceTTSBenchmarkFixtureResult[]) => VoiceTTSBenchmarkSummary;
|
|
73
|
+
export {};
|
package/dist/trace.d.ts
ADDED
|
@@ -0,0 +1,236 @@
|
|
|
1
|
+
export type VoiceTraceEventType = 'agent.handoff' | 'agent.model' | 'agent.result' | 'agent.tool' | 'call.lifecycle' | 'session.error' | 'turn.assistant' | 'turn.committed' | 'turn.cost' | 'turn.transcript';
|
|
2
|
+
export type VoiceTraceEvent<TPayload extends Record<string, unknown> = Record<string, unknown>> = {
|
|
3
|
+
at: number;
|
|
4
|
+
id?: string;
|
|
5
|
+
metadata?: Record<string, unknown>;
|
|
6
|
+
payload: TPayload;
|
|
7
|
+
scenarioId?: string;
|
|
8
|
+
sessionId: string;
|
|
9
|
+
traceId?: string;
|
|
10
|
+
turnId?: string;
|
|
11
|
+
type: VoiceTraceEventType;
|
|
12
|
+
};
|
|
13
|
+
export type StoredVoiceTraceEvent<TPayload extends Record<string, unknown> = Record<string, unknown>> = VoiceTraceEvent<TPayload> & {
|
|
14
|
+
id: string;
|
|
15
|
+
};
|
|
16
|
+
export type VoiceTraceEventFilter = {
|
|
17
|
+
limit?: number;
|
|
18
|
+
scenarioId?: string;
|
|
19
|
+
sessionId?: string;
|
|
20
|
+
traceId?: string;
|
|
21
|
+
turnId?: string;
|
|
22
|
+
type?: VoiceTraceEventType | VoiceTraceEventType[];
|
|
23
|
+
};
|
|
24
|
+
export type VoiceTraceEventStore<TEvent extends StoredVoiceTraceEvent = StoredVoiceTraceEvent> = {
|
|
25
|
+
append: (event: VoiceTraceEvent | TEvent) => Promise<TEvent>;
|
|
26
|
+
get: (id: string) => Promise<TEvent | undefined>;
|
|
27
|
+
list: (filter?: VoiceTraceEventFilter) => Promise<TEvent[]>;
|
|
28
|
+
remove: (id: string) => Promise<void>;
|
|
29
|
+
};
|
|
30
|
+
export type VoiceTracePruneFilter = Omit<VoiceTraceEventFilter, 'limit'>;
|
|
31
|
+
export type VoiceTracePruneOptions = {
|
|
32
|
+
before?: number;
|
|
33
|
+
beforeOrAt?: number;
|
|
34
|
+
dryRun?: boolean;
|
|
35
|
+
filter?: VoiceTracePruneFilter;
|
|
36
|
+
keepNewest?: number;
|
|
37
|
+
limit?: number;
|
|
38
|
+
store: VoiceTraceEventStore;
|
|
39
|
+
};
|
|
40
|
+
export type VoiceTracePruneResult = {
|
|
41
|
+
deleted: StoredVoiceTraceEvent[];
|
|
42
|
+
deletedCount: number;
|
|
43
|
+
dryRun: boolean;
|
|
44
|
+
scannedCount: number;
|
|
45
|
+
};
|
|
46
|
+
export type VoiceTraceSinkDeliveryStatus = 'delivered' | 'failed' | 'skipped';
|
|
47
|
+
export type VoiceTraceSinkDeliveryQueueStatus = VoiceTraceSinkDeliveryStatus | 'pending';
|
|
48
|
+
export type VoiceTraceSinkDeliveryResult = {
|
|
49
|
+
attempts: number;
|
|
50
|
+
deliveredAt?: number;
|
|
51
|
+
deliveredTo?: string;
|
|
52
|
+
error?: string;
|
|
53
|
+
eventCount: number;
|
|
54
|
+
responseBody?: unknown;
|
|
55
|
+
status: VoiceTraceSinkDeliveryStatus;
|
|
56
|
+
};
|
|
57
|
+
export type VoiceTraceSink = {
|
|
58
|
+
deliver: (input: {
|
|
59
|
+
events: StoredVoiceTraceEvent[];
|
|
60
|
+
}) => Promise<VoiceTraceSinkDeliveryResult> | VoiceTraceSinkDeliveryResult;
|
|
61
|
+
eventTypes?: VoiceTraceEventType[];
|
|
62
|
+
id: string;
|
|
63
|
+
kind?: string;
|
|
64
|
+
};
|
|
65
|
+
export type VoiceTraceSinkFanoutResult = {
|
|
66
|
+
deliveredAt: number;
|
|
67
|
+
eventCount: number;
|
|
68
|
+
sinkDeliveries: Record<string, VoiceTraceSinkDeliveryResult>;
|
|
69
|
+
status: VoiceTraceSinkDeliveryStatus;
|
|
70
|
+
};
|
|
71
|
+
export type VoiceTraceSinkDeliveryRecord = {
|
|
72
|
+
createdAt: number;
|
|
73
|
+
deliveredAt?: number;
|
|
74
|
+
deliveryAttempts?: number;
|
|
75
|
+
deliveryError?: string;
|
|
76
|
+
deliveryStatus: VoiceTraceSinkDeliveryQueueStatus;
|
|
77
|
+
events: StoredVoiceTraceEvent[];
|
|
78
|
+
id: string;
|
|
79
|
+
sinkDeliveries?: Record<string, VoiceTraceSinkDeliveryResult>;
|
|
80
|
+
updatedAt: number;
|
|
81
|
+
};
|
|
82
|
+
export type VoiceTraceSinkDeliveryStore<TDelivery extends VoiceTraceSinkDeliveryRecord = VoiceTraceSinkDeliveryRecord> = {
|
|
83
|
+
get: (id: string) => Promise<TDelivery | undefined> | TDelivery | undefined;
|
|
84
|
+
list: () => Promise<TDelivery[]> | TDelivery[];
|
|
85
|
+
remove: (id: string) => Promise<void> | void;
|
|
86
|
+
set: (id: string, delivery: TDelivery) => Promise<void> | void;
|
|
87
|
+
};
|
|
88
|
+
export type VoiceTraceHTTPSinkOptions<TBody extends Record<string, unknown> = Record<string, unknown>> = {
|
|
89
|
+
backoffMs?: number;
|
|
90
|
+
body?: (input: {
|
|
91
|
+
events: StoredVoiceTraceEvent[];
|
|
92
|
+
}) => Promise<TBody> | TBody;
|
|
93
|
+
eventTypes?: VoiceTraceEventType[];
|
|
94
|
+
fetch?: typeof fetch;
|
|
95
|
+
headers?: Record<string, string>;
|
|
96
|
+
id: string;
|
|
97
|
+
kind?: string;
|
|
98
|
+
method?: 'POST' | 'PUT' | 'PATCH';
|
|
99
|
+
retries?: number;
|
|
100
|
+
signingSecret?: string;
|
|
101
|
+
timeoutMs?: number;
|
|
102
|
+
url: string;
|
|
103
|
+
};
|
|
104
|
+
export type VoiceTraceSinkStoreOptions<TEvent extends StoredVoiceTraceEvent = StoredVoiceTraceEvent> = {
|
|
105
|
+
awaitDelivery?: boolean;
|
|
106
|
+
deliveryQueue?: VoiceTraceSinkDeliveryStore;
|
|
107
|
+
onDelivery?: (result: VoiceTraceSinkFanoutResult) => Promise<void> | void;
|
|
108
|
+
onError?: (error: unknown) => Promise<void> | void;
|
|
109
|
+
redact?: VoiceTraceRedactionConfig;
|
|
110
|
+
sinks: VoiceTraceSink[];
|
|
111
|
+
store: VoiceTraceEventStore<TEvent>;
|
|
112
|
+
};
|
|
113
|
+
export type VoiceTraceSummary = {
|
|
114
|
+
assistantReplyCount: number;
|
|
115
|
+
callDurationMs?: number;
|
|
116
|
+
cost: {
|
|
117
|
+
estimatedRelativeCostUnits: number;
|
|
118
|
+
totalBillableAudioMs: number;
|
|
119
|
+
};
|
|
120
|
+
endedAt?: number;
|
|
121
|
+
errorCount: number;
|
|
122
|
+
eventCount: number;
|
|
123
|
+
failed: boolean;
|
|
124
|
+
handoffCount: number;
|
|
125
|
+
modelCallCount: number;
|
|
126
|
+
sessionId?: string;
|
|
127
|
+
startedAt?: number;
|
|
128
|
+
toolCallCount: number;
|
|
129
|
+
toolErrorCount: number;
|
|
130
|
+
traceId?: string;
|
|
131
|
+
transcriptCount: number;
|
|
132
|
+
turnCount: number;
|
|
133
|
+
};
|
|
134
|
+
export type VoiceTraceIssueSeverity = 'error' | 'warning';
|
|
135
|
+
export type VoiceTraceIssue = {
|
|
136
|
+
code: string;
|
|
137
|
+
message: string;
|
|
138
|
+
severity: VoiceTraceIssueSeverity;
|
|
139
|
+
};
|
|
140
|
+
export type VoiceTraceEvaluationOptions = {
|
|
141
|
+
maxHandoffs?: number;
|
|
142
|
+
maxModelCallsPerTurn?: number;
|
|
143
|
+
maxToolErrors?: number;
|
|
144
|
+
requireAssistantReply?: boolean;
|
|
145
|
+
requireCompletedCall?: boolean;
|
|
146
|
+
requireTranscript?: boolean;
|
|
147
|
+
requireTurn?: boolean;
|
|
148
|
+
};
|
|
149
|
+
export type VoiceTraceEvaluation = {
|
|
150
|
+
issues: VoiceTraceIssue[];
|
|
151
|
+
pass: boolean;
|
|
152
|
+
summary: VoiceTraceSummary;
|
|
153
|
+
};
|
|
154
|
+
export type VoiceTraceRedactionReplacement = string | ((input: {
|
|
155
|
+
key?: string;
|
|
156
|
+
path: string[];
|
|
157
|
+
value: string;
|
|
158
|
+
}) => string);
|
|
159
|
+
export type VoiceTraceRedactionOptions = {
|
|
160
|
+
keys?: string[];
|
|
161
|
+
redactEmails?: boolean;
|
|
162
|
+
redactPhoneNumbers?: boolean;
|
|
163
|
+
redactText?: boolean;
|
|
164
|
+
replacement?: VoiceTraceRedactionReplacement;
|
|
165
|
+
textKeys?: string[];
|
|
166
|
+
};
|
|
167
|
+
export type VoiceTraceRedactionConfig = boolean | VoiceTraceRedactionOptions;
|
|
168
|
+
export type VoiceResolvedTraceRedactionOptions = Required<Pick<VoiceTraceRedactionOptions, 'redactEmails' | 'redactPhoneNumbers' | 'redactText'>> & {
|
|
169
|
+
keys: string[];
|
|
170
|
+
replacement: VoiceTraceRedactionReplacement;
|
|
171
|
+
textKeys: string[];
|
|
172
|
+
};
|
|
173
|
+
export declare const createVoiceTraceEventId: (event: {
|
|
174
|
+
at?: number;
|
|
175
|
+
sessionId: string;
|
|
176
|
+
turnId?: string;
|
|
177
|
+
type: VoiceTraceEventType;
|
|
178
|
+
}) => string;
|
|
179
|
+
export declare const createVoiceTraceEvent: <TEvent extends VoiceTraceEvent = VoiceTraceEvent>(event: TEvent) => StoredVoiceTraceEvent<TEvent["payload"]>;
|
|
180
|
+
export declare const createVoiceTraceSinkDeliveryId: (events: StoredVoiceTraceEvent[]) => string;
|
|
181
|
+
export declare const createVoiceTraceSinkDeliveryRecord: (input: {
|
|
182
|
+
createdAt?: number;
|
|
183
|
+
events: StoredVoiceTraceEvent[];
|
|
184
|
+
id?: string;
|
|
185
|
+
} & Partial<Omit<VoiceTraceSinkDeliveryRecord, "createdAt" | "events" | "id">>) => VoiceTraceSinkDeliveryRecord;
|
|
186
|
+
export declare const filterVoiceTraceEvents: <TEvent extends StoredVoiceTraceEvent = StoredVoiceTraceEvent>(events: TEvent[], filter?: VoiceTraceEventFilter) => TEvent[];
|
|
187
|
+
export declare const selectVoiceTraceEventsForPrune: <TEvent extends StoredVoiceTraceEvent = StoredVoiceTraceEvent>(events: TEvent[], options?: Omit<VoiceTracePruneOptions, "store">) => TEvent[];
|
|
188
|
+
export declare const pruneVoiceTraceEvents: (options: VoiceTracePruneOptions) => Promise<VoiceTracePruneResult>;
|
|
189
|
+
export declare const createVoiceTraceHTTPSink: <TBody extends Record<string, unknown> = Record<string, unknown>>(options: VoiceTraceHTTPSinkOptions<TBody>) => VoiceTraceSink;
|
|
190
|
+
export declare const deliverVoiceTraceEventsToSinks: (input: {
|
|
191
|
+
events: StoredVoiceTraceEvent[];
|
|
192
|
+
redact?: VoiceTraceRedactionConfig;
|
|
193
|
+
sinks: VoiceTraceSink[];
|
|
194
|
+
}) => Promise<VoiceTraceSinkFanoutResult>;
|
|
195
|
+
export declare const createVoiceTraceSinkStore: <TEvent extends StoredVoiceTraceEvent = StoredVoiceTraceEvent>(options: VoiceTraceSinkStoreOptions<TEvent>) => VoiceTraceEventStore<TEvent>;
|
|
196
|
+
export declare const createVoiceMemoryTraceSinkDeliveryStore: <TDelivery extends VoiceTraceSinkDeliveryRecord = VoiceTraceSinkDeliveryRecord>() => VoiceTraceSinkDeliveryStore<TDelivery>;
|
|
197
|
+
export declare const createVoiceMemoryTraceEventStore: <TEvent extends StoredVoiceTraceEvent = StoredVoiceTraceEvent>() => VoiceTraceEventStore<TEvent>;
|
|
198
|
+
export declare const exportVoiceTrace: (input: {
|
|
199
|
+
filter?: VoiceTraceEventFilter;
|
|
200
|
+
redact?: VoiceTraceRedactionConfig;
|
|
201
|
+
store: VoiceTraceEventStore;
|
|
202
|
+
}) => Promise<{
|
|
203
|
+
exportedAt: number;
|
|
204
|
+
events: StoredVoiceTraceEvent<Record<string, unknown>>[];
|
|
205
|
+
filter: VoiceTraceEventFilter | undefined;
|
|
206
|
+
redacted: boolean;
|
|
207
|
+
}>;
|
|
208
|
+
export declare const resolveVoiceTraceRedactionOptions: (options?: VoiceTraceRedactionConfig) => VoiceResolvedTraceRedactionOptions;
|
|
209
|
+
export declare const redactVoiceTraceText: (value: string, options?: VoiceTraceRedactionConfig, input?: {
|
|
210
|
+
key?: string;
|
|
211
|
+
path?: string[];
|
|
212
|
+
}) => string;
|
|
213
|
+
export declare const redactVoiceTraceEvent: <TEvent extends StoredVoiceTraceEvent = StoredVoiceTraceEvent>(event: TEvent, options?: VoiceTraceRedactionConfig) => TEvent;
|
|
214
|
+
export declare const redactVoiceTraceEvents: <TEvent extends StoredVoiceTraceEvent = StoredVoiceTraceEvent>(events: TEvent[], options?: VoiceTraceRedactionConfig) => TEvent[];
|
|
215
|
+
export declare const summarizeVoiceTrace: (events: StoredVoiceTraceEvent[]) => VoiceTraceSummary;
|
|
216
|
+
export declare const evaluateVoiceTrace: (events: StoredVoiceTraceEvent[], options?: VoiceTraceEvaluationOptions) => VoiceTraceEvaluation;
|
|
217
|
+
export declare const renderVoiceTraceMarkdown: (events: StoredVoiceTraceEvent[], options?: {
|
|
218
|
+
title?: string;
|
|
219
|
+
evaluation?: VoiceTraceEvaluationOptions;
|
|
220
|
+
redact?: VoiceTraceRedactionConfig;
|
|
221
|
+
}) => string;
|
|
222
|
+
export declare const renderVoiceTraceHTML: (events: StoredVoiceTraceEvent[], options?: {
|
|
223
|
+
title?: string;
|
|
224
|
+
evaluation?: VoiceTraceEvaluationOptions;
|
|
225
|
+
redact?: VoiceTraceRedactionConfig;
|
|
226
|
+
}) => string;
|
|
227
|
+
export declare const buildVoiceTraceReplay: (events: StoredVoiceTraceEvent[], options?: {
|
|
228
|
+
evaluation?: VoiceTraceEvaluationOptions;
|
|
229
|
+
redact?: VoiceTraceRedactionConfig;
|
|
230
|
+
title?: string;
|
|
231
|
+
}) => {
|
|
232
|
+
evaluation: VoiceTraceEvaluation;
|
|
233
|
+
html: string;
|
|
234
|
+
markdown: string;
|
|
235
|
+
summary: VoiceTraceSummary;
|
|
236
|
+
};
|