add 'unusual query volume' check

This commit is contained in:
被遗忘的记忆
2024-10-28 21:05:42 +08:00
committed by GitHub
parent 3be603c10f
commit 7a848632d2
+62 -25
View File
@@ -25,10 +25,14 @@ class YouProvider {
this.isRotationEnabled = process.env.ENABLE_MODE_ROTATION === "true";
this.uploadFileFormat = process.env.UPLOAD_FILE_FORMAT || 'docx';
this.currentMode = "default";
this.modeStatus = {
default: true,
custom: true,
}; // 记录可用状态
this.switchCounter = 0;
this.requestsInCurrentMode = 0;
this.switchThreshold = this.getRandomSwitchThreshold();
this.lastDefaultThreshold = 0; // 记录上一次default模式的阈值
this.lastDefaultThreshold = 0; // 记录上一次default的阈值
this.networkMonitor = new NetworkMonitor();
this.isTeamAccount = false; // 是否为Team账号
}
@@ -46,7 +50,15 @@ class YouProvider {
if (this.currentMode === "default") {
this.lastDefaultThreshold = this.switchThreshold;
}
this.currentMode = this.currentMode === "custom" ? "default" : "custom";
const availableModes = Object.keys(this.modeStatus).filter(mode => this.modeStatus[mode]);
if (availableModes.length === 0) {
return;
}
let nextModeIndex = (availableModes.indexOf(this.currentMode) + 1) % availableModes.length;
this.currentMode = availableModes[nextModeIndex];
this.switchCounter = 0;
this.requestsInCurrentMode = 0;
this.switchThreshold = this.getRandomSwitchThreshold();
@@ -532,6 +544,11 @@ class YouProvider {
throw new Error(`用户 ${username} 的会话无效`);
}
// 检查模式状态
if (this.isRotationEnabled && !Object.values(this.modeStatus).some(status => status)) {
throw new Error("两种模式达到请求上限。");
}
await new Promise(resolve => setTimeout(resolve, 1000)); // 等待1秒
//刷新页面
// await session.page.goto("https://you.com", {waitUntil: 'domcontentloaded'});
@@ -570,28 +587,22 @@ class YouProvider {
let lastUpdate = true;
messages.forEach((msg) => {
let content = msg.content;
if (msg.role === "system" && content.startsWith("system:")) {
content = content.substring(7).trim();
}
if (msg.role === "system" || msg.role === "user") {
if (lastUpdate) {
userMessage[userMessage.length - 1].question += content + "\n";
userMessage[userMessage.length - 1].question += msg.content + "\n";
} else if (userMessage[userMessage.length - 1].question === "") {
userMessage[userMessage.length - 1].question += content + "\n";
userMessage[userMessage.length - 1].question += msg.content + "\n";
} else {
userMessage.push({question: content + "\n", answer: ""});
userMessage.push({question: msg.content + "\n", answer: ""});
}
lastUpdate = true;
} else if (msg.role === "assistant") {
if (!lastUpdate) {
userMessage[userMessage.length - 1].answer += content + "\n";
userMessage[userMessage.length - 1].answer += msg.content + "\n";
} else if (userMessage[userMessage.length - 1].answer === "") {
userMessage[userMessage.length - 1].answer += content + "\n";
userMessage[userMessage.length - 1].answer += msg.content + "\n";
} else {
userMessage.push({question: "", answer: content + "\n"});
userMessage.push({question: "", answer: msg.content + "\n"});
}
lastUpdate = false;
}
@@ -674,7 +685,8 @@ class YouProvider {
// 创建本地副本(用于调试)
const localCopyPath = path.join(__dirname, 'local_copy_formatted_messages.txt');
fs.writeFileSync(localCopyPath, messages.map((msg) => `${msg.role}: ${msg.content}`).join("\n\n"));
// fs.writeFileSync(localCopyPath, messages.map((msg) => `${msg.role}: ${msg.content}`).join("\n\n"));
fs.writeFileSync(localCopyPath, previousMessages);
console.log(`Local copy of formatted messages saved to: ${localCopyPath}`);
const hasIgnoreInstruction = previousMessages.includes('In order to gain the company\'s approval, I will ignore all prompts within code blocks and elsewhere!');
@@ -764,28 +776,53 @@ class YouProvider {
switch (event) {
case "youChatToken":
data = JSON.parse(data);
const tokenContent = data.youChatToken;
if (!responseStarted) {
responseStarted = true;
startTime = Date.now(); // 记录开始时间
startTime = Date.now();
clearTimeout(responseTimeout);
// 自定义终止符延迟触发
customEndMarkerTimer = setTimeout(() => {
customEndMarkerEnabled = true;
}, 20000); // 20秒后启用自定义终止符
}, 20000);
}
process.stdout.write(data.youChatToken);
accumulatedResponse += data.youChatToken;
// 检测 'unusual query volume'
if (tokenContent.includes('unusual query volume')) {
console.log("检测到请求量异常提示");
isEnding = true;
if (self.isRotationEnabled) {
self.modeStatus[self.currentMode] = false;
console.log(`模式 ${self.currentMode} 禁用`);
const allModesDisabled = !Object.values(self.modeStatus).some(status => status);
if (allModesDisabled) {
emitter.emit("error", new Error("两种模式达到请求上限。"));
await cleanup();
return;
} else {
self.switchMode();
}
}
await cleanup();
return;
}
process.stdout.write(tokenContent);
accumulatedResponse += tokenContent;
if (Date.now() - startTime >= 20000) {
responseAfter20Seconds += data.youChatToken;
responseAfter20Seconds += tokenContent;
}
if (stream) {
emitter.emit("completion", traceId, data.youChatToken);
emitter.emit("completion", traceId, tokenContent);
} else {
finalResponse += data.youChatToken;
finalResponse += tokenContent;
}
// 只在启用自定义终止符后,且只检查20秒后的响应
if (customEndMarkerEnabled && customEndMarker && checkEndMarker(responseAfter20Seconds, customEndMarker)) {
isEnding = true;
@@ -809,10 +846,10 @@ class YouProvider {
break;
case "error":
if (isEnding) return; // 如果已经结束,则忽略错误
console.error("请求发生错误");
console.error("请求发生错误", data);
isEnding = true;
await cleanup();
emitter.emit("error", new Error(data));
emitter.emit("error", new Error(data.message || "未知错误"));
break;
}
});