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();