@llumiverse/drivers 1.3.0 → 1.4.0
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
|
@@ -0,0 +1,508 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Bedrock embedding sub-driver tests.
|
|
3
|
+
*
|
|
4
|
+
* Default (USE_REAL_API = false): all calls are mocked — no credentials required.
|
|
5
|
+
* Live mode (USE_REAL_API = true): a real BedrockDriver is used for the live
|
|
6
|
+
* describe block. Requires standard AWS credential resolution in the environment
|
|
7
|
+
* (e.g. AWS_ACCESS_KEY_ID + AWS_SECRET_ACCESS_KEY, an assumed role, or an
|
|
8
|
+
* instance / ECS task profile). The models must be enabled in your Bedrock console.
|
|
9
|
+
*/
|
|
10
|
+
import { Base64DataSource, URLDataSource } from '@llumiverse/core';
|
|
11
|
+
import { beforeEach, describe, expect, it, vi } from 'vitest';
|
|
12
|
+
import { generateBedrockEmbeddings } from './embeddings.js';
|
|
13
|
+
import { BedrockDriver } from './index.js';
|
|
14
|
+
|
|
15
|
+
// ── Live-mode toggle ──────────────────────────────────────────────────────────
|
|
16
|
+
/** Set to true to run tests against the real Bedrock API instead of the mock. */
|
|
17
|
+
const USE_REAL_API = false;
|
|
18
|
+
/** AWS region used for live tests. Override with AWS_REGION env var if desired. */
|
|
19
|
+
const LIVE_REGION = process.env.AWS_REGION ?? 'us-east-1';
|
|
20
|
+
|
|
21
|
+
/**
|
|
22
|
+
* Minimal 8×8 white PNG (base64) used as inline image fixture in live tests.
|
|
23
|
+
* Small enough to be well inside Bedrock's inline-bytes limits.
|
|
24
|
+
*/
|
|
25
|
+
const TINY_PNG_B64 =
|
|
26
|
+
'iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAYAAADED76LAAAADklEQVQI12P4' + 'z8BQDwADhQGAWjR9awAAAABJRU5ErkJggg==';
|
|
27
|
+
|
|
28
|
+
// Minimal fake BedrockRuntime executor
|
|
29
|
+
function makeExecutor(responseBody: unknown) {
|
|
30
|
+
return {
|
|
31
|
+
invokeModel: vi.fn().mockResolvedValue({
|
|
32
|
+
body: Buffer.from(JSON.stringify(responseBody)),
|
|
33
|
+
}),
|
|
34
|
+
};
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
function makeDriver(responseBody: unknown) {
|
|
38
|
+
const driver = new BedrockDriver({ region: 'us-east-1' });
|
|
39
|
+
const executor = makeExecutor(responseBody);
|
|
40
|
+
vi.spyOn(driver, 'getExecutor').mockReturnValue(executor as never);
|
|
41
|
+
return { driver, executor };
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
const FAKE_VECTOR = [0.1, 0.2, 0.3];
|
|
45
|
+
|
|
46
|
+
// =================== Routing ===================
|
|
47
|
+
|
|
48
|
+
describe('generateBedrockEmbeddings — routing', () => {
|
|
49
|
+
it('routes to Nova for default (no model)', async () => {
|
|
50
|
+
const { driver, executor } = makeDriver({ embeddings: [{ embeddingType: 'TEXT', embedding: FAKE_VECTOR }] });
|
|
51
|
+
await generateBedrockEmbeddings(driver, { inputs: [{ type: 'text', text: 'hi' }] });
|
|
52
|
+
const body = JSON.parse(executor.invokeModel.mock.calls[0][0].body);
|
|
53
|
+
expect(executor.invokeModel.mock.calls[0][0].modelId).toBe('amazon.nova-2-multimodal-embeddings-v1:0');
|
|
54
|
+
expect(body.taskType).toBe('SINGLE_EMBEDDING');
|
|
55
|
+
});
|
|
56
|
+
|
|
57
|
+
it('routes to Titan for titan-embed-text model', async () => {
|
|
58
|
+
const { driver, executor } = makeDriver({ embedding: FAKE_VECTOR });
|
|
59
|
+
await generateBedrockEmbeddings(driver, {
|
|
60
|
+
inputs: [{ type: 'text', text: 'hi' }],
|
|
61
|
+
model: 'amazon.titan-embed-text-v2:0',
|
|
62
|
+
});
|
|
63
|
+
expect(executor.invokeModel.mock.calls[0][0].modelId).toBe('amazon.titan-embed-text-v2:0');
|
|
64
|
+
const body = JSON.parse(executor.invokeModel.mock.calls[0][0].body);
|
|
65
|
+
expect(body.inputText).toBe('hi');
|
|
66
|
+
});
|
|
67
|
+
|
|
68
|
+
it('routes to Cohere for cohere.embed model', async () => {
|
|
69
|
+
const { driver, executor } = makeDriver({ embeddings: [FAKE_VECTOR] });
|
|
70
|
+
await generateBedrockEmbeddings(driver, {
|
|
71
|
+
inputs: [{ type: 'text', text: 'hi' }],
|
|
72
|
+
model: 'cohere.embed-english-v3',
|
|
73
|
+
});
|
|
74
|
+
expect(executor.invokeModel.mock.calls[0][0].modelId).toBe('cohere.embed-english-v3');
|
|
75
|
+
const body = JSON.parse(executor.invokeModel.mock.calls[0][0].body);
|
|
76
|
+
expect(body.texts).toEqual(['hi']);
|
|
77
|
+
});
|
|
78
|
+
});
|
|
79
|
+
|
|
80
|
+
// =================== Nova ===================
|
|
81
|
+
|
|
82
|
+
describe('generateBedrockEmbeddings — Nova', () => {
|
|
83
|
+
it('builds correct text request and maps result', async () => {
|
|
84
|
+
const { driver, executor } = makeDriver({ embeddings: [{ embeddingType: 'TEXT', embedding: FAKE_VECTOR }] });
|
|
85
|
+
const result = await generateBedrockEmbeddings(driver, {
|
|
86
|
+
inputs: [{ type: 'text', text: 'hello' }],
|
|
87
|
+
});
|
|
88
|
+
|
|
89
|
+
const body = JSON.parse(executor.invokeModel.mock.calls[0][0].body);
|
|
90
|
+
expect(body.taskType).toBe('SINGLE_EMBEDDING');
|
|
91
|
+
expect(body.singleEmbeddingParams.text.value).toBe('hello');
|
|
92
|
+
expect(body.singleEmbeddingParams.text.truncationMode).toBe('END');
|
|
93
|
+
expect(body.singleEmbeddingParams.embeddingPurpose).toBe('GENERIC_INDEX');
|
|
94
|
+
|
|
95
|
+
expect(result.results).toHaveLength(1);
|
|
96
|
+
expect(result.results[0].outputs[0].values).toEqual(FAKE_VECTOR);
|
|
97
|
+
expect(result.results[0].outputs[0].modality).toBe('text');
|
|
98
|
+
});
|
|
99
|
+
|
|
100
|
+
it('sets embeddingPurpose GENERIC_RETRIEVAL for task_type query', async () => {
|
|
101
|
+
const { driver, executor } = makeDriver({ embeddings: [{ embeddingType: 'TEXT', embedding: FAKE_VECTOR }] });
|
|
102
|
+
await generateBedrockEmbeddings(driver, {
|
|
103
|
+
inputs: [{ type: 'text', text: 'find me' }],
|
|
104
|
+
task_type: 'query',
|
|
105
|
+
});
|
|
106
|
+
const body = JSON.parse(executor.invokeModel.mock.calls[0][0].body);
|
|
107
|
+
expect(body.singleEmbeddingParams.embeddingPurpose).toBe('GENERIC_RETRIEVAL');
|
|
108
|
+
});
|
|
109
|
+
|
|
110
|
+
it('builds correct image request (base64 bytes)', async () => {
|
|
111
|
+
const { driver, executor } = makeDriver({ embeddings: [{ embeddingType: 'IMAGE', embedding: FAKE_VECTOR }] });
|
|
112
|
+
const b64 = Buffer.from('img-bytes').toString('base64');
|
|
113
|
+
const ds = new Base64DataSource('img.jpg', 'image/jpeg', b64);
|
|
114
|
+
|
|
115
|
+
await generateBedrockEmbeddings(driver, {
|
|
116
|
+
inputs: [{ type: 'image', source: ds }],
|
|
117
|
+
});
|
|
118
|
+
|
|
119
|
+
const body = JSON.parse(executor.invokeModel.mock.calls[0][0].body);
|
|
120
|
+
expect(body.taskType).toBe('SINGLE_EMBEDDING');
|
|
121
|
+
expect(body.singleEmbeddingParams.image.source.bytes).toBe(b64);
|
|
122
|
+
expect(body.singleEmbeddingParams.image.format).toBe('jpeg');
|
|
123
|
+
});
|
|
124
|
+
|
|
125
|
+
it('passes embeddingDimension when dimensions is set', async () => {
|
|
126
|
+
const { driver, executor } = makeDriver({ embeddings: [{ embeddingType: 'TEXT', embedding: FAKE_VECTOR }] });
|
|
127
|
+
await generateBedrockEmbeddings(driver, {
|
|
128
|
+
inputs: [{ type: 'text', text: 'x' }],
|
|
129
|
+
dimensions: 256,
|
|
130
|
+
});
|
|
131
|
+
const body = JSON.parse(executor.invokeModel.mock.calls[0][0].body);
|
|
132
|
+
expect(body.singleEmbeddingParams.embeddingDimension).toBe(256);
|
|
133
|
+
});
|
|
134
|
+
|
|
135
|
+
it('throws when response has no embeddings array', async () => {
|
|
136
|
+
const { driver } = makeDriver({ someOtherField: [] });
|
|
137
|
+
await expect(generateBedrockEmbeddings(driver, { inputs: [{ type: 'text', text: 'x' }] })).rejects.toThrow(
|
|
138
|
+
"Nova embeddings response missing 'embeddings[0].embedding'",
|
|
139
|
+
);
|
|
140
|
+
});
|
|
141
|
+
});
|
|
142
|
+
|
|
143
|
+
// =================== Nova S3 URL passthrough ===================
|
|
144
|
+
|
|
145
|
+
describe('generateBedrockEmbeddings — Nova S3 URL passthrough', () => {
|
|
146
|
+
it('passes s3Location for s3:// URLs (video)', async () => {
|
|
147
|
+
const { driver, executor } = makeDriver({ embeddings: [{ embeddingType: 'VIDEO', embedding: FAKE_VECTOR }] });
|
|
148
|
+
const ds = new URLDataSource('video.mp4', 'video/mp4', 's3://my-bucket/video.mp4');
|
|
149
|
+
|
|
150
|
+
await generateBedrockEmbeddings(driver, {
|
|
151
|
+
inputs: [{ type: 'video', source: ds }],
|
|
152
|
+
});
|
|
153
|
+
|
|
154
|
+
const body = JSON.parse(executor.invokeModel.mock.calls[0][0].body);
|
|
155
|
+
expect(body.taskType).toBe('SINGLE_EMBEDDING');
|
|
156
|
+
expect(body.singleEmbeddingParams.video.source.s3Location.uri).toBe('s3://my-bucket/video.mp4');
|
|
157
|
+
expect(body.singleEmbeddingParams.video.source.bytes).toBeUndefined();
|
|
158
|
+
expect(body.singleEmbeddingParams.video.embeddingMode).toBe('AUDIO_VIDEO_COMBINED');
|
|
159
|
+
});
|
|
160
|
+
|
|
161
|
+
it('passes s3Location for amazonaws.com URLs (audio)', async () => {
|
|
162
|
+
const { driver, executor } = makeDriver({ embeddings: [{ embeddingType: 'AUDIO', embedding: FAKE_VECTOR }] });
|
|
163
|
+
const s3HttpsUrl = 'https://s3.us-east-1.amazonaws.com/my-bucket/audio.mp3';
|
|
164
|
+
const ds = new URLDataSource('audio.mp3', 'audio/mpeg', s3HttpsUrl);
|
|
165
|
+
|
|
166
|
+
await generateBedrockEmbeddings(driver, {
|
|
167
|
+
inputs: [{ type: 'audio', source: ds }],
|
|
168
|
+
});
|
|
169
|
+
|
|
170
|
+
const body = JSON.parse(executor.invokeModel.mock.calls[0][0].body);
|
|
171
|
+
expect(body.taskType).toBe('SINGLE_EMBEDDING');
|
|
172
|
+
expect(body.singleEmbeddingParams.audio.source.s3Location).toBeDefined();
|
|
173
|
+
expect(body.singleEmbeddingParams.audio.source.bytes).toBeUndefined();
|
|
174
|
+
});
|
|
175
|
+
|
|
176
|
+
it('converts path-style HTTPS S3 URL to correct s3:// URI (Nova audio)', async () => {
|
|
177
|
+
// Regression: path-style https://s3.region.amazonaws.com/bucket/key was previously
|
|
178
|
+
// mis-converted to s3://s3/bucket/key instead of s3://bucket/key.
|
|
179
|
+
const { driver, executor } = makeDriver({ embeddings: [{ embeddingType: 'AUDIO', embedding: FAKE_VECTOR }] });
|
|
180
|
+
const ds = new URLDataSource(
|
|
181
|
+
'audio.mp3',
|
|
182
|
+
'audio/mpeg',
|
|
183
|
+
'https://s3.us-east-1.amazonaws.com/my-bucket/audio.mp3',
|
|
184
|
+
);
|
|
185
|
+
await generateBedrockEmbeddings(driver, { inputs: [{ type: 'audio', source: ds }] });
|
|
186
|
+
const body = JSON.parse(executor.invokeModel.mock.calls[0][0].body);
|
|
187
|
+
expect(body.singleEmbeddingParams.audio.source.s3Location.uri).toBe('s3://my-bucket/audio.mp3');
|
|
188
|
+
});
|
|
189
|
+
|
|
190
|
+
it('converts virtual-hosted HTTPS S3 URL to correct s3:// URI (Nova video)', async () => {
|
|
191
|
+
const { driver, executor } = makeDriver({ embeddings: [{ embeddingType: 'VIDEO', embedding: FAKE_VECTOR }] });
|
|
192
|
+
const ds = new URLDataSource(
|
|
193
|
+
'vid.mp4',
|
|
194
|
+
'video/mp4',
|
|
195
|
+
'https://my-bucket.s3.us-east-1.amazonaws.com/folder/vid.mp4',
|
|
196
|
+
);
|
|
197
|
+
await generateBedrockEmbeddings(driver, { inputs: [{ type: 'video', source: ds }] });
|
|
198
|
+
const body = JSON.parse(executor.invokeModel.mock.calls[0][0].body);
|
|
199
|
+
expect(body.singleEmbeddingParams.video.source.s3Location.uri).toBe('s3://my-bucket/folder/vid.mp4');
|
|
200
|
+
});
|
|
201
|
+
});
|
|
202
|
+
|
|
203
|
+
// =================== Titan ===================
|
|
204
|
+
|
|
205
|
+
describe('generateBedrockEmbeddings — Titan', () => {
|
|
206
|
+
beforeEach(() => {
|
|
207
|
+
vi.restoreAllMocks();
|
|
208
|
+
});
|
|
209
|
+
|
|
210
|
+
it('sends text to titan text model', async () => {
|
|
211
|
+
const { driver, executor } = makeDriver({ embedding: FAKE_VECTOR, inputTextTokenCount: 1 });
|
|
212
|
+
const result = await generateBedrockEmbeddings(driver, {
|
|
213
|
+
inputs: [{ type: 'text', text: 'test' }],
|
|
214
|
+
model: 'amazon.titan-embed-text-v2:0',
|
|
215
|
+
});
|
|
216
|
+
|
|
217
|
+
const body = JSON.parse(executor.invokeModel.mock.calls[0][0].body);
|
|
218
|
+
expect(body.inputText).toBe('test');
|
|
219
|
+
expect(result.results[0].outputs[0].values).toEqual(FAKE_VECTOR);
|
|
220
|
+
});
|
|
221
|
+
|
|
222
|
+
it('sends image base64 to titan image model', async () => {
|
|
223
|
+
const { driver, executor } = makeDriver({ embedding: FAKE_VECTOR });
|
|
224
|
+
const b64 = Buffer.from('img').toString('base64');
|
|
225
|
+
const ds = new Base64DataSource('img.jpg', 'image/jpeg', b64);
|
|
226
|
+
|
|
227
|
+
await generateBedrockEmbeddings(driver, {
|
|
228
|
+
inputs: [{ type: 'image', source: ds }],
|
|
229
|
+
model: 'amazon.titan-embed-image-v1',
|
|
230
|
+
});
|
|
231
|
+
|
|
232
|
+
const body = JSON.parse(executor.invokeModel.mock.calls[0][0].body);
|
|
233
|
+
expect(body.inputImage).toBe(b64);
|
|
234
|
+
expect(body.inputText).toBeUndefined();
|
|
235
|
+
});
|
|
236
|
+
|
|
237
|
+
it('throws for video/audio input on titan', async () => {
|
|
238
|
+
const { driver } = makeDriver({});
|
|
239
|
+
const ds = new URLDataSource('v.mp4', 'video/mp4', 's3://b/v.mp4');
|
|
240
|
+
await expect(
|
|
241
|
+
generateBedrockEmbeddings(driver, {
|
|
242
|
+
inputs: [{ type: 'video', source: ds }],
|
|
243
|
+
model: 'amazon.titan-embed-text-v2:0',
|
|
244
|
+
}),
|
|
245
|
+
).rejects.toThrow("do not support 'video' input");
|
|
246
|
+
});
|
|
247
|
+
|
|
248
|
+
it('throws when titan text embedding response has no embedding field', async () => {
|
|
249
|
+
// Regression: a malformed response (missing 'embedding') should throw, not push undefined.
|
|
250
|
+
const { driver } = makeDriver({ inputTextTokenCount: 1 }); // no embedding field
|
|
251
|
+
await expect(
|
|
252
|
+
generateBedrockEmbeddings(driver, {
|
|
253
|
+
inputs: [{ type: 'text', text: 'test' }],
|
|
254
|
+
model: 'amazon.titan-embed-text-v2:0',
|
|
255
|
+
}),
|
|
256
|
+
).rejects.toThrow("missing 'embedding'");
|
|
257
|
+
});
|
|
258
|
+
});
|
|
259
|
+
|
|
260
|
+
// =================== Cohere ===================
|
|
261
|
+
|
|
262
|
+
describe('generateBedrockEmbeddings — Cohere task_type mapping', () => {
|
|
263
|
+
it("maps task_type 'query' to input_type 'search_query'", async () => {
|
|
264
|
+
const { driver, executor } = makeDriver({ embeddings: [FAKE_VECTOR] });
|
|
265
|
+
await generateBedrockEmbeddings(driver, {
|
|
266
|
+
inputs: [{ type: 'text', text: 'find me' }],
|
|
267
|
+
model: 'cohere.embed-english-v3',
|
|
268
|
+
task_type: 'query',
|
|
269
|
+
});
|
|
270
|
+
|
|
271
|
+
const body = JSON.parse(executor.invokeModel.mock.calls[0][0].body);
|
|
272
|
+
expect(body.input_type).toBe('search_query');
|
|
273
|
+
});
|
|
274
|
+
|
|
275
|
+
it("maps task_type 'document' to input_type 'search_document'", async () => {
|
|
276
|
+
const { driver, executor } = makeDriver({ embeddings: [FAKE_VECTOR] });
|
|
277
|
+
await generateBedrockEmbeddings(driver, {
|
|
278
|
+
inputs: [{ type: 'text', text: 'content' }],
|
|
279
|
+
model: 'cohere.embed-english-v3',
|
|
280
|
+
task_type: 'document',
|
|
281
|
+
});
|
|
282
|
+
|
|
283
|
+
const body = JSON.parse(executor.invokeModel.mock.calls[0][0].body);
|
|
284
|
+
expect(body.input_type).toBe('search_document');
|
|
285
|
+
});
|
|
286
|
+
|
|
287
|
+
it('omits input_type when task_type is undefined', async () => {
|
|
288
|
+
const { driver, executor } = makeDriver({ embeddings: [FAKE_VECTOR] });
|
|
289
|
+
await generateBedrockEmbeddings(driver, {
|
|
290
|
+
inputs: [{ type: 'text', text: 'content' }],
|
|
291
|
+
model: 'cohere.embed-english-v3',
|
|
292
|
+
});
|
|
293
|
+
|
|
294
|
+
const body = JSON.parse(executor.invokeModel.mock.calls[0][0].body);
|
|
295
|
+
expect(body.input_type).toBeUndefined();
|
|
296
|
+
});
|
|
297
|
+
|
|
298
|
+
it('batches multiple text inputs in a single call', async () => {
|
|
299
|
+
const { driver, executor } = makeDriver({ embeddings: [FAKE_VECTOR, [0.4, 0.5]] });
|
|
300
|
+
const result = await generateBedrockEmbeddings(driver, {
|
|
301
|
+
inputs: [
|
|
302
|
+
{ type: 'text', text: 'first' },
|
|
303
|
+
{ type: 'text', text: 'second' },
|
|
304
|
+
],
|
|
305
|
+
model: 'cohere.embed-english-v3',
|
|
306
|
+
});
|
|
307
|
+
|
|
308
|
+
expect(executor.invokeModel).toHaveBeenCalledTimes(1);
|
|
309
|
+
const body = JSON.parse(executor.invokeModel.mock.calls[0][0].body);
|
|
310
|
+
expect(body.texts).toEqual(['first', 'second']);
|
|
311
|
+
expect(result.results).toHaveLength(2);
|
|
312
|
+
expect(result.results[0].outputs[0].values).toEqual(FAKE_VECTOR);
|
|
313
|
+
expect(result.results[1].outputs[0].values).toEqual([0.4, 0.5]);
|
|
314
|
+
});
|
|
315
|
+
|
|
316
|
+
it('does not send embedding_types field', async () => {
|
|
317
|
+
const { driver, executor } = makeDriver({ embeddings: [FAKE_VECTOR] });
|
|
318
|
+
await generateBedrockEmbeddings(driver, {
|
|
319
|
+
inputs: [{ type: 'text', text: 'hi' }],
|
|
320
|
+
model: 'cohere.embed-english-v3',
|
|
321
|
+
});
|
|
322
|
+
|
|
323
|
+
const body = JSON.parse(executor.invokeModel.mock.calls[0][0].body);
|
|
324
|
+
expect(body.embedding_types).toBeUndefined();
|
|
325
|
+
expect(body.truncate).toBeUndefined();
|
|
326
|
+
});
|
|
327
|
+
|
|
328
|
+
it('per-input task_type overrides the global default for Cohere text', async () => {
|
|
329
|
+
// One "query" input overrides the global "document" task_type.
|
|
330
|
+
const { driver, executor } = makeDriver({ embeddings: [FAKE_VECTOR] });
|
|
331
|
+
await generateBedrockEmbeddings(driver, {
|
|
332
|
+
inputs: [{ type: 'text', text: 'find me', task_type: 'query' }],
|
|
333
|
+
model: 'cohere.embed-english-v3',
|
|
334
|
+
task_type: 'document',
|
|
335
|
+
});
|
|
336
|
+
const body = JSON.parse(executor.invokeModel.mock.calls[0][0].body);
|
|
337
|
+
expect(body.input_type).toBe('search_query');
|
|
338
|
+
});
|
|
339
|
+
|
|
340
|
+
it('splits texts into separate Cohere batches when task_types differ', async () => {
|
|
341
|
+
// Two texts with different effective task_types must go in separate invocations.
|
|
342
|
+
const { driver, executor } = makeDriver({ embeddings: [FAKE_VECTOR] });
|
|
343
|
+
await generateBedrockEmbeddings(driver, {
|
|
344
|
+
inputs: [
|
|
345
|
+
{ type: 'text', text: 'query text', task_type: 'query' },
|
|
346
|
+
{ type: 'text', text: 'doc text', task_type: 'document' },
|
|
347
|
+
],
|
|
348
|
+
model: 'cohere.embed-english-v3',
|
|
349
|
+
});
|
|
350
|
+
expect(executor.invokeModel).toHaveBeenCalledTimes(2);
|
|
351
|
+
const bodies = executor.invokeModel.mock.calls.map((c: { body: string }[]) => JSON.parse(c[0].body));
|
|
352
|
+
const inputTypes = bodies.map((b: { input_type: string }) => b.input_type).sort();
|
|
353
|
+
expect(inputTypes).toEqual(['search_document', 'search_query']);
|
|
354
|
+
});
|
|
355
|
+
|
|
356
|
+
it('throws when Cohere returns fewer embeddings than inputs', async () => {
|
|
357
|
+
// Cohere returned 0 embeddings for a batch of 1 text — should throw, not silently store undefined.
|
|
358
|
+
const { driver } = makeDriver({ embeddings: [] });
|
|
359
|
+
await expect(
|
|
360
|
+
generateBedrockEmbeddings(driver, {
|
|
361
|
+
inputs: [{ type: 'text', text: 'test' }],
|
|
362
|
+
model: 'cohere.embed-english-v3',
|
|
363
|
+
}),
|
|
364
|
+
).rejects.toThrow('Cohere returned 0 embeddings for 1 texts');
|
|
365
|
+
});
|
|
366
|
+
|
|
367
|
+
it('throws when Cohere returns no embedding for image input', async () => {
|
|
368
|
+
const { driver } = makeDriver({ embeddings: [] });
|
|
369
|
+
const b64 = Buffer.from('img').toString('base64');
|
|
370
|
+
const ds = new Base64DataSource('img.jpg', 'image/jpeg', b64);
|
|
371
|
+
await expect(
|
|
372
|
+
generateBedrockEmbeddings(driver, {
|
|
373
|
+
inputs: [{ type: 'image', source: ds }],
|
|
374
|
+
model: 'cohere.embed-english-v3',
|
|
375
|
+
}),
|
|
376
|
+
).rejects.toThrow('Cohere returned no embedding for image input');
|
|
377
|
+
});
|
|
378
|
+
});
|
|
379
|
+
|
|
380
|
+
// =================== Nova per-input task_type ===================
|
|
381
|
+
|
|
382
|
+
describe('generateBedrockEmbeddings — Nova per-input task_type', () => {
|
|
383
|
+
it('per-input task_type overrides the global default for Nova text', async () => {
|
|
384
|
+
const { driver, executor } = makeDriver({ embeddings: [{ embeddingType: 'TEXT', embedding: FAKE_VECTOR }] });
|
|
385
|
+
await generateBedrockEmbeddings(driver, {
|
|
386
|
+
inputs: [{ type: 'text', text: 'find me', task_type: 'query' }],
|
|
387
|
+
task_type: 'document',
|
|
388
|
+
});
|
|
389
|
+
const body = JSON.parse(executor.invokeModel.mock.calls[0][0].body);
|
|
390
|
+
expect(body.singleEmbeddingParams.embeddingPurpose).toBe('GENERIC_RETRIEVAL');
|
|
391
|
+
});
|
|
392
|
+
|
|
393
|
+
it('non-text inputs fall back to global task_type for Nova purpose', async () => {
|
|
394
|
+
const { driver, executor } = makeDriver({ embeddings: [{ embeddingType: 'IMAGE', embedding: FAKE_VECTOR }] });
|
|
395
|
+
const b64 = Buffer.from('img').toString('base64');
|
|
396
|
+
const ds = new Base64DataSource('img.jpg', 'image/jpeg', b64);
|
|
397
|
+
await generateBedrockEmbeddings(driver, {
|
|
398
|
+
inputs: [{ type: 'image', source: ds }],
|
|
399
|
+
task_type: 'query',
|
|
400
|
+
});
|
|
401
|
+
const body = JSON.parse(executor.invokeModel.mock.calls[0][0].body);
|
|
402
|
+
expect(body.singleEmbeddingParams.embeddingPurpose).toBe('GENERIC_RETRIEVAL');
|
|
403
|
+
});
|
|
404
|
+
});
|
|
405
|
+
|
|
406
|
+
// =================== Live API tests ===================
|
|
407
|
+
// Skipped unless USE_REAL_API = true.
|
|
408
|
+
// Each test has a 30 s timeout to accommodate cold-start latency.
|
|
409
|
+
|
|
410
|
+
function makeLiveDriver() {
|
|
411
|
+
return new BedrockDriver({ region: LIVE_REGION });
|
|
412
|
+
}
|
|
413
|
+
|
|
414
|
+
function assertVector(values: number[]) {
|
|
415
|
+
expect(Array.isArray(values)).toBe(true);
|
|
416
|
+
expect(values.length).toBeGreaterThan(0);
|
|
417
|
+
expect(values.every((v) => typeof v === 'number' && Number.isFinite(v))).toBe(true);
|
|
418
|
+
}
|
|
419
|
+
|
|
420
|
+
describe.skipIf(!USE_REAL_API)('generateBedrockEmbeddings — live API', () => {
|
|
421
|
+
it('Nova: text embedding (GENERIC_INDEX)', async () => {
|
|
422
|
+
const result = await generateBedrockEmbeddings(makeLiveDriver(), {
|
|
423
|
+
inputs: [{ type: 'text', text: 'The quick brown fox jumps over the lazy dog' }],
|
|
424
|
+
});
|
|
425
|
+
expect(result.results).toHaveLength(1);
|
|
426
|
+
assertVector(result.results[0].outputs[0].values);
|
|
427
|
+
expect(result.results[0].outputs[0].modality).toBe('text');
|
|
428
|
+
}, 30_000);
|
|
429
|
+
|
|
430
|
+
it('Nova: text embedding — query purpose (GENERIC_RETRIEVAL)', async () => {
|
|
431
|
+
const result = await generateBedrockEmbeddings(makeLiveDriver(), {
|
|
432
|
+
inputs: [{ type: 'text', text: 'what is the capital of France?' }],
|
|
433
|
+
task_type: 'query',
|
|
434
|
+
});
|
|
435
|
+
assertVector(result.results[0].outputs[0].values);
|
|
436
|
+
}, 30_000);
|
|
437
|
+
|
|
438
|
+
it('Nova: image embedding (inline base64)', async () => {
|
|
439
|
+
const ds = new Base64DataSource('pixel.png', 'image/png', TINY_PNG_B64);
|
|
440
|
+
const result = await generateBedrockEmbeddings(makeLiveDriver(), {
|
|
441
|
+
inputs: [{ type: 'image', source: ds }],
|
|
442
|
+
});
|
|
443
|
+
expect(result.results).toHaveLength(1);
|
|
444
|
+
assertVector(result.results[0].outputs[0].values);
|
|
445
|
+
}, 30_000);
|
|
446
|
+
|
|
447
|
+
it('Nova: dimensions param is respected', async () => {
|
|
448
|
+
const result = await generateBedrockEmbeddings(makeLiveDriver(), {
|
|
449
|
+
inputs: [{ type: 'text', text: 'dimension test' }],
|
|
450
|
+
dimensions: 256,
|
|
451
|
+
});
|
|
452
|
+
assertVector(result.results[0].outputs[0].values);
|
|
453
|
+
expect(result.results[0].outputs[0].values.length).toBe(256);
|
|
454
|
+
}, 30_000);
|
|
455
|
+
|
|
456
|
+
it('Titan text (titan-embed-text-v2): returns an embedding', async () => {
|
|
457
|
+
const result = await generateBedrockEmbeddings(makeLiveDriver(), {
|
|
458
|
+
inputs: [{ type: 'text', text: 'The quick brown fox' }],
|
|
459
|
+
model: 'amazon.titan-embed-text-v2:0',
|
|
460
|
+
});
|
|
461
|
+
expect(result.results).toHaveLength(1);
|
|
462
|
+
assertVector(result.results[0].outputs[0].values);
|
|
463
|
+
}, 30_000);
|
|
464
|
+
|
|
465
|
+
it('Titan image (titan-embed-image-v1): returns an embedding', async () => {
|
|
466
|
+
const ds = new Base64DataSource('pixel.png', 'image/png', TINY_PNG_B64);
|
|
467
|
+
const result = await generateBedrockEmbeddings(makeLiveDriver(), {
|
|
468
|
+
inputs: [{ type: 'image', source: ds }],
|
|
469
|
+
model: 'amazon.titan-embed-image-v1',
|
|
470
|
+
});
|
|
471
|
+
expect(result.results).toHaveLength(1);
|
|
472
|
+
assertVector(result.results[0].outputs[0].values);
|
|
473
|
+
}, 30_000);
|
|
474
|
+
|
|
475
|
+
it('Cohere English (cohere.embed-english-v3): returns a text embedding', async () => {
|
|
476
|
+
const result = await generateBedrockEmbeddings(makeLiveDriver(), {
|
|
477
|
+
inputs: [{ type: 'text', text: 'The quick brown fox' }],
|
|
478
|
+
model: 'cohere.embed-english-v3',
|
|
479
|
+
task_type: 'document',
|
|
480
|
+
});
|
|
481
|
+
expect(result.results).toHaveLength(1);
|
|
482
|
+
assertVector(result.results[0].outputs[0].values);
|
|
483
|
+
}, 30_000);
|
|
484
|
+
|
|
485
|
+
it('Cohere English: batches multiple texts in one call', async () => {
|
|
486
|
+
const result = await generateBedrockEmbeddings(makeLiveDriver(), {
|
|
487
|
+
inputs: [
|
|
488
|
+
{ type: 'text', text: 'first document' },
|
|
489
|
+
{ type: 'text', text: 'second document' },
|
|
490
|
+
],
|
|
491
|
+
model: 'cohere.embed-english-v3',
|
|
492
|
+
task_type: 'document',
|
|
493
|
+
});
|
|
494
|
+
expect(result.results).toHaveLength(2);
|
|
495
|
+
assertVector(result.results[0].outputs[0].values);
|
|
496
|
+
assertVector(result.results[1].outputs[0].values);
|
|
497
|
+
}, 30_000);
|
|
498
|
+
|
|
499
|
+
it('Cohere Multilingual (cohere.embed-multilingual-v3): returns a text embedding', async () => {
|
|
500
|
+
const result = await generateBedrockEmbeddings(makeLiveDriver(), {
|
|
501
|
+
inputs: [{ type: 'text', text: 'Le renard brun rapide' }],
|
|
502
|
+
model: 'cohere.embed-multilingual-v3',
|
|
503
|
+
task_type: 'document',
|
|
504
|
+
});
|
|
505
|
+
expect(result.results).toHaveLength(1);
|
|
506
|
+
assertVector(result.results[0].outputs[0].values);
|
|
507
|
+
}, 30_000);
|
|
508
|
+
});
|