@llumiverse/drivers 0.23.0 → 0.24.0-dev.20260203.164053Z

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.
Files changed (230) hide show
  1. package/README.md +141 -218
  2. package/package.json +12 -12
  3. package/src/azure/azure_foundry.ts +56 -7
  4. package/src/bedrock/index.ts +188 -24
  5. package/src/groq/index.ts +120 -94
  6. package/src/index.ts +1 -0
  7. package/src/openai/index.ts +363 -136
  8. package/src/openai/openai_compatible.ts +74 -0
  9. package/src/openai/openai_format.ts +44 -54
  10. package/src/vertexai/index.ts +186 -0
  11. package/src/vertexai/models/claude.ts +97 -2
  12. package/src/vertexai/models/gemini.ts +78 -27
  13. package/src/xai/index.ts +10 -17
  14. package/lib/cjs/adobe/firefly.js +0 -120
  15. package/lib/cjs/adobe/firefly.js.map +0 -1
  16. package/lib/cjs/azure/azure_foundry.js +0 -388
  17. package/lib/cjs/azure/azure_foundry.js.map +0 -1
  18. package/lib/cjs/bedrock/converse.js +0 -285
  19. package/lib/cjs/bedrock/converse.js.map +0 -1
  20. package/lib/cjs/bedrock/index.js +0 -966
  21. package/lib/cjs/bedrock/index.js.map +0 -1
  22. package/lib/cjs/bedrock/nova-image-payload.js +0 -207
  23. package/lib/cjs/bedrock/nova-image-payload.js.map +0 -1
  24. package/lib/cjs/bedrock/payloads.js +0 -3
  25. package/lib/cjs/bedrock/payloads.js.map +0 -1
  26. package/lib/cjs/bedrock/s3.js +0 -107
  27. package/lib/cjs/bedrock/s3.js.map +0 -1
  28. package/lib/cjs/bedrock/twelvelabs.js +0 -87
  29. package/lib/cjs/bedrock/twelvelabs.js.map +0 -1
  30. package/lib/cjs/groq/index.js +0 -293
  31. package/lib/cjs/groq/index.js.map +0 -1
  32. package/lib/cjs/huggingface_ie.js +0 -201
  33. package/lib/cjs/huggingface_ie.js.map +0 -1
  34. package/lib/cjs/index.js +0 -30
  35. package/lib/cjs/index.js.map +0 -1
  36. package/lib/cjs/mistral/index.js +0 -173
  37. package/lib/cjs/mistral/index.js.map +0 -1
  38. package/lib/cjs/mistral/types.js +0 -83
  39. package/lib/cjs/mistral/types.js.map +0 -1
  40. package/lib/cjs/openai/azure_openai.js +0 -72
  41. package/lib/cjs/openai/azure_openai.js.map +0 -1
  42. package/lib/cjs/openai/index.js +0 -469
  43. package/lib/cjs/openai/index.js.map +0 -1
  44. package/lib/cjs/openai/openai.js +0 -21
  45. package/lib/cjs/openai/openai.js.map +0 -1
  46. package/lib/cjs/openai/openai_format.js +0 -138
  47. package/lib/cjs/openai/openai_format.js.map +0 -1
  48. package/lib/cjs/package.json +0 -3
  49. package/lib/cjs/replicate.js +0 -275
  50. package/lib/cjs/replicate.js.map +0 -1
  51. package/lib/cjs/test-driver/TestErrorCompletionStream.js +0 -20
  52. package/lib/cjs/test-driver/TestErrorCompletionStream.js.map +0 -1
  53. package/lib/cjs/test-driver/TestValidationErrorCompletionStream.js +0 -24
  54. package/lib/cjs/test-driver/TestValidationErrorCompletionStream.js.map +0 -1
  55. package/lib/cjs/test-driver/index.js +0 -109
  56. package/lib/cjs/test-driver/index.js.map +0 -1
  57. package/lib/cjs/test-driver/utils.js +0 -30
  58. package/lib/cjs/test-driver/utils.js.map +0 -1
  59. package/lib/cjs/togetherai/index.js +0 -126
  60. package/lib/cjs/togetherai/index.js.map +0 -1
  61. package/lib/cjs/togetherai/interfaces.js +0 -3
  62. package/lib/cjs/togetherai/interfaces.js.map +0 -1
  63. package/lib/cjs/vertexai/debug.js +0 -12
  64. package/lib/cjs/vertexai/debug.js.map +0 -1
  65. package/lib/cjs/vertexai/embeddings/embeddings-image.js +0 -27
  66. package/lib/cjs/vertexai/embeddings/embeddings-image.js.map +0 -1
  67. package/lib/cjs/vertexai/embeddings/embeddings-text.js +0 -23
  68. package/lib/cjs/vertexai/embeddings/embeddings-text.js.map +0 -1
  69. package/lib/cjs/vertexai/index.js +0 -429
  70. package/lib/cjs/vertexai/index.js.map +0 -1
  71. package/lib/cjs/vertexai/models/claude.js +0 -399
  72. package/lib/cjs/vertexai/models/claude.js.map +0 -1
  73. package/lib/cjs/vertexai/models/gemini.js +0 -832
  74. package/lib/cjs/vertexai/models/gemini.js.map +0 -1
  75. package/lib/cjs/vertexai/models/imagen.js +0 -303
  76. package/lib/cjs/vertexai/models/imagen.js.map +0 -1
  77. package/lib/cjs/vertexai/models/llama.js +0 -183
  78. package/lib/cjs/vertexai/models/llama.js.map +0 -1
  79. package/lib/cjs/vertexai/models.js +0 -35
  80. package/lib/cjs/vertexai/models.js.map +0 -1
  81. package/lib/cjs/watsonx/index.js +0 -161
  82. package/lib/cjs/watsonx/index.js.map +0 -1
  83. package/lib/cjs/watsonx/interfaces.js +0 -3
  84. package/lib/cjs/watsonx/interfaces.js.map +0 -1
  85. package/lib/cjs/xai/index.js +0 -71
  86. package/lib/cjs/xai/index.js.map +0 -1
  87. package/lib/esm/adobe/firefly.js +0 -116
  88. package/lib/esm/adobe/firefly.js.map +0 -1
  89. package/lib/esm/azure/azure_foundry.js +0 -382
  90. package/lib/esm/azure/azure_foundry.js.map +0 -1
  91. package/lib/esm/bedrock/converse.js +0 -278
  92. package/lib/esm/bedrock/converse.js.map +0 -1
  93. package/lib/esm/bedrock/index.js +0 -962
  94. package/lib/esm/bedrock/index.js.map +0 -1
  95. package/lib/esm/bedrock/nova-image-payload.js +0 -203
  96. package/lib/esm/bedrock/nova-image-payload.js.map +0 -1
  97. package/lib/esm/bedrock/payloads.js +0 -2
  98. package/lib/esm/bedrock/payloads.js.map +0 -1
  99. package/lib/esm/bedrock/s3.js +0 -99
  100. package/lib/esm/bedrock/s3.js.map +0 -1
  101. package/lib/esm/bedrock/twelvelabs.js +0 -84
  102. package/lib/esm/bedrock/twelvelabs.js.map +0 -1
  103. package/lib/esm/groq/index.js +0 -286
  104. package/lib/esm/groq/index.js.map +0 -1
  105. package/lib/esm/huggingface_ie.js +0 -197
  106. package/lib/esm/huggingface_ie.js.map +0 -1
  107. package/lib/esm/index.js +0 -14
  108. package/lib/esm/index.js.map +0 -1
  109. package/lib/esm/mistral/index.js +0 -169
  110. package/lib/esm/mistral/index.js.map +0 -1
  111. package/lib/esm/mistral/types.js +0 -80
  112. package/lib/esm/mistral/types.js.map +0 -1
  113. package/lib/esm/openai/azure_openai.js +0 -68
  114. package/lib/esm/openai/azure_openai.js.map +0 -1
  115. package/lib/esm/openai/index.js +0 -464
  116. package/lib/esm/openai/index.js.map +0 -1
  117. package/lib/esm/openai/openai.js +0 -14
  118. package/lib/esm/openai/openai.js.map +0 -1
  119. package/lib/esm/openai/openai_format.js +0 -134
  120. package/lib/esm/openai/openai_format.js.map +0 -1
  121. package/lib/esm/replicate.js +0 -268
  122. package/lib/esm/replicate.js.map +0 -1
  123. package/lib/esm/test-driver/TestErrorCompletionStream.js +0 -16
  124. package/lib/esm/test-driver/TestErrorCompletionStream.js.map +0 -1
  125. package/lib/esm/test-driver/TestValidationErrorCompletionStream.js +0 -20
  126. package/lib/esm/test-driver/TestValidationErrorCompletionStream.js.map +0 -1
  127. package/lib/esm/test-driver/index.js +0 -91
  128. package/lib/esm/test-driver/index.js.map +0 -1
  129. package/lib/esm/test-driver/utils.js +0 -25
  130. package/lib/esm/test-driver/utils.js.map +0 -1
  131. package/lib/esm/togetherai/index.js +0 -122
  132. package/lib/esm/togetherai/index.js.map +0 -1
  133. package/lib/esm/togetherai/interfaces.js +0 -2
  134. package/lib/esm/togetherai/interfaces.js.map +0 -1
  135. package/lib/esm/vertexai/debug.js +0 -6
  136. package/lib/esm/vertexai/debug.js.map +0 -1
  137. package/lib/esm/vertexai/embeddings/embeddings-image.js +0 -24
  138. package/lib/esm/vertexai/embeddings/embeddings-image.js.map +0 -1
  139. package/lib/esm/vertexai/embeddings/embeddings-text.js +0 -20
  140. package/lib/esm/vertexai/embeddings/embeddings-text.js.map +0 -1
  141. package/lib/esm/vertexai/index.js +0 -424
  142. package/lib/esm/vertexai/index.js.map +0 -1
  143. package/lib/esm/vertexai/models/claude.js +0 -394
  144. package/lib/esm/vertexai/models/claude.js.map +0 -1
  145. package/lib/esm/vertexai/models/gemini.js +0 -827
  146. package/lib/esm/vertexai/models/gemini.js.map +0 -1
  147. package/lib/esm/vertexai/models/imagen.js +0 -299
  148. package/lib/esm/vertexai/models/imagen.js.map +0 -1
  149. package/lib/esm/vertexai/models/llama.js +0 -179
  150. package/lib/esm/vertexai/models/llama.js.map +0 -1
  151. package/lib/esm/vertexai/models.js +0 -32
  152. package/lib/esm/vertexai/models.js.map +0 -1
  153. package/lib/esm/watsonx/index.js +0 -157
  154. package/lib/esm/watsonx/index.js.map +0 -1
  155. package/lib/esm/watsonx/interfaces.js +0 -2
  156. package/lib/esm/watsonx/interfaces.js.map +0 -1
  157. package/lib/esm/xai/index.js +0 -64
  158. package/lib/esm/xai/index.js.map +0 -1
  159. package/lib/types/adobe/firefly.d.ts +0 -30
  160. package/lib/types/adobe/firefly.d.ts.map +0 -1
  161. package/lib/types/azure/azure_foundry.d.ts +0 -50
  162. package/lib/types/azure/azure_foundry.d.ts.map +0 -1
  163. package/lib/types/bedrock/converse.d.ts +0 -9
  164. package/lib/types/bedrock/converse.d.ts.map +0 -1
  165. package/lib/types/bedrock/index.d.ts +0 -63
  166. package/lib/types/bedrock/index.d.ts.map +0 -1
  167. package/lib/types/bedrock/nova-image-payload.d.ts +0 -74
  168. package/lib/types/bedrock/nova-image-payload.d.ts.map +0 -1
  169. package/lib/types/bedrock/payloads.d.ts +0 -12
  170. package/lib/types/bedrock/payloads.d.ts.map +0 -1
  171. package/lib/types/bedrock/s3.d.ts +0 -23
  172. package/lib/types/bedrock/s3.d.ts.map +0 -1
  173. package/lib/types/bedrock/twelvelabs.d.ts +0 -50
  174. package/lib/types/bedrock/twelvelabs.d.ts.map +0 -1
  175. package/lib/types/groq/index.d.ts +0 -27
  176. package/lib/types/groq/index.d.ts.map +0 -1
  177. package/lib/types/huggingface_ie.d.ts +0 -35
  178. package/lib/types/huggingface_ie.d.ts.map +0 -1
  179. package/lib/types/index.d.ts +0 -14
  180. package/lib/types/index.d.ts.map +0 -1
  181. package/lib/types/mistral/index.d.ts +0 -25
  182. package/lib/types/mistral/index.d.ts.map +0 -1
  183. package/lib/types/mistral/types.d.ts +0 -132
  184. package/lib/types/mistral/types.d.ts.map +0 -1
  185. package/lib/types/openai/azure_openai.d.ts +0 -25
  186. package/lib/types/openai/azure_openai.d.ts.map +0 -1
  187. package/lib/types/openai/index.d.ts +0 -25
  188. package/lib/types/openai/index.d.ts.map +0 -1
  189. package/lib/types/openai/openai.d.ts +0 -15
  190. package/lib/types/openai/openai.d.ts.map +0 -1
  191. package/lib/types/openai/openai_format.d.ts +0 -19
  192. package/lib/types/openai/openai_format.d.ts.map +0 -1
  193. package/lib/types/replicate.d.ts +0 -48
  194. package/lib/types/replicate.d.ts.map +0 -1
  195. package/lib/types/test-driver/TestErrorCompletionStream.d.ts +0 -9
  196. package/lib/types/test-driver/TestErrorCompletionStream.d.ts.map +0 -1
  197. package/lib/types/test-driver/TestValidationErrorCompletionStream.d.ts +0 -9
  198. package/lib/types/test-driver/TestValidationErrorCompletionStream.d.ts.map +0 -1
  199. package/lib/types/test-driver/index.d.ts +0 -24
  200. package/lib/types/test-driver/index.d.ts.map +0 -1
  201. package/lib/types/test-driver/utils.d.ts +0 -5
  202. package/lib/types/test-driver/utils.d.ts.map +0 -1
  203. package/lib/types/togetherai/index.d.ts +0 -23
  204. package/lib/types/togetherai/index.d.ts.map +0 -1
  205. package/lib/types/togetherai/interfaces.d.ts +0 -96
  206. package/lib/types/togetherai/interfaces.d.ts.map +0 -1
  207. package/lib/types/vertexai/debug.d.ts +0 -2
  208. package/lib/types/vertexai/debug.d.ts.map +0 -1
  209. package/lib/types/vertexai/embeddings/embeddings-image.d.ts +0 -11
  210. package/lib/types/vertexai/embeddings/embeddings-image.d.ts.map +0 -1
  211. package/lib/types/vertexai/embeddings/embeddings-text.d.ts +0 -10
  212. package/lib/types/vertexai/embeddings/embeddings-text.d.ts.map +0 -1
  213. package/lib/types/vertexai/index.d.ts +0 -54
  214. package/lib/types/vertexai/index.d.ts.map +0 -1
  215. package/lib/types/vertexai/models/claude.d.ts +0 -20
  216. package/lib/types/vertexai/models/claude.d.ts.map +0 -1
  217. package/lib/types/vertexai/models/gemini.d.ts +0 -18
  218. package/lib/types/vertexai/models/gemini.d.ts.map +0 -1
  219. package/lib/types/vertexai/models/imagen.d.ts +0 -75
  220. package/lib/types/vertexai/models/imagen.d.ts.map +0 -1
  221. package/lib/types/vertexai/models/llama.d.ts +0 -20
  222. package/lib/types/vertexai/models/llama.d.ts.map +0 -1
  223. package/lib/types/vertexai/models.d.ts +0 -15
  224. package/lib/types/vertexai/models.d.ts.map +0 -1
  225. package/lib/types/watsonx/index.d.ts +0 -27
  226. package/lib/types/watsonx/index.d.ts.map +0 -1
  227. package/lib/types/watsonx/interfaces.d.ts +0 -65
  228. package/lib/types/watsonx/interfaces.d.ts.map +0 -1
  229. package/lib/types/xai/index.d.ts +0 -19
  230. package/lib/types/xai/index.d.ts.map +0 -1
@@ -1,382 +0,0 @@
1
- import { DefaultAzureCredential, getBearerTokenProvider } from "@azure/identity";
2
- import { AbstractDriver, getModelCapabilities, modelModalitiesToArray, Providers } from "@llumiverse/core";
3
- import { AIProjectClient } from '@azure/ai-projects';
4
- import { isUnexpected } from "@azure-rest/ai-inference";
5
- import { AzureOpenAIDriver } from "../openai/azure_openai.js";
6
- import { createSseStream } from "@azure/core-sse";
7
- import { formatOpenAILikeMultimodalPrompt } from "../openai/openai_format.js";
8
- export class AzureFoundryDriver extends AbstractDriver {
9
- service;
10
- provider = Providers.azure_foundry;
11
- OPENAI_API_VERSION = "2025-01-01-preview";
12
- INFERENCE_API_VERSION = "2024-05-01-preview";
13
- constructor(opts) {
14
- super(opts);
15
- this.formatPrompt = formatOpenAILikeMultimodalPrompt;
16
- if (!opts.endpoint) {
17
- throw new Error("Azure AI Foundry endpoint is required");
18
- }
19
- try {
20
- if (!opts.azureADTokenProvider) {
21
- // Using Microsoft Entra ID (Azure AD) for authentication
22
- opts.azureADTokenProvider = new DefaultAzureCredential();
23
- }
24
- }
25
- catch (error) {
26
- this.logger.error({ error }, "Failed to initialize Azure AD token provider:");
27
- throw new Error("Failed to initialize Azure AD token provider");
28
- }
29
- // Initialize AI Projects client which provides access to inference operations
30
- this.service = new AIProjectClient(opts.endpoint, opts.azureADTokenProvider);
31
- if (opts.apiVersion) {
32
- this.OPENAI_API_VERSION = opts.apiVersion;
33
- this.INFERENCE_API_VERSION = opts.apiVersion;
34
- this.logger.info(`[Azure Foundry] Overriding default API version, using API version: ${opts.apiVersion}`);
35
- }
36
- }
37
- /**
38
- * Get default authentication for Azure AI Foundry API
39
- */
40
- getDefaultAIFoundryAuth() {
41
- const scope = "https://ai.azure.com/.default";
42
- const azureADTokenProvider = getBearerTokenProvider(new DefaultAzureCredential(), scope);
43
- return azureADTokenProvider;
44
- }
45
- async isOpenAIDeployment(model) {
46
- const { deploymentName } = parseAzureFoundryModelId(model);
47
- let deployment = undefined;
48
- // First, verify the deployment exists
49
- try {
50
- deployment = await this.service.deployments.get(deploymentName);
51
- this.logger.debug(`[Azure Foundry] Deployment ${deploymentName} found`);
52
- }
53
- catch (deploymentError) {
54
- this.logger.error({ deploymentError }, `[Azure Foundry] Deployment ${deploymentName} not found:`);
55
- }
56
- return deployment.modelPublisher == "OpenAI";
57
- }
58
- canStream(_options) {
59
- return Promise.resolve(true);
60
- }
61
- async requestTextCompletion(prompt, options) {
62
- const { deploymentName } = parseAzureFoundryModelId(options.model);
63
- const model_options = options.model_options;
64
- const isOpenAI = await this.isOpenAIDeployment(options.model);
65
- let response;
66
- if (isOpenAI) {
67
- // Use the Azure OpenAI client for OpenAI models
68
- const azureOpenAI = await this.service.inference.azureOpenAI({ apiVersion: this.OPENAI_API_VERSION });
69
- const subDriver = new AzureOpenAIDriver(azureOpenAI);
70
- // Use deployment name for API calls
71
- const modifiedOptions = { ...options, model: deploymentName };
72
- const response = await subDriver.requestTextCompletion(prompt, modifiedOptions);
73
- return response;
74
- }
75
- else {
76
- // Use the chat completions client from the inference operations
77
- const chatClient = this.service.inference.chatCompletions({ apiVersion: this.INFERENCE_API_VERSION });
78
- response = await chatClient.post({
79
- body: {
80
- messages: prompt,
81
- max_tokens: model_options?.max_tokens,
82
- model: deploymentName,
83
- stream: true,
84
- temperature: model_options?.temperature,
85
- top_p: model_options?.top_p,
86
- frequency_penalty: model_options?.frequency_penalty,
87
- presence_penalty: model_options?.presence_penalty,
88
- stop: model_options?.stop_sequence,
89
- }
90
- });
91
- if (response.status !== "200") {
92
- this.logger.error({ response }, `[Azure Foundry] Chat completion request failed:`);
93
- throw new Error(`Chat completion request failed with status ${response.status}: ${response.body}`);
94
- }
95
- return this.extractDataFromResponse(response.body);
96
- }
97
- }
98
- async requestTextCompletionStream(prompt, options) {
99
- const { deploymentName } = parseAzureFoundryModelId(options.model);
100
- const model_options = options.model_options;
101
- const isOpenAI = await this.isOpenAIDeployment(options.model);
102
- if (isOpenAI) {
103
- const azureOpenAI = await this.service.inference.azureOpenAI({ apiVersion: this.OPENAI_API_VERSION });
104
- const subDriver = new AzureOpenAIDriver(azureOpenAI);
105
- const modifiedOptions = { ...options, model: deploymentName };
106
- const stream = await subDriver.requestTextCompletionStream(prompt, modifiedOptions);
107
- return stream;
108
- }
109
- else {
110
- const chatClient = this.service.inference.chatCompletions({ apiVersion: this.INFERENCE_API_VERSION });
111
- const response = await chatClient.post({
112
- body: {
113
- messages: prompt,
114
- max_tokens: model_options?.max_tokens,
115
- model: deploymentName,
116
- stream: true,
117
- temperature: model_options?.temperature,
118
- top_p: model_options?.top_p,
119
- frequency_penalty: model_options?.frequency_penalty,
120
- presence_penalty: model_options?.presence_penalty,
121
- stop: model_options?.stop_sequence,
122
- }
123
- }).asNodeStream();
124
- // We type assert from NodeJS.ReadableStream to NodeJSReadableStream
125
- // The Azure Examples, expect a .destroy() method on the stream
126
- const stream = response.body;
127
- if (!stream) {
128
- throw new Error("The response stream is undefined");
129
- }
130
- if (response.status !== "200") {
131
- stream.destroy();
132
- throw new Error(`Failed to get chat completions, http operation failed with ${response.status} code`);
133
- }
134
- const sseStream = createSseStream(stream);
135
- return this.processStreamResponse(sseStream);
136
- }
137
- }
138
- async *processStreamResponse(sseStream) {
139
- try {
140
- for await (const event of sseStream) {
141
- if (event.data === "[DONE]") {
142
- break;
143
- }
144
- try {
145
- const data = JSON.parse(event.data);
146
- if (!data) {
147
- this.logger.warn(`[Azure Foundry] Received empty data in streaming response`);
148
- continue;
149
- }
150
- const choice = data.choices?.[0];
151
- if (!choice) {
152
- continue;
153
- }
154
- const chunk = {
155
- result: choice.delta?.content || "",
156
- finish_reason: this.convertFinishReason(choice.finish_reason),
157
- token_usage: {
158
- prompt: data.usage?.prompt_tokens,
159
- result: data.usage?.completion_tokens,
160
- total: data.usage?.total_tokens,
161
- },
162
- };
163
- yield chunk;
164
- }
165
- catch (parseError) {
166
- this.logger.warn({ parseError }, `[Azure Foundry] Failed to parse streaming response:`);
167
- continue;
168
- }
169
- }
170
- }
171
- catch (error) {
172
- this.logger.error({ error }, `[Azure Foundry] Streaming error:`);
173
- throw error;
174
- }
175
- }
176
- extractDataFromResponse(result) {
177
- const tokenInfo = {
178
- prompt: result.usage?.prompt_tokens,
179
- result: result.usage?.completion_tokens,
180
- total: result.usage?.total_tokens,
181
- };
182
- const choice = result.choices?.[0];
183
- if (!choice) {
184
- this.logger.error({ result }, "[Azure Foundry] No choices in response");
185
- throw new Error("No choices in response");
186
- }
187
- const data = choice.message?.content;
188
- const toolCalls = choice.message?.tool_calls;
189
- if (!data && !toolCalls) {
190
- this.logger.error({ result }, "[Azure Foundry] Response is not valid");
191
- throw new Error("Response is not valid: no content or tool calls");
192
- }
193
- const completion = {
194
- result: data ? [{ type: "text", value: data }] : [],
195
- token_usage: tokenInfo,
196
- finish_reason: this.convertFinishReason(choice.finish_reason),
197
- };
198
- if (toolCalls && toolCalls.length > 0) {
199
- completion.tool_use = toolCalls.map((call) => ({
200
- id: call.id,
201
- tool_name: call.function?.name,
202
- tool_input: call.function?.arguments ? JSON.parse(call.function.arguments) : {}
203
- }));
204
- }
205
- return completion;
206
- }
207
- convertFinishReason(reason) {
208
- if (!reason)
209
- return undefined;
210
- // Map Azure AI finish reasons to standard format
211
- switch (reason) {
212
- case 'stop': return 'stop';
213
- case 'length': return 'length';
214
- case 'tool_calls': return 'tool_use';
215
- default: return reason;
216
- }
217
- }
218
- async validateConnection() {
219
- try {
220
- // Test the AI Projects client by listing deployments
221
- const deploymentsIterable = this.service.deployments.list();
222
- let hasDeployments = false;
223
- for await (const deployment of deploymentsIterable) {
224
- hasDeployments = true;
225
- this.logger.debug(`[Azure Foundry] Found deployment: ${deployment.name} (${deployment.type})`);
226
- break; // Just check if we can get at least one deployment
227
- }
228
- if (!hasDeployments) {
229
- this.logger.warn("[Azure Foundry] No deployments found in the project");
230
- }
231
- return true;
232
- }
233
- catch (error) {
234
- this.logger.error({ error }, "Azure Foundry connection validation failed:");
235
- return false;
236
- }
237
- }
238
- async generateEmbeddings(options) {
239
- if (!options.model) {
240
- throw new Error("Default embedding model selection not supported for Azure Foundry. Please specify a model.");
241
- }
242
- if (options.text) {
243
- return this.generateTextEmbeddings(options);
244
- }
245
- else if (options.image) {
246
- return this.generateImageEmbeddings(options);
247
- }
248
- else {
249
- throw new Error("No text or images provided for embeddings");
250
- }
251
- }
252
- async generateTextEmbeddings(options) {
253
- if (!options.text) {
254
- throw new Error("No text provided for text embeddings");
255
- }
256
- const { deploymentName } = parseAzureFoundryModelId(options.model || "");
257
- let response;
258
- try {
259
- // Use the embeddings client from the inference operations
260
- const embeddingsClient = this.service.inference.embeddings({ apiVersion: this.INFERENCE_API_VERSION });
261
- response = await embeddingsClient.post({
262
- body: {
263
- input: Array.isArray(options.text) ? options.text : [options.text],
264
- model: deploymentName
265
- }
266
- });
267
- }
268
- catch (error) {
269
- this.logger.error({ error }, "Azure Foundry text embeddings error:");
270
- throw error;
271
- }
272
- if (isUnexpected(response)) {
273
- throw new Error(`Text embeddings request failed: ${response.status} ${response.body?.error?.message || 'Unknown error'}`);
274
- }
275
- const embeddings = response.body.data?.[0]?.embedding;
276
- if (!embeddings || !Array.isArray(embeddings) || embeddings.length === 0) {
277
- throw new Error("No valid embedding array found in response");
278
- }
279
- return {
280
- values: embeddings,
281
- model: options.model ?? ""
282
- };
283
- }
284
- async generateImageEmbeddings(options) {
285
- if (!options.image) {
286
- throw new Error("No images provided for image embeddings");
287
- }
288
- const { deploymentName } = parseAzureFoundryModelId(options.model || "");
289
- let response;
290
- try {
291
- // Use the embeddings client from the inference operations
292
- const embeddingsClient = this.service.inference.embeddings({ apiVersion: this.INFERENCE_API_VERSION });
293
- response = await embeddingsClient.post({
294
- body: {
295
- input: Array.isArray(options.image) ? options.image : [options.image],
296
- model: deploymentName
297
- }
298
- });
299
- }
300
- catch (error) {
301
- this.logger.error({ error }, "Azure Foundry image embeddings error:");
302
- throw error;
303
- }
304
- if (isUnexpected(response)) {
305
- throw new Error(`Image embeddings request failed: ${response.status} ${response.body?.error?.message || 'Unknown error'}`);
306
- }
307
- const embeddings = response.body.data?.[0]?.embedding;
308
- if (!embeddings || !Array.isArray(embeddings) || embeddings.length === 0) {
309
- throw new Error("No valid embedding array found in response");
310
- }
311
- return {
312
- values: embeddings,
313
- model: options.model ?? ""
314
- };
315
- }
316
- async listModels() {
317
- const filter = (m) => {
318
- // Only include models that support chat completions
319
- return !!m.capabilities.chat_completion;
320
- };
321
- return this._listModels(filter);
322
- }
323
- async _listModels(filter) {
324
- let deploymentsIterable;
325
- try {
326
- // List all deployments in the Azure AI Foundry project
327
- deploymentsIterable = this.service.deployments.list();
328
- }
329
- catch (error) {
330
- this.logger.error({ error }, "Failed to list deployments:");
331
- throw new Error("Failed to list deployments in Azure AI Foundry project");
332
- }
333
- const deployments = [];
334
- for await (const page of deploymentsIterable.byPage()) {
335
- for (const deployment of page) {
336
- deployments.push(deployment);
337
- }
338
- }
339
- let modelDeployments = deployments.filter((d) => {
340
- return d.type === "ModelDeployment";
341
- });
342
- if (filter) {
343
- modelDeployments = modelDeployments.filter(filter);
344
- }
345
- const aiModels = modelDeployments.map((model) => {
346
- // Create composite ID: deployment_name::base_model
347
- const compositeId = `${model.name}::${model.modelName}`;
348
- const modelCapability = getModelCapabilities(model.modelName, Providers.azure_foundry);
349
- return {
350
- id: compositeId,
351
- name: model.name,
352
- description: `${model.modelName} - ${model.modelVersion}`,
353
- version: model.modelVersion,
354
- provider: this.provider,
355
- owner: model.modelPublisher,
356
- input_modalities: modelModalitiesToArray(modelCapability.input),
357
- output_modalities: modelModalitiesToArray(modelCapability.output),
358
- tool_support: modelCapability.tool_support,
359
- };
360
- }).sort((modelA, modelB) => modelA.id.localeCompare(modelB.id));
361
- return aiModels;
362
- }
363
- }
364
- // Helper functions to parse the composite ID
365
- export function parseAzureFoundryModelId(compositeId) {
366
- const parts = compositeId.split('::');
367
- if (parts.length === 2) {
368
- return {
369
- deploymentName: parts[0],
370
- baseModel: parts[1]
371
- };
372
- }
373
- // Backwards compatibility: if no delimiter found, treat as deployment name
374
- return {
375
- deploymentName: compositeId,
376
- baseModel: compositeId
377
- };
378
- }
379
- export function isCompositeModelId(modelId) {
380
- return modelId.includes('::');
381
- }
382
- //# sourceMappingURL=azure_foundry.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"azure_foundry.js","sourceRoot":"","sources":["../../../src/azure/azure_foundry.ts"],"names":[],"mappings":"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"}
@@ -1,278 +0,0 @@
1
- import { readStreamAsString, readStreamAsUint8Array } from "@llumiverse/core";
2
- import { PromptRole } from "@llumiverse/core";
3
- import { ConversationRole, } from "@aws-sdk/client-bedrock-runtime";
4
- import { parseS3UrlToUri } from "./s3.js";
5
- function roleConversion(role) {
6
- return role === PromptRole.assistant ? ConversationRole.ASSISTANT : ConversationRole.USER;
7
- }
8
- function mimeToImageType(mime) {
9
- if (mime.startsWith("image/")) {
10
- return mime.split("/")[1];
11
- }
12
- return "png";
13
- }
14
- function mimeToDocType(mime) {
15
- if (mime.startsWith("application/") || mime.startsWith("text/")) {
16
- return mime.split("/")[1];
17
- }
18
- return "txt";
19
- }
20
- function mimeToVideoType(mime) {
21
- if (mime.startsWith("video/")) {
22
- return mime.split("/")[1];
23
- }
24
- return "mp4";
25
- }
26
- async function processFile(f, mode) {
27
- const source = await f.getStream();
28
- //Image file - "png" | "jpeg" | "gif" | "webp"
29
- if (f.mime_type && f.mime_type.startsWith("image")) {
30
- const imageBlock = {
31
- image: {
32
- format: mimeToImageType(f.mime_type),
33
- source: { bytes: await readStreamAsUint8Array(source) },
34
- }
35
- };
36
- return mode === 'content'
37
- ? imageBlock
38
- : imageBlock;
39
- }
40
- //Document file - "pdf | csv | doc | docx | xls | xlsx | html | txt | md"
41
- else if (f.mime_type && (f.mime_type.startsWith("text") || f.mime_type?.startsWith("application"))) {
42
- // Handle JSON files specially
43
- if (f.mime_type === "application/json" || (f.name && f.name.endsWith('.json'))) {
44
- const jsonContent = await readStreamAsString(source);
45
- try {
46
- const parsedJson = JSON.parse(jsonContent);
47
- if (mode === 'tool') {
48
- return { json: parsedJson };
49
- }
50
- else {
51
- // ContentBlock doesn't support JSON, so treat as text
52
- return { text: jsonContent };
53
- }
54
- }
55
- catch (error) {
56
- const textBlock = { text: jsonContent };
57
- return mode === 'content'
58
- ? textBlock
59
- : textBlock;
60
- }
61
- }
62
- else {
63
- const documentBlock = {
64
- document: {
65
- format: mimeToDocType(f.mime_type),
66
- name: f.name,
67
- source: { bytes: await readStreamAsUint8Array(source) },
68
- },
69
- };
70
- return mode === 'content'
71
- ? documentBlock
72
- : documentBlock;
73
- }
74
- }
75
- //Video file - "mov | mkv | mp4 | webm | flv | mpeg | mpg | wmv | three_gp"
76
- else if (f.mime_type && f.mime_type.startsWith("video")) {
77
- let url_string = (await f.getURL()).toLowerCase();
78
- let url_format = new URL(url_string);
79
- if (url_format.hostname.endsWith("amazonaws.com") &&
80
- (url_format.hostname.startsWith("s3.") || url_format.hostname.includes(".s3."))) {
81
- //Convert to s3:// format
82
- const parsedUrl = parseS3UrlToUri(new URL(url_string));
83
- url_string = parsedUrl;
84
- url_format = new URL(parsedUrl);
85
- }
86
- const videoBlock = url_format.protocol === "s3:" ? {
87
- video: {
88
- format: mimeToVideoType(f.mime_type),
89
- source: {
90
- s3Location: {
91
- uri: url_string, //S3 URL
92
- //bucketOwner: We don't have this additional information.
93
- }
94
- },
95
- },
96
- } : {
97
- video: {
98
- format: mimeToVideoType(f.mime_type),
99
- source: { bytes: await readStreamAsUint8Array(source) },
100
- },
101
- };
102
- return mode === 'content'
103
- ? videoBlock
104
- : videoBlock;
105
- }
106
- //Fallback, send as text
107
- else {
108
- const textBlock = { text: await readStreamAsString(source) };
109
- return mode === 'content'
110
- ? textBlock
111
- : textBlock;
112
- }
113
- }
114
- async function processFileToContentBlock(f) {
115
- try {
116
- return processFile(f, 'content');
117
- }
118
- catch (error) {
119
- throw new Error(`Failed to process file ${f.name} for prompt: ${error instanceof Error ? error.message : String(error)}`);
120
- }
121
- }
122
- async function processFileToToolContentBlock(f) {
123
- try {
124
- return processFile(f, 'tool');
125
- }
126
- catch (error) {
127
- throw new Error(`Failed to process file ${f.name} for tool response: ${error instanceof Error ? error.message : String(error)}`);
128
- }
129
- }
130
- export function converseConcatMessages(messages) {
131
- if (!messages || messages.length === 0)
132
- return [];
133
- const needsMerging = messages.some((message, i) => i < messages.length - 1 && message.role === messages[i + 1].role);
134
- // If no merging needed, return original array
135
- if (!needsMerging) {
136
- return messages;
137
- }
138
- const result = [];
139
- let currentMessage = { ...messages[0] };
140
- for (let i = 1; i < messages.length; i++) {
141
- if (currentMessage.role === messages[i].role) {
142
- // Same role - concatenate content
143
- currentMessage.content = (currentMessage.content || []).concat(...(messages[i].content || []));
144
- }
145
- else {
146
- // Different role - push current and start new
147
- result.push(currentMessage);
148
- currentMessage = { ...messages[i] };
149
- }
150
- }
151
- result.push(currentMessage);
152
- return result;
153
- }
154
- export function converseSystemToMessages(system) {
155
- return {
156
- content: [{ text: system.map(system => system.text).join('\n').trim() }],
157
- role: ConversationRole.USER
158
- };
159
- }
160
- export function converseRemoveJSONprefill(messages) {
161
- //Remove the "```json" stop message
162
- if (messages && messages.length > 0) {
163
- if (messages[messages.length - 1].content?.[0].text === "```json") {
164
- messages.pop();
165
- }
166
- }
167
- return messages ?? [];
168
- }
169
- export function converseJSONprefill(messages) {
170
- if (!messages) {
171
- messages = [];
172
- }
173
- //prefill the json
174
- messages.push({
175
- content: [{ text: "```json" }],
176
- role: ConversationRole.ASSISTANT,
177
- });
178
- return messages;
179
- }
180
- // Used to ignore unsupported roles. Typically these are things like image specific roles.
181
- const unsupportedRoles = [
182
- PromptRole.negative,
183
- PromptRole.mask,
184
- ];
185
- export async function formatConversePrompt(segments, options) {
186
- //Non-const for concat
187
- let system = [];
188
- const safety = [];
189
- let messages = [];
190
- for (const segment of segments) {
191
- // Role dependent processing
192
- if (segment.role === PromptRole.system) {
193
- system.push({ text: segment.content });
194
- }
195
- else if (segment.role === PromptRole.tool) {
196
- if (!segment.tool_use_id) {
197
- throw new Error("Tool use ID is required for tool segments");
198
- }
199
- //Tool use results (i.e. the model has requested a tool and this it the answer to that request)
200
- const toolContentBlocks = [];
201
- //Text segments
202
- if (segment.content) {
203
- toolContentBlocks.push({ text: segment.content });
204
- }
205
- //Handle attached files
206
- for (const file of segment.files ?? []) {
207
- toolContentBlocks.push(await processFileToToolContentBlock(file));
208
- }
209
- messages.push({
210
- content: [{
211
- toolResult: {
212
- toolUseId: segment.tool_use_id,
213
- content: toolContentBlocks,
214
- }
215
- }],
216
- role: ConversationRole.USER
217
- });
218
- }
219
- else if (!unsupportedRoles.includes(segment.role)) {
220
- //User, Assistant or safety roles
221
- const contentBlocks = [];
222
- //Text segments
223
- if (segment.content) {
224
- contentBlocks.push({ text: segment.content });
225
- }
226
- //Handle attached files
227
- for (const file of segment.files ?? []) {
228
- contentBlocks.push(await processFileToContentBlock(file));
229
- }
230
- //If there are no content blocks, skip this message
231
- if (contentBlocks.length !== 0) {
232
- const message = { content: contentBlocks, role: roleConversion(segment.role) };
233
- if (segment.role === PromptRole.safety) {
234
- safety.push(message);
235
- }
236
- else {
237
- messages.push(message);
238
- }
239
- }
240
- }
241
- }
242
- if (options.result_schema) {
243
- let schemaText;
244
- if (options.tools && options.tools.length > 0) {
245
- schemaText = "When not calling tools, the answer must be a JSON object using the following JSON Schema:\n" + JSON.stringify(options.result_schema, undefined, 2);
246
- }
247
- else {
248
- schemaText = "The answer must be a JSON object using the following JSON Schema:\n" + JSON.stringify(options.result_schema, undefined, 2);
249
- }
250
- system.push({ text: "IMPORTANT: " + schemaText });
251
- }
252
- // Safety messages are user messages that should be included at the end.
253
- if (safety.length > 0) {
254
- messages = messages.concat(safety);
255
- }
256
- //Conversations must start with a user message
257
- //Use the system messages if none are provided
258
- if (messages.length === 0) {
259
- const systemMessage = converseSystemToMessages(system);
260
- if (systemMessage?.content?.[0]?.text?.trim()) {
261
- messages.push(systemMessage);
262
- }
263
- else {
264
- throw new Error("Prompt must contain at least one message");
265
- }
266
- system = undefined;
267
- }
268
- if (system && system.length === 0) {
269
- system = undefined; // If no system messages, set to undefined
270
- }
271
- messages = converseConcatMessages(messages);
272
- return {
273
- modelId: undefined, //required property, but allowed to be undefined
274
- messages: messages,
275
- system: system,
276
- };
277
- }
278
- //# sourceMappingURL=converse.js.map