atabey 0.0.12 → 0.0.13
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/ATABEY.md +45 -499
- package/PRIVACY.md +161 -0
- package/README.md +353 -88
- package/bin/validate-al-registry.js +4 -4
- package/dist/framework-mcp/src/tools/definitions.js +23 -1
- package/dist/framework-mcp/src/tools/definitions.js.map +1 -1
- package/dist/framework-mcp/src/tools/gateway/llm_gateway_query.d.ts +19 -0
- package/dist/framework-mcp/src/tools/gateway/llm_gateway_query.js +138 -0
- package/dist/framework-mcp/src/tools/gateway/llm_gateway_query.js.map +1 -0
- package/dist/framework-mcp/src/tools/gateway/llm_gateway_status.d.ts +8 -0
- package/dist/framework-mcp/src/tools/gateway/llm_gateway_status.js +91 -0
- package/dist/framework-mcp/src/tools/gateway/llm_gateway_status.js.map +1 -0
- package/dist/framework-mcp/src/tools/index.d.ts +1 -1
- package/dist/framework-mcp/src/tools/index.js +35 -20
- package/dist/framework-mcp/src/tools/index.js.map +1 -1
- package/dist/framework-mcp/src/tools/quality/analyze_code_quality.d.ts +11 -0
- package/dist/framework-mcp/src/tools/quality/analyze_code_quality.js +166 -0
- package/dist/framework-mcp/src/tools/quality/analyze_code_quality.js.map +1 -0
- package/dist/framework-mcp/src/tools/quality/check_architecture_compliance.d.ts +11 -0
- package/dist/framework-mcp/src/tools/quality/check_architecture_compliance.js +135 -0
- package/dist/framework-mcp/src/tools/quality/check_architecture_compliance.js.map +1 -0
- package/dist/framework-mcp/src/tools/schemas.d.ts +88 -8
- package/dist/framework-mcp/src/tools/schemas.js +29 -0
- package/dist/framework-mcp/src/tools/schemas.js.map +1 -1
- package/dist/framework-mcp/src/tools/shell/run_command.js +2 -2
- package/dist/framework-mcp/src/tools/shell/run_command.js.map +1 -1
- package/dist/src/cli/commands/check.js +2 -2
- package/dist/src/cli/commands/check.js.map +1 -1
- package/dist/src/cli/commands/dashboard.d.ts +1 -1
- package/dist/src/cli/commands/dashboard.js +264 -41
- package/dist/src/cli/commands/dashboard.js.map +1 -1
- package/dist/src/cli/commands/gateway.d.ts +1 -0
- package/dist/src/cli/commands/gateway.js +172 -0
- package/dist/src/cli/commands/gateway.js.map +1 -0
- package/dist/src/cli/commands/init/create-agent.js +3 -3
- package/dist/src/cli/commands/init/create-agent.js.map +1 -1
- package/dist/src/cli/commands/init/scaffold-core.d.ts +1 -1
- package/dist/src/cli/commands/init/scaffold-core.js +1 -1
- package/dist/src/cli/commands/init/scaffold-core.js.map +1 -1
- package/dist/src/cli/commands/init.d.ts +2 -0
- package/dist/src/cli/commands/init.js +105 -23
- package/dist/src/cli/commands/init.js.map +1 -1
- package/dist/src/cli/commands/mcp.d.ts +7 -0
- package/dist/src/cli/commands/mcp.js +45 -22
- package/dist/src/cli/commands/mcp.js.map +1 -1
- package/dist/src/cli/commands/orchestrate.d.ts +8 -7
- package/dist/src/cli/commands/orchestrate.js +2 -1
- package/dist/src/cli/commands/orchestrate.js.map +1 -1
- package/dist/src/cli/commands/quickstart.d.ts +5 -5
- package/dist/src/cli/commands/quickstart.js +36 -36
- package/dist/src/cli/commands/quickstart.js.map +1 -1
- package/dist/src/cli/index.js +230 -320
- package/dist/src/cli/index.js.map +1 -1
- package/dist/src/cli/platforms/core.d.ts +12 -0
- package/dist/src/cli/platforms/core.js +73 -0
- package/dist/src/cli/platforms/core.js.map +1 -0
- package/dist/src/cli/platforms/index.d.ts +5 -0
- package/dist/src/cli/platforms/index.js +6 -0
- package/dist/src/cli/platforms/index.js.map +1 -0
- package/dist/src/cli/platforms/paths.d.ts +15 -0
- package/dist/src/cli/platforms/paths.js +102 -0
- package/dist/src/cli/platforms/paths.js.map +1 -0
- package/dist/src/cli/platforms/scaffold.d.ts +2 -0
- package/dist/src/cli/platforms/scaffold.js +73 -0
- package/dist/src/cli/platforms/scaffold.js.map +1 -0
- package/dist/src/cli/platforms/utils.d.ts +4 -0
- package/dist/src/cli/platforms/utils.js +76 -0
- package/dist/src/cli/platforms/utils.js.map +1 -0
- package/dist/src/cli/shims.js +4 -4
- package/dist/src/cli/utils/fs.d.ts +1 -1
- package/dist/src/cli/utils/fs.js +1 -1
- package/dist/src/cli/utils/fs.js.map +1 -1
- package/dist/src/modules/agents/definitions.d.ts +2 -2
- package/dist/src/modules/agents/definitions.js +59 -23
- package/dist/src/modules/agents/definitions.js.map +1 -1
- package/dist/src/modules/contracts/api.d.ts +178 -0
- package/dist/src/modules/contracts/api.js +56 -0
- package/dist/src/modules/contracts/api.js.map +1 -0
- package/dist/src/modules/contracts/index.d.ts +5 -0
- package/dist/src/modules/contracts/index.js +6 -0
- package/dist/src/modules/contracts/index.js.map +1 -0
- package/dist/src/modules/engines/agent-executor.d.ts +27 -28
- package/dist/src/modules/engines/agent-executor.js +97 -69
- package/dist/src/modules/engines/agent-executor.js.map +1 -1
- package/dist/src/modules/engines/quality-gate.d.ts +7 -7
- package/dist/src/modules/engines/quality-gate.js +7 -7
- package/dist/src/modules/engines/routing-engine.d.ts +18 -27
- package/dist/src/modules/engines/routing-engine.js +70 -44
- package/dist/src/modules/engines/routing-engine.js.map +1 -1
- package/dist/src/modules/gateway/circuit-breaker.d.ts +40 -0
- package/dist/src/modules/gateway/circuit-breaker.js +163 -0
- package/dist/src/modules/gateway/circuit-breaker.js.map +1 -0
- package/dist/src/modules/gateway/cost-tracker.d.ts +55 -0
- package/dist/src/modules/gateway/cost-tracker.js +127 -0
- package/dist/src/modules/gateway/cost-tracker.js.map +1 -0
- package/dist/src/modules/gateway/gateway.d.ts +68 -0
- package/dist/src/modules/gateway/gateway.js +235 -0
- package/dist/src/modules/gateway/gateway.js.map +1 -0
- package/dist/src/modules/gateway/index.d.ts +19 -0
- package/dist/src/modules/gateway/index.js +19 -0
- package/dist/src/modules/gateway/index.js.map +1 -0
- package/dist/src/modules/gateway/load-balancer.d.ts +86 -0
- package/dist/src/modules/gateway/load-balancer.js +230 -0
- package/dist/src/modules/gateway/load-balancer.js.map +1 -0
- package/dist/src/modules/gateway/providers/anthropic.d.ts +14 -0
- package/dist/src/modules/gateway/providers/anthropic.js +169 -0
- package/dist/src/modules/gateway/providers/anthropic.js.map +1 -0
- package/dist/src/modules/gateway/providers/base.d.ts +38 -0
- package/dist/src/modules/gateway/providers/base.js +42 -0
- package/dist/src/modules/gateway/providers/base.js.map +1 -0
- package/dist/src/modules/gateway/providers/google.d.ts +18 -0
- package/dist/src/modules/gateway/providers/google.js +176 -0
- package/dist/src/modules/gateway/providers/google.js.map +1 -0
- package/dist/src/modules/gateway/providers/grok.d.ts +14 -0
- package/dist/src/modules/gateway/providers/grok.js +166 -0
- package/dist/src/modules/gateway/providers/grok.js.map +1 -0
- package/dist/src/modules/gateway/providers/index.d.ts +21 -0
- package/dist/src/modules/gateway/providers/index.js +38 -0
- package/dist/src/modules/gateway/providers/index.js.map +1 -0
- package/dist/src/modules/gateway/providers/ollama.d.ts +23 -0
- package/dist/src/modules/gateway/providers/ollama.js +187 -0
- package/dist/src/modules/gateway/providers/ollama.js.map +1 -0
- package/dist/src/modules/gateway/providers/openai.d.ts +14 -0
- package/dist/src/modules/gateway/providers/openai.js +170 -0
- package/dist/src/modules/gateway/providers/openai.js.map +1 -0
- package/dist/src/modules/gateway/rate-limiter.d.ts +41 -0
- package/dist/src/modules/gateway/rate-limiter.js +119 -0
- package/dist/src/modules/gateway/rate-limiter.js.map +1 -0
- package/dist/src/modules/gateway/types.d.ts +114 -0
- package/dist/src/modules/gateway/types.js +8 -0
- package/dist/src/modules/gateway/types.js.map +1 -0
- package/dist/src/modules/memory/core.d.ts +4 -12
- package/dist/src/modules/memory/core.js +10 -17
- package/dist/src/modules/memory/core.js.map +1 -1
- package/dist/src/modules/memory/embedding.d.ts +28 -0
- package/dist/src/modules/memory/embedding.js +131 -0
- package/dist/src/modules/memory/embedding.js.map +1 -0
- package/dist/src/modules/providers/definitions.d.ts +9 -0
- package/dist/src/modules/providers/definitions.js +141 -0
- package/dist/src/modules/providers/definitions.js.map +1 -0
- package/dist/src/modules/providers/registry.d.ts +12 -0
- package/dist/src/modules/providers/registry.js +19 -0
- package/dist/src/modules/providers/registry.js.map +1 -0
- package/dist/src/modules/providers/shared.d.ts +1 -0
- package/dist/src/modules/providers/shared.js +105 -0
- package/dist/src/modules/providers/shared.js.map +1 -0
- package/dist/src/modules/providers/types.d.ts +14 -0
- package/dist/src/modules/providers/types.js +2 -0
- package/dist/src/modules/providers/types.js.map +1 -0
- package/dist/src/modules/skills/adapter-skills.d.ts +68 -0
- package/dist/src/modules/skills/adapter-skills.js +450 -0
- package/dist/src/modules/skills/adapter-skills.js.map +1 -0
- package/dist/src/shared/audit.d.ts +105 -0
- package/dist/src/shared/audit.js +220 -0
- package/dist/src/shared/audit.js.map +1 -0
- package/dist/src/shared/fs.js +4 -2
- package/dist/src/shared/fs.js.map +1 -1
- package/dist/src/shared/lock.d.ts +82 -0
- package/dist/src/shared/lock.js +160 -0
- package/dist/src/shared/lock.js.map +1 -0
- package/dist/src/shared/logger.d.ts +2 -0
- package/dist/src/shared/logger.js +15 -5
- package/dist/src/shared/logger.js.map +1 -1
- package/dist/src/shared/pii.d.ts +37 -0
- package/dist/src/shared/pii.js +122 -0
- package/dist/src/shared/pii.js.map +1 -0
- package/dist/src/shared/retention.d.ts +63 -0
- package/dist/src/shared/retention.js +171 -0
- package/dist/src/shared/retention.js.map +1 -0
- package/dist/src/shared/storage.d.ts +3 -1
- package/dist/src/shared/storage.js +3 -1
- package/dist/src/shared/storage.js.map +1 -1
- package/dist/tests/adapter.test.js +1 -1
- package/dist/tests/adapter.test.js.map +1 -1
- package/dist/tests/adapters/paths.test.js +4 -4
- package/dist/tests/adapters/paths.test.js.map +1 -1
- package/dist/tests/cli/commands/dashboard-coverage.test.d.ts +1 -0
- package/dist/tests/cli/commands/dashboard-coverage.test.js +88 -0
- package/dist/tests/cli/commands/dashboard-coverage.test.js.map +1 -0
- package/dist/tests/cli/init/adapter_init.test.js +4 -5
- package/dist/tests/cli/init/adapter_init.test.js.map +1 -1
- package/dist/tests/cli/init/unified_init.test.js +5 -7
- package/dist/tests/cli/init/unified_init.test.js.map +1 -1
- package/dist/tests/integration/agent_flow.test.js +14 -8
- package/dist/tests/integration/agent_flow.test.js.map +1 -1
- package/dist/tests/modules/adapters/adapters.test.js +2 -2
- package/dist/tests/modules/adapters/adapters.test.js.map +1 -1
- package/dist/tests/modules/contracts/contracts.test.d.ts +1 -0
- package/dist/tests/modules/contracts/contracts.test.js +73 -0
- package/dist/tests/modules/contracts/contracts.test.js.map +1 -0
- package/dist/tests/modules/engines/agent-executor.test.js +30 -23
- package/dist/tests/modules/engines/agent-executor.test.js.map +1 -1
- package/dist/tests/modules/gateway/circuit-breaker.test.d.ts +1 -0
- package/dist/tests/modules/gateway/circuit-breaker.test.js +124 -0
- package/dist/tests/modules/gateway/circuit-breaker.test.js.map +1 -0
- package/dist/tests/modules/gateway/cost-tracker.test.d.ts +1 -0
- package/dist/tests/modules/gateway/cost-tracker.test.js +74 -0
- package/dist/tests/modules/gateway/cost-tracker.test.js.map +1 -0
- package/dist/tests/modules/gateway/load-balancer.test.d.ts +1 -0
- package/dist/tests/modules/gateway/load-balancer.test.js +70 -0
- package/dist/tests/modules/gateway/load-balancer.test.js.map +1 -0
- package/dist/tests/modules/gateway/rate-limiter.test.d.ts +1 -0
- package/dist/tests/modules/gateway/rate-limiter.test.js +62 -0
- package/dist/tests/modules/gateway/rate-limiter.test.js.map +1 -0
- package/dist/tests/orchestrator-dependencies.test.js +23 -6
- package/dist/tests/orchestrator-dependencies.test.js.map +1 -1
- package/dist/tests/shared/audit.test.d.ts +1 -0
- package/dist/tests/shared/audit.test.js +53 -0
- package/dist/tests/shared/audit.test.js.map +1 -0
- package/dist/tests/storage-operations.test.d.ts +1 -0
- package/dist/tests/storage-operations.test.js +116 -0
- package/dist/tests/storage-operations.test.js.map +1 -0
- package/framework-mcp/README.md +324 -77
- package/framework-mcp/dist/dashboard/assets/index-BAPGLiWE.js +267 -0
- package/framework-mcp/dist/dashboard/index.html +15 -0
- package/framework-mcp/dist/framework-mcp/src/tools/definitions.js +23 -1
- package/framework-mcp/dist/framework-mcp/src/tools/gateway/llm_gateway_query.js +137 -0
- package/framework-mcp/dist/framework-mcp/src/tools/gateway/llm_gateway_status.js +90 -0
- package/framework-mcp/dist/framework-mcp/src/tools/index.js +35 -20
- package/framework-mcp/dist/framework-mcp/src/tools/quality/analyze_code_quality.js +165 -0
- package/framework-mcp/dist/framework-mcp/src/tools/quality/check_architecture_compliance.js +134 -0
- package/framework-mcp/dist/framework-mcp/src/tools/schemas.js +29 -0
- package/framework-mcp/dist/framework-mcp/src/tools/shell/run_command.js +2 -2
- package/framework-mcp/dist/src/modules/memory/core.js +10 -17
- package/framework-mcp/dist/src/modules/memory/embedding.js +130 -0
- package/framework-mcp/dist/src/shared/fs.js +4 -2
- package/framework-mcp/dist/src/shared/logger.js +15 -5
- package/framework-mcp/dist/src/shared/pii.js +121 -0
- package/framework-mcp/dist/src/shared/storage.js +3 -1
- package/framework-mcp/package.json +1 -1
- package/package.json +10 -4
- package/templates/full/ATABEY_FULL.md +515 -0
|
@@ -0,0 +1,235 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ATABEY LLM Gateway — Main Gateway Class
|
|
3
|
+
*
|
|
4
|
+
* Central entry point for all LLM requests. Integrates:
|
|
5
|
+
* - Provider Pool (OpenAI, Anthropic, Google, Grok, Ollama)
|
|
6
|
+
* - Load Balancer (round-robin, least-latency, cost-optimized, failover)
|
|
7
|
+
* - Circuit Breaker (failure detection & recovery)
|
|
8
|
+
* - Rate Limiter (RPM/TPM enforcement)
|
|
9
|
+
* - Cost Tracker (usage & budget management)
|
|
10
|
+
*/
|
|
11
|
+
import { logger } from "../../shared/logger.js";
|
|
12
|
+
import { classifyData, containsPII } from "../../shared/pii.js";
|
|
13
|
+
import { CircuitBreaker } from "./circuit-breaker.js";
|
|
14
|
+
import { CostTracker } from "./cost-tracker.js";
|
|
15
|
+
import { LoadBalancer } from "./load-balancer.js";
|
|
16
|
+
import { createProvider, getAvailableProviderIds, } from "./providers/index.js";
|
|
17
|
+
import { RateLimiter } from "./rate-limiter.js";
|
|
18
|
+
export class LLMGateway {
|
|
19
|
+
loadBalancer;
|
|
20
|
+
circuitBreaker;
|
|
21
|
+
rateLimiter;
|
|
22
|
+
costTracker;
|
|
23
|
+
initialized = false;
|
|
24
|
+
constructor() {
|
|
25
|
+
this.circuitBreaker = new CircuitBreaker();
|
|
26
|
+
this.rateLimiter = new RateLimiter();
|
|
27
|
+
this.loadBalancer = new LoadBalancer(this.circuitBreaker, this.rateLimiter);
|
|
28
|
+
this.costTracker = new CostTracker();
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* Initialize the gateway with all providers.
|
|
32
|
+
* Call once at startup. Can be reconfigured later.
|
|
33
|
+
*/
|
|
34
|
+
initialize(config) {
|
|
35
|
+
const enabledProviders = config?.enabledProviders || getAvailableProviderIds();
|
|
36
|
+
for (const id of enabledProviders) {
|
|
37
|
+
try {
|
|
38
|
+
const provider = createProvider(id);
|
|
39
|
+
this.loadBalancer.registerProvider(provider);
|
|
40
|
+
logger.info(`[GATEWAY] Provider initialized: ${id}`);
|
|
41
|
+
}
|
|
42
|
+
catch (error) {
|
|
43
|
+
logger.warn(`[GATEWAY] Failed to initialize provider ${id}: ${error.message}`);
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
if (config?.strategy) {
|
|
47
|
+
this.loadBalancer.setStrategy(config.strategy);
|
|
48
|
+
}
|
|
49
|
+
if (config?.monthlyBudget) {
|
|
50
|
+
this.costTracker.setBudget(config.monthlyBudget);
|
|
51
|
+
}
|
|
52
|
+
this.initialized = true;
|
|
53
|
+
logger.info(`[GATEWAY] Initialized with ${enabledProviders.length} providers`);
|
|
54
|
+
}
|
|
55
|
+
/**
|
|
56
|
+
* Send a chat completion request through the gateway.
|
|
57
|
+
* Automatically selects the best provider and handles retries.
|
|
58
|
+
*/
|
|
59
|
+
async chat(request) {
|
|
60
|
+
if (!this.initialized) {
|
|
61
|
+
this.initialize();
|
|
62
|
+
}
|
|
63
|
+
const traceId = request.traceId || `G-${Date.now()}-${Math.random().toString(36).substring(2, 8)}`;
|
|
64
|
+
const estimatedTokens = this.estimateRequestTokens(request);
|
|
65
|
+
const maxRetries = 2;
|
|
66
|
+
// [KVKK/GDPR] PII check for external API calls
|
|
67
|
+
const requestText = [
|
|
68
|
+
request.system || "",
|
|
69
|
+
...request.messages.map(m => m.content)
|
|
70
|
+
].join(" ");
|
|
71
|
+
const classification = classifyData(requestText);
|
|
72
|
+
if (classification === "restricted" || containsPII(requestText)) {
|
|
73
|
+
logger.warn("[KVKK] Potential PII detected in request to external provider. " +
|
|
74
|
+
`Classification: ${classification}. Trace: ${traceId}. ` +
|
|
75
|
+
"Consider using a local provider (Ollama) for sensitive data.");
|
|
76
|
+
}
|
|
77
|
+
for (let attempt = 0; attempt <= maxRetries; attempt++) {
|
|
78
|
+
try {
|
|
79
|
+
// Select the best provider
|
|
80
|
+
const provider = await this.loadBalancer.selectProvider(request.provider, request.model, estimatedTokens);
|
|
81
|
+
// Check rate limits
|
|
82
|
+
if (!this.rateLimiter.check(provider.config.id, estimatedTokens)) {
|
|
83
|
+
logger.warn(`[GATEWAY] Rate limited on ${provider.config.id}, trying next provider`);
|
|
84
|
+
continue;
|
|
85
|
+
}
|
|
86
|
+
// Circuit breaker check
|
|
87
|
+
if (!this.circuitBreaker.isAllowed(provider.config.id)) {
|
|
88
|
+
logger.warn(`[GATEWAY] Circuit open for ${provider.config.id}, trying next provider`);
|
|
89
|
+
continue;
|
|
90
|
+
}
|
|
91
|
+
logger.info(`[GATEWAY] Sending to ${provider.config.id}/${request.model || provider.config.defaultModel} ` +
|
|
92
|
+
`(attempt ${attempt + 1}, strategy: ${this.loadBalancer.getStrategy()})`);
|
|
93
|
+
// Execute the request
|
|
94
|
+
const startTime = Date.now();
|
|
95
|
+
const response = await provider.chat({
|
|
96
|
+
...request,
|
|
97
|
+
traceId,
|
|
98
|
+
});
|
|
99
|
+
const latencyMs = Date.now() - startTime;
|
|
100
|
+
// Record results
|
|
101
|
+
this.rateLimiter.record(provider.config.id, response.usage.totalTokens);
|
|
102
|
+
this.loadBalancer.recordLatency(provider.config.id, latencyMs);
|
|
103
|
+
if (response.success) {
|
|
104
|
+
this.circuitBreaker.recordSuccess(provider.config.id);
|
|
105
|
+
this.costTracker.record({
|
|
106
|
+
provider: provider.config.id,
|
|
107
|
+
model: response.model,
|
|
108
|
+
inputTokens: response.usage.inputTokens,
|
|
109
|
+
outputTokens: response.usage.outputTokens,
|
|
110
|
+
cost: response.cost,
|
|
111
|
+
timestamp: new Date().toISOString(),
|
|
112
|
+
traceId,
|
|
113
|
+
});
|
|
114
|
+
logger.info(`[GATEWAY] Success from ${provider.config.id} ` +
|
|
115
|
+
`(${response.usage.totalTokens} tokens, $${response.cost.toFixed(6)}, ${latencyMs}ms)`);
|
|
116
|
+
return { ...response, traceId };
|
|
117
|
+
}
|
|
118
|
+
// Failed — record failure and retry
|
|
119
|
+
this.circuitBreaker.recordFailure(provider.config.id);
|
|
120
|
+
logger.warn(`[GATEWAY] ${provider.config.id} failed: ${response.content.substring(0, 100)}. ` +
|
|
121
|
+
`Retries left: ${maxRetries - attempt}`);
|
|
122
|
+
}
|
|
123
|
+
catch (error) {
|
|
124
|
+
logger.warn(`[GATEWAY] Attempt ${attempt + 1} failed: ${error.message}. ` +
|
|
125
|
+
`Retries left: ${maxRetries - attempt}`);
|
|
126
|
+
// Circuit breaker will be updated by the provider on next attempt
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
// All attempts exhausted
|
|
130
|
+
logger.error(`[GATEWAY] All ${maxRetries + 1} attempts exhausted for trace ${traceId}`);
|
|
131
|
+
return {
|
|
132
|
+
success: false,
|
|
133
|
+
content: `All providers failed after ${maxRetries + 1} attempts. Check provider health with 'atabey gateway status'.`,
|
|
134
|
+
model: request.model || "unknown",
|
|
135
|
+
provider: "openai",
|
|
136
|
+
usage: { inputTokens: 0, outputTokens: 0, totalTokens: 0 },
|
|
137
|
+
latencyMs: 0,
|
|
138
|
+
cost: 0,
|
|
139
|
+
cached: false,
|
|
140
|
+
traceId,
|
|
141
|
+
};
|
|
142
|
+
}
|
|
143
|
+
/**
|
|
144
|
+
* Stream a chat completion response through the gateway.
|
|
145
|
+
*/
|
|
146
|
+
async *chatStream(request) {
|
|
147
|
+
if (!this.initialized) {
|
|
148
|
+
this.initialize();
|
|
149
|
+
}
|
|
150
|
+
const estimatedTokens = this.estimateRequestTokens(request);
|
|
151
|
+
try {
|
|
152
|
+
const provider = await this.loadBalancer.selectProvider(request.provider, request.model, estimatedTokens);
|
|
153
|
+
if (!this.circuitBreaker.isAllowed(provider.config.id)) {
|
|
154
|
+
yield {
|
|
155
|
+
content: `Circuit breaker open for ${provider.config.id}`,
|
|
156
|
+
done: true,
|
|
157
|
+
provider: provider.config.id,
|
|
158
|
+
model: request.model || provider.config.defaultModel,
|
|
159
|
+
};
|
|
160
|
+
return;
|
|
161
|
+
}
|
|
162
|
+
const stream = provider.chatStream(request);
|
|
163
|
+
for await (const chunk of stream) {
|
|
164
|
+
yield chunk;
|
|
165
|
+
if (chunk.done) {
|
|
166
|
+
this.circuitBreaker.recordSuccess(provider.config.id);
|
|
167
|
+
this.rateLimiter.record(provider.config.id, chunk.usage?.outputTokens || 100);
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
catch (error) {
|
|
172
|
+
yield {
|
|
173
|
+
content: `Stream failed: ${error.message}`,
|
|
174
|
+
done: true,
|
|
175
|
+
provider: "openai",
|
|
176
|
+
model: request.model || "unknown",
|
|
177
|
+
};
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
/**
|
|
181
|
+
* Get gateway statistics.
|
|
182
|
+
*/
|
|
183
|
+
getStats() {
|
|
184
|
+
return this.costTracker.getStats();
|
|
185
|
+
}
|
|
186
|
+
/**
|
|
187
|
+
* Get provider health status.
|
|
188
|
+
*/
|
|
189
|
+
getProviderHealth() {
|
|
190
|
+
return this.loadBalancer.getProviderHealthList();
|
|
191
|
+
}
|
|
192
|
+
/**
|
|
193
|
+
* Reset all circuit breakers.
|
|
194
|
+
*/
|
|
195
|
+
resetCircuitBreakers() {
|
|
196
|
+
for (const id of getAvailableProviderIds()) {
|
|
197
|
+
this.circuitBreaker.reset(id);
|
|
198
|
+
}
|
|
199
|
+
logger.info("[GATEWAY] All circuit breakers reset");
|
|
200
|
+
}
|
|
201
|
+
/**
|
|
202
|
+
* Enable or disable a provider.
|
|
203
|
+
*/
|
|
204
|
+
setProviderEnabled(id, enabled) {
|
|
205
|
+
const provider = this.loadBalancer.getProvider(id);
|
|
206
|
+
if (provider) {
|
|
207
|
+
provider.config.enabled = enabled;
|
|
208
|
+
logger.info(`[GATEWAY] Provider ${id} ${enabled ? "enabled" : "disabled"}`);
|
|
209
|
+
}
|
|
210
|
+
}
|
|
211
|
+
/**
|
|
212
|
+
* Add a custom provider programmatically.
|
|
213
|
+
*/
|
|
214
|
+
addCustomProvider(id, provider) {
|
|
215
|
+
this.loadBalancer.registerProvider(provider);
|
|
216
|
+
logger.info(`[GATEWAY] Custom provider added: ${id}`);
|
|
217
|
+
}
|
|
218
|
+
/**
|
|
219
|
+
* Estimate token count from request messages.
|
|
220
|
+
*/
|
|
221
|
+
estimateRequestTokens(request) {
|
|
222
|
+
let total = 0;
|
|
223
|
+
if (request.system)
|
|
224
|
+
total += request.system.length / 4;
|
|
225
|
+
for (const msg of request.messages) {
|
|
226
|
+
total += msg.content.length / 4;
|
|
227
|
+
}
|
|
228
|
+
return Math.ceil(total);
|
|
229
|
+
}
|
|
230
|
+
}
|
|
231
|
+
/**
|
|
232
|
+
* Singleton gateway instance for global use.
|
|
233
|
+
*/
|
|
234
|
+
export const gateway = new LLMGateway();
|
|
235
|
+
//# sourceMappingURL=gateway.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"gateway.js","sourceRoot":"","sources":["../../../../src/modules/gateway/gateway.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ATABEY LLM Gateway — Public API
|
|
3
|
+
*
|
|
4
|
+
* Single entry point for all gateway functionality.
|
|
5
|
+
*/
|
|
6
|
+
export { CircuitBreaker } from "./circuit-breaker.js";
|
|
7
|
+
export { CostTracker } from "./cost-tracker.js";
|
|
8
|
+
export { gateway, LLMGateway } from "./gateway.js";
|
|
9
|
+
export { LoadBalancer } from "./load-balancer.js";
|
|
10
|
+
export { AnthropicProvider } from "./providers/anthropic.js";
|
|
11
|
+
export { BaseProvider } from "./providers/base.js";
|
|
12
|
+
export { GoogleProvider } from "./providers/google.js";
|
|
13
|
+
export { GrokProvider } from "./providers/grok.js";
|
|
14
|
+
export { createProvider, getAvailableProviderIds } from "./providers/index.js";
|
|
15
|
+
export { OllamaProvider } from "./providers/ollama.js";
|
|
16
|
+
export { OpenAIProvider } from "./providers/openai.js";
|
|
17
|
+
export { RateLimiter } from "./rate-limiter.js";
|
|
18
|
+
export type { CircuitBreakerState, CostEntry, GatewayMessage, GatewayRequest, GatewayResponse, GatewayStats, LoadBalanceStrategy, ProviderConfig, ProviderHealth, ProviderId, RateLimitState, StreamChunk } from "./types.js";
|
|
19
|
+
export { PROVIDER_IDS } from "./types.js";
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ATABEY LLM Gateway — Public API
|
|
3
|
+
*
|
|
4
|
+
* Single entry point for all gateway functionality.
|
|
5
|
+
*/
|
|
6
|
+
export { CircuitBreaker } from "./circuit-breaker.js";
|
|
7
|
+
export { CostTracker } from "./cost-tracker.js";
|
|
8
|
+
export { gateway, LLMGateway } from "./gateway.js";
|
|
9
|
+
export { LoadBalancer } from "./load-balancer.js";
|
|
10
|
+
export { AnthropicProvider } from "./providers/anthropic.js";
|
|
11
|
+
export { BaseProvider } from "./providers/base.js";
|
|
12
|
+
export { GoogleProvider } from "./providers/google.js";
|
|
13
|
+
export { GrokProvider } from "./providers/grok.js";
|
|
14
|
+
export { createProvider, getAvailableProviderIds } from "./providers/index.js";
|
|
15
|
+
export { OllamaProvider } from "./providers/ollama.js";
|
|
16
|
+
export { OpenAIProvider } from "./providers/openai.js";
|
|
17
|
+
export { RateLimiter } from "./rate-limiter.js";
|
|
18
|
+
export { PROVIDER_IDS } from "./types.js";
|
|
19
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/modules/gateway/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AACtD,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAChD,OAAO,EAAE,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AACnD,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AAC7D,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACnD,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AACvD,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACnD,OAAO,EAAE,cAAc,EAAE,uBAAuB,EAAE,MAAM,sBAAsB,CAAC;AAC/E,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AACvD,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AACvD,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAQhD,OAAO,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC"}
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
import { CircuitBreaker } from "./circuit-breaker.js";
|
|
2
|
+
import { BaseProvider } from "./providers/base.js";
|
|
3
|
+
import { RateLimiter } from "./rate-limiter.js";
|
|
4
|
+
import { LoadBalanceStrategy, ProviderId } from "./types.js";
|
|
5
|
+
export declare class LoadBalancer {
|
|
6
|
+
private providers;
|
|
7
|
+
private circuitBreaker;
|
|
8
|
+
private rateLimiter;
|
|
9
|
+
private currentIndex;
|
|
10
|
+
private latencies;
|
|
11
|
+
private strategy;
|
|
12
|
+
constructor(circuitBreaker: CircuitBreaker, rateLimiter: RateLimiter);
|
|
13
|
+
/**
|
|
14
|
+
* Set the load balancing strategy.
|
|
15
|
+
*/
|
|
16
|
+
setStrategy(strategy: LoadBalanceStrategy): void;
|
|
17
|
+
/**
|
|
18
|
+
* Get current strategy.
|
|
19
|
+
*/
|
|
20
|
+
getStrategy(): LoadBalanceStrategy;
|
|
21
|
+
/**
|
|
22
|
+
* Register a provider with the load balancer.
|
|
23
|
+
*/
|
|
24
|
+
registerProvider(provider: BaseProvider): void;
|
|
25
|
+
/**
|
|
26
|
+
* Select the best provider based on current strategy.
|
|
27
|
+
* Returns the selected provider or throws if none available.
|
|
28
|
+
*/
|
|
29
|
+
selectProvider(preferredProvider?: ProviderId, model?: string, estimatedTokens?: number): Promise<BaseProvider>;
|
|
30
|
+
/**
|
|
31
|
+
* Record latency for a provider (for least-latency strategy).
|
|
32
|
+
*/
|
|
33
|
+
recordLatency(provider: ProviderId, latencyMs: number): void;
|
|
34
|
+
/**
|
|
35
|
+
* Get all registered providers.
|
|
36
|
+
*/
|
|
37
|
+
getAllProviders(): BaseProvider[];
|
|
38
|
+
/**
|
|
39
|
+
* Get a provider by ID.
|
|
40
|
+
*/
|
|
41
|
+
getProvider(id: ProviderId): BaseProvider | undefined;
|
|
42
|
+
/**
|
|
43
|
+
* Get available (healthy and not rate-limited) providers.
|
|
44
|
+
*/
|
|
45
|
+
getAvailableProviders(estimatedTokens: number): BaseProvider[];
|
|
46
|
+
/**
|
|
47
|
+
* Check if a provider is available (healthy + not rate-limited).
|
|
48
|
+
*/
|
|
49
|
+
private isAvailable;
|
|
50
|
+
/**
|
|
51
|
+
* Round-robin selection.
|
|
52
|
+
*/
|
|
53
|
+
private selectRoundRobin;
|
|
54
|
+
/**
|
|
55
|
+
* Least-latency selection.
|
|
56
|
+
*/
|
|
57
|
+
private selectLeastLatency;
|
|
58
|
+
/**
|
|
59
|
+
* Cost-optimized selection.
|
|
60
|
+
*/
|
|
61
|
+
private selectCostOptimized;
|
|
62
|
+
/**
|
|
63
|
+
* Priority-based selection (strict priority order).
|
|
64
|
+
*/
|
|
65
|
+
private selectPriorityBased;
|
|
66
|
+
/**
|
|
67
|
+
* Failover selection — try in priority order.
|
|
68
|
+
*/
|
|
69
|
+
private selectFailover;
|
|
70
|
+
/**
|
|
71
|
+
* Model-based selection.
|
|
72
|
+
*/
|
|
73
|
+
private selectByModel;
|
|
74
|
+
/**
|
|
75
|
+
* Get sorted provider list with health status.
|
|
76
|
+
*/
|
|
77
|
+
getProviderHealthList(): Array<{
|
|
78
|
+
id: ProviderId;
|
|
79
|
+
name: string;
|
|
80
|
+
healthy: boolean;
|
|
81
|
+
latencyMs: number;
|
|
82
|
+
priority: number;
|
|
83
|
+
enabled: boolean;
|
|
84
|
+
models: string[];
|
|
85
|
+
}>;
|
|
86
|
+
}
|
|
@@ -0,0 +1,230 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ATABEY LLM Gateway — Load Balancer
|
|
3
|
+
*
|
|
4
|
+
* Distributes LLM requests across multiple providers using configurable strategies:
|
|
5
|
+
* - round-robin: Cycle through providers in order
|
|
6
|
+
* - least-latency: Pick the provider with lowest average latency
|
|
7
|
+
* - cost-optimized: Pick the cheapest provider for the task
|
|
8
|
+
* - failover: Try providers in priority order
|
|
9
|
+
* - priority-based: Strictly follow priority order
|
|
10
|
+
* - model-based: Pick provider based on best model match
|
|
11
|
+
*/
|
|
12
|
+
import { logger } from "../../shared/logger.js";
|
|
13
|
+
export class LoadBalancer {
|
|
14
|
+
providers = new Map();
|
|
15
|
+
circuitBreaker;
|
|
16
|
+
rateLimiter;
|
|
17
|
+
currentIndex = 0;
|
|
18
|
+
latencies = new Map();
|
|
19
|
+
strategy = "failover";
|
|
20
|
+
constructor(circuitBreaker, rateLimiter) {
|
|
21
|
+
this.circuitBreaker = circuitBreaker;
|
|
22
|
+
this.rateLimiter = rateLimiter;
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* Set the load balancing strategy.
|
|
26
|
+
*/
|
|
27
|
+
setStrategy(strategy) {
|
|
28
|
+
this.strategy = strategy;
|
|
29
|
+
logger.info(`[LOAD] Strategy set to: ${strategy}`);
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* Get current strategy.
|
|
33
|
+
*/
|
|
34
|
+
getStrategy() {
|
|
35
|
+
return this.strategy;
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* Register a provider with the load balancer.
|
|
39
|
+
*/
|
|
40
|
+
registerProvider(provider) {
|
|
41
|
+
this.providers.set(provider.config.id, provider);
|
|
42
|
+
this.latencies.set(provider.config.id, {
|
|
43
|
+
provider: provider.config.id,
|
|
44
|
+
avgLatencyMs: 0,
|
|
45
|
+
sampleCount: 0,
|
|
46
|
+
});
|
|
47
|
+
this.rateLimiter.initialize(provider.config.id, provider.config.rpmLimit, provider.config.tpmLimit);
|
|
48
|
+
logger.info(`[LOAD] Provider registered: ${provider.config.id} (${provider.config.name})`);
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* Select the best provider based on current strategy.
|
|
52
|
+
* Returns the selected provider or throws if none available.
|
|
53
|
+
*/
|
|
54
|
+
async selectProvider(preferredProvider, model, estimatedTokens) {
|
|
55
|
+
// If a specific provider is requested, try it first
|
|
56
|
+
if (preferredProvider) {
|
|
57
|
+
const provider = this.providers.get(preferredProvider);
|
|
58
|
+
if (provider && this.isAvailable(preferredProvider, estimatedTokens || 0)) {
|
|
59
|
+
return provider;
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
// Model-based: find provider that supports the model
|
|
63
|
+
if (this.strategy === "model-based" && model) {
|
|
64
|
+
const modelProvider = this.selectByModel(model);
|
|
65
|
+
if (modelProvider)
|
|
66
|
+
return modelProvider;
|
|
67
|
+
}
|
|
68
|
+
switch (this.strategy) {
|
|
69
|
+
case "round-robin":
|
|
70
|
+
return this.selectRoundRobin(estimatedTokens || 0);
|
|
71
|
+
case "least-latency":
|
|
72
|
+
return this.selectLeastLatency(estimatedTokens || 0);
|
|
73
|
+
case "cost-optimized":
|
|
74
|
+
return this.selectCostOptimized(estimatedTokens || 0);
|
|
75
|
+
case "priority-based":
|
|
76
|
+
return this.selectPriorityBased(estimatedTokens || 0);
|
|
77
|
+
case "failover":
|
|
78
|
+
default:
|
|
79
|
+
return this.selectFailover(estimatedTokens || 0);
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
/**
|
|
83
|
+
* Record latency for a provider (for least-latency strategy).
|
|
84
|
+
*/
|
|
85
|
+
recordLatency(provider, latencyMs) {
|
|
86
|
+
const record = this.latencies.get(provider);
|
|
87
|
+
if (record) {
|
|
88
|
+
const total = record.avgLatencyMs * record.sampleCount + latencyMs;
|
|
89
|
+
record.sampleCount++;
|
|
90
|
+
record.avgLatencyMs = total / record.sampleCount;
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
/**
|
|
94
|
+
* Get all registered providers.
|
|
95
|
+
*/
|
|
96
|
+
getAllProviders() {
|
|
97
|
+
return Array.from(this.providers.values());
|
|
98
|
+
}
|
|
99
|
+
/**
|
|
100
|
+
* Get a provider by ID.
|
|
101
|
+
*/
|
|
102
|
+
getProvider(id) {
|
|
103
|
+
return this.providers.get(id);
|
|
104
|
+
}
|
|
105
|
+
/**
|
|
106
|
+
* Get available (healthy and not rate-limited) providers.
|
|
107
|
+
*/
|
|
108
|
+
getAvailableProviders(estimatedTokens) {
|
|
109
|
+
return this.getAllProviders().filter(p => this.isAvailable(p.config.id, estimatedTokens));
|
|
110
|
+
}
|
|
111
|
+
/**
|
|
112
|
+
* Check if a provider is available (healthy + not rate-limited).
|
|
113
|
+
*/
|
|
114
|
+
isAvailable(providerId, estimatedTokens) {
|
|
115
|
+
const provider = this.providers.get(providerId);
|
|
116
|
+
if (!provider || !provider.config.enabled)
|
|
117
|
+
return false;
|
|
118
|
+
if (!this.circuitBreaker.isAllowed(providerId))
|
|
119
|
+
return false;
|
|
120
|
+
if (!this.rateLimiter.check(providerId, estimatedTokens))
|
|
121
|
+
return false;
|
|
122
|
+
return true;
|
|
123
|
+
}
|
|
124
|
+
/**
|
|
125
|
+
* Round-robin selection.
|
|
126
|
+
*/
|
|
127
|
+
selectRoundRobin(estimatedTokens) {
|
|
128
|
+
const available = this.getAvailableProviders(estimatedTokens);
|
|
129
|
+
if (available.length === 0) {
|
|
130
|
+
throw new Error("No available providers (all circuits open or rate limited)");
|
|
131
|
+
}
|
|
132
|
+
// Cycle through available providers
|
|
133
|
+
this.currentIndex = (this.currentIndex + 1) % available.length;
|
|
134
|
+
return available[this.currentIndex];
|
|
135
|
+
}
|
|
136
|
+
/**
|
|
137
|
+
* Least-latency selection.
|
|
138
|
+
*/
|
|
139
|
+
selectLeastLatency(estimatedTokens) {
|
|
140
|
+
const available = this.getAvailableProviders(estimatedTokens);
|
|
141
|
+
if (available.length === 0) {
|
|
142
|
+
throw new Error("No available providers");
|
|
143
|
+
}
|
|
144
|
+
// Sort by average latency (ascending)
|
|
145
|
+
available.sort((a, b) => {
|
|
146
|
+
const la = this.latencies.get(a.config.id)?.avgLatencyMs || Infinity;
|
|
147
|
+
const lb = this.latencies.get(b.config.id)?.avgLatencyMs || Infinity;
|
|
148
|
+
return la - lb;
|
|
149
|
+
});
|
|
150
|
+
return available[0];
|
|
151
|
+
}
|
|
152
|
+
/**
|
|
153
|
+
* Cost-optimized selection.
|
|
154
|
+
*/
|
|
155
|
+
selectCostOptimized(estimatedTokens) {
|
|
156
|
+
const available = this.getAvailableProviders(estimatedTokens);
|
|
157
|
+
if (available.length === 0) {
|
|
158
|
+
throw new Error("No available providers");
|
|
159
|
+
}
|
|
160
|
+
// Sort by combined input+output cost (ascending)
|
|
161
|
+
available.sort((a, b) => {
|
|
162
|
+
const costA = a.config.costPer1kInputTokens + a.config.costPer1kOutputTokens;
|
|
163
|
+
const costB = b.config.costPer1kInputTokens + b.config.costPer1kOutputTokens;
|
|
164
|
+
return costA - costB;
|
|
165
|
+
});
|
|
166
|
+
return available[0];
|
|
167
|
+
}
|
|
168
|
+
/**
|
|
169
|
+
* Priority-based selection (strict priority order).
|
|
170
|
+
*/
|
|
171
|
+
selectPriorityBased(estimatedTokens) {
|
|
172
|
+
const available = this.getAvailableProviders(estimatedTokens);
|
|
173
|
+
// Sort by priority (ascending = higher priority first)
|
|
174
|
+
available.sort((a, b) => a.config.priority - b.config.priority);
|
|
175
|
+
// Weighted random selection
|
|
176
|
+
const totalWeight = available.reduce((sum, p) => sum + p.config.weight, 0);
|
|
177
|
+
let random = Math.random() * totalWeight;
|
|
178
|
+
for (const provider of available) {
|
|
179
|
+
random -= provider.config.weight;
|
|
180
|
+
if (random <= 0)
|
|
181
|
+
return provider;
|
|
182
|
+
}
|
|
183
|
+
return available[0];
|
|
184
|
+
}
|
|
185
|
+
/**
|
|
186
|
+
* Failover selection — try in priority order.
|
|
187
|
+
*/
|
|
188
|
+
selectFailover(estimatedTokens) {
|
|
189
|
+
// Sort all providers by priority (ascending = higher priority first)
|
|
190
|
+
const sorted = Array.from(this.providers.values()).sort((a, b) => a.config.priority - b.config.priority);
|
|
191
|
+
for (const provider of sorted) {
|
|
192
|
+
if (this.isAvailable(provider.config.id, estimatedTokens)) {
|
|
193
|
+
return provider;
|
|
194
|
+
}
|
|
195
|
+
}
|
|
196
|
+
throw new Error("No available providers (all circuits open or rate limited)");
|
|
197
|
+
}
|
|
198
|
+
/**
|
|
199
|
+
* Model-based selection.
|
|
200
|
+
*/
|
|
201
|
+
selectByModel(model) {
|
|
202
|
+
for (const provider of this.providers.values()) {
|
|
203
|
+
if (provider.supportsModel(model)) {
|
|
204
|
+
return provider;
|
|
205
|
+
}
|
|
206
|
+
}
|
|
207
|
+
return null;
|
|
208
|
+
}
|
|
209
|
+
/**
|
|
210
|
+
* Get sorted provider list with health status.
|
|
211
|
+
*/
|
|
212
|
+
getProviderHealthList() {
|
|
213
|
+
const result = [];
|
|
214
|
+
for (const [id, provider] of this.providers) {
|
|
215
|
+
const health = this.circuitBreaker.getState(id);
|
|
216
|
+
const latency = this.latencies.get(id);
|
|
217
|
+
result.push({
|
|
218
|
+
id,
|
|
219
|
+
name: provider.config.name,
|
|
220
|
+
healthy: health?.state === "CLOSED" && provider.config.enabled,
|
|
221
|
+
latencyMs: latency?.avgLatencyMs || 0,
|
|
222
|
+
priority: provider.config.priority,
|
|
223
|
+
enabled: provider.config.enabled,
|
|
224
|
+
models: provider.config.models,
|
|
225
|
+
});
|
|
226
|
+
}
|
|
227
|
+
return result.sort((a, b) => a.priority - b.priority);
|
|
228
|
+
}
|
|
229
|
+
}
|
|
230
|
+
//# sourceMappingURL=load-balancer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"load-balancer.js","sourceRoot":"","sources":["../../../../src/modules/gateway/load-balancer.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ATABEY LLM Gateway — Anthropic (Claude) Provider
|
|
3
|
+
*
|
|
4
|
+
* Supports Claude 3.5 Sonnet, Claude 3 Opus, Claude 3 Haiku models via Anthropic API.
|
|
5
|
+
*/
|
|
6
|
+
import { GatewayRequest, GatewayResponse, ProviderConfig, StreamChunk } from "../types.js";
|
|
7
|
+
import { BaseProvider } from "./base.js";
|
|
8
|
+
export declare class AnthropicProvider extends BaseProvider {
|
|
9
|
+
constructor(config?: Partial<ProviderConfig>);
|
|
10
|
+
get id(): string;
|
|
11
|
+
get name(): string;
|
|
12
|
+
chat(request: GatewayRequest): Promise<GatewayResponse>;
|
|
13
|
+
chatStream(request: GatewayRequest): AsyncGenerator<StreamChunk>;
|
|
14
|
+
}
|