from fastapi import Query from pydantic import BaseModel, ConfigDict, Field, HttpUrl from app.common.enums import McpLLMProvider, McpType, QueueEnum from app.core.base_schema import BaseSchema, UserBySchema from app.core.validator import DateTimeStr class ChatQuerySchema(BaseModel): """聊天查询模型""" message: str = Field(..., min_length=1, max_length=4000, description="聊天消息") class McpCreateSchema(BaseModel): """创建 MCP 服务器参数""" name: str = Field(..., max_length=64, description="MCP 名称") type: McpType = Field(McpType.stdio, description="MCP 类型") description: str | None = Field(None, max_length=255, description="MCP 描述") url: HttpUrl | None = Field(None, description="远程 SSE 地址") command: str | None = Field(None, max_length=255, description="MCP 命令") args: str | None = Field(None, max_length=255, description="MCP 命令参数") env: dict[str, str] | None = Field(None, description="MCP 环境变量") class McpUpdateSchema(McpCreateSchema): """更新 MCP 服务器参数""" class McpOutSchema(McpCreateSchema, BaseSchema, UserBySchema): """MCP 服务器详情""" model_config = ConfigDict(from_attributes=True) class McpQueryParam: """MCP 服务器查询参数""" def __init__( self, name: str | None = Query(None, description="MCP 名称"), type: McpType | None = Query(None, description="MCP 类型"), created_time: list[DateTimeStr] | None = Query( None, description="创建时间范围", examples=["2025-01-01 00:00:00", "2025-12-31 23:59:59"], ), updated_time: list[DateTimeStr] | None = Query( None, description="更新时间范围", examples=["2025-01-01 00:00:00", "2025-12-31 23:59:59"], ), created_id: int | None = Query(None, description="创建人"), updated_id: int | None = Query(None, description="更新人"), ) -> None: # 模糊查询字段 self.name = (QueueEnum.like.value, name) # 精确查询字段 self.type = (QueueEnum.eq.value, type) self.created_id = (QueueEnum.eq.value, created_id) self.updated_id = (QueueEnum.eq.value, updated_id) # 时间范围查询 if created_time and len(created_time) == 2: self.created_time = (QueueEnum.between.value, (created_time[0], created_time[1])) if updated_time and len(updated_time) == 2: self.updated_time = (QueueEnum.between.value, (updated_time[0], updated_time[1])) class McpChatParam(BaseSchema): """MCP 聊天参数""" pk: list[int] = Field(..., description="MCP ID 列表") provider: McpLLMProvider = Field(McpLLMProvider.openai, description="LLM 供应商") model: str = Field(..., description="LLM 名称") key: str = Field(..., description="LLM API Key") base_url: str | None = Field(None, description="自定义 LLM API 地址,必须兼容 openai 供应商") prompt: str = Field(..., description="用户提示词")