@jchaffin/voicekit 0.2.0
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 +369 -0
- package/dist/adapters/deepgram.d.mts +43 -0
- package/dist/adapters/deepgram.d.ts +43 -0
- package/dist/adapters/deepgram.js +216 -0
- package/dist/adapters/deepgram.mjs +162 -0
- package/dist/adapters/elevenlabs.d.mts +41 -0
- package/dist/adapters/elevenlabs.d.ts +41 -0
- package/dist/adapters/elevenlabs.js +304 -0
- package/dist/adapters/elevenlabs.mjs +250 -0
- package/dist/adapters/livekit.d.mts +44 -0
- package/dist/adapters/livekit.d.ts +44 -0
- package/dist/adapters/livekit.js +225 -0
- package/dist/adapters/livekit.mjs +161 -0
- package/dist/adapters/openai.d.mts +41 -0
- package/dist/adapters/openai.d.ts +41 -0
- package/dist/adapters/openai.js +350 -0
- package/dist/adapters/openai.mjs +294 -0
- package/dist/chunk-22WLZIXO.mjs +33 -0
- package/dist/chunk-T3II3DRG.mjs +178 -0
- package/dist/chunk-UZ2VGPZD.mjs +33 -0
- package/dist/chunk-Y6FXYEAI.mjs +10 -0
- package/dist/index.d.mts +693 -0
- package/dist/index.d.ts +693 -0
- package/dist/index.js +1838 -0
- package/dist/index.mjs +1593 -0
- package/dist/server.d.mts +80 -0
- package/dist/server.d.ts +80 -0
- package/dist/server.js +147 -0
- package/dist/server.mjs +119 -0
- package/dist/types-DY31oVB1.d.mts +150 -0
- package/dist/types-DY31oVB1.d.ts +150 -0
- package/dist/types-mThnXW9S.d.mts +150 -0
- package/dist/types-mThnXW9S.d.ts +150 -0
- package/dist/types-uLnzb8NE.d.mts +150 -0
- package/dist/types-uLnzb8NE.d.ts +150 -0
- package/package.json +100 -0
|
@@ -0,0 +1,150 @@
|
|
|
1
|
+
type VoiceStatus$1 = 'DISCONNECTED' | 'CONNECTING' | 'CONNECTED';
|
|
2
|
+
interface TranscriptMessage {
|
|
3
|
+
id: string;
|
|
4
|
+
role: 'user' | 'assistant';
|
|
5
|
+
text: string;
|
|
6
|
+
timestamp: Date;
|
|
7
|
+
status: 'pending' | 'complete';
|
|
8
|
+
}
|
|
9
|
+
type ToolParamType = 'string' | 'number' | 'boolean' | 'array' | 'object';
|
|
10
|
+
interface ToolParamDefinition {
|
|
11
|
+
type: ToolParamType;
|
|
12
|
+
description?: string;
|
|
13
|
+
enum?: string[];
|
|
14
|
+
default?: unknown;
|
|
15
|
+
}
|
|
16
|
+
interface ToolDefinition<TParams = Record<string, unknown>, TResult = unknown> {
|
|
17
|
+
name: string;
|
|
18
|
+
description: string;
|
|
19
|
+
parameters: {
|
|
20
|
+
type: 'object';
|
|
21
|
+
properties: Record<string, ToolParamDefinition>;
|
|
22
|
+
required?: string[];
|
|
23
|
+
};
|
|
24
|
+
execute: (params: TParams) => Promise<TResult> | TResult;
|
|
25
|
+
}
|
|
26
|
+
interface AgentConfig {
|
|
27
|
+
name: string;
|
|
28
|
+
instructions: string;
|
|
29
|
+
tools?: ToolDefinition[];
|
|
30
|
+
voice?: string;
|
|
31
|
+
}
|
|
32
|
+
interface VoiceConfig {
|
|
33
|
+
/** API endpoint that returns session token */
|
|
34
|
+
sessionEndpoint?: string;
|
|
35
|
+
/** Model identifier (provider-specific) */
|
|
36
|
+
model?: string;
|
|
37
|
+
/** Audio codec preference */
|
|
38
|
+
codec?: 'opus' | 'pcmu' | 'pcma';
|
|
39
|
+
/** Language for transcription */
|
|
40
|
+
language?: string;
|
|
41
|
+
onStatusChange?: (status: VoiceStatus$1) => void;
|
|
42
|
+
onTranscriptUpdate?: (messages: TranscriptMessage[]) => void;
|
|
43
|
+
onToolCall?: (toolName: string, params: unknown, result: unknown) => void;
|
|
44
|
+
onError?: (error: Error) => void;
|
|
45
|
+
}
|
|
46
|
+
interface VoiceProviderProps extends VoiceConfig {
|
|
47
|
+
/** Provider adapter (e.g. openai(), livekit(), deepgram()) */
|
|
48
|
+
adapter: VoiceAdapter;
|
|
49
|
+
/** Agent configuration */
|
|
50
|
+
agent: VoiceAgentConfig;
|
|
51
|
+
children: React.ReactNode;
|
|
52
|
+
}
|
|
53
|
+
interface VoiceContextValue {
|
|
54
|
+
status: VoiceStatus$1;
|
|
55
|
+
connect: () => Promise<void>;
|
|
56
|
+
disconnect: () => Promise<void>;
|
|
57
|
+
transcript: TranscriptMessage[];
|
|
58
|
+
clearTranscript: () => void;
|
|
59
|
+
sendMessage: (text: string) => void;
|
|
60
|
+
interrupt: () => void;
|
|
61
|
+
mute: (muted: boolean) => void;
|
|
62
|
+
isMuted: boolean;
|
|
63
|
+
agent: VoiceAgentConfig;
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
type VoiceStatus = 'DISCONNECTED' | 'CONNECTING' | 'CONNECTED';
|
|
67
|
+
interface VoiceAgentConfig {
|
|
68
|
+
name: string;
|
|
69
|
+
instructions: string;
|
|
70
|
+
tools?: ToolDefinition[];
|
|
71
|
+
voice?: string;
|
|
72
|
+
handoffs?: VoiceAgentConfig[];
|
|
73
|
+
}
|
|
74
|
+
interface SessionEvents {
|
|
75
|
+
[event: string]: (...args: any[]) => void;
|
|
76
|
+
status_change: (status: VoiceStatus) => void;
|
|
77
|
+
user_speech_started: () => void;
|
|
78
|
+
user_transcript: (data: TranscriptData) => void;
|
|
79
|
+
assistant_transcript: (data: TranscriptData) => void;
|
|
80
|
+
tool_call_start: (name: string, input: unknown) => void;
|
|
81
|
+
tool_call_end: (name: string, input: unknown, output: unknown) => void;
|
|
82
|
+
agent_handoff: (from: string, to: string) => void;
|
|
83
|
+
guardrail_tripped: (info: unknown) => void;
|
|
84
|
+
audio_delta: (itemId: string, delta: string) => void;
|
|
85
|
+
error: (error: Error) => void;
|
|
86
|
+
/** Escape hatch for provider-specific events not covered by normalized types */
|
|
87
|
+
raw_event: (event: unknown) => void;
|
|
88
|
+
}
|
|
89
|
+
interface TranscriptData {
|
|
90
|
+
itemId: string;
|
|
91
|
+
delta?: string;
|
|
92
|
+
text?: string;
|
|
93
|
+
isFinal: boolean;
|
|
94
|
+
}
|
|
95
|
+
interface VoiceSession {
|
|
96
|
+
connect(config: ConnectConfig): Promise<void>;
|
|
97
|
+
disconnect(): Promise<void>;
|
|
98
|
+
sendMessage(text: string): void;
|
|
99
|
+
interrupt(): void;
|
|
100
|
+
mute(muted: boolean): void;
|
|
101
|
+
sendRawEvent?(event: Record<string, unknown>): void;
|
|
102
|
+
on<E extends string & keyof SessionEvents>(event: E, handler: SessionEvents[E]): void;
|
|
103
|
+
off<E extends string & keyof SessionEvents>(event: E, handler: SessionEvents[E]): void;
|
|
104
|
+
}
|
|
105
|
+
interface ConnectConfig {
|
|
106
|
+
/** Authentication token/key obtained from server handler */
|
|
107
|
+
authToken: string;
|
|
108
|
+
/** HTML audio element for playback */
|
|
109
|
+
audioElement?: HTMLAudioElement;
|
|
110
|
+
/** Extra context passed to the session */
|
|
111
|
+
context?: Record<string, unknown>;
|
|
112
|
+
/** Output guardrails */
|
|
113
|
+
outputGuardrails?: unknown[];
|
|
114
|
+
}
|
|
115
|
+
interface SessionOptions {
|
|
116
|
+
model?: string;
|
|
117
|
+
language?: string;
|
|
118
|
+
codec?: string;
|
|
119
|
+
voice?: string;
|
|
120
|
+
/** Provider-specific options */
|
|
121
|
+
[key: string]: unknown;
|
|
122
|
+
}
|
|
123
|
+
interface VoiceAdapter {
|
|
124
|
+
/** Unique name for this adapter (e.g. 'openai', 'livekit') */
|
|
125
|
+
readonly name: string;
|
|
126
|
+
/** Create a session for the given agent */
|
|
127
|
+
createSession(agent: VoiceAgentConfig, options?: SessionOptions): VoiceSession;
|
|
128
|
+
}
|
|
129
|
+
interface ServerSessionConfig {
|
|
130
|
+
/** Provider-specific API key */
|
|
131
|
+
apiKey?: string;
|
|
132
|
+
model?: string;
|
|
133
|
+
voice?: string;
|
|
134
|
+
instructions?: string;
|
|
135
|
+
expiresIn?: number;
|
|
136
|
+
/** Provider-specific options */
|
|
137
|
+
[key: string]: unknown;
|
|
138
|
+
}
|
|
139
|
+
interface ServerAdapter {
|
|
140
|
+
createSessionHandler(config?: ServerSessionConfig): (request?: Request) => Promise<Response>;
|
|
141
|
+
getSessionToken(config?: ServerSessionConfig): Promise<{
|
|
142
|
+
token: string;
|
|
143
|
+
error?: never;
|
|
144
|
+
} | {
|
|
145
|
+
token?: never;
|
|
146
|
+
error: string;
|
|
147
|
+
}>;
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
export type { AgentConfig as A, ConnectConfig as C, ServerAdapter as S, TranscriptMessage as T, VoiceProviderProps as V, VoiceContextValue as a, VoiceAgentConfig as b, ToolDefinition as c, ToolParamDefinition as d, VoiceAdapter as e, VoiceStatus$1 as f, ServerSessionConfig as g, SessionEvents as h, SessionOptions as i, TranscriptData as j, VoiceConfig as k, VoiceSession as l };
|
package/package.json
ADDED
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@jchaffin/voicekit",
|
|
3
|
+
"version": "0.2.0",
|
|
4
|
+
"description": "A provider-agnostic React library for building voice-enabled AI agents",
|
|
5
|
+
"main": "dist/index.js",
|
|
6
|
+
"module": "dist/index.mjs",
|
|
7
|
+
"types": "dist/index.d.ts",
|
|
8
|
+
"exports": {
|
|
9
|
+
".": {
|
|
10
|
+
"types": "./dist/index.d.ts",
|
|
11
|
+
"import": "./dist/index.mjs",
|
|
12
|
+
"require": "./dist/index.js"
|
|
13
|
+
},
|
|
14
|
+
"./openai": {
|
|
15
|
+
"types": "./dist/adapters/openai.d.ts",
|
|
16
|
+
"import": "./dist/adapters/openai.mjs",
|
|
17
|
+
"require": "./dist/adapters/openai.js"
|
|
18
|
+
},
|
|
19
|
+
"./livekit": {
|
|
20
|
+
"types": "./dist/adapters/livekit.d.ts",
|
|
21
|
+
"import": "./dist/adapters/livekit.mjs",
|
|
22
|
+
"require": "./dist/adapters/livekit.js"
|
|
23
|
+
},
|
|
24
|
+
"./deepgram": {
|
|
25
|
+
"types": "./dist/adapters/deepgram.d.ts",
|
|
26
|
+
"import": "./dist/adapters/deepgram.mjs",
|
|
27
|
+
"require": "./dist/adapters/deepgram.js"
|
|
28
|
+
},
|
|
29
|
+
"./elevenlabs": {
|
|
30
|
+
"types": "./dist/adapters/elevenlabs.d.ts",
|
|
31
|
+
"import": "./dist/adapters/elevenlabs.mjs",
|
|
32
|
+
"require": "./dist/adapters/elevenlabs.js"
|
|
33
|
+
},
|
|
34
|
+
"./server": {
|
|
35
|
+
"types": "./dist/server.d.ts",
|
|
36
|
+
"import": "./dist/server.mjs",
|
|
37
|
+
"require": "./dist/server.js"
|
|
38
|
+
}
|
|
39
|
+
},
|
|
40
|
+
"files": [
|
|
41
|
+
"dist",
|
|
42
|
+
"README.md"
|
|
43
|
+
],
|
|
44
|
+
"scripts": {
|
|
45
|
+
"build": "tsup src/index.ts src/server.ts src/adapters/openai.ts src/adapters/livekit.ts src/adapters/deepgram.ts src/adapters/elevenlabs.ts --format cjs,esm --dts --external react --external react-dom --external @openai/agents --external livekit-client --external livekit-server-sdk --external @deepgram/sdk",
|
|
46
|
+
"dev": "tsup src/index.ts src/server.ts src/adapters/openai.ts src/adapters/livekit.ts src/adapters/deepgram.ts src/adapters/elevenlabs.ts --format cjs,esm --dts --watch --external react --external react-dom --external @openai/agents --external livekit-client --external livekit-server-sdk --external @deepgram/sdk",
|
|
47
|
+
"lint": "eslint src/",
|
|
48
|
+
"typecheck": "tsc --noEmit",
|
|
49
|
+
"prepublishOnly": "npm run build"
|
|
50
|
+
},
|
|
51
|
+
"keywords": [
|
|
52
|
+
"voice",
|
|
53
|
+
"ai",
|
|
54
|
+
"openai",
|
|
55
|
+
"livekit",
|
|
56
|
+
"deepgram",
|
|
57
|
+
"elevenlabs",
|
|
58
|
+
"realtime",
|
|
59
|
+
"react",
|
|
60
|
+
"agent",
|
|
61
|
+
"webrtc",
|
|
62
|
+
"speech",
|
|
63
|
+
"provider-agnostic"
|
|
64
|
+
],
|
|
65
|
+
"author": "Jacob Chaffin",
|
|
66
|
+
"license": "MIT",
|
|
67
|
+
"peerDependencies": {
|
|
68
|
+
"react": ">=18.0.0",
|
|
69
|
+
"react-dom": ">=18.0.0",
|
|
70
|
+
"zod": ">=3.0.0 || >=4.0.0"
|
|
71
|
+
},
|
|
72
|
+
"peerDependenciesMeta": {
|
|
73
|
+
"@openai/agents": {
|
|
74
|
+
"optional": true
|
|
75
|
+
},
|
|
76
|
+
"livekit-client": {
|
|
77
|
+
"optional": true
|
|
78
|
+
},
|
|
79
|
+
"livekit-server-sdk": {
|
|
80
|
+
"optional": true
|
|
81
|
+
},
|
|
82
|
+
"@deepgram/sdk": {
|
|
83
|
+
"optional": true
|
|
84
|
+
},
|
|
85
|
+
"zod": {
|
|
86
|
+
"optional": true
|
|
87
|
+
}
|
|
88
|
+
},
|
|
89
|
+
"devDependencies": {
|
|
90
|
+
"@openai/agents": ">=0.0.15",
|
|
91
|
+
"@types/react": "^18.2.0",
|
|
92
|
+
"@types/react-dom": "^18.2.0",
|
|
93
|
+
"tsup": "^8.0.0",
|
|
94
|
+
"typescript": "^5.0.0"
|
|
95
|
+
},
|
|
96
|
+
"repository": {
|
|
97
|
+
"type": "git",
|
|
98
|
+
"url": "https://github.com/jchaffin/voicekit"
|
|
99
|
+
}
|
|
100
|
+
}
|