@atomic-chat/core 0.13.2 → 0.17.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 (377) hide show
  1. package/README.md +1 -1
  2. package/dist/backend/advisor/advisor.d.ts +8 -7
  3. package/dist/backend/advisor/advisor.js +17 -25
  4. package/dist/backend/advisor/advisor.js.map +1 -1
  5. package/dist/backend/catalog/index.d.ts +4 -2
  6. package/dist/backend/catalog/index.js +4 -2
  7. package/dist/backend/catalog/index.js.map +1 -1
  8. package/dist/backend/catalog/manifest.d.ts +5 -51
  9. package/dist/backend/catalog/manifest.js +5 -93
  10. package/dist/backend/catalog/manifest.js.map +1 -1
  11. package/dist/backend/catalog/upstream-releases-baseline.d.ts +2 -0
  12. package/dist/backend/catalog/upstream-releases-baseline.js +12 -0
  13. package/dist/backend/catalog/upstream-releases-baseline.js.map +1 -0
  14. package/dist/backend/catalog/upstream-releases-baseline.json +101 -0
  15. package/dist/backend/catalog/upstream-releases-catalog.d.ts +54 -0
  16. package/dist/backend/catalog/upstream-releases-catalog.js +148 -0
  17. package/dist/backend/catalog/upstream-releases-catalog.js.map +1 -0
  18. package/dist/backend/catalog/upstream-releases.d.ts +75 -0
  19. package/dist/backend/catalog/upstream-releases.js +155 -0
  20. package/dist/backend/catalog/upstream-releases.js.map +1 -0
  21. package/dist/backend/install/service.d.ts +7 -4
  22. package/dist/backend/install/service.js +4 -4
  23. package/dist/backend/install/service.js.map +1 -1
  24. package/dist/cli/commands/serve.js +10 -28
  25. package/dist/cli/commands/serve.js.map +1 -1
  26. package/dist/cli/main.d.ts +1 -1
  27. package/dist/cli/main.js +0 -1
  28. package/dist/cli/main.js.map +1 -1
  29. package/dist/client/control-client.d.ts +7 -19
  30. package/dist/client/control-client.js +9 -29
  31. package/dist/client/control-client.js.map +1 -1
  32. package/dist/cloud/registry.d.ts +14 -1
  33. package/dist/cloud/registry.js +73 -2
  34. package/dist/cloud/registry.js.map +1 -1
  35. package/dist/config/paths.d.ts +4 -3
  36. package/dist/config/paths.js +15 -14
  37. package/dist/config/paths.js.map +1 -1
  38. package/dist/contracts/diffusion.d.ts +45 -18
  39. package/dist/contracts/diffusion.js +1 -1
  40. package/dist/contracts/diffusion.js.map +1 -1
  41. package/dist/contracts/engines.d.ts +1 -1
  42. package/dist/contracts/engines.js +2 -0
  43. package/dist/contracts/engines.js.map +1 -1
  44. package/dist/contracts/errors.d.ts +1 -3
  45. package/dist/contracts/errors.js +16 -0
  46. package/dist/contracts/errors.js.map +1 -1
  47. package/dist/contracts/events.d.ts +11 -6
  48. package/dist/contracts/index.d.ts +1 -1
  49. package/dist/contracts/index.js +1 -1
  50. package/dist/contracts/index.js.map +1 -1
  51. package/dist/contracts/media.d.ts +186 -0
  52. package/dist/contracts/media.js +55 -0
  53. package/dist/contracts/media.js.map +1 -0
  54. package/dist/contracts/session.d.ts +10 -1
  55. package/dist/contracts/session.js +10 -0
  56. package/dist/contracts/session.js.map +1 -1
  57. package/dist/contracts/settings.d.ts +36 -1
  58. package/dist/contracts/settings.js.map +1 -1
  59. package/dist/core/atomic-core.d.ts +7 -5
  60. package/dist/core/atomic-core.js +1 -0
  61. package/dist/core/atomic-core.js.map +1 -1
  62. package/dist/core/create.js +48 -58
  63. package/dist/core/create.js.map +1 -1
  64. package/dist/core/managed-engines.js +2 -0
  65. package/dist/core/managed-engines.js.map +1 -1
  66. package/dist/core/prism.d.ts +23 -6
  67. package/dist/core/prism.js +45 -0
  68. package/dist/core/prism.js.map +1 -1
  69. package/dist/core/public-server.js +3 -2
  70. package/dist/core/public-server.js.map +1 -1
  71. package/dist/core/types.d.ts +11 -0
  72. package/dist/core/types.js.map +1 -1
  73. package/dist/decision/process.d.ts +4 -0
  74. package/dist/decision/process.js +10 -1
  75. package/dist/decision/process.js.map +1 -1
  76. package/dist/diffusion/args.d.ts +3 -2
  77. package/dist/diffusion/args.js +21 -4
  78. package/dist/diffusion/args.js.map +1 -1
  79. package/dist/diffusion/compat.d.ts +1 -1
  80. package/dist/diffusion/compat.js +6 -2
  81. package/dist/diffusion/compat.js.map +1 -1
  82. package/dist/diffusion/gallery.d.ts +24 -3
  83. package/dist/diffusion/gallery.js +151 -21
  84. package/dist/diffusion/gallery.js.map +1 -1
  85. package/dist/diffusion/index.d.ts +3 -0
  86. package/dist/diffusion/index.js +3 -0
  87. package/dist/diffusion/index.js.map +1 -1
  88. package/dist/diffusion/jobs.d.ts +6 -1
  89. package/dist/diffusion/jobs.js +10 -1
  90. package/dist/diffusion/jobs.js.map +1 -1
  91. package/dist/diffusion/media-header.d.ts +22 -0
  92. package/dist/diffusion/media-header.js +149 -0
  93. package/dist/diffusion/media-header.js.map +1 -0
  94. package/dist/diffusion/parse.d.ts +3 -1
  95. package/dist/diffusion/parse.js +36 -0
  96. package/dist/diffusion/parse.js.map +1 -1
  97. package/dist/diffusion/recipe.d.ts +10 -1
  98. package/dist/diffusion/recipe.js +85 -21
  99. package/dist/diffusion/recipe.js.map +1 -1
  100. package/dist/diffusion/remote-job.d.ts +76 -0
  101. package/dist/diffusion/remote-job.js +643 -0
  102. package/dist/diffusion/remote-job.js.map +1 -0
  103. package/dist/diffusion/remote-store.d.ts +38 -0
  104. package/dist/diffusion/remote-store.js +91 -0
  105. package/dist/diffusion/remote-store.js.map +1 -0
  106. package/dist/diffusion/service.d.ts +9 -1
  107. package/dist/diffusion/service.js +49 -9
  108. package/dist/diffusion/service.js.map +1 -1
  109. package/dist/diffusion/state.d.ts +13 -1
  110. package/dist/diffusion/state.js +8 -0
  111. package/dist/diffusion/state.js.map +1 -1
  112. package/dist/diffusion/tracker.d.ts +6 -0
  113. package/dist/diffusion/tracker.js +11 -0
  114. package/dist/diffusion/tracker.js.map +1 -1
  115. package/dist/diffusion/validate.js +2 -2
  116. package/dist/diffusion/validate.js.map +1 -1
  117. package/dist/diffusion/video-gallery.d.ts +11 -4
  118. package/dist/diffusion/video-gallery.js +62 -25
  119. package/dist/diffusion/video-gallery.js.map +1 -1
  120. package/dist/diffusion/video-history.js +4 -1
  121. package/dist/diffusion/video-history.js.map +1 -1
  122. package/dist/diffusion/video-recipe.js +58 -25
  123. package/dist/diffusion/video-recipe.js.map +1 -1
  124. package/dist/diffusion/wiring.d.ts +3 -0
  125. package/dist/diffusion/wiring.js +1 -0
  126. package/dist/diffusion/wiring.js.map +1 -1
  127. package/dist/diffusion/workflow.d.ts +8 -2
  128. package/dist/diffusion/workflow.js +13 -5
  129. package/dist/diffusion/workflow.js.map +1 -1
  130. package/dist/downloads/downloader.d.ts +6 -1
  131. package/dist/downloads/downloader.js +12 -1
  132. package/dist/downloads/downloader.js.map +1 -1
  133. package/dist/embedding/process.d.ts +4 -0
  134. package/dist/embedding/process.js +10 -1
  135. package/dist/embedding/process.js.map +1 -1
  136. package/dist/media/adapters/a1111.d.ts +32 -0
  137. package/dist/media/adapters/a1111.js +207 -0
  138. package/dist/media/adapters/a1111.js.map +1 -0
  139. package/dist/media/adapters/aimlapi-videos.d.ts +34 -0
  140. package/dist/media/adapters/aimlapi-videos.js +172 -0
  141. package/dist/media/adapters/aimlapi-videos.js.map +1 -0
  142. package/dist/media/adapters/dashscope-image.d.ts +26 -0
  143. package/dist/media/adapters/dashscope-image.js +160 -0
  144. package/dist/media/adapters/dashscope-image.js.map +1 -0
  145. package/dist/media/adapters/dashscope-video.d.ts +47 -0
  146. package/dist/media/adapters/dashscope-video.js +251 -0
  147. package/dist/media/adapters/dashscope-video.js.map +1 -0
  148. package/dist/media/adapters/gemini-image.d.ts +27 -0
  149. package/dist/media/adapters/gemini-image.js +181 -0
  150. package/dist/media/adapters/gemini-image.js.map +1 -0
  151. package/dist/media/adapters/gemini-veo.d.ts +39 -0
  152. package/dist/media/adapters/gemini-veo.js +196 -0
  153. package/dist/media/adapters/gemini-veo.js.map +1 -0
  154. package/dist/media/adapters/hf-images.d.ts +85 -0
  155. package/dist/media/adapters/hf-images.js +439 -0
  156. package/dist/media/adapters/hf-images.js.map +1 -0
  157. package/dist/media/adapters/hf-videos.d.ts +44 -0
  158. package/dist/media/adapters/hf-videos.js +265 -0
  159. package/dist/media/adapters/hf-videos.js.map +1 -0
  160. package/dist/media/adapters/minimax-image.d.ts +26 -0
  161. package/dist/media/adapters/minimax-image.js +111 -0
  162. package/dist/media/adapters/minimax-image.js.map +1 -0
  163. package/dist/media/adapters/minimax-video-v2.d.ts +34 -0
  164. package/dist/media/adapters/minimax-video-v2.js +191 -0
  165. package/dist/media/adapters/minimax-video-v2.js.map +1 -0
  166. package/dist/media/adapters/minimax-video.d.ts +28 -0
  167. package/dist/media/adapters/minimax-video.js +155 -0
  168. package/dist/media/adapters/minimax-video.js.map +1 -0
  169. package/dist/media/adapters/mistral-agent-image.d.ts +33 -0
  170. package/dist/media/adapters/mistral-agent-image.js +108 -0
  171. package/dist/media/adapters/mistral-agent-image.js.map +1 -0
  172. package/dist/media/adapters/nvidia-genai.d.ts +28 -0
  173. package/dist/media/adapters/nvidia-genai.js +182 -0
  174. package/dist/media/adapters/nvidia-genai.js.map +1 -0
  175. package/dist/media/adapters/openai-images.d.ts +23 -0
  176. package/dist/media/adapters/openai-images.js +164 -0
  177. package/dist/media/adapters/openai-images.js.map +1 -0
  178. package/dist/media/adapters/openai-videos.d.ts +34 -0
  179. package/dist/media/adapters/openai-videos.js +175 -0
  180. package/dist/media/adapters/openai-videos.js.map +1 -0
  181. package/dist/media/adapters/openrouter-images.d.ts +25 -0
  182. package/dist/media/adapters/openrouter-images.js +161 -0
  183. package/dist/media/adapters/openrouter-images.js.map +1 -0
  184. package/dist/media/adapters/openrouter-videos.d.ts +43 -0
  185. package/dist/media/adapters/openrouter-videos.js +208 -0
  186. package/dist/media/adapters/openrouter-videos.js.map +1 -0
  187. package/dist/media/adapters/registry.d.ts +7 -0
  188. package/dist/media/adapters/registry.js +45 -0
  189. package/dist/media/adapters/registry.js.map +1 -0
  190. package/dist/media/adapters/types.d.ts +133 -0
  191. package/dist/media/adapters/types.js +15 -0
  192. package/dist/media/adapters/types.js.map +1 -0
  193. package/dist/media/adapters/xai-images.d.ts +19 -0
  194. package/dist/media/adapters/xai-images.js +83 -0
  195. package/dist/media/adapters/xai-images.js.map +1 -0
  196. package/dist/media/adapters/xai-videos.d.ts +29 -0
  197. package/dist/media/adapters/xai-videos.js +148 -0
  198. package/dist/media/adapters/xai-videos.js.map +1 -0
  199. package/dist/media/catalog-baseline.d.ts +2 -0
  200. package/dist/media/catalog-baseline.js +10 -0
  201. package/dist/media/catalog-baseline.js.map +1 -0
  202. package/dist/media/catalog-baseline.json +1819 -0
  203. package/dist/media/catalog-service.d.ts +42 -0
  204. package/dist/media/catalog-service.js +111 -0
  205. package/dist/media/catalog-service.js.map +1 -0
  206. package/dist/media/catalog.d.ts +50 -0
  207. package/dist/media/catalog.js +315 -0
  208. package/dist/media/catalog.js.map +1 -0
  209. package/dist/media/http.d.ts +125 -0
  210. package/dist/media/http.js +308 -0
  211. package/dist/media/http.js.map +1 -0
  212. package/dist/media/index.d.ts +14 -0
  213. package/dist/media/index.js +15 -0
  214. package/dist/media/index.js.map +1 -0
  215. package/dist/media/mask.d.ts +12 -0
  216. package/dist/media/mask.js +57 -0
  217. package/dist/media/mask.js.map +1 -0
  218. package/dist/media/service.d.ts +42 -0
  219. package/dist/media/service.js +144 -0
  220. package/dist/media/service.js.map +1 -0
  221. package/dist/models/compatibility/inspect.d.ts +11 -2
  222. package/dist/models/compatibility/inspect.js +44 -13
  223. package/dist/models/compatibility/inspect.js.map +1 -1
  224. package/dist/models/compatibility/service.d.ts +3 -0
  225. package/dist/models/compatibility/service.js +1 -0
  226. package/dist/models/compatibility/service.js.map +1 -1
  227. package/dist/models/gguf/tensors.d.ts +1 -0
  228. package/dist/models/gguf/tensors.js +4 -1
  229. package/dist/models/gguf/tensors.js.map +1 -1
  230. package/dist/models/hf.d.ts +3 -16
  231. package/dist/models/hf.js +4 -42
  232. package/dist/models/hf.js.map +1 -1
  233. package/dist/router/resolve.d.ts +15 -4
  234. package/dist/router/resolve.js +25 -3
  235. package/dist/router/resolve.js.map +1 -1
  236. package/dist/runtime/environment/linux-provisioner.js +7 -67
  237. package/dist/runtime/environment/linux-provisioner.js.map +1 -1
  238. package/dist/runtime/environment/runtime-removal-plan.d.ts +19 -0
  239. package/dist/runtime/environment/runtime-removal-plan.js +74 -0
  240. package/dist/runtime/environment/runtime-removal-plan.js.map +1 -0
  241. package/dist/runtime/environment/windows-provisioner.js +20 -4
  242. package/dist/runtime/environment/windows-provisioner.js.map +1 -1
  243. package/dist/runtime/managed-engines/spec.d.ts +2 -2
  244. package/dist/runtime/managed-engines/spec.js +6 -0
  245. package/dist/runtime/managed-engines/spec.js.map +1 -1
  246. package/dist/runtime/managed-models/compatibility.d.ts +10 -0
  247. package/dist/runtime/managed-models/compatibility.js +18 -0
  248. package/dist/runtime/managed-models/compatibility.js.map +1 -1
  249. package/dist/runtime/managed-text/adapter.d.ts +17 -0
  250. package/dist/runtime/managed-text/adapter.js.map +1 -1
  251. package/dist/runtime/managed-text/lifecycle.d.ts +8 -0
  252. package/dist/runtime/managed-text/lifecycle.js +38 -1
  253. package/dist/runtime/managed-text/lifecycle.js.map +1 -1
  254. package/dist/runtime/managed-text/readiness.d.ts +21 -1
  255. package/dist/runtime/managed-text/readiness.js +64 -0
  256. package/dist/runtime/managed-text/readiness.js.map +1 -1
  257. package/dist/runtime/managed-text/request-rules.d.ts +9 -7
  258. package/dist/runtime/managed-text/request-rules.js +58 -2
  259. package/dist/runtime/managed-text/request-rules.js.map +1 -1
  260. package/dist/runtime/managed-text/setting-values.d.ts +9 -0
  261. package/dist/runtime/managed-text/setting-values.js +44 -0
  262. package/dist/runtime/managed-text/setting-values.js.map +1 -0
  263. package/dist/runtime/sglang/adapter.d.ts +50 -0
  264. package/dist/runtime/sglang/adapter.js +393 -0
  265. package/dist/runtime/sglang/adapter.js.map +1 -0
  266. package/dist/runtime/sglang/engine.d.ts +16 -0
  267. package/dist/runtime/sglang/engine.js +38 -0
  268. package/dist/runtime/sglang/engine.js.map +1 -0
  269. package/dist/runtime/sglang/index.d.ts +11 -0
  270. package/dist/runtime/sglang/index.js +12 -0
  271. package/dist/runtime/sglang/index.js.map +1 -0
  272. package/dist/runtime/sglang/memory.d.ts +64 -0
  273. package/dist/runtime/sglang/memory.js +90 -0
  274. package/dist/runtime/sglang/memory.js.map +1 -0
  275. package/dist/runtime/sglang/settings.d.ts +49 -0
  276. package/dist/runtime/sglang/settings.js +118 -0
  277. package/dist/runtime/sglang/settings.js.map +1 -0
  278. package/dist/runtime/shared/external-sessions.js +1 -0
  279. package/dist/runtime/shared/external-sessions.js.map +1 -1
  280. package/dist/runtime/shared/ports.d.ts +10 -0
  281. package/dist/runtime/shared/ports.js +30 -0
  282. package/dist/runtime/shared/ports.js.map +1 -1
  283. package/dist/runtime/tensorrt-llm/adapter.d.ts +1 -4
  284. package/dist/runtime/tensorrt-llm/adapter.js +28 -11
  285. package/dist/runtime/tensorrt-llm/adapter.js.map +1 -1
  286. package/dist/runtime/tensorrt-llm/check.js +1 -0
  287. package/dist/runtime/tensorrt-llm/check.js.map +1 -1
  288. package/dist/runtime/tensorrt-llm/compatibility.d.ts +30 -6
  289. package/dist/runtime/tensorrt-llm/compatibility.js +41 -9
  290. package/dist/runtime/tensorrt-llm/compatibility.js.map +1 -1
  291. package/dist/runtime/tensorrt-llm/cuda-graphs.d.ts +32 -0
  292. package/dist/runtime/tensorrt-llm/cuda-graphs.js +33 -0
  293. package/dist/runtime/tensorrt-llm/cuda-graphs.js.map +1 -0
  294. package/dist/runtime/tensorrt-llm/engine.js +11 -5
  295. package/dist/runtime/tensorrt-llm/engine.js.map +1 -1
  296. package/dist/runtime/tensorrt-llm/kv-cache.d.ts +16 -0
  297. package/dist/runtime/tensorrt-llm/kv-cache.js +21 -1
  298. package/dist/runtime/tensorrt-llm/kv-cache.js.map +1 -1
  299. package/dist/runtime/vllm/adapter.js +2 -47
  300. package/dist/runtime/vllm/adapter.js.map +1 -1
  301. package/dist/runtime/vllm/memory.js +3 -16
  302. package/dist/runtime/vllm/memory.js.map +1 -1
  303. package/dist/runtime/vllm/settings.d.ts +7 -0
  304. package/dist/runtime/vllm/settings.js +2 -30
  305. package/dist/runtime/vllm/settings.js.map +1 -1
  306. package/dist/server/control/router.js +5 -4
  307. package/dist/server/control/router.js.map +1 -1
  308. package/dist/server/control/routes/media.d.ts +9 -0
  309. package/dist/server/control/routes/media.js +24 -0
  310. package/dist/server/control/routes/media.js.map +1 -0
  311. package/dist/server/control/routes/model-compatibility.d.ts +9 -0
  312. package/dist/server/control/routes/model-compatibility.js +31 -0
  313. package/dist/server/control/routes/model-compatibility.js.map +1 -0
  314. package/dist/server/control/types.d.ts +18 -20
  315. package/dist/server/http.js +15 -2
  316. package/dist/server/http.js.map +1 -1
  317. package/dist/server/public/gates.d.ts +6 -1
  318. package/dist/server/public/gates.js +7 -3
  319. package/dist/server/public/gates.js.map +1 -1
  320. package/dist/server/public/images-params.js +18 -1
  321. package/dist/server/public/images-params.js.map +1 -1
  322. package/dist/server/public/images.d.ts +11 -2
  323. package/dist/server/public/images.js +73 -9
  324. package/dist/server/public/images.js.map +1 -1
  325. package/dist/server/public/index.d.ts +1 -0
  326. package/dist/server/public/index.js +16 -7
  327. package/dist/server/public/index.js.map +1 -1
  328. package/dist/server/public/listing.js +1 -0
  329. package/dist/server/public/listing.js.map +1 -1
  330. package/dist/server/public/remote-media.d.ts +51 -0
  331. package/dist/server/public/remote-media.js +225 -0
  332. package/dist/server/public/remote-media.js.map +1 -0
  333. package/dist/server/public/responses.js +4 -2
  334. package/dist/server/public/responses.js.map +1 -1
  335. package/dist/server/public/static-assets.generated.js +1 -1
  336. package/dist/server/public/static-assets.generated.js.map +1 -1
  337. package/dist/server/public/trace.js +2 -0
  338. package/dist/server/public/trace.js.map +1 -1
  339. package/dist/server/public/types.d.ts +12 -1
  340. package/dist/server/public/videos-params.js +13 -3
  341. package/dist/server/public/videos-params.js.map +1 -1
  342. package/dist/server/public/videos.d.ts +1 -0
  343. package/dist/server/public/videos.js +21 -3
  344. package/dist/server/public/videos.js.map +1 -1
  345. package/dist/settings/schema/llamacpp-upstream.json +9 -0
  346. package/dist/settings/schema/sglang.json +251 -0
  347. package/dist/settings/schema.js +27 -1
  348. package/dist/settings/schema.js.map +1 -1
  349. package/dist/version.d.ts +1 -1
  350. package/dist/version.js +1 -1
  351. package/package.json +2 -6
  352. package/src/settings/schema/llamacpp-upstream.json +9 -0
  353. package/src/settings/schema/sglang.json +251 -0
  354. package/dist/backend/catalog/bundled-manifest-baseline.d.ts +0 -2
  355. package/dist/backend/catalog/bundled-manifest-baseline.js +0 -65
  356. package/dist/backend/catalog/bundled-manifest-baseline.js.map +0 -1
  357. package/dist/contracts/model-setup.d.ts +0 -115
  358. package/dist/contracts/model-setup.js +0 -33
  359. package/dist/contracts/model-setup.js.map +0 -1
  360. package/dist/core/model-setup/index.d.ts +0 -4
  361. package/dist/core/model-setup/index.js +0 -5
  362. package/dist/core/model-setup/index.js.map +0 -1
  363. package/dist/core/model-setup/plan.d.ts +0 -56
  364. package/dist/core/model-setup/plan.js +0 -158
  365. package/dist/core/model-setup/plan.js.map +0 -1
  366. package/dist/core/model-setup/service.d.ts +0 -92
  367. package/dist/core/model-setup/service.js +0 -329
  368. package/dist/core/model-setup/service.js.map +0 -1
  369. package/dist/core/model-setup/store.d.ts +0 -29
  370. package/dist/core/model-setup/store.js +0 -116
  371. package/dist/core/model-setup/store.js.map +0 -1
  372. package/dist/core/model-setup/wiring.d.ts +0 -59
  373. package/dist/core/model-setup/wiring.js +0 -132
  374. package/dist/core/model-setup/wiring.js.map +0 -1
  375. package/dist/server/control/routes/model-setups.d.ts +0 -11
  376. package/dist/server/control/routes/model-setups.js +0 -55
  377. package/dist/server/control/routes/model-setups.js.map +0 -1
@@ -0,0 +1,182 @@
1
+ /**
2
+ * `nvidia-genai`: NVIDIA's Visual GenAI image models — the hosted API catalog and self-hosted NIMs.
3
+ *
4
+ * Where a request goes:
5
+ * - the API catalog (registered base `https://integrate.api.nvidia.com/v1`) serves visual models on a
6
+ * different host: `POST https://ai.api.nvidia.com/v1/genai/{model.id}`. This host mapping is
7
+ * hardcoded here — the one sanctioned exception to "every URL from the base" — and applies only
8
+ * when the base's host is `integrate.api.nvidia.com`;
9
+ * - any other base is a self-hosted NIM: `POST {base without its /v1}/v1/infer`.
10
+ *
11
+ * The body follows the model's `options.schema` (each NVIDIA endpoint rejects fields it does not
12
+ * know): `flux-schnell`, `flux-dev`, `flux2-klein`, `sd3`; a model without one gets the prompt and
13
+ * only what the job set. The answer is `{artifacts: [{base64, finishReason, seed}]}` (SD3:
14
+ * `{image, finish_reason, seed}`), one JPEG per call, so `n` images are `n` calls. A
15
+ * `CONTENT_FILTERED` finish is `REMOTE_CONTENT_BLOCKED`. When the hosted API answers 202 (NVCF: the
16
+ * job outlived its synchronous window) the request id is polled on
17
+ * `https://ai.api.nvidia.com/v1/status/{id}` — NVIDIA documents several spellings of that path and
18
+ * none for these models, so this one is unverified; a wrong one ends as the provider's 404.
19
+ */
20
+ import { callProvider, decodeBase64Image, GENERATE_TIMEOUT_MS, joinUrl, parseWxH, pollUntil, remoteError, } from '../http.js';
21
+ const asObject = (value) => value !== null && typeof value === 'object' && !Array.isArray(value) ? value : {};
22
+ const text = (value) => typeof value === 'string' && value.trim() !== '' ? value.trim() : undefined;
23
+ /** The hosted API catalog's host, and the host its visual models live on. */
24
+ const CATALOG_HOST = 'integrate.api.nvidia.com';
25
+ const GENAI_ORIGIN = 'https://ai.api.nvidia.com';
26
+ /** NVIDIA seeds are `0 <= seed < 2^32`; 0 asks for a random one. */
27
+ const SEED_LIMIT = 2 ** 32;
28
+ /** Whether the registration is NVIDIA's hosted API catalog. */
29
+ function isCatalog(baseUrl) {
30
+ try {
31
+ return new URL(baseUrl).hostname === CATALOG_HOST;
32
+ }
33
+ catch {
34
+ return false;
35
+ }
36
+ }
37
+ /** Where a model's generation goes (see the file comment). */
38
+ export function nvidiaInferUrl(baseUrl, modelId) {
39
+ if (isCatalog(baseUrl))
40
+ return `${GENAI_ORIGIN}/v1/genai/${modelId.split('/').filter(Boolean).map(encodeURIComponent).join('/')}`;
41
+ return joinUrl(baseUrl.replace(/\/+$/, '').replace(/\/v1$/i, ''), '/v1/infer');
42
+ }
43
+ /** The seed of image `index`: the job's (counting up per image), or 0 (random) when it has none. */
44
+ function seedOf(job, index) {
45
+ if (job.seed === undefined || job.seed < 0 || !Number.isFinite(job.seed))
46
+ return 0;
47
+ const seed = Math.trunc(job.seed);
48
+ return seed === 0 ? 0 : (seed + index) % SEED_LIMIT;
49
+ }
50
+ /** The request body for image `index` of a job, by the model's `options.schema`. */
51
+ export function nvidiaBody(job, index = 0) {
52
+ const params = job.model.params;
53
+ const size = parseWxH(job.size) ?? (job.width && job.height ? { width: job.width, height: job.height } : undefined);
54
+ const steps = job.steps ?? params.steps?.default;
55
+ const seed = seedOf(job, index);
56
+ const { width, height } = size ?? { width: 1024, height: 1024 };
57
+ switch (job.model.options?.['schema']) {
58
+ case 'flux-schnell':
59
+ return {
60
+ prompt: job.prompt,
61
+ width,
62
+ height,
63
+ steps: steps ?? 4,
64
+ seed,
65
+ cfg_scale: 0,
66
+ mode: 'base',
67
+ samples: 1,
68
+ };
69
+ case 'flux-dev':
70
+ return {
71
+ prompt: job.prompt,
72
+ mode: 'base',
73
+ cfg_scale: job.cfgScale ?? job.guidance ?? params.cfg?.default ?? 5,
74
+ width,
75
+ height,
76
+ steps: steps ?? 50,
77
+ seed,
78
+ samples: 1,
79
+ };
80
+ case 'flux2-klein':
81
+ return {
82
+ prompt: job.prompt,
83
+ mode: 'Image Generation',
84
+ steps: steps ?? 4,
85
+ cfg_scale: 0,
86
+ seed,
87
+ width,
88
+ height,
89
+ };
90
+ case 'sd3': {
91
+ const body = { prompt: job.prompt };
92
+ if (job.negativePrompt)
93
+ body['negative_prompt'] = job.negativePrompt;
94
+ const ratio = job.aspectRatio ?? params.aspect_ratios?.default;
95
+ if (ratio)
96
+ body['aspect_ratio'] = ratio;
97
+ body['cfg_scale'] = job.cfgScale ?? params.cfg?.default ?? 5;
98
+ body['steps'] = steps ?? 50;
99
+ body['seed'] = seed;
100
+ return body;
101
+ }
102
+ default: {
103
+ // A model the catalog does not describe (a self-hosted NIM): the prompt and what the job set.
104
+ const body = { prompt: job.prompt };
105
+ if (size)
106
+ Object.assign(body, size);
107
+ if (steps !== undefined)
108
+ body['steps'] = steps;
109
+ if (job.cfgScale !== undefined)
110
+ body['cfg_scale'] = job.cfgScale;
111
+ if (job.negativePrompt && params.negative_prompt)
112
+ body['negative_prompt'] = job.negativePrompt;
113
+ body['seed'] = seed;
114
+ return body;
115
+ }
116
+ }
117
+ }
118
+ /** The images of an answer; a filtered or failed finish throws. */
119
+ export function nvidiaImages(ctx, json) {
120
+ const fields = asObject(json);
121
+ const artifacts = Array.isArray(fields['artifacts']) ? fields['artifacts'].map(asObject) : [fields];
122
+ const out = [];
123
+ for (const artifact of artifacts) {
124
+ const reason = text(artifact['finishReason']) ?? text(artifact['finish_reason']);
125
+ if (reason === 'CONTENT_FILTERED')
126
+ throw remoteError('REMOTE_CONTENT_BLOCKED', `${ctx.provider} filtered the image as unsafe.`, reason);
127
+ if (reason === 'ERROR')
128
+ throw remoteError('REMOTE_UNAVAILABLE', `${ctx.provider} failed to generate the image.`, reason);
129
+ const payload = text(artifact['base64']) ?? text(artifact['image']);
130
+ if (payload)
131
+ out.push(decodeBase64Image(payload));
132
+ }
133
+ if (out.length === 0)
134
+ throw remoteError('REMOTE_UNAVAILABLE', `${ctx.provider} answered without an image.`);
135
+ return out;
136
+ }
137
+ /** The request id of a 202 (the `NVCF-REQID` header, or the body's id). */
138
+ function pendingId(headers, json) {
139
+ const fields = asObject(json);
140
+ return (text(headers.get('nvcf-reqid')) ??
141
+ text(fields['reqId']) ??
142
+ text(fields['requestId']) ??
143
+ text(fields['id']));
144
+ }
145
+ /** Polls a hosted request that answered 202 until it answers 200. */
146
+ async function awaitPending(ctx, id) {
147
+ const url = `${GENAI_ORIGIN}/v1/status/${encodeURIComponent(id)}`;
148
+ return pollUntil(ctx, async () => {
149
+ const answer = await callProvider(ctx, url);
150
+ return answer.status === 202 ? undefined : answer.json;
151
+ }, { intervalMs: 1000, maxIntervalMs: 5000, timeoutMs: GENERATE_TIMEOUT_MS });
152
+ }
153
+ export const NVIDIA_GENAI = {
154
+ dialect: 'nvidia-genai',
155
+ kind: 'image',
156
+ async generate(ctx, job, report) {
157
+ report({ phase: 'generating' });
158
+ if (job.workflow !== 'create')
159
+ throw remoteError('REMOTE_UNSUPPORTED', 'This model only creates images from a prompt here.', job.workflow);
160
+ const url = nvidiaInferUrl(ctx.baseUrl, job.model.id);
161
+ const count = Math.max(1, job.n);
162
+ const out = [];
163
+ for (let index = 0; index < count; index++) {
164
+ const answer = await callProvider(ctx, url, {
165
+ json: nvidiaBody(job, index),
166
+ timeoutMs: GENERATE_TIMEOUT_MS,
167
+ });
168
+ let json = answer.json;
169
+ if (answer.status === 202) {
170
+ const id = pendingId(answer.headers, answer.json);
171
+ if (!id || !isCatalog(ctx.baseUrl))
172
+ throw remoteError('REMOTE_UNAVAILABLE', `${ctx.provider} accepted the request without an answer.`, 'HTTP 202');
173
+ json = await awaitPending(ctx, id);
174
+ }
175
+ out.push(...nvidiaImages(ctx, json));
176
+ if (count > 1)
177
+ report({ phase: 'generating', fraction: (index + 1) / count });
178
+ }
179
+ return out;
180
+ },
181
+ };
182
+ //# sourceMappingURL=nvidia-genai.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"nvidia-genai.js","sourceRoot":"","sources":["../../../src/media/adapters/nvidia-genai.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,23 @@
1
+ /**
2
+ * `openai-images`: the OpenAI Images API and the servers that copy it — OpenAI (gpt-image-*), Meta's
3
+ * Muse Image, Eden AI (`/v3/images/*`), AIMLAPI, Ollama's experimental image models, and any
4
+ * OpenAI-compatible self-hosted server (LocalAI, sd.cpp's `sd-server`, another Atomic core).
5
+ *
6
+ * `create` → `POST {base}/images/generations`. `edit`, `reference`, `inpaint` → `POST
7
+ * {base}/images/edits` in its JSON form (`images: [{image_url}]`, `mask: {image_url}`), or as
8
+ * multipart when the model's `options.edit_transport` is `multipart`. A model whose
9
+ * `options.edit_via` is `image_urls` (AIMLAPI's non-OpenAI models) edits through generations with
10
+ * `image_urls` instead. Images come back as `b64_json` or a `url`; both are taken.
11
+ */
12
+ import type { LiveMediaModel } from '../catalog.js';
13
+ import type { MediaContext } from '../http.js';
14
+ import type { GeneratedImage, ImageAdapter, ImageGenerationJob } from './types.js';
15
+ /** Ids that name an image model in a plain `/models` listing (an OpenAI-compatible server lists everything). */
16
+ export declare const IMAGE_MODEL_ID: RegExp;
17
+ /** The fields both endpoints share. */
18
+ export declare function commonFields(job: ImageGenerationJob): Record<string, unknown>;
19
+ /** `data[]` of an Images API answer as images, downloading any that came as a URL. */
20
+ export declare function imagesFromAnswer(ctx: MediaContext, json: unknown): Promise<GeneratedImage[]>;
21
+ /** The image models of a `/models`-style listing (OpenAI, AIMLAPI, Eden AI's `/images/models`, Ollama). */
22
+ export declare function imageModelsFromListing(json: unknown, filter: boolean): LiveMediaModel[];
23
+ export declare const OPENAI_IMAGES: ImageAdapter;
@@ -0,0 +1,164 @@
1
+ /**
2
+ * `openai-images`: the OpenAI Images API and the servers that copy it — OpenAI (gpt-image-*), Meta's
3
+ * Muse Image, Eden AI (`/v3/images/*`), AIMLAPI, Ollama's experimental image models, and any
4
+ * OpenAI-compatible self-hosted server (LocalAI, sd.cpp's `sd-server`, another Atomic core).
5
+ *
6
+ * `create` → `POST {base}/images/generations`. `edit`, `reference`, `inpaint` → `POST
7
+ * {base}/images/edits` in its JSON form (`images: [{image_url}]`, `mask: {image_url}`), or as
8
+ * multipart when the model's `options.edit_transport` is `multipart`. A model whose
9
+ * `options.edit_via` is `image_urls` (AIMLAPI's non-OpenAI models) edits through generations with
10
+ * `image_urls` instead. Images come back as `b64_json` or a `url`; both are taken.
11
+ */
12
+ import { callProvider, decodeBase64Image, downloadResult, GENERATE_TIMEOUT_MS, joinUrl, MAX_IMAGE_BYTES, remoteError, sniffImageMime, toDataUrl, } from '../http.js';
13
+ import { maskToAlpha } from '../mask.js';
14
+ /** gpt-image models always answer `b64_json` and refuse `response_format`. */
15
+ const GPT_IMAGE = /(^|\/)gpt-image|(^|\/)chatgpt-image/i;
16
+ /** Ids that name an image model in a plain `/models` listing (an OpenAI-compatible server lists everything). */
17
+ export const IMAGE_MODEL_ID = /gpt-image|chatgpt-image|dall-e|(^|[/._-])image([._-]|$)|flux|stable-diffusion|sdxl|sd3|sd-?1\.5|z-image|qwen-image|imagen|seedream|recraft|ideogram|kolors|hidream|muse-image|nano-banana/i;
18
+ /** The fields both endpoints share. */
19
+ export function commonFields(job) {
20
+ const body = { model: job.model.id, prompt: job.prompt };
21
+ if (job.n > 1)
22
+ body['n'] = job.n;
23
+ const size = job.size ?? (job.width && job.height ? `${job.width}x${job.height}` : undefined);
24
+ if (size && size !== 'auto')
25
+ body['size'] = size;
26
+ else if (size === 'auto' && job.model.params.size)
27
+ body['size'] = 'auto';
28
+ if (job.quality)
29
+ body['quality'] = job.quality;
30
+ if (job.background)
31
+ body['background'] = job.background;
32
+ if (job.outputFormat)
33
+ body['output_format'] = job.outputFormat;
34
+ if (job.aspectRatio)
35
+ body['aspect_ratio'] = job.aspectRatio;
36
+ if (job.resolution)
37
+ body['resolution'] = job.resolution;
38
+ if (job.seed !== undefined && job.model.params.seed)
39
+ body['seed'] = job.seed;
40
+ if (job.negativePrompt && job.model.params.negative_prompt)
41
+ body['negative_prompt'] = job.negativePrompt;
42
+ if (!GPT_IMAGE.test(job.model.id))
43
+ body['response_format'] = 'b64_json';
44
+ return body;
45
+ }
46
+ /** `data[]` of an Images API answer as images, downloading any that came as a URL. */
47
+ export async function imagesFromAnswer(ctx, json) {
48
+ const data = json && typeof json === 'object' ? json['data'] : undefined;
49
+ const items = Array.isArray(data) ? data : [];
50
+ const out = [];
51
+ for (const item of items) {
52
+ if (!item || typeof item !== 'object')
53
+ continue;
54
+ const fields = item;
55
+ if (typeof fields['b64_json'] === 'string' && fields['b64_json'] !== '') {
56
+ out.push(decodeBase64Image(fields['b64_json']));
57
+ }
58
+ else if (typeof fields['url'] === 'string' && fields['url'] !== '') {
59
+ const url = fields['url'];
60
+ if (url.startsWith('data:')) {
61
+ out.push(decodeBase64Image(url));
62
+ continue;
63
+ }
64
+ const file = await downloadResult(ctx, url, { maxBytes: MAX_IMAGE_BYTES, what: 'image' });
65
+ const mime = sniffImageMime(file.bytes);
66
+ if (!mime)
67
+ throw remoteError('REMOTE_UNAVAILABLE', `${ctx.provider} returned a file that is not an image.`);
68
+ out.push({ bytes: file.bytes, mime });
69
+ }
70
+ }
71
+ if (out.length === 0)
72
+ throw remoteError('REMOTE_UNAVAILABLE', `${ctx.provider} answered without an image.`);
73
+ return out;
74
+ }
75
+ async function editBody(job) {
76
+ const body = commonFields(job);
77
+ body['images'] = job.images.map((image) => ({ image_url: toDataUrl(image.bytes, image.mime) }));
78
+ if (job.workflow === 'inpaint' && job.mask)
79
+ body['mask'] = { image_url: toDataUrl(await maskToAlpha(job.mask.bytes), 'image/png') };
80
+ return body;
81
+ }
82
+ async function editForm(job) {
83
+ const form = new FormData();
84
+ for (const [key, value] of Object.entries(commonFields(job)))
85
+ form.append(key, String(value));
86
+ job.images.forEach((image, index) => {
87
+ const ext = image.mime.split('/')[1] ?? 'png';
88
+ form.append('image[]', new Blob([new Uint8Array(image.bytes)], { type: image.mime }), `image-${index}.${ext}`);
89
+ });
90
+ if (job.workflow === 'inpaint' && job.mask)
91
+ form.append('mask', new Blob([new Uint8Array(await maskToAlpha(job.mask.bytes))], { type: 'image/png' }), 'mask.png');
92
+ return form;
93
+ }
94
+ /** What a `/models` entry says about being an image model, when its listing says anything. */
95
+ function isImageEntry(entry, id) {
96
+ const type = entry['type'];
97
+ if (typeof type === 'string')
98
+ return /image/i.test(type);
99
+ return IMAGE_MODEL_ID.test(id);
100
+ }
101
+ /** The image models of a `/models`-style listing (OpenAI, AIMLAPI, Eden AI's `/images/models`, Ollama). */
102
+ export function imageModelsFromListing(json, filter) {
103
+ const data = json && typeof json === 'object' && !Array.isArray(json)
104
+ ? (json['data'] ?? json['models'])
105
+ : json;
106
+ const out = [];
107
+ const seen = new Set();
108
+ for (const item of Array.isArray(data) ? data : []) {
109
+ if (!item || typeof item !== 'object')
110
+ continue;
111
+ const entry = item;
112
+ const id = typeof entry['id'] === 'string'
113
+ ? entry['id']
114
+ : typeof entry['name'] === 'string'
115
+ ? entry['name']
116
+ : undefined;
117
+ if (!id || seen.has(id))
118
+ continue;
119
+ if (filter && !isImageEntry(entry, id))
120
+ continue;
121
+ seen.add(id);
122
+ const info = entry['info'];
123
+ const name = typeof info?.['name'] === 'string' ? info['name'] : undefined;
124
+ out.push(name ? { id, name } : { id });
125
+ }
126
+ return out;
127
+ }
128
+ export const OPENAI_IMAGES = {
129
+ dialect: 'openai-images',
130
+ kind: 'image',
131
+ async listModels(ctx) {
132
+ // Eden AI lists image models on their own route; elsewhere it is a 404 and `/models` is filtered.
133
+ const own = await callProvider(ctx, joinUrl(ctx.baseUrl, '/images/models'), { accept: [400, 404, 405] });
134
+ if (own.status === 200)
135
+ return imageModelsFromListing(own.json, false);
136
+ const all = await callProvider(ctx, joinUrl(ctx.baseUrl, '/models'));
137
+ return imageModelsFromListing(all.json, true);
138
+ },
139
+ async generate(ctx, job, report) {
140
+ report({ phase: 'generating' });
141
+ const viaUrls = job.model.options?.['edit_via'] === 'image_urls';
142
+ let answer;
143
+ if (job.workflow === 'create' || (viaUrls && job.images.length > 0)) {
144
+ const body = commonFields(job);
145
+ if (viaUrls && job.images.length > 0)
146
+ body['image_urls'] = job.images.map((image) => toDataUrl(image.bytes, image.mime));
147
+ answer = await callProvider(ctx, joinUrl(ctx.baseUrl, '/images/generations'), {
148
+ json: body,
149
+ timeoutMs: GENERATE_TIMEOUT_MS,
150
+ });
151
+ }
152
+ else {
153
+ if (job.images.length === 0)
154
+ throw remoteError('REMOTE_UNSUPPORTED', 'This workflow needs a source image.', job.workflow);
155
+ const url = joinUrl(ctx.baseUrl, '/images/edits');
156
+ answer =
157
+ job.model.options?.['edit_transport'] === 'multipart'
158
+ ? await callProvider(ctx, url, { form: await editForm(job), timeoutMs: GENERATE_TIMEOUT_MS })
159
+ : await callProvider(ctx, url, { json: await editBody(job), timeoutMs: GENERATE_TIMEOUT_MS });
160
+ }
161
+ return imagesFromAnswer(ctx, answer.json);
162
+ },
163
+ };
164
+ //# sourceMappingURL=openai-images.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"openai-images.js","sourceRoot":"","sources":["../../../src/media/adapters/openai-images.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,34 @@
1
+ /**
2
+ * `openai-videos`: the shape of the OpenAI Videos API. OpenAI shut its own Videos API down on
3
+ * 2026-09-24; the shape lives on at Eden AI (`https://api.edenai.run/v3`) and in OpenAI-compatible
4
+ * servers, another Atomic Chat core among them (`http://host:1337/v1`, text to video only).
5
+ *
6
+ * Every URL is the registered `ctx.baseUrl` joined with a fixed path:
7
+ * - submit: `POST {base}/videos`. `create` sends JSON `{model, prompt, seconds, size, seed,
8
+ * negative_prompt}`. `image-to-video` sends multipart with the first frame as the `input_reference`
9
+ * file part: OpenAI's own form, and the one Eden AI documents for a local image (its JSON
10
+ * `input_reference.image_url` must be a public URL; data URLs are refused). A model whose
11
+ * `options.input_reference` is `image_url` gets JSON `input_reference: {image_url: <data URL>}`
12
+ * instead, for a server that takes it. There is no last frame in this API.
13
+ * - poll: `GET {base}/videos/{id}` → `queued | in_progress | completed | failed` (`cancelled` and
14
+ * `expired` fail too), `progress` 0..100, `error: {code, message}`.
15
+ * - download: `GET {base}/videos/{id}/content`. Eden AI answers with a redirect to a signed URL;
16
+ * `downloadResult` follows it and leaves the key home.
17
+ * - cancel: `DELETE {base}/videos/{id}`, best effort (Eden AI answers 409 while a clip runs).
18
+ * - models: `GET {base}/videos/models` (Eden AI); a server without that route lists none.
19
+ *
20
+ * `seconds` goes as a number (Eden AI's schema; the Atomic core takes both); a model whose
21
+ * `options.seconds_as_string` is true gets OpenAI's original string form (`"8"`).
22
+ */
23
+ import type { AtomicCoreError } from '../../contracts/index.js';
24
+ import type { LiveMediaModel } from '../catalog.js';
25
+ import type { VideoAdapter, VideoGenerationJob, VideoPoll } from './types.js';
26
+ /** The plain fields of a submit, each only when the job set it and the model offers it. */
27
+ export declare function openaiVideoFields(job: VideoGenerationJob): Record<string, string | number>;
28
+ /** A failed job's `error` as the closest `REMOTE_*` code, with the provider's words. */
29
+ export declare function openaiVideoError(provider: string, status: string, error: unknown): AtomicCoreError;
30
+ /** One video object (`GET {base}/videos/{id}`, or the submit's answer) as a poll result. */
31
+ export declare function readOpenaiVideo(provider: string, json: unknown): VideoPoll;
32
+ /** The models of a `GET {base}/videos/models` answer (`{data: [{id}]}`). */
33
+ export declare function openaiVideoModels(json: unknown): LiveMediaModel[];
34
+ export declare const OPENAI_VIDEOS: VideoAdapter;
@@ -0,0 +1,175 @@
1
+ /**
2
+ * `openai-videos`: the shape of the OpenAI Videos API. OpenAI shut its own Videos API down on
3
+ * 2026-09-24; the shape lives on at Eden AI (`https://api.edenai.run/v3`) and in OpenAI-compatible
4
+ * servers, another Atomic Chat core among them (`http://host:1337/v1`, text to video only).
5
+ *
6
+ * Every URL is the registered `ctx.baseUrl` joined with a fixed path:
7
+ * - submit: `POST {base}/videos`. `create` sends JSON `{model, prompt, seconds, size, seed,
8
+ * negative_prompt}`. `image-to-video` sends multipart with the first frame as the `input_reference`
9
+ * file part: OpenAI's own form, and the one Eden AI documents for a local image (its JSON
10
+ * `input_reference.image_url` must be a public URL; data URLs are refused). A model whose
11
+ * `options.input_reference` is `image_url` gets JSON `input_reference: {image_url: <data URL>}`
12
+ * instead, for a server that takes it. There is no last frame in this API.
13
+ * - poll: `GET {base}/videos/{id}` → `queued | in_progress | completed | failed` (`cancelled` and
14
+ * `expired` fail too), `progress` 0..100, `error: {code, message}`.
15
+ * - download: `GET {base}/videos/{id}/content`. Eden AI answers with a redirect to a signed URL;
16
+ * `downloadResult` follows it and leaves the key home.
17
+ * - cancel: `DELETE {base}/videos/{id}`, best effort (Eden AI answers 409 while a clip runs).
18
+ * - models: `GET {base}/videos/models` (Eden AI); a server without that route lists none.
19
+ *
20
+ * `seconds` goes as a number (Eden AI's schema; the Atomic core takes both); a model whose
21
+ * `options.seconds_as_string` is true gets OpenAI's original string form (`"8"`).
22
+ */
23
+ import { callProvider, downloadResult, joinUrl, MAX_VIDEO_BYTES, providerMessage, remoteError, SHORT_TIMEOUT_MS, sniffVideoMime, toDataUrl, } from '../http.js';
24
+ const isObject = (value) => value !== null && typeof value === 'object' && !Array.isArray(value);
25
+ const BLOCKED = /moderation|content[ _-]?polic|safety|nsfw|sensitive|prohibited|blocked|flagged/i;
26
+ /** The plain fields of a submit, each only when the job set it and the model offers it. */
27
+ export function openaiVideoFields(job) {
28
+ const params = job.model.params;
29
+ const body = { model: job.model.id, prompt: job.prompt };
30
+ if (job.durationSecs !== undefined && params.durations)
31
+ body['seconds'] =
32
+ job.model.options?.['seconds_as_string'] === true ? String(job.durationSecs) : job.durationSecs;
33
+ if (job.size && params.sizes)
34
+ body['size'] = job.size;
35
+ if (job.seed !== undefined && params.seed)
36
+ body['seed'] = job.seed;
37
+ if (job.negativePrompt && params.negative_prompt)
38
+ body['negative_prompt'] = job.negativePrompt;
39
+ return body;
40
+ }
41
+ /** A failed job's `error` as the closest `REMOTE_*` code, with the provider's words. */
42
+ export function openaiVideoError(provider, status, error) {
43
+ const code = isObject(error) && typeof error['code'] === 'string' ? error['code'] : '';
44
+ const said = providerMessage({ error });
45
+ const details = [code, said].filter(Boolean).join(': ') || status;
46
+ if (BLOCKED.test(`${code} ${said ?? ''}`))
47
+ return remoteError('REMOTE_CONTENT_BLOCKED', `${provider} refused the request: ${said ?? code}`, details);
48
+ if (/invalid|unsupported|bad_request/i.test(code))
49
+ return remoteError('REMOTE_REJECTED', said ? `${provider}: ${said}` : `${provider} refused the request.`, details);
50
+ if (status === 'cancelled' || status === 'canceled')
51
+ return remoteError('REMOTE_UNAVAILABLE', `${provider} cancelled the clip.`, details);
52
+ if (status === 'expired')
53
+ return remoteError('REMOTE_UNAVAILABLE', `${provider} let the clip expire.`, details);
54
+ return remoteError('REMOTE_UNAVAILABLE', said ? `${provider} failed to make the clip: ${said}` : `${provider} failed to make the clip.`, details);
55
+ }
56
+ /** `progress` 0..100 as a fraction, when the answer carries one. */
57
+ function progressOf(value) {
58
+ return typeof value === 'number' && Number.isFinite(value)
59
+ ? { progress: Math.min(1, Math.max(0, value / 100)) }
60
+ : {};
61
+ }
62
+ /** One video object (`GET {base}/videos/{id}`, or the submit's answer) as a poll result. */
63
+ export function readOpenaiVideo(provider, json) {
64
+ const fields = isObject(json) ? json : {};
65
+ const status = typeof fields['status'] === 'string' ? fields['status'].toLowerCase() : '';
66
+ switch (status) {
67
+ case 'queued':
68
+ case 'pending':
69
+ return { state: 'queued', ...progressOf(fields['progress']) };
70
+ case 'completed':
71
+ case 'succeeded':
72
+ return { state: 'completed', result: {} };
73
+ case 'failed':
74
+ case 'cancelled':
75
+ case 'canceled':
76
+ case 'expired':
77
+ return { state: 'failed', error: openaiVideoError(provider, status, fields['error']) };
78
+ default:
79
+ // `in_progress`, and anything this core does not know yet: keep polling.
80
+ return { state: 'running', ...progressOf(fields['progress']) };
81
+ }
82
+ }
83
+ /** The models of a `GET {base}/videos/models` answer (`{data: [{id}]}`). */
84
+ export function openaiVideoModels(json) {
85
+ const fields = isObject(json) ? json : {};
86
+ const data = fields['data'] ?? fields['models'] ?? json;
87
+ const out = [];
88
+ const seen = new Set();
89
+ for (const item of Array.isArray(data) ? data : []) {
90
+ if (!isObject(item) || typeof item['id'] !== 'string' || item['id'] === '' || seen.has(item['id']))
91
+ continue;
92
+ seen.add(item['id']);
93
+ const name = typeof item['name'] === 'string' && item['name'] !== '' ? item['name'] : undefined;
94
+ out.push(name ? { id: item['id'], name } : { id: item['id'] });
95
+ }
96
+ return out;
97
+ }
98
+ function videoUrl(ctx, id, suffix = '') {
99
+ return joinUrl(ctx.baseUrl, `/videos/${encodeURIComponent(id)}${suffix}`);
100
+ }
101
+ function submitForm(job, frame) {
102
+ const form = new FormData();
103
+ for (const [key, value] of Object.entries(openaiVideoFields(job)))
104
+ form.append(key, String(value));
105
+ const ext = frame.mime.split('/')[1] ?? 'png';
106
+ form.append('input_reference', new Blob([new Uint8Array(frame.bytes)], { type: frame.mime }), `frame.${ext}`);
107
+ return form;
108
+ }
109
+ export const OPENAI_VIDEOS = {
110
+ dialect: 'openai-videos',
111
+ kind: 'video',
112
+ pollIntervalMs: { first: 5_000, max: 20_000 },
113
+ async listModels(ctx) {
114
+ const answer = await callProvider(ctx, joinUrl(ctx.baseUrl, '/videos/models'), {
115
+ accept: [400, 404, 405],
116
+ });
117
+ return answer.status === 200 ? openaiVideoModels(answer.json) : [];
118
+ },
119
+ async submit(ctx, job) {
120
+ const url = joinUrl(ctx.baseUrl, '/videos');
121
+ let answer;
122
+ if (job.workflow === 'image-to-video') {
123
+ if (!job.firstFrame)
124
+ throw remoteError('REMOTE_UNSUPPORTED', 'Image to video needs a first frame.', job.workflow);
125
+ if (job.lastFrame)
126
+ throw remoteError('REMOTE_UNSUPPORTED', `${ctx.provider} takes no last frame.`, job.model.id);
127
+ if (job.model.options?.['input_reference'] === 'image_url') {
128
+ const body = {
129
+ ...openaiVideoFields(job),
130
+ input_reference: { image_url: toDataUrl(job.firstFrame.bytes, job.firstFrame.mime) },
131
+ };
132
+ answer = await callProvider(ctx, url, { json: body });
133
+ }
134
+ else
135
+ answer = await callProvider(ctx, url, { form: submitForm(job, job.firstFrame) });
136
+ }
137
+ else
138
+ answer = await callProvider(ctx, url, { json: openaiVideoFields(job) });
139
+ const fields = isObject(answer.json) ? answer.json : {};
140
+ const id = fields['id'];
141
+ if (typeof id !== 'string' || id === '')
142
+ throw remoteError('REMOTE_UNAVAILABLE', `${ctx.provider} answered without a job id.`, answer.text.slice(0, 500));
143
+ const state = readOpenaiVideo(ctx.provider, fields);
144
+ if (state.state === 'failed')
145
+ throw state.error;
146
+ return { id };
147
+ },
148
+ async poll(ctx, submission) {
149
+ const answer = await callProvider(ctx, videoUrl(ctx, submission.id));
150
+ return readOpenaiVideo(ctx.provider, answer.json);
151
+ },
152
+ async download(ctx, submission) {
153
+ const file = await downloadResult(ctx, videoUrl(ctx, submission.id, '/content'), {
154
+ maxBytes: MAX_VIDEO_BYTES,
155
+ what: 'video',
156
+ });
157
+ const mime = sniffVideoMime(file.bytes);
158
+ if (!mime)
159
+ throw remoteError('REMOTE_UNAVAILABLE', `${ctx.provider} returned a file that is not a video.`);
160
+ return { bytes: file.bytes, mime };
161
+ },
162
+ async cancel(ctx, submission) {
163
+ // The job's signal has usually fired by now (that is why it is cancelled), so the request
164
+ // carries only its own deadline.
165
+ const own = { ...ctx, signal: new AbortController().signal };
166
+ try {
167
+ await callProvider(own, videoUrl(ctx, submission.id), { method: 'DELETE', timeoutMs: SHORT_TIMEOUT_MS });
168
+ }
169
+ catch (error) {
170
+ const said = error instanceof Error ? error.message : String(error);
171
+ ctx.log('debug', `${ctx.provider} did not cancel video ${submission.id}: ${said}`);
172
+ }
173
+ },
174
+ };
175
+ //# sourceMappingURL=openai-videos.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"openai-videos.js","sourceRoot":"","sources":["../../../src/media/adapters/openai-videos.ts"],"names":[],"mappings":"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"}