Configuration and service combinations¶
This guide describes the released 1.2.2 settings and the Scaleway root module. Choose your hosting mode, provider credentials, MCP authentication and result storage independently. A provider key pays for transcription; it is never the credential a client uses to access MCP.
Where configuration lives¶
| Installation | Settings | Secrets | Apply a change |
|---|---|---|---|
| Python HTTP server | OT_* environment variables, or .env in the working directory |
Environment or private .env |
Restart the process |
| Docker HTTP server | Inject OT_* through the container environment or --env-file |
Container secret injection or private environment file | Recreate the container |
| Scaleway with Terraform | infra/scaleway/terraform.tfvars |
secret_environment_variables |
Review terraform plan, then apply |
| Managed Linux desktop / STDIO | Setup's versioned TOML file passed with --config |
Secret Service keyring; TOML holds references | Apply through Setup and restart the client-owned engine |
For the ordinary HTTP command, environment variables override .env, which overrides built-in
defaults. Programmatic Settings(...) arguments take precedence over both. .env.local is not
loaded by the ordinary command; the live Groq tests load it explicitly. Managed desktop mode
ignores ambient OT_* and .env and accepts only its managed settings and keyring references.
Settings use OT_ and __ for nesting: OT_GROQ__API_KEY, for example. Lists such as
OT_SECURITY__ALLOWED_SOURCE_HOSTS use JSON, for example ["media.example.com"].
.env.example is a
settings inventory. Omit unused entries when making your runtime file: an empty URL or number
is not the same as an unset value, and an empty key can still appear configured.
Never copy that inventory unchanged and assume it is a working provider configuration.
config/routing.yaml contains quality/latency rankings and config/pricing.yaml contains
informational prices. These are bundled with the package; OT_CONFIG_DIR can select a custom
metadata directory. Editing a ranking does not add a provider adapter or grant capabilities.
Choose one or more transcription providers¶
Only configured adapters participate in hosted routing. Adding another key makes another provider available; it does not disable the existing one. Set the default provider and its matching model together. The defaults are a preference among compatible models, not a rule that prevents a caller from selecting another configured provider.
| Available service | Required secret | Additional setting | Matching default model | Speaker diarization |
|---|---|---|---|---|
| Microsoft | OT_MICROSOFT__API_KEY |
OT_MICROSOFT__ENDPOINT |
MAI-Transcribe-2 |
Supported |
| ElevenLabs | OT_ELEVENLABS__API_KEY |
Account must support the selected retention mode | scribe-v2 |
Supported |
| Groq | OT_GROQ__API_KEY |
None; standard API endpoint is built in | whisper-large-v3 or whisper-large-v3-turbo |
Not supported |
| Any combination | Each selected service's own key | Microsoft still needs its endpoint; ElevenLabs still needs retention eligibility | One default provider/model pair | Filtered per request |
The following are alternative minimal .env files, not blocks to concatenate unchanged.
Replace the example credentials and protect the resulting file with chmod 600 .env.
Use an actual Speech resource endpoint for Microsoft. Each file starts an authenticated HTTP
server locally; run it behind HTTPS when hosting remotely.
Groq only¶
OT_ENVIRONMENT=prod
OT_HOST=127.0.0.1
OT_DEFAULT_PROVIDER=groq
OT_DEFAULT_MODEL=whisper-large-v3-turbo
OT_GROQ__API_KEY=replace-with-your-groq-key
OT_SECURITY__AUTH_MODE=bearer
OT_SECURITY__BEARER_TOKEN=replace-with-a-long-random-value
OT_RESULT_STORE__BACKEND=disabled
Use transcript_style=verbatim. An explicit request for diarization or clean style is rejected
with strict capability checking. An ordinary request with those fields omitted works.
ElevenLabs only¶
OT_ENVIRONMENT=prod
OT_HOST=127.0.0.1
OT_DEFAULT_PROVIDER=elevenlabs
OT_DEFAULT_MODEL=scribe-v2
OT_ELEVENLABS__API_KEY=replace-with-your-elevenlabs-key
OT_ELEVENLABS__ZERO_RETENTION=true
OT_SECURITY__AUTH_MODE=bearer
OT_SECURITY__BEARER_TOKEN=replace-with-a-long-random-value
OT_RESULT_STORE__BACKEND=disabled
The ElevenLabs key needs Speech to Text → Access. Other endpoint permissions are not needed
for this adapter. A present key is not proof of correct permissions, balance or model access.
list_transcription_models(configured_only=true) and /readyz report configuration presence;
verify access with a short authorized transcription.
OpenTranscribe sends zero-retention requests by default. ElevenLabs reserves this option for
eligible Enterprise customers; see its zero-retention documentation
and transcription API.
For a standard account, change OT_ELEVENLABS__ZERO_RETENTION to false only after explicitly
accepting provider-side logging and retention. Keeping it true on an ineligible account can
make transcription fail. This provider option is independent of OpenTranscribe's result store.
Microsoft only¶
OT_ENVIRONMENT=prod
OT_HOST=127.0.0.1
OT_DEFAULT_PROVIDER=microsoft
OT_DEFAULT_MODEL=MAI-Transcribe-2
OT_MICROSOFT__ENDPOINT=https://YOUR-RESOURCE.cognitiveservices.azure.com
OT_MICROSOFT__API_KEY=replace-with-your-microsoft-key
OT_SECURITY__AUTH_MODE=bearer
OT_SECURITY__BEARER_TOKEN=replace-with-a-long-random-value
OT_RESULT_STORE__BACKEND=disabled
ElevenLabs and Groq on Scaleway¶
Copy this to a private terraform.tfvars, fill the placeholders and choose the ElevenLabs
retention mode deliberately. Do not put real credentials in terraform.tfvars.example.
project_id = "00000000-0000-0000-0000-000000000000"
region = "fr-par"
image_tag = "1.2.2"
auth_mode = "bearer"
environment_variables = {
OT_DEFAULT_PROVIDER = "elevenlabs"
OT_DEFAULT_MODEL = "scribe-v2"
OT_ELEVENLABS__ZERO_RETENTION = "true"
}
secret_environment_variables = {
OT_SECURITY__BEARER_TOKEN = "replace-with-a-long-random-value"
OT_ELEVENLABS__API_KEY = "replace-with-your-elevenlabs-key"
OT_GROQ__API_KEY = "replace-with-your-groq-key"
}
enable_result_store = false
tags = ["environment=production"]
To prefer Groq, change only OT_DEFAULT_PROVIDER to groq and OT_DEFAULT_MODEL to one of its
Whisper model names. Leave the ElevenLabs key to keep Scribe available for speaker turns.
To add Microsoft, add its key to the secrets map and its endpoint to the non-secret map.
Changing defaults or keys does not require rebuilding the image, but the container must be
redeployed with the updated environment.
In managed desktop mode, a stored key alone does not enable a provider. Setup must also explicitly enable it. Cross-provider fallback and temporary audio relay are separate permissions, both off by default. The desktop guide describes those controls.
Defaults, explicit choices and fallback¶
Capability filtering happens before ranking. Call list_transcription_models to inspect the
capabilities of your deployed version.
| Request | Behavior |
|---|---|
provider=auto, routing_policy=default |
Prefer the configured default pair when it satisfies the request; otherwise select a compatible model |
provider=auto with quality, cost or latency |
Rank only compatible configured models; rankings/prices are metadata, not an accuracy guarantee |
Explicit provider and model |
Start with that configured model; transient fallback may still reach other compatible models when allowed |
Explicit provider/model, routing_policy=fixed, allow_fallback=false |
Use only that model |
model with provider=auto, or fixed routing with provider=auto |
Invalid request |
diarization=true, strict_capabilities=true |
Require real speaker diarization; exclude both Groq models |
Capability omitted / null |
Bind it to the selected model's supported defaults and report the effective value in metadata |
strict_capabilities=false |
Permit capability downgrades and return warnings naming the dropped requirements |
Hosted requests default to allow_fallback=true. A second compatible provider can receive the
audio after a transient timeout, network error, 429 or 5xx. Set allow_fallback=false when only
one recipient is permitted. Fallback does not correct authentication errors, invalid input,
unsupported capabilities or rejected source URLs. Managed desktop policy can further restrict
fallback to models within the chosen provider even when the request allows fallback.
For a French conversation, explicitly request language=fr, diarization=true, segment
timestamps and strict capabilities. See the complete Scribe speaker-turn recipe.
Speaker labels such as SPEAKER_01 distinguish voices within a transcript; they never identify
people. Render segments, because the flat text field does not preserve speaker turns.
MCP authentication is a separate choice¶
All provider combinations work with either supported HTTP authentication mode.
| Transport and mode | Client credential | Server configuration |
|---|---|---|
| HTTP, bearer | Shared deployment token in Authorization: Bearer … |
OT_SECURITY__AUTH_MODE=bearer and OT_SECURITY__BEARER_TOKEN |
| HTTP, OIDC | User access token issued by your external identity provider | OIDC URLs, required scope and entitlement claim; no shared MCP bearer secret needed |
| Managed STDIO | Local user/process boundary | Setup configuration and keyring; no network endpoint or OAuth server |
For Terraform, use the top-level auth_mode = "bearer" or "oidc" input. The module sets
OT_SECURITY__AUTH_MODE itself; putting a different value in environment_variables cannot
override it. OIDC mode excludes OT_SECURITY__BEARER_TOKEN from the runtime secrets map.
Provider keys are still required in OIDC mode.
For OIDC, keep your provider settings and add this complete authentication block to the
non-secret map, with auth_mode = "oidc":
# Add these entries inside your existing environment_variables map.
OT_SECURITY__OIDC_ISSUER_URL = "https://id.example.com/realms/transcribe"
OT_SECURITY__OIDC_JWKS_URL = "https://id.example.com/realms/transcribe/protocol/openid-connect/certs"
OT_SECURITY__OIDC_PUBLIC_BASE_URL = "https://transcribe.example.com"
OT_SECURITY__OIDC_REQUIRED_SCOPE = "mcp:tools"
OT_SECURITY__OIDC_REQUIRED_CLAIM_PATH = "realm_access.roles"
OT_SECURITY__OIDC_REQUIRED_CLAIM_VALUE = "open-transcribe-user"
The public base URL is the HTTPS origin, without /mcp. Tokens must contain the configured
issuer, an exact audience of https://transcribe.example.com/mcp, valid expiry, the required
scope and the entitlement claim. Configure your identity provider and client together following
OIDC authentication. OpenTranscribe validates tokens; it does not host Keycloak
or issue OAuth tokens. Unauthenticated HTTP is rejected in production.
If a new Scaleway container has no known public URL yet, deploy first with bearer authentication,
read container_endpoint, configure the identity provider for that origin and /mcp audience,
then switch to OIDC in a reviewed Terraform update. Preserve the OIDC values when changing
provider defaults or keys on an existing deployment.
Result storage and provider retention are independent¶
| Combination | Result behavior | Appropriate deployment |
|---|---|---|
backend=disabled + inline response |
No retained transcript in OpenTranscribe | Default; works with scale-to-zero |
backend=disabled + result_mode=stored |
Explicit rejection | Enable a store first |
backend=memory + cursor secret |
Temporary process-local transcript chunks | Local/test only; lost on restart and inaccessible from another instance |
backend=s3 + cursor secret, bucket and credentials |
Shared, TTL-bound transcript chunks and explicit deletion | Stateless, scaled HTTP deployments |
| Any store + ElevenLabs zero retention | Provider eligibility still required | Application storage does not grant Enterprise features |
| Disabled store + ElevenLabs standard mode | OpenTranscribe retains no transcript, but provider-side retention is enabled | Requires explicit operator acceptance |
result_mode=auto uses inline output until configured size/segment limits require storage; with
the store disabled, such a large result fails rather than being truncated or silently retained.
result_mode=inline still has a hard response byte limit. Storage does not create a transcript
library or remove the request's need for an authorized audio source.
On Scaleway, enable_result_store=false forces the disabled backend. To enable shared storage,
set enable_result_store=true, add OT_RESULT_STORE__CURSOR_SECRET to the secrets map, and choose
result_ttl_seconds (60–604800 seconds in this module; default 86400). Terraform provisions the
bucket, lifecycle policy and runtime S3 identity and injects the S3 settings and AWS_* keys.
Keep the result-store IAM and bucket-policy caveat
in mind before enabling it. The module does not offer a memory backend.
Outside Terraform, install the s3 extra and configure OT_RESULT_STORE__BACKEND=s3, a cursor
secret, OT_RESULT_STORE__S3_BUCKET, endpoint/region/prefix settings and S3 AWS_ACCESS_KEY_ID /
AWS_SECRET_ACCESS_KEY credentials. See privacy and retention.
A Terraform state bucket is a separate infrastructure concern. It stores deployment state, not transcript chunks; using a remote state backend does not enable the result store. Do not apply transcript TTL deletion rules to the state bucket.
Keep the different secrets in the right place¶
| Secret | Purpose | Where it belongs |
|---|---|---|
SCW_ACCESS_KEY, SCW_SECRET_KEY |
Terraform and image registry deployment | Deployer's environment / CI secret store |
Provider OT_*__API_KEY |
STT provider calls | Server secrets; Terraform secret_environment_variables |
OT_SECURITY__BEARER_TOKEN |
Shared MCP client authentication | Server secrets and trusted client configuration, only in bearer mode |
| OIDC signing keys / client secrets | Identity-provider and OAuth client operation | Identity provider / client; OpenTranscribe uses public JWKS |
OT_RESULT_STORE__CURSOR_SECRET |
Signing stored-result cursors | Server secrets when a result store is enabled |
Runtime S3 AWS_* keys |
Temporary transcript object access | Server secret environment; generated by this Terraform module |
Backend S3 AWS_* keys |
Remote Terraform state access | Deployer's backend environment; separate from runtime credentials |
Terraform merges your non-secret map with enforced production settings: HTTP authentication mode,
HTTPS audio sources, private-network rejection, port 8000, container timeout and chosen store.
Use the module inputs for these settings; an environment-map override is not authoritative.
Secret-looking names are rejected in the non-secret map. Keep placeholders in tracked examples;
keep your real values in the ignored terraform.tfvars and inject provider keys only server-side.
secret_environment_variables redacts normal Terraform output but does not encrypt state or
saved plans. Protect .env, terraform.tfvars, state backups and plan files; use encrypted,
access-controlled remote state for shared production operations. The Terraform module injects
Scaleway container secret variables directly; it does not provision Secret Manager references.
Verify a change¶
- Restart the local server, recreate Docker, or plan/apply Terraform according to your mode.
- Check
/healthzand/readyzfor HTTP deployments. Ready means a key is present, not that the provider has accepted it. STDIO uses Setup/doctor, not those network probes. - With an authenticated client, call
list_transcription_models(configured_only=true). - Run a short authorized audio test with the required capabilities and no fallback to confirm the intended provider. Provider charges apply; do not use personal recordings as CI fixtures.
- If storage is enabled, read the result chunks and delete the temporary transcript.
| Symptom | First checks |
|---|---|
PROVIDER_AUTHENTICATION_FAILED |
Correct provider key, permissions (ElevenLabs Speech to Text), account eligibility |
UNSUPPORTED_CAPABILITY |
Requested diarization/style against the selected model; keep strict checking if the requirement matters |
RESULT_STORE_DISABLED |
Stored/oversized output with no store; enable S3 deliberately or use smaller inputs |
HTTP 401 at /mcp |
MCP bearer token or OIDC issuer/audience/scope/claim; this is independent of the STT key |
| Startup validation failure | Empty typed settings, missing authentication, incomplete OIDC or result-store configuration |
| Terraform keeps changing only memory/storage | Scaleway rounds allocations to integer decimal MB; use the observed byte values for those module inputs |
See the Scaleway operational checks and the publication protocol for deployment and release procedures.