@nodetool-ai/runtime 0.8.1 → 0.8.3

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 (373) hide show
  1. package/dist/.nodetool-build-stamp +1 -1
  2. package/dist/context.d.ts +31 -3
  3. package/dist/context.d.ts.map +1 -1
  4. package/dist/context.js +369 -160
  5. package/dist/context.js.map +1 -1
  6. package/dist/generation-registry.d.ts +8 -0
  7. package/dist/generation-registry.d.ts.map +1 -1
  8. package/dist/generation-registry.js +18 -0
  9. package/dist/generation-registry.js.map +1 -1
  10. package/dist/host-binaries.d.ts.map +1 -1
  11. package/dist/host-binaries.js +18 -10
  12. package/dist/host-binaries.js.map +1 -1
  13. package/dist/image-codec.d.ts +2 -0
  14. package/dist/image-codec.d.ts.map +1 -1
  15. package/dist/image-codec.js +23 -3
  16. package/dist/image-codec.js.map +1 -1
  17. package/dist/image-model-tasks.d.ts +35 -0
  18. package/dist/image-model-tasks.d.ts.map +1 -0
  19. package/dist/image-model-tasks.js +67 -0
  20. package/dist/image-model-tasks.js.map +1 -0
  21. package/dist/index.d.ts +14 -3
  22. package/dist/index.d.ts.map +1 -1
  23. package/dist/index.js +10 -2
  24. package/dist/index.js.map +1 -1
  25. package/dist/media-ref-bytes.d.ts +18 -2
  26. package/dist/media-ref-bytes.d.ts.map +1 -1
  27. package/dist/media-ref-bytes.js +26 -16
  28. package/dist/media-ref-bytes.js.map +1 -1
  29. package/dist/node-executor.d.ts +6 -0
  30. package/dist/node-executor.d.ts.map +1 -1
  31. package/dist/prompt-asset-refs.d.ts +12 -1
  32. package/dist/prompt-asset-refs.d.ts.map +1 -1
  33. package/dist/prompt-asset-refs.js +9 -4
  34. package/dist/prompt-asset-refs.js.map +1 -1
  35. package/dist/providers/aki-provider.d.ts +2 -0
  36. package/dist/providers/aki-provider.d.ts.map +1 -1
  37. package/dist/providers/aki-provider.js +6 -0
  38. package/dist/providers/aki-provider.js.map +1 -1
  39. package/dist/providers/api-route-provider.d.ts +22 -0
  40. package/dist/providers/api-route-provider.d.ts.map +1 -0
  41. package/dist/providers/api-route-provider.js +56 -0
  42. package/dist/providers/api-route-provider.js.map +1 -0
  43. package/dist/providers/atlascloud-provider.d.ts +2 -0
  44. package/dist/providers/atlascloud-provider.d.ts.map +1 -1
  45. package/dist/providers/atlascloud-provider.js +22 -0
  46. package/dist/providers/atlascloud-provider.js.map +1 -1
  47. package/dist/providers/base-provider.d.ts +36 -24
  48. package/dist/providers/base-provider.d.ts.map +1 -1
  49. package/dist/providers/base-provider.js +145 -150
  50. package/dist/providers/base-provider.js.map +1 -1
  51. package/dist/providers/chatgpt-provider.d.ts +48 -0
  52. package/dist/providers/chatgpt-provider.d.ts.map +1 -0
  53. package/dist/providers/chatgpt-provider.js +506 -0
  54. package/dist/providers/chatgpt-provider.js.map +1 -0
  55. package/dist/providers/claude-agent-provider.d.ts +6 -36
  56. package/dist/providers/claude-agent-provider.d.ts.map +1 -1
  57. package/dist/providers/claude-agent-provider.js +208 -26
  58. package/dist/providers/claude-agent-provider.js.map +1 -1
  59. package/dist/providers/codex-provider.d.ts +2 -0
  60. package/dist/providers/codex-provider.d.ts.map +1 -1
  61. package/dist/providers/codex-provider.js +15 -2
  62. package/dist/providers/codex-provider.js.map +1 -1
  63. package/dist/providers/cohere-provider.d.ts +2 -1
  64. package/dist/providers/cohere-provider.d.ts.map +1 -1
  65. package/dist/providers/cohere-provider.js +5 -0
  66. package/dist/providers/cohere-provider.js.map +1 -1
  67. package/dist/providers/context-window.d.ts.map +1 -1
  68. package/dist/providers/context-window.js +1 -0
  69. package/dist/providers/context-window.js.map +1 -1
  70. package/dist/providers/core-tools.d.ts +2 -1
  71. package/dist/providers/core-tools.d.ts.map +1 -1
  72. package/dist/providers/core-tools.js +2 -1
  73. package/dist/providers/core-tools.js.map +1 -1
  74. package/dist/providers/cost-calculator.d.ts.map +1 -1
  75. package/dist/providers/cost-calculator.js +9 -0
  76. package/dist/providers/cost-calculator.js.map +1 -1
  77. package/dist/providers/credential-check.d.ts +8 -0
  78. package/dist/providers/credential-check.d.ts.map +1 -1
  79. package/dist/providers/credential-check.js +27 -0
  80. package/dist/providers/credential-check.js.map +1 -1
  81. package/dist/providers/custom-openai-provider.d.ts +2 -0
  82. package/dist/providers/custom-openai-provider.d.ts.map +1 -1
  83. package/dist/providers/custom-openai-provider.js +27 -1
  84. package/dist/providers/custom-openai-provider.js.map +1 -1
  85. package/dist/providers/dreamina-models.d.ts +5 -0
  86. package/dist/providers/dreamina-models.d.ts.map +1 -0
  87. package/dist/providers/dreamina-models.js +57 -0
  88. package/dist/providers/dreamina-models.js.map +1 -0
  89. package/dist/providers/dreamina-music.d.ts +52 -0
  90. package/dist/providers/dreamina-music.d.ts.map +1 -0
  91. package/dist/providers/dreamina-music.js +115 -0
  92. package/dist/providers/dreamina-music.js.map +1 -0
  93. package/dist/providers/dreamina-provider.d.ts +64 -0
  94. package/dist/providers/dreamina-provider.d.ts.map +1 -0
  95. package/dist/providers/dreamina-provider.js +1001 -0
  96. package/dist/providers/dreamina-provider.js.map +1 -0
  97. package/dist/providers/elevenlabs-provider.d.ts +2 -1
  98. package/dist/providers/elevenlabs-provider.d.ts.map +1 -1
  99. package/dist/providers/elevenlabs-provider.js +5 -0
  100. package/dist/providers/elevenlabs-provider.js.map +1 -1
  101. package/dist/providers/evolink-provider.d.ts +2 -0
  102. package/dist/providers/evolink-provider.d.ts.map +1 -1
  103. package/dist/providers/evolink-provider.js +8 -0
  104. package/dist/providers/evolink-provider.js.map +1 -1
  105. package/dist/providers/extension-tab.d.ts +29 -0
  106. package/dist/providers/extension-tab.d.ts.map +1 -0
  107. package/dist/providers/extension-tab.js +144 -0
  108. package/dist/providers/extension-tab.js.map +1 -0
  109. package/dist/providers/fake-provider.d.ts +5 -2
  110. package/dist/providers/fake-provider.d.ts.map +1 -1
  111. package/dist/providers/fake-provider.js +73 -9
  112. package/dist/providers/fake-provider.js.map +1 -1
  113. package/dist/providers/fake-schema-answer.d.ts +10 -0
  114. package/dist/providers/fake-schema-answer.d.ts.map +1 -0
  115. package/dist/providers/fake-schema-answer.js +64 -0
  116. package/dist/providers/fake-schema-answer.js.map +1 -0
  117. package/dist/providers/fal-provider.d.ts +2 -1
  118. package/dist/providers/fal-provider.d.ts.map +1 -1
  119. package/dist/providers/fal-provider.js +32 -2
  120. package/dist/providers/fal-provider.js.map +1 -1
  121. package/dist/providers/gemini-provider.d.ts +2 -1
  122. package/dist/providers/gemini-provider.d.ts.map +1 -1
  123. package/dist/providers/gemini-provider.js +15 -0
  124. package/dist/providers/gemini-provider.js.map +1 -1
  125. package/dist/providers/gemini-web-provider.d.ts +76 -0
  126. package/dist/providers/gemini-web-provider.d.ts.map +1 -0
  127. package/dist/providers/gemini-web-provider.js +752 -0
  128. package/dist/providers/gemini-web-provider.js.map +1 -0
  129. package/dist/providers/higgsfield-provider.d.ts +2 -1
  130. package/dist/providers/higgsfield-provider.d.ts.map +1 -1
  131. package/dist/providers/higgsfield-provider.js +12 -0
  132. package/dist/providers/higgsfield-provider.js.map +1 -1
  133. package/dist/providers/huggingface-provider.d.ts +2 -1
  134. package/dist/providers/huggingface-provider.d.ts.map +1 -1
  135. package/dist/providers/huggingface-provider.js +27 -1
  136. package/dist/providers/huggingface-provider.js.map +1 -1
  137. package/dist/providers/index.d.ts +14 -3
  138. package/dist/providers/index.d.ts.map +1 -1
  139. package/dist/providers/index.js +48 -9
  140. package/dist/providers/index.js.map +1 -1
  141. package/dist/providers/jina-provider.d.ts +2 -1
  142. package/dist/providers/jina-provider.d.ts.map +1 -1
  143. package/dist/providers/jina-provider.js +5 -0
  144. package/dist/providers/jina-provider.js.map +1 -1
  145. package/dist/providers/kie-provider.d.ts +2 -1
  146. package/dist/providers/kie-provider.d.ts.map +1 -1
  147. package/dist/providers/kie-provider.js +14 -0
  148. package/dist/providers/kie-provider.js.map +1 -1
  149. package/dist/providers/llama-provider.d.ts +12 -1
  150. package/dist/providers/llama-provider.d.ts.map +1 -1
  151. package/dist/providers/llama-provider.js +29 -5
  152. package/dist/providers/llama-provider.js.map +1 -1
  153. package/dist/providers/lmstudio-provider.js +2 -2
  154. package/dist/providers/lmstudio-provider.js.map +1 -1
  155. package/dist/providers/loop-tracing.d.ts +17 -0
  156. package/dist/providers/loop-tracing.d.ts.map +1 -0
  157. package/dist/providers/loop-tracing.js +132 -0
  158. package/dist/providers/loop-tracing.js.map +1 -0
  159. package/dist/providers/manifest-models.d.ts +2 -12
  160. package/dist/providers/manifest-models.d.ts.map +1 -1
  161. package/dist/providers/manifest-models.js +45 -3
  162. package/dist/providers/manifest-models.js.map +1 -1
  163. package/dist/providers/meshy-provider.d.ts +2 -1
  164. package/dist/providers/meshy-provider.d.ts.map +1 -1
  165. package/dist/providers/meshy-provider.js +6 -0
  166. package/dist/providers/meshy-provider.js.map +1 -1
  167. package/dist/providers/meta-provider.d.ts +53 -6
  168. package/dist/providers/meta-provider.d.ts.map +1 -1
  169. package/dist/providers/meta-provider.js +289 -6
  170. package/dist/providers/meta-provider.js.map +1 -1
  171. package/dist/providers/meta-segmentation.d.ts +27 -0
  172. package/dist/providers/meta-segmentation.d.ts.map +1 -0
  173. package/dist/providers/meta-segmentation.js +141 -0
  174. package/dist/providers/meta-segmentation.js.map +1 -0
  175. package/dist/providers/meta-transcription.d.ts +31 -0
  176. package/dist/providers/meta-transcription.d.ts.map +1 -0
  177. package/dist/providers/meta-transcription.js +187 -0
  178. package/dist/providers/meta-transcription.js.map +1 -0
  179. package/dist/providers/minimax-provider.d.ts +2 -0
  180. package/dist/providers/minimax-provider.d.ts.map +1 -1
  181. package/dist/providers/minimax-provider.js +11 -0
  182. package/dist/providers/minimax-provider.js.map +1 -1
  183. package/dist/providers/mistral-provider.d.ts +2 -0
  184. package/dist/providers/mistral-provider.d.ts.map +1 -1
  185. package/dist/providers/mistral-provider.js +5 -0
  186. package/dist/providers/mistral-provider.js.map +1 -1
  187. package/dist/providers/node-llama-cpp-provider.d.ts +8 -4
  188. package/dist/providers/node-llama-cpp-provider.d.ts.map +1 -1
  189. package/dist/providers/node-llama-cpp-provider.js +83 -61
  190. package/dist/providers/node-llama-cpp-provider.js.map +1 -1
  191. package/dist/providers/nodetool-provider.d.ts +1 -1
  192. package/dist/providers/nodetool-provider.d.ts.map +1 -1
  193. package/dist/providers/nodetool-provider.js +0 -2
  194. package/dist/providers/nodetool-provider.js.map +1 -1
  195. package/dist/providers/ollama-provider.d.ts +25 -1
  196. package/dist/providers/ollama-provider.d.ts.map +1 -1
  197. package/dist/providers/ollama-provider.js +145 -27
  198. package/dist/providers/ollama-provider.js.map +1 -1
  199. package/dist/providers/openai-compat/client.d.ts +10 -1
  200. package/dist/providers/openai-compat/client.d.ts.map +1 -1
  201. package/dist/providers/openai-compat/client.js +21 -3
  202. package/dist/providers/openai-compat/client.js.map +1 -1
  203. package/dist/providers/openai-compat/index.d.ts +1 -1
  204. package/dist/providers/openai-compat/index.d.ts.map +1 -1
  205. package/dist/providers/openai-compat/index.js +1 -1
  206. package/dist/providers/openai-compat/index.js.map +1 -1
  207. package/dist/providers/openai-compat/types.d.ts +4 -0
  208. package/dist/providers/openai-compat/types.d.ts.map +1 -1
  209. package/dist/providers/openai-compat-provider.d.ts +11 -0
  210. package/dist/providers/openai-compat-provider.d.ts.map +1 -1
  211. package/dist/providers/openai-compat-provider.js +47 -2
  212. package/dist/providers/openai-compat-provider.js.map +1 -1
  213. package/dist/providers/openai-provider.d.ts +23 -2
  214. package/dist/providers/openai-provider.d.ts.map +1 -1
  215. package/dist/providers/openai-provider.js +102 -21
  216. package/dist/providers/openai-provider.js.map +1 -1
  217. package/dist/providers/openrouter-provider.d.ts +52 -1
  218. package/dist/providers/openrouter-provider.d.ts.map +1 -1
  219. package/dist/providers/openrouter-provider.js +372 -11
  220. package/dist/providers/openrouter-provider.js.map +1 -1
  221. package/dist/providers/opper-provider.d.ts +31 -0
  222. package/dist/providers/opper-provider.d.ts.map +1 -0
  223. package/dist/providers/opper-provider.js +91 -0
  224. package/dist/providers/opper-provider.js.map +1 -0
  225. package/dist/providers/provider-error.d.ts.map +1 -1
  226. package/dist/providers/provider-error.js +7 -1
  227. package/dist/providers/provider-error.js.map +1 -1
  228. package/dist/providers/provider-generations.d.ts +2 -2
  229. package/dist/providers/provider-generations.js +2 -2
  230. package/dist/providers/provider-request-log.d.ts.map +1 -1
  231. package/dist/providers/provider-request-log.js +19 -7
  232. package/dist/providers/provider-request-log.js.map +1 -1
  233. package/dist/providers/python-provider.d.ts +6 -1
  234. package/dist/providers/python-provider.d.ts.map +1 -1
  235. package/dist/providers/python-provider.js +35 -14
  236. package/dist/providers/python-provider.js.map +1 -1
  237. package/dist/providers/replicate-provider.d.ts +2 -1
  238. package/dist/providers/replicate-provider.d.ts.map +1 -1
  239. package/dist/providers/replicate-provider.js +22 -0
  240. package/dist/providers/replicate-provider.js.map +1 -1
  241. package/dist/providers/requesty-provider.d.ts +30 -0
  242. package/dist/providers/requesty-provider.d.ts.map +1 -0
  243. package/dist/providers/requesty-provider.js +87 -0
  244. package/dist/providers/requesty-provider.js.map +1 -0
  245. package/dist/providers/responses-api.d.ts +12 -2
  246. package/dist/providers/responses-api.d.ts.map +1 -1
  247. package/dist/providers/responses-api.js +54 -3
  248. package/dist/providers/responses-api.js.map +1 -1
  249. package/dist/providers/reve-provider.d.ts +2 -1
  250. package/dist/providers/reve-provider.d.ts.map +1 -1
  251. package/dist/providers/reve-provider.js +6 -0
  252. package/dist/providers/reve-provider.js.map +1 -1
  253. package/dist/providers/rodin-provider.d.ts +2 -1
  254. package/dist/providers/rodin-provider.d.ts.map +1 -1
  255. package/dist/providers/rodin-provider.js +6 -0
  256. package/dist/providers/rodin-provider.js.map +1 -1
  257. package/dist/providers/scripted-provider.d.ts.map +1 -1
  258. package/dist/providers/scripted-provider.js +6 -1
  259. package/dist/providers/scripted-provider.js.map +1 -1
  260. package/dist/providers/together-operations.d.ts +27 -0
  261. package/dist/providers/together-operations.d.ts.map +1 -0
  262. package/dist/providers/together-operations.js +95 -0
  263. package/dist/providers/together-operations.js.map +1 -0
  264. package/dist/providers/together-provider.d.ts +5 -8
  265. package/dist/providers/together-provider.d.ts.map +1 -1
  266. package/dist/providers/together-provider.js +54 -159
  267. package/dist/providers/together-provider.js.map +1 -1
  268. package/dist/providers/topaz-provider.d.ts +2 -1
  269. package/dist/providers/topaz-provider.d.ts.map +1 -1
  270. package/dist/providers/topaz-provider.js +5 -0
  271. package/dist/providers/topaz-provider.js.map +1 -1
  272. package/dist/providers/types.d.ts +54 -0
  273. package/dist/providers/types.d.ts.map +1 -1
  274. package/dist/providers/types.js.map +1 -1
  275. package/dist/providers/useapi-provider.d.ts +2 -1
  276. package/dist/providers/useapi-provider.d.ts.map +1 -1
  277. package/dist/providers/useapi-provider.js +8 -0
  278. package/dist/providers/useapi-provider.js.map +1 -1
  279. package/dist/providers/vllm-provider.d.ts +9 -4
  280. package/dist/providers/vllm-provider.d.ts.map +1 -1
  281. package/dist/providers/vllm-provider.js +16 -8
  282. package/dist/providers/vllm-provider.js.map +1 -1
  283. package/dist/providers/voyage-provider.d.ts +2 -1
  284. package/dist/providers/voyage-provider.d.ts.map +1 -1
  285. package/dist/providers/voyage-provider.js +5 -0
  286. package/dist/providers/voyage-provider.js.map +1 -1
  287. package/dist/providers/xai-provider.d.ts +2 -0
  288. package/dist/providers/xai-provider.d.ts.map +1 -1
  289. package/dist/providers/xai-provider.js +8 -0
  290. package/dist/providers/xai-provider.js.map +1 -1
  291. package/dist/python-bridge-base.d.ts +16 -6
  292. package/dist/python-bridge-base.d.ts.map +1 -1
  293. package/dist/python-bridge-base.js +117 -40
  294. package/dist/python-bridge-base.js.map +1 -1
  295. package/dist/python-bridge-codec.d.ts +16 -1
  296. package/dist/python-bridge-codec.d.ts.map +1 -1
  297. package/dist/python-bridge-codec.js +60 -2
  298. package/dist/python-bridge-codec.js.map +1 -1
  299. package/dist/python-bridge-framing.d.ts +10 -1
  300. package/dist/python-bridge-framing.d.ts.map +1 -1
  301. package/dist/python-bridge-framing.js +33 -8
  302. package/dist/python-bridge-framing.js.map +1 -1
  303. package/dist/python-bridge-types.d.ts +26 -5
  304. package/dist/python-bridge-types.d.ts.map +1 -1
  305. package/dist/python-bridge-types.js.map +1 -1
  306. package/dist/python-node-executor.d.ts +14 -3
  307. package/dist/python-node-executor.d.ts.map +1 -1
  308. package/dist/python-node-executor.js +185 -3
  309. package/dist/python-node-executor.js.map +1 -1
  310. package/dist/python-stdio-bridge.d.ts +6 -0
  311. package/dist/python-stdio-bridge.d.ts.map +1 -1
  312. package/dist/python-stdio-bridge.js +25 -2
  313. package/dist/python-stdio-bridge.js.map +1 -1
  314. package/dist/recommended-models.d.ts.map +1 -1
  315. package/dist/recommended-models.js +20 -0
  316. package/dist/recommended-models.js.map +1 -1
  317. package/dist/run-context.d.ts +20 -0
  318. package/dist/run-context.d.ts.map +1 -0
  319. package/dist/run-context.js +18 -0
  320. package/dist/run-context.js.map +1 -0
  321. package/dist/run-trace-context.d.ts +5 -0
  322. package/dist/run-trace-context.d.ts.map +1 -0
  323. package/dist/run-trace-context.js +33 -0
  324. package/dist/run-trace-context.js.map +1 -0
  325. package/dist/run-trace-processor.d.ts +65 -0
  326. package/dist/run-trace-processor.d.ts.map +1 -0
  327. package/dist/run-trace-processor.js +418 -0
  328. package/dist/run-trace-processor.js.map +1 -0
  329. package/dist/run-trace-scope.d.ts +28 -0
  330. package/dist/run-trace-scope.d.ts.map +1 -0
  331. package/dist/run-trace-scope.js +51 -0
  332. package/dist/run-trace-scope.js.map +1 -0
  333. package/dist/run-trace-serialization.d.ts +5 -0
  334. package/dist/run-trace-serialization.d.ts.map +1 -0
  335. package/dist/run-trace-serialization.js +114 -0
  336. package/dist/run-trace-serialization.js.map +1 -0
  337. package/dist/span-record.d.ts +4 -0
  338. package/dist/span-record.d.ts.map +1 -0
  339. package/dist/span-record.js +48 -0
  340. package/dist/span-record.js.map +1 -0
  341. package/dist/storage-workspace.d.ts +3 -0
  342. package/dist/storage-workspace.d.ts.map +1 -1
  343. package/dist/storage-workspace.js +32 -17
  344. package/dist/storage-workspace.js.map +1 -1
  345. package/dist/swappable-python-bridge.d.ts +6 -6
  346. package/dist/swappable-python-bridge.d.ts.map +1 -1
  347. package/dist/swappable-python-bridge.js +10 -10
  348. package/dist/swappable-python-bridge.js.map +1 -1
  349. package/dist/telemetry.d.ts +9 -3
  350. package/dist/telemetry.d.ts.map +1 -1
  351. package/dist/telemetry.js +53 -20
  352. package/dist/telemetry.js.map +1 -1
  353. package/dist/testing.d.ts +1 -1
  354. package/dist/testing.d.ts.map +1 -1
  355. package/dist/testing.js +55 -3
  356. package/dist/testing.js.map +1 -1
  357. package/dist/trace-exporters.d.ts +2 -30
  358. package/dist/trace-exporters.d.ts.map +1 -1
  359. package/dist/trace-exporters.js +4 -42
  360. package/dist/trace-exporters.js.map +1 -1
  361. package/dist/traced-storage.d.ts +17 -0
  362. package/dist/traced-storage.d.ts.map +1 -0
  363. package/dist/traced-storage.js +41 -0
  364. package/dist/traced-storage.js.map +1 -0
  365. package/dist/tracing-helpers.d.ts +15 -22
  366. package/dist/tracing-helpers.d.ts.map +1 -1
  367. package/dist/tracing-helpers.js +38 -6
  368. package/dist/tracing-helpers.js.map +1 -1
  369. package/dist/trim-video-window.d.ts +8 -0
  370. package/dist/trim-video-window.d.ts.map +1 -0
  371. package/dist/trim-video-window.js +50 -0
  372. package/dist/trim-video-window.js.map +1 -0
  373. package/package.json +21 -5
@@ -1,8 +1,10 @@
1
+ import { stringifyTraceContent } from "../run-trace-serialization.js";
2
+ import { tracedProviderLoop, tracedToolCall, beginProviderRound, providerRoundContext, traceContentAllowed, messageTraceContent, traceTextContent } from "./loop-tracing.js";
1
3
  import { isProviderSessionUpdate, isProviderMessageEvent, isProviderStop, isProviderToolErrorResult, PROVIDER_STOP_ABORTED } from "./types.js";
2
4
  import { ProviderGenerationsUnsupportedError } from "./provider-generations.js";
3
5
  import { CostCalculator } from "./cost-calculator.js";
4
6
  import { getTracer } from "../telemetry.js";
5
- import { withUsageCapture, withModalityCapture, setLastUsage, setLastRequest, consumeLastUsage, peekLastUsage, peekLastRequest, createUsageSlot } from "../tracing-helpers.js";
7
+ import { withUsageCapture, withModalityCapture, setLastUsage, setLastRequest, consumeLastUsage, peekLastUsage, peekLastRequest, createUsageSlot, withSpan, withSpanGen } from "../tracing-helpers.js";
6
8
  import { isRunBudget } from "../turn-budget.js";
7
9
  import { countTokens } from "../token-counter.js";
8
10
  import { isCallable, isObjectLike, isRecord, isString } from "@nodetool-ai/protocol";
@@ -11,7 +13,7 @@ import { annotateProviderError, markContextExceeded } from "./provider-error.js"
11
13
  import { buildProviderCallFailure } from "./provider-call-failure.js";
12
14
  import { applyEntityReferences } from "./entity-references.js";
13
15
  import { expandVideoContentAsFrames, videoFrameFallbackEnabled } from "./video-frame-fallback.js";
14
- import { SpanStatusCode } from "@opentelemetry/api";
16
+ import { SpanStatusCode, context, trace } from "@opentelemetry/api";
15
17
  import { createLogger, getDefaultAssetsPath } from "@nodetool-ai/config";
16
18
  const log = createLogger("nodetool.runtime.provider");
17
19
  /**
@@ -72,117 +74,6 @@ export function splitToolResultImages(result) {
72
74
  imageMessage: { role: "user", content: [...texts, ...images] }
73
75
  };
74
76
  }
75
- /**
76
- * Derive a provider's capability set by checking which optional `getAvailable*`
77
- * methods it overrides on its prototype. Every provider can always generate
78
- * messages; image/video/TTS/ASR/embedding are advertised only when the concrete
79
- * class overrides the matching base method.
80
- *
81
- * Shared by `packages/websocket/src/models-api.ts` (REST leftover) and the
82
- * `models` tRPC router so both report identical capabilities for the same
83
- * provider instance.
84
- */
85
- export function providerCapabilities(instance) {
86
- const capabilities = [
87
- "generate_message",
88
- "generate_messages"
89
- ];
90
- if (instance.getAvailableImageModels !==
91
- BaseProvider.prototype.getAvailableImageModels) {
92
- capabilities.push("text_to_image", "image_to_image");
93
- }
94
- if (instance.getAvailableVideoModels !==
95
- BaseProvider.prototype.getAvailableVideoModels) {
96
- capabilities.push("text_to_video", "image_to_video");
97
- }
98
- if (instance.referenceToVideo !== BaseProvider.prototype.referenceToVideo) {
99
- capabilities.push("reference_to_video");
100
- }
101
- // The remaining task types don't have their own model-discovery method —
102
- // they reuse Image/VideoModel (advertised via each model's `supportedTasks`).
103
- // Advertise the provider-level capability when the concrete class overrides
104
- // the matching task method.
105
- if (instance.inpaint !== BaseProvider.prototype.inpaint) {
106
- capabilities.push("inpainting");
107
- }
108
- if (instance.outpaintImage !== BaseProvider.prototype.outpaintImage) {
109
- capabilities.push("outpaint_image");
110
- }
111
- if (instance.upscaleImage !== BaseProvider.prototype.upscaleImage) {
112
- capabilities.push("upscale_image");
113
- }
114
- if (instance.removeBackground !== BaseProvider.prototype.removeBackground) {
115
- capabilities.push("remove_background");
116
- }
117
- if (instance.relightImage !== BaseProvider.prototype.relightImage) {
118
- capabilities.push("relight_image");
119
- }
120
- if (instance.segmentImage !== BaseProvider.prototype.segmentImage) {
121
- capabilities.push("segment_image");
122
- }
123
- if (instance.vectorizeImage !== BaseProvider.prototype.vectorizeImage) {
124
- capabilities.push("vectorize_image");
125
- }
126
- if (instance.videoToVideo !== BaseProvider.prototype.videoToVideo) {
127
- capabilities.push("video_to_video");
128
- }
129
- if (instance.videoToAudio !== BaseProvider.prototype.videoToAudio) {
130
- capabilities.push("video_to_audio");
131
- }
132
- if (instance.trackObject !== BaseProvider.prototype.trackObject) {
133
- capabilities.push("track_object");
134
- }
135
- if (instance.extendVideo !== BaseProvider.prototype.extendVideo) {
136
- capabilities.push("extend_video");
137
- }
138
- if (instance.upscaleVideo !== BaseProvider.prototype.upscaleVideo) {
139
- capabilities.push("upscale_video");
140
- }
141
- if (instance.interpolateVideo !== BaseProvider.prototype.interpolateVideo) {
142
- capabilities.push("interpolate_video");
143
- }
144
- if (instance.outpaintVideo !== BaseProvider.prototype.outpaintVideo) {
145
- capabilities.push("outpaint_video");
146
- }
147
- if (instance.lipSync !== BaseProvider.prototype.lipSync) {
148
- capabilities.push("lip_sync");
149
- }
150
- if (instance.getAvailableTTSModels !==
151
- BaseProvider.prototype.getAvailableTTSModels) {
152
- capabilities.push("text_to_speech");
153
- }
154
- if (instance.getAvailableMusicModels !==
155
- BaseProvider.prototype.getAvailableMusicModels) {
156
- capabilities.push("text_to_music");
157
- }
158
- if (instance.getAvailableAudioToAudioModels !==
159
- BaseProvider.prototype.getAvailableAudioToAudioModels) {
160
- capabilities.push("audio_to_audio");
161
- }
162
- if (instance.getAvailableASRModels !==
163
- BaseProvider.prototype.getAvailableASRModels) {
164
- capabilities.push("automatic_speech_recognition");
165
- }
166
- if (instance.getAvailableEmbeddingModels !==
167
- BaseProvider.prototype.getAvailableEmbeddingModels) {
168
- capabilities.push("generate_embedding");
169
- }
170
- if (instance.getAvailable3DModels !==
171
- BaseProvider.prototype.getAvailable3DModels) {
172
- // Providers that expose 3D models are assumed to support both task types;
173
- // individual `textTo3D` / `imageTo3D` calls will throw if not implemented.
174
- capabilities.push("text_to_3d", "image_to_3d");
175
- }
176
- // The provider's own record of what it ran, exposed only by providers with
177
- // a history API behind it (see provider-generations.ts).
178
- if (instance.listGenerations !== BaseProvider.prototype.listGenerations) {
179
- capabilities.push("list_generations");
180
- }
181
- if (instance.getGeneration !== BaseProvider.prototype.getGeneration) {
182
- capabilities.push("get_generation");
183
- }
184
- return capabilities;
185
- }
186
77
  /**
187
78
  * What one attached medium costs a vision/audio model, per block. These are
188
79
  * modality constants, not measurements of the bytes: by the time a turn is
@@ -308,6 +199,35 @@ export class BaseProvider {
308
199
  if (this._emitMessage)
309
200
  this._emitMessage(msg);
310
201
  }
202
+ /**
203
+ * Report one non-chat provider call (image, video, speech, ASR, embedding…)
204
+ * as an `llm_call` so the trace shows every provider call, not only chat.
205
+ * Carries no token counts: those modalities bill per unit, not per token.
206
+ * @internal
207
+ */
208
+ recordModalityCall(input) {
209
+ if (!this._emitMessage)
210
+ return;
211
+ const prompt = input.args
212
+ .map((arg) => isObjectLike(arg) ? arg.prompt : undefined)
213
+ .find(isString);
214
+ this.emitMessage({
215
+ type: "llm_call",
216
+ node_id: "",
217
+ provider: this.provider,
218
+ operation: input.operation,
219
+ model: extractModelId(input.args),
220
+ messages: prompt ? [{ role: "user", content: prompt }] : [],
221
+ response: null,
222
+ tool_calls: null,
223
+ tokens_input: null,
224
+ tokens_output: null,
225
+ cost: null,
226
+ duration_ms: Date.now() - input.startedAt,
227
+ error: input.error === undefined ? null : String(input.error),
228
+ timestamp: new Date(input.startedAt).toISOString()
229
+ });
230
+ }
311
231
  /**
312
232
  * Record a failed provider call: a server-side log with the exact request,
313
233
  * and a `provider_call_failed` message so the surface showing the failure
@@ -379,8 +299,23 @@ export class BaseProvider {
379
299
  // images onto the source list, before the concrete provider runs.
380
300
  const args = applyEntityReferences(name, rawArgs);
381
301
  const startedAt = Date.now();
302
+ const call = () => original.apply(this, args);
382
303
  try {
383
- return await original.apply(this, args);
304
+ // A nested call (a batch helper delegating to its singular method)
305
+ // stays inside the outer call's span.
306
+ const result = alreadyActive
307
+ ? await call()
308
+ : await withSpan(`provider.${name}`, modalitySpanAttributes(this.provider, name, args), async (span) => {
309
+ const value = await call();
310
+ if (span) {
311
+ applyUsageAttributes(span, peekLastUsage());
312
+ }
313
+ return value;
314
+ });
315
+ if (!alreadyActive) {
316
+ this.recordModalityCall({ operation: name, args, startedAt });
317
+ }
318
+ return result;
384
319
  }
385
320
  catch (err) {
386
321
  annotateProviderError(err, {
@@ -388,6 +323,12 @@ export class BaseProvider {
388
323
  model: extractModelId(args)
389
324
  });
390
325
  if (!alreadyActive) {
326
+ this.recordModalityCall({
327
+ operation: name,
328
+ args,
329
+ startedAt,
330
+ error: err
331
+ });
391
332
  const failureArgs = name === "referenceToVideo"
392
333
  ? [referenceVideoDiagnostics(args)]
393
334
  : args;
@@ -410,7 +351,7 @@ export class BaseProvider {
410
351
  continue;
411
352
  }
412
353
  const original = fn;
413
- Reflect.set(this, name, (...args) => wrapModalityGenerator(this, original, args, name));
354
+ Reflect.set(this, name, (...args) => withSpanGen(`provider.${name}`, modalitySpanAttributes(this.provider, name, args), () => wrapModalityGenerator(this, original, args, name)));
414
355
  }
415
356
  }
416
357
  /**
@@ -483,32 +424,25 @@ export class BaseProvider {
483
424
  return null;
484
425
  }
485
426
  /**
486
- * Explicit capability declaration. Returns `null` by default, in which case
487
- * {@link getCapabilities} derives capabilities by reflecting on which
488
- * optional methods the concrete class overrides. Providers may override this
489
- * to declare their capabilities directly — an alternative to method
490
- * reflection when methods are wrapped, bound, or composed via mixins.
427
+ * The operations beyond chat that this provider implements. Each concrete
428
+ * provider lists its own; the base implements none. A capability belongs
429
+ * here only when the matching method has a working implementation.
491
430
  */
492
431
  declaredCapabilities() {
493
- return null;
432
+ return [];
494
433
  }
495
434
  /**
496
- * The capabilities this provider exposes. Prefers an explicit declaration
497
- * from {@link declaredCapabilities}; otherwise falls back to reflecting over
498
- * overridden methods via {@link providerCapabilities}. Callers should use
499
- * this instead of calling `providerCapabilities()` directly so explicit
500
- * declarations are honored.
435
+ * The capabilities this provider exposes: chat generation, which every
436
+ * provider has, plus its {@link declaredCapabilities}.
501
437
  */
502
438
  getCapabilities() {
503
- const declared = this.declaredCapabilities();
504
- if (declared) {
505
- // Message generation is always available; ensure it is present.
506
- const set = new Set(declared);
507
- set.add("generate_message");
508
- set.add("generate_messages");
509
- return [...set];
510
- }
511
- return providerCapabilities(this);
439
+ return [
440
+ ...new Set([
441
+ "generate_message",
442
+ "generate_messages",
443
+ ...this.declaredCapabilities()
444
+ ])
445
+ ];
512
446
  }
513
447
  /**
514
448
  * The provider's own record of the generations this account ran, newest
@@ -679,6 +613,10 @@ export class BaseProvider {
679
613
  async getAvailableEmbeddingModels() {
680
614
  return [];
681
615
  }
616
+ /** Reranking models exposed by this provider. */
617
+ async getAvailableRerankModels() {
618
+ return [];
619
+ }
682
620
  /**
683
621
  * 3D **generation** models exposed by this provider (e.g. Meshy's `meshy-4`,
684
622
  * Rodin's `rodin-regular`). Override on providers that can synthesize 3D
@@ -700,12 +638,14 @@ export class BaseProvider {
700
638
  const result = await this.generateMessage(args);
701
639
  const content = isString(result.content)
702
640
  ? result.content
703
- : JSON.stringify(result.content);
641
+ : stringifyTraceContent(result.content);
704
642
  span.setAttributes({
705
643
  "llm.response.role": result.role,
706
- "llm.response.content": content.slice(0, 2000),
707
644
  "llm.response.tool_calls_count": result.toolCalls?.length ?? 0
708
645
  });
646
+ if (traceContentAllowed()) {
647
+ span.setAttribute("llm.response.content", traceTextContent(content));
648
+ }
709
649
  span.setStatus({ code: SpanStatusCode.OK });
710
650
  return result;
711
651
  }
@@ -793,6 +733,10 @@ export class BaseProvider {
793
733
  }
794
734
  }
795
735
  applyLlmRequestAttributes(span, args, streaming) {
736
+ if (traceContentAllowed()) {
737
+ span.setAttribute("llm.request.messages", messageTraceContent(args.messages.filter((message) => typeof message === "object" && message !== null && "role" in message)));
738
+ span.setAttribute("llm.tool.names", stringifyTraceContent((args.tools ?? []).map((tool) => typeof tool === "object" && tool !== null && "name" in tool ? tool.name : null)));
739
+ }
796
740
  span.setAttributes({
797
741
  "llm.provider": this.provider,
798
742
  "llm.model": args.model,
@@ -953,8 +897,11 @@ export class BaseProvider {
953
897
  });
954
898
  }
955
899
  async *generateLoop(args) {
900
+ return yield* tracedProviderLoop(this.provider, args.model, () => BaseProvider.prototype.generateBaseLoop.call(this, args));
901
+ }
902
+ async *generateBaseLoop(args) {
956
903
  const maxIterations = args.maxIterations ?? 25;
957
- const { executeTool, maxIterations: _omitMax, sequentialTools, turnBudget: budgetArg, workspaceDir: _omitWorkspaceDir, skills: _omitSkills, resolveMedia, ...turnArgs } = args;
904
+ const { executeTool, maxIterations: _omitMax, sequentialTools, providedToolsOnly: _omitProvidedToolsOnly, turnBudget: budgetArg, workspaceDir: _omitWorkspaceDir, skills: _omitSkills, resolveMedia, ...turnArgs } = args;
958
905
  const { runBudget, turnBudget } = resolveTurnBudget(budgetArg);
959
906
  const messages = [...args.messages];
960
907
  // What the provider is actually sent: `messages` with every media
@@ -983,11 +930,8 @@ export class BaseProvider {
983
930
  let toolCallSeq = 0;
984
931
  const onToolCall = executeTool
985
932
  ? async (name, toolArgs) => {
986
- const result = await executeTool({
987
- id: `call_${++toolCallSeq}`,
988
- name,
989
- args: toolArgs
990
- });
933
+ const call = { id: `call_${++toolCallSeq}`, name, args: toolArgs };
934
+ const result = await tracedToolCall(call, () => executeTool(call));
991
935
  if (isProviderToolErrorResult(result)) {
992
936
  return toolResultToText(result.content);
993
937
  }
@@ -1011,6 +955,7 @@ export class BaseProvider {
1011
955
  return;
1012
956
  }
1013
957
  }
958
+ beginProviderRound(this.provider, args.model);
1014
959
  const costBeforeTurn = turnBudget ? this.getTotalCost() : 0;
1015
960
  let assistantText = "";
1016
961
  let finalizedAssistant;
@@ -1131,10 +1076,12 @@ export class BaseProvider {
1131
1076
  const runTool = async (tc) => {
1132
1077
  const tool = toolMap.get(tc.name);
1133
1078
  try {
1134
- if (tool?.execute)
1135
- return await tool.execute(tc.args ?? {}, tc.id);
1079
+ if (tool?.execute) {
1080
+ const execute = tool.execute;
1081
+ return await tracedToolCall(tc, () => execute(tc.args ?? {}, tc.id));
1082
+ }
1136
1083
  if (executeTool)
1137
- return await executeTool(tc);
1084
+ return await tracedToolCall(tc, () => executeTool(tc));
1138
1085
  return `Tool "${tc.name}" is not available`;
1139
1086
  }
1140
1087
  catch (err) {
@@ -1223,15 +1170,31 @@ export class BaseProvider {
1223
1170
  }
1224
1171
  /** Internal: wrap generateMessages with OTel span */
1225
1172
  async *_tracedStream(args, tracer) {
1226
- const span = tracer.startSpan(`llm.stream ${this.provider}/${args.model}`);
1173
+ const span = tracer.startSpan(`llm.stream ${this.provider}/${args.model}`, {}, providerRoundContext());
1227
1174
  this.applyLlmRequestAttributes(span, args, true);
1228
1175
  let chunkCount = 0;
1176
+ let response = "";
1177
+ const stream = this.generateMessages(args);
1178
+ const active = trace.setSpan(providerRoundContext(), span);
1179
+ let exhausted = false;
1229
1180
  try {
1230
- for await (const item of this.generateMessages(args)) {
1181
+ while (true) {
1182
+ const next = await context.with(active, () => stream.next());
1183
+ if (next.done) {
1184
+ exhausted = true;
1185
+ break;
1186
+ }
1187
+ const item = next.value;
1188
+ if (traceContentAllowed() && "content" in item && typeof item.content === "string" && !("thinking" in item && item.thinking) && (!("content_type" in item) || item.content_type === "text")) {
1189
+ response = traceTextContent(response + item.content);
1190
+ }
1231
1191
  chunkCount++;
1232
1192
  yield item;
1233
1193
  }
1234
- span.setAttributes({ "llm.response.chunk_count": chunkCount });
1194
+ span.setAttribute("llm.response.chunk_count", chunkCount);
1195
+ if (traceContentAllowed()) {
1196
+ span.setAttribute("llm.response.content", response);
1197
+ }
1235
1198
  span.setStatus({ code: SpanStatusCode.OK });
1236
1199
  }
1237
1200
  catch (err) {
@@ -1240,6 +1203,9 @@ export class BaseProvider {
1240
1203
  throw err;
1241
1204
  }
1242
1205
  finally {
1206
+ if (!exhausted) {
1207
+ await context.with(active, () => stream.return(undefined));
1208
+ }
1243
1209
  applyUsageAttributes(span, peekLastUsage());
1244
1210
  span.end();
1245
1211
  }
@@ -1324,6 +1290,13 @@ export class BaseProvider {
1324
1290
  async removeBackground(_image, _params) {
1325
1291
  throw new Error(`${this.provider} does not support removeBackground`);
1326
1292
  }
1293
+ /**
1294
+ * Estimate per-pixel depth. Returns a grayscale PNG at the input's size,
1295
+ * where brighter pixels are nearer to the camera.
1296
+ */
1297
+ async estimateDepth(_image, _params) {
1298
+ throw new Error(`${this.provider} does not support estimateDepth`);
1299
+ }
1327
1300
  /**
1328
1301
  * Segment an image into object masks. Returns one entry per object the model
1329
1302
  * found, in the model's own order; an empty array means it found nothing,
@@ -1455,6 +1428,10 @@ export class BaseProvider {
1455
1428
  async generateEmbedding(_args) {
1456
1429
  throw new Error(`${this.provider} does not support generateEmbedding`);
1457
1430
  }
1431
+ /** Score each document against the query, most relevant first. */
1432
+ async rerank(_params) {
1433
+ throw new Error(`${this.provider} does not support rerank`);
1434
+ }
1458
1435
  /**
1459
1436
  * Whether `error` is this provider refusing the request because it exceeds
1460
1437
  * the model's context window. Default `false`: a provider whose signal has
@@ -1615,6 +1592,7 @@ const MODALITY_PROMISE_METHODS = [
1615
1592
  "outpaintImage",
1616
1593
  "upscaleImage",
1617
1594
  "removeBackground",
1595
+ "estimateDepth",
1618
1596
  "relightImage",
1619
1597
  "vectorizeImage",
1620
1598
  "segmentImage",
@@ -1634,7 +1612,8 @@ const MODALITY_PROMISE_METHODS = [
1634
1612
  "lipSync",
1635
1613
  "textTo3D",
1636
1614
  "imageTo3D",
1637
- "generateEmbedding"
1615
+ "generateEmbedding",
1616
+ "rerank"
1638
1617
  ];
1639
1618
  /** Async-generator non-chat modality methods wrapped with failure logging. */
1640
1619
  const MODALITY_GENERATOR_METHODS = ["textToSpeech"];
@@ -1669,6 +1648,7 @@ async function* wrapModalityGenerator(provider, original, args, operationName) {
1669
1648
  const startedAt = Date.now();
1670
1649
  const source = original.apply(provider, args);
1671
1650
  let exhausted = false;
1651
+ let failure;
1672
1652
  try {
1673
1653
  while (true) {
1674
1654
  const result = await runInSlot(() => source.next());
@@ -1680,6 +1660,7 @@ async function* wrapModalityGenerator(provider, original, args, operationName) {
1680
1660
  }
1681
1661
  }
1682
1662
  catch (err) {
1663
+ failure = err;
1683
1664
  annotateProviderError(err, {
1684
1665
  provider: provider.provider,
1685
1666
  model: extractModelId(args)
@@ -1702,8 +1683,22 @@ async function* wrapModalityGenerator(provider, original, args, operationName) {
1702
1683
  value: undefined
1703
1684
  })).catch(() => { });
1704
1685
  }
1686
+ provider.recordModalityCall({
1687
+ operation: operationName,
1688
+ args,
1689
+ startedAt,
1690
+ error: failure
1691
+ });
1705
1692
  }
1706
1693
  }
1694
+ /** Metadata for a non-chat modality span. The prompt and media stay out of it. */
1695
+ function modalitySpanAttributes(provider, operation, args) {
1696
+ return {
1697
+ "gen_ai.system": provider,
1698
+ "gen_ai.operation.name": operation,
1699
+ "gen_ai.request.model": extractModelId(args)
1700
+ };
1701
+ }
1707
1702
  /** Attach gen_ai usage attributes to a span (no-op if usage is null). */
1708
1703
  function applyUsageAttributes(span, usage) {
1709
1704
  if (!usage)