Map forced tool choice onto the Cohere v2 API - #2
Merged
Conversation
Cohere was left out of the v0.13 toolChoice release, so it accepted the option and silently dropped it. Cohere spells the modes in uppercase, REQUIRED and NONE, and has no value for auto: the documented default is that omitting the field lets the model choose, so auto sends nothing rather than an invented value. It also cannot force one *named* tool. Downgrading that to REQUIRED would satisfy the request shape while breaking the caller's guarantee, so it throws a ProviderException naming the tool it could not force, the same way Ollama refuses forced choice outright.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Cohere never received the v0.13
toolChoicework, so until now it accepted the option and silently dropped it.Cohere's v2
tool_choiceis not OpenAI-shaped, so this is not a copy of the other providers:REQUIREDandNONE, per the API reference.autosends nothing rather than an inventedAUTO.requiredis as specific as Cohere gets. Silently downgrading["name" => "x"]toREQUIREDwould satisfy the request shape while breaking exactly the guarantee the caller asked for, so it throws aProviderExceptionthat names the tool it could not force. Same posture as Ollama refusing forced choice outright.One upstream caveat worth knowing, documented in the code:
tool_choiceneeds command-r7b or newer, and the package default iscommand-r-plus, so an older model will reject it at the API rather than here.9 new tests.
composer cigreen locally.