@echopilot/web-sdk v1.4.0
EchoPilot Web SDK
A powerful web SDK for integrating EchoPilot's voice AI capabilities into your web applications. This SDK provides a seamless way to add voice interactions, real-time transcription, and AI-powered conversations to your web apps.
Features
- 🎙️ Real-time voice interactions
- 🤖 AI-powered conversations
- 🔊 Text-to-speech capabilities
- 🎧 Audio device management
- 📊 Usage tracking
- 🔄 Event-driven architecture
- 🛡️ Error handling and logging
- 🎯 Smart Voice Activity Detection (VAD)
Installation
npm install @echopilot/web-sdkQuick Start
import EchoPilot from '@echopilot/web-sdk';
// Initialize the SDK with your API key
const echopilot = new EchoPilot('your-api-key');
// Configure your assistant
const assistantConfig = {
model: {
provider: 'openai',
model: 'gpt-4',
messages: [
{
role: 'system',
content: 'You are a helpful assistant.'
}
]
},
voice: {
provider: '11labs',
voiceId: 'your-voice-id'
}
};
// Start a conversation
await echopilot.start(assistantConfig);
// Send a message
await echopilot.send({
type: 'add-message',
message: {
role: 'user',
content: 'Hello!'
}
});
// Listen for events
echopilot.on('message', (message) => {
console.log('Received message:', message);
});
echopilot.on('error', (error) => {
console.error('Error:', error);
});
// Stop the conversation
await echopilot.stop();API Reference
Constructor
new EchoPilot(apiKey: string)Creates a new EchoPilot instance.
apiKey- Your EchoPilot API key
Methods
start(assistant: AssistantConfig | string, assistantOverrides?: any)
Starts a conversation with the specified assistant configuration.
await echopilot.start(assistantConfig);assistant- Assistant configuration object or IDassistantOverrides- Optional overrides for the assistant configuration- Returns: Promise that resolves when the conversation starts
- Throws: Error if initialization fails or conversation cannot be started
stop()
Ends the current conversation and tracks usage.
await echopilot.stop();- Returns: Promise that resolves when the conversation ends
- Throws: Error if the conversation cannot be stopped
send(message: { type: 'add-message'; message: Message })
Sends a message to the assistant.
await echopilot.send({
type: 'add-message',
message: {
role: 'user',
content: 'Hello!'
}
});message- The message to send- Returns: Promise that resolves when the message is sent
- Throws: Error if the message cannot be sent
on(event: EventType, callback: EventCallback)
Registers an event handler.
echopilot.on('message', (message) => {
console.log('Received message:', message);
});event- The event to listen forcallback- The callback function to handle the event
off(event: EventType, callback: EventCallback)
Removes an event handler.
echopilot.off('message', messageHandler);event- The event to stop listening forcallback- The callback function to remove
setMuted(muted: boolean)
Controls the microphone mute state.
echopilot.setMuted(true);muted- Whether to mute the microphone
isMuted(): boolean
Returns the current microphone mute state.
const isMuted = echopilot.isMuted();- Returns: boolean indicating if the microphone is muted
setSpeakerMuted(muted: boolean)
Controls the speaker mute state.
echopilot.setSpeakerMuted(true);muted- Whether to mute the speaker
isSpeakerMuted(): boolean
Returns the current speaker mute state.
const isSpeakerMuted = echopilot.isSpeakerMuted();- Returns: boolean indicating if the speaker is muted
say(message: string, endCallAfterSpoken?: boolean)
Makes the assistant speak a message.
await echopilot.say('Hello!', false);message- The message to speakendCallAfterSpoken- Whether to end the call after speaking- Returns: Promise that resolves when the message is spoken
getAudioDevices(): Promise
Gets a list of available audio input and output devices.
const devices = await echopilot.getAudioDevices();
console.log('Input devices:', devices.inputs);
console.log('Output devices:', devices.outputs);- Returns: Promise Object containing arrays of input and output devices
- Throws: Error if device access is denied or not available
setInputDevice(deviceId: string)
Set the active audio input device (microphone).
await echopilot.setInputDevice('device-id');deviceId- The ID of the input device to use- Throws: Error if the device cannot be set or doesn't exist
setOutputDevice(deviceId: string)
Set the active audio output device (speaker/headphones).
await echopilot.setOutputDevice('device-id');deviceId- The ID of the output device to use- Throws: Error if the device cannot be set or doesn't exist
configureVAD(config: Partial)
Configure Voice Activity Detection (VAD) settings.
echopilot.configureVAD({
threshold: 0.15, // Minimum volume level to consider as speech (0-1)
silenceDuration: 800, // Duration of silence to consider speech ended (ms)
minSpeechDuration: 300, // Minimum duration of speech to consider valid (ms)
enabled: true // Whether VAD is enabled
});config- Partial VAD configuration objectthreshold- Minimum volume level to consider as speech (0-1)silenceDuration- Duration of silence to consider speech ended (ms)minSpeechDuration- Minimum duration of speech to consider valid (ms)enabled- Whether VAD is enabled
getVADConfig(): VADConfig
Get current VAD configuration.
const config = echopilot.getVADConfig();
console.log('Current VAD config:', config);- Returns: Current VAD configuration object
Events
The SDK emits various events that you can listen to:
call-start: Fired when a call startscall-end: Fired when a call endsspeech-start: Fired when speech beginsspeech-end: Fired when speech endsvolume-level: Fired with current volume level (number)user-speaking: Fired when VAD state changes (isSpeaking: boolean, volume: number)message: Fired when a message is receivederror: Fired when an error occursusage-update: Fired when usage tracking updateserror-logged: Fired when an error is logged
Types
AssistantConfig
interface AssistantConfig {
model: {
provider: 'openai';
model: 'gpt-3.5-turbo' | 'gpt-4' | 'gpt-4-turbo-preview';
messages: Array<{
role: 'system' | 'user' | 'assistant' | 'function' | 'tool';
content: string;
}>;
};
voice: {
provider: '11labs';
voiceId: string;
};
}Message
type Message = TranscriptMessage | FunctionCallMessage | FunctionCallResultMessage;
interface TranscriptMessage {
type: 'transcript';
role: 'user' | 'system' | 'assistant';
transcriptType: 'partial' | 'final';
transcript: string;
}
interface FunctionCallMessage {
type: 'function-call';
functionCall: {
name: string;
parameters: unknown;
};
}
interface FunctionCallResultMessage {
type: 'function-call-result';
functionCallResult: {
forwardToClientEnabled?: boolean;
result: unknown;
[key: string]: unknown;
};
}AudioDevices
interface AudioDevices {
inputs: Array<{
deviceId: string;
label: string;
kind: 'audioinput';
}>;
outputs: Array<{
deviceId: string;
label: string;
kind: 'audiooutput';
}>;
}VADConfig
interface VADConfig {
/** Minimum volume level to consider as speech (0-1) */
threshold: number;
/** Duration of silence to consider speech ended (in milliseconds) */
silenceDuration: number;
/** Minimum duration of speech to consider valid (in milliseconds) */
minSpeechDuration: number;
/** Whether VAD is enabled */
enabled: boolean;
}Error Handling
The SDK provides comprehensive error handling:
- All async methods throw errors that you should catch
- The
errorevent is emitted for runtime errors - Errors are automatically logged to the EchoPilot service
- Error types include:
InvalidKeyError: Invalid API keyRateLimitError: Rate limit exceededServiceError: General service errors
Example error handling:
try {
await echopilot.start(assistantConfig);
} catch (error) {
if (error instanceof InvalidKeyError) {
console.error('Invalid API key');
} else if (error instanceof RateLimitError) {
console.error('Rate limit exceeded');
} else {
console.error('Service error:', error);
}
}
echopilot.on('error', (error) => {
console.error('Runtime error:', error);
});Browser Support
The SDK works in all modern browsers that support:
- WebRTC
- MediaDevices API
- Web Audio API
License
MIT
10 months ago
10 months ago
10 months ago
10 months ago
10 months ago
10 months ago
11 months ago
11 months ago
11 months ago
11 months ago
11 months ago
11 months ago
11 months ago
11 months ago
11 months ago
11 months ago
11 months ago
11 months ago
11 months ago
11 months ago
11 months ago