@duetso/agent 0.2.2 → 0.2.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +19 -11
- package/dist/package.json +4 -4
- package/dist/src/cli/config.d.ts +10 -0
- package/dist/src/cli/config.d.ts.map +1 -0
- package/dist/src/cli/config.js +24 -0
- package/dist/src/cli/config.js.map +1 -0
- package/dist/src/cli/help.d.ts.map +1 -1
- package/dist/src/cli/help.js +11 -9
- package/dist/src/cli/help.js.map +1 -1
- package/dist/src/cli/inline-slash.d.ts +2 -1
- package/dist/src/cli/inline-slash.d.ts.map +1 -1
- package/dist/src/cli/inline-slash.js +14 -5
- package/dist/src/cli/inline-slash.js.map +1 -1
- package/dist/src/cli/memory-query.d.ts +1 -1
- package/dist/src/cli/model.d.ts +1 -1
- package/dist/src/cli/model.d.ts.map +1 -1
- package/dist/src/cli/model.js +1 -1
- package/dist/src/cli/model.js.map +1 -1
- package/dist/src/cli/route.d.ts +84 -0
- package/dist/src/cli/route.d.ts.map +1 -0
- package/dist/src/cli/route.js +261 -0
- package/dist/src/cli/route.js.map +1 -0
- package/dist/src/cli/rpc.d.ts +43 -2
- package/dist/src/cli/rpc.d.ts.map +1 -1
- package/dist/src/cli/rpc.js +176 -23
- package/dist/src/cli/rpc.js.map +1 -1
- package/dist/src/cli/run.d.ts +8 -1
- package/dist/src/cli/run.d.ts.map +1 -1
- package/dist/src/cli/run.js +24 -7
- package/dist/src/cli/run.js.map +1 -1
- package/dist/src/cli/shared.d.ts +4 -3
- package/dist/src/cli/shared.d.ts.map +1 -1
- package/dist/src/cli/shared.js +3 -4
- package/dist/src/cli/shared.js.map +1 -1
- package/dist/src/cli/shutdown.d.ts +4 -2
- package/dist/src/cli/shutdown.d.ts.map +1 -1
- package/dist/src/cli/shutdown.js +4 -2
- package/dist/src/cli/shutdown.js.map +1 -1
- package/dist/src/cli.d.ts +2 -0
- package/dist/src/cli.d.ts.map +1 -1
- package/dist/src/cli.js +12 -0
- package/dist/src/cli.js.map +1 -1
- package/dist/src/core/structured-output.d.ts +2 -0
- package/dist/src/core/structured-output.d.ts.map +1 -1
- package/dist/src/core/structured-output.js +1 -0
- package/dist/src/core/structured-output.js.map +1 -1
- package/dist/src/lib/system-reminder.d.ts +14 -0
- package/dist/src/lib/system-reminder.d.ts.map +1 -0
- package/dist/src/lib/system-reminder.js +53 -0
- package/dist/src/lib/system-reminder.js.map +1 -0
- package/dist/src/lib/walk-ancestors.d.ts +9 -0
- package/dist/src/lib/walk-ancestors.d.ts.map +1 -0
- package/dist/src/lib/walk-ancestors.js +28 -0
- package/dist/src/lib/walk-ancestors.js.map +1 -0
- package/dist/src/memory/observational-prompts.d.ts.map +1 -1
- package/dist/src/memory/observational-prompts.js +2 -1
- package/dist/src/memory/observational-prompts.js.map +1 -1
- package/dist/src/memory/observational.d.ts +31 -4
- package/dist/src/memory/observational.d.ts.map +1 -1
- package/dist/src/memory/observational.js +43 -4
- package/dist/src/memory/observational.js.map +1 -1
- package/dist/src/model-resolution/catalog.d.ts +2 -2
- package/dist/src/model-resolution/catalog.d.ts.map +1 -1
- package/dist/src/model-resolution/catalog.js +61 -33
- package/dist/src/model-resolution/catalog.js.map +1 -1
- package/dist/src/model-resolution/duet-gateway.d.ts +3 -3
- package/dist/src/model-resolution/duet-gateway.d.ts.map +1 -1
- package/dist/src/model-resolution/duet-gateway.js +119 -19
- package/dist/src/model-resolution/duet-gateway.js.map +1 -1
- package/dist/src/model-resolution/model-gateway.d.ts.map +1 -0
- package/dist/src/{cli → model-resolution}/model-gateway.js +10 -6
- package/dist/src/model-resolution/model-gateway.js.map +1 -0
- package/dist/src/model-resolution/resolver.d.ts +11 -4
- package/dist/src/model-resolution/resolver.d.ts.map +1 -1
- package/dist/src/model-resolution/resolver.js +39 -8
- package/dist/src/model-resolution/resolver.js.map +1 -1
- package/dist/src/model-routing/advisor-transcript.d.ts +36 -0
- package/dist/src/model-routing/advisor-transcript.d.ts.map +1 -0
- package/dist/src/model-routing/advisor-transcript.js +103 -0
- package/dist/src/model-routing/advisor-transcript.js.map +1 -0
- package/dist/src/model-routing/advisor.d.ts +27 -0
- package/dist/src/model-routing/advisor.d.ts.map +1 -0
- package/dist/src/model-routing/advisor.js +20 -0
- package/dist/src/model-routing/advisor.js.map +1 -0
- package/dist/src/model-routing/classifier.d.ts +57 -0
- package/dist/src/model-routing/classifier.d.ts.map +1 -0
- package/dist/src/model-routing/classifier.js +63 -0
- package/dist/src/model-routing/classifier.js.map +1 -0
- package/dist/src/model-routing/loader.d.ts +48 -0
- package/dist/src/model-routing/loader.d.ts.map +1 -0
- package/dist/src/model-routing/loader.js +79 -0
- package/dist/src/model-routing/loader.js.map +1 -0
- package/dist/src/model-routing/prompts.d.ts +22 -0
- package/dist/src/model-routing/prompts.d.ts.map +1 -0
- package/dist/src/model-routing/prompts.js +87 -0
- package/dist/src/model-routing/prompts.js.map +1 -0
- package/dist/src/model-routing/resolve.d.ts +40 -0
- package/dist/src/model-routing/resolve.d.ts.map +1 -0
- package/dist/src/model-routing/resolve.js +76 -0
- package/dist/src/model-routing/resolve.js.map +1 -0
- package/dist/src/model-routing/router.d.ts +149 -0
- package/dist/src/model-routing/router.d.ts.map +1 -0
- package/dist/src/model-routing/router.js +235 -0
- package/dist/src/model-routing/router.js.map +1 -0
- package/dist/src/model-routing/step-triggers.d.ts +27 -0
- package/dist/src/model-routing/step-triggers.d.ts.map +1 -0
- package/dist/src/model-routing/step-triggers.js +20 -0
- package/dist/src/model-routing/step-triggers.js.map +1 -0
- package/dist/src/model-routing/table.d.ts +126 -0
- package/dist/src/model-routing/table.d.ts.map +1 -0
- package/dist/src/model-routing/table.js +351 -0
- package/dist/src/model-routing/table.js.map +1 -0
- package/dist/src/session/session.d.ts +40 -23
- package/dist/src/session/session.d.ts.map +1 -1
- package/dist/src/session/session.js +173 -97
- package/dist/src/session/session.js.map +1 -1
- package/dist/src/tasks/quiescence.d.ts +13 -0
- package/dist/src/tasks/quiescence.d.ts.map +1 -0
- package/dist/src/tasks/quiescence.js +11 -0
- package/dist/src/tasks/quiescence.js.map +1 -0
- package/dist/src/tasks/task-manager.d.ts +101 -0
- package/dist/src/tasks/task-manager.d.ts.map +1 -0
- package/dist/src/tasks/task-manager.js +311 -0
- package/dist/src/tasks/task-manager.js.map +1 -0
- package/dist/src/tasks/types.d.ts +85 -0
- package/dist/src/tasks/types.d.ts.map +1 -0
- package/dist/src/tasks/types.js +2 -0
- package/dist/src/tasks/types.js.map +1 -0
- package/dist/src/tui/app.d.ts +1 -1
- package/dist/src/tui/app.d.ts.map +1 -1
- package/dist/src/tui/app.js +12 -2
- package/dist/src/tui/app.js.map +1 -1
- package/dist/src/tui/initial-prompt.d.ts.map +1 -1
- package/dist/src/tui/initial-prompt.js +0 -3
- package/dist/src/tui/initial-prompt.js.map +1 -1
- package/dist/src/tui/session-subscription.d.ts +3 -0
- package/dist/src/tui/session-subscription.d.ts.map +1 -1
- package/dist/src/tui/session-subscription.js +29 -5
- package/dist/src/tui/session-subscription.js.map +1 -1
- package/dist/src/tui/sidebar.d.ts +3 -0
- package/dist/src/tui/sidebar.d.ts.map +1 -1
- package/dist/src/tui/sidebar.js +19 -3
- package/dist/src/tui/sidebar.js.map +1 -1
- package/dist/src/tui/slash-commands.d.ts +12 -9
- package/dist/src/tui/slash-commands.d.ts.map +1 -1
- package/dist/src/tui/slash-commands.js +48 -10
- package/dist/src/tui/slash-commands.js.map +1 -1
- package/dist/src/tui/status-controller.d.ts +14 -9
- package/dist/src/tui/status-controller.d.ts.map +1 -1
- package/dist/src/tui/status-controller.js +26 -7
- package/dist/src/tui/status-controller.js.map +1 -1
- package/dist/src/tui/task-lane-renderer.d.ts +30 -0
- package/dist/src/tui/task-lane-renderer.d.ts.map +1 -0
- package/dist/src/tui/task-lane-renderer.js +93 -0
- package/dist/src/tui/task-lane-renderer.js.map +1 -0
- package/dist/src/tui/task-tree.d.ts +47 -0
- package/dist/src/tui/task-tree.d.ts.map +1 -0
- package/dist/src/tui/task-tree.js +190 -0
- package/dist/src/tui/task-tree.js.map +1 -0
- package/dist/src/tui/tool-formatters.js +3 -0
- package/dist/src/tui/tool-formatters.js.map +1 -1
- package/dist/src/turn-runner/agent-events.d.ts.map +1 -1
- package/dist/src/turn-runner/agent-events.js +1 -0
- package/dist/src/turn-runner/agent-events.js.map +1 -1
- package/dist/src/turn-runner/duration.d.ts +2 -2
- package/dist/src/turn-runner/duration.js +3 -3
- package/dist/src/turn-runner/duration.js.map +1 -1
- package/dist/src/turn-runner/prompts.d.ts +5 -1
- package/dist/src/turn-runner/prompts.d.ts.map +1 -1
- package/dist/src/turn-runner/prompts.js +30 -6
- package/dist/src/turn-runner/prompts.js.map +1 -1
- package/dist/src/turn-runner/runtime-clock.d.ts +20 -0
- package/dist/src/turn-runner/runtime-clock.d.ts.map +1 -0
- package/dist/src/turn-runner/runtime-clock.js +38 -0
- package/dist/src/turn-runner/runtime-clock.js.map +1 -0
- package/dist/src/turn-runner/shell-state-handle.d.ts +0 -3
- package/dist/src/turn-runner/shell-state-handle.d.ts.map +1 -1
- package/dist/src/turn-runner/shell-state-handle.js +5 -55
- package/dist/src/turn-runner/shell-state-handle.js.map +1 -1
- package/dist/src/turn-runner/skill-context.d.ts +6 -7
- package/dist/src/turn-runner/skill-context.d.ts.map +1 -1
- package/dist/src/turn-runner/skill-context.js +10 -10
- package/dist/src/turn-runner/skill-context.js.map +1 -1
- package/dist/src/turn-runner/skills.d.ts.map +1 -1
- package/dist/src/turn-runner/skills.js +2 -22
- package/dist/src/turn-runner/skills.js.map +1 -1
- package/dist/src/turn-runner/state-compaction.d.ts +7 -5
- package/dist/src/turn-runner/state-compaction.d.ts.map +1 -1
- package/dist/src/turn-runner/state-compaction.js +69 -10
- package/dist/src/turn-runner/state-compaction.js.map +1 -1
- package/dist/src/turn-runner/state-machine-decisions.d.ts +135 -0
- package/dist/src/turn-runner/state-machine-decisions.d.ts.map +1 -0
- package/dist/src/turn-runner/state-machine-decisions.js +443 -0
- package/dist/src/turn-runner/state-machine-decisions.js.map +1 -0
- package/dist/src/turn-runner/state-machine-session.d.ts +13 -28
- package/dist/src/turn-runner/state-machine-session.d.ts.map +1 -1
- package/dist/src/turn-runner/state-machine-session.js +18 -55
- package/dist/src/turn-runner/state-machine-session.js.map +1 -1
- package/dist/src/turn-runner/subagent.d.ts +156 -0
- package/dist/src/turn-runner/subagent.d.ts.map +1 -0
- package/dist/src/turn-runner/subagent.js +164 -0
- package/dist/src/turn-runner/subagent.js.map +1 -0
- package/dist/src/turn-runner/task-tools.d.ts +76 -0
- package/dist/src/turn-runner/task-tools.d.ts.map +1 -0
- package/dist/src/turn-runner/task-tools.js +370 -0
- package/dist/src/turn-runner/task-tools.js.map +1 -0
- package/dist/src/turn-runner/tools.d.ts +65 -17
- package/dist/src/turn-runner/tools.d.ts.map +1 -1
- package/dist/src/turn-runner/tools.js +173 -59
- package/dist/src/turn-runner/tools.js.map +1 -1
- package/dist/src/turn-runner/turn-runner.d.ts +198 -134
- package/dist/src/turn-runner/turn-runner.d.ts.map +1 -1
- package/dist/src/turn-runner/turn-runner.js +1302 -713
- package/dist/src/turn-runner/turn-runner.js.map +1 -1
- package/dist/src/turn-runner/usage-accounting.d.ts +4 -0
- package/dist/src/turn-runner/usage-accounting.d.ts.map +1 -1
- package/dist/src/turn-runner/usage-accounting.js +19 -0
- package/dist/src/turn-runner/usage-accounting.js.map +1 -1
- package/dist/src/types/config.d.ts +9 -1
- package/dist/src/types/config.d.ts.map +1 -1
- package/dist/src/types/config.js +2 -1
- package/dist/src/types/config.js.map +1 -1
- package/dist/src/types/protocol.d.ts +110 -30
- package/dist/src/types/protocol.d.ts.map +1 -1
- package/dist/src/types/state-machine.d.ts +10 -12
- package/dist/src/types/state-machine.d.ts.map +1 -1
- package/dist/src/types/state-machine.js.map +1 -1
- package/package.json +4 -4
- package/dist/src/cli/model-gateway.d.ts.map +0 -1
- package/dist/src/cli/model-gateway.js.map +0 -1
- package/dist/src/turn-runner/state-machine-controller.d.ts +0 -140
- package/dist/src/turn-runner/state-machine-controller.d.ts.map +0 -1
- package/dist/src/turn-runner/state-machine-controller.js +0 -501
- package/dist/src/turn-runner/state-machine-controller.js.map +0 -1
- /package/dist/src/{cli → model-resolution}/model-gateway.d.ts +0 -0
|
@@ -0,0 +1,149 @@
|
|
|
1
|
+
import type { ThinkingLevel } from "@earendil-works/pi-ai";
|
|
2
|
+
import type { ClassifierDecision, ClassifierInput, RouteTrigger } from "./classifier.js";
|
|
3
|
+
import { type ResolvedTarget, type RouteContext, type RouteResolutionCatalog } from "./resolve.js";
|
|
4
|
+
import type { RoutingTable } from "./table.js";
|
|
5
|
+
import { type StepObservation, type TurnFacts } from "./step-triggers.js";
|
|
6
|
+
/** Classifier seam kept independent from any agent runtime. */
|
|
7
|
+
export type RouteClassifier = (input: ClassifierInput, signal?: AbortSignal) => Promise<ClassifierDecision>;
|
|
8
|
+
/** Runtime inputs available when the router prepares a parent-agent turn. */
|
|
9
|
+
export interface RouterPrepareInput {
|
|
10
|
+
/** Bounded summary of the preceding user-visible turn. */
|
|
11
|
+
prevTurnHint?: string;
|
|
12
|
+
/** Cancels classification without changing router state. */
|
|
13
|
+
signal?: AbortSignal;
|
|
14
|
+
}
|
|
15
|
+
/** An actual concrete-model or reasoning-effort change selected by the router. */
|
|
16
|
+
export interface RouterSwitch {
|
|
17
|
+
/** Virtual tier whose policy selected the target. */
|
|
18
|
+
tier: string;
|
|
19
|
+
/** Final route used after virtual resolution and general fallthrough. */
|
|
20
|
+
route: string;
|
|
21
|
+
/** Previous concrete catalog name. */
|
|
22
|
+
fromModel: string;
|
|
23
|
+
/** New concrete catalog name. */
|
|
24
|
+
toModel: string;
|
|
25
|
+
/** Route-owned reasoning effort applied with the new model. */
|
|
26
|
+
thinkingLevel: ThinkingLevel;
|
|
27
|
+
/** Runtime milestone that requested classification. */
|
|
28
|
+
trigger: RouteTrigger;
|
|
29
|
+
/** Classifier explanation for the selected route. */
|
|
30
|
+
rationale: string;
|
|
31
|
+
/** True when image capability applied the selected route's fallback model. */
|
|
32
|
+
visionFallback: boolean;
|
|
33
|
+
}
|
|
34
|
+
/** Advisor rate-floor decision measured only in completed parent assistant steps. */
|
|
35
|
+
export interface AdvisorGate {
|
|
36
|
+
/** Whether an ordinary advisor call may run at the current step. */
|
|
37
|
+
allowed: boolean;
|
|
38
|
+
/** Additional completed parent assistant steps required before a call is allowed. */
|
|
39
|
+
stepsUntilAllowed: number;
|
|
40
|
+
/** True when another consult already owns the session's advisor slot. */
|
|
41
|
+
inFlight?: boolean;
|
|
42
|
+
}
|
|
43
|
+
/** Complete read-only routing snapshot consumed by later CLI and TUI surfaces. */
|
|
44
|
+
export interface RouterStatus {
|
|
45
|
+
/** Virtual tier whose routing policy owns this session. */
|
|
46
|
+
tier: string;
|
|
47
|
+
/** Current concrete route, absent only before `initialTarget` is called. */
|
|
48
|
+
route?: string;
|
|
49
|
+
/** Current concrete catalog name, absent only before boot resolution. */
|
|
50
|
+
modelName?: string;
|
|
51
|
+
/** Current route-owned effort, absent only before boot resolution. */
|
|
52
|
+
thinkingLevel?: ThinkingLevel;
|
|
53
|
+
/** Most recent successful classifier explanation. */
|
|
54
|
+
lastRationale?: string;
|
|
55
|
+
/** Number of completed parent assistant messages observed by the router. */
|
|
56
|
+
assistantSteps: number;
|
|
57
|
+
/** Steps remaining before cadence classification; zero means classification is due. */
|
|
58
|
+
stepsUntilClassification: number;
|
|
59
|
+
/** True when virtual routing is suspended by a concrete model pin. */
|
|
60
|
+
pinned: boolean;
|
|
61
|
+
/** Whether this tier exposes the advisor tool. */
|
|
62
|
+
advisorEnabled: boolean;
|
|
63
|
+
/** Current step-based advisor floor. */
|
|
64
|
+
advisorGate: AdvisorGate;
|
|
65
|
+
/** Sticky facts learned from the current user turn's prompt and step outputs. */
|
|
66
|
+
facts: TurnFacts;
|
|
67
|
+
}
|
|
68
|
+
export interface ModelRouterOptions {
|
|
69
|
+
/** Complete routing table loaded for this project. */
|
|
70
|
+
table: RoutingTable;
|
|
71
|
+
/** Virtual tier selected for this session. */
|
|
72
|
+
tier: string;
|
|
73
|
+
/** Injected route classifier; production binds it to the table classifier target. */
|
|
74
|
+
classify: RouteClassifier;
|
|
75
|
+
/** Injected concrete-model capability lookup used by route resolution. */
|
|
76
|
+
resolveCatalog: RouteResolutionCatalog;
|
|
77
|
+
}
|
|
78
|
+
/**
|
|
79
|
+
* Session-local routing state machine. It owns all cadence and interlock policy;
|
|
80
|
+
* callers only report runtime facts and apply returned switches.
|
|
81
|
+
*/
|
|
82
|
+
export declare class ModelRouter {
|
|
83
|
+
private readonly table;
|
|
84
|
+
private readonly tier;
|
|
85
|
+
private readonly classify;
|
|
86
|
+
private readonly resolveCatalog;
|
|
87
|
+
private current?;
|
|
88
|
+
private assistantSteps;
|
|
89
|
+
private lastClassificationStep;
|
|
90
|
+
private firstClassificationPending;
|
|
91
|
+
private advisorClassificationPending;
|
|
92
|
+
private stepTriggerClassificationPending;
|
|
93
|
+
private compactionClassificationPending;
|
|
94
|
+
private lastAdvisorStep?;
|
|
95
|
+
private lastStepDelta?;
|
|
96
|
+
private currentTurnHint?;
|
|
97
|
+
private lastRationale?;
|
|
98
|
+
private pinned;
|
|
99
|
+
private advisorConsultInFlight;
|
|
100
|
+
private facts;
|
|
101
|
+
/** Precomputed: the tier has exactly one possible destination, so classification is skipped. */
|
|
102
|
+
private readonly singleDestination;
|
|
103
|
+
constructor(options: ModelRouterOptions);
|
|
104
|
+
/**
|
|
105
|
+
* True when every route in the tier resolves to one identical
|
|
106
|
+
* `{model, effort}` pair, so classification cannot change anything —
|
|
107
|
+
* every classifier call (turn start, cadence, step trigger, advisor
|
|
108
|
+
* milestone) is skipped for the session. Applied per-route vision fallbacks
|
|
109
|
+
* participate because they can add a distinct model/effort destination.
|
|
110
|
+
*/
|
|
111
|
+
private computeSingleDestination;
|
|
112
|
+
/** Resolve and retain the tier's general boot target before the first classifier call. */
|
|
113
|
+
initialTarget(context: RouteContext): ResolvedTarget;
|
|
114
|
+
/**
|
|
115
|
+
* Reset sticky routing facts from the new parent prompt at each user-turn
|
|
116
|
+
* boundary. A pending step-trigger arm deliberately survives: a trigger
|
|
117
|
+
* raised by the FINAL step of a turn has no intra-turn boundary left to
|
|
118
|
+
* consume it, so it rides into this turn's first classification instead of
|
|
119
|
+
* being silently dropped. Completed classifications clear every arm.
|
|
120
|
+
*/
|
|
121
|
+
noteTurnStart(input: {
|
|
122
|
+
promptHasImages: boolean;
|
|
123
|
+
}): void;
|
|
124
|
+
/** Record one completed parent assistant step and evaluate its runtime-neutral output summary. */
|
|
125
|
+
noteAssistantStep(observation?: StepObservation): void;
|
|
126
|
+
/** Arm one cap-exempt classification after an independent wire-prefix compaction. */
|
|
127
|
+
noteCompaction(): void;
|
|
128
|
+
/** Suspend virtual routing while a concrete model is pinned. */
|
|
129
|
+
pin(): void;
|
|
130
|
+
/** Resume virtual routing without discarding milestones accumulated while pinned. */
|
|
131
|
+
unpin(): void;
|
|
132
|
+
/** True when a one-shot milestone or completed-step cadence requests classification. */
|
|
133
|
+
shouldClassify(): boolean;
|
|
134
|
+
/**
|
|
135
|
+
* Classify and resolve a due route. Provider failure, abort, or invalid
|
|
136
|
+
* resolution is deliberately a no-op so the active model and milestones stay intact.
|
|
137
|
+
*/
|
|
138
|
+
prepareTurn(input: RouterPrepareInput): Promise<RouterSwitch | undefined>;
|
|
139
|
+
/** Current advisor floor; the first successful consult is always allowed. */
|
|
140
|
+
advisorGate(): AdvisorGate;
|
|
141
|
+
/** Atomically authorize one advisor attempt and reserve the session's consult slot. */
|
|
142
|
+
beginAdvisorConsult(): AdvisorGate;
|
|
143
|
+
/** Release the consult slot; only success stamps the floor and requests reclassification. */
|
|
144
|
+
endAdvisorConsult(success: boolean): void;
|
|
145
|
+
/** Return a detached snapshot; callers never infer routing policy from runner state. */
|
|
146
|
+
status(): RouterStatus;
|
|
147
|
+
private classificationTrigger;
|
|
148
|
+
}
|
|
149
|
+
//# sourceMappingURL=router.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"router.d.ts","sourceRoot":"","sources":["../../../src/model-routing/router.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,235 @@
|
|
|
1
|
+
import { resolveRoute, resolveTierDefault, } from "./resolve.js";
|
|
2
|
+
import { evaluateStepTriggers } from "./step-triggers.js";
|
|
3
|
+
/**
|
|
4
|
+
* Session-local routing state machine. It owns all cadence and interlock policy;
|
|
5
|
+
* callers only report runtime facts and apply returned switches.
|
|
6
|
+
*/
|
|
7
|
+
export class ModelRouter {
|
|
8
|
+
table;
|
|
9
|
+
tier;
|
|
10
|
+
classify;
|
|
11
|
+
resolveCatalog;
|
|
12
|
+
current;
|
|
13
|
+
assistantSteps = 0;
|
|
14
|
+
lastClassificationStep = 0;
|
|
15
|
+
firstClassificationPending = true;
|
|
16
|
+
advisorClassificationPending = false;
|
|
17
|
+
stepTriggerClassificationPending = false;
|
|
18
|
+
compactionClassificationPending = false;
|
|
19
|
+
lastAdvisorStep;
|
|
20
|
+
lastStepDelta;
|
|
21
|
+
currentTurnHint;
|
|
22
|
+
lastRationale;
|
|
23
|
+
pinned = false;
|
|
24
|
+
advisorConsultInFlight = false;
|
|
25
|
+
facts = { hasImages: false };
|
|
26
|
+
/** Precomputed: the tier has exactly one possible destination, so classification is skipped. */
|
|
27
|
+
singleDestination;
|
|
28
|
+
constructor(options) {
|
|
29
|
+
this.table = options.table;
|
|
30
|
+
this.tier = options.tier;
|
|
31
|
+
this.classify = options.classify;
|
|
32
|
+
this.resolveCatalog = options.resolveCatalog;
|
|
33
|
+
this.singleDestination = this.computeSingleDestination();
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* True when every route in the tier resolves to one identical
|
|
37
|
+
* `{model, effort}` pair, so classification cannot change anything —
|
|
38
|
+
* every classifier call (turn start, cadence, step trigger, advisor
|
|
39
|
+
* milestone) is skipped for the session. Applied per-route vision fallbacks
|
|
40
|
+
* participate because they can add a distinct model/effort destination.
|
|
41
|
+
*/
|
|
42
|
+
computeSingleDestination() {
|
|
43
|
+
const tier = this.table.tiers[this.tier];
|
|
44
|
+
if (!tier)
|
|
45
|
+
return false;
|
|
46
|
+
const destinations = new Set();
|
|
47
|
+
for (const routeName of Object.keys(tier.routes)) {
|
|
48
|
+
try {
|
|
49
|
+
for (const hasImages of [false, true]) {
|
|
50
|
+
const resolved = resolveRoute(this.table, this.tier, routeName, { hasImages }, this.resolveCatalog);
|
|
51
|
+
destinations.add(`${resolved.modelName}\u0000${resolved.thinkingLevel}`);
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
catch {
|
|
55
|
+
// An unresolvable route means real routing decisions remain possible;
|
|
56
|
+
// never optimize classification away on a table we cannot fully read.
|
|
57
|
+
return false;
|
|
58
|
+
}
|
|
59
|
+
if (destinations.size > 1)
|
|
60
|
+
return false;
|
|
61
|
+
}
|
|
62
|
+
return destinations.size === 1;
|
|
63
|
+
}
|
|
64
|
+
/** Resolve and retain the tier's general boot target before the first classifier call. */
|
|
65
|
+
initialTarget(context) {
|
|
66
|
+
const target = resolveTierDefault(this.table, this.tier, context, this.resolveCatalog);
|
|
67
|
+
this.current = target;
|
|
68
|
+
return target;
|
|
69
|
+
}
|
|
70
|
+
/**
|
|
71
|
+
* Reset sticky routing facts from the new parent prompt at each user-turn
|
|
72
|
+
* boundary. A pending step-trigger arm deliberately survives: a trigger
|
|
73
|
+
* raised by the FINAL step of a turn has no intra-turn boundary left to
|
|
74
|
+
* consume it, so it rides into this turn's first classification instead of
|
|
75
|
+
* being silently dropped. Completed classifications clear every arm.
|
|
76
|
+
*/
|
|
77
|
+
noteTurnStart(input) {
|
|
78
|
+
this.facts = { hasImages: input.promptHasImages };
|
|
79
|
+
this.currentTurnHint = undefined;
|
|
80
|
+
}
|
|
81
|
+
/** Record one completed parent assistant step and evaluate its runtime-neutral output summary. */
|
|
82
|
+
noteAssistantStep(observation = { blockTypes: [], text: "" }) {
|
|
83
|
+
this.assistantSteps += 1;
|
|
84
|
+
this.lastStepDelta = observation.text.trim() || undefined;
|
|
85
|
+
const effects = evaluateStepTriggers(observation, this.table.classifier.stepTriggers);
|
|
86
|
+
for (const effect of effects) {
|
|
87
|
+
this.facts = { ...this.facts, ...effect.facts };
|
|
88
|
+
if (effect.classify)
|
|
89
|
+
this.stepTriggerClassificationPending = true;
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
/** Arm one cap-exempt classification after an independent wire-prefix compaction. */
|
|
93
|
+
noteCompaction() {
|
|
94
|
+
this.compactionClassificationPending = true;
|
|
95
|
+
}
|
|
96
|
+
/** Suspend virtual routing while a concrete model is pinned. */
|
|
97
|
+
pin() {
|
|
98
|
+
this.pinned = true;
|
|
99
|
+
}
|
|
100
|
+
/** Resume virtual routing without discarding milestones accumulated while pinned. */
|
|
101
|
+
unpin() {
|
|
102
|
+
this.pinned = false;
|
|
103
|
+
}
|
|
104
|
+
/** True when a one-shot milestone or completed-step cadence requests classification. */
|
|
105
|
+
shouldClassify() {
|
|
106
|
+
if (this.pinned || this.singleDestination)
|
|
107
|
+
return false;
|
|
108
|
+
return (this.firstClassificationPending ||
|
|
109
|
+
this.advisorClassificationPending ||
|
|
110
|
+
this.stepTriggerClassificationPending ||
|
|
111
|
+
this.compactionClassificationPending ||
|
|
112
|
+
this.assistantSteps - this.lastClassificationStep >= this.table.classifier.everySteps);
|
|
113
|
+
}
|
|
114
|
+
/**
|
|
115
|
+
* Classify and resolve a due route. Provider failure, abort, or invalid
|
|
116
|
+
* resolution is deliberately a no-op so the active model and milestones stay intact.
|
|
117
|
+
*/
|
|
118
|
+
async prepareTurn(input) {
|
|
119
|
+
if (input.prevTurnHint?.trim())
|
|
120
|
+
this.currentTurnHint = input.prevTurnHint;
|
|
121
|
+
if (!this.shouldClassify() || input.signal?.aborted)
|
|
122
|
+
return undefined;
|
|
123
|
+
const trigger = this.classificationTrigger();
|
|
124
|
+
const previous = this.current;
|
|
125
|
+
try {
|
|
126
|
+
const decision = await this.classify({
|
|
127
|
+
tierName: this.tier,
|
|
128
|
+
tier: this.table.tiers[this.tier],
|
|
129
|
+
guidance: this.table.classifier.guidance,
|
|
130
|
+
currentTarget: previous
|
|
131
|
+
? `${previous.modelName} because route ${previous.route}`
|
|
132
|
+
: undefined,
|
|
133
|
+
prevTurnHint: this.currentTurnHint,
|
|
134
|
+
lastStepDelta: this.lastStepDelta,
|
|
135
|
+
hasImages: this.facts.hasImages,
|
|
136
|
+
trigger,
|
|
137
|
+
}, input.signal);
|
|
138
|
+
if (input.signal?.aborted)
|
|
139
|
+
return undefined;
|
|
140
|
+
const context = { hasImages: this.facts.hasImages };
|
|
141
|
+
const next = resolveRoute(this.table, this.tier, decision.route, context, this.resolveCatalog);
|
|
142
|
+
const baseline = previous ?? this.initialTarget(context);
|
|
143
|
+
this.current = next;
|
|
144
|
+
this.lastRationale = decision.rationale;
|
|
145
|
+
this.lastClassificationStep = this.assistantSteps;
|
|
146
|
+
this.firstClassificationPending = false;
|
|
147
|
+
this.advisorClassificationPending = false;
|
|
148
|
+
this.stepTriggerClassificationPending = false;
|
|
149
|
+
this.compactionClassificationPending = false;
|
|
150
|
+
if (baseline.modelName === next.modelName && baseline.thinkingLevel === next.thinkingLevel) {
|
|
151
|
+
return undefined;
|
|
152
|
+
}
|
|
153
|
+
const switched = {
|
|
154
|
+
tier: this.tier,
|
|
155
|
+
route: next.route,
|
|
156
|
+
fromModel: baseline.modelName,
|
|
157
|
+
toModel: next.modelName,
|
|
158
|
+
thinkingLevel: next.thinkingLevel,
|
|
159
|
+
trigger,
|
|
160
|
+
rationale: decision.rationale,
|
|
161
|
+
visionFallback: next.visionFallback,
|
|
162
|
+
};
|
|
163
|
+
// A replacement model starts with a fresh advisor floor. Its first
|
|
164
|
+
// consult is authorized by the ordinary gate; a successful consult then
|
|
165
|
+
// starts the normal step-based cooldown again.
|
|
166
|
+
this.lastAdvisorStep = undefined;
|
|
167
|
+
return switched;
|
|
168
|
+
}
|
|
169
|
+
catch {
|
|
170
|
+
return undefined;
|
|
171
|
+
}
|
|
172
|
+
}
|
|
173
|
+
/** Current advisor floor; the first successful consult is always allowed. */
|
|
174
|
+
advisorGate() {
|
|
175
|
+
if (this.lastAdvisorStep === undefined)
|
|
176
|
+
return { allowed: true, stepsUntilAllowed: 0 };
|
|
177
|
+
const minStepsBetween = this.table.tiers[this.tier].advisor.minStepsBetween;
|
|
178
|
+
const elapsed = this.assistantSteps - this.lastAdvisorStep;
|
|
179
|
+
const stepsUntilAllowed = Math.max(0, minStepsBetween - elapsed);
|
|
180
|
+
return { allowed: stepsUntilAllowed === 0, stepsUntilAllowed };
|
|
181
|
+
}
|
|
182
|
+
/** Atomically authorize one advisor attempt and reserve the session's consult slot. */
|
|
183
|
+
beginAdvisorConsult() {
|
|
184
|
+
if (this.advisorConsultInFlight) {
|
|
185
|
+
return { allowed: false, stepsUntilAllowed: 0, inFlight: true };
|
|
186
|
+
}
|
|
187
|
+
const gate = this.advisorGate();
|
|
188
|
+
if (gate.allowed)
|
|
189
|
+
this.advisorConsultInFlight = true;
|
|
190
|
+
return gate;
|
|
191
|
+
}
|
|
192
|
+
/** Release the consult slot; only success stamps the floor and requests reclassification. */
|
|
193
|
+
endAdvisorConsult(success) {
|
|
194
|
+
if (!this.advisorConsultInFlight)
|
|
195
|
+
return;
|
|
196
|
+
this.advisorConsultInFlight = false;
|
|
197
|
+
if (!success)
|
|
198
|
+
return;
|
|
199
|
+
this.lastAdvisorStep = this.assistantSteps;
|
|
200
|
+
this.advisorClassificationPending = true;
|
|
201
|
+
}
|
|
202
|
+
/** Return a detached snapshot; callers never infer routing policy from runner state. */
|
|
203
|
+
status() {
|
|
204
|
+
const cadenceRemaining = Math.max(0, this.table.classifier.everySteps - (this.assistantSteps - this.lastClassificationStep));
|
|
205
|
+
return {
|
|
206
|
+
tier: this.tier,
|
|
207
|
+
...(this.current
|
|
208
|
+
? {
|
|
209
|
+
route: this.current.route,
|
|
210
|
+
modelName: this.current.modelName,
|
|
211
|
+
thinkingLevel: this.current.thinkingLevel,
|
|
212
|
+
}
|
|
213
|
+
: {}),
|
|
214
|
+
...(this.lastRationale ? { lastRationale: this.lastRationale } : {}),
|
|
215
|
+
assistantSteps: this.assistantSteps,
|
|
216
|
+
stepsUntilClassification: this.shouldClassify() ? 0 : cadenceRemaining,
|
|
217
|
+
pinned: this.pinned,
|
|
218
|
+
advisorEnabled: this.table.tiers[this.tier].advisor.enabled,
|
|
219
|
+
advisorGate: this.advisorGate(),
|
|
220
|
+
facts: { ...this.facts },
|
|
221
|
+
};
|
|
222
|
+
}
|
|
223
|
+
classificationTrigger() {
|
|
224
|
+
if (this.firstClassificationPending)
|
|
225
|
+
return "turn_start";
|
|
226
|
+
if (this.advisorClassificationPending)
|
|
227
|
+
return "advisor";
|
|
228
|
+
if (this.stepTriggerClassificationPending)
|
|
229
|
+
return "step_trigger";
|
|
230
|
+
if (this.compactionClassificationPending)
|
|
231
|
+
return "compaction";
|
|
232
|
+
return "cadence";
|
|
233
|
+
}
|
|
234
|
+
}
|
|
235
|
+
//# sourceMappingURL=router.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"router.js","sourceRoot":"","sources":["../../../src/model-routing/router.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import type { StepTriggerConfig } from "./table.js";
|
|
2
|
+
/** Pi-free summary of one completed assistant step and its tool-result output. */
|
|
3
|
+
export interface StepObservation {
|
|
4
|
+
/** Content-block type names observed across the assistant message and tool results. */
|
|
5
|
+
blockTypes: readonly string[];
|
|
6
|
+
/** Caller-bounded concatenation of assistant and tool-result text blocks. */
|
|
7
|
+
text: string;
|
|
8
|
+
}
|
|
9
|
+
/** Sticky turn-scoped facts used by correctness routing policy. */
|
|
10
|
+
export interface TurnFacts {
|
|
11
|
+
/** Whether any prompt attachment or step output in this user turn contains an image. */
|
|
12
|
+
hasImages: boolean;
|
|
13
|
+
}
|
|
14
|
+
/** Routing consequences contributed by one built-in or configured trigger. */
|
|
15
|
+
export interface TriggerEffect {
|
|
16
|
+
/** Requests classification at the next model boundary. */
|
|
17
|
+
classify: boolean;
|
|
18
|
+
/** Sticky facts learned from the observed step. */
|
|
19
|
+
facts?: Partial<TurnFacts>;
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* Evaluate correctness and administrator-authored taste triggers for one step.
|
|
23
|
+
* Configured keywords use case-insensitive substring matching so tokens and phrases
|
|
24
|
+
* behave identically without imposing identifier or punctuation boundaries.
|
|
25
|
+
*/
|
|
26
|
+
export declare function evaluateStepTriggers(observation: StepObservation, configTriggers: readonly StepTriggerConfig[] | undefined): TriggerEffect[];
|
|
27
|
+
//# sourceMappingURL=step-triggers.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"step-triggers.d.ts","sourceRoot":"","sources":["../../../src/model-routing/step-triggers.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAGpD,kFAAkF;AAClF,MAAM,WAAW,eAAe;IAC9B,uFAAuF;IACvF,UAAU,EAAE,SAAS,MAAM,EAAE,CAAC;IAC9B,6EAA6E;IAC7E,IAAI,EAAE,MAAM,CAAC;CACd;AAED,mEAAmE;AACnE,MAAM,WAAW,SAAS;IACxB,wFAAwF;IACxF,SAAS,EAAE,OAAO,CAAC;CACpB;AAED,8EAA8E;AAC9E,MAAM,WAAW,aAAa;IAC5B,0DAA0D;IAC1D,QAAQ,EAAE,OAAO,CAAC;IAClB,mDAAmD;IACnD,KAAK,CAAC,EAAE,OAAO,CAAC,SAAS,CAAC,CAAC;CAC5B;AAED;;;;GAIG;AACH,wBAAgB,oBAAoB,CAClC,WAAW,EAAE,eAAe,EAC5B,cAAc,EAAE,SAAS,iBAAiB,EAAE,GAAG,SAAS,GACvD,aAAa,EAAE,CAajB"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { stripSystemReminders } from "../lib/system-reminder.js";
|
|
2
|
+
/**
|
|
3
|
+
* Evaluate correctness and administrator-authored taste triggers for one step.
|
|
4
|
+
* Configured keywords use case-insensitive substring matching so tokens and phrases
|
|
5
|
+
* behave identically without imposing identifier or punctuation boundaries.
|
|
6
|
+
*/
|
|
7
|
+
export function evaluateStepTriggers(observation, configTriggers) {
|
|
8
|
+
const effects = [];
|
|
9
|
+
if (observation.blockTypes.includes("image")) {
|
|
10
|
+
effects.push({ classify: true, facts: { hasImages: true } });
|
|
11
|
+
}
|
|
12
|
+
const normalizedText = stripSystemReminders(observation.text).toLocaleLowerCase();
|
|
13
|
+
for (const trigger of configTriggers ?? []) {
|
|
14
|
+
if (trigger.keywords.some((keyword) => normalizedText.includes(keyword.toLocaleLowerCase()))) {
|
|
15
|
+
effects.push({ classify: true });
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
return effects;
|
|
19
|
+
}
|
|
20
|
+
//# sourceMappingURL=step-triggers.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"step-triggers.js","sourceRoot":"","sources":["../../../src/model-routing/step-triggers.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,oBAAoB,EAAE,MAAM,2BAA2B,CAAC;AAwBjE;;;;GAIG;AACH,MAAM,UAAU,oBAAoB,CAClC,WAA4B,EAC5B,cAAwD;IAExD,MAAM,OAAO,GAAoB,EAAE,CAAC;IACpC,IAAI,WAAW,CAAC,UAAU,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC;QAC7C,OAAO,CAAC,IAAI,CAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,KAAK,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,EAAE,CAAC,CAAC;IAC/D,CAAC;IAED,MAAM,cAAc,GAAG,oBAAoB,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC,iBAAiB,EAAE,CAAC;IAClF,KAAK,MAAM,OAAO,IAAI,cAAc,IAAI,EAAE,EAAE,CAAC;QAC3C,IAAI,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,cAAc,CAAC,QAAQ,CAAC,OAAO,CAAC,iBAAiB,EAAE,CAAC,CAAC,EAAE,CAAC;YAC7F,OAAO,CAAC,IAAI,CAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC;QACnC,CAAC;IACH,CAAC;IACD,OAAO,OAAO,CAAC;AACjB,CAAC"}
|
|
@@ -0,0 +1,126 @@
|
|
|
1
|
+
import type { ThinkingLevel } from "@earendil-works/pi-ai";
|
|
2
|
+
import { Type } from "typebox";
|
|
3
|
+
/** Complete, replaceable configuration for virtual model routing. */
|
|
4
|
+
export declare const RoutingTableSchema: Type.TObject<{
|
|
5
|
+
defaultTier: Type.TString;
|
|
6
|
+
tiers: Type.TRecord<"^.*$", Type.TObject<{
|
|
7
|
+
routes: Type.TRecord<"^.*$", Type.TObject<{
|
|
8
|
+
description: Type.TString;
|
|
9
|
+
target: Type.TObject<{
|
|
10
|
+
modelName: Type.TString;
|
|
11
|
+
thinkingLevel: Type.TUnion<Type.TLiteral<"minimal" | "low" | "medium" | "high" | "xhigh">[]>;
|
|
12
|
+
}>;
|
|
13
|
+
visionFallbackModelName: Type.TOptional<Type.TString>;
|
|
14
|
+
}>>;
|
|
15
|
+
advisor: Type.TObject<{
|
|
16
|
+
enabled: Type.TBoolean;
|
|
17
|
+
target: Type.TObject<{
|
|
18
|
+
modelName: Type.TString;
|
|
19
|
+
thinkingLevel: Type.TUnion<Type.TLiteral<"minimal" | "low" | "medium" | "high" | "xhigh">[]>;
|
|
20
|
+
}>;
|
|
21
|
+
minStepsBetween: Type.TInteger;
|
|
22
|
+
transcriptTokens: Type.TInteger;
|
|
23
|
+
}>;
|
|
24
|
+
}>>;
|
|
25
|
+
classifier: Type.TObject<{
|
|
26
|
+
target: Type.TObject<{
|
|
27
|
+
modelName: Type.TString;
|
|
28
|
+
thinkingLevel: Type.TUnion<Type.TLiteral<"minimal" | "low" | "medium" | "high" | "xhigh">[]>;
|
|
29
|
+
}>;
|
|
30
|
+
everySteps: Type.TInteger;
|
|
31
|
+
guidance: Type.TString;
|
|
32
|
+
stepTriggers: Type.TOptional<Type.TArray<Type.TObject<{
|
|
33
|
+
name: Type.TString;
|
|
34
|
+
keywords: Type.TArray<Type.TString>;
|
|
35
|
+
}>>>;
|
|
36
|
+
}>;
|
|
37
|
+
}>;
|
|
38
|
+
/** A model plus the reasoning effort the router applies to it. */
|
|
39
|
+
export interface RouteTarget {
|
|
40
|
+
/** Concrete catalog name, or another virtual tier name for recursive routing. */
|
|
41
|
+
modelName: string;
|
|
42
|
+
/** Reasoning effort that applies once this target resolves to a concrete model. */
|
|
43
|
+
thinkingLevel: ThinkingLevel;
|
|
44
|
+
}
|
|
45
|
+
/** Classifier-facing route metadata and the target selected by that route. */
|
|
46
|
+
export interface RouteRule {
|
|
47
|
+
/** Explains the route's operational intent to the classifier. */
|
|
48
|
+
description: string;
|
|
49
|
+
/** Model and effort selected when the classifier chooses this route. */
|
|
50
|
+
target: RouteTarget;
|
|
51
|
+
/**
|
|
52
|
+
* Optional image-capable concrete model or virtual tier used when `target` is text-only.
|
|
53
|
+
* Resolution preserves this route's `thinkingLevel`; omission deliberately degrades in place.
|
|
54
|
+
*/
|
|
55
|
+
visionFallbackModelName?: string;
|
|
56
|
+
}
|
|
57
|
+
/** Per-tier policy for exposing and rate-limiting the advisor. */
|
|
58
|
+
export interface AdvisorPolicy {
|
|
59
|
+
/** Controls whether the tier exposes the advisor tool. */
|
|
60
|
+
enabled: boolean;
|
|
61
|
+
/** Model and effort used for advisor calls. */
|
|
62
|
+
target: RouteTarget;
|
|
63
|
+
/** Minimum completed assistant steps between ordinary advisor calls. */
|
|
64
|
+
minStepsBetween: number;
|
|
65
|
+
/** Token budget for the curated advisor transcript; validation caps it at 20,000. */
|
|
66
|
+
transcriptTokens: number;
|
|
67
|
+
}
|
|
68
|
+
/** Routes and policies owned by one virtual model tier. */
|
|
69
|
+
export interface TierDefinition {
|
|
70
|
+
/** Named classifier routes; an absent requested route falls through to `general`. */
|
|
71
|
+
routes: Record<string, RouteRule>;
|
|
72
|
+
/** Advisor availability, target, cadence, and transcript budget for this tier. */
|
|
73
|
+
advisor: AdvisorPolicy;
|
|
74
|
+
}
|
|
75
|
+
/** Shared classifier model, cadence, and administrator-authored routing guidance. */
|
|
76
|
+
export interface ClassifierConfig {
|
|
77
|
+
/** Cheap model and effort used for route classification. */
|
|
78
|
+
target: RouteTarget;
|
|
79
|
+
/** Number of completed assistant steps between intra-turn classifications. */
|
|
80
|
+
everySteps: number;
|
|
81
|
+
/** Freeform prompt guidance appended after the generated route descriptions. */
|
|
82
|
+
guidance: string;
|
|
83
|
+
/** Optional taste triggers matched against bounded text from each completed assistant step. */
|
|
84
|
+
stepTriggers?: StepTriggerConfig[];
|
|
85
|
+
}
|
|
86
|
+
/** Administrator-authored step-output trigger; correctness triggers remain built-in code. */
|
|
87
|
+
export interface StepTriggerConfig {
|
|
88
|
+
/** Non-empty name unique within `classifier.stepTriggers`. */
|
|
89
|
+
name: string;
|
|
90
|
+
/** Non-empty strings matched as case-insensitive substrings against step output. */
|
|
91
|
+
keywords: string[];
|
|
92
|
+
}
|
|
93
|
+
/** Complete routing configuration. A file override replaces this object as a whole. */
|
|
94
|
+
export interface RoutingTable {
|
|
95
|
+
/** Tier used during boot before a caller or classifier selects another tier. */
|
|
96
|
+
defaultTier: string;
|
|
97
|
+
/** Virtual names mapped to their route and advisor definitions. */
|
|
98
|
+
tiers: Record<string, TierDefinition>;
|
|
99
|
+
/** Configuration for the shared route classifier. */
|
|
100
|
+
classifier: ClassifierConfig;
|
|
101
|
+
}
|
|
102
|
+
/** Concrete catalog capabilities injected by model-resolution composition sites. */
|
|
103
|
+
export interface RoutingCatalogAdapter {
|
|
104
|
+
/** True for every concrete shorthand or alias accepted by model resolution. */
|
|
105
|
+
isCatalogName(name: string): boolean;
|
|
106
|
+
/** True when the concrete model accepts image inputs. */
|
|
107
|
+
modelAcceptsImages(name: string): boolean;
|
|
108
|
+
}
|
|
109
|
+
/** Stable validation diagnostic returned without throwing. */
|
|
110
|
+
export interface RoutingTableIssue {
|
|
111
|
+
/** Machine-readable category for callers that want to group diagnostics. */
|
|
112
|
+
code: "catalog_collision" | "dangling_reference" | "virtual_cycle" | "invalid_effort" | "invalid_cadence" | "invalid_transcript_budget" | "invalid_vision_fallback_model" | "invalid_step_trigger_name" | "duplicate_step_trigger_name" | "invalid_step_trigger_keywords";
|
|
113
|
+
/** Dot-delimited location of the invalid value in the table. */
|
|
114
|
+
path: string;
|
|
115
|
+
/** Human-readable explanation, including the full path for virtual cycles. */
|
|
116
|
+
message: string;
|
|
117
|
+
}
|
|
118
|
+
/** Built-in routing policy fixed by the model-router planning record. */
|
|
119
|
+
export declare const BUILT_IN_ROUTING_TABLE: RoutingTable;
|
|
120
|
+
/** True when `name` is owned by this routing table rather than the concrete catalog. */
|
|
121
|
+
export declare function isVirtualModel(name: string, table: RoutingTable): boolean;
|
|
122
|
+
/** Virtual model names in deterministic table insertion order. */
|
|
123
|
+
export declare function virtualModelNames(table: RoutingTable): string[];
|
|
124
|
+
/** Validate cross-field routing invariants against an injected concrete-model catalog. */
|
|
125
|
+
export declare function validateRoutingTable(table: RoutingTable, catalogAdapter: RoutingCatalogAdapter): RoutingTableIssue[];
|
|
126
|
+
//# sourceMappingURL=table.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"table.d.ts","sourceRoot":"","sources":["../../../src/model-routing/table.ts"],"names":[],"mappings":"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"}
|