from __future__ import annotations from typing import Any, Literal from pydantic import BaseModel, Field class MessagePart(BaseModel): type: str text: str | None = None data: dict[str, Any] | None = None class ChatMessage(BaseModel): id: str role: Literal["user", "assistant"] parts: list[MessagePart] class ChatRequest(BaseModel): conversation_id: str | None = None selected_task_id: str | None = None messages: list[ChatMessage] = Field(default_factory=list) provider_id: str | None = None model_id: str | None = None viewer_context: list[dict[str, Any]] = Field(default_factory=list) class ConversationPatch(BaseModel): current_task_id: str | None = None attachments: list[dict[str, Any]] | None = None class ParameterUpdate(BaseModel): values: dict[str, float] = Field(default_factory=dict) class ModifyRequest(BaseModel): operation: str selection: dict[str, Any] = Field(default_factory=dict) parameters: dict[str, Any] = Field(default_factory=dict) class TaskArtifact(BaseModel): path: str role: str kind: str class CadResult(BaseModel): task_id: str revision_id: str cdsl_path: str step_path: str glb_path: str report_path: str parameters_path: str | None = None selector_path: str | None = None edges_path: str | None = None summary: str reference_ids: list[str] = Field(default_factory=list) engine: str = "cdsl_only"