Repository navigation
fix(openai): show OpenAI refusals and end the turn as refusal - #4932
Open
jaeminbird wants to merge 1 commit into
Open
jaeminbird wants to merge 1 commit into
jaeminbird wants to merge 1 commit into
Conversation
OpenAI delivers a refusal in delta.refusal (Chat Completions) or response.refusal.delta events and a refusal content part (Responses), not as text. Both adapters dropped it, so the user got an empty answer that ended as stop. Emit the refusal text as the answer and report the finish reason as refusal.
This branch has not been deployed
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.
OpenAI sends a model refusal in its own field, not as text:
delta.refusalon Chat Completions, andresponse.refusal.deltaplus arefusalcontent part on Responses. Neither adapter read it, so the user got an empty answer that ended asstop("no final answer" fromrun --exec). It shows up most with strictstructured_outputschemas.Both adapters now emit the refusal text as the answer (the Responses snapshot is deduplicated against the deltas) and end the turn as
refusal, ascontent_filteralready does since #4825.Tested with a real
openai.ClientthroughLocalRuntimeon both APIs, plus adapter cases; all fail on main. golangci-lint is clean.