@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,11 +1,104 @@
1
- import { randomUUID } from "node:crypto";
1
+ import { getNodeBuiltinSync } from "@nodetool-ai/config";
2
2
  import { BaseProvider } from "./base-provider.js";
3
+ const _nodeCrypto = getNodeBuiltinSync("node:crypto");
4
+ const randomUUID = () => {
5
+ if (_nodeCrypto?.randomUUID)
6
+ return _nodeCrypto.randomUUID();
7
+ const g = globalThis;
8
+ if (g.crypto?.randomUUID)
9
+ return g.crypto.randomUUID();
10
+ return `id_${Date.now().toString(36)}_${Math.random()
11
+ .toString(36)
12
+ .slice(2, 10)}`;
13
+ };
14
+ // ---------------------------------------------------------------------------
15
+ // Tiny but valid asset bytes for fake media generators.
16
+ // ---------------------------------------------------------------------------
17
+ /**
18
+ * Minimal 1×1 transparent PNG. Sufficient for any consumer that just sniffs
19
+ * the file signature or runs the bytes through `sharp` / Pillow / etc.
20
+ */
21
+ const TINY_PNG = new Uint8Array([
22
+ 0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a,
23
+ 0x00, 0x00, 0x00, 0x0d, 0x49, 0x48, 0x44, 0x52,
24
+ 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01,
25
+ 0x08, 0x06, 0x00, 0x00, 0x00, 0x1f, 0x15, 0xc4,
26
+ 0x89, 0x00, 0x00, 0x00, 0x0d, 0x49, 0x44, 0x41,
27
+ 0x54, 0x78, 0x9c, 0x63, 0x00, 0x01, 0x00, 0x00,
28
+ 0x05, 0x00, 0x01, 0x0d, 0x0a, 0x2d, 0xb4, 0x00,
29
+ 0x00, 0x00, 0x00, 0x49, 0x45, 0x4e, 0x44, 0xae,
30
+ 0x42, 0x60, 0x82
31
+ ]);
32
+ /**
33
+ * Minimal MP4 `ftyp` box marking the file as `isom`/`mp4`. Consumers that
34
+ * just sniff the container (ffprobe header check, Sharp's video detector)
35
+ * are satisfied; nothing decodes it.
36
+ */
37
+ const TINY_MP4 = new Uint8Array([
38
+ 0x00, 0x00, 0x00, 0x18, 0x66, 0x74, 0x79, 0x70,
39
+ 0x69, 0x73, 0x6f, 0x6d, 0x00, 0x00, 0x00, 0x00,
40
+ 0x69, 0x73, 0x6f, 0x6d, 0x6d, 0x70, 0x34, 0x32
41
+ ]);
42
+ /**
43
+ * Tiny silent 24 kHz mono WAV (10 ms of zeros). Mirrors what the streaming
44
+ * TTS path produces after `encodePcm16Wav` wraps the PCM samples.
45
+ */
46
+ function tinyWav() {
47
+ const sampleRate = 24000;
48
+ const numSamples = 240; // 10 ms
49
+ const dataSize = numSamples * 2;
50
+ const buf = new Uint8Array(44 + dataSize);
51
+ const view = new DataView(buf.buffer);
52
+ // RIFF header
53
+ buf.set([0x52, 0x49, 0x46, 0x46], 0); // "RIFF"
54
+ view.setUint32(4, 36 + dataSize, true);
55
+ buf.set([0x57, 0x41, 0x56, 0x45], 8); // "WAVE"
56
+ // fmt chunk
57
+ buf.set([0x66, 0x6d, 0x74, 0x20], 12); // "fmt "
58
+ view.setUint32(16, 16, true);
59
+ view.setUint16(20, 1, true); // PCM
60
+ view.setUint16(22, 1, true); // channels
61
+ view.setUint32(24, sampleRate, true);
62
+ view.setUint32(28, sampleRate * 2, true);
63
+ view.setUint16(32, 2, true);
64
+ view.setUint16(34, 16, true);
65
+ // data chunk
66
+ buf.set([0x64, 0x61, 0x74, 0x61], 36); // "data"
67
+ view.setUint32(40, dataSize, true);
68
+ return buf;
69
+ }
70
+ /**
71
+ * Minimal GLB (binary glTF) header — version 2, contentLength 12. Real glTF
72
+ * loaders fail on this, but consumers that just route bytes through never
73
+ * notice.
74
+ */
75
+ const TINY_GLB = new Uint8Array([
76
+ 0x67, 0x6c, 0x54, 0x46, 0x02, 0x00, 0x00, 0x00,
77
+ 0x0c, 0x00, 0x00, 0x00
78
+ ]);
79
+ function defaultToolArgs(toolName, index) {
80
+ switch (toolName) {
81
+ case "add_item":
82
+ return { item: `fake item ${index + 1}` };
83
+ case "add_row":
84
+ return { row: { id: index + 1, value: `fake row ${index + 1}` } };
85
+ case "emit":
86
+ case "emit_text":
87
+ return { text: `fake text ${index + 1}` };
88
+ default:
89
+ return {};
90
+ }
91
+ }
3
92
  export class FakeProvider extends BaseProvider {
4
93
  textResponse;
5
94
  toolCalls;
6
95
  shouldStream;
7
96
  chunkSize;
8
97
  customResponseFn;
98
+ toolCallsPerTool;
99
+ toolArgsBuilder;
100
+ /** Number of LLM invocations that have already auto-emitted tool calls. */
101
+ _toolBurstsEmitted = 0;
9
102
  callCount = 0;
10
103
  lastMessages = null;
11
104
  lastModel = null;
@@ -18,6 +111,29 @@ export class FakeProvider extends BaseProvider {
18
111
  this.shouldStream = options.shouldStream ?? true;
19
112
  this.chunkSize = options.chunkSize ?? 10;
20
113
  this.customResponseFn = options.customResponseFn ?? null;
114
+ this.toolCallsPerTool = options.toolCallsPerTool ?? 3;
115
+ this.toolArgsBuilder = options.toolArgsBuilder ?? defaultToolArgs;
116
+ }
117
+ autoToolCalls(tools) {
118
+ if (this.toolCallsPerTool <= 0 ||
119
+ tools.length === 0 ||
120
+ this._toolBurstsEmitted > 0 ||
121
+ this.toolCalls.length > 0 ||
122
+ this.customResponseFn !== null) {
123
+ return null;
124
+ }
125
+ const calls = [];
126
+ for (const t of tools) {
127
+ for (let i = 0; i < this.toolCallsPerTool; i++) {
128
+ calls.push({
129
+ id: randomUUID(),
130
+ name: t.name,
131
+ args: this.toolArgsBuilder(t.name, i)
132
+ });
133
+ }
134
+ }
135
+ this._toolBurstsEmitted += 1;
136
+ return calls;
21
137
  }
22
138
  getResponse(messages, model) {
23
139
  if (this.customResponseFn) {
@@ -43,6 +159,10 @@ export class FakeProvider extends BaseProvider {
43
159
  this.lastMessages = args.messages;
44
160
  this.lastModel = args.model;
45
161
  this.lastTools = args.tools ?? [];
162
+ const auto = this.autoToolCalls(args.tools ?? []);
163
+ if (auto) {
164
+ return { role: "assistant", content: [], toolCalls: auto };
165
+ }
46
166
  const response = this.getResponse(args.messages, args.model);
47
167
  if (Array.isArray(response)) {
48
168
  return { role: "assistant", content: [], toolCalls: response };
@@ -55,6 +175,12 @@ export class FakeProvider extends BaseProvider {
55
175
  this.lastMessages = args.messages;
56
176
  this.lastModel = args.model;
57
177
  this.lastTools = args.tools ?? [];
178
+ const auto = this.autoToolCalls(args.tools ?? []);
179
+ if (auto) {
180
+ for (const call of auto)
181
+ yield call;
182
+ return;
183
+ }
58
184
  const response = this.getResponse(args.messages, args.model);
59
185
  if (Array.isArray(response)) {
60
186
  for (const toolCall of response) {
@@ -83,6 +209,82 @@ export class FakeProvider extends BaseProvider {
83
209
  };
84
210
  }
85
211
  }
212
+ // -------------------------------------------------------------------------
213
+ // Media-generation capabilities
214
+ //
215
+ // Each method returns the smallest possible "valid-enough" payload for the
216
+ // requested format so downstream nodes can mime-sniff / route the bytes
217
+ // without performing a real decode. The point is to satisfy the contract
218
+ // of the surrounding workflow node, not to produce media a user can play.
219
+ // -------------------------------------------------------------------------
220
+ async textToImage(_params) {
221
+ this.callCount++;
222
+ return new Uint8Array(TINY_PNG);
223
+ }
224
+ async imageToImage(_images, _params) {
225
+ this.callCount++;
226
+ return new Uint8Array(TINY_PNG);
227
+ }
228
+ async upscaleImage(_image, _params) {
229
+ this.callCount++;
230
+ return new Uint8Array(TINY_PNG);
231
+ }
232
+ async removeBackground(_image, _params) {
233
+ this.callCount++;
234
+ return new Uint8Array(TINY_PNG);
235
+ }
236
+ async relightImage(_image, _params) {
237
+ this.callCount++;
238
+ return new Uint8Array(TINY_PNG);
239
+ }
240
+ async vectorizeImage(_image, _params) {
241
+ this.callCount++;
242
+ // Bare-minimum SVG; consumers either route bytes or parse XML.
243
+ return new TextEncoder().encode('<svg xmlns="http://www.w3.org/2000/svg" width="1" height="1"></svg>');
244
+ }
245
+ async textToVideo(_params) {
246
+ this.callCount++;
247
+ return new Uint8Array(TINY_MP4);
248
+ }
249
+ async imageToVideo(_image, _params) {
250
+ this.callCount++;
251
+ return new Uint8Array(TINY_MP4);
252
+ }
253
+ async videoToVideo(_video, _params) {
254
+ this.callCount++;
255
+ return new Uint8Array(TINY_MP4);
256
+ }
257
+ async lipSync(_video, _params) {
258
+ this.callCount++;
259
+ return new Uint8Array(TINY_MP4);
260
+ }
261
+ async *textToSpeech(_args) {
262
+ this.callCount++;
263
+ yield { samples: new Int16Array(240), sampleRate: 24000 };
264
+ }
265
+ async textToSpeechEncoded(_args) {
266
+ this.callCount++;
267
+ return { data: tinyWav(), mimeType: "audio/wav" };
268
+ }
269
+ async automaticSpeechRecognition(_args) {
270
+ this.callCount++;
271
+ return { text: "fake transcript", chunks: [] };
272
+ }
273
+ async generateEmbedding(args) {
274
+ this.callCount++;
275
+ const dims = args.dimensions ?? 8;
276
+ const items = Array.isArray(args.text) ? args.text : [args.text];
277
+ // Deterministic small vector per input for stable test snapshots.
278
+ return items.map((s, idx) => Array.from({ length: dims }, (_, d) => ((s.length + idx + d) % 7) / 10));
279
+ }
280
+ async textTo3D(_params) {
281
+ this.callCount++;
282
+ return new Uint8Array(TINY_GLB);
283
+ }
284
+ async imageTo3D(_image, _params) {
285
+ this.callCount++;
286
+ return new Uint8Array(TINY_GLB);
287
+ }
86
288
  }
87
289
  export function createFakeToolCall(name, args, callId) {
88
290
  return {
@@ -1 +1 @@
1
- {"version":3,"file":"fake-provider.js","sourceRoot":"","sources":["../../src/providers/fake-provider.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAEzC,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAuBlD,MAAM,OAAO,YAAa,SAAQ,YAAY;IAC5C,YAAY,CAAS;IACrB,SAAS,CAAa;IACtB,YAAY,CAAU;IACtB,SAAS,CAAS;IAClB,gBAAgB,CAA0B;IAE1C,SAAS,GAAG,CAAC,CAAC;IACd,YAAY,GAAqB,IAAI,CAAC;IACtC,SAAS,GAAkB,IAAI,CAAC;IAChC,SAAS,GAAmB,EAAE,CAAC;IAE/B,YAAY,UAA+B,EAAE;QAC3C,KAAK,CAAC,MAAM,CAAC,CAAC;QACd,IAAI,CAAC,YAAY;YACf,OAAO,CAAC,YAAY,IAAI,iCAAiC,CAAC;QAC5D,IAAI,CAAC,SAAS,GAAG,OAAO,CAAC,SAAS,IAAI,EAAE,CAAC;QACzC,IAAI,CAAC,YAAY,GAAG,OAAO,CAAC,YAAY,IAAI,IAAI,CAAC;QACjD,IAAI,CAAC,SAAS,GAAG,OAAO,CAAC,SAAS,IAAI,EAAE,CAAC;QACzC,IAAI,CAAC,gBAAgB,GAAG,OAAO,CAAC,gBAAgB,IAAI,IAAI,CAAC;IAC3D,CAAC;IAEO,WAAW,CAAC,QAAmB,EAAE,KAAa;QACpD,IAAI,IAAI,CAAC,gBAAgB,EAAE,CAAC;YAC1B,OAAO,IAAI,CAAC,gBAAgB,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC;QAChD,CAAC;QACD,IAAI,IAAI,CAAC,SAAS,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC9B,OAAO,IAAI,CAAC,SAAS,CAAC;QACxB,CAAC;QACD,OAAO,IAAI,CAAC,YAAY,CAAC;IAC3B,CAAC;IAED,cAAc;QACZ,IAAI,CAAC,SAAS,GAAG,CAAC,CAAC;IACrB,CAAC;IAEQ,KAAK,CAAC,0BAA0B;QACvC,OAAO;YACL,EAAE,EAAE,EAAE,eAAe,EAAE,IAAI,EAAE,eAAe,EAAE,QAAQ,EAAE,MAAM,EAAE;YAChE,EAAE,EAAE,EAAE,eAAe,EAAE,IAAI,EAAE,eAAe,EAAE,QAAQ,EAAE,MAAM,EAAE;YAChE,EAAE,EAAE,EAAE,iBAAiB,EAAE,IAAI,EAAE,iBAAiB,EAAE,QAAQ,EAAE,MAAM,EAAE;SACrE,CAAC;IACJ,CAAC;IAED,KAAK,CAAC,eAAe,CAAC,IASrB;QACC,IAAI,CAAC,SAAS,EAAE,CAAC;QACjB,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC,QAAQ,CAAC;QAClC,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC;QAC5B,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,KAAK,IAAI,EAAE,CAAC;QAElC,MAAM,QAAQ,GAAG,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC;QAE7D,IAAI,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAC;YAC5B,OAAO,EAAE,IAAI,EAAE,WAAW,EAAE,OAAO,EAAE,EAAE,EAAE,SAAS,EAAE,QAAQ,EAAE,CAAC;QACjE,CAAC;QACD,MAAM,OAAO,GAAyB,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC,CAAC;QACzE,OAAO,EAAE,IAAI,EAAE,WAAW,EAAE,OAAO,EAAE,CAAC;IACxC,CAAC;IAED,KAAK,CAAC,CAAC,gBAAgB,CAAC,IAUvB;QACC,IAAI,CAAC,SAAS,EAAE,CAAC;QACjB,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC,QAAQ,CAAC;QAClC,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC;QAC5B,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,KAAK,IAAI,EAAE,CAAC;QAElC,MAAM,QAAQ,GAAG,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC;QAE7D,IAAI,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAC;YAC5B,KAAK,MAAM,QAAQ,IAAI,QAAQ,EAAE,CAAC;gBAChC,MAAM,QAAQ,CAAC;YACjB,CAAC;YACD,OAAO;QACT,CAAC;QAED,IAAI,IAAI,CAAC,YAAY,IAAI,QAAQ,CAAC,MAAM,GAAG,IAAI,CAAC,SAAS,EAAE,CAAC;YAC1D,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,QAAQ,CAAC,MAAM,EAAE,CAAC,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC;gBACzD,MAAM,SAAS,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,SAAS,CAAC,CAAC;gBACxD,MAAM,IAAI,GAAG,CAAC,GAAG,IAAI,CAAC,SAAS,IAAI,QAAQ,CAAC,MAAM,CAAC;gBACnD,MAAM;oBACJ,IAAI,EAAE,OAAO;oBACb,OAAO,EAAE,SAAS;oBAClB,IAAI;oBACJ,YAAY,EAAE,MAAM;iBACZ,CAAC;YACb,CAAC;QACH,CAAC;aAAM,CAAC;YACN,MAAM;gBACJ,IAAI,EAAE,OAAO;gBACb,OAAO,EAAE,QAAQ;gBACjB,IAAI,EAAE,IAAI;gBACV,YAAY,EAAE,MAAM;aACZ,CAAC;QACb,CAAC;IACH,CAAC;CACF;AAED,MAAM,UAAU,kBAAkB,CAChC,IAAY,EACZ,IAA8B,EAC9B,MAAe;IAEf,OAAO;QACL,EAAE,EAAE,MAAM,IAAI,UAAU,EAAE;QAC1B,IAAI;QACJ,IAAI,EAAE,IAAI,IAAI,EAAE;KACjB,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,wBAAwB,CACtC,YAAY,GAAG,eAAe;IAE9B,OAAO,IAAI,YAAY,CAAC,EAAE,YAAY,EAAE,YAAY,EAAE,YAAY,EAAE,KAAK,EAAE,CAAC,CAAC;AAC/E,CAAC;AAED,MAAM,UAAU,2BAA2B,CACzC,YAAY,GAAG,mCAAmC,EAClD,SAAS,GAAG,CAAC;IAEb,OAAO,IAAI,YAAY,CAAC;QACtB,YAAY,EAAE,YAAY;QAC1B,YAAY,EAAE,IAAI;QAClB,SAAS;KACV,CAAC,CAAC;AACL,CAAC;AAED,MAAM,UAAU,6BAA6B,CAC3C,SAAqB;IAErB,OAAO,IAAI,YAAY,CAAC,EAAE,SAAS,EAAE,CAAC,CAAC;AACzC,CAAC"}
1
+ {"version":3,"file":"fake-provider.js","sourceRoot":"","sources":["../../src/providers/fake-provider.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,106 @@
1
+ /**
2
+ * FAL's request history, read through its Platform APIs.
3
+ *
4
+ * Two endpoints answer different halves of a generation, and this module is
5
+ * the one client for both (https://fal.ai/docs/api-reference/platform-apis):
6
+ *
7
+ * - `GET /v1/models/billing-events` — one record per *charge*: request id,
8
+ * endpoint, timestamp and the billed cost. Account-wide, so it is what a
9
+ * listing without an endpoint filter can use. A billing event says a call
10
+ * was charged, never how it ended, so those records carry
11
+ * `status: "unknown"` rather than an invented outcome.
12
+ * - `GET /v1/models/requests/by-endpoint` — one record per *request*: status
13
+ * code, timings, and with `expand=payloads` the input and output. It
14
+ * requires at least one endpoint id, so it serves a listing filtered by
15
+ * model and the second half of a single lookup.
16
+ *
17
+ * Both need an admin-scoped key; NodeTool reuses `FAL_API_KEY` and a key
18
+ * without that scope 401/403s. The caller gets that as a thrown error on a
19
+ * direct read, and as a `note` with null costs when only the cost half fails.
20
+ */
21
+ import { type ProviderGeneration, type ProviderGenerationLookup, type ProviderGenerationPage, type ProviderGenerationQuery, type ProviderGenerationStatus } from "./provider-generations.js";
22
+ /** One file in a FAL result payload. */
23
+ export interface FalFile {
24
+ url?: string;
25
+ }
26
+ /**
27
+ * The output fields FAL models publish media under. A model that names its
28
+ * output something else still yields a record — with no `output_urls`, which
29
+ * is the honest answer for a payload this does not recognize.
30
+ */
31
+ export interface FalJsonOutput {
32
+ image?: FalFile;
33
+ images?: FalFile[];
34
+ video?: FalFile;
35
+ videos?: FalFile[];
36
+ audio?: FalFile;
37
+ audio_file?: FalFile;
38
+ model_mesh?: FalFile;
39
+ }
40
+ export interface FalBillingEvent {
41
+ request_id?: string;
42
+ endpoint_id?: string;
43
+ timestamp?: string;
44
+ output_units?: number | null;
45
+ unit_price?: number | null;
46
+ cost_total?: number | null;
47
+ cost_estimate_nano_usd?: number | null;
48
+ }
49
+ export interface FalRequestItem {
50
+ request_id?: string;
51
+ endpoint_id?: string;
52
+ started_at?: string | null;
53
+ sent_at?: string | null;
54
+ ended_at?: string | null;
55
+ status_code?: number | null;
56
+ duration?: number | null;
57
+ json_output?: FalJsonOutput;
58
+ }
59
+ /** How this module reaches FAL. Injectable so tests drive it without network. */
60
+ export interface FalGenerationsOptions {
61
+ fetchFn?: typeof fetch;
62
+ signal?: AbortSignal;
63
+ }
64
+ /** FAL refused the key: it is missing, invalid, or not admin-scoped. */
65
+ export declare class FalPlatformAuthError extends Error {
66
+ readonly status: number;
67
+ constructor(status: number);
68
+ }
69
+ /** Outputs FAL still hosts for a request, from the payloads it returns. */
70
+ export declare function falOutputUrls(output: FalJsonOutput | undefined): string[];
71
+ /**
72
+ * A request's outcome from its HTTP status. A request FAL has accepted but not
73
+ * finished has no `ended_at` and no status code yet — that is `running`, not a
74
+ * missing value.
75
+ */
76
+ export declare function falRequestStatus(item: FalRequestItem): ProviderGenerationStatus;
77
+ /** One billing event by request id, or null when FAL has not posted one. */
78
+ export declare function falBillingEvent(apiKey: string, requestId: string, options?: FalGenerationsOptions): Promise<FalBillingEvent | null>;
79
+ /**
80
+ * The billed cost of one FAL request, in USD, or null when no billing event
81
+ * exists for it yet. The reconciler's lookup — see `fal-billing.ts` in
82
+ * `@nodetool-ai/fal-nodes` for the retry that surrounds it.
83
+ */
84
+ export declare function falRequestCost(apiKey: string, requestId: string, options?: FalGenerationsOptions): Promise<{
85
+ cost: number;
86
+ currency: string;
87
+ quantity: number | null;
88
+ unit_price: number | null;
89
+ } | null>;
90
+ /**
91
+ * List FAL's own record of this account's generations, newest first.
92
+ *
93
+ * With a `model` filter the request history answers, so each row carries a
94
+ * real status and its outputs, and one billing call fills the costs in.
95
+ * Without one, only the account-wide billing feed can answer, so the rows
96
+ * carry cost but `status: "unknown"` — the `note` says so.
97
+ */
98
+ export declare function falListGenerations(apiKey: string, query?: ProviderGenerationQuery, options?: FalGenerationsOptions): Promise<ProviderGenerationPage>;
99
+ /**
100
+ * One FAL generation by request id. The billing feed finds it account-wide and
101
+ * names its endpoint; the request history then adds status, timings and
102
+ * outputs. A caller that already knows the endpoint passes it as `model`, and
103
+ * the lookup works even before FAL posts the charge.
104
+ */
105
+ export declare function falGetGeneration(apiKey: string, requestId: string, lookup?: ProviderGenerationLookup, options?: FalGenerationsOptions): Promise<ProviderGeneration | null>;
106
+ //# sourceMappingURL=fal-generations.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fal-generations.d.ts","sourceRoot":"","sources":["../../src/providers/fal-generations.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,286 @@
1
+ /**
2
+ * FAL's request history, read through its Platform APIs.
3
+ *
4
+ * Two endpoints answer different halves of a generation, and this module is
5
+ * the one client for both (https://fal.ai/docs/api-reference/platform-apis):
6
+ *
7
+ * - `GET /v1/models/billing-events` — one record per *charge*: request id,
8
+ * endpoint, timestamp and the billed cost. Account-wide, so it is what a
9
+ * listing without an endpoint filter can use. A billing event says a call
10
+ * was charged, never how it ended, so those records carry
11
+ * `status: "unknown"` rather than an invented outcome.
12
+ * - `GET /v1/models/requests/by-endpoint` — one record per *request*: status
13
+ * code, timings, and with `expand=payloads` the input and output. It
14
+ * requires at least one endpoint id, so it serves a listing filtered by
15
+ * model and the second half of a single lookup.
16
+ *
17
+ * Both need an admin-scoped key; NodeTool reuses `FAL_API_KEY` and a key
18
+ * without that scope 401/403s. The caller gets that as a thrown error on a
19
+ * direct read, and as a `note` with null costs when only the cost half fails.
20
+ */
21
+ import { createLogger } from "@nodetool-ai/config";
22
+ import { isFiniteNumber, isNumber } from "@nodetool-ai/protocol";
23
+ import { boundedLimit, modelFilter, providerGeneration } from "./provider-generations.js";
24
+ const log = createLogger("nodetool.runtime.fal-generations");
25
+ const FAL_PLATFORM_BASE = "https://api.fal.ai/v1";
26
+ const BILLING_EVENTS_PATH = "/models/billing-events";
27
+ const REQUESTS_PATH = "/models/requests/by-endpoint";
28
+ /** `limit` ceiling both endpoints document. */
29
+ const MAX_PAGE = 100;
30
+ const DEFAULT_PAGE = 50;
31
+ /** The window FAL keeps queryable when a request id is given. */
32
+ const LOOKUP_WINDOW_DAYS = 90;
33
+ const NANO_PER_USD = 1_000_000_000;
34
+ function isoDaysAgo(days) {
35
+ return new Date(Date.now() - days * 24 * 60 * 60 * 1000).toISOString();
36
+ }
37
+ function buildUrl(path, params) {
38
+ const query = new URLSearchParams();
39
+ for (const [key, value] of params) {
40
+ if (value.length > 0)
41
+ query.append(key, value);
42
+ }
43
+ const suffix = query.toString();
44
+ return `${FAL_PLATFORM_BASE}${path}${suffix ? `?${suffix}` : ""}`;
45
+ }
46
+ /** FAL refused the key: it is missing, invalid, or not admin-scoped. */
47
+ export class FalPlatformAuthError extends Error {
48
+ status;
49
+ constructor(status) {
50
+ super(`FAL rejected the platform API key (HTTP ${status}). Reading FAL's ` +
51
+ `generation history needs an admin-scoped FAL_API_KEY.`);
52
+ this.name = "FalPlatformAuthError";
53
+ this.status = status;
54
+ }
55
+ }
56
+ async function falGet(apiKey, url, options) {
57
+ const fetchFn = options.fetchFn ?? globalThis.fetch.bind(globalThis);
58
+ const init = {
59
+ headers: { Authorization: `Key ${apiKey}` }
60
+ };
61
+ if (options.signal)
62
+ init.signal = options.signal;
63
+ const res = await fetchFn(url, init);
64
+ if (res.status === 401 || res.status === 403) {
65
+ throw new FalPlatformAuthError(res.status);
66
+ }
67
+ if (!res.ok) {
68
+ const body = await res.text();
69
+ throw new Error(`FAL platform API ${res.status} for ${url}: ${body.slice(0, 500)}`);
70
+ }
71
+ // SAFETY: each caller passes the response interface documented for the
72
+ // endpoint in that URL, and every field of those interfaces is optional, so
73
+ // a payload missing one narrows to undefined rather than lying.
74
+ return (await res.json());
75
+ }
76
+ function costOf(event) {
77
+ if (isFiniteNumber(event.cost_total))
78
+ return event.cost_total;
79
+ const nano = event.cost_estimate_nano_usd;
80
+ return isFiniteNumber(nano) ? nano / NANO_PER_USD : null;
81
+ }
82
+ /** Outputs FAL still hosts for a request, from the payloads it returns. */
83
+ export function falOutputUrls(output) {
84
+ if (!output)
85
+ return [];
86
+ const files = [
87
+ output.image,
88
+ output.video,
89
+ output.audio,
90
+ output.audio_file,
91
+ output.model_mesh,
92
+ ...(output.images ?? []),
93
+ ...(output.videos ?? [])
94
+ ];
95
+ const urls = [];
96
+ for (const file of files) {
97
+ const url = file?.url;
98
+ if (url !== undefined && url.length > 0)
99
+ urls.push(url);
100
+ }
101
+ return urls;
102
+ }
103
+ /**
104
+ * A request's outcome from its HTTP status. A request FAL has accepted but not
105
+ * finished has no `ended_at` and no status code yet — that is `running`, not a
106
+ * missing value.
107
+ */
108
+ export function falRequestStatus(item) {
109
+ const code = item.status_code;
110
+ if (!isNumber(code)) {
111
+ return item.ended_at ? "unknown" : "running";
112
+ }
113
+ if (code >= 200 && code < 400)
114
+ return "completed";
115
+ if (code >= 400)
116
+ return "failed";
117
+ return "unknown";
118
+ }
119
+ /** FAL's `status` filter for the statuses it can express. */
120
+ function falStatusFilter(status) {
121
+ if (status === "completed")
122
+ return "success";
123
+ if (status === "failed")
124
+ return "error";
125
+ return "";
126
+ }
127
+ function fromBillingEvent(event) {
128
+ const requestId = event.request_id;
129
+ if (requestId === undefined || requestId.length === 0)
130
+ return null;
131
+ return providerGeneration({
132
+ provider: "fal_ai",
133
+ request_id: requestId,
134
+ model: event.endpoint_id ?? null,
135
+ // A charge is not an outcome. `by-endpoint` is what knows how it ended.
136
+ status: "unknown",
137
+ created_at: event.timestamp ?? null,
138
+ cost: costOf(event),
139
+ currency: "USD",
140
+ quantity: event.output_units ?? null,
141
+ unit_price: event.unit_price ?? null
142
+ });
143
+ }
144
+ function fromRequestItem(item, event) {
145
+ const requestId = item.request_id;
146
+ if (requestId === undefined || requestId.length === 0)
147
+ return null;
148
+ return providerGeneration({
149
+ provider: "fal_ai",
150
+ request_id: requestId,
151
+ model: item.endpoint_id ?? event?.endpoint_id ?? null,
152
+ status: falRequestStatus(item),
153
+ created_at: item.started_at ?? item.sent_at ?? event?.timestamp ?? null,
154
+ completed_at: item.ended_at ?? null,
155
+ duration_seconds: item.duration ?? null,
156
+ cost: event ? costOf(event) : null,
157
+ currency: event ? "USD" : null,
158
+ quantity: event?.output_units ?? null,
159
+ unit_price: event?.unit_price ?? null,
160
+ output_urls: falOutputUrls(item.json_output)
161
+ });
162
+ }
163
+ /** One billing event by request id, or null when FAL has not posted one. */
164
+ export async function falBillingEvent(apiKey, requestId, options = {}) {
165
+ const url = buildUrl(BILLING_EVENTS_PATH, [
166
+ ["request_id", requestId],
167
+ ["start", isoDaysAgo(LOOKUP_WINDOW_DAYS)]
168
+ ]);
169
+ const body = await falGet(apiKey, url, options);
170
+ return ((body.billing_events ?? []).find((e) => e.request_id === requestId) ?? null);
171
+ }
172
+ /**
173
+ * The billed cost of one FAL request, in USD, or null when no billing event
174
+ * exists for it yet. The reconciler's lookup — see `fal-billing.ts` in
175
+ * `@nodetool-ai/fal-nodes` for the retry that surrounds it.
176
+ */
177
+ export async function falRequestCost(apiKey, requestId, options = {}) {
178
+ const event = await falBillingEvent(apiKey, requestId, options);
179
+ if (!event)
180
+ return null;
181
+ const cost = costOf(event);
182
+ if (cost === null)
183
+ return null;
184
+ return {
185
+ cost,
186
+ currency: "USD",
187
+ quantity: event.output_units ?? null,
188
+ unit_price: event.unit_price ?? null
189
+ };
190
+ }
191
+ /**
192
+ * List FAL's own record of this account's generations, newest first.
193
+ *
194
+ * With a `model` filter the request history answers, so each row carries a
195
+ * real status and its outputs, and one billing call fills the costs in.
196
+ * Without one, only the account-wide billing feed can answer, so the rows
197
+ * carry cost but `status: "unknown"` — the `note` says so.
198
+ */
199
+ export async function falListGenerations(apiKey, query = {}, options = {}) {
200
+ const limit = boundedLimit(query.limit, DEFAULT_PAGE, MAX_PAGE);
201
+ const endpoints = modelFilter(query.model);
202
+ const window = [
203
+ ["start", query.since ?? ""],
204
+ ["end", query.until ?? ""]
205
+ ];
206
+ if (endpoints.length === 0) {
207
+ const url = buildUrl(BILLING_EVENTS_PATH, [
208
+ ...window,
209
+ ["limit", String(limit)],
210
+ ["cursor", query.cursor ?? ""]
211
+ ]);
212
+ const body = await falGet(apiKey, url, options);
213
+ const generations = (body.billing_events ?? [])
214
+ .map(fromBillingEvent)
215
+ .filter((row) => row !== null);
216
+ return {
217
+ generations,
218
+ next_cursor: body.next_cursor ?? null,
219
+ note: "FAL lists account-wide generations through its billing feed, which " +
220
+ "records the charge and not the outcome. Pass a model (endpoint id) " +
221
+ "to read status, timings and outputs."
222
+ };
223
+ }
224
+ const url = buildUrl(REQUESTS_PATH, [
225
+ ...window,
226
+ ["endpoint_id", endpoints.join(",")],
227
+ ["limit", String(limit)],
228
+ ["cursor", query.cursor ?? ""],
229
+ ["status", falStatusFilter(query.status)],
230
+ ["expand", "payloads"]
231
+ ]);
232
+ const body = await falGet(apiKey, url, options);
233
+ const items = body.items ?? [];
234
+ // The request history carries no cost, so one billing call over the same
235
+ // window and endpoints supplies it. A key without billing scope leaves the
236
+ // costs null rather than failing a listing that otherwise answered.
237
+ const costs = new Map();
238
+ let note = null;
239
+ if (items.length > 0) {
240
+ const billingUrl = buildUrl(BILLING_EVENTS_PATH, [
241
+ ...window,
242
+ ["endpoint_id", endpoints.join(",")],
243
+ ["limit", String(MAX_PAGE)]
244
+ ]);
245
+ try {
246
+ const billing = await falGet(apiKey, billingUrl, options);
247
+ for (const event of billing.billing_events ?? []) {
248
+ if (event.request_id)
249
+ costs.set(event.request_id, event);
250
+ }
251
+ }
252
+ catch (err) {
253
+ log.warn(`FAL billing lookup failed, listing without costs: ${err}`);
254
+ note = `Costs are missing: the FAL billing feed answered ${String(err)}.`;
255
+ }
256
+ }
257
+ const generations = items
258
+ .map((item) => fromRequestItem(item, costs.get(item.request_id ?? "") ?? undefined))
259
+ .filter((row) => row !== null);
260
+ return { generations, next_cursor: body.next_cursor ?? null, note };
261
+ }
262
+ /**
263
+ * One FAL generation by request id. The billing feed finds it account-wide and
264
+ * names its endpoint; the request history then adds status, timings and
265
+ * outputs. A caller that already knows the endpoint passes it as `model`, and
266
+ * the lookup works even before FAL posts the charge.
267
+ */
268
+ export async function falGetGeneration(apiKey, requestId, lookup = {}, options = {}) {
269
+ const event = await falBillingEvent(apiKey, requestId, options);
270
+ const endpointId = lookup.model ?? event?.endpoint_id ?? null;
271
+ if (endpointId === null) {
272
+ return event ? fromBillingEvent(event) : null;
273
+ }
274
+ const url = buildUrl(REQUESTS_PATH, [
275
+ ["endpoint_id", endpointId],
276
+ ["request_id", requestId],
277
+ ["start", isoDaysAgo(LOOKUP_WINDOW_DAYS)],
278
+ ["expand", "payloads"]
279
+ ]);
280
+ const body = await falGet(apiKey, url, options);
281
+ const item = (body.items ?? []).find((i) => i.request_id === requestId);
282
+ if (!item)
283
+ return event ? fromBillingEvent(event) : null;
284
+ return fromRequestItem(item, event ?? undefined);
285
+ }
286
+ //# sourceMappingURL=fal-generations.js.map