56 lines
1.4 KiB
Python
56 lines
1.4 KiB
Python
"""Persistent assistant conversation contracts."""
|
|
|
|
from datetime import datetime
|
|
from typing import Literal
|
|
|
|
from pydantic import Field
|
|
|
|
from app.domain.risk_engine import RiskLevel
|
|
from app.schemas.common import ApiSchema
|
|
from app.schemas.risk_prediction import RiskAssessmentResult
|
|
|
|
|
|
class ConversationCreateRequest(ApiSchema):
|
|
title: str | None = Field(default=None, max_length=120)
|
|
|
|
|
|
class ConversationMessageCreateRequest(ApiSchema):
|
|
content: str = Field(min_length=1, max_length=2000)
|
|
message_type: Literal["text", "image", "file", "audio"] = "text"
|
|
|
|
|
|
class ConversationListQuery(ApiSchema):
|
|
limit: int = Field(default=50, ge=1, le=100)
|
|
|
|
|
|
class ConversationMessageData(ApiSchema):
|
|
id: int
|
|
role: str
|
|
message_type: Literal["text", "image", "file", "audio"] = "text"
|
|
content: str
|
|
risk_result: RiskAssessmentResult | None = None
|
|
response_card: dict | None = None
|
|
semantic: dict | None = None
|
|
created_at: datetime
|
|
|
|
|
|
class ConversationStreamEvent(ApiSchema):
|
|
type: Literal["start", "semantic", "delta", "done", "error"]
|
|
content: str | None = None
|
|
data: dict | None = None
|
|
|
|
|
|
class ConversationSummary(ApiSchema):
|
|
id: int
|
|
title: str
|
|
message_count: int
|
|
last_risk_level: RiskLevel | None = None
|
|
updated_at: datetime
|
|
|
|
|
|
class ConversationData(ConversationSummary):
|
|
messages: list[ConversationMessageData]
|
|
messages_total: int = 0
|
|
messages_offset: int = 0
|
|
has_more_messages: bool = False
|