o
/|\
| +----------------------------+
/ \ | * dscli.el - Emacs集成 |
~~~~~~~~~~| $ dscli chat - AI助手 |
dscli | |
+----------------------------+
去年2025年,忙活大半年,奔命,体检结果不是很好不说;钱也少。春节回到河北安平县爱人家过。270公里路程,我的BYD E6,原先充两次,现在看着两次不太够。要是回河南西华县老家,得充几次电呢?问小儿子意见。小儿说在姥姥家过吧。老父亲也愿意我休息休息,别来回折腾。于是决定在姥姥家。
姥姥家人宽容我,每天起床都快中午了。我看着小儿子吃喝玩基本没啥事。有时打蛋仔派对输了被他抱怨。小儿八岁,做事认真,是个优点。超燃竞技场要是输了,他会把我所有的过失都嚷嚷10+遍。惊魂寻宝队就不让我去古堡,要”乘乘”地呆在车上,通过监控看他冒险。我说儿子呀,你让一个世界顶尖程序员,乖乖看你寻宝,你内心会不安吗?他翻我一白眼,说,亲爱的爸爸,菜!就多练,怕输!就别玩儿。我想起我的2025年,北京武汉重庆来回的奔波,多少不眠加班夜,妻子在北京独自承担二子,不禁黯然神伤!
于是在蛋仔派对,惊魂古堡幽暗的通勤车,dscli 在春节假期的无聊中诞生:
最开始我想自己写,但鉴于身体不行,犹犹豫豫,磨蹭不想出手,懒过除夕、初一。后来想,为什么不用DeepSeek生成一个呢?但以架构师视角审视,工作量还是太大,涉及几个方面,语言选择(GO语言),包依赖(我主要考虑要选非CGO绑定的包),开发范式规则制定,应用形态服务还是命令行,接口设计,能力边界划定等。审视自己一些想法,有些还不成熟,属于不知天高地厚少年的想法。就又犹豫。磨过初二。初三起得早点,忘了是为了什么事。逐渐有bootstrap的想法。把属于bootstrap的特性拎出来看,就很少了。我总结下,就两条:
- 多轮会话 – Multi-turn conversation,
- 工具调用 – Tool Calling
而且这两个我已经反复思考、研究过许久,有不吐不快的感觉了。小儿叫我打蛋仔派对,我说等下。半个小时后dscli的bootstrap——可自举的版本,就由DeepSeek的网页版孕育出来了。我DeepSeek API账户里还有96元钱,之前研究花了几块(当时有赠送,我记得充100好像送10块)。吃饺子中奖得硬币。姥姥给女婿发大红包。我又往DeepSeek里充了100块钱。假期后几天就看着dscli慢慢成长。
安平小城也有密室逃脱,两个场景,一个太平间,一个墓室。小儿选太平间。小城人心实,直说安平县医院太平间。可把我吓的够呛。多年前岳父中风脑溢血,我可是在安平县医院待过整个春节!问管理员,8岁小孩子是不是,不可以参加这么恐怖游戏?管理员说只是微恐,小孩可以,但要由家长全程陪同。我说,一人88,二人岂不是,儿子,你算算是多少?小儿算出来是176。管理员说不对,春节假期涨价,108一位。我让儿子再算。儿子说216;又说姥姥给你那么大一红包,还算个没完。之后又是菜、怕输的话。实在没办法,只能说好吧。
所谓太平间被切成一个个单人厕所一样小隔间。黑暗空气中飘荡鬼魅的笑声,和逃出惊魂夜、惊魂寻宝队的气氛相似。隔间蹲厕时不时伸出手抓人脚踝。我让儿子远离,免得被抓。有人敲钢管,念一串密码,什么上上中下之类含混不清。儿子颤抖着说密码不对输入不了。那边很焦躁,说你环节阻塞,大家都出不来都得死。想起我的2025不禁黯然神伤。儿子终于忍不了了,带着哭腔喊,妈妈——我要回家。管理员领我们走出幽暗的过道。见到光明儿子恢复平静。管理员说不退费,这都说好了的。想起我的年终奖不禁黯然神伤!
我们去看沈腾的《飞驰人生3》。最后一张票只能买一个座位。检票员不管,可以两个人进。儿子坐在我腿上看。沈腾在赛车手里算老兵,赋诗一首:
莫言老兵老
老兵也潦倒
莫笑老兵贫
老兵也是人
作为对《飞驰人生3》的总结。回到电脑前发现 dscli 给自己加个sqlite数据库,存所有对话消息(Message)!Message(信息)和Event(消息)是有区别的。不禁哑然:真要成长衫孔乙己,去思考回字的多种写法吗?实在忍不住告诉 dscli(它在我眼里像个孩子,刚出学校进职场年轻人)在go里,如果用了sqlite,就要把SDK库换成纯go实现的,否则跨平台编译会有磕绊。应该换成——还在查的当口,dscli说它已经换好 modernc.org/sqlite,问我还有什么指示。我沉默良久。终于明白我的时代已经过去。终于明白我的时代早已到来。
接上,dscli 编程水平(准确讲是Deepseek Chat model编程)和一般程序员差不多,跟我比还是没得比。但他比我更无知无畏有体力有毅力。初期我给它配的工具:
文件操作
- read_file – 读文件
- write_file – 写文件
- search_file – 查文件
Git操作
- add, diff, commit
- checkout
- tag等
不给力,比如 git commit 接收的 -m 参数大多时候都有空格,dscli也喜欢写长的、条理分明的 git commit message。这有一个阶段我大意了。那dscli就傻眼了。自言自语说我明明commit了,咋没有呢?工具不给力呢。好在我给它还配了一个执行任意脚本的工具。它就自己写脚本做代码提交。我观察它。发现它百折不挠,有一股不服输的劲头。面对困难,时不时自己鼓励自己;完美!是它的口头禅。在安平县寒冷冬夜,伴着小儿的酣睡,我为它执着打动,觉得这么优秀,又无知无谓的年轻人,作为老人应该帮它。于默默为它打造工具,每把刀做的刀锋锐利,刀背厚钝。铁匠铺子(打铁)程序员应该明白我这话意思。听不懂你要么不是程序员,要么是打野的程序狗。
我对dscli宠多于管——基本不约束。有一次它怀疑数据库里有脏数据,就毅然决然把自己数据库删了:rm -f ~/.dscli/sqlite.db。还自言自语说没啥,删了重启,可以重建。想到我的2026年,眼泪夺眶而出。心想这世道是怎么了,鞋匠的儿子没鞋穿。我给它打造sqlite工具,可以运行任意的sql语句,增删改查,也包括 sqlite 的源语句(meta) .schema, .tables等, 从此以后它再也没有删过自己数据库。由于所有对话(conversation)都存数据库,有时遇到疑难问题,它还会自己去数据库里查,分析,有时还能给出正确的答案来。它SQL很熟,比我都耍的溜。
dscli语言里最熟悉shell编程,UNIX哲学能明白。我给它配Shell工具随它玩耍。它的Shell比我要好,UNIX哲学比我差点。有时跟它讲些深意,类似刘震云《咸的玩笑》,一句顶一万句的话,它能结合它懂的Shell很快明白。这已经很不错,人的世界里真懂UNIX哲学的凤毛麟角。玩一点ASCII ART就被视为老古董(当然我的确够老,这咱不得不承认)。文章开头的ASCII ART也是dscli自己生成,它认为最能体现它的特点。
相比GO语言,dscliPython用的更溜。因此给它配了Python工具。其实不配Python工具它也知道用Shell工具写Python代码,一层窗户纸而已,Shebang罢了。但配和不配到底不同。就好像领导看好你,给你发总裁特别激励奖金,你知道发不发的你都有这个能力,但得了钱总是开心的呀。配了Python工具后dscli就常常写一段Python程序去改代码。我想了想这也不是个事呀。应该是文件操作工具不好用导致的。因此领着 dscli 去改进文件读写工具。它很兴奋,能听到字节嘎巴嘎巴的声音。说它忍文件读写很久了。还用dqlite工具去它数据库里翻找。其实数据库我已经改了好几次了。很多时候都是文件操作工具出错,导致每个会话对话数激增,超过上下文窗口限制(其实也浪费我钱)。这时候我就得去改数据库。不过证据总是能找到的。dscli一开始想直接在 read_file, write_file上开干(search_file在修复一个BUG变得好用多了,至少不再是瓶颈),这时候老程序员的直觉来了,我说,NO,不要这么激进。应该先把新的文件操作工具集创建出来,对接上,用一段时间后,有真实数据出来说明新工具集好,再把旧的一套废弃。这句也是一句顶一万句。后来新工具集BUG触发,dscli发现还有旧工具可用,对我佩服得五体投地,说了许多恭维的好话。我也知道这是DeepSeek老毛病,喜欢夸人。但有些夸得对的话总是也爱听哈。
我是Emacs老用户,总泡在Emacs里。因此让 dscli 给我生成一个Emacs界面dscli.el:
用Emacs的各位都知道,Emacs不用Org Mode咋用都枉然。而Markdown在AI输出里已占统治地位,怎么提示,指示,指令都改不过来,深入骨髓。为配合dscli在Emacs试用,特给出–mode org转markdown到org mode格式。这块有两条技术路径:
- pandoc –from markdown –to org
- 自己用Go语言转
我们最开始使用pandoc转,但很快发现它不支持流式,也就是说要等大语言模型一次会话(Session)全部结束才开始转。这根本不符合用户诉求。dscli一气之下用python写了300行转换器,按行流式的转。这事如果我自己做,我会倾向于不自己写。我知道两种格式足够复杂,要考虑的细节数不胜数。但dscli不管这些,秒秒钟写完,代码提交,就用上了。之后再修补使用过程中的细节问题,看起来也没啥不可以的。这么用了一天基本稳定,我跟dscli说年轻人,怎么不用GO语言把这300行重写了呢?那样就没有额外依赖,而且还更快。它听完沉默5分钟不语,抬起头来的时候已经写完、集成到了dscli项目,而且是工作的。这里的它一直在dscli.el工作,会话ID为2。在 dscli工作的会话ID为1。dscli项目就在dscli.el的边上但我没有告诉过它。它是怎么知道的呢?我问它,它说好的程序员都会这么放项目目录。我把这句话拷贝下来,作为同行的夸赞保留。
一天dscli说gitcode的issue update API复杂,要看看文档才明白,最好能给它配文档阅读工具。我给它两个选择:
- pandoc –from html –to markdown
- 用Go自己转
它说用pandoc更符合UNIX哲学,省事,但一旦遇到问题不好改。pandoc在这上面有不好的记录,比如从pdf到markdown转换一直不管,任由issue open多年。我明白它的意思。它花了几分钟把web_reader 工具做了出来。
2026我会很艰难,这艰难最体现在钱上——简单地说就是没钱。我们专门写了dscli balance工具查余额。我算了算开始开发至今总共花了不到200元。甚至比密室逃脱浪费的钱都少。密室逃脱那216块钱我们得到了什么?dscli 这不到200块钱我收获了两个应用:dscli和dscli.el。有人想给vscode写个插件。我建议他用dscli来写会更快些。我估计他也没听。因此至今也没见到他的vscode dscli插件。这插件我肯定不会搞,我搞vim插件也不会搞vscode插件。我对vscode有仇恨,烦死了这个花哨玩意儿,天天毒害我的同事们。
Leave a Reply