goose · version 1.45.0 · Rust 1.94.1
goose 源码拆解:先建立一张地图
goose 的核心不是“聊天窗口”,而是一台可以被 CLI、桌面端、ACP 客户端、调度器和 SDK 共同驱动的 Agent Runtime。一次用户输入会穿过四条边界:
- 宿主边界:CLI 或桌面端把输入转换为
Message,并监听AgentEvent。 - 运行时边界:
Agent::reply管理 session、命令、压缩和回复流。 - 能力边界:Provider 负责模型调用,ExtensionManager 负责 MCP 工具。
- 持久化边界:SessionManager 把消息、配置、用量和工作流状态落到 SQLite。
flowchart LR User[用户 / 自动化触发器] --> Host[CLI / Desktop / ACP / Gateway] Host -->|Message + SessionConfig| Agent[goose::agents::Agent] Agent --> Provider[Provider trait] Agent --> Extensions[ExtensionManager] Extensions --> MCP[MCP stdio / HTTP / builtin / platform] Agent --> Session[SessionManager] Session --> SQLite[(sessions.db)] Provider --> Models[OpenAI / Anthropic / ACP / Ollama / ...]
本教程的阅读顺序是“先看心跳,再看器官”:先理解 Agent Loop,再理解 Provider、Message、Tool、Security 和 Context,最后回到产品表面与运维。这样能避免把三十多个 provider 文件误读成三十套 Agent。
源码导航
| 领域 | 关键路径 | 关键符号 |
| Agent | crates/goose/src/agents/agent.rs | Agent, reply, reply_internal, AgentEvent |
| 消息 | crates/goose-provider-types/src/conversation/ | Message, MessageContentBlock, Conversation |
| Provider | crates/goose-provider-types/src/base.rs | Provider, MessageStream, ProviderMetadata |
| MCP | crates/goose/src/agents/extension_manager.rs | ExtensionManager, dispatch_tool_call |
| 安全 | crates/goose/src/tool_inspection.rs、security/ | ToolInspector, InspectionAction |
| 上下文 | crates/goose/src/context_mgmt/ | check_if_compaction_needed, compact_messages |
| 存储 | crates/goose/src/session/session_manager.rs | Session, SessionStorage, schema version 15 |
| 工作流 | crates/goose/src/recipe/、skills/、scheduler.rs | Recipe, Skill, scheduler |
| 宿主协议 | crates/goose/src/acp/、crates/goose-sdk* | ACP server、custom requests/notifications |
后续每章的“源码定位”都给出足够窄的路径,建议在阅读时用符号搜索,而不是从 agent.rs 的数千行头读到尾。