Appearance
Copilot SDK 支持在 Agent 执行过程中发送消息:steering 模式立即注入当前 turn(适合紧急纠错),queueing 模式排队等当前任务完成后处理(适合追加任务)。默认推荐用 queueing,避免频繁打断 Agent 导致混乱。
GitHub Copilot SDK Steering 与 Queueing:中途引导和任务排队
两种发送模式
| 模式 | 时机 | 适合场景 |
|---|---|---|
| Steering(立即注入) | 注入当前 LLM turn | 紧急纠错、方向跑偏时 |
| Queueing(排队处理) | 当前任务完成后处理 | 追加后续任务、有序工作流 |
Steering:立即打断引导
适合 Agent 正在朝错误方向走时,需要立刻纠正:
typescript
// Agent 正在执行任务...
// 中途发现方向跑偏,立即注入修正指令
await session.sendPrompt({
messages: [
{ role: 'user', content: '注意:不要修改 config/ 目录下的任何文件,只改 src/' }
],
mode: 'steering' // 立即注入当前 turn
})使用场景:
- Agent 准备修改不应该改的文件
- Agent 使用了错误的 API 方法
- 需要补充关键约束条件("别忘了要兼容 Node 16")
Queueing:排队等待处理
适合给 Agent 安排后续任务,保持有序执行:
typescript
// 发送第一个任务
await session.sendPrompt({
messages: [{ role: 'user', content: '先修复这个 Bug' }]
})
// 在 Agent 处理第一个任务时,排队第二个任务
await session.sendPrompt({
messages: [{ role: 'user', content: 'Bug 修复完成后,运行一遍测试' }],
mode: 'queueing' // 等第一个任务完成后再处理
})
// 继续排队更多任务
await session.sendPrompt({
messages: [{ role: 'user', content: '测试通过后,更新 CHANGELOG.md' }],
mode: 'queueing'
})Agent 会按顺序处理:修复 Bug → 运行测试 → 更新 CHANGELOG。
空闲时两种模式等效
当 Agent 处于空闲状态(session.idle 事件后),steering 和 queueing 都会立即开始新的 turn,效果相同。模式区别只在 Agent 正在执行任务时才有意义。
最佳实践
1. 默认用 Queueing:大多数场景应该排队,让 Agent 完成当前任务后再处理新指令,避免打断造成上下文混乱。
2. Steering 只用于紧急纠正:当 Agent 正在做错误的事情,且等待到任务完成再纠正代价太高时,才用 Steering。
3. 不要过度 Steer:频繁 Steering 会打断 Agent 的思考过程,可能导致响应质量下降或状态混乱。
typescript
// 反例:频繁 Steering 导致混乱
// 不要这样做
await session.sendPrompt({ messages: [{...}], mode: 'steering' })
await session.sendPrompt({ messages: [{...}], mode: 'steering' })
await session.sendPrompt({ messages: [{...}], mode: 'steering' })
// 推荐:一次发送多个指令或使用 queueing
await session.sendPrompt({ messages: [{...}], mode: 'queueing' })与 Copilot CLI 实时引导的对比
Copilot CLI(GitHub.com Agents 面板)的"实时引导提示词"对应 Steering 模式;在会话完成后在 PR 中 @copilot 发送新任务对应 Queueing 模式的逻辑。
常见问题
Q: Steering 消息发送后,Agent 会立即停止当前操作吗?
A: 不会立刻停止,Steering 消息注入到当前 LLM turn,Agent 在当前步骤完成后会考虑新的引导。对于需要强制停止的场景,使用 session.stop() 方法。
Q: 可以同时有多条 Queueing 消息待处理吗?
A: 可以。Queue 中的消息按发送顺序排列,Agent 依次处理完每条消息后继续下一条。
Q: 如何知道 Queue 中的消息已经被处理?
A: 每条 Queueing 消息处理完成后,会触发 session.idle 事件,然后开始下一条消息(触发新的 turn 事件)。