@swoosh-dev/judge
v0.2.0
Published
Dynamic routing policies for @swoosh-dev/router — classify the prompt with an LLM judge (structured output) and route accordingly.
Readme
@swoosh-dev/judge
Dynamic routing policies for @swoosh-dev/router. Classify each request's prompt with an LLM judge (structured output), then route by the verdict — cheap models for small talk, top models for hard problems, search-capable models for current events.
npm install @swoosh-dev/judgeimport { ModelRouter } from "@swoosh-dev/router";
import { byBenchmark } from "@swoosh-dev/router";
import { llmJudgePolicy } from "@swoosh-dev/judge";
type Kind = "chat" | "coding" | "research";
const smart = llmJudgePolicy<Kind>({
// Your structured-output classifier — route the judge through a cheap model.
classify: ({ prompt }) => judge.generateObject({ schema: KindSchema, prompt }),
route: {
chat: "cheapest",
coding: byBenchmark("swe_bench"),
research: ({ candidates }) => candidates.filter((c) => c.capability.features.includes("web_search")),
},
fallback: "balanced", // used if classify throws or returns an unmapped verdict
});
await router.run({ ...request, preference: smart });How it works
llmJudgePolicy returns an ordinary RoutingPolicy — async, since it awaits your classifier. The verdict picks a base preference/policy from route; the result is still a ranked candidate list, so fallback, constraints, and plan() inspection all work unchanged. plan.preference reports "custom".
- You supply the judge.
classifyis your call (sync or async). The package adds no LLM dependency — route the judge itself through a cheap swoosh model if you like. - Verdicts are cached by prompt signature (the judge costs latency + tokens). On by default;
cache: falseto disable, orcache: { key, max }to tune. - Best-effort prompt. The classifier receives
{ prompt, request }, wherepromptisrequest.promptif present, else a stringifiedrequest.input— so it works withplan,run, andrunText.
Options
| Field | Type | Notes |
| --- | --- | --- |
| classify | (input) => Verdict \| Promise<Verdict> | Your structured-output classifier. |
| route | Record<Verdict, RoutingPreference \| RoutingPolicy> | Verdict → base ranking. |
| fallback | RoutingPreference \| RoutingPolicy | On error/unmapped verdict. Defaults to "balanced". |
| cache | boolean \| { key?, max? } | Cache verdicts by prompt. Defaults to on. |
