agent-nuvira 1.14.0
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/LICENSE +21 -0
- package/README.md +891 -0
- package/dist/agent-sdk/src/agent.d.ts +118 -0
- package/dist/agent-sdk/src/agent.d.ts.map +1 -0
- package/dist/agent-sdk/src/agent.js +88 -0
- package/dist/agent-sdk/src/agent.js.map +1 -0
- package/dist/agent-sdk/src/index.d.ts +33 -0
- package/dist/agent-sdk/src/index.d.ts.map +1 -0
- package/dist/agent-sdk/src/index.js +32 -0
- package/dist/agent-sdk/src/index.js.map +1 -0
- package/dist/agent-sdk/src/register.d.ts +70 -0
- package/dist/agent-sdk/src/register.d.ts.map +1 -0
- package/dist/agent-sdk/src/register.js +181 -0
- package/dist/agent-sdk/src/register.js.map +1 -0
- package/dist/agent-sdk/src/scaffold.d.ts +50 -0
- package/dist/agent-sdk/src/scaffold.d.ts.map +1 -0
- package/dist/agent-sdk/src/scaffold.js +291 -0
- package/dist/agent-sdk/src/scaffold.js.map +1 -0
- package/dist/agent-sdk/src/testing.d.ts +187 -0
- package/dist/agent-sdk/src/testing.d.ts.map +1 -0
- package/dist/agent-sdk/src/testing.js +243 -0
- package/dist/agent-sdk/src/testing.js.map +1 -0
- package/dist/agent-sdk/src/types.d.ts +202 -0
- package/dist/agent-sdk/src/types.d.ts.map +1 -0
- package/dist/agent-sdk/src/types.js +11 -0
- package/dist/agent-sdk/src/types.js.map +1 -0
- package/dist/agents/agent.d.ts +132 -0
- package/dist/agents/agent.d.ts.map +1 -0
- package/dist/agents/agent.js +19 -0
- package/dist/agents/agent.js.map +1 -0
- package/dist/agents/agents/context-gatherer.d.ts +42 -0
- package/dist/agents/agents/context-gatherer.d.ts.map +1 -0
- package/dist/agents/agents/context-gatherer.js +366 -0
- package/dist/agents/agents/context-gatherer.js.map +1 -0
- package/dist/agents/agents/debugger.d.ts +58 -0
- package/dist/agents/agents/debugger.d.ts.map +1 -0
- package/dist/agents/agents/debugger.js +257 -0
- package/dist/agents/agents/debugger.js.map +1 -0
- package/dist/agents/agents/git-agent.d.ts +34 -0
- package/dist/agents/agents/git-agent.d.ts.map +1 -0
- package/dist/agents/agents/git-agent.js +200 -0
- package/dist/agents/agents/git-agent.js.map +1 -0
- package/dist/agents/agents/github-release-agent.d.ts +65 -0
- package/dist/agents/agents/github-release-agent.d.ts.map +1 -0
- package/dist/agents/agents/github-release-agent.js +439 -0
- package/dist/agents/agents/github-release-agent.js.map +1 -0
- package/dist/agents/agents/package-agent.d.ts +33 -0
- package/dist/agents/agents/package-agent.d.ts.map +1 -0
- package/dist/agents/agents/package-agent.js +233 -0
- package/dist/agents/agents/package-agent.js.map +1 -0
- package/dist/agents/agents/planner.d.ts +26 -0
- package/dist/agents/agents/planner.d.ts.map +1 -0
- package/dist/agents/agents/planner.js +222 -0
- package/dist/agents/agents/planner.js.map +1 -0
- package/dist/agents/agents/reviewer.d.ts +34 -0
- package/dist/agents/agents/reviewer.d.ts.map +1 -0
- package/dist/agents/agents/reviewer.js +159 -0
- package/dist/agents/agents/reviewer.js.map +1 -0
- package/dist/agents/agents/runner.d.ts +73 -0
- package/dist/agents/agents/runner.d.ts.map +1 -0
- package/dist/agents/agents/runner.js +299 -0
- package/dist/agents/agents/runner.js.map +1 -0
- package/dist/agents/agents/security-agent.d.ts +33 -0
- package/dist/agents/agents/security-agent.d.ts.map +1 -0
- package/dist/agents/agents/security-agent.js +184 -0
- package/dist/agents/agents/security-agent.js.map +1 -0
- package/dist/agents/agents/tester.d.ts +96 -0
- package/dist/agents/agents/tester.d.ts.map +1 -0
- package/dist/agents/agents/tester.js +410 -0
- package/dist/agents/agents/tester.js.map +1 -0
- package/dist/agents/agents/writer.d.ts +51 -0
- package/dist/agents/agents/writer.d.ts.map +1 -0
- package/dist/agents/agents/writer.js +384 -0
- package/dist/agents/agents/writer.js.map +1 -0
- package/dist/agents/context-vault.d.ts +49 -0
- package/dist/agents/context-vault.d.ts.map +1 -0
- package/dist/agents/context-vault.js +134 -0
- package/dist/agents/context-vault.js.map +1 -0
- package/dist/agents/orchestrator.d.ts +97 -0
- package/dist/agents/orchestrator.d.ts.map +1 -0
- package/dist/agents/orchestrator.js +696 -0
- package/dist/agents/orchestrator.js.map +1 -0
- package/dist/agents/utils/file-tree.d.ts +28 -0
- package/dist/agents/utils/file-tree.d.ts.map +1 -0
- package/dist/agents/utils/file-tree.js +93 -0
- package/dist/agents/utils/file-tree.js.map +1 -0
- package/dist/cli/agent.d.ts +25 -0
- package/dist/cli/agent.d.ts.map +1 -0
- package/dist/cli/agent.js +374 -0
- package/dist/cli/agent.js.map +1 -0
- package/dist/cli/benchmark.d.ts +24 -0
- package/dist/cli/benchmark.d.ts.map +1 -0
- package/dist/cli/benchmark.js +235 -0
- package/dist/cli/benchmark.js.map +1 -0
- package/dist/cli/cache.d.ts +12 -0
- package/dist/cli/cache.d.ts.map +1 -0
- package/dist/cli/cache.js +58 -0
- package/dist/cli/cache.js.map +1 -0
- package/dist/cli/chat.d.ts +37 -0
- package/dist/cli/chat.d.ts.map +1 -0
- package/dist/cli/chat.js +393 -0
- package/dist/cli/chat.js.map +1 -0
- package/dist/cli/commands.d.ts +24 -0
- package/dist/cli/commands.d.ts.map +1 -0
- package/dist/cli/commands.js +18 -0
- package/dist/cli/commands.js.map +1 -0
- package/dist/cli/config.d.ts +19 -0
- package/dist/cli/config.d.ts.map +1 -0
- package/dist/cli/config.js +162 -0
- package/dist/cli/config.js.map +1 -0
- package/dist/cli/dashboard.d.ts +34 -0
- package/dist/cli/dashboard.d.ts.map +1 -0
- package/dist/cli/dashboard.js +126 -0
- package/dist/cli/dashboard.js.map +1 -0
- package/dist/cli/doctor.d.ts +68 -0
- package/dist/cli/doctor.d.ts.map +1 -0
- package/dist/cli/doctor.js +585 -0
- package/dist/cli/doctor.js.map +1 -0
- package/dist/cli/edit.d.ts +11 -0
- package/dist/cli/edit.d.ts.map +1 -0
- package/dist/cli/edit.js +86 -0
- package/dist/cli/edit.js.map +1 -0
- package/dist/cli/execute.d.ts +25 -0
- package/dist/cli/execute.d.ts.map +1 -0
- package/dist/cli/execute.js +186 -0
- package/dist/cli/execute.js.map +1 -0
- package/dist/cli/federation.d.ts +31 -0
- package/dist/cli/federation.d.ts.map +1 -0
- package/dist/cli/federation.js +387 -0
- package/dist/cli/federation.js.map +1 -0
- package/dist/cli/history.d.ts +22 -0
- package/dist/cli/history.d.ts.map +1 -0
- package/dist/cli/history.js +140 -0
- package/dist/cli/history.js.map +1 -0
- package/dist/cli/init.d.ts +49 -0
- package/dist/cli/init.d.ts.map +1 -0
- package/dist/cli/init.js +423 -0
- package/dist/cli/init.js.map +1 -0
- package/dist/cli/learn.d.ts +31 -0
- package/dist/cli/learn.d.ts.map +1 -0
- package/dist/cli/learn.js +320 -0
- package/dist/cli/learn.js.map +1 -0
- package/dist/cli/memory.d.ts +38 -0
- package/dist/cli/memory.d.ts.map +1 -0
- package/dist/cli/memory.js +295 -0
- package/dist/cli/memory.js.map +1 -0
- package/dist/cli/model-picker.d.ts +18 -0
- package/dist/cli/model-picker.d.ts.map +1 -0
- package/dist/cli/model-picker.js +225 -0
- package/dist/cli/model-picker.js.map +1 -0
- package/dist/cli/models.d.ts +11 -0
- package/dist/cli/models.d.ts.map +1 -0
- package/dist/cli/models.js +132 -0
- package/dist/cli/models.js.map +1 -0
- package/dist/cli/plan.d.ts +11 -0
- package/dist/cli/plan.d.ts.map +1 -0
- package/dist/cli/plan.js +94 -0
- package/dist/cli/plan.js.map +1 -0
- package/dist/cli/plugins.d.ts +15 -0
- package/dist/cli/plugins.d.ts.map +1 -0
- package/dist/cli/plugins.js +123 -0
- package/dist/cli/plugins.js.map +1 -0
- package/dist/cli/router.d.ts +20 -0
- package/dist/cli/router.d.ts.map +1 -0
- package/dist/cli/router.js +142 -0
- package/dist/cli/router.js.map +1 -0
- package/dist/cli/run.d.ts +22 -0
- package/dist/cli/run.d.ts.map +1 -0
- package/dist/cli/run.js +110 -0
- package/dist/cli/run.js.map +1 -0
- package/dist/cli/sandbox.d.ts +27 -0
- package/dist/cli/sandbox.d.ts.map +1 -0
- package/dist/cli/sandbox.js +264 -0
- package/dist/cli/sandbox.js.map +1 -0
- package/dist/cli/sdk.d.ts +27 -0
- package/dist/cli/sdk.d.ts.map +1 -0
- package/dist/cli/sdk.js +204 -0
- package/dist/cli/sdk.js.map +1 -0
- package/dist/cli/stats.d.ts +18 -0
- package/dist/cli/stats.d.ts.map +1 -0
- package/dist/cli/stats.js +78 -0
- package/dist/cli/stats.js.map +1 -0
- package/dist/cli/team.d.ts +42 -0
- package/dist/cli/team.d.ts.map +1 -0
- package/dist/cli/team.js +473 -0
- package/dist/cli/team.js.map +1 -0
- package/dist/cli/workflow.d.ts +27 -0
- package/dist/cli/workflow.d.ts.map +1 -0
- package/dist/cli/workflow.js +347 -0
- package/dist/cli/workflow.js.map +1 -0
- package/dist/config/manager.d.ts +37 -0
- package/dist/config/manager.d.ts.map +1 -0
- package/dist/config/manager.js +147 -0
- package/dist/config/manager.js.map +1 -0
- package/dist/config/types.d.ts +53 -0
- package/dist/config/types.d.ts.map +1 -0
- package/dist/config/types.js +2 -0
- package/dist/config/types.js.map +1 -0
- package/dist/context/cache.d.ts +27 -0
- package/dist/context/cache.d.ts.map +1 -0
- package/dist/context/cache.js +116 -0
- package/dist/context/cache.js.map +1 -0
- package/dist/context/history.d.ts +87 -0
- package/dist/context/history.d.ts.map +1 -0
- package/dist/context/history.js +249 -0
- package/dist/context/history.js.map +1 -0
- package/dist/context/parser.d.ts +61 -0
- package/dist/context/parser.d.ts.map +1 -0
- package/dist/context/parser.js +194 -0
- package/dist/context/parser.js.map +1 -0
- package/dist/federation/client.d.ts +49 -0
- package/dist/federation/client.d.ts.map +1 -0
- package/dist/federation/client.js +239 -0
- package/dist/federation/client.js.map +1 -0
- package/dist/federation/protocol.d.ts +155 -0
- package/dist/federation/protocol.d.ts.map +1 -0
- package/dist/federation/protocol.js +57 -0
- package/dist/federation/protocol.js.map +1 -0
- package/dist/federation/server.d.ts +25 -0
- package/dist/federation/server.d.ts.map +1 -0
- package/dist/federation/server.js +401 -0
- package/dist/federation/server.js.map +1 -0
- package/dist/index.d.ts +67 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +93 -0
- package/dist/index.js.map +1 -0
- package/dist/inference/factory.d.ts +20 -0
- package/dist/inference/factory.d.ts.map +1 -0
- package/dist/inference/factory.js +46 -0
- package/dist/inference/factory.js.map +1 -0
- package/dist/inference/gemini-adapter.d.ts +17 -0
- package/dist/inference/gemini-adapter.d.ts.map +1 -0
- package/dist/inference/gemini-adapter.js +176 -0
- package/dist/inference/gemini-adapter.js.map +1 -0
- package/dist/inference/groq-adapter.d.ts +17 -0
- package/dist/inference/groq-adapter.d.ts.map +1 -0
- package/dist/inference/groq-adapter.js +103 -0
- package/dist/inference/groq-adapter.js.map +1 -0
- package/dist/inference/interface.d.ts +49 -0
- package/dist/inference/interface.d.ts.map +1 -0
- package/dist/inference/interface.js +2 -0
- package/dist/inference/interface.js.map +1 -0
- package/dist/inference/local-adapter.d.ts +35 -0
- package/dist/inference/local-adapter.d.ts.map +1 -0
- package/dist/inference/local-adapter.js +311 -0
- package/dist/inference/local-adapter.js.map +1 -0
- package/dist/inference/model-catalog.d.ts +53 -0
- package/dist/inference/model-catalog.d.ts.map +1 -0
- package/dist/inference/model-catalog.js +306 -0
- package/dist/inference/model-catalog.js.map +1 -0
- package/dist/inference/nim-adapter.d.ts +17 -0
- package/dist/inference/nim-adapter.d.ts.map +1 -0
- package/dist/inference/nim-adapter.js +103 -0
- package/dist/inference/nim-adapter.js.map +1 -0
- package/dist/inference/openrouter-adapter.d.ts +17 -0
- package/dist/inference/openrouter-adapter.d.ts.map +1 -0
- package/dist/inference/openrouter-adapter.js +105 -0
- package/dist/inference/openrouter-adapter.js.map +1 -0
- package/dist/inference/sse.d.ts +20 -0
- package/dist/inference/sse.d.ts.map +1 -0
- package/dist/inference/sse.js +91 -0
- package/dist/inference/sse.js.map +1 -0
- package/dist/learning/agent-stats.d.ts +109 -0
- package/dist/learning/agent-stats.d.ts.map +1 -0
- package/dist/learning/agent-stats.js +240 -0
- package/dist/learning/agent-stats.js.map +1 -0
- package/dist/learning/benchmark.d.ts +161 -0
- package/dist/learning/benchmark.d.ts.map +1 -0
- package/dist/learning/benchmark.js +589 -0
- package/dist/learning/benchmark.js.map +1 -0
- package/dist/learning/cost-tracker.d.ts +101 -0
- package/dist/learning/cost-tracker.d.ts.map +1 -0
- package/dist/learning/cost-tracker.js +224 -0
- package/dist/learning/cost-tracker.js.map +1 -0
- package/dist/learning/feedback.d.ts +88 -0
- package/dist/learning/feedback.d.ts.map +1 -0
- package/dist/learning/feedback.js +169 -0
- package/dist/learning/feedback.js.map +1 -0
- package/dist/learning/hybrid-router.d.ts +201 -0
- package/dist/learning/hybrid-router.d.ts.map +1 -0
- package/dist/learning/hybrid-router.js +450 -0
- package/dist/learning/hybrid-router.js.map +1 -0
- package/dist/learning/model-compare.d.ts +76 -0
- package/dist/learning/model-compare.d.ts.map +1 -0
- package/dist/learning/model-compare.js +252 -0
- package/dist/learning/model-compare.js.map +1 -0
- package/dist/learning/model-router.d.ts +68 -0
- package/dist/learning/model-router.d.ts.map +1 -0
- package/dist/learning/model-router.js +140 -0
- package/dist/learning/model-router.js.map +1 -0
- package/dist/learning/pattern-extractor.d.ts +99 -0
- package/dist/learning/pattern-extractor.d.ts.map +1 -0
- package/dist/learning/pattern-extractor.js +310 -0
- package/dist/learning/pattern-extractor.js.map +1 -0
- package/dist/learning/scorer.d.ts +51 -0
- package/dist/learning/scorer.d.ts.map +1 -0
- package/dist/learning/scorer.js +64 -0
- package/dist/learning/scorer.js.map +1 -0
- package/dist/learning/self-improver.d.ts +48 -0
- package/dist/learning/self-improver.d.ts.map +1 -0
- package/dist/learning/self-improver.js +161 -0
- package/dist/learning/self-improver.js.map +1 -0
- package/dist/memory/embedder.d.ts +65 -0
- package/dist/memory/embedder.d.ts.map +1 -0
- package/dist/memory/embedder.js +424 -0
- package/dist/memory/embedder.js.map +1 -0
- package/dist/memory/memory-integration.d.ts +56 -0
- package/dist/memory/memory-integration.d.ts.map +1 -0
- package/dist/memory/memory-integration.js +95 -0
- package/dist/memory/memory-integration.js.map +1 -0
- package/dist/memory/trajectory-store.d.ts +149 -0
- package/dist/memory/trajectory-store.d.ts.map +1 -0
- package/dist/memory/trajectory-store.js +476 -0
- package/dist/memory/trajectory-store.js.map +1 -0
- package/dist/memory/vector-store.d.ts +78 -0
- package/dist/memory/vector-store.d.ts.map +1 -0
- package/dist/memory/vector-store.js +186 -0
- package/dist/memory/vector-store.js.map +1 -0
- package/dist/plugins/agent-plugin.d.ts +73 -0
- package/dist/plugins/agent-plugin.d.ts.map +1 -0
- package/dist/plugins/agent-plugin.js +199 -0
- package/dist/plugins/agent-plugin.js.map +1 -0
- package/dist/plugins/registry.d.ts +61 -0
- package/dist/plugins/registry.d.ts.map +1 -0
- package/dist/plugins/registry.js +67 -0
- package/dist/plugins/registry.js.map +1 -0
- package/dist/sandbox/images.d.ts +31 -0
- package/dist/sandbox/images.d.ts.map +1 -0
- package/dist/sandbox/images.js +129 -0
- package/dist/sandbox/images.js.map +1 -0
- package/dist/sandbox/manager.d.ts +134 -0
- package/dist/sandbox/manager.d.ts.map +1 -0
- package/dist/sandbox/manager.js +470 -0
- package/dist/sandbox/manager.js.map +1 -0
- package/dist/sandbox/types.d.ts +113 -0
- package/dist/sandbox/types.d.ts.map +1 -0
- package/dist/sandbox/types.js +107 -0
- package/dist/sandbox/types.js.map +1 -0
- package/dist/security/scanner.d.ts +53 -0
- package/dist/security/scanner.d.ts.map +1 -0
- package/dist/security/scanner.js +271 -0
- package/dist/security/scanner.js.map +1 -0
- package/dist/team/config.d.ts +50 -0
- package/dist/team/config.d.ts.map +1 -0
- package/dist/team/config.js +108 -0
- package/dist/team/config.js.map +1 -0
- package/dist/team/memory.d.ts +63 -0
- package/dist/team/memory.d.ts.map +1 -0
- package/dist/team/memory.js +282 -0
- package/dist/team/memory.js.map +1 -0
- package/dist/team/review.d.ts +123 -0
- package/dist/team/review.d.ts.map +1 -0
- package/dist/team/review.js +293 -0
- package/dist/team/review.js.map +1 -0
- package/dist/utils/env.d.ts +19 -0
- package/dist/utils/env.d.ts.map +1 -0
- package/dist/utils/env.js +250 -0
- package/dist/utils/env.js.map +1 -0
- package/dist/utils/logger.d.ts +11 -0
- package/dist/utils/logger.d.ts.map +1 -0
- package/dist/utils/logger.js +45 -0
- package/dist/utils/logger.js.map +1 -0
- package/dist/web-dashboard/server.d.ts +59 -0
- package/dist/web-dashboard/server.d.ts.map +1 -0
- package/dist/web-dashboard/server.js +418 -0
- package/dist/web-dashboard/server.js.map +1 -0
- package/dist/workflow/registry.d.ts +127 -0
- package/dist/workflow/registry.d.ts.map +1 -0
- package/dist/workflow/registry.js +482 -0
- package/dist/workflow/registry.js.map +1 -0
- package/dist/workflow/templates.d.ts +93 -0
- package/dist/workflow/templates.d.ts.map +1 -0
- package/dist/workflow/templates.js +481 -0
- package/dist/workflow/templates.js.map +1 -0
- package/package.json +78 -0
- package/src/web-dashboard/public/assets/index-B08nDkSB.css +1 -0
- package/src/web-dashboard/public/assets/index-BKL8YOFD.js +135 -0
- package/src/web-dashboard/public/assets/index-BKL8YOFD.js.map +1 -0
- package/src/web-dashboard/public/index.html +13 -0
|
@@ -0,0 +1,201 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* HybridModelRouter — Intelligent model selection engine.
|
|
3
|
+
*
|
|
4
|
+
* Enhances the existing ModelRouter with:
|
|
5
|
+
* 1. Task complexity analysis — detects complexity from goal/description
|
|
6
|
+
* 2. Cost budget awareness — respects user's cost limits per session
|
|
7
|
+
* 3. Multi-model consensus — runs critical tasks through multiple models
|
|
8
|
+
* 4. Automatic fallback chains — if primary fails, try alternatives
|
|
9
|
+
* 5. Routing decisions exposed for user override
|
|
10
|
+
*
|
|
11
|
+
* Integration:
|
|
12
|
+
* - The Orchestrator calls `resolveRouting()` before each agent step
|
|
13
|
+
* - Returns a `RoutingDecision` that the Orchestrator can inspect/override
|
|
14
|
+
* - In verbose mode, decisions are logged for user visibility
|
|
15
|
+
* - Users can set `--provider`/`--model` CLI flags to override any decision
|
|
16
|
+
*/
|
|
17
|
+
/** Complexity levels for routing decisions */
|
|
18
|
+
export type ComplexityLevel = 'trivial' | 'simple' | 'moderate' | 'complex' | 'critical';
|
|
19
|
+
/** A single model candidate in a fallback chain */
|
|
20
|
+
export interface ModelCandidate {
|
|
21
|
+
provider: string;
|
|
22
|
+
model: string;
|
|
23
|
+
/** Estimated cost for this call (USD) */
|
|
24
|
+
estimatedCost: number;
|
|
25
|
+
/** Estimated quality score (0–1) from benchmark data */
|
|
26
|
+
qualityScore: number;
|
|
27
|
+
/** Reason this candidate was selected */
|
|
28
|
+
reason: string;
|
|
29
|
+
}
|
|
30
|
+
/** The final routing decision for a single LLM call */
|
|
31
|
+
export interface RoutingDecision {
|
|
32
|
+
/** The agent type this decision is for */
|
|
33
|
+
agentType: string;
|
|
34
|
+
/** Detected complexity level */
|
|
35
|
+
complexity: ComplexityLevel;
|
|
36
|
+
/** The selected provider */
|
|
37
|
+
provider: string;
|
|
38
|
+
/** The selected model */
|
|
39
|
+
model: string;
|
|
40
|
+
/** Full fallback chain (primary is first) */
|
|
41
|
+
fallbackChain: ModelCandidate[];
|
|
42
|
+
/** Whether multi-model consensus was used */
|
|
43
|
+
useConsensus: boolean;
|
|
44
|
+
/** Whether the user explicitly overrode this decision */
|
|
45
|
+
userOverridden: boolean;
|
|
46
|
+
/** Human-readable explanation of this decision */
|
|
47
|
+
explanation: string;
|
|
48
|
+
}
|
|
49
|
+
/** Options for the hybrid router */
|
|
50
|
+
export interface HybridRouterOptions {
|
|
51
|
+
/** User's cost budget for this session (USD) */
|
|
52
|
+
sessionBudget?: number;
|
|
53
|
+
/** Whether to use multi-model consensus for critical tasks */
|
|
54
|
+
enableConsensus?: boolean;
|
|
55
|
+
/** Whether the user has explicitly set --provider or --model */
|
|
56
|
+
userProvider?: string;
|
|
57
|
+
userModel?: string;
|
|
58
|
+
/** Whether logging is enabled */
|
|
59
|
+
verbose?: boolean;
|
|
60
|
+
}
|
|
61
|
+
/**
|
|
62
|
+
* Analyze a task description or user goal to determine its complexity level.
|
|
63
|
+
*
|
|
64
|
+
* @param text — The task description or user goal
|
|
65
|
+
* @returns The detected complexity level
|
|
66
|
+
*/
|
|
67
|
+
export declare function analyzeComplexity(text: string): ComplexityLevel;
|
|
68
|
+
/**
|
|
69
|
+
* Build a fallback chain for a given agent type and complexity.
|
|
70
|
+
* The chain is ordered: primary → secondary → tertiary.
|
|
71
|
+
*
|
|
72
|
+
* @param agentType - The agent type (e.g., 'writer', 'planner')
|
|
73
|
+
* @param complexity - Detected complexity level
|
|
74
|
+
* @param options - Router options (budget, overrides)
|
|
75
|
+
* @returns An ordered array of model candidates
|
|
76
|
+
*/
|
|
77
|
+
export declare function buildFallbackChain(agentType: string, complexity: ComplexityLevel, options?: HybridRouterOptions): ModelCandidate[];
|
|
78
|
+
/**
|
|
79
|
+
* Check if the session has remaining budget for a model call.
|
|
80
|
+
*
|
|
81
|
+
* @param options - Router options (includes sessionBudget)
|
|
82
|
+
* @param estimatedCost - Estimated cost of the proposed call
|
|
83
|
+
* @returns True if within budget, false if over
|
|
84
|
+
*/
|
|
85
|
+
export declare function checkBudget(options: HybridRouterOptions, estimatedCost: number): {
|
|
86
|
+
withinBudget: boolean;
|
|
87
|
+
remainingBudget: number;
|
|
88
|
+
};
|
|
89
|
+
/**
|
|
90
|
+
* Results from a multi-model consensus run.
|
|
91
|
+
*/
|
|
92
|
+
export interface ConsensusResult {
|
|
93
|
+
providerA: string;
|
|
94
|
+
modelA: string;
|
|
95
|
+
providerB: string;
|
|
96
|
+
modelB: string;
|
|
97
|
+
/** Whether the two models agreed */
|
|
98
|
+
agreed: boolean;
|
|
99
|
+
/** Combined/enhanced response (when agreed, uses A's response) */
|
|
100
|
+
combinedResponse: string;
|
|
101
|
+
/** Individual responses */
|
|
102
|
+
responseA: string;
|
|
103
|
+
responseB: string;
|
|
104
|
+
}
|
|
105
|
+
/**
|
|
106
|
+
* Compare two model outputs and determine if they agree at a high level.
|
|
107
|
+
* Simple heuristic: checks if key terms/sections overlap.
|
|
108
|
+
*
|
|
109
|
+
* @param responseA — Output from model A
|
|
110
|
+
* @param responseB — Output from model B
|
|
111
|
+
* @param threshold — Similarity threshold (0–1, default 0.3)
|
|
112
|
+
* @returns Whether the responses agree
|
|
113
|
+
*/
|
|
114
|
+
export declare function checkConsensus(responseA: string, responseB: string, threshold?: number): boolean;
|
|
115
|
+
/**
|
|
116
|
+
* The main HybridModelRouter class.
|
|
117
|
+
*
|
|
118
|
+
* Usage:
|
|
119
|
+
* ```ts
|
|
120
|
+
* const router = new HybridModelRouter({ sessionBudget: 0.50, verbose: true });
|
|
121
|
+
* const decision = await router.resolveRouting('writer', 'Implement auth module');
|
|
122
|
+
* console.log(decision.explanation);
|
|
123
|
+
* // → "Moderate complexity: using groq/llama-3.3-70b-versatile. Budget remaining: $0.48"
|
|
124
|
+
*
|
|
125
|
+
* // For critical tasks with consensus:
|
|
126
|
+
* if (decision.useConsensus) {
|
|
127
|
+
* const consensus = await router.runConsensus(
|
|
128
|
+
* prompt,
|
|
129
|
+
* decision.fallbackChain[0],
|
|
130
|
+
* decision.fallbackChain[1],
|
|
131
|
+
* );
|
|
132
|
+
* }
|
|
133
|
+
* ```
|
|
134
|
+
*/
|
|
135
|
+
export declare class HybridModelRouter {
|
|
136
|
+
private options;
|
|
137
|
+
constructor(options?: HybridRouterOptions);
|
|
138
|
+
/**
|
|
139
|
+
* Resolve the optimal routing decision for a given agent type and task.
|
|
140
|
+
*
|
|
141
|
+
* @param agentType — Agent type (e.g., 'writer', 'planner')
|
|
142
|
+
* @param taskDescription — The task description or user goal
|
|
143
|
+
* @param overrides — Optional per-call overrides
|
|
144
|
+
* @returns A RoutingDecision with provider, model, fallback chain, and explanation
|
|
145
|
+
*/
|
|
146
|
+
resolveRouting(agentType: string, taskDescription: string, overrides?: Partial<HybridRouterOptions>): Promise<RoutingDecision>;
|
|
147
|
+
/**
|
|
148
|
+
* Run multi-model consensus for a critical task.
|
|
149
|
+
* Sends the same prompt to two different models and compares results.
|
|
150
|
+
*
|
|
151
|
+
* @param prompt — The LLM prompt
|
|
152
|
+
* @param primary — Primary model (used if agreement reached)
|
|
153
|
+
* @param secondary — Secondary model (for comparison)
|
|
154
|
+
* @param callLLM — Function to call a specific provider/model
|
|
155
|
+
* @returns Consensus result with combined response
|
|
156
|
+
*/
|
|
157
|
+
runConsensus(prompt: string, primary: ModelCandidate, secondary: ModelCandidate, callLLM: (prompt: string, provider: string, model: string) => Promise<string>): Promise<ConsensusResult>;
|
|
158
|
+
/**
|
|
159
|
+
* Try the fallback chain for a single call.
|
|
160
|
+
* Returns the first successful result, or throws if all fail.
|
|
161
|
+
*
|
|
162
|
+
* @param prompt — The LLM prompt
|
|
163
|
+
* @param chain — Fallback chain of model candidates
|
|
164
|
+
* @param callLLM — Function to call a specific provider/model
|
|
165
|
+
* @returns The response from the first successful model
|
|
166
|
+
*/
|
|
167
|
+
tryFallbackChain(prompt: string, chain: ModelCandidate[], callLLM: (prompt: string, provider: string, model: string) => Promise<string>): Promise<{
|
|
168
|
+
response: string;
|
|
169
|
+
usedCandidate: ModelCandidate;
|
|
170
|
+
}>;
|
|
171
|
+
/**
|
|
172
|
+
* Build a human-readable explanation of the routing decision.
|
|
173
|
+
*/
|
|
174
|
+
private buildExplanation;
|
|
175
|
+
/**
|
|
176
|
+
* Update options (e.g., when user sets --budget).
|
|
177
|
+
*/
|
|
178
|
+
updateOptions(options: Partial<HybridRouterOptions>): void;
|
|
179
|
+
/**
|
|
180
|
+
* Get current options.
|
|
181
|
+
*/
|
|
182
|
+
getOptions(): HybridRouterOptions;
|
|
183
|
+
/**
|
|
184
|
+
* Get benchmark-driven recommendations for the best model for each agent type.
|
|
185
|
+
* Uses data from ModelCompare and BenchmarkRunner.
|
|
186
|
+
*/
|
|
187
|
+
getBenchmarkRecommendations(): Array<{
|
|
188
|
+
agentType: string;
|
|
189
|
+
recommendedModel: string;
|
|
190
|
+
confidence: 'high' | 'medium' | 'low';
|
|
191
|
+
}>;
|
|
192
|
+
}
|
|
193
|
+
/**
|
|
194
|
+
* Get or create the default HybridModelRouter singleton.
|
|
195
|
+
*/
|
|
196
|
+
export declare function getHybridRouter(): HybridModelRouter;
|
|
197
|
+
/**
|
|
198
|
+
* Reset the singleton (useful for testing).
|
|
199
|
+
*/
|
|
200
|
+
export declare function resetHybridRouter(): void;
|
|
201
|
+
//# sourceMappingURL=hybrid-router.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hybrid-router.d.ts","sourceRoot":"","sources":["../../src/learning/hybrid-router.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,450 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* HybridModelRouter — Intelligent model selection engine.
|
|
3
|
+
*
|
|
4
|
+
* Enhances the existing ModelRouter with:
|
|
5
|
+
* 1. Task complexity analysis — detects complexity from goal/description
|
|
6
|
+
* 2. Cost budget awareness — respects user's cost limits per session
|
|
7
|
+
* 3. Multi-model consensus — runs critical tasks through multiple models
|
|
8
|
+
* 4. Automatic fallback chains — if primary fails, try alternatives
|
|
9
|
+
* 5. Routing decisions exposed for user override
|
|
10
|
+
*
|
|
11
|
+
* Integration:
|
|
12
|
+
* - The Orchestrator calls `resolveRouting()` before each agent step
|
|
13
|
+
* - Returns a `RoutingDecision` that the Orchestrator can inspect/override
|
|
14
|
+
* - In verbose mode, decisions are logged for user visibility
|
|
15
|
+
* - Users can set `--provider`/`--model` CLI flags to override any decision
|
|
16
|
+
*/
|
|
17
|
+
import { recommendModel } from './model-router.js';
|
|
18
|
+
import { getCostTracker, calculateCost } from './cost-tracker.js';
|
|
19
|
+
import { getBenchmarkRuns } from './benchmark.js';
|
|
20
|
+
import { logger } from '../utils/logger.js';
|
|
21
|
+
// ─── Complexity Analysis ────────────────────────────────────────────────────
|
|
22
|
+
/** Keywords that indicate task complexity */
|
|
23
|
+
const COMPLEXITY_KEYWORDS = {
|
|
24
|
+
trivial: [
|
|
25
|
+
/format|lint|comment|indent|rename/i,
|
|
26
|
+
/typo|spelling|trivial/i,
|
|
27
|
+
/simple\s+(change|fix|edit)/i,
|
|
28
|
+
],
|
|
29
|
+
simple: [
|
|
30
|
+
/refactor|extract|inline|move/i,
|
|
31
|
+
/add\s+(method|function|route|endpoint)/i,
|
|
32
|
+
/fix\s+(bug|issue|error)/i,
|
|
33
|
+
/implement\s+(small|simple)/i,
|
|
34
|
+
],
|
|
35
|
+
moderate: [
|
|
36
|
+
/implement|create|build|develop/i,
|
|
37
|
+
/add\s+(feature|module|component)/i,
|
|
38
|
+
/integrate|migrate|convert/i,
|
|
39
|
+
/auth|authentication|authorization|api/i,
|
|
40
|
+
],
|
|
41
|
+
complex: [
|
|
42
|
+
/architecture|architect|design\s+system/i,
|
|
43
|
+
/security\s+(audit|review|scan)/i,
|
|
44
|
+
/optimize|performance|scale/i,
|
|
45
|
+
/multi[- ]?thread|concurrent|parallel/i,
|
|
46
|
+
/database|migration|schema/i,
|
|
47
|
+
/distributed|microservice/i,
|
|
48
|
+
],
|
|
49
|
+
critical: [
|
|
50
|
+
/production|deploy|release|rollout/i,
|
|
51
|
+
/critical|urgent|emergency|p0|p1/i,
|
|
52
|
+
/security\s+(fix|patch|vulnerability)/i,
|
|
53
|
+
/consensus|vote|multiple\s+models/i,
|
|
54
|
+
/data\s+(loss|breach|corruption)/i,
|
|
55
|
+
],
|
|
56
|
+
};
|
|
57
|
+
/**
|
|
58
|
+
* Analyze a task description or user goal to determine its complexity level.
|
|
59
|
+
*
|
|
60
|
+
* @param text — The task description or user goal
|
|
61
|
+
* @returns The detected complexity level
|
|
62
|
+
*/
|
|
63
|
+
export function analyzeComplexity(text) {
|
|
64
|
+
// Check critical first (highest priority)
|
|
65
|
+
for (const keyword of COMPLEXITY_KEYWORDS.critical) {
|
|
66
|
+
if (keyword.test(text))
|
|
67
|
+
return 'critical';
|
|
68
|
+
}
|
|
69
|
+
// Check complex
|
|
70
|
+
for (const keyword of COMPLEXITY_KEYWORDS.complex) {
|
|
71
|
+
if (keyword.test(text))
|
|
72
|
+
return 'complex';
|
|
73
|
+
}
|
|
74
|
+
// Check moderate
|
|
75
|
+
for (const keyword of COMPLEXITY_KEYWORDS.moderate) {
|
|
76
|
+
if (keyword.test(text))
|
|
77
|
+
return 'moderate';
|
|
78
|
+
}
|
|
79
|
+
// Check simple
|
|
80
|
+
for (const keyword of COMPLEXITY_KEYWORDS.simple) {
|
|
81
|
+
if (keyword.test(text))
|
|
82
|
+
return 'simple';
|
|
83
|
+
}
|
|
84
|
+
// Check trivial
|
|
85
|
+
for (const keyword of COMPLEXITY_KEYWORDS.trivial) {
|
|
86
|
+
if (keyword.test(text))
|
|
87
|
+
return 'trivial';
|
|
88
|
+
}
|
|
89
|
+
// Default: moderate (safe default)
|
|
90
|
+
return 'moderate';
|
|
91
|
+
}
|
|
92
|
+
/**
|
|
93
|
+
* Get the recommended provider based on complexity.
|
|
94
|
+
*/
|
|
95
|
+
function providerForComplexity(complexity) {
|
|
96
|
+
switch (complexity) {
|
|
97
|
+
case 'trivial': return 'local';
|
|
98
|
+
case 'simple': return 'groq';
|
|
99
|
+
case 'moderate': return 'groq';
|
|
100
|
+
case 'complex': return 'gemini';
|
|
101
|
+
case 'critical': return 'openrouter';
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
/**
|
|
105
|
+
* Estimate cost for a model call based on provider, model, and estimated token usage.
|
|
106
|
+
* Reuses CostTracker's calculateCost and estimateTokens for consistent pricing.
|
|
107
|
+
*/
|
|
108
|
+
function estimateCallCost(provider, model, inputTokens, outputTokens) {
|
|
109
|
+
return calculateCost(provider, model, inputTokens ?? 1000, outputTokens ?? 500);
|
|
110
|
+
}
|
|
111
|
+
// ─── Fallback Chain Builder ─────────────────────────────────────────────────
|
|
112
|
+
/**
|
|
113
|
+
* Build a fallback chain for a given agent type and complexity.
|
|
114
|
+
* The chain is ordered: primary → secondary → tertiary.
|
|
115
|
+
*
|
|
116
|
+
* @param agentType - The agent type (e.g., 'writer', 'planner')
|
|
117
|
+
* @param complexity - Detected complexity level
|
|
118
|
+
* @param options - Router options (budget, overrides)
|
|
119
|
+
* @returns An ordered array of model candidates
|
|
120
|
+
*/
|
|
121
|
+
export function buildFallbackChain(agentType, complexity, options = {}) {
|
|
122
|
+
const chain = [];
|
|
123
|
+
// If user explicitly set provider/model, that's the only option
|
|
124
|
+
if (options.userProvider && options.userModel) {
|
|
125
|
+
chain.push({
|
|
126
|
+
provider: options.userProvider,
|
|
127
|
+
model: options.userModel,
|
|
128
|
+
estimatedCost: estimateCallCost(options.userProvider, options.userModel),
|
|
129
|
+
qualityScore: 0.7,
|
|
130
|
+
reason: 'User-specified provider/model',
|
|
131
|
+
});
|
|
132
|
+
return chain;
|
|
133
|
+
}
|
|
134
|
+
// Get the recommended model from the existing ModelRouter
|
|
135
|
+
const recommendation = recommendModel(agentType);
|
|
136
|
+
// Build fallback chain based on complexity
|
|
137
|
+
const preferredProvider = options.userProvider || providerForComplexity(complexity);
|
|
138
|
+
// Primary: the complexity-matched or user-specified provider
|
|
139
|
+
const modelSuffix = recommendation.model ? `/${recommendation.model}` : '';
|
|
140
|
+
chain.push({
|
|
141
|
+
provider: preferredProvider,
|
|
142
|
+
model: recommendation.model || 'default',
|
|
143
|
+
estimatedCost: estimateCallCost(preferredProvider, recommendation.model || 'default'),
|
|
144
|
+
qualityScore: complexity === 'critical' ? 0.9 : complexity === 'complex' ? 0.8 : 0.7,
|
|
145
|
+
reason: `Primary choice for ${complexity} complexity`,
|
|
146
|
+
});
|
|
147
|
+
// Secondary fallback: swap provider
|
|
148
|
+
const secondaryProvider = preferredProvider === 'local' ? 'groq'
|
|
149
|
+
: preferredProvider === 'groq' ? 'nim'
|
|
150
|
+
: preferredProvider === 'nim' ? 'gemini'
|
|
151
|
+
: preferredProvider === 'gemini' ? 'openrouter'
|
|
152
|
+
: 'groq';
|
|
153
|
+
chain.push({
|
|
154
|
+
provider: secondaryProvider,
|
|
155
|
+
model: 'default',
|
|
156
|
+
estimatedCost: estimateCallCost(secondaryProvider, 'default'),
|
|
157
|
+
qualityScore: 0.6,
|
|
158
|
+
reason: `Fallback: switch to ${secondaryProvider}`,
|
|
159
|
+
});
|
|
160
|
+
// Tertiary fallback: a different model on the same provider (if available)
|
|
161
|
+
const tertiaryProvider = secondaryProvider === 'groq' ? 'gemini' : 'groq';
|
|
162
|
+
chain.push({
|
|
163
|
+
provider: tertiaryProvider,
|
|
164
|
+
model: 'default',
|
|
165
|
+
estimatedCost: estimateCallCost(tertiaryProvider, 'default'),
|
|
166
|
+
qualityScore: 0.5,
|
|
167
|
+
reason: `Final fallback: switch to ${tertiaryProvider}`,
|
|
168
|
+
});
|
|
169
|
+
return chain;
|
|
170
|
+
}
|
|
171
|
+
// ─── Budget Check ───────────────────────────────────────────────────────────
|
|
172
|
+
/**
|
|
173
|
+
* Check if the session has remaining budget for a model call.
|
|
174
|
+
*
|
|
175
|
+
* @param options - Router options (includes sessionBudget)
|
|
176
|
+
* @param estimatedCost - Estimated cost of the proposed call
|
|
177
|
+
* @returns True if within budget, false if over
|
|
178
|
+
*/
|
|
179
|
+
export function checkBudget(options, estimatedCost) {
|
|
180
|
+
if (!options.sessionBudget) {
|
|
181
|
+
return { withinBudget: true, remainingBudget: Infinity };
|
|
182
|
+
}
|
|
183
|
+
const tracker = getCostTracker();
|
|
184
|
+
const summary = tracker.getSummary();
|
|
185
|
+
const spent = summary.sessionCost;
|
|
186
|
+
const remaining = options.sessionBudget - spent;
|
|
187
|
+
return {
|
|
188
|
+
withinBudget: estimatedCost <= remaining,
|
|
189
|
+
remainingBudget: remaining,
|
|
190
|
+
};
|
|
191
|
+
}
|
|
192
|
+
/**
|
|
193
|
+
* Select a model candidate from the fallback chain that fits the budget.
|
|
194
|
+
*/
|
|
195
|
+
function selectWithinBudget(chain, options) {
|
|
196
|
+
for (const candidate of chain) {
|
|
197
|
+
const { withinBudget } = checkBudget(options, candidate.estimatedCost);
|
|
198
|
+
if (withinBudget)
|
|
199
|
+
return candidate;
|
|
200
|
+
}
|
|
201
|
+
// If nothing fits the budget, return the cheapest option
|
|
202
|
+
return chain.reduce((cheapest, candidate) => candidate.estimatedCost < cheapest.estimatedCost ? candidate : cheapest);
|
|
203
|
+
}
|
|
204
|
+
/**
|
|
205
|
+
* Compare two model outputs and determine if they agree at a high level.
|
|
206
|
+
* Simple heuristic: checks if key terms/sections overlap.
|
|
207
|
+
*
|
|
208
|
+
* @param responseA — Output from model A
|
|
209
|
+
* @param responseB — Output from model B
|
|
210
|
+
* @param threshold — Similarity threshold (0–1, default 0.3)
|
|
211
|
+
* @returns Whether the responses agree
|
|
212
|
+
*/
|
|
213
|
+
export function checkConsensus(responseA, responseB, threshold = 0.3) {
|
|
214
|
+
// Tokenize into words (lowercase)
|
|
215
|
+
const tokensA = new Set(responseA.toLowerCase().split(/\W+/).filter((t) => t.length > 3));
|
|
216
|
+
const tokensB = new Set(responseB.toLowerCase().split(/\W+/).filter((t) => t.length > 3));
|
|
217
|
+
if (tokensA.size === 0 || tokensB.size === 0)
|
|
218
|
+
return true; // Fallback: assume agree
|
|
219
|
+
// Calculate Jaccard similarity
|
|
220
|
+
const intersection = new Set([...tokensA].filter((t) => tokensB.has(t)));
|
|
221
|
+
const union = new Set([...tokensA, ...tokensB]);
|
|
222
|
+
const similarity = intersection.size / union.size;
|
|
223
|
+
return similarity >= threshold;
|
|
224
|
+
}
|
|
225
|
+
// ─── Hybrid Model Router ────────────────────────────────────────────────────
|
|
226
|
+
/**
|
|
227
|
+
* The main HybridModelRouter class.
|
|
228
|
+
*
|
|
229
|
+
* Usage:
|
|
230
|
+
* ```ts
|
|
231
|
+
* const router = new HybridModelRouter({ sessionBudget: 0.50, verbose: true });
|
|
232
|
+
* const decision = await router.resolveRouting('writer', 'Implement auth module');
|
|
233
|
+
* console.log(decision.explanation);
|
|
234
|
+
* // → "Moderate complexity: using groq/llama-3.3-70b-versatile. Budget remaining: $0.48"
|
|
235
|
+
*
|
|
236
|
+
* // For critical tasks with consensus:
|
|
237
|
+
* if (decision.useConsensus) {
|
|
238
|
+
* const consensus = await router.runConsensus(
|
|
239
|
+
* prompt,
|
|
240
|
+
* decision.fallbackChain[0],
|
|
241
|
+
* decision.fallbackChain[1],
|
|
242
|
+
* );
|
|
243
|
+
* }
|
|
244
|
+
* ```
|
|
245
|
+
*/
|
|
246
|
+
export class HybridModelRouter {
|
|
247
|
+
options;
|
|
248
|
+
constructor(options = {}) {
|
|
249
|
+
this.options = {
|
|
250
|
+
enableConsensus: true,
|
|
251
|
+
verbose: false,
|
|
252
|
+
...options,
|
|
253
|
+
};
|
|
254
|
+
}
|
|
255
|
+
/**
|
|
256
|
+
* Resolve the optimal routing decision for a given agent type and task.
|
|
257
|
+
*
|
|
258
|
+
* @param agentType — Agent type (e.g., 'writer', 'planner')
|
|
259
|
+
* @param taskDescription — The task description or user goal
|
|
260
|
+
* @param overrides — Optional per-call overrides
|
|
261
|
+
* @returns A RoutingDecision with provider, model, fallback chain, and explanation
|
|
262
|
+
*/
|
|
263
|
+
async resolveRouting(agentType, taskDescription, overrides) {
|
|
264
|
+
const opts = { ...this.options, ...overrides };
|
|
265
|
+
const complexity = analyzeComplexity(taskDescription);
|
|
266
|
+
const fallbackChain = buildFallbackChain(agentType, complexity, opts);
|
|
267
|
+
// Select within budget
|
|
268
|
+
const selected = selectWithinBudget(fallbackChain, opts);
|
|
269
|
+
// Determine if consensus is needed
|
|
270
|
+
const useConsensus = opts.enableConsensus !== false &&
|
|
271
|
+
complexity === 'critical' &&
|
|
272
|
+
!opts.userProvider;
|
|
273
|
+
// Build explanation
|
|
274
|
+
const explanation = this.buildExplanation(agentType, complexity, selected, fallbackChain, opts);
|
|
275
|
+
if (opts.verbose) {
|
|
276
|
+
logger.info(` 🔀 Routing: ${explanation}`);
|
|
277
|
+
}
|
|
278
|
+
return {
|
|
279
|
+
agentType,
|
|
280
|
+
complexity,
|
|
281
|
+
provider: selected.provider,
|
|
282
|
+
model: selected.model,
|
|
283
|
+
fallbackChain,
|
|
284
|
+
useConsensus,
|
|
285
|
+
userOverridden: !!opts.userProvider,
|
|
286
|
+
explanation,
|
|
287
|
+
};
|
|
288
|
+
}
|
|
289
|
+
/**
|
|
290
|
+
* Run multi-model consensus for a critical task.
|
|
291
|
+
* Sends the same prompt to two different models and compares results.
|
|
292
|
+
*
|
|
293
|
+
* @param prompt — The LLM prompt
|
|
294
|
+
* @param primary — Primary model (used if agreement reached)
|
|
295
|
+
* @param secondary — Secondary model (for comparison)
|
|
296
|
+
* @param callLLM — Function to call a specific provider/model
|
|
297
|
+
* @returns Consensus result with combined response
|
|
298
|
+
*/
|
|
299
|
+
async runConsensus(prompt, primary, secondary, callLLM) {
|
|
300
|
+
logger.info(' 🔀 Running multi-model consensus for critical task...');
|
|
301
|
+
// Run both models in parallel
|
|
302
|
+
const [responseA, responseB] = await Promise.all([
|
|
303
|
+
callLLM(prompt, primary.provider, primary.model),
|
|
304
|
+
callLLM(prompt, secondary.provider, secondary.model),
|
|
305
|
+
]);
|
|
306
|
+
const agreed = checkConsensus(responseA, responseB);
|
|
307
|
+
if (agreed) {
|
|
308
|
+
logger.success(' ✅ Models agree — using primary model result');
|
|
309
|
+
}
|
|
310
|
+
else {
|
|
311
|
+
logger.warn(' ⚠️ Models disagree — falling back to primary (higher quality score)');
|
|
312
|
+
}
|
|
313
|
+
return {
|
|
314
|
+
providerA: primary.provider,
|
|
315
|
+
modelA: primary.model,
|
|
316
|
+
providerB: secondary.provider,
|
|
317
|
+
modelB: secondary.model,
|
|
318
|
+
agreed,
|
|
319
|
+
combinedResponse: responseA,
|
|
320
|
+
responseA,
|
|
321
|
+
responseB,
|
|
322
|
+
};
|
|
323
|
+
}
|
|
324
|
+
/**
|
|
325
|
+
* Try the fallback chain for a single call.
|
|
326
|
+
* Returns the first successful result, or throws if all fail.
|
|
327
|
+
*
|
|
328
|
+
* @param prompt — The LLM prompt
|
|
329
|
+
* @param chain — Fallback chain of model candidates
|
|
330
|
+
* @param callLLM — Function to call a specific provider/model
|
|
331
|
+
* @returns The response from the first successful model
|
|
332
|
+
*/
|
|
333
|
+
async tryFallbackChain(prompt, chain, callLLM) {
|
|
334
|
+
const errors = [];
|
|
335
|
+
for (const candidate of chain) {
|
|
336
|
+
try {
|
|
337
|
+
logger.debug(` 🔀 Trying fallback: ${candidate.provider}/${candidate.model}`);
|
|
338
|
+
const response = await callLLM(prompt, candidate.provider, candidate.model);
|
|
339
|
+
return { response, usedCandidate: candidate };
|
|
340
|
+
}
|
|
341
|
+
catch (err) {
|
|
342
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
343
|
+
errors.push(`${candidate.provider}/${candidate.model}: ${msg.slice(0, 100)}`);
|
|
344
|
+
logger.warn(` ⚠️ Fallback ${candidate.provider}/${candidate.model} failed: ${msg.slice(0, 100)}`);
|
|
345
|
+
continue;
|
|
346
|
+
}
|
|
347
|
+
}
|
|
348
|
+
throw new Error(`All models in fallback chain failed:\n${errors.join('\n')}`);
|
|
349
|
+
}
|
|
350
|
+
/**
|
|
351
|
+
* Build a human-readable explanation of the routing decision.
|
|
352
|
+
*/
|
|
353
|
+
buildExplanation(agentType, complexity, selected, chain, opts) {
|
|
354
|
+
const parts = [];
|
|
355
|
+
// Complexity
|
|
356
|
+
const complexityLabels = {
|
|
357
|
+
trivial: '🟢 trivial',
|
|
358
|
+
simple: '🔵 simple',
|
|
359
|
+
moderate: '🟡 moderate',
|
|
360
|
+
complex: '🟠 complex',
|
|
361
|
+
critical: '🔴 critical',
|
|
362
|
+
};
|
|
363
|
+
parts.push(`${agentType} (${complexityLabels[complexity]})`);
|
|
364
|
+
// Selected model
|
|
365
|
+
parts.push(`→ ${selected.provider}/${selected.model}`);
|
|
366
|
+
// Budget info
|
|
367
|
+
if (opts.sessionBudget) {
|
|
368
|
+
const { remainingBudget } = checkBudget(opts, selected.estimatedCost);
|
|
369
|
+
parts.push(`$${remainingBudget.toFixed(4)} remaining`);
|
|
370
|
+
}
|
|
371
|
+
// Fallback chain summary
|
|
372
|
+
if (chain.length > 1) {
|
|
373
|
+
const fallbacks = chain.slice(1)
|
|
374
|
+
.map((c) => `${c.provider}/${c.model}`)
|
|
375
|
+
.join(' → ');
|
|
376
|
+
parts.push(`fallback: ${fallbacks}`);
|
|
377
|
+
}
|
|
378
|
+
// Consensus
|
|
379
|
+
if (complexity === 'critical' && opts.enableConsensus) {
|
|
380
|
+
parts.push('🔀 consensus enabled');
|
|
381
|
+
}
|
|
382
|
+
// User override
|
|
383
|
+
if (opts.userProvider) {
|
|
384
|
+
parts.push('👤 user override');
|
|
385
|
+
}
|
|
386
|
+
return parts.join(' | ');
|
|
387
|
+
}
|
|
388
|
+
/**
|
|
389
|
+
* Update options (e.g., when user sets --budget).
|
|
390
|
+
*/
|
|
391
|
+
updateOptions(options) {
|
|
392
|
+
this.options = { ...this.options, ...options };
|
|
393
|
+
}
|
|
394
|
+
/**
|
|
395
|
+
* Get current options.
|
|
396
|
+
*/
|
|
397
|
+
getOptions() {
|
|
398
|
+
return { ...this.options };
|
|
399
|
+
}
|
|
400
|
+
/**
|
|
401
|
+
* Get benchmark-driven recommendations for the best model for each agent type.
|
|
402
|
+
* Uses data from ModelCompare and BenchmarkRunner.
|
|
403
|
+
*/
|
|
404
|
+
getBenchmarkRecommendations() {
|
|
405
|
+
const runs = getBenchmarkRuns();
|
|
406
|
+
if (runs.length === 0)
|
|
407
|
+
return [];
|
|
408
|
+
// Group runs by result characteristics (task IDs used as agent type proxy)
|
|
409
|
+
const byAgent = {};
|
|
410
|
+
for (const run of runs) {
|
|
411
|
+
const key = `${run.provider}/${run.model}`;
|
|
412
|
+
for (const result of run.results) {
|
|
413
|
+
// Use taskId as the agent type proxy
|
|
414
|
+
const agentType = result.taskId || 'default';
|
|
415
|
+
if (!byAgent[agentType])
|
|
416
|
+
byAgent[agentType] = [];
|
|
417
|
+
byAgent[agentType].push({ model: key, score: result.qualityScore });
|
|
418
|
+
}
|
|
419
|
+
}
|
|
420
|
+
return Object.entries(byAgent).map(([agentType, entries]) => {
|
|
421
|
+
const best = entries.sort((a, b) => b.score - a.score)[0];
|
|
422
|
+
const confidence = entries.length >= 10 ? 'high'
|
|
423
|
+
: entries.length >= 5 ? 'medium'
|
|
424
|
+
: 'low';
|
|
425
|
+
return {
|
|
426
|
+
agentType,
|
|
427
|
+
recommendedModel: best.model,
|
|
428
|
+
confidence,
|
|
429
|
+
};
|
|
430
|
+
});
|
|
431
|
+
}
|
|
432
|
+
}
|
|
433
|
+
// ─── Singleton ──────────────────────────────────────────────────────────────
|
|
434
|
+
let routerInstance = null;
|
|
435
|
+
/**
|
|
436
|
+
* Get or create the default HybridModelRouter singleton.
|
|
437
|
+
*/
|
|
438
|
+
export function getHybridRouter() {
|
|
439
|
+
if (!routerInstance) {
|
|
440
|
+
routerInstance = new HybridModelRouter();
|
|
441
|
+
}
|
|
442
|
+
return routerInstance;
|
|
443
|
+
}
|
|
444
|
+
/**
|
|
445
|
+
* Reset the singleton (useful for testing).
|
|
446
|
+
*/
|
|
447
|
+
export function resetHybridRouter() {
|
|
448
|
+
routerInstance = null;
|
|
449
|
+
}
|
|
450
|
+
//# sourceMappingURL=hybrid-router.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hybrid-router.js","sourceRoot":"","sources":["../../src/learning/hybrid-router.ts"],"names":[],"mappings":"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"}
|