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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (241) hide show
  1. package/CHANGELOG.md +18 -0
  2. package/dist/ai/core/ai-error.d.ts +15 -158
  3. package/dist/ai/core/ai-error.d.ts.map +1 -1
  4. package/dist/ai/core/ai-error.js +58 -221
  5. package/dist/ai/core/ai-error.js.map +1 -1
  6. package/dist/ai/core/capabilities.d.ts +3 -126
  7. package/dist/ai/core/capabilities.d.ts.map +1 -1
  8. package/dist/ai/core/capabilities.js +13 -109
  9. package/dist/ai/core/capabilities.js.map +1 -1
  10. package/dist/ai/core/conversation.d.ts +2 -15
  11. package/dist/ai/core/conversation.d.ts.map +1 -1
  12. package/dist/ai/core/conversation.js +9 -54
  13. package/dist/ai/core/conversation.js.map +1 -1
  14. package/dist/ai/core/hosted-tools.d.ts +3 -172
  15. package/dist/ai/core/hosted-tools.d.ts.map +1 -1
  16. package/dist/ai/core/hosted-tools.js +20 -286
  17. package/dist/ai/core/hosted-tools.js.map +1 -1
  18. package/dist/ai/core/provider-adapter.interface.d.ts +3 -260
  19. package/dist/ai/core/provider-adapter.interface.d.ts.map +1 -1
  20. package/dist/ai/core/provider-adapter.interface.js +7 -29
  21. package/dist/ai/core/provider-adapter.interface.js.map +1 -1
  22. package/dist/ai/core/structured-output.d.ts +3 -49
  23. package/dist/ai/core/structured-output.d.ts.map +1 -1
  24. package/dist/ai/core/structured-output.js +9 -80
  25. package/dist/ai/core/structured-output.js.map +1 -1
  26. package/dist/ai/core/tools.d.ts +3 -93
  27. package/dist/ai/core/tools.d.ts.map +1 -1
  28. package/dist/ai/core/tools.js +9 -73
  29. package/dist/ai/core/tools.js.map +1 -1
  30. package/dist/ai/core/types/file-inputs.types.d.ts +3 -102
  31. package/dist/ai/core/types/file-inputs.types.d.ts.map +1 -1
  32. package/dist/ai/core/types/file-inputs.types.js +14 -78
  33. package/dist/ai/core/types/file-inputs.types.js.map +1 -1
  34. package/dist/ai/core/types/media.types.d.ts +3 -616
  35. package/dist/ai/core/types/media.types.d.ts.map +1 -1
  36. package/dist/ai/core/types/media.types.js +33 -203
  37. package/dist/ai/core/types/media.types.js.map +1 -1
  38. package/dist/ai/core/types/responses.types.d.ts +3 -619
  39. package/dist/ai/core/types/responses.types.d.ts.map +1 -1
  40. package/dist/ai/core/types/responses.types.js +9 -57
  41. package/dist/ai/core/types/responses.types.js.map +1 -1
  42. package/dist/ai/http/dto/ai-images.dto.d.ts +4 -4
  43. package/dist/ai/index.d.ts +1 -1
  44. package/dist/ai/index.d.ts.map +1 -1
  45. package/dist/ai/index.js +3 -3
  46. package/dist/ai/index.js.map +1 -1
  47. package/dist/ai/providers/anthropic/anthropic-client.factory.d.ts +13 -15
  48. package/dist/ai/providers/anthropic/anthropic-client.factory.d.ts.map +1 -1
  49. package/dist/ai/providers/anthropic/anthropic-client.factory.js +23 -52
  50. package/dist/ai/providers/anthropic/anthropic-client.factory.js.map +1 -1
  51. package/dist/ai/providers/anthropic/anthropic.adapter.d.ts +15 -51
  52. package/dist/ai/providers/anthropic/anthropic.adapter.d.ts.map +1 -1
  53. package/dist/ai/providers/anthropic/anthropic.adapter.js +29 -293
  54. package/dist/ai/providers/anthropic/anthropic.adapter.js.map +1 -1
  55. package/dist/ai/providers/azure-openai/azure-openai-client.factory.d.ts +10 -14
  56. package/dist/ai/providers/azure-openai/azure-openai-client.factory.d.ts.map +1 -1
  57. package/dist/ai/providers/azure-openai/azure-openai-client.factory.js +20 -53
  58. package/dist/ai/providers/azure-openai/azure-openai-client.factory.js.map +1 -1
  59. package/dist/ai/providers/azure-openai/azure-openai.adapter.d.ts +14 -31
  60. package/dist/ai/providers/azure-openai/azure-openai.adapter.d.ts.map +1 -1
  61. package/dist/ai/providers/azure-openai/azure-openai.adapter.js +25 -170
  62. package/dist/ai/providers/azure-openai/azure-openai.adapter.js.map +1 -1
  63. package/dist/ai/providers/gemini/gemini-client.factory.d.ts +13 -18
  64. package/dist/ai/providers/gemini/gemini-client.factory.d.ts.map +1 -1
  65. package/dist/ai/providers/gemini/gemini-client.factory.js +24 -68
  66. package/dist/ai/providers/gemini/gemini-client.factory.js.map +1 -1
  67. package/dist/ai/providers/gemini/gemini.adapter.d.ts +15 -58
  68. package/dist/ai/providers/gemini/gemini.adapter.d.ts.map +1 -1
  69. package/dist/ai/providers/gemini/gemini.adapter.js +29 -348
  70. package/dist/ai/providers/gemini/gemini.adapter.js.map +1 -1
  71. package/dist/ai/providers/openai/openai-client.factory.d.ts +13 -35
  72. package/dist/ai/providers/openai/openai-client.factory.d.ts.map +1 -1
  73. package/dist/ai/providers/openai/openai-client.factory.js +25 -64
  74. package/dist/ai/providers/openai/openai-client.factory.js.map +1 -1
  75. package/dist/ai/providers/openai/openai.adapter.d.ts +15 -48
  76. package/dist/ai/providers/openai/openai.adapter.d.ts.map +1 -1
  77. package/dist/ai/providers/openai/openai.adapter.js +27 -206
  78. package/dist/ai/providers/openai/openai.adapter.js.map +1 -1
  79. package/dist/ai/providers/openai-compatible/openai-compatible-client.factory.d.ts +11 -11
  80. package/dist/ai/providers/openai-compatible/openai-compatible-client.factory.d.ts.map +1 -1
  81. package/dist/ai/providers/openai-compatible/openai-compatible-client.factory.js +18 -41
  82. package/dist/ai/providers/openai-compatible/openai-compatible-client.factory.js.map +1 -1
  83. package/dist/ai/providers/openai-compatible/openai-compatible.adapter.d.ts +14 -32
  84. package/dist/ai/providers/openai-compatible/openai-compatible.adapter.d.ts.map +1 -1
  85. package/dist/ai/providers/openai-compatible/openai-compatible.adapter.js +25 -149
  86. package/dist/ai/providers/openai-compatible/openai-compatible.adapter.js.map +1 -1
  87. package/dist/ai/providers/platform-ai-tracer.d.ts +4 -0
  88. package/dist/ai/providers/platform-ai-tracer.d.ts.map +1 -0
  89. package/dist/ai/providers/platform-ai-tracer.js +20 -0
  90. package/dist/ai/providers/platform-ai-tracer.js.map +1 -0
  91. package/dist/ai/runtime/ai-image-run-request.d.ts +1 -1
  92. package/dist/ai/testing/conformance/ai-no-sdk-leak.suite.d.ts +28 -5
  93. package/dist/ai/testing/conformance/ai-no-sdk-leak.suite.d.ts.map +1 -1
  94. package/dist/ai/testing/conformance/ai-no-sdk-leak.suite.js +54 -9
  95. package/dist/ai/testing/conformance/ai-no-sdk-leak.suite.js.map +1 -1
  96. package/dist/ai/testing/index.d.ts +1 -1
  97. package/dist/ai/testing/index.d.ts.map +1 -1
  98. package/dist/ai/testing/index.js +2 -1
  99. package/dist/ai/testing/index.js.map +1 -1
  100. package/dist/jobs/rate-limit.error.d.ts +2 -26
  101. package/dist/jobs/rate-limit.error.d.ts.map +1 -1
  102. package/dist/jobs/rate-limit.error.js +4 -52
  103. package/dist/jobs/rate-limit.error.js.map +1 -1
  104. package/dist/storage/config/storage-config.controller.d.ts +1 -1
  105. package/package.json +3 -2
  106. package/dist/ai/providers/anthropic/anthropic-errors.d.ts +0 -16
  107. package/dist/ai/providers/anthropic/anthropic-errors.d.ts.map +0 -1
  108. package/dist/ai/providers/anthropic/anthropic-errors.js +0 -156
  109. package/dist/ai/providers/anthropic/anthropic-errors.js.map +0 -1
  110. package/dist/ai/providers/anthropic/anthropic-messages.mapper.d.ts +0 -80
  111. package/dist/ai/providers/anthropic/anthropic-messages.mapper.d.ts.map +0 -1
  112. package/dist/ai/providers/anthropic/anthropic-messages.mapper.js +0 -536
  113. package/dist/ai/providers/anthropic/anthropic-messages.mapper.js.map +0 -1
  114. package/dist/ai/providers/anthropic/anthropic-model-catalog.d.ts +0 -49
  115. package/dist/ai/providers/anthropic/anthropic-model-catalog.d.ts.map +0 -1
  116. package/dist/ai/providers/anthropic/anthropic-model-catalog.js +0 -198
  117. package/dist/ai/providers/anthropic/anthropic-model-catalog.js.map +0 -1
  118. package/dist/ai/providers/anthropic/anthropic-stream.mapper.d.ts +0 -35
  119. package/dist/ai/providers/anthropic/anthropic-stream.mapper.d.ts.map +0 -1
  120. package/dist/ai/providers/anthropic/anthropic-stream.mapper.js +0 -203
  121. package/dist/ai/providers/anthropic/anthropic-stream.mapper.js.map +0 -1
  122. package/dist/ai/providers/anthropic/testing/anthropic-fixtures.d.ts +0 -18
  123. package/dist/ai/providers/anthropic/testing/anthropic-fixtures.d.ts.map +0 -1
  124. package/dist/ai/providers/anthropic/testing/anthropic-fixtures.js +0 -120
  125. package/dist/ai/providers/anthropic/testing/anthropic-fixtures.js.map +0 -1
  126. package/dist/ai/providers/anthropic/testing/anthropic-mock-transport.d.ts +0 -59
  127. package/dist/ai/providers/anthropic/testing/anthropic-mock-transport.d.ts.map +0 -1
  128. package/dist/ai/providers/anthropic/testing/anthropic-mock-transport.js +0 -206
  129. package/dist/ai/providers/anthropic/testing/anthropic-mock-transport.js.map +0 -1
  130. package/dist/ai/providers/azure-openai/azure-openai-settings.d.ts +0 -23
  131. package/dist/ai/providers/azure-openai/azure-openai-settings.d.ts.map +0 -1
  132. package/dist/ai/providers/azure-openai/azure-openai-settings.js +0 -54
  133. package/dist/ai/providers/azure-openai/azure-openai-settings.js.map +0 -1
  134. package/dist/ai/providers/gemini/gemini-content.mapper.d.ts +0 -98
  135. package/dist/ai/providers/gemini/gemini-content.mapper.d.ts.map +0 -1
  136. package/dist/ai/providers/gemini/gemini-content.mapper.js +0 -665
  137. package/dist/ai/providers/gemini/gemini-content.mapper.js.map +0 -1
  138. package/dist/ai/providers/gemini/gemini-embeddings.mapper.d.ts +0 -13
  139. package/dist/ai/providers/gemini/gemini-embeddings.mapper.d.ts.map +0 -1
  140. package/dist/ai/providers/gemini/gemini-embeddings.mapper.js +0 -78
  141. package/dist/ai/providers/gemini/gemini-embeddings.mapper.js.map +0 -1
  142. package/dist/ai/providers/gemini/gemini-errors.d.ts +0 -32
  143. package/dist/ai/providers/gemini/gemini-errors.d.ts.map +0 -1
  144. package/dist/ai/providers/gemini/gemini-errors.js +0 -191
  145. package/dist/ai/providers/gemini/gemini-errors.js.map +0 -1
  146. package/dist/ai/providers/gemini/gemini-model-catalog.d.ts +0 -45
  147. package/dist/ai/providers/gemini/gemini-model-catalog.d.ts.map +0 -1
  148. package/dist/ai/providers/gemini/gemini-model-catalog.js +0 -264
  149. package/dist/ai/providers/gemini/gemini-model-catalog.js.map +0 -1
  150. package/dist/ai/providers/gemini/gemini-stream.mapper.d.ts +0 -31
  151. package/dist/ai/providers/gemini/gemini-stream.mapper.d.ts.map +0 -1
  152. package/dist/ai/providers/gemini/gemini-stream.mapper.js +0 -118
  153. package/dist/ai/providers/gemini/gemini-stream.mapper.js.map +0 -1
  154. package/dist/ai/providers/gemini/testing/gemini-fixtures.d.ts +0 -80
  155. package/dist/ai/providers/gemini/testing/gemini-fixtures.d.ts.map +0 -1
  156. package/dist/ai/providers/gemini/testing/gemini-fixtures.js +0 -118
  157. package/dist/ai/providers/gemini/testing/gemini-fixtures.js.map +0 -1
  158. package/dist/ai/providers/gemini/testing/gemini-mock-transport.d.ts +0 -82
  159. package/dist/ai/providers/gemini/testing/gemini-mock-transport.d.ts.map +0 -1
  160. package/dist/ai/providers/gemini/testing/gemini-mock-transport.js +0 -342
  161. package/dist/ai/providers/gemini/testing/gemini-mock-transport.js.map +0 -1
  162. package/dist/ai/providers/openai/openai-audio.mapper.d.ts +0 -42
  163. package/dist/ai/providers/openai/openai-audio.mapper.d.ts.map +0 -1
  164. package/dist/ai/providers/openai/openai-audio.mapper.js +0 -266
  165. package/dist/ai/providers/openai/openai-audio.mapper.js.map +0 -1
  166. package/dist/ai/providers/openai/openai-call-telemetry.d.ts +0 -25
  167. package/dist/ai/providers/openai/openai-call-telemetry.d.ts.map +0 -1
  168. package/dist/ai/providers/openai/openai-call-telemetry.js +0 -93
  169. package/dist/ai/providers/openai/openai-call-telemetry.js.map +0 -1
  170. package/dist/ai/providers/openai/openai-chat-completions-stream.mapper.d.ts +0 -41
  171. package/dist/ai/providers/openai/openai-chat-completions-stream.mapper.d.ts.map +0 -1
  172. package/dist/ai/providers/openai/openai-chat-completions-stream.mapper.js +0 -173
  173. package/dist/ai/providers/openai/openai-chat-completions-stream.mapper.js.map +0 -1
  174. package/dist/ai/providers/openai/openai-chat-completions.engine.d.ts +0 -33
  175. package/dist/ai/providers/openai/openai-chat-completions.engine.d.ts.map +0 -1
  176. package/dist/ai/providers/openai/openai-chat-completions.engine.js +0 -165
  177. package/dist/ai/providers/openai/openai-chat-completions.engine.js.map +0 -1
  178. package/dist/ai/providers/openai/openai-chat-completions.mapper.d.ts +0 -42
  179. package/dist/ai/providers/openai/openai-chat-completions.mapper.d.ts.map +0 -1
  180. package/dist/ai/providers/openai/openai-chat-completions.mapper.js +0 -304
  181. package/dist/ai/providers/openai/openai-chat-completions.mapper.js.map +0 -1
  182. package/dist/ai/providers/openai/openai-embeddings.mapper.d.ts +0 -25
  183. package/dist/ai/providers/openai/openai-embeddings.mapper.d.ts.map +0 -1
  184. package/dist/ai/providers/openai/openai-embeddings.mapper.js +0 -81
  185. package/dist/ai/providers/openai/openai-embeddings.mapper.js.map +0 -1
  186. package/dist/ai/providers/openai/openai-errors.d.ts +0 -45
  187. package/dist/ai/providers/openai/openai-errors.d.ts.map +0 -1
  188. package/dist/ai/providers/openai/openai-errors.js +0 -247
  189. package/dist/ai/providers/openai/openai-errors.js.map +0 -1
  190. package/dist/ai/providers/openai/openai-family-guards.d.ts +0 -4
  191. package/dist/ai/providers/openai/openai-family-guards.d.ts.map +0 -1
  192. package/dist/ai/providers/openai/openai-family-guards.js +0 -19
  193. package/dist/ai/providers/openai/openai-family-guards.js.map +0 -1
  194. package/dist/ai/providers/openai/openai-images.mapper.d.ts +0 -23
  195. package/dist/ai/providers/openai/openai-images.mapper.d.ts.map +0 -1
  196. package/dist/ai/providers/openai/openai-images.mapper.js +0 -164
  197. package/dist/ai/providers/openai/openai-images.mapper.js.map +0 -1
  198. package/dist/ai/providers/openai/openai-model-catalog.d.ts +0 -36
  199. package/dist/ai/providers/openai/openai-model-catalog.d.ts.map +0 -1
  200. package/dist/ai/providers/openai/openai-model-catalog.js +0 -209
  201. package/dist/ai/providers/openai/openai-model-catalog.js.map +0 -1
  202. package/dist/ai/providers/openai/openai-realtime.mapper.d.ts +0 -18
  203. package/dist/ai/providers/openai/openai-realtime.mapper.d.ts.map +0 -1
  204. package/dist/ai/providers/openai/openai-realtime.mapper.js +0 -159
  205. package/dist/ai/providers/openai/openai-realtime.mapper.js.map +0 -1
  206. package/dist/ai/providers/openai/openai-redirect-guard.d.ts +0 -9
  207. package/dist/ai/providers/openai/openai-redirect-guard.d.ts.map +0 -1
  208. package/dist/ai/providers/openai/openai-redirect-guard.js +0 -61
  209. package/dist/ai/providers/openai/openai-redirect-guard.js.map +0 -1
  210. package/dist/ai/providers/openai/openai-responses.engine.d.ts +0 -50
  211. package/dist/ai/providers/openai/openai-responses.engine.d.ts.map +0 -1
  212. package/dist/ai/providers/openai/openai-responses.engine.js +0 -206
  213. package/dist/ai/providers/openai/openai-responses.engine.js.map +0 -1
  214. package/dist/ai/providers/openai/openai-responses.mapper.d.ts +0 -64
  215. package/dist/ai/providers/openai/openai-responses.mapper.d.ts.map +0 -1
  216. package/dist/ai/providers/openai/openai-responses.mapper.js +0 -580
  217. package/dist/ai/providers/openai/openai-responses.mapper.js.map +0 -1
  218. package/dist/ai/providers/openai/openai-stream.mapper.d.ts +0 -28
  219. package/dist/ai/providers/openai/openai-stream.mapper.d.ts.map +0 -1
  220. package/dist/ai/providers/openai/openai-stream.mapper.js +0 -139
  221. package/dist/ai/providers/openai/openai-stream.mapper.js.map +0 -1
  222. package/dist/ai/providers/openai/testing/chat-completions-fixtures.d.ts +0 -24
  223. package/dist/ai/providers/openai/testing/chat-completions-fixtures.d.ts.map +0 -1
  224. package/dist/ai/providers/openai/testing/chat-completions-fixtures.js +0 -72
  225. package/dist/ai/providers/openai/testing/chat-completions-fixtures.js.map +0 -1
  226. package/dist/ai/providers/openai/testing/conformance-responders.d.ts +0 -7
  227. package/dist/ai/providers/openai/testing/conformance-responders.d.ts.map +0 -1
  228. package/dist/ai/providers/openai/testing/conformance-responders.js +0 -64
  229. package/dist/ai/providers/openai/testing/conformance-responders.js.map +0 -1
  230. package/dist/ai/providers/openai/testing/openai-fixtures.d.ts +0 -52
  231. package/dist/ai/providers/openai/testing/openai-fixtures.d.ts.map +0 -1
  232. package/dist/ai/providers/openai/testing/openai-fixtures.js +0 -208
  233. package/dist/ai/providers/openai/testing/openai-fixtures.js.map +0 -1
  234. package/dist/ai/providers/openai/testing/openai-mock-transport.d.ts +0 -242
  235. package/dist/ai/providers/openai/testing/openai-mock-transport.d.ts.map +0 -1
  236. package/dist/ai/providers/openai/testing/openai-mock-transport.js +0 -523
  237. package/dist/ai/providers/openai/testing/openai-mock-transport.js.map +0 -1
  238. package/dist/ai/providers/openai-compatible/openai-compatible-settings.d.ts +0 -13
  239. package/dist/ai/providers/openai-compatible/openai-compatible-settings.d.ts.map +0 -1
  240. package/dist/ai/providers/openai-compatible/openai-compatible-settings.js +0 -29
  241. package/dist/ai/providers/openai-compatible/openai-compatible-settings.js.map +0 -1
@@ -1,36 +0,0 @@
1
- import type { AiModelCapabilities } from '../../core/capabilities';
2
- export interface OpenAiClassifierRule {
3
- /** Tested against the full model id. */
4
- match: RegExp;
5
- /** `null` claims the id as deliberately unclassified. */
6
- capabilities: AiModelCapabilities | null;
7
- }
8
- /**
9
- * Every voice OpenAI's speech endpoint accepts —
10
- * `OpenAiProviderAdapter.audio.voices`. The `tts-1` family speaks the first nine only.
11
- */
12
- export declare const OPENAI_SPEECH_VOICES: readonly ["alloy", "ash", "coral", "echo", "fable", "onyx", "nova", "sage", "shimmer", "ballad", "verse", "marin", "cedar"];
13
- /**
14
- * The voices `tts-1` and `tts-1-hd` speak.
15
- *
16
- * @internal
17
- */
18
- export declare const OPENAI_TTS1_VOICES: ("alloy" | "ash" | "coral" | "echo" | "fable" | "onyx" | "nova" | "sage" | "shimmer" | "ballad" | "verse" | "marin" | "cedar")[];
19
- /**
20
- * Every voice a realtime session accepts —
21
- * `OpenAiProviderAdapter.realtime.voices` and the `realtime` classification's `voices` (#449). Not the
22
- * speech list: `fable`, `onyx` and `nova` are `/v1/audio/speech` only.
23
- * `marin` and `cedar` are the GA `gpt-realtime` voices OpenAI recommends.
24
- */
25
- export declare const OPENAI_REALTIME_VOICES: readonly ["alloy", "ash", "ballad", "coral", "echo", "sage", "shimmer", "verse", "marin", "cedar"];
26
- /** Ordered; first match wins. See the file header before reordering. */
27
- export declare const OPENAI_CLASSIFIER_RULES: readonly OpenAiClassifierRule[];
28
- /**
29
- * The capabilities OpenAI model `modelId` is believed to have, or `null` when
30
- * this table does not recognise it. Returns a fresh copy each call, so a
31
- * caller mutating the result cannot corrupt the table.
32
- *
33
- * @internal
34
- */
35
- export declare function classifyOpenAiModel(modelId: string, rules?: readonly OpenAiClassifierRule[]): AiModelCapabilities | null;
36
- //# sourceMappingURL=openai-model-catalog.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"openai-model-catalog.d.ts","sourceRoot":"","sources":["../../../../src/ai/providers/openai/openai-model-catalog.ts"],"names":[],"mappings":"AAwBA,OAAO,KAAK,EAAE,mBAAmB,EAAqB,MAAM,yBAAyB,CAAC;AAEtF,MAAM,WAAW,oBAAoB;IACnC,wCAAwC;IACxC,KAAK,EAAE,MAAM,CAAC;IACd,yDAAyD;IACzD,YAAY,EAAE,mBAAmB,GAAG,IAAI,CAAC;CAC1C;AA6ED;;;GAGG;AACH,eAAO,MAAM,oBAAoB,6HAcvB,CAAC;AAEX;;;;GAIG;AACH,eAAO,MAAM,kBAAkB,kIAAmC,CAAC;AAiBnE;;;;;GAKG;AACH,eAAO,MAAM,sBAAsB,oGAWzB,CAAC;AAcX,wEAAwE;AACxE,eAAO,MAAM,uBAAuB,EAAE,SAAS,oBAAoB,EAkClE,CAAC;AAEF;;;;;;GAMG;AACH,wBAAgB,mBAAmB,CACjC,OAAO,EAAE,MAAM,EACf,KAAK,GAAE,SAAS,oBAAoB,EAA4B,GAC/D,mBAAmB,GAAG,IAAI,CAU5B"}
@@ -1,209 +0,0 @@
1
- "use strict";
2
- // =============================================================================
3
- // OpenAI model classifier (issue #426, epic #419)
4
- // =============================================================================
5
- //
6
- // This table is a best-effort default; admins override per model. Update it
7
- // when OpenAI ships new families.
8
- //
9
- // `GET /v1/models` returns ids and nothing about what a model can do, so
10
- // `classifyModel()` answers from this ordered rule list: FIRST MATCH WINS, and
11
- // no match means `null` — the catalog (#427) stores the model as
12
- // `unclassified` and an administrator decides, rather than this file guessing
13
- // (docs/specs/ai-platform.md §2.17: a wrong guess is worse than "unknown").
14
- //
15
- // Dated snapshots (`gpt-4o-2024-08-06`, `o3-mini-2025-01-31`) are kept, not
16
- // filtered as noise, and classify like their family — every pattern is a
17
- // prefix match for exactly that reason.
18
- //
19
- // A rule may map to `null` on purpose: a family this platform cannot drive
20
- // through any port yet (Chat-Completions-only audio and search previews,
21
- // legacy completions models) is claimed explicitly so that a broader rule
22
- // further down cannot mis-classify it. Specific rules therefore come before
23
- // general ones — the order IS the logic.
24
- // =============================================================================
25
- Object.defineProperty(exports, "__esModule", { value: true });
26
- exports.OPENAI_CLASSIFIER_RULES = exports.OPENAI_REALTIME_VOICES = exports.OPENAI_TTS1_VOICES = exports.OPENAI_SPEECH_VOICES = void 0;
27
- exports.classifyOpenAiModel = classifyOpenAiModel;
28
- const GPT5_EFFORTS = ['minimal', 'low', 'medium', 'high'];
29
- const O_SERIES_EFFORTS = ['low', 'medium', 'high'];
30
- /** A reasoning model that sees images and files (gpt-5*, o1/o3/o4-mini, codex). */
31
- function reasoningMultimodal(efforts) {
32
- return {
33
- capabilities: [
34
- 'responses',
35
- 'reasoning',
36
- 'tools',
37
- 'hosted_tools',
38
- 'structured_output',
39
- 'streaming',
40
- 'vision_input',
41
- 'file_input',
42
- ],
43
- inputModalities: ['text', 'image', 'file'],
44
- outputModalities: ['text'],
45
- reasoningEfforts: efforts,
46
- };
47
- }
48
- /** A text-only reasoning model (o1-mini, o3-mini). */
49
- const REASONING_TEXT = {
50
- capabilities: ['responses', 'reasoning', 'tools', 'structured_output', 'streaming'],
51
- inputModalities: ['text'],
52
- outputModalities: ['text'],
53
- reasoningEfforts: O_SERIES_EFFORTS,
54
- };
55
- /**
56
- * A non-reasoning multimodal chat model (gpt-4o, gpt-4.1, gpt-5-chat). It and
57
- * the reasoning multimodal family above carry `hosted_tools` (#442): the
58
- * Responses API offers them web search, file search, code interpreter,
59
- * image generation and remote MCP. An individual model that lacks one is
60
- * refused by OpenAI itself; an administrator can override the chip.
61
- */
62
- const CHAT_MULTIMODAL = {
63
- capabilities: ['responses', 'tools', 'hosted_tools', 'structured_output', 'streaming', 'vision_input', 'file_input'],
64
- inputModalities: ['text', 'image', 'file'],
65
- outputModalities: ['text'],
66
- };
67
- /** gpt-4-turbo: vision and tools, but predates strict structured outputs. */
68
- const CHAT_VISION_LEGACY = {
69
- capabilities: ['responses', 'tools', 'streaming', 'vision_input'],
70
- inputModalities: ['text', 'image'],
71
- outputModalities: ['text'],
72
- };
73
- /** gpt-4 / gpt-3.5-turbo: text in, text out, function calling. */
74
- const CHAT_TEXT_LEGACY = {
75
- capabilities: ['responses', 'tools', 'streaming'],
76
- inputModalities: ['text'],
77
- outputModalities: ['text'],
78
- };
79
- const IMAGE_GENERATE_AND_EDIT = {
80
- capabilities: ['image_generation', 'image_edit'],
81
- inputModalities: ['text', 'image'],
82
- outputModalities: ['image'],
83
- };
84
- const IMAGE_GENERATE_ONLY = {
85
- capabilities: ['image_generation'],
86
- inputModalities: ['text'],
87
- outputModalities: ['image'],
88
- };
89
- const TRANSCRIPTION = {
90
- capabilities: ['audio_transcription'],
91
- inputModalities: ['audio'],
92
- outputModalities: ['text'],
93
- };
94
- /**
95
- * Every voice OpenAI's speech endpoint accepts —
96
- * `OpenAiProviderAdapter.audio.voices`. The `tts-1` family speaks the first nine only.
97
- */
98
- exports.OPENAI_SPEECH_VOICES = [
99
- 'alloy',
100
- 'ash',
101
- 'coral',
102
- 'echo',
103
- 'fable',
104
- 'onyx',
105
- 'nova',
106
- 'sage',
107
- 'shimmer',
108
- 'ballad',
109
- 'verse',
110
- 'marin',
111
- 'cedar',
112
- ];
113
- /**
114
- * The voices `tts-1` and `tts-1-hd` speak.
115
- *
116
- * @internal
117
- */
118
- exports.OPENAI_TTS1_VOICES = exports.OPENAI_SPEECH_VOICES.slice(0, 9);
119
- function speech(voices) {
120
- return {
121
- capabilities: ['audio_speech'],
122
- inputModalities: ['text'],
123
- outputModalities: ['audio'],
124
- voices: [...voices],
125
- };
126
- }
127
- const EMBEDDINGS = {
128
- capabilities: ['embeddings'],
129
- inputModalities: ['text'],
130
- outputModalities: ['embedding'],
131
- };
132
- /**
133
- * Every voice a realtime session accepts —
134
- * `OpenAiProviderAdapter.realtime.voices` and the `realtime` classification's `voices` (#449). Not the
135
- * speech list: `fable`, `onyx` and `nova` are `/v1/audio/speech` only.
136
- * `marin` and `cedar` are the GA `gpt-realtime` voices OpenAI recommends.
137
- */
138
- exports.OPENAI_REALTIME_VOICES = [
139
- 'alloy',
140
- 'ash',
141
- 'ballad',
142
- 'coral',
143
- 'echo',
144
- 'sage',
145
- 'shimmer',
146
- 'verse',
147
- 'marin',
148
- 'cedar',
149
- ];
150
- /**
151
- * `gpt-realtime*`, `gpt-4o-realtime-preview*` and `gpt-4o-mini-realtime*`:
152
- * speech-to-speech over a browser-held session (#449), minted by the
153
- * adapter's `realtime` port.
154
- */
155
- const REALTIME = {
156
- capabilities: ['realtime'],
157
- inputModalities: ['text', 'audio'],
158
- outputModalities: ['text', 'audio'],
159
- voices: [...exports.OPENAI_REALTIME_VOICES],
160
- };
161
- /** Ordered; first match wins. See the file header before reordering. */
162
- exports.OPENAI_CLASSIFIER_RULES = [
163
- // ---- Special-purpose families first: their ids share prefixes with chat models.
164
- { match: /realtime/, capabilities: REALTIME },
165
- { match: /transcribe|^whisper-/, capabilities: TRANSCRIPTION },
166
- { match: /^tts-1(?:-|$)/, capabilities: speech(exports.OPENAI_TTS1_VOICES) },
167
- { match: /^tts-|-tts(?:-|$)/, capabilities: speech(exports.OPENAI_SPEECH_VOICES) },
168
- { match: /^text-embedding-/, capabilities: EMBEDDINGS },
169
- { match: /^dall-e-2(?:-|$)/, capabilities: IMAGE_GENERATE_AND_EDIT },
170
- { match: /^dall-e-3(?:-|$)/, capabilities: IMAGE_GENERATE_ONLY },
171
- { match: /^(?:chatgpt-|gpt-)image-|-image-/, capabilities: IMAGE_GENERATE_AND_EDIT },
172
- // ---- Deliberately unclassified: no port drives these yet.
173
- { match: /^gpt-(?:4o-(?:mini-)?)?audio/, capabilities: null },
174
- { match: /-search-(?:preview|api)/, capabilities: null },
175
- { match: /moderation/, capabilities: null },
176
- { match: /^computer-use/, capabilities: null },
177
- { match: /^gpt-3\.5-turbo-instruct/, capabilities: null },
178
- // ---- GPT-5 family: reasoning, except the `-chat` variants.
179
- { match: /^gpt-5(?:\.\d+)?-chat/, capabilities: CHAT_MULTIMODAL },
180
- { match: /^gpt-5(?:[.-]|$)/, capabilities: reasoningMultimodal(GPT5_EFFORTS) },
181
- // ---- o-series reasoning.
182
- { match: /^o[13]-mini(?:-|$)/, capabilities: REASONING_TEXT },
183
- { match: /^o\d(?:-|$)/, capabilities: reasoningMultimodal(O_SERIES_EFFORTS) },
184
- { match: /^codex-/, capabilities: reasoningMultimodal(O_SERIES_EFFORTS) },
185
- // ---- Non-reasoning chat models.
186
- { match: /^gpt-4\.1(?:-|$)/, capabilities: CHAT_MULTIMODAL },
187
- { match: /^gpt-4o(?:-|$)/, capabilities: CHAT_MULTIMODAL },
188
- { match: /^chatgpt-4o-/, capabilities: CHAT_MULTIMODAL },
189
- { match: /^gpt-4-turbo|^gpt-4-(?:\d{4}-)?vision/, capabilities: CHAT_VISION_LEGACY },
190
- { match: /^gpt-4(?:-|$)/, capabilities: CHAT_TEXT_LEGACY },
191
- { match: /^gpt-3\.5-turbo(?:-|$)/, capabilities: CHAT_TEXT_LEGACY },
192
- ];
193
- /**
194
- * The capabilities OpenAI model `modelId` is believed to have, or `null` when
195
- * this table does not recognise it. Returns a fresh copy each call, so a
196
- * caller mutating the result cannot corrupt the table.
197
- *
198
- * @internal
199
- */
200
- function classifyOpenAiModel(modelId, rules = exports.OPENAI_CLASSIFIER_RULES) {
201
- const id = modelId.trim().toLowerCase();
202
- for (const rule of rules) {
203
- if (rule.match.test(id)) {
204
- return rule.capabilities ? structuredClone(rule.capabilities) : null;
205
- }
206
- }
207
- return null;
208
- }
209
- //# sourceMappingURL=openai-model-catalog.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"openai-model-catalog.js","sourceRoot":"","sources":["../../../../src/ai/providers/openai/openai-model-catalog.ts"],"names":[],"mappings":"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"}
@@ -1,18 +0,0 @@
1
- import type { ClientSecretCreateParams, ClientSecretCreateResponse } from 'openai/resources/realtime/client-secrets';
2
- import { type AiRealtimeSession, type AiRealtimeSessionRequest } from '../../core/types/media.types';
3
- /** The provider's accepted range for `expires_after.seconds`. */
4
- export declare const OPENAI_REALTIME_TTL_MIN_SECONDS = 10;
5
- export declare const OPENAI_REALTIME_TTL_MAX_SECONDS = 7200;
6
- /** The largest per-response `max_output_tokens` a realtime session accepts (or `inf`). */
7
- export declare const OPENAI_REALTIME_MAX_OUTPUT_TOKENS = 4096;
8
- /** The WebRTC SDP endpoint under a base URL. */
9
- export declare function openAiRealtimeConnectUrl(baseUrl: string | undefined): string;
10
- /** `AiRealtimeSessionRequest` → the `client_secrets` body. */
11
- export declare function toOpenAiClientSecretRequest(req: AiRealtimeSessionRequest): ClientSecretCreateParams;
12
- /** The `client_secrets` answer → `AiRealtimeSession`. */
13
- export declare function fromOpenAiClientSecretResponse(data: ClientSecretCreateResponse, context: {
14
- request: AiRealtimeSessionRequest;
15
- baseUrl?: string;
16
- providerRequestId?: string | null;
17
- }): AiRealtimeSession;
18
- //# sourceMappingURL=openai-realtime.mapper.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"openai-realtime.mapper.d.ts","sourceRoot":"","sources":["../../../../src/ai/providers/openai/openai-realtime.mapper.ts"],"names":[],"mappings":"AA6BA,OAAO,KAAK,EACV,wBAAwB,EACxB,0BAA0B,EAC3B,MAAM,0CAA0C,CAAC;AAQlD,OAAO,EAEL,KAAK,iBAAiB,EACtB,KAAK,wBAAwB,EAE9B,MAAM,8BAA8B,CAAC;AAItC,iEAAiE;AACjE,eAAO,MAAM,+BAA+B,KAAK,CAAC;AAClD,eAAO,MAAM,+BAA+B,OAAO,CAAC;AAEpD,0FAA0F;AAC1F,eAAO,MAAM,iCAAiC,OAAO,CAAC;AAEtD,gDAAgD;AAChD,wBAAgB,wBAAwB,CAAC,OAAO,EAAE,MAAM,GAAG,SAAS,GAAG,MAAM,CAE5E;AAED,8DAA8D;AAC9D,wBAAgB,2BAA2B,CAAC,GAAG,EAAE,wBAAwB,GAAG,wBAAwB,CA0CnG;AAED,yDAAyD;AACzD,wBAAgB,8BAA8B,CAC5C,IAAI,EAAE,0BAA0B,EAChC,OAAO,EAAE;IAAE,OAAO,EAAE,wBAAwB,CAAC;IAAC,OAAO,CAAC,EAAE,MAAM,CAAC;IAAC,iBAAiB,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;CAAE,GAClG,iBAAiB,CAoCnB"}
@@ -1,159 +0,0 @@
1
- "use strict";
2
- // =============================================================================
3
- // OpenAI realtime mapper (issue #449, epic #421)
4
- // =============================================================================
5
- //
6
- // AiRealtimeSessionRequest <-> `POST /v1/realtime/client_secrets` (the GA
7
- // Realtime API; the beta `POST /v1/realtime/sessions` is not used). Pure
8
- // functions; every failure is an `AiError`, never an SDK error.
9
- //
10
- // WHAT GOES OUT. `expires_after` is ALWAYS sent (60 seconds by default,
11
- // `AI_REALTIME_CLIENT_SECRET_TTL_SECONDS`), so the provider's own default,
12
- // which has changed over time, never decides how long a secret lives. The
13
- // `session` object is the session's initial configuration: model, voice,
14
- // instructions, output modalities, turn detection, tools and an output-token
15
- // cap (at most 4096, the realtime ceiling). `providerOptions.openai` is merged into `session` last, the same
16
- // escape hatch every other mapper offers.
17
- //
18
- // WHAT COMES BACK. `{ value: 'ek_…', expires_at, session }`. `value` is the
19
- // ephemeral client secret; it becomes `clientSecret` and is otherwise
20
- // untouched. ⚠ It is a bearer credential: nothing in this file logs it, and
21
- // `sessionConfig` is rebuilt from named, non-secret fields rather than
22
- // passed through, so a provider that one day echoes a secret inside
23
- // `session` cannot leak it through this mapper.
24
- //
25
- // THE CONNECT URL is `<baseUrl>/realtime/calls`: the browser POSTs its SDP
26
- // offer there with `Authorization: Bearer <clientSecret>`. It follows the
27
- // slot's `baseUrl`, so a deployment behind an OpenAI-compatible gateway
28
- // sends its browsers to the same place the secret was minted.
29
- // =============================================================================
30
- Object.defineProperty(exports, "__esModule", { value: true });
31
- exports.OPENAI_REALTIME_MAX_OUTPUT_TOKENS = exports.OPENAI_REALTIME_TTL_MAX_SECONDS = exports.OPENAI_REALTIME_TTL_MIN_SECONDS = void 0;
32
- exports.openAiRealtimeConnectUrl = openAiRealtimeConnectUrl;
33
- exports.toOpenAiClientSecretRequest = toOpenAiClientSecretRequest;
34
- exports.fromOpenAiClientSecretResponse = fromOpenAiClientSecretResponse;
35
- const ai_error_1 = require("../../core/ai-error");
36
- const structured_output_1 = require("../../core/structured-output");
37
- const media_types_1 = require("../../core/types/media.types");
38
- const openai_client_factory_1 = require("./openai-client.factory");
39
- const openai_errors_1 = require("./openai-errors");
40
- /** The provider's accepted range for `expires_after.seconds`. */
41
- exports.OPENAI_REALTIME_TTL_MIN_SECONDS = 10;
42
- exports.OPENAI_REALTIME_TTL_MAX_SECONDS = 7200;
43
- /** The largest per-response `max_output_tokens` a realtime session accepts (or `inf`). */
44
- exports.OPENAI_REALTIME_MAX_OUTPUT_TOKENS = 4096;
45
- /** The WebRTC SDP endpoint under a base URL. */
46
- function openAiRealtimeConnectUrl(baseUrl) {
47
- return `${(baseUrl ?? openai_client_factory_1.OPENAI_DEFAULT_BASE_URL).replace(/\/+$/, '')}/realtime/calls`;
48
- }
49
- /** `AiRealtimeSessionRequest` → the `client_secrets` body. */
50
- function toOpenAiClientSecretRequest(req) {
51
- const seconds = req.expiresInSeconds ?? media_types_1.AI_REALTIME_CLIENT_SECRET_TTL_SECONDS;
52
- if (!Number.isInteger(seconds) || seconds < exports.OPENAI_REALTIME_TTL_MIN_SECONDS || seconds > exports.OPENAI_REALTIME_TTL_MAX_SECONDS) {
53
- throw new ai_error_1.AiError('AI_INVALID_REQUEST', `A realtime client secret lives ${exports.OPENAI_REALTIME_TTL_MIN_SECONDS}-${exports.OPENAI_REALTIME_TTL_MAX_SECONDS} seconds.`, { details: { provider: openai_errors_1.OPENAI_PROVIDER_ID } });
54
- }
55
- const session = { type: 'realtime', model: req.model };
56
- if (req.instructions !== undefined)
57
- session.instructions = req.instructions;
58
- if (req.modalities !== undefined)
59
- session.output_modalities = [...req.modalities];
60
- // A deployment cap above the realtime ceiling is simply the ceiling —
61
- // sending it as-is would be a 400 for every mint.
62
- if (req.maxOutputTokens !== undefined) {
63
- session.max_output_tokens = Math.min(req.maxOutputTokens, exports.OPENAI_REALTIME_MAX_OUTPUT_TOKENS);
64
- }
65
- const audio = {};
66
- if (req.voice !== undefined)
67
- audio.output = { voice: req.voice };
68
- if (req.turnDetection !== undefined)
69
- audio.input = { turn_detection: toTurnDetection(req.turnDetection) };
70
- if (Object.keys(audio).length > 0)
71
- session.audio = audio;
72
- if (req.tools?.length) {
73
- session.tools = req.tools.map((tool) => ({
74
- type: 'function',
75
- name: tool.name,
76
- description: tool.description,
77
- parameters: (0, structured_output_1.toJsonSchema)(tool.parameters),
78
- }));
79
- }
80
- const extra = req.providerOptions?.[openai_errors_1.OPENAI_PROVIDER_ID];
81
- return {
82
- expires_after: { anchor: 'created_at', seconds },
83
- session: (extra ? { ...session, ...extra, type: 'realtime' } : session),
84
- };
85
- }
86
- /** The `client_secrets` answer → `AiRealtimeSession`. */
87
- function fromOpenAiClientSecretResponse(data, context) {
88
- const { request } = context;
89
- if (typeof data?.value !== 'string' || data.value.length === 0 || typeof data.expires_at !== 'number') {
90
- throw new ai_error_1.AiError('AI_PROVIDER_UNAVAILABLE', 'OpenAI returned no realtime client secret.', {
91
- details: { provider: openai_errors_1.OPENAI_PROVIDER_ID },
92
- });
93
- }
94
- const session = data.session?.type === 'realtime' ? data.session : undefined;
95
- const voice = typeof session?.audio?.output?.voice === 'string' ? session.audio.output.voice : request.voice;
96
- const modalities = session?.output_modalities ?? request.modalities;
97
- const instructions = session?.instructions ?? request.instructions;
98
- const maxOutputTokens = typeof session?.max_output_tokens === 'number' ? session.max_output_tokens : request.maxOutputTokens;
99
- const turnDetection = request.turnDetection !== undefined ? request.turnDetection : fromTurnDetection(session?.audio?.input?.turn_detection);
100
- const sessionConfig = {};
101
- if (modalities !== undefined)
102
- sessionConfig.modalities = [...modalities];
103
- if (instructions !== undefined)
104
- sessionConfig.instructions = instructions;
105
- if (turnDetection !== undefined)
106
- sessionConfig.turnDetection = turnDetection;
107
- if (maxOutputTokens !== undefined)
108
- sessionConfig.maxOutputTokens = maxOutputTokens;
109
- return {
110
- ...(session?.id ? { id: session.id } : {}),
111
- provider: openai_errors_1.OPENAI_PROVIDER_ID,
112
- model: typeof session?.model === 'string' && session.model.length > 0 ? session.model : request.model,
113
- clientSecret: data.value,
114
- expiresAt: new Date(data.expires_at * 1000),
115
- connectUrl: openAiRealtimeConnectUrl(context.baseUrl),
116
- ...(voice !== undefined ? { voice } : {}),
117
- sessionConfig,
118
- ...(context.providerRequestId ? { providerRequestId: context.providerRequestId } : {}),
119
- };
120
- }
121
- function toTurnDetection(value) {
122
- if (value === null)
123
- return null;
124
- if (value.type === 'semantic_vad') {
125
- return { type: 'semantic_vad', ...(value.eagerness !== undefined ? { eagerness: value.eagerness } : {}) };
126
- }
127
- return {
128
- type: 'server_vad',
129
- ...(value.threshold !== undefined ? { threshold: value.threshold } : {}),
130
- ...(value.prefixPaddingMs !== undefined ? { prefix_padding_ms: value.prefixPaddingMs } : {}),
131
- ...(value.silenceDurationMs !== undefined ? { silence_duration_ms: value.silenceDurationMs } : {}),
132
- };
133
- }
134
- function fromTurnDetection(value) {
135
- if (value === null)
136
- return null;
137
- if (!value || typeof value !== 'object')
138
- return undefined;
139
- const raw = value;
140
- if (raw.type === 'semantic_vad') {
141
- const eagerness = raw.eagerness;
142
- return {
143
- type: 'semantic_vad',
144
- ...(eagerness === 'low' || eagerness === 'medium' || eagerness === 'high' || eagerness === 'auto'
145
- ? { eagerness }
146
- : {}),
147
- };
148
- }
149
- if (raw.type === 'server_vad') {
150
- return {
151
- type: 'server_vad',
152
- ...(typeof raw.threshold === 'number' ? { threshold: raw.threshold } : {}),
153
- ...(typeof raw.prefix_padding_ms === 'number' ? { prefixPaddingMs: raw.prefix_padding_ms } : {}),
154
- ...(typeof raw.silence_duration_ms === 'number' ? { silenceDurationMs: raw.silence_duration_ms } : {}),
155
- };
156
- }
157
- return undefined;
158
- }
159
- //# sourceMappingURL=openai-realtime.mapper.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"openai-realtime.mapper.js","sourceRoot":"","sources":["../../../../src/ai/providers/openai/openai-realtime.mapper.ts"],"names":[],"mappings":"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"}
@@ -1,9 +0,0 @@
1
- import type { OpenAiFetch } from './openai-client.factory';
2
- /** The OpenAI-shaped error code a refused redirect surfaces as (in `details.providerCode`). */
3
- export declare const REDIRECT_REFUSED_CODE = "redirect_refused";
4
- /**
5
- * `fetch` (the injected one, or the platform's) with redirects refused — see
6
- * the file header.
7
- */
8
- export declare function noRedirectFetch(fetch?: OpenAiFetch): OpenAiFetch;
9
- //# sourceMappingURL=openai-redirect-guard.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"openai-redirect-guard.d.ts","sourceRoot":"","sources":["../../../../src/ai/providers/openai/openai-redirect-guard.ts"],"names":[],"mappings":"AA2BA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AAE3D,+FAA+F;AAC/F,eAAO,MAAM,qBAAqB,qBAAqB,CAAC;AAMxD;;;GAGG;AACH,wBAAgB,eAAe,CAAC,KAAK,GAAE,WAA+C,GAAG,WAAW,CAyBnG"}
@@ -1,61 +0,0 @@
1
- "use strict";
2
- // =============================================================================
3
- // No redirects for administrator-chosen AI endpoints (issue #448, epic #421)
4
- // =============================================================================
5
- //
6
- // The Azure OpenAI and OpenAI-compatible adapters send this server's requests
7
- // to a host an ADMINISTRATOR typed in. That host being internal is an
8
- // explicit, admin-only decision (the settings schema documents it); what must
9
- // never happen is the host answering `302 Location: http://169.254.169.254/…`
10
- // (or any other origin) and the SDK's `fetch` quietly following it — with the
11
- // request's `api-key`/`Authorization` header and body — somewhere nobody
12
- // configured.
13
- //
14
- // DECISION: REFUSE EVERY REDIRECT, same-origin included. An OpenAI-shaped API
15
- // root has no business redirecting a POST, a same-origin redirect is almost
16
- // always a misconfigured `baseUrl` (a missing `/v1`, a trailing slash) that is
17
- // better reported than silently absorbed, and "same origin" is exactly the
18
- // check an attacker controlling DNS or a reverse proxy would aim to confuse.
19
- // Refusing all of them is the simplest rule that cannot be wrong.
20
- //
21
- // HOW. Every request goes out with `redirect: 'manual'`, so the platform
22
- // `fetch` returns the 3xx itself instead of following it. That 3xx is then
23
- // replaced by a synthetic error response the SDK turns into an ordinary
24
- // `APIError` (status kept, `code: 'redirect_refused'`), which `mapOpenAiError`
25
- // maps to `AI_PROVIDER_UNAVAILABLE` like any other unusable answer — never a
26
- // raw exception, never the `Location` it pointed at.
27
- // =============================================================================
28
- Object.defineProperty(exports, "__esModule", { value: true });
29
- exports.REDIRECT_REFUSED_CODE = void 0;
30
- exports.noRedirectFetch = noRedirectFetch;
31
- /** The OpenAI-shaped error code a refused redirect surfaces as (in `details.providerCode`). */
32
- exports.REDIRECT_REFUSED_CODE = 'redirect_refused';
33
- function isRedirect(response) {
34
- return response.type === 'opaqueredirect' || (response.status >= 300 && response.status < 400);
35
- }
36
- /**
37
- * `fetch` (the injected one, or the platform's) with redirects refused — see
38
- * the file header.
39
- */
40
- function noRedirectFetch(fetch = globalThis.fetch.bind(globalThis)) {
41
- return async (input, init) => {
42
- const response = await fetch(input, { ...(init ?? {}), redirect: 'manual' });
43
- if (!isRedirect(response))
44
- return response;
45
- // Drop the redirect's own body unread; it is not ours to parse.
46
- await response.body?.cancel().catch(() => undefined);
47
- return new Response(JSON.stringify({
48
- error: {
49
- message: 'The AI endpoint answered with a redirect, and redirects are not followed.',
50
- type: 'invalid_request_error',
51
- param: null,
52
- code: exports.REDIRECT_REFUSED_CODE,
53
- },
54
- }), {
55
- // An opaque redirect reports status 0, which a Response cannot carry.
56
- status: response.status >= 300 && response.status < 400 ? response.status : 310,
57
- headers: { 'content-type': 'application/json' },
58
- });
59
- };
60
- }
61
- //# sourceMappingURL=openai-redirect-guard.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"openai-redirect-guard.js","sourceRoot":"","sources":["../../../../src/ai/providers/openai/openai-redirect-guard.ts"],"names":[],"mappings":";AAAA,gFAAgF;AAChF,6EAA6E;AAC7E,gFAAgF;AAChF,EAAE;AACF,8EAA8E;AAC9E,sEAAsE;AACtE,8EAA8E;AAC9E,8EAA8E;AAC9E,8EAA8E;AAC9E,yEAAyE;AACzE,cAAc;AACd,EAAE;AACF,8EAA8E;AAC9E,4EAA4E;AAC5E,+EAA+E;AAC/E,2EAA2E;AAC3E,6EAA6E;AAC7E,kEAAkE;AAClE,EAAE;AACF,yEAAyE;AACzE,2EAA2E;AAC3E,wEAAwE;AACxE,+EAA+E;AAC/E,6EAA6E;AAC7E,qDAAqD;AACrD,gFAAgF;;;AAehF,0CAyBC;AApCD,+FAA+F;AAClF,QAAA,qBAAqB,GAAG,kBAAkB,CAAC;AAExD,SAAS,UAAU,CAAC,QAAkB;IACpC,OAAO,QAAQ,CAAC,IAAI,KAAK,gBAAgB,IAAI,CAAC,QAAQ,CAAC,MAAM,IAAI,GAAG,IAAI,QAAQ,CAAC,MAAM,GAAG,GAAG,CAAC,CAAC;AACjG,CAAC;AAED;;;GAGG;AACH,SAAgB,eAAe,CAAC,QAAqB,UAAU,CAAC,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC;IACpF,OAAO,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE;QAC3B,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,KAAK,EAAE,EAAE,GAAG,CAAC,IAAI,IAAI,EAAE,CAAC,EAAE,QAAQ,EAAE,QAAQ,EAAE,CAAC,CAAC;QAE7E,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC;YAAE,OAAO,QAAQ,CAAC;QAE3C,gEAAgE;QAChE,MAAM,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,CAAC;QAErD,OAAO,IAAI,QAAQ,CACjB,IAAI,CAAC,SAAS,CAAC;YACb,KAAK,EAAE;gBACL,OAAO,EAAE,2EAA2E;gBACpF,IAAI,EAAE,uBAAuB;gBAC7B,KAAK,EAAE,IAAI;gBACX,IAAI,EAAE,6BAAqB;aAC5B;SACF,CAAC,EACF;YACE,sEAAsE;YACtE,MAAM,EAAE,QAAQ,CAAC,MAAM,IAAI,GAAG,IAAI,QAAQ,CAAC,MAAM,GAAG,GAAG,CAAC,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG;YAC/E,OAAO,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE;SAChD,CACF,CAAC;IACJ,CAAC,CAAC;AACJ,CAAC"}
@@ -1,50 +0,0 @@
1
- import type { Logger } from '@nestjs/common';
2
- import { type OpenAI } from 'openai';
3
- import type { AiModelCapabilities } from '../../core/capabilities';
4
- import type { AiCallContext } from '../../core/provider-adapter.interface';
5
- import type { AiResponse, AiResponseRequest, AiStreamEvent } from '../../core/types/responses.types';
6
- import type { OpenAiCallTelemetry } from './openai-call-telemetry';
7
- import { type OpenAiFamily } from './openai-errors';
8
- export interface OpenAiResponsesEngineDeps {
9
- family: OpenAiFamily;
10
- telemetry: OpenAiCallTelemetry;
11
- logger: Logger;
12
- /** The SDK client for one call. */
13
- client(ctx: AiCallContext): OpenAI;
14
- /** The model's classified capabilities, or null when unclassified. */
15
- classify(modelId: string): AiModelCapabilities | null;
16
- }
17
- /** Per-call overrides. */
18
- export interface OpenAiResponsesCallOptions {
19
- /**
20
- * The `model` to send on the wire when it differs from `req.model` (an
21
- * Azure deployment name). The request's own model id still drives
22
- * classification, telemetry and the neutral response.
23
- */
24
- wireModel?: string;
25
- }
26
- export declare class OpenAiResponsesEngine {
27
- private readonly deps;
28
- constructor(deps: OpenAiResponsesEngineDeps);
29
- private get providerId();
30
- private body;
31
- create(req: AiResponseRequest, ctx: AiCallContext, opts?: OpenAiResponsesCallOptions): Promise<AiResponse>;
32
- /** Streams one response — see the file header for the contract. */
33
- stream(req: AiResponseRequest, ctx: AiCallContext, opts?: OpenAiResponsesCallOptions): AsyncGenerator<AiStreamEvent>;
34
- /**
35
- * What each storage-object part of `req` becomes on the wire, by the
36
- * strategy the runtime prepared it for: a presigned (or inline `data:`)
37
- * URL, or a Files API id — uploaded here, with the call's own key, and
38
- * pushed onto `uploaded` so the caller deletes it whatever happens next.
39
- * `undefined` when the request names no storage object.
40
- */
41
- private deliverStorageInputs;
42
- /**
43
- * Deletes the provider-side copies of this call's uploaded inputs. Best
44
- * effort: a failure is logged (file id and outcome only — never the key)
45
- * and never replaces the call's own result. Deliberately not bound to
46
- * `ctx.signal`: a cancelled call still cleans up.
47
- */
48
- private deleteUploaded;
49
- }
50
- //# sourceMappingURL=openai-responses.engine.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"openai-responses.engine.d.ts","sourceRoot":"","sources":["../../../../src/ai/providers/openai/openai-responses.engine.ts"],"names":[],"mappings":"AAoBA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,gBAAgB,CAAC;AAC7C,OAAO,EAAE,KAAK,MAAM,EAAU,MAAM,QAAQ,CAAC;AAI7C,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,yBAAyB,CAAC;AACnE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,uCAAuC,CAAC;AAC3E,OAAO,KAAK,EAAE,UAAU,EAAE,iBAAiB,EAAE,aAAa,EAAE,MAAM,kCAAkC,CAAC;AACrG,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,yBAAyB,CAAC;AACnE,OAAO,EAAkB,KAAK,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAUpE,MAAM,WAAW,yBAAyB;IACxC,MAAM,EAAE,YAAY,CAAC;IACrB,SAAS,EAAE,mBAAmB,CAAC;IAC/B,MAAM,EAAE,MAAM,CAAC;IACf,mCAAmC;IACnC,MAAM,CAAC,GAAG,EAAE,aAAa,GAAG,MAAM,CAAC;IACnC,sEAAsE;IACtE,QAAQ,CAAC,OAAO,EAAE,MAAM,GAAG,mBAAmB,GAAG,IAAI,CAAC;CACvD;AAED,0BAA0B;AAC1B,MAAM,WAAW,0BAA0B;IACzC;;;;OAIG;IACH,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,qBAAa,qBAAqB;IACpB,OAAO,CAAC,QAAQ,CAAC,IAAI;gBAAJ,IAAI,EAAE,yBAAyB;IAE5D,OAAO,KAAK,UAAU,GAErB;IAED,OAAO,CAAC,IAAI;IAMZ,MAAM,CAAC,GAAG,EAAE,iBAAiB,EAAE,GAAG,EAAE,aAAa,EAAE,IAAI,GAAE,0BAA+B,GAAG,OAAO,CAAC,UAAU,CAAC;IA2B9G,mEAAmE;IAC5D,MAAM,CACX,GAAG,EAAE,iBAAiB,EACtB,GAAG,EAAE,aAAa,EAClB,IAAI,GAAE,0BAA+B,GACpC,cAAc,CAAC,aAAa,CAAC;IAyFhC;;;;;;OAMG;YACW,oBAAoB;IA8ClC;;;;;OAKG;YACW,cAAc;CAkB7B"}