跳到主内容
创建时间:最后更新:作者:白川

根据任务选择执行分支

分别使用明确规则和模型分类选择处理分支,校验路由结果并拒绝未知类型。

根据任务选择执行分支

并非所有请求都需要走同一条路径。解释代码需要模型生成文字,检查文件是否包含函数声明则可以先用确定性代码完成。本篇让一个入口选择不同分支。

沿用顺序工作流中的项目、connection.ts、model.ts 和 lesson.ts。默认规则路由不需要模型分类。

路由先返回有限选项

本例只有 explain 和 check 两个分支。使用可枚举的类型,意味着“无法判断”可以明确处理,而不是把任意字符串拼成函数名执行。

创建 src/routing.ts:

typescript
import { readLesson } from "./lesson.js"
import { askModel } from "./model.js"

type Route = "explain" | "check"
export function validateRoute(value: string): Route {
  if (value !== "explain" && value !== "check") {
    throw new Error("无法确定任务类型,请选择 explain 或 check")
  }
  return value
}

export async function runRoute(task: string, signal: AbortSignal) {
  // 默认使用明确规则;ROUTER=model 时才让模型分类,并校验输出枚举。
  const candidate =
    process.env.ROUTER === "model"
      ? await askModel(`只返回 explain 或 check。任务:${task}`, signal)
      : task
  const route = validateRoute(candidate.trim())
  const input = await readLesson(signal)
  if (route === "check") {
    return { route, hasFunction: /function\s+/.test(input.source) }
  }
  const report = await askModel(`解释以下代码:\n${input.source}`, signal)
  return { route, report }
}

创建 src/route-main.ts:

typescript
import { runRoute } from "./routing.js"

const task = process.argv[2] || "explain"
console.log(await runRoute(task, AbortSignal.timeout(30_000)))

分别运行:

bash
node --env-file=.env --import tsx src/route-main.ts explain
node --env-file=.env --import tsx src/route-main.ts check
node --env-file=.env --import tsx src/route-main.ts unknown

前两条应进入对应分支,最后一条应报告无法确定类型。check 分支只检查简单声明模式,不需要生成报告;这能让你观察到路由确实改变了执行路径。

什么时候让模型分类

输入已经是按钮、菜单或明确命令时,优先使用确定规则。用户提供自然语言且类别判断需要理解时,可以让模型给出候选路由,但程序仍然决定是否接受。

在 .env 中设置 ROUTER=model,入口会先请求模型分类,再运行同一份枚举检查。教学模拟固定返回 explain,只用于检查连接过程;不能证明它能正确理解任意任务。

本例直接检查一个枚举字符串,便于看清控制流。如果路由还需要置信度、参数和证据,应使用结构化输出校验,不要通过 includes('check') 从一大段解释中猜类别。

错误的类别不能自动变成默认分支

未知类别应要求补充或交给人工,而不是悄悄执行一个可能产生副作用的分支。模型分类超时也不能假装“默认通过”。

示例先校验路由,再读取文件和进入分支。这样无效输入不会启动无关动作。未来增加保存或执行命令时,也应在相应动作之前检查权限与参数,不能认为通过路由就自动获得执行授权。

检查每个分支的真实职责

打印的 route 可以与任务输入核对。真实模型模式下,分类和解释可能产生两次模型请求,成本与失败点也随之增加。不要为了统一形式,把本来可以用一个条件判断完成的流程全部改成模型调用。

当分支里出现多个独立检查时,可以继续学习并行执行与汇总。

参考资料