import * as zeroruntime from '@zeroruntime/js-sdk';
import { Agent, EOUConfig, InterruptConfig, Pipeline, Room } from '@zeroruntime/js-sdk';
import { DeepgramSTT, GoogleLLM, CartesiaTTS, SileroVAD, RNNoise } from '@zeroruntime/js-sdk/plugins';
import { TurnDetector } from '@zeroruntime/js-sdk/inference';
const AGENT_ID = 'assistant';
const pipeline = Pipeline({
stt: DeepgramSTT(),
llm: GoogleLLM({ model: 'gemini-2.5-flash', max_output_tokens: 8192 }),
tts: CartesiaTTS(),
vad: SileroVAD({ threshold: 0.4 }),
turn_detector: TurnDetector({ model: 'echo-large' }),
denoise: RNNoise(),
eou_config: EOUConfig({ mode: 'ADAPTIVE', min_max_speech_wait_timeout: [0.1, 0.3] }),
interrupt_config: InterruptConfig({
interrupt_min_duration: 0.5,
interrupt_min_words: 2,
resume_on_false_interrupt: true,
}),
});
class Assistant extends Agent {
constructor() {
super({
agent_id: AGENT_ID,
instructions: 'You are a friendly voice assistant. Keep replies short.',
pipeline,
});
}
async on_enter() {
await this.session!.say('Hi! How can I help?');
}
}
// Pass the class itself (not an instance): serve() builds a fresh Assistant +
// pipeline per call, which is required for correct per-call state under concurrent calls.
await zeroruntime.serve(Assistant, {
on_ready: () => zeroruntime.invoke(AGENT_ID, { room: Room({ playground: true }) }),
});