mcp-agent-foundry 1.0.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 +477 -0
- package/dist/cli/install-skills.d.ts +11 -0
- package/dist/cli/install-skills.d.ts.map +1 -0
- package/dist/cli/install-skills.js +143 -0
- package/dist/cli/install-skills.js.map +1 -0
- package/dist/cli/recovery-commands.d.ts +41 -0
- package/dist/cli/recovery-commands.d.ts.map +1 -0
- package/dist/cli/recovery-commands.js +241 -0
- package/dist/cli/recovery-commands.js.map +1 -0
- package/dist/cli/setup-wizard.d.ts +25 -0
- package/dist/cli/setup-wizard.d.ts.map +1 -0
- package/dist/cli/setup-wizard.js +1417 -0
- package/dist/cli/setup-wizard.js.map +1 -0
- package/dist/cli/test-connection.d.ts +45 -0
- package/dist/cli/test-connection.d.ts.map +1 -0
- package/dist/cli/test-connection.js +317 -0
- package/dist/cli/test-connection.js.map +1 -0
- package/dist/cli.d.ts +75 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +704 -0
- package/dist/cli.js.map +1 -0
- package/dist/config/defaults.d.ts +57 -0
- package/dist/config/defaults.d.ts.map +1 -0
- package/dist/config/defaults.js +99 -0
- package/dist/config/defaults.js.map +1 -0
- package/dist/config/index.d.ts +14 -0
- package/dist/config/index.d.ts.map +1 -0
- package/dist/config/index.js +22 -0
- package/dist/config/index.js.map +1 -0
- package/dist/config/manager.d.ts +184 -0
- package/dist/config/manager.d.ts.map +1 -0
- package/dist/config/manager.js +347 -0
- package/dist/config/manager.js.map +1 -0
- package/dist/config/merger.d.ts +76 -0
- package/dist/config/merger.d.ts.map +1 -0
- package/dist/config/merger.js +189 -0
- package/dist/config/merger.js.map +1 -0
- package/dist/config/schema.d.ts +20 -0
- package/dist/config/schema.d.ts.map +1 -0
- package/dist/config/schema.js +20 -0
- package/dist/config/schema.js.map +1 -0
- package/dist/config/validator.d.ts +254 -0
- package/dist/config/validator.d.ts.map +1 -0
- package/dist/config/validator.js +363 -0
- package/dist/config/validator.js.map +1 -0
- package/dist/config/worktree-defaults.d.ts +23 -0
- package/dist/config/worktree-defaults.d.ts.map +1 -0
- package/dist/config/worktree-defaults.js +78 -0
- package/dist/config/worktree-defaults.js.map +1 -0
- package/dist/index.d.ts +8 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +44 -0
- package/dist/index.js.map +1 -0
- package/dist/mcp/tools/compare-agents.d.ts +25 -0
- package/dist/mcp/tools/compare-agents.d.ts.map +1 -0
- package/dist/mcp/tools/compare-agents.js +177 -0
- package/dist/mcp/tools/compare-agents.js.map +1 -0
- package/dist/mcp/tools/critique-plan.d.ts +26 -0
- package/dist/mcp/tools/critique-plan.d.ts.map +1 -0
- package/dist/mcp/tools/critique-plan.js +162 -0
- package/dist/mcp/tools/critique-plan.js.map +1 -0
- package/dist/mcp/tools/design-feedback.d.ts +26 -0
- package/dist/mcp/tools/design-feedback.d.ts.map +1 -0
- package/dist/mcp/tools/design-feedback.js +216 -0
- package/dist/mcp/tools/design-feedback.js.map +1 -0
- package/dist/mcp/tools/index.d.ts +50 -0
- package/dist/mcp/tools/index.d.ts.map +1 -0
- package/dist/mcp/tools/index.js +191 -0
- package/dist/mcp/tools/index.js.map +1 -0
- package/dist/mcp/tools/invoke-agent.d.ts +25 -0
- package/dist/mcp/tools/invoke-agent.d.ts.map +1 -0
- package/dist/mcp/tools/invoke-agent.js +141 -0
- package/dist/mcp/tools/invoke-agent.js.map +1 -0
- package/dist/mcp/tools/review-code.d.ts +25 -0
- package/dist/mcp/tools/review-code.d.ts.map +1 -0
- package/dist/mcp/tools/review-code.js +170 -0
- package/dist/mcp/tools/review-code.js.map +1 -0
- package/dist/mcp/tools/tasks/claim-next-task.d.ts +22 -0
- package/dist/mcp/tools/tasks/claim-next-task.d.ts.map +1 -0
- package/dist/mcp/tools/tasks/claim-next-task.js +203 -0
- package/dist/mcp/tools/tasks/claim-next-task.js.map +1 -0
- package/dist/mcp/tools/tasks/create-routed-task.d.ts +17 -0
- package/dist/mcp/tools/tasks/create-routed-task.d.ts.map +1 -0
- package/dist/mcp/tools/tasks/create-routed-task.js +178 -0
- package/dist/mcp/tools/tasks/create-routed-task.js.map +1 -0
- package/dist/mcp/tools/tasks/execute-pipeline.d.ts +22 -0
- package/dist/mcp/tools/tasks/execute-pipeline.d.ts.map +1 -0
- package/dist/mcp/tools/tasks/execute-pipeline.js +401 -0
- package/dist/mcp/tools/tasks/execute-pipeline.js.map +1 -0
- package/dist/mcp/tools/tasks/execute-task.d.ts +32 -0
- package/dist/mcp/tools/tasks/execute-task.d.ts.map +1 -0
- package/dist/mcp/tools/tasks/execute-task.js +284 -0
- package/dist/mcp/tools/tasks/execute-task.js.map +1 -0
- package/dist/mcp/tools/tasks/get-pipeline-status.d.ts +26 -0
- package/dist/mcp/tools/tasks/get-pipeline-status.d.ts.map +1 -0
- package/dist/mcp/tools/tasks/get-pipeline-status.js +460 -0
- package/dist/mcp/tools/tasks/get-pipeline-status.js.map +1 -0
- package/dist/mcp/tools/tasks/index.d.ts +36 -0
- package/dist/mcp/tools/tasks/index.d.ts.map +1 -0
- package/dist/mcp/tools/tasks/index.js +66 -0
- package/dist/mcp/tools/tasks/index.js.map +1 -0
- package/dist/mcp/tools/worktree/cleanup-worktrees.d.ts +17 -0
- package/dist/mcp/tools/worktree/cleanup-worktrees.d.ts.map +1 -0
- package/dist/mcp/tools/worktree/cleanup-worktrees.js +147 -0
- package/dist/mcp/tools/worktree/cleanup-worktrees.js.map +1 -0
- package/dist/mcp/tools/worktree/get-worktree-status.d.ts +17 -0
- package/dist/mcp/tools/worktree/get-worktree-status.d.ts.map +1 -0
- package/dist/mcp/tools/worktree/get-worktree-status.js +123 -0
- package/dist/mcp/tools/worktree/get-worktree-status.js.map +1 -0
- package/dist/mcp/tools/worktree/index.d.ts +41 -0
- package/dist/mcp/tools/worktree/index.d.ts.map +1 -0
- package/dist/mcp/tools/worktree/index.js +69 -0
- package/dist/mcp/tools/worktree/index.js.map +1 -0
- package/dist/mcp/tools/worktree/list-worktrees.d.ts +17 -0
- package/dist/mcp/tools/worktree/list-worktrees.d.ts.map +1 -0
- package/dist/mcp/tools/worktree/list-worktrees.js +136 -0
- package/dist/mcp/tools/worktree/list-worktrees.js.map +1 -0
- package/dist/mcp/tools/worktree/resolve-conflicts.d.ts +19 -0
- package/dist/mcp/tools/worktree/resolve-conflicts.d.ts.map +1 -0
- package/dist/mcp/tools/worktree/resolve-conflicts.js +228 -0
- package/dist/mcp/tools/worktree/resolve-conflicts.js.map +1 -0
- package/dist/mcp/transport/stdio.d.ts +13 -0
- package/dist/mcp/transport/stdio.d.ts.map +1 -0
- package/dist/mcp/transport/stdio.js +15 -0
- package/dist/mcp/transport/stdio.js.map +1 -0
- package/dist/observability/logger.d.ts +137 -0
- package/dist/observability/logger.d.ts.map +1 -0
- package/dist/observability/logger.js +235 -0
- package/dist/observability/logger.js.map +1 -0
- package/dist/observability/metrics.d.ts +250 -0
- package/dist/observability/metrics.d.ts.map +1 -0
- package/dist/observability/metrics.js +364 -0
- package/dist/observability/metrics.js.map +1 -0
- package/dist/persistence/index.d.ts +9 -0
- package/dist/persistence/index.d.ts.map +1 -0
- package/dist/persistence/index.js +9 -0
- package/dist/persistence/index.js.map +1 -0
- package/dist/persistence/state-schema.d.ts +116 -0
- package/dist/persistence/state-schema.d.ts.map +1 -0
- package/dist/persistence/state-schema.js +28 -0
- package/dist/persistence/state-schema.js.map +1 -0
- package/dist/persistence/state-store.d.ts +111 -0
- package/dist/persistence/state-store.d.ts.map +1 -0
- package/dist/persistence/state-store.js +291 -0
- package/dist/persistence/state-store.js.map +1 -0
- package/dist/providers/anthropic.d.ts +164 -0
- package/dist/providers/anthropic.d.ts.map +1 -0
- package/dist/providers/anthropic.js +500 -0
- package/dist/providers/anthropic.js.map +1 -0
- package/dist/providers/base.d.ts +151 -0
- package/dist/providers/base.d.ts.map +1 -0
- package/dist/providers/base.js +227 -0
- package/dist/providers/base.js.map +1 -0
- package/dist/providers/gemini.d.ts +85 -0
- package/dist/providers/gemini.d.ts.map +1 -0
- package/dist/providers/gemini.js +414 -0
- package/dist/providers/gemini.js.map +1 -0
- package/dist/providers/kimi.d.ts +19 -0
- package/dist/providers/kimi.d.ts.map +1 -0
- package/dist/providers/kimi.js +20 -0
- package/dist/providers/kimi.js.map +1 -0
- package/dist/providers/manager.d.ts +160 -0
- package/dist/providers/manager.d.ts.map +1 -0
- package/dist/providers/manager.js +264 -0
- package/dist/providers/manager.js.map +1 -0
- package/dist/providers/ollama.d.ts +83 -0
- package/dist/providers/ollama.d.ts.map +1 -0
- package/dist/providers/ollama.js +453 -0
- package/dist/providers/ollama.js.map +1 -0
- package/dist/providers/openai.d.ts +96 -0
- package/dist/providers/openai.d.ts.map +1 -0
- package/dist/providers/openai.js +457 -0
- package/dist/providers/openai.js.map +1 -0
- package/dist/providers/zai.d.ts +19 -0
- package/dist/providers/zai.d.ts.map +1 -0
- package/dist/providers/zai.js +20 -0
- package/dist/providers/zai.js.map +1 -0
- package/dist/router/context-manager.d.ts +2 -0
- package/dist/router/context-manager.d.ts.map +1 -0
- package/dist/router/context-manager.js +3 -0
- package/dist/router/context-manager.js.map +1 -0
- package/dist/router/engine.d.ts +169 -0
- package/dist/router/engine.d.ts.map +1 -0
- package/dist/router/engine.js +435 -0
- package/dist/router/engine.js.map +1 -0
- package/dist/router/pattern-executor.d.ts +317 -0
- package/dist/router/pattern-executor.d.ts.map +1 -0
- package/dist/router/pattern-executor.js +571 -0
- package/dist/router/pattern-executor.js.map +1 -0
- package/dist/router/role-resolver.d.ts +59 -0
- package/dist/router/role-resolver.d.ts.map +1 -0
- package/dist/router/role-resolver.js +95 -0
- package/dist/router/role-resolver.js.map +1 -0
- package/dist/server.d.ts +32 -0
- package/dist/server.d.ts.map +1 -0
- package/dist/server.js +223 -0
- package/dist/server.js.map +1 -0
- package/dist/startup.d.ts +78 -0
- package/dist/startup.d.ts.map +1 -0
- package/dist/startup.js +107 -0
- package/dist/startup.js.map +1 -0
- package/dist/tasks/coordinator.d.ts +141 -0
- package/dist/tasks/coordinator.d.ts.map +1 -0
- package/dist/tasks/coordinator.js +331 -0
- package/dist/tasks/coordinator.js.map +1 -0
- package/dist/tasks/index.d.ts +13 -0
- package/dist/tasks/index.d.ts.map +1 -0
- package/dist/tasks/index.js +13 -0
- package/dist/tasks/index.js.map +1 -0
- package/dist/tasks/persistent-state-coordinator.d.ts +89 -0
- package/dist/tasks/persistent-state-coordinator.d.ts.map +1 -0
- package/dist/tasks/persistent-state-coordinator.js +371 -0
- package/dist/tasks/persistent-state-coordinator.js.map +1 -0
- package/dist/tasks/pipeline-manager.d.ts +103 -0
- package/dist/tasks/pipeline-manager.d.ts.map +1 -0
- package/dist/tasks/pipeline-manager.js +358 -0
- package/dist/tasks/pipeline-manager.js.map +1 -0
- package/dist/tasks/state-coordinator.d.ts +79 -0
- package/dist/tasks/state-coordinator.d.ts.map +1 -0
- package/dist/tasks/state-coordinator.js +200 -0
- package/dist/tasks/state-coordinator.js.map +1 -0
- package/dist/tasks/worker-mode.d.ts +65 -0
- package/dist/tasks/worker-mode.d.ts.map +1 -0
- package/dist/tasks/worker-mode.js +208 -0
- package/dist/tasks/worker-mode.js.map +1 -0
- package/dist/translation/errors.d.ts +203 -0
- package/dist/translation/errors.d.ts.map +1 -0
- package/dist/translation/errors.js +477 -0
- package/dist/translation/errors.js.map +1 -0
- package/dist/translation/index.d.ts +12 -0
- package/dist/translation/index.d.ts.map +1 -0
- package/dist/translation/index.js +32 -0
- package/dist/translation/index.js.map +1 -0
- package/dist/translation/messages.d.ts +295 -0
- package/dist/translation/messages.d.ts.map +1 -0
- package/dist/translation/messages.js +557 -0
- package/dist/translation/messages.js.map +1 -0
- package/dist/translation/streaming.d.ts +226 -0
- package/dist/translation/streaming.d.ts.map +1 -0
- package/dist/translation/streaming.js +520 -0
- package/dist/translation/streaming.js.map +1 -0
- package/dist/translation/tools.d.ts +209 -0
- package/dist/translation/tools.d.ts.map +1 -0
- package/dist/translation/tools.js +331 -0
- package/dist/translation/tools.js.map +1 -0
- package/dist/types.d.ts +747 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +86 -0
- package/dist/types.js.map +1 -0
- package/dist/utils/circuit-breaker.d.ts +175 -0
- package/dist/utils/circuit-breaker.d.ts.map +1 -0
- package/dist/utils/circuit-breaker.js +315 -0
- package/dist/utils/circuit-breaker.js.map +1 -0
- package/dist/utils/env.d.ts +2 -0
- package/dist/utils/env.d.ts.map +1 -0
- package/dist/utils/env.js +3 -0
- package/dist/utils/env.js.map +1 -0
- package/dist/utils/git.d.ts +58 -0
- package/dist/utils/git.d.ts.map +1 -0
- package/dist/utils/git.js +197 -0
- package/dist/utils/git.js.map +1 -0
- package/dist/utils/index.d.ts +9 -0
- package/dist/utils/index.d.ts.map +1 -0
- package/dist/utils/index.js +9 -0
- package/dist/utils/index.js.map +1 -0
- package/dist/utils/merge-ordering.d.ts +45 -0
- package/dist/utils/merge-ordering.d.ts.map +1 -0
- package/dist/utils/merge-ordering.js +128 -0
- package/dist/utils/merge-ordering.js.map +1 -0
- package/dist/utils/retry.d.ts +106 -0
- package/dist/utils/retry.d.ts.map +1 -0
- package/dist/utils/retry.js +188 -0
- package/dist/utils/retry.js.map +1 -0
- package/dist/worktrees/branch-manager.d.ts +55 -0
- package/dist/worktrees/branch-manager.d.ts.map +1 -0
- package/dist/worktrees/branch-manager.js +129 -0
- package/dist/worktrees/branch-manager.js.map +1 -0
- package/dist/worktrees/conflict-handler.d.ts +72 -0
- package/dist/worktrees/conflict-handler.d.ts.map +1 -0
- package/dist/worktrees/conflict-handler.js +287 -0
- package/dist/worktrees/conflict-handler.js.map +1 -0
- package/dist/worktrees/conflict-parser.d.ts +28 -0
- package/dist/worktrees/conflict-parser.d.ts.map +1 -0
- package/dist/worktrees/conflict-parser.js +140 -0
- package/dist/worktrees/conflict-parser.js.map +1 -0
- package/dist/worktrees/index.d.ts +20 -0
- package/dist/worktrees/index.d.ts.map +1 -0
- package/dist/worktrees/index.js +20 -0
- package/dist/worktrees/index.js.map +1 -0
- package/dist/worktrees/instructions.d.ts +20 -0
- package/dist/worktrees/instructions.d.ts.map +1 -0
- package/dist/worktrees/instructions.js +84 -0
- package/dist/worktrees/instructions.js.map +1 -0
- package/dist/worktrees/manager.d.ts +76 -0
- package/dist/worktrees/manager.d.ts.map +1 -0
- package/dist/worktrees/manager.js +277 -0
- package/dist/worktrees/manager.js.map +1 -0
- package/dist/worktrees/pipeline-merge-orchestrator.d.ts +55 -0
- package/dist/worktrees/pipeline-merge-orchestrator.d.ts.map +1 -0
- package/dist/worktrees/pipeline-merge-orchestrator.js +221 -0
- package/dist/worktrees/pipeline-merge-orchestrator.js.map +1 -0
- package/dist/worktrees/pool.d.ts +95 -0
- package/dist/worktrees/pool.d.ts.map +1 -0
- package/dist/worktrees/pool.js +271 -0
- package/dist/worktrees/pool.js.map +1 -0
- package/dist/worktrees/recovery.d.ts +94 -0
- package/dist/worktrees/recovery.d.ts.map +1 -0
- package/dist/worktrees/recovery.js +371 -0
- package/dist/worktrees/recovery.js.map +1 -0
- package/dist/worktrees/resource-manager.d.ts +74 -0
- package/dist/worktrees/resource-manager.d.ts.map +1 -0
- package/dist/worktrees/resource-manager.js +228 -0
- package/dist/worktrees/resource-manager.js.map +1 -0
- package/package.json +88 -0
|
@@ -0,0 +1,169 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Router Engine
|
|
3
|
+
*
|
|
4
|
+
* The main orchestration logic for AgentRouter.
|
|
5
|
+
* Responsible for resolving roles to configurations and executing
|
|
6
|
+
* agent invocations against the appropriate providers.
|
|
7
|
+
*
|
|
8
|
+
* Key responsibilities:
|
|
9
|
+
* - Invoking agents by role with proper message construction
|
|
10
|
+
* - Comparing responses from multiple agents in parallel
|
|
11
|
+
* - Handling fallback providers when primary fails
|
|
12
|
+
* - Logging request/response metadata for observability
|
|
13
|
+
*/
|
|
14
|
+
import { type Logger } from '../observability/logger.js';
|
|
15
|
+
import { type Config, type InvokeAgentInput, type AgentResponse, type AgentConfig } from '../types.js';
|
|
16
|
+
import type { ProviderManager } from '../providers/manager.js';
|
|
17
|
+
/**
|
|
18
|
+
* Options for configuring the RouterEngine.
|
|
19
|
+
*/
|
|
20
|
+
export interface RouterEngineOptions {
|
|
21
|
+
/** Whether to enable fallback providers (default: true) */
|
|
22
|
+
enableFallback?: boolean;
|
|
23
|
+
/** Maximum retries before attempting fallback (default: 0) */
|
|
24
|
+
maxRetries?: number;
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* Result of a comparison operation for a single role.
|
|
28
|
+
*/
|
|
29
|
+
export interface ComparisonResult {
|
|
30
|
+
role: string;
|
|
31
|
+
status: 'fulfilled' | 'rejected';
|
|
32
|
+
response?: AgentResponse;
|
|
33
|
+
error?: Error;
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* Main routing engine for AgentRouter.
|
|
37
|
+
*
|
|
38
|
+
* Handles:
|
|
39
|
+
* - Role resolution to provider configurations
|
|
40
|
+
* - Message building with system prompts and context
|
|
41
|
+
* - Agent invocation with proper error handling
|
|
42
|
+
* - Parallel comparison of multiple agents
|
|
43
|
+
* - Fallback execution when primary providers fail
|
|
44
|
+
*
|
|
45
|
+
* @example
|
|
46
|
+
* ```ts
|
|
47
|
+
* const engine = new RouterEngine(config, providerManager, logger);
|
|
48
|
+
*
|
|
49
|
+
* // Invoke a single agent
|
|
50
|
+
* const response = await engine.invokeAgent({
|
|
51
|
+
* role: 'coder',
|
|
52
|
+
* task: 'Write a function to sort an array',
|
|
53
|
+
* context: 'Using TypeScript',
|
|
54
|
+
* });
|
|
55
|
+
*
|
|
56
|
+
* // Compare multiple agents
|
|
57
|
+
* const results = await engine.compareAgents(
|
|
58
|
+
* ['coder', 'reviewer'],
|
|
59
|
+
* 'Review this code for bugs'
|
|
60
|
+
* );
|
|
61
|
+
* ```
|
|
62
|
+
*/
|
|
63
|
+
export declare class RouterEngine {
|
|
64
|
+
private roleResolver;
|
|
65
|
+
private readonly providers;
|
|
66
|
+
private readonly logger;
|
|
67
|
+
private readonly options;
|
|
68
|
+
/**
|
|
69
|
+
* Create a new RouterEngine instance.
|
|
70
|
+
*
|
|
71
|
+
* @param config - Configuration object with role and provider definitions
|
|
72
|
+
* @param providers - Provider manager for accessing LLM providers
|
|
73
|
+
* @param logger - Logger instance for observability
|
|
74
|
+
* @param options - Optional configuration for the engine
|
|
75
|
+
*/
|
|
76
|
+
constructor(config: Config, providers: ProviderManager, logger: Logger, options?: RouterEngineOptions);
|
|
77
|
+
/**
|
|
78
|
+
* Invoke an agent by role.
|
|
79
|
+
*
|
|
80
|
+
* Flow:
|
|
81
|
+
* 1. Generate trace ID for request correlation
|
|
82
|
+
* 2. Log request start with role and task preview
|
|
83
|
+
* 3. Resolve role to agent configuration
|
|
84
|
+
* 4. Build messages array (system prompt + context + task)
|
|
85
|
+
* 5. Get provider from ProviderManager
|
|
86
|
+
* 6. Call provider.complete()
|
|
87
|
+
* 7. Log response with duration and token usage
|
|
88
|
+
* 8. Return AgentResponse
|
|
89
|
+
* 9. On error: try fallback if configured, otherwise throw
|
|
90
|
+
*
|
|
91
|
+
* @param input - Input parameters including role, task, and optional context
|
|
92
|
+
* @returns Promise resolving to the agent's response
|
|
93
|
+
* @throws ProviderError if the provider fails and no fallback is available
|
|
94
|
+
*/
|
|
95
|
+
invokeAgent(input: InvokeAgentInput): Promise<AgentResponse>;
|
|
96
|
+
/**
|
|
97
|
+
* Compare responses from multiple agents for the same task.
|
|
98
|
+
*
|
|
99
|
+
* Executes all agents in parallel using Promise.allSettled to ensure
|
|
100
|
+
* all results are collected even if some fail.
|
|
101
|
+
*
|
|
102
|
+
* @param roles - Array of role names to invoke
|
|
103
|
+
* @param task - The task to send to all agents
|
|
104
|
+
* @returns Map of role names to their responses (only includes successful results)
|
|
105
|
+
*/
|
|
106
|
+
compareAgents(roles: string[], task: string): Promise<Map<string, AgentResponse>>;
|
|
107
|
+
/**
|
|
108
|
+
* Update the configuration.
|
|
109
|
+
* This recreates the RoleResolver with the new configuration.
|
|
110
|
+
*
|
|
111
|
+
* @param config - New configuration object
|
|
112
|
+
*/
|
|
113
|
+
updateConfig(config: Config): void;
|
|
114
|
+
/**
|
|
115
|
+
* Get the list of available roles.
|
|
116
|
+
*
|
|
117
|
+
* @returns Array of role names
|
|
118
|
+
*/
|
|
119
|
+
listRoles(): string[];
|
|
120
|
+
/**
|
|
121
|
+
* Check if a role is configured.
|
|
122
|
+
*
|
|
123
|
+
* @param role - Role name to check
|
|
124
|
+
* @returns True if the role exists
|
|
125
|
+
*/
|
|
126
|
+
hasRole(role: string): boolean;
|
|
127
|
+
/**
|
|
128
|
+
* Resolve a role to its full agent configuration.
|
|
129
|
+
*
|
|
130
|
+
* @param role - Role name to resolve
|
|
131
|
+
* @returns Resolved agent configuration with all defaults applied
|
|
132
|
+
* @throws Error if the role does not exist
|
|
133
|
+
*/
|
|
134
|
+
resolveRole(role: string): AgentConfig;
|
|
135
|
+
/**
|
|
136
|
+
* Build the messages array for a completion request.
|
|
137
|
+
*
|
|
138
|
+
* Message structure:
|
|
139
|
+
* 1. System prompt (if configured) - wrapped in <system> tags
|
|
140
|
+
* 2. Context (if provided) - wrapped in <context> tags
|
|
141
|
+
* 3. Task - the actual user request
|
|
142
|
+
*
|
|
143
|
+
* @param agentConfig - Resolved agent configuration
|
|
144
|
+
* @param input - Input parameters with task and optional context
|
|
145
|
+
* @returns Array of messages for the completion request
|
|
146
|
+
*/
|
|
147
|
+
private buildMessages;
|
|
148
|
+
/**
|
|
149
|
+
* Invoke an agent using its fallback configuration.
|
|
150
|
+
*
|
|
151
|
+
* @param input - Original input parameters
|
|
152
|
+
* @param originalConfig - Original agent configuration (contains fallback)
|
|
153
|
+
* @param traceId - Trace ID for correlation
|
|
154
|
+
* @param startTime - Original start time for duration calculation
|
|
155
|
+
* @returns Promise resolving to the agent's response
|
|
156
|
+
*/
|
|
157
|
+
private invokeWithFallback;
|
|
158
|
+
}
|
|
159
|
+
/**
|
|
160
|
+
* Create a RouterEngine instance with default options.
|
|
161
|
+
*
|
|
162
|
+
* @param config - Configuration object
|
|
163
|
+
* @param providers - Provider manager
|
|
164
|
+
* @param logger - Logger instance
|
|
165
|
+
* @param options - Optional engine configuration
|
|
166
|
+
* @returns Configured RouterEngine instance
|
|
167
|
+
*/
|
|
168
|
+
export declare function createRouterEngine(config: Config, providers: ProviderManager, logger: Logger, options?: RouterEngineOptions): RouterEngine;
|
|
169
|
+
//# sourceMappingURL=engine.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"engine.d.ts","sourceRoot":"","sources":["../../src/router/engine.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,EAAmB,KAAM,MAAM,EAAE,MAAM,4BAA4B,CAAC;AAC3E,OAAO,EAAiB,KACtB,MAAM,EAAC,KACP,gBAAgB,EAAC,KACjB,aAAa,EAAC,KACd,WAAW,EAGZ,MAAM,aAAa,CAAC;AAIrB,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAC;AAO/D;;GAEG;AACH,MAAM,WAAW,mBAAmB;IAClC,2DAA2D;IAC3D,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,8DAA8D;IAC9D,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,WAAW,GAAG,UAAU,CAAC;IACjC,QAAQ,CAAC,EAAE,aAAa,CAAC;IACzB,KAAK,CAAC,EAAE,KAAK,CAAC;CACf;AAMD;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2BG;AACH,qBAAa,YAAY;IACvB,OAAO,CAAC,YAAY,CAAe;IACnC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAkB;IAC5C,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAS;IAChC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAgC;IAExD;;;;;;;OAOG;gBAED,MAAM,EAAE,MAAM,EACd,SAAS,EAAE,eAAe,EAC1B,MAAM,EAAE,MAAM,EACd,OAAO,GAAE,mBAAwB;IAWnC;;;;;;;;;;;;;;;;;OAiBG;IACG,WAAW,CAAC,KAAK,EAAE,gBAAgB,GAAG,OAAO,CAAC,aAAa,CAAC;IAgHlE;;;;;;;;;OASG;IACG,aAAa,CAAC,KAAK,EAAE,MAAM,EAAE,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,aAAa,CAAC,CAAC;IAkEvF;;;;;OAKG;IACH,YAAY,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI;IASlC;;;;OAIG;IACH,SAAS,IAAI,MAAM,EAAE;IAIrB;;;;;OAKG;IACH,OAAO,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO;IAI9B;;;;;;OAMG;IACH,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,WAAW;IAQtC;;;;;;;;;;;OAWG;IACH,OAAO,CAAC,aAAa;IAoCrB;;;;;;;;OAQG;YACW,kBAAkB;CAoGjC;AAED;;;;;;;;GAQG;AACH,wBAAgB,kBAAkB,CAChC,MAAM,EAAE,MAAM,EACd,SAAS,EAAE,eAAe,EAC1B,MAAM,EAAE,MAAM,EACd,OAAO,CAAC,EAAE,mBAAmB,GAC5B,YAAY,CAEd"}
|
|
@@ -0,0 +1,435 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Router Engine
|
|
3
|
+
*
|
|
4
|
+
* The main orchestration logic for AgentRouter.
|
|
5
|
+
* Responsible for resolving roles to configurations and executing
|
|
6
|
+
* agent invocations against the appropriate providers.
|
|
7
|
+
*
|
|
8
|
+
* Key responsibilities:
|
|
9
|
+
* - Invoking agents by role with proper message construction
|
|
10
|
+
* - Comparing responses from multiple agents in parallel
|
|
11
|
+
* - Handling fallback providers when primary fails
|
|
12
|
+
* - Logging request/response metadata for observability
|
|
13
|
+
*/
|
|
14
|
+
import { generateTraceId } from '../observability/logger.js';
|
|
15
|
+
import { ProviderError, } from '../types.js';
|
|
16
|
+
import { RoleResolver } from './role-resolver.js';
|
|
17
|
+
// ============================================================================
|
|
18
|
+
// RouterEngine Class
|
|
19
|
+
// ============================================================================
|
|
20
|
+
/**
|
|
21
|
+
* Main routing engine for AgentRouter.
|
|
22
|
+
*
|
|
23
|
+
* Handles:
|
|
24
|
+
* - Role resolution to provider configurations
|
|
25
|
+
* - Message building with system prompts and context
|
|
26
|
+
* - Agent invocation with proper error handling
|
|
27
|
+
* - Parallel comparison of multiple agents
|
|
28
|
+
* - Fallback execution when primary providers fail
|
|
29
|
+
*
|
|
30
|
+
* @example
|
|
31
|
+
* ```ts
|
|
32
|
+
* const engine = new RouterEngine(config, providerManager, logger);
|
|
33
|
+
*
|
|
34
|
+
* // Invoke a single agent
|
|
35
|
+
* const response = await engine.invokeAgent({
|
|
36
|
+
* role: 'coder',
|
|
37
|
+
* task: 'Write a function to sort an array',
|
|
38
|
+
* context: 'Using TypeScript',
|
|
39
|
+
* });
|
|
40
|
+
*
|
|
41
|
+
* // Compare multiple agents
|
|
42
|
+
* const results = await engine.compareAgents(
|
|
43
|
+
* ['coder', 'reviewer'],
|
|
44
|
+
* 'Review this code for bugs'
|
|
45
|
+
* );
|
|
46
|
+
* ```
|
|
47
|
+
*/
|
|
48
|
+
export class RouterEngine {
|
|
49
|
+
roleResolver;
|
|
50
|
+
providers;
|
|
51
|
+
logger;
|
|
52
|
+
options;
|
|
53
|
+
/**
|
|
54
|
+
* Create a new RouterEngine instance.
|
|
55
|
+
*
|
|
56
|
+
* @param config - Configuration object with role and provider definitions
|
|
57
|
+
* @param providers - Provider manager for accessing LLM providers
|
|
58
|
+
* @param logger - Logger instance for observability
|
|
59
|
+
* @param options - Optional configuration for the engine
|
|
60
|
+
*/
|
|
61
|
+
constructor(config, providers, logger, options = {}) {
|
|
62
|
+
this.roleResolver = new RoleResolver(config);
|
|
63
|
+
this.providers = providers;
|
|
64
|
+
this.logger = logger;
|
|
65
|
+
this.options = {
|
|
66
|
+
enableFallback: options.enableFallback ?? true,
|
|
67
|
+
maxRetries: options.maxRetries ?? 0,
|
|
68
|
+
};
|
|
69
|
+
}
|
|
70
|
+
/**
|
|
71
|
+
* Invoke an agent by role.
|
|
72
|
+
*
|
|
73
|
+
* Flow:
|
|
74
|
+
* 1. Generate trace ID for request correlation
|
|
75
|
+
* 2. Log request start with role and task preview
|
|
76
|
+
* 3. Resolve role to agent configuration
|
|
77
|
+
* 4. Build messages array (system prompt + context + task)
|
|
78
|
+
* 5. Get provider from ProviderManager
|
|
79
|
+
* 6. Call provider.complete()
|
|
80
|
+
* 7. Log response with duration and token usage
|
|
81
|
+
* 8. Return AgentResponse
|
|
82
|
+
* 9. On error: try fallback if configured, otherwise throw
|
|
83
|
+
*
|
|
84
|
+
* @param input - Input parameters including role, task, and optional context
|
|
85
|
+
* @returns Promise resolving to the agent's response
|
|
86
|
+
* @throws ProviderError if the provider fails and no fallback is available
|
|
87
|
+
*/
|
|
88
|
+
async invokeAgent(input) {
|
|
89
|
+
const startTime = Date.now();
|
|
90
|
+
const traceId = generateTraceId();
|
|
91
|
+
this.logger.info('Invoking agent', {
|
|
92
|
+
traceId,
|
|
93
|
+
role: input.role,
|
|
94
|
+
taskPreview: input.task.substring(0, 100) + (input.task.length > 100 ? '...' : ''),
|
|
95
|
+
hasContext: !!input.context,
|
|
96
|
+
hasTools: !!input.tools?.length,
|
|
97
|
+
});
|
|
98
|
+
try {
|
|
99
|
+
// 1. Resolve role to agent configuration
|
|
100
|
+
const agentConfig = this.roleResolver.resolve(input.role);
|
|
101
|
+
this.logger.debug('Role resolved', {
|
|
102
|
+
traceId,
|
|
103
|
+
role: input.role,
|
|
104
|
+
provider: agentConfig.provider,
|
|
105
|
+
model: agentConfig.model,
|
|
106
|
+
temperature: agentConfig.temperature,
|
|
107
|
+
maxTokens: agentConfig.max_tokens,
|
|
108
|
+
});
|
|
109
|
+
// 2. Build messages with system prompt and context
|
|
110
|
+
const messages = this.buildMessages(agentConfig, input);
|
|
111
|
+
// 3. Get provider for this agent
|
|
112
|
+
const provider = this.providers.get(agentConfig.provider);
|
|
113
|
+
// 4. Build completion request
|
|
114
|
+
const request = {
|
|
115
|
+
model: agentConfig.model,
|
|
116
|
+
messages,
|
|
117
|
+
temperature: agentConfig.temperature,
|
|
118
|
+
max_tokens: agentConfig.max_tokens,
|
|
119
|
+
timeout_ms: agentConfig.timeout_ms,
|
|
120
|
+
};
|
|
121
|
+
// Only add tools if provided (exactOptionalPropertyTypes compliance)
|
|
122
|
+
if (input.tools && input.tools.length > 0) {
|
|
123
|
+
request.tools = input.tools;
|
|
124
|
+
}
|
|
125
|
+
// 5. Execute request
|
|
126
|
+
const response = await provider.complete(request);
|
|
127
|
+
// 6. Calculate duration and log success
|
|
128
|
+
const durationMs = Date.now() - startTime;
|
|
129
|
+
this.logger.info('Agent response received', {
|
|
130
|
+
traceId,
|
|
131
|
+
role: input.role,
|
|
132
|
+
provider: agentConfig.provider,
|
|
133
|
+
model: agentConfig.model,
|
|
134
|
+
durationMs,
|
|
135
|
+
inputTokens: response.usage?.input_tokens,
|
|
136
|
+
outputTokens: response.usage?.output_tokens,
|
|
137
|
+
stopReason: response.stop_reason,
|
|
138
|
+
});
|
|
139
|
+
// 7. Return formatted response
|
|
140
|
+
const result = {
|
|
141
|
+
role: input.role,
|
|
142
|
+
provider: agentConfig.provider,
|
|
143
|
+
model: agentConfig.model,
|
|
144
|
+
content: response.content,
|
|
145
|
+
metadata: {
|
|
146
|
+
traceId,
|
|
147
|
+
durationMs,
|
|
148
|
+
},
|
|
149
|
+
};
|
|
150
|
+
// Only add usage if provided (exactOptionalPropertyTypes compliance)
|
|
151
|
+
if (response.usage) {
|
|
152
|
+
result.usage = response.usage;
|
|
153
|
+
}
|
|
154
|
+
return result;
|
|
155
|
+
}
|
|
156
|
+
catch (error) {
|
|
157
|
+
const durationMs = Date.now() - startTime;
|
|
158
|
+
const errorMessage = error instanceof Error ? error.message : String(error);
|
|
159
|
+
this.logger.error('Agent invocation failed', {
|
|
160
|
+
traceId,
|
|
161
|
+
role: input.role,
|
|
162
|
+
durationMs,
|
|
163
|
+
errorMessage,
|
|
164
|
+
});
|
|
165
|
+
// Try fallback if configured and enabled
|
|
166
|
+
if (this.options.enableFallback) {
|
|
167
|
+
const agentConfig = this.roleResolver.resolve(input.role);
|
|
168
|
+
if (agentConfig.fallback) {
|
|
169
|
+
this.logger.info('Attempting fallback provider', {
|
|
170
|
+
traceId,
|
|
171
|
+
role: input.role,
|
|
172
|
+
fallbackProvider: agentConfig.fallback.provider,
|
|
173
|
+
fallbackModel: agentConfig.fallback.model,
|
|
174
|
+
});
|
|
175
|
+
return this.invokeWithFallback(input, agentConfig, traceId, startTime);
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
// Re-throw if no fallback available
|
|
179
|
+
throw error;
|
|
180
|
+
}
|
|
181
|
+
}
|
|
182
|
+
/**
|
|
183
|
+
* Compare responses from multiple agents for the same task.
|
|
184
|
+
*
|
|
185
|
+
* Executes all agents in parallel using Promise.allSettled to ensure
|
|
186
|
+
* all results are collected even if some fail.
|
|
187
|
+
*
|
|
188
|
+
* @param roles - Array of role names to invoke
|
|
189
|
+
* @param task - The task to send to all agents
|
|
190
|
+
* @returns Map of role names to their responses (only includes successful results)
|
|
191
|
+
*/
|
|
192
|
+
async compareAgents(roles, task) {
|
|
193
|
+
const traceId = generateTraceId();
|
|
194
|
+
const startTime = Date.now();
|
|
195
|
+
this.logger.info('Starting agent comparison', {
|
|
196
|
+
traceId,
|
|
197
|
+
roles,
|
|
198
|
+
taskPreview: task.substring(0, 100) + (task.length > 100 ? '...' : ''),
|
|
199
|
+
});
|
|
200
|
+
const results = new Map();
|
|
201
|
+
// Execute all agents in parallel
|
|
202
|
+
const promises = roles.map(async (role) => {
|
|
203
|
+
try {
|
|
204
|
+
const response = await this.invokeAgent({ role, task });
|
|
205
|
+
return { role, status: 'fulfilled', response };
|
|
206
|
+
}
|
|
207
|
+
catch (error) {
|
|
208
|
+
return {
|
|
209
|
+
role,
|
|
210
|
+
status: 'rejected',
|
|
211
|
+
error: error instanceof Error ? error : new Error(String(error)),
|
|
212
|
+
};
|
|
213
|
+
}
|
|
214
|
+
});
|
|
215
|
+
const responses = await Promise.allSettled(promises);
|
|
216
|
+
// Process results
|
|
217
|
+
for (const result of responses) {
|
|
218
|
+
if (result.status === 'fulfilled') {
|
|
219
|
+
const { role, status, response, error } = result.value;
|
|
220
|
+
if (status === 'fulfilled' && response) {
|
|
221
|
+
results.set(role, response);
|
|
222
|
+
}
|
|
223
|
+
else if (status === 'rejected' && error) {
|
|
224
|
+
this.logger.error('Agent comparison failed for role', {
|
|
225
|
+
traceId,
|
|
226
|
+
role,
|
|
227
|
+
errorMessage: error.message,
|
|
228
|
+
});
|
|
229
|
+
}
|
|
230
|
+
}
|
|
231
|
+
else {
|
|
232
|
+
// This shouldn't happen since we catch errors in the promise,
|
|
233
|
+
// but handle it just in case
|
|
234
|
+
const errorMessage = result.reason instanceof Error ? result.reason.message : String(result.reason);
|
|
235
|
+
this.logger.error('Unexpected error in agent comparison', {
|
|
236
|
+
traceId,
|
|
237
|
+
errorMessage,
|
|
238
|
+
});
|
|
239
|
+
}
|
|
240
|
+
}
|
|
241
|
+
const durationMs = Date.now() - startTime;
|
|
242
|
+
this.logger.info('Agent comparison completed', {
|
|
243
|
+
traceId,
|
|
244
|
+
totalRoles: roles.length,
|
|
245
|
+
successfulRoles: results.size,
|
|
246
|
+
failedRoles: roles.length - results.size,
|
|
247
|
+
durationMs,
|
|
248
|
+
});
|
|
249
|
+
return results;
|
|
250
|
+
}
|
|
251
|
+
/**
|
|
252
|
+
* Update the configuration.
|
|
253
|
+
* This recreates the RoleResolver with the new configuration.
|
|
254
|
+
*
|
|
255
|
+
* @param config - New configuration object
|
|
256
|
+
*/
|
|
257
|
+
updateConfig(config) {
|
|
258
|
+
this.logger.info('Updating router configuration', {
|
|
259
|
+
version: config.version,
|
|
260
|
+
roleCount: Object.keys(config.roles).length,
|
|
261
|
+
});
|
|
262
|
+
this.roleResolver = new RoleResolver(config);
|
|
263
|
+
}
|
|
264
|
+
/**
|
|
265
|
+
* Get the list of available roles.
|
|
266
|
+
*
|
|
267
|
+
* @returns Array of role names
|
|
268
|
+
*/
|
|
269
|
+
listRoles() {
|
|
270
|
+
return this.roleResolver.listRoles();
|
|
271
|
+
}
|
|
272
|
+
/**
|
|
273
|
+
* Check if a role is configured.
|
|
274
|
+
*
|
|
275
|
+
* @param role - Role name to check
|
|
276
|
+
* @returns True if the role exists
|
|
277
|
+
*/
|
|
278
|
+
hasRole(role) {
|
|
279
|
+
return this.roleResolver.hasRole(role);
|
|
280
|
+
}
|
|
281
|
+
/**
|
|
282
|
+
* Resolve a role to its full agent configuration.
|
|
283
|
+
*
|
|
284
|
+
* @param role - Role name to resolve
|
|
285
|
+
* @returns Resolved agent configuration with all defaults applied
|
|
286
|
+
* @throws Error if the role does not exist
|
|
287
|
+
*/
|
|
288
|
+
resolveRole(role) {
|
|
289
|
+
return this.roleResolver.resolve(role);
|
|
290
|
+
}
|
|
291
|
+
// ==========================================================================
|
|
292
|
+
// Private Methods
|
|
293
|
+
// ==========================================================================
|
|
294
|
+
/**
|
|
295
|
+
* Build the messages array for a completion request.
|
|
296
|
+
*
|
|
297
|
+
* Message structure:
|
|
298
|
+
* 1. System prompt (if configured) - wrapped in <system> tags
|
|
299
|
+
* 2. Context (if provided) - wrapped in <context> tags
|
|
300
|
+
* 3. Task - the actual user request
|
|
301
|
+
*
|
|
302
|
+
* @param agentConfig - Resolved agent configuration
|
|
303
|
+
* @param input - Input parameters with task and optional context
|
|
304
|
+
* @returns Array of messages for the completion request
|
|
305
|
+
*/
|
|
306
|
+
buildMessages(agentConfig, input) {
|
|
307
|
+
const messages = [];
|
|
308
|
+
// Add system prompt if configured
|
|
309
|
+
// Note: Some providers handle system prompts differently
|
|
310
|
+
// The translation layer will convert this appropriately
|
|
311
|
+
if (agentConfig.system_prompt) {
|
|
312
|
+
messages.push({
|
|
313
|
+
role: 'user',
|
|
314
|
+
content: `<system>\n${agentConfig.system_prompt}\n</system>`,
|
|
315
|
+
});
|
|
316
|
+
// Add assistant acknowledgment for better prompt structure
|
|
317
|
+
messages.push({
|
|
318
|
+
role: 'assistant',
|
|
319
|
+
content: 'I understand my role and will respond accordingly. Please provide your request.',
|
|
320
|
+
});
|
|
321
|
+
}
|
|
322
|
+
// Add context if provided
|
|
323
|
+
if (input.context) {
|
|
324
|
+
messages.push({
|
|
325
|
+
role: 'user',
|
|
326
|
+
content: `<context>\n${input.context}\n</context>`,
|
|
327
|
+
});
|
|
328
|
+
}
|
|
329
|
+
// Add the actual task
|
|
330
|
+
messages.push({
|
|
331
|
+
role: 'user',
|
|
332
|
+
content: input.task,
|
|
333
|
+
});
|
|
334
|
+
return messages;
|
|
335
|
+
}
|
|
336
|
+
/**
|
|
337
|
+
* Invoke an agent using its fallback configuration.
|
|
338
|
+
*
|
|
339
|
+
* @param input - Original input parameters
|
|
340
|
+
* @param originalConfig - Original agent configuration (contains fallback)
|
|
341
|
+
* @param traceId - Trace ID for correlation
|
|
342
|
+
* @param startTime - Original start time for duration calculation
|
|
343
|
+
* @returns Promise resolving to the agent's response
|
|
344
|
+
*/
|
|
345
|
+
async invokeWithFallback(input, originalConfig, traceId, startTime) {
|
|
346
|
+
const fallbackConfig = originalConfig.fallback;
|
|
347
|
+
const fallbackStartTime = Date.now();
|
|
348
|
+
try {
|
|
349
|
+
// Build a synthetic agent config from the fallback
|
|
350
|
+
const syntheticConfig = {
|
|
351
|
+
provider: fallbackConfig.provider,
|
|
352
|
+
model: fallbackConfig.model,
|
|
353
|
+
// Inherit other settings from original config
|
|
354
|
+
temperature: originalConfig.temperature,
|
|
355
|
+
max_tokens: originalConfig.max_tokens,
|
|
356
|
+
timeout_ms: originalConfig.timeout_ms,
|
|
357
|
+
// No nested fallback to prevent infinite recursion
|
|
358
|
+
};
|
|
359
|
+
// Only add system_prompt if defined (exactOptionalPropertyTypes compliance)
|
|
360
|
+
if (originalConfig.system_prompt) {
|
|
361
|
+
syntheticConfig.system_prompt = originalConfig.system_prompt;
|
|
362
|
+
}
|
|
363
|
+
// Build messages with the synthetic config
|
|
364
|
+
const messages = this.buildMessages(syntheticConfig, input);
|
|
365
|
+
// Get the fallback provider
|
|
366
|
+
const provider = this.providers.get(fallbackConfig.provider);
|
|
367
|
+
// Build completion request
|
|
368
|
+
const request = {
|
|
369
|
+
model: fallbackConfig.model,
|
|
370
|
+
messages,
|
|
371
|
+
temperature: syntheticConfig.temperature,
|
|
372
|
+
max_tokens: syntheticConfig.max_tokens,
|
|
373
|
+
timeout_ms: syntheticConfig.timeout_ms,
|
|
374
|
+
};
|
|
375
|
+
// Only add tools if provided (exactOptionalPropertyTypes compliance)
|
|
376
|
+
if (input.tools && input.tools.length > 0) {
|
|
377
|
+
request.tools = input.tools;
|
|
378
|
+
}
|
|
379
|
+
// Execute request
|
|
380
|
+
const response = await provider.complete(request);
|
|
381
|
+
const durationMs = Date.now() - startTime;
|
|
382
|
+
const fallbackDurationMs = Date.now() - fallbackStartTime;
|
|
383
|
+
this.logger.info('Fallback agent response received', {
|
|
384
|
+
traceId,
|
|
385
|
+
role: input.role,
|
|
386
|
+
provider: fallbackConfig.provider,
|
|
387
|
+
model: fallbackConfig.model,
|
|
388
|
+
durationMs,
|
|
389
|
+
fallbackDurationMs,
|
|
390
|
+
inputTokens: response.usage?.input_tokens,
|
|
391
|
+
outputTokens: response.usage?.output_tokens,
|
|
392
|
+
});
|
|
393
|
+
const result = {
|
|
394
|
+
role: input.role,
|
|
395
|
+
provider: fallbackConfig.provider,
|
|
396
|
+
model: fallbackConfig.model,
|
|
397
|
+
content: response.content,
|
|
398
|
+
metadata: {
|
|
399
|
+
traceId,
|
|
400
|
+
durationMs,
|
|
401
|
+
},
|
|
402
|
+
};
|
|
403
|
+
// Only add usage if provided (exactOptionalPropertyTypes compliance)
|
|
404
|
+
if (response.usage) {
|
|
405
|
+
result.usage = response.usage;
|
|
406
|
+
}
|
|
407
|
+
return result;
|
|
408
|
+
}
|
|
409
|
+
catch (fallbackError) {
|
|
410
|
+
const durationMs = Date.now() - startTime;
|
|
411
|
+
const errorMessage = fallbackError instanceof Error ? fallbackError.message : String(fallbackError);
|
|
412
|
+
this.logger.error('Fallback invocation also failed', {
|
|
413
|
+
traceId,
|
|
414
|
+
role: input.role,
|
|
415
|
+
fallbackProvider: fallbackConfig.provider,
|
|
416
|
+
durationMs,
|
|
417
|
+
errorMessage,
|
|
418
|
+
});
|
|
419
|
+
throw new ProviderError(`Both primary and fallback providers failed for role '${input.role}'`, fallbackConfig.provider, undefined, fallbackError instanceof Error ? fallbackError : undefined);
|
|
420
|
+
}
|
|
421
|
+
}
|
|
422
|
+
}
|
|
423
|
+
/**
|
|
424
|
+
* Create a RouterEngine instance with default options.
|
|
425
|
+
*
|
|
426
|
+
* @param config - Configuration object
|
|
427
|
+
* @param providers - Provider manager
|
|
428
|
+
* @param logger - Logger instance
|
|
429
|
+
* @param options - Optional engine configuration
|
|
430
|
+
* @returns Configured RouterEngine instance
|
|
431
|
+
*/
|
|
432
|
+
export function createRouterEngine(config, providers, logger, options) {
|
|
433
|
+
return new RouterEngine(config, providers, logger, options);
|
|
434
|
+
}
|
|
435
|
+
//# sourceMappingURL=engine.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"engine.js","sourceRoot":"","sources":["../../src/router/engine.ts"],"names":[],"mappings":"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"}
|