Environment variables
Every variable both packages read.
Every variable either package reads. None is required to start — the defaults resolve to something local that works.
The two packages read different names, and neither reads the other's. Setting only one pair leaves the other on its default, quietly.
Model endpoint
Runspace
| Variable | Default | Meaning |
|---|---|---|
AI_BASE_URL | https://api.openai.com/v1 | Any OpenAI-compatible endpoint |
AI_API_KEY | — | Key for the above |
CODEX_MODEL | gpt-5.4-codex | Model the Codex vision backend asks for |
Agentino
| Variable | Default | Meaning |
|---|---|---|
AGENTINO_BASE_URL | https://api.openai.com/v1 | Any OpenAI-compatible endpoint |
AGENTINO_API_KEY | — | Key for the above |
AGENTINO_PROVIDER | detected from the URL | openai, openai-codex or anthropic |
ANTHROPIC_API_KEY · ANTHROPIC_SETUP_TOKEN | — | Key fallbacks, tried before the OpenAI one |
OPENAI_API_KEY | — | Key fallback |
AGENTINO_CODEX_REASONING_EFFORT | — | Caps reasoning effort on Codex models |
AGENTINO_LLM_TRACE | off | Writes the raw request and response to disk |
OPENAI_BASE_URL is not read. Only AGENTINO_BASE_URL selects the
endpoint. After the key variables, agentino reads ~/.agentino/auth.json,
then ~/.codex/auth.json — which is why an agent can reach a model on a
machine with nothing set.
Storage
| Variable | Default | Meaning |
|---|---|---|
STORE_BACKEND | file | file, memory or supabase |
STORE_FILE_ROOT | project-local | Where the file store writes |
DATA_DIR | project-local | Fallback root for the above |
STORAGE_BACKEND | local | File storage: local or supabase |
STORAGE_LOCAL_ROOT · FILE_STORAGE_ROOT | project-local | Where uploads land |
STORAGE_SUPABASE_BUCKET | — | Bucket name when storage is Supabase |
MESSAGING_DB_PATH | .runspace/messaging.sqlite | Channels and messages, when Supabase is not configured |
SUPABASE_URL · SUPABASE_KEY | — | Both required together, or the SQLite path is used |
SUPABASE_SERVICE_KEY | — | Service-role key, where one is needed |
APP_MODE | — | Legacy shortcut: sandbox flips the store to file |
Messaging goes to SQLite unless both Supabase variables are set. Setting one without the other keeps the SQLite path, deliberately — a half-configured database should not half-work.
Redis is available as a session store but is selected in code
(RedisSessionStore(redis_url=...)), not by an environment variable.
Vision, embeddings and speech
| Variable | Default | Meaning |
|---|---|---|
VISION_BACKEND | fixture | codex or fixture |
VISION_API_KEY | — | Credential for the vision backend |
VISION_FIXTURES_DIR | project-local | Scripted responses for the fixture backend |
EMBEDDINGS_BACKEND | fixture | openai or fixture |
EMBEDDINGS_BASE_URL · EMBEDDINGS_API_KEY | — | Endpoint and key |
EMBEDDINGS_MODEL · EMBEDDINGS_DIMENSIONS | — | Model name and vector width |
AGENTINO_EMBEDDING_URL · _KEY · _MODEL | — | Agentino's own embedding settings |
AGENTINO_STT_BASE_URL · _API_KEY · _MODEL | — | Speech-to-text |
Knowledge retrieval
| Variable | Default | Meaning |
|---|---|---|
AGENTINO_TOP_K | 5 | How many passages to return |
AGENTINO_MIN_SCORE | — | Floor below which a match is discarded |
AGENTINO_DENSE_WEIGHT | — | Balance between TF-IDF and dense scores |
AGENTINO_LANGUAGE_BOOST | — | Weight for matching the query's language |
Workspace and tenancy
| Variable | Default | Meaning |
|---|---|---|
WORKSPACE_YML | — | Path to the workspace file, when not given as an argument |
TENANT_ID | the workspace directory's name | Must match, or the registry cannot resolve it |
WORKSPACE_TENANTS_ROOT | — | Where tenant directories live |
WORKSPACE_FILES_DIR · WORKSPACE_MEMORY_ROOT | project-local | Per-tenant files and agent memory |
WORKSPACE_PUBLIC_URL | — | Base URL used when linking to an attachment |
WORKSPACE_WRITE_DISABLED | off | Read-only mode |
HOST · PORT · LOG_LEVEL | 0.0.0.0 · 8000 · info | Uvicorn, when serving directly |
Channels
| Variable | Default | Meaning |
|---|---|---|
TELEGRAM_BOT_TOKEN | — | Bot credential |
TELEGRAM_WEBHOOK_SECRET | — | Shared secret when using webhooks rather than polling |
TRANSPORT_BACKEND | inbox | telegram, or a file inbox for replaying a frozen conversation |
TRANSPORT_INBOX_DIR · INBOX_DIR | project-local | Where the file transport reads |
Tools and agents
| Variable | Default | Meaning |
|---|---|---|
AGENTINO_PROJECT_DIR | cwd | Root the file tools, coder and knowledge base work in |
AGENTINO_PROJECT_DIFF · AGENTINO_PROJECT_STATUS | — | Override how project state is reported |
AGENTINO_CONFIG_DIR · AGENTINO_FILES_DIR | project-local | Config and file roots |
AGENTINO_SHELL_TIMEOUT | — | Seconds before a shell tool is killed |
BRAVE_API_KEY · OPENCLAW_BRAVE_API_KEY | — | Web search |
GROQ_API_KEY | — | Groq, where a tool uses it |
CRAWLER_MODEL | — | Model the crawl helpers ask for |
OPENCLAW_PROFILE · OPENCLAW_TIMEOUT_S | default · — | Settings for the OpenClaw runtime |
RUNSPACE_CLI_TIMEOUT | — | Seconds before a CLI runtime is killed |
RUNSPACE_TOOL_USAGE_PATH | — | Where tool-usage counts are written |
DEMO_TODAY | — | Freezes "today" so a demo reads the same tomorrow |
A note on naming
There are no deployment-specific variable names in either package. If you need
one, put it in your YAML as ${YOUR_NAME} and let interpolation carry it —
the library should not know what your deployments are called.