61 lines
1.6 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 DirectQueryRequest(ApiSchema):
kind: Literal["supplier", "material", "cases", "solution"]
query: str = Field(min_length=1, max_length=2000)
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