segments.py 1.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748
  1. from typing import Any
  2. from pydantic import BaseModel, ConfigDict, field_validator
  3. from .types import SegmentType
  4. class Segment(BaseModel):
  5. model_config = ConfigDict(frozen=True)
  6. value_type: SegmentType
  7. value: Any
  8. @field_validator('value_type')
  9. def validate_value_type(cls, value):
  10. """
  11. This validator checks if the provided value is equal to the default value of the 'value_type' field.
  12. If the value is different, a ValueError is raised.
  13. """
  14. if value != cls.model_fields['value_type'].default:
  15. raise ValueError("Cannot modify 'value_type'")
  16. return value
  17. @property
  18. def text(self) -> str:
  19. return str(self.value)
  20. @property
  21. def log(self) -> str:
  22. return str(self.value)
  23. @property
  24. def markdown(self) -> str:
  25. return str(self.value)
  26. def to_object(self) -> Any:
  27. if isinstance(self.value, Segment):
  28. return self.value.to_object()
  29. if isinstance(self.value, list):
  30. return [v.to_object() for v in self.value]
  31. if isinstance(self.value, dict):
  32. return {k: v.to_object() for k, v in self.value.items()}
  33. return self.value
  34. class StringSegment(Segment):
  35. value_type: SegmentType = SegmentType.STRING
  36. value: str