goose/source-notesupstream ↗
goose · version 1.45.0 · Rust 1.94.1

goose 源码拆解:先建立一张地图

goose 的核心不是“聊天窗口”,而是一台可以被 CLI、桌面端、ACP 客户端、调度器和 SDK 共同驱动的 Agent Runtime。一次用户输入会穿过四条边界:

  1. 宿主边界:CLI 或桌面端把输入转换为 Message,并监听 AgentEvent
  2. 运行时边界Agent::reply 管理 session、命令、压缩和回复流。
  3. 能力边界:Provider 负责模型调用,ExtensionManager 负责 MCP 工具。
  4. 持久化边界: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。

源码导航

领域关键路径关键符号
Agentcrates/goose/src/agents/agent.rsAgent, reply, reply_internal, AgentEvent
消息crates/goose-provider-types/src/conversation/Message, MessageContentBlock, Conversation
Providercrates/goose-provider-types/src/base.rsProvider, MessageStream, ProviderMetadata
MCPcrates/goose/src/agents/extension_manager.rsExtensionManager, dispatch_tool_call
安全crates/goose/src/tool_inspection.rssecurity/ToolInspector, InspectionAction
上下文crates/goose/src/context_mgmt/check_if_compaction_needed, compact_messages
存储crates/goose/src/session/session_manager.rsSession, SessionStorage, schema version 15
工作流crates/goose/src/recipe/skills/scheduler.rsRecipe, Skill, scheduler
宿主协议crates/goose/src/acp/crates/goose-sdk*ACP server、custom requests/notifications

后续每章的“源码定位”都给出足够窄的路径,建议在阅读时用符号搜索,而不是从 agent.rs 的数千行头读到尾。