@marinoscar/platform-api 0.1.0-next.4 → 0.1.0-next.6

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 (241) hide show
  1. package/CHANGELOG.md +18 -0
  2. package/dist/ai/core/ai-error.d.ts +15 -158
  3. package/dist/ai/core/ai-error.d.ts.map +1 -1
  4. package/dist/ai/core/ai-error.js +58 -221
  5. package/dist/ai/core/ai-error.js.map +1 -1
  6. package/dist/ai/core/capabilities.d.ts +3 -126
  7. package/dist/ai/core/capabilities.d.ts.map +1 -1
  8. package/dist/ai/core/capabilities.js +13 -109
  9. package/dist/ai/core/capabilities.js.map +1 -1
  10. package/dist/ai/core/conversation.d.ts +2 -15
  11. package/dist/ai/core/conversation.d.ts.map +1 -1
  12. package/dist/ai/core/conversation.js +9 -54
  13. package/dist/ai/core/conversation.js.map +1 -1
  14. package/dist/ai/core/hosted-tools.d.ts +3 -172
  15. package/dist/ai/core/hosted-tools.d.ts.map +1 -1
  16. package/dist/ai/core/hosted-tools.js +20 -286
  17. package/dist/ai/core/hosted-tools.js.map +1 -1
  18. package/dist/ai/core/provider-adapter.interface.d.ts +3 -260
  19. package/dist/ai/core/provider-adapter.interface.d.ts.map +1 -1
  20. package/dist/ai/core/provider-adapter.interface.js +7 -29
  21. package/dist/ai/core/provider-adapter.interface.js.map +1 -1
  22. package/dist/ai/core/structured-output.d.ts +3 -49
  23. package/dist/ai/core/structured-output.d.ts.map +1 -1
  24. package/dist/ai/core/structured-output.js +9 -80
  25. package/dist/ai/core/structured-output.js.map +1 -1
  26. package/dist/ai/core/tools.d.ts +3 -93
  27. package/dist/ai/core/tools.d.ts.map +1 -1
  28. package/dist/ai/core/tools.js +9 -73
  29. package/dist/ai/core/tools.js.map +1 -1
  30. package/dist/ai/core/types/file-inputs.types.d.ts +3 -102
  31. package/dist/ai/core/types/file-inputs.types.d.ts.map +1 -1
  32. package/dist/ai/core/types/file-inputs.types.js +14 -78
  33. package/dist/ai/core/types/file-inputs.types.js.map +1 -1
  34. package/dist/ai/core/types/media.types.d.ts +3 -616
  35. package/dist/ai/core/types/media.types.d.ts.map +1 -1
  36. package/dist/ai/core/types/media.types.js +33 -203
  37. package/dist/ai/core/types/media.types.js.map +1 -1
  38. package/dist/ai/core/types/responses.types.d.ts +3 -619
  39. package/dist/ai/core/types/responses.types.d.ts.map +1 -1
  40. package/dist/ai/core/types/responses.types.js +9 -57
  41. package/dist/ai/core/types/responses.types.js.map +1 -1
  42. package/dist/ai/http/dto/ai-images.dto.d.ts +4 -4
  43. package/dist/ai/index.d.ts +1 -1
  44. package/dist/ai/index.d.ts.map +1 -1
  45. package/dist/ai/index.js +3 -3
  46. package/dist/ai/index.js.map +1 -1
  47. package/dist/ai/providers/anthropic/anthropic-client.factory.d.ts +13 -15
  48. package/dist/ai/providers/anthropic/anthropic-client.factory.d.ts.map +1 -1
  49. package/dist/ai/providers/anthropic/anthropic-client.factory.js +23 -52
  50. package/dist/ai/providers/anthropic/anthropic-client.factory.js.map +1 -1
  51. package/dist/ai/providers/anthropic/anthropic.adapter.d.ts +15 -51
  52. package/dist/ai/providers/anthropic/anthropic.adapter.d.ts.map +1 -1
  53. package/dist/ai/providers/anthropic/anthropic.adapter.js +29 -293
  54. package/dist/ai/providers/anthropic/anthropic.adapter.js.map +1 -1
  55. package/dist/ai/providers/azure-openai/azure-openai-client.factory.d.ts +10 -14
  56. package/dist/ai/providers/azure-openai/azure-openai-client.factory.d.ts.map +1 -1
  57. package/dist/ai/providers/azure-openai/azure-openai-client.factory.js +20 -53
  58. package/dist/ai/providers/azure-openai/azure-openai-client.factory.js.map +1 -1
  59. package/dist/ai/providers/azure-openai/azure-openai.adapter.d.ts +14 -31
  60. package/dist/ai/providers/azure-openai/azure-openai.adapter.d.ts.map +1 -1
  61. package/dist/ai/providers/azure-openai/azure-openai.adapter.js +25 -170
  62. package/dist/ai/providers/azure-openai/azure-openai.adapter.js.map +1 -1
  63. package/dist/ai/providers/gemini/gemini-client.factory.d.ts +13 -18
  64. package/dist/ai/providers/gemini/gemini-client.factory.d.ts.map +1 -1
  65. package/dist/ai/providers/gemini/gemini-client.factory.js +24 -68
  66. package/dist/ai/providers/gemini/gemini-client.factory.js.map +1 -1
  67. package/dist/ai/providers/gemini/gemini.adapter.d.ts +15 -58
  68. package/dist/ai/providers/gemini/gemini.adapter.d.ts.map +1 -1
  69. package/dist/ai/providers/gemini/gemini.adapter.js +29 -348
  70. package/dist/ai/providers/gemini/gemini.adapter.js.map +1 -1
  71. package/dist/ai/providers/openai/openai-client.factory.d.ts +13 -35
  72. package/dist/ai/providers/openai/openai-client.factory.d.ts.map +1 -1
  73. package/dist/ai/providers/openai/openai-client.factory.js +25 -64
  74. package/dist/ai/providers/openai/openai-client.factory.js.map +1 -1
  75. package/dist/ai/providers/openai/openai.adapter.d.ts +15 -48
  76. package/dist/ai/providers/openai/openai.adapter.d.ts.map +1 -1
  77. package/dist/ai/providers/openai/openai.adapter.js +27 -206
  78. package/dist/ai/providers/openai/openai.adapter.js.map +1 -1
  79. package/dist/ai/providers/openai-compatible/openai-compatible-client.factory.d.ts +11 -11
  80. package/dist/ai/providers/openai-compatible/openai-compatible-client.factory.d.ts.map +1 -1
  81. package/dist/ai/providers/openai-compatible/openai-compatible-client.factory.js +18 -41
  82. package/dist/ai/providers/openai-compatible/openai-compatible-client.factory.js.map +1 -1
  83. package/dist/ai/providers/openai-compatible/openai-compatible.adapter.d.ts +14 -32
  84. package/dist/ai/providers/openai-compatible/openai-compatible.adapter.d.ts.map +1 -1
  85. package/dist/ai/providers/openai-compatible/openai-compatible.adapter.js +25 -149
  86. package/dist/ai/providers/openai-compatible/openai-compatible.adapter.js.map +1 -1
  87. package/dist/ai/providers/platform-ai-tracer.d.ts +4 -0
  88. package/dist/ai/providers/platform-ai-tracer.d.ts.map +1 -0
  89. package/dist/ai/providers/platform-ai-tracer.js +20 -0
  90. package/dist/ai/providers/platform-ai-tracer.js.map +1 -0
  91. package/dist/ai/runtime/ai-image-run-request.d.ts +1 -1
  92. package/dist/ai/testing/conformance/ai-no-sdk-leak.suite.d.ts +28 -5
  93. package/dist/ai/testing/conformance/ai-no-sdk-leak.suite.d.ts.map +1 -1
  94. package/dist/ai/testing/conformance/ai-no-sdk-leak.suite.js +54 -9
  95. package/dist/ai/testing/conformance/ai-no-sdk-leak.suite.js.map +1 -1
  96. package/dist/ai/testing/index.d.ts +1 -1
  97. package/dist/ai/testing/index.d.ts.map +1 -1
  98. package/dist/ai/testing/index.js +2 -1
  99. package/dist/ai/testing/index.js.map +1 -1
  100. package/dist/jobs/rate-limit.error.d.ts +2 -26
  101. package/dist/jobs/rate-limit.error.d.ts.map +1 -1
  102. package/dist/jobs/rate-limit.error.js +4 -52
  103. package/dist/jobs/rate-limit.error.js.map +1 -1
  104. package/dist/storage/config/storage-config.controller.d.ts +1 -1
  105. package/package.json +3 -2
  106. package/dist/ai/providers/anthropic/anthropic-errors.d.ts +0 -16
  107. package/dist/ai/providers/anthropic/anthropic-errors.d.ts.map +0 -1
  108. package/dist/ai/providers/anthropic/anthropic-errors.js +0 -156
  109. package/dist/ai/providers/anthropic/anthropic-errors.js.map +0 -1
  110. package/dist/ai/providers/anthropic/anthropic-messages.mapper.d.ts +0 -80
  111. package/dist/ai/providers/anthropic/anthropic-messages.mapper.d.ts.map +0 -1
  112. package/dist/ai/providers/anthropic/anthropic-messages.mapper.js +0 -536
  113. package/dist/ai/providers/anthropic/anthropic-messages.mapper.js.map +0 -1
  114. package/dist/ai/providers/anthropic/anthropic-model-catalog.d.ts +0 -49
  115. package/dist/ai/providers/anthropic/anthropic-model-catalog.d.ts.map +0 -1
  116. package/dist/ai/providers/anthropic/anthropic-model-catalog.js +0 -198
  117. package/dist/ai/providers/anthropic/anthropic-model-catalog.js.map +0 -1
  118. package/dist/ai/providers/anthropic/anthropic-stream.mapper.d.ts +0 -35
  119. package/dist/ai/providers/anthropic/anthropic-stream.mapper.d.ts.map +0 -1
  120. package/dist/ai/providers/anthropic/anthropic-stream.mapper.js +0 -203
  121. package/dist/ai/providers/anthropic/anthropic-stream.mapper.js.map +0 -1
  122. package/dist/ai/providers/anthropic/testing/anthropic-fixtures.d.ts +0 -18
  123. package/dist/ai/providers/anthropic/testing/anthropic-fixtures.d.ts.map +0 -1
  124. package/dist/ai/providers/anthropic/testing/anthropic-fixtures.js +0 -120
  125. package/dist/ai/providers/anthropic/testing/anthropic-fixtures.js.map +0 -1
  126. package/dist/ai/providers/anthropic/testing/anthropic-mock-transport.d.ts +0 -59
  127. package/dist/ai/providers/anthropic/testing/anthropic-mock-transport.d.ts.map +0 -1
  128. package/dist/ai/providers/anthropic/testing/anthropic-mock-transport.js +0 -206
  129. package/dist/ai/providers/anthropic/testing/anthropic-mock-transport.js.map +0 -1
  130. package/dist/ai/providers/azure-openai/azure-openai-settings.d.ts +0 -23
  131. package/dist/ai/providers/azure-openai/azure-openai-settings.d.ts.map +0 -1
  132. package/dist/ai/providers/azure-openai/azure-openai-settings.js +0 -54
  133. package/dist/ai/providers/azure-openai/azure-openai-settings.js.map +0 -1
  134. package/dist/ai/providers/gemini/gemini-content.mapper.d.ts +0 -98
  135. package/dist/ai/providers/gemini/gemini-content.mapper.d.ts.map +0 -1
  136. package/dist/ai/providers/gemini/gemini-content.mapper.js +0 -665
  137. package/dist/ai/providers/gemini/gemini-content.mapper.js.map +0 -1
  138. package/dist/ai/providers/gemini/gemini-embeddings.mapper.d.ts +0 -13
  139. package/dist/ai/providers/gemini/gemini-embeddings.mapper.d.ts.map +0 -1
  140. package/dist/ai/providers/gemini/gemini-embeddings.mapper.js +0 -78
  141. package/dist/ai/providers/gemini/gemini-embeddings.mapper.js.map +0 -1
  142. package/dist/ai/providers/gemini/gemini-errors.d.ts +0 -32
  143. package/dist/ai/providers/gemini/gemini-errors.d.ts.map +0 -1
  144. package/dist/ai/providers/gemini/gemini-errors.js +0 -191
  145. package/dist/ai/providers/gemini/gemini-errors.js.map +0 -1
  146. package/dist/ai/providers/gemini/gemini-model-catalog.d.ts +0 -45
  147. package/dist/ai/providers/gemini/gemini-model-catalog.d.ts.map +0 -1
  148. package/dist/ai/providers/gemini/gemini-model-catalog.js +0 -264
  149. package/dist/ai/providers/gemini/gemini-model-catalog.js.map +0 -1
  150. package/dist/ai/providers/gemini/gemini-stream.mapper.d.ts +0 -31
  151. package/dist/ai/providers/gemini/gemini-stream.mapper.d.ts.map +0 -1
  152. package/dist/ai/providers/gemini/gemini-stream.mapper.js +0 -118
  153. package/dist/ai/providers/gemini/gemini-stream.mapper.js.map +0 -1
  154. package/dist/ai/providers/gemini/testing/gemini-fixtures.d.ts +0 -80
  155. package/dist/ai/providers/gemini/testing/gemini-fixtures.d.ts.map +0 -1
  156. package/dist/ai/providers/gemini/testing/gemini-fixtures.js +0 -118
  157. package/dist/ai/providers/gemini/testing/gemini-fixtures.js.map +0 -1
  158. package/dist/ai/providers/gemini/testing/gemini-mock-transport.d.ts +0 -82
  159. package/dist/ai/providers/gemini/testing/gemini-mock-transport.d.ts.map +0 -1
  160. package/dist/ai/providers/gemini/testing/gemini-mock-transport.js +0 -342
  161. package/dist/ai/providers/gemini/testing/gemini-mock-transport.js.map +0 -1
  162. package/dist/ai/providers/openai/openai-audio.mapper.d.ts +0 -42
  163. package/dist/ai/providers/openai/openai-audio.mapper.d.ts.map +0 -1
  164. package/dist/ai/providers/openai/openai-audio.mapper.js +0 -266
  165. package/dist/ai/providers/openai/openai-audio.mapper.js.map +0 -1
  166. package/dist/ai/providers/openai/openai-call-telemetry.d.ts +0 -25
  167. package/dist/ai/providers/openai/openai-call-telemetry.d.ts.map +0 -1
  168. package/dist/ai/providers/openai/openai-call-telemetry.js +0 -93
  169. package/dist/ai/providers/openai/openai-call-telemetry.js.map +0 -1
  170. package/dist/ai/providers/openai/openai-chat-completions-stream.mapper.d.ts +0 -41
  171. package/dist/ai/providers/openai/openai-chat-completions-stream.mapper.d.ts.map +0 -1
  172. package/dist/ai/providers/openai/openai-chat-completions-stream.mapper.js +0 -173
  173. package/dist/ai/providers/openai/openai-chat-completions-stream.mapper.js.map +0 -1
  174. package/dist/ai/providers/openai/openai-chat-completions.engine.d.ts +0 -33
  175. package/dist/ai/providers/openai/openai-chat-completions.engine.d.ts.map +0 -1
  176. package/dist/ai/providers/openai/openai-chat-completions.engine.js +0 -165
  177. package/dist/ai/providers/openai/openai-chat-completions.engine.js.map +0 -1
  178. package/dist/ai/providers/openai/openai-chat-completions.mapper.d.ts +0 -42
  179. package/dist/ai/providers/openai/openai-chat-completions.mapper.d.ts.map +0 -1
  180. package/dist/ai/providers/openai/openai-chat-completions.mapper.js +0 -304
  181. package/dist/ai/providers/openai/openai-chat-completions.mapper.js.map +0 -1
  182. package/dist/ai/providers/openai/openai-embeddings.mapper.d.ts +0 -25
  183. package/dist/ai/providers/openai/openai-embeddings.mapper.d.ts.map +0 -1
  184. package/dist/ai/providers/openai/openai-embeddings.mapper.js +0 -81
  185. package/dist/ai/providers/openai/openai-embeddings.mapper.js.map +0 -1
  186. package/dist/ai/providers/openai/openai-errors.d.ts +0 -45
  187. package/dist/ai/providers/openai/openai-errors.d.ts.map +0 -1
  188. package/dist/ai/providers/openai/openai-errors.js +0 -247
  189. package/dist/ai/providers/openai/openai-errors.js.map +0 -1
  190. package/dist/ai/providers/openai/openai-family-guards.d.ts +0 -4
  191. package/dist/ai/providers/openai/openai-family-guards.d.ts.map +0 -1
  192. package/dist/ai/providers/openai/openai-family-guards.js +0 -19
  193. package/dist/ai/providers/openai/openai-family-guards.js.map +0 -1
  194. package/dist/ai/providers/openai/openai-images.mapper.d.ts +0 -23
  195. package/dist/ai/providers/openai/openai-images.mapper.d.ts.map +0 -1
  196. package/dist/ai/providers/openai/openai-images.mapper.js +0 -164
  197. package/dist/ai/providers/openai/openai-images.mapper.js.map +0 -1
  198. package/dist/ai/providers/openai/openai-model-catalog.d.ts +0 -36
  199. package/dist/ai/providers/openai/openai-model-catalog.d.ts.map +0 -1
  200. package/dist/ai/providers/openai/openai-model-catalog.js +0 -209
  201. package/dist/ai/providers/openai/openai-model-catalog.js.map +0 -1
  202. package/dist/ai/providers/openai/openai-realtime.mapper.d.ts +0 -18
  203. package/dist/ai/providers/openai/openai-realtime.mapper.d.ts.map +0 -1
  204. package/dist/ai/providers/openai/openai-realtime.mapper.js +0 -159
  205. package/dist/ai/providers/openai/openai-realtime.mapper.js.map +0 -1
  206. package/dist/ai/providers/openai/openai-redirect-guard.d.ts +0 -9
  207. package/dist/ai/providers/openai/openai-redirect-guard.d.ts.map +0 -1
  208. package/dist/ai/providers/openai/openai-redirect-guard.js +0 -61
  209. package/dist/ai/providers/openai/openai-redirect-guard.js.map +0 -1
  210. package/dist/ai/providers/openai/openai-responses.engine.d.ts +0 -50
  211. package/dist/ai/providers/openai/openai-responses.engine.d.ts.map +0 -1
  212. package/dist/ai/providers/openai/openai-responses.engine.js +0 -206
  213. package/dist/ai/providers/openai/openai-responses.engine.js.map +0 -1
  214. package/dist/ai/providers/openai/openai-responses.mapper.d.ts +0 -64
  215. package/dist/ai/providers/openai/openai-responses.mapper.d.ts.map +0 -1
  216. package/dist/ai/providers/openai/openai-responses.mapper.js +0 -580
  217. package/dist/ai/providers/openai/openai-responses.mapper.js.map +0 -1
  218. package/dist/ai/providers/openai/openai-stream.mapper.d.ts +0 -28
  219. package/dist/ai/providers/openai/openai-stream.mapper.d.ts.map +0 -1
  220. package/dist/ai/providers/openai/openai-stream.mapper.js +0 -139
  221. package/dist/ai/providers/openai/openai-stream.mapper.js.map +0 -1
  222. package/dist/ai/providers/openai/testing/chat-completions-fixtures.d.ts +0 -24
  223. package/dist/ai/providers/openai/testing/chat-completions-fixtures.d.ts.map +0 -1
  224. package/dist/ai/providers/openai/testing/chat-completions-fixtures.js +0 -72
  225. package/dist/ai/providers/openai/testing/chat-completions-fixtures.js.map +0 -1
  226. package/dist/ai/providers/openai/testing/conformance-responders.d.ts +0 -7
  227. package/dist/ai/providers/openai/testing/conformance-responders.d.ts.map +0 -1
  228. package/dist/ai/providers/openai/testing/conformance-responders.js +0 -64
  229. package/dist/ai/providers/openai/testing/conformance-responders.js.map +0 -1
  230. package/dist/ai/providers/openai/testing/openai-fixtures.d.ts +0 -52
  231. package/dist/ai/providers/openai/testing/openai-fixtures.d.ts.map +0 -1
  232. package/dist/ai/providers/openai/testing/openai-fixtures.js +0 -208
  233. package/dist/ai/providers/openai/testing/openai-fixtures.js.map +0 -1
  234. package/dist/ai/providers/openai/testing/openai-mock-transport.d.ts +0 -242
  235. package/dist/ai/providers/openai/testing/openai-mock-transport.d.ts.map +0 -1
  236. package/dist/ai/providers/openai/testing/openai-mock-transport.js +0 -523
  237. package/dist/ai/providers/openai/testing/openai-mock-transport.js.map +0 -1
  238. package/dist/ai/providers/openai-compatible/openai-compatible-settings.d.ts +0 -13
  239. package/dist/ai/providers/openai-compatible/openai-compatible-settings.d.ts.map +0 -1
  240. package/dist/ai/providers/openai-compatible/openai-compatible-settings.js +0 -29
  241. package/dist/ai/providers/openai-compatible/openai-compatible-settings.js.map +0 -1
@@ -1,81 +0,0 @@
1
- "use strict";
2
- // =============================================================================
3
- // OpenAI embeddings mapper (issue #440, epic #420)
4
- // =============================================================================
5
- //
6
- // AiEmbeddingRequest <-> `POST /v1/embeddings`. Pure functions; every failure
7
- // is an `AiError`, never an SDK error.
8
- //
9
- // FLOATS ON THE WIRE, ALWAYS. The SDK asks for `base64` when no
10
- // `encoding_format` is given and decodes it into `Float32Array`s, which are
11
- // not `number[]` (JSON.stringify turns one into an object keyed by index).
12
- // This mapper pins `encoding_format: 'float'` and forbids the escape hatch
13
- // from changing it, so a vector is a plain `number[]` end to end.
14
- //
15
- // `dimensions`. Only `text-embedding-3` and later accept it; `ada-002` is the
16
- // one family known NOT to, and is refused here rather than sent to a 400 the
17
- // caller would have to decode. An unknown id passes through — the provider
18
- // is the authority, and its 400 maps to `AI_INVALID_REQUEST` anyway.
19
- // =============================================================================
20
- Object.defineProperty(exports, "__esModule", { value: true });
21
- exports.openAiEmbeddingSupportsDimensions = openAiEmbeddingSupportsDimensions;
22
- exports.toOpenAiEmbeddingRequest = toOpenAiEmbeddingRequest;
23
- exports.fromOpenAiEmbeddingResponse = fromOpenAiEmbeddingResponse;
24
- const ai_error_1 = require("../../core/ai-error");
25
- const openai_errors_1 = require("./openai-errors");
26
- /** Embedding families that do not accept `dimensions`. */
27
- const FIXED_DIMENSION_MODELS = /^text-embedding-ada-/;
28
- /** Whether OpenAI model `modelId` accepts the `dimensions` parameter. */
29
- function openAiEmbeddingSupportsDimensions(modelId) {
30
- return !FIXED_DIMENSION_MODELS.test(modelId.trim().toLowerCase());
31
- }
32
- /** The `/v1/embeddings` body for `req`. `providerOptions.openai` merges first; the port's own fields win. */
33
- function toOpenAiEmbeddingRequest(req, family = openai_errors_1.OPENAI_FAMILY) {
34
- if (req.dimensions !== undefined && !openAiEmbeddingSupportsDimensions(req.model)) {
35
- throw new ai_error_1.AiError('AI_INVALID_REQUEST', `Model "${req.model}" does not support a custom embedding length (dimensions).`, { details: { provider: family.providerId, model: req.model, dimensions: req.dimensions } });
36
- }
37
- const escapeHatch = (req.providerOptions?.[family.providerId] ?? {});
38
- return {
39
- ...escapeHatch,
40
- model: req.model,
41
- input: req.input,
42
- ...(req.dimensions !== undefined ? { dimensions: req.dimensions } : {}),
43
- encoding_format: 'float',
44
- };
45
- }
46
- /**
47
- * The neutral result. Vectors are ordered by OpenAI's `index` (never trusted
48
- * to already be in order), and the answer must hold exactly one vector per
49
- * input, all the same length — anything else is a provider fault
50
- * (`AI_PROVIDER_UNAVAILABLE`), not something to hand a caller who will store
51
- * it next to a row.
52
- */
53
- function fromOpenAiEmbeddingResponse(data, opts) {
54
- const family = opts.family ?? openai_errors_1.OPENAI_FAMILY;
55
- const expected = typeof opts.request.input === 'string' ? 1 : opts.request.input.length;
56
- const items = [...(data.data ?? [])].sort((a, b) => a.index - b.index);
57
- const vectors = items.map((item) => item.embedding);
58
- const dimensions = vectors[0]?.length ?? 0;
59
- const malformed = vectors.length !== expected ||
60
- dimensions === 0 ||
61
- vectors.some((vector) => !Array.isArray(vector) || vector.length !== dimensions);
62
- if (malformed) {
63
- throw new ai_error_1.AiError('AI_PROVIDER_UNAVAILABLE', `${family.label} returned a malformed embeddings response.`, {
64
- details: {
65
- provider: family.providerId,
66
- expected,
67
- received: vectors.length,
68
- ...(opts.providerRequestId ? { providerRequestId: opts.providerRequestId } : {}),
69
- },
70
- });
71
- }
72
- return {
73
- provider: family.providerId,
74
- model: data.model || opts.request.model,
75
- vectors,
76
- dimensions,
77
- usage: typeof data.usage?.prompt_tokens === 'number' ? { inputTokens: data.usage.prompt_tokens } : {},
78
- ...(opts.providerRequestId ? { providerRequestId: opts.providerRequestId } : {}),
79
- };
80
- }
81
- //# sourceMappingURL=openai-embeddings.mapper.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"openai-embeddings.mapper.js","sourceRoot":"","sources":["../../../../src/ai/providers/openai/openai-embeddings.mapper.ts"],"names":[],"mappings":"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"}
@@ -1,45 +0,0 @@
1
- import { AiError, AiErrorCode } from '../../core/ai-error';
2
- export declare const OPENAI_PROVIDER_ID = "openai";
3
- /**
4
- * Which member of the OpenAI wire family an error or a response belongs to
5
- * (#448). The OpenAI adapter, the Azure OpenAI adapter and the generic
6
- * OpenAI-compatible adapter all speak the same wire protocol through the same
7
- * SDK, so they share this file's mapping and the mappers beside it; the
8
- * family only changes the provider id stamped on `details` /
9
- * `AiResponse.provider` and the name in the generic, secret-free messages. Every
10
- * function taking one defaults to {@link OPENAI_FAMILY}, so the OpenAI
11
- * adapter's behaviour is exactly what it was before the extraction.
12
- */
13
- export interface OpenAiFamily {
14
- /** The adapter's permanent provider id (`'openai'`, `'azure-openai'`, ...). */
15
- providerId: string;
16
- /** How the generic error messages name the provider (`'OpenAI'`). */
17
- label: string;
18
- }
19
- /** OpenAI itself. */
20
- export declare const OPENAI_FAMILY: OpenAiFamily;
21
- /** The generic, secret-free message this adapter family uses for `code`. */
22
- export declare function openAiErrorMessage(code: AiErrorCode, family?: OpenAiFamily): string;
23
- /** Classifies an OpenAI error `code` that arrived without a usable HTTP status. */
24
- export declare function classifyOpenAiErrorCode(code: string | null | undefined): AiErrorCode;
25
- /**
26
- * The provider's requested back-off: OpenAI's own millisecond header first
27
- * (more precise), then the standard `Retry-After` (seconds or HTTP-date).
28
- */
29
- export declare function retryAfterFromHeaders(headers: Headers | undefined): number | undefined;
30
- /** Which `AiErrorCode` an SDK `APIError` means. Pure — exported for the table spec. */
31
- export declare function openAiErrorCode(err: unknown): AiErrorCode;
32
- /**
33
- * Turns anything an OpenAI call threw into an `AiError`. An `AiError` is
34
- * returned unchanged (the mapper's own `AI_CAPABILITY_UNSUPPORTED`, for one).
35
- */
36
- export declare function mapOpenAiError(err: unknown, family?: OpenAiFamily): AiError;
37
- /**
38
- * The `AiError` for a response OpenAI returned with `status: 'failed'` (or a
39
- * `response.failed` stream event): the failure is in the body, not an HTTP
40
- * status, so only its `code` can be classified.
41
- */
42
- export declare function mapOpenAiResponseFailure(error: {
43
- code?: string | null;
44
- } | null | undefined, providerRequestId?: string, family?: OpenAiFamily): AiError;
45
- //# sourceMappingURL=openai-errors.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"openai-errors.d.ts","sourceRoot":"","sources":["../../../../src/ai/providers/openai/openai-errors.ts"],"names":[],"mappings":"AA0CA,OAAO,EAAE,OAAO,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAG3D,eAAO,MAAM,kBAAkB,WAAW,CAAC;AAE3C;;;;;;;;;GASG;AACH,MAAM,WAAW,YAAY;IAC3B,+EAA+E;IAC/E,UAAU,EAAE,MAAM,CAAC;IACnB,qEAAqE;IACrE,KAAK,EAAE,MAAM,CAAC;CACf;AAED,qBAAqB;AACrB,eAAO,MAAM,aAAa,EAAE,YAAiF,CAAC;AA8D9G,4EAA4E;AAC5E,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,WAAW,EAAE,MAAM,GAAE,YAA4B,GAAG,MAAM,CASlG;AAMD,mFAAmF;AACnF,wBAAgB,uBAAuB,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,GAAG,WAAW,CASpF;AAED;;;GAGG;AACH,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,OAAO,GAAG,SAAS,GAAG,MAAM,GAAG,SAAS,CAUtF;AAED,uFAAuF;AACvF,wBAAgB,eAAe,CAAC,GAAG,EAAE,OAAO,GAAG,WAAW,CA6CzD;AAED;;;GAGG;AACH,wBAAgB,cAAc,CAAC,GAAG,EAAE,OAAO,EAAE,MAAM,GAAE,YAA4B,GAAG,OAAO,CA8B1F;AAED;;;;GAIG;AACH,wBAAgB,wBAAwB,CACtC,KAAK,EAAE;IAAE,IAAI,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;CAAE,GAAG,IAAI,GAAG,SAAS,EAClD,iBAAiB,CAAC,EAAE,MAAM,EAC1B,MAAM,GAAE,YAA4B,GACnC,OAAO,CAST"}
@@ -1,247 +0,0 @@
1
- "use strict";
2
- // =============================================================================
3
- // OpenAI SDK error -> AiError (issue #426, epic #419)
4
- // =============================================================================
5
- //
6
- // The one place an OpenAI SDK failure becomes an `AiError`. Every other file
7
- // in this adapter funnels its `catch` through `mapOpenAiError`, so a raw SDK
8
- // exception never crosses the `AiProviderAdapter` boundary (the conformance
9
- // kit asserts it) and the same provider condition cannot surface as two
10
- // different codes from two call sites.
11
- //
12
- // ⚠ SECRETS. The SDK's own `message` can echo request details — an invalid
13
- // key comes back as "Incorrect API key provided: sk-abc***…" — so it is NEVER
14
- // copied into the `AiError`'s message or details. What does travel, in
15
- // `details`, is only short machine-readable metadata the provider assigned:
16
- // the HTTP status, OpenAI's error `code`/`type`/`param`, and its request id.
17
- // The SDK error itself is kept as the (non-enumerable, never serialised)
18
- // `cause`, for a debugger.
19
- //
20
- // The mapping is data-driven by SDK class first (the SDK already turns a
21
- // status into a class), then refined by OpenAI's own `code` where one class
22
- // covers two meanings (a 400 that is a content-policy refusal, a 404 that is
23
- // an unknown model). The table in `openai-errors.spec.ts` pins every class.
24
- // =============================================================================
25
- Object.defineProperty(exports, "__esModule", { value: true });
26
- exports.OPENAI_FAMILY = exports.OPENAI_PROVIDER_ID = void 0;
27
- exports.openAiErrorMessage = openAiErrorMessage;
28
- exports.classifyOpenAiErrorCode = classifyOpenAiErrorCode;
29
- exports.retryAfterFromHeaders = retryAfterFromHeaders;
30
- exports.openAiErrorCode = openAiErrorCode;
31
- exports.mapOpenAiError = mapOpenAiError;
32
- exports.mapOpenAiResponseFailure = mapOpenAiResponseFailure;
33
- const openai_1 = require("openai");
34
- const error_1 = require("openai/core/error");
35
- const ai_error_1 = require("../../core/ai-error");
36
- const index_1 = require("../../../jobs/index");
37
- exports.OPENAI_PROVIDER_ID = 'openai';
38
- /** OpenAI itself. */
39
- exports.OPENAI_FAMILY = Object.freeze({ providerId: exports.OPENAI_PROVIDER_ID, label: 'OpenAI' });
40
- /**
41
- * OpenAI error codes that mean "the provider refused this content", whatever
42
- * HTTP status (or none, mid-stream) carried them. `invalid_prompt` is what a
43
- * reasoning model answers when a prompt is flagged under the usage policy.
44
- */
45
- const CONTENT_FILTER_CODES = new Set([
46
- 'content_filter',
47
- 'content_policy_violation',
48
- 'image_content_policy_violation',
49
- 'invalid_prompt',
50
- 'bio_policy',
51
- 'misalignment_policy_violation',
52
- // The images API's refusal (`/v1/images/*` answers 400 with this code).
53
- 'moderation_blocked',
54
- ]);
55
- /** Codes that name the model as the problem — the key cannot reach it. */
56
- const MODEL_UNREACHABLE_CODES = new Set(['model_not_found', 'model_not_available']);
57
- /** Codes a streamed (status-less) failure carries that are the caller's fault. */
58
- const CALLER_FAULT_CODES = new Set([
59
- 'invalid_image',
60
- 'invalid_image_format',
61
- 'invalid_base64_image',
62
- 'invalid_image_url',
63
- 'image_too_large',
64
- 'image_too_small',
65
- 'image_parse_error',
66
- 'invalid_image_mode',
67
- 'image_file_too_large',
68
- 'unsupported_image_media_type',
69
- 'empty_image_file',
70
- 'failed_to_download_image',
71
- 'image_file_not_found',
72
- 'data_residency_mismatch',
73
- 'context_length_exceeded',
74
- ]);
75
- function messagesFor(label) {
76
- return {
77
- AI_DISABLED: 'AI is disabled.',
78
- AI_PROVIDER_DISABLED: 'The AI provider is disabled.',
79
- AI_KEY_REQUIRED: 'An API key is required for this AI provider.',
80
- AI_KEY_INVALID: `The ${label} API key was rejected.`,
81
- AI_MODEL_NOT_ENABLED: 'The model is not enabled.',
82
- AI_MODEL_NOT_REACHABLE: `The ${label} model is not reachable with this API key.`,
83
- AI_CAPABILITY_UNSUPPORTED: `The request uses a capability ${label} does not support here.`,
84
- AI_TOOL_DISABLED: 'The requested tool is not enabled in this deployment.',
85
- AI_REALTIME_DISABLED: 'Realtime sessions are not enabled in this deployment.',
86
- AI_RATE_LIMITED: `${label} rate-limited the request.`,
87
- AI_PROVIDER_UNAVAILABLE: `${label} is unavailable or the request failed.`,
88
- AI_CONTENT_FILTERED: `${label} refused the request under its content policy.`,
89
- AI_INVALID_REQUEST: `${label} rejected the request as invalid.`,
90
- AI_STRUCTURED_OUTPUT_INVALID: 'The model output does not match the requested schema.',
91
- AI_STORAGE_UNAVAILABLE: 'Object storage is unavailable.',
92
- };
93
- }
94
- const MESSAGES_BY_LABEL = new Map();
95
- /** The generic, secret-free message this adapter family uses for `code`. */
96
- function openAiErrorMessage(code, family = exports.OPENAI_FAMILY) {
97
- let messages = MESSAGES_BY_LABEL.get(family.label);
98
- if (!messages) {
99
- messages = messagesFor(family.label);
100
- MESSAGES_BY_LABEL.set(family.label, messages);
101
- }
102
- return messages[code];
103
- }
104
- function stringOrUndefined(value) {
105
- return typeof value === 'string' && value.length > 0 ? value : undefined;
106
- }
107
- /** Classifies an OpenAI error `code` that arrived without a usable HTTP status. */
108
- function classifyOpenAiErrorCode(code) {
109
- if (!code)
110
- return 'AI_PROVIDER_UNAVAILABLE';
111
- if (CONTENT_FILTER_CODES.has(code))
112
- return 'AI_CONTENT_FILTERED';
113
- if (MODEL_UNREACHABLE_CODES.has(code))
114
- return 'AI_MODEL_NOT_REACHABLE';
115
- if (code === 'rate_limit_exceeded' || code === 'insufficient_quota')
116
- return 'AI_RATE_LIMITED';
117
- if (code === 'invalid_api_key')
118
- return 'AI_KEY_INVALID';
119
- if (CALLER_FAULT_CODES.has(code))
120
- return 'AI_INVALID_REQUEST';
121
- return 'AI_PROVIDER_UNAVAILABLE';
122
- }
123
- /**
124
- * The provider's requested back-off: OpenAI's own millisecond header first
125
- * (more precise), then the standard `Retry-After` (seconds or HTTP-date).
126
- */
127
- function retryAfterFromHeaders(headers) {
128
- if (!headers)
129
- return undefined;
130
- const ms = headers.get('retry-after-ms');
131
- if (ms !== null && /^\d+(\.\d+)?$/.test(ms.trim())) {
132
- return Math.ceil(Number(ms));
133
- }
134
- return (0, index_1.parseRetryAfterMs)(headers.get('retry-after')) ?? undefined;
135
- }
136
- /** Which `AiErrorCode` an SDK `APIError` means. Pure — exported for the table spec. */
137
- function openAiErrorCode(err) {
138
- if (err instanceof ai_error_1.AiError)
139
- return err.code;
140
- // Order matters: subclasses before their parents.
141
- if (err instanceof openai_1.APIUserAbortError)
142
- return 'AI_PROVIDER_UNAVAILABLE';
143
- if (err instanceof openai_1.APIConnectionError)
144
- return 'AI_PROVIDER_UNAVAILABLE';
145
- if (err instanceof openai_1.OAuthError)
146
- return 'AI_KEY_INVALID';
147
- if (err instanceof openai_1.AuthenticationError)
148
- return 'AI_KEY_INVALID';
149
- if (err instanceof openai_1.APIError) {
150
- const code = err.code ?? undefined;
151
- if (code && MODEL_UNREACHABLE_CODES.has(code))
152
- return 'AI_MODEL_NOT_REACHABLE';
153
- if (code && CONTENT_FILTER_CODES.has(code))
154
- return 'AI_CONTENT_FILTERED';
155
- }
156
- if (err instanceof openai_1.PermissionDeniedError)
157
- return 'AI_MODEL_NOT_REACHABLE';
158
- if (err instanceof openai_1.NotFoundError) {
159
- return err.param === 'model' ? 'AI_MODEL_NOT_REACHABLE' : 'AI_INVALID_REQUEST';
160
- }
161
- if (err instanceof openai_1.RateLimitError)
162
- return 'AI_RATE_LIMITED';
163
- if (err instanceof openai_1.BadRequestError)
164
- return 'AI_INVALID_REQUEST';
165
- if (err instanceof openai_1.UnprocessableEntityError)
166
- return 'AI_INVALID_REQUEST';
167
- if (err instanceof openai_1.ConflictError)
168
- return 'AI_INVALID_REQUEST';
169
- if (err instanceof openai_1.InternalServerError)
170
- return 'AI_PROVIDER_UNAVAILABLE';
171
- if (err instanceof openai_1.APIError) {
172
- // A status the SDK has no class for, or none at all (a mid-stream
173
- // `error` event, which the SDK raises as a status-less APIError).
174
- if (typeof err.status === 'number') {
175
- if (err.status === 401)
176
- return 'AI_KEY_INVALID';
177
- if (err.status === 429)
178
- return 'AI_RATE_LIMITED';
179
- if (err.status >= 500 || err.status === 408)
180
- return 'AI_PROVIDER_UNAVAILABLE';
181
- if (err.status >= 400)
182
- return 'AI_INVALID_REQUEST';
183
- }
184
- return classifyOpenAiErrorCode(err.code);
185
- }
186
- if (err instanceof error_1.ContentFilterFinishReasonError)
187
- return 'AI_CONTENT_FILTERED';
188
- if (err instanceof error_1.LengthFinishReasonError)
189
- return 'AI_INVALID_REQUEST';
190
- if (err instanceof openai_1.OpenAIError)
191
- return 'AI_PROVIDER_UNAVAILABLE';
192
- // A fetch/socket failure, a malformed SSE frame, anything else.
193
- return 'AI_PROVIDER_UNAVAILABLE';
194
- }
195
- /**
196
- * Turns anything an OpenAI call threw into an `AiError`. An `AiError` is
197
- * returned unchanged (the mapper's own `AI_CAPABILITY_UNSUPPORTED`, for one).
198
- */
199
- function mapOpenAiError(err, family = exports.OPENAI_FAMILY) {
200
- if (err instanceof ai_error_1.AiError)
201
- return err;
202
- const code = openAiErrorCode(err);
203
- const details = { provider: family.providerId };
204
- let retryAfterMs;
205
- if (err instanceof openai_1.APIUserAbortError) {
206
- details.aborted = true;
207
- }
208
- else if (err instanceof openai_1.APIConnectionError) {
209
- details.transport = err instanceof openai_1.APIConnectionTimeoutError ? 'timeout' : 'connection';
210
- }
211
- else if (err instanceof openai_1.APIError) {
212
- if (typeof err.status === 'number')
213
- details.status = err.status;
214
- const providerCode = stringOrUndefined(err.code);
215
- const providerType = stringOrUndefined(err.type);
216
- const param = stringOrUndefined(err.param);
217
- const providerRequestId = stringOrUndefined(err.requestID);
218
- if (providerCode)
219
- details.providerCode = providerCode;
220
- if (providerType)
221
- details.providerType = providerType;
222
- if (param)
223
- details.param = param;
224
- if (providerRequestId)
225
- details.providerRequestId = providerRequestId;
226
- if (code === 'AI_RATE_LIMITED') {
227
- retryAfterMs = retryAfterFromHeaders(err.headers);
228
- }
229
- }
230
- return new ai_error_1.AiError(code, openAiErrorMessage(code, family), { cause: err, details, retryAfterMs });
231
- }
232
- /**
233
- * The `AiError` for a response OpenAI returned with `status: 'failed'` (or a
234
- * `response.failed` stream event): the failure is in the body, not an HTTP
235
- * status, so only its `code` can be classified.
236
- */
237
- function mapOpenAiResponseFailure(error, providerRequestId, family = exports.OPENAI_FAMILY) {
238
- const code = classifyOpenAiErrorCode(error?.code ?? undefined);
239
- const details = { provider: family.providerId };
240
- const providerCode = stringOrUndefined(error?.code);
241
- if (providerCode)
242
- details.providerCode = providerCode;
243
- if (providerRequestId)
244
- details.providerRequestId = providerRequestId;
245
- return new ai_error_1.AiError(code, openAiErrorMessage(code, family), { details });
246
- }
247
- //# sourceMappingURL=openai-errors.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"openai-errors.js","sourceRoot":"","sources":["../../../../src/ai/providers/openai/openai-errors.ts"],"names":[],"mappings":"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"}
@@ -1,4 +0,0 @@
1
- import type { AiResponseRequest } from '../../core/types/responses.types';
2
- /** Refuses a hosted tool with `AI_CAPABILITY_UNSUPPORTED` before any call. */
3
- export declare function assertNoHostedTools(req: AiResponseRequest, providerId: string): void;
4
- //# sourceMappingURL=openai-family-guards.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"openai-family-guards.d.ts","sourceRoot":"","sources":["../../../../src/ai/providers/openai/openai-family-guards.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,kCAAkC,CAAC;AAE1E,8EAA8E;AAC9E,wBAAgB,mBAAmB,CAAC,GAAG,EAAE,iBAAiB,EAAE,UAAU,EAAE,MAAM,GAAG,IAAI,CAQpF"}
@@ -1,19 +0,0 @@
1
- "use strict";
2
- // Request guards shared by the #448 adapters (Azure OpenAI, OpenAI-compatible),
3
- // which declare `supportsHostedTools: false`: the runtime already refuses a
4
- // hosted tool for them before resolving a key (the registry derives no
5
- // `hosted_tools` capability), and this is the same refusal for a DIRECT port
6
- // caller — the defence in depth the Anthropic mapper gives `previousResponseId`.
7
- Object.defineProperty(exports, "__esModule", { value: true });
8
- exports.assertNoHostedTools = assertNoHostedTools;
9
- const ai_error_1 = require("../../core/ai-error");
10
- /** Refuses a hosted tool with `AI_CAPABILITY_UNSUPPORTED` before any call. */
11
- function assertNoHostedTools(req, providerId) {
12
- const hosted = req.tools?.find((tool) => tool.type !== 'function');
13
- if (hosted) {
14
- throw new ai_error_1.AiError('AI_CAPABILITY_UNSUPPORTED', `Hosted tool "${hosted.type}" is not supported by this provider.`, {
15
- details: { provider: providerId, tool: hosted.type, capability: 'hosted_tools' },
16
- });
17
- }
18
- }
19
- //# sourceMappingURL=openai-family-guards.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"openai-family-guards.js","sourceRoot":"","sources":["../../../../src/ai/providers/openai/openai-family-guards.ts"],"names":[],"mappings":";AAAA,gFAAgF;AAChF,4EAA4E;AAC5E,uEAAuE;AACvE,6EAA6E;AAC7E,iFAAiF;;AAMjF,kDAQC;AAZD,kDAA8C;AAG9C,8EAA8E;AAC9E,SAAgB,mBAAmB,CAAC,GAAsB,EAAE,UAAkB;IAC5E,MAAM,MAAM,GAAG,GAAG,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,KAAK,UAAU,CAAC,CAAC;IAEnE,IAAI,MAAM,EAAE,CAAC;QACX,MAAM,IAAI,kBAAO,CAAC,2BAA2B,EAAE,gBAAgB,MAAM,CAAC,IAAI,sCAAsC,EAAE;YAChH,OAAO,EAAE,EAAE,QAAQ,EAAE,UAAU,EAAE,IAAI,EAAE,MAAM,CAAC,IAAI,EAAE,UAAU,EAAE,cAAc,EAAE;SACjF,CAAC,CAAC;IACL,CAAC;AACH,CAAC"}
@@ -1,23 +0,0 @@
1
- import type { ImageEditParamsNonStreaming, ImageGenerateParamsNonStreaming, ImagesResponse } from 'openai/resources/images';
2
- import type { AiImageEditRequest, AiImageGenerationRequest, AiImageResult } from '../../core/types/media.types';
3
- /** Whether OpenAI model `modelId` is a DALL·E model (URL-by-default, no output_format). */
4
- export declare function isOpenAiDallE(modelId: string): boolean;
5
- /** The `/v1/images/generations` body. `providerOptions.openai` merges first; the port's own fields win. */
6
- export declare function toOpenAiImageGenerateRequest(req: AiImageGenerationRequest): ImageGenerateParamsNonStreaming;
7
- /**
8
- * The `/v1/images/edits` multipart body. The images (and mask) become SDK
9
- * uploads carrying their MIME type, so OpenAI can tell a PNG from a JPEG.
10
- */
11
- export declare function toOpenAiImageEditRequest(req: AiImageEditRequest): Promise<ImageEditParamsNonStreaming>;
12
- export interface FromOpenAiImagesOptions {
13
- request: AiImageGenerationRequest;
14
- providerRequestId?: string | null;
15
- }
16
- /**
17
- * The neutral result: one decoded image per `data` entry, each with the MIME
18
- * type of the format the provider says it produced (the request's
19
- * `outputFormat` when it does not say, PNG when neither does). No images, or
20
- * an entry with no `b64_json` (a URL-only answer), is a provider fault.
21
- */
22
- export declare function fromOpenAiImagesResponse(data: ImagesResponse, opts: FromOpenAiImagesOptions): AiImageResult;
23
- //# sourceMappingURL=openai-images.mapper.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"openai-images.mapper.d.ts","sourceRoot":"","sources":["../../../../src/ai/providers/openai/openai-images.mapper.ts"],"names":[],"mappings":"AAuBA,OAAO,KAAK,EACV,2BAA2B,EAC3B,+BAA+B,EAC/B,cAAc,EACf,MAAM,yBAAyB,CAAC;AAGjC,OAAO,KAAK,EAGV,kBAAkB,EAClB,wBAAwB,EACxB,aAAa,EACd,MAAM,8BAA8B,CAAC;AAoBtC,2FAA2F;AAC3F,wBAAgB,aAAa,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAEtD;AAiCD,2GAA2G;AAC3G,wBAAgB,4BAA4B,CAAC,GAAG,EAAE,wBAAwB,GAAG,+BAA+B,CAE3G;AAQD;;;GAGG;AACH,wBAAsB,wBAAwB,CAAC,GAAG,EAAE,kBAAkB,GAAG,OAAO,CAAC,2BAA2B,CAAC,CA8B5G;AAED,MAAM,WAAW,uBAAuB;IACtC,OAAO,EAAE,wBAAwB,CAAC;IAClC,iBAAiB,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CACnC;AAwBD;;;;;GAKG;AACH,wBAAgB,wBAAwB,CAAC,IAAI,EAAE,cAAc,EAAE,IAAI,EAAE,uBAAuB,GAAG,aAAa,CAmC3G"}
@@ -1,164 +0,0 @@
1
- "use strict";
2
- // =============================================================================
3
- // OpenAI images mapper (issue #437, epic #420)
4
- // =============================================================================
5
- //
6
- // AiImageGenerationRequest / AiImageEditRequest <-> `POST /v1/images/generations`
7
- // and `POST /v1/images/edits`. Pure functions (plus `toFile`, which only wraps
8
- // bytes); every failure is an `AiError`, never an SDK error.
9
- //
10
- // BYTES, NEVER URLS. The port's contract (`media.types.ts`) is bytes + MIME
11
- // type: a provider-hosted URL expires and is not ours to authorize. The GPT
12
- // image family always answers `b64_json`; the DALL·E family defaults to a
13
- // URL, so the mapper pins `response_format: 'b64_json'` for it — and refuses
14
- // an answer that carries only a URL rather than fetching it.
15
- //
16
- // TWO FAMILIES, TWO PARAMETER SETS. `gpt-image-*` (and `chatgpt-image-*`)
17
- // take `output_format`, `background` and `quality: low|medium|high|auto`, and
18
- // reject `response_format`. `dall-e-*` take `response_format` and reject the
19
- // other three (DALL·E 3 names its quality `standard|hd`), so for DALL·E the
20
- // neutral `quality: 'high'` becomes `hd` and everything the family cannot
21
- // honour is left out rather than sent to a 400. DALL·E always returns PNG.
22
- // =============================================================================
23
- Object.defineProperty(exports, "__esModule", { value: true });
24
- exports.isOpenAiDallE = isOpenAiDallE;
25
- exports.toOpenAiImageGenerateRequest = toOpenAiImageGenerateRequest;
26
- exports.toOpenAiImageEditRequest = toOpenAiImageEditRequest;
27
- exports.fromOpenAiImagesResponse = fromOpenAiImagesResponse;
28
- const openai_1 = require("openai");
29
- const ai_error_1 = require("../../core/ai-error");
30
- const openai_errors_1 = require("./openai-errors");
31
- const DALL_E = /^dall-e-/;
32
- const DALL_E_3 = /^dall-e-3(?:-|$)/;
33
- const FORMAT_MIME = {
34
- png: 'image/png',
35
- jpeg: 'image/jpeg',
36
- webp: 'image/webp',
37
- };
38
- const MIME_EXTENSION = {
39
- 'image/png': 'png',
40
- 'image/jpeg': 'jpg',
41
- 'image/webp': 'webp',
42
- 'image/gif': 'gif',
43
- };
44
- /** Whether OpenAI model `modelId` is a DALL·E model (URL-by-default, no output_format). */
45
- function isOpenAiDallE(modelId) {
46
- return DALL_E.test(modelId.trim().toLowerCase());
47
- }
48
- /** The fields generate and edit share, shaped for the model's family. */
49
- function sharedParams(req) {
50
- const params = { model: req.model, prompt: req.prompt };
51
- if (req.n !== undefined)
52
- params.n = req.n;
53
- if (req.size !== undefined)
54
- params.size = req.size;
55
- if (isOpenAiDallE(req.model)) {
56
- params.response_format = 'b64_json';
57
- if (req.quality === 'high' && DALL_E_3.test(req.model.trim().toLowerCase())) {
58
- params.quality = 'hd';
59
- }
60
- }
61
- else {
62
- if (req.quality !== undefined)
63
- params.quality = req.quality;
64
- if (req.background !== undefined)
65
- params.background = req.background;
66
- if (req.outputFormat !== undefined)
67
- params.output_format = req.outputFormat;
68
- }
69
- return params;
70
- }
71
- function escapeHatch(req) {
72
- return (req.providerOptions?.[openai_errors_1.OPENAI_PROVIDER_ID] ?? {});
73
- }
74
- /** The `/v1/images/generations` body. `providerOptions.openai` merges first; the port's own fields win. */
75
- function toOpenAiImageGenerateRequest(req) {
76
- return { ...escapeHatch(req), ...sharedParams(req), stream: false };
77
- }
78
- function fileName(payload, fallback) {
79
- if (payload.filename && payload.filename.trim().length > 0)
80
- return payload.filename;
81
- return `${fallback}.${MIME_EXTENSION[payload.mimeType] ?? 'png'}`;
82
- }
83
- /**
84
- * The `/v1/images/edits` multipart body. The images (and mask) become SDK
85
- * uploads carrying their MIME type, so OpenAI can tell a PNG from a JPEG.
86
- */
87
- async function toOpenAiImageEditRequest(req) {
88
- if (!Array.isArray(req.images) || req.images.length === 0) {
89
- throw new ai_error_1.AiError('AI_INVALID_REQUEST', 'An image edit needs at least one source image.', {
90
- details: { provider: openai_errors_1.OPENAI_PROVIDER_ID },
91
- });
92
- }
93
- const images = await Promise.all(req.images.map((image, index) => (0, openai_1.toFile)(image.data, fileName(image, `image-${index + 1}`), { type: image.mimeType })));
94
- // `hd` is DALL·E 3's word, and DALL·E 3 cannot edit: never send it here.
95
- const { quality, ...shared } = sharedParams(req);
96
- const body = {
97
- ...escapeHatch(req),
98
- ...shared,
99
- ...(quality !== undefined && quality !== 'hd' ? { quality } : {}),
100
- // DALL·E 2 edits exactly one image and rejects the array form.
101
- image: images.length === 1 && isOpenAiDallE(req.model) ? images[0] : images,
102
- stream: false,
103
- };
104
- if (req.mask) {
105
- body.mask = await (0, openai_1.toFile)(req.mask.data, fileName(req.mask, 'mask'), { type: req.mask.mimeType });
106
- }
107
- return body;
108
- }
109
- function malformed(reason, opts) {
110
- return new ai_error_1.AiError('AI_PROVIDER_UNAVAILABLE', 'OpenAI returned a malformed images response.', {
111
- details: {
112
- provider: openai_errors_1.OPENAI_PROVIDER_ID,
113
- reason,
114
- ...(opts.providerRequestId ? { providerRequestId: opts.providerRequestId } : {}),
115
- },
116
- });
117
- }
118
- /** Token usage, where the GPT image family reports it (DALL·E does not). */
119
- function imageUsage(usage) {
120
- if (!usage)
121
- return {};
122
- const out = {};
123
- if (typeof usage.input_tokens === 'number')
124
- out.inputTokens = usage.input_tokens;
125
- if (typeof usage.output_tokens === 'number')
126
- out.outputTokens = usage.output_tokens;
127
- return out;
128
- }
129
- /**
130
- * The neutral result: one decoded image per `data` entry, each with the MIME
131
- * type of the format the provider says it produced (the request's
132
- * `outputFormat` when it does not say, PNG when neither does). No images, or
133
- * an entry with no `b64_json` (a URL-only answer), is a provider fault.
134
- */
135
- function fromOpenAiImagesResponse(data, opts) {
136
- const items = data.data ?? [];
137
- if (items.length === 0) {
138
- throw malformed('no_images', opts);
139
- }
140
- const format = data.output_format ?? (isOpenAiDallE(opts.request.model) ? 'png' : opts.request.outputFormat) ?? 'png';
141
- const mimeType = FORMAT_MIME[format] ?? 'image/png';
142
- const images = items.map((item) => {
143
- if (typeof item.b64_json !== 'string' || item.b64_json.length === 0) {
144
- throw malformed('missing_b64_json', opts);
145
- }
146
- const bytes = Buffer.from(item.b64_json, 'base64');
147
- if (bytes.length === 0) {
148
- throw malformed('empty_image', opts);
149
- }
150
- return {
151
- data: bytes,
152
- mimeType,
153
- ...(item.revised_prompt ? { revisedPrompt: item.revised_prompt } : {}),
154
- };
155
- });
156
- return {
157
- provider: openai_errors_1.OPENAI_PROVIDER_ID,
158
- model: opts.request.model,
159
- images,
160
- usage: imageUsage(data.usage),
161
- ...(opts.providerRequestId ? { providerRequestId: opts.providerRequestId } : {}),
162
- };
163
- }
164
- //# sourceMappingURL=openai-images.mapper.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"openai-images.mapper.js","sourceRoot":"","sources":["../../../../src/ai/providers/openai/openai-images.mapper.ts"],"names":[],"mappings":"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"}