Compare commits

...

5 Commits

Author SHA1 Message Date
Q.A.zh
2f857075c3
Merge ecc65fa775 into 673f907ea4 2025-06-20 13:56:12 +08:00
RiverRay
673f907ea4
Update README.md
Some checks failed
Run Tests / test (push) Has been cancelled
2025-06-19 20:18:28 +08:00
Q.A.zh
ecc65fa775
fixbug 2024-12-30 02:31:25 +00:00
Q.A.zh
da9963d4ee
仅对chat模型进行模型可用性检验,避免tts功能受影响 2024-12-29 09:10:37 +00:00
Q.A.zh
24ff78e1c5
fix custom models setting 2024-12-29 06:45:58 +00:00
4 changed files with 26 additions and 12 deletions

View File

@ -22,12 +22,12 @@ English / [简体中文](./README_CN.md)
[![MacOS][MacOS-image]][download-url] [![MacOS][MacOS-image]][download-url]
[![Linux][Linux-image]][download-url] [![Linux][Linux-image]][download-url]
[NextChatAI](https://nextchat.club?utm_source=readme) / [iOS APP](https://apps.apple.com/us/app/nextchat-ai/id6743085599) / [Web App Demo](https://app.nextchat.dev) / [Desktop App](https://github.com/Yidadaa/ChatGPT-Next-Web/releases) / [Enterprise Edition](#enterprise-edition) [NextChatAI](https://nextchat.club?utm_source=readme) / [iOS APP](https://apps.apple.com/us/app/nextchat-ai/id6743085599) / [Web App Demo](https://app.nextchat.club) / [Desktop App](https://github.com/Yidadaa/ChatGPT-Next-Web/releases) / [Enterprise Edition](#enterprise-edition)
[saas-url]: https://nextchat.club?utm_source=readme [saas-url]: https://nextchat.club?utm_source=readme
[saas-image]: https://img.shields.io/badge/NextChat-Saas-green?logo=microsoftedge [saas-image]: https://img.shields.io/badge/NextChat-Saas-green?logo=microsoftedge
[web-url]: https://app.nextchat.dev/ [web-url]: https://app.nextchat.club/
[download-url]: https://github.com/Yidadaa/ChatGPT-Next-Web/releases [download-url]: https://github.com/Yidadaa/ChatGPT-Next-Web/releases
[Web-image]: https://img.shields.io/badge/Web-PWA-orange?logo=microsoftedge [Web-image]: https://img.shields.io/badge/Web-PWA-orange?logo=microsoftedge
[Windows-image]: https://img.shields.io/badge/-Windows-blue?logo=windows [Windows-image]: https://img.shields.io/badge/-Windows-blue?logo=windows

View File

@ -1,6 +1,6 @@
import { NextRequest, NextResponse } from "next/server"; import { NextRequest, NextResponse } from "next/server";
import { getServerSideConfig } from "../config/server"; import { getServerSideConfig } from "../config/server";
import { OPENAI_BASE_URL, ServiceProvider } from "../constant"; import { OPENAI_BASE_URL, ServiceProvider, OpenaiPath } from "../constant";
import { cloudflareAIGatewayUrl } from "../utils/cloudflare"; import { cloudflareAIGatewayUrl } from "../utils/cloudflare";
import { getModelProvider, isModelNotavailableInServer } from "../utils/model"; import { getModelProvider, isModelNotavailableInServer } from "../utils/model";
@ -26,8 +26,8 @@ export async function requestOpenai(req: NextRequest) {
authValue = req.headers.get("Authorization") ?? ""; authValue = req.headers.get("Authorization") ?? "";
authHeaderName = "Authorization"; authHeaderName = "Authorization";
} }
let path = `${req.nextUrl.pathname}`.replaceAll("/api/openai/", ""); let path = `${req.nextUrl.pathname}`.replaceAll("/api/openai/", "");
let isChatRequest = path.includes(OpenaiPath.ChatPath);
let baseUrl = let baseUrl =
(isAzure ? serverConfig.azureUrl : serverConfig.baseUrl) || OPENAI_BASE_URL; (isAzure ? serverConfig.azureUrl : serverConfig.baseUrl) || OPENAI_BASE_URL;
@ -117,14 +117,14 @@ export async function requestOpenai(req: NextRequest) {
const jsonBody = JSON.parse(clonedBody) as { model?: string }; const jsonBody = JSON.parse(clonedBody) as { model?: string };
// not undefined and is false // not undefined and is false
if ( if ( isChatRequest &&
isModelNotavailableInServer( isModelNotavailableInServer(
serverConfig.customModels, serverConfig.customModels,
jsonBody?.model as string, jsonBody?.model as string,
[ [
ServiceProvider.OpenAI, ServiceProvider.OpenAI,
ServiceProvider.Azure, ServiceProvider.Azure,
jsonBody?.model as string, // support provider-unspecified model "custom" as string, // support provider-unspecified model
], ],
) )
) { ) {

View File

@ -66,8 +66,8 @@ export function collectModelTable(
// default models // default models
models.forEach((m) => { models.forEach((m) => {
// using <modelName>@<providerId> as fullName // using <modelName>@<providerType> as fullName
modelTable[`${m.name}@${m?.provider?.id}`] = { modelTable[`${m.name}@${m?.provider?.providerType}`] = {
...m, ...m,
displayName: m.name, // 'provider' is copied over if it exists displayName: m.name, // 'provider' is copied over if it exists
}; };
@ -121,12 +121,14 @@ export function collectModelTable(
if (displayName && provider.providerName == "ByteDance") { if (displayName && provider.providerName == "ByteDance") {
[customModelName, displayName] = [displayName, customModelName]; [customModelName, displayName] = [displayName, customModelName];
} }
modelTable[`${customModelName}@${provider?.id}`] = { modelTable[`${customModelName}@${provider?.providerType}`] = {
name: customModelName, name: customModelName,
displayName: displayName || customModelName, displayName: displayName || customModelName,
available, available,
provider, // Use optional chaining provider, // Use optional chaining
sorted: CustomSeq.next(`${customModelName}@${provider?.id}`), sorted: CustomSeq.next(
`${customModelName}@${provider?.providerType}`,
),
}; };
} }
} }

View File

@ -53,7 +53,7 @@ describe("isModelNotavailableInServer", () => {
expect(result).toBe(true); expect(result).toBe(true);
}); });
// FIXME: 这个测试用例有问题,需要修复 // FIXME: 这个测试用例有问题,需要修复
// test("support passing multiple providers, model available on one of the providers will return false", () => { // test("support passing multiple providers, model available on one of the providers will return false", () => {
// const customModels = "-all,gpt-4@google"; // const customModels = "-all,gpt-4@google";
// const modelName = "gpt-4"; // const modelName = "gpt-4";
@ -69,7 +69,19 @@ describe("isModelNotavailableInServer", () => {
test("test custom model without setting provider", () => { test("test custom model without setting provider", () => {
const customModels = "-all,mistral-large"; const customModels = "-all,mistral-large";
const modelName = "mistral-large"; const modelName = "mistral-large";
const providerNames = modelName; const providerNames = "custom";
const result = isModelNotavailableInServer(
customModels,
modelName,
providerNames,
);
expect(result).toBe(false);
});
test("test custom model with non-standard provider", () => {
const customModels = "-all,deepseek-chat@DeepSeek";
const modelName = "deepseek-chat";
const providerNames = "custom";
const result = isModelNotavailableInServer( const result = isModelNotavailableInServer(
customModels, customModels,
modelName, modelName,