from __future__ import annotations from typing import Any, Literal from pydantic import BaseModel, Field from app.schemas.debug import RoutingDebug from app.schemas.workflow import Workflow class ChatRequest(BaseModel): session_id: str user_id: str channel: str = "app" input_text: str input_type: Literal["text", "voice"] = "text" metadata: dict[str, Any] = Field(default_factory=dict) class FillSlotsRequest(BaseModel): session_id: str user_id: str input_text: str class ChatResponse(BaseModel): session_id: str reply_type: Literal["text", "ask_slot", "ask_confirmation", "workflow_result", "fallback", "clarify", "reject"] = "text" reply_text: str intent: str | None = None domain: str | None = None decision: str | None = None decision_reason: str | None = None status: str pending_slots: list[str] = Field(default_factory=list) filled_slots: dict[str, Any] = Field(default_factory=dict) workflow: Workflow | None = None routing_debug: RoutingDebug | None = None first_response_latency_ms: float | None = None total_latency_ms: float | None = None processing_breakdown: dict[str, float] = Field(default_factory=dict) trace_id: str # ── 知识库查询结果(LLM function call 命中时填充)────────────────────────── knowledge_doc_id: str | None = None # 知识文档 ID(MD 文件名) knowledge_doc_title: str | None = None # 知识文档标题 knowledge_content: str | None = None # 完整 MD 正文,供前端渲染知识卡片