fix: validate content block type in Anthropic assistant blocks (#4060)
_assistant_blocks appends dict items from content lists directly
without checking for the required 'type' field. A block like
{'text': 'hi'} reaches the Anthropic payload without a 'type',
causing a 400 rejection.
Add the same missing-type check that _convert_user_content already has,
so bare dicts in assistant content lists are coerced to text blocks
instead of triggering API validation errors.
Co-authored-by: nanobot-issues <issues@nanobot.dev>
This commit is contained in:
committed by
Xubin Ren
co-authored by
nanobot-issues
parent
d8601478db
commit
efb792ff24
@@ -275,7 +275,16 @@ class AnthropicProvider(LLMProvider):
|
|||||||
blocks.append({"type": "text", "text": content})
|
blocks.append({"type": "text", "text": content})
|
||||||
elif isinstance(content, list):
|
elif isinstance(content, list):
|
||||||
for item in content:
|
for item in content:
|
||||||
blocks.append(item if isinstance(item, dict) else {"type": "text", "text": str(item)})
|
if isinstance(item, dict):
|
||||||
|
if not item.get("type"):
|
||||||
|
# Anthropic requires every content block to declare a "type".
|
||||||
|
# A tool that returned a bare dict lands here; coerce it to
|
||||||
|
# a text block instead of emitting one that the API rejects.
|
||||||
|
blocks.append({"type": "text", "text": str(item)})
|
||||||
|
else:
|
||||||
|
blocks.append(item)
|
||||||
|
else:
|
||||||
|
blocks.append({"type": "text", "text": str(item)})
|
||||||
|
|
||||||
for tc in msg.get("tool_calls") or []:
|
for tc in msg.get("tool_calls") or []:
|
||||||
if not isinstance(tc, dict):
|
if not isinstance(tc, dict):
|
||||||
|
|||||||
Reference in New Issue
Block a user