80 lines
2.1 KiB
JavaScript
80 lines
2.1 KiB
JavaScript
|
|
'use strict';
|
||
|
|
|
||
|
|
const crypto = require('crypto');
|
||
|
|
const axios = require('axios');
|
||
|
|
const { COS } = require('./cos-bridge');
|
||
|
|
const { validateSession } = require('./email-auth');
|
||
|
|
|
||
|
|
// ─── 常量 ───
|
||
|
|
const TRAINING_INTERVAL = 6 * 60 * 60 * 1000; // 6小时训练一次
|
||
|
|
const COS_TRAINING_PATH = 'agent-training/v1/';
|
||
|
|
const MODEL_VERSION = 'glada-v1.0';
|
||
|
|
|
||
|
|
// ─── 训练状态存储 ───
|
||
|
|
const trainingState = {
|
||
|
|
lastRun: null,
|
||
|
|
nextRun: Date.now() + TRAINING_INTERVAL,
|
||
|
|
isRunning: false
|
||
|
|
};
|
||
|
|
|
||
|
|
// ─── 训练执行器 ───
|
||
|
|
async function runTraining(sessionToken) {
|
||
|
|
if (trainingState.isRunning) return;
|
||
|
|
|
||
|
|
trainingState.isRunning = true;
|
||
|
|
trainingState.lastRun = Date.now();
|
||
|
|
trainingState.nextRun = Date.now() + TRAINING_INTERVAL;
|
||
|
|
|
||
|
|
try {
|
||
|
|
// 验证会话
|
||
|
|
const session = validateSession(sessionToken);
|
||
|
|
if (!session.valid) throw new Error('Invalid session');
|
||
|
|
|
||
|
|
// 获取训练数据
|
||
|
|
const trainingData = await fetchTrainingData();
|
||
|
|
|
||
|
|
// 训练模型
|
||
|
|
const modelSnapshot = await trainModel(trainingData);
|
||
|
|
|
||
|
|
// 存储到COS
|
||
|
|
const cosKey = `${COS_TRAINING_PATH}${MODEL_VERSION}/${Date.now()}.model`;
|
||
|
|
await COS.upload(cosKey, modelSnapshot);
|
||
|
|
|
||
|
|
console.log(`[Agent Training] 训练完成,模型已存储: ${cosKey}`);
|
||
|
|
} catch (err) {
|
||
|
|
console.error(`[Agent Training] 训练失败: ${err.message}`);
|
||
|
|
} finally {
|
||
|
|
trainingState.isRunning = false;
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
// ─── 获取训练数据 ───
|
||
|
|
async function fetchTrainingData() {
|
||
|
|
// 从聊天日志、记忆系统等获取数据
|
||
|
|
// 实际实现需要根据具体数据源调整
|
||
|
|
return {};
|
||
|
|
}
|
||
|
|
|
||
|
|
// ─── 模型训练 ───
|
||
|
|
async function trainModel(data) {
|
||
|
|
// 这里实现实际的模型训练逻辑
|
||
|
|
// 返回训练好的模型快照
|
||
|
|
return Buffer.from(JSON.stringify({}));
|
||
|
|
}
|
||
|
|
|
||
|
|
// ─── 定时训练任务 ───
|
||
|
|
function scheduleTraining() {
|
||
|
|
setInterval(() => {
|
||
|
|
if (Date.now() >= trainingState.nextRun && !trainingState.isRunning) {
|
||
|
|
runTraining();
|
||
|
|
}
|
||
|
|
}, 60 * 1000); // 每分钟检查一次
|
||
|
|
}
|
||
|
|
|
||
|
|
// 启动定时器
|
||
|
|
scheduleTraining();
|
||
|
|
|
||
|
|
module.exports = {
|
||
|
|
runTraining,
|
||
|
|
getTrainingState: () => trainingState
|
||
|
|
};
|