add multi-account logic

This commit is contained in:
被遗忘的记忆
2024-12-11 02:52:47 +08:00
committed by GitHub
parent bd39de7f0c
commit 25c1f3714d
+50 -9
View File
@@ -42,7 +42,7 @@ const modelMappping = {
"claude-3-sonnet-20240229": "claude_3_sonnet", "claude-3-sonnet-20240229": "claude_3_sonnet",
"claude-3-haiku-20240307": "claude_3_haiku", "claude-3-haiku-20240307": "claude_3_haiku",
"claude-2.1": "claude_2", "claude-2.1": "claude_2",
"claude-2.0": "claude_2", "claude-2.0": "openai_o1",
"gpt-4": "gpt_4", "gpt-4": "gpt_4",
"gpt-4o": "gpt_4o", "gpt-4o": "gpt_4o",
"gpt-4-turbo": "gpt_4_turbo", "gpt-4-turbo": "gpt_4_turbo",
@@ -100,6 +100,7 @@ app.post("/v1/chat/completions", OpenAIApiKeyAuth, (req, res) => {
// 用于存储请求体 // 用于存储请求体
req.rawBody = ""; req.rawBody = "";
req.setEncoding("utf8"); req.setEncoding("utf8");
clientState.setClosed(false);
// 接收数据 // 接收数据
req.on("data", function (chunk) { req.on("data", function (chunk) {
@@ -118,10 +119,6 @@ app.post("/v1/chat/completions", OpenAIApiKeyAuth, (req, res) => {
console.log("message length:" + jsonBody.messages.length); console.log("message length:" + jsonBody.messages.length);
// 检查是否有可用的会话
const selectedSession = sessionManager.getSessionByStrategy('random');
console.log("Using session " + selectedSession);
// 尝试映射模型 // 尝试映射模型
if (jsonBody.model && modelMappping[jsonBody.model]) { if (jsonBody.model && modelMappping[jsonBody.model]) {
jsonBody.model = modelMappping[jsonBody.model]; jsonBody.model = modelMappping[jsonBody.model];
@@ -134,6 +131,9 @@ app.post("/v1/chat/completions", OpenAIApiKeyAuth, (req, res) => {
// 调用 provider 获取回复 // 调用 provider 获取回复
try { try {
// 检查是否有可用的会话
const selectedSession = sessionManager.getSessionByStrategy('random');
console.log("Using session " + selectedSession);
const {completion, cancel} = await provider.getCompletion({ const {completion, cancel} = await provider.getCompletion({
username: selectedSession, username: selectedSession,
messages: jsonBody.messages, messages: jsonBody.messages,
@@ -141,6 +141,10 @@ app.post("/v1/chat/completions", OpenAIApiKeyAuth, (req, res) => {
proxyModel: jsonBody.model, proxyModel: jsonBody.model,
useCustomMode: process.env.USE_CUSTOM_MODE === "true" useCustomMode: process.env.USE_CUSTOM_MODE === "true"
}); });
// 释放账号
const releaseSession = () => {
sessionManager.releaseSession(selectedSession);
};
// 监听开始事件 // 监听开始事件
completion.on("start", (id) => { completion.on("start", (id) => {
@@ -228,17 +232,25 @@ app.post("/v1/chat/completions", OpenAIApiKeyAuth, (req, res) => {
res.write(createEvent("data", "[DONE]")); res.write(createEvent("data", "[DONE]"));
res.end(); res.end();
} }
releaseSession();
}); });
// 监听客户端关闭事件 // 监听客户端关闭事件
res.on("close", () => { res.on("close", () => {
console.log(" > [Client closed]"); console.log(" > [Client closed]");
clientState.setClosed(true);
completion.removeAllListeners(); completion.removeAllListeners();
cancel(); cancel();
releaseSession();
}); });
// 监听错误事件
completion.on("error", releaseSession);
} catch (error) { } catch (error) {
console.error(error); console.error(error);
const errorMessage = "Error occurred, please check the log.\n\n出现错误,请检查日志:<pre>" + (error.stack || error) + "</pre>"; const errorMessage = "Error occurred, please check the log.\n\n出现错误,请检查日志:<pre>" + (error.stack || error) + "</pre>";
res.status(500).send("No available sessions. 请检查你的账号状态。");
if (jsonBody.stream) { if (jsonBody.stream) {
res.write( res.write(
createEvent("data", { createEvent("data", {
@@ -290,6 +302,7 @@ app.post("/v1/chat/completions", OpenAIApiKeyAuth, (req, res) => {
); );
} }
res.end(); res.end();
} }
}); });
}); });
@@ -397,6 +410,7 @@ async function fetchImageAsBase64(url) {
app.post("/v1/messages", AnthropicApiKeyAuth, (req, res) => { app.post("/v1/messages", AnthropicApiKeyAuth, (req, res) => {
req.rawBody = ""; req.rawBody = "";
req.setEncoding("utf8"); req.setEncoding("utf8");
clientState.setClosed(false);
req.on("data", function (chunk) { req.on("data", function (chunk) {
req.rawBody += chunk; req.rawBody += chunk;
@@ -417,10 +431,6 @@ app.post("/v1/messages", AnthropicApiKeyAuth, (req, res) => {
} }
console.log("message length:" + jsonBody.messages.length); console.log("message length:" + jsonBody.messages.length);
// 检查是否有可用的会话
const selectedSession = sessionManager.getSessionByStrategy('random');
console.log("Using session " + selectedSession);
// decide which model to use // decide which model to use
let proxyModel; let proxyModel;
if (process.env.AI_MODEL) { if (process.env.AI_MODEL) {
@@ -434,6 +444,9 @@ app.post("/v1/messages", AnthropicApiKeyAuth, (req, res) => {
// call provider to get completion // call provider to get completion
try { try {
// 检查是否有可用的会话
const selectedSession = sessionManager.getSessionByStrategy('random');
console.log("Using session " + selectedSession);
const {completion, cancel} = await provider.getCompletion({ const {completion, cancel} = await provider.getCompletion({
username: selectedSession, username: selectedSession,
messages: jsonBody.messages, messages: jsonBody.messages,
@@ -442,6 +455,11 @@ app.post("/v1/messages", AnthropicApiKeyAuth, (req, res) => {
useCustomMode: process.env.USE_CUSTOM_MODE === "true" useCustomMode: process.env.USE_CUSTOM_MODE === "true"
}); });
// 释放账号
const releaseSession = () => {
sessionManager.releaseSession(selectedSession);
};
completion.on("start", (id) => { completion.on("start", (id) => {
if (jsonBody.stream) { if (jsonBody.stream) {
// send message start // send message start
@@ -503,17 +521,25 @@ app.post("/v1/messages", AnthropicApiKeyAuth, (req, res) => {
res.write(createEvent("message_stop", {type: "message_stop"})); res.write(createEvent("message_stop", {type: "message_stop"}));
res.end(); res.end();
} }
releaseSession();
}); });
// 监听客户端关闭事件
res.on("close", () => { res.on("close", () => {
console.log(" > [Client closed]"); console.log(" > [Client closed]");
clientState.setClosed(true);
completion.removeAllListeners(); completion.removeAllListeners();
cancel(); cancel();
releaseSession();
}); });
// 监听错误事件
completion.on("error", releaseSession);
} catch (error) { } catch (error) {
console.error(error); console.error(error);
const errorMessage = "Error occurred, please check the log.\\n\\n出现错误,请检查日志:<pre>" + (error.stack || error) + "</pre>"; const errorMessage = "Error occurred, please check the log.\\n\\n出现错误,请检查日志:<pre>" + (error.stack || error) + "</pre>";
res.status(500).send("No available sessions. 请检查你的账号状态。");
if (jsonBody.stream) { if (jsonBody.stream) {
res.write(createEvent("content_block_delta", { res.write(createEvent("content_block_delta", {
type: "content_block_delta", type: "content_block_delta",
@@ -667,3 +693,18 @@ function OpenAIApiKeyAuth(req, res, next) {
next(); next();
} }
// Path: utils.mjs
class ClientState {
#closed = false;
setClosed(value) {
this.#closed = Boolean(value);
}
isClosed() {
return this.#closed;
}
}
export const clientState = new ClientState();