Configuring a system
Leave any field empty on a system to inherit it from Defaults.
Two ways to reach a model
| ai_provider set |
The API is called directly. Tools are passed as native JSON function
calls, and tokens and cost are tracked per message. |
| ai_provider empty |
ai_command is run instead: the prompt goes in on
stdin, the reply is read from stdout. Your backend's tools are pasted into
the prompt as curl recipes rather than function
calls, and there is no cost tracking. |
API providers
| Provider | Model | API key field |
| deepseek |
deepseek-chat |
DeepSeek API key |
| openai |
gpt-4o |
OpenAI API key |
| gemini |
gemini-2.5-flash |
Google AI Studio key |
| openrouter |
google/gemini-2.5-flash |
OpenRouter key |
| ollama |
llama3 |
Base URL, not a key — defaults to
http://localhost:11434 |
Ollama is the odd one out: it needs no key, so the API key
field doubles as its base URL. Its model is required; the others fall back to a
default when left empty.
DeepSeek models
| Model | Use for | Cost / M tokens |
| deepseek-chat |
The V3 general chat model. The default when no model is set, and the right
choice for normal agent traffic. |
$0.27 in · $1.10 out |
| deepseek-reasoner |
R1, the reasoning model. Slower and dearer; worth it only when a task needs
real deliberation. |
$0.55 in · $2.19 out |
Rates are the cache-miss standard prices the cost tracker
bills against. Any unrecognised model name is charged at
deepseek-chat rates.
Using Claude Code (claude -p)
Leave Provider empty and set AI command to:
claude -p --allowedTools "Bash(curl:*)"
The allowlist is not optional. With a bare
claude -p, every curl call is
stopped by the permission prompt that non-interactive runs can never answer. The
agent still replies — it just reports that it could not reach your backend, which
looks like a broken endpoint rather than a missing flag.
Choose the model in the command, not in the Model field —
ai_model is ignored in command mode:
claude -p --model opus --allowedTools "Bash(curl:*)"
--dangerously-skip-permissions also works and
needs no allowlist, but it permits every tool, including file writes and arbitrary
shell. Agent prompts carry text written by whoever is on the other end of the chat,
so prefer the narrow allowlist above.
Command mode details
- The command runs directly, not through a shell — pipes, redirections,
&& and $VAR are not
expanded. Quoted arguments are kept together, so
"Bash(curl:*)" arrives as one argument.
- claude must be on the PATH of
the user running ortic-agent serve. Give an absolute path
if it is not.
- A run is abandoned after 15 minutes.
- Cost and token counters stay at zero — only the API providers report usage.
- The bundled search and fetch tools are for API providers only. Claude Code brings
its own tools instead, and reaches your backend through the
curl recipes in the prompt.
- For native tools rather than curl, register the agent's MCP server with Claude
Code: ortic-agent mcp-server.