Coverage for src / lexigram / contracts / ai / models.py: 0%

20 statements  

« prev     ^ index     » next       coverage.py v7.13.5, created at 2026-08-15 18:57 +0800

1"""AI model request and response types.""" 

2 

3from __future__ import annotations 

4 

5from dataclasses import dataclass, field 

6from typing import TYPE_CHECKING, Any 

7 

8if TYPE_CHECKING: 

9 from lexigram.contracts.ai.types import ModelCapability 

10 

11 

12@dataclass(frozen=True) 

13class ModelRequest: 

14 """Request to execute an LLM model. 

15 

16 Attributes: 

17 prompt: The input prompt or messages 

18 model_id: Optional specific model to use (overrides capability-based selection) 

19 temperature: Sampling temperature (0.0 to 2.0, lower = deterministic) 

20 max_tokens: Maximum tokens in the response 

21 top_p: Nucleus sampling parameter 

22 top_k: Top-k sampling parameter 

23 required_capabilities: Set of capabilities the model must support 

24 extra_params: Additional provider-specific parameters 

25 """ 

26 

27 prompt: str 

28 model_id: str | None = None 

29 temperature: float | None = None 

30 max_tokens: int | None = None 

31 top_p: float | None = None 

32 top_k: int | None = None 

33 required_capabilities: set[ModelCapability] | None = None 

34 extra_params: dict[str, Any] = field(default_factory=dict) 

35 

36 

37@dataclass(frozen=True) 

38class ModelResponse: 

39 """Response from an LLM model. 

40 

41 Attributes: 

42 content: The generated content (text) 

43 tokens_used: Total tokens consumed (input + output) 

44 stop_reason: Why generation stopped (completion, length, stop_sequence, etc.) 

45 extra_metadata: Additional response metadata 

46 """ 

47 

48 content: str 

49 tokens_used: int = 0 

50 stop_reason: str | None = None 

51 extra_metadata: dict[str, Any] = field(default_factory=dict) 

52 

53 

54__all__ = ["ModelRequest", "ModelResponse"]