YAML configuration

Declaring agents, models and tool directories in a file.

Agent identity — model, prompt, which tools it may call — is configuration. Behaviour stays in Python.

# agents.yml
agents:
  reviewer:
    model: gpt-5.4-codex
    instructions_file: prompts/reviewer.md
    tools: [read_file, grep, shell]
    knowledge:
      dir: ./knowledge
agentino run agents.yml                    # REPL
agentino run agents.yml --agent reviewer   # pick one
agentino run agents.yml -m "Review PR #42" # one shot
agentino run agents.yml --serve 8080       # HTTP

Why the split

The things you change while tuning an agent — the wording of a prompt, which model it runs on, how many turns it gets — are the things you want to change without a deploy, and the things a non-Python colleague can reasonably own. The things you change while building a capability are functions.

So a new prompt is a text edit. A new capability is a new decorated function. Neither requires touching the other.

Environment interpolation

Any value can reference the environment:

model: ${AGENT_MODEL:-gpt-5.4-codex}
api_key: ${AI_API_KEY}

${VAR:-default} expands at load time. This is how one config file runs in a sandbox and in production without a branch — and why no deployment-specific variable name is baked into either package.

Tool discovery

tools: takes either a list of names or a directory path. A directory is scanned for @tool-decorated functions and all of them are offered. A list names them explicitly, which is what you want when several agents share one directory and should not share all of it.

Every per-agent key

Default
instructionsThe prompt, inline
instructions_fileThe prompt, in its own file — better, because prompts get long
modelprovider defaultA name, or a mapping with primary and fallbacks
providerdetectedopenai, openai-codex or anthropic
base_url · api_keyfrom the environmentEndpoint for this agent alone
authsetup-token to use a stored OAuth credential instead of a key
temperature0.7
max_turns20Cap on the tool-calling loop
tool_result_cap4000Characters of a tool result the model sees
require_tool_usefalseReject a turn that answers without calling a tool
toolsNames, or a directory
tools_dirDirectory, when you also want a name list
tool_description · tool_description_fileHow this agent is described when another agent can call it
tool_instructionsExtra instructions injected around tool use
sanitizeArgument sanitisers applied before a tool runs. sanitize.path_args lists the parameters that hold a path, so they are checked for traversal before the tool sees them
skills · skills_dirNamed skills to load, and where from
context_filesFiles pasted into the prompt at load
knowledgeRetrieval settings, below

A defaults: block at the top of the file supplies any of these for every agent, and an agent's own value wins.

Knowledge

Default
dirDirectory of markdown to index
top_k5Passages returned per search
min_scoreFloor below which a match is dropped
dense_weightBalance between TF-IDF and embedding scores
language_boostWeight for matching the query's language
embedding_base_url · embedding_api_key · embedding_modelEmbedding endpoint for this agent
agents:
  support:
    instructions_file: prompts/support.md
    max_turns: 12
    require_tool_use: true
    knowledge:
      dir: ./knowledge
      top_k: 8
      dense_weight: 0.6