2026-05-10 13:12:44 +08:00

238 lines
6.7 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

// 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
};