fix(bedrock): keep new Converse helpers inside the type discipline rules

This commit is contained in:
yucheng-berri 2026-10-12 12:22:07 -07:00
parent 157881085f
commit 8a00b77644
2 changed files with 17 additions and 14 deletions

View file

@ -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, ...]:

View file

@ -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(