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

1"""Pricing data types for LLM models. 

2 

3This module defines the core pricing data structures used throughout 

4the pricing system. 

5""" 

6 

7from __future__ import annotations 

8 

9from collections.abc import Callable 

10from dataclasses import dataclass 

11from datetime import UTC, datetime 

12from typing import Any 

13 

14from pydantic import model_serializer 

15 

16from lexigram.domain import DomainModel 

17from lexigram.validation import ConfigDict, Field 

18 

19 

20@dataclass(init=False) 

21class ModelPricing(DomainModel): 

22 """Pricing information for a specific LLM model. 

23 

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"). 

31 

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") 

40 

41 """ 

42 

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") 

55 

56 model_config = ConfigDict() 

57 

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