diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index f67c4123b7d7f..6b9708bb258d5 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -8,7 +8,7 @@ jobs: services: postgres: - image: postgres:16 + image: pgvector/pgvector:pg16 env: POSTGRES_PASSWORD: postgres options: >- @@ -39,6 +39,7 @@ jobs: DATABASE_DRIVER: node NEXT_PUBLIC_SERVICE_MODE: server KEY_VAULTS_SECRET: LA7n9k3JdEcbSgml2sxfw+4TV1AzaaFU5+R176aQz4s= + NEXT_PUBLIC_S3_DOMAIN: https://example.com - name: Upload Server coverage to Codecov uses: codecov/codecov-action@v4 diff --git a/Dockerfile.database b/Dockerfile.database index b212798a41914..8fb4c03098418 100644 --- a/Dockerfile.database +++ b/Dockerfile.database @@ -92,6 +92,7 @@ COPY --from=builder /deps/node_modules/drizzle-orm /app/node_modules/drizzle-orm # Copy database migrations COPY --from=builder /app/src/database/server/migrations /app/migrations COPY --from=builder /app/scripts/migrateServerDB/docker.cjs /app/docker.cjs +COPY --from=builder /app/scripts/migrateServerDB/errorHint.js /app/errorHint.js ## Production image, copy all the files and run next FROM base @@ -107,6 +108,7 @@ ENV HOSTNAME="0.0.0.0" \ # General Variables ENV ACCESS_CODE="" \ + APP_URL="" \ API_KEY_SELECT_MODE="" \ DEFAULT_AGENT_CONFIG="" \ SYSTEM_AGENT="" \ diff --git a/docs/self-hosting/advanced/knowledge-base.zh-CN.mdx b/docs/self-hosting/advanced/knowledge-base.zh-CN.mdx new file mode 100644 index 0000000000000..49b2a66ea4255 --- /dev/null +++ b/docs/self-hosting/advanced/knowledge-base.zh-CN.mdx @@ -0,0 +1,65 @@ +# 知识库/文件上传 + +LobeChat 支持文件上传/知识库管理。该功能依赖于以下核心技术组件,了解这些组件将有助于你成功部署和维护知识库系统。 + +## 核心组件 + +### 1. PostgreSQL 与 PGVector + +PostgreSQL 是一个强大的开源关系型数据库系统,而 PGVector 是其扩展,为向量操作提供支持。 + +- **用途**:存储结构化数据和向量索引 +- **部署建议**:使用官方 Docker 镜像可以快速部署 PostgreSQL 和 PGVector + +示例部署脚本: + +``` +docker run -p 5432:5432 -d --name pg -e POSTGRES_PASSWORD=mysecretpassword pgvector/pgvector:pg16 +``` + +- **注意事项**:确保分配足够的资源以处理向量操作 + +### 2. S3 兼容的对象存储 + +S3(或兼容 S3 协议的存储服务)用于存储上传的文件。 + +- **用途**:存储原始文件 +- **选项**:可以使用 AWS S3、MinIO 或其他兼容 S3 协议的存储服务 +- **注意事项**:配置适当的访问权限和安全策略 + +### 3. OpenAI Embedding + +OpenAI 的嵌入(Embedding)服务用于将文本转化为向量表示。 + +- **用途**:生成文本的向量表示,用于语义搜索 +- **注意事项**: +- 需要有效的 OpenAI API 密钥 +- 实施适当的 API 调用限制和错误处理机制 + +### 4. Unstructured.io(可选) + +Unstructured.io 是一个强大的文档处理工具。 + +- **用途**:处理复杂的文档格式,提取结构化信息 +- **应用场景**:处理 PDF、Word 等非纯文本格式的文档 +- **注意事项**:评估处理需求,根据文档复杂度决定是否部署 + +## 部署注意事项 + +1. **数据安全**:确保所有组件都有适当的安全措施,特别是涉及敏感数据时。 + +2. **性能优化**: + +- 为 PostgreSQL 和 PGVector 配置足够的计算资源 +- 优化 S3 存储的访问策略和缓存机制 + +3. **可扩展性**:设计架构时考虑未来可能的数据增长和用户增加。 + +4. **监控与维护**: + +- 实施日志记录和监控系统 +- 定期备份数据库和对象存储 + +5. **合规性**:确保部署符合相关的数据保护法规和隐私政策。 + +通过正确配置和集成这些核心组件,您可以为 LobeChat 构建一个强大、高效的知识库系统。每个组件都在整体架构中扮演着关键角色,共同支持高级的文档管理和智能检索功能。 diff --git a/locales/ar/chat.json b/locales/ar/chat.json index ac14d683d0e81..3083f56071b8e 100644 --- a/locales/ar/chat.json +++ b/locales/ar/chat.json @@ -62,6 +62,7 @@ "pin": "تثبيت", "pinOff": "إلغاء التثبيت", "rag": { + "referenceChunks": "مراجع", "userQuery": { "actions": { "delete": "حذف الاستعلام", @@ -155,9 +156,18 @@ }, "updateAgent": "تحديث معلومات المساعد", "upload": { - "actionFiletip": "تحميل المستند", - "actionTooltip": "تحميل الصورة", - "disabled": "النموذج الحالي لا يدعم التعرف على الرؤية، يرجى تغيير النموذج المستخدم", + "action": { + "fileUpload": "رفع ملف", + "folderUpload": "رفع مجلد", + "imageDisabled": "النموذج الحالي لا يدعم التعرف على الصور، يرجى تغيير النموذج لاستخدامه", + "imageUpload": "رفع صورة", + "tooltip": "رفع" + }, + "clientMode": { + "actionFiletip": "رفع ملف", + "actionTooltip": "رفع", + "disabled": "النموذج الحالي لا يدعم التعرف على الصور وتحليل الملفات، يرجى تغيير النموذج لاستخدامه" + }, "preview": { "prepareTasks": "تحضير الأجزاء...", "status": { diff --git a/locales/ar/components.json b/locales/ar/components.json index 3637ad1f87d1c..94b98c7bda19c 100644 --- a/locales/ar/components.json +++ b/locales/ar/components.json @@ -50,6 +50,8 @@ "chunks": { "embeddingStatus": { "empty": "لم يتم تحويل كتل النص بالكامل إلى متجهات، مما سيؤدي إلى عدم توفر وظيفة البحث الدلالي، لتحسين جودة البحث، يرجى تحويل كتل النص إلى متجهات", + "error": "فشل في تحويل البيانات إلى متجهات", + "errorResult": "فشل في تحويل البيانات إلى متجهات، يرجى التحقق والمحاولة مرة أخرى. سبب الفشل:", "processing": "يتم تحويل كتل النص إلى متجهات، يرجى الانتظار", "success": "تم تحويل جميع كتل النص الحالية إلى متجهات" }, diff --git a/locales/bg-BG/chat.json b/locales/bg-BG/chat.json index 1a67721600b3d..b8991c40a1dba 100644 --- a/locales/bg-BG/chat.json +++ b/locales/bg-BG/chat.json @@ -62,6 +62,7 @@ "pin": "Закачи", "pinOff": "Откачи", "rag": { + "referenceChunks": "Цитирани източници", "userQuery": { "actions": { "delete": "Изтрий Query", @@ -155,9 +156,18 @@ }, "updateAgent": "Актуализирай информацията за агента", "upload": { - "actionFiletip": "Загрузите файл", - "actionTooltip": "Качи изображение", - "disabled": "Текущият модел не поддържа визуално разпознаване. Моля, превключи моделите, за да използваш тази функция.", + "action": { + "fileUpload": "Качване на файл", + "folderUpload": "Качване на папка", + "imageDisabled": "Текущият модел не поддържа визуално разпознаване, моля, превключете модела и опитайте отново", + "imageUpload": "Качване на изображение", + "tooltip": "Качване" + }, + "clientMode": { + "actionFiletip": "Качване на файл", + "actionTooltip": "Качване", + "disabled": "Текущият модел не поддържа визуално разпознаване и анализ на файлове, моля, превключете модела и опитайте отново" + }, "preview": { "prepareTasks": "Подготовка на парчета...", "status": { diff --git a/locales/bg-BG/components.json b/locales/bg-BG/components.json index 89287d116aa9d..37ba01eb0b8b8 100644 --- a/locales/bg-BG/components.json +++ b/locales/bg-BG/components.json @@ -50,6 +50,8 @@ "chunks": { "embeddingStatus": { "empty": "Текстовите блокове все още не са напълно векторизирани, което ще доведе до недостъпност на семантичното търсене. За подобряване на качеството на търсенето, моля, векторизирайте текстовите блокове.", + "error": "Неуспешна векторизация", + "errorResult": "Неуспешна векторизация, моля проверете и опитайте отново. Причина за неуспеха:", "processing": "Текстовите блокове се векторизират, моля, бъдете търпеливи.", "success": "Текущите текстови блокове са напълно векторизирани." }, diff --git a/locales/de-DE/chat.json b/locales/de-DE/chat.json index 89ecd95320fff..a1aad824a266b 100644 --- a/locales/de-DE/chat.json +++ b/locales/de-DE/chat.json @@ -62,6 +62,7 @@ "pin": "Anheften", "pinOff": "Anheften aufheben", "rag": { + "referenceChunks": "Referenzstücke", "userQuery": { "actions": { "delete": "Abfrage löschen", @@ -155,9 +156,18 @@ }, "updateAgent": "Assistenteninformationen aktualisieren", "upload": { - "actionFiletip": "Laden Sie die Datei hoch", - "actionTooltip": "Bild hochladen", - "disabled": "Das aktuelle Modell unterstützt keine visuelle Erkennung. Bitte wechseln Sie das Modell, um es zu verwenden.", + "action": { + "fileUpload": "Datei hochladen", + "folderUpload": "Ordner hochladen", + "imageDisabled": "Das aktuelle Modell unterstützt keine visuelle Erkennung. Bitte wechseln Sie das Modell, um diese Funktion zu nutzen.", + "imageUpload": "Bild hochladen", + "tooltip": "Hochladen" + }, + "clientMode": { + "actionFiletip": "Datei hochladen", + "actionTooltip": "Hochladen", + "disabled": "Das aktuelle Modell unterstützt keine visuelle Erkennung und Dateianalyse. Bitte wechseln Sie das Modell, um diese Funktionen zu nutzen." + }, "preview": { "prepareTasks": "Vorbereitung der Teile...", "status": { diff --git a/locales/de-DE/components.json b/locales/de-DE/components.json index 1d50ef7e791d2..0775a66507cb6 100644 --- a/locales/de-DE/components.json +++ b/locales/de-DE/components.json @@ -50,6 +50,8 @@ "chunks": { "embeddingStatus": { "empty": "Textblöcke sind noch nicht vollständig vektorisiert, was die Funktion der semantischen Suche beeinträchtigen kann. Um die Suchqualität zu verbessern, vektorisieren Sie die Textblöcke.", + "error": "Vektorisierung fehlgeschlagen", + "errorResult": "Vektorisierung fehlgeschlagen, bitte überprüfen Sie und versuchen Sie es erneut. Grund für das Scheitern:", "processing": "Textblöcke werden vektorisiert, bitte haben Sie Geduld.", "success": "Alle aktuellen Textblöcke sind vektorisiert." }, diff --git a/locales/en-US/chat.json b/locales/en-US/chat.json index 4d70cf73a581e..9346c44478d9c 100644 --- a/locales/en-US/chat.json +++ b/locales/en-US/chat.json @@ -62,6 +62,7 @@ "pin": "Pin", "pinOff": "Unpin", "rag": { + "referenceChunks": "Reference Source", "userQuery": { "actions": { "delete": "Delete Query Rewrite", @@ -155,9 +156,18 @@ }, "updateAgent": "Update Assistant Information", "upload": { - "actionFiletip": "Update File", - "actionTooltip": "Upload Image", - "disabled": "The current model does not support visual recognition. Please switch models to use this feature.", + "action": { + "fileUpload": "Upload File", + "folderUpload": "Upload Folder", + "imageDisabled": "The current model does not support visual recognition. Please switch models to use this feature.", + "imageUpload": "Upload Image", + "tooltip": "Upload" + }, + "clientMode": { + "actionFiletip": "Upload File", + "actionTooltip": "Upload", + "disabled": "The current model does not support visual recognition and file analysis. Please switch models to use this feature." + }, "preview": { "prepareTasks": "Preparing chunks...", "status": { diff --git a/locales/en-US/components.json b/locales/en-US/components.json index eaf5bc2748db6..5ecc95ef5aaac 100644 --- a/locales/en-US/components.json +++ b/locales/en-US/components.json @@ -50,6 +50,8 @@ "chunks": { "embeddingStatus": { "empty": "Text chunks have not been fully vectorized, which will render the semantic search feature unavailable. To improve search quality, please vectorize the text chunks.", + "error": "Vectorization failed", + "errorResult": "Vectorization failed, please check and try again. Reason for failure:", "processing": "Text chunks are being vectorized, please be patient.", "success": "All current text chunks have been vectorized." }, diff --git a/locales/es-ES/chat.json b/locales/es-ES/chat.json index 2464caf91ed24..605a9876d8727 100644 --- a/locales/es-ES/chat.json +++ b/locales/es-ES/chat.json @@ -62,6 +62,7 @@ "pin": "Fijar", "pinOff": "Desfijar", "rag": { + "referenceChunks": "Fragmentos de referencia", "userQuery": { "actions": { "delete": "Eliminar reescritura de consulta", @@ -155,9 +156,18 @@ }, "updateAgent": "Actualizar información del asistente", "upload": { - "actionFiletip": "Sube el archivo", - "actionTooltip": "Subir imagen", - "disabled": "El modelo actual no admite reconocimiento visual. Por favor, cambia de modelo para usar esta función", + "action": { + "fileUpload": "Subir archivo", + "folderUpload": "Subir carpeta", + "imageDisabled": "El modelo actual no soporta reconocimiento visual, por favor cambie de modelo para usar esta función", + "imageUpload": "Subir imagen", + "tooltip": "Subir" + }, + "clientMode": { + "actionFiletip": "Subir archivo", + "actionTooltip": "Subir", + "disabled": "El modelo actual no soporta reconocimiento visual ni análisis de archivos, por favor cambie de modelo para usar esta función" + }, "preview": { "prepareTasks": "Preparando fragmentos...", "status": { diff --git a/locales/es-ES/components.json b/locales/es-ES/components.json index c422337423dfc..b1619b6baf950 100644 --- a/locales/es-ES/components.json +++ b/locales/es-ES/components.json @@ -50,6 +50,8 @@ "chunks": { "embeddingStatus": { "empty": "Los bloques de texto aún no están completamente vectorizados, lo que hará que la función de búsqueda semántica no esté disponible. Para mejorar la calidad de búsqueda, por favor vectorice los bloques de texto.", + "error": "Error de vectorización", + "errorResult": "Error de vectorización, por favor verifica y vuelve a intentarlo. Motivo del fallo:", "processing": "Los bloques de texto están siendo vectorizados, por favor, tenga paciencia.", "success": "Todos los bloques de texto actuales han sido vectorizados." }, diff --git a/locales/fr-FR/chat.json b/locales/fr-FR/chat.json index de270109b4bc0..f34b0c9fc82f9 100644 --- a/locales/fr-FR/chat.json +++ b/locales/fr-FR/chat.json @@ -62,6 +62,7 @@ "pin": "Épingler", "pinOff": "Désépingler", "rag": { + "referenceChunks": "Références", "userQuery": { "actions": { "delete": "Supprimer la réécriture de la requête", @@ -155,9 +156,18 @@ }, "updateAgent": "Mettre à jour les informations de l'agent", "upload": { - "actionFiletip": "Télécharger le fichier", - "actionTooltip": "Télécharger une image", - "disabled": "Le modèle actuel ne prend pas en charge la reconnaissance visuelle. Veuillez changer de modèle pour utiliser cette fonctionnalité.", + "action": { + "fileUpload": "Télécharger un fichier", + "folderUpload": "Télécharger un dossier", + "imageDisabled": "Le modèle actuel ne prend pas en charge la reconnaissance visuelle, veuillez changer de modèle pour l'utiliser", + "imageUpload": "Télécharger une image", + "tooltip": "Télécharger" + }, + "clientMode": { + "actionFiletip": "Télécharger un fichier", + "actionTooltip": "Télécharger", + "disabled": "Le modèle actuel ne prend pas en charge la reconnaissance visuelle et l'analyse de fichiers, veuillez changer de modèle pour l'utiliser" + }, "preview": { "prepareTasks": "Préparation des morceaux...", "status": { diff --git a/locales/fr-FR/components.json b/locales/fr-FR/components.json index 27db72c96c3d2..5c1c1c48eee25 100644 --- a/locales/fr-FR/components.json +++ b/locales/fr-FR/components.json @@ -50,6 +50,8 @@ "chunks": { "embeddingStatus": { "empty": "Les blocs de texte n'ont pas encore été entièrement vectorisés, ce qui rendra la fonction de recherche sémantique indisponible. Pour améliorer la qualité de la recherche, veuillez vectoriser les blocs de texte.", + "error": "Échec de la vectorisation", + "errorResult": "Échec de la vectorisation, veuillez vérifier et réessayer. Raison de l'échec :", "processing": "Les blocs de texte sont en cours de vectorisation, veuillez patienter.", "success": "Tous les blocs de texte sont maintenant vectorisés." }, diff --git a/locales/it-IT/chat.json b/locales/it-IT/chat.json index cfe72dc26168f..0affd42c4e39d 100644 --- a/locales/it-IT/chat.json +++ b/locales/it-IT/chat.json @@ -62,6 +62,7 @@ "pin": "Fissa in alto", "pinOff": "Annulla fissaggio in alto", "rag": { + "referenceChunks": "Citazioni di riferimento", "userQuery": { "actions": { "delete": "Elimina la Query riscritta", @@ -155,9 +156,18 @@ }, "updateAgent": "Aggiorna informazioni assistente", "upload": { - "actionFiletip": "Carica il file", - "actionTooltip": "Carica immagine", - "disabled": "Il modello attuale non supporta il riconoscimento visivo, si prega di cambiare modello prima di utilizzarlo", + "action": { + "fileUpload": "Carica file", + "folderUpload": "Carica cartella", + "imageDisabled": "Il modello attuale non supporta il riconoscimento visivo, si prega di cambiare modello per utilizzare questa funzione", + "imageUpload": "Carica immagine", + "tooltip": "Carica" + }, + "clientMode": { + "actionFiletip": "Carica file", + "actionTooltip": "Carica", + "disabled": "Il modello attuale non supporta il riconoscimento visivo e l'analisi dei file, si prega di cambiare modello per utilizzare questa funzione" + }, "preview": { "prepareTasks": "Preparazione dei blocchi...", "status": { diff --git a/locales/it-IT/components.json b/locales/it-IT/components.json index d7be364dcd595..ef6e80866158c 100644 --- a/locales/it-IT/components.json +++ b/locales/it-IT/components.json @@ -50,6 +50,8 @@ "chunks": { "embeddingStatus": { "empty": "I blocchi di testo non sono stati completamente vettorizzati, il che comporterà l'impossibilità di utilizzare la funzione di ricerca semantica. Per migliorare la qualità della ricerca, si prega di vettorizzare i blocchi di testo.", + "error": "Errore di vettorizzazione", + "errorResult": "Vettorizzazione fallita, controlla e riprova. Motivo del fallimento:", "processing": "I blocchi di testo sono in fase di vettorizzazione, ti preghiamo di attendere", "success": "Attualmente tutti i blocchi di testo sono stati vettorizzati" }, diff --git a/locales/ja-JP/chat.json b/locales/ja-JP/chat.json index 9f5e15ce0ac1f..8fb30464da5c2 100644 --- a/locales/ja-JP/chat.json +++ b/locales/ja-JP/chat.json @@ -62,6 +62,7 @@ "pin": "ピン留め", "pinOff": "ピン留め解除", "rag": { + "referenceChunks": "参照チャンク", "userQuery": { "actions": { "delete": "クエリを削除", @@ -155,9 +156,18 @@ }, "updateAgent": "エージェント情報を更新", "upload": { - "actionFiletip": "ファイルをアップロードする", - "actionTooltip": "画像をアップロード", - "disabled": "現在のモデルはビジュアル認識をサポートしていません。モデルを切り替えて使用してください", + "action": { + "fileUpload": "ファイルをアップロード", + "folderUpload": "フォルダをアップロード", + "imageDisabled": "現在のモデルは視覚認識をサポートしていません。モデルを切り替えてから使用してください。", + "imageUpload": "画像をアップロード", + "tooltip": "アップロード" + }, + "clientMode": { + "actionFiletip": "ファイルをアップロード", + "actionTooltip": "アップロード", + "disabled": "現在のモデルは視覚認識とファイル分析をサポートしていません。モデルを切り替えてから使用してください。" + }, "preview": { "prepareTasks": "ブロックの準備中...", "status": { diff --git a/locales/ja-JP/components.json b/locales/ja-JP/components.json index 7ec75ae635392..d4387574fc8dd 100644 --- a/locales/ja-JP/components.json +++ b/locales/ja-JP/components.json @@ -50,6 +50,8 @@ "chunks": { "embeddingStatus": { "empty": "テキストブロックはまだ完全にベクトル化されていません。これにより意味検索機能が使用できなくなります。検索品質を向上させるために、テキストブロックをベクトル化してください", + "error": "ベクトル化に失敗しました", + "errorResult": "ベクトル化に失敗しました。再試行する前に確認してください。失敗の理由:", "processing": "テキストブロックをベクトル化中です。しばらくお待ちください", "success": "現在のテキストブロックはすべてベクトル化されています" }, diff --git a/locales/ko-KR/chat.json b/locales/ko-KR/chat.json index 62f2f0260d1d2..e242792ef1aff 100644 --- a/locales/ko-KR/chat.json +++ b/locales/ko-KR/chat.json @@ -62,6 +62,7 @@ "pin": "고정", "pinOff": "고정 해제", "rag": { + "referenceChunks": "참조 조각", "userQuery": { "actions": { "delete": "쿼리 삭제", @@ -155,9 +156,18 @@ }, "updateAgent": "도우미 정보 업데이트", "upload": { - "actionFiletip": "파일 업로드", - "actionTooltip": "이미지 업로드", - "disabled": "현재 모델은 시각 인식을 지원하지 않습니다. 모델을 전환한 후 사용해주세요.", + "action": { + "fileUpload": "파일 업로드", + "folderUpload": "폴더 업로드", + "imageDisabled": "현재 모델은 시각 인식을 지원하지 않습니다. 모델을 변경한 후 사용하세요.", + "imageUpload": "이미지 업로드", + "tooltip": "업로드" + }, + "clientMode": { + "actionFiletip": "파일 업로드", + "actionTooltip": "업로드", + "disabled": "현재 모델은 시각 인식 및 파일 분석을 지원하지 않습니다. 모델을 변경한 후 사용하세요." + }, "preview": { "prepareTasks": "청크 준비 중...", "status": { diff --git a/locales/ko-KR/components.json b/locales/ko-KR/components.json index aceccf1a7c519..bbbc45890b153 100644 --- a/locales/ko-KR/components.json +++ b/locales/ko-KR/components.json @@ -50,6 +50,8 @@ "chunks": { "embeddingStatus": { "empty": "텍스트 블록이 완전히 벡터화되지 않았습니다. 이는 의미 검색 기능을 사용할 수 없게 만듭니다. 검색 품질을 향상시키기 위해 텍스트 블록을 벡터화해 주세요.", + "error": "벡터화 실패", + "errorResult": "벡터화에 실패했습니다. 다시 확인한 후 재시도해 주세요. 실패 원인:", "processing": "텍스트 블록이 벡터화되고 있습니다. 잠시 기다려 주세요.", "success": "현재 텍스트 블록이 모두 벡터화되었습니다." }, diff --git a/locales/nl-NL/chat.json b/locales/nl-NL/chat.json index a65e272338bf2..637a627c68baa 100644 --- a/locales/nl-NL/chat.json +++ b/locales/nl-NL/chat.json @@ -62,6 +62,7 @@ "pin": "Vastzetten", "pinOff": "Vastzetten uitschakelen", "rag": { + "referenceChunks": "Referentiestukken", "userQuery": { "actions": { "delete": "Verwijder Query herschrijving", @@ -155,9 +156,18 @@ }, "updateAgent": "Assistentgegevens bijwerken", "upload": { - "actionFiletip": "Upload het bestand", - "actionTooltip": "Upload afbeelding", - "disabled": "Het huidige model ondersteunt geen visuele herkenning. Schakel over naar een ander model om dit te gebruiken.", + "action": { + "fileUpload": "Bestand uploaden", + "folderUpload": "Map uploaden", + "imageDisabled": "Dit model ondersteunt momenteel geen visuele herkenning, schakel alstublieft naar een ander model.", + "imageUpload": "Afbeelding uploaden", + "tooltip": "Uploaden" + }, + "clientMode": { + "actionFiletip": "Bestand uploaden", + "actionTooltip": "Uploaden", + "disabled": "Dit model ondersteunt momenteel geen visuele herkenning en bestandanalyse, schakel alstublieft naar een ander model." + }, "preview": { "prepareTasks": "Voorbereiden van blokken...", "status": { diff --git a/locales/nl-NL/components.json b/locales/nl-NL/components.json index 7c99456a40ee9..83734c75f35a4 100644 --- a/locales/nl-NL/components.json +++ b/locales/nl-NL/components.json @@ -50,6 +50,8 @@ "chunks": { "embeddingStatus": { "empty": "Tekstblokken zijn nog niet volledig gevectoriseerd, wat de semantische zoekfunctie kan uitschakelen. Om de zoekkwaliteit te verbeteren, vectoriseer de tekstblokken.", + "error": "Vectorisatie mislukt", + "errorResult": "Vectorisatie mislukt, controleer en probeer het opnieuw. Reden van falen:", "processing": "Tekstblokken worden gevectoriseerd, graag even geduld.", "success": "Huidige tekstblokken zijn allemaal gevectoriseerd" }, diff --git a/locales/pl-PL/chat.json b/locales/pl-PL/chat.json index aa0564ab846e3..f353919f5aa17 100644 --- a/locales/pl-PL/chat.json +++ b/locales/pl-PL/chat.json @@ -62,6 +62,7 @@ "pin": "Przypnij", "pinOff": "Odepnij", "rag": { + "referenceChunks": "Fragmenty odniesienia", "userQuery": { "actions": { "delete": "Usuń przepisanie zapytania", @@ -155,9 +156,18 @@ }, "updateAgent": "Aktualizuj informacje asystenta", "upload": { - "actionFiletip": "Prześlij plik", - "actionTooltip": "Prześlij obraz", - "disabled": "Obecny model nie obsługuje rozpoznawania wizyjnego. Proszę przełączyć model.", + "action": { + "fileUpload": "Prześlij plik", + "folderUpload": "Prześlij folder", + "imageDisabled": "Aktualny model nie obsługuje rozpoznawania wizualnego, przełącz się na inny model, aby użyć tej funkcji", + "imageUpload": "Prześlij obraz", + "tooltip": "Prześlij" + }, + "clientMode": { + "actionFiletip": "Prześlij plik", + "actionTooltip": "Prześlij", + "disabled": "Aktualny model nie obsługuje rozpoznawania wizualnego i analizy plików, przełącz się na inny model, aby użyć tej funkcji" + }, "preview": { "prepareTasks": "Przygotowywanie fragmentów...", "status": { diff --git a/locales/pl-PL/components.json b/locales/pl-PL/components.json index 1dd2c77f53c27..a91bed06a07e5 100644 --- a/locales/pl-PL/components.json +++ b/locales/pl-PL/components.json @@ -50,6 +50,8 @@ "chunks": { "embeddingStatus": { "empty": "Bloki tekstowe nie zostały w pełni wektoryzowane, co spowoduje, że funkcja wyszukiwania semantycznego będzie niedostępna. Aby poprawić jakość wyszukiwania, proszę wektoryzować bloki tekstowe", + "error": "Błąd wektoryzacji", + "errorResult": "Błąd wektoryzacji, spróbuj ponownie po sprawdzeniu. Powód błędu:", "processing": "Bloki tekstowe są wektoryzowane, proszę czekać", "success": "Obecne bloki tekstowe zostały w pełni wektoryzowane" }, diff --git a/locales/pt-BR/chat.json b/locales/pt-BR/chat.json index a7ea99fcbcf26..768476c544416 100644 --- a/locales/pt-BR/chat.json +++ b/locales/pt-BR/chat.json @@ -62,6 +62,7 @@ "pin": "Fixar", "pinOff": "Desafixar", "rag": { + "referenceChunks": "Referências", "userQuery": { "actions": { "delete": "Excluir reescrita de Query", @@ -155,9 +156,18 @@ }, "updateAgent": "Atualizar Informações do Assistente", "upload": { - "actionFiletip": "Enviar arquivo", - "actionTooltip": "Enviar Imagem", - "disabled": "O modelo atual não suporta reconhecimento visual. Por favor, altere o modelo antes de usar.", + "action": { + "fileUpload": "Enviar arquivo", + "folderUpload": "Enviar pasta", + "imageDisabled": "O modelo atual não suporta reconhecimento visual, por favor, mude de modelo antes de usar", + "imageUpload": "Enviar imagem", + "tooltip": "Enviar" + }, + "clientMode": { + "actionFiletip": "Enviar arquivo", + "actionTooltip": "Enviar", + "disabled": "O modelo atual não suporta reconhecimento visual e análise de arquivos, por favor, mude de modelo antes de usar" + }, "preview": { "prepareTasks": "Preparando partes...", "status": { diff --git a/locales/pt-BR/components.json b/locales/pt-BR/components.json index 05804fdde2406..f2d8cb0409cb3 100644 --- a/locales/pt-BR/components.json +++ b/locales/pt-BR/components.json @@ -50,6 +50,8 @@ "chunks": { "embeddingStatus": { "empty": "Os blocos de texto ainda não foram completamente vetorizados, o que resultará na funcionalidade de busca semântica indisponível. Para melhorar a qualidade da busca, por favor, vetorize os blocos de texto.", + "error": "Falha na vetorização", + "errorResult": "Falha na vetorização, por favor verifique e tente novamente. Motivo da falha:", "processing": "Os blocos de texto estão sendo vetorizados, por favor, aguarde.", "success": "Atualmente, todos os blocos de texto foram vetorizados." }, diff --git a/locales/ru-RU/chat.json b/locales/ru-RU/chat.json index 493249f127c30..7bf66b766db3f 100644 --- a/locales/ru-RU/chat.json +++ b/locales/ru-RU/chat.json @@ -62,6 +62,7 @@ "pin": "Закрепить", "pinOff": "Открепить", "rag": { + "referenceChunks": "Цитируемые источники", "userQuery": { "actions": { "delete": "Удалить переписанный запрос", @@ -155,9 +156,18 @@ }, "updateAgent": "Обновить информацию помощника", "upload": { - "actionFiletip": "Загрузите файл", - "actionTooltip": "Загрузить изображение", - "disabled": "Текущая модель не поддерживает визуальное распознавание. Пожалуйста, выберите другую модель.", + "action": { + "fileUpload": "Загрузить файл", + "folderUpload": "Загрузить папку", + "imageDisabled": "Текущая модель не поддерживает визуальное распознавание, пожалуйста, переключитесь на другую модель", + "imageUpload": "Загрузить изображение", + "tooltip": "Загрузить" + }, + "clientMode": { + "actionFiletip": "Загрузить файл", + "actionTooltip": "Загрузить", + "disabled": "Текущая модель не поддерживает визуальное распознавание и анализ файлов, пожалуйста, переключитесь на другую модель" + }, "preview": { "prepareTasks": "Подготовка блоков...", "status": { diff --git a/locales/ru-RU/components.json b/locales/ru-RU/components.json index 6e37381b2e52f..d3d9d0d01d345 100644 --- a/locales/ru-RU/components.json +++ b/locales/ru-RU/components.json @@ -50,6 +50,8 @@ "chunks": { "embeddingStatus": { "empty": "Текстовые блоки еще не полностью векторизованы, что приведет к недоступности функции семантического поиска. Для повышения качества поиска, пожалуйста, векторизуйте текстовые блоки.", + "error": "Ошибка векторизации", + "errorResult": "Ошибка векторизации, пожалуйста, проверьте и повторите попытку. Причина сбоя:", "processing": "Текстовые блоки векторизуются, пожалуйста, подождите.", "success": "Все текущие текстовые блоки успешно векторизованы." }, diff --git a/locales/tr-TR/chat.json b/locales/tr-TR/chat.json index b9b07f536998f..b41ef2cc0239a 100644 --- a/locales/tr-TR/chat.json +++ b/locales/tr-TR/chat.json @@ -62,6 +62,7 @@ "pin": "Pin", "pinOff": "Unpin", "rag": { + "referenceChunks": "Referans Parçaları", "userQuery": { "actions": { "delete": "Sorguyu Sil", @@ -155,9 +156,18 @@ }, "updateAgent": "Asistan Bilgilerini Güncelle", "upload": { - "actionFiletip": "Dosyayı Yükle", - "actionTooltip": "Resim Yükle", - "disabled": "Geçerli model görüntü tanıma desteğini desteklemiyor, lütfen modeli değiştirerek kullanın", + "action": { + "fileUpload": "Dosya Yükle", + "folderUpload": "Klasör Yükle", + "imageDisabled": "Mevcut model görsel tanımayı desteklemiyor, lütfen modeli değiştirin ve tekrar deneyin", + "imageUpload": "Görüntü Yükle", + "tooltip": "Yükle" + }, + "clientMode": { + "actionFiletip": "Dosya Yükle", + "actionTooltip": "Yükle", + "disabled": "Mevcut model görsel tanımayı ve dosya analizini desteklemiyor, lütfen modeli değiştirin ve tekrar deneyin" + }, "preview": { "prepareTasks": "Parçaları Hazırlıyor...", "status": { diff --git a/locales/tr-TR/components.json b/locales/tr-TR/components.json index 4d58d7f046810..288a5938d1ddb 100644 --- a/locales/tr-TR/components.json +++ b/locales/tr-TR/components.json @@ -50,6 +50,8 @@ "chunks": { "embeddingStatus": { "empty": "Metin parçaları henüz tamamen vektörleştirilmedi, bu durum anlamsal arama işlevinin kullanılamamasına neden olabilir, arama kalitesini artırmak için lütfen metin parçalarını vektörleştirin", + "error": "Vektörleştirme başarısız oldu", + "errorResult": "Vektörleştirme başarısız oldu, lütfen kontrol edip tekrar deneyin. Başarısız olma nedeni:", "processing": "Metin parçaları vektörleştiriliyor, lütfen bekleyin", "success": "Mevcut metin parçaları tamamen vektörleştirildi" }, diff --git a/locales/vi-VN/chat.json b/locales/vi-VN/chat.json index 2ff6e783fcaa4..6e79e6031797c 100644 --- a/locales/vi-VN/chat.json +++ b/locales/vi-VN/chat.json @@ -62,6 +62,7 @@ "pin": "Ghim", "pinOff": "Bỏ ghim", "rag": { + "referenceChunks": "Trích dẫn nguồn", "userQuery": { "actions": { "delete": "Xóa truy vấn", @@ -155,9 +156,18 @@ }, "updateAgent": "Cập nhật thông tin trợ lý", "upload": { - "actionFiletip": "Tải lên tập tin", - "actionTooltip": "Tải lên hình ảnh", - "disabled": "Mô hình hiện tại không hỗ trợ nhận diện hình ảnh, vui lòng chuyển đổi mô hình trước khi sử dụng", + "action": { + "fileUpload": "Tải lên tệp", + "folderUpload": "Tải lên thư mục", + "imageDisabled": "Mô hình hiện tại không hỗ trợ nhận diện hình ảnh, vui lòng chuyển đổi mô hình để sử dụng", + "imageUpload": "Tải lên hình ảnh", + "tooltip": "Tải lên" + }, + "clientMode": { + "actionFiletip": "Tải lên tệp", + "actionTooltip": "Tải lên", + "disabled": "Mô hình hiện tại không hỗ trợ nhận diện hình ảnh và phân tích tệp, vui lòng chuyển đổi mô hình để sử dụng" + }, "preview": { "prepareTasks": "Chuẩn bị phân đoạn...", "status": { diff --git a/locales/vi-VN/components.json b/locales/vi-VN/components.json index 47803cf9a9356..d3353d8b830aa 100644 --- a/locales/vi-VN/components.json +++ b/locales/vi-VN/components.json @@ -50,6 +50,8 @@ "chunks": { "embeddingStatus": { "empty": "Các khối văn bản chưa được vector hóa hoàn toàn, sẽ dẫn đến chức năng tìm kiếm ngữ nghĩa không khả dụng, để nâng cao chất lượng tìm kiếm, vui lòng vector hóa các khối văn bản", + "error": "Lỗi vector hóa", + "errorResult": "Lỗi vector hóa, vui lòng kiểm tra và thử lại. Nguyên nhân thất bại:", "processing": "Các khối văn bản đang được vector hóa, vui lòng chờ", "success": "Hiện tại tất cả các khối văn bản đã được vector hóa" }, diff --git a/locales/zh-CN/chat.json b/locales/zh-CN/chat.json index 6ba6b72df53a0..f97901878d907 100644 --- a/locales/zh-CN/chat.json +++ b/locales/zh-CN/chat.json @@ -62,6 +62,7 @@ "pin": "置顶", "pinOff": "取消置顶", "rag": { + "referenceChunks": "引用源", "userQuery": { "actions": { "delete": "删除 Query 重写", @@ -155,9 +156,18 @@ }, "updateAgent": "更新助理信息", "upload": { - "actionFiletip": "上传文件", - "actionTooltip": "上传图片", - "disabled": "当前模型不支持视觉识别和文件分析,请切换模型后使用", + "action": { + "fileUpload": "上传文件", + "folderUpload": "上传文件夹", + "imageDisabled": "当前模型不支持视觉识别,请切换模型后使用", + "imageUpload": "上传图片", + "tooltip": "上传" + }, + "clientMode": { + "actionFiletip": "上传文件", + "actionTooltip": "上传", + "disabled": "当前模型不支持视觉识别和文件分析,请切换模型后使用" + }, "preview": { "prepareTasks": "准备分块...", "status": { diff --git a/locales/zh-CN/components.json b/locales/zh-CN/components.json index 5d022c40859ea..03811f6f66cf2 100644 --- a/locales/zh-CN/components.json +++ b/locales/zh-CN/components.json @@ -50,6 +50,8 @@ "chunks": { "embeddingStatus": { "empty": "文本块尚未完全向量化,将导致语义检索功能不可用,为提升检索质量,请对文本块向量化", + "error": "向量化失败", + "errorResult": "向量化失败,请检查后重试。失败原因:", "processing": "文本块正在向量化,请耐心等待", "success": "当前文本块均已向量化" }, diff --git a/locales/zh-TW/chat.json b/locales/zh-TW/chat.json index 04f4ea3151018..61463f69b5c0f 100644 --- a/locales/zh-TW/chat.json +++ b/locales/zh-TW/chat.json @@ -62,6 +62,7 @@ "pin": "置頂", "pinOff": "取消置頂", "rag": { + "referenceChunks": "引用來源", "userQuery": { "actions": { "delete": "刪除 Query 重寫", @@ -155,9 +156,18 @@ }, "updateAgent": "更新助理信息", "upload": { - "actionFiletip": "上傳文件", - "actionTooltip": "上傳圖片", - "disabled": "當前模型不支援視覺識別,請切換模型後使用", + "action": { + "fileUpload": "上傳檔案", + "folderUpload": "上傳資料夾", + "imageDisabled": "當前模型不支援視覺識別,請切換模型後使用", + "imageUpload": "上傳圖片", + "tooltip": "上傳" + }, + "clientMode": { + "actionFiletip": "上傳檔案", + "actionTooltip": "上傳", + "disabled": "當前模型不支援視覺識別和檔案分析,請切換模型後使用" + }, "preview": { "prepareTasks": "準備分塊...", "status": { diff --git a/locales/zh-TW/components.json b/locales/zh-TW/components.json index e4322e5d12155..8a05c43882689 100644 --- a/locales/zh-TW/components.json +++ b/locales/zh-TW/components.json @@ -50,6 +50,8 @@ "chunks": { "embeddingStatus": { "empty": "文本塊尚未完全向量化,將導致語義檢索功能不可用,為提升檢索質量,請對文本塊向量化", + "error": "向量化失敗", + "errorResult": "向量化失敗,請檢查後重試。失敗原因:", "processing": "文本塊正在向量化,請耐心等待", "success": "當前文本塊均已向量化" }, diff --git a/package.json b/package.json index 06588efc94a07..36c31382b7d16 100644 --- a/package.json +++ b/package.json @@ -53,7 +53,8 @@ "pull": "git pull", "release": "semantic-release", "self-hosting:docker": "docker build -t lobe-chat:local .", - "self-hosting:docker-cn": "docker build -t lobe-chat:local --build-arg USE_CN_MIRROR=true .", + "self-hosting:docker-cn": "docker build -t lobe-chat-local --build-arg USE_CN_MIRROR=true .", + "self-hosting:docker-cn@database": "docker build -t lobe-chat-database-local -f Dockerfile.database --build-arg USE_CN_MIRROR=true .", "start": "next start -p 3210", "stylelint": "stylelint \"src/**/*.{js,jsx,ts,tsx}\" --fix", "test": "npm run test-app && npm run test-server", diff --git a/scripts/migrateServerDB/docker.cjs b/scripts/migrateServerDB/docker.cjs index cc39a651af6c0..3346d82d370b8 100644 --- a/scripts/migrateServerDB/docker.cjs +++ b/scripts/migrateServerDB/docker.cjs @@ -2,6 +2,7 @@ const { join } = require('node:path'); const { Pool } = require('pg'); const { drizzle } = require('drizzle-orm/node-postgres'); const migrator = require('drizzle-orm/node-postgres/migrator'); +const { PGVECTOR_HINT } = require('./errorHint'); if (!process.env.DATABASE_URL) { throw new Error('DATABASE_URL is not set, please set it in your environment variables.'); @@ -29,6 +30,11 @@ runMigrations().catch((err) => { '❌ Database migrate failed. Please check your database is valid and DATABASE_URL is set correctly. The error detail is below:', ); console.error(err); + + if (err.message.includes('extension "vector" is not available')) { + console.info(PGVECTOR_HINT); + } + // eslint-disable-next-line unicorn/no-process-exit process.exit(1); }); diff --git a/scripts/migrateServerDB/errorHint.js b/scripts/migrateServerDB/errorHint.js new file mode 100644 index 0000000000000..facc82dede865 --- /dev/null +++ b/scripts/migrateServerDB/errorHint.js @@ -0,0 +1,17 @@ +const PGVECTOR_HINT = `⚠️ Database migrate failed due to \`pgvector\` extension not found. Please install the \`pgvector\` extension on your postgres instance. + +1) if you are using docker postgres image: +you can just use \`pgvector/pgvector:pg16\` image instead of \`postgres\`, e.g: + +\`\`\` +docker run -p 5432:5432 -d --name pg -e POSTGRES_PASSWORD=mysecretpassword pgvector/pgvector:pg16 +\`\`\` + +2) if you are using cloud postgres instance, please contact your cloud provider for help. + +if you have any other question, please open issue here: https://github.com/lobehub/lobe-chat/issues +`; + +module.exports = { + PGVECTOR_HINT, +}; diff --git a/scripts/migrateServerDB/index.ts b/scripts/migrateServerDB/index.ts index d57e051b0bfeb..4858f966c41cc 100644 --- a/scripts/migrateServerDB/index.ts +++ b/scripts/migrateServerDB/index.ts @@ -3,6 +3,7 @@ import * as migrator from 'drizzle-orm/neon-serverless/migrator'; import { join } from 'node:path'; import { serverDB } from '../../src/database/server/core/db'; +import { PGVECTOR_HINT } from './errorHint'; // Read the `.env` file if it exists, or a file specified by the // dotenv_config_path parameter that's passed to Node.js @@ -24,6 +25,11 @@ if (connectionString) { // eslint-disable-next-line unicorn/prefer-top-level-await runMigrations().catch((err) => { console.error('❌ Database migrate failed:', err); + + if ((err.message as string).includes('extension "vector" is not available')) { + console.info(PGVECTOR_HINT); + } + // eslint-disable-next-line unicorn/no-process-exit process.exit(1); }); diff --git a/src/app/(main)/chat/(workspace)/@conversation/features/ChatInput/Desktop/FilePreview/FileItem/Content.tsx b/src/app/(main)/chat/(workspace)/@conversation/features/ChatInput/Desktop/FilePreview/FileItem/Content.tsx new file mode 100644 index 0000000000000..0ce00b5a34af2 --- /dev/null +++ b/src/app/(main)/chat/(workspace)/@conversation/features/ChatInput/Desktop/FilePreview/FileItem/Content.tsx @@ -0,0 +1,37 @@ +import { Image } from '@lobehub/ui'; +import { createStyles } from 'antd-style'; +import { memo } from 'react'; + +import FileIcon from '@/components/FileIcon'; +import { UploadFileItem } from '@/types/files/upload'; + +const useStyles = createStyles(({ css }) => ({ + image: css` + margin-block: 0 !important; + box-shadow: none; + + img { + object-fit: contain; + } + `, + video: css` + overflow: hidden; + border-radius: 8px; + `, +})); + +const Content = memo(({ file, previewUrl }) => { + const { styles } = useStyles(); + + if (file.type.startsWith('image')) { + return {file.name}; + } + + if (file.type.startsWith('video')) { + return