| Age | Commit message (Collapse) | Author | Files | Lines |
|
A provider name containing a colon builds ids that split back to a
different provider, and an empty name builds ':model'; both routed to the
local router under a nonsense name with no error, so parse() now skips
them. split() stays non-injective by design, since bare local ids are the
premise here, so the residual risk is recorded as a ponytail comment with
its upgrade path rather than hidden. Also pin the trailing-colon form Task
9 relies on, and the empty-needle filter, which were correct but untested.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
|
|
The synthesis guard tested key membership, so a [providers.local] that set
only an api_key claimed the slot, blocked the bare base_url from filling
it, then failed the URL check and vanished. Losing the local provider is
the one outcome this feature cannot have. The guard now tests the URL and
merges, so the table adds detail to the local provider rather than
replacing it.
A filter given as a bare string was iterated character-wise, turning
filter = "qwen" into four needles that match almost every model id. Both
failures were silent, which is what made them worth fixing now.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
|
|
Sixteen TDD tasks. Providers, model-id namespacing and key resolution go
in a new providers.py; metadata and cost math in models.py; the settings
dialog in modeldialog.py, keeping ui.py from growing further.
The last task is manual: it needs a real key and spends real money, and
it is where cloud tool-calling behaviour gets found out rather than
guessed at.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
|