@nodetool-ai/runtime 0.8.1 → 0.8.3
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/dist/.nodetool-build-stamp +1 -1
- package/dist/context.d.ts +31 -3
- package/dist/context.d.ts.map +1 -1
- package/dist/context.js +369 -160
- package/dist/context.js.map +1 -1
- package/dist/generation-registry.d.ts +8 -0
- package/dist/generation-registry.d.ts.map +1 -1
- package/dist/generation-registry.js +18 -0
- package/dist/generation-registry.js.map +1 -1
- package/dist/host-binaries.d.ts.map +1 -1
- package/dist/host-binaries.js +18 -10
- package/dist/host-binaries.js.map +1 -1
- package/dist/image-codec.d.ts +2 -0
- package/dist/image-codec.d.ts.map +1 -1
- package/dist/image-codec.js +23 -3
- package/dist/image-codec.js.map +1 -1
- package/dist/image-model-tasks.d.ts +35 -0
- package/dist/image-model-tasks.d.ts.map +1 -0
- package/dist/image-model-tasks.js +67 -0
- package/dist/image-model-tasks.js.map +1 -0
- package/dist/index.d.ts +14 -3
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +10 -2
- package/dist/index.js.map +1 -1
- package/dist/media-ref-bytes.d.ts +18 -2
- package/dist/media-ref-bytes.d.ts.map +1 -1
- package/dist/media-ref-bytes.js +26 -16
- package/dist/media-ref-bytes.js.map +1 -1
- package/dist/node-executor.d.ts +6 -0
- package/dist/node-executor.d.ts.map +1 -1
- package/dist/prompt-asset-refs.d.ts +12 -1
- package/dist/prompt-asset-refs.d.ts.map +1 -1
- package/dist/prompt-asset-refs.js +9 -4
- package/dist/prompt-asset-refs.js.map +1 -1
- package/dist/providers/aki-provider.d.ts +2 -0
- package/dist/providers/aki-provider.d.ts.map +1 -1
- package/dist/providers/aki-provider.js +6 -0
- package/dist/providers/aki-provider.js.map +1 -1
- package/dist/providers/api-route-provider.d.ts +22 -0
- package/dist/providers/api-route-provider.d.ts.map +1 -0
- package/dist/providers/api-route-provider.js +56 -0
- package/dist/providers/api-route-provider.js.map +1 -0
- package/dist/providers/atlascloud-provider.d.ts +2 -0
- package/dist/providers/atlascloud-provider.d.ts.map +1 -1
- package/dist/providers/atlascloud-provider.js +22 -0
- package/dist/providers/atlascloud-provider.js.map +1 -1
- package/dist/providers/base-provider.d.ts +36 -24
- package/dist/providers/base-provider.d.ts.map +1 -1
- package/dist/providers/base-provider.js +145 -150
- package/dist/providers/base-provider.js.map +1 -1
- package/dist/providers/chatgpt-provider.d.ts +48 -0
- package/dist/providers/chatgpt-provider.d.ts.map +1 -0
- package/dist/providers/chatgpt-provider.js +506 -0
- package/dist/providers/chatgpt-provider.js.map +1 -0
- package/dist/providers/claude-agent-provider.d.ts +6 -36
- package/dist/providers/claude-agent-provider.d.ts.map +1 -1
- package/dist/providers/claude-agent-provider.js +208 -26
- package/dist/providers/claude-agent-provider.js.map +1 -1
- package/dist/providers/codex-provider.d.ts +2 -0
- package/dist/providers/codex-provider.d.ts.map +1 -1
- package/dist/providers/codex-provider.js +15 -2
- package/dist/providers/codex-provider.js.map +1 -1
- package/dist/providers/cohere-provider.d.ts +2 -1
- package/dist/providers/cohere-provider.d.ts.map +1 -1
- package/dist/providers/cohere-provider.js +5 -0
- package/dist/providers/cohere-provider.js.map +1 -1
- package/dist/providers/context-window.d.ts.map +1 -1
- package/dist/providers/context-window.js +1 -0
- package/dist/providers/context-window.js.map +1 -1
- package/dist/providers/core-tools.d.ts +2 -1
- package/dist/providers/core-tools.d.ts.map +1 -1
- package/dist/providers/core-tools.js +2 -1
- package/dist/providers/core-tools.js.map +1 -1
- package/dist/providers/cost-calculator.d.ts.map +1 -1
- package/dist/providers/cost-calculator.js +9 -0
- package/dist/providers/cost-calculator.js.map +1 -1
- package/dist/providers/credential-check.d.ts +8 -0
- package/dist/providers/credential-check.d.ts.map +1 -1
- package/dist/providers/credential-check.js +27 -0
- package/dist/providers/credential-check.js.map +1 -1
- package/dist/providers/custom-openai-provider.d.ts +2 -0
- package/dist/providers/custom-openai-provider.d.ts.map +1 -1
- package/dist/providers/custom-openai-provider.js +27 -1
- package/dist/providers/custom-openai-provider.js.map +1 -1
- package/dist/providers/dreamina-models.d.ts +5 -0
- package/dist/providers/dreamina-models.d.ts.map +1 -0
- package/dist/providers/dreamina-models.js +57 -0
- package/dist/providers/dreamina-models.js.map +1 -0
- package/dist/providers/dreamina-music.d.ts +52 -0
- package/dist/providers/dreamina-music.d.ts.map +1 -0
- package/dist/providers/dreamina-music.js +115 -0
- package/dist/providers/dreamina-music.js.map +1 -0
- package/dist/providers/dreamina-provider.d.ts +64 -0
- package/dist/providers/dreamina-provider.d.ts.map +1 -0
- package/dist/providers/dreamina-provider.js +1001 -0
- package/dist/providers/dreamina-provider.js.map +1 -0
- package/dist/providers/elevenlabs-provider.d.ts +2 -1
- package/dist/providers/elevenlabs-provider.d.ts.map +1 -1
- package/dist/providers/elevenlabs-provider.js +5 -0
- package/dist/providers/elevenlabs-provider.js.map +1 -1
- package/dist/providers/evolink-provider.d.ts +2 -0
- package/dist/providers/evolink-provider.d.ts.map +1 -1
- package/dist/providers/evolink-provider.js +8 -0
- package/dist/providers/evolink-provider.js.map +1 -1
- package/dist/providers/extension-tab.d.ts +29 -0
- package/dist/providers/extension-tab.d.ts.map +1 -0
- package/dist/providers/extension-tab.js +144 -0
- package/dist/providers/extension-tab.js.map +1 -0
- package/dist/providers/fake-provider.d.ts +5 -2
- package/dist/providers/fake-provider.d.ts.map +1 -1
- package/dist/providers/fake-provider.js +73 -9
- package/dist/providers/fake-provider.js.map +1 -1
- package/dist/providers/fake-schema-answer.d.ts +10 -0
- package/dist/providers/fake-schema-answer.d.ts.map +1 -0
- package/dist/providers/fake-schema-answer.js +64 -0
- package/dist/providers/fake-schema-answer.js.map +1 -0
- package/dist/providers/fal-provider.d.ts +2 -1
- package/dist/providers/fal-provider.d.ts.map +1 -1
- package/dist/providers/fal-provider.js +32 -2
- package/dist/providers/fal-provider.js.map +1 -1
- package/dist/providers/gemini-provider.d.ts +2 -1
- package/dist/providers/gemini-provider.d.ts.map +1 -1
- package/dist/providers/gemini-provider.js +15 -0
- package/dist/providers/gemini-provider.js.map +1 -1
- package/dist/providers/gemini-web-provider.d.ts +76 -0
- package/dist/providers/gemini-web-provider.d.ts.map +1 -0
- package/dist/providers/gemini-web-provider.js +752 -0
- package/dist/providers/gemini-web-provider.js.map +1 -0
- package/dist/providers/higgsfield-provider.d.ts +2 -1
- package/dist/providers/higgsfield-provider.d.ts.map +1 -1
- package/dist/providers/higgsfield-provider.js +12 -0
- package/dist/providers/higgsfield-provider.js.map +1 -1
- package/dist/providers/huggingface-provider.d.ts +2 -1
- package/dist/providers/huggingface-provider.d.ts.map +1 -1
- package/dist/providers/huggingface-provider.js +27 -1
- package/dist/providers/huggingface-provider.js.map +1 -1
- package/dist/providers/index.d.ts +14 -3
- package/dist/providers/index.d.ts.map +1 -1
- package/dist/providers/index.js +48 -9
- package/dist/providers/index.js.map +1 -1
- package/dist/providers/jina-provider.d.ts +2 -1
- package/dist/providers/jina-provider.d.ts.map +1 -1
- package/dist/providers/jina-provider.js +5 -0
- package/dist/providers/jina-provider.js.map +1 -1
- package/dist/providers/kie-provider.d.ts +2 -1
- package/dist/providers/kie-provider.d.ts.map +1 -1
- package/dist/providers/kie-provider.js +14 -0
- package/dist/providers/kie-provider.js.map +1 -1
- package/dist/providers/llama-provider.d.ts +12 -1
- package/dist/providers/llama-provider.d.ts.map +1 -1
- package/dist/providers/llama-provider.js +29 -5
- package/dist/providers/llama-provider.js.map +1 -1
- package/dist/providers/lmstudio-provider.js +2 -2
- package/dist/providers/lmstudio-provider.js.map +1 -1
- package/dist/providers/loop-tracing.d.ts +17 -0
- package/dist/providers/loop-tracing.d.ts.map +1 -0
- package/dist/providers/loop-tracing.js +132 -0
- package/dist/providers/loop-tracing.js.map +1 -0
- package/dist/providers/manifest-models.d.ts +2 -12
- package/dist/providers/manifest-models.d.ts.map +1 -1
- package/dist/providers/manifest-models.js +45 -3
- package/dist/providers/manifest-models.js.map +1 -1
- package/dist/providers/meshy-provider.d.ts +2 -1
- package/dist/providers/meshy-provider.d.ts.map +1 -1
- package/dist/providers/meshy-provider.js +6 -0
- package/dist/providers/meshy-provider.js.map +1 -1
- package/dist/providers/meta-provider.d.ts +53 -6
- package/dist/providers/meta-provider.d.ts.map +1 -1
- package/dist/providers/meta-provider.js +289 -6
- package/dist/providers/meta-provider.js.map +1 -1
- package/dist/providers/meta-segmentation.d.ts +27 -0
- package/dist/providers/meta-segmentation.d.ts.map +1 -0
- package/dist/providers/meta-segmentation.js +141 -0
- package/dist/providers/meta-segmentation.js.map +1 -0
- package/dist/providers/meta-transcription.d.ts +31 -0
- package/dist/providers/meta-transcription.d.ts.map +1 -0
- package/dist/providers/meta-transcription.js +187 -0
- package/dist/providers/meta-transcription.js.map +1 -0
- package/dist/providers/minimax-provider.d.ts +2 -0
- package/dist/providers/minimax-provider.d.ts.map +1 -1
- package/dist/providers/minimax-provider.js +11 -0
- package/dist/providers/minimax-provider.js.map +1 -1
- package/dist/providers/mistral-provider.d.ts +2 -0
- package/dist/providers/mistral-provider.d.ts.map +1 -1
- package/dist/providers/mistral-provider.js +5 -0
- package/dist/providers/mistral-provider.js.map +1 -1
- package/dist/providers/node-llama-cpp-provider.d.ts +8 -4
- package/dist/providers/node-llama-cpp-provider.d.ts.map +1 -1
- package/dist/providers/node-llama-cpp-provider.js +83 -61
- package/dist/providers/node-llama-cpp-provider.js.map +1 -1
- package/dist/providers/nodetool-provider.d.ts +1 -1
- package/dist/providers/nodetool-provider.d.ts.map +1 -1
- package/dist/providers/nodetool-provider.js +0 -2
- package/dist/providers/nodetool-provider.js.map +1 -1
- package/dist/providers/ollama-provider.d.ts +25 -1
- package/dist/providers/ollama-provider.d.ts.map +1 -1
- package/dist/providers/ollama-provider.js +145 -27
- package/dist/providers/ollama-provider.js.map +1 -1
- package/dist/providers/openai-compat/client.d.ts +10 -1
- package/dist/providers/openai-compat/client.d.ts.map +1 -1
- package/dist/providers/openai-compat/client.js +21 -3
- package/dist/providers/openai-compat/client.js.map +1 -1
- package/dist/providers/openai-compat/index.d.ts +1 -1
- package/dist/providers/openai-compat/index.d.ts.map +1 -1
- package/dist/providers/openai-compat/index.js +1 -1
- package/dist/providers/openai-compat/index.js.map +1 -1
- package/dist/providers/openai-compat/types.d.ts +4 -0
- package/dist/providers/openai-compat/types.d.ts.map +1 -1
- package/dist/providers/openai-compat-provider.d.ts +11 -0
- package/dist/providers/openai-compat-provider.d.ts.map +1 -1
- package/dist/providers/openai-compat-provider.js +47 -2
- package/dist/providers/openai-compat-provider.js.map +1 -1
- package/dist/providers/openai-provider.d.ts +23 -2
- package/dist/providers/openai-provider.d.ts.map +1 -1
- package/dist/providers/openai-provider.js +102 -21
- package/dist/providers/openai-provider.js.map +1 -1
- package/dist/providers/openrouter-provider.d.ts +52 -1
- package/dist/providers/openrouter-provider.d.ts.map +1 -1
- package/dist/providers/openrouter-provider.js +372 -11
- package/dist/providers/openrouter-provider.js.map +1 -1
- package/dist/providers/opper-provider.d.ts +31 -0
- package/dist/providers/opper-provider.d.ts.map +1 -0
- package/dist/providers/opper-provider.js +91 -0
- package/dist/providers/opper-provider.js.map +1 -0
- package/dist/providers/provider-error.d.ts.map +1 -1
- package/dist/providers/provider-error.js +7 -1
- package/dist/providers/provider-error.js.map +1 -1
- package/dist/providers/provider-generations.d.ts +2 -2
- package/dist/providers/provider-generations.js +2 -2
- package/dist/providers/provider-request-log.d.ts.map +1 -1
- package/dist/providers/provider-request-log.js +19 -7
- package/dist/providers/provider-request-log.js.map +1 -1
- package/dist/providers/python-provider.d.ts +6 -1
- package/dist/providers/python-provider.d.ts.map +1 -1
- package/dist/providers/python-provider.js +35 -14
- package/dist/providers/python-provider.js.map +1 -1
- package/dist/providers/replicate-provider.d.ts +2 -1
- package/dist/providers/replicate-provider.d.ts.map +1 -1
- package/dist/providers/replicate-provider.js +22 -0
- package/dist/providers/replicate-provider.js.map +1 -1
- package/dist/providers/requesty-provider.d.ts +30 -0
- package/dist/providers/requesty-provider.d.ts.map +1 -0
- package/dist/providers/requesty-provider.js +87 -0
- package/dist/providers/requesty-provider.js.map +1 -0
- package/dist/providers/responses-api.d.ts +12 -2
- package/dist/providers/responses-api.d.ts.map +1 -1
- package/dist/providers/responses-api.js +54 -3
- package/dist/providers/responses-api.js.map +1 -1
- package/dist/providers/reve-provider.d.ts +2 -1
- package/dist/providers/reve-provider.d.ts.map +1 -1
- package/dist/providers/reve-provider.js +6 -0
- package/dist/providers/reve-provider.js.map +1 -1
- package/dist/providers/rodin-provider.d.ts +2 -1
- package/dist/providers/rodin-provider.d.ts.map +1 -1
- package/dist/providers/rodin-provider.js +6 -0
- package/dist/providers/rodin-provider.js.map +1 -1
- package/dist/providers/scripted-provider.d.ts.map +1 -1
- package/dist/providers/scripted-provider.js +6 -1
- package/dist/providers/scripted-provider.js.map +1 -1
- package/dist/providers/together-operations.d.ts +27 -0
- package/dist/providers/together-operations.d.ts.map +1 -0
- package/dist/providers/together-operations.js +95 -0
- package/dist/providers/together-operations.js.map +1 -0
- package/dist/providers/together-provider.d.ts +5 -8
- package/dist/providers/together-provider.d.ts.map +1 -1
- package/dist/providers/together-provider.js +54 -159
- package/dist/providers/together-provider.js.map +1 -1
- package/dist/providers/topaz-provider.d.ts +2 -1
- package/dist/providers/topaz-provider.d.ts.map +1 -1
- package/dist/providers/topaz-provider.js +5 -0
- package/dist/providers/topaz-provider.js.map +1 -1
- package/dist/providers/types.d.ts +54 -0
- package/dist/providers/types.d.ts.map +1 -1
- package/dist/providers/types.js.map +1 -1
- package/dist/providers/useapi-provider.d.ts +2 -1
- package/dist/providers/useapi-provider.d.ts.map +1 -1
- package/dist/providers/useapi-provider.js +8 -0
- package/dist/providers/useapi-provider.js.map +1 -1
- package/dist/providers/vllm-provider.d.ts +9 -4
- package/dist/providers/vllm-provider.d.ts.map +1 -1
- package/dist/providers/vllm-provider.js +16 -8
- package/dist/providers/vllm-provider.js.map +1 -1
- package/dist/providers/voyage-provider.d.ts +2 -1
- package/dist/providers/voyage-provider.d.ts.map +1 -1
- package/dist/providers/voyage-provider.js +5 -0
- package/dist/providers/voyage-provider.js.map +1 -1
- package/dist/providers/xai-provider.d.ts +2 -0
- package/dist/providers/xai-provider.d.ts.map +1 -1
- package/dist/providers/xai-provider.js +8 -0
- package/dist/providers/xai-provider.js.map +1 -1
- package/dist/python-bridge-base.d.ts +16 -6
- package/dist/python-bridge-base.d.ts.map +1 -1
- package/dist/python-bridge-base.js +117 -40
- package/dist/python-bridge-base.js.map +1 -1
- package/dist/python-bridge-codec.d.ts +16 -1
- package/dist/python-bridge-codec.d.ts.map +1 -1
- package/dist/python-bridge-codec.js +60 -2
- package/dist/python-bridge-codec.js.map +1 -1
- package/dist/python-bridge-framing.d.ts +10 -1
- package/dist/python-bridge-framing.d.ts.map +1 -1
- package/dist/python-bridge-framing.js +33 -8
- package/dist/python-bridge-framing.js.map +1 -1
- package/dist/python-bridge-types.d.ts +26 -5
- package/dist/python-bridge-types.d.ts.map +1 -1
- package/dist/python-bridge-types.js.map +1 -1
- package/dist/python-node-executor.d.ts +14 -3
- package/dist/python-node-executor.d.ts.map +1 -1
- package/dist/python-node-executor.js +185 -3
- package/dist/python-node-executor.js.map +1 -1
- package/dist/python-stdio-bridge.d.ts +6 -0
- package/dist/python-stdio-bridge.d.ts.map +1 -1
- package/dist/python-stdio-bridge.js +25 -2
- package/dist/python-stdio-bridge.js.map +1 -1
- package/dist/recommended-models.d.ts.map +1 -1
- package/dist/recommended-models.js +20 -0
- package/dist/recommended-models.js.map +1 -1
- package/dist/run-context.d.ts +20 -0
- package/dist/run-context.d.ts.map +1 -0
- package/dist/run-context.js +18 -0
- package/dist/run-context.js.map +1 -0
- package/dist/run-trace-context.d.ts +5 -0
- package/dist/run-trace-context.d.ts.map +1 -0
- package/dist/run-trace-context.js +33 -0
- package/dist/run-trace-context.js.map +1 -0
- package/dist/run-trace-processor.d.ts +65 -0
- package/dist/run-trace-processor.d.ts.map +1 -0
- package/dist/run-trace-processor.js +418 -0
- package/dist/run-trace-processor.js.map +1 -0
- package/dist/run-trace-scope.d.ts +28 -0
- package/dist/run-trace-scope.d.ts.map +1 -0
- package/dist/run-trace-scope.js +51 -0
- package/dist/run-trace-scope.js.map +1 -0
- package/dist/run-trace-serialization.d.ts +5 -0
- package/dist/run-trace-serialization.d.ts.map +1 -0
- package/dist/run-trace-serialization.js +114 -0
- package/dist/run-trace-serialization.js.map +1 -0
- package/dist/span-record.d.ts +4 -0
- package/dist/span-record.d.ts.map +1 -0
- package/dist/span-record.js +48 -0
- package/dist/span-record.js.map +1 -0
- package/dist/storage-workspace.d.ts +3 -0
- package/dist/storage-workspace.d.ts.map +1 -1
- package/dist/storage-workspace.js +32 -17
- package/dist/storage-workspace.js.map +1 -1
- package/dist/swappable-python-bridge.d.ts +6 -6
- package/dist/swappable-python-bridge.d.ts.map +1 -1
- package/dist/swappable-python-bridge.js +10 -10
- package/dist/swappable-python-bridge.js.map +1 -1
- package/dist/telemetry.d.ts +9 -3
- package/dist/telemetry.d.ts.map +1 -1
- package/dist/telemetry.js +53 -20
- package/dist/telemetry.js.map +1 -1
- package/dist/testing.d.ts +1 -1
- package/dist/testing.d.ts.map +1 -1
- package/dist/testing.js +55 -3
- package/dist/testing.js.map +1 -1
- package/dist/trace-exporters.d.ts +2 -30
- package/dist/trace-exporters.d.ts.map +1 -1
- package/dist/trace-exporters.js +4 -42
- package/dist/trace-exporters.js.map +1 -1
- package/dist/traced-storage.d.ts +17 -0
- package/dist/traced-storage.d.ts.map +1 -0
- package/dist/traced-storage.js +41 -0
- package/dist/traced-storage.js.map +1 -0
- package/dist/tracing-helpers.d.ts +15 -22
- package/dist/tracing-helpers.d.ts.map +1 -1
- package/dist/tracing-helpers.js +38 -6
- package/dist/tracing-helpers.js.map +1 -1
- package/dist/trim-video-window.d.ts +8 -0
- package/dist/trim-video-window.d.ts.map +1 -0
- package/dist/trim-video-window.js +50 -0
- package/dist/trim-video-window.js.map +1 -0
- package/package.json +21 -5
|
@@ -1,8 +1,10 @@
|
|
|
1
|
+
import { stringifyTraceContent } from "../run-trace-serialization.js";
|
|
2
|
+
import { tracedProviderLoop, tracedToolCall, beginProviderRound, providerRoundContext, traceContentAllowed, messageTraceContent, traceTextContent } from "./loop-tracing.js";
|
|
1
3
|
import { isProviderSessionUpdate, isProviderMessageEvent, isProviderStop, isProviderToolErrorResult, PROVIDER_STOP_ABORTED } from "./types.js";
|
|
2
4
|
import { ProviderGenerationsUnsupportedError } from "./provider-generations.js";
|
|
3
5
|
import { CostCalculator } from "./cost-calculator.js";
|
|
4
6
|
import { getTracer } from "../telemetry.js";
|
|
5
|
-
import { withUsageCapture, withModalityCapture, setLastUsage, setLastRequest, consumeLastUsage, peekLastUsage, peekLastRequest, createUsageSlot } from "../tracing-helpers.js";
|
|
7
|
+
import { withUsageCapture, withModalityCapture, setLastUsage, setLastRequest, consumeLastUsage, peekLastUsage, peekLastRequest, createUsageSlot, withSpan, withSpanGen } from "../tracing-helpers.js";
|
|
6
8
|
import { isRunBudget } from "../turn-budget.js";
|
|
7
9
|
import { countTokens } from "../token-counter.js";
|
|
8
10
|
import { isCallable, isObjectLike, isRecord, isString } from "@nodetool-ai/protocol";
|
|
@@ -11,7 +13,7 @@ import { annotateProviderError, markContextExceeded } from "./provider-error.js"
|
|
|
11
13
|
import { buildProviderCallFailure } from "./provider-call-failure.js";
|
|
12
14
|
import { applyEntityReferences } from "./entity-references.js";
|
|
13
15
|
import { expandVideoContentAsFrames, videoFrameFallbackEnabled } from "./video-frame-fallback.js";
|
|
14
|
-
import { SpanStatusCode } from "@opentelemetry/api";
|
|
16
|
+
import { SpanStatusCode, context, trace } from "@opentelemetry/api";
|
|
15
17
|
import { createLogger, getDefaultAssetsPath } from "@nodetool-ai/config";
|
|
16
18
|
const log = createLogger("nodetool.runtime.provider");
|
|
17
19
|
/**
|
|
@@ -72,117 +74,6 @@ export function splitToolResultImages(result) {
|
|
|
72
74
|
imageMessage: { role: "user", content: [...texts, ...images] }
|
|
73
75
|
};
|
|
74
76
|
}
|
|
75
|
-
/**
|
|
76
|
-
* Derive a provider's capability set by checking which optional `getAvailable*`
|
|
77
|
-
* methods it overrides on its prototype. Every provider can always generate
|
|
78
|
-
* messages; image/video/TTS/ASR/embedding are advertised only when the concrete
|
|
79
|
-
* class overrides the matching base method.
|
|
80
|
-
*
|
|
81
|
-
* Shared by `packages/websocket/src/models-api.ts` (REST leftover) and the
|
|
82
|
-
* `models` tRPC router so both report identical capabilities for the same
|
|
83
|
-
* provider instance.
|
|
84
|
-
*/
|
|
85
|
-
export function providerCapabilities(instance) {
|
|
86
|
-
const capabilities = [
|
|
87
|
-
"generate_message",
|
|
88
|
-
"generate_messages"
|
|
89
|
-
];
|
|
90
|
-
if (instance.getAvailableImageModels !==
|
|
91
|
-
BaseProvider.prototype.getAvailableImageModels) {
|
|
92
|
-
capabilities.push("text_to_image", "image_to_image");
|
|
93
|
-
}
|
|
94
|
-
if (instance.getAvailableVideoModels !==
|
|
95
|
-
BaseProvider.prototype.getAvailableVideoModels) {
|
|
96
|
-
capabilities.push("text_to_video", "image_to_video");
|
|
97
|
-
}
|
|
98
|
-
if (instance.referenceToVideo !== BaseProvider.prototype.referenceToVideo) {
|
|
99
|
-
capabilities.push("reference_to_video");
|
|
100
|
-
}
|
|
101
|
-
// The remaining task types don't have their own model-discovery method —
|
|
102
|
-
// they reuse Image/VideoModel (advertised via each model's `supportedTasks`).
|
|
103
|
-
// Advertise the provider-level capability when the concrete class overrides
|
|
104
|
-
// the matching task method.
|
|
105
|
-
if (instance.inpaint !== BaseProvider.prototype.inpaint) {
|
|
106
|
-
capabilities.push("inpainting");
|
|
107
|
-
}
|
|
108
|
-
if (instance.outpaintImage !== BaseProvider.prototype.outpaintImage) {
|
|
109
|
-
capabilities.push("outpaint_image");
|
|
110
|
-
}
|
|
111
|
-
if (instance.upscaleImage !== BaseProvider.prototype.upscaleImage) {
|
|
112
|
-
capabilities.push("upscale_image");
|
|
113
|
-
}
|
|
114
|
-
if (instance.removeBackground !== BaseProvider.prototype.removeBackground) {
|
|
115
|
-
capabilities.push("remove_background");
|
|
116
|
-
}
|
|
117
|
-
if (instance.relightImage !== BaseProvider.prototype.relightImage) {
|
|
118
|
-
capabilities.push("relight_image");
|
|
119
|
-
}
|
|
120
|
-
if (instance.segmentImage !== BaseProvider.prototype.segmentImage) {
|
|
121
|
-
capabilities.push("segment_image");
|
|
122
|
-
}
|
|
123
|
-
if (instance.vectorizeImage !== BaseProvider.prototype.vectorizeImage) {
|
|
124
|
-
capabilities.push("vectorize_image");
|
|
125
|
-
}
|
|
126
|
-
if (instance.videoToVideo !== BaseProvider.prototype.videoToVideo) {
|
|
127
|
-
capabilities.push("video_to_video");
|
|
128
|
-
}
|
|
129
|
-
if (instance.videoToAudio !== BaseProvider.prototype.videoToAudio) {
|
|
130
|
-
capabilities.push("video_to_audio");
|
|
131
|
-
}
|
|
132
|
-
if (instance.trackObject !== BaseProvider.prototype.trackObject) {
|
|
133
|
-
capabilities.push("track_object");
|
|
134
|
-
}
|
|
135
|
-
if (instance.extendVideo !== BaseProvider.prototype.extendVideo) {
|
|
136
|
-
capabilities.push("extend_video");
|
|
137
|
-
}
|
|
138
|
-
if (instance.upscaleVideo !== BaseProvider.prototype.upscaleVideo) {
|
|
139
|
-
capabilities.push("upscale_video");
|
|
140
|
-
}
|
|
141
|
-
if (instance.interpolateVideo !== BaseProvider.prototype.interpolateVideo) {
|
|
142
|
-
capabilities.push("interpolate_video");
|
|
143
|
-
}
|
|
144
|
-
if (instance.outpaintVideo !== BaseProvider.prototype.outpaintVideo) {
|
|
145
|
-
capabilities.push("outpaint_video");
|
|
146
|
-
}
|
|
147
|
-
if (instance.lipSync !== BaseProvider.prototype.lipSync) {
|
|
148
|
-
capabilities.push("lip_sync");
|
|
149
|
-
}
|
|
150
|
-
if (instance.getAvailableTTSModels !==
|
|
151
|
-
BaseProvider.prototype.getAvailableTTSModels) {
|
|
152
|
-
capabilities.push("text_to_speech");
|
|
153
|
-
}
|
|
154
|
-
if (instance.getAvailableMusicModels !==
|
|
155
|
-
BaseProvider.prototype.getAvailableMusicModels) {
|
|
156
|
-
capabilities.push("text_to_music");
|
|
157
|
-
}
|
|
158
|
-
if (instance.getAvailableAudioToAudioModels !==
|
|
159
|
-
BaseProvider.prototype.getAvailableAudioToAudioModels) {
|
|
160
|
-
capabilities.push("audio_to_audio");
|
|
161
|
-
}
|
|
162
|
-
if (instance.getAvailableASRModels !==
|
|
163
|
-
BaseProvider.prototype.getAvailableASRModels) {
|
|
164
|
-
capabilities.push("automatic_speech_recognition");
|
|
165
|
-
}
|
|
166
|
-
if (instance.getAvailableEmbeddingModels !==
|
|
167
|
-
BaseProvider.prototype.getAvailableEmbeddingModels) {
|
|
168
|
-
capabilities.push("generate_embedding");
|
|
169
|
-
}
|
|
170
|
-
if (instance.getAvailable3DModels !==
|
|
171
|
-
BaseProvider.prototype.getAvailable3DModels) {
|
|
172
|
-
// Providers that expose 3D models are assumed to support both task types;
|
|
173
|
-
// individual `textTo3D` / `imageTo3D` calls will throw if not implemented.
|
|
174
|
-
capabilities.push("text_to_3d", "image_to_3d");
|
|
175
|
-
}
|
|
176
|
-
// The provider's own record of what it ran, exposed only by providers with
|
|
177
|
-
// a history API behind it (see provider-generations.ts).
|
|
178
|
-
if (instance.listGenerations !== BaseProvider.prototype.listGenerations) {
|
|
179
|
-
capabilities.push("list_generations");
|
|
180
|
-
}
|
|
181
|
-
if (instance.getGeneration !== BaseProvider.prototype.getGeneration) {
|
|
182
|
-
capabilities.push("get_generation");
|
|
183
|
-
}
|
|
184
|
-
return capabilities;
|
|
185
|
-
}
|
|
186
77
|
/**
|
|
187
78
|
* What one attached medium costs a vision/audio model, per block. These are
|
|
188
79
|
* modality constants, not measurements of the bytes: by the time a turn is
|
|
@@ -308,6 +199,35 @@ export class BaseProvider {
|
|
|
308
199
|
if (this._emitMessage)
|
|
309
200
|
this._emitMessage(msg);
|
|
310
201
|
}
|
|
202
|
+
/**
|
|
203
|
+
* Report one non-chat provider call (image, video, speech, ASR, embedding…)
|
|
204
|
+
* as an `llm_call` so the trace shows every provider call, not only chat.
|
|
205
|
+
* Carries no token counts: those modalities bill per unit, not per token.
|
|
206
|
+
* @internal
|
|
207
|
+
*/
|
|
208
|
+
recordModalityCall(input) {
|
|
209
|
+
if (!this._emitMessage)
|
|
210
|
+
return;
|
|
211
|
+
const prompt = input.args
|
|
212
|
+
.map((arg) => isObjectLike(arg) ? arg.prompt : undefined)
|
|
213
|
+
.find(isString);
|
|
214
|
+
this.emitMessage({
|
|
215
|
+
type: "llm_call",
|
|
216
|
+
node_id: "",
|
|
217
|
+
provider: this.provider,
|
|
218
|
+
operation: input.operation,
|
|
219
|
+
model: extractModelId(input.args),
|
|
220
|
+
messages: prompt ? [{ role: "user", content: prompt }] : [],
|
|
221
|
+
response: null,
|
|
222
|
+
tool_calls: null,
|
|
223
|
+
tokens_input: null,
|
|
224
|
+
tokens_output: null,
|
|
225
|
+
cost: null,
|
|
226
|
+
duration_ms: Date.now() - input.startedAt,
|
|
227
|
+
error: input.error === undefined ? null : String(input.error),
|
|
228
|
+
timestamp: new Date(input.startedAt).toISOString()
|
|
229
|
+
});
|
|
230
|
+
}
|
|
311
231
|
/**
|
|
312
232
|
* Record a failed provider call: a server-side log with the exact request,
|
|
313
233
|
* and a `provider_call_failed` message so the surface showing the failure
|
|
@@ -379,8 +299,23 @@ export class BaseProvider {
|
|
|
379
299
|
// images onto the source list, before the concrete provider runs.
|
|
380
300
|
const args = applyEntityReferences(name, rawArgs);
|
|
381
301
|
const startedAt = Date.now();
|
|
302
|
+
const call = () => original.apply(this, args);
|
|
382
303
|
try {
|
|
383
|
-
|
|
304
|
+
// A nested call (a batch helper delegating to its singular method)
|
|
305
|
+
// stays inside the outer call's span.
|
|
306
|
+
const result = alreadyActive
|
|
307
|
+
? await call()
|
|
308
|
+
: await withSpan(`provider.${name}`, modalitySpanAttributes(this.provider, name, args), async (span) => {
|
|
309
|
+
const value = await call();
|
|
310
|
+
if (span) {
|
|
311
|
+
applyUsageAttributes(span, peekLastUsage());
|
|
312
|
+
}
|
|
313
|
+
return value;
|
|
314
|
+
});
|
|
315
|
+
if (!alreadyActive) {
|
|
316
|
+
this.recordModalityCall({ operation: name, args, startedAt });
|
|
317
|
+
}
|
|
318
|
+
return result;
|
|
384
319
|
}
|
|
385
320
|
catch (err) {
|
|
386
321
|
annotateProviderError(err, {
|
|
@@ -388,6 +323,12 @@ export class BaseProvider {
|
|
|
388
323
|
model: extractModelId(args)
|
|
389
324
|
});
|
|
390
325
|
if (!alreadyActive) {
|
|
326
|
+
this.recordModalityCall({
|
|
327
|
+
operation: name,
|
|
328
|
+
args,
|
|
329
|
+
startedAt,
|
|
330
|
+
error: err
|
|
331
|
+
});
|
|
391
332
|
const failureArgs = name === "referenceToVideo"
|
|
392
333
|
? [referenceVideoDiagnostics(args)]
|
|
393
334
|
: args;
|
|
@@ -410,7 +351,7 @@ export class BaseProvider {
|
|
|
410
351
|
continue;
|
|
411
352
|
}
|
|
412
353
|
const original = fn;
|
|
413
|
-
Reflect.set(this, name, (...args) => wrapModalityGenerator(this, original, args, name));
|
|
354
|
+
Reflect.set(this, name, (...args) => withSpanGen(`provider.${name}`, modalitySpanAttributes(this.provider, name, args), () => wrapModalityGenerator(this, original, args, name)));
|
|
414
355
|
}
|
|
415
356
|
}
|
|
416
357
|
/**
|
|
@@ -483,32 +424,25 @@ export class BaseProvider {
|
|
|
483
424
|
return null;
|
|
484
425
|
}
|
|
485
426
|
/**
|
|
486
|
-
*
|
|
487
|
-
*
|
|
488
|
-
*
|
|
489
|
-
* to declare their capabilities directly — an alternative to method
|
|
490
|
-
* reflection when methods are wrapped, bound, or composed via mixins.
|
|
427
|
+
* The operations beyond chat that this provider implements. Each concrete
|
|
428
|
+
* provider lists its own; the base implements none. A capability belongs
|
|
429
|
+
* here only when the matching method has a working implementation.
|
|
491
430
|
*/
|
|
492
431
|
declaredCapabilities() {
|
|
493
|
-
return
|
|
432
|
+
return [];
|
|
494
433
|
}
|
|
495
434
|
/**
|
|
496
|
-
* The capabilities this provider exposes
|
|
497
|
-
*
|
|
498
|
-
* overridden methods via {@link providerCapabilities}. Callers should use
|
|
499
|
-
* this instead of calling `providerCapabilities()` directly so explicit
|
|
500
|
-
* declarations are honored.
|
|
435
|
+
* The capabilities this provider exposes: chat generation, which every
|
|
436
|
+
* provider has, plus its {@link declaredCapabilities}.
|
|
501
437
|
*/
|
|
502
438
|
getCapabilities() {
|
|
503
|
-
|
|
504
|
-
|
|
505
|
-
|
|
506
|
-
|
|
507
|
-
|
|
508
|
-
|
|
509
|
-
|
|
510
|
-
}
|
|
511
|
-
return providerCapabilities(this);
|
|
439
|
+
return [
|
|
440
|
+
...new Set([
|
|
441
|
+
"generate_message",
|
|
442
|
+
"generate_messages",
|
|
443
|
+
...this.declaredCapabilities()
|
|
444
|
+
])
|
|
445
|
+
];
|
|
512
446
|
}
|
|
513
447
|
/**
|
|
514
448
|
* The provider's own record of the generations this account ran, newest
|
|
@@ -679,6 +613,10 @@ export class BaseProvider {
|
|
|
679
613
|
async getAvailableEmbeddingModels() {
|
|
680
614
|
return [];
|
|
681
615
|
}
|
|
616
|
+
/** Reranking models exposed by this provider. */
|
|
617
|
+
async getAvailableRerankModels() {
|
|
618
|
+
return [];
|
|
619
|
+
}
|
|
682
620
|
/**
|
|
683
621
|
* 3D **generation** models exposed by this provider (e.g. Meshy's `meshy-4`,
|
|
684
622
|
* Rodin's `rodin-regular`). Override on providers that can synthesize 3D
|
|
@@ -700,12 +638,14 @@ export class BaseProvider {
|
|
|
700
638
|
const result = await this.generateMessage(args);
|
|
701
639
|
const content = isString(result.content)
|
|
702
640
|
? result.content
|
|
703
|
-
:
|
|
641
|
+
: stringifyTraceContent(result.content);
|
|
704
642
|
span.setAttributes({
|
|
705
643
|
"llm.response.role": result.role,
|
|
706
|
-
"llm.response.content": content.slice(0, 2000),
|
|
707
644
|
"llm.response.tool_calls_count": result.toolCalls?.length ?? 0
|
|
708
645
|
});
|
|
646
|
+
if (traceContentAllowed()) {
|
|
647
|
+
span.setAttribute("llm.response.content", traceTextContent(content));
|
|
648
|
+
}
|
|
709
649
|
span.setStatus({ code: SpanStatusCode.OK });
|
|
710
650
|
return result;
|
|
711
651
|
}
|
|
@@ -793,6 +733,10 @@ export class BaseProvider {
|
|
|
793
733
|
}
|
|
794
734
|
}
|
|
795
735
|
applyLlmRequestAttributes(span, args, streaming) {
|
|
736
|
+
if (traceContentAllowed()) {
|
|
737
|
+
span.setAttribute("llm.request.messages", messageTraceContent(args.messages.filter((message) => typeof message === "object" && message !== null && "role" in message)));
|
|
738
|
+
span.setAttribute("llm.tool.names", stringifyTraceContent((args.tools ?? []).map((tool) => typeof tool === "object" && tool !== null && "name" in tool ? tool.name : null)));
|
|
739
|
+
}
|
|
796
740
|
span.setAttributes({
|
|
797
741
|
"llm.provider": this.provider,
|
|
798
742
|
"llm.model": args.model,
|
|
@@ -953,8 +897,11 @@ export class BaseProvider {
|
|
|
953
897
|
});
|
|
954
898
|
}
|
|
955
899
|
async *generateLoop(args) {
|
|
900
|
+
return yield* tracedProviderLoop(this.provider, args.model, () => BaseProvider.prototype.generateBaseLoop.call(this, args));
|
|
901
|
+
}
|
|
902
|
+
async *generateBaseLoop(args) {
|
|
956
903
|
const maxIterations = args.maxIterations ?? 25;
|
|
957
|
-
const { executeTool, maxIterations: _omitMax, sequentialTools, turnBudget: budgetArg, workspaceDir: _omitWorkspaceDir, skills: _omitSkills, resolveMedia, ...turnArgs } = args;
|
|
904
|
+
const { executeTool, maxIterations: _omitMax, sequentialTools, providedToolsOnly: _omitProvidedToolsOnly, turnBudget: budgetArg, workspaceDir: _omitWorkspaceDir, skills: _omitSkills, resolveMedia, ...turnArgs } = args;
|
|
958
905
|
const { runBudget, turnBudget } = resolveTurnBudget(budgetArg);
|
|
959
906
|
const messages = [...args.messages];
|
|
960
907
|
// What the provider is actually sent: `messages` with every media
|
|
@@ -983,11 +930,8 @@ export class BaseProvider {
|
|
|
983
930
|
let toolCallSeq = 0;
|
|
984
931
|
const onToolCall = executeTool
|
|
985
932
|
? async (name, toolArgs) => {
|
|
986
|
-
const
|
|
987
|
-
|
|
988
|
-
name,
|
|
989
|
-
args: toolArgs
|
|
990
|
-
});
|
|
933
|
+
const call = { id: `call_${++toolCallSeq}`, name, args: toolArgs };
|
|
934
|
+
const result = await tracedToolCall(call, () => executeTool(call));
|
|
991
935
|
if (isProviderToolErrorResult(result)) {
|
|
992
936
|
return toolResultToText(result.content);
|
|
993
937
|
}
|
|
@@ -1011,6 +955,7 @@ export class BaseProvider {
|
|
|
1011
955
|
return;
|
|
1012
956
|
}
|
|
1013
957
|
}
|
|
958
|
+
beginProviderRound(this.provider, args.model);
|
|
1014
959
|
const costBeforeTurn = turnBudget ? this.getTotalCost() : 0;
|
|
1015
960
|
let assistantText = "";
|
|
1016
961
|
let finalizedAssistant;
|
|
@@ -1131,10 +1076,12 @@ export class BaseProvider {
|
|
|
1131
1076
|
const runTool = async (tc) => {
|
|
1132
1077
|
const tool = toolMap.get(tc.name);
|
|
1133
1078
|
try {
|
|
1134
|
-
if (tool?.execute)
|
|
1135
|
-
|
|
1079
|
+
if (tool?.execute) {
|
|
1080
|
+
const execute = tool.execute;
|
|
1081
|
+
return await tracedToolCall(tc, () => execute(tc.args ?? {}, tc.id));
|
|
1082
|
+
}
|
|
1136
1083
|
if (executeTool)
|
|
1137
|
-
return await executeTool(tc);
|
|
1084
|
+
return await tracedToolCall(tc, () => executeTool(tc));
|
|
1138
1085
|
return `Tool "${tc.name}" is not available`;
|
|
1139
1086
|
}
|
|
1140
1087
|
catch (err) {
|
|
@@ -1223,15 +1170,31 @@ export class BaseProvider {
|
|
|
1223
1170
|
}
|
|
1224
1171
|
/** Internal: wrap generateMessages with OTel span */
|
|
1225
1172
|
async *_tracedStream(args, tracer) {
|
|
1226
|
-
const span = tracer.startSpan(`llm.stream ${this.provider}/${args.model}
|
|
1173
|
+
const span = tracer.startSpan(`llm.stream ${this.provider}/${args.model}`, {}, providerRoundContext());
|
|
1227
1174
|
this.applyLlmRequestAttributes(span, args, true);
|
|
1228
1175
|
let chunkCount = 0;
|
|
1176
|
+
let response = "";
|
|
1177
|
+
const stream = this.generateMessages(args);
|
|
1178
|
+
const active = trace.setSpan(providerRoundContext(), span);
|
|
1179
|
+
let exhausted = false;
|
|
1229
1180
|
try {
|
|
1230
|
-
|
|
1181
|
+
while (true) {
|
|
1182
|
+
const next = await context.with(active, () => stream.next());
|
|
1183
|
+
if (next.done) {
|
|
1184
|
+
exhausted = true;
|
|
1185
|
+
break;
|
|
1186
|
+
}
|
|
1187
|
+
const item = next.value;
|
|
1188
|
+
if (traceContentAllowed() && "content" in item && typeof item.content === "string" && !("thinking" in item && item.thinking) && (!("content_type" in item) || item.content_type === "text")) {
|
|
1189
|
+
response = traceTextContent(response + item.content);
|
|
1190
|
+
}
|
|
1231
1191
|
chunkCount++;
|
|
1232
1192
|
yield item;
|
|
1233
1193
|
}
|
|
1234
|
-
span.
|
|
1194
|
+
span.setAttribute("llm.response.chunk_count", chunkCount);
|
|
1195
|
+
if (traceContentAllowed()) {
|
|
1196
|
+
span.setAttribute("llm.response.content", response);
|
|
1197
|
+
}
|
|
1235
1198
|
span.setStatus({ code: SpanStatusCode.OK });
|
|
1236
1199
|
}
|
|
1237
1200
|
catch (err) {
|
|
@@ -1240,6 +1203,9 @@ export class BaseProvider {
|
|
|
1240
1203
|
throw err;
|
|
1241
1204
|
}
|
|
1242
1205
|
finally {
|
|
1206
|
+
if (!exhausted) {
|
|
1207
|
+
await context.with(active, () => stream.return(undefined));
|
|
1208
|
+
}
|
|
1243
1209
|
applyUsageAttributes(span, peekLastUsage());
|
|
1244
1210
|
span.end();
|
|
1245
1211
|
}
|
|
@@ -1324,6 +1290,13 @@ export class BaseProvider {
|
|
|
1324
1290
|
async removeBackground(_image, _params) {
|
|
1325
1291
|
throw new Error(`${this.provider} does not support removeBackground`);
|
|
1326
1292
|
}
|
|
1293
|
+
/**
|
|
1294
|
+
* Estimate per-pixel depth. Returns a grayscale PNG at the input's size,
|
|
1295
|
+
* where brighter pixels are nearer to the camera.
|
|
1296
|
+
*/
|
|
1297
|
+
async estimateDepth(_image, _params) {
|
|
1298
|
+
throw new Error(`${this.provider} does not support estimateDepth`);
|
|
1299
|
+
}
|
|
1327
1300
|
/**
|
|
1328
1301
|
* Segment an image into object masks. Returns one entry per object the model
|
|
1329
1302
|
* found, in the model's own order; an empty array means it found nothing,
|
|
@@ -1455,6 +1428,10 @@ export class BaseProvider {
|
|
|
1455
1428
|
async generateEmbedding(_args) {
|
|
1456
1429
|
throw new Error(`${this.provider} does not support generateEmbedding`);
|
|
1457
1430
|
}
|
|
1431
|
+
/** Score each document against the query, most relevant first. */
|
|
1432
|
+
async rerank(_params) {
|
|
1433
|
+
throw new Error(`${this.provider} does not support rerank`);
|
|
1434
|
+
}
|
|
1458
1435
|
/**
|
|
1459
1436
|
* Whether `error` is this provider refusing the request because it exceeds
|
|
1460
1437
|
* the model's context window. Default `false`: a provider whose signal has
|
|
@@ -1615,6 +1592,7 @@ const MODALITY_PROMISE_METHODS = [
|
|
|
1615
1592
|
"outpaintImage",
|
|
1616
1593
|
"upscaleImage",
|
|
1617
1594
|
"removeBackground",
|
|
1595
|
+
"estimateDepth",
|
|
1618
1596
|
"relightImage",
|
|
1619
1597
|
"vectorizeImage",
|
|
1620
1598
|
"segmentImage",
|
|
@@ -1634,7 +1612,8 @@ const MODALITY_PROMISE_METHODS = [
|
|
|
1634
1612
|
"lipSync",
|
|
1635
1613
|
"textTo3D",
|
|
1636
1614
|
"imageTo3D",
|
|
1637
|
-
"generateEmbedding"
|
|
1615
|
+
"generateEmbedding",
|
|
1616
|
+
"rerank"
|
|
1638
1617
|
];
|
|
1639
1618
|
/** Async-generator non-chat modality methods wrapped with failure logging. */
|
|
1640
1619
|
const MODALITY_GENERATOR_METHODS = ["textToSpeech"];
|
|
@@ -1669,6 +1648,7 @@ async function* wrapModalityGenerator(provider, original, args, operationName) {
|
|
|
1669
1648
|
const startedAt = Date.now();
|
|
1670
1649
|
const source = original.apply(provider, args);
|
|
1671
1650
|
let exhausted = false;
|
|
1651
|
+
let failure;
|
|
1672
1652
|
try {
|
|
1673
1653
|
while (true) {
|
|
1674
1654
|
const result = await runInSlot(() => source.next());
|
|
@@ -1680,6 +1660,7 @@ async function* wrapModalityGenerator(provider, original, args, operationName) {
|
|
|
1680
1660
|
}
|
|
1681
1661
|
}
|
|
1682
1662
|
catch (err) {
|
|
1663
|
+
failure = err;
|
|
1683
1664
|
annotateProviderError(err, {
|
|
1684
1665
|
provider: provider.provider,
|
|
1685
1666
|
model: extractModelId(args)
|
|
@@ -1702,8 +1683,22 @@ async function* wrapModalityGenerator(provider, original, args, operationName) {
|
|
|
1702
1683
|
value: undefined
|
|
1703
1684
|
})).catch(() => { });
|
|
1704
1685
|
}
|
|
1686
|
+
provider.recordModalityCall({
|
|
1687
|
+
operation: operationName,
|
|
1688
|
+
args,
|
|
1689
|
+
startedAt,
|
|
1690
|
+
error: failure
|
|
1691
|
+
});
|
|
1705
1692
|
}
|
|
1706
1693
|
}
|
|
1694
|
+
/** Metadata for a non-chat modality span. The prompt and media stay out of it. */
|
|
1695
|
+
function modalitySpanAttributes(provider, operation, args) {
|
|
1696
|
+
return {
|
|
1697
|
+
"gen_ai.system": provider,
|
|
1698
|
+
"gen_ai.operation.name": operation,
|
|
1699
|
+
"gen_ai.request.model": extractModelId(args)
|
|
1700
|
+
};
|
|
1701
|
+
}
|
|
1707
1702
|
/** Attach gen_ai usage attributes to a span (no-op if usage is null). */
|
|
1708
1703
|
function applyUsageAttributes(span, usage) {
|
|
1709
1704
|
if (!usage)
|