# aibox 文件操作与网络操作命令行化 开发计划 ## 目标 将 aibox 中所有 Python 原生实现的文件操作和网络操作改为通过系统命令行工具实现,统一工具执行模式,减少 Python 依赖。 ## 涉及模块 | 现有类 | 作用 | 替换方案 | |--------|------|----------| | `FileToolBase` | 文件工具基类 | 简化为命令行工具基类 | | `ReadFileTool` | 读文件 | `cat` / `head` / `tail` / `wc` | | `WriteFileTool` | 写文件 | `mkdir -p` + shell 重定向 | | `ListFilesTool` | 列目录 | `ls` / `find` / `du` | | `SimpleWebClient` | HTTP 客户端 | `curl` | | `WebPage` | 网页解析对象 | 移除,curl + grep/sed 替代 | | `SimpleWebCrawlerTool` | 网页爬虫工具 | `curl` + 文本处理管道 | ## 阶段一:文件操作命令行化 > **实现说明(已落地)**:阶段一采用「工具返回 markdown 提示词」的方式而非工具内部调子进程。`read_file` / `write_file` / `list_files` 三个工具的 `execute()` 不再执行 Python 文件 I/O,而是返回一段 markdown 提示词,指导智能体改用 `run_command` 工具执行对应的命令行命令(`head`/`tail`/`sed`/`wc`/`file`/`cut`/`cat`/`ls`/`du`/`find`)。工具接口(名称与参数)保持不变,安全限制(500 行、10KB/行、10MB 文件、路径 `shlex.quote` 转义)在提示词中注明。 ### 1.1 ReadFileTool 重构 用以下命令行工具替代 Python 文件 I/O: | 原功能 | 命令行实现 | |--------|-----------| | `head=True` 读取开头 N 行 | `head -n N` | | `tail=True` 读取末尾 N 行 | `tail -n N` | | 指定行范围 `start_line ~ end_line` | `sed -n 'start,endp'` | | 统计行数 `_count_lines` | `wc -l` | | 文件编码检测 | `file -b --mime-encoding` | | 单行超长截断 | `cut -c 1-10000` | 保留的安全限制: - 文件大小限制 `MAX_FILE_SIZE`:通过 `wc -c` 或 `stat -f%z` 检查 - 行数上限 500 行:`head -n 500` 作为最后一道防线 - 单行 10KB 限制:`cut -c 1-10000` ### 1.2 WriteFileTool 重构 | 原功能 | 命令行实现 | |--------|-----------| | 创建目录 | `mkdir -p` | | 覆盖写入 `mode=w` | `content > filepath` | | 追加写入 `mode=a` | `content >> filepath` | | 检查文件大小 | `wc -c` 或 `stat -f%z` | | 路径安全检查 | `realpath` / `test -f` | ### 1.3 ListFilesTool 重构 | 原功能 | 命令行实现 | |--------|-----------| | 列出目录内容 | `ls -la` 或 `find . -maxdepth 1` | | 隐藏文件过滤 | `ls -la` 默认不显示 `.` 开头的隐藏文件(或 `find` 排除) | | 文件大小统计 | `du -sh *` 或 `ls -lh` | | 目录/文件区分 | `ls -F` 或 `find -type f/d` | ### 1.4 FileToolBase 简化 移除 `normalize_path()`、`check_path_safety()` 中 Python `os` 模块调用,改为: - 路径规范化:`realpath` - 文件存在性检查:`test -f` / `test -d` - 文件大小检查:`wc -c` 或 `stat` ### 1.5 安全边界保留 - `MAX_FILE_SIZE`(默认 10MB):通过命令检查 - 行数上限 500 行:`head -n 500` 兜底 - 单行长度上限 10KB:`cut -c 1-10000` 兜底 - 所有路径参数 `shlex.quote()` 转义 ## 阶段二:网络操作命令行化 > **实现说明(已落地)**:阶段二沿用阶段一的方式,`web` 工具(`SimpleWebCrawlerTool`)的 `execute()` 不再使用 `requests`/`BeautifulSoup`,而是返回 markdown 提示词,指导智能体改用 `run_command` 执行 `curl` 命令完成各 action(`get`/`text`/`title`/`links`/`search`)。`WebPage`、`SimpleWebClient` 类已删除;`urljoin`/`urlparse`/`BeautifulSoup` 导入已清理。代理通过 `get_proxy()` 读取配置并拼出 `--socks5` 参数。注意 `requests` 仍在 `aibox.py` 其他位置(API 调用、DeepSeek 请求)使用,故保留其依赖。 ### 2.1 SimpleWebClient → curl | 原功能 | 命令行实现 | |--------|-----------| | HTTP GET 请求 | `curl -sL --max-time N` | | 自定义 User-Agent | `curl -A "..."` | | SOCKS5 代理 | `curl --socks5 host:port` 或环境变量 `ALL_PROXY` | | 请求间隔控制 | `SubprocessCommandExecutor` 层面控制 | | 响应状态码 | `curl -sL -o /dev/null -w '%{http_code}'` | | 下载大小限制 | `curl --max-filesize N` 或管道 `head -c N` | ### 2.2 WebPage 移除 `WebPage` 类不再需要,其功能由命令行管道实现: | 原属性/方法 | 命令行实现 | |------------|-----------| | `title` | `curl -sL | grep -oP '