| 1740 | * AFTER normalizeMessagesForAPI has already run, so inputs are already normalized. |
| 1741 | */ |
| 1742 | export function stripCallerFieldFromAssistantMessage( |
| 1743 | message: AssistantMessage, |
| 1744 | ): AssistantMessage { |
| 1745 | const hasCallerField = message.message.content.some( |
| 1746 | block => |
| 1747 | block.type === 'tool_use' && 'caller' in block && block.caller !== null, |
| 1748 | ) |
| 1749 | |
| 1750 | if (!hasCallerField) { |
| 1751 | return message |
| 1752 | } |
| 1753 | |
| 1754 | return { |
| 1755 | ...message, |
| 1756 | message: { |
| 1757 | ...message.message, |
| 1758 | content: message.message.content.map(block => { |
| 1759 | if (block.type !== 'tool_use') { |
| 1760 | return block |
| 1761 | } |
| 1762 | // Explicitly construct with only standard API fields |
| 1763 | return { |
| 1764 | type: 'tool_use' as const, |
| 1765 | id: block.id, |
| 1766 | name: block.name, |
| 1767 | input: block.input, |
| 1768 | } |
| 1769 | }), |
| 1770 | }, |
| 1771 | } |
| 1772 | } |
| 1773 | |
| 1774 | /** |
| 1775 | * Does the content array have a tool_result block whose inner content |