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 {