@ai-orchestration/core 0.1.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/.eslintrc.json +27 -0
- package/README.md +516 -0
- package/dist/core/errors.d.ts +21 -0
- package/dist/core/errors.d.ts.map +1 -0
- package/dist/core/errors.js +38 -0
- package/dist/core/errors.js.map +1 -0
- package/dist/core/interfaces.d.ts +87 -0
- package/dist/core/interfaces.d.ts.map +1 -0
- package/dist/core/interfaces.js +5 -0
- package/dist/core/interfaces.js.map +1 -0
- package/dist/core/orchestrator.d.ts +55 -0
- package/dist/core/orchestrator.d.ts.map +1 -0
- package/dist/core/orchestrator.js +147 -0
- package/dist/core/orchestrator.js.map +1 -0
- package/dist/core/types.d.ts +72 -0
- package/dist/core/types.d.ts.map +1 -0
- package/dist/core/types.js +5 -0
- package/dist/core/types.js.map +1 -0
- package/dist/factory/index.d.ts +14 -0
- package/dist/factory/index.d.ts.map +1 -0
- package/dist/factory/index.js +184 -0
- package/dist/factory/index.js.map +1 -0
- package/dist/index.d.ts +14 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +15 -0
- package/dist/index.js.map +1 -0
- package/dist/providers/base.d.ts +30 -0
- package/dist/providers/base.d.ts.map +1 -0
- package/dist/providers/base.js +31 -0
- package/dist/providers/base.js.map +1 -0
- package/dist/providers/cerebras.d.ts +26 -0
- package/dist/providers/cerebras.d.ts.map +1 -0
- package/dist/providers/cerebras.js +190 -0
- package/dist/providers/cerebras.js.map +1 -0
- package/dist/providers/gemini.d.ts +26 -0
- package/dist/providers/gemini.d.ts.map +1 -0
- package/dist/providers/gemini.js +181 -0
- package/dist/providers/gemini.js.map +1 -0
- package/dist/providers/groq.d.ts +26 -0
- package/dist/providers/groq.d.ts.map +1 -0
- package/dist/providers/groq.js +225 -0
- package/dist/providers/groq.js.map +1 -0
- package/dist/providers/index.d.ts +15 -0
- package/dist/providers/index.d.ts.map +1 -0
- package/dist/providers/index.js +10 -0
- package/dist/providers/index.js.map +1 -0
- package/dist/providers/local.d.ts +27 -0
- package/dist/providers/local.d.ts.map +1 -0
- package/dist/providers/local.js +198 -0
- package/dist/providers/local.js.map +1 -0
- package/dist/providers/openrouter.d.ts +26 -0
- package/dist/providers/openrouter.d.ts.map +1 -0
- package/dist/providers/openrouter.js +172 -0
- package/dist/providers/openrouter.js.map +1 -0
- package/dist/strategies/base.d.ts +16 -0
- package/dist/strategies/base.d.ts.map +1 -0
- package/dist/strategies/base.js +21 -0
- package/dist/strategies/base.js.map +1 -0
- package/dist/strategies/fallback.d.ts +14 -0
- package/dist/strategies/fallback.d.ts.map +1 -0
- package/dist/strategies/fallback.js +29 -0
- package/dist/strategies/fallback.js.map +1 -0
- package/dist/strategies/health-aware.d.ts +20 -0
- package/dist/strategies/health-aware.d.ts.map +1 -0
- package/dist/strategies/health-aware.js +106 -0
- package/dist/strategies/health-aware.js.map +1 -0
- package/dist/strategies/index.d.ts +14 -0
- package/dist/strategies/index.d.ts.map +1 -0
- package/dist/strategies/index.js +10 -0
- package/dist/strategies/index.js.map +1 -0
- package/dist/strategies/priority.d.ts +18 -0
- package/dist/strategies/priority.d.ts.map +1 -0
- package/dist/strategies/priority.js +35 -0
- package/dist/strategies/priority.js.map +1 -0
- package/dist/strategies/round-robin.d.ts +10 -0
- package/dist/strategies/round-robin.d.ts.map +1 -0
- package/dist/strategies/round-robin.js +21 -0
- package/dist/strategies/round-robin.js.map +1 -0
- package/dist/strategies/weighted.d.ts +20 -0
- package/dist/strategies/weighted.d.ts.map +1 -0
- package/dist/strategies/weighted.js +58 -0
- package/dist/strategies/weighted.js.map +1 -0
- package/docs/ARCHITECTURE.md +126 -0
- package/docs/CHANGELOG.md +30 -0
- package/docs/CONTRIBUTING.md +198 -0
- package/examples/basic.ts +58 -0
- package/examples/chat-app/README.md +146 -0
- package/examples/chat-app/config.json +34 -0
- package/examples/chat-app/index.ts +330 -0
- package/examples/chat-app/package-lock.json +570 -0
- package/examples/chat-app/package.json +20 -0
- package/examples/config.example.json +42 -0
- package/examples/strategies.ts +112 -0
- package/examples/test-local.ts +150 -0
- package/examples/test-mock.ts +172 -0
- package/package/.eslintrc.json +27 -0
- package/package/CHANGELOG.md +31 -0
- package/package/CONTRIBUTING.md +156 -0
- package/package/PUBLISHING.md +213 -0
- package/package/README.md +515 -0
- package/package/dist/core/errors.d.ts +21 -0
- package/package/dist/core/errors.d.ts.map +1 -0
- package/package/dist/core/errors.js +38 -0
- package/package/dist/core/errors.js.map +1 -0
- package/package/dist/core/interfaces.d.ts +87 -0
- package/package/dist/core/interfaces.d.ts.map +1 -0
- package/package/dist/core/interfaces.js +5 -0
- package/package/dist/core/interfaces.js.map +1 -0
- package/package/dist/core/orchestrator.d.ts +55 -0
- package/package/dist/core/orchestrator.d.ts.map +1 -0
- package/package/dist/core/orchestrator.js +147 -0
- package/package/dist/core/orchestrator.js.map +1 -0
- package/package/dist/core/types.d.ts +72 -0
- package/package/dist/core/types.d.ts.map +1 -0
- package/package/dist/core/types.js +5 -0
- package/package/dist/core/types.js.map +1 -0
- package/package/dist/factory/index.d.ts +14 -0
- package/package/dist/factory/index.d.ts.map +1 -0
- package/package/dist/factory/index.js +184 -0
- package/package/dist/factory/index.js.map +1 -0
- package/package/dist/index.d.ts +14 -0
- package/package/dist/index.d.ts.map +1 -0
- package/package/dist/index.js +15 -0
- package/package/dist/index.js.map +1 -0
- package/package/dist/providers/base.d.ts +30 -0
- package/package/dist/providers/base.d.ts.map +1 -0
- package/package/dist/providers/base.js +31 -0
- package/package/dist/providers/base.js.map +1 -0
- package/package/dist/providers/cerebras.d.ts +26 -0
- package/package/dist/providers/cerebras.d.ts.map +1 -0
- package/package/dist/providers/cerebras.js +190 -0
- package/package/dist/providers/cerebras.js.map +1 -0
- package/package/dist/providers/gemini.d.ts +26 -0
- package/package/dist/providers/gemini.d.ts.map +1 -0
- package/package/dist/providers/gemini.js +181 -0
- package/package/dist/providers/gemini.js.map +1 -0
- package/package/dist/providers/groq.d.ts +26 -0
- package/package/dist/providers/groq.d.ts.map +1 -0
- package/package/dist/providers/groq.js +225 -0
- package/package/dist/providers/groq.js.map +1 -0
- package/package/dist/providers/index.d.ts +15 -0
- package/package/dist/providers/index.d.ts.map +1 -0
- package/package/dist/providers/index.js +10 -0
- package/package/dist/providers/index.js.map +1 -0
- package/package/dist/providers/local.d.ts +27 -0
- package/package/dist/providers/local.d.ts.map +1 -0
- package/package/dist/providers/local.js +198 -0
- package/package/dist/providers/local.js.map +1 -0
- package/package/dist/providers/openrouter.d.ts +26 -0
- package/package/dist/providers/openrouter.d.ts.map +1 -0
- package/package/dist/providers/openrouter.js +172 -0
- package/package/dist/providers/openrouter.js.map +1 -0
- package/package/dist/strategies/base.d.ts +16 -0
- package/package/dist/strategies/base.d.ts.map +1 -0
- package/package/dist/strategies/base.js +21 -0
- package/package/dist/strategies/base.js.map +1 -0
- package/package/dist/strategies/fallback.d.ts +14 -0
- package/package/dist/strategies/fallback.d.ts.map +1 -0
- package/package/dist/strategies/fallback.js +29 -0
- package/package/dist/strategies/fallback.js.map +1 -0
- package/package/dist/strategies/health-aware.d.ts +20 -0
- package/package/dist/strategies/health-aware.d.ts.map +1 -0
- package/package/dist/strategies/health-aware.js +106 -0
- package/package/dist/strategies/health-aware.js.map +1 -0
- package/package/dist/strategies/index.d.ts +14 -0
- package/package/dist/strategies/index.d.ts.map +1 -0
- package/package/dist/strategies/index.js +10 -0
- package/package/dist/strategies/index.js.map +1 -0
- package/package/dist/strategies/priority.d.ts +18 -0
- package/package/dist/strategies/priority.d.ts.map +1 -0
- package/package/dist/strategies/priority.js +35 -0
- package/package/dist/strategies/priority.js.map +1 -0
- package/package/dist/strategies/round-robin.d.ts +10 -0
- package/package/dist/strategies/round-robin.d.ts.map +1 -0
- package/package/dist/strategies/round-robin.js +21 -0
- package/package/dist/strategies/round-robin.js.map +1 -0
- package/package/dist/strategies/weighted.d.ts +20 -0
- package/package/dist/strategies/weighted.d.ts.map +1 -0
- package/package/dist/strategies/weighted.js +58 -0
- package/package/dist/strategies/weighted.js.map +1 -0
- package/package/docs/ARCHITECTURE.md +127 -0
- package/package/examples/basic.ts +58 -0
- package/package/examples/chat-app/README.md +146 -0
- package/package/examples/chat-app/config.json +34 -0
- package/package/examples/chat-app/index.ts +330 -0
- package/package/examples/chat-app/package-lock.json +570 -0
- package/package/examples/chat-app/package.json +20 -0
- package/package/examples/config.example.json +42 -0
- package/package/examples/strategies.ts +112 -0
- package/package/examples/test-local.ts +150 -0
- package/package/examples/test-mock.ts +172 -0
- package/package/package.json +62 -0
- package/package/scripts/check-types.ts +15 -0
- package/package/scripts/link.sh +30 -0
- package/package/scripts/pack.sh +36 -0
- package/package.json +62 -0
- package/scripts/check-types.ts +15 -0
- package/scripts/link.sh +30 -0
- package/scripts/pack.sh +36 -0
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Custom error classes for the framework
|
|
3
|
+
*/
|
|
4
|
+
export declare class ProviderError extends Error {
|
|
5
|
+
readonly providerId: string;
|
|
6
|
+
readonly cause?: Error | undefined;
|
|
7
|
+
constructor(message: string, providerId: string, cause?: Error | undefined);
|
|
8
|
+
}
|
|
9
|
+
export declare class StrategyError extends Error {
|
|
10
|
+
readonly cause?: Error | undefined;
|
|
11
|
+
constructor(message: string, cause?: Error | undefined);
|
|
12
|
+
}
|
|
13
|
+
export declare class OrchestratorError extends Error {
|
|
14
|
+
readonly cause?: Error | undefined;
|
|
15
|
+
constructor(message: string, cause?: Error | undefined);
|
|
16
|
+
}
|
|
17
|
+
export declare class ConfigurationError extends Error {
|
|
18
|
+
readonly cause?: Error | undefined;
|
|
19
|
+
constructor(message: string, cause?: Error | undefined);
|
|
20
|
+
}
|
|
21
|
+
//# sourceMappingURL=errors.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../../src/core/errors.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,qBAAa,aAAc,SAAQ,KAAK;aAGpB,UAAU,EAAE,MAAM;aAClB,KAAK,CAAC,EAAE,KAAK;gBAF7B,OAAO,EAAE,MAAM,EACC,UAAU,EAAE,MAAM,EAClB,KAAK,CAAC,EAAE,KAAK,YAAA;CAKhC;AAED,qBAAa,aAAc,SAAQ,KAAK;aACO,KAAK,CAAC,EAAE,KAAK;gBAA9C,OAAO,EAAE,MAAM,EAAkB,KAAK,CAAC,EAAE,KAAK,YAAA;CAI3D;AAED,qBAAa,iBAAkB,SAAQ,KAAK;aACG,KAAK,CAAC,EAAE,KAAK;gBAA9C,OAAO,EAAE,MAAM,EAAkB,KAAK,CAAC,EAAE,KAAK,YAAA;CAI3D;AAED,qBAAa,kBAAmB,SAAQ,KAAK;aACE,KAAK,CAAC,EAAE,KAAK;gBAA9C,OAAO,EAAE,MAAM,EAAkB,KAAK,CAAC,EAAE,KAAK,YAAA;CAI3D"}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Custom error classes for the framework
|
|
3
|
+
*/
|
|
4
|
+
export class ProviderError extends Error {
|
|
5
|
+
providerId;
|
|
6
|
+
cause;
|
|
7
|
+
constructor(message, providerId, cause) {
|
|
8
|
+
super(message);
|
|
9
|
+
this.providerId = providerId;
|
|
10
|
+
this.cause = cause;
|
|
11
|
+
this.name = 'ProviderError';
|
|
12
|
+
}
|
|
13
|
+
}
|
|
14
|
+
export class StrategyError extends Error {
|
|
15
|
+
cause;
|
|
16
|
+
constructor(message, cause) {
|
|
17
|
+
super(message);
|
|
18
|
+
this.cause = cause;
|
|
19
|
+
this.name = 'StrategyError';
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
export class OrchestratorError extends Error {
|
|
23
|
+
cause;
|
|
24
|
+
constructor(message, cause) {
|
|
25
|
+
super(message);
|
|
26
|
+
this.cause = cause;
|
|
27
|
+
this.name = 'OrchestratorError';
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
export class ConfigurationError extends Error {
|
|
31
|
+
cause;
|
|
32
|
+
constructor(message, cause) {
|
|
33
|
+
super(message);
|
|
34
|
+
this.cause = cause;
|
|
35
|
+
this.name = 'ConfigurationError';
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
//# sourceMappingURL=errors.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"errors.js","sourceRoot":"","sources":["../../src/core/errors.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,MAAM,OAAO,aAAc,SAAQ,KAAK;IAGpB;IACA;IAHlB,YACE,OAAe,EACC,UAAkB,EAClB,KAAa;QAE7B,KAAK,CAAC,OAAO,CAAC,CAAC;QAHC,eAAU,GAAV,UAAU,CAAQ;QAClB,UAAK,GAAL,KAAK,CAAQ;QAG7B,IAAI,CAAC,IAAI,GAAG,eAAe,CAAC;IAC9B,CAAC;CACF;AAED,MAAM,OAAO,aAAc,SAAQ,KAAK;IACO;IAA7C,YAAY,OAAe,EAAkB,KAAa;QACxD,KAAK,CAAC,OAAO,CAAC,CAAC;QAD4B,UAAK,GAAL,KAAK,CAAQ;QAExD,IAAI,CAAC,IAAI,GAAG,eAAe,CAAC;IAC9B,CAAC;CACF;AAED,MAAM,OAAO,iBAAkB,SAAQ,KAAK;IACG;IAA7C,YAAY,OAAe,EAAkB,KAAa;QACxD,KAAK,CAAC,OAAO,CAAC,CAAC;QAD4B,UAAK,GAAL,KAAK,CAAQ;QAExD,IAAI,CAAC,IAAI,GAAG,mBAAmB,CAAC;IAClC,CAAC;CACF;AAED,MAAM,OAAO,kBAAmB,SAAQ,KAAK;IACE;IAA7C,YAAY,OAAe,EAAkB,KAAa;QACxD,KAAK,CAAC,OAAO,CAAC,CAAC;QAD4B,UAAK,GAAL,KAAK,CAAQ;QAExD,IAAI,CAAC,IAAI,GAAG,oBAAoB,CAAC;IACnC,CAAC;CACF"}
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Core interfaces for AI providers and strategies
|
|
3
|
+
*/
|
|
4
|
+
import type { ChatMessage, ChatOptions, ChatResponse, ChatChunk, ProviderHealth, ProviderMetadata } from './types.js';
|
|
5
|
+
export type { ChatMessage, ChatOptions, ChatResponse, ChatChunk, ProviderHealth, ProviderMetadata, };
|
|
6
|
+
/**
|
|
7
|
+
* Main interface that all AI providers must implement
|
|
8
|
+
*/
|
|
9
|
+
export interface AIService {
|
|
10
|
+
/**
|
|
11
|
+
* Unique identifier for this provider instance
|
|
12
|
+
*/
|
|
13
|
+
readonly id: string;
|
|
14
|
+
/**
|
|
15
|
+
* Provider metadata
|
|
16
|
+
*/
|
|
17
|
+
readonly metadata: ProviderMetadata;
|
|
18
|
+
/**
|
|
19
|
+
* Check the health status of this provider
|
|
20
|
+
*/
|
|
21
|
+
checkHealth(): Promise<ProviderHealth>;
|
|
22
|
+
/**
|
|
23
|
+
* Perform a chat completion (non-streaming)
|
|
24
|
+
*/
|
|
25
|
+
chat(messages: ChatMessage[], options?: ChatOptions): Promise<ChatResponse>;
|
|
26
|
+
/**
|
|
27
|
+
* Perform a chat completion with streaming
|
|
28
|
+
*/
|
|
29
|
+
chatStream(messages: ChatMessage[], options?: ChatOptions): Promise<ReadableStream<ChatChunk>>;
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* Strategy interface for selecting providers
|
|
33
|
+
*/
|
|
34
|
+
export interface SelectionStrategy {
|
|
35
|
+
/**
|
|
36
|
+
* Select a provider from the available list
|
|
37
|
+
* @param providers List of available providers
|
|
38
|
+
* @param context Optional context for selection (e.g., request metadata)
|
|
39
|
+
*/
|
|
40
|
+
select(providers: AIService[], context?: SelectionContext): Promise<AIService | null>;
|
|
41
|
+
/**
|
|
42
|
+
* Update strategy state (e.g., after a successful/failed request)
|
|
43
|
+
*/
|
|
44
|
+
update?(provider: AIService, success: boolean, metadata?: unknown): void;
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* Context passed to selection strategies
|
|
48
|
+
*/
|
|
49
|
+
export interface SelectionContext {
|
|
50
|
+
messages?: ChatMessage[];
|
|
51
|
+
options?: ChatOptions;
|
|
52
|
+
previousAttempts?: string[];
|
|
53
|
+
[key: string]: unknown;
|
|
54
|
+
}
|
|
55
|
+
/**
|
|
56
|
+
* Configuration for a provider instance
|
|
57
|
+
*/
|
|
58
|
+
export interface ProviderConfig {
|
|
59
|
+
id: string;
|
|
60
|
+
type: string;
|
|
61
|
+
apiKey?: string;
|
|
62
|
+
baseURL?: string;
|
|
63
|
+
model?: string;
|
|
64
|
+
enabled?: boolean;
|
|
65
|
+
priority?: number;
|
|
66
|
+
weight?: number;
|
|
67
|
+
metadata?: Record<string, unknown>;
|
|
68
|
+
[key: string]: unknown;
|
|
69
|
+
}
|
|
70
|
+
/**
|
|
71
|
+
* Configuration for a selection strategy
|
|
72
|
+
*/
|
|
73
|
+
export interface StrategyConfig {
|
|
74
|
+
type: string;
|
|
75
|
+
[key: string]: unknown;
|
|
76
|
+
}
|
|
77
|
+
/**
|
|
78
|
+
* Main orchestrator configuration
|
|
79
|
+
*/
|
|
80
|
+
export interface OrchestratorConfig {
|
|
81
|
+
providers: ProviderConfig[];
|
|
82
|
+
strategy: StrategyConfig;
|
|
83
|
+
defaultOptions?: ChatOptions;
|
|
84
|
+
healthCheckInterval?: number;
|
|
85
|
+
enableHealthChecks?: boolean;
|
|
86
|
+
}
|
|
87
|
+
//# sourceMappingURL=interfaces.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"interfaces.d.ts","sourceRoot":"","sources":["../../src/core/interfaces.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EACV,WAAW,EACX,WAAW,EACX,YAAY,EACZ,SAAS,EACT,cAAc,EACd,gBAAgB,EACjB,MAAM,YAAY,CAAC;AAGpB,YAAY,EACV,WAAW,EACX,WAAW,EACX,YAAY,EACZ,SAAS,EACT,cAAc,EACd,gBAAgB,GACjB,CAAC;AAEF;;GAEG;AACH,MAAM,WAAW,SAAS;IACxB;;OAEG;IACH,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IAEpB;;OAEG;IACH,QAAQ,CAAC,QAAQ,EAAE,gBAAgB,CAAC;IAEpC;;OAEG;IACH,WAAW,IAAI,OAAO,CAAC,cAAc,CAAC,CAAC;IAEvC;;OAEG;IACH,IAAI,CAAC,QAAQ,EAAE,WAAW,EAAE,EAAE,OAAO,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,YAAY,CAAC,CAAC;IAE5E;;OAEG;IACH,UAAU,CACR,QAAQ,EAAE,WAAW,EAAE,EACvB,OAAO,CAAC,EAAE,WAAW,GACpB,OAAO,CAAC,cAAc,CAAC,SAAS,CAAC,CAAC,CAAC;CACvC;AAED;;GAEG;AACH,MAAM,WAAW,iBAAiB;IAChC;;;;OAIG;IACH,MAAM,CACJ,SAAS,EAAE,SAAS,EAAE,EACtB,OAAO,CAAC,EAAE,gBAAgB,GACzB,OAAO,CAAC,SAAS,GAAG,IAAI,CAAC,CAAC;IAE7B;;OAEG;IACH,MAAM,CAAC,CAAC,QAAQ,EAAE,SAAS,EAAE,OAAO,EAAE,OAAO,EAAE,QAAQ,CAAC,EAAE,OAAO,GAAG,IAAI,CAAC;CAC1E;AAED;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,CAAC,EAAE,WAAW,EAAE,CAAC;IACzB,OAAO,CAAC,EAAE,WAAW,CAAC;IACtB,gBAAgB,CAAC,EAAE,MAAM,EAAE,CAAC;IAC5B,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACxB;AAED;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACnC,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACxB;AAED;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACxB;AAED;;GAEG;AACH,MAAM,WAAW,kBAAkB;IACjC,SAAS,EAAE,cAAc,EAAE,CAAC;IAC5B,QAAQ,EAAE,cAAc,CAAC;IACzB,cAAc,CAAC,EAAE,WAAW,CAAC;IAC7B,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B,kBAAkB,CAAC,EAAE,OAAO,CAAC;CAC9B"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"interfaces.js","sourceRoot":"","sources":["../../src/core/interfaces.ts"],"names":[],"mappings":"AAAA;;GAEG"}
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Core orchestrator that manages providers and strategies
|
|
3
|
+
*/
|
|
4
|
+
import type { AIService, SelectionStrategy, SelectionContext, ChatMessage, ChatOptions, ChatResponse, ChatChunk } from './interfaces.js';
|
|
5
|
+
export declare class Orchestrator {
|
|
6
|
+
private providers;
|
|
7
|
+
private strategy;
|
|
8
|
+
private healthCheckInterval?;
|
|
9
|
+
constructor(strategy: SelectionStrategy);
|
|
10
|
+
/**
|
|
11
|
+
* Register a provider
|
|
12
|
+
*/
|
|
13
|
+
registerProvider(provider: AIService): void;
|
|
14
|
+
/**
|
|
15
|
+
* Unregister a provider
|
|
16
|
+
*/
|
|
17
|
+
unregisterProvider(id: string): void;
|
|
18
|
+
/**
|
|
19
|
+
* Get a provider by ID
|
|
20
|
+
*/
|
|
21
|
+
getProvider(id: string): AIService | undefined;
|
|
22
|
+
/**
|
|
23
|
+
* Get all registered providers
|
|
24
|
+
*/
|
|
25
|
+
getAllProviders(): AIService[];
|
|
26
|
+
/**
|
|
27
|
+
* Get enabled providers (those that pass basic checks)
|
|
28
|
+
*/
|
|
29
|
+
getAvailableProviders(): Promise<AIService[]>;
|
|
30
|
+
/**
|
|
31
|
+
* Select a provider using the configured strategy
|
|
32
|
+
*/
|
|
33
|
+
selectProvider(context?: SelectionContext): Promise<AIService | null>;
|
|
34
|
+
/**
|
|
35
|
+
* Perform a chat completion with automatic provider selection and fallback
|
|
36
|
+
*/
|
|
37
|
+
chat(messages: ChatMessage[], options?: ChatOptions): Promise<ChatResponse>;
|
|
38
|
+
/**
|
|
39
|
+
* Perform a streaming chat completion with automatic provider selection
|
|
40
|
+
*/
|
|
41
|
+
chatStream(messages: ChatMessage[], options?: ChatOptions): Promise<ReadableStream<ChatChunk>>;
|
|
42
|
+
/**
|
|
43
|
+
* Start periodic health checks
|
|
44
|
+
*/
|
|
45
|
+
startHealthChecks(intervalMs: number): void;
|
|
46
|
+
/**
|
|
47
|
+
* Stop periodic health checks
|
|
48
|
+
*/
|
|
49
|
+
stopHealthChecks(): void;
|
|
50
|
+
/**
|
|
51
|
+
* Cleanup resources
|
|
52
|
+
*/
|
|
53
|
+
dispose(): void;
|
|
54
|
+
}
|
|
55
|
+
//# sourceMappingURL=orchestrator.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"orchestrator.d.ts","sourceRoot":"","sources":["../../src/core/orchestrator.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EACV,SAAS,EACT,iBAAiB,EACjB,gBAAgB,EAChB,WAAW,EACX,WAAW,EACX,YAAY,EACZ,SAAS,EACV,MAAM,iBAAiB,CAAC;AAEzB,qBAAa,YAAY;IACvB,OAAO,CAAC,SAAS,CAAqC;IACtD,OAAO,CAAC,QAAQ,CAAoB;IACpC,OAAO,CAAC,mBAAmB,CAAC,CAAiC;gBAEjD,QAAQ,EAAE,iBAAiB;IAIvC;;OAEG;IACH,gBAAgB,CAAC,QAAQ,EAAE,SAAS,GAAG,IAAI;IAI3C;;OAEG;IACH,kBAAkB,CAAC,EAAE,EAAE,MAAM,GAAG,IAAI;IAIpC;;OAEG;IACH,WAAW,CAAC,EAAE,EAAE,MAAM,GAAG,SAAS,GAAG,SAAS;IAI9C;;OAEG;IACH,eAAe,IAAI,SAAS,EAAE;IAI9B;;OAEG;IACG,qBAAqB,IAAI,OAAO,CAAC,SAAS,EAAE,CAAC;IAkBnD;;OAEG;IACG,cAAc,CAAC,OAAO,CAAC,EAAE,gBAAgB,GAAG,OAAO,CAAC,SAAS,GAAG,IAAI,CAAC;IAQ3E;;OAEG;IACG,IAAI,CACR,QAAQ,EAAE,WAAW,EAAE,EACvB,OAAO,CAAC,EAAE,WAAW,GACpB,OAAO,CAAC,YAAY,CAAC;IAsCxB;;OAEG;IACG,UAAU,CACd,QAAQ,EAAE,WAAW,EAAE,EACvB,OAAO,CAAC,EAAE,WAAW,GACpB,OAAO,CAAC,cAAc,CAAC,SAAS,CAAC,CAAC;IAyBrC;;OAEG;IACH,iBAAiB,CAAC,UAAU,EAAE,MAAM,GAAG,IAAI;IAU3C;;OAEG;IACH,gBAAgB,IAAI,IAAI;IAOxB;;OAEG;IACH,OAAO,IAAI,IAAI;CAIhB"}
|
|
@@ -0,0 +1,147 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Core orchestrator that manages providers and strategies
|
|
3
|
+
*/
|
|
4
|
+
export class Orchestrator {
|
|
5
|
+
providers = new Map();
|
|
6
|
+
strategy;
|
|
7
|
+
healthCheckInterval;
|
|
8
|
+
constructor(strategy) {
|
|
9
|
+
this.strategy = strategy;
|
|
10
|
+
}
|
|
11
|
+
/**
|
|
12
|
+
* Register a provider
|
|
13
|
+
*/
|
|
14
|
+
registerProvider(provider) {
|
|
15
|
+
this.providers.set(provider.id, provider);
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* Unregister a provider
|
|
19
|
+
*/
|
|
20
|
+
unregisterProvider(id) {
|
|
21
|
+
this.providers.delete(id);
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* Get a provider by ID
|
|
25
|
+
*/
|
|
26
|
+
getProvider(id) {
|
|
27
|
+
return this.providers.get(id);
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* Get all registered providers
|
|
31
|
+
*/
|
|
32
|
+
getAllProviders() {
|
|
33
|
+
return Array.from(this.providers.values());
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* Get enabled providers (those that pass basic checks)
|
|
37
|
+
*/
|
|
38
|
+
async getAvailableProviders() {
|
|
39
|
+
const providers = this.getAllProviders();
|
|
40
|
+
const available = [];
|
|
41
|
+
for (const provider of providers) {
|
|
42
|
+
try {
|
|
43
|
+
const health = await provider.checkHealth();
|
|
44
|
+
if (health.healthy) {
|
|
45
|
+
available.push(provider);
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
catch {
|
|
49
|
+
// Skip unhealthy providers
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
return available;
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* Select a provider using the configured strategy
|
|
56
|
+
*/
|
|
57
|
+
async selectProvider(context) {
|
|
58
|
+
const available = await this.getAvailableProviders();
|
|
59
|
+
if (available.length === 0) {
|
|
60
|
+
return null;
|
|
61
|
+
}
|
|
62
|
+
return this.strategy.select(available, context);
|
|
63
|
+
}
|
|
64
|
+
/**
|
|
65
|
+
* Perform a chat completion with automatic provider selection and fallback
|
|
66
|
+
*/
|
|
67
|
+
async chat(messages, options) {
|
|
68
|
+
const context = {
|
|
69
|
+
messages,
|
|
70
|
+
options,
|
|
71
|
+
previousAttempts: [],
|
|
72
|
+
};
|
|
73
|
+
const maxAttempts = this.providers.size || 1;
|
|
74
|
+
let lastError = null;
|
|
75
|
+
for (let attempt = 0; attempt < maxAttempts; attempt++) {
|
|
76
|
+
const provider = await this.selectProvider(context);
|
|
77
|
+
if (!provider) {
|
|
78
|
+
throw new Error('No available providers. All providers are unhealthy or unavailable.');
|
|
79
|
+
}
|
|
80
|
+
// Skip providers we've already tried
|
|
81
|
+
if (context.previousAttempts?.includes(provider.id)) {
|
|
82
|
+
continue;
|
|
83
|
+
}
|
|
84
|
+
try {
|
|
85
|
+
const response = await provider.chat(messages, options);
|
|
86
|
+
this.strategy.update?.(provider, true, { response });
|
|
87
|
+
return response;
|
|
88
|
+
}
|
|
89
|
+
catch (error) {
|
|
90
|
+
lastError = error instanceof Error ? error : new Error(String(error));
|
|
91
|
+
context.previousAttempts?.push(provider.id);
|
|
92
|
+
this.strategy.update?.(provider, false, { error });
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
throw lastError || new Error('Failed to get response from any provider');
|
|
96
|
+
}
|
|
97
|
+
/**
|
|
98
|
+
* Perform a streaming chat completion with automatic provider selection
|
|
99
|
+
*/
|
|
100
|
+
async chatStream(messages, options) {
|
|
101
|
+
const context = {
|
|
102
|
+
messages,
|
|
103
|
+
options: { ...options, stream: true },
|
|
104
|
+
previousAttempts: [],
|
|
105
|
+
};
|
|
106
|
+
const provider = await this.selectProvider(context);
|
|
107
|
+
if (!provider) {
|
|
108
|
+
throw new Error('No available providers. All providers are unhealthy or unavailable.');
|
|
109
|
+
}
|
|
110
|
+
try {
|
|
111
|
+
const stream = await provider.chatStream(messages, options);
|
|
112
|
+
this.strategy.update?.(provider, true);
|
|
113
|
+
return stream;
|
|
114
|
+
}
|
|
115
|
+
catch (error) {
|
|
116
|
+
this.strategy.update?.(provider, false, { error });
|
|
117
|
+
throw error;
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
/**
|
|
121
|
+
* Start periodic health checks
|
|
122
|
+
*/
|
|
123
|
+
startHealthChecks(intervalMs) {
|
|
124
|
+
this.stopHealthChecks();
|
|
125
|
+
this.healthCheckInterval = setInterval(async () => {
|
|
126
|
+
const providers = this.getAllProviders();
|
|
127
|
+
await Promise.allSettled(providers.map((p) => p.checkHealth().catch(() => null)));
|
|
128
|
+
}, intervalMs);
|
|
129
|
+
}
|
|
130
|
+
/**
|
|
131
|
+
* Stop periodic health checks
|
|
132
|
+
*/
|
|
133
|
+
stopHealthChecks() {
|
|
134
|
+
if (this.healthCheckInterval) {
|
|
135
|
+
clearInterval(this.healthCheckInterval);
|
|
136
|
+
this.healthCheckInterval = undefined;
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
/**
|
|
140
|
+
* Cleanup resources
|
|
141
|
+
*/
|
|
142
|
+
dispose() {
|
|
143
|
+
this.stopHealthChecks();
|
|
144
|
+
this.providers.clear();
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
//# sourceMappingURL=orchestrator.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"orchestrator.js","sourceRoot":"","sources":["../../src/core/orchestrator.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Core types and interfaces for the AI Orchestration Framework
|
|
3
|
+
*/
|
|
4
|
+
/**
|
|
5
|
+
* Represents a chat message in a conversation
|
|
6
|
+
*/
|
|
7
|
+
export interface ChatMessage {
|
|
8
|
+
role: 'system' | 'user' | 'assistant';
|
|
9
|
+
content: string;
|
|
10
|
+
}
|
|
11
|
+
/**
|
|
12
|
+
* Options for chat completion requests
|
|
13
|
+
*/
|
|
14
|
+
export interface ChatOptions {
|
|
15
|
+
temperature?: number;
|
|
16
|
+
maxTokens?: number;
|
|
17
|
+
topP?: number;
|
|
18
|
+
topK?: number;
|
|
19
|
+
stream?: boolean;
|
|
20
|
+
stopSequences?: string[];
|
|
21
|
+
[key: string]: unknown;
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* Response from a chat completion (non-streaming)
|
|
25
|
+
*/
|
|
26
|
+
export interface ChatResponse {
|
|
27
|
+
content: string;
|
|
28
|
+
usage?: {
|
|
29
|
+
promptTokens: number;
|
|
30
|
+
completionTokens: number;
|
|
31
|
+
totalTokens: number;
|
|
32
|
+
};
|
|
33
|
+
model?: string;
|
|
34
|
+
finishReason?: string;
|
|
35
|
+
metadata?: Record<string, unknown>;
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* Streaming chunk from a chat completion
|
|
39
|
+
*/
|
|
40
|
+
export interface ChatChunk {
|
|
41
|
+
content: string;
|
|
42
|
+
done: boolean;
|
|
43
|
+
usage?: {
|
|
44
|
+
promptTokens?: number;
|
|
45
|
+
completionTokens?: number;
|
|
46
|
+
totalTokens?: number;
|
|
47
|
+
};
|
|
48
|
+
finishReason?: string;
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* Health status of a provider
|
|
52
|
+
*/
|
|
53
|
+
export interface ProviderHealth {
|
|
54
|
+
healthy: boolean;
|
|
55
|
+
latency?: number;
|
|
56
|
+
lastChecked?: Date;
|
|
57
|
+
error?: string;
|
|
58
|
+
}
|
|
59
|
+
/**
|
|
60
|
+
* Provider metadata
|
|
61
|
+
*/
|
|
62
|
+
export interface ProviderMetadata {
|
|
63
|
+
id: string;
|
|
64
|
+
name: string;
|
|
65
|
+
model?: string;
|
|
66
|
+
costPerToken?: {
|
|
67
|
+
prompt: number;
|
|
68
|
+
completion: number;
|
|
69
|
+
};
|
|
70
|
+
capabilities?: string[];
|
|
71
|
+
}
|
|
72
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/core/types.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH;;GAEG;AACH,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,QAAQ,GAAG,MAAM,GAAG,WAAW,CAAC;IACtC,OAAO,EAAE,MAAM,CAAC;CACjB;AAED;;GAEG;AACH,MAAM,WAAW,WAAW;IAC1B,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,aAAa,CAAC,EAAE,MAAM,EAAE,CAAC;IACzB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACxB;AAED;;GAEG;AACH,MAAM,WAAW,YAAY;IAC3B,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE;QACN,YAAY,EAAE,MAAM,CAAC;QACrB,gBAAgB,EAAE,MAAM,CAAC;QACzB,WAAW,EAAE,MAAM,CAAC;KACrB,CAAC;IACF,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACpC;AAED;;GAEG;AACH,MAAM,WAAW,SAAS;IACxB,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,OAAO,CAAC;IACd,KAAK,CAAC,EAAE;QACN,YAAY,CAAC,EAAE,MAAM,CAAC;QACtB,gBAAgB,CAAC,EAAE,MAAM,CAAC;QAC1B,WAAW,CAAC,EAAE,MAAM,CAAC;KACtB,CAAC;IACF,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B,OAAO,EAAE,OAAO,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,WAAW,CAAC,EAAE,IAAI,CAAC;IACnB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,YAAY,CAAC,EAAE;QACb,MAAM,EAAE,MAAM,CAAC;QACf,UAAU,EAAE,MAAM,CAAC;KACpB,CAAC;IACF,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;CACzB"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/core/types.ts"],"names":[],"mappings":"AAAA;;GAEG"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Factory for creating orchestrators from configuration
|
|
3
|
+
*/
|
|
4
|
+
import { Orchestrator } from '../core/orchestrator.js';
|
|
5
|
+
import type { OrchestratorConfig } from '../core/interfaces.js';
|
|
6
|
+
/**
|
|
7
|
+
* Create an orchestrator from configuration
|
|
8
|
+
*/
|
|
9
|
+
export declare function createOrchestrator(config: OrchestratorConfig): Orchestrator;
|
|
10
|
+
/**
|
|
11
|
+
* Type guard to check if a config is valid
|
|
12
|
+
*/
|
|
13
|
+
export declare function isValidOrchestratorConfig(config: unknown): config is OrchestratorConfig;
|
|
14
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/factory/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AAEvD,OAAO,KAAK,EACV,kBAAkB,EAKnB,MAAM,uBAAuB,CAAC;AAyK/B;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,kBAAkB,GAAG,YAAY,CAkD3E;AAED;;GAEG;AACH,wBAAgB,yBAAyB,CACvC,MAAM,EAAE,OAAO,GACd,MAAM,IAAI,kBAAkB,CAqB9B"}
|
|
@@ -0,0 +1,184 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Factory for creating orchestrators from configuration
|
|
3
|
+
*/
|
|
4
|
+
import { Orchestrator } from '../core/orchestrator.js';
|
|
5
|
+
import { ConfigurationError, ProviderError } from '../core/errors.js';
|
|
6
|
+
import { RoundRobinStrategy, PriorityStrategy, FallbackStrategy, WeightedStrategy, HealthAwareStrategy, } from '../strategies/index.js';
|
|
7
|
+
import { GroqProvider, OpenRouterProvider, GeminiProvider, CerebrasProvider, LocalProvider, } from '../providers/index.js';
|
|
8
|
+
/**
|
|
9
|
+
* Create a provider instance from configuration
|
|
10
|
+
*/
|
|
11
|
+
function createProvider(config) {
|
|
12
|
+
const { type, id, enabled = true, apiKey, baseURL, model, ...rest } = config;
|
|
13
|
+
if (!id || typeof id !== 'string') {
|
|
14
|
+
throw new ConfigurationError(`Provider must have a valid id`);
|
|
15
|
+
}
|
|
16
|
+
if (!type || typeof type !== 'string') {
|
|
17
|
+
throw new ConfigurationError(`Provider ${id} must have a type`);
|
|
18
|
+
}
|
|
19
|
+
if (!enabled) {
|
|
20
|
+
throw new ConfigurationError(`Provider ${id} is disabled`);
|
|
21
|
+
}
|
|
22
|
+
try {
|
|
23
|
+
switch (type.toLowerCase()) {
|
|
24
|
+
case 'groq':
|
|
25
|
+
if (!apiKey) {
|
|
26
|
+
throw new ConfigurationError(`Provider ${id} (groq) requires apiKey`);
|
|
27
|
+
}
|
|
28
|
+
return new GroqProvider({
|
|
29
|
+
id,
|
|
30
|
+
apiKey,
|
|
31
|
+
model,
|
|
32
|
+
baseURL,
|
|
33
|
+
...rest,
|
|
34
|
+
});
|
|
35
|
+
case 'openrouter':
|
|
36
|
+
if (!apiKey) {
|
|
37
|
+
throw new ConfigurationError(`Provider ${id} (openrouter) requires apiKey`);
|
|
38
|
+
}
|
|
39
|
+
return new OpenRouterProvider({
|
|
40
|
+
id,
|
|
41
|
+
apiKey,
|
|
42
|
+
model,
|
|
43
|
+
baseURL,
|
|
44
|
+
...rest,
|
|
45
|
+
});
|
|
46
|
+
case 'gemini':
|
|
47
|
+
if (!apiKey) {
|
|
48
|
+
throw new ConfigurationError(`Provider ${id} (gemini) requires apiKey`);
|
|
49
|
+
}
|
|
50
|
+
return new GeminiProvider({
|
|
51
|
+
id,
|
|
52
|
+
apiKey,
|
|
53
|
+
model,
|
|
54
|
+
baseURL,
|
|
55
|
+
...rest,
|
|
56
|
+
});
|
|
57
|
+
case 'cerebras':
|
|
58
|
+
if (!apiKey) {
|
|
59
|
+
throw new ConfigurationError(`Provider ${id} (cerebras) requires apiKey`);
|
|
60
|
+
}
|
|
61
|
+
return new CerebrasProvider({
|
|
62
|
+
id,
|
|
63
|
+
apiKey,
|
|
64
|
+
model,
|
|
65
|
+
baseURL,
|
|
66
|
+
...rest,
|
|
67
|
+
});
|
|
68
|
+
case 'local':
|
|
69
|
+
if (!baseURL) {
|
|
70
|
+
throw new ConfigurationError(`Provider ${id} (local) requires baseURL`);
|
|
71
|
+
}
|
|
72
|
+
return new LocalProvider({
|
|
73
|
+
id,
|
|
74
|
+
baseURL,
|
|
75
|
+
model,
|
|
76
|
+
apiKey,
|
|
77
|
+
...rest,
|
|
78
|
+
});
|
|
79
|
+
default:
|
|
80
|
+
throw new ConfigurationError(`Unknown provider type: ${type}`);
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
catch (error) {
|
|
84
|
+
if (error instanceof ConfigurationError) {
|
|
85
|
+
throw error;
|
|
86
|
+
}
|
|
87
|
+
throw new ProviderError(`Failed to create provider ${id}`, id, error instanceof Error ? error : new Error(String(error)));
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
/**
|
|
91
|
+
* Create a strategy instance from configuration
|
|
92
|
+
*/
|
|
93
|
+
function createStrategy(config) {
|
|
94
|
+
const { type, ...rest } = config;
|
|
95
|
+
if (!type || typeof type !== 'string') {
|
|
96
|
+
throw new ConfigurationError('Strategy must have a type');
|
|
97
|
+
}
|
|
98
|
+
try {
|
|
99
|
+
switch (type.toLowerCase()) {
|
|
100
|
+
case 'round-robin':
|
|
101
|
+
case 'roundrobin':
|
|
102
|
+
return new RoundRobinStrategy();
|
|
103
|
+
case 'priority':
|
|
104
|
+
return new PriorityStrategy(rest);
|
|
105
|
+
case 'fallback':
|
|
106
|
+
return new FallbackStrategy(rest);
|
|
107
|
+
case 'weighted':
|
|
108
|
+
return new WeightedStrategy(rest);
|
|
109
|
+
case 'health-aware':
|
|
110
|
+
case 'healthaware':
|
|
111
|
+
return new HealthAwareStrategy(rest);
|
|
112
|
+
default:
|
|
113
|
+
throw new ConfigurationError(`Unknown strategy type: ${type}`);
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
catch (error) {
|
|
117
|
+
if (error instanceof ConfigurationError) {
|
|
118
|
+
throw error;
|
|
119
|
+
}
|
|
120
|
+
throw new ConfigurationError(`Failed to create strategy: ${error instanceof Error ? error.message : String(error)}`, error instanceof Error ? error : undefined);
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
/**
|
|
124
|
+
* Create an orchestrator from configuration
|
|
125
|
+
*/
|
|
126
|
+
export function createOrchestrator(config) {
|
|
127
|
+
// Validate configuration
|
|
128
|
+
if (!isValidOrchestratorConfig(config)) {
|
|
129
|
+
throw new ConfigurationError('Invalid orchestrator configuration');
|
|
130
|
+
}
|
|
131
|
+
if (config.providers.length === 0) {
|
|
132
|
+
throw new ConfigurationError('At least one provider is required');
|
|
133
|
+
}
|
|
134
|
+
// Create strategy
|
|
135
|
+
const strategy = createStrategy(config.strategy);
|
|
136
|
+
// Create orchestrator
|
|
137
|
+
const orchestrator = new Orchestrator(strategy);
|
|
138
|
+
// Register providers
|
|
139
|
+
const registeredProviders = [];
|
|
140
|
+
for (const providerConfig of config.providers) {
|
|
141
|
+
if (providerConfig.enabled !== false) {
|
|
142
|
+
try {
|
|
143
|
+
const provider = createProvider(providerConfig);
|
|
144
|
+
orchestrator.registerProvider(provider);
|
|
145
|
+
registeredProviders.push(providerConfig.id);
|
|
146
|
+
}
|
|
147
|
+
catch (error) {
|
|
148
|
+
console.warn(`Failed to create provider ${providerConfig.id}:`, error instanceof Error ? error.message : String(error));
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
if (registeredProviders.length === 0) {
|
|
153
|
+
throw new ConfigurationError('No providers could be created. Check your configuration.');
|
|
154
|
+
}
|
|
155
|
+
// Start health checks if enabled
|
|
156
|
+
if (config.enableHealthChecks && config.healthCheckInterval) {
|
|
157
|
+
if (config.healthCheckInterval < 1000) {
|
|
158
|
+
console.warn('Health check interval is very low (< 1000ms). Consider using at least 1000ms.');
|
|
159
|
+
}
|
|
160
|
+
orchestrator.startHealthChecks(config.healthCheckInterval);
|
|
161
|
+
}
|
|
162
|
+
return orchestrator;
|
|
163
|
+
}
|
|
164
|
+
/**
|
|
165
|
+
* Type guard to check if a config is valid
|
|
166
|
+
*/
|
|
167
|
+
export function isValidOrchestratorConfig(config) {
|
|
168
|
+
if (!config || typeof config !== 'object') {
|
|
169
|
+
return false;
|
|
170
|
+
}
|
|
171
|
+
const c = config;
|
|
172
|
+
if (!Array.isArray(c.providers) || c.providers.length === 0) {
|
|
173
|
+
return false;
|
|
174
|
+
}
|
|
175
|
+
if (!c.strategy || typeof c.strategy !== 'object') {
|
|
176
|
+
return false;
|
|
177
|
+
}
|
|
178
|
+
const strategy = c.strategy;
|
|
179
|
+
if (typeof strategy.type !== 'string') {
|
|
180
|
+
return false;
|
|
181
|
+
}
|
|
182
|
+
return true;
|
|
183
|
+
}
|
|
184
|
+
//# sourceMappingURL=index.js.map
|