mirror of
				https://github.com/ChatGPTNextWeb/ChatGPT-Next-Web.git
				synced 2025-11-04 08:13:43 +08:00 
			
		
		
		
	Compare commits
	
		
			3 Commits
		
	
	
		
			dependabot
			...
			34ae72ba4f
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
| 
						 | 
					34ae72ba4f | ||
| 
						 | 
					fc6ddce88c | ||
| 
						 | 
					ecc1dd6474 | 
							
								
								
									
										12
									
								
								.github/workflows/app.yml
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										12
									
								
								.github/workflows/app.yml
									
									
									
									
										vendored
									
									
								
							@@ -40,12 +40,6 @@ jobs:
 | 
				
			|||||||
      fail-fast: false
 | 
					      fail-fast: false
 | 
				
			||||||
      matrix:
 | 
					      matrix:
 | 
				
			||||||
        config:
 | 
					        config:
 | 
				
			||||||
          - os: ubuntu-latest
 | 
					 | 
				
			||||||
            arch: x86_64
 | 
					 | 
				
			||||||
            rust_target: x86_64-unknown-linux-gnu
 | 
					 | 
				
			||||||
          - os: macos-latest
 | 
					 | 
				
			||||||
            arch: aarch64
 | 
					 | 
				
			||||||
            rust_target: x86_64-apple-darwin,aarch64-apple-darwin
 | 
					 | 
				
			||||||
          - os: windows-latest
 | 
					          - os: windows-latest
 | 
				
			||||||
            arch: x86_64
 | 
					            arch: x86_64
 | 
				
			||||||
            rust_target: x86_64-pc-windows-msvc
 | 
					            rust_target: x86_64-pc-windows-msvc
 | 
				
			||||||
@@ -77,12 +71,6 @@ jobs:
 | 
				
			|||||||
          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
 | 
					          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
 | 
				
			||||||
          TAURI_PRIVATE_KEY: ${{ secrets.TAURI_PRIVATE_KEY }}
 | 
					          TAURI_PRIVATE_KEY: ${{ secrets.TAURI_PRIVATE_KEY }}
 | 
				
			||||||
          TAURI_KEY_PASSWORD: ${{ secrets.TAURI_KEY_PASSWORD }}
 | 
					          TAURI_KEY_PASSWORD: ${{ secrets.TAURI_KEY_PASSWORD }}
 | 
				
			||||||
          APPLE_CERTIFICATE: ${{ secrets.APPLE_CERTIFICATE }}
 | 
					 | 
				
			||||||
          APPLE_CERTIFICATE_PASSWORD: ${{ secrets.APPLE_CERTIFICATE_PASSWORD }}
 | 
					 | 
				
			||||||
          APPLE_SIGNING_IDENTITY: ${{ secrets.APPLE_SIGNING_IDENTITY }}
 | 
					 | 
				
			||||||
          APPLE_ID: ${{ secrets.APPLE_ID }}
 | 
					 | 
				
			||||||
          APPLE_PASSWORD: ${{ secrets.APPLE_PASSWORD }}
 | 
					 | 
				
			||||||
          APPLE_TEAM_ID: ${{ secrets.APPLE_TEAM_ID }}
 | 
					 | 
				
			||||||
        with:
 | 
					        with:
 | 
				
			||||||
          releaseId: ${{ needs.create-release.outputs.release_id }}
 | 
					          releaseId: ${{ needs.create-release.outputs.release_id }}
 | 
				
			||||||
          args: ${{ matrix.config.os == 'macos-latest' && '--target universal-apple-darwin' || '' }}
 | 
					          args: ${{ matrix.config.os == 'macos-latest' && '--target universal-apple-darwin' || '' }}
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -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.club) / [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.dev) / [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.club/
 | 
					[web-url]: https://app.nextchat.dev/
 | 
				
			||||||
[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
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -56,7 +56,7 @@ export interface OpenAIListModelResponse {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
export interface RequestPayload {
 | 
					export interface RequestPayload {
 | 
				
			||||||
  messages: {
 | 
					  messages: {
 | 
				
			||||||
    role: "developer" | "system" | "user" | "assistant";
 | 
					    role: "system" | "user" | "assistant";
 | 
				
			||||||
    content: string | MultimodalContent[];
 | 
					    content: string | MultimodalContent[];
 | 
				
			||||||
  }[];
 | 
					  }[];
 | 
				
			||||||
  stream?: boolean;
 | 
					  stream?: boolean;
 | 
				
			||||||
@@ -238,16 +238,8 @@ export class ChatGPTApi implements LLMApi {
 | 
				
			|||||||
        // Please do not ask me why not send max_tokens, no reason, this param is just shit, I dont want to explain anymore.
 | 
					        // Please do not ask me why not send max_tokens, no reason, this param is just shit, I dont want to explain anymore.
 | 
				
			||||||
      };
 | 
					      };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      // O1 使用 max_completion_tokens 控制token数 (https://platform.openai.com/docs/guides/reasoning#controlling-costs)
 | 
				
			||||||
      if (isO1OrO3) {
 | 
					      if (isO1OrO3) {
 | 
				
			||||||
        // by default the o1/o3 models will not attempt to produce output that includes markdown formatting
 | 
					 | 
				
			||||||
        // manually add "Formatting re-enabled" developer message to encourage markdown inclusion in model responses
 | 
					 | 
				
			||||||
        // (https://learn.microsoft.com/en-us/azure/ai-services/openai/how-to/reasoning?tabs=python-secure#markdown-output)
 | 
					 | 
				
			||||||
        requestPayload["messages"].unshift({
 | 
					 | 
				
			||||||
          role: "developer",
 | 
					 | 
				
			||||||
          content: "Formatting re-enabled",
 | 
					 | 
				
			||||||
        });
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        // o1/o3 uses max_completion_tokens to control the number of tokens (https://platform.openai.com/docs/guides/reasoning#controlling-costs)
 | 
					 | 
				
			||||||
        requestPayload["max_completion_tokens"] = modelConfig.max_tokens;
 | 
					        requestPayload["max_completion_tokens"] = modelConfig.max_tokens;
 | 
				
			||||||
      }
 | 
					      }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -995,6 +995,8 @@ function _Chat() {
 | 
				
			|||||||
  const fontSize = config.fontSize;
 | 
					  const fontSize = config.fontSize;
 | 
				
			||||||
  const fontFamily = config.fontFamily;
 | 
					  const fontFamily = config.fontFamily;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  const slashOffsetRef = useRef(0);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  const [showExport, setShowExport] = useState(false);
 | 
					  const [showExport, setShowExport] = useState(false);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  const inputRef = useRef<HTMLTextAreaElement>(null);
 | 
					  const inputRef = useRef<HTMLTextAreaElement>(null);
 | 
				
			||||||
@@ -1093,10 +1095,13 @@ function _Chat() {
 | 
				
			|||||||
      setPromptHints([]);
 | 
					      setPromptHints([]);
 | 
				
			||||||
    } else if (text.match(ChatCommandPrefix)) {
 | 
					    } else if (text.match(ChatCommandPrefix)) {
 | 
				
			||||||
      setPromptHints(chatCommands.search(text));
 | 
					      setPromptHints(chatCommands.search(text));
 | 
				
			||||||
    } else if (!config.disablePromptHint && n < SEARCH_TEXT_LIMIT) {
 | 
					    } else if (
 | 
				
			||||||
 | 
					      !config.disablePromptHint &&
 | 
				
			||||||
 | 
					      text.length < slashOffsetRef.current + SEARCH_TEXT_LIMIT
 | 
				
			||||||
 | 
					    ) {
 | 
				
			||||||
      // check if need to trigger auto completion
 | 
					      // check if need to trigger auto completion
 | 
				
			||||||
      if (text.startsWith("/")) {
 | 
					      if (text.slice(slashOffsetRef.current).startsWith("/")) {
 | 
				
			||||||
        let searchText = text.slice(1);
 | 
					        let searchText = text.slice(slashOffsetRef.current + 1);
 | 
				
			||||||
        onSearch(searchText);
 | 
					        onSearch(searchText);
 | 
				
			||||||
      }
 | 
					      }
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
@@ -1134,7 +1139,7 @@ function _Chat() {
 | 
				
			|||||||
        setUserInput("");
 | 
					        setUserInput("");
 | 
				
			||||||
      } else {
 | 
					      } else {
 | 
				
			||||||
        // or fill the prompt
 | 
					        // or fill the prompt
 | 
				
			||||||
        setUserInput(prompt.content);
 | 
					        setUserInput(prompt.content + userInput.slice(0, slashOffsetRef.current));
 | 
				
			||||||
      }
 | 
					      }
 | 
				
			||||||
      inputRef.current?.focus();
 | 
					      inputRef.current?.focus();
 | 
				
			||||||
    }, 30);
 | 
					    }, 30);
 | 
				
			||||||
@@ -1185,6 +1190,8 @@ function _Chat() {
 | 
				
			|||||||
      setUserInput(chatStore.lastInput ?? "");
 | 
					      setUserInput(chatStore.lastInput ?? "");
 | 
				
			||||||
      e.preventDefault();
 | 
					      e.preventDefault();
 | 
				
			||||||
      return;
 | 
					      return;
 | 
				
			||||||
 | 
					    } else if (e.key === "/") {
 | 
				
			||||||
 | 
					      slashOffsetRef.current = userInput.length;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    if (shouldSubmit(e) && promptHints.length === 0) {
 | 
					    if (shouldSubmit(e) && promptHints.length === 0) {
 | 
				
			||||||
      doSubmit(userInput);
 | 
					      doSubmit(userInput);
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -523,15 +523,20 @@ const openaiModels = [
 | 
				
			|||||||
];
 | 
					];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
const googleModels = [
 | 
					const googleModels = [
 | 
				
			||||||
 | 
					  "gemini-1.0-pro", // Deprecated on 2/15/2025
 | 
				
			||||||
  "gemini-1.5-pro-latest",
 | 
					  "gemini-1.5-pro-latest",
 | 
				
			||||||
  "gemini-1.5-pro",
 | 
					  "gemini-1.5-pro",
 | 
				
			||||||
  "gemini-1.5-pro-002",
 | 
					  "gemini-1.5-pro-002",
 | 
				
			||||||
 | 
					  "gemini-1.5-pro-exp-0827",
 | 
				
			||||||
  "gemini-1.5-flash-latest",
 | 
					  "gemini-1.5-flash-latest",
 | 
				
			||||||
  "gemini-1.5-flash-8b-latest",
 | 
					  "gemini-1.5-flash-8b-latest",
 | 
				
			||||||
  "gemini-1.5-flash",
 | 
					  "gemini-1.5-flash",
 | 
				
			||||||
  "gemini-1.5-flash-8b",
 | 
					  "gemini-1.5-flash-8b",
 | 
				
			||||||
  "gemini-1.5-flash-002",
 | 
					  "gemini-1.5-flash-002",
 | 
				
			||||||
 | 
					  "gemini-1.5-flash-exp-0827",
 | 
				
			||||||
  "learnlm-1.5-pro-experimental",
 | 
					  "learnlm-1.5-pro-experimental",
 | 
				
			||||||
 | 
					  "gemini-exp-1114",
 | 
				
			||||||
 | 
					  "gemini-exp-1121",
 | 
				
			||||||
  "gemini-exp-1206",
 | 
					  "gemini-exp-1206",
 | 
				
			||||||
  "gemini-2.0-flash",
 | 
					  "gemini-2.0-flash",
 | 
				
			||||||
  "gemini-2.0-flash-exp",
 | 
					  "gemini-2.0-flash-exp",
 | 
				
			||||||
@@ -541,7 +546,6 @@ const googleModels = [
 | 
				
			|||||||
  "gemini-2.0-flash-thinking-exp-01-21",
 | 
					  "gemini-2.0-flash-thinking-exp-01-21",
 | 
				
			||||||
  "gemini-2.0-pro-exp",
 | 
					  "gemini-2.0-pro-exp",
 | 
				
			||||||
  "gemini-2.0-pro-exp-02-05",
 | 
					  "gemini-2.0-pro-exp-02-05",
 | 
				
			||||||
  "gemini-2.5-pro-preview-06-05",
 | 
					 | 
				
			||||||
];
 | 
					];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
const anthropicModels = [
 | 
					const anthropicModels = [
 | 
				
			||||||
@@ -628,18 +632,6 @@ const xAIModes = [
 | 
				
			|||||||
  "grok-2-vision-1212",
 | 
					  "grok-2-vision-1212",
 | 
				
			||||||
  "grok-2-vision",
 | 
					  "grok-2-vision",
 | 
				
			||||||
  "grok-2-vision-latest",
 | 
					  "grok-2-vision-latest",
 | 
				
			||||||
  "grok-3-mini-fast-beta",
 | 
					 | 
				
			||||||
  "grok-3-mini-fast",
 | 
					 | 
				
			||||||
  "grok-3-mini-fast-latest",
 | 
					 | 
				
			||||||
  "grok-3-mini-beta",
 | 
					 | 
				
			||||||
  "grok-3-mini",
 | 
					 | 
				
			||||||
  "grok-3-mini-latest",
 | 
					 | 
				
			||||||
  "grok-3-fast-beta",
 | 
					 | 
				
			||||||
  "grok-3-fast",
 | 
					 | 
				
			||||||
  "grok-3-fast-latest",
 | 
					 | 
				
			||||||
  "grok-3-beta",
 | 
					 | 
				
			||||||
  "grok-3",
 | 
					 | 
				
			||||||
  "grok-3-latest",
 | 
					 | 
				
			||||||
];
 | 
					];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
const chatglmModels = [
 | 
					const chatglmModels = [
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -83,7 +83,7 @@
 | 
				
			|||||||
    "jest": "^29.7.0",
 | 
					    "jest": "^29.7.0",
 | 
				
			||||||
    "jest-environment-jsdom": "^29.7.0",
 | 
					    "jest-environment-jsdom": "^29.7.0",
 | 
				
			||||||
    "lint-staged": "^13.2.2",
 | 
					    "lint-staged": "^13.2.2",
 | 
				
			||||||
    "prettier": "^3.6.2",
 | 
					    "prettier": "^3.0.2",
 | 
				
			||||||
    "ts-node": "^10.9.2",
 | 
					    "ts-node": "^10.9.2",
 | 
				
			||||||
    "tsx": "^4.16.0",
 | 
					    "tsx": "^4.16.0",
 | 
				
			||||||
    "typescript": "5.2.2",
 | 
					    "typescript": "5.2.2",
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -7076,10 +7076,10 @@ prettier-linter-helpers@^1.0.0:
 | 
				
			|||||||
  dependencies:
 | 
					  dependencies:
 | 
				
			||||||
    fast-diff "^1.1.2"
 | 
					    fast-diff "^1.1.2"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
prettier@^3.6.2:
 | 
					prettier@^3.0.2:
 | 
				
			||||||
  version "3.6.2"
 | 
					  version "3.0.2"
 | 
				
			||||||
  resolved "https://registry.yarnpkg.com/prettier/-/prettier-3.6.2.tgz#ccda02a1003ebbb2bfda6f83a074978f608b9393"
 | 
					  resolved "https://registry.yarnpkg.com/prettier/-/prettier-3.0.2.tgz#78fcecd6d870551aa5547437cdae39d4701dca5b"
 | 
				
			||||||
  integrity sha512-I7AIg5boAr5R0FFtJ6rCfD+LFsWHp81dolrFD8S79U9tb8Az2nGrJncnMSnys+bpQJfRUzqs9hnA81OAA3hCuQ==
 | 
					  integrity sha512-o2YR9qtniXvwEZlOKbveKfDQVyqxbEIWn48Z8m3ZJjBjcCmUy3xZGIv+7AkaeuaTr6yPXJjwv07ZWlsWbEy1rQ==
 | 
				
			||||||
 | 
					
 | 
				
			||||||
pretty-format@^27.0.2:
 | 
					pretty-format@^27.0.2:
 | 
				
			||||||
  version "27.5.1"
 | 
					  version "27.5.1"
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user