@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,19 @@
1
1
  import { createLogger } from "@nodetool-ai/config";
2
2
  import { OpenAICompatProvider } from "./openai-compat-provider.js";
3
+ import { fetchWithRetry, pollUntilTerminal } from "./http-transport.js";
4
+ import { bytesToImageDataUri } from "./image-mime.js";
5
+ import { sniffAudioMimeOrNull } from "./audio-mime.js";
3
6
  import { isString } from "@nodetool-ai/protocol";
4
7
  // Stryker disable next-line StringLiteral: logger name is diagnostic, not asserted.
5
8
  const log = createLogger("nodetool.runtime.providers.openrouter");
9
+ const OPENROUTER_BASE_URL = "https://openrouter.ai/api/v1";
10
+ /** Attribution headers sent with every OpenRouter request. */
11
+ const OPENROUTER_HEADERS = {
12
+ // Stryker disable next-line StringLiteral
13
+ "HTTP-Referer": "https://github.com/nodetool-ai/nodetool-core",
14
+ // Stryker disable next-line StringLiteral
15
+ "X-Title": "NodeTool"
16
+ };
6
17
  /** Known image-capable models on OpenRouter. */
7
18
  const OPENROUTER_IMAGE_MODELS = [
8
19
  {
@@ -10,9 +21,86 @@ const OPENROUTER_IMAGE_MODELS = [
10
21
  name: "Stable Diffusion XL",
11
22
  provider: "openrouter",
12
23
  supportedTasks: ["text_to_image"]
24
+ },
25
+ {
26
+ id: "google/gemini-2.5-flash-image",
27
+ name: "Gemini 2.5 Flash Image",
28
+ provider: "openrouter",
29
+ supportedTasks: ["text_to_image", "image_to_image"]
13
30
  }
14
31
  ];
32
+ const VIDEO_POLL_INTERVAL_MS = 5000;
33
+ /** Default polling window when the caller sets no timeout. */
34
+ const VIDEO_DEFAULT_TIMEOUT_SECONDS = 20 * 60;
35
+ function stringList(value) {
36
+ return Array.isArray(value)
37
+ ? value.filter((v) => typeof v === "string")
38
+ : [];
39
+ }
40
+ function numberList(value) {
41
+ return Array.isArray(value)
42
+ ? value.filter((v) => typeof v === "number")
43
+ : [];
44
+ }
45
+ /** `input_audio.format` values OpenRouter accepts, by sniffed MIME type. */
46
+ const AUDIO_FORMAT_BY_MIME = {
47
+ "audio/wav": "wav",
48
+ "audio/mpeg": "mp3",
49
+ "audio/ogg": "ogg",
50
+ "audio/flac": "flac"
51
+ };
52
+ function architectureOf(row) {
53
+ const architecture = row.architecture;
54
+ return architecture && typeof architecture === "object"
55
+ ? architecture
56
+ : {};
57
+ }
58
+ /** The enum values of one `supported_parameters` entry, or `[]`. */
59
+ function parameterValues(row, name) {
60
+ const parameters = row.supported_parameters;
61
+ if (!parameters || typeof parameters !== "object")
62
+ return [];
63
+ const entry = parameters[name];
64
+ if (!entry || typeof entry !== "object")
65
+ return [];
66
+ return stringList(entry.values);
67
+ }
68
+ function withNegativePrompt(prompt, negativePrompt) {
69
+ return negativePrompt
70
+ ? `${prompt.trim()}\n\nDo not include: ${negativePrompt.trim()}`
71
+ : prompt;
72
+ }
73
+ /** The message OpenRouter puts in `error` (a string or `{ message }`). */
74
+ function errorText(body) {
75
+ const error = body.error;
76
+ if (typeof error === "string")
77
+ return error;
78
+ if (error && typeof error === "object") {
79
+ const message = error.message;
80
+ if (typeof message === "string")
81
+ return message;
82
+ }
83
+ return JSON.stringify(body).slice(0, 500);
84
+ }
85
+ function reportedCost(body) {
86
+ const usage = body.usage;
87
+ if (!usage || typeof usage !== "object")
88
+ return undefined;
89
+ const cost = usage.cost;
90
+ return typeof cost === "number" ? cost : undefined;
91
+ }
15
92
  export class OpenRouterProvider extends OpenAICompatProvider {
93
+ declaredCapabilities() {
94
+ return [
95
+ "text_to_image",
96
+ "image_to_image",
97
+ "text_to_video",
98
+ "image_to_video",
99
+ "text_to_speech",
100
+ "automatic_speech_recognition",
101
+ "generate_embedding"
102
+ ];
103
+ }
16
104
  static requiredSecrets() {
17
105
  return ["OPENROUTER_API_KEY"];
18
106
  }
@@ -24,16 +112,10 @@ export class OpenRouterProvider extends OpenAICompatProvider {
24
112
  super({
25
113
  providerId: "openrouter",
26
114
  apiKey,
27
- baseURL: "https://openrouter.ai/api/v1",
115
+ baseURL: OPENROUTER_BASE_URL,
28
116
  // Attribution headers ride every chat request (and the SDK fallback);
29
117
  // the same header values are asserted on the /models fetch below.
30
- // Stryker disable next-line ObjectLiteral
31
- defaultHeaders: {
32
- // Stryker disable next-line StringLiteral
33
- "HTTP-Referer": "https://github.com/nodetool-ai/nodetool-core",
34
- // Stryker disable next-line StringLiteral
35
- "X-Title": "NodeTool"
36
- }
118
+ defaultHeaders: OPENROUTER_HEADERS
37
119
  }, options);
38
120
  }
39
121
  getContainerEnv() {
@@ -72,6 +154,19 @@ export class OpenRouterProvider extends OpenAICompatProvider {
72
154
  yield* super.generateMessages({ ...args, messages: convertedMessages });
73
155
  }
74
156
  async textToImage(params) {
157
+ const size = this.resolveImageSize(params.width ?? undefined, params.height ?? undefined);
158
+ return this.generateImage(params, [], size);
159
+ }
160
+ /**
161
+ * Edit or compose from source images. OpenRouter's image API takes them as
162
+ * `input_references`; entity reference images arrive here already appended
163
+ * to `images` by the base provider.
164
+ */
165
+ async imageToImage(images, params) {
166
+ const size = this.resolveImageSize(params.targetWidth ?? undefined, params.targetHeight ?? undefined);
167
+ return this.generateImage(params, images, size);
168
+ }
169
+ async generateImage(params, inputs, size) {
75
170
  if (!params.prompt) {
76
171
  throw new Error("The input prompt cannot be empty.");
77
172
  }
@@ -82,13 +177,26 @@ export class OpenRouterProvider extends OpenAICompatProvider {
82
177
  model: params.model.id,
83
178
  prompt
84
179
  };
85
- const size = this.resolveImageSize(params.width ?? undefined, params.height ?? undefined);
86
180
  if (size)
87
181
  request.size = size;
88
182
  if (params.quality)
89
183
  request.quality = params.quality;
184
+ // Gemini image models ignore `size`; OpenRouter reads the shape from here.
185
+ if (params.aspectRatio)
186
+ request.aspect_ratio = params.aspectRatio;
187
+ if (params.resolution)
188
+ request.resolution = params.resolution;
189
+ if (inputs.length > 0) {
190
+ request.input_references = inputs.map((bytes) => ({
191
+ type: "image_url",
192
+ image_url: { url: bytesToImageDataUri(bytes) }
193
+ }));
194
+ }
90
195
  // Stryker disable next-line StringLiteral,ObjectLiteral: diagnostic log, not asserted.
91
- log.debug("OpenRouter textToImage", { model: params.model.id });
196
+ log.debug("OpenRouter image generation", {
197
+ model: params.model.id,
198
+ inputs: inputs.length
199
+ });
92
200
  // SAFETY: a dictionary request against the OpenAI SDK's closed image
93
201
  // params; OpenRouter is driven through the same client.
94
202
  const response = (await this.getClient().images.generate(request));
@@ -108,11 +216,264 @@ export class OpenRouterProvider extends OpenAICompatProvider {
108
216
  }
109
217
  throw new Error("OpenRouter image generation returned no image data.");
110
218
  }
219
+ /**
220
+ * Video models are listed under `/videos/models`, not `/models`. A model
221
+ * without durations (an editor) or with an upscale factor (an upscaler)
222
+ * cannot render from a prompt, so it is left out.
223
+ */
224
+ async getAvailableVideoModels() {
225
+ const rows = await this.fetchCompatModelRows(`${OPENROUTER_BASE_URL}/videos/models`);
226
+ const models = [];
227
+ for (const row of rows) {
228
+ const durations = numberList(row.supported_durations);
229
+ if (durations.length === 0 || row.upscale_factor != null)
230
+ continue;
231
+ const supportedTasks = ["text_to_video"];
232
+ if (stringList(row.supported_frame_images).includes("first_frame")) {
233
+ supportedTasks.push("image_to_video");
234
+ }
235
+ const model = {
236
+ id: row.id,
237
+ name: typeof row.name === "string" ? row.name : row.id,
238
+ provider: "openrouter",
239
+ supportedTasks,
240
+ durations
241
+ };
242
+ const resolutions = stringList(row.supported_resolutions);
243
+ if (resolutions.length > 0)
244
+ model.resolutions = resolutions;
245
+ const aspectRatios = stringList(row.supported_aspect_ratios);
246
+ if (aspectRatios.length > 0)
247
+ model.aspectRatios = aspectRatios;
248
+ models.push(model);
249
+ }
250
+ return models;
251
+ }
252
+ async textToVideo(params) {
253
+ if (!params.prompt) {
254
+ throw new Error("The input prompt cannot be empty.");
255
+ }
256
+ return this.generateVideo(params, {});
257
+ }
258
+ /**
259
+ * Animate a start frame. OpenRouter takes it as a data URI in
260
+ * `frame_images`, plus an optional `last_frame` for interpolation.
261
+ */
262
+ async imageToVideo(image, params) {
263
+ if (image.length === 0) {
264
+ throw new Error("imageToVideo requires a start frame");
265
+ }
266
+ const frames = [
267
+ {
268
+ type: "image_url",
269
+ image_url: { url: bytesToImageDataUri(image) },
270
+ frame_type: "first_frame"
271
+ }
272
+ ];
273
+ if (params.endImage && params.endImage.length > 0) {
274
+ frames.push({
275
+ type: "image_url",
276
+ image_url: { url: bytesToImageDataUri(params.endImage) },
277
+ frame_type: "last_frame"
278
+ });
279
+ }
280
+ return this.generateVideo(params, { frame_images: frames });
281
+ }
282
+ /**
283
+ * Image models come from `/images/models`, with per-model aspect ratio and
284
+ * resolution enums. The built-in list is the fallback when the listing is
285
+ * unreachable, so the picker is never empty.
286
+ */
111
287
  async getAvailableImageModels() {
112
- return OPENROUTER_IMAGE_MODELS;
288
+ const rows = await this.fetchCompatModelRows(`${OPENROUTER_BASE_URL}/images/models`);
289
+ if (rows.length === 0)
290
+ return OPENROUTER_IMAGE_MODELS;
291
+ return rows.map((row) => {
292
+ const supportedTasks = ["text_to_image"];
293
+ if (stringList(architectureOf(row).input_modalities).includes("image")) {
294
+ supportedTasks.push("image_to_image");
295
+ }
296
+ const model = {
297
+ id: row.id,
298
+ name: typeof row.name === "string" ? row.name : row.id,
299
+ provider: "openrouter",
300
+ supportedTasks
301
+ };
302
+ const aspectRatios = parameterValues(row, "aspect_ratio");
303
+ if (aspectRatios.length > 0)
304
+ model.aspectRatios = aspectRatios;
305
+ const resolutions = parameterValues(row, "resolution");
306
+ if (resolutions.length > 0)
307
+ model.resolutions = resolutions;
308
+ return model;
309
+ });
113
310
  }
114
311
  async getAvailableLanguageModels() {
115
312
  return this.listCompatModels();
116
313
  }
314
+ /** Speech models are `/models` rows whose output modality is `speech`. */
315
+ async getAvailableTTSModels() {
316
+ const rows = await this.fetchCompatModelRows(`${OPENROUTER_BASE_URL}/models?output_modalities=speech`);
317
+ return rows.map((row) => {
318
+ const model = {
319
+ id: row.id,
320
+ name: typeof row.name === "string" ? row.name : row.id,
321
+ provider: "openrouter"
322
+ };
323
+ const voices = stringList(row.supported_voices);
324
+ if (voices.length > 0)
325
+ model.voices = voices;
326
+ return model;
327
+ });
328
+ }
329
+ /** Transcription models are `/models` rows with output modality `transcription`. */
330
+ async getAvailableASRModels() {
331
+ const rows = await this.fetchCompatModelRows(`${OPENROUTER_BASE_URL}/models?output_modalities=transcription`);
332
+ return rows.map((row) => ({
333
+ id: row.id,
334
+ name: typeof row.name === "string" ? row.name : row.id,
335
+ provider: "openrouter"
336
+ }));
337
+ }
338
+ async getAvailableEmbeddingModels() {
339
+ const rows = await this.fetchCompatModelRows(`${OPENROUTER_BASE_URL}/embeddings/models`);
340
+ return rows.map((row) => ({
341
+ id: row.id,
342
+ name: typeof row.name === "string" ? row.name : row.id,
343
+ provider: "openrouter"
344
+ }));
345
+ }
346
+ /**
347
+ * OpenRouter transcribes from a JSON body with base64 `input_audio`, not the
348
+ * multipart upload the inherited OpenAI path sends. `prompt` has no
349
+ * OpenRouter field and is ignored.
350
+ */
351
+ async automaticSpeechRecognition(args) {
352
+ if (!args.audio || args.audio.length === 0) {
353
+ throw new Error("audio must not be empty");
354
+ }
355
+ const mime = sniffAudioMimeOrNull(args.audio);
356
+ const request = {
357
+ model: args.model,
358
+ input_audio: {
359
+ data: Buffer.from(args.audio).toString("base64"),
360
+ format: (mime && AUDIO_FORMAT_BY_MIME[mime]) ?? "mp3"
361
+ }
362
+ };
363
+ if (args.language)
364
+ request.language = args.language;
365
+ if (args.temperature != null)
366
+ request.temperature = args.temperature;
367
+ if (args.word_timestamps) {
368
+ request.response_format = "verbose_json";
369
+ request.timestamp_granularities = ["word"];
370
+ }
371
+ const res = await this.compatFetch(`${OPENROUTER_BASE_URL}/audio/transcriptions`, {
372
+ method: "POST",
373
+ headers: this.openRouterHeaders(),
374
+ body: JSON.stringify(request)
375
+ });
376
+ if (!res.ok) {
377
+ throw new Error(`OpenRouter transcription failed: ${res.status} ${(await res.text()).slice(0, 500)}`);
378
+ }
379
+ const body = (await res.json());
380
+ const usage = body.usage;
381
+ if (typeof usage?.seconds === "number") {
382
+ this.trackUsage(args.model, { durationSeconds: usage.seconds });
383
+ }
384
+ const text = typeof body.text === "string" ? body.text : "";
385
+ if (!args.word_timestamps)
386
+ return { text };
387
+ const chunks = [];
388
+ for (const word of Array.isArray(body.words) ? body.words : []) {
389
+ if (word &&
390
+ typeof word.word === "string" &&
391
+ typeof word.start === "number" &&
392
+ typeof word.end === "number") {
393
+ chunks.push({ timestamp: [word.start, word.end], text: word.word });
394
+ }
395
+ }
396
+ return chunks.length > 0 ? { text, chunks } : { text };
397
+ }
398
+ openRouterHeaders() {
399
+ return {
400
+ Authorization: `Bearer ${this.apiKey}`,
401
+ "Content-Type": "application/json",
402
+ ...OPENROUTER_HEADERS
403
+ };
404
+ }
405
+ /**
406
+ * Submit to `POST /videos`, poll the job, and download its first output.
407
+ * The status and content URLs are built from the job id rather than taken
408
+ * from the response, so the API key is only ever sent to OpenRouter.
409
+ */
410
+ async generateVideo(params, extra) {
411
+ const request = {
412
+ model: params.model.id,
413
+ prompt: withNegativePrompt(params.prompt ?? "", params.negativePrompt),
414
+ ...extra
415
+ };
416
+ if (params.durationSeconds) {
417
+ request.duration = Math.round(params.durationSeconds);
418
+ }
419
+ if (params.resolution)
420
+ request.resolution = params.resolution;
421
+ if (params.aspectRatio)
422
+ request.aspect_ratio = params.aspectRatio;
423
+ if (params.seed != null && params.seed >= 0)
424
+ request.seed = params.seed;
425
+ const timeoutSeconds = params.timeoutSeconds && params.timeoutSeconds > 0
426
+ ? params.timeoutSeconds
427
+ : VIDEO_DEFAULT_TIMEOUT_SECONDS;
428
+ const timeout = AbortSignal.timeout(timeoutSeconds * 1000);
429
+ const signal = params.signal
430
+ ? AbortSignal.any([params.signal, timeout])
431
+ : timeout;
432
+ // Stryker disable next-line StringLiteral,ObjectLiteral: diagnostic log, not asserted.
433
+ log.debug("OpenRouter video submit", { model: params.model.id });
434
+ const submit = await this.compatFetch(`${OPENROUTER_BASE_URL}/videos`, {
435
+ method: "POST",
436
+ headers: this.openRouterHeaders(),
437
+ body: JSON.stringify(request),
438
+ signal
439
+ });
440
+ if (!submit.ok) {
441
+ throw new Error(`OpenRouter video submit failed: ${submit.status} ${(await submit.text()).slice(0, 500)}`);
442
+ }
443
+ const submitted = (await submit.json());
444
+ const jobId = submitted.id;
445
+ if (typeof jobId !== "string" || jobId.length === 0) {
446
+ throw new Error(`OpenRouter video submit returned no job id: ${JSON.stringify(submitted).slice(0, 500)}`);
447
+ }
448
+ const jobUrl = `${OPENROUTER_BASE_URL}/videos/${encodeURIComponent(jobId)}`;
449
+ const done = await pollUntilTerminal(async () => {
450
+ // The job is already submitted and billed: a 429 or a gateway 5xx on
451
+ // the status GET must back off, not throw the job away.
452
+ const res = await fetchWithRetry(jobUrl, { headers: this.openRouterHeaders(), signal }, { fetchImpl: this.compatFetch });
453
+ if (!res.ok) {
454
+ throw new Error(`OpenRouter video status failed: ${res.status} ${(await res.text()).slice(0, 500)}`);
455
+ }
456
+ return (await res.json());
457
+ }, {
458
+ intervalMs: VIDEO_POLL_INTERVAL_MS,
459
+ maxAttempts: Math.max(1, Math.ceil((timeoutSeconds * 1000) / VIDEO_POLL_INTERVAL_MS)),
460
+ signal,
461
+ onFailure: (body) => new Error(`OpenRouter video job ${jobId} failed: ${errorText(body)}`),
462
+ onTimeout: () => new Error(`OpenRouter video job ${jobId} did not finish within ${timeoutSeconds}s`)
463
+ });
464
+ const cost = reportedCost(done);
465
+ if (cost !== undefined) {
466
+ // Stryker disable next-line StringLiteral,ObjectLiteral: diagnostic log, not asserted.
467
+ log.info("OpenRouter video cost", { model: params.model.id, cost });
468
+ }
469
+ const content = await this.compatFetch(`${jobUrl}/content?index=0`, {
470
+ headers: this.openRouterHeaders(),
471
+ signal
472
+ });
473
+ if (!content.ok) {
474
+ throw new Error(`OpenRouter video download failed: ${content.status} ${(await content.text()).slice(0, 500)}`);
475
+ }
476
+ return new Uint8Array(await content.arrayBuffer());
477
+ }
117
478
  }
118
479
  //# sourceMappingURL=openrouter-provider.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"openrouter-provider.js","sourceRoot":"","sources":["../../src/providers/openrouter-provider.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"openrouter-provider.js","sourceRoot":"","sources":["../../src/providers/openrouter-provider.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,31 @@
1
+ import { OpenAICompatProvider, type OpenAICompatProviderOptions } from "./openai-compat-provider.js";
2
+ import type { LanguageModel } from "./types.js";
3
+ export declare class OpperProvider extends OpenAICompatProvider {
4
+ /** Tool support per model id, as reported by the last discovery. */
5
+ private toolSupport;
6
+ private toolSupportLoad;
7
+ static requiredSecrets(): string[];
8
+ constructor(secrets: {
9
+ OPPER_API_KEY?: string;
10
+ }, options?: OpenAICompatProviderOptions);
11
+ getContainerEnv(): {
12
+ OPPER_API_KEY: string;
13
+ };
14
+ /**
15
+ * Opper lists each model's `opper.capabilities` on both listings. Only a
16
+ * listed model whose capabilities lack `tools` disables native tools; a
17
+ * model the listings did not describe keeps tools on. Discovery runs once
18
+ * per instance when no listing has been seen yet.
19
+ */
20
+ hasToolSupport(model: string): Promise<boolean>;
21
+ /**
22
+ * Pools (`/models?type=pool`, bare ids such as `claude-sonnet-4-6` that
23
+ * Opper routes across providers) come first, followed by the full catalog
24
+ * from `/models`, which adds `provider/model` ids that pin one route. Rows
25
+ * whose `opper.type` is not `"llm"` (embeddings) are skipped. Each listing
26
+ * fails on its own: a rejected fetch or a malformed body is logged and
27
+ * contributes nothing, so the other listing still reaches the picker.
28
+ */
29
+ getAvailableLanguageModels(): Promise<LanguageModel[]>;
30
+ }
31
+ //# sourceMappingURL=opper-provider.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"opper-provider.d.ts","sourceRoot":"","sources":["../../src/providers/opper-provider.ts"],"names":[],"mappings":"AACA,OAAO,EACL,oBAAoB,EAEpB,KAAK,2BAA2B,EACjC,MAAM,6BAA6B,CAAC;AACrC,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAqBhD,qBAAa,aAAc,SAAQ,oBAAoB;IACrD,oEAAoE;IACpE,OAAO,CAAC,WAAW,CAA8B;IACjD,OAAO,CAAC,eAAe,CAAiC;IAExD,OAAgB,eAAe,IAAI,MAAM,EAAE,CAE1C;IAED,YACE,OAAO,EAAE;QAAE,aAAa,CAAC,EAAE,MAAM,CAAA;KAAE,EACnC,OAAO,GAAE,2BAAgC,EAe1C;IAEQ,eAAe;QACb,aAAa;MACvB;IAED;;;;;OAKG;IACY,cAAc,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAM7D;IAED;;;;;;;OAOG;IACY,0BAA0B,IAAI,OAAO,CAAC,aAAa,EAAE,CAAC,CAiCpE;CACF"}
@@ -0,0 +1,91 @@
1
+ import { createLogger } from "@nodetool-ai/config";
2
+ import { OpenAICompatProvider } from "./openai-compat-provider.js";
3
+ // Stryker disable next-line StringLiteral: logger name is diagnostic, not asserted.
4
+ const log = createLogger("nodetool.runtime.providers.opper");
5
+ const OPPER_BASE_URL = "https://api.opper.ai/v3/compat";
6
+ /** Listings merged by discovery, pools first. */
7
+ const OPPER_MODEL_LISTINGS = [
8
+ `${OPPER_BASE_URL}/models?type=pool`,
9
+ `${OPPER_BASE_URL}/models`
10
+ ];
11
+ /** The `opper` block Opper adds to every `/models` row, or `{}`. */
12
+ function opperMetaOf(row) {
13
+ const meta = row.opper;
14
+ return meta && typeof meta === "object"
15
+ ? meta
16
+ : {};
17
+ }
18
+ export class OpperProvider extends OpenAICompatProvider {
19
+ /** Tool support per model id, as reported by the last discovery. */
20
+ toolSupport = new Map();
21
+ toolSupportLoad = null;
22
+ static requiredSecrets() {
23
+ return ["OPPER_API_KEY"];
24
+ }
25
+ constructor(secrets, options = {}) {
26
+ const apiKey = secrets.OPPER_API_KEY;
27
+ if (!apiKey) {
28
+ throw new Error("OPPER_API_KEY is required");
29
+ }
30
+ super({
31
+ providerId: "opper",
32
+ apiKey,
33
+ baseURL: OPPER_BASE_URL
34
+ }, options);
35
+ }
36
+ getContainerEnv() {
37
+ return { OPPER_API_KEY: this.apiKey };
38
+ }
39
+ /**
40
+ * Opper lists each model's `opper.capabilities` on both listings. Only a
41
+ * listed model whose capabilities lack `tools` disables native tools; a
42
+ * model the listings did not describe keeps tools on. Discovery runs once
43
+ * per instance when no listing has been seen yet.
44
+ */
45
+ async hasToolSupport(model) {
46
+ if (!this.toolSupport.has(model)) {
47
+ this.toolSupportLoad ??= this.getAvailableLanguageModels();
48
+ await this.toolSupportLoad;
49
+ }
50
+ return this.toolSupport.get(model) ?? true;
51
+ }
52
+ /**
53
+ * Pools (`/models?type=pool`, bare ids such as `claude-sonnet-4-6` that
54
+ * Opper routes across providers) come first, followed by the full catalog
55
+ * from `/models`, which adds `provider/model` ids that pin one route. Rows
56
+ * whose `opper.type` is not `"llm"` (embeddings) are skipped. Each listing
57
+ * fails on its own: a rejected fetch or a malformed body is logged and
58
+ * contributes nothing, so the other listing still reaches the picker.
59
+ */
60
+ async getAvailableLanguageModels() {
61
+ const results = await Promise.allSettled(OPPER_MODEL_LISTINGS.map((url) => this.fetchCompatModelRows(url)));
62
+ const rows = [];
63
+ results.forEach((result, i) => {
64
+ if (result.status === "fulfilled") {
65
+ rows.push(...result.value);
66
+ }
67
+ else {
68
+ log.warn("Opper model listing failed", {
69
+ url: OPPER_MODEL_LISTINGS[i],
70
+ error: result.reason instanceof Error
71
+ ? result.reason.message
72
+ : String(result.reason)
73
+ });
74
+ }
75
+ });
76
+ const seen = new Set();
77
+ const models = [];
78
+ for (const row of rows) {
79
+ const meta = opperMetaOf(row);
80
+ if (meta.type !== undefined && meta.type !== "llm")
81
+ continue;
82
+ if (seen.has(row.id))
83
+ continue;
84
+ seen.add(row.id);
85
+ this.toolSupport.set(row.id, !Array.isArray(meta.capabilities) || meta.capabilities.includes("tools"));
86
+ models.push({ id: row.id, name: row.id, provider: this.provider });
87
+ }
88
+ return models;
89
+ }
90
+ }
91
+ //# sourceMappingURL=opper-provider.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"opper-provider.js","sourceRoot":"","sources":["../../src/providers/opper-provider.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"provider-error.d.ts","sourceRoot":"","sources":["../../src/providers/provider-error.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAQH;;;;GAIG;AACH,MAAM,WAAW,qBAAqB;IACpC;;;;OAIG;IACH,IAAI,EAAE,eAAe,GAAG,kBAAkB,CAAC;IAC3C,2DAA2D;IAC3D,QAAQ,EAAE,MAAM,CAAC;IACjB,6EAA6E;IAC7E,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;CAC1B;AAgBD;;;GAGG;AACH,wBAAgB,qBAAqB,CACnC,KAAK,EAAE,OAAO,GACb,qBAAqB,GAAG,IAAI,CAG9B;AAED;;;;;GAKG;AACH,wBAAgB,mBAAmB,CAAC,MAAM,EACxC,KAAK,EAAE,MAAM,EACb,QAAQ,EAAE,MAAM,GACf,MAAM,CAQR;AAQD;;;;;;;GAOG;AACH,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,GAAG,IAAI,CAgBjE;AAuED;;;;;GAKG;AACH,wBAAgB,qBAAqB,CAAC,MAAM,EAC1C,KAAK,EAAE,MAAM,EACb,OAAO,EAAE;IAAE,QAAQ,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,GAC5C,MAAM,CA4BR"}
1
+ {"version":3,"file":"provider-error.d.ts","sourceRoot":"","sources":["../../src/providers/provider-error.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAaH;;;;GAIG;AACH,MAAM,WAAW,qBAAqB;IACpC;;;;OAIG;IACH,IAAI,EAAE,eAAe,GAAG,kBAAkB,CAAC;IAC3C,2DAA2D;IAC3D,QAAQ,EAAE,MAAM,CAAC;IACjB,6EAA6E;IAC7E,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;CAC1B;AAgBD;;;GAGG;AACH,wBAAgB,qBAAqB,CACnC,KAAK,EAAE,OAAO,GACb,qBAAqB,GAAG,IAAI,CAG9B;AAED;;;;;GAKG;AACH,wBAAgB,mBAAmB,CAAC,MAAM,EACxC,KAAK,EAAE,MAAM,EACb,QAAQ,EAAE,MAAM,GACf,MAAM,CAQR;AAQD;;;;;;;GAOG;AACH,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,GAAG,IAAI,CAgBjE;AA6ED;;;;;GAKG;AACH,wBAAgB,qBAAqB,CAAC,MAAM,EAC1C,KAAK,EAAE,MAAM,EACb,OAAO,EAAE;IAAE,QAAQ,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,GAC5C,MAAM,CA4BR"}
@@ -9,7 +9,7 @@
9
9
  * so existing message matching (rate limit, context length) still works.
10
10
  */
11
11
  import { getProviderSecretKey } from "./provider-registry.js";
12
- import { isNumber, isObjectLike, isString } from "@nodetool-ai/protocol";
12
+ import { PROVIDER_IDS, isNumber, isObjectLike, isString } from "@nodetool-ai/protocol";
13
13
  /** Marks an error already annotated, so nested wrappers don't stack hints. */
14
14
  const ANNOTATED = Symbol.for("nodetool.provider.errorAnnotated");
15
15
  /** Field carrying {@link ProviderFailureDetail} on an annotated error. */
@@ -99,6 +99,12 @@ function hintForStatus(status, provider, model) {
99
99
  const target = model ? `${provider}/${model}` : provider;
100
100
  switch (status) {
101
101
  case 401:
102
+ if (provider === PROVIDER_IDS.CODEX) {
103
+ return `${target} rejected the ChatGPT sign-in (401). The sign-in expired: sign in to Codex again in Settings → Models & Providers.`;
104
+ }
105
+ if (provider === PROVIDER_IDS.CLAUDE_AGENT_SDK) {
106
+ return `${target} rejected the Claude sign-in (401). The sign-in expired: sign in to Claude again in Settings → Models & Providers.`;
107
+ }
102
108
  return `${target} rejected the credentials (401). Add or update the API key for ${provider} in Settings → Models & Providers.`;
103
109
  case 403:
104
110
  return `${target} refused the request (403). The API key may be missing access to this model, restricted to certain referrers or IPs, or blocked in your region — check it in Settings → Models & Providers.`;