AIClient-2-API/src/utils/provider-strategies.js
hex2077 68719879c5 feat(architecture): 重构适配器注册机制并引入并发控制系统
建立可扩展的提供商适配器注册表,实现动态服务发现与插槽管理:

架构改进:
- 采用 Map 注册表替代 switch-case 硬编码,支持热插拔适配器
- 实现 acquireSlot/releaseSlot 机制,精确追踪活跃请求与等待队列
- 新增节点评分算法,综合考量并发数、队列长度、健康状态

核心能力:
- 支持并发限制与队列等待,避免单节点过载 (concurrencyLimit/queueLimit)
- 实现 Fallback 链式调用,429 错误自动切换备用凭证
- 添加请求级 IP 追踪,日志格式优化为 `clientIp:requestId`

配套更新:
- 管理界面新增并发/队列配置字段与 Grok 逆向提供商选项
- 用量查询服务扩展 Grok 支持,同步剩余查询次数 (固定总量 80)
- 新增并发测试脚本 (tests/concurrent-test.js),支持自定义并发数与 RPM 限制

配置项:
- GROK_COOKIE_TOKEN, GROK_CF_CLEARANCE, GROK_USER_AGENT, GROK_BASE_URL
2026-02-26 18:19:38 +08:00

36 lines
1.6 KiB
JavaScript

import { MODEL_PROTOCOL_PREFIX } from '../utils/common.js';
import { GeminiStrategy } from '../providers/gemini/gemini-strategy.js';
import { OpenAIStrategy } from '../providers/openai/openai-strategy.js';
import { ClaudeStrategy } from '../providers/claude/claude-strategy.js';
import { ResponsesAPIStrategy } from '../providers/openai/openai-responses-strategy.js';
import { CodexResponsesAPIStrategy } from '../providers/openai/codex-responses-strategy.js';
import { ForwardStrategy } from '../providers/forward/forward-strategy.js';
import { GrokStrategy } from '../providers/grok/grok-strategy.js';
/**
* Strategy factory that returns the appropriate strategy instance based on the provider protocol.
*/
class ProviderStrategyFactory {
static getStrategy(providerProtocol) {
switch (providerProtocol) {
case MODEL_PROTOCOL_PREFIX.GEMINI:
return new GeminiStrategy();
case MODEL_PROTOCOL_PREFIX.OPENAI:
return new OpenAIStrategy();
case MODEL_PROTOCOL_PREFIX.OPENAI_RESPONSES:
return new ResponsesAPIStrategy();
case MODEL_PROTOCOL_PREFIX.CLAUDE:
return new ClaudeStrategy();
case MODEL_PROTOCOL_PREFIX.CODEX:
return new CodexResponsesAPIStrategy();
case MODEL_PROTOCOL_PREFIX.FORWARD:
return new ForwardStrategy();
case MODEL_PROTOCOL_PREFIX.GROK:
return new GrokStrategy();
default:
throw new Error(`Unsupported provider protocol: ${providerProtocol}`);
}
}
}
export { ProviderStrategyFactory };