SPB Git

Repository Public

pricing.ts 2.3 KB 38 lines typescript

1/** Pre-flight estimates only. The ledger records provider-reported ticks. Prices retrieved 2026-11-10. */2export const TICKS_PER_USD = 10_000_000_000;3export const ticksToUsd = (ticks: number) => Math.round((ticks / TICKS_PER_USD) * 1e6) / 1e6;45export const PRICES_RETRIEVED = "2026-11-10";6export const IMAGE_USD: Record<string, Record<string, number>> = {7  "grok-imagine-image-2.0": { "low:1k": 0.04, "low:1.5k": 0.05, "low:2k": 0.06, "medium:1k": 0.06, "medium:1.5k": 0.07, "medium:2k": 0.08 },8  "grok-imagine-image": { "*": 0.02 },9};10/** USD per second. `basis` says whether the figure was measured or assumed. */11export const VIDEO_USD_PER_S: Record<string, { usd: number; basis: "measured" | "list" | "assumed" }> = {12  "grok-imagine-video-1.5-lite:720p": { usd: 0.0325, basis: "measured" },13  "grok-imagine-video-1.5-lite:480p": { usd: 0.02, basis: "list" },14  "grok-imagine-video-1.5:480p": { usd: 0.08, basis: "list" },15  "grok-imagine-video-1.5:720p": { usd: 0.1415, basis: "measured" },16  "grok-imagine-video-1.5:1080p": { usd: 0.2517, basis: "measured" },17  "grok-imagine-video:480p": { usd: 0.05, basis: "list" },18};19/** Image edit (reference image in, new scene out), 2k medium: measured $0.09 on 2026-11-10. */20export const IMAGE_EDIT_USD = 0.09;21export const TTS_USD_PER_CHAR = 15 / 1_000_000;22export const WEB_SEARCH_USD_PER_CALL = 5 / 1000;2324export interface Estimate { usd: number | null; basis: "observed" | "measured" | "list" | "assumed" | "unknown" }2526export function estimateImage(model: string, quality = "low", resolution = "1k"): Estimate {27  const t = IMAGE_USD[model];28  const usd = t?.[`${quality}:${resolution}`] ?? t?.["*"];29  return usd === undefined ? { usd: null, basis: "unknown" } : { usd, basis: "list" };30}31export function estimateVideo(model: string, resolution: string, seconds: number, observedPerSecond?: number | null): Estimate {32  if (observedPerSecond && observedPerSecond > 0) return { usd: round(observedPerSecond * seconds), basis: "observed" };33  const p = VIDEO_USD_PER_S[`${model}:${resolution}`];34  return p ? { usd: round(p.usd * seconds), basis: p.basis } : { usd: null, basis: "unknown" };35}36export const estimateSpeech = (chars: number): Estimate => ({ usd: round(chars * TTS_USD_PER_CHAR), basis: "list" });37const round = (n: number) => Math.round(n * 10000) / 10000;38
Files main
Menu

Theme