@nodetool-ai/runtime 0.7.0-rc.23 → 0.8.2
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.
- package/README.md +29 -0
- package/dist/.nodetool-build-stamp +1 -0
- package/dist/agent-memory.d.ts +118 -0
- package/dist/agent-memory.d.ts.map +1 -0
- package/dist/agent-memory.js +186 -0
- package/dist/agent-memory.js.map +1 -0
- package/dist/async-local-storage.d.ts +20 -0
- package/dist/async-local-storage.d.ts.map +1 -0
- package/dist/async-local-storage.js +28 -0
- package/dist/async-local-storage.js.map +1 -0
- package/dist/blender-executor.d.ts +93 -0
- package/dist/blender-executor.d.ts.map +1 -0
- package/dist/blender-executor.js +294 -0
- package/dist/blender-executor.js.map +1 -0
- package/dist/comfy-executor.d.ts +23 -1
- package/dist/comfy-executor.d.ts.map +1 -1
- package/dist/comfy-executor.js +234 -55
- package/dist/comfy-executor.js.map +1 -1
- package/dist/context-packer.d.ts +1 -1
- package/dist/context-packer.d.ts.map +1 -1
- package/dist/context-packer.js +23 -25
- package/dist/context-packer.js.map +1 -1
- package/dist/context.d.ts +982 -127
- package/dist/context.d.ts.map +1 -1
- package/dist/context.js +2649 -530
- package/dist/context.js.map +1 -1
- package/dist/cost-reconciler.d.ts +32 -0
- package/dist/cost-reconciler.d.ts.map +1 -0
- package/dist/cost-reconciler.js +21 -0
- package/dist/cost-reconciler.js.map +1 -0
- package/dist/entities.d.ts +33 -0
- package/dist/entities.d.ts.map +1 -0
- package/dist/entities.js +43 -0
- package/dist/entities.js.map +1 -0
- package/dist/external-media-fetch.d.ts +29 -0
- package/dist/external-media-fetch.d.ts.map +1 -0
- package/dist/external-media-fetch.js +38 -0
- package/dist/external-media-fetch.js.map +1 -0
- package/dist/generation-receipt.d.ts +86 -0
- package/dist/generation-receipt.d.ts.map +1 -0
- package/dist/generation-receipt.js +137 -0
- package/dist/generation-receipt.js.map +1 -0
- package/dist/generation-registry.d.ts +75 -0
- package/dist/generation-registry.d.ts.map +1 -0
- package/dist/generation-registry.js +144 -0
- package/dist/generation-registry.js.map +1 -0
- package/dist/google/client.d.ts +196 -0
- package/dist/google/client.d.ts.map +1 -0
- package/dist/google/client.js +396 -0
- package/dist/google/client.js.map +1 -0
- package/dist/google/index.d.ts +3 -0
- package/dist/google/index.d.ts.map +1 -0
- package/dist/google/index.js +3 -0
- package/dist/google/index.js.map +1 -0
- package/dist/google/token.d.ts +15 -0
- package/dist/google/token.d.ts.map +1 -0
- package/dist/google/token.js +24 -0
- package/dist/google/token.js.map +1 -0
- package/dist/host-binaries.d.ts +106 -0
- package/dist/host-binaries.d.ts.map +1 -0
- package/dist/host-binaries.js +352 -0
- package/dist/host-binaries.js.map +1 -0
- package/dist/image-codec.d.ts +76 -0
- package/dist/image-codec.d.ts.map +1 -0
- package/dist/image-codec.js +293 -0
- package/dist/image-codec.js.map +1 -0
- package/dist/image-model-tasks.d.ts +15 -0
- package/dist/image-model-tasks.d.ts.map +1 -0
- package/dist/image-model-tasks.js +24 -0
- package/dist/image-model-tasks.js.map +1 -0
- package/dist/index.d.ts +67 -6
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +51 -4
- package/dist/index.js.map +1 -1
- package/dist/invocation-account.d.ts +43 -0
- package/dist/invocation-account.d.ts.map +1 -0
- package/dist/invocation-account.js +60 -0
- package/dist/invocation-account.js.map +1 -0
- package/dist/media-ref-bytes.d.ts +35 -0
- package/dist/media-ref-bytes.d.ts.map +1 -0
- package/dist/media-ref-bytes.js +191 -0
- package/dist/media-ref-bytes.js.map +1 -0
- package/dist/node-executor.d.ts +119 -2
- package/dist/node-executor.d.ts.map +1 -1
- package/dist/permission-gate.d.ts +152 -0
- package/dist/permission-gate.d.ts.map +1 -0
- package/dist/permission-gate.js +87 -0
- package/dist/permission-gate.js.map +1 -0
- package/dist/prefixed-storage-adapter.d.ts +33 -0
- package/dist/prefixed-storage-adapter.d.ts.map +1 -0
- package/dist/prefixed-storage-adapter.js +70 -0
- package/dist/prefixed-storage-adapter.js.map +1 -0
- package/dist/prompt-asset-refs.d.ts +222 -0
- package/dist/prompt-asset-refs.d.ts.map +1 -0
- package/dist/prompt-asset-refs.js +751 -0
- package/dist/prompt-asset-refs.js.map +1 -0
- package/dist/provider-cache.d.ts +3 -0
- package/dist/provider-cache.d.ts.map +1 -0
- package/dist/provider-cache.js +8 -0
- package/dist/provider-cache.js.map +1 -0
- package/dist/providers/aki-provider.d.ts +35 -10
- package/dist/providers/aki-provider.d.ts.map +1 -1
- package/dist/providers/aki-provider.js +90 -77
- package/dist/providers/aki-provider.js.map +1 -1
- package/dist/providers/alibaba-provider.d.ts +39 -0
- package/dist/providers/alibaba-provider.d.ts.map +1 -0
- package/dist/providers/alibaba-provider.js +86 -0
- package/dist/providers/alibaba-provider.js.map +1 -0
- package/dist/providers/anthropic-provider.d.ts +52 -3
- package/dist/providers/anthropic-provider.d.ts.map +1 -1
- package/dist/providers/anthropic-provider.js +1020 -338
- package/dist/providers/anthropic-provider.js.map +1 -1
- package/dist/providers/atlascloud-provider.d.ts +103 -0
- package/dist/providers/atlascloud-provider.d.ts.map +1 -0
- package/dist/providers/atlascloud-provider.js +1031 -0
- package/dist/providers/atlascloud-provider.js.map +1 -0
- package/dist/providers/atlascloud-transport.d.ts +100 -0
- package/dist/providers/atlascloud-transport.d.ts.map +1 -0
- package/dist/providers/atlascloud-transport.js +364 -0
- package/dist/providers/atlascloud-transport.js.map +1 -0
- package/dist/providers/atlascloud-webhook-registry.d.ts +35 -0
- package/dist/providers/atlascloud-webhook-registry.d.ts.map +1 -0
- package/dist/providers/atlascloud-webhook-registry.js +104 -0
- package/dist/providers/atlascloud-webhook-registry.js.map +1 -0
- package/dist/providers/audio-mime.d.ts +11 -0
- package/dist/providers/audio-mime.d.ts.map +1 -0
- package/dist/providers/audio-mime.js +46 -0
- package/dist/providers/audio-mime.js.map +1 -0
- package/dist/providers/base-provider.d.ts +501 -32
- package/dist/providers/base-provider.d.ts.map +1 -1
- package/dist/providers/base-provider.js +1280 -87
- package/dist/providers/base-provider.js.map +1 -1
- package/dist/providers/cassette-provider.d.ts +217 -0
- package/dist/providers/cassette-provider.d.ts.map +1 -0
- package/dist/providers/cassette-provider.js +502 -0
- package/dist/providers/cassette-provider.js.map +1 -0
- package/dist/providers/cerebras-provider.d.ts +6 -12
- package/dist/providers/cerebras-provider.d.ts.map +1 -1
- package/dist/providers/cerebras-provider.js +8 -33
- package/dist/providers/cerebras-provider.js.map +1 -1
- package/dist/providers/claude-agent-provider.d.ts +107 -74
- package/dist/providers/claude-agent-provider.d.ts.map +1 -1
- package/dist/providers/claude-agent-provider.js +1279 -517
- package/dist/providers/claude-agent-provider.js.map +1 -1
- package/dist/providers/codex-provider.d.ts +84 -0
- package/dist/providers/codex-provider.d.ts.map +1 -0
- package/dist/providers/codex-provider.js +505 -0
- package/dist/providers/codex-provider.js.map +1 -0
- package/dist/providers/cohere-provider.d.ts +7 -3
- package/dist/providers/cohere-provider.d.ts.map +1 -1
- package/dist/providers/cohere-provider.js +14 -2
- package/dist/providers/cohere-provider.js.map +1 -1
- package/dist/providers/comfy-cloud-provider.d.ts +30 -0
- package/dist/providers/comfy-cloud-provider.d.ts.map +1 -0
- package/dist/providers/comfy-cloud-provider.js +42 -0
- package/dist/providers/comfy-cloud-provider.js.map +1 -0
- package/dist/providers/content-filter.d.ts +46 -0
- package/dist/providers/content-filter.d.ts.map +1 -0
- package/dist/providers/content-filter.js +92 -0
- package/dist/providers/content-filter.js.map +1 -0
- package/dist/providers/context-exceeded.d.ts +37 -0
- package/dist/providers/context-exceeded.d.ts.map +1 -0
- package/dist/providers/context-exceeded.js +114 -0
- package/dist/providers/context-exceeded.js.map +1 -0
- package/dist/providers/context-window.d.ts +44 -0
- package/dist/providers/context-window.d.ts.map +1 -0
- package/dist/providers/context-window.js +145 -0
- package/dist/providers/context-window.js.map +1 -0
- package/dist/providers/contract/index.d.ts +4 -0
- package/dist/providers/contract/index.d.ts.map +1 -0
- package/dist/providers/contract/index.js +4 -0
- package/dist/providers/contract/index.js.map +1 -0
- package/dist/providers/contract/probe-manifest.d.ts +75 -0
- package/dist/providers/contract/probe-manifest.d.ts.map +1 -0
- package/dist/providers/contract/probe-manifest.js +379 -0
- package/dist/providers/contract/probe-manifest.js.map +1 -0
- package/dist/providers/contract/probe-runner.d.ts +57 -0
- package/dist/providers/contract/probe-runner.d.ts.map +1 -0
- package/dist/providers/contract/probe-runner.js +180 -0
- package/dist/providers/contract/probe-runner.js.map +1 -0
- package/dist/providers/contract/redact.d.ts +29 -0
- package/dist/providers/contract/redact.d.ts.map +1 -0
- package/dist/providers/contract/redact.js +113 -0
- package/dist/providers/contract/redact.js.map +1 -0
- package/dist/providers/core-tools.d.ts +75 -0
- package/dist/providers/core-tools.d.ts.map +1 -0
- package/dist/providers/core-tools.js +128 -0
- package/dist/providers/core-tools.js.map +1 -0
- package/dist/providers/cost-calculator.d.ts +69 -50
- package/dist/providers/cost-calculator.d.ts.map +1 -1
- package/dist/providers/cost-calculator.js +207 -397
- package/dist/providers/cost-calculator.js.map +1 -1
- package/dist/providers/credential-check.d.ts +45 -0
- package/dist/providers/credential-check.d.ts.map +1 -0
- package/dist/providers/credential-check.js +164 -0
- package/dist/providers/credential-check.js.map +1 -0
- package/dist/providers/custom-model-kinds.d.ts +33 -0
- package/dist/providers/custom-model-kinds.d.ts.map +1 -0
- package/dist/providers/custom-model-kinds.js +96 -0
- package/dist/providers/custom-model-kinds.js.map +1 -0
- package/dist/providers/custom-openai-provider.d.ts +83 -0
- package/dist/providers/custom-openai-provider.d.ts.map +1 -0
- package/dist/providers/custom-openai-provider.js +190 -0
- package/dist/providers/custom-openai-provider.js.map +1 -0
- package/dist/providers/custom-provider-registry.d.ts +19 -0
- package/dist/providers/custom-provider-registry.d.ts.map +1 -0
- package/dist/providers/custom-provider-registry.js +52 -0
- package/dist/providers/custom-provider-registry.js.map +1 -0
- package/dist/providers/deepseek-provider.d.ts +8 -14
- package/dist/providers/deepseek-provider.d.ts.map +1 -1
- package/dist/providers/deepseek-provider.js +6 -35
- package/dist/providers/deepseek-provider.js.map +1 -1
- package/dist/providers/defaults.d.ts +12 -0
- package/dist/providers/defaults.d.ts.map +1 -0
- package/dist/providers/defaults.js +12 -0
- package/dist/providers/defaults.js.map +1 -0
- package/dist/providers/dreamina-models.d.ts +5 -0
- package/dist/providers/dreamina-models.d.ts.map +1 -0
- package/dist/providers/dreamina-models.js +57 -0
- package/dist/providers/dreamina-models.js.map +1 -0
- package/dist/providers/dreamina-music.d.ts +52 -0
- package/dist/providers/dreamina-music.d.ts.map +1 -0
- package/dist/providers/dreamina-music.js +115 -0
- package/dist/providers/dreamina-music.js.map +1 -0
- package/dist/providers/dreamina-provider.d.ts +62 -0
- package/dist/providers/dreamina-provider.d.ts.map +1 -0
- package/dist/providers/dreamina-provider.js +790 -0
- package/dist/providers/dreamina-provider.js.map +1 -0
- package/dist/providers/elevenlabs-provider.d.ts +50 -0
- package/dist/providers/elevenlabs-provider.d.ts.map +1 -0
- package/dist/providers/elevenlabs-provider.js +147 -0
- package/dist/providers/elevenlabs-provider.js.map +1 -0
- package/dist/providers/entity-references.d.ts +31 -0
- package/dist/providers/entity-references.d.ts.map +1 -0
- package/dist/providers/entity-references.js +113 -0
- package/dist/providers/entity-references.js.map +1 -0
- package/dist/providers/evolink-provider.d.ts +40 -0
- package/dist/providers/evolink-provider.d.ts.map +1 -0
- package/dist/providers/evolink-provider.js +312 -0
- package/dist/providers/evolink-provider.js.map +1 -0
- package/dist/providers/fake-provider.d.ts +74 -2
- package/dist/providers/fake-provider.d.ts.map +1 -1
- package/dist/providers/fake-provider.js +213 -1
- package/dist/providers/fake-provider.js.map +1 -1
- package/dist/providers/fal-generations.d.ts +106 -0
- package/dist/providers/fal-generations.d.ts.map +1 -0
- package/dist/providers/fal-generations.js +286 -0
- package/dist/providers/fal-generations.js.map +1 -0
- package/dist/providers/fal-provider.d.ts +173 -8
- package/dist/providers/fal-provider.d.ts.map +1 -1
- package/dist/providers/fal-provider.js +1396 -64
- package/dist/providers/fal-provider.js.map +1 -1
- package/dist/providers/fal-queue.d.ts +47 -0
- package/dist/providers/fal-queue.d.ts.map +1 -0
- package/dist/providers/fal-queue.js +231 -0
- package/dist/providers/fal-queue.js.map +1 -0
- package/dist/providers/gemini-provider.d.ts +150 -9
- package/dist/providers/gemini-provider.d.ts.map +1 -1
- package/dist/providers/gemini-provider.js +1515 -316
- package/dist/providers/gemini-provider.js.map +1 -1
- package/dist/providers/gmi-provider.d.ts +21 -0
- package/dist/providers/gmi-provider.d.ts.map +1 -0
- package/dist/providers/gmi-provider.js +34 -0
- package/dist/providers/gmi-provider.js.map +1 -0
- package/dist/providers/gpt-image-size.d.ts +3 -0
- package/dist/providers/gpt-image-size.d.ts.map +1 -0
- package/dist/providers/gpt-image-size.js +37 -0
- package/dist/providers/gpt-image-size.js.map +1 -0
- package/dist/providers/groq-provider.d.ts +9 -12
- package/dist/providers/groq-provider.d.ts.map +1 -1
- package/dist/providers/groq-provider.js +19 -33
- package/dist/providers/groq-provider.js.map +1 -1
- package/dist/providers/groq-request.d.ts +38 -0
- package/dist/providers/groq-request.d.ts.map +1 -0
- package/dist/providers/groq-request.js +138 -0
- package/dist/providers/groq-request.js.map +1 -0
- package/dist/providers/higgsfield-provider.d.ts +31 -0
- package/dist/providers/higgsfield-provider.d.ts.map +1 -0
- package/dist/providers/higgsfield-provider.js +143 -0
- package/dist/providers/higgsfield-provider.js.map +1 -0
- package/dist/providers/higgsfield-transport.d.ts +106 -0
- package/dist/providers/higgsfield-transport.d.ts.map +1 -0
- package/dist/providers/higgsfield-transport.js +182 -0
- package/dist/providers/higgsfield-transport.js.map +1 -0
- package/dist/providers/http-transport.d.ts +74 -0
- package/dist/providers/http-transport.d.ts.map +1 -0
- package/dist/providers/http-transport.js +152 -0
- package/dist/providers/http-transport.js.map +1 -0
- package/dist/providers/huggingface-provider.d.ts +73 -4
- package/dist/providers/huggingface-provider.d.ts.map +1 -1
- package/dist/providers/huggingface-provider.js +240 -34
- package/dist/providers/huggingface-provider.js.map +1 -1
- package/dist/providers/image-mime.d.ts +39 -0
- package/dist/providers/image-mime.d.ts.map +1 -0
- package/dist/providers/image-mime.js +111 -0
- package/dist/providers/image-mime.js.map +1 -0
- package/dist/providers/image-ref.d.ts +21 -0
- package/dist/providers/image-ref.d.ts.map +1 -0
- package/dist/providers/image-ref.js +44 -0
- package/dist/providers/image-ref.js.map +1 -0
- package/dist/providers/index.d.ts +87 -8
- package/dist/providers/index.d.ts.map +1 -1
- package/dist/providers/index.js +250 -56
- package/dist/providers/index.js.map +1 -1
- package/dist/providers/jina-provider.d.ts +12 -3
- package/dist/providers/jina-provider.d.ts.map +1 -1
- package/dist/providers/jina-provider.js +21 -7
- package/dist/providers/jina-provider.js.map +1 -1
- package/dist/providers/kie-provider.d.ts +172 -10
- package/dist/providers/kie-provider.d.ts.map +1 -1
- package/dist/providers/kie-provider.js +1190 -228
- package/dist/providers/kie-provider.js.map +1 -1
- package/dist/providers/kie-webhook-registry.d.ts +28 -0
- package/dist/providers/kie-webhook-registry.d.ts.map +1 -0
- package/dist/providers/kie-webhook-registry.js +91 -0
- package/dist/providers/kie-webhook-registry.js.map +1 -0
- package/dist/providers/llama-provider.d.ts +23 -36
- package/dist/providers/llama-provider.d.ts.map +1 -1
- package/dist/providers/llama-provider.js +50 -355
- package/dist/providers/llama-provider.js.map +1 -1
- package/dist/providers/lmstudio-provider.d.ts +4 -7
- package/dist/providers/lmstudio-provider.d.ts.map +1 -1
- package/dist/providers/lmstudio-provider.js +24 -15
- package/dist/providers/lmstudio-provider.js.map +1 -1
- package/dist/providers/loop-tracing.d.ts +17 -0
- package/dist/providers/loop-tracing.d.ts.map +1 -0
- package/dist/providers/loop-tracing.js +132 -0
- package/dist/providers/loop-tracing.js.map +1 -0
- package/dist/providers/manifest-models.d.ts +341 -1
- package/dist/providers/manifest-models.d.ts.map +1 -1
- package/dist/providers/manifest-models.js +1106 -22
- package/dist/providers/manifest-models.js.map +1 -1
- package/dist/providers/media-mime.d.ts +14 -0
- package/dist/providers/media-mime.d.ts.map +1 -0
- package/dist/providers/media-mime.js +35 -0
- package/dist/providers/media-mime.js.map +1 -0
- package/dist/providers/meshy-provider.d.ts +16 -2
- package/dist/providers/meshy-provider.d.ts.map +1 -1
- package/dist/providers/meshy-provider.js +82 -46
- package/dist/providers/meshy-provider.js.map +1 -1
- package/dist/providers/meta-provider.d.ts +22 -0
- package/dist/providers/meta-provider.d.ts.map +1 -0
- package/dist/providers/meta-provider.js +54 -0
- package/dist/providers/meta-provider.js.map +1 -0
- package/dist/providers/minimax-provider.d.ts +27 -18
- package/dist/providers/minimax-provider.d.ts.map +1 -1
- package/dist/providers/minimax-provider.js +222 -72
- package/dist/providers/minimax-provider.js.map +1 -1
- package/dist/providers/mistral-provider.d.ts +8 -12
- package/dist/providers/mistral-provider.d.ts.map +1 -1
- package/dist/providers/mistral-provider.js +15 -34
- package/dist/providers/mistral-provider.js.map +1 -1
- package/dist/providers/moonshot-provider.d.ts +11 -15
- package/dist/providers/moonshot-provider.d.ts.map +1 -1
- package/dist/providers/moonshot-provider.js +33 -23
- package/dist/providers/moonshot-provider.js.map +1 -1
- package/dist/providers/node-llama-cpp-provider.d.ts +99 -0
- package/dist/providers/node-llama-cpp-provider.d.ts.map +1 -0
- package/dist/providers/node-llama-cpp-provider.js +484 -0
- package/dist/providers/node-llama-cpp-provider.js.map +1 -0
- package/dist/providers/nodetool-provider.d.ts +49 -0
- package/dist/providers/nodetool-provider.d.ts.map +1 -0
- package/dist/providers/nodetool-provider.js +222 -0
- package/dist/providers/nodetool-provider.js.map +1 -0
- package/dist/providers/oauth/browser-launcher.d.ts +23 -0
- package/dist/providers/oauth/browser-launcher.d.ts.map +1 -0
- package/dist/providers/oauth/browser-launcher.js +45 -0
- package/dist/providers/oauth/browser-launcher.js.map +1 -0
- package/dist/providers/oauth/claude-code-credentials.d.ts +74 -0
- package/dist/providers/oauth/claude-code-credentials.d.ts.map +1 -0
- package/dist/providers/oauth/claude-code-credentials.js +133 -0
- package/dist/providers/oauth/claude-code-credentials.js.map +1 -0
- package/dist/providers/oauth/claude-code-login.d.ts +124 -0
- package/dist/providers/oauth/claude-code-login.d.ts.map +1 -0
- package/dist/providers/oauth/claude-code-login.js +230 -0
- package/dist/providers/oauth/claude-code-login.js.map +1 -0
- package/dist/providers/oauth/claude-code-oauth-client.d.ts +111 -0
- package/dist/providers/oauth/claude-code-oauth-client.d.ts.map +1 -0
- package/dist/providers/oauth/claude-code-oauth-client.js +207 -0
- package/dist/providers/oauth/claude-code-oauth-client.js.map +1 -0
- package/dist/providers/oauth/errors.d.ts +54 -0
- package/dist/providers/oauth/errors.d.ts.map +1 -0
- package/dist/providers/oauth/errors.js +79 -0
- package/dist/providers/oauth/errors.js.map +1 -0
- package/dist/providers/oauth/index.d.ts +105 -0
- package/dist/providers/oauth/index.d.ts.map +1 -0
- package/dist/providers/oauth/index.js +167 -0
- package/dist/providers/oauth/index.js.map +1 -0
- package/dist/providers/oauth/jwt-claims.d.ts +23 -0
- package/dist/providers/oauth/jwt-claims.d.ts.map +1 -0
- package/dist/providers/oauth/jwt-claims.js +67 -0
- package/dist/providers/oauth/jwt-claims.js.map +1 -0
- package/dist/providers/oauth/local-callback-server.d.ts +60 -0
- package/dist/providers/oauth/local-callback-server.d.ts.map +1 -0
- package/dist/providers/oauth/local-callback-server.js +148 -0
- package/dist/providers/oauth/local-callback-server.js.map +1 -0
- package/dist/providers/oauth/oauth-client.d.ts +55 -0
- package/dist/providers/oauth/oauth-client.d.ts.map +1 -0
- package/dist/providers/oauth/oauth-client.js +161 -0
- package/dist/providers/oauth/oauth-client.js.map +1 -0
- package/dist/providers/oauth/openai-oauth-provider.d.ts +129 -0
- package/dist/providers/oauth/openai-oauth-provider.d.ts.map +1 -0
- package/dist/providers/oauth/openai-oauth-provider.js +265 -0
- package/dist/providers/oauth/openai-oauth-provider.js.map +1 -0
- package/dist/providers/oauth/pkce-helper.d.ts +43 -0
- package/dist/providers/oauth/pkce-helper.d.ts.map +1 -0
- package/dist/providers/oauth/pkce-helper.js +57 -0
- package/dist/providers/oauth/pkce-helper.js.map +1 -0
- package/dist/providers/oauth/redaction.d.ts +22 -0
- package/dist/providers/oauth/redaction.d.ts.map +1 -0
- package/dist/providers/oauth/redaction.js +59 -0
- package/dist/providers/oauth/redaction.js.map +1 -0
- package/dist/providers/oauth/secure-credential-store.d.ts +67 -0
- package/dist/providers/oauth/secure-credential-store.d.ts.map +1 -0
- package/dist/providers/oauth/secure-credential-store.js +73 -0
- package/dist/providers/oauth/secure-credential-store.js.map +1 -0
- package/dist/providers/oauth/token-store.d.ts +53 -0
- package/dist/providers/oauth/token-store.d.ts.map +1 -0
- package/dist/providers/oauth/token-store.js +78 -0
- package/dist/providers/oauth/token-store.js.map +1 -0
- package/dist/providers/oauth/types.d.ts +64 -0
- package/dist/providers/oauth/types.d.ts.map +1 -0
- package/dist/providers/oauth/types.js +12 -0
- package/dist/providers/oauth/types.js.map +1 -0
- package/dist/providers/object-tracking.d.ts +47 -0
- package/dist/providers/object-tracking.d.ts.map +1 -0
- package/dist/providers/object-tracking.js +46 -0
- package/dist/providers/object-tracking.js.map +1 -0
- package/dist/providers/offline-model-index.d.ts +20 -0
- package/dist/providers/offline-model-index.d.ts.map +1 -0
- package/dist/providers/offline-model-index.js +112 -0
- package/dist/providers/offline-model-index.js.map +1 -0
- package/dist/providers/ollama-provider.d.ts +30 -2
- package/dist/providers/ollama-provider.d.ts.map +1 -1
- package/dist/providers/ollama-provider.js +198 -43
- package/dist/providers/ollama-provider.js.map +1 -1
- package/dist/providers/openai-compat/client.d.ts +57 -0
- package/dist/providers/openai-compat/client.d.ts.map +1 -0
- package/dist/providers/openai-compat/client.js +157 -0
- package/dist/providers/openai-compat/client.js.map +1 -0
- package/dist/providers/openai-compat/decode.d.ts +36 -0
- package/dist/providers/openai-compat/decode.d.ts.map +1 -0
- package/dist/providers/openai-compat/decode.js +55 -0
- package/dist/providers/openai-compat/decode.js.map +1 -0
- package/dist/providers/openai-compat/errors.d.ts +54 -0
- package/dist/providers/openai-compat/errors.d.ts.map +1 -0
- package/dist/providers/openai-compat/errors.js +144 -0
- package/dist/providers/openai-compat/errors.js.map +1 -0
- package/dist/providers/openai-compat/index.d.ts +8 -0
- package/dist/providers/openai-compat/index.d.ts.map +1 -0
- package/dist/providers/openai-compat/index.js +5 -0
- package/dist/providers/openai-compat/index.js.map +1 -0
- package/dist/providers/openai-compat/sse.d.ts +14 -0
- package/dist/providers/openai-compat/sse.d.ts.map +1 -0
- package/dist/providers/openai-compat/sse.js +69 -0
- package/dist/providers/openai-compat/sse.js.map +1 -0
- package/dist/providers/openai-compat/types.d.ts +75 -0
- package/dist/providers/openai-compat/types.d.ts.map +1 -0
- package/dist/providers/openai-compat/types.js +9 -0
- package/dist/providers/openai-compat/types.js.map +1 -0
- package/dist/providers/openai-compat-provider.d.ts +90 -0
- package/dist/providers/openai-compat-provider.d.ts.map +1 -0
- package/dist/providers/openai-compat-provider.js +282 -0
- package/dist/providers/openai-compat-provider.js.map +1 -0
- package/dist/providers/openai-provider.d.ts +98 -27
- package/dist/providers/openai-provider.d.ts.map +1 -1
- package/dist/providers/openai-provider.js +1037 -105
- package/dist/providers/openai-provider.js.map +1 -1
- package/dist/providers/openrouter-provider.d.ts +58 -13
- package/dist/providers/openrouter-provider.d.ts.map +1 -1
- package/dist/providers/openrouter-provider.js +383 -51
- package/dist/providers/openrouter-provider.js.map +1 -1
- package/dist/providers/provider-call-failure.d.ts +39 -0
- package/dist/providers/provider-call-failure.d.ts.map +1 -0
- package/dist/providers/provider-call-failure.js +132 -0
- package/dist/providers/provider-call-failure.js.map +1 -0
- package/dist/providers/provider-error.d.ts +59 -0
- package/dist/providers/provider-error.d.ts.map +1 -0
- package/dist/providers/provider-error.js +171 -0
- package/dist/providers/provider-error.js.map +1 -0
- package/dist/providers/provider-generations.d.ts +99 -0
- package/dist/providers/provider-generations.d.ts.map +1 -0
- package/dist/providers/provider-generations.js +71 -0
- package/dist/providers/provider-generations.js.map +1 -0
- package/dist/providers/provider-queue.d.ts +62 -0
- package/dist/providers/provider-queue.d.ts.map +1 -0
- package/dist/providers/provider-queue.js +28 -0
- package/dist/providers/provider-queue.js.map +1 -0
- package/dist/providers/provider-registry.d.ts +33 -14
- package/dist/providers/provider-registry.d.ts.map +1 -1
- package/dist/providers/provider-registry.js +85 -68
- package/dist/providers/provider-registry.js.map +1 -1
- package/dist/providers/provider-request-log.d.ts +53 -0
- package/dist/providers/provider-request-log.d.ts.map +1 -0
- package/dist/providers/provider-request-log.js +168 -0
- package/dist/providers/provider-request-log.js.map +1 -0
- package/dist/providers/provider-session.d.ts +3 -0
- package/dist/providers/provider-session.d.ts.map +1 -0
- package/dist/providers/provider-session.js +10 -0
- package/dist/providers/provider-session.js.map +1 -0
- package/dist/providers/provider-transport.d.ts +11 -0
- package/dist/providers/provider-transport.d.ts.map +1 -0
- package/dist/providers/provider-transport.js +11 -0
- package/dist/providers/provider-transport.js.map +1 -0
- package/dist/providers/python-provider.d.ts +26 -13
- package/dist/providers/python-provider.d.ts.map +1 -1
- package/dist/providers/python-provider.js +204 -25
- package/dist/providers/python-provider.js.map +1 -1
- package/dist/providers/replicate-provider.d.ts +91 -8
- package/dist/providers/replicate-provider.d.ts.map +1 -1
- package/dist/providers/replicate-provider.js +823 -65
- package/dist/providers/replicate-provider.js.map +1 -1
- package/dist/providers/replicate-retry.d.ts +30 -0
- package/dist/providers/replicate-retry.d.ts.map +1 -0
- package/dist/providers/replicate-retry.js +97 -0
- package/dist/providers/replicate-retry.js.map +1 -0
- package/dist/providers/requesty-provider.d.ts +30 -0
- package/dist/providers/requesty-provider.d.ts.map +1 -0
- package/dist/providers/requesty-provider.js +87 -0
- package/dist/providers/requesty-provider.js.map +1 -0
- package/dist/providers/responses-api.d.ts +27 -0
- package/dist/providers/responses-api.d.ts.map +1 -0
- package/dist/providers/responses-api.js +297 -0
- package/dist/providers/responses-api.js.map +1 -0
- package/dist/providers/reve-provider.d.ts +46 -0
- package/dist/providers/reve-provider.d.ts.map +1 -0
- package/dist/providers/reve-provider.js +165 -0
- package/dist/providers/reve-provider.js.map +1 -0
- package/dist/providers/rodin-provider.d.ts +25 -2
- package/dist/providers/rodin-provider.d.ts.map +1 -1
- package/dist/providers/rodin-provider.js +95 -51
- package/dist/providers/rodin-provider.js.map +1 -1
- package/dist/providers/safe-url.d.ts +70 -0
- package/dist/providers/safe-url.d.ts.map +1 -0
- package/dist/providers/safe-url.js +277 -0
- package/dist/providers/safe-url.js.map +1 -0
- package/dist/providers/scripted-provider.d.ts +9 -0
- package/dist/providers/scripted-provider.d.ts.map +1 -1
- package/dist/providers/scripted-provider.js +86 -10
- package/dist/providers/scripted-provider.js.map +1 -1
- package/dist/providers/structured-output.d.ts +42 -0
- package/dist/providers/structured-output.d.ts.map +1 -0
- package/dist/providers/structured-output.js +83 -0
- package/dist/providers/structured-output.js.map +1 -0
- package/dist/providers/together-operations.d.ts +27 -0
- package/dist/providers/together-operations.d.ts.map +1 -0
- package/dist/providers/together-operations.js +95 -0
- package/dist/providers/together-operations.js.map +1 -0
- package/dist/providers/together-provider.d.ts +18 -18
- package/dist/providers/together-provider.d.ts.map +1 -1
- package/dist/providers/together-provider.js +140 -367
- package/dist/providers/together-provider.js.map +1 -1
- package/dist/providers/topaz-provider.d.ts +45 -0
- package/dist/providers/topaz-provider.d.ts.map +1 -0
- package/dist/providers/topaz-provider.js +244 -0
- package/dist/providers/topaz-provider.js.map +1 -0
- package/dist/providers/types.d.ts +641 -4
- package/dist/providers/types.d.ts.map +1 -1
- package/dist/providers/types.js +81 -1
- package/dist/providers/types.js.map +1 -1
- package/dist/providers/useapi-provider.d.ts +28 -0
- package/dist/providers/useapi-provider.d.ts.map +1 -0
- package/dist/providers/useapi-provider.js +274 -0
- package/dist/providers/useapi-provider.js.map +1 -0
- package/dist/providers/video-duration.d.ts +6 -0
- package/dist/providers/video-duration.d.ts.map +1 -0
- package/dist/providers/video-duration.js +63 -0
- package/dist/providers/video-duration.js.map +1 -0
- package/dist/providers/video-frame-fallback.d.ts +39 -0
- package/dist/providers/video-frame-fallback.d.ts.map +1 -0
- package/dist/providers/video-frame-fallback.js +155 -0
- package/dist/providers/video-frame-fallback.js.map +1 -0
- package/dist/providers/video-frames.d.ts +61 -0
- package/dist/providers/video-frames.d.ts.map +1 -0
- package/dist/providers/video-frames.js +208 -0
- package/dist/providers/video-frames.js.map +1 -0
- package/dist/providers/video-mime.d.ts +14 -0
- package/dist/providers/video-mime.d.ts.map +1 -0
- package/dist/providers/video-mime.js +44 -0
- package/dist/providers/video-mime.js.map +1 -0
- package/dist/providers/video-to-audio.d.ts +34 -0
- package/dist/providers/video-to-audio.d.ts.map +1 -0
- package/dist/providers/video-to-audio.js +62 -0
- package/dist/providers/video-to-audio.js.map +1 -0
- package/dist/providers/vllm-provider.d.ts +20 -8
- package/dist/providers/vllm-provider.d.ts.map +1 -1
- package/dist/providers/vllm-provider.js +44 -23
- package/dist/providers/vllm-provider.js.map +1 -1
- package/dist/providers/voyage-provider.d.ts +12 -3
- package/dist/providers/voyage-provider.d.ts.map +1 -1
- package/dist/providers/voyage-provider.js +21 -7
- package/dist/providers/voyage-provider.js.map +1 -1
- package/dist/providers/xai-provider.d.ts +56 -13
- package/dist/providers/xai-provider.d.ts.map +1 -1
- package/dist/providers/xai-provider.js +307 -22
- package/dist/providers/xai-provider.js.map +1 -1
- package/dist/python-bridge-base.d.ts +358 -0
- package/dist/python-bridge-base.d.ts.map +1 -0
- package/dist/python-bridge-base.js +1557 -0
- package/dist/python-bridge-base.js.map +1 -0
- package/dist/python-bridge-codec.d.ts +28 -0
- package/dist/python-bridge-codec.d.ts.map +1 -0
- package/dist/python-bridge-codec.js +39 -0
- package/dist/python-bridge-codec.js.map +1 -0
- package/dist/python-bridge-factory.d.ts +52 -0
- package/dist/python-bridge-factory.d.ts.map +1 -0
- package/dist/python-bridge-factory.js +69 -0
- package/dist/python-bridge-factory.js.map +1 -0
- package/dist/python-bridge-framing.d.ts +68 -0
- package/dist/python-bridge-framing.d.ts.map +1 -0
- package/dist/python-bridge-framing.js +91 -0
- package/dist/python-bridge-framing.js.map +1 -0
- package/dist/python-bridge-types.d.ts +545 -2
- package/dist/python-bridge-types.d.ts.map +1 -1
- package/dist/python-bridge-types.js +49 -1
- package/dist/python-bridge-types.js.map +1 -1
- package/dist/python-graph-resolver.d.ts +57 -0
- package/dist/python-graph-resolver.d.ts.map +1 -0
- package/dist/python-graph-resolver.js +79 -0
- package/dist/python-graph-resolver.js.map +1 -0
- package/dist/python-node-executor.d.ts +36 -4
- package/dist/python-node-executor.d.ts.map +1 -1
- package/dist/python-node-executor.js +177 -86
- package/dist/python-node-executor.js.map +1 -1
- package/dist/python-stdio-bridge.d.ts +18 -37
- package/dist/python-stdio-bridge.d.ts.map +1 -1
- package/dist/python-stdio-bridge.js +148 -475
- package/dist/python-stdio-bridge.js.map +1 -1
- package/dist/python-websocket-bridge.d.ts +140 -0
- package/dist/python-websocket-bridge.d.ts.map +1 -0
- package/dist/python-websocket-bridge.js +561 -0
- package/dist/python-websocket-bridge.js.map +1 -0
- package/dist/python-worker-stderr.d.ts +4 -0
- package/dist/python-worker-stderr.d.ts.map +1 -0
- package/dist/python-worker-stderr.js +24 -0
- package/dist/python-worker-stderr.js.map +1 -0
- package/dist/recommended-models.d.ts +2 -2
- package/dist/recommended-models.d.ts.map +1 -1
- package/dist/recommended-models.js +44 -4
- package/dist/recommended-models.js.map +1 -1
- package/dist/recoverable-node-error.d.ts +31 -0
- package/dist/recoverable-node-error.d.ts.map +1 -0
- package/dist/recoverable-node-error.js +37 -0
- package/dist/recoverable-node-error.js.map +1 -0
- package/dist/redact-params.d.ts +13 -0
- package/dist/redact-params.d.ts.map +1 -0
- package/dist/redact-params.js +57 -0
- package/dist/redact-params.js.map +1 -0
- package/dist/run-context.d.ts +20 -0
- package/dist/run-context.d.ts.map +1 -0
- package/dist/run-context.js +18 -0
- package/dist/run-context.js.map +1 -0
- package/dist/run-trace-context.d.ts +30 -0
- package/dist/run-trace-context.d.ts.map +1 -0
- package/dist/run-trace-context.js +80 -0
- package/dist/run-trace-context.js.map +1 -0
- package/dist/run-trace-processor.d.ts +65 -0
- package/dist/run-trace-processor.d.ts.map +1 -0
- package/dist/run-trace-processor.js +417 -0
- package/dist/run-trace-processor.js.map +1 -0
- package/dist/run-trace-serialization.d.ts +5 -0
- package/dist/run-trace-serialization.d.ts.map +1 -0
- package/dist/run-trace-serialization.js +113 -0
- package/dist/run-trace-serialization.js.map +1 -0
- package/dist/sandbox-module-catalog.d.ts +43 -0
- package/dist/sandbox-module-catalog.d.ts.map +1 -0
- package/dist/sandbox-module-catalog.js +25 -0
- package/dist/sandbox-module-catalog.js.map +1 -0
- package/dist/storage-workspace.d.ts +62 -0
- package/dist/storage-workspace.d.ts.map +1 -0
- package/dist/storage-workspace.js +441 -0
- package/dist/storage-workspace.js.map +1 -0
- package/dist/swappable-python-bridge.d.ts +83 -0
- package/dist/swappable-python-bridge.d.ts.map +1 -0
- package/dist/swappable-python-bridge.js +246 -0
- package/dist/swappable-python-bridge.js.map +1 -0
- package/dist/telemetry.d.ts +16 -3
- package/dist/telemetry.d.ts.map +1 -1
- package/dist/telemetry.js +76 -20
- package/dist/telemetry.js.map +1 -1
- package/dist/testing.d.ts +81 -0
- package/dist/testing.d.ts.map +1 -0
- package/dist/testing.js +130 -0
- package/dist/testing.js.map +1 -0
- package/dist/token-counter.d.ts +30 -0
- package/dist/token-counter.d.ts.map +1 -0
- package/dist/token-counter.js +156 -0
- package/dist/token-counter.js.map +1 -0
- package/dist/trace-exporters.d.ts +11 -28
- package/dist/trace-exporters.d.ts.map +1 -1
- package/dist/trace-exporters.js +69 -22
- package/dist/trace-exporters.js.map +1 -1
- package/dist/tracing-helpers.d.ts +60 -26
- package/dist/tracing-helpers.d.ts.map +1 -1
- package/dist/tracing-helpers.js +100 -25
- package/dist/tracing-helpers.js.map +1 -1
- package/dist/trim-video-window.d.ts +8 -0
- package/dist/trim-video-window.d.ts.map +1 -0
- package/dist/trim-video-window.js +50 -0
- package/dist/trim-video-window.js.map +1 -0
- package/dist/turn-budget.d.ts +278 -0
- package/dist/turn-budget.d.ts.map +1 -0
- package/dist/turn-budget.js +365 -0
- package/dist/turn-budget.js.map +1 -0
- package/dist/variable-channel.d.ts +48 -0
- package/dist/variable-channel.d.ts.map +1 -0
- package/dist/variable-channel.js +110 -0
- package/dist/variable-channel.js.map +1 -0
- package/dist/workspace.d.ts +119 -0
- package/dist/workspace.d.ts.map +1 -0
- package/dist/workspace.js +112 -0
- package/dist/workspace.js.map +1 -0
- package/package.json +121 -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
|
-
*
|
|
5
|
-
*
|
|
6
|
-
*
|
|
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
|
-
*
|
|
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
|
-
//
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
},
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
//
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
},
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
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"
|
|
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
|
-
//
|
|
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
|
|
289
|
-
"openai:gpt-4o-mini-tts": "
|
|
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
|
-
|
|
340
|
-
|
|
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
|
|
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
|
-
//
|
|
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
|
-
//
|
|
358
|
-
//
|
|
188
|
+
// Stryker restore all
|
|
189
|
+
// Longest-prefix match within the same provider.
|
|
359
190
|
const providerPrefix = `${providerLower}:`;
|
|
360
|
-
|
|
361
|
-
//
|
|
362
|
-
providerKeys
|
|
363
|
-
|
|
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
|
|
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
|
|
210
|
+
* @returns Cost in US dollars (0 when no price is known)
|
|
379
211
|
*/
|
|
380
212
|
static calculate(modelId, usage, provider) {
|
|
381
|
-
|
|
382
|
-
|
|
383
|
-
|
|
384
|
-
|
|
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
|
|
387
|
-
if (
|
|
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
|
-
|
|
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
|
-
*
|
|
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
|
-
|
|
405
|
-
|
|
406
|
-
|
|
407
|
-
|
|
408
|
-
|
|
409
|
-
|
|
410
|
-
|
|
411
|
-
|
|
412
|
-
|
|
413
|
-
|
|
414
|
-
|
|
415
|
-
|
|
416
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
481
|
-
|
|
482
|
-
|
|
483
|
-
|
|
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
|