LLM profiles
An LLM profile is one model at one vendor: how to reach the model and what it costs. Agents name the profile in the llm command. To use another model, define another profile.
Settings
| Field | Type | Default | Description |
|---|---|---|---|
secretsUsed | list of string | The secret names this profile's expressions read (sys.secret['NAME']). Worked out by the cloud when the profile is saved and sent with the profile to agent servers; anything sent in this field is ignored. | |
namerequired | string | The name this profile is referred to by, in agents and in other configuration. | |
doc | string | Free-text notes about this profile, for whoever maintains the configuration. | |
adapter | string | "openai" | The adapter class that connects to this LLM. It must implement the LlmAdapter interface and be on the allowlist. |
url | dynamic string | "https://api.openai.com" | The URL of the LLM server. |
headers | object of string → dynamic string | Headers added to the request. Values are dynamic strings, as in agents. | |
queryParams | object of string → dynamic string | Query parameters. Values are dynamic strings, as in agents. | |
additionalParams | dynamic dict | Additional parameters to send to the LLM. They are merged with the parameters the adapter class produces and win wherever the two disagree. String values are interpreted as dynamic strings, as in agents. | |
modelrequired | string | The model this profile calls. A profile represents one model of one vendor; to use another model, define another profile. | |
pricing | ModelDetails | The model's prices per million tokens. The cost of a run is calculated from these. | |
maxTokens | integer | 5000 | The token ceiling for agents using this profile. An agent may ask for fewer but not more. What it counts depends on the vendor. |
retries | integer | 1 | How many times a failed request is retried. |
connectionPoolName | string | "default" | The connection pool used for calls to the LLM server. |
maxTools | integer | 10 | The most tools that may be sent in a single call. |
toolErrorPrompt | string | "Tool returned an error. If changing the arguments to the tool would get past this error, change the arguments. Otherwise, if the tool can be skipped, skip it. As a last resort, provide a text error message and end the conversation." | The user prompt sent to the LLM when a tool call fails. |
Model prices
Prices are per million tokens. The cost report and each agent's LLM cost limit are computed from them.
| Field | Type | Default | Description |
|---|---|---|---|
inputText | number | 0 | Price per million input text tokens. |
outputText | number | 0 | Price per million output text tokens. |
inputImage | number | 0 | Price per million input image tokens. |
outputImage | number | 0 | Price per million output image tokens. |
Dynamic values
url, the values in headers, and the string values in additionalParams are dynamic strings, evaluated for every call with the same rules as an agent expression. A secret read at call time keeps the key out of the configuration: { f"Bearer {sys.secret['OPENAI_API_KEY']}" }.
Seeded profiles
A new account has eight profiles. Five reach a vendor and read the key from the agent server's environment: OpenAI (gpt5_mini, and gpt_image for image generation), Anthropic (claude_haiku) and Gemini (gemini_flash, and gemini_image for image generation). Three reach a model served on the agent server's own machine and do not need a key: ollama_qwen25, vllm_qwen25 and sglang_qwen25, for Ollama, vLLM and SGLang at their default ports. Edit the model and the prices to match your contracts.
Other vendors
A model you host with Ollama, vLLM or SGLang needs only a profile that names the ollama, vllm or sglang adapter; see LLM vendors. Any endpoint that speaks the OpenAI, Anthropic or Gemini protocol needs only a profile with the endpoint's URL. Any other endpoint needs an adapter.

