Estimating Gemini API Costs
Two valid costing patterns are common: static token-price calculators and pipeline-aware operation costing.
Approach A: Static Token-price Estimator (Standalone)
Best for scripts, experiments, and prototypes.
interface ModelPricing {
inputPrice: number; // per 1M
outputPrice: number; // per 1M
}
function estimateCost(model: string, inputTokens: number, outputTokens: number, pricing: Record<string, ModelPricing>): number {
const p = pricing[model];
if (!p) throw new Error(`Unknown model: ${model}`);
return (inputTokens / 1_000_000) * p.inputPrice + (outputTokens / 1_000_000) * p.outputPrice;
}
You can pair this with a per-model and per-operation tracker.
Approach B: Pipeline-aware Operation Costing
Best for production pipelines with mixed cost semantics.
- Selection/script/policy: token-based.
- Image generation: often logged as fixed per-grid/per-image operation cost.
- Audio generation: token-based, but pricing may come from DB/config (
modelstable).
await db.prepare(`
INSERT INTO cost_logs (video_id, log_type, model_id, input_tokens, output_tokens, cost)
VALUES (?, ?, ?, ?, ?, ?)
`).bind(videoId, logType, modelId, inputTokens, outputTokens, cost).run();
Practical Baseline Table (Pipeline Example)
| Model | Input / 1M | Output / 1M | Note |
|---|---|---|---|
gemini-3-pro-preview |
$2.00 | $12.00 | selection/script/policy strong |
gemini-3-flash-preview |
$0.50 | $3.00 | policy light |
gemini-3-pro-image-preview |
operation-based in pipeline | operation-based in pipeline | image grids |
gemini-2.5-pro-preview-tts |
DB/config driven | DB/config driven | audio |
gemini-2.5-flash-preview-tts |
DB/config driven | DB/config driven | audio optional |
Budgeting Guidance
- Use static estimation before execution.
- Reconcile with actual
usageMetadataand operation logs after execution. - Recompute aggregate
total_costfromcost_logsto avoid drift.
Note on Pricing Drift
Model prices and billing semantics can change. Keep pricing in config/data, not hardcoded in many files.