@llumiverse/drivers 1.2.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/anthropic/index.d.ts +23 -0
- package/lib/anthropic/index.d.ts.map +1 -0
- package/lib/anthropic/index.js +68 -0
- 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 +17 -5
- package/lib/openai/index.d.ts.map +1 -0
- package/lib/{esm/openai → openai}/index.js +254 -148
- 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/shared/claude-messages.d.ts +99 -0
- package/lib/shared/claude-messages.d.ts.map +1 -0
- package/lib/shared/claude-messages.js +869 -0
- 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/vertexai/models/claude.d.ts +16 -0
- package/lib/vertexai/models/claude.d.ts.map +1 -0
- package/lib/vertexai/models/claude.js +65 -0
- package/lib/vertexai/models/claude.js.map +1 -0
- package/lib/{types/vertexai → vertexai}/models/gemini.d.ts +29 -5
- package/lib/vertexai/models/gemini.d.ts.map +1 -0
- package/lib/{esm/vertexai → vertexai}/models/gemini.js +255 -127
- 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 +88 -36
- package/src/adobe/firefly.ts +60 -43
- package/src/anthropic/index.ts +121 -0
- 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 -15
- 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 +389 -254
- 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 +1085 -0
- 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 +339 -253
- package/src/vertexai/models/claude-error-handling.test.ts +86 -39
- package/src/vertexai/models/claude-streaming-spacing.test.ts +82 -75
- package/src/vertexai/models/claude.ts +84 -1041
- 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 +372 -182
- 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/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 -31
- 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 -1129
- 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-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 -917
- package/lib/cjs/vertexai/models/claude.js.map +0 -1
- package/lib/cjs/vertexai/models/gemini.js +0 -858
- 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/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 -15
- 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-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 +0 -906
- 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/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 -15
- 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-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 +0 -119
- 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
package/src/groq/index.ts
CHANGED
|
@@ -1,21 +1,68 @@
|
|
|
1
|
-
import {
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
1
|
+
import type {
|
|
2
|
+
AIModel,
|
|
3
|
+
Completion,
|
|
4
|
+
CompletionChunkObject,
|
|
5
|
+
DriverOptions,
|
|
6
|
+
EmbeddingsOptions,
|
|
7
|
+
EmbeddingsResult,
|
|
8
|
+
ExecutionOptions,
|
|
9
|
+
PromptSegment,
|
|
10
|
+
TextFallbackOptions,
|
|
11
|
+
ToolDefinition,
|
|
12
|
+
ToolUse,
|
|
13
|
+
} from '@llumiverse/core';
|
|
14
|
+
import { transformAsyncIterator } from '@llumiverse/core/async';
|
|
15
|
+
import { AbstractDriver } from '@llumiverse/core/driver';
|
|
16
|
+
import Groq from 'groq-sdk';
|
|
17
|
+
import type { ChatCompletionMessageParam, ChatCompletionTool } from 'groq-sdk/resources/chat/completions';
|
|
18
|
+
import type { FunctionParameters } from 'groq-sdk/resources/shared';
|
|
19
|
+
import type OpenAI from 'openai';
|
|
20
|
+
import { formatOpenAILikeMultimodalPrompt } from '../openai/openai_format.js';
|
|
21
|
+
import { truncateDataUrlForDebug } from '../shared/debug-prompt.js';
|
|
8
22
|
|
|
9
23
|
type ResponseInputItem = OpenAI.Responses.ResponseInputItem;
|
|
10
24
|
type EasyInputMessage = OpenAI.Responses.EasyInputMessage;
|
|
25
|
+
type GroqToolCallMessage = {
|
|
26
|
+
tool_calls?: Array<{
|
|
27
|
+
id: string;
|
|
28
|
+
function: {
|
|
29
|
+
name: string;
|
|
30
|
+
arguments?: string;
|
|
31
|
+
};
|
|
32
|
+
}>;
|
|
33
|
+
};
|
|
11
34
|
|
|
12
35
|
interface GroqDriverOptions extends DriverOptions {
|
|
13
36
|
apiKey: string;
|
|
14
37
|
endpoint_url?: string;
|
|
15
38
|
}
|
|
16
39
|
|
|
40
|
+
type GroqTextContentPart = { type: 'text'; text: string };
|
|
41
|
+
type GroqImageContentPart = { type: 'image_url'; image_url: { url: string; detail?: 'auto' | 'low' | 'high' } };
|
|
42
|
+
type GroqContentPart = GroqTextContentPart | GroqImageContentPart;
|
|
43
|
+
type GroqUserMessageWithArrayContent = Extract<ChatCompletionMessageParam, { role: 'user' }> & {
|
|
44
|
+
content: GroqContentPart[];
|
|
45
|
+
};
|
|
46
|
+
|
|
47
|
+
function hasGroqArrayContent(message: ChatCompletionMessageParam): message is GroqUserMessageWithArrayContent {
|
|
48
|
+
return message.role === 'user' && Array.isArray(message.content);
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
function formatGroqContentPartForDebug(part: GroqContentPart): GroqContentPart {
|
|
52
|
+
if (part.type !== 'image_url') {
|
|
53
|
+
return part;
|
|
54
|
+
}
|
|
55
|
+
return {
|
|
56
|
+
...part,
|
|
57
|
+
image_url: {
|
|
58
|
+
...part.image_url,
|
|
59
|
+
url: truncateDataUrlForDebug(part.image_url.url),
|
|
60
|
+
},
|
|
61
|
+
};
|
|
62
|
+
}
|
|
63
|
+
|
|
17
64
|
export class GroqDriver extends AbstractDriver<GroqDriverOptions, ChatCompletionMessageParam[]> {
|
|
18
|
-
static PROVIDER =
|
|
65
|
+
static PROVIDER = 'groq';
|
|
19
66
|
provider = GroqDriver.PROVIDER;
|
|
20
67
|
apiKey: string;
|
|
21
68
|
client: Groq;
|
|
@@ -26,7 +73,8 @@ export class GroqDriver extends AbstractDriver<GroqDriverOptions, ChatCompletion
|
|
|
26
73
|
this.apiKey = options.apiKey;
|
|
27
74
|
this.client = new Groq({
|
|
28
75
|
apiKey: options.apiKey,
|
|
29
|
-
baseURL: options.endpoint_url
|
|
76
|
+
baseURL: options.endpoint_url,
|
|
77
|
+
fetch: this.getDriverFetch(),
|
|
30
78
|
});
|
|
31
79
|
}
|
|
32
80
|
|
|
@@ -50,7 +98,10 @@ export class GroqDriver extends AbstractDriver<GroqDriverOptions, ChatCompletion
|
|
|
50
98
|
return undefined;
|
|
51
99
|
}
|
|
52
100
|
|
|
53
|
-
protected async formatPrompt(
|
|
101
|
+
protected async formatPrompt(
|
|
102
|
+
segments: PromptSegment[],
|
|
103
|
+
opts: ExecutionOptions,
|
|
104
|
+
): Promise<ChatCompletionMessageParam[]> {
|
|
54
105
|
// Use OpenAI's multimodal formatter as base then convert to Groq types
|
|
55
106
|
const responseItems = await formatOpenAILikeMultimodalPrompt(segments, {
|
|
56
107
|
...opts,
|
|
@@ -61,27 +112,39 @@ export class GroqDriver extends AbstractDriver<GroqDriverOptions, ChatCompletion
|
|
|
61
112
|
return convertResponseItemsToGroqMessages(responseItems);
|
|
62
113
|
}
|
|
63
114
|
|
|
115
|
+
public formatDebugPrompt(messages: ChatCompletionMessageParam[]): ChatCompletionMessageParam[] {
|
|
116
|
+
return messages.map((message) => {
|
|
117
|
+
if (!hasGroqArrayContent(message)) {
|
|
118
|
+
return message;
|
|
119
|
+
}
|
|
120
|
+
return {
|
|
121
|
+
...message,
|
|
122
|
+
content: message.content.map(formatGroqContentPartForDebug),
|
|
123
|
+
};
|
|
124
|
+
});
|
|
125
|
+
}
|
|
126
|
+
|
|
64
127
|
private getToolDefinitions(tools: ToolDefinition[] | undefined): ChatCompletionTool[] | undefined {
|
|
65
128
|
if (!tools || tools.length === 0) {
|
|
66
129
|
return undefined;
|
|
67
130
|
}
|
|
68
131
|
|
|
69
|
-
return tools.map(tool => ({
|
|
132
|
+
return tools.map((tool) => ({
|
|
70
133
|
type: 'function' as const,
|
|
71
134
|
function: {
|
|
72
135
|
name: tool.name,
|
|
73
136
|
description: tool.description,
|
|
74
137
|
parameters: tool.input_schema satisfies FunctionParameters,
|
|
75
|
-
}
|
|
138
|
+
},
|
|
76
139
|
}));
|
|
77
140
|
}
|
|
78
141
|
|
|
79
|
-
private extractToolUse(message:
|
|
142
|
+
private extractToolUse(message: GroqToolCallMessage): ToolUse<unknown>[] | undefined {
|
|
80
143
|
if (!message.tool_calls || message.tool_calls.length === 0) {
|
|
81
144
|
return undefined;
|
|
82
145
|
}
|
|
83
146
|
|
|
84
|
-
return message.tool_calls.map((toolCall
|
|
147
|
+
return message.tool_calls.map((toolCall) => ({
|
|
85
148
|
id: toolCall.id,
|
|
86
149
|
tool_name: toolCall.function.name,
|
|
87
150
|
tool_input: JSON.parse(toolCall.function.arguments || '{}'),
|
|
@@ -89,27 +152,35 @@ export class GroqDriver extends AbstractDriver<GroqDriverOptions, ChatCompletion
|
|
|
89
152
|
}
|
|
90
153
|
|
|
91
154
|
private sanitizeMessagesForGroq(messages: ChatCompletionMessageParam[]): ChatCompletionMessageParam[] {
|
|
92
|
-
return messages.map(message => {
|
|
155
|
+
return messages.map((message) => {
|
|
93
156
|
// Remove any reasoning field from message objects
|
|
94
|
-
const
|
|
157
|
+
const sanitizedMessage = { ...(message as unknown as Record<string, unknown>) };
|
|
158
|
+
delete sanitizedMessage.reasoning;
|
|
95
159
|
|
|
96
160
|
// If message has content array, filter out reasoning content types
|
|
97
|
-
|
|
98
|
-
|
|
161
|
+
const content = sanitizedMessage.content;
|
|
162
|
+
if (Array.isArray(content)) {
|
|
163
|
+
sanitizedMessage.content = content.filter((part) => {
|
|
99
164
|
// Filter out any reasoning-related content parts
|
|
100
|
-
|
|
165
|
+
const typedPart = part as { type?: string; reasoning?: unknown };
|
|
166
|
+
return typedPart.type !== 'reasoning' && !('reasoning' in typedPart);
|
|
101
167
|
});
|
|
102
168
|
}
|
|
103
169
|
|
|
104
|
-
return sanitizedMessage as ChatCompletionMessageParam;
|
|
170
|
+
return sanitizedMessage as unknown as ChatCompletionMessageParam;
|
|
105
171
|
});
|
|
106
172
|
}
|
|
107
173
|
|
|
108
|
-
async requestTextCompletion(
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
174
|
+
async requestTextCompletion(
|
|
175
|
+
messages: ChatCompletionMessageParam[],
|
|
176
|
+
options: ExecutionOptions,
|
|
177
|
+
): Promise<Completion> {
|
|
178
|
+
if (
|
|
179
|
+
options.model_options?._option_id !== undefined &&
|
|
180
|
+
options.model_options?._option_id !== 'text-fallback' &&
|
|
181
|
+
options.model_options?._option_id !== 'groq-deepseek-thinking'
|
|
182
|
+
) {
|
|
183
|
+
this.logger.debug({ options: options.model_options }, 'Unexpected option id');
|
|
113
184
|
}
|
|
114
185
|
options.model_options = options.model_options as TextFallbackOptions;
|
|
115
186
|
|
|
@@ -146,11 +217,11 @@ export class GroqDriver extends AbstractDriver<GroqDriverOptions, ChatCompletion
|
|
|
146
217
|
|
|
147
218
|
let finish_reason = choice.finish_reason;
|
|
148
219
|
if (tool_use && tool_use.length > 0) {
|
|
149
|
-
finish_reason =
|
|
220
|
+
finish_reason = 'tool_calls';
|
|
150
221
|
}
|
|
151
222
|
|
|
152
223
|
return {
|
|
153
|
-
result: result ? [{ type:
|
|
224
|
+
result: result ? [{ type: 'text', value: result }] : [],
|
|
154
225
|
token_usage: {
|
|
155
226
|
prompt: res.usage?.prompt_tokens,
|
|
156
227
|
result: res.usage?.completion_tokens,
|
|
@@ -163,9 +234,12 @@ export class GroqDriver extends AbstractDriver<GroqDriverOptions, ChatCompletion
|
|
|
163
234
|
};
|
|
164
235
|
}
|
|
165
236
|
|
|
166
|
-
async requestTextCompletionStream(
|
|
167
|
-
|
|
168
|
-
|
|
237
|
+
async requestTextCompletionStream(
|
|
238
|
+
messages: ChatCompletionMessageParam[],
|
|
239
|
+
options: ExecutionOptions,
|
|
240
|
+
): Promise<AsyncIterable<CompletionChunkObject>> {
|
|
241
|
+
if (options.model_options?._option_id !== undefined && options.model_options?._option_id !== 'text-fallback') {
|
|
242
|
+
this.logger.debug({ options: options.model_options }, 'Unexpected option id');
|
|
169
243
|
}
|
|
170
244
|
options.model_options = options.model_options as TextFallbackOptions;
|
|
171
245
|
|
|
@@ -197,11 +271,11 @@ export class GroqDriver extends AbstractDriver<GroqDriverOptions, ChatCompletion
|
|
|
197
271
|
|
|
198
272
|
// Check for tool calls in the delta
|
|
199
273
|
if (choice.delta.tool_calls && choice.delta.tool_calls.length > 0) {
|
|
200
|
-
finish_reason =
|
|
274
|
+
finish_reason = 'tool_calls';
|
|
201
275
|
}
|
|
202
276
|
|
|
203
277
|
return {
|
|
204
|
-
result: choice.delta.content ? [{ type:
|
|
278
|
+
result: choice.delta.content ? [{ type: 'text', value: choice.delta.content }] : [],
|
|
205
279
|
finish_reason: finish_reason ?? undefined,
|
|
206
280
|
token_usage: {
|
|
207
281
|
prompt: chunk.x_groq?.usage?.prompt_tokens,
|
|
@@ -216,12 +290,12 @@ export class GroqDriver extends AbstractDriver<GroqDriverOptions, ChatCompletion
|
|
|
216
290
|
const models = await this.client.models.list();
|
|
217
291
|
|
|
218
292
|
if (!models.data) {
|
|
219
|
-
throw new Error(
|
|
293
|
+
throw new Error('No models found');
|
|
220
294
|
}
|
|
221
295
|
|
|
222
|
-
const aiModels = models.data?.map(m => {
|
|
296
|
+
const aiModels = models.data?.map((m) => {
|
|
223
297
|
if (!m.id) {
|
|
224
|
-
throw new Error(
|
|
298
|
+
throw new Error('Model id is missing');
|
|
225
299
|
}
|
|
226
300
|
return {
|
|
227
301
|
id: m.id,
|
|
@@ -229,20 +303,19 @@ export class GroqDriver extends AbstractDriver<GroqDriverOptions, ChatCompletion
|
|
|
229
303
|
description: undefined,
|
|
230
304
|
provider: this.provider,
|
|
231
305
|
owner: m.owned_by || '',
|
|
232
|
-
}
|
|
306
|
+
};
|
|
233
307
|
});
|
|
234
308
|
|
|
235
309
|
return aiModels;
|
|
236
310
|
}
|
|
237
311
|
|
|
238
312
|
validateConnection(): Promise<boolean> {
|
|
239
|
-
throw new Error(
|
|
313
|
+
throw new Error('Method not implemented.');
|
|
240
314
|
}
|
|
241
315
|
|
|
242
|
-
async generateEmbeddings(
|
|
243
|
-
throw new Error(
|
|
316
|
+
async generateEmbeddings(_options: EmbeddingsOptions): Promise<EmbeddingsResult> {
|
|
317
|
+
throw new Error('Method not implemented.');
|
|
244
318
|
}
|
|
245
|
-
|
|
246
319
|
}
|
|
247
320
|
|
|
248
321
|
/**
|
|
@@ -253,7 +326,7 @@ export class GroqDriver extends AbstractDriver<GroqDriverOptions, ChatCompletion
|
|
|
253
326
|
*/
|
|
254
327
|
function updateConversation(
|
|
255
328
|
conversation: ChatCompletionMessageParam[] | undefined,
|
|
256
|
-
messages: ChatCompletionMessageParam[]
|
|
329
|
+
messages: ChatCompletionMessageParam[],
|
|
257
330
|
): ChatCompletionMessageParam[] {
|
|
258
331
|
return (conversation || []).concat(messages);
|
|
259
332
|
}
|
|
@@ -278,7 +351,7 @@ function convertResponseItemsToGroqMessages(items: ResponseInputItem[]): ChatCom
|
|
|
278
351
|
} else if (Array.isArray(msg.content)) {
|
|
279
352
|
content = msg.content
|
|
280
353
|
.filter((part): part is OpenAI.Responses.ResponseInputText => part.type === 'input_text')
|
|
281
|
-
.map(part => part.text)
|
|
354
|
+
.map((part) => part.text)
|
|
282
355
|
.join('\n');
|
|
283
356
|
} else {
|
|
284
357
|
content = '';
|
|
@@ -289,11 +362,19 @@ function convertResponseItemsToGroqMessages(items: ResponseInputItem[]): ChatCom
|
|
|
289
362
|
|
|
290
363
|
// Handle user messages
|
|
291
364
|
if (role === 'user') {
|
|
292
|
-
let content:
|
|
365
|
+
let content:
|
|
366
|
+
| string
|
|
367
|
+
| Array<
|
|
368
|
+
| { type: 'text'; text: string }
|
|
369
|
+
| { type: 'image_url'; image_url: { url: string; detail?: 'auto' | 'low' | 'high' } }
|
|
370
|
+
>;
|
|
293
371
|
if (typeof msg.content === 'string') {
|
|
294
372
|
content = msg.content;
|
|
295
373
|
} else if (Array.isArray(msg.content)) {
|
|
296
|
-
const parts: Array<
|
|
374
|
+
const parts: Array<
|
|
375
|
+
| { type: 'text'; text: string }
|
|
376
|
+
| { type: 'image_url'; image_url: { url: string; detail?: 'auto' | 'low' | 'high' } }
|
|
377
|
+
> = [];
|
|
297
378
|
for (const part of msg.content) {
|
|
298
379
|
if (part.type === 'input_text') {
|
|
299
380
|
parts.push({ type: 'text', text: part.text });
|
|
@@ -301,7 +382,7 @@ function convertResponseItemsToGroqMessages(items: ResponseInputItem[]): ChatCom
|
|
|
301
382
|
const imgPart = part as OpenAI.Responses.ResponseInputImage;
|
|
302
383
|
if (imgPart.image_url) {
|
|
303
384
|
const image_url: { url: string; detail?: 'auto' | 'low' | 'high' } = {
|
|
304
|
-
url: imgPart.image_url
|
|
385
|
+
url: imgPart.image_url,
|
|
305
386
|
};
|
|
306
387
|
|
|
307
388
|
if (imgPart.detail) {
|
|
@@ -310,7 +391,7 @@ function convertResponseItemsToGroqMessages(items: ResponseInputItem[]): ChatCom
|
|
|
310
391
|
|
|
311
392
|
parts.push({
|
|
312
393
|
type: 'image_url',
|
|
313
|
-
image_url
|
|
394
|
+
image_url,
|
|
314
395
|
});
|
|
315
396
|
}
|
|
316
397
|
}
|
|
@@ -329,10 +410,11 @@ function convertResponseItemsToGroqMessages(items: ResponseInputItem[]): ChatCom
|
|
|
329
410
|
if (typeof msg.content === 'string') {
|
|
330
411
|
content = msg.content;
|
|
331
412
|
} else if (Array.isArray(msg.content)) {
|
|
332
|
-
content =
|
|
333
|
-
.
|
|
334
|
-
|
|
335
|
-
|
|
413
|
+
content =
|
|
414
|
+
msg.content
|
|
415
|
+
.filter((part): part is OpenAI.Responses.ResponseInputText => part.type === 'input_text')
|
|
416
|
+
.map((part) => part.text)
|
|
417
|
+
.join('\n') || null;
|
|
336
418
|
} else {
|
|
337
419
|
content = null;
|
|
338
420
|
}
|
|
@@ -360,18 +442,19 @@ function convertResponseItemsToGroqMessages(items: ResponseInputItem[]): ChatCom
|
|
|
360
442
|
messages.push({
|
|
361
443
|
role: 'assistant',
|
|
362
444
|
content: null,
|
|
363
|
-
tool_calls: [
|
|
364
|
-
|
|
365
|
-
|
|
366
|
-
|
|
367
|
-
|
|
368
|
-
|
|
369
|
-
|
|
370
|
-
|
|
445
|
+
tool_calls: [
|
|
446
|
+
{
|
|
447
|
+
id: call.call_id,
|
|
448
|
+
type: 'function',
|
|
449
|
+
function: {
|
|
450
|
+
name: call.name,
|
|
451
|
+
arguments: call.arguments,
|
|
452
|
+
},
|
|
453
|
+
},
|
|
454
|
+
],
|
|
371
455
|
});
|
|
372
|
-
continue;
|
|
373
456
|
}
|
|
374
457
|
}
|
|
375
458
|
|
|
376
459
|
return messages;
|
|
377
|
-
}
|
|
460
|
+
}
|
|
@@ -0,0 +1,263 @@
|
|
|
1
|
+
import type { HttpTimeoutOptions } from '@llumiverse/core';
|
|
2
|
+
import { describe, expect, it } from 'vitest';
|
|
3
|
+
import { exposePrivate } from '../test/__helpers__/test-utils.js';
|
|
4
|
+
import { AnthropicDriver } from './anthropic/index.js';
|
|
5
|
+
import { BedrockDriver } from './bedrock/index.js';
|
|
6
|
+
import { GroqDriver } from './groq/index.js';
|
|
7
|
+
import { HuggingFaceIEDriver } from './huggingface_ie.js';
|
|
8
|
+
import { MistralAIDriver } from './mistral/index.js';
|
|
9
|
+
import { AzureOpenAIDriver } from './openai/azure_openai.js';
|
|
10
|
+
import { OpenAIDriver } from './openai/openai.js';
|
|
11
|
+
import { OpenAICompatibleDriver } from './openai/openai_compatible.js';
|
|
12
|
+
import { ReplicateDriver } from './replicate.js';
|
|
13
|
+
import { TogetherAIDriver } from './togetherai/index.js';
|
|
14
|
+
import { VertexAIDriver } from './vertexai/index.js';
|
|
15
|
+
import { WatsonxDriver } from './watsonx/index.js';
|
|
16
|
+
import { xAIDriver } from './xai/index.js';
|
|
17
|
+
|
|
18
|
+
type DriverFetchInternals = {
|
|
19
|
+
_driverFetch?: typeof fetch;
|
|
20
|
+
};
|
|
21
|
+
|
|
22
|
+
type SdkFetchHolder = {
|
|
23
|
+
fetch?: typeof fetch;
|
|
24
|
+
_options?: {
|
|
25
|
+
fetch?: typeof fetch;
|
|
26
|
+
};
|
|
27
|
+
};
|
|
28
|
+
|
|
29
|
+
type FetchClientInternals = {
|
|
30
|
+
_fetch: Promise<typeof fetch>;
|
|
31
|
+
};
|
|
32
|
+
|
|
33
|
+
type BedrockRequestHandlerConfig = {
|
|
34
|
+
requestTimeout: number;
|
|
35
|
+
throwOnRequestTimeout: boolean;
|
|
36
|
+
connectionTimeout: number;
|
|
37
|
+
socketTimeout: number;
|
|
38
|
+
};
|
|
39
|
+
|
|
40
|
+
function driverFetch(driver: object): typeof fetch {
|
|
41
|
+
const fetchImpl = exposePrivate<DriverFetchInternals>(driver)._driverFetch;
|
|
42
|
+
if (!fetchImpl) {
|
|
43
|
+
throw new Error('Driver fetch was not initialized');
|
|
44
|
+
}
|
|
45
|
+
return fetchImpl;
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
function expectSdkUsesDriverFetch(driver: object, client: object): void {
|
|
49
|
+
const expectedFetch = driverFetch(driver);
|
|
50
|
+
const sdkClient = exposePrivate<SdkFetchHolder>(client);
|
|
51
|
+
expect(sdkClient.fetch ?? sdkClient._options?.fetch).toBe(expectedFetch);
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
async function expectFetchClientUsesDriverFetch(driver: object, client: object): Promise<void> {
|
|
55
|
+
await expect(exposePrivate<FetchClientInternals>(client)._fetch).resolves.toBe(driverFetch(driver));
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
describe('driver HTTP timeout wiring', () => {
|
|
59
|
+
it('configures Bedrock request handlers to throw on request timeout', () => {
|
|
60
|
+
const driver = new BedrockDriver({
|
|
61
|
+
region: 'us-east-1',
|
|
62
|
+
httpTimeout: {
|
|
63
|
+
headersTimeout: 1_234,
|
|
64
|
+
bodyTimeout: 2_345,
|
|
65
|
+
connectTimeout: 345,
|
|
66
|
+
},
|
|
67
|
+
});
|
|
68
|
+
|
|
69
|
+
const config = exposePrivate<{
|
|
70
|
+
getBedrockRequestHandlerConfig: (httpTimeout?: HttpTimeoutOptions) => BedrockRequestHandlerConfig;
|
|
71
|
+
}>(driver).getBedrockRequestHandlerConfig();
|
|
72
|
+
|
|
73
|
+
expect(config).toEqual({
|
|
74
|
+
requestTimeout: 1_234,
|
|
75
|
+
throwOnRequestTimeout: true,
|
|
76
|
+
connectionTimeout: 345,
|
|
77
|
+
socketTimeout: 2_345,
|
|
78
|
+
});
|
|
79
|
+
|
|
80
|
+
const overrideConfig = exposePrivate<{
|
|
81
|
+
getBedrockRequestHandlerConfig: (httpTimeout?: HttpTimeoutOptions) => BedrockRequestHandlerConfig;
|
|
82
|
+
}>(driver).getBedrockRequestHandlerConfig({
|
|
83
|
+
headersTimeout: 456,
|
|
84
|
+
bodyTimeout: 567,
|
|
85
|
+
});
|
|
86
|
+
|
|
87
|
+
expect(overrideConfig).toEqual({
|
|
88
|
+
requestTimeout: 456,
|
|
89
|
+
throwOnRequestTimeout: true,
|
|
90
|
+
connectionTimeout: 345,
|
|
91
|
+
socketTimeout: 567,
|
|
92
|
+
});
|
|
93
|
+
|
|
94
|
+
const defaultExecutor = driver.getExecutor();
|
|
95
|
+
const scopedExecutor = driver.getExecutor({ headersTimeout: 456 });
|
|
96
|
+
expect(scopedExecutor).not.toBe(defaultExecutor);
|
|
97
|
+
expect(driver.getExecutor()).toBe(defaultExecutor);
|
|
98
|
+
scopedExecutor.destroy();
|
|
99
|
+
driver.destroy();
|
|
100
|
+
});
|
|
101
|
+
|
|
102
|
+
it('passes the driver fetch to SDK clients that accept a custom fetch implementation', () => {
|
|
103
|
+
const openai = new OpenAIDriver({ apiKey: 'test-key' });
|
|
104
|
+
expectSdkUsesDriverFetch(openai, openai.service);
|
|
105
|
+
openai.destroy();
|
|
106
|
+
|
|
107
|
+
const azure = new AzureOpenAIDriver({
|
|
108
|
+
apiKey: 'test-key',
|
|
109
|
+
endpoint: 'https://example.openai.azure.com',
|
|
110
|
+
deployment: 'deployment',
|
|
111
|
+
});
|
|
112
|
+
expectSdkUsesDriverFetch(azure, azure.service);
|
|
113
|
+
azure.destroy();
|
|
114
|
+
|
|
115
|
+
const compatible = new OpenAICompatibleDriver({
|
|
116
|
+
apiKey: 'test-key',
|
|
117
|
+
endpoint: 'https://example.test/v1',
|
|
118
|
+
});
|
|
119
|
+
expectSdkUsesDriverFetch(compatible, compatible.service);
|
|
120
|
+
compatible.destroy();
|
|
121
|
+
|
|
122
|
+
const together = new TogetherAIDriver({ apiKey: 'test-key' });
|
|
123
|
+
expectSdkUsesDriverFetch(together, together.service);
|
|
124
|
+
together.destroy();
|
|
125
|
+
|
|
126
|
+
const anthropic = new AnthropicDriver({ apiKey: 'test-key' });
|
|
127
|
+
expectSdkUsesDriverFetch(anthropic, anthropic.client);
|
|
128
|
+
anthropic.destroy();
|
|
129
|
+
|
|
130
|
+
const groq = new GroqDriver({ apiKey: 'test-key' });
|
|
131
|
+
expectSdkUsesDriverFetch(groq, groq.client);
|
|
132
|
+
groq.destroy();
|
|
133
|
+
|
|
134
|
+
const replicate = new ReplicateDriver({ apiKey: 'test-key' });
|
|
135
|
+
expectSdkUsesDriverFetch(replicate, replicate.service);
|
|
136
|
+
replicate.destroy();
|
|
137
|
+
|
|
138
|
+
const xai = new xAIDriver({ apiKey: 'test-key' });
|
|
139
|
+
expectSdkUsesDriverFetch(xai, xai.service);
|
|
140
|
+
xai.destroy();
|
|
141
|
+
});
|
|
142
|
+
|
|
143
|
+
it('passes the driver fetch to FetchClient-backed drivers', async () => {
|
|
144
|
+
const mistral = new MistralAIDriver({ apiKey: 'test-key' });
|
|
145
|
+
await expectFetchClientUsesDriverFetch(mistral, mistral.client);
|
|
146
|
+
mistral.destroy();
|
|
147
|
+
|
|
148
|
+
const watsonx = new WatsonxDriver({
|
|
149
|
+
apiKey: 'test-key',
|
|
150
|
+
projectId: 'project',
|
|
151
|
+
endpointUrl: 'https://example.test',
|
|
152
|
+
});
|
|
153
|
+
await expectFetchClientUsesDriverFetch(watsonx, watsonx.fetchClient);
|
|
154
|
+
watsonx.destroy();
|
|
155
|
+
|
|
156
|
+
const huggingFace = new HuggingFaceIEDriver({
|
|
157
|
+
apiKey: 'test-key',
|
|
158
|
+
endpoint_url: 'https://example.test',
|
|
159
|
+
});
|
|
160
|
+
await expectFetchClientUsesDriverFetch(huggingFace, huggingFace.service);
|
|
161
|
+
huggingFace.destroy();
|
|
162
|
+
|
|
163
|
+
const xai = new xAIDriver({ apiKey: 'test-key' });
|
|
164
|
+
await expectFetchClientUsesDriverFetch(xai, xai.xai_service);
|
|
165
|
+
xai.destroy();
|
|
166
|
+
});
|
|
167
|
+
|
|
168
|
+
it('passes the driver fetch to Vertex AI FetchClient paths', async () => {
|
|
169
|
+
const driver = new VertexAIDriver({
|
|
170
|
+
project: 'project',
|
|
171
|
+
region: 'us-central1',
|
|
172
|
+
});
|
|
173
|
+
|
|
174
|
+
await expectFetchClientUsesDriverFetch(driver, driver.getFetchClient());
|
|
175
|
+
await expectFetchClientUsesDriverFetch(driver, driver.getLLamaClient());
|
|
176
|
+
|
|
177
|
+
driver.destroy();
|
|
178
|
+
});
|
|
179
|
+
|
|
180
|
+
it('maps Vertex AI single-timeout SDK clients from DriverOptions.httpTimeout', () => {
|
|
181
|
+
const driver = new VertexAIDriver({
|
|
182
|
+
project: 'project',
|
|
183
|
+
region: 'us-central1',
|
|
184
|
+
httpTimeout: {
|
|
185
|
+
headersTimeout: 1_000,
|
|
186
|
+
bodyTimeout: 3_000,
|
|
187
|
+
},
|
|
188
|
+
});
|
|
189
|
+
|
|
190
|
+
const internals = exposePrivate<{
|
|
191
|
+
getGoogleGenAIHttpOptions: (
|
|
192
|
+
flex: boolean,
|
|
193
|
+
httpTimeout?: HttpTimeoutOptions,
|
|
194
|
+
) => {
|
|
195
|
+
timeout: number;
|
|
196
|
+
headers?: Record<string, string>;
|
|
197
|
+
};
|
|
198
|
+
getAnthropicVertexClientOptions: (
|
|
199
|
+
region: string,
|
|
200
|
+
authClient: unknown,
|
|
201
|
+
httpTimeout?: HttpTimeoutOptions,
|
|
202
|
+
) => {
|
|
203
|
+
timeout: number;
|
|
204
|
+
region: string;
|
|
205
|
+
projectId: string;
|
|
206
|
+
fetch: typeof fetch;
|
|
207
|
+
};
|
|
208
|
+
}>(driver);
|
|
209
|
+
|
|
210
|
+
expect(internals.getGoogleGenAIHttpOptions(false)).toEqual({
|
|
211
|
+
timeout: 3_000,
|
|
212
|
+
});
|
|
213
|
+
expect(internals.getGoogleGenAIHttpOptions(true)).toEqual({
|
|
214
|
+
timeout: 3_000,
|
|
215
|
+
headers: {
|
|
216
|
+
'X-Vertex-AI-LLM-Request-Type': 'shared',
|
|
217
|
+
'X-Vertex-AI-LLM-Shared-Request-Type': 'flex',
|
|
218
|
+
},
|
|
219
|
+
});
|
|
220
|
+
expect(
|
|
221
|
+
internals.getGoogleGenAIHttpOptions(false, {
|
|
222
|
+
headersTimeout: 10_000,
|
|
223
|
+
bodyTimeout: 20_000,
|
|
224
|
+
}),
|
|
225
|
+
).toEqual({
|
|
226
|
+
timeout: 20_000,
|
|
227
|
+
});
|
|
228
|
+
|
|
229
|
+
const anthropicOptions = internals.getAnthropicVertexClientOptions('global', {});
|
|
230
|
+
expect(anthropicOptions).toEqual({
|
|
231
|
+
timeout: 3_000,
|
|
232
|
+
region: 'global',
|
|
233
|
+
projectId: 'project',
|
|
234
|
+
authClient: {},
|
|
235
|
+
fetch: driverFetch(driver),
|
|
236
|
+
});
|
|
237
|
+
expect(
|
|
238
|
+
internals.getAnthropicVertexClientOptions(
|
|
239
|
+
'global',
|
|
240
|
+
{},
|
|
241
|
+
{
|
|
242
|
+
headersTimeout: 10_000,
|
|
243
|
+
bodyTimeout: 20_000,
|
|
244
|
+
},
|
|
245
|
+
),
|
|
246
|
+
).toEqual({
|
|
247
|
+
timeout: 20_000,
|
|
248
|
+
region: 'global',
|
|
249
|
+
projectId: 'project',
|
|
250
|
+
authClient: {},
|
|
251
|
+
fetch: driverFetch(driver),
|
|
252
|
+
});
|
|
253
|
+
|
|
254
|
+
const defaultGoogleClient = driver.getGoogleGenAIClient();
|
|
255
|
+
const overrideGoogleClient = driver.getGoogleGenAIClient('us-central1', false, {
|
|
256
|
+
headersTimeout: 10_000,
|
|
257
|
+
});
|
|
258
|
+
expect(overrideGoogleClient).not.toBe(defaultGoogleClient);
|
|
259
|
+
expect(driver.getGoogleGenAIClient()).toBe(defaultGoogleClient);
|
|
260
|
+
|
|
261
|
+
driver.destroy();
|
|
262
|
+
});
|
|
263
|
+
});
|