@defai.digital/provider-adapters 13.0.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +214 -0
- package/dist/cli-adapter.d.ts +23 -0
- package/dist/cli-adapter.d.ts.map +1 -0
- package/dist/cli-adapter.js +151 -0
- package/dist/cli-adapter.js.map +1 -0
- package/dist/error-classifier.d.ts +34 -0
- package/dist/error-classifier.d.ts.map +1 -0
- package/dist/error-classifier.js +257 -0
- package/dist/error-classifier.js.map +1 -0
- package/dist/index.d.ts +19 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +25 -0
- package/dist/index.js.map +1 -0
- package/dist/output-parser.d.ts +37 -0
- package/dist/output-parser.d.ts.map +1 -0
- package/dist/output-parser.js +251 -0
- package/dist/output-parser.js.map +1 -0
- package/dist/process-manager.d.ts +43 -0
- package/dist/process-manager.d.ts.map +1 -0
- package/dist/process-manager.js +184 -0
- package/dist/process-manager.js.map +1 -0
- package/dist/providers/claude.d.ts +18 -0
- package/dist/providers/claude.d.ts.map +1 -0
- package/dist/providers/claude.js +39 -0
- package/dist/providers/claude.js.map +1 -0
- package/dist/providers/codex.d.ts +18 -0
- package/dist/providers/codex.d.ts.map +1 -0
- package/dist/providers/codex.js +39 -0
- package/dist/providers/codex.js.map +1 -0
- package/dist/providers/gemini.d.ts +18 -0
- package/dist/providers/gemini.d.ts.map +1 -0
- package/dist/providers/gemini.js +39 -0
- package/dist/providers/gemini.js.map +1 -0
- package/dist/providers/glm.d.ts +18 -0
- package/dist/providers/glm.d.ts.map +1 -0
- package/dist/providers/glm.js +40 -0
- package/dist/providers/glm.js.map +1 -0
- package/dist/providers/grok.d.ts +18 -0
- package/dist/providers/grok.d.ts.map +1 -0
- package/dist/providers/grok.js +40 -0
- package/dist/providers/grok.js.map +1 -0
- package/dist/providers/index.d.ts +32 -0
- package/dist/providers/index.d.ts.map +1 -0
- package/dist/providers/index.js +49 -0
- package/dist/providers/index.js.map +1 -0
- package/dist/providers/qwen.d.ts +18 -0
- package/dist/providers/qwen.d.ts.map +1 -0
- package/dist/providers/qwen.js +39 -0
- package/dist/providers/qwen.js.map +1 -0
- package/dist/registry.d.ts +73 -0
- package/dist/registry.d.ts.map +1 -0
- package/dist/registry.js +145 -0
- package/dist/registry.js.map +1 -0
- package/dist/resilient-registry.d.ts +134 -0
- package/dist/resilient-registry.d.ts.map +1 -0
- package/dist/resilient-registry.js +296 -0
- package/dist/resilient-registry.js.map +1 -0
- package/dist/types.d.ts +238 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +14 -0
- package/dist/types.js.map +1 -0
- package/package.json +43 -0
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Qwen CLI provider configuration
|
|
3
|
+
*
|
|
4
|
+
* CLI: qwen
|
|
5
|
+
* Auth: Handled entirely by Qwen CLI (DashScope auth)
|
|
6
|
+
* Model: Uses CLI's default model (we don't specify)
|
|
7
|
+
*
|
|
8
|
+
* @see https://github.com/QwenLM/qwen-code
|
|
9
|
+
*/
|
|
10
|
+
import { TIMEOUT_PROVIDER_DEFAULT } from '@defai.digital/contracts';
|
|
11
|
+
/**
|
|
12
|
+
* Qwen provider configuration
|
|
13
|
+
*
|
|
14
|
+
* Design: AutomatosX does NOT manage credentials or model selection.
|
|
15
|
+
* The Qwen CLI handles all authentication and uses its configured default model.
|
|
16
|
+
*/
|
|
17
|
+
export const qwenConfig = {
|
|
18
|
+
providerId: 'qwen',
|
|
19
|
+
command: 'qwen',
|
|
20
|
+
args: [],
|
|
21
|
+
env: {
|
|
22
|
+
// Non-interactive mode flags
|
|
23
|
+
TERM: 'dumb',
|
|
24
|
+
NO_COLOR: '1',
|
|
25
|
+
CI: 'true',
|
|
26
|
+
},
|
|
27
|
+
outputFormat: 'text',
|
|
28
|
+
timeout: TIMEOUT_PROVIDER_DEFAULT,
|
|
29
|
+
models: [
|
|
30
|
+
{
|
|
31
|
+
modelId: 'default',
|
|
32
|
+
name: 'Qwen Default',
|
|
33
|
+
contextWindow: 131000,
|
|
34
|
+
capabilities: ['text', 'code'],
|
|
35
|
+
isDefault: true,
|
|
36
|
+
},
|
|
37
|
+
],
|
|
38
|
+
};
|
|
39
|
+
//# sourceMappingURL=qwen.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"qwen.js","sourceRoot":"","sources":["../../src/providers/qwen.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EAAE,wBAAwB,EAAE,MAAM,0BAA0B,CAAC;AAGpE;;;;;GAKG;AACH,MAAM,CAAC,MAAM,UAAU,GAAsB;IAC3C,UAAU,EAAE,MAAM;IAClB,OAAO,EAAE,MAAM;IACf,IAAI,EAAE,EAAE;IACR,GAAG,EAAE;QACH,6BAA6B;QAC7B,IAAI,EAAE,MAAM;QACZ,QAAQ,EAAE,GAAG;QACb,EAAE,EAAE,MAAM;KACX;IACD,YAAY,EAAE,MAAM;IACpB,OAAO,EAAE,wBAAwB;IACjC,MAAM,EAAE;QACN;YACE,OAAO,EAAE,SAAS;YAClB,IAAI,EAAE,cAAc;YACpB,aAAa,EAAE,MAAM;YACrB,YAAY,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC;YAC9B,SAAS,EAAE,IAAI;SAChB;KACF;CACF,CAAC"}
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Provider registry for managing CLI-based LLM providers
|
|
3
|
+
*
|
|
4
|
+
* DESIGN: AutomatosX does NOT manage credentials.
|
|
5
|
+
* Each provider CLI handles its own authentication:
|
|
6
|
+
* - claude, gemini, codex: Official CLIs with built-in auth
|
|
7
|
+
* - qwen: Qwen CLI with DashScope auth
|
|
8
|
+
* - ax-glm: GLM CLI with ZAI_API_KEY
|
|
9
|
+
* - ax-grok: Grok CLI with XAI_API_KEY
|
|
10
|
+
*/
|
|
11
|
+
import type { LLMProvider, CompletionRequest, CompletionResponse, HealthCheckResult, CLIProviderConfig, ModelConfig } from './types.js';
|
|
12
|
+
/**
|
|
13
|
+
* Provider registry for managing multiple LLM providers
|
|
14
|
+
*/
|
|
15
|
+
export declare class ProviderRegistry {
|
|
16
|
+
private readonly providers;
|
|
17
|
+
/**
|
|
18
|
+
* Registers a provider from configuration
|
|
19
|
+
*/
|
|
20
|
+
registerFromConfig(config: CLIProviderConfig): void;
|
|
21
|
+
/**
|
|
22
|
+
* Registers a provider instance directly
|
|
23
|
+
*/
|
|
24
|
+
register(provider: LLMProvider): void;
|
|
25
|
+
/**
|
|
26
|
+
* Gets a provider by ID
|
|
27
|
+
*/
|
|
28
|
+
get(providerId: string): LLMProvider | undefined;
|
|
29
|
+
/**
|
|
30
|
+
* Gets a provider by model name
|
|
31
|
+
*/
|
|
32
|
+
getByModel(model: string): LLMProvider | undefined;
|
|
33
|
+
/**
|
|
34
|
+
* Executes a completion request, routing to the appropriate provider
|
|
35
|
+
*/
|
|
36
|
+
complete(request: CompletionRequest): Promise<CompletionResponse>;
|
|
37
|
+
/**
|
|
38
|
+
* Checks health of all registered providers
|
|
39
|
+
*/
|
|
40
|
+
checkAllHealth(): Promise<Map<string, HealthCheckResult>>;
|
|
41
|
+
/**
|
|
42
|
+
* Gets all providers that are currently available
|
|
43
|
+
*/
|
|
44
|
+
getAvailableProviders(): Promise<LLMProvider[]>;
|
|
45
|
+
/**
|
|
46
|
+
* Gets all registered provider IDs
|
|
47
|
+
*/
|
|
48
|
+
getProviderIds(): string[];
|
|
49
|
+
/**
|
|
50
|
+
* Gets all available models across all providers
|
|
51
|
+
*/
|
|
52
|
+
getAllModels(): {
|
|
53
|
+
providerId: string;
|
|
54
|
+
model: ModelConfig;
|
|
55
|
+
}[];
|
|
56
|
+
/**
|
|
57
|
+
* Checks if a model is available in any registered provider
|
|
58
|
+
*/
|
|
59
|
+
hasModel(model: string): boolean;
|
|
60
|
+
/**
|
|
61
|
+
* Gets the number of registered providers
|
|
62
|
+
*/
|
|
63
|
+
get size(): number;
|
|
64
|
+
}
|
|
65
|
+
/**
|
|
66
|
+
* Creates a provider registry with all default providers registered
|
|
67
|
+
*/
|
|
68
|
+
export declare function createProviderRegistry(): ProviderRegistry;
|
|
69
|
+
/**
|
|
70
|
+
* Creates an empty provider registry
|
|
71
|
+
*/
|
|
72
|
+
export declare function createEmptyRegistry(): ProviderRegistry;
|
|
73
|
+
//# sourceMappingURL=registry.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../src/registry.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,KAAK,EACV,WAAW,EACX,iBAAiB,EACjB,kBAAkB,EAClB,iBAAiB,EACjB,iBAAiB,EACjB,WAAW,EAEZ,MAAM,YAAY,CAAC;AAIpB;;GAEG;AACH,qBAAa,gBAAgB;IAC3B,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAkC;IAE5D;;OAEG;IACH,kBAAkB,CAAC,MAAM,EAAE,iBAAiB,GAAG,IAAI;IAKnD;;OAEG;IACH,QAAQ,CAAC,QAAQ,EAAE,WAAW,GAAG,IAAI;IAIrC;;OAEG;IACH,GAAG,CAAC,UAAU,EAAE,MAAM,GAAG,WAAW,GAAG,SAAS;IAIhD;;OAEG;IACH,UAAU,CAAC,KAAK,EAAE,MAAM,GAAG,WAAW,GAAG,SAAS;IASlD;;OAEG;IACG,QAAQ,CAAC,OAAO,EAAE,iBAAiB,GAAG,OAAO,CAAC,kBAAkB,CAAC;IAwBvE;;OAEG;IACG,cAAc,IAAI,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,iBAAiB,CAAC,CAAC;IAc/D;;OAEG;IACG,qBAAqB,IAAI,OAAO,CAAC,WAAW,EAAE,CAAC;IAcrD;;OAEG;IACH,cAAc,IAAI,MAAM,EAAE;IAI1B;;OAEG;IACH,YAAY,IAAI;QAAE,UAAU,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,WAAW,CAAA;KAAE,EAAE;IAY5D;;OAEG;IACH,QAAQ,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO;IAIhC;;OAEG;IACH,IAAI,IAAI,IAAI,MAAM,CAEjB;CACF;AAED;;GAEG;AACH,wBAAgB,sBAAsB,IAAI,gBAAgB,CASzD;AAED;;GAEG;AACH,wBAAgB,mBAAmB,IAAI,gBAAgB,CAEtD"}
|
package/dist/registry.js
ADDED
|
@@ -0,0 +1,145 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Provider registry for managing CLI-based LLM providers
|
|
3
|
+
*
|
|
4
|
+
* DESIGN: AutomatosX does NOT manage credentials.
|
|
5
|
+
* Each provider CLI handles its own authentication:
|
|
6
|
+
* - claude, gemini, codex: Official CLIs with built-in auth
|
|
7
|
+
* - qwen: Qwen CLI with DashScope auth
|
|
8
|
+
* - ax-glm: GLM CLI with ZAI_API_KEY
|
|
9
|
+
* - ax-grok: Grok CLI with XAI_API_KEY
|
|
10
|
+
*/
|
|
11
|
+
import { createCLIAdapter } from './cli-adapter.js';
|
|
12
|
+
import { ALL_PROVIDER_CONFIGS } from './providers/index.js';
|
|
13
|
+
/**
|
|
14
|
+
* Provider registry for managing multiple LLM providers
|
|
15
|
+
*/
|
|
16
|
+
export class ProviderRegistry {
|
|
17
|
+
providers = new Map();
|
|
18
|
+
/**
|
|
19
|
+
* Registers a provider from configuration
|
|
20
|
+
*/
|
|
21
|
+
registerFromConfig(config) {
|
|
22
|
+
const adapter = createCLIAdapter(config);
|
|
23
|
+
this.providers.set(config.providerId, adapter);
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* Registers a provider instance directly
|
|
27
|
+
*/
|
|
28
|
+
register(provider) {
|
|
29
|
+
this.providers.set(provider.providerId, provider);
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* Gets a provider by ID
|
|
33
|
+
*/
|
|
34
|
+
get(providerId) {
|
|
35
|
+
return this.providers.get(providerId);
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* Gets a provider by model name
|
|
39
|
+
*/
|
|
40
|
+
getByModel(model) {
|
|
41
|
+
for (const provider of this.providers.values()) {
|
|
42
|
+
if (provider.supportsModel(model)) {
|
|
43
|
+
return provider;
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
return undefined;
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* Executes a completion request, routing to the appropriate provider
|
|
50
|
+
*/
|
|
51
|
+
async complete(request) {
|
|
52
|
+
const provider = this.getByModel(request.model);
|
|
53
|
+
if (provider === undefined) {
|
|
54
|
+
const error = {
|
|
55
|
+
category: 'not_found',
|
|
56
|
+
message: `No provider found for model: ${request.model}`,
|
|
57
|
+
shouldRetry: false,
|
|
58
|
+
shouldFallback: true,
|
|
59
|
+
retryAfterMs: null,
|
|
60
|
+
originalError: undefined,
|
|
61
|
+
};
|
|
62
|
+
return {
|
|
63
|
+
success: false,
|
|
64
|
+
requestId: request.requestId,
|
|
65
|
+
error,
|
|
66
|
+
latencyMs: 0,
|
|
67
|
+
};
|
|
68
|
+
}
|
|
69
|
+
return provider.complete(request);
|
|
70
|
+
}
|
|
71
|
+
/**
|
|
72
|
+
* Checks health of all registered providers
|
|
73
|
+
*/
|
|
74
|
+
async checkAllHealth() {
|
|
75
|
+
const results = new Map();
|
|
76
|
+
const healthChecks = [...this.providers.entries()].map(async ([providerId, provider]) => {
|
|
77
|
+
const result = await provider.checkHealth();
|
|
78
|
+
results.set(providerId, result);
|
|
79
|
+
});
|
|
80
|
+
await Promise.all(healthChecks);
|
|
81
|
+
return results;
|
|
82
|
+
}
|
|
83
|
+
/**
|
|
84
|
+
* Gets all providers that are currently available
|
|
85
|
+
*/
|
|
86
|
+
async getAvailableProviders() {
|
|
87
|
+
const available = [];
|
|
88
|
+
const checks = [...this.providers.values()].map(async (provider) => {
|
|
89
|
+
const isAvailable = await provider.isAvailable();
|
|
90
|
+
if (isAvailable) {
|
|
91
|
+
available.push(provider);
|
|
92
|
+
}
|
|
93
|
+
});
|
|
94
|
+
await Promise.all(checks);
|
|
95
|
+
return available;
|
|
96
|
+
}
|
|
97
|
+
/**
|
|
98
|
+
* Gets all registered provider IDs
|
|
99
|
+
*/
|
|
100
|
+
getProviderIds() {
|
|
101
|
+
return [...this.providers.keys()];
|
|
102
|
+
}
|
|
103
|
+
/**
|
|
104
|
+
* Gets all available models across all providers
|
|
105
|
+
*/
|
|
106
|
+
getAllModels() {
|
|
107
|
+
const models = [];
|
|
108
|
+
for (const provider of this.providers.values()) {
|
|
109
|
+
for (const model of provider.getModels()) {
|
|
110
|
+
models.push({ providerId: provider.providerId, model });
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
return models;
|
|
114
|
+
}
|
|
115
|
+
/**
|
|
116
|
+
* Checks if a model is available in any registered provider
|
|
117
|
+
*/
|
|
118
|
+
hasModel(model) {
|
|
119
|
+
return this.getByModel(model) !== undefined;
|
|
120
|
+
}
|
|
121
|
+
/**
|
|
122
|
+
* Gets the number of registered providers
|
|
123
|
+
*/
|
|
124
|
+
get size() {
|
|
125
|
+
return this.providers.size;
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
/**
|
|
129
|
+
* Creates a provider registry with all default providers registered
|
|
130
|
+
*/
|
|
131
|
+
export function createProviderRegistry() {
|
|
132
|
+
const registry = new ProviderRegistry();
|
|
133
|
+
// Register all CLI-based providers
|
|
134
|
+
for (const config of ALL_PROVIDER_CONFIGS) {
|
|
135
|
+
registry.registerFromConfig(config);
|
|
136
|
+
}
|
|
137
|
+
return registry;
|
|
138
|
+
}
|
|
139
|
+
/**
|
|
140
|
+
* Creates an empty provider registry
|
|
141
|
+
*/
|
|
142
|
+
export function createEmptyRegistry() {
|
|
143
|
+
return new ProviderRegistry();
|
|
144
|
+
}
|
|
145
|
+
//# sourceMappingURL=registry.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"registry.js","sourceRoot":"","sources":["../src/registry.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,134 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Resilient Provider Registry
|
|
3
|
+
*
|
|
4
|
+
* Wraps the provider registry with production-grade resilience patterns:
|
|
5
|
+
* - Circuit Breaker: Prevents cascade failures
|
|
6
|
+
* - Rate Limiter: Prevents API limit violations
|
|
7
|
+
* - Metrics: Records request metrics for observability
|
|
8
|
+
*/
|
|
9
|
+
import type { LLMProvider, CompletionRequest, CompletionResponse, HealthCheckResult, ModelConfig } from './types.js';
|
|
10
|
+
import { ProviderRegistry } from './registry.js';
|
|
11
|
+
import { type CircuitBreakerConfig, type RateLimiterConfig } from '@defai.digital/contracts/resilience/v1';
|
|
12
|
+
/**
|
|
13
|
+
* Configuration for resilient provider registry
|
|
14
|
+
*/
|
|
15
|
+
export interface ResilientRegistryConfig {
|
|
16
|
+
/** Circuit breaker configuration (per provider) */
|
|
17
|
+
circuitBreaker?: Partial<CircuitBreakerConfig>;
|
|
18
|
+
/** Rate limiter configuration (global) */
|
|
19
|
+
rateLimiter?: Partial<RateLimiterConfig>;
|
|
20
|
+
/** Enable metrics collection */
|
|
21
|
+
enableMetrics?: boolean;
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* Resilient provider registry that wraps calls with circuit breaker and rate limiting
|
|
25
|
+
*/
|
|
26
|
+
export declare class ResilientProviderRegistry {
|
|
27
|
+
private readonly baseRegistry;
|
|
28
|
+
private readonly resilientProviders;
|
|
29
|
+
private readonly rateLimiter;
|
|
30
|
+
private readonly metrics;
|
|
31
|
+
private readonly config;
|
|
32
|
+
constructor(baseRegistry: ProviderRegistry, config?: ResilientRegistryConfig);
|
|
33
|
+
private initializeProviders;
|
|
34
|
+
/**
|
|
35
|
+
* Executes a completion request with resilience patterns
|
|
36
|
+
*/
|
|
37
|
+
complete(request: CompletionRequest): Promise<CompletionResponse>;
|
|
38
|
+
/**
|
|
39
|
+
* Gets provider health status including circuit breaker state
|
|
40
|
+
*/
|
|
41
|
+
getProviderHealth(providerId: string): {
|
|
42
|
+
provider: LLMProvider | undefined;
|
|
43
|
+
circuitState: string | undefined;
|
|
44
|
+
};
|
|
45
|
+
/**
|
|
46
|
+
* Gets metrics snapshot
|
|
47
|
+
*/
|
|
48
|
+
getMetrics(): {
|
|
49
|
+
errors: Record<string, number>;
|
|
50
|
+
generatedAt: string;
|
|
51
|
+
tokens: {
|
|
52
|
+
input: number;
|
|
53
|
+
total: number;
|
|
54
|
+
output: number;
|
|
55
|
+
};
|
|
56
|
+
requests: {
|
|
57
|
+
success: number;
|
|
58
|
+
total: number;
|
|
59
|
+
failure: number;
|
|
60
|
+
successRate: number;
|
|
61
|
+
};
|
|
62
|
+
timeRange: {
|
|
63
|
+
start: string;
|
|
64
|
+
end: string;
|
|
65
|
+
};
|
|
66
|
+
cost: {
|
|
67
|
+
estimated: number;
|
|
68
|
+
perRequest: number;
|
|
69
|
+
};
|
|
70
|
+
latency: {
|
|
71
|
+
count: number;
|
|
72
|
+
min: number;
|
|
73
|
+
max: number;
|
|
74
|
+
p50: number;
|
|
75
|
+
p95: number;
|
|
76
|
+
p99: number;
|
|
77
|
+
mean: number;
|
|
78
|
+
};
|
|
79
|
+
byProvider: Record<string, {
|
|
80
|
+
tokens: number;
|
|
81
|
+
requests: number;
|
|
82
|
+
failures: number;
|
|
83
|
+
latencyP50: number;
|
|
84
|
+
}>;
|
|
85
|
+
} | undefined;
|
|
86
|
+
/**
|
|
87
|
+
* Gets rate limiter stats
|
|
88
|
+
*/
|
|
89
|
+
getRateLimiterStats(): {
|
|
90
|
+
windowStart: string;
|
|
91
|
+
queueSize: number;
|
|
92
|
+
tokensUsed: number;
|
|
93
|
+
requestsAllowed: number;
|
|
94
|
+
requestsRejected: number;
|
|
95
|
+
availableCapacity: number;
|
|
96
|
+
nextRefillMs: number;
|
|
97
|
+
};
|
|
98
|
+
/**
|
|
99
|
+
* Resets circuit breaker for a provider
|
|
100
|
+
*/
|
|
101
|
+
resetCircuitBreaker(providerId: string): void;
|
|
102
|
+
/**
|
|
103
|
+
* Resets all circuit breakers
|
|
104
|
+
*/
|
|
105
|
+
resetAllCircuitBreakers(): void;
|
|
106
|
+
/**
|
|
107
|
+
* Checks health of all providers
|
|
108
|
+
*/
|
|
109
|
+
checkAllHealth(): Promise<Map<string, HealthCheckResult>>;
|
|
110
|
+
/**
|
|
111
|
+
* Gets all provider IDs
|
|
112
|
+
*/
|
|
113
|
+
getProviderIds(): string[];
|
|
114
|
+
/**
|
|
115
|
+
* Gets all models
|
|
116
|
+
*/
|
|
117
|
+
getAllModels(): {
|
|
118
|
+
providerId: string;
|
|
119
|
+
model: ModelConfig;
|
|
120
|
+
}[];
|
|
121
|
+
/**
|
|
122
|
+
* Checks if model exists
|
|
123
|
+
*/
|
|
124
|
+
hasModel(model: string): boolean;
|
|
125
|
+
/**
|
|
126
|
+
* Gets the underlying base registry
|
|
127
|
+
*/
|
|
128
|
+
get base(): ProviderRegistry;
|
|
129
|
+
}
|
|
130
|
+
/**
|
|
131
|
+
* Creates a resilient provider registry with default providers
|
|
132
|
+
*/
|
|
133
|
+
export declare function createResilientProviderRegistry(config?: ResilientRegistryConfig): ResilientProviderRegistry;
|
|
134
|
+
//# sourceMappingURL=resilient-registry.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"resilient-registry.d.ts","sourceRoot":"","sources":["../src/resilient-registry.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,EACV,WAAW,EACX,iBAAiB,EACjB,kBAAkB,EAClB,iBAAiB,EACjB,WAAW,EAEZ,MAAM,YAAY,CAAC;AACpB,OAAO,EAAE,gBAAgB,EAAgD,MAAM,eAAe,CAAC;AAS/F,OAAO,EACL,KAAK,oBAAoB,EACzB,KAAK,iBAAiB,EACvB,MAAM,wCAAwC,CAAC;AAUhD;;GAEG;AACH,MAAM,WAAW,uBAAuB;IACtC,mDAAmD;IACnD,cAAc,CAAC,EAAE,OAAO,CAAC,oBAAoB,CAAC,CAAC;IAE/C,0CAA0C;IAC1C,WAAW,CAAC,EAAE,OAAO,CAAC,iBAAiB,CAAC,CAAC;IAEzC,gCAAgC;IAChC,aAAa,CAAC,EAAE,OAAO,CAAC;CACzB;AA0BD;;GAEG;AACH,qBAAa,yBAAyB;IACpC,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAmB;IAChD,OAAO,CAAC,QAAQ,CAAC,kBAAkB,CAAwC;IAC3E,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAc;IAC1C,OAAO,CAAC,QAAQ,CAAC,OAAO,CAA0B;IAClD,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAoC;gBAGzD,YAAY,EAAE,gBAAgB,EAC9B,MAAM,CAAC,EAAE,uBAAuB;IA0BlC,OAAO,CAAC,mBAAmB;IAY3B;;OAEG;IACG,QAAQ,CAAC,OAAO,EAAE,iBAAiB,GAAG,OAAO,CAAC,kBAAkB,CAAC;IAqKvE;;OAEG;IACH,iBAAiB,CAAC,UAAU,EAAE,MAAM,GAAG;QACrC,QAAQ,EAAE,WAAW,GAAG,SAAS,CAAC;QAClC,YAAY,EAAE,MAAM,GAAG,SAAS,CAAC;KAClC;IAQD;;OAEG;IACH,UAAU;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;IAIV;;OAEG;IACH,mBAAmB;;;;;;;;;IAInB;;OAEG;IACH,mBAAmB,CAAC,UAAU,EAAE,MAAM,GAAG,IAAI;IAK7C;;OAEG;IACH,uBAAuB,IAAI,IAAI;IAM/B;;OAEG;IACG,cAAc,IAAI,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,iBAAiB,CAAC,CAAC;IAI/D;;OAEG;IACH,cAAc,IAAI,MAAM,EAAE;IAI1B;;OAEG;IACH,YAAY,IAAI;QAAE,UAAU,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,WAAW,CAAA;KAAE,EAAE;IAI5D;;OAEG;IACH,QAAQ,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO;IAIhC;;OAEG;IACH,IAAI,IAAI,IAAI,gBAAgB,CAE3B;CACF;AAED;;GAEG;AACH,wBAAgB,+BAA+B,CAC7C,MAAM,CAAC,EAAE,uBAAuB,GAC/B,yBAAyB,CAG3B"}
|