@marinoscar/platform-api 0.1.0-next.5 → 0.1.0-next.7

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 +19 -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,62 +1,16 @@
1
1
  "use strict";
2
2
  // =============================================================================
3
- // Google Gemini provider adapter (issue #447, epic #421)
3
+ // GeminiProviderAdapter: the Nest binding (issue #991)
4
4
  // =============================================================================
5
5
  //
6
- // The third real `AiProviderAdapter`, and the third API shape the neutral
7
- // contract has to fit unchanged: Gemini's `generateContent` has a separate
8
- // `systemInstruction`, content PARTS in `user`/`model` turns, function calls
9
- // matched to their responses by NAME, opaque `thoughtSignature`s on parts,
10
- // thinking configured by budget or level, and no server-side conversation
11
- // state. It fits with the two flags #446 introduced and no change to the
12
- // conformance kit's requests or to any `AiService` caller. Pieces:
13
- //
14
- // gemini-client.factory.ts one SDK client per call (key, v1beta, no retries)
15
- // gemini-content.mapper.ts AiResponseRequest <-> generateContent
16
- // gemini-stream.mapper.ts stream chunks -> AiStreamEvent
17
- // gemini-embeddings.mapper.ts AiEmbeddingRequest <-> embedContent
18
- // gemini-errors.ts SDK / HTTP error -> AiError
19
- // gemini-model-catalog.ts classifyModel()'s rule table, enriched by the
20
- // listing's own metadata
21
- //
22
- // PORTS. `responses` and `embeddings`. Images, audio and realtime are ABSENT
23
- // (Gemini's image/speech/Live models are a different API surface this
24
- // adapter does not map) — presence is the declaration.
25
- //
26
- // STATELESS (#446). `supportsPreviousResponseId: false`: the facade refuses a
27
- // caller's `previousResponseId` and the tool loop resends the full history.
28
- // `thoughtSignature`s — required back on a Gemini 3 function-call turn — ride
29
- // on reasoning items as `AI_PROVIDER_STATE`, like Anthropic's thinking
30
- // signatures (see `gemini-content.mapper.ts`, REPLAY).
31
- //
32
- // NO HOSTED TOOLS (#442), `supportsHostedTools: false`. Google Search
33
- // grounding and code execution exist, but neither maps cleanly onto the
34
- // neutral result types, and a lossy mapping is worse than an honest refusal:
35
- // - grounding cites sources through `vertexaisearch.cloud.google.com`
36
- // REDIRECT links, not the source URLs `AiWebSearchCallResult.sources`
37
- // and `AiUrlCitation.url` promise, and locates citations by UTF-8 BYTE
38
- // offsets per part where `AiUrlCitation` means character offsets into
39
- // the message text;
40
- // - code execution has no container (`AiCodeInterpreterCallResult
41
- // .containerId` is required) and returns plots as inline bytes where the
42
- // neutral type carries a URL; and Gemini 2.5 cannot combine either tool
43
- // with function calling.
44
- // A follow-up can map both once the neutral types can say so honestly.
45
- //
46
- // STORAGE-OBJECT INPUTS (#441). `fileInputStrategy` is `inline` for both
47
- // modalities: the runtime reads the bytes (under its 20 MiB image / 50 MiB
48
- // file caps) and they are sent as base64 `inlineData`. A presigned URL is not
49
- // usable as `fileData` (Gemini expects a Files API or Cloud Storage URI
50
- // there), and the Files API would need an upload, a wait for the file to
51
- // become ACTIVE, and a delete — for bytes that fit inline anyway. Nothing is
52
- // uploaded, so nothing is left behind to delete. Gemini's own inline request
53
- // limit is the authority for a very large file: its 400 maps to
54
- // `AI_INVALID_REQUEST`.
55
- //
56
- // OBSERVABILITY. Every provider call runs inside an `ai.provider.call` span
57
- // carrying `ai.provider`, `ai.model`, `ai.operation` and `ai.status` (`ok` or
58
- // the AiErrorCode) — never prompt text, output text or the key — exactly as
59
- // the other adapters' do. No exception is recorded on the span.
6
+ // The adapter itself (ports, mappers, error mapping, telemetry) lives in
7
+ // `@marinoscar/platform-ai-providers/gemini`, framework-free. This subclass keeps the
8
+ // platform's injectable class and constructor signature
9
+ // (`AiProviderRegistry`, `GeminiClientFactory`), hands the base a Nest `Logger` named
10
+ // after this class and the platform tracer (`../platform-ai-tracer.ts`), so
11
+ // log lines and `ai.provider.call` spans are unchanged, and registers itself
12
+ // with `AiProviderRegistry` in `onModuleInit` as it always did. It imports no
13
+ // SDK.
60
14
  // =============================================================================
61
15
  var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
62
16
  var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
@@ -69,309 +23,33 @@ var __metadata = (this && this.__metadata) || function (k, v) {
69
23
  };
70
24
  var GeminiProviderAdapter_1;
71
25
  Object.defineProperty(exports, "__esModule", { value: true });
72
- exports.GeminiProviderAdapter = exports.GEMINI_PROVIDER_CALL_SPAN = void 0;
26
+ exports.GEMINI_PROVIDER_CALL_SPAN = exports.GeminiProviderAdapter = void 0;
73
27
  const common_1 = require("@nestjs/common");
74
- const api_1 = require("@opentelemetry/api");
75
- const ai_error_1 = require("../../core/ai-error");
28
+ const gemini_1 = require("@marinoscar/platform-ai-providers/gemini");
29
+ require("../../core/ai-error");
76
30
  const provider_registry_1 = require("../../core/provider-registry");
77
- const index_1 = require("../../../otel-core/index");
31
+ const platform_ai_tracer_1 = require("../platform-ai-tracer");
78
32
  const gemini_client_factory_1 = require("./gemini-client.factory");
79
- const gemini_content_mapper_1 = require("./gemini-content.mapper");
80
- const gemini_embeddings_mapper_1 = require("./gemini-embeddings.mapper");
81
- const gemini_errors_1 = require("./gemini-errors");
82
- const gemini_model_catalog_1 = require("./gemini-model-catalog");
83
- const gemini_stream_mapper_1 = require("./gemini-stream.mapper");
84
- /** The span name every provider adapter uses. */
85
- exports.GEMINI_PROVIDER_CALL_SPAN = 'ai.provider.call';
86
- /** Page size for `GET /v1beta/models` — the API's maximum, so a catalog is one request. */
87
- const MODELS_PAGE_SIZE = 1000;
88
- const tracer = api_1.trace.getTracer((0, index_1.resolveServiceName)());
89
- /** `models/gemini-2.5-flash` → `gemini-2.5-flash`. */
90
- function stripModelsPrefix(name) {
91
- return name.startsWith('models/') ? name.slice('models/'.length) : name;
92
- }
93
- function positiveInt(value) {
94
- return typeof value === 'number' && Number.isInteger(value) && value > 0 ? value : undefined;
95
- }
96
- let GeminiProviderAdapter = GeminiProviderAdapter_1 = class GeminiProviderAdapter {
33
+ /**
34
+ * The injectable GeminiProviderAdapter: registers itself with `AiProviderRegistry` when
35
+ * its module initialises.
36
+ *
37
+ * @stability experimental
38
+ */
39
+ let GeminiProviderAdapter = GeminiProviderAdapter_1 = class GeminiProviderAdapter extends gemini_1.GeminiProviderAdapter {
97
40
  registry;
98
- clients;
99
- id = gemini_errors_1.GEMINI_PROVIDER_ID;
100
- displayName = 'Google Gemini';
101
- /** The endpoint used when the settings slot has no `baseUrl` (#773: the egress inventory reads it). */
102
- defaultBaseUrl = gemini_client_factory_1.GEMINI_DEFAULT_BASE_URL;
103
- /** Stateless: the runtime resends history instead of chaining (#446). */
104
- supportsPreviousResponseId = false;
105
- /** Google Search grounding and code execution are not mapped yet — see the file header. */
106
- supportsHostedTools = false;
107
- /** Both modalities inline (base64) — see the file header. */
108
- fileInputStrategy = { image: 'inline', file: 'inline' };
109
- responses = {
110
- create: (req, ctx) => this.createResponse(req, ctx),
111
- stream: (req, ctx) => this.streamResponse(req, ctx),
112
- };
113
- embeddings = {
114
- embed: (req, ctx) => this.embed(req, ctx),
115
- };
116
- logger = new common_1.Logger(GeminiProviderAdapter_1.name);
41
+ /**
42
+ * @param registry - the provider registry this adapter joins.
43
+ * @param clients - the injectable SDK client factory.
44
+ */
117
45
  constructor(registry, clients) {
46
+ super({ clients, logger: new common_1.Logger(GeminiProviderAdapter_1.name), tracer: platform_ai_tracer_1.PLATFORM_AI_TRACER });
118
47
  this.registry = registry;
119
- this.clients = clients;
120
48
  }
49
+ /** Adds this adapter to `AiProviderRegistry`. */
121
50
  onModuleInit() {
122
51
  this.registry.register(this);
123
52
  }
124
- classifyModel(modelId, metadata) {
125
- return (0, gemini_model_catalog_1.classifyGeminiModel)(modelId, metadata);
126
- }
127
- /**
128
- * `GET /v1beta/models`, every page. Each model carries its listing metadata
129
- * (token limits, supported methods, thinking) for `classifyModel`.
130
- */
131
- async listModels(ctx) {
132
- return this.call('models.list', undefined, ctx, async () => {
133
- const client = this.clients.create(ctx);
134
- const pager = await client.models.list({ config: { pageSize: MODELS_PAGE_SIZE, abortSignal: ctx.signal } });
135
- const models = [];
136
- for await (const model of pager) {
137
- if (!model.name)
138
- continue;
139
- const metadata = {};
140
- const input = positiveInt(model.inputTokenLimit);
141
- const output = positiveInt(model.outputTokenLimit);
142
- if (model.displayName)
143
- metadata.displayName = model.displayName;
144
- if (input !== undefined)
145
- metadata.inputTokenLimit = input;
146
- if (output !== undefined)
147
- metadata.outputTokenLimit = output;
148
- if (Array.isArray(model.supportedActions))
149
- metadata.supportedActions = [...model.supportedActions];
150
- if (typeof model.thinking === 'boolean')
151
- metadata.thinking = model.thinking;
152
- models.push({ id: stripModelsPrefix(model.name), ownedBy: 'google', metadata });
153
- }
154
- return models;
155
- });
156
- }
157
- /**
158
- * `GET /v1beta/models?pageSize=1` with the key. A rejected key is an ANSWER
159
- * (`{ ok: false, code: 'AI_KEY_INVALID' }`), as is any other failure.
160
- */
161
- async verifyKey(ctx) {
162
- try {
163
- await this.call('verify_key', undefined, ctx, async () => {
164
- const client = this.clients.create(ctx);
165
- await client.models.list({ config: { pageSize: 1, abortSignal: ctx.signal } });
166
- });
167
- return { ok: true };
168
- }
169
- catch (err) {
170
- const mapped = (0, gemini_errors_1.mapGeminiError)(err, { signal: ctx.signal });
171
- return mapped.code === 'AI_KEY_INVALID'
172
- ? { ok: false, code: 'AI_KEY_INVALID' }
173
- : { ok: false, code: mapped.code, detail: mapped.message };
174
- }
175
- }
176
- // ---- responses port -------------------------------------------------------
177
- async plan(req, ctx) {
178
- return (0, gemini_content_mapper_1.toGeminiRequest)(req, (0, gemini_model_catalog_1.geminiModelProfile)(req.model), await this.deliverStorageInputs(req, ctx));
179
- }
180
- createResponse(req, ctx) {
181
- return this.call('generate_content', req.model, ctx, async () => {
182
- const plan = await this.plan(req, ctx);
183
- const client = this.clients.create(ctx);
184
- const response = await client.models.generateContent({
185
- model: plan.model,
186
- contents: plan.contents,
187
- config: { ...plan.config, abortSignal: ctx.signal },
188
- });
189
- return (0, gemini_content_mapper_1.fromGeminiResponse)(response, req);
190
- });
191
- }
192
- /**
193
- * Streams one response. A failure BEFORE `response.created` (a rejected
194
- * key, a 429, an unsupported request) is thrown as an `AiError`; once the
195
- * stream has started, a failure ends it with exactly one `error` event.
196
- *
197
- * `ctx.signal` aborts the request; a consumer that stops iterating
198
- * (`break`) aborts it too — the SDK's own iterator only releases its reader,
199
- * so the adapter holds an abort controller of its own for that.
200
- */
201
- async *streamResponse(req, ctx) {
202
- const started = Date.now();
203
- const span = this.startSpan('generate_content.stream', req.model);
204
- const controller = new AbortController();
205
- const onCallerAbort = () => controller.abort();
206
- let status = 'ok';
207
- let terminated = false;
208
- if (ctx.signal?.aborted)
209
- controller.abort();
210
- else
211
- ctx.signal?.addEventListener('abort', onCallerAbort, { once: true });
212
- try {
213
- const plan = await this.plan(req, ctx);
214
- const client = this.clients.create(ctx);
215
- let chunks;
216
- try {
217
- chunks = await client.models.generateContentStream({
218
- model: plan.model,
219
- contents: plan.contents,
220
- config: { ...plan.config, abortSignal: controller.signal },
221
- });
222
- }
223
- catch (err) {
224
- throw (0, gemini_errors_1.mapGeminiError)(err, { signal: ctx.signal });
225
- }
226
- const mapper = new gemini_stream_mapper_1.GeminiStreamMapper({ request: req });
227
- try {
228
- for await (const chunk of chunks) {
229
- for (const out of mapper.map(chunk)) {
230
- if (out.type === 'error')
231
- status = out.code;
232
- yield out;
233
- }
234
- if (mapper.terminated)
235
- break;
236
- }
237
- }
238
- catch (err) {
239
- const mapped = (0, gemini_errors_1.mapGeminiError)(err, { signal: ctx.signal });
240
- if (!mapper.started)
241
- throw mapped;
242
- status = mapped.code;
243
- yield* mapper.fail(mapped);
244
- }
245
- if (!mapper.terminated) {
246
- if (ctx.signal?.aborted) {
247
- throw new ai_error_1.AiError('AI_PROVIDER_UNAVAILABLE', 'The AI request was cancelled.', {
248
- details: { provider: gemini_errors_1.GEMINI_PROVIDER_ID, aborted: true },
249
- });
250
- }
251
- if (mapper.finished) {
252
- for (const out of mapper.complete()) {
253
- if (out.type === 'error')
254
- status = out.code;
255
- yield out;
256
- }
257
- }
258
- else {
259
- const truncated = new ai_error_1.AiError('AI_PROVIDER_UNAVAILABLE', 'The Gemini stream ended before the response completed.', { details: { provider: gemini_errors_1.GEMINI_PROVIDER_ID } });
260
- if (!mapper.started)
261
- throw truncated;
262
- status = truncated.code;
263
- yield* mapper.fail(truncated);
264
- }
265
- }
266
- terminated = mapper.terminated;
267
- }
268
- catch (err) {
269
- const mapped = (0, gemini_errors_1.mapGeminiError)(err, { signal: ctx.signal });
270
- status = mapped.code;
271
- throw mapped;
272
- }
273
- finally {
274
- ctx.signal?.removeEventListener('abort', onCallerAbort);
275
- // A consumer that stopped early leaves the HTTP stream open: close it.
276
- if (!terminated)
277
- controller.abort();
278
- this.endSpan(span, status);
279
- this.logCall('generate_content.stream', req.model, ctx, status, started);
280
- }
281
- }
282
- // ---- embeddings port ------------------------------------------------------
283
- /** `embedContent` (`batchEmbedContents` on the wire), one content per input. */
284
- embed(req, ctx) {
285
- return this.call('embed_content', req.model, ctx, async () => {
286
- const params = (0, gemini_embeddings_mapper_1.toGeminiEmbeddingRequest)(req, (0, gemini_model_catalog_1.geminiModelProfile)(req.model));
287
- const client = this.clients.create(ctx);
288
- const response = await client.models.embedContent({
289
- model: params.model,
290
- contents: params.contents,
291
- config: { ...params.config, abortSignal: ctx.signal },
292
- });
293
- return (0, gemini_embeddings_mapper_1.fromGeminiEmbeddingResponse)(response, req);
294
- });
295
- }
296
- // ---- storage-object inputs (#441) ------------------------------------------
297
- /**
298
- * The bytes of each storage-object part of `req`, read under the runtime's
299
- * cap for inline delivery. `undefined` when the request names no storage
300
- * object.
301
- */
302
- async deliverStorageInputs(req, ctx) {
303
- const ids = (0, gemini_content_mapper_1.geminiStorageObjectIds)(req);
304
- if (ids.length === 0)
305
- return undefined;
306
- const deliveries = new Map();
307
- for (const id of ids) {
308
- const input = ctx.storageInputs?.get(id);
309
- if (!input) {
310
- throw new ai_error_1.AiError('AI_INVALID_REQUEST', 'A storage-object input was not resolved by the runtime.', {
311
- details: { provider: gemini_errors_1.GEMINI_PROVIDER_ID },
312
- });
313
- }
314
- if (input.strategy !== 'inline' || !input.read) {
315
- throw new ai_error_1.AiError('AI_INVALID_REQUEST', 'A storage-object input was not prepared for delivery.', {
316
- details: { provider: gemini_errors_1.GEMINI_PROVIDER_ID, strategy: input.strategy },
317
- });
318
- }
319
- const payload = await input.read();
320
- deliveries.set(id, {
321
- modality: input.modality,
322
- mimeType: input.mimeType,
323
- filename: input.filename,
324
- data: payload.data,
325
- });
326
- }
327
- return deliveries;
328
- }
329
- // ---- telemetry ------------------------------------------------------------
330
- startSpan(operation, model) {
331
- return tracer.startSpan(exports.GEMINI_PROVIDER_CALL_SPAN, {
332
- kind: api_1.SpanKind.CLIENT,
333
- attributes: {
334
- 'ai.provider': gemini_errors_1.GEMINI_PROVIDER_ID,
335
- 'ai.operation': operation,
336
- ...(model ? { 'ai.model': model } : {}),
337
- },
338
- });
339
- }
340
- endSpan(span, status) {
341
- span.setAttribute('ai.status', status);
342
- span.setStatus(status === 'ok' ? { code: api_1.SpanStatusCode.OK } : { code: api_1.SpanStatusCode.ERROR, message: status });
343
- span.end();
344
- }
345
- /** ⚠ Only ids, the model, the operation, the outcome and a duration. Never the key or a body. */
346
- logCall(operation, model, ctx, status, started) {
347
- this.logger.debug({
348
- msg: 'AI provider call',
349
- provider: gemini_errors_1.GEMINI_PROVIDER_ID,
350
- operation,
351
- model,
352
- status,
353
- requestId: ctx.requestId,
354
- durationMs: Date.now() - started,
355
- });
356
- }
357
- /** Runs `fn` inside an `ai.provider.call` span, mapping any failure to `AiError`. */
358
- async call(operation, model, ctx, fn) {
359
- const started = Date.now();
360
- const span = this.startSpan(operation, model);
361
- let status = 'ok';
362
- try {
363
- return await fn();
364
- }
365
- catch (err) {
366
- const mapped = (0, gemini_errors_1.mapGeminiError)(err, { signal: ctx.signal });
367
- status = mapped.code;
368
- throw mapped;
369
- }
370
- finally {
371
- this.endSpan(span, status);
372
- this.logCall(operation, model, ctx, status, started);
373
- }
374
- }
375
53
  };
376
54
  exports.GeminiProviderAdapter = GeminiProviderAdapter;
377
55
  exports.GeminiProviderAdapter = GeminiProviderAdapter = GeminiProviderAdapter_1 = __decorate([
@@ -379,4 +57,7 @@ exports.GeminiProviderAdapter = GeminiProviderAdapter = GeminiProviderAdapter_1
379
57
  __metadata("design:paramtypes", [provider_registry_1.AiProviderRegistry,
380
58
  gemini_client_factory_1.GeminiClientFactory])
381
59
  ], GeminiProviderAdapter);
60
+ // The rest of what this path exported before #991, unchanged.
61
+ var gemini_2 = require("@marinoscar/platform-ai-providers/gemini");
62
+ Object.defineProperty(exports, "GEMINI_PROVIDER_CALL_SPAN", { enumerable: true, get: function () { return gemini_2.GEMINI_PROVIDER_CALL_SPAN; } });
382
63
  //# sourceMappingURL=gemini.adapter.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"gemini.adapter.js","sourceRoot":"","sources":["../../../../src/ai/providers/gemini/gemini.adapter.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"gemini.adapter.js","sourceRoot":"","sources":["../../../../src/ai/providers/gemini/gemini.adapter.ts"],"names":[],"mappings":";AAAA,gFAAgF;AAChF,uDAAuD;AACvD,gFAAgF;AAChF,EAAE;AACF,yEAAyE;AACzE,sFAAsF;AACtF,wDAAwD;AACxD,sFAAsF;AACtF,4EAA4E;AAC5E,6EAA6E;AAC7E,8EAA8E;AAC9E,OAAO;AACP,gFAAgF;;;;;;;;;;;;;AAEhF,2CAAkE;AAClE,qEAA8G;AAE9G,+BAA6B;AAC7B,oEAAkE;AAClE,8DAA2D;AAC3D,mEAA8D;AAE9D;;;;;GAKG;AAEI,IAAM,qBAAqB,6BAA3B,MAAM,qBAAsB,SAAQ,8BAAyB;IAM/C;IALnB;;;OAGG;IACH,YACmB,QAA4B,EAC7C,OAA4B;QAE5B,KAAK,CAAC,EAAE,OAAO,EAAE,MAAM,EAAE,IAAI,eAAM,CAAC,uBAAqB,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,uCAAkB,EAAE,CAAC,CAAC;QAH9E,aAAQ,GAAR,QAAQ,CAAoB;IAI/C,CAAC;IAED,iDAAiD;IACjD,YAAY;QACV,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;IAC/B,CAAC;CACF,CAAA;AAhBY,sDAAqB;gCAArB,qBAAqB;IADjC,IAAA,mBAAU,GAAE;qCAOkB,sCAAkB;QACpC,2CAAmB;GAPnB,qBAAqB,CAgBjC;AAED,8DAA8D;AAC9D,mEAAqF;AAA5E,mHAAA,yBAAyB,OAAA"}
@@ -1,40 +1,18 @@
1
- import { OpenAI } from 'openai';
2
- import type { AiCallContext } from '../../core/provider-adapter.interface';
3
- import { type OpenAiFamily } from './openai-errors';
4
- export declare const OPENAI_DEFAULT_BASE_URL = "https://api.openai.com/v1";
5
- /** A generous ceiling for one request; long reasoning turns take minutes. */
6
- export declare const OPENAI_DEFAULT_TIMEOUT_MS: number;
7
- /** The `fetch` the SDK uses. Tests inject a mocked one; production uses the global. */
8
- export type OpenAiFetch = (input: string | URL | Request, init?: RequestInit) => Promise<Response>;
9
- export interface OpenAiClientOptions {
10
- fetch?: OpenAiFetch;
11
- timeoutMs?: number;
12
- }
13
- /**
14
- * Every SDK option this application pins, whatever member of the OpenAI
15
- * family the client talks to (#448): nothing may be read from the
16
- * environment (`OPENAI_ORG_ID`, `OPENAI_PROJECT_ID`, `OPENAI_LOG`, ...), the
17
- * SDK never retries, and it never logs. The Azure and OpenAI-compatible
18
- * factories spread this into their own clients.
19
- */
20
- export declare function pinnedOpenAiClientOptions(options: OpenAiClientOptions, fetch?: OpenAiFetch): {
21
- fetch?: OpenAiFetch | undefined;
22
- organization: null;
23
- project: null;
24
- adminAPIKey: null;
25
- webhookSecret: null;
26
- maxRetries: number;
27
- timeout: number;
28
- logLevel: "off";
29
- };
30
- /** Throws `AI_KEY_INVALID` for an empty key — before any client is built. */
31
- export declare function assertOpenAiApiKey(ctx: AiCallContext, family?: OpenAiFamily): void;
1
+ import { OpenAiClientFactory as BaseOpenAiClientFactory, type OpenAiClientOptions } from '@marinoscar/platform-ai-providers/openai';
32
2
  /** DI token for `OpenAiClientOptions` (optional; tests and forks provide it). */
33
3
  export declare const OPENAI_CLIENT_OPTIONS: unique symbol;
34
- export declare class OpenAiClientFactory {
35
- private readonly options;
4
+ /**
5
+ * The injectable OpenAiClientFactory: the framework-free factory of
6
+ * `@marinoscar/platform-ai-providers/openai` with its options injected.
7
+ *
8
+ * @stability experimental
9
+ */
10
+ export declare class OpenAiClientFactory extends BaseOpenAiClientFactory {
11
+ /**
12
+ * @param options - the client options (a mocked `fetch` in tests); none in production.
13
+ */
36
14
  constructor(options?: OpenAiClientOptions);
37
- /** The SDK client for one call. Throws `AI_KEY_INVALID` for an empty key. */
38
- create(ctx: AiCallContext): OpenAI;
39
15
  }
16
+ export { assertOpenAiApiKey, OPENAI_DEFAULT_BASE_URL, OPENAI_DEFAULT_TIMEOUT_MS, pinnedOpenAiClientOptions } from '@marinoscar/platform-ai-providers/openai';
17
+ export type { OpenAiFetch, OpenAiClientOptions } from '@marinoscar/platform-ai-providers/openai';
40
18
  //# sourceMappingURL=openai-client.factory.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"openai-client.factory.d.ts","sourceRoot":"","sources":["../../../../src/ai/providers/openai/openai-client.factory.ts"],"names":[],"mappings":"AAmBA,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAGhC,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,uCAAuC,CAAC;AAC3E,OAAO,EAAiB,KAAK,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAEnE,eAAO,MAAM,uBAAuB,8BAA8B,CAAC;AAEnE,6EAA6E;AAC7E,eAAO,MAAM,yBAAyB,QAAiB,CAAC;AAExD,uFAAuF;AACvF,MAAM,MAAM,WAAW,GAAG,CAAC,KAAK,EAAE,MAAM,GAAG,GAAG,GAAG,OAAO,EAAE,IAAI,CAAC,EAAE,WAAW,KAAK,OAAO,CAAC,QAAQ,CAAC,CAAC;AAEnG,MAAM,WAAW,mBAAmB;IAClC,KAAK,CAAC,EAAE,WAAW,CAAC;IACpB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED;;;;;;GAMG;AACH,wBAAgB,yBAAyB,CAAC,OAAO,EAAE,mBAAmB,EAAE,KAAK,CAAC,EAAE,WAAW;;;;;;;;;EAe1F;AAED,6EAA6E;AAC7E,wBAAgB,kBAAkB,CAAC,GAAG,EAAE,aAAa,EAAE,MAAM,GAAE,YAA4B,GAAG,IAAI,CAMjG;AAED,iFAAiF;AACjF,eAAO,MAAM,qBAAqB,eAAkC,CAAC;AAErE,qBACa,mBAAmB;IAC9B,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAsB;gBAES,OAAO,CAAC,EAAE,mBAAmB;IAIpF,6EAA6E;IAC7E,MAAM,CAAC,GAAG,EAAE,aAAa,GAAG,MAAM;CASnC"}
1
+ {"version":3,"file":"openai-client.factory.d.ts","sourceRoot":"","sources":["../../../../src/ai/providers/openai/openai-client.factory.ts"],"names":[],"mappings":"AAYA,OAAO,EACL,mBAAmB,IAAI,uBAAuB,EAC9C,KAAK,mBAAmB,EACzB,MAAM,0CAA0C,CAAC;AAElD,iFAAiF;AACjF,eAAO,MAAM,qBAAqB,eAAkC,CAAC;AAErE;;;;;GAKG;AACH,qBACa,mBAAoB,SAAQ,uBAAuB;IAC9D;;OAEG;gBACoD,OAAO,CAAC,EAAE,mBAAmB;CAGrF;AAGD,OAAO,EAAE,kBAAkB,EAAE,uBAAuB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,MAAM,0CAA0C,CAAC;AAC7J,YAAY,EAAE,WAAW,EAAE,mBAAmB,EAAE,MAAM,0CAA0C,CAAC"}
@@ -1,20 +1,13 @@
1
1
  "use strict";
2
2
  // =============================================================================
3
- // OpenAI SDK client factory (issue #426, epic #419)
3
+ // OpenAiClientFactory: the Nest binding (issue #991)
4
4
  // =============================================================================
5
5
  //
6
- // One client PER CALL, built from that call's `AiCallContext`: the key is
7
- // resolved per call by the runtime (org key or the user's own), so a
8
- // long-lived client holding one key would be the wrong shape.
9
- //
10
- // Every option the SDK would otherwise read from the environment is pinned
11
- // explicitly. There is no `OPENAI_API_KEY` / `OPENAI_BASE_URL` configuration
12
- // in this application (docs/specs/ai-platform.md) and an ambient variable on
13
- // a host must not silently change which account or endpoint a call uses.
14
- //
15
- // `maxRetries: 0` — retries are the caller's job (the queue for a job, the
16
- // user for an interactive call); the SDK retrying underneath would multiply
17
- // every attempt and hide a 429 from `toRateLimitError()`.
6
+ // The factory itself (one SDK client per call, every SDK option pinned) lives
7
+ // in `@marinoscar/platform-ai-providers/openai`. This subclass keeps the
8
+ // platform's injectable class, its constructor signature and its optional
9
+ // `OPENAI_CLIENT_OPTIONS` injection token, so the provider module and any test
10
+ // that provides the token wire it exactly as before. It imports no SDK.
18
11
  // =============================================================================
19
12
  var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
20
13
  var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
@@ -29,61 +22,23 @@ var __param = (this && this.__param) || function (paramIndex, decorator) {
29
22
  return function (target, key) { decorator(target, key, paramIndex); }
30
23
  };
31
24
  Object.defineProperty(exports, "__esModule", { value: true });
32
- exports.OpenAiClientFactory = exports.OPENAI_CLIENT_OPTIONS = exports.OPENAI_DEFAULT_TIMEOUT_MS = exports.OPENAI_DEFAULT_BASE_URL = void 0;
33
- exports.pinnedOpenAiClientOptions = pinnedOpenAiClientOptions;
34
- exports.assertOpenAiApiKey = assertOpenAiApiKey;
25
+ exports.pinnedOpenAiClientOptions = exports.OPENAI_DEFAULT_TIMEOUT_MS = exports.OPENAI_DEFAULT_BASE_URL = exports.assertOpenAiApiKey = exports.OpenAiClientFactory = exports.OPENAI_CLIENT_OPTIONS = void 0;
35
26
  const common_1 = require("@nestjs/common");
36
- const openai_1 = require("openai");
37
- const ai_error_1 = require("../../core/ai-error");
38
- const openai_errors_1 = require("./openai-errors");
39
- exports.OPENAI_DEFAULT_BASE_URL = 'https://api.openai.com/v1';
40
- /** A generous ceiling for one request; long reasoning turns take minutes. */
41
- exports.OPENAI_DEFAULT_TIMEOUT_MS = 10 * 60 * 1000;
42
- /**
43
- * Every SDK option this application pins, whatever member of the OpenAI
44
- * family the client talks to (#448): nothing may be read from the
45
- * environment (`OPENAI_ORG_ID`, `OPENAI_PROJECT_ID`, `OPENAI_LOG`, ...), the
46
- * SDK never retries, and it never logs. The Azure and OpenAI-compatible
47
- * factories spread this into their own clients.
48
- */
49
- function pinnedOpenAiClientOptions(options, fetch) {
50
- const chosenFetch = fetch ?? options.fetch;
51
- return {
52
- organization: null,
53
- project: null,
54
- adminAPIKey: null,
55
- webhookSecret: null,
56
- maxRetries: 0,
57
- timeout: options.timeoutMs ?? exports.OPENAI_DEFAULT_TIMEOUT_MS,
58
- // The SDK's own logger writes to the console and, at debug level, the
59
- // request — never let an ambient OPENAI_LOG turn that on.
60
- logLevel: 'off',
61
- ...(chosenFetch ? { fetch: chosenFetch } : {}),
62
- };
63
- }
64
- /** Throws `AI_KEY_INVALID` for an empty key — before any client is built. */
65
- function assertOpenAiApiKey(ctx, family = openai_errors_1.OPENAI_FAMILY) {
66
- if (!ctx.apiKey || ctx.apiKey.trim().length === 0) {
67
- throw new ai_error_1.AiError('AI_KEY_INVALID', `No ${family.label} API key was supplied.`, {
68
- details: { provider: family.providerId },
69
- });
70
- }
71
- }
27
+ const openai_1 = require("@marinoscar/platform-ai-providers/openai");
72
28
  /** DI token for `OpenAiClientOptions` (optional; tests and forks provide it). */
73
29
  exports.OPENAI_CLIENT_OPTIONS = Symbol('OPENAI_CLIENT_OPTIONS');
74
- let OpenAiClientFactory = class OpenAiClientFactory {
75
- options;
30
+ /**
31
+ * The injectable OpenAiClientFactory: the framework-free factory of
32
+ * `@marinoscar/platform-ai-providers/openai` with its options injected.
33
+ *
34
+ * @stability experimental
35
+ */
36
+ let OpenAiClientFactory = class OpenAiClientFactory extends openai_1.OpenAiClientFactory {
37
+ /**
38
+ * @param options - the client options (a mocked `fetch` in tests); none in production.
39
+ */
76
40
  constructor(options) {
77
- this.options = options ?? {};
78
- }
79
- /** The SDK client for one call. Throws `AI_KEY_INVALID` for an empty key. */
80
- create(ctx) {
81
- assertOpenAiApiKey(ctx);
82
- return new openai_1.OpenAI({
83
- apiKey: ctx.apiKey,
84
- baseURL: ctx.baseUrl ?? exports.OPENAI_DEFAULT_BASE_URL,
85
- ...pinnedOpenAiClientOptions(this.options),
86
- });
41
+ super(options);
87
42
  }
88
43
  };
89
44
  exports.OpenAiClientFactory = OpenAiClientFactory;
@@ -93,4 +48,10 @@ exports.OpenAiClientFactory = OpenAiClientFactory = __decorate([
93
48
  __param(0, (0, common_1.Inject)(exports.OPENAI_CLIENT_OPTIONS)),
94
49
  __metadata("design:paramtypes", [Object])
95
50
  ], OpenAiClientFactory);
51
+ // The rest of what this path exported before #991, unchanged.
52
+ var openai_2 = require("@marinoscar/platform-ai-providers/openai");
53
+ Object.defineProperty(exports, "assertOpenAiApiKey", { enumerable: true, get: function () { return openai_2.assertOpenAiApiKey; } });
54
+ Object.defineProperty(exports, "OPENAI_DEFAULT_BASE_URL", { enumerable: true, get: function () { return openai_2.OPENAI_DEFAULT_BASE_URL; } });
55
+ Object.defineProperty(exports, "OPENAI_DEFAULT_TIMEOUT_MS", { enumerable: true, get: function () { return openai_2.OPENAI_DEFAULT_TIMEOUT_MS; } });
56
+ Object.defineProperty(exports, "pinnedOpenAiClientOptions", { enumerable: true, get: function () { return openai_2.pinnedOpenAiClientOptions; } });
96
57
  //# sourceMappingURL=openai-client.factory.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"openai-client.factory.js","sourceRoot":"","sources":["../../../../src/ai/providers/openai/openai-client.factory.ts"],"names":[],"mappings":";AAAA,gFAAgF;AAChF,oDAAoD;AACpD,gFAAgF;AAChF,EAAE;AACF,0EAA0E;AAC1E,qEAAqE;AACrE,8DAA8D;AAC9D,EAAE;AACF,2EAA2E;AAC3E,6EAA6E;AAC7E,6EAA6E;AAC7E,yEAAyE;AACzE,EAAE;AACF,2EAA2E;AAC3E,4EAA4E;AAC5E,0DAA0D;AAC1D,gFAAgF;;;;;;;;;;;;;;;AA6BhF,8DAeC;AAGD,gDAMC;AAnDD,2CAA8D;AAC9D,mCAAgC;AAEhC,kDAA8C;AAE9C,mDAAmE;AAEtD,QAAA,uBAAuB,GAAG,2BAA2B,CAAC;AAEnE,6EAA6E;AAChE,QAAA,yBAAyB,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC;AAUxD;;;;;;GAMG;AACH,SAAgB,yBAAyB,CAAC,OAA4B,EAAE,KAAmB;IACzF,MAAM,WAAW,GAAG,KAAK,IAAI,OAAO,CAAC,KAAK,CAAC;IAE3C,OAAO;QACL,YAAY,EAAE,IAAI;QAClB,OAAO,EAAE,IAAI;QACb,WAAW,EAAE,IAAI;QACjB,aAAa,EAAE,IAAI;QACnB,UAAU,EAAE,CAAC;QACb,OAAO,EAAE,OAAO,CAAC,SAAS,IAAI,iCAAyB;QACvD,sEAAsE;QACtE,0DAA0D;QAC1D,QAAQ,EAAE,KAAc;QACxB,GAAG,CAAC,WAAW,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,WAAW,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KAC/C,CAAC;AACJ,CAAC;AAED,6EAA6E;AAC7E,SAAgB,kBAAkB,CAAC,GAAkB,EAAE,SAAuB,6BAAa;IACzF,IAAI,CAAC,GAAG,CAAC,MAAM,IAAI,GAAG,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAClD,MAAM,IAAI,kBAAO,CAAC,gBAAgB,EAAE,MAAM,MAAM,CAAC,KAAK,wBAAwB,EAAE;YAC9E,OAAO,EAAE,EAAE,QAAQ,EAAE,MAAM,CAAC,UAAU,EAAE;SACzC,CAAC,CAAC;IACL,CAAC;AACH,CAAC;AAED,iFAAiF;AACpE,QAAA,qBAAqB,GAAG,MAAM,CAAC,uBAAuB,CAAC,CAAC;AAG9D,IAAM,mBAAmB,GAAzB,MAAM,mBAAmB;IACb,OAAO,CAAsB;IAE9C,YAAuD,OAA6B;QAClF,IAAI,CAAC,OAAO,GAAG,OAAO,IAAI,EAAE,CAAC;IAC/B,CAAC;IAED,6EAA6E;IAC7E,MAAM,CAAC,GAAkB;QACvB,kBAAkB,CAAC,GAAG,CAAC,CAAC;QAExB,OAAO,IAAI,eAAM,CAAC;YAChB,MAAM,EAAE,GAAG,CAAC,MAAM;YAClB,OAAO,EAAE,GAAG,CAAC,OAAO,IAAI,+BAAuB;YAC/C,GAAG,yBAAyB,CAAC,IAAI,CAAC,OAAO,CAAC;SAC3C,CAAC,CAAC;IACL,CAAC;CACF,CAAA;AAjBY,kDAAmB;8BAAnB,mBAAmB;IAD/B,IAAA,mBAAU,GAAE;IAIE,WAAA,IAAA,iBAAQ,GAAE,CAAA;IAAE,WAAA,IAAA,eAAM,EAAC,6BAAqB,CAAC,CAAA;;GAH3C,mBAAmB,CAiB/B"}
1
+ {"version":3,"file":"openai-client.factory.js","sourceRoot":"","sources":["../../../../src/ai/providers/openai/openai-client.factory.ts"],"names":[],"mappings":";AAAA,gFAAgF;AAChF,qDAAqD;AACrD,gFAAgF;AAChF,EAAE;AACF,8EAA8E;AAC9E,yEAAyE;AACzE,0EAA0E;AAC1E,+EAA+E;AAC/E,wEAAwE;AACxE,gFAAgF;;;;;;;;;;;;;;;AAEhF,2CAA8D;AAC9D,qEAGkD;AAElD,iFAAiF;AACpE,QAAA,qBAAqB,GAAG,MAAM,CAAC,uBAAuB,CAAC,CAAC;AAErE;;;;;GAKG;AAEI,IAAM,mBAAmB,GAAzB,MAAM,mBAAoB,SAAQ,4BAAuB;IAC9D;;OAEG;IACH,YAAuD,OAA6B;QAClF,KAAK,CAAC,OAAO,CAAC,CAAC;IACjB,CAAC;CACF,CAAA;AAPY,kDAAmB;8BAAnB,mBAAmB;IAD/B,IAAA,mBAAU,GAAE;IAKE,WAAA,IAAA,iBAAQ,GAAE,CAAA;IAAE,WAAA,IAAA,eAAM,EAAC,6BAAqB,CAAC,CAAA;;GAJ3C,mBAAmB,CAO/B;AAED,8DAA8D;AAC9D,mEAA6J;AAApJ,4GAAA,kBAAkB,OAAA;AAAE,iHAAA,uBAAuB,OAAA;AAAE,mHAAA,yBAAyB,OAAA;AAAE,mHAAA,yBAAyB,OAAA"}