@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,233 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Claude CLI ModelAdapter.
|
|
3
|
+
*
|
|
4
|
+
* The simplest adapter — Claude CLI already outputs Anvil Stream Format
|
|
5
|
+
* natively (`--output-format stream-json`), so we just pipe stdout through
|
|
6
|
+
* with zero transformation.
|
|
7
|
+
*/
|
|
8
|
+
import { spawn, execSync } from 'node:child_process';
|
|
9
|
+
import { createInterface } from 'node:readline';
|
|
10
|
+
import { UpstreamError, synthesizeStatusFromCli } from './upstream-error.js';
|
|
11
|
+
// ---------------------------------------------------------------------------
|
|
12
|
+
// Pricing table — [inputPer1M, outputPer1M]
|
|
13
|
+
// ---------------------------------------------------------------------------
|
|
14
|
+
const PRICING = {
|
|
15
|
+
sonnet: [3.0, 15.0],
|
|
16
|
+
opus: [15.0, 75.0],
|
|
17
|
+
haiku: [0.25, 1.25],
|
|
18
|
+
};
|
|
19
|
+
function pricingKeyFromModel(modelId) {
|
|
20
|
+
const lower = modelId.toLowerCase();
|
|
21
|
+
for (const key of Object.keys(PRICING)) {
|
|
22
|
+
if (lower.includes(key))
|
|
23
|
+
return key;
|
|
24
|
+
}
|
|
25
|
+
return undefined;
|
|
26
|
+
}
|
|
27
|
+
// ---------------------------------------------------------------------------
|
|
28
|
+
// Binary resolution
|
|
29
|
+
// ---------------------------------------------------------------------------
|
|
30
|
+
function resolveBinary() {
|
|
31
|
+
return (process.env.ANVIL_AGENT_CMD ??
|
|
32
|
+
process.env.FF_AGENT_CMD ??
|
|
33
|
+
process.env.CLAUDE_BIN ??
|
|
34
|
+
'claude');
|
|
35
|
+
}
|
|
36
|
+
// ---------------------------------------------------------------------------
|
|
37
|
+
// Adapter
|
|
38
|
+
// ---------------------------------------------------------------------------
|
|
39
|
+
export class ClaudeAdapter {
|
|
40
|
+
provider = 'claude';
|
|
41
|
+
capabilities = {
|
|
42
|
+
tier: 'agentic',
|
|
43
|
+
streaming: true,
|
|
44
|
+
toolUse: true,
|
|
45
|
+
fileSystem: true,
|
|
46
|
+
shellExecution: true,
|
|
47
|
+
sessionResume: true,
|
|
48
|
+
promptCaching: true,
|
|
49
|
+
cache: 'explicit',
|
|
50
|
+
cacheTtlSeconds: 300,
|
|
51
|
+
structuredOutput: 'tool-shim',
|
|
52
|
+
// Claude CLI doesn't expose a max-tokens flag today; bridges/router callers
|
|
53
|
+
// may pass it but the adapter ignores it.
|
|
54
|
+
maxOutputTokens: false,
|
|
55
|
+
};
|
|
56
|
+
child = null;
|
|
57
|
+
supportsModel(modelId) {
|
|
58
|
+
const lower = modelId.toLowerCase();
|
|
59
|
+
return (lower.startsWith('claude-') ||
|
|
60
|
+
lower.includes('sonnet') ||
|
|
61
|
+
lower.includes('opus') ||
|
|
62
|
+
lower.includes('haiku'));
|
|
63
|
+
}
|
|
64
|
+
getModelPricing(modelId) {
|
|
65
|
+
const key = pricingKeyFromModel(modelId);
|
|
66
|
+
return key ? PRICING[key] : null;
|
|
67
|
+
}
|
|
68
|
+
async checkAvailability() {
|
|
69
|
+
try {
|
|
70
|
+
const bin = resolveBinary();
|
|
71
|
+
const version = execSync(`${bin} --version`, { encoding: 'utf-8', timeout: 10_000 }).trim();
|
|
72
|
+
return { available: true, version };
|
|
73
|
+
}
|
|
74
|
+
catch (err) {
|
|
75
|
+
return { available: false, error: err.message };
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
async run(config, output) {
|
|
79
|
+
const bin = resolveBinary();
|
|
80
|
+
const startTime = Date.now();
|
|
81
|
+
// ---- Build args -------------------------------------------------------
|
|
82
|
+
const args = [
|
|
83
|
+
'-p', config.userPrompt,
|
|
84
|
+
'--output-format', 'stream-json',
|
|
85
|
+
'--verbose',
|
|
86
|
+
];
|
|
87
|
+
if (config.projectPrompt) {
|
|
88
|
+
// Claude CLI's flag is --system-prompt (replaces default) or
|
|
89
|
+
// --append-system-prompt (extends default). The legacy
|
|
90
|
+
// single-shot.ts uses --system-prompt. We follow that convention
|
|
91
|
+
// since the dashboard's projectPrompt is a full persona prompt.
|
|
92
|
+
args.push('--system-prompt', config.projectPrompt);
|
|
93
|
+
}
|
|
94
|
+
if (config.model) {
|
|
95
|
+
args.push('--model', config.model);
|
|
96
|
+
}
|
|
97
|
+
// Claude CLI: --session-id starts a NEW session with that UUID;
|
|
98
|
+
// --resume <id> continues an existing one. The two flags are mutually
|
|
99
|
+
// exclusive — passing both makes the CLI exit non-zero immediately.
|
|
100
|
+
if (config.resume && config.sessionId) {
|
|
101
|
+
args.push('--resume', config.sessionId);
|
|
102
|
+
}
|
|
103
|
+
else if (config.sessionId) {
|
|
104
|
+
args.push('--session-id', config.sessionId);
|
|
105
|
+
}
|
|
106
|
+
else if (config.resume) {
|
|
107
|
+
args.push('--resume');
|
|
108
|
+
}
|
|
109
|
+
if (config.permissionMode) {
|
|
110
|
+
args.push('--permission-mode', config.permissionMode);
|
|
111
|
+
}
|
|
112
|
+
if (config.allowedTools?.length) {
|
|
113
|
+
args.push('--allowedTools', config.allowedTools.join(','));
|
|
114
|
+
}
|
|
115
|
+
if (config.disallowedTools?.length) {
|
|
116
|
+
args.push('--disallowedTools', config.disallowedTools.join(','));
|
|
117
|
+
}
|
|
118
|
+
if (config.mcpConfigPath) {
|
|
119
|
+
// Claude CLI: --mcp-config points at an mcp.json that claude-cli
|
|
120
|
+
// reads to bootstrap MCP server connections. defaultAdapterFactory
|
|
121
|
+
// resolves the path from the spawn's workspaceDir.
|
|
122
|
+
args.push('--mcp-config', config.mcpConfigPath);
|
|
123
|
+
}
|
|
124
|
+
// ---- Spawn ------------------------------------------------------------
|
|
125
|
+
const child = spawn(bin, args, {
|
|
126
|
+
cwd: config.workingDir,
|
|
127
|
+
stdio: ['pipe', 'pipe', 'pipe'],
|
|
128
|
+
});
|
|
129
|
+
this.child = child;
|
|
130
|
+
// End stdin immediately — prompt is passed via args
|
|
131
|
+
child.stdin.end();
|
|
132
|
+
// Forward stderr to process.stderr while ALSO buffering it so we
|
|
133
|
+
// can scan for retryable upstream conditions (rate-limit, quota,
|
|
134
|
+
// overload) on a non-zero exit. Capped to 16 KB to avoid blowing
|
|
135
|
+
// memory on a chatty failure.
|
|
136
|
+
let stderrBuf = '';
|
|
137
|
+
const STDERR_CAP = 16 * 1024;
|
|
138
|
+
child.stderr.on('data', (chunk) => {
|
|
139
|
+
process.stderr.write(chunk);
|
|
140
|
+
if (stderrBuf.length < STDERR_CAP) {
|
|
141
|
+
stderrBuf += chunk.toString('utf8').slice(0, STDERR_CAP - stderrBuf.length);
|
|
142
|
+
}
|
|
143
|
+
});
|
|
144
|
+
// ---- Pipe stdout & capture result in parallel -------------------------
|
|
145
|
+
let resultMsg = null;
|
|
146
|
+
let fullOutput = '';
|
|
147
|
+
let toolCallCount = 0;
|
|
148
|
+
// Anthropic stream-json stamps stop_reason on the assistant frame, not
|
|
149
|
+
// the result frame, so we cache the most recent one and surface it on
|
|
150
|
+
// ModelAdapterResult below.
|
|
151
|
+
let lastStopReason;
|
|
152
|
+
// We read stdout line-by-line to capture the result message while also
|
|
153
|
+
// piping every line to the output writable unchanged.
|
|
154
|
+
const rl = createInterface({ input: child.stdout, crlfDelay: Infinity });
|
|
155
|
+
rl.on('line', (line) => {
|
|
156
|
+
// Pipe through unchanged
|
|
157
|
+
output.write(line + '\n');
|
|
158
|
+
// Try to parse the result message
|
|
159
|
+
try {
|
|
160
|
+
const parsed = JSON.parse(line);
|
|
161
|
+
if (parsed.type === 'result') {
|
|
162
|
+
resultMsg = parsed;
|
|
163
|
+
fullOutput = parsed.result ?? '';
|
|
164
|
+
}
|
|
165
|
+
else if (parsed.type === 'assistant' && Array.isArray(parsed.message?.content)) {
|
|
166
|
+
// Count tool_use blocks for telemetry; pure-pipe semantics preserved.
|
|
167
|
+
for (const block of parsed.message.content) {
|
|
168
|
+
if (block?.type === 'tool_use')
|
|
169
|
+
toolCallCount += 1;
|
|
170
|
+
}
|
|
171
|
+
if (typeof parsed.message?.stop_reason === 'string') {
|
|
172
|
+
lastStopReason = parsed.message.stop_reason;
|
|
173
|
+
}
|
|
174
|
+
}
|
|
175
|
+
}
|
|
176
|
+
catch {
|
|
177
|
+
// Not JSON — pass through silently
|
|
178
|
+
}
|
|
179
|
+
});
|
|
180
|
+
// ---- Wait for exit ----------------------------------------------------
|
|
181
|
+
const exitCode = await new Promise((resolve, reject) => {
|
|
182
|
+
child.on('close', (code) => resolve(code ?? 0));
|
|
183
|
+
child.on('error', reject);
|
|
184
|
+
});
|
|
185
|
+
this.child = null;
|
|
186
|
+
const durationMs = Date.now() - startTime;
|
|
187
|
+
if (exitCode !== 0 && !resultMsg) {
|
|
188
|
+
// Try to classify the failure from stderr so the dashboard's
|
|
189
|
+
// chain-fallback can hop to another provider on a quota/rate-limit
|
|
190
|
+
// hit instead of dying. Anthropic's CLI surfaces these as
|
|
191
|
+
// "rate_limit_error", "overloaded_error", "Credit balance is too
|
|
192
|
+
// low", or HTTP-style status numbers in the stderr body.
|
|
193
|
+
const synth = synthesizeStatusFromCli(stderrBuf);
|
|
194
|
+
if (synth) {
|
|
195
|
+
throw new UpstreamError(synth.status, stderrBuf || `Claude CLI exited with code ${exitCode}`, {
|
|
196
|
+
provider: 'claude',
|
|
197
|
+
retryable: synth.retryable,
|
|
198
|
+
});
|
|
199
|
+
}
|
|
200
|
+
throw new Error(`Claude CLI exited with code ${exitCode}${stderrBuf ? `\n${stderrBuf.slice(0, 400)}` : ''}`);
|
|
201
|
+
}
|
|
202
|
+
// ---- Build result -----------------------------------------------------
|
|
203
|
+
const pricing = this.getModelPricing(config.model) ?? [3.0, 15.0];
|
|
204
|
+
const rm = resultMsg;
|
|
205
|
+
const inputTokens = rm?.usage?.input_tokens ?? 0;
|
|
206
|
+
const outputTokens = rm?.usage?.output_tokens ?? 0;
|
|
207
|
+
const cacheReadTokens = rm?.usage?.cache_read_input_tokens ?? 0;
|
|
208
|
+
const cacheWriteTokens = rm?.usage?.cache_creation_input_tokens ?? 0;
|
|
209
|
+
const costUsd = rm?.total_cost_usd ??
|
|
210
|
+
(inputTokens * pricing[0] + outputTokens * pricing[1]) / 1_000_000;
|
|
211
|
+
return {
|
|
212
|
+
output: fullOutput,
|
|
213
|
+
inputTokens,
|
|
214
|
+
outputTokens,
|
|
215
|
+
costUsd,
|
|
216
|
+
durationMs,
|
|
217
|
+
sessionId: rm?.session_id,
|
|
218
|
+
provider: 'claude',
|
|
219
|
+
model: config.model,
|
|
220
|
+
cacheReadTokens,
|
|
221
|
+
cacheWriteTokens,
|
|
222
|
+
toolCallCount,
|
|
223
|
+
stopReason: lastStopReason,
|
|
224
|
+
};
|
|
225
|
+
}
|
|
226
|
+
kill() {
|
|
227
|
+
if (this.child && !this.child.killed) {
|
|
228
|
+
this.child.kill('SIGTERM');
|
|
229
|
+
this.child = null;
|
|
230
|
+
}
|
|
231
|
+
}
|
|
232
|
+
}
|
|
233
|
+
//# sourceMappingURL=claude-adapter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"claude-adapter.js","sourceRoot":"","sources":["../src/claude-adapter.ts"],"names":[],"mappings":"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"}
|
package/dist/cost.d.ts
ADDED
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Central cost calculator — backed by a vendored snapshot of LiteLLM's
|
|
3
|
+
* `model_prices_and_context_window.json` (Apache-2.0).
|
|
4
|
+
*
|
|
5
|
+
* The snapshot lives at `data/model-prices.json` (committed). Refresh via
|
|
6
|
+
* `node scripts/refresh-cost-table.mjs` (quarterly + on adding new models).
|
|
7
|
+
*
|
|
8
|
+
* LiteLLM's keys use full versioned model IDs (e.g. `claude-3-5-sonnet-20241022`).
|
|
9
|
+
* Anvil's adapter PRICING tables historically use short canonical names
|
|
10
|
+
* (`sonnet`, `opus`, `haiku`). The `MODEL_ALIASES` table below bridges the
|
|
11
|
+
* two — short name → LiteLLM key. When the loader fails on the literal model
|
|
12
|
+
* ID, it falls back to the alias table.
|
|
13
|
+
*
|
|
14
|
+
* Pricing units in this module:
|
|
15
|
+
* input_cost_per_token / output_cost_per_token from LiteLLM are PER-TOKEN.
|
|
16
|
+
* We convert to PER-1M-TOKENS to match the existing ModelAdapter contract
|
|
17
|
+
* (`getModelPricing(modelId): [number, number] | null` where the tuple is
|
|
18
|
+
* `[inputPer1M, outputPer1M]`).
|
|
19
|
+
*/
|
|
20
|
+
/**
|
|
21
|
+
* Look up a model in the cost table.
|
|
22
|
+
*
|
|
23
|
+
* @returns `[inputPer1M, outputPer1M]` in USD, or `null` if the model is
|
|
24
|
+
* unknown. Cache pricing is intentionally NOT exposed via this surface —
|
|
25
|
+
* use `getDetailedPricing` for that.
|
|
26
|
+
*/
|
|
27
|
+
export declare function getModelPricing(model: string): [number, number] | null;
|
|
28
|
+
export interface DetailedPricing {
|
|
29
|
+
inputPer1M: number;
|
|
30
|
+
outputPer1M: number;
|
|
31
|
+
cacheReadPer1M?: number;
|
|
32
|
+
cacheWritePer1M?: number;
|
|
33
|
+
maxInputTokens?: number;
|
|
34
|
+
maxOutputTokens?: number;
|
|
35
|
+
}
|
|
36
|
+
/** Detailed pricing including cache columns + context-window limits. */
|
|
37
|
+
export declare function getDetailedPricing(model: string): DetailedPricing | null;
|
|
38
|
+
export interface UsageInput {
|
|
39
|
+
inputTokens: number;
|
|
40
|
+
outputTokens: number;
|
|
41
|
+
cacheReadTokens?: number;
|
|
42
|
+
cacheWriteTokens?: number;
|
|
43
|
+
}
|
|
44
|
+
export interface CostBreakdown {
|
|
45
|
+
totalUsd: number;
|
|
46
|
+
inputUsd: number;
|
|
47
|
+
outputUsd: number;
|
|
48
|
+
cacheReadUsd: number;
|
|
49
|
+
cacheWriteUsd: number;
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* Compute a per-component cost breakdown.
|
|
53
|
+
*
|
|
54
|
+
* Returns all-zero values when the model isn't in the cost table — caller
|
|
55
|
+
* decides whether to fall back to an adapter-supplied cost (the existing
|
|
56
|
+
* legacy path). Cache components are zero when either the usage doesn't
|
|
57
|
+
* include cache tokens or the pricing entry doesn't list a cache rate.
|
|
58
|
+
*/
|
|
59
|
+
export declare function calculateCostBreakdown(model: string, usage: UsageInput): CostBreakdown;
|
|
60
|
+
/**
|
|
61
|
+
* Compute USD cost for a usage block at the given model's pricing.
|
|
62
|
+
* Returns 0 if the model is unknown.
|
|
63
|
+
*/
|
|
64
|
+
export declare function calculateCost(model: string, usage: UsageInput): number;
|
|
65
|
+
/** Test seam — clear the in-memory cache. */
|
|
66
|
+
export declare function resetCostTable(): void;
|
|
67
|
+
//# sourceMappingURL=cost.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cost.d.ts","sourceRoot":"","sources":["../src/cost.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAyDH;;;;;;GAMG;AACH,wBAAgB,eAAe,CAAC,KAAK,EAAE,MAAM,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,IAAI,CAMtE;AAED,MAAM,WAAW,eAAe;IAC9B,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,MAAM,CAAC;IACpB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,eAAe,CAAC,EAAE,MAAM,CAAC;CAC1B;AAED,wEAAwE;AACxE,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,MAAM,GAAG,eAAe,GAAG,IAAI,CAiBxE;AAoBD,MAAM,WAAW,UAAU;IACzB,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,MAAM,CAAC;IACrB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,gBAAgB,CAAC,EAAE,MAAM,CAAC;CAC3B;AAED,MAAM,WAAW,aAAa;IAC5B,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,YAAY,EAAE,MAAM,CAAC;IACrB,aAAa,EAAE,MAAM,CAAC;CACvB;AAED;;;;;;;GAOG;AACH,wBAAgB,sBAAsB,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,UAAU,GAAG,aAAa,CAoBtF;AAED;;;GAGG;AACH,wBAAgB,aAAa,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,UAAU,GAAG,MAAM,CAEtE;AAED,6CAA6C;AAC7C,wBAAgB,cAAc,IAAI,IAAI,CAErC"}
|
package/dist/cost.js
ADDED
|
@@ -0,0 +1,148 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Central cost calculator — backed by a vendored snapshot of LiteLLM's
|
|
3
|
+
* `model_prices_and_context_window.json` (Apache-2.0).
|
|
4
|
+
*
|
|
5
|
+
* The snapshot lives at `data/model-prices.json` (committed). Refresh via
|
|
6
|
+
* `node scripts/refresh-cost-table.mjs` (quarterly + on adding new models).
|
|
7
|
+
*
|
|
8
|
+
* LiteLLM's keys use full versioned model IDs (e.g. `claude-3-5-sonnet-20241022`).
|
|
9
|
+
* Anvil's adapter PRICING tables historically use short canonical names
|
|
10
|
+
* (`sonnet`, `opus`, `haiku`). The `MODEL_ALIASES` table below bridges the
|
|
11
|
+
* two — short name → LiteLLM key. When the loader fails on the literal model
|
|
12
|
+
* ID, it falls back to the alias table.
|
|
13
|
+
*
|
|
14
|
+
* Pricing units in this module:
|
|
15
|
+
* input_cost_per_token / output_cost_per_token from LiteLLM are PER-TOKEN.
|
|
16
|
+
* We convert to PER-1M-TOKENS to match the existing ModelAdapter contract
|
|
17
|
+
* (`getModelPricing(modelId): [number, number] | null` where the tuple is
|
|
18
|
+
* `[inputPer1M, outputPer1M]`).
|
|
19
|
+
*/
|
|
20
|
+
import { readFileSync } from 'node:fs';
|
|
21
|
+
import { fileURLToPath } from 'node:url';
|
|
22
|
+
import { dirname, join } from 'node:path';
|
|
23
|
+
const __filename = fileURLToPath(import.meta.url);
|
|
24
|
+
const __dirname = dirname(__filename);
|
|
25
|
+
const PRICES_PATH = join(__dirname, 'data', 'model-prices.json');
|
|
26
|
+
let _modelPrices = null;
|
|
27
|
+
function loadModelPrices() {
|
|
28
|
+
if (_modelPrices)
|
|
29
|
+
return _modelPrices;
|
|
30
|
+
try {
|
|
31
|
+
_modelPrices = JSON.parse(readFileSync(PRICES_PATH, 'utf-8'));
|
|
32
|
+
}
|
|
33
|
+
catch (err) {
|
|
34
|
+
process.stderr.write(`[anvil-cost] WARNING: failed to load model-prices.json from ${PRICES_PATH}: ` +
|
|
35
|
+
`${err.message}. Cost calculations will return 0.\n`);
|
|
36
|
+
_modelPrices = {};
|
|
37
|
+
}
|
|
38
|
+
return _modelPrices;
|
|
39
|
+
}
|
|
40
|
+
// ── Anvil short-name → LiteLLM canonical-name aliases ─────────────────────
|
|
41
|
+
/**
|
|
42
|
+
* Bridge table — maps Anvil's short canonical model names (used in
|
|
43
|
+
* `model-router.ts` and adapter PRICING tables) to specific LiteLLM keys.
|
|
44
|
+
* Conservative: each short name resolves to a stable, recent flagship version.
|
|
45
|
+
* Refresh in lockstep with the cost-table snapshot when new flagships ship.
|
|
46
|
+
*/
|
|
47
|
+
const MODEL_ALIASES = {
|
|
48
|
+
// Anthropic short names
|
|
49
|
+
'sonnet': 'claude-sonnet-4-6',
|
|
50
|
+
'opus': 'claude-opus-4-7',
|
|
51
|
+
'haiku': 'claude-haiku-4-5',
|
|
52
|
+
'claude-sonnet-4': 'claude-sonnet-4-6',
|
|
53
|
+
'claude-opus-4': 'claude-opus-4-7',
|
|
54
|
+
'claude-haiku-4': 'claude-haiku-4-5',
|
|
55
|
+
};
|
|
56
|
+
// ── Lookup ────────────────────────────────────────────────────────────────
|
|
57
|
+
/**
|
|
58
|
+
* Look up a model in the cost table.
|
|
59
|
+
*
|
|
60
|
+
* @returns `[inputPer1M, outputPer1M]` in USD, or `null` if the model is
|
|
61
|
+
* unknown. Cache pricing is intentionally NOT exposed via this surface —
|
|
62
|
+
* use `getDetailedPricing` for that.
|
|
63
|
+
*/
|
|
64
|
+
export function getModelPricing(model) {
|
|
65
|
+
const entry = lookupEntry(model);
|
|
66
|
+
if (!entry || typeof entry.input_cost_per_token !== 'number' || typeof entry.output_cost_per_token !== 'number') {
|
|
67
|
+
return null;
|
|
68
|
+
}
|
|
69
|
+
return [entry.input_cost_per_token * 1_000_000, entry.output_cost_per_token * 1_000_000];
|
|
70
|
+
}
|
|
71
|
+
/** Detailed pricing including cache columns + context-window limits. */
|
|
72
|
+
export function getDetailedPricing(model) {
|
|
73
|
+
const entry = lookupEntry(model);
|
|
74
|
+
if (!entry || typeof entry.input_cost_per_token !== 'number' || typeof entry.output_cost_per_token !== 'number') {
|
|
75
|
+
return null;
|
|
76
|
+
}
|
|
77
|
+
return {
|
|
78
|
+
inputPer1M: entry.input_cost_per_token * 1_000_000,
|
|
79
|
+
outputPer1M: entry.output_cost_per_token * 1_000_000,
|
|
80
|
+
cacheReadPer1M: entry.cache_read_input_token_cost !== undefined
|
|
81
|
+
? entry.cache_read_input_token_cost * 1_000_000
|
|
82
|
+
: undefined,
|
|
83
|
+
cacheWritePer1M: entry.cache_creation_input_token_cost !== undefined
|
|
84
|
+
? entry.cache_creation_input_token_cost * 1_000_000
|
|
85
|
+
: undefined,
|
|
86
|
+
maxInputTokens: entry.max_input_tokens,
|
|
87
|
+
maxOutputTokens: entry.max_output_tokens,
|
|
88
|
+
};
|
|
89
|
+
}
|
|
90
|
+
function lookupEntry(model) {
|
|
91
|
+
const prices = loadModelPrices();
|
|
92
|
+
// 1. Exact match.
|
|
93
|
+
if (prices[model])
|
|
94
|
+
return prices[model];
|
|
95
|
+
// 2. Alias bridge.
|
|
96
|
+
const aliased = MODEL_ALIASES[model.toLowerCase()];
|
|
97
|
+
if (aliased && prices[aliased])
|
|
98
|
+
return prices[aliased];
|
|
99
|
+
// 3. Substring match — for short names that didn't make it into MODEL_ALIASES.
|
|
100
|
+
// Iterate aliases first (cheap, small set), then bail.
|
|
101
|
+
const lower = model.toLowerCase();
|
|
102
|
+
for (const [alias, target] of Object.entries(MODEL_ALIASES)) {
|
|
103
|
+
if (lower.includes(alias) && prices[target])
|
|
104
|
+
return prices[target];
|
|
105
|
+
}
|
|
106
|
+
return undefined;
|
|
107
|
+
}
|
|
108
|
+
/**
|
|
109
|
+
* Compute a per-component cost breakdown.
|
|
110
|
+
*
|
|
111
|
+
* Returns all-zero values when the model isn't in the cost table — caller
|
|
112
|
+
* decides whether to fall back to an adapter-supplied cost (the existing
|
|
113
|
+
* legacy path). Cache components are zero when either the usage doesn't
|
|
114
|
+
* include cache tokens or the pricing entry doesn't list a cache rate.
|
|
115
|
+
*/
|
|
116
|
+
export function calculateCostBreakdown(model, usage) {
|
|
117
|
+
const p = getDetailedPricing(model);
|
|
118
|
+
if (!p) {
|
|
119
|
+
return { totalUsd: 0, inputUsd: 0, outputUsd: 0, cacheReadUsd: 0, cacheWriteUsd: 0 };
|
|
120
|
+
}
|
|
121
|
+
const inputUsd = (usage.inputTokens / 1_000_000) * p.inputPer1M;
|
|
122
|
+
const outputUsd = (usage.outputTokens / 1_000_000) * p.outputPer1M;
|
|
123
|
+
const cacheReadUsd = usage.cacheReadTokens && p.cacheReadPer1M
|
|
124
|
+
? (usage.cacheReadTokens / 1_000_000) * p.cacheReadPer1M
|
|
125
|
+
: 0;
|
|
126
|
+
const cacheWriteUsd = usage.cacheWriteTokens && p.cacheWritePer1M
|
|
127
|
+
? (usage.cacheWriteTokens / 1_000_000) * p.cacheWritePer1M
|
|
128
|
+
: 0;
|
|
129
|
+
return {
|
|
130
|
+
totalUsd: inputUsd + outputUsd + cacheReadUsd + cacheWriteUsd,
|
|
131
|
+
inputUsd,
|
|
132
|
+
outputUsd,
|
|
133
|
+
cacheReadUsd,
|
|
134
|
+
cacheWriteUsd,
|
|
135
|
+
};
|
|
136
|
+
}
|
|
137
|
+
/**
|
|
138
|
+
* Compute USD cost for a usage block at the given model's pricing.
|
|
139
|
+
* Returns 0 if the model is unknown.
|
|
140
|
+
*/
|
|
141
|
+
export function calculateCost(model, usage) {
|
|
142
|
+
return calculateCostBreakdown(model, usage).totalUsd;
|
|
143
|
+
}
|
|
144
|
+
/** Test seam — clear the in-memory cache. */
|
|
145
|
+
export function resetCostTable() {
|
|
146
|
+
_modelPrices = null;
|
|
147
|
+
}
|
|
148
|
+
//# sourceMappingURL=cost.js.map
|
package/dist/cost.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cost.js","sourceRoot":"","sources":["../src/cost.ts"],"names":[],"mappings":"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"}
|