@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
|
@@ -0,0 +1,132 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Turns a thrown provider error into the `provider_call_failed` message the
|
|
3
|
+
* UI reports with.
|
|
4
|
+
*
|
|
5
|
+
* A user who hits a 429 sees prose. What a maintainer needs is the provider,
|
|
6
|
+
* the model, the status, the request id and the payload that was sent — and
|
|
7
|
+
* asking the user to reconstruct that from a toast is how bug reports arrive
|
|
8
|
+
* useless. {@link buildProviderCallFailure} assembles it once, at the same
|
|
9
|
+
* place {@link logProviderRequestFailure} logs it, so every surface reports
|
|
10
|
+
* the same record.
|
|
11
|
+
*/
|
|
12
|
+
import { isObjectLike, isString } from "@nodetool-ai/protocol";
|
|
13
|
+
import { httpStatusFromError } from "./provider-error.js";
|
|
14
|
+
import { sanitizeForLog } from "./provider-request-log.js";
|
|
15
|
+
/** Strings in the reported request are capped harder than in a server log. */
|
|
16
|
+
const WIRE_SANITIZE = {
|
|
17
|
+
maxStringLength: 400,
|
|
18
|
+
maxArrayLength: 40,
|
|
19
|
+
maxDepth: 8
|
|
20
|
+
};
|
|
21
|
+
const NETWORK_CODES = new Set([
|
|
22
|
+
"ENOTFOUND",
|
|
23
|
+
"ECONNREFUSED",
|
|
24
|
+
"ECONNRESET",
|
|
25
|
+
"EAI_AGAIN",
|
|
26
|
+
"EHOSTUNREACH",
|
|
27
|
+
"ENETUNREACH",
|
|
28
|
+
"ETIMEDOUT",
|
|
29
|
+
"UND_ERR_CONNECT_TIMEOUT",
|
|
30
|
+
"CERT_HAS_EXPIRED"
|
|
31
|
+
]);
|
|
32
|
+
export function providerFailureKind(error) {
|
|
33
|
+
const status = httpStatusFromError(error);
|
|
34
|
+
if (status !== null) {
|
|
35
|
+
if (status === 401 || status === 403)
|
|
36
|
+
return "auth";
|
|
37
|
+
if (status === 402)
|
|
38
|
+
return "payment";
|
|
39
|
+
if (status === 404)
|
|
40
|
+
return "not_found";
|
|
41
|
+
if (status === 429)
|
|
42
|
+
return "rate_limit";
|
|
43
|
+
if (status === 408 || status === 504)
|
|
44
|
+
return "timeout";
|
|
45
|
+
if (status >= 500)
|
|
46
|
+
return "server";
|
|
47
|
+
if (status >= 400)
|
|
48
|
+
return "client";
|
|
49
|
+
}
|
|
50
|
+
if (!isObjectLike(error))
|
|
51
|
+
return "unknown";
|
|
52
|
+
const candidate = error;
|
|
53
|
+
const code = isString(candidate.code) ? candidate.code : "";
|
|
54
|
+
if (NETWORK_CODES.has(code))
|
|
55
|
+
return "network";
|
|
56
|
+
const name = isString(candidate.name) ? candidate.name : "";
|
|
57
|
+
if (name === "TimeoutError")
|
|
58
|
+
return "timeout";
|
|
59
|
+
const message = isString(candidate.message) ? candidate.message : "";
|
|
60
|
+
if (/fetch failed|network error|socket hang up/i.test(message)) {
|
|
61
|
+
return "network";
|
|
62
|
+
}
|
|
63
|
+
return "unknown";
|
|
64
|
+
}
|
|
65
|
+
/**
|
|
66
|
+
* Provider-side request id, under any of the names the SDKs use for it. It is
|
|
67
|
+
* what a provider's support asks for first, so it is worth digging out.
|
|
68
|
+
*/
|
|
69
|
+
export function providerRequestId(error) {
|
|
70
|
+
if (!isObjectLike(error))
|
|
71
|
+
return null;
|
|
72
|
+
const candidate = error;
|
|
73
|
+
const headers = isObjectLike(candidate.headers)
|
|
74
|
+
? candidate.headers
|
|
75
|
+
: undefined;
|
|
76
|
+
const sources = [
|
|
77
|
+
candidate.request_id,
|
|
78
|
+
candidate.requestID,
|
|
79
|
+
candidate.requestId,
|
|
80
|
+
headers?.["x-request-id"],
|
|
81
|
+
headers?.["x-amzn-requestid"],
|
|
82
|
+
headers?.["cf-ray"]
|
|
83
|
+
];
|
|
84
|
+
for (const value of sources) {
|
|
85
|
+
if (isString(value) && value.trim() !== "")
|
|
86
|
+
return value;
|
|
87
|
+
}
|
|
88
|
+
return null;
|
|
89
|
+
}
|
|
90
|
+
function errorMessage(error) {
|
|
91
|
+
return error instanceof Error ? error.message : String(error);
|
|
92
|
+
}
|
|
93
|
+
/** The message a surface reports with. `null` for a caller cancellation. */
|
|
94
|
+
export function buildProviderCallFailure(input, now = new Date()) {
|
|
95
|
+
if (isAbort(input.error))
|
|
96
|
+
return null;
|
|
97
|
+
const hasWire = input.request !== undefined && input.request !== null;
|
|
98
|
+
const payload = hasWire ? input.request : input.nodetoolArgs;
|
|
99
|
+
const status = httpStatusFromError(input.error);
|
|
100
|
+
const name = isObjectLike(input.error)
|
|
101
|
+
? input.error.name
|
|
102
|
+
: undefined;
|
|
103
|
+
return {
|
|
104
|
+
type: "provider_call_failed",
|
|
105
|
+
provider: input.provider,
|
|
106
|
+
model: input.model && input.model !== "unknown" ? input.model : null,
|
|
107
|
+
operation: input.operation,
|
|
108
|
+
kind: providerFailureKind(input.error),
|
|
109
|
+
status,
|
|
110
|
+
message: errorMessage(input.error),
|
|
111
|
+
error_name: isString(name) ? name : null,
|
|
112
|
+
request_id: providerRequestId(input.error),
|
|
113
|
+
duration_ms: input.startedAt !== undefined ? Date.now() - input.startedAt : null,
|
|
114
|
+
request_source: payload === undefined ? null : hasWire ? "wire" : "nodetool-args",
|
|
115
|
+
request: payload === undefined ? null : sanitizeForLog(payload, WIRE_SANITIZE),
|
|
116
|
+
// Left null: the relay stamps the run onto every outbound message, and a
|
|
117
|
+
// provider has no idea which workflow or job called it.
|
|
118
|
+
workflow_id: null,
|
|
119
|
+
job_id: null,
|
|
120
|
+
timestamp: now.toISOString()
|
|
121
|
+
};
|
|
122
|
+
}
|
|
123
|
+
/** A cancelled call is not a failure to report. */
|
|
124
|
+
function isAbort(error) {
|
|
125
|
+
if (!isObjectLike(error))
|
|
126
|
+
return false;
|
|
127
|
+
const candidate = error;
|
|
128
|
+
if (isString(candidate.name) && /abort/i.test(candidate.name))
|
|
129
|
+
return true;
|
|
130
|
+
return candidate.code === 20 || candidate.code === "ABORT_ERR";
|
|
131
|
+
}
|
|
132
|
+
//# sourceMappingURL=provider-call-failure.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"provider-call-failure.js","sourceRoot":"","sources":["../../src/providers/provider-call-failure.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Actionable text for opaque provider failures.
|
|
3
|
+
*
|
|
4
|
+
* Providers surface upstream HTTP errors verbatim — `403 Your request was
|
|
5
|
+
* blocked.`, `401 Incorrect API key provided`, `fetch failed` — which reaches
|
|
6
|
+
* the user as a node error with no hint of which provider failed or what to do
|
|
7
|
+
* about it. {@link annotateProviderError} appends the provider, the model, and
|
|
8
|
+
* a short remedy for the status class, leaving the original text at the front
|
|
9
|
+
* so existing message matching (rate limit, context length) still works.
|
|
10
|
+
*/
|
|
11
|
+
/**
|
|
12
|
+
* Machine-readable companion to the prose hint. Surfaces that want to *act* on
|
|
13
|
+
* a failure — reopen provider onboarding on the failing key, say — read this
|
|
14
|
+
* instead of matching the message text.
|
|
15
|
+
*/
|
|
16
|
+
export interface ProviderFailureDetail {
|
|
17
|
+
/**
|
|
18
|
+
* `provider_auth`: the credential was refused. `context_exceeded`: the
|
|
19
|
+
* request did not fit the model's context window, which a caller holding the
|
|
20
|
+
* transcript can answer by shortening it and retrying.
|
|
21
|
+
*/
|
|
22
|
+
code: "provider_auth" | "context_exceeded";
|
|
23
|
+
/** Provider id as the runtime knows it (e.g. `openai`). */
|
|
24
|
+
provider: string;
|
|
25
|
+
/** Secret key holding that provider's credential, when one is registered. */
|
|
26
|
+
secretKey: string | null;
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* The structured detail {@link annotateProviderError} attached, or null when
|
|
30
|
+
* the error is not a credential failure.
|
|
31
|
+
*/
|
|
32
|
+
export declare function providerFailureDetail(error: unknown): ProviderFailureDetail | null;
|
|
33
|
+
/**
|
|
34
|
+
* Tag `error` as the provider refusing a request larger than the model's
|
|
35
|
+
* context window. Kept apart from {@link annotateProviderError}: the prose hint
|
|
36
|
+
* is written from an HTTP status, while this classification comes from the
|
|
37
|
+
* provider's own overflow signal.
|
|
38
|
+
*/
|
|
39
|
+
export declare function markContextExceeded<TError>(error: TError, provider: string): TError;
|
|
40
|
+
/**
|
|
41
|
+
* HTTP status carried by a provider error: a `status`/`statusCode` field when
|
|
42
|
+
* the provider throws a typed error, otherwise a status token at the start of
|
|
43
|
+
* the message (`"403 Your request was blocked."`, the shape both the `openai`
|
|
44
|
+
* SDK and {@link OpenAICompatError} use) or after an explicit `status`/`HTTP`
|
|
45
|
+
* marker. Bare three-digit numbers elsewhere in the message are ignored — they
|
|
46
|
+
* are far more often model ids or token counts than statuses.
|
|
47
|
+
*/
|
|
48
|
+
export declare function httpStatusFromError(error: unknown): number | null;
|
|
49
|
+
/**
|
|
50
|
+
* Append provider context and a remedy to a provider failure, in place. The
|
|
51
|
+
* original message is kept as the prefix, and the error object (class, status,
|
|
52
|
+
* stack) is left intact. Aborts and already-annotated errors pass through
|
|
53
|
+
* untouched. Returns the same error so callers can `throw annotateProviderError(...)`.
|
|
54
|
+
*/
|
|
55
|
+
export declare function annotateProviderError<TError>(error: TError, context: {
|
|
56
|
+
provider: string;
|
|
57
|
+
model?: string;
|
|
58
|
+
}): TError;
|
|
59
|
+
//# sourceMappingURL=provider-error.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"provider-error.d.ts","sourceRoot":"","sources":["../../src/providers/provider-error.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAaH;;;;GAIG;AACH,MAAM,WAAW,qBAAqB;IACpC;;;;OAIG;IACH,IAAI,EAAE,eAAe,GAAG,kBAAkB,CAAC;IAC3C,2DAA2D;IAC3D,QAAQ,EAAE,MAAM,CAAC;IACjB,6EAA6E;IAC7E,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;CAC1B;AAgBD;;;GAGG;AACH,wBAAgB,qBAAqB,CACnC,KAAK,EAAE,OAAO,GACb,qBAAqB,GAAG,IAAI,CAG9B;AAED;;;;;GAKG;AACH,wBAAgB,mBAAmB,CAAC,MAAM,EACxC,KAAK,EAAE,MAAM,EACb,QAAQ,EAAE,MAAM,GACf,MAAM,CAQR;AAQD;;;;;;;GAOG;AACH,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,GAAG,IAAI,CAgBjE;AA6ED;;;;;GAKG;AACH,wBAAgB,qBAAqB,CAAC,MAAM,EAC1C,KAAK,EAAE,MAAM,EACb,OAAO,EAAE;IAAE,QAAQ,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,GAC5C,MAAM,CA4BR"}
|
|
@@ -0,0 +1,171 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Actionable text for opaque provider failures.
|
|
3
|
+
*
|
|
4
|
+
* Providers surface upstream HTTP errors verbatim — `403 Your request was
|
|
5
|
+
* blocked.`, `401 Incorrect API key provided`, `fetch failed` — which reaches
|
|
6
|
+
* the user as a node error with no hint of which provider failed or what to do
|
|
7
|
+
* about it. {@link annotateProviderError} appends the provider, the model, and
|
|
8
|
+
* a short remedy for the status class, leaving the original text at the front
|
|
9
|
+
* so existing message matching (rate limit, context length) still works.
|
|
10
|
+
*/
|
|
11
|
+
import { getProviderSecretKey } from "./provider-registry.js";
|
|
12
|
+
import { PROVIDER_IDS, isNumber, isObjectLike, isString } from "@nodetool-ai/protocol";
|
|
13
|
+
/** Marks an error already annotated, so nested wrappers don't stack hints. */
|
|
14
|
+
const ANNOTATED = Symbol.for("nodetool.provider.errorAnnotated");
|
|
15
|
+
/** Field carrying {@link ProviderFailureDetail} on an annotated error. */
|
|
16
|
+
const FAILURE_DETAIL = Symbol.for("nodetool.provider.failureDetail");
|
|
17
|
+
/**
|
|
18
|
+
* The structured detail {@link annotateProviderError} attached, or null when
|
|
19
|
+
* the error is not a credential failure.
|
|
20
|
+
*/
|
|
21
|
+
export function providerFailureDetail(error) {
|
|
22
|
+
if (!isObjectLike(error))
|
|
23
|
+
return null;
|
|
24
|
+
return error[FAILURE_DETAIL] ?? null;
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* Tag `error` as the provider refusing a request larger than the model's
|
|
28
|
+
* context window. Kept apart from {@link annotateProviderError}: the prose hint
|
|
29
|
+
* is written from an HTTP status, while this classification comes from the
|
|
30
|
+
* provider's own overflow signal.
|
|
31
|
+
*/
|
|
32
|
+
export function markContextExceeded(error, provider) {
|
|
33
|
+
if (!(error instanceof Error))
|
|
34
|
+
return error;
|
|
35
|
+
error[FAILURE_DETAIL] = {
|
|
36
|
+
code: "context_exceeded",
|
|
37
|
+
provider,
|
|
38
|
+
secretKey: null
|
|
39
|
+
};
|
|
40
|
+
return error;
|
|
41
|
+
}
|
|
42
|
+
function numericStatus(value) {
|
|
43
|
+
const status = isString(value) ? Number(value) : value;
|
|
44
|
+
if (!isNumber(status) || !Number.isInteger(status))
|
|
45
|
+
return null;
|
|
46
|
+
return status >= 100 && status <= 599 ? status : null;
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* HTTP status carried by a provider error: a `status`/`statusCode` field when
|
|
50
|
+
* the provider throws a typed error, otherwise a status token at the start of
|
|
51
|
+
* the message (`"403 Your request was blocked."`, the shape both the `openai`
|
|
52
|
+
* SDK and {@link OpenAICompatError} use) or after an explicit `status`/`HTTP`
|
|
53
|
+
* marker. Bare three-digit numbers elsewhere in the message are ignored — they
|
|
54
|
+
* are far more often model ids or token counts than statuses.
|
|
55
|
+
*/
|
|
56
|
+
export function httpStatusFromError(error) {
|
|
57
|
+
if (!isObjectLike(error))
|
|
58
|
+
return null;
|
|
59
|
+
const candidate = error;
|
|
60
|
+
const direct = numericStatus(candidate.status) ??
|
|
61
|
+
numericStatus(candidate.statusCode) ??
|
|
62
|
+
numericStatus(candidate.response?.status);
|
|
63
|
+
if (direct !== null)
|
|
64
|
+
return direct;
|
|
65
|
+
const message = isString(candidate.message) ? candidate.message : "";
|
|
66
|
+
const leading = message.match(/^\s*(\d{3})\b/);
|
|
67
|
+
if (leading)
|
|
68
|
+
return numericStatus(leading[1]);
|
|
69
|
+
const labelled = message.match(/\b(?:status|http|status code)[:\s]+(\d{3})\b/i);
|
|
70
|
+
return labelled ? numericStatus(labelled[1]) : null;
|
|
71
|
+
}
|
|
72
|
+
function isAbort(error) {
|
|
73
|
+
const name = isString(error.name) ? error.name : "";
|
|
74
|
+
if (name === "AbortError" || name === "TimeoutError")
|
|
75
|
+
return true;
|
|
76
|
+
const code = isString(error.code) ? error.code : "";
|
|
77
|
+
return code === "ABORT_ERR";
|
|
78
|
+
}
|
|
79
|
+
const NETWORK_CODES = new Set([
|
|
80
|
+
"ENOTFOUND",
|
|
81
|
+
"ECONNREFUSED",
|
|
82
|
+
"ECONNRESET",
|
|
83
|
+
"EAI_AGAIN",
|
|
84
|
+
"EHOSTUNREACH",
|
|
85
|
+
"ENETUNREACH",
|
|
86
|
+
"ETIMEDOUT",
|
|
87
|
+
"UND_ERR_CONNECT_TIMEOUT",
|
|
88
|
+
"CERT_HAS_EXPIRED"
|
|
89
|
+
]);
|
|
90
|
+
function isNetworkFailure(error) {
|
|
91
|
+
const code = isString(error.code) ? error.code : "";
|
|
92
|
+
if (NETWORK_CODES.has(code))
|
|
93
|
+
return true;
|
|
94
|
+
const message = isString(error.message) ? error.message : "";
|
|
95
|
+
return /fetch failed|network error|socket hang up/i.test(message);
|
|
96
|
+
}
|
|
97
|
+
/** Remedy for one status class, or null when the status needs no advice. */
|
|
98
|
+
function hintForStatus(status, provider, model) {
|
|
99
|
+
const target = model ? `${provider}/${model}` : provider;
|
|
100
|
+
switch (status) {
|
|
101
|
+
case 401:
|
|
102
|
+
if (provider === PROVIDER_IDS.CODEX) {
|
|
103
|
+
return `${target} rejected the ChatGPT sign-in (401). The sign-in expired: sign in to Codex again in Settings → Models & Providers.`;
|
|
104
|
+
}
|
|
105
|
+
if (provider === PROVIDER_IDS.CLAUDE_AGENT_SDK) {
|
|
106
|
+
return `${target} rejected the Claude sign-in (401). The sign-in expired: sign in to Claude again in Settings → Models & Providers.`;
|
|
107
|
+
}
|
|
108
|
+
return `${target} rejected the credentials (401). Add or update the API key for ${provider} in Settings → Models & Providers.`;
|
|
109
|
+
case 403:
|
|
110
|
+
return `${target} refused the request (403). The API key may be missing access to this model, restricted to certain referrers or IPs, or blocked in your region — check it in Settings → Models & Providers.`;
|
|
111
|
+
case 402:
|
|
112
|
+
return `${target} reports the account is out of credit (402). Top up or check billing with ${provider}.`;
|
|
113
|
+
case 404:
|
|
114
|
+
return `${target} does not expose this model (404). Pick another model, or check that your ${provider} account has access to it.`;
|
|
115
|
+
case 429:
|
|
116
|
+
return `${target} is rate limiting or out of quota (429). Wait and retry, or check your ${provider} plan limits.`;
|
|
117
|
+
case 408:
|
|
118
|
+
case 504:
|
|
119
|
+
return `${target} timed out (${status}). Retry, or lower the request size.`;
|
|
120
|
+
default:
|
|
121
|
+
if (status >= 500) {
|
|
122
|
+
return `${target} is failing on its side (${status}). Retry in a moment; if it persists, check the ${provider} status page.`;
|
|
123
|
+
}
|
|
124
|
+
return null;
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
function hintFor(error, provider, model) {
|
|
128
|
+
const status = httpStatusFromError(error);
|
|
129
|
+
if (status !== null)
|
|
130
|
+
return hintForStatus(status, provider, model);
|
|
131
|
+
if (isNetworkFailure(error)) {
|
|
132
|
+
const target = model ? `${provider}/${model}` : provider;
|
|
133
|
+
return `Could not reach ${target}. Check your internet connection, proxy settings, and — for local providers — that the server is running.`;
|
|
134
|
+
}
|
|
135
|
+
return null;
|
|
136
|
+
}
|
|
137
|
+
/**
|
|
138
|
+
* Append provider context and a remedy to a provider failure, in place. The
|
|
139
|
+
* original message is kept as the prefix, and the error object (class, status,
|
|
140
|
+
* stack) is left intact. Aborts and already-annotated errors pass through
|
|
141
|
+
* untouched. Returns the same error so callers can `throw annotateProviderError(...)`.
|
|
142
|
+
*/
|
|
143
|
+
export function annotateProviderError(error, context) {
|
|
144
|
+
if (!(error instanceof Error))
|
|
145
|
+
return error;
|
|
146
|
+
const candidate = error;
|
|
147
|
+
if (candidate[ANNOTATED] || isAbort(candidate))
|
|
148
|
+
return error;
|
|
149
|
+
// "unknown" is the modality wrappers' placeholder when the params carry no
|
|
150
|
+
// model id; naming it would read as a model called "unknown".
|
|
151
|
+
const model = context.model && context.model !== "unknown" ? context.model : "";
|
|
152
|
+
const hint = hintFor(candidate, context.provider, model);
|
|
153
|
+
if (!hint)
|
|
154
|
+
return error;
|
|
155
|
+
// 401/403 both mean "the credential didn't work" as far as a user is
|
|
156
|
+
// concerned — one is rejected, the other refused — and both are fixed on the
|
|
157
|
+
// same screen, so both carry the structured detail.
|
|
158
|
+
const status = httpStatusFromError(candidate);
|
|
159
|
+
if (status === 401 || status === 403) {
|
|
160
|
+
candidate[FAILURE_DETAIL] = {
|
|
161
|
+
code: "provider_auth",
|
|
162
|
+
provider: context.provider,
|
|
163
|
+
secretKey: getProviderSecretKey(context.provider)
|
|
164
|
+
};
|
|
165
|
+
}
|
|
166
|
+
candidate[ANNOTATED] = true;
|
|
167
|
+
const original = candidate.message.trim();
|
|
168
|
+
candidate.message = original ? `${original} — ${hint}` : hint;
|
|
169
|
+
return error;
|
|
170
|
+
}
|
|
171
|
+
//# sourceMappingURL=provider-error.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"provider-error.js","sourceRoot":"","sources":["../../src/providers/provider-error.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The provider-side generation record: what a provider itself knows about the
|
|
3
|
+
* media calls an account made, read back from the provider's own API.
|
|
4
|
+
*
|
|
5
|
+
* NodeTool keeps its own record of every generation this installation ran —
|
|
6
|
+
* the `predictions` table behind `nodetool generations`
|
|
7
|
+
* (docs/media-generation-tracking-design.md). That record is local: it cannot
|
|
8
|
+
* see a generation made from another machine, from the provider's own web UI,
|
|
9
|
+
* or from a run whose row was lost, and it carries an estimate until a
|
|
10
|
+
* reconciler replaces it with the billed amount.
|
|
11
|
+
*
|
|
12
|
+
* A provider that keeps its own request history can answer for all of those.
|
|
13
|
+
* {@link BaseProvider.listGenerations} and {@link BaseProvider.getGeneration}
|
|
14
|
+
* are where that history is exposed, in one shape across providers, so a
|
|
15
|
+
* caller reconciling spend or hunting a lost asset does not write a client per
|
|
16
|
+
* provider. A provider without such an API keeps the base methods and throws
|
|
17
|
+
* {@link ProviderGenerationsUnsupportedError}, which is a capability answer,
|
|
18
|
+
* not a failure: only the providers that implement them declare
|
|
19
|
+
* `list_generations` and `get_generation`.
|
|
20
|
+
*/
|
|
21
|
+
import type { ProviderId } from "./types.js";
|
|
22
|
+
/**
|
|
23
|
+
* A generation's state at the provider. `unknown` is its own answer: a record
|
|
24
|
+
* derived from a billing event says a call was charged without saying how it
|
|
25
|
+
* ended, and reporting that as `completed` would invent an outcome.
|
|
26
|
+
*/
|
|
27
|
+
export type ProviderGenerationStatus = "running" | "completed" | "failed" | "cancelled" | "unknown";
|
|
28
|
+
/** One provider-side generation, in the shape every provider answers with. */
|
|
29
|
+
export interface ProviderGeneration {
|
|
30
|
+
provider: ProviderId;
|
|
31
|
+
/** The provider's own request id — what `provider_request_id` holds locally. */
|
|
32
|
+
request_id: string;
|
|
33
|
+
/** The endpoint or model that ran, when the provider names one. */
|
|
34
|
+
model: string | null;
|
|
35
|
+
status: ProviderGenerationStatus;
|
|
36
|
+
/** ISO timestamps, as the provider reports them. */
|
|
37
|
+
created_at: string | null;
|
|
38
|
+
completed_at: string | null;
|
|
39
|
+
duration_seconds: number | null;
|
|
40
|
+
/** What the provider billed, not an estimate. Null when it does not say. */
|
|
41
|
+
cost: number | null;
|
|
42
|
+
currency: string | null;
|
|
43
|
+
quantity: number | null;
|
|
44
|
+
unit_price: number | null;
|
|
45
|
+
/** Output media the provider still hosts. Empty when it reports none. */
|
|
46
|
+
output_urls: string[];
|
|
47
|
+
/** The generation's own failure, when the provider reports one. */
|
|
48
|
+
error: string | null;
|
|
49
|
+
}
|
|
50
|
+
/** Filters a provider listing understands. Every field is optional. */
|
|
51
|
+
export interface ProviderGenerationQuery {
|
|
52
|
+
/** Endpoint / model ids to list, when the provider filters by them. */
|
|
53
|
+
model?: string | readonly string[];
|
|
54
|
+
status?: ProviderGenerationStatus;
|
|
55
|
+
/** ISO timestamp; generations started before it are left out. */
|
|
56
|
+
since?: string;
|
|
57
|
+
/** ISO timestamp, exclusive upper bound. */
|
|
58
|
+
until?: string;
|
|
59
|
+
limit?: number;
|
|
60
|
+
/** The `next_cursor` of a previous page. */
|
|
61
|
+
cursor?: string | null;
|
|
62
|
+
signal?: AbortSignal;
|
|
63
|
+
}
|
|
64
|
+
export interface ProviderGenerationPage {
|
|
65
|
+
generations: ProviderGeneration[];
|
|
66
|
+
next_cursor: string | null;
|
|
67
|
+
/**
|
|
68
|
+
* What this page could not answer — a provider whose listing carries cost
|
|
69
|
+
* but not outcome says so here rather than guessing a status.
|
|
70
|
+
*/
|
|
71
|
+
note: string | null;
|
|
72
|
+
}
|
|
73
|
+
/** What a single-generation lookup can be told besides the request id. */
|
|
74
|
+
export interface ProviderGenerationLookup {
|
|
75
|
+
/** The endpoint / model id, when the caller knows it. Narrows the query. */
|
|
76
|
+
model?: string;
|
|
77
|
+
signal?: AbortSignal;
|
|
78
|
+
}
|
|
79
|
+
/** Raised by the base methods: this provider exposes no generation history. */
|
|
80
|
+
export declare class ProviderGenerationsUnsupportedError extends Error {
|
|
81
|
+
readonly provider: string;
|
|
82
|
+
readonly operation: "list" | "get";
|
|
83
|
+
constructor(provider: string, operation: "list" | "get");
|
|
84
|
+
}
|
|
85
|
+
/** Whether a thrown value is the "no generation history here" answer. */
|
|
86
|
+
export declare function isProviderGenerationsUnsupported(error: unknown): error is ProviderGenerationsUnsupportedError;
|
|
87
|
+
/**
|
|
88
|
+
* A generation record with every field present, so each provider's mapper
|
|
89
|
+
* fills in only what its API reports and nothing is silently absent.
|
|
90
|
+
*/
|
|
91
|
+
export declare function providerGeneration(fields: Partial<ProviderGeneration> & {
|
|
92
|
+
provider: ProviderId;
|
|
93
|
+
request_id: string;
|
|
94
|
+
}): ProviderGeneration;
|
|
95
|
+
/** Bound a caller's page size to what a provider's API accepts. */
|
|
96
|
+
export declare function boundedLimit(limit: number | undefined, fallback: number, max: number): number;
|
|
97
|
+
/** The `model` filter as a list, whichever form the caller passed. */
|
|
98
|
+
export declare function modelFilter(model: string | readonly string[] | undefined): string[];
|
|
99
|
+
//# sourceMappingURL=provider-generations.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"provider-generations.d.ts","sourceRoot":"","sources":["../../src/providers/provider-generations.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AAEH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAE7C;;;;GAIG;AACH,MAAM,MAAM,wBAAwB,GAChC,SAAS,GACT,WAAW,GACX,QAAQ,GACR,WAAW,GACX,SAAS,CAAC;AAEd,8EAA8E;AAC9E,MAAM,WAAW,kBAAkB;IACjC,QAAQ,EAAE,UAAU,CAAC;IACrB,gFAAgF;IAChF,UAAU,EAAE,MAAM,CAAC;IACnB,mEAAmE;IACnE,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,MAAM,EAAE,wBAAwB,CAAC;IACjC,oDAAoD;IACpD,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,gBAAgB,EAAE,MAAM,GAAG,IAAI,CAAC;IAChC,4EAA4E;IAC5E,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IACpB,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,yEAAyE;IACzE,WAAW,EAAE,MAAM,EAAE,CAAC;IACtB,mEAAmE;IACnE,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;CACtB;AAED,uEAAuE;AACvE,MAAM,WAAW,uBAAuB;IACtC,uEAAuE;IACvE,KAAK,CAAC,EAAE,MAAM,GAAG,SAAS,MAAM,EAAE,CAAC;IACnC,MAAM,CAAC,EAAE,wBAAwB,CAAC;IAClC,iEAAiE;IACjE,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,4CAA4C;IAC5C,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,4CAA4C;IAC5C,MAAM,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,MAAM,CAAC,EAAE,WAAW,CAAC;CACtB;AAED,MAAM,WAAW,sBAAsB;IACrC,WAAW,EAAE,kBAAkB,EAAE,CAAC;IAClC,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B;;;OAGG;IACH,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;CACrB;AAED,0EAA0E;AAC1E,MAAM,WAAW,wBAAwB;IACvC,4EAA4E;IAC5E,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,WAAW,CAAC;CACtB;AAED,+EAA+E;AAC/E,qBAAa,mCAAoC,SAAQ,KAAK;IAC5D,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,SAAS,EAAE,MAAM,GAAG,KAAK,CAAC;IAEnC,YAAY,QAAQ,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,KAAK,EAQtD;CACF;AAED,yEAAyE;AACzE,wBAAgB,gCAAgC,CAC9C,KAAK,EAAE,OAAO,GACb,KAAK,IAAI,mCAAmC,CAE9C;AAED;;;GAGG;AACH,wBAAgB,kBAAkB,CAChC,MAAM,EAAE,OAAO,CAAC,kBAAkB,CAAC,GAAG;IACpC,QAAQ,EAAE,UAAU,CAAC;IACrB,UAAU,EAAE,MAAM,CAAC;CACpB,GACA,kBAAkB,CAgBpB;AAED,mEAAmE;AACnE,wBAAgB,YAAY,CAC1B,KAAK,EAAE,MAAM,GAAG,SAAS,EACzB,QAAQ,EAAE,MAAM,EAChB,GAAG,EAAE,MAAM,GACV,MAAM,CAGR;AAED,sEAAsE;AACtE,wBAAgB,WAAW,CACzB,KAAK,EAAE,MAAM,GAAG,SAAS,MAAM,EAAE,GAAG,SAAS,GAC5C,MAAM,EAAE,CAIV"}
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The provider-side generation record: what a provider itself knows about the
|
|
3
|
+
* media calls an account made, read back from the provider's own API.
|
|
4
|
+
*
|
|
5
|
+
* NodeTool keeps its own record of every generation this installation ran —
|
|
6
|
+
* the `predictions` table behind `nodetool generations`
|
|
7
|
+
* (docs/media-generation-tracking-design.md). That record is local: it cannot
|
|
8
|
+
* see a generation made from another machine, from the provider's own web UI,
|
|
9
|
+
* or from a run whose row was lost, and it carries an estimate until a
|
|
10
|
+
* reconciler replaces it with the billed amount.
|
|
11
|
+
*
|
|
12
|
+
* A provider that keeps its own request history can answer for all of those.
|
|
13
|
+
* {@link BaseProvider.listGenerations} and {@link BaseProvider.getGeneration}
|
|
14
|
+
* are where that history is exposed, in one shape across providers, so a
|
|
15
|
+
* caller reconciling spend or hunting a lost asset does not write a client per
|
|
16
|
+
* provider. A provider without such an API keeps the base methods and throws
|
|
17
|
+
* {@link ProviderGenerationsUnsupportedError}, which is a capability answer,
|
|
18
|
+
* not a failure: only the providers that implement them declare
|
|
19
|
+
* `list_generations` and `get_generation`.
|
|
20
|
+
*/
|
|
21
|
+
/** Raised by the base methods: this provider exposes no generation history. */
|
|
22
|
+
export class ProviderGenerationsUnsupportedError extends Error {
|
|
23
|
+
provider;
|
|
24
|
+
operation;
|
|
25
|
+
constructor(provider, operation) {
|
|
26
|
+
super(`${provider} does not expose provider-side generations (${operation}). ` +
|
|
27
|
+
`Read the local record with the generations capabilities instead.`);
|
|
28
|
+
this.name = "ProviderGenerationsUnsupportedError";
|
|
29
|
+
this.provider = provider;
|
|
30
|
+
this.operation = operation;
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
/** Whether a thrown value is the "no generation history here" answer. */
|
|
34
|
+
export function isProviderGenerationsUnsupported(error) {
|
|
35
|
+
return error instanceof ProviderGenerationsUnsupportedError;
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* A generation record with every field present, so each provider's mapper
|
|
39
|
+
* fills in only what its API reports and nothing is silently absent.
|
|
40
|
+
*/
|
|
41
|
+
export function providerGeneration(fields) {
|
|
42
|
+
return {
|
|
43
|
+
provider: fields.provider,
|
|
44
|
+
request_id: fields.request_id,
|
|
45
|
+
model: fields.model ?? null,
|
|
46
|
+
status: fields.status ?? "unknown",
|
|
47
|
+
created_at: fields.created_at ?? null,
|
|
48
|
+
completed_at: fields.completed_at ?? null,
|
|
49
|
+
duration_seconds: fields.duration_seconds ?? null,
|
|
50
|
+
cost: fields.cost ?? null,
|
|
51
|
+
currency: fields.currency ?? null,
|
|
52
|
+
quantity: fields.quantity ?? null,
|
|
53
|
+
unit_price: fields.unit_price ?? null,
|
|
54
|
+
output_urls: fields.output_urls ?? [],
|
|
55
|
+
error: fields.error ?? null
|
|
56
|
+
};
|
|
57
|
+
}
|
|
58
|
+
/** Bound a caller's page size to what a provider's API accepts. */
|
|
59
|
+
export function boundedLimit(limit, fallback, max) {
|
|
60
|
+
if (limit === undefined || !Number.isFinite(limit))
|
|
61
|
+
return fallback;
|
|
62
|
+
return Math.min(Math.max(1, Math.floor(limit)), max);
|
|
63
|
+
}
|
|
64
|
+
/** The `model` filter as a list, whichever form the caller passed. */
|
|
65
|
+
export function modelFilter(model) {
|
|
66
|
+
if (model === undefined)
|
|
67
|
+
return [];
|
|
68
|
+
const list = Array.isArray(model) ? [...model] : [String(model)];
|
|
69
|
+
return list.filter((id) => id.length > 0);
|
|
70
|
+
}
|
|
71
|
+
//# sourceMappingURL=provider-generations.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"provider-generations.js","sourceRoot":"","sources":["../../src/providers/provider-generations.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AAuEH,+EAA+E;AAC/E,MAAM,OAAO,mCAAoC,SAAQ,KAAK;IACnD,QAAQ,CAAS;IACjB,SAAS,CAAiB;IAEnC,YAAY,QAAgB,EAAE,SAAyB;QACrD,KAAK,CACH,GAAG,QAAQ,+CAA+C,SAAS,KAAK;YACtE,kEAAkE,CACrE,CAAC;QACF,IAAI,CAAC,IAAI,GAAG,qCAAqC,CAAC;QAClD,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAC;QACzB,IAAI,CAAC,SAAS,GAAG,SAAS,CAAC;IAC7B,CAAC;CACF;AAED,yEAAyE;AACzE,MAAM,UAAU,gCAAgC,CAC9C,KAAc;IAEd,OAAO,KAAK,YAAY,mCAAmC,CAAC;AAC9D,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,kBAAkB,CAChC,MAGC;IAED,OAAO;QACL,QAAQ,EAAE,MAAM,CAAC,QAAQ;QACzB,UAAU,EAAE,MAAM,CAAC,UAAU;QAC7B,KAAK,EAAE,MAAM,CAAC,KAAK,IAAI,IAAI;QAC3B,MAAM,EAAE,MAAM,CAAC,MAAM,IAAI,SAAS;QAClC,UAAU,EAAE,MAAM,CAAC,UAAU,IAAI,IAAI;QACrC,YAAY,EAAE,MAAM,CAAC,YAAY,IAAI,IAAI;QACzC,gBAAgB,EAAE,MAAM,CAAC,gBAAgB,IAAI,IAAI;QACjD,IAAI,EAAE,MAAM,CAAC,IAAI,IAAI,IAAI;QACzB,QAAQ,EAAE,MAAM,CAAC,QAAQ,IAAI,IAAI;QACjC,QAAQ,EAAE,MAAM,CAAC,QAAQ,IAAI,IAAI;QACjC,UAAU,EAAE,MAAM,CAAC,UAAU,IAAI,IAAI;QACrC,WAAW,EAAE,MAAM,CAAC,WAAW,IAAI,EAAE;QACrC,KAAK,EAAE,MAAM,CAAC,KAAK,IAAI,IAAI;KAC5B,CAAC;AACJ,CAAC;AAED,mEAAmE;AACnE,MAAM,UAAU,YAAY,CAC1B,KAAyB,EACzB,QAAgB,EAChB,GAAW;IAEX,IAAI,KAAK,KAAK,SAAS,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC;QAAE,OAAO,QAAQ,CAAC;IACpE,OAAO,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;AACvD,CAAC;AAED,sEAAsE;AACtE,MAAM,UAAU,WAAW,CACzB,KAA6C;IAE7C,IAAI,KAAK,KAAK,SAAS;QAAE,OAAO,EAAE,CAAC;IACnC,MAAM,IAAI,GAAG,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;IACjE,OAAO,IAAI,CAAC,MAAM,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;AAC5C,CAAC"}
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Provider-neutral contracts for queue-backed generation adapters.
|
|
3
|
+
*
|
|
4
|
+
* The runtime deliberately owns no persistence or generation lifecycle here.
|
|
5
|
+
* Hosts can bind the returned submission to their durable attempt before
|
|
6
|
+
* waiting, while provider adapters remain responsible for transport only.
|
|
7
|
+
*/
|
|
8
|
+
export interface ProviderQueueSubmission {
|
|
9
|
+
readonly provider: string;
|
|
10
|
+
readonly endpoint: string;
|
|
11
|
+
readonly providerRequestId: string;
|
|
12
|
+
readonly statusLocator?: string;
|
|
13
|
+
readonly resultLocator?: string;
|
|
14
|
+
readonly cancelLocator?: string;
|
|
15
|
+
}
|
|
16
|
+
export interface ProviderQueueBinding extends ProviderQueueSubmission {
|
|
17
|
+
/** The exact endpoint and request id that were persisted by the host. */
|
|
18
|
+
readonly bound: true;
|
|
19
|
+
}
|
|
20
|
+
export type ProviderQueueState = "queued" | "running" | "succeeded" | "failed" | "cancelled";
|
|
21
|
+
export interface ProviderQueueObservation<TResult = unknown> {
|
|
22
|
+
readonly provider: string;
|
|
23
|
+
readonly endpoint: string;
|
|
24
|
+
readonly providerRequestId: string;
|
|
25
|
+
readonly state: ProviderQueueState;
|
|
26
|
+
readonly result?: TResult;
|
|
27
|
+
readonly error?: unknown;
|
|
28
|
+
readonly rawStatus?: unknown;
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* A provider has returned an explicit terminal observation. Transport errors,
|
|
32
|
+
* poll timeouts, and local decode/storage failures must not be represented by
|
|
33
|
+
* this error because they leave the durable attempt recoverable.
|
|
34
|
+
*/
|
|
35
|
+
export declare class ProviderQueueTerminalError extends Error {
|
|
36
|
+
readonly provider: string;
|
|
37
|
+
readonly providerRequestId: string;
|
|
38
|
+
readonly state: Extract<ProviderQueueState, "failed" | "cancelled">;
|
|
39
|
+
readonly observation?: ProviderQueueObservation | undefined;
|
|
40
|
+
readonly authoritativeProviderTerminal: true;
|
|
41
|
+
constructor(provider: string, providerRequestId: string, state: Extract<ProviderQueueState, "failed" | "cancelled">, observation?: ProviderQueueObservation | undefined);
|
|
42
|
+
}
|
|
43
|
+
export interface ProviderQueueWaitOptions {
|
|
44
|
+
readonly signal?: AbortSignal;
|
|
45
|
+
readonly onUpdate?: (observation: ProviderQueueObservation) => void;
|
|
46
|
+
readonly pollIntervalMs?: number;
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* A small adapter surface that can be backed by an ephemeral host today and
|
|
50
|
+
* a durable generation worker later. `bind` is intentionally explicit even
|
|
51
|
+
* when the provider returns its id in the submit response.
|
|
52
|
+
*/
|
|
53
|
+
export interface ProviderQueueAdapter<TInput = unknown, TResult = unknown> {
|
|
54
|
+
readonly provider: string;
|
|
55
|
+
submit(input: TInput): Promise<ProviderQueueSubmission>;
|
|
56
|
+
bind(submission: ProviderQueueSubmission): Promise<ProviderQueueBinding>;
|
|
57
|
+
wait(binding: ProviderQueueBinding, options?: ProviderQueueWaitOptions): Promise<ProviderQueueObservation<TResult>>;
|
|
58
|
+
cancel(binding: ProviderQueueBinding, options?: {
|
|
59
|
+
readonly signal?: AbortSignal;
|
|
60
|
+
}): Promise<void>;
|
|
61
|
+
}
|
|
62
|
+
//# sourceMappingURL=provider-queue.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"provider-queue.d.ts","sourceRoot":"","sources":["../../src/providers/provider-queue.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,MAAM,WAAW,uBAAuB;IACtC,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,iBAAiB,EAAE,MAAM,CAAC;IACnC,QAAQ,CAAC,aAAa,CAAC,EAAE,MAAM,CAAC;IAChC,QAAQ,CAAC,aAAa,CAAC,EAAE,MAAM,CAAC;IAChC,QAAQ,CAAC,aAAa,CAAC,EAAE,MAAM,CAAC;CACjC;AAED,MAAM,WAAW,oBAAqB,SAAQ,uBAAuB;IACnE,yEAAyE;IACzE,QAAQ,CAAC,KAAK,EAAE,IAAI,CAAC;CACtB;AAED,MAAM,MAAM,kBAAkB,GAC1B,QAAQ,GACR,SAAS,GACT,WAAW,GACX,QAAQ,GACR,WAAW,CAAC;AAEhB,MAAM,WAAW,wBAAwB,CAAC,OAAO,GAAG,OAAO;IACzD,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,iBAAiB,EAAE,MAAM,CAAC;IACnC,QAAQ,CAAC,KAAK,EAAE,kBAAkB,CAAC;IACnC,QAAQ,CAAC,MAAM,CAAC,EAAE,OAAO,CAAC;IAC1B,QAAQ,CAAC,KAAK,CAAC,EAAE,OAAO,CAAC;IACzB,QAAQ,CAAC,SAAS,CAAC,EAAE,OAAO,CAAC;CAC9B;AAED;;;;GAIG;AACH,qBAAa,0BAA2B,SAAQ,KAAK;IAIjD,QAAQ,CAAC,QAAQ,EAAE,MAAM;IACzB,QAAQ,CAAC,iBAAiB,EAAE,MAAM;IAClC,QAAQ,CAAC,KAAK,EAAE,OAAO,CAAC,kBAAkB,EAAE,QAAQ,GAAG,WAAW,CAAC;IACnE,QAAQ,CAAC,WAAW,CAAC,EAAE,wBAAwB;IANjD,QAAQ,CAAC,6BAA6B,OAAiB;IAEvD,YACW,QAAQ,EAAE,MAAM,EAChB,iBAAiB,EAAE,MAAM,EACzB,KAAK,EAAE,OAAO,CAAC,kBAAkB,EAAE,QAAQ,GAAG,WAAW,CAAC,EAC1D,WAAW,CAAC,EAAE,wBAAwB,YAAA,EAMhD;CACF;AAED,MAAM,WAAW,wBAAwB;IACvC,QAAQ,CAAC,MAAM,CAAC,EAAE,WAAW,CAAC;IAC9B,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC,WAAW,EAAE,wBAAwB,KAAK,IAAI,CAAC;IACpE,QAAQ,CAAC,cAAc,CAAC,EAAE,MAAM,CAAC;CAClC;AAED;;;;GAIG;AACH,MAAM,WAAW,oBAAoB,CAAC,MAAM,GAAG,OAAO,EAAE,OAAO,GAAG,OAAO;IACvE,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,MAAM,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,uBAAuB,CAAC,CAAC;IACxD,IAAI,CAAC,UAAU,EAAE,uBAAuB,GAAG,OAAO,CAAC,oBAAoB,CAAC,CAAC;IACzE,IAAI,CACF,OAAO,EAAE,oBAAoB,EAC7B,OAAO,CAAC,EAAE,wBAAwB,GACjC,OAAO,CAAC,wBAAwB,CAAC,OAAO,CAAC,CAAC,CAAC;IAC9C,MAAM,CACJ,OAAO,EAAE,oBAAoB,EAC7B,OAAO,CAAC,EAAE;QAAE,QAAQ,CAAC,MAAM,CAAC,EAAE,WAAW,CAAA;KAAE,GAC1C,OAAO,CAAC,IAAI,CAAC,CAAC;CAClB"}
|