@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
|
@@ -0,0 +1,157 @@
|
|
|
1
|
+
import { sseEvents } from "./sse.js";
|
|
2
|
+
import { OpenAICompatError, errorFromOkBody, errorFromResponse, errorFromStreamEvent } from "./errors.js";
|
|
3
|
+
import { isObjectLike } from "@nodetool-ai/protocol";
|
|
4
|
+
const RETRYABLE_STATUS = new Set([408, 409, 429]);
|
|
5
|
+
const DEFAULT_MAX_RETRIES = 2;
|
|
6
|
+
const DEFAULT_TIMEOUT_MS = 600_000;
|
|
7
|
+
export function trimTrailingSlashes(url) {
|
|
8
|
+
// A loop, not `replace(/\/+$/,"")` — the regex backtracks polynomially on
|
|
9
|
+
// adversarial input.
|
|
10
|
+
let end = url.length;
|
|
11
|
+
while (end > 0 && url[end - 1] === "/")
|
|
12
|
+
end -= 1;
|
|
13
|
+
return url.slice(0, end);
|
|
14
|
+
}
|
|
15
|
+
function isRetryableStatus(status) {
|
|
16
|
+
return RETRYABLE_STATUS.has(status) || status >= 500;
|
|
17
|
+
}
|
|
18
|
+
/** `Retry-After` seconds when present and sane (0–60s), else null. */
|
|
19
|
+
function retryAfterMs(response) {
|
|
20
|
+
const header = response.headers.get("retry-after");
|
|
21
|
+
if (!header)
|
|
22
|
+
return null;
|
|
23
|
+
const seconds = Number(header);
|
|
24
|
+
if (Number.isFinite(seconds) && seconds >= 0 && seconds <= 60) {
|
|
25
|
+
return seconds * 1000;
|
|
26
|
+
}
|
|
27
|
+
const dateMs = Date.parse(header);
|
|
28
|
+
if (!Number.isNaN(dateMs)) {
|
|
29
|
+
const delta = dateMs - Date.now();
|
|
30
|
+
if (delta > 0 && delta <= 60_000)
|
|
31
|
+
return delta;
|
|
32
|
+
}
|
|
33
|
+
return null;
|
|
34
|
+
}
|
|
35
|
+
function sleep(ms) {
|
|
36
|
+
return new Promise((resolve) => setTimeout(resolve, ms));
|
|
37
|
+
}
|
|
38
|
+
function backoffMs(attempt) {
|
|
39
|
+
const base = Math.min(500 * 2 ** attempt, 8000);
|
|
40
|
+
return base * (0.75 + Math.random() * 0.5);
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* Minimal typed client for OpenAI-compatible `/chat/completions` endpoints,
|
|
44
|
+
* built on `fetch`. Replaces the `openai` npm package for providers that only
|
|
45
|
+
* ever used it as a generic HTTP client (Groq, Cerebras, xAI, Mistral, …).
|
|
46
|
+
*/
|
|
47
|
+
export class OpenAICompatClient {
|
|
48
|
+
baseURL;
|
|
49
|
+
_apiKey;
|
|
50
|
+
_defaultHeaders;
|
|
51
|
+
_fetch;
|
|
52
|
+
_maxRetries;
|
|
53
|
+
_timeoutMs;
|
|
54
|
+
constructor(options) {
|
|
55
|
+
this.baseURL = trimTrailingSlashes(options.baseURL);
|
|
56
|
+
this._apiKey = options.apiKey;
|
|
57
|
+
this._defaultHeaders = options.defaultHeaders ?? {};
|
|
58
|
+
this._fetch = options.fetchFn ?? globalThis.fetch.bind(globalThis);
|
|
59
|
+
this._maxRetries = options.maxRetries ?? DEFAULT_MAX_RETRIES;
|
|
60
|
+
this._timeoutMs = options.timeoutMs ?? DEFAULT_TIMEOUT_MS;
|
|
61
|
+
}
|
|
62
|
+
headers(streaming) {
|
|
63
|
+
return {
|
|
64
|
+
Authorization: `Bearer ${this._apiKey}`,
|
|
65
|
+
"Content-Type": "application/json",
|
|
66
|
+
Accept: streaming ? "text/event-stream" : "application/json",
|
|
67
|
+
...this._defaultHeaders
|
|
68
|
+
};
|
|
69
|
+
}
|
|
70
|
+
/**
|
|
71
|
+
* POST with retries. Retries fire only before any body is consumed, so both
|
|
72
|
+
* the non-streaming call and the streaming connection setup are covered.
|
|
73
|
+
* Non-2xx responses (after retries) surface as {@link OpenAICompatError}.
|
|
74
|
+
*/
|
|
75
|
+
async post(path, body, streaming, options) {
|
|
76
|
+
const url = `${this.baseURL}${path}`;
|
|
77
|
+
const payload = JSON.stringify(body);
|
|
78
|
+
for (let attempt = 0;; attempt++) {
|
|
79
|
+
options.signal?.throwIfAborted();
|
|
80
|
+
const timeout = AbortSignal.timeout(this._timeoutMs);
|
|
81
|
+
const signal = options.signal
|
|
82
|
+
? AbortSignal.any([options.signal, timeout])
|
|
83
|
+
: timeout;
|
|
84
|
+
let response;
|
|
85
|
+
try {
|
|
86
|
+
response = await this._fetch(url, {
|
|
87
|
+
method: "POST",
|
|
88
|
+
headers: this.headers(streaming),
|
|
89
|
+
body: payload,
|
|
90
|
+
signal
|
|
91
|
+
});
|
|
92
|
+
}
|
|
93
|
+
catch (error) {
|
|
94
|
+
// Abort by the caller is never retried; network errors and timeouts are.
|
|
95
|
+
if (options.signal?.aborted)
|
|
96
|
+
throw error;
|
|
97
|
+
if (attempt >= this._maxRetries)
|
|
98
|
+
throw error;
|
|
99
|
+
await sleep(backoffMs(attempt));
|
|
100
|
+
continue;
|
|
101
|
+
}
|
|
102
|
+
if (response.ok)
|
|
103
|
+
return response;
|
|
104
|
+
const detail = await response.text().catch(() => "");
|
|
105
|
+
if (attempt < this._maxRetries && isRetryableStatus(response.status)) {
|
|
106
|
+
await sleep(retryAfterMs(response) ?? backoffMs(attempt));
|
|
107
|
+
continue;
|
|
108
|
+
}
|
|
109
|
+
throw errorFromResponse(response.status, detail);
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
/**
|
|
113
|
+
* Non-streaming chat completion.
|
|
114
|
+
*
|
|
115
|
+
* A 200 is not proof of success: a gateway that routes to an upstream
|
|
116
|
+
* provider answers 200 and reports a later failure inside the body, so the
|
|
117
|
+
* body is checked for an `error` before it is handed back as a completion.
|
|
118
|
+
*/
|
|
119
|
+
async chatCompletions(request, options = {}) {
|
|
120
|
+
const response = await this.post("/chat/completions", { ...request, stream: false }, false, options);
|
|
121
|
+
const body = await response.json();
|
|
122
|
+
const error = errorFromOkBody(body);
|
|
123
|
+
if (error)
|
|
124
|
+
throw error;
|
|
125
|
+
return body;
|
|
126
|
+
}
|
|
127
|
+
/**
|
|
128
|
+
* Streaming chat completion. Yields parsed SSE chunks until the `[DONE]`
|
|
129
|
+
* sentinel (or end of stream). Mid-stream `{"error": …}` events throw an
|
|
130
|
+
* {@link OpenAICompatError}.
|
|
131
|
+
*/
|
|
132
|
+
async *chatCompletionsStream(request, options = {}) {
|
|
133
|
+
const response = await this.post("/chat/completions", { ...request, stream: true }, true, options);
|
|
134
|
+
if (!response.body) {
|
|
135
|
+
throw new OpenAICompatError(response.status, "streaming response has no body");
|
|
136
|
+
}
|
|
137
|
+
for await (const data of sseEvents(response.body)) {
|
|
138
|
+
if (data === "[DONE]")
|
|
139
|
+
return;
|
|
140
|
+
let parsed;
|
|
141
|
+
try {
|
|
142
|
+
parsed = JSON.parse(data);
|
|
143
|
+
}
|
|
144
|
+
catch {
|
|
145
|
+
throw new OpenAICompatError(undefined, `could not parse stream event as JSON: ${data.slice(0, 200)}`);
|
|
146
|
+
}
|
|
147
|
+
if (!isObjectLike(parsed))
|
|
148
|
+
continue;
|
|
149
|
+
const event = parsed;
|
|
150
|
+
const error = errorFromStreamEvent(event);
|
|
151
|
+
if (error)
|
|
152
|
+
throw error;
|
|
153
|
+
yield event;
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
//# sourceMappingURL=client.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"client.js","sourceRoot":"","sources":["../../../src/providers/openai-compat/client.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Response decoding for the OpenAI Chat Completions dialect.
|
|
3
|
+
*
|
|
4
|
+
* Split out of {@link OpenAICompatProvider} so one function owns the step from
|
|
5
|
+
* a raw `POST /chat/completions` body to the fields NodeTool reads. The live
|
|
6
|
+
* contract probe and the checked-in raw-response fixtures
|
|
7
|
+
* (`packages/runtime/tests/fixtures/provider-contract/`) run this same
|
|
8
|
+
* function, so a wire change shows up here rather than in a provider method no
|
|
9
|
+
* test can reach without a network call.
|
|
10
|
+
*/
|
|
11
|
+
import type { ChatCompletionUsage } from "./types.js";
|
|
12
|
+
/** One tool call as it arrives on the wire, before NodeTool normalizes it. */
|
|
13
|
+
export interface DecodedToolCall {
|
|
14
|
+
id: string;
|
|
15
|
+
name: string;
|
|
16
|
+
/** Raw JSON argument string; absent when the gateway omitted it. */
|
|
17
|
+
arguments?: string;
|
|
18
|
+
}
|
|
19
|
+
export interface DecodedChatCompletion {
|
|
20
|
+
content: string | null;
|
|
21
|
+
/** Undefined when the response carried no `tool_calls` field at all. */
|
|
22
|
+
toolCalls: DecodedToolCall[] | undefined;
|
|
23
|
+
finishReason: string | null;
|
|
24
|
+
usage: {
|
|
25
|
+
inputTokens: number;
|
|
26
|
+
outputTokens: number;
|
|
27
|
+
cachedTokens: number;
|
|
28
|
+
} | null;
|
|
29
|
+
}
|
|
30
|
+
export declare function decodeChatCompletionUsage(usage: ChatCompletionUsage | null | undefined): DecodedChatCompletion["usage"];
|
|
31
|
+
/**
|
|
32
|
+
* Decode a non-streaming chat completion body. Throws when the envelope
|
|
33
|
+
* carries no choice — the one shape the caller cannot turn into a message.
|
|
34
|
+
*/
|
|
35
|
+
export declare function decodeChatCompletion(body: unknown): DecodedChatCompletion;
|
|
36
|
+
//# sourceMappingURL=decode.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"decode.d.ts","sourceRoot":"","sources":["../../../src/providers/openai-compat/decode.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAGH,OAAO,KAAK,EAEV,mBAAmB,EACpB,MAAM,YAAY,CAAC;AAEpB,8EAA8E;AAC9E,MAAM,WAAW,eAAe;IAC9B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,oEAAoE;IACpE,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,qBAAqB;IACpC,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,wEAAwE;IACxE,SAAS,EAAE,eAAe,EAAE,GAAG,SAAS,CAAC;IACzC,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,KAAK,EAAE;QAAE,WAAW,EAAE,MAAM,CAAC;QAAC,YAAY,EAAE,MAAM,CAAC;QAAC,YAAY,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI,CAAC;CACnF;AAED,wBAAgB,yBAAyB,CACvC,KAAK,EAAE,mBAAmB,GAAG,IAAI,GAAG,SAAS,GAC5C,qBAAqB,CAAC,OAAO,CAAC,CAOhC;AAED;;;GAGG;AACH,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,OAAO,GAAG,qBAAqB,CA8BzE"}
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Response decoding for the OpenAI Chat Completions dialect.
|
|
3
|
+
*
|
|
4
|
+
* Split out of {@link OpenAICompatProvider} so one function owns the step from
|
|
5
|
+
* a raw `POST /chat/completions` body to the fields NodeTool reads. The live
|
|
6
|
+
* contract probe and the checked-in raw-response fixtures
|
|
7
|
+
* (`packages/runtime/tests/fixtures/provider-contract/`) run this same
|
|
8
|
+
* function, so a wire change shows up here rather than in a provider method no
|
|
9
|
+
* test can reach without a network call.
|
|
10
|
+
*/
|
|
11
|
+
import { isObjectLike } from "@nodetool-ai/protocol";
|
|
12
|
+
export function decodeChatCompletionUsage(usage) {
|
|
13
|
+
if (!usage)
|
|
14
|
+
return null;
|
|
15
|
+
return {
|
|
16
|
+
inputTokens: usage.prompt_tokens ?? 0,
|
|
17
|
+
outputTokens: usage.completion_tokens ?? 0,
|
|
18
|
+
cachedTokens: usage.prompt_tokens_details?.cached_tokens ?? 0
|
|
19
|
+
};
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* Decode a non-streaming chat completion body. Throws when the envelope
|
|
23
|
+
* carries no choice — the one shape the caller cannot turn into a message.
|
|
24
|
+
*/
|
|
25
|
+
export function decodeChatCompletion(body) {
|
|
26
|
+
if (!isObjectLike(body)) {
|
|
27
|
+
throw new Error("chat completion response is not an object");
|
|
28
|
+
}
|
|
29
|
+
const completion = body;
|
|
30
|
+
const choice = completion.choices?.[0];
|
|
31
|
+
if (!choice) {
|
|
32
|
+
throw new Error("chat completion response has no choices");
|
|
33
|
+
}
|
|
34
|
+
const message = choice.message;
|
|
35
|
+
// Keep function calls, and entries with no `type` at all — some gateways
|
|
36
|
+
// omit it (the wire type marks `type` optional). The streaming path
|
|
37
|
+
// likewise accepts every tool-call delta. Only drop entries that explicitly
|
|
38
|
+
// declare a non-function type.
|
|
39
|
+
const toolCalls = !Array.isArray(message?.tool_calls)
|
|
40
|
+
? undefined
|
|
41
|
+
: message.tool_calls
|
|
42
|
+
.filter((tc) => tc.type === "function" || tc.type === undefined)
|
|
43
|
+
.map((tc) => ({
|
|
44
|
+
id: String(tc.id ?? ""),
|
|
45
|
+
name: String(tc.function?.name ?? ""),
|
|
46
|
+
arguments: tc.function?.arguments ?? undefined
|
|
47
|
+
}));
|
|
48
|
+
return {
|
|
49
|
+
content: message?.content ?? null,
|
|
50
|
+
toolCalls,
|
|
51
|
+
finishReason: choice.finish_reason ?? null,
|
|
52
|
+
usage: decodeChatCompletionUsage(completion.usage)
|
|
53
|
+
};
|
|
54
|
+
}
|
|
55
|
+
//# sourceMappingURL=decode.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"decode.js","sourceRoot":"","sources":["../../../src/providers/openai-compat/decode.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AAsBrD,MAAM,UAAU,yBAAyB,CACvC,KAA6C;IAE7C,IAAI,CAAC,KAAK;QAAE,OAAO,IAAI,CAAC;IACxB,OAAO;QACL,WAAW,EAAE,KAAK,CAAC,aAAa,IAAI,CAAC;QACrC,YAAY,EAAE,KAAK,CAAC,iBAAiB,IAAI,CAAC;QAC1C,YAAY,EAAE,KAAK,CAAC,qBAAqB,EAAE,aAAa,IAAI,CAAC;KAC9D,CAAC;AACJ,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,oBAAoB,CAAC,IAAa;IAChD,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,EAAE,CAAC;QACxB,MAAM,IAAI,KAAK,CAAC,2CAA2C,CAAC,CAAC;IAC/D,CAAC;IACD,MAAM,UAAU,GAAG,IAA8B,CAAC;IAClD,MAAM,MAAM,GAAG,UAAU,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,CAAC;IACvC,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,MAAM,IAAI,KAAK,CAAC,yCAAyC,CAAC,CAAC;IAC7D,CAAC;IACD,MAAM,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC;IAC/B,yEAAyE;IACzE,oEAAoE;IACpE,4EAA4E;IAC5E,+BAA+B;IAC/B,MAAM,SAAS,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC,OAAO,EAAE,UAAU,CAAC;QACnD,CAAC,CAAC,SAAS;QACX,CAAC,CAAC,OAAO,CAAC,UAAU;aACf,MAAM,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,IAAI,KAAK,UAAU,IAAI,EAAE,CAAC,IAAI,KAAK,SAAS,CAAC;aAC/D,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC;YACZ,EAAE,EAAE,MAAM,CAAC,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC;YACvB,IAAI,EAAE,MAAM,CAAC,EAAE,CAAC,QAAQ,EAAE,IAAI,IAAI,EAAE,CAAC;YACrC,SAAS,EAAE,EAAE,CAAC,QAAQ,EAAE,SAAS,IAAI,SAAS;SAC/C,CAAC,CAAC,CAAC;IAEV,OAAO;QACL,OAAO,EAAE,OAAO,EAAE,OAAO,IAAI,IAAI;QACjC,SAAS;QACT,YAAY,EAAE,MAAM,CAAC,aAAa,IAAI,IAAI;QAC1C,KAAK,EAAE,yBAAyB,CAAC,UAAU,CAAC,KAAK,CAAC;KACnD,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
export declare class OpenAICompatError extends Error {
|
|
2
|
+
/** HTTP status; `undefined` for mid-stream error events with no status. */
|
|
3
|
+
readonly status: number | undefined;
|
|
4
|
+
readonly code: string | null;
|
|
5
|
+
readonly type: string | null;
|
|
6
|
+
readonly param: string | null;
|
|
7
|
+
/** The parsed error body (or raw text when not JSON). */
|
|
8
|
+
readonly body: unknown;
|
|
9
|
+
constructor(status: number | undefined, message: string, details?: {
|
|
10
|
+
code?: string | null;
|
|
11
|
+
type?: string | null;
|
|
12
|
+
param?: string | null;
|
|
13
|
+
body?: unknown;
|
|
14
|
+
});
|
|
15
|
+
}
|
|
16
|
+
interface ParsedErrorBody {
|
|
17
|
+
message: string;
|
|
18
|
+
code: string | null;
|
|
19
|
+
type: string | null;
|
|
20
|
+
param: string | null;
|
|
21
|
+
body: unknown;
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* Extract the human-readable message (and code/type/param) from an
|
|
25
|
+
* OpenAI-style error payload: `{"error": {"message": …, "code": …}}`, a
|
|
26
|
+
* top-level `{"message": …}`, or plain text.
|
|
27
|
+
*/
|
|
28
|
+
export declare function parseErrorBody(text: string): ParsedErrorBody;
|
|
29
|
+
/** Map a non-2xx HTTP response body to an {@link OpenAICompatError}. */
|
|
30
|
+
export declare function errorFromResponse(status: number, bodyText: string): OpenAICompatError;
|
|
31
|
+
/**
|
|
32
|
+
* Map a mid-stream SSE error event to an {@link OpenAICompatError}. Returns
|
|
33
|
+
* `null` when the event is not an error.
|
|
34
|
+
*
|
|
35
|
+
* The error rides at the top level (`{"error": {...}}`) or inside the first
|
|
36
|
+
* choice — OpenRouter reports a failure that happens after the stream opened
|
|
37
|
+
* as a `finish_reason: "error"` choice, because the 200 status is already on
|
|
38
|
+
* the wire by then.
|
|
39
|
+
*/
|
|
40
|
+
export declare function errorFromStreamEvent(event: Record<string, unknown>): OpenAICompatError | null;
|
|
41
|
+
/**
|
|
42
|
+
* Map an error carried by a *successful* (HTTP 200) chat-completion body to an
|
|
43
|
+
* {@link OpenAICompatError}. Returns `null` for an ordinary completion.
|
|
44
|
+
*
|
|
45
|
+
* A gateway that has already committed a 200 cannot report a later failure in
|
|
46
|
+
* the status, so it reports it in the body instead — OpenRouter's API
|
|
47
|
+
* reference says to check the body for an `error` field even on a 200 rather
|
|
48
|
+
* than relying on the status alone. Without this the body reaches
|
|
49
|
+
* {@link decodeChatCompletion}, which sees no `choices` and answers "no
|
|
50
|
+
* choices" — a diagnosis that names neither the endpoint nor the reason.
|
|
51
|
+
*/
|
|
52
|
+
export declare function errorFromOkBody(body: unknown): OpenAICompatError | null;
|
|
53
|
+
export {};
|
|
54
|
+
//# sourceMappingURL=errors.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../../../src/providers/openai-compat/errors.ts"],"names":[],"mappings":"AAUA,qBAAa,iBAAkB,SAAQ,KAAK;IAC1C,2EAA2E;IAC3E,QAAQ,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC;IACpC,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,QAAQ,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9B,yDAAyD;IACzD,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC;IAEvB,YACE,MAAM,EAAE,MAAM,GAAG,SAAS,EAC1B,OAAO,EAAE,MAAM,EACf,OAAO,GAAE;QACP,IAAI,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;QACrB,IAAI,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;QACrB,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;QACtB,IAAI,CAAC,EAAE,OAAO,CAAC;KACX,EASP;CACF;AAED,UAAU,eAAe;IACvB,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IACpB,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IACpB,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,IAAI,EAAE,OAAO,CAAC;CACf;AAUD;;;;GAIG;AACH,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,eAAe,CAuB5D;AAED,wEAAwE;AACxE,wBAAgB,iBAAiB,CAC/B,MAAM,EAAE,MAAM,EACd,QAAQ,EAAE,MAAM,GACf,iBAAiB,CAGnB;AAsDD;;;;;;;;GAQG;AACH,wBAAgB,oBAAoB,CAClC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC7B,iBAAiB,GAAG,IAAI,CAK1B;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,eAAe,CAAC,IAAI,EAAE,OAAO,GAAG,iBAAiB,GAAG,IAAI,CAMvE"}
|
|
@@ -0,0 +1,144 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Typed error for OpenAI-compatible HTTP endpoints.
|
|
3
|
+
*
|
|
4
|
+
* The message deliberately mirrors the `openai` SDK's `APIError` format —
|
|
5
|
+
* `"<status> <upstream message>"` — because callers classify failures by
|
|
6
|
+
* matching on `String(error)` (BaseProvider.isRateLimitError looks for `429` /
|
|
7
|
+
* "rate limit", isContextLengthError for "context length", …).
|
|
8
|
+
*/
|
|
9
|
+
import { isNumber, isString } from "@nodetool-ai/protocol";
|
|
10
|
+
export class OpenAICompatError extends Error {
|
|
11
|
+
/** HTTP status; `undefined` for mid-stream error events with no status. */
|
|
12
|
+
status;
|
|
13
|
+
code;
|
|
14
|
+
type;
|
|
15
|
+
param;
|
|
16
|
+
/** The parsed error body (or raw text when not JSON). */
|
|
17
|
+
body;
|
|
18
|
+
constructor(status, message, details = {}) {
|
|
19
|
+
super(status === undefined ? message : `${status} ${message}`);
|
|
20
|
+
this.name = "OpenAICompatError";
|
|
21
|
+
this.status = status;
|
|
22
|
+
this.code = details.code ?? null;
|
|
23
|
+
this.type = details.type ?? null;
|
|
24
|
+
this.param = details.param ?? null;
|
|
25
|
+
this.body = details.body;
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
function isRecord(value) {
|
|
29
|
+
return typeof value === "object" && value !== null && !Array.isArray(value);
|
|
30
|
+
}
|
|
31
|
+
function stringOrNull(value) {
|
|
32
|
+
return isString(value) ? value : null;
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* Extract the human-readable message (and code/type/param) from an
|
|
36
|
+
* OpenAI-style error payload: `{"error": {"message": …, "code": …}}`, a
|
|
37
|
+
* top-level `{"message": …}`, or plain text.
|
|
38
|
+
*/
|
|
39
|
+
export function parseErrorBody(text) {
|
|
40
|
+
let parsed;
|
|
41
|
+
try {
|
|
42
|
+
parsed = JSON.parse(text);
|
|
43
|
+
}
|
|
44
|
+
catch {
|
|
45
|
+
return { message: text, code: null, type: null, param: null, body: text };
|
|
46
|
+
}
|
|
47
|
+
const root = isRecord(parsed) ? parsed : {};
|
|
48
|
+
const err = isRecord(root.error) ? root.error : root;
|
|
49
|
+
const message = stringOrNull(err.message) ??
|
|
50
|
+
(isString(root.error) ? root.error : null) ??
|
|
51
|
+
text;
|
|
52
|
+
return {
|
|
53
|
+
message,
|
|
54
|
+
code: stringOrNull(err.code) ?? (isNumber(err.code) ? String(err.code) : null),
|
|
55
|
+
type: stringOrNull(err.type),
|
|
56
|
+
param: stringOrNull(err.param),
|
|
57
|
+
body: parsed
|
|
58
|
+
};
|
|
59
|
+
}
|
|
60
|
+
/** Map a non-2xx HTTP response body to an {@link OpenAICompatError}. */
|
|
61
|
+
export function errorFromResponse(status, bodyText) {
|
|
62
|
+
const parsed = parseErrorBody(bodyText);
|
|
63
|
+
return new OpenAICompatError(status, parsed.message, parsed);
|
|
64
|
+
}
|
|
65
|
+
/**
|
|
66
|
+
* Map one `error` value — wherever it sat in the payload — to an
|
|
67
|
+
* {@link OpenAICompatError}. `payload` is the whole body or event, kept for
|
|
68
|
+
* the error's `body` so a caller logging the failure sees what arrived.
|
|
69
|
+
* Returns `null` when `err` is absent or not an error shape.
|
|
70
|
+
*/
|
|
71
|
+
function errorFromErrorValue(err, payload, fallbackMessage) {
|
|
72
|
+
if (err === undefined || err === null)
|
|
73
|
+
return null;
|
|
74
|
+
if (isString(err)) {
|
|
75
|
+
return new OpenAICompatError(undefined, err, { body: payload });
|
|
76
|
+
}
|
|
77
|
+
if (!isRecord(err))
|
|
78
|
+
return null;
|
|
79
|
+
const message = stringOrNull(err.message) ?? fallbackMessage;
|
|
80
|
+
// A numeric `code` is the HTTP status on a gateway that reports the failure
|
|
81
|
+
// in a 200 body (OpenRouter mirrors the status there). Taking it as the
|
|
82
|
+
// status is what keeps `BaseProvider.isRateLimitError` — which matches on
|
|
83
|
+
// `String(error)` — working for a 429 that never reached the status line.
|
|
84
|
+
const codeStatus = isNumber(err.code) && err.code >= 100 && err.code <= 599
|
|
85
|
+
? err.code
|
|
86
|
+
: undefined;
|
|
87
|
+
const status = isNumber(err.status)
|
|
88
|
+
? err.status
|
|
89
|
+
: isNumber(err.http_status)
|
|
90
|
+
? err.http_status
|
|
91
|
+
: codeStatus;
|
|
92
|
+
return new OpenAICompatError(status, message, {
|
|
93
|
+
code: stringOrNull(err.code) ?? (isNumber(err.code) ? String(err.code) : null),
|
|
94
|
+
type: stringOrNull(err.type),
|
|
95
|
+
param: stringOrNull(err.param),
|
|
96
|
+
body: payload
|
|
97
|
+
});
|
|
98
|
+
}
|
|
99
|
+
/** The `error` carried by the payload's first choice, if any. */
|
|
100
|
+
function choiceError(payload) {
|
|
101
|
+
const choices = payload.choices;
|
|
102
|
+
if (!Array.isArray(choices))
|
|
103
|
+
return undefined;
|
|
104
|
+
const choice = choices[0];
|
|
105
|
+
if (!isRecord(choice))
|
|
106
|
+
return undefined;
|
|
107
|
+
// Streaming puts it on the delta on some gateways, non-streaming on the
|
|
108
|
+
// choice itself; the choice's own field wins when both are present.
|
|
109
|
+
if (choice.error !== undefined && choice.error !== null)
|
|
110
|
+
return choice.error;
|
|
111
|
+
const delta = choice.delta;
|
|
112
|
+
return isRecord(delta) ? delta.error : undefined;
|
|
113
|
+
}
|
|
114
|
+
/**
|
|
115
|
+
* Map a mid-stream SSE error event to an {@link OpenAICompatError}. Returns
|
|
116
|
+
* `null` when the event is not an error.
|
|
117
|
+
*
|
|
118
|
+
* The error rides at the top level (`{"error": {...}}`) or inside the first
|
|
119
|
+
* choice — OpenRouter reports a failure that happens after the stream opened
|
|
120
|
+
* as a `finish_reason: "error"` choice, because the 200 status is already on
|
|
121
|
+
* the wire by then.
|
|
122
|
+
*/
|
|
123
|
+
export function errorFromStreamEvent(event) {
|
|
124
|
+
return (errorFromErrorValue(event.error, event, "stream error") ??
|
|
125
|
+
errorFromErrorValue(choiceError(event), event, "stream error"));
|
|
126
|
+
}
|
|
127
|
+
/**
|
|
128
|
+
* Map an error carried by a *successful* (HTTP 200) chat-completion body to an
|
|
129
|
+
* {@link OpenAICompatError}. Returns `null` for an ordinary completion.
|
|
130
|
+
*
|
|
131
|
+
* A gateway that has already committed a 200 cannot report a later failure in
|
|
132
|
+
* the status, so it reports it in the body instead — OpenRouter's API
|
|
133
|
+
* reference says to check the body for an `error` field even on a 200 rather
|
|
134
|
+
* than relying on the status alone. Without this the body reaches
|
|
135
|
+
* {@link decodeChatCompletion}, which sees no `choices` and answers "no
|
|
136
|
+
* choices" — a diagnosis that names neither the endpoint nor the reason.
|
|
137
|
+
*/
|
|
138
|
+
export function errorFromOkBody(body) {
|
|
139
|
+
if (!isRecord(body))
|
|
140
|
+
return null;
|
|
141
|
+
return (errorFromErrorValue(body.error, body, "chat completion failed") ??
|
|
142
|
+
errorFromErrorValue(choiceError(body), body, "chat completion failed"));
|
|
143
|
+
}
|
|
144
|
+
//# sourceMappingURL=errors.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"errors.js","sourceRoot":"","sources":["../../../src/providers/openai-compat/errors.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
export { OpenAICompatClient, trimTrailingSlashes } from "./client.js";
|
|
2
|
+
export type { OpenAICompatClientOptions, RequestOptions } from "./client.js";
|
|
3
|
+
export { OpenAICompatError, errorFromOkBody, errorFromResponse, errorFromStreamEvent, parseErrorBody } from "./errors.js";
|
|
4
|
+
export { sseEvents } from "./sse.js";
|
|
5
|
+
export { decodeChatCompletion, decodeChatCompletionUsage } from "./decode.js";
|
|
6
|
+
export type { DecodedChatCompletion, DecodedToolCall } from "./decode.js";
|
|
7
|
+
export type { ChatCompletionsRequest, ChatCompletionResponse, ChatCompletionChunk, ChatCompletionChunkChoice, ChatCompletionChunkDelta, ChatCompletionChunkDeltaToolCall, ChatCompletionChoice, ChatCompletionAssistantMessage, ChatCompletionMessageToolCall, ChatCompletionToolCallFunction, ChatCompletionUsage } from "./types.js";
|
|
8
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/providers/openai-compat/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAC;AACtE,YAAY,EACV,yBAAyB,EACzB,cAAc,EACf,MAAM,aAAa,CAAC;AACrB,OAAO,EACL,iBAAiB,EACjB,eAAe,EACf,iBAAiB,EACjB,oBAAoB,EACpB,cAAc,EACf,MAAM,aAAa,CAAC;AACrB,OAAO,EAAE,SAAS,EAAE,MAAM,UAAU,CAAC;AACrC,OAAO,EACL,oBAAoB,EACpB,yBAAyB,EAC1B,MAAM,aAAa,CAAC;AACrB,YAAY,EACV,qBAAqB,EACrB,eAAe,EAChB,MAAM,aAAa,CAAC;AACrB,YAAY,EACV,sBAAsB,EACtB,sBAAsB,EACtB,mBAAmB,EACnB,yBAAyB,EACzB,wBAAwB,EACxB,gCAAgC,EAChC,oBAAoB,EACpB,8BAA8B,EAC9B,6BAA6B,EAC7B,8BAA8B,EAC9B,mBAAmB,EACpB,MAAM,YAAY,CAAC"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
export { OpenAICompatClient, trimTrailingSlashes } from "./client.js";
|
|
2
|
+
export { OpenAICompatError, errorFromOkBody, errorFromResponse, errorFromStreamEvent, parseErrorBody } from "./errors.js";
|
|
3
|
+
export { sseEvents } from "./sse.js";
|
|
4
|
+
export { decodeChatCompletion, decodeChatCompletionUsage } from "./decode.js";
|
|
5
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/providers/openai-compat/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAC;AAKtE,OAAO,EACL,iBAAiB,EACjB,eAAe,EACf,iBAAiB,EACjB,oBAAoB,EACpB,cAAc,EACf,MAAM,aAAa,CAAC;AACrB,OAAO,EAAE,SAAS,EAAE,MAAM,UAAU,CAAC;AACrC,OAAO,EACL,oBAAoB,EACpB,yBAAyB,EAC1B,MAAM,aAAa,CAAC"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Minimal Server-Sent Events parser for OpenAI-style streaming responses.
|
|
3
|
+
*
|
|
4
|
+
* Yields the joined `data:` payload of each event. Handles the parts of the
|
|
5
|
+
* SSE spec that OpenAI-compatible gateways actually exercise:
|
|
6
|
+
* - events separated by blank lines, with LF or CRLF line endings
|
|
7
|
+
* - events and lines split across arbitrary network-chunk boundaries
|
|
8
|
+
* - multiple `data:` lines per event (joined with `\n`)
|
|
9
|
+
* - comment lines (`:`) and non-data fields (`event:`, `id:`, …) are ignored
|
|
10
|
+
* - a final unterminated event is flushed at end-of-stream (some gateways
|
|
11
|
+
* close the connection right after `data: [DONE]` without a blank line)
|
|
12
|
+
*/
|
|
13
|
+
export declare function sseEvents(body: ReadableStream<Uint8Array>): AsyncGenerator<string, void, undefined>;
|
|
14
|
+
//# sourceMappingURL=sse.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sse.d.ts","sourceRoot":"","sources":["../../../src/providers/openai-compat/sse.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AACH,wBAAuB,SAAS,CAC9B,IAAI,EAAE,cAAc,CAAC,UAAU,CAAC,GAC/B,cAAc,CAAC,MAAM,EAAE,IAAI,EAAE,SAAS,CAAC,CAsDzC"}
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Minimal Server-Sent Events parser for OpenAI-style streaming responses.
|
|
3
|
+
*
|
|
4
|
+
* Yields the joined `data:` payload of each event. Handles the parts of the
|
|
5
|
+
* SSE spec that OpenAI-compatible gateways actually exercise:
|
|
6
|
+
* - events separated by blank lines, with LF or CRLF line endings
|
|
7
|
+
* - events and lines split across arbitrary network-chunk boundaries
|
|
8
|
+
* - multiple `data:` lines per event (joined with `\n`)
|
|
9
|
+
* - comment lines (`:`) and non-data fields (`event:`, `id:`, …) are ignored
|
|
10
|
+
* - a final unterminated event is flushed at end-of-stream (some gateways
|
|
11
|
+
* close the connection right after `data: [DONE]` without a blank line)
|
|
12
|
+
*/
|
|
13
|
+
export async function* sseEvents(body) {
|
|
14
|
+
const reader = body.getReader();
|
|
15
|
+
const decoder = new TextDecoder("utf-8");
|
|
16
|
+
let buffer = "";
|
|
17
|
+
let dataLines = [];
|
|
18
|
+
const takeEvent = () => {
|
|
19
|
+
if (dataLines.length === 0)
|
|
20
|
+
return null;
|
|
21
|
+
const event = dataLines.join("\n");
|
|
22
|
+
dataLines = [];
|
|
23
|
+
return event;
|
|
24
|
+
};
|
|
25
|
+
const consumeLine = (rawLine) => {
|
|
26
|
+
const line = rawLine.endsWith("\r") ? rawLine.slice(0, -1) : rawLine;
|
|
27
|
+
if (line === "") {
|
|
28
|
+
return takeEvent();
|
|
29
|
+
}
|
|
30
|
+
if (line.startsWith("data:")) {
|
|
31
|
+
const value = line.slice(5);
|
|
32
|
+
dataLines.push(value.startsWith(" ") ? value.slice(1) : value);
|
|
33
|
+
}
|
|
34
|
+
// Comments (":…") and other fields ("event:", "id:", "retry:") are ignored.
|
|
35
|
+
return null;
|
|
36
|
+
};
|
|
37
|
+
try {
|
|
38
|
+
for (;;) {
|
|
39
|
+
const { value, done } = await reader.read();
|
|
40
|
+
if (done)
|
|
41
|
+
break;
|
|
42
|
+
buffer += decoder.decode(value, { stream: true });
|
|
43
|
+
let newlineAt;
|
|
44
|
+
while ((newlineAt = buffer.indexOf("\n")) !== -1) {
|
|
45
|
+
const line = buffer.slice(0, newlineAt);
|
|
46
|
+
buffer = buffer.slice(newlineAt + 1);
|
|
47
|
+
const event = consumeLine(line);
|
|
48
|
+
if (event !== null)
|
|
49
|
+
yield event;
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
// Flush any decoder-buffered bytes and a trailing line without newline.
|
|
53
|
+
buffer += decoder.decode();
|
|
54
|
+
if (buffer !== "") {
|
|
55
|
+
const event = consumeLine(buffer);
|
|
56
|
+
if (event !== null)
|
|
57
|
+
yield event;
|
|
58
|
+
}
|
|
59
|
+
const trailing = takeEvent();
|
|
60
|
+
if (trailing !== null)
|
|
61
|
+
yield trailing;
|
|
62
|
+
}
|
|
63
|
+
finally {
|
|
64
|
+
// Stop the underlying connection if the consumer bails early.
|
|
65
|
+
await reader.cancel().catch(() => undefined);
|
|
66
|
+
reader.releaseLock();
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
//# sourceMappingURL=sse.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sse.js","sourceRoot":"","sources":["../../../src/providers/openai-compat/sse.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AACH,MAAM,CAAC,KAAK,SAAS,CAAC,CAAC,SAAS,CAC9B,IAAgC;IAEhC,MAAM,MAAM,GAAG,IAAI,CAAC,SAAS,EAAE,CAAC;IAChC,MAAM,OAAO,GAAG,IAAI,WAAW,CAAC,OAAO,CAAC,CAAC;IACzC,IAAI,MAAM,GAAG,EAAE,CAAC;IAChB,IAAI,SAAS,GAAa,EAAE,CAAC;IAE7B,MAAM,SAAS,GAAG,GAAkB,EAAE;QACpC,IAAI,SAAS,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO,IAAI,CAAC;QACxC,MAAM,KAAK,GAAG,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACnC,SAAS,GAAG,EAAE,CAAC;QACf,OAAO,KAAK,CAAC;IACf,CAAC,CAAC;IAEF,MAAM,WAAW,GAAG,CAAC,OAAe,EAAiB,EAAE;QACrD,MAAM,IAAI,GAAG,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC;QACrE,IAAI,IAAI,KAAK,EAAE,EAAE,CAAC;YAChB,OAAO,SAAS,EAAE,CAAC;QACrB,CAAC;QACD,IAAI,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC;YAC7B,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;YAC5B,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;QACjE,CAAC;QACD,4EAA4E;QAC5E,OAAO,IAAI,CAAC;IACd,CAAC,CAAC;IAEF,IAAI,CAAC;QACH,SAAS,CAAC;YACR,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,GAAG,MAAM,MAAM,CAAC,IAAI,EAAE,CAAC;YAC5C,IAAI,IAAI;gBAAE,MAAM;YAChB,MAAM,IAAI,OAAO,CAAC,MAAM,CAAC,KAAK,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC;YAElD,IAAI,SAAiB,CAAC;YACtB,OAAO,CAAC,SAAS,GAAG,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC;gBACjD,MAAM,IAAI,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,SAAS,CAAC,CAAC;gBACxC,MAAM,GAAG,MAAM,CAAC,KAAK,CAAC,SAAS,GAAG,CAAC,CAAC,CAAC;gBACrC,MAAM,KAAK,GAAG,WAAW,CAAC,IAAI,CAAC,CAAC;gBAChC,IAAI,KAAK,KAAK,IAAI;oBAAE,MAAM,KAAK,CAAC;YAClC,CAAC;QACH,CAAC;QAED,wEAAwE;QACxE,MAAM,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;QAC3B,IAAI,MAAM,KAAK,EAAE,EAAE,CAAC;YAClB,MAAM,KAAK,GAAG,WAAW,CAAC,MAAM,CAAC,CAAC;YAClC,IAAI,KAAK,KAAK,IAAI;gBAAE,MAAM,KAAK,CAAC;QAClC,CAAC;QACD,MAAM,QAAQ,GAAG,SAAS,EAAE,CAAC;QAC7B,IAAI,QAAQ,KAAK,IAAI;YAAE,MAAM,QAAQ,CAAC;IACxC,CAAC;YAAS,CAAC;QACT,8DAA8D;QAC9D,MAAM,MAAM,CAAC,MAAM,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,CAAC;QAC7C,MAAM,CAAC,WAAW,EAAE,CAAC;IACvB,CAAC;AACH,CAAC"}
|