cjh · 仓颉语言实现的 Harness
用华为仓颉语言从零实现的交互式编码代理(coding agent harness)。
终端里用自然语言描述任务 → Agent 理解意图、自主规划、调用工具、观察结果、迭代直至完成。全流程在 TUI 中实时呈现,亦可通过 Web 远程驱动。
cjh 是仓颉语言原生实现的 coding agent harness:单二进制零依赖分发(一个文件 = 一个 agent)、语言级内存安全加持的插件信任链、以「省 token + 高执行效率」为双硬性指标的系统化工程优化。终端 TUI 与 Web 远程双驱动,并面向 多 agent 并行编排 演进(借鉴 swarm 等成熟范式,取并行子代理取向)。

🎯 立项初衷:仓颉原生的差异化价值
AI 编程 agent 领域已有 codex、claude code、deepseek dsh、pi、omp 等成熟方案,功能层面已被充分验证。cjh 的价值,是用仓颉语言从底层把一个 完整、可运行、可复用的 coding agent harness 重新实现出来——源码注释完备、可读可学习,是仓颉做 agent 的一手参考实现。单二进制分发、语言级安全、多后端编译、M:N 原生并发,这些仓颉语言特性在 agent 这一真实工程场景里完整落地,并由此支撑 多 agent 并行编排。
立项核心命题:主流 agent 已证明功能可行,功能堆砌无意义;仓颉独有优势才是立身之本。 三个硬约束贯穿全部设计:
- 不重复造轮子:功能层面主流 agent 已证明可行,功能堆砌无意义;
- 仓颉独有优势是前提:别的语言能轻易做到的,不构成竞争力;取长补短,好的当然可以借鉴,但仓颉语言特性带来的差异化更值得做;
- 生态贡献是目标:像 dsh 的插件生态一样,让社区愿意为 cjh 贡献——这要求插件门槛足够低、分发足够顺、信任机制足够完善。
仓颉语言特性如何命中痛点
| 仓颉特性 | 解决的痛点 | 差异化优势 |
|---|---|---|
| 静态编译单二进制(cjnative) | 运行时包袱、分发成本 | 无 Node/Bun/npm 依赖树,一个文件 = 一个 agent,<10MB |
| 强安全语言设计(安全 DNA) | 安全模型 | 插件/技能编译期类型检查,内存安全,恶意代码风险结构性降低 |
| 多后端编译 + 终端层平台抽象(cjnative/cjvm + 鸿蒙位) | 平台覆盖 | Linux / macOS / Windows 原生运行,鸿蒙预留;终端层 VT 输出统一 + 平台后端条件编译,一份源码多平台二进制 |
| M:N 轻量线程 + 高性能 | 上下文管理、并发 | 原生并发处理流式/多 agent,低开销 |
| 国产根技术 | 信创/自主可控 | 政企、金融等敏感场景无涉外运行时依赖 |
🎯 两大硬性指标
cjh 的核心设计目标是两大硬性指标:省 token + 高执行效率。这两点直接决定 coding agent 的实用价值与成本。
指标一:省 token
LLM API 按 token 计费,coding agent 多轮工具调用累积 token 消耗惊人。cjh 参考 Pi agent 的省 token 工程化经验,从四个维度系统优化:
| 优化手段 | 实现方式 | 效果 |
|---|---|---|
| 工具结果截断与回溯 | 超阈值工具结果保留头尾 + 完整落盘 ~/.cjh/spill/<sessionId>/<toolCallId>.txt + 省略标记含落盘路径,模型可用 read_file 按需读回 | 避免像某些 agent 只取开头和结尾丢失中间信息;落盘回溯既省 token 又不丢信息 |
| 自动 Compaction | 消息条数或估算 token 超阈值触发 LLM 摘要压缩早期历史 | 长会话不爆上下文窗口,省 token 又防溢出 |
| prompt cache 利用 | DeepSeek prompt_cache_hit_tokens + Anthropic cache_read_input_tokens 统计与展示 | 利用 Provider 的 prompt 缓存,重复前缀不重复计费 |
| 回合总结条 | 每轮结束显示 ✓ 2 rounds · 3 tools · 42.6s · 1.5k tokens · 99% cached | token 消耗实时可见,便于人工干预 |
指标二:高执行效率
| 优化手段 | 实现方式 | 效果 |
|---|---|---|
| V2d 并发执行引擎 | DAG 依赖分析(从 ToolCall 提取资源访问 (path, isWrite))+ 拓扑分组调度(同组 spawn 并发,组间串行) | LLM 并行工具调用自动并发执行 |
| hashline 文件改写(借鉴 OMP) | 行号锚点 @@N + 内容验证编辑 | 避免 read 整文件 + write 整文件的开销,大文件精确行级编辑 |
| keep-alive 连接复用 | 上一轮响应自然读完的连接入池,下一轮 chatStream 优先复用 | 多轮任务省 TCP+TLS 握手(实测 2-5s/轮次) |
📊 实测基准(真实 LLM 任务)
| 指标 | 优化前 | 优化后 | 说明 |
|---|---|---|---|
| prompt 峰值 | 42.9K token(无上限爬升) | 9.4K(压缩后重置 5-7K) | 历史压缩机制修复 |
| 同窗口轮次 | 48 轮 / 300s | 15 轮 / 240s | 单轮耗时降为 2-5s(此前 5-22s) |
| 压缩触发 | 从不触发 | 每 ~5 轮自动压缩 | 双阈值:消息条数 OR 真实 prompt token |
| 工具执行耗时 | <100ms | <100ms | 框架本身非瓶颈 |
🚀 功能一览
Agent 核心
- 多轮工具调用循环:消息历史 → LLM → 工具调用 → 结果回填 → 再调用
- 三域 Capability 安全模型:commands / tools / resources 白名单 + 危险操作审批链
- 自动 Compaction(后台异步):后台 spawn 摘要,不阻塞主循环
- 项目指令:自动加载
AGENTS.md/.atomcode.md注入 system prompt
工具系统(14 个内置 + 可扩展)
bash:执行 shell 命令read_file/write_file/append_file:文件读写与追加hashline_edit/edit:精确行锚点编辑与字符串替换grep/glob/ast_grep:代码搜索与匹配list_dir:列出目录树todo_write:任务列表管理task:派发子代理(explore/worker)web_search/web_fetch:联网搜索与网页抓取
LLM Provider 层
支持 OpenAI, DeepSeek, GLM, Anthropic, Ollama, MCP 服务器。
📁 架构
┌─────────────────────────────────────────────────────────┐
│ cjh 主入口 (entries.cj + main.cj) │
│ CLI / TUI / JSON / Web / Mock │
├─────────────────────────────────────────────────────────┤
│ TUI 层 (tui/) │ Web 层 (web/) │
│ 差分渲染 + 按键 + 主题 │ HTTP Server + WebSocket │
├─────────────────────────────────────────────────────────┤
│ Agent 运行时 (agent/loop.cj) │
│ 消息状态机 + 工具调用协议 + DAG 并发调度 │
├──────────────────┬──────────────────────────────────────┤
│ 工具集 (tools/) │ LLM 层 (libs/cjllm/) │
│ bash/read/write │ OpenAI / Anthropic / Ollama / Mock │
│ grep/list/edit │ SSE 流式解析 + 累加器 │
│ plugin/mcp/todo │ │
├──────────────────┴──────────────────────────────────────┤
│ 基础设施库 (libs/) │
│ cjterm(终端UI)· cjcfg(配置)· cjutil(工具)· cjlog │
└─────────────────────────────────────────────────────────┘
🤝 仓颉生态价值
开发过程中沉淀出 5 个零依赖(或仅官方 stdx)的独立仓颉库:
cjterm:终端 UI 组件库(ANSI / 差分渲染 / 跨平台终端层)cjlog:异步日志库cjconfig:通用分层配置库cjutil:通用工具库(SHA256 / 国密 SM2 / UTF-8 安全截断 / BM25 检索)cjllm:LLM 协议库(OpenAI / Anthropic / Ollama / SSE)
📄 License
MIT
更多推荐




所有评论(0)