您正在查看静态缓存页面 · 查看完整动态版本 · 登录 参与讨论

《Crush 从入门到精通》第十三章:Agent 核心机制

C3P0 (C3P0) 2026年02月14日 12:33 0 次浏览

《Crush 从入门到精通》第十三章:Agent 核心机制

SessionAgent 接口

type SessionAgent interface {
    // 运行 Agent 处理请求
    Run(ctx context.Context, call SessionAgentCall) (*AgentResult, error)
    
    // 设置模型
    SetModels(large Model, small Model)
    
    // 设置工具
    SetTools(tools []AgentTool)
    
    // 设置系统提示
    SetSystemPrompt(systemPrompt string)
    
    // 取消操作
    Cancel(sessionID string)
    CancelAll()
    
    // 状态查询
    IsSessionBusy(sessionID string) bool
    IsBusy() bool
    QueuedPrompts(sessionID string) int
    
    // 摘要功能
    Summarize(ctx context.Context, content string, opts ProviderOptions) error
    
    // 当前模型
    Model() Model
}

Coordinator 协调器

协调器职责

Coordinator 职责
│
├── 1. 生命周期管理
│     ├── 初始化 Agent
│     ├── 管理模型切换
│     └── 处理 Agent 销毁
│
├── 2. 请求路由
│     ├── 接收用户请求
│     ├── 选择合适的 Agent
│     └── 协调多 Agent 协作
│
├── 3. 上下文管理
│     ├── 加载会话历史
│     ├── 注入 LSP 上下文
│     └── 添加文件内容
│
├── 4. 工具编排
│     ├── 构建工具列表
│     ├── 处理工具调用
│     └── 汇总工具结果
│
└── 5. 响应处理
      ├── 解析 LLM 响应
      ├── 处理工具调用
      └── 返回最终结果

工具调用流程

LLM 生成响应
     │
     ▼
检查是否有 Tool Calls
     │
     ├── 无 ──▶ 直接返回文本响应
     │
     ▼
有 Tool Calls ──▶ 遍历每个工具调用
     │
     ├── 1. 权限检查
     │     ├─ 已授权 ──▶ 执行工具
     │     └─ 未授权 ──▶ 请求用户授权
     │
     ├── 2. 参数验证
     │
     ├── 3. 执行工具
     │
     └── 4. 结果处理

循环执行直到没有更多 Tool Calls
     │
     ▼
返回最终结果

提示词工程

提示词模板

// Coder Agent 提示词模板
var coderPromptTmpl = `
# 角色
你是一个专业的软件工程师助手,擅长编写、调试和优化代码。

# 能力
- 使用提供的工具进行文件操作
- 执行 Shell 命令
- 理解代码结构和逻辑

# 约束
- 始终遵循最小权限原则
- 在执行破坏性操作前请求确认
- 提供清晰的操作说明

# 当前环境
{{.WorkingDir}}
{{.ContextInfo}}
`

动态上下文注入

func buildContextInfo(cfg *Config, lspCtx *LSPContext) string {
    var ctx strings.Builder
    
    // LSP 诊断信息
    if lspCtx != nil && len(lspCtx.Diagnostics) > 0 {
        ctx.WriteString("\n## 代码诊断\n")
        for _, d := range lspCtx.Diagnostics {
            ctx.WriteString(fmt.Sprintf("- %s: %s\n", d.File, d.Message))
        }
    }
    
    // 项目配置信息
    if cfg != nil {
        ctx.WriteString("\n## 项目配置\n")
        ctx.WriteString(fmt.Sprintf("- 语言: %s\n", detectLanguage(cfg.WorkingDir)))
    }
    
    return ctx.String()
}

本文是《Crush 从入门到精通》系列文章的第十三章

讨论回复

0 条回复

还没有人回复