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 配置。模型从不看到路由逻辑。
分类是可插拔的
通过插件配置可以添加新分类,无需修改核心系统。每个分类指定了模型、温度、工具和系统提示词覆盖。