harness9 架构概览
SkillMediaUse when asked about harness9 architecture, module design, or how components interact — explains the system design
Available today. Use it from your connected AI after setup.
No other account needed.
Connect ahel once, and every AI you use reads what you have installed.
Then ask your AI: use the harness9 架构概览 skill
What this skill tells your AI
The instructions your AI receives, as published by zhangshenao/harness9 in skills/architecture-overview/SKILL.md and read by ahel’s review.
核心设计原则
| 原则 | 说明 |
|---|---|
| 简洁 | 最小化抽象层,极少的直接依赖 |
| 完备 | 覆盖 Agent 运行所需的全部核心模块 |
| 生产可用 | 错误恢复、超时控制、路径沙箱、并发安全 |
标准 ReAct 循环
Turn N:
LLM(messages + tools) → 推理 + 工具调用决策
→ 并发执行所有工具调用 → Observation 注入 context
→ Turn N+1
自然终止:模型不再发起工具调用 → 输出最终回复
三重终止保障:
- 自然终止:
len(responseMsg.ToolCalls) == 0 - MaxTurns:默认 50,可通过
WithMaxTurns配置 - Context 取消:外部
cancel()或超时
模块依赖关系
cmd/harness9 (入口)
├── internal/context (System Prompt 组装)
│ └── internal/skills (Skills 解析 + 索引)
├── internal/engine (ReAct 主循环)
│ ├── internal/provider (LLM 调用)
│ ├── internal/tools (工具注册 + 执行)
│ └── internal/schema (数据类型)
└── internal/env (配置加载)
关键设计决策:接口定义在使用者侧
tools.Registry接口定义在tools包,engine包依赖它engine.PromptBuilder接口定义在engine包,context包实现它skills.UseSkillTool通过 Go 结构类型满足tools.BaseTool接口,不需要 importtools包(避免循环依赖)
关键数据流
TUI 模式
用户输入 → RunTUI → eng.RunStream(ctx, prompt)
→ engine.Event stream → 逐 token 追加到对话视图
→ ToolCalls → Spinner 动画 + 耗时计数
→ EventDone → 最终回复渲染到屏幕
CLI 模式(管道 / CI)
用户输入 → RunCLI → eng.Run(ctx, prompt)
→ runLoop → LLM Generate
→ ToolCalls → 并发执行 → ToolResults → 继续循环
→ 最终回复打印到 stdout
System Prompt 组装
DefaultPromptBuilder.Build() 按顺序组装:
- 基础 Prompt:角色定义 + workDir
- AGENTS.md:项目级规范(文件不存在时跳过)
- Skills 索引:
- name: description列表(为空时跳过)
完整内容示例:
You are harness9, an expert coding assistant...
## Project Guidelines (AGENTS.md)
{AGENTS.md 全文}
## Available Skills
Use the `use_skill` tool to load full content of any skill when needed.
- go-coding-standards: Use when writing or reviewing Go code...
- debugging-guide: Use when debugging Go errors...
Provider 抽象
type LLMProvider interface {
Generate(ctx, messages, tools) (Message, error)
GenerateStream(ctx, messages, tools) (<-chan StreamChunk, error)
}
当前实现:
OpenAIProvider:兼容所有 OpenAI Chat Completions API(包括 OpenRouter、Azure)AnthropicProvider:Anthropic Messages API
Anthropic 约束:user/assistant 消息必须严格交替,禁止连续 assistant 消息。
工具系统
type BaseTool interface {
Name() string
Definition() schema.ToolDefinition // JSON Schema,传给 LLM
Execute(ctx context.Context, args json.RawMessage) (string, error)
}
内置工具:
| 工具 | 说明 |
|---|---|
bash | Shell 命令执行,workDir 为 CWD |
read_file | 文件读取,4096 字节截断 |
write_file | 文件写入,自动 mkdir |
edit_file | 字符串替换编辑,多级模糊匹配 |
use_skill | 按需加载 Skill 全文 |
所有文件工具通过 safePath() 校验路径,防止 Path Traversal 攻击。
Signals
- GitHub stars
- 140
- Forks
- 11
- Last commit
- Sep 2026
Advanced
- Catalog kind
- skill
- Gateway key
architecture-overview- Source
- github.com/zhangshenao/harness9