Skip to content

Configuration

The portal reads its own settings from .env in the directory it is started from (names are case-insensitive). These are the portal's settings only. Warehouse credentials, Cube's secret, service tokens and service ports are generated into the downloaded compose files and do not belong here.

Note

pydantic-settings reads .env into the portal's settings object and puts nothing into the process environment. A variable set only in .env is invisible to other tools.

Model

Setting Default What it does
AZURE_OPENAI_API_KEY — Azure OpenAI key
AZURE_OPENAI_ENDPOINT — e.g. https://<resource>.openai.azure.com
AZURE_OPENAI_API_VERSION — 2025-03-01-preview or later (the example uses 2025-04-01-preview). Earlier versions return no reasoning summaries
AZURE_OPENAI_DEPLOYMENT — Only if the deployment is not named after the model
QUERY_MODEL azure_openai:gpt-5.1 The model every agent uses, through the Responses API
REASONING_EFFORT medium Passed as the reasoning effort
REASONING_SUMMARY detailed detailed is what actually fills the thinking panel; auto often emits nothing

Limits

Setting Default What it does
MAX_ROWS 5000 Row cap on a chat query, a dashboard tile and an MCP query, applied even when the query sets no limit
QUERY_TIMEOUT_S 60 Timeout for a query sent through the model store. Must stay under the store's own 120 s
FLOW_PAGE_ROWS 50000 Rows per request when a Flow extract pages through a result. 50,000 is Cube's per-request maximum
FLOW_MAX_ROWS 5000000 The most rows one extract writes. A larger result writes nothing and fails that step

Location

Setting Default What it does
WEB_HOST 127.0.0.1 Address the portal listens on
WEB_PORT 8420 Port the portal listens on
DATA_DIR ~/.praxis Holds praxis.db, jobs.lock and drafts/. A scratch DATA_DIR is a whole scratch install, connection included
FLOWS_DIR flows Where Flows live. Relative paths resolve against the directory praxis was started from; set an absolute path to pin it

Behaviour

Setting Default What it does
APPROVE_SCRIPTS true Each Python script in a chat waits for a click before it runs, unless that chat chose "always". This is a courtesy, not the safety boundary — the sandbox holding no credential is

Changes take effect on the next start.