@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,23 +1,32 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import { BaseOpenAIDriver } from './index.js';
|
|
3
|
-
import { LlumiverseError, LlumiverseErrorContext, Providers } from '@llumiverse/core';
|
|
1
|
+
import { LlumiverseError, Providers } from '@llumiverse/core';
|
|
4
2
|
import OpenAI from 'openai';
|
|
5
3
|
import {
|
|
4
|
+
APIConnectionError,
|
|
5
|
+
APIConnectionTimeoutError,
|
|
6
6
|
APIError,
|
|
7
|
-
BadRequestError,
|
|
8
7
|
AuthenticationError,
|
|
9
|
-
|
|
10
|
-
NotFoundError,
|
|
8
|
+
BadRequestError,
|
|
11
9
|
ConflictError,
|
|
12
|
-
|
|
13
|
-
RateLimitError,
|
|
10
|
+
ContentFilterFinishReasonError,
|
|
14
11
|
InternalServerError,
|
|
15
|
-
APIConnectionError,
|
|
16
|
-
APIConnectionTimeoutError,
|
|
17
12
|
LengthFinishReasonError,
|
|
18
|
-
|
|
19
|
-
|
|
13
|
+
NotFoundError,
|
|
14
|
+
PermissionDeniedError,
|
|
15
|
+
RateLimitError,
|
|
16
|
+
UnprocessableEntityError,
|
|
20
17
|
} from 'openai/error';
|
|
18
|
+
import { beforeEach, describe, expect, it } from 'vitest';
|
|
19
|
+
import { exposePrivate, getProp } from '../../test/__helpers__/test-utils.js';
|
|
20
|
+
import { BaseOpenAIDriver } from './index.js';
|
|
21
|
+
|
|
22
|
+
type BaseOpenAIDriverInternals = {
|
|
23
|
+
isOpenAIErrorRetryable: (
|
|
24
|
+
error: unknown,
|
|
25
|
+
httpStatusCode: number | undefined,
|
|
26
|
+
errorCode: string | null | undefined,
|
|
27
|
+
errorType: string | undefined,
|
|
28
|
+
) => boolean | undefined;
|
|
29
|
+
};
|
|
21
30
|
|
|
22
31
|
// Test implementation of BaseOpenAIDriver
|
|
23
32
|
class TestOpenAIDriver extends BaseOpenAIDriver {
|
|
@@ -30,6 +39,38 @@ class TestOpenAIDriver extends BaseOpenAIDriver {
|
|
|
30
39
|
}
|
|
31
40
|
}
|
|
32
41
|
|
|
42
|
+
describe('BaseOpenAIDriver usage mapping', () => {
|
|
43
|
+
it('maps Together flat cached_tokens usage into prompt_cached', () => {
|
|
44
|
+
const driver = new TestOpenAIDriver();
|
|
45
|
+
const response = {
|
|
46
|
+
status: 'completed',
|
|
47
|
+
output: [
|
|
48
|
+
{
|
|
49
|
+
type: 'message',
|
|
50
|
+
role: 'assistant',
|
|
51
|
+
content: [{ type: 'output_text', text: 'ok', annotations: [] }],
|
|
52
|
+
},
|
|
53
|
+
],
|
|
54
|
+
usage: {
|
|
55
|
+
input_tokens: 100,
|
|
56
|
+
output_tokens: 20,
|
|
57
|
+
total_tokens: 120,
|
|
58
|
+
cached_tokens: 45,
|
|
59
|
+
},
|
|
60
|
+
} as unknown as OpenAI.Responses.Response;
|
|
61
|
+
|
|
62
|
+
const completion = driver.extractDataFromResponse({ model: 'test-model' }, response);
|
|
63
|
+
|
|
64
|
+
expect(completion.token_usage).toEqual({
|
|
65
|
+
prompt: 100,
|
|
66
|
+
result: 20,
|
|
67
|
+
total: 120,
|
|
68
|
+
prompt_cached: 45,
|
|
69
|
+
prompt_new: 55,
|
|
70
|
+
});
|
|
71
|
+
});
|
|
72
|
+
});
|
|
73
|
+
|
|
33
74
|
describe('BaseOpenAIDriver Error Handling', () => {
|
|
34
75
|
let driver: TestOpenAIDriver;
|
|
35
76
|
|
|
@@ -41,20 +82,21 @@ describe('BaseOpenAIDriver Error Handling', () => {
|
|
|
41
82
|
it('should handle BadRequestError with status code and parameter', () => {
|
|
42
83
|
const headers = new Headers();
|
|
43
84
|
headers.set('x-request-id', 'req_test_123');
|
|
44
|
-
|
|
85
|
+
|
|
45
86
|
const openaiError = new BadRequestError(
|
|
46
87
|
400,
|
|
47
88
|
{
|
|
48
|
-
message:
|
|
89
|
+
message:
|
|
90
|
+
"Invalid 'temperature': decimal above maximum value. Expected a value <= 2, but got 31313 instead.",
|
|
49
91
|
type: 'invalid_request_error',
|
|
50
92
|
param: 'temperature',
|
|
51
|
-
code: 'decimal_above_max_value'
|
|
93
|
+
code: 'decimal_above_max_value',
|
|
52
94
|
},
|
|
53
95
|
"Invalid 'temperature': decimal above maximum value. Expected a value <= 2, but got 31313 instead.",
|
|
54
|
-
headers
|
|
96
|
+
headers,
|
|
55
97
|
);
|
|
56
98
|
|
|
57
|
-
const error = driver.formatLlumiverseError(
|
|
99
|
+
const error = driver.formatLlumiverseError(openaiError, {
|
|
58
100
|
provider: 'openai',
|
|
59
101
|
model: 'gpt-4',
|
|
60
102
|
operation: 'execute',
|
|
@@ -77,13 +119,13 @@ describe('BaseOpenAIDriver Error Handling', () => {
|
|
|
77
119
|
{
|
|
78
120
|
message: 'Rate limit exceeded',
|
|
79
121
|
type: 'rate_limit_error',
|
|
80
|
-
code: 'rate_limit_exceeded'
|
|
122
|
+
code: 'rate_limit_exceeded',
|
|
81
123
|
},
|
|
82
124
|
'Rate limit exceeded',
|
|
83
|
-
headers
|
|
125
|
+
headers,
|
|
84
126
|
);
|
|
85
127
|
|
|
86
|
-
const error = driver.formatLlumiverseError(
|
|
128
|
+
const error = driver.formatLlumiverseError(openaiError, {
|
|
87
129
|
provider: 'openai',
|
|
88
130
|
model: 'gpt-4',
|
|
89
131
|
operation: 'execute',
|
|
@@ -100,13 +142,13 @@ describe('BaseOpenAIDriver Error Handling', () => {
|
|
|
100
142
|
{
|
|
101
143
|
message: 'Internal server error',
|
|
102
144
|
type: 'server_error',
|
|
103
|
-
code: 'server_error'
|
|
145
|
+
code: 'server_error',
|
|
104
146
|
},
|
|
105
147
|
'Internal server error',
|
|
106
|
-
new Headers()
|
|
148
|
+
new Headers(),
|
|
107
149
|
);
|
|
108
150
|
|
|
109
|
-
const error = driver.formatLlumiverseError(
|
|
151
|
+
const error = driver.formatLlumiverseError(openaiError, {
|
|
110
152
|
provider: 'openai',
|
|
111
153
|
model: 'gpt-4',
|
|
112
154
|
operation: 'execute',
|
|
@@ -123,13 +165,13 @@ describe('BaseOpenAIDriver Error Handling', () => {
|
|
|
123
165
|
{
|
|
124
166
|
message: 'Invalid API key',
|
|
125
167
|
type: 'authentication_error',
|
|
126
|
-
code: 'invalid_api_key'
|
|
168
|
+
code: 'invalid_api_key',
|
|
127
169
|
},
|
|
128
170
|
'Invalid API key',
|
|
129
|
-
new Headers()
|
|
171
|
+
new Headers(),
|
|
130
172
|
);
|
|
131
173
|
|
|
132
|
-
const error = driver.formatLlumiverseError(
|
|
174
|
+
const error = driver.formatLlumiverseError(openaiError, {
|
|
133
175
|
provider: 'openai',
|
|
134
176
|
model: 'gpt-4',
|
|
135
177
|
operation: 'execute',
|
|
@@ -145,13 +187,13 @@ describe('BaseOpenAIDriver Error Handling', () => {
|
|
|
145
187
|
403,
|
|
146
188
|
{
|
|
147
189
|
message: 'Insufficient permissions',
|
|
148
|
-
type: 'permission_error'
|
|
190
|
+
type: 'permission_error',
|
|
149
191
|
},
|
|
150
192
|
'Insufficient permissions',
|
|
151
|
-
new Headers()
|
|
193
|
+
new Headers(),
|
|
152
194
|
);
|
|
153
195
|
|
|
154
|
-
const error = driver.formatLlumiverseError(
|
|
196
|
+
const error = driver.formatLlumiverseError(openaiError, {
|
|
155
197
|
provider: 'openai',
|
|
156
198
|
model: 'gpt-4',
|
|
157
199
|
operation: 'execute',
|
|
@@ -168,13 +210,13 @@ describe('BaseOpenAIDriver Error Handling', () => {
|
|
|
168
210
|
{
|
|
169
211
|
message: 'Model not found',
|
|
170
212
|
type: 'invalid_request_error',
|
|
171
|
-
code: 'model_not_found'
|
|
213
|
+
code: 'model_not_found',
|
|
172
214
|
},
|
|
173
215
|
'Model not found',
|
|
174
|
-
new Headers()
|
|
216
|
+
new Headers(),
|
|
175
217
|
);
|
|
176
218
|
|
|
177
|
-
const error = driver.formatLlumiverseError(
|
|
219
|
+
const error = driver.formatLlumiverseError(openaiError, {
|
|
178
220
|
provider: 'openai',
|
|
179
221
|
model: 'gpt-invalid',
|
|
180
222
|
operation: 'execute',
|
|
@@ -190,13 +232,13 @@ describe('BaseOpenAIDriver Error Handling', () => {
|
|
|
190
232
|
409,
|
|
191
233
|
{
|
|
192
234
|
message: 'Resource conflict',
|
|
193
|
-
type: 'conflict_error'
|
|
235
|
+
type: 'conflict_error',
|
|
194
236
|
},
|
|
195
237
|
'Resource conflict',
|
|
196
|
-
new Headers()
|
|
238
|
+
new Headers(),
|
|
197
239
|
);
|
|
198
240
|
|
|
199
|
-
const error = driver.formatLlumiverseError(
|
|
241
|
+
const error = driver.formatLlumiverseError(openaiError, {
|
|
200
242
|
provider: 'openai',
|
|
201
243
|
model: 'gpt-4',
|
|
202
244
|
operation: 'execute',
|
|
@@ -212,13 +254,13 @@ describe('BaseOpenAIDriver Error Handling', () => {
|
|
|
212
254
|
422,
|
|
213
255
|
{
|
|
214
256
|
message: 'Validation failed',
|
|
215
|
-
type: 'validation_error'
|
|
257
|
+
type: 'validation_error',
|
|
216
258
|
},
|
|
217
259
|
'Validation failed',
|
|
218
|
-
new Headers()
|
|
260
|
+
new Headers(),
|
|
219
261
|
);
|
|
220
262
|
|
|
221
|
-
const error = driver.formatLlumiverseError(
|
|
263
|
+
const error = driver.formatLlumiverseError(openaiError, {
|
|
222
264
|
provider: 'openai',
|
|
223
265
|
model: 'gpt-4',
|
|
224
266
|
operation: 'execute',
|
|
@@ -232,7 +274,7 @@ describe('BaseOpenAIDriver Error Handling', () => {
|
|
|
232
274
|
it('should handle APIConnectionTimeoutError as retryable', () => {
|
|
233
275
|
const openaiError = new APIConnectionTimeoutError({ message: 'Request timed out' });
|
|
234
276
|
|
|
235
|
-
const error = driver.formatLlumiverseError(
|
|
277
|
+
const error = driver.formatLlumiverseError(openaiError, {
|
|
236
278
|
provider: 'openai',
|
|
237
279
|
model: 'gpt-4',
|
|
238
280
|
operation: 'execute',
|
|
@@ -246,7 +288,7 @@ describe('BaseOpenAIDriver Error Handling', () => {
|
|
|
246
288
|
it('should handle APIConnectionError as retryable', () => {
|
|
247
289
|
const openaiError = new APIConnectionError({ message: 'Connection failed' });
|
|
248
290
|
|
|
249
|
-
const error = driver.formatLlumiverseError(
|
|
291
|
+
const error = driver.formatLlumiverseError(openaiError, {
|
|
250
292
|
provider: 'openai',
|
|
251
293
|
model: 'gpt-4',
|
|
252
294
|
operation: 'execute',
|
|
@@ -260,7 +302,7 @@ describe('BaseOpenAIDriver Error Handling', () => {
|
|
|
260
302
|
it('should handle LengthFinishReasonError as not retryable', () => {
|
|
261
303
|
const openaiError = new LengthFinishReasonError();
|
|
262
304
|
|
|
263
|
-
const error = driver.formatLlumiverseError(
|
|
305
|
+
const error = driver.formatLlumiverseError(openaiError, {
|
|
264
306
|
provider: 'openai',
|
|
265
307
|
model: 'gpt-4',
|
|
266
308
|
operation: 'execute',
|
|
@@ -273,7 +315,7 @@ describe('BaseOpenAIDriver Error Handling', () => {
|
|
|
273
315
|
it('should handle ContentFilterFinishReasonError as not retryable', () => {
|
|
274
316
|
const openaiError = new ContentFilterFinishReasonError();
|
|
275
317
|
|
|
276
|
-
const error = driver.formatLlumiverseError(
|
|
318
|
+
const error = driver.formatLlumiverseError(openaiError, {
|
|
277
319
|
provider: 'openai',
|
|
278
320
|
model: 'gpt-4',
|
|
279
321
|
operation: 'execute',
|
|
@@ -289,13 +331,13 @@ describe('BaseOpenAIDriver Error Handling', () => {
|
|
|
289
331
|
400,
|
|
290
332
|
{
|
|
291
333
|
message: 'Invalid parameter',
|
|
292
|
-
code: 'invalid_parameter'
|
|
334
|
+
code: 'invalid_parameter',
|
|
293
335
|
},
|
|
294
336
|
'Invalid parameter',
|
|
295
|
-
headers
|
|
337
|
+
headers,
|
|
296
338
|
);
|
|
297
339
|
|
|
298
|
-
const error = driver.formatLlumiverseError(
|
|
340
|
+
const error = driver.formatLlumiverseError(openaiError, {
|
|
299
341
|
provider: 'openai',
|
|
300
342
|
model: 'gpt-4',
|
|
301
343
|
operation: 'execute',
|
|
@@ -311,13 +353,13 @@ describe('BaseOpenAIDriver Error Handling', () => {
|
|
|
311
353
|
{
|
|
312
354
|
message: 'Invalid value',
|
|
313
355
|
param: 'max_tokens',
|
|
314
|
-
code: 'invalid_value'
|
|
356
|
+
code: 'invalid_value',
|
|
315
357
|
},
|
|
316
358
|
'Invalid value',
|
|
317
|
-
headers
|
|
359
|
+
headers,
|
|
318
360
|
);
|
|
319
361
|
|
|
320
|
-
const error = driver.formatLlumiverseError(
|
|
362
|
+
const error = driver.formatLlumiverseError(openaiError, {
|
|
321
363
|
provider: 'openai',
|
|
322
364
|
model: 'gpt-4',
|
|
323
365
|
operation: 'execute',
|
|
@@ -329,15 +371,10 @@ describe('BaseOpenAIDriver Error Handling', () => {
|
|
|
329
371
|
it('should include request ID when available', () => {
|
|
330
372
|
const headers = new Headers();
|
|
331
373
|
headers.set('x-request-id', 'req_xyz789');
|
|
332
|
-
|
|
333
|
-
const openaiError = new BadRequestError(
|
|
334
|
-
400,
|
|
335
|
-
{ message: 'Bad request' },
|
|
336
|
-
'Bad request',
|
|
337
|
-
headers
|
|
338
|
-
);
|
|
339
374
|
|
|
340
|
-
const
|
|
375
|
+
const openaiError = new BadRequestError(400, { message: 'Bad request' }, 'Bad request', headers);
|
|
376
|
+
|
|
377
|
+
const error = driver.formatLlumiverseError(openaiError, {
|
|
341
378
|
provider: 'openai',
|
|
342
379
|
model: 'gpt-4',
|
|
343
380
|
operation: 'execute',
|
|
@@ -350,7 +387,7 @@ describe('BaseOpenAIDriver Error Handling', () => {
|
|
|
350
387
|
const regularError = new Error('Regular error');
|
|
351
388
|
|
|
352
389
|
expect(() => {
|
|
353
|
-
driver.formatLlumiverseError(
|
|
390
|
+
driver.formatLlumiverseError(regularError, {
|
|
354
391
|
provider: 'openai',
|
|
355
392
|
model: 'gpt-4',
|
|
356
393
|
operation: 'execute',
|
|
@@ -359,14 +396,9 @@ describe('BaseOpenAIDriver Error Handling', () => {
|
|
|
359
396
|
});
|
|
360
397
|
|
|
361
398
|
it('should preserve original error for debugging', () => {
|
|
362
|
-
const openaiError = new BadRequestError(
|
|
363
|
-
400,
|
|
364
|
-
{ message: 'Test error' },
|
|
365
|
-
'Test error',
|
|
366
|
-
new Headers()
|
|
367
|
-
);
|
|
399
|
+
const openaiError = new BadRequestError(400, { message: 'Test error' }, 'Test error', new Headers());
|
|
368
400
|
|
|
369
|
-
const error = driver.formatLlumiverseError(
|
|
401
|
+
const error = driver.formatLlumiverseError(openaiError, {
|
|
370
402
|
provider: 'openai',
|
|
371
403
|
model: 'gpt-4',
|
|
372
404
|
operation: 'execute',
|
|
@@ -385,7 +417,12 @@ describe('BaseOpenAIDriver Error Handling', () => {
|
|
|
385
417
|
];
|
|
386
418
|
|
|
387
419
|
for (const error of retryableErrors) {
|
|
388
|
-
const result = (driver
|
|
420
|
+
const result = exposePrivate<BaseOpenAIDriverInternals>(driver).isOpenAIErrorRetryable(
|
|
421
|
+
error,
|
|
422
|
+
error.status,
|
|
423
|
+
null,
|
|
424
|
+
undefined,
|
|
425
|
+
);
|
|
389
426
|
expect(result, `${error.constructor.name} should be retryable`).toBe(true);
|
|
390
427
|
}
|
|
391
428
|
});
|
|
@@ -403,83 +440,241 @@ describe('BaseOpenAIDriver Error Handling', () => {
|
|
|
403
440
|
];
|
|
404
441
|
|
|
405
442
|
for (const error of nonRetryableErrors) {
|
|
406
|
-
const status = 'status'
|
|
407
|
-
const result = (driver
|
|
443
|
+
const status = getProp<number>(error, 'status');
|
|
444
|
+
const result = exposePrivate<BaseOpenAIDriverInternals>(driver).isOpenAIErrorRetryable(
|
|
445
|
+
error,
|
|
446
|
+
status,
|
|
447
|
+
null,
|
|
448
|
+
undefined,
|
|
449
|
+
);
|
|
408
450
|
expect(result, `${error.constructor.name} should not be retryable`).toBe(false);
|
|
409
451
|
}
|
|
410
452
|
});
|
|
411
453
|
|
|
412
454
|
it('should classify retryable error codes correctly', () => {
|
|
413
|
-
const apiError = new APIError(undefined
|
|
414
|
-
|
|
415
|
-
expect(
|
|
416
|
-
|
|
417
|
-
|
|
418
|
-
|
|
455
|
+
const apiError = new APIError(undefined, {}, 'Error', new Headers());
|
|
456
|
+
|
|
457
|
+
expect(
|
|
458
|
+
exposePrivate<BaseOpenAIDriverInternals>(driver).isOpenAIErrorRetryable(
|
|
459
|
+
apiError,
|
|
460
|
+
undefined,
|
|
461
|
+
'timeout',
|
|
462
|
+
undefined,
|
|
463
|
+
),
|
|
464
|
+
).toBe(true);
|
|
465
|
+
expect(
|
|
466
|
+
exposePrivate<BaseOpenAIDriverInternals>(driver).isOpenAIErrorRetryable(
|
|
467
|
+
apiError,
|
|
468
|
+
undefined,
|
|
469
|
+
'server_error',
|
|
470
|
+
undefined,
|
|
471
|
+
),
|
|
472
|
+
).toBe(true);
|
|
473
|
+
expect(
|
|
474
|
+
exposePrivate<BaseOpenAIDriverInternals>(driver).isOpenAIErrorRetryable(
|
|
475
|
+
apiError,
|
|
476
|
+
undefined,
|
|
477
|
+
'service_unavailable',
|
|
478
|
+
undefined,
|
|
479
|
+
),
|
|
480
|
+
).toBe(true);
|
|
481
|
+
expect(
|
|
482
|
+
exposePrivate<BaseOpenAIDriverInternals>(driver).isOpenAIErrorRetryable(
|
|
483
|
+
apiError,
|
|
484
|
+
undefined,
|
|
485
|
+
'rate_limit_exceeded',
|
|
486
|
+
undefined,
|
|
487
|
+
),
|
|
488
|
+
).toBe(true);
|
|
419
489
|
});
|
|
420
490
|
|
|
421
491
|
it('should classify non-retryable error codes correctly', () => {
|
|
422
|
-
const apiError = new APIError(undefined
|
|
423
|
-
|
|
424
|
-
expect(
|
|
425
|
-
|
|
426
|
-
|
|
427
|
-
|
|
428
|
-
|
|
429
|
-
|
|
492
|
+
const apiError = new APIError(undefined, {}, 'Error', new Headers());
|
|
493
|
+
|
|
494
|
+
expect(
|
|
495
|
+
exposePrivate<BaseOpenAIDriverInternals>(driver).isOpenAIErrorRetryable(
|
|
496
|
+
apiError,
|
|
497
|
+
undefined,
|
|
498
|
+
'invalid_api_key',
|
|
499
|
+
undefined,
|
|
500
|
+
),
|
|
501
|
+
).toBe(false);
|
|
502
|
+
expect(
|
|
503
|
+
exposePrivate<BaseOpenAIDriverInternals>(driver).isOpenAIErrorRetryable(
|
|
504
|
+
apiError,
|
|
505
|
+
undefined,
|
|
506
|
+
'invalid_request_error',
|
|
507
|
+
undefined,
|
|
508
|
+
),
|
|
509
|
+
).toBe(false);
|
|
510
|
+
expect(
|
|
511
|
+
exposePrivate<BaseOpenAIDriverInternals>(driver).isOpenAIErrorRetryable(
|
|
512
|
+
apiError,
|
|
513
|
+
undefined,
|
|
514
|
+
'model_not_found',
|
|
515
|
+
undefined,
|
|
516
|
+
),
|
|
517
|
+
).toBe(false);
|
|
518
|
+
expect(
|
|
519
|
+
exposePrivate<BaseOpenAIDriverInternals>(driver).isOpenAIErrorRetryable(
|
|
520
|
+
apiError,
|
|
521
|
+
undefined,
|
|
522
|
+
'insufficient_quota',
|
|
523
|
+
undefined,
|
|
524
|
+
),
|
|
525
|
+
).toBe(false);
|
|
526
|
+
expect(
|
|
527
|
+
exposePrivate<BaseOpenAIDriverInternals>(driver).isOpenAIErrorRetryable(
|
|
528
|
+
apiError,
|
|
529
|
+
undefined,
|
|
530
|
+
'invalid_model',
|
|
531
|
+
undefined,
|
|
532
|
+
),
|
|
533
|
+
).toBe(false);
|
|
534
|
+
expect(
|
|
535
|
+
exposePrivate<BaseOpenAIDriverInternals>(driver).isOpenAIErrorRetryable(
|
|
536
|
+
apiError,
|
|
537
|
+
undefined,
|
|
538
|
+
'invalid_parameter',
|
|
539
|
+
undefined,
|
|
540
|
+
),
|
|
541
|
+
).toBe(false);
|
|
430
542
|
});
|
|
431
543
|
|
|
432
544
|
it('should classify error types correctly', () => {
|
|
433
|
-
const apiError = new APIError(undefined
|
|
434
|
-
|
|
435
|
-
expect(
|
|
436
|
-
|
|
545
|
+
const apiError = new APIError(undefined, {}, 'Error', new Headers());
|
|
546
|
+
|
|
547
|
+
expect(
|
|
548
|
+
exposePrivate<BaseOpenAIDriverInternals>(driver).isOpenAIErrorRetryable(
|
|
549
|
+
apiError,
|
|
550
|
+
undefined,
|
|
551
|
+
null,
|
|
552
|
+
'invalid_request_error',
|
|
553
|
+
),
|
|
554
|
+
).toBe(false);
|
|
555
|
+
expect(
|
|
556
|
+
exposePrivate<BaseOpenAIDriverInternals>(driver).isOpenAIErrorRetryable(
|
|
557
|
+
apiError,
|
|
558
|
+
undefined,
|
|
559
|
+
null,
|
|
560
|
+
'authentication_error',
|
|
561
|
+
),
|
|
562
|
+
).toBe(false);
|
|
437
563
|
});
|
|
438
564
|
|
|
439
565
|
it('should use HTTP status codes when available', () => {
|
|
440
566
|
const apiError = new APIError(429, {}, 'Too many requests', new Headers());
|
|
441
|
-
expect(
|
|
442
|
-
|
|
567
|
+
expect(
|
|
568
|
+
exposePrivate<BaseOpenAIDriverInternals>(driver).isOpenAIErrorRetryable(apiError, 429, null, undefined),
|
|
569
|
+
).toBe(true);
|
|
570
|
+
|
|
443
571
|
const apiError2 = new APIError(408, {}, 'Request timeout', new Headers());
|
|
444
|
-
expect(
|
|
445
|
-
|
|
572
|
+
expect(
|
|
573
|
+
exposePrivate<BaseOpenAIDriverInternals>(driver).isOpenAIErrorRetryable(
|
|
574
|
+
apiError2,
|
|
575
|
+
408,
|
|
576
|
+
null,
|
|
577
|
+
undefined,
|
|
578
|
+
),
|
|
579
|
+
).toBe(true);
|
|
580
|
+
|
|
446
581
|
const apiError3 = new APIError(502, {}, 'Bad gateway', new Headers());
|
|
447
|
-
expect(
|
|
448
|
-
|
|
582
|
+
expect(
|
|
583
|
+
exposePrivate<BaseOpenAIDriverInternals>(driver).isOpenAIErrorRetryable(
|
|
584
|
+
apiError3,
|
|
585
|
+
502,
|
|
586
|
+
null,
|
|
587
|
+
undefined,
|
|
588
|
+
),
|
|
589
|
+
).toBe(true);
|
|
590
|
+
|
|
449
591
|
const apiError4 = new APIError(503, {}, 'Service unavailable', new Headers());
|
|
450
|
-
expect(
|
|
451
|
-
|
|
592
|
+
expect(
|
|
593
|
+
exposePrivate<BaseOpenAIDriverInternals>(driver).isOpenAIErrorRetryable(
|
|
594
|
+
apiError4,
|
|
595
|
+
503,
|
|
596
|
+
null,
|
|
597
|
+
undefined,
|
|
598
|
+
),
|
|
599
|
+
).toBe(true);
|
|
600
|
+
|
|
452
601
|
const apiError5 = new APIError(504, {}, 'Gateway timeout', new Headers());
|
|
453
|
-
expect(
|
|
454
|
-
|
|
602
|
+
expect(
|
|
603
|
+
exposePrivate<BaseOpenAIDriverInternals>(driver).isOpenAIErrorRetryable(
|
|
604
|
+
apiError5,
|
|
605
|
+
504,
|
|
606
|
+
null,
|
|
607
|
+
undefined,
|
|
608
|
+
),
|
|
609
|
+
).toBe(true);
|
|
610
|
+
|
|
455
611
|
const apiError6 = new APIError(529, {}, 'Overloaded', new Headers());
|
|
456
|
-
expect(
|
|
612
|
+
expect(
|
|
613
|
+
exposePrivate<BaseOpenAIDriverInternals>(driver).isOpenAIErrorRetryable(
|
|
614
|
+
apiError6,
|
|
615
|
+
529,
|
|
616
|
+
null,
|
|
617
|
+
undefined,
|
|
618
|
+
),
|
|
619
|
+
).toBe(true);
|
|
457
620
|
});
|
|
458
621
|
|
|
459
622
|
it('should classify 4xx as non-retryable', () => {
|
|
460
623
|
const apiError = new APIError(400, {}, 'Bad request', new Headers());
|
|
461
|
-
expect(
|
|
462
|
-
|
|
624
|
+
expect(
|
|
625
|
+
exposePrivate<BaseOpenAIDriverInternals>(driver).isOpenAIErrorRetryable(apiError, 400, null, undefined),
|
|
626
|
+
).toBe(false);
|
|
627
|
+
|
|
463
628
|
const apiError2 = new APIError(403, {}, 'Forbidden', new Headers());
|
|
464
|
-
expect(
|
|
629
|
+
expect(
|
|
630
|
+
exposePrivate<BaseOpenAIDriverInternals>(driver).isOpenAIErrorRetryable(
|
|
631
|
+
apiError2,
|
|
632
|
+
403,
|
|
633
|
+
null,
|
|
634
|
+
undefined,
|
|
635
|
+
),
|
|
636
|
+
).toBe(false);
|
|
465
637
|
});
|
|
466
638
|
|
|
467
639
|
it('should classify 5xx as retryable', () => {
|
|
468
640
|
const apiError = new APIError(500, {}, 'Internal error', new Headers());
|
|
469
|
-
expect(
|
|
470
|
-
|
|
641
|
+
expect(
|
|
642
|
+
exposePrivate<BaseOpenAIDriverInternals>(driver).isOpenAIErrorRetryable(apiError, 500, null, undefined),
|
|
643
|
+
).toBe(true);
|
|
644
|
+
|
|
471
645
|
const apiError2 = new APIError(502, {}, 'Bad gateway', new Headers());
|
|
472
|
-
expect(
|
|
646
|
+
expect(
|
|
647
|
+
exposePrivate<BaseOpenAIDriverInternals>(driver).isOpenAIErrorRetryable(
|
|
648
|
+
apiError2,
|
|
649
|
+
502,
|
|
650
|
+
null,
|
|
651
|
+
undefined,
|
|
652
|
+
),
|
|
653
|
+
).toBe(true);
|
|
473
654
|
});
|
|
474
655
|
|
|
475
656
|
it('should classify APIConnectionError (non-timeout) as retryable', () => {
|
|
476
657
|
const connectionError = new APIConnectionError({ message: 'Network failure' });
|
|
477
|
-
expect(
|
|
658
|
+
expect(
|
|
659
|
+
exposePrivate<BaseOpenAIDriverInternals>(driver).isOpenAIErrorRetryable(
|
|
660
|
+
connectionError,
|
|
661
|
+
undefined,
|
|
662
|
+
null,
|
|
663
|
+
undefined,
|
|
664
|
+
),
|
|
665
|
+
).toBe(true);
|
|
478
666
|
});
|
|
479
667
|
|
|
480
668
|
it('should return undefined for unknown errors', () => {
|
|
481
|
-
const apiError = new APIError(undefined
|
|
482
|
-
expect(
|
|
669
|
+
const apiError = new APIError(undefined, {}, 'Unknown error', undefined);
|
|
670
|
+
expect(
|
|
671
|
+
exposePrivate<BaseOpenAIDriverInternals>(driver).isOpenAIErrorRetryable(
|
|
672
|
+
apiError,
|
|
673
|
+
undefined,
|
|
674
|
+
null,
|
|
675
|
+
undefined,
|
|
676
|
+
),
|
|
677
|
+
).toBeUndefined();
|
|
483
678
|
});
|
|
484
679
|
});
|
|
485
680
|
|
|
@@ -489,10 +684,10 @@ describe('BaseOpenAIDriver Error Handling', () => {
|
|
|
489
684
|
429,
|
|
490
685
|
{ message: 'Rate limit exceeded' },
|
|
491
686
|
'Rate limit exceeded',
|
|
492
|
-
new Headers()
|
|
687
|
+
new Headers(),
|
|
493
688
|
);
|
|
494
689
|
|
|
495
|
-
const error = driver.formatLlumiverseError(
|
|
690
|
+
const error = driver.formatLlumiverseError(openaiError, {
|
|
496
691
|
provider: 'azure_openai',
|
|
497
692
|
model: 'gpt-4',
|
|
498
693
|
operation: 'execute',
|
|
@@ -509,10 +704,10 @@ describe('BaseOpenAIDriver Error Handling', () => {
|
|
|
509
704
|
400,
|
|
510
705
|
{ message: 'Invalid parameter' },
|
|
511
706
|
'Invalid parameter',
|
|
512
|
-
new Headers()
|
|
707
|
+
new Headers(),
|
|
513
708
|
);
|
|
514
709
|
|
|
515
|
-
const error = driver.formatLlumiverseError(
|
|
710
|
+
const error = driver.formatLlumiverseError(openaiError, {
|
|
516
711
|
provider: 'xai',
|
|
517
712
|
model: 'grok-2',
|
|
518
713
|
operation: 'execute',
|
|
@@ -529,10 +724,10 @@ describe('BaseOpenAIDriver Error Handling', () => {
|
|
|
529
724
|
500,
|
|
530
725
|
{ message: 'Server error' },
|
|
531
726
|
'Server error',
|
|
532
|
-
new Headers()
|
|
727
|
+
new Headers(),
|
|
533
728
|
);
|
|
534
729
|
|
|
535
|
-
const error = driver.formatLlumiverseError(
|
|
730
|
+
const error = driver.formatLlumiverseError(openaiError, {
|
|
536
731
|
provider: 'azure_foundry',
|
|
537
732
|
model: 'gpt-4',
|
|
538
733
|
operation: 'execute',
|
|
@@ -549,10 +744,10 @@ describe('BaseOpenAIDriver Error Handling', () => {
|
|
|
549
744
|
401,
|
|
550
745
|
{ message: 'Invalid API key' },
|
|
551
746
|
'Invalid API key',
|
|
552
|
-
new Headers()
|
|
747
|
+
new Headers(),
|
|
553
748
|
);
|
|
554
749
|
|
|
555
|
-
const error = driver.formatLlumiverseError(
|
|
750
|
+
const error = driver.formatLlumiverseError(openaiError, {
|
|
556
751
|
provider: 'openai_compatible',
|
|
557
752
|
model: 'custom-model',
|
|
558
753
|
operation: 'execute',
|