This commit is contained in:
Jon Richmond 2026-10-26 19:38:03 +00:00 • committed by GitHub
commit 7e0750c195
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
4 changed files with 27 additions and 1 deletions

View file

@ -785,7 +785,7 @@ def convert_to_model_response_object(
# Preserve provider_specific_fields if already present
# in the response (e.g. from proxy passthrough)
provider_specific_fields = dict(choice["message"].get("provider_specific_fields", None) or {})
for f in choice["message"].keys() - _MESSAGE_FIELDS:
for f in choice["message"].keys() - _MESSAGE_FIELDS - {"reasoning"}:
provider_specific_fields[f] = choice["message"][f]
# Handle reasoning models that display `reasoning_content` within `content`

View file

@ -198,6 +198,7 @@ def _redacted_provider_specific_fields(fields: Mapping[str, object]) -> Mapping[
return {
**fields,
**({"reasoning_content": REDACTED_BY_LITELLM} if fields.get("reasoning_content") is not None else {}),
**({"reasoning": REDACTED_BY_LITELLM} if fields.get("reasoning") is not None else {}),
**{
key: None
for key in (
@ -206,6 +207,7 @@ def _redacted_provider_specific_fields(fields: Mapping[str, object]) -> Mapping[
"citations",
"compaction_blocks",
"compaction_delta",
"reasoning_details",
)
if key in fields
},

View file

@ -2873,6 +2873,28 @@ class TestConvertToModelResponseObjectCompletion:
assert message.reasoning_content == "2+2=4"
assert "reasoning_content" not in (message.provider_specific_fields or {})
def test_reasoning_not_mirrored_into_provider_specific_fields(self):
response_object = {
"id": "chatcmpl-6",
"model": "openrouter/deepseek/deepseek-r1",
"choices": [
{
"finish_reason": "stop",
"index": 0,
"message": {"content": "The answer is 4.", "role": "assistant", "reasoning": "2+2=4"},
}
],
"usage": {"prompt_tokens": 5, "completion_tokens": 10, "total_tokens": 15},
}
result = convert_to_model_response_object(
response_object=response_object,
model_response_object=ModelResponse(),
)
message = result.choices[0].message
assert message.reasoning_content == "2+2=4"
assert "reasoning" not in (message.provider_specific_fields or {})
def test_response_none_raises(self):
with pytest.raises(Exception, match="Invalid response object"):
convert_to_model_response_object(

View file

@ -53,6 +53,8 @@ SIGNATURE: Final = "opaque-thought-signature"
def _provider_fields() -> dict[str, object]:
return {
"reasoning_content": SECRET,
"reasoning": SECRET,
"reasoning_details": [{"type": "reasoning.text", "text": SECRET, "index": 0, "format": "unknown"}],
"thinking_blocks": [{"type": "thinking", "thinking": SECRET}],
"reasoningContentBlocks": [{"reasoningText": {"text": SECRET}}],
"citations": [{"cited_text": SECRET}],