---
title: "Provider-aware models and reliable agent control"
date: "2026-07-23"
---

<Warning>
**Ineffective agent execution-limit SDK fields were removed.** `SessionOptions.max_turns`, `SessionOptions.max_tool_rounds_per_input`, and the `TurnLimitReached` event no longer exist. Use session wall-clock timeouts or interruption when you need an execution bound.
</Warning>

## Provider-aware model selection

Model aliases used to be globally unique, which made portable model names ambiguous across direct providers and aggregators. Providers can now expose the same canonical slug and aliases: Fabro selects the highest-priority ready offering for an unqualified name, treats an explicit provider as a pin, and persists the chosen offering when the run is created. Custom offerings now nest under their provider; legacy top-level `[llm.models]` rows and historical built-in selectors remain accepted for compatibility.

```toml title="settings.toml"
[llm.providers.proxy.models."team-code-large"]
api_id = "provider-wire-model-name"
aliases = ["team-code"]
```

## Reliable interrupts and cancellation

Interrupting an agent now settles active inference, tools, and subagent waits before the stage enters a durable **waiting for steering** state shown in the web UI. Steering resumes from that state without orphaning child agents, while live run cancellations are durably recorded and remain visibly **Cancelling…** until the run reaches its terminal cancelled state.

## More

<Accordion title="API">
- LLM requests made during a run now carry `x-session-id: <run-id>` so compatible gateways can group them into one trace session
</Accordion>

<Accordion title="Workflows">
- `fabro validate` now warns when handler-specific attributes are placed on node or parallel-branch types that never read them, including clearer diagnostics for multiple parallel parents, custom types, and inherited thread settings
- Run manifests now bundle `@file` references used by `output_schema`
</Accordion>

<Accordion title="Fixes">
- Provider-reported completion costs now survive agent and workflow event projection, and billing accumulation saturates safely
- Explicit provider pins are preserved through run materialization and request-time routing instead of being redirected to a higher-priority provider
- OpenRouter Claude requests now emit cache-control breakpoints, enabling the prompt-cache reads and writes advertised by those catalog entries
- Agent stage events are flushed before stage completion, preventing final tool and usage events from appearing after the stage is marked done
- Agent routing's last-file fallback now accepts only `.json` and `.md` files whose final standalone object contains routing fields
- Generated run titles update atomically and no longer overwrite a title changed while generation was in flight
- Child OpenAI plans no longer replace the root agent's TODO list in the stage sidebar
- Run deletion failures now show delete-specific error messages
</Accordion>

<Accordion title="Improvements">
- OpenRouter now includes Claude Fable 5, Claude Opus 4.8, and GPT-5.6 Sol, Terra, and Luna offerings
</Accordion>
