Coverage for /home/admin/Documents/AI/applications/lexigram-dev/lexigram/experimental/ai/lexigram-ai-llm/src/lexigram/ai/llm/pricing/types.py: 83%
23 statements
« prev ^ index » next coverage.py v7.15.4, created at 2026-08-25 07:19 +0800
« prev ^ index » next coverage.py v7.15.4, created at 2026-08-25 07:19 +0800
1"""Pricing data types for LLM models.
3This module defines the core pricing data structures used throughout
4the pricing system.
5"""
7from __future__ import annotations
9from collections.abc import Callable
10from dataclasses import dataclass
11from datetime import UTC, datetime
12from typing import Any
14from pydantic import model_serializer
16from lexigram.domain import DomainModel
17from lexigram.validation import ConfigDict, Field
20@dataclass(init=False)
21class ModelPricing(DomainModel):
22 """Pricing information for a specific LLM model.
24 Attributes:
25 model: Model identifier (e.g., "gpt-4-turbo", "claude-3-opus").
26 prompt_per_1m: Cost per 1 million prompt tokens in USD.
27 completion_per_1m: Cost per 1 million completion tokens in USD.
28 provider: Provider name (e.g., "openai", "anthropic").
29 last_updated: When pricing was last updated.
30 source: Where pricing data came from (e.g., "json", "api", "static").
32 Example:
33 >>> pricing = ModelPricing(
34 ... model="gpt-4-turbo",
35 ... prompt_per_1m=10.00,
36 ... completion_per_1m=30.00,
37 ... provider="openai"
38 ... )
39 >>> print(f"${pricing.prompt_per_1m} per 1M prompt tokens")
41 """
43 model: str = Field(..., description="Model identifier")
44 prompt_per_1m: float = Field(..., description="Cost per 1M prompt tokens (USD)")
45 completion_per_1m: float = Field(
46 ...,
47 description="Cost per 1M completion tokens (USD)",
48 )
49 provider: str = Field(..., description="Provider name")
50 last_updated: datetime = Field(
51 default_factory=lambda: datetime.now(UTC),
52 description="Last update timestamp",
53 )
54 source: str = Field(default="static", description="Data source")
56 model_config = ConfigDict()
58 @model_serializer(mode="wrap")
59 def serialize_model(
60 self, handler: Callable[[ModelPricing], dict[str, Any]]
61 ) -> dict[str, Any]:
62 """Custom serializer to handle datetime objects."""
63 data = handler(self)
64 # Convert datetime objects to ISO format strings
65 if isinstance(data.get("last_updated"), datetime):
66 data["last_updated"] = data["last_updated"].isoformat()
67 return data