fix(routing): offered tools must not make a local model unroutable
Docker / publish (push) Canceled after 0s
Release / crates-io (push) Canceled after 0s
Release / release (macos-14, aarch64-apple-darwin) (push) Canceled after 0s
Release / release (ubuntu-latest, x86_64-unknown-linux-gnu) (push) Canceled after 0s
Release / release (windows-latest, x86_64-pc-windows-msvc) (push) Canceled after 0s
Docker / publish (push) Canceled after 0s
Release / crates-io (push) Canceled after 0s
Release / release (macos-14, aarch64-apple-darwin) (push) Canceled after 0s
Release / release (ubuntu-latest, x86_64-unknown-linux-gnu) (push) Canceled after 0s
Release / release (windows-latest, x86_64-pc-windows-msvc) (push) Canceled after 0s
Verified against a real Open WebUI container: it attaches its ~26 built-in tools (knowledge bases, notes, calendar, ...) to every single message, and resolve() treated that offer as a hard capability requirement. On a pool of tools-less local models a plain "hello" therefore failed with "No healthy model available that satisfies required capabilities", and a pinned local model was reported as "not available - not in the pool (deleted?)". In the OpenAI contract `tools` is an offer; only tool_choice: "required" (or a named function) makes the call impossible without them. Keep preferring a tool-capable model, but fall back to serving the request with the tools stripped - together with tool_choice/parallel_tool_calls, which a provider rejects on their own. A pin whose only shortcoming is tool support is now honoured; an unknown pin and tool_choice: "required" still fail loudly. The downgrade is never silent: X-Cortiq-Tools-Dropped: true, plus cortiq.tools_dropped in the echo block.
This commit is contained in:
@@ -3,6 +3,27 @@
|
||||
All notable changes to this project are documented here.
|
||||
The format is based on [Keep a Changelog](https://keepachangelog.com/).
|
||||
|
||||
## [0.2.46] - 2026-08-21
|
||||
|
||||
Verified end to end against a real Open WebUI container talking to the gateway.
|
||||
|
||||
### Fixed
|
||||
- **Offered `tools` no longer make a local model unroutable.** Open WebUI attaches its ~26
|
||||
built-in tools (knowledge bases, notes, calendar, …) to *every* message, and the gateway
|
||||
treated that offer as a hard capability requirement — so a plain "hello" against a pool of
|
||||
tools-less local models failed with «No healthy model available that satisfies required
|
||||
capabilities». In the OpenAI contract `tools` is an offer: only `tool_choice: "required"`
|
||||
(or a named function) makes the call impossible without them. The gateway now still
|
||||
prefers a tool-capable model, but falls back to serving the request with the tools
|
||||
stripped (along with `tool_choice`/`parallel_tool_calls`, which a provider rejects on
|
||||
their own). `tool_choice: "required"` still fails loudly, as it must.
|
||||
- **A pinned model that merely lacks tool support is honoured** instead of being reported as
|
||||
«not available — it is not in the pool (deleted?)». An unknown pin still fails loudly.
|
||||
|
||||
### Added
|
||||
- `X-Cortiq-Tools-Dropped: true` (and `cortiq.tools_dropped` in the echo block) whenever the
|
||||
gateway answers without the tools the client offered, so the downgrade is never silent.
|
||||
|
||||
## [0.2.45] - 2026-08-21
|
||||
|
||||
### Fixed
|
||||
|
||||
Reference in New Issue
Block a user