|
|
from typing import Literal |
|
|
|
|
|
from pydantic import BaseModel, Field, field_serializer, field_validator |
|
|
|
|
|
|
|
|
class Source(BaseModel): |
|
|
id: str | None = Field(default=None, description="The id of the source component.") |
|
|
display_name: str | None = Field(default=None, description="The display name of the source component.") |
|
|
source: str | None = Field( |
|
|
default=None, |
|
|
description="The source of the message. Normally used to display the model name (e.g. 'gpt-4o')", |
|
|
) |
|
|
|
|
|
|
|
|
class Properties(BaseModel): |
|
|
text_color: str | None = None |
|
|
background_color: str | None = None |
|
|
edited: bool = False |
|
|
source: Source = Field(default_factory=Source) |
|
|
icon: str | None = None |
|
|
allow_markdown: bool = False |
|
|
state: Literal["partial", "complete"] = "complete" |
|
|
targets: list = [] |
|
|
|
|
|
@field_validator("source", mode="before") |
|
|
@classmethod |
|
|
def validate_source(cls, v): |
|
|
if isinstance(v, str): |
|
|
return Source(id=v, display_name=v, source=v) |
|
|
return v |
|
|
|
|
|
@field_serializer("source") |
|
|
def serialize_source(self, value): |
|
|
if isinstance(value, Source): |
|
|
return value.model_dump() |
|
|
return value |
|
|
|