PicoClaw 架构
整体架构
flowchart TB
subgraph Channels["消息渠道层"]
TG[Telegram]
DC[Discord]
FS[飞书]
DT[钉钉]
SK[Slack]
QQ[QQ]
WC[企业微信]
WA[WhatsApp]
LN[LINE]
MX[Matrix]
IRC[IRC]
MC[MaixCAM]
end
subgraph Bus["消息总线"]
IB[InboundMessage]
OB[OutboundMessage]
end
subgraph Core["Agent 核心"]
AL[AgentLoop]
AI[AgentInstance]
CB[ContextBuilder]
RT[Router]
SM[SessionManager]
MM[Memory]
end
subgraph Tools["工具层"]
RF[read_file]
WF[write_file]
EF[edit_file]
EX[exec]
WS[web_search]
WFE[web_fetch]
CR[cron]
SP[spawn]
MSG[message]
MCP[mcp_tool]
HW[i2c / spi]
end
subgraph Providers["LLM Provider 层"]
OAI[OpenAI Compatible]
ANT[Anthropic Native]
AZR[Azure OpenAI]
OLL[Ollama / vLLM]
FB[FallbackChain]
end
subgraph Services["后台服务"]
CRON[CronService]
HB[HeartbeatService]
HL[HealthServer]
DEV[DeviceService]
MS[MediaStore]
end
Channels -->|InboundMessage| IB
IB --> AL
AL --> AI
AI --> CB
AI --> RT
AI --> SM
AI --> MM
AL -->|Tool Calls| Tools
AL -->|LLM Chat| FB
FB --> OAI & ANT & AZR & OLL
AL -->|OutboundMessage| OB
OB --> Channels
CRON & HB & HL & DEV & MS -.-> AL
核心组件
1. Gateway(网关)
pkg/gateway/gateway.go 是整个系统的组装点,负责:
加载配置(
config.Config)创建 LLM Provider 和 FallbackChain
初始化 AgentLoop
启动所有后台服务(Cron、Heartbeat、Health、Device)
启动所有消息渠道
处理优雅关闭(graceful shutdown)
type services struct {
CronService *cron.CronService
HeartbeatService *heartbeat.HeartbeatService
MediaStore media.MediaStore
ChannelManager *channels.Manager
DeviceService *devices.Service
HealthServer *health.Server
}
2. AgentLoop(Agent 循环)
pkg/agent/loop.go 是核心处理引擎,实现了完整的 Agent 循环:
接收消息 → 路由到 Agent → 构建上下文 → 调用 LLM → 解析工具调用 → 执行工具 → 循环直到完成 → 发送响应
关键方法:
方法 |
职责 |
|---|---|
|
启动消息监听循环 |
|
处理单条消息的完整流程 |
|
根据消息内容路由到目标 Agent |
|
执行 LLM ↔ Tool 迭代循环 |
|
单次 LLM 调用 + 工具执行 |
|
选择 Provider 候选(支持 Smart Routing) |
|
上下文过长时触发摘要 |
3. AgentInstance(Agent 实例)
pkg/agent/instance.go 封装了单个 Agent 的完整配置:
模型选择(主模型 + 备选模型列表)
工作空间路径
工具注册表
会话管理器
上下文构建器
温度、最大 Token、思考级别等参数
Smart Router(轻量模型路由)
4. 消息总线(Message Bus)
pkg/bus/bus.go 实现了进程内的发布-订阅消息总线:
// 入站消息(渠道 → Agent)
type InboundMessage struct {
Channel string
SenderID string
Sender SenderInfo
ChatID string
Content string
Media []string
Peer Peer // direct | group | channel
SessionKey string
Metadata map[string]string
}
// 出站消息(Agent → 渠道)
type OutboundMessage struct {
Channel string
ChatID string
Content string
ReplyToMessageID string
}
5. Provider 层
Provider 层采用协议优先的架构(正在从 Vendor-based 重构为 Protocol-based):
flowchart LR
subgraph Factory["Provider Factory"]
F[factory.go]
end
subgraph Protocols["协议适配"]
OC[OpenAI Compatible]
AM[Anthropic Messages]
AS[Anthropic SDK]
AZ[Azure OpenAI]
AG[Antigravity/OAuth]
CC[Claude CLI]
CX[Codex CLI]
end
subgraph Fallback["故障转移"]
FC[FallbackChain]
EC[ErrorClassifier]
CD[Cooldown]
end
F -->|"openai/*"| OC
F -->|"anthropic-messages/*"| AM
F -->|"anthropic/*"| AS
F -->|"azure/*"| AZ
F -->|"antigravity/*"| AG
F -->|"claude-cli/*"| CC
F -->|"codex-cli/*"| CX
OC & AM & AS & AZ & AG --> FC
FC --> EC --> CD
故障转移机制:
FallbackChain按优先级尝试多个 ProviderErrorClassifier将错误分类为 auth / rate_limit / billing / timeout / overloaded / formatCooldown对失败的 Provider 实施冷却期FailoverFormat类型的错误不触发重试(请求本身有问题)
6. 渠道层
每个渠道通过 init() 自注册到全局 Registry:
// pkg/channels/telegram/init.go
func init() {
channels.Register("telegram", func(cfg json.RawMessage, bus *bus.MessageBus) (channels.Channel, error) {
return NewTelegramChannel(cfg, bus)
})
}
渠道管理器(channels/Manager)负责:
根据配置启动/停止渠道
消息分发(长消息自动分片
split.go)错误处理和重试
7. 工具系统
工具通过 ToolRegistry 注册,每个工具实现 Tool 接口:
type Tool interface {
Name() string
Description() string
Parameters() map[string]any
Execute(ctx context.Context, args map[string]any) (*ToolResult, error)
}
工具在 AgentInstance 创建时根据配置选择性注册。特殊工具:
spawn:创建子 Agent 异步执行任务
mcp_tool:桥接 MCP 服务器提供的工具
i2c / spi:直接操作嵌入式硬件(Linux only)
8. 技能系统
技能(Skills)是可安装的能力扩展包:
workspace/skills/{skill-name}/
├── SKILL.md # 技能定义(名称、描述、指令)
├── scripts/ # 可执行脚本
└── references/ # 参考文档
skills/loader.go:从工作空间加载已安装技能skills/installer.go:从 Git 仓库安装技能skills/clawhub_registry.go:ClawHub 公共技能市场搜索
关键调用链
消息处理主流程
Channel.OnMessage()
→ bus.Publish(InboundMessage)
→ AgentLoop.processMessage()
→ resolveMessageRoute() // 路由到目标 Agent
→ agent.Sessions.Load() // 加载会话历史
→ agent.ContextBuilder.Build() // 构建系统提示词
→ runAgentLoop() // 进入 LLM 循环
→ selectCandidates() // 选择 Provider(Smart Routing)
→ runLLMIteration() // 调用 LLM
→ FallbackChain.Chat() // 带故障转移的 LLM 调用
→ parseToolCalls() // 解析工具调用
→ tools.Execute() // 执行工具
→ (循环直到无工具调用或达到最大迭代)
→ maybeSummarize() // 可能触发上下文摘要
→ bus.Publish(OutboundMessage) // 发送响应
上下文构建
ContextBuilder.Build()
→ 读取 AGENTS.md(Agent 指令)
→ 读取 SOUL.md(人格定义)
→ 读取 USER.md(用户画像)
→ 读取 TOOLS.md(工具使用说明)
→ 读取 MEMORY.md(长期记忆)
→ 加载已安装 Skills 的 SKILL.md
→ 注入运行时上下文(时间、渠道、ChatID)
→ 组装为 system prompt
跨切面关注点
认证
OAuth 2.0 + PKCE 流程(
pkg/auth/)凭证加密存储(
pkg/credential/,支持 ChaCha20-Poly1305)每个渠道独立的
allow_from白名单
日志
结构化日志(
pkg/logger/)可配置日志级别
错误处理
Provider 层:
FailoverError分类 + 自动重试渠道层:
pkg/channels/errors.go统一错误类型工具层:
ToolResult包含 success/error 状态
配置管理
JSON 配置文件(
config.json)环境变量覆盖(
caarlos0/env)配置版本迁移(
pkg/config/migration.go)运行时热重载(Provider + 配置)
安全
文件系统沙箱(
restrict_to_workspace)路径白名单(
allow_read_paths/allow_write_paths)Shell 命令危险操作拦截
SSRF 防护(网络工具内置黑名单)
会话隔离(不同用户/渠道独立会话)