@particle-academy/prism 0.0.0

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 (447) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +155 -0
  3. package/dist/audio/pending-request.d.ts +37 -0
  4. package/dist/audio/pending-request.d.ts.map +1 -0
  5. package/dist/audio/pending-request.js +91 -0
  6. package/dist/audio/pending-request.js.map +1 -0
  7. package/dist/audio/request.d.ts +37 -0
  8. package/dist/audio/request.d.ts.map +1 -0
  9. package/dist/audio/request.js +50 -0
  10. package/dist/audio/request.js.map +1 -0
  11. package/dist/audio/response.d.ts +24 -0
  12. package/dist/audio/response.d.ts.map +1 -0
  13. package/dist/audio/response.js +36 -0
  14. package/dist/audio/response.js.map +1 -0
  15. package/dist/batch/batch-job.d.ts +91 -0
  16. package/dist/batch/batch-job.d.ts.map +1 -0
  17. package/dist/batch/batch-job.js +156 -0
  18. package/dist/batch/batch-job.js.map +1 -0
  19. package/dist/batch/pending-request.d.ts +29 -0
  20. package/dist/batch/pending-request.d.ts.map +1 -0
  21. package/dist/batch/pending-request.js +73 -0
  22. package/dist/batch/pending-request.js.map +1 -0
  23. package/dist/batch/request.d.ts +73 -0
  24. package/dist/batch/request.d.ts.map +1 -0
  25. package/dist/batch/request.js +79 -0
  26. package/dist/batch/request.js.map +1 -0
  27. package/dist/embeddings/pending-request.d.ts +38 -0
  28. package/dist/embeddings/pending-request.d.ts.map +1 -0
  29. package/dist/embeddings/pending-request.js +86 -0
  30. package/dist/embeddings/pending-request.js.map +1 -0
  31. package/dist/embeddings/request.d.ts +27 -0
  32. package/dist/embeddings/request.d.ts.map +1 -0
  33. package/dist/embeddings/request.js +38 -0
  34. package/dist/embeddings/request.js.map +1 -0
  35. package/dist/embeddings/response.d.ts +19 -0
  36. package/dist/embeddings/response.d.ts.map +1 -0
  37. package/dist/embeddings/response.js +21 -0
  38. package/dist/embeddings/response.js.map +1 -0
  39. package/dist/enums.d.ts +52 -0
  40. package/dist/enums.d.ts.map +1 -0
  41. package/dist/enums.js +69 -0
  42. package/dist/enums.js.map +1 -0
  43. package/dist/errors.d.ts +119 -0
  44. package/dist/errors.d.ts.map +1 -0
  45. package/dist/errors.js +115 -0
  46. package/dist/errors.js.map +1 -0
  47. package/dist/files/file-data.d.ts +53 -0
  48. package/dist/files/file-data.d.ts.map +1 -0
  49. package/dist/files/file-data.js +79 -0
  50. package/dist/files/file-data.js.map +1 -0
  51. package/dist/files/pending-request.d.ts +38 -0
  52. package/dist/files/pending-request.d.ts.map +1 -0
  53. package/dist/files/pending-request.js +96 -0
  54. package/dist/files/pending-request.js.map +1 -0
  55. package/dist/files/request.d.ts +77 -0
  56. package/dist/files/request.d.ts.map +1 -0
  57. package/dist/files/request.js +81 -0
  58. package/dist/files/request.js.map +1 -0
  59. package/dist/fim/pending-request.d.ts +31 -0
  60. package/dist/fim/pending-request.d.ts.map +1 -0
  61. package/dist/fim/pending-request.js +89 -0
  62. package/dist/fim/pending-request.js.map +1 -0
  63. package/dist/fim/request.d.ts +39 -0
  64. package/dist/fim/request.d.ts.map +1 -0
  65. package/dist/fim/request.js +65 -0
  66. package/dist/fim/request.js.map +1 -0
  67. package/dist/fim/response.d.ts +21 -0
  68. package/dist/fim/response.d.ts.map +1 -0
  69. package/dist/fim/response.js +30 -0
  70. package/dist/fim/response.js.map +1 -0
  71. package/dist/http/header-names.d.ts +36 -0
  72. package/dist/http/header-names.d.ts.map +1 -0
  73. package/dist/http/header-names.js +44 -0
  74. package/dist/http/header-names.js.map +1 -0
  75. package/dist/http/transport.d.ts +94 -0
  76. package/dist/http/transport.d.ts.map +1 -0
  77. package/dist/http/transport.js +131 -0
  78. package/dist/http/transport.js.map +1 -0
  79. package/dist/images/pending-request.d.ts +30 -0
  80. package/dist/images/pending-request.d.ts.map +1 -0
  81. package/dist/images/pending-request.js +66 -0
  82. package/dist/images/pending-request.js.map +1 -0
  83. package/dist/images/request.d.ts +19 -0
  84. package/dist/images/request.d.ts.map +1 -0
  85. package/dist/images/request.js +30 -0
  86. package/dist/images/request.js.map +1 -0
  87. package/dist/images/response.d.ts +29 -0
  88. package/dist/images/response.d.ts.map +1 -0
  89. package/dist/images/response.js +34 -0
  90. package/dist/images/response.js.map +1 -0
  91. package/dist/index.d.ts +108 -0
  92. package/dist/index.d.ts.map +1 -0
  93. package/dist/index.js +84 -0
  94. package/dist/index.js.map +1 -0
  95. package/dist/internal/filters.d.ts +40 -0
  96. package/dist/internal/filters.d.ts.map +1 -0
  97. package/dist/internal/filters.js +83 -0
  98. package/dist/internal/filters.js.map +1 -0
  99. package/dist/json.d.ts +41 -0
  100. package/dist/json.d.ts.map +1 -0
  101. package/dist/json.js +75 -0
  102. package/dist/json.js.map +1 -0
  103. package/dist/moderation/pending-request.d.ts +24 -0
  104. package/dist/moderation/pending-request.d.ts.map +1 -0
  105. package/dist/moderation/pending-request.js +60 -0
  106. package/dist/moderation/pending-request.js.map +1 -0
  107. package/dist/moderation/request.d.ts +20 -0
  108. package/dist/moderation/request.d.ts.map +1 -0
  109. package/dist/moderation/request.js +31 -0
  110. package/dist/moderation/request.js.map +1 -0
  111. package/dist/moderation/response.d.ts +26 -0
  112. package/dist/moderation/response.d.ts.map +1 -0
  113. package/dist/moderation/response.js +34 -0
  114. package/dist/moderation/response.js.map +1 -0
  115. package/dist/prism.d.ts +43 -0
  116. package/dist/prism.d.ts.map +1 -0
  117. package/dist/prism.js +79 -0
  118. package/dist/prism.js.map +1 -0
  119. package/dist/providers/anthropic/anthropic.d.ts +67 -0
  120. package/dist/providers/anthropic/anthropic.d.ts.map +1 -0
  121. package/dist/providers/anthropic/anthropic.js +172 -0
  122. package/dist/providers/anthropic/anthropic.js.map +1 -0
  123. package/dist/providers/anthropic/build-request-body.d.ts +15 -0
  124. package/dist/providers/anthropic/build-request-body.d.ts.map +1 -0
  125. package/dist/providers/anthropic/build-request-body.js +51 -0
  126. package/dist/providers/anthropic/build-request-body.js.map +1 -0
  127. package/dist/providers/anthropic/maps/finish-reason-map.d.ts +14 -0
  128. package/dist/providers/anthropic/maps/finish-reason-map.d.ts.map +1 -0
  129. package/dist/providers/anthropic/maps/finish-reason-map.js +30 -0
  130. package/dist/providers/anthropic/maps/finish-reason-map.js.map +1 -0
  131. package/dist/providers/anthropic/maps/media-map.d.ts +25 -0
  132. package/dist/providers/anthropic/maps/media-map.d.ts.map +1 -0
  133. package/dist/providers/anthropic/maps/media-map.js +87 -0
  134. package/dist/providers/anthropic/maps/media-map.js.map +1 -0
  135. package/dist/providers/anthropic/maps/message-map.d.ts +31 -0
  136. package/dist/providers/anthropic/maps/message-map.d.ts.map +1 -0
  137. package/dist/providers/anthropic/maps/message-map.js +121 -0
  138. package/dist/providers/anthropic/maps/message-map.js.map +1 -0
  139. package/dist/providers/anthropic/maps/tool-choice-map.d.ts +11 -0
  140. package/dist/providers/anthropic/maps/tool-choice-map.d.ts.map +1 -0
  141. package/dist/providers/anthropic/maps/tool-choice-map.js +25 -0
  142. package/dist/providers/anthropic/maps/tool-choice-map.js.map +1 -0
  143. package/dist/providers/anthropic/maps/tool-map.d.ts +14 -0
  144. package/dist/providers/anthropic/maps/tool-map.d.ts.map +1 -0
  145. package/dist/providers/anthropic/maps/tool-map.js +22 -0
  146. package/dist/providers/anthropic/maps/tool-map.js.map +1 -0
  147. package/dist/providers/anthropic/parse-response.d.ts +21 -0
  148. package/dist/providers/anthropic/parse-response.d.ts.map +1 -0
  149. package/dist/providers/anthropic/parse-response.js +109 -0
  150. package/dist/providers/anthropic/parse-response.js.map +1 -0
  151. package/dist/providers/anthropic/rate-limits.d.ts +4 -0
  152. package/dist/providers/anthropic/rate-limits.d.ts.map +1 -0
  153. package/dist/providers/anthropic/rate-limits.js +47 -0
  154. package/dist/providers/anthropic/rate-limits.js.map +1 -0
  155. package/dist/providers/anthropic/stream-events.d.ts +27 -0
  156. package/dist/providers/anthropic/stream-events.d.ts.map +1 -0
  157. package/dist/providers/anthropic/stream-events.js +147 -0
  158. package/dist/providers/anthropic/stream-events.js.map +1 -0
  159. package/dist/providers/mistral/build-request-body.d.ts +32 -0
  160. package/dist/providers/mistral/build-request-body.d.ts.map +1 -0
  161. package/dist/providers/mistral/build-request-body.js +69 -0
  162. package/dist/providers/mistral/build-request-body.js.map +1 -0
  163. package/dist/providers/mistral/embeddings.d.ts +14 -0
  164. package/dist/providers/mistral/embeddings.d.ts.map +1 -0
  165. package/dist/providers/mistral/embeddings.js +41 -0
  166. package/dist/providers/mistral/embeddings.js.map +1 -0
  167. package/dist/providers/mistral/fim.d.ts +32 -0
  168. package/dist/providers/mistral/fim.d.ts.map +1 -0
  169. package/dist/providers/mistral/fim.js +70 -0
  170. package/dist/providers/mistral/fim.js.map +1 -0
  171. package/dist/providers/mistral/maps/finish-reason-map.d.ts +15 -0
  172. package/dist/providers/mistral/maps/finish-reason-map.d.ts.map +1 -0
  173. package/dist/providers/mistral/maps/finish-reason-map.js +32 -0
  174. package/dist/providers/mistral/maps/finish-reason-map.js.map +1 -0
  175. package/dist/providers/mistral/maps/media-map.d.ts +24 -0
  176. package/dist/providers/mistral/maps/media-map.d.ts.map +1 -0
  177. package/dist/providers/mistral/maps/media-map.js +41 -0
  178. package/dist/providers/mistral/maps/media-map.js.map +1 -0
  179. package/dist/providers/mistral/maps/message-map.d.ts +20 -0
  180. package/dist/providers/mistral/maps/message-map.d.ts.map +1 -0
  181. package/dist/providers/mistral/maps/message-map.js +83 -0
  182. package/dist/providers/mistral/maps/message-map.js.map +1 -0
  183. package/dist/providers/mistral/maps/tool-choice-map.d.ts +12 -0
  184. package/dist/providers/mistral/maps/tool-choice-map.d.ts.map +1 -0
  185. package/dist/providers/mistral/maps/tool-choice-map.js +25 -0
  186. package/dist/providers/mistral/maps/tool-choice-map.js.map +1 -0
  187. package/dist/providers/mistral/maps/tool-map.d.ts +15 -0
  188. package/dist/providers/mistral/maps/tool-map.d.ts.map +1 -0
  189. package/dist/providers/mistral/maps/tool-map.js +26 -0
  190. package/dist/providers/mistral/maps/tool-map.js.map +1 -0
  191. package/dist/providers/mistral/mistral.d.ts +90 -0
  192. package/dist/providers/mistral/mistral.d.ts.map +1 -0
  193. package/dist/providers/mistral/mistral.js +210 -0
  194. package/dist/providers/mistral/mistral.js.map +1 -0
  195. package/dist/providers/mistral/parse-response.d.ts +35 -0
  196. package/dist/providers/mistral/parse-response.d.ts.map +1 -0
  197. package/dist/providers/mistral/parse-response.js +114 -0
  198. package/dist/providers/mistral/parse-response.js.map +1 -0
  199. package/dist/providers/mistral/rate-limits.d.ts +24 -0
  200. package/dist/providers/mistral/rate-limits.d.ts.map +1 -0
  201. package/dist/providers/mistral/rate-limits.js +55 -0
  202. package/dist/providers/mistral/rate-limits.js.map +1 -0
  203. package/dist/providers/mistral/stream-events.d.ts +29 -0
  204. package/dist/providers/mistral/stream-events.d.ts.map +1 -0
  205. package/dist/providers/mistral/stream-events.js +142 -0
  206. package/dist/providers/mistral/stream-events.js.map +1 -0
  207. package/dist/providers/openai/audio.d.ts +16 -0
  208. package/dist/providers/openai/audio.d.ts.map +1 -0
  209. package/dist/providers/openai/audio.js +105 -0
  210. package/dist/providers/openai/audio.js.map +1 -0
  211. package/dist/providers/openai/batch.d.ts +29 -0
  212. package/dist/providers/openai/batch.d.ts.map +1 -0
  213. package/dist/providers/openai/batch.js +181 -0
  214. package/dist/providers/openai/batch.js.map +1 -0
  215. package/dist/providers/openai/build-request-body.d.ts +25 -0
  216. package/dist/providers/openai/build-request-body.d.ts.map +1 -0
  217. package/dist/providers/openai/build-request-body.js +66 -0
  218. package/dist/providers/openai/build-request-body.js.map +1 -0
  219. package/dist/providers/openai/build-structured-body.d.ts +16 -0
  220. package/dist/providers/openai/build-structured-body.d.ts.map +1 -0
  221. package/dist/providers/openai/build-structured-body.js +47 -0
  222. package/dist/providers/openai/build-structured-body.js.map +1 -0
  223. package/dist/providers/openai/embeddings.d.ts +6 -0
  224. package/dist/providers/openai/embeddings.d.ts.map +1 -0
  225. package/dist/providers/openai/embeddings.js +61 -0
  226. package/dist/providers/openai/embeddings.js.map +1 -0
  227. package/dist/providers/openai/files.d.ts +16 -0
  228. package/dist/providers/openai/files.d.ts.map +1 -0
  229. package/dist/providers/openai/files.js +80 -0
  230. package/dist/providers/openai/files.js.map +1 -0
  231. package/dist/providers/openai/images.d.ts +6 -0
  232. package/dist/providers/openai/images.d.ts.map +1 -0
  233. package/dist/providers/openai/images.js +55 -0
  234. package/dist/providers/openai/images.js.map +1 -0
  235. package/dist/providers/openai/maps/finish-reason-map.d.ts +21 -0
  236. package/dist/providers/openai/maps/finish-reason-map.d.ts.map +1 -0
  237. package/dist/providers/openai/maps/finish-reason-map.js +56 -0
  238. package/dist/providers/openai/maps/finish-reason-map.js.map +1 -0
  239. package/dist/providers/openai/maps/media-map.d.ts +25 -0
  240. package/dist/providers/openai/maps/media-map.d.ts.map +1 -0
  241. package/dist/providers/openai/maps/media-map.js +53 -0
  242. package/dist/providers/openai/maps/media-map.js.map +1 -0
  243. package/dist/providers/openai/maps/message-map.d.ts +21 -0
  244. package/dist/providers/openai/maps/message-map.d.ts.map +1 -0
  245. package/dist/providers/openai/maps/message-map.js +128 -0
  246. package/dist/providers/openai/maps/message-map.js.map +1 -0
  247. package/dist/providers/openai/maps/tool-choice-map.d.ts +14 -0
  248. package/dist/providers/openai/maps/tool-choice-map.d.ts.map +1 -0
  249. package/dist/providers/openai/maps/tool-choice-map.js +27 -0
  250. package/dist/providers/openai/maps/tool-choice-map.js.map +1 -0
  251. package/dist/providers/openai/maps/tool-map.d.ts +16 -0
  252. package/dist/providers/openai/maps/tool-map.d.ts.map +1 -0
  253. package/dist/providers/openai/maps/tool-map.js +34 -0
  254. package/dist/providers/openai/maps/tool-map.js.map +1 -0
  255. package/dist/providers/openai/moderation.d.ts +6 -0
  256. package/dist/providers/openai/moderation.d.ts.map +1 -0
  257. package/dist/providers/openai/moderation.js +26 -0
  258. package/dist/providers/openai/moderation.js.map +1 -0
  259. package/dist/providers/openai/openai.d.ts +103 -0
  260. package/dist/providers/openai/openai.d.ts.map +1 -0
  261. package/dist/providers/openai/openai.js +385 -0
  262. package/dist/providers/openai/openai.js.map +1 -0
  263. package/dist/providers/openai/parse-response.d.ts +21 -0
  264. package/dist/providers/openai/parse-response.d.ts.map +1 -0
  265. package/dist/providers/openai/parse-response.js +114 -0
  266. package/dist/providers/openai/parse-response.js.map +1 -0
  267. package/dist/providers/openai/rate-limits.d.ts +4 -0
  268. package/dist/providers/openai/rate-limits.d.ts.map +1 -0
  269. package/dist/providers/openai/rate-limits.js +47 -0
  270. package/dist/providers/openai/rate-limits.js.map +1 -0
  271. package/dist/providers/openai/stream-events.d.ts +13 -0
  272. package/dist/providers/openai/stream-events.d.ts.map +1 -0
  273. package/dist/providers/openai/stream-events.js +79 -0
  274. package/dist/providers/openai/stream-events.js.map +1 -0
  275. package/dist/providers/openai/structured-mode-resolver.d.ts +3 -0
  276. package/dist/providers/openai/structured-mode-resolver.d.ts.map +1 -0
  277. package/dist/providers/openai/structured-mode-resolver.js +41 -0
  278. package/dist/providers/openai/structured-mode-resolver.js.map +1 -0
  279. package/dist/providers/provider.d.ts +55 -0
  280. package/dist/providers/provider.d.ts.map +1 -0
  281. package/dist/providers/provider.js +73 -0
  282. package/dist/providers/provider.js.map +1 -0
  283. package/dist/providers/registry.d.ts +10 -0
  284. package/dist/providers/registry.d.ts.map +1 -0
  285. package/dist/providers/registry.js +27 -0
  286. package/dist/providers/registry.js.map +1 -0
  287. package/dist/providers/support/media.d.ts +16 -0
  288. package/dist/providers/support/media.d.ts.map +1 -0
  289. package/dist/providers/support/media.js +26 -0
  290. package/dist/providers/support/media.js.map +1 -0
  291. package/dist/schema/index.d.ts +114 -0
  292. package/dist/schema/index.d.ts.map +1 -0
  293. package/dist/schema/index.js +192 -0
  294. package/dist/schema/index.js.map +1 -0
  295. package/dist/streaming/events.d.ts +90 -0
  296. package/dist/streaming/events.d.ts.map +1 -0
  297. package/dist/streaming/events.js +152 -0
  298. package/dist/streaming/events.js.map +1 -0
  299. package/dist/streaming/sse.d.ts +17 -0
  300. package/dist/streaming/sse.d.ts.map +1 -0
  301. package/dist/streaming/sse.js +50 -0
  302. package/dist/streaming/sse.js.map +1 -0
  303. package/dist/structured/extract.d.ts +23 -0
  304. package/dist/structured/extract.d.ts.map +1 -0
  305. package/dist/structured/extract.js +43 -0
  306. package/dist/structured/extract.js.map +1 -0
  307. package/dist/structured/from-text.d.ts +16 -0
  308. package/dist/structured/from-text.d.ts.map +1 -0
  309. package/dist/structured/from-text.js +27 -0
  310. package/dist/structured/from-text.js.map +1 -0
  311. package/dist/structured/pending-request.d.ts +28 -0
  312. package/dist/structured/pending-request.d.ts.map +1 -0
  313. package/dist/structured/pending-request.js +48 -0
  314. package/dist/structured/pending-request.js.map +1 -0
  315. package/dist/structured/request.d.ts +28 -0
  316. package/dist/structured/request.d.ts.map +1 -0
  317. package/dist/structured/request.js +31 -0
  318. package/dist/structured/request.js.map +1 -0
  319. package/dist/structured/response.d.ts +44 -0
  320. package/dist/structured/response.d.ts.map +1 -0
  321. package/dist/structured/response.js +49 -0
  322. package/dist/structured/response.js.map +1 -0
  323. package/dist/text/pending-request.d.ts +77 -0
  324. package/dist/text/pending-request.d.ts.map +1 -0
  325. package/dist/text/pending-request.js +189 -0
  326. package/dist/text/pending-request.js.map +1 -0
  327. package/dist/text/request.d.ts +62 -0
  328. package/dist/text/request.d.ts.map +1 -0
  329. package/dist/text/request.js +117 -0
  330. package/dist/text/request.js.map +1 -0
  331. package/dist/text/response-builder.d.ts +16 -0
  332. package/dist/text/response-builder.d.ts.map +1 -0
  333. package/dist/text/response-builder.js +52 -0
  334. package/dist/text/response-builder.js.map +1 -0
  335. package/dist/text/response.d.ts +36 -0
  336. package/dist/text/response.d.ts.map +1 -0
  337. package/dist/text/response.js +40 -0
  338. package/dist/text/response.js.map +1 -0
  339. package/dist/text/step.d.ts +41 -0
  340. package/dist/text/step.d.ts.map +1 -0
  341. package/dist/text/step.js +46 -0
  342. package/dist/text/step.js.map +1 -0
  343. package/dist/tool.d.ts +34 -0
  344. package/dist/tool.d.ts.map +1 -0
  345. package/dist/tool.js +86 -0
  346. package/dist/tool.js.map +1 -0
  347. package/dist/value-objects/artifact.d.ts +14 -0
  348. package/dist/value-objects/artifact.d.ts.map +1 -0
  349. package/dist/value-objects/artifact.js +32 -0
  350. package/dist/value-objects/artifact.js.map +1 -0
  351. package/dist/value-objects/embedding.d.ts +24 -0
  352. package/dist/value-objects/embedding.d.ts.map +1 -0
  353. package/dist/value-objects/embedding.js +29 -0
  354. package/dist/value-objects/embedding.js.map +1 -0
  355. package/dist/value-objects/embeddings-usage.d.ts +16 -0
  356. package/dist/value-objects/embeddings-usage.d.ts.map +1 -0
  357. package/dist/value-objects/embeddings-usage.js +19 -0
  358. package/dist/value-objects/embeddings-usage.js.map +1 -0
  359. package/dist/value-objects/generated-audio.d.ts +20 -0
  360. package/dist/value-objects/generated-audio.d.ts.map +1 -0
  361. package/dist/value-objects/generated-audio.js +23 -0
  362. package/dist/value-objects/generated-audio.js.map +1 -0
  363. package/dist/value-objects/generated-image.d.ts +36 -0
  364. package/dist/value-objects/generated-image.d.ts.map +1 -0
  365. package/dist/value-objects/generated-image.js +35 -0
  366. package/dist/value-objects/generated-image.js.map +1 -0
  367. package/dist/value-objects/index.d.ts +13 -0
  368. package/dist/value-objects/index.d.ts.map +1 -0
  369. package/dist/value-objects/index.js +10 -0
  370. package/dist/value-objects/index.js.map +1 -0
  371. package/dist/value-objects/media/audio.d.ts +8 -0
  372. package/dist/value-objects/media/audio.d.ts.map +1 -0
  373. package/dist/value-objects/media/audio.js +9 -0
  374. package/dist/value-objects/media/audio.js.map +1 -0
  375. package/dist/value-objects/media/document.d.ts +44 -0
  376. package/dist/value-objects/media/document.d.ts.map +1 -0
  377. package/dist/value-objects/media/document.js +75 -0
  378. package/dist/value-objects/media/document.js.map +1 -0
  379. package/dist/value-objects/media/image.d.ts +13 -0
  380. package/dist/value-objects/media/image.d.ts.map +1 -0
  381. package/dist/value-objects/media/image.js +14 -0
  382. package/dist/value-objects/media/image.js.map +1 -0
  383. package/dist/value-objects/media/media.d.ts +119 -0
  384. package/dist/value-objects/media/media.d.ts.map +1 -0
  385. package/dist/value-objects/media/media.js +267 -0
  386. package/dist/value-objects/media/media.js.map +1 -0
  387. package/dist/value-objects/media/part.d.ts +25 -0
  388. package/dist/value-objects/media/part.d.ts.map +1 -0
  389. package/dist/value-objects/media/part.js +41 -0
  390. package/dist/value-objects/media/part.js.map +1 -0
  391. package/dist/value-objects/media/text.d.ts +24 -0
  392. package/dist/value-objects/media/text.d.ts.map +1 -0
  393. package/dist/value-objects/media/text.js +33 -0
  394. package/dist/value-objects/media/text.js.map +1 -0
  395. package/dist/value-objects/media/video.d.ts +7 -0
  396. package/dist/value-objects/media/video.d.ts.map +1 -0
  397. package/dist/value-objects/media/video.js +8 -0
  398. package/dist/value-objects/media/video.js.map +1 -0
  399. package/dist/value-objects/messages/assistant-message.d.ts +26 -0
  400. package/dist/value-objects/messages/assistant-message.d.ts.map +1 -0
  401. package/dist/value-objects/messages/assistant-message.js +37 -0
  402. package/dist/value-objects/messages/assistant-message.js.map +1 -0
  403. package/dist/value-objects/messages/index.d.ts +27 -0
  404. package/dist/value-objects/messages/index.d.ts.map +1 -0
  405. package/dist/value-objects/messages/index.js +32 -0
  406. package/dist/value-objects/messages/index.js.map +1 -0
  407. package/dist/value-objects/messages/system-message.d.ts +9 -0
  408. package/dist/value-objects/messages/system-message.d.ts.map +1 -0
  409. package/dist/value-objects/messages/system-message.js +17 -0
  410. package/dist/value-objects/messages/system-message.js.map +1 -0
  411. package/dist/value-objects/messages/tool-result-message.d.ts +14 -0
  412. package/dist/value-objects/messages/tool-result-message.d.ts.map +1 -0
  413. package/dist/value-objects/messages/tool-result-message.js +26 -0
  414. package/dist/value-objects/messages/tool-result-message.js.map +1 -0
  415. package/dist/value-objects/messages/user-message.d.ts +47 -0
  416. package/dist/value-objects/messages/user-message.d.ts.map +1 -0
  417. package/dist/value-objects/messages/user-message.js +87 -0
  418. package/dist/value-objects/messages/user-message.js.map +1 -0
  419. package/dist/value-objects/meta.d.ts +12 -0
  420. package/dist/value-objects/meta.d.ts.map +1 -0
  421. package/dist/value-objects/meta.js +28 -0
  422. package/dist/value-objects/meta.js.map +1 -0
  423. package/dist/value-objects/moderation-result.d.ts +20 -0
  424. package/dist/value-objects/moderation-result.d.ts.map +1 -0
  425. package/dist/value-objects/moderation-result.js +64 -0
  426. package/dist/value-objects/moderation-result.js.map +1 -0
  427. package/dist/value-objects/provider-rate-limit.d.ts +11 -0
  428. package/dist/value-objects/provider-rate-limit.d.ts.map +1 -0
  429. package/dist/value-objects/provider-rate-limit.js +34 -0
  430. package/dist/value-objects/provider-rate-limit.js.map +1 -0
  431. package/dist/value-objects/provider-tool.d.ts +19 -0
  432. package/dist/value-objects/provider-tool.d.ts.map +1 -0
  433. package/dist/value-objects/provider-tool.js +31 -0
  434. package/dist/value-objects/provider-tool.js.map +1 -0
  435. package/dist/value-objects/tool-call.d.ts +29 -0
  436. package/dist/value-objects/tool-call.d.ts.map +1 -0
  437. package/dist/value-objects/tool-call.js +112 -0
  438. package/dist/value-objects/tool-call.js.map +1 -0
  439. package/dist/value-objects/tool-result.d.ts +25 -0
  440. package/dist/value-objects/tool-result.d.ts.map +1 -0
  441. package/dist/value-objects/tool-result.js +45 -0
  442. package/dist/value-objects/tool-result.js.map +1 -0
  443. package/dist/value-objects/usage.d.ts +13 -0
  444. package/dist/value-objects/usage.d.ts.map +1 -0
  445. package/dist/value-objects/usage.js +31 -0
  446. package/dist/value-objects/usage.js.map +1 -0
  447. package/package.json +46 -0
@@ -0,0 +1,385 @@
1
+ import { randomUUID } from 'node:crypto';
2
+ import { canonicalJson, isJsonObject } from '../../json.js';
3
+ import { PrismError } from '../../errors.js';
4
+ import { structuredFromTextResponse } from '../../structured/from-text.js';
5
+ import { buildStructuredBody } from './build-structured-body.js';
6
+ import { buildEmbeddingsBody, parseEmbeddingsResponse } from './embeddings.js';
7
+ import { buildImagesBody, parseImagesResponse } from './images.js';
8
+ import { buildModerationBody, parseModerationResponse } from './moderation.js';
9
+ import { buildSpeechBody, buildTranscriptionForm, parseSpeechResponse, parseTranscriptionResponse, } from './audio.js';
10
+ import { DownloadFileRequest, UploadFileRequest } from '../../files/request.js';
11
+ import { buildListQuery, buildUploadForm, parseDeleteResponse, parseFileData, parseFileListResponse, } from './files.js';
12
+ import { RetrieveBatchRequest } from '../../batch/request.js';
13
+ import { buildBatchBody, buildBatchInputFile, buildBatchListQuery, parseBatchJob, parseBatchListResponse, parseBatchResults, } from './batch.js';
14
+ import { fetchTransport, fetchStreamTransport } from '../../http/transport.js';
15
+ import { fetchBinaryTransport } from '../../http/transport.js';
16
+ import { sseData } from '../../streaming/sse.js';
17
+ import { mapStreamEvent } from './stream-events.js';
18
+ import { Provider } from '../provider.js';
19
+ import { buildRequestBody } from './build-request-body.js';
20
+ import { parseTextResponse } from './parse-response.js';
21
+ import { parseRateLimits } from './rate-limits.js';
22
+ const DEFAULT_URL = 'https://api.openai.com/v1';
23
+ /**
24
+ * The OpenAI provider, Responses API only.
25
+ *
26
+ * Configuration is explicit first and environment second, so a test can pin
27
+ * every field and a deployment can set none of them.
28
+ */
29
+ export class OpenAI extends Provider {
30
+ providerName = 'OpenAI';
31
+ apiKey;
32
+ url;
33
+ organization;
34
+ project;
35
+ apiFormat;
36
+ #transport;
37
+ #streamTransport;
38
+ #binaryTransport;
39
+ constructor(config = {}) {
40
+ super();
41
+ this.apiKey = config.apiKey ?? readEnv('OPENAI_API_KEY') ?? '';
42
+ this.url = config.url ?? readEnv('OPENAI_URL') ?? DEFAULT_URL;
43
+ this.organization = config.organization ?? readEnv('OPENAI_ORGANIZATION') ?? null;
44
+ this.project = config.project ?? readEnv('OPENAI_PROJECT') ?? null;
45
+ this.apiFormat = config.apiFormat ?? readEnv('OPENAI_API_FORMAT') ?? 'responses';
46
+ this.#transport = config.transport ?? fetchTransport;
47
+ this.#streamTransport = config.streamTransport ?? fetchStreamTransport;
48
+ this.#binaryTransport = config.binaryTransport ?? fetchBinaryTransport;
49
+ }
50
+ async text(request) {
51
+ return this.#send('text', request, buildRequestBody(request));
52
+ }
53
+ async structured(request) {
54
+ // The response is parsed by the TEXT parser and then given its structured
55
+ // reading, so finish reasons, token-limit failures, usage and rate limits
56
+ // behave identically on both paths by construction.
57
+ return structuredFromTextResponse(await this.#send('structured', request, buildStructuredBody(request)));
58
+ }
59
+ /**
60
+ * The same generation, delivered as it arrives.
61
+ *
62
+ * `stream: true` is set here rather than in `buildRequestBody`, so the body a
63
+ * streamed call sends is provably the non-streamed body plus one key — the
64
+ * two cannot drift apart into different requests that happen to look alike.
65
+ */
66
+ async *stream(request) {
67
+ const response = await this.#streamTransport({
68
+ url: `${this.url.replace(/\/+$/, '')}/responses`,
69
+ method: 'POST',
70
+ headers: { ...this.headers(), Accept: 'text/event-stream' },
71
+ body: canonicalJson({ ...buildRequestBody(request), stream: true }),
72
+ clientOptions: request.clientOptions(),
73
+ });
74
+ if (response.status >= 400) {
75
+ // Read the body before failing: an error response is not an event stream,
76
+ // and the message inside it is the only useful thing about this call.
77
+ throw PrismError.providerResponseError(describeHttpFailure(this.providerName, response.status, await collectJson(response.chunks)), { httpStatus: response.status });
78
+ }
79
+ for await (const payload of sseData(response.chunks)) {
80
+ const event = mapStreamEvent(parsePayload(payload));
81
+ if (event !== null) {
82
+ yield event;
83
+ }
84
+ }
85
+ }
86
+ /**
87
+ * Vectors for one or more inputs.
88
+ *
89
+ * A different endpoint from the rest of this provider, so it does not go
90
+ * through `#send`: that helper posts to `/responses` and parses a text reply,
91
+ * and bending it to also mean `/embeddings` would make both harder to read
92
+ * than two short methods.
93
+ */
94
+ async embeddings(request) {
95
+ const response = await this.#transport({
96
+ url: `${this.url.replace(/\/+$/, '')}/embeddings`,
97
+ method: 'POST',
98
+ headers: this.headers(),
99
+ body: canonicalJson(buildEmbeddingsBody(request)),
100
+ clientOptions: request.clientOptions(),
101
+ });
102
+ if (response.status >= 400) {
103
+ throw PrismError.providerResponseError(describeHttpFailure(this.providerName, response.status, response.body), {
104
+ httpStatus: response.status,
105
+ responseBody: response.rawBody,
106
+ });
107
+ }
108
+ return parseEmbeddingsResponse(response.body);
109
+ }
110
+ async images(request) {
111
+ const response = await this.#transport({
112
+ url: `${this.url.replace(/\/+$/, '')}/images/generations`,
113
+ method: 'POST',
114
+ headers: this.headers(),
115
+ body: canonicalJson(buildImagesBody(request)),
116
+ clientOptions: request.clientOptions(),
117
+ });
118
+ if (response.status >= 400) {
119
+ throw PrismError.providerResponseError(describeHttpFailure(this.providerName, response.status, response.body), {
120
+ httpStatus: response.status,
121
+ responseBody: response.rawBody,
122
+ });
123
+ }
124
+ return parseImagesResponse(response.body, request.model());
125
+ }
126
+ async moderation(request) {
127
+ const response = await this.#transport({
128
+ url: `${this.url.replace(/\/+$/, '')}/moderations`,
129
+ method: 'POST',
130
+ headers: this.headers(),
131
+ body: canonicalJson(buildModerationBody(request)),
132
+ clientOptions: request.clientOptions(),
133
+ });
134
+ if (response.status >= 400) {
135
+ throw PrismError.providerResponseError(describeHttpFailure(this.providerName, response.status, response.body), {
136
+ httpStatus: response.status,
137
+ responseBody: response.rawBody,
138
+ });
139
+ }
140
+ return parseModerationResponse(response.body, request.model());
141
+ }
142
+ async textToSpeech(request) {
143
+ const response = await this.#binaryTransport({
144
+ url: `${this.url.replace(/\/+$/, '')}/audio/speech`,
145
+ method: 'POST',
146
+ headers: this.headers(),
147
+ body: canonicalJson(buildSpeechBody(request)),
148
+ clientOptions: request.clientOptions(),
149
+ });
150
+ if (response.status >= 400) {
151
+ // An error is JSON even on an endpoint that answers with audio, so the
152
+ // bytes are decoded as text to get the message out.
153
+ throw PrismError.providerResponseError(describeHttpFailure(this.providerName, response.status, decodeJson(response.bytes)), { httpStatus: response.status });
154
+ }
155
+ return parseSpeechResponse(response.bytes, response.headers['content-type'] ?? null, request);
156
+ }
157
+ async speechToText(request) {
158
+ const response = await this.#binaryTransport({
159
+ url: `${this.url.replace(/\/+$/, '')}/audio/transcriptions`,
160
+ method: 'POST',
161
+ headers: this.headers(),
162
+ body: '',
163
+ multipart: buildTranscriptionForm(request),
164
+ clientOptions: request.clientOptions(),
165
+ });
166
+ const decoded = decodeJson(response.bytes);
167
+ if (response.status >= 400) {
168
+ throw PrismError.providerResponseError(describeHttpFailure(this.providerName, response.status, decoded), {
169
+ httpStatus: response.status,
170
+ });
171
+ }
172
+ return parseTranscriptionResponse(decoded);
173
+ }
174
+ async uploadFile(request) {
175
+ return parseFileData(await this.#file('POST', 'files', request.clientOptions(), buildUploadForm(request)));
176
+ }
177
+ async listFiles(request) {
178
+ const query = new URLSearchParams(buildListQuery(request)).toString();
179
+ const path = query === '' ? 'files' : `files?${query}`;
180
+ return parseFileListResponse(await this.#file('GET', path, request.clientOptions()));
181
+ }
182
+ async getFileMetadata(request) {
183
+ return parseFileData(await this.#file('GET', `files/${encodeURIComponent(request.fileId)}`, request.clientOptions()));
184
+ }
185
+ async deleteFile(request) {
186
+ return parseDeleteResponse(await this.#file('DELETE', `files/${encodeURIComponent(request.fileId)}`, request.clientOptions()));
187
+ }
188
+ /**
189
+ * The file's bytes, returned WITHOUT being decoded.
190
+ *
191
+ * The only file operation that does not go through `#file`, because that
192
+ * helper's job is to decode JSON and this one must not: a downloaded PDF run
193
+ * through a JSON parse comes back as null, and the failure would look like an
194
+ * empty file rather than a decode that should never have happened.
195
+ */
196
+ async downloadFile(request) {
197
+ const response = await this.#binaryTransport({
198
+ url: `${this.url.replace(/\/+$/, '')}/files/${encodeURIComponent(request.fileId)}/content`,
199
+ method: 'GET',
200
+ headers: this.headers(),
201
+ body: '',
202
+ clientOptions: request.clientOptions(),
203
+ });
204
+ if (response.status >= 400) {
205
+ throw PrismError.providerResponseError(describeHttpFailure(this.providerName, response.status, decodeJson(response.bytes)), { httpStatus: response.status });
206
+ }
207
+ return response.bytes;
208
+ }
209
+ async batch(request) {
210
+ // Either/or, checked here rather than on the request, because it is a
211
+ // PROVIDER rule: a provider that accepted inline items would have nothing
212
+ // to complain about.
213
+ if (request.inputFileId !== null && request.items !== null) {
214
+ throw PrismError.providerResponseError('OpenAI batch takes either an input file id or items, not both.');
215
+ }
216
+ if (request.inputFileId === null && request.items === null) {
217
+ throw PrismError.providerResponseError('OpenAI batch needs either an input file id or items.');
218
+ }
219
+ const inputFileId = request.inputFileId ??
220
+ (await this.uploadFile(new UploadFileRequest({
221
+ providerKey: 'openai',
222
+ filename: `prism-batch-${randomUUID()}.jsonl`,
223
+ content: new TextEncoder().encode(buildBatchInputFile(request.items ?? [])),
224
+ mimeType: 'application/jsonl',
225
+ clientOptions: request.clientOptions(),
226
+ // `purpose` MUST be `batch` for a file the batch endpoint will
227
+ // read, so it is set here rather than inherited from whatever the
228
+ // caller passed for the batch itself.
229
+ providerOptions: { purpose: 'batch' },
230
+ }))).id;
231
+ return parseBatchJob(await this.#file('POST', 'batches', request.clientOptions(), undefined, buildBatchBody(inputFileId, request.providerOptions('completion_window'))));
232
+ }
233
+ async retrieveBatch(request) {
234
+ return parseBatchJob(await this.#file('GET', `batches/${encodeURIComponent(request.batchId)}`, request.clientOptions()));
235
+ }
236
+ async listBatches(request) {
237
+ const query = new URLSearchParams(buildBatchListQuery(request)).toString();
238
+ const path = query === '' ? 'batches' : `batches?${query}`;
239
+ return parseBatchListResponse(await this.#file('GET', path, request.clientOptions()));
240
+ }
241
+ async cancelBatch(request) {
242
+ return parseBatchJob(await this.#file('POST', `batches/${encodeURIComponent(request.batchId)}/cancel`, request.clientOptions()));
243
+ }
244
+ /**
245
+ * Every result in a batch, from the files it wrote.
246
+ *
247
+ * BOTH files are read, output and error, because a batch where some requests
248
+ * succeeded and others failed writes to both — reading only the output file
249
+ * would silently drop every failure and report a clean run.
250
+ *
251
+ * An unfinished batch has neither, and answers with an empty list rather than
252
+ * an error: nothing went wrong, there is just nothing yet.
253
+ */
254
+ async getBatchResults(request) {
255
+ const batch = await this.retrieveBatch(new RetrieveBatchRequest({
256
+ providerKey: request.providerKey(),
257
+ batchId: request.batchId,
258
+ clientOptions: request.clientOptions(),
259
+ providerOptions: request.providerOptions(),
260
+ }));
261
+ const fileIds = [batch.outputFileId, batch.errorFileId].filter((id) => id !== null);
262
+ const items = [];
263
+ for (const fileId of fileIds) {
264
+ const bytes = await this.downloadFile(new DownloadFileRequest({
265
+ providerKey: request.providerKey(),
266
+ fileId,
267
+ clientOptions: request.clientOptions(),
268
+ }));
269
+ items.push(...parseBatchResults(new TextDecoder().decode(bytes)));
270
+ }
271
+ return items;
272
+ }
273
+ /**
274
+ * One round trip for every file and batch operation that answers with JSON.
275
+ *
276
+ * They go through the BINARY transport rather than the JSON one, even though
277
+ * their replies are JSON, because upload sends multipart and only that
278
+ * transport carries a form. Routing them together keeps their headers, error
279
+ * mapping and url building decided once — the alternative was upload on one
280
+ * transport and its siblings on another, which is how two paths that should
281
+ * agree stop agreeing.
282
+ *
283
+ * Batch joined them rather than growing a second copy: it has the same
284
+ * `error`-inside-a-200 behaviour, and creating a batch uploads a file.
285
+ */
286
+ async #file(method, path, clientOptions, multipart, jsonBody) {
287
+ const response = await this.#binaryTransport({
288
+ url: `${this.url.replace(/\/+$/, '')}/${path}`,
289
+ method,
290
+ headers: this.headers(),
291
+ body: jsonBody === undefined ? '' : canonicalJson(jsonBody),
292
+ ...(multipart === undefined ? {} : { multipart }),
293
+ clientOptions,
294
+ });
295
+ const decoded = decodeJson(response.bytes);
296
+ if (response.status >= 400) {
297
+ throw PrismError.providerResponseError(describeHttpFailure(this.providerName, response.status, decoded), {
298
+ httpStatus: response.status,
299
+ });
300
+ }
301
+ // OpenAI reports some file failures with a 200 and an `error` object, so
302
+ // the status alone is not the verdict.
303
+ if (isJsonObject(decoded) && isJsonObject(decoded.error)) {
304
+ throw PrismError.providerResponseError(describeHttpFailure(this.providerName, response.status, decoded));
305
+ }
306
+ return decoded;
307
+ }
308
+ async #send(action, request, body) {
309
+ if (this.apiFormat !== 'responses') {
310
+ throw PrismError.unsupportedProviderAction(`${action} in the ${this.apiFormat} api format`, this.providerName);
311
+ }
312
+ const response = await this.#transport({
313
+ url: `${this.url.replace(/\/+$/, '')}/responses`,
314
+ method: 'POST',
315
+ headers: this.headers(),
316
+ body: canonicalJson(body),
317
+ clientOptions: request.clientOptions(),
318
+ });
319
+ if (response.status >= 400) {
320
+ throw PrismError.providerResponseError(describeHttpFailure(this.providerName, response.status, response.body), {
321
+ httpStatus: response.status,
322
+ responseBody: response.rawBody,
323
+ });
324
+ }
325
+ return parseTextResponse(request, response.body, { rateLimits: parseRateLimits(response.headers) });
326
+ }
327
+ /** Optional headers are OMITTED rather than sent empty when unconfigured. */
328
+ headers() {
329
+ const headers = { 'Content-Type': 'application/json' };
330
+ if (this.organization !== null && this.organization !== '') {
331
+ headers['OpenAI-Organization'] = this.organization;
332
+ }
333
+ if (this.project !== null && this.project !== '') {
334
+ headers['OpenAI-Project'] = this.project;
335
+ }
336
+ if (this.apiKey !== '') {
337
+ headers.Authorization = `Bearer ${this.apiKey}`;
338
+ }
339
+ return headers;
340
+ }
341
+ }
342
+ function readEnv(name) {
343
+ const value = process.env[name];
344
+ return value === undefined || value === '' ? undefined : value;
345
+ }
346
+ function describeHttpFailure(provider, status, body) {
347
+ const error = typeof body === 'object' && body !== null && 'error' in body ? body.error : undefined;
348
+ const detail = typeof error === 'object' && error !== null && 'message' in error
349
+ ? String(error.message)
350
+ : 'Unknown error';
351
+ return `${provider} error [${status}]: ${detail}`;
352
+ }
353
+ /** An SSE payload that is not JSON is skipped rather than fatal — see mapStreamEvent. */
354
+ function parsePayload(payload) {
355
+ try {
356
+ const parsed = JSON.parse(payload);
357
+ return isJsonObject(parsed) ? parsed : {};
358
+ }
359
+ catch {
360
+ return {};
361
+ }
362
+ }
363
+ /** Drain a non-stream body so an HTTP failure can still report what it said. */
364
+ async function collectJson(chunks) {
365
+ let text = '';
366
+ for await (const chunk of chunks) {
367
+ text += chunk;
368
+ }
369
+ try {
370
+ return JSON.parse(text);
371
+ }
372
+ catch {
373
+ return null;
374
+ }
375
+ }
376
+ /** An audio endpoint answers with bytes; its ERRORS are still JSON. */
377
+ function decodeJson(bytes) {
378
+ try {
379
+ return JSON.parse(Buffer.from(bytes).toString('utf8'));
380
+ }
381
+ catch {
382
+ return null;
383
+ }
384
+ }
385
+ //# sourceMappingURL=openai.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"openai.js","sourceRoot":"","sources":["../../../src/providers/openai/openai.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,21 @@
1
+ import type { TextRequest } from '../../text/request.js';
2
+ import type { TextResponse } from '../../text/response.js';
3
+ import type { ProviderRateLimit } from '../../value-objects/provider-rate-limit.js';
4
+ export interface ParseTextResponseOptions {
5
+ rateLimits?: readonly ProviderRateLimit[];
6
+ }
7
+ /**
8
+ * Turn a raw OpenAI Responses payload into a `TextResponse`.
9
+ *
10
+ * No HTTP happens here, so a stored payload can be replayed through exactly the
11
+ * code path a live call takes.
12
+ *
13
+ * @throws PrismError code `provider_response_error` when the payload is missing,
14
+ * empty, or carries an `error`.
15
+ * @throws PrismError code `max_tokens_exceeded` when generation was cut short.
16
+ * @throws PrismError code `tool_loop_not_supported` when the response finished
17
+ * on tool calls. Running tools is outside this port's slice, and returning a
18
+ * half-formed response would be worse than saying so.
19
+ */
20
+ export declare function parseTextResponse(request: TextRequest, rawBody: unknown, options?: ParseTextResponseOptions): TextResponse;
21
+ //# sourceMappingURL=parse-response.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"parse-response.d.ts","sourceRoot":"","sources":["../../../src/providers/openai/parse-response.ts"],"names":[],"mappings":"AAaA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AAEzD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,wBAAwB,CAAC;AAG3D,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,4CAA4C,CAAC;AAKpF,MAAM,WAAW,wBAAwB;IACvC,UAAU,CAAC,EAAE,SAAS,iBAAiB,EAAE,CAAC;CAC3C;AAED;;;;;;;;;;;;GAYG;AACH,wBAAgB,iBAAiB,CAC/B,OAAO,EAAE,WAAW,EACpB,OAAO,EAAE,OAAO,EAChB,OAAO,GAAE,wBAA6B,GACrC,YAAY,CAmBd"}
@@ -0,0 +1,114 @@
1
+ import { isJsonObject } from '../../json.js';
2
+ import { PrismError } from '../../errors.js';
3
+ import { FinishReason } from '../../enums.js';
4
+ import { isTruthyByReferenceRules, readArray, readNullableNumber, readNumber, readObject, readString, whereNotNull, } from '../../internal/filters.js';
5
+ import { ResponseBuilder } from '../../text/response-builder.js';
6
+ import { TextStep } from '../../text/step.js';
7
+ import { Meta } from '../../value-objects/meta.js';
8
+ import { ToolCall } from '../../value-objects/tool-call.js';
9
+ import { Usage } from '../../value-objects/usage.js';
10
+ import { lastOutputItem, mapFinishReason } from './maps/finish-reason-map.js';
11
+ /**
12
+ * Turn a raw OpenAI Responses payload into a `TextResponse`.
13
+ *
14
+ * No HTTP happens here, so a stored payload can be replayed through exactly the
15
+ * code path a live call takes.
16
+ *
17
+ * @throws PrismError code `provider_response_error` when the payload is missing,
18
+ * empty, or carries an `error`.
19
+ * @throws PrismError code `max_tokens_exceeded` when generation was cut short.
20
+ * @throws PrismError code `tool_loop_not_supported` when the response finished
21
+ * on tool calls. Running tools is outside this port's slice, and returning a
22
+ * half-formed response would be worse than saying so.
23
+ */
24
+ export function parseTextResponse(request, rawBody, options = {}) {
25
+ const data = validateResponse(rawBody);
26
+ const finishReason = mapFinishReason(data);
27
+ if (finishReason === FinishReason.ToolCalls) {
28
+ throw PrismError.toolLoopNotSupported();
29
+ }
30
+ if (finishReason === FinishReason.Length) {
31
+ const last = lastOutputItem(data) ?? {};
32
+ throw PrismError.maxTokensExceeded(readString(last.status, ''), readString(last.type, ''));
33
+ }
34
+ const builder = new ResponseBuilder();
35
+ builder.addStep(buildStep(data, request, finishReason, options.rateLimits ?? []));
36
+ return builder.toResponse();
37
+ }
38
+ function validateResponse(rawBody) {
39
+ if (!isJsonObject(rawBody) || Object.keys(rawBody).length === 0) {
40
+ throw PrismError.providerResponseError('OpenAI returned an empty or non-object response body.');
41
+ }
42
+ if (isTruthyByReferenceRules(rawBody.error)) {
43
+ const error = readObject(rawBody.error) ?? {};
44
+ throw PrismError.providerResponseError(`OpenAI error [${readString(error.type, 'unknown')}]: ${readString(error.message, 'unknown')}`);
45
+ }
46
+ return rawBody;
47
+ }
48
+ function buildStep(data, request, finishReason, rateLimits) {
49
+ const output = readArray(data.output);
50
+ const usage = readObject(data.usage) ?? {};
51
+ const inputTokenDetails = readObject(usage.input_tokens_details) ?? {};
52
+ const outputTokenDetails = readObject(usage.output_tokens_details) ?? {};
53
+ return new TextStep({
54
+ text: outputText(data),
55
+ finishReason,
56
+ toolCalls: mapToolCalls(output),
57
+ usage: new Usage(
58
+ // Prompt tokens EXCLUDE the cached ones — they are reported separately so
59
+ // a caller can see what the cache saved instead of paying for it twice.
60
+ readNumber(usage.input_tokens, 0) - readNumber(inputTokenDetails.cached_tokens, 0), readNumber(usage.output_tokens, 0), null, readNullableNumber(inputTokenDetails.cached_tokens), readNullableNumber(outputTokenDetails.reasoning_tokens)),
61
+ meta: new Meta(readString(data.id, ''), readString(data.model, ''), rateLimits, typeof data.service_tier === 'string' ? data.service_tier : null),
62
+ messages: request.messages(),
63
+ systemPrompts: request.systemPrompts(),
64
+ additionalContent: whereNotNull({
65
+ searchQueries: webSearchValues(output, 'search', 'query'),
66
+ openPageUrls: webSearchValues(output, 'open_page', 'url'),
67
+ findInPagePatterns: webSearchValues(output, 'find_in_page', 'pattern'),
68
+ reasoningSummaries: reasoningSummaries(output),
69
+ }),
70
+ raw: data,
71
+ });
72
+ }
73
+ /** The reply text: the first content part of the last output item, or nothing. */
74
+ function outputText(data) {
75
+ const content = lastOutputItem(data)?.content;
76
+ if (!Array.isArray(content)) {
77
+ return '';
78
+ }
79
+ const first = content[0];
80
+ return isJsonObject(first) ? readString(first.text, '') : '';
81
+ }
82
+ function mapToolCalls(output) {
83
+ return output
84
+ .filter(isJsonObject)
85
+ .filter((item) => item.type === 'function_call')
86
+ .map((item) => new ToolCall(readString(item.id, ''), readString(item.name, ''), typeof item.arguments === 'string' || isJsonObject(item.arguments) ? item.arguments : '', typeof item.call_id === 'string' ? item.call_id : null));
87
+ }
88
+ /**
89
+ * The distinct, non-empty values of one field across every web-search call of a
90
+ * given action, or `null` when there were none — the not-null filter above then
91
+ * drops the key rather than reporting an empty search.
92
+ */
93
+ function webSearchValues(output, actionType, field) {
94
+ const values = output
95
+ .filter(isJsonObject)
96
+ .filter((item) => item.type === 'web_search_call')
97
+ .map((item) => readObject(item.action) ?? {})
98
+ .filter((action) => action.type === actionType)
99
+ .map((action) => action[field])
100
+ .filter((value) => typeof value === 'string' && value !== '');
101
+ const unique = [...new Set(values)];
102
+ return unique.length > 0 ? unique : null;
103
+ }
104
+ /** Always present, even when empty — the reference does not drop this one. */
105
+ function reasoningSummaries(output) {
106
+ return output
107
+ .filter(isJsonObject)
108
+ .filter((item) => item.type === 'reasoning')
109
+ .flatMap((item) => readArray(item.summary))
110
+ .filter(isJsonObject)
111
+ .map((summary) => summary.text)
112
+ .filter((text) => typeof text === 'string' && text !== '');
113
+ }
114
+ //# sourceMappingURL=parse-response.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"parse-response.js","sourceRoot":"","sources":["../../../src/providers/openai/parse-response.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ import { ProviderRateLimit } from '../../value-objects/provider-rate-limit.js';
2
+ /** Read OpenAI's `x-ratelimit-*` headers into rate-limit value objects. */
3
+ export declare function parseRateLimits(headers: Readonly<Record<string, string>>): ProviderRateLimit[];
4
+ //# sourceMappingURL=rate-limits.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rate-limits.d.ts","sourceRoot":"","sources":["../../../src/providers/openai/rate-limits.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,4CAA4C,CAAC;AAK/E,2EAA2E;AAC3E,wBAAgB,eAAe,CAAC,OAAO,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,GAAG,iBAAiB,EAAE,CA2B9F"}
@@ -0,0 +1,47 @@
1
+ import { ProviderRateLimit } from '../../value-objects/provider-rate-limit.js';
2
+ import { foldHeaderNames } from '../../http/header-names.js';
3
+ const BUCKETS = ['requests', 'tokens'];
4
+ /** Read OpenAI's `x-ratelimit-*` headers into rate-limit value objects. */
5
+ export function parseRateLimits(headers) {
6
+ const rateLimits = [];
7
+ // Folded first: HTTP field names are case-insensitive (RFC 9110 §5.1) and
8
+ // these are exact key lookups, so a title-casing gateway used to erase every
9
+ // rate limit here without a word.
10
+ const found = foldHeaderNames(headers);
11
+ for (const bucket of BUCKETS) {
12
+ const limit = found[`x-ratelimit-limit-${bucket}`];
13
+ const remaining = found[`x-ratelimit-remaining-${bucket}`];
14
+ if (limit === undefined || remaining === undefined) {
15
+ continue;
16
+ }
17
+ rateLimits.push(new ProviderRateLimit(bucket, toInteger(limit), toInteger(remaining), parseResetTime(found[`x-ratelimit-reset-${bucket}`])));
18
+ }
19
+ return rateLimits;
20
+ }
21
+ /**
22
+ * OpenAI reports a reset as a DURATION from now (`6ms`, `30s`, `5m`, `1h`), not
23
+ * as an instant. Anything else is reported as no known reset rather than as an
24
+ * invalid date.
25
+ */
26
+ function parseResetTime(resetTime, now = Date.now()) {
27
+ if (resetTime === undefined || resetTime === '' || resetTime === '0') {
28
+ return null;
29
+ }
30
+ const match = /^(\d+)(ms|s|m|h)$/.exec(resetTime);
31
+ if (match === null) {
32
+ return null;
33
+ }
34
+ const value = Number.parseInt(match[1] ?? '0', 10);
35
+ const milliseconds = {
36
+ ms: 1,
37
+ s: 1_000,
38
+ m: 60_000,
39
+ h: 3_600_000,
40
+ }[match[2]];
41
+ return new Date(now + value * milliseconds);
42
+ }
43
+ function toInteger(value) {
44
+ const parsed = Number.parseInt(value, 10);
45
+ return Number.isNaN(parsed) ? 0 : parsed;
46
+ }
47
+ //# sourceMappingURL=rate-limits.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rate-limits.js","sourceRoot":"","sources":["../../../src/providers/openai/rate-limits.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,4CAA4C,CAAC;AAC/E,OAAO,EAAE,eAAe,EAAE,MAAM,4BAA4B,CAAC;AAE7D,MAAM,OAAO,GAAG,CAAC,UAAU,EAAE,QAAQ,CAAU,CAAC;AAEhD,2EAA2E;AAC3E,MAAM,UAAU,eAAe,CAAC,OAAyC;IACvE,MAAM,UAAU,GAAwB,EAAE,CAAC;IAE3C,0EAA0E;IAC1E,6EAA6E;IAC7E,kCAAkC;IAClC,MAAM,KAAK,GAAG,eAAe,CAAC,OAAO,CAAC,CAAC;IAEvC,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;QAC7B,MAAM,KAAK,GAAG,KAAK,CAAC,qBAAqB,MAAM,EAAE,CAAC,CAAC;QACnD,MAAM,SAAS,GAAG,KAAK,CAAC,yBAAyB,MAAM,EAAE,CAAC,CAAC;QAE3D,IAAI,KAAK,KAAK,SAAS,IAAI,SAAS,KAAK,SAAS,EAAE,CAAC;YACnD,SAAS;QACX,CAAC;QAED,UAAU,CAAC,IAAI,CACb,IAAI,iBAAiB,CACnB,MAAM,EACN,SAAS,CAAC,KAAK,CAAC,EAChB,SAAS,CAAC,SAAS,CAAC,EACpB,cAAc,CAAC,KAAK,CAAC,qBAAqB,MAAM,EAAE,CAAC,CAAC,CACrD,CACF,CAAC;IACJ,CAAC;IAED,OAAO,UAAU,CAAC;AACpB,CAAC;AAED;;;;GAIG;AACH,SAAS,cAAc,CAAC,SAA6B,EAAE,MAAc,IAAI,CAAC,GAAG,EAAE;IAC7E,IAAI,SAAS,KAAK,SAAS,IAAI,SAAS,KAAK,EAAE,IAAI,SAAS,KAAK,GAAG,EAAE,CAAC;QACrE,OAAO,IAAI,CAAC;IACd,CAAC;IAED,MAAM,KAAK,GAAG,mBAAmB,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;IAElD,IAAI,KAAK,KAAK,IAAI,EAAE,CAAC;QACnB,OAAO,IAAI,CAAC;IACd,CAAC;IAED,MAAM,KAAK,GAAG,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,GAAG,EAAE,EAAE,CAAC,CAAC;IAEnD,MAAM,YAAY,GAAG;QACnB,EAAE,EAAE,CAAC;QACL,CAAC,EAAE,KAAK;QACR,CAAC,EAAE,MAAM;QACT,CAAC,EAAE,SAAS;KACb,CAAC,KAAK,CAAC,CAAC,CAA2B,CAAC,CAAC;IAEtC,OAAO,IAAI,IAAI,CAAC,GAAG,GAAG,KAAK,GAAG,YAAY,CAAC,CAAC;AAC9C,CAAC;AAED,SAAS,SAAS,CAAC,KAAa;IAC9B,MAAM,MAAM,GAAG,MAAM,CAAC,QAAQ,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;IAE1C,OAAO,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC;AAC3C,CAAC"}
@@ -0,0 +1,13 @@
1
+ import { type JsonObject } from '../../json.js';
2
+ import type { StreamEvent } from '../../streaming/events.js';
3
+ /**
4
+ * Map one OpenAI Responses SSE payload to zero or one port events.
5
+ *
6
+ * RETURNS NULL FOR ANYTHING IT DOES NOT RECOGNISE, on purpose. OpenAI adds
7
+ * event types without warning, and a mapper that threw on an unknown `type`
8
+ * would turn a provider's additive change into an outage for every consumer.
9
+ * A stream that silently ignores an event it cannot use still delivers the
10
+ * text; one that throws delivers nothing.
11
+ */
12
+ export declare function mapStreamEvent(payload: JsonObject): StreamEvent | null;
13
+ //# sourceMappingURL=stream-events.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stream-events.d.ts","sourceRoot":"","sources":["../../../src/providers/openai/stream-events.ts"],"names":[],"mappings":"AAAA,OAAO,EAAgB,KAAK,UAAU,EAAE,MAAM,eAAe,CAAC;AAI9D,OAAO,KAAK,EACV,WAAW,EAAC,MAAM,2BAA2B,CAAC;AAWhD;;;;;;;;GAQG;AACH,wBAAgB,cAAc,CAAC,OAAO,EAAE,UAAU,GAAG,WAAW,GAAG,IAAI,CAiCtE"}