mirror of
https://github.com/labring/FastGPT.git
synced 2025-07-24 13:53:50 +00:00
perf: avatar
This commit is contained in:
@@ -21,7 +21,7 @@
|
|||||||
| 文件拆分 | 0.025 |
|
| 文件拆分 | 0.025 |
|
||||||
|
|
||||||
**其他问题**
|
**其他问题**
|
||||||
请 WX 联系: fastgpt123
|
请 WX 联系: YNyiqi
|
||||||
| 交流群 | 小助手 |
|
| 交流群 | 小助手 |
|
||||||
| ----------------------- | -------------------- |
|
| ----------------------- | -------------------- |
|
||||||
|  |  |
|
|  |  |
|
||||||
|
@@ -27,7 +27,7 @@ FastGpt 项目完全开源,可随意私有化部署,去除平台风险忧虑
|
|||||||
### 交流群/问题反馈
|
### 交流群/问题反馈
|
||||||
|
|
||||||
如果群满了,可加个小助手,定时拉
|
如果群满了,可加个小助手,定时拉
|
||||||
wx 号: fastgpt123
|
wx 号: YNyiqi
|
||||||
|
|
||||||
| 交流群 | 小助手 |
|
| 交流群 | 小助手 |
|
||||||
| ------------------------------------------------- | ---------------------------------------------- |
|
| ------------------------------------------------- | ---------------------------------------------- |
|
||||||
|
@@ -1,4 +1,10 @@
|
|||||||
### Fast GPT V3.8
|
### Fast GPT V3.8.1
|
||||||
|
|
||||||
- 新增 - 知识库引用反馈。
|
1. 新增 - 自定义历史记录标题。
|
||||||
- 新增 - 知识库与 AI 助手对多对关系,一个知识库可以被多个 AI 助手关联,一个 AI 助手可以关联多个知识库。
|
2. 新增 - 置顶历史记录。
|
||||||
|
3. 新增 - 自动置顶最近聊天的模型。
|
||||||
|
4. 优化 - 索引和 QA 队列,支持多节点和并发(目前线上大概 2500 条/分钟)
|
||||||
|
5. 优化 - 随机任务,不再按线性等待。
|
||||||
|
6. 优化 - 内容分段导入和进度查看,不再担心大文件无法导入
|
||||||
|
7. 优化 - 导出的 csv 大小。最大支持 100M 导出。
|
||||||
|
8. 知识库数量说明,由于线上数据太多,没法创建索引,所以目前如果超过 5w 组数据,大概率会失败。
|
||||||
|
Binary file not shown.
Before Width: | Height: | Size: 56 KiB After Width: | Height: | Size: 52 KiB |
1
src/api/response/chat.d.ts
vendored
1
src/api/response/chat.d.ts
vendored
@@ -16,6 +16,7 @@ export interface InitChatResponse {
|
|||||||
|
|
||||||
export interface InitShareChatResponse {
|
export interface InitShareChatResponse {
|
||||||
maxContext: number;
|
maxContext: number;
|
||||||
|
userAvatar: string;
|
||||||
model: {
|
model: {
|
||||||
name: string;
|
name: string;
|
||||||
avatar: string;
|
avatar: string;
|
||||||
|
@@ -1,16 +1,19 @@
|
|||||||
import React from 'react';
|
import React from 'react';
|
||||||
import { Image } from '@chakra-ui/react';
|
import { Image } from '@chakra-ui/react';
|
||||||
import type { ImageProps } from '@chakra-ui/react';
|
import type { ImageProps } from '@chakra-ui/react';
|
||||||
|
import { LOGO_ICON } from '@/constants/chat';
|
||||||
|
|
||||||
const Avatar = ({ w = '30px', ...props }: ImageProps) => {
|
const Avatar = ({ w = '30px', ...props }: ImageProps) => {
|
||||||
|
console.log(props.src);
|
||||||
return (
|
return (
|
||||||
<Image
|
<Image
|
||||||
fallbackSrc="/icon/logo.png"
|
fallbackSrc={LOGO_ICON}
|
||||||
borderRadius={'50%'}
|
borderRadius={'50%'}
|
||||||
objectFit={'cover'}
|
objectFit={'cover'}
|
||||||
alt=""
|
alt=""
|
||||||
w={w}
|
w={w}
|
||||||
h={w}
|
h={w}
|
||||||
|
p={'1px'}
|
||||||
{...props}
|
{...props}
|
||||||
/>
|
/>
|
||||||
);
|
);
|
||||||
|
@@ -5,6 +5,7 @@ import MyIcon from '../Icon';
|
|||||||
import { useUserStore } from '@/store/user';
|
import { useUserStore } from '@/store/user';
|
||||||
import { useChatStore } from '@/store/chat';
|
import { useChatStore } from '@/store/chat';
|
||||||
import Avatar from '../Avatar';
|
import Avatar from '../Avatar';
|
||||||
|
import { HUMAN_ICON } from '@/constants/chat';
|
||||||
|
|
||||||
export enum NavbarTypeEnum {
|
export enum NavbarTypeEnum {
|
||||||
normal = 'normal',
|
normal = 'normal',
|
||||||
@@ -83,7 +84,7 @@ const Navbar = () => {
|
|||||||
cursor={'pointer'}
|
cursor={'pointer'}
|
||||||
onClick={() => router.push('/number')}
|
onClick={() => router.push('/number')}
|
||||||
>
|
>
|
||||||
<Avatar w={'36px'} h={'36px'} src={userInfo?.avatar} fallbackSrc={'/icon/human.png'} />
|
<Avatar w={'36px'} h={'36px'} src={userInfo?.avatar} fallbackSrc={HUMAN_ICON} />
|
||||||
</Box>
|
</Box>
|
||||||
{/* 导航列表 */}
|
{/* 导航列表 */}
|
||||||
<Box flex={1}>
|
<Box flex={1}>
|
||||||
|
@@ -31,7 +31,7 @@ const WxConcat = ({ onClose }: { onClose: () => void }) => {
|
|||||||
<Box mt={2}>
|
<Box mt={2}>
|
||||||
微信号:
|
微信号:
|
||||||
<Box as={'span'} userSelect={'all'}>
|
<Box as={'span'} userSelect={'all'}>
|
||||||
fastgpt123
|
YNyiqi
|
||||||
</Box>
|
</Box>
|
||||||
</Box>
|
</Box>
|
||||||
</ModalBody>
|
</ModalBody>
|
||||||
|
File diff suppressed because one or more lines are too long
@@ -1,9 +1,10 @@
|
|||||||
import type { NextApiRequest, NextApiResponse } from 'next';
|
import type { NextApiRequest, NextApiResponse } from 'next';
|
||||||
import { jsonRes } from '@/service/response';
|
import { jsonRes } from '@/service/response';
|
||||||
import { connectToDatabase, ShareChat } from '@/service/mongo';
|
import { connectToDatabase, ShareChat, User } from '@/service/mongo';
|
||||||
import type { InitShareChatResponse } from '@/api/response/chat';
|
import type { InitShareChatResponse } from '@/api/response/chat';
|
||||||
import { authModel } from '@/service/utils/auth';
|
import { authModel } from '@/service/utils/auth';
|
||||||
import { hashPassword } from '@/service/utils/tools';
|
import { hashPassword } from '@/service/utils/tools';
|
||||||
|
import { HUMAN_ICON } from '@/constants/chat';
|
||||||
|
|
||||||
/* 初始化我的聊天框,需要身份验证 */
|
/* 初始化我的聊天框,需要身份验证 */
|
||||||
export default async function handler(req: NextApiRequest, res: NextApiResponse) {
|
export default async function handler(req: NextApiRequest, res: NextApiResponse) {
|
||||||
@@ -40,9 +41,12 @@ export default async function handler(req: NextApiRequest, res: NextApiResponse)
|
|||||||
authOwner: false
|
authOwner: false
|
||||||
});
|
});
|
||||||
|
|
||||||
|
const user = await User.findById(shareChat.userId, 'avatar');
|
||||||
|
|
||||||
jsonRes<InitShareChatResponse>(res, {
|
jsonRes<InitShareChatResponse>(res, {
|
||||||
data: {
|
data: {
|
||||||
maxContext: shareChat.maxContext,
|
maxContext: shareChat.maxContext,
|
||||||
|
userAvatar: user?.avatar || HUMAN_ICON,
|
||||||
model: {
|
model: {
|
||||||
name: model.name,
|
name: model.name,
|
||||||
avatar: model.avatar,
|
avatar: model.avatar,
|
||||||
|
@@ -2,7 +2,6 @@ import React from 'react';
|
|||||||
import { Card, Box, Flex } from '@chakra-ui/react';
|
import { Card, Box, Flex } from '@chakra-ui/react';
|
||||||
import { useMarkdown } from '@/hooks/useMarkdown';
|
import { useMarkdown } from '@/hooks/useMarkdown';
|
||||||
import Markdown from '@/components/Markdown';
|
import Markdown from '@/components/Markdown';
|
||||||
import { LOGO_ICON } from '@/constants/chat';
|
|
||||||
import Avatar from '@/components/Avatar';
|
import Avatar from '@/components/Avatar';
|
||||||
|
|
||||||
const Empty = ({
|
const Empty = ({
|
||||||
|
@@ -36,7 +36,6 @@ import { streamFetch } from '@/api/fetch';
|
|||||||
import MyIcon from '@/components/Icon';
|
import MyIcon from '@/components/Icon';
|
||||||
import { throttle } from 'lodash';
|
import { throttle } from 'lodash';
|
||||||
import { Types } from 'mongoose';
|
import { Types } from 'mongoose';
|
||||||
import { LOGO_ICON } from '@/constants/chat';
|
|
||||||
import { ChatModelMap } from '@/constants/model';
|
import { ChatModelMap } from '@/constants/model';
|
||||||
import { useChatStore } from '@/store/chat';
|
import { useChatStore } from '@/store/chat';
|
||||||
import { useLoading } from '@/hooks/useLoading';
|
import { useLoading } from '@/hooks/useLoading';
|
||||||
@@ -49,6 +48,7 @@ import SideBar from '@/components/SideBar';
|
|||||||
import Avatar from '@/components/Avatar';
|
import Avatar from '@/components/Avatar';
|
||||||
import Empty from './components/Empty';
|
import Empty from './components/Empty';
|
||||||
import QuoteModal from './components/QuoteModal';
|
import QuoteModal from './components/QuoteModal';
|
||||||
|
import { HUMAN_ICON } from '@/constants/chat';
|
||||||
|
|
||||||
const PhoneSliderBar = dynamic(() => import('./components/PhoneSliderBar'), {
|
const PhoneSliderBar = dynamic(() => import('./components/PhoneSliderBar'), {
|
||||||
ssr: false
|
ssr: false
|
||||||
@@ -713,8 +713,8 @@ const Chat = ({ modelId, chatId }: { modelId: string; chatId: string }) => {
|
|||||||
className="avatar"
|
className="avatar"
|
||||||
src={
|
src={
|
||||||
item.obj === 'Human'
|
item.obj === 'Human'
|
||||||
? userInfo?.avatar || '/icon/human.png'
|
? userInfo?.avatar || HUMAN_ICON
|
||||||
: chatData.model.avatar || LOGO_ICON
|
: chatData.model.avatar
|
||||||
}
|
}
|
||||||
w={['20px', '34px']}
|
w={['20px', '34px']}
|
||||||
h={['20px', '34px']}
|
h={['20px', '34px']}
|
||||||
|
@@ -38,7 +38,6 @@ import { streamFetch } from '@/api/fetch';
|
|||||||
import MyIcon from '@/components/Icon';
|
import MyIcon from '@/components/Icon';
|
||||||
import { throttle } from 'lodash';
|
import { throttle } from 'lodash';
|
||||||
import { Types } from 'mongoose';
|
import { Types } from 'mongoose';
|
||||||
import { LOGO_ICON } from '@/constants/chat';
|
|
||||||
import { useChatStore } from '@/store/chat';
|
import { useChatStore } from '@/store/chat';
|
||||||
import { useLoading } from '@/hooks/useLoading';
|
import { useLoading } from '@/hooks/useLoading';
|
||||||
import { fileDownload } from '@/utils/file';
|
import { fileDownload } from '@/utils/file';
|
||||||
@@ -49,6 +48,7 @@ import Markdown from '@/components/Markdown';
|
|||||||
import SideBar from '@/components/SideBar';
|
import SideBar from '@/components/SideBar';
|
||||||
import Avatar from '@/components/Avatar';
|
import Avatar from '@/components/Avatar';
|
||||||
import Empty from './components/Empty';
|
import Empty from './components/Empty';
|
||||||
|
import { HUMAN_ICON } from '@/constants/chat';
|
||||||
|
|
||||||
const ShareHistory = dynamic(() => import('./components/ShareHistory'), {
|
const ShareHistory = dynamic(() => import('./components/ShareHistory'), {
|
||||||
loading: () => <Loading fixed={false} />,
|
loading: () => <Loading fixed={false} />,
|
||||||
@@ -101,7 +101,6 @@ const Chat = ({ shareId, historyId }: { shareId: string; historyId: string }) =>
|
|||||||
const { copyData } = useCopyData();
|
const { copyData } = useCopyData();
|
||||||
const { isPc } = useGlobalStore();
|
const { isPc } = useGlobalStore();
|
||||||
const { Loading, setIsLoading } = useLoading();
|
const { Loading, setIsLoading } = useLoading();
|
||||||
const { userInfo } = useUserStore();
|
|
||||||
const { isOpen: isOpenSlider, onClose: onCloseSlider, onOpen: onOpenSlider } = useDisclosure();
|
const { isOpen: isOpenSlider, onClose: onCloseSlider, onOpen: onOpenSlider } = useDisclosure();
|
||||||
const {
|
const {
|
||||||
isOpen: isOpenPassword,
|
isOpen: isOpenPassword,
|
||||||
@@ -628,8 +627,8 @@ const Chat = ({ shareId, historyId }: { shareId: string; historyId: string }) =>
|
|||||||
<Avatar
|
<Avatar
|
||||||
src={
|
src={
|
||||||
item.obj === 'Human'
|
item.obj === 'Human'
|
||||||
? userInfo?.avatar || '/icon/human.png'
|
? shareChatData.userAvatar || HUMAN_ICON
|
||||||
: shareChatData.model.avatar || LOGO_ICON
|
: shareChatData.model.avatar
|
||||||
}
|
}
|
||||||
w={['20px', '34px']}
|
w={['20px', '34px']}
|
||||||
h={['20px', '34px']}
|
h={['20px', '34px']}
|
||||||
|
@@ -2,6 +2,7 @@ import { Schema, model, models, Model } from 'mongoose';
|
|||||||
import { hashPassword } from '@/service/utils/tools';
|
import { hashPassword } from '@/service/utils/tools';
|
||||||
import { PRICE_SCALE } from '@/constants/common';
|
import { PRICE_SCALE } from '@/constants/common';
|
||||||
import { UserModelSchema } from '@/types/mongoSchema';
|
import { UserModelSchema } from '@/types/mongoSchema';
|
||||||
|
|
||||||
const UserSchema = new Schema({
|
const UserSchema = new Schema({
|
||||||
username: {
|
username: {
|
||||||
// 可以是手机/邮箱,新的验证都只用手机
|
// 可以是手机/邮箱,新的验证都只用手机
|
||||||
|
@@ -11,6 +11,7 @@ import {
|
|||||||
ShareChatType
|
ShareChatType
|
||||||
} from '@/types/chat';
|
} from '@/types/chat';
|
||||||
import { getChatHistory } from '@/api/chat';
|
import { getChatHistory } from '@/api/chat';
|
||||||
|
import { HUMAN_ICON } from '@/constants/chat';
|
||||||
|
|
||||||
type SetShareChatHistoryItem = {
|
type SetShareChatHistoryItem = {
|
||||||
historyId: string;
|
historyId: string;
|
||||||
@@ -57,6 +58,7 @@ const defaultChatData = {
|
|||||||
};
|
};
|
||||||
const defaultShareChatData: ShareChatType = {
|
const defaultShareChatData: ShareChatType = {
|
||||||
maxContext: 5,
|
maxContext: 5,
|
||||||
|
userAvatar: HUMAN_ICON,
|
||||||
model: {
|
model: {
|
||||||
name: '',
|
name: '',
|
||||||
avatar: '/icon/logo.png',
|
avatar: '/icon/logo.png',
|
||||||
|
Reference in New Issue
Block a user