| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170 | import jsonimport sysfrom collections.abc import Mapping, Sequencefrom typing import Anyfrom pydantic import BaseModel, ConfigDict, field_validatorfrom core.file import Filefrom .types import SegmentTypeclass Segment(BaseModel):    model_config = ConfigDict(frozen=True)    value_type: SegmentType    value: Any    @field_validator("value_type")    @classmethod    def validate_value_type(cls, value):        """        This validator checks if the provided value is equal to the default value of the 'value_type' field.        If the value is different, a ValueError is raised.        """        if value != cls.model_fields["value_type"].default:            raise ValueError("Cannot modify 'value_type'")        return value    @property    def text(self) -> str:        return str(self.value)    @property    def log(self) -> str:        return str(self.value)    @property    def markdown(self) -> str:        return str(self.value)    @property    def size(self) -> int:        """        Return the size of the value in bytes.        """        return sys.getsizeof(self.value)    def to_object(self) -> Any:        return self.valueclass NoneSegment(Segment):    value_type: SegmentType = SegmentType.NONE    value: None = None    @property    def text(self) -> str:        return ""    @property    def log(self) -> str:        return ""    @property    def markdown(self) -> str:        return ""class StringSegment(Segment):    value_type: SegmentType = SegmentType.STRING    value: strclass FloatSegment(Segment):    value_type: SegmentType = SegmentType.NUMBER    value: floatclass IntegerSegment(Segment):    value_type: SegmentType = SegmentType.NUMBER    value: intclass ObjectSegment(Segment):    value_type: SegmentType = SegmentType.OBJECT    value: Mapping[str, Any]    @property    def text(self) -> str:        return json.dumps(self.model_dump()["value"], ensure_ascii=False)    @property    def log(self) -> str:        return json.dumps(self.model_dump()["value"], ensure_ascii=False, indent=2)    @property    def markdown(self) -> str:        return json.dumps(self.model_dump()["value"], ensure_ascii=False, indent=2)class ArraySegment(Segment):    @property    def markdown(self) -> str:        items = []        for item in self.value:            items.append(str(item))        return "\n".join(items)class FileSegment(Segment):    value_type: SegmentType = SegmentType.FILE    value: File    @property    def markdown(self) -> str:        return self.value.markdown    @property    def log(self) -> str:        return ""    @property    def text(self) -> str:        return ""class ArrayAnySegment(ArraySegment):    value_type: SegmentType = SegmentType.ARRAY_ANY    value: Sequence[Any]class ArrayStringSegment(ArraySegment):    value_type: SegmentType = SegmentType.ARRAY_STRING    value: Sequence[str]    @property    def text(self) -> str:        return json.dumps(self.value, ensure_ascii=False)class ArrayNumberSegment(ArraySegment):    value_type: SegmentType = SegmentType.ARRAY_NUMBER    value: Sequence[float | int]class ArrayObjectSegment(ArraySegment):    value_type: SegmentType = SegmentType.ARRAY_OBJECT    value: Sequence[Mapping[str, Any]]class ArrayFileSegment(ArraySegment):    value_type: SegmentType = SegmentType.ARRAY_FILE    value: Sequence[File]    @property    def markdown(self) -> str:        items = []        for item in self.value:            items.append(item.markdown)        return "\n".join(items)    @property    def log(self) -> str:        return ""    @property    def text(self) -> str:        return ""
 |