/** * Pricing overlays for OpenCode Zen and Go models. * * Values are USD per million tokens, extracted from the built-in * @earendil-works/pi-ai opencode/opencode-go model catalog * (dist/models.generated.js). Models present only in the OmniRoute catalog * (e.g. Go-only qwen3.7-* effort tiers) carry an estimated cost marked with a * trailing comment. Effort-tier aliases reuse the base model's price. */ import type { ModelCost } from "./types.ts" export const ZERO_COST: ModelCost = { input: 0, output: 0, cacheRead: 0, cacheWrite: 0, } // --------------------------------------------------------------------------- // Zen pricing (verified against pi-ai built-in `opencode`) // --------------------------------------------------------------------------- export const ZEN_PRICING: Record = { "big-pickle": { input: 0, output: 0, cacheRead: 0, cacheWrite: 0 }, "claude-haiku-4-5": { input: 1, output: 5, cacheRead: 0.1, cacheWrite: 1.25 }, "claude-opus-4-1": { input: 15, output: 75, cacheRead: 1.5, cacheWrite: 18.75 }, "claude-opus-4-5": { input: 5, output: 25, cacheRead: 0.5, cacheWrite: 6.25 }, "claude-opus-4-6": { input: 5, output: 25, cacheRead: 0.5, cacheWrite: 6.25 }, "claude-opus-4-7": { input: 5, output: 25, cacheRead: 0.5, cacheWrite: 6.25 }, "claude-sonnet-4": { input: 3, output: 15, cacheRead: 0.3, cacheWrite: 3.75 }, "claude-sonnet-4-5": { input: 3, output: 15, cacheRead: 0.3, cacheWrite: 3.75 }, "claude-sonnet-4-6": { input: 3, output: 15, cacheRead: 0.3, cacheWrite: 3.75 }, "deepseek-v4-flash-free": { input: 0, output: 0, cacheRead: 0, cacheWrite: 0 }, "gemini-3-flash": { input: 0.5, output: 3, cacheRead: 0.05, cacheWrite: 0 }, "gemini-3.1-pro": { input: 2, output: 12, cacheRead: 0.2, cacheWrite: 0 }, "gemini-3.5-flash": { input: 1.5, output: 9, cacheRead: 0.15, cacheWrite: 0 }, "glm-5": { input: 1, output: 3.2, cacheRead: 0.2, cacheWrite: 0 }, "glm-5.1": { input: 1.4, output: 4.4, cacheRead: 0.26, cacheWrite: 0 }, "gpt-5": { input: 1.07, output: 8.5, cacheRead: 0.107, cacheWrite: 0 }, "gpt-5-codex": { input: 1.07, output: 8.5, cacheRead: 0.107, cacheWrite: 0 }, "gpt-5-nano": { input: 0.05, output: 0.4, cacheRead: 0.005, cacheWrite: 0 }, "gpt-5.1": { input: 1.07, output: 8.5, cacheRead: 0.107, cacheWrite: 0 }, "gpt-5.1-codex": { input: 1.07, output: 8.5, cacheRead: 0.107, cacheWrite: 0 }, "gpt-5.1-codex-max": { input: 1.25, output: 10, cacheRead: 0.125, cacheWrite: 0 }, "gpt-5.1-codex-mini": { input: 0.25, output: 2, cacheRead: 0.025, cacheWrite: 0 }, "gpt-5.2": { input: 1.75, output: 14, cacheRead: 0.175, cacheWrite: 0 }, "gpt-5.2-codex": { input: 1.75, output: 14, cacheRead: 0.175, cacheWrite: 0 }, "gpt-5.3-codex": { input: 1.75, output: 14, cacheRead: 0.175, cacheWrite: 0 }, "gpt-5.4": { input: 2.5, output: 15, cacheRead: 0.25, cacheWrite: 0 }, "gpt-5.4-mini": { input: 0.75, output: 4.5, cacheRead: 0.075, cacheWrite: 0 }, "gpt-5.4-nano": { input: 0.2, output: 1.25, cacheRead: 0.02, cacheWrite: 0 }, "gpt-5.4-pro": { input: 30, output: 180, cacheRead: 30, cacheWrite: 0 }, "gpt-5.5": { input: 5, output: 30, cacheRead: 0.5, cacheWrite: 0 }, "gpt-5.5-pro": { input: 30, output: 180, cacheRead: 30, cacheWrite: 0 }, "grok-build-0.1": { input: 1, output: 2, cacheRead: 0.2, cacheWrite: 0 }, "kimi-k2.5": { input: 0.6, output: 3, cacheRead: 0.08, cacheWrite: 0 }, "kimi-k2.6": { input: 0.95, output: 4, cacheRead: 0.16, cacheWrite: 0 }, "minimax-m2.5": { input: 0.3, output: 1.2, cacheRead: 0.06, cacheWrite: 0 }, "minimax-m2.7": { input: 0.3, output: 1.2, cacheRead: 0.06, cacheWrite: 0 }, // Estimate (not in built-in; OmniRoute-only with 1M context): "minimax-m3": { input: 0.4, output: 1.6, cacheRead: 0.08, cacheWrite: 0 }, "nemotron-3-super-free": { input: 0, output: 0, cacheRead: 0, cacheWrite: 0 }, "qwen3.5-plus": { input: 0.2, output: 1.2, cacheRead: 0.02, cacheWrite: 0.25 }, "qwen3.6-plus": { input: 0.5, output: 3, cacheRead: 0.05, cacheWrite: 0.625 }, } // --------------------------------------------------------------------------- // Go pricing (verified against pi-ai built-in `opencode-go`) // --------------------------------------------------------------------------- export const GO_PRICING: Record = { "deepseek-v4-flash": { input: 0.14, output: 0.28, cacheRead: 0.0028, cacheWrite: 0 }, "deepseek-v4-pro": { input: 1.74, output: 3.48, cacheRead: 0.0145, cacheWrite: 0 }, "glm-5": { input: 1, output: 3.2, cacheRead: 0.2, cacheWrite: 0 }, "glm-5.1": { input: 1.4, output: 4.4, cacheRead: 0.26, cacheWrite: 0 }, // Estimate (not in built-in; OmniRoute Go-only): "glm-5.2": { input: 1.6, output: 5, cacheRead: 0.3, cacheWrite: 0 }, "kimi-k2.5": { input: 0.6, output: 3, cacheRead: 0.1, cacheWrite: 0 }, "kimi-k2.6": { input: 0.95, output: 4, cacheRead: 0.16, cacheWrite: 0 }, // Estimate (not in built-in; OmniRoute Go-only code model): "kimi-k2.7-code": { input: 0.95, output: 4, cacheRead: 0.16, cacheWrite: 0 }, // Estimate (not in built-in; OmniRoute Go-only reasoning model): "kimi-k3": { input: 1.5, output: 6, cacheRead: 0.2, cacheWrite: 0 }, "mimo-v2.5": { input: 0.4, output: 2, cacheRead: 0.08, cacheWrite: 0 }, "mimo-v2.5-pro": { input: 1, output: 3, cacheRead: 0.2, cacheWrite: 0 }, "minimax-m2.5": { input: 0.3, output: 1.2, cacheRead: 0.03, cacheWrite: 0 }, "minimax-m2.7": { input: 0.3, output: 1.2, cacheRead: 0.06, cacheWrite: 0 }, // Estimate (not in built-in; OmniRoute Go-only with 1M context): "minimax-m3": { input: 0.4, output: 1.6, cacheRead: 0.08, cacheWrite: 0 }, // Estimate (not in built-in; OmniRoute Go-only): "qwen3.7-max": { input: 1.25, output: 3.75, cacheRead: 0.25, cacheWrite: 1.56 }, // Estimate (not in built-in; OmniRoute Go-only): "qwen3.7-plus": { input: 0.5, output: 3, cacheRead: 0.05, cacheWrite: 0.625 }, "qwen3.5-plus": { input: 0.2, output: 1.2, cacheRead: 0.02, cacheWrite: 0.25 }, "qwen3.6-plus": { input: 0.5, output: 3, cacheRead: 0.05, cacheWrite: 0.625 }, // Estimate (not in built-in; OmniRoute Go-only reasoning models): "grok-4.5": { input: 1, output: 2, cacheRead: 0.2, cacheWrite: 0 }, "hy3": { input: 0.3, output: 1.2, cacheRead: 0.06, cacheWrite: 0 }, "hy3-preview": { input: 0.3, output: 1.2, cacheRead: 0.06, cacheWrite: 0 }, } /** * Resolve pricing for a model id on a tier, falling back to the base model * when the id is an effort-tier alias (e.g. "deepseek-v4-pro-low" → * "deepseek-v4-pro"), and ultimately to ZERO_COST for unknown models. */ export function getPricing( tier: "zen" | "go", baseModelId: string, modelId: string ): ModelCost { const table = tier === "zen" ? ZEN_PRICING : GO_PRICING return ( table[modelId] ?? table[baseModelId] ?? ZERO_COST ) }