Getting started
A talking voice agent, with one API key.
Clone, paste one key, run. Then shape behavior with skills and extend capabilities with plugins — or swap in your own STT, LLM, and TTS providers when you want finer control.
Prerequisites
- Go 1.25+ or Docker — either works
- One API key — an xAI key for the fastest path below, or provider keys for the classic pipeline
Fastest path: one key, speech-to-speech
A single model hears audio and answers with audio. One key instead of three, and lower latency because there are no handoffs between stages. Start here.
1. Clone and configure
git clone https://github.com/streamcoreai/streamcore-server.git
cd streamcore-server
cp config.toml.example config.tomlPut this in config.toml, using a key from x.ai:
config.toml
[server]
port = "8080"
[realtime]
provider = "grok"
[grok]
api_key = "xai-..."
model = "grok-voice-latest"
voice = "eve"
system_prompt = "You are a helpful assistant. Keep replies short and conversational."2. Run the server
go run .3. Connect a client
git clone https://github.com/streamcoreai/examples.git
cd examples/typescript
npm install
npm run devOpen http://localhost:3000, click Connect, and allow microphone access. You should be talking to it within a minute.
Classic pipeline: your own STT, LLM, and TTS
More control over each stage, in exchange for more accounts. Deepgram covers both STT and TTS, so the minimum here is two keys rather than three.
1. Clone and configure
git clone https://github.com/streamcoreai/streamcore-server.git
cd streamcore-server
cp config.toml.example config.tomlEdit config.toml with your API keys:
config.toml
[server]
port = "8080"
[plugins]
directory = "./plugins"
[pipeline]
barge_in = true
[stt]
provider = "deepgram"
[llm]
provider = "openai"
[tts]
provider = "deepgram"
[deepgram]
api_key = "your-deepgram-api-key"
model = "nova-3" # STT
tts_model = "aura-2-thalia-en" # TTS voice
[openai]
api_key = "your-openai-api-key"
model = "gpt-4o-mini"For a different voice, set tts.provider to cartesia, elevenlabs, or speechifyand add that provider’s key. See Configuration for every option.
2. Build and run
docker build -t streamcoreai-server .
docker run --rm -p 8080:8080 -v "$(pwd)/config.toml:/config.toml:ro" streamcoreai-server3. Connect a client
Clone the examples repo and start the browser client:
git clone https://github.com/streamcoreai/examples.git
cd examples/typescript
npm install
npm run devOpen http://localhost:3000 in your browser and click Connect. Allow microphone access when prompted.
Running without Docker
Run the server directly with Go.
1. Clone and configure
git clone https://github.com/streamcoreai/streamcore-server.git
cd streamcore-server
cp config.toml.example config.toml
# Edit config.toml with your API keys2. Run the server
go run .3. Connect a client
git clone https://github.com/streamcoreai/examples.git
cd examples/typescript
npm install
npm run devOpen http://localhost:3000 and click Connect.
Where credentials live
Provider keys are read from config.tomlonly — the server does not fall back to environment variables. To keep keys out of version control, mount the file at runtime rather than baking it into an image:
docker run --rm -p 8080:8080 \
-v "$(pwd)/config.toml:/config.toml:ro" \
streamcoreai-serverKeys stay on the server. Never ship a provider key to a browser client — the SDK only ever needs the WHIP URL. Environment variables are available to plugins, which is where secrets for your own backend belong.
Production Deployment
When deploying to the cloud (EC2, GCP, Azure), set your public IP and a TURN secret so browsers can connect through NAT:
config.toml for cloud
[server]
port = "8080"
public_ip = "1.2.3.4" # Your server's public IP
turn_secret = "your-secret" # Any random stringThe built-in STUN/TURN server starts automatically on UDP port 3478. Make sure your security group/firewall allows this port along with UDP ports 50001-60000 for relay traffic.
Verify It Works
After starting the server, check the health endpoint:
curl http://localhost:8080/healthYou should see a 200 response. The server logs will show loaded plugins and skills:
StreamCore AI server starting on :8080
loaded plugin: math.calculate (typescript)
loaded plugin: time.get (python)
loaded 2 plugins, 3 skillsServer Endpoints
| Method | Path | Description |
|---|---|---|
POST | /whip | WHIP signaling — SDP exchange, creates session |
DELETE | /whip/{id} | Teardown a session |
OPTIONS | /whip | CORS preflight |
GET | /health | Health check |
POST | /token | JWT token generation (optional) |