update available models

This commit is contained in:
被遗忘的记忆
2024-09-06 22:57:46 +08:00
committed by GitHub
parent 5b71531315
commit 26ad55cb44
+41 -30
View File
@@ -1,10 +1,11 @@
import express from "express";
import { createEvent, getGitRevision } from "./utils.mjs";
import {createEvent, getGitRevision} from "./utils.mjs";
import YouProvider from "./provider.mjs";
import localtunnel from "localtunnel";
import ngrok from 'ngrok';
import { v4 as uuidv4 } from "uuid";
import {v4 as uuidv4} from "uuid";
import './proxyAgent.mjs';
const app = express();
const port = process.env.PORT || 8080;
const validApiKey = process.env.PASSWORD;
@@ -20,6 +21,7 @@ const availableModels = [
"llama3",
"gemini_pro",
"gemini_1_5_pro",
"gemini_1_5_flash",
"databricks_dbrx_instruct",
"command_r",
"command_r_plus",
@@ -77,7 +79,7 @@ app.get("/v1/models", OpenAIApiKeyAuth, (req, res) => {
name: model,
};
});
res.json({ object: "list", data: models });
res.json({object: "list", data: models});
});
// handle openai format model request
app.post("/v1/chat/completions", OpenAIApiKeyAuth, (req, res) => {
@@ -105,7 +107,7 @@ app.post("/v1/chat/completions", OpenAIApiKeyAuth, (req, res) => {
jsonBody.model = modelMappping[jsonBody.model];
}
if (jsonBody.model && !availableModels.includes(jsonBody.model)) {
res.json({ error: { code: 404, message: "Invalid Model" } });
res.json({error: {code: 404, message: "Invalid Model"}});
return;
}
console.log("Using model " + jsonBody.model);
@@ -121,7 +123,7 @@ app.post("/v1/chat/completions", OpenAIApiKeyAuth, (req, res) => {
useCustomMode: process.env.USE_CUSTOM_MODE === "true"
}
)
.then(({ completion, cancel }) => {
.then(({completion, cancel}) => {
completion.on("start", (id) => {
if (jsonBody.stream) {
// send message start
@@ -133,7 +135,12 @@ app.post("/v1/chat/completions", OpenAIApiKeyAuth, (req, res) => {
created: Math.floor(new Date().getTime() / 1000),
model: jsonBody.model,
system_fingerprint: "114514",
choices: [{ index: 0, delta: { role: "assistant", content: "" }, logprobs: null, finish_reason: null }],
choices: [{
index: 0,
delta: {role: "assistant", content: ""},
logprobs: null,
finish_reason: null
}],
})
);
}
@@ -147,12 +154,12 @@ app.post("/v1/chat/completions", OpenAIApiKeyAuth, (req, res) => {
choices: [
{
content_filter_results: {
hate: { filtered: false, severity: "safe" },
self_harm: { filtered: false, severity: "safe" },
sexual: { filtered: false, severity: "safe" },
violence: { filtered: false, severity: "safe" },
hate: {filtered: false, severity: "safe"},
self_harm: {filtered: false, severity: "safe"},
sexual: {filtered: false, severity: "safe"},
violence: {filtered: false, severity: "safe"},
},
delta: { content: text },
delta: {content: text},
finish_reason: null,
index: 0,
},
@@ -216,10 +223,10 @@ app.post("/v1/chat/completions", OpenAIApiKeyAuth, (req, res) => {
choices: [
{
content_filter_results: {
hate: { filtered: false, severity: "safe" },
self_harm: { filtered: false, severity: "safe" },
sexual: { filtered: false, severity: "safe" },
violence: { filtered: false, severity: "safe" },
hate: {filtered: false, severity: "safe"},
self_harm: {filtered: false, severity: "safe"},
sexual: {filtered: false, severity: "safe"},
violence: {filtered: false, severity: "safe"},
},
delta: {
content: "Error occurred, please check the log.\n\n出现错误,请检查日志:<pre>" + error.stack || error + "</pre>",
@@ -283,7 +290,7 @@ app.post("/v1/messages", AnthropicApiKeyAuth, (req, res) => {
let jsonBody = JSON.parse(req.rawBody);
if (jsonBody.system) {
// 把系统消息加入messages的首条
jsonBody.messages.unshift({ role: "system", content: jsonBody.system });
jsonBody.messages.unshift({role: "system", content: jsonBody.system});
}
console.log("message length:" + jsonBody.messages.length);
@@ -311,7 +318,7 @@ app.post("/v1/messages", AnthropicApiKeyAuth, (req, res) => {
proxyModel: proxyModel,
useCustomMode: process.env.USE_CUSTOM_MODE === "true"
})
.then(({ completion, cancel }) => {
.then(({completion, cancel}) => {
completion.on("start", (id) => {
if (jsonBody.stream) {
// send message start
@@ -326,12 +333,16 @@ app.post("/v1/messages", AnthropicApiKeyAuth, (req, res) => {
model: proxyModel,
stop_reason: null,
stop_sequence: null,
usage: { input_tokens: 8, output_tokens: 1 },
usage: {input_tokens: 8, output_tokens: 1},
},
})
);
res.write(createEvent("content_block_start", { type: "content_block_start", index: 0, content_block: { type: "text", text: "" } }));
res.write(createEvent("ping", { type: "ping" }));
res.write(createEvent("content_block_start", {
type: "content_block_start",
index: 0,
content_block: {type: "text", text: ""}
}));
res.write(createEvent("ping", {type: "ping"}));
}
});
@@ -342,7 +353,7 @@ app.post("/v1/messages", AnthropicApiKeyAuth, (req, res) => {
createEvent("content_block_delta", {
type: "content_block_delta",
index: 0,
delta: { type: "text_delta", text: text },
delta: {type: "text_delta", text: text},
})
);
} else {
@@ -375,15 +386,15 @@ app.post("/v1/messages", AnthropicApiKeyAuth, (req, res) => {
completion.on("end", () => {
if (jsonBody.stream) {
res.write(createEvent("content_block_stop", { type: "content_block_stop", index: 0 }));
res.write(createEvent("content_block_stop", {type: "content_block_stop", index: 0}));
res.write(
createEvent("message_delta", {
type: "message_delta",
delta: { stop_reason: "end_turn", stop_sequence: null },
usage: { output_tokens: 12 },
delta: {stop_reason: "end_turn", stop_sequence: null},
usage: {output_tokens: 12},
})
);
res.write(createEvent("message_stop", { type: "message_stop" }));
res.write(createEvent("message_stop", {type: "message_stop"}));
res.end();
}
});
@@ -439,13 +450,13 @@ app.post("/v1/messages", AnthropicApiKeyAuth, (req, res) => {
// handle other
app.use((req, res, next) => {
const { revision, branch } = getGitRevision();
const {revision, branch} = getGitRevision();
res.status(404).send("Not Found (YouChat_Proxy " + revision + "@" + branch + ")");
console.log("收到了错误路径的请求,请检查您使用的API端点是否正确。")
});
const createLocaltunnel = async (port, subdomain) => {
const tunnelOptions = { port };
const tunnelOptions = {port};
if (subdomain) {
tunnelOptions.subdomain = subdomain;
}
@@ -461,7 +472,7 @@ const createLocaltunnel = async (port, subdomain) => {
};
const createNgrok = async (port, authToken, customDomain, subdomain) => {
const ngrokOptions = { addr: port, authtoken: authToken };
const ngrokOptions = {addr: port, authtoken: authToken};
if (customDomain) {
ngrokOptions.hostname = customDomain;
@@ -520,7 +531,7 @@ function AnthropicApiKeyAuth(req, res, next) {
// If Environment variable PASSWORD is set AND x-api-key header is not equal to it, return 401
const clientIpAddress = req.headers["x-forwarded-for"] || req.ip;
console.log(`Receviced Request from IP ${clientIpAddress} but got invalid password.`);
return res.status(401).json({ error: "Invalid Password" });
return res.status(401).json({error: "Invalid Password"});
}
next();
@@ -533,7 +544,7 @@ function OpenAIApiKeyAuth(req, res, next) {
// If Environment variable PASSWORD is set AND Authorization header is not equal to it, return 401
const clientIpAddress = req.headers["x-forwarded-for"] || req.ip;
console.log(`Receviced Request from IP ${clientIpAddress} but got invalid password.`);
return res.status(401).json({ error: { code: 403, message: "Invalid Password" } });
return res.status(401).json({error: {code: 403, message: "Invalid Password"}});
}
next();