Litellm dev bedrock anthropic 3 7 v2 (#8843)

* feat(bedrock/converse/transformation.py): support claude-3-7-sonnet reasoning_Content transformation

Closes https://github.com/BerriAI/litellm/issues/8777

* fix(bedrock/): support returning `reasoning_content` on streaming for claude-3-7

Resolves https://github.com/BerriAI/litellm/issues/8777

* feat(bedrock/): unify converse reasoning content blocks for consistency across anthropic and bedrock

* fix(anthropic/chat/transformation.py): handle deepseek-style 'reasoning_content' extraction within transformation.py

simpler logic

* feat(bedrock/): fix streaming to return blocks in consistent format

* fix: fix linting error

* test: fix test

* feat(factory.py): fix bedrock thinking block translation on tool calling

allows passing the thinking blocks back to bedrock for tool calling

* fix(types/utils.py): don't exclude provider_specific_fields on model dump

ensures consistent responses

* fix: fix linting errors

* fix(convert_dict_to_response.py): pass reasoning_content on root

* fix: test

* fix(streaming_handler.py): add helper util for setting model id

* fix(streaming_handler.py): fix setting model id on model response stream chunk

* fix(streaming_handler.py): fix linting error

* fix(streaming_handler.py): fix linting error

* fix(types/utils.py): add provider_specific_fields to model stream response

* fix(streaming_handler.py): copy provider specific fields and add them to the root of the streaming response

* fix(streaming_handler.py): fix check

* fix: fix test

* fix(types/utils.py): ensure messages content is always openai compatible

* fix(types/utils.py): fix delta object to always be openai compatible

only introduce new params if variable exists

* test: fix bedrock nova tests

* test: skip flaky test

* test: skip flaky test in ci/cd
This commit is contained in:
Krish Dholakia 2025-02-26 16:05:33 -08:00 committed by GitHub
parent f3ef6c92a3
commit 05a973bf19
20 changed files with 447 additions and 149 deletions

View file

@ -108,10 +108,10 @@ def test_nova_invoke_streaming_chunk_parsing():
}
}
result = decoder._chunk_parser(nova_text_chunk)
assert result["text"] == "Hello, how can I help?"
assert result["index"] == 0
assert not result["is_finished"]
assert result["tool_use"] is None
assert result.choices[0].delta.content == "Hello, how can I help?"
assert result.choices[0].index == 0
assert not result.choices[0].finish_reason
assert result.choices[0].delta.tool_calls is None
# Test case 2: Tool use start in contentBlockDelta
nova_tool_start_chunk = {
@ -121,12 +121,12 @@ def test_nova_invoke_streaming_chunk_parsing():
}
}
result = decoder._chunk_parser(nova_tool_start_chunk)
assert result["text"] == ""
assert result["index"] == 1
assert result["tool_use"] is not None
assert result["tool_use"]["type"] == "function"
assert result["tool_use"]["function"]["name"] == "get_weather"
assert result["tool_use"]["id"] == "tool_1"
assert result.choices[0].delta.content == ""
assert result.choices[0].index == 1
assert result.choices[0].delta.tool_calls is not None
assert result.choices[0].delta.tool_calls[0].type == "function"
assert result.choices[0].delta.tool_calls[0].function.name == "get_weather"
assert result.choices[0].delta.tool_calls[0].id == "tool_1"
# Test case 3: Tool use arguments in contentBlockDelta
nova_tool_args_chunk = {
@ -136,10 +136,13 @@ def test_nova_invoke_streaming_chunk_parsing():
}
}
result = decoder._chunk_parser(nova_tool_args_chunk)
assert result["text"] == ""
assert result["index"] == 2
assert result["tool_use"] is not None
assert result["tool_use"]["function"]["arguments"] == '{"location": "New York"}'
assert result.choices[0].delta.content == ""
assert result.choices[0].index == 2
assert result.choices[0].delta.tool_calls is not None
assert (
result.choices[0].delta.tool_calls[0].function.arguments
== '{"location": "New York"}'
)
# Test case 4: Stop reason in contentBlockDelta
nova_stop_chunk = {
@ -149,5 +152,4 @@ def test_nova_invoke_streaming_chunk_parsing():
}
result = decoder._chunk_parser(nova_stop_chunk)
print(result)
assert result["is_finished"] is True
assert result["finish_reason"] == "tool_calls"
assert result.choices[0].finish_reason == "tool_calls"