7 月 AI CLI 工具开发总结:从 idea 到可用的 31 天全记录与关键决策
7 月 AI CLI 工具开发总结从 idea 到可用的 31 天全记录与关键决策一、31 天路线图从混乱到有序的结构化复盘7 月 1 号我打开 cargo new 的时候脑子里只有一句话我要一个能在终端里直接问 AI 的东西。31 天后这个工具变成了 5 个 crate 组成的 workspace支持 OpenAI/Claude/本地模型三种后端、流式输出、会话管理和插件系统。回过头看这 31 天可以切成四个阶段第一阶段混乱但必须。我不知道自己到底需要什么功能只知道能跑就行。前三天的代码全部塞在一个main.rs里——HTTP 请求、JSON 解析、参数处理什么都往里面扔。事后复盘这段混乱期不是浪费它让我在实践中明确了需求边界。第二阶段是我第一次感受到 Rust 编程的设计感。我提取了AiProvidertrait让 OpenAI、Claude 和 Ollama 三种后端实现了同一个接口。这个决策让后续换模型变得极其简单——只需改一行配置不用碰业务代码。第三阶段是最痛苦的工程化重构。我把单 crate 拆成 workspaceai-core抽象层、ai-providers后端适配器、ai-config配置管理、ai-cli入口。编译时间从 20 秒降到 3 秒改一行配置不再重编译整个项目。第四阶段开始做真正有用的东西——让 AI CLI 不只是聊天还能执行技能。查 git log、生成 commit message、扫描代码漏洞这些技能通过插件系统注册每个技能都是独立的实现。二、5 个关键决策如果重来我还会这么选这 31 天里做的决定不下 50 个但事后证明最关键的是这 5 个决策 1 最重要。我曾被要不要加流式输出要不要做配置文件 GUI要不要支持 prompt 模板这些想法反复拉扯。最后给自己立了一个铁则只有当前闭环能正常工作时才往上面加东西。这个自我约束救了我——否则 31 天后我会得到一个功能很多但一个都不能稳定运行的东西。决策 2 是我在 Rust 里学到的最有用的设计模式。AiProvidertrait 的样子很简单但它的威力在于任何实现了这个 trait 的结构体都能无缝接入整个管道。这不是为了设计模式大全而是为了让我在下个月想加 Gemini 或 DeepSeek 时不改一行已有代码。// // ai-core/src/provider.rs — 统一 AI 后端抽象 // use async_trait::async_trait; /// AI 提供者的统一接口 /// 新增任何 AI 后端OpenAI/Claude/Ollama/Gemini 等 /// 只需实现这个 trait上层业务代码完全不用动 #[async_trait] pub trait AiProvider: Send Sync { /// 发送单条消息获得完整回复 async fn chat(self, message: str) - ResultString, ProviderError; /// 流式对话逐 token 回调用于打字机效果和实时展示 async fn chat_stream( self, message: str, on_token: (dyn Fn(String) Send Sync), ) - Result(), ProviderError; /// 获取当前 provider 的标识名用于日志和错误追踪 fn name(self) - str; } /// AI 调用层的统一错误把各种后端返回的错误都收敛到这里 #[derive(Debug, thiserror::Error)] pub enum ProviderError { #[error(网络连接失败: {0})] Network(#[from] reqwest::Error), #[error(API 返回异常: 状态码{status}, 消息{message})] Api { status: u16, message: String }, #[error(配置缺失: {0})] Config(String), #[error(请求超时{}ms, threshold_ms)] Timeout { threshold_ms: u64 }, }决策 3 是被逼出来的。某天下午改了一行配置代码等了 20 秒编译——对于一个只有 2000 行的项目来说20 秒完全不可接受。当天晚上我就拆了 workspace增量编译降到 2 秒。这个决策没有任何设计美感的考量纯粹是被效率逼出来的。决策 4 和 5 都是吃过亏才学会的。一开始我用Boxdyn Error到处返回错误三天后就不知道一个错误到底来自网络还是 api 还是配置。改成thiserror的 enum 后错误追踪一下子清晰了。技能系统用 trait 而不是宏是因为我需要编译期的类型检查——宏虽然更灵活但在技能数量和复杂度上来后类型安全比灵活性重要。三、那些做错的决策和回头看的原因不是所有决策都对。以下是三个明显的误判第一个是过早优化流式输出。第三天我就花了一整天写 SSE 解析结果第四天发现基础的单次对话还不稳定。正确的顺序应该是先让核心路径稳定再做体验优化。第二个是配置系统做太复杂。我一开始写了 YAML TOML 环境变量三层合并逻辑还支持--config指定路径。两周后发现实际上我只用了环境变量和 TO TOMLYAML 支持从未被使用。做减法比做加法更需要勇气。第三个是插件系统延迟到第四周才动手。如果第二周就开始设计插件接口后面就不用为怎么把 git log 的功能塞进去改 12 个文件。好的接口设计越早确定越好因为它决定了后续所有代码的组织方式。四、工具还缺什么下个月的路线图这 31 天里写的测试覆盖率只有 32%——这是一个让我睡不着的数字。Provider 层的单元测试还好但集成测试模拟 HTTP 超时、返回格式变化、流式中断几乎为零。下个月第一优先级就是把覆盖率推到 80%。第二个缺的是 session 持久化。现在的会话管理存在内存里关掉终端就没了。下个月打算用 SQLite rusqlite做一个轻量的会话存储保留历史对话和上下文。第三个是错误恢复。目前遇到网络错误就直接退出了体验很差。应该自动重试 3 次失败后保存未发送的消息用户下次启动时可以恢复。五、总结31 天把一个 idea 变成一个能用的 AI CLI 工具对一个来说最大的收获不是这个工具本身而是学到了怎么在混乱中建立秩序。三条月度感悟先做小闭环再做广度。让一个功能稳定工作比三个功能勉强能跑更有价值。trait 抽象是 Rust 项目的脊柱。做对了 trait 设计后续扩展是加法做错了后续重构是乘法。编译速度不是虚指标。2 秒和 20 秒的区别是你能不能保持心流的关键差异。下个月不打算加新功能了——先把测试补全然后真正用这个工具一个月让实际使用中的痛点告诉我下一步该做什么。

相关新闻

AI音乐生成技术:从旋律解析到专业作曲实战

AI音乐生成技术:从旋律解析到专业作曲实战

1. 音乐旋律的本质解析旋律作为音乐的核心元素,本质上是一系列具有特定音高和节奏的音符序列。从物理层面看,每个音符对应着不同频率的声波振动——中央C的频率是261.63Hz,而高八度的C音则翻倍为523.25Hz。这些声波通过空气传播到人耳时&…

2026/10/17 6:56:48 阅读更多 →
Wand-Enhancer:本地化WeMod客户端增强方案的技术实现与应用

Wand-Enhancer:本地化WeMod客户端增强方案的技术实现与应用

Wand-Enhancer:本地化WeMod客户端增强方案的技术实现与应用 【免费下载链接】Wand-Enhancer Advanced UX and interoperability extension for Wand (WeMod) app 项目地址: https://gitcode.com/GitHub_Trending/we/Wand-Enhancer Wand-Enhancer是一个开源工…

2026/10/17 6:57:51 阅读更多 →
BOOM框架:离线策略强化学习中的世界模型应用

BOOM框架:离线策略强化学习中的世界模型应用

1. BOOM框架:基于世界模型的离线策略引导强化学习新范式在强化学习领域,基于模型的强化学习(MBRL)一直面临着在线规划与离线策略学习难以协同的挑战。想象一下,当你试图通过模拟预测来规划最佳行动路径时,却…

2026/10/17 6:57:52 阅读更多 →

最新新闻

贴片式组合导航模块:智能汽车高精度定位的量产新范式

贴片式组合导航模块:智能汽车高精度定位的量产新范式

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/18 1:21:43 阅读更多 →
campus-imaotai 完整部署指南:搭建 i茅台每日自动预约环境

campus-imaotai 完整部署指南:搭建 i茅台每日自动预约环境

campus-imaotai 完整部署指南:搭建 i茅台每日自动预约环境 【免费下载链接】campus-imaotai i茅台app自动预约,每日自动预约,支持docker一键部署(本项目不提供成品,使用的是已淘汰的算法) 项目地址: http…

2026/10/18 1:21:43 阅读更多 →
GLM-4.7-W8A8C8入门指南:ModelScope三种下载方式与本地推理配置清单

GLM-4.7-W8A8C8入门指南:ModelScope三种下载方式与本地推理配置清单

【免费下载链接】GLM-4.7-W8A8C8 项目地址: https://ai.gitcode.com/hf_mirrors/vllm-ascend/GLM-4.7-W8A8C8 点击查看 免费下载 GLM-4.7-W8A8C8 是一款面向 vLLM 与昇腾 NPU 优化的 GLM-4.7 MoE 大模型 W8A8 量化版本,支持最长约 20 万 token 上下文。…

2026/10/18 1:21:43 阅读更多 →
数学建模竞赛四大模型知识地图:预测、分类、优化、评价的选型与避坑指南

数学建模竞赛四大模型知识地图:预测、分类、优化、评价的选型与避坑指南

简介:这份PDF资料面向备战数学建模竞赛的高校学生与指导教师,系统梳理了竞赛中最常考的四大模型:预测模型、分类模型、优化模型与评价模型。内容按目录逐层展开,预测部分涵盖神经网络、灰色预测、线性回归、时间序列、马尔科夫链、…

2026/10/18 1:21:43 阅读更多 →
开放式代码评审实战:从工具选型到流程落地

开放式代码评审实战:从工具选型到流程落地

做开发这些年,我参与过的 code review 少说也有上千次。坦白讲,早期我对评审的态度是:能跳过就跳过,反正自己写的代码自己心里有数。直到有一次,一个看起来人畜无害的改动在凌晨打爆了线上数据库连接池,我才…

2026/10/18 1:21:43 阅读更多 →
Mac Mouse Fix 入门指南:让 Mac 上的普通鼠标获得触控板级滚动与侧键操作

Mac Mouse Fix 入门指南:让 Mac 上的普通鼠标获得触控板级滚动与侧键操作

Mac Mouse Fix 入门指南:让 Mac 上的普通鼠标获得触控板级滚动与侧键操作 【免费下载链接】mac-mouse-fix Mac Mouse Fix - Make Your $10 Mouse Better Than an Apple Trackpad! 项目地址: https://gitcode.com/GitHub_Trending/ma/mac-mouse-fix 如果你用过…

2026/10/18 1:20:43 阅读更多 →

日新闻

基于GMM的语音识别系统原理与MATLAB实现详解

基于GMM的语音识别系统原理与MATLAB实现详解

说到基于高斯混合模型(GMM)的语音识别系统,很多人第一反应就是一堆数学公式,觉得门槛很高。但如果你真的在MATLAB里把它落地跑通,会发现核心其实就是三件事:把声音变成特征向量,用GMM给每个类别…

2026/10/18 0:00:55 阅读更多 →
数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理这四个字听起来挺唬人,但落到具体操作上,无非就是让计算机按你的想法“摆弄”像素。我在一个模拟项目X里用了一套特别经典的基础处理流程:对图像做反白、改调色板、彩色转灰度,最后把像素数据导出成txt文件。单看每一…

2026/10/18 0:00:55 阅读更多 →
机器人大脑技术盘点:具身智能的感知、决策与数据闭环

机器人大脑技术盘点:具身智能的感知、决策与数据闭环

如果你的信息流最近也天天刷到“机器人大脑”这个词,你会发现一个很有意思的现象:每个人说的“大脑”根本不是同一个东西。有人指的是大语言模型,有人指的是运动控制系统,还有人指的是能理解物理世界的端到端模型。在2026年这个时…

2026/10/18 0:00:55 阅读更多 →

周新闻

基于GMM的语音识别系统原理与MATLAB实现详解

基于GMM的语音识别系统原理与MATLAB实现详解

说到基于高斯混合模型(GMM)的语音识别系统,很多人第一反应就是一堆数学公式,觉得门槛很高。但如果你真的在MATLAB里把它落地跑通,会发现核心其实就是三件事:把声音变成特征向量,用GMM给每个类别…

2026/10/18 0:00:55 阅读更多 →
数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理这四个字听起来挺唬人,但落到具体操作上,无非就是让计算机按你的想法“摆弄”像素。我在一个模拟项目X里用了一套特别经典的基础处理流程:对图像做反白、改调色板、彩色转灰度,最后把像素数据导出成txt文件。单看每一…

2026/10/18 0:00:55 阅读更多 →
机器人大脑技术盘点:具身智能的感知、决策与数据闭环

机器人大脑技术盘点:具身智能的感知、决策与数据闭环

如果你的信息流最近也天天刷到“机器人大脑”这个词,你会发现一个很有意思的现象:每个人说的“大脑”根本不是同一个东西。有人指的是大语言模型,有人指的是运动控制系统,还有人指的是能理解物理世界的端到端模型。在2026年这个时…

2026/10/18 0:00:55 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/18 0:55:02 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/17 17:22:31 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/16 14:23:36 阅读更多 →