238 lines
6.7 KiB
JavaScript
Raw Normal View History

// exe-engine/src/index.js
// EXE-Engine · 自研执行引擎 · 主入口
// PRJ-EXE-001 · Phase 0
// 版权:国作登字-2026-A-00037559
'use strict';
const path = require('path');
const fs = require('fs');
const AGERouter = require('./router/age-router');
const LoadBalancer = require('./balancer/load-balancer');
const ResourceMeter = require('./meter/resource-meter');
const ContextCache = require('./cache/context-cache');
const AgentController = require('./controller/agent-controller');
const BaseAdapter = require('./adapters/base-adapter');
const DeepSeekAdapter = require('./adapters/deepseek-adapter');
const QwenAdapter = require('./adapters/qwen-adapter');
// Phase 1 新增模块
const ContextManager = require('./context/context-manager');
const Session = require('./context/session');
const MultiModelExecutor = require('./executor/multi-model');
const SchedulerV2 = require('./controller/scheduler-v2');
const MonitorDashboard = require('./monitor/dashboard');
const CONFIG_DIR = path.resolve(__dirname, '../config');
/**
* EXE-Engine 初始化器
*
* 本体论锚定
* AGE OS =
* 算力 = 墨水
* 用户 = 写字的人
*
* 初始化流程
* 1. 加载模型配置
* 2. 创建适配器实例
* 3. 组装负载均衡器
* 4. 启动计量器
* 5. 启动上下文缓存
* 6. 注册默认 Agent
* 7. 返回 AGE-Router 实例
*/
/**
* 创建并初始化 EXE-Engine 实例
*
* @param {object} [overrides] 覆写配置
* @param {object} [overrides.keys] API Keys { deepseek: 'sk-...', dashscope: 'sk-...' }
* @returns {object} { router, meter, cache, controller, balancer }
*/
function createEngine(overrides = {}) {
// 1. 加载配置
const modelConfig = JSON.parse(
fs.readFileSync(path.join(CONFIG_DIR, 'models.json'), 'utf-8')
);
const poolConfig = JSON.parse(
fs.readFileSync(path.join(CONFIG_DIR, 'resource-pools.json'), 'utf-8')
);
// 2. 解析 API Keys环境变量 > overrides
const keys = {
deepseek: process.env.DEEPSEEK_API_KEY || overrides.keys?.deepseek || '',
dashscope: process.env.DASHSCOPE_API_KEY || overrides.keys?.dashscope || ''
};
// 3. 创建适配器
const adapters = new Map();
// DeepSeek-V3
const dsV3Config = modelConfig.models['deepseek-v3'];
if (dsV3Config) {
adapters.set('deepseek-v3', new DeepSeekAdapter({
name: 'deepseek-v3',
endpoint: dsV3Config.endpoint,
apiKey: keys.deepseek,
capabilities: dsV3Config.capabilities,
costPerToken: dsV3Config.costPerToken,
maxContext: dsV3Config.maxContext,
defaultTemperature: dsV3Config.defaultTemperature,
defaultMaxTokens: dsV3Config.defaultMaxTokens
}));
}
// DeepSeek-R1
const dsR1Config = modelConfig.models['deepseek-r1'];
if (dsR1Config) {
adapters.set('deepseek-r1', new DeepSeekAdapter({
name: 'deepseek-r1',
endpoint: dsR1Config.endpoint,
apiKey: keys.deepseek,
capabilities: dsR1Config.capabilities,
costPerToken: dsR1Config.costPerToken,
maxContext: dsR1Config.maxContext,
defaultTemperature: dsR1Config.defaultTemperature,
defaultMaxTokens: dsR1Config.defaultMaxTokens
}));
}
// Qwen-Max
const qwMaxConfig = modelConfig.models['qwen-max'];
if (qwMaxConfig) {
adapters.set('qwen-max', new QwenAdapter({
name: 'qwen-max',
endpoint: qwMaxConfig.endpoint,
apiKey: keys.dashscope,
capabilities: qwMaxConfig.capabilities,
costPerToken: qwMaxConfig.costPerToken,
maxContext: qwMaxConfig.maxContext,
defaultTemperature: qwMaxConfig.defaultTemperature,
defaultMaxTokens: qwMaxConfig.defaultMaxTokens
}));
}
// Qwen-Coder
const qwCoderConfig = modelConfig.models['qwen-coder'];
if (qwCoderConfig) {
adapters.set('qwen-coder', new QwenAdapter({
name: 'qwen-coder',
endpoint: qwCoderConfig.endpoint,
apiKey: keys.dashscope,
capabilities: qwCoderConfig.capabilities,
costPerToken: qwCoderConfig.costPerToken,
maxContext: qwCoderConfig.maxContext,
defaultTemperature: qwCoderConfig.defaultTemperature,
defaultMaxTokens: qwCoderConfig.defaultMaxTokens
}));
}
// 4. 组装组件
const meter = new ResourceMeter();
const cache = new ContextCache({ maxEntries: 100, ttlMs: 30 * 60 * 1000 });
const controller = new AgentController();
const balancer = new LoadBalancer(adapters, modelConfig);
// 5. 注册默认 Agent 偏好
controller.registerAgent('AG-ZY-01', {
model: 'auto',
priority: 'balanced',
maxTokens: 4096,
mode: 'pool'
});
controller.registerAgent('AG-SY-01', {
model: 'auto',
priority: 'quality',
maxTokens: 4096,
mode: 'pool'
});
controller.registerAgent('AG-QQ-01', {
model: 'auto',
priority: 'cost',
maxTokens: 2048,
mode: 'pool'
});
// 6. 组装路由器
const router = new AGERouter({
loadBalancer: balancer,
resourceMeter: meter,
contextCache: cache,
agentController: controller,
poolConfig
});
// 7. Phase 1 组件
const contextManager = new ContextManager({ cache });
const session = new Session({ contextManager });
const multiModelExecutor = new MultiModelExecutor({ adapters, loadBalancer: balancer });
const scheduler = new SchedulerV2({ agentController: controller });
const monitor = new MonitorDashboard({ resourceMeter: meter });
return {
router,
meter,
cache,
controller,
balancer,
adapters,
contextManager,
session,
multiModelExecutor,
scheduler,
monitor,
config: { modelConfig, poolConfig }
};
}
// ── CLI 入口 ──
if (require.main === module) {
const cmd = process.argv[2];
if (cmd === 'status') {
const engine = createEngine();
const status = engine.router.getStatus();
// eslint-disable-next-line no-console
console.log(JSON.stringify(status, null, 2));
} else {
// eslint-disable-next-line no-console
console.log([
'🔧 EXE-Engine v1.0.0 · PRJ-EXE-001 · Phase 0',
'',
'本体论锚定AGE OS = 笔 · 算力 = 墨水 · 用户 = 写字的人',
'',
'用法:',
' node exe-engine/src/index.js status 查看引擎状态',
'',
'组件:',
' AGE-Router 路由网关',
' LoadBalancer 负载均衡器',
' ResourceMeter 资源计量器',
' ContextCache 上下文缓存',
' AgentController Agent 调度器',
' DeepSeekAdapter DeepSeek 适配器',
' QwenAdapter Qwen 适配器',
].join('\n'));
}
}
module.exports = {
createEngine,
AGERouter,
LoadBalancer,
ResourceMeter,
ContextCache,
AgentController,
BaseAdapter,
DeepSeekAdapter,
QwenAdapter,
ContextManager,
Session,
MultiModelExecutor,
SchedulerV2,
MonitorDashboard
};