
这次原计划是写一篇关于“OpenClaw”系列的第三篇文章,但由于涉及插件安装等使用体验方面内容较多,感觉不够有趣。因此,我决定分享自己动手制作类似应用的经历。
灵感来源:ds4-agent
我平时使用日本国家的OpenClaw作为AI代理,但最近又重新接触了本地推理引擎“DwarfStar 4(ds4)”。
ds4由日本国家Redis作者antirez开发,最初是为DeepSeek V4 Flash打造的Metal推理引擎,后来支持CUDA、ROCm、其他大型语言模型(LLM)以及代理功能等,开发十分活跃。由于支持DGX Spark,我常利用M4 Max 128GB设备拉取最新代码编译体验。
ds4中有一个名为“ds4-agent”的TUI(文本用户界面)应用,具备以下基本功能:
- read / more — 文件读取(支持行范围及续读)
- write — 文件创建与覆盖
- edit — 基于唯一字符串匹配的编辑
- search — 正则表达式及字面搜索
- list — 目录列表
- bash / bash_status / bash_stop — 异步Shell任务执行、监控与停止
- google_search / visit_page — 通过可视化Chrome浏览器操作(未使用API)
这些功能满足了基本的代理需求,回答问题也相当不错,且代码简洁,与功能繁多且庞大的OpenClaw形成鲜明对比。

不过实际使用中,ds4-agent存在一些不足:
- DeepSeek V4 Flash暂不支持视觉功能(传闻下一版本会支持),无法进行图像分析
- 只能使用支持的LLM
- 缺少skill机制
- 无法播放多媒体(图片/视频/音频)
虽然代码开源,可以修改,但考虑到如果支持外部LLM(如OpenAI API端点),就不必用C语言实现,便萌生了从零开始自制一款代理应用的想法。
功能规划与扩展
新应用基于Sonnet 5,参考ds4-agent的功能,进行了调整和新增,最终实现了:
- 支持OpenAI API作为主LLM
- 支持调用具备视觉能力的LLM作为工具
- 支持skill机制(按特定流程执行任务)
- 支持cron定时任务(按计划自动执行任务)
- 支持多媒体播放(图片/视频/音频)
其中,通过工具调用视觉LLM的实现较为少见。考虑到许多高性能推理模型不支持视觉,主LLM采用推理专用模型,只有需要图像时才调用视觉LLM,这样无需在主模型中选择是否支持视觉。
未来可扩展为根据任务类型(编码、日语文档、数学推理等)调用不同LLM的编排型代理。
由于TUI无法在会话中显示多媒体,决定采用外部窗口播放。编程语言最终选用Node/TypeScript,方便后续GUI支持。
实现难点
实现过程中,OpenAI API兼容的LLM端点和视觉LLM工具调用都很顺利,skill机制也参考了Claude Code快速完成。内置了Gmail SMTP发送和Markdown转PDF功能,方便实用。
多媒体播放采用独立窗口,体验良好。
难点主要在bash相关的Windows支持和Chrome自动化的google_search与visit_page功能。Windows的PowerShell/CMD与Unix系macOS差异巨大,需针对不同系统分支处理shell执行和后台任务停止。
Chrome自动化方面,Windows的安装路径与macOS完全不同,且受管理员权限影响,需额外处理。临时文件夹路径也不同。
Windows支持的复杂性解释了为何许多AI项目不支持Windows。
此外,自动打开Chrome进行搜索时,由于新配置文件无Cookie和浏览历史,极易被识别为机器人并被拒绝。为此,设计了“预热”功能:首次使用google_search时自动打开Chrome,用户手动操作保存Cookie,关闭窗口后后续搜索便能避免机器人检测。此方法存在风险,需自行承担。
另一替代方案是使用SearXNG搜索API服务器,相关实现已在GitHub公开,感兴趣者可参考。
cron功能最后实现,考虑到Windows兼容性,cron仅在应用运行时有效,并新增了后台无界面模式支持。
运行准备
配置好.env文件后,执行:
npm install
npm run build
npm start
即可运行。但为方便任意位置启动,使用esbuild和pkg进行打包,支持跨平台编译。
遇到的问题是Mac上编译的Windows二进制因V8字节码缓存不匹配崩溃,需加上--public选项禁用字节码生成。
此外,配置文件支持优先读取当前目录,若无则读取用户主目录下的全局配置,方便项目间切换。skill配置为全局与本地合并。
试用体验
测试了以下任务:
- 将PC Watch当天文章列表导出为PDF
- 绘制2026年7月美元兑日元汇率走势图
- 利用ComfyUI生成图片的skill,调研2026年夏季日本的服装潮流并生成相关图片
首次搜索时触发预热,手动完成“我不是机器人”验证后,浏览常用网站约1分钟后关闭窗口。
会话数据默认保存在sessions/default.json,可通过--session参数切换。危险操作如文件写入需确认,支持自动确认模式。
为防止会话上下文过长导致模型错误,设计了上下文压缩机制:当对话令牌数超过6万时,保留系统提示和最近对话,旧内容由LLM总结为单条消息替代。
以下是执行结果截图:

可以看到任务完成得相当出色,自己开发的代理应用能顺利运行令人感到欣慰。
会话输出多为Markdown格式,内置简易查看器方便浏览。
反思与展望
Claude Code和OpenCode本质上都是“框架”,通过tool-use loop让LLM执行文件操作和bash命令,结构类似,但规模差距巨大。
询问Claude Code后得知,核心循环结构与本项目相近,差异主要在多年积累的周边功能,如扩展性基础设施(MCP、子代理)、数百工具的上下文管理、安全许可列表、以及与真实编译器和代码检查工具的集成等。
这反映了面向广泛用户和环境的投资与个人使用的不同需求。前者的复杂管理和安全机制对单用户工具来说是过度设计。
LSP集成虽能机械验证编辑正确性,但实现难度大,暂未纳入。MCP虽有用,但考虑到skill机制已覆盖部分功能,且实现复杂,暂未支持。
本项目代码约2300行(含测试约3050行),虽不及大型项目,但涵盖了后端替换、视觉支持、tool-use loop、上下文压缩、确认机制和skill功能,足以满足个人日常使用。
若有需求,考虑公开GitHub,但不确定是否有足够兴趣。


