@providerprotocol/ai 0.0.34 → 0.0.35

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 (133) hide show
  1. package/README.md +542 -3
  2. package/dist/anthropic/index.d.ts +2 -1
  3. package/dist/anthropic/index.js +151 -145
  4. package/dist/anthropic/index.js.map +1 -1
  5. package/dist/cerebras/index.d.ts +392 -0
  6. package/dist/cerebras/index.js +648 -0
  7. package/dist/cerebras/index.js.map +1 -0
  8. package/dist/chunk-3GWM5GR3.js +153 -0
  9. package/dist/chunk-3GWM5GR3.js.map +1 -0
  10. package/dist/chunk-4OGB7JZA.js +157 -0
  11. package/dist/chunk-4OGB7JZA.js.map +1 -0
  12. package/dist/chunk-7DXVRILR.js +49 -0
  13. package/dist/chunk-7DXVRILR.js.map +1 -0
  14. package/dist/{chunk-3C7O2RNO.js → chunk-A2IM7PGT.js} +6 -4
  15. package/dist/{chunk-3C7O2RNO.js.map → chunk-A2IM7PGT.js.map} +1 -1
  16. package/dist/{chunk-3D6XGGVG.js → chunk-ARVM24K2.js} +2 -2
  17. package/dist/{chunk-4J6OFUKX.js → chunk-AY55T37A.js} +70 -162
  18. package/dist/chunk-AY55T37A.js.map +1 -0
  19. package/dist/{chunk-ILR2D5PN.js → chunk-BRP5XJ6Q.js} +2 -86
  20. package/dist/chunk-BRP5XJ6Q.js.map +1 -0
  21. package/dist/chunk-C4JP64VW.js +298 -0
  22. package/dist/chunk-C4JP64VW.js.map +1 -0
  23. package/dist/chunk-COS4ON4G.js +111 -0
  24. package/dist/chunk-COS4ON4G.js.map +1 -0
  25. package/dist/chunk-ETBFOLQN.js +34 -0
  26. package/dist/chunk-ETBFOLQN.js.map +1 -0
  27. package/dist/chunk-HB4ZIH3T.js +31 -0
  28. package/dist/chunk-HB4ZIH3T.js.map +1 -0
  29. package/dist/chunk-I53CI6ZZ.js +142 -0
  30. package/dist/chunk-I53CI6ZZ.js.map +1 -0
  31. package/dist/chunk-IDZOVWP3.js +29 -0
  32. package/dist/chunk-IDZOVWP3.js.map +1 -0
  33. package/dist/chunk-JA3UZALR.js +88 -0
  34. package/dist/chunk-JA3UZALR.js.map +1 -0
  35. package/dist/{chunk-WAKD3OO5.js → chunk-N5DX5JW3.js} +31 -31
  36. package/dist/chunk-N5DX5JW3.js.map +1 -0
  37. package/dist/chunk-OIEWDFQU.js +97 -0
  38. package/dist/chunk-OIEWDFQU.js.map +1 -0
  39. package/dist/{chunk-TOJCZMVU.js → chunk-PMK5LZ5Z.js} +40 -40
  40. package/dist/chunk-PMK5LZ5Z.js.map +1 -0
  41. package/dist/chunk-UFFJDYCE.js +94 -0
  42. package/dist/chunk-UFFJDYCE.js.map +1 -0
  43. package/dist/chunk-VGKZIGVI.js +222 -0
  44. package/dist/chunk-VGKZIGVI.js.map +1 -0
  45. package/dist/chunk-VOEWHQUB.js +31 -0
  46. package/dist/chunk-VOEWHQUB.js.map +1 -0
  47. package/dist/{chunk-KUPF5KHT.js → chunk-Y5H7C5J4.js} +2 -2
  48. package/dist/chunk-ZI67WIQS.js +30 -0
  49. package/dist/chunk-ZI67WIQS.js.map +1 -0
  50. package/dist/{embedding-D2BYIehX.d.ts → embedding-CW6SaOOz.d.ts} +1 -1
  51. package/dist/google/index.d.ts +2 -1
  52. package/dist/google/index.js +202 -199
  53. package/dist/google/index.js.map +1 -1
  54. package/dist/groq/index.d.ts +410 -0
  55. package/dist/groq/index.js +649 -0
  56. package/dist/groq/index.js.map +1 -0
  57. package/dist/http/index.d.ts +3 -2
  58. package/dist/http/index.js +5 -4
  59. package/dist/image-stream-C0ciACM2.d.ts +11 -0
  60. package/dist/index.d.ts +8 -118
  61. package/dist/index.js +518 -767
  62. package/dist/index.js.map +1 -1
  63. package/dist/{llm-BQJZj3cD.d.ts → llm-DwbUK7un.d.ts} +12 -1632
  64. package/dist/middleware/logging/index.d.ts +76 -0
  65. package/dist/middleware/logging/index.js +74 -0
  66. package/dist/middleware/logging/index.js.map +1 -0
  67. package/dist/middleware/parsed-object/index.d.ts +45 -0
  68. package/dist/middleware/parsed-object/index.js +73 -0
  69. package/dist/middleware/parsed-object/index.js.map +1 -0
  70. package/dist/middleware/pubsub/index.d.ts +104 -0
  71. package/dist/middleware/pubsub/index.js +230 -0
  72. package/dist/middleware/pubsub/index.js.map +1 -0
  73. package/dist/middleware/pubsub/server/express/index.d.ts +52 -0
  74. package/dist/middleware/pubsub/server/express/index.js +11 -0
  75. package/dist/middleware/pubsub/server/express/index.js.map +1 -0
  76. package/dist/middleware/pubsub/server/fastify/index.d.ts +53 -0
  77. package/dist/middleware/pubsub/server/fastify/index.js +11 -0
  78. package/dist/middleware/pubsub/server/fastify/index.js.map +1 -0
  79. package/dist/middleware/pubsub/server/h3/index.d.ts +56 -0
  80. package/dist/middleware/pubsub/server/h3/index.js +11 -0
  81. package/dist/middleware/pubsub/server/h3/index.js.map +1 -0
  82. package/dist/middleware/pubsub/server/index.d.ts +78 -0
  83. package/dist/middleware/pubsub/server/index.js +34 -0
  84. package/dist/middleware/pubsub/server/index.js.map +1 -0
  85. package/dist/middleware/pubsub/server/webapi/index.d.ts +53 -0
  86. package/dist/middleware/pubsub/server/webapi/index.js +11 -0
  87. package/dist/middleware/pubsub/server/webapi/index.js.map +1 -0
  88. package/dist/ollama/index.d.ts +2 -1
  89. package/dist/ollama/index.js +48 -45
  90. package/dist/ollama/index.js.map +1 -1
  91. package/dist/openai/index.d.ts +2 -1
  92. package/dist/openai/index.js +319 -313
  93. package/dist/openai/index.js.map +1 -1
  94. package/dist/openrouter/index.d.ts +2 -1
  95. package/dist/openrouter/index.js +379 -383
  96. package/dist/openrouter/index.js.map +1 -1
  97. package/dist/proxy/index.d.ts +10 -914
  98. package/dist/proxy/index.js +275 -1007
  99. package/dist/proxy/index.js.map +1 -1
  100. package/dist/proxy/server/express/index.d.ts +161 -0
  101. package/dist/proxy/server/express/index.js +24 -0
  102. package/dist/proxy/server/express/index.js.map +1 -0
  103. package/dist/proxy/server/fastify/index.d.ts +162 -0
  104. package/dist/proxy/server/fastify/index.js +24 -0
  105. package/dist/proxy/server/fastify/index.js.map +1 -0
  106. package/dist/proxy/server/h3/index.d.ts +189 -0
  107. package/dist/proxy/server/h3/index.js +28 -0
  108. package/dist/proxy/server/h3/index.js.map +1 -0
  109. package/dist/proxy/server/index.d.ts +151 -0
  110. package/dist/proxy/server/index.js +48 -0
  111. package/dist/proxy/server/index.js.map +1 -0
  112. package/dist/proxy/server/webapi/index.d.ts +278 -0
  113. package/dist/proxy/server/webapi/index.js +32 -0
  114. package/dist/proxy/server/webapi/index.js.map +1 -0
  115. package/dist/responses/index.d.ts +650 -0
  116. package/dist/responses/index.js +930 -0
  117. package/dist/responses/index.js.map +1 -0
  118. package/dist/{retry-8Ch-WWgX.d.ts → retry-YayV42GV.d.ts} +1 -1
  119. package/dist/stream-CecfVCPO.d.ts +1632 -0
  120. package/dist/types-C8Gciizr.d.ts +168 -0
  121. package/dist/utils/index.d.ts +53 -0
  122. package/dist/utils/index.js +7 -0
  123. package/dist/utils/index.js.map +1 -0
  124. package/dist/xai/index.d.ts +2 -1
  125. package/dist/xai/index.js +310 -310
  126. package/dist/xai/index.js.map +1 -1
  127. package/package.json +82 -4
  128. package/dist/chunk-4J6OFUKX.js.map +0 -1
  129. package/dist/chunk-ILR2D5PN.js.map +0 -1
  130. package/dist/chunk-TOJCZMVU.js.map +0 -1
  131. package/dist/chunk-WAKD3OO5.js.map +0 -1
  132. /package/dist/{chunk-3D6XGGVG.js.map → chunk-ARVM24K2.js.map} +0 -0
  133. /package/dist/{chunk-KUPF5KHT.js.map → chunk-Y5H7C5J4.js.map} +0 -0
@@ -1,70 +1,42 @@
1
1
  import {
2
2
  Image
3
- } from "../chunk-WAKD3OO5.js";
3
+ } from "../chunk-N5DX5JW3.js";
4
+ import {
5
+ parseSSEStream
6
+ } from "../chunk-PMK5LZ5Z.js";
4
7
  import {
5
8
  parseJsonResponse
6
- } from "../chunk-3C7O2RNO.js";
9
+ } from "../chunk-A2IM7PGT.js";
7
10
  import {
8
- StreamEventType,
9
- objectDelta
10
- } from "../chunk-6S222DHN.js";
11
+ resolveApiKey
12
+ } from "../chunk-ARVM24K2.js";
13
+ import {
14
+ createProvider
15
+ } from "../chunk-JA3UZALR.js";
11
16
  import {
12
17
  AssistantMessage,
13
- createProvider,
14
18
  generateId,
15
19
  isAssistantMessage,
16
20
  isToolResultMessage,
17
21
  isUserMessage
18
- } from "../chunk-ILR2D5PN.js";
19
- import {
20
- parseSSEStream
21
- } from "../chunk-TOJCZMVU.js";
22
- import {
23
- resolveApiKey
24
- } from "../chunk-3D6XGGVG.js";
22
+ } from "../chunk-BRP5XJ6Q.js";
25
23
  import {
26
- ErrorCode,
27
- ModalityType,
28
- UPPError,
29
24
  doFetch,
30
25
  doStreamFetch,
31
26
  normalizeHttpError,
32
27
  toError
33
- } from "../chunk-4J6OFUKX.js";
28
+ } from "../chunk-AY55T37A.js";
29
+ import {
30
+ ErrorCode,
31
+ ModalityType,
32
+ UPPError
33
+ } from "../chunk-COS4ON4G.js";
34
+ import {
35
+ StreamEventType,
36
+ objectDelta
37
+ } from "../chunk-6S222DHN.js";
34
38
 
35
39
  // src/providers/openai/transform.completions.ts
36
- function transformRequest(request, modelId) {
37
- const params = request.params ?? {};
38
- const openaiRequest = {
39
- ...params,
40
- model: modelId,
41
- messages: transformMessages(request.messages, request.system)
42
- };
43
- if (request.tools && request.tools.length > 0) {
44
- openaiRequest.tools = request.tools.map(transformTool);
45
- }
46
- if (request.structure) {
47
- const schema = {
48
- type: "object",
49
- properties: request.structure.properties,
50
- required: request.structure.required,
51
- ...request.structure.additionalProperties !== void 0 ? { additionalProperties: request.structure.additionalProperties } : { additionalProperties: false }
52
- };
53
- if (request.structure.description) {
54
- schema.description = request.structure.description;
55
- }
56
- openaiRequest.response_format = {
57
- type: "json_schema",
58
- json_schema: {
59
- name: "json_response",
60
- description: request.structure.description,
61
- schema,
62
- strict: true
63
- }
64
- };
65
- }
66
- return openaiRequest;
67
- }
68
40
  function normalizeSystem(system) {
69
41
  if (system === void 0 || system === null) return void 0;
70
42
  if (typeof system === "string") return system;
@@ -101,85 +73,9 @@ function normalizeSystem(system) {
101
73
  }
102
74
  return texts.length > 0 ? texts.join("\n\n") : void 0;
103
75
  }
104
- function transformMessages(messages, system) {
105
- const result = [];
106
- const normalizedSystem = normalizeSystem(system);
107
- if (normalizedSystem) {
108
- result.push({
109
- role: "system",
110
- content: normalizedSystem
111
- });
112
- }
113
- for (const message of messages) {
114
- if (isToolResultMessage(message)) {
115
- const toolMessages = transformToolResults(message);
116
- result.push(...toolMessages);
117
- } else {
118
- const transformed = transformMessage(message);
119
- if (transformed) {
120
- result.push(transformed);
121
- }
122
- }
123
- }
124
- return result;
125
- }
126
76
  function filterValidContent(content) {
127
77
  return content.filter((c) => c && typeof c.type === "string");
128
78
  }
129
- function transformMessage(message) {
130
- if (isUserMessage(message)) {
131
- const validContent = filterValidContent(message.content);
132
- if (validContent.length === 1 && validContent[0]?.type === "text") {
133
- return {
134
- role: "user",
135
- content: validContent[0].text
136
- };
137
- }
138
- return {
139
- role: "user",
140
- content: validContent.map(transformContentBlock)
141
- };
142
- }
143
- if (isAssistantMessage(message)) {
144
- const validContent = filterValidContent(message.content);
145
- const textContent = validContent.filter((c) => c.type === "text").map((c) => c.text).join("");
146
- const assistantMessage = {
147
- role: "assistant",
148
- content: textContent || null
149
- };
150
- if (message.toolCalls && message.toolCalls.length > 0) {
151
- assistantMessage.tool_calls = message.toolCalls.map((call) => ({
152
- id: call.toolCallId,
153
- type: "function",
154
- function: {
155
- name: call.toolName,
156
- arguments: JSON.stringify(call.arguments)
157
- }
158
- }));
159
- }
160
- return assistantMessage;
161
- }
162
- if (isToolResultMessage(message)) {
163
- const results = message.results.map((result) => ({
164
- role: "tool",
165
- tool_call_id: result.toolCallId,
166
- content: typeof result.result === "string" ? result.result : JSON.stringify(result.result)
167
- }));
168
- return results[0] ?? null;
169
- }
170
- return null;
171
- }
172
- function transformToolResults(message) {
173
- if (!isToolResultMessage(message)) {
174
- const single = transformMessage(message);
175
- return single ? [single] : [];
176
- }
177
- return message.results.map((result) => ({
178
- role: "tool",
179
- tool_call_id: result.toolCallId,
180
- content: typeof result.result === "string" ? result.result : JSON.stringify(result.result)
181
- }));
182
- }
183
79
  function transformContentBlock(block) {
184
80
  switch (block.type) {
185
81
  case "text":
@@ -240,6 +136,82 @@ function transformContentBlock(block) {
240
136
  throw new Error(`Unsupported content type: ${block.type}`);
241
137
  }
242
138
  }
139
+ function transformMessage(message) {
140
+ if (isUserMessage(message)) {
141
+ const validContent = filterValidContent(message.content);
142
+ if (validContent.length === 1 && validContent[0]?.type === "text") {
143
+ return {
144
+ role: "user",
145
+ content: validContent[0].text
146
+ };
147
+ }
148
+ return {
149
+ role: "user",
150
+ content: validContent.map(transformContentBlock)
151
+ };
152
+ }
153
+ if (isAssistantMessage(message)) {
154
+ const validContent = filterValidContent(message.content);
155
+ const textContent = validContent.filter((c) => c.type === "text").map((c) => c.text).join("");
156
+ const assistantMessage = {
157
+ role: "assistant",
158
+ content: textContent || null
159
+ };
160
+ if (message.toolCalls && message.toolCalls.length > 0) {
161
+ assistantMessage.tool_calls = message.toolCalls.map((call) => ({
162
+ id: call.toolCallId,
163
+ type: "function",
164
+ function: {
165
+ name: call.toolName,
166
+ arguments: JSON.stringify(call.arguments)
167
+ }
168
+ }));
169
+ }
170
+ return assistantMessage;
171
+ }
172
+ if (isToolResultMessage(message)) {
173
+ const results = message.results.map((result) => ({
174
+ role: "tool",
175
+ tool_call_id: result.toolCallId,
176
+ content: typeof result.result === "string" ? result.result : JSON.stringify(result.result)
177
+ }));
178
+ return results[0] ?? null;
179
+ }
180
+ return null;
181
+ }
182
+ function transformToolResults(message) {
183
+ if (!isToolResultMessage(message)) {
184
+ const single = transformMessage(message);
185
+ return single ? [single] : [];
186
+ }
187
+ return message.results.map((result) => ({
188
+ role: "tool",
189
+ tool_call_id: result.toolCallId,
190
+ content: typeof result.result === "string" ? result.result : JSON.stringify(result.result)
191
+ }));
192
+ }
193
+ function transformMessages(messages, system) {
194
+ const result = [];
195
+ const normalizedSystem = normalizeSystem(system);
196
+ if (normalizedSystem) {
197
+ result.push({
198
+ role: "system",
199
+ content: normalizedSystem
200
+ });
201
+ }
202
+ for (const message of messages) {
203
+ if (isToolResultMessage(message)) {
204
+ const toolMessages = transformToolResults(message);
205
+ result.push(...toolMessages);
206
+ } else {
207
+ const transformed = transformMessage(message);
208
+ if (transformed) {
209
+ result.push(transformed);
210
+ }
211
+ }
212
+ }
213
+ return result;
214
+ }
243
215
  function extractToolOptions(tool) {
244
216
  const openaiMeta = tool.metadata?.openai;
245
217
  return { strict: openaiMeta?.strict };
@@ -261,6 +233,38 @@ function transformTool(tool) {
261
233
  }
262
234
  };
263
235
  }
236
+ function transformRequest(request, modelId) {
237
+ const params = request.params ?? {};
238
+ const openaiRequest = {
239
+ ...params,
240
+ model: modelId,
241
+ messages: transformMessages(request.messages, request.system)
242
+ };
243
+ if (request.tools && request.tools.length > 0) {
244
+ openaiRequest.tools = request.tools.map(transformTool);
245
+ }
246
+ if (request.structure) {
247
+ const schema = {
248
+ type: "object",
249
+ properties: request.structure.properties,
250
+ required: request.structure.required,
251
+ ...request.structure.additionalProperties !== void 0 ? { additionalProperties: request.structure.additionalProperties } : { additionalProperties: false }
252
+ };
253
+ if (request.structure.description) {
254
+ schema.description = request.structure.description;
255
+ }
256
+ openaiRequest.response_format = {
257
+ type: "json_schema",
258
+ json_schema: {
259
+ name: "json_response",
260
+ description: request.structure.description,
261
+ schema,
262
+ strict: true
263
+ }
264
+ };
265
+ }
266
+ return openaiRequest;
267
+ }
264
268
  function transformResponse(data) {
265
269
  const choice = data.choices[0];
266
270
  if (!choice) {
@@ -640,10 +644,9 @@ function createCompletionsLLMHandler() {
640
644
  }
641
645
  const uppEvents = transformStreamEvent(chunk, state);
642
646
  for (const event of uppEvents) {
647
+ yield event;
643
648
  if (request.structure && event.type === StreamEventType.TextDelta) {
644
649
  yield objectDelta(event.delta.text ?? "", event.index);
645
- } else {
646
- yield event;
647
650
  }
648
651
  }
649
652
  }
@@ -669,44 +672,6 @@ function createCompletionsLLMHandler() {
669
672
  }
670
673
 
671
674
  // src/providers/openai/transform.responses.ts
672
- function transformRequest2(request, modelId) {
673
- const params = request.params ?? {};
674
- const { tools: builtInTools, ...restParams } = params;
675
- const openaiRequest = {
676
- ...restParams,
677
- model: modelId,
678
- input: transformInputItems(request.messages, request.system)
679
- };
680
- const functionTools = request.tools?.map(transformTool2) ?? [];
681
- const allTools = [
682
- ...functionTools,
683
- ...builtInTools ?? []
684
- ];
685
- if (allTools.length > 0) {
686
- openaiRequest.tools = allTools;
687
- }
688
- if (request.structure) {
689
- const schema = {
690
- type: "object",
691
- properties: request.structure.properties,
692
- required: request.structure.required,
693
- ...request.structure.additionalProperties !== void 0 ? { additionalProperties: request.structure.additionalProperties } : { additionalProperties: false }
694
- };
695
- if (request.structure.description) {
696
- schema.description = request.structure.description;
697
- }
698
- openaiRequest.text = {
699
- format: {
700
- type: "json_schema",
701
- name: "json_response",
702
- description: request.structure.description,
703
- schema,
704
- strict: true
705
- }
706
- };
707
- }
708
- return openaiRequest;
709
- }
710
675
  function normalizeSystem2(system) {
711
676
  if (system === void 0 || system === null) return void 0;
712
677
  if (typeof system === "string") return system;
@@ -743,30 +708,69 @@ function normalizeSystem2(system) {
743
708
  }
744
709
  return texts.length > 0 ? texts.join("\n\n") : void 0;
745
710
  }
746
- function transformInputItems(messages, system) {
747
- const result = [];
748
- const normalizedSystem = normalizeSystem2(system);
749
- if (normalizedSystem) {
750
- result.push({
751
- type: "message",
752
- role: "system",
753
- content: normalizedSystem
754
- });
755
- }
756
- for (const message of messages) {
757
- const items = transformMessage2(message);
758
- result.push(...items);
759
- }
760
- if (result.length === 1 && result[0]?.type === "message") {
761
- const item = result[0];
762
- if (item.role === "user" && typeof item.content === "string") {
763
- return item.content;
711
+ function filterValidContent2(content) {
712
+ return content.filter((c) => c && typeof c.type === "string");
713
+ }
714
+ function transformContentPart(block) {
715
+ switch (block.type) {
716
+ case "text":
717
+ return { type: "input_text", text: block.text };
718
+ case "image": {
719
+ const imageBlock = block;
720
+ if (imageBlock.source.type === "base64") {
721
+ return {
722
+ type: "input_image",
723
+ image_url: `data:${imageBlock.mimeType};base64,${imageBlock.source.data}`
724
+ };
725
+ }
726
+ if (imageBlock.source.type === "url") {
727
+ return {
728
+ type: "input_image",
729
+ image_url: imageBlock.source.url
730
+ };
731
+ }
732
+ if (imageBlock.source.type === "bytes") {
733
+ const base64 = Buffer.from(imageBlock.source.data).toString("base64");
734
+ return {
735
+ type: "input_image",
736
+ image_url: `data:${imageBlock.mimeType};base64,${base64}`
737
+ };
738
+ }
739
+ throw new Error("Unknown image source type");
740
+ }
741
+ case "document": {
742
+ const documentBlock = block;
743
+ if (documentBlock.mimeType !== "application/pdf") {
744
+ throw new UPPError(
745
+ "OpenAI Responses API only supports PDF documents",
746
+ ErrorCode.InvalidRequest,
747
+ "openai",
748
+ ModalityType.LLM
749
+ );
750
+ }
751
+ if (documentBlock.source.type === "base64") {
752
+ return {
753
+ type: "input_file",
754
+ filename: documentBlock.title ?? "document.pdf",
755
+ file_data: `data:application/pdf;base64,${documentBlock.source.data}`
756
+ };
757
+ }
758
+ if (documentBlock.source.type === "url") {
759
+ return {
760
+ type: "input_file",
761
+ file_url: documentBlock.source.url
762
+ };
763
+ }
764
+ throw new UPPError(
765
+ "Unknown document source type",
766
+ ErrorCode.InvalidRequest,
767
+ "openai",
768
+ ModalityType.LLM
769
+ );
764
770
  }
771
+ default:
772
+ throw new Error(`Unsupported content type: ${block.type}`);
765
773
  }
766
- return result;
767
- }
768
- function filterValidContent2(content) {
769
- return content.filter((c) => c && typeof c.type === "string");
770
774
  }
771
775
  function transformMessage2(message) {
772
776
  if (isUserMessage(message)) {
@@ -848,66 +852,27 @@ function transformMessage2(message) {
848
852
  }
849
853
  return [];
850
854
  }
851
- function transformContentPart(block) {
852
- switch (block.type) {
853
- case "text":
854
- return { type: "input_text", text: block.text };
855
- case "image": {
856
- const imageBlock = block;
857
- if (imageBlock.source.type === "base64") {
858
- return {
859
- type: "input_image",
860
- image_url: `data:${imageBlock.mimeType};base64,${imageBlock.source.data}`
861
- };
862
- }
863
- if (imageBlock.source.type === "url") {
864
- return {
865
- type: "input_image",
866
- image_url: imageBlock.source.url
867
- };
868
- }
869
- if (imageBlock.source.type === "bytes") {
870
- const base64 = Buffer.from(imageBlock.source.data).toString("base64");
871
- return {
872
- type: "input_image",
873
- image_url: `data:${imageBlock.mimeType};base64,${base64}`
874
- };
875
- }
876
- throw new Error("Unknown image source type");
877
- }
878
- case "document": {
879
- const documentBlock = block;
880
- if (documentBlock.mimeType !== "application/pdf") {
881
- throw new UPPError(
882
- "OpenAI Responses API only supports PDF documents",
883
- ErrorCode.InvalidRequest,
884
- "openai",
885
- ModalityType.LLM
886
- );
887
- }
888
- if (documentBlock.source.type === "base64") {
889
- return {
890
- type: "input_file",
891
- filename: documentBlock.title ?? "document.pdf",
892
- file_data: `data:application/pdf;base64,${documentBlock.source.data}`
893
- };
894
- }
895
- if (documentBlock.source.type === "url") {
896
- return {
897
- type: "input_file",
898
- file_url: documentBlock.source.url
899
- };
900
- }
901
- throw new UPPError(
902
- "Unknown document source type",
903
- ErrorCode.InvalidRequest,
904
- "openai",
905
- ModalityType.LLM
906
- );
855
+ function transformInputItems(messages, system) {
856
+ const result = [];
857
+ const normalizedSystem = normalizeSystem2(system);
858
+ if (normalizedSystem) {
859
+ result.push({
860
+ type: "message",
861
+ role: "system",
862
+ content: normalizedSystem
863
+ });
864
+ }
865
+ for (const message of messages) {
866
+ const items = transformMessage2(message);
867
+ result.push(...items);
868
+ }
869
+ if (result.length === 1 && result[0]?.type === "message") {
870
+ const item = result[0];
871
+ if (item.role === "user" && typeof item.content === "string") {
872
+ return item.content;
907
873
  }
908
- default:
909
- throw new Error(`Unsupported content type: ${block.type}`);
910
874
  }
875
+ return result;
911
876
  }
912
877
  function extractToolOptions2(tool) {
913
878
  const openaiMeta = tool.metadata?.openai;
@@ -928,6 +893,44 @@ function transformTool2(tool) {
928
893
  ...strict !== void 0 ? { strict } : {}
929
894
  };
930
895
  }
896
+ function transformRequest2(request, modelId) {
897
+ const params = request.params ?? {};
898
+ const { tools: builtInTools, ...restParams } = params;
899
+ const openaiRequest = {
900
+ ...restParams,
901
+ model: modelId,
902
+ input: transformInputItems(request.messages, request.system)
903
+ };
904
+ const functionTools = request.tools?.map(transformTool2) ?? [];
905
+ const allTools = [
906
+ ...functionTools,
907
+ ...builtInTools ?? []
908
+ ];
909
+ if (allTools.length > 0) {
910
+ openaiRequest.tools = allTools;
911
+ }
912
+ if (request.structure) {
913
+ const schema = {
914
+ type: "object",
915
+ properties: request.structure.properties,
916
+ required: request.structure.required,
917
+ ...request.structure.additionalProperties !== void 0 ? { additionalProperties: request.structure.additionalProperties } : { additionalProperties: false }
918
+ };
919
+ if (request.structure.description) {
920
+ schema.description = request.structure.description;
921
+ }
922
+ openaiRequest.text = {
923
+ format: {
924
+ type: "json_schema",
925
+ name: "json_response",
926
+ description: request.structure.description,
927
+ schema,
928
+ strict: true
929
+ }
930
+ };
931
+ }
932
+ return openaiRequest;
933
+ }
931
934
  function transformResponse2(data) {
932
935
  const content = [];
933
936
  const toolCalls = [];
@@ -1005,7 +1008,6 @@ function transformResponse2(data) {
1005
1008
  status: data.status,
1006
1009
  response_id: responseId,
1007
1010
  functionCallItems: functionCallItems.length > 0 ? functionCallItems : void 0,
1008
- // Store encrypted reasoning content for multi-turn context (stateless mode)
1009
1011
  reasoningEncryptedContent
1010
1012
  }
1011
1013
  }
@@ -1489,10 +1491,9 @@ function createResponsesLLMHandler() {
1489
1491
  }
1490
1492
  const uppEvents = transformStreamEvent2(event, state);
1491
1493
  for (const uppEvent of uppEvents) {
1494
+ yield uppEvent;
1492
1495
  if (request.structure && uppEvent.type === StreamEventType.TextDelta) {
1493
1496
  yield objectDelta(uppEvent.delta.text ?? "", uppEvent.index);
1494
- } else {
1495
- yield uppEvent;
1496
1497
  }
1497
1498
  }
1498
1499
  }
@@ -1624,41 +1625,34 @@ function getCapabilities(modelId) {
1624
1625
  maxImages: isDalle2 ? 10 : isGptImage ? 10 : 1
1625
1626
  };
1626
1627
  }
1627
- function createImageHandler() {
1628
- let providerRef = null;
1628
+ function transformResponse3(data) {
1629
+ const images = data.data.map((item) => {
1630
+ let image;
1631
+ if (item.b64_json) {
1632
+ image = Image.fromBase64(item.b64_json, "image/png");
1633
+ } else if (item.url) {
1634
+ image = Image.fromUrl(item.url, "image/png");
1635
+ } else {
1636
+ throw new UPPError(
1637
+ "No image data in response",
1638
+ ErrorCode.ProviderError,
1639
+ "openai",
1640
+ ModalityType.Image
1641
+ );
1642
+ }
1643
+ return {
1644
+ image,
1645
+ metadata: item.revised_prompt ? { openai: { revised_prompt: item.revised_prompt } } : void 0
1646
+ };
1647
+ });
1629
1648
  return {
1630
- _setProvider(provider) {
1631
- providerRef = provider;
1632
- },
1633
- bind(modelId) {
1634
- if (!providerRef) {
1635
- throw new UPPError(
1636
- "Provider reference not set. Handler must be used with createProvider().",
1637
- ErrorCode.InvalidRequest,
1638
- "openai",
1639
- ModalityType.Image
1640
- );
1641
- }
1642
- const capabilities = getCapabilities(modelId);
1643
- const model = {
1644
- modelId,
1645
- capabilities,
1646
- get provider() {
1647
- return providerRef;
1648
- },
1649
- async generate(request) {
1650
- return executeGenerate(modelId, request);
1651
- },
1652
- async edit(request) {
1653
- return executeEdit(modelId, request);
1654
- }
1655
- };
1656
- if (capabilities.streaming) {
1657
- model.stream = function(request) {
1658
- return executeStream(modelId, request);
1659
- };
1660
- }
1661
- return model;
1649
+ images,
1650
+ usage: data.usage ? {
1651
+ imagesGenerated: images.length,
1652
+ inputTokens: data.usage.input_tokens,
1653
+ outputTokens: data.usage.output_tokens
1654
+ } : {
1655
+ imagesGenerated: images.length
1662
1656
  }
1663
1657
  };
1664
1658
  }
@@ -1895,35 +1889,41 @@ function executeStream(modelId, request) {
1895
1889
  response: responsePromise
1896
1890
  };
1897
1891
  }
1898
- function transformResponse3(data) {
1899
- const images = data.data.map((item) => {
1900
- let image;
1901
- if (item.b64_json) {
1902
- image = Image.fromBase64(item.b64_json, "image/png");
1903
- } else if (item.url) {
1904
- image = Image.fromUrl(item.url, "image/png");
1905
- } else {
1906
- throw new UPPError(
1907
- "No image data in response",
1908
- ErrorCode.ProviderError,
1909
- "openai",
1910
- ModalityType.Image
1911
- );
1912
- }
1913
- return {
1914
- image,
1915
- // Per-image metadata namespaced under provider (Spec 15.4)
1916
- metadata: item.revised_prompt ? { openai: { revised_prompt: item.revised_prompt } } : void 0
1917
- };
1918
- });
1892
+ function createImageHandler() {
1893
+ let providerRef = null;
1919
1894
  return {
1920
- images,
1921
- usage: data.usage ? {
1922
- imagesGenerated: images.length,
1923
- inputTokens: data.usage.input_tokens,
1924
- outputTokens: data.usage.output_tokens
1925
- } : {
1926
- imagesGenerated: images.length
1895
+ _setProvider(provider) {
1896
+ providerRef = provider;
1897
+ },
1898
+ bind(modelId) {
1899
+ if (!providerRef) {
1900
+ throw new UPPError(
1901
+ "Provider reference not set. Handler must be used with createProvider().",
1902
+ ErrorCode.InvalidRequest,
1903
+ "openai",
1904
+ ModalityType.Image
1905
+ );
1906
+ }
1907
+ const capabilities = getCapabilities(modelId);
1908
+ const model = {
1909
+ modelId,
1910
+ capabilities,
1911
+ get provider() {
1912
+ return providerRef;
1913
+ },
1914
+ async generate(request) {
1915
+ return executeGenerate(modelId, request);
1916
+ },
1917
+ async edit(request) {
1918
+ return executeEdit(modelId, request);
1919
+ }
1920
+ };
1921
+ if (capabilities.streaming) {
1922
+ model.stream = function(request) {
1923
+ return executeStream(modelId, request);
1924
+ };
1925
+ }
1926
+ return model;
1927
1927
  }
1928
1928
  };
1929
1929
  }
@@ -1966,16 +1966,22 @@ function imageGenerationTool(options) {
1966
1966
  return { type: "image_generation" };
1967
1967
  }
1968
1968
  function mcpTool(options) {
1969
- const { url, name, allowed_tools, headers, require_approval } = options;
1969
+ const {
1970
+ url,
1971
+ name,
1972
+ allowed_tools: allowedTools,
1973
+ headers,
1974
+ require_approval: requireApproval
1975
+ } = options;
1970
1976
  return {
1971
1977
  type: "mcp",
1972
1978
  mcp: {
1973
1979
  server: {
1974
1980
  url,
1975
1981
  name,
1976
- ...allowed_tools && { tool_configuration: { allowed_tools } },
1982
+ ...allowedTools && { tool_configuration: { allowed_tools: allowedTools } },
1977
1983
  headers,
1978
- require_approval
1984
+ require_approval: requireApproval
1979
1985
  }
1980
1986
  }
1981
1987
  };