@marinoscar/platform-api 0.1.0-next.5 → 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 +12 -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,56 +1,23 @@
1
1
  import { OnModuleInit } from '@nestjs/common';
2
- import type { AiModelCapabilities } from '../../core/capabilities';
3
- import type { AiCallContext, AiDiscoveredModel, AiKeyVerification, AiProviderAdapter, AiResponsesPort } from '../../core/provider-adapter.interface';
2
+ import { OpenAiProviderAdapter as BaseOpenAiProviderAdapter } from '@marinoscar/platform-ai-providers/openai';
3
+ import '../../core/ai-error';
4
4
  import { AiProviderRegistry } from '../../core/provider-registry';
5
- import type { AiAudioPort, AiEmbeddingsPort, AiImagesPort, AiRealtimePort } from '../../core/types/media.types';
6
- import type { AiFileInputStrategies } from '../../core/types/file-inputs.types';
7
5
  import { OpenAiClientFactory } from './openai-client.factory';
8
- export { AI_PROVIDER_CALL_SPAN } from './openai-call-telemetry';
9
- export declare class OpenAiProviderAdapter implements AiProviderAdapter, OnModuleInit {
6
+ export { AI_PROVIDER_CALL_SPAN } from '@marinoscar/platform-ai-providers/openai';
7
+ /**
8
+ * The injectable OpenAiProviderAdapter: registers itself with `AiProviderRegistry` when
9
+ * its module initialises.
10
+ *
11
+ * @stability experimental
12
+ */
13
+ export declare class OpenAiProviderAdapter extends BaseOpenAiProviderAdapter implements OnModuleInit {
10
14
  private readonly registry;
11
- private readonly clients;
12
- readonly id = "openai";
13
- readonly displayName = "OpenAI";
14
- /** The endpoint used when the settings slot has no `baseUrl` (#773: the egress inventory reads it). */
15
- readonly defaultBaseUrl = "https://api.openai.com/v1";
16
- /** Images by presigned URL, files through the Files API — see the file header. */
17
- readonly fileInputStrategy: AiFileInputStrategies;
18
- readonly responses: AiResponsesPort;
19
- readonly embeddings: AiEmbeddingsPort;
20
- readonly images: AiImagesPort;
21
- readonly audio: AiAudioPort;
22
- readonly realtime: AiRealtimePort;
23
- private readonly logger;
24
- private readonly telemetry;
25
- private readonly responsesEngine;
26
- constructor(registry: AiProviderRegistry, clients: OpenAiClientFactory);
27
- onModuleInit(): void;
28
- classifyModel(modelId: string): AiModelCapabilities | null;
29
- listModels(ctx: AiCallContext): Promise<AiDiscoveredModel[]>;
30
- /**
31
- * `GET /v1/models` with the key. A rejected key is an ANSWER
32
- * (`{ ok: false, code: 'AI_KEY_INVALID' }`), as is any other failure —
33
- * mapped to its code — so the admin UI never has to catch.
34
- */
35
- verifyKey(ctx: AiCallContext): Promise<AiKeyVerification>;
36
- /** `POST /v1/embeddings`, floats on the wire — see `openai-embeddings.mapper.ts`. */
37
- private embed;
38
- /** `POST /v1/images/generations`, always answered as base64 bytes — see `openai-images.mapper.ts`. */
39
- private generateImages;
40
- /** `POST /v1/images/edits` (multipart: the source images and the optional mask). */
41
- private editImages;
42
15
  /**
43
- * `POST /v1/audio/transcriptions` (multipart). A streamed input is sent as
44
- * it is read — see `openai-audio.mapper.ts`.
16
+ * @param registry - the provider registry this adapter joins.
17
+ * @param clients - the injectable SDK client factory.
45
18
  */
46
- private transcribe;
47
- /** `POST /v1/audio/speech` — the answer is the audio file itself. */
48
- private speak;
49
- /**
50
- * `POST /v1/realtime/client_secrets` — mints the ephemeral secret a browser
51
- * opens one WebRTC session with (`openai-realtime.mapper.ts`). The call's
52
- * key is the request's `Authorization` header and goes nowhere else.
53
- */
54
- private createRealtimeSession;
19
+ constructor(registry: AiProviderRegistry, clients: OpenAiClientFactory);
20
+ /** Adds this adapter to `AiProviderRegistry`. */
21
+ onModuleInit(): void;
55
22
  }
56
23
  //# sourceMappingURL=openai.adapter.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"openai.adapter.d.ts","sourceRoot":"","sources":["../../../../src/ai/providers/openai/openai.adapter.ts"],"names":[],"mappings":"AAkDA,OAAO,EAAsB,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAElE,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,yBAAyB,CAAC;AACnE,OAAO,KAAK,EACV,aAAa,EACb,iBAAiB,EACjB,iBAAiB,EACjB,iBAAiB,EACjB,eAAe,EAChB,MAAM,uCAAuC,CAAC;AAC/C,OAAO,EAAE,kBAAkB,EAAE,MAAM,8BAA8B,CAAC;AAClE,OAAO,KAAK,EACV,WAAW,EAGX,gBAAgB,EAIhB,YAAY,EACZ,cAAc,EAOf,MAAM,8BAA8B,CAAC;AACtC,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,oCAAoC,CAAC;AAQhF,OAAO,EAAE,mBAAmB,EAA2B,MAAM,yBAAyB,CAAC;AAavF,OAAO,EAAE,qBAAqB,EAAE,MAAM,yBAAyB,CAAC;AAEhE,qBACa,qBAAsB,YAAW,iBAAiB,EAAE,YAAY;IAyCzE,OAAO,CAAC,QAAQ,CAAC,QAAQ;IACzB,OAAO,CAAC,QAAQ,CAAC,OAAO;IAzC1B,QAAQ,CAAC,EAAE,YAAsB;IACjC,QAAQ,CAAC,WAAW,YAAY;IAEhC,uGAAuG;IACvG,QAAQ,CAAC,cAAc,+BAA2B;IAElD,kFAAkF;IAClF,QAAQ,CAAC,iBAAiB,EAAE,qBAAqB,CAA8C;IAE/F,QAAQ,CAAC,SAAS,EAAE,eAAe,CAGjC;IAEF,QAAQ,CAAC,UAAU,EAAE,gBAAgB,CAEnC;IAEF,QAAQ,CAAC,MAAM,EAAE,YAAY,CAG3B;IAEF,QAAQ,CAAC,KAAK,EAAE,WAAW,CAKzB;IAEF,QAAQ,CAAC,QAAQ,EAAE,cAAc,CAG/B;IAEF,OAAO,CAAC,QAAQ,CAAC,MAAM,CAA0C;IACjE,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAuD;IACjF,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAwB;gBAGrC,QAAQ,EAAE,kBAAkB,EAC5B,OAAO,EAAE,mBAAmB;IAW/C,YAAY,IAAI,IAAI;IAIpB,aAAa,CAAC,OAAO,EAAE,MAAM,GAAG,mBAAmB,GAAG,IAAI;IAIpD,UAAU,CAAC,GAAG,EAAE,aAAa,GAAG,OAAO,CAAC,iBAAiB,EAAE,CAAC;IAiBlE;;;;OAIG;IACG,SAAS,CAAC,GAAG,EAAE,aAAa,GAAG,OAAO,CAAC,iBAAiB,CAAC;IAoB/D,qFAAqF;IACrF,OAAO,CAAC,KAAK;IAab,sGAAsG;IACtG,OAAO,CAAC,cAAc;IAWtB,oFAAoF;IACpF,OAAO,CAAC,UAAU;IAalB;;;OAGG;IACH,OAAO,CAAC,UAAU;IAalB,qEAAqE;IACrE,OAAO,CAAC,KAAK;IAcb;;;;OAIG;IACH,OAAO,CAAC,qBAAqB;CAgB9B"}
1
+ {"version":3,"file":"openai.adapter.d.ts","sourceRoot":"","sources":["../../../../src/ai/providers/openai/openai.adapter.ts"],"names":[],"mappings":"AAcA,OAAO,EAAsB,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAClE,OAAO,EAAE,qBAAqB,IAAI,yBAAyB,EAAE,MAAM,0CAA0C,CAAC;AAE9G,OAAO,qBAAqB,CAAC;AAC7B,OAAO,EAAE,kBAAkB,EAAE,MAAM,8BAA8B,CAAC;AAElE,OAAO,EAAE,mBAAmB,EAAE,MAAM,yBAAyB,CAAC;AAE9D,OAAO,EAAE,qBAAqB,EAAE,MAAM,0CAA0C,CAAC;AAEjF;;;;;GAKG;AACH,qBACa,qBAAsB,SAAQ,yBAA0B,YAAW,YAAY;IAMxF,OAAO,CAAC,QAAQ,CAAC,QAAQ;IAL3B;;;OAGG;gBAEgB,QAAQ,EAAE,kBAAkB,EAC7C,OAAO,EAAE,mBAAmB;IAK9B,iDAAiD;IACjD,YAAY,IAAI,IAAI;CAGrB"}
@@ -1,52 +1,16 @@
1
1
  "use strict";
2
2
  // =============================================================================
3
- // OpenAI provider adapter (issue #426, epic #419)
3
+ // OpenAiProviderAdapter: the Nest binding (issue #991)
4
4
  // =============================================================================
5
5
  //
6
- // The first real `AiProviderAdapter`: OpenAI through its Responses API, with
7
- // the official SDK hidden completely behind the neutral contract. Pieces:
8
- //
9
- // openai-client.factory.ts one SDK client per call (key, maxRetries 0)
10
- // openai-call-telemetry.ts the `ai.provider.call` span + debug line
11
- // openai-responses.engine.ts create/stream + storage delivery (#441)
12
- // openai-responses.mapper.ts AiResponseRequest <-> Responses API
13
- // openai-stream.mapper.ts stream events -> AiStreamEvent
14
- // openai-errors.ts SDK error -> AiError
15
- // openai-model-catalog.ts classifyModel()'s rule table
16
- // openai-embeddings.mapper.ts AiEmbeddingRequest <-> /v1/embeddings
17
- // openai-images.mapper.ts AiImage*Request <-> /v1/images/{generations,edits}
18
- // openai-audio.mapper.ts AiTranscriptionRequest <-> /v1/audio/transcriptions,
19
- // AiSpeechRequest <-> /v1/audio/speech
20
- // openai-realtime.mapper.ts AiRealtimeSessionRequest <-> /v1/realtime/client_secrets
21
- //
22
- // PORTS. `responses`, `embeddings` (#440), `images` (#437, generate AND
23
- // edit), `audio` (#438 `transcribe`, #439 `speech` + its static `voices`)
24
- // and `realtime` (#449 `createSession` + its static `voices`) are carried —
25
- // presence is the declaration, so `AiProviderRegistry.supports()` stays
26
- // truthful about what this adapter can actually do.
27
- //
28
- // REALTIME (#449). `createSession` spends the call's key ONCE, as the
29
- // `Authorization` header of `POST /v1/realtime/client_secrets`, and returns
30
- // the EPHEMERAL secret OpenAI mints — the one value this adapter hands back
31
- // that a browser may hold. It is never logged and never put on a span; the
32
- // debug line carries the same ids and outcome every other call's does.
33
- //
34
- // STORAGE-OBJECT INPUTS (#441). `fileInputStrategy` is images by
35
- // `presigned_url` (a 10-minute signed GET the runtime minted, passed as
36
- // `image_url` — OpenAI fetches it, the bytes never pass through the API) and
37
- // files by `upload`: the runtime's capped stream goes to the Files API
38
- // (`purpose: 'user_data'`) under the caller's own resolved key, the request
39
- // names it by `file_id`, and the provider-side copy is DELETED once the
40
- // response completes, fails or its stream ends — best effort, logged by file
41
- // id only. Nothing is cached across calls (or users): each call uploads its
42
- // own copy.
43
- //
44
- // OBSERVABILITY. Every provider call runs inside an `ai.provider.call` span
45
- // carrying `ai.provider`, `ai.model`, `ai.operation` and `ai.status` (`ok` or
46
- // the AiErrorCode) — never prompt text, output text or the key. The debug log
47
- // line carries the same four facts plus the request ids and duration. No
48
- // exception is recorded on the span: an SDK error's message can echo a
49
- // masked key.
6
+ // The adapter itself (ports, mappers, error mapping, telemetry) lives in
7
+ // `@marinoscar/platform-ai-providers/openai`, framework-free. This subclass keeps the
8
+ // platform's injectable class and constructor signature
9
+ // (`AiProviderRegistry`, `OpenAiClientFactory`), 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.
50
14
  // =============================================================================
51
15
  var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
52
16
  var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
@@ -61,176 +25,33 @@ var OpenAiProviderAdapter_1;
61
25
  Object.defineProperty(exports, "__esModule", { value: true });
62
26
  exports.OpenAiProviderAdapter = exports.AI_PROVIDER_CALL_SPAN = void 0;
63
27
  const common_1 = require("@nestjs/common");
28
+ const openai_1 = require("@marinoscar/platform-ai-providers/openai");
29
+ require("../../core/ai-error");
64
30
  const provider_registry_1 = require("../../core/provider-registry");
65
- const openai_audio_mapper_1 = require("./openai-audio.mapper");
31
+ const platform_ai_tracer_1 = require("../platform-ai-tracer");
66
32
  const openai_client_factory_1 = require("./openai-client.factory");
67
- const openai_embeddings_mapper_1 = require("./openai-embeddings.mapper");
68
- const openai_call_telemetry_1 = require("./openai-call-telemetry");
69
- const openai_errors_1 = require("./openai-errors");
70
- const openai_images_mapper_1 = require("./openai-images.mapper");
71
- const openai_model_catalog_1 = require("./openai-model-catalog");
72
- const openai_realtime_mapper_1 = require("./openai-realtime.mapper");
73
- const openai_responses_engine_1 = require("./openai-responses.engine");
74
- var openai_call_telemetry_2 = require("./openai-call-telemetry");
75
- Object.defineProperty(exports, "AI_PROVIDER_CALL_SPAN", { enumerable: true, get: function () { return openai_call_telemetry_2.AI_PROVIDER_CALL_SPAN; } });
76
- let OpenAiProviderAdapter = OpenAiProviderAdapter_1 = class OpenAiProviderAdapter {
33
+ var openai_2 = require("@marinoscar/platform-ai-providers/openai");
34
+ Object.defineProperty(exports, "AI_PROVIDER_CALL_SPAN", { enumerable: true, get: function () { return openai_2.AI_PROVIDER_CALL_SPAN; } });
35
+ /**
36
+ * The injectable OpenAiProviderAdapter: registers itself with `AiProviderRegistry` when
37
+ * its module initialises.
38
+ *
39
+ * @stability experimental
40
+ */
41
+ let OpenAiProviderAdapter = OpenAiProviderAdapter_1 = class OpenAiProviderAdapter extends openai_1.OpenAiProviderAdapter {
77
42
  registry;
78
- clients;
79
- id = openai_errors_1.OPENAI_PROVIDER_ID;
80
- displayName = 'OpenAI';
81
- /** The endpoint used when the settings slot has no `baseUrl` (#773: the egress inventory reads it). */
82
- defaultBaseUrl = openai_client_factory_1.OPENAI_DEFAULT_BASE_URL;
83
- /** Images by presigned URL, files through the Files API — see the file header. */
84
- fileInputStrategy = { image: 'presigned_url', file: 'upload' };
85
- responses = {
86
- create: (req, ctx) => this.responsesEngine.create(req, ctx),
87
- stream: (req, ctx) => this.responsesEngine.stream(req, ctx),
88
- };
89
- embeddings = {
90
- embed: (req, ctx) => this.embed(req, ctx),
91
- };
92
- images = {
93
- generate: (req, ctx) => this.generateImages(req, ctx),
94
- edit: (req, ctx) => this.editImages(req, ctx),
95
- };
96
- audio = {
97
- transcribe: (req, ctx) => this.transcribe(req, ctx),
98
- transcriptionMaxBytes: openai_audio_mapper_1.OPENAI_TRANSCRIPTION_MAX_BYTES,
99
- speech: (req, ctx) => this.speak(req, ctx),
100
- voices: openai_model_catalog_1.OPENAI_SPEECH_VOICES,
101
- };
102
- realtime = {
103
- createSession: (req, ctx) => this.createRealtimeSession(req, ctx),
104
- voices: openai_model_catalog_1.OPENAI_REALTIME_VOICES,
105
- };
106
- logger = new common_1.Logger(OpenAiProviderAdapter_1.name);
107
- telemetry = new openai_call_telemetry_1.OpenAiCallTelemetry(openai_errors_1.OPENAI_FAMILY, this.logger);
108
- responsesEngine;
43
+ /**
44
+ * @param registry - the provider registry this adapter joins.
45
+ * @param clients - the injectable SDK client factory.
46
+ */
109
47
  constructor(registry, clients) {
48
+ super({ clients, logger: new common_1.Logger(OpenAiProviderAdapter_1.name), tracer: platform_ai_tracer_1.PLATFORM_AI_TRACER });
110
49
  this.registry = registry;
111
- this.clients = clients;
112
- this.responsesEngine = new openai_responses_engine_1.OpenAiResponsesEngine({
113
- family: openai_errors_1.OPENAI_FAMILY,
114
- telemetry: this.telemetry,
115
- logger: this.logger,
116
- client: (ctx) => this.clients.create(ctx),
117
- classify: (modelId) => this.classifyModel(modelId),
118
- });
119
50
  }
51
+ /** Adds this adapter to `AiProviderRegistry`. */
120
52
  onModuleInit() {
121
53
  this.registry.register(this);
122
54
  }
123
- classifyModel(modelId) {
124
- return (0, openai_model_catalog_1.classifyOpenAiModel)(modelId);
125
- }
126
- async listModels(ctx) {
127
- return this.telemetry.call('models.list', undefined, ctx, async () => {
128
- const client = this.clients.create(ctx);
129
- const models = [];
130
- for await (const model of client.models.list({ signal: ctx.signal })) {
131
- models.push({
132
- id: model.id,
133
- ownedBy: model.owned_by,
134
- ...(typeof model.created === 'number' ? { createdAt: new Date(model.created * 1000) } : {}),
135
- });
136
- }
137
- return models;
138
- });
139
- }
140
- /**
141
- * `GET /v1/models` with the key. A rejected key is an ANSWER
142
- * (`{ ok: false, code: 'AI_KEY_INVALID' }`), as is any other failure —
143
- * mapped to its code — so the admin UI never has to catch.
144
- */
145
- async verifyKey(ctx) {
146
- try {
147
- await this.telemetry.call('verify_key', undefined, ctx, async () => {
148
- const client = this.clients.create(ctx);
149
- await client.models.list({ signal: ctx.signal });
150
- });
151
- return { ok: true };
152
- }
153
- catch (err) {
154
- const mapped = (0, openai_errors_1.mapOpenAiError)(err);
155
- return mapped.code === 'AI_KEY_INVALID'
156
- ? { ok: false, code: 'AI_KEY_INVALID' }
157
- : { ok: false, code: mapped.code, detail: mapped.message };
158
- }
159
- }
160
- // ---- embeddings port ------------------------------------------------------
161
- /** `POST /v1/embeddings`, floats on the wire — see `openai-embeddings.mapper.ts`. */
162
- embed(req, ctx) {
163
- return this.telemetry.call('embeddings.create', req.model, ctx, async () => {
164
- const body = (0, openai_embeddings_mapper_1.toOpenAiEmbeddingRequest)(req);
165
- const client = this.clients.create(ctx);
166
- const { data, request_id } = await client.embeddings.create(body, { signal: ctx.signal }).withResponse();
167
- return (0, openai_embeddings_mapper_1.fromOpenAiEmbeddingResponse)(data, { request: req, providerRequestId: request_id });
168
- });
169
- }
170
- // ---- images port ------------------------------------------------------------
171
- /** `POST /v1/images/generations`, always answered as base64 bytes — see `openai-images.mapper.ts`. */
172
- generateImages(req, ctx) {
173
- return this.telemetry.call('images.generate', req.model, ctx, async () => {
174
- const body = (0, openai_images_mapper_1.toOpenAiImageGenerateRequest)(req);
175
- const client = this.clients.create(ctx);
176
- const { data, request_id } = await client.images.generate(body, { signal: ctx.signal }).withResponse();
177
- return (0, openai_images_mapper_1.fromOpenAiImagesResponse)(data, { request: req, providerRequestId: request_id });
178
- });
179
- }
180
- /** `POST /v1/images/edits` (multipart: the source images and the optional mask). */
181
- editImages(req, ctx) {
182
- return this.telemetry.call('images.edit', req.model, ctx, async () => {
183
- const body = await (0, openai_images_mapper_1.toOpenAiImageEditRequest)(req);
184
- const client = this.clients.create(ctx);
185
- const { data, request_id } = await client.images.edit(body, { signal: ctx.signal }).withResponse();
186
- return (0, openai_images_mapper_1.fromOpenAiImagesResponse)(data, { request: req, providerRequestId: request_id });
187
- });
188
- }
189
- // ---- audio port -------------------------------------------------------------
190
- /**
191
- * `POST /v1/audio/transcriptions` (multipart). A streamed input is sent as
192
- * it is read — see `openai-audio.mapper.ts`.
193
- */
194
- transcribe(req, ctx) {
195
- return this.telemetry.call('audio.transcribe', req.model, ctx, async () => {
196
- const body = await (0, openai_audio_mapper_1.toOpenAiTranscriptionRequest)(req);
197
- const client = this.clients.create(ctx);
198
- const { data, request_id } = await client.audio.transcriptions
199
- .create(body, { signal: ctx.signal })
200
- .withResponse();
201
- return (0, openai_audio_mapper_1.fromOpenAiTranscriptionResponse)(data, { request: req, providerRequestId: request_id });
202
- });
203
- }
204
- /** `POST /v1/audio/speech` — the answer is the audio file itself. */
205
- speak(req, ctx) {
206
- return this.telemetry.call('audio.speech', req.model, ctx, async () => {
207
- const body = (0, openai_audio_mapper_1.toOpenAiSpeechRequest)(req);
208
- const client = this.clients.create(ctx);
209
- const { data, request_id } = await client.audio.speech.create(body, { signal: ctx.signal }).withResponse();
210
- const bytes = new Uint8Array(await data.arrayBuffer());
211
- return (0, openai_audio_mapper_1.fromOpenAiSpeechResponse)(bytes, { request: req, providerRequestId: request_id });
212
- });
213
- }
214
- // ---- realtime port -----------------------------------------------------------
215
- /**
216
- * `POST /v1/realtime/client_secrets` — mints the ephemeral secret a browser
217
- * opens one WebRTC session with (`openai-realtime.mapper.ts`). The call's
218
- * key is the request's `Authorization` header and goes nowhere else.
219
- */
220
- createRealtimeSession(req, ctx) {
221
- return this.telemetry.call('realtime.client_secret', req.model, ctx, async () => {
222
- const body = (0, openai_realtime_mapper_1.toOpenAiClientSecretRequest)(req);
223
- const client = this.clients.create(ctx);
224
- const { data, request_id } = await client.realtime.clientSecrets
225
- .create(body, { signal: ctx.signal })
226
- .withResponse();
227
- return (0, openai_realtime_mapper_1.fromOpenAiClientSecretResponse)(data, {
228
- request: req,
229
- baseUrl: ctx.baseUrl,
230
- providerRequestId: request_id,
231
- });
232
- });
233
- }
234
55
  };
235
56
  exports.OpenAiProviderAdapter = OpenAiProviderAdapter;
236
57
  exports.OpenAiProviderAdapter = OpenAiProviderAdapter = OpenAiProviderAdapter_1 = __decorate([
@@ -1 +1 @@
1
- {"version":3,"file":"openai.adapter.js","sourceRoot":"","sources":["../../../../src/ai/providers/openai/openai.adapter.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"openai.adapter.js","sourceRoot":"","sources":["../../../../src/ai/providers/openai/openai.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,mEAAiF;AAAxE,+GAAA,qBAAqB,OAAA;AAE9B;;;;;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"}
@@ -1,16 +1,16 @@
1
- import { OpenAI } from 'openai';
2
- import { type AiCallContext } from '../../core/provider-adapter.interface';
3
- import { type OpenAiClientOptions } from '../openai/openai-client.factory';
4
- /** DI token for the client's options (tests inject a mocked `fetch`). */
1
+ import { OpenAiCompatibleClientFactory as BaseOpenAiCompatibleClientFactory, type OpenAiClientOptions } from '@marinoscar/platform-ai-providers/openai';
2
+ /** DI token for `OpenAiClientOptions` (optional; tests and forks provide it). */
5
3
  export declare const OPENAI_COMPATIBLE_CLIENT_OPTIONS: unique symbol;
6
- export declare class OpenAiCompatibleClientFactory {
7
- private readonly options;
8
- constructor(options?: OpenAiClientOptions);
4
+ /**
5
+ * The injectable OpenAiCompatibleClientFactory: the framework-free factory of
6
+ * `@marinoscar/platform-ai-providers/openai` with its options injected.
7
+ *
8
+ * @stability experimental
9
+ */
10
+ export declare class OpenAiCompatibleClientFactory extends BaseOpenAiCompatibleClientFactory {
9
11
  /**
10
- * The client for one call. Throws `AI_KEY_INVALID` for an empty key and
11
- * `AI_PROVIDER_UNAVAILABLE` when no base URL is configured — there is no
12
- * default host for a self-hosted server.
12
+ * @param options - the client options (a mocked `fetch` in tests); none in production.
13
13
  */
14
- create(ctx: AiCallContext): OpenAI;
14
+ constructor(options?: OpenAiClientOptions);
15
15
  }
16
16
  //# sourceMappingURL=openai-compatible-client.factory.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"openai-compatible-client.factory.d.ts","sourceRoot":"","sources":["../../../../src/ai/providers/openai-compatible/openai-compatible-client.factory.ts"],"names":[],"mappings":"AAkBA,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAGhC,OAAO,EAAsB,KAAK,aAAa,EAAE,MAAM,uCAAuC,CAAC;AAC/F,OAAO,EAEL,KAAK,mBAAmB,EAEzB,MAAM,iCAAiC,CAAC;AAIzC,yEAAyE;AACzE,eAAO,MAAM,gCAAgC,eAA6C,CAAC;AAE3F,qBACa,6BAA6B;IACxC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAsB;gBAEoB,OAAO,CAAC,EAAE,mBAAmB;IAI/F;;;;OAIG;IACH,MAAM,CAAC,GAAG,EAAE,aAAa,GAAG,MAAM;CAkBnC"}
1
+ {"version":3,"file":"openai-compatible-client.factory.d.ts","sourceRoot":"","sources":["../../../../src/ai/providers/openai-compatible/openai-compatible-client.factory.ts"],"names":[],"mappings":"AAYA,OAAO,EACL,6BAA6B,IAAI,iCAAiC,EAClE,KAAK,mBAAmB,EACzB,MAAM,0CAA0C,CAAC;AAElD,iFAAiF;AACjF,eAAO,MAAM,gCAAgC,eAA6C,CAAC;AAE3F;;;;;GAKG;AACH,qBACa,6BAA8B,SAAQ,iCAAiC;IAClF;;OAEG;gBAC+D,OAAO,CAAC,EAAE,mBAAmB;CAGhG"}
@@ -1,19 +1,13 @@
1
1
  "use strict";
2
2
  // =============================================================================
3
- // OpenAI-compatible SDK client factory (issue #448, epic #421)
3
+ // OpenAiCompatibleClientFactory: the Nest binding (issue #991)
4
4
  // =============================================================================
5
5
  //
6
- // One OpenAI SDK client PER CALL, pointed at the administrator's `baseUrl`
7
- // (the server's API root, `/v1` included), with the options every
8
- // OpenAI-family client pins (no environment reads, no retries, no SDK
9
- // logging) and a `fetch` that follows no redirect (`openai-redirect-guard.ts`).
10
- //
11
- // KEYLESS (`keySource: 'none'`). A call whose key is `AI_KEYLESS_API_KEY` —
12
- // the marker the key resolver hands out for a `requiresKey: false` server —
13
- // carries NO credential: the SDK's `Authorization` header is explicitly
14
- // removed (`defaultHeaders: { Authorization: null }`), so the marker never
15
- // reaches the wire. Any other key is sent as a bearer token, as OpenAI does;
16
- // that is what vLLM's `--api-key`, LM Studio and most gateways check.
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_COMPATIBLE_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.
17
11
  // =============================================================================
18
12
  var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
19
13
  var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
@@ -30,38 +24,21 @@ var __param = (this && this.__param) || function (paramIndex, decorator) {
30
24
  Object.defineProperty(exports, "__esModule", { value: true });
31
25
  exports.OpenAiCompatibleClientFactory = exports.OPENAI_COMPATIBLE_CLIENT_OPTIONS = void 0;
32
26
  const common_1 = require("@nestjs/common");
33
- const openai_1 = require("openai");
34
- const ai_error_1 = require("../../core/ai-error");
35
- const provider_adapter_interface_1 = require("../../core/provider-adapter.interface");
36
- const openai_client_factory_1 = require("../openai/openai-client.factory");
37
- const openai_redirect_guard_1 = require("../openai/openai-redirect-guard");
38
- const openai_compatible_settings_1 = require("./openai-compatible-settings");
39
- /** DI token for the client's options (tests inject a mocked `fetch`). */
27
+ const openai_1 = require("@marinoscar/platform-ai-providers/openai");
28
+ /** DI token for `OpenAiClientOptions` (optional; tests and forks provide it). */
40
29
  exports.OPENAI_COMPATIBLE_CLIENT_OPTIONS = Symbol('OPENAI_COMPATIBLE_CLIENT_OPTIONS');
41
- let OpenAiCompatibleClientFactory = class OpenAiCompatibleClientFactory {
42
- options;
43
- constructor(options) {
44
- this.options = options ?? {};
45
- }
30
+ /**
31
+ * The injectable OpenAiCompatibleClientFactory: the framework-free factory of
32
+ * `@marinoscar/platform-ai-providers/openai` with its options injected.
33
+ *
34
+ * @stability experimental
35
+ */
36
+ let OpenAiCompatibleClientFactory = class OpenAiCompatibleClientFactory extends openai_1.OpenAiCompatibleClientFactory {
46
37
  /**
47
- * The client for one call. Throws `AI_KEY_INVALID` for an empty key and
48
- * `AI_PROVIDER_UNAVAILABLE` when no base URL is configured — there is no
49
- * default host for a self-hosted server.
38
+ * @param options - the client options (a mocked `fetch` in tests); none in production.
50
39
  */
51
- create(ctx) {
52
- (0, openai_client_factory_1.assertOpenAiApiKey)(ctx, openai_compatible_settings_1.OPENAI_COMPATIBLE_FAMILY);
53
- if (!ctx.baseUrl) {
54
- throw new ai_error_1.AiError('AI_PROVIDER_UNAVAILABLE', 'No OpenAI-compatible base URL is configured.', {
55
- details: { provider: openai_compatible_settings_1.OPENAI_COMPATIBLE_FAMILY.providerId, missing: 'baseUrl' },
56
- });
57
- }
58
- const keyless = ctx.apiKey === provider_adapter_interface_1.AI_KEYLESS_API_KEY;
59
- return new openai_1.OpenAI({
60
- apiKey: ctx.apiKey,
61
- baseURL: ctx.baseUrl,
62
- ...(keyless ? { defaultHeaders: { Authorization: null } } : {}),
63
- ...(0, openai_client_factory_1.pinnedOpenAiClientOptions)(this.options, (0, openai_redirect_guard_1.noRedirectFetch)(this.options.fetch)),
64
- });
40
+ constructor(options) {
41
+ super(options);
65
42
  }
66
43
  };
67
44
  exports.OpenAiCompatibleClientFactory = OpenAiCompatibleClientFactory;
@@ -1 +1 @@
1
- {"version":3,"file":"openai-compatible-client.factory.js","sourceRoot":"","sources":["../../../../src/ai/providers/openai-compatible/openai-compatible-client.factory.ts"],"names":[],"mappings":";AAAA,gFAAgF;AAChF,+DAA+D;AAC/D,gFAAgF;AAChF,EAAE;AACF,2EAA2E;AAC3E,kEAAkE;AAClE,sEAAsE;AACtE,gFAAgF;AAChF,EAAE;AACF,4EAA4E;AAC5E,4EAA4E;AAC5E,wEAAwE;AACxE,2EAA2E;AAC3E,6EAA6E;AAC7E,sEAAsE;AACtE,gFAAgF;;;;;;;;;;;;;;;AAEhF,2CAA8D;AAC9D,mCAAgC;AAEhC,kDAA8C;AAC9C,sFAA+F;AAC/F,2EAIyC;AACzC,2EAAkE;AAClE,6EAAwE;AAExE,yEAAyE;AAC5D,QAAA,gCAAgC,GAAG,MAAM,CAAC,kCAAkC,CAAC,CAAC;AAGpF,IAAM,6BAA6B,GAAnC,MAAM,6BAA6B;IACvB,OAAO,CAAsB;IAE9C,YAAkE,OAA6B;QAC7F,IAAI,CAAC,OAAO,GAAG,OAAO,IAAI,EAAE,CAAC;IAC/B,CAAC;IAED;;;;OAIG;IACH,MAAM,CAAC,GAAkB;QACvB,IAAA,0CAAkB,EAAC,GAAG,EAAE,qDAAwB,CAAC,CAAC;QAElD,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE,CAAC;YACjB,MAAM,IAAI,kBAAO,CAAC,yBAAyB,EAAE,8CAA8C,EAAE;gBAC3F,OAAO,EAAE,EAAE,QAAQ,EAAE,qDAAwB,CAAC,UAAU,EAAE,OAAO,EAAE,SAAS,EAAE;aAC/E,CAAC,CAAC;QACL,CAAC;QAED,MAAM,OAAO,GAAG,GAAG,CAAC,MAAM,KAAK,+CAAkB,CAAC;QAElD,OAAO,IAAI,eAAM,CAAC;YAChB,MAAM,EAAE,GAAG,CAAC,MAAM;YAClB,OAAO,EAAE,GAAG,CAAC,OAAO;YACpB,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,cAAc,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YAC/D,GAAG,IAAA,iDAAyB,EAAC,IAAI,CAAC,OAAO,EAAE,IAAA,uCAAe,EAAC,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;SAChF,CAAC,CAAC;IACL,CAAC;CACF,CAAA;AA9BY,sEAA6B;wCAA7B,6BAA6B;IADzC,IAAA,mBAAU,GAAE;IAIE,WAAA,IAAA,iBAAQ,GAAE,CAAA;IAAE,WAAA,IAAA,eAAM,EAAC,wCAAgC,CAAC,CAAA;;GAHtD,6BAA6B,CA8BzC"}
1
+ {"version":3,"file":"openai-compatible-client.factory.js","sourceRoot":"","sources":["../../../../src/ai/providers/openai-compatible/openai-compatible-client.factory.ts"],"names":[],"mappings":";AAAA,gFAAgF;AAChF,+DAA+D;AAC/D,gFAAgF;AAChF,EAAE;AACF,8EAA8E;AAC9E,yEAAyE;AACzE,0EAA0E;AAC1E,0FAA0F;AAC1F,wEAAwE;AACxE,gFAAgF;;;;;;;;;;;;;;;AAEhF,2CAA8D;AAC9D,qEAGkD;AAElD,iFAAiF;AACpE,QAAA,gCAAgC,GAAG,MAAM,CAAC,kCAAkC,CAAC,CAAC;AAE3F;;;;;GAKG;AAEI,IAAM,6BAA6B,GAAnC,MAAM,6BAA8B,SAAQ,sCAAiC;IAClF;;OAEG;IACH,YAAkE,OAA6B;QAC7F,KAAK,CAAC,OAAO,CAAC,CAAC;IACjB,CAAC;CACF,CAAA;AAPY,sEAA6B;wCAA7B,6BAA6B;IADzC,IAAA,mBAAU,GAAE;IAKE,WAAA,IAAA,iBAAQ,GAAE,CAAA;IAAE,WAAA,IAAA,eAAM,EAAC,wCAAgC,CAAC,CAAA;;GAJtD,6BAA6B,CAOzC"}
@@ -1,40 +1,22 @@
1
1
  import { OnModuleInit } from '@nestjs/common';
2
- import type { AiModelCapabilities } from '../../core/capabilities';
3
- import type { AiCallContext, AiDiscoveredModel, AiKeyVerification, AiProviderAdapter, AiResponsesPort } from '../../core/provider-adapter.interface';
2
+ import { OpenAiCompatibleProviderAdapter as BaseOpenAiCompatibleProviderAdapter } from '@marinoscar/platform-ai-providers/openai';
3
+ import '../../core/ai-error';
4
4
  import { AiProviderRegistry } from '../../core/provider-registry';
5
- import type { AiFileInputStrategies } from '../../core/types/file-inputs.types';
6
- import type { AiEmbeddingsPort } from '../../core/types/media.types';
7
5
  import { OpenAiCompatibleClientFactory } from './openai-compatible-client.factory';
8
- export declare class OpenAiCompatibleProviderAdapter implements AiProviderAdapter, OnModuleInit {
6
+ /**
7
+ * The injectable OpenAiCompatibleProviderAdapter: registers itself with `AiProviderRegistry` when
8
+ * its module initialises.
9
+ *
10
+ * @stability experimental
11
+ */
12
+ export declare class OpenAiCompatibleProviderAdapter extends BaseOpenAiCompatibleProviderAdapter implements OnModuleInit {
9
13
  private readonly registry;
10
- private readonly clients;
11
- readonly id = "openai-compatible";
12
- readonly displayName = "OpenAI-compatible";
13
- /** Chat Completions stores nothing; declared for both styles — see the file header. */
14
- readonly supportsPreviousResponseId = false;
15
- /** No compatible server is assumed to run hosted tools. */
16
- readonly supportsHostedTools = false;
17
- /** Inline for both modalities — see the file header. */
18
- readonly fileInputStrategy: AiFileInputStrategies;
19
- readonly responses: AiResponsesPort;
20
- readonly embeddings: AiEmbeddingsPort;
21
- private readonly logger;
22
- private readonly telemetry;
23
- private readonly responsesEngine;
24
- private readonly chatEngine;
25
- constructor(registry: AiProviderRegistry, clients: OpenAiCompatibleClientFactory);
26
- onModuleInit(): void;
27
- /** Always unclassified — see the file header. */
28
- classifyModel(): AiModelCapabilities | null;
29
- listModels(ctx: AiCallContext): Promise<AiDiscoveredModel[]>;
30
14
  /**
31
- * `GET {baseUrl}/models`. For a keyless server this proves the server is
32
- * reachable; for any other it also proves the key. Failures are answers.
15
+ * @param registry - the provider registry this adapter joins.
16
+ * @param clients - the injectable SDK client factory.
33
17
  */
34
- verifyKey(ctx: AiCallContext): Promise<AiKeyVerification>;
35
- private create;
36
- private stream;
37
- /** `POST {baseUrl}/embeddings`, floats on the wire. */
38
- private embed;
18
+ constructor(registry: AiProviderRegistry, clients: OpenAiCompatibleClientFactory);
19
+ /** Adds this adapter to `AiProviderRegistry`. */
20
+ onModuleInit(): void;
39
21
  }
40
22
  //# sourceMappingURL=openai-compatible.adapter.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"openai-compatible.adapter.d.ts","sourceRoot":"","sources":["../../../../src/ai/providers/openai-compatible/openai-compatible.adapter.ts"],"names":[],"mappings":"AA0CA,OAAO,EAAsB,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAElE,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,yBAAyB,CAAC;AACnE,OAAO,KAAK,EACV,aAAa,EACb,iBAAiB,EACjB,iBAAiB,EACjB,iBAAiB,EACjB,eAAe,EAChB,MAAM,uCAAuC,CAAC;AAC/C,OAAO,EAAE,kBAAkB,EAAE,MAAM,8BAA8B,CAAC;AAClE,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,oCAAoC,CAAC;AAChF,OAAO,KAAK,EAAyC,gBAAgB,EAAE,MAAM,8BAA8B,CAAC;AAQ5G,OAAO,EAAE,6BAA6B,EAAE,MAAM,oCAAoC,CAAC;AAOnF,qBACa,+BAAgC,YAAW,iBAAiB,EAAE,YAAY;IA4BnF,OAAO,CAAC,QAAQ,CAAC,QAAQ;IACzB,OAAO,CAAC,QAAQ,CAAC,OAAO;IA5B1B,QAAQ,CAAC,EAAE,uBAAiC;IAC5C,QAAQ,CAAC,WAAW,uBAAuB;IAE3C,uFAAuF;IACvF,QAAQ,CAAC,0BAA0B,SAAS;IAE5C,2DAA2D;IAC3D,QAAQ,CAAC,mBAAmB,SAAS;IAErC,wDAAwD;IACxD,QAAQ,CAAC,iBAAiB,EAAE,qBAAqB,CAAuC;IAExF,QAAQ,CAAC,SAAS,EAAE,eAAe,CAGjC;IAEF,QAAQ,CAAC,UAAU,EAAE,gBAAgB,CAEnC;IAEF,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAoD;IAC3E,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAkE;IAC5F,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAwB;IACxD,OAAO,CAAC,QAAQ,CAAC,UAAU,CAA8B;gBAGtC,QAAQ,EAAE,kBAAkB,EAC5B,OAAO,EAAE,6BAA6B;IAoBzD,YAAY,IAAI,IAAI;IAIpB,iDAAiD;IACjD,aAAa,IAAI,mBAAmB,GAAG,IAAI;IAIrC,UAAU,CAAC,GAAG,EAAE,aAAa,GAAG,OAAO,CAAC,iBAAiB,EAAE,CAAC;IAkBlE;;;OAGG;IACG,SAAS,CAAC,GAAG,EAAE,aAAa,GAAG,OAAO,CAAC,iBAAiB,CAAC;IAkB/D,OAAO,CAAC,MAAM;IAQd,OAAO,CAAC,MAAM;IAed,uDAAuD;IACvD,OAAO,CAAC,KAAK;CAcd"}
1
+ {"version":3,"file":"openai-compatible.adapter.d.ts","sourceRoot":"","sources":["../../../../src/ai/providers/openai-compatible/openai-compatible.adapter.ts"],"names":[],"mappings":"AAcA,OAAO,EAAsB,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAClE,OAAO,EAAE,+BAA+B,IAAI,mCAAmC,EAAE,MAAM,0CAA0C,CAAC;AAElI,OAAO,qBAAqB,CAAC;AAC7B,OAAO,EAAE,kBAAkB,EAAE,MAAM,8BAA8B,CAAC;AAElE,OAAO,EAAE,6BAA6B,EAAE,MAAM,oCAAoC,CAAC;AAEnF;;;;;GAKG;AACH,qBACa,+BAAgC,SAAQ,mCAAoC,YAAW,YAAY;IAM5G,OAAO,CAAC,QAAQ,CAAC,QAAQ;IAL3B;;;OAGG;gBAEgB,QAAQ,EAAE,kBAAkB,EAC7C,OAAO,EAAE,6BAA6B;IAKxC,iDAAiD;IACjD,YAAY,IAAI,IAAI;CAGrB"}