从0到1:我的开源项目成长记
去年冬天的某个凌晨三点,我缩在杭州出租屋的飘窗边,盯着屏幕上一行行跳动的日志,一边啃着冷掉的葱包桧儿,一边调试一个死活跑不通的 AI Agent 工作流。窗外运河边的路灯昏黄,屋里只有机械键盘咔嗒作响——那一刻,我突然意识到:这玩意儿,或许真能做成点什么。
我是自由开发者一枚,坐标杭州,离阿里西溪园区骑个共享单车也就二十分钟。过去几年,要么接外包单子,要么给大厂做远程协作模块,日子过得自由但有点寂寞。尤其到了深夜,代码写得飞起,却没人能一起吐槽产品经理临时加的需求:“这个功能很简单嘛,不就是让 AI 自动帮我改 bug 吗?”——呵,简单?那你来啊!
起心动念:为什么要做 OpenCode?
其实最初的想法很朴素:我不想再重复造轮子了。
每次接新项目,总要花好几天搭基础架构——用户权限、日志收集、CI/CD、文档生成……更别提那些“AI 集成”的需求,客户张口就要“智能助手”,结果连个像样的 Prompt 管理都没有。有一次,我甚至在同一个项目里写了三套不同的 LLM 调用封装,就因为前期没想清楚抽象层。
那会儿刚好刷到 GitHub 上有个叫 “OpenCode” 的倡议(不是官方项目,是我自己取的名字),核心思想是:开源、可组合、面向开发者的 AI 编程基础设施。灵感一来挡不住,我心想:干脆自己搞一套?
于是,2023 年 11 月 7 日,我在 GitHub 上建了个仓库,README 只有一句话:
A minimal, composable foundation for AI-powered developer tools. Built by one tired dev in Hangzhou.
项目名叫 devmate —— 开发者伙伴的意思。目标很明确:让独立开发者也能轻松集成 AI Agent,不用被繁琐的工程细节拖垮。
第一次提交:理想很丰满,现实很骨感
最初的版本简直惨不忍睹。
我用 FastAPI 搭了个后端,前端是个简陋的 CLI 工具,AI 部分直接调用 OpenRouter API。想着“先跑起来再说”,结果第一天就遇到三个坑:
- Token 管理混乱:不同模型返回的 token 格式不一致,有的带
usage字段,有的没有; - 上下文截断太狠:用户问个复杂问题,Agent 回答到一半就被截断,还美其名曰“节省成本”;
- 本地调试巨慢:每次改一行代码都要重启整个服务,而我的小破笔记本风扇狂转像要起飞。
最崩溃的是上周五晚上,我正准备发第一个 release,结果测试时发现:当用户连续提问超过 5 次,Agent 会把之前的对话历史全丢掉!查了半天,原来是 Redis 缓存键名拼错了,少了个下划线。当时真的想砸电脑——但转念一想,砸了还得自己修,算了,泡杯咖啡继续干。
关键转折:重构 + 社区反馈
转折点出现在今年 1 月。我把项目链接发到了几个技术群,没想到竟有几位朋友认真试用了,还提了 issue。其中一位在网易做平台工程的老哥说:
“你这个 Agent 的记忆机制太 naive 了,能不能支持按 session 分片存储?我们内部工具都这么干。”
这句话点醒了我。原来我一直纠结于“通用性”,却忽略了真实场景中的隔离需求。于是,我花了整整两周重构核心模块,引入了 Memory Store 抽象层,支持 Redis、SQLite、甚至内存存储。同时,把 AI 调用逻辑拆成 AgentExecutor + ToolRegistry 模式,方便用户自定义工具链。
代码结构也彻底重做。以前是“面条式”代码,现在变成这样:
# devmate/agent/core.py
class DevMateAgent:
def __init__(self, memory: BaseMemory, tools: List[BaseTool]):
self.memory = memory
self.tools = tools
async def chat(self, user_input: str, session_id: str) -> str:
context = await self.memory.get(session_id)
prompt = self._build_prompt(context, user_input)
response = await self._call_llm(prompt)
await self.memory.save(session_id, response)
return response
是不是清爽多了?可读性和可维护性,永远比“快”更重要——这是我从阿里前同事那儿学到的血泪教训。他们有个内部规范:函数超过 30 行必须拆,否则 Code Review 直接打回。
引入 AI Agent:不是噱头,而是生产力
很多人觉得“AI Agent”就是个营销词,但在我这儿,它是实打实的开发加速器。
比如,devmate 内置了一个 CodeFixer 工具,用户可以直接说:
“这段代码报错了:
AttributeError: 'NoneType' object has no attribute 'strip',帮我修一下”
Agent 会自动分析错误栈,定位到可能出问题的变量,然后生成修复建议。虽然不能 100% 正确,但在 70% 的场景下能省去我查文档的时间。
更酷的是,我还加了个 自学习机制:如果用户采纳了某条建议,系统会记录这个 pattern,下次遇到类似错误就优先推荐。这其实借鉴了 GitHub Copilot 的 feedback loop 思路,只不过我用的是轻量级向量数据库 Chroma。
当然,也踩过雷。有次为了“炫技”,我把所有日志都喂给 LLM 做摘要,结果账单暴涨——AI 不是免费的,每一 token 都是钱。后来赶紧加上 cost estimator 和 rate limit,这才稳住。
开源之后:孤独开发者不再孤单
说实话,开源之前,我总觉得“一个人做项目”很酷。但真正发布后才发现:开源的魅力,在于连接。
GitHub Star 从 0 到 100 的那天,我在朋友圈发了张截图,配文:“终于有人比我更早发现这个 bug 了”。结果评论区炸出好几个杭州同行,有人说“要不要一起搞个 meetup?”,还有人直接 PR 了中文文档。
最感动的是上个月,一个大学生私信我:
“学长,我用你的 devmate 做课程设计拿了优秀,谢谢!”
那一刻,所有的熬夜、debug、自我怀疑,都值了。
目前项目已经有 800+ stars,12 位 contributor,甚至有两家 startup 在生产环境试用。虽然离“爆款”还差得远,但对我这个自由开发者来说,已经是莫大的鼓励。
开发心得:几点掏心窝子的话
回顾这一年,除了代码,我收获更多的是心态上的成长。分享几点心得,希望能帮到同样在路上的朋友:
- 别追求完美,先跑通 MVP。我一开始想做“全能型”工具,结果三个月没动静。后来改成“只解决一个问题”,反而快速迭代。
- 文档就是产品的一部分。我花了一周时间写 tutorial,结果 issue 量减少了 40%。用户不是懒,是看不懂。
- 自动化测试不是负担,是安全感。现在每次 push,GitHub Actions 自动跑单元测试 + lint + 安全扫描,心里踏实多了。
- 远程办公更要主动连接。我每周固定参加两次线上 tech talk,不然真的会“社恐退化”。
对了,关于工作生活平衡——我现在强制自己 晚上 12 点关电脑(除非真有紧急 bug)。毕竟,代码可以重写,头发掉了可长不回来。
效果如何?数据说话
上线半年,devmate 的核心指标如下:
| 指标 | 数值 | 说明 |
|---|---|---|
| GitHub Stars | 842 | 截至 2024 年 6 月 |
| Weekly Active Users (社区版) | ~120 | 通过 telemetry 统计 |
| Avg. Response Time | 1.8s | P95 < 3s |
| Cost per Session | $0.0023 | 使用 Mixtral + caching 优化后 |
| Community PRs | 27 | 包含文档、测试、新工具 |
最关键的是:我的外包项目交付效率提升了约 35%。以前要两天搭的脚手架,现在用 devmate 模板,半天搞定。
下一步:不止于工具,更是生态
未来,我希望 devmate 能成为 OpenCode 生态的一块积木。比如:
- 支持与 VS Code / JetBrains 插件深度集成;
- 提供 “Agent Marketplace”,让用户共享自定义工具;
- 探索基于 WASM 的本地推理,减少对云端依赖。
当然,这些都需要时间和社区共建。我不着急,慢慢来。
写这篇文章的时候,又是凌晨两点。窗外运河依旧安静,但我的心情和一年前完全不同。那时焦虑、迷茫,怀疑自己是不是选错了路;现在虽然还是一个人写代码,但知道世界另一头,有人在用我的工具解决问题。
如果你也在独自开发的路上,不妨试试开源一个小项目。不为名利,只为证明:哪怕是一个人的团队,也能创造有价值的东西。
最后,送大家一句我贴在显示器边的话:
“代码会过时,但解决问题的热情不会。”
—— 一个还在杭州写代码的独立开发者

评论 0