sycoraxai-voice-assistants
Version:
A voice assistant package for React applications supporting multiple providers including LiveKit, Retell, and TargetAI
140 lines (139 loc) • 6.37 kB
JavaScript
;
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
var desc = Object.getOwnPropertyDescriptor(m, k);
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
desc = { enumerable: true, get: function() { return m[k]; } };
}
Object.defineProperty(o, k2, desc);
}) : (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
o[k2] = m[k];
}));
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
Object.defineProperty(o, "default", { enumerable: true, value: v });
}) : function(o, v) {
o["default"] = v;
});
var __importStar = (this && this.__importStar) || (function () {
var ownKeys = function(o) {
ownKeys = Object.getOwnPropertyNames || function (o) {
var ar = [];
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
return ar;
};
return ownKeys(o);
};
return function (mod) {
if (mod && mod.__esModule) return mod;
var result = {};
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
__setModuleDefault(result, mod);
return result;
};
})();
Object.defineProperty(exports, "__esModule", { value: true });
exports.VoiceAssistant = VoiceAssistant;
const react_1 = __importStar(require("react"));
const index_1 = require("../index");
const LiveKitProvider_1 = require("./LiveKitProvider");
const RetellProvider_1 = require("./RetellProvider");
const SimpleVoiceAssistant_1 = require("./SimpleVoiceAssistant");
const RetellSimpleVoiceAssistant_1 = require("./RetellSimpleVoiceAssistant");
function VoiceAssistant({ connectionDetails, config, children, onAssistantReady }) {
const [assistant, setAssistant] = (0, react_1.useState)(null);
const [isConnecting, setIsConnecting] = (0, react_1.useState)(false);
const [isConnected, setIsConnected] = (0, react_1.useState)(false);
const [error, setError] = (0, react_1.useState)(null);
(0, react_1.useEffect)(() => {
if (!connectionDetails)
return;
const payload = connectionDetails.payload;
// Reset connection state when connection details change
setIsConnected(false);
setIsConnecting(false);
setError(null);
// Create assistant based on provider
try {
if (connectionDetails.provider === 'livekit') {
const liveKitAssistant = (0, index_1.createLiveKitVoiceAssistant)(config);
setAssistant(liveKitAssistant);
}
else if (connectionDetails.provider === 'retell') {
const retellAssistant = (0, index_1.createRetellVoiceAssistant)(config);
setAssistant(retellAssistant);
}
else {
setError(`Provider ${connectionDetails.provider} is not supported yet`);
}
}
catch (err) {
setError(err instanceof Error ? err.message : 'Failed to create voice assistant');
}
}, [connectionDetails, config]);
// Auto-connect when assistant is ready
(0, react_1.useEffect)(() => {
if (!assistant || !connectionDetails || isConnecting || isConnected)
return;
const handleConnect = async () => {
setIsConnecting(true);
setError(null);
try {
if (connectionDetails.provider === 'livekit') {
await assistant.connect(connectionDetails.payload);
}
else if (connectionDetails.provider === 'retell') {
await assistant.connect(connectionDetails.payload.payload);
}
setIsConnected(true);
// Call onAssistantReady with the disconnect function
if (onAssistantReady) {
onAssistantReady(() => {
assistant.disconnect();
setIsConnected(false);
});
}
}
catch (err) {
setError(err instanceof Error ? err.message : 'Connection failed');
}
finally {
setIsConnecting(false);
}
};
handleConnect();
}, [assistant, connectionDetails, isConnecting, isConnected]);
if (error) {
return (react_1.default.createElement("div", { className: "flex items-center justify-center h-full" },
react_1.default.createElement("div", { className: "text-red-500" },
"Error: ",
error)));
}
if (!connectionDetails) {
return (react_1.default.createElement("div", { className: "flex items-center justify-center h-full" },
react_1.default.createElement("div", null, "Loading connection details...")));
}
if (!assistant) {
return (react_1.default.createElement("div", { className: "flex items-center justify-center h-full" },
react_1.default.createElement("div", null, "Initializing voice assistant...")));
}
if (isConnecting) {
return (react_1.default.createElement("div", { className: "flex items-center justify-center h-full" },
react_1.default.createElement("div", null, "Connecting...")));
}
// Render based on provider
if (connectionDetails.provider === 'livekit') {
return (react_1.default.createElement(LiveKitProvider_1.LiveKitProvider, { voiceAssistant: assistant },
react_1.default.createElement(SimpleVoiceAssistant_1.SimpleVoiceAssistant, null, children)));
}
if (connectionDetails.provider === 'retell') {
return (react_1.default.createElement(RetellProvider_1.RetellProvider, { voiceAssistant: assistant },
react_1.default.createElement(RetellSimpleVoiceAssistant_1.RetellSimpleVoiceAssistant, null, children)));
}
// Fallback for unsupported providers
return (react_1.default.createElement("div", { className: "flex items-center justify-center h-full" },
react_1.default.createElement("div", null,
"Provider ",
connectionDetails.provider,
" not implemented yet")));
}