Skip to main content

Server Configuration

Complete reference for LLMRTCServer configuration options.

Core Options​

OptionTypeDefaultDescription
providersConversationProvidersrequiredLLM, STT, TTS provider instances
portnumber8787TCP port to listen on
hoststring'127.0.0.1'Bind address
systemPromptstring'You are a helpful realtime voice assistant.'Base system prompt
historyLimitnumber8Messages retained in context
streamingTTSbooleantrueEnable streaming TTS (requires FFmpeg)
heartbeatTimeoutnumber45000Milliseconds before disconnect on no heartbeat
corsCorsOptionsundefinedCORS configuration
interface ConversationProviders {
llm: LLMProvider;
stt: STTProvider;
tts: TTSProvider;
vision?: VisionProvider; // Optional for image analysis
}

Playbook Mode Options​

When using playbooks for multi-stage voice agents with tools:

OptionTypeDefaultDescription
playbookPlaybookundefinedPlaybook definition with stages/transitions
toolRegistryToolRegistryundefinedRegistry with tools (required with playbook)
playbookOptionsobjectsee belowPlaybook orchestrator options

Playbook Orchestrator Options (Server Level)​

At the server level, only the following options are supported:

interface ServerPlaybookOptions {
/** Maximum tool calls per turn in Phase 1 */
maxToolCallsPerTurn?: number; // Default: 10

/** Timeout for Phase 1 tool loop (ms) */
phase1TimeoutMs?: number; // Default: 60000 (1 minute)

/** Enable debug logging */
debug?: boolean; // Default: false
}
Core SDK Options

Additional options like historyLimit and llmRetries are available when using PlaybookOrchestrator directly via the core SDK. See Core SDK Playbooks for details.


ICE Server Configuration​

WebRTC requires ICE servers for NAT traversal. See Networking & TURN for details.

OptionTypeDescription
iceServersRTCIceServer[]Custom STUN/TURN servers
meteredobjectMetered TURN API configuration
// Option 1: Metered TURN (recommended)
const server = new LLMRTCServer({
providers: { llm, stt, tts },
metered: {
appName: 'your-app', // From Metered dashboard
apiKey: 'your-key', // API key
region: 'us_east' // Optional region preference
}
});

// Option 2: Custom ICE servers
const server = new LLMRTCServer({
providers: { llm, stt, tts },
iceServers: [
{ urls: 'stun:stun.example.com:3478' },
{
urls: 'turn:turn.example.com:3478',
username: 'user',
credential: 'pass'
}
]
});

Observability Options​

OptionTypeDescription
hooksServerHooks & OrchestratorHooksEvent callbacks for logging/monitoring
metricsMetricsAdapterMetrics adapter (Prometheus, DataDog, etc.)
import { createTimingHooks, ConsoleMetrics } from '@llmrtc/llmrtc-core';

const server = new LLMRTCServer({
providers: { llm, stt, tts },
hooks: createTimingHooks(),
metrics: new ConsoleMetrics() // For debugging
});

See Hooks & Metrics for complete hook reference.


Streaming TTS Options​

OptionTypeDescription
streamingTTSbooleanEnable low-latency streaming (default: true)
sentenceChunker(text: string) => string[]Custom sentence boundary detection

Custom Sentence Chunker:

For non-Latin languages or custom punctuation:

const server = new LLMRTCServer({
providers: { llm, stt, tts },
streamingTTS: true,
sentenceChunker: (text) => {
// Custom logic for CJK languages
return text.split(/[。!?]/g).filter(Boolean);
}
});

Complete Example​

import {
LLMRTCServer,
OpenAILLMProvider,
OpenAIWhisperProvider,
ElevenLabsTTSProvider,
ToolRegistry,
createTimingHooks
} from '@llmrtc/llmrtc-backend';

const server = new LLMRTCServer({
// Required
providers: {
llm: new OpenAILLMProvider({ apiKey: process.env.OPENAI_API_KEY! }),
stt: new OpenAIWhisperProvider({ apiKey: process.env.OPENAI_API_KEY! }),
tts: new ElevenLabsTTSProvider({ apiKey: process.env.ELEVENLABS_API_KEY! })
},

// Server
port: 8787,
host: '0.0.0.0',

// Conversation
systemPrompt: 'You are a helpful voice assistant.',
historyLimit: 8,
streamingTTS: true,

// Playbook mode (optional)
playbook: myPlaybook,
toolRegistry: myTools,
playbookOptions: {
maxToolCallsPerTurn: 10,
phase1TimeoutMs: 60000,
debug: false
},

// ICE servers
metered: {
appName: 'my-app',
apiKey: process.env.METERED_API_KEY!
},

// Observability
hooks: createTimingHooks(),

// Heartbeat
heartbeatTimeout: 45000
});

await server.start();