7 月 AI CLI 工具开发总结:从 idea 到可用的 31 天全记录与关键决策
📅 2026/7/27 2:45:06
👁️ 次浏览
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 秒的区别是你能不能保持心流的关键差异。下个月不打算加新功能了——先把测试补全然后真正用这个工具一个月让实际使用中的痛点告诉我下一步该做什么。
1. 音乐旋律的本质解析旋律作为音乐的核心元素,本质上是一系列具有特定音高和节奏的音符序列。从物理层面看,每个音符对应着不同频率的声波振动——中央C的频率是261.63Hz,而高八度的C音则翻倍为523.25Hz。这些声波通过空气传播到人耳时&…
📅 2026/7/27 2:45:06
做电气安全的兄弟,有没有遇到过这种尴尬:明明接地电阻测出来是合格的,雷雨天设备照样跳闸,甚至冒火花?别急着骂厂家,大概率是你测错了地方。很多人觉得接地电阻就是拿个表夹上去看看数值,太天真了。土壤电阻率才是那个看不见的“幕后黑手”。今天不聊虚的,聊聊为什么你…
📅 2026/7/27 2:43:34
1. 项目概述:深入解析C5504的四大关键外设在嵌入式系统,尤其是以数字信号处理为核心的应用中,处理器本身的计算能力固然重要,但真正让系统“活”起来、能与外部世界顺畅交互的,往往是那些默默无闻的外设模块。今天&…
📅 2026/7/27 2:44:06
1. 学术写作中的AI检测挑战现状去年秋季学期,我带的几个研究生先后收到教授邮件,指出他们论文中部分段落被Turnitin的AI检测功能标记为"可能由AI生成"。这几位学生确实都是独立完成的作业,但文风过于工整规范反而引发了系统误判。这…
📅 2026/7/27 3:42:22
1. 项目背景与核心价值车牌识别技术作为智能交通系统的核心组件,已经广泛应用于ETC收费、停车场管理、违章抓拍等场景。LPRNet作为轻量级端到端车牌识别模型,相比传统OCR方案具有三大优势:模型体积小(仅1.2MB)、识别速…
📅 2026/7/27 3:42:22
1. 三轴运动控制系统概述三轴运动控制系统是现代工业自动化领域中的核心组件,广泛应用于数控机床、激光切割、3D打印等精密设备。这种系统通过协调X、Y、Z三个轴向的运动,实现对工作对象的精确定位和轨迹控制。在典型的工业场景中,三轴控制系…
📅 2026/7/27 3:42:22
1. 项目背景与核心痛点去年在帮某科技媒体做内容审核时,发现他们每天要处理近万篇AI生成文章的筛选工作。编辑团队最头疼的不是识别AI内容,而是如何在不误伤人工创作的前提下,把AI率从行业常见的30-40%降到平台要求的15%以下。经过三个月实测…
📅 2026/7/27 3:42:22
1. 汽车控制器的MIL测试实战指南第一次接触MIL(Model-in-the-Loop)测试时,我盯着那堆汽车控制器的Simulink模型发愣——这玩意儿怎么测?后来才明白,MIL测试就像给汽车ECU做全身体检,只不过我们用的不是听诊…
📅 2026/7/27 3:42:22
本文关键词:geo11 3D化插件说句掏心窝子的话,干咱们这行,尤其是搞建筑可视化的,谁没被那些慢得让人想砸键盘的渲染器折磨过?前两天有个刚入行的小兄弟问我,为啥我出图这么快,他还在那儿调材质参数调到头秃。其实真没啥秘密,就是工具选得对。以前我也迷信那些大厂出的重…
📅 2026/7/27 3:41:09
现象在 WezTerm 终端中,包含中文路径的文本(如标签页标题、Shell 提示符、路径补全)中,某些汉字时而渲染为日文字形,时而显示为简体中文(中国大陆)字形。以「径」字为例,日文写法右侧…
📅 2026/7/27 0:00:07
这个问题看似在寻找一个答案,实际上是在寻找一种“值得继续投入的方向感”。很多人在问:
“人生有什么意义?”
深层可能是在问:
我现在做的事情值得吗?我的努力有没有价值?我的存在是不是重要?未…
📅 2026/7/27 0:00:07
1. 为什么MoE架构让大模型参数量翻倍却不增加推理成本?去年我在部署一个千亿参数大语言模型时,首次接触到混合专家模型(Mixture of Experts,简称MoE)架构。当时最让我震惊的是,这种架构的模型参数量可以达到…
📅 2026/7/27 0:00:07
更多请点击:
https://codechina.net
第一章:AI帮助理解数学概念 人工智能正以前所未有的方式重塑数学学习的路径。通过自然语言处理与符号计算的深度融合,AI不仅能解析抽象定义,还能将定理、证明和几何直觉转化为可交互、可验证的…
📅 2026/7/27 1:11:21
1. 项目背景与核心价值去年参与的一个短剧项目让我深刻体会到传统创作流程的痛点:编剧团队花了三周打磨剧本,角色设计反复修改了七版,最后成片时又因为演员档期问题不得不临时调整分镜。这种低效的创作模式在快节奏的内容行业越来越难以为继。…
📅 2026/7/27 1:11:21
remix-i18next TypeScript类型安全实践:确保翻译键与类型定义同步 【免费下载链接】remix-i18next The easiest way to translate your React Router framework mode apps 项目地址: https://gitcode.com/gh_mirrors/re/remix-i18next
在开发多语言应用时&am…
📅 2026/7/27 1:11:21
目录
第一步:选对模板,省心一半
第二步:打开扫码点餐功能
开启功能按钮
桌台管理与桌码生成
第三步:个性化设计,打造品牌感
调整点餐页面
设置点餐规则 你还在让顾客站着排队点餐吗?2025年ÿ…
📅 2026/7/26 7:10:22
在业务中快速构建一个能理解私有文档、准确回答专业问题的智能助手,是很多开发团队面临的共同挑战。传统方案往往需要从零开始搭建复杂的 RAG(检索增强生成)系统,涉及文档解析、向量化、检索、大模型调用等多个环节,整…
📅 2026/7/26 17:10:53
FAE放射组学分析工具:医学影像特征探索的完整解决方案 【免费下载链接】FAE FeAture Explorer 项目地址: https://gitcode.com/gh_mirrors/fae/FAE
你是否曾经面对海量医学影像数据感到无从下手?想要从CT、MRI等影像中提取有价值的定量特征&#…
📅 2026/7/26 5:10:17