@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,20 +1,25 @@
1
1
  /**
2
- * Centralized cost calculation for all AI providers.
2
+ * Centralized cost calculation for all AI providers — in real US dollars.
3
3
  *
4
- * This module provides a unified interface for calculating API costs in credits.
5
- * 1 credit = $0.01 USD (i.e., 1000 credits = $10 USD)
6
- * All rates include a 50% premium over provider base costs.
4
+ * Token and embedding pricing comes from `@pydantic/genai-prices` (the bundled,
5
+ * community-maintained price catalog), so chat/LLM costs track each provider's
6
+ * published per-token rates exactly, including prompt-cache discounts and
7
+ * tiered (context-length) pricing. No markup is applied.
8
+ *
9
+ * A small local table covers the modalities genai-prices does not price per
10
+ * token — image generation (per image), speech-to-text (per minute),
11
+ * text-to-speech (per 1k characters) and 3D generation (per task). Those values
12
+ * are the providers' list prices in USD.
7
13
  *
8
14
  * Usage:
9
15
  * import { CostCalculator, UsageInfo } from "./cost-calculator.js";
10
- *
11
- * // Calculate cost for a chat completion
12
- * const usage: UsageInfo = { inputTokens: 1000, outputTokens: 500 };
13
- * const cost = CostCalculator.calculate("gpt-4o-mini", usage, "openai");
14
- *
15
- * // Or use convenience helper functions
16
- * const cost2 = calculateChatCost("gpt-4o-mini", 1000, 500);
16
+ * const cost = CostCalculator.calculate("gpt-4o-mini", { inputTokens: 1000, outputTokens: 500 }, "openai");
17
17
  */
18
+ import { calcPrice } from "@pydantic/genai-prices";
19
+ import { createLogger } from "@nodetool-ai/config";
20
+ import { GENAI_PROVIDER_MAP, LOCAL_FREE_PROVIDERS, PROVIDER_IDS } from "@nodetool-ai/protocol";
21
+ // Stryker disable next-line StringLiteral: logger name is diagnostic text, not a behavioural contract.
22
+ const log = createLogger("nodetool.runtime.cost");
18
23
  export var CostType;
19
24
  (function (CostType) {
20
25
  CostType["TOKEN_BASED"] = "token_based";
@@ -27,303 +32,55 @@ export var CostType;
27
32
  CostType["TASK_BASED"] = "task_based";
28
33
  })(CostType || (CostType = {}));
29
34
  /**
30
- * Pricing tiers by tier name - derived from Python cost_calculator.py PRICING_TIERS.
35
+ * Local pricing for non-token modalities, in USD (provider list prices).
36
+ * Token/embedding models are intentionally absent — those are priced via
37
+ * `@pydantic/genai-prices`.
31
38
  */
32
39
  export const PRICING_TIERS = {
33
- // GPT-5 Series (newest flagship models)
34
- gpt5Tier: {
35
- costType: CostType.TOKEN_BASED,
36
- inputPer1kTokens: 0.002625,
37
- outputPer1kTokens: 0.021,
38
- cachedPer1kTokens: 0.0002625
39
- },
40
- gpt5ProTier: {
41
- costType: CostType.TOKEN_BASED,
42
- inputPer1kTokens: 0.0315,
43
- outputPer1kTokens: 0.252
44
- },
45
- gpt5MiniTier: {
46
- costType: CostType.TOKEN_BASED,
47
- inputPer1kTokens: 0.000375,
48
- outputPer1kTokens: 0.003,
49
- cachedPer1kTokens: 0.0000375
50
- },
51
- // GPT-4.1 family
52
- gpt41Tier: {
53
- costType: CostType.TOKEN_BASED,
54
- inputPer1kTokens: 0.0045,
55
- outputPer1kTokens: 0.018,
56
- cachedPer1kTokens: 0.001125
57
- },
58
- gpt41MiniTier: {
59
- costType: CostType.TOKEN_BASED,
60
- inputPer1kTokens: 0.0012,
61
- outputPer1kTokens: 0.0048,
62
- cachedPer1kTokens: 0.0003
63
- },
64
- gpt41NanoTier: {
65
- costType: CostType.TOKEN_BASED,
66
- inputPer1kTokens: 0.0003,
67
- outputPer1kTokens: 0.0012,
68
- cachedPer1kTokens: 0.000075
69
- },
70
- // O4-mini (reasoning)
71
- o4MiniTier: {
72
- costType: CostType.TOKEN_BASED,
73
- inputPer1kTokens: 0.006,
74
- outputPer1kTokens: 0.024,
75
- cachedPer1kTokens: 0.0015
76
- },
77
- // O1 Series (existing reasoning models)
78
- o1Tier: {
79
- costType: CostType.TOKEN_BASED,
80
- inputPer1kTokens: 2.25,
81
- outputPer1kTokens: 9.0
82
- },
83
- o1MiniTier: {
84
- costType: CostType.TOKEN_BASED,
85
- inputPer1kTokens: 0.45,
86
- outputPer1kTokens: 1.8
87
- },
88
- // GPT-4o Series
89
- topTierChat: {
90
- costType: CostType.TOKEN_BASED,
91
- inputPer1kTokens: 0.375,
92
- outputPer1kTokens: 1.5
93
- },
94
- lowTierChat: {
95
- costType: CostType.TOKEN_BASED,
96
- inputPer1kTokens: 0.0225,
97
- outputPer1kTokens: 0.09
98
- },
99
- // Kie.ai chat models. Kie credits are advertised at $0.005/credit;
100
- // NodeTool credits are $0.01, so values below are converted to NodeTool credits.
101
- kieGpt55Tier: {
102
- costType: CostType.TOKEN_BASED,
103
- inputPer1kTokens: 0.14,
104
- outputPer1kTokens: 0.84,
105
- cachedPer1kTokens: 0.014
106
- },
107
- kieGemini31ProTier: {
108
- costType: CostType.TOKEN_BASED,
109
- inputPer1kTokens: 0,
110
- outputPer1kTokens: 0
111
- },
112
- kieGemini3FlashTier: {
113
- costType: CostType.TOKEN_BASED,
114
- inputPer1kTokens: 0,
115
- outputPer1kTokens: 0
116
- },
117
- // GPT-4 Turbo
118
- gpt4Turbo: {
119
- costType: CostType.TOKEN_BASED,
120
- inputPer1kTokens: 1.5,
121
- outputPer1kTokens: 6.0
122
- },
123
- // Image generation - gpt-image-1
124
- imageGptLow: {
125
- costType: CostType.IMAGE_BASED,
126
- perImage: 1.5
127
- },
128
- imageGptMedium: {
129
- costType: CostType.IMAGE_BASED,
130
- perImage: 6.0
131
- },
132
- imageGptHigh: {
133
- costType: CostType.IMAGE_BASED,
134
- perImage: 25.0
135
- },
136
- // Image generation GPT-image-1.5
137
- imageGpt15: {
138
- costType: CostType.TOKEN_BASED,
139
- inputPer1kTokens: 0.0075,
140
- outputPer1kTokens: 0.015
141
- },
142
- // Whisper / Speech-to-Text
143
- whisperStandard: {
144
- costType: CostType.DURATION_BASED,
145
- perMinute: 0.9
146
- },
147
- whisperLowCost: {
148
- costType: CostType.DURATION_BASED,
149
- perMinute: 0.45
150
- },
151
- // TTS / Text-to-Speech
152
- ttsStandard: {
153
- costType: CostType.CHARACTER_BASED,
154
- per1kChars: 0.09
155
- },
156
- ttsHd: {
157
- costType: CostType.CHARACTER_BASED,
158
- per1kChars: 2.25
159
- },
160
- ttsUltraHd: {
161
- costType: CostType.CHARACTER_BASED,
162
- per1kChars: 4.5
163
- },
164
- // Embeddings
165
- embeddingSmall: {
166
- costType: CostType.EMBEDDING,
167
- inputPer1kTokens: 0.003
168
- },
169
- embeddingLarge: {
170
- costType: CostType.EMBEDDING,
171
- inputPer1kTokens: 0.0195
172
- },
173
- // Anthropic Claude 4 family (2025)
174
- claudeOpus4: {
175
- costType: CostType.TOKEN_BASED,
176
- inputPer1kTokens: 0.045,
177
- outputPer1kTokens: 0.15
178
- },
179
- claudeSonnet4: {
180
- costType: CostType.TOKEN_BASED,
181
- inputPer1kTokens: 0.0075,
182
- outputPer1kTokens: 0.0375
183
- },
184
- claudeHaiku4: {
185
- costType: CostType.TOKEN_BASED,
186
- inputPer1kTokens: 0.00225,
187
- outputPer1kTokens: 0.0075
188
- },
189
- // Claude 3.7 family
190
- claude37Sonnet: {
191
- costType: CostType.TOKEN_BASED,
192
- inputPer1kTokens: 0.009,
193
- outputPer1kTokens: 0.027
194
- },
195
- // Claude 3.5 family
196
- claude35Sonnet: {
197
- costType: CostType.TOKEN_BASED,
198
- inputPer1kTokens: 0.0075,
199
- outputPer1kTokens: 0.0225
200
- },
201
- claude35Haiku: {
202
- costType: CostType.TOKEN_BASED,
203
- inputPer1kTokens: 0.0015,
204
- outputPer1kTokens: 0.006
205
- },
206
- // Claude 3 Opus
207
- claude3Opus: {
208
- costType: CostType.TOKEN_BASED,
209
- inputPer1kTokens: 0.045,
210
- outputPer1kTokens: 0.15
211
- },
212
- // Claude 3 Sonnet
213
- claude3Sonnet: {
214
- costType: CostType.TOKEN_BASED,
215
- inputPer1kTokens: 0.0075,
216
- outputPer1kTokens: 0.0225
217
- },
218
- // Claude 3 Haiku
219
- claude3Haiku: {
220
- costType: CostType.TOKEN_BASED,
221
- inputPer1kTokens: 0.000375,
222
- outputPer1kTokens: 0.0015
223
- },
224
- // --- 3D generation (TASK_BASED) ---
225
- // Pricing sources:
226
- // Meshy: https://www.meshy.ai/pricing (verify on each pricing change)
227
- // Rodin: https://hyperhuman.deemos.com/rodin (verify on each pricing change)
228
- // All values are in nodetool credits (1 credit = $0.01 USD), including 50% premium.
229
- // "Preview" = shape-only (fast); "Textured" = preview + refine (PBR textures embedded).
230
- //
231
- // TODO: verify exact per-task costs against the live pricing pages above.
232
- meshy4TextPreviewTier: { costType: CostType.TASK_BASED, perTask: 63 }, // ~$0.42/task
233
- meshy4TextTexturedTier: { costType: CostType.TASK_BASED, perTask: 221 }, // ~$0.42 preview + ~$1.05 refine = $1.47/task
234
- meshy4ImageTier: { costType: CostType.TASK_BASED, perTask: 63 }, // ~$0.42/task
235
- meshy3TurboTextPreviewTier: { costType: CostType.TASK_BASED, perTask: 32 }, // ~$0.21/task
236
- meshy3TurboTextTexturedTier: { costType: CostType.TASK_BASED, perTask: 111 }, // ~$0.21 + ~$0.53 = $0.74/task
237
- meshy3TurboImageTier: { costType: CostType.TASK_BASED, perTask: 32 }, // ~$0.21/task
238
- rodinGen1Tier: { costType: CostType.TASK_BASED, perTask: 120 }, // ~$0.80/task
239
- rodinGen1TurboTier: { costType: CostType.TASK_BASED, perTask: 75 }, // ~$0.50/task
240
- rodinSketchTier: { costType: CostType.TASK_BASED, perTask: 45 } // ~$0.30/task
40
+ // OpenAI gpt-image-1 — per generated 1024² image, by quality.
41
+ imageGptLow: { costType: CostType.IMAGE_BASED, perImage: 0.011 },
42
+ imageGptMedium: { costType: CostType.IMAGE_BASED, perImage: 0.042 },
43
+ imageGptHigh: { costType: CostType.IMAGE_BASED, perImage: 0.167 },
44
+ // Whisper / Speech-to-Text — per minute.
45
+ whisperStandard: { costType: CostType.DURATION_BASED, perMinute: 0.006 },
46
+ whisperLowCost: { costType: CostType.DURATION_BASED, perMinute: 0.003 },
47
+ // TTS / Text-to-Speech — per 1000 characters.
48
+ // tts-1 = $15/1M chars ($0.015/1k); tts-1-hd = $30/1M chars ($0.03/1k).
49
+ ttsHd: { costType: CostType.CHARACTER_BASED, per1kChars: 0.015 },
50
+ ttsUltraHd: { costType: CostType.CHARACTER_BASED, per1kChars: 0.03 },
51
+ // gpt-4o-mini-tts is natively token-based (text in + audio out); OpenAI's
52
+ // own estimate is ~$0.015/min of audio. Approximated here per-1k-chars
53
+ // (~1 min ≈ 900–1000 chars) since the TTS call meters characters, not tokens.
54
+ ttsGpt4oMini: { costType: CostType.CHARACTER_BASED, per1kChars: 0.015 },
55
+ // --- 3D generation (TASK_BASED) — USD per task ---
56
+ // Pricing sources (verify on each pricing change):
57
+ // Meshy: https://www.meshy.ai/pricing
58
+ // Rodin: https://hyperhuman.deemos.com/rodin
59
+ // "Preview" = shape-only (fast); "Textured" = preview + refine (PBR textures).
60
+ meshy4TextPreviewTier: { costType: CostType.TASK_BASED, perTask: 0.42 },
61
+ meshy4TextTexturedTier: { costType: CostType.TASK_BASED, perTask: 1.47 },
62
+ meshy4ImageTier: { costType: CostType.TASK_BASED, perTask: 0.42 },
63
+ meshy3TurboTextPreviewTier: { costType: CostType.TASK_BASED, perTask: 0.21 },
64
+ meshy3TurboTextTexturedTier: { costType: CostType.TASK_BASED, perTask: 0.74 },
65
+ meshy3TurboImageTier: { costType: CostType.TASK_BASED, perTask: 0.21 },
66
+ rodinGen1Tier: { costType: CostType.TASK_BASED, perTask: 0.8 },
67
+ rodinGen1TurboTier: { costType: CostType.TASK_BASED, perTask: 0.5 },
68
+ rodinSketchTier: { costType: CostType.TASK_BASED, perTask: 0.3 }
241
69
  };
242
70
  /**
243
- * Model ID to tier mapping.
244
- * Keys are "provider:modelId" strings for provider-specific pricing.
71
+ * Model ID to tier mapping for the local (non-token) pricing table.
72
+ * Keys are "provider:modelId". Token/embedding models are priced via
73
+ * genai-prices and are deliberately not listed here.
245
74
  */
246
75
  export const MODEL_TO_TIER = {
247
- // GPT-5 Series (newest models) - OpenAI specific
248
- "openai:gpt-5": "gpt5Tier",
249
- "openai:gpt-5.2": "gpt5Tier",
250
- "openai:gpt-5.2-pro": "gpt5ProTier",
251
- "openai:gpt-5-mini": "gpt5MiniTier",
252
- // GPT-4.1 Family - OpenAI specific
253
- "openai:gpt-4.1": "gpt41Tier",
254
- "openai:gpt-4.1-mini": "gpt41MiniTier",
255
- "openai:gpt-4.1-nano": "gpt41NanoTier",
256
- // O4 Series (reasoning models) - OpenAI specific
257
- "openai:o4-mini": "o4MiniTier",
258
- // O1 Series (existing reasoning models) - OpenAI specific
259
- "openai:o1": "o1Tier",
260
- "openai:o1-preview": "o1Tier",
261
- "openai:o1-mini": "o1MiniTier",
262
- // O3 Series (future models) - OpenAI specific
263
- "openai:o3": "o1Tier",
264
- "openai:o3-mini": "o1MiniTier",
265
- // GPT-4o Series - OpenAI specific
266
- "openai:gpt-4o": "topTierChat",
267
- "openai:gpt-4o-2024-11-20": "topTierChat",
268
- "openai:gpt-4o-2024-08-06": "topTierChat",
269
- "openai:gpt-4o-2024-05-13": "topTierChat",
270
- "openai:gpt-4o-search-preview": "topTierChat",
271
- "openai:gpt-4o-mini": "lowTierChat",
272
- "openai:gpt-4o-mini-2024-07-18": "lowTierChat",
273
- "openai:gpt-4o-mini-search-preview": "lowTierChat",
274
- // GPT-4 Turbo Series - OpenAI specific
275
- "openai:gpt-4-turbo": "gpt4Turbo",
276
- "openai:gpt-4-turbo-2024-04-09": "gpt4Turbo",
277
- "openai:gpt-4-turbo-preview": "gpt4Turbo",
278
- "openai:gpt-4-0125-preview": "gpt4Turbo",
279
- "openai:gpt-4-1106-preview": "gpt4Turbo",
280
- "openai:computer-use-preview": "topTierChat",
281
- // Image models - OpenAI specific
282
- "openai:gpt-image-2": "imageGpt15",
283
- "openai:gpt-image-1.5": "imageGpt15",
284
- // Whisper / Speech-to-Text - OpenAI specific
76
+ // Whisper / Speech-to-Text
285
77
  "openai:whisper-1": "whisperStandard",
286
78
  "openai:gpt-4o-transcribe": "whisperStandard",
287
79
  "openai:gpt-4o-mini-transcribe": "whisperLowCost",
288
- // TTS / Text-to-Speech - OpenAI specific
289
- "openai:gpt-4o-mini-tts": "ttsStandard",
80
+ // TTS / Text-to-Speech
81
+ "openai:gpt-4o-mini-tts": "ttsGpt4oMini",
290
82
  "openai:tts-1": "ttsHd",
291
83
  "openai:tts-1-hd": "ttsUltraHd",
292
- // Embeddings - OpenAI specific
293
- "openai:text-embedding-3-small": "embeddingSmall",
294
- "openai:text-embedding-3-large": "embeddingLarge",
295
- // Kie.ai chat models
296
- "kie:gpt-5-5": "kieGpt55Tier",
297
- "kie:claude-opus-4-6": "claudeOpus4",
298
- "kie:claude-sonnet-4-6": "claudeSonnet4",
299
- "kie:claude-haiku-4-5": "claudeHaiku4",
300
- "kie:gemini-3.1-pro": "kieGemini31ProTier",
301
- "kie:gemini-3-flash": "kieGemini3FlashTier",
302
- // Anthropic Models - Anthropic specific
303
- "anthropic:claude-opus-4-6": "claudeOpus4",
304
- "anthropic:claude-opus-4-5": "claudeOpus4",
305
- "anthropic:claude-opus-4-20250514": "claudeOpus4",
306
- "anthropic:claude-opus-4-20250501": "claudeOpus4",
307
- "anthropic:claude-sonnet-4-6": "claudeSonnet4",
308
- "anthropic:claude-sonnet-4-5": "claudeSonnet4",
309
- "anthropic:claude-sonnet-4-20250514": "claudeSonnet4",
310
- "anthropic:claude-sonnet-4-20250501": "claudeSonnet4",
311
- "anthropic:claude-haiku-4-5": "claudeHaiku4",
312
- "anthropic:claude-haiku-4-20250514": "claudeHaiku4",
313
- "anthropic:claude-haiku-4-20250501": "claudeHaiku4",
314
- "anthropic:claude-3-7-sonnet-20250511": "claude37Sonnet",
315
- "anthropic:claude-3-7-sonnet-20250219": "claude37Sonnet",
316
- "anthropic:claude-3-5-sonnet-20241022": "claude35Sonnet",
317
- "anthropic:claude-3-5-sonnet-20240620": "claude35Sonnet",
318
- "anthropic:claude-3-5-sonnet-latest": "claude35Sonnet",
319
- "anthropic:claude-3-5-haiku-20241022": "claude35Haiku",
320
- "anthropic:claude-3-5-haiku-latest": "claude35Haiku",
321
- "anthropic:claude-3-opus-20240229": "claude3Opus",
322
- "anthropic:claude-3-opus-latest": "claude3Opus",
323
- "anthropic:claude-3-sonnet-20240229": "claude3Sonnet",
324
- "anthropic:claude-3-sonnet-latest": "claude3Sonnet",
325
- "anthropic:claude-3-haiku-20240307": "claude3Haiku",
326
- "anthropic:claude-3-haiku-latest": "claude3Haiku",
327
84
  // Meshy 3D generation — text tier is textured (preview + refine); image is single-step
328
85
  "meshy:meshy-4": "meshy4TextTexturedTier",
329
86
  "meshy:meshy-4-preview": "meshy4TextPreviewTier",
@@ -336,31 +93,106 @@ export const MODEL_TO_TIER = {
336
93
  "rodin:rodin-gen-1-turbo": "rodinGen1TurboTier",
337
94
  "rodin:rodin-sketch": "rodinSketchTier"
338
95
  };
339
- import { createLogger } from "@nodetool-ai/config";
340
- const log = createLogger("nodetool.runtime.cost");
96
+ /**
97
+ * Token/embedding cost in USD via genai-prices. Returns `null` when no price is
98
+ * known (so the caller can fall back or report zero), and `0` for local models.
99
+ */
100
+ function calcTokenPriceUsd(modelId, usage, provider) {
101
+ const providerLower = provider.toLowerCase();
102
+ if (LOCAL_FREE_PROVIDERS.has(providerLower))
103
+ return 0;
104
+ const gpUsage = {
105
+ input_tokens: usage.inputTokens ?? 0,
106
+ output_tokens: usage.outputTokens ?? 0
107
+ };
108
+ // genai-prices prices a 0/undefined cache count identically to an absent one,
109
+ // so these guards only avoid passing redundant fields — toggling them is
110
+ // behaviour-preserving. The discount/premium themselves are pinned by the
111
+ // cache-read and cache-write tests, so we suppress the equivalent mutants.
112
+ // Stryker disable all
113
+ if (usage.cachedTokens && usage.cachedTokens > 0) {
114
+ gpUsage.cache_read_tokens = usage.cachedTokens;
115
+ }
116
+ if (usage.cacheWriteTokens && usage.cacheWriteTokens > 0) {
117
+ gpUsage.cache_write_tokens = usage.cacheWriteTokens;
118
+ }
119
+ // Stryker restore all
120
+ const providerId = GENAI_PROVIDER_MAP[providerLower];
121
+ // calcPrice throws on inconsistent counts (e.g. a gateway reporting the
122
+ // uncached prompt portion in input_tokens while cache_read_tokens exceeds
123
+ // it). Cost accounting must never abort a generation that already happened,
124
+ // so treat a throw as "no price known".
125
+ try {
126
+ const result = calcPrice(gpUsage, modelId, providerId ? { providerId } : undefined);
127
+ return result ? result.total_price : null;
128
+ }
129
+ catch (error) {
130
+ // Stryker disable next-line StringLiteral: warning text is for humans, not asserted.
131
+ log.warn(`Cost calculation failed for model ${modelId} (provider: ${provider})`, { error: error instanceof Error ? error.message : String(error) });
132
+ return null;
133
+ }
134
+ }
135
+ /**
136
+ * gpt-image-1 pricing tier for a given quality, or `null` when the model isn't
137
+ * a per-image gpt-image model / no image count was reported.
138
+ */
139
+ function gptImageQualityTier(modelId, usage) {
140
+ if (usage.imageCount === undefined)
141
+ return null;
142
+ const lower = modelId.toLowerCase();
143
+ if (!/^gpt-image-1(?:$|-)/.test(lower))
144
+ return null;
145
+ const qualityMap = {
146
+ low: "imageGptLow",
147
+ medium: "imageGptMedium",
148
+ high: "imageGptHigh"
149
+ };
150
+ const tierName = qualityMap[(usage.imageQuality ?? "medium").toLowerCase()] ??
151
+ "imageGptMedium";
152
+ return PRICING_TIERS[tierName] ?? null;
153
+ }
154
+ /**
155
+ * GPT Image 2.5 token pricing in USD.
156
+ * Source: https://developers.openai.com/api/docs/pricing
157
+ */
158
+ function gptImage25TokenCost(modelId, usage) {
159
+ if (!/^gpt-image-2\.5-(?:flare|sunburst)(?:-\d{4}-\d{2}-\d{2})?$/.test(modelId.toLowerCase())) {
160
+ return null;
161
+ }
162
+ const inputTextTokens = usage.inputTextTokens ?? 0;
163
+ const inputImageTokens = usage.inputImageTokens ?? 0;
164
+ const unattributedInputTokens = Math.max(0, (usage.inputTokens ?? 0) - inputTextTokens - inputImageTokens);
165
+ const outputImageTokens = usage.outputImageTokens ?? usage.outputTokens ?? 0;
166
+ return ((inputTextTokens * 5 +
167
+ (inputImageTokens + unattributedInputTokens) * 8 +
168
+ outputImageTokens * 30) /
169
+ 1_000_000);
170
+ }
341
171
  export class CostCalculator {
342
172
  /**
343
- * Get the pricing tier for a model ID scoped by provider.
344
- *
345
- * @param modelId - The model identifier
346
- * @param provider - Provider name (e.g., "openai", "anthropic")
347
- * @returns The pricing tier name, or null if not found
173
+ * Get the local (non-token) pricing tier for a model, scoped by provider.
174
+ * Token/embedding models are priced via genai-prices and return `null` here.
348
175
  */
349
176
  static getTier(modelId, provider) {
350
177
  const modelLower = modelId.toLowerCase();
351
178
  const providerLower = provider.toLowerCase();
352
- // Direct lookup with "provider:model" key
179
+ // Fast path. The longest-prefix scan below returns the identical tier for an
180
+ // exact id (a key is always a prefix of itself, and ties to the longest
181
+ // candidate), so mutating this block away is a perf change, not a behaviour
182
+ // change — hence equivalent mutants we suppress rather than chase.
183
+ // Stryker disable all
353
184
  const providerKey = `${providerLower}:${modelLower}`;
354
185
  if (providerKey in MODEL_TO_TIER) {
355
186
  return MODEL_TO_TIER[providerKey];
356
187
  }
357
- // Try prefix match with provider key - sort by model length descending
358
- // Only look at keys that match the provider
188
+ // Stryker restore all
189
+ // Longest-prefix match within the same provider.
359
190
  const providerPrefix = `${providerLower}:`;
360
- const providerKeys = Object.keys(MODEL_TO_TIER).filter((key) => key.startsWith(providerPrefix));
361
- // Sort by model portion length descending (longest prefix first)
362
- providerKeys.sort((a, b) => b.substring(providerPrefix.length).length -
363
- a.substring(providerPrefix.length).length);
191
+ // All filtered keys share the same-length providerPrefix, so sorting by raw
192
+ // key length is identical to sorting by model-part length (longest first).
193
+ const providerKeys = Object.keys(MODEL_TO_TIER)
194
+ .filter((key) => key.startsWith(providerPrefix))
195
+ .sort((a, b) => b.length - a.length);
364
196
  for (const key of providerKeys) {
365
197
  const modelPart = key.substring(providerPrefix.length);
366
198
  if (modelLower.startsWith(modelPart)) {
@@ -370,131 +202,109 @@ export class CostCalculator {
370
202
  return null;
371
203
  }
372
204
  /**
373
- * Calculate cost in credits for an API call.
205
+ * Calculate the cost of an API call in USD.
374
206
  *
375
207
  * @param modelId - The model identifier
376
208
  * @param usage - Usage information from the API response
377
209
  * @param provider - Provider name for pricing lookup
378
- * @returns Cost in credits (1 credit = $0.01 USD)
210
+ * @returns Cost in US dollars (0 when no price is known)
379
211
  */
380
212
  static calculate(modelId, usage, provider) {
381
- const tierName = CostCalculator.getTier(modelId, provider);
382
- if (tierName === null) {
383
- log.warn(`No pricing tier found for model: ${modelId} (provider: ${provider})`);
384
- return 0.0;
213
+ // gpt-image-1 is priced per image by quality, which no MODEL_TO_TIER entry
214
+ // can express — resolve it before the generic tier lookup.
215
+ const gptImageTier = gptImageQualityTier(modelId, usage);
216
+ if (gptImageTier) {
217
+ return CostCalculator._calculateForTier(gptImageTier, usage);
385
218
  }
386
- const tier = PRICING_TIERS[tierName];
387
- if (tier === undefined) {
219
+ const gptImage25Cost = gptImage25TokenCost(modelId, usage);
220
+ if (gptImage25Cost !== null)
221
+ return gptImage25Cost;
222
+ // Non-token modalities (image / audio duration / characters / 3D task).
223
+ const tierName = CostCalculator.getTier(modelId, provider);
224
+ // Stryker disable next-line ConditionalExpression: forcing this true is equivalent — PRICING_TIERS[null] is undefined, so it falls through to token pricing with only a redundant warn.
225
+ if (tierName !== null) {
226
+ const tier = PRICING_TIERS[tierName];
227
+ if (tier !== undefined) {
228
+ return CostCalculator._calculateForTier(tier, usage);
229
+ }
230
+ // Stryker disable next-line StringLiteral: warning text is for humans, not asserted.
388
231
  log.warn(`Pricing tier '${tierName}' not defined`);
389
- return 0.0;
390
232
  }
391
- return CostCalculator._calculateForTier(tier, usage);
233
+ // Token / embedding pricing via @pydantic/genai-prices (real USD).
234
+ const tokenCost = calcTokenPriceUsd(modelId, usage, provider);
235
+ if (tokenCost !== null)
236
+ return tokenCost;
237
+ // Stryker disable next-line StringLiteral: warning text is for humans, not asserted.
238
+ log.warn(`No price found for model: ${modelId} (provider: ${provider})`);
239
+ return 0.0;
392
240
  }
393
241
  /**
394
- * Calculate cost based on tier type.
242
+ * Token cost in USD, or `null` when no price is known for the model.
243
+ *
244
+ * {@link calculate} answers 0 for an unpriced model because accounting must
245
+ * never break a generation that already ran. A budget decides whether a call
246
+ * happens *at all*, and there "unknown" must not read as "free" — so the
247
+ * missing-price case is a distinct answer here, and callers that reserve
248
+ * against a cap fail closed on it.
395
249
  */
250
+ static estimateTokenCostUsd(modelId, usage, provider) {
251
+ return calcTokenPriceUsd(modelId, usage, provider);
252
+ }
253
+ /** Cost for a local non-token modality tier, in USD. */
396
254
  static _calculateForTier(tier, usage) {
397
- const inputTokens = usage.inputTokens ?? 0;
398
- const outputTokens = usage.outputTokens ?? 0;
399
- const cachedTokens = usage.cachedTokens ?? 0;
400
255
  const inputCharacters = usage.inputCharacters ?? 0;
401
256
  const durationSeconds = usage.durationSeconds ?? 0;
402
257
  const imageCount = usage.imageCount ?? 0;
403
258
  const videoSeconds = usage.videoSeconds ?? 0;
404
- if (tier.costType === CostType.TOKEN_BASED) {
405
- let inputCost;
406
- let cachedCost;
407
- if (cachedTokens > 0 && (tier.cachedPer1kTokens ?? 0) > 0) {
408
- const nonCachedInput = Math.max(0, inputTokens - cachedTokens);
409
- inputCost = (nonCachedInput / 1000) * (tier.inputPer1kTokens ?? 0);
410
- cachedCost = (cachedTokens / 1000) * (tier.cachedPer1kTokens ?? 0);
411
- }
412
- else {
413
- inputCost = (inputTokens / 1000) * (tier.inputPer1kTokens ?? 0);
414
- cachedCost = 0.0;
415
- }
416
- const outputCost = (outputTokens / 1000) * (tier.outputPer1kTokens ?? 0);
417
- return inputCost + outputCost + cachedCost;
418
- }
419
- else if (tier.costType === CostType.EMBEDDING) {
420
- return (inputTokens / 1000) * (tier.inputPer1kTokens ?? 0);
421
- }
422
- else if (tier.costType === CostType.CHARACTER_BASED) {
423
- return (inputCharacters / 1000) * (tier.per1kChars ?? 0);
424
- }
425
- else if (tier.costType === CostType.DURATION_BASED) {
426
- const durationMinutes = durationSeconds / 60.0;
427
- return durationMinutes * (tier.perMinute ?? 0);
428
- }
429
- else if (tier.costType === CostType.IMAGE_BASED) {
430
- return imageCount * (tier.perImage ?? 0);
431
- }
432
- else if (tier.costType === CostType.VIDEO_BASED) {
433
- return videoSeconds * (tier.perSecondVideo ?? 0);
259
+ switch (tier.costType) {
260
+ case CostType.CHARACTER_BASED:
261
+ return (inputCharacters / 1000) * (tier.per1kChars ?? 0);
262
+ case CostType.DURATION_BASED:
263
+ return (durationSeconds / 60.0) * (tier.perMinute ?? 0);
264
+ case CostType.IMAGE_BASED:
265
+ return imageCount * (tier.perImage ?? 0);
266
+ case CostType.VIDEO_BASED:
267
+ return videoSeconds * (tier.perSecondVideo ?? 0);
268
+ case CostType.TASK_BASED:
269
+ return (usage.taskCount ?? 1) * (tier.perTask ?? 0);
270
+ default:
271
+ return 0.0;
434
272
  }
435
- else if (tier.costType === CostType.TASK_BASED) {
436
- const taskCount = usage.taskCount ?? 1;
437
- return taskCount * (tier.perTask ?? 0);
438
- }
439
- return 0.0;
440
273
  }
441
274
  }
442
- // Convenience functions
443
- /**
444
- * Calculate chat completion cost.
445
- */
446
- export function calculateChatCost(modelId, inputTokens, outputTokens, cachedTokens = 0, provider = "openai") {
275
+ /** Calculate chat completion cost in USD. */
276
+ export function calculateChatCost(modelId, inputTokens, outputTokens, cachedTokens = 0, provider = PROVIDER_IDS.OPENAI) {
447
277
  const usage = { inputTokens, outputTokens, cachedTokens };
448
278
  return CostCalculator.calculate(modelId, usage, provider);
449
279
  }
450
- /**
451
- * Calculate embedding cost.
452
- */
453
- export function calculateEmbeddingCost(modelId, inputTokens, provider = "openai") {
280
+ /** Calculate embedding cost in USD. */
281
+ export function calculateEmbeddingCost(modelId, inputTokens, provider = PROVIDER_IDS.OPENAI) {
454
282
  const usage = { inputTokens };
455
283
  return CostCalculator.calculate(modelId, usage, provider);
456
284
  }
457
- /**
458
- * Calculate TTS cost.
459
- */
460
- export function calculateSpeechCost(modelId, inputChars, provider = "openai") {
285
+ /** Calculate TTS cost in USD. */
286
+ export function calculateSpeechCost(modelId, inputChars, provider = PROVIDER_IDS.OPENAI) {
461
287
  const usage = { inputCharacters: inputChars };
462
288
  return CostCalculator.calculate(modelId, usage, provider);
463
289
  }
464
- /**
465
- * Calculate ASR/Whisper cost.
466
- */
467
- export function calculateWhisperCost(modelId, durationSeconds, provider = "openai") {
290
+ /** Calculate ASR/Whisper cost in USD. */
291
+ export function calculateWhisperCost(modelId, durationSeconds, provider = PROVIDER_IDS.OPENAI) {
468
292
  const usage = { durationSeconds };
469
293
  return CostCalculator.calculate(modelId, usage, provider);
470
294
  }
471
295
  /**
472
- * Calculate 3D model generation cost.
296
+ * Calculate 3D model generation cost in USD.
473
297
  * Pass `taskCount` > 1 only if multiple tasks were submitted (rare).
474
298
  */
475
299
  export function calculateModel3DCost(modelId, provider, taskCount = 1) {
476
300
  const usage = { taskCount };
477
301
  return CostCalculator.calculate(modelId, usage, provider);
478
302
  }
479
- /**
480
- * Calculate image generation cost.
481
- */
482
- export function calculateImageCost(modelId, imageCount = 1, quality = "medium", provider = "openai") {
483
- // Adjust tier based on quality for gpt-image models
484
- if (modelId.toLowerCase().includes("gpt-image") && !modelId.includes("1.5")) {
485
- const qualityMap = {
486
- low: "imageGptLow",
487
- medium: "imageGptMedium",
488
- high: "imageGptHigh"
489
- };
490
- const tierOverride = qualityMap[quality.toLowerCase()] ?? "imageGptMedium";
491
- const tier = PRICING_TIERS[tierOverride];
492
- if (tier) {
493
- const usage = { imageCount };
494
- return CostCalculator["_calculateForTier"](tier, usage);
495
- }
496
- }
497
- const usage = { imageCount };
303
+ /** Calculate image generation cost in USD. */
304
+ export function calculateImageCost(modelId, imageCount = 1,
305
+ // Stryker disable next-line StringLiteral: default "medium" and "" both resolve to imageGptMedium via the ?? fallback below.
306
+ quality = "medium", provider = PROVIDER_IDS.OPENAI) {
307
+ const usage = { imageCount, imageQuality: quality };
498
308
  return CostCalculator.calculate(modelId, usage, provider);
499
309
  }
500
310
  //# sourceMappingURL=cost-calculator.js.map