AI 驱动的命令行工具开发与智能 Agent 构建:先收紧输入、状态与退出边界
AI 驱动的命令行工具开发与智能 Agent 构建:先收紧输入、状态与退出边界
我刚开始做 Rust 命令行工具时,总想把检索、规划、自动执行都塞进第一版。后来发现,连一条报错能不能被稳定解释清楚都还没验证,功能越多越难查问题。
我现在给第一版留一个小闭环:用户主动粘贴一段已经脱敏的编译错误;工具只把这段文本和固定问题模板交给模型;模型只返回建议的下一步和原因;最后由人确认是否执行本地命令。它不读取整个仓库,不自动修改文件,也不把日志上传到模型以外的地方。
graph LR Input[脱敏后的错误片段] --> Prompt[固定问题模板] Prompt --> Model[模型返回建议] Model --> Review[人工核对] Review -->|确认| Command[执行白名单命令] Review -->|拒绝| Stop[结束]一个先能跑通的边界
下面的例子没有接模型,而是把“建议”和“执行”分开。这样我可以先验证输入校验和命令白名单,再决定是否接入外部服务。
use anyhow::{bail, Result}; struct Suggestion { command: &'static str, reason: &'static str, } fn suggest_next_step(error: &str) -> Result<Suggestion> { if error.trim().is_empty() { bail!("请提供已脱敏的错误片段"); } Ok(Suggestion { command: "cargo check --tests", reason: "先确认测试目标能否通过类型检查", }) } fn main() -> Result<()> { let suggestion = suggest_next_step("error[E0308]: mismatched types")?; println!("建议:{}\n原因:{}", suggestion.command, suggestion.reason); // 真正执行前仍应显示命令,并等待用户确认。 Ok(()) }我会先检查什么
- 输入只保留复现问题需要的几行,删除路径、账号、令牌和业务数据。
- 模型输出只能是结构化建议,不能直接获得 shell、文件或网络权限。
- 人工会在本地复现并阅读 diff;模型说得通,不等于代码就是对的。
- 如果问题需要完整上下文、涉及敏感项目,或者无法脱敏,我宁愿不用 AI,先用
cargo check、文档和最小复现排查。
第一版能把边界守住就够了。后面的能力要等到这条链路有测试、有失败记录以后再加。