@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
package/README.md
ADDED
|
@@ -0,0 +1,142 @@
|
|
|
1
|
+
# @anvil/agent-core
|
|
2
|
+
|
|
3
|
+
**One LLM stack. Every provider. Agentic by default.**
|
|
4
|
+
|
|
5
|
+
The runtime that powers every Anvil agent — a single, vendor-neutral
|
|
6
|
+
core that turns prompts into production-grade agent loops with cost
|
|
7
|
+
tracking, retries, and observability built in.
|
|
8
|
+
|
|
9
|
+
---
|
|
10
|
+
|
|
11
|
+
## Why agent-core
|
|
12
|
+
|
|
13
|
+
Building an agent today means stitching together SDKs, retry logic,
|
|
14
|
+
cost math, tool dispatch, and observability — per provider. Then
|
|
15
|
+
doing it again when you swap models.
|
|
16
|
+
|
|
17
|
+
**agent-core gives you one stack.** Switch from Claude to GPT-4 to a
|
|
18
|
+
local Ollama model by changing one string. Every adapter speaks the
|
|
19
|
+
same streaming format, throws the same errors, reports cost the same
|
|
20
|
+
way, and emits the same OpenTelemetry spans.
|
|
21
|
+
|
|
22
|
+
```ts
|
|
23
|
+
import { runLLM } from '@anvil/agent-core';
|
|
24
|
+
|
|
25
|
+
const result = await runLLM({
|
|
26
|
+
model: 'claude-sonnet-4-6', // or 'gpt-5', 'gemini-2.5-pro',
|
|
27
|
+
// 'opencode/kimi-k2.6', 'qwen3:14b'
|
|
28
|
+
prompt: 'Refactor this function for clarity.',
|
|
29
|
+
workspaceDir: process.cwd(),
|
|
30
|
+
});
|
|
31
|
+
|
|
32
|
+
console.log(result.output);
|
|
33
|
+
console.log(`cost: $${result.costUsd}`);
|
|
34
|
+
```
|
|
35
|
+
|
|
36
|
+
That's it. No SDK to import. No retry loop to write. No cost table
|
|
37
|
+
to maintain. The model name is the only thing that changes.
|
|
38
|
+
|
|
39
|
+
---
|
|
40
|
+
|
|
41
|
+
## What you get
|
|
42
|
+
|
|
43
|
+
### Eight providers, one interface
|
|
44
|
+
Claude · OpenAI · Gemini · OpenRouter · Ollama · Gemini CLI · Google
|
|
45
|
+
ADK · OpenCode. Six drive a real agentic tool loop out of the box.
|
|
46
|
+
New provider? Add an adapter file. The registry, router, telemetry,
|
|
47
|
+
and cost layer pick it up automatically.
|
|
48
|
+
|
|
49
|
+
### Production-grade router
|
|
50
|
+
Tag-based routing, per-error retry, chain-fallback across models,
|
|
51
|
+
per-provider rate limiting, circuit breaker, and a SQLite spend
|
|
52
|
+
ledger — all configurable via a single YAML file. Sensible defaults
|
|
53
|
+
ship compiled in, so the zero-config path just works.
|
|
54
|
+
|
|
55
|
+
### Built-in agentic tools
|
|
56
|
+
A path-guarded `BuiltinToolExecutor` ships seven safe primitives —
|
|
57
|
+
`read_file`, `write_file`, `edit`, `bash`, `grep`, `glob`, `list` —
|
|
58
|
+
that any non-Claude adapter can pair with to drive a true tool loop.
|
|
59
|
+
No more "model can't edit files" workarounds.
|
|
60
|
+
|
|
61
|
+
### Skills + MCP, first-class
|
|
62
|
+
Drop in Anthropic-format `SKILL.md` files for reusable agent
|
|
63
|
+
behaviors, or wire up any Model Context Protocol server — both
|
|
64
|
+
compose into the same prompt + tool surface that adapters consume.
|
|
65
|
+
|
|
66
|
+
### Observability that doesn't hurt
|
|
67
|
+
OpenTelemetry spans with GenAI semantic conventions, a parent
|
|
68
|
+
`anvil.agent.session` span that links every resume, automatic cost
|
|
69
|
+
breakdown per call. Plug in any OTLP collector — Langfuse, Tempo,
|
|
70
|
+
Honeycomb — via standard env vars. Off by default. Privacy-safe
|
|
71
|
+
prompt redaction.
|
|
72
|
+
|
|
73
|
+
### Deterministic checkpoints
|
|
74
|
+
SHA-keyed per-call output cache, scoped by project, run, and stage.
|
|
75
|
+
Re-run the same pipeline, get the same answers. Free retries on
|
|
76
|
+
flaky upstreams. Free regression tests on prompt changes.
|
|
77
|
+
|
|
78
|
+
---
|
|
79
|
+
|
|
80
|
+
## Provider matrix
|
|
81
|
+
|
|
82
|
+
| Provider | Tier | Agentic loop | Streaming | Tool use |
|
|
83
|
+
|---|---|---|---|---|
|
|
84
|
+
| **Claude** (CLI subprocess) | agentic | ✓ | ✓ | native |
|
|
85
|
+
| **OpenAI** (HTTP) | agentic | ✓ | ✓ | OpenAI tools |
|
|
86
|
+
| **Gemini** (HTTP) | agentic | ✓ | ✓ | function call |
|
|
87
|
+
| **OpenRouter** (HTTP) | agentic | ✓ | ✓ | OpenAI tools |
|
|
88
|
+
| **OpenCode** (HTTP, Go subscription) | agentic | ✓ | ✓ | OpenAI tools |
|
|
89
|
+
| **Ollama** (local) | agentic | ✓ | ✓ | OpenAI tools |
|
|
90
|
+
| **Gemini CLI** (subprocess) | utility | — | ✓ | — |
|
|
91
|
+
| **Google ADK** (`@google/adk`) | agentic | ✓ | ✓ | ADK runner |
|
|
92
|
+
|
|
93
|
+
All adapters share the same Anvil Stream Format (NDJSON), the same
|
|
94
|
+
`UpstreamError` shape for retry/fallback, and the same per-call
|
|
95
|
+
`AbortController` semantics for safe concurrency.
|
|
96
|
+
|
|
97
|
+
---
|
|
98
|
+
|
|
99
|
+
## Architecture at a glance
|
|
100
|
+
|
|
101
|
+
```
|
|
102
|
+
┌─ runLLM / runClaude / runGemini ─────────── one-shot
|
|
103
|
+
└─ AgentManager ──── AgentProcess ──── LanguageModelBridge
|
|
104
|
+
│
|
|
105
|
+
└─ ModelAdapter (one of 8)
|
|
106
|
+
↑
|
|
107
|
+
ProviderRegistry
|
|
108
|
+
↑
|
|
109
|
+
LlmRouter (retries, fallbacks, rate limit)
|
|
110
|
+
↑
|
|
111
|
+
Telemetry (OTel spans + cost)
|
|
112
|
+
↑
|
|
113
|
+
Checkpoint (deterministic cache)
|
|
114
|
+
```
|
|
115
|
+
|
|
116
|
+
Each layer is opt-in. Use a single adapter directly, or compose the
|
|
117
|
+
full stack — the same interfaces flow all the way up.
|
|
118
|
+
|
|
119
|
+
---
|
|
120
|
+
|
|
121
|
+
## Philosophy
|
|
122
|
+
|
|
123
|
+
**No vendor SDKs.** Every HTTP adapter is hand-rolled `fetch()`. No
|
|
124
|
+
`@anthropic-ai/sdk`, no `openai` package, no LangChain, no Vercel AI
|
|
125
|
+
SDK. Lock-in stays at zero.
|
|
126
|
+
|
|
127
|
+
**Cost is observable, not estimated.** Every call attaches a real
|
|
128
|
+
`gen_ai.usage.cost` attribute computed from a vendored LiteLLM
|
|
129
|
+
pricing snapshot. Refresh on demand: `npm run refresh-cost-table`.
|
|
130
|
+
|
|
131
|
+
**Agentic isn't a flag.** When a model supports tool calls, the
|
|
132
|
+
adapter drives the loop — multi-turn, with safe builtins. No
|
|
133
|
+
"agent mode" toggle. No special prompt template required.
|
|
134
|
+
|
|
135
|
+
**One source of truth per concern.** Cost lives in `cost.ts`. Spans
|
|
136
|
+
live at the registry seam. Tool execution lives in
|
|
137
|
+
`BuiltinToolExecutor`. Adding a new provider doesn't touch any of
|
|
138
|
+
them.
|
|
139
|
+
|
|
140
|
+
---
|
|
141
|
+
|
|
142
|
+
## Part of [Anvil](../../) — the AI development pipeline.
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Phase 3 tests — verify per-adapter telemetry enrichment.
|
|
3
|
+
*
|
|
4
|
+
* Each adapter is stubbed with a captured-fixture-style provider response;
|
|
5
|
+
* we assert that ModelAdapterResult surfaces the cache + reasoning + tool
|
|
6
|
+
* fields in the normalized agent-core shape.
|
|
7
|
+
*
|
|
8
|
+
* Fixtures are inlined (not files) to keep the test self-contained and
|
|
9
|
+
* to make the response shape obvious next to the assertion.
|
|
10
|
+
*/
|
|
11
|
+
export {};
|
|
12
|
+
//# sourceMappingURL=adapter-enrichment.test.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"adapter-enrichment.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/adapter-enrichment.test.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG"}
|
|
@@ -0,0 +1,199 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Phase 3 tests — verify per-adapter telemetry enrichment.
|
|
3
|
+
*
|
|
4
|
+
* Each adapter is stubbed with a captured-fixture-style provider response;
|
|
5
|
+
* we assert that ModelAdapterResult surfaces the cache + reasoning + tool
|
|
6
|
+
* fields in the normalized agent-core shape.
|
|
7
|
+
*
|
|
8
|
+
* Fixtures are inlined (not files) to keep the test self-contained and
|
|
9
|
+
* to make the response shape obvious next to the assertion.
|
|
10
|
+
*/
|
|
11
|
+
import { describe, it, beforeEach, afterEach } from 'node:test';
|
|
12
|
+
import assert from 'node:assert/strict';
|
|
13
|
+
import { Writable } from 'node:stream';
|
|
14
|
+
import { trace } from '@opentelemetry/api';
|
|
15
|
+
import { NodeTracerProvider } from '@opentelemetry/sdk-trace-node';
|
|
16
|
+
import { InMemorySpanExporter, SimpleSpanProcessor, } from '@opentelemetry/sdk-trace-base';
|
|
17
|
+
import { resourceFromAttributes } from '@opentelemetry/resources';
|
|
18
|
+
import { ATTR_SERVICE_NAME } from '@opentelemetry/semantic-conventions';
|
|
19
|
+
import { OpenAIAdapter } from '../openai-adapter.js';
|
|
20
|
+
import { GeminiAdapter } from '../gemini-adapter.js';
|
|
21
|
+
import { instrumentModelAdapter } from '../telemetry/instrument.js';
|
|
22
|
+
import { resetTracer } from '../telemetry/tracer.js';
|
|
23
|
+
import { GenAi } from '../telemetry/attributes.js';
|
|
24
|
+
// ── In-memory exporter scaffold ────────────────────────────────────────────
|
|
25
|
+
let exporter;
|
|
26
|
+
let provider;
|
|
27
|
+
async function installExporter() {
|
|
28
|
+
await resetTracer();
|
|
29
|
+
exporter = new InMemorySpanExporter();
|
|
30
|
+
provider = new NodeTracerProvider({
|
|
31
|
+
resource: resourceFromAttributes({ [ATTR_SERVICE_NAME]: 'anvil-agent-core-test' }),
|
|
32
|
+
spanProcessors: [new SimpleSpanProcessor(exporter)],
|
|
33
|
+
});
|
|
34
|
+
provider.register();
|
|
35
|
+
}
|
|
36
|
+
async function uninstallExporter() {
|
|
37
|
+
try {
|
|
38
|
+
await provider.forceFlush();
|
|
39
|
+
await provider.shutdown();
|
|
40
|
+
}
|
|
41
|
+
catch { }
|
|
42
|
+
exporter.reset();
|
|
43
|
+
trace.disable();
|
|
44
|
+
}
|
|
45
|
+
async function getSpans() {
|
|
46
|
+
await provider.forceFlush();
|
|
47
|
+
return exporter.getFinishedSpans();
|
|
48
|
+
}
|
|
49
|
+
const NULL_STREAM = new Writable({ write(_c, _e, cb) { cb(); } });
|
|
50
|
+
const BASE_CONFIG = {
|
|
51
|
+
userPrompt: 'hello',
|
|
52
|
+
model: 'gpt-4o',
|
|
53
|
+
workingDir: '/tmp',
|
|
54
|
+
stage: 'build',
|
|
55
|
+
persona: 'engineer',
|
|
56
|
+
};
|
|
57
|
+
// ── Fake fetch helper ──────────────────────────────────────────────────────
|
|
58
|
+
function makeFakeFetch(sseLines) {
|
|
59
|
+
return async (_url, _init) => {
|
|
60
|
+
const body = sseLines.map((l) => `data: ${l}\n\n`).join('') + 'data: [DONE]\n\n';
|
|
61
|
+
return new Response(body, {
|
|
62
|
+
status: 200,
|
|
63
|
+
headers: { 'Content-Type': 'text/event-stream' },
|
|
64
|
+
});
|
|
65
|
+
};
|
|
66
|
+
}
|
|
67
|
+
// ── Tests ──────────────────────────────────────────────────────────────────
|
|
68
|
+
describe('Phase 3 — per-adapter enrichment', () => {
|
|
69
|
+
beforeEach(installExporter);
|
|
70
|
+
afterEach(uninstallExporter);
|
|
71
|
+
it('OpenAI adapter surfaces cached_tokens and reasoning_tokens', async () => {
|
|
72
|
+
const originalFetch = globalThis.fetch;
|
|
73
|
+
const originalKey = process.env.OPENAI_API_KEY;
|
|
74
|
+
process.env.OPENAI_API_KEY = 'test-key';
|
|
75
|
+
// Captured-shape fixture: an o3-mini chat.completions stream that uses
|
|
76
|
+
// prompt cache + reasoning. Schema mirrors real OpenAI responses.
|
|
77
|
+
globalThis.fetch = makeFakeFetch([
|
|
78
|
+
JSON.stringify({ choices: [{ delta: { content: 'Hello' } }] }),
|
|
79
|
+
JSON.stringify({ choices: [{ delta: { content: ' world' } }] }),
|
|
80
|
+
JSON.stringify({
|
|
81
|
+
choices: [{ delta: {} }],
|
|
82
|
+
usage: {
|
|
83
|
+
prompt_tokens: 1500,
|
|
84
|
+
completion_tokens: 800,
|
|
85
|
+
prompt_tokens_details: { cached_tokens: 1200 },
|
|
86
|
+
completion_tokens_details: { reasoning_tokens: 600 },
|
|
87
|
+
},
|
|
88
|
+
}),
|
|
89
|
+
]);
|
|
90
|
+
try {
|
|
91
|
+
const adapter = instrumentModelAdapter(new OpenAIAdapter());
|
|
92
|
+
const result = await adapter.run({ ...BASE_CONFIG, model: 'o3-mini' }, NULL_STREAM);
|
|
93
|
+
assert.equal(result.inputTokens, 1500);
|
|
94
|
+
assert.equal(result.outputTokens, 800);
|
|
95
|
+
assert.equal(result.cacheReadTokens, 1200);
|
|
96
|
+
assert.equal(result.reasoningTokens, 600);
|
|
97
|
+
assert.equal(result.cacheWriteTokens, undefined); // OpenAI does not bill writes
|
|
98
|
+
const spans = await getSpans();
|
|
99
|
+
assert.equal(spans.length, 1);
|
|
100
|
+
const a = spans[0].attributes;
|
|
101
|
+
assert.equal(a[GenAi.USAGE_CACHE_READ_TOKENS], 1200);
|
|
102
|
+
assert.equal(a[GenAi.REASONING_TOKENS], 600);
|
|
103
|
+
// hit ratio = 1200 / (1500 + 1200) = 0.4444…
|
|
104
|
+
assert.ok(typeof a[GenAi.USAGE_CACHE_HIT_RATIO] === 'number');
|
|
105
|
+
const ratio = a[GenAi.USAGE_CACHE_HIT_RATIO];
|
|
106
|
+
assert.ok(ratio > 0.44 && ratio < 0.45);
|
|
107
|
+
// cache_write should not be present (adapter didn't surface it)
|
|
108
|
+
assert.equal(a[GenAi.USAGE_CACHE_WRITE_TOKENS], undefined);
|
|
109
|
+
}
|
|
110
|
+
finally {
|
|
111
|
+
globalThis.fetch = originalFetch;
|
|
112
|
+
if (originalKey === undefined)
|
|
113
|
+
delete process.env.OPENAI_API_KEY;
|
|
114
|
+
else
|
|
115
|
+
process.env.OPENAI_API_KEY = originalKey;
|
|
116
|
+
}
|
|
117
|
+
});
|
|
118
|
+
it('Gemini adapter surfaces cachedContentTokenCount and thoughtsTokenCount', async () => {
|
|
119
|
+
const originalFetch = globalThis.fetch;
|
|
120
|
+
const originalKey = process.env.GEMINI_API_KEY;
|
|
121
|
+
process.env.GEMINI_API_KEY = 'test-key';
|
|
122
|
+
// Gemini SSE shape: candidates + usageMetadata. Final chunk carries
|
|
123
|
+
// cumulative usage including cachedContentTokenCount and thoughtsTokenCount.
|
|
124
|
+
globalThis.fetch = makeFakeFetch([
|
|
125
|
+
JSON.stringify({
|
|
126
|
+
candidates: [{ content: { parts: [{ text: 'Hi ' }] } }],
|
|
127
|
+
usageMetadata: { promptTokenCount: 1000, candidatesTokenCount: 5 },
|
|
128
|
+
}),
|
|
129
|
+
JSON.stringify({
|
|
130
|
+
candidates: [{ content: { parts: [{ text: 'there' }] } }],
|
|
131
|
+
usageMetadata: {
|
|
132
|
+
promptTokenCount: 1000,
|
|
133
|
+
candidatesTokenCount: 50,
|
|
134
|
+
cachedContentTokenCount: 700,
|
|
135
|
+
thoughtsTokenCount: 200,
|
|
136
|
+
},
|
|
137
|
+
}),
|
|
138
|
+
]);
|
|
139
|
+
try {
|
|
140
|
+
const adapter = instrumentModelAdapter(new GeminiAdapter());
|
|
141
|
+
const result = await adapter.run({ ...BASE_CONFIG, model: 'gemini-2.5-pro' }, NULL_STREAM);
|
|
142
|
+
assert.equal(result.inputTokens, 1000);
|
|
143
|
+
assert.equal(result.outputTokens, 50);
|
|
144
|
+
assert.equal(result.cacheReadTokens, 700);
|
|
145
|
+
assert.equal(result.reasoningTokens, 200);
|
|
146
|
+
const spans = await getSpans();
|
|
147
|
+
const a = spans[0].attributes;
|
|
148
|
+
assert.equal(a[GenAi.USAGE_CACHE_READ_TOKENS], 700);
|
|
149
|
+
assert.equal(a[GenAi.REASONING_TOKENS], 200);
|
|
150
|
+
// hit ratio = 700 / (1000 + 700) ≈ 0.4118
|
|
151
|
+
const ratio = a[GenAi.USAGE_CACHE_HIT_RATIO];
|
|
152
|
+
assert.ok(ratio > 0.41 && ratio < 0.42);
|
|
153
|
+
}
|
|
154
|
+
finally {
|
|
155
|
+
globalThis.fetch = originalFetch;
|
|
156
|
+
if (originalKey === undefined)
|
|
157
|
+
delete process.env.GEMINI_API_KEY;
|
|
158
|
+
else
|
|
159
|
+
process.env.GEMINI_API_KEY = originalKey;
|
|
160
|
+
}
|
|
161
|
+
});
|
|
162
|
+
it('omits cache attrs entirely when adapter does not surface them', async () => {
|
|
163
|
+
// A minimal fake that returns no cache fields — verifies the wrapper
|
|
164
|
+
// doesn't fabricate zero values when the data is genuinely absent.
|
|
165
|
+
const fake = instrumentModelAdapter({
|
|
166
|
+
provider: 'claude',
|
|
167
|
+
capabilities: {
|
|
168
|
+
tier: 'agentic',
|
|
169
|
+
streaming: true,
|
|
170
|
+
toolUse: true,
|
|
171
|
+
fileSystem: true,
|
|
172
|
+
shellExecution: true,
|
|
173
|
+
sessionResume: true,
|
|
174
|
+
},
|
|
175
|
+
supportsModel: () => true,
|
|
176
|
+
getModelPricing: () => null,
|
|
177
|
+
checkAvailability: async () => ({ available: true }),
|
|
178
|
+
async run() {
|
|
179
|
+
return {
|
|
180
|
+
output: 'x',
|
|
181
|
+
inputTokens: 100,
|
|
182
|
+
outputTokens: 50,
|
|
183
|
+
costUsd: 0.001,
|
|
184
|
+
durationMs: 10,
|
|
185
|
+
provider: 'claude',
|
|
186
|
+
model: 'sonnet',
|
|
187
|
+
};
|
|
188
|
+
},
|
|
189
|
+
});
|
|
190
|
+
await fake.run(BASE_CONFIG, NULL_STREAM);
|
|
191
|
+
const spans = await getSpans();
|
|
192
|
+
const a = spans[0].attributes;
|
|
193
|
+
assert.equal(a[GenAi.USAGE_CACHE_READ_TOKENS], undefined);
|
|
194
|
+
assert.equal(a[GenAi.USAGE_CACHE_WRITE_TOKENS], undefined);
|
|
195
|
+
assert.equal(a[GenAi.USAGE_CACHE_HIT_RATIO], undefined);
|
|
196
|
+
assert.equal(a[GenAi.REASONING_TOKENS], undefined);
|
|
197
|
+
});
|
|
198
|
+
});
|
|
199
|
+
//# sourceMappingURL=adapter-enrichment.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"adapter-enrichment.test.js","sourceRoot":"","sources":["../../src/__tests__/adapter-enrichment.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* AnthropicLlm + AdkAdapter unit tests.
|
|
3
|
+
*
|
|
4
|
+
* Covers the parts that don't make a network call:
|
|
5
|
+
* - LLMRegistry registration is idempotent and routes claude-* to
|
|
6
|
+
* AnthropicLlm.
|
|
7
|
+
* - Anvil → ADK content translation (system instruction, contents,
|
|
8
|
+
* tools).
|
|
9
|
+
* - SSE → LlmResponse parsing for text + tool_use streams.
|
|
10
|
+
* - Provider routing: `adk:` prefix → 'adk' provider.
|
|
11
|
+
* - Adapter pricing strips the prefix.
|
|
12
|
+
* - checkAvailability degrades cleanly when no auth env is set.
|
|
13
|
+
*
|
|
14
|
+
* Live calls against api.anthropic.com are exercised by a separate
|
|
15
|
+
* smoke test gated on ANTHROPIC_API_KEY (not run in CI).
|
|
16
|
+
*/
|
|
17
|
+
export {};
|
|
18
|
+
//# sourceMappingURL=adk-anthropic-llm.test.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"adk-anthropic-llm.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/adk-anthropic-llm.test.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG"}
|
|
@@ -0,0 +1,124 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* AnthropicLlm + AdkAdapter unit tests.
|
|
3
|
+
*
|
|
4
|
+
* Covers the parts that don't make a network call:
|
|
5
|
+
* - LLMRegistry registration is idempotent and routes claude-* to
|
|
6
|
+
* AnthropicLlm.
|
|
7
|
+
* - Anvil → ADK content translation (system instruction, contents,
|
|
8
|
+
* tools).
|
|
9
|
+
* - SSE → LlmResponse parsing for text + tool_use streams.
|
|
10
|
+
* - Provider routing: `adk:` prefix → 'adk' provider.
|
|
11
|
+
* - Adapter pricing strips the prefix.
|
|
12
|
+
* - checkAvailability degrades cleanly when no auth env is set.
|
|
13
|
+
*
|
|
14
|
+
* Live calls against api.anthropic.com are exercised by a separate
|
|
15
|
+
* smoke test gated on ANTHROPIC_API_KEY (not run in CI).
|
|
16
|
+
*/
|
|
17
|
+
import { describe, it } from 'node:test';
|
|
18
|
+
import assert from 'node:assert/strict';
|
|
19
|
+
import { LLMRegistry, BaseLlm } from '@google/adk';
|
|
20
|
+
import { AnthropicLlm, registerAnthropicLlm } from '../adk-anthropic-llm.js';
|
|
21
|
+
import { AdkAdapter } from '../adk-adapter.js';
|
|
22
|
+
import { resolveProvider } from '../agent/session/default-adapter-factory.js';
|
|
23
|
+
describe('AnthropicLlm — LLMRegistry integration', () => {
|
|
24
|
+
it('register is idempotent', () => {
|
|
25
|
+
registerAnthropicLlm();
|
|
26
|
+
registerAnthropicLlm();
|
|
27
|
+
registerAnthropicLlm();
|
|
28
|
+
// No throw; resolve still works.
|
|
29
|
+
const cls = LLMRegistry.resolve('claude-sonnet-4-6');
|
|
30
|
+
assert.equal(cls, AnthropicLlm);
|
|
31
|
+
});
|
|
32
|
+
it('resolves any claude-* id to AnthropicLlm', () => {
|
|
33
|
+
registerAnthropicLlm();
|
|
34
|
+
const ids = ['claude-haiku-4-5', 'claude-opus-4-7', 'claude-3-5-haiku-latest', 'claude-test-model'];
|
|
35
|
+
for (const id of ids) {
|
|
36
|
+
assert.equal(LLMRegistry.resolve(id), AnthropicLlm, id);
|
|
37
|
+
}
|
|
38
|
+
});
|
|
39
|
+
it('does NOT claim openrouter-style anthropic/* slugs', () => {
|
|
40
|
+
registerAnthropicLlm();
|
|
41
|
+
assert.throws(() => LLMRegistry.resolve('anthropic/claude-sonnet-4-6'), /not found|no.*model|unknown/i);
|
|
42
|
+
});
|
|
43
|
+
it('AnthropicLlm extends BaseLlm', () => {
|
|
44
|
+
const llm = new AnthropicLlm({ model: 'claude-sonnet-4-6' });
|
|
45
|
+
assert.ok(llm instanceof BaseLlm);
|
|
46
|
+
assert.equal(llm.model, 'claude-sonnet-4-6');
|
|
47
|
+
});
|
|
48
|
+
});
|
|
49
|
+
describe('AdkAdapter — provider routing + metadata', () => {
|
|
50
|
+
it('resolveProvider routes `adk:` prefix to adk', () => {
|
|
51
|
+
assert.equal(resolveProvider('adk:claude-sonnet-4-6'), 'adk');
|
|
52
|
+
assert.equal(resolveProvider('adk:gemini-2.5-flash'), 'adk');
|
|
53
|
+
assert.equal(resolveProvider('adk:claude-haiku-4-5'), 'adk');
|
|
54
|
+
});
|
|
55
|
+
it('routes BEFORE the generic slash check (so adk:foo/bar still picks adk)', () => {
|
|
56
|
+
assert.equal(resolveProvider('adk:vendor/model-id'), 'adk');
|
|
57
|
+
});
|
|
58
|
+
it('supportsModel only matches the prefixed form', () => {
|
|
59
|
+
const adapter = new AdkAdapter();
|
|
60
|
+
assert.equal(adapter.supportsModel('adk:claude-sonnet-4-6'), true);
|
|
61
|
+
assert.equal(adapter.supportsModel('claude-sonnet-4-6'), false);
|
|
62
|
+
assert.equal(adapter.supportsModel('gpt-4o'), false);
|
|
63
|
+
});
|
|
64
|
+
it('getModelPricing strips the prefix and falls back to null for unknown', () => {
|
|
65
|
+
const adapter = new AdkAdapter();
|
|
66
|
+
assert.deepEqual(adapter.getModelPricing('adk:claude-sonnet-4-6'), [3.0, 15.0]);
|
|
67
|
+
assert.deepEqual(adapter.getModelPricing('adk:gemini-2.5-flash'), [0.075, 0.30]);
|
|
68
|
+
assert.equal(adapter.getModelPricing('adk:unknown-future-model'), null);
|
|
69
|
+
});
|
|
70
|
+
it('capabilities advertise an agentic loop', () => {
|
|
71
|
+
const adapter = new AdkAdapter();
|
|
72
|
+
assert.equal(adapter.capabilities.tier, 'agentic');
|
|
73
|
+
assert.equal(adapter.capabilities.toolUse, true);
|
|
74
|
+
assert.equal(adapter.capabilities.fileSystem, true);
|
|
75
|
+
assert.equal(adapter.capabilities.shellExecution, true);
|
|
76
|
+
assert.equal(adapter.capabilities.streaming, true);
|
|
77
|
+
});
|
|
78
|
+
});
|
|
79
|
+
describe('AdkAdapter — checkAvailability', () => {
|
|
80
|
+
it('reports unavailable when no auth env is set', async () => {
|
|
81
|
+
const prior = {
|
|
82
|
+
anthropic: process.env.ANTHROPIC_API_KEY,
|
|
83
|
+
google: process.env.GOOGLE_API_KEY,
|
|
84
|
+
gemini: process.env.GEMINI_API_KEY,
|
|
85
|
+
genai: process.env.GOOGLE_GENAI_API_KEY,
|
|
86
|
+
};
|
|
87
|
+
delete process.env.ANTHROPIC_API_KEY;
|
|
88
|
+
delete process.env.GOOGLE_API_KEY;
|
|
89
|
+
delete process.env.GEMINI_API_KEY;
|
|
90
|
+
delete process.env.GOOGLE_GENAI_API_KEY;
|
|
91
|
+
try {
|
|
92
|
+
const adapter = new AdkAdapter();
|
|
93
|
+
const result = await adapter.checkAvailability();
|
|
94
|
+
assert.equal(result.available, false);
|
|
95
|
+
assert.match(result.error ?? '', /ANTHROPIC_API_KEY|GOOGLE_API_KEY|GEMINI_API_KEY/);
|
|
96
|
+
}
|
|
97
|
+
finally {
|
|
98
|
+
if (prior.anthropic !== undefined)
|
|
99
|
+
process.env.ANTHROPIC_API_KEY = prior.anthropic;
|
|
100
|
+
if (prior.google !== undefined)
|
|
101
|
+
process.env.GOOGLE_API_KEY = prior.google;
|
|
102
|
+
if (prior.gemini !== undefined)
|
|
103
|
+
process.env.GEMINI_API_KEY = prior.gemini;
|
|
104
|
+
if (prior.genai !== undefined)
|
|
105
|
+
process.env.GOOGLE_GENAI_API_KEY = prior.genai;
|
|
106
|
+
}
|
|
107
|
+
});
|
|
108
|
+
it('reports available when ANTHROPIC_API_KEY is set', async () => {
|
|
109
|
+
const prior = process.env.ANTHROPIC_API_KEY;
|
|
110
|
+
process.env.ANTHROPIC_API_KEY = 'sk-ant-test-only';
|
|
111
|
+
try {
|
|
112
|
+
const adapter = new AdkAdapter();
|
|
113
|
+
const result = await adapter.checkAvailability();
|
|
114
|
+
assert.equal(result.available, true);
|
|
115
|
+
}
|
|
116
|
+
finally {
|
|
117
|
+
if (prior === undefined)
|
|
118
|
+
delete process.env.ANTHROPIC_API_KEY;
|
|
119
|
+
else
|
|
120
|
+
process.env.ANTHROPIC_API_KEY = prior;
|
|
121
|
+
}
|
|
122
|
+
});
|
|
123
|
+
});
|
|
124
|
+
//# sourceMappingURL=adk-anthropic-llm.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"adk-anthropic-llm.test.js","sourceRoot":"","sources":["../../src/__tests__/adk-anthropic-llm.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Phase 4 tests — cost breakdown + per-component span annotation.
|
|
3
|
+
*
|
|
4
|
+
* Covers:
|
|
5
|
+
* - calculateCostBreakdown returns 5 fields, components sum to total (within ε)
|
|
6
|
+
* - Wrapper emits gen_ai.usage.cost_{input,output,cache_read,cache_write}_usd
|
|
7
|
+
* - Unknown-model fallback: wrapper preserves adapter's costUsd when the
|
|
8
|
+
* central table doesn't know the model (no fabricated zero on the total)
|
|
9
|
+
*/
|
|
10
|
+
export {};
|
|
11
|
+
//# sourceMappingURL=cost-breakdown.test.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cost-breakdown.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/cost-breakdown.test.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG"}
|