@llumiverse/drivers 1.3.0 → 1.4.0-dev.20260629.090753Z
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/lib/{types/adobe → adobe}/firefly.d.ts +2 -1
- package/lib/adobe/firefly.d.ts.map +1 -0
- package/lib/adobe/firefly.js +120 -0
- package/lib/adobe/firefly.js.map +1 -0
- package/lib/{types/anthropic → anthropic}/index.d.ts +4 -2
- package/lib/anthropic/index.d.ts.map +1 -0
- package/lib/{esm/anthropic → anthropic}/index.js +19 -8
- package/lib/anthropic/index.js.map +1 -0
- package/lib/{types/azure → azure}/azure_foundry.d.ts +9 -7
- package/lib/azure/azure_foundry.d.ts.map +1 -0
- package/lib/{esm/azure → azure}/azure_foundry.js +138 -124
- package/lib/azure/azure_foundry.js.map +1 -0
- package/lib/{types/bedrock → bedrock}/converse.d.ts +2 -2
- package/lib/bedrock/converse.d.ts.map +1 -0
- package/lib/{esm/bedrock → bedrock}/converse.js +86 -79
- package/lib/bedrock/converse.js.map +1 -0
- package/lib/bedrock/embeddings.d.ts +4 -0
- package/lib/bedrock/embeddings.d.ts.map +1 -0
- package/lib/bedrock/embeddings.js +359 -0
- package/lib/bedrock/embeddings.js.map +1 -0
- package/lib/{types/bedrock → bedrock}/index.d.ts +33 -9
- package/lib/bedrock/index.d.ts.map +1 -0
- package/lib/{esm/bedrock → bedrock}/index.js +599 -324
- package/lib/bedrock/index.js.map +1 -0
- package/lib/{types/bedrock → bedrock}/nova-image-payload.d.ts +5 -5
- package/lib/bedrock/nova-image-payload.d.ts.map +1 -0
- package/lib/{esm/bedrock → bedrock}/nova-image-payload.js +31 -36
- package/lib/bedrock/nova-image-payload.js.map +1 -0
- package/lib/{types/bedrock → bedrock}/payloads.d.ts +1 -1
- package/lib/bedrock/payloads.d.ts.map +1 -0
- package/lib/{cjs/bedrock → bedrock}/payloads.js.map +1 -1
- package/lib/{types/bedrock → bedrock}/s3.d.ts +3 -2
- package/lib/bedrock/s3.d.ts.map +1 -0
- package/lib/{esm/bedrock → bedrock}/s3.js +27 -23
- package/lib/bedrock/s3.js.map +1 -0
- package/lib/{types/bedrock → bedrock}/twelvelabs.d.ts +8 -9
- package/lib/bedrock/twelvelabs.d.ts.map +1 -0
- package/lib/{esm/bedrock → bedrock}/twelvelabs.js +17 -21
- package/lib/bedrock/twelvelabs.js.map +1 -0
- package/lib/{types/groq → groq}/index.d.ts +6 -4
- package/lib/groq/index.d.ts.map +1 -0
- package/lib/{esm/groq → groq}/index.js +72 -39
- package/lib/groq/index.js.map +1 -0
- package/lib/{types/huggingface_ie.d.ts → huggingface_ie.d.ts} +4 -3
- package/lib/huggingface_ie.d.ts.map +1 -0
- package/lib/{esm/huggingface_ie.js → huggingface_ie.js} +32 -31
- package/lib/huggingface_ie.js.map +1 -0
- package/lib/index.d.ts +16 -0
- package/lib/index.d.ts.map +1 -0
- package/lib/index.js +16 -0
- package/lib/index.js.map +1 -0
- package/lib/{types/mistral → mistral}/index.d.ts +6 -5
- package/lib/mistral/index.d.ts.map +1 -0
- package/lib/{esm/mistral → mistral}/index.js +66 -38
- package/lib/mistral/index.js.map +1 -0
- package/lib/{types/mistral → mistral}/types.d.ts +1 -0
- package/lib/mistral/types.d.ts.map +1 -0
- package/lib/mistral/types.js.map +1 -0
- package/lib/{types/openai → openai}/azure_openai.d.ts +5 -4
- package/lib/openai/azure_openai.d.ts.map +1 -0
- package/lib/{esm/openai → openai}/azure_openai.js +17 -14
- package/lib/openai/azure_openai.js.map +1 -0
- package/lib/openai/drivers.d.ts +4 -0
- package/lib/openai/drivers.d.ts.map +1 -0
- package/lib/openai/drivers.js +9 -0
- package/lib/openai/drivers.js.map +1 -0
- package/lib/{types/openai → openai}/index.d.ts +16 -5
- package/lib/openai/index.d.ts.map +1 -0
- package/lib/{esm/openai → openai}/index.js +242 -141
- package/lib/openai/index.js.map +1 -0
- package/lib/{types/openai → openai}/openai.d.ts +3 -3
- package/lib/openai/openai.d.ts.map +1 -0
- package/lib/openai/openai.js +15 -0
- package/lib/openai/openai.js.map +1 -0
- package/lib/{types/openai → openai}/openai_compatible.d.ts +3 -3
- package/lib/openai/openai_compatible.d.ts.map +1 -0
- package/lib/{esm/openai → openai}/openai_compatible.js +14 -11
- package/lib/openai/openai_compatible.js.map +1 -0
- package/lib/{types/openai → openai}/openai_format.d.ts +3 -2
- package/lib/openai/openai_format.d.ts.map +1 -0
- package/lib/{esm/openai → openai}/openai_format.js +66 -24
- package/lib/openai/openai_format.js.map +1 -0
- package/lib/{types/replicate.d.ts → replicate.d.ts} +3 -2
- package/lib/replicate.d.ts.map +1 -0
- package/lib/{esm/replicate.js → replicate.js} +59 -49
- package/lib/replicate.js.map +1 -0
- package/lib/{types/shared → shared}/claude-messages.d.ts +25 -1
- package/lib/shared/claude-messages.d.ts.map +1 -0
- package/lib/{esm/shared → shared}/claude-messages.js +212 -59
- package/lib/shared/claude-messages.js.map +1 -0
- package/lib/{types/shared → shared}/claude-thinking.d.ts +1 -1
- package/lib/shared/claude-thinking.d.ts.map +1 -0
- package/lib/{esm/shared → shared}/claude-thinking.js +5 -7
- package/lib/shared/claude-thinking.js.map +1 -0
- package/lib/shared/debug-prompt.d.ts +5 -0
- package/lib/shared/debug-prompt.d.ts.map +1 -0
- package/lib/shared/debug-prompt.js +25 -0
- package/lib/shared/debug-prompt.js.map +1 -0
- package/lib/{types/test-driver → test-driver}/TestErrorCompletionStream.d.ts +1 -1
- package/lib/test-driver/TestErrorCompletionStream.d.ts.map +1 -0
- package/lib/test-driver/TestErrorCompletionStream.js +16 -0
- package/lib/test-driver/TestErrorCompletionStream.js.map +1 -0
- package/lib/{types/test-driver → test-driver}/TestValidationErrorCompletionStream.d.ts +1 -1
- package/lib/test-driver/TestValidationErrorCompletionStream.d.ts.map +1 -0
- package/lib/{esm/test-driver → test-driver}/TestValidationErrorCompletionStream.js +4 -4
- package/lib/test-driver/TestValidationErrorCompletionStream.js.map +1 -0
- package/lib/{types/test-driver → test-driver}/index.d.ts +3 -3
- package/lib/test-driver/index.d.ts.map +1 -0
- package/lib/{esm/test-driver → test-driver}/index.js +20 -20
- package/lib/test-driver/index.js.map +1 -0
- package/lib/{types/test-driver → test-driver}/utils.d.ts +1 -1
- package/lib/test-driver/utils.d.ts.map +1 -0
- package/lib/{esm/test-driver → test-driver}/utils.js +4 -4
- package/lib/test-driver/utils.js.map +1 -0
- package/lib/togetherai/index.d.ts +15 -0
- package/lib/togetherai/index.d.ts.map +1 -0
- package/lib/togetherai/index.js +54 -0
- package/lib/togetherai/index.js.map +1 -0
- package/lib/{types/togetherai → togetherai}/interfaces.d.ts +1 -1
- package/lib/togetherai/interfaces.d.ts.map +1 -0
- package/lib/{cjs/watsonx → togetherai}/interfaces.js.map +1 -1
- package/lib/vertexai/debug.d.ts +2 -0
- package/lib/vertexai/debug.d.ts.map +1 -0
- package/lib/{esm/vertexai → vertexai}/debug.js +1 -1
- package/lib/vertexai/debug.js.map +1 -0
- package/lib/vertexai/embeddings/embed-legacy-multimodal.d.ts +9 -0
- package/lib/vertexai/embeddings/embed-legacy-multimodal.d.ts.map +1 -0
- package/lib/vertexai/embeddings/embed-legacy-multimodal.js +141 -0
- package/lib/vertexai/embeddings/embed-legacy-multimodal.js.map +1 -0
- package/lib/vertexai/embeddings/embed.d.ts +13 -0
- package/lib/vertexai/embeddings/embed.d.ts.map +1 -0
- package/lib/vertexai/embeddings/embed.js +162 -0
- package/lib/vertexai/embeddings/embed.js.map +1 -0
- package/lib/vertexai/embeddings/source-utils.d.ts +9 -0
- package/lib/vertexai/embeddings/source-utils.d.ts.map +1 -0
- package/lib/vertexai/embeddings/source-utils.js +18 -0
- package/lib/vertexai/embeddings/source-utils.js.map +1 -0
- package/lib/{types/vertexai → vertexai}/index.d.ts +31 -19
- package/lib/vertexai/index.d.ts.map +1 -0
- package/lib/{esm/vertexai → vertexai}/index.js +221 -159
- package/lib/vertexai/index.js.map +1 -0
- package/lib/{types/vertexai → vertexai}/models/claude.d.ts +4 -4
- package/lib/vertexai/models/claude.d.ts.map +1 -0
- package/lib/{esm/vertexai → vertexai}/models/claude.js +17 -20
- package/lib/vertexai/models/claude.js.map +1 -0
- package/lib/{types/vertexai → vertexai}/models/gemini.d.ts +28 -4
- package/lib/vertexai/models/gemini.d.ts.map +1 -0
- package/lib/{esm/vertexai → vertexai}/models/gemini.js +238 -116
- package/lib/vertexai/models/gemini.js.map +1 -0
- package/lib/{types/vertexai → vertexai}/models/imagen.d.ts +12 -11
- package/lib/vertexai/models/imagen.d.ts.map +1 -0
- package/lib/{esm/vertexai → vertexai}/models/imagen.js +74 -47
- package/lib/vertexai/models/imagen.js.map +1 -0
- package/lib/{types/vertexai → vertexai}/models/llama.d.ts +4 -4
- package/lib/vertexai/models/llama.d.ts.map +1 -0
- package/lib/{esm/vertexai → vertexai}/models/llama.js +37 -33
- package/lib/vertexai/models/llama.js.map +1 -0
- package/lib/vertexai/models.d.ts +21 -0
- package/lib/vertexai/models.d.ts.map +1 -0
- package/lib/{esm/vertexai → vertexai}/models.js +12 -9
- package/lib/vertexai/models.js.map +1 -0
- package/lib/{types/watsonx → watsonx}/index.d.ts +4 -3
- package/lib/watsonx/index.d.ts.map +1 -0
- package/lib/{esm/watsonx → watsonx}/index.js +69 -41
- package/lib/watsonx/index.js.map +1 -0
- package/lib/watsonx/interfaces.d.ts.map +1 -0
- package/lib/{esm/watsonx → watsonx}/interfaces.js.map +1 -1
- package/lib/{types/xai → xai}/index.d.ts +4 -4
- package/lib/xai/index.d.ts.map +1 -0
- package/lib/{esm/xai → xai}/index.js +22 -18
- package/lib/xai/index.js.map +1 -0
- package/package.json +87 -36
- package/src/adobe/firefly.ts +60 -43
- package/src/anthropic/index.ts +37 -20
- package/src/azure/azure_foundry.ts +210 -165
- package/src/bedrock/converse.ts +124 -101
- package/src/bedrock/embeddings.test.ts +508 -0
- package/src/bedrock/embeddings.ts +517 -0
- package/src/bedrock/error-handling.test.ts +62 -14
- package/src/bedrock/index.ts +832 -466
- package/src/bedrock/nova-image-payload.ts +98 -91
- package/src/bedrock/payloads.ts +9 -9
- package/src/bedrock/s3.test.ts +39 -0
- package/src/bedrock/s3.ts +57 -38
- package/src/bedrock/streaming-tool-use.test.ts +86 -69
- package/src/bedrock/twelvelabs.ts +35 -32
- package/src/groq/index.ts +143 -60
- package/src/http-timeout-wiring.test.ts +263 -0
- package/src/huggingface_ie.ts +45 -61
- package/src/index.ts +15 -16
- package/src/mistral/index.ts +97 -48
- package/src/mistral/types.ts +13 -12
- package/src/openai/azure_openai.ts +35 -27
- package/src/openai/drivers.ts +9 -0
- package/src/openai/error-handling.test.ts +308 -113
- package/src/openai/index.ts +378 -248
- package/src/openai/openai.ts +6 -13
- package/src/openai/openai_compatible.ts +35 -25
- package/src/openai/openai_format.ts +90 -40
- package/src/replicate.ts +108 -86
- package/src/shared/claude-messages.test.ts +37 -0
- package/src/shared/claude-messages.ts +303 -97
- package/src/shared/claude-thinking.ts +6 -12
- package/src/shared/debug-prompt.ts +28 -0
- package/src/test-driver/TestErrorCompletionStream.ts +9 -10
- package/src/test-driver/TestValidationErrorCompletionStream.ts +9 -10
- package/src/test-driver/index.ts +43 -27
- package/src/test-driver/utils.ts +8 -8
- package/src/togetherai/index.test.ts +32 -0
- package/src/togetherai/index.ts +64 -128
- package/src/togetherai/interfaces.ts +5 -5
- package/src/vertexai/debug.ts +3 -3
- package/src/vertexai/embeddings/embed-legacy-multimodal.ts +211 -0
- package/src/vertexai/embeddings/embed.ts +206 -0
- package/src/vertexai/embeddings/embeddings.test.ts +497 -0
- package/src/vertexai/embeddings/source-utils.test.ts +54 -0
- package/src/vertexai/embeddings/source-utils.ts +29 -0
- package/src/vertexai/index.ts +331 -244
- package/src/vertexai/models/claude-error-handling.test.ts +83 -36
- package/src/vertexai/models/claude-streaming-spacing.test.ts +82 -75
- package/src/vertexai/models/claude.ts +55 -40
- package/src/vertexai/models/gemini-conversation-mutation.test.ts +65 -23
- package/src/vertexai/models/gemini-error-handling.test.ts +126 -10
- package/src/vertexai/models/gemini-orphaned-tool-result.test.ts +118 -0
- package/src/vertexai/models/gemini.ts +349 -172
- package/src/vertexai/models/imagen.ts +164 -100
- package/src/vertexai/models/llama.ts +70 -48
- package/src/vertexai/models.ts +36 -16
- package/src/watsonx/index.ts +101 -65
- package/src/watsonx/interfaces.ts +10 -15
- package/src/xai/index.ts +30 -30
- package/lib/cjs/adobe/firefly.js +0 -120
- package/lib/cjs/adobe/firefly.js.map +0 -1
- package/lib/cjs/anthropic/index.js +0 -64
- package/lib/cjs/anthropic/index.js.map +0 -1
- package/lib/cjs/azure/azure_foundry.js +0 -432
- package/lib/cjs/azure/azure_foundry.js.map +0 -1
- package/lib/cjs/bedrock/converse.js +0 -359
- package/lib/cjs/bedrock/converse.js.map +0 -1
- package/lib/cjs/bedrock/index.js +0 -1508
- package/lib/cjs/bedrock/index.js.map +0 -1
- package/lib/cjs/bedrock/nova-image-payload.js +0 -207
- package/lib/cjs/bedrock/nova-image-payload.js.map +0 -1
- package/lib/cjs/bedrock/payloads.js +0 -3
- package/lib/cjs/bedrock/s3.js +0 -107
- package/lib/cjs/bedrock/s3.js.map +0 -1
- package/lib/cjs/bedrock/twelvelabs.js +0 -87
- package/lib/cjs/bedrock/twelvelabs.js.map +0 -1
- package/lib/cjs/groq/index.js +0 -328
- package/lib/cjs/groq/index.js.map +0 -1
- package/lib/cjs/huggingface_ie.js +0 -201
- package/lib/cjs/huggingface_ie.js.map +0 -1
- package/lib/cjs/index.js +0 -32
- package/lib/cjs/index.js.map +0 -1
- package/lib/cjs/mistral/index.js +0 -176
- package/lib/cjs/mistral/index.js.map +0 -1
- package/lib/cjs/mistral/types.js +0 -83
- package/lib/cjs/mistral/types.js.map +0 -1
- package/lib/cjs/openai/azure_openai.js +0 -72
- package/lib/cjs/openai/azure_openai.js.map +0 -1
- package/lib/cjs/openai/index.js +0 -1135
- package/lib/cjs/openai/index.js.map +0 -1
- package/lib/cjs/openai/openai.js +0 -21
- package/lib/cjs/openai/openai.js.map +0 -1
- package/lib/cjs/openai/openai_compatible.js +0 -63
- package/lib/cjs/openai/openai_compatible.js.map +0 -1
- package/lib/cjs/openai/openai_format.js +0 -131
- package/lib/cjs/openai/openai_format.js.map +0 -1
- package/lib/cjs/package.json +0 -3
- package/lib/cjs/replicate.js +0 -275
- package/lib/cjs/replicate.js.map +0 -1
- package/lib/cjs/shared/claude-messages.js +0 -737
- package/lib/cjs/shared/claude-messages.js.map +0 -1
- package/lib/cjs/shared/claude-thinking.js +0 -60
- package/lib/cjs/shared/claude-thinking.js.map +0 -1
- package/lib/cjs/test-driver/TestErrorCompletionStream.js +0 -20
- package/lib/cjs/test-driver/TestErrorCompletionStream.js.map +0 -1
- package/lib/cjs/test-driver/TestValidationErrorCompletionStream.js +0 -24
- package/lib/cjs/test-driver/TestValidationErrorCompletionStream.js.map +0 -1
- package/lib/cjs/test-driver/index.js +0 -109
- package/lib/cjs/test-driver/index.js.map +0 -1
- package/lib/cjs/test-driver/utils.js +0 -30
- package/lib/cjs/test-driver/utils.js.map +0 -1
- package/lib/cjs/togetherai/index.js +0 -126
- package/lib/cjs/togetherai/index.js.map +0 -1
- package/lib/cjs/togetherai/interfaces.js +0 -3
- package/lib/cjs/togetherai/interfaces.js.map +0 -1
- package/lib/cjs/vertexai/debug.js +0 -12
- package/lib/cjs/vertexai/debug.js.map +0 -1
- package/lib/cjs/vertexai/embeddings/embeddings-image.js +0 -27
- package/lib/cjs/vertexai/embeddings/embeddings-image.js.map +0 -1
- package/lib/cjs/vertexai/embeddings/embeddings-text.js +0 -23
- package/lib/cjs/vertexai/embeddings/embeddings-text.js.map +0 -1
- package/lib/cjs/vertexai/index.js +0 -644
- package/lib/cjs/vertexai/index.js.map +0 -1
- package/lib/cjs/vertexai/models/claude.js +0 -72
- package/lib/cjs/vertexai/models/claude.js.map +0 -1
- package/lib/cjs/vertexai/models/gemini.js +0 -864
- package/lib/cjs/vertexai/models/gemini.js.map +0 -1
- package/lib/cjs/vertexai/models/imagen.js +0 -303
- package/lib/cjs/vertexai/models/imagen.js.map +0 -1
- package/lib/cjs/vertexai/models/llama.js +0 -183
- package/lib/cjs/vertexai/models/llama.js.map +0 -1
- package/lib/cjs/vertexai/models.js +0 -35
- package/lib/cjs/vertexai/models.js.map +0 -1
- package/lib/cjs/watsonx/index.js +0 -161
- package/lib/cjs/watsonx/index.js.map +0 -1
- package/lib/cjs/watsonx/interfaces.js +0 -3
- package/lib/cjs/xai/index.js +0 -65
- package/lib/cjs/xai/index.js.map +0 -1
- package/lib/esm/adobe/firefly.js +0 -116
- package/lib/esm/adobe/firefly.js.map +0 -1
- package/lib/esm/anthropic/index.js.map +0 -1
- package/lib/esm/azure/azure_foundry.js.map +0 -1
- package/lib/esm/bedrock/converse.js.map +0 -1
- package/lib/esm/bedrock/index.js.map +0 -1
- package/lib/esm/bedrock/nova-image-payload.js.map +0 -1
- package/lib/esm/bedrock/payloads.js.map +0 -1
- package/lib/esm/bedrock/s3.js.map +0 -1
- package/lib/esm/bedrock/twelvelabs.js.map +0 -1
- package/lib/esm/groq/index.js.map +0 -1
- package/lib/esm/huggingface_ie.js.map +0 -1
- package/lib/esm/index.js +0 -16
- package/lib/esm/index.js.map +0 -1
- package/lib/esm/mistral/index.js.map +0 -1
- package/lib/esm/mistral/types.js.map +0 -1
- package/lib/esm/openai/azure_openai.js.map +0 -1
- package/lib/esm/openai/index.js.map +0 -1
- package/lib/esm/openai/openai.js +0 -14
- package/lib/esm/openai/openai.js.map +0 -1
- package/lib/esm/openai/openai_compatible.js.map +0 -1
- package/lib/esm/openai/openai_format.js.map +0 -1
- package/lib/esm/replicate.js.map +0 -1
- package/lib/esm/shared/claude-messages.js.map +0 -1
- package/lib/esm/shared/claude-thinking.js.map +0 -1
- package/lib/esm/test-driver/TestErrorCompletionStream.js +0 -16
- package/lib/esm/test-driver/TestErrorCompletionStream.js.map +0 -1
- package/lib/esm/test-driver/TestValidationErrorCompletionStream.js.map +0 -1
- package/lib/esm/test-driver/index.js.map +0 -1
- package/lib/esm/test-driver/utils.js.map +0 -1
- package/lib/esm/togetherai/index.js +0 -122
- package/lib/esm/togetherai/index.js.map +0 -1
- package/lib/esm/togetherai/interfaces.js.map +0 -1
- package/lib/esm/vertexai/debug.js.map +0 -1
- package/lib/esm/vertexai/embeddings/embeddings-image.js +0 -24
- package/lib/esm/vertexai/embeddings/embeddings-image.js.map +0 -1
- package/lib/esm/vertexai/embeddings/embeddings-text.js +0 -20
- package/lib/esm/vertexai/embeddings/embeddings-text.js.map +0 -1
- package/lib/esm/vertexai/index.js.map +0 -1
- package/lib/esm/vertexai/models/claude.js.map +0 -1
- package/lib/esm/vertexai/models/gemini.js.map +0 -1
- package/lib/esm/vertexai/models/imagen.js.map +0 -1
- package/lib/esm/vertexai/models/llama.js.map +0 -1
- package/lib/esm/vertexai/models.js.map +0 -1
- package/lib/esm/watsonx/index.js.map +0 -1
- package/lib/esm/xai/index.js.map +0 -1
- package/lib/types/adobe/firefly.d.ts.map +0 -1
- package/lib/types/anthropic/index.d.ts.map +0 -1
- package/lib/types/azure/azure_foundry.d.ts.map +0 -1
- package/lib/types/bedrock/converse.d.ts.map +0 -1
- package/lib/types/bedrock/index.d.ts.map +0 -1
- package/lib/types/bedrock/nova-image-payload.d.ts.map +0 -1
- package/lib/types/bedrock/payloads.d.ts.map +0 -1
- package/lib/types/bedrock/s3.d.ts.map +0 -1
- package/lib/types/bedrock/twelvelabs.d.ts.map +0 -1
- package/lib/types/groq/index.d.ts.map +0 -1
- package/lib/types/huggingface_ie.d.ts.map +0 -1
- package/lib/types/index.d.ts +0 -16
- package/lib/types/index.d.ts.map +0 -1
- package/lib/types/mistral/index.d.ts.map +0 -1
- package/lib/types/mistral/types.d.ts.map +0 -1
- package/lib/types/openai/azure_openai.d.ts.map +0 -1
- package/lib/types/openai/index.d.ts.map +0 -1
- package/lib/types/openai/openai.d.ts.map +0 -1
- package/lib/types/openai/openai_compatible.d.ts.map +0 -1
- package/lib/types/openai/openai_format.d.ts.map +0 -1
- package/lib/types/replicate.d.ts.map +0 -1
- package/lib/types/shared/claude-messages.d.ts.map +0 -1
- package/lib/types/shared/claude-thinking.d.ts.map +0 -1
- package/lib/types/test-driver/TestErrorCompletionStream.d.ts.map +0 -1
- package/lib/types/test-driver/TestValidationErrorCompletionStream.d.ts.map +0 -1
- package/lib/types/test-driver/index.d.ts.map +0 -1
- package/lib/types/test-driver/utils.d.ts.map +0 -1
- package/lib/types/togetherai/index.d.ts +0 -23
- package/lib/types/togetherai/index.d.ts.map +0 -1
- package/lib/types/togetherai/interfaces.d.ts.map +0 -1
- package/lib/types/vertexai/debug.d.ts +0 -2
- package/lib/types/vertexai/debug.d.ts.map +0 -1
- package/lib/types/vertexai/embeddings/embeddings-image.d.ts +0 -11
- package/lib/types/vertexai/embeddings/embeddings-image.d.ts.map +0 -1
- package/lib/types/vertexai/embeddings/embeddings-text.d.ts +0 -10
- package/lib/types/vertexai/embeddings/embeddings-text.d.ts.map +0 -1
- package/lib/types/vertexai/index.d.ts.map +0 -1
- package/lib/types/vertexai/models/claude.d.ts.map +0 -1
- package/lib/types/vertexai/models/gemini.d.ts.map +0 -1
- package/lib/types/vertexai/models/imagen.d.ts.map +0 -1
- package/lib/types/vertexai/models/llama.d.ts.map +0 -1
- package/lib/types/vertexai/models.d.ts +0 -20
- package/lib/types/vertexai/models.d.ts.map +0 -1
- package/lib/types/watsonx/index.d.ts.map +0 -1
- package/lib/types/watsonx/interfaces.d.ts.map +0 -1
- package/lib/types/xai/index.d.ts.map +0 -1
- package/src/vertexai/embeddings/embeddings-image.ts +0 -52
- package/src/vertexai/embeddings/embeddings-text.ts +0 -54
- /package/lib/{esm/bedrock → bedrock}/payloads.js +0 -0
- /package/lib/{esm/mistral → mistral}/types.js +0 -0
- /package/lib/{esm/togetherai → togetherai}/interfaces.js +0 -0
- /package/lib/{types/watsonx → watsonx}/interfaces.d.ts +0 -0
- /package/lib/{esm/watsonx → watsonx}/interfaces.js +0 -0
|
@@ -1,19 +1,60 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
4
|
-
import { isUnexpected } from "@azure-rest/ai-inference";
|
|
5
|
-
import type OpenAI from "openai";
|
|
1
|
+
import { AIProjectClient, type DeploymentUnion, type ModelDeployment } from '@azure/ai-projects';
|
|
2
|
+
import { createSseStream, type NodeJSReadableStream } from '@azure/core-sse';
|
|
3
|
+
import { DefaultAzureCredential, getBearerTokenProvider, type TokenCredential } from '@azure/identity';
|
|
6
4
|
import type {
|
|
5
|
+
ModelClient as AzureInferenceClient,
|
|
7
6
|
ChatCompletionsOutput,
|
|
8
7
|
ChatCompletionsToolCall,
|
|
9
8
|
ChatRequestMessage,
|
|
10
|
-
} from
|
|
11
|
-
import {
|
|
12
|
-
import {
|
|
13
|
-
|
|
9
|
+
} from '@azure-rest/ai-inference';
|
|
10
|
+
import ModelClient, { isUnexpected } from '@azure-rest/ai-inference';
|
|
11
|
+
import {
|
|
12
|
+
type AIModel,
|
|
13
|
+
type Completion,
|
|
14
|
+
type CompletionChunkObject,
|
|
15
|
+
type DriverOptions,
|
|
16
|
+
dataSourceToBase64,
|
|
17
|
+
type EmbeddingResultItem,
|
|
18
|
+
type EmbeddingsOptions,
|
|
19
|
+
type EmbeddingsResult,
|
|
20
|
+
type ExecutionOptions,
|
|
21
|
+
getModelCapabilities,
|
|
22
|
+
type ImageEmbeddingInput,
|
|
23
|
+
LlumiverseError,
|
|
24
|
+
modelModalitiesToArray,
|
|
25
|
+
normalizeEmbeddingsOptions,
|
|
26
|
+
Providers,
|
|
27
|
+
type TextEmbeddingInput,
|
|
28
|
+
type TextFallbackOptions,
|
|
29
|
+
} from '@llumiverse/core';
|
|
30
|
+
import { AbstractDriver } from '@llumiverse/core/driver';
|
|
31
|
+
import type OpenAI from 'openai';
|
|
32
|
+
import { BaseOpenAIDriver } from '../openai/index.js';
|
|
33
|
+
import { formatOpenAIDebugPrompt, formatOpenAILikeMultimodalPrompt } from '../openai/openai_format.js';
|
|
14
34
|
|
|
15
35
|
type ResponseInputItem = OpenAI.Responses.ResponseInputItem;
|
|
16
36
|
type EasyInputMessage = OpenAI.Responses.EasyInputMessage;
|
|
37
|
+
type SSEMessage = { data?: string };
|
|
38
|
+
type ErrorWithStatus = Error & { status?: unknown };
|
|
39
|
+
|
|
40
|
+
class AzureFoundryOpenAIProtocolDriver extends BaseOpenAIDriver {
|
|
41
|
+
service: OpenAI;
|
|
42
|
+
readonly provider = Providers.azure_foundry;
|
|
43
|
+
|
|
44
|
+
constructor(service: OpenAI) {
|
|
45
|
+
super({});
|
|
46
|
+
this.service = service;
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
async listModels(): Promise<AIModel[]> {
|
|
50
|
+
return [];
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
function hasNumericStatus(error: unknown): boolean {
|
|
55
|
+
return error instanceof Error && typeof (error as ErrorWithStatus).status === 'number';
|
|
56
|
+
}
|
|
57
|
+
|
|
17
58
|
export interface AzureFoundryDriverOptions extends DriverOptions {
|
|
18
59
|
/**
|
|
19
60
|
* The credentials to use to access Azure AI Foundry
|
|
@@ -30,17 +71,18 @@ export interface AzureFoundryInferencePrompt {
|
|
|
30
71
|
}
|
|
31
72
|
|
|
32
73
|
export interface AzureFoundryOpenAIPrompt {
|
|
33
|
-
messages: ResponseInputItem[]
|
|
74
|
+
messages: ResponseInputItem[];
|
|
34
75
|
}
|
|
35
76
|
|
|
36
|
-
export type AzureFoundryPrompt = AzureFoundryInferencePrompt | AzureFoundryOpenAIPrompt
|
|
77
|
+
export type AzureFoundryPrompt = AzureFoundryInferencePrompt | AzureFoundryOpenAIPrompt;
|
|
37
78
|
|
|
38
79
|
export class AzureFoundryDriver extends AbstractDriver<AzureFoundryDriverOptions, ResponseInputItem[]> {
|
|
39
80
|
service: AIProjectClient;
|
|
81
|
+
private readonly inferenceClient: AzureInferenceClient;
|
|
40
82
|
readonly provider = Providers.azure_foundry;
|
|
41
83
|
|
|
42
|
-
OPENAI_API_VERSION =
|
|
43
|
-
INFERENCE_API_VERSION =
|
|
84
|
+
OPENAI_API_VERSION = '2025-01-01-preview';
|
|
85
|
+
INFERENCE_API_VERSION = '2024-05-01-preview';
|
|
44
86
|
|
|
45
87
|
constructor(opts: AzureFoundryDriverOptions) {
|
|
46
88
|
super(opts);
|
|
@@ -48,7 +90,7 @@ export class AzureFoundryDriver extends AbstractDriver<AzureFoundryDriverOptions
|
|
|
48
90
|
this.formatPrompt = formatOpenAILikeMultimodalPrompt;
|
|
49
91
|
|
|
50
92
|
if (!opts.endpoint) {
|
|
51
|
-
throw new Error(
|
|
93
|
+
throw new Error('Azure AI Foundry endpoint is required');
|
|
52
94
|
}
|
|
53
95
|
|
|
54
96
|
try {
|
|
@@ -57,28 +99,27 @@ export class AzureFoundryDriver extends AbstractDriver<AzureFoundryDriverOptions
|
|
|
57
99
|
opts.azureADTokenProvider = new DefaultAzureCredential();
|
|
58
100
|
}
|
|
59
101
|
} catch (error) {
|
|
60
|
-
this.logger.error({ error },
|
|
61
|
-
throw new Error(
|
|
102
|
+
this.logger.error({ error }, 'Failed to initialize Azure AD token provider:');
|
|
103
|
+
throw new Error('Failed to initialize Azure AD token provider');
|
|
62
104
|
}
|
|
63
105
|
|
|
64
|
-
// Initialize AI Projects client which provides access to inference operations
|
|
65
|
-
this.service = new AIProjectClient(
|
|
66
|
-
opts.endpoint,
|
|
67
|
-
opts.azureADTokenProvider
|
|
68
|
-
);
|
|
69
|
-
|
|
70
106
|
if (opts.apiVersion) {
|
|
71
107
|
this.OPENAI_API_VERSION = opts.apiVersion;
|
|
72
108
|
this.INFERENCE_API_VERSION = opts.apiVersion;
|
|
73
109
|
this.logger.info(`[Azure Foundry] Overriding default API version, using API version: ${opts.apiVersion}`);
|
|
74
110
|
}
|
|
111
|
+
|
|
112
|
+
this.service = new AIProjectClient(opts.endpoint, opts.azureADTokenProvider);
|
|
113
|
+
this.inferenceClient = ModelClient(opts.endpoint, opts.azureADTokenProvider, {
|
|
114
|
+
apiVersion: this.INFERENCE_API_VERSION,
|
|
115
|
+
});
|
|
75
116
|
}
|
|
76
117
|
|
|
77
118
|
/**
|
|
78
119
|
* Get default authentication for Azure AI Foundry API
|
|
79
120
|
*/
|
|
80
121
|
getDefaultAIFoundryAuth() {
|
|
81
|
-
const scope =
|
|
122
|
+
const scope = 'https://ai.azure.com/.default';
|
|
82
123
|
const azureADTokenProvider = getBearerTokenProvider(new DefaultAzureCredential(), scope);
|
|
83
124
|
return azureADTokenProvider;
|
|
84
125
|
}
|
|
@@ -86,43 +127,44 @@ export class AzureFoundryDriver extends AbstractDriver<AzureFoundryDriverOptions
|
|
|
86
127
|
async isOpenAIDeployment(model: string): Promise<boolean> {
|
|
87
128
|
const { deploymentName } = parseAzureFoundryModelId(model);
|
|
88
129
|
|
|
89
|
-
let deployment
|
|
130
|
+
let deployment: ModelDeployment | undefined;
|
|
90
131
|
// First, verify the deployment exists
|
|
91
132
|
try {
|
|
92
|
-
deployment = await this.service.deployments.get(deploymentName);
|
|
133
|
+
deployment = (await this.service.deployments.get(deploymentName)) as ModelDeployment;
|
|
93
134
|
this.logger.debug(`[Azure Foundry] Deployment ${deploymentName} found`);
|
|
94
135
|
} catch (deploymentError) {
|
|
95
136
|
this.logger.error({ deploymentError }, `[Azure Foundry] Deployment ${deploymentName} not found:`);
|
|
96
137
|
}
|
|
97
138
|
|
|
98
|
-
return
|
|
139
|
+
return deployment?.modelPublisher === 'OpenAI';
|
|
99
140
|
}
|
|
100
141
|
|
|
101
142
|
protected canStream(_options: ExecutionOptions): Promise<boolean> {
|
|
102
143
|
return Promise.resolve(true);
|
|
103
144
|
}
|
|
104
145
|
|
|
146
|
+
public formatDebugPrompt(prompt: ResponseInputItem[]): ResponseInputItem[] {
|
|
147
|
+
return formatOpenAIDebugPrompt(prompt);
|
|
148
|
+
}
|
|
149
|
+
|
|
105
150
|
async requestTextCompletion(prompt: ResponseInputItem[], options: ExecutionOptions): Promise<Completion> {
|
|
106
151
|
const { deploymentName } = parseAzureFoundryModelId(options.model);
|
|
107
|
-
const model_options = options.model_options as
|
|
152
|
+
const model_options = options.model_options as TextFallbackOptions | undefined;
|
|
108
153
|
const isOpenAI = await this.isOpenAIDeployment(options.model);
|
|
109
154
|
|
|
110
|
-
let response;
|
|
111
155
|
if (isOpenAI) {
|
|
112
156
|
// Use the Azure OpenAI client for OpenAI models
|
|
113
|
-
const
|
|
114
|
-
const subDriver = new
|
|
157
|
+
const openAI = this.service.getOpenAIClient();
|
|
158
|
+
const subDriver = new AzureFoundryOpenAIProtocolDriver(openAI);
|
|
115
159
|
// Use deployment name for API calls
|
|
116
160
|
const modifiedOptions = { ...options, model: deploymentName };
|
|
117
|
-
|
|
118
|
-
return response;
|
|
119
|
-
|
|
161
|
+
return subDriver.requestTextCompletion(prompt, modifiedOptions);
|
|
120
162
|
} else {
|
|
121
163
|
// Use the chat completions client from the inference operations
|
|
122
164
|
// Convert ResponseInputItem[] to ChatRequestMessage[] for non-OpenAI inference
|
|
123
165
|
const messages = convertToInferenceMessages(prompt);
|
|
124
|
-
const chatClient = this.
|
|
125
|
-
response = await chatClient.post({
|
|
166
|
+
const chatClient = this.inferenceClient.path('/chat/completions');
|
|
167
|
+
const response = await chatClient.post({
|
|
126
168
|
body: {
|
|
127
169
|
messages,
|
|
128
170
|
max_tokens: model_options?.max_tokens,
|
|
@@ -133,9 +175,9 @@ export class AzureFoundryDriver extends AbstractDriver<AzureFoundryDriverOptions
|
|
|
133
175
|
frequency_penalty: model_options?.frequency_penalty,
|
|
134
176
|
presence_penalty: model_options?.presence_penalty,
|
|
135
177
|
stop: model_options?.stop_sequence,
|
|
136
|
-
}
|
|
178
|
+
},
|
|
137
179
|
});
|
|
138
|
-
if (response.status !==
|
|
180
|
+
if (response.status !== '200') {
|
|
139
181
|
this.logger.error({ response }, `[Azure Foundry] Chat completion request failed:`);
|
|
140
182
|
throw new Error(`Chat completion request failed with status ${response.status}: ${response.body}`);
|
|
141
183
|
}
|
|
@@ -144,43 +186,48 @@ export class AzureFoundryDriver extends AbstractDriver<AzureFoundryDriverOptions
|
|
|
144
186
|
}
|
|
145
187
|
}
|
|
146
188
|
|
|
147
|
-
async requestTextCompletionStream(
|
|
189
|
+
async requestTextCompletionStream(
|
|
190
|
+
prompt: ResponseInputItem[],
|
|
191
|
+
options: ExecutionOptions,
|
|
192
|
+
): Promise<AsyncIterable<CompletionChunkObject>> {
|
|
148
193
|
const { deploymentName } = parseAzureFoundryModelId(options.model);
|
|
149
|
-
const model_options = options.model_options as
|
|
194
|
+
const model_options = options.model_options as TextFallbackOptions | undefined;
|
|
150
195
|
const isOpenAI = await this.isOpenAIDeployment(options.model);
|
|
151
196
|
|
|
152
197
|
if (isOpenAI) {
|
|
153
|
-
const
|
|
154
|
-
const subDriver = new
|
|
198
|
+
const openAI = this.service.getOpenAIClient();
|
|
199
|
+
const subDriver = new AzureFoundryOpenAIProtocolDriver(openAI);
|
|
155
200
|
const modifiedOptions = { ...options, model: deploymentName };
|
|
156
201
|
const stream = await subDriver.requestTextCompletionStream(prompt, modifiedOptions);
|
|
157
202
|
return stream;
|
|
158
203
|
} else {
|
|
159
204
|
// Convert ResponseInputItem[] to ChatRequestMessage[] for non-OpenAI inference
|
|
160
205
|
const messages = convertToInferenceMessages(prompt);
|
|
161
|
-
const chatClient = this.
|
|
162
|
-
const response = await chatClient
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
206
|
+
const chatClient = this.inferenceClient.path('/chat/completions');
|
|
207
|
+
const response = await chatClient
|
|
208
|
+
.post({
|
|
209
|
+
body: {
|
|
210
|
+
messages,
|
|
211
|
+
max_tokens: model_options?.max_tokens,
|
|
212
|
+
model: deploymentName,
|
|
213
|
+
stream: true,
|
|
214
|
+
temperature: model_options?.temperature,
|
|
215
|
+
top_p: model_options?.top_p,
|
|
216
|
+
frequency_penalty: model_options?.frequency_penalty,
|
|
217
|
+
presence_penalty: model_options?.presence_penalty,
|
|
218
|
+
stop: model_options?.stop_sequence,
|
|
219
|
+
},
|
|
220
|
+
})
|
|
221
|
+
.asNodeStream();
|
|
175
222
|
|
|
176
223
|
// We type assert from NodeJS.ReadableStream to NodeJSReadableStream
|
|
177
224
|
// The Azure Examples, expect a .destroy() method on the stream
|
|
178
225
|
const stream = response.body as NodeJSReadableStream;
|
|
179
226
|
if (!stream) {
|
|
180
|
-
throw new Error(
|
|
227
|
+
throw new Error('The response stream is undefined');
|
|
181
228
|
}
|
|
182
229
|
|
|
183
|
-
if (response.status !==
|
|
230
|
+
if (response.status !== '200') {
|
|
184
231
|
stream.destroy();
|
|
185
232
|
throw new Error(`Failed to get chat completions, http operation failed with ${response.status} code`);
|
|
186
233
|
}
|
|
@@ -191,10 +238,10 @@ export class AzureFoundryDriver extends AbstractDriver<AzureFoundryDriverOptions
|
|
|
191
238
|
}
|
|
192
239
|
}
|
|
193
240
|
|
|
194
|
-
private async *processStreamResponse(sseStream:
|
|
241
|
+
private async *processStreamResponse(sseStream: AsyncIterable<SSEMessage>): AsyncIterable<CompletionChunkObject> {
|
|
195
242
|
try {
|
|
196
243
|
for await (const event of sseStream) {
|
|
197
|
-
if (event.data ===
|
|
244
|
+
if (!event.data || event.data === '[DONE]') {
|
|
198
245
|
break;
|
|
199
246
|
}
|
|
200
247
|
|
|
@@ -209,7 +256,7 @@ export class AzureFoundryDriver extends AbstractDriver<AzureFoundryDriverOptions
|
|
|
209
256
|
continue;
|
|
210
257
|
}
|
|
211
258
|
const chunk: CompletionChunkObject = {
|
|
212
|
-
result: choice.delta?.content ||
|
|
259
|
+
result: choice.delta?.content || '',
|
|
213
260
|
finish_reason: this.convertFinishReason(choice.finish_reason),
|
|
214
261
|
token_usage: {
|
|
215
262
|
prompt: data.usage?.prompt_tokens,
|
|
@@ -221,7 +268,6 @@ export class AzureFoundryDriver extends AbstractDriver<AzureFoundryDriverOptions
|
|
|
221
268
|
yield chunk;
|
|
222
269
|
} catch (parseError) {
|
|
223
270
|
this.logger.warn({ parseError }, `[Azure Foundry] Failed to parse streaming response:`);
|
|
224
|
-
continue;
|
|
225
271
|
}
|
|
226
272
|
}
|
|
227
273
|
} catch (error) {
|
|
@@ -230,7 +276,6 @@ export class AzureFoundryDriver extends AbstractDriver<AzureFoundryDriverOptions
|
|
|
230
276
|
}
|
|
231
277
|
}
|
|
232
278
|
|
|
233
|
-
|
|
234
279
|
private extractDataFromResponse(result: ChatCompletionsOutput): Completion {
|
|
235
280
|
const tokenInfo = {
|
|
236
281
|
prompt: result.usage?.prompt_tokens,
|
|
@@ -240,20 +285,20 @@ export class AzureFoundryDriver extends AbstractDriver<AzureFoundryDriverOptions
|
|
|
240
285
|
|
|
241
286
|
const choice = result.choices?.[0];
|
|
242
287
|
if (!choice) {
|
|
243
|
-
this.logger.error({ result },
|
|
244
|
-
throw new Error(
|
|
288
|
+
this.logger.error({ result }, '[Azure Foundry] No choices in response');
|
|
289
|
+
throw new Error('No choices in response');
|
|
245
290
|
}
|
|
246
291
|
|
|
247
292
|
const data = choice.message?.content;
|
|
248
293
|
const toolCalls = choice.message?.tool_calls;
|
|
249
294
|
|
|
250
295
|
if (!data && !toolCalls) {
|
|
251
|
-
this.logger.error({ result },
|
|
252
|
-
throw new Error(
|
|
296
|
+
this.logger.error({ result }, '[Azure Foundry] Response is not valid');
|
|
297
|
+
throw new Error('Response is not valid: no content or tool calls');
|
|
253
298
|
}
|
|
254
299
|
|
|
255
300
|
const completion: Completion = {
|
|
256
|
-
result: data ? [{ type:
|
|
301
|
+
result: data ? [{ type: 'text', value: data }] : [],
|
|
257
302
|
token_usage: tokenInfo,
|
|
258
303
|
finish_reason: this.convertFinishReason(choice.finish_reason),
|
|
259
304
|
};
|
|
@@ -262,7 +307,7 @@ export class AzureFoundryDriver extends AbstractDriver<AzureFoundryDriverOptions
|
|
|
262
307
|
completion.tool_use = toolCalls.map((call: ChatCompletionsToolCall) => ({
|
|
263
308
|
id: call.id,
|
|
264
309
|
tool_name: call.function?.name,
|
|
265
|
-
tool_input: call.function?.arguments ? JSON.parse(call.function.arguments) : {}
|
|
310
|
+
tool_input: call.function?.arguments ? JSON.parse(call.function.arguments) : {},
|
|
266
311
|
}));
|
|
267
312
|
}
|
|
268
313
|
|
|
@@ -273,10 +318,14 @@ export class AzureFoundryDriver extends AbstractDriver<AzureFoundryDriverOptions
|
|
|
273
318
|
if (!reason) return undefined;
|
|
274
319
|
// Map Azure AI finish reasons to standard format
|
|
275
320
|
switch (reason) {
|
|
276
|
-
case 'stop':
|
|
277
|
-
|
|
278
|
-
case '
|
|
279
|
-
|
|
321
|
+
case 'stop':
|
|
322
|
+
return 'stop';
|
|
323
|
+
case 'length':
|
|
324
|
+
return 'length';
|
|
325
|
+
case 'tool_calls':
|
|
326
|
+
return 'tool_use';
|
|
327
|
+
default:
|
|
328
|
+
return reason;
|
|
280
329
|
}
|
|
281
330
|
}
|
|
282
331
|
|
|
@@ -293,99 +342,93 @@ export class AzureFoundryDriver extends AbstractDriver<AzureFoundryDriverOptions
|
|
|
293
342
|
}
|
|
294
343
|
|
|
295
344
|
if (!hasDeployments) {
|
|
296
|
-
this.logger.warn(
|
|
345
|
+
this.logger.warn('[Azure Foundry] No deployments found in the project');
|
|
297
346
|
}
|
|
298
347
|
|
|
299
348
|
return true;
|
|
300
349
|
} catch (error) {
|
|
301
|
-
this.logger.error({ error },
|
|
350
|
+
this.logger.error({ error }, 'Azure Foundry connection validation failed:');
|
|
302
351
|
return false;
|
|
303
352
|
}
|
|
304
353
|
}
|
|
305
354
|
|
|
306
355
|
async generateEmbeddings(options: EmbeddingsOptions): Promise<EmbeddingsResult> {
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
|
|
312
|
-
return this.generateTextEmbeddings(options);
|
|
313
|
-
} else if (options.image) {
|
|
314
|
-
return this.generateImageEmbeddings(options);
|
|
315
|
-
} else {
|
|
316
|
-
throw new Error("No text or images provided for embeddings");
|
|
356
|
+
const normalized = normalizeEmbeddingsOptions(options);
|
|
357
|
+
if (!normalized.model) {
|
|
358
|
+
throw new Error(
|
|
359
|
+
'Default embedding model selection not supported for Azure Foundry. Please specify a model.',
|
|
360
|
+
);
|
|
317
361
|
}
|
|
318
|
-
}
|
|
319
362
|
|
|
320
|
-
|
|
321
|
-
|
|
322
|
-
|
|
323
|
-
|
|
363
|
+
const textInputs: { index: number; input: TextEmbeddingInput }[] = [];
|
|
364
|
+
const imageInputs: { index: number; input: ImageEmbeddingInput }[] = [];
|
|
365
|
+
normalized.inputs.forEach((input, index) => {
|
|
366
|
+
if (input.type === 'text') textInputs.push({ index, input });
|
|
367
|
+
else if (input.type === 'image') imageInputs.push({ index, input });
|
|
368
|
+
else {
|
|
369
|
+
throw new Error(`Provider 'azure_foundry' does not support '${input.type}' embeddings.`);
|
|
370
|
+
}
|
|
371
|
+
});
|
|
324
372
|
|
|
325
|
-
const
|
|
373
|
+
const items = new Array<EmbeddingResultItem>(normalized.inputs.length);
|
|
326
374
|
|
|
327
|
-
|
|
328
|
-
|
|
329
|
-
|
|
330
|
-
|
|
331
|
-
|
|
332
|
-
|
|
333
|
-
|
|
334
|
-
|
|
335
|
-
}
|
|
375
|
+
if (textInputs.length > 0) {
|
|
376
|
+
const vectors = await this.callAzureEmbeddings(
|
|
377
|
+
textInputs.map((t) => t.input.text),
|
|
378
|
+
normalized.model,
|
|
379
|
+
'text',
|
|
380
|
+
);
|
|
381
|
+
textInputs.forEach((entry, i) => {
|
|
382
|
+
items[entry.index] = { outputs: [{ values: vectors[i], modality: 'text' }] };
|
|
336
383
|
});
|
|
337
|
-
} catch (error) {
|
|
338
|
-
this.logger.error({ error }, "Azure Foundry text embeddings error:");
|
|
339
|
-
throw error;
|
|
340
|
-
}
|
|
341
|
-
|
|
342
|
-
if (isUnexpected(response)) {
|
|
343
|
-
throw new Error(`Text embeddings request failed: ${response.status} ${response.body?.error?.message || 'Unknown error'}`);
|
|
344
384
|
}
|
|
345
385
|
|
|
346
|
-
|
|
347
|
-
|
|
348
|
-
|
|
386
|
+
if (imageInputs.length > 0) {
|
|
387
|
+
const base64Images = await Promise.all(imageInputs.map((entry) => dataSourceToBase64(entry.input.source)));
|
|
388
|
+
const vectors = await this.callAzureEmbeddings(base64Images, normalized.model, 'image');
|
|
389
|
+
imageInputs.forEach((entry, i) => {
|
|
390
|
+
items[entry.index] = { outputs: [{ values: vectors[i], modality: 'image' }] };
|
|
391
|
+
});
|
|
349
392
|
}
|
|
350
393
|
|
|
351
|
-
return {
|
|
352
|
-
values: embeddings,
|
|
353
|
-
model: options.model ?? ""
|
|
354
|
-
};
|
|
394
|
+
return { model: normalized.model, results: items };
|
|
355
395
|
}
|
|
356
396
|
|
|
357
|
-
async
|
|
358
|
-
|
|
359
|
-
throw new Error("No images provided for image embeddings");
|
|
360
|
-
}
|
|
361
|
-
|
|
362
|
-
const { deploymentName } = parseAzureFoundryModelId(options.model || "");
|
|
363
|
-
|
|
364
|
-
let response;
|
|
397
|
+
private async callAzureEmbeddings(input: string[], model: string, kind: 'text' | 'image'): Promise<number[][]> {
|
|
398
|
+
const { deploymentName } = parseAzureFoundryModelId(model);
|
|
365
399
|
try {
|
|
366
|
-
|
|
367
|
-
const
|
|
368
|
-
response
|
|
369
|
-
|
|
370
|
-
|
|
371
|
-
|
|
400
|
+
const embeddingsClient = this.inferenceClient.path('/embeddings');
|
|
401
|
+
const response = await embeddingsClient.post({ body: { input, model: deploymentName } });
|
|
402
|
+
if (isUnexpected(response)) {
|
|
403
|
+
throw new Error(
|
|
404
|
+
`${kind} embeddings request failed: ${response.status} ${response.body?.error?.message || 'Unknown error'}`,
|
|
405
|
+
);
|
|
406
|
+
}
|
|
407
|
+
|
|
408
|
+
const data = response.body.data;
|
|
409
|
+
if (!Array.isArray(data) || data.length === 0) {
|
|
410
|
+
throw new Error(`No embeddings found in Azure Foundry ${kind} response`);
|
|
411
|
+
}
|
|
412
|
+
const ordered = [...data].sort((a, b) => (a.index ?? 0) - (b.index ?? 0));
|
|
413
|
+
return ordered.map((entry) => {
|
|
414
|
+
const embedding = entry.embedding;
|
|
415
|
+
if (!Array.isArray(embedding) || embedding.length === 0) {
|
|
416
|
+
throw new Error(
|
|
417
|
+
`Empty or non-array embedding in Azure Foundry ${kind} response (got ${typeof embedding})`,
|
|
418
|
+
);
|
|
372
419
|
}
|
|
420
|
+
return embedding;
|
|
373
421
|
});
|
|
374
422
|
} catch (error) {
|
|
375
|
-
|
|
376
|
-
throw error;
|
|
377
|
-
|
|
378
|
-
|
|
379
|
-
|
|
380
|
-
|
|
381
|
-
|
|
382
|
-
|
|
383
|
-
throw new Error("No valid embedding array found in response");
|
|
423
|
+
if (LlumiverseError.isLlumiverseError(error)) throw error;
|
|
424
|
+
if (error instanceof Error && !hasNumericStatus(error)) throw error;
|
|
425
|
+
this.logger.error({ error }, `Azure Foundry ${kind} embeddings error:`);
|
|
426
|
+
throw this.formatLlumiverseError(error, {
|
|
427
|
+
provider: this.provider,
|
|
428
|
+
model,
|
|
429
|
+
operation: 'execute',
|
|
430
|
+
});
|
|
384
431
|
}
|
|
385
|
-
return {
|
|
386
|
-
values: embeddings,
|
|
387
|
-
model: options.model ?? ""
|
|
388
|
-
};
|
|
389
432
|
}
|
|
390
433
|
|
|
391
434
|
async listModels(): Promise<AIModel[]> {
|
|
@@ -397,13 +440,13 @@ export class AzureFoundryDriver extends AbstractDriver<AzureFoundryDriverOptions
|
|
|
397
440
|
}
|
|
398
441
|
|
|
399
442
|
async _listModels(filter?: (m: ModelDeployment) => boolean): Promise<AIModel[]> {
|
|
400
|
-
let deploymentsIterable
|
|
443
|
+
let deploymentsIterable: ReturnType<typeof this.service.deployments.list>;
|
|
401
444
|
try {
|
|
402
445
|
// List all deployments in the Azure AI Foundry project
|
|
403
446
|
deploymentsIterable = this.service.deployments.list();
|
|
404
447
|
} catch (error) {
|
|
405
|
-
this.logger.error({ error },
|
|
406
|
-
throw new Error(
|
|
448
|
+
this.logger.error({ error }, 'Failed to list deployments:');
|
|
449
|
+
throw new Error('Failed to list deployments in Azure AI Foundry project');
|
|
407
450
|
}
|
|
408
451
|
const deployments: DeploymentUnion[] = [];
|
|
409
452
|
|
|
@@ -414,30 +457,32 @@ export class AzureFoundryDriver extends AbstractDriver<AzureFoundryDriverOptions
|
|
|
414
457
|
}
|
|
415
458
|
|
|
416
459
|
let modelDeployments: ModelDeployment[] = deployments.filter((d): d is ModelDeployment => {
|
|
417
|
-
return d.type ===
|
|
460
|
+
return d.type === 'ModelDeployment';
|
|
418
461
|
});
|
|
419
462
|
|
|
420
463
|
if (filter) {
|
|
421
464
|
modelDeployments = modelDeployments.filter(filter);
|
|
422
465
|
}
|
|
423
466
|
|
|
424
|
-
const aiModels = modelDeployments
|
|
425
|
-
|
|
426
|
-
|
|
427
|
-
|
|
428
|
-
|
|
429
|
-
|
|
430
|
-
|
|
431
|
-
|
|
432
|
-
|
|
433
|
-
|
|
434
|
-
|
|
435
|
-
|
|
436
|
-
|
|
437
|
-
|
|
438
|
-
|
|
439
|
-
|
|
440
|
-
|
|
467
|
+
const aiModels = modelDeployments
|
|
468
|
+
.map((model) => {
|
|
469
|
+
// Create composite ID: deployment_name::base_model
|
|
470
|
+
const compositeId = `${model.name}::${model.modelName}`;
|
|
471
|
+
|
|
472
|
+
const modelCapability = getModelCapabilities(model.modelName, Providers.azure_foundry);
|
|
473
|
+
return {
|
|
474
|
+
id: compositeId,
|
|
475
|
+
name: model.name,
|
|
476
|
+
description: `${model.modelName} - ${model.modelVersion}`,
|
|
477
|
+
version: model.modelVersion,
|
|
478
|
+
provider: this.provider,
|
|
479
|
+
owner: model.modelPublisher,
|
|
480
|
+
input_modalities: modelModalitiesToArray(modelCapability.input),
|
|
481
|
+
output_modalities: modelModalitiesToArray(modelCapability.output),
|
|
482
|
+
tool_support: modelCapability.tool_support,
|
|
483
|
+
} satisfies AIModel<string>;
|
|
484
|
+
})
|
|
485
|
+
.sort((modelA, modelB) => modelA.id.localeCompare(modelB.id));
|
|
441
486
|
|
|
442
487
|
return aiModels;
|
|
443
488
|
}
|
|
@@ -449,14 +494,14 @@ export function parseAzureFoundryModelId(compositeId: string): { deploymentName:
|
|
|
449
494
|
if (parts.length === 2) {
|
|
450
495
|
return {
|
|
451
496
|
deploymentName: parts[0],
|
|
452
|
-
baseModel: parts[1]
|
|
497
|
+
baseModel: parts[1],
|
|
453
498
|
};
|
|
454
499
|
}
|
|
455
500
|
|
|
456
501
|
// Backwards compatibility: if no delimiter found, treat as deployment name
|
|
457
502
|
return {
|
|
458
503
|
deploymentName: compositeId,
|
|
459
|
-
baseModel: compositeId
|
|
504
|
+
baseModel: compositeId,
|
|
460
505
|
};
|
|
461
506
|
}
|
|
462
507
|
|
|
@@ -481,7 +526,7 @@ function convertToInferenceMessages(items: ResponseInputItem[]): ChatRequestMess
|
|
|
481
526
|
// Extract text from content array
|
|
482
527
|
content = msg.content
|
|
483
528
|
.filter((part): part is OpenAI.Responses.ResponseInputText => part.type === 'input_text')
|
|
484
|
-
.map(part => part.text)
|
|
529
|
+
.map((part) => part.text)
|
|
485
530
|
.join('\n');
|
|
486
531
|
} else {
|
|
487
532
|
content = '';
|
|
@@ -489,7 +534,7 @@ function convertToInferenceMessages(items: ResponseInputItem[]): ChatRequestMess
|
|
|
489
534
|
|
|
490
535
|
messages.push({
|
|
491
536
|
role: msg.role as 'system' | 'user' | 'assistant',
|
|
492
|
-
content
|
|
537
|
+
content,
|
|
493
538
|
});
|
|
494
539
|
}
|
|
495
540
|
// Handle function_call_output
|