Build
Flows & model providers
Connect any OpenAI-compatible provider, keep the key write-only, and control the agent's behavior.
A flow pairs a model provider with governance: which model answers, with which parameters, and which tools it may call. Flows are created and managed under Flows in the console.
Providers
Presets are available for OpenAI, OpenRouter, Groq, Z.AI, and Mistral, and any other OpenAI-compatible endpoint works via a custom base URL. The platform speaks the chat-completions protocol to the provider — if your provider exposes it, it works.
Write-only provider keys
- The provider API key is encrypted (AES-256-GCM) the moment the flow is saved and is injected server-side only when the flow runs.
- No console screen, API response, or log ever contains the key after saving — editing a flow leaves the key field empty, and an empty field means 'keep the stored key'.
- Replacing the key re-encrypts a new secret; old secret rows are retained append-only, like rotation history.
Parameters
Model name is required; timeout, temperature, and max tokens are optional. Changes apply immediately — the runtime cache is invalidated on every update, so disabling a flow stops traffic within a second, not when a cache expires.
Disabled flows fail closed: the API and every channel refuse with flow_disabled instead of guessing.
Per-flow response views
The same published tool can read differently per flow. On a flow's tool binding, open "What the AI reads": run the tool once (inputs prefill from the imported request), tick fields on the tree derived from the REAL response — top-level arrays included — pick List or Table, and cap long lists with max items (a clipped list announces "showing 50 of 120 items"). Custom wording is a sentence builder: type words, click field chips discovered from the response — paths can never be typed, and a view cannot be saved before a successful sample. The preview is the exact text the model receives, with an estimated token reduction shown before saving. If the API's response shape changes later, the editor flags the drifted fields and the runtime falls back to safe JSON instead of sending empty output.