Coverage for src/lexigram/ai/types.py: 100%
26 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"""Shared type definitions for Lexigram AI.
3This module contains type definitions that are used across multiple
4sub-modules in intelligence package.
5"""
7from __future__ import annotations
9from collections.abc import Callable
10from dataclasses import dataclass
11from datetime import UTC, datetime
12from typing import Any, TypeVar
14from lexigram.contracts.ai.types import EmbeddingModel, ModelProvider, VectorProvider
15from lexigram.contracts.core import JSON, Metadata
16from lexigram.domain import DomainModel
17from lexigram.validation import ConfigDict, Field
19# Note: model_serializer not yet implemented in lexigram.contracts
20# Using a stub for now
21DecoratedMethod = TypeVar("DecoratedMethod", bound=Callable[..., Any])
24def model_serializer(mode: Any) -> Callable[[DecoratedMethod], DecoratedMethod]:
25 def decorator(func: DecoratedMethod) -> DecoratedMethod:
26 return func
28 return decorator
31@dataclass(init=False)
32class AIBaseEvent(DomainModel):
33 """Base class for AI intelligence domain events."""
35 timestamp: datetime = Field(default_factory=lambda: datetime.now(UTC))
36 metadata: Metadata = Field(default_factory=dict)
38 model_config = ConfigDict(arbitrary_types_allowed=True)
40 @model_serializer(mode="wrap")
41 def serialize_model(self, handler: Callable[..., Any]) -> Any:
42 """Custom serializer to handle datetime objects."""
43 data = handler(self)
44 # Convert datetime objects to ISO format strings
45 if isinstance(data.get("timestamp"), datetime):
46 data["timestamp"] = data["timestamp"].isoformat()
47 return data
50__all__ = [
51 "JSON",
52 "AIBaseEvent",
53 "EmbeddingModel",
54 "Metadata",
55 "ModelProvider",
56 "VectorProvider",
57]