Skip to Content
cuelo.

07Reference

config.cuelo

Every field of the agent's config file, with defaults.

config.cuelo is YAML, validated against a JSON Schema (schema/config.cuelo.schema.json) that the CLI and the engine share. Editors with YAML language support can use it for completion:

# yaml-language-server: $schema=https://raw.githubusercontent.com/thoughtsinc/cues-harness/main/schema/config.cuelo.schema.json

Never put credentials in config.cuelo. Reference them as ${VAR}, and set the variable in .env.

A complete example

config.cuelo
name: support-agent

stt:
  provider: smallest
  language: en
  vocab: [Cuelo, Acme, SKU]

llm:
  provider: cerebras
  model: qwen-3.8-27b
  prompt: ./config/prompts/system.md # or: instructions: "You are ..."
  greeting: "Hi, this is Acme support. How can I help?"

thinker:
  provider: anthropic
  model: claude-opus-5-5
  when: refunds, anything that needs several steps

tts:
  provider: smallest
  voice: ./config/voices/default.yaml

turns:
  controller: turn-1-mini
  barge_in: true
  barge_in_detector: maai
  backchannel: true
  backchannel_model: maai
  backchannel_hold: 1200

tools:
  - type: function
    name: lookup_order
    description: Look up an order by its number. Use it before answering about an order.
    parameters:
      type: object
      properties: { order_id: { type: string } }
      required: [order_id]

summary: true

store:
  url: sqlite://cuelo.db
  audio: ./recordings

serve:
  host: 127.0.0.1
  port: 4141
  workers: 1

Top level

FieldTypeDefaultDescription
name (required)string—Agent name, shown in the dashboard and used as the Python project name.
stt (required)object—Speech-to-text. Streaming only.
llm (required)llm——
thinkerthinker——
tts (required)object—Text-to-speech.
turnsobject—Turn-taking: when the agent speaks, yields and backchannels.
actionsstring[]—Deprecated: use tools. Python tools in src/actions/<name>.py whose schema comes from @function_tool.
summarybooleantrueWrite a call summary with the LLM when each call ends.
storeobject——
serveobject——
toolstool[]—Functions the model can call (OpenAI function tool format).

stt

Speech-to-text. Providers are listed in Providers.

FieldTypeDefaultDescription
provider (required)smallest | elevenlabs | deepgram | cartesia | inworld | assemblyai | soniox——
modelstring—Provider model ID. Omit for the provider default.
languagestring—BCP-47 tag, e.g. en or en-US. Omit to auto-detect.
vocabstring[]—Terms to recognize more reliably: names, products, jargon.
api_key_envenvName——
base_urlstring——

api_key_env reads the key from a different variable than the provider's default. base_url points at a self-hosted or regional endpoint.

llm

The talker: the model that writes every spoken reply.

FieldTypeDefaultDescription
provider (required)anthropic | openai | openrouter | cerebras | openai-compatible——
model (required)string——
promptstring"./config/prompts/system.md"Path to the system prompt file. Read at the start of every call, so edits apply without regenerating. Use instructions instead to write it inline.
temperaturenumber——
max_tokensinteger1024—
api_key_envenvName——
base_urlstring——
instructionsstring—The system prompt, inline (instead of a prompt file).
greetingstring—What the agent says as soon as the call connects (spoken as written, no LLM). Omit to let the caller speak first.

openai-compatible takes any endpoint that speaks the OpenAI Chat Completions API, such as vLLM, Ollama, Groq or Together. Set base_url and api_key_env:

llm:
  provider: openai-compatible
  base_url: http://localhost:8000/v1
  model: meta-llama/Llama-4-Scout
  api_key_env: VLLM_KEY

thinker

Optional reasoning model the talker consults through a think tool. See Thinker.

FieldTypeDefaultDescription
provider (required)anthropic | openai | openrouter | cerebras | openai-compatible——
model (required)string——
temperaturenumber——
max_tokensinteger——
api_key_envenvName——
base_urlstring——
promptstring—Path to the thinker's system prompt file.
instructionsstring—The thinker's system prompt, inline.
whenstring—When the talker should call think, in plain words (added to the tool description), e.g. "math, refunds over $100, anything multi-step".
fillerbooleantrueThe talker says a short filler ("let me think") before calling think, so the caller isn't left in silence.
context_turnsinteger6Recent conversation messages the thinker sees along with the question.

tts

Text-to-speech.

FieldTypeDefaultDescription
provider (required)smallest | elevenlabs | elevenlabs-streaming | elevenlabs-dialogue | cartesia | cartesia-streaming | deepgram | deepgram-streaming | inworld | inworld-streaming——
voice (required)string—A provider voice ID, or a path to a voice profile (voices/*.yaml).
modelstring——
speednumber——
languagestring——
api_key_envenvName——
base_urlstring——

Voice profiles

When tts.voice is a path (./config/voices/default.yaml), the file holds:

FieldTypeDefaultDescription
id (required)string—Provider voice ID.
providerstring—Which TTS provider the ID belongs to. Checked against tts.provider.
modelstring——
speednumber——
languagestring——
pronunciationsobject—word -> how to say it, e.g. Cuelo: kway-low

turns

Turn-taking. See Turn-taking.

FieldTypeDefaultDescription
controllervad | smart-turn | turn-1-mini | maai"turn-1-mini"How the end of the user's turn is detected. vad: fixed silence. smart-turn: Smart Turn v3 judges at each pause whether the speaker sounds done (multilingual). turn-1-mini: streaming end-of-turn model (English). maai: MaAI voice activity projection from user + agent audio; also decides interruptions (needs cuelo[maai], PyTorch). Model weights download on first use.
min_silenceinteger—Milliseconds of silence before deciding. vad: the silence that ends the turn (default 500). smart-turn: the pause that triggers a check (default 200). turn-1-mini: quiet required before the model may end the turn (default 60).
barge_inbooleantrueLet the user interrupt the agent.
interrupt_afterinteger300Milliseconds of user speech over the agent that count as an interruption.
backchannelstring | objecttrueAgent backchannels ("mhm") while the user talks. true for defaults.
max_silenceinteger1500smart-turn / turn-1-mini: end the turn after this much silence even if the model is unsure.
thresholdnumber—smart-turn / turn-1-mini: end-of-turn probability needed (defaults 0.5 / 0.36).
barge_in_detectorvad | backchannel-detector | maai"maai"What decides that the user is interrupting. vad: any speech for interrupt_after ms. backchannel-detector: a small model that lets "yeah"/"mhm" through. maai: MaAI decides from both voices (default; needs cuelo[maai], PyTorch).
backchannel_modelvad | maai"maai"What times the agent's backchannels. vad: a short pause after a few new words. maai: MaAI VAP-BC predicts when a listener would say "mhm" (needs cuelo[maai], PyTorch).
backchannel_holdinteger1200After the agent backchannels, wait this many ms before taking the turn, so a pause mid-story gets a "mhm" instead of a reply. 0 turns it off (faster replies, fewer backchannels).

tools

A list of functions the model can call, in OpenAI's function tool format. See Tools.

FieldTypeDefaultDescription
type (required)any——
name (required)string——
descriptionstring—Tell the model what it does and when to use it.
parametersobject—JSON Schema for the arguments (type: object, properties, required).
httphttpCall——
clientbooleanfalseRun it in the connected app: the call goes to the realtime client as an OpenAI function_call and the app answers with function_call_output.
handlerstring—Python function as module:function (default: src.actions.<name>:<name>).

http

FieldTypeDefaultDescription
url (required)string—Endpoint URL. ${VAR} reads an environment variable at call time.
methodGET | POST | PUT | PATCH | DELETE"POST"GET/DELETE send the arguments as query parameters; others as a JSON body.
headersobject—Request headers; use ${VAR} for secrets (kept in .env).
timeout_snumber10—

store

FieldTypeDefaultDescription
urlstring"sqlite://cuelo.db"sqlite://, postgres:// or mysql:// URL. Put passwords in .env and use ${VAR}.
audiostring"./recordings"Where call recordings are written.

serve

FieldTypeDefaultDescription
apiopenai-realtime | none"openai-realtime"openai-realtime: serve the OpenAI Realtime API at /v1/realtime. none: only your own routes from src/api.py.
hoststring"127.0.0.1"—
portinteger4141—
workersinteger1Server processes for cuelo serve. Each holds its own calls and models; cuelo machine check recommends a number.
api_keysstring[]—Keys every request must carry (Bearer, x-api-key, or the openai-insecure-api-key.<key> WebSocket subprotocol), as ${VAR} references to .env. Required to serve on a non-loopback host.
corsstring[]—Browser origins allowed to call the API, e.g. https://app.example.com. Empty: same origin only.

Environment variables in config

${VAR} is expanded from the environment in store.url, serve.api_keys, and tool http.url and http.headers. cuelo generate adds every referenced variable to the project's required environment, and cuelo doctor checks they are set.

On this page