AgentGo - 我学习 OpenClaw 架构开发的迷你 Agent 框架
AgentGo 是一个基于 OpenClaw 架构设计的轻量级通用 Agent 框架,使用 Go 语言实现。它设计目标是领域通用、可靠稳定、简单易用、高度可扩展,可作为学习现代 Agent 架构的绝佳起点,也可直接用于生产环境中的智能任务自动化场景。
项目地址
🔗 GitHub: https://github.com/Bronya0/AgentGo
核心特性
🎯 领域 通用
- 多模型支持:兼容 OpenAI、Anthropic 等多种 LLM 提供商
- 模型路由:按任务复杂度自动选择合适的模型(快速/均衡/强大三档)
- 灵活配置:支持单 provider 和多 provider 混合模式
🔧 高度可扩展
- Skill 系统:易于添加自定义技能模块
- Tool 集成:原生支持函数调用和工具链编排
- 插件架构:支持自定义插件扩展核心功能
⚡ 开箱即用
- CLI 交互:支持单次对话和交互式 Shell 模式
- HTTP Server:内置 REST API 服务器
- Debug 支持:完整的日志和调试工具链
🛡️ 生产就绪
- 错误处理和重试机制
- 上下文管理和会话保持
- 性能优化和并发支持
快速开始
编译
cd src
go build -o agent ./cmd/agent/
配置
将 src/config.example.yaml 复制为 src/config.yaml,填入你的 LLM API 信息:
单 Provider 模式
provider:
type: openai
base_url: "https://api.openai.com/v1"
api_key: "${OPENAI_API_KEY}" # 支持环境变量
model: "gpt-4o"
多模型路由模式
providers:
- id: fast
model: gpt-4o-mini
tier: fast # 简单问答
- id: balanced
model: gpt-4o
tier: balanced # 常规任务(默认)
- id: powerful
model: o1-preview
tier: powerful # 复杂推理
运行
# 单次对话模式
./agent -chat "帮我列出当前目录下的所有 Go 文件"
# 启动 HTTP 服务器
./agent
# 启用 Debug 日志
./agent -debug
项目结构
AgentGo/
├── cmd/
│ └── agent/ # 主程序入口
├── internal/
│ ├── agent/ # Agent 核心逻辑
│ ├── llm/ # LLM 提供商接口
│ ├── tools/ # 工具函数库
│ └── config/ # 配置管理
├── skills/ # Skill 模块(可扩展)
├── config.yaml # 运行配置
└── go.mod # 依赖管理
架构设计
AgentGo 遵循 OpenClaw 架构理念,是一套完整的分层设计系统。
OpenClaw 架构的核心思想
OpenClaw 的设计哲学是关注点分离:将复杂的 Agent 智能体分解为若干独立的层级,每层只负责特定的职责,通过明确的接口进行通信。这种设计使得系统易于扩展、测试和维护。
User Input
↓
[Entry Point Layer] - CLI/HTTP 入口
↓
[Agent Orchestration] - Agent 核心业务逻辑
↓
[LLM Provider Abstraction] - LLM 提供商适配层
↓
[Tool/Skill Execution] - 工具和技能执行层
↓
[External Systems] - 外部系统集成
1. LLM 提供商抽象层
这是 AgentGo 的核心竞争力。设计目标是 用统一接口屏蔽不同 LLM 提供商的差异。
关键设计:
- 接口定义:定义标准的
LLMProvider接口,包括Chat()、ChatStream()、EmbedText()等方法 - 多提供商支持:通过工厂模式创建不同的提供商实现(OpenAI、Claude、DeepSeek、阿里云等)
- 流式响应:使用 Go Channel 实现流式处理,支持实时推送 Token
type LLMProvider interface {
// 单次调用,返回完整响应
Chat(ctx context.Context, messages []Message) (string, error)
// 流式调用,通过 channel 推送 token
ChatStream(ctx context.Context, messages []Message) (<-chan string, error)
// 向量化文本
EmbedText(ctx context.Context, text string) ([]float32, error)
}
特点:
- ✅ 零成本抽象 - Go 接口不会产生运行时开销
- ✅ 动态切换 - 无需重新编译可切换提供商
- ✅ 错误恢复 - 内置 Fallback 机制
