DBDelve
Dive deep into your data. A fast, native, multi-engine database client written in Rust. Free and open source, no telemetry.
Speko is the OpenRouter for Voice AI, the first proxyless, zero-latency model router for voice AI.
Developer toolsGo · PythonGitHub @SpekoAIOnlineOwner unconfirmed
Have you tried it? One tap is enough. No sign-in needed.
Open customer-side data plane for real-time voice AI
Loading the full README.
Read the full README ↗Speko Gateway is the open customer-side runtime for real-time voice AI. It gives agents one local streaming protocol across voice providers, keeps BYOK credentials inside your process, and can optionally use Speko for managed routing, observability, and consolidated billing.
Early preview: the protocol is versioned, but breaking changes may occur before the first stable release.
Pin a released version in production. Each release has notes on the releases page. Watch the repo with Custom → Releases to get notified.
| Tag | What it points to | Use it for |
|---|---|---|
0.1.0 | One exact release. The workflow refuses to rebuild a released version. | Production, when you want to choose every upgrade. |
0.1 | The newest 0.1.x release. Gets fixes only. | Production, when you want fixes automatically. |
latest, edge, sha-<commit> | Every merge to main. Moves several times a day. | Testing unreleased changes. Not for production. |
Gateway includes native Pipecat STTService and TTSService processors with
utterance commits, streaming sentence synthesis, barge-in cancellation, and a
Pipecat Cloud-compatible sidecar startup hook. See the complete
Pipecat integration guide.
The public image contains both the Gateway binary and its Python integration. Apply this diff to the official LiveKit Python agent starter Dockerfile:
ARG PYTHON_VERSION=3.14
+FROM spekoai/gateway:0.1 AS speko-gateway
FROM ghcr.io/astral-sh/uv:python${PYTHON_VERSION}-bookworm-slim AS base
FROM base AS build
WORKDIR /app
COPY pyproject.toml uv.lock ./
RUN mkdir -p src
RUN uv sync --locked
+COPY --from=speko-gateway /opt/speko/python /opt/speko/python
+RUN uv pip install --python /app/.venv/bin/python /opt/speko/python
RUN uv run --module livekit.agents download-files
COPY . .
FROM base
ARG UID=10001
RUN adduser \
--disabled-password \
--gecos "" \
--home "/app" \
--shell "/sbin/nologin" \
--uid "${UID}" \
appuser
COPY --from=build --chown=appuser:appuser /app /app
+COPY --from=speko-gateway /usr/local/bin/speko-gateway /usr/local/bin/speko-gateway
+RUN install -d -o appuser -g appuser -m 0700 /run/speko
WORKDIR /app
USER appuser
-CMD ["uv", "run", "src/agent.py", "start"]
+CMD ["sh", "-c", "/usr/local/bin/speko-gateway & exec uv run src/agent.py start"]
Then select Speko for the voice legs where the agent creates its
AgentSession:
from livekit.plugins import openai
from speko_gateway.livekit import STT, TTS
session = AgentSession(
stt=STT(
language="en", # default
provider="auto", # default; set when several BYOK STT keys exist
model="auto", # default: the provider's catalog default
credential_source="auto", # or "byok" / "managed"
sample_rate=16_000, # default
),
llm=openai.LLM(model="gpt-4.1-mini"), # any LiveKit LLM plugin
tts=TTS(
provider="auto", # default: the configured BYOK vendor, or the managed plan's pick
model="auto", # default: the provider's catalog default
voice="", # default: request, configured fallback, or catalog default
language="en", # default
sample_rate=24_000, # default
credential_source="auto", # or "byok" / "managed"
),
)
With a Speko API key the LLM can come from Speko too, served by the hosted
Router (router.speko.dev):
from speko_gateway.livekit import LLM, STT, TTS
session = AgentSession(
stt=STT(),
llm=LLM(
provider="auto", # default: relay picks; set with model= to pin a route
model="auto", # default: GET router.speko.dev/v1/models lists the options
objective="balanced", # default: or "quality", "latency", "cost"
max_output_tokens=8_192, # default
reasoning_effort=None, # default: provider default; or "none" ... "xhigh"
),
tts=TTS(),
)
reasoning_effort is the Router's reasoning control. Use "none" to turn
reasoning off. "minimal" asks for the least reasoning the routed model allows
(the Router maps it onto each provider's own scale), and "low", "medium",
"high" and "xhigh" ask for more. Unset, no field is sent and the provider
default applies. Any other value raises ValueError when the LLM is
constructed. While reasoning is enabled (any value but "none") the Router
refuses temperature and top_p.
"none" is accepted on models that cannot reason, where it changes nothing,
except on older Routers, which refuse it there (e.g. on gpt-4.1). Four models
always reason and refuse "none"; "minimal" is their floor: Inception
mercury-voice, gpt-oss-120b on Cerebras and Together, and Together
zai-org/GLM-5.3-Flash. Every other value, "minimal" included, needs a model
that can reason: a pinned model that cannot is refused
(capability_unsupported), and auto routing considers only models that can.
STT accepts transcription options in the same canonical vocabulary as the hosted Speko API, plus a per-vendor passthrough for each provider's own settings:
This is the beginning of the README. Read the rest at the original. Read the full README ↗