from typing import Dict, List, Optional from pydantic import BaseModel, Field class RunRequest(BaseModel): tool: str = Field(..., description="工具名称,对应 config.yaml 的 tools key") args: List[str] = Field(default_factory=list, description="传给可执行文件的参数") workdir: Optional[str] = Field(None, description="工作目录,默认使用 config.base_workdir") timeout: Optional[int] = Field(None, description="超时时间秒,默认取 config.run_defaults") env: Optional[Dict[str, str]] = Field(None, description="额外环境变量") capture_output: Optional[bool] = Field(None, description="是否捕获 stdout/stderr") strip_output: Optional[bool] = Field(None, description="是否 strip 输出换行/空白") class RunResult(BaseModel): success: bool return_code: Optional[int] = None stdout: Optional[str] = None stderr: Optional[str] = None elapsed: Optional[float] = None tool_path: Optional[str] = None workdir: Optional[str] = None output_path: Optional[str] = None # 若生成文件,返回落盘路径(由调用方基于共享卷读取)