# 《Crush 从入门到精通》第十三章:Agent 核心机制
## SessionAgent 接口
```go
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
│
▼
返回最终结果
```
---
## 提示词工程
### 提示词模板
```go
// Coder Agent 提示词模板
var coderPromptTmpl = `
# 角色
你是一个专业的软件工程师助手,擅长编写、调试和优化代码。
# 能力
- 使用提供的工具进行文件操作
- 执行 Shell 命令
- 理解代码结构和逻辑
# 约束
- 始终遵循最小权限原则
- 在执行破坏性操作前请求确认
- 提供清晰的操作说明
# 当前环境
{{.WorkingDir}}
{{.ContextInfo}}
`
```
### 动态上下文注入
```go
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 条回复还没有人回复,快来发表你的看法吧!