"""
工具响应模型
定义所有 MCP 工具的标准化返回类型,支持 outputSchema 自动生成。
"""
from pydantic import BaseModel, Field
from typing import Optional, List, Dict, Any, Union
from datetime import datetime
from pathlib import Path
class BaseToolResponse(BaseModel):
"""工具响应基类"""
success: bool = Field(description="操作是否成功")
timestamp: datetime = Field(default_factory=datetime.now, description="操作时间")
class Config:
json_encoders = {
datetime: lambda v: v.isoformat()
}
# ================== 计算器工具响应模型 ==================
class CalculationResult(BaseToolResponse):
"""计算结果模型"""
result: float = Field(description="计算结果")
expression: Optional[str] = Field(None, description="计算表达式")
operation: str = Field(description="操作类型")
class BMIResult(BaseToolResponse):
"""BMI计算结果"""
bmi: float = Field(description="BMI值", ge=0)
category: str = Field(description="BMI分类")
weight_kg: float = Field(description="体重(千克)", gt=0)
height_m: float = Field(description="身高(米)", gt=0)
class StatisticsResult(BaseToolResponse):
"""统计计算结果"""
average: float = Field(description="平均值")
count: int = Field(description="数据点数量", ge=0)
sum: float = Field(description="总和")
minimum: Optional[float] = Field(None, description="最小值")
maximum: Optional[float] = Field(None, description="最大值")
# ================== 文本处理工具响应模型 ==================
class TextAnalysisResult(BaseToolResponse):
"""文本分析结果"""
words: int = Field(description="单词数", ge=0)
characters: int = Field(description="字符数", ge=0)
characters_no_spaces: int = Field(description="不含空格的字符数", ge=0)
lines: int = Field(description="行数", ge=1)
class CaseConversionResult(BaseToolResponse):
"""文本大小写转换结果"""
original: str = Field(description="原始文本")
converted: str = Field(description="转换后的文本")
case_type: str = Field(description="转换类型")
class ExtractionResult(BaseToolResponse):
"""文本提取结果"""
matches: List[str] = Field(description="匹配的内容列表")
count: int = Field(description="匹配数量", ge=0)
pattern: str = Field(description="使用的模式")
# ================== 文件操作工具响应模型 ==================
class FileOperationResult(BaseToolResponse):
"""文件操作结果"""
message: str = Field(description="操作结果描述")
file_path: str = Field(description="文件路径")
size_bytes: Optional[int] = Field(None, description="文件大小(字节)")
operation: str = Field(description="执行的操作类型")
class FileInfoResult(BaseToolResponse):
"""文件信息结果"""
path: str = Field(description="文件路径")
name: str = Field(description="文件名")
type: str = Field(description="类型(file/directory)")
size_bytes: int = Field(description="文件大小(字节)", ge=0)
created: float = Field(description="创建时间戳")
modified: float = Field(description="修改时间戳")
exists: bool = Field(description="文件是否存在")
class DirectoryResult(BaseToolResponse):
"""目录操作结果"""
path: str = Field(description="目录路径")
files: List[str] = Field(description="文件列表")
directories: List[str] = Field(description="子目录列表")
total_files: int = Field(description="文件总数", ge=0)
total_directories: int = Field(description="目录总数", ge=0)
# ================== 系统信息工具响应模型 ==================
class SystemInfoResult(BaseToolResponse):
"""系统信息结果"""
cpu_usage: float = Field(description="CPU使用率(百分比)", ge=0, le=100)
memory_usage: float = Field(description="内存使用率(百分比)", ge=0, le=100)
disk_usage: float = Field(description="磁盘使用率(百分比)", ge=0, le=100)
platform: str = Field(description="操作系统平台")
python_version: str = Field(description="Python版本")
# ================== 通用工具响应模型 ==================
class SimpleResult(BaseToolResponse):
"""简单结果模型,用于基础操作"""
result: Union[str, int, float, bool] = Field(description="操作结果")
details: Optional[str] = Field(None, description="详细信息")
class ErrorResult(BaseToolResponse):
"""错误结果模型"""
success: bool = Field(default=False, description="操作失败")
error_type: str = Field(description="错误类型")
error_message: str = Field(description="错误信息")
error_code: Optional[str] = Field(None, description="错误代码")
# ================== 类型导出 ==================
__all__ = [
# 基础类型
"BaseToolResponse",
# 计算器类型
"CalculationResult",
"BMIResult",
"StatisticsResult",
# 文本处理类型
"TextAnalysisResult",
"CaseConversionResult",
"ExtractionResult",
# 文件操作类型
"FileOperationResult",
"FileInfoResult",
"DirectoryResult",
# 系统信息类型
"SystemInfoResult",
# 通用类型
"SimpleResult",
"ErrorResult",
]