diff --git a/app/SyncOnFirstLoad.tsx b/app/SyncOnFirstLoad.tsx new file mode 100644 index 000000000..1cf466c5f --- /dev/null +++ b/app/SyncOnFirstLoad.tsx @@ -0,0 +1,15 @@ +"use client"; +import { useEffect } from "react"; +import { useSyncStore } from "./store/sync"; + +export default function SyncOnFirstLoad() { + const syncStore = useSyncStore(); + + useEffect(() => { + if (syncStore.lastSyncTime === 0) { + syncStore.sync(); + } + }, []); + + return null; +} diff --git a/app/api/common.ts b/app/api/common.ts index b7e41fa26..f814a344e 100644 --- a/app/api/common.ts +++ b/app/api/common.ts @@ -32,6 +32,8 @@ export async function requestOpenai(req: NextRequest) { let baseUrl = (isAzure ? serverConfig.azureUrl : serverConfig.baseUrl) || OPENAI_BASE_URL; + // console.log("[Base Url]", baseUrl); + if (!baseUrl.startsWith("http")) { baseUrl = `https://${baseUrl}`; } diff --git a/app/client/platforms/alibaba.ts b/app/client/platforms/alibaba.ts index a9f335d75..c6c1d2aeb 100644 --- a/app/client/platforms/alibaba.ts +++ b/app/client/platforms/alibaba.ts @@ -204,9 +204,9 @@ export class QwenApi implements LLMApi { // Accumulate and render result as it streams onUpdate: (() => { let accumulated = ""; - return (chunk: string) => { + return (chunk: string, fetchText?: string) => { accumulated += chunk; - options.onUpdate?.(accumulated, chunk); + options.onUpdate?.(accumulated, fetchText ?? ""); }; })(), onFinish: (final: string, res: any) => { diff --git a/app/components/chat.module.scss b/app/components/chat.module.scss index 7560d0305..a99ca0bdc 100644 --- a/app/components/chat.module.scss +++ b/app/components/chat.module.scss @@ -357,6 +357,7 @@ font-size: 12px; color: var(--black); margin-left: 6px; + display: none; } } diff --git a/app/components/chat.tsx b/app/components/chat.tsx index 6691403e6..97c6d8071 100644 --- a/app/components/chat.tsx +++ b/app/components/chat.tsx @@ -1330,18 +1330,32 @@ function _Chat() { } } + // Sử dụng useMemo để tạo mảng context chứa các tin nhắn ngữ cảnh (context messages) của phiên chat hiện tại. + // Nếu mask được thiết lập ẩn context (hideContext), trả về mảng rỗng. + // Ngược lại, sao chép các tin nhắn context từ session.mask.context. const context: RenderMessage[] = useMemo(() => { return session.mask.hideContext ? [] : session.mask.context.slice(); }, [session.mask.context, session.mask.hideContext]); + // Nếu không có tin nhắn context nào (context.length === 0) + // và tin nhắn đầu tiên của session không phải là lời chào mặc định của bot (BOT_HELLO), + // thì thêm tin nhắn chào mặc định của bot vào context. + // Nếu người dùng chưa đăng nhập (không có quyền truy cập), thay nội dung lời chào bằng thông báo lỗi chưa đăng nhập. if ( context.length === 0 && session.messages.at(0)?.content !== BOT_HELLO.content ) { + // sao chép lời chào mặc định của bot + const copiedHello = Object.assign({}, BOT_HELLO); + + // nếu người dùng chưa đăng nhập, thay nội dung lời chào bằng thông báo lỗi chưa đăng nhập if (!accessStore.isAuthorized()) { copiedHello.content = Locale.Error.Unauthorized; } + // thêm lời chào vào context + // để hiển thị lời chào này trong giao diện chat + // như là một phần của ngữ cảnh cuộc trò chuyện context.push(copiedHello); } diff --git a/app/components/emoji.tsx b/app/components/emoji.tsx index 31d7f0ac6..0599023b0 100644 --- a/app/components/emoji.tsx +++ b/app/components/emoji.tsx @@ -6,8 +6,11 @@ import EmojiPicker, { import { ModelType } from "../store"; -import BotIconDefault from "../icons/llm-icons/default.svg"; -import BotIconOpenAI from "../icons/llm-icons/openai.svg"; +// import BotIconDefault from "../icons/llm-icons/chebichat.svg"; + +import BotIconDefault from "../icons/llm-icons/chebichat.svg"; + +import BotIconOpenAI from "../icons/llm-icons/chebichat.svg"; import BotIconGemini from "../icons/llm-icons/gemini.svg"; import BotIconGemma from "../icons/llm-icons/gemma.svg"; import BotIconClaude from "../icons/llm-icons/claude.svg"; @@ -15,7 +18,10 @@ import BotIconMeta from "../icons/llm-icons/meta.svg"; import BotIconMistral from "../icons/llm-icons/mistral.svg"; import BotIconDeepseek from "../icons/llm-icons/deepseek.svg"; import BotIconMoonshot from "../icons/llm-icons/moonshot.svg"; -import BotIconQwen from "../icons/llm-icons/qwen.svg"; + +// thay bang chebichat +import BotIconQwen from "../icons/llm-icons/chebichat.svg"; + import BotIconWenxin from "../icons/llm-icons/wenxin.svg"; import BotIconGrok from "../icons/llm-icons/grok.svg"; import BotIconHunyuan from "../icons/llm-icons/hunyuan.svg"; @@ -68,7 +74,10 @@ export function Avatar(props: { model?: ModelType; avatar?: string }) { LlmIcon = BotIconClaude; } else if (modelName.includes("llama")) { LlmIcon = BotIconMeta; - } else if (modelName.startsWith("mixtral") || modelName.startsWith("codestral")) { + } else if ( + modelName.startsWith("mixtral") || + modelName.startsWith("codestral") + ) { LlmIcon = BotIconMistral; } else if (modelName.includes("deepseek")) { LlmIcon = BotIconDeepseek; @@ -93,15 +102,15 @@ export function Avatar(props: { model?: ModelType; avatar?: string }) { } return ( -