| from dataclasses import dataclass |
|
|
| |
| |
|
|
|
|
| @dataclass(frozen=True) |
| class ModelInfo: |
| id: str |
| label: str |
| prompt_cost: float |
| completion_cost: float |
|
|
|
|
| MODELS: list[ModelInfo] = [ |
| ModelInfo("openai/gpt-4o-mini", "GPT-4o mini (cheap)", 0.15, 0.60), |
| ModelInfo("anthropic/claude-3.5-haiku", "Claude 3.5 Haiku (cheap)", 0.80, 4.00), |
| ModelInfo("google/gemini-flash-1.5", "Gemini 1.5 Flash (cheap)", 0.075, 0.30), |
| ModelInfo("deepseek/deepseek-chat", "DeepSeek Chat (cheap)", 0.14, 0.28), |
| ModelInfo("anthropic/claude-3.5-sonnet", "Claude 3.5 Sonnet (strong)", 3.00, 15.00), |
| ModelInfo("openai/gpt-4o", "GPT-4o (strong)", 2.50, 10.00), |
| ] |
|
|
| DEFAULT_MODEL = "openai/gpt-4o-mini" |
|
|
|
|
| def model_ids() -> list[str]: |
| return [m.id for m in MODELS] |
|
|
|
|
| def get_model(model_id: str) -> ModelInfo | None: |
| return next((m for m in MODELS if m.id == model_id), None) |
|
|
|
|
| def estimate_cost(model_id: str, prompt_tokens: int, completion_tokens: int) -> float: |
| m = get_model(model_id) |
| if m is None: |
| return 0.0 |
| return (prompt_tokens / 1_000_000) * m.prompt_cost + ( |
| completion_tokens / 1_000_000 |
| ) * m.completion_cost |
|
|