from typing import Any from pydantic import BaseModel, Field class AIContentBlock(BaseModel): type: str text: str | None = None thinking: str | None = None signature: str | None = None metadata: dict[str, Any] = Field(default_factory=dict) class SituationalAnalysisRequest(BaseModel): title: str = Field(..., min_length=1, max_length=200) objective: str = Field(..., min_length=1, max_length=20000) context: dict[str, Any] = Field(default_factory=dict) observations: list[str] = Field(default_factory=list) constraints: list[str] = Field(default_factory=list) system_prompt: str | None = Field(default=None, max_length=8000) preferred_model: str | None = Field(default=None, max_length=200) thinking: dict[str, Any] | None = None class SituationalAnalysisResponse(BaseModel): provider: str model: str content: str content_blocks: list[AIContentBlock] = Field(default_factory=list) text_blocks: list[str] = Field(default_factory=list) thinking_blocks: list[str] = Field(default_factory=list) raw_response: dict[str, Any] = Field(default_factory=dict) class AIProviderStatusResponse(BaseModel): provider: str api: str | None = None enabled: bool configured: bool model: str | None = None base_url: str | None = None