From ecf4891ee4a26f898b9d3cdc79e69edb65f7ff80 Mon Sep 17 00:00:00 2001 From: Lukas Geiger Date: Sun, 25 Oct 2026 09:24:20 +0100 Subject: [PATCH 1/2] feat(i18n): add eleven-language PWA and README editions Signed-off-by: Lukas Geiger --- README.md | 93 +----- README_ar.md | 318 ++++++++++++++++++ README_bn.md | 331 +++++++++++++++++++ README_de.md | 343 ++++++++++++++++---- README_es.md | 331 +++++++++++++++++++ README_fr.md | 332 +++++++++++++++++++ README_hi.md | 329 +++++++++++++++++++ README_ja.md | 317 ++++++++++++++++++ README_pt.md | 332 +++++++++++++++++++ README_ru.md | 333 +++++++++++++++++++ README_zh.md | 322 ++++++++++++++++++ web_companion/PWA_TESTPLAN.md | 5 + web_companion/README.md | 5 +- web_companion/app.css | 19 +- web_companion/app.js | 25 +- web_companion/index.html | 7 +- web_companion/library.js | 124 ++++++- web_companion/sw.js | 3 +- web_companion/tests/library.test.mjs | 97 +++++- web_companion/tests/pwa.test.mjs | 16 +- web_companion/ui-locales.js | 468 +++++++++++++++++++++++++++ 21 files changed, 3965 insertions(+), 185 deletions(-) create mode 100644 README_ar.md create mode 100644 README_bn.md create mode 100644 README_es.md create mode 100644 README_fr.md create mode 100644 README_hi.md create mode 100644 README_ja.md create mode 100644 README_pt.md create mode 100644 README_ru.md create mode 100644 README_zh.md create mode 100644 web_companion/ui-locales.js diff --git a/README.md b/README.md index b8f2dad..18a97d1 100644 --- a/README.md +++ b/README.md @@ -9,14 +9,13 @@ [![Umbrella: open-bricks](https://img.shields.io/badge/Umbrella-open--bricks-blue.svg)](https://github.com/open-bricks) [![LLM Context: llms.txt](https://img.shields.io/badge/LLM%20Context-llms.txt-blue.svg)](llms.txt) -[English](README.md) | [Deutsch](README_de.md) +[English](README.md) | [Deutsch](README_de.md) | [Español](README_es.md) | [简体中文](README_zh.md) | [日本語](README_ja.md) | [Русский](README_ru.md) | [Français](README_fr.md) | [हिन्दी](README_hi.md) | [العربية](README_ar.md) | [বাংলা](README_bn.md) | [Português](README_pt.md) > **Local-first document notebook for research and report generation with configurable local or remote language models.** > [!NOTE] > **For AI Agents & Automated Workflows:** > NoteSpaceLLM provides a machine-readable architecture and feature overview in [`llms.txt`](llms.txt). -> The Python and Web Companion test suites are configured to use isolated local data and avoid external provider calls. NoteSpaceLLM is a local-first PySide6 desktop app for working with PDFs, Word files, Markdown, mail exports, notes, and research folders. It keeps @@ -96,7 +95,7 @@ graph TD ## Features - **Document management**: Add files and directories via drag & drop -- **Auto-indexing**: New documents are processed and indexed immediately for RAG +- **Automatic extraction and indexing**: New documents are processed right away and prepared for RAG. - **Selective analysis**: Check/uncheck documents to include or exclude from reports - **Sub-queries**: Right-click a document for targeted document-specific research - **Workflow visualization**: Graphical overview of the report pipeline @@ -105,7 +104,7 @@ graph TD - **Multi-format export**: Output to MD, PDF, DOCX, HTML, TXT - **Prompt export**: Save the report context as a Markdown prompt for external LLM workflows - **Ollama connection profiles**: App-wide provider settings can be reused across projects -- **Language behavior**: The desktop interface is currently primarily German. The Web/PWA Companion has a six-language UI (de, en, es, zh, ja, ru); the report-language setting changes generated content, not the desktop UI. +- **Language support**: The desktop GUI has no user-selectable language; its interface is currently primarily German. The Web/PWA Companion has a persistent UI-language selector for German, English, Spanish, Simplified Chinese, Japanese, Russian, French, Hindi, Arabic, Bengali and Portuguese. The project language field is included in workspace exports; it is not wired to a desktop UI or report-language selector. - **Umlaut-safe UI**: German UI strings use native umlauts; the translation scanner avoids English false positives - **Profiles**: Reusable output-format combinations @@ -349,90 +348,6 @@ own license is AGPL-3.0-only. [KnowledgeDigest](https://github.com/file-bricks/KnowledgeDigest) is a separate local knowledge database with SQLite/FTS5 search and optional LLM summaries; it is not integrated with NoteSpaceLLM. ---- - -## Deutsch - -Eine lokale Dokumenten- und Rechercheanwendung mit konfigurierbaren lokalen oder externen Sprachmodellen. - -### Features - -- **Dokumentenverwaltung**: Dateien und Verzeichnisse per Drag & Drop hinzufügen -- **Automatische Extraktion & Auto-Indexierung**: Neue Dokumente werden direkt verarbeitet und für RAG vorbereitet -- **Selektive Auswahl**: Dokumente für Berichterstellung auswählen/abwählen -- **Detailrecherchen**: Rechtsklick für dokumentspezifische Analysen (Sub-Queries) -- **Workflow-Visualisierung**: Grafische Darstellung des Berichtsprozesses -- **Chat-Interface**: Interaktives Chatten über die Dokumente mit LLM -- **Claude Code Integration**: Wahlweise strukturierte API-Antworten oder Übergabe an eine interaktive Claude-Code-Session -- **Multi-Format-Export**: Ausgabe in MD, PDF, DOCX, HTML, TXT -- **Prompt-Export**: Berichtskontext als Markdown-Prompt für externe LLM-Workflows exportieren -- **Ollama-Verbindungsprofile**: Appweite Provider-Einstellungen können in mehreren Projekten verwendet werden -- **Sprachoberflächen**: Die Desktop-Oberfläche ist derzeit überwiegend deutsch. Der Web/PWA-Companion bietet UI-Texte in Deutsch, Englisch, Spanisch, Chinesisch, Japanisch und Russisch; die Berichtssprache ändert nicht die Desktop-Oberfläche. -- **Umlaut-sichere Oberfläche**: Deutsche UI-Texte verwenden echte Umlaute; der Übersetzungs-Scan vermeidet englische False Positives -- **Profile**: Wiederverwendbare Ausgabeformat-Kombinationen - -### Installation - -```bash -cd NoteSpaceLLM -pip install -r requirements.txt -python main.py -``` - -Unter Windows alternativ per `start.bat`. Build: `build_exe.bat` - -### LLM-Konfiguration - -#### Ollama (Lokal — Empfohlen) - -1. [Ollama installieren](https://ollama.ai) -2. Modell herunterladen: `ollama pull llama3` -3. In der App: Menü > LLM > Ollama verwenden - -#### Ollama (Remote-Server) - -Konfigurierbare Server-URL und Modell werden in den appweiten LLM-Einstellungen -oder im ausgewählten Verbindungsprofil verwaltet, nicht pro Projekt. Kompatibel -mit [ellmos-stack](https://github.com/ellmos-ai/ellmos-stack). - -Gespeicherte API-Schlüssel verwendet die App über den nativen Zugangsdienst des -Betriebssystems. `NOTESPACELLM_OLLAMA_API_KEY` überschreibt den gespeicherten -Schlüssel, wird aber nie gespeichert. Alte Klartextschlüssel werden erst nach -einer ausdrücklich gestarteten Migration verwendet. Ein entfernter Ollama-Server -erhält Dokumenttext für Embeddings sowie Prompts und Kontext für die Generierung; -der API-Schlüssel wird als Bearer-Header an die konfigurierte URL gesendet. HTTP -verschlüsselt diese Daten nicht. - -#### OpenAI / Anthropic (Claude) - -```bash -export OPENAI_API_KEY="..." -export ANTHROPIC_API_KEY="..." -``` - -### Verwendung - -1. Dokumente hinzufügen (Drag & Drop oder Buttons) -2. Dokumente auswählen (Checkboxen) -3. Optional: Detailrecherchen per Rechtsklick -4. Hauptfragestellung eingeben -5. Workflow/Berichtsart wählen -6. „Bericht erstellen" klicken -7. Ergebnis exportieren (MD, PDF, DOCX, HTML, TXT) -8. Optional: „Prompt exportieren" für externe LLM-Workflows - -### Plattformstrategie - -Desktop-App als autoritative Vollversion. Web/PWA-Companion für Android, iOS und Browser über `notespacellm-workspace-v1.json`. Details im [Exportformat](EXPORTFORMAT.md). - -## Verwandtes Projekt - -[KnowledgeDigest](https://github.com/file-bricks/KnowledgeDigest) ist eine eigenständige lokale Wissensdatenbank mit SQLite/FTS5-Suche und optionalen LLM-Zusammenfassungen; sie ist nicht in NoteSpaceLLM integriert. - ---- - -## Hinweise / Notes - -Die Bedingungen der Projektlizenz stehen in [LICENSE](LICENSE). Es gibt keine Zusage für laufende Wartung oder Verfügbarkeit. +## License and maintenance notice See [LICENSE](LICENSE) for the project's license terms. The maintainers do not promise ongoing maintenance or availability. diff --git a/README_ar.md b/README_ar.md new file mode 100644 index 0000000..dbbefff --- /dev/null +++ b/README_ar.md @@ -0,0 +1,318 @@ + +NoteSpaceLLM Banner + +# NoteSpaceLLM + +[![License: AGPL v3](https://img.shields.io/badge/License-AGPL%20v3-blue.svg)](LICENSE) +[![Python 3.10+](https://img.shields.io/badge/python-3.10+-blue.svg)](https://www.python.org/) +[![Platform: Windows](https://img.shields.io/badge/platform-Windows-lightgrey.svg)]() +[![Ecosystem: file-bricks](https://img.shields.io/badge/Ecosystem-file--bricks-blue.svg)](https://github.com/file-bricks) +[![Umbrella: open-bricks](https://img.shields.io/badge/Umbrella-open--bricks-blue.svg)](https://github.com/open-bricks) +[![LLM Context: llms.txt](https://img.shields.io/badge/LLM%20Context-llms.txt-blue.svg)](llms.txt) + +[English](README.md) | [Deutsch](README_de.md) | [Español](README_es.md) | [简体中文](README_zh.md) | [日本語](README_ja.md) | [Русский](README_ru.md) | [Français](README_fr.md) | [हिन्दी](README_hi.md) | [العربية](README_ar.md) | [বাংলা](README_bn.md) | [Português](README_pt.md) + +> **دفتر مستندات يعتمد على المعالجة المحلية أولاً للبحث وإنشاء التقارير، مع نماذج لغوية محلية أو عن بُعد قابلة للتهيئة.** + +> [!NOTE] +> **لوكلاء الذكاء الاصطناعي وسير العمل الآلي:** +> يوفّر NoteSpaceLLM نظرة عامة على البنية والميزات بصيغة قابلة للقراءة الآلية في [`llms.txt`](llms.txt). + +NoteSpaceLLM هو تطبيق سطح مكتب مبني على PySide6 يعتمد على المعالجة المحلية أولاً للعمل مع ملفات PDF وملفات Word وMarkdown وتصدير البريد والملاحظات ومجلدات الأبحاث. يحتفظ التطبيق ببيانات المشروع محلياً افتراضياً، ويدعم سير عمل Ollama وOpenAI وAnthropic وClaude Code محلياً أو عن بُعد، ويصدّر نتائج التحليل إلى Markdown وPDF وDOCX وHTML وTXT. تتوفر الآن أيضاً واجهة Web/PWA خفيفة المعروفة باسم Companion لمراجعة مساحات العمل المُصدَّرة على Android وiOS والأجهزة التي تعمل عبر المتصفح دون رفع المستندات إلى أي خادم. + +**عبارات البحث الأنسب:** بديل NotebookLM، تحليل المستندات بتقنية RAG المحلية، الدردشة مع المستندات محلياً، أداة أبحاث مبنية على PySide6، مولّد تقارير بنماذج محلية، سير عمل المستندات القائم على المعالجة المحلية أولاً. + +## البدء السريع + +```bash +git clone https://github.com/file-bricks/NoteSpaceLLM.git +cd NoteSpaceLLM +pip install -r requirements.txt +python main.py +``` + +على نظام Windows يمكنك أيضاً التشغيل عبر `start.bat`. يمكن إنشاء مشغّل Windows محلي باستخدام `build_exe.bat`. + +لإعداد محلي موجَّه يثبّت المتطلبات وينشئ مجلدات بدء سير العمل والملفات الشخصية، شغّل `python setup_environment.py` صراحةً. أما بيانات الحزمة وعمليات البناء فتستخدم نقطة الدخول المنفصلة في setuptools ولا تُشغّله. + +شغّل الاختبارات وفحوص الترجمة الأولية بالأمر: + +```bash +pytest +python -m compileall -q main.py manage_translations.py setup_environment.py translator.py src +cd web_companion +npm test +``` + +## البنية المعمارية للنظام + +```mermaid +graph TD + subgraph UI ["PySide6 Desktop Application"] + DP["Document Panel (Drag & Drop)"] + WP["Workflow & Report Builder"] + CP["Interactive Chat Panel"] + OP["Multi-Format Exporter"] + end + + subgraph Engine ["Local RAG Engine"] + TE["Text Extractor (PDF/DOCX/TXT/XLSX/EML)"] + CDB[("ChromaDB Vector Store")] + RM["Report Generator & Prompts"] + end + + subgraph LLM ["LLM Integrations"] + OL["Ollama (Local / Remote)"] + OAI["OpenAI API"] + ANT["Anthropic Claude"] + CC["Claude Code CLI"] + end + + subgraph PWA ["Web / PWA Companion"] + JSON["notespacellm-workspace-v1.json"] + SW["PWA Service Worker & Mobile Review"] + end + + DP --> TE + TE --> CDB + WP --> RM + RM --> CDB + RM --> LLM + CP --> LLM + OP --> JSON + JSON --> SW +``` + +## الميزات + +- **إدارة المستندات**: إضافة الملفات والمجلدات عبر السحب والإفلات +- **الاستخراج والفهرسة التلقائيان**: تتم معالجة المستندات الجديدة فوراً وتجهيزها لتقنية RAG. +- **التحليل الانتقائي**: حدّد أو ألغِ تحديد المستندات لتضمينها في التقارير أو استبعادها منها +- **الاستعلامات الفرعية**: انقر بالزر الأيمن على مستند لإجراء بحث موجَّه خاص بذلك المستند +- **تصوّر سير العمل**: نظرة رسومية عامة على مسار إنشاء التقرير +- **واجهة الدردشة**: محادثة تفاعلية مع المستندات المحمّلة باستخدام أي نموذج لغوي +- **تكامل Claude Code**: استجابات API منظَّمة أو تسليم الجلسة إلى جلسة Claude Code تفاعلية +- **التصدير متعدد الصيغ**: الإخراج بصيغ MD وPDF وDOCX وHTML وTXT +- **تصدير المطالبات**: حفظ سياق التقرير كمطالبة Markdown لسير عمل النماذج اللغوية الخارجية +- **ملفات تعريف اتصال Ollama**: يمكن إعادة استخدام إعدادات الموفّر على مستوى التطبيق عبر المشاريع +- **دعم اللغات**: لا تتيح واجهة سطح المكتب اختيار لغة من قِبل المستخدم، وواجهتها ألمانية في الغالب حالياً. تتضمن واجهة Web/PWA Companion محدِّد لغة واجهة دائم يشمل الألمانية والإنجليزية والإسبانية والصينية المبسطة واليابانية والروسية والفرنسية والهندية والعربية والبنغالية والبرتغالية. يُدرج حقل لغة المشروع في عمليات تصدير مساحات العمل؛ ولا يُربط بواجهة سطح المكتب أو بمحدِّد لغة التقارير. +- **واجهة آمنة للأحرف الخاصة**: تستخدم سلاسل واجهة المستخدم الألمانية الأحرف الخاصة بصيغتها الأصلية؛ ويتجنب الماسح الخاص بالترجمة الإيجابيات الكاذبة الإنجليزية +- **ملفات التعريف**: مجموعات قابلة لإعادة الاستخدام من صيغ الإخراج + +## التثبيت + +```bash +# Clone or copy the project folder +cd NoteSpaceLLM + +# Install dependencies +pip install -r requirements.txt + +# Start the app +python main.py +``` + +تحقق من التبعيات: + +```bash +python main.py --check +``` + +## تهيئة النماذج اللغوية + +### Ollama (محلي — موصى به) + +1. [ثبّت Ollama](https://ollama.ai) +2. نزّل نموذجاً: `ollama pull llama3` +3. في التطبيق: القائمة > LLM > Use Ollama + +### Ollama (خادم عن بُعد) + +يمكن لـ NoteSpaceLLM الاتصال بخادم Ollama عن بُعد، مثلاً عبر [ellmos-stack](https://github.com/ellmos-ai/ellmos-stack): + +1. في التطبيق: القائمة > LLM > Settings +2. **عنوان Ollama:** `http://your-server:11435` (أو المنفذ الخاص بك) +3. **مفتاح API:** إذا كان الخادم خلف وكيل مصادقة (موصى به) + +> **نصيحة:** لا يتضمن Ollama مصادقة مدمجة. للوصول عن بُعد، استخدم وكيلاً عكسياً (مثل Nginx) مع مفتاح API أو Basic Auth. + +تُهيَّأ نقطة نهاية Ollama والنموذج في إعدادات التطبيق العامة أو في ملف تعريف الاتصال المحدد، لا لكل مشروع على حدة. تُخزَّن مفاتيح API عبر مخزن بيانات الاعتماد في نظام التشغيل عند حفظها داخل التطبيق. يتجاوز متغيّر البيئة الاختياري `NOTESPACELLM_OLLAMA_API_KEY` المفتاح المحفوظ، ولا يكتبه التطبيق أبداً. لا تُرسَل المفاتيح القديمة المخزّنة كنص عادي إلا بعد أن تنقلها صراحةً من الإعدادات. + +عندما يكون خادم Ollama المُهيَّأ بعيدًا، فإنه يتلقى نص المستندات المستخدم في التضمينات (embeddings)، كما يتلقى المطالبات (prompts) والسياق المرسل للتوليد. يُرسَل مفتاح API إلى عنوان URL المُهيَّأ على هيئة ترويسة Bearer. لا يُشفِّر بروتوكول HTTP العادي المحتوى ولا بيانات الاعتماد، أما سلوك HTTPS فيعتمد على نقطة النهاية وشهادتها. + +### OpenAI + +```bash +export OPENAI_API_KEY="" +``` + +### Anthropic (Claude) + +```bash +export ANTHROPIC_API_KEY="" +``` + +### Claude Code + +يتطلب واجهة سطر الأوامر المحلية: + +```bash +npm install -g @anthropic-ai/claude-code +``` + +يتوفر في التطبيق وضعان: +- **وضع API**: تُعاد الاستجابة المنظَّمة مباشرة إلى NoteSpaceLLM +- **وضع الدردشة**: تُسلَّم المطالبة إلى وحدة تحكم تفاعلية في Claude Code + +## الاستخدام + +### 1. إضافة المستندات + +- **السحب والإفلات**: أسقِط الملفات أو المجلدات في اللوحة اليسرى +- **الزر**: "Add files" أو "Add folder" + +### 2. تحديد المستندات + +- مربع الاختيار: تضمين المستندات في التحليل أو استبعادها منه +- الأزرار: "All" / "None" للتحديد الجماعي + +### 3. الاستعلامات الفرعية (اختياري) + +انقر بالزر الأيمن على مستند: +- **Create summary**: ملخص تلقائي +- **Extract information**: البحث عن بيانات محددة +- **Analyse**: تحليل موجَّه +- **Ask question**: سؤال محدد عن المستند + +### 4. تحديد السؤال الرئيسي + +أدخِل سؤال البحث المحوري في لوحة سير العمل. + +### 5. اختيار نوع سير العمل/التقرير + +- **Analysis**: تحليل شامل مع توصيات +- **Summary**: ملخص قصير +- **Research report**: بنية أكاديمية +- **Comparison**: مقارنة منهجية للمستندات + +### 6. إنشاء التقرير + +انقر "Create report"، وسيظهر الناتج في اللوحة اليمنى. + +### 7. التصدير + +اختر تنسيقات المخرجات وانقر "Export". + +### 8. تصدير المطالبة + +استخدم **"Export prompt"** لحفظ سياق العمل الحالي كملف Markdown لاستخدامه في Claude Code أو في سير عمل LLM آخر. + +## الرفيق على الويب/PWA + +تحت `web_companion/` يوجد مسار Companion للقراءة فقط يعمل على Android وiOS والمتصفح. يستورد ملفات `notespacellm-workspace-v1.json` المُصدَّرة محليًا في المتصفح، ويعرض التقرير وبيانات المستندات الوصفية والمقتطفات المحددة، ويمكنه تصدير ملاحظات المراجعة بصيغة Markdown. تبقى مساحة العمل في جلسة المتصفح الحالية، ويجب إعادة استيرادها بعد إعادة فتح الصفحة؛ ولا يُحفَظ محليًا إلا ملاحظات المراجعة وإعداد لغة الواجهة. + +اختبار المتصفح المحلي: + +```powershell +$env:PYTHONIOENCODING='utf-8' +python -m http.server 8765 -d web_companion +``` + +اختبارات Companion السريعة: + +```powershell +cd web_companion +node --test tests/library.test.mjs +``` + +خطة اختبار PWA لـ Android/iOS موثقة في `web_companion/PWA_TESTPLAN.md`. + +## استراتيجية المنصات + +تطبيق سطح المكتب هو التطبيق الكامل للمستندات المحلية وفهرس RAG واتصالات المزودين. يتوفر Web/PWA Companion على Android وiOS والمتصفح لمراجعة ملف `notespacellm-workspace-v1.json` الذي يُنشئه المستخدم. +للمواد الحساسة، هيِّئ نقاط نهاية محلية للنموذج والتضمينات، وراجع الملفات المُصدَّرة قبل مشاركتها. عقد التبادل موثق في `EXPORTFORMAT.md`. + +### اختبارات المصدر على macOS وLinux + +تعمل اختبارات مصدر إضافية في GitHub Actions: +- `tests/platform_smoke.py` — تشغيل PySide6 دون واجهة، واستيراد المستندات، وتصدير التقرير، وتصدير JSON لمساحة العمل +- `tests/linux_platform_smoke.py` — غلاف خاص بـ Linux فوق `ubuntu-latest` + +## بنية المشروع + +``` +NoteSpaceLLM/ +├── main.py # Entry point +├── requirements.txt # Dependencies +├── translator.py # Translation-catalog scan/helper; no desktop language switch +├── locales/ # Catalog inputs for the translation helper +├── src/ +│ ├── core/ # Core functionality +│ │ ├── document_manager.py +│ │ ├── text_extractor.py +│ │ ├── sub_query.py +│ │ └── project.py +│ ├── gui/ # PySide6 UI +│ │ ├── main_window.py +│ │ ├── document_panel.py +│ │ ├── workflow_panel.py +│ │ ├── chat_panel.py +│ │ └── output_panel.py +│ ├── llm/ # LLM integration (local + remote) +│ │ ├── client.py +│ │ ├── ollama_client.py +│ │ ├── openai_client.py +│ │ └── anthropic_client.py +│ └── reports/ # Report generation +│ ├── generator.py +│ ├── templates.py +│ └── exporter.py +├── web_companion/ # PWA Companion +├── data/ # Project data (gitignored) +├── workflows/ # Workflow definitions +├── profiles/ # Output profiles +└── output/ # Exported reports +``` + +## صيغ الملفات المدعومة + +| الصيغة | القراءة | الكتابة | +|--------|---------|---------| +| PDF | ✅ | ✅ | +| DOCX | ✅ | ✅ | +| DOC | ⚠️ | — | +| TXT | ✅ | ✅ | +| MD | ✅ | ✅ | +| XLSX | ✅ | — | +| HTML | — | ✅ | +| EML | ✅ | — | +| MSG | ✅ | — | + +⚠️ يتطلب ملف .doc الأداة antiword أو LibreOffice + +## الخصوصية + +يخزّن NoteSpaceLLM بيانات المشروع وفهارس المستندات والملفات الشخصية وإعدادات سير العمل والتصديرات محليًا في `data/` و`profiles/` و`workflows/` و`output/` و`chroma_db/`. هذه المجلدات مستثناة من Git عمدًا. + +عند تفعيل مزودي LLM الخارجيين (OpenAI وAnthropic وClaude Code وOllama البعيد)، قد تُرسَل المطالبات ومقتطفات المستندات المحددة إلى تلك الخدمات. كما يتلقى نقطة نهاية Ollama البعيدة نص المستندات المستخدم في التضمينات. للمستندات الحساسة، استخدم نقاط نهاية محلية للنموذج والتضمين، وراجع التقارير المُصدَّرة وسجل الدردشة والمقتطفات المحددة قبل مشاركتها؛ فتصديرات مساحة العمل غير مجهَّلة الهوية. + +## نصائح + +1. **مجموعات المستندات الكبيرة**: حدِّد المستندات ذات الصلة فقط أولًا للحصول على نتائج أسرع +2. **الاستعلامات الفرعية**: استخدم استعلامات فرعية موجَّهة للحصول على تحليل أعلى جودة +3. **Ollama**: تتيح نقطة نهاية Ollama المحلية المعالجة دون اتصال. +4. **ترتيب سير العمل**: يمكن إعادة ترتيب الخطوات في لوحة سير العمل + +## الترخيص + +AGPL-3.0-only — انظر [LICENSE](LICENSE) + +يُعلن هذا المشروع استخدام PySide6 وPyMuPDF. انظر مراجع التراخيص الأصلية المختارة في [THIRD_PARTY_LICENSES.md](THIRD_PARTY_LICENSES.md)؛ أما ترخيص المشروع نفسه فهو AGPL-3.0-only. + +## مشروع ذو صلة + +[KnowledgeDigest](https://github.com/file-bricks/KnowledgeDigest) قاعدة معرفية محلية منفصلة تعتمد على البحث SQLite/FTS5 وملخصات LLM اختيارية؛ وهي غير مدمجة مع NoteSpaceLLM. + +## إشعار الترخيص والصيانة + +راجع [LICENSE](LICENSE) لشروط ترخيص المشروع. لا يَعِد القائمون على المشروع بصيانة مستمرة أو بتوافر دائم. diff --git a/README_bn.md b/README_bn.md new file mode 100644 index 0000000..9113ae2 --- /dev/null +++ b/README_bn.md @@ -0,0 +1,331 @@ + +NoteSpaceLLM Banner + +# NoteSpaceLLM + +[![License: AGPL v3](https://img.shields.io/badge/License-AGPL%20v3-blue.svg)](LICENSE) +[![Python 3.10+](https://img.shields.io/badge/python-3.10+-blue.svg)](https://www.python.org/) +[![Platform: Windows](https://img.shields.io/badge/platform-Windows-lightgrey.svg)]() +[![Ecosystem: file-bricks](https://img.shields.io/badge/Ecosystem-file--bricks-blue.svg)](https://github.com/file-bricks) +[![Umbrella: open-bricks](https://img.shields.io/badge/Umbrella-open--bricks-blue.svg)](https://github.com/open-bricks) +[![LLM Context: llms.txt](https://img.shields.io/badge/LLM%20Context-llms.txt-blue.svg)](llms.txt) + +[English](README.md) | [Deutsch](README_de.md) | [Español](README_es.md) | [简体中文](README_zh.md) | [日本語](README_ja.md) | [Русский](README_ru.md) | [Français](README_fr.md) | [हिन्दी](README_hi.md) | [العربية](README_ar.md) | [বাংলা](README_bn.md) | [Português](README_pt.md) + +> **গবেষণা ও প্রতিবেদন তৈরির জন্য স্থানীয়-প্রথম (local-first) নথি নোটবুক, যেখানে কনফিগারযোগ্য স্থানীয় বা দূরবর্তী ভাষা মডেল ব্যবহার করা যায়।** + +> [!NOTE] +> **AI এজেন্ট ও স্বয়ংক্রিয় ওয়ার্কফ্লোর জন্য:** +> NoteSpaceLLM [`llms.txt`](llms.txt)-এ একটি মেশিন-পাঠযোগ্য আর্কিটেকচার ও বৈশিষ্ট্যের সংক্ষিপ্ত বিবরণ প্রদান করে। + +NoteSpaceLLM হলো একটি স্থানীয়-প্রথম PySide6 ডেস্কটপ অ্যাপ্লিকেশন, যা PDF, +Word ফাইল, Markdown, মেইল এক্সপোর্ট, নোট এবং গবেষণা ফোল্ডারের সাথে কাজ করতে +ব্যবহৃত হয়। এটি ডিফল্টভাবে প্রকল্পের ডেটা স্থানীয়ভাবে রাখে, স্থানীয় বা দূরবর্তী +Ollama, OpenAI, Anthropic ও Claude Code ওয়ার্কফ্লো সমর্থন করে এবং বিশ্লেষণের +ফলাফল Markdown, PDF, DOCX, HTML ও TXT ফরম্যাটে রপ্তানি করে। একটি হালকা Web/PWA +Companion এখন উপলব্ধ, যার মাধ্যমে কোনো সার্ভারে নথি আপলোড না করেই Android, iOS ও +ব্রাউজার ডিভাইসে রপ্তানিকৃত ওয়ার্কস্পেস পর্যালোচনা করা যায়। + +**সেরা-মানানসই অনুসন্ধান:** NotebookLM বিকল্প, স্থানীয় RAG নথি বিশ্লেষণ, +স্থানীয় নথি চ্যাট, PySide6 গবেষণা টুল, স্থানীয়-মডেল প্রতিবেদন জেনারেটর, +স্থানীয়-প্রথম নথি ওয়ার্কফ্লো। + +## দ্রুত শুরু + +```bash +git clone https://github.com/file-bricks/NoteSpaceLLM.git +cd NoteSpaceLLM +pip install -r requirements.txt +python main.py +``` + +Windows-এ আপনি `start.bat` দিয়েও চালু করতে পারেন। একটি স্থানীয় Windows লঞ্চার `build_exe.bat` ব্যবহার করে তৈরি করা যায়। + +প্রয়োজনীয় নির্ভরতা ইনস্টল করে এবং স্টার্টার ওয়ার্কফ্লো/প্রোফাইল ফোল্ডার তৈরি করে +এমন একটি নির্দেশিত স্থানীয় বুটস্ট্র্যাপের জন্য স্পষ্টভাবে `python setup_environment.py` চালান। +প্যাকেজ মেটাডেটা ও বিল্ডে আলাদা setuptools এন্ট্রি পয়েন্ট ব্যবহৃত হয় এবং তা এটি চালায় না। + +টেস্ট চালাতে এবং কম্পাইল স্মোক চেক করতে: + +```bash +pytest +python -m compileall -q main.py manage_translations.py setup_environment.py translator.py src +cd web_companion +npm test +``` + +## সিস্টেম আর্কিটেকচার + +```mermaid +graph TD + subgraph UI ["PySide6 Desktop Application"] + DP["Document Panel (Drag & Drop)"] + WP["Workflow & Report Builder"] + CP["Interactive Chat Panel"] + OP["Multi-Format Exporter"] + end + + subgraph Engine ["Local RAG Engine"] + TE["Text Extractor (PDF/DOCX/TXT/XLSX/EML)"] + CDB[("ChromaDB Vector Store")] + RM["Report Generator & Prompts"] + end + + subgraph LLM ["LLM Integrations"] + OL["Ollama (Local / Remote)"] + OAI["OpenAI API"] + ANT["Anthropic Claude"] + CC["Claude Code CLI"] + end + + subgraph PWA ["Web / PWA Companion"] + JSON["notespacellm-workspace-v1.json"] + SW["PWA Service Worker & Mobile Review"] + end + + DP --> TE + TE --> CDB + WP --> RM + RM --> CDB + RM --> LLM + CP --> LLM + OP --> JSON + JSON --> SW +``` + +## বৈশিষ্ট্যসমূহ + +- **নথি ব্যবস্থাপনা**: ড্র্যাগ ও ড্রপের মাধ্যমে ফাইল ও ডিরেক্টরি যোগ করুন +- **স্বয়ংক্রিয় নিষ্কাশন ও ইনডেক্সিং**: নতুন নথি সঙ্গে সঙ্গে প্রক্রিয়া করা হয় এবং RAG-এর জন্য প্রস্তুত করা হয়। +- **নির্বাচনভিত্তিক বিশ্লেষণ**: প্রতিবেদনে অন্তর্ভুক্ত বা বাদ দিতে নথি চেক/আনচেক করুন +- **উপ-প্রশ্ন (Sub-queries)**: নির্দিষ্ট নথি-ভিত্তিক লক্ষ্যযুক্ত গবেষণার জন্য কোনো নথিতে ডান-ক্লিক করুন +- **ওয়ার্কফ্লো ভিজ্যুয়ালাইজেশন**: প্রতিবেদন পাইপলাইনের গ্রাফিক্যাল ওভারভিউ +- **চ্যাট ইন্টারফেস**: যেকোনো LLM দিয়ে লোড করা নথির উপর ইন্টারেক্টিভ চ্যাট +- **Claude Code ইন্টিগ্রেশন**: কাঠামোবদ্ধ API প্রতিক্রিয়া বা একটি ইন্টারেক্টিভ Claude Code সেশনে হস্তান্তর +- **মাল্টি-ফরম্যাট রপ্তানি**: MD, PDF, DOCX, HTML, TXT-এ আউটপুট +- **প্রম্পট রপ্তানি**: বাহ্যিক LLM ওয়ার্কফ্লোর জন্য প্রতিবেদনের প্রসঙ্গ Markdown প্রম্পট হিসেবে সংরক্ষণ করুন +- **Ollama সংযোগ প্রোফাইল**: অ্যাপ-ব্যাপী প্রদানকারী সেটিংস বিভিন্ন প্রকল্পে পুনর্ব্যবহার করা যায় +- **ভাষা সমর্থন**: ডেস্কটপ GUI-তে কোনো ব্যবহারকারী-নির্বাচনযোগ্য ভাষা নেই; এর ইন্টারফেস বর্তমানে মূলত জার্মান। Web/PWA Companion-এ জার্মান, ইংরেজি, স্পেনীয়, সরলীকৃত চীনা, জাপানি, রুশ, ফরাসি, হিন্দি, আরবি, বাংলা ও পর্তুগিজ ভাষার জন্য একটি স্থায়ী UI-ভাষা নির্বাচক রয়েছে। প্রকল্পের ভাষা ক্ষেত্রটি ওয়ার্কস্পেস রপ্তানিতে অন্তর্ভুক্ত থাকে; এটি ডেস্কটপ UI বা প্রতিবেদন-ভাষা নির্বাচকের সাথে সংযুক্ত নয়। +- **Umlaut-নিরাপদ UI**: জার্মান UI স্ট্রিংয়ে স্থানীয় umlaut ব্যবহৃত হয়; অনুবাদ স্ক্যানার ইংরেজি মিথ্যা পজিটিভ এড়ায় +- **প্রোফাইল**: পুনর্ব্যবহারযোগ্য আউটপুট-ফরম্যাট সমন্বয় + +## ইনস্টলেশন + +```bash +# Clone or copy the project folder +cd NoteSpaceLLM + +# Install dependencies +pip install -r requirements.txt + +# Start the app +python main.py +``` + +নির্ভরতা পরীক্ষা করুন: + +```bash +python main.py --check +``` + +## LLM কনফিগারেশন + +### Ollama (স্থানীয় — প্রস্তাবিত) + +1. [Ollama ইনস্টল করুন](https://ollama.ai) +2. একটি মডেল ডাউনলোড করুন: `ollama pull llama3` +3. অ্যাপে: Menu > LLM > Use Ollama + +### Ollama (দূরবর্তী সার্ভার) + +NoteSpaceLLM একটি দূরবর্তী Ollama সার্ভারের সাথে সংযুক্ত হতে পারে, যেমন [ellmos-stack](https://github.com/ellmos-ai/ellmos-stack)-এর মাধ্যমে: + +1. অ্যাপে: Menu > LLM > Settings +2. **Ollama URL:** `http://your-server:11435` (বা আপনার পোর্ট) +3. **API Key:** সার্ভার যদি auth proxy-এর পেছনে থাকে (প্রস্তাবিত) + +> **টিপ:** Ollama-তে কোনো অন্তর্নির্মিত প্রমাণীকরণ নেই। দূরবর্তী অ্যাক্সেসের জন্য API key বা Basic Auth সহ একটি reverse proxy (যেমন Nginx) ব্যবহার করুন। + +Ollama endpoint ও মডেল অ্যাপ-ব্যাপী সেটিংসে বা নির্বাচিত সংযোগ প্রোফাইলে কনফিগার +করা হয়, প্রতি প্রকল্পে নয়। অ্যাপে সংরক্ষণ করা হলে API key অপারেটিং সিস্টেমের +credential store-এর মাধ্যমে সংরক্ষিত হয়। ঐচ্ছিক `NOTESPACELLM_OLLAMA_API_KEY` এনভায়রনমেন্ট ভেরিয়েবল +সংরক্ষিত কী-কে ওভাররাইড করে এবং অ্যাপ তা কখনো লেখে না। লিগ্যাসি প্লেইনটেক্সট কী +সেটিংসে আপনি স্পষ্টভাবে মাইগ্রেট না করা পর্যন্ত পাঠানো হয় না। + +কনফিগার করা Ollama সার্ভারটি দূরবর্তী হলে, এমবেডিংয়ের জন্য ব্যবহৃত নথির পাঠ্য এবং তৈরি করার জন্য পাঠানো প্রম্পট/প্রসঙ্গ সেই সার্ভার পায়। API key কনফিগার করা URL-এ Bearer হেডার হিসেবে পাঠানো হয়। সাধারণ HTTP বিষয়বস্তু বা প্রমাণীকরণ-তথ্য এনক্রিপ্ট করে না; HTTPS-এর আচরণ নির্ভর করে এন্ডপয়েন্ট ও তার সার্টিফিকেটের ওপর। + +### OpenAI + +```bash +export OPENAI_API_KEY="" +``` + +### Anthropic (Claude) + +```bash +export ANTHROPIC_API_KEY="" +``` + +### Claude Code + +স্থানীয় CLI প্রয়োজন: + +```bash +npm install -g @anthropic-ai/claude-code +``` + +অ্যাপে দুটি মোড উপলব্ধ: +- **API মোড**: কাঠামোগত প্রতিক্রিয়া সরাসরি NoteSpaceLLM-এ ফেরত আসে +- **চ্যাট মোড**: প্রম্পটটি একটি ইন্টারেক্টিভ Claude Code কনসোলে হস্তান্তর করা হয় + +## ব্যবহার + +### ১. নথি যোগ করুন + +- **ড্র্যাগ ও ড্রপ**: বাম প্যানেলে ফাইল বা ফোল্ডার ড্রপ করুন +- **বোতাম**: "Add files" বা "Add folder" + +### ২. নথি নির্বাচন করুন + +- চেকবক্স: বিশ্লেষণের জন্য নথি অন্তর্ভুক্ত/বাদ দিন +- বোতাম: বাল্ক নির্বাচনের জন্য "All" / "None" + +### ৩. সাব-কোয়েরি (ঐচ্ছিক) + +একটি নথিতে ডান-ক্লিক করুন: +- **Create summary**: স্বয়ংক্রিয় সারসংক্ষেপ +- **Extract information**: নির্দিষ্ট তথ্য খুঁজুন +- **Analyse**: লক্ষ্যভিত্তিক বিশ্লেষণ +- **Ask question**: নথি সম্পর্কে নির্দিষ্ট প্রশ্ন + +### ৪. মূল প্রশ্ন সংজ্ঞায়িত করুন + +ওয়ার্কফ্লো প্যানেলে কেন্দ্রীয় গবেষণা প্রশ্নটি লিখুন। + +### ৫. ওয়ার্কফ্লো/রিপোর্ট প্রকার বেছে নিন + +- **Analysis**: সুপারিশসহ ব্যাপক বিশ্লেষণ +- **Summary**: সংক্ষিপ্ত সারসংক্ষেপ +- **Research report**: একাডেমিক কাঠামো +- **Comparison**: নথির পদ্ধতিগত তুলনা + +### ৬. রিপোর্ট তৈরি করুন + +"Create report" ক্লিক করুন — আউটপুট ডান প্যানেলে প্রদর্শিত হবে। + +### ৭. রপ্তানি + +আউটপুট ফর্ম্যাট নির্বাচন করুন এবং "Export" ক্লিক করুন। + +### ৮. প্রম্পট রপ্তানি + +বর্তমান কার্যপ্রবাহের প্রেক্ষাপট একটি Markdown ফাইলে সংরক্ষণ করতে **"Export prompt"** ব্যবহার করুন, যা Claude Code বা অন্যান্য LLM কার্যপ্রবাহে ব্যবহারের জন্য। + +## Web/PWA কম্প্যানিয়ন + +`web_companion/`-এর অধীনে Android, iOS এবং ব্রাউজারের জন্য একটি শুধুমাত্র-পঠনযোগ্য Companion স্ট্র্যান্ড রয়েছে। এটি ব্রাউজারে স্থানীয়ভাবে রপ্তানি করা `notespacellm-workspace-v1.json` ফাইল আমদানি করে, রিপোর্ট, নথির মেটাডেটা ও নির্বাচিত অংশ দেখায়, এবং রিভিউ নোটগুলো Markdown হিসেবে রপ্তানি করতে পারে। ওয়ার্কস্পেস বর্তমান ব্রাউজার সেশনে থাকে এবং ব্রাউজার পুনরায় খোলার পর আবার আমদানি করতে হবে; শুধুমাত্র রিভিউ নোট ও UI লোকেল স্থানীয়ভাবে সংরক্ষিত হয়। + +স্থানীয় ব্রাউজার পরীক্ষা: + +```powershell +$env:PYTHONIOENCODING='utf-8' +python -m http.server 8765 -d web_companion +``` + +Companion স্মোক: + +```powershell +cd web_companion +node --test tests/library.test.mjs +``` + +Android/iOS PWA পরীক্ষার পরিকল্পনা `web_companion/PWA_TESTPLAN.md`-এ নথিভুক্ত আছে। + +## প্ল্যাটফর্ম কৌশল + +ডেস্কটপ অ্যাপটি স্থানীয় নথি, RAG ইনডেক্স এবং প্রদানকারী সংযোগের জন্য সম্পূর্ণ অ্যাপ্লিকেশন। Android, iOS ও ব্রাউজার Web/PWA Companion ব্যবহারকারী-তৈরি `notespacellm-workspace-v1.json` রপ্তানি পর্যালোচনার জন্য উপলব্ধ। সংবেদনশীল উপাদানের ক্ষেত্রে স্থানীয় মডেল ও এম্বেডিং এন্ডপয়েন্ট কনফিগার করুন এবং শেয়ার করার আগে রপ্তানি পর্যালোচনা করুন। বিনিময় চুক্তি `EXPORTFORMAT.md`-এ নথিভুক্ত আছে। + +### macOS ও Linux সোর্স স্মোক + +GitHub Actions-এ অতিরিক্ত সোর্স স্মোক চলে: +- `tests/platform_smoke.py` — অফস্ক্রিন PySide6 চালু, নথি আমদানি, রিপোর্ট রপ্তানি, ওয়ার্কস্পেস JSON রপ্তানি +- `tests/linux_platform_smoke.py` — `ubuntu-latest`-এর উপর Linux-নির্দিষ্ট র‍্যাপার + +## প্রকল্পের কাঠামো + +``` +NoteSpaceLLM/ +├── main.py # Entry point +├── requirements.txt # Dependencies +├── translator.py # Translation-catalog scan/helper; no desktop language switch +├── locales/ # Catalog inputs for the translation helper +├── src/ +│ ├── core/ # Core functionality +│ │ ├── document_manager.py +│ │ ├── text_extractor.py +│ │ ├── sub_query.py +│ │ └── project.py +│ ├── gui/ # PySide6 UI +│ │ ├── main_window.py +│ │ ├── document_panel.py +│ │ ├── workflow_panel.py +│ │ ├── chat_panel.py +│ │ └── output_panel.py +│ ├── llm/ # LLM integration (local + remote) +│ │ ├── client.py +│ │ ├── ollama_client.py +│ │ ├── openai_client.py +│ │ └── anthropic_client.py +│ └── reports/ # Report generation +│ ├── generator.py +│ ├── templates.py +│ └── exporter.py +├── web_companion/ # PWA Companion +├── data/ # Project data (gitignored) +├── workflows/ # Workflow definitions +├── profiles/ # Output profiles +└── output/ # Exported reports +``` + +## সমর্থিত ফাইল ফরম্যাট + +| ফরম্যাট | পড়া | লেখা | +|--------|------|-------| +| PDF | ✅ | ✅ | +| DOCX | ✅ | ✅ | +| DOC | ⚠️ | — | +| TXT | ✅ | ✅ | +| MD | ✅ | ✅ | +| XLSX | ✅ | — | +| HTML | — | ✅ | +| EML | ✅ | — | +| MSG | ✅ | — | + +⚠️ .doc-এর জন্য antiword বা LibreOffice প্রয়োজন + +## গোপনীয়তা + +NoteSpaceLLM প্রকল্পের ডেটা, নথি ইনডেক্স, প্রোফাইল, ওয়ার্কফ্লো সেটিংস এবং রপ্তানি স্থানীয়ভাবে `data/`, `profiles/`, `workflows/`, `output/` এবং `chroma_db/`-এ সংরক্ষণ করে। এই ফোল্ডারগুলো ইচ্ছাকৃতভাবে Git থেকে বাদ দেওয়া হয়েছে। + +বাহ্যিক LLM প্রদানকারী (OpenAI, Anthropic, Claude Code, দূরবর্তী Ollama) সক্রিয় থাকলে প্রম্পট ও নির্বাচিত নথির অংশ সেই সেবাগুলোতে পাঠানো হতে পারে। দূরবর্তী Ollama এন্ডপয়েন্ট এম্বেডিংয়ে ব্যবহৃত নথির টেক্সটও পায়। সংবেদনশীল নথির জন্য স্থানীয় মডেল ও এম্বেডিং এন্ডপয়েন্ট ব্যবহার করুন এবং শেয়ার করার আগে রপ্তানি করা রিপোর্ট, চ্যাট ইতিহাস ও নির্বাচিত অংশ পর্যালোচনা করুন; ওয়ার্কস্পেস রপ্তানি বেনামী করা হয় না। + +## টিপস + +1. **বড় নথির সেট**: দ্রুত ফলাফলের জন্য প্রথমে শুধু প্রাসঙ্গিক নথি নির্বাচন করুন +2. **সাব-কোয়েরি**: উচ্চমানের বিশ্লেষণের জন্য লক্ষ্যভিত্তিক সাব-কোয়েরি ব্যবহার করুন +3. **Ollama**: একটি স্থানীয় Ollama এন্ডপয়েন্ট অফলাইন প্রক্রিয়াকরণ সমর্থন করে। +4. **ওয়ার্কফ্লো ক্রম**: ওয়ার্কফ্লো প্যানেলে ধাপগুলোর ক্রম পরিবর্তন করা যায় + +## লাইসেন্স + +AGPL-3.0-only — দেখুন [LICENSE](LICENSE) + +এই প্রকল্পটি PySide6 ও PyMuPDF ঘোষণা করে। নির্বাচিত upstream লাইসেন্স রেফারেন্সের জন্য দেখুন [THIRD_PARTY_LICENSES.md](THIRD_PARTY_LICENSES.md); প্রকল্পের নিজস্ব লাইসেন্স AGPL-3.0-only। + +## সম্পর্কিত প্রকল্প + +[KnowledgeDigest](https://github.com/file-bricks/KnowledgeDigest) একটি আলাদা স্থানীয় জ্ঞানভান্ডার, যেখানে SQLite/FTS5 অনুসন্ধান ও ঐচ্ছিক LLM সারসংক্ষেপ রয়েছে; এটি NoteSpaceLLM-এর সাথে সংযুক্ত নয়। + +## লাইসেন্স ও রক্ষণাবেক্ষণ বিজ্ঞপ্তি + +প্রকল্পের লাইসেন্স শর্তাবলীর জন্য দেখুন [LICENSE](LICENSE)। রক্ষণাবেক্ষকরা চলমান রক্ষণাবেক্ষণ বা প্রাপ্যতার কোনো প্রতিশ্রুতি দেন না। diff --git a/README_de.md b/README_de.md index bd77ec5..e375537 100644 --- a/README_de.md +++ b/README_de.md @@ -1,24 +1,33 @@ -NoteSpaceLLM Banner +NoteSpaceLLM-Banner # NoteSpaceLLM -[![License: AGPL v3](https://img.shields.io/badge/Lizenz-AGPL%20v3-blue.svg)](LICENSE) +[![Lizenz: AGPL v3](https://img.shields.io/badge/License-AGPL%20v3-blue.svg)](LICENSE) [![Python 3.10+](https://img.shields.io/badge/python-3.10+-blue.svg)](https://www.python.org/) -[![Plattform: Windows](https://img.shields.io/badge/Plattform-Windows-lightgrey.svg)]() -[![Ökosystem: file-bricks](https://img.shields.io/badge/%C3%96kosystem-file--bricks-blue.svg)](https://github.com/file-bricks) -[![Dachorganisation: open-bricks](https://img.shields.io/badge/Dachorganisation-open--bricks-blue.svg)](https://github.com/open-bricks) -[![LLM Kontext: llms.txt](https://img.shields.io/badge/LLM%20Kontext-llms.txt-blue.svg)](llms.txt) +[![Plattform: Windows](https://img.shields.io/badge/platform-Windows-lightgrey.svg)]() +[![Ökosystem: file-bricks](https://img.shields.io/badge/Ecosystem-file--bricks-blue.svg)](https://github.com/file-bricks) +[![Dachorganisation: open-bricks](https://img.shields.io/badge/Umbrella-open--bricks-blue.svg)](https://github.com/open-bricks) +[![LLM-Kontext: llms.txt](https://img.shields.io/badge/LLM%20Context-llms.txt-blue.svg)](llms.txt) -[Deutsch](README_de.md) | [English](README.md) +[English](README.md) | [Deutsch](README_de.md) | [Español](README_es.md) | [简体中文](README_zh.md) | [日本語](README_ja.md) | [Русский](README_ru.md) | [Français](README_fr.md) | [हिन्दी](README_hi.md) | [العربية](README_ar.md) | [বাংলা](README_bn.md) | [Português](README_pt.md) -> **Lokale Dokumenten- und Rechercheanwendung mit konfigurierbaren lokalen oder externen Sprachmodellen.** +> **Lokale Dokumenten- und Rechercheanwendung für Analysen und Berichte mit konfigurierbaren lokalen oder externen Sprachmodellen.** > [!NOTE] -> **Für KI-Agenten & automatisierte Systeme:** -> NoteSpaceLLM bietet eine maschinenlesbare Architektur- und Funktionsübersicht in [`llms.txt`](llms.txt). -> Die Python- und Web-Companion-Tests sind für isolierte lokale Daten eingerichtet und rufen keine externen Modellanbieter auf. +> **Für KI-Agenten und automatisierte Arbeitsabläufe:** +> NoteSpaceLLM stellt in [`llms.txt`](llms.txt) eine maschinenlesbare Architektur- und Funktionsübersicht bereit. -Analysiert lokale Dokumente (PDF, DOCX, TXT, Markdown, XLSX, EML, MSG) lokal. Bei ausdrücklich konfigurierten externen LLM-Anbietern werden ausgewählte Texte und Prompts an diese Anbieter übertragen. Unterstützt lokale und externe Ollama-Server, OpenAI, Anthropic sowie Claude-Code-Workflows. Ergebnisse lassen sich in Markdown, PDF, DOCX, HTML und TXT exportieren. Mit dem Web/PWA-Companion können exportierte Workspaces auch unterwegs auf Smartphone oder Tablet (Android/iOS) eingesehen werden. +NoteSpaceLLM ist eine lokale PySide6-Desktopanwendung für die Arbeit mit PDFs, +Word-Dateien, Markdown, E-Mail-Exporten, Notizen und Rechercheordnern. Sie hält +Projektdaten standardmäßig lokal, unterstützt lokale oder entfernte Ollama- +Verbindungen, OpenAI, Anthropic und Claude-Code-Arbeitsabläufe und exportiert +Analyseergebnisse als Markdown, PDF, DOCX, HTML und TXT. Ein schlanker +Web/PWA-Companion ist verfügbar, um exportierte Workspaces auf Android, iOS und +im Browser zu prüfen, ohne Dokumente auf einen Server hochzuladen. + +**Passende Suchbegriffe:** NotebookLM-Alternative, lokale RAG-Dokumentenanalyse, +lokaler Dokumentenchat, PySide6-Recherchewerkzeug, Berichtsgenerator mit lokalem +Modell, lokaler Dokumentenworkflow. ## Schnellstart @@ -29,13 +38,15 @@ pip install -r requirements.txt python main.py ``` -Unter Windows kann die Anwendung auch über `start.bat` gestartet werden. Ein Windows-Executable lässt sich mit `build_exe.bat` bauen. +Unter Windows kann die Anwendung auch mit `start.bat` gestartet werden. Mit +`build_exe.bat` lässt sich ein lokaler Windows-Launcher erstellen. -Für einen geführten lokalen Bootstrap, der Abhängigkeiten installiert und -Startordner für Workflows/Profile anlegt, kann `python setup_environment.py` -ausdrücklich ausgeführt werden. Paketmetadaten und Builds starten diesen Installer nicht. +Für einen ausdrücklich gestarteten, geführten lokalen Bootstrap, der die +Abhängigkeiten installiert und Startordner für Workflows und Profile anlegt, +führe `python setup_environment.py` aus. Paketmetadaten und Builds verwenden +einen separaten setuptools-Einstiegspunkt und führen dieses Skript nicht aus. -Tests und Kompilierungs-Checks ausführen: +Tests und Kompilierungs-Smoke-Checks lassen sich so ausführen: ```bash pytest @@ -48,21 +59,21 @@ npm test ```mermaid graph TD - subgraph UI ["PySide6 Desktop-Anwendung"] - DP["Dokumentenverwaltung (Drag & Drop)"] - WP["Workflow & Berichts-Generator"] - CP["Interaktive Chat-Schnittstelle"] + subgraph UI ["PySide6 Desktop Application"] + DP["Document Panel (Drag & Drop)"] + WP["Workflow & Report Builder"] + CP["Interactive Chat Panel"] OP["Multi-Format Exporter"] end - subgraph Engine ["Lokale RAG-Engine"] - TE["Text-Extraktor (PDF/DOCX/TXT/XLSX/EML)"] - CDB[("ChromaDB Vektordatenbank")] - RM["Berichtsgenerator & Prompts"] + subgraph Engine ["Local RAG Engine"] + TE["Text Extractor (PDF/DOCX/TXT/XLSX/EML)"] + CDB[("ChromaDB Vector Store")] + RM["Report Generator & Prompts"] end - subgraph LLM ["LLM-Integrationen"] - OL["Ollama (Lokal / Remote)"] + subgraph LLM ["LLM Integrations"] + OL["Ollama (Local / Remote)"] OAI["OpenAI API"] ANT["Anthropic Claude"] CC["Claude Code CLI"] @@ -83,35 +94,36 @@ graph TD JSON --> SW ``` -## Hauptfunktionen +## Funktionen -- **Dokumentenverwaltung**: Dateien und Ordner per Drag & Drop hinzufügen -- **Auto-Indizierung**: Neue Dokumente werden sofort für die RAG-Vektordatenbank (ChromaDB) verarbeitet -- **Selektive Analyse**: Dokumente gezielt per Checkbox für Berichte aktivieren oder deaktivieren -- **Unteranfragen (Sub-queries)**: Rechtsklick auf Dokumente für gezielte Einzeldokument-Recherche -- **Workflow-Visualisierung**: Grafische Übersicht der Berichtspipeline -- **Chat-Schnittstelle**: Interaktiver Chat über alle geladenen Dokumente mit beliebigen LLMs -- **Claude Code Integration**: Strukturierte Antwort-Prompts oder Übergabe an eine interaktive Claude-Code-Session -- **Multi-Format Export**: Ausgabe nach MD, PDF, DOCX, HTML, TXT -- **Prompt Export**: Kontext als Markdown-Prompt für externe KI-Tools speichern -- **Ollama-Verbindungsprofile**: Appweite Provider-Einstellungen können in mehreren Projekten verwendet werden -- **Desktop-Oberfläche**: Derzeit überwiegend deutsch; die Berichtssprache ändert den Bericht, nicht die Desktop-Oberfläche. -- **Web/PWA Companion**: Oberfläche zur Durchsicht exportierter Workspaces mit Sprachwahl in Deutsch, Englisch, Spanisch, Chinesisch, Japanisch und Russisch +- **Dokumentenverwaltung:** Dateien und Verzeichnisse per Drag & Drop hinzufügen +- **Automatische Extraktion und Indizierung:** Neue Dokumente werden sofort verarbeitet und für RAG vorbereitet. +- **Gezielte Analyse:** Dokumente für Berichte per Kontrollkästchen ein- oder ausschließen +- **Teilabfragen:** Ein Rechtsklick auf ein Dokument startet eine gezielte Recherche zu diesem Dokument. +- **Workflow-Visualisierung:** Grafische Übersicht über die Berichtspipeline +- **Chatoberfläche:** Interaktiver Chat mit beliebigen LLMs über die geladenen Dokumente +- **Claude-Code-Integration:** Strukturierte API-Antworten oder Übergabe an eine interaktive Claude-Code-Sitzung +- **Export in mehreren Formaten:** Ausgabe als MD, PDF, DOCX, HTML und TXT +- **Prompt-Export:** Den Berichtskontext als Markdown-Prompt für externe LLM-Arbeitsabläufe speichern +- **Ollama-Verbindungsprofile:** Appweite Provider-Einstellungen lassen sich projektübergreifend wiederverwenden +- **Sprachunterstützung:** Die Desktopoberfläche bietet keine benutzerseitige Sprachauswahl und ist derzeit überwiegend deutsch. Der Web/PWA-Companion bietet eine dauerhafte Auswahl für Deutsch, Englisch, Spanisch, vereinfachtes Chinesisch, Japanisch, Russisch, Französisch, Hindi, Arabisch, Bengalisch und Portugiesisch; Arabisch verwendet eine Rechts-nach-links-Oberfläche. Das Projektsprachfeld wird in Workspace-Exporte übernommen; es ist nicht an eine Desktop-Sprachauswahl oder eine Auswahl der Berichtssprache angebunden. +- **Umlautsichere Oberfläche:** Deutsche UI-Texte verwenden echte Umlaute; der Übersetzungsscanner vermeidet englische Fehlalarme. +- **Profile:** Wiederverwendbare Kombinationen von Ausgabeformaten -## Installation & Abhängigkeiten +## Installation ```bash -# Repository klonen +# Clone or copy the project folder cd NoteSpaceLLM -# Python-Abhängigkeiten installieren +# Install dependencies pip install -r requirements.txt -# Anwendung starten +# Start the app python main.py ``` -Abhängigkeiten überprüfen: +Abhängigkeiten prüfen: ```bash python main.py --check @@ -119,44 +131,235 @@ python main.py --check ## LLM-Konfiguration -### Ollama (Lokal — Empfohlen) +### Ollama (lokal — empfohlen) 1. [Ollama installieren](https://ollama.ai) -2. Modell herunterladen: `ollama pull llama3` +2. Ein Modell herunterladen: `ollama pull llama3` 3. In der App: Menü > LLM > Ollama verwenden -### Ollama (Remote Server) +### Ollama (entfernter Server) -NoteSpaceLLM kann mit entfernten Ollama-Instanzen verbunden werden (z. B. via [ellmos-stack](https://github.com/ellmos-ai/ellmos-stack)): +NoteSpaceLLM kann sich mit einem entfernten Ollama-Server verbinden, zum +Beispiel über [ellmos-stack](https://github.com/ellmos-ai/ellmos-stack): 1. In der App: Menü > LLM > Einstellungen -2. **Ollama URL:** `http://dein-server:11435` -3. **API Key:** Falls der Server durch einen Auth-Proxy geschützt ist +2. **Ollama-URL:** `http://your-server:11435` (oder den verwendeten Port) +3. **API-Schlüssel:** Falls der Server hinter einem Authentifizierungs-Proxy liegt (empfohlen) -Server-URL und Modell werden in den appweiten LLM-Einstellungen oder im -ausgewählten Verbindungsprofil verwaltet, nicht pro Projekt. Gespeicherte -API-Schlüssel verwendet die App über den nativen Zugangsdienst des -Betriebssystems. `NOTESPACELLM_OLLAMA_API_KEY` überschreibt den gespeicherten -Schlüssel, wird aber nie gespeichert. Alte Klartextschlüssel werden erst nach -einer ausdrücklich gestarteten Migration verwendet. +> **Tipp:** Ollama bietet keine integrierte Authentifizierung. Verwende für den +> Fernzugriff einen Reverse-Proxy (zum Beispiel Nginx) mit API-Schlüssel oder +> Basic Auth. -Ein entfernter Ollama-Server erhält Dokumenttext für Embeddings sowie Prompts -und Kontext für die Generierung. Der API-Schlüssel wird als Bearer-Header an die -konfigurierte URL gesendet. HTTP verschlüsselt diese Inhalte und Zugangsdaten -nicht; bei HTTPS hängt der Schutz vom Endpunkt und dessen Zertifikat ab. +Der Ollama-Endpunkt und das Modell werden in den appweiten Einstellungen oder +im ausgewählten Verbindungsprofil konfiguriert, nicht pro Projekt. In der App +gespeicherte API-Schlüssel werden über den Zugangsdienst des Betriebssystems +gespeichert. Die optionale Umgebungsvariable +`NOTESPACELLM_OLLAMA_API_KEY` überschreibt den gespeicherten Schlüssel; die App +schreibt sie niemals selbst. Vorhandene Klartextschlüssel werden erst gesendet, +wenn du sie ausdrücklich in den Einstellungen migrierst. -## Lizenz & Community +Wenn der konfigurierte Ollama-Server entfernt läuft, erhält er Dokumenttext für +Embeddings sowie Prompts und Kontext für die Generierung. Der API-Schlüssel wird +als Bearer-Header an die konfigurierte URL gesendet. Bei reinem HTTP werden +weder Inhalte noch Zugangsdaten verschlüsselt; bei HTTPS hängt der Schutz vom +Endpunkt und dessen Zertifikat ab. -- **Lizenz**: AGPL-3.0-only -- **Verzeichnis**: Teil des `file-bricks` Ökosystems -- **Lokale Datenhaltung**: Projektdateien und der Vektorindex werden standardmäßig lokal gespeichert; konfigurierte externe Anbieter erhalten die für eine Anfrage verwendeten Texte und Prompts. +### OpenAI -## Verwandtes Projekt +```bash +export OPENAI_API_KEY="" +``` + +### Anthropic (Claude) + +```bash +export ANTHROPIC_API_KEY="" +``` + +### Claude Code + +Die lokale CLI wird benötigt: + +```bash +npm install -g @anthropic-ai/claude-code +``` + +In der App stehen zwei Modi zur Verfügung: +- **API-Modus:** Eine strukturierte Antwort wird direkt an NoteSpaceLLM zurückgegeben. +- **Chat-Modus:** Der Prompt wird an eine interaktive Claude-Code-Konsole übergeben. + +## Verwendung + +### 1. Dokumente hinzufügen + +- **Drag & Drop:** Dateien oder Ordner in den linken Bereich ziehen +- **Schaltflächen:** „Dateien hinzufügen“ oder „Ordner hinzufügen“ + +### 2. Dokumente auswählen + +- Kontrollkästchen: Dokumente in die Analyse ein- oder ausschließen +- Schaltflächen: „Alle“ oder „Keine“ für die Mehrfachauswahl + +### 3. Teilabfragen (optional) + +Rechtsklick auf ein Dokument: +- **Zusammenfassung erstellen:** Automatische Zusammenfassung +- **Informationen extrahieren:** Bestimmte Angaben finden +- **Analysieren:** Gezielte Analyse +- **Frage stellen:** Eine konkrete Frage zum Dokument + +### 4. Hauptfrage festlegen + +Gib die zentrale Recherchefrage im Workflow-Bereich ein. + +### 5. Workflow- oder Berichtstyp wählen + +- **Analyse:** Umfassende Analyse mit Empfehlungen +- **Zusammenfassung:** Kurze Zusammenfassung +- **Recherchebericht:** Wissenschaftlicher Aufbau +- **Vergleich:** Systematischer Vergleich von Dokumenten + +### 6. Bericht erstellen + +Klicke auf „Bericht erstellen“ – die Ausgabe erscheint im rechten Bereich. + +### 7. Exportieren + +Wähle die Ausgabeformate und klicke auf „Exportieren“. + +### 8. Prompt exportieren + +Verwende **„Prompt exportieren“**, um den aktuellen Arbeitskontext als +Markdown-Datei für Claude Code oder andere LLM-Arbeitsabläufe zu speichern. -[KnowledgeDigest](https://github.com/file-bricks/KnowledgeDigest) ist eine eigenständige lokale Wissensdatenbank mit SQLite/FTS5-Suche und optionalen LLM-Zusammenfassungen; sie ist nicht in NoteSpaceLLM integriert. +## Web-/PWA-Companion + +Unter `web_companion/` befindet sich ein schreibgeschützter Companion für +Android, iOS und Browser. Er importiert exportierte +`notespacellm-workspace-v1.json`-Dateien lokal im Browser, zeigt den Bericht, +Dokumentenmetadaten und ausgewählte Ausschnitte an und kann Prüfnotizen als +Markdown exportieren. Der Workspace bleibt in der aktuellen Browsersitzung und +muss nach einem Neustart erneut importiert werden; nur Prüfnotizen und die +Oberflächensprache werden lokal gespeichert. + +Lokaler Browser-Test: + +```powershell +$env:PYTHONIOENCODING='utf-8' +python -m http.server 8765 -d web_companion +``` + +Companion-Smoke-Test: + +```powershell +cd web_companion +node --test tests/library.test.mjs +``` + +Der Android-/iOS-PWA-Testplan steht in `web_companion/PWA_TESTPLAN.md`. + +## Plattformstrategie + +Die Desktopanwendung bietet den vollständigen Funktionsumfang für lokale +Dokumente, den RAG-Index und Provider-Verbindungen. Der Web-/PWA-Companion für +Android, iOS und Browser dient dazu, einen selbst erstellten +`notespacellm-workspace-v1.json`-Export zu prüfen. Bei sensiblen Inhalten +konfiguriere lokale Modell- und Embedding-Endpunkte und prüfe Exporte vor der +Weitergabe. Der Austauschvertrag ist in `EXPORTFORMAT.md` beschrieben. + +### macOS- und Linux-Smoke-Tests aus dem Quellcode + +Zusätzliche Quellcode-Smokes laufen in GitHub Actions: +- `tests/platform_smoke.py` — PySide6-Start ohne sichtbares Fenster, Dokumentimport, Berichtsexport und Workspace-JSON-Export +- `tests/linux_platform_smoke.py` — Linux-spezifischer Wrapper auf `ubuntu-latest` + +## Projektstruktur + +``` +NoteSpaceLLM/ +├── main.py # Entry point +├── requirements.txt # Dependencies +├── translator.py # Translation-catalog scan/helper; no desktop language switch +├── locales/ # Catalog inputs for the translation helper +├── src/ +│ ├── core/ # Core functionality +│ │ ├── document_manager.py +│ │ ├── text_extractor.py +│ │ ├── sub_query.py +│ │ └── project.py +│ ├── gui/ # PySide6 UI +│ │ ├── main_window.py +│ │ ├── document_panel.py +│ │ ├── workflow_panel.py +│ │ ├── chat_panel.py +│ │ └── output_panel.py +│ ├── llm/ # LLM integration (local + remote) +│ │ ├── client.py +│ │ ├── ollama_client.py +│ │ ├── openai_client.py +│ │ └── anthropic_client.py +│ └── reports/ # Report generation +│ ├── generator.py +│ ├── templates.py +│ └── exporter.py +├── web_companion/ # PWA Companion +├── data/ # Project data (gitignored) +├── workflows/ # Workflow definitions +├── profiles/ # Output profiles +└── output/ # Exported reports +``` + +## Unterstützte Dateiformate + +| Format | Lesen | Schreiben | +|--------|-------|-----------| +| PDF | ✅ | ✅ | +| DOCX | ✅ | ✅ | +| DOC | ⚠️ | — | +| TXT | ✅ | ✅ | +| MD | ✅ | ✅ | +| XLSX | ✅ | — | +| HTML | — | ✅ | +| EML | ✅ | — | +| MSG | ✅ | — | + +⚠️ Für .doc wird antiword oder LibreOffice benötigt. + +## Datenschutz + +NoteSpaceLLM speichert Projektdaten, Dokumentindizes, Profile, +Workflow-Einstellungen und Exporte lokal in `data/`, `profiles/`, `workflows/`, +`output/` und `chroma_db/`. Diese Ordner sind absichtlich von Git ausgeschlossen. + +Wenn externe LLM-Anbieter (OpenAI, Anthropic, Claude Code oder entferntes +Ollama) aktiviert sind, können Prompts und ausgewählte Dokumentausschnitte an +diese Dienste übertragen werden. Ein entfernter Ollama-Endpunkt erhält außerdem +Dokumenttext für Embeddings. Verwende für sensible Dokumente lokale Modell- und +Embedding-Endpunkte und prüfe exportierte Berichte, Chatverläufe und ausgewählte +Ausschnitte vor der Weitergabe; Workspace-Exporte sind nicht anonymisiert. + +## Tipps + +1. **Große Dokumentmengen:** Wähle zunächst nur relevante Dokumente aus, damit die Verarbeitung schneller läuft. +2. **Teilabfragen:** Gezielte Teilabfragen verbessern die Qualität der Analyse. +3. **Ollama:** Ein lokaler Ollama-Endpunkt ermöglicht die Verarbeitung ohne Internetverbindung. +4. **Workflow-Reihenfolge:** Die Schritte lassen sich im Workflow-Bereich neu anordnen. + +## Lizenz + +AGPL-3.0-only — siehe [LICENSE](LICENSE). + +Das Projekt deklariert PySide6 und PyMuPDF. Die ausgewählten Lizenzhinweise +der Abhängigkeiten stehen in [THIRD_PARTY_LICENSES.md](THIRD_PARTY_LICENSES.md); +die Projektlizenz ist AGPL-3.0-only. + +## Verwandtes Projekt ---- +[KnowledgeDigest](https://github.com/file-bricks/KnowledgeDigest) ist eine +separate lokale Wissensdatenbank mit SQLite/FTS5-Suche und optionalen +LLM-Zusammenfassungen; sie ist nicht in NoteSpaceLLM integriert. -## Hinweise +## Lizenz- und Wartungshinweis -Die Bedingungen der Projektlizenz stehen in [LICENSE](LICENSE). Es gibt keine Zusage für laufende Wartung oder Verfügbarkeit. +Die Lizenzbedingungen des Projekts stehen in [LICENSE](LICENSE). Die +Maintainer versprechen weder fortlaufende Wartung noch dauerhafte Verfügbarkeit. diff --git a/README_es.md b/README_es.md new file mode 100644 index 0000000..e5ce4c2 --- /dev/null +++ b/README_es.md @@ -0,0 +1,331 @@ + +NoteSpaceLLM Banner + +# NoteSpaceLLM + +[![Licencia: AGPL v3](https://img.shields.io/badge/License-AGPL%20v3-blue.svg)](LICENSE) +[![Python 3.10+](https://img.shields.io/badge/python-3.10+-blue.svg)](https://www.python.org/) +[![Plataforma: Windows](https://img.shields.io/badge/platform-Windows-lightgrey.svg)]() +[![Ecosistema: file-bricks](https://img.shields.io/badge/Ecosystem-file--bricks-blue.svg)](https://github.com/file-bricks) +[![Paraguas: open-bricks](https://img.shields.io/badge/Umbrella-open--bricks-blue.svg)](https://github.com/open-bricks) +[![Contexto LLM: llms.txt](https://img.shields.io/badge/LLM%20Context-llms.txt-blue.svg)](llms.txt) + +[English](README.md) | [Deutsch](README_de.md) | [Español](README_es.md) | [简体中文](README_zh.md) | [日本語](README_ja.md) | [Русский](README_ru.md) | [Français](README_fr.md) | [हिन्दी](README_hi.md) | [العربية](README_ar.md) | [বাংলা](README_bn.md) | [Português](README_pt.md) + +> **Cuaderno de documentos local-first para investigación y generación de informes con modelos de lenguaje locales o remotos configurables.** + +> [!NOTE] +> **Para agentes de IA y flujos de trabajo automatizados:** +> NoteSpaceLLM proporciona una descripción de arquitectura y funcionalidades legible por máquinas en [`llms.txt`](llms.txt). + +NoteSpaceLLM es una aplicación de escritorio local-first basada en PySide6 para trabajar con PDF, +archivos de Word, Markdown, exportaciones de correo, notas y carpetas de investigación. Mantiene los +datos del proyecto en local por defecto, admite flujos de trabajo con Ollama, OpenAI, Anthropic y Claude Code +locales o remotos, y exporta los resultados del análisis a Markdown, +PDF, DOCX, HTML y TXT. Ahora está disponible un Companion Web/PWA ligero para revisar +espacios de trabajo exportados en Android, iOS y dispositivos con navegador sin subir documentos a un servidor. + +**Búsquedas más relevantes:** alternativa a NotebookLM, análisis de documentos RAG local, +chat de documentos local, herramienta de investigación con PySide6, generador de informes con modelos locales, +flujo de trabajo de documentos local-first. + +## Inicio rápido + +```bash +git clone https://github.com/file-bricks/NoteSpaceLLM.git +cd NoteSpaceLLM +pip install -r requirements.txt +python main.py +``` + +En Windows también puede iniciarlo mediante `start.bat`. Un lanzador local para Windows puede compilarse con `build_exe.bat`. + +Para una inicialización local guiada que instala los requisitos y crea las carpetas iniciales de +flujos de trabajo y perfiles, ejecute `python setup_environment.py` de forma explícita. Los metadatos del paquete y las compilaciones +usan el punto de entrada de setuptools independiente y no lo ejecutan. + +Ejecute las pruebas y las comprobaciones rápidas de compilación con: + +```bash +pytest +python -m compileall -q main.py manage_translations.py setup_environment.py translator.py src +cd web_companion +npm test +``` + +## Arquitectura del sistema + +```mermaid +graph TD + subgraph UI ["PySide6 Desktop Application"] + DP["Document Panel (Drag & Drop)"] + WP["Workflow & Report Builder"] + CP["Interactive Chat Panel"] + OP["Multi-Format Exporter"] + end + + subgraph Engine ["Local RAG Engine"] + TE["Text Extractor (PDF/DOCX/TXT/XLSX/EML)"] + CDB[("ChromaDB Vector Store")] + RM["Report Generator & Prompts"] + end + + subgraph LLM ["LLM Integrations"] + OL["Ollama (Local / Remote)"] + OAI["OpenAI API"] + ANT["Anthropic Claude"] + CC["Claude Code CLI"] + end + + subgraph PWA ["Web / PWA Companion"] + JSON["notespacellm-workspace-v1.json"] + SW["PWA Service Worker & Mobile Review"] + end + + DP --> TE + TE --> CDB + WP --> RM + RM --> CDB + RM --> LLM + CP --> LLM + OP --> JSON + JSON --> SW +``` + +## Funcionalidades + +- **Gestión de documentos**: Añada archivos y directorios mediante arrastrar y soltar +- **Extracción e indexación automáticas**: Los nuevos documentos se procesan de inmediato y se preparan para RAG. +- **Análisis selectivo**: Marque/desmarque documentos para incluirlos o excluirlos de los informes +- **Subconsultas**: Haga clic derecho en un documento para una investigación específica de ese documento +- **Visualización del flujo de trabajo**: Vista gráfica general de la canalización de informes +- **Interfaz de chat**: Chat interactivo sobre los documentos cargados con cualquier LLM +- **Integración con Claude Code**: Respuestas de API estructuradas o traspaso a una sesión interactiva de Claude Code +- **Exportación multiformato**: Salida a MD, PDF, DOCX, HTML, TXT +- **Exportación de prompts**: Guarde el contexto del informe como prompt en Markdown para flujos de trabajo con LLM externos +- **Perfiles de conexión de Ollama**: La configuración de proveedor válida para toda la aplicación puede reutilizarse entre proyectos +- **Compatibilidad de idiomas**: La GUI de escritorio no tiene un selector de idioma para el usuario; su interfaz está actualmente principalmente en alemán. El Companion Web/PWA dispone de un selector persistente de idioma de interfaz para alemán, inglés, español, chino simplificado, japonés, ruso, francés, hindi, árabe, bengalí y portugués. El campo de idioma del proyecto se incluye en las exportaciones del espacio de trabajo; no está conectado a un selector de idioma de la interfaz de escritorio ni de los informes. +- **Interfaz compatible con los umlauts alemanes**: Los textos de la interfaz en alemán usan los caracteres originales; el escáner de traducciones evita falsos positivos en inglés +- **Perfiles**: Combinaciones reutilizables de formatos de salida + +## Instalación + +```bash +# Clone or copy the project folder +cd NoteSpaceLLM + +# Install dependencies +pip install -r requirements.txt + +# Start the app +python main.py +``` + +Compruebe las dependencias: + +```bash +python main.py --check +``` + +## Configuración de LLM + +### Ollama (local — recomendado) + +1. [Instale Ollama](https://ollama.ai) +2. Descargue un modelo: `ollama pull llama3` +3. En la aplicación: Menú > LLM > Usar Ollama + +### Ollama (servidor remoto) + +NoteSpaceLLM puede conectarse a un servidor Ollama remoto, por ejemplo mediante [ellmos-stack](https://github.com/ellmos-ai/ellmos-stack): + +1. En la aplicación: Menú > LLM > Configuración +2. **URL de Ollama:** `http://your-server:11435` (o su puerto) +3. **Clave API:** Si el servidor está detrás de un proxy de autenticación (recomendado) + +> **Consejo:** Ollama no incluye autenticación integrada. Para el acceso remoto, use un proxy inverso (p. ej., Nginx) con clave API o autenticación básica. + +El endpoint y el modelo de Ollama se configuran en la configuración válida para toda la aplicación o en el +perfil de conexión seleccionado, no por proyecto. Las claves API se almacenan mediante el almacén de credenciales +del sistema operativo cuando se guardan en la aplicación. La variable de entorno opcional +`NOTESPACELLM_OLLAMA_API_KEY` sustituye la clave guardada y +la aplicación nunca la escribe. Las claves heredadas en texto plano no se envían hasta que +las migre explícitamente en la configuración. + +Cuando el servidor Ollama configurado es remoto, recibe el texto de los documentos utilizado para los embeddings y los prompts/contexto enviados para la generación. La clave API se envía a la URL configurada como cabecera Bearer. El HTTP simple no cifra ni el contenido ni las credenciales; el comportamiento de HTTPS depende del endpoint y de su certificado. + +### OpenAI + +```bash +export OPENAI_API_KEY="" +``` + +### Anthropic (Claude) + +```bash +export ANTHROPIC_API_KEY="" +``` + +### Claude Code + +Requiere la CLI local: + +```bash +npm install -g @anthropic-ai/claude-code +``` + +La aplicación ofrece dos modos: +- **Modo API**: la respuesta estructurada se devuelve directamente a NoteSpaceLLM +- **Modo chat**: entrega el prompt a una consola interactiva de Claude Code + +## Uso + +### 1. Añadir documentos + +- **Arrastrar y soltar**: suelte archivos o carpetas en el panel izquierdo +- **Botón**: "Add files" o "Add folder" + +### 2. Seleccionar documentos + +- Casilla: incluye/excluye documentos para el análisis +- Botones: "All" / "None" para la selección masiva + +### 3. Subconsultas (opcional) + +Haga clic derecho en un documento: +- **Create summary**: resumen automático +- **Extract information**: buscar datos específicos +- **Analyse**: análisis dirigido +- **Ask question**: pregunta específica sobre el documento + +### 4. Definir la pregunta principal + +Introduzca la pregunta central de investigación en el panel de flujo de trabajo. + +### 5. Elegir el tipo de flujo de trabajo/informe + +- **Analysis**: análisis exhaustivo con recomendaciones +- **Summary**: resumen breve +- **Research report**: estructura académica +- **Comparison**: comparación sistemática de documentos + +### 6. Generar el informe + +Haga clic en "Create report"; la salida aparece en el panel derecho. + +### 7. Exportar + +Seleccione los formatos de salida y haga clic en "Export". + +### 8. Exportar el prompt + +Use **"Export prompt"** para guardar el contexto de trabajo actual como archivo Markdown para usarlo en Claude Code u otros flujos de trabajo con LLM. + +## Compañero Web/PWA + +Bajo `web_companion/` se encuentra un compañero de solo lectura para Android, iOS y navegador. Importa archivos `notespacellm-workspace-v1.json` exportados de forma local en el navegador, muestra el informe, los metadatos de los documentos y los fragmentos seleccionados, y puede exportar notas de revisión en Markdown. El espacio de trabajo permanece en la sesión actual del navegador y debe volver a importarse tras reabrirlo; solo las notas de revisión y el idioma de la interfaz se guardan localmente. + +Prueba local en el navegador: + +```powershell +$env:PYTHONIOENCODING='utf-8' +python -m http.server 8765 -d web_companion +``` + +Pruebas rápidas del compañero: + +```powershell +cd web_companion +node --test tests/library.test.mjs +``` + +El plan de pruebas de la PWA para Android/iOS está documentado en `web_companion/PWA_TESTPLAN.md`. + +## Estrategia de plataforma + +La aplicación de escritorio es la aplicación completa para documentos locales, el índice RAG y las conexiones con proveedores. El compañero Web/PWA para Android, iOS y navegador está disponible para revisar una exportación `notespacellm-workspace-v1.json` creada por el usuario. Para material sensible, configure endpoints locales de modelo y embeddings, y revise las exportaciones antes de compartirlas. El contrato de intercambio está documentado en `EXPORTFORMAT.md`. + +### Pruebas rápidas de código fuente en macOS y Linux + +Pruebas rápidas adicionales se ejecutan en GitHub Actions: +- `tests/platform_smoke.py` — inicio sin pantalla de PySide6, importación de documentos, exportación de informes, exportación de JSON del espacio de trabajo +- `tests/linux_platform_smoke.py` — envoltorio específico de Linux sobre `ubuntu-latest` + +## Estructura del proyecto + +``` +NoteSpaceLLM/ +├── main.py # Entry point +├── requirements.txt # Dependencies +├── translator.py # Translation-catalog scan/helper; no desktop language switch +├── locales/ # Catalog inputs for the translation helper +├── src/ +│ ├── core/ # Core functionality +│ │ ├── document_manager.py +│ │ ├── text_extractor.py +│ │ ├── sub_query.py +│ │ └── project.py +│ ├── gui/ # PySide6 UI +│ │ ├── main_window.py +│ │ ├── document_panel.py +│ │ ├── workflow_panel.py +│ │ ├── chat_panel.py +│ │ └── output_panel.py +│ ├── llm/ # LLM integration (local + remote) +│ │ ├── client.py +│ │ ├── ollama_client.py +│ │ ├── openai_client.py +│ │ └── anthropic_client.py +│ └── reports/ # Report generation +│ ├── generator.py +│ ├── templates.py +│ └── exporter.py +├── web_companion/ # PWA Companion +├── data/ # Project data (gitignored) +├── workflows/ # Workflow definitions +├── profiles/ # Output profiles +└── output/ # Exported reports +``` + +## Formatos de archivo compatibles + +| Formato | Lectura | Escritura | +|--------|------|-------| +| PDF | ✅ | ✅ | +| DOCX | ✅ | ✅ | +| DOC | ⚠️ | — | +| TXT | ✅ | ✅ | +| MD | ✅ | ✅ | +| XLSX | ✅ | — | +| HTML | — | ✅ | +| EML | ✅ | — | +| MSG | ✅ | — | + +⚠️ .doc requiere antiword o LibreOffice + +## Privacidad + +NoteSpaceLLM almacena localmente los datos de proyectos, los índices de documentos, los perfiles, la configuración de flujos de trabajo y las exportaciones en `data/`, `profiles/`, `workflows/`, `output/` y `chroma_db/`. Estas carpetas se excluyen intencionadamente de Git. + +Cuando se habilitan proveedores externos de LLM (OpenAI, Anthropic, Claude Code, Ollama remoto), los prompts y los fragmentos de documentos seleccionados pueden transmitirse a esos servicios. Un endpoint remoto de Ollama también recibe el texto de los documentos utilizado para los embeddings. Para documentos sensibles, use endpoints locales de modelo y embeddings, y revise los informes exportados, el historial de chat y los fragmentos seleccionados antes de compartirlos; las exportaciones del espacio de trabajo no están anonimizadas. + +## Consejos + +1. **Conjuntos grandes de documentos**: seleccione primero solo los documentos relevantes para obtener resultados más rápidos +2. **Subconsultas**: use subconsultas dirigidas para un análisis de mayor calidad +3. **Ollama**: un endpoint local de Ollama permite el procesamiento sin conexión +4. **Orden del flujo de trabajo**: los pasos pueden reordenarse en el panel de flujo de trabajo + +## Licencia + +AGPL-3.0-only — véase [LICENSE](LICENSE) + +Este proyecto declara PySide6 y PyMuPDF. Consulte las referencias de licencia upstream seleccionadas en [THIRD_PARTY_LICENSES.md](THIRD_PARTY_LICENSES.md); la licencia propia del proyecto es AGPL-3.0-only. + +## Proyecto relacionado + +[KnowledgeDigest](https://github.com/file-bricks/KnowledgeDigest) es una base de conocimiento local separada con búsqueda SQLite/FTS5 y resúmenes opcionales con LLM; no está integrada con NoteSpaceLLM. + +## Aviso de licencia y mantenimiento + +Consulte [LICENSE](LICENSE) para los términos de licencia del proyecto. Los mantenedores no prometen mantenimiento ni disponibilidad continuos. diff --git a/README_fr.md b/README_fr.md new file mode 100644 index 0000000..6897cac --- /dev/null +++ b/README_fr.md @@ -0,0 +1,332 @@ + +NoteSpaceLLM Banner + +# NoteSpaceLLM + +[![License: AGPL v3](https://img.shields.io/badge/License-AGPL%20v3-blue.svg)](LICENSE) +[![Python 3.10+](https://img.shields.io/badge/python-3.10+-blue.svg)](https://www.python.org/) +[![Platform: Windows](https://img.shields.io/badge/platform-Windows-lightgrey.svg)]() +[![Ecosystem: file-bricks](https://img.shields.io/badge/Ecosystem-file--bricks-blue.svg)](https://github.com/file-bricks) +[![Umbrella: open-bricks](https://img.shields.io/badge/Umbrella-open--bricks-blue.svg)](https://github.com/open-bricks) +[![LLM Context: llms.txt](https://img.shields.io/badge/LLM%20Context-llms.txt-blue.svg)](llms.txt) + +[English](README.md) | [Deutsch](README_de.md) | [Español](README_es.md) | [简体中文](README_zh.md) | [日本語](README_ja.md) | [Русский](README_ru.md) | [Français](README_fr.md) | [हिन्दी](README_hi.md) | [العربية](README_ar.md) | [বাংলা](README_bn.md) | [Português](README_pt.md) + +> **Carnet documentaire privilégiant le stockage local pour la recherche et la génération de rapports, avec des modèles de langage configurables, exécutés localement ou à distance.** + +> [!NOTE] +> **Pour les agents IA et les flux de travail automatisés :** +> NoteSpaceLLM fournit une présentation de l'architecture et des fonctionnalités lisible par machine dans [`llms.txt`](llms.txt). + +NoteSpaceLLM est une application de bureau PySide6 qui privilégie le traitement local et permet de travailler avec des PDF, +des fichiers Word, du Markdown, des exports de messagerie, des notes et des dossiers de recherche. Elle conserve +les données de projet localement par défaut, prend en charge les flux de travail Ollama locaux ou distants, OpenAI, +Anthropic et Claude Code, et exporte les résultats d'analyse en Markdown, +PDF, DOCX, HTML et TXT. Un Companion Web/PWA léger est désormais disponible pour +consulter les espaces de travail exportés sur Android, iOS et les appareils équipés d'un navigateur, sans +téléverser de documents sur un serveur. + +**Recherches les plus pertinentes :** alternative à NotebookLM, analyse de documents RAG locale, +conversation locale avec des documents, outil de recherche PySide6, générateur de rapports reposant sur un modèle local, +flux de travail documentaire privilégiant le local. + +## Démarrage rapide + +```bash +git clone https://github.com/file-bricks/NoteSpaceLLM.git +cd NoteSpaceLLM +pip install -r requirements.txt +python main.py +``` + +Sous Windows, vous pouvez également lancer l'application via `start.bat`. Un lanceur Windows local peut être créé avec `build_exe.bat`. + +Pour une initialisation locale guidée qui installe les dépendances et crée les dossiers de départ +des flux de travail et des profils, exécutez explicitement `python setup_environment.py`. Les métadonnées du paquet et les +builds utilisent le point d'entrée setuptools distinct et ne l'exécutent pas. + +Exécutez les tests et les vérifications de compilation rapides avec : + +```bash +pytest +python -m compileall -q main.py manage_translations.py setup_environment.py translator.py src +cd web_companion +npm test +``` + +## Architecture du système + +```mermaid +graph TD + subgraph UI ["PySide6 Desktop Application"] + DP["Document Panel (Drag & Drop)"] + WP["Workflow & Report Builder"] + CP["Interactive Chat Panel"] + OP["Multi-Format Exporter"] + end + + subgraph Engine ["Local RAG Engine"] + TE["Text Extractor (PDF/DOCX/TXT/XLSX/EML)"] + CDB[("ChromaDB Vector Store")] + RM["Report Generator & Prompts"] + end + + subgraph LLM ["LLM Integrations"] + OL["Ollama (Local / Remote)"] + OAI["OpenAI API"] + ANT["Anthropic Claude"] + CC["Claude Code CLI"] + end + + subgraph PWA ["Web / PWA Companion"] + JSON["notespacellm-workspace-v1.json"] + SW["PWA Service Worker & Mobile Review"] + end + + DP --> TE + TE --> CDB + WP --> RM + RM --> CDB + RM --> LLM + CP --> LLM + OP --> JSON + JSON --> SW +``` + +## Fonctionnalités + +- **Gestion des documents** : ajoutez des fichiers et des dossiers par glisser-déposer +- **Extraction et indexation automatiques** : les nouveaux documents sont traités immédiatement et préparés pour le RAG. +- **Analyse sélective** : cochez/décochez les documents à inclure ou exclure des rapports +- **Sous-requêtes** : faites un clic droit sur un document pour une recherche ciblée sur ce document +- **Visualisation du flux de travail** : vue graphique du pipeline de rapport +- **Interface de discussion** : discussion interactive sur les documents chargés avec n'importe quel LLM +- **Intégration de Claude Code** : réponses d'API structurées ou transmission à une session Claude Code interactive +- **Export multi-format** : sortie en MD, PDF, DOCX, HTML, TXT +- **Export de prompt** : enregistrez le contexte du rapport sous forme de prompt Markdown pour des flux de travail LLM externes +- **Profils de connexion Ollama** : les paramètres de fournisseur à l'échelle de l'application peuvent être réutilisés d'un projet à l'autre +- **Prise en charge des langues** : l'interface graphique de bureau n'a pas de sélecteur de langue accessible à l'utilisateur ; son interface est actuellement principalement en allemand. Le Companion Web/PWA dispose d'un sélecteur persistant de langue d'interface pour l'allemand, l'anglais, l'espagnol, le chinois simplifié, le japonais, le russe, le français, l’hindi, l’arabe, le bengali et le portugais. Le champ de langue du projet est inclus dans les exports d'espace de travail ; il n'est pas relié à un sélecteur de langue de bureau ou de rapport. +- **Interface compatible avec les umlauts** : les chaînes de l'interface allemande utilisent les umlauts natifs ; le scanner de traduction évite les faux positifs en anglais +- **Profils** : combinaisons réutilisables de formats de sortie + +## Installation + +```bash +# Clone or copy the project folder +cd NoteSpaceLLM + +# Install dependencies +pip install -r requirements.txt + +# Start the app +python main.py +``` + +Vérifiez les dépendances : + +```bash +python main.py --check +``` + +## Configuration des LLM + +### Ollama (local — recommandé) + +1. [Installez Ollama](https://ollama.ai) +2. Téléchargez un modèle : `ollama pull llama3` +3. Dans l'application : Menu > LLM > Utiliser Ollama + +### Ollama (serveur distant) + +NoteSpaceLLM peut se connecter à un serveur Ollama distant, par exemple via [ellmos-stack](https://github.com/ellmos-ai/ellmos-stack) : + +1. Dans l'application : Menu > LLM > Paramètres +2. **URL Ollama :** `http://your-server:11435` (ou votre port) +3. **Clé API :** à renseigner si le serveur se trouve derrière un proxy d'authentification (recommandé) + +> **Astuce :** Ollama ne dispose pas d'authentification intégrée. Pour un accès distant, utilisez un proxy inverse (par exemple Nginx) avec une clé API ou une authentification Basic. + +Le point de terminaison Ollama et le modèle se configurent dans les paramètres à l'échelle de l'application ou +dans le profil de connexion sélectionné, et non par projet. Les clés API sont stockées via le +gestionnaire d'identifiants du système d'exploitation lorsqu'elles sont enregistrées dans l'application. La variable d'environnement +facultative `NOTESPACELLM_OLLAMA_API_KEY` remplace la clé enregistrée et n'est jamais écrite par +l'application. Les clés héritées en clair ne sont pas envoyées tant que vous ne les migrez pas explicitement +dans les paramètres. + +Lorsque le serveur Ollama configuré est distant, il reçoit le texte des documents utilisé pour les embeddings, ainsi que les prompts et le contexte transmis pour la génération. La clé API est envoyée à l’URL configurée dans un en-tête Bearer. HTTP en clair ne chiffre ni le contenu ni les identifiants ; le comportement de HTTPS dépend du point de terminaison et de son certificat. + +### OpenAI + +```bash +export OPENAI_API_KEY="" +``` + +### Anthropic (Claude) + +```bash +export ANTHROPIC_API_KEY="" +``` + +### Claude Code + +La CLI locale est requise : + +```bash +npm install -g @anthropic-ai/claude-code +``` + +Deux modes sont disponibles dans l’application : +- **Mode API** : la réponse structurée est renvoyée directement dans NoteSpaceLLM +- **Mode chat** : le prompt est transmis à une console Claude Code interactive + +## Utilisation + +### 1. Ajouter des documents + +- **Glisser-déposer** : déposez des fichiers ou des dossiers dans le panneau de gauche +- **Bouton** : « Ajouter des fichiers » ou « Ajouter un dossier » + +### 2. Sélectionner des documents + +- Case à cocher : inclure ou exclure des documents de l’analyse +- Boutons : « Tout » / « Aucun » pour la sélection groupée + +### 3. Sous-requêtes (facultatif) + +Faites un clic droit sur un document : +- **Créer un résumé** : résumé automatique +- **Extraire des informations** : rechercher des données précises +- **Analyser** : analyse ciblée +- **Poser une question** : question précise sur le document + +### 4. Définir la question principale + +Saisissez la question de recherche centrale dans le panneau de flux de travail. + +### 5. Choisir le type de flux de travail ou de rapport + +- **Analyse** : analyse complète avec recommandations +- **Résumé** : résumé court +- **Rapport de recherche** : structure académique +- **Comparaison** : comparaison systématique de documents + +### 6. Générer le rapport + +Cliquez sur « Créer le rapport » ; le résultat apparaît dans le panneau de droite. + +### 7. Exporter + +Sélectionnez les formats de sortie et cliquez sur « Exporter ». + +### 8. Exporter le prompt + +Utilisez **« Exporter le prompt »** pour enregistrer le contexte de travail actuel dans un fichier Markdown à utiliser dans Claude Code ou d’autres flux de travail LLM. + +## Compagnon Web/PWA + +Le dossier `web_companion/` contient une application compagnon en lecture seule pour Android, iOS et les navigateurs. Elle importe localement dans le navigateur les fichiers `notespacellm-workspace-v1.json` exportés, affiche le rapport, les métadonnées des documents et les extraits sélectionnés, et peut exporter des notes de relecture en Markdown. L’espace de travail reste dans la session actuelle du navigateur et doit être importé de nouveau après sa réouverture ; seules les notes de relecture et la langue de l’interface sont enregistrées localement. + +Test du navigateur en local : + +```powershell +$env:PYTHONIOENCODING='utf-8' +python -m http.server 8765 -d web_companion +``` + +Tests rapides du Companion : + +```powershell +cd web_companion +node --test tests/library.test.mjs +``` + +Le plan de test PWA pour Android/iOS est décrit dans `web_companion/PWA_TESTPLAN.md`. + +## Stratégie de plateforme + +L’application de bureau est l’application complète pour les documents locaux, l’index RAG et les connexions aux fournisseurs. Le compagnon Web/PWA pour Android, iOS et navigateur permet de consulter un export `notespacellm-workspace-v1.json` créé par l’utilisateur. Pour les données sensibles, configurez des points de terminaison locaux pour les modèles et les embeddings, puis relisez les exports avant de les partager. Le contrat d’échange est décrit dans `EXPORTFORMAT.md`. + +### Tests rapides du code source sur macOS et Linux + +D’autres tests rapides du code source s’exécutent dans GitHub Actions : +- `tests/platform_smoke.py` — démarrage de PySide6 sans affichage, import de documents, export de rapport et export JSON de l’espace de travail +- `tests/linux_platform_smoke.py` — enveloppe spécifique à Linux exécutée sur `ubuntu-latest` + +## Structure du projet + +``` +NoteSpaceLLM/ +├── main.py # Entry point +├── requirements.txt # Dependencies +├── translator.py # Translation-catalog scan/helper; no desktop language switch +├── locales/ # Catalog inputs for the translation helper +├── src/ +│ ├── core/ # Core functionality +│ │ ├── document_manager.py +│ │ ├── text_extractor.py +│ │ ├── sub_query.py +│ │ └── project.py +│ ├── gui/ # PySide6 UI +│ │ ├── main_window.py +│ │ ├── document_panel.py +│ │ ├── workflow_panel.py +│ │ ├── chat_panel.py +│ │ └── output_panel.py +│ ├── llm/ # LLM integration (local + remote) +│ │ ├── client.py +│ │ ├── ollama_client.py +│ │ ├── openai_client.py +│ │ └── anthropic_client.py +│ └── reports/ # Report generation +│ ├── generator.py +│ ├── templates.py +│ └── exporter.py +├── web_companion/ # PWA Companion +├── data/ # Project data (gitignored) +├── workflows/ # Workflow definitions +├── profiles/ # Output profiles +└── output/ # Exported reports +``` + +## Formats de fichiers pris en charge + +| Format | Lecture | Écriture | +|--------|---------|----------| +| PDF | ✅ | ✅ | +| DOCX | ✅ | ✅ | +| DOC | ⚠️ | — | +| TXT | ✅ | ✅ | +| MD | ✅ | ✅ | +| XLSX | ✅ | — | +| HTML | — | ✅ | +| EML | ✅ | — | +| MSG | ✅ | — | + +⚠️ Le format .doc nécessite antiword ou LibreOffice. + +## Confidentialité + +NoteSpaceLLM stocke localement les données des projets, les index de documents, les profils, les paramètres de flux de travail et les exports dans `data/`, `profiles/`, `workflows/`, `output/` et `chroma_db/`. Ces dossiers sont volontairement exclus de Git. + +Lorsque des fournisseurs LLM externes (OpenAI, Anthropic, Claude Code, Ollama distant) sont activés, les prompts et les extraits de documents sélectionnés peuvent leur être transmis. Un point de terminaison Ollama distant reçoit également le texte des documents utilisé pour les embeddings. Pour les documents sensibles, utilisez des points de terminaison locaux pour les modèles et les embeddings et relisez les rapports exportés, l’historique de discussion et les extraits sélectionnés avant de les partager ; les exports d’espace de travail ne sont pas anonymisés. + +## Conseils + +1. **Grands ensembles de documents** : sélectionnez d’abord uniquement les documents pertinents pour accélérer le traitement +2. **Sous-requêtes** : utilisez des sous-requêtes ciblées pour obtenir une analyse de meilleure qualité +3. **Ollama** : un point de terminaison Ollama local permet un traitement hors ligne. +4. **Ordre du flux de travail** : les étapes peuvent être réorganisées dans le panneau de flux de travail + +## Licence + +AGPL-3.0-only — voir [LICENSE](LICENSE) + +Le projet déclare utiliser PySide6 et PyMuPDF. Les références aux licences amont sélectionnées figurent dans [THIRD_PARTY_LICENSES.md](THIRD_PARTY_LICENSES.md) ; la licence propre au projet est AGPL-3.0-only. + +## Projet associé + +[KnowledgeDigest](https://github.com/file-bricks/KnowledgeDigest) est une base de connaissances locale distincte, avec une recherche SQLite/FTS5 et des résumés LLM facultatifs ; elle n’est pas intégrée à NoteSpaceLLM. + +## Avis de licence et de maintenance + +Consultez [LICENSE](LICENSE) pour les conditions de licence du projet. Les mainteneurs ne garantissent ni maintenance continue ni disponibilité. diff --git a/README_hi.md b/README_hi.md new file mode 100644 index 0000000..2cd2f1d --- /dev/null +++ b/README_hi.md @@ -0,0 +1,329 @@ + +NoteSpaceLLM Banner + +# NoteSpaceLLM + +[![License: AGPL v3](https://img.shields.io/badge/License-AGPL%20v3-blue.svg)](LICENSE) +[![Python 3.10+](https://img.shields.io/badge/python-3.10+-blue.svg)](https://www.python.org/) +[![Platform: Windows](https://img.shields.io/badge/platform-Windows-lightgrey.svg)]() +[![Ecosystem: file-bricks](https://img.shields.io/badge/Ecosystem-file--bricks-blue.svg)](https://github.com/file-bricks) +[![Umbrella: open-bricks](https://img.shields.io/badge/Umbrella-open--bricks-blue.svg)](https://github.com/open-bricks) +[![LLM Context: llms.txt](https://img.shields.io/badge/LLM%20Context-llms.txt-blue.svg)](llms.txt) + +[English](README.md) | [Deutsch](README_de.md) | [Español](README_es.md) | [简体中文](README_zh.md) | [日本語](README_ja.md) | [Русский](README_ru.md) | [Français](README_fr.md) | [हिन्दी](README_hi.md) | [العربية](README_ar.md) | [বাংলা](README_bn.md) | [Português](README_pt.md) + +> **शोध और रिपोर्ट निर्माण के लिए स्थानीय-प्रथम दस्तावेज़ नोटबुक, जिसमें कॉन्फ़िगर करने योग्य स्थानीय या दूरस्थ भाषा मॉडल हैं।** + +> [!NOTE] +> **AI एजेंट्स और स्वचालित वर्कफ़्लो के लिए:** +> NoteSpaceLLM [`llms.txt`](llms.txt) में मशीन-पठनीय आर्किटेक्चर और फ़ीचर अवलोकन प्रदान करता है। + +NoteSpaceLLM एक स्थानीय-प्रथम PySide6 डेस्कटॉप ऐप है जो PDF, +Word फ़ाइलों, Markdown, मेल एक्सपोर्ट, नोट्स और शोध फ़ोल्डरों के साथ काम करने के लिए है। यह डिफ़ॉल्ट रूप से +प्रोजेक्ट डेटा को स्थानीय रखता है, स्थानीय या दूरस्थ Ollama, OpenAI, +Anthropic और Claude Code वर्कफ़्लो का समर्थन करता है, और विश्लेषण परिणामों को Markdown, +PDF, DOCX, HTML और TXT में एक्सपोर्ट करता है। एक हल्का Web/PWA Companion अब उपलब्ध है, जिससे +Android, iOS और ब्राउज़र डिवाइसों पर एक्सपोर्ट किए गए वर्कस्पेस की समीक्षा की जा सकती है, बिना दस्तावेज़ों को सर्वर पर अपलोड किए। + +**सर्वोत्तम-मेल खोजें:** NotebookLM विकल्प, स्थानीय RAG दस्तावेज़ विश्लेषण, +स्थानीय दस्तावेज़ चैट, PySide6 शोध उपकरण, स्थानीय-मॉडल रिपोर्ट जनरेटर, +स्थानीय-प्रथम दस्तावेज़ वर्कफ़्लो। + +## त्वरित प्रारंभ + +```bash +git clone https://github.com/file-bricks/NoteSpaceLLM.git +cd NoteSpaceLLM +pip install -r requirements.txt +python main.py +``` + +Windows पर आप `start.bat` के माध्यम से भी लॉन्च कर सकते हैं। `build_exe.bat` के साथ एक स्थानीय Windows लॉन्चर बनाया जा सकता है। + +आवश्यकताएँ इंस्टॉल करने और स्टार्टर वर्कफ़्लो/प्रोफ़ाइल फ़ोल्डर बनाने वाले निर्देशित स्थानीय बूटस्ट्रैप के लिए, `python setup_environment.py` को स्पष्ट रूप से चलाएँ। पैकेज मेटाडेटा और बिल्ड अलग setuptools एंट्री पॉइंट का उपयोग करते हैं और उसे नहीं चलाते। + +टेस्ट चलाने और कंपाइल स्मोक चेक के लिए: + +```bash +pytest +python -m compileall -q main.py manage_translations.py setup_environment.py translator.py src +cd web_companion +npm test +``` + +## सिस्टम आर्किटेक्चर + +```mermaid +graph TD + subgraph UI ["PySide6 Desktop Application"] + DP["Document Panel (Drag & Drop)"] + WP["Workflow & Report Builder"] + CP["Interactive Chat Panel"] + OP["Multi-Format Exporter"] + end + + subgraph Engine ["Local RAG Engine"] + TE["Text Extractor (PDF/DOCX/TXT/XLSX/EML)"] + CDB[("ChromaDB Vector Store")] + RM["Report Generator & Prompts"] + end + + subgraph LLM ["LLM Integrations"] + OL["Ollama (Local / Remote)"] + OAI["OpenAI API"] + ANT["Anthropic Claude"] + CC["Claude Code CLI"] + end + + subgraph PWA ["Web / PWA Companion"] + JSON["notespacellm-workspace-v1.json"] + SW["PWA Service Worker & Mobile Review"] + end + + DP --> TE + TE --> CDB + WP --> RM + RM --> CDB + RM --> LLM + CP --> LLM + OP --> JSON + JSON --> SW +``` + +## फ़ीचर + +- **दस्तावेज़ प्रबंधन**: ड्रैग और ड्रॉप के माध्यम से फ़ाइलें और डायरेक्टरी जोड़ें +- **स्वचालित निष्कर्षण और इंडेक्सिंग**: नए दस्तावेज़ तुरंत संसाधित होते हैं और RAG के लिए तैयार किए जाते हैं। +- **चयनात्मक विश्लेषण**: रिपोर्ट में शामिल या बाहर रखने के लिए दस्तावेज़ों को चेक/अनचेक करें +- **उप-क्वेरी**: लक्षित दस्तावेज़-विशिष्ट शोध के लिए किसी दस्तावेज़ पर राइट-क्लिक करें +- **वर्कफ़्लो विज़ुअलाइज़ेशन**: रिपोर्ट पाइपलाइन का ग्राफ़िकल अवलोकन +- **चैट इंटरफ़ेस**: किसी भी LLM के साथ लोड किए गए दस्तावेज़ों पर इंटरैक्टिव चैट +- **Claude Code एकीकरण**: संरचित API प्रतिक्रियाएँ या इंटरैक्टिव Claude Code सत्र में हैंड-ऑफ़ +- **मल्टी-फ़ॉर्मेट एक्सपोर्ट**: MD, PDF, DOCX, HTML, TXT में आउटपुट +- **प्रॉम्प्ट एक्सपोर्ट**: बाहरी LLM वर्कफ़्लो के लिए रिपोर्ट संदर्भ को Markdown प्रॉम्प्ट के रूप में सहेजें +- **Ollama कनेक्शन प्रोफ़ाइल**: ऐप-व्यापी प्रदाता सेटिंग्स को प्रोजेक्ट्स में पुनः उपयोग किया जा सकता है +- **भाषा समर्थन**: डेस्कटॉप GUI में उपयोगकर्ता-चयन योग्य कोई भाषा नहीं है; इसका इंटरफ़ेस वर्तमान में मुख्यतः जर्मन है। Web/PWA Companion में जर्मन, अंग्रेज़ी, स्पैनिश, सरलीकृत चीनी, जापानी, रूसी, फ़्रेंच, हिंदी, अरबी, बंगाली और पुर्तगाली के लिए एक स्थायी UI-भाषा चयनकर्ता है। प्रोजेक्ट भाषा फ़ील्ड वर्कस्पेस एक्सपोर्ट में शामिल है; यह डेस्कटॉप UI या रिपोर्ट-भाषा चयनकर्ता से जुड़ा नहीं है। +- **Umlaut-सुरक्षित UI**: जर्मन UI स्ट्रिंग्स मूल umlauts का उपयोग करती हैं; अनुवाद स्कैनर अंग्रेज़ी के गलत सकारात्मक परिणामों से बचता है +- **प्रोफ़ाइल**: पुन: उपयोग योग्य आउटपुट-फ़ॉर्मेट संयोजन + +## इंस्टॉलेशन + +```bash +# Clone or copy the project folder +cd NoteSpaceLLM + +# Install dependencies +pip install -r requirements.txt + +# Start the app +python main.py +``` + +निर्भरताएँ जाँचें: + +```bash +python main.py --check +``` + +## LLM कॉन्फ़िगरेशन + +### Ollama (स्थानीय — अनुशंसित) + +1. [Ollama इंस्टॉल करें](https://ollama.ai) +2. एक मॉडल डाउनलोड करें: `ollama pull llama3` +3. ऐप में: Menu > LLM > Use Ollama + +### Ollama (दूरस्थ सर्वर) + +NoteSpaceLLM एक दूरस्थ Ollama सर्वर से कनेक्ट हो सकता है, उदाहरण के लिए [ellmos-stack](https://github.com/ellmos-ai/ellmos-stack) के माध्यम से: + +1. ऐप में: Menu > LLM > Settings +2. **Ollama URL:** `http://your-server:11435` (या आपका पोर्ट) +3. **API Key:** यदि सर्वर किसी auth proxy के पीछे है (अनुशंसित) + +> **सुझाव:** Ollama में अंतर्निर्मित प्रमाणीकरण नहीं है। दूरस्थ पहुँच के लिए API key या Basic Auth के साथ रिवर्स प्रॉक्सी (जैसे Nginx) का उपयोग करें। + +Ollama endpoint और मॉडल ऐप-व्यापी सेटिंग्स या चयनित कनेक्शन प्रोफ़ाइल में +कॉन्फ़िगर होते हैं, प्रति प्रोजेक्ट नहीं। ऐप में सहेजे जाने पर API keys ऑपरेटिंग सिस्टम के +credential store के माध्यम से संग्रहीत होती हैं। वैकल्पिक +`NOTESPACELLM_OLLAMA_API_KEY` environment variable सहेजी गई key को ओवरराइड करता है और +ऐप द्वारा कभी लिखा नहीं जाता। Legacy plaintext keys तब तक नहीं भेजी जातीं जब तक आप +सेटिंग्स में उन्हें स्पष्ट रूप से माइग्रेट नहीं करते। + +जब कॉन्फ़िगर किया गया Ollama सर्वर रिमोट होता है, तो वह एम्बेडिंग के लिए उपयोग किया जाने वाला दस्तावेज़ टेक्स्ट और जेनरेशन के लिए भेजे गए prompts/context प्राप्त करता है। API key को Bearer header के रूप में कॉन्फ़िगर किए गए URL पर भेजा जाता है। सादा HTTP न तो सामग्री को और न ही क्रेडेंशियल्स को एन्क्रिप्ट करता है; HTTPS का व्यवहार endpoint और उसके certificate पर निर्भर करता है। + +### OpenAI + +```bash +export OPENAI_API_KEY="" +``` + +### Anthropic (Claude) + +```bash +export ANTHROPIC_API_KEY="" +``` + +### Claude Code + +इसके लिए स्थानीय CLI आवश्यक है: + +```bash +npm install -g @anthropic-ai/claude-code +``` + +ऐप में दो मोड उपलब्ध हैं: +- **API मोड**: संरचित प्रतिक्रिया सीधे NoteSpaceLLM में लौटाई जाती है +- **Chat मोड**: prompt को एक इंटरैक्टिव Claude Code console को सौंप देता है + +## उपयोग + +### 1. दस्तावेज़ जोड़ें + +- **Drag & Drop**: फ़ाइलें या फ़ोल्डर बाएँ पैनल में छोड़ें +- **बटन**: "Add files" या "Add folder" + +### 2. दस्तावेज़ चुनें + +- Checkbox: विश्लेषण के लिए दस्तावेज़ों को शामिल/बाहर करें +- बटन: बल्क चयन के लिए "All" / "None" + +### 3. Sub-queries (वैकल्पिक) + +किसी दस्तावेज़ पर राइट-क्लिक करें: +- **Create summary**: स्वचालित सारांश +- **Extract information**: विशिष्ट डेटा खोजें +- **Analyse**: लक्षित विश्लेषण +- **Ask question**: दस्तावेज़ के बारे में विशिष्ट प्रश्न + +### 4. मुख्य प्रश्न परिभाषित करें + +workflow पैनल में केंद्रीय शोध प्रश्न दर्ज करें। + +### 5. Workflow/रिपोर्ट प्रकार चुनें + +- **Analysis**: सिफारिशों के साथ व्यापक विश्लेषण +- **Summary**: संक्षिप्त सारांश +- **Research report**: शैक्षणिक संरचना +- **Comparison**: व्यवस्थित दस्तावेज़ तुलना + +### 6. रिपोर्ट बनाएँ + +"Create report" पर क्लिक करें — आउटपुट दाएँ पैनल में दिखाई देगा। + +### 7. एक्सपोर्ट + +आउटपुट फ़ॉर्मेट चुनें और "Export" पर क्लिक करें। + +### 8. Prompt एक्सपोर्ट + +वर्तमान कार्यशील context को Claude Code या अन्य LLM workflows में उपयोग के लिए Markdown फ़ाइल के रूप में सहेजने हेतु **"Export prompt"** का उपयोग करें। + +## Web/PWA Companion + +`web_companion/` के अंतर्गत Android, iOS और browser के लिए एक केवल-पढ़ने योग्य Companion strand है। यह browser में स्थानीय रूप से निर्यात किए गए `notespacellm-workspace-v1.json` फ़ाइलों को आयात करता है, रिपोर्ट, दस्तावेज़ मेटाडेटा और चयनित अंश दिखाता है, और समीक्षा नोट्स को Markdown के रूप में एक्सपोर्ट कर सकता है। workspace वर्तमान browser session में रहता है और ब्राउज़र दोबारा खोलने के बाद फिर से आयात करना होगा; केवल समीक्षा नोट्स और UI locale स्थानीय रूप से सहेजे जाते हैं। + +स्थानीय browser परीक्षण: + +```powershell +$env:PYTHONIOENCODING='utf-8' +python -m http.server 8765 -d web_companion +``` + +Companion smokes: + +```powershell +cd web_companion +node --test tests/library.test.mjs +``` + +Android/iOS PWA परीक्षण योजना `web_companion/PWA_TESTPLAN.md` में दस्तावेज़ित है। + +## प्लेटफ़ॉर्म रणनीति + +डेस्कटॉप ऐप स्थानीय दस्तावेज़ों, RAG index और provider कनेक्शनों के लिए पूर्ण एप्लिकेशन है। Android, iOS और browser Web/PWA Companion उपयोगकर्ता द्वारा बनाए गए `notespacellm-workspace-v1.json` एक्सपोर्ट की समीक्षा के लिए उपलब्ध है। संवेदनशील सामग्री के लिए, स्थानीय model और embedding endpoints कॉन्फ़िगर करें और साझा करने से पहले एक्सपोर्ट की समीक्षा करें। विनिमय अनुबंध `EXPORTFORMAT.md` में दस्तावेज़ित है। + +### macOS और Linux Source Smokes + +GitHub Actions में अतिरिक्त source smokes चलते हैं: +- `tests/platform_smoke.py` — offscreen PySide6 start, दस्तावेज़ आयात, रिपोर्ट एक्सपोर्ट, workspace JSON एक्सपोर्ट +- `tests/linux_platform_smoke.py` — `ubuntu-latest` के ऊपर Linux-विशिष्ट wrapper + +## प्रोजेक्ट संरचना + +``` +NoteSpaceLLM/ +├── main.py # Entry point +├── requirements.txt # Dependencies +├── translator.py # Translation-catalog scan/helper; no desktop language switch +├── locales/ # Catalog inputs for the translation helper +├── src/ +│ ├── core/ # Core functionality +│ │ ├── document_manager.py +│ │ ├── text_extractor.py +│ │ ├── sub_query.py +│ │ └── project.py +│ ├── gui/ # PySide6 UI +│ │ ├── main_window.py +│ │ ├── document_panel.py +│ │ ├── workflow_panel.py +│ │ ├── chat_panel.py +│ │ └── output_panel.py +│ ├── llm/ # LLM integration (local + remote) +│ │ ├── client.py +│ │ ├── ollama_client.py +│ │ ├── openai_client.py +│ │ └── anthropic_client.py +│ └── reports/ # Report generation +│ ├── generator.py +│ ├── templates.py +│ └── exporter.py +├── web_companion/ # PWA Companion +├── data/ # Project data (gitignored) +├── workflows/ # Workflow definitions +├── profiles/ # Output profiles +└── output/ # Exported reports +``` + +## समर्थित फ़ाइल फ़ॉर्मेट + +| फ़ॉर्मेट | पढ़ना | लिखना | +|--------|------|-------| +| PDF | ✅ | ✅ | +| DOCX | ✅ | ✅ | +| DOC | ⚠️ | — | +| TXT | ✅ | ✅ | +| MD | ✅ | ✅ | +| XLSX | ✅ | — | +| HTML | — | ✅ | +| EML | ✅ | — | +| MSG | ✅ | — | + +⚠️ .doc के लिए antiword या LibreOffice आवश्यक है + +## गोपनीयता + +NoteSpaceLLM प्रोजेक्ट डेटा, दस्तावेज़ indexes, profiles, workflow settings और exports को `data/`, `profiles/`, `workflows/`, `output/` और `chroma_db/` में स्थानीय रूप से संग्रहीत करता है। ये फ़ोल्डर जानबूझकर Git से बाहर रखे गए हैं। + +जब बाहरी LLM providers (OpenAI, Anthropic, Claude Code, रिमोट Ollama) सक्षम होते हैं, तो prompts और चयनित दस्तावेज़ अंश उन सेवाओं को भेजे जा सकते हैं। रिमोट Ollama endpoint को एम्बेडिंग के लिए उपयोग किया जाने वाला दस्तावेज़ टेक्स्ट भी प्राप्त होता है। संवेदनशील दस्तावेज़ों के लिए स्थानीय model और embedding endpoints का उपयोग करें और साझा करने से पहले निर्यात की गई रिपोर्ट, chat history और चयनित अंशों की समीक्षा करें; workspace exports अनामित नहीं होते। + +## सुझाव + +1. **बड़े दस्तावेज़ सेट**: तेज़ परिणामों के लिए पहले केवल प्रासंगिक दस्तावेज़ चुनें +2. **Sub-queries**: उच्च-गुणवत्ता विश्लेषण के लिए लक्षित sub-queries का उपयोग करें +3. **Ollama**: स्थानीय Ollama endpoint ऑफ़लाइन प्रोसेसिंग का समर्थन करता है। +4. **Workflow क्रम**: workflow पैनल में चरणों का क्रम बदला जा सकता है + +## लाइसेंस + +AGPL-3.0-only — देखें [LICENSE](LICENSE) + +यह प्रोजेक्ट PySide6 और PyMuPDF घोषित करता है। चयनित upstream लाइसेंस संदर्भों के लिए [THIRD_PARTY_LICENSES.md](THIRD_PARTY_LICENSES.md) देखें; प्रोजेक्ट का अपना लाइसेंस AGPL-3.0-only है। + +## संबंधित प्रोजेक्ट + +[KnowledgeDigest](https://github.com/file-bricks/KnowledgeDigest) SQLite/FTS5 खोज और वैकल्पिक LLM सारांश वाला एक अलग स्थानीय ज्ञान डेटाबेस है; यह NoteSpaceLLM में एकीकृत नहीं है। + +## लाइसेंस और रखरखाव सूचना + +प्रोजेक्ट की लाइसेंस शर्तों के लिए [LICENSE](LICENSE) देखें। maintainers निरंतर रखरखाव या उपलब्धता का वादा नहीं करते। diff --git a/README_ja.md b/README_ja.md new file mode 100644 index 0000000..91deaf9 --- /dev/null +++ b/README_ja.md @@ -0,0 +1,317 @@ + +NoteSpaceLLM Banner + +# NoteSpaceLLM + +[![License: AGPL v3](https://img.shields.io/badge/License-AGPL%20v3-blue.svg)](LICENSE) +[![Python 3.10+](https://img.shields.io/badge/python-3.10+-blue.svg)](https://www.python.org/) +[![Platform: Windows](https://img.shields.io/badge/platform-Windows-lightgrey.svg)]() +[![Ecosystem: file-bricks](https://img.shields.io/badge/Ecosystem-file--bricks-blue.svg)](https://github.com/file-bricks) +[![Umbrella: open-bricks](https://img.shields.io/badge/Umbrella-open--bricks-blue.svg)](https://github.com/open-bricks) +[![LLM Context: llms.txt](https://img.shields.io/badge/LLM%20Context-llms.txt-blue.svg)](llms.txt) + +[English](README.md) | [Deutsch](README_de.md) | [Español](README_es.md) | [简体中文](README_zh.md) | [日本語](README_ja.md) | [Русский](README_ru.md) | [Français](README_fr.md) | [हिन्दी](README_hi.md) | [العربية](README_ar.md) | [বাংলা](README_bn.md) | [Português](README_pt.md) + +> **研究およびレポート生成のための、ローカル優先のドキュメントノートブックです。設定可能なローカルまたはリモートの言語モデルに対応しています。** + +> [!NOTE] +> **AIエージェントおよび自動化ワークフロー向け:** +> NoteSpaceLLMは、機械可読なアーキテクチャと機能の概要を [`llms.txt`](llms.txt) で提供しています。 + +NoteSpaceLLMは、PDF、Word文書、Markdown、メールのエクスポート、メモ、研究フォルダを扱うためのローカル優先のPySide6デスクトップアプリです。デフォルトでプロジェクトデータをローカルに保持し、ローカルまたはリモートのOllama、OpenAI、Anthropic、Claude Codeのワークフローに対応し、分析結果をMarkdown、PDF、DOCX、HTML、TXTにエクスポートします。軽量なWeb/PWAコンパニオンも利用可能になり、文書をサーバーにアップロードすることなく、Android、iOS、ブラウザのデバイス上でエクスポートされたワークスペースを確認できます。 + +**検索キーワードの例:** NotebookLM の代替、ローカル RAG 文書分析、ローカル文書チャット、PySide6 の研究ツール、ローカルモデルを使ったレポート生成、ローカル優先の文書ワークフロー + +## クイックスタート + +```bash +git clone https://github.com/file-bricks/NoteSpaceLLM.git +cd NoteSpaceLLM +pip install -r requirements.txt +python main.py +``` + +Windowsでは、`start.bat` から起動することもできます。ローカルのWindowsランチャーは `build_exe.bat` でビルドできます。 + +依存関係をインストールし、スターター用のワークフロー/プロフィールフォルダを作成する、ガイド付きのローカルブートストラップを行うには、`python setup_environment.py` を明示的に実行してください。パッケージのメタデータとビルドは別の setuptools エントリポイントを使用し、これを実行しません。 + +テストとコンパイルのスモークチェックは次のコマンドで実行します: + +```bash +pytest +python -m compileall -q main.py manage_translations.py setup_environment.py translator.py src +cd web_companion +npm test +``` + +## システムアーキテクチャ + +```mermaid +graph TD + subgraph UI ["PySide6 Desktop Application"] + DP["Document Panel (Drag & Drop)"] + WP["Workflow & Report Builder"] + CP["Interactive Chat Panel"] + OP["Multi-Format Exporter"] + end + + subgraph Engine ["Local RAG Engine"] + TE["Text Extractor (PDF/DOCX/TXT/XLSX/EML)"] + CDB[("ChromaDB Vector Store")] + RM["Report Generator & Prompts"] + end + + subgraph LLM ["LLM Integrations"] + OL["Ollama (Local / Remote)"] + OAI["OpenAI API"] + ANT["Anthropic Claude"] + CC["Claude Code CLI"] + end + + subgraph PWA ["Web / PWA Companion"] + JSON["notespacellm-workspace-v1.json"] + SW["PWA Service Worker & Mobile Review"] + end + + DP --> TE + TE --> CDB + WP --> RM + RM --> CDB + RM --> LLM + CP --> LLM + OP --> JSON + JSON --> SW +``` + +## 機能 + +- **ドキュメント管理**: ドラッグ&ドロップでファイルやディレクトリを追加 +- **自動抽出とインデックス作成**: 新しい文書は直ちに処理され、RAG用に準備されます。 +- **選択的な分析**: 文書にチェックを入れる/外すことで、レポートに含めるか除外するかを指定 +- **サブクエリ**: 文書を右クリックして、文書ごとの対象を絞った調査を実行 +- **ワークフローの可視化**: レポートパイプラインのグラフィカルな概要 +- **チャットインターフェース**: 任意のLLMを使い、読み込んだ文書に対して対話形式で質問 +- **Claude Code連携**: 構造化されたAPIレスポンス、または対話型のClaude Codeセッションへの引き継ぎ +- **マルチフォーマットエクスポート**: MD、PDF、DOCX、HTML、TXTへの出力 +- **プロンプトのエクスポート**: レポートのコンテキストを、外部のLLMワークフロー用にMarkdownプロンプトとして保存 +- **Ollama接続プロフィール**: アプリ全体のプロバイダー設定を、複数のプロジェクトで再利用可能 +- **言語サポート**: デスクトップGUIにはユーザーが選択できる言語はなく、インターフェースは現在主にドイツ語です。Web/PWAコンパニオンには、ドイツ語、英語、スペイン語、簡体字中国語、日本語、ロシア語、フランス語、ヒンディー語、アラビア語、ベンガル語、ポルトガル語を選択できる永続的なUI言語セレクターがあります。プロジェクトの言語フィールドはワークスペースのエクスポートに含まれますが、デスクトップUIやレポート言語の選択には接続されていません。 +- **ウムラウト対応のUI**: ドイツ語のUI文字列では本来のウムラウトを使用し、翻訳スキャナーは英語の誤検出を回避します +- **プロフィール**: 再利用可能な出力フォーマットの組み合わせ + +## インストール + +```bash +# Clone or copy the project folder +cd NoteSpaceLLM + +# Install dependencies +pip install -r requirements.txt + +# Start the app +python main.py +``` + +依存関係を確認します: + +```bash +python main.py --check +``` + +## LLM の設定 + +### Ollama(ローカル — 推奨) + +1. [Ollama をインストール](https://ollama.ai) +2. モデルをダウンロード: `ollama pull llama3` +3. アプリで: メニュー > LLM > Use Ollama + +### Ollama(リモートサーバー) + +NoteSpaceLLM は、たとえば [ellmos-stack](https://github.com/ellmos-ai/ellmos-stack) を介して、リモートの Ollama サーバーに接続できます: + +1. アプリで: メニュー > LLM > Settings +2. **Ollama URL:** `http://your-server:11435`(またはお使いのポート) +3. **API Key:** サーバーが認証プロキシの背後にある場合(推奨) + +> **ヒント:** Ollama には組み込みの認証機能がありません。リモートアクセスには、API キーまたは Basic 認証を備えたリバースプロキシ(例: Nginx)を使用してください。 + +Ollama のエンドポイントとモデルは、プロジェクトごとではなく、アプリ全体の設定または選択された接続プロフィールで構成されます。アプリで保存された API キーは、オペレーティングシステムの資格情報ストアを通じて保存されます。任意の `NOTESPACELLM_OLLAMA_API_KEY` 環境変数は、保存されたキーより優先され、アプリによって書き込まれることはありません。レガシーの平文キーは、設定で明示的に移行するまで送信されません。 + +構成されたOllamaサーバーがリモートの場合、埋め込み用のドキュメント本文と、生成用に送信されるプロンプトやコンテキストを受信します。APIキーは、Bearerヘッダーとして設定されたURLに送信されます。プレーンHTTPではコンテンツも認証情報も暗号化されず、HTTPSの動作はエンドポイントとその証明書によって異なります。 + +### OpenAI + +```bash +export OPENAI_API_KEY="" +``` + +### Anthropic (Claude) + +```bash +export ANTHROPIC_API_KEY="" +``` + +### Claude Code + +ローカルのCLIが必要です: + +```bash +npm install -g @anthropic-ai/claude-code +``` + +アプリでは2つのモードが利用できます: +- **APIモード**: 構造化された応答がNoteSpaceLLMに直接返されます +- **チャットモード**: プロンプトを対話型のClaude Codeコンソールに引き渡します + +## 使い方 + +### 1. ドキュメントの追加 + +- **ドラッグ&ドロップ**: 左パネルにファイルまたはフォルダーをドロップします +- **ボタン**: 「Add files」または「Add folder」 + +### 2. ドキュメントの選択 + +- チェックボックス: 分析対象のドキュメントを含める/除外する +- ボタン: 一括選択のための「All」/「None」 + +### 3. サブクエリ(任意) + +ドキュメントを右クリックします: +- **Create summary**: 自動要約 +- **Extract information**: 特定のデータを検索 +- **Analyse**: 対象を絞った分析 +- **Ask question**: ドキュメントに関する特定の質問 + +### 4. 主要な質問の定義 + +ワークフローパネルに中心となる研究上の質問を入力します。 + +### 5. ワークフロー/レポートタイプの選択 + +- **Analysis**: 提言を含む包括的な分析 +- **Summary**: 短い要約 +- **Research report**: 学術的な構成 +- **Comparison**: 体系的なドキュメント比較 + +### 6. レポートの生成 + +「Create report」をクリックすると、出力が右パネルに表示されます。 + +### 7. エクスポート + +出力形式を選択し、「Export」をクリックします。 + +### 8. プロンプトのエクスポート + +**「Export prompt」**を使用すると、現在の作業コンテキストをMarkdownファイルとして保存でき、Claude Codeやその他のLLMワークフローで利用できます。 + +## Web/PWAコンパニオン + +`web_companion/` の下には、Android、iOS、ブラウザー向けの読み取り専用のCompanionストランドがあります。エクスポートされた`notespacellm-workspace-v1.json`ファイルをブラウザー内でローカルにインポートし、レポート、ドキュメントのメタデータ、選択された抜粋を表示し、レビューメモをMarkdownとしてエクスポートできます。ワークスペースは現在のブラウザーセッション内に保持され、再度開いた後は再インポートが必要です。ローカルに保存されるのはレビューメモとUIのロケールのみです。 + +ローカルブラウザーテスト: + +```powershell +$env:PYTHONIOENCODING='utf-8' +python -m http.server 8765 -d web_companion +``` + +Companionのスモークテスト: + +```powershell +cd web_companion +node --test tests/library.test.mjs +``` + +Android/iOS PWAのテスト計画は`web_companion/PWA_TESTPLAN.md`に記載されています。 + +## プラットフォーム戦略 + +デスクトップアプリは、ローカルのドキュメント、RAGインデックス、プロバイダー接続のためのフルアプリケーションです。Android、iOS、ブラウザーのWeb/PWAコンパニオンは、ユーザーが作成した`notespacellm-workspace-v1.json`エクスポートを確認するために利用できます。機密性の高い資料については、ローカルのモデルおよび埋め込みエンドポイントを設定し、共有前にエクスポートを確認してください。データのやり取りの仕様は`EXPORTFORMAT.md`に記載されています。 + +### macOSおよびLinuxのソーススモークテスト + +GitHub Actionsで追加のソーススモークテストが実行されます: +- `tests/platform_smoke.py` — オフスクリーンのPySide6起動、ドキュメントのインポート、レポートのエクスポート、ワークスペースJSONのエクスポート +- `tests/linux_platform_smoke.py` — `ubuntu-latest`向けのLinux固有のラッパー + +## プロジェクト構造 + +``` +NoteSpaceLLM/ +├── main.py # Entry point +├── requirements.txt # Dependencies +├── translator.py # Translation-catalog scan/helper; no desktop language switch +├── locales/ # Catalog inputs for the translation helper +├── src/ +│ ├── core/ # Core functionality +│ │ ├── document_manager.py +│ │ ├── text_extractor.py +│ │ ├── sub_query.py +│ │ └── project.py +│ ├── gui/ # PySide6 UI +│ │ ├── main_window.py +│ │ ├── document_panel.py +│ │ ├── workflow_panel.py +│ │ ├── chat_panel.py +│ │ └── output_panel.py +│ ├── llm/ # LLM integration (local + remote) +│ │ ├── client.py +│ │ ├── ollama_client.py +│ │ ├── openai_client.py +│ │ └── anthropic_client.py +│ └── reports/ # Report generation +│ ├── generator.py +│ ├── templates.py +│ └── exporter.py +├── web_companion/ # PWA Companion +├── data/ # Project data (gitignored) +├── workflows/ # Workflow definitions +├── profiles/ # Output profiles +└── output/ # Exported reports +``` + +## 対応ファイル形式 + +| 形式 | 読み取り | 書き出し | +|--------|----------|----------| +| PDF | ✅ | ✅ | +| DOCX | ✅ | ✅ | +| DOC | ⚠️ | — | +| TXT | ✅ | ✅ | +| MD | ✅ | ✅ | +| XLSX | ✅ | — | +| HTML | — | ✅ | +| EML | ✅ | — | +| MSG | ✅ | — | + +⚠️ .docにはantiwordまたはLibreOfficeが必要です + +## プライバシー + +NoteSpaceLLMは、プロジェクトデータ、ドキュメントのインデックス、プロファイル、ワークフロー設定、エクスポートを、`data/`、`profiles/`、`workflows/`、`output/`、`chroma_db/`にローカルで保存します。これらのフォルダーはGitの管理対象から意図的に除外されています。 + +外部のLLMプロバイダー(OpenAI、Anthropic、Claude Code、リモートのOllama)が有効な場合、プロンプトと選択されたドキュメントの抜粋がそれらのサービスに送信される可能性があります。リモートのOllamaエンドポイントは、埋め込みに使用されるドキュメント本文も受信します。機密性の高いドキュメントについては、ローカルのモデルおよび埋め込みエンドポイントを使用し、共有前にエクスポートされたレポート、チャット履歴、選択された抜粋を確認してください。ワークスペースのエクスポートは匿名化されていません。 + +## ヒント + +1. **大量のドキュメントセット**: より速い結果を得るために、まず関連するドキュメントのみを選択してください +2. **サブクエリ**: より高品質な分析のために、対象を絞ったサブクエリを使用してください +3. **Ollama**: ローカルのOllamaエンドポイントはオフライン処理に対応しています。 +4. **ワークフローの順序**: ワークフローパネルでステップの順序を変更できます + +## ライセンス + +AGPL-3.0-only — [LICENSE](LICENSE) を参照 + +本プロジェクトはPySide6およびPyMuPDFを宣言しています。選択された上流のライセンス参照については[THIRD_PARTY_LICENSES.md](THIRD_PARTY_LICENSES.md)を参照してください。本プロジェクト自体のライセンスはAGPL-3.0-onlyです。 + +## 関連プロジェクト + +[KnowledgeDigest](https://github.com/file-bricks/KnowledgeDigest)は、SQLite/FTS5検索と任意のLLM要約機能を備えた、別個のローカル知識データベースです。NoteSpaceLLMとは統合されていません。 + +## ライセンスおよび保守に関する通知 + +プロジェクトのライセンス条件については[LICENSE](LICENSE)を参照してください。メンテナーは、継続的な保守や提供を約束するものではありません。 diff --git a/README_pt.md b/README_pt.md new file mode 100644 index 0000000..f2b98da --- /dev/null +++ b/README_pt.md @@ -0,0 +1,332 @@ + +NoteSpaceLLM Banner + +# NoteSpaceLLM + +[![Licença: AGPL v3](https://img.shields.io/badge/License-AGPL%20v3-blue.svg)](LICENSE) +[![Python 3.10+](https://img.shields.io/badge/python-3.10+-blue.svg)](https://www.python.org/) +[![Plataforma: Windows](https://img.shields.io/badge/platform-Windows-lightgrey.svg)]() +[![Ecossistema: file-bricks](https://img.shields.io/badge/Ecosystem-file--bricks-blue.svg)](https://github.com/file-bricks) +[![Guarda-chuva: open-bricks](https://img.shields.io/badge/Umbrella-open--bricks-blue.svg)](https://github.com/open-bricks) +[![Contexto para LLM: llms.txt](https://img.shields.io/badge/LLM%20Context-llms.txt-blue.svg)](llms.txt) + +[English](README.md) | [Deutsch](README_de.md) | [Español](README_es.md) | [简体中文](README_zh.md) | [日本語](README_ja.md) | [Русский](README_ru.md) | [Français](README_fr.md) | [हिन्दी](README_hi.md) | [العربية](README_ar.md) | [বাংলা](README_bn.md) | [Português](README_pt.md) + +> **Caderno de documentos local-first para pesquisa e geração de relatórios com modelos de linguagem locais ou remotos configuráveis.** + +> [!NOTE] +> **Para Agentes de IA e Fluxos de Trabalho Automatizados:** +> O NoteSpaceLLM fornece uma visão geral da arquitetura e dos recursos legível por máquina em [`llms.txt`](llms.txt). + +O NoteSpaceLLM é um aplicativo de desktop local-first em PySide6 para trabalhar com PDFs, +arquivos Word, Markdown, exportações de e-mail, notas e pastas de pesquisa. Ele mantém +os dados do projeto localmente por padrão, oferece suporte a fluxos de trabalho com Ollama local ou remoto, OpenAI, +Anthropic e Claude Code, e exporta os resultados de análise para Markdown, +PDF, DOCX, HTML e TXT. Um Companion Web/PWA leve já está disponível para +revisar workspaces exportados em dispositivos Android, iOS e navegadores, sem +enviar documentos a um servidor. + +**Buscas mais relevantes:** alternativa ao NotebookLM, análise de documentos com RAG local, +chat com documentos locais, ferramenta de pesquisa em PySide6, gerador de relatórios com modelos locais, +fluxo de trabalho de documentos local-first. + +## Início Rápido + +```bash +git clone https://github.com/file-bricks/NoteSpaceLLM.git +cd NoteSpaceLLM +pip install -r requirements.txt +python main.py +``` + +No Windows, você também pode iniciar via `start.bat`. Um iniciador local para Windows pode ser criado com `build_exe.bat`. + +Para uma inicialização local guiada, que instala os requisitos e cria as pastas iniciais de fluxos de trabalho/perfis, execute explicitamente `python setup_environment.py`. Os metadados do pacote e as compilações usam o ponto de entrada separado do setuptools e não o executam. + +Execute os testes e as verificações de compilação rápidas com: + +```bash +pytest +python -m compileall -q main.py manage_translations.py setup_environment.py translator.py src +cd web_companion +npm test +``` + +## Arquitetura do Sistema + +```mermaid +graph TD + subgraph UI ["PySide6 Desktop Application"] + DP["Document Panel (Drag & Drop)"] + WP["Workflow & Report Builder"] + CP["Interactive Chat Panel"] + OP["Multi-Format Exporter"] + end + + subgraph Engine ["Local RAG Engine"] + TE["Text Extractor (PDF/DOCX/TXT/XLSX/EML)"] + CDB[("ChromaDB Vector Store")] + RM["Report Generator & Prompts"] + end + + subgraph LLM ["LLM Integrations"] + OL["Ollama (Local / Remote)"] + OAI["OpenAI API"] + ANT["Anthropic Claude"] + CC["Claude Code CLI"] + end + + subgraph PWA ["Web / PWA Companion"] + JSON["notespacellm-workspace-v1.json"] + SW["PWA Service Worker & Mobile Review"] + end + + DP --> TE + TE --> CDB + WP --> RM + RM --> CDB + RM --> LLM + CP --> LLM + OP --> JSON + JSON --> SW +``` + +## Recursos + +- **Gerenciamento de documentos**: Adicione arquivos e diretórios por arrastar e soltar +- **Extração e indexação automáticas**: Novos documentos são processados imediatamente e preparados para RAG. +- **Análise seletiva**: Marque/desmarque documentos para incluí-los ou excluí-los dos relatórios +- **Subconsultas**: Clique com o botão direito em um documento para pesquisas direcionadas a esse documento +- **Visualização do fluxo de trabalho**: Visão gráfica do pipeline de relatórios +- **Interface de chat**: Chat interativo sobre os documentos carregados com qualquer LLM +- **Integração com Claude Code**: Respostas estruturadas da API ou transferência para uma sessão interativa do Claude Code +- **Exportação em múltiplos formatos**: Saída para MD, PDF, DOCX, HTML, TXT +- **Exportação de prompt**: Salve o contexto do relatório como um prompt em Markdown para fluxos de trabalho com LLMs externos +- **Perfis de conexão com Ollama**: As configurações de provedor válidas para todo o aplicativo podem ser reutilizadas entre projetos +- **Suporte a idiomas**: A GUI de desktop não tem seletor de idioma para o usuário; sua interface é atualmente, em grande parte, em alemão. O Companion Web/PWA tem um seletor persistente de idioma da interface para alemão, inglês, espanhol, chinês simplificado, japonês, russo, francês, hindi, árabe, bengali e português. O campo de idioma do projeto é incluído nas exportações de workspace; ele não está conectado a um seletor de idioma da interface de desktop nem do relatório. +- **Interface segura para umlauts**: Textos da interface em alemão usam umlauts nativos; o verificador de tradução evita falsos positivos em inglês +- **Perfis**: Combinações reutilizáveis de formatos de saída + +## Instalação + +```bash +# Clone or copy the project folder +cd NoteSpaceLLM + +# Install dependencies +pip install -r requirements.txt + +# Start the app +python main.py +``` + +Verifique as dependências: + +```bash +python main.py --check +``` + +## Configuração de LLM + +### Ollama (Local — Recomendado) + +1. [Instale o Ollama](https://ollama.ai) +2. Baixe um modelo: `ollama pull llama3` +3. No aplicativo: Menu > LLM > Usar Ollama + +### Ollama (Servidor Remoto) + +O NoteSpaceLLM pode se conectar a um servidor Ollama remoto, por exemplo via [ellmos-stack](https://github.com/ellmos-ai/ellmos-stack): + +1. No aplicativo: Menu > LLM > Configurações +2. **URL do Ollama:** `http://your-server:11435` (ou a sua porta) +3. **Chave de API:** Se o servidor estiver atrás de um proxy de autenticação (recomendado) + +> **Dica:** O Ollama não possui autenticação integrada. Para acesso remoto, use um proxy reverso (por exemplo, Nginx) com chave de API ou Basic Auth. + +O endpoint e o modelo do Ollama são configurados nas configurações válidas para todo o aplicativo ou no +perfil de conexão selecionado, não por projeto. As chaves de API são armazenadas pelo +cofre de credenciais do sistema operacional quando salvas no aplicativo. A variável de ambiente +`NOTESPACELLM_OLLAMA_API_KEY` opcional substitui a chave salva e +nunca é gravada pelo aplicativo. Chaves em texto simples legadas não são enviadas até que você +migre-as explicitamente nas configurações. + +Quando o servidor Ollama configurado é remoto, ele recebe o texto dos documentos usado para embeddings e os prompts/contexto enviados para geração. A chave de API é enviada para a URL configurada como cabeçalho Bearer. HTTP simples não criptografa nem o conteúdo nem as credenciais; o comportamento do HTTPS depende do endpoint e do seu certificado. + +### OpenAI + +```bash +export OPENAI_API_KEY="" +``` + +### Anthropic (Claude) + +```bash +export ANTHROPIC_API_KEY="" +``` + +### Claude Code + +Requer a CLI local: + +```bash +npm install -g @anthropic-ai/claude-code +``` + +Há dois modos disponíveis no aplicativo: +- **Modo API**: a resposta estruturada é retornada diretamente ao NoteSpaceLLM +- **Modo chat**: entrega o prompt a um console interativo do Claude Code + +## Uso + +### 1. Adicionar documentos + +- **Arrastar e soltar**: solte arquivos ou pastas no painel esquerdo +- **Botão**: "Add files" ou "Add folder" + +### 2. Selecionar documentos + +- Caixa de seleção: inclui/exclui documentos da análise +- Botões: "All" / "None" para seleção em massa + +### 3. Subconsultas (opcional) + +Clique com o botão direito em um documento: +- **Create summary**: resumo automático +- **Extract information**: localizar dados específicos +- **Analyse**: análise direcionada +- **Ask question**: pergunta específica sobre o documento + +### 4. Definir a pergunta principal + +Insira a pergunta central da pesquisa no painel de fluxo de trabalho. + +### 5. Escolher o tipo de fluxo de trabalho/relatório + +- **Analysis**: análise abrangente com recomendações +- **Summary**: resumo curto +- **Research report**: estrutura acadêmica +- **Comparison**: comparação sistemática de documentos + +### 6. Gerar relatório + +Clique em "Create report" — a saída aparece no painel direito. + +### 7. Exportar + +Selecione os formatos de saída e clique em "Export". + +### 8. Exportação de prompt + +Use **"Export prompt"** para salvar o contexto de trabalho atual como arquivo Markdown para uso no Claude Code ou em outros fluxos de trabalho com LLM. + +## Companion Web/PWA + +Sob `web_companion/` há um Companion somente leitura para Android, iOS e navegador. Ele importa localmente, no navegador, arquivos `notespacellm-workspace-v1.json` exportados, exibe o relatório, os metadados dos documentos e os trechos selecionados, e pode exportar notas de revisão em Markdown. O workspace permanece na sessão atual do navegador e deve ser importado novamente após reabrir; somente as notas de revisão e o idioma da interface são persistidos localmente. + +Teste local no navegador: + +```powershell +$env:PYTHONIOENCODING='utf-8' +python -m http.server 8765 -d web_companion +``` + +Smokes do Companion: + +```powershell +cd web_companion +node --test tests/library.test.mjs +``` + +O plano de testes do PWA para Android/iOS está documentado em `web_companion/PWA_TESTPLAN.md`. + +## Estratégia de plataforma + +O aplicativo desktop é a aplicação completa para documentos locais, o índice RAG e as conexões com provedores. O Companion Web/PWA para Android, iOS e navegador está disponível para revisar uma exportação `notespacellm-workspace-v1.json` criada pelo usuário. +Para material sensível, configure endpoints locais de modelo e de embeddings e revise as exportações antes de compartilhar. O contrato de troca está documentado em `EXPORTFORMAT.md`. + +### Smokes de código-fonte para macOS e Linux + +Smokes adicionais de código-fonte são executados no GitHub Actions: +- `tests/platform_smoke.py` — início offscreen do PySide6, importação de documentos, exportação de relatório e exportação de workspace em JSON +- `tests/linux_platform_smoke.py` — wrapper específico para Linux sobre `ubuntu-latest` + +## Estrutura do projeto + +``` +NoteSpaceLLM/ +├── main.py # Entry point +├── requirements.txt # Dependencies +├── translator.py # Translation-catalog scan/helper; no desktop language switch +├── locales/ # Catalog inputs for the translation helper +├── src/ +│ ├── core/ # Core functionality +│ │ ├── document_manager.py +│ │ ├── text_extractor.py +│ │ ├── sub_query.py +│ │ └── project.py +│ ├── gui/ # PySide6 UI +│ │ ├── main_window.py +│ │ ├── document_panel.py +│ │ ├── workflow_panel.py +│ │ ├── chat_panel.py +│ │ └── output_panel.py +│ ├── llm/ # LLM integration (local + remote) +│ │ ├── client.py +│ │ ├── ollama_client.py +│ │ ├── openai_client.py +│ │ └── anthropic_client.py +│ └── reports/ # Report generation +│ ├── generator.py +│ ├── templates.py +│ └── exporter.py +├── web_companion/ # PWA Companion +├── data/ # Project data (gitignored) +├── workflows/ # Workflow definitions +├── profiles/ # Output profiles +└── output/ # Exported reports +``` + +## Formatos de arquivo suportados + +| Formato | Leitura | Escrita | +|---------|---------|---------| +| PDF | ✅ | ✅ | +| DOCX | ✅ | ✅ | +| DOC | ⚠️ | — | +| TXT | ✅ | ✅ | +| MD | ✅ | ✅ | +| XLSX | ✅ | — | +| HTML | — | ✅ | +| EML | ✅ | — | +| MSG | ✅ | — | + +⚠️ .doc requer antiword ou LibreOffice + +## Privacidade + +O NoteSpaceLLM armazena localmente dados de projetos, índices de documentos, perfis, configurações de fluxo de trabalho e exportações em `data/`, `profiles/`, `workflows/`, `output/` e +`chroma_db/`. Essas pastas são intencionalmente excluídas do Git. + +Quando provedores externos de LLM (OpenAI, Anthropic, Claude Code, Ollama remoto) estão habilitados, prompts e trechos de documentos selecionados podem ser transmitidos a esses serviços. Um endpoint Ollama remoto também recebe o texto dos documentos usado para embeddings. Para documentos sensíveis, use endpoints locais de modelo e de embeddings e revise os relatórios exportados, o histórico de chat e os trechos selecionados antes de compartilhar; as exportações de workspace não são anonimizadas. + +## Dicas + +1. **Conjuntos grandes de documentos**: selecione primeiro apenas os documentos relevantes para resultados mais rápidos +2. **Subconsultas**: use subconsultas direcionadas para análises de maior qualidade +3. **Ollama**: um endpoint Ollama local permite processamento offline. +4. **Ordem do fluxo de trabalho**: as etapas podem ser reordenadas no painel de fluxo de trabalho + +## Licença + +AGPL-3.0-only — veja [LICENSE](LICENSE) + +Este projeto declara PySide6 e PyMuPDF. Veja as referências de licença upstream selecionadas em [THIRD_PARTY_LICENSES.md](THIRD_PARTY_LICENSES.md); a licença do próprio projeto é AGPL-3.0-only. + +## Projeto relacionado + +[KnowledgeDigest](https://github.com/file-bricks/KnowledgeDigest) é um banco de dados de conhecimento local separado, com busca SQLite/FTS5 e resumos opcionais por LLM; ele não é integrado ao NoteSpaceLLM. + +## Aviso de licença e manutenção + +Veja [LICENSE](LICENSE) para os termos de licença do projeto. Os mantenedores não prometem manutenção contínua nem disponibilidade. diff --git a/README_ru.md b/README_ru.md new file mode 100644 index 0000000..13edb12 --- /dev/null +++ b/README_ru.md @@ -0,0 +1,333 @@ + +NoteSpaceLLM Banner + +# NoteSpaceLLM + +[![License: AGPL v3](https://img.shields.io/badge/License-AGPL%20v3-blue.svg)](LICENSE) +[![Python 3.10+](https://img.shields.io/badge/python-3.10+-blue.svg)](https://www.python.org/) +[![Platform: Windows](https://img.shields.io/badge/platform-Windows-lightgrey.svg)]() +[![Ecosystem: file-bricks](https://img.shields.io/badge/Ecosystem-file--bricks-blue.svg)](https://github.com/file-bricks) +[![Umbrella: open-bricks](https://img.shields.io/badge/Umbrella-open--bricks-blue.svg)](https://github.com/open-bricks) +[![LLM Context: llms.txt](https://img.shields.io/badge/LLM%20Context-llms.txt-blue.svg)](llms.txt) + +[English](README.md) | [Deutsch](README_de.md) | [Español](README_es.md) | [简体中文](README_zh.md) | [日本語](README_ja.md) | [Русский](README_ru.md) | [Français](README_fr.md) | [हिन्दी](README_hi.md) | [العربية](README_ar.md) | [বাংলা](README_bn.md) | [Português](README_pt.md) + +> **Локальный блокнот для документов с приоритетом локальной работы, предназначенный для исследований и генерации отчётов с настраиваемыми локальными или удалёнными языковыми моделями.** + +> [!NOTE] +> **Для ИИ-агентов и автоматизированных рабочих процессов:** +> NoteSpaceLLM предоставляет машиночитаемый обзор архитектуры и функций в [`llms.txt`](llms.txt). + +NoteSpaceLLM — это настольное приложение на PySide6 с приоритетом локальной работы для работы с PDF, +файлами Word, Markdown, экспортами почты, заметками и папками с исследовательскими материалами. По умолчанию оно +хранит данные проектов локально, поддерживает локальные или удалённые сценарии работы с Ollama, OpenAI, +Anthropic и Claude Code и экспортирует результаты анализа в Markdown, +PDF, DOCX, HTML и TXT. Облегчённый Web/PWA-компаньон теперь доступен для +просмотра экспортированных рабочих пространств на Android, iOS и в браузерах без +загрузки документов на сервер. + +**Наиболее подходящие поисковые запросы:** альтернатива NotebookLM, локальный анализ документов по схеме RAG, +локальный чат с документами, исследовательский инструмент на PySide6, генератор отчётов на локальных моделях, +рабочий процесс с документами с приоритетом локальной работы. + +## Быстрый старт + +```bash +git clone https://github.com/file-bricks/NoteSpaceLLM.git +cd NoteSpaceLLM +pip install -r requirements.txt +python main.py +``` + +В Windows можно также запустить через `start.bat`. Локальный загрузчик для Windows можно собрать с помощью `build_exe.bat`. + +Для направляемой локальной начальной настройки, которая устанавливает требования и создаёт стартовые +папки рабочих процессов и профилей, явно выполните `python setup_environment.py`. Метаданные пакета и сборки используют +отдельную точку входа setuptools и её не запускают. + +Запуск тестов и проверок компиляции (smoke-тестов): + +```bash +pytest +python -m compileall -q main.py manage_translations.py setup_environment.py translator.py src +cd web_companion +npm test +``` + +## Архитектура системы + +```mermaid +graph TD + subgraph UI ["PySide6 Desktop Application"] + DP["Document Panel (Drag & Drop)"] + WP["Workflow & Report Builder"] + CP["Interactive Chat Panel"] + OP["Multi-Format Exporter"] + end + + subgraph Engine ["Local RAG Engine"] + TE["Text Extractor (PDF/DOCX/TXT/XLSX/EML)"] + CDB[("ChromaDB Vector Store")] + RM["Report Generator & Prompts"] + end + + subgraph LLM ["LLM Integrations"] + OL["Ollama (Local / Remote)"] + OAI["OpenAI API"] + ANT["Anthropic Claude"] + CC["Claude Code CLI"] + end + + subgraph PWA ["Web / PWA Companion"] + JSON["notespacellm-workspace-v1.json"] + SW["PWA Service Worker & Mobile Review"] + end + + DP --> TE + TE --> CDB + WP --> RM + RM --> CDB + RM --> LLM + CP --> LLM + OP --> JSON + JSON --> SW +``` + +## Возможности + +- **Управление документами**: добавление файлов и каталогов перетаскиванием (drag & drop) +- **Автоматическое извлечение и индексирование**: новые документы обрабатываются сразу и подготавливаются для RAG. +- **Выборочный анализ**: отметьте или снимите отметку с документов, чтобы включить их в отчёты или исключить из них +- **Подзапросы**: щёлкните документ правой кнопкой мыши для целевого исследования конкретного документа +- **Визуализация рабочего процесса**: графический обзор конвейера формирования отчёта +- **Интерфейс чата**: интерактивный чат по загруженным документам с любой LLM +- **Интеграция с Claude Code**: структурированные ответы API или передача интерактивному сеансу Claude Code +- **Экспорт в несколько форматов**: вывод в MD, PDF, DOCX, HTML, TXT +- **Экспорт промптов**: сохранение контекста отчёта как Markdown-промпта для внешних рабочих процессов с LLM +- **Профили подключения к Ollama**: настройки провайдера для всего приложения можно повторно использовать в разных проектах +- **Поддержка языков**: в графическом интерфейсе настольного приложения нет выбора языка пользователем; его интерфейс в настоящее время в основном немецкий. Web/PWA-компаньон имеет постоянный выбор языка интерфейса: немецкий, английский, испанский, упрощённый китайский, японский, русский, французский, хинди, арабский, бенгальский и португальский. Поле языка проекта включается в экспорт рабочих пространств; оно не связано с выбором языка настольного интерфейса или отчётов. +- **Интерфейс, безопасный для умлаутов**: немецкие строки интерфейса используют собственные умлауты; сканер переводов исключает ложные срабатывания английского языка +- **Профили**: повторно используемые комбинации форматов вывода + +## Установка + +```bash +# Clone or copy the project folder +cd NoteSpaceLLM + +# Install dependencies +pip install -r requirements.txt + +# Start the app +python main.py +``` + +Проверьте зависимости: + +```bash +python main.py --check +``` + +## Настройка LLM + +### Ollama (локально — рекомендуется) + +1. [Установите Ollama](https://ollama.ai) +2. Загрузите модель: `ollama pull llama3` +3. В приложении: Меню > LLM > Использовать Ollama + +### Ollama (удалённый сервер) + +NoteSpaceLLM может подключаться к удалённому серверу Ollama, например через [ellmos-stack](https://github.com/ellmos-ai/ellmos-stack): + +1. В приложении: Меню > LLM > Настройки +2. **URL Ollama:** `http://your-server:11435` (или ваш порт) +3. **Ключ API:** если сервер находится за прокси-сервером аутентификации (рекомендуется) + +> **Совет:** Ollama не имеет встроенной аутентификации. Для удалённого доступа используйте обратный прокси (например, Nginx) с ключом API или Basic Auth. + +Конечная точка Ollama и модель настраиваются в общих настройках приложения или +выбранном профиле подключения, а не для каждого проекта. Ключи API сохраняются через +хранилище учётных данных операционной системы, если они сохранены в приложении. Необязательная +переменная окружения `NOTESPACELLM_OLLAMA_API_KEY` переопределяет сохранённый ключ и +никогда не записывается приложением. Устаревшие ключи в открытом виде не отправляются, пока вы +явно не выполните их миграцию в настройках. + +Когда настроенный сервер Ollama является удалённым, он получает текст документов, используемый для эмбеддингов, а также промпты и контекст, отправляемые для генерации. API-ключ передаётся на настроенный URL в заголовке Bearer. Обычный HTTP не шифрует ни содержимое, ни учётные данные; поведение HTTPS зависит от конечной точки и её сертификата. + +### OpenAI + +```bash +export OPENAI_API_KEY="" +``` + +### Anthropic (Claude) + +```bash +export ANTHROPIC_API_KEY="" +``` + +### Claude Code + +Требуется локальный CLI: + +```bash +npm install -g @anthropic-ai/claude-code +``` + +В приложении доступны два режима: +- **Режим API**: структурированный ответ возвращается напрямую в NoteSpaceLLM +- **Режим чата**: промпт передаётся в интерактивную консоль Claude Code + +## Использование + +### 1. Добавление документов + +- **Перетаскивание**: перетащите файлы или папки на левую панель +- **Кнопка**: «Add files» или «Add folder» + +### 2. Выбор документов + +- Флажок: включить/исключить документ из анализа +- Кнопки: «All» / «None» для массового выбора + +### 3. Подзапросы (необязательно) + +Щёлкните документ правой кнопкой мыши: +- **Create summary**: автоматическое резюме +- **Extract information**: поиск конкретных данных +- **Analyse**: целевой анализ +- **Ask question**: конкретный вопрос о документе + +### 4. Определение основного вопроса + +Введите центральный исследовательский вопрос на панели рабочего процесса. + +### 5. Выбор типа рабочего процесса/отчёта + +- **Analysis**: всесторонний анализ с рекомендациями +- **Summary**: краткое резюме +- **Research report**: академическая структура +- **Comparison**: систематическое сравнение документов + +### 6. Генерация отчёта + +Нажмите «Create report» — результат появится на правой панели. + +### 7. Экспорт + +Выберите форматы вывода и нажмите «Export». + +### 8. Экспорт промпта + +Используйте **«Export prompt»**, чтобы сохранить текущий рабочий контекст в файл Markdown для использования в Claude Code или других рабочих процессах LLM. + +## Web/PWA-компаньон + +Под `web_companion/` находится компаньон только для чтения для Android, iOS и браузера. Он локально импортирует экспортированные файлы `notespacellm-workspace-v1.json` в браузере, показывает отчёт, метаданные документов и выбранные фрагменты и может экспортировать заметки для проверки в Markdown. Рабочее пространство остаётся в текущей сессии браузера и должно быть импортировано повторно после открытия; локально сохраняются только заметки для проверки и язык интерфейса. + +Локальный тест в браузере: + +```powershell +$env:PYTHONIOENCODING='utf-8' +python -m http.server 8765 -d web_companion +``` + +Дымовые тесты компаньона: + +```powershell +cd web_companion +node --test tests/library.test.mjs +``` + +План тестирования PWA для Android/iOS задокументирован в `web_companion/PWA_TESTPLAN.md`. + +## Стратегия платформ + +Настольное приложение является полноценным приложением для локальных документов, индекса RAG и подключений к провайдерам. Web/PWA-компаньон для Android, iOS и браузера доступен для просмотра созданного пользователем экспорта `notespacellm-workspace-v1.json`. +Для конфиденциальных материалов настройте локальные конечные точки моделей и эмбеддингов и проверяйте экспорты перед отправкой. Контракт обмена задокументирован в `EXPORTFORMAT.md`. + +### Дымовые тесты исходного кода для macOS и Linux + +Дополнительные дымовые тесты исходного кода выполняются в GitHub Actions: +- `tests/platform_smoke.py` — запуск PySide6 без отображения, импорт документов, экспорт отчёта, экспорт JSON рабочего пространства +- `tests/linux_platform_smoke.py` — обёртка для Linux поверх `ubuntu-latest` + +## Структура проекта + +``` +NoteSpaceLLM/ +├── main.py # Entry point +├── requirements.txt # Dependencies +├── translator.py # Translation-catalog scan/helper; no desktop language switch +├── locales/ # Catalog inputs for the translation helper +├── src/ +│ ├── core/ # Core functionality +│ │ ├── document_manager.py +│ │ ├── text_extractor.py +│ │ ├── sub_query.py +│ │ └── project.py +│ ├── gui/ # PySide6 UI +│ │ ├── main_window.py +│ │ ├── document_panel.py +│ │ ├── workflow_panel.py +│ │ ├── chat_panel.py +│ │ └── output_panel.py +│ ├── llm/ # LLM integration (local + remote) +│ │ ├── client.py +│ │ ├── ollama_client.py +│ │ ├── openai_client.py +│ │ └── anthropic_client.py +│ └── reports/ # Report generation +│ ├── generator.py +│ ├── templates.py +│ └── exporter.py +├── web_companion/ # PWA Companion +├── data/ # Project data (gitignored) +├── workflows/ # Workflow definitions +├── profiles/ # Output profiles +└── output/ # Exported reports +``` + +## Поддерживаемые форматы файлов + +| Формат | Чтение | Запись | +|--------|--------|--------| +| PDF | ✅ | ✅ | +| DOCX | ✅ | ✅ | +| DOC | ⚠️ | — | +| TXT | ✅ | ✅ | +| MD | ✅ | ✅ | +| XLSX | ✅ | — | +| HTML | — | ✅ | +| EML | ✅ | — | +| MSG | ✅ | — | + +⚠️ Для .doc требуется antiword или LibreOffice + +## Конфиденциальность + +NoteSpaceLLM хранит данные проектов, индексы документов, профили, настройки рабочих процессов и экспорты локально в `data/`, `profiles/`, `workflows/`, `output/` и `chroma_db/`. Эти папки намеренно исключены из Git. + +Когда включены внешние провайдеры LLM (OpenAI, Anthropic, Claude Code, удалённый Ollama), промпты и выбранные фрагменты документов могут передаваться этим сервисам. Удалённая конечная точка Ollama также получает текст документов, используемый для эмбеддингов. Для конфиденциальных документов используйте локальные конечные точки моделей и эмбеддингов и проверяйте экспортированные отчёты, историю чата и выбранные фрагменты перед отправкой; экспорты рабочего пространства не анонимизированы. + +## Советы + +1. **Большие наборы документов**: сначала выбирайте только релевантные документы для более быстрых результатов +2. **Подзапросы**: используйте целевые подзапросы для более качественного анализа +3. **Ollama**: локальная конечная точка Ollama поддерживает обработку без подключения к сети. +4. **Порядок шагов рабочего процесса**: шаги можно переупорядочить на панели рабочего процесса + +## Лицензия + +AGPL-3.0-only — см. [LICENSE](LICENSE) + +Проект объявляет зависимости PySide6 и PyMuPDF. См. ссылки на выбранные лицензии вышестоящих проектов в [THIRD_PARTY_LICENSES.md](THIRD_PARTY_LICENSES.md); собственная лицензия проекта — AGPL-3.0-only. + +## Связанный проект + +[KnowledgeDigest](https://github.com/file-bricks/KnowledgeDigest) — отдельная локальная база знаний с поиском SQLite/FTS5 и необязательными резюме LLM; она не интегрирована с NoteSpaceLLM. + +## Уведомление о лицензии и сопровождении + +Условия лицензии проекта см. в [LICENSE](LICENSE). Сопровождающие не обещают постоянной поддержки или доступности. diff --git a/README_zh.md b/README_zh.md new file mode 100644 index 0000000..63dddf1 --- /dev/null +++ b/README_zh.md @@ -0,0 +1,322 @@ + +NoteSpaceLLM Banner + +# NoteSpaceLLM + +[![License: AGPL v3](https://img.shields.io/badge/License-AGPL%20v3-blue.svg)](LICENSE) +[![Python 3.10+](https://img.shields.io/badge/python-3.10+-blue.svg)](https://www.python.org/) +[![Platform: Windows](https://img.shields.io/badge/platform-Windows-lightgrey.svg)]() +[![Ecosystem: file-bricks](https://img.shields.io/badge/Ecosystem-file--bricks-blue.svg)](https://github.com/file-bricks) +[![Umbrella: open-bricks](https://img.shields.io/badge/Umbrella-open--bricks-blue.svg)](https://github.com/open-bricks) +[![LLM Context: llms.txt](https://img.shields.io/badge/LLM%20Context-llms.txt-blue.svg)](llms.txt) + +[English](README.md) | [Deutsch](README_de.md) | [Español](README_es.md) | [简体中文](README_zh.md) | [日本語](README_ja.md) | [Русский](README_ru.md) | [Français](README_fr.md) | [हिन्दी](README_hi.md) | [العربية](README_ar.md) | [বাংলা](README_bn.md) | [Português](README_pt.md) + +> **面向研究与报告生成的本地优先文档笔记工具,支持配置本地或远程语言模型。** + +> [!NOTE] +> **面向 AI 代理与自动化工作流:** +> NoteSpaceLLM 在 [`llms.txt`](llms.txt) 中提供机器可读的架构与功能概览。 + +NoteSpaceLLM 是一款基于 PySide6 的本地优先桌面应用,用于处理 PDF、 +Word 文件、Markdown、邮件导出、笔记和研究文件夹。它默认将项目数据保存在本地, +支持本地或远程的 Ollama、OpenAI、Anthropic 以及 Claude Code 工作流,并可将分析结果 +导出为 Markdown、PDF、DOCX、HTML 和 TXT。现在还提供轻量级 Web/PWA 伴侣应用, +可在 Android、iOS 和浏览器设备上查看已导出的工作区,无需将文档上传至服务器。 + +**最适合的搜索词:** NotebookLM 替代方案、本地 RAG 文档分析、 +本地文档对话、PySide6 研究工具、本地模型报告生成器、本地优先文档工作流。 + +## 快速开始 + +```bash +git clone https://github.com/file-bricks/NoteSpaceLLM.git +cd NoteSpaceLLM +pip install -r requirements.txt +python main.py +``` + +在 Windows 上,也可以通过 `start.bat` 启动。可以使用 `build_exe.bat` 构建本地 Windows 启动器。 + +如需通过引导式本地初始化来安装依赖并创建入门工作流/配置文件夹,请显式运行 `python setup_environment.py`。包元数据和构建使用单独的 setuptools 入口点,不会运行该步骤。 + +运行测试和编译冒烟检查: + +```bash +pytest +python -m compileall -q main.py manage_translations.py setup_environment.py translator.py src +cd web_companion +npm test +``` + +## 系统架构 + +```mermaid +graph TD + subgraph UI ["PySide6 Desktop Application"] + DP["Document Panel (Drag & Drop)"] + WP["Workflow & Report Builder"] + CP["Interactive Chat Panel"] + OP["Multi-Format Exporter"] + end + + subgraph Engine ["Local RAG Engine"] + TE["Text Extractor (PDF/DOCX/TXT/XLSX/EML)"] + CDB[("ChromaDB Vector Store")] + RM["Report Generator & Prompts"] + end + + subgraph LLM ["LLM Integrations"] + OL["Ollama (Local / Remote)"] + OAI["OpenAI API"] + ANT["Anthropic Claude"] + CC["Claude Code CLI"] + end + + subgraph PWA ["Web / PWA Companion"] + JSON["notespacellm-workspace-v1.json"] + SW["PWA Service Worker & Mobile Review"] + end + + DP --> TE + TE --> CDB + WP --> RM + RM --> CDB + RM --> LLM + CP --> LLM + OP --> JSON + JSON --> SW +``` + +## 功能特性 + +- **文档管理**:通过拖放添加文件和目录 +- **自动提取与索引**:新文档会立即处理并为 RAG 做好准备。 +- **选择性分析**:勾选或取消勾选文档,以决定是否将其纳入报告 +- **子查询**:右键单击文档,进行针对特定文档的定向研究 +- **工作流可视化**:报告流程的图形化概览 +- **聊天界面**:可与任意 LLM 对已加载文档进行交互式对话 +- **Claude Code 集成**:返回结构化 API 响应,或移交至交互式 Claude Code 会话 +- **多格式导出**:输出为 MD、PDF、DOCX、HTML、TXT +- **提示词导出**:将报告上下文保存为 Markdown 提示词,用于外部 LLM 工作流 +- **Ollama 连接配置**:应用级提供方设置可在多个项目间复用 +- **语言支持**:桌面 GUI 没有用户可选的语言;其界面目前主要为德语。Web/PWA 伴侣应用提供持久化的界面语言选择器,支持德语、英语、西班牙语、简体中文、日语、俄语、法语、印地语、阿拉伯语、孟加拉语和葡萄牙语。项目语言字段会包含在工作区导出中;它并未与桌面界面或报告语言选择器关联。 +- **德语变音符号兼容界面**:德语界面文本使用原生字符;翻译扫描器可避免将英语文本误报为问题 +- **配置文件**:可复用的输出格式组合 + +## 安装 + +```bash +# Clone or copy the project folder +cd NoteSpaceLLM + +# Install dependencies +pip install -r requirements.txt + +# Start the app +python main.py +``` + +检查依赖项: + +```bash +python main.py --check +``` + +## LLM 配置 + +### Ollama(本地 — 推荐) + +1. [安装 Ollama](https://ollama.ai) +2. 下载模型:`ollama pull llama3` +3. 在应用中:菜单 > LLM > 使用 Ollama + +### Ollama(远程服务器) + +NoteSpaceLLM 可以连接远程 Ollama 服务器,例如通过 [ellmos-stack](https://github.com/ellmos-ai/ellmos-stack): + +1. 在应用中:菜单 > LLM > 设置 +2. **Ollama URL:** `http://your-server:11435`(或您的端口) +3. **API Key:** 如果服务器位于认证代理之后(推荐) + +> **提示:** Ollama 没有内置身份验证。如需远程访问,请使用带有 API Key 或 Basic Auth 的反向代理(例如 Nginx)。 + +Ollama 端点和模型在应用级设置或所选连接配置文件中配置,而不是按项目配置。在应用中保存 API Key 时,会通过操作系统的凭据存储进行保存。可选的 `NOTESPACELLM_OLLAMA_API_KEY` 环境变量会覆盖已保存的密钥,且应用从不写入该变量。旧版明文密钥在您于设置中显式迁移之前不会被发送。 + +当配置的 Ollama 服务器为远程服务器时,它会接收用于嵌入的文档文本,以及用于生成的提示和上下文。API 密钥会以 Bearer 请求头的形式发送到所配置的 URL。纯 HTTP 不会加密内容或凭据;HTTPS 的行为取决于端点及其证书。 + +### OpenAI + +```bash +export OPENAI_API_KEY="" +``` + +### Anthropic (Claude) + +```bash +export ANTHROPIC_API_KEY="" +``` + +### Claude Code + +需要本地 CLI: + +```bash +npm install -g @anthropic-ai/claude-code +``` + +应用中提供两种模式: +- **API 模式**:结构化响应直接返回到 NoteSpaceLLM +- **聊天模式**:将提示交给交互式 Claude Code 控制台 + +## 用法 + +### 1. 添加文档 + +- **拖放**:将文件或文件夹拖入左侧面板 +- **按钮**:"Add files"(添加文件)或 "Add folder"(添加文件夹) + +### 2. 选择文档 + +- 复选框:包含/排除用于分析的文档 +- 按钮:"All"(全选)/ "None"(全不选),用于批量选择 + +### 3. 子查询(可选) + +右键单击文档: +- **Create summary**(创建摘要):自动生成摘要 +- **Extract information**(提取信息):查找特定数据 +- **Analyse**(分析):有针对性的分析 +- **Ask question**(提问):关于该文档的具体问题 + +### 4. 定义主要问题 + +在工作流面板中输入核心研究问题。 + +### 5. 选择工作流/报告类型 + +- **Analysis**(分析):包含建议的综合分析 +- **Summary**(摘要):简短摘要 +- **Research report**(研究报告):学术结构 +- **Comparison**(对比):系统的文档对比 + +### 6. 生成报告 + +点击 "Create report"(创建报告),输出结果会显示在右侧面板中。 + +### 7. 导出 + +选择输出格式并点击 "Export"(导出)。 + +### 8. 提示导出 + +使用 **"Export prompt"**(导出提示)将当前工作上下文保存为 Markdown 文件,以便在 Claude Code 或其他 LLM 工作流中使用。 + +## Web/PWA 配套应用 + +`web_companion/` 下是一个面向 Android、iOS 和浏览器的只读配套应用分支。它会在浏览器中本地导入已导出的 `notespacellm-workspace-v1.json` 文件,显示报告、文档元数据和所选摘录,并可将审阅笔记导出为 Markdown。工作区仅保留在当前浏览器会话中,重新打开后必须重新导入;只有审阅笔记和界面语言会在本地持久保存。 + +本地浏览器测试: + +```powershell +$env:PYTHONIOENCODING='utf-8' +python -m http.server 8765 -d web_companion +``` + +配套应用冒烟测试: + +```powershell +cd web_companion +node --test tests/library.test.mjs +``` + +Android/iOS PWA 测试计划记录在 `web_companion/PWA_TESTPLAN.md` 中。 + +## 平台策略 + +桌面应用是完整应用,用于本地文档、RAG 索引和提供商连接。Android、iOS 和浏览器 Web/PWA 配套应用可用于审阅用户创建的 `notespacellm-workspace-v1.json` 导出文件。对于敏感材料,请配置本地模型和嵌入端点,并在分享前审阅导出内容。交换约定记录在 `EXPORTFORMAT.md` 中。 + +### macOS 和 Linux 源码冒烟测试 + +GitHub Actions 中运行以下额外的源码冒烟测试: +- `tests/platform_smoke.py` — 离屏 PySide6 启动、文档导入、报告导出、工作区 JSON 导出 +- `tests/linux_platform_smoke.py` — `ubuntu-latest` 的 Linux 专用包装器 + +## 项目结构 + +``` +NoteSpaceLLM/ +├── main.py # Entry point +├── requirements.txt # Dependencies +├── translator.py # Translation-catalog scan/helper; no desktop language switch +├── locales/ # Catalog inputs for the translation helper +├── src/ +│ ├── core/ # Core functionality +│ │ ├── document_manager.py +│ │ ├── text_extractor.py +│ │ ├── sub_query.py +│ │ └── project.py +│ ├── gui/ # PySide6 UI +│ │ ├── main_window.py +│ │ ├── document_panel.py +│ │ ├── workflow_panel.py +│ │ ├── chat_panel.py +│ │ └── output_panel.py +│ ├── llm/ # LLM integration (local + remote) +│ │ ├── client.py +│ │ ├── ollama_client.py +│ │ ├── openai_client.py +│ │ └── anthropic_client.py +│ └── reports/ # Report generation +│ ├── generator.py +│ ├── templates.py +│ └── exporter.py +├── web_companion/ # PWA Companion +├── data/ # Project data (gitignored) +├── workflows/ # Workflow definitions +├── profiles/ # Output profiles +└── output/ # Exported reports +``` + +## 支持的文件格式 + +| 格式 | 读取 | 写入 | +|------|------|------| +| PDF | ✅ | ✅ | +| DOCX | ✅ | ✅ | +| DOC | ⚠️ | — | +| TXT | ✅ | ✅ | +| MD | ✅ | ✅ | +| XLSX | ✅ | — | +| HTML | — | ✅ | +| EML | ✅ | — | +| MSG | ✅ | — | + +⚠️ .doc 需要 antiword 或 LibreOffice + +## 隐私 + +NoteSpaceLLM 将项目数据、文档索引、配置文件、工作流设置和导出内容本地存储在 `data/`、`profiles/`、`workflows/`、`output/` 和 `chroma_db/` 中。这些文件夹有意排除在 Git 之外。 + +启用外部 LLM 提供商(OpenAI、Anthropic、Claude Code、远程 Ollama)时,提示和所选文档摘录可能会被传输到这些服务。远程 Ollama 端点还会接收用于嵌入的文档文本。对于敏感文档,请使用本地模型和嵌入端点,并在分享前审阅导出的报告、聊天记录和所选摘录;工作区导出内容未经匿名化处理。 + +## 提示 + +1. **大型文档集**:先只选择相关文档,以获得更快的结果 +2. **子查询**:使用有针对性的子查询以获得更高质量的分析 +3. **Ollama**:本地 Ollama 端点支持离线处理。 +4. **工作流顺序**:可在工作流面板中重新排列步骤 + +## 许可证 + +AGPL-3.0-only — 参见 [LICENSE](LICENSE) + +本项目声明使用 PySide6 和 PyMuPDF。所选上游许可证参考请见 [THIRD_PARTY_LICENSES.md](THIRD_PARTY_LICENSES.md);本项目自身的许可证为 AGPL-3.0-only。 + +## 相关项目 + +[KnowledgeDigest](https://github.com/file-bricks/KnowledgeDigest) 是一个独立的本地知识数据库,具有 SQLite/FTS5 搜索和可选的 LLM 摘要功能;它未与 NoteSpaceLLM 集成。 + +## 许可证与维护声明 + +项目的许可条款请参见 [LICENSE](LICENSE)。维护者不承诺持续维护或可用性。 diff --git a/web_companion/PWA_TESTPLAN.md b/web_companion/PWA_TESTPLAN.md index 59f8743..4a79447 100644 --- a/web_companion/PWA_TESTPLAN.md +++ b/web_companion/PWA_TESTPLAN.md @@ -41,6 +41,9 @@ URL: `http://127.0.0.1:8765` | I3 | iOS | Workspace importieren | Bericht und Dokumentauszüge werden lokal angezeigt | | I4 | iOS | Workspace importieren, Safari/PWA schließen, offline erneut öffnen | PWA-Shell startet; Workspace wird nicht wiederhergestellt und muss erneut importiert werden | | I5 | iOS | Review-Notizen exportieren | Markdown-Export wird gestartet; falls iOS Download begrenzt, Share-/Datei-Dialog prüfen | +| L1 | Browser | Sprachwahl öffnen und alle Einträge prüfen | Deutsch, English, Español, 中文, 日本語, Русский, Français, हिन्दी, العربية, বাংলা und Português stehen zur Auswahl | +| L2 | Browser | Sprache wechseln, neu laden und erneut öffnen | UI-Sprache bleibt gespeichert; importierte Workspace-Daten bleiben nicht erhalten | +| L3 | Browser | Arabisch auswählen | ``; UI wird rechts nach links dargestellt | ## Checkliste pro Lauf @@ -51,6 +54,8 @@ URL: `http://127.0.0.1:8765` - [ ] Cache-Hinweis zeigt, dass keine Workspace-Payload dauerhaft gespeichert ist - [ ] Review-Notizen bleiben getrennt vom Workspace lokal erhalten - [ ] Ein erneuter Start verlangt den Dateiimport; lokale UI-Sprache bleibt erhalten +- [ ] Sprachwahl enthält elf Oberflächensprachen; `zh` wird als `zh-Hans` geführt +- [ ] Arabisch setzt RTL, alle anderen UI-Sprachen bleiben LTR ## Bekannte Grenzen diff --git a/web_companion/README.md b/web_companion/README.md index 3da4750..d63c2bb 100644 --- a/web_companion/README.md +++ b/web_companion/README.md @@ -12,8 +12,9 @@ Review-Notizen. - Bericht, Dokumentmetadaten und ausgewählte Auszüge anzeigen - importierte Workspace-Inhalte nur in der aktuellen Sitzung anzeigen; nach einem Neustart erneut importieren - eigene Review-Notizen lokal speichern und als Markdown exportieren -- DE/EN/ES/ZH-Hans/JA/RU-Oberfläche mit Browser-/Workspace-Locale und - manuellem Sprachumschalter +- DE/EN/ES/ZH-Hans/JA/RU/FR/HI/AR/BN/PT-Oberfläche mit Browser-/Workspace- + Locale, manuellem Sprachumschalter und dauerhafter Speicherung der Auswahl +- Arabische Oberfläche mit RTL-Layout ## Lokaler Start diff --git a/web_companion/app.css b/web_companion/app.css index 345e902..cca8751 100644 --- a/web_companion/app.css +++ b/web_companion/app.css @@ -68,9 +68,8 @@ body { margin: 0 auto; max-width: 1180px; padding-top: calc(32px + env(safe-area-inset-top, 0px)); - padding-right: 18px; + padding-inline: 18px; padding-bottom: calc(48px + env(safe-area-inset-bottom, 0px)); - padding-left: 18px; position: relative; z-index: 1; } @@ -106,6 +105,11 @@ body { text-transform: uppercase; } +html[dir="rtl"] .eyebrow { + letter-spacing: normal; + text-transform: none; +} + h1, h2, h3 { @@ -222,11 +226,11 @@ h3 { display: grid; gap: 10px; margin: 0 0 16px; - padding-left: 20px; + padding-inline-start: 20px; } .hint-list li { - padding-left: 4px; + padding-inline-start: 4px; } input[type="file"] { @@ -363,8 +367,11 @@ button:active, .excerpt { background: rgba(219, 234, 254, 0.45); - border-left: 4px solid rgba(12, 74, 110, 0.34); - border-radius: 0 12px 12px 0; + border-inline-start: 4px solid rgba(12, 74, 110, 0.34); + border-start-start-radius: 0; + border-end-start-radius: 0; + border-start-end-radius: 12px; + border-end-end-radius: 12px; padding: 12px 14px; } diff --git a/web_companion/app.js b/web_companion/app.js index ecb9bab..2685360 100644 --- a/web_companion/app.js +++ b/web_companion/app.js @@ -43,6 +43,7 @@ const elements = { let currentWorkspace = null; let currentSourceLabel = ""; +let currentSourceKind = ""; let cachedWorkspaceTitle = ""; const storedLocale = globalThis.localStorage?.getItem(UI_LOCALE_KEY) || ""; let hasUserLocaleOverride = Boolean(storedLocale); @@ -57,6 +58,7 @@ function setStatus(message, isError = false) { function applyStaticTranslations() { document.documentElement.lang = activeLocale; + document.documentElement.dir = activeLocale === "ar" ? "rtl" : "ltr"; document.querySelectorAll("[data-i18n]").forEach((node) => { const key = node.dataset.i18n; @@ -65,6 +67,13 @@ function applyStaticTranslations() { } }); + document.querySelectorAll("[data-i18n-aria-label]").forEach((node) => { + const key = node.dataset.i18nAriaLabel; + if (key && typeof currentText[key] === "string") { + node.setAttribute("aria-label", currentText[key]); + } + }); + document.querySelectorAll("[data-i18n-placeholder]").forEach((node) => { const key = node.dataset.i18nPlaceholder; if (key && typeof currentText[key] === "string") { @@ -224,7 +233,12 @@ function rerenderCurrentWorkspace() { renderSummary(currentWorkspace); renderReport(currentWorkspace); renderDocuments(currentWorkspace); - setStatus(currentText.workspaceLoaded(currentSourceLabel, currentWorkspace.workspace.title)); + const sourceLabel = currentSourceKind === "demo" + ? currentText.sourceLabelDemo + : currentSourceKind === "cached" + ? currentText.sourceLabelCached + : currentSourceLabel; + setStatus(currentText.workspaceLoaded(sourceLabel, currentWorkspace.workspace.title)); } function setLocale(locale, { persist = false } = {}) { @@ -242,7 +256,7 @@ function setLocale(locale, { persist = false } = {}) { } function renderWorkspace(payload, sourceLabel, options = {}) { - const { persist = true } = options; + const { persist = true, sourceKind = "" } = options; if (!hasUserLocaleOverride) { activeLocale = resolveUiLocale(payload.workspace.locale, globalThis.navigator?.language, "de"); currentText = getUiText(activeLocale); @@ -251,6 +265,7 @@ function renderWorkspace(payload, sourceLabel, options = {}) { currentWorkspace = payload; currentSourceLabel = sourceLabel; + currentSourceKind = sourceKind; renderSummary(payload); renderReport(payload); renderDocuments(payload); @@ -287,7 +302,7 @@ elements.fileInput.addEventListener("change", (event) => { }); elements.loadDemo.addEventListener("click", () => { - renderWorkspace(getDemoWorkspace(activeLocale), currentText.sourceLabelDemo); + renderWorkspace(getDemoWorkspace(activeLocale), currentText.sourceLabelDemo, { sourceKind: "demo" }); }); elements.exportNotes.addEventListener("click", () => { @@ -327,11 +342,11 @@ const params = new URLSearchParams(window.location.search); setLocale(activeLocale); if (params.get("demo") === "1") { - renderWorkspace(getDemoWorkspace(activeLocale), currentText.sourceLabelDemo); + renderWorkspace(getDemoWorkspace(activeLocale), currentText.sourceLabelDemo, { sourceKind: "demo" }); } else { const cachedWorkspace = loadWorkspaceCache(); if (cachedWorkspace) { - renderWorkspace(cachedWorkspace, currentText.sourceLabelCached, { persist: false }); + renderWorkspace(cachedWorkspace, currentText.sourceLabelCached, { persist: false, sourceKind: "cached" }); } } diff --git a/web_companion/index.html b/web_companion/index.html index 9ba8e41..a665f76 100644 --- a/web_companion/index.html +++ b/web_companion/index.html @@ -43,13 +43,18 @@

Lokaler Review-Reader für exportierte Workspaces

diff --git a/web_companion/library.js b/web_companion/library.js index 19c74b2..ca79cee 100644 --- a/web_companion/library.js +++ b/web_companion/library.js @@ -1,10 +1,12 @@ +import { ADDITIONAL_UI_TEXT } from "./ui-locales.js"; + const DEFAULT_APP = Object.freeze({ name: "NoteSpaceLLM", version: "unbekannt", exported_at: "" }); -const SUPPORTED_UI_LOCALES = Object.freeze(["de", "en", "es", "zh-Hans", "ja", "ru"]); +const SUPPORTED_UI_LOCALES = Object.freeze(["de", "en", "es", "zh-Hans", "ja", "ru", "fr", "hi", "ar", "bn", "pt"]); const UI_TEXT = Object.freeze({ de: Object.freeze({ @@ -561,6 +563,33 @@ const UI_TEXT = Object.freeze({ }) }); +function renderUiTemplate(template, values) { + return template.replace(/\{([A-Za-z_][A-Za-z0-9_]*)\}/g, (placeholder, name) => + Object.prototype.hasOwnProperty.call(values, name) ? String(values[name]) : placeholder + ); +} + +function bindAdditionalUiText(values) { + return Object.freeze({ + ...values, + cacheHintWithTitle: (title) => renderUiTemplate(values.cacheHintWithTitle, { title }), + selectedDocuments: (selected, total) => renderUiTemplate(values.selectedDocuments, { selected, total }), + excerptCount: (count) => renderUiTemplate(values.excerptCount, { count }), + documentCount: (count) => renderUiTemplate(values.documentCount, { count }), + workspaceLoaded: (sourceLabel, title) => renderUiTemplate(values.workspaceLoaded, { sourceLabel, title }), + notesExported: (filename) => renderUiTemplate(values.notesExported, { filename }), + workspaceLoadErrorSchema: (schemaVersion) => renderUiTemplate(values.workspaceLoadErrorSchema, { schemaVersion }), + untitledDocument: (index) => renderUiTemplate(values.untitledDocument, { index: index + 1 }), + reviewHeadingWithTitle: (title) => renderUiTemplate(values.reviewHeadingWithTitle, { title }) + }); +} + +const ADDITIONAL_UI_TEXT_BOUND = Object.freeze( + Object.fromEntries( + Object.entries(ADDITIONAL_UI_TEXT).map(([locale, values]) => [locale, bindAdditionalUiText(values)]) + ) +); + const DEFAULT_WORKSPACE = Object.freeze({ id: "", title: "Unbenannter Workspace", @@ -604,6 +633,21 @@ function normalizeUiLocaleCandidate(value) { if (candidate.startsWith("ru")) { return "ru"; } + if (candidate.startsWith("fr")) { + return "fr"; + } + if (candidate.startsWith("hi")) { + return "hi"; + } + if (candidate.startsWith("ar")) { + return "ar"; + } + if (candidate.startsWith("bn")) { + return "bn"; + } + if (candidate.startsWith("pt")) { + return "pt"; + } return ""; } @@ -622,7 +666,8 @@ export function getSupportedUiLocales() { } export function getUiText(locale = "de") { - return UI_TEXT[resolveUiLocale(locale)]; + const resolvedLocale = resolveUiLocale(locale); + return ADDITIONAL_UI_TEXT_BOUND[resolvedLocale] || UI_TEXT[resolvedLocale]; } function toDocumentId(index) { @@ -873,6 +918,81 @@ export function getDemoWorkspace(locale = "de") { reportTitle: "Синтетический отчет", reportContent: "# Синтез\n\n- Ключевой тезис A подтверждается двумя источниками.\n- Открытый пробел: сравнительные данные за 2024 год все еще отсутствуют.", assistantMessage: "Суммируй доказательную базу по главному тезису." + }, + fr: { + title: "Démo : notes de recherche", + question: "Quelles affirmations centrales étayent le plus solidement le rapport ?", + firstName: "report-draft.md", + firstPath: "reports/report-draft.md", + firstExcerpt: "Les éléments les plus probants proviennent de la combinaison de la source primaire et d’une vérification croisée explicite.", + firstSource: "Section 2", + secondName: "literature.pdf", + secondPath: "sources/literature.pdf", + secondExcerpt: "Plusieurs études pointent le même obstacle méthodologique.", + secondSource: "Page 14", + reportTitle: "Rapport de synthèse", + reportContent: "# Synthèse\n\n- L’affirmation centrale A est étayée par deux sources.\n- Lacune restante : les données comparatives pour 2024 manquent encore.", + assistantMessage: "Résumez les éléments qui étayent l’affirmation principale." + }, + hi: { + title: "डेमो: शोध नोट्स", + question: "कौन से मुख्य दावे रिपोर्ट को सबसे मज़बूती से आधार देते हैं?", + firstName: "report-draft.md", + firstPath: "reports/report-draft.md", + firstExcerpt: "सबसे मज़बूत साक्ष्य प्राथमिक स्रोत को स्पष्ट क्रॉस-चेक के साथ जोड़ने से मिलता है।", + firstSource: "अनुभाग 2", + secondName: "literature.pdf", + secondPath: "sources/literature.pdf", + secondExcerpt: "कई अध्ययन उसी पद्धतिगत बाधा की ओर संकेत करते हैं।", + secondSource: "पृष्ठ 14", + reportTitle: "संश्लेषण रिपोर्ट", + reportContent: "# संश्लेषण\n\n- मुख्य दावा A को दो स्रोतों का समर्थन प्राप्त है।\n- शेष अंतर: 2024 के तुलनात्मक आँकड़े अब भी उपलब्ध नहीं हैं।", + assistantMessage: "मुख्य दावे के साक्ष्य-आधार का सारांश दें।" + }, + ar: { + title: "عرض توضيحي: ملاحظات بحثية", + question: "ما الادعاءات المحورية التي تدعم التقرير بأقوى صورة؟", + firstName: "report-draft.md", + firstPath: "reports/report-draft.md", + firstExcerpt: "تأتي أقوى الأدلة من الجمع بين المصدر الأساسي والتحقق المتقاطع الصريح.", + firstSource: "القسم 2", + secondName: "literature.pdf", + secondPath: "sources/literature.pdf", + secondExcerpt: "تشير عدة دراسات إلى العائق المنهجي نفسه.", + secondSource: "الصفحة 14", + reportTitle: "تقرير تركيبي", + reportContent: "# خلاصة\n\n- يدعم مصدران الادعاء المحوري A.\n- فجوة قائمة: لا تزال البيانات المقارنة لعام 2024 غير متاحة.", + assistantMessage: "لخّص قاعدة الأدلة للادعاء الرئيسي." + }, + bn: { + title: "ডেমো: গবেষণা নোট", + question: "কোন মূল দাবিগুলো প্রতিবেদনটিকে সবচেয়ে শক্তভাবে সমর্থন করে?", + firstName: "report-draft.md", + firstPath: "reports/report-draft.md", + firstExcerpt: "প্রাথমিক উৎসের সঙ্গে স্পষ্টভাবে যাচাই করা তুলনা মিলিয়ে দেখলে সবচেয়ে শক্তিশালী প্রমাণ পাওয়া যায়।", + firstSource: "বিভাগ ২", + secondName: "literature.pdf", + secondPath: "sources/literature.pdf", + secondExcerpt: "একাধিক গবেষণায় একই পদ্ধতিগত বাধার কথা উঠে এসেছে।", + secondSource: "পৃষ্ঠা ১৪", + reportTitle: "সংশ্লেষ প্রতিবেদন", + reportContent: "# সংশ্লেষ\n\n- দুটি উৎস মূল দাবি A-কে সমর্থন করে।\n- অনিষ্পন্ন ঘাটতি: ২০২৪ সালের তুলনামূলক তথ্য এখনও অনুপস্থিত।", + assistantMessage: "মূল দাবির প্রমাণভিত্তি সংক্ষেপে বলুন।" + }, + pt: { + title: "Demonstração: notas de investigação", + question: "Que alegações centrais sustentam mais fortemente o relatório?", + firstName: "report-draft.md", + firstPath: "reports/report-draft.md", + firstExcerpt: "A evidência mais forte resulta da combinação da fonte primária com uma verificação cruzada explícita.", + firstSource: "Secção 2", + secondName: "literature.pdf", + secondPath: "sources/literature.pdf", + secondExcerpt: "Vários estudos apontam para o mesmo obstáculo metodológico.", + secondSource: "Página 14", + reportTitle: "Relatório de síntese", + reportContent: "# Síntese\n\n- A alegação central A é sustentada por duas fontes.\n- Lacuna em aberto: continuam a faltar dados comparativos de 2024.", + assistantMessage: "Resuma a base de evidências da alegação principal." } }[resolvedLocale]; diff --git a/web_companion/sw.js b/web_companion/sw.js index 131f5a5..aacc90c 100644 --- a/web_companion/sw.js +++ b/web_companion/sw.js @@ -1,10 +1,11 @@ -const CACHE_NAME = "notespacellm-companion-v4"; +const CACHE_NAME = "notespacellm-companion-v5"; const ASSETS = [ "./", "./index.html", "./app.css", "./app.js", "./library.js", + "./ui-locales.js", "./manifest.webmanifest", "./icons/Icon-192.png", "./icons/Icon-512.png", diff --git a/web_companion/tests/library.test.mjs b/web_companion/tests/library.test.mjs index a905336..df5225b 100644 --- a/web_companion/tests/library.test.mjs +++ b/web_companion/tests/library.test.mjs @@ -53,12 +53,14 @@ function createAppHarness(storage = new Map(), { userAgent = "", onLine = true } ]; const elements = new Map(selectors.map((selector) => [selector, makeElement()])); elements.get("#workspace-summary").summaryCells = Array.from({ length: 5 }, makeElement); + elements.get("#language-select").dataset.i18nAriaLabel = "languageLabel"; const document = { body: { append() {} }, - documentElement: { lang: "" }, + documentElement: { dir: "", lang: "" }, createElement: makeElement, querySelector: (selector) => elements.get(selector) || makeElement(), - querySelectorAll: () => [] + querySelectorAll: (selector) => + selector === "[data-i18n-aria-label]" ? [elements.get("#language-select")] : [] }; const localStorage = { getItem: (key) => (storage.has(key) ? storage.get(key) : null), @@ -80,7 +82,7 @@ function createAppHarness(storage = new Map(), { userAgent = "", onLine = true } window, URLSearchParams }); - return { elements, storage }; + return { document, elements, storage }; } test("normalizeWorkspacePayload accepts minimal valid payload", () => { @@ -165,11 +167,15 @@ test("resolveUiLocale supports browser-style locale tags", () => { assert.equal(resolveUiLocale("zh-Hans"), "zh-Hans"); assert.equal(resolveUiLocale("ja-JP"), "ja"); assert.equal(resolveUiLocale("ru-RU"), "ru"); - assert.equal(resolveUiLocale("fr-FR"), "de"); + assert.equal(resolveUiLocale("fr-FR"), "fr"); + assert.equal(resolveUiLocale("hi-IN"), "hi"); + assert.equal(resolveUiLocale("ar-EG"), "ar"); + assert.equal(resolveUiLocale("bn-BD"), "bn"); + assert.equal(resolveUiLocale("pt-BR"), "pt"); }); test("getSupportedUiLocales exposes all web companion UI locales", () => { - assert.deepEqual(getSupportedUiLocales(), ["de", "en", "es", "zh-Hans", "ja", "ru"]); + assert.deepEqual(getSupportedUiLocales(), ["de", "en", "es", "zh-Hans", "ja", "ru", "fr", "hi", "ar", "bn", "pt"]); }); test("all UI locale tables expose the same keys", () => { @@ -197,6 +203,78 @@ test("getUiText returns premium-language web companion copy", () => { assert.equal(getUiText("ru").clearNotes, "Очистить заметки"); }); +test("the additional locale catalogs translate templates without altering their values", () => { + assert.equal(getUiText("fr").workspaceLoaded("Démo", "Essai"), "Démo chargé : Essai"); + assert.equal(getUiText("hi").untitledDocument(0), "दस्तावेज़ 1"); + assert.equal(getUiText("ar").selectedDocuments(2, 5), "تم تحديد 2 من 5"); + assert.match(getUiText("bn").notesExported("workspace-notes.md"), /workspace-notes\.md/); + assert.equal(getUiText("pt").reviewHeadingWithTitle("Análise"), "# Notas de revisão: Análise"); +}); + +test("each newly supported locale includes translated demo prose and preserves identifiers", () => { + const expected = { + ar: "تقرير تركيبي", + bn: "সংশ্লেষ প্রতিবেদন", + fr: "Rapport de synthèse", + hi: "संश्लेषण रिपोर्ट", + pt: "Relatório de síntese" + }; + + for (const [locale, reportTitle] of Object.entries(expected)) { + const demo = getDemoWorkspace(locale); + assert.equal(demo.schema_version, "notespacellm-workspace-v1"); + assert.equal(demo.app.name, "NoteSpaceLLM"); + assert.equal(demo.workspace.locale, locale); + assert.equal(demo.workspace.workflow_type, "research"); + assert.equal(demo.report.title, reportTitle); + assert.equal(demo.report.format, "markdown"); + assert.equal(demo.documents[0].name, "report-draft.md"); + assert.equal(demo.documents[0].path_hint, "reports/report-draft.md"); + assert.equal(demo.documents[0].id, "doc-1"); + assert.equal(demo.documents[0].format, "markdown"); + assert.equal(demo.chat.messages[0].role, "assistant"); + assert.equal(demo.provider.name, "ollama"); + assert.equal(demo.provider.mode, "local"); + assert.notEqual(demo.report.content, getDemoWorkspace("en").report.content); + } +}); + +test("the PWA UI locale persists across reloads and switches RTL only for Arabic", () => { + const storage = new Map(); + const firstLoad = createAppHarness(storage); + const languageSelect = firstLoad.elements.get("#language-select"); + + languageSelect.listeners.get("change")({ target: { value: "ar" } }); + assert.equal(storage.get("notespacellm-companion:locale"), "ar"); + assert.equal(firstLoad.document.documentElement.lang, "ar"); + assert.equal(firstLoad.document.documentElement.dir, "rtl"); + assert.equal(languageSelect.attributes["aria-label"], getUiText("ar").languageLabel); + assert.equal(firstLoad.elements.get("#status-message").textContent, getUiText("ar").statusNoWorkspace); + + const afterReload = createAppHarness(storage); + assert.equal(afterReload.document.documentElement.lang, "ar"); + assert.equal(afterReload.document.documentElement.dir, "rtl"); + assert.equal(afterReload.elements.get("#language-select").value, "ar"); + + afterReload.elements.get("#language-select").listeners.get("change")({ target: { value: "pt" } }); + assert.equal(storage.get("notespacellm-companion:locale"), "pt"); + assert.equal(afterReload.document.documentElement.dir, "ltr"); +}); + +test("locale switching retranslates app-owned demo labels but preserves workspace content", () => { + const app = createAppHarness(new Map()); + app.elements.get("#load-demo").listeners.get("click")(); + const originalReportTitle = app.elements.get("#report-title").textContent; + + app.elements.get("#language-select").listeners.get("change")({ target: { value: "pt" } }); + + assert.equal(app.elements.get("#report-title").textContent, originalReportTitle); + assert.match( + app.elements.get("#status-message").textContent, + /^Espaço de trabalho de demonstração carregado:/ + ); +}); + test("getPlatformGuide returns Android-specific install guidance", () => { const guide = getPlatformGuide("Mozilla/5.0 (Linux; Android 14; Pixel 8) AppleWebKit/537.36 Chrome/125.0 Mobile Safari/537.36"); @@ -229,14 +307,19 @@ test("getPlatformGuide can localize mobile hints to Japanese", () => { assert.match(guide.offline_hint, /ワークスペース JSON は保存されない.*再読み込みのたびに再インポートが必要/); }); -test("offline guidance explains workspace re-import in all six locales", () => { +test("offline guidance explains workspace re-import in all eleven locales", () => { const requiredMeaning = { de: /Workspace-JSON wird nicht gespeichert.*nach jedem Neuladen erneut importiert/i, en: /workspace JSON is not saved.*imported again after each reload/i, es: /JSON del espacio de trabajo no se guarda.*debe importarse de nuevo después de cada recarga/i, "zh-Hans": /工作区 JSON 不会保存.*每次重新加载后都必须重新导入/, ja: /ワークスペース JSON は保存されない.*再読み込みのたびに再インポートが必要/, - ru: /JSON рабочей области не сохраняется.*после каждой перезагрузки его нужно импортировать заново/i + ru: /JSON рабочей области не сохраняется.*после каждой перезагрузки его нужно импортировать заново/i, + fr: /JSON de l'espace de travail n'est pas enregistré.*réimporté après chaque rechargement/i, + hi: /वर्कस्पेस JSON सहेजा नहीं जाता.*हर रीलोड के बाद फिर से आयात करना होगा/, + ar: /JSON الخاص بمساحة العمل.*استيراده مرة أخرى بعد كل إعادة تحميل/, + bn: /ওয়ার্কস্পেস JSON সংরক্ষণ করা হয় না.*প্রতিটি রিলোডের পর আবার আমদানি করতে হবে/, + pt: /JSON do espaço de trabalho não é guardado.*reimportado após cada recarregamento/i }; for (const [locale, pattern] of Object.entries(requiredMeaning)) { diff --git a/web_companion/tests/pwa.test.mjs b/web_companion/tests/pwa.test.mjs index 1e4eeab..c324a50 100644 --- a/web_companion/tests/pwa.test.mjs +++ b/web_companion/tests/pwa.test.mjs @@ -116,6 +116,10 @@ describe('sw.js', () => { assert.ok(sw.includes('apple-touch-icon-180.png'), 'apple-touch-icon-180.png fehlt in sw.js ASSETS'); }); + it('cached the additional locale catalog for offline startup', () => { + assert.ok(sw.includes('./ui-locales.js'), 'ui-locales.js fehlt in sw.js ASSETS'); + }); + // Bug #2: caches.match ohne ignoreSearch schlägt bei ?demo=1-URLs offline fehl it('caches.match nutzt ignoreSearch:true', () => { assert.ok( @@ -140,8 +144,8 @@ describe('index.html — Integration', () => { assert.ok(html.includes('app.js'), 'app.js-Script fehlt in index.html'); }); - it('bietet alle sechs UI-Sprachen im Sprachumschalter an', () => { - for (const locale of ['de', 'en', 'es', 'zh-Hans', 'ja', 'ru']) { + it('bietet alle elf UI-Sprachen im Sprachumschalter an', () => { + for (const locale of ['de', 'en', 'es', 'zh-Hans', 'ja', 'ru', 'fr', 'hi', 'ar', 'bn', 'pt']) { assert.match( html, new RegExp(`