Haygen
Research/01-heygen-sdk-api.md
HeyGen SDK API Reference Notes
Key findings from reading
@heygen/streaming-avatarv2.1.0 type definitions. Source:node_modules/@heygen/streaming-avatar/lib/index.d.ts
StreamingAvatar Class
constructor({ token, basePath }: StreamingAvatarApiConfig)
createStartAvatar(requestData: StartAvatarRequest): Promise<StartAvatarResponse>
speak(requestData: SpeakRequest): Promise<any>
startVoiceChat({ isInputAudioMuted }?: { isInputAudioMuted?: boolean }): Promise<void>
closeVoiceChat(): Promise<void>
on(eventType: string, listener: EventHandler): this
off(eventType: string, listener: EventHandler): this
interrupt(): Promise<any>
stopAvatar(): Promise<any>
keepAlive(): Promise<any>
muteInputAudio(): void
unmuteInputAudio(): void
pushToTalkStart(): Promise<void>
pushToTalkStop(): Promise<void>
StartAvatarRequest
{
avatarName: string
quality?: AvatarQuality // Low | Medium | High
language?: string // default 'en'
knowledgeBase?: string // system prompt string (full text, not an ID)
knowledgeId?: string // pre-created HeyGen KB ID (V2 enhancement)
}
SpeakRequest
{
text: string
taskType?: TaskType // REPEAT | TALK
taskMode?: TaskMode
}
StreamingEvents Enum (key events)
| Event | Fires when | Payload |
|---|---|---|
STREAM_READY |
WebRTC stream is ready | MediaStream |
STREAM_DISCONNECTED |
Session ends or connection drops | — |
AVATAR_START_TALKING |
Avatar begins speaking | — |
AVATAR_STOP_TALKING |
Avatar finishes speaking | — |
AVATAR_TALKING_MESSAGE |
Avatar speech text chunk | { message: string } |
USER_TALKING_MESSAGE |
User speech text chunk (ASR) | { message: string } |
USER_END_MESSAGE |
User stops speaking | { type: string, task_id: string } — NO message field |
Critical Finding: USER_END_MESSAGE
UserTalkingEndEvent definition:
interface UserTalkingEndEvent {
type: string
task_id: string
}
There is NO message field. Lite mode must accumulate from USER_TALKING_MESSAGE and drain on USER_END_MESSAGE. See ADR-003.
Package Quirk: CJS/ESM Conflict
@heygen/streaming-avatar declares "type": "module" but "main" points to a CJS file. In vitest, must use server.deps.inline. See ADR-004.
HeyGen REST API (Token Endpoint)
POST https://api.heygen.com/v1/streaming/create_token
Headers: X-Api-Key: {HEYGEN_API_KEY}
Response: { data: { token: string } }
Token is short-lived. Must be fetched server-side per session.
Knowledge Base API (V2 reference)
POST /v1/streaming/knowledge_base — create
GET /v1/streaming/knowledge_base/{id} — retrieve
DELETE /v1/streaming/knowledge_base/{id} — delete
Not used in MVP. For large reusable corpora in V2.
Credits
- Full mode: 1 credit = 30 seconds streaming
- Lite mode: 1 credit = 1 minute streaming