mirror of
				https://github.com/ChatGPTNextWeb/ChatGPT-Next-Web.git
				synced 2025-11-04 16:23:41 +08:00 
			
		
		
		
	Merge pull request #4625 from ChatGPTNextWeb/chore-fix
feat: fix 1)the property named 'role' of the first message must be 'u…
This commit is contained in:
		@@ -1,12 +1,12 @@
 | 
			
		||||
import { NextRequest, NextResponse } from "next/server";
 | 
			
		||||
import { STORAGE_KEY, internalWhiteWebDavEndpoints } from "../../../constant";
 | 
			
		||||
import { STORAGE_KEY, internalAllowedWebDavEndpoints } from "../../../constant";
 | 
			
		||||
import { getServerSideConfig } from "@/app/config/server";
 | 
			
		||||
 | 
			
		||||
const config = getServerSideConfig();
 | 
			
		||||
 | 
			
		||||
const mergedWhiteWebDavEndpoints = [
 | 
			
		||||
  ...internalWhiteWebDavEndpoints,
 | 
			
		||||
  ...config.whiteWebDevEndpoints,
 | 
			
		||||
const mergedAllowedWebDavEndpoints = [
 | 
			
		||||
  ...internalAllowedWebDavEndpoints,
 | 
			
		||||
  ...config.allowedWebDevEndpoints,
 | 
			
		||||
].filter((domain) => Boolean(domain.trim()));
 | 
			
		||||
 | 
			
		||||
async function handle(
 | 
			
		||||
@@ -24,7 +24,9 @@ async function handle(
 | 
			
		||||
 | 
			
		||||
  // Validate the endpoint to prevent potential SSRF attacks
 | 
			
		||||
  if (
 | 
			
		||||
    !mergedWhiteWebDavEndpoints.some((white) => endpoint?.startsWith(white))
 | 
			
		||||
    !mergedAllowedWebDavEndpoints.some(
 | 
			
		||||
      (allowedEndpoint) => endpoint?.startsWith(allowedEndpoint),
 | 
			
		||||
    )
 | 
			
		||||
  ) {
 | 
			
		||||
    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 = {
 | 
			
		||||
      messages: prompt,
 | 
			
		||||
      stream: shouldStream,
 | 
			
		||||
 
 | 
			
		||||
@@ -1088,6 +1088,7 @@ function _Chat() {
 | 
			
		||||
            if (payload.url) {
 | 
			
		||||
              accessStore.update((access) => (access.openaiUrl = payload.url!));
 | 
			
		||||
            }
 | 
			
		||||
            accessStore.update((access) => (access.useCustomConfig = true));
 | 
			
		||||
          });
 | 
			
		||||
        }
 | 
			
		||||
      } catch {
 | 
			
		||||
 
 | 
			
		||||
@@ -82,9 +82,9 @@ export const getServerSideConfig = () => {
 | 
			
		||||
    `[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 {
 | 
			
		||||
    baseUrl: process.env.BASE_URL,
 | 
			
		||||
@@ -120,6 +120,6 @@ export const getServerSideConfig = () => {
 | 
			
		||||
    disableFastLink: !!process.env.DISABLE_FAST_LINK,
 | 
			
		||||
    customModels,
 | 
			
		||||
    defaultModel,
 | 
			
		||||
    whiteWebDevEndpoints,
 | 
			
		||||
    allowedWebDevEndpoints,
 | 
			
		||||
  };
 | 
			
		||||
};
 | 
			
		||||
 
 | 
			
		||||
@@ -197,7 +197,7 @@ export const CHAT_PAGE_SIZE = 15;
 | 
			
		||||
export const MAX_RENDER_MSG_COUNT = 45;
 | 
			
		||||
 | 
			
		||||
// some famous webdav endpoints
 | 
			
		||||
export const internalWhiteWebDavEndpoints = [
 | 
			
		||||
export const internalAllowedWebDavEndpoints = [
 | 
			
		||||
  "https://dav.jianguoyun.com/dav/",
 | 
			
		||||
  "https://dav.dropdav.com/",
 | 
			
		||||
  "https://dav.box.com/dav",
 | 
			
		||||
 
 | 
			
		||||
@@ -21,6 +21,8 @@ import { estimateTokenLength } from "../utils/token";
 | 
			
		||||
import { nanoid } from "nanoid";
 | 
			
		||||
import { createPersistStore } from "../utils/store";
 | 
			
		||||
import { identifyDefaultClaudeModel } from "../utils/checkers";
 | 
			
		||||
import { collectModelsWithDefaultModel } from "../utils/model";
 | 
			
		||||
import { useAccessStore } from "./access";
 | 
			
		||||
 | 
			
		||||
export type ChatMessage = RequestMessage & {
 | 
			
		||||
  date: string;
 | 
			
		||||
@@ -87,9 +89,19 @@ function createEmptySession(): ChatSession {
 | 
			
		||||
function getSummarizeModel(currentModel: string) {
 | 
			
		||||
  // if it is using gpt-* models, force to use 3.5 to summarize
 | 
			
		||||
  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 currentModel;
 | 
			
		||||
 
 | 
			
		||||
@@ -64,13 +64,10 @@ export function collectModelTableWithDefaultModel(
 | 
			
		||||
) {
 | 
			
		||||
  let modelTable = collectModelTable(models, customModels);
 | 
			
		||||
  if (defaultModel && defaultModel !== "") {
 | 
			
		||||
    delete modelTable[defaultModel];
 | 
			
		||||
    modelTable[defaultModel] = {
 | 
			
		||||
      ...modelTable[defaultModel],
 | 
			
		||||
      name: defaultModel,
 | 
			
		||||
      displayName: defaultModel,
 | 
			
		||||
      available: true,
 | 
			
		||||
      provider:
 | 
			
		||||
        modelTable[defaultModel]?.provider ?? customProvider(defaultModel),
 | 
			
		||||
      isDefault: true,
 | 
			
		||||
    };
 | 
			
		||||
  }
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user