diff --git a/app/api/openai.ts b/app/api/openai.ts index bbba69e569c..2b5deca8be3 100644 --- a/app/api/openai.ts +++ b/app/api/openai.ts @@ -14,7 +14,7 @@ function getModels(remoteModelRes: OpenAIListModelResponse) { if (config.disableGPT4) { remoteModelRes.data = remoteModelRes.data.filter( (m) => - !(m.id.startsWith("gpt-4") || m.id.startsWith("chatgpt-4o")) || + !(m.id.startsWith("gpt-4") || m.id.startsWith("chatgpt-4o") || m.id.startsWith("o1")) || m.id.startsWith("gpt-4o-mini"), ); } diff --git a/app/client/api.ts b/app/client/api.ts index 1da81e96448..87a07aeee87 100644 --- a/app/client/api.ts +++ b/app/client/api.ts @@ -181,7 +181,7 @@ export class ClientApi { { from: "human", value: - "Share from [NextChat]: https://github.com/Yidadaa/ChatGPT-Next-Web", + "Share from [RevoChat]: https://github.com/Yidadaa/ChatGPT-Next-Web", }, ]); // 敬告二开开发者们,为了开源大模型的发展,请不要修改上述消息,此消息用于后续数据清洗使用 diff --git a/app/client/platforms/openai.ts b/app/client/platforms/openai.ts index 7c1588440b2..15cfb7ca602 100644 --- a/app/client/platforms/openai.ts +++ b/app/client/platforms/openai.ts @@ -224,7 +224,7 @@ export class ChatGPTApi implements LLMApi { // O1 not support image, tools (plugin in ChatGPTNextWeb) and system, stream, logprobs, temperature, top_p, n, presence_penalty, frequency_penalty yet. requestPayload = { messages, - stream: !isO1 ? options.config.stream : false, + stream: options.config.stream, model: modelConfig.model, temperature: !isO1 ? modelConfig.temperature : 1, presence_penalty: !isO1 ? modelConfig.presence_penalty : 0, @@ -247,7 +247,7 @@ export class ChatGPTApi implements LLMApi { console.log("[Request] openai payload: ", requestPayload); - const shouldStream = !isDalle3 && !!options.config.stream && !isO1; + const shouldStream = !isDalle3 && !!options.config.stream; const controller = new AbortController(); options.onController?.(controller); diff --git a/app/components/artifacts.tsx b/app/components/artifacts.tsx index ce187fbcb2c..6aea2e30506 100644 --- a/app/components/artifacts.tsx +++ b/app/components/artifacts.tsx @@ -239,7 +239,7 @@ export function Artifacts() { shadow onClick={() => previewRef.current?.reload()} /> -
NextChat Artifacts
+
RevoChat Artifacts
code} diff --git a/app/components/auth.tsx b/app/components/auth.tsx index 5375bda3f70..42883aa47f5 100644 --- a/app/components/auth.tsx +++ b/app/components/auth.tsx @@ -27,10 +27,6 @@ export function AuthPage() { const accessStore = useAccessStore(); const goHome = () => navigate(Path.Home); const goChat = () => navigate(Path.Chat); - const goSaas = () => { - trackAuthorizationPageButtonToCPaymentClick(); - window.location.href = SAAS_CHAT_URL; - }; const resetAccessCode = () => { accessStore.update((access) => { @@ -115,12 +111,6 @@ export function AuthPage() { type="primary" onClick={goChat} /> - { - goSaas(); - }} - /> ); @@ -165,22 +155,6 @@ function TopBanner() { onMouseEnter={handleMouseEnter} onMouseLeave={handleMouseLeave} > -
- - - {Locale.Auth.TopTips} - { - trackSettingsPageGuideToCPaymentClick(); - }} - > - {Locale.Settings.Access.SaasStart.ChatNow} - - - -
{(isHovered || isMobile) && ( )} diff --git a/app/components/emoji.tsx b/app/components/emoji.tsx index 6db746c462c..d75cdda9268 100644 --- a/app/components/emoji.tsx +++ b/app/components/emoji.tsx @@ -37,7 +37,8 @@ export function Avatar(props: { model?: ModelType; avatar?: string }) { return (
{props.model?.startsWith("gpt-4") || - props.model?.startsWith("chatgpt-4o") ? ( + props.model?.startsWith("chatgpt-4o") || + props.model?.startsWith("o1") ? ( ) : ( diff --git a/app/components/exporter.tsx b/app/components/exporter.tsx index 79ae87be2d2..e6479d73c2d 100644 --- a/app/components/exporter.tsx +++ b/app/components/exporter.tsx @@ -541,7 +541,7 @@ export function ImagePreviewer(props: {
-
NextChat
+
RevoChat
github.com/ChatGPTNextWeb/ChatGPT-Next-Web
diff --git a/app/components/home.module.scss b/app/components/home.module.scss index 381b6a9b951..fa932c210c1 100644 --- a/app/components/home.module.scss +++ b/app/components/home.module.scss @@ -1,18 +1,15 @@ @mixin container { background-color: var(--white); border: var(--border-in-light); - border-radius: 20px; + border-radius: 16px; box-shadow: var(--shadow); color: var(--black); - background-color: var(--white); min-width: 600px; min-height: 370px; max-width: 1200px; - display: flex; overflow: hidden; box-sizing: border-box; - width: var(--window-width); height: var(--window-height); } @@ -21,23 +18,21 @@ @include container(); } -@media only screen and (min-width: 600px) { +@media (min-width: 600px) { .tight-container { --window-width: 100vw; --window-height: var(--full-height); --window-content-width: calc(100% - var(--sidebar-width)); - @include container(); - max-width: 100vw; max-height: var(--full-height); - border-radius: 0; - border: 0; + border: none; } } .sidebar { + position: relative; top: 0; width: var(--sidebar-width); box-sizing: border-box; @@ -45,9 +40,8 @@ background-color: var(--second); display: flex; flex-direction: column; - box-shadow: inset -2px 0px 2px 0px rgb(0, 0, 0, 0.05); - position: relative; - transition: width ease 0.05s; + box-shadow: inset -2px 0px 2px rgba(0, 0, 0, 0.05); + transition: width 0.3s ease; .sidebar-header-bar { display: flex; @@ -62,10 +56,9 @@ } } - &:hover, - &:active { + &:hover, &:active { .sidebar-drag { - background-color: rgba($color: #000000, $alpha: 0.01); + background-color: rgba(0, 0, 0, 0.01); svg { opacity: 0.2; @@ -75,16 +68,14 @@ } .sidebar-drag { - $width: 14px; - position: absolute; top: 0; right: 0; height: 100%; - width: $width; - background-color: rgba($color: #000000, $alpha: 0); + width: 14px; + background-color: transparent; cursor: ew-resize; - transition: all ease 0.3s; + transition: all 0.3s ease; display: flex; align-items: center; @@ -105,13 +96,13 @@ display: none; } -@media only screen and (max-width: 600px) { +@media (max-width: 600px) { .container { min-height: unset; min-width: unset; max-height: unset; min-width: unset; - border: 0; + border: none; border-radius: 0; } @@ -120,7 +111,7 @@ left: -100%; z-index: 1000; height: var(--full-height); - transition: all ease 0.3s; + transition: all 0.3s ease; box-shadow: none; } @@ -135,11 +126,11 @@ .sidebar-header { position: relative; - padding-top: 20px; - padding-bottom: 20px; + padding: 20px 0; display: flex; justify-content: space-between; align-items: center; + &-narrow { justify-content: center; } @@ -157,18 +148,18 @@ .sidebar-title { font-size: 20px; font-weight: bold; - animation: slide-in ease 0.3s; + animation: slide-in 0.3s ease; } .sidebar-sub-title { font-size: 12px; font-weight: 400; - animation: slide-in ease 0.3s; + animation: slide-in 0.3s ease; } .sidebar-body { flex: 1; - overflow: auto; + overflow-y: auto; overflow-x: hidden; } @@ -184,59 +175,59 @@ border: 2px solid transparent; position: relative; content-visibility: auto; -} -.chat-item:hover { - background-color: var(--hover-color); -} + &:hover { + background-color: var(--hover-color); + } -.chat-item-selected { - border-color: var(--primary); -} + &-selected { + border-color: var(--primary); + } -.chat-item-title { - font-size: 14px; - font-weight: bolder; - display: block; - width: calc(100% - 15px); - overflow: hidden; - text-overflow: ellipsis; - white-space: nowrap; - animation: slide-in ease 0.3s; -} + &-title { + font-size: 14px; + font-weight: bolder; + display: block; + width: calc(100% - 15px); + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; + animation: slide-in 0.3s ease; + } -.chat-item-delete { - position: absolute; - top: 0; - right: 0; - transition: all ease 0.3s; - opacity: 0; - cursor: pointer; -} + &-delete { + position: absolute; + top: 0; + right: 0; + transition: all 0.3s ease; + opacity: 0; + cursor: pointer; -.chat-item:hover > .chat-item-delete { - opacity: 0.5; - transform: translateX(-4px); -} + &:hover { + opacity: 1; + } + } -.chat-item:hover > .chat-item-delete:hover { - opacity: 1; -} + &:hover > .chat-item-delete { + opacity: 0.5; + transform: translateX(-4px); + } -.chat-item-info { - display: flex; - justify-content: space-between; - color: rgb(166, 166, 166); - font-size: 12px; - margin-top: 8px; - animation: slide-in ease 0.3s; -} + &-info { + display: flex; + justify-content: space-between; + color: rgb(166, 166, 166); + font-size: 12px; + margin-top: 8px; + animation: slide-in 0.3s ease; + } -.chat-item-count, -.chat-item-date { - overflow: hidden; - text-overflow: ellipsis; - white-space: nowrap; + &-count, + &-date { + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; + } } .narrow-sidebar { @@ -244,6 +235,7 @@ .sidebar-sub-title { display: none; } + .sidebar-logo { position: relative; display: flex; @@ -267,7 +259,7 @@ display: flex; justify-content: center; align-items: center; - transition: all ease 0.3s; + transition: all 0.3s ease; overflow: hidden; &:hover { @@ -282,7 +274,7 @@ font-weight: lighter; color: var(--black); transform: translateX(0); - transition: all ease 0.3s; + transition: all 0.3s ease; padding: 4px; display: flex; flex-direction: column; @@ -329,10 +321,10 @@ .sidebar-actions { display: inline-flex; -} -.sidebar-action:not(:last-child) { - margin-right: 15px; + .sidebar-action:not(:last-child) { + margin-right: 15px; + } } .loading-content { diff --git a/app/components/model-config.tsx b/app/components/model-config.tsx index e845bfeac7a..9a5013e6053 100644 --- a/app/components/model-config.tsx +++ b/app/components/model-config.tsx @@ -38,15 +38,22 @@ export function ModelConfigList(props: { }); }} > - {Object.keys(groupModels).map((providerName, index) => ( - - {groupModels[providerName].map((v, i) => ( - - ))} - - ))} + {Object.keys(groupModels) + .filter((providerName) => providerName === "OpenAI") + .map((providerName, index) => ( + + {groupModels[providerName] + .filter( + (v) => + (v.name === "gpt-4o" || v.name === "gpt-4o-mini" || v.name === "dall-e-3" || v.name === "o1-mini") + ) + .map((v, i) => ( + + ))} + + ))} - } - type={"primary"} - text={Locale.Settings.Access.SaasStart.ChatNow} - onClick={() => { - trackSettingsPageGuideToCPaymentClick(); - window.location.href = SAAS_CHAT_URL; - }} - /> ); @@ -1692,7 +1679,6 @@ export function Settings() { - {saasStartComponent} {accessCodeComponent} {!accessStore.hideUserApiKey && ( diff --git a/app/components/sidebar.tsx b/app/components/sidebar.tsx index a5e33b15ea3..84c9ff581b2 100644 --- a/app/components/sidebar.tsx +++ b/app/components/sidebar.tsx @@ -231,8 +231,8 @@ export function SideBar(props: { className?: string }) { {...props} > } shouldNarrow={shouldNarrow} > @@ -306,15 +306,6 @@ export function SideBar(props: { className?: string }) { />
-
- - } - shadow - /> - -
} secondaryAction={ diff --git a/app/config/server.ts b/app/config/server.ts index 485f950da03..289fb4ad517 100644 --- a/app/config/server.ts +++ b/app/config/server.ts @@ -129,14 +129,15 @@ export const getServerSideConfig = () => { if (customModels) customModels += ","; customModels += DEFAULT_MODELS.filter( (m) => - (m.name.startsWith("gpt-4") || m.name.startsWith("chatgpt-4o")) && + (m.name.startsWith("gpt-4") || m.name.startsWith("chatgpt-4o") || m.name.startsWith("o1")) && !m.name.startsWith("gpt-4o-mini"), ) .map((m) => "-" + m.name) .join(","); if ( (defaultModel.startsWith("gpt-4") || - defaultModel.startsWith("chatgpt-4o")) && + defaultModel.startsWith("chatgpt-4o") || + defaultModel.startsWith("o1")) && !defaultModel.startsWith("gpt-4o-mini") ) defaultModel = ""; diff --git a/app/constant.ts b/app/constant.ts index f1a1996b8c5..6d0260fb109 100644 --- a/app/constant.ts +++ b/app/constant.ts @@ -264,6 +264,7 @@ export const KnowledgeCutOffDate: Record = { "gpt-4o": "2023-10", "gpt-4o-2024-05-13": "2023-10", "gpt-4o-2024-08-06": "2023-10", + "gpt-4o-2024-11-20": "2023-10", "chatgpt-4o-latest": "2023-10", "gpt-4o-mini": "2023-10", "gpt-4o-mini-2024-07-18": "2023-10", @@ -303,6 +304,7 @@ const openaiModels = [ "gpt-4o", "gpt-4o-2024-05-13", "gpt-4o-2024-08-06", + "gpt-4o-2024-11-20", "chatgpt-4o-latest", "gpt-4o-mini", "gpt-4o-mini-2024-07-18", @@ -318,6 +320,9 @@ const googleModels = [ "gemini-1.0-pro", "gemini-1.5-pro-latest", "gemini-1.5-flash-latest", + "gemini-exp-1114", + "gemini-exp-1121", + "learnlm-1.5-pro-experimental", "gemini-pro-vision", ]; @@ -554,7 +559,7 @@ export const internalAllowedWebDavEndpoints = [ "https://app.koofr.net/dav/Koofr", ]; -export const DEFAULT_GA_ID = "G-89WN60ZK2E"; +export const DEFAULT_GA_ID = ""; export const PLUGINS = [ { name: "Plugins", path: Path.Plugins }, { name: "Stable Diffusion", path: Path.Sd }, diff --git a/app/layout.tsx b/app/layout.tsx index 7d14cb88d70..68a9a663932 100644 --- a/app/layout.tsx +++ b/app/layout.tsx @@ -10,10 +10,10 @@ import { GoogleTagManager, GoogleAnalytics } from "@next/third-parties/google"; const serverConfig = getServerSideConfig(); export const metadata: Metadata = { - title: "NextChat", - description: "Your personal ChatGPT Chat Bot.", + title: "RevoChat", + description: "Your personal Revo Chat Bot.", appleWebApp: { - title: "NextChat", + title: "RevoChat", statusBarStyle: "default", }, }; diff --git a/app/locales/en.ts b/app/locales/en.ts index fddb6f09153..e3e2ec1c392 100644 --- a/app/locales/en.ts +++ b/app/locales/en.ts @@ -10,10 +10,8 @@ const en: LocaleType = { Error: { Unauthorized: isApp ? `😆 Oops, there's an issue. No worries: - \\ 1️⃣ New here? [Click to start chatting now 🚀](${SAAS_CHAT_UTM_URL}) \\ 2️⃣ Want to use your own OpenAI resources? [Click here](/#/settings) to change settings ⚙️` : `😆 Oops, there's an issue. Let's fix it: - \ 1️⃣ New here? [Click to start chatting now 🚀](${SAAS_CHAT_UTM_URL}) \ 2️⃣ Using a private setup? [Click here](/#/auth) to enter your key 🔑 \ 3️⃣ Want to use your own OpenAI resources? [Click here](/#/settings) to change settings ⚙️ `, @@ -28,7 +26,7 @@ const en: LocaleType = { Later: "Later", SaasTips: "Too Complex, Use Immediately Now", TopTips: - "🥳 NextChat AI launch promotion: Instantly unlock the latest models like OpenAI o1, GPT-4o, Claude-3.5!", + "🥳 RevoChat AI launch promotion: Instantly unlock the latest models like OpenAI o1, GPT-4o, Claude-3.5!", }, ChatItem: { ChatItemCount: (count: number) => `${count} messages`, @@ -314,10 +312,10 @@ const en: LocaleType = { }, Access: { SaasStart: { - Title: "Use NextChat AI", + Title: "Use RevoChat AI", Label: " (Most Cost-Effective Option)", SubTitle: - "Maintained by NextChat, zero setup needed, unlock OpenAI o1, GPT-4o," + + "Maintained by RevoChat, zero setup needed, unlock OpenAI o1, GPT-4o," + " Claude-3.5 and more", ChatNow: "Start Now", }, diff --git a/app/store/update.ts b/app/store/update.ts index 327dc5e88f9..e93fac6edce 100644 --- a/app/store/update.ts +++ b/app/store/update.ts @@ -105,7 +105,7 @@ export const useUpdateStore = createPersistStore( if (version === remoteId) { // Show a notification using Tauri window.__TAURI__?.notification.sendNotification({ - title: "NextChat", + title: "RevoChat", body: `${Locale.Settings.Update.IsLatest}`, icon: `${ChatGptIcon.src}`, sound: "Default", @@ -115,7 +115,7 @@ export const useUpdateStore = createPersistStore( Locale.Settings.Update.FoundUpdate(`${remoteId}`); // Show a notification for the new version using Tauri window.__TAURI__?.notification.sendNotification({ - title: "NextChat", + title: "RevoChat", body: updateMessage, icon: `${ChatGptIcon.src}`, sound: "Default", diff --git a/app/utils.ts b/app/utils.ts index 1c359ef9508..b121e660ecd 100644 --- a/app/utils.ts +++ b/app/utils.ts @@ -19,27 +19,32 @@ export function trimTopic(topic: string) { } export async function copyToClipboard(text: string) { + const trimmedText = text.trim(); // Ensure no extra spaces or newlines + try { if (window.__TAURI__) { - window.__TAURI__.writeText(text); + await window.__TAURI__.writeText(trimmedText); } else { - await navigator.clipboard.writeText(text); + await navigator.clipboard.writeText(trimmedText); } showToast(Locale.Copy.Success); } catch (error) { const textArea = document.createElement("textarea"); - textArea.value = text; + textArea.style.position = 'fixed'; // Avoid scrolling to the bottom + textArea.style.opacity = '0'; // Hide the textarea + textArea.value = trimmedText; document.body.appendChild(textArea); - textArea.focus(); textArea.select(); + try { document.execCommand("copy"); showToast(Locale.Copy.Success); } catch (error) { showToast(Locale.Copy.Failed); + } finally { + document.body.removeChild(textArea); } - document.body.removeChild(textArea); } } @@ -260,6 +265,8 @@ export function isVisionModel(model: string) { "gpt-4o", "claude-3", "gemini-1.5", + "gemini-exp", + "learnlm", "qwen-vl", "qwen2-vl", ]; diff --git a/public/site.webmanifest b/public/site.webmanifest index cf77f68e4f1..7beb5152286 100644 --- a/public/site.webmanifest +++ b/public/site.webmanifest @@ -1,6 +1,6 @@ { - "name": "NextChat", - "short_name": "NextChat", + "name": "RevoChat", + "short_name": "RevoChat", "icons": [ { "src": "/android-chrome-192x192.png", diff --git a/src-tauri/Cargo.lock b/src-tauri/Cargo.lock index c9baffc0acc..0ec31a668c0 100644 --- a/src-tauri/Cargo.lock +++ b/src-tauri/Cargo.lock @@ -1983,7 +1983,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e4a24736216ec316047a1fc4252e27dabb04218aa4a3f37c6e7ddbf1f9782b54" [[package]] -name = "nextchat" +name = "revochat" version = "0.1.0" dependencies = [ "bytes", diff --git a/src-tauri/Cargo.toml b/src-tauri/Cargo.toml index 8a11c3b6f98..2e3a25a0e93 100644 --- a/src-tauri/Cargo.toml +++ b/src-tauri/Cargo.toml @@ -1,11 +1,11 @@ [package] -name = "nextchat" +name = "revochat" version = "0.1.0" description = "A cross platform app for LLM ChatBot." authors = ["Yidadaa"] license = "mit" repository = "" -default-run = "nextchat" +default-run = "revochat" edition = "2021" rust-version = "1.60" diff --git a/src-tauri/tauri.conf.json b/src-tauri/tauri.conf.json index 8f5dd4ab3da..1dd26e5c95a 100644 --- a/src-tauri/tauri.conf.json +++ b/src-tauri/tauri.conf.json @@ -8,7 +8,7 @@ "withGlobalTauri": true }, "package": { - "productName": "NextChat", + "productName": "revochat", "version": "2.15.8" }, "tauri": { @@ -73,7 +73,7 @@ "icons/icon.ico" ], "identifier": "com.yida.chatgpt.next.web", - "longDescription": "NextChat is a cross-platform ChatGPT client, including Web/Win/Linux/OSX/PWA.", + "longDescription": "RevoChat is a cross-platform ChatGPT client, including Web/Win/Linux/OSX/PWA.", "macOS": { "entitlements": null, "exceptionDomain": "", @@ -82,7 +82,7 @@ "signingIdentity": null }, "resources": [], - "shortDescription": "NextChat App", + "shortDescription": "RevoChat App", "targets": "all", "windows": { "certificateThumbprint": null, @@ -110,7 +110,7 @@ "fullscreen": false, "height": 600, "resizable": true, - "title": "NextChat", + "title": "RevoChat", "width": 960, "hiddenTitle": true, "titleBarStyle": "Overlay"