diff --git a/CHANGELOG.md b/CHANGELOG.md index 09520a6866c8..8841b5f06a0b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,48 @@ # Changelog +### [Version 1.20.4](https://github.com/lobehub/lobe-chat/compare/v1.20.3...v1.20.4) + +Released on **2024-09-28** + +
+ +
+Improvements and Fixes + +
+ +
+ +[![](https://img.shields.io/badge/-BACK_TO_TOP-151515?style=flat-square)](#readme-top) + +
+ +### [Version 1.20.3](https://github.com/lobehub/lobe-chat/compare/v1.20.2...v1.20.3) + +Released on **2024-09-28** + +#### 🐛 Bug Fixes + +- **misc**: Improve delete orphan chunks when delete files. + +
+ +
+Improvements and Fixes + +#### What's fixed + +- **misc**: Improve delete orphan chunks when delete files, closes [#4179](https://github.com/lobehub/lobe-chat/issues/4179) ([f3e0ffe](https://github.com/lobehub/lobe-chat/commit/f3e0ffe)) + +
+ +
+ +[![](https://img.shields.io/badge/-BACK_TO_TOP-151515?style=flat-square)](#readme-top) + +
+ ### [Version 1.20.2](https://github.com/lobehub/lobe-chat/compare/v1.20.1...v1.20.2) Released on **2024-09-27** diff --git a/docker-compose/local/zitadel/.env.example b/docker-compose/local/zitadel/.env.example new file mode 100644 index 000000000000..deda97524b7d --- /dev/null +++ b/docker-compose/local/zitadel/.env.example @@ -0,0 +1,33 @@ +# Required: LobeChat domain for tRPC calls +# Ensure this domain is whitelisted in your NextAuth providers and S3 service CORS settings +APP_URL=http://localhost:3210 + +# Postgres related environment variables +# Required: Secret key for encrypting sensitive information. Generate with: openssl rand -base64 32 +KEY_VAULTS_SECRET=Kix2wcUONd4CX51E/ZPAd36BqM4wzJgKjPtz2sGztqQ= +# Required: Postgres database connection string +DATABASE_URL=postgresql://postgres:uWNZugjBqixf8dxC@postgresql:5432/lobechat + +# NEXT_AUTH related environment variables +NEXTAUTH_URL=http://localhost:3210/api/auth +NEXT_AUTH_SECRET=NX2kaPE923dt6BL2U8e9oSre5RfoT7hg +NEXT_AUTH_SSO_PROVIDERS=zitadel +# ZiTADEL provider configuration +# Please refer to:https://lobehub.com/zh/docs/self-hosting/advanced/auth/next-auth/zitadel +AUTH_ZITADEL_ID=285945938244075523 +AUTH_ZITADEL_SECRET=hkbtzHLaCEIeHeFThym14UcydpmQiEB5JtAX08HSqSoJxhAlVVkyovTuNUZ5TNrT +AUTH_ZITADEL_ISSUER=http://localhost:8080 + +# MinIO S3 configuration +S3_ACCESS_KEY_ID= +S3_SECRET_ACCESS_KEY= +S3_ENDPOINT=http://localhost:9000 +S3_BUCKET=lobe +S3_PUBLIC_DOMAIN=http://localhost:9000 +S3_ENABLE_PATH_STYLE=1 +LLM_VISION_IMAGE_USE_BASE64=1 + +# Other environment variables, as needed. You can refer to the environment variables configuration for the client version, making sure not to have ACCESS_CODE. +# OPENAI_API_KEY=sk-xxxx +# OPENAI_PROXY_URL=https://api.openai.com/v1 +# OPENAI_MODEL_LIST=... diff --git a/docker-compose/local/zitadel/.env.zh-CN.example b/docker-compose/local/zitadel/.env.zh-CN.example new file mode 100644 index 000000000000..ce7316f3073f --- /dev/null +++ b/docker-compose/local/zitadel/.env.zh-CN.example @@ -0,0 +1,32 @@ +# LobeChat 域名 +APP_URL=http://localhost:3210 + +# Postgres 相关,也即 DB 必须的环境变量 +# 用于加密敏感信息的密钥,可以使用 openssl rand -base64 32 生成 +KEY_VAULTS_SECRET=Kix2wcUONd4CX51E/ZPAd36BqM4wzJgKjPtz2sGztqQ= +# Postgres 数据库连接字符串 +DATABASE_URL=postgresql://postgres:uWNZugjBqixf8dxC@postgresql:5432/lobechat + +# NEXT_AUTH 相关 +NEXTAUTH_URL=http://localhost:3210/api/auth +NEXT_AUTH_SECRET=NX2kaPE923dt6BL2U8e9oSre5RfoT7hg +NEXT_AUTH_SSO_PROVIDERS=zitadel +# ZiTADEL 鉴权服务提供商部分 +# 请参考:https://lobehub.com/zh/docs/self-hosting/advanced/auth/next-auth/zitadel +AUTH_ZITADEL_ID=285945938244075523 +AUTH_ZITADEL_SECRET=hkbtzHLaCEIeHeFThym14UcydpmQiEB5JtAX08HSqSoJxhAlVVkyovTuNUZ5TNrT +AUTH_ZITADEL_ISSUER=http://localhost:8080 + +# MinIO S3 配置 +S3_ACCESS_KEY_ID= +S3_SECRET_ACCESS_KEY= +S3_ENDPOINT=http://localhost:9000 +S3_BUCKET=lobe +S3_PUBLIC_DOMAIN=http://localhost:9000 +S3_ENABLE_PATH_STYLE=1 +LLM_VISION_IMAGE_USE_BASE64=1 + +# 其他环境变量,视需求而定,可以参照客户端版本的环境变量配置,注意不要有 ACCESS_CODE +# OPENAI_API_KEY=sk-xxxx +# OPENAI_PROXY_URL=https://api.openai.com/v1 +# OPENAI_MODEL_LIST=... diff --git a/docker-compose/local/zitadel/docker-compose.yml b/docker-compose/local/zitadel/docker-compose.yml new file mode 100644 index 000000000000..8f3cf8c4b44b --- /dev/null +++ b/docker-compose/local/zitadel/docker-compose.yml @@ -0,0 +1,86 @@ +services: + network-service: + image: alpine + container_name: lobe-network + ports: + - '9000:9000' # MinIO API + - '9001:9001' # MinIO Console + - '8080:8080' # Zitadel Console + - '3210:3210' # LobeChat + command: tail -f /dev/null + networks: + - lobe-network + + postgresql: + image: pgvector/pgvector:pg16 + container_name: lobe-postgres + ports: + - "5432:5432" + volumes: + - './data:/var/lib/postgresql/data' + environment: + - 'POSTGRES_DB=lobechat' + - 'POSTGRES_PASSWORD=uWNZugjBqixf8dxC' + healthcheck: + test: ['CMD-SHELL', 'pg_isready -U postgres'] + interval: 5s + timeout: 5s + retries: 5 + restart: always + networks: + - lobe-network + + minio: + image: minio/minio + container_name: lobe-minio + network_mode: 'service:network-service' + volumes: + - './s3_data:/etc/minio/data' + environment: + - 'MINIO_ROOT_USER=YOUR_MINIO_USER' + - 'MINIO_ROOT_PASSWORD=YOUR_MINIO_PASSWORD' + - 'MINIO_API_CORS_ALLOW_ORIGIN=http://localhost:3210' + restart: always + command: > + server /etc/minio/data --address ":9000" --console-address ":9001" + + zitadel: + restart: 'always' + image: 'ghcr.io/zitadel/zitadel:latest' + container_name: lobe-zitadel + network_mode: 'service:network-service' + command: start-from-init --config /zitadel-config.yaml --steps + /zitadel-init-steps.yaml --masterkey "cft3Tekr/rQBOqwoQSCPoncA9BHbn7QJ" + --tlsMode disabled #MasterkeyNeedsToHave32Characters + volumes: + - ./zitadel-config.yaml:/zitadel-config.yaml:ro + - ./zitadel-init-steps.yaml:/zitadel-init-steps.yaml:ro + depends_on: + postgresql: + condition: service_healthy + + lobe: + image: lobehub/lobe-chat-database + container_name: lobe-database + network_mode: 'service:network-service' + depends_on: + postgresql: + condition: service_healthy + network-service: + condition: service_started + minio: + condition: service_started + zitadel: + condition: service_started + env_file: + - .env + restart: always + +volumes: + data: + driver: local + s3_data: + driver: local +networks: + lobe-network: + driver: bridge diff --git a/docker-compose/local/zitadel/zitadel-config.yaml b/docker-compose/local/zitadel/zitadel-config.yaml new file mode 100644 index 000000000000..f84a33182b2f --- /dev/null +++ b/docker-compose/local/zitadel/zitadel-config.yaml @@ -0,0 +1,26 @@ +Log: + Level: 'info' + +Port: 8080 +ExternalPort: 8080 +ExternalDomain: localhost +ExternalSecure: false +TLS: + Enabled: false + +# If not using the docker compose example, adjust these values for connecting ZITADEL to your PostgreSQL +Database: + postgres: + Host: postgresql + Port: 5432 + Database: zitadel + User: + Username: 'zitadel' + Password: 'zitadel' + SSL: + Mode: 'disable' + Admin: + Username: 'postgres' + Password: 'uWNZugjBqixf8dxC' #postgres password + SSL: + Mode: 'disable' diff --git a/docker-compose/local/zitadel/zitadel-init-steps.yaml b/docker-compose/local/zitadel/zitadel-init-steps.yaml new file mode 100644 index 000000000000..9e24208522b5 --- /dev/null +++ b/docker-compose/local/zitadel/zitadel-init-steps.yaml @@ -0,0 +1,11 @@ +# All possible options and their defaults: https://github.com/zitadel/zitadel/blob/main/cmd/setup/steps.yaml +FirstInstance: + Org: + Human: + # use the loginname root@zitadel.localhost + Username: 'root' + # The password must be 8 characters or more and must contain uppercase letters, lowercase letters, symbols, and numbers. The first login will require a password change. + Password: 'Password1!' + Email: + # Optional, if set, can be used to log in with email. + Address: 'example@zitadel.com' # ZITADEL_FIRSTINSTANCE_ORG_HUMAN_EMAIL_ADDRESS diff --git a/docker-compose/production/zitadel/.env.example b/docker-compose/production/zitadel/.env.example new file mode 100644 index 000000000000..410630f3ff28 --- /dev/null +++ b/docker-compose/production/zitadel/.env.example @@ -0,0 +1,53 @@ +# Required: LobeChat domain for tRPC calls +# Ensure this domain is whitelisted in your NextAuth providers and S3 service CORS settings +APP_URL=https://lobe.example.com/ + +# Postgres related environment variables +# Required: Secret key for encrypting sensitive information. Generate with: openssl rand -base64 32 +KEY_VAULTS_SECRET=Kix2wcUONd4CX51E/ZPAd36BqM4wzJgKjPtz2sGztqQ= +# Required: Postgres database connection string +# Format: postgresql://username:password@host:port/dbname +# If using Docker, you can use the container name as the host +DATABASE_URL=postgresql://postgres:uWNZugjBqixf8dxC@postgresql:5432/lobe + +# NEXT_AUTH related environment variables +# Required: NextAuth URL for callbacks +NEXTAUTH_URL=https://lobe.example.com/api/auth +# Required: NextAuth secret key. Generate with: openssl rand -base64 32 +NEXT_AUTH_SECRET=NX2kaPE923dt6BL2U8e9oSre5RfoT7hg +# Required: Specify the authentication provider +NEXT_AUTH_SSO_PROVIDERS=zitadel + +# ZiTADEL provider configuration +# Please refer to:https://lobehub.com/zh/docs/self-hosting/advanced/auth/next-auth/zitadel +AUTH_ZITADEL_ID=285934220675723622 +AUTH_ZITADEL_SECRET=pe7Nh3lopXkZkfqh5YEDYI2xsbIz08eZKqInOUZxssd3refRia518Apbv3DZ +AUTH_ZITADEL_ISSUER=https://zitadel.example.com + +# Proxy settings (if needed, e.g., when using GitHub as an auth provider) +# HTTP_PROXY=http://localhost:7890 +# HTTPS_PROXY=http://localhost:7890 + +# S3 related environment variables (example using MinIO) +# Required: S3 Access Key ID (for MinIO, invalid until manually created in MinIO UI) +S3_ACCESS_KEY_ID=YOUR_S3_ACCESS_KEY_ID +# Required: S3 Secret Access Key (for MinIO, invalid until manually created in MinIO UI) +S3_SECRET_ACCESS_KEY=YOUR_S3_SECRET_ACCESS_KEY +# Required: S3 Endpoint for server/client connections to S3 API +S3_ENDPOINT=https://lobe-s3-api.example.com +# Required: S3 Bucket (invalid until manually created in MinIO UI) +S3_BUCKET=lobe +# Required: S3 Public Domain for client access to unstructured data +S3_PUBLIC_DOMAIN=https://lobe-s3-api.example.com +# Optional: S3 Enable Path Style +# Use 0 for mainstream S3 cloud providers; use 1 for self-hosted MinIO +# See: https://lobehub.com/docs/self-hosting/advanced/s3#s-3-enable-path-style +S3_ENABLE_PATH_STYLE=1 + +# Other basic environment variables (as needed) +# See: https://lobehub.com/docs/self-hosting/environment-variables/basic +# Note: For server versions, the API must support embedding models (OpenAI text-embedding-3-small) for file processing +# You don't need to specify this model in OPENAI_MODEL_LIST +# OPENAI_API_KEY=sk-xxxx +# OPENAI_PROXY_URL=https://api.openai.com/v1 +# OPENAI_MODEL_LIST=... diff --git a/docker-compose/production/zitadel/.env.zh-CN.example b/docker-compose/production/zitadel/.env.zh-CN.example new file mode 100644 index 000000000000..0184b6910665 --- /dev/null +++ b/docker-compose/production/zitadel/.env.zh-CN.example @@ -0,0 +1,48 @@ +# 必填,LobeChat 域名,用于 tRPC 调用 +# 请保证此域名在你的 NextAuth 鉴权服务提供商、S3 服务商的 CORS 白名单中 +APP_URL=https://lobe.example.com/ + +# Postgres 相关,也即 DB 必需的环境变量 +# 必填,用于加密敏感信息的密钥,可以使用 openssl rand -base64 32 生成 +KEY_VAULTS_SECRET=Kix2wcUONd4CX51E/ZPAd36BqM4wzJgKjPtz2sGztqQ= +# 必填,Postgres 数据库连接字符串,用于连接到数据库 +# 格式:postgresql://username:password@host:port/dbname,如果你的 pg 实例为 Docker 容器且位于同一 docker-compose 文件中,亦可使用容器名作为 host +DATABASE_URL=postgresql://postgres:uWNZugjBqixf8dxC@postgresql:5432/lobe + +# NEXT_AUTH 相关,也即鉴权服务必需的环境变量 +# 必填,NextAuth 的 URL,用于 NextAuth 的回调 +NEXTAUTH_URL=https://lobe.example.com/api/auth +# 必填,用于 NextAuth 的密钥,可以使用 openssl rand -base64 32 生成 +NEXT_AUTH_SECRET=NX2kaPE923dt6BL2U8e9oSre5RfoT7hg +# 必填,指定鉴权服务提供商 +NEXT_AUTH_SSO_PROVIDERS=zitadel + +# ZiTADEL 鉴权服务提供商部分 +# 请参考:https://lobehub.com/zh/docs/self-hosting/advanced/auth/next-auth/zitadel +AUTH_ZITADEL_ID=285934220675723622 +AUTH_ZITADEL_SECRET=pe7Nh3lopXkZkfqh5YEDYI2xsbIz08eZKqInOUZxssd3refRia518Apbv3DZ +AUTH_ZITADEL_ISSUER=https://zitadel.example.com + +# S3 相关,也即非结构化数据(文件、图片等)存储必需的环境变量 +# 这里以 MinIO 为例 +# 必填,S3 的 Access Key ID,对于 MinIO 来说,直到在 MinIO UI 中手动创建之前都是无效的 +S3_ACCESS_KEY_ID=YOUR_S3_ACCESS_KEY_ID +# 必填,S3 的 Secret Access Key,对于 MinIO 来说,直到在 MinIO UI 中手动创建之前都是无效的 +S3_SECRET_ACCESS_KEY=YOUR_S3_SECRET_ACCESS_KEY +# 必填,S3 的 Endpoint,用于服务端/客户端连接到 S3 API +S3_ENDPOINT=https://lobe-s3-api.example.com +# 必填,S3 的 Bucket,直到在 MinIO UI 中手动创建之前都是无效的 +S3_BUCKET=lobe +# 必填,S3 的 Public Domain,用于客户端通过公开连接访问非结构化数据 +S3_PUBLIC_DOMAIN=https://lobe-s3-api.example.com +# 选填,S3 的 Enable Path Style +# 对于主流 S3 Cloud 服务商,一般填 0 即可;对于自部署的 MinIO,请填 1 +# 请参考:https://lobehub.com/zh/docs/self-hosting/advanced/s3#s-3-enable-path-style +S3_ENABLE_PATH_STYLE=1 + +# 其他基础环境变量,视需求而定。注意不要有 ACCESS_CODE +# 请参考:https://lobehub.com/zh/docs/self-hosting/environment-variables/basic +# 请注意,对于服务端版本,其 API 必须支持嵌入(即 OpenAI text-embedding-3-small)模型,否则无法对上传文件进行处理,但你无需在 OPENAI_MODEL_LIST 中指定此模型 +# OPENAI_API_KEY=sk-xxxx +# OPENAI_PROXY_URL=https://api.openai.com/v1 +# OPENAI_MODEL_LIST=... diff --git a/docker-compose/production/zitadel/docker-compose.yml b/docker-compose/production/zitadel/docker-compose.yml new file mode 100644 index 000000000000..1e46add98791 --- /dev/null +++ b/docker-compose/production/zitadel/docker-compose.yml @@ -0,0 +1,69 @@ +services: + postgresql: + image: pgvector/pgvector:pg16 + container_name: lobe-postgres + ports: + - '5432:5432' + volumes: + - './data:/var/lib/postgresql/data' + environment: + - 'POSTGRES_DB=lobe' + - 'POSTGRES_PASSWORD=uWNZugjBqixf8dxC' + healthcheck: + test: ['CMD-SHELL', 'pg_isready -U postgres'] + interval: 5s + timeout: 5s + retries: 5 + restart: always + + minio: + image: minio/minio + container_name: lobe-minio + ports: + - '9000:9000' + - '9001:9001' + volumes: + - './s3_data:/etc/minio/data' + environment: + - 'MINIO_ROOT_USER=YOUR_MINIO_USER' + - 'MINIO_ROOT_PASSWORD=YOUR_MINIO_PASSWORD' + - 'MINIO_DOMAIN=lobe-s3-api.example.com' + - 'MINIO_API_CORS_ALLOW_ORIGIN=https://lobe.example.com' # Your LobeChat's domain name. + restart: always + command: > + server /etc/minio/data --address ":9000" --console-address ":9001" + + zitadel: + restart: always + image: ghcr.io/zitadel/zitadel:latest + container_name: lobe-zitadel + command: start-from-init --config /zitadel-config.yaml --steps + /zitadel-init-steps.yaml --masterkey "cft3Tekr/rQBOqwoQSCPoncA9BHbn7QJ" + --tlsMode external #MasterkeyNeedsToHave32Characters + ports: + - 8080:8080 + volumes: + - ./zitadel-config.yaml:/zitadel-config.yaml:ro + - ./zitadel-init-steps.yaml:/zitadel-init-steps.yaml:ro + depends_on: + postgresql: + condition: service_healthy + + lobe: + image: lobehub/lobe-chat-database + container_name: lobe-database + ports: + - '3210:3210' + depends_on: + - postgresql + - minio + - zitadel + env_file: + - .env + restart: always + +volumes: + data: + driver: local + s3_data: + driver: local diff --git a/docker-compose/production/zitadel/zitadel-config.yaml b/docker-compose/production/zitadel/zitadel-config.yaml new file mode 100644 index 000000000000..bd7e7a9f18ae --- /dev/null +++ b/docker-compose/production/zitadel/zitadel-config.yaml @@ -0,0 +1,25 @@ +Log: + Level: 'info' + +ExternalPort: 443 +ExternalDomain: example.com #Your zitadel's domain name +ExternalSecure: true +TLS: + Enabled: false # ZITADEL_TLS_ENABLED + +# If not using the docker compose example, adjust these values for connecting ZITADEL to your PostgreSQL +Database: + postgres: + Host: postgresql + Port: 5432 + Database: zitadel + User: + Username: 'zitadel' + Password: 'zitadel' + SSL: + Mode: 'disable' + Admin: + Username: 'postgres' + Password: 'uWNZugjBqixf8dxC' #postgres password + SSL: + Mode: 'disable' diff --git a/docker-compose/production/zitadel/zitadel-init-steps.yaml b/docker-compose/production/zitadel/zitadel-init-steps.yaml new file mode 100644 index 000000000000..6d72bfb892c2 --- /dev/null +++ b/docker-compose/production/zitadel/zitadel-init-steps.yaml @@ -0,0 +1,11 @@ +# All possible options and their defaults: https://github.com/zitadel/zitadel/blob/main/cmd/setup/steps.yaml +FirstInstance: + Org: + Human: + # use the loginname root@zitadel.localhost, replace localhost with your configured external domain + Username: 'root' + # The password must be 8 characters or more and must contain uppercase letters, lowercase letters, symbols, and numbers. The first login will require a password change. + Password: 'Password1!' + Email: + # Optional, if set, can be used to log in with email. + Address: 'example@zitadel.com' # ZITADEL_FIRSTINSTANCE_ORG_HUMAN_EMAIL_ADDRESS diff --git a/package.json b/package.json index 8331604d08c7..36764b7b75d5 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@lobehub/chat", - "version": "1.20.2", + "version": "1.20.4", "description": "Lobe Chat - an open-source, high-performance chatbot framework that supports speech synthesis, multimodal, and extensible Function Call plugin system. Supports one-click free deployment of your private ChatGPT/LLM web application.", "keywords": [ "framework", @@ -217,7 +217,7 @@ "systemjs": "^6.15.1", "ts-md5": "^1.3.1", "ua-parser-js": "^1.0.38", - "unstructured-client": "^0.16.0", + "unstructured-client": "^0.18.0", "url-join": "^5.0.0", "use-merge-value": "^1.2.0", "utility-types": "^3.11.0", diff --git a/src/app/(main)/chat/(workspace)/_layout/Desktop/ChatHeader/index.tsx b/src/app/(main)/chat/(workspace)/_layout/Desktop/ChatHeader/index.tsx index c45c62ee4cb6..7b5c016521fc 100644 --- a/src/app/(main)/chat/(workspace)/_layout/Desktop/ChatHeader/index.tsx +++ b/src/app/(main)/chat/(workspace)/_layout/Desktop/ChatHeader/index.tsx @@ -3,6 +3,12 @@ import { ChatHeader } from '@lobehub/ui'; import HeaderAction from './HeaderAction'; import Main from './Main'; -const Header = () => } right={} style={{ zIndex: 11 }} />; +const Header = () => ( + } + right={} + style={{ minHeight: 64, position: 'initial', zIndex: 11 }} + /> +); export default Header; diff --git a/src/app/(main)/chat/(workspace)/_layout/Desktop/Portal.tsx b/src/app/(main)/chat/(workspace)/_layout/Desktop/Portal.tsx index b454e15ba679..9be2d5d5e115 100644 --- a/src/app/(main)/chat/(workspace)/_layout/Desktop/Portal.tsx +++ b/src/app/(main)/chat/(workspace)/_layout/Desktop/Portal.tsx @@ -6,7 +6,6 @@ import { rgba } from 'polished'; import { PropsWithChildren, memo } from 'react'; import { Flexbox } from 'react-layout-kit'; -import SafeSpacing from '@/components/SafeSpacing'; import { CHAT_DOCK_TOOL_UI_WIDTH, CHAT_DOCK_WIDTH, MAX_WIDTH } from '@/const/layoutTokens'; import { useChatStore } from '@/store/chat'; import { chatPortalSelectors } from '@/store/chat/slices/portal/selectors'; @@ -69,7 +68,6 @@ const PortalPanel = memo(({ children }: PropsWithChildren) => { minWidth: CHAT_DOCK_WIDTH, }} > - {children} diff --git a/src/app/(main)/chat/(workspace)/_layout/Desktop/TopicPanel.tsx b/src/app/(main)/chat/(workspace)/_layout/Desktop/TopicPanel.tsx index 6a93a371fdc1..978724eca0ed 100644 --- a/src/app/(main)/chat/(workspace)/_layout/Desktop/TopicPanel.tsx +++ b/src/app/(main)/chat/(workspace)/_layout/Desktop/TopicPanel.tsx @@ -5,7 +5,6 @@ import { createStyles, useResponsive } from 'antd-style'; import isEqual from 'fast-deep-equal'; import { PropsWithChildren, memo, useEffect, useState } from 'react'; -import SafeSpacing from '@/components/SafeSpacing'; import { CHAT_SIDEBAR_WIDTH } from '@/const/layoutTokens'; import { useChatStore } from '@/store/chat'; import { chatPortalSelectors } from '@/store/chat/slices/portal/selectors'; @@ -71,7 +70,6 @@ const TopicPanel = memo(({ children }: PropsWithChildren) => { minWidth: CHAT_SIDEBAR_WIDTH, }} > - {children} diff --git a/src/app/(main)/chat/@session/features/SessionListContent/Modals/ConfigGroupModal/index.tsx b/src/app/(main)/chat/@session/features/SessionListContent/Modals/ConfigGroupModal/index.tsx index bd1a81ac02a9..349628b28475 100644 --- a/src/app/(main)/chat/@session/features/SessionListContent/Modals/ConfigGroupModal/index.tsx +++ b/src/app/(main)/chat/@session/features/SessionListContent/Modals/ConfigGroupModal/index.tsx @@ -13,7 +13,7 @@ import { SessionGroupItem } from '@/types/session'; import GroupItem from './GroupItem'; -const useStyles = createStyles(({ css, token, stylish }) => ({ +const useStyles = createStyles(({ css, token }) => ({ container: css` height: 36px; padding-inline: 8px; @@ -21,7 +21,6 @@ const useStyles = createStyles(({ css, token, stylish }) => ({ transition: background 0.2s ease-in-out; &:hover { - ${stylish.blur}; background: ${token.colorFillTertiary}; } `, diff --git a/src/components/DragUpload/index.tsx b/src/components/DragUpload/index.tsx index ce3f80af75b3..7fa97cca0169 100644 --- a/src/components/DragUpload/index.tsx +++ b/src/components/DragUpload/index.tsx @@ -58,7 +58,6 @@ const useStyles = createStyles(({ css, token }) => { height: 100%; background: ${token.colorBgMask}; - backdrop-filter: blur(4px); transition: all 0.3s ease-in-out; `, diff --git a/src/components/FunctionModal/style.tsx b/src/components/FunctionModal/style.tsx index 8ce6b7a2aec0..2b561516e6e9 100644 --- a/src/components/FunctionModal/style.tsx +++ b/src/components/FunctionModal/style.tsx @@ -31,7 +31,6 @@ export const useStyles = createStyles(({ css, token, prefixCls, isDarkMode, resp `, wrap: css` overflow: hidden auto; - backdrop-filter: blur(2px); `, }; }); diff --git a/src/components/GuideModal/index.tsx b/src/components/GuideModal/index.tsx index 65596c84978a..e166b3e488e0 100644 --- a/src/components/GuideModal/index.tsx +++ b/src/components/GuideModal/index.tsx @@ -32,7 +32,6 @@ const useStyles = createStyles(({ css, token, prefixCls }) => { `, wrap: css` overflow: hidden auto; - backdrop-filter: blur(2px); `, }; }); diff --git a/src/database/server/models/chunk.ts b/src/database/server/models/chunk.ts index 0a7cd8fce6f2..2acc0a3875d4 100644 --- a/src/database/server/models/chunk.ts +++ b/src/database/server/models/chunk.ts @@ -1,5 +1,6 @@ import { asc, cosineDistance, count, eq, inArray, sql } from 'drizzle-orm'; import { and, desc, isNull } from 'drizzle-orm/expressions'; +import { chunk } from 'lodash-es'; import { serverDB } from '@/database/server'; import { ChunkMetadata, FileChunk, SemanticSearchChunk } from '@/types/chunk'; @@ -53,7 +54,15 @@ export class ChunkModel { const ids = orphanedChunks.map((chunk) => chunk.chunkId); if (ids.length === 0) return; - await serverDB.delete(chunks).where(inArray(chunks.id, ids)); + const list = chunk(ids, 500); + + await serverDB.transaction(async (trx) => { + await Promise.all( + list.map(async (chunkIds) => { + await trx.delete(chunks).where(inArray(chunks.id, chunkIds)); + }), + ); + }); }; findById = async (id: string) => { diff --git a/src/features/Conversation/components/VirtualizedList/index.tsx b/src/features/Conversation/components/VirtualizedList/index.tsx index 41a10a25005f..087bda53daef 100644 --- a/src/features/Conversation/components/VirtualizedList/index.tsx +++ b/src/features/Conversation/components/VirtualizedList/index.tsx @@ -43,10 +43,9 @@ const VirtualizedList = memo(({ mobile }) => { const data = useChatStore((s) => { const showInboxWelcome = chatSelectors.showInboxWelcome(s); - const ids = showInboxWelcome + return showInboxWelcome ? [WELCOME_GUIDE_CHAT_ID] : chatSelectors.currentChatIDsWithGuideMessage(s); - return ['empty', ...ids]; }, isEqual); useEffect(() => { @@ -71,11 +70,7 @@ const VirtualizedList = memo(({ mobile }) => { (index: number, id: string) => { if (id === WELCOME_GUIDE_CHAT_ID) return ; - return index === 0 ? ( -
- ) : ( - - ); + return ; }, [mobile], ); diff --git a/src/layout/AuthProvider/Clerk/useAppearance.ts b/src/layout/AuthProvider/Clerk/useAppearance.ts index 7832ab02ec21..3cc1f069b7c8 100644 --- a/src/layout/AuthProvider/Clerk/useAppearance.ts +++ b/src/layout/AuthProvider/Clerk/useAppearance.ts @@ -26,7 +26,6 @@ export const useStyles = createStyles( `, modalBackdrop: css` background: ${token.colorBgMask}; - backdrop-filter: blur(2px); `, modalContent: css` &.${prefixCls}-modalContent {