@llumiverse/drivers 1.3.0 → 1.4.0-dev.20260629.090753Z
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/lib/{types/adobe → adobe}/firefly.d.ts +2 -1
- package/lib/adobe/firefly.d.ts.map +1 -0
- package/lib/adobe/firefly.js +120 -0
- package/lib/adobe/firefly.js.map +1 -0
- package/lib/{types/anthropic → anthropic}/index.d.ts +4 -2
- package/lib/anthropic/index.d.ts.map +1 -0
- package/lib/{esm/anthropic → anthropic}/index.js +19 -8
- package/lib/anthropic/index.js.map +1 -0
- package/lib/{types/azure → azure}/azure_foundry.d.ts +9 -7
- package/lib/azure/azure_foundry.d.ts.map +1 -0
- package/lib/{esm/azure → azure}/azure_foundry.js +138 -124
- package/lib/azure/azure_foundry.js.map +1 -0
- package/lib/{types/bedrock → bedrock}/converse.d.ts +2 -2
- package/lib/bedrock/converse.d.ts.map +1 -0
- package/lib/{esm/bedrock → bedrock}/converse.js +86 -79
- package/lib/bedrock/converse.js.map +1 -0
- package/lib/bedrock/embeddings.d.ts +4 -0
- package/lib/bedrock/embeddings.d.ts.map +1 -0
- package/lib/bedrock/embeddings.js +359 -0
- package/lib/bedrock/embeddings.js.map +1 -0
- package/lib/{types/bedrock → bedrock}/index.d.ts +33 -9
- package/lib/bedrock/index.d.ts.map +1 -0
- package/lib/{esm/bedrock → bedrock}/index.js +599 -324
- package/lib/bedrock/index.js.map +1 -0
- package/lib/{types/bedrock → bedrock}/nova-image-payload.d.ts +5 -5
- package/lib/bedrock/nova-image-payload.d.ts.map +1 -0
- package/lib/{esm/bedrock → bedrock}/nova-image-payload.js +31 -36
- package/lib/bedrock/nova-image-payload.js.map +1 -0
- package/lib/{types/bedrock → bedrock}/payloads.d.ts +1 -1
- package/lib/bedrock/payloads.d.ts.map +1 -0
- package/lib/{cjs/bedrock → bedrock}/payloads.js.map +1 -1
- package/lib/{types/bedrock → bedrock}/s3.d.ts +3 -2
- package/lib/bedrock/s3.d.ts.map +1 -0
- package/lib/{esm/bedrock → bedrock}/s3.js +27 -23
- package/lib/bedrock/s3.js.map +1 -0
- package/lib/{types/bedrock → bedrock}/twelvelabs.d.ts +8 -9
- package/lib/bedrock/twelvelabs.d.ts.map +1 -0
- package/lib/{esm/bedrock → bedrock}/twelvelabs.js +17 -21
- package/lib/bedrock/twelvelabs.js.map +1 -0
- package/lib/{types/groq → groq}/index.d.ts +6 -4
- package/lib/groq/index.d.ts.map +1 -0
- package/lib/{esm/groq → groq}/index.js +72 -39
- package/lib/groq/index.js.map +1 -0
- package/lib/{types/huggingface_ie.d.ts → huggingface_ie.d.ts} +4 -3
- package/lib/huggingface_ie.d.ts.map +1 -0
- package/lib/{esm/huggingface_ie.js → huggingface_ie.js} +32 -31
- package/lib/huggingface_ie.js.map +1 -0
- package/lib/index.d.ts +16 -0
- package/lib/index.d.ts.map +1 -0
- package/lib/index.js +16 -0
- package/lib/index.js.map +1 -0
- package/lib/{types/mistral → mistral}/index.d.ts +6 -5
- package/lib/mistral/index.d.ts.map +1 -0
- package/lib/{esm/mistral → mistral}/index.js +66 -38
- package/lib/mistral/index.js.map +1 -0
- package/lib/{types/mistral → mistral}/types.d.ts +1 -0
- package/lib/mistral/types.d.ts.map +1 -0
- package/lib/mistral/types.js.map +1 -0
- package/lib/{types/openai → openai}/azure_openai.d.ts +5 -4
- package/lib/openai/azure_openai.d.ts.map +1 -0
- package/lib/{esm/openai → openai}/azure_openai.js +17 -14
- package/lib/openai/azure_openai.js.map +1 -0
- package/lib/openai/drivers.d.ts +4 -0
- package/lib/openai/drivers.d.ts.map +1 -0
- package/lib/openai/drivers.js +9 -0
- package/lib/openai/drivers.js.map +1 -0
- package/lib/{types/openai → openai}/index.d.ts +16 -5
- package/lib/openai/index.d.ts.map +1 -0
- package/lib/{esm/openai → openai}/index.js +242 -141
- package/lib/openai/index.js.map +1 -0
- package/lib/{types/openai → openai}/openai.d.ts +3 -3
- package/lib/openai/openai.d.ts.map +1 -0
- package/lib/openai/openai.js +15 -0
- package/lib/openai/openai.js.map +1 -0
- package/lib/{types/openai → openai}/openai_compatible.d.ts +3 -3
- package/lib/openai/openai_compatible.d.ts.map +1 -0
- package/lib/{esm/openai → openai}/openai_compatible.js +14 -11
- package/lib/openai/openai_compatible.js.map +1 -0
- package/lib/{types/openai → openai}/openai_format.d.ts +3 -2
- package/lib/openai/openai_format.d.ts.map +1 -0
- package/lib/{esm/openai → openai}/openai_format.js +66 -24
- package/lib/openai/openai_format.js.map +1 -0
- package/lib/{types/replicate.d.ts → replicate.d.ts} +3 -2
- package/lib/replicate.d.ts.map +1 -0
- package/lib/{esm/replicate.js → replicate.js} +59 -49
- package/lib/replicate.js.map +1 -0
- package/lib/{types/shared → shared}/claude-messages.d.ts +25 -1
- package/lib/shared/claude-messages.d.ts.map +1 -0
- package/lib/{esm/shared → shared}/claude-messages.js +212 -59
- package/lib/shared/claude-messages.js.map +1 -0
- package/lib/{types/shared → shared}/claude-thinking.d.ts +1 -1
- package/lib/shared/claude-thinking.d.ts.map +1 -0
- package/lib/{esm/shared → shared}/claude-thinking.js +5 -7
- package/lib/shared/claude-thinking.js.map +1 -0
- package/lib/shared/debug-prompt.d.ts +5 -0
- package/lib/shared/debug-prompt.d.ts.map +1 -0
- package/lib/shared/debug-prompt.js +25 -0
- package/lib/shared/debug-prompt.js.map +1 -0
- package/lib/{types/test-driver → test-driver}/TestErrorCompletionStream.d.ts +1 -1
- package/lib/test-driver/TestErrorCompletionStream.d.ts.map +1 -0
- package/lib/test-driver/TestErrorCompletionStream.js +16 -0
- package/lib/test-driver/TestErrorCompletionStream.js.map +1 -0
- package/lib/{types/test-driver → test-driver}/TestValidationErrorCompletionStream.d.ts +1 -1
- package/lib/test-driver/TestValidationErrorCompletionStream.d.ts.map +1 -0
- package/lib/{esm/test-driver → test-driver}/TestValidationErrorCompletionStream.js +4 -4
- package/lib/test-driver/TestValidationErrorCompletionStream.js.map +1 -0
- package/lib/{types/test-driver → test-driver}/index.d.ts +3 -3
- package/lib/test-driver/index.d.ts.map +1 -0
- package/lib/{esm/test-driver → test-driver}/index.js +20 -20
- package/lib/test-driver/index.js.map +1 -0
- package/lib/{types/test-driver → test-driver}/utils.d.ts +1 -1
- package/lib/test-driver/utils.d.ts.map +1 -0
- package/lib/{esm/test-driver → test-driver}/utils.js +4 -4
- package/lib/test-driver/utils.js.map +1 -0
- package/lib/togetherai/index.d.ts +15 -0
- package/lib/togetherai/index.d.ts.map +1 -0
- package/lib/togetherai/index.js +54 -0
- package/lib/togetherai/index.js.map +1 -0
- package/lib/{types/togetherai → togetherai}/interfaces.d.ts +1 -1
- package/lib/togetherai/interfaces.d.ts.map +1 -0
- package/lib/{cjs/watsonx → togetherai}/interfaces.js.map +1 -1
- package/lib/vertexai/debug.d.ts +2 -0
- package/lib/vertexai/debug.d.ts.map +1 -0
- package/lib/{esm/vertexai → vertexai}/debug.js +1 -1
- package/lib/vertexai/debug.js.map +1 -0
- package/lib/vertexai/embeddings/embed-legacy-multimodal.d.ts +9 -0
- package/lib/vertexai/embeddings/embed-legacy-multimodal.d.ts.map +1 -0
- package/lib/vertexai/embeddings/embed-legacy-multimodal.js +141 -0
- package/lib/vertexai/embeddings/embed-legacy-multimodal.js.map +1 -0
- package/lib/vertexai/embeddings/embed.d.ts +13 -0
- package/lib/vertexai/embeddings/embed.d.ts.map +1 -0
- package/lib/vertexai/embeddings/embed.js +162 -0
- package/lib/vertexai/embeddings/embed.js.map +1 -0
- package/lib/vertexai/embeddings/source-utils.d.ts +9 -0
- package/lib/vertexai/embeddings/source-utils.d.ts.map +1 -0
- package/lib/vertexai/embeddings/source-utils.js +18 -0
- package/lib/vertexai/embeddings/source-utils.js.map +1 -0
- package/lib/{types/vertexai → vertexai}/index.d.ts +31 -19
- package/lib/vertexai/index.d.ts.map +1 -0
- package/lib/{esm/vertexai → vertexai}/index.js +221 -159
- package/lib/vertexai/index.js.map +1 -0
- package/lib/{types/vertexai → vertexai}/models/claude.d.ts +4 -4
- package/lib/vertexai/models/claude.d.ts.map +1 -0
- package/lib/{esm/vertexai → vertexai}/models/claude.js +17 -20
- package/lib/vertexai/models/claude.js.map +1 -0
- package/lib/{types/vertexai → vertexai}/models/gemini.d.ts +28 -4
- package/lib/vertexai/models/gemini.d.ts.map +1 -0
- package/lib/{esm/vertexai → vertexai}/models/gemini.js +238 -116
- package/lib/vertexai/models/gemini.js.map +1 -0
- package/lib/{types/vertexai → vertexai}/models/imagen.d.ts +12 -11
- package/lib/vertexai/models/imagen.d.ts.map +1 -0
- package/lib/{esm/vertexai → vertexai}/models/imagen.js +74 -47
- package/lib/vertexai/models/imagen.js.map +1 -0
- package/lib/{types/vertexai → vertexai}/models/llama.d.ts +4 -4
- package/lib/vertexai/models/llama.d.ts.map +1 -0
- package/lib/{esm/vertexai → vertexai}/models/llama.js +37 -33
- package/lib/vertexai/models/llama.js.map +1 -0
- package/lib/vertexai/models.d.ts +21 -0
- package/lib/vertexai/models.d.ts.map +1 -0
- package/lib/{esm/vertexai → vertexai}/models.js +12 -9
- package/lib/vertexai/models.js.map +1 -0
- package/lib/{types/watsonx → watsonx}/index.d.ts +4 -3
- package/lib/watsonx/index.d.ts.map +1 -0
- package/lib/{esm/watsonx → watsonx}/index.js +69 -41
- package/lib/watsonx/index.js.map +1 -0
- package/lib/watsonx/interfaces.d.ts.map +1 -0
- package/lib/{esm/watsonx → watsonx}/interfaces.js.map +1 -1
- package/lib/{types/xai → xai}/index.d.ts +4 -4
- package/lib/xai/index.d.ts.map +1 -0
- package/lib/{esm/xai → xai}/index.js +22 -18
- package/lib/xai/index.js.map +1 -0
- package/package.json +87 -36
- package/src/adobe/firefly.ts +60 -43
- package/src/anthropic/index.ts +37 -20
- package/src/azure/azure_foundry.ts +210 -165
- package/src/bedrock/converse.ts +124 -101
- package/src/bedrock/embeddings.test.ts +508 -0
- package/src/bedrock/embeddings.ts +517 -0
- package/src/bedrock/error-handling.test.ts +62 -14
- package/src/bedrock/index.ts +832 -466
- package/src/bedrock/nova-image-payload.ts +98 -91
- package/src/bedrock/payloads.ts +9 -9
- package/src/bedrock/s3.test.ts +39 -0
- package/src/bedrock/s3.ts +57 -38
- package/src/bedrock/streaming-tool-use.test.ts +86 -69
- package/src/bedrock/twelvelabs.ts +35 -32
- package/src/groq/index.ts +143 -60
- package/src/http-timeout-wiring.test.ts +263 -0
- package/src/huggingface_ie.ts +45 -61
- package/src/index.ts +15 -16
- package/src/mistral/index.ts +97 -48
- package/src/mistral/types.ts +13 -12
- package/src/openai/azure_openai.ts +35 -27
- package/src/openai/drivers.ts +9 -0
- package/src/openai/error-handling.test.ts +308 -113
- package/src/openai/index.ts +378 -248
- package/src/openai/openai.ts +6 -13
- package/src/openai/openai_compatible.ts +35 -25
- package/src/openai/openai_format.ts +90 -40
- package/src/replicate.ts +108 -86
- package/src/shared/claude-messages.test.ts +37 -0
- package/src/shared/claude-messages.ts +303 -97
- package/src/shared/claude-thinking.ts +6 -12
- package/src/shared/debug-prompt.ts +28 -0
- package/src/test-driver/TestErrorCompletionStream.ts +9 -10
- package/src/test-driver/TestValidationErrorCompletionStream.ts +9 -10
- package/src/test-driver/index.ts +43 -27
- package/src/test-driver/utils.ts +8 -8
- package/src/togetherai/index.test.ts +32 -0
- package/src/togetherai/index.ts +64 -128
- package/src/togetherai/interfaces.ts +5 -5
- package/src/vertexai/debug.ts +3 -3
- package/src/vertexai/embeddings/embed-legacy-multimodal.ts +211 -0
- package/src/vertexai/embeddings/embed.ts +206 -0
- package/src/vertexai/embeddings/embeddings.test.ts +497 -0
- package/src/vertexai/embeddings/source-utils.test.ts +54 -0
- package/src/vertexai/embeddings/source-utils.ts +29 -0
- package/src/vertexai/index.ts +331 -244
- package/src/vertexai/models/claude-error-handling.test.ts +83 -36
- package/src/vertexai/models/claude-streaming-spacing.test.ts +82 -75
- package/src/vertexai/models/claude.ts +55 -40
- package/src/vertexai/models/gemini-conversation-mutation.test.ts +65 -23
- package/src/vertexai/models/gemini-error-handling.test.ts +126 -10
- package/src/vertexai/models/gemini-orphaned-tool-result.test.ts +118 -0
- package/src/vertexai/models/gemini.ts +349 -172
- package/src/vertexai/models/imagen.ts +164 -100
- package/src/vertexai/models/llama.ts +70 -48
- package/src/vertexai/models.ts +36 -16
- package/src/watsonx/index.ts +101 -65
- package/src/watsonx/interfaces.ts +10 -15
- package/src/xai/index.ts +30 -30
- package/lib/cjs/adobe/firefly.js +0 -120
- package/lib/cjs/adobe/firefly.js.map +0 -1
- package/lib/cjs/anthropic/index.js +0 -64
- package/lib/cjs/anthropic/index.js.map +0 -1
- package/lib/cjs/azure/azure_foundry.js +0 -432
- package/lib/cjs/azure/azure_foundry.js.map +0 -1
- package/lib/cjs/bedrock/converse.js +0 -359
- package/lib/cjs/bedrock/converse.js.map +0 -1
- package/lib/cjs/bedrock/index.js +0 -1508
- package/lib/cjs/bedrock/index.js.map +0 -1
- package/lib/cjs/bedrock/nova-image-payload.js +0 -207
- package/lib/cjs/bedrock/nova-image-payload.js.map +0 -1
- package/lib/cjs/bedrock/payloads.js +0 -3
- package/lib/cjs/bedrock/s3.js +0 -107
- package/lib/cjs/bedrock/s3.js.map +0 -1
- package/lib/cjs/bedrock/twelvelabs.js +0 -87
- package/lib/cjs/bedrock/twelvelabs.js.map +0 -1
- package/lib/cjs/groq/index.js +0 -328
- package/lib/cjs/groq/index.js.map +0 -1
- package/lib/cjs/huggingface_ie.js +0 -201
- package/lib/cjs/huggingface_ie.js.map +0 -1
- package/lib/cjs/index.js +0 -32
- package/lib/cjs/index.js.map +0 -1
- package/lib/cjs/mistral/index.js +0 -176
- package/lib/cjs/mistral/index.js.map +0 -1
- package/lib/cjs/mistral/types.js +0 -83
- package/lib/cjs/mistral/types.js.map +0 -1
- package/lib/cjs/openai/azure_openai.js +0 -72
- package/lib/cjs/openai/azure_openai.js.map +0 -1
- package/lib/cjs/openai/index.js +0 -1135
- package/lib/cjs/openai/index.js.map +0 -1
- package/lib/cjs/openai/openai.js +0 -21
- package/lib/cjs/openai/openai.js.map +0 -1
- package/lib/cjs/openai/openai_compatible.js +0 -63
- package/lib/cjs/openai/openai_compatible.js.map +0 -1
- package/lib/cjs/openai/openai_format.js +0 -131
- package/lib/cjs/openai/openai_format.js.map +0 -1
- package/lib/cjs/package.json +0 -3
- package/lib/cjs/replicate.js +0 -275
- package/lib/cjs/replicate.js.map +0 -1
- package/lib/cjs/shared/claude-messages.js +0 -737
- package/lib/cjs/shared/claude-messages.js.map +0 -1
- package/lib/cjs/shared/claude-thinking.js +0 -60
- package/lib/cjs/shared/claude-thinking.js.map +0 -1
- package/lib/cjs/test-driver/TestErrorCompletionStream.js +0 -20
- package/lib/cjs/test-driver/TestErrorCompletionStream.js.map +0 -1
- package/lib/cjs/test-driver/TestValidationErrorCompletionStream.js +0 -24
- package/lib/cjs/test-driver/TestValidationErrorCompletionStream.js.map +0 -1
- package/lib/cjs/test-driver/index.js +0 -109
- package/lib/cjs/test-driver/index.js.map +0 -1
- package/lib/cjs/test-driver/utils.js +0 -30
- package/lib/cjs/test-driver/utils.js.map +0 -1
- package/lib/cjs/togetherai/index.js +0 -126
- package/lib/cjs/togetherai/index.js.map +0 -1
- package/lib/cjs/togetherai/interfaces.js +0 -3
- package/lib/cjs/togetherai/interfaces.js.map +0 -1
- package/lib/cjs/vertexai/debug.js +0 -12
- package/lib/cjs/vertexai/debug.js.map +0 -1
- package/lib/cjs/vertexai/embeddings/embeddings-image.js +0 -27
- package/lib/cjs/vertexai/embeddings/embeddings-image.js.map +0 -1
- package/lib/cjs/vertexai/embeddings/embeddings-text.js +0 -23
- package/lib/cjs/vertexai/embeddings/embeddings-text.js.map +0 -1
- package/lib/cjs/vertexai/index.js +0 -644
- package/lib/cjs/vertexai/index.js.map +0 -1
- package/lib/cjs/vertexai/models/claude.js +0 -72
- package/lib/cjs/vertexai/models/claude.js.map +0 -1
- package/lib/cjs/vertexai/models/gemini.js +0 -864
- package/lib/cjs/vertexai/models/gemini.js.map +0 -1
- package/lib/cjs/vertexai/models/imagen.js +0 -303
- package/lib/cjs/vertexai/models/imagen.js.map +0 -1
- package/lib/cjs/vertexai/models/llama.js +0 -183
- package/lib/cjs/vertexai/models/llama.js.map +0 -1
- package/lib/cjs/vertexai/models.js +0 -35
- package/lib/cjs/vertexai/models.js.map +0 -1
- package/lib/cjs/watsonx/index.js +0 -161
- package/lib/cjs/watsonx/index.js.map +0 -1
- package/lib/cjs/watsonx/interfaces.js +0 -3
- package/lib/cjs/xai/index.js +0 -65
- package/lib/cjs/xai/index.js.map +0 -1
- package/lib/esm/adobe/firefly.js +0 -116
- package/lib/esm/adobe/firefly.js.map +0 -1
- package/lib/esm/anthropic/index.js.map +0 -1
- package/lib/esm/azure/azure_foundry.js.map +0 -1
- package/lib/esm/bedrock/converse.js.map +0 -1
- package/lib/esm/bedrock/index.js.map +0 -1
- package/lib/esm/bedrock/nova-image-payload.js.map +0 -1
- package/lib/esm/bedrock/payloads.js.map +0 -1
- package/lib/esm/bedrock/s3.js.map +0 -1
- package/lib/esm/bedrock/twelvelabs.js.map +0 -1
- package/lib/esm/groq/index.js.map +0 -1
- package/lib/esm/huggingface_ie.js.map +0 -1
- package/lib/esm/index.js +0 -16
- package/lib/esm/index.js.map +0 -1
- package/lib/esm/mistral/index.js.map +0 -1
- package/lib/esm/mistral/types.js.map +0 -1
- package/lib/esm/openai/azure_openai.js.map +0 -1
- package/lib/esm/openai/index.js.map +0 -1
- package/lib/esm/openai/openai.js +0 -14
- package/lib/esm/openai/openai.js.map +0 -1
- package/lib/esm/openai/openai_compatible.js.map +0 -1
- package/lib/esm/openai/openai_format.js.map +0 -1
- package/lib/esm/replicate.js.map +0 -1
- package/lib/esm/shared/claude-messages.js.map +0 -1
- package/lib/esm/shared/claude-thinking.js.map +0 -1
- package/lib/esm/test-driver/TestErrorCompletionStream.js +0 -16
- package/lib/esm/test-driver/TestErrorCompletionStream.js.map +0 -1
- package/lib/esm/test-driver/TestValidationErrorCompletionStream.js.map +0 -1
- package/lib/esm/test-driver/index.js.map +0 -1
- package/lib/esm/test-driver/utils.js.map +0 -1
- package/lib/esm/togetherai/index.js +0 -122
- package/lib/esm/togetherai/index.js.map +0 -1
- package/lib/esm/togetherai/interfaces.js.map +0 -1
- package/lib/esm/vertexai/debug.js.map +0 -1
- package/lib/esm/vertexai/embeddings/embeddings-image.js +0 -24
- package/lib/esm/vertexai/embeddings/embeddings-image.js.map +0 -1
- package/lib/esm/vertexai/embeddings/embeddings-text.js +0 -20
- package/lib/esm/vertexai/embeddings/embeddings-text.js.map +0 -1
- package/lib/esm/vertexai/index.js.map +0 -1
- package/lib/esm/vertexai/models/claude.js.map +0 -1
- package/lib/esm/vertexai/models/gemini.js.map +0 -1
- package/lib/esm/vertexai/models/imagen.js.map +0 -1
- package/lib/esm/vertexai/models/llama.js.map +0 -1
- package/lib/esm/vertexai/models.js.map +0 -1
- package/lib/esm/watsonx/index.js.map +0 -1
- package/lib/esm/xai/index.js.map +0 -1
- package/lib/types/adobe/firefly.d.ts.map +0 -1
- package/lib/types/anthropic/index.d.ts.map +0 -1
- package/lib/types/azure/azure_foundry.d.ts.map +0 -1
- package/lib/types/bedrock/converse.d.ts.map +0 -1
- package/lib/types/bedrock/index.d.ts.map +0 -1
- package/lib/types/bedrock/nova-image-payload.d.ts.map +0 -1
- package/lib/types/bedrock/payloads.d.ts.map +0 -1
- package/lib/types/bedrock/s3.d.ts.map +0 -1
- package/lib/types/bedrock/twelvelabs.d.ts.map +0 -1
- package/lib/types/groq/index.d.ts.map +0 -1
- package/lib/types/huggingface_ie.d.ts.map +0 -1
- package/lib/types/index.d.ts +0 -16
- package/lib/types/index.d.ts.map +0 -1
- package/lib/types/mistral/index.d.ts.map +0 -1
- package/lib/types/mistral/types.d.ts.map +0 -1
- package/lib/types/openai/azure_openai.d.ts.map +0 -1
- package/lib/types/openai/index.d.ts.map +0 -1
- package/lib/types/openai/openai.d.ts.map +0 -1
- package/lib/types/openai/openai_compatible.d.ts.map +0 -1
- package/lib/types/openai/openai_format.d.ts.map +0 -1
- package/lib/types/replicate.d.ts.map +0 -1
- package/lib/types/shared/claude-messages.d.ts.map +0 -1
- package/lib/types/shared/claude-thinking.d.ts.map +0 -1
- package/lib/types/test-driver/TestErrorCompletionStream.d.ts.map +0 -1
- package/lib/types/test-driver/TestValidationErrorCompletionStream.d.ts.map +0 -1
- package/lib/types/test-driver/index.d.ts.map +0 -1
- package/lib/types/test-driver/utils.d.ts.map +0 -1
- package/lib/types/togetherai/index.d.ts +0 -23
- package/lib/types/togetherai/index.d.ts.map +0 -1
- package/lib/types/togetherai/interfaces.d.ts.map +0 -1
- package/lib/types/vertexai/debug.d.ts +0 -2
- package/lib/types/vertexai/debug.d.ts.map +0 -1
- package/lib/types/vertexai/embeddings/embeddings-image.d.ts +0 -11
- package/lib/types/vertexai/embeddings/embeddings-image.d.ts.map +0 -1
- package/lib/types/vertexai/embeddings/embeddings-text.d.ts +0 -10
- package/lib/types/vertexai/embeddings/embeddings-text.d.ts.map +0 -1
- package/lib/types/vertexai/index.d.ts.map +0 -1
- package/lib/types/vertexai/models/claude.d.ts.map +0 -1
- package/lib/types/vertexai/models/gemini.d.ts.map +0 -1
- package/lib/types/vertexai/models/imagen.d.ts.map +0 -1
- package/lib/types/vertexai/models/llama.d.ts.map +0 -1
- package/lib/types/vertexai/models.d.ts +0 -20
- package/lib/types/vertexai/models.d.ts.map +0 -1
- package/lib/types/watsonx/index.d.ts.map +0 -1
- package/lib/types/watsonx/interfaces.d.ts.map +0 -1
- package/lib/types/xai/index.d.ts.map +0 -1
- package/src/vertexai/embeddings/embeddings-image.ts +0 -52
- package/src/vertexai/embeddings/embeddings-text.ts +0 -54
- /package/lib/{esm/bedrock → bedrock}/payloads.js +0 -0
- /package/lib/{esm/mistral → mistral}/types.js +0 -0
- /package/lib/{esm/togetherai → togetherai}/interfaces.js +0 -0
- /package/lib/{types/watsonx → watsonx}/interfaces.d.ts +0 -0
- /package/lib/{esm/watsonx → watsonx}/interfaces.js +0 -0
|
@@ -13,9 +13,18 @@ import {
|
|
|
13
13
|
} from '@anthropic-ai/sdk/error';
|
|
14
14
|
import { LlumiverseError } from '@llumiverse/core';
|
|
15
15
|
import { beforeEach, describe, expect, it } from 'vitest';
|
|
16
|
-
import {
|
|
16
|
+
import { exposePrivate } from '../../../test/__helpers__/test-utils.js';
|
|
17
|
+
import type { VertexAIDriver } from '../index.js';
|
|
17
18
|
import { ClaudeModelDefinition } from './claude.js';
|
|
18
19
|
|
|
20
|
+
type ClaudeModelInternals = {
|
|
21
|
+
isClaudeErrorRetryable: (
|
|
22
|
+
error: unknown,
|
|
23
|
+
httpStatusCode: number | undefined,
|
|
24
|
+
errorType: string | undefined,
|
|
25
|
+
) => boolean | undefined;
|
|
26
|
+
};
|
|
27
|
+
|
|
19
28
|
describe('ClaudeModelDefinition Error Handling', () => {
|
|
20
29
|
let modelDef: ClaudeModelDefinition;
|
|
21
30
|
let driver: VertexAIDriver;
|
|
@@ -24,8 +33,8 @@ describe('ClaudeModelDefinition Error Handling', () => {
|
|
|
24
33
|
modelDef = new ClaudeModelDefinition('claude-haiku-4-5');
|
|
25
34
|
driver = {
|
|
26
35
|
provider: 'vertexai',
|
|
27
|
-
logger: { warn: () => {
|
|
28
|
-
} as
|
|
36
|
+
logger: { warn: () => {}, info: () => {}, error: () => {} },
|
|
37
|
+
} as unknown as VertexAIDriver;
|
|
29
38
|
});
|
|
30
39
|
|
|
31
40
|
describe('formatLlumiverseError', () => {
|
|
@@ -39,11 +48,11 @@ describe('ClaudeModelDefinition Error Handling', () => {
|
|
|
39
48
|
type: 'error',
|
|
40
49
|
error: {
|
|
41
50
|
type: 'invalid_request_error',
|
|
42
|
-
message: 'temperature: range: 0..1'
|
|
43
|
-
}
|
|
51
|
+
message: 'temperature: range: 0..1',
|
|
52
|
+
},
|
|
44
53
|
},
|
|
45
54
|
'400 {"type":"error","error":{"type":"invalid_request_error","message":"temperature: range: 0..1"},"request_id":"req_test_123"}',
|
|
46
|
-
headers
|
|
55
|
+
headers,
|
|
47
56
|
);
|
|
48
57
|
|
|
49
58
|
const error = modelDef.formatLlumiverseError(driver, anthropicError, {
|
|
@@ -67,7 +76,7 @@ describe('ClaudeModelDefinition Error Handling', () => {
|
|
|
67
76
|
429,
|
|
68
77
|
{ type: 'error', error: { type: 'rate_limit_error', message: 'Rate limit exceeded' } },
|
|
69
78
|
'Rate limit exceeded',
|
|
70
|
-
new Headers()
|
|
79
|
+
new Headers(),
|
|
71
80
|
);
|
|
72
81
|
|
|
73
82
|
const error = modelDef.formatLlumiverseError(driver, anthropicError, {
|
|
@@ -86,7 +95,7 @@ describe('ClaudeModelDefinition Error Handling', () => {
|
|
|
86
95
|
500,
|
|
87
96
|
{ type: 'error', error: { type: 'internal_error', message: 'Internal server error' } },
|
|
88
97
|
'Internal server error',
|
|
89
|
-
new Headers()
|
|
98
|
+
new Headers(),
|
|
90
99
|
);
|
|
91
100
|
|
|
92
101
|
const error = modelDef.formatLlumiverseError(driver, anthropicError, {
|
|
@@ -105,7 +114,7 @@ describe('ClaudeModelDefinition Error Handling', () => {
|
|
|
105
114
|
401,
|
|
106
115
|
{ type: 'error', error: { type: 'authentication_error', message: 'Invalid API key' } },
|
|
107
116
|
'Invalid API key',
|
|
108
|
-
new Headers()
|
|
117
|
+
new Headers(),
|
|
109
118
|
);
|
|
110
119
|
|
|
111
120
|
const error = modelDef.formatLlumiverseError(driver, anthropicError, {
|
|
@@ -124,7 +133,7 @@ describe('ClaudeModelDefinition Error Handling', () => {
|
|
|
124
133
|
403,
|
|
125
134
|
{ type: 'error', error: { type: 'permission_error', message: 'Insufficient permissions' } },
|
|
126
135
|
'Insufficient permissions',
|
|
127
|
-
new Headers()
|
|
136
|
+
new Headers(),
|
|
128
137
|
);
|
|
129
138
|
|
|
130
139
|
const error = modelDef.formatLlumiverseError(driver, anthropicError, {
|
|
@@ -143,7 +152,7 @@ describe('ClaudeModelDefinition Error Handling', () => {
|
|
|
143
152
|
404,
|
|
144
153
|
{ type: 'error', error: { type: 'not_found_error', message: 'Model not found' } },
|
|
145
154
|
'Model not found',
|
|
146
|
-
new Headers()
|
|
155
|
+
new Headers(),
|
|
147
156
|
);
|
|
148
157
|
|
|
149
158
|
const error = modelDef.formatLlumiverseError(driver, anthropicError, {
|
|
@@ -162,7 +171,7 @@ describe('ClaudeModelDefinition Error Handling', () => {
|
|
|
162
171
|
409,
|
|
163
172
|
{ type: 'error', error: { type: 'conflict_error', message: 'Resource conflict' } },
|
|
164
173
|
'Resource conflict',
|
|
165
|
-
new Headers()
|
|
174
|
+
new Headers(),
|
|
166
175
|
);
|
|
167
176
|
|
|
168
177
|
const error = modelDef.formatLlumiverseError(driver, anthropicError, {
|
|
@@ -181,7 +190,7 @@ describe('ClaudeModelDefinition Error Handling', () => {
|
|
|
181
190
|
422,
|
|
182
191
|
{ type: 'error', error: { type: 'validation_error', message: 'Validation failed' } },
|
|
183
192
|
'Validation failed',
|
|
184
|
-
new Headers()
|
|
193
|
+
new Headers(),
|
|
185
194
|
);
|
|
186
195
|
|
|
187
196
|
const error = modelDef.formatLlumiverseError(driver, anthropicError, {
|
|
@@ -230,11 +239,11 @@ describe('ClaudeModelDefinition Error Handling', () => {
|
|
|
230
239
|
type: 'error',
|
|
231
240
|
error: {
|
|
232
241
|
type: 'invalid_request_error',
|
|
233
|
-
message: 'Missing required field'
|
|
234
|
-
}
|
|
242
|
+
message: 'Missing required field',
|
|
243
|
+
},
|
|
235
244
|
},
|
|
236
245
|
'Missing required field',
|
|
237
|
-
new Headers()
|
|
246
|
+
new Headers(),
|
|
238
247
|
);
|
|
239
248
|
|
|
240
249
|
const error = modelDef.formatLlumiverseError(driver, anthropicError, {
|
|
@@ -255,7 +264,7 @@ describe('ClaudeModelDefinition Error Handling', () => {
|
|
|
255
264
|
400,
|
|
256
265
|
{ type: 'error', error: { type: 'invalid_request_error', message: 'Bad request' } },
|
|
257
266
|
'Bad request',
|
|
258
|
-
headers
|
|
267
|
+
headers,
|
|
259
268
|
);
|
|
260
269
|
|
|
261
270
|
const error = modelDef.formatLlumiverseError(driver, anthropicError, {
|
|
@@ -284,7 +293,7 @@ describe('ClaudeModelDefinition Error Handling', () => {
|
|
|
284
293
|
400,
|
|
285
294
|
{ type: 'error', error: { type: 'invalid_request_error', message: 'Test error' } },
|
|
286
295
|
'Test error',
|
|
287
|
-
new Headers()
|
|
296
|
+
new Headers(),
|
|
288
297
|
);
|
|
289
298
|
|
|
290
299
|
const error = modelDef.formatLlumiverseError(driver, anthropicError, {
|
|
@@ -307,7 +316,11 @@ describe('ClaudeModelDefinition Error Handling', () => {
|
|
|
307
316
|
];
|
|
308
317
|
|
|
309
318
|
for (const error of retryableErrors) {
|
|
310
|
-
const result = (modelDef
|
|
319
|
+
const result = exposePrivate<ClaudeModelInternals>(modelDef).isClaudeErrorRetryable(
|
|
320
|
+
error,
|
|
321
|
+
error.status,
|
|
322
|
+
undefined,
|
|
323
|
+
);
|
|
311
324
|
expect(result, `${error.constructor.name} should be retryable`).toBe(true);
|
|
312
325
|
}
|
|
313
326
|
});
|
|
@@ -322,54 +335,88 @@ describe('ClaudeModelDefinition Error Handling', () => {
|
|
|
322
335
|
];
|
|
323
336
|
|
|
324
337
|
for (const error of nonRetryableErrors) {
|
|
325
|
-
const result = (modelDef
|
|
338
|
+
const result = exposePrivate<ClaudeModelInternals>(modelDef).isClaudeErrorRetryable(
|
|
339
|
+
error,
|
|
340
|
+
error.status,
|
|
341
|
+
undefined,
|
|
342
|
+
);
|
|
326
343
|
expect(result, `${error.constructor.name} should not be retryable`).toBe(false);
|
|
327
344
|
}
|
|
328
345
|
});
|
|
329
346
|
|
|
330
347
|
it('should use HTTP status codes when available', () => {
|
|
331
348
|
const apiError = new APIError(429, {}, 'Too many requests', new Headers());
|
|
332
|
-
expect((modelDef
|
|
349
|
+
expect(exposePrivate<ClaudeModelInternals>(modelDef).isClaudeErrorRetryable(apiError, 429, undefined)).toBe(
|
|
350
|
+
true,
|
|
351
|
+
);
|
|
333
352
|
|
|
334
353
|
const apiError2 = new APIError(408, {}, 'Request timeout', new Headers());
|
|
335
|
-
expect(
|
|
354
|
+
expect(
|
|
355
|
+
exposePrivate<ClaudeModelInternals>(modelDef).isClaudeErrorRetryable(apiError2, 408, undefined),
|
|
356
|
+
).toBe(true);
|
|
336
357
|
|
|
337
358
|
const apiError3 = new APIError(529, {}, 'Overloaded', new Headers());
|
|
338
|
-
expect(
|
|
359
|
+
expect(
|
|
360
|
+
exposePrivate<ClaudeModelInternals>(modelDef).isClaudeErrorRetryable(apiError3, 529, undefined),
|
|
361
|
+
).toBe(true);
|
|
339
362
|
|
|
340
363
|
const apiError4 = new APIError(503, {}, 'Service unavailable', new Headers());
|
|
341
|
-
expect(
|
|
364
|
+
expect(
|
|
365
|
+
exposePrivate<ClaudeModelInternals>(modelDef).isClaudeErrorRetryable(apiError4, 503, undefined),
|
|
366
|
+
).toBe(true);
|
|
342
367
|
});
|
|
343
368
|
|
|
344
369
|
it('should classify 4xx as non-retryable', () => {
|
|
345
370
|
const apiError = new APIError(400, {}, 'Bad request', new Headers());
|
|
346
|
-
expect((modelDef
|
|
371
|
+
expect(exposePrivate<ClaudeModelInternals>(modelDef).isClaudeErrorRetryable(apiError, 400, undefined)).toBe(
|
|
372
|
+
false,
|
|
373
|
+
);
|
|
347
374
|
|
|
348
375
|
const apiError2 = new APIError(403, {}, 'Forbidden', new Headers());
|
|
349
|
-
expect(
|
|
376
|
+
expect(
|
|
377
|
+
exposePrivate<ClaudeModelInternals>(modelDef).isClaudeErrorRetryable(apiError2, 403, undefined),
|
|
378
|
+
).toBe(false);
|
|
350
379
|
});
|
|
351
380
|
|
|
352
381
|
it('should classify 5xx as retryable', () => {
|
|
353
382
|
const apiError = new APIError(500, {}, 'Internal error', new Headers());
|
|
354
|
-
expect((modelDef
|
|
383
|
+
expect(exposePrivate<ClaudeModelInternals>(modelDef).isClaudeErrorRetryable(apiError, 500, undefined)).toBe(
|
|
384
|
+
true,
|
|
385
|
+
);
|
|
355
386
|
|
|
356
387
|
const apiError2 = new APIError(502, {}, 'Bad gateway', new Headers());
|
|
357
|
-
expect(
|
|
388
|
+
expect(
|
|
389
|
+
exposePrivate<ClaudeModelInternals>(modelDef).isClaudeErrorRetryable(apiError2, 502, undefined),
|
|
390
|
+
).toBe(true);
|
|
358
391
|
});
|
|
359
392
|
|
|
360
393
|
it('should classify invalid_request_error as non-retryable', () => {
|
|
361
394
|
const apiError = new APIError(400, {}, 'Invalid request', new Headers());
|
|
362
|
-
expect(
|
|
395
|
+
expect(
|
|
396
|
+
exposePrivate<ClaudeModelInternals>(modelDef).isClaudeErrorRetryable(
|
|
397
|
+
apiError,
|
|
398
|
+
400,
|
|
399
|
+
'invalid_request_error',
|
|
400
|
+
),
|
|
401
|
+
).toBe(false);
|
|
363
402
|
});
|
|
364
403
|
|
|
365
404
|
it('should classify APIConnectionError (non-timeout) as retryable', () => {
|
|
366
405
|
const connectionError = new APIConnectionError({ message: 'Network failure' });
|
|
367
|
-
expect(
|
|
406
|
+
expect(
|
|
407
|
+
exposePrivate<ClaudeModelInternals>(modelDef).isClaudeErrorRetryable(
|
|
408
|
+
connectionError,
|
|
409
|
+
undefined,
|
|
410
|
+
undefined,
|
|
411
|
+
),
|
|
412
|
+
).toBe(true);
|
|
368
413
|
});
|
|
369
414
|
|
|
370
415
|
it('should return undefined for unknown errors', () => {
|
|
371
|
-
const apiError = new APIError(undefined, {}, 'Unknown error', undefined
|
|
372
|
-
expect(
|
|
416
|
+
const apiError = new APIError(undefined, {}, 'Unknown error', undefined);
|
|
417
|
+
expect(
|
|
418
|
+
exposePrivate<ClaudeModelInternals>(modelDef).isClaudeErrorRetryable(apiError, undefined, undefined),
|
|
419
|
+
).toBeUndefined();
|
|
373
420
|
});
|
|
374
421
|
});
|
|
375
422
|
|
|
@@ -384,11 +431,11 @@ describe('ClaudeModelDefinition Error Handling', () => {
|
|
|
384
431
|
type: 'error',
|
|
385
432
|
error: {
|
|
386
433
|
type: 'rate_limit_error',
|
|
387
|
-
message: 'Rate limit exceeded'
|
|
388
|
-
}
|
|
434
|
+
message: 'Rate limit exceeded',
|
|
435
|
+
},
|
|
389
436
|
},
|
|
390
437
|
'Rate limit exceeded',
|
|
391
|
-
headers
|
|
438
|
+
headers,
|
|
392
439
|
);
|
|
393
440
|
|
|
394
441
|
const error = modelDef.formatLlumiverseError(driver, anthropicError, {
|
|
@@ -414,7 +461,7 @@ describe('ClaudeModelDefinition Error Handling', () => {
|
|
|
414
461
|
400,
|
|
415
462
|
{ type: 'error', error: { type: 'invalid_request_error', message: 'Invalid parameter' } },
|
|
416
463
|
'Invalid parameter',
|
|
417
|
-
new Headers()
|
|
464
|
+
new Headers(),
|
|
418
465
|
);
|
|
419
466
|
|
|
420
467
|
const error = modelDef.formatLlumiverseError(driver, anthropicError, {
|
|
@@ -1,9 +1,10 @@
|
|
|
1
|
-
import { ExecutionOptions } from '@llumiverse/core';
|
|
1
|
+
import type { CompletionChunkObject, ExecutionOptions } from '@llumiverse/core';
|
|
2
2
|
import { describe, expect, it } from 'vitest';
|
|
3
|
-
import {
|
|
3
|
+
import type { ClaudePrompt } from '../../shared/claude-messages.js';
|
|
4
|
+
import type { VertexAIDriver } from '../index.js';
|
|
4
5
|
import { ClaudeModelDefinition } from './claude.js';
|
|
5
6
|
|
|
6
|
-
function createAsyncStream(events:
|
|
7
|
+
function createAsyncStream(events: unknown[]): AsyncIterable<unknown> {
|
|
7
8
|
return (async function* () {
|
|
8
9
|
for (const event of events) {
|
|
9
10
|
yield event;
|
|
@@ -11,8 +12,8 @@ function createAsyncStream(events: any[]): AsyncIterable<any> {
|
|
|
11
12
|
})();
|
|
12
13
|
}
|
|
13
14
|
|
|
14
|
-
async function collectChunks(stream: AsyncIterable<
|
|
15
|
-
const chunks:
|
|
15
|
+
async function collectChunks(stream: AsyncIterable<CompletionChunkObject>): Promise<CompletionChunkObject[]> {
|
|
16
|
+
const chunks: CompletionChunkObject[] = [];
|
|
16
17
|
for await (const chunk of stream) {
|
|
17
18
|
chunks.push(chunk);
|
|
18
19
|
}
|
|
@@ -23,37 +24,38 @@ describe('ClaudeModelDefinition streaming spacing', () => {
|
|
|
23
24
|
it('does not leak deferred spacing when tool use follows thinking', async () => {
|
|
24
25
|
const modelDef = new ClaudeModelDefinition('claude-sonnet-4-5');
|
|
25
26
|
const driver = {
|
|
26
|
-
logger: { warn: () => {
|
|
27
|
+
logger: { warn: () => {}, info: () => {}, error: () => {} },
|
|
27
28
|
getAnthropicClient: async () => ({
|
|
28
29
|
messages: {
|
|
29
|
-
stream: async () =>
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
30
|
+
stream: async () =>
|
|
31
|
+
createAsyncStream([
|
|
32
|
+
{
|
|
33
|
+
type: 'content_block_delta',
|
|
34
|
+
delta: { type: 'thinking_delta', thinking: 'Thinking...' },
|
|
35
|
+
},
|
|
36
|
+
{
|
|
37
|
+
type: 'content_block_delta',
|
|
38
|
+
delta: { type: 'signature_delta' },
|
|
39
|
+
},
|
|
40
|
+
{
|
|
41
|
+
type: 'content_block_start',
|
|
42
|
+
content_block: { type: 'tool_use', id: 'tool-1', name: 'get_weather' },
|
|
43
|
+
},
|
|
44
|
+
{
|
|
45
|
+
type: 'content_block_delta',
|
|
46
|
+
delta: { type: 'input_json_delta', partial_json: '{"city":"Paris"}' },
|
|
47
|
+
},
|
|
48
|
+
{
|
|
49
|
+
type: 'content_block_stop',
|
|
50
|
+
},
|
|
51
|
+
]),
|
|
50
52
|
},
|
|
51
53
|
}),
|
|
52
54
|
} as unknown as VertexAIDriver;
|
|
53
55
|
|
|
54
56
|
const prompt = {
|
|
55
57
|
messages: [{ role: 'user', content: [{ type: 'text', text: 'Weather?' }] }],
|
|
56
|
-
} as
|
|
58
|
+
} as unknown as ClaudePrompt;
|
|
57
59
|
|
|
58
60
|
const options = {
|
|
59
61
|
model: 'publishers/anthropic/models/claude-sonnet-4-5',
|
|
@@ -66,8 +68,11 @@ describe('ClaudeModelDefinition streaming spacing', () => {
|
|
|
66
68
|
const stream = await modelDef.requestTextCompletionStream(driver, prompt, options);
|
|
67
69
|
const chunks = await collectChunks(stream);
|
|
68
70
|
|
|
69
|
-
const textOutput = chunks
|
|
70
|
-
|
|
71
|
+
const textOutput = chunks
|
|
72
|
+
.flatMap((chunk) => chunk.result ?? [])
|
|
73
|
+
.map((part) => part.value)
|
|
74
|
+
.join('');
|
|
75
|
+
const toolChunks = chunks.flatMap((chunk) => chunk.tool_use ?? []);
|
|
71
76
|
|
|
72
77
|
expect(textOutput).toBe('Thinking...');
|
|
73
78
|
expect(toolChunks).toHaveLength(2);
|
|
@@ -78,30 +83,31 @@ describe('ClaudeModelDefinition streaming spacing', () => {
|
|
|
78
83
|
it('flushes deferred spacing into the first text delta after thinking', async () => {
|
|
79
84
|
const modelDef = new ClaudeModelDefinition('claude-sonnet-4-5');
|
|
80
85
|
const driver = {
|
|
81
|
-
logger: { warn: () => {
|
|
86
|
+
logger: { warn: () => {}, info: () => {}, error: () => {} },
|
|
82
87
|
getAnthropicClient: async () => ({
|
|
83
88
|
messages: {
|
|
84
|
-
stream: async () =>
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
89
|
+
stream: async () =>
|
|
90
|
+
createAsyncStream([
|
|
91
|
+
{
|
|
92
|
+
type: 'content_block_delta',
|
|
93
|
+
delta: { type: 'thinking_delta', thinking: 'Thinking...' },
|
|
94
|
+
},
|
|
95
|
+
{
|
|
96
|
+
type: 'content_block_delta',
|
|
97
|
+
delta: { type: 'signature_delta' },
|
|
98
|
+
},
|
|
99
|
+
{
|
|
100
|
+
type: 'content_block_delta',
|
|
101
|
+
delta: { type: 'text_delta', text: 'Answer' },
|
|
102
|
+
},
|
|
103
|
+
]),
|
|
98
104
|
},
|
|
99
105
|
}),
|
|
100
106
|
} as unknown as VertexAIDriver;
|
|
101
107
|
|
|
102
108
|
const prompt = {
|
|
103
109
|
messages: [{ role: 'user', content: [{ type: 'text', text: 'Question?' }] }],
|
|
104
|
-
} as
|
|
110
|
+
} as unknown as ClaudePrompt;
|
|
105
111
|
|
|
106
112
|
const options = {
|
|
107
113
|
model: 'publishers/anthropic/models/claude-sonnet-4-5',
|
|
@@ -114,48 +120,49 @@ describe('ClaudeModelDefinition streaming spacing', () => {
|
|
|
114
120
|
const stream = await modelDef.requestTextCompletionStream(driver, prompt, options);
|
|
115
121
|
const chunks = await collectChunks(stream);
|
|
116
122
|
|
|
117
|
-
const textParts = chunks.flatMap(chunk => chunk.result ?? []).map(part => part.value);
|
|
123
|
+
const textParts = chunks.flatMap((chunk) => chunk.result ?? []).map((part) => part.value);
|
|
118
124
|
expect(textParts).toEqual(['Thinking...', '\n\nAnswer']);
|
|
119
125
|
});
|
|
120
126
|
|
|
121
127
|
it('does not reintroduce deferred spacing when text arrives after a tool call', async () => {
|
|
122
128
|
const modelDef = new ClaudeModelDefinition('claude-sonnet-4-5');
|
|
123
129
|
const driver = {
|
|
124
|
-
logger: { warn: () => {
|
|
130
|
+
logger: { warn: () => {}, info: () => {}, error: () => {} },
|
|
125
131
|
getAnthropicClient: async () => ({
|
|
126
132
|
messages: {
|
|
127
|
-
stream: async () =>
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
133
|
+
stream: async () =>
|
|
134
|
+
createAsyncStream([
|
|
135
|
+
{
|
|
136
|
+
type: 'content_block_delta',
|
|
137
|
+
delta: { type: 'thinking_delta', thinking: 'Thinking...' },
|
|
138
|
+
},
|
|
139
|
+
{
|
|
140
|
+
type: 'content_block_delta',
|
|
141
|
+
delta: { type: 'signature_delta' },
|
|
142
|
+
},
|
|
143
|
+
{
|
|
144
|
+
type: 'content_block_start',
|
|
145
|
+
content_block: { type: 'tool_use', id: 'tool-1', name: 'get_weather' },
|
|
146
|
+
},
|
|
147
|
+
{
|
|
148
|
+
type: 'content_block_delta',
|
|
149
|
+
delta: { type: 'input_json_delta', partial_json: '{"city":"Paris"}' },
|
|
150
|
+
},
|
|
151
|
+
{
|
|
152
|
+
type: 'content_block_stop',
|
|
153
|
+
},
|
|
154
|
+
{
|
|
155
|
+
type: 'content_block_delta',
|
|
156
|
+
delta: { type: 'text_delta', text: 'Answer after tool' },
|
|
157
|
+
},
|
|
158
|
+
]),
|
|
152
159
|
},
|
|
153
160
|
}),
|
|
154
161
|
} as unknown as VertexAIDriver;
|
|
155
162
|
|
|
156
163
|
const prompt = {
|
|
157
164
|
messages: [{ role: 'user', content: [{ type: 'text', text: 'Weather?' }] }],
|
|
158
|
-
} as
|
|
165
|
+
} as unknown as ClaudePrompt;
|
|
159
166
|
|
|
160
167
|
const options = {
|
|
161
168
|
model: 'publishers/anthropic/models/claude-sonnet-4-5',
|
|
@@ -168,7 +175,7 @@ describe('ClaudeModelDefinition streaming spacing', () => {
|
|
|
168
175
|
const stream = await modelDef.requestTextCompletionStream(driver, prompt, options);
|
|
169
176
|
const chunks = await collectChunks(stream);
|
|
170
177
|
|
|
171
|
-
const textParts = chunks.flatMap(chunk => chunk.result ?? []).map(part => part.value);
|
|
178
|
+
const textParts = chunks.flatMap((chunk) => chunk.result ?? []).map((part) => part.value);
|
|
172
179
|
expect(textParts).toEqual(['Thinking...', 'Answer after tool']);
|
|
173
180
|
});
|
|
174
181
|
});
|