@esankhan3/anvil-agent-core 0.1.0
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 +142 -0
- package/dist/__tests__/adapter-enrichment.test.d.ts +12 -0
- package/dist/__tests__/adapter-enrichment.test.d.ts.map +1 -0
- package/dist/__tests__/adapter-enrichment.test.js +199 -0
- package/dist/__tests__/adapter-enrichment.test.js.map +1 -0
- package/dist/__tests__/adk-anthropic-llm.test.d.ts +18 -0
- package/dist/__tests__/adk-anthropic-llm.test.d.ts.map +1 -0
- package/dist/__tests__/adk-anthropic-llm.test.js +124 -0
- package/dist/__tests__/adk-anthropic-llm.test.js.map +1 -0
- package/dist/__tests__/cost-breakdown.test.d.ts +11 -0
- package/dist/__tests__/cost-breakdown.test.d.ts.map +1 -0
- package/dist/__tests__/cost-breakdown.test.js +163 -0
- package/dist/__tests__/cost-breakdown.test.js.map +1 -0
- package/dist/__tests__/mcp.test.d.ts +13 -0
- package/dist/__tests__/mcp.test.d.ts.map +1 -0
- package/dist/__tests__/mcp.test.js +413 -0
- package/dist/__tests__/mcp.test.js.map +1 -0
- package/dist/__tests__/ollama-adapter-agentic.test.d.ts +15 -0
- package/dist/__tests__/ollama-adapter-agentic.test.d.ts.map +1 -0
- package/dist/__tests__/ollama-adapter-agentic.test.js +268 -0
- package/dist/__tests__/ollama-adapter-agentic.test.js.map +1 -0
- package/dist/__tests__/ollama-adapter-executor.test.d.ts +10 -0
- package/dist/__tests__/ollama-adapter-executor.test.d.ts.map +1 -0
- package/dist/__tests__/ollama-adapter-executor.test.js +95 -0
- package/dist/__tests__/ollama-adapter-executor.test.js.map +1 -0
- package/dist/__tests__/openai-adapter-output.test.d.ts +17 -0
- package/dist/__tests__/openai-adapter-output.test.d.ts.map +1 -0
- package/dist/__tests__/openai-adapter-output.test.js +127 -0
- package/dist/__tests__/openai-adapter-output.test.js.map +1 -0
- package/dist/__tests__/opencode-adapter.test.d.ts +7 -0
- package/dist/__tests__/opencode-adapter.test.d.ts.map +1 -0
- package/dist/__tests__/opencode-adapter.test.js +141 -0
- package/dist/__tests__/opencode-adapter.test.js.map +1 -0
- package/dist/__tests__/openrouter-adapter-agentic.test.d.ts +11 -0
- package/dist/__tests__/openrouter-adapter-agentic.test.d.ts.map +1 -0
- package/dist/__tests__/openrouter-adapter-agentic.test.js +297 -0
- package/dist/__tests__/openrouter-adapter-agentic.test.js.map +1 -0
- package/dist/__tests__/router-circuit-breaker.test.d.ts +6 -0
- package/dist/__tests__/router-circuit-breaker.test.d.ts.map +1 -0
- package/dist/__tests__/router-circuit-breaker.test.js +253 -0
- package/dist/__tests__/router-circuit-breaker.test.js.map +1 -0
- package/dist/__tests__/router-config-loader.test.d.ts +8 -0
- package/dist/__tests__/router-config-loader.test.d.ts.map +1 -0
- package/dist/__tests__/router-config-loader.test.js +172 -0
- package/dist/__tests__/router-config-loader.test.js.map +1 -0
- package/dist/__tests__/router-discovery.test.d.ts +5 -0
- package/dist/__tests__/router-discovery.test.d.ts.map +1 -0
- package/dist/__tests__/router-discovery.test.js +129 -0
- package/dist/__tests__/router-discovery.test.js.map +1 -0
- package/dist/__tests__/router-fallback.test.d.ts +9 -0
- package/dist/__tests__/router-fallback.test.d.ts.map +1 -0
- package/dist/__tests__/router-fallback.test.js +283 -0
- package/dist/__tests__/router-fallback.test.js.map +1 -0
- package/dist/__tests__/router-local-executor.test.d.ts +6 -0
- package/dist/__tests__/router-local-executor.test.d.ts.map +1 -0
- package/dist/__tests__/router-local-executor.test.js +193 -0
- package/dist/__tests__/router-local-executor.test.js.map +1 -0
- package/dist/__tests__/router-model-registry.test.d.ts +8 -0
- package/dist/__tests__/router-model-registry.test.d.ts.map +1 -0
- package/dist/__tests__/router-model-registry.test.js +389 -0
- package/dist/__tests__/router-model-registry.test.js.map +1 -0
- package/dist/__tests__/router-rate-limiter.test.d.ts +8 -0
- package/dist/__tests__/router-rate-limiter.test.d.ts.map +1 -0
- package/dist/__tests__/router-rate-limiter.test.js +128 -0
- package/dist/__tests__/router-rate-limiter.test.js.map +1 -0
- package/dist/__tests__/router-resolver.test.d.ts +7 -0
- package/dist/__tests__/router-resolver.test.d.ts.map +1 -0
- package/dist/__tests__/router-resolver.test.js +110 -0
- package/dist/__tests__/router-resolver.test.js.map +1 -0
- package/dist/__tests__/router-retry.test.d.ts +7 -0
- package/dist/__tests__/router-retry.test.d.ts.map +1 -0
- package/dist/__tests__/router-retry.test.js +302 -0
- package/dist/__tests__/router-retry.test.js.map +1 -0
- package/dist/__tests__/router-scaffold.test.d.ts +11 -0
- package/dist/__tests__/router-scaffold.test.d.ts.map +1 -0
- package/dist/__tests__/router-scaffold.test.js +103 -0
- package/dist/__tests__/router-scaffold.test.js.map +1 -0
- package/dist/__tests__/router-spend-ledger.test.d.ts +8 -0
- package/dist/__tests__/router-spend-ledger.test.d.ts.map +1 -0
- package/dist/__tests__/router-spend-ledger.test.js +227 -0
- package/dist/__tests__/router-spend-ledger.test.js.map +1 -0
- package/dist/__tests__/router-telemetry.test.d.ts +11 -0
- package/dist/__tests__/router-telemetry.test.d.ts.map +1 -0
- package/dist/__tests__/router-telemetry.test.js +173 -0
- package/dist/__tests__/router-telemetry.test.js.map +1 -0
- package/dist/__tests__/single-shot.test.d.ts +12 -0
- package/dist/__tests__/single-shot.test.d.ts.map +1 -0
- package/dist/__tests__/single-shot.test.js +204 -0
- package/dist/__tests__/single-shot.test.js.map +1 -0
- package/dist/__tests__/skills-prompt.test.d.ts +11 -0
- package/dist/__tests__/skills-prompt.test.d.ts.map +1 -0
- package/dist/__tests__/skills-prompt.test.js +208 -0
- package/dist/__tests__/skills-prompt.test.js.map +1 -0
- package/dist/__tests__/skills.test.d.ts +11 -0
- package/dist/__tests__/skills.test.d.ts.map +1 -0
- package/dist/__tests__/skills.test.js +161 -0
- package/dist/__tests__/skills.test.js.map +1 -0
- package/dist/__tests__/telemetry-integration.test.d.ts +12 -0
- package/dist/__tests__/telemetry-integration.test.d.ts.map +1 -0
- package/dist/__tests__/telemetry-integration.test.js +153 -0
- package/dist/__tests__/telemetry-integration.test.js.map +1 -0
- package/dist/__tests__/telemetry.test.d.ts +13 -0
- package/dist/__tests__/telemetry.test.d.ts.map +1 -0
- package/dist/__tests__/telemetry.test.js +161 -0
- package/dist/__tests__/telemetry.test.js.map +1 -0
- package/dist/__tests__/upstream-error.test.d.ts +8 -0
- package/dist/__tests__/upstream-error.test.d.ts.map +1 -0
- package/dist/__tests__/upstream-error.test.js +186 -0
- package/dist/__tests__/upstream-error.test.js.map +1 -0
- package/dist/adk-adapter.d.ts +45 -0
- package/dist/adk-adapter.d.ts.map +1 -0
- package/dist/adk-adapter.js +403 -0
- package/dist/adk-adapter.js.map +1 -0
- package/dist/adk-anthropic-llm.d.ts +59 -0
- package/dist/adk-anthropic-llm.d.ts.map +1 -0
- package/dist/adk-anthropic-llm.js +397 -0
- package/dist/adk-anthropic-llm.js.map +1 -0
- package/dist/agent/index.d.ts +14 -0
- package/dist/agent/index.d.ts.map +1 -0
- package/dist/agent/index.js +14 -0
- package/dist/agent/index.js.map +1 -0
- package/dist/agent/session/__tests__/bridge-tool-executor.test.d.ts +10 -0
- package/dist/agent/session/__tests__/bridge-tool-executor.test.d.ts.map +1 -0
- package/dist/agent/session/__tests__/bridge-tool-executor.test.js +152 -0
- package/dist/agent/session/__tests__/bridge-tool-executor.test.js.map +1 -0
- package/dist/agent/session/__tests__/collect-trajectory.test.d.ts +18 -0
- package/dist/agent/session/__tests__/collect-trajectory.test.d.ts.map +1 -0
- package/dist/agent/session/__tests__/collect-trajectory.test.js +208 -0
- package/dist/agent/session/__tests__/collect-trajectory.test.js.map +1 -0
- package/dist/agent/session/__tests__/run-with-agent.test.d.ts +8 -0
- package/dist/agent/session/__tests__/run-with-agent.test.d.ts.map +1 -0
- package/dist/agent/session/__tests__/run-with-agent.test.js +98 -0
- package/dist/agent/session/__tests__/run-with-agent.test.js.map +1 -0
- package/dist/agent/session/__tests__/runtime.test.d.ts +7 -0
- package/dist/agent/session/__tests__/runtime.test.d.ts.map +1 -0
- package/dist/agent/session/__tests__/runtime.test.js +361 -0
- package/dist/agent/session/__tests__/runtime.test.js.map +1 -0
- package/dist/agent/session/__tests__/skills-mcp-spawn.test.d.ts +15 -0
- package/dist/agent/session/__tests__/skills-mcp-spawn.test.d.ts.map +1 -0
- package/dist/agent/session/__tests__/skills-mcp-spawn.test.js +160 -0
- package/dist/agent/session/__tests__/skills-mcp-spawn.test.js.map +1 -0
- package/dist/agent/session/__tests__/spawn-telemetry.test.d.ts +13 -0
- package/dist/agent/session/__tests__/spawn-telemetry.test.d.ts.map +1 -0
- package/dist/agent/session/__tests__/spawn-telemetry.test.js +135 -0
- package/dist/agent/session/__tests__/spawn-telemetry.test.js.map +1 -0
- package/dist/agent/session/__tests__/types.test.d.ts +9 -0
- package/dist/agent/session/__tests__/types.test.d.ts.map +1 -0
- package/dist/agent/session/__tests__/types.test.js +220 -0
- package/dist/agent/session/__tests__/types.test.js.map +1 -0
- package/dist/agent/session/adapter.d.ts +108 -0
- package/dist/agent/session/adapter.d.ts.map +1 -0
- package/dist/agent/session/adapter.js +39 -0
- package/dist/agent/session/adapter.js.map +1 -0
- package/dist/agent/session/collect-trajectory.d.ts +36 -0
- package/dist/agent/session/collect-trajectory.d.ts.map +1 -0
- package/dist/agent/session/collect-trajectory.js +193 -0
- package/dist/agent/session/collect-trajectory.js.map +1 -0
- package/dist/agent/session/default-adapter-factory.d.ts +48 -0
- package/dist/agent/session/default-adapter-factory.d.ts.map +1 -0
- package/dist/agent/session/default-adapter-factory.js +227 -0
- package/dist/agent/session/default-adapter-factory.js.map +1 -0
- package/dist/agent/session/headless-types.d.ts +85 -0
- package/dist/agent/session/headless-types.d.ts.map +1 -0
- package/dist/agent/session/headless-types.js +16 -0
- package/dist/agent/session/headless-types.js.map +1 -0
- package/dist/agent/session/index.d.ts +18 -0
- package/dist/agent/session/index.d.ts.map +1 -0
- package/dist/agent/session/index.js +20 -0
- package/dist/agent/session/index.js.map +1 -0
- package/dist/agent/session/language-model-bridge.d.ts +84 -0
- package/dist/agent/session/language-model-bridge.d.ts.map +1 -0
- package/dist/agent/session/language-model-bridge.js +454 -0
- package/dist/agent/session/language-model-bridge.js.map +1 -0
- package/dist/agent/session/legacy-adapter-types.d.ts +63 -0
- package/dist/agent/session/legacy-adapter-types.d.ts.map +1 -0
- package/dist/agent/session/legacy-adapter-types.js +11 -0
- package/dist/agent/session/legacy-adapter-types.js.map +1 -0
- package/dist/agent/session/run-with-agent.d.ts +36 -0
- package/dist/agent/session/run-with-agent.d.ts.map +1 -0
- package/dist/agent/session/run-with-agent.js +81 -0
- package/dist/agent/session/run-with-agent.js.map +1 -0
- package/dist/agent/session/session-registry.d.ts +71 -0
- package/dist/agent/session/session-registry.d.ts.map +1 -0
- package/dist/agent/session/session-registry.js +209 -0
- package/dist/agent/session/session-registry.js.map +1 -0
- package/dist/agent/session/session.d.ts +76 -0
- package/dist/agent/session/session.d.ts.map +1 -0
- package/dist/agent/session/session.js +327 -0
- package/dist/agent/session/session.js.map +1 -0
- package/dist/agent/session/types.d.ts +230 -0
- package/dist/agent/session/types.d.ts.map +1 -0
- package/dist/agent/session/types.js +44 -0
- package/dist/agent/session/types.js.map +1 -0
- package/dist/checkpoint/__tests__/blob-store.test.d.ts +5 -0
- package/dist/checkpoint/__tests__/blob-store.test.d.ts.map +1 -0
- package/dist/checkpoint/__tests__/blob-store.test.js +82 -0
- package/dist/checkpoint/__tests__/blob-store.test.js.map +1 -0
- package/dist/checkpoint/__tests__/key.test.d.ts +7 -0
- package/dist/checkpoint/__tests__/key.test.d.ts.map +1 -0
- package/dist/checkpoint/__tests__/key.test.js +130 -0
- package/dist/checkpoint/__tests__/key.test.js.map +1 -0
- package/dist/checkpoint/__tests__/runner.test.d.ts +12 -0
- package/dist/checkpoint/__tests__/runner.test.d.ts.map +1 -0
- package/dist/checkpoint/__tests__/runner.test.js +201 -0
- package/dist/checkpoint/__tests__/runner.test.js.map +1 -0
- package/dist/checkpoint/__tests__/store.test.d.ts +6 -0
- package/dist/checkpoint/__tests__/store.test.d.ts.map +1 -0
- package/dist/checkpoint/__tests__/store.test.js +150 -0
- package/dist/checkpoint/__tests__/store.test.js.map +1 -0
- package/dist/checkpoint/blob-store.d.ts +41 -0
- package/dist/checkpoint/blob-store.d.ts.map +1 -0
- package/dist/checkpoint/blob-store.js +119 -0
- package/dist/checkpoint/blob-store.js.map +1 -0
- package/dist/checkpoint/index.d.ts +15 -0
- package/dist/checkpoint/index.d.ts.map +1 -0
- package/dist/checkpoint/index.js +14 -0
- package/dist/checkpoint/index.js.map +1 -0
- package/dist/checkpoint/key.d.ts +39 -0
- package/dist/checkpoint/key.d.ts.map +1 -0
- package/dist/checkpoint/key.js +112 -0
- package/dist/checkpoint/key.js.map +1 -0
- package/dist/checkpoint/runner.d.ts +83 -0
- package/dist/checkpoint/runner.d.ts.map +1 -0
- package/dist/checkpoint/runner.js +146 -0
- package/dist/checkpoint/runner.js.map +1 -0
- package/dist/checkpoint/store.d.ts +91 -0
- package/dist/checkpoint/store.d.ts.map +1 -0
- package/dist/checkpoint/store.js +292 -0
- package/dist/checkpoint/store.js.map +1 -0
- package/dist/checkpoint/types.d.ts +74 -0
- package/dist/checkpoint/types.d.ts.map +1 -0
- package/dist/checkpoint/types.js +16 -0
- package/dist/checkpoint/types.js.map +1 -0
- package/dist/claude-adapter.d.ts +23 -0
- package/dist/claude-adapter.d.ts.map +1 -0
- package/dist/claude-adapter.js +233 -0
- package/dist/claude-adapter.js.map +1 -0
- package/dist/cost.d.ts +67 -0
- package/dist/cost.d.ts.map +1 -0
- package/dist/cost.js +148 -0
- package/dist/cost.js.map +1 -0
- package/dist/data/model-prices.json +39681 -0
- package/dist/fallback-adapter.d.ts +51 -0
- package/dist/fallback-adapter.d.ts.map +1 -0
- package/dist/fallback-adapter.js +116 -0
- package/dist/fallback-adapter.js.map +1 -0
- package/dist/gemini-adapter.d.ts +22 -0
- package/dist/gemini-adapter.d.ts.map +1 -0
- package/dist/gemini-adapter.js +185 -0
- package/dist/gemini-adapter.js.map +1 -0
- package/dist/gemini-cli-adapter.d.ts +24 -0
- package/dist/gemini-cli-adapter.d.ts.map +1 -0
- package/dist/gemini-cli-adapter.js +169 -0
- package/dist/gemini-cli-adapter.js.map +1 -0
- package/dist/index.d.ts +39 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +39 -0
- package/dist/index.js.map +1 -0
- package/dist/mcp/client.d.ts +32 -0
- package/dist/mcp/client.d.ts.map +1 -0
- package/dist/mcp/client.js +92 -0
- package/dist/mcp/client.js.map +1 -0
- package/dist/mcp/config-loader.d.ts +36 -0
- package/dist/mcp/config-loader.d.ts.map +1 -0
- package/dist/mcp/config-loader.js +129 -0
- package/dist/mcp/config-loader.js.map +1 -0
- package/dist/mcp/index.d.ts +12 -0
- package/dist/mcp/index.d.ts.map +1 -0
- package/dist/mcp/index.js +11 -0
- package/dist/mcp/index.js.map +1 -0
- package/dist/mcp/tool-merger.d.ts +18 -0
- package/dist/mcp/tool-merger.d.ts.map +1 -0
- package/dist/mcp/tool-merger.js +34 -0
- package/dist/mcp/tool-merger.js.map +1 -0
- package/dist/mcp/types.d.ts +35 -0
- package/dist/mcp/types.d.ts.map +1 -0
- package/dist/mcp/types.js +10 -0
- package/dist/mcp/types.js.map +1 -0
- package/dist/ollama-adapter.d.ts +95 -0
- package/dist/ollama-adapter.d.ts.map +1 -0
- package/dist/ollama-adapter.js +404 -0
- package/dist/ollama-adapter.js.map +1 -0
- package/dist/openai-adapter.d.ts +40 -0
- package/dist/openai-adapter.d.ts.map +1 -0
- package/dist/openai-adapter.js +81 -0
- package/dist/openai-adapter.js.map +1 -0
- package/dist/opencode-adapter.d.ts +39 -0
- package/dist/opencode-adapter.d.ts.map +1 -0
- package/dist/opencode-adapter.js +105 -0
- package/dist/opencode-adapter.js.map +1 -0
- package/dist/openrouter-adapter.d.ts +69 -0
- package/dist/openrouter-adapter.d.ts.map +1 -0
- package/dist/openrouter-adapter.js +481 -0
- package/dist/openrouter-adapter.js.map +1 -0
- package/dist/registry.d.ts +55 -0
- package/dist/registry.d.ts.map +1 -0
- package/dist/registry.js +191 -0
- package/dist/registry.js.map +1 -0
- package/dist/router/circuit-breaker.d.ts +57 -0
- package/dist/router/circuit-breaker.d.ts.map +1 -0
- package/dist/router/circuit-breaker.js +110 -0
- package/dist/router/circuit-breaker.js.map +1 -0
- package/dist/router/config-loader.d.ts +43 -0
- package/dist/router/config-loader.d.ts.map +1 -0
- package/dist/router/config-loader.js +155 -0
- package/dist/router/config-loader.js.map +1 -0
- package/dist/router/discovery.d.ts +37 -0
- package/dist/router/discovery.d.ts.map +1 -0
- package/dist/router/discovery.js +54 -0
- package/dist/router/discovery.js.map +1 -0
- package/dist/router/errors.d.ts +39 -0
- package/dist/router/errors.d.ts.map +1 -0
- package/dist/router/errors.js +103 -0
- package/dist/router/errors.js.map +1 -0
- package/dist/router/index.d.ts +31 -0
- package/dist/router/index.d.ts.map +1 -0
- package/dist/router/index.js +20 -0
- package/dist/router/index.js.map +1 -0
- package/dist/router/local-executor.d.ts +62 -0
- package/dist/router/local-executor.d.ts.map +1 -0
- package/dist/router/local-executor.js +161 -0
- package/dist/router/local-executor.js.map +1 -0
- package/dist/router/model-registry.d.ts +90 -0
- package/dist/router/model-registry.d.ts.map +1 -0
- package/dist/router/model-registry.js +242 -0
- package/dist/router/model-registry.js.map +1 -0
- package/dist/router/rate-limiter.d.ts +63 -0
- package/dist/router/rate-limiter.d.ts.map +1 -0
- package/dist/router/rate-limiter.js +136 -0
- package/dist/router/rate-limiter.js.map +1 -0
- package/dist/router/resolver.d.ts +45 -0
- package/dist/router/resolver.d.ts.map +1 -0
- package/dist/router/resolver.js +71 -0
- package/dist/router/resolver.js.map +1 -0
- package/dist/router/retry.d.ts +58 -0
- package/dist/router/retry.d.ts.map +1 -0
- package/dist/router/retry.js +119 -0
- package/dist/router/retry.js.map +1 -0
- package/dist/router/router.d.ts +100 -0
- package/dist/router/router.d.ts.map +1 -0
- package/dist/router/router.js +306 -0
- package/dist/router/router.js.map +1 -0
- package/dist/router/spend-ledger.d.ts +69 -0
- package/dist/router/spend-ledger.d.ts.map +1 -0
- package/dist/router/spend-ledger.js +191 -0
- package/dist/router/spend-ledger.js.map +1 -0
- package/dist/router/telemetry.d.ts +48 -0
- package/dist/router/telemetry.d.ts.map +1 -0
- package/dist/router/telemetry.js +112 -0
- package/dist/router/telemetry.js.map +1 -0
- package/dist/router/types.d.ts +95 -0
- package/dist/router/types.d.ts.map +1 -0
- package/dist/router/types.js +16 -0
- package/dist/router/types.js.map +1 -0
- package/dist/single-shot.d.ts +60 -0
- package/dist/single-shot.d.ts.map +1 -0
- package/dist/single-shot.js +385 -0
- package/dist/single-shot.js.map +1 -0
- package/dist/skills/activator.d.ts +17 -0
- package/dist/skills/activator.d.ts.map +1 -0
- package/dist/skills/activator.js +24 -0
- package/dist/skills/activator.js.map +1 -0
- package/dist/skills/compose.d.ts +43 -0
- package/dist/skills/compose.d.ts.map +1 -0
- package/dist/skills/compose.js +53 -0
- package/dist/skills/compose.js.map +1 -0
- package/dist/skills/index.d.ts +17 -0
- package/dist/skills/index.d.ts.map +1 -0
- package/dist/skills/index.js +16 -0
- package/dist/skills/index.js.map +1 -0
- package/dist/skills/loader.d.ts +9 -0
- package/dist/skills/loader.d.ts.map +1 -0
- package/dist/skills/loader.js +49 -0
- package/dist/skills/loader.js.map +1 -0
- package/dist/skills/parser.d.ts +13 -0
- package/dist/skills/parser.d.ts.map +1 -0
- package/dist/skills/parser.js +60 -0
- package/dist/skills/parser.js.map +1 -0
- package/dist/skills/render.d.ts +11 -0
- package/dist/skills/render.d.ts.map +1 -0
- package/dist/skills/render.js +21 -0
- package/dist/skills/render.js.map +1 -0
- package/dist/skills/resolve-dir.d.ts +20 -0
- package/dist/skills/resolve-dir.d.ts.map +1 -0
- package/dist/skills/resolve-dir.js +30 -0
- package/dist/skills/resolve-dir.js.map +1 -0
- package/dist/skills/tool-policy.d.ts +26 -0
- package/dist/skills/tool-policy.d.ts.map +1 -0
- package/dist/skills/tool-policy.js +33 -0
- package/dist/skills/tool-policy.js.map +1 -0
- package/dist/skills/types.d.ts +42 -0
- package/dist/skills/types.d.ts.map +1 -0
- package/dist/skills/types.js +8 -0
- package/dist/skills/types.js.map +1 -0
- package/dist/stream-format.d.ts +100 -0
- package/dist/stream-format.d.ts.map +1 -0
- package/dist/stream-format.js +90 -0
- package/dist/stream-format.js.map +1 -0
- package/dist/telemetry/attributes.d.ts +38 -0
- package/dist/telemetry/attributes.d.ts.map +1 -0
- package/dist/telemetry/attributes.js +39 -0
- package/dist/telemetry/attributes.js.map +1 -0
- package/dist/telemetry/config.d.ts +30 -0
- package/dist/telemetry/config.d.ts.map +1 -0
- package/dist/telemetry/config.js +54 -0
- package/dist/telemetry/config.js.map +1 -0
- package/dist/telemetry/exporters.d.ts +10 -0
- package/dist/telemetry/exporters.d.ts.map +1 -0
- package/dist/telemetry/exporters.js +46 -0
- package/dist/telemetry/exporters.js.map +1 -0
- package/dist/telemetry/index.d.ts +15 -0
- package/dist/telemetry/index.d.ts.map +1 -0
- package/dist/telemetry/index.js +12 -0
- package/dist/telemetry/index.js.map +1 -0
- package/dist/telemetry/instrument.d.ts +36 -0
- package/dist/telemetry/instrument.d.ts.map +1 -0
- package/dist/telemetry/instrument.js +215 -0
- package/dist/telemetry/instrument.js.map +1 -0
- package/dist/telemetry/metrics.d.ts +45 -0
- package/dist/telemetry/metrics.d.ts.map +1 -0
- package/dist/telemetry/metrics.js +186 -0
- package/dist/telemetry/metrics.js.map +1 -0
- package/dist/telemetry/tracer.d.ts +33 -0
- package/dist/telemetry/tracer.d.ts.map +1 -0
- package/dist/telemetry/tracer.js +162 -0
- package/dist/telemetry/tracer.js.map +1 -0
- package/dist/tools/__tests__/builtin.test.d.ts +7 -0
- package/dist/tools/__tests__/builtin.test.d.ts.map +1 -0
- package/dist/tools/__tests__/builtin.test.js +242 -0
- package/dist/tools/__tests__/builtin.test.js.map +1 -0
- package/dist/tools/builtin.d.ts +29 -0
- package/dist/tools/builtin.d.ts.map +1 -0
- package/dist/tools/builtin.js +367 -0
- package/dist/tools/builtin.js.map +1 -0
- package/dist/tools/index.d.ts +4 -0
- package/dist/tools/index.d.ts.map +1 -0
- package/dist/tools/index.js +3 -0
- package/dist/tools/index.js.map +1 -0
- package/dist/tools/path-guard.d.ts +23 -0
- package/dist/tools/path-guard.d.ts.map +1 -0
- package/dist/tools/path-guard.js +66 -0
- package/dist/tools/path-guard.js.map +1 -0
- package/dist/tools/types.d.ts +45 -0
- package/dist/tools/types.d.ts.map +1 -0
- package/dist/tools/types.js +11 -0
- package/dist/tools/types.js.map +1 -0
- package/dist/types.d.ts +249 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +22 -0
- package/dist/types.js.map +1 -0
- package/dist/upstream-error.d.ts +64 -0
- package/dist/upstream-error.d.ts.map +1 -0
- package/dist/upstream-error.js +105 -0
- package/dist/upstream-error.js.map +1 -0
- package/dist/version.d.ts +2 -0
- package/dist/version.d.ts.map +1 -0
- package/dist/version.js +2 -0
- package/dist/version.js.map +1 -0
- package/package.json +49 -0
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* GenAI semantic-convention attribute keys.
|
|
3
|
+
*
|
|
4
|
+
* Mirrors the OpenTelemetry GenAI SIG spec
|
|
5
|
+
* (https://opentelemetry.io/docs/specs/semconv/gen-ai/llm-spans/) plus
|
|
6
|
+
* Anvil-specific extensions for cost USD, cache tokens, and tool argument
|
|
7
|
+
* size. Anvil-extension attributes follow the same `gen_ai.*` namespace so
|
|
8
|
+
* backends without LLM-specific UIs still render them as plain attributes.
|
|
9
|
+
*/
|
|
10
|
+
export const GenAi = {
|
|
11
|
+
// -- Spec --------------------------------------------------------------
|
|
12
|
+
SYSTEM: 'gen_ai.system',
|
|
13
|
+
REQUEST_MODEL: 'gen_ai.request.model',
|
|
14
|
+
REQUEST_MAX_TOKENS: 'gen_ai.request.max_tokens',
|
|
15
|
+
REQUEST_TEMPERATURE: 'gen_ai.request.temperature',
|
|
16
|
+
RESPONSE_FINISH_REASONS: 'gen_ai.response.finish_reasons',
|
|
17
|
+
RESPONSE_MODEL: 'gen_ai.response.model',
|
|
18
|
+
RESPONSE_ID: 'gen_ai.response.id',
|
|
19
|
+
USAGE_INPUT_TOKENS: 'gen_ai.usage.input_tokens',
|
|
20
|
+
USAGE_OUTPUT_TOKENS: 'gen_ai.usage.output_tokens',
|
|
21
|
+
TOOL_NAME: 'gen_ai.tool.name',
|
|
22
|
+
// -- Anvil extensions --------------------------------------------------
|
|
23
|
+
USAGE_CACHE_READ_TOKENS: 'gen_ai.usage.cache_read_tokens',
|
|
24
|
+
USAGE_CACHE_WRITE_TOKENS: 'gen_ai.usage.cache_write_tokens',
|
|
25
|
+
USAGE_CACHE_HIT_RATIO: 'gen_ai.usage.cache_hit_ratio',
|
|
26
|
+
USAGE_COST_USD: 'gen_ai.usage.cost_usd',
|
|
27
|
+
USAGE_COST_INPUT_USD: 'gen_ai.usage.cost_input_usd',
|
|
28
|
+
USAGE_COST_OUTPUT_USD: 'gen_ai.usage.cost_output_usd',
|
|
29
|
+
USAGE_COST_CACHE_READ_USD: 'gen_ai.usage.cost_cache_read_usd',
|
|
30
|
+
USAGE_COST_CACHE_WRITE_USD: 'gen_ai.usage.cost_cache_write_usd',
|
|
31
|
+
TOOL_ARGUMENTS_SIZE: 'gen_ai.tool.arguments_size_bytes',
|
|
32
|
+
REASONING_TOKENS: 'gen_ai.reasoning.tokens',
|
|
33
|
+
REASONING_TEXT: 'gen_ai.reasoning.text',
|
|
34
|
+
MESSAGES_COUNT: 'gen_ai.messages.count',
|
|
35
|
+
TOOLS_COUNT: 'gen_ai.tools.count',
|
|
36
|
+
PROMPT: 'gen_ai.prompt',
|
|
37
|
+
COMPLETION: 'gen_ai.completion',
|
|
38
|
+
};
|
|
39
|
+
//# sourceMappingURL=attributes.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"attributes.js","sourceRoot":"","sources":["../../src/telemetry/attributes.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,MAAM,CAAC,MAAM,KAAK,GAAG;IACnB,yEAAyE;IACzE,MAAM,EAAE,eAAe;IACvB,aAAa,EAAE,sBAAsB;IACrC,kBAAkB,EAAE,2BAA2B;IAC/C,mBAAmB,EAAE,4BAA4B;IACjD,uBAAuB,EAAE,gCAAgC;IACzD,cAAc,EAAE,uBAAuB;IACvC,WAAW,EAAE,oBAAoB;IACjC,kBAAkB,EAAE,2BAA2B;IAC/C,mBAAmB,EAAE,4BAA4B;IACjD,SAAS,EAAE,kBAAkB;IAE7B,yEAAyE;IACzE,uBAAuB,EAAE,gCAAgC;IACzD,wBAAwB,EAAE,iCAAiC;IAC3D,qBAAqB,EAAE,8BAA8B;IACrD,cAAc,EAAE,uBAAuB;IACvC,oBAAoB,EAAE,6BAA6B;IACnD,qBAAqB,EAAE,8BAA8B;IACrD,yBAAyB,EAAE,kCAAkC;IAC7D,0BAA0B,EAAE,mCAAmC;IAC/D,mBAAmB,EAAE,kCAAkC;IACvD,gBAAgB,EAAE,yBAAyB;IAC3C,cAAc,EAAE,uBAAuB;IACvC,cAAc,EAAE,uBAAuB;IACvC,WAAW,EAAE,oBAAoB;IACjC,MAAM,EAAE,eAAe;IACvB,UAAU,EAAE,mBAAmB;CACvB,CAAC"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Telemetry configuration — resolved from environment variables.
|
|
3
|
+
*
|
|
4
|
+
* Resolution order:
|
|
5
|
+
* 1. ANVIL_OTEL_DISABLED=1 → disabled (kill-switch wins)
|
|
6
|
+
* 2. OTEL_EXPORTER_OTLP_ENDPOINT set → otlp mode, enabled
|
|
7
|
+
* 3. ANVIL_OTEL_CONSOLE=1 → console mode, enabled
|
|
8
|
+
* 4. otherwise → noop mode, disabled
|
|
9
|
+
*
|
|
10
|
+
* Prompt content recording is OFF by default — opt in via
|
|
11
|
+
* ANVIL_OTEL_RECORD_CONTENT=1 (decision O5).
|
|
12
|
+
*/
|
|
13
|
+
export interface TelemetryConfig {
|
|
14
|
+
/** True when at least one exporter is wired up. */
|
|
15
|
+
enabled: boolean;
|
|
16
|
+
/** Which exporter the tracer should install. */
|
|
17
|
+
exporterMode: 'noop' | 'console' | 'otlp';
|
|
18
|
+
/** OTLP endpoint URL. Only meaningful when exporterMode === 'otlp'. */
|
|
19
|
+
endpoint?: string;
|
|
20
|
+
/** Headers parsed from OTEL_EXPORTER_OTLP_HEADERS (key=value pairs, comma separated). */
|
|
21
|
+
headers?: Record<string, string>;
|
|
22
|
+
/** When true, prompt + completion text are attached to spans. Default false. */
|
|
23
|
+
recordContent: boolean;
|
|
24
|
+
/** Resource attribute service.name. */
|
|
25
|
+
serviceName: string;
|
|
26
|
+
/** Optional sampler hint (mirrors OTEL_TRACES_SAMPLER); the SDK reads this env var natively. */
|
|
27
|
+
sampler?: string;
|
|
28
|
+
}
|
|
29
|
+
export declare function loadTelemetryConfig(): TelemetryConfig;
|
|
30
|
+
//# sourceMappingURL=config.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/telemetry/config.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,MAAM,WAAW,eAAe;IAC9B,mDAAmD;IACnD,OAAO,EAAE,OAAO,CAAC;IACjB,gDAAgD;IAChD,YAAY,EAAE,MAAM,GAAG,SAAS,GAAG,MAAM,CAAC;IAC1C,uEAAuE;IACvE,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,yFAAyF;IACzF,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACjC,gFAAgF;IAChF,aAAa,EAAE,OAAO,CAAC;IACvB,uCAAuC;IACvC,WAAW,EAAE,MAAM,CAAC;IACpB,gGAAgG;IAChG,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAeD,wBAAgB,mBAAmB,IAAI,eAAe,CA0BrD"}
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Telemetry configuration — resolved from environment variables.
|
|
3
|
+
*
|
|
4
|
+
* Resolution order:
|
|
5
|
+
* 1. ANVIL_OTEL_DISABLED=1 → disabled (kill-switch wins)
|
|
6
|
+
* 2. OTEL_EXPORTER_OTLP_ENDPOINT set → otlp mode, enabled
|
|
7
|
+
* 3. ANVIL_OTEL_CONSOLE=1 → console mode, enabled
|
|
8
|
+
* 4. otherwise → noop mode, disabled
|
|
9
|
+
*
|
|
10
|
+
* Prompt content recording is OFF by default — opt in via
|
|
11
|
+
* ANVIL_OTEL_RECORD_CONTENT=1 (decision O5).
|
|
12
|
+
*/
|
|
13
|
+
function parseHeaders(raw) {
|
|
14
|
+
if (!raw)
|
|
15
|
+
return undefined;
|
|
16
|
+
const out = {};
|
|
17
|
+
for (const pair of raw.split(',')) {
|
|
18
|
+
const idx = pair.indexOf('=');
|
|
19
|
+
if (idx <= 0)
|
|
20
|
+
continue;
|
|
21
|
+
const key = pair.slice(0, idx).trim();
|
|
22
|
+
const value = pair.slice(idx + 1).trim();
|
|
23
|
+
if (key)
|
|
24
|
+
out[key] = value;
|
|
25
|
+
}
|
|
26
|
+
return Object.keys(out).length > 0 ? out : undefined;
|
|
27
|
+
}
|
|
28
|
+
export function loadTelemetryConfig() {
|
|
29
|
+
const disabled = process.env.ANVIL_OTEL_DISABLED === '1';
|
|
30
|
+
const endpoint = process.env.OTEL_EXPORTER_OTLP_ENDPOINT?.trim();
|
|
31
|
+
const consoleFlag = process.env.ANVIL_OTEL_CONSOLE === '1';
|
|
32
|
+
const recordContent = process.env.ANVIL_OTEL_RECORD_CONTENT === '1';
|
|
33
|
+
const serviceName = process.env.OTEL_SERVICE_NAME?.trim() || 'anvil-agent-core';
|
|
34
|
+
const sampler = process.env.OTEL_TRACES_SAMPLER?.trim() || undefined;
|
|
35
|
+
if (disabled) {
|
|
36
|
+
return { enabled: false, exporterMode: 'noop', recordContent: false, serviceName, sampler };
|
|
37
|
+
}
|
|
38
|
+
if (endpoint) {
|
|
39
|
+
return {
|
|
40
|
+
enabled: true,
|
|
41
|
+
exporterMode: 'otlp',
|
|
42
|
+
endpoint,
|
|
43
|
+
headers: parseHeaders(process.env.OTEL_EXPORTER_OTLP_HEADERS),
|
|
44
|
+
recordContent,
|
|
45
|
+
serviceName,
|
|
46
|
+
sampler,
|
|
47
|
+
};
|
|
48
|
+
}
|
|
49
|
+
if (consoleFlag) {
|
|
50
|
+
return { enabled: true, exporterMode: 'console', recordContent, serviceName, sampler };
|
|
51
|
+
}
|
|
52
|
+
return { enabled: false, exporterMode: 'noop', recordContent, serviceName, sampler };
|
|
53
|
+
}
|
|
54
|
+
//# sourceMappingURL=config.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/telemetry/config.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAmBH,SAAS,YAAY,CAAC,GAAuB;IAC3C,IAAI,CAAC,GAAG;QAAE,OAAO,SAAS,CAAC;IAC3B,MAAM,GAAG,GAA2B,EAAE,CAAC;IACvC,KAAK,MAAM,IAAI,IAAI,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC;QAClC,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;QAC9B,IAAI,GAAG,IAAI,CAAC;YAAE,SAAS;QACvB,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC;QACtC,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;QACzC,IAAI,GAAG;YAAE,GAAG,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC;IAC5B,CAAC;IACD,OAAO,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,SAAS,CAAC;AACvD,CAAC;AAED,MAAM,UAAU,mBAAmB;IACjC,MAAM,QAAQ,GAAG,OAAO,CAAC,GAAG,CAAC,mBAAmB,KAAK,GAAG,CAAC;IACzD,MAAM,QAAQ,GAAG,OAAO,CAAC,GAAG,CAAC,2BAA2B,EAAE,IAAI,EAAE,CAAC;IACjE,MAAM,WAAW,GAAG,OAAO,CAAC,GAAG,CAAC,kBAAkB,KAAK,GAAG,CAAC;IAC3D,MAAM,aAAa,GAAG,OAAO,CAAC,GAAG,CAAC,yBAAyB,KAAK,GAAG,CAAC;IACpE,MAAM,WAAW,GAAG,OAAO,CAAC,GAAG,CAAC,iBAAiB,EAAE,IAAI,EAAE,IAAI,kBAAkB,CAAC;IAChF,MAAM,OAAO,GAAG,OAAO,CAAC,GAAG,CAAC,mBAAmB,EAAE,IAAI,EAAE,IAAI,SAAS,CAAC;IAErE,IAAI,QAAQ,EAAE,CAAC;QACb,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,YAAY,EAAE,MAAM,EAAE,aAAa,EAAE,KAAK,EAAE,WAAW,EAAE,OAAO,EAAE,CAAC;IAC9F,CAAC;IACD,IAAI,QAAQ,EAAE,CAAC;QACb,OAAO;YACL,OAAO,EAAE,IAAI;YACb,YAAY,EAAE,MAAM;YACpB,QAAQ;YACR,OAAO,EAAE,YAAY,CAAC,OAAO,CAAC,GAAG,CAAC,0BAA0B,CAAC;YAC7D,aAAa;YACb,WAAW;YACX,OAAO;SACR,CAAC;IACJ,CAAC;IACD,IAAI,WAAW,EAAE,CAAC;QAChB,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,YAAY,EAAE,SAAS,EAAE,aAAa,EAAE,WAAW,EAAE,OAAO,EAAE,CAAC;IACzF,CAAC;IACD,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,YAAY,EAAE,MAAM,EAAE,aAAa,EAAE,WAAW,EAAE,OAAO,EAAE,CAAC;AACvF,CAAC"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Exporter factory — produces an OTel SpanExporter from a TelemetryConfig.
|
|
3
|
+
*
|
|
4
|
+
* The 'noop' branch is intentionally unreachable here: callers gate on
|
|
5
|
+
* config.enabled before constructing an exporter (see tracer.ts).
|
|
6
|
+
*/
|
|
7
|
+
import { type SpanExporter } from '@opentelemetry/sdk-trace-base';
|
|
8
|
+
import type { TelemetryConfig } from './config.js';
|
|
9
|
+
export declare function buildExporter(config: TelemetryConfig): SpanExporter;
|
|
10
|
+
//# sourceMappingURL=exporters.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"exporters.d.ts","sourceRoot":"","sources":["../../src/telemetry/exporters.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAuB,KAAK,YAAY,EAAE,MAAM,+BAA+B,CAAC;AAEvF,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAyBnD,wBAAgB,aAAa,CAAC,MAAM,EAAE,eAAe,GAAG,YAAY,CAYnE"}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Exporter factory — produces an OTel SpanExporter from a TelemetryConfig.
|
|
3
|
+
*
|
|
4
|
+
* The 'noop' branch is intentionally unreachable here: callers gate on
|
|
5
|
+
* config.enabled before constructing an exporter (see tracer.ts).
|
|
6
|
+
*/
|
|
7
|
+
import { ConsoleSpanExporter } from '@opentelemetry/sdk-trace-base';
|
|
8
|
+
import { OTLPTraceExporter } from '@opentelemetry/exporter-trace-otlp-http';
|
|
9
|
+
/**
|
|
10
|
+
* Normalize an OTLP HTTP endpoint to include the `/v1/traces` signal path.
|
|
11
|
+
*
|
|
12
|
+
* The OTel JS SDK only auto-appends `/v1/traces` when reading the endpoint
|
|
13
|
+
* from the `OTEL_EXPORTER_OTLP_ENDPOINT` env var directly — not when the URL
|
|
14
|
+
* is passed via the exporter constructor. So `http://localhost:4318`
|
|
15
|
+
* silently 404s against any OTLP HTTP receiver. We append the suffix
|
|
16
|
+
* ourselves when the URL has no path component.
|
|
17
|
+
*/
|
|
18
|
+
function normalizeOtlpEndpoint(endpoint) {
|
|
19
|
+
if (!endpoint)
|
|
20
|
+
return endpoint;
|
|
21
|
+
try {
|
|
22
|
+
const url = new URL(endpoint);
|
|
23
|
+
if (url.pathname === '' || url.pathname === '/') {
|
|
24
|
+
url.pathname = '/v1/traces';
|
|
25
|
+
return url.toString();
|
|
26
|
+
}
|
|
27
|
+
return endpoint;
|
|
28
|
+
}
|
|
29
|
+
catch {
|
|
30
|
+
return endpoint;
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
export function buildExporter(config) {
|
|
34
|
+
switch (config.exporterMode) {
|
|
35
|
+
case 'console':
|
|
36
|
+
return new ConsoleSpanExporter();
|
|
37
|
+
case 'otlp':
|
|
38
|
+
return new OTLPTraceExporter({
|
|
39
|
+
url: normalizeOtlpEndpoint(config.endpoint),
|
|
40
|
+
headers: config.headers,
|
|
41
|
+
});
|
|
42
|
+
case 'noop':
|
|
43
|
+
throw new Error('buildExporter called with noop mode — callers must gate on config.enabled');
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
//# sourceMappingURL=exporters.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"exporters.js","sourceRoot":"","sources":["../../src/telemetry/exporters.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,mBAAmB,EAAqB,MAAM,+BAA+B,CAAC;AACvF,OAAO,EAAE,iBAAiB,EAAE,MAAM,yCAAyC,CAAC;AAG5E;;;;;;;;GAQG;AACH,SAAS,qBAAqB,CAAC,QAA4B;IACzD,IAAI,CAAC,QAAQ;QAAE,OAAO,QAAQ,CAAC;IAC/B,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,QAAQ,CAAC,CAAC;QAC9B,IAAI,GAAG,CAAC,QAAQ,KAAK,EAAE,IAAI,GAAG,CAAC,QAAQ,KAAK,GAAG,EAAE,CAAC;YAChD,GAAG,CAAC,QAAQ,GAAG,YAAY,CAAC;YAC5B,OAAO,GAAG,CAAC,QAAQ,EAAE,CAAC;QACxB,CAAC;QACD,OAAO,QAAQ,CAAC;IAClB,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,QAAQ,CAAC;IAClB,CAAC;AACH,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,MAAuB;IACnD,QAAQ,MAAM,CAAC,YAAY,EAAE,CAAC;QAC5B,KAAK,SAAS;YACZ,OAAO,IAAI,mBAAmB,EAAE,CAAC;QACnC,KAAK,MAAM;YACT,OAAO,IAAI,iBAAiB,CAAC;gBAC3B,GAAG,EAAE,qBAAqB,CAAC,MAAM,CAAC,QAAQ,CAAC;gBAC3C,OAAO,EAAE,MAAM,CAAC,OAAO;aACxB,CAAC,CAAC;QACL,KAAK,MAAM;YACT,MAAM,IAAI,KAAK,CAAC,2EAA2E,CAAC,CAAC;IACjG,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Public telemetry barrel for `@esankhan3/anvil-agent-core`.
|
|
3
|
+
*
|
|
4
|
+
* Consumers import the GenAi attribute constants and (optionally) the tracer
|
|
5
|
+
* accessor. The wrapper that emits spans (Phase 2) is not yet exposed —
|
|
6
|
+
* instrumentation is applied internally at the registry seam.
|
|
7
|
+
*/
|
|
8
|
+
export { getTracer, resetTracer, shutdownTracer, getTelemetryConfig } from './tracer.js';
|
|
9
|
+
export { recordGenAiCall, shutdownMetrics } from './metrics.js';
|
|
10
|
+
export type { GenAiCallMetrics } from './metrics.js';
|
|
11
|
+
export { loadTelemetryConfig } from './config.js';
|
|
12
|
+
export type { TelemetryConfig } from './config.js';
|
|
13
|
+
export { GenAi } from './attributes.js';
|
|
14
|
+
export type { GenAiAttribute } from './attributes.js';
|
|
15
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/telemetry/index.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,SAAS,EAAE,WAAW,EAAE,cAAc,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC;AACzF,OAAO,EAAE,eAAe,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAChE,YAAY,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AACrD,OAAO,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAC;AAClD,YAAY,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AACnD,OAAO,EAAE,KAAK,EAAE,MAAM,iBAAiB,CAAC;AACxC,YAAY,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Public telemetry barrel for `@esankhan3/anvil-agent-core`.
|
|
3
|
+
*
|
|
4
|
+
* Consumers import the GenAi attribute constants and (optionally) the tracer
|
|
5
|
+
* accessor. The wrapper that emits spans (Phase 2) is not yet exposed —
|
|
6
|
+
* instrumentation is applied internally at the registry seam.
|
|
7
|
+
*/
|
|
8
|
+
export { getTracer, resetTracer, shutdownTracer, getTelemetryConfig } from './tracer.js';
|
|
9
|
+
export { recordGenAiCall, shutdownMetrics } from './metrics.js';
|
|
10
|
+
export { loadTelemetryConfig } from './config.js';
|
|
11
|
+
export { GenAi } from './attributes.js';
|
|
12
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/telemetry/index.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,SAAS,EAAE,WAAW,EAAE,cAAc,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC;AACzF,OAAO,EAAE,eAAe,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAEhE,OAAO,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAC;AAElD,OAAO,EAAE,KAAK,EAAE,MAAM,iBAAiB,CAAC"}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Instrumentation wrapper — wraps a ModelAdapter so its `run()` method
|
|
3
|
+
* emits an OpenTelemetry span following the GenAI semantic conventions.
|
|
4
|
+
*
|
|
5
|
+
* Phase 2 deviation from plan §2.2: the plan envisioned wrapping
|
|
6
|
+
* `LanguageModel.invoke` / `invokeStream`, but the seven existing adapters
|
|
7
|
+
* implement only the legacy `ModelAdapter.run(config, output)` interface
|
|
8
|
+
* today (see AGENT-CORE-ADR.md §9 Phase 5 deviation). This wrapper targets
|
|
9
|
+
* `run` instead — same integration seam (registry.get), same GenAI
|
|
10
|
+
* attributes emitted, lower fidelity (one span per stage run, not per
|
|
11
|
+
* turn). When adapters gain native `invoke()` impls, this file gains a
|
|
12
|
+
* sibling wrapper for that surface.
|
|
13
|
+
*
|
|
14
|
+
* Tool-call and reasoning child spans are deferred to Phase 3, where
|
|
15
|
+
* per-adapter NDJSON parsing surfaces them.
|
|
16
|
+
*/
|
|
17
|
+
import type { ModelAdapter, ProviderName } from '../types.js';
|
|
18
|
+
/**
|
|
19
|
+
* Wrap a single-shot LLM call (e.g. runClaude / runGemini in single-shot.ts)
|
|
20
|
+
* with a `gen_ai.invoke` span. The callback receives the active span only
|
|
21
|
+
* for diagnostic logging; it is auto-`end()`-ed via try/finally.
|
|
22
|
+
*/
|
|
23
|
+
export declare function withInvokeSpan<TResult>(args: {
|
|
24
|
+
provider: ProviderName | string;
|
|
25
|
+
model: string;
|
|
26
|
+
prompt?: string;
|
|
27
|
+
systemPrompt?: string;
|
|
28
|
+
}, exec: () => Promise<TResult>, applyResult: (result: TResult) => Record<string, number | string | boolean | undefined>): Promise<TResult>;
|
|
29
|
+
/**
|
|
30
|
+
* Return an instrumented view of the adapter. The new object delegates all
|
|
31
|
+
* methods to the wrapped instance; only `run` gets a span around it. When
|
|
32
|
+
* telemetry is disabled, OTel's no-op tracer makes the wrapper effectively
|
|
33
|
+
* free (no allocations beyond a closure).
|
|
34
|
+
*/
|
|
35
|
+
export declare function instrumentModelAdapter(adapter: ModelAdapter): ModelAdapter;
|
|
36
|
+
//# sourceMappingURL=instrument.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"instrument.d.ts","sourceRoot":"","sources":["../../src/telemetry/instrument.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAGH,OAAO,KAAK,EACV,YAAY,EAGZ,YAAY,EAEb,MAAM,aAAa,CAAC;AAOrB;;;;GAIG;AACH,wBAAsB,cAAc,CAAC,OAAO,EAC1C,IAAI,EAAE;IACJ,QAAQ,EAAE,YAAY,GAAG,MAAM,CAAC;IAChC,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB,EACD,IAAI,EAAE,MAAM,OAAO,CAAC,OAAO,CAAC,EAC5B,WAAW,EAAE,CAAC,MAAM,EAAE,OAAO,KAAK,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,SAAS,CAAC,GACtF,OAAO,CAAC,OAAO,CAAC,CAoClB;AAKD;;;;;GAKG;AACH,wBAAgB,sBAAsB,CAAC,OAAO,EAAE,YAAY,GAAG,YAAY,CAE1E"}
|
|
@@ -0,0 +1,215 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Instrumentation wrapper — wraps a ModelAdapter so its `run()` method
|
|
3
|
+
* emits an OpenTelemetry span following the GenAI semantic conventions.
|
|
4
|
+
*
|
|
5
|
+
* Phase 2 deviation from plan §2.2: the plan envisioned wrapping
|
|
6
|
+
* `LanguageModel.invoke` / `invokeStream`, but the seven existing adapters
|
|
7
|
+
* implement only the legacy `ModelAdapter.run(config, output)` interface
|
|
8
|
+
* today (see AGENT-CORE-ADR.md §9 Phase 5 deviation). This wrapper targets
|
|
9
|
+
* `run` instead — same integration seam (registry.get), same GenAI
|
|
10
|
+
* attributes emitted, lower fidelity (one span per stage run, not per
|
|
11
|
+
* turn). When adapters gain native `invoke()` impls, this file gains a
|
|
12
|
+
* sibling wrapper for that surface.
|
|
13
|
+
*
|
|
14
|
+
* Tool-call and reasoning child spans are deferred to Phase 3, where
|
|
15
|
+
* per-adapter NDJSON parsing surfaces them.
|
|
16
|
+
*/
|
|
17
|
+
import { SpanKind, SpanStatusCode } from '@opentelemetry/api';
|
|
18
|
+
import { getTracer } from './tracer.js';
|
|
19
|
+
import { loadTelemetryConfig } from './config.js';
|
|
20
|
+
import { GenAi } from './attributes.js';
|
|
21
|
+
import { recordGenAiCall } from './metrics.js';
|
|
22
|
+
import { calculateCostBreakdown } from '../cost.js';
|
|
23
|
+
/**
|
|
24
|
+
* Wrap a single-shot LLM call (e.g. runClaude / runGemini in single-shot.ts)
|
|
25
|
+
* with a `gen_ai.invoke` span. The callback receives the active span only
|
|
26
|
+
* for diagnostic logging; it is auto-`end()`-ed via try/finally.
|
|
27
|
+
*/
|
|
28
|
+
export async function withInvokeSpan(args, exec, applyResult) {
|
|
29
|
+
const tracer = getTracer();
|
|
30
|
+
const telemetry = loadTelemetryConfig();
|
|
31
|
+
return tracer.startActiveSpan(SPAN_NAME, { kind: SpanKind.CLIENT }, async (span) => {
|
|
32
|
+
span.setAttributes({
|
|
33
|
+
[GenAi.SYSTEM]: args.provider,
|
|
34
|
+
[GenAi.REQUEST_MODEL]: args.model,
|
|
35
|
+
[GenAi.MESSAGES_COUNT]: args.systemPrompt ? 2 : 1,
|
|
36
|
+
});
|
|
37
|
+
if (telemetry.recordContent && args.prompt) {
|
|
38
|
+
span.setAttribute(GenAi.PROMPT, args.prompt.slice(0, PROMPT_TRUNCATE_BYTES));
|
|
39
|
+
}
|
|
40
|
+
try {
|
|
41
|
+
const result = await exec();
|
|
42
|
+
const attrs = applyResult(result);
|
|
43
|
+
for (const [k, v] of Object.entries(attrs)) {
|
|
44
|
+
if (v !== undefined)
|
|
45
|
+
span.setAttribute(k, v);
|
|
46
|
+
}
|
|
47
|
+
span.setStatus({ code: SpanStatusCode.OK });
|
|
48
|
+
return result;
|
|
49
|
+
}
|
|
50
|
+
catch (err) {
|
|
51
|
+
span.recordException(err);
|
|
52
|
+
span.setStatus({
|
|
53
|
+
code: SpanStatusCode.ERROR,
|
|
54
|
+
message: err instanceof Error ? err.message : String(err),
|
|
55
|
+
});
|
|
56
|
+
throw err;
|
|
57
|
+
}
|
|
58
|
+
finally {
|
|
59
|
+
span.end();
|
|
60
|
+
}
|
|
61
|
+
});
|
|
62
|
+
}
|
|
63
|
+
const SPAN_NAME = 'gen_ai.invoke';
|
|
64
|
+
const PROMPT_TRUNCATE_BYTES = 8192;
|
|
65
|
+
/**
|
|
66
|
+
* Return an instrumented view of the adapter. The new object delegates all
|
|
67
|
+
* methods to the wrapped instance; only `run` gets a span around it. When
|
|
68
|
+
* telemetry is disabled, OTel's no-op tracer makes the wrapper effectively
|
|
69
|
+
* free (no allocations beyond a closure).
|
|
70
|
+
*/
|
|
71
|
+
export function instrumentModelAdapter(adapter) {
|
|
72
|
+
return new InstrumentedModelAdapter(adapter);
|
|
73
|
+
}
|
|
74
|
+
class InstrumentedModelAdapter {
|
|
75
|
+
inner;
|
|
76
|
+
constructor(inner) {
|
|
77
|
+
this.inner = inner;
|
|
78
|
+
}
|
|
79
|
+
get provider() {
|
|
80
|
+
return this.inner.provider;
|
|
81
|
+
}
|
|
82
|
+
get capabilities() {
|
|
83
|
+
return this.inner.capabilities;
|
|
84
|
+
}
|
|
85
|
+
supportsModel(modelId) {
|
|
86
|
+
return this.inner.supportsModel(modelId);
|
|
87
|
+
}
|
|
88
|
+
getModelPricing(modelId) {
|
|
89
|
+
return this.inner.getModelPricing(modelId);
|
|
90
|
+
}
|
|
91
|
+
checkAvailability() {
|
|
92
|
+
return this.inner.checkAvailability();
|
|
93
|
+
}
|
|
94
|
+
kill() {
|
|
95
|
+
this.inner.kill?.();
|
|
96
|
+
}
|
|
97
|
+
async run(config, output) {
|
|
98
|
+
const tracer = getTracer();
|
|
99
|
+
const telemetry = loadTelemetryConfig();
|
|
100
|
+
return tracer.startActiveSpan(SPAN_NAME, { kind: SpanKind.CLIENT }, async (span) => {
|
|
101
|
+
span.setAttributes({
|
|
102
|
+
[GenAi.SYSTEM]: this.inner.provider,
|
|
103
|
+
[GenAi.REQUEST_MODEL]: config.model,
|
|
104
|
+
[GenAi.MESSAGES_COUNT]: 1,
|
|
105
|
+
[GenAi.TOOLS_COUNT]: config.allowedTools?.length ?? 0,
|
|
106
|
+
'anvil.stage': config.stage,
|
|
107
|
+
'anvil.persona': config.persona,
|
|
108
|
+
'anvil.session.resume': config.resume === true,
|
|
109
|
+
// Phase 9 — routing-decision attributes. Lets dashboards
|
|
110
|
+
// facet by routing tier and capability tier so users can
|
|
111
|
+
// tell at a glance how much work is going to local vs cloud.
|
|
112
|
+
'anvil.provider.tier': this.inner.capabilities.tier,
|
|
113
|
+
'anvil.provider.tool_use': this.inner.capabilities.toolUse,
|
|
114
|
+
...(config.exclusiveSlot ? { 'anvil.local.exclusive_slot': true } : {}),
|
|
115
|
+
...(config.toolExecutor ? { 'anvil.tool_executor.attached': true } : {}),
|
|
116
|
+
...(typeof config.contextWindow === 'number'
|
|
117
|
+
? { 'anvil.context_window': config.contextWindow }
|
|
118
|
+
: {}),
|
|
119
|
+
});
|
|
120
|
+
if (telemetry.recordContent) {
|
|
121
|
+
span.setAttribute(GenAi.PROMPT, config.userPrompt.slice(0, PROMPT_TRUNCATE_BYTES));
|
|
122
|
+
}
|
|
123
|
+
try {
|
|
124
|
+
const result = await this.inner.run(config, output);
|
|
125
|
+
// Compute the per-component breakdown from the central cost table.
|
|
126
|
+
// When the table doesn't know the model, breakdown.totalUsd is 0 —
|
|
127
|
+
// fall back to the adapter's costUsd so we never undercount in
|
|
128
|
+
// exported telemetry. (Decision O6: agent-core is the single source
|
|
129
|
+
// of truth, but only when it actually has data.)
|
|
130
|
+
const bd = calculateCostBreakdown(result.model, {
|
|
131
|
+
inputTokens: result.inputTokens,
|
|
132
|
+
outputTokens: result.outputTokens,
|
|
133
|
+
cacheReadTokens: result.cacheReadTokens,
|
|
134
|
+
cacheWriteTokens: result.cacheWriteTokens,
|
|
135
|
+
});
|
|
136
|
+
const totalUsd = bd.totalUsd > 0 ? bd.totalUsd : result.costUsd;
|
|
137
|
+
span.setAttributes({
|
|
138
|
+
[GenAi.USAGE_INPUT_TOKENS]: result.inputTokens,
|
|
139
|
+
[GenAi.USAGE_OUTPUT_TOKENS]: result.outputTokens,
|
|
140
|
+
[GenAi.USAGE_COST_USD]: totalUsd,
|
|
141
|
+
[GenAi.USAGE_COST_INPUT_USD]: bd.inputUsd,
|
|
142
|
+
[GenAi.USAGE_COST_OUTPUT_USD]: bd.outputUsd,
|
|
143
|
+
[GenAi.USAGE_COST_CACHE_READ_USD]: bd.cacheReadUsd,
|
|
144
|
+
[GenAi.USAGE_COST_CACHE_WRITE_USD]: bd.cacheWriteUsd,
|
|
145
|
+
[GenAi.RESPONSE_MODEL]: result.model,
|
|
146
|
+
'anvil.duration_ms': result.durationMs,
|
|
147
|
+
});
|
|
148
|
+
if (result.sessionId) {
|
|
149
|
+
span.setAttribute(GenAi.RESPONSE_ID, result.sessionId);
|
|
150
|
+
}
|
|
151
|
+
// Phase 3 — cache + reasoning + tool-call enrichment from
|
|
152
|
+
// per-adapter response parsing. Adapters that don't surface these
|
|
153
|
+
// simply leave the fields undefined; we don't fabricate zeros for
|
|
154
|
+
// providers where the data isn't reported.
|
|
155
|
+
if (typeof result.cacheReadTokens === 'number') {
|
|
156
|
+
span.setAttribute(GenAi.USAGE_CACHE_READ_TOKENS, result.cacheReadTokens);
|
|
157
|
+
const denom = result.inputTokens + result.cacheReadTokens;
|
|
158
|
+
if (denom > 0) {
|
|
159
|
+
span.setAttribute(GenAi.USAGE_CACHE_HIT_RATIO, result.cacheReadTokens / denom);
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
if (typeof result.cacheWriteTokens === 'number') {
|
|
163
|
+
span.setAttribute(GenAi.USAGE_CACHE_WRITE_TOKENS, result.cacheWriteTokens);
|
|
164
|
+
}
|
|
165
|
+
if (typeof result.reasoningTokens === 'number' && result.reasoningTokens > 0) {
|
|
166
|
+
span.setAttribute(GenAi.REASONING_TOKENS, result.reasoningTokens);
|
|
167
|
+
}
|
|
168
|
+
if (typeof result.toolCallCount === 'number') {
|
|
169
|
+
span.setAttribute('gen_ai.response.tool_call_count', result.toolCallCount);
|
|
170
|
+
}
|
|
171
|
+
if (telemetry.recordContent) {
|
|
172
|
+
span.setAttribute(GenAi.COMPLETION, result.output.slice(0, PROMPT_TRUNCATE_BYTES));
|
|
173
|
+
}
|
|
174
|
+
// Mirror the span attrs into OTel metrics so Grafana can build
|
|
175
|
+
// counter/histogram dashboards. Failures here must not bubble —
|
|
176
|
+
// a metrics emit issue should never break the agent run.
|
|
177
|
+
try {
|
|
178
|
+
recordGenAiCall({
|
|
179
|
+
system: this.inner.provider,
|
|
180
|
+
requestModel: config.model,
|
|
181
|
+
responseModel: result.model,
|
|
182
|
+
stage: config.stage,
|
|
183
|
+
persona: config.persona,
|
|
184
|
+
inputTokens: result.inputTokens,
|
|
185
|
+
outputTokens: result.outputTokens,
|
|
186
|
+
cacheReadTokens: result.cacheReadTokens ?? 0,
|
|
187
|
+
cacheWriteTokens: result.cacheWriteTokens ?? 0,
|
|
188
|
+
reasoningTokens: result.reasoningTokens,
|
|
189
|
+
costInputUsd: bd.inputUsd,
|
|
190
|
+
costOutputUsd: bd.outputUsd,
|
|
191
|
+
costCacheReadUsd: bd.cacheReadUsd,
|
|
192
|
+
costCacheWriteUsd: bd.cacheWriteUsd,
|
|
193
|
+
costTotalUsd: totalUsd,
|
|
194
|
+
durationMs: result.durationMs ?? 0,
|
|
195
|
+
});
|
|
196
|
+
}
|
|
197
|
+
catch { /* never let metrics break a run */ }
|
|
198
|
+
span.setStatus({ code: SpanStatusCode.OK });
|
|
199
|
+
return result;
|
|
200
|
+
}
|
|
201
|
+
catch (err) {
|
|
202
|
+
span.recordException(err);
|
|
203
|
+
span.setStatus({
|
|
204
|
+
code: SpanStatusCode.ERROR,
|
|
205
|
+
message: err instanceof Error ? err.message : String(err),
|
|
206
|
+
});
|
|
207
|
+
throw err;
|
|
208
|
+
}
|
|
209
|
+
finally {
|
|
210
|
+
span.end();
|
|
211
|
+
}
|
|
212
|
+
});
|
|
213
|
+
}
|
|
214
|
+
}
|
|
215
|
+
//# sourceMappingURL=instrument.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"instrument.js","sourceRoot":"","sources":["../../src/telemetry/instrument.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* GenAI metrics — emits OTel metrics on every adapter call alongside the
|
|
3
|
+
* existing trace span. Mirrors the OTel GenAI semconv counters/histograms
|
|
4
|
+
* so dashboards built against any compliant collector keep working.
|
|
5
|
+
*
|
|
6
|
+
* Instruments:
|
|
7
|
+
* - gen_ai.client.token.usage (counter, by io_type ∈ input|output|cache_read|cache_write|reasoning)
|
|
8
|
+
* - gen_ai.client.cost_usd (counter, by component ∈ input|output|cache_read|cache_write|total)
|
|
9
|
+
* - gen_ai.client.operation.duration (histogram, ms)
|
|
10
|
+
* - gen_ai.cache.hit_ratio (gauge per call, 0–1)
|
|
11
|
+
*
|
|
12
|
+
* All instruments inherit the shared resource (service.name, anvil.run_id,
|
|
13
|
+
* etc.) registered in tracer.ts. Metrics shipping is gated on the same
|
|
14
|
+
* TelemetryConfig as traces — disabled telemetry produces no-op meters.
|
|
15
|
+
*/
|
|
16
|
+
export interface GenAiCallMetrics {
|
|
17
|
+
/** OTel `gen_ai.system` (provider) — e.g. 'claude', 'gemini'. */
|
|
18
|
+
system: string;
|
|
19
|
+
/** Model identifier sent in the request. */
|
|
20
|
+
requestModel: string;
|
|
21
|
+
/** Model identifier returned in the response (often resolved/aliased). */
|
|
22
|
+
responseModel?: string;
|
|
23
|
+
/** Anvil-specific labels — kept on metric attributes for slicing. */
|
|
24
|
+
stage?: string;
|
|
25
|
+
persona?: string;
|
|
26
|
+
inputTokens: number;
|
|
27
|
+
outputTokens: number;
|
|
28
|
+
cacheReadTokens: number;
|
|
29
|
+
cacheWriteTokens: number;
|
|
30
|
+
reasoningTokens?: number;
|
|
31
|
+
/** USD cost broken into components — every field is a delta to add. */
|
|
32
|
+
costInputUsd: number;
|
|
33
|
+
costOutputUsd: number;
|
|
34
|
+
costCacheReadUsd: number;
|
|
35
|
+
costCacheWriteUsd: number;
|
|
36
|
+
costTotalUsd: number;
|
|
37
|
+
/** Wall-clock duration of the call. */
|
|
38
|
+
durationMs: number;
|
|
39
|
+
}
|
|
40
|
+
/** Record one adapter call — emits all 4 instruments with consistent labels.
|
|
41
|
+
* Safe to call when telemetry is disabled (no-op meter eats the writes). */
|
|
42
|
+
export declare function recordGenAiCall(m: GenAiCallMetrics): void;
|
|
43
|
+
/** Force-flush any pending metric data and tear down the provider. */
|
|
44
|
+
export declare function shutdownMetrics(): Promise<void>;
|
|
45
|
+
//# sourceMappingURL=metrics.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"metrics.d.ts","sourceRoot":"","sources":["../../src/telemetry/metrics.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAwJH,MAAM,WAAW,gBAAgB;IAC/B,iEAAiE;IACjE,MAAM,EAAE,MAAM,CAAC;IACf,4CAA4C;IAC5C,YAAY,EAAE,MAAM,CAAC;IACrB,0EAA0E;IAC1E,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,qEAAqE;IACrE,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,MAAM,CAAC;IACrB,eAAe,EAAE,MAAM,CAAC;IACxB,gBAAgB,EAAE,MAAM,CAAC;IACzB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,uEAAuE;IACvE,YAAY,EAAE,MAAM,CAAC;IACrB,aAAa,EAAE,MAAM,CAAC;IACtB,gBAAgB,EAAE,MAAM,CAAC;IACzB,iBAAiB,EAAE,MAAM,CAAC;IAC1B,YAAY,EAAE,MAAM,CAAC;IACrB,uCAAuC;IACvC,UAAU,EAAE,MAAM,CAAC;CACpB;AAED;4EAC4E;AAC5E,wBAAgB,eAAe,CAAC,CAAC,EAAE,gBAAgB,GAAG,IAAI,CAsCzD;AAED,sEAAsE;AACtE,wBAAsB,eAAe,IAAI,OAAO,CAAC,IAAI,CAAC,CAcrD"}
|