首页
首页/s05
s0575 行代码

Task Categories

Category Is the Router

核心洞察:

Routing tasks by category decouples intent from implementation.

任务在执行前按类别分类。每个类别(quick、deep、visual-engineering、artistry 等)都映射到针对该工作类型优化的 agent 配置。模型不感知路由逻辑的存在,只接收对应类别的系统提示和工具集。

架构流程图

问题:一刀切并不适用所有场景

单一的 agent 配置无法对所有任务达到最优。简单的编辑需要速度和低延迟,而深层的架构工作需要强大的推理能力和更丰富的上下文。对所有任务使用相同的模型和工具,既在简单任务上浪费 tokens,又在复杂任务上力不从心。解决方案是分类系统:在执行前对任务分类,再路由到专门配置。每个分类指定自己的模型、温度、工具集和系统提示。调度过程对模型完全透明,它只需接收正确的配置即可执行。

分类器设计:启发式优于模型调用

classifyInput() 函数采用基于规则的启发式方法,而非调用另一个 LLM 来判断。任务长度、关键词、正在编辑的文件类型,以及是否存在 'refactor' 或 'add test' 等特定模式,共同决定了分类结果。这使分类过程瞬时完成且零成本。分类器本身也是可插拔的:插件可以添加新类别,也可覆盖现有类别的分类规则。

真实实现:通过插件系统的 Agent 选择

在 opencode 的实际代码库中,agent 的选择依赖插件系统而非路由表。Agent 通过插件钩子注册(build、plan、general、explore、compaction、title、summary),每种 agent 由其模式(primary、subagent、all)和 hidden 布尔值区分。Web 应用 UI 中的 'categories' 概念仅服务于命令面板的组织。核心运行时按模式而非类别选择 agent。任务级别的路由通过 agent 层次结构实现:build agent(默认 primary)根据任务描述将工作分派给 explore 或 oracle 等子代理。

设计决策

温度随类别而变化。快速任务使用较高温度以激发创造性和发散思维,深度任务则使用较低温度以保证专注和精确。这是控制模型行为的一种廉价而有效的手段。

每个类别的工具可用性受到限制。'quick' agent 不具备写入权限,只能读取和编辑已有文件。这是在权限门之外又增加了一层安全边界。

对比 Claude Code

Claude Code 在内部将任务路由到合适的配置,但不暴露路由机制。OpenCode 的 CATEGORIES 映射是一个显式且可配置的路由表。它通过输入分析对任务进行分类,并按类别选择模型、工具集和系统提示(视觉类任务分配视觉模型,编码类任务分配代码模型,依此类推)。这种配置驱动的方式使 agent 能够适应不同的任务领域,而无需更改代码。

深入设计决策

分类优先的调度

任务在执行前按分类归类,每种分类映射到针对该类型工作优化的 agent 配置。模型从不看到路由逻辑。

备选方案: 单个通用 agent 可以处理所有事情,但针对不同领域的专业化配置能产生更好的结果。

分类是可插拔的

通过插件配置可以添加新分类,无需修改核心系统。每个分类指定了模型、温度、工具和系统提示词覆盖。

备选方案: 硬编码的分类更简单,但限制了可扩展性。插件定义的分类保持核心稳定,同时允许无限的专业化。

Learn OpenCode — Built with Next.js