@nodetool-ai/runtime 0.7.0-rc.23 → 0.8.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- 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 +954 -127
- package/dist/context.d.ts.map +1 -1
- package/dist/context.js +2424 -513
- 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 +67 -0
- package/dist/generation-registry.d.ts.map +1 -0
- package/dist/generation-registry.js +126 -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 +344 -0
- package/dist/host-binaries.js.map +1 -0
- package/dist/image-codec.d.ts +74 -0
- package/dist/image-codec.d.ts.map +1 -0
- package/dist/image-codec.js +273 -0
- package/dist/image-codec.js.map +1 -0
- package/dist/index.d.ts +56 -6
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +43 -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 +19 -0
- package/dist/media-ref-bytes.d.ts.map +1 -0
- package/dist/media-ref-bytes.js +181 -0
- package/dist/media-ref-bytes.js.map +1 -0
- package/dist/node-executor.d.ts +113 -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 +33 -10
- package/dist/providers/aki-provider.d.ts.map +1 -1
- package/dist/providers/aki-provider.js +84 -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 +101 -0
- package/dist/providers/atlascloud-provider.d.ts.map +1 -0
- package/dist/providers/atlascloud-provider.js +1009 -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 +481 -24
- package/dist/providers/base-provider.d.ts.map +1 -1
- package/dist/providers/base-provider.js +1259 -42
- 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 +131 -68
- package/dist/providers/claude-agent-provider.d.ts.map +1 -1
- package/dist/providers/claude-agent-provider.js +1095 -515
- package/dist/providers/claude-agent-provider.js.map +1 -1
- package/dist/providers/codex-provider.d.ts +82 -0
- package/dist/providers/codex-provider.d.ts.map +1 -0
- package/dist/providers/codex-provider.js +492 -0
- package/dist/providers/codex-provider.js.map +1 -0
- package/dist/providers/cohere-provider.d.ts +5 -2
- package/dist/providers/cohere-provider.d.ts.map +1 -1
- package/dist/providers/cohere-provider.js +9 -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 +74 -0
- package/dist/providers/core-tools.d.ts.map +1 -0
- package/dist/providers/core-tools.js +127 -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 +159 -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 +81 -0
- package/dist/providers/custom-openai-provider.d.ts.map +1 -0
- package/dist/providers/custom-openai-provider.js +182 -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/elevenlabs-provider.d.ts +49 -0
- package/dist/providers/elevenlabs-provider.d.ts.map +1 -0
- package/dist/providers/elevenlabs-provider.js +142 -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 +38 -0
- package/dist/providers/evolink-provider.d.ts.map +1 -0
- package/dist/providers/evolink-provider.js +304 -0
- package/dist/providers/evolink-provider.js.map +1 -0
- package/dist/providers/fake-provider.d.ts +72 -1
- package/dist/providers/fake-provider.d.ts.map +1 -1
- package/dist/providers/fake-provider.js +203 -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 +171 -7
- package/dist/providers/fal-provider.d.ts.map +1 -1
- package/dist/providers/fal-provider.js +1369 -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 +148 -8
- package/dist/providers/gemini-provider.d.ts.map +1 -1
- package/dist/providers/gemini-provider.js +1500 -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 +30 -0
- package/dist/providers/higgsfield-provider.d.ts.map +1 -0
- package/dist/providers/higgsfield-provider.js +131 -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 +71 -3
- package/dist/providers/huggingface-provider.d.ts.map +1 -1
- package/dist/providers/huggingface-provider.js +230 -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 +84 -8
- package/dist/providers/index.d.ts.map +1 -1
- package/dist/providers/index.js +239 -56
- package/dist/providers/index.js.map +1 -1
- package/dist/providers/jina-provider.d.ts +10 -2
- package/dist/providers/jina-provider.d.ts.map +1 -1
- package/dist/providers/jina-provider.js +16 -7
- package/dist/providers/jina-provider.js.map +1 -1
- package/dist/providers/kie-provider.d.ts +170 -9
- package/dist/providers/kie-provider.d.ts.map +1 -1
- package/dist/providers/kie-provider.js +1176 -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 +21 -37
- package/dist/providers/llama-provider.d.ts.map +1 -1
- package/dist/providers/llama-provider.js +43 -354
- 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/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 +14 -1
- package/dist/providers/meshy-provider.d.ts.map +1 -1
- package/dist/providers/meshy-provider.js +76 -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 +25 -18
- package/dist/providers/minimax-provider.d.ts.map +1 -1
- package/dist/providers/minimax-provider.js +211 -72
- package/dist/providers/minimax-provider.js.map +1 -1
- package/dist/providers/mistral-provider.d.ts +6 -12
- package/dist/providers/mistral-provider.d.ts.map +1 -1
- package/dist/providers/mistral-provider.js +10 -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 +98 -0
- package/dist/providers/node-llama-cpp-provider.d.ts.map +1 -0
- package/dist/providers/node-llama-cpp-provider.js +479 -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 +224 -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 +28 -1
- package/dist/providers/ollama-provider.d.ts.map +1 -1
- package/dist/providers/ollama-provider.js +193 -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 +89 -26
- package/dist/providers/openai-provider.d.ts.map +1 -1
- package/dist/providers/openai-provider.js +990 -105
- package/dist/providers/openai-provider.js.map +1 -1
- package/dist/providers/openrouter-provider.d.ts +6 -12
- package/dist/providers/openrouter-provider.d.ts.map +1 -1
- package/dist/providers/openrouter-provider.js +24 -53
- 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 +165 -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 +157 -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 +20 -12
- package/dist/providers/python-provider.d.ts.map +1 -1
- package/dist/providers/python-provider.js +185 -25
- package/dist/providers/python-provider.js.map +1 -1
- package/dist/providers/replicate-provider.d.ts +89 -7
- package/dist/providers/replicate-provider.d.ts.map +1 -1
- package/dist/providers/replicate-provider.js +801 -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/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 +45 -0
- package/dist/providers/reve-provider.d.ts.map +1 -0
- package/dist/providers/reve-provider.js +159 -0
- package/dist/providers/reve-provider.js.map +1 -0
- package/dist/providers/rodin-provider.d.ts +23 -1
- package/dist/providers/rodin-provider.d.ts.map +1 -1
- package/dist/providers/rodin-provider.js +89 -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-provider.d.ts +19 -16
- package/dist/providers/together-provider.d.ts.map +1 -1
- package/dist/providers/together-provider.js +103 -225
- package/dist/providers/together-provider.js.map +1 -1
- package/dist/providers/topaz-provider.d.ts +44 -0
- package/dist/providers/topaz-provider.d.ts.map +1 -0
- package/dist/providers/topaz-provider.js +239 -0
- package/dist/providers/topaz-provider.js.map +1 -0
- package/dist/providers/types.d.ts +603 -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 +27 -0
- package/dist/providers/useapi-provider.d.ts.map +1 -0
- package/dist/providers/useapi-provider.js +266 -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 +22 -8
- package/dist/providers/vllm-provider.d.ts.map +1 -1
- package/dist/providers/vllm-provider.js +48 -23
- package/dist/providers/vllm-provider.js.map +1 -1
- package/dist/providers/voyage-provider.d.ts +10 -2
- package/dist/providers/voyage-provider.d.ts.map +1 -1
- package/dist/providers/voyage-provider.js +16 -7
- package/dist/providers/voyage-provider.js.map +1 -1
- package/dist/providers/xai-provider.d.ts +54 -13
- package/dist/providers/xai-provider.d.ts.map +1 -1
- package/dist/providers/xai-provider.js +299 -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 +24 -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/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 +59 -0
- package/dist/storage-workspace.d.ts.map +1 -0
- package/dist/storage-workspace.js +426 -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 +7 -0
- package/dist/telemetry.d.ts.map +1 -1
- package/dist/telemetry.js +23 -0
- 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 +10 -0
- package/dist/trace-exporters.d.ts.map +1 -1
- package/dist/trace-exporters.js +59 -20
- package/dist/trace-exporters.js.map +1 -1
- package/dist/tracing-helpers.d.ts +45 -4
- package/dist/tracing-helpers.d.ts.map +1 -1
- package/dist/tracing-helpers.js +62 -19
- package/dist/tracing-helpers.js.map +1 -1
- 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 +107 -19
|
@@ -1,2 +1,50 @@
|
|
|
1
|
-
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
// ---------------------------------------------------------------------------
|
|
3
|
+
// Wire readers
|
|
4
|
+
// ---------------------------------------------------------------------------
|
|
5
|
+
//
|
|
6
|
+
// The bridge decodes msgpack, so a worker reply arrives as an untyped record.
|
|
7
|
+
// These readers turn one into the declared shape. Every field carries its own
|
|
8
|
+
// `.catch`, so a reply is never rejected: a field the worker omits or sends in
|
|
9
|
+
// the wrong type falls back to the value below instead of riding on mistyped.
|
|
10
|
+
// That is the one behavior change from the assertions these replaced — before,
|
|
11
|
+
// a malformed field reached callers as if it were valid.
|
|
12
|
+
export const comfyStatusInfoSchema = z
|
|
13
|
+
.object({
|
|
14
|
+
enabled: z.boolean().catch(false),
|
|
15
|
+
url: z.string().optional().catch(undefined),
|
|
16
|
+
reachable: z.boolean().optional().catch(undefined),
|
|
17
|
+
system_stats: z.record(z.string(), z.unknown()).optional().catch(undefined),
|
|
18
|
+
queue_remaining: z.number().optional().catch(undefined),
|
|
19
|
+
error: z.string().optional().catch(undefined),
|
|
20
|
+
api_v2: z.boolean().optional().catch(undefined)
|
|
21
|
+
})
|
|
22
|
+
.loose();
|
|
23
|
+
export const blenderStatusInfoSchema = z
|
|
24
|
+
.object({
|
|
25
|
+
enabled: z.boolean().catch(false),
|
|
26
|
+
version: z.string().optional().catch(undefined),
|
|
27
|
+
error: z.string().optional().catch(undefined)
|
|
28
|
+
})
|
|
29
|
+
.loose();
|
|
30
|
+
/**
|
|
31
|
+
* Load errors are forwarded verbatim: the entry shape varies by worker version
|
|
32
|
+
* (older workers key them by `node_type`), and every consumer only displays
|
|
33
|
+
* them, so narrowing here would drop fields rather than protect anyone.
|
|
34
|
+
*/
|
|
35
|
+
const workerLoadErrorSchema = z.custom();
|
|
36
|
+
export const workerStatusSchema = z
|
|
37
|
+
.object({
|
|
38
|
+
protocol_version: z.number().catch(0),
|
|
39
|
+
node_count: z.number().catch(0),
|
|
40
|
+
provider_count: z.number().catch(0),
|
|
41
|
+
namespaces: z.array(z.string()).catch([]),
|
|
42
|
+
load_errors: z.array(workerLoadErrorSchema).catch([]),
|
|
43
|
+
transport: z.string().catch(""),
|
|
44
|
+
max_frame_size: z.number().catch(0),
|
|
45
|
+
model_prepare_backends: z.array(z.string()).catch([]),
|
|
46
|
+
comfy: comfyStatusInfoSchema.optional().catch(undefined),
|
|
47
|
+
blender: blenderStatusInfoSchema.optional().catch(undefined)
|
|
48
|
+
})
|
|
49
|
+
.loose();
|
|
2
50
|
//# sourceMappingURL=python-bridge-types.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"python-bridge-types.js","sourceRoot":"","sources":["../src/python-bridge-types.ts"],"names":[],"mappings":""}
|
|
1
|
+
{"version":3,"file":"python-bridge-types.js","sourceRoot":"","sources":["../src/python-bridge-types.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAmuBxB,8EAA8E;AAC9E,eAAe;AACf,8EAA8E;AAC9E,EAAE;AACF,8EAA8E;AAC9E,8EAA8E;AAC9E,+EAA+E;AAC/E,8EAA8E;AAC9E,+EAA+E;AAC/E,yDAAyD;AAEzD,MAAM,CAAC,MAAM,qBAAqB,GAAG,CAAC;KACnC,MAAM,CAAC;IACN,OAAO,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,KAAK,CAAC,KAAK,CAAC;IACjC,GAAG,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,KAAK,CAAC,SAAS,CAAC;IAC3C,SAAS,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE,CAAC,KAAK,CAAC,SAAS,CAAC;IAClD,YAAY,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,QAAQ,EAAE,CAAC,KAAK,CAAC,SAAS,CAAC;IAC3E,eAAe,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,KAAK,CAAC,SAAS,CAAC;IACvD,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,KAAK,CAAC,SAAS,CAAC;IAC7C,MAAM,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE,CAAC,KAAK,CAAC,SAAS,CAAC;CAChD,CAAC;KACD,KAAK,EAAE,CAAC;AAEX,MAAM,CAAC,MAAM,uBAAuB,GAAG,CAAC;KACrC,MAAM,CAAC;IACN,OAAO,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,KAAK,CAAC,KAAK,CAAC;IACjC,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,KAAK,CAAC,SAAS,CAAC;IAC/C,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,KAAK,CAAC,SAAS,CAAC;CAC9C,CAAC;KACD,KAAK,EAAE,CAAC;AAEX;;;;GAIG;AACH,MAAM,qBAAqB,GAAG,CAAC,CAAC,MAAM,EAAyB,CAAC;AAEhE,MAAM,CAAC,MAAM,kBAAkB,GAAG,CAAC;KAChC,MAAM,CAAC;IACN,gBAAgB,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC;IACrC,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC;IAC/B,cAAc,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC;IACnC,UAAU,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,KAAK,CAAC,EAAE,CAAC;IACzC,WAAW,EAAE,CAAC,CAAC,KAAK,CAAC,qBAAqB,CAAC,CAAC,KAAK,CAAC,EAAE,CAAC;IACrD,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,KAAK,CAAC,EAAE,CAAC;IAC/B,cAAc,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC;IACnC,sBAAsB,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,KAAK,CAAC,EAAE,CAAC;IACrD,KAAK,EAAE,qBAAqB,CAAC,QAAQ,EAAE,CAAC,KAAK,CAAC,SAAS,CAAC;IACxD,OAAO,EAAE,uBAAuB,CAAC,QAAQ,EAAE,CAAC,KAAK,CAAC,SAAS,CAAC;CAC7D,CAAC;KACD,KAAK,EAAE,CAAC"}
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Python-worker support for graphs executed OUTSIDE the websocket server.
|
|
3
|
+
*
|
|
4
|
+
* The websocket server wires the Python bridge into its own `resolveExecutor`
|
|
5
|
+
* (see packages/websocket/src/plugins/websocket.ts). In-process runners — the
|
|
6
|
+
* `nodetool run` / `nodetool workflows run` CLI commands and the DSL `run()` —
|
|
7
|
+
* had no such wiring, so any Python worker node failed with "Unknown node
|
|
8
|
+
* type". These helpers give those runners the same capability.
|
|
9
|
+
*
|
|
10
|
+
* Transport is chosen by {@link createPythonBridge}: when `NODETOOL_WORKER_URL`
|
|
11
|
+
* (optionally with `NODETOOL_WORKER_TOKEN`) is set, a remote WebSocket worker is
|
|
12
|
+
* used; otherwise a local stdio worker is spawned.
|
|
13
|
+
*/
|
|
14
|
+
import { PythonNodeExecutor } from "./python-node-executor.js";
|
|
15
|
+
import type { PythonBridgeBase } from "./python-bridge-base.js";
|
|
16
|
+
import type { PythonBridgeOptions } from "./python-bridge-types.js";
|
|
17
|
+
/** Minimal graph-node shape the resolver needs. */
|
|
18
|
+
interface GraphNodeLike {
|
|
19
|
+
id: string;
|
|
20
|
+
type: string;
|
|
21
|
+
properties?: Record<string, unknown>;
|
|
22
|
+
data?: Record<string, unknown>;
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* Connect a Python worker bridge for a graph, but ONLY when the graph contains a
|
|
26
|
+
* node type the TS registry cannot resolve (a candidate Python node). Pure-TS
|
|
27
|
+
* graphs get no bridge — no worker spawned, no remote connection — preserving
|
|
28
|
+
* the prior behavior and cost for workflows that don't need Python.
|
|
29
|
+
*
|
|
30
|
+
* Failure handling depends on whether a remote worker was explicitly requested:
|
|
31
|
+
* - `NODETOOL_WORKER_URL` set → a connect failure is surfaced (the caller asked
|
|
32
|
+
* for a specific remote worker, so a silent fallthrough would hide a real
|
|
33
|
+
* misconfiguration).
|
|
34
|
+
* - unset (local stdio attempt) → a connect failure returns `null` and is
|
|
35
|
+
* logged, so an unresolved node still reports the normal "Unknown node type"
|
|
36
|
+
* error rather than a confusing worker-spawn error.
|
|
37
|
+
*
|
|
38
|
+
* The caller owns the returned bridge and MUST `close()` it after the run.
|
|
39
|
+
*
|
|
40
|
+
* @param nodes The graph nodes (only `.type` is read).
|
|
41
|
+
* @param hasTsExecutor Predicate: can the in-process TS registry resolve a type?
|
|
42
|
+
* @param options Bridge options forwarded to {@link createPythonBridge}.
|
|
43
|
+
* @returns The connected bridge, or `null` when no Python node is present (or a
|
|
44
|
+
* local worker was unavailable).
|
|
45
|
+
*/
|
|
46
|
+
export declare function connectPythonBridgeForGraph(nodes: ReadonlyArray<{
|
|
47
|
+
type?: unknown;
|
|
48
|
+
}>, hasTsExecutor: (nodeType: string) => boolean, options?: PythonBridgeOptions): Promise<PythonBridgeBase | null>;
|
|
49
|
+
/**
|
|
50
|
+
* Build a {@link PythonNodeExecutor} for a node when the bridge advertises its
|
|
51
|
+
* type, mirroring the websocket server's `resolveExecutor`. Returns `null` when
|
|
52
|
+
* there is no bridge or the bridge does not know the node type, so the caller
|
|
53
|
+
* can fall through to its own "unknown node type" error.
|
|
54
|
+
*/
|
|
55
|
+
export declare function resolvePythonNodeExecutor(bridge: PythonBridgeBase | null, node: GraphNodeLike): PythonNodeExecutor | null;
|
|
56
|
+
export {};
|
|
57
|
+
//# sourceMappingURL=python-graph-resolver.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"python-graph-resolver.d.ts","sourceRoot":"","sources":["../src/python-graph-resolver.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAKH,OAAO,EAAE,kBAAkB,EAAE,MAAM,2BAA2B,CAAC;AAC/D,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAChE,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAC;AAKpE,mDAAmD;AACnD,UAAU,aAAa;IACrB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACrC,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAChC;AAED;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,wBAAsB,2BAA2B,CAC/C,KAAK,EAAE,aAAa,CAAC;IAAE,IAAI,CAAC,EAAE,OAAO,CAAA;CAAE,CAAC,EACxC,aAAa,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,OAAO,EAC5C,OAAO,CAAC,EAAE,mBAAmB,GAC5B,OAAO,CAAC,gBAAgB,GAAG,IAAI,CAAC,CA2BlC;AAED;;;;;GAKG;AACH,wBAAgB,yBAAyB,CACvC,MAAM,EAAE,gBAAgB,GAAG,IAAI,EAC/B,IAAI,EAAE,aAAa,GAClB,kBAAkB,GAAG,IAAI,CAoB3B"}
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Python-worker support for graphs executed OUTSIDE the websocket server.
|
|
3
|
+
*
|
|
4
|
+
* The websocket server wires the Python bridge into its own `resolveExecutor`
|
|
5
|
+
* (see packages/websocket/src/plugins/websocket.ts). In-process runners — the
|
|
6
|
+
* `nodetool run` / `nodetool workflows run` CLI commands and the DSL `run()` —
|
|
7
|
+
* had no such wiring, so any Python worker node failed with "Unknown node
|
|
8
|
+
* type". These helpers give those runners the same capability.
|
|
9
|
+
*
|
|
10
|
+
* Transport is chosen by {@link createPythonBridge}: when `NODETOOL_WORKER_URL`
|
|
11
|
+
* (optionally with `NODETOOL_WORKER_TOKEN`) is set, a remote WebSocket worker is
|
|
12
|
+
* used; otherwise a local stdio worker is spawned.
|
|
13
|
+
*/
|
|
14
|
+
import { createLogger } from "@nodetool-ai/config";
|
|
15
|
+
import { createPythonBridge } from "./python-bridge-factory.js";
|
|
16
|
+
import { PythonNodeExecutor } from "./python-node-executor.js";
|
|
17
|
+
import { isNonEmptyString } from "@nodetool-ai/protocol";
|
|
18
|
+
const log = createLogger("nodetool.runtime.python-graph-resolver");
|
|
19
|
+
/**
|
|
20
|
+
* Connect a Python worker bridge for a graph, but ONLY when the graph contains a
|
|
21
|
+
* node type the TS registry cannot resolve (a candidate Python node). Pure-TS
|
|
22
|
+
* graphs get no bridge — no worker spawned, no remote connection — preserving
|
|
23
|
+
* the prior behavior and cost for workflows that don't need Python.
|
|
24
|
+
*
|
|
25
|
+
* Failure handling depends on whether a remote worker was explicitly requested:
|
|
26
|
+
* - `NODETOOL_WORKER_URL` set → a connect failure is surfaced (the caller asked
|
|
27
|
+
* for a specific remote worker, so a silent fallthrough would hide a real
|
|
28
|
+
* misconfiguration).
|
|
29
|
+
* - unset (local stdio attempt) → a connect failure returns `null` and is
|
|
30
|
+
* logged, so an unresolved node still reports the normal "Unknown node type"
|
|
31
|
+
* error rather than a confusing worker-spawn error.
|
|
32
|
+
*
|
|
33
|
+
* The caller owns the returned bridge and MUST `close()` it after the run.
|
|
34
|
+
*
|
|
35
|
+
* @param nodes The graph nodes (only `.type` is read).
|
|
36
|
+
* @param hasTsExecutor Predicate: can the in-process TS registry resolve a type?
|
|
37
|
+
* @param options Bridge options forwarded to {@link createPythonBridge}.
|
|
38
|
+
* @returns The connected bridge, or `null` when no Python node is present (or a
|
|
39
|
+
* local worker was unavailable).
|
|
40
|
+
*/
|
|
41
|
+
export async function connectPythonBridgeForGraph(nodes, hasTsExecutor, options) {
|
|
42
|
+
const needsPython = nodes.some((n) => isNonEmptyString(n.type) && !hasTsExecutor(n.type));
|
|
43
|
+
if (!needsPython)
|
|
44
|
+
return null;
|
|
45
|
+
const wsUrl = options?.wsUrl ?? process.env["NODETOOL_WORKER_URL"];
|
|
46
|
+
const bridge = createPythonBridge(options);
|
|
47
|
+
try {
|
|
48
|
+
await bridge.connect();
|
|
49
|
+
return bridge;
|
|
50
|
+
}
|
|
51
|
+
catch (err) {
|
|
52
|
+
bridge.close();
|
|
53
|
+
if (wsUrl && wsUrl.trim()) {
|
|
54
|
+
// Remote worker explicitly requested — surface the failure.
|
|
55
|
+
throw err;
|
|
56
|
+
}
|
|
57
|
+
// No remote configured and a local worker isn't available here; fall
|
|
58
|
+
// through so unresolved node types report the normal error.
|
|
59
|
+
log.warn(`Python worker bridge unavailable; Python nodes will be unresolved: ${String(err)}`);
|
|
60
|
+
return null;
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
/**
|
|
64
|
+
* Build a {@link PythonNodeExecutor} for a node when the bridge advertises its
|
|
65
|
+
* type, mirroring the websocket server's `resolveExecutor`. Returns `null` when
|
|
66
|
+
* there is no bridge or the bridge does not know the node type, so the caller
|
|
67
|
+
* can fall through to its own "unknown node type" error.
|
|
68
|
+
*/
|
|
69
|
+
export function resolvePythonNodeExecutor(bridge, node) {
|
|
70
|
+
if (!bridge || !bridge.hasNodeType(node.type))
|
|
71
|
+
return null;
|
|
72
|
+
const meta = bridge
|
|
73
|
+
.getNodeMetadata()
|
|
74
|
+
.find((m) => m.node_type === node.type);
|
|
75
|
+
const props = node.properties ?? node.data ?? {};
|
|
76
|
+
const outputTypes = Object.fromEntries((meta?.outputs ?? []).map((o) => [o.name, o.type.type]));
|
|
77
|
+
return new PythonNodeExecutor(bridge, node.type, props, outputTypes, meta?.required_settings ?? [], node.id, meta?.requires_vram_gb);
|
|
78
|
+
}
|
|
79
|
+
//# sourceMappingURL=python-graph-resolver.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"python-graph-resolver.js","sourceRoot":"","sources":["../src/python-graph-resolver.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAEnD,OAAO,EAAE,kBAAkB,EAAE,MAAM,4BAA4B,CAAC;AAChE,OAAO,EAAE,kBAAkB,EAAE,MAAM,2BAA2B,CAAC;AAG/D,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AAEzD,MAAM,GAAG,GAAG,YAAY,CAAC,wCAAwC,CAAC,CAAC;AAUnE;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,MAAM,CAAC,KAAK,UAAU,2BAA2B,CAC/C,KAAwC,EACxC,aAA4C,EAC5C,OAA6B;IAE7B,MAAM,WAAW,GAAG,KAAK,CAAC,IAAI,CAC5B,CAAC,CAAC,EAAE,EAAE,CACJ,gBAAgB,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,IAAI,CAAC,CACrD,CAAC;IACF,IAAI,CAAC,WAAW;QAAE,OAAO,IAAI,CAAC;IAE9B,MAAM,KAAK,GAAG,OAAO,EAAE,KAAK,IAAI,OAAO,CAAC,GAAG,CAAC,qBAAqB,CAAC,CAAC;IACnE,MAAM,MAAM,GAAG,kBAAkB,CAAC,OAAO,CAAC,CAAC;IAC3C,IAAI,CAAC;QACH,MAAM,MAAM,CAAC,OAAO,EAAE,CAAC;QACvB,OAAO,MAAM,CAAC;IAChB,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,MAAM,CAAC,KAAK,EAAE,CAAC;QACf,IAAI,KAAK,IAAI,KAAK,CAAC,IAAI,EAAE,EAAE,CAAC;YAC1B,4DAA4D;YAC5D,MAAM,GAAG,CAAC;QACZ,CAAC;QACD,qEAAqE;QACrE,4DAA4D;QAC5D,GAAG,CAAC,IAAI,CACN,sEAAsE,MAAM,CAC1E,GAAG,CACJ,EAAE,CACJ,CAAC;QACF,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,yBAAyB,CACvC,MAA+B,EAC/B,IAAmB;IAEnB,IAAI,CAAC,MAAM,IAAI,CAAC,MAAM,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC;QAAE,OAAO,IAAI,CAAC;IAE3D,MAAM,IAAI,GAAG,MAAM;SAChB,eAAe,EAAE;SACjB,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,SAAS,KAAK,IAAI,CAAC,IAAI,CAAC,CAAC;IAC1C,MAAM,KAAK,GAAG,IAAI,CAAC,UAAU,IAAI,IAAI,CAAC,IAAI,IAAI,EAAE,CAAC;IACjD,MAAM,WAAW,GAAG,MAAM,CAAC,WAAW,CACpC,CAAC,IAAI,EAAE,OAAO,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CACxD,CAAC;IAEF,OAAO,IAAI,kBAAkB,CAC3B,MAAM,EACN,IAAI,CAAC,IAAI,EACT,KAAK,EACL,WAAW,EACX,IAAI,EAAE,iBAAiB,IAAI,EAAE,EAC7B,IAAI,CAAC,EAAE,EACP,IAAI,EAAE,gBAAgB,CACvB,CAAC;AACJ,CAAC"}
|
|
@@ -1,16 +1,48 @@
|
|
|
1
1
|
import type { ProcessingContext } from "./context.js";
|
|
2
|
-
import type { ExecuteInputBlobs, ExecuteResult, ProgressEvent } from "./python-bridge-types.js";
|
|
2
|
+
import type { ExecuteIdentity, ExecuteInputBlobs, ExecuteResult, ProgressEvent } from "./python-bridge-types.js";
|
|
3
3
|
/** Minimal interface for the local Python stdio bridge. */
|
|
4
4
|
interface PythonBridgeLike {
|
|
5
|
-
execute(nodeType: string, fields: Record<string, unknown>, secrets: Record<string, string>, blobs: ExecuteInputBlobs, onProgress?: (event: ProgressEvent) => void): Promise<ExecuteResult>;
|
|
6
|
-
executeStream?(nodeType: string, fields: Record<string, unknown>, secrets: Record<string, string>, blobs: ExecuteInputBlobs, onProgress?: (event: ProgressEvent) => void): AsyncGenerator<ExecuteResult>;
|
|
5
|
+
execute(nodeType: string, fields: Record<string, unknown>, secrets: Record<string, string>, blobs: ExecuteInputBlobs, onProgress?: (event: ProgressEvent) => void, identity?: ExecuteIdentity): Promise<ExecuteResult>;
|
|
6
|
+
executeStream?(nodeType: string, fields: Record<string, unknown>, secrets: Record<string, string>, blobs: ExecuteInputBlobs, onProgress?: (event: ProgressEvent) => void, identity?: ExecuteIdentity): AsyncGenerator<ExecuteResult>;
|
|
7
7
|
}
|
|
8
8
|
export declare class PythonNodeExecutor {
|
|
9
9
|
private bridge;
|
|
10
10
|
private nodeType;
|
|
11
11
|
private outputTypes;
|
|
12
12
|
private requiredSettings;
|
|
13
|
-
|
|
13
|
+
/** Graph node id, used to surface Python worker progress as node_progress. */
|
|
14
|
+
private nodeId?;
|
|
15
|
+
/**
|
|
16
|
+
* VRAM hint from this node type's `discover` metadata, forwarded on every
|
|
17
|
+
* execute so the worker can size its reclaim pass. Absent for a worker
|
|
18
|
+
* that does not report one.
|
|
19
|
+
*/
|
|
20
|
+
private requiresVramGb?;
|
|
21
|
+
constructor(bridge: PythonBridgeLike, nodeType: string, _properties: Record<string, unknown>, outputTypes: Record<string, string>, requiredSettings: string[],
|
|
22
|
+
/** Graph node id, used to surface Python worker progress as node_progress. */
|
|
23
|
+
nodeId?: string | undefined,
|
|
24
|
+
/**
|
|
25
|
+
* VRAM hint from this node type's `discover` metadata, forwarded on every
|
|
26
|
+
* execute so the worker can size its reclaim pass. Absent for a worker
|
|
27
|
+
* that does not report one.
|
|
28
|
+
*/
|
|
29
|
+
requiresVramGb?: number | undefined);
|
|
30
|
+
/**
|
|
31
|
+
* Run identity for the `execute` payload (bridge protocol v4).
|
|
32
|
+
*
|
|
33
|
+
* Before v4 the worker saw an unlabeled stream of single-node executions: it
|
|
34
|
+
* constructed every node with no id, so `self._id` was `""` for all of them
|
|
35
|
+
* and its node → model map collapsed into one bucket. `node_id` is what makes
|
|
36
|
+
* that map real; `job_id` is what pairs the execution with the `job.end`
|
|
37
|
+
* boundary that releases it.
|
|
38
|
+
*/
|
|
39
|
+
private identity;
|
|
40
|
+
/**
|
|
41
|
+
* Build an onProgress sink that forwards the Python worker's progress events
|
|
42
|
+
* to the context message stream as `node_progress`. Returns undefined when we
|
|
43
|
+
* lack the context or node id needed to address the message.
|
|
44
|
+
*/
|
|
45
|
+
private progressHandler;
|
|
14
46
|
private prepareExecution;
|
|
15
47
|
private materializeOutputs;
|
|
16
48
|
process(inputs: Record<string, unknown>, context?: ProcessingContext): Promise<Record<string, unknown>>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"python-node-executor.d.ts","sourceRoot":"","sources":["../src/python-node-executor.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAC;AACtD,OAAO,KAAK,EACV,iBAAiB,EACjB,aAAa,EACb,aAAa,EACd,MAAM,0BAA0B,CAAC;
|
|
1
|
+
{"version":3,"file":"python-node-executor.d.ts","sourceRoot":"","sources":["../src/python-node-executor.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAC;AACtD,OAAO,KAAK,EACV,eAAe,EACf,iBAAiB,EACjB,aAAa,EACb,aAAa,EACd,MAAM,0BAA0B,CAAC;AAOlC,2DAA2D;AAC3D,UAAU,gBAAgB;IACxB,OAAO,CACL,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC/B,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,EAC/B,KAAK,EAAE,iBAAiB,EACxB,UAAU,CAAC,EAAE,CAAC,KAAK,EAAE,aAAa,KAAK,IAAI,EAC3C,QAAQ,CAAC,EAAE,eAAe,GACzB,OAAO,CAAC,aAAa,CAAC,CAAC;IAC1B,aAAa,CAAC,CACZ,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC/B,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,EAC/B,KAAK,EAAE,iBAAiB,EACxB,UAAU,CAAC,EAAE,CAAC,KAAK,EAAE,aAAa,KAAK,IAAI,EAC3C,QAAQ,CAAC,EAAE,eAAe,GACzB,cAAc,CAAC,aAAa,CAAC,CAAC;CAClC;AAgID,qBAAa,kBAAkB;IAE3B,OAAO,CAAC,MAAM;IACd,OAAO,CAAC,QAAQ;IAEhB,OAAO,CAAC,WAAW;IACnB,OAAO,CAAC,gBAAgB;IACxB,8EAA8E;IAC9E,OAAO,CAAC,MAAM,CAAC;IACf;;;;OAIG;IACH,OAAO,CAAC,cAAc,CAAC;IAbzB,YACU,MAAM,EAAE,gBAAgB,EACxB,QAAQ,EAAE,MAAM,EACxB,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC5B,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,EACnC,gBAAgB,EAAE,MAAM,EAAE;IAClC,8EAA8E;IACtE,MAAM,CAAC,EAAE,MAAM,YAAA;IACvB;;;;OAIG;IACK,cAAc,CAAC,EAAE,MAAM,YAAA,EAC7B;IAEJ;;;;;;;;OAQG;IACH,OAAO,CAAC,QAAQ;IAoBhB;;;;OAIG;IACH,OAAO,CAAC,eAAe;YAgBT,gBAAgB;YAyEhB,kBAAkB;IA6D1B,OAAO,CACX,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC/B,OAAO,CAAC,EAAE,iBAAiB,GAC1B,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAYlC;IAEM,UAAU,CACf,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC/B,OAAO,CAAC,EAAE,iBAAiB,GAC1B,cAAc,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAiBzC;CACF"}
|
|
@@ -1,8 +1,15 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { loadMediaRefBytes } from "./media-ref-bytes.js";
|
|
2
|
+
import { isString } from "@nodetool-ai/protocol";
|
|
3
|
+
import { createLogger, getNodeBuiltinSync } from "@nodetool-ai/config";
|
|
2
4
|
const log = createLogger("nodetool.runtime.python-node-executor");
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
5
|
+
const _nodeCrypto = getNodeBuiltinSync("node:crypto");
|
|
6
|
+
const randomUUID = () => _nodeCrypto?.randomUUID
|
|
7
|
+
? _nodeCrypto.randomUUID()
|
|
8
|
+
: globalThis.crypto?.randomUUID
|
|
9
|
+
? globalThis.crypto.randomUUID()
|
|
10
|
+
: (() => {
|
|
11
|
+
throw new Error("node:crypto.randomUUID requires Node");
|
|
12
|
+
})();
|
|
6
13
|
/** Media ref types that need blob conversion. */
|
|
7
14
|
const MEDIA_TYPE_ALIASES = {
|
|
8
15
|
ImageRef: "image",
|
|
@@ -14,20 +21,81 @@ const MEDIA_TYPE_ALIASES = {
|
|
|
14
21
|
video: "video",
|
|
15
22
|
model_3d: "model_3d"
|
|
16
23
|
};
|
|
17
|
-
/**
|
|
24
|
+
/** Fallback extension when the ref names no format. */
|
|
18
25
|
const EXTENSION_MAP = {
|
|
19
26
|
image: ".png",
|
|
20
27
|
audio: ".wav",
|
|
21
28
|
video: ".mp4",
|
|
22
29
|
model_3d: ".glb"
|
|
23
30
|
};
|
|
24
|
-
/** MIME
|
|
31
|
+
/** Fallback MIME type when the ref names no format. */
|
|
25
32
|
const MIME_MAP = {
|
|
26
33
|
image: "image/png",
|
|
27
34
|
audio: "audio/wav",
|
|
28
35
|
video: "video/mp4",
|
|
29
36
|
model_3d: "model/gltf-binary"
|
|
30
37
|
};
|
|
38
|
+
/**
|
|
39
|
+
* MIME type per declared ref format. A ref that says `format: "jpeg"` must not
|
|
40
|
+
* be stored as `.png` with `image/png`: the extension decides how a browser
|
|
41
|
+
* and every downstream reader treat the bytes.
|
|
42
|
+
*
|
|
43
|
+
* A format absent from this table still shapes the extension — the entry only
|
|
44
|
+
* decides the content type, which falls back to the media kind's default.
|
|
45
|
+
*/
|
|
46
|
+
const FORMAT_MIME_MAP = {
|
|
47
|
+
png: "image/png",
|
|
48
|
+
jpg: "image/jpeg",
|
|
49
|
+
jpeg: "image/jpeg",
|
|
50
|
+
webp: "image/webp",
|
|
51
|
+
gif: "image/gif",
|
|
52
|
+
bmp: "image/bmp",
|
|
53
|
+
tiff: "image/tiff",
|
|
54
|
+
wav: "audio/wav",
|
|
55
|
+
mp3: "audio/mpeg",
|
|
56
|
+
flac: "audio/flac",
|
|
57
|
+
ogg: "audio/ogg",
|
|
58
|
+
opus: "audio/opus",
|
|
59
|
+
m4a: "audio/mp4",
|
|
60
|
+
mp4: "video/mp4",
|
|
61
|
+
webm: "video/webm",
|
|
62
|
+
mov: "video/quicktime",
|
|
63
|
+
mkv: "video/x-matroska",
|
|
64
|
+
avi: "video/x-msvideo",
|
|
65
|
+
glb: "model/gltf-binary",
|
|
66
|
+
gltf: "model/gltf+json",
|
|
67
|
+
obj: "model/obj",
|
|
68
|
+
stl: "model/stl",
|
|
69
|
+
ply: "model/mesh",
|
|
70
|
+
fbx: "application/octet-stream"
|
|
71
|
+
};
|
|
72
|
+
/**
|
|
73
|
+
* The format a ref declares, as a storage-key-safe token, or null.
|
|
74
|
+
*
|
|
75
|
+
* The value is node-controlled and lands in a storage key, so anything but a
|
|
76
|
+
* short alphanumeric token is refused rather than sanitized — a format of
|
|
77
|
+
* `../../etc` has no legitimate reading.
|
|
78
|
+
*/
|
|
79
|
+
function refFormat(ref) {
|
|
80
|
+
const raw = ref?.["format"];
|
|
81
|
+
if (!isString(raw))
|
|
82
|
+
return null;
|
|
83
|
+
const format = raw.trim().toLowerCase();
|
|
84
|
+
return /^[a-z0-9]{1,8}$/.test(format) ? format : null;
|
|
85
|
+
}
|
|
86
|
+
/** True when a ref's `data` holds raw bytes rather than an inline payload. */
|
|
87
|
+
function isBinaryPayload(value) {
|
|
88
|
+
if (value instanceof Uint8Array || value instanceof ArrayBuffer)
|
|
89
|
+
return true;
|
|
90
|
+
return (Array.isArray(value) &&
|
|
91
|
+
value.some((item) => item instanceof Uint8Array || item instanceof ArrayBuffer));
|
|
92
|
+
}
|
|
93
|
+
/** The ref the worker sent for this output slot, if it sent one. */
|
|
94
|
+
function carriedRef(value) {
|
|
95
|
+
return typeof value === "object" && value !== null && !Array.isArray(value)
|
|
96
|
+
? value
|
|
97
|
+
: null;
|
|
98
|
+
}
|
|
31
99
|
function normalizeMediaOutputType(outputType) {
|
|
32
100
|
if (!outputType) {
|
|
33
101
|
return null;
|
|
@@ -43,86 +111,75 @@ function isMediaRef(value) {
|
|
|
43
111
|
function isMediaRefList(value) {
|
|
44
112
|
return Array.isArray(value) && value.every(isMediaRef);
|
|
45
113
|
}
|
|
46
|
-
const ASSET_ID_EXTENSION_CANDIDATES = {
|
|
47
|
-
image: ["png", "jpg", "jpeg", "webp", "gif", "bmp", "svg"],
|
|
48
|
-
audio: ["wav", "mp3", "ogg", "m4a", "aac", "flac"],
|
|
49
|
-
video: ["mp4", "webm", "mov", "avi", "mpeg", "mkv"],
|
|
50
|
-
model3d: ["glb", "gltf", "obj", "fbx"]
|
|
51
|
-
};
|
|
52
|
-
function isAbsoluteFilePath(uri) {
|
|
53
|
-
return (/^[A-Za-z]:[\\/]/.test(uri) || uri.startsWith("\\\\") || uri.startsWith("/"));
|
|
54
|
-
}
|
|
55
|
-
async function readUriBytes(uri) {
|
|
56
|
-
if (uri.startsWith("data:")) {
|
|
57
|
-
const parts = uri.split(",", 2);
|
|
58
|
-
if (parts.length !== 2) {
|
|
59
|
-
return null;
|
|
60
|
-
}
|
|
61
|
-
const [header, data] = parts;
|
|
62
|
-
const bytes = header.includes(";base64")
|
|
63
|
-
? Buffer.from(data, "base64")
|
|
64
|
-
: Buffer.from(decodeURIComponent(data), "utf-8");
|
|
65
|
-
return new Uint8Array(bytes);
|
|
66
|
-
}
|
|
67
|
-
if (uri.startsWith("file://")) {
|
|
68
|
-
try {
|
|
69
|
-
return await readFile(fileURLToPath(uri));
|
|
70
|
-
}
|
|
71
|
-
catch {
|
|
72
|
-
return null;
|
|
73
|
-
}
|
|
74
|
-
}
|
|
75
|
-
if (isAbsoluteFilePath(uri)) {
|
|
76
|
-
try {
|
|
77
|
-
return await readFile(uri);
|
|
78
|
-
}
|
|
79
|
-
catch {
|
|
80
|
-
return null;
|
|
81
|
-
}
|
|
82
|
-
}
|
|
83
|
-
return null;
|
|
84
|
-
}
|
|
85
|
-
async function loadMediaRefBytes(value, context) {
|
|
86
|
-
// Inline base64 data takes priority over uri
|
|
87
|
-
const data = value.data;
|
|
88
|
-
if (typeof data === "string" && data.length > 0) {
|
|
89
|
-
return new Uint8Array(Buffer.from(data, "base64"));
|
|
90
|
-
}
|
|
91
|
-
if (data instanceof Uint8Array) {
|
|
92
|
-
return data;
|
|
93
|
-
}
|
|
94
|
-
if (!value.uri) {
|
|
95
|
-
return null;
|
|
96
|
-
}
|
|
97
|
-
if (context?.storage) {
|
|
98
|
-
const candidates = new Set();
|
|
99
|
-
candidates.add(value.uri);
|
|
100
|
-
if (value.asset_id) {
|
|
101
|
-
const refType = (value.type ?? "").toLowerCase();
|
|
102
|
-
const extensions = ASSET_ID_EXTENSION_CANDIDATES[refType] ?? ["bin"];
|
|
103
|
-
for (const extension of extensions) {
|
|
104
|
-
candidates.add(`/api/storage/${value.asset_id}.${extension}`);
|
|
105
|
-
}
|
|
106
|
-
}
|
|
107
|
-
for (const candidate of candidates) {
|
|
108
|
-
const stored = await context.storage.retrieve(candidate);
|
|
109
|
-
if (stored !== null) {
|
|
110
|
-
return stored;
|
|
111
|
-
}
|
|
112
|
-
}
|
|
113
|
-
}
|
|
114
|
-
return readUriBytes(value.uri);
|
|
115
|
-
}
|
|
116
114
|
export class PythonNodeExecutor {
|
|
117
115
|
bridge;
|
|
118
116
|
nodeType;
|
|
119
117
|
outputTypes;
|
|
120
118
|
requiredSettings;
|
|
121
|
-
|
|
119
|
+
nodeId;
|
|
120
|
+
requiresVramGb;
|
|
121
|
+
constructor(bridge, nodeType, _properties, outputTypes, requiredSettings,
|
|
122
|
+
/** Graph node id, used to surface Python worker progress as node_progress. */
|
|
123
|
+
nodeId,
|
|
124
|
+
/**
|
|
125
|
+
* VRAM hint from this node type's `discover` metadata, forwarded on every
|
|
126
|
+
* execute so the worker can size its reclaim pass. Absent for a worker
|
|
127
|
+
* that does not report one.
|
|
128
|
+
*/
|
|
129
|
+
requiresVramGb) {
|
|
122
130
|
this.bridge = bridge;
|
|
123
131
|
this.nodeType = nodeType;
|
|
124
132
|
this.outputTypes = outputTypes;
|
|
125
133
|
this.requiredSettings = requiredSettings;
|
|
134
|
+
this.nodeId = nodeId;
|
|
135
|
+
this.requiresVramGb = requiresVramGb;
|
|
136
|
+
}
|
|
137
|
+
/**
|
|
138
|
+
* Run identity for the `execute` payload (bridge protocol v4).
|
|
139
|
+
*
|
|
140
|
+
* Before v4 the worker saw an unlabeled stream of single-node executions: it
|
|
141
|
+
* constructed every node with no id, so `self._id` was `""` for all of them
|
|
142
|
+
* and its node → model map collapsed into one bucket. `node_id` is what makes
|
|
143
|
+
* that map real; `job_id` is what pairs the execution with the `job.end`
|
|
144
|
+
* boundary that releases it.
|
|
145
|
+
*/
|
|
146
|
+
identity(context) {
|
|
147
|
+
const identity = {};
|
|
148
|
+
if (this.nodeId) {
|
|
149
|
+
identity.nodeId = this.nodeId;
|
|
150
|
+
}
|
|
151
|
+
if (context?.jobId) {
|
|
152
|
+
identity.jobId = context.jobId;
|
|
153
|
+
}
|
|
154
|
+
if (context?.workflowId) {
|
|
155
|
+
identity.workflowId = context.workflowId;
|
|
156
|
+
}
|
|
157
|
+
if (context?.userId) {
|
|
158
|
+
identity.userId = context.userId;
|
|
159
|
+
}
|
|
160
|
+
if (this.requiresVramGb != null) {
|
|
161
|
+
identity.requiresVramGb = this.requiresVramGb;
|
|
162
|
+
}
|
|
163
|
+
return identity;
|
|
164
|
+
}
|
|
165
|
+
/**
|
|
166
|
+
* Build an onProgress sink that forwards the Python worker's progress events
|
|
167
|
+
* to the context message stream as `node_progress`. Returns undefined when we
|
|
168
|
+
* lack the context or node id needed to address the message.
|
|
169
|
+
*/
|
|
170
|
+
progressHandler(context) {
|
|
171
|
+
const nodeId = this.nodeId;
|
|
172
|
+
if (!context || !nodeId)
|
|
173
|
+
return undefined;
|
|
174
|
+
return (event) => {
|
|
175
|
+
context.postMessage({
|
|
176
|
+
type: "node_progress",
|
|
177
|
+
node_id: nodeId,
|
|
178
|
+
progress: event.progress,
|
|
179
|
+
total: event.total,
|
|
180
|
+
workflow_id: context.workflowId
|
|
181
|
+
});
|
|
182
|
+
};
|
|
126
183
|
}
|
|
127
184
|
async prepareExecution(inputs, context) {
|
|
128
185
|
// NodeActor merges node.properties + edge inputs before calling process(),
|
|
@@ -142,10 +199,10 @@ export class PythonNodeExecutor {
|
|
|
142
199
|
key,
|
|
143
200
|
type: ref.type,
|
|
144
201
|
hasUri: Boolean(ref.uri),
|
|
145
|
-
uriLength:
|
|
202
|
+
uriLength: isString(ref.uri) ? ref.uri.length : 0,
|
|
146
203
|
hasData: ref.data !== null && ref.data !== undefined,
|
|
147
204
|
dataType: typeof ref.data,
|
|
148
|
-
dataLength:
|
|
205
|
+
dataLength: isString(ref.data)
|
|
149
206
|
? ref.data.length
|
|
150
207
|
: ref.data instanceof Uint8Array
|
|
151
208
|
? ref.data.length
|
|
@@ -184,15 +241,48 @@ export class PythonNodeExecutor {
|
|
|
184
241
|
return { fields, blobs, secrets };
|
|
185
242
|
}
|
|
186
243
|
async materializeOutputs(result, context) {
|
|
187
|
-
|
|
244
|
+
// Output names come across the Python bridge (node-controlled), so build a
|
|
245
|
+
// null-prototype object: a blob/output named "__proto__" or "constructor"
|
|
246
|
+
// then lands as a plain own key and can't reach the prototype setter.
|
|
247
|
+
// Downstream only does own-key ops (Object.keys, spread, msgpack/JSON), so a
|
|
248
|
+
// null-prototype object behaves identically for legitimate names.
|
|
249
|
+
const outputs = Object.assign(Object.create(null), result.outputs);
|
|
188
250
|
for (const [name, blobData] of Object.entries(result.blobs)) {
|
|
189
|
-
|
|
251
|
+
// Guard the outputTypes lookup with Object.hasOwn so an external name like
|
|
252
|
+
// "constructor" can't resolve to an inherited Object.prototype member.
|
|
253
|
+
const mediaType = Object.hasOwn(this.outputTypes, name)
|
|
254
|
+
? normalizeMediaOutputType(this.outputTypes[name])
|
|
255
|
+
: null;
|
|
256
|
+
// The ref the worker sent for this slot, when it sent one. Rebuilding a
|
|
257
|
+
// bare {uri, type} from the media kind drops everything else it carried —
|
|
258
|
+
// a VideoRef's duration and format, a Model3DRef's material_file and
|
|
259
|
+
// texture_files, which are what make the asset renderable.
|
|
260
|
+
// Guarded with Object.hasOwn for the same reason the outputTypes lookup
|
|
261
|
+
// is: a blob named "__proto__" would otherwise read Object.prototype and
|
|
262
|
+
// spread its members into the output.
|
|
263
|
+
const ref = Object.hasOwn(result.outputs, name)
|
|
264
|
+
? carriedRef(result.outputs[name])
|
|
265
|
+
: null;
|
|
190
266
|
if (mediaType && context?.storage) {
|
|
191
|
-
const
|
|
192
|
-
const
|
|
267
|
+
const format = refFormat(ref);
|
|
268
|
+
const ext = format ? `.${format}` : (EXTENSION_MAP[mediaType] ?? "");
|
|
269
|
+
const contentType = (format ? FORMAT_MIME_MAP[format] : undefined) ?? MIME_MAP[mediaType];
|
|
193
270
|
const storageKey = `python-bridge/${randomUUID()}${ext}`;
|
|
194
271
|
const uri = await context.storage.store(storageKey, blobData, contentType);
|
|
195
|
-
outputs[name] = { uri, type: mediaType };
|
|
272
|
+
outputs[name] = { ...ref, uri, type: mediaType };
|
|
273
|
+
// The payload is the blob, now at `uri`. A ref that also carries bytes
|
|
274
|
+
// would duplicate a megabyte-scale payload downstream, so drop them —
|
|
275
|
+
// tested by value, since an inline non-binary payload (a dataframe's
|
|
276
|
+
// rows) is content and must survive.
|
|
277
|
+
if (ref && isBinaryPayload(ref["data"])) {
|
|
278
|
+
delete outputs[name]["data"];
|
|
279
|
+
}
|
|
280
|
+
}
|
|
281
|
+
else if (mediaType) {
|
|
282
|
+
// No storage adapter available: keep the bytes inline but preserve the
|
|
283
|
+
// media kind so downstream nodes receive a typed ref (e.g. ImageRef),
|
|
284
|
+
// not a bare Uint8Array.
|
|
285
|
+
outputs[name] = { ...ref, type: mediaType, data: blobData };
|
|
196
286
|
}
|
|
197
287
|
else {
|
|
198
288
|
outputs[name] = blobData;
|
|
@@ -202,7 +292,8 @@ export class PythonNodeExecutor {
|
|
|
202
292
|
}
|
|
203
293
|
async process(inputs, context) {
|
|
204
294
|
const { fields, blobs, secrets } = await this.prepareExecution(inputs, context);
|
|
205
|
-
|
|
295
|
+
log.info("Python node executor calling bridge", { nodeType: this.nodeType });
|
|
296
|
+
const result = await this.bridge.execute(this.nodeType, fields, secrets, blobs, this.progressHandler(context), this.identity(context));
|
|
206
297
|
return this.materializeOutputs(result, context);
|
|
207
298
|
}
|
|
208
299
|
async *genProcess(inputs, context) {
|
|
@@ -211,7 +302,7 @@ export class PythonNodeExecutor {
|
|
|
211
302
|
return;
|
|
212
303
|
}
|
|
213
304
|
const { fields, blobs, secrets } = await this.prepareExecution(inputs, context);
|
|
214
|
-
for await (const partial of this.bridge.executeStream(this.nodeType, fields, secrets, blobs,
|
|
305
|
+
for await (const partial of this.bridge.executeStream(this.nodeType, fields, secrets, blobs, this.progressHandler(context), this.identity(context))) {
|
|
215
306
|
yield await this.materializeOutputs(partial, context);
|
|
216
307
|
}
|
|
217
308
|
}
|