@nhtio/adk 0.1.0-master-2a4e1bd2 → 0.1.0-master-cd595e6f
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +40 -0
- package/artifact_methods-CJDQ5Lv-.mjs +1 -0
- package/artifact_methods-D6k_82r3.js +1 -0
- package/batteries/artifacts/ecmascript.cjs +1 -1
- package/batteries/artifacts/ecmascript.mjs +1 -1
- package/batteries/artifacts/toon.cjs +1 -1
- package/batteries/artifacts/toon.mjs +1 -1
- package/batteries/artifacts/xml.cjs +1 -1
- package/batteries/artifacts/xml.mjs +1 -1
- package/batteries/artifacts/yaml.cjs +1 -1
- package/batteries/artifacts/yaml.mjs +1 -1
- package/batteries/artifacts.cjs +4 -4
- package/batteries/artifacts.mjs +4 -4
- package/batteries/dev-tools/forge.cjs +3 -3
- package/batteries/dev-tools/forge.mjs +3 -3
- package/batteries/dev-tools.cjs +2 -2
- package/batteries/dev-tools.mjs +2 -2
- package/batteries/encoding.cjs +7 -7
- package/batteries/encoding.mjs +7 -7
- package/batteries/generation/gemini/adapter.cjs +1 -1
- package/batteries/generation/gemini/adapter.mjs +1 -1
- package/batteries/generation/local_diffusion/adapter.cjs +1 -1
- package/batteries/generation/local_diffusion/adapter.mjs +1 -1
- package/batteries/generation/openai/adapter.cjs +1 -1
- package/batteries/generation/openai/adapter.mjs +1 -1
- package/batteries/isolation/browser.d.ts +1 -1
- package/batteries/isolation/child_process/transport.d.ts +2 -2
- package/batteries/isolation/child_process.cjs +4 -4
- package/batteries/isolation/child_process.cjs.map +1 -1
- package/batteries/isolation/child_process.mjs +4 -4
- package/batteries/isolation/child_process.mjs.map +1 -1
- package/batteries/isolation/codec.d.ts +2 -2
- package/batteries/isolation/crash_policy.d.ts +1 -1
- package/batteries/isolation/isolate_function.d.ts +2 -2
- package/batteries/isolation/protocol.d.ts +4 -4
- package/batteries/isolation/serve.d.ts +2 -2
- package/batteries/isolation/types.d.ts +4 -4
- package/batteries/isolation.cjs +1 -1
- package/batteries/isolation.mjs +1 -1
- package/batteries/llm/anthropic_messages/adapter.cjs +6 -6
- package/batteries/llm/anthropic_messages/adapter.cjs.map +1 -1
- package/batteries/llm/anthropic_messages/adapter.mjs +6 -6
- package/batteries/llm/anthropic_messages/adapter.mjs.map +1 -1
- package/batteries/llm/anthropic_messages/count_tokens.cjs +1 -1
- package/batteries/llm/anthropic_messages/count_tokens.mjs +1 -1
- package/batteries/llm/anthropic_messages/helpers.cjs +3 -3
- package/batteries/llm/anthropic_messages/helpers.mjs +3 -3
- package/batteries/llm/anthropic_messages/types.d.ts +2 -2
- package/batteries/llm/anthropic_messages/validation.cjs +3 -3
- package/batteries/llm/anthropic_messages/validation.cjs.map +1 -1
- package/batteries/llm/anthropic_messages/validation.mjs +3 -3
- package/batteries/llm/anthropic_messages/validation.mjs.map +1 -1
- package/batteries/llm/anthropic_messages.cjs +2 -2
- package/batteries/llm/anthropic_messages.mjs +2 -2
- package/batteries/llm/bedrock_converse/adapter.cjs +29 -7
- package/batteries/llm/bedrock_converse/adapter.cjs.map +1 -1
- package/batteries/llm/bedrock_converse/adapter.mjs +30 -8
- package/batteries/llm/bedrock_converse/adapter.mjs.map +1 -1
- package/batteries/llm/bedrock_converse/exceptions.cjs +3 -0
- package/batteries/llm/bedrock_converse/exceptions.cjs.map +1 -1
- package/batteries/llm/bedrock_converse/exceptions.d.ts +6 -0
- package/batteries/llm/bedrock_converse/exceptions.mjs +3 -1
- package/batteries/llm/bedrock_converse/exceptions.mjs.map +1 -1
- package/batteries/llm/bedrock_converse/helpers.cjs +1 -1
- package/batteries/llm/bedrock_converse/helpers.mjs +1 -1
- package/batteries/llm/bedrock_converse/types.d.ts +6 -2
- package/batteries/llm/bedrock_converse/validation.cjs +7 -1
- package/batteries/llm/bedrock_converse/validation.cjs.map +1 -1
- package/batteries/llm/bedrock_converse/validation.mjs +7 -1
- package/batteries/llm/bedrock_converse/validation.mjs.map +1 -1
- package/batteries/llm/bedrock_converse.cjs +2 -2
- package/batteries/llm/bedrock_converse.mjs +2 -2
- package/batteries/llm/claude_code_cli/adapter.cjs +6 -6
- package/batteries/llm/claude_code_cli/adapter.cjs.map +1 -1
- package/batteries/llm/claude_code_cli/adapter.mjs +6 -6
- package/batteries/llm/claude_code_cli/adapter.mjs.map +1 -1
- package/batteries/llm/claude_code_cli/helpers.cjs +3 -3
- package/batteries/llm/claude_code_cli/helpers.mjs +3 -3
- package/batteries/llm/claude_code_cli/types.d.ts +3 -2
- package/batteries/llm/claude_code_cli/validation.cjs +3 -3
- package/batteries/llm/claude_code_cli/validation.cjs.map +1 -1
- package/batteries/llm/claude_code_cli/validation.mjs +3 -3
- package/batteries/llm/claude_code_cli/validation.mjs.map +1 -1
- package/batteries/llm/claude_code_cli.cjs +1 -1
- package/batteries/llm/claude_code_cli.mjs +1 -1
- package/batteries/llm/gemini_generate_content/adapter.cjs +29 -7
- package/batteries/llm/gemini_generate_content/adapter.cjs.map +1 -1
- package/batteries/llm/gemini_generate_content/adapter.mjs +30 -8
- package/batteries/llm/gemini_generate_content/adapter.mjs.map +1 -1
- package/batteries/llm/gemini_generate_content/exceptions.cjs +3 -0
- package/batteries/llm/gemini_generate_content/exceptions.cjs.map +1 -1
- package/batteries/llm/gemini_generate_content/exceptions.d.ts +6 -0
- package/batteries/llm/gemini_generate_content/exceptions.mjs +3 -1
- package/batteries/llm/gemini_generate_content/exceptions.mjs.map +1 -1
- package/batteries/llm/gemini_generate_content/helpers.cjs +1 -1
- package/batteries/llm/gemini_generate_content/helpers.mjs +1 -1
- package/batteries/llm/gemini_generate_content/types.d.ts +7 -3
- package/batteries/llm/gemini_generate_content/validation.cjs +11 -2
- package/batteries/llm/gemini_generate_content/validation.cjs.map +1 -1
- package/batteries/llm/gemini_generate_content/validation.mjs +11 -2
- package/batteries/llm/gemini_generate_content/validation.mjs.map +1 -1
- package/batteries/llm/gemini_generate_content.cjs +1 -1
- package/batteries/llm/gemini_generate_content.mjs +1 -1
- package/batteries/llm/litert_lm/adapter.cjs +6 -6
- package/batteries/llm/litert_lm/adapter.cjs.map +1 -1
- package/batteries/llm/litert_lm/adapter.mjs +6 -6
- package/batteries/llm/litert_lm/adapter.mjs.map +1 -1
- package/batteries/llm/litert_lm/helpers.cjs +3 -3
- package/batteries/llm/litert_lm/helpers.mjs +3 -3
- package/batteries/llm/litert_lm/types.d.ts +2 -2
- package/batteries/llm/litert_lm/validation.cjs +3 -3
- package/batteries/llm/litert_lm/validation.cjs.map +1 -1
- package/batteries/llm/litert_lm/validation.mjs +3 -3
- package/batteries/llm/litert_lm/validation.mjs.map +1 -1
- package/batteries/llm/litert_lm.cjs +1 -1
- package/batteries/llm/litert_lm.mjs +1 -1
- package/batteries/llm/ollama/adapter.cjs +6 -6
- package/batteries/llm/ollama/adapter.cjs.map +1 -1
- package/batteries/llm/ollama/adapter.mjs +6 -6
- package/batteries/llm/ollama/adapter.mjs.map +1 -1
- package/batteries/llm/ollama/helpers.cjs +4 -4
- package/batteries/llm/ollama/helpers.mjs +4 -4
- package/batteries/llm/ollama/types.d.ts +2 -2
- package/batteries/llm/ollama/validation.cjs +3 -3
- package/batteries/llm/ollama/validation.cjs.map +1 -1
- package/batteries/llm/ollama/validation.mjs +3 -3
- package/batteries/llm/ollama/validation.mjs.map +1 -1
- package/batteries/llm/ollama.cjs +2 -2
- package/batteries/llm/ollama.mjs +2 -2
- package/batteries/llm/openai_chat_completions/adapter.cjs +6 -6
- package/batteries/llm/openai_chat_completions/adapter.cjs.map +1 -1
- package/batteries/llm/openai_chat_completions/adapter.mjs +6 -6
- package/batteries/llm/openai_chat_completions/adapter.mjs.map +1 -1
- package/batteries/llm/openai_chat_completions/helpers.cjs +4 -4
- package/batteries/llm/openai_chat_completions/helpers.mjs +4 -4
- package/batteries/llm/openai_chat_completions/types.d.ts +2 -2
- package/batteries/llm/openai_chat_completions/validation.cjs +3 -3
- package/batteries/llm/openai_chat_completions/validation.cjs.map +1 -1
- package/batteries/llm/openai_chat_completions/validation.mjs +3 -3
- package/batteries/llm/openai_chat_completions/validation.mjs.map +1 -1
- package/batteries/llm/openai_chat_completions.cjs +2 -2
- package/batteries/llm/openai_chat_completions.mjs +2 -2
- package/batteries/llm/openai_responses/adapter.cjs +6 -6
- package/batteries/llm/openai_responses/adapter.cjs.map +1 -1
- package/batteries/llm/openai_responses/adapter.mjs +6 -6
- package/batteries/llm/openai_responses/adapter.mjs.map +1 -1
- package/batteries/llm/openai_responses/helpers.cjs +3 -3
- package/batteries/llm/openai_responses/helpers.mjs +3 -3
- package/batteries/llm/openai_responses/types.d.ts +2 -2
- package/batteries/llm/openai_responses/validation.cjs +3 -3
- package/batteries/llm/openai_responses/validation.cjs.map +1 -1
- package/batteries/llm/openai_responses/validation.mjs +3 -3
- package/batteries/llm/openai_responses/validation.mjs.map +1 -1
- package/batteries/llm/openai_responses.cjs +2 -2
- package/batteries/llm/openai_responses.mjs +2 -2
- package/batteries/llm/transformers_js/adapter.cjs +6 -6
- package/batteries/llm/transformers_js/adapter.cjs.map +1 -1
- package/batteries/llm/transformers_js/adapter.mjs +6 -6
- package/batteries/llm/transformers_js/adapter.mjs.map +1 -1
- package/batteries/llm/transformers_js/helpers.cjs +3 -3
- package/batteries/llm/transformers_js/helpers.mjs +3 -3
- package/batteries/llm/transformers_js/types.d.ts +2 -2
- package/batteries/llm/transformers_js/validation.cjs +3 -3
- package/batteries/llm/transformers_js/validation.cjs.map +1 -1
- package/batteries/llm/transformers_js/validation.mjs +3 -3
- package/batteries/llm/transformers_js/validation.mjs.map +1 -1
- package/batteries/llm/transformers_js.cjs +1 -1
- package/batteries/llm/transformers_js.mjs +1 -1
- package/batteries/llm/webllm_chat_completions/adapter.cjs +6 -6
- package/batteries/llm/webllm_chat_completions/adapter.cjs.map +1 -1
- package/batteries/llm/webllm_chat_completions/adapter.mjs +6 -6
- package/batteries/llm/webllm_chat_completions/adapter.mjs.map +1 -1
- package/batteries/llm/webllm_chat_completions/helpers.cjs +1 -1
- package/batteries/llm/webllm_chat_completions/helpers.mjs +1 -1
- package/batteries/llm/webllm_chat_completions/validation.cjs +3 -3
- package/batteries/llm/webllm_chat_completions/validation.cjs.map +1 -1
- package/batteries/llm/webllm_chat_completions/validation.mjs +3 -3
- package/batteries/llm/webllm_chat_completions/validation.mjs.map +1 -1
- package/batteries/llm/webllm_chat_completions.cjs +2 -2
- package/batteries/llm/webllm_chat_completions.mjs +2 -2
- package/batteries/llm.cjs +2 -2
- package/batteries/llm.mjs +2 -2
- package/batteries/media/builder.d.ts +3 -0
- package/batteries/media/contracts.cjs.map +1 -1
- package/batteries/media/contracts.d.ts +40 -1
- package/batteries/media/contracts.mjs.map +1 -1
- package/batteries/media/engines/sharp.cjs +36 -2
- package/batteries/media/engines/sharp.cjs.map +1 -1
- package/batteries/media/engines/sharp.mjs +36 -2
- package/batteries/media/engines/sharp.mjs.map +1 -1
- package/batteries/media/forge.cjs +5 -5
- package/batteries/media/forge.mjs +5 -5
- package/batteries/media/index.d.ts +1 -1
- package/batteries/media/lint.cjs +3 -2
- package/batteries/media/lint.cjs.map +1 -1
- package/batteries/media/lint.mjs +3 -2
- package/batteries/media/lint.mjs.map +1 -1
- package/batteries/media.cjs +66 -2
- package/batteries/media.cjs.map +1 -1
- package/batteries/media.mjs +66 -2
- package/batteries/media.mjs.map +1 -1
- package/batteries/orchestration/conformance.cjs +123 -74
- package/batteries/orchestration/conformance.cjs.map +1 -1
- package/batteries/orchestration/conformance.d.ts +10 -8
- package/batteries/orchestration/conformance.mjs +54 -5
- package/batteries/orchestration/conformance.mjs.map +1 -1
- package/batteries/orchestration/dispatch_reasoner.cjs +4 -4
- package/batteries/orchestration/dispatch_reasoner.mjs +4 -4
- package/batteries/orchestration/executor.cjs +2 -2
- package/batteries/orchestration/executor.mjs +2 -2
- package/batteries/orchestration/forge.cjs +4 -4
- package/batteries/orchestration/forge.mjs +4 -4
- package/batteries/orchestration/validation.cjs +2 -2
- package/batteries/orchestration/validation.mjs +2 -2
- package/batteries/orchestration.cjs +4 -4
- package/batteries/orchestration.mjs +4 -4
- package/batteries/sandbox/contracts/policy_enforcer.d.ts +13 -1
- package/batteries/sandbox/js/compartment.d.ts +7 -2
- package/batteries/sandbox/js/exceptions.d.ts +4 -0
- package/batteries/sandbox/js/runner.d.ts +1 -1
- package/batteries/sandbox/js/service.d.ts +1 -1
- package/batteries/sandbox/js/ses_contracts.d.ts +4 -3
- package/batteries/sandbox/js.cjs +17 -8
- package/batteries/sandbox/js.cjs.map +1 -1
- package/batteries/sandbox/js.mjs +17 -9
- package/batteries/sandbox/js.mjs.map +1 -1
- package/batteries/sandbox/manager.d.ts +4 -3
- package/batteries/sandbox/node/srt_enforcer.d.ts +1 -1
- package/batteries/sandbox/node.cjs +36 -12
- package/batteries/sandbox/node.cjs.map +1 -1
- package/batteries/sandbox/node.mjs +36 -12
- package/batteries/sandbox/node.mjs.map +1 -1
- package/batteries/sandbox/tools.cjs +1 -1
- package/batteries/sandbox/tools.mjs +1 -1
- package/batteries/sandbox/types.d.ts +10 -1
- package/batteries/sandbox.cjs +27 -9
- package/batteries/sandbox.cjs.map +1 -1
- package/batteries/sandbox.mjs +28 -11
- package/batteries/sandbox.mjs.map +1 -1
- package/batteries/skills.cjs +9 -9
- package/batteries/skills.mjs +9 -9
- package/batteries/tools/_shared.cjs +1 -1
- package/batteries/tools/_shared.mjs +1 -1
- package/batteries/tools/color.cjs +2 -2
- package/batteries/tools/color.mjs +2 -2
- package/batteries/tools/comparison.cjs +2 -2
- package/batteries/tools/comparison.mjs +2 -2
- package/batteries/tools/data_structure.cjs +2 -2
- package/batteries/tools/data_structure.mjs +2 -2
- package/batteries/tools/datetime_extended.cjs +3 -3
- package/batteries/tools/datetime_extended.mjs +3 -3
- package/batteries/tools/datetime_math.cjs +3 -3
- package/batteries/tools/datetime_math.mjs +3 -3
- package/batteries/tools/encoding.cjs +2 -2
- package/batteries/tools/encoding.mjs +2 -2
- package/batteries/tools/formatting.cjs +2 -2
- package/batteries/tools/formatting.mjs +2 -2
- package/batteries/tools/geo_basics.cjs +2 -2
- package/batteries/tools/geo_basics.mjs +2 -2
- package/batteries/tools/math.cjs +2 -2
- package/batteries/tools/math.mjs +2 -2
- package/batteries/tools/memory.cjs +5 -5
- package/batteries/tools/memory.mjs +5 -5
- package/batteries/tools/parsing.cjs +3 -3
- package/batteries/tools/parsing.mjs +3 -3
- package/batteries/tools/retrievables.cjs +5 -5
- package/batteries/tools/retrievables.mjs +5 -5
- package/batteries/tools/scrapper.cjs +1 -1
- package/batteries/tools/scrapper.mjs +1 -1
- package/batteries/tools/searxng.cjs +1 -1
- package/batteries/tools/searxng.mjs +1 -1
- package/batteries/tools/standing_instructions.cjs +3 -3
- package/batteries/tools/standing_instructions.mjs +3 -3
- package/batteries/tools/statistics.cjs +3 -3
- package/batteries/tools/statistics.mjs +3 -3
- package/batteries/tools/string_processing.cjs +2 -2
- package/batteries/tools/string_processing.mjs +2 -2
- package/batteries/tools/structured_data.cjs +2 -2
- package/batteries/tools/structured_data.mjs +2 -2
- package/batteries/tools/text_analysis.cjs +3 -3
- package/batteries/tools/text_analysis.mjs +3 -3
- package/batteries/tools/text_comparison.cjs +2 -2
- package/batteries/tools/text_comparison.mjs +2 -2
- package/batteries/tools/time.cjs +3 -3
- package/batteries/tools/time.mjs +3 -3
- package/batteries/tools/unit_conversion.cjs +2 -2
- package/batteries/tools/unit_conversion.mjs +2 -2
- package/batteries/tools.cjs +2 -2
- package/batteries/tools.mjs +2 -2
- package/batteries/validation.cjs +5 -5
- package/batteries/validation.mjs +5 -5
- package/batteries/vector/conformance/index.d.ts +11 -16
- package/batteries/vector/conformance.cjs +107 -36
- package/batteries/vector/conformance.cjs.map +1 -1
- package/batteries/vector/conformance.mjs +84 -13
- package/batteries/vector/conformance.mjs.map +1 -1
- package/batteries/vector/retrievable.cjs +1 -1
- package/batteries/vector/retrievable.mjs +1 -1
- package/batteries.cjs +5 -5
- package/batteries.mjs +5 -5
- package/{chat_common-DbbIESdo.mjs → chat_common-CmKV5Dz4.mjs} +2 -2
- package/{chat_common-DbbIESdo.mjs.map → chat_common-CmKV5Dz4.mjs.map} +1 -1
- package/{chat_common-B3O3zz-i.js → chat_common-Dpan9moo.js} +2 -2
- package/{chat_common-B3O3zz-i.js.map → chat_common-Dpan9moo.js.map} +1 -1
- package/{common-v9Jo9M5k.mjs → common-BpdHIpQE.mjs} +7 -7
- package/{common-v9Jo9M5k.mjs.map → common-BpdHIpQE.mjs.map} +1 -1
- package/{common-BV3HGeLj.js → common-H44Ik9ou.js} +7 -7
- package/{common-BV3HGeLj.js.map → common-H44Ik9ou.js.map} +1 -1
- package/common.cjs +7 -7
- package/common.mjs +7 -7
- package/{dispatch_runner-CbNyqSMy.mjs → dispatch_runner-BZDXUe0G.mjs} +5 -5
- package/{dispatch_runner-CbNyqSMy.mjs.map → dispatch_runner-BZDXUe0G.mjs.map} +1 -1
- package/{dispatch_runner-Bl3Xwebu.js → dispatch_runner-CKhm-scw.js} +5 -5
- package/{dispatch_runner-Bl3Xwebu.js.map → dispatch_runner-CKhm-scw.js.map} +1 -1
- package/dispatch_runner.cjs +1 -1
- package/dispatch_runner.mjs +1 -1
- package/{ecmascript-BSnvyY8T.js → ecmascript-CCtgamDh.js} +3 -3
- package/{ecmascript-BSnvyY8T.js.map → ecmascript-CCtgamDh.js.map} +1 -1
- package/{ecmascript-CZ7_YKfZ.mjs → ecmascript-DcmUQ9Jx.mjs} +3 -3
- package/{ecmascript-CZ7_YKfZ.mjs.map → ecmascript-DcmUQ9Jx.mjs.map} +1 -1
- package/eslint.cjs +1 -1
- package/eslint.mjs +1 -1
- package/exceptions.cjs +1 -1
- package/exceptions.mjs +1 -1
- package/forge.cjs +2 -2
- package/forge.mjs +2 -2
- package/guards.cjs +7 -7
- package/guards.mjs +7 -7
- package/{helpers-CDmLDBq5.mjs → helpers-BH7HTtkD.mjs} +3 -3
- package/{helpers-CDmLDBq5.mjs.map → helpers-BH7HTtkD.mjs.map} +1 -1
- package/{helpers-Tvvwpx1M.js → helpers-CEjjkXso.js} +3 -3
- package/{helpers-Tvvwpx1M.js.map → helpers-CEjjkXso.js.map} +1 -1
- package/index.cjs +10 -10
- package/index.mjs +10 -10
- package/{isolation-BQCTQYZ_.js → isolation-7Jrcucgc.js} +11 -11
- package/isolation-7Jrcucgc.js.map +1 -0
- package/{isolation-7xbkc12r.mjs → isolation-CO0NiK8R.mjs} +11 -11
- package/isolation-CO0NiK8R.mjs.map +1 -0
- package/lib/classes/tokenizable.d.ts +2 -3
- package/mcp/adk-docs-corpus.json +2 -2
- package/package.json +469 -469
- package/{retrievable-C5dXuDhD.js → retrievable-BTwjmPnl.js} +3 -3
- package/{retrievable-C5dXuDhD.js.map → retrievable-BTwjmPnl.js.map} +1 -1
- package/{retrievable-gl_TIHnX.mjs → retrievable-CXTAUuuv.mjs} +3 -3
- package/{retrievable-gl_TIHnX.mjs.map → retrievable-CXTAUuuv.mjs.map} +1 -1
- package/{scrapper-DD6-_2u-.js → scrapper-CJexXXK-.js} +4 -4
- package/{scrapper-DD6-_2u-.js.map → scrapper-CJexXXK-.js.map} +1 -1
- package/{scrapper-u_orpxIB.mjs → scrapper-DiQ5FfDL.mjs} +4 -4
- package/{scrapper-u_orpxIB.mjs.map → scrapper-DiQ5FfDL.mjs.map} +1 -1
- package/{searxng-fVdJUCK2.mjs → searxng-BFTJ6rTE.mjs} +4 -4
- package/{searxng-fVdJUCK2.mjs.map → searxng-BFTJ6rTE.mjs.map} +1 -1
- package/{searxng-C7GK0Nrz.js → searxng-DzlGZG4V.js} +4 -4
- package/{searxng-C7GK0Nrz.js.map → searxng-DzlGZG4V.js.map} +1 -1
- package/server.json +2 -2
- package/skills/adk-assembly/SKILL.md +2 -2
- package/{spooled_artifact-DriNQRj7.js → spooled_artifact-BpcesRBv.js} +384 -384
- package/spooled_artifact-BpcesRBv.js.map +1 -0
- package/{spooled_artifact-BkueYJhR.mjs → spooled_artifact-Bw_7swIp.mjs} +385 -385
- package/spooled_artifact-Bw_7swIp.mjs.map +1 -0
- package/spooled_artifact.cjs +2 -2
- package/spooled_artifact.mjs +2 -2
- package/{spooled_markdown_artifact-CfHRZUkl.mjs → spooled_markdown_artifact-vd6eNtIP.mjs} +3 -3
- package/{spooled_markdown_artifact-CfHRZUkl.mjs.map → spooled_markdown_artifact-vd6eNtIP.mjs.map} +1 -1
- package/{spooled_markdown_artifact-C_VkCDhF.js → spooled_markdown_artifact-wJPnE8Ij.js} +3 -3
- package/{spooled_markdown_artifact-C_VkCDhF.js.map → spooled_markdown_artifact-wJPnE8Ij.js.map} +1 -1
- package/{thought-B8JAi3-W.mjs → thought-BE1KGEhV.mjs} +3 -3
- package/{thought-B8JAi3-W.mjs.map → thought-BE1KGEhV.mjs.map} +1 -1
- package/{thought--fRgOwTP.js → thought-bS7O9O5H.js} +3 -3
- package/{thought--fRgOwTP.js.map → thought-bS7O9O5H.js.map} +1 -1
- package/{tokenizable-CWW7iSrD.js → tokenizable-BMZuGWRd.js} +35 -29
- package/tokenizable-BMZuGWRd.js.map +1 -0
- package/{tokenizable-DLMP68ZV.mjs → tokenizable-VB4Av8GF.mjs} +36 -30
- package/tokenizable-VB4Av8GF.mjs.map +1 -0
- package/{tool_call-CPjyvkm4.mjs → tool_call-Cfaj-6zK.mjs} +4 -4
- package/{tool_call-CPjyvkm4.mjs.map → tool_call-Cfaj-6zK.mjs.map} +1 -1
- package/{tool_call-DgqVwL5n.js → tool_call-Fs_Uh5wQ.js} +4 -4
- package/{tool_call-DgqVwL5n.js.map → tool_call-Fs_Uh5wQ.js.map} +1 -1
- package/{tools-BmLzkvNr.mjs → tools-B3_8C78Q.mjs} +6 -6
- package/{tools-BmLzkvNr.mjs.map → tools-B3_8C78Q.mjs.map} +1 -1
- package/{tools-DmcIe2Cb.js → tools-CqOcmHR8.js} +6 -6
- package/{tools-DmcIe2Cb.js.map → tools-CqOcmHR8.js.map} +1 -1
- package/{toon-BvTQsKdN.mjs → toon-BSlr88px.mjs} +5 -5
- package/{toon-BvTQsKdN.mjs.map → toon-BSlr88px.mjs.map} +1 -1
- package/{toon-B05eKx-q.js → toon-D71tkyI3.js} +5 -5
- package/{toon-B05eKx-q.js.map → toon-D71tkyI3.js.map} +1 -1
- package/{turn_runner-DEGCvfVZ.mjs → turn_runner-BHHD6h77.mjs} +5 -5
- package/{turn_runner-DEGCvfVZ.mjs.map → turn_runner-BHHD6h77.mjs.map} +1 -1
- package/{turn_runner-DT8TseR4.js → turn_runner-DhLI7OTH.js} +5 -5
- package/{turn_runner-DT8TseR4.js.map → turn_runner-DhLI7OTH.js.map} +1 -1
- package/turn_runner.cjs +1 -1
- package/turn_runner.mjs +1 -1
- package/types-D6X_aUIb.mjs.map +1 -1
- package/types-DrSosVaM.js.map +1 -1
- package/{validate-lzy9nG_E.mjs → validate-Bi7FGjoq.mjs} +13 -1
- package/{validate-lzy9nG_E.mjs.map → validate-Bi7FGjoq.mjs.map} +1 -1
- package/{validate-CdOS7S2u.js → validate-CkQI-48O.js} +13 -1
- package/{validate-CdOS7S2u.js.map → validate-CkQI-48O.js.map} +1 -1
- package/{xml-DDTIMpY3.js → xml-BeNvlifb.js} +5 -5
- package/{xml-DDTIMpY3.js.map → xml-BeNvlifb.js.map} +1 -1
- package/{xml-VhJ4NrMB.mjs → xml-vyCZZiF_.mjs} +5 -5
- package/{xml-VhJ4NrMB.mjs.map → xml-vyCZZiF_.mjs.map} +1 -1
- package/{yaml-Cx16IYJq.js → yaml-DhLLa2cj.js} +5 -5
- package/{yaml-Cx16IYJq.js.map → yaml-DhLLa2cj.js.map} +1 -1
- package/{yaml-Du4wFGzL.mjs → yaml-Dtz0Bd7J.mjs} +5 -5
- package/{yaml-Du4wFGzL.mjs.map → yaml-Dtz0Bd7J.mjs.map} +1 -1
- package/artifact_methods-BMCahBLn.mjs +0 -1
- package/artifact_methods-f_bSy4kX.js +0 -1
- package/isolation-7xbkc12r.mjs.map +0 -1
- package/isolation-BQCTQYZ_.js.map +0 -1
- package/spooled_artifact-BkueYJhR.mjs.map +0 -1
- package/spooled_artifact-DriNQRj7.js.map +0 -1
- package/tokenizable-CWW7iSrD.js.map +0 -1
- package/tokenizable-DLMP68ZV.mjs.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"adapter.cjs","names":["#baseline"],"sources":["../../../../src/batteries/llm/anthropic_messages/adapter.ts"],"sourcesContent":["/**\n * Cross-environment executor adapter for the Anthropic Messages API.\n *\n * @module @nhtio/adk/batteries/llm/anthropic_messages/adapter\n *\n * @remarks\n * Native Anthropic Messages adapter targeting `client.messages.create` from `@anthropic-ai/sdk`\n * (a hard static dependency of this battery). Node-first: an Anthropic API key in a browser\n * bundle is unacceptably exposed, so browser is deliberately not a target or gate for this\n * adapter — `dangerouslyAllowBrowser` exists only for the caller who accepts that risk knowingly.\n *\n * Structurally a sibling of the native Ollama and OpenAI Chat Completions adapters, with the\n * Anthropic-wire divergences:\n *\n * - Transport: the Anthropic SDK owns the HTTP call (`client.messages.create`), not raw `fetch`.\n * ADK owns retry (`maxRetries: 0` on the client) and timeout (`requestTimeoutMs` fences an\n * internal `AbortController` linked with `ctx.abortSignal`; when `requestTimeoutMs` is `0` a\n * large explicit sentinel is set on the SDK client so the SDK's own silent 10-minute default is\n * never silently inherited).\n * - Streaming: `Stream<RawMessageStreamEvent>` — an `AsyncIterable` the SDK already filters `ping`\n * frames out of; a mid-stream provider error surfaces as a **thrown `APIError`** from `for\n * await` iteration, not a discriminated event variant, so the consumption loop is wrapped in a\n * `try`/`catch`.\n * - Content-block state machine keyed by `index`: `content_block_start` carries the ONLY\n * occurrence of a `tool_use` block's `id`/`name` and a `redacted_thinking` block's `data`;\n * `content_block_delta` carries five delta variants (`text_delta`, `thinking_delta`,\n * `signature_delta`, `input_json_delta`, `citations_delta` — the last is out of scope for v1 and\n * is a no-op); `content_block_stop` finalizes only that index. `message_stop` is not trusted to\n * arrive; finalization is reachable from stream EOF too.\n * - Stop reasons: all seven (`end_turn`, `max_tokens`, `stop_sequence`, `tool_use`, `pause_turn`,\n * `refusal`, `model_context_window_exceeded`) are handled explicitly — `refusal` is a real\n * terminal HTTP-200 outcome (never mistaken for an error), `model_context_window_exceeded` maps\n * to `E_ANTHROPIC_MESSAGES_CONTEXT_OVERFLOW`.\n * - Error translation: typed SDK error classes (`BadRequestError`, `AuthenticationError`,\n * `PermissionDeniedError`, `NotFoundError`, `ConflictError`, `UnprocessableEntityError`,\n * `RateLimitError`, `InternalServerError`, `APIConnectionTimeoutError`, `APIConnectionError`,\n * `APIUserAbortError`, generic `APIError`) are narrowed and mapped to ADK exceptions. Context\n * overflow arrives as a 400 `BadRequestError` and is detected from body text (`prompt is too\n * long`), not status. A real upstream 529 `overloaded_error` is retriable\n * (`E_ANTHROPIC_MESSAGES_HTTP_ERROR`) — never routed into the fatal same-numbered\n * adapter-side exceptions, which use 529 as their own unrelated status code.\n * - Thinking persistence: signed `thinking` blocks persist as a `Thought` carrying a\n * `{variant:'thinking', thinking, signature, prefixFingerprint}` payload; `redacted_thinking`\n * blocks carry `{variant:'redacted_thinking', data, prefixFingerprint}`. The fingerprint is\n * computed via the exported `fingerprintAnthropicMessagesPrefix` helper — never reimplemented.\n * - No request repair: a `tool_choice` that appears not to have been honored (forces a name the\n * response never calls) only warns via `helpers.log.warn` — `AnthropicMessagesAdapterOptions`\n * has no `strictToolChoice` escape hatch, consistent with the \"warn loudly, send anyway\" ethos.\n *\n * Per-iteration flow (steps 1–9 of the plan):\n * 1. Merge constructor / executor / stash options and re-validate.\n * 2. Resolve helpers, falling back to bundled `default*` for each unset field.\n * 3. Artifact-reader tools: pre-forged onto `ctx.tools` by the DispatchRunner core; read as-is.\n * 4. Pre-render every persisted tool-call result into an Anthropic tool-result content block.\n * 5. When `tokenEncoding !== null`, sum the token weight of every persisted bucket and throw\n * {@link @nhtio/adk/batteries!E_ANTHROPIC_MESSAGES_CONTEXT_OVERFLOW} when the total exceeds `contextWindow`.\n * 6. Build the request via `buildAnthropicMessagesHistory`.\n * 7. Call `client.messages.create` with retry/timeout ownership; classify and translate errors.\n * 8. Streaming path: content-block state machine + usage latching + stop-reason handling.\n * 9. Non-streaming path: same persistence + tool-execution loop, from a single `Message`.\n */\n\nimport { DateTime } from 'luxon'\nimport { sha256 } from 'js-sha256'\nimport { v6 as uuidv6 } from 'uuid'\nimport { validateOptions } from './validation'\nimport { APIError } from '@anthropic-ai/sdk/core/error'\nimport { default as Anthropic } from '@anthropic-ai/sdk'\nimport { countAnthropicMessagesTokens } from './count_tokens'\nimport { translateAnthropicError } from './error_translation'\nimport { resolveToolCallParser } from '../chat_common/tool_parsers'\nimport { isError, isInstanceOf, isObject } from '@nhtio/adk/guards'\nimport { canonicalStringify } from '../../../lib/utils/canonical_json'\nimport { InMemorySpoolStore } from '@nhtio/adk/batteries/storage/in_memory'\nimport { looksLikeSpooledArtifact, normalizeToolName } from '../chat_common/helpers'\nimport {\n computeBackoff,\n sleepWithJitter,\n parseRetryAfter,\n linkAbortSignals,\n} from '../../../lib/utils/retry'\nimport {\n Tokenizable,\n ToolCall,\n Message,\n Thought,\n SpooledArtifact,\n Media,\n ArtifactTool,\n} from '@nhtio/adk/common'\nimport {\n E_INVALID_ANTHROPIC_MESSAGES_OPTIONS,\n E_ANTHROPIC_MESSAGES_CONTEXT_OVERFLOW,\n E_ANTHROPIC_MESSAGES_HTTP_ERROR,\n E_ANTHROPIC_MESSAGES_STREAM_ERROR,\n E_ANTHROPIC_MESSAGES_STREAM_STALLED,\n E_ANTHROPIC_MESSAGES_REQUEST_TIMEOUT,\n E_ANTHROPIC_MESSAGES_INVALID_TOOL_CALL_ARGS,\n} from './exceptions'\nimport {\n defaultDescriptionToChatCompletionsJsonSchema,\n defaultRenderUntrustedContent,\n defaultRenderTrustedContent,\n defaultRenderStandingInstructions,\n defaultRenderMemories,\n defaultRenderRetrievables,\n defaultRenderRetrievableHandleBody,\n defaultRenderRetrievableSafetyDirective,\n defaultRenderFirstPartyRetrievables,\n defaultRenderThirdPartyPublicRetrievables,\n defaultRenderThirdPartyPrivateRetrievables,\n defaultRenderThought,\n defaultFilterThoughts,\n defaultToolsToChatCompletionsTools,\n defaultRenderChatCompletionsSystemPrompt,\n defaultRenderAnthropicTimelineMessage,\n defaultRenderAnthropicMediaBlocks,\n defaultRenderAnthropicToolCallResult,\n defaultRenderAnthropicSegmentedSystemPrompt,\n defaultRenderAnthropicThinkingBlocks,\n defaultRenderArtifactHandleBody,\n defaultBuildAnthropicMessagesHistory,\n anthropicToolsFromTools,\n fingerprintAnthropicMessagesPrefix,\n} from './helpers'\nimport type { DispatchContext } from '@nhtio/adk/types'\nimport type { Tool, Memory, TokenEncoding } from '@nhtio/adk/common'\nimport type { AnthropicMessagesCountTokensRequestInput } from './count_tokens'\nimport type {\n DispatchExecutorFn,\n DispatchExecutorHelpers,\n GenerationStats,\n} from '@nhtio/adk/dispatch_runner'\nimport type {\n AnthropicMessagesAdapterOptions,\n AnthropicMessagesHelpers,\n AnthropicMessage,\n AnthropicToolResultBlockParam,\n AnthropicToolUseBlockParam,\n AnthropicRawMessageStreamEvent,\n AnthropicRawContentBlockStartEvent,\n AnthropicRawMessageDeltaEvent,\n AnthropicUsage,\n AnthropicMessageDeltaUsage,\n AnthropicThinkingReplayPayload,\n AnthropicStopReason,\n AnthropicMessagesCountTokensInput,\n} from './types'\n\n// ─── An assembled tool call (args kept as a JSON string; id/name arrive on content_block_start) ──\n\ninterface AssembledAnthropicToolCall {\n id: string\n name: string\n args: string\n}\n\n// ─── Content-block accumulator state, keyed by block index ───────────────────\n\ninterface TextBlockState {\n kind: 'text'\n text: string\n}\ninterface ThinkingBlockState {\n kind: 'thinking'\n thinking: string\n signature: string\n}\ninterface RedactedThinkingBlockState {\n kind: 'redacted_thinking'\n data: string\n}\ninterface ToolUseBlockState {\n kind: 'tool_use'\n id: string\n name: string\n args: string\n}\ninterface OtherBlockState {\n kind: 'other'\n}\ntype BlockState =\n | TextBlockState\n | ThinkingBlockState\n | RedactedThinkingBlockState\n | ToolUseBlockState\n | OtherBlockState\n\n// ─── Option merging ────────────────────────────────────────────────────────────\n\nconst mergeRecord = <T extends Record<string, unknown>>(\n layers: ReadonlyArray<T | undefined>\n): T | undefined => {\n let merged: T | undefined\n for (const layer of layers) {\n if (!layer) continue\n merged = { ...(merged ?? ({} as T)), ...layer }\n }\n return merged\n}\n\nconst mergeOptions = (\n baseline: AnthropicMessagesAdapterOptions,\n exec: Partial<AnthropicMessagesAdapterOptions> | undefined,\n stash: Partial<AnthropicMessagesAdapterOptions> | undefined\n): Partial<AnthropicMessagesAdapterOptions> => {\n const layers = [baseline as Partial<AnthropicMessagesAdapterOptions>, exec ?? {}, stash ?? {}]\n const out: Record<string, unknown> = {}\n for (const layer of layers) {\n for (const [k, v] of Object.entries(layer)) {\n if (v === undefined) continue\n if (k === 'headers' || k === 'helpers' || k === 'retry') continue\n out[k] = v\n }\n }\n const headers = mergeRecord(layers.map((l) => l.headers as Record<string, string> | undefined))\n if (headers !== undefined) out.headers = headers\n const helpers = mergeRecord(layers.map((l) => l.helpers as Record<string, unknown> | undefined))\n if (helpers !== undefined) out.helpers = helpers\n const retry = mergeRecord(layers.map((l) => l.retry as Record<string, unknown> | undefined))\n if (retry !== undefined) out.retry = retry\n return out as Partial<AnthropicMessagesAdapterOptions>\n}\n\n// ─── Helper resolution ─────────────────────────────────────────────────────────\n\nconst resolveHelpers = (\n overrides: Partial<AnthropicMessagesHelpers> | undefined\n): AnthropicMessagesHelpers => {\n const src = overrides ?? {}\n return {\n descriptionToChatCompletionsJsonSchema:\n src.descriptionToChatCompletionsJsonSchema ?? defaultDescriptionToChatCompletionsJsonSchema,\n renderUntrustedContent: src.renderUntrustedContent ?? defaultRenderUntrustedContent,\n renderTrustedContent: src.renderTrustedContent ?? defaultRenderTrustedContent,\n renderArtifactHandleBody: src.renderArtifactHandleBody ?? defaultRenderArtifactHandleBody,\n renderRetrievableHandleBody:\n src.renderRetrievableHandleBody ?? defaultRenderRetrievableHandleBody,\n renderStandingInstructions: src.renderStandingInstructions ?? defaultRenderStandingInstructions,\n renderMemories: src.renderMemories ?? defaultRenderMemories,\n renderRetrievables: src.renderRetrievables ?? defaultRenderRetrievables,\n renderRetrievableSafetyDirective:\n src.renderRetrievableSafetyDirective ?? defaultRenderRetrievableSafetyDirective,\n renderFirstPartyRetrievables:\n src.renderFirstPartyRetrievables ?? defaultRenderFirstPartyRetrievables,\n renderThirdPartyPublicRetrievables:\n src.renderThirdPartyPublicRetrievables ?? defaultRenderThirdPartyPublicRetrievables,\n renderThirdPartyPrivateRetrievables:\n src.renderThirdPartyPrivateRetrievables ?? defaultRenderThirdPartyPrivateRetrievables,\n renderThought: src.renderThought ?? defaultRenderThought,\n filterThoughts: src.filterThoughts ?? defaultFilterThoughts,\n toolsToChatCompletionsTools:\n src.toolsToChatCompletionsTools ?? defaultToolsToChatCompletionsTools,\n renderChatCompletionsSystemPrompt:\n src.renderChatCompletionsSystemPrompt ?? defaultRenderChatCompletionsSystemPrompt,\n anthropicToolsFromTools: src.anthropicToolsFromTools ?? anthropicToolsFromTools,\n renderAnthropicTimelineMessage:\n src.renderAnthropicTimelineMessage ?? defaultRenderAnthropicTimelineMessage,\n renderAnthropicMediaBlocks: src.renderAnthropicMediaBlocks ?? defaultRenderAnthropicMediaBlocks,\n renderAnthropicToolCallResult:\n src.renderAnthropicToolCallResult ?? defaultRenderAnthropicToolCallResult,\n renderAnthropicSegmentedSystemPrompt:\n src.renderAnthropicSegmentedSystemPrompt ?? defaultRenderAnthropicSegmentedSystemPrompt,\n renderAnthropicThinkingBlocks:\n src.renderAnthropicThinkingBlocks ?? defaultRenderAnthropicThinkingBlocks,\n buildAnthropicMessagesHistory:\n src.buildAnthropicMessagesHistory ?? defaultBuildAnthropicMessagesHistory,\n }\n}\n\n// ─── ID / checksum / time helpers ──────────────────────────────────────────────\n\nconst computeChecksum = (tool: string, args: unknown): string =>\n sha256(canonicalStringify({ tool, args }))\n\nconst nowIso = (): string => DateTime.now().toISO() ?? new Date().toISOString()\n\nconst estimateTokensOf = async (\n value: {\n estimateTokens: (encoding: TokenEncoding) => number | Promise<number>\n },\n encoding: TokenEncoding\n): Promise<number> => Promise.resolve(value.estimateTokens(encoding))\n\nconst emptyBlockState = (\n block: AnthropicRawContentBlockStartEvent['content_block']\n): BlockState => {\n if (block.type === 'text') return { kind: 'text', text: block.text ?? '' }\n if (block.type === 'thinking')\n return {\n kind: 'thinking',\n thinking: block.thinking ?? '',\n signature: block.signature ?? '',\n }\n if (block.type === 'redacted_thinking') return { kind: 'redacted_thinking', data: block.data }\n if (block.type === 'tool_use') {\n // STREAMING-ONLY seed: on a real `content_block_start` event, `content_block.input` for a\n // `tool_use` block is always the SDK's `{}` placeholder, never the real arguments — the real\n // arguments arrive exclusively via subsequent `input_json_delta.partial_json` fragments on\n // `content_block_delta`, which this state's `args` accumulator appends to verbatim (see the\n // `content_block_delta` handler below). Serializing `block.input` here would seed the\n // accumulator with the string `\"{}\"`, and every later `partial_json` fragment would then be\n // appended onto that placeholder, producing corrupted concatenated JSON such as\n // `{}{\"query\":\"x\"}` that fails `JSON.parse` in `executeAndPersistToolCall` for every streamed\n // tool call. This function is reachable ONLY from the streaming path (Step 8); the\n // non-streaming path (Step 9) is structurally separate — it reads the complete `Message`'s\n // `content` array directly and serializes each `tool_use` block's `input` exactly once, never\n // through this function.\n return {\n kind: 'tool_use',\n id: block.id,\n name: block.name,\n args: '',\n }\n }\n return { kind: 'other' }\n}\n\n// ─── Stop-reason handling (exhaustive over all 7 AnthropicStopReason members) ──\n\n/**\n * Logs the terminal stop reason of a completed generation. Exhaustive over every\n * {@link AnthropicStopReason} member plus an explicit `default` for any value the SDK's union does\n * not yet cover — never a silent fall-through. `model_context_window_exceeded` is included for\n * switch exhaustiveness only: both call sites throw/nack on that reason before this function is\n * reached, so its case body is unreachable in practice.\n */\nconst logAnthropicStopReason = (\n helpers: DispatchExecutorHelpers,\n stopReason: string | null,\n stopDetails: unknown\n): void => {\n switch (stopReason as AnthropicStopReason | null) {\n case 'end_turn':\n helpers.log.debug({\n kind: 'anthropic-stop-reason',\n message: 'Anthropic ended the turn normally (end_turn).',\n payload: { stopReason },\n })\n break\n case 'max_tokens':\n helpers.log.warn({\n kind: 'anthropic-stop-reason',\n message: 'Anthropic stopped because max_tokens was reached; the response may be truncated.',\n payload: { stopReason },\n })\n break\n case 'stop_sequence':\n helpers.log.debug({\n kind: 'anthropic-stop-reason',\n message: 'Anthropic stopped on a configured stop_sequence.',\n payload: { stopReason },\n })\n break\n case 'tool_use':\n helpers.log.debug({\n kind: 'anthropic-stop-reason',\n message: 'Anthropic stopped to invoke one or more tools (tool_use).',\n payload: { stopReason },\n })\n break\n case 'pause_turn':\n helpers.log.info({\n kind: 'anthropic-pause-turn',\n message: 'Anthropic paused a long-running turn; response may be continued verbatim',\n payload: { stopReason },\n })\n break\n case 'refusal':\n helpers.log.warn({\n kind: 'anthropic-refusal',\n message: 'Anthropic returned a refusal stop reason',\n payload: { stopReason, stopDetails },\n })\n break\n case 'model_context_window_exceeded':\n // Unreachable: both call sites nack E_ANTHROPIC_MESSAGES_CONTEXT_OVERFLOW and return as\n // soon as this reason is observed, before this function runs.\n break\n case null:\n break\n default:\n helpers.log.warn({\n kind: 'anthropic-unrecognized-stop-reason',\n message: `Anthropic returned an unrecognized stop_reason \"${String(stopReason)}\"; treating it as a normal terminal response.`,\n payload: { stopReason },\n })\n }\n}\n\n// ─── Generation-stats extraction ───────────────────────────────────────────────\n\nconst extractGenerationStats = (input: {\n model: string\n usage?: AnthropicUsage | AnthropicMessageDeltaUsage\n finishReason?: string | null\n raw: Record<string, unknown>\n}): GenerationStats => {\n const stats: GenerationStats = {\n provider: 'anthropic_messages',\n model: input.model,\n raw: input.raw,\n }\n const usage = input.usage\n if (usage) {\n if (typeof usage.input_tokens === 'number') stats.promptTokens = usage.input_tokens\n if (typeof usage.output_tokens === 'number') stats.completionTokens = usage.output_tokens\n if (typeof usage.input_tokens === 'number' && typeof usage.output_tokens === 'number') {\n stats.totalTokens = usage.input_tokens + usage.output_tokens\n }\n }\n if (typeof input.finishReason === 'string') stats.finishReason = input.finishReason\n return stats\n}\n\n// ─── Adapter class ─────────────────────────────────────────────────────────────\n\n/**\n * Opinionated cross-environment LLM adapter for the Anthropic Messages wire shape.\n *\n * @remarks\n * Construction validates options eagerly via {@link validateOptions} and throws\n * {@link @nhtio/adk/batteries/llm/anthropic_messages!E_INVALID_ANTHROPIC_MESSAGES_OPTIONS} on\n * failure. The returned instance is reusable: call {@link AnthropicMessagesAdapter.executor} once\n * per `DispatchRunner` configuration to obtain a {@link @nhtio/adk!DispatchExecutorFn} bound to\n * the baseline plus optional executor-scope overrides. Per-iteration overrides live on\n * `ctx.stash.anthropicMessages` and take highest precedence; `headers`, `helpers`, and `retry`\n * merge key-by-key across all three layers, every other field is replaced wholesale at the\n * highest layer that sets it. Node-first: browser is explicitly not a target — an Anthropic API\n * key in a browser bundle is unacceptably exposed.\n */\nexport class AnthropicMessagesAdapter {\n /** Customary key for per-iteration overrides on `ctx.stash`. */\n public static readonly STASH_KEY = 'anthropicMessages' as const\n\n readonly #baseline: AnthropicMessagesAdapterOptions\n\n /**\n * @param options - Constructor-baseline options. Re-validated on every iteration after\n * per-dispatch and per-iteration overrides are layered in.\n * @throws {@link @nhtio/adk/batteries/llm/anthropic_messages!E_INVALID_ANTHROPIC_MESSAGES_OPTIONS} when `options` does not satisfy `anthropicMessagesOptionsSchema`.\n */\n constructor(options: unknown) {\n this.#baseline = validateOptions(options)\n }\n\n /**\n * Returns a {@link @nhtio/adk!DispatchExecutorFn} bound to this adapter's baseline plus optional\n * executor-scope overrides.\n *\n * @param overrides - Optional executor-scope overrides. Higher precedence than the baseline,\n * lower precedence than `ctx.stash[STASH_KEY]`.\n */\n executor(overrides?: Partial<AnthropicMessagesAdapterOptions>): DispatchExecutorFn {\n const baseline = this.#baseline\n const adapterClass = AnthropicMessagesAdapter\n return async (ctx: DispatchContext, helpers: DispatchExecutorHelpers): Promise<void> => {\n const localWarn = (msg: string): void => {\n helpers.log.warn({ kind: 'helper-warning', message: msg })\n }\n\n // ── Step 1: merge & validate ──────────────────────────────────────────\n const stashRaw = ctx.stash.get(adapterClass.STASH_KEY, {}) as unknown\n const stashOverrides =\n stashRaw && typeof stashRaw === 'object'\n ? (stashRaw as Partial<AnthropicMessagesAdapterOptions>)\n : {}\n const merged = validateOptions(mergeOptions(baseline, overrides, stashOverrides))\n\n // Cross-field invariant: tokenEncoding non-null requires contextWindow.\n if (merged.tokenEncoding !== null && merged.contextWindow === undefined) {\n throw new E_INVALID_ANTHROPIC_MESSAGES_OPTIONS([\n 'tokenEncoding is non-null but contextWindow is undefined',\n ])\n }\n\n // ── Step 2: resolve helpers ───────────────────────────────────────────\n const resolvedHelpers = resolveHelpers(merged.helpers)\n\n // ── Step 3: artifact-reader tools ─────────────────────────────────────\n // Forged by the DispatchRunner CORE into `ctx.tools` before the input pipeline runs\n // (generation is a generic core concern; this battery owns only representation). Read the\n // pre-forged `ctx.tools` directly — no local merge, no bindContext here.\n\n // ── Step 4: pre-render tool-call results ──────────────────────────────\n // Key by primitive identity: duplicate provider ids must not cross-wire results.\n const renderedToolCallResults = new Map<ToolCall, AnthropicToolResultBlockParam>()\n for (const tc of ctx.turnToolCalls) {\n const rendered = await resolvedHelpers.renderAnthropicToolCallResult({\n toolCall: tc,\n results: tc.results as\n | Tokenizable\n | SpooledArtifact\n | SpooledArtifact[]\n | Media\n | Media[],\n tool: ctx.tools.get(tc.tool) as Tool | ArtifactTool | undefined,\n renderUntrustedContent: resolvedHelpers.renderUntrustedContent,\n renderTrustedContent: resolvedHelpers.renderTrustedContent,\n renderAnthropicMediaBlocks: resolvedHelpers.renderAnthropicMediaBlocks,\n renderArtifactHandleBody: resolvedHelpers.renderArtifactHandleBody,\n unsupportedMediaPolicy: merged.unsupportedMediaPolicy ?? 'throw',\n warn: localWarn,\n })\n renderedToolCallResults.set(tc, rendered)\n }\n\n // ── Step 5: context window enforcement ────────────────────────────────\n if (merged.tokenEncoding !== null && merged.contextWindow !== undefined) {\n const encoding = merged.tokenEncoding as TokenEncoding\n let spTokens = await estimateTokensOf(ctx.systemPrompt, encoding)\n let siTokens = 0\n for (const si of ctx.standingInstructions) {\n siTokens += await estimateTokensOf(si, encoding)\n }\n let memTokens = 0\n for (const mem of ctx.turnMemories as Set<Memory>) {\n memTokens += await estimateTokensOf(mem.content, encoding)\n }\n let retTokens = 0\n for (const r of ctx.turnRetrievables) {\n retTokens +=\n !r.inline && SpooledArtifact.isSpooledArtifact(r.content) && r.content.hasSizeHints()\n ? r.content.estimateHandleTokens(\n r.id,\n encoding,\n resolvedHelpers.renderRetrievableHandleBody\n )\n : await estimateTokensOf(r.content, encoding)\n }\n let tlTokens = 0\n for (const msg of ctx.turnMessages) {\n if (msg.content !== undefined) {\n tlTokens += await estimateTokensOf(msg.content, encoding)\n }\n }\n for (const th of ctx.turnThoughts) {\n tlTokens += await estimateTokensOf(th.content, encoding)\n }\n for (const rendered of renderedToolCallResults.values()) {\n tlTokens += await estimateTokensOf(new Tokenizable(JSON.stringify(rendered)), encoding)\n }\n // Tool DECLARATIONS: Anthropic renders `tools` server-side; there is no single fixed\n // client-side conversion to reproduce it. Tally the serialized wire `tools` JSON as an\n // honest FLOOR. Without this the guard undercounts a tool-heavy prompt by the entire\n // declaration block.\n let toolTokens = 0\n const visibleTools = ctx.tools.visible()\n if (visibleTools.length > 0) {\n const toolsJson = JSON.stringify(\n resolvedHelpers.anthropicToolsFromTools(visibleTools, {\n descriptionToChatCompletionsJsonSchema: (d) =>\n resolvedHelpers.descriptionToChatCompletionsJsonSchema(d as never),\n })\n )\n toolTokens = await estimateTokensOf(new Tokenizable(toolsJson), encoding)\n }\n const total = spTokens + siTokens + memTokens + retTokens + tlTokens + toolTokens\n const perBucketObj = {\n systemPrompt: spTokens,\n standingInstructions: siTokens,\n memories: memTokens,\n retrievables: retTokens,\n timeline: tlTokens,\n tools: toolTokens,\n }\n helpers.log.debug({\n kind: 'context-window-usage',\n message: `Context window usage: ${total}/${merged.contextWindow} tokens`,\n payload: {\n total,\n limit: merged.contextWindow,\n encoding,\n perBucket: perBucketObj,\n },\n })\n if (total > merged.contextWindow) {\n throw new E_ANTHROPIC_MESSAGES_CONTEXT_OVERFLOW([\n total,\n merged.contextWindow,\n encoding,\n JSON.stringify(perBucketObj),\n ])\n }\n }\n\n // ── Step 5b: tool_choice forced-tool guard (warn-only; no strictToolChoice escape) ─────\n // Anthropic's tool_choice shape (`{type:'auto'|'any'|'tool'|'none', name?}`) has no\n // equivalent to Chat Completions' `function`/`custom`/`allowed_tools` variants — only the\n // `'tool'` variant names a single tool. `AnthropicMessagesAdapterOptions` carries no\n // `strictToolChoice` field (types.ts is out of scope for this work package), so a forced\n // name resolving to an ephemeral, forged artifact-query tool can only be warned about, never\n // thrown on — consistent with the \"warn loudly, send anyway, no request repair\" governing\n // constraint. Never assume forcing worked: some models 400 on a forced tool_choice, which\n // surfaces later as a translated HTTP error, not here.\n const toolChoice = merged.toolChoice\n if (toolChoice && toolChoice.type === 'tool') {\n const t = ctx.tools.get(toolChoice.name) as { ephemeral?: boolean } | undefined\n if (t?.ephemeral === true) {\n helpers.log.warn({\n kind: 'tool-choice-forged-artifact',\n message: `tool_choice forces forged ephemeral artifact-query tool \"${toolChoice.name}\"; this is almost always a misconfiguration and it may not exist on the next iteration`,\n payload: { toolName: toolChoice.name },\n })\n }\n }\n\n // ── Step 5c: Fable-class forced-tool-use / thinking incompatibility guard (warn-only) ──\n // \"Fable-class\" is matched via a `claude-fable-` model-name prefix — ageing data, not a hard\n // capability table (no authoritative per-model capability source is available to this\n // adapter). A forced `tool_choice` (`{type:'tool'}` or `{type:'any'}`) combined with either\n // variant of `thinking` (`disabled` or `enabled`) is known to 400 upstream on this model\n // class. Same governing principle as Step 5b: surface the footgun, never rewrite/repair the\n // request — the caller may know something this heuristic doesn't.\n if (merged.model.startsWith('claude-fable-')) {\n const forcedToolChoice =\n toolChoice !== undefined && (toolChoice.type === 'tool' || toolChoice.type === 'any')\n const incompatibleThinking =\n merged.thinking !== undefined &&\n (merged.thinking.type === 'disabled' || merged.thinking.type === 'enabled')\n if (forcedToolChoice && incompatibleThinking) {\n helpers.log.warn({\n kind: 'fable-forced-tool-choice-thinking-conflict',\n message: `Model \"${merged.model}\" matches the Fable-class heuristic (claude-fable- prefix); combining a forced tool_choice (\"${toolChoice?.type}\") with thinking (\"${merged.thinking?.type}\") is known to 400 upstream on this model class. Sending the request unmodified.`,\n payload: {\n model: merged.model,\n toolChoiceType: toolChoice?.type,\n thinking: merged.thinking,\n },\n })\n }\n }\n\n // ── Step 6: build request body ────────────────────────────────────────\n const {\n system,\n messages: wireMessages,\n tools: wireTools,\n } = await resolvedHelpers.buildAnthropicMessagesHistory({\n model: merged.model,\n systemPrompt: ctx.systemPrompt,\n standingInstructions: ctx.standingInstructions,\n memories: ctx.turnMemories,\n retrievables: ctx.turnRetrievables,\n messages: ctx.turnMessages,\n thoughts: ctx.turnThoughts,\n toolCalls: ctx.turnToolCalls,\n tools: ctx.tools,\n renderedToolCallResults,\n bucketOrder: merged.bucketOrder ?? [\n 'standingInstructions',\n 'memories',\n 'retrievables',\n 'timeline',\n ],\n selfIdentity: merged.selfIdentity ?? 'assistant',\n thoughtSurfacing: merged.thoughtSurfacing ?? 'all-self',\n replayCompatibility: merged.replayCompatibility ?? [],\n unsupportedMediaPolicy: merged.unsupportedMediaPolicy ?? 'throw',\n cacheBreakpoints: merged.cacheBreakpoints ?? 'auto',\n cacheTtl: merged.cacheTtl,\n renderAnthropicToolCallResult: resolvedHelpers.renderAnthropicToolCallResult,\n renderChatCompletionsSystemPrompt: resolvedHelpers.renderChatCompletionsSystemPrompt,\n renderAnthropicSegmentedSystemPrompt: resolvedHelpers.renderAnthropicSegmentedSystemPrompt,\n renderStandingInstructions: resolvedHelpers.renderStandingInstructions,\n renderMemories: resolvedHelpers.renderMemories,\n renderRetrievables: resolvedHelpers.renderRetrievables,\n renderRetrievableSafetyDirective: resolvedHelpers.renderRetrievableSafetyDirective,\n renderFirstPartyRetrievables: resolvedHelpers.renderFirstPartyRetrievables,\n renderThirdPartyPublicRetrievables: resolvedHelpers.renderThirdPartyPublicRetrievables,\n renderThirdPartyPrivateRetrievables: resolvedHelpers.renderThirdPartyPrivateRetrievables,\n renderRetrievableHandleBody: resolvedHelpers.renderRetrievableHandleBody,\n renderAnthropicTimelineMessage: resolvedHelpers.renderAnthropicTimelineMessage,\n renderThought: resolvedHelpers.renderThought,\n filterThoughts: resolvedHelpers.filterThoughts,\n renderAnthropicThinkingBlocks: resolvedHelpers.renderAnthropicThinkingBlocks,\n renderUntrustedContent: resolvedHelpers.renderUntrustedContent,\n renderTrustedContent: resolvedHelpers.renderTrustedContent,\n warn: localWarn,\n })\n\n const stream = merged.stream ?? true\n\n // Anthropic request surface fields are individually named on `AnthropicMessagesAdapterOptions`\n // (unlike OpenAI's spread-minus-control-keys body assembly) — assembled explicitly, field by\n // field, only when defined. This enumerates the request surface exhaustively rather than\n // spreading `merged`, so no ADK-control field (spoolStore, helpers, retry, onRawGeneration,\n // ...) can ever leak into the wire body by omission from a strip-set.\n const params: Record<string, unknown> = {\n model: merged.model,\n max_tokens: merged.maxTokens,\n messages: wireMessages,\n stream,\n }\n if (system !== undefined) params.system = system\n if (wireTools !== undefined && wireTools.length > 0) params.tools = wireTools\n if (merged.stopSequences !== undefined) params.stop_sequences = merged.stopSequences\n if (merged.thinking !== undefined) params.thinking = merged.thinking\n if (merged.outputConfig !== undefined) params.output_config = merged.outputConfig\n if (merged.toolChoice !== undefined) params.tool_choice = merged.toolChoice\n if (merged.metadata !== undefined) params.metadata = merged.metadata\n if (merged.serviceTier !== undefined) params.service_tier = merged.serviceTier\n if (merged.container !== undefined) params.container = merged.container\n if (merged.inferenceGeo !== undefined) params.inference_geo = merged.inferenceGeo\n if (merged.userProfileId !== undefined) params.user_profile_id = merged.userProfileId\n // Deprecated sampling parameters — never supplied unless the caller explicitly sets them.\n if (merged.temperature !== undefined) params.temperature = merged.temperature\n if (merged.topP !== undefined) params.top_p = merged.topP\n if (merged.topK !== undefined) params.top_k = merged.topK\n\n // One id for this whole generation — correlates the TO tap (onPromptAssembled) with the FROM\n // tap (onRawGeneration) below.\n const dispatchStreamId = uuidv6()\n\n // Prompt-assembled observability tap: the EXACT request going TO Anthropic, the instant it is\n // built and BEFORE the call. Mirror of onRawGeneration. Handed back AS-IS — no redaction —\n // and swallow observer errors so it can never corrupt the generation path.\n if (merged.onPromptAssembled) {\n try {\n merged.onPromptAssembled({\n battery: 'anthropic_messages',\n kind: 'request-body',\n messages: wireMessages,\n tools: wireTools,\n requestBody: params,\n streamed: stream,\n streamId: dispatchStreamId,\n })\n } catch {\n /* observer errors are non-fatal */\n }\n }\n\n // ── Step 7: call the SDK with retry / timeout ownership ───────────────\n const retryCfg = {\n maxAttempts: merged.retry?.maxAttempts ?? 1,\n baseDelayMs: merged.retry?.baseDelayMs ?? 500,\n maxDelayMs: merged.retry?.maxDelayMs ?? 30_000,\n retriableStatuses: merged.retry?.retriableStatuses ?? [429, 502, 503, 504, 529],\n honorRetryAfter: merged.retry?.honorRetryAfter ?? true,\n }\n\n const requestTimeoutMs = merged.requestTimeoutMs ?? 0\n // ADK owns retry (maxRetries:0) and timeout ownership. When requestTimeoutMs > 0, the SDK\n // client timeout is set with an explicit safety margin above it so the ADK-side timer (via\n // the linked AbortSignal below) is deterministically the one that fires first and raises\n // E_ANTHROPIC_MESSAGES_REQUEST_TIMEOUT. When requestTimeoutMs is 0 (ADK timer disabled), a\n // large explicit sentinel replaces the SDK's silent 10-minute default so the caller's choice\n // to disable the ADK timer is never silently overridden by an SDK-owned ceiling.\n const client = new Anthropic({\n apiKey: merged.apiKey,\n baseURL: merged.baseURL,\n fetch: merged.fetch,\n maxRetries: 0,\n timeout: requestTimeoutMs > 0 ? requestTimeoutMs + 30_000 : 24 * 60 * 60 * 1000,\n defaultHeaders: merged.headers,\n dangerouslyAllowBrowser: merged.dangerouslyAllowBrowser ?? false,\n })\n\n let anthropicStream: AsyncIterable<AnthropicRawMessageStreamEvent> | undefined\n let anthropicMessage: AnthropicMessage | undefined\n let attempt = 1\n const maxAttempts = retryCfg.maxAttempts\n let disposeLink: () => void = () => {}\n\n while (attempt <= maxAttempts) {\n if (ctx.abortSignal.aborted) return\n\n const internalController = new AbortController()\n let timeoutHandle: ReturnType<typeof setTimeout> | undefined\n if (requestTimeoutMs > 0) {\n timeoutHandle = setTimeout(() => internalController.abort(), requestTimeoutMs)\n }\n disposeLink()\n const { signal: linkedSignal, dispose: disposeCurrentLink } = linkAbortSignals([\n ctx.abortSignal,\n internalController.signal,\n ])\n disposeLink = disposeCurrentLink\n\n try {\n if (stream) {\n anthropicStream = (await client.messages.create({ ...params, stream: true } as never, {\n signal: linkedSignal,\n })) as unknown as AsyncIterable<AnthropicRawMessageStreamEvent>\n } else {\n anthropicMessage = (await client.messages.create(\n { ...params, stream: false } as never,\n {\n signal: linkedSignal,\n }\n )) as unknown as AnthropicMessage\n }\n if (timeoutHandle !== undefined) clearTimeout(timeoutHandle)\n break\n } catch (err) {\n if (timeoutHandle !== undefined) clearTimeout(timeoutHandle)\n if (ctx.abortSignal.aborted) return\n const classified = translateAnthropicError(err, retryCfg.retriableStatuses, {\n resolveErrorStatus: merged.resolveErrorStatus,\n warn: (msg) =>\n helpers.log.warn({ kind: 'anthropic-resolve-error-status', message: msg }),\n })\n if (classified.kind === 'abort') return\n if (classified.kind === 'timeout') {\n helpers.log.warn({\n kind: 'request-timeout',\n message: `Request timed out after ${requestTimeoutMs}ms on attempt ${attempt}/${maxAttempts}`,\n payload: { requestTimeoutMs, attempt, maxAttempts },\n })\n if (attempt < maxAttempts) {\n const delay = computeBackoff(attempt, retryCfg)\n await sleepWithJitter(delay, ctx.abortSignal)\n attempt += 1\n continue\n }\n ctx.nack(new E_ANTHROPIC_MESSAGES_REQUEST_TIMEOUT([requestTimeoutMs]))\n return\n }\n if (classified.kind === 'context-overflow') {\n // Detected from body text on a 400 BadRequestError — the wire never distinguishes this\n // from any other 400, so the adapter cannot report the exact per-bucket breakdown the\n // pre-flight guard (Step 5) computes; that guard is the source of truth for a\n // predictable overflow. This branch only catches what the guard could not: a case where\n // Anthropic's own accounting disagrees with the local token estimate.\n ctx.nack(\n new E_ANTHROPIC_MESSAGES_CONTEXT_OVERFLOW([\n -1,\n merged.contextWindow ?? -1,\n merged.tokenEncoding ?? 'unknown',\n classified.message,\n ])\n )\n return\n }\n if (classified.kind === 'retriable') {\n if (attempt < maxAttempts) {\n let delay = computeBackoff(attempt, retryCfg)\n if (retryCfg.honorRetryAfter !== false && isInstanceOf(err, 'APIError', APIError)) {\n const ra = err.headers?.get?.('retry-after')\n if (ra) {\n const raMs = parseRetryAfter(ra)\n if (raMs > 0) delay = Math.min(Math.max(delay, raMs), retryCfg.maxDelayMs)\n }\n }\n helpers.log.warn({\n kind: 'retry-attempt',\n message: `Anthropic error (status ${classified.status}) on attempt ${attempt}/${maxAttempts}; retrying in ~${delay}ms`,\n payload: {\n reason: 'http-status',\n status: classified.status,\n delayMs: delay,\n attempt: attempt + 1,\n maxAttempts,\n },\n })\n await sleepWithJitter(delay, ctx.abortSignal)\n attempt += 1\n continue\n }\n helpers.log.error({\n kind: 'http-error',\n message: `Anthropic error ${classified.status} (terminal): ${classified.message.slice(0, 256)}`,\n payload: {\n status: classified.status,\n body: classified.message,\n attempt,\n maxAttempts,\n },\n })\n ctx.nack(new E_ANTHROPIC_MESSAGES_HTTP_ERROR([classified.status, classified.message]))\n return\n }\n helpers.log.error({\n kind: 'http-error',\n message: `Anthropic error ${classified.status} (terminal): ${classified.message.slice(0, 256)}`,\n payload: {\n status: classified.status,\n body: classified.message,\n attempt,\n maxAttempts,\n },\n })\n ctx.nack(new E_ANTHROPIC_MESSAGES_HTTP_ERROR([classified.status, classified.message]))\n return\n }\n }\n\n const spoolStore = merged.spoolStore ?? new InMemorySpoolStore()\n const selfIdentity = merged.selfIdentity ?? 'assistant'\n\n // ── Inner helper: persist + execute one assembled tool call ───────────\n const executeAndPersistToolCall = async (call: AssembledAnthropicToolCall): Promise<void> => {\n // Resolve the vendor id once at ingress so reporting, persistence, and spooling agree.\n const callId = merged.toolCallIdFilter?.(call.id, ctx) ?? call.id\n const tool = ctx.tools.get(call.name)\n let args: Record<string, unknown> = {}\n let parseError: InstanceType<typeof E_ANTHROPIC_MESSAGES_INVALID_TOOL_CALL_ARGS> | undefined\n if (call.args && call.args.length > 0) {\n try {\n const parsed: unknown = JSON.parse(call.args)\n if (isObject(parsed)) {\n args = parsed\n } else {\n const receivedKind = Array.isArray(parsed)\n ? 'array'\n : parsed === null\n ? 'null'\n : typeof parsed\n parseError = new E_ANTHROPIC_MESSAGES_INVALID_TOOL_CALL_ARGS([\n `must be a JSON object; received ${receivedKind}`,\n call.args,\n ])\n }\n } catch {\n parseError = new E_ANTHROPIC_MESSAGES_INVALID_TOOL_CALL_ARGS([\n 'are not valid JSON',\n call.args,\n ])\n }\n }\n const completedAt = nowIso()\n if (parseError !== undefined) {\n const toolName = normalizeToolName(call.name)\n const results = new Tokenizable(parseError.message)\n helpers.reportToolCall(callId, { tool: toolName, args })\n helpers.reportToolCall(callId, {\n results,\n isError: true,\n isComplete: true,\n })\n await ctx.storeToolCall(\n new ToolCall({\n id: callId,\n tool: toolName,\n args,\n checksum: computeChecksum(toolName, args),\n isComplete: true,\n isError: true,\n results,\n createdAt: completedAt,\n updatedAt: completedAt,\n completedAt,\n })\n )\n return\n }\n if (!tool) {\n const toolName = normalizeToolName(call.name)\n const available = ctx.tools\n .all()\n .map((t) => t.name)\n .sort()\n const errText =\n available.length > 0\n ? `Tool not found: ${toolName}. Available tools: ${available.join(', ')}.`\n : `Tool not found: ${toolName}. No tools are available this turn.`\n const results = new Tokenizable(errText)\n helpers.reportToolCall(callId, { tool: toolName, args })\n helpers.reportToolCall(callId, {\n results,\n isError: true,\n isComplete: true,\n })\n await ctx.storeToolCall(\n new ToolCall({\n id: callId,\n tool: toolName,\n args,\n checksum: computeChecksum(toolName, args),\n isComplete: true,\n isError: true,\n results,\n createdAt: completedAt,\n updatedAt: completedAt,\n completedAt,\n })\n )\n return\n }\n helpers.reportToolCall(callId, { tool: tool.name, args })\n const isArtifactTool = ArtifactTool.isArtifactTool(tool)\n let results: Tokenizable | SpooledArtifact | SpooledArtifact[] | Media | Media[] =\n new Tokenizable('')\n let toolHadError = false\n try {\n const raw = await tool.executor(ctx)(args)\n if (isArtifactTool) {\n if (Tokenizable.isTokenizable(raw)) {\n results = raw\n } else if (typeof raw === 'string') {\n results = new Tokenizable(raw)\n } else {\n throw new Error(\n `ArtifactTool \"${tool.name}\" returned a non-string/non-Tokenizable value`\n )\n }\n } else if (Media.isMedia(raw)) {\n results = raw\n } else if (Array.isArray(raw) && raw.length > 0 && raw.every((m) => Media.isMedia(m))) {\n results = raw as Media[]\n } else if (looksLikeSpooledArtifact(raw)) {\n results = raw as SpooledArtifact\n } else if (typeof raw === 'string' || isInstanceOf(raw, 'Uint8Array', Uint8Array)) {\n const reader = await spoolStore.write(callId, raw as string | Uint8Array)\n const ArtifactCtor = (tool as Tool).artifactConstructor?.() ?? SpooledArtifact\n results = new ArtifactCtor(reader)\n } else {\n const reader = await spoolStore.write(callId, String(raw))\n const ArtifactCtor = (tool as Tool).artifactConstructor?.() ?? SpooledArtifact\n results = new ArtifactCtor(reader)\n }\n } catch (err) {\n toolHadError = true\n let detailMsg = isError(err) ? err.message : String(err)\n if (\n isError(err) &&\n isError(err.cause) &&\n err.cause.message &&\n err.cause.message !== err.message\n ) {\n detailMsg = `${detailMsg} ${err.cause.message}`\n }\n results = new Tokenizable(detailMsg)\n }\n helpers.reportToolCall(callId, {\n results,\n isError: toolHadError,\n isComplete: true,\n })\n const completedAt2 = nowIso()\n await ctx.storeToolCall(\n new ToolCall({\n id: callId,\n tool: tool.name,\n args,\n checksum: computeChecksum(tool.name, args),\n isComplete: true,\n isError: toolHadError,\n results,\n fromArtifactTool: isArtifactTool,\n // ArtifactTool results are the documented exception: they inline the slice the model\n // queried from a prior artifact (handing back a handle to a query result would be\n // recursion). Every other result keeps the secure default (inline:false → handle).\n inline: isArtifactTool,\n createdAt: completedAt2,\n updatedAt: completedAt2,\n completedAt: completedAt2,\n })\n )\n }\n\n // FALLBACK tool-call recovery. Native `tool_use` content blocks are authoritative; this is\n // consulted ONLY when the response yielded zero native tool_use blocks AND the caller opted\n // in via `localToolCallParser`. Mirrors the `ollama`/`openai_chat_completions` fallback\n // pattern verbatim — pure parse over the accumulated text, returning assembled calls (empty\n // when disabled or no match) so each call site can reflect them in `onRawGeneration` and then\n // execute them exactly like native calls.\n const parseFallbackToolCalls = (content: string): AssembledAnthropicToolCall[] => {\n if (merged.localToolCallParser === undefined) return []\n if (typeof content !== 'string' || content.length === 0) return []\n const parser = resolveToolCallParser(merged.localToolCallParser)\n const toolNames = ctx.tools.visible().map((t) => t.name)\n return parser(content, { toolNames }).calls.map((c) => ({\n id: uuidv6(),\n name: c.name,\n args: JSON.stringify(c.arguments),\n }))\n }\n\n // ── Step 8: streaming path ────────────────────────────────────────────\n if (stream) {\n if (!anthropicStream) {\n ctx.nack(new E_ANTHROPIC_MESSAGES_STREAM_ERROR(['no stream returned']))\n return\n }\n const streamId = dispatchStreamId\n const thoughtStreamId = `${streamId}:thought`\n\n const blocks = new Map<number, BlockState>()\n let sawMessageDelta = false\n let sawThinking = false\n let finalUsage: AnthropicUsage | AnthropicMessageDeltaUsage | undefined\n let finalStopReason: string | null = null\n let finalStopDetails: AnthropicRawMessageDeltaEvent['delta']['stop_details'] = null\n let responseModel = merged.model\n let doneSeen = false\n const collectedToolCalls: AssembledAnthropicToolCall[] = []\n\n const idleMs = merged.streamIdleTimeoutMs ?? 0\n let idleTimer: ReturnType<typeof setTimeout> | undefined\n let stalled = false\n const idleController = new AbortController()\n const armIdleTimer = (): void => {\n if (idleMs <= 0) return\n if (idleTimer) clearTimeout(idleTimer)\n idleTimer = setTimeout(() => {\n stalled = true\n helpers.log.warn({\n kind: 'stream-idle-timeout',\n message: `Anthropic stream went idle for ${idleMs}ms; cancelling`,\n payload: { idleMs },\n })\n idleController.abort()\n }, idleMs)\n }\n const clearIdleTimer = (): void => {\n if (idleTimer) {\n clearTimeout(idleTimer)\n idleTimer = undefined\n }\n }\n\n const finalize = async (): Promise<void> => {\n if (sawMessageDelta) {\n const combinedText = Array.from(blocks.values())\n .filter((b): b is TextBlockState => b.kind === 'text')\n .map((b) => b.text)\n .join('')\n helpers.reportMessage(streamId, '', { isComplete: true })\n await ctx.storeMessage(\n new Message({\n id: streamId,\n role: 'assistant',\n content: combinedText,\n identity: selfIdentity,\n createdAt: nowIso(),\n updatedAt: nowIso(),\n })\n )\n }\n if (sawThinking) {\n const thinkingBlocks = Array.from(blocks.entries()).filter(\n (entry): entry is [number, ThinkingBlockState | RedactedThinkingBlockState] =>\n entry[1].kind === 'thinking' || entry[1].kind === 'redacted_thinking'\n )\n const combinedThinking = thinkingBlocks\n .map(([, b]) => (b.kind === 'thinking' ? b.thinking : ''))\n .join('')\n helpers.reportThought(thoughtStreamId, '', { isComplete: true })\n const prefixFingerprint = await fingerprintAnthropicMessagesPrefix({\n model: merged.model,\n system,\n tools: wireTools,\n messages: wireMessages,\n })\n const firstThinking = thinkingBlocks.find(([, b]) => b.kind === 'thinking') as\n | [number, ThinkingBlockState]\n | undefined\n const firstRedacted = thinkingBlocks.find(([, b]) => b.kind === 'redacted_thinking') as\n | [number, RedactedThinkingBlockState]\n | undefined\n const payload: AnthropicThinkingReplayPayload | undefined = firstThinking\n ? {\n variant: 'thinking',\n thinking: firstThinking[1].thinking,\n signature: firstThinking[1].signature,\n prefixFingerprint,\n }\n : firstRedacted\n ? {\n variant: 'redacted_thinking',\n data: firstRedacted[1].data,\n prefixFingerprint,\n }\n : undefined\n await ctx.storeThought(\n new Thought({\n id: thoughtStreamId,\n content: combinedThinking,\n identity: selfIdentity,\n payload,\n replayCompatibility: payload ? 'anthropic-messages-thinking-v1' : undefined,\n createdAt: nowIso(),\n updatedAt: nowIso(),\n })\n )\n }\n\n helpers.reportGenerationStats(\n extractGenerationStats({\n model: responseModel,\n usage: finalUsage,\n finishReason: finalStopReason,\n raw: {\n usage: finalUsage,\n stop_reason: finalStopReason,\n stop_details: finalStopDetails,\n },\n })\n )\n\n const combinedText = Array.from(blocks.values())\n .filter((b): b is TextBlockState => b.kind === 'text')\n .map((b) => b.text)\n .join('')\n\n // Fallback recovery (opt-in): consulted only when no native tool_use blocks were\n // collected, so a native call always wins over a parsed one.\n const fallbackToolCalls =\n collectedToolCalls.length === 0 ? parseFallbackToolCalls(combinedText) : []\n const effectiveToolCalls =\n collectedToolCalls.length > 0 ? collectedToolCalls : fallbackToolCalls\n\n if (merged.onRawGeneration) {\n try {\n merged.onRawGeneration({\n rawText: combinedText,\n cleanedText: combinedText,\n reasoning: sawThinking\n ? Array.from(blocks.values())\n .filter((b): b is ThinkingBlockState => b.kind === 'thinking')\n .map((b) => b.thinking)\n : [],\n toolCalls: effectiveToolCalls.map((c) => ({\n name: c.name,\n arguments: c.args as never,\n })),\n streamed: true,\n streamId: dispatchStreamId,\n })\n } catch {\n /* observer errors are non-fatal */\n }\n }\n\n logAnthropicStopReason(helpers, finalStopReason, finalStopDetails)\n\n if (effectiveToolCalls.length === 0) {\n if (merged.autoAck) ctx.ack()\n return\n }\n for (const call of effectiveToolCalls) {\n if (ctx.abortSignal.aborted) return\n await executeAndPersistToolCall(call)\n }\n }\n\n try {\n armIdleTimer()\n for await (const event of anthropicStream) {\n armIdleTimer()\n if (ctx.abortSignal.aborted || idleController.signal.aborted) {\n clearIdleTimer()\n if (stalled) {\n ctx.nack(new E_ANTHROPIC_MESSAGES_STREAM_STALLED([idleMs]))\n }\n return\n }\n if (event.type === 'message_start') {\n responseModel = event.message.model ?? responseModel\n finalUsage = event.message.usage\n } else if (event.type === 'content_block_start') {\n blocks.set(event.index, emptyBlockState(event.content_block))\n const b = blocks.get(event.index)!\n if (b.kind === 'thinking' || b.kind === 'redacted_thinking') sawThinking = true\n } else if (event.type === 'content_block_delta') {\n const b = blocks.get(event.index)\n const delta = event.delta\n if (delta.type === 'text_delta') {\n sawMessageDelta = true\n if (b && b.kind === 'text') b.text += delta.text\n helpers.reportMessage(streamId, delta.text)\n } else if (delta.type === 'thinking_delta') {\n sawThinking = true\n if (b && b.kind === 'thinking') b.thinking += delta.thinking\n helpers.reportThought(thoughtStreamId, delta.thinking)\n } else if (delta.type === 'signature_delta') {\n if (b && b.kind === 'thinking') b.signature = delta.signature\n } else if (delta.type === 'input_json_delta') {\n if (b && b.kind === 'tool_use') b.args += delta.partial_json\n }\n // citations_delta: out of scope for v1 — no ADK citation representation; no-op.\n } else if (event.type === 'content_block_stop') {\n const b = blocks.get(event.index)\n if (b && b.kind === 'tool_use') {\n collectedToolCalls.push({\n id: b.id,\n name: b.name,\n args: b.args || '{}',\n })\n }\n } else if (event.type === 'message_delta') {\n if (event.usage) finalUsage = event.usage\n if (event.delta.stop_reason !== null && event.delta.stop_reason !== undefined) {\n finalStopReason = event.delta.stop_reason\n }\n if (event.delta.stop_details !== null && event.delta.stop_details !== undefined) {\n finalStopDetails = event.delta.stop_details\n }\n if (event.delta.stop_reason === 'model_context_window_exceeded') {\n clearIdleTimer()\n ctx.nack(\n new E_ANTHROPIC_MESSAGES_CONTEXT_OVERFLOW([\n -1,\n merged.contextWindow ?? -1,\n merged.tokenEncoding ?? 'unknown',\n JSON.stringify(event.delta),\n ])\n )\n return\n }\n } else if (event.type === 'message_stop') {\n doneSeen = true\n clearIdleTimer()\n await finalize()\n return\n }\n }\n clearIdleTimer()\n if (stalled) {\n ctx.nack(new E_ANTHROPIC_MESSAGES_STREAM_STALLED([idleMs]))\n return\n }\n // The SDK's own iterator does not guarantee a trailing message_stop reaches this loop in\n // every transport edge case (e.g. the connection closes cleanly right after the final\n // frame) — finalization must be idempotent and reachable from stream EOF too.\n if (!doneSeen) {\n helpers.log.warn({\n kind: 'stream-eof-without-stop',\n message:\n 'Anthropic stream ended without a message_stop event; draining accumulated state',\n })\n await finalize()\n }\n } catch (err) {\n clearIdleTimer()\n if (ctx.abortSignal.aborted) return\n if (stalled) {\n ctx.nack(new E_ANTHROPIC_MESSAGES_STREAM_STALLED([idleMs]))\n return\n }\n const classified = translateAnthropicError(err, retryCfg.retriableStatuses, {\n resolveErrorStatus: merged.resolveErrorStatus,\n warn: (msg) =>\n helpers.log.warn({ kind: 'anthropic-resolve-error-status', message: msg }),\n })\n if (classified.kind === 'abort') return\n if (classified.kind === 'context-overflow') {\n ctx.nack(\n new E_ANTHROPIC_MESSAGES_CONTEXT_OVERFLOW([\n -1,\n merged.contextWindow ?? -1,\n merged.tokenEncoding ?? 'unknown',\n classified.message,\n ])\n )\n return\n }\n helpers.log.error({\n kind: 'stream-error',\n message: `Anthropic stream failed: ${isError(err) ? err.message : String(err)}`,\n payload: { detail: isError(err) ? err.message : String(err) },\n })\n ctx.nack(\n new E_ANTHROPIC_MESSAGES_STREAM_ERROR([isError(err) ? err.message : String(err)])\n )\n return\n }\n return\n }\n\n // ── Step 9: non-streaming path ─────────────────────────────────────────\n if (!anthropicMessage) return\n const parsed = anthropicMessage\n const responseId = uuidv6()\n\n const textParts: string[] = []\n const toolUseBlocks: AnthropicToolUseBlockParam[] = []\n let thinkingPayload: AnthropicThinkingReplayPayload | undefined\n let combinedThinking = ''\n let hasThinking = false\n\n if (parsed.stop_reason === 'model_context_window_exceeded') {\n ctx.nack(\n new E_ANTHROPIC_MESSAGES_CONTEXT_OVERFLOW([\n -1,\n merged.contextWindow ?? -1,\n merged.tokenEncoding ?? 'unknown',\n JSON.stringify({ stop_reason: parsed.stop_reason }),\n ])\n )\n return\n }\n logAnthropicStopReason(helpers, parsed.stop_reason, parsed.stop_details)\n\n for (const block of parsed.content) {\n if (block.type === 'text') {\n textParts.push(block.text)\n } else if (block.type === 'thinking') {\n hasThinking = true\n combinedThinking += block.thinking\n if (thinkingPayload === undefined) {\n thinkingPayload = {\n variant: 'thinking',\n thinking: block.thinking,\n signature: block.signature,\n prefixFingerprint: await fingerprintAnthropicMessagesPrefix({\n model: merged.model,\n system,\n tools: wireTools,\n messages: wireMessages,\n }),\n }\n }\n } else if (block.type === 'redacted_thinking') {\n hasThinking = true\n if (thinkingPayload === undefined) {\n thinkingPayload = {\n variant: 'redacted_thinking',\n data: block.data,\n prefixFingerprint: await fingerprintAnthropicMessagesPrefix({\n model: merged.model,\n system,\n tools: wireTools,\n messages: wireMessages,\n }),\n }\n }\n } else if (block.type === 'tool_use') {\n toolUseBlocks.push({\n type: 'tool_use',\n id: block.id,\n name: block.name,\n input: block.input,\n })\n }\n // Server-tool-result block types (web_search_tool_result, code_execution_tool_result, ...)\n // are out of scope for this client-tools-only adapter — no ADK-side representation.\n }\n\n const content = textParts.join('')\n if (content.length > 0) {\n const messageId = `${responseId}:message`\n helpers.reportMessage(messageId, content, { isComplete: true })\n await ctx.storeMessage(\n new Message({\n id: messageId,\n role: 'assistant',\n content,\n identity: selfIdentity,\n createdAt: nowIso(),\n updatedAt: nowIso(),\n })\n )\n }\n if (hasThinking) {\n const thoughtId = `${responseId}:thought`\n helpers.reportThought(thoughtId, combinedThinking, {\n isComplete: true,\n })\n await ctx.storeThought(\n new Thought({\n id: thoughtId,\n content: combinedThinking,\n identity: selfIdentity,\n payload: thinkingPayload,\n replayCompatibility: thinkingPayload ? 'anthropic-messages-thinking-v1' : undefined,\n createdAt: nowIso(),\n updatedAt: nowIso(),\n })\n )\n }\n\n helpers.reportGenerationStats(\n extractGenerationStats({\n model: parsed.model ?? merged.model,\n usage: parsed.usage,\n finishReason: parsed.stop_reason,\n raw: { ...parsed } as unknown as Record<string, unknown>,\n })\n )\n\n const nativeCalls: AssembledAnthropicToolCall[] = toolUseBlocks.map((b) => ({\n id: b.id,\n name: b.name,\n args: b.input === undefined ? '{}' : JSON.stringify(b.input),\n }))\n // Fallback recovery (opt-in): consulted only when no native tool_use blocks are present, so\n // a native call always wins over a parsed one.\n const calls = nativeCalls.length > 0 ? nativeCalls : parseFallbackToolCalls(content)\n\n if (merged.onRawGeneration) {\n try {\n merged.onRawGeneration({\n rawText: content,\n cleanedText: content,\n reasoning: hasThinking ? [combinedThinking] : [],\n toolCalls: calls.map((c) => ({\n name: c.name,\n arguments: c.args as never,\n })),\n streamed: false,\n streamId: dispatchStreamId,\n })\n } catch {\n /* observer errors are non-fatal */\n }\n }\n\n if (calls.length === 0) {\n if (merged.autoAck) ctx.ack()\n return\n }\n for (const call of calls) {\n if (ctx.abortSignal.aborted) return\n await executeAndPersistToolCall(call)\n }\n }\n }\n\n /**\n * Counts the input tokens a request would consume, without generating.\n *\n * Uses Anthropic's dedicated count-tokens surface (a distinct parameter shape from a create\n * request, and one that takes no `maxTokens`), and returns a named field plus the raw upstream\n * body rather than leaking the vendor type through this battery's public API.\n *\n * `input` accepts either a dispatch context — whose prompt is assembled with the same helpers the\n * executor uses — or a pre-built Anthropic-shaped request. Option precedence, revalidation,\n * timeout ownership, and error translation all match {@link AnthropicMessagesAdapter.executor}.\n */\n public async countTokens(\n input: AnthropicMessagesCountTokensRequestInput | AnthropicMessagesCountTokensInput,\n overrides?: Partial<AnthropicMessagesAdapterOptions>\n ): Promise<{ inputTokens: number; raw: unknown }> {\n return countAnthropicMessagesTokens(this.#baseline, input, overrides)\n }\n\n /**\n * Returns `true` when `value` is an {@link AnthropicMessagesAdapter} instance.\n */\n public static isAnthropicMessagesAdapter(value: unknown): value is AnthropicMessagesAdapter {\n return isInstanceOf(value, 'AnthropicMessagesAdapter', AnthropicMessagesAdapter)\n }\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"adapter.cjs","names":["#baseline"],"sources":["../../../../src/batteries/llm/anthropic_messages/adapter.ts"],"sourcesContent":["/**\n * Cross-environment executor adapter for the Anthropic Messages API.\n *\n * @module @nhtio/adk/batteries/llm/anthropic_messages/adapter\n *\n * @remarks\n * Native Anthropic Messages adapter targeting `client.messages.create` from `@anthropic-ai/sdk`\n * (a hard static dependency of this battery). Node-first: an Anthropic API key in a browser\n * bundle is unacceptably exposed, so browser is deliberately not a target or gate for this\n * adapter — `dangerouslyAllowBrowser` exists only for the caller who accepts that risk knowingly.\n *\n * Structurally a sibling of the native Ollama and OpenAI Chat Completions adapters, with the\n * Anthropic-wire divergences:\n *\n * - Transport: the Anthropic SDK owns the HTTP call (`client.messages.create`), not raw `fetch`.\n * ADK owns retry (`maxRetries: 0` on the client) and timeout (`requestTimeoutMs` fences an\n * internal `AbortController` linked with `ctx.abortSignal`; when `requestTimeoutMs` is `0` a\n * large explicit sentinel is set on the SDK client so the SDK's own silent 10-minute default is\n * never silently inherited).\n * - Streaming: `Stream<RawMessageStreamEvent>` — an `AsyncIterable` the SDK already filters `ping`\n * frames out of; a mid-stream provider error surfaces as a **thrown `APIError`** from `for\n * await` iteration, not a discriminated event variant, so the consumption loop is wrapped in a\n * `try`/`catch`.\n * - Content-block state machine keyed by `index`: `content_block_start` carries the ONLY\n * occurrence of a `tool_use` block's `id`/`name` and a `redacted_thinking` block's `data`;\n * `content_block_delta` carries five delta variants (`text_delta`, `thinking_delta`,\n * `signature_delta`, `input_json_delta`, `citations_delta` — the last is out of scope for v1 and\n * is a no-op); `content_block_stop` finalizes only that index. `message_stop` is not trusted to\n * arrive; finalization is reachable from stream EOF too.\n * - Stop reasons: all seven (`end_turn`, `max_tokens`, `stop_sequence`, `tool_use`, `pause_turn`,\n * `refusal`, `model_context_window_exceeded`) are handled explicitly — `refusal` is a real\n * terminal HTTP-200 outcome (never mistaken for an error), `model_context_window_exceeded` maps\n * to `E_ANTHROPIC_MESSAGES_CONTEXT_OVERFLOW`.\n * - Error translation: typed SDK error classes (`BadRequestError`, `AuthenticationError`,\n * `PermissionDeniedError`, `NotFoundError`, `ConflictError`, `UnprocessableEntityError`,\n * `RateLimitError`, `InternalServerError`, `APIConnectionTimeoutError`, `APIConnectionError`,\n * `APIUserAbortError`, generic `APIError`) are narrowed and mapped to ADK exceptions. Context\n * overflow arrives as a 400 `BadRequestError` and is detected from body text (`prompt is too\n * long`), not status. A real upstream 529 `overloaded_error` is retriable\n * (`E_ANTHROPIC_MESSAGES_HTTP_ERROR`) — never routed into the fatal same-numbered\n * adapter-side exceptions, which use 529 as their own unrelated status code.\n * - Thinking persistence: signed `thinking` blocks persist as a `Thought` carrying a\n * `{variant:'thinking', thinking, signature, prefixFingerprint}` payload; `redacted_thinking`\n * blocks carry `{variant:'redacted_thinking', data, prefixFingerprint}`. The fingerprint is\n * computed via the exported `fingerprintAnthropicMessagesPrefix` helper — never reimplemented.\n * - No request repair: a `tool_choice` that appears not to have been honored (forces a name the\n * response never calls) only warns via `helpers.log.warn` — `AnthropicMessagesAdapterOptions`\n * has no `strictToolChoice` escape hatch, consistent with the \"warn loudly, send anyway\" ethos.\n *\n * Per-iteration flow (steps 1–9 of the plan):\n * 1. Merge constructor / executor / stash options and re-validate.\n * 2. Resolve helpers, falling back to bundled `default*` for each unset field.\n * 3. Artifact-reader tools: pre-forged onto `ctx.tools` by the DispatchRunner core; read as-is.\n * 4. Pre-render every persisted tool-call result into an Anthropic tool-result content block.\n * 5. When `tokenEncoding !== null`, sum the token weight of every persisted bucket and throw\n * {@link @nhtio/adk/batteries!E_ANTHROPIC_MESSAGES_CONTEXT_OVERFLOW} when the total exceeds `contextWindow`.\n * 6. Build the request via `buildAnthropicMessagesHistory`.\n * 7. Call `client.messages.create` with retry/timeout ownership; classify and translate errors.\n * 8. Streaming path: content-block state machine + usage latching + stop-reason handling.\n * 9. Non-streaming path: same persistence + tool-execution loop, from a single `Message`.\n */\n\nimport { DateTime } from 'luxon'\nimport { sha256 } from 'js-sha256'\nimport { v6 as uuidv6 } from 'uuid'\nimport { validateOptions } from './validation'\nimport { APIError } from '@anthropic-ai/sdk/core/error'\nimport { default as Anthropic } from '@anthropic-ai/sdk'\nimport { countAnthropicMessagesTokens } from './count_tokens'\nimport { translateAnthropicError } from './error_translation'\nimport { resolveToolCallParser } from '../chat_common/tool_parsers'\nimport { isError, isInstanceOf, isObject } from '@nhtio/adk/guards'\nimport { canonicalStringify } from '../../../lib/utils/canonical_json'\nimport { InMemorySpoolStore } from '@nhtio/adk/batteries/storage/in_memory'\nimport { looksLikeSpooledArtifact, normalizeToolName } from '../chat_common/helpers'\nimport {\n computeBackoff,\n sleepWithJitter,\n parseRetryAfter,\n linkAbortSignals,\n} from '../../../lib/utils/retry'\nimport {\n Tokenizable,\n ToolCall,\n Message,\n Thought,\n SpooledArtifact,\n Media,\n ArtifactTool,\n} from '@nhtio/adk/common'\nimport {\n E_INVALID_ANTHROPIC_MESSAGES_OPTIONS,\n E_ANTHROPIC_MESSAGES_CONTEXT_OVERFLOW,\n E_ANTHROPIC_MESSAGES_HTTP_ERROR,\n E_ANTHROPIC_MESSAGES_STREAM_ERROR,\n E_ANTHROPIC_MESSAGES_STREAM_STALLED,\n E_ANTHROPIC_MESSAGES_REQUEST_TIMEOUT,\n E_ANTHROPIC_MESSAGES_INVALID_TOOL_CALL_ARGS,\n} from './exceptions'\nimport {\n defaultDescriptionToChatCompletionsJsonSchema,\n defaultRenderUntrustedContent,\n defaultRenderTrustedContent,\n defaultRenderStandingInstructions,\n defaultRenderMemories,\n defaultRenderRetrievables,\n defaultRenderRetrievableHandleBody,\n defaultRenderRetrievableSafetyDirective,\n defaultRenderFirstPartyRetrievables,\n defaultRenderThirdPartyPublicRetrievables,\n defaultRenderThirdPartyPrivateRetrievables,\n defaultRenderThought,\n defaultFilterThoughts,\n defaultToolsToChatCompletionsTools,\n defaultRenderChatCompletionsSystemPrompt,\n defaultRenderAnthropicTimelineMessage,\n defaultRenderAnthropicMediaBlocks,\n defaultRenderAnthropicToolCallResult,\n defaultRenderAnthropicSegmentedSystemPrompt,\n defaultRenderAnthropicThinkingBlocks,\n defaultRenderArtifactHandleBody,\n defaultBuildAnthropicMessagesHistory,\n anthropicToolsFromTools,\n fingerprintAnthropicMessagesPrefix,\n} from './helpers'\nimport type { Tool, Memory } from '@nhtio/adk/common'\nimport type { DispatchContext } from '@nhtio/adk/types'\nimport type { TokenEncoding, TokenEncodingId } from '@nhtio/adk/types'\nimport type { AnthropicMessagesCountTokensRequestInput } from './count_tokens'\nimport type {\n DispatchExecutorFn,\n DispatchExecutorHelpers,\n GenerationStats,\n} from '@nhtio/adk/dispatch_runner'\nimport type {\n AnthropicMessagesAdapterOptions,\n AnthropicMessagesHelpers,\n AnthropicMessage,\n AnthropicToolResultBlockParam,\n AnthropicToolUseBlockParam,\n AnthropicRawMessageStreamEvent,\n AnthropicRawContentBlockStartEvent,\n AnthropicRawMessageDeltaEvent,\n AnthropicUsage,\n AnthropicMessageDeltaUsage,\n AnthropicThinkingReplayPayload,\n AnthropicStopReason,\n AnthropicMessagesCountTokensInput,\n} from './types'\n\n// ─── An assembled tool call (args kept as a JSON string; id/name arrive on content_block_start) ──\n\ninterface AssembledAnthropicToolCall {\n id: string\n name: string\n args: string\n}\n\n// ─── Content-block accumulator state, keyed by block index ───────────────────\n\ninterface TextBlockState {\n kind: 'text'\n text: string\n}\ninterface ThinkingBlockState {\n kind: 'thinking'\n thinking: string\n signature: string\n}\ninterface RedactedThinkingBlockState {\n kind: 'redacted_thinking'\n data: string\n}\ninterface ToolUseBlockState {\n kind: 'tool_use'\n id: string\n name: string\n args: string\n}\ninterface OtherBlockState {\n kind: 'other'\n}\ntype BlockState =\n | TextBlockState\n | ThinkingBlockState\n | RedactedThinkingBlockState\n | ToolUseBlockState\n | OtherBlockState\n\n// ─── Option merging ────────────────────────────────────────────────────────────\n\nconst mergeRecord = <T extends Record<string, unknown>>(\n layers: ReadonlyArray<T | undefined>\n): T | undefined => {\n let merged: T | undefined\n for (const layer of layers) {\n if (!layer) continue\n merged = { ...(merged ?? ({} as T)), ...layer }\n }\n return merged\n}\n\nconst mergeOptions = (\n baseline: AnthropicMessagesAdapterOptions,\n exec: Partial<AnthropicMessagesAdapterOptions> | undefined,\n stash: Partial<AnthropicMessagesAdapterOptions> | undefined\n): Partial<AnthropicMessagesAdapterOptions> => {\n const layers = [baseline as Partial<AnthropicMessagesAdapterOptions>, exec ?? {}, stash ?? {}]\n const out: Record<string, unknown> = {}\n for (const layer of layers) {\n for (const [k, v] of Object.entries(layer)) {\n if (v === undefined) continue\n if (k === 'headers' || k === 'helpers' || k === 'retry') continue\n out[k] = v\n }\n }\n const headers = mergeRecord(layers.map((l) => l.headers as Record<string, string> | undefined))\n if (headers !== undefined) out.headers = headers\n const helpers = mergeRecord(layers.map((l) => l.helpers as Record<string, unknown> | undefined))\n if (helpers !== undefined) out.helpers = helpers\n const retry = mergeRecord(layers.map((l) => l.retry as Record<string, unknown> | undefined))\n if (retry !== undefined) out.retry = retry\n return out as Partial<AnthropicMessagesAdapterOptions>\n}\n\n// ─── Helper resolution ─────────────────────────────────────────────────────────\n\nconst resolveHelpers = (\n overrides: Partial<AnthropicMessagesHelpers> | undefined\n): AnthropicMessagesHelpers => {\n const src = overrides ?? {}\n return {\n descriptionToChatCompletionsJsonSchema:\n src.descriptionToChatCompletionsJsonSchema ?? defaultDescriptionToChatCompletionsJsonSchema,\n renderUntrustedContent: src.renderUntrustedContent ?? defaultRenderUntrustedContent,\n renderTrustedContent: src.renderTrustedContent ?? defaultRenderTrustedContent,\n renderArtifactHandleBody: src.renderArtifactHandleBody ?? defaultRenderArtifactHandleBody,\n renderRetrievableHandleBody:\n src.renderRetrievableHandleBody ?? defaultRenderRetrievableHandleBody,\n renderStandingInstructions: src.renderStandingInstructions ?? defaultRenderStandingInstructions,\n renderMemories: src.renderMemories ?? defaultRenderMemories,\n renderRetrievables: src.renderRetrievables ?? defaultRenderRetrievables,\n renderRetrievableSafetyDirective:\n src.renderRetrievableSafetyDirective ?? defaultRenderRetrievableSafetyDirective,\n renderFirstPartyRetrievables:\n src.renderFirstPartyRetrievables ?? defaultRenderFirstPartyRetrievables,\n renderThirdPartyPublicRetrievables:\n src.renderThirdPartyPublicRetrievables ?? defaultRenderThirdPartyPublicRetrievables,\n renderThirdPartyPrivateRetrievables:\n src.renderThirdPartyPrivateRetrievables ?? defaultRenderThirdPartyPrivateRetrievables,\n renderThought: src.renderThought ?? defaultRenderThought,\n filterThoughts: src.filterThoughts ?? defaultFilterThoughts,\n toolsToChatCompletionsTools:\n src.toolsToChatCompletionsTools ?? defaultToolsToChatCompletionsTools,\n renderChatCompletionsSystemPrompt:\n src.renderChatCompletionsSystemPrompt ?? defaultRenderChatCompletionsSystemPrompt,\n anthropicToolsFromTools: src.anthropicToolsFromTools ?? anthropicToolsFromTools,\n renderAnthropicTimelineMessage:\n src.renderAnthropicTimelineMessage ?? defaultRenderAnthropicTimelineMessage,\n renderAnthropicMediaBlocks: src.renderAnthropicMediaBlocks ?? defaultRenderAnthropicMediaBlocks,\n renderAnthropicToolCallResult:\n src.renderAnthropicToolCallResult ?? defaultRenderAnthropicToolCallResult,\n renderAnthropicSegmentedSystemPrompt:\n src.renderAnthropicSegmentedSystemPrompt ?? defaultRenderAnthropicSegmentedSystemPrompt,\n renderAnthropicThinkingBlocks:\n src.renderAnthropicThinkingBlocks ?? defaultRenderAnthropicThinkingBlocks,\n buildAnthropicMessagesHistory:\n src.buildAnthropicMessagesHistory ?? defaultBuildAnthropicMessagesHistory,\n }\n}\n\n// ─── ID / checksum / time helpers ──────────────────────────────────────────────\n\nconst computeChecksum = (tool: string, args: unknown): string =>\n sha256(canonicalStringify({ tool, args }))\n\nconst nowIso = (): string => DateTime.now().toISO() ?? new Date().toISOString()\n\nconst estimateTokensOf = async (\n value: {\n estimateTokens: (encoding: TokenEncoding) => number | Promise<number>\n },\n encoding: TokenEncodingId\n): Promise<number> => Promise.resolve(value.estimateTokens(encoding as TokenEncoding))\n\nconst emptyBlockState = (\n block: AnthropicRawContentBlockStartEvent['content_block']\n): BlockState => {\n if (block.type === 'text') return { kind: 'text', text: block.text ?? '' }\n if (block.type === 'thinking')\n return {\n kind: 'thinking',\n thinking: block.thinking ?? '',\n signature: block.signature ?? '',\n }\n if (block.type === 'redacted_thinking') return { kind: 'redacted_thinking', data: block.data }\n if (block.type === 'tool_use') {\n // STREAMING-ONLY seed: on a real `content_block_start` event, `content_block.input` for a\n // `tool_use` block is always the SDK's `{}` placeholder, never the real arguments — the real\n // arguments arrive exclusively via subsequent `input_json_delta.partial_json` fragments on\n // `content_block_delta`, which this state's `args` accumulator appends to verbatim (see the\n // `content_block_delta` handler below). Serializing `block.input` here would seed the\n // accumulator with the string `\"{}\"`, and every later `partial_json` fragment would then be\n // appended onto that placeholder, producing corrupted concatenated JSON such as\n // `{}{\"query\":\"x\"}` that fails `JSON.parse` in `executeAndPersistToolCall` for every streamed\n // tool call. This function is reachable ONLY from the streaming path (Step 8); the\n // non-streaming path (Step 9) is structurally separate — it reads the complete `Message`'s\n // `content` array directly and serializes each `tool_use` block's `input` exactly once, never\n // through this function.\n return {\n kind: 'tool_use',\n id: block.id,\n name: block.name,\n args: '',\n }\n }\n return { kind: 'other' }\n}\n\n// ─── Stop-reason handling (exhaustive over all 7 AnthropicStopReason members) ──\n\n/**\n * Logs the terminal stop reason of a completed generation. Exhaustive over every\n * {@link AnthropicStopReason} member plus an explicit `default` for any value the SDK's union does\n * not yet cover — never a silent fall-through. `model_context_window_exceeded` is included for\n * switch exhaustiveness only: both call sites throw/nack on that reason before this function is\n * reached, so its case body is unreachable in practice.\n */\nconst logAnthropicStopReason = (\n helpers: DispatchExecutorHelpers,\n stopReason: string | null,\n stopDetails: unknown\n): void => {\n switch (stopReason as AnthropicStopReason | null) {\n case 'end_turn':\n helpers.log.debug({\n kind: 'anthropic-stop-reason',\n message: 'Anthropic ended the turn normally (end_turn).',\n payload: { stopReason },\n })\n break\n case 'max_tokens':\n helpers.log.warn({\n kind: 'anthropic-stop-reason',\n message: 'Anthropic stopped because max_tokens was reached; the response may be truncated.',\n payload: { stopReason },\n })\n break\n case 'stop_sequence':\n helpers.log.debug({\n kind: 'anthropic-stop-reason',\n message: 'Anthropic stopped on a configured stop_sequence.',\n payload: { stopReason },\n })\n break\n case 'tool_use':\n helpers.log.debug({\n kind: 'anthropic-stop-reason',\n message: 'Anthropic stopped to invoke one or more tools (tool_use).',\n payload: { stopReason },\n })\n break\n case 'pause_turn':\n helpers.log.info({\n kind: 'anthropic-pause-turn',\n message: 'Anthropic paused a long-running turn; response may be continued verbatim',\n payload: { stopReason },\n })\n break\n case 'refusal':\n helpers.log.warn({\n kind: 'anthropic-refusal',\n message: 'Anthropic returned a refusal stop reason',\n payload: { stopReason, stopDetails },\n })\n break\n case 'model_context_window_exceeded':\n // Unreachable: both call sites nack E_ANTHROPIC_MESSAGES_CONTEXT_OVERFLOW and return as\n // soon as this reason is observed, before this function runs.\n break\n case null:\n break\n default:\n helpers.log.warn({\n kind: 'anthropic-unrecognized-stop-reason',\n message: `Anthropic returned an unrecognized stop_reason \"${String(stopReason)}\"; treating it as a normal terminal response.`,\n payload: { stopReason },\n })\n }\n}\n\n// ─── Generation-stats extraction ───────────────────────────────────────────────\n\nconst extractGenerationStats = (input: {\n model: string\n usage?: AnthropicUsage | AnthropicMessageDeltaUsage\n finishReason?: string | null\n raw: Record<string, unknown>\n}): GenerationStats => {\n const stats: GenerationStats = {\n provider: 'anthropic_messages',\n model: input.model,\n raw: input.raw,\n }\n const usage = input.usage\n if (usage) {\n if (typeof usage.input_tokens === 'number') stats.promptTokens = usage.input_tokens\n if (typeof usage.output_tokens === 'number') stats.completionTokens = usage.output_tokens\n if (typeof usage.input_tokens === 'number' && typeof usage.output_tokens === 'number') {\n stats.totalTokens = usage.input_tokens + usage.output_tokens\n }\n }\n if (typeof input.finishReason === 'string') stats.finishReason = input.finishReason\n return stats\n}\n\n// ─── Adapter class ─────────────────────────────────────────────────────────────\n\n/**\n * Opinionated cross-environment LLM adapter for the Anthropic Messages wire shape.\n *\n * @remarks\n * Construction validates options eagerly via {@link validateOptions} and throws\n * {@link @nhtio/adk/batteries/llm/anthropic_messages!E_INVALID_ANTHROPIC_MESSAGES_OPTIONS} on\n * failure. The returned instance is reusable: call {@link AnthropicMessagesAdapter.executor} once\n * per `DispatchRunner` configuration to obtain a {@link @nhtio/adk!DispatchExecutorFn} bound to\n * the baseline plus optional executor-scope overrides. Per-iteration overrides live on\n * `ctx.stash.anthropicMessages` and take highest precedence; `headers`, `helpers`, and `retry`\n * merge key-by-key across all three layers, every other field is replaced wholesale at the\n * highest layer that sets it. Node-first: browser is explicitly not a target — an Anthropic API\n * key in a browser bundle is unacceptably exposed.\n */\nexport class AnthropicMessagesAdapter {\n /** Customary key for per-iteration overrides on `ctx.stash`. */\n public static readonly STASH_KEY = 'anthropicMessages' as const\n\n readonly #baseline: AnthropicMessagesAdapterOptions\n\n /**\n * @param options - Constructor-baseline options. Re-validated on every iteration after\n * per-dispatch and per-iteration overrides are layered in.\n * @throws {@link @nhtio/adk/batteries/llm/anthropic_messages!E_INVALID_ANTHROPIC_MESSAGES_OPTIONS} when `options` does not satisfy `anthropicMessagesOptionsSchema`.\n */\n constructor(options: unknown) {\n this.#baseline = validateOptions(options)\n }\n\n /**\n * Returns a {@link @nhtio/adk!DispatchExecutorFn} bound to this adapter's baseline plus optional\n * executor-scope overrides.\n *\n * @param overrides - Optional executor-scope overrides. Higher precedence than the baseline,\n * lower precedence than `ctx.stash[STASH_KEY]`.\n */\n executor(overrides?: Partial<AnthropicMessagesAdapterOptions>): DispatchExecutorFn {\n const baseline = this.#baseline\n const adapterClass = AnthropicMessagesAdapter\n return async (ctx: DispatchContext, helpers: DispatchExecutorHelpers): Promise<void> => {\n const localWarn = (msg: string): void => {\n helpers.log.warn({ kind: 'helper-warning', message: msg })\n }\n\n // ── Step 1: merge & validate ──────────────────────────────────────────\n const stashRaw = ctx.stash.get(adapterClass.STASH_KEY, {}) as unknown\n const stashOverrides =\n stashRaw && typeof stashRaw === 'object'\n ? (stashRaw as Partial<AnthropicMessagesAdapterOptions>)\n : {}\n const merged = validateOptions(mergeOptions(baseline, overrides, stashOverrides))\n\n // Cross-field invariant: tokenEncoding non-null requires contextWindow.\n if (merged.tokenEncoding !== null && merged.contextWindow === undefined) {\n throw new E_INVALID_ANTHROPIC_MESSAGES_OPTIONS([\n 'tokenEncoding is non-null but contextWindow is undefined',\n ])\n }\n\n // ── Step 2: resolve helpers ───────────────────────────────────────────\n const resolvedHelpers = resolveHelpers(merged.helpers)\n\n // ── Step 3: artifact-reader tools ─────────────────────────────────────\n // Forged by the DispatchRunner CORE into `ctx.tools` before the input pipeline runs\n // (generation is a generic core concern; this battery owns only representation). Read the\n // pre-forged `ctx.tools` directly — no local merge, no bindContext here.\n\n // ── Step 4: pre-render tool-call results ──────────────────────────────\n // Key by primitive identity: duplicate provider ids must not cross-wire results.\n const renderedToolCallResults = new Map<ToolCall, AnthropicToolResultBlockParam>()\n for (const tc of ctx.turnToolCalls) {\n const rendered = await resolvedHelpers.renderAnthropicToolCallResult({\n toolCall: tc,\n results: tc.results as\n | Tokenizable\n | SpooledArtifact\n | SpooledArtifact[]\n | Media\n | Media[],\n tool: ctx.tools.get(tc.tool) as Tool | ArtifactTool | undefined,\n renderUntrustedContent: resolvedHelpers.renderUntrustedContent,\n renderTrustedContent: resolvedHelpers.renderTrustedContent,\n renderAnthropicMediaBlocks: resolvedHelpers.renderAnthropicMediaBlocks,\n renderArtifactHandleBody: resolvedHelpers.renderArtifactHandleBody,\n unsupportedMediaPolicy: merged.unsupportedMediaPolicy ?? 'throw',\n warn: localWarn,\n })\n renderedToolCallResults.set(tc, rendered)\n }\n\n // ── Step 5: context window enforcement ────────────────────────────────\n if (merged.tokenEncoding !== null && merged.contextWindow !== undefined) {\n const encoding = merged.tokenEncoding as TokenEncodingId\n let spTokens = await estimateTokensOf(ctx.systemPrompt, encoding)\n let siTokens = 0\n for (const si of ctx.standingInstructions) {\n siTokens += await estimateTokensOf(si, encoding)\n }\n let memTokens = 0\n for (const mem of ctx.turnMemories as Set<Memory>) {\n memTokens += await estimateTokensOf(mem.content, encoding)\n }\n let retTokens = 0\n for (const r of ctx.turnRetrievables) {\n retTokens +=\n !r.inline && SpooledArtifact.isSpooledArtifact(r.content) && r.content.hasSizeHints()\n ? r.content.estimateHandleTokens(\n r.id,\n encoding as TokenEncoding,\n resolvedHelpers.renderRetrievableHandleBody\n )\n : await estimateTokensOf(r.content, encoding)\n }\n let tlTokens = 0\n for (const msg of ctx.turnMessages) {\n if (msg.content !== undefined) {\n tlTokens += await estimateTokensOf(msg.content, encoding)\n }\n }\n for (const th of ctx.turnThoughts) {\n tlTokens += await estimateTokensOf(th.content, encoding)\n }\n for (const rendered of renderedToolCallResults.values()) {\n tlTokens += await estimateTokensOf(new Tokenizable(JSON.stringify(rendered)), encoding)\n }\n // Tool DECLARATIONS: Anthropic renders `tools` server-side; there is no single fixed\n // client-side conversion to reproduce it. Tally the serialized wire `tools` JSON as an\n // honest FLOOR. Without this the guard undercounts a tool-heavy prompt by the entire\n // declaration block.\n let toolTokens = 0\n const visibleTools = ctx.tools.visible()\n if (visibleTools.length > 0) {\n const toolsJson = JSON.stringify(\n resolvedHelpers.anthropicToolsFromTools(visibleTools, {\n descriptionToChatCompletionsJsonSchema: (d) =>\n resolvedHelpers.descriptionToChatCompletionsJsonSchema(d as never),\n })\n )\n toolTokens = await estimateTokensOf(new Tokenizable(toolsJson), encoding)\n }\n const total = spTokens + siTokens + memTokens + retTokens + tlTokens + toolTokens\n const perBucketObj = {\n systemPrompt: spTokens,\n standingInstructions: siTokens,\n memories: memTokens,\n retrievables: retTokens,\n timeline: tlTokens,\n tools: toolTokens,\n }\n helpers.log.debug({\n kind: 'context-window-usage',\n message: `Context window usage: ${total}/${merged.contextWindow} tokens`,\n payload: {\n total,\n limit: merged.contextWindow,\n encoding,\n perBucket: perBucketObj,\n },\n })\n if (total > merged.contextWindow) {\n throw new E_ANTHROPIC_MESSAGES_CONTEXT_OVERFLOW([\n total,\n merged.contextWindow,\n encoding,\n JSON.stringify(perBucketObj),\n ])\n }\n }\n\n // ── Step 5b: tool_choice forced-tool guard (warn-only; no strictToolChoice escape) ─────\n // Anthropic's tool_choice shape (`{type:'auto'|'any'|'tool'|'none', name?}`) has no\n // equivalent to Chat Completions' `function`/`custom`/`allowed_tools` variants — only the\n // `'tool'` variant names a single tool. `AnthropicMessagesAdapterOptions` carries no\n // `strictToolChoice` field (types.ts is out of scope for this work package), so a forced\n // name resolving to an ephemeral, forged artifact-query tool can only be warned about, never\n // thrown on — consistent with the \"warn loudly, send anyway, no request repair\" governing\n // constraint. Never assume forcing worked: some models 400 on a forced tool_choice, which\n // surfaces later as a translated HTTP error, not here.\n const toolChoice = merged.toolChoice\n if (toolChoice && toolChoice.type === 'tool') {\n const t = ctx.tools.get(toolChoice.name) as { ephemeral?: boolean } | undefined\n if (t?.ephemeral === true) {\n helpers.log.warn({\n kind: 'tool-choice-forged-artifact',\n message: `tool_choice forces forged ephemeral artifact-query tool \"${toolChoice.name}\"; this is almost always a misconfiguration and it may not exist on the next iteration`,\n payload: { toolName: toolChoice.name },\n })\n }\n }\n\n // ── Step 5c: Fable-class forced-tool-use / thinking incompatibility guard (warn-only) ──\n // \"Fable-class\" is matched via a `claude-fable-` model-name prefix — ageing data, not a hard\n // capability table (no authoritative per-model capability source is available to this\n // adapter). A forced `tool_choice` (`{type:'tool'}` or `{type:'any'}`) combined with either\n // variant of `thinking` (`disabled` or `enabled`) is known to 400 upstream on this model\n // class. Same governing principle as Step 5b: surface the footgun, never rewrite/repair the\n // request — the caller may know something this heuristic doesn't.\n if (merged.model.startsWith('claude-fable-')) {\n const forcedToolChoice =\n toolChoice !== undefined && (toolChoice.type === 'tool' || toolChoice.type === 'any')\n const incompatibleThinking =\n merged.thinking !== undefined &&\n (merged.thinking.type === 'disabled' || merged.thinking.type === 'enabled')\n if (forcedToolChoice && incompatibleThinking) {\n helpers.log.warn({\n kind: 'fable-forced-tool-choice-thinking-conflict',\n message: `Model \"${merged.model}\" matches the Fable-class heuristic (claude-fable- prefix); combining a forced tool_choice (\"${toolChoice?.type}\") with thinking (\"${merged.thinking?.type}\") is known to 400 upstream on this model class. Sending the request unmodified.`,\n payload: {\n model: merged.model,\n toolChoiceType: toolChoice?.type,\n thinking: merged.thinking,\n },\n })\n }\n }\n\n // ── Step 6: build request body ────────────────────────────────────────\n const {\n system,\n messages: wireMessages,\n tools: wireTools,\n } = await resolvedHelpers.buildAnthropicMessagesHistory({\n model: merged.model,\n systemPrompt: ctx.systemPrompt,\n standingInstructions: ctx.standingInstructions,\n memories: ctx.turnMemories,\n retrievables: ctx.turnRetrievables,\n messages: ctx.turnMessages,\n thoughts: ctx.turnThoughts,\n toolCalls: ctx.turnToolCalls,\n tools: ctx.tools,\n renderedToolCallResults,\n bucketOrder: merged.bucketOrder ?? [\n 'standingInstructions',\n 'memories',\n 'retrievables',\n 'timeline',\n ],\n selfIdentity: merged.selfIdentity ?? 'assistant',\n thoughtSurfacing: merged.thoughtSurfacing ?? 'all-self',\n replayCompatibility: merged.replayCompatibility ?? [],\n unsupportedMediaPolicy: merged.unsupportedMediaPolicy ?? 'throw',\n cacheBreakpoints: merged.cacheBreakpoints ?? 'auto',\n cacheTtl: merged.cacheTtl,\n renderAnthropicToolCallResult: resolvedHelpers.renderAnthropicToolCallResult,\n renderChatCompletionsSystemPrompt: resolvedHelpers.renderChatCompletionsSystemPrompt,\n renderAnthropicSegmentedSystemPrompt: resolvedHelpers.renderAnthropicSegmentedSystemPrompt,\n renderStandingInstructions: resolvedHelpers.renderStandingInstructions,\n renderMemories: resolvedHelpers.renderMemories,\n renderRetrievables: resolvedHelpers.renderRetrievables,\n renderRetrievableSafetyDirective: resolvedHelpers.renderRetrievableSafetyDirective,\n renderFirstPartyRetrievables: resolvedHelpers.renderFirstPartyRetrievables,\n renderThirdPartyPublicRetrievables: resolvedHelpers.renderThirdPartyPublicRetrievables,\n renderThirdPartyPrivateRetrievables: resolvedHelpers.renderThirdPartyPrivateRetrievables,\n renderRetrievableHandleBody: resolvedHelpers.renderRetrievableHandleBody,\n renderAnthropicTimelineMessage: resolvedHelpers.renderAnthropicTimelineMessage,\n renderThought: resolvedHelpers.renderThought,\n filterThoughts: resolvedHelpers.filterThoughts,\n renderAnthropicThinkingBlocks: resolvedHelpers.renderAnthropicThinkingBlocks,\n renderUntrustedContent: resolvedHelpers.renderUntrustedContent,\n renderTrustedContent: resolvedHelpers.renderTrustedContent,\n warn: localWarn,\n })\n\n const stream = merged.stream ?? true\n\n // Anthropic request surface fields are individually named on `AnthropicMessagesAdapterOptions`\n // (unlike OpenAI's spread-minus-control-keys body assembly) — assembled explicitly, field by\n // field, only when defined. This enumerates the request surface exhaustively rather than\n // spreading `merged`, so no ADK-control field (spoolStore, helpers, retry, onRawGeneration,\n // ...) can ever leak into the wire body by omission from a strip-set.\n const params: Record<string, unknown> = {\n model: merged.model,\n max_tokens: merged.maxTokens,\n messages: wireMessages,\n stream,\n }\n if (system !== undefined) params.system = system\n if (wireTools !== undefined && wireTools.length > 0) params.tools = wireTools\n if (merged.stopSequences !== undefined) params.stop_sequences = merged.stopSequences\n if (merged.thinking !== undefined) params.thinking = merged.thinking\n if (merged.outputConfig !== undefined) params.output_config = merged.outputConfig\n if (merged.toolChoice !== undefined) params.tool_choice = merged.toolChoice\n if (merged.metadata !== undefined) params.metadata = merged.metadata\n if (merged.serviceTier !== undefined) params.service_tier = merged.serviceTier\n if (merged.container !== undefined) params.container = merged.container\n if (merged.inferenceGeo !== undefined) params.inference_geo = merged.inferenceGeo\n if (merged.userProfileId !== undefined) params.user_profile_id = merged.userProfileId\n // Deprecated sampling parameters — never supplied unless the caller explicitly sets them.\n if (merged.temperature !== undefined) params.temperature = merged.temperature\n if (merged.topP !== undefined) params.top_p = merged.topP\n if (merged.topK !== undefined) params.top_k = merged.topK\n\n // One id for this whole generation — correlates the TO tap (onPromptAssembled) with the FROM\n // tap (onRawGeneration) below.\n const dispatchStreamId = uuidv6()\n\n // Prompt-assembled observability tap: the EXACT request going TO Anthropic, the instant it is\n // built and BEFORE the call. Mirror of onRawGeneration. Handed back AS-IS — no redaction —\n // and swallow observer errors so it can never corrupt the generation path.\n if (merged.onPromptAssembled) {\n try {\n merged.onPromptAssembled({\n battery: 'anthropic_messages',\n kind: 'request-body',\n messages: wireMessages,\n tools: wireTools,\n requestBody: params,\n streamed: stream,\n streamId: dispatchStreamId,\n })\n } catch {\n /* observer errors are non-fatal */\n }\n }\n\n // ── Step 7: call the SDK with retry / timeout ownership ───────────────\n const retryCfg = {\n maxAttempts: merged.retry?.maxAttempts ?? 1,\n baseDelayMs: merged.retry?.baseDelayMs ?? 500,\n maxDelayMs: merged.retry?.maxDelayMs ?? 30_000,\n retriableStatuses: merged.retry?.retriableStatuses ?? [429, 502, 503, 504, 529],\n honorRetryAfter: merged.retry?.honorRetryAfter ?? true,\n }\n\n const requestTimeoutMs = merged.requestTimeoutMs ?? 0\n // ADK owns retry (maxRetries:0) and timeout ownership. When requestTimeoutMs > 0, the SDK\n // client timeout is set with an explicit safety margin above it so the ADK-side timer (via\n // the linked AbortSignal below) is deterministically the one that fires first and raises\n // E_ANTHROPIC_MESSAGES_REQUEST_TIMEOUT. When requestTimeoutMs is 0 (ADK timer disabled), a\n // large explicit sentinel replaces the SDK's silent 10-minute default so the caller's choice\n // to disable the ADK timer is never silently overridden by an SDK-owned ceiling.\n const client = new Anthropic({\n apiKey: merged.apiKey,\n baseURL: merged.baseURL,\n fetch: merged.fetch,\n maxRetries: 0,\n timeout: requestTimeoutMs > 0 ? requestTimeoutMs + 30_000 : 24 * 60 * 60 * 1000,\n defaultHeaders: merged.headers,\n dangerouslyAllowBrowser: merged.dangerouslyAllowBrowser ?? false,\n })\n\n let anthropicStream: AsyncIterable<AnthropicRawMessageStreamEvent> | undefined\n let anthropicMessage: AnthropicMessage | undefined\n let attempt = 1\n const maxAttempts = retryCfg.maxAttempts\n let disposeLink: () => void = () => {}\n\n while (attempt <= maxAttempts) {\n if (ctx.abortSignal.aborted) return\n\n const internalController = new AbortController()\n let timeoutHandle: ReturnType<typeof setTimeout> | undefined\n if (requestTimeoutMs > 0) {\n timeoutHandle = setTimeout(() => internalController.abort(), requestTimeoutMs)\n }\n disposeLink()\n const { signal: linkedSignal, dispose: disposeCurrentLink } = linkAbortSignals([\n ctx.abortSignal,\n internalController.signal,\n ])\n disposeLink = disposeCurrentLink\n\n try {\n if (stream) {\n anthropicStream = (await client.messages.create({ ...params, stream: true } as never, {\n signal: linkedSignal,\n })) as unknown as AsyncIterable<AnthropicRawMessageStreamEvent>\n } else {\n anthropicMessage = (await client.messages.create(\n { ...params, stream: false } as never,\n {\n signal: linkedSignal,\n }\n )) as unknown as AnthropicMessage\n }\n if (timeoutHandle !== undefined) clearTimeout(timeoutHandle)\n break\n } catch (err) {\n if (timeoutHandle !== undefined) clearTimeout(timeoutHandle)\n if (ctx.abortSignal.aborted) return\n const classified = translateAnthropicError(err, retryCfg.retriableStatuses, {\n resolveErrorStatus: merged.resolveErrorStatus,\n warn: (msg) =>\n helpers.log.warn({ kind: 'anthropic-resolve-error-status', message: msg }),\n })\n if (classified.kind === 'abort') return\n if (classified.kind === 'timeout') {\n helpers.log.warn({\n kind: 'request-timeout',\n message: `Request timed out after ${requestTimeoutMs}ms on attempt ${attempt}/${maxAttempts}`,\n payload: { requestTimeoutMs, attempt, maxAttempts },\n })\n if (attempt < maxAttempts) {\n const delay = computeBackoff(attempt, retryCfg)\n await sleepWithJitter(delay, ctx.abortSignal)\n attempt += 1\n continue\n }\n ctx.nack(new E_ANTHROPIC_MESSAGES_REQUEST_TIMEOUT([requestTimeoutMs]))\n return\n }\n if (classified.kind === 'context-overflow') {\n // Detected from body text on a 400 BadRequestError — the wire never distinguishes this\n // from any other 400, so the adapter cannot report the exact per-bucket breakdown the\n // pre-flight guard (Step 5) computes; that guard is the source of truth for a\n // predictable overflow. This branch only catches what the guard could not: a case where\n // Anthropic's own accounting disagrees with the local token estimate.\n ctx.nack(\n new E_ANTHROPIC_MESSAGES_CONTEXT_OVERFLOW([\n -1,\n merged.contextWindow ?? -1,\n merged.tokenEncoding ?? 'unknown',\n classified.message,\n ])\n )\n return\n }\n if (classified.kind === 'retriable') {\n if (attempt < maxAttempts) {\n let delay = computeBackoff(attempt, retryCfg)\n if (retryCfg.honorRetryAfter !== false && isInstanceOf(err, 'APIError', APIError)) {\n const ra = err.headers?.get?.('retry-after')\n if (ra) {\n const raMs = parseRetryAfter(ra)\n if (raMs > 0) delay = Math.min(Math.max(delay, raMs), retryCfg.maxDelayMs)\n }\n }\n helpers.log.warn({\n kind: 'retry-attempt',\n message: `Anthropic error (status ${classified.status}) on attempt ${attempt}/${maxAttempts}; retrying in ~${delay}ms`,\n payload: {\n reason: 'http-status',\n status: classified.status,\n delayMs: delay,\n attempt: attempt + 1,\n maxAttempts,\n },\n })\n await sleepWithJitter(delay, ctx.abortSignal)\n attempt += 1\n continue\n }\n helpers.log.error({\n kind: 'http-error',\n message: `Anthropic error ${classified.status} (terminal): ${classified.message.slice(0, 256)}`,\n payload: {\n status: classified.status,\n body: classified.message,\n attempt,\n maxAttempts,\n },\n })\n ctx.nack(new E_ANTHROPIC_MESSAGES_HTTP_ERROR([classified.status, classified.message]))\n return\n }\n helpers.log.error({\n kind: 'http-error',\n message: `Anthropic error ${classified.status} (terminal): ${classified.message.slice(0, 256)}`,\n payload: {\n status: classified.status,\n body: classified.message,\n attempt,\n maxAttempts,\n },\n })\n ctx.nack(new E_ANTHROPIC_MESSAGES_HTTP_ERROR([classified.status, classified.message]))\n return\n }\n }\n\n const spoolStore = merged.spoolStore ?? new InMemorySpoolStore()\n const selfIdentity = merged.selfIdentity ?? 'assistant'\n\n // ── Inner helper: persist + execute one assembled tool call ───────────\n const executeAndPersistToolCall = async (call: AssembledAnthropicToolCall): Promise<void> => {\n // Resolve the vendor id once at ingress so reporting, persistence, and spooling agree.\n const callId = merged.toolCallIdFilter?.(call.id, ctx) ?? call.id\n const tool = ctx.tools.get(call.name)\n let args: Record<string, unknown> = {}\n let parseError: InstanceType<typeof E_ANTHROPIC_MESSAGES_INVALID_TOOL_CALL_ARGS> | undefined\n if (call.args && call.args.length > 0) {\n try {\n const parsed: unknown = JSON.parse(call.args)\n if (isObject(parsed)) {\n args = parsed\n } else {\n const receivedKind = Array.isArray(parsed)\n ? 'array'\n : parsed === null\n ? 'null'\n : typeof parsed\n parseError = new E_ANTHROPIC_MESSAGES_INVALID_TOOL_CALL_ARGS([\n `must be a JSON object; received ${receivedKind}`,\n call.args,\n ])\n }\n } catch {\n parseError = new E_ANTHROPIC_MESSAGES_INVALID_TOOL_CALL_ARGS([\n 'are not valid JSON',\n call.args,\n ])\n }\n }\n const completedAt = nowIso()\n if (parseError !== undefined) {\n const toolName = normalizeToolName(call.name)\n const results = new Tokenizable(parseError.message)\n helpers.reportToolCall(callId, { tool: toolName, args })\n helpers.reportToolCall(callId, {\n results,\n isError: true,\n isComplete: true,\n })\n await ctx.storeToolCall(\n new ToolCall({\n id: callId,\n tool: toolName,\n args,\n checksum: computeChecksum(toolName, args),\n isComplete: true,\n isError: true,\n results,\n createdAt: completedAt,\n updatedAt: completedAt,\n completedAt,\n })\n )\n return\n }\n if (!tool) {\n const toolName = normalizeToolName(call.name)\n const available = ctx.tools\n .all()\n .map((t) => t.name)\n .sort()\n const errText =\n available.length > 0\n ? `Tool not found: ${toolName}. Available tools: ${available.join(', ')}.`\n : `Tool not found: ${toolName}. No tools are available this turn.`\n const results = new Tokenizable(errText)\n helpers.reportToolCall(callId, { tool: toolName, args })\n helpers.reportToolCall(callId, {\n results,\n isError: true,\n isComplete: true,\n })\n await ctx.storeToolCall(\n new ToolCall({\n id: callId,\n tool: toolName,\n args,\n checksum: computeChecksum(toolName, args),\n isComplete: true,\n isError: true,\n results,\n createdAt: completedAt,\n updatedAt: completedAt,\n completedAt,\n })\n )\n return\n }\n helpers.reportToolCall(callId, { tool: tool.name, args })\n const isArtifactTool = ArtifactTool.isArtifactTool(tool)\n let results: Tokenizable | SpooledArtifact | SpooledArtifact[] | Media | Media[] =\n new Tokenizable('')\n let toolHadError = false\n try {\n const raw = await tool.executor(ctx)(args)\n if (isArtifactTool) {\n if (Tokenizable.isTokenizable(raw)) {\n results = raw\n } else if (typeof raw === 'string') {\n results = new Tokenizable(raw)\n } else {\n throw new Error(\n `ArtifactTool \"${tool.name}\" returned a non-string/non-Tokenizable value`\n )\n }\n } else if (Media.isMedia(raw)) {\n results = raw\n } else if (Array.isArray(raw) && raw.length > 0 && raw.every((m) => Media.isMedia(m))) {\n results = raw as Media[]\n } else if (looksLikeSpooledArtifact(raw)) {\n results = raw as SpooledArtifact\n } else if (typeof raw === 'string' || isInstanceOf(raw, 'Uint8Array', Uint8Array)) {\n const reader = await spoolStore.write(callId, raw as string | Uint8Array)\n const ArtifactCtor = (tool as Tool).artifactConstructor?.() ?? SpooledArtifact\n results = new ArtifactCtor(reader)\n } else {\n const reader = await spoolStore.write(callId, String(raw))\n const ArtifactCtor = (tool as Tool).artifactConstructor?.() ?? SpooledArtifact\n results = new ArtifactCtor(reader)\n }\n } catch (err) {\n toolHadError = true\n let detailMsg = isError(err) ? err.message : String(err)\n if (\n isError(err) &&\n isError(err.cause) &&\n err.cause.message &&\n err.cause.message !== err.message\n ) {\n detailMsg = `${detailMsg} ${err.cause.message}`\n }\n results = new Tokenizable(detailMsg)\n }\n helpers.reportToolCall(callId, {\n results,\n isError: toolHadError,\n isComplete: true,\n })\n const completedAt2 = nowIso()\n await ctx.storeToolCall(\n new ToolCall({\n id: callId,\n tool: tool.name,\n args,\n checksum: computeChecksum(tool.name, args),\n isComplete: true,\n isError: toolHadError,\n results,\n fromArtifactTool: isArtifactTool,\n // ArtifactTool results are the documented exception: they inline the slice the model\n // queried from a prior artifact (handing back a handle to a query result would be\n // recursion). Every other result keeps the secure default (inline:false → handle).\n inline: isArtifactTool,\n createdAt: completedAt2,\n updatedAt: completedAt2,\n completedAt: completedAt2,\n })\n )\n }\n\n // FALLBACK tool-call recovery. Native `tool_use` content blocks are authoritative; this is\n // consulted ONLY when the response yielded zero native tool_use blocks AND the caller opted\n // in via `localToolCallParser`. Mirrors the `ollama`/`openai_chat_completions` fallback\n // pattern verbatim — pure parse over the accumulated text, returning assembled calls (empty\n // when disabled or no match) so each call site can reflect them in `onRawGeneration` and then\n // execute them exactly like native calls.\n const parseFallbackToolCalls = (content: string): AssembledAnthropicToolCall[] => {\n if (merged.localToolCallParser === undefined) return []\n if (typeof content !== 'string' || content.length === 0) return []\n const parser = resolveToolCallParser(merged.localToolCallParser)\n const toolNames = ctx.tools.visible().map((t) => t.name)\n return parser(content, { toolNames }).calls.map((c) => ({\n id: uuidv6(),\n name: c.name,\n args: JSON.stringify(c.arguments),\n }))\n }\n\n // ── Step 8: streaming path ────────────────────────────────────────────\n if (stream) {\n if (!anthropicStream) {\n ctx.nack(new E_ANTHROPIC_MESSAGES_STREAM_ERROR(['no stream returned']))\n return\n }\n const streamId = dispatchStreamId\n const thoughtStreamId = `${streamId}:thought`\n\n const blocks = new Map<number, BlockState>()\n let sawMessageDelta = false\n let sawThinking = false\n let finalUsage: AnthropicUsage | AnthropicMessageDeltaUsage | undefined\n let finalStopReason: string | null = null\n let finalStopDetails: AnthropicRawMessageDeltaEvent['delta']['stop_details'] = null\n let responseModel = merged.model\n let doneSeen = false\n const collectedToolCalls: AssembledAnthropicToolCall[] = []\n\n const idleMs = merged.streamIdleTimeoutMs ?? 0\n let idleTimer: ReturnType<typeof setTimeout> | undefined\n let stalled = false\n const idleController = new AbortController()\n const armIdleTimer = (): void => {\n if (idleMs <= 0) return\n if (idleTimer) clearTimeout(idleTimer)\n idleTimer = setTimeout(() => {\n stalled = true\n helpers.log.warn({\n kind: 'stream-idle-timeout',\n message: `Anthropic stream went idle for ${idleMs}ms; cancelling`,\n payload: { idleMs },\n })\n idleController.abort()\n }, idleMs)\n }\n const clearIdleTimer = (): void => {\n if (idleTimer) {\n clearTimeout(idleTimer)\n idleTimer = undefined\n }\n }\n\n const finalize = async (): Promise<void> => {\n if (sawMessageDelta) {\n const combinedText = Array.from(blocks.values())\n .filter((b): b is TextBlockState => b.kind === 'text')\n .map((b) => b.text)\n .join('')\n helpers.reportMessage(streamId, '', { isComplete: true })\n await ctx.storeMessage(\n new Message({\n id: streamId,\n role: 'assistant',\n content: combinedText,\n identity: selfIdentity,\n createdAt: nowIso(),\n updatedAt: nowIso(),\n })\n )\n }\n if (sawThinking) {\n const thinkingBlocks = Array.from(blocks.entries()).filter(\n (entry): entry is [number, ThinkingBlockState | RedactedThinkingBlockState] =>\n entry[1].kind === 'thinking' || entry[1].kind === 'redacted_thinking'\n )\n const combinedThinking = thinkingBlocks\n .map(([, b]) => (b.kind === 'thinking' ? b.thinking : ''))\n .join('')\n helpers.reportThought(thoughtStreamId, '', { isComplete: true })\n const prefixFingerprint = await fingerprintAnthropicMessagesPrefix({\n model: merged.model,\n system,\n tools: wireTools,\n messages: wireMessages,\n })\n const firstThinking = thinkingBlocks.find(([, b]) => b.kind === 'thinking') as\n | [number, ThinkingBlockState]\n | undefined\n const firstRedacted = thinkingBlocks.find(([, b]) => b.kind === 'redacted_thinking') as\n | [number, RedactedThinkingBlockState]\n | undefined\n const payload: AnthropicThinkingReplayPayload | undefined = firstThinking\n ? {\n variant: 'thinking',\n thinking: firstThinking[1].thinking,\n signature: firstThinking[1].signature,\n prefixFingerprint,\n }\n : firstRedacted\n ? {\n variant: 'redacted_thinking',\n data: firstRedacted[1].data,\n prefixFingerprint,\n }\n : undefined\n await ctx.storeThought(\n new Thought({\n id: thoughtStreamId,\n content: combinedThinking,\n identity: selfIdentity,\n payload,\n replayCompatibility: payload ? 'anthropic-messages-thinking-v1' : undefined,\n createdAt: nowIso(),\n updatedAt: nowIso(),\n })\n )\n }\n\n helpers.reportGenerationStats(\n extractGenerationStats({\n model: responseModel,\n usage: finalUsage,\n finishReason: finalStopReason,\n raw: {\n usage: finalUsage,\n stop_reason: finalStopReason,\n stop_details: finalStopDetails,\n },\n })\n )\n\n const combinedText = Array.from(blocks.values())\n .filter((b): b is TextBlockState => b.kind === 'text')\n .map((b) => b.text)\n .join('')\n\n // Fallback recovery (opt-in): consulted only when no native tool_use blocks were\n // collected, so a native call always wins over a parsed one.\n const fallbackToolCalls =\n collectedToolCalls.length === 0 ? parseFallbackToolCalls(combinedText) : []\n const effectiveToolCalls =\n collectedToolCalls.length > 0 ? collectedToolCalls : fallbackToolCalls\n\n if (merged.onRawGeneration) {\n try {\n merged.onRawGeneration({\n rawText: combinedText,\n cleanedText: combinedText,\n reasoning: sawThinking\n ? Array.from(blocks.values())\n .filter((b): b is ThinkingBlockState => b.kind === 'thinking')\n .map((b) => b.thinking)\n : [],\n toolCalls: effectiveToolCalls.map((c) => ({\n name: c.name,\n arguments: c.args as never,\n })),\n streamed: true,\n streamId: dispatchStreamId,\n })\n } catch {\n /* observer errors are non-fatal */\n }\n }\n\n logAnthropicStopReason(helpers, finalStopReason, finalStopDetails)\n\n if (effectiveToolCalls.length === 0) {\n if (merged.autoAck) ctx.ack()\n return\n }\n for (const call of effectiveToolCalls) {\n if (ctx.abortSignal.aborted) return\n await executeAndPersistToolCall(call)\n }\n }\n\n try {\n armIdleTimer()\n for await (const event of anthropicStream) {\n armIdleTimer()\n if (ctx.abortSignal.aborted || idleController.signal.aborted) {\n clearIdleTimer()\n if (stalled) {\n ctx.nack(new E_ANTHROPIC_MESSAGES_STREAM_STALLED([idleMs]))\n }\n return\n }\n if (event.type === 'message_start') {\n responseModel = event.message.model ?? responseModel\n finalUsage = event.message.usage\n } else if (event.type === 'content_block_start') {\n blocks.set(event.index, emptyBlockState(event.content_block))\n const b = blocks.get(event.index)!\n if (b.kind === 'thinking' || b.kind === 'redacted_thinking') sawThinking = true\n } else if (event.type === 'content_block_delta') {\n const b = blocks.get(event.index)\n const delta = event.delta\n if (delta.type === 'text_delta') {\n sawMessageDelta = true\n if (b && b.kind === 'text') b.text += delta.text\n helpers.reportMessage(streamId, delta.text)\n } else if (delta.type === 'thinking_delta') {\n sawThinking = true\n if (b && b.kind === 'thinking') b.thinking += delta.thinking\n helpers.reportThought(thoughtStreamId, delta.thinking)\n } else if (delta.type === 'signature_delta') {\n if (b && b.kind === 'thinking') b.signature = delta.signature\n } else if (delta.type === 'input_json_delta') {\n if (b && b.kind === 'tool_use') b.args += delta.partial_json\n }\n // citations_delta: out of scope for v1 — no ADK citation representation; no-op.\n } else if (event.type === 'content_block_stop') {\n const b = blocks.get(event.index)\n if (b && b.kind === 'tool_use') {\n collectedToolCalls.push({\n id: b.id,\n name: b.name,\n args: b.args || '{}',\n })\n }\n } else if (event.type === 'message_delta') {\n if (event.usage) finalUsage = event.usage\n if (event.delta.stop_reason !== null && event.delta.stop_reason !== undefined) {\n finalStopReason = event.delta.stop_reason\n }\n if (event.delta.stop_details !== null && event.delta.stop_details !== undefined) {\n finalStopDetails = event.delta.stop_details\n }\n if (event.delta.stop_reason === 'model_context_window_exceeded') {\n clearIdleTimer()\n ctx.nack(\n new E_ANTHROPIC_MESSAGES_CONTEXT_OVERFLOW([\n -1,\n merged.contextWindow ?? -1,\n merged.tokenEncoding ?? 'unknown',\n JSON.stringify(event.delta),\n ])\n )\n return\n }\n } else if (event.type === 'message_stop') {\n doneSeen = true\n clearIdleTimer()\n await finalize()\n return\n }\n }\n clearIdleTimer()\n if (stalled) {\n ctx.nack(new E_ANTHROPIC_MESSAGES_STREAM_STALLED([idleMs]))\n return\n }\n // The SDK's own iterator does not guarantee a trailing message_stop reaches this loop in\n // every transport edge case (e.g. the connection closes cleanly right after the final\n // frame) — finalization must be idempotent and reachable from stream EOF too.\n if (!doneSeen) {\n helpers.log.warn({\n kind: 'stream-eof-without-stop',\n message:\n 'Anthropic stream ended without a message_stop event; draining accumulated state',\n })\n await finalize()\n }\n } catch (err) {\n clearIdleTimer()\n if (ctx.abortSignal.aborted) return\n if (stalled) {\n ctx.nack(new E_ANTHROPIC_MESSAGES_STREAM_STALLED([idleMs]))\n return\n }\n const classified = translateAnthropicError(err, retryCfg.retriableStatuses, {\n resolveErrorStatus: merged.resolveErrorStatus,\n warn: (msg) =>\n helpers.log.warn({ kind: 'anthropic-resolve-error-status', message: msg }),\n })\n if (classified.kind === 'abort') return\n if (classified.kind === 'context-overflow') {\n ctx.nack(\n new E_ANTHROPIC_MESSAGES_CONTEXT_OVERFLOW([\n -1,\n merged.contextWindow ?? -1,\n merged.tokenEncoding ?? 'unknown',\n classified.message,\n ])\n )\n return\n }\n helpers.log.error({\n kind: 'stream-error',\n message: `Anthropic stream failed: ${isError(err) ? err.message : String(err)}`,\n payload: { detail: isError(err) ? err.message : String(err) },\n })\n ctx.nack(\n new E_ANTHROPIC_MESSAGES_STREAM_ERROR([isError(err) ? err.message : String(err)])\n )\n return\n }\n return\n }\n\n // ── Step 9: non-streaming path ─────────────────────────────────────────\n if (!anthropicMessage) return\n const parsed = anthropicMessage\n const responseId = uuidv6()\n\n const textParts: string[] = []\n const toolUseBlocks: AnthropicToolUseBlockParam[] = []\n let thinkingPayload: AnthropicThinkingReplayPayload | undefined\n let combinedThinking = ''\n let hasThinking = false\n\n if (parsed.stop_reason === 'model_context_window_exceeded') {\n ctx.nack(\n new E_ANTHROPIC_MESSAGES_CONTEXT_OVERFLOW([\n -1,\n merged.contextWindow ?? -1,\n merged.tokenEncoding ?? 'unknown',\n JSON.stringify({ stop_reason: parsed.stop_reason }),\n ])\n )\n return\n }\n logAnthropicStopReason(helpers, parsed.stop_reason, parsed.stop_details)\n\n for (const block of parsed.content) {\n if (block.type === 'text') {\n textParts.push(block.text)\n } else if (block.type === 'thinking') {\n hasThinking = true\n combinedThinking += block.thinking\n if (thinkingPayload === undefined) {\n thinkingPayload = {\n variant: 'thinking',\n thinking: block.thinking,\n signature: block.signature,\n prefixFingerprint: await fingerprintAnthropicMessagesPrefix({\n model: merged.model,\n system,\n tools: wireTools,\n messages: wireMessages,\n }),\n }\n }\n } else if (block.type === 'redacted_thinking') {\n hasThinking = true\n if (thinkingPayload === undefined) {\n thinkingPayload = {\n variant: 'redacted_thinking',\n data: block.data,\n prefixFingerprint: await fingerprintAnthropicMessagesPrefix({\n model: merged.model,\n system,\n tools: wireTools,\n messages: wireMessages,\n }),\n }\n }\n } else if (block.type === 'tool_use') {\n toolUseBlocks.push({\n type: 'tool_use',\n id: block.id,\n name: block.name,\n input: block.input,\n })\n }\n // Server-tool-result block types (web_search_tool_result, code_execution_tool_result, ...)\n // are out of scope for this client-tools-only adapter — no ADK-side representation.\n }\n\n const content = textParts.join('')\n if (content.length > 0) {\n const messageId = `${responseId}:message`\n helpers.reportMessage(messageId, content, { isComplete: true })\n await ctx.storeMessage(\n new Message({\n id: messageId,\n role: 'assistant',\n content,\n identity: selfIdentity,\n createdAt: nowIso(),\n updatedAt: nowIso(),\n })\n )\n }\n if (hasThinking) {\n const thoughtId = `${responseId}:thought`\n helpers.reportThought(thoughtId, combinedThinking, {\n isComplete: true,\n })\n await ctx.storeThought(\n new Thought({\n id: thoughtId,\n content: combinedThinking,\n identity: selfIdentity,\n payload: thinkingPayload,\n replayCompatibility: thinkingPayload ? 'anthropic-messages-thinking-v1' : undefined,\n createdAt: nowIso(),\n updatedAt: nowIso(),\n })\n )\n }\n\n helpers.reportGenerationStats(\n extractGenerationStats({\n model: parsed.model ?? merged.model,\n usage: parsed.usage,\n finishReason: parsed.stop_reason,\n raw: { ...parsed } as unknown as Record<string, unknown>,\n })\n )\n\n const nativeCalls: AssembledAnthropicToolCall[] = toolUseBlocks.map((b) => ({\n id: b.id,\n name: b.name,\n args: b.input === undefined ? '{}' : JSON.stringify(b.input),\n }))\n // Fallback recovery (opt-in): consulted only when no native tool_use blocks are present, so\n // a native call always wins over a parsed one.\n const calls = nativeCalls.length > 0 ? nativeCalls : parseFallbackToolCalls(content)\n\n if (merged.onRawGeneration) {\n try {\n merged.onRawGeneration({\n rawText: content,\n cleanedText: content,\n reasoning: hasThinking ? [combinedThinking] : [],\n toolCalls: calls.map((c) => ({\n name: c.name,\n arguments: c.args as never,\n })),\n streamed: false,\n streamId: dispatchStreamId,\n })\n } catch {\n /* observer errors are non-fatal */\n }\n }\n\n if (calls.length === 0) {\n if (merged.autoAck) ctx.ack()\n return\n }\n for (const call of calls) {\n if (ctx.abortSignal.aborted) return\n await executeAndPersistToolCall(call)\n }\n }\n }\n\n /**\n * Counts the input tokens a request would consume, without generating.\n *\n * Uses Anthropic's dedicated count-tokens surface (a distinct parameter shape from a create\n * request, and one that takes no `maxTokens`), and returns a named field plus the raw upstream\n * body rather than leaking the vendor type through this battery's public API.\n *\n * `input` accepts either a dispatch context — whose prompt is assembled with the same helpers the\n * executor uses — or a pre-built Anthropic-shaped request. Option precedence, revalidation,\n * timeout ownership, and error translation all match {@link AnthropicMessagesAdapter.executor}.\n */\n public async countTokens(\n input: AnthropicMessagesCountTokensRequestInput | AnthropicMessagesCountTokensInput,\n overrides?: Partial<AnthropicMessagesAdapterOptions>\n ): Promise<{ inputTokens: number; raw: unknown }> {\n return countAnthropicMessagesTokens(this.#baseline, input, overrides)\n }\n\n /**\n * Returns `true` when `value` is an {@link AnthropicMessagesAdapter} instance.\n */\n public static isAnthropicMessagesAdapter(value: unknown): value is AnthropicMessagesAdapter {\n return isInstanceOf(value, 'AnthropicMessagesAdapter', AnthropicMessagesAdapter)\n }\n}\n"],"mappings":"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"}
|
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
import { n as isInstanceOf, r as isObject, t as isError } from "../../../guards-BEpY7lBI.mjs";
|
|
2
|
-
import { r as Tokenizable } from "../../../tokenizable-
|
|
3
|
-
import {
|
|
4
|
-
import { n as Message, t as Thought } from "../../../thought-
|
|
5
|
-
import { n as Media, t as ToolCall } from "../../../tool_call-
|
|
6
|
-
import "../../../common-
|
|
2
|
+
import { r as Tokenizable } from "../../../tokenizable-VB4Av8GF.mjs";
|
|
3
|
+
import { f as ArtifactTool, h as canonicalStringify, t as SpooledArtifact } from "../../../spooled_artifact-Bw_7swIp.mjs";
|
|
4
|
+
import { n as Message, t as Thought } from "../../../thought-BE1KGEhV.mjs";
|
|
5
|
+
import { n as Media, t as ToolCall } from "../../../tool_call-Cfaj-6zK.mjs";
|
|
6
|
+
import "../../../common-BpdHIpQE.mjs";
|
|
7
7
|
import "../../../guards.mjs";
|
|
8
8
|
import { computeBackoff, linkAbortSignals, parseRetryAfter, sleepWithJitter } from "../../../lib/utils/retry.mjs";
|
|
9
9
|
import { O as resolveToolCallParser } from "../../../tool_parsers-DgZhgxV8.mjs";
|
|
10
10
|
import { InMemorySpoolStore } from "../../storage/in_memory.mjs";
|
|
11
|
-
import { C as looksLikeSpooledArtifact, E as normalizeToolName, _ as defaultRenderUntrustedContent, a as defaultRenderArtifactHandleBody, c as defaultRenderMemories, d as defaultRenderRetrievables, f as defaultRenderStandingInstructions, g as defaultRenderTrustedContent, h as defaultRenderThought, i as defaultFilterThoughts, l as defaultRenderRetrievableHandleBody, m as defaultRenderThirdPartyPublicRetrievables, o as defaultRenderChatCompletionsSystemPrompt, p as defaultRenderThirdPartyPrivateRetrievables, r as defaultDescriptionToChatCompletionsJsonSchema, s as defaultRenderFirstPartyRetrievables, u as defaultRenderRetrievableSafetyDirective, v as defaultToolsToChatCompletionsTools } from "../../../helpers-
|
|
11
|
+
import { C as looksLikeSpooledArtifact, E as normalizeToolName, _ as defaultRenderUntrustedContent, a as defaultRenderArtifactHandleBody, c as defaultRenderMemories, d as defaultRenderRetrievables, f as defaultRenderStandingInstructions, g as defaultRenderTrustedContent, h as defaultRenderThought, i as defaultFilterThoughts, l as defaultRenderRetrievableHandleBody, m as defaultRenderThirdPartyPublicRetrievables, o as defaultRenderChatCompletionsSystemPrompt, p as defaultRenderThirdPartyPrivateRetrievables, r as defaultDescriptionToChatCompletionsJsonSchema, s as defaultRenderFirstPartyRetrievables, u as defaultRenderRetrievableSafetyDirective, v as defaultToolsToChatCompletionsTools } from "../../../helpers-BH7HTtkD.mjs";
|
|
12
12
|
import { E_ANTHROPIC_MESSAGES_CONTEXT_OVERFLOW, E_ANTHROPIC_MESSAGES_HTTP_ERROR, E_ANTHROPIC_MESSAGES_INVALID_TOOL_CALL_ARGS, E_ANTHROPIC_MESSAGES_REQUEST_TIMEOUT, E_ANTHROPIC_MESSAGES_STREAM_ERROR, E_ANTHROPIC_MESSAGES_STREAM_STALLED, E_INVALID_ANTHROPIC_MESSAGES_OPTIONS } from "./exceptions.mjs";
|
|
13
13
|
import { validateOptions } from "./validation.mjs";
|
|
14
14
|
import { n as translateAnthropicError, r as APIError } from "../../../error_translation-Bkz-bl27.mjs";
|