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

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