Agnes AI
Agnes AI's text models are called through LLMTR with /v1/chat/completions. Two rows are offered and both are currently free.
| Model | Context | Max output | Input / Cache read / Output ($/1M) |
|---|---|---|---|
agnes/agnes-2.5-flash | 524,288 | 65,536 | 0 / 0 / 0 |
agnes/agnes-3.0-flash | 524,288 | 65,536 | 0 / 0 / 0 |
Agnes 2.5 Flash is the general-purpose model for chat, coding and agent workflows. It reasons by default and serves repeated prompt prefixes from a prompt cache.
Agnes 3.0 Flash is the newer generation, aimed at agentic coding and tool use. It does not reason by default.
Both accept image and video input alongside text, support tool calling and schema-enforced JSON output, and stream.
curl "$LLMTR_BASE_URL/v1/chat/completions" \ -H "Authorization: Bearer llmtr-your_key" \ -H "Content-Type: application/json" \ -d '{ "model": "agnes/agnes-3.0-flash", "messages": [ { "role": "user", "content": "Find the bug in this function." } ], "max_tokens": 8192 }'Reasoning control
Section titled “Reasoning control”The two rows default differently, and that is a measured difference despite them being the same family:
agnes/agnes-2.5-flash -> reasoning ON (default)agnes/agnes-3.0-flash -> reasoning OFF (default)Reasoning on these two rows is an on/off switch, not a scale of levels. It is controlled with a suffix on the model identifier:
agnes/agnes-2.5-flash:fast -> reasoning offagnes/agnes-2.5-flash:think -> reasoning onagnes/agnes-3.0-flash:think -> reasoning onagnes/agnes-3.0-flash:fast -> reasoning offThe same thing can be done with the reasoning field in the body:
curl "$LLMTR_BASE_URL/v1/chat/completions" \ -H "Authorization: Bearer llmtr-your_key" \ -H "Content-Type: application/json" \ -d '{ "model": "agnes/agnes-2.5-flash", "messages": [ { "role": "user", "content": "What is 2+2? Answer with a number only." } ], "reasoning": false, "max_tokens": 256 }'The reasoning_effort field is not supported on these rows; levels such as low, medium and high are rejected with a 400. The reason is measurement: the provider accepts those names, but no measurable difference in reasoning depth came out between them — the only thing that separated was on versus off. Putting a control in the interface that changes nothing would bill you for reasoning tokens you believed you had reduced.
When reasoning is on, the hidden reasoning tokens it produces count as output.
Image input
Section titled “Image input”Both rows accept images. Images must be sent as base64 data URLs:
curl "$LLMTR_BASE_URL/v1/chat/completions" \ -H "Authorization: Bearer llmtr-your_key" \ -H "Content-Type: application/json" \ -d '{ "model": "agnes/agnes-2.5-flash", "messages": [ { "role": "user", "content": [ { "type": "text", "text": "What is in this image?" }, { "type": "image_url", "image_url": { "url": "data:image/png;base64,iVBORw0KGgo..." } } ] } ], "max_tokens": 1024 }'Requests that pass a remote address (https://...) are not accepted: this provider's server cannot reach external addresses. LLMTR catches that before the request is sent and returns Model accepts image input only as base64 image data URLs, so you get a response telling you what to do instead of an opaque server error from the provider.
Video input
Section titled “Video input”Both rows accept video. Video is also sent as a base64 data URL, using the video_url part type:
{ "role": "user", "content": [ { "type": "text", "text": "Which colours appear in this video, and in what order?" }, { "type": "video_url", "video_url": { "url": "data:video/mp4;base64,AAAAIGZ0eXBpc29t..." } } ]}The model genuinely decodes the clip: on test clips containing sequential colour transitions it reported the colour order correctly.
Tool calling
Section titled “Tool calling”All three forms of tool_choice — auto, required and a named function — work on both rows, and they work the same way over streaming.
curl "$LLMTR_BASE_URL/v1/chat/completions" \ -H "Authorization: Bearer llmtr-your_key" \ -H "Content-Type: application/json" \ -d '{ "model": "agnes/agnes-3.0-flash", "messages": [ { "role": "user", "content": "What is the weather in Istanbul?" } ], "tools": [ { "type": "function", "function": { "name": "get_weather", "description": "Get the current weather for a city", "parameters": { "type": "object", "properties": { "city": { "type": "string" } }, "required": ["city"] } } } ], "tool_choice": "required", "max_tokens": 4096 }'Structured output
Section titled “Structured output”Both the json_object and json_schema forms of response_format are supported on both rows.
Prompt cache
Section titled “Prompt cache”Only agnes/agnes-2.5-flash reports prompt cache reads. On repeated prompt prefixes the usage.prompt_tokens_details.cached_tokens field comes back populated.
agnes/agnes-3.0-flash never returns that field; do not expect a cache discount on that row. Both rows are free today so this difference does not reach an invoice, but it does show up in usage records.
Limits
Section titled “Limits”The context window is 524,288 tokens and a single response is capped at 65,536 tokens. A max_tokens value above that ceiling is rejected.
Both rows are offered free, so they are subject to a request quota and a short-window request limit.
The quota counts requests, not tokens: every successful call spends one allowance, regardless of how many tokens it used. So the :fast suffix removes the hidden reasoning tokens but does not change how much quota you spend.
The window rolls; it does not reset at midnight. Each allowance you spend comes back on its own, 24 hours after the request that spent it. If you hit the quota you do not have to wait for a new day — the Retry-After header on the response tells you when the first allowance frees up.
The short-window limit is shared by both Agnes rows: hitting it on one row limits the other for the same period. Your metered models are unaffected by this quota.