@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,142 @@
1
+ import { isJsonObject } from '../../json.js';
2
+ import { FinishReason } from '../../enums.js';
3
+ import { readArray, readNumber, readObject, readString } from '../../internal/filters.js';
4
+ import { StreamEndEvent, StreamStartEvent, TextCompleteEvent, TextDeltaEvent, TextStartEvent, ToolCallEvent, } from '../../streaming/events.js';
5
+ import { ToolCall } from '../../value-objects/tool-call.js';
6
+ import { Usage } from '../../value-objects/usage.js';
7
+ /**
8
+ * Mistral's chat-completions stream, which needs MEMORY.
9
+ *
10
+ * Every chunk is a `chat.completion.chunk` carrying a `delta` and nothing else
11
+ * — no message id after the first chunk, no accumulated text, and tool-call
12
+ * arguments arrive SPLIT ACROSS CHUNKS keyed only by an index. So a chunk
13
+ * cannot be mapped in isolation, the way an OpenAI Responses event can.
14
+ *
15
+ * That puts this closer to the Anthropic mapper than to the OpenAI one, for a
16
+ * different provider-side reason, and it carries the same consequence: one
17
+ * instance per stream. A shared mapper would let two concurrent generations
18
+ * read each other's accumulated text, which surfaces under load and looks like
19
+ * the model hallucinating.
20
+ */
21
+ export class MistralStreamMapper {
22
+ #messageId = '';
23
+ #model = '';
24
+ #started = false;
25
+ #textStarted = false;
26
+ #text = '';
27
+ #usage = null;
28
+ /** Tool-call fragments being assembled, keyed by the index Mistral sends. */
29
+ #toolCalls = new Map();
30
+ /**
31
+ * The events for one chunk — zero, one, or several.
32
+ *
33
+ * SEVERAL, unlike the other mappers' one-or-none, because a single Mistral
34
+ * chunk can both start the stream and carry the first token, and the final
35
+ * chunk can complete the text, flush a tool call and end the stream at once.
36
+ * Returning only the first would drop the rest silently.
37
+ */
38
+ map(payload) {
39
+ const events = [];
40
+ if (!this.#started) {
41
+ this.#started = true;
42
+ this.#messageId = readString(payload.id, '');
43
+ this.#model = readString(payload.model, '');
44
+ events.push(new StreamStartEvent(this.#model));
45
+ }
46
+ const usage = readObject(payload.usage);
47
+ if (usage !== null) {
48
+ // Usage arrives on the LAST chunk on Mistral, not alongside the deltas,
49
+ // so it is stored rather than emitted and read again at stream end.
50
+ this.#usage = new Usage(readNumber(usage.prompt_tokens, 0), readNumber(usage.completion_tokens, 0));
51
+ }
52
+ const choice = readArray(payload.choices)[0];
53
+ if (!isJsonObject(choice)) {
54
+ return events;
55
+ }
56
+ const delta = readObject(choice.delta) ?? {};
57
+ const text = deltaText(delta);
58
+ if (text !== '') {
59
+ if (!this.#textStarted) {
60
+ this.#textStarted = true;
61
+ events.push(new TextStartEvent(this.#messageId));
62
+ }
63
+ this.#text += text;
64
+ events.push(new TextDeltaEvent(text, this.#messageId));
65
+ }
66
+ this.#accumulateToolCalls(delta);
67
+ const finishReason = readString(choice.finish_reason, '');
68
+ if (finishReason !== '') {
69
+ if (this.#textStarted) {
70
+ events.push(new TextCompleteEvent(this.#text, this.#messageId));
71
+ }
72
+ for (const call of this.#toolCalls.values()) {
73
+ // Flushed at the END, once the arguments are whole. Emitting a tool
74
+ // call while its JSON is still arriving hands a consumer a fragment
75
+ // that will not parse.
76
+ events.push(new ToolCallEvent(new ToolCall(call.id, call.name, call.args === '' ? '{}' : call.args), this.#messageId));
77
+ }
78
+ // Usage stays NULL when Mistral reported none, rather than becoming a
79
+ // zeroed Usage — zero tokens claims the generation was free. The event's
80
+ // third parameter is the event's own id, not the message id; passing the
81
+ // message id there compiles fine and quietly renames every end event.
82
+ events.push(new StreamEndEvent(mapStreamFinishReason(finishReason), this.#usage));
83
+ }
84
+ return events;
85
+ }
86
+ /**
87
+ * Tool-call fragments, merged by index.
88
+ *
89
+ * The id and name arrive on the FIRST fragment only and the arguments arrive
90
+ * a few characters at a time, so each field is written only when the chunk
91
+ * actually carries it — overwriting the name with an empty string on the
92
+ * second fragment is how a tool call ends up nameless.
93
+ */
94
+ #accumulateToolCalls(delta) {
95
+ for (const raw of readArray(delta.tool_calls)) {
96
+ if (!isJsonObject(raw)) {
97
+ continue;
98
+ }
99
+ const index = readNumber(raw.index, 0);
100
+ const fn = readObject(raw.function) ?? {};
101
+ const existing = this.#toolCalls.get(index) ?? { id: '', name: '', args: '' };
102
+ this.#toolCalls.set(index, {
103
+ id: readString(raw.id, '') || existing.id,
104
+ name: readString(fn.name, '') || existing.name,
105
+ args: existing.args + readString(fn.arguments, ''),
106
+ });
107
+ }
108
+ }
109
+ }
110
+ /**
111
+ * A delta's text, from either shape.
112
+ *
113
+ * `content` is a string on ordinary models and an array of typed chunks on
114
+ * reasoning ones. An array stringified is `[object Object]`, which reaches the
115
+ * consumer as tokens the model never produced.
116
+ */
117
+ function deltaText(delta) {
118
+ if (typeof delta.content === 'string') {
119
+ return delta.content;
120
+ }
121
+ return readArray(delta.content)
122
+ .filter(isJsonObject)
123
+ .filter((chunk) => chunk.type === 'text')
124
+ .map((chunk) => readString(chunk.text, ''))
125
+ .join('');
126
+ }
127
+ function mapStreamFinishReason(reason) {
128
+ switch (reason) {
129
+ case 'stop':
130
+ return FinishReason.Stop;
131
+ case 'tool_calls':
132
+ return FinishReason.ToolCalls;
133
+ case 'length':
134
+ case 'model_length':
135
+ return FinishReason.Length;
136
+ case 'content_filter':
137
+ return FinishReason.ContentFilter;
138
+ default:
139
+ return FinishReason.Unknown;
140
+ }
141
+ }
142
+ //# sourceMappingURL=stream-events.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stream-events.js","sourceRoot":"","sources":["../../../src/providers/mistral/stream-events.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,16 @@
1
+ import { type JsonObject } from '../../json.js';
2
+ import type { SpeechToTextRequest, TextToSpeechRequest } from '../../audio/request.js';
3
+ import { AudioResponse, AudioTextResponse } from '../../audio/response.js';
4
+ import type { MultipartBody } from '../../http/transport.js';
5
+ export declare function buildSpeechBody(request: TextToSpeechRequest): JsonObject;
6
+ /**
7
+ * Speech comes back as BYTES, not JSON.
8
+ *
9
+ * So the format has to come from the request or the content type — the payload
10
+ * itself carries no field naming it, and guessing `mp3` would mislabel every
11
+ * caller who asked for `wav`.
12
+ */
13
+ export declare function parseSpeechResponse(bytes: Uint8Array, contentType: string | null, request: TextToSpeechRequest): AudioResponse;
14
+ export declare function buildTranscriptionForm(request: SpeechToTextRequest): MultipartBody;
15
+ export declare function parseTranscriptionResponse(rawBody: unknown): AudioTextResponse;
16
+ //# sourceMappingURL=audio.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"audio.d.ts","sourceRoot":"","sources":["../../../src/providers/openai/audio.ts"],"names":[],"mappings":"AAAA,OAAO,EAAgB,KAAK,UAAU,EAAE,MAAM,eAAe,CAAC;AAE9D,OAAO,KAAK,EAAE,mBAAmB,EAAE,mBAAmB,EAAE,MAAM,wBAAwB,CAAC;AACvF,OAAO,EAAE,aAAa,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAC;AAG3E,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,yBAAyB,CAAC;AAG7D,wBAAgB,eAAe,CAAC,OAAO,EAAE,mBAAmB,GAAG,UAAU,CAcxE;AAED;;;;;;GAMG;AACH,wBAAgB,mBAAmB,CACjC,KAAK,EAAE,UAAU,EACjB,WAAW,EAAE,MAAM,GAAG,IAAI,EAC1B,OAAO,EAAE,mBAAmB,GAC3B,aAAa,CAOf;AAED,wBAAgB,sBAAsB,CAAC,OAAO,EAAE,mBAAmB,GAAG,aAAa,CAoClF;AAED,wBAAgB,0BAA0B,CAAC,OAAO,EAAE,OAAO,GAAG,iBAAiB,CAgB9E"}
@@ -0,0 +1,105 @@
1
+ import { isJsonObject } from '../../json.js';
2
+ import { PrismError } from '../../errors.js';
3
+ import { AudioResponse, AudioTextResponse } from '../../audio/response.js';
4
+ import { GeneratedAudio } from '../../value-objects/generated-audio.js';
5
+ import { Usage } from '../../value-objects/usage.js';
6
+ import { whereNotNull } from '../../internal/filters.js';
7
+ export function buildSpeechBody(request) {
8
+ return {
9
+ model: request.model(),
10
+ input: request.input(),
11
+ // `alloy` is OpenAI's own default and the endpoint REQUIRES a voice, so
12
+ // omitting it fails the call. Defaulted here rather than in the builder, so
13
+ // a provider that has different voices can choose its own.
14
+ voice: request.voice() ?? 'alloy',
15
+ ...whereNotNull({
16
+ response_format: request.providerOptions('response_format'),
17
+ speed: request.providerOptions('speed'),
18
+ instructions: request.providerOptions('instructions'),
19
+ }),
20
+ };
21
+ }
22
+ /**
23
+ * Speech comes back as BYTES, not JSON.
24
+ *
25
+ * So the format has to come from the request or the content type — the payload
26
+ * itself carries no field naming it, and guessing `mp3` would mislabel every
27
+ * caller who asked for `wav`.
28
+ */
29
+ export function parseSpeechResponse(bytes, contentType, request) {
30
+ const format = request.providerOptions('response_format');
31
+ const type = typeof format === 'string' ? format : 'mp3';
32
+ return new AudioResponse(new GeneratedAudio(Buffer.from(bytes).toString('base64'), type, contentType ?? `audio/${type}`));
33
+ }
34
+ export function buildTranscriptionForm(request) {
35
+ const audio = request.input();
36
+ const bytes = audio.rawContent();
37
+ if (bytes === null) {
38
+ // The payload holds only a url, and this port does not fetch implicitly.
39
+ throw PrismError.noAudioContent();
40
+ }
41
+ const mimeType = audio.mimeType();
42
+ return {
43
+ fields: {
44
+ model: request.model(),
45
+ ...stringFields({
46
+ language: request.providerOptions('language'),
47
+ prompt: request.providerOptions('prompt'),
48
+ response_format: request.providerOptions('response_format'),
49
+ temperature: request.providerOptions('temperature'),
50
+ }),
51
+ },
52
+ files: [
53
+ {
54
+ field: 'file',
55
+ // A filename is REQUIRED: OpenAI infers the audio format from the
56
+ // extension, and an unnamed part is rejected as an unsupported format
57
+ // rather than as a missing name.
58
+ filename: audio.filename() ?? `audio.${extensionFor(mimeType)}`,
59
+ bytes,
60
+ // The key is OMITTED rather than set to undefined: this tsconfig runs
61
+ // exactOptionalPropertyTypes, where an explicit undefined is a
62
+ // different thing from an absent key — and the transport reads absence.
63
+ ...(mimeType === null ? {} : { contentType: mimeType }),
64
+ },
65
+ ],
66
+ };
67
+ }
68
+ export function parseTranscriptionResponse(rawBody) {
69
+ if (!isJsonObject(rawBody)) {
70
+ throw PrismError.providerResponseError('OpenAI returned an empty or non-object transcription response.');
71
+ }
72
+ const usage = isJsonObject(rawBody.usage) ? rawBody.usage : null;
73
+ return new AudioTextResponse(typeof rawBody.text === 'string' ? rawBody.text : '',
74
+ // Null, not zero. Transcription is billed by audio duration on most
75
+ // providers and they report no tokens at all; zero would claim it was free.
76
+ usage === null
77
+ ? null
78
+ : new Usage(readNumber(usage.input_tokens ?? usage.prompt_tokens), readNumber(usage.output_tokens)), rawBody);
79
+ }
80
+ function stringFields(source) {
81
+ const fields = {};
82
+ for (const [key, value] of Object.entries(source)) {
83
+ if (value !== null && value !== undefined) {
84
+ // Multipart carries strings; a number field has to be spelled out rather
85
+ // than left for the form encoder to stringify however it likes.
86
+ fields[key] = String(value);
87
+ }
88
+ }
89
+ return fields;
90
+ }
91
+ const EXTENSIONS = {
92
+ 'audio/mpeg': 'mp3',
93
+ 'audio/mp4': 'm4a',
94
+ 'audio/wav': 'wav',
95
+ 'audio/webm': 'webm',
96
+ 'audio/ogg': 'ogg',
97
+ 'audio/flac': 'flac',
98
+ };
99
+ function extensionFor(mimeType) {
100
+ return mimeType === null ? 'mp3' : (EXTENSIONS[mimeType] ?? 'mp3');
101
+ }
102
+ function readNumber(value) {
103
+ return typeof value === 'number' ? value : 0;
104
+ }
105
+ //# sourceMappingURL=audio.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"audio.js","sourceRoot":"","sources":["../../../src/providers/openai/audio.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,29 @@
1
+ import { type JsonObject } from '../../json.js';
2
+ import { BatchJob, BatchListResult, BatchResultItem, BatchStatus } from '../../batch/batch-job.js';
3
+ import type { BatchRequestItem, ListBatchesRequest } from '../../batch/request.js';
4
+ /** The JSONL body OpenAI's batch endpoint expects, one request per line. */
5
+ export declare function buildBatchInputFile(items: readonly BatchRequestItem[]): string;
6
+ export declare function buildBatchBody(inputFileId: string, completionWindow: unknown): JsonObject;
7
+ export declare function buildBatchListQuery(request: ListBatchesRequest): Record<string, string>;
8
+ /**
9
+ * A wire status, or a refusal.
10
+ *
11
+ * Matching the reference, an unrecognised status THROWS rather than mapping to
12
+ * a plausible member. It reads harsh for a polling loop, and it is still right:
13
+ * a new status means the provider changed something about the lifecycle, and
14
+ * quietly calling it `InProgress` would leave a caller waiting forever on a
15
+ * batch that had already stopped.
16
+ */
17
+ export declare function batchStatusFromValue(value: unknown): BatchStatus;
18
+ export declare function parseBatchJob(rawBody: unknown): BatchJob;
19
+ export declare function parseBatchListResponse(rawBody: unknown): BatchListResult;
20
+ /**
21
+ * The results file, one JSON object per line.
22
+ *
23
+ * A line that will not parse is SKIPPED rather than fatal. The file is written
24
+ * by the provider a request at a time, and one malformed record should not cost
25
+ * a caller the other nine hundred.
26
+ */
27
+ export declare function parseBatchResults(body: string): BatchResultItem[];
28
+ export declare function parseBatchResultItem(data: JsonObject): BatchResultItem;
29
+ //# sourceMappingURL=batch.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"batch.d.ts","sourceRoot":"","sources":["../../../src/providers/openai/batch.ts"],"names":[],"mappings":"AAAA,OAAO,EAA+B,KAAK,UAAU,EAAE,MAAM,eAAe,CAAC;AAE7E,OAAO,EACL,QAAQ,EAER,eAAe,EACf,eAAe,EAEf,WAAW,EACZ,MAAM,0BAA0B,CAAC;AAElC,OAAO,KAAK,EAAE,gBAAgB,EAAE,kBAAkB,EAAE,MAAM,wBAAwB,CAAC;AAInF,4EAA4E;AAC5E,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,SAAS,gBAAgB,EAAE,GAAG,MAAM,CAW9E;AAED,wBAAgB,cAAc,CAAC,WAAW,EAAE,MAAM,EAAE,gBAAgB,EAAE,OAAO,GAAG,UAAU,CASzF;AAED,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,kBAAkB,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAYvF;AAID;;;;;;;;GAQG;AACH,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,OAAO,GAAG,WAAW,CAQhE;AAED,wBAAgB,aAAa,CAAC,OAAO,EAAE,OAAO,GAAG,QAAQ,CAqCxD;AAED,wBAAgB,sBAAsB,CAAC,OAAO,EAAE,OAAO,GAAG,eAAe,CAYxE;AAED;;;;;;GAMG;AACH,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,GAAG,eAAe,EAAE,CAwBjE;AAED,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,UAAU,GAAG,eAAe,CA+BtE"}
@@ -0,0 +1,181 @@
1
+ import { canonicalJson, isJsonObject } from '../../json.js';
2
+ import { PrismError } from '../../errors.js';
3
+ import { BatchJob, BatchJobRequestCounts, BatchListResult, BatchResultItem, BatchResultStatus, BatchStatus, } from '../../batch/batch-job.js';
4
+ import { Usage } from '../../value-objects/usage.js';
5
+ import { buildRequestBody } from './build-request-body.js';
6
+ /** The JSONL body OpenAI's batch endpoint expects, one request per line. */
7
+ export function buildBatchInputFile(items) {
8
+ return items
9
+ .map((item) => canonicalJson({
10
+ custom_id: item.customId,
11
+ method: 'POST',
12
+ url: '/v1/responses',
13
+ body: buildRequestBody(item.request),
14
+ }))
15
+ .join('\n');
16
+ }
17
+ export function buildBatchBody(inputFileId, completionWindow) {
18
+ return {
19
+ input_file_id: inputFileId,
20
+ endpoint: '/v1/responses',
21
+ // Required by the endpoint, and `24h` is OpenAI's only supported window
22
+ // today — so a default here beats an error naming a field the caller never
23
+ // knew existed.
24
+ completion_window: typeof completionWindow === 'string' ? completionWindow : '24h',
25
+ };
26
+ }
27
+ export function buildBatchListQuery(request) {
28
+ const query = {};
29
+ if (request.limit !== null) {
30
+ query.limit = String(request.limit);
31
+ }
32
+ if (request.afterId !== null) {
33
+ query.after = request.afterId;
34
+ }
35
+ return query;
36
+ }
37
+ const STATUSES = Object.values(BatchStatus);
38
+ /**
39
+ * A wire status, or a refusal.
40
+ *
41
+ * Matching the reference, an unrecognised status THROWS rather than mapping to
42
+ * a plausible member. It reads harsh for a polling loop, and it is still right:
43
+ * a new status means the provider changed something about the lifecycle, and
44
+ * quietly calling it `InProgress` would leave a caller waiting forever on a
45
+ * batch that had already stopped.
46
+ */
47
+ export function batchStatusFromValue(value) {
48
+ const status = STATUSES.find((known) => known === value);
49
+ if (status === undefined) {
50
+ throw PrismError.providerResponseError(`Unknown OpenAI batch status: ${String(value)}`);
51
+ }
52
+ return status;
53
+ }
54
+ export function parseBatchJob(rawBody) {
55
+ if (!isJsonObject(rawBody)) {
56
+ throw PrismError.providerResponseError('OpenAI returned an empty or non-object batch response.');
57
+ }
58
+ const counts = isJsonObject(rawBody.request_counts) ? rawBody.request_counts : {};
59
+ const total = readNumber(counts.total);
60
+ const succeeded = readNumber(counts.completed);
61
+ const failed = readNumber(counts.failed);
62
+ return new BatchJob(readString(rawBody.id) ?? '', batchStatusFromValue(rawBody.status), new BatchJobRequestCounts(
63
+ // OpenAI does not report an in-flight count, so it is derived. Clamped at
64
+ // zero: a partial response — total missing while completed is not —
65
+ // produces a negative, and a negative number of in-flight requests is not
66
+ // a state anything can be in.
67
+ Math.max(0, total - succeeded - failed), succeeded, failed,
68
+ // OpenAI reports neither, so they stay zero rather than being guessed.
69
+ 0, 0, total), readTimestamp(rawBody.created_at), readTimestamp(rawBody.expires_at),
70
+ // OpenAI's field is `completed_at`; the port's is `endedAt`, matching the
71
+ // reference, because a cancelled batch also ends.
72
+ readTimestamp(rawBody.completed_at), readString(rawBody.results_url), readString(rawBody.input_file_id), readString(rawBody.output_file_id), readString(rawBody.error_file_id), readErrors(rawBody.errors));
73
+ }
74
+ export function parseBatchListResponse(rawBody) {
75
+ if (!isJsonObject(rawBody)) {
76
+ return new BatchListResult([]);
77
+ }
78
+ const data = Array.isArray(rawBody.data) ? rawBody.data : [];
79
+ return new BatchListResult(data.map((entry) => parseBatchJob(entry)), rawBody.has_more === true, readString(rawBody.last_id));
80
+ }
81
+ /**
82
+ * The results file, one JSON object per line.
83
+ *
84
+ * A line that will not parse is SKIPPED rather than fatal. The file is written
85
+ * by the provider a request at a time, and one malformed record should not cost
86
+ * a caller the other nine hundred.
87
+ */
88
+ export function parseBatchResults(body) {
89
+ const items = [];
90
+ for (const line of body.split('\n')) {
91
+ const trimmed = line.trim();
92
+ if (trimmed === '') {
93
+ continue;
94
+ }
95
+ let decoded;
96
+ try {
97
+ decoded = JSON.parse(trimmed);
98
+ }
99
+ catch {
100
+ continue;
101
+ }
102
+ if (isJsonObject(decoded)) {
103
+ items.push(parseBatchResultItem(decoded));
104
+ }
105
+ }
106
+ return items;
107
+ }
108
+ export function parseBatchResultItem(data) {
109
+ const customId = readString(data.custom_id) ?? '';
110
+ const error = isJsonObject(data.error) ? data.error : null;
111
+ if (error !== null) {
112
+ const code = readString(error.code) ?? '';
113
+ return new BatchResultItem(customId,
114
+ // `batch_expired` is its own outcome, not an error: the request was never
115
+ // run, so reporting it as a failure would blame the request.
116
+ code === 'batch_expired' ? BatchResultStatus.Expired : BatchResultStatus.Errored, null, null, null, null, code, readString(error.message));
117
+ }
118
+ const body = isJsonObject(data.response) && isJsonObject(data.response.body) ? data.response.body : {};
119
+ return new BatchResultItem(customId, BatchResultStatus.Succeeded, extractText(body), extractUsage(body), readString(body.id), readString(body.model));
120
+ }
121
+ /**
122
+ * The assistant's text, from either API shape.
123
+ *
124
+ * Responses output is searched from the END: a turn that used tools has the
125
+ * message last, and taking the first would return whatever preceded the tool
126
+ * call.
127
+ */
128
+ function extractText(body) {
129
+ const output = Array.isArray(body.output) ? body.output : [];
130
+ for (const item of [...output].reverse()) {
131
+ if (!isJsonObject(item) || item.type !== 'message') {
132
+ continue;
133
+ }
134
+ const content = Array.isArray(item.content) ? item.content : [];
135
+ for (const part of content) {
136
+ if (isJsonObject(part) && part.type === 'output_text' && typeof part.text === 'string') {
137
+ return part.text;
138
+ }
139
+ }
140
+ }
141
+ // The chat-completions shape, for a batch submitted against that endpoint.
142
+ const choices = Array.isArray(body.choices) ? body.choices : [];
143
+ const first = choices[0];
144
+ if (isJsonObject(first) && isJsonObject(first.message) && typeof first.message.content === 'string') {
145
+ return first.message.content;
146
+ }
147
+ return '';
148
+ }
149
+ function extractUsage(body) {
150
+ const usage = isJsonObject(body.usage) ? body.usage : {};
151
+ const inputDetails = isJsonObject(usage.input_tokens_details) ? usage.input_tokens_details : {};
152
+ const outputDetails = isJsonObject(usage.output_tokens_details) ? usage.output_tokens_details : {};
153
+ return new Usage(readNumber(usage.input_tokens ?? usage.prompt_tokens), readNumber(usage.output_tokens ?? usage.completion_tokens),
154
+ // Cache WRITE is not reported here. `cached_tokens` is what was READ from
155
+ // the cache — the two are billed differently, and putting one in the
156
+ // other's slot misreports the cost in the direction that flatters it.
157
+ null, typeof inputDetails.cached_tokens === 'number' ? inputDetails.cached_tokens : null, typeof outputDetails.reasoning_tokens === 'number' ? outputDetails.reasoning_tokens : null);
158
+ }
159
+ function readErrors(value) {
160
+ const data = isJsonObject(value) && Array.isArray(value.data) ? value.data : [];
161
+ return data.filter(isJsonObject).map((entry) => ({
162
+ code: readString(entry.code) ?? '',
163
+ message: readString(entry.message) ?? '',
164
+ line: typeof entry.line === 'number' ? entry.line : null,
165
+ param: readString(entry.param),
166
+ }));
167
+ }
168
+ /** Unix seconds to ISO 8601 in UTC. Same reasoning as `files`. */
169
+ function readTimestamp(value) {
170
+ if (typeof value !== 'number' || !Number.isFinite(value)) {
171
+ return null;
172
+ }
173
+ return new Date(value * 1000).toISOString();
174
+ }
175
+ function readString(value) {
176
+ return typeof value === 'string' && value !== '' ? value : null;
177
+ }
178
+ function readNumber(value) {
179
+ return typeof value === 'number' && Number.isFinite(value) ? value : 0;
180
+ }
181
+ //# sourceMappingURL=batch.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"batch.js","sourceRoot":"","sources":["../../../src/providers/openai/batch.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,25 @@
1
+ import type { JsonObject, JsonValue } from '../../json.js';
2
+ import type { TextRequest } from '../../text/request.js';
3
+ /**
4
+ * Build the OpenAI Responses API request body.
5
+ *
6
+ * Two rules decide every key in here:
7
+ *
8
+ * `model`, `input` and `max_output_tokens` are merged UNCONDITIONALLY. That
9
+ * is why `max_output_tokens` is present as an explicit `null` on a request
10
+ * that never set it — and why modelling "unset" as `undefined` would drop the
11
+ * key and change the bytes.
12
+ *
13
+ * Everything else goes through a NOT-NULL filter. `false` and `0` survive it,
14
+ * so `usingTemperature(0)` is sent and a provider option of `store: false` is
15
+ * sent. Only `null` is dropped.
16
+ *
17
+ * The one place those two rules meet is `tools`: an empty tool list collapses to
18
+ * `null` BEFORE the filter runs, so the key vanishes entirely. An empty array is
19
+ * truthy in JavaScript, so a direct port sends `"tools":[]` — which some models
20
+ * reject outright and which silently changes `tool_choice` defaults on others.
21
+ */
22
+ export declare function buildRequestBody(request: TextRequest): JsonObject;
23
+ /** Provider-native tools are merged in FRONT of the caller's tools. */
24
+ export declare function buildTools(request: TextRequest): JsonValue[];
25
+ //# sourceMappingURL=build-request-body.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"build-request-body.d.ts","sourceRoot":"","sources":["../../../src/providers/openai/build-request-body.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,eAAe,CAAC;AAE3D,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AAKzD;;;;;;;;;;;;;;;;;;GAkBG;AACH,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,WAAW,GAAG,UAAU,CAiCjE;AAED,uEAAuE;AACvE,wBAAgB,UAAU,CAAC,OAAO,EAAE,WAAW,GAAG,SAAS,EAAE,CAY5D"}
@@ -0,0 +1,66 @@
1
+ import { isTruthyByReferenceRules, whereNotNull } from '../../internal/filters.js';
2
+ import { mapMessages } from './maps/message-map.js';
3
+ import { mapToolChoice } from './maps/tool-choice-map.js';
4
+ import { mapTools } from './maps/tool-map.js';
5
+ /**
6
+ * Build the OpenAI Responses API request body.
7
+ *
8
+ * Two rules decide every key in here:
9
+ *
10
+ * `model`, `input` and `max_output_tokens` are merged UNCONDITIONALLY. That
11
+ * is why `max_output_tokens` is present as an explicit `null` on a request
12
+ * that never set it — and why modelling "unset" as `undefined` would drop the
13
+ * key and change the bytes.
14
+ *
15
+ * Everything else goes through a NOT-NULL filter. `false` and `0` survive it,
16
+ * so `usingTemperature(0)` is sent and a provider option of `store: false` is
17
+ * sent. Only `null` is dropped.
18
+ *
19
+ * The one place those two rules meet is `tools`: an empty tool list collapses to
20
+ * `null` BEFORE the filter runs, so the key vanishes entirely. An empty array is
21
+ * truthy in JavaScript, so a direct port sends `"tools":[]` — which some models
22
+ * reject outright and which silently changes `tool_choice` defaults on others.
23
+ */
24
+ export function buildRequestBody(request) {
25
+ const body = {
26
+ model: request.model(),
27
+ input: mapMessages(request.messages(), request.systemPrompts()),
28
+ max_output_tokens: request.maxTokens(),
29
+ };
30
+ const tools = buildTools(request);
31
+ const textVerbosity = request.providerOptions('text_verbosity');
32
+ const optional = {
33
+ temperature: request.temperature(),
34
+ top_p: request.topP(),
35
+ metadata: request.providerOptions('metadata'),
36
+ tools: tools.length > 0 ? tools : null,
37
+ tool_choice: mapToolChoice(request.toolChoice()),
38
+ parallel_tool_calls: request.providerOptions('parallel_tool_calls'),
39
+ previous_response_id: request.providerOptions('previous_response_id'),
40
+ service_tier: request.providerOptions('service_tier'),
41
+ store: request.providerOptions('store'),
42
+ // Gated on truthiness rather than on null, unlike its neighbours: an empty
43
+ // verbosity is not a verbosity.
44
+ text: isTruthyByReferenceRules(textVerbosity) ? { verbosity: textVerbosity } : null,
45
+ truncation: request.providerOptions('truncation'),
46
+ // Asymmetric on purpose. `withReasoning(false)` asks OpenAI for minimal
47
+ // effort; `withReasoning(true)` emits NOTHING, because enabling reasoning is
48
+ // a per-provider setting and the toggle must not override it. An explicit
49
+ // `reasoning` provider option wins over both.
50
+ reasoning: request.providerOptions('reasoning') ?? (request.reasoningEnabled() === false ? { effort: 'minimal' } : null),
51
+ };
52
+ return { ...body, ...whereNotNull(optional) };
53
+ }
54
+ /** Provider-native tools are merged in FRONT of the caller's tools. */
55
+ export function buildTools(request) {
56
+ const tools = mapTools(request.tools());
57
+ const providerTools = request.providerTools();
58
+ if (providerTools.length === 0) {
59
+ return tools;
60
+ }
61
+ return [
62
+ ...providerTools.map((providerTool) => ({ type: providerTool.type, ...providerTool.options })),
63
+ ...tools,
64
+ ];
65
+ }
66
+ //# sourceMappingURL=build-request-body.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"build-request-body.js","sourceRoot":"","sources":["../../../src/providers/openai/build-request-body.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,wBAAwB,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAC;AAEnF,OAAO,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AACpD,OAAO,EAAE,aAAa,EAAE,MAAM,2BAA2B,CAAC;AAC1D,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAE9C;;;;;;;;;;;;;;;;;;GAkBG;AACH,MAAM,UAAU,gBAAgB,CAAC,OAAoB;IACnD,MAAM,IAAI,GAAe;QACvB,KAAK,EAAE,OAAO,CAAC,KAAK,EAAE;QACtB,KAAK,EAAE,WAAW,CAAC,OAAO,CAAC,QAAQ,EAAE,EAAE,OAAO,CAAC,aAAa,EAAE,CAAC;QAC/D,iBAAiB,EAAE,OAAO,CAAC,SAAS,EAAE;KACvC,CAAC;IAEF,MAAM,KAAK,GAAG,UAAU,CAAC,OAAO,CAAC,CAAC;IAClC,MAAM,aAAa,GAAG,OAAO,CAAC,eAAe,CAAC,gBAAgB,CAAC,CAAC;IAEhE,MAAM,QAAQ,GAAiD;QAC7D,WAAW,EAAE,OAAO,CAAC,WAAW,EAAE;QAClC,KAAK,EAAE,OAAO,CAAC,IAAI,EAAE;QACrB,QAAQ,EAAE,OAAO,CAAC,eAAe,CAAC,UAAU,CAAC;QAC7C,KAAK,EAAE,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI;QACtC,WAAW,EAAE,aAAa,CAAC,OAAO,CAAC,UAAU,EAAE,CAAC;QAChD,mBAAmB,EAAE,OAAO,CAAC,eAAe,CAAC,qBAAqB,CAAC;QACnE,oBAAoB,EAAE,OAAO,CAAC,eAAe,CAAC,sBAAsB,CAAC;QACrE,YAAY,EAAE,OAAO,CAAC,eAAe,CAAC,cAAc,CAAC;QACrD,KAAK,EAAE,OAAO,CAAC,eAAe,CAAC,OAAO,CAAC;QACvC,2EAA2E;QAC3E,gCAAgC;QAChC,IAAI,EAAE,wBAAwB,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,aAAa,EAAE,CAAC,CAAC,CAAC,IAAI;QACnF,UAAU,EAAE,OAAO,CAAC,eAAe,CAAC,YAAY,CAAC;QACjD,wEAAwE;QACxE,6EAA6E;QAC7E,0EAA0E;QAC1E,8CAA8C;QAC9C,SAAS,EACP,OAAO,CAAC,eAAe,CAAC,WAAW,CAAC,IAAI,CAAC,OAAO,CAAC,gBAAgB,EAAE,KAAK,KAAK,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;KAChH,CAAC;IAEF,OAAO,EAAE,GAAG,IAAI,EAAE,GAAG,YAAY,CAAC,QAAQ,CAAC,EAAE,CAAC;AAChD,CAAC;AAED,uEAAuE;AACvE,MAAM,UAAU,UAAU,CAAC,OAAoB;IAC7C,MAAM,KAAK,GAAG,QAAQ,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC,CAAC;IACxC,MAAM,aAAa,GAAG,OAAO,CAAC,aAAa,EAAE,CAAC;IAE9C,IAAI,aAAa,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC/B,OAAO,KAAK,CAAC;IACf,CAAC;IAED,OAAO;QACL,GAAG,aAAa,CAAC,GAAG,CAAC,CAAC,YAAY,EAAc,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,YAAY,CAAC,IAAI,EAAE,GAAG,YAAY,CAAC,OAAO,EAAE,CAAC,CAAC;QAC1G,GAAG,KAAK;KACT,CAAC;AACJ,CAAC"}
@@ -0,0 +1,16 @@
1
+ import type { JsonObject } from '../../json.js';
2
+ import type { StructuredRequest } from '../../structured/request.js';
3
+ /**
4
+ * The text body, plus the instruction that makes it structured.
5
+ *
6
+ * Built ON TOP of `buildRequestBody` rather than beside it, so every rule that
7
+ * decides the text body — the unconditional keys, the not-null filter, the
8
+ * empty-tools collapse — applies identically here. A second builder would drift
9
+ * from the first the moment either changed.
10
+ *
11
+ * `Auto` is resolved to a concrete mode against the MODEL, because "auto" is not
12
+ * something OpenAI accepts; somebody has to decide, and doing it here means the
13
+ * decision is inspectable in one place rather than implied by the wire format.
14
+ */
15
+ export declare function buildStructuredBody(request: StructuredRequest): JsonObject;
16
+ //# sourceMappingURL=build-structured-body.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"build-structured-body.d.ts","sourceRoot":"","sources":["../../../src/providers/openai/build-structured-body.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAGhD,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,6BAA6B,CAAC;AAIrE;;;;;;;;;;;GAWG;AACH,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,iBAAiB,GAAG,UAAU,CAa1E"}