diff --git a/litellm/llms/bedrock/chat/converse_to_openai.py b/litellm/llms/bedrock/chat/converse_to_openai.py index 05af7e8ea0b..a610466b21d 100644 --- a/litellm/llms/bedrock/chat/converse_to_openai.py +++ b/litellm/llms/bedrock/chat/converse_to_openai.py @@ -21,7 +21,7 @@ from litellm.types.llms.openai import ( ) JsonPath: TypeAlias = tuple[str | int, ...] -_Node = TypeVar("_Node") +_Node: Final = TypeVar("_Node") _OBJECT: Final = TypeAdapter(Mapping[str, object]) _ITEMS: Final = TypeAdapter(Sequence[object]) @@ -177,8 +177,8 @@ def _text_slots(path: JsonPath, blocks: Iterable[tuple[int, _ContentBlock]]) -> return tuple(slot for slot in slots if slot is not None) -def _text_parts(slots: Sequence[TextSlot]) -> list[ChatCompletionTextObject]: - return [ChatCompletionTextObject(type="text", text=slot.text) for slot in slots] +def _text_parts(slots: Sequence[TextSlot]) -> tuple[ChatCompletionTextObject, ...]: + return tuple(ChatCompletionTextObject(type="text", text=slot.text) for slot in slots) def _slot_text(slot: Slot) -> str: @@ -217,7 +217,9 @@ def _user_group( if (result := block.tool_result) is not None ) slots: Final = _text_slots(path, group) - return (ConverseRow(ChatCompletionUserMessage(role="user", content=_text_parts(slots)), slots),) if slots else () + return ( + (ConverseRow(ChatCompletionUserMessage(role="user", content=list(_text_parts(slots))), slots),) if slots else () + ) def _user_rows(path: JsonPath, blocks: Sequence[_ContentBlock]) -> tuple[ConverseRow, ...]: @@ -250,7 +252,7 @@ def _assistant_rows( if uses: message: Final = ChatCompletionAssistantMessage( role="assistant", - content=_text_parts(slots) or None, + content=list(_text_parts(slots)) or None, tool_calls=[_tool_call(tool_use) for _, tool_use in uses], ) calls: Final = tuple( @@ -259,7 +261,7 @@ def _assistant_rows( return (ConverseRow(message, slots, calls),) if not slots: return () - return (ConverseRow(ChatCompletionAssistantMessage(role="assistant", content=_text_parts(slots)), slots),) + return (ConverseRow(ChatCompletionAssistantMessage(role="assistant", content=list(_text_parts(slots))), slots),) def _message_rows(index: int, message: _Message, include_tool_calls: bool) -> tuple[ConverseRow, ...]: @@ -272,13 +274,17 @@ def _message_rows(index: int, message: _Message, include_tool_calls: bool) -> tu def _system_rows(blocks: Sequence[_ContentBlock]) -> tuple[ConverseRow, ...]: slots: Final = _text_slots(("system",), enumerate(blocks)) return ( - (ConverseRow(ChatCompletionSystemMessage(role="system", content=_text_parts(slots)), slots),) if slots else () + (ConverseRow(ChatCompletionSystemMessage(role="system", content=list(_text_parts(slots))), slots),) + if slots + else () ) def _request_field_rows(value: object) -> tuple[ConverseRow, ...]: slots: Final = _string_leaves(("additionalModelRequestFields",), value) - return (ConverseRow(ChatCompletionUserMessage(role="user", content=_text_parts(slots)), slots),) if slots else () + return ( + (ConverseRow(ChatCompletionUserMessage(role="user", content=list(_text_parts(slots))), slots),) if slots else () + ) def converse_rows(request: ConverseRequest, include_tool_calls: bool) -> tuple[ConverseRow, ...]: diff --git a/litellm/llms/bedrock/passthrough/guardrail_translation/handler.py b/litellm/llms/bedrock/passthrough/guardrail_translation/handler.py index c9e295ca123..72d7e8f38be 100644 --- a/litellm/llms/bedrock/passthrough/guardrail_translation/handler.py +++ b/litellm/llms/bedrock/passthrough/guardrail_translation/handler.py @@ -170,13 +170,10 @@ class _Scope: scan_only_tool_results: bool -def _flat_texts(body: dict, scope: _Scope) -> tuple[list[str], list[_StringHolder]]: - return _extract_converse_texts(body, scope.skip_system, scope.skip_tool, scope.scan_only_tool_results) - - def _texts_applied_rows(body: Mapping[str, object], texts: Sequence[str], scope: _Scope) -> tuple[ConverseRow, ...]: rewritten: Final = copy.deepcopy(dict(body)) - _write_back_texts(texts, _flat_texts(rewritten, scope)[1]) + _, holders = _extract_converse_texts(rewritten, scope.skip_system, scope.skip_tool, scope.scan_only_tool_results) + _write_back_texts(texts, holders) request: Final = parse_converse_request(rewritten) return converse_rows(request, include_tool_calls=not scope.skip_tool) if request else () @@ -530,7 +527,7 @@ class BedrockPassthroughGuardrailHandler(BaseTranslation): skip_tool=effective_skip_tool_message_for_guardrail(guardrail_to_apply), scan_only_tool_results=effective_scan_only_tool_results_for_guardrail(guardrail_to_apply), ) - texts, holders = _flat_texts(body, scope) + texts, holders = _extract_converse_texts(body, scope.skip_system, scope.skip_tool, scope.scan_only_tool_results) request: Final = parse_converse_request(body) rows: Final = converse_rows(request, include_tool_calls=not scope.skip_tool) if request else () scoped_indices: Final = scoped_structured_message_indices(