feat: fix 1)the property named 'role' of the first message must be 'user' 2)if default summarize model 'gpt-3.5-turbo' is blocked, use currentModel instead 3)if apiurl&apikey set by location, useCustomConfig would be opened
This commit is contained in:
parent
52312dbd23
commit
b3e856df1d
|
@ -1,12 +1,12 @@
|
||||||
import { NextRequest, NextResponse } from "next/server";
|
import { NextRequest, NextResponse } from "next/server";
|
||||||
import { STORAGE_KEY, internalWhiteWebDavEndpoints } from "../../../constant";
|
import { STORAGE_KEY, internalAllowedWebDavEndpoints } from "../../../constant";
|
||||||
import { getServerSideConfig } from "@/app/config/server";
|
import { getServerSideConfig } from "@/app/config/server";
|
||||||
|
|
||||||
const config = getServerSideConfig();
|
const config = getServerSideConfig();
|
||||||
|
|
||||||
const mergedWhiteWebDavEndpoints = [
|
const mergedAllowedWebDavEndpoints = [
|
||||||
...internalWhiteWebDavEndpoints,
|
...internalAllowedWebDavEndpoints,
|
||||||
...config.whiteWebDevEndpoints,
|
...config.allowedWebDevEndpoints,
|
||||||
].filter((domain) => Boolean(domain.trim()));
|
].filter((domain) => Boolean(domain.trim()));
|
||||||
|
|
||||||
async function handle(
|
async function handle(
|
||||||
|
@ -24,7 +24,9 @@ async function handle(
|
||||||
|
|
||||||
// Validate the endpoint to prevent potential SSRF attacks
|
// Validate the endpoint to prevent potential SSRF attacks
|
||||||
if (
|
if (
|
||||||
!mergedWhiteWebDavEndpoints.some((white) => endpoint?.startsWith(white))
|
!mergedAllowedWebDavEndpoints.some(
|
||||||
|
(allowedEndpoint) => endpoint?.startsWith(allowedEndpoint),
|
||||||
|
)
|
||||||
) {
|
) {
|
||||||
return NextResponse.json(
|
return NextResponse.json(
|
||||||
{
|
{
|
||||||
|
|
|
@ -161,6 +161,13 @@ export class ClaudeApi implements LLMApi {
|
||||||
};
|
};
|
||||||
});
|
});
|
||||||
|
|
||||||
|
if (prompt[0]?.role === "assistant") {
|
||||||
|
prompt.unshift({
|
||||||
|
role: "user",
|
||||||
|
content: "",
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
const requestBody: AnthropicChatRequest = {
|
const requestBody: AnthropicChatRequest = {
|
||||||
messages: prompt,
|
messages: prompt,
|
||||||
stream: shouldStream,
|
stream: shouldStream,
|
||||||
|
|
|
@ -1088,6 +1088,7 @@ function _Chat() {
|
||||||
if (payload.url) {
|
if (payload.url) {
|
||||||
accessStore.update((access) => (access.openaiUrl = payload.url!));
|
accessStore.update((access) => (access.openaiUrl = payload.url!));
|
||||||
}
|
}
|
||||||
|
accessStore.useCustomConfig = true;
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
} catch {
|
} catch {
|
||||||
|
|
|
@ -82,9 +82,9 @@ export const getServerSideConfig = () => {
|
||||||
`[Server Config] using ${randomIndex + 1} of ${apiKeys.length} api key`,
|
`[Server Config] using ${randomIndex + 1} of ${apiKeys.length} api key`,
|
||||||
);
|
);
|
||||||
|
|
||||||
const whiteWebDevEndpoints = (process.env.WHITE_WEBDEV_ENDPOINTS ?? "").split(
|
const allowedWebDevEndpoints = (
|
||||||
",",
|
process.env.WHITE_WEBDEV_ENDPOINTS ?? ""
|
||||||
);
|
).split(",");
|
||||||
|
|
||||||
return {
|
return {
|
||||||
baseUrl: process.env.BASE_URL,
|
baseUrl: process.env.BASE_URL,
|
||||||
|
@ -120,6 +120,6 @@ export const getServerSideConfig = () => {
|
||||||
disableFastLink: !!process.env.DISABLE_FAST_LINK,
|
disableFastLink: !!process.env.DISABLE_FAST_LINK,
|
||||||
customModels,
|
customModels,
|
||||||
defaultModel,
|
defaultModel,
|
||||||
whiteWebDevEndpoints,
|
allowedWebDevEndpoints,
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
|
@ -197,7 +197,7 @@ export const CHAT_PAGE_SIZE = 15;
|
||||||
export const MAX_RENDER_MSG_COUNT = 45;
|
export const MAX_RENDER_MSG_COUNT = 45;
|
||||||
|
|
||||||
// some famous webdav endpoints
|
// some famous webdav endpoints
|
||||||
export const internalWhiteWebDavEndpoints = [
|
export const internalAllowedWebDavEndpoints = [
|
||||||
"https://dav.jianguoyun.com/dav/",
|
"https://dav.jianguoyun.com/dav/",
|
||||||
"https://dav.dropdav.com/",
|
"https://dav.dropdav.com/",
|
||||||
"https://dav.box.com/dav",
|
"https://dav.box.com/dav",
|
||||||
|
|
|
@ -21,6 +21,8 @@ import { estimateTokenLength } from "../utils/token";
|
||||||
import { nanoid } from "nanoid";
|
import { nanoid } from "nanoid";
|
||||||
import { createPersistStore } from "../utils/store";
|
import { createPersistStore } from "../utils/store";
|
||||||
import { identifyDefaultClaudeModel } from "../utils/checkers";
|
import { identifyDefaultClaudeModel } from "../utils/checkers";
|
||||||
|
import { collectModelsWithDefaultModel } from "../utils/model";
|
||||||
|
import { useAccessStore } from "./access";
|
||||||
|
|
||||||
export type ChatMessage = RequestMessage & {
|
export type ChatMessage = RequestMessage & {
|
||||||
date: string;
|
date: string;
|
||||||
|
@ -87,9 +89,19 @@ function createEmptySession(): ChatSession {
|
||||||
function getSummarizeModel(currentModel: string) {
|
function getSummarizeModel(currentModel: string) {
|
||||||
// if it is using gpt-* models, force to use 3.5 to summarize
|
// if it is using gpt-* models, force to use 3.5 to summarize
|
||||||
if (currentModel.startsWith("gpt")) {
|
if (currentModel.startsWith("gpt")) {
|
||||||
return SUMMARIZE_MODEL;
|
const configStore = useAppConfig.getState();
|
||||||
|
const accessStore = useAccessStore.getState();
|
||||||
|
const allModel = collectModelsWithDefaultModel(
|
||||||
|
configStore.models,
|
||||||
|
[configStore.customModels, accessStore.customModels].join(","),
|
||||||
|
accessStore.defaultModel,
|
||||||
|
);
|
||||||
|
const summarizeModel = allModel.find(
|
||||||
|
(m) => m.name === SUMMARIZE_MODEL && m.available,
|
||||||
|
);
|
||||||
|
return summarizeModel?.name ?? currentModel;
|
||||||
}
|
}
|
||||||
if (currentModel.startsWith("gemini-pro")) {
|
if (currentModel.startsWith("gemini")) {
|
||||||
return GEMINI_SUMMARIZE_MODEL;
|
return GEMINI_SUMMARIZE_MODEL;
|
||||||
}
|
}
|
||||||
return currentModel;
|
return currentModel;
|
||||||
|
|
|
@ -64,13 +64,10 @@ export function collectModelTableWithDefaultModel(
|
||||||
) {
|
) {
|
||||||
let modelTable = collectModelTable(models, customModels);
|
let modelTable = collectModelTable(models, customModels);
|
||||||
if (defaultModel && defaultModel !== "") {
|
if (defaultModel && defaultModel !== "") {
|
||||||
delete modelTable[defaultModel];
|
|
||||||
modelTable[defaultModel] = {
|
modelTable[defaultModel] = {
|
||||||
|
...modelTable[defaultModel],
|
||||||
name: defaultModel,
|
name: defaultModel,
|
||||||
displayName: defaultModel,
|
|
||||||
available: true,
|
available: true,
|
||||||
provider:
|
|
||||||
modelTable[defaultModel]?.provider ?? customProvider(defaultModel),
|
|
||||||
isDefault: true,
|
isDefault: true,
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue