OpenClaw应用界面

这次原计划是写一篇关于“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界面

不过实际使用中,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配置为全局与本地合并。

试用体验

测试了以下任务:

  1. 将PC Watch当天文章列表导出为PDF
  2. 绘制2026年7月美元兑日元汇率走势图
  3. 利用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,但不确定是否有足够兴趣。