@absolutejs/voice 0.0.22-beta.7 → 0.0.22-beta.70
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 +205 -0
- package/dist/agent.d.ts +2 -0
- package/dist/angular/index.d.ts +6 -0
- package/dist/angular/index.js +833 -43
- package/dist/angular/voice-app-kit-status.service.d.ts +12 -0
- package/dist/angular/voice-ops-status.component.d.ts +15 -0
- package/dist/angular/voice-provider-capabilities.service.d.ts +12 -0
- package/dist/angular/voice-provider-status.service.d.ts +12 -0
- package/dist/angular/voice-routing-status.service.d.ts +11 -0
- package/dist/angular/voice-stream.service.d.ts +2 -0
- package/dist/angular/voice-turn-quality.service.d.ts +12 -0
- package/dist/angular/voice-workflow-status.service.d.ts +12 -0
- package/dist/appKit.d.ts +94 -0
- package/dist/assistantHealth.d.ts +81 -0
- package/dist/client/actions.d.ts +22 -0
- package/dist/client/appKitStatus.d.ts +19 -0
- package/dist/client/connection.d.ts +3 -0
- package/dist/client/htmxBootstrap.js +44 -2
- package/dist/client/index.d.ts +26 -0
- package/dist/client/index.js +1290 -2
- package/dist/client/opsStatusWidget.d.ts +40 -0
- package/dist/client/providerCapabilities.d.ts +19 -0
- package/dist/client/providerCapabilitiesWidget.d.ts +32 -0
- package/dist/client/providerSimulationControls.d.ts +33 -0
- package/dist/client/providerSimulationControlsWidget.d.ts +20 -0
- package/dist/client/providerStatus.d.ts +19 -0
- package/dist/client/providerStatusWidget.d.ts +32 -0
- package/dist/client/routingStatus.d.ts +19 -0
- package/dist/client/routingStatusWidget.d.ts +28 -0
- package/dist/client/turnQuality.d.ts +19 -0
- package/dist/client/turnQualityWidget.d.ts +32 -0
- package/dist/client/workflowStatus.d.ts +19 -0
- package/dist/diagnosticsRoutes.d.ts +44 -0
- package/dist/evalRoutes.d.ts +213 -0
- package/dist/handoff.d.ts +54 -0
- package/dist/handoffHealth.d.ts +94 -0
- package/dist/index.d.ts +44 -4
- package/dist/index.js +5602 -175
- package/dist/modelAdapters.d.ts +75 -0
- package/dist/opsConsoleRoutes.d.ts +77 -0
- package/dist/opsWebhook.d.ts +126 -0
- package/dist/outcomeContract.d.ts +112 -0
- package/dist/providerAdapters.d.ts +48 -0
- package/dist/providerCapabilities.d.ts +92 -0
- package/dist/providerHealth.d.ts +79 -0
- package/dist/qualityRoutes.d.ts +76 -0
- package/dist/queue.d.ts +52 -0
- package/dist/react/VoiceOpsStatus.d.ts +6 -0
- package/dist/react/VoiceProviderCapabilities.d.ts +6 -0
- package/dist/react/VoiceProviderSimulationControls.d.ts +5 -0
- package/dist/react/VoiceProviderStatus.d.ts +6 -0
- package/dist/react/VoiceRoutingStatus.d.ts +6 -0
- package/dist/react/VoiceTurnQuality.d.ts +6 -0
- package/dist/react/index.d.ts +13 -0
- package/dist/react/index.js +1884 -11
- package/dist/react/useVoiceAppKitStatus.d.ts +8 -0
- package/dist/react/useVoiceController.d.ts +2 -0
- package/dist/react/useVoiceProviderCapabilities.d.ts +8 -0
- package/dist/react/useVoiceProviderSimulationControls.d.ts +10 -0
- package/dist/react/useVoiceProviderStatus.d.ts +8 -0
- package/dist/react/useVoiceRoutingStatus.d.ts +8 -0
- package/dist/react/useVoiceStream.d.ts +2 -0
- package/dist/react/useVoiceTurnQuality.d.ts +8 -0
- package/dist/react/useVoiceWorkflowStatus.d.ts +8 -0
- package/dist/resilienceRoutes.d.ts +117 -0
- package/dist/sessionReplay.d.ts +175 -0
- package/dist/svelte/createVoiceAppKitStatus.d.ts +8 -0
- package/dist/svelte/createVoiceOpsStatus.d.ts +9 -0
- package/dist/svelte/createVoiceProviderCapabilities.d.ts +10 -0
- package/dist/svelte/createVoiceProviderSimulationControls.d.ts +11 -0
- package/dist/svelte/createVoiceProviderStatus.d.ts +10 -0
- package/dist/svelte/createVoiceRoutingStatus.d.ts +10 -0
- package/dist/svelte/createVoiceTurnQuality.d.ts +10 -0
- package/dist/svelte/createVoiceWorkflowStatus.d.ts +8 -0
- package/dist/svelte/index.d.ts +8 -0
- package/dist/svelte/index.js +1330 -3
- package/dist/telephonyOutcome.d.ts +143 -0
- package/dist/testing/index.d.ts +2 -0
- package/dist/testing/index.js +1537 -7
- package/dist/testing/ioProviderSimulator.d.ts +41 -0
- package/dist/testing/providerSimulator.d.ts +44 -0
- package/dist/toolContract.d.ts +130 -0
- package/dist/toolRuntime.d.ts +50 -0
- package/dist/trace.d.ts +1 -1
- package/dist/turnQuality.d.ts +94 -0
- package/dist/types.d.ts +84 -2
- package/dist/vue/VoiceOpsStatus.d.ts +30 -0
- package/dist/vue/VoiceProviderCapabilities.d.ts +51 -0
- package/dist/vue/VoiceProviderSimulationControls.d.ts +88 -0
- package/dist/vue/VoiceProviderStatus.d.ts +51 -0
- package/dist/vue/VoiceRoutingStatus.d.ts +51 -0
- package/dist/vue/VoiceTurnQuality.d.ts +51 -0
- package/dist/vue/index.d.ts +13 -0
- package/dist/vue/index.js +1934 -25
- package/dist/vue/useVoiceAppKitStatus.d.ts +9 -0
- package/dist/vue/useVoiceProviderCapabilities.d.ts +9 -0
- package/dist/vue/useVoiceProviderSimulationControls.d.ts +24 -0
- package/dist/vue/useVoiceProviderStatus.d.ts +9 -0
- package/dist/vue/useVoiceRoutingStatus.d.ts +8 -0
- package/dist/vue/useVoiceStream.d.ts +2 -0
- package/dist/vue/useVoiceTurnQuality.d.ts +9 -0
- package/dist/vue/useVoiceWorkflowStatus.d.ts +9 -0
- package/dist/workflowContract.d.ts +91 -0
- package/package.json +1 -1
package/dist/modelAdapters.d.ts
CHANGED
|
@@ -29,11 +29,86 @@ export type GeminiVoiceAssistantModelOptions = {
|
|
|
29
29
|
baseUrl?: string;
|
|
30
30
|
fetch?: typeof fetch;
|
|
31
31
|
maxOutputTokens?: number;
|
|
32
|
+
maxRetries?: number;
|
|
32
33
|
model?: string;
|
|
33
34
|
onUsage?: (usage: Record<string, unknown>) => Promise<void> | void;
|
|
34
35
|
temperature?: number;
|
|
35
36
|
};
|
|
37
|
+
export type VoiceProviderRouterEvent<TProvider extends string = string> = {
|
|
38
|
+
at: number;
|
|
39
|
+
attempt: number;
|
|
40
|
+
elapsedMs: number;
|
|
41
|
+
error?: string;
|
|
42
|
+
fallbackProvider?: TProvider;
|
|
43
|
+
latencyBudgetMs?: number;
|
|
44
|
+
provider: TProvider;
|
|
45
|
+
providerHealth?: VoiceProviderRouterProviderHealth<TProvider>;
|
|
46
|
+
rateLimited?: boolean;
|
|
47
|
+
recovered?: boolean;
|
|
48
|
+
selectedProvider: TProvider;
|
|
49
|
+
suppressionRemainingMs?: number;
|
|
50
|
+
suppressedUntil?: number;
|
|
51
|
+
status: 'error' | 'fallback' | 'success';
|
|
52
|
+
timedOut?: boolean;
|
|
53
|
+
};
|
|
54
|
+
export type VoiceProviderRouterFallbackMode = 'never' | 'provider-error' | 'rate-limit';
|
|
55
|
+
export type VoiceProviderRouterStrategy = 'balanced' | 'ordered' | 'prefer-cheapest' | 'prefer-fastest' | 'prefer-selected' | 'quality-first';
|
|
56
|
+
export type VoiceProviderRouterPolicyPreset = 'balanced' | 'cost-cap' | 'cost-first' | 'latency-first' | 'quality-first';
|
|
57
|
+
export type VoiceProviderRouterPolicyWeights = {
|
|
58
|
+
cost?: number;
|
|
59
|
+
latencyMs?: number;
|
|
60
|
+
priority?: number;
|
|
61
|
+
quality?: number;
|
|
62
|
+
};
|
|
63
|
+
export type VoiceProviderRouterPolicy<TContext = unknown, TSession extends VoiceSessionRecord = VoiceSessionRecord, TProvider extends string = string> = VoiceProviderRouterStrategy | VoiceProviderRouterPolicyPreset | {
|
|
64
|
+
allowProviders?: readonly TProvider[] | ((input: VoiceAgentModelInput<TContext, TSession>) => readonly TProvider[] | Promise<readonly TProvider[]>);
|
|
65
|
+
fallbackMode?: VoiceProviderRouterFallbackMode;
|
|
66
|
+
maxCost?: number;
|
|
67
|
+
maxLatencyMs?: number;
|
|
68
|
+
minQuality?: number;
|
|
69
|
+
scoreProvider?: (provider: TProvider, profile: VoiceProviderRouterProviderProfile | undefined) => number;
|
|
70
|
+
strategy?: VoiceProviderRouterStrategy;
|
|
71
|
+
weights?: VoiceProviderRouterPolicyWeights;
|
|
72
|
+
};
|
|
73
|
+
export type VoiceProviderRouterProviderProfile = {
|
|
74
|
+
cost?: number;
|
|
75
|
+
latencyMs?: number;
|
|
76
|
+
priority?: number;
|
|
77
|
+
quality?: number;
|
|
78
|
+
timeoutMs?: number;
|
|
79
|
+
};
|
|
80
|
+
export declare const resolveVoiceProviderRoutingPolicyPreset: <TContext = unknown, TSession extends VoiceSessionRecord = VoiceSessionRecord, TProvider extends string = string>(preset: VoiceProviderRouterPolicyPreset, options?: Omit<Extract<VoiceProviderRouterPolicy<TContext, TSession, TProvider>, Record<string, unknown>>, "strategy">) => Extract<VoiceProviderRouterPolicy<TContext, TSession, TProvider>, Record<string, unknown>>;
|
|
81
|
+
export type VoiceProviderRouterHealthOptions = {
|
|
82
|
+
cooldownMs?: number;
|
|
83
|
+
failureThreshold?: number;
|
|
84
|
+
now?: () => number;
|
|
85
|
+
rateLimitCooldownMs?: number;
|
|
86
|
+
};
|
|
87
|
+
export type VoiceProviderRouterProviderHealth<TProvider extends string = string> = {
|
|
88
|
+
consecutiveFailures: number;
|
|
89
|
+
lastFailureAt?: number;
|
|
90
|
+
lastRateLimitedAt?: number;
|
|
91
|
+
provider: TProvider;
|
|
92
|
+
status: 'healthy' | 'suppressed';
|
|
93
|
+
suppressedUntil?: number;
|
|
94
|
+
};
|
|
95
|
+
export type VoiceProviderRouterOptions<TContext = unknown, TSession extends VoiceSessionRecord = VoiceSessionRecord, TResult = unknown, TProvider extends string = string> = {
|
|
96
|
+
allowProviders?: readonly TProvider[] | ((input: VoiceAgentModelInput<TContext, TSession>) => readonly TProvider[] | Promise<readonly TProvider[]>);
|
|
97
|
+
fallback?: TProvider[] | ((input: VoiceAgentModelInput<TContext, TSession>) => readonly TProvider[] | Promise<readonly TProvider[]>);
|
|
98
|
+
fallbackMode?: VoiceProviderRouterFallbackMode;
|
|
99
|
+
isProviderError?: (error: unknown, provider: TProvider) => boolean;
|
|
100
|
+
isRateLimitError?: (error: unknown, provider: TProvider) => boolean;
|
|
101
|
+
isTimeoutError?: (error: unknown, provider: TProvider) => boolean;
|
|
102
|
+
onProviderEvent?: (event: VoiceProviderRouterEvent<TProvider>, input: VoiceAgentModelInput<TContext, TSession>) => Promise<void> | void;
|
|
103
|
+
policy?: VoiceProviderRouterPolicy<TContext, TSession, TProvider>;
|
|
104
|
+
providerHealth?: boolean | VoiceProviderRouterHealthOptions;
|
|
105
|
+
providerProfiles?: Partial<Record<TProvider, VoiceProviderRouterProviderProfile>>;
|
|
106
|
+
timeoutMs?: number;
|
|
107
|
+
providers: Partial<Record<TProvider, VoiceAgentModel<TContext, TSession, TResult>>>;
|
|
108
|
+
selectProvider?: (input: VoiceAgentModelInput<TContext, TSession>) => TProvider | undefined | Promise<TProvider | undefined>;
|
|
109
|
+
};
|
|
36
110
|
export declare const createJSONVoiceAssistantModel: <TContext = unknown, TSession extends VoiceSessionRecord = VoiceSessionRecord, TResult = unknown>(options: VoiceJSONAssistantModelOptions<TContext, TSession, TResult>) => VoiceAgentModel<TContext, TSession, TResult>;
|
|
111
|
+
export declare const createVoiceProviderRouter: <TContext = unknown, TSession extends VoiceSessionRecord = VoiceSessionRecord, TResult = unknown, TProvider extends string = string>(options: VoiceProviderRouterOptions<TContext, TSession, TResult, TProvider>) => VoiceAgentModel<TContext, TSession, TResult>;
|
|
37
112
|
export declare const createOpenAIVoiceAssistantModel: <TContext = unknown, TSession extends VoiceSessionRecord = VoiceSessionRecord, TResult = unknown>(options: OpenAIVoiceAssistantModelOptions) => VoiceAgentModel<TContext, TSession, TResult>;
|
|
38
113
|
export declare const createAnthropicVoiceAssistantModel: <TContext = unknown, TSession extends VoiceSessionRecord = VoiceSessionRecord, TResult = unknown>(options: AnthropicVoiceAssistantModelOptions) => VoiceAgentModel<TContext, TSession, TResult>;
|
|
39
114
|
export declare const createGeminiVoiceAssistantModel: <TContext = unknown, TSession extends VoiceSessionRecord = VoiceSessionRecord, TResult = unknown>(options: GeminiVoiceAssistantModelOptions) => VoiceAgentModel<TContext, TSession, TResult>;
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
import { Elysia } from 'elysia';
|
|
2
|
+
import { type VoiceQualityReport } from './qualityRoutes';
|
|
3
|
+
import { type VoiceRoutingEvent } from './resilienceRoutes';
|
|
4
|
+
import { type VoiceSessionListItem } from './sessionReplay';
|
|
5
|
+
import { summarizeVoiceTrace, type VoiceTraceEventStore } from './trace';
|
|
6
|
+
export type VoiceOpsConsoleLink = {
|
|
7
|
+
description?: string;
|
|
8
|
+
href: string;
|
|
9
|
+
label: string;
|
|
10
|
+
statusHref?: string;
|
|
11
|
+
};
|
|
12
|
+
export type VoiceOpsConsoleReport = {
|
|
13
|
+
checkedAt: number;
|
|
14
|
+
eventCount: number;
|
|
15
|
+
handoffs: {
|
|
16
|
+
failed: number;
|
|
17
|
+
total: number;
|
|
18
|
+
};
|
|
19
|
+
links: VoiceOpsConsoleLink[];
|
|
20
|
+
providers: {
|
|
21
|
+
degraded: number;
|
|
22
|
+
healthy: number;
|
|
23
|
+
total: number;
|
|
24
|
+
};
|
|
25
|
+
quality: VoiceQualityReport;
|
|
26
|
+
recentRoutingEvents: VoiceRoutingEvent[];
|
|
27
|
+
recentSessions: VoiceSessionListItem[];
|
|
28
|
+
sessions: {
|
|
29
|
+
failed: number;
|
|
30
|
+
healthy: number;
|
|
31
|
+
total: number;
|
|
32
|
+
};
|
|
33
|
+
trace: ReturnType<typeof summarizeVoiceTrace>;
|
|
34
|
+
};
|
|
35
|
+
export type VoiceOpsConsoleRoutesOptions = {
|
|
36
|
+
headers?: HeadersInit;
|
|
37
|
+
links?: VoiceOpsConsoleLink[];
|
|
38
|
+
llmProviders?: readonly string[];
|
|
39
|
+
name?: string;
|
|
40
|
+
path?: string;
|
|
41
|
+
store: VoiceTraceEventStore;
|
|
42
|
+
sttProviders?: readonly string[];
|
|
43
|
+
title?: string;
|
|
44
|
+
ttsProviders?: readonly string[];
|
|
45
|
+
};
|
|
46
|
+
export declare const buildVoiceOpsConsoleReport: (options: VoiceOpsConsoleRoutesOptions) => Promise<VoiceOpsConsoleReport>;
|
|
47
|
+
export declare const renderVoiceOpsConsoleHTML: (report: VoiceOpsConsoleReport, options?: {
|
|
48
|
+
title?: string;
|
|
49
|
+
}) => string;
|
|
50
|
+
export declare const createVoiceOpsConsoleRoutes: (options: VoiceOpsConsoleRoutesOptions) => Elysia<"", {
|
|
51
|
+
decorator: {};
|
|
52
|
+
store: {};
|
|
53
|
+
derive: {};
|
|
54
|
+
resolve: {};
|
|
55
|
+
}, {
|
|
56
|
+
typebox: {};
|
|
57
|
+
error: {};
|
|
58
|
+
}, {
|
|
59
|
+
schema: {};
|
|
60
|
+
standaloneSchema: {};
|
|
61
|
+
macro: {};
|
|
62
|
+
macroFn: {};
|
|
63
|
+
parser: {};
|
|
64
|
+
response: {};
|
|
65
|
+
}, {}, {
|
|
66
|
+
derive: {};
|
|
67
|
+
resolve: {};
|
|
68
|
+
schema: {};
|
|
69
|
+
standaloneSchema: {};
|
|
70
|
+
response: {};
|
|
71
|
+
}, {
|
|
72
|
+
derive: {};
|
|
73
|
+
resolve: {};
|
|
74
|
+
schema: {};
|
|
75
|
+
standaloneSchema: {};
|
|
76
|
+
response: {};
|
|
77
|
+
}>;
|
|
@@ -0,0 +1,126 @@
|
|
|
1
|
+
import { Elysia } from 'elysia';
|
|
2
|
+
import type { StoredVoiceIntegrationEvent, VoiceIntegrationEventType } from './ops';
|
|
3
|
+
import type { VoiceIntegrationHTTPSinkOptions, VoiceIntegrationSink } from './opsSinks';
|
|
4
|
+
type MaybePromise<T> = T | Promise<T>;
|
|
5
|
+
export type VoiceOpsWebhookLinkResolver = string | ((input: {
|
|
6
|
+
event: StoredVoiceIntegrationEvent;
|
|
7
|
+
}) => MaybePromise<string | undefined>);
|
|
8
|
+
export type VoiceOpsWebhookEntity = {
|
|
9
|
+
disposition?: string;
|
|
10
|
+
outcome?: string;
|
|
11
|
+
priority?: string;
|
|
12
|
+
queue?: string;
|
|
13
|
+
reviewId?: string;
|
|
14
|
+
scenarioId?: string;
|
|
15
|
+
sessionId?: string;
|
|
16
|
+
status?: string;
|
|
17
|
+
target?: string;
|
|
18
|
+
taskId?: string;
|
|
19
|
+
};
|
|
20
|
+
export type VoiceOpsWebhookEnvelope = {
|
|
21
|
+
entity: VoiceOpsWebhookEntity;
|
|
22
|
+
event: {
|
|
23
|
+
createdAt: number;
|
|
24
|
+
id: string;
|
|
25
|
+
payload: Record<string, unknown>;
|
|
26
|
+
type: VoiceIntegrationEventType;
|
|
27
|
+
};
|
|
28
|
+
links?: {
|
|
29
|
+
event?: string;
|
|
30
|
+
replay?: string;
|
|
31
|
+
review?: string;
|
|
32
|
+
task?: string;
|
|
33
|
+
};
|
|
34
|
+
schemaVersion: 1;
|
|
35
|
+
source: 'absolutejs-voice';
|
|
36
|
+
};
|
|
37
|
+
export type VoiceOpsWebhookSinkOptions = Omit<VoiceIntegrationHTTPSinkOptions<VoiceOpsWebhookEnvelope>, 'body'> & {
|
|
38
|
+
baseUrl?: string;
|
|
39
|
+
eventHref?: VoiceOpsWebhookLinkResolver;
|
|
40
|
+
replayHref?: VoiceOpsWebhookLinkResolver;
|
|
41
|
+
reviewHref?: VoiceOpsWebhookLinkResolver;
|
|
42
|
+
taskHref?: VoiceOpsWebhookLinkResolver;
|
|
43
|
+
};
|
|
44
|
+
export type VoiceOpsWebhookVerificationResult = {
|
|
45
|
+
ok: true;
|
|
46
|
+
} | {
|
|
47
|
+
ok: false;
|
|
48
|
+
reason: 'invalid-signature' | 'missing-secret' | 'missing-signature' | 'missing-timestamp' | 'stale-timestamp' | 'unsupported-algorithm';
|
|
49
|
+
};
|
|
50
|
+
export type VoiceOpsWebhookReceiverRoutesOptions = {
|
|
51
|
+
onEnvelope?: (input: {
|
|
52
|
+
envelope: VoiceOpsWebhookEnvelope;
|
|
53
|
+
request: Request;
|
|
54
|
+
}) => MaybePromise<void>;
|
|
55
|
+
path?: string;
|
|
56
|
+
signingSecret?: string;
|
|
57
|
+
toleranceMs?: number;
|
|
58
|
+
};
|
|
59
|
+
export declare const createVoiceOpsWebhookEnvelope: (input: {
|
|
60
|
+
baseUrl?: string;
|
|
61
|
+
event: StoredVoiceIntegrationEvent;
|
|
62
|
+
eventHref?: VoiceOpsWebhookLinkResolver;
|
|
63
|
+
replayHref?: VoiceOpsWebhookLinkResolver;
|
|
64
|
+
reviewHref?: VoiceOpsWebhookLinkResolver;
|
|
65
|
+
taskHref?: VoiceOpsWebhookLinkResolver;
|
|
66
|
+
}) => Promise<VoiceOpsWebhookEnvelope>;
|
|
67
|
+
export declare const createVoiceOpsWebhookSink: (options: VoiceOpsWebhookSinkOptions) => VoiceIntegrationSink;
|
|
68
|
+
export declare const verifyVoiceOpsWebhookSignature: (input: {
|
|
69
|
+
body: string;
|
|
70
|
+
now?: number;
|
|
71
|
+
secret?: string;
|
|
72
|
+
signature?: string | null;
|
|
73
|
+
timestamp?: string | null;
|
|
74
|
+
toleranceMs?: number;
|
|
75
|
+
}) => Promise<VoiceOpsWebhookVerificationResult>;
|
|
76
|
+
export declare const createVoiceOpsWebhookReceiverRoutes: (options?: VoiceOpsWebhookReceiverRoutesOptions) => Elysia<"", {
|
|
77
|
+
decorator: {};
|
|
78
|
+
store: {};
|
|
79
|
+
derive: {};
|
|
80
|
+
resolve: {};
|
|
81
|
+
}, {
|
|
82
|
+
typebox: {};
|
|
83
|
+
error: {};
|
|
84
|
+
}, {
|
|
85
|
+
schema: {};
|
|
86
|
+
standaloneSchema: {};
|
|
87
|
+
macro: {};
|
|
88
|
+
macroFn: {};
|
|
89
|
+
parser: {};
|
|
90
|
+
response: {};
|
|
91
|
+
}, {
|
|
92
|
+
[x: string]: {
|
|
93
|
+
post: {
|
|
94
|
+
body: unknown;
|
|
95
|
+
params: {};
|
|
96
|
+
query: unknown;
|
|
97
|
+
headers: unknown;
|
|
98
|
+
response: {
|
|
99
|
+
200: {
|
|
100
|
+
ok: boolean;
|
|
101
|
+
reason: "invalid-signature" | "missing-secret" | "missing-signature" | "missing-timestamp" | "stale-timestamp" | "unsupported-algorithm";
|
|
102
|
+
eventId?: undefined;
|
|
103
|
+
type?: undefined;
|
|
104
|
+
} | {
|
|
105
|
+
eventId: string;
|
|
106
|
+
ok: boolean;
|
|
107
|
+
type: VoiceIntegrationEventType;
|
|
108
|
+
reason?: undefined;
|
|
109
|
+
};
|
|
110
|
+
};
|
|
111
|
+
};
|
|
112
|
+
};
|
|
113
|
+
}, {
|
|
114
|
+
derive: {};
|
|
115
|
+
resolve: {};
|
|
116
|
+
schema: {};
|
|
117
|
+
standaloneSchema: {};
|
|
118
|
+
response: {};
|
|
119
|
+
}, {
|
|
120
|
+
derive: {};
|
|
121
|
+
resolve: {};
|
|
122
|
+
schema: {};
|
|
123
|
+
standaloneSchema: {};
|
|
124
|
+
response: {};
|
|
125
|
+
}>;
|
|
126
|
+
export {};
|
|
@@ -0,0 +1,112 @@
|
|
|
1
|
+
import { Elysia } from 'elysia';
|
|
2
|
+
import type { StoredVoiceHandoffDelivery, VoiceCallDisposition, VoiceHandoffAction, VoiceHandoffDeliveryStore, VoiceSessionRecord, VoiceSessionStore } from './types';
|
|
3
|
+
import type { StoredVoiceIntegrationEvent, StoredVoiceOpsTask, VoiceIntegrationEventType } from './ops';
|
|
4
|
+
import type { StoredVoiceCallReviewArtifact } from './testing/review';
|
|
5
|
+
export type VoiceOutcomeContractStatus = 'pass' | 'fail';
|
|
6
|
+
export type VoiceOutcomeContractDefinition = {
|
|
7
|
+
description?: string;
|
|
8
|
+
expectedDisposition?: VoiceCallDisposition;
|
|
9
|
+
id: string;
|
|
10
|
+
label?: string;
|
|
11
|
+
minSessions?: number;
|
|
12
|
+
minTasks?: number;
|
|
13
|
+
requireHandoffActions?: VoiceHandoffAction[];
|
|
14
|
+
requireIntegrationEvents?: VoiceIntegrationEventType[];
|
|
15
|
+
requireReview?: boolean;
|
|
16
|
+
requireTask?: boolean;
|
|
17
|
+
scenarioId?: string;
|
|
18
|
+
};
|
|
19
|
+
export type VoiceOutcomeContractIssue = {
|
|
20
|
+
code: string;
|
|
21
|
+
message: string;
|
|
22
|
+
};
|
|
23
|
+
export type VoiceOutcomeContractReport = {
|
|
24
|
+
contractId: string;
|
|
25
|
+
description?: string;
|
|
26
|
+
issues: VoiceOutcomeContractIssue[];
|
|
27
|
+
label?: string;
|
|
28
|
+
matched: {
|
|
29
|
+
handoffs: number;
|
|
30
|
+
integrationEvents: number;
|
|
31
|
+
reviews: number;
|
|
32
|
+
sessions: number;
|
|
33
|
+
tasks: number;
|
|
34
|
+
};
|
|
35
|
+
pass: boolean;
|
|
36
|
+
};
|
|
37
|
+
export type VoiceOutcomeContractSuiteReport = {
|
|
38
|
+
checkedAt: number;
|
|
39
|
+
contracts: VoiceOutcomeContractReport[];
|
|
40
|
+
failed: number;
|
|
41
|
+
passed: number;
|
|
42
|
+
status: VoiceOutcomeContractStatus;
|
|
43
|
+
total: number;
|
|
44
|
+
};
|
|
45
|
+
type ListStore<T> = {
|
|
46
|
+
list: () => Promise<T[]> | T[];
|
|
47
|
+
};
|
|
48
|
+
export type VoiceOutcomeContractOptions<TSession extends VoiceSessionRecord = VoiceSessionRecord> = {
|
|
49
|
+
contracts: VoiceOutcomeContractDefinition[];
|
|
50
|
+
events?: StoredVoiceIntegrationEvent[] | ListStore<StoredVoiceIntegrationEvent>;
|
|
51
|
+
handoffs?: StoredVoiceHandoffDelivery[] | VoiceHandoffDeliveryStore;
|
|
52
|
+
reviews?: StoredVoiceCallReviewArtifact[] | ListStore<StoredVoiceCallReviewArtifact>;
|
|
53
|
+
sessions?: TSession[] | VoiceSessionStore<TSession>;
|
|
54
|
+
tasks?: StoredVoiceOpsTask[] | ListStore<StoredVoiceOpsTask>;
|
|
55
|
+
};
|
|
56
|
+
export type VoiceOutcomeContractHTMLHandlerOptions<TSession extends VoiceSessionRecord = VoiceSessionRecord> = VoiceOutcomeContractOptions<TSession> & {
|
|
57
|
+
headers?: HeadersInit;
|
|
58
|
+
render?: (report: VoiceOutcomeContractSuiteReport) => string | Promise<string>;
|
|
59
|
+
title?: string;
|
|
60
|
+
};
|
|
61
|
+
export type VoiceOutcomeContractRoutesOptions<TSession extends VoiceSessionRecord = VoiceSessionRecord> = VoiceOutcomeContractHTMLHandlerOptions<TSession> & {
|
|
62
|
+
htmlPath?: false | string;
|
|
63
|
+
name?: string;
|
|
64
|
+
path?: string;
|
|
65
|
+
};
|
|
66
|
+
export declare const runVoiceOutcomeContractSuite: <TSession extends VoiceSessionRecord = VoiceSessionRecord>(options: VoiceOutcomeContractOptions<TSession>) => Promise<VoiceOutcomeContractSuiteReport>;
|
|
67
|
+
export declare const renderVoiceOutcomeContractHTML: (report: VoiceOutcomeContractSuiteReport, options?: {
|
|
68
|
+
title?: string;
|
|
69
|
+
}) => string;
|
|
70
|
+
export declare const createVoiceOutcomeContractJSONHandler: <TSession extends VoiceSessionRecord = VoiceSessionRecord>(options: VoiceOutcomeContractOptions<TSession>) => () => Promise<VoiceOutcomeContractSuiteReport>;
|
|
71
|
+
export declare const createVoiceOutcomeContractHTMLHandler: <TSession extends VoiceSessionRecord = VoiceSessionRecord>(options: VoiceOutcomeContractHTMLHandlerOptions<TSession>) => () => Promise<Response>;
|
|
72
|
+
export declare const createVoiceOutcomeContractRoutes: <TSession extends VoiceSessionRecord = VoiceSessionRecord>(options: VoiceOutcomeContractRoutesOptions<TSession>) => Elysia<"", {
|
|
73
|
+
decorator: {};
|
|
74
|
+
store: {};
|
|
75
|
+
derive: {};
|
|
76
|
+
resolve: {};
|
|
77
|
+
}, {
|
|
78
|
+
typebox: {};
|
|
79
|
+
error: {};
|
|
80
|
+
}, {
|
|
81
|
+
schema: {};
|
|
82
|
+
standaloneSchema: {};
|
|
83
|
+
macro: {};
|
|
84
|
+
macroFn: {};
|
|
85
|
+
parser: {};
|
|
86
|
+
response: {};
|
|
87
|
+
}, {
|
|
88
|
+
[x: string]: {
|
|
89
|
+
get: {
|
|
90
|
+
body: unknown;
|
|
91
|
+
params: {};
|
|
92
|
+
query: unknown;
|
|
93
|
+
headers: unknown;
|
|
94
|
+
response: {
|
|
95
|
+
200: VoiceOutcomeContractSuiteReport;
|
|
96
|
+
};
|
|
97
|
+
};
|
|
98
|
+
};
|
|
99
|
+
}, {
|
|
100
|
+
derive: {};
|
|
101
|
+
resolve: {};
|
|
102
|
+
schema: {};
|
|
103
|
+
standaloneSchema: {};
|
|
104
|
+
response: {};
|
|
105
|
+
}, {
|
|
106
|
+
derive: {};
|
|
107
|
+
resolve: {};
|
|
108
|
+
schema: {};
|
|
109
|
+
standaloneSchema: {};
|
|
110
|
+
response: {};
|
|
111
|
+
}>;
|
|
112
|
+
export {};
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
import type { STTAdapter, STTAdapterOpenOptions, TTSAdapter, TTSAdapterOpenOptions } from './types';
|
|
2
|
+
import type { VoiceProviderRouterHealthOptions, VoiceProviderRouterProviderHealth, VoiceProviderRouterProviderProfile, VoiceProviderRouterPolicyPreset, VoiceProviderRouterPolicyWeights, VoiceProviderRouterStrategy } from './modelAdapters';
|
|
3
|
+
type MaybePromise<T> = T | Promise<T>;
|
|
4
|
+
type VoiceIOProviderKind = 'stt' | 'tts';
|
|
5
|
+
type VoiceIOProviderStatus = 'error' | 'fallback' | 'success';
|
|
6
|
+
export type VoiceIOProviderRouterEvent<TProvider extends string = string> = {
|
|
7
|
+
at: number;
|
|
8
|
+
attempt: number;
|
|
9
|
+
elapsedMs: number;
|
|
10
|
+
error?: string;
|
|
11
|
+
fallbackProvider?: TProvider;
|
|
12
|
+
kind: VoiceIOProviderKind;
|
|
13
|
+
latencyBudgetMs?: number;
|
|
14
|
+
operation: 'open' | 'send';
|
|
15
|
+
provider: TProvider;
|
|
16
|
+
providerHealth?: VoiceProviderRouterProviderHealth<TProvider>;
|
|
17
|
+
selectedProvider: TProvider;
|
|
18
|
+
status: VoiceIOProviderStatus;
|
|
19
|
+
suppressionRemainingMs?: number;
|
|
20
|
+
suppressedUntil?: number;
|
|
21
|
+
timedOut?: boolean;
|
|
22
|
+
};
|
|
23
|
+
export type VoiceIOProviderRouterPolicyConfig<TOpenOptions = unknown, TProvider extends string = string> = {
|
|
24
|
+
allowProviders?: readonly TProvider[] | ((input: TOpenOptions) => MaybePromise<readonly TProvider[]>);
|
|
25
|
+
maxCost?: number;
|
|
26
|
+
maxLatencyMs?: number;
|
|
27
|
+
minQuality?: number;
|
|
28
|
+
scoreProvider?: (provider: TProvider, profile: VoiceProviderRouterProviderProfile | undefined) => number;
|
|
29
|
+
strategy?: VoiceProviderRouterStrategy;
|
|
30
|
+
weights?: VoiceProviderRouterPolicyWeights;
|
|
31
|
+
};
|
|
32
|
+
export type VoiceIOProviderRouterPolicy<TOpenOptions = unknown, TProvider extends string = string> = VoiceProviderRouterStrategy | VoiceProviderRouterPolicyPreset | VoiceIOProviderRouterPolicyConfig<TOpenOptions, TProvider>;
|
|
33
|
+
export type VoiceIOProviderRouterOptions<TProvider extends string, TAdapter, TOpenOptions> = {
|
|
34
|
+
adapters: Partial<Record<TProvider, TAdapter>>;
|
|
35
|
+
fallback?: readonly TProvider[] | ((input: TOpenOptions) => MaybePromise<readonly TProvider[]>);
|
|
36
|
+
isProviderError?: (error: unknown, provider: TProvider) => boolean;
|
|
37
|
+
onProviderEvent?: (event: VoiceIOProviderRouterEvent<TProvider>, input: TOpenOptions) => Promise<void> | void;
|
|
38
|
+
policy?: VoiceIOProviderRouterPolicy<TOpenOptions, TProvider>;
|
|
39
|
+
providerHealth?: boolean | VoiceProviderRouterHealthOptions;
|
|
40
|
+
providerProfiles?: Partial<Record<TProvider, VoiceProviderRouterProviderProfile>>;
|
|
41
|
+
selectProvider?: (input: TOpenOptions) => MaybePromise<TProvider | undefined>;
|
|
42
|
+
timeoutMs?: number;
|
|
43
|
+
};
|
|
44
|
+
export type VoiceSTTProviderRouterOptions<TProvider extends string = string, TOptions extends STTAdapterOpenOptions = STTAdapterOpenOptions> = VoiceIOProviderRouterOptions<TProvider, STTAdapter<TOptions>, TOptions>;
|
|
45
|
+
export type VoiceTTSProviderRouterOptions<TProvider extends string = string, TOptions extends TTSAdapterOpenOptions = TTSAdapterOpenOptions> = VoiceIOProviderRouterOptions<TProvider, TTSAdapter<TOptions>, TOptions>;
|
|
46
|
+
export declare const createVoiceSTTProviderRouter: <TProvider extends string = string, TOptions extends STTAdapterOpenOptions = STTAdapterOpenOptions>(options: VoiceSTTProviderRouterOptions<TProvider, TOptions>) => STTAdapter<TOptions>;
|
|
47
|
+
export declare const createVoiceTTSProviderRouter: <TProvider extends string = string, TOptions extends TTSAdapterOpenOptions = TTSAdapterOpenOptions>(options: VoiceTTSProviderRouterOptions<TProvider, TOptions>) => TTSAdapter<TOptions>;
|
|
48
|
+
export {};
|
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
import { Elysia } from 'elysia';
|
|
2
|
+
import { type VoiceProviderHealthStatus, type VoiceProviderHealthSummary, type VoiceProviderHealthSummaryOptions } from './providerHealth';
|
|
3
|
+
export type VoiceProviderCapabilityKind = 'llm' | 'stt' | 'tts' | 'custom';
|
|
4
|
+
export type VoiceProviderCapabilityDefinition<TProvider extends string = string> = {
|
|
5
|
+
configured?: boolean;
|
|
6
|
+
description?: string;
|
|
7
|
+
features?: string[];
|
|
8
|
+
kind: VoiceProviderCapabilityKind;
|
|
9
|
+
label?: string;
|
|
10
|
+
model?: string;
|
|
11
|
+
provider: TProvider;
|
|
12
|
+
selected?: boolean;
|
|
13
|
+
};
|
|
14
|
+
export type VoiceProviderCapabilitySummary<TProvider extends string = string> = VoiceProviderCapabilityDefinition<TProvider> & {
|
|
15
|
+
configured: boolean;
|
|
16
|
+
health?: VoiceProviderHealthSummary<TProvider>;
|
|
17
|
+
status: VoiceProviderHealthStatus | 'selected' | 'unconfigured';
|
|
18
|
+
};
|
|
19
|
+
export type VoiceProviderCapabilityReport<TProvider extends string = string> = {
|
|
20
|
+
capabilities: VoiceProviderCapabilitySummary<TProvider>[];
|
|
21
|
+
checkedAt: number;
|
|
22
|
+
configured: number;
|
|
23
|
+
selected: number;
|
|
24
|
+
total: number;
|
|
25
|
+
unconfigured: number;
|
|
26
|
+
};
|
|
27
|
+
export type VoiceProviderCapabilityOptions<TProvider extends string = string> = VoiceProviderHealthSummaryOptions<TProvider> & {
|
|
28
|
+
features?: Partial<Record<TProvider, string[]>>;
|
|
29
|
+
llmProviders?: readonly TProvider[];
|
|
30
|
+
models?: Partial<Record<TProvider, string>>;
|
|
31
|
+
providers?: readonly VoiceProviderCapabilityDefinition<TProvider>[];
|
|
32
|
+
selected?: Partial<Record<VoiceProviderCapabilityKind, TProvider>>;
|
|
33
|
+
sttProviders?: readonly TProvider[];
|
|
34
|
+
ttsProviders?: readonly TProvider[];
|
|
35
|
+
};
|
|
36
|
+
export type VoiceProviderCapabilityHandlerOptions<TProvider extends string = string> = VoiceProviderCapabilityOptions<TProvider>;
|
|
37
|
+
export type VoiceProviderCapabilityHTMLHandlerOptions<TProvider extends string = string> = VoiceProviderCapabilityHandlerOptions<TProvider> & {
|
|
38
|
+
headers?: HeadersInit;
|
|
39
|
+
render?: (report: VoiceProviderCapabilityReport<TProvider>) => string | Promise<string>;
|
|
40
|
+
title?: string;
|
|
41
|
+
};
|
|
42
|
+
export type VoiceProviderCapabilityRoutesOptions<TProvider extends string = string> = VoiceProviderCapabilityHTMLHandlerOptions<TProvider> & {
|
|
43
|
+
htmlPath?: false | string;
|
|
44
|
+
name?: string;
|
|
45
|
+
path?: string;
|
|
46
|
+
};
|
|
47
|
+
export declare const summarizeVoiceProviderCapabilities: <TProvider extends string = string>(options: VoiceProviderCapabilityOptions<TProvider>) => Promise<VoiceProviderCapabilityReport<TProvider>>;
|
|
48
|
+
export declare const renderVoiceProviderCapabilityHTML: <TProvider extends string = string>(report: VoiceProviderCapabilityReport<TProvider>, options?: {
|
|
49
|
+
title?: string;
|
|
50
|
+
}) => string;
|
|
51
|
+
export declare const createVoiceProviderCapabilityJSONHandler: <TProvider extends string = string>(options: VoiceProviderCapabilityHandlerOptions<TProvider>) => () => Promise<VoiceProviderCapabilityReport<TProvider>>;
|
|
52
|
+
export declare const createVoiceProviderCapabilityHTMLHandler: <TProvider extends string = string>(options: VoiceProviderCapabilityHTMLHandlerOptions<TProvider>) => () => Promise<Response>;
|
|
53
|
+
export declare const createVoiceProviderCapabilityRoutes: <TProvider extends string = string>(options: VoiceProviderCapabilityRoutesOptions<TProvider>) => Elysia<"", {
|
|
54
|
+
decorator: {};
|
|
55
|
+
store: {};
|
|
56
|
+
derive: {};
|
|
57
|
+
resolve: {};
|
|
58
|
+
}, {
|
|
59
|
+
typebox: {};
|
|
60
|
+
error: {};
|
|
61
|
+
}, {
|
|
62
|
+
schema: {};
|
|
63
|
+
standaloneSchema: {};
|
|
64
|
+
macro: {};
|
|
65
|
+
macroFn: {};
|
|
66
|
+
parser: {};
|
|
67
|
+
response: {};
|
|
68
|
+
}, {
|
|
69
|
+
[x: string]: {
|
|
70
|
+
get: {
|
|
71
|
+
body: unknown;
|
|
72
|
+
params: {};
|
|
73
|
+
query: unknown;
|
|
74
|
+
headers: unknown;
|
|
75
|
+
response: {
|
|
76
|
+
200: VoiceProviderCapabilityReport<TProvider>;
|
|
77
|
+
};
|
|
78
|
+
};
|
|
79
|
+
};
|
|
80
|
+
}, {
|
|
81
|
+
derive: {};
|
|
82
|
+
resolve: {};
|
|
83
|
+
schema: {};
|
|
84
|
+
standaloneSchema: {};
|
|
85
|
+
response: {};
|
|
86
|
+
}, {
|
|
87
|
+
derive: {};
|
|
88
|
+
resolve: {};
|
|
89
|
+
schema: {};
|
|
90
|
+
standaloneSchema: {};
|
|
91
|
+
response: {};
|
|
92
|
+
}>;
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
import { Elysia } from 'elysia';
|
|
2
|
+
import type { StoredVoiceTraceEvent, VoiceTraceEventStore } from './trace';
|
|
3
|
+
export type VoiceProviderHealthStatus = 'healthy' | 'idle' | 'rate-limited' | 'degraded' | 'recoverable' | 'suppressed';
|
|
4
|
+
export type VoiceProviderHealthSummary<TProvider extends string = string> = {
|
|
5
|
+
averageElapsedMs?: number;
|
|
6
|
+
errorCount: number;
|
|
7
|
+
fallbackCount: number;
|
|
8
|
+
lastError?: string;
|
|
9
|
+
lastErrorAt?: number;
|
|
10
|
+
lastSuccessAt?: number;
|
|
11
|
+
provider: TProvider;
|
|
12
|
+
rateLimited: boolean;
|
|
13
|
+
recommended: boolean;
|
|
14
|
+
runCount: number;
|
|
15
|
+
status: VoiceProviderHealthStatus;
|
|
16
|
+
suppressionRemainingMs?: number;
|
|
17
|
+
suppressedUntil?: number;
|
|
18
|
+
timeoutCount: number;
|
|
19
|
+
};
|
|
20
|
+
export type VoiceProviderHealthSummaryOptions<TProvider extends string = string> = {
|
|
21
|
+
events?: StoredVoiceTraceEvent[];
|
|
22
|
+
now?: number;
|
|
23
|
+
providers?: readonly TProvider[];
|
|
24
|
+
store?: VoiceTraceEventStore;
|
|
25
|
+
};
|
|
26
|
+
export type VoiceProviderHealthHandlerOptions<TProvider extends string = string> = VoiceProviderHealthSummaryOptions<TProvider>;
|
|
27
|
+
export type VoiceProviderHealthHTMLHandlerOptions<TProvider extends string = string> = VoiceProviderHealthHandlerOptions<TProvider> & {
|
|
28
|
+
headers?: HeadersInit;
|
|
29
|
+
render?: (providers: VoiceProviderHealthSummary<TProvider>[]) => string | Promise<string>;
|
|
30
|
+
};
|
|
31
|
+
export type VoiceProviderHealthRoutesOptions<TProvider extends string = string> = VoiceProviderHealthHTMLHandlerOptions<TProvider> & {
|
|
32
|
+
htmlPath?: false | string;
|
|
33
|
+
name?: string;
|
|
34
|
+
path?: string;
|
|
35
|
+
};
|
|
36
|
+
export declare const summarizeVoiceProviderHealth: <TProvider extends string = string>(input: StoredVoiceTraceEvent[] | VoiceProviderHealthSummaryOptions<TProvider>) => Promise<VoiceProviderHealthSummary<TProvider>[]>;
|
|
37
|
+
export declare const renderVoiceProviderHealthHTML: (providers: VoiceProviderHealthSummary[]) => string;
|
|
38
|
+
export declare const createVoiceProviderHealthJSONHandler: <TProvider extends string = string>(options: VoiceProviderHealthHandlerOptions<TProvider>) => () => Promise<VoiceProviderHealthSummary<TProvider>[]>;
|
|
39
|
+
export declare const createVoiceProviderHealthHTMLHandler: <TProvider extends string = string>(options: VoiceProviderHealthHTMLHandlerOptions<TProvider>) => () => Promise<Response>;
|
|
40
|
+
export declare const createVoiceProviderHealthRoutes: <TProvider extends string = string>(options: VoiceProviderHealthRoutesOptions<TProvider>) => Elysia<"", {
|
|
41
|
+
decorator: {};
|
|
42
|
+
store: {};
|
|
43
|
+
derive: {};
|
|
44
|
+
resolve: {};
|
|
45
|
+
}, {
|
|
46
|
+
typebox: {};
|
|
47
|
+
error: {};
|
|
48
|
+
}, {
|
|
49
|
+
schema: {};
|
|
50
|
+
standaloneSchema: {};
|
|
51
|
+
macro: {};
|
|
52
|
+
macroFn: {};
|
|
53
|
+
parser: {};
|
|
54
|
+
response: {};
|
|
55
|
+
}, {
|
|
56
|
+
[x: string]: {
|
|
57
|
+
get: {
|
|
58
|
+
body: unknown;
|
|
59
|
+
params: {};
|
|
60
|
+
query: unknown;
|
|
61
|
+
headers: unknown;
|
|
62
|
+
response: {
|
|
63
|
+
200: VoiceProviderHealthSummary<TProvider>[];
|
|
64
|
+
};
|
|
65
|
+
};
|
|
66
|
+
};
|
|
67
|
+
}, {
|
|
68
|
+
derive: {};
|
|
69
|
+
resolve: {};
|
|
70
|
+
schema: {};
|
|
71
|
+
standaloneSchema: {};
|
|
72
|
+
response: {};
|
|
73
|
+
}, {
|
|
74
|
+
derive: {};
|
|
75
|
+
resolve: {};
|
|
76
|
+
schema: {};
|
|
77
|
+
standaloneSchema: {};
|
|
78
|
+
response: {};
|
|
79
|
+
}>;
|