| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169 | 
							- import json
 - import sys
 - from collections.abc import Mapping, Sequence
 - from typing import Any
 - 
 - from pydantic import BaseModel, ConfigDict, field_validator
 - 
 - from core.file import File
 - 
 - from .types import SegmentType
 - 
 - 
 - class 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.value
 - 
 - 
 - class 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: str
 - 
 - 
 - class FloatSegment(Segment):
 -     value_type: SegmentType = SegmentType.NUMBER
 -     value: float
 - 
 - 
 - class IntegerSegment(Segment):
 -     value_type: SegmentType = SegmentType.NUMBER
 -     value: int
 - 
 - 
 - class 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)
 - 
 - 
 - 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 ""
 
 
  |