@nodetool-ai/runtime 0.7.0-rc.23 → 0.8.2

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 (713) hide show
  1. package/README.md +29 -0
  2. package/dist/.nodetool-build-stamp +1 -0
  3. package/dist/agent-memory.d.ts +118 -0
  4. package/dist/agent-memory.d.ts.map +1 -0
  5. package/dist/agent-memory.js +186 -0
  6. package/dist/agent-memory.js.map +1 -0
  7. package/dist/async-local-storage.d.ts +20 -0
  8. package/dist/async-local-storage.d.ts.map +1 -0
  9. package/dist/async-local-storage.js +28 -0
  10. package/dist/async-local-storage.js.map +1 -0
  11. package/dist/blender-executor.d.ts +93 -0
  12. package/dist/blender-executor.d.ts.map +1 -0
  13. package/dist/blender-executor.js +294 -0
  14. package/dist/blender-executor.js.map +1 -0
  15. package/dist/comfy-executor.d.ts +23 -1
  16. package/dist/comfy-executor.d.ts.map +1 -1
  17. package/dist/comfy-executor.js +234 -55
  18. package/dist/comfy-executor.js.map +1 -1
  19. package/dist/context-packer.d.ts +1 -1
  20. package/dist/context-packer.d.ts.map +1 -1
  21. package/dist/context-packer.js +23 -25
  22. package/dist/context-packer.js.map +1 -1
  23. package/dist/context.d.ts +982 -127
  24. package/dist/context.d.ts.map +1 -1
  25. package/dist/context.js +2649 -530
  26. package/dist/context.js.map +1 -1
  27. package/dist/cost-reconciler.d.ts +32 -0
  28. package/dist/cost-reconciler.d.ts.map +1 -0
  29. package/dist/cost-reconciler.js +21 -0
  30. package/dist/cost-reconciler.js.map +1 -0
  31. package/dist/entities.d.ts +33 -0
  32. package/dist/entities.d.ts.map +1 -0
  33. package/dist/entities.js +43 -0
  34. package/dist/entities.js.map +1 -0
  35. package/dist/external-media-fetch.d.ts +29 -0
  36. package/dist/external-media-fetch.d.ts.map +1 -0
  37. package/dist/external-media-fetch.js +38 -0
  38. package/dist/external-media-fetch.js.map +1 -0
  39. package/dist/generation-receipt.d.ts +86 -0
  40. package/dist/generation-receipt.d.ts.map +1 -0
  41. package/dist/generation-receipt.js +137 -0
  42. package/dist/generation-receipt.js.map +1 -0
  43. package/dist/generation-registry.d.ts +75 -0
  44. package/dist/generation-registry.d.ts.map +1 -0
  45. package/dist/generation-registry.js +144 -0
  46. package/dist/generation-registry.js.map +1 -0
  47. package/dist/google/client.d.ts +196 -0
  48. package/dist/google/client.d.ts.map +1 -0
  49. package/dist/google/client.js +396 -0
  50. package/dist/google/client.js.map +1 -0
  51. package/dist/google/index.d.ts +3 -0
  52. package/dist/google/index.d.ts.map +1 -0
  53. package/dist/google/index.js +3 -0
  54. package/dist/google/index.js.map +1 -0
  55. package/dist/google/token.d.ts +15 -0
  56. package/dist/google/token.d.ts.map +1 -0
  57. package/dist/google/token.js +24 -0
  58. package/dist/google/token.js.map +1 -0
  59. package/dist/host-binaries.d.ts +106 -0
  60. package/dist/host-binaries.d.ts.map +1 -0
  61. package/dist/host-binaries.js +352 -0
  62. package/dist/host-binaries.js.map +1 -0
  63. package/dist/image-codec.d.ts +76 -0
  64. package/dist/image-codec.d.ts.map +1 -0
  65. package/dist/image-codec.js +293 -0
  66. package/dist/image-codec.js.map +1 -0
  67. package/dist/image-model-tasks.d.ts +15 -0
  68. package/dist/image-model-tasks.d.ts.map +1 -0
  69. package/dist/image-model-tasks.js +24 -0
  70. package/dist/image-model-tasks.js.map +1 -0
  71. package/dist/index.d.ts +67 -6
  72. package/dist/index.d.ts.map +1 -1
  73. package/dist/index.js +51 -4
  74. package/dist/index.js.map +1 -1
  75. package/dist/invocation-account.d.ts +43 -0
  76. package/dist/invocation-account.d.ts.map +1 -0
  77. package/dist/invocation-account.js +60 -0
  78. package/dist/invocation-account.js.map +1 -0
  79. package/dist/media-ref-bytes.d.ts +35 -0
  80. package/dist/media-ref-bytes.d.ts.map +1 -0
  81. package/dist/media-ref-bytes.js +191 -0
  82. package/dist/media-ref-bytes.js.map +1 -0
  83. package/dist/node-executor.d.ts +119 -2
  84. package/dist/node-executor.d.ts.map +1 -1
  85. package/dist/permission-gate.d.ts +152 -0
  86. package/dist/permission-gate.d.ts.map +1 -0
  87. package/dist/permission-gate.js +87 -0
  88. package/dist/permission-gate.js.map +1 -0
  89. package/dist/prefixed-storage-adapter.d.ts +33 -0
  90. package/dist/prefixed-storage-adapter.d.ts.map +1 -0
  91. package/dist/prefixed-storage-adapter.js +70 -0
  92. package/dist/prefixed-storage-adapter.js.map +1 -0
  93. package/dist/prompt-asset-refs.d.ts +222 -0
  94. package/dist/prompt-asset-refs.d.ts.map +1 -0
  95. package/dist/prompt-asset-refs.js +751 -0
  96. package/dist/prompt-asset-refs.js.map +1 -0
  97. package/dist/provider-cache.d.ts +3 -0
  98. package/dist/provider-cache.d.ts.map +1 -0
  99. package/dist/provider-cache.js +8 -0
  100. package/dist/provider-cache.js.map +1 -0
  101. package/dist/providers/aki-provider.d.ts +35 -10
  102. package/dist/providers/aki-provider.d.ts.map +1 -1
  103. package/dist/providers/aki-provider.js +90 -77
  104. package/dist/providers/aki-provider.js.map +1 -1
  105. package/dist/providers/alibaba-provider.d.ts +39 -0
  106. package/dist/providers/alibaba-provider.d.ts.map +1 -0
  107. package/dist/providers/alibaba-provider.js +86 -0
  108. package/dist/providers/alibaba-provider.js.map +1 -0
  109. package/dist/providers/anthropic-provider.d.ts +52 -3
  110. package/dist/providers/anthropic-provider.d.ts.map +1 -1
  111. package/dist/providers/anthropic-provider.js +1020 -338
  112. package/dist/providers/anthropic-provider.js.map +1 -1
  113. package/dist/providers/atlascloud-provider.d.ts +103 -0
  114. package/dist/providers/atlascloud-provider.d.ts.map +1 -0
  115. package/dist/providers/atlascloud-provider.js +1031 -0
  116. package/dist/providers/atlascloud-provider.js.map +1 -0
  117. package/dist/providers/atlascloud-transport.d.ts +100 -0
  118. package/dist/providers/atlascloud-transport.d.ts.map +1 -0
  119. package/dist/providers/atlascloud-transport.js +364 -0
  120. package/dist/providers/atlascloud-transport.js.map +1 -0
  121. package/dist/providers/atlascloud-webhook-registry.d.ts +35 -0
  122. package/dist/providers/atlascloud-webhook-registry.d.ts.map +1 -0
  123. package/dist/providers/atlascloud-webhook-registry.js +104 -0
  124. package/dist/providers/atlascloud-webhook-registry.js.map +1 -0
  125. package/dist/providers/audio-mime.d.ts +11 -0
  126. package/dist/providers/audio-mime.d.ts.map +1 -0
  127. package/dist/providers/audio-mime.js +46 -0
  128. package/dist/providers/audio-mime.js.map +1 -0
  129. package/dist/providers/base-provider.d.ts +501 -32
  130. package/dist/providers/base-provider.d.ts.map +1 -1
  131. package/dist/providers/base-provider.js +1280 -87
  132. package/dist/providers/base-provider.js.map +1 -1
  133. package/dist/providers/cassette-provider.d.ts +217 -0
  134. package/dist/providers/cassette-provider.d.ts.map +1 -0
  135. package/dist/providers/cassette-provider.js +502 -0
  136. package/dist/providers/cassette-provider.js.map +1 -0
  137. package/dist/providers/cerebras-provider.d.ts +6 -12
  138. package/dist/providers/cerebras-provider.d.ts.map +1 -1
  139. package/dist/providers/cerebras-provider.js +8 -33
  140. package/dist/providers/cerebras-provider.js.map +1 -1
  141. package/dist/providers/claude-agent-provider.d.ts +107 -74
  142. package/dist/providers/claude-agent-provider.d.ts.map +1 -1
  143. package/dist/providers/claude-agent-provider.js +1279 -517
  144. package/dist/providers/claude-agent-provider.js.map +1 -1
  145. package/dist/providers/codex-provider.d.ts +84 -0
  146. package/dist/providers/codex-provider.d.ts.map +1 -0
  147. package/dist/providers/codex-provider.js +505 -0
  148. package/dist/providers/codex-provider.js.map +1 -0
  149. package/dist/providers/cohere-provider.d.ts +7 -3
  150. package/dist/providers/cohere-provider.d.ts.map +1 -1
  151. package/dist/providers/cohere-provider.js +14 -2
  152. package/dist/providers/cohere-provider.js.map +1 -1
  153. package/dist/providers/comfy-cloud-provider.d.ts +30 -0
  154. package/dist/providers/comfy-cloud-provider.d.ts.map +1 -0
  155. package/dist/providers/comfy-cloud-provider.js +42 -0
  156. package/dist/providers/comfy-cloud-provider.js.map +1 -0
  157. package/dist/providers/content-filter.d.ts +46 -0
  158. package/dist/providers/content-filter.d.ts.map +1 -0
  159. package/dist/providers/content-filter.js +92 -0
  160. package/dist/providers/content-filter.js.map +1 -0
  161. package/dist/providers/context-exceeded.d.ts +37 -0
  162. package/dist/providers/context-exceeded.d.ts.map +1 -0
  163. package/dist/providers/context-exceeded.js +114 -0
  164. package/dist/providers/context-exceeded.js.map +1 -0
  165. package/dist/providers/context-window.d.ts +44 -0
  166. package/dist/providers/context-window.d.ts.map +1 -0
  167. package/dist/providers/context-window.js +145 -0
  168. package/dist/providers/context-window.js.map +1 -0
  169. package/dist/providers/contract/index.d.ts +4 -0
  170. package/dist/providers/contract/index.d.ts.map +1 -0
  171. package/dist/providers/contract/index.js +4 -0
  172. package/dist/providers/contract/index.js.map +1 -0
  173. package/dist/providers/contract/probe-manifest.d.ts +75 -0
  174. package/dist/providers/contract/probe-manifest.d.ts.map +1 -0
  175. package/dist/providers/contract/probe-manifest.js +379 -0
  176. package/dist/providers/contract/probe-manifest.js.map +1 -0
  177. package/dist/providers/contract/probe-runner.d.ts +57 -0
  178. package/dist/providers/contract/probe-runner.d.ts.map +1 -0
  179. package/dist/providers/contract/probe-runner.js +180 -0
  180. package/dist/providers/contract/probe-runner.js.map +1 -0
  181. package/dist/providers/contract/redact.d.ts +29 -0
  182. package/dist/providers/contract/redact.d.ts.map +1 -0
  183. package/dist/providers/contract/redact.js +113 -0
  184. package/dist/providers/contract/redact.js.map +1 -0
  185. package/dist/providers/core-tools.d.ts +75 -0
  186. package/dist/providers/core-tools.d.ts.map +1 -0
  187. package/dist/providers/core-tools.js +128 -0
  188. package/dist/providers/core-tools.js.map +1 -0
  189. package/dist/providers/cost-calculator.d.ts +69 -50
  190. package/dist/providers/cost-calculator.d.ts.map +1 -1
  191. package/dist/providers/cost-calculator.js +207 -397
  192. package/dist/providers/cost-calculator.js.map +1 -1
  193. package/dist/providers/credential-check.d.ts +45 -0
  194. package/dist/providers/credential-check.d.ts.map +1 -0
  195. package/dist/providers/credential-check.js +164 -0
  196. package/dist/providers/credential-check.js.map +1 -0
  197. package/dist/providers/custom-model-kinds.d.ts +33 -0
  198. package/dist/providers/custom-model-kinds.d.ts.map +1 -0
  199. package/dist/providers/custom-model-kinds.js +96 -0
  200. package/dist/providers/custom-model-kinds.js.map +1 -0
  201. package/dist/providers/custom-openai-provider.d.ts +83 -0
  202. package/dist/providers/custom-openai-provider.d.ts.map +1 -0
  203. package/dist/providers/custom-openai-provider.js +190 -0
  204. package/dist/providers/custom-openai-provider.js.map +1 -0
  205. package/dist/providers/custom-provider-registry.d.ts +19 -0
  206. package/dist/providers/custom-provider-registry.d.ts.map +1 -0
  207. package/dist/providers/custom-provider-registry.js +52 -0
  208. package/dist/providers/custom-provider-registry.js.map +1 -0
  209. package/dist/providers/deepseek-provider.d.ts +8 -14
  210. package/dist/providers/deepseek-provider.d.ts.map +1 -1
  211. package/dist/providers/deepseek-provider.js +6 -35
  212. package/dist/providers/deepseek-provider.js.map +1 -1
  213. package/dist/providers/defaults.d.ts +12 -0
  214. package/dist/providers/defaults.d.ts.map +1 -0
  215. package/dist/providers/defaults.js +12 -0
  216. package/dist/providers/defaults.js.map +1 -0
  217. package/dist/providers/dreamina-models.d.ts +5 -0
  218. package/dist/providers/dreamina-models.d.ts.map +1 -0
  219. package/dist/providers/dreamina-models.js +57 -0
  220. package/dist/providers/dreamina-models.js.map +1 -0
  221. package/dist/providers/dreamina-music.d.ts +52 -0
  222. package/dist/providers/dreamina-music.d.ts.map +1 -0
  223. package/dist/providers/dreamina-music.js +115 -0
  224. package/dist/providers/dreamina-music.js.map +1 -0
  225. package/dist/providers/dreamina-provider.d.ts +62 -0
  226. package/dist/providers/dreamina-provider.d.ts.map +1 -0
  227. package/dist/providers/dreamina-provider.js +790 -0
  228. package/dist/providers/dreamina-provider.js.map +1 -0
  229. package/dist/providers/elevenlabs-provider.d.ts +50 -0
  230. package/dist/providers/elevenlabs-provider.d.ts.map +1 -0
  231. package/dist/providers/elevenlabs-provider.js +147 -0
  232. package/dist/providers/elevenlabs-provider.js.map +1 -0
  233. package/dist/providers/entity-references.d.ts +31 -0
  234. package/dist/providers/entity-references.d.ts.map +1 -0
  235. package/dist/providers/entity-references.js +113 -0
  236. package/dist/providers/entity-references.js.map +1 -0
  237. package/dist/providers/evolink-provider.d.ts +40 -0
  238. package/dist/providers/evolink-provider.d.ts.map +1 -0
  239. package/dist/providers/evolink-provider.js +312 -0
  240. package/dist/providers/evolink-provider.js.map +1 -0
  241. package/dist/providers/fake-provider.d.ts +74 -2
  242. package/dist/providers/fake-provider.d.ts.map +1 -1
  243. package/dist/providers/fake-provider.js +213 -1
  244. package/dist/providers/fake-provider.js.map +1 -1
  245. package/dist/providers/fal-generations.d.ts +106 -0
  246. package/dist/providers/fal-generations.d.ts.map +1 -0
  247. package/dist/providers/fal-generations.js +286 -0
  248. package/dist/providers/fal-generations.js.map +1 -0
  249. package/dist/providers/fal-provider.d.ts +173 -8
  250. package/dist/providers/fal-provider.d.ts.map +1 -1
  251. package/dist/providers/fal-provider.js +1396 -64
  252. package/dist/providers/fal-provider.js.map +1 -1
  253. package/dist/providers/fal-queue.d.ts +47 -0
  254. package/dist/providers/fal-queue.d.ts.map +1 -0
  255. package/dist/providers/fal-queue.js +231 -0
  256. package/dist/providers/fal-queue.js.map +1 -0
  257. package/dist/providers/gemini-provider.d.ts +150 -9
  258. package/dist/providers/gemini-provider.d.ts.map +1 -1
  259. package/dist/providers/gemini-provider.js +1515 -316
  260. package/dist/providers/gemini-provider.js.map +1 -1
  261. package/dist/providers/gmi-provider.d.ts +21 -0
  262. package/dist/providers/gmi-provider.d.ts.map +1 -0
  263. package/dist/providers/gmi-provider.js +34 -0
  264. package/dist/providers/gmi-provider.js.map +1 -0
  265. package/dist/providers/gpt-image-size.d.ts +3 -0
  266. package/dist/providers/gpt-image-size.d.ts.map +1 -0
  267. package/dist/providers/gpt-image-size.js +37 -0
  268. package/dist/providers/gpt-image-size.js.map +1 -0
  269. package/dist/providers/groq-provider.d.ts +9 -12
  270. package/dist/providers/groq-provider.d.ts.map +1 -1
  271. package/dist/providers/groq-provider.js +19 -33
  272. package/dist/providers/groq-provider.js.map +1 -1
  273. package/dist/providers/groq-request.d.ts +38 -0
  274. package/dist/providers/groq-request.d.ts.map +1 -0
  275. package/dist/providers/groq-request.js +138 -0
  276. package/dist/providers/groq-request.js.map +1 -0
  277. package/dist/providers/higgsfield-provider.d.ts +31 -0
  278. package/dist/providers/higgsfield-provider.d.ts.map +1 -0
  279. package/dist/providers/higgsfield-provider.js +143 -0
  280. package/dist/providers/higgsfield-provider.js.map +1 -0
  281. package/dist/providers/higgsfield-transport.d.ts +106 -0
  282. package/dist/providers/higgsfield-transport.d.ts.map +1 -0
  283. package/dist/providers/higgsfield-transport.js +182 -0
  284. package/dist/providers/higgsfield-transport.js.map +1 -0
  285. package/dist/providers/http-transport.d.ts +74 -0
  286. package/dist/providers/http-transport.d.ts.map +1 -0
  287. package/dist/providers/http-transport.js +152 -0
  288. package/dist/providers/http-transport.js.map +1 -0
  289. package/dist/providers/huggingface-provider.d.ts +73 -4
  290. package/dist/providers/huggingface-provider.d.ts.map +1 -1
  291. package/dist/providers/huggingface-provider.js +240 -34
  292. package/dist/providers/huggingface-provider.js.map +1 -1
  293. package/dist/providers/image-mime.d.ts +39 -0
  294. package/dist/providers/image-mime.d.ts.map +1 -0
  295. package/dist/providers/image-mime.js +111 -0
  296. package/dist/providers/image-mime.js.map +1 -0
  297. package/dist/providers/image-ref.d.ts +21 -0
  298. package/dist/providers/image-ref.d.ts.map +1 -0
  299. package/dist/providers/image-ref.js +44 -0
  300. package/dist/providers/image-ref.js.map +1 -0
  301. package/dist/providers/index.d.ts +87 -8
  302. package/dist/providers/index.d.ts.map +1 -1
  303. package/dist/providers/index.js +250 -56
  304. package/dist/providers/index.js.map +1 -1
  305. package/dist/providers/jina-provider.d.ts +12 -3
  306. package/dist/providers/jina-provider.d.ts.map +1 -1
  307. package/dist/providers/jina-provider.js +21 -7
  308. package/dist/providers/jina-provider.js.map +1 -1
  309. package/dist/providers/kie-provider.d.ts +172 -10
  310. package/dist/providers/kie-provider.d.ts.map +1 -1
  311. package/dist/providers/kie-provider.js +1190 -228
  312. package/dist/providers/kie-provider.js.map +1 -1
  313. package/dist/providers/kie-webhook-registry.d.ts +28 -0
  314. package/dist/providers/kie-webhook-registry.d.ts.map +1 -0
  315. package/dist/providers/kie-webhook-registry.js +91 -0
  316. package/dist/providers/kie-webhook-registry.js.map +1 -0
  317. package/dist/providers/llama-provider.d.ts +23 -36
  318. package/dist/providers/llama-provider.d.ts.map +1 -1
  319. package/dist/providers/llama-provider.js +50 -355
  320. package/dist/providers/llama-provider.js.map +1 -1
  321. package/dist/providers/lmstudio-provider.d.ts +4 -7
  322. package/dist/providers/lmstudio-provider.d.ts.map +1 -1
  323. package/dist/providers/lmstudio-provider.js +24 -15
  324. package/dist/providers/lmstudio-provider.js.map +1 -1
  325. package/dist/providers/loop-tracing.d.ts +17 -0
  326. package/dist/providers/loop-tracing.d.ts.map +1 -0
  327. package/dist/providers/loop-tracing.js +132 -0
  328. package/dist/providers/loop-tracing.js.map +1 -0
  329. package/dist/providers/manifest-models.d.ts +341 -1
  330. package/dist/providers/manifest-models.d.ts.map +1 -1
  331. package/dist/providers/manifest-models.js +1106 -22
  332. package/dist/providers/manifest-models.js.map +1 -1
  333. package/dist/providers/media-mime.d.ts +14 -0
  334. package/dist/providers/media-mime.d.ts.map +1 -0
  335. package/dist/providers/media-mime.js +35 -0
  336. package/dist/providers/media-mime.js.map +1 -0
  337. package/dist/providers/meshy-provider.d.ts +16 -2
  338. package/dist/providers/meshy-provider.d.ts.map +1 -1
  339. package/dist/providers/meshy-provider.js +82 -46
  340. package/dist/providers/meshy-provider.js.map +1 -1
  341. package/dist/providers/meta-provider.d.ts +22 -0
  342. package/dist/providers/meta-provider.d.ts.map +1 -0
  343. package/dist/providers/meta-provider.js +54 -0
  344. package/dist/providers/meta-provider.js.map +1 -0
  345. package/dist/providers/minimax-provider.d.ts +27 -18
  346. package/dist/providers/minimax-provider.d.ts.map +1 -1
  347. package/dist/providers/minimax-provider.js +222 -72
  348. package/dist/providers/minimax-provider.js.map +1 -1
  349. package/dist/providers/mistral-provider.d.ts +8 -12
  350. package/dist/providers/mistral-provider.d.ts.map +1 -1
  351. package/dist/providers/mistral-provider.js +15 -34
  352. package/dist/providers/mistral-provider.js.map +1 -1
  353. package/dist/providers/moonshot-provider.d.ts +11 -15
  354. package/dist/providers/moonshot-provider.d.ts.map +1 -1
  355. package/dist/providers/moonshot-provider.js +33 -23
  356. package/dist/providers/moonshot-provider.js.map +1 -1
  357. package/dist/providers/node-llama-cpp-provider.d.ts +99 -0
  358. package/dist/providers/node-llama-cpp-provider.d.ts.map +1 -0
  359. package/dist/providers/node-llama-cpp-provider.js +484 -0
  360. package/dist/providers/node-llama-cpp-provider.js.map +1 -0
  361. package/dist/providers/nodetool-provider.d.ts +49 -0
  362. package/dist/providers/nodetool-provider.d.ts.map +1 -0
  363. package/dist/providers/nodetool-provider.js +222 -0
  364. package/dist/providers/nodetool-provider.js.map +1 -0
  365. package/dist/providers/oauth/browser-launcher.d.ts +23 -0
  366. package/dist/providers/oauth/browser-launcher.d.ts.map +1 -0
  367. package/dist/providers/oauth/browser-launcher.js +45 -0
  368. package/dist/providers/oauth/browser-launcher.js.map +1 -0
  369. package/dist/providers/oauth/claude-code-credentials.d.ts +74 -0
  370. package/dist/providers/oauth/claude-code-credentials.d.ts.map +1 -0
  371. package/dist/providers/oauth/claude-code-credentials.js +133 -0
  372. package/dist/providers/oauth/claude-code-credentials.js.map +1 -0
  373. package/dist/providers/oauth/claude-code-login.d.ts +124 -0
  374. package/dist/providers/oauth/claude-code-login.d.ts.map +1 -0
  375. package/dist/providers/oauth/claude-code-login.js +230 -0
  376. package/dist/providers/oauth/claude-code-login.js.map +1 -0
  377. package/dist/providers/oauth/claude-code-oauth-client.d.ts +111 -0
  378. package/dist/providers/oauth/claude-code-oauth-client.d.ts.map +1 -0
  379. package/dist/providers/oauth/claude-code-oauth-client.js +207 -0
  380. package/dist/providers/oauth/claude-code-oauth-client.js.map +1 -0
  381. package/dist/providers/oauth/errors.d.ts +54 -0
  382. package/dist/providers/oauth/errors.d.ts.map +1 -0
  383. package/dist/providers/oauth/errors.js +79 -0
  384. package/dist/providers/oauth/errors.js.map +1 -0
  385. package/dist/providers/oauth/index.d.ts +105 -0
  386. package/dist/providers/oauth/index.d.ts.map +1 -0
  387. package/dist/providers/oauth/index.js +167 -0
  388. package/dist/providers/oauth/index.js.map +1 -0
  389. package/dist/providers/oauth/jwt-claims.d.ts +23 -0
  390. package/dist/providers/oauth/jwt-claims.d.ts.map +1 -0
  391. package/dist/providers/oauth/jwt-claims.js +67 -0
  392. package/dist/providers/oauth/jwt-claims.js.map +1 -0
  393. package/dist/providers/oauth/local-callback-server.d.ts +60 -0
  394. package/dist/providers/oauth/local-callback-server.d.ts.map +1 -0
  395. package/dist/providers/oauth/local-callback-server.js +148 -0
  396. package/dist/providers/oauth/local-callback-server.js.map +1 -0
  397. package/dist/providers/oauth/oauth-client.d.ts +55 -0
  398. package/dist/providers/oauth/oauth-client.d.ts.map +1 -0
  399. package/dist/providers/oauth/oauth-client.js +161 -0
  400. package/dist/providers/oauth/oauth-client.js.map +1 -0
  401. package/dist/providers/oauth/openai-oauth-provider.d.ts +129 -0
  402. package/dist/providers/oauth/openai-oauth-provider.d.ts.map +1 -0
  403. package/dist/providers/oauth/openai-oauth-provider.js +265 -0
  404. package/dist/providers/oauth/openai-oauth-provider.js.map +1 -0
  405. package/dist/providers/oauth/pkce-helper.d.ts +43 -0
  406. package/dist/providers/oauth/pkce-helper.d.ts.map +1 -0
  407. package/dist/providers/oauth/pkce-helper.js +57 -0
  408. package/dist/providers/oauth/pkce-helper.js.map +1 -0
  409. package/dist/providers/oauth/redaction.d.ts +22 -0
  410. package/dist/providers/oauth/redaction.d.ts.map +1 -0
  411. package/dist/providers/oauth/redaction.js +59 -0
  412. package/dist/providers/oauth/redaction.js.map +1 -0
  413. package/dist/providers/oauth/secure-credential-store.d.ts +67 -0
  414. package/dist/providers/oauth/secure-credential-store.d.ts.map +1 -0
  415. package/dist/providers/oauth/secure-credential-store.js +73 -0
  416. package/dist/providers/oauth/secure-credential-store.js.map +1 -0
  417. package/dist/providers/oauth/token-store.d.ts +53 -0
  418. package/dist/providers/oauth/token-store.d.ts.map +1 -0
  419. package/dist/providers/oauth/token-store.js +78 -0
  420. package/dist/providers/oauth/token-store.js.map +1 -0
  421. package/dist/providers/oauth/types.d.ts +64 -0
  422. package/dist/providers/oauth/types.d.ts.map +1 -0
  423. package/dist/providers/oauth/types.js +12 -0
  424. package/dist/providers/oauth/types.js.map +1 -0
  425. package/dist/providers/object-tracking.d.ts +47 -0
  426. package/dist/providers/object-tracking.d.ts.map +1 -0
  427. package/dist/providers/object-tracking.js +46 -0
  428. package/dist/providers/object-tracking.js.map +1 -0
  429. package/dist/providers/offline-model-index.d.ts +20 -0
  430. package/dist/providers/offline-model-index.d.ts.map +1 -0
  431. package/dist/providers/offline-model-index.js +112 -0
  432. package/dist/providers/offline-model-index.js.map +1 -0
  433. package/dist/providers/ollama-provider.d.ts +30 -2
  434. package/dist/providers/ollama-provider.d.ts.map +1 -1
  435. package/dist/providers/ollama-provider.js +198 -43
  436. package/dist/providers/ollama-provider.js.map +1 -1
  437. package/dist/providers/openai-compat/client.d.ts +57 -0
  438. package/dist/providers/openai-compat/client.d.ts.map +1 -0
  439. package/dist/providers/openai-compat/client.js +157 -0
  440. package/dist/providers/openai-compat/client.js.map +1 -0
  441. package/dist/providers/openai-compat/decode.d.ts +36 -0
  442. package/dist/providers/openai-compat/decode.d.ts.map +1 -0
  443. package/dist/providers/openai-compat/decode.js +55 -0
  444. package/dist/providers/openai-compat/decode.js.map +1 -0
  445. package/dist/providers/openai-compat/errors.d.ts +54 -0
  446. package/dist/providers/openai-compat/errors.d.ts.map +1 -0
  447. package/dist/providers/openai-compat/errors.js +144 -0
  448. package/dist/providers/openai-compat/errors.js.map +1 -0
  449. package/dist/providers/openai-compat/index.d.ts +8 -0
  450. package/dist/providers/openai-compat/index.d.ts.map +1 -0
  451. package/dist/providers/openai-compat/index.js +5 -0
  452. package/dist/providers/openai-compat/index.js.map +1 -0
  453. package/dist/providers/openai-compat/sse.d.ts +14 -0
  454. package/dist/providers/openai-compat/sse.d.ts.map +1 -0
  455. package/dist/providers/openai-compat/sse.js +69 -0
  456. package/dist/providers/openai-compat/sse.js.map +1 -0
  457. package/dist/providers/openai-compat/types.d.ts +75 -0
  458. package/dist/providers/openai-compat/types.d.ts.map +1 -0
  459. package/dist/providers/openai-compat/types.js +9 -0
  460. package/dist/providers/openai-compat/types.js.map +1 -0
  461. package/dist/providers/openai-compat-provider.d.ts +90 -0
  462. package/dist/providers/openai-compat-provider.d.ts.map +1 -0
  463. package/dist/providers/openai-compat-provider.js +282 -0
  464. package/dist/providers/openai-compat-provider.js.map +1 -0
  465. package/dist/providers/openai-provider.d.ts +98 -27
  466. package/dist/providers/openai-provider.d.ts.map +1 -1
  467. package/dist/providers/openai-provider.js +1037 -105
  468. package/dist/providers/openai-provider.js.map +1 -1
  469. package/dist/providers/openrouter-provider.d.ts +58 -13
  470. package/dist/providers/openrouter-provider.d.ts.map +1 -1
  471. package/dist/providers/openrouter-provider.js +383 -51
  472. package/dist/providers/openrouter-provider.js.map +1 -1
  473. package/dist/providers/provider-call-failure.d.ts +39 -0
  474. package/dist/providers/provider-call-failure.d.ts.map +1 -0
  475. package/dist/providers/provider-call-failure.js +132 -0
  476. package/dist/providers/provider-call-failure.js.map +1 -0
  477. package/dist/providers/provider-error.d.ts +59 -0
  478. package/dist/providers/provider-error.d.ts.map +1 -0
  479. package/dist/providers/provider-error.js +171 -0
  480. package/dist/providers/provider-error.js.map +1 -0
  481. package/dist/providers/provider-generations.d.ts +99 -0
  482. package/dist/providers/provider-generations.d.ts.map +1 -0
  483. package/dist/providers/provider-generations.js +71 -0
  484. package/dist/providers/provider-generations.js.map +1 -0
  485. package/dist/providers/provider-queue.d.ts +62 -0
  486. package/dist/providers/provider-queue.d.ts.map +1 -0
  487. package/dist/providers/provider-queue.js +28 -0
  488. package/dist/providers/provider-queue.js.map +1 -0
  489. package/dist/providers/provider-registry.d.ts +33 -14
  490. package/dist/providers/provider-registry.d.ts.map +1 -1
  491. package/dist/providers/provider-registry.js +85 -68
  492. package/dist/providers/provider-registry.js.map +1 -1
  493. package/dist/providers/provider-request-log.d.ts +53 -0
  494. package/dist/providers/provider-request-log.d.ts.map +1 -0
  495. package/dist/providers/provider-request-log.js +168 -0
  496. package/dist/providers/provider-request-log.js.map +1 -0
  497. package/dist/providers/provider-session.d.ts +3 -0
  498. package/dist/providers/provider-session.d.ts.map +1 -0
  499. package/dist/providers/provider-session.js +10 -0
  500. package/dist/providers/provider-session.js.map +1 -0
  501. package/dist/providers/provider-transport.d.ts +11 -0
  502. package/dist/providers/provider-transport.d.ts.map +1 -0
  503. package/dist/providers/provider-transport.js +11 -0
  504. package/dist/providers/provider-transport.js.map +1 -0
  505. package/dist/providers/python-provider.d.ts +26 -13
  506. package/dist/providers/python-provider.d.ts.map +1 -1
  507. package/dist/providers/python-provider.js +204 -25
  508. package/dist/providers/python-provider.js.map +1 -1
  509. package/dist/providers/replicate-provider.d.ts +91 -8
  510. package/dist/providers/replicate-provider.d.ts.map +1 -1
  511. package/dist/providers/replicate-provider.js +823 -65
  512. package/dist/providers/replicate-provider.js.map +1 -1
  513. package/dist/providers/replicate-retry.d.ts +30 -0
  514. package/dist/providers/replicate-retry.d.ts.map +1 -0
  515. package/dist/providers/replicate-retry.js +97 -0
  516. package/dist/providers/replicate-retry.js.map +1 -0
  517. package/dist/providers/requesty-provider.d.ts +30 -0
  518. package/dist/providers/requesty-provider.d.ts.map +1 -0
  519. package/dist/providers/requesty-provider.js +87 -0
  520. package/dist/providers/requesty-provider.js.map +1 -0
  521. package/dist/providers/responses-api.d.ts +27 -0
  522. package/dist/providers/responses-api.d.ts.map +1 -0
  523. package/dist/providers/responses-api.js +297 -0
  524. package/dist/providers/responses-api.js.map +1 -0
  525. package/dist/providers/reve-provider.d.ts +46 -0
  526. package/dist/providers/reve-provider.d.ts.map +1 -0
  527. package/dist/providers/reve-provider.js +165 -0
  528. package/dist/providers/reve-provider.js.map +1 -0
  529. package/dist/providers/rodin-provider.d.ts +25 -2
  530. package/dist/providers/rodin-provider.d.ts.map +1 -1
  531. package/dist/providers/rodin-provider.js +95 -51
  532. package/dist/providers/rodin-provider.js.map +1 -1
  533. package/dist/providers/safe-url.d.ts +70 -0
  534. package/dist/providers/safe-url.d.ts.map +1 -0
  535. package/dist/providers/safe-url.js +277 -0
  536. package/dist/providers/safe-url.js.map +1 -0
  537. package/dist/providers/scripted-provider.d.ts +9 -0
  538. package/dist/providers/scripted-provider.d.ts.map +1 -1
  539. package/dist/providers/scripted-provider.js +86 -10
  540. package/dist/providers/scripted-provider.js.map +1 -1
  541. package/dist/providers/structured-output.d.ts +42 -0
  542. package/dist/providers/structured-output.d.ts.map +1 -0
  543. package/dist/providers/structured-output.js +83 -0
  544. package/dist/providers/structured-output.js.map +1 -0
  545. package/dist/providers/together-operations.d.ts +27 -0
  546. package/dist/providers/together-operations.d.ts.map +1 -0
  547. package/dist/providers/together-operations.js +95 -0
  548. package/dist/providers/together-operations.js.map +1 -0
  549. package/dist/providers/together-provider.d.ts +18 -18
  550. package/dist/providers/together-provider.d.ts.map +1 -1
  551. package/dist/providers/together-provider.js +140 -367
  552. package/dist/providers/together-provider.js.map +1 -1
  553. package/dist/providers/topaz-provider.d.ts +45 -0
  554. package/dist/providers/topaz-provider.d.ts.map +1 -0
  555. package/dist/providers/topaz-provider.js +244 -0
  556. package/dist/providers/topaz-provider.js.map +1 -0
  557. package/dist/providers/types.d.ts +641 -4
  558. package/dist/providers/types.d.ts.map +1 -1
  559. package/dist/providers/types.js +81 -1
  560. package/dist/providers/types.js.map +1 -1
  561. package/dist/providers/useapi-provider.d.ts +28 -0
  562. package/dist/providers/useapi-provider.d.ts.map +1 -0
  563. package/dist/providers/useapi-provider.js +274 -0
  564. package/dist/providers/useapi-provider.js.map +1 -0
  565. package/dist/providers/video-duration.d.ts +6 -0
  566. package/dist/providers/video-duration.d.ts.map +1 -0
  567. package/dist/providers/video-duration.js +63 -0
  568. package/dist/providers/video-duration.js.map +1 -0
  569. package/dist/providers/video-frame-fallback.d.ts +39 -0
  570. package/dist/providers/video-frame-fallback.d.ts.map +1 -0
  571. package/dist/providers/video-frame-fallback.js +155 -0
  572. package/dist/providers/video-frame-fallback.js.map +1 -0
  573. package/dist/providers/video-frames.d.ts +61 -0
  574. package/dist/providers/video-frames.d.ts.map +1 -0
  575. package/dist/providers/video-frames.js +208 -0
  576. package/dist/providers/video-frames.js.map +1 -0
  577. package/dist/providers/video-mime.d.ts +14 -0
  578. package/dist/providers/video-mime.d.ts.map +1 -0
  579. package/dist/providers/video-mime.js +44 -0
  580. package/dist/providers/video-mime.js.map +1 -0
  581. package/dist/providers/video-to-audio.d.ts +34 -0
  582. package/dist/providers/video-to-audio.d.ts.map +1 -0
  583. package/dist/providers/video-to-audio.js +62 -0
  584. package/dist/providers/video-to-audio.js.map +1 -0
  585. package/dist/providers/vllm-provider.d.ts +20 -8
  586. package/dist/providers/vllm-provider.d.ts.map +1 -1
  587. package/dist/providers/vllm-provider.js +44 -23
  588. package/dist/providers/vllm-provider.js.map +1 -1
  589. package/dist/providers/voyage-provider.d.ts +12 -3
  590. package/dist/providers/voyage-provider.d.ts.map +1 -1
  591. package/dist/providers/voyage-provider.js +21 -7
  592. package/dist/providers/voyage-provider.js.map +1 -1
  593. package/dist/providers/xai-provider.d.ts +56 -13
  594. package/dist/providers/xai-provider.d.ts.map +1 -1
  595. package/dist/providers/xai-provider.js +307 -22
  596. package/dist/providers/xai-provider.js.map +1 -1
  597. package/dist/python-bridge-base.d.ts +358 -0
  598. package/dist/python-bridge-base.d.ts.map +1 -0
  599. package/dist/python-bridge-base.js +1557 -0
  600. package/dist/python-bridge-base.js.map +1 -0
  601. package/dist/python-bridge-codec.d.ts +28 -0
  602. package/dist/python-bridge-codec.d.ts.map +1 -0
  603. package/dist/python-bridge-codec.js +39 -0
  604. package/dist/python-bridge-codec.js.map +1 -0
  605. package/dist/python-bridge-factory.d.ts +52 -0
  606. package/dist/python-bridge-factory.d.ts.map +1 -0
  607. package/dist/python-bridge-factory.js +69 -0
  608. package/dist/python-bridge-factory.js.map +1 -0
  609. package/dist/python-bridge-framing.d.ts +68 -0
  610. package/dist/python-bridge-framing.d.ts.map +1 -0
  611. package/dist/python-bridge-framing.js +91 -0
  612. package/dist/python-bridge-framing.js.map +1 -0
  613. package/dist/python-bridge-types.d.ts +545 -2
  614. package/dist/python-bridge-types.d.ts.map +1 -1
  615. package/dist/python-bridge-types.js +49 -1
  616. package/dist/python-bridge-types.js.map +1 -1
  617. package/dist/python-graph-resolver.d.ts +57 -0
  618. package/dist/python-graph-resolver.d.ts.map +1 -0
  619. package/dist/python-graph-resolver.js +79 -0
  620. package/dist/python-graph-resolver.js.map +1 -0
  621. package/dist/python-node-executor.d.ts +36 -4
  622. package/dist/python-node-executor.d.ts.map +1 -1
  623. package/dist/python-node-executor.js +177 -86
  624. package/dist/python-node-executor.js.map +1 -1
  625. package/dist/python-stdio-bridge.d.ts +18 -37
  626. package/dist/python-stdio-bridge.d.ts.map +1 -1
  627. package/dist/python-stdio-bridge.js +148 -475
  628. package/dist/python-stdio-bridge.js.map +1 -1
  629. package/dist/python-websocket-bridge.d.ts +140 -0
  630. package/dist/python-websocket-bridge.d.ts.map +1 -0
  631. package/dist/python-websocket-bridge.js +561 -0
  632. package/dist/python-websocket-bridge.js.map +1 -0
  633. package/dist/python-worker-stderr.d.ts +4 -0
  634. package/dist/python-worker-stderr.d.ts.map +1 -0
  635. package/dist/python-worker-stderr.js +24 -0
  636. package/dist/python-worker-stderr.js.map +1 -0
  637. package/dist/recommended-models.d.ts +2 -2
  638. package/dist/recommended-models.d.ts.map +1 -1
  639. package/dist/recommended-models.js +44 -4
  640. package/dist/recommended-models.js.map +1 -1
  641. package/dist/recoverable-node-error.d.ts +31 -0
  642. package/dist/recoverable-node-error.d.ts.map +1 -0
  643. package/dist/recoverable-node-error.js +37 -0
  644. package/dist/recoverable-node-error.js.map +1 -0
  645. package/dist/redact-params.d.ts +13 -0
  646. package/dist/redact-params.d.ts.map +1 -0
  647. package/dist/redact-params.js +57 -0
  648. package/dist/redact-params.js.map +1 -0
  649. package/dist/run-context.d.ts +20 -0
  650. package/dist/run-context.d.ts.map +1 -0
  651. package/dist/run-context.js +18 -0
  652. package/dist/run-context.js.map +1 -0
  653. package/dist/run-trace-context.d.ts +30 -0
  654. package/dist/run-trace-context.d.ts.map +1 -0
  655. package/dist/run-trace-context.js +80 -0
  656. package/dist/run-trace-context.js.map +1 -0
  657. package/dist/run-trace-processor.d.ts +65 -0
  658. package/dist/run-trace-processor.d.ts.map +1 -0
  659. package/dist/run-trace-processor.js +417 -0
  660. package/dist/run-trace-processor.js.map +1 -0
  661. package/dist/run-trace-serialization.d.ts +5 -0
  662. package/dist/run-trace-serialization.d.ts.map +1 -0
  663. package/dist/run-trace-serialization.js +113 -0
  664. package/dist/run-trace-serialization.js.map +1 -0
  665. package/dist/sandbox-module-catalog.d.ts +43 -0
  666. package/dist/sandbox-module-catalog.d.ts.map +1 -0
  667. package/dist/sandbox-module-catalog.js +25 -0
  668. package/dist/sandbox-module-catalog.js.map +1 -0
  669. package/dist/storage-workspace.d.ts +62 -0
  670. package/dist/storage-workspace.d.ts.map +1 -0
  671. package/dist/storage-workspace.js +441 -0
  672. package/dist/storage-workspace.js.map +1 -0
  673. package/dist/swappable-python-bridge.d.ts +83 -0
  674. package/dist/swappable-python-bridge.d.ts.map +1 -0
  675. package/dist/swappable-python-bridge.js +246 -0
  676. package/dist/swappable-python-bridge.js.map +1 -0
  677. package/dist/telemetry.d.ts +16 -3
  678. package/dist/telemetry.d.ts.map +1 -1
  679. package/dist/telemetry.js +76 -20
  680. package/dist/telemetry.js.map +1 -1
  681. package/dist/testing.d.ts +81 -0
  682. package/dist/testing.d.ts.map +1 -0
  683. package/dist/testing.js +130 -0
  684. package/dist/testing.js.map +1 -0
  685. package/dist/token-counter.d.ts +30 -0
  686. package/dist/token-counter.d.ts.map +1 -0
  687. package/dist/token-counter.js +156 -0
  688. package/dist/token-counter.js.map +1 -0
  689. package/dist/trace-exporters.d.ts +11 -28
  690. package/dist/trace-exporters.d.ts.map +1 -1
  691. package/dist/trace-exporters.js +69 -22
  692. package/dist/trace-exporters.js.map +1 -1
  693. package/dist/tracing-helpers.d.ts +60 -26
  694. package/dist/tracing-helpers.d.ts.map +1 -1
  695. package/dist/tracing-helpers.js +100 -25
  696. package/dist/tracing-helpers.js.map +1 -1
  697. package/dist/trim-video-window.d.ts +8 -0
  698. package/dist/trim-video-window.d.ts.map +1 -0
  699. package/dist/trim-video-window.js +50 -0
  700. package/dist/trim-video-window.js.map +1 -0
  701. package/dist/turn-budget.d.ts +278 -0
  702. package/dist/turn-budget.d.ts.map +1 -0
  703. package/dist/turn-budget.js +365 -0
  704. package/dist/turn-budget.js.map +1 -0
  705. package/dist/variable-channel.d.ts +48 -0
  706. package/dist/variable-channel.d.ts.map +1 -0
  707. package/dist/variable-channel.js +110 -0
  708. package/dist/variable-channel.js.map +1 -0
  709. package/dist/workspace.d.ts +119 -0
  710. package/dist/workspace.d.ts.map +1 -0
  711. package/dist/workspace.js +112 -0
  712. package/dist/workspace.js.map +1 -0
  713. package/package.json +121 -19
@@ -1,8 +1,109 @@
1
1
  import Replicate from "replicate";
2
2
  import { createLogger } from "@nodetool-ai/config";
3
+ import { isCallable, isObjectLike, isString } from "@nodetool-ai/protocol";
3
4
  import { BaseProvider } from "./base-provider.js";
4
- import { loadImageModels, loadVideoModels } from "./manifest-models.js";
5
+ import { safeFetch } from "./safe-url.js";
6
+ import { withReplicateRetry } from "./replicate-retry.js";
7
+ import { sniffAudioMime } from "./audio-mime.js";
8
+ import { sniffVideoMime } from "./video-mime.js";
9
+ import { detectImageMime } from "./image-mime.js";
10
+ import { getModelImageInputs, getModelReferenceInputs, getModelInputFields, validateReferenceInputs, getModelInputNames, loadImageModels, loadMusicModels, loadAudioToAudioModels, loadVideoModels, selectMaskImageInput, selectPrimaryImageInput } from "./manifest-models.js";
5
11
  const log = createLogger("nodetool.runtime.providers.replicate");
12
+ /** A nested string counts as a locator only when it looks like one. */
13
+ const URL_LIKE = /^(https?:|data:)/;
14
+ /** The walk is over a provider's JSON, so bound how deep it goes. */
15
+ const MAX_OUTPUT_DEPTH = 6;
16
+ /**
17
+ * Resolve a `replicate.run()` result to the one file it carries.
18
+ *
19
+ * The SDK walks the prediction's output and swaps every `https:`/`data:`
20
+ * string for a `FileOutput`, objects and nested arrays included, so a model
21
+ * answering `{"image": <FileOutput>}` is as ordinary as one answering
22
+ * `["https://…"]`. Reading only `output[0]` drops the first and reports "no
23
+ * usable output" for a prediction that succeeded.
24
+ */
25
+ export function decodeReplicateOutput(output) {
26
+ // A bare string output is itself the locator (the model's contract),
27
+ // whether or not it parses as a URL.
28
+ if (isString(output)) {
29
+ return output ? { kind: "url", url: output } : null;
30
+ }
31
+ return decodeOutputValue(output, 0);
32
+ }
33
+ function decodeOutputValue(value, depth) {
34
+ if (depth > MAX_OUTPUT_DEPTH || !isObjectLike(value))
35
+ return null;
36
+ // FileOutput extends ReadableStream, so `getReader` is on its prototype.
37
+ // Prefer it over `url()`: those bytes are already in flight.
38
+ if ("getReader" in value) {
39
+ return {
40
+ kind: "stream",
41
+ stream: value
42
+ };
43
+ }
44
+ // FileOutput also exposes `url()`, and some models answer a plain `{url}`.
45
+ if ("url" in value) {
46
+ const raw = value.url;
47
+ const url = isCallable(raw) ? raw.call(value) : raw;
48
+ if (url)
49
+ return { kind: "url", url: String(url) };
50
+ }
51
+ const items = Array.isArray(value)
52
+ ? value
53
+ : Object.values(value);
54
+ for (const item of items) {
55
+ const found = isString(item)
56
+ ? decodeOutputLeaf(item)
57
+ : decodeOutputValue(item, depth + 1);
58
+ if (found)
59
+ return found;
60
+ }
61
+ return null;
62
+ }
63
+ function decodeOutputLeaf(item) {
64
+ return URL_LIKE.test(item) ? { kind: "url", url: item } : null;
65
+ }
66
+ async function drainStream(stream) {
67
+ const reader = stream.getReader();
68
+ const chunks = [];
69
+ let total = 0;
70
+ while (true) {
71
+ const { done, value } = await reader.read();
72
+ if (done)
73
+ break;
74
+ chunks.push(value);
75
+ total += value.length;
76
+ }
77
+ const result = new Uint8Array(total);
78
+ let offset = 0;
79
+ for (const chunk of chunks) {
80
+ result.set(chunk, offset);
81
+ offset += chunk.length;
82
+ }
83
+ return result;
84
+ }
85
+ /** `safeFetch` speaks https only, so an inline output is decoded here. */
86
+ function decodeDataUri(uri) {
87
+ const comma = uri.indexOf(",");
88
+ if (comma < 0)
89
+ throw new Error("Malformed data URI in Replicate output");
90
+ const body = uri.slice(comma + 1);
91
+ if (uri.slice(0, comma).endsWith(";base64")) {
92
+ return new Uint8Array(Buffer.from(body, "base64"));
93
+ }
94
+ return new TextEncoder().encode(decodeURIComponent(body));
95
+ }
96
+ /** A short, credential-free description of an output the decoder rejected. */
97
+ function describeOutputShape(output) {
98
+ if (output == null)
99
+ return String(output);
100
+ if (Array.isArray(output))
101
+ return `an array of ${output.length}`;
102
+ if (isObjectLike(output)) {
103
+ return `an object with keys [${Object.keys(output).slice(0, 8).join(", ")}]`;
104
+ }
105
+ return `a ${typeof output}`;
106
+ }
6
107
  /**
7
108
  * Provider for Replicate's LLM, image, video, and audio models.
8
109
  *
@@ -11,6 +112,28 @@ const log = createLogger("nodetool.runtime.providers.replicate");
11
112
  * - Image / Video / TTS: `replicate.run()` with file output
12
113
  */
13
114
  export class ReplicateProvider extends BaseProvider {
115
+ declaredCapabilities() {
116
+ return [
117
+ "text_to_image",
118
+ "image_to_image",
119
+ "text_to_video",
120
+ "image_to_video",
121
+ "reference_to_video",
122
+ "inpainting",
123
+ "outpaint_image",
124
+ "upscale_image",
125
+ "remove_background",
126
+ "relight_image",
127
+ "vectorize_image",
128
+ "video_to_video",
129
+ "extend_video",
130
+ "upscale_video",
131
+ "lip_sync",
132
+ "text_to_speech",
133
+ "text_to_music",
134
+ "audio_to_audio"
135
+ ];
136
+ }
14
137
  static requiredSecrets() {
15
138
  return ["REPLICATE_API_TOKEN"];
16
139
  }
@@ -23,12 +146,13 @@ export class ReplicateProvider extends BaseProvider {
23
146
  throw new Error("REPLICATE_API_TOKEN is required");
24
147
  }
25
148
  this.apiKey = apiKey;
26
- this._client =
27
- options.client ??
28
- new Replicate({
29
- auth: apiKey,
30
- ...(options.fetchFn ? { fetch: options.fetchFn } : {})
31
- });
149
+ const replicateOptions = {
150
+ auth: apiKey
151
+ };
152
+ if (options.fetchFn) {
153
+ replicateOptions.fetch = options.fetchFn;
154
+ }
155
+ this._client = options.client ?? new Replicate(replicateOptions);
32
156
  }
33
157
  getContainerEnv() {
34
158
  return { REPLICATE_API_TOKEN: this.apiKey };
@@ -37,6 +161,14 @@ export class ReplicateProvider extends BaseProvider {
37
161
  // Replicate predictions API does not support OpenAI-style tool calling
38
162
  return false;
39
163
  }
164
+ /** Create a prediction, waiting out the low-credit throttle. */
165
+ runModel(modelId, input, signal) {
166
+ signal?.throwIfAborted();
167
+ const options = { input };
168
+ if (signal)
169
+ options.signal = signal;
170
+ return withReplicateRetry(modelId, () => this._client.run(modelId, options), signal);
171
+ }
40
172
  // ---------------------------------------------------------------------------
41
173
  // Chat completions via Replicate SDK
42
174
  // ---------------------------------------------------------------------------
@@ -48,7 +180,7 @@ export class ReplicateProvider extends BaseProvider {
48
180
  let systemPrompt = "";
49
181
  const parts = [];
50
182
  for (const msg of messages) {
51
- const text = typeof msg.content === "string"
183
+ const text = isString(msg.content)
52
184
  ? msg.content
53
185
  : Array.isArray(msg.content)
54
186
  ? msg.content
@@ -79,13 +211,11 @@ export class ReplicateProvider extends BaseProvider {
79
211
  if (args.topP != null)
80
212
  input.top_p = args.topP;
81
213
  log.debug("generateMessage", { model: args.model });
82
- const output = await this._client.run(args.model, {
83
- input
84
- });
214
+ const output = await this.runModel(args.model, input);
85
215
  // Replicate LLMs return output as a string, array of token strings,
86
216
  // or a ReadableStream/FileOutput.
87
217
  let text;
88
- if (typeof output === "string") {
218
+ if (isString(output)) {
89
219
  text = output;
90
220
  }
91
221
  else if (Array.isArray(output)) {
@@ -211,6 +341,11 @@ export class ReplicateProvider extends BaseProvider {
211
341
  name: "Claude Opus 4.6",
212
342
  provider: "replicate"
213
343
  },
344
+ {
345
+ id: "anthropic/claude-opus-4.7",
346
+ name: "Claude Opus 4.7",
347
+ provider: "replicate"
348
+ },
214
349
  { id: "openai/gpt-4o", name: "GPT-4o", provider: "replicate" },
215
350
  { id: "openai/gpt-4o-mini", name: "GPT-4o Mini", provider: "replicate" },
216
351
  { id: "openai/gpt-4.1", name: "GPT-4.1", provider: "replicate" },
@@ -219,8 +354,14 @@ export class ReplicateProvider extends BaseProvider {
219
354
  name: "GPT-4.1 Mini",
220
355
  provider: "replicate"
221
356
  },
357
+ {
358
+ id: "openai/gpt-4.1-nano",
359
+ name: "GPT-4.1 Nano",
360
+ provider: "replicate"
361
+ },
222
362
  { id: "openai/gpt-5", name: "GPT-5", provider: "replicate" },
223
363
  { id: "openai/gpt-5-mini", name: "GPT-5 Mini", provider: "replicate" },
364
+ { id: "openai/gpt-5-nano", name: "GPT-5 Nano", provider: "replicate" },
224
365
  { id: "openai/gpt-5.2", name: "GPT-5.2", provider: "replicate" },
225
366
  { id: "openai/o1", name: "O1", provider: "replicate" },
226
367
  { id: "openai/o4-mini", name: "O4 Mini", provider: "replicate" },
@@ -231,10 +372,136 @@ export class ReplicateProvider extends BaseProvider {
231
372
  provider: "replicate"
232
373
  },
233
374
  { id: "moonshotai/kimi-k2.5", name: "Kimi K2.5", provider: "replicate" },
375
+ { id: "moonshotai/kimi-k2.6", name: "Kimi K2.6", provider: "replicate" },
376
+ {
377
+ id: "ibm-granite/granite-4.1-8b",
378
+ name: "Granite 4.1 8B",
379
+ provider: "replicate"
380
+ },
234
381
  {
235
382
  id: "snowflake/snowflake-arctic-instruct",
236
383
  name: "Snowflake Arctic Instruct",
237
384
  provider: "replicate"
385
+ },
386
+ {
387
+ id: "anthropic/claude-sonnet-5",
388
+ name: "Claude Sonnet 5",
389
+ provider: "replicate"
390
+ },
391
+ {
392
+ id: "anthropic/claude-sonnet-4.6",
393
+ name: "Claude Sonnet 4.6",
394
+ provider: "replicate"
395
+ },
396
+ {
397
+ id: "anthropic/claude-fable-5",
398
+ name: "Claude Fable 5",
399
+ provider: "replicate"
400
+ },
401
+ { id: "openai/gpt-5.4", name: "GPT-5.4", provider: "replicate" },
402
+ {
403
+ id: "openai/gpt-5.6-sol",
404
+ name: "GPT-5.6 Sol",
405
+ provider: "replicate"
406
+ },
407
+ {
408
+ id: "openai/gpt-5.6-terra",
409
+ name: "GPT-5.6 Terra",
410
+ provider: "replicate"
411
+ },
412
+ {
413
+ id: "openai/gpt-5.6-luna",
414
+ name: "GPT-5.6 Luna",
415
+ provider: "replicate"
416
+ },
417
+ {
418
+ id: "google/gemini-3.5-flash",
419
+ name: "Gemini 3.5 Flash",
420
+ provider: "replicate"
421
+ },
422
+ {
423
+ id: "qwen/qwen3-7-plus",
424
+ name: "Qwen3.7 Plus",
425
+ provider: "replicate"
426
+ },
427
+ {
428
+ id: "ibm-granite/granite-vision-4.1-4b",
429
+ name: "Granite Vision 4.1 4B",
430
+ provider: "replicate"
431
+ },
432
+ {
433
+ id: "anthropic/claude-3.5-haiku",
434
+ name: "Claude 3.5 Haiku",
435
+ provider: "replicate"
436
+ },
437
+ { id: "openai/gpt-5.1", name: "GPT-5.1", provider: "replicate" },
438
+ { id: "openai/gpt-5-pro", name: "GPT-5 Pro", provider: "replicate" },
439
+ { id: "openai/o1-mini", name: "O1 Mini", provider: "replicate" },
440
+ {
441
+ id: "openai/gpt-oss-120b",
442
+ name: "GPT OSS 120B",
443
+ provider: "replicate"
444
+ },
445
+ { id: "openai/gpt-oss-20b", name: "GPT OSS 20B", provider: "replicate" },
446
+ {
447
+ id: "meta/llama-4-maverick-instruct",
448
+ name: "Llama 4 Maverick Instruct",
449
+ provider: "replicate"
450
+ },
451
+ {
452
+ id: "meta/llama-4-scout-instruct",
453
+ name: "Llama 4 Scout Instruct",
454
+ provider: "replicate"
455
+ },
456
+ {
457
+ id: "ibm-granite/granite-3.2-8b-instruct",
458
+ name: "Granite 3.2 8B Instruct",
459
+ provider: "replicate"
460
+ },
461
+ {
462
+ id: "ibm-granite/granite-3.3-8b-instruct",
463
+ name: "Granite 3.3 8B Instruct",
464
+ provider: "replicate"
465
+ },
466
+ {
467
+ id: "ibm-granite/granite-vision-3.3-2b",
468
+ name: "Granite Vision 3.3 2B",
469
+ provider: "replicate"
470
+ },
471
+ {
472
+ id: "lucataco/qwen2.5-omni-7b",
473
+ name: "Qwen2.5 Omni 7B",
474
+ provider: "replicate"
475
+ },
476
+ {
477
+ id: "google/gemini-3-flash",
478
+ name: "Gemini 3 Flash",
479
+ provider: "replicate"
480
+ },
481
+ {
482
+ id: "openai/gpt-5-structured",
483
+ name: "GPT-5 Structured",
484
+ provider: "replicate"
485
+ },
486
+ {
487
+ id: "moonshotai/kimi-k2-thinking",
488
+ name: "Kimi K2 Thinking",
489
+ provider: "replicate"
490
+ },
491
+ {
492
+ id: "ibm-granite/granite-4.0-h-small",
493
+ name: "Granite 4.0 H Small",
494
+ provider: "replicate"
495
+ },
496
+ {
497
+ id: "nvidia/nemotron-3-nano-30b-a3b",
498
+ name: "Nemotron 3 Nano 30B A3B",
499
+ provider: "replicate"
500
+ },
501
+ {
502
+ id: "nvidia/nemotron-nano-v2-12b-vl",
503
+ name: "Nemotron Nano V2 12B VL",
504
+ provider: "replicate"
238
505
  }
239
506
  ];
240
507
  }
@@ -252,22 +519,129 @@ export class ReplicateProvider extends BaseProvider {
252
519
  name: "MiniMax Speech 2.8 HD",
253
520
  provider: "replicate"
254
521
  },
522
+ {
523
+ id: "minimax/speech-2.8-turbo",
524
+ name: "MiniMax Speech 2.8 Turbo",
525
+ provider: "replicate"
526
+ },
527
+ {
528
+ id: "google/gemini-3.1-flash-tts",
529
+ name: "Gemini 3.1 Flash TTS",
530
+ provider: "replicate"
531
+ },
532
+ { id: "qwen/qwen3-tts", name: "Qwen3 TTS", provider: "replicate" },
533
+ {
534
+ id: "inworld/tts-1.5-max",
535
+ name: "Inworld TTS 1.5 Max",
536
+ provider: "replicate"
537
+ },
538
+ {
539
+ id: "inworld/tts-1.5-mini",
540
+ name: "Inworld TTS 1.5 Mini",
541
+ provider: "replicate"
542
+ },
543
+ {
544
+ id: "inworld/realtime-tts-2",
545
+ name: "Inworld Realtime TTS 2",
546
+ provider: "replicate"
547
+ },
548
+ {
549
+ id: "xai/grok-text-to-speech",
550
+ name: "Grok Text To Speech",
551
+ provider: "replicate"
552
+ },
255
553
  { id: "jaaari/kokoro-82m", name: "Kokoro 82M", provider: "replicate" },
256
554
  {
257
555
  id: "resemble-ai/chatterbox-pro",
258
556
  name: "Chatterbox Pro",
259
557
  provider: "replicate"
260
558
  },
261
- { id: "x-lance/f5-tts", name: "F5 TTS", provider: "replicate" }
559
+ {
560
+ id: "resemble-ai/chatterbox-turbo",
561
+ name: "Chatterbox Turbo",
562
+ provider: "replicate"
563
+ },
564
+ {
565
+ id: "resemble-ai/chatterbox-multilingual",
566
+ name: "Chatterbox Multilingual",
567
+ provider: "replicate"
568
+ },
569
+ { id: "x-lance/f5-tts", name: "F5 TTS", provider: "replicate" },
570
+ {
571
+ id: "inworld/realtime-tts-1.5-max",
572
+ name: "Inworld Realtime TTS 1.5 Max",
573
+ provider: "replicate"
574
+ },
575
+ {
576
+ id: "inworld/realtime-tts-1.5-mini",
577
+ name: "Inworld Realtime TTS 1.5 Mini",
578
+ provider: "replicate"
579
+ },
580
+ {
581
+ id: "elevenlabs/v2-multilingual",
582
+ name: "ElevenLabs V2 Multilingual",
583
+ provider: "replicate"
584
+ },
585
+ {
586
+ id: "elevenlabs/turbo-v2.5",
587
+ name: "ElevenLabs Turbo V2.5",
588
+ provider: "replicate"
589
+ },
590
+ {
591
+ id: "elevenlabs/flash-v2.5",
592
+ name: "ElevenLabs Flash V2.5",
593
+ provider: "replicate"
594
+ },
595
+ {
596
+ id: "minimax/speech-2.6-hd",
597
+ name: "MiniMax Speech 2.6 HD",
598
+ provider: "replicate"
599
+ },
600
+ {
601
+ id: "minimax/speech-2.6-turbo",
602
+ name: "MiniMax Speech 2.6 Turbo",
603
+ provider: "replicate"
604
+ },
605
+ {
606
+ id: "resemble-ai/chatterbox",
607
+ name: "Chatterbox",
608
+ provider: "replicate"
609
+ }
262
610
  ];
263
611
  }
612
+ async getAvailableMusicModels() {
613
+ return loadMusicModels("@nodetool-ai/replicate-nodes", "replicate-manifest.json", "replicate");
614
+ }
615
+ async getAvailableAudioToAudioModels() {
616
+ return loadAudioToAudioModels("@nodetool-ai/replicate-nodes", "replicate-manifest.json", "replicate");
617
+ }
264
618
  async getAvailableASRModels() {
265
619
  return [
620
+ {
621
+ id: "elevenlabs/scribe-v2",
622
+ name: "ElevenLabs Scribe V2",
623
+ provider: "replicate"
624
+ },
266
625
  {
267
626
  id: "openai/gpt-4o-transcribe",
268
627
  name: "GPT-4o Transcribe",
269
628
  provider: "replicate"
270
629
  },
630
+ {
631
+ id: "openai/gpt-4o-mini-transcribe",
632
+ name: "GPT-4o Mini Transcribe",
633
+ provider: "replicate"
634
+ },
635
+ {
636
+ id: "xai/grok-speech-to-text",
637
+ name: "Grok Speech To Text",
638
+ provider: "replicate"
639
+ },
640
+ {
641
+ id: "nvidia/parakeet-rnnt-1.1b",
642
+ name: "Parakeet RNNT 1.1B",
643
+ provider: "replicate"
644
+ },
271
645
  {
272
646
  id: "vaibhavs10/incredibly-fast-whisper",
273
647
  name: "Incredibly Fast Whisper",
@@ -279,6 +653,31 @@ export class ReplicateProvider extends BaseProvider {
279
653
  id: "thomasmol/whisper-diarization",
280
654
  name: "Whisper Diarization",
281
655
  provider: "replicate"
656
+ },
657
+ {
658
+ id: "rafaelgalle/whisper-diarization-advanced",
659
+ name: "Whisper Diarization Advanced",
660
+ provider: "replicate"
661
+ },
662
+ {
663
+ id: "ibm-granite/granite-speech-3.3-8b",
664
+ name: "Granite Speech 3.3 8B",
665
+ provider: "replicate"
666
+ },
667
+ {
668
+ id: "ibm-granite/granite-speech-4.1-2b",
669
+ name: "Granite Speech 4.1 2B",
670
+ provider: "replicate"
671
+ },
672
+ {
673
+ id: "nvidia/canary-qwen-2.5b",
674
+ name: "Canary Qwen 2.5B",
675
+ provider: "replicate"
676
+ },
677
+ {
678
+ id: "victor-upmeet/whisperx",
679
+ name: "WhisperX Large V3",
680
+ provider: "replicate"
282
681
  }
283
682
  ];
284
683
  }
@@ -314,6 +713,30 @@ export class ReplicateProvider extends BaseProvider {
314
713
  provider: "replicate",
315
714
  dimensions: 768
316
715
  },
716
+ {
717
+ id: "ibm-granite/granite-embedding-small-english-r2",
718
+ name: "Granite Embedding Small English R2",
719
+ provider: "replicate",
720
+ dimensions: 384
721
+ },
722
+ {
723
+ id: "adirik/e5-mistral-7b-instruct",
724
+ name: "E5 Mistral 7B Instruct",
725
+ provider: "replicate",
726
+ dimensions: 4096
727
+ },
728
+ {
729
+ id: "mark3labs/embeddings-gte-base",
730
+ name: "GTE Base",
731
+ provider: "replicate",
732
+ dimensions: 768
733
+ },
734
+ {
735
+ id: "center-for-curriculum-redesign/bge_1-5_query_embeddings",
736
+ name: "BGE 1.5 Query Embeddings",
737
+ provider: "replicate",
738
+ dimensions: 1024
739
+ },
317
740
  {
318
741
  id: "beautyyuyanli/multilingual-e5-large",
319
742
  name: "Multilingual E5 Large",
@@ -343,46 +766,42 @@ export class ReplicateProvider extends BaseProvider {
343
766
  name: "ImageBind",
344
767
  provider: "replicate",
345
768
  dimensions: 1024
769
+ },
770
+ {
771
+ id: "openai/clip",
772
+ name: "CLIP ViT-L/14",
773
+ provider: "replicate",
774
+ dimensions: 768
775
+ },
776
+ {
777
+ id: "krthr/clip-embeddings",
778
+ name: "CLIP Embeddings",
779
+ provider: "replicate",
780
+ dimensions: 768
346
781
  }
347
782
  ];
348
783
  }
349
784
  // ---------------------------------------------------------------------------
350
785
  // Image / Video / Audio capabilities
351
786
  // ---------------------------------------------------------------------------
352
- async _fetchOutputBytes(output) {
353
- // replicate.run() returns FileOutput (ReadableStream) for file models,
354
- // or a string URL, or an array of URLs/FileOutputs.
355
- let target = output;
356
- if (Array.isArray(output)) {
357
- target = output[0];
358
- }
359
- // FileOutput is a ReadableStream — read it to bytes
360
- if (target && typeof target === "object" && "getReader" in target) {
361
- const reader = target.getReader();
362
- const chunks = [];
363
- while (true) {
364
- const { done, value } = await reader.read();
365
- if (done)
366
- break;
367
- chunks.push(value);
368
- }
369
- const totalLength = chunks.reduce((sum, c) => sum + c.length, 0);
370
- const result = new Uint8Array(totalLength);
371
- let offset = 0;
372
- for (const chunk of chunks) {
373
- result.set(chunk, offset);
374
- offset += chunk.length;
375
- }
376
- return result;
377
- }
378
- // String URL — fetch the bytes
379
- if (typeof target === "string") {
380
- const res = await fetch(target);
381
- if (!res.ok)
382
- throw new Error(`Failed to fetch output: ${res.status}`);
383
- return new Uint8Array(await res.arrayBuffer());
787
+ async _fetchOutputBytes(output, signal) {
788
+ signal?.throwIfAborted();
789
+ const target = decodeReplicateOutput(output);
790
+ if (!target) {
791
+ throw new Error("Replicate prediction returned no usable output " +
792
+ `(output was ${describeOutputShape(output)})`);
384
793
  }
385
- throw new Error("Replicate prediction returned no usable output");
794
+ return target.kind === "stream"
795
+ ? drainStream(target.stream)
796
+ : this._fetchUrlBytes(target.url, signal);
797
+ }
798
+ async _fetchUrlBytes(url, signal) {
799
+ if (url.startsWith("data:"))
800
+ return decodeDataUri(url);
801
+ const res = await safeFetch(url, signal ? { signal } : undefined);
802
+ if (!res.ok)
803
+ throw new Error(`Failed to fetch output: ${res.status}`);
804
+ return new Uint8Array(await res.arrayBuffer());
386
805
  }
387
806
  async textToImage(params) {
388
807
  if (!params.prompt)
@@ -403,13 +822,11 @@ export class ReplicateProvider extends BaseProvider {
403
822
  if (params.scheduler)
404
823
  input.scheduler = params.scheduler;
405
824
  log.debug("textToImage", { model: params.model.id });
406
- const output = await this._client.run(params.model.id, { input });
825
+ const output = await this.runModel(params.model.id, input);
407
826
  return this._fetchOutputBytes(output);
408
827
  }
409
- async imageToImage(image, params) {
410
- const base64 = Buffer.from(image).toString("base64");
411
- const dataUri = `data:image/png;base64,${base64}`;
412
- const input = { image: dataUri };
828
+ async imageToImage(images, params) {
829
+ const input = this.imageInput(params.model.id, images);
413
830
  if (params.prompt)
414
831
  input.prompt = params.prompt;
415
832
  if (params.negativePrompt)
@@ -423,7 +840,31 @@ export class ReplicateProvider extends BaseProvider {
423
840
  if (params.seed != null)
424
841
  input.seed = params.seed;
425
842
  log.debug("imageToImage", { model: params.model.id });
426
- const output = await this._client.run(params.model.id, { input });
843
+ const output = await this.runModel(params.model.id, input);
844
+ return this._fetchOutputBytes(output);
845
+ }
846
+ async inpaint(images, params) {
847
+ const input = this.imageInput(params.model.id, images);
848
+ if (params.prompt)
849
+ input.prompt = params.prompt;
850
+ if (params.negativePrompt)
851
+ input.negative_prompt = params.negativePrompt;
852
+ if (params.guidanceScale != null)
853
+ input.guidance_scale = params.guidanceScale;
854
+ if (params.numInferenceSteps != null)
855
+ input.num_inference_steps = params.numInferenceSteps;
856
+ if (params.strength != null)
857
+ input.strength = params.strength;
858
+ if (params.seed != null)
859
+ input.seed = params.seed;
860
+ if (params.mask && params.mask.length > 0) {
861
+ const maskUri = this.imageDataUri(params.mask);
862
+ const maskField = selectMaskImageInput(getModelImageInputs("@nodetool-ai/replicate-nodes", "replicate-manifest.json", params.model.id));
863
+ const fieldName = maskField?.apiName ?? "mask_url";
864
+ input[fieldName] = maskField?.isList ? [maskUri] : maskUri;
865
+ }
866
+ log.debug("inpaint", { model: params.model.id });
867
+ const output = await this.runModel(params.model.id, input);
427
868
  return this._fetchOutputBytes(output);
428
869
  }
429
870
  async textToVideo(params) {
@@ -441,13 +882,17 @@ export class ReplicateProvider extends BaseProvider {
441
882
  if (params.seed != null)
442
883
  input.seed = params.seed;
443
884
  log.debug("textToVideo", { model: params.model.id });
444
- const output = await this._client.run(params.model.id, { input });
885
+ const output = await this.runModel(params.model.id, input);
445
886
  return this._fetchOutputBytes(output);
446
887
  }
447
888
  async imageToVideo(image, params) {
448
- const base64 = Buffer.from(image).toString("base64");
449
- const dataUri = `data:image/png;base64,${base64}`;
450
- const input = { image: dataUri };
889
+ const model = (await this.getAvailableVideoModels()).find((item) => item.id === params.model.id);
890
+ if (model && !model.supportedTasks?.includes("image_to_video")) {
891
+ throw new Error(`Replicate model ${params.model.id} does not support image_to_video`);
892
+ }
893
+ if (image.length === 0)
894
+ throw new Error("Replicate image_to_video requires a start image");
895
+ const input = this.imageInput(params.model.id, [image]);
451
896
  if (params.prompt)
452
897
  input.prompt = params.prompt;
453
898
  if (params.negativePrompt)
@@ -461,24 +906,337 @@ export class ReplicateProvider extends BaseProvider {
461
906
  if (params.seed != null)
462
907
  input.seed = params.seed;
463
908
  log.debug("imageToVideo", { model: params.model.id });
464
- const output = await this._client.run(params.model.id, { input });
909
+ const output = await this.runModel(params.model.id, input);
465
910
  return this._fetchOutputBytes(output);
466
911
  }
467
- async *textToSpeech(args) {
912
+ async referenceToVideo(inputs, params) {
913
+ const modelId = params.model.id;
914
+ const model = (await this.getAvailableVideoModels()).find((item) => item.id === modelId);
915
+ if (!model?.supportedTasks?.includes("reference_to_video")) {
916
+ throw new Error(`Replicate model ${modelId} does not support reference_to_video`);
917
+ }
918
+ const fields = getModelReferenceInputs("@nodetool-ai/replicate-nodes", "replicate-manifest.json", modelId);
919
+ const references = {
920
+ images: inputs.images.filter((bytes) => bytes.length > 0),
921
+ videos: inputs.videos.filter((bytes) => bytes.length > 0)
922
+ };
923
+ validateReferenceInputs("Replicate", modelId, references, fields);
924
+ const declared = getModelInputFields("@nodetool-ai/replicate-nodes", "replicate-manifest.json", modelId);
925
+ const hasField = (name) => declared.some((field) => field.name === name);
926
+ if (params.useReferenceVideoAudio === true && (!hasField("use_reference_video_audio") || references.videos.length === 0)) {
927
+ throw new Error(`Replicate model ${modelId} does not support reference video audio for these inputs`);
928
+ }
929
+ const input = {};
930
+ for (const field of fields) {
931
+ const buffers = field.kind === "image" ? references.images : references.videos;
932
+ if (buffers.length === 0)
933
+ continue;
934
+ const urls = buffers.map((bytes) => field.kind === "image"
935
+ ? this.imageDataUri(bytes)
936
+ : this.dataUri(bytes, sniffVideoMime(bytes)));
937
+ input[field.apiName] = field.isList ? urls : urls[0];
938
+ }
939
+ const options = {
940
+ prompt: params.prompt,
941
+ negative_prompt: params.negativePrompt,
942
+ duration: params.durationSeconds,
943
+ aspect_ratio: params.aspectRatio,
944
+ resolution: params.resolution,
945
+ num_frames: params.numFrames,
946
+ guidance_scale: params.guidanceScale,
947
+ seed: params.seed,
948
+ use_reference_video_audio: params.useReferenceVideoAudio
949
+ };
950
+ for (const [name, value] of Object.entries(options)) {
951
+ if (value != null && hasField(name))
952
+ input[name] = value;
953
+ }
954
+ const timeout = params.timeoutSeconds && params.timeoutSeconds > 0
955
+ ? AbortSignal.timeout(params.timeoutSeconds * 1000)
956
+ : undefined;
957
+ const signal = params.signal && timeout
958
+ ? AbortSignal.any([params.signal, timeout])
959
+ : params.signal ?? timeout;
960
+ const output = await this.runModel(modelId, input, signal);
961
+ return this._fetchOutputBytes(output, signal);
962
+ }
963
+ dataUri(bytes, mimeType) {
964
+ return `data:${mimeType};base64,${Buffer.from(bytes).toString("base64")}`;
965
+ }
966
+ // Replicate models decode by the declared type, so feeding back a WebP this
967
+ // provider itself produced as `image/png` fails inside the model.
968
+ imageDataUri(bytes) {
969
+ return this.dataUri(bytes, detectImageMime(bytes));
970
+ }
971
+ /**
972
+ * Build the image portion of a Replicate prediction input from one or more
973
+ * source images, using the model's declared schema (replicate-manifest) to
974
+ * pick the correct input field — single (`image`, `input_image`, …) vs list
975
+ * (`image_input`, `images`, …). Falls back to the common conventions when the
976
+ * model isn't in the manifest. Empty buffers are dropped.
977
+ */
978
+ imageInput(modelId, images) {
979
+ const dataUris = images
980
+ .filter((b) => b && b.length > 0)
981
+ .map((b) => this.imageDataUri(b));
982
+ if (dataUris.length === 0)
983
+ return {};
984
+ const field = selectPrimaryImageInput(getModelImageInputs("@nodetool-ai/replicate-nodes", "replicate-manifest.json", modelId), dataUris.length);
985
+ if (field) {
986
+ return { [field.apiName]: field.isList ? dataUris : dataUris[0] };
987
+ }
988
+ // Unknown model: fall back to the common conventions.
989
+ return dataUris.length === 1
990
+ ? { image: dataUris[0] }
991
+ : { image_input: dataUris };
992
+ }
993
+ async runWithInput(modelId, input) {
994
+ return this._fetchOutputBytes(await this.runModel(modelId, input));
995
+ }
996
+ async upscaleImage(image, params) {
997
+ const input = {
998
+ image: this.imageDataUri(image)
999
+ };
1000
+ if (params.scale != null)
1001
+ input.scale = params.scale;
1002
+ if (params.prompt)
1003
+ input.prompt = params.prompt;
1004
+ if (params.creativity != null)
1005
+ input.creativity = params.creativity;
1006
+ if (params.seed != null)
1007
+ input.seed = params.seed;
1008
+ log.debug("upscaleImage", { model: params.model.id });
1009
+ return this.runWithInput(params.model.id, input);
1010
+ }
1011
+ /**
1012
+ * Outpaint an image. Replicate's expand models take the target canvas rather
1013
+ * than per-side padding (`bria/expand-image`: `canvas_size` plus where the
1014
+ * original sits inside it), so the padding is turned into that geometry and
1015
+ * pruned to whatever the model declares.
1016
+ */
1017
+ async outpaintImage(images, params) {
1018
+ const input = this.imageInput(params.model.id, images);
1019
+ if (params.prompt)
1020
+ input.prompt = params.prompt;
1021
+ if (params.negativePrompt)
1022
+ input.negative_prompt = params.negativePrompt;
1023
+ if (params.aspectRatio)
1024
+ input.aspect_ratio = params.aspectRatio;
1025
+ const padding = params.padding;
1026
+ if (padding) {
1027
+ const left = padding.left ?? 0;
1028
+ const top = padding.top ?? 0;
1029
+ input.expand_left = left;
1030
+ input.expand_right = padding.right ?? 0;
1031
+ input.expand_top = top;
1032
+ input.expand_bottom = padding.bottom ?? 0;
1033
+ // Where the source image lands on the expanded canvas, for the models
1034
+ // that place it explicitly instead of taking per-side amounts.
1035
+ input.original_image_location = [left, top];
1036
+ }
1037
+ if (params.seed != null)
1038
+ input.seed = params.seed;
1039
+ log.debug("outpaintImage", { model: params.model.id });
1040
+ return this.runWithInput(params.model.id, this.pruneToDeclaredInputs(params.model.id, input));
1041
+ }
1042
+ async removeBackground(image, params) {
1043
+ log.debug("removeBackground", { model: params.model.id });
1044
+ return this.runWithInput(params.model.id, {
1045
+ image: this.imageDataUri(image)
1046
+ });
1047
+ }
1048
+ async relightImage(image, params) {
1049
+ const input = {
1050
+ image: this.imageDataUri(image)
1051
+ };
1052
+ if (params.prompt)
1053
+ input.prompt = params.prompt;
1054
+ if (params.negativePrompt)
1055
+ input.negative_prompt = params.negativePrompt;
1056
+ if (params.seed != null)
1057
+ input.seed = params.seed;
1058
+ log.debug("relightImage", { model: params.model.id });
1059
+ return this.runWithInput(params.model.id, input);
1060
+ }
1061
+ async vectorizeImage(image, params) {
1062
+ log.debug("vectorizeImage", { model: params.model.id });
1063
+ return this.runWithInput(params.model.id, {
1064
+ image: this.imageDataUri(image)
1065
+ });
1066
+ }
1067
+ /**
1068
+ * Drop input fields the model does not declare in the manifest.
1069
+ *
1070
+ * Replicate fails the whole prediction on an undeclared field instead of
1071
+ * ignoring it, so a generic param bag breaks any endpoint with a narrower
1072
+ * schema. An empty declaration set means the model is not in the manifest —
1073
+ * send everything rather than silently stripping the request bare.
1074
+ */
1075
+ pruneToDeclaredInputs(modelId, input) {
1076
+ const declared = getModelInputNames("@nodetool-ai/replicate-nodes", "replicate-manifest.json", modelId);
1077
+ if (declared.size === 0)
1078
+ return input;
1079
+ const pruned = {};
1080
+ const dropped = [];
1081
+ for (const [key, value] of Object.entries(input)) {
1082
+ if (declared.has(key))
1083
+ pruned[key] = value;
1084
+ else
1085
+ dropped.push(key);
1086
+ }
1087
+ if (dropped.length > 0) {
1088
+ log.debug("pruned undeclared inputs", { model: modelId, dropped });
1089
+ }
1090
+ return pruned;
1091
+ }
1092
+ async videoToVideo(video, params) {
1093
+ const images = params.referenceImages ?? [];
1094
+ const fields = getModelReferenceInputs("@nodetool-ai/replicate-nodes", "replicate-manifest.json", params.model.id);
1095
+ if (images.length) {
1096
+ validateReferenceInputs("Replicate", params.model.id, { images, videos: [] }, fields);
1097
+ }
1098
+ params.signal?.throwIfAborted();
1099
+ const input = {
1100
+ video: this.dataUri(video, "video/mp4")
1101
+ };
1102
+ if (images.length) {
1103
+ const urls = images.map((image) => this.imageDataUri(image));
1104
+ for (const field of fields.filter((candidate) => candidate.kind === "image")) {
1105
+ input[field.apiName] = field.isList ? urls : urls[0];
1106
+ }
1107
+ }
1108
+ if (params.prompt)
1109
+ input.prompt = params.prompt;
1110
+ if (params.negativePrompt)
1111
+ input.negative_prompt = params.negativePrompt;
1112
+ if (params.strength != null)
1113
+ input.strength = params.strength;
1114
+ if (params.seed != null)
1115
+ input.seed = params.seed;
1116
+ log.debug("videoToVideo", { model: params.model.id });
1117
+ return this._fetchOutputBytes(await this.runModel(params.model.id, this.pruneToDeclaredInputs(params.model.id, input), params.signal), params.signal);
1118
+ }
1119
+ async extendVideo(video, params) {
1120
+ if (video.length === 0) {
1121
+ throw new Error("video must not be empty");
1122
+ }
1123
+ const model = (await this.getAvailableVideoModels()).find((candidate) => candidate.id === params.model.id);
1124
+ if (!model?.supportedTasks?.includes("extend_video")) {
1125
+ throw new Error(`Model ${params.model.id} does not support extend_video`);
1126
+ }
1127
+ const directionTasks = model.supportedTasks.filter((task) => task.startsWith("extend_video_"));
1128
+ if (directionTasks.length > 0 &&
1129
+ !directionTasks.includes(`extend_video_${params.mode}`)) {
1130
+ throw new Error(`Model ${params.model.id} does not support ${params.mode} extension`);
1131
+ }
1132
+ if (!Number.isFinite(params.durationSeconds) ||
1133
+ params.durationSeconds <= 0) {
1134
+ throw new Error("Extension duration must be positive");
1135
+ }
1136
+ const input = this.pruneToDeclaredInputs(params.model.id, {
1137
+ video: this.dataUri(video, "video/mp4"),
1138
+ prompt: params.prompt,
1139
+ mode: params.mode,
1140
+ duration: params.durationSeconds
1141
+ });
1142
+ log.debug("extendVideo", { model: params.model.id, mode: params.mode });
1143
+ return this._fetchOutputBytes(await this.runModel(params.model.id, input));
1144
+ }
1145
+ async upscaleVideo(video, params) {
1146
+ const input = {
1147
+ video: this.dataUri(video, "video/mp4")
1148
+ };
1149
+ // One concept, four spellings across the catalog's upscalers; the prune
1150
+ // below drops whichever names this model does not declare.
1151
+ if (params.scale != null) {
1152
+ input.scale = params.scale;
1153
+ input.upscale_factor = params.scale;
1154
+ input.resolution = params.scale;
1155
+ }
1156
+ if (params.targetResolution) {
1157
+ input.target_resolution = params.targetResolution;
1158
+ }
1159
+ if (params.prompt)
1160
+ input.prompt = params.prompt;
1161
+ if (params.creativity != null)
1162
+ input.creativity = params.creativity;
1163
+ if (params.seed != null)
1164
+ input.seed = params.seed;
1165
+ log.debug("upscaleVideo", { model: params.model.id });
1166
+ return this.runWithInput(params.model.id, this.pruneToDeclaredInputs(params.model.id, input));
1167
+ }
1168
+ async lipSync(video, params) {
1169
+ const input = {
1170
+ video: this.dataUri(video, "video/mp4"),
1171
+ audio: this.dataUri(params.audio, "audio/mpeg")
1172
+ };
1173
+ if (params.seed != null)
1174
+ input.seed = params.seed;
1175
+ log.debug("lipSync", { model: params.model.id });
1176
+ return this.runWithInput(params.model.id, this.pruneToDeclaredInputs(params.model.id, input));
1177
+ }
1178
+ /**
1179
+ * Replicate TTS models (elevenlabs, minimax, kokoro, chatterbox, f5-tts)
1180
+ * return an ENCODED audio file (MP3/WAV), not raw little-endian PCM. Expose
1181
+ * it through the encoded path (like textToMusic / FAL) rather than overriding
1182
+ * the streaming-PCM textToSpeech — the previous override blindly cast the
1183
+ * encoded bytes to Int16Array, producing noise (MP3) or a header click +
1184
+ * misaligned waveform (WAV).
1185
+ */
1186
+ async textToSpeechEncoded(args) {
468
1187
  const input = { text: args.text };
469
1188
  if (args.voice)
470
1189
  input.voice = args.voice;
471
1190
  if (args.speed != null)
472
1191
  input.speed = args.speed;
473
- log.debug("textToSpeech", { model: args.model });
474
- const output = await this._client.run(args.model, {
475
- input
476
- });
1192
+ log.debug("textToSpeechEncoded", { model: args.model });
1193
+ const output = await this.runModel(args.model, input);
477
1194
  const bytes = await this._fetchOutputBytes(output);
478
- // Convert to Int16Array (assume raw PCM or WAV)
479
- yield {
480
- samples: new Int16Array(bytes.buffer, bytes.byteOffset, bytes.byteLength / 2)
1195
+ return { data: bytes, mimeType: sniffAudioMime(bytes) };
1196
+ }
1197
+ /**
1198
+ * Generate music as an encoded audio file. Replicate music models (MusicGen,
1199
+ * MiniMax Music, ElevenLabs Music, …) return a file URL / FileOutput, so this
1200
+ * runs the model and downloads the encoded audio bytes.
1201
+ */
1202
+ async textToMusic(params) {
1203
+ if (!params.prompt)
1204
+ throw new Error("Prompt is required");
1205
+ const input = { prompt: params.prompt };
1206
+ if (params.lyrics)
1207
+ input.lyrics = params.lyrics;
1208
+ if (params.durationSeconds != null) {
1209
+ input.duration = Math.round(params.durationSeconds);
1210
+ }
1211
+ if (params.seed != null)
1212
+ input.seed = params.seed;
1213
+ log.debug("textToMusic", { model: params.model.id });
1214
+ const output = await this.runModel(params.model.id, input);
1215
+ const bytes = await this._fetchOutputBytes(output);
1216
+ return { data: bytes, mimeType: sniffAudioMime(bytes) };
1217
+ }
1218
+ /**
1219
+ * Rewrite a recording. Replicate's audio transforms (super-resolution, stem
1220
+ * separation, enhancers) take the source under `audio`; the direction fields
1221
+ * go through {@link pruneToDeclaredInputs} like {@link lipSync} does, so a
1222
+ * model that declares none of them does not get sent one.
1223
+ */
1224
+ async audioToAudio(audio, params) {
1225
+ const input = {
1226
+ audio: this.dataUri(audio, "audio/mpeg")
481
1227
  };
1228
+ if (params.prompt)
1229
+ input.prompt = params.prompt;
1230
+ if (params.voice)
1231
+ input.voice = params.voice;
1232
+ if (params.strength != null)
1233
+ input.strength = params.strength;
1234
+ if (params.seed != null)
1235
+ input.seed = params.seed;
1236
+ log.debug("audioToAudio", { model: params.model.id });
1237
+ const output = await this.runModel(params.model.id, this.pruneToDeclaredInputs(params.model.id, input));
1238
+ const bytes = await this._fetchOutputBytes(output);
1239
+ return { data: bytes, mimeType: sniffAudioMime(bytes) };
482
1240
  }
483
1241
  }
484
1242
  //# sourceMappingURL=replicate-provider.js.map