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.toml

Put 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 dev

Open http://localhost:3000, click Connect, and allow microphone access. You should be talking to it within a minute.

Building with an AI coding assistant? Point it at streamcore.ai/llms.txt first. StreamCore is newer than most model training data, so an assistant working from memory will invent an API that does not exist.

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.toml

Edit 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-server

3. 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 dev

Open 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 keys

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 dev

Open 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-server

Keys 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 string

The 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/health

You 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 skills

Server Endpoints

MethodPathDescription
POST/whipWHIP signaling — SDP exchange, creates session
DELETE/whip/{id}Teardown a session
OPTIONS/whipCORS preflight
GET/healthHealth check
POST/tokenJWT token generation (optional)

Next Steps