1.0.5 • Published 5 months ago
akool-streaming-avatar-sdk v1.0.5
Akool Streaming Avatar SDK
A generic JavaScript SDK for integrating Agora RTC streaming avatar functionality into any JavaScript application.
Installation
NPM (Node.js/Modern JavaScript)
npm install akool-streaming-avatar-sdk
CDN (Browser)
<!-- Using unpkg -->
<script src="https://unpkg.com/akool-streaming-avatar-sdk"></script>
<!-- Using jsDelivr -->
<script src="https://cdn.jsdelivr.net/npm/akool-streaming-avatar-sdk"></script>
Usage
Modern JavaScript/TypeScript (ESM)
import { GenericAgoraSDK } from 'akool-streaming-avatar-sdk';
// Create an instance of the SDK
const agoraSDK = new GenericAgoraSDK({ mode: "rtc", codec: "vp8" });
// Register event handlers
agoraSDK.on({
onStreamMessage: (uid, message) => {
console.log("Received message from", uid, ":", message);
},
onException: (error) => {
console.error("An exception occurred:", error);
},
onMessageReceived: (message) => {
console.log("New message:", message);
},
onMessageUpdated: (message) => {
console.log("Message updated:", message);
},
onNetworkStatsUpdated: (stats) => {
console.log("Network stats:", stats);
},
onTokenWillExpire: () => {
console.log("Token will expire in 30s");
},
onTokenDidExpire: () => {
console.log("Token expired");
},
onUserPublished: async (user, mediaType) => {
if (mediaType === 'video') {
const remoteTrack = await agoraSDK.getClient().subscribe(user, mediaType);
remoteTrack?.play('your_video_element_id'); // play the video in a div with id your_video_element_id
} else if (mediaType === 'audio') {
const remoteTrack = await agoraSDK.getClient().subscribe(user, mediaType);
remoteTrack?.play();
}
}
});
// get session info from your backend
// # look at https://docs.akool.com/ai-tools-suite/live-avatar#create-session for more details on how to create session.
const akoolSession = await fetch('your-backend-url-to-get-session-info');
const { data: { credentials, id } } = await akoolSession.json();
// Join a channel
await agoraSDK.joinChannel({
agora_app_id: credentials.agora_app_id,
agora_channel: credentials.agora_channel,
agora_token: credentials.agora_token,
agora_uid: credentials.agora_uid
}).catch(error => {
console.error("Failed to join channel:", error);
});
// Initialize chat with avatar parameters
await agoraSDK.joinChat({
vid: "voice-id",
lang: "en",
mode: 2 || 1 // 1 for repeat mode, 2 for dialog mode
});
// Send a message
await agoraSDK.sendMessage("Hello, world!");
// Get all messages
const messages = agoraSDK.getMessages();
// Get a specific message
const message = agoraSDK.getMessage("message-id");
// Toggle microphone
await agoraSDK.toggleMic();
// Check states
const isMicOn = agoraSDK.isMicEnabled();
const isConnected = agoraSDK.isConnected();
const isJoined = agoraSDK.isChannelJoined();
// Interrupt current response
await agoraSDK.interrupt();
// Leave chat (keeps channel connection)
await agoraSDK.leaveChat();
// Leave channel
await agoraSDK.leaveChannel();
// Or close everything at once
await agoraSDK.closeStreaming();
CommonJS (Node.js)
const { GenericAgoraSDK } = require('akool-streaming-avatar-sdk');
// Create an instance of the SDK
const agoraSDK = new GenericAgoraSDK({ mode: "rtc", codec: "vp8" });
// Register event handlers
agoraSDK.on({
onStreamMessage: (uid, message) => {
console.log("Received message from", uid, ":", message);
},
onException: (error) => {
console.error("An exception occurred:", error);
},
onMessageReceived: (message) => {
console.log("New message:", message);
},
onMessageUpdated: (message) => {
console.log("Message updated:", message);
},
onNetworkStatsUpdated: (stats) => {
console.log("Network stats:", stats);
},
onTokenWillExpire: () => {
console.log("Token will expire in 30s");
},
onTokenDidExpire: () => {
console.log("Token expired");
},
onUserPublished: async (user, mediaType) => {
if (mediaType === 'video') {
const remoteTrack = await agoraSDK.getClient().subscribe(user, mediaType);
remoteTrack?.play('your_video_element_id'); // play the video in a div with id your_video_element_id
} else if (mediaType === 'audio') {
const remoteTrack = await agoraSDK.getClient().subscribe(user, mediaType);
remoteTrack?.play();
}
}
});
// Join a channel
agoraSDK.joinChannel({
agora_app_id: "your-app-id",
agora_channel: "your-channel",
agora_token: "your-token",
agora_uid: 12345
}).then(() => {
console.log("Joined channel");
}).catch((error) => {
console.error("Failed to join channel:", error);
});
// Initialize chat with avatar parameters
agoraSDK.joinChat({
vid: "voice-id",
lang: "en",
mode: 2
}).then(() => {
console.log("Initialized chat");
}).catch((error) => {
console.error("Failed to initialize chat:", error);
});
// Send a message
agoraSDK.sendMessage("Hello, world!").then(() => {
console.log("Message sent");
}).catch((error) => {
console.error("Failed to send message:", error);
});
// Get all messages
const messages = agoraSDK.getMessages();
// Get a specific message
const message = agoraSDK.getMessage("message-id");
// Toggle microphone
agoraSDK.toggleMic().then(() => {
console.log("Microphone toggled");
}).catch((error) => {
console.error("Failed to toggle microphone:", error);
});
// Check states
const isMicOn = agoraSDK.isMicEnabled();
const isConnected = agoraSDK.isConnected();
const isJoined = agoraSDK.isChannelJoined();
// Interrupt current response
agoraSDK.interrupt().then(() => {
console.log("Current response interrupted");
}).catch((error) => {
console.error("Failed to interrupt current response:", error);
});
// Leave chat (keeps channel connection)
agoraSDK.leaveChat().then(() => {
console.log("Left chat");
}).catch((error) => {
console.error("Failed to leave chat:", error);
});
// Leave channel
agoraSDK.leaveChannel().then(() => {
console.log("Left channel");
}).catch((error) => {
console.error("Failed to leave channel:", error);
});
// Or close everything at once
agoraSDK.closeStreaming().then(() => {
console.log("Closed streaming");
}).catch((error) => {
console.error("Failed to close streaming:", error);
});
Browser (Global/IIFE)
<script src="https://unpkg.com/akool-streaming-avatar-sdk"></script>
<script>
// The SDK is available as AkoolStreamingAvatar global
const agoraSDK = new AkoolStreamingAvatar.GenericAgoraSDK({ mode: "rtc", codec: "vp8" });
// Register event handlers
agoraSDK.on({
onStreamMessage: (uid, message) => {
console.log("Received message from", uid, ":", message);
},
onException: (error) => {
console.error("An exception occurred:", error);
},
onMessageReceived: (message) => {
console.log("New message:", message);
},
onMessageUpdated: (message) => {
console.log("Message updated:", message);
},
onNetworkStatsUpdated: (stats) => {
console.log("Network stats:", stats);
},
onTokenWillExpire: () => {
console.log("Token will expire in 30s");
},
onTokenDidExpire: () => {
console.log("Token expired");
},
onUserPublished: async (user, mediaType) => {
if (mediaType === 'video') {
const remoteTrack = await agoraSDK.getClient().subscribe(user, mediaType);
remoteTrack?.play('remote-video');
}
}
});
// Example functions
async function initializeSDK() {
// These values would typically come from your PHP backend
await agoraSDK.joinChannel({
agora_app_id: "YOUR_APP_ID",
agora_channel: "YOUR_CHANNEL",
agora_token: "YOUR_TOKEN",
agora_uid: 12345
});
await agoraSDK.joinChat({
vid: "YOUR_VOICE_ID",
lang: "en",
mode: 2
});
}
async function toggleMic() {
await agoraSDK.toggleMic();
}
async function sendMessage() {
await agoraSDK.sendMessage("Hello from PHP!");
}
// Initialize when page loads
initializeSDK().catch(console.error);
</script>
Features
- Easy-to-use API for Agora RTC integration
- TypeScript support with full type definitions
- Multiple bundle formats (ESM, CommonJS, IIFE)
- CDN distribution via unpkg and jsDelivr
- Event-based architecture for handling messages and state changes
- Message management with history and updates
- Network quality monitoring and statistics
- Microphone control for voice interactions
- Chunked message sending for large text
- Automatic rate limiting for message chunks
- Token expiry handling
- Error handling and logging
API Reference
Constructor
new GenericAgoraSDK(options?: { mode?: string; codec?: SDK_CODEC })
Methods
joinChannel(credentials: AgoraCredentials): Promise<void>
- Joins an Agora RTC channeljoinChat(metadata: Metadata): Promise<void>
- Initializes the avatar chat sessionsendMessage(content: string): Promise<void>
- Sends a message to the avatarinterrupt(): Promise<void>
- Interrupts the current avatar responsetoggleMic(): Promise<void>
- Toggles the microphone on/offisMicEnabled(): boolean
- Checks if microphone is enabledisConnected(): boolean
- Checks if connected to Agora servicesisChannelJoined(): boolean
- Checks if joined to a channelgetMessages(): Message[]
- Returns all chat messagesgetMessage(messageId: string): Message | undefined
- Returns a specific messageleaveChat(): Promise<void>
- Leaves the chat session but stays in channelleaveChannel(): Promise<void>
- Leaves the Agora RTC channelcloseStreaming(): Promise<void>
- Closes all connections and cleanupon(events: SDKEvents): void
- Registers event handlers
Events
The SDK supports the following events through the on()
method:
onStreamMessage
: Fired when a raw message is receivedonMessageReceived
: Fired when a new chat message is receivedonMessageUpdated
: Fired when an existing message is updatedonNetworkStatsUpdated
: Fired when network statistics are updatedonException
: Fired when an error occursonNetworkQuality
: Fired when network quality changesonUserJoined
: Fired when a user joins the channelonUserLeft
: Fired when a user leaves the channelonUserPublished
: Fired when a user publishes mediaonUserUnpublished
: Fired when a user stops publishing mediaonTokenWillExpire
: Fired when the token is about to expireonTokenDidExpire
: Fired when the token has expiredonRemoteAudioStats
: Fired when remote audio stats are updatedonRemoteVideoStats
: Fired when remote video stats are updated
Types
interface AgoraCredentials {
agora_app_id: string;
agora_channel: string;
agora_token: string;
agora_uid: number;
}
type Metadata = {
vid?: string; // voiceId
vurl?: string; // voiceUrl
lang?: string; // language
mode?: number; // modeType
bgurl?: string; // backgroundUrl
};
interface Message {
id: string;
text: string;
isSentByMe: boolean;
}
interface NetworkStats {
localNetwork: NetworkQuality;
remoteNetwork: NetworkQuality;
video: RemoteVideoTrackStats;
audio: RemoteAudioTrackStats;
}
Requirements
- Node.js 14 or higher (for development)
- Modern browser with WebRTC support
Browser Support
The SDK requires a modern browser with WebRTC support, including:
- Chrome 56+
- Firefox 44+
- Safari 11+
- Edge 79+
- Opera 43+
License
ISC License