@shvm/vani-client 0.0.2
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 +196 -0
- package/dist/headless/index.d.ts +205 -0
- package/dist/headless/index.js +624 -0
- package/dist/headless/index.js.map +1 -0
- package/dist/index.d.ts +4 -0
- package/dist/index.js +651 -0
- package/dist/index.js.map +1 -0
- package/dist/shared/index.d.ts +49 -0
- package/dist/shared/index.js +30 -0
- package/dist/shared/index.js.map +1 -0
- package/dist/ui/index.d.ts +39 -0
- package/dist/ui/index.js +559 -0
- package/dist/ui/index.js.map +1 -0
- package/dist/voice-BwU4C7fN.d.ts +51 -0
- package/package.json +68 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/ui/components/VoiceDebugSidebar.tsx","../../src/ui/modes/FullScreenMode.tsx","../../src/ui/modes/PipMode.tsx","../../src/ui/components/VaniClient.tsx","../../src/ui/components/Vani.tsx"],"names":["jsxs","jsx","X","AlertCircle","Mic","Terminal","useState","Radio","Loader2","Volume2","WifiOff","VaniClient","useEffect"],"mappings":"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","file":"index.js","sourcesContent":["import { X, FileAudio, Terminal, Activity, AlertCircle, Mic, Speaker } from \"lucide-react\";\nimport type { DebugEvent } from \"@shvm/vani-client/headless\";\n\ninterface VoiceDebugSidebarProps {\n isOpen: boolean;\n onClose: () => void;\n events: DebugEvent[];\n}\n\nexport function VoiceDebugSidebar({ isOpen, onClose, events }: VoiceDebugSidebarProps) {\n if (!isOpen) return null;\n\n return (\n <div className=\"fixed inset-y-0 right-0 w-96 bg-zinc-900 border-l border-zinc-800 shadow-2xl flex flex-col z-50 animate-in slide-in-from-right duration-300\">\n <div className=\"bg-zinc-950 px-4 py-3 border-b border-zinc-800 flex items-center justify-between shrink-0\">\n <div className=\"flex items-center gap-2 text-zinc-100\">\n <Terminal className=\"w-4 h-4 text-zinc-400\" />\n <span className=\"font-mono text-sm font-semibold\">Debug Console</span>\n </div>\n <button\n onClick={onClose}\n className=\"p-1 hover:bg-zinc-800 rounded-md text-zinc-400 hover:text-white transition-colors\"\n >\n <X className=\"w-4 h-4\" />\n </button>\n </div>\n\n <div className=\"flex-1 overflow-y-auto p-4 space-y-3 font-mono text-xs\">\n {events.length === 0 && <div className=\"text-zinc-500 text-center py-8\">No events logged yet.</div>}\n\n {events.map((event) => (\n <EventItem key={event.id} event={event} />\n ))}\n </div>\n\n <div className=\"bg-zinc-950 px-4 py-2 border-t border-zinc-800 text-[10px] text-zinc-500 flex justify-between shrink-0\">\n <span>{events.length} events</span>\n <span>Session ID: {events[0]?.id?.slice(0, 4) || \"N/A\"}</span>\n </div>\n </div>\n );\n}\n\nfunction EventItem({ event }: { event: DebugEvent }) {\n const time = new Date(event.timestamp).toLocaleTimeString([], {\n hour12: false,\n hour: \"2-digit\",\n minute: \"2-digit\",\n second: \"2-digit\",\n fractionalSecondDigits: 3,\n });\n\n const getIcon = () => {\n switch (event.type) {\n case \"state_change\":\n return <Activity className=\"w-3 h-3 text-blue-400\" />;\n case \"socket_event\":\n return <Terminal className=\"w-3 h-3 text-zinc-500\" />;\n case \"audio_input\":\n return <Mic className=\"w-3 h-3 text-green-400\" />;\n case \"audio_output\":\n return <Speaker className=\"w-3 h-3 text-purple-400\" />;\n case \"error\":\n return <AlertCircle className=\"w-3 h-3 text-red-500\" />;\n case \"transcript\":\n return <FileAudio className=\"w-3 h-3 text-yellow-400\" />;\n default:\n return <Terminal className=\"w-3 h-3\" />;\n }\n };\n\n const isAudio = event.type === \"audio_input\" || event.type === \"audio_output\";\n\n return (\n <div className=\"bg-zinc-800/50 rounded border border-zinc-800 p-2 flex gap-3 hover:bg-zinc-800 transition-colors group\">\n <div className=\"shrink-0 pt-0.5 opacity-70 group-hover:opacity-100\">{getIcon()}</div>\n <div className=\"flex-1 min-w-0 overflow-hidden\">\n <div className=\"flex items-center justify-between mb-0.5\">\n <span className=\"text-zinc-400 font-bold uppercase tracking-wider text-[10px]\">\n {event.type.replace(\"_\", \" \")}\n </span>\n <span className=\"text-zinc-600 text-[10px]\">{time}</span>\n </div>\n\n <div className=\"text-zinc-300 break-words whitespace-pre-wrap\">{renderDetails(event)}</div>\n\n {isAudio && event.blobUrl && (\n <div className=\"mt-2\">\n <audio\n controls\n src={event.blobUrl}\n className=\"w-full h-6 rounded bg-transparent opacity-80 hover:opacity-100\"\n />\n </div>\n )}\n </div>\n </div>\n );\n}\n\nfunction renderDetails(event: DebugEvent) {\n if (event.type === \"state_change\") {\n return (\n <span className=\"flex items-center gap-1.5\">\n <span className=\"text-zinc-500\">{(event.details as any).from || \"void\"}</span>\n <span className=\"text-zinc-600\">→</span>\n <span className={`${getStateColor((event.details as any).to)} font-semibold`}>\n {(event.details as any).to}\n </span>\n <span className=\"text-zinc-600 ml-1 text-[10px]\">({(event.details as any).source})</span>\n </span>\n );\n }\n\n if (event.type === \"transcript\") {\n return (\n <span>\n <span className={(event.details as any).role === \"user\" ? \"text-green-400\" : \"text-purple-400\"}>\n {(event.details as any).role}:\n </span>{\" \"}\n {(event.details as any).text}\n </span>\n );\n }\n\n return JSON.stringify(event.details, null, 0).replace(/[{}\"]/g, \"\").replace(/:/g, \": \");\n}\n\nfunction getStateColor(state: string) {\n switch (state) {\n case \"listening\":\n return \"text-green-400\";\n case \"processing\":\n return \"text-yellow-400\";\n case \"speaking\":\n return \"text-blue-400\";\n case \"idle\":\n return \"text-zinc-400\";\n case \"error\":\n return \"text-red-400\";\n default:\n return \"text-zinc-300\";\n }\n}\n\n","import {\n Mic,\n Volume2,\n Loader2,\n Radio,\n WifiOff,\n AlertCircle,\n Terminal,\n Minimize2,\n Square,\n Settings,\n X,\n Save,\n} from \"lucide-react\";\nimport { useState, useRef, useEffect, useMemo } from \"react\";\nimport { VoiceDebugSidebar } from \"../components/VoiceDebugSidebar\";\nimport type { VaniViewProps } from \"../types\";\nimport { LLM_MODELS, STT_MODELS, TTS_MODELS, TTS_MODEL_VOICES } from \"@shvm/vani-client/shared\";\nimport type { VoiceConfig } from \"@shvm/vani-client/shared\";\n\nexport function FullScreenMode({\n status,\n transcript,\n history,\n error,\n connect,\n cancel,\n vadLoading,\n onTogglePip,\n config,\n setConfig,\n feedback,\n}: VaniViewProps) {\n const [isDebugOpen, setIsDebugOpen] = useState(false);\n const [isSettingsOpen, setIsSettingsOpen] = useState(false);\n const transcriptEndRef = useRef<HTMLDivElement>(null);\n const [localConfig, setLocalConfig] = useState<VoiceConfig>(config || {});\n\n useEffect(() => {\n if (config) setLocalConfig(config);\n }, [config]);\n\n useEffect(() => {\n transcriptEndRef.current?.scrollIntoView?.({ behavior: \"smooth\" });\n }, [transcript]);\n\n const availableVoices = useMemo(() => {\n const model = localConfig.tts?.model || TTS_MODELS[0];\n return TTS_MODEL_VOICES[model] || [];\n }, [localConfig.tts?.model]);\n\n useEffect(() => {\n if (localConfig.tts?.speaker && !availableVoices.includes(localConfig.tts.speaker as any)) {\n setLocalConfig({\n ...localConfig,\n tts: { ...localConfig.tts, speaker: availableVoices[0] as any },\n });\n }\n }, [availableVoices, localConfig]);\n\n const handleSaveConfig = () => {\n setConfig?.(localConfig);\n setIsSettingsOpen(false);\n };\n\n const isListening = status === \"listening\";\n const isThinking = status === \"processing\";\n const isSpeaking = status === \"speaking\";\n const isConnecting = status === \"connecting\";\n const isDisconnected = status === \"disconnected\";\n const isError = status === \"error\";\n\n return (\n <div className=\"fixed inset-0 min-h-screen bg-black text-zinc-100 flex flex-col items-center justify-center p-4 selection:bg-accent/20 overflow-hidden\">\n <div className=\"fixed inset-0 pointer-events-none\">\n <div\n className={`absolute top-1/2 left-1/2 -translate-x-1/2 -translate-y-1/2 w-[60vh] h-[60vh] blur-[120px] rounded-full opacity-20 transition-all duration-700\n ${isListening\n ? \"bg-green-500 scale-125\"\n : isThinking\n ? \"bg-yellow-500 scale-110\"\n : isSpeaking\n ? \"bg-blue-600 scale-125\"\n : isError\n ? \"bg-red-600 scale-110\"\n : isDisconnected\n ? \"bg-zinc-800 scale-90\"\n : \"bg-zinc-800 scale-100\"\n }`}\n />\n </div>\n\n <div className=\"absolute top-4 right-4 z-50 flex gap-2\">\n <button\n onClick={() => setIsSettingsOpen(true)}\n className=\"p-2 rounded-full hover:bg-zinc-900 text-zinc-500 hover:text-zinc-300 transition-colors\"\n title=\"Settings\"\n >\n <Settings className=\"w-5 h-5\" />\n </button>\n {onTogglePip && (\n <button\n onClick={onTogglePip}\n className=\"p-2 rounded-full hover:bg-zinc-900 text-zinc-500 hover:text-zinc-300 transition-colors\"\n title=\"Enter Picture-in-Picture Mode\"\n >\n <Minimize2 className=\"w-5 h-5\" />\n </button>\n )}\n </div>\n\n {isSettingsOpen && (\n <div className=\"fixed inset-0 z-[60] bg-black/80 backdrop-blur-sm flex items-center justify-center p-4\">\n <div className=\"bg-zinc-900 border border-zinc-700 rounded-2xl w-full max-w-md p-6 shadow-2xl animate-in fade-in zoom-in-95 duration-200\">\n <div className=\"flex justify-between items-center mb-6\">\n <h2 className=\"text-xl font-semibold text-white\">Voice Settings</h2>\n <button onClick={() => setIsSettingsOpen(false)} className=\"text-zinc-500 hover:text-white\">\n <X className=\"w-5 h-5\" />\n </button>\n </div>\n\n <div className=\"space-y-4\">\n <div>\n <label className=\"block text-xs font-mono text-zinc-500 mb-1 uppercase\">LLM Model</label>\n <select\n value={localConfig.llmModel || LLM_MODELS[0]}\n onChange={(e) => setLocalConfig({ ...localConfig, llmModel: e.target.value as any })}\n className=\"w-full bg-zinc-950 border border-zinc-800 rounded px-3 py-2 text-sm focus:border-blue-500 outline-none appearance-none\"\n >\n {LLM_MODELS.map((m) => (\n <option key={m} value={m}>\n {m}\n </option>\n ))}\n </select>\n </div>\n\n <div>\n <label className=\"block text-xs font-mono text-zinc-500 mb-1 uppercase\">STT Model</label>\n <select\n value={localConfig.sttModel || STT_MODELS[0]}\n onChange={(e) => setLocalConfig({ ...localConfig, sttModel: e.target.value as any })}\n className=\"w-full bg-zinc-950 border border-zinc-800 rounded px-3 py-2 text-sm focus:border-blue-500 outline-none appearance-none\"\n >\n {STT_MODELS.map((m) => (\n <option key={m} value={m}>\n {m}\n </option>\n ))}\n </select>\n </div>\n\n <div>\n <label className=\"block text-xs font-mono text-zinc-500 mb-1 uppercase\">TTS Model</label>\n <select\n value={localConfig.tts?.model || TTS_MODELS[0]}\n onChange={(e) =>\n setLocalConfig({ ...localConfig, tts: { ...localConfig.tts, model: e.target.value as any } })\n }\n className=\"w-full bg-zinc-950 border border-zinc-800 rounded px-3 py-2 text-sm focus:border-blue-500 outline-none appearance-none\"\n >\n {TTS_MODELS.map((m) => (\n <option key={m} value={m}>\n {m}\n </option>\n ))}\n </select>\n </div>\n\n <div>\n <label className=\"block text-xs font-mono text-zinc-500 mb-1 uppercase\">Voice</label>\n <select\n value={localConfig.tts?.speaker || (availableVoices[0] as any)}\n onChange={(e) =>\n setLocalConfig({ ...localConfig, tts: { ...localConfig.tts, speaker: e.target.value as any } })\n }\n className=\"w-full bg-zinc-950 border border-zinc-800 rounded px-3 py-2 text-sm focus:border-blue-500 outline-none appearance-none\"\n >\n {availableVoices.map((v) => (\n <option key={v} value={v}>\n {v}\n </option>\n ))}\n </select>\n </div>\n\n <div>\n <label className=\"block text-xs font-mono text-zinc-500 mb-1 uppercase\">MCP Server Proxy URL</label>\n <input\n type=\"text\"\n placeholder=\"https://shvm.in/mcp\"\n value={localConfig.mcpServer || \"\"}\n onChange={(e) => setLocalConfig({ ...localConfig, mcpServer: e.target.value })}\n className=\"w-full bg-zinc-950 border border-zinc-800 rounded px-3 py-2 text-sm focus:border-blue-500 outline-none\"\n />\n </div>\n </div>\n\n <div className=\"mt-6 flex justify-end gap-2\">\n <button\n onClick={() => setIsSettingsOpen(false)}\n className=\"px-4 py-2 text-sm font-mono text-zinc-400 hover:text-white transition-colors\"\n >\n Cancel\n </button>\n <button\n onClick={handleSaveConfig}\n className=\"px-4 py-2 text-sm font-mono bg-blue-600 hover:bg-blue-500 text-white rounded flex items-center gap-2 transition-colors\"\n >\n <Save className=\"w-4 h-4\" /> Save\n </button>\n </div>\n </div>\n </div>\n )}\n\n {feedback && (\n <div className=\"fixed top-4 left-1/2 -translate-x-1/2 z-[70]\">\n <div className=\"text-yellow-400 text-sm font-mono bg-yellow-900/20 px-3 py-1 rounded border border-yellow-900/50 animate-in fade-in slide-in-from-top-2 max-w-xs text-center break-words\">\n {feedback}\n </div>\n </div>\n )}\n\n {isError && error && (\n <div className=\"fixed top-4 left-1/2 -translate-x-1/2 z-[70]\">\n <div className=\"text-red-400 text-sm font-mono bg-red-900/20 px-3 py-1 rounded border border-red-900/50 animate-in fade-in slide-in-from-top-2 max-w-xs text-center break-words\">\n {error}\n </div>\n </div>\n )}\n\n <div className=\"relative z-10 flex flex-col items-center gap-6\">\n <div className=\"text-center\">\n <h1 className=\"text-3xl md:text-4xl font-display font-semibold tracking-tight\">\n {isListening\n ? \"Listening\"\n : isThinking\n ? \"Processing\"\n : isSpeaking\n ? \"Speaking\"\n : isConnecting\n ? \"Connecting\"\n : isError\n ? \"Error\"\n : isDisconnected\n ? \"Ready\"\n : \"Ready\"}\n </h1>\n\n <div className=\"mt-3 flex justify-center\">\n <div\n className={`h-1.5 rounded-full transition-all duration-500 ${isListening\n ? \"w-16 bg-green-500\"\n : isThinking\n ? \"w-16 bg-yellow-500 animate-pulse\"\n : isSpeaking\n ? \"w-24 bg-blue-500\"\n : isConnecting\n ? \"w-8 bg-zinc-500 animate-pulse\"\n : isError\n ? \"w-16 bg-red-500 conversation-shake\"\n : \"w-2 bg-zinc-700\"\n }`}\n />\n </div>\n </div>\n\n <button\n disabled={isConnecting || isError || isDisconnected}\n onClick={() => (isThinking || isSpeaking) && cancel()}\n className={`group relative w-48 h-48 rounded-full flex items-center justify-center border-4 transition-all duration-300 outline-none\n ${isListening\n ? \"border-green-500/50 bg-green-500/10 scale-105 shadow-[0_0_40px_rgba(34,197,94,0.3)]\"\n : isThinking\n ? \"border-yellow-500/50 bg-yellow-500/10 shadow-[0_0_40px_rgba(234,179,8,0.3)] animate-pulse cursor-pointer hover:border-red-500/50 hover:bg-red-500/10\"\n : isSpeaking\n ? \"border-blue-500/50 bg-blue-500/10 shadow-[0_0_40px_rgba(59,130,246,0.3)] cursor-pointer hover:border-red-500/50 hover:bg-red-500/10\"\n : isError\n ? \"border-red-500/50 bg-red-500/10 hover:border-red-400 cursor-not-allowed\"\n : isDisconnected\n ? \"border-zinc-800/50 bg-black/50 cursor-not-allowed\"\n : \"border-zinc-800 bg-zinc-900 hover:border-zinc-700 hover:bg-zinc-800\"\n }`}\n >\n {isListening ? (\n <Radio className=\"w-16 h-16 text-green-500 animate-pulse\" />\n ) : isThinking ? (\n <Loader2 className=\"w-16 h-16 text-yellow-500 animate-spin group-hover:hidden\" />\n ) : isSpeaking ? (\n <Volume2 className=\"w-16 h-16 text-blue-500 animate-bounce group-hover:hidden\" />\n ) : isError ? (\n <AlertCircle className=\"w-16 h-16 text-red-500\" />\n ) : isDisconnected ? (\n <WifiOff className=\"w-16 h-16 text-zinc-600\" />\n ) : (\n <Mic className=\"w-16 h-16 text-zinc-500\" />\n )}\n {(isThinking || isSpeaking) && (\n <Square className=\"w-16 h-16 text-red-500 absolute hidden group-hover:block fill-current\" />\n )}\n </button>\n\n {(isError || isDisconnected) ? (\n <button\n onClick={() => connect()}\n className=\"text-zinc-400 hover:text-white text-sm font-mono border border-zinc-700 px-4 py-2 rounded hover:bg-zinc-800 transition-colors\"\n >\n {isError ? \"Retry Connection\" : \"Start Voice Session\"}\n </button>\n ) : isThinking || isSpeaking ? (\n <button\n onClick={cancel}\n className=\"text-zinc-400 hover:text-red-400 text-sm font-mono border border-zinc-700 px-4 py-2 rounded hover:bg-zinc-800 transition-colors flex items-center gap-2\"\n >\n <Square className=\"w-3 h-3 fill-current\" /> Stop\n </button>\n ) : (\n <p className=\"text-zinc-500 text-sm font-mono text-center h-6\">\n {vadLoading ? \"Loading voice activity detection…\" : \"Just start talking\"}\n </p>\n )}\n\n <div className=\"w-full min-h-[150px] max-h-[30vh] overflow-y-auto space-y-4 mask-gradient-b flex flex-col pb-4 px-2 scrollbar-thin scrollbar-thumb-zinc-800 scrollbar-track-transparent\">\n {transcript &&\n transcript.map((msg: any) => (\n <div\n key={msg.id}\n className={`flex flex-col space-y-1 animate-in slide-in-from-bottom-2 fade-in duration-300 ${msg.role === \"user\" ? \"items-end\" : \"items-start\"\n }`}\n >\n <span className=\"text-[10px] font-mono text-zinc-600 uppercase tracking-widest\">{msg.role}</span>\n <div\n className={`px-4 py-2 rounded-2xl max-w-[90%] text-sm leading-relaxed shadow-lg break-words\n ${msg.role === \"user\"\n ? \"bg-zinc-800/80 text-zinc-200 rounded-tr-sm border border-zinc-700/50\"\n : \"bg-blue-900/20 text-blue-100 border border-blue-500/20 rounded-tl-sm backdrop-blur-sm\"\n }`}\n >\n {msg.content}\n </div>\n </div>\n ))}\n <div ref={transcriptEndRef} />\n </div>\n </div>\n\n <button\n onClick={() => setIsDebugOpen(!isDebugOpen)}\n className={`fixed bottom-4 right-4 p-2 rounded-full transition-all duration-300 z-50\n ${isDebugOpen ? \"bg-zinc-800 text-white shadow-xl\" : \"bg-transparent text-zinc-700 hover:text-zinc-400 hover:bg-zinc-900\"}`}\n >\n <Terminal className=\"w-5 h-5\" />\n </button>\n\n {isDebugOpen && (\n <div className=\"fixed inset-y-0 right-0 z-40\">\n <VoiceDebugSidebar isOpen={isDebugOpen} onClose={() => setIsDebugOpen(false)} events={history} />\n </div>\n )}\n </div>\n );\n}\n","import { useState } from \"react\";\nimport { Maximize2, X, Mic, Volume2, Radio, Loader2, AlertCircle, WifiOff } from \"lucide-react\";\nimport type { VaniViewProps } from \"../types\";\n\nexport function PipMode({ status, transcript, error, connect, cancel, onTogglePip }: VaniViewProps) {\n const [isExpanded, setIsExpanded] = useState(true);\n\n const isListening = status === \"listening\";\n const isThinking = status === \"processing\";\n const isSpeaking = status === \"speaking\";\n const isDisconnected = status === \"disconnected\";\n const isError = status === \"error\";\n\n const getStatusColor = () => {\n if (isListening) return \"bg-green-500\";\n if (isThinking) return \"bg-yellow-500\";\n if (isSpeaking) return \"bg-blue-500\";\n if (isError) return \"bg-red-500\";\n if (isDisconnected) return \"bg-zinc-500\";\n return \"bg-zinc-700\";\n };\n\n const getStatusIcon = () => {\n if (isListening) return <Radio className=\"w-4 h-4 text-white animate-pulse\" />;\n if (isThinking) return <Loader2 className=\"w-4 h-4 text-white animate-spin\" />;\n if (isSpeaking) return <Volume2 className=\"w-4 h-4 text-white animate-bounce\" />;\n if (isError) return <AlertCircle className=\"w-4 h-4 text-white\" />;\n if (isDisconnected) return <WifiOff className=\"w-4 h-4 text-white\" />;\n return <Mic className=\"w-4 h-4 text-white\" />;\n };\n\n if (!isExpanded) {\n return (\n <div className=\"fixed bottom-4 right-4 z-50 animate-in slide-in-from-bottom-4 fade-in duration-300\">\n <button\n onClick={() => setIsExpanded(true)}\n className={`h-12 w-12 rounded-full shadow-lg flex items-center justify-center transition-all hover:scale-110 active:scale-95 ${getStatusColor()}`}\n title=\"Click to expand\"\n >\n {getStatusIcon()}\n </button>\n </div>\n );\n }\n\n return (\n <div className=\"fixed bottom-4 right-4 z-50 w-80 bg-zinc-900/95 backdrop-blur-md border border-zinc-800 rounded-xl shadow-2xl flex flex-col overflow-hidden animate-in slide-in-from-bottom-2 fade-in duration-300\">\n <div className=\"flex items-center justify-between px-3 py-2 bg-zinc-950/50 border-b border-zinc-800\">\n <div className=\"flex items-center gap-2\">\n <div className={`w-2 h-2 rounded-full ${getStatusColor()} ${isListening || isSpeaking ? \"animate-pulse\" : \"\"}`} />\n <span className=\"text-xs font-mono text-zinc-400 font-medium\">\n {isListening ? \"Listening\" : isThinking ? \"Processing\" : isSpeaking ? \"Speaking\" : \"Idle\"}\n </span>\n </div>\n <div className=\"flex items-center gap-1\">\n {onTogglePip && (\n <button\n onClick={onTogglePip}\n className=\"p-1.5 hover:bg-zinc-800 rounded text-zinc-500 hover:text-zinc-300 transition-colors\"\n title=\"Maximize to Full Screen\"\n >\n <Maximize2 className=\"w-3.5 h-3.5\" />\n </button>\n )}\n <button\n onClick={() => setIsExpanded(false)}\n className=\"p-1.5 hover:bg-zinc-800 rounded text-zinc-500 hover:text-zinc-300 transition-colors\"\n title=\"Minimize\"\n >\n <X className=\"w-3.5 h-3.5\" />\n </button>\n </div>\n </div>\n\n <div className=\"p-4 flex flex-col gap-4 min-h-[120px]\">\n <div className=\"flex justify-center py-2\">\n <button\n onClick={() => {\n if (isDisconnected || isError) connect();\n else if (isThinking || isSpeaking) cancel();\n }}\n className={`w-16 h-16 rounded-full flex items-center justify-center transition-all duration-300\n ${isListening ? \"bg-green-500/20 shadow-[0_0_20px_rgba(34,197,94,0.3)]\" : isSpeaking ? \"bg-blue-500/20 shadow-[0_0_20px_rgba(59,130,246,0.3)] hover:bg-red-500/20 hover:text-red-500 cursor-pointer\" : \"bg-zinc-800\"}`}\n title={isThinking || isSpeaking ? \"Stop\" : isError && error ? error : undefined}\n >\n {getStatusIcon()}\n </button>\n </div>\n\n <div className=\"flex-1 space-y-2 max-h-[150px] overflow-y-auto noscrollbar mask-gradient-b\">\n {!transcript || transcript.length === 0 ? (\n <div className=\"text-center text-zinc-600 text-xs py-2 italic\">\n {isDisconnected ? \"Disconnected\" : \"Conversation will appear here...\"}\n </div>\n ) : (\n transcript.slice(-2).map((msg: any) => (\n <div key={msg.id} className={`flex flex-col ${msg.role === \"user\" ? \"items-end\" : \"items-start\"}`}>\n <div\n className={`px-2 py-1.5 rounded-lg max-w-[90%] text-xs leading-relaxed\n ${msg.role === \"user\" ? \"bg-zinc-800 text-zinc-300\" : \"bg-blue-900/10 text-blue-100 border border-blue-500/10\"}`}\n >\n {msg.content}\n </div>\n </div>\n ))\n )}\n </div>\n </div>\n </div>\n );\n}\n\n","import { useState } from \"react\";\nimport { useVoiceSession } from \"@shvm/vani-client/headless\";\nimport { FullScreenMode } from \"../modes/FullScreenMode\";\nimport { PipMode } from \"../modes/PipMode\";\nimport type { VoiceConfig } from \"@shvm/vani-client/shared\";\nimport type { VaniProps } from \"../types\";\n\nexport default function VaniClient({\n onError,\n onMessage,\n initialTranscript,\n defaultMode = \"full\",\n mode: controlledMode,\n onModeChange,\n initialConfig,\n serverUrl,\n}: VaniProps) {\n const [internalMode, setInternalMode] = useState<\"full\" | \"pip\">(defaultMode);\n const [config, setConfig] = useState<VoiceConfig>(\n initialConfig || {\n sttModel: \"@cf/openai/whisper-tiny-en\",\n llmModel: \"@cf/meta/llama-3.1-8b-instruct\",\n tts: { model: \"@cf/deepgram/aura-2-en\", speaker: \"luna\" },\n mcpServer: \"https://shvm.in/mcp\"\n },\n );\n const [feedback, setFeedback] = useState<string | null>(null);\n\n const currentMode = controlledMode ?? internalMode;\n\n const handleFeedback = (message: string) => {\n setFeedback(message);\n setTimeout(() => setFeedback(null), 3000);\n };\n\n const session = useVoiceSession({\n onError,\n onMessage,\n initialTranscript,\n config,\n onFeedback: handleFeedback,\n serverUrl,\n });\n\n const handleToggleMode = () => {\n const newMode = currentMode === \"full\" ? \"pip\" : \"full\";\n if (controlledMode === undefined) {\n setInternalMode(newMode);\n }\n onModeChange?.(newMode);\n };\n\n return (\n <div className=\"vani-root\">\n {currentMode === \"pip\" ? (\n <PipMode\n {...session}\n onTogglePip={handleToggleMode}\n config={config}\n setConfig={setConfig}\n feedback={feedback}\n />\n ) : (\n <FullScreenMode\n {...session}\n onTogglePip={handleToggleMode}\n config={config}\n setConfig={setConfig}\n feedback={feedback}\n />\n )}\n </div>\n );\n}\n","import { useState, useEffect, Suspense, lazy } from \"react\";\nimport type { VaniProps } from \"../types\";\n\nconst VaniClient = lazy(() => import(\"./VaniClient\"));\n\nexport type { VaniProps };\n\nexport function Vani(props: VaniProps) {\n const [mounted, setMounted] = useState(false);\n useEffect(() => {\n setMounted(true);\n }, []);\n\n if (!mounted) return null;\n\n return (\n <Suspense fallback={null}>\n <VaniClient {...props} />\n </Suspense>\n );\n}\n\n"]}
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
declare const STT_MODELS: readonly ["@cf/openai/whisper", "@cf/openai/whisper-tiny-en"];
|
|
2
|
+
type STTModelId = (typeof STT_MODELS)[number];
|
|
3
|
+
declare const LLM_MODELS: readonly ["@cf/meta/llama-3.1-8b-instruct", "@cf/meta/llama-3-8b-instruct", "@cf/meta/llama-2-7b-chat-int8", "@cf/mistral/mistral-7b-instruct-v0.1"];
|
|
4
|
+
type LLMModelId = (typeof LLM_MODELS)[number];
|
|
5
|
+
declare const TTS_MODELS: readonly ["@cf/deepgram/aura-2-en", "@cf/deepgram/aura-1"];
|
|
6
|
+
type TTSModelId = (typeof TTS_MODELS)[number];
|
|
7
|
+
declare const TTS_MODEL_VOICES: {
|
|
8
|
+
readonly "@cf/deepgram/aura-2-en": readonly ["asteria", "luna", "arcas", "athena", "helios", "orpheus", "perseus", "angus"];
|
|
9
|
+
readonly "@cf/deepgram/aura-1": readonly ["asteria", "luna", "stella", "athena", "hera", "orion", "arcas", "perseus", "angus", "orpheus", "helios", "zeus"];
|
|
10
|
+
};
|
|
11
|
+
type TtsVoiceForModel<T extends TTSModelId> = (typeof TTS_MODEL_VOICES)[T][number];
|
|
12
|
+
type TtsVoiceId = (typeof TTS_MODEL_VOICES)[TTSModelId][number];
|
|
13
|
+
|
|
14
|
+
type ChatRole = "user" | "assistant" | "system";
|
|
15
|
+
type VoiceStatus = "disconnected" | "connecting" | "idle" | "listening" | "processing" | "speaking" | "error";
|
|
16
|
+
type SessionStatus = "idle" | "listening" | "thinking" | "speaking" | "error";
|
|
17
|
+
interface VoiceConfig {
|
|
18
|
+
sttModel?: STTModelId;
|
|
19
|
+
llmModel?: LLMModelId;
|
|
20
|
+
mcpServer?: string;
|
|
21
|
+
tts?: {
|
|
22
|
+
speaker?: TtsVoiceId;
|
|
23
|
+
encoding?: "mp3" | "opus" | "aac" | "lossless";
|
|
24
|
+
container?: "mp3" | "ogg" | "aac" | "wav";
|
|
25
|
+
sample_rate?: 16000 | 24000 | 44100 | 48000;
|
|
26
|
+
bit_rate?: number;
|
|
27
|
+
model?: TTSModelId;
|
|
28
|
+
};
|
|
29
|
+
}
|
|
30
|
+
interface ClientMessage {
|
|
31
|
+
id: string;
|
|
32
|
+
role: ChatRole;
|
|
33
|
+
content: string;
|
|
34
|
+
timestamp: number;
|
|
35
|
+
toolCalls?: {
|
|
36
|
+
name: string;
|
|
37
|
+
status: 'calling' | 'finished';
|
|
38
|
+
}[];
|
|
39
|
+
}
|
|
40
|
+
interface ServerMessage {
|
|
41
|
+
id: string;
|
|
42
|
+
role: ChatRole;
|
|
43
|
+
content: string;
|
|
44
|
+
created_at: number;
|
|
45
|
+
toolCalls?: {
|
|
46
|
+
name: string;
|
|
47
|
+
status: 'calling' | 'finished';
|
|
48
|
+
}[];
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
export { type ChatRole as C, type LLMModelId as L, type STTModelId as S, type TTSModelId as T, type VoiceConfig as V, type ClientMessage as a, LLM_MODELS as b, STT_MODELS as c, type ServerMessage as d, type SessionStatus as e, TTS_MODELS as f, TTS_MODEL_VOICES as g, type TtsVoiceForModel as h, type TtsVoiceId as i, type VoiceStatus as j };
|
package/package.json
ADDED
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@shvm/vani-client",
|
|
3
|
+
"version": "0.0.2",
|
|
4
|
+
"private": false,
|
|
5
|
+
"description": "Minimal, opinionated headless voice agent client for the web (React hook + shared contracts).",
|
|
6
|
+
"type": "module",
|
|
7
|
+
"sideEffects": false,
|
|
8
|
+
"files": [
|
|
9
|
+
"dist"
|
|
10
|
+
],
|
|
11
|
+
"main": "./dist/index.js",
|
|
12
|
+
"types": "./dist/index.d.ts",
|
|
13
|
+
"exports": {
|
|
14
|
+
".": {
|
|
15
|
+
"types": "./dist/index.d.ts",
|
|
16
|
+
"default": "./dist/index.js"
|
|
17
|
+
},
|
|
18
|
+
"./shared": {
|
|
19
|
+
"types": "./dist/shared/index.d.ts",
|
|
20
|
+
"default": "./dist/shared/index.js"
|
|
21
|
+
},
|
|
22
|
+
"./headless": {
|
|
23
|
+
"types": "./dist/headless/index.d.ts",
|
|
24
|
+
"default": "./dist/headless/index.js"
|
|
25
|
+
},
|
|
26
|
+
"./ui": {
|
|
27
|
+
"types": "./dist/ui/index.d.ts",
|
|
28
|
+
"default": "./dist/ui/index.js"
|
|
29
|
+
}
|
|
30
|
+
},
|
|
31
|
+
"repository": {
|
|
32
|
+
"type": "git",
|
|
33
|
+
"url": "https://github.com/shivamd20/shvm-in"
|
|
34
|
+
},
|
|
35
|
+
"publishConfig": {
|
|
36
|
+
"access": "public"
|
|
37
|
+
},
|
|
38
|
+
"keywords": [
|
|
39
|
+
"voice",
|
|
40
|
+
"agent",
|
|
41
|
+
"react",
|
|
42
|
+
"websocket",
|
|
43
|
+
"vad",
|
|
44
|
+
"xstate"
|
|
45
|
+
],
|
|
46
|
+
"license": "MIT",
|
|
47
|
+
"engines": {
|
|
48
|
+
"node": ">=18"
|
|
49
|
+
},
|
|
50
|
+
"scripts": {
|
|
51
|
+
"build": "tsup",
|
|
52
|
+
"typecheck": "tsc -p tsconfig.json --noEmit"
|
|
53
|
+
},
|
|
54
|
+
"peerDependencies": {
|
|
55
|
+
"react": "^19.0.0"
|
|
56
|
+
},
|
|
57
|
+
"dependencies": {
|
|
58
|
+
"@ricky0123/vad-react": "^0.0.33",
|
|
59
|
+
"@xstate/react": "^6.0.0",
|
|
60
|
+
"lucide-react": "^0.561.0",
|
|
61
|
+
"onnxruntime-web": "^1.22.0",
|
|
62
|
+
"xstate": "^5.28.0"
|
|
63
|
+
},
|
|
64
|
+
"devDependencies": {
|
|
65
|
+
"tsup": "^8.5.0",
|
|
66
|
+
"typescript": "^5.7.2"
|
|
67
|
+
}
|
|
68
|
+
}
|