diff --git a/README.ar.md b/README.ar.md index b7175e5e3f..a0c8fbf9db 100644 --- a/README.ar.md +++ b/README.ar.md @@ -60,22 +60,22 @@ docker run -d -p 3000:8080 --add-host=host.docker.internal:host-gateway -v open- ثم افتح [http://localhost:3000](http://localhost:3000). -| وسم الصورة | المحتوى | -| --- | --- | -| `:main` | صورة قياسية تتضمن اعتماديات الذكاء الاصطناعي المحلي | -| `:slim` | صورة خفيفة تستخدم خدمات خارجية للتضمينات واستخراج محتوى المستندات والصوت | -| `:cuda` | Open WebUI مع تسريع CUDA | -| `:ollama` | Open WebUI مرفقًا معه Ollama | -| `:dev` | أحدث نسخة تطوير | +| وسم الصورة | المحتوى | +| ---------- | ------------------------------------------------------------------------ | +| `:main` | صورة قياسية تتضمن اعتماديات الذكاء الاصطناعي المحلي | +| `:slim` | صورة خفيفة تستخدم خدمات خارجية للتضمينات واستخراج محتوى المستندات والصوت | +| `:cuda` | Open WebUI مع تسريع CUDA | +| `:ollama` | Open WebUI مرفقًا معه Ollama | +| `:dev` | أحدث نسخة تطوير | أضف هذه الخيارات إلى `docker run` قبل اسم الصورة حسب الحاجة: -| الخيار | الغرض | -| --- | --- | -| `-e OLLAMA_BASE_URL=http://your-ollama-server:11434` | الاتصال بـ Ollama على خادم آخر | -| `-e OPENAI_API_KEY=your_secret_key` | تعيين مفتاح API الخاص بك لدى OpenAI | -| `-e HF_HUB_OFFLINE=1` | تعطيل تنزيل نماذج Hugging Face للاستخدام دون اتصال | -| `--gpus all` | تمكين الوصول إلى وحدة معالجة الرسوميات Nvidia مع `:cuda` أو `:ollama`؛ يتطلب Nvidia Container Toolkit | +| الخيار | الغرض | +| ---------------------------------------------------- | ----------------------------------------------------------------------------------------------------- | +| `-e OLLAMA_BASE_URL=http://your-ollama-server:11434` | الاتصال بـ Ollama على خادم آخر | +| `-e OPENAI_API_KEY=your_secret_key` | تعيين مفتاح API الخاص بك لدى OpenAI | +| `-e HF_HUB_OFFLINE=1` | تعطيل تنزيل نماذج Hugging Face للاستخدام دون اتصال | +| `--gpus all` | تمكين الوصول إلى وحدة معالجة الرسوميات Nvidia مع `:cuda` أو `:ollama`؛ يتطلب Nvidia Container Toolkit | راجع [دليل التثبيت باستخدام Docker](https://docs.openwebui.com/getting-started/quick-start/) للاطلاع على خطوات الإعداد وخيارات الضبط. diff --git a/README.bn.md b/README.bn.md index 7b278800ba..1c40801f8b 100644 --- a/README.bn.md +++ b/README.bn.md @@ -60,22 +60,22 @@ docker run -d -p 3000:8080 --add-host=host.docker.internal:host-gateway -v open- এরপর [http://localhost:3000](http://localhost:3000) খুলুন। -| ইমেজ ট্যাগ | যা অন্তর্ভুক্ত আছে | -| --- | --- | -| `:main` | স্থানীয় AI-এর প্রয়োজনীয় ডিপেন্ডেন্সিসহ স্ট্যান্ডার্ড ইমেজ | -| `:slim` | এম্বেডিং, ডকুমেন্ট থেকে তথ্য আহরণ ও ভয়েসের জন্য বাহ্যিক সেবা ব্যবহার করা হালকা ইমেজ | -| `:cuda` | CUDA অ্যাক্সেলারেশনসহ Open WebUI | -| `:ollama` | Ollama-সহ Open WebUI | -| `:dev` | সর্বশেষ ডেভেলপমেন্ট বিল্ড | +| ইমেজ ট্যাগ | যা অন্তর্ভুক্ত আছে | +| ---------- | ------------------------------------------------------------------------------------ | +| `:main` | স্থানীয় AI-এর প্রয়োজনীয় ডিপেন্ডেন্সিসহ স্ট্যান্ডার্ড ইমেজ | +| `:slim` | এম্বেডিং, ডকুমেন্ট থেকে তথ্য আহরণ ও ভয়েসের জন্য বাহ্যিক সেবা ব্যবহার করা হালকা ইমেজ | +| `:cuda` | CUDA অ্যাক্সেলারেশনসহ Open WebUI | +| `:ollama` | Ollama-সহ Open WebUI | +| `:dev` | সর্বশেষ ডেভেলপমেন্ট বিল্ড | প্রয়োজন অনুযায়ী `docker run` কমান্ডে ইমেজের নামের আগে এই অপশনগুলো যোগ করুন: -| অপশন | উদ্দেশ্য | -| --- | --- | -| `-e OLLAMA_BASE_URL=http://your-ollama-server:11434` | অন্য সার্ভারে থাকা Ollama-তে সংযোগ করা | -| `-e OPENAI_API_KEY=your_secret_key` | আপনার OpenAI API কী সেট করা | -| `-e HF_HUB_OFFLINE=1` | অফলাইনে ব্যবহারের জন্য Hugging Face মডেল ডাউনলোড বন্ধ করা | -| `--gpus all` | `:cuda` বা `:ollama`-এর জন্য Nvidia GPU ব্যবহারের অনুমতি দেওয়া; Nvidia Container Toolkit প্রয়োজন | +| অপশন | উদ্দেশ্য | +| ---------------------------------------------------- | -------------------------------------------------------------------------------------------------- | +| `-e OLLAMA_BASE_URL=http://your-ollama-server:11434` | অন্য সার্ভারে থাকা Ollama-তে সংযোগ করা | +| `-e OPENAI_API_KEY=your_secret_key` | আপনার OpenAI API কী সেট করা | +| `-e HF_HUB_OFFLINE=1` | অফলাইনে ব্যবহারের জন্য Hugging Face মডেল ডাউনলোড বন্ধ করা | +| `--gpus all` | `:cuda` বা `:ollama`-এর জন্য Nvidia GPU ব্যবহারের অনুমতি দেওয়া; Nvidia Container Toolkit প্রয়োজন | সেটআপের নির্দেশনা ও কনফিগারেশন অপশনের জন্য [Docker ইনস্টলেশন নির্দেশিকা](https://docs.openwebui.com/getting-started/quick-start/) দেখুন। diff --git a/README.br.md b/README.br.md index a9e2b35fcc..649f57b52b 100644 --- a/README.br.md +++ b/README.br.md @@ -60,22 +60,22 @@ docker run -d -p 3000:8080 --add-host=host.docker.internal:host-gateway -v open- Depois, abra [http://localhost:3000](http://localhost:3000). -| Tag da imagem | Conteúdo | -| --- | --- | -| `:main` | Imagem padrão com dependências de IA local | -| `:slim` | Imagem leve que usa serviços externos para embeddings, extração de documentos e voz | -| `:cuda` | Open WebUI com aceleração CUDA | -| `:ollama` | Open WebUI com Ollama incluído | -| `:dev` | Build de desenvolvimento mais recente | +| Tag da imagem | Conteúdo | +| ------------- | ----------------------------------------------------------------------------------- | +| `:main` | Imagem padrão com dependências de IA local | +| `:slim` | Imagem leve que usa serviços externos para embeddings, extração de documentos e voz | +| `:cuda` | Open WebUI com aceleração CUDA | +| `:ollama` | Open WebUI com Ollama incluído | +| `:dev` | Build de desenvolvimento mais recente | Adicione estas opções ao `docker run` antes do nome da imagem, conforme necessário: -| Opção | Finalidade | -| --- | --- | -| `-e OLLAMA_BASE_URL=http://your-ollama-server:11434` | Conectar ao Ollama em outro servidor | -| `-e OPENAI_API_KEY=your_secret_key` | Definir sua chave de API da OpenAI | -| `-e HF_HUB_OFFLINE=1` | Desativar downloads de modelos do Hugging Face para uso offline | -| `--gpus all` | Habilitar acesso à GPU Nvidia para `:cuda` ou `:ollama`; requer o Nvidia Container Toolkit | +| Opção | Finalidade | +| ---------------------------------------------------- | ------------------------------------------------------------------------------------------ | +| `-e OLLAMA_BASE_URL=http://your-ollama-server:11434` | Conectar ao Ollama em outro servidor | +| `-e OPENAI_API_KEY=your_secret_key` | Definir sua chave de API da OpenAI | +| `-e HF_HUB_OFFLINE=1` | Desativar downloads de modelos do Hugging Face para uso offline | +| `--gpus all` | Habilitar acesso à GPU Nvidia para `:cuda` ou `:ollama`; requer o Nvidia Container Toolkit | Consulte o [guia de instalação com Docker](https://docs.openwebui.com/getting-started/quick-start/) para instruções e opções de configuração. diff --git a/README.bs.md b/README.bs.md index 1debbbe58b..6a3aca127d 100644 --- a/README.bs.md +++ b/README.bs.md @@ -60,22 +60,22 @@ docker run -d -p 3000:8080 --add-host=host.docker.internal:host-gateway -v open- Zatim otvorite [http://localhost:3000](http://localhost:3000). -| Oznaka slike | Sadržaj | -| --- | --- | -| `:main` | Standardna slika sa zavisnostima za lokalni AI | -| `:slim` | Lagana slika koja koristi vanjske servise za embeddinge, izdvajanje sadržaja dokumenata i govor | -| `:cuda` | Open WebUI s CUDA ubrzanjem | -| `:ollama` | Open WebUI s uključenom Ollamom | -| `:dev` | Najnovija razvojna verzija | +| Oznaka slike | Sadržaj | +| ------------ | ----------------------------------------------------------------------------------------------- | +| `:main` | Standardna slika sa zavisnostima za lokalni AI | +| `:slim` | Lagana slika koja koristi vanjske servise za embeddinge, izdvajanje sadržaja dokumenata i govor | +| `:cuda` | Open WebUI s CUDA ubrzanjem | +| `:ollama` | Open WebUI s uključenom Ollamom | +| `:dev` | Najnovija razvojna verzija | Po potrebi dodajte ove opcije u `docker run` prije naziva slike: -| Opcija | Namjena | -| --- | --- | -| `-e OLLAMA_BASE_URL=http://your-ollama-server:11434` | Povezivanje s Ollamom na drugom serveru | -| `-e OPENAI_API_KEY=your_secret_key` | Postavljanje OpenAI API ključa | -| `-e HF_HUB_OFFLINE=1` | Isključivanje preuzimanja Hugging Face modela za rad offline | -| `--gpus all` | Omogućavanje pristupa Nvidia GPU-u za `:cuda` ili `:ollama`; potreban je Nvidia Container Toolkit | +| Opcija | Namjena | +| ---------------------------------------------------- | ------------------------------------------------------------------------------------------------- | +| `-e OLLAMA_BASE_URL=http://your-ollama-server:11434` | Povezivanje s Ollamom na drugom serveru | +| `-e OPENAI_API_KEY=your_secret_key` | Postavljanje OpenAI API ključa | +| `-e HF_HUB_OFFLINE=1` | Isključivanje preuzimanja Hugging Face modela za rad offline | +| `--gpus all` | Omogućavanje pristupa Nvidia GPU-u za `:cuda` ili `:ollama`; potreban je Nvidia Container Toolkit | Upute i opcije konfiguracije nalaze se u [vodiču za instalaciju putem Dockera](https://docs.openwebui.com/getting-started/quick-start/). diff --git a/README.da.md b/README.da.md index fa8ce35aa7..e4f08535af 100644 --- a/README.da.md +++ b/README.da.md @@ -60,22 +60,22 @@ docker run -d -p 3000:8080 --add-host=host.docker.internal:host-gateway -v open- Åbn derefter [http://localhost:3000](http://localhost:3000). -| Image-tag | Indhold | -| --- | --- | -| `:main` | Standardimage med afhængigheder til lokal AI | -| `:slim` | Letvægtsimage med eksterne tjenester til embeddings, dokumentudtræk og tale | -| `:cuda` | Open WebUI med CUDA-acceleration | -| `:ollama` | Open WebUI med Ollama inkluderet | -| `:dev` | Nyeste udviklingsbuild | +| Image-tag | Indhold | +| --------- | --------------------------------------------------------------------------- | +| `:main` | Standardimage med afhængigheder til lokal AI | +| `:slim` | Letvægtsimage med eksterne tjenester til embeddings, dokumentudtræk og tale | +| `:cuda` | Open WebUI med CUDA-acceleration | +| `:ollama` | Open WebUI med Ollama inkluderet | +| `:dev` | Nyeste udviklingsbuild | Tilføj disse indstillinger til `docker run` før image-navnet efter behov: -| Indstilling | Formål | -| --- | --- | -| `-e OLLAMA_BASE_URL=http://your-ollama-server:11434` | Opret forbindelse til Ollama på en anden server | -| `-e OPENAI_API_KEY=your_secret_key` | Angiv din OpenAI-API-nøgle | -| `-e HF_HUB_OFFLINE=1` | Deaktiver download af Hugging Face-modeller til offlinebrug | -| `--gpus all` | Aktiver Nvidia-GPU-adgang for `:cuda` eller `:ollama`; kræver Nvidia Container Toolkit | +| Indstilling | Formål | +| ---------------------------------------------------- | -------------------------------------------------------------------------------------- | +| `-e OLLAMA_BASE_URL=http://your-ollama-server:11434` | Opret forbindelse til Ollama på en anden server | +| `-e OPENAI_API_KEY=your_secret_key` | Angiv din OpenAI-API-nøgle | +| `-e HF_HUB_OFFLINE=1` | Deaktiver download af Hugging Face-modeller til offlinebrug | +| `--gpus all` | Aktiver Nvidia-GPU-adgang for `:cuda` eller `:ollama`; kræver Nvidia Container Toolkit | Se [installationsvejledningen til Docker](https://docs.openwebui.com/getting-started/quick-start/) for opsætning og konfigurationsmuligheder. diff --git a/README.de.md b/README.de.md index 7008185db6..b8e46ccbfd 100644 --- a/README.de.md +++ b/README.de.md @@ -60,22 +60,22 @@ docker run -d -p 3000:8080 --add-host=host.docker.internal:host-gateway -v open- Öffne anschließend [http://localhost:3000](http://localhost:3000). -| Image-Tag | Inhalt | -| --- | --- | -| `:main` | Standard-Image mit Abhängigkeiten für lokale KI | -| `:slim` | Schlankes Image mit externen Diensten für Embeddings, Dokumentenextraktion und Sprache | -| `:cuda` | Open WebUI mit CUDA-Beschleunigung | -| `:ollama` | Open WebUI mit integriertem Ollama | -| `:dev` | Neuester Entwicklungsbuild | +| Image-Tag | Inhalt | +| --------- | -------------------------------------------------------------------------------------- | +| `:main` | Standard-Image mit Abhängigkeiten für lokale KI | +| `:slim` | Schlankes Image mit externen Diensten für Embeddings, Dokumentenextraktion und Sprache | +| `:cuda` | Open WebUI mit CUDA-Beschleunigung | +| `:ollama` | Open WebUI mit integriertem Ollama | +| `:dev` | Neuester Entwicklungsbuild | Füge diese Optionen bei Bedarf vor dem Image-Namen zu `docker run` hinzu: -| Option | Zweck | -| --- | --- | -| `-e OLLAMA_BASE_URL=http://your-ollama-server:11434` | Verbindung zu Ollama auf einem anderen Server | -| `-e OPENAI_API_KEY=your_secret_key` | OpenAI-API-Schlüssel festlegen | -| `-e HF_HUB_OFFLINE=1` | Downloads von Hugging-Face-Modellen für den Offlinebetrieb deaktivieren | -| `--gpus all` | Nvidia-GPU-Zugriff für `:cuda` oder `:ollama` aktivieren; erfordert das Nvidia Container Toolkit | +| Option | Zweck | +| ---------------------------------------------------- | ------------------------------------------------------------------------------------------------ | +| `-e OLLAMA_BASE_URL=http://your-ollama-server:11434` | Verbindung zu Ollama auf einem anderen Server | +| `-e OPENAI_API_KEY=your_secret_key` | OpenAI-API-Schlüssel festlegen | +| `-e HF_HUB_OFFLINE=1` | Downloads von Hugging-Face-Modellen für den Offlinebetrieb deaktivieren | +| `--gpus all` | Nvidia-GPU-Zugriff für `:cuda` oder `:ollama` aktivieren; erfordert das Nvidia Container Toolkit | Einrichtung und Konfigurationsoptionen findest du in der [Docker-Installationsanleitung](https://docs.openwebui.com/getting-started/quick-start/). diff --git a/README.es.md b/README.es.md index de1a4438a2..ba33451127 100644 --- a/README.es.md +++ b/README.es.md @@ -60,22 +60,22 @@ docker run -d -p 3000:8080 --add-host=host.docker.internal:host-gateway -v open- Después, abre [http://localhost:3000](http://localhost:3000). -| Etiqueta de imagen | Contenido | -| --- | --- | -| `:main` | Imagen estándar con dependencias de IA local | -| `:slim` | Imagen ligera que usa servicios externos para embeddings, extracción de documentos y voz | -| `:cuda` | Open WebUI con aceleración CUDA | -| `:ollama` | Open WebUI con Ollama incluido | -| `:dev` | Última compilación de desarrollo | +| Etiqueta de imagen | Contenido | +| ------------------ | ---------------------------------------------------------------------------------------- | +| `:main` | Imagen estándar con dependencias de IA local | +| `:slim` | Imagen ligera que usa servicios externos para embeddings, extracción de documentos y voz | +| `:cuda` | Open WebUI con aceleración CUDA | +| `:ollama` | Open WebUI con Ollama incluido | +| `:dev` | Última compilación de desarrollo | Añade estas opciones a `docker run` antes del nombre de la imagen según lo necesites: -| Opción | Función | -| --- | --- | -| `-e OLLAMA_BASE_URL=http://your-ollama-server:11434` | Conectarse a Ollama en otro servidor | -| `-e OPENAI_API_KEY=your_secret_key` | Configurar tu clave de API de OpenAI | -| `-e HF_HUB_OFFLINE=1` | Desactivar las descargas de modelos de Hugging Face para el uso sin conexión | -| `--gpus all` | Habilitar el acceso a GPU Nvidia para `:cuda` o `:ollama`; requiere Nvidia Container Toolkit | +| Opción | Función | +| ---------------------------------------------------- | -------------------------------------------------------------------------------------------- | +| `-e OLLAMA_BASE_URL=http://your-ollama-server:11434` | Conectarse a Ollama en otro servidor | +| `-e OPENAI_API_KEY=your_secret_key` | Configurar tu clave de API de OpenAI | +| `-e HF_HUB_OFFLINE=1` | Desactivar las descargas de modelos de Hugging Face para el uso sin conexión | +| `--gpus all` | Habilitar el acceso a GPU Nvidia para `:cuda` o `:ollama`; requiere Nvidia Container Toolkit | Consulta la [guía de instalación con Docker](https://docs.openwebui.com/getting-started/quick-start/) para ver las instrucciones y opciones de configuración. diff --git a/README.fr.md b/README.fr.md index b65cf43c02..d823aba8b5 100644 --- a/README.fr.md +++ b/README.fr.md @@ -60,22 +60,22 @@ docker run -d -p 3000:8080 --add-host=host.docker.internal:host-gateway -v open- Ouvrez ensuite [http://localhost:3000](http://localhost:3000). -| Tag de l’image | Contenu | -| --- | --- | -| `:main` | Image standard avec les dépendances d’IA locales | -| `:slim` | Image légère utilisant des services externes pour les embeddings, l’extraction de documents et la voix | -| `:cuda` | Open WebUI avec accélération CUDA | -| `:ollama` | Open WebUI avec Ollama intégré | -| `:dev` | Dernière version de développement | +| Tag de l’image | Contenu | +| -------------- | ------------------------------------------------------------------------------------------------------ | +| `:main` | Image standard avec les dépendances d’IA locales | +| `:slim` | Image légère utilisant des services externes pour les embeddings, l’extraction de documents et la voix | +| `:cuda` | Open WebUI avec accélération CUDA | +| `:ollama` | Open WebUI avec Ollama intégré | +| `:dev` | Dernière version de développement | Ajoutez ces options à `docker run` avant le nom de l’image, selon vos besoins : -| Option | Fonction | -| --- | --- | -| `-e OLLAMA_BASE_URL=http://your-ollama-server:11434` | Se connecter à Ollama sur un autre serveur | -| `-e OPENAI_API_KEY=your_secret_key` | Définir votre clé API OpenAI | -| `-e HF_HUB_OFFLINE=1` | Désactiver le téléchargement des modèles Hugging Face pour une utilisation hors ligne | -| `--gpus all` | Activer l’accès aux GPU Nvidia pour `:cuda` ou `:ollama` ; nécessite Nvidia Container Toolkit | +| Option | Fonction | +| ---------------------------------------------------- | --------------------------------------------------------------------------------------------- | +| `-e OLLAMA_BASE_URL=http://your-ollama-server:11434` | Se connecter à Ollama sur un autre serveur | +| `-e OPENAI_API_KEY=your_secret_key` | Définir votre clé API OpenAI | +| `-e HF_HUB_OFFLINE=1` | Désactiver le téléchargement des modèles Hugging Face pour une utilisation hors ligne | +| `--gpus all` | Activer l’accès aux GPU Nvidia pour `:cuda` ou `:ollama` ; nécessite Nvidia Container Toolkit | Consultez le [guide d’installation Docker](https://docs.openwebui.com/getting-started/quick-start/) pour les instructions et les options de configuration. diff --git a/README.gr.md b/README.gr.md index 857ac69740..49578767e3 100644 --- a/README.gr.md +++ b/README.gr.md @@ -60,22 +60,22 @@ docker run -d -p 3000:8080 --add-host=host.docker.internal:host-gateway -v open- Στη συνέχεια, ανοίξτε το [http://localhost:3000](http://localhost:3000). -| Ετικέτα εικόνας | Περιεχόμενο | -| --- | --- | -| `:main` | Τυπική εικόνα με εξαρτήσεις για τοπική AI | -| `:slim` | Ελαφριά εικόνα που χρησιμοποιεί εξωτερικές υπηρεσίες για embeddings, εξαγωγή περιεχομένου εγγράφων και φωνή | -| `:cuda` | Open WebUI με επιτάχυνση CUDA | -| `:ollama` | Open WebUI με ενσωματωμένο Ollama | -| `:dev` | Νεότερη έκδοση ανάπτυξης | +| Ετικέτα εικόνας | Περιεχόμενο | +| --------------- | ----------------------------------------------------------------------------------------------------------- | +| `:main` | Τυπική εικόνα με εξαρτήσεις για τοπική AI | +| `:slim` | Ελαφριά εικόνα που χρησιμοποιεί εξωτερικές υπηρεσίες για embeddings, εξαγωγή περιεχομένου εγγράφων και φωνή | +| `:cuda` | Open WebUI με επιτάχυνση CUDA | +| `:ollama` | Open WebUI με ενσωματωμένο Ollama | +| `:dev` | Νεότερη έκδοση ανάπτυξης | Προσθέστε αυτές τις επιλογές στο `docker run` πριν από το όνομα της εικόνας, ανάλογα με τις ανάγκες σας: -| Επιλογή | Σκοπός | -| --- | --- | -| `-e OLLAMA_BASE_URL=http://your-ollama-server:11434` | Σύνδεση με Ollama σε άλλον διακομιστή | -| `-e OPENAI_API_KEY=your_secret_key` | Ορισμός του κλειδιού API OpenAI | -| `-e HF_HUB_OFFLINE=1` | Απενεργοποίηση λήψεων μοντέλων Hugging Face για χρήση εκτός σύνδεσης | -| `--gpus all` | Ενεργοποίηση πρόσβασης σε GPU Nvidia για `:cuda` ή `:ollama`· απαιτείται Nvidia Container Toolkit | +| Επιλογή | Σκοπός | +| ---------------------------------------------------- | ------------------------------------------------------------------------------------------------- | +| `-e OLLAMA_BASE_URL=http://your-ollama-server:11434` | Σύνδεση με Ollama σε άλλον διακομιστή | +| `-e OPENAI_API_KEY=your_secret_key` | Ορισμός του κλειδιού API OpenAI | +| `-e HF_HUB_OFFLINE=1` | Απενεργοποίηση λήψεων μοντέλων Hugging Face για χρήση εκτός σύνδεσης | +| `--gpus all` | Ενεργοποίηση πρόσβασης σε GPU Nvidia για `:cuda` ή `:ollama`· απαιτείται Nvidia Container Toolkit | Δείτε τον [οδηγό εγκατάστασης με Docker](https://docs.openwebui.com/getting-started/quick-start/) για οδηγίες και επιλογές διαμόρφωσης. diff --git a/README.it.md b/README.it.md index b9982d8ab2..f9d06b1922 100644 --- a/README.it.md +++ b/README.it.md @@ -60,22 +60,22 @@ docker run -d -p 3000:8080 --add-host=host.docker.internal:host-gateway -v open- Poi apri [http://localhost:3000](http://localhost:3000). -| Tag dell’immagine | Contenuto | -| --- | --- | -| `:main` | Immagine standard con dipendenze per l’IA locale | -| `:slim` | Immagine leggera che usa servizi esterni per embedding, estrazione dei documenti e voce | -| `:cuda` | Open WebUI con accelerazione CUDA | -| `:ollama` | Open WebUI con Ollama incluso | -| `:dev` | Ultima build di sviluppo | +| Tag dell’immagine | Contenuto | +| ----------------- | --------------------------------------------------------------------------------------- | +| `:main` | Immagine standard con dipendenze per l’IA locale | +| `:slim` | Immagine leggera che usa servizi esterni per embedding, estrazione dei documenti e voce | +| `:cuda` | Open WebUI con accelerazione CUDA | +| `:ollama` | Open WebUI con Ollama incluso | +| `:dev` | Ultima build di sviluppo | Aggiungi queste opzioni a `docker run` prima del nome dell’immagine, secondo necessità: -| Opzione | Scopo | -| --- | --- | -| `-e OLLAMA_BASE_URL=http://your-ollama-server:11434` | Collegarsi a Ollama su un altro server | -| `-e OPENAI_API_KEY=your_secret_key` | Impostare la chiave API OpenAI | -| `-e HF_HUB_OFFLINE=1` | Disabilitare i download dei modelli Hugging Face per l’uso offline | -| `--gpus all` | Abilitare l’accesso alla GPU Nvidia per `:cuda` o `:ollama`; richiede Nvidia Container Toolkit | +| Opzione | Scopo | +| ---------------------------------------------------- | ---------------------------------------------------------------------------------------------- | +| `-e OLLAMA_BASE_URL=http://your-ollama-server:11434` | Collegarsi a Ollama su un altro server | +| `-e OPENAI_API_KEY=your_secret_key` | Impostare la chiave API OpenAI | +| `-e HF_HUB_OFFLINE=1` | Disabilitare i download dei modelli Hugging Face per l’uso offline | +| `--gpus all` | Abilitare l’accesso alla GPU Nvidia per `:cuda` o `:ollama`; richiede Nvidia Container Toolkit | Consulta la [guida all’installazione con Docker](https://docs.openwebui.com/getting-started/quick-start/) per le istruzioni e le opzioni di configurazione. diff --git a/README.ja.md b/README.ja.md index ccbe15bd93..bd1b60b92e 100644 --- a/README.ja.md +++ b/README.ja.md @@ -60,22 +60,22 @@ docker run -d -p 3000:8080 --add-host=host.docker.internal:host-gateway -v open- その後、[http://localhost:3000](http://localhost:3000) を開きます。 -| イメージタグ | 内容 | -| --- | --- | -| `:main` | ローカル AI 用の依存パッケージを含む標準イメージ | -| `:slim` | 埋め込み、ドキュメント抽出、音声処理に外部サービスを使う軽量イメージ | -| `:cuda` | CUDA アクセラレーション対応の Open WebUI | -| `:ollama` | Ollama を同梱した Open WebUI | -| `:dev` | 最新の開発ビルド | +| イメージタグ | 内容 | +| ------------ | -------------------------------------------------------------------- | +| `:main` | ローカル AI 用の依存パッケージを含む標準イメージ | +| `:slim` | 埋め込み、ドキュメント抽出、音声処理に外部サービスを使う軽量イメージ | +| `:cuda` | CUDA アクセラレーション対応の Open WebUI | +| `:ollama` | Ollama を同梱した Open WebUI | +| `:dev` | 最新の開発ビルド | 必要に応じて、`docker run` のイメージ名の前に以下のオプションを追加してください。 -| オプション | 用途 | -| --- | --- | -| `-e OLLAMA_BASE_URL=http://your-ollama-server:11434` | 別のサーバー上の Ollama に接続 | -| `-e OPENAI_API_KEY=your_secret_key` | OpenAI API キーを設定 | -| `-e HF_HUB_OFFLINE=1` | オフライン利用のため Hugging Face のモデルダウンロードを無効化 | -| `--gpus all` | `:cuda` または `:ollama` で Nvidia GPU を利用。Nvidia Container Toolkit が必要 | +| オプション | 用途 | +| ---------------------------------------------------- | ------------------------------------------------------------------------------ | +| `-e OLLAMA_BASE_URL=http://your-ollama-server:11434` | 別のサーバー上の Ollama に接続 | +| `-e OPENAI_API_KEY=your_secret_key` | OpenAI API キーを設定 | +| `-e HF_HUB_OFFLINE=1` | オフライン利用のため Hugging Face のモデルダウンロードを無効化 | +| `--gpus all` | `:cuda` または `:ollama` で Nvidia GPU を利用。Nvidia Container Toolkit が必要 | セットアップ手順と設定項目は [Docker インストールガイド](https://docs.openwebui.com/getting-started/quick-start/)をご覧ください。 diff --git a/README.ko.md b/README.ko.md index d44fc44b89..d05b9fe093 100644 --- a/README.ko.md +++ b/README.ko.md @@ -60,22 +60,22 @@ docker run -d -p 3000:8080 --add-host=host.docker.internal:host-gateway -v open- 그런 다음 [http://localhost:3000](http://localhost:3000)을 여세요. -| 이미지 태그 | 구성 | -| --- | --- | -| `:main` | 로컬 AI 의존성이 포함된 표준 이미지 | -| `:slim` | 임베딩, 문서 추출, 음성 처리에 외부 서비스를 사용하는 경량 이미지 | -| `:cuda` | CUDA 가속을 지원하는 Open WebUI | -| `:ollama` | Ollama가 포함된 Open WebUI | -| `:dev` | 최신 개발 빌드 | +| 이미지 태그 | 구성 | +| ----------- | ----------------------------------------------------------------- | +| `:main` | 로컬 AI 의존성이 포함된 표준 이미지 | +| `:slim` | 임베딩, 문서 추출, 음성 처리에 외부 서비스를 사용하는 경량 이미지 | +| `:cuda` | CUDA 가속을 지원하는 Open WebUI | +| `:ollama` | Ollama가 포함된 Open WebUI | +| `:dev` | 최신 개발 빌드 | 필요에 따라 `docker run`의 이미지 이름 앞에 다음 옵션을 추가하세요. -| 옵션 | 용도 | -| --- | --- | -| `-e OLLAMA_BASE_URL=http://your-ollama-server:11434` | 다른 서버의 Ollama에 연결 | -| `-e OPENAI_API_KEY=your_secret_key` | OpenAI API 키 설정 | -| `-e HF_HUB_OFFLINE=1` | 오프라인 사용을 위해 Hugging Face 모델 다운로드 비활성화 | -| `--gpus all` | `:cuda` 또는 `:ollama`에서 Nvidia GPU 사용 활성화. Nvidia Container Toolkit 필요 | +| 옵션 | 용도 | +| ---------------------------------------------------- | -------------------------------------------------------------------------------- | +| `-e OLLAMA_BASE_URL=http://your-ollama-server:11434` | 다른 서버의 Ollama에 연결 | +| `-e OPENAI_API_KEY=your_secret_key` | OpenAI API 키 설정 | +| `-e HF_HUB_OFFLINE=1` | 오프라인 사용을 위해 Hugging Face 모델 다운로드 비활성화 | +| `--gpus all` | `:cuda` 또는 `:ollama`에서 Nvidia GPU 사용 활성화. Nvidia Container Toolkit 필요 | 설치 방법과 설정 옵션은 [Docker 설치 가이드](https://docs.openwebui.com/getting-started/quick-start/)를 참고하세요. diff --git a/README.md b/README.md index 65d7ac7945..1f2735fd8c 100644 --- a/README.md +++ b/README.md @@ -60,22 +60,22 @@ docker run -d -p 3000:8080 --add-host=host.docker.internal:host-gateway -v open- Then open [http://localhost:3000](http://localhost:3000). -| Image tag | Includes | -| --- | --- | -| `:main` | Standard image with local AI dependencies | -| `:slim` | Lightweight image using external services for embeddings, document extraction, and voice | -| `:cuda` | Open WebUI with CUDA acceleration | -| `:ollama` | Open WebUI bundled with Ollama | -| `:dev` | Latest development build | +| Image tag | Includes | +| --------- | ---------------------------------------------------------------------------------------- | +| `:main` | Standard image with local AI dependencies | +| `:slim` | Lightweight image using external services for embeddings, document extraction, and voice | +| `:cuda` | Open WebUI with CUDA acceleration | +| `:ollama` | Open WebUI bundled with Ollama | +| `:dev` | Latest development build | Add these options to `docker run` before the image name as needed: -| Option | Purpose | -| --- | --- | -| `-e OLLAMA_BASE_URL=http://your-ollama-server:11434` | Connect to Ollama on another server | -| `-e OPENAI_API_KEY=your_secret_key` | Set your OpenAI API key | -| `-e HF_HUB_OFFLINE=1` | Disable Hugging Face model downloads for offline use | -| `--gpus all` | Enable Nvidia GPU access for `:cuda` or `:ollama`; requires the Nvidia Container Toolkit | +| Option | Purpose | +| ---------------------------------------------------- | ---------------------------------------------------------------------------------------- | +| `-e OLLAMA_BASE_URL=http://your-ollama-server:11434` | Connect to Ollama on another server | +| `-e OPENAI_API_KEY=your_secret_key` | Set your OpenAI API key | +| `-e HF_HUB_OFFLINE=1` | Disable Hugging Face model downloads for offline use | +| `--gpus all` | Enable Nvidia GPU access for `:cuda` or `:ollama`; requires the Nvidia Container Toolkit | See the [Docker installation guide](https://docs.openwebui.com/getting-started/quick-start/) for setup instructions and configuration options. diff --git a/README.no.md b/README.no.md index 7162e8e15f..48eee11ad7 100644 --- a/README.no.md +++ b/README.no.md @@ -60,22 +60,22 @@ docker run -d -p 3000:8080 --add-host=host.docker.internal:host-gateway -v open- Åpne deretter [http://localhost:3000](http://localhost:3000). -| Image-tagg | Innhold | -| --- | --- | -| `:main` | Standardimage med avhengigheter for lokal KI | -| `:slim` | Lettvektsimage med eksterne tjenester for embeddings, dokumentuttrekk og tale | -| `:cuda` | Open WebUI med CUDA-akselerasjon | -| `:ollama` | Open WebUI med Ollama inkludert | -| `:dev` | Nyeste utviklingsbygg | +| Image-tagg | Innhold | +| ---------- | ----------------------------------------------------------------------------- | +| `:main` | Standardimage med avhengigheter for lokal KI | +| `:slim` | Lettvektsimage med eksterne tjenester for embeddings, dokumentuttrekk og tale | +| `:cuda` | Open WebUI med CUDA-akselerasjon | +| `:ollama` | Open WebUI med Ollama inkludert | +| `:dev` | Nyeste utviklingsbygg | Legg til disse valgene i `docker run` før image-navnet etter behov: -| Valg | Formål | -| --- | --- | -| `-e OLLAMA_BASE_URL=http://your-ollama-server:11434` | Koble til Ollama på en annen server | -| `-e OPENAI_API_KEY=your_secret_key` | Angi OpenAI-API-nøkkelen din | -| `-e HF_HUB_OFFLINE=1` | Deaktiver nedlasting av Hugging Face-modeller for bruk uten nettilgang | -| `--gpus all` | Aktiver tilgang til Nvidia-GPU for `:cuda` eller `:ollama`; krever Nvidia Container Toolkit | +| Valg | Formål | +| ---------------------------------------------------- | ------------------------------------------------------------------------------------------- | +| `-e OLLAMA_BASE_URL=http://your-ollama-server:11434` | Koble til Ollama på en annen server | +| `-e OPENAI_API_KEY=your_secret_key` | Angi OpenAI-API-nøkkelen din | +| `-e HF_HUB_OFFLINE=1` | Deaktiver nedlasting av Hugging Face-modeller for bruk uten nettilgang | +| `--gpus all` | Aktiver tilgang til Nvidia-GPU for `:cuda` eller `:ollama`; krever Nvidia Container Toolkit | Se [installasjonsveiledningen for Docker](https://docs.openwebui.com/getting-started/quick-start/) for oppsett og konfigurasjonsvalg. diff --git a/README.pl.md b/README.pl.md index e97ef12a5a..6b688b602d 100644 --- a/README.pl.md +++ b/README.pl.md @@ -60,22 +60,22 @@ docker run -d -p 3000:8080 --add-host=host.docker.internal:host-gateway -v open- Następnie otwórz [http://localhost:3000](http://localhost:3000). -| Tag obrazu | Zawartość | -| --- | --- | -| `:main` | Standardowy obraz z zależnościami dla lokalnej AI | -| `:slim` | Lekki obraz korzystający z usług zewnętrznych do osadzeń, ekstrakcji dokumentów i obsługi głosu | -| `:cuda` | Open WebUI z akceleracją CUDA | -| `:ollama` | Open WebUI z dołączonym Ollama | -| `:dev` | Najnowsza kompilacja rozwojowa | +| Tag obrazu | Zawartość | +| ---------- | ----------------------------------------------------------------------------------------------- | +| `:main` | Standardowy obraz z zależnościami dla lokalnej AI | +| `:slim` | Lekki obraz korzystający z usług zewnętrznych do osadzeń, ekstrakcji dokumentów i obsługi głosu | +| `:cuda` | Open WebUI z akceleracją CUDA | +| `:ollama` | Open WebUI z dołączonym Ollama | +| `:dev` | Najnowsza kompilacja rozwojowa | W razie potrzeby dodaj te opcje do `docker run` przed nazwą obrazu: -| Opcja | Zastosowanie | -| --- | --- | -| `-e OLLAMA_BASE_URL=http://your-ollama-server:11434` | Połączenie z Ollama na innym serwerze | -| `-e OPENAI_API_KEY=your_secret_key` | Ustawienie klucza API OpenAI | -| `-e HF_HUB_OFFLINE=1` | Wyłączenie pobierania modeli Hugging Face do pracy offline | -| `--gpus all` | Włączenie dostępu do GPU Nvidia dla `:cuda` lub `:ollama`; wymaga Nvidia Container Toolkit | +| Opcja | Zastosowanie | +| ---------------------------------------------------- | ------------------------------------------------------------------------------------------ | +| `-e OLLAMA_BASE_URL=http://your-ollama-server:11434` | Połączenie z Ollama na innym serwerze | +| `-e OPENAI_API_KEY=your_secret_key` | Ustawienie klucza API OpenAI | +| `-e HF_HUB_OFFLINE=1` | Wyłączenie pobierania modeli Hugging Face do pracy offline | +| `--gpus all` | Włączenie dostępu do GPU Nvidia dla `:cuda` lub `:ollama`; wymaga Nvidia Container Toolkit | Instrukcje i opcje konfiguracji znajdziesz w [przewodniku instalacji przez Docker](https://docs.openwebui.com/getting-started/quick-start/). diff --git a/README.ru.md b/README.ru.md index 79d5f86932..c2b30fe1bc 100644 --- a/README.ru.md +++ b/README.ru.md @@ -60,22 +60,22 @@ docker run -d -p 3000:8080 --add-host=host.docker.internal:host-gateway -v open- Затем откройте [http://localhost:3000](http://localhost:3000). -| Тег образа | Содержимое | -| --- | --- | -| `:main` | Стандартный образ с зависимостями для локального ИИ | -| `:slim` | Облегчённый образ с внешними сервисами для эмбеддингов, извлечения данных из документов и обработки речи | -| `:cuda` | Open WebUI с ускорением CUDA | -| `:ollama` | Open WebUI со встроенным Ollama | -| `:dev` | Последняя сборка для разработки | +| Тег образа | Содержимое | +| ---------- | -------------------------------------------------------------------------------------------------------- | +| `:main` | Стандартный образ с зависимостями для локального ИИ | +| `:slim` | Облегчённый образ с внешними сервисами для эмбеддингов, извлечения данных из документов и обработки речи | +| `:cuda` | Open WebUI с ускорением CUDA | +| `:ollama` | Open WebUI со встроенным Ollama | +| `:dev` | Последняя сборка для разработки | При необходимости добавьте эти параметры в `docker run` перед именем образа: -| Параметр | Назначение | -| --- | --- | -| `-e OLLAMA_BASE_URL=http://your-ollama-server:11434` | Подключение к Ollama на другом сервере | -| `-e OPENAI_API_KEY=your_secret_key` | Установка ключа API OpenAI | -| `-e HF_HUB_OFFLINE=1` | Отключение загрузки моделей Hugging Face для работы офлайн | -| `--gpus all` | Доступ к GPU Nvidia для `:cuda` или `:ollama`; требуется Nvidia Container Toolkit | +| Параметр | Назначение | +| ---------------------------------------------------- | --------------------------------------------------------------------------------- | +| `-e OLLAMA_BASE_URL=http://your-ollama-server:11434` | Подключение к Ollama на другом сервере | +| `-e OPENAI_API_KEY=your_secret_key` | Установка ключа API OpenAI | +| `-e HF_HUB_OFFLINE=1` | Отключение загрузки моделей Hugging Face для работы офлайн | +| `--gpus all` | Доступ к GPU Nvidia для `:cuda` или `:ollama`; требуется Nvidia Container Toolkit | Инструкции и параметры настройки приведены в [руководстве по установке через Docker](https://docs.openwebui.com/getting-started/quick-start/). diff --git a/README.th.md b/README.th.md index aa69df7ec6..ce0546255c 100644 --- a/README.th.md +++ b/README.th.md @@ -60,22 +60,22 @@ docker run -d -p 3000:8080 --add-host=host.docker.internal:host-gateway -v open- จากนั้นเปิด [http://localhost:3000](http://localhost:3000) -| แท็กอิมเมจ | สิ่งที่มีให้ | -| --- | --- | -| `:main` | อิมเมจมาตรฐานพร้อมแพ็กเกจที่จำเป็นสำหรับ AI ภายในเครื่อง | -| `:slim` | อิมเมจขนาดเล็กที่ใช้บริการภายนอกสำหรับ embeddings การสกัดข้อมูลจากเอกสาร และเสียง | -| `:cuda` | Open WebUI พร้อมการเร่งความเร็วด้วย CUDA | -| `:ollama` | Open WebUI ที่รวม Ollama มาให้ | -| `:dev` | บิลด์สำหรับการพัฒนาล่าสุด | +| แท็กอิมเมจ | สิ่งที่มีให้ | +| ---------- | --------------------------------------------------------------------------------- | +| `:main` | อิมเมจมาตรฐานพร้อมแพ็กเกจที่จำเป็นสำหรับ AI ภายในเครื่อง | +| `:slim` | อิมเมจขนาดเล็กที่ใช้บริการภายนอกสำหรับ embeddings การสกัดข้อมูลจากเอกสาร และเสียง | +| `:cuda` | Open WebUI พร้อมการเร่งความเร็วด้วย CUDA | +| `:ollama` | Open WebUI ที่รวม Ollama มาให้ | +| `:dev` | บิลด์สำหรับการพัฒนาล่าสุด | เพิ่มตัวเลือกเหล่านี้ใน `docker run` ก่อนชื่ออิมเมจได้ตามต้องการ: -| ตัวเลือก | จุดประสงค์ | -| --- | --- | -| `-e OLLAMA_BASE_URL=http://your-ollama-server:11434` | เชื่อมต่อกับ Ollama บนเซิร์ฟเวอร์อื่น | -| `-e OPENAI_API_KEY=your_secret_key` | กำหนดคีย์ API ของ OpenAI | -| `-e HF_HUB_OFFLINE=1` | ปิดการดาวน์โหลดโมเดลจาก Hugging Face สำหรับการใช้งานออฟไลน์ | -| `--gpus all` | เปิดใช้ GPU Nvidia สำหรับ `:cuda` หรือ `:ollama` โดยต้องมี Nvidia Container Toolkit | +| ตัวเลือก | จุดประสงค์ | +| ---------------------------------------------------- | ----------------------------------------------------------------------------------- | +| `-e OLLAMA_BASE_URL=http://your-ollama-server:11434` | เชื่อมต่อกับ Ollama บนเซิร์ฟเวอร์อื่น | +| `-e OPENAI_API_KEY=your_secret_key` | กำหนดคีย์ API ของ OpenAI | +| `-e HF_HUB_OFFLINE=1` | ปิดการดาวน์โหลดโมเดลจาก Hugging Face สำหรับการใช้งานออฟไลน์ | +| `--gpus all` | เปิดใช้ GPU Nvidia สำหรับ `:cuda` หรือ `:ollama` โดยต้องมี Nvidia Container Toolkit | ดูขั้นตอนการติดตั้งและตัวเลือกการตั้งค่าใน[คู่มือการติดตั้งด้วย Docker](https://docs.openwebui.com/getting-started/quick-start/) diff --git a/README.tr.md b/README.tr.md index b6c166e389..2ca1c7fcce 100644 --- a/README.tr.md +++ b/README.tr.md @@ -60,22 +60,22 @@ docker run -d -p 3000:8080 --add-host=host.docker.internal:host-gateway -v open- Ardından [http://localhost:3000](http://localhost:3000) adresini açın. -| İmaj etiketi | İçerik | -| --- | --- | -| `:main` | Yerel yapay zekâ bağımlılıklarını içeren standart imaj | -| `:slim` | Gömme vektörleri, belge çıkarımı ve ses için harici hizmetler kullanan hafif imaj | -| `:cuda` | CUDA hızlandırmalı Open WebUI | -| `:ollama` | Ollama ile birlikte gelen Open WebUI | -| `:dev` | En son geliştirme derlemesi | +| İmaj etiketi | İçerik | +| ------------ | --------------------------------------------------------------------------------- | +| `:main` | Yerel yapay zekâ bağımlılıklarını içeren standart imaj | +| `:slim` | Gömme vektörleri, belge çıkarımı ve ses için harici hizmetler kullanan hafif imaj | +| `:cuda` | CUDA hızlandırmalı Open WebUI | +| `:ollama` | Ollama ile birlikte gelen Open WebUI | +| `:dev` | En son geliştirme derlemesi | Gerektiğinde bu seçenekleri `docker run` komutunda imaj adından önce ekleyin: -| Seçenek | Amaç | -| --- | --- | -| `-e OLLAMA_BASE_URL=http://your-ollama-server:11434` | Başka bir sunucudaki Ollama’ya bağlanma | -| `-e OPENAI_API_KEY=your_secret_key` | OpenAI API anahtarınızı ayarlama | -| `-e HF_HUB_OFFLINE=1` | Çevrimdışı kullanım için Hugging Face model indirmelerini devre dışı bırakma | -| `--gpus all` | `:cuda` veya `:ollama` için Nvidia GPU erişimini etkinleştirme; Nvidia Container Toolkit gerektirir | +| Seçenek | Amaç | +| ---------------------------------------------------- | --------------------------------------------------------------------------------------------------- | +| `-e OLLAMA_BASE_URL=http://your-ollama-server:11434` | Başka bir sunucudaki Ollama’ya bağlanma | +| `-e OPENAI_API_KEY=your_secret_key` | OpenAI API anahtarınızı ayarlama | +| `-e HF_HUB_OFFLINE=1` | Çevrimdışı kullanım için Hugging Face model indirmelerini devre dışı bırakma | +| `--gpus all` | `:cuda` veya `:ollama` için Nvidia GPU erişimini etkinleştirme; Nvidia Container Toolkit gerektirir | Kurulum adımları ve yapılandırma seçenekleri için [Docker kurulum kılavuzuna](https://docs.openwebui.com/getting-started/quick-start/) bakın. diff --git a/README.uk.md b/README.uk.md index 0df42addb3..436ab249d6 100644 --- a/README.uk.md +++ b/README.uk.md @@ -60,22 +60,22 @@ docker run -d -p 3000:8080 --add-host=host.docker.internal:host-gateway -v open- Потім відкрийте [http://localhost:3000](http://localhost:3000). -| Тег образу | Вміст | -| --- | --- | -| `:main` | Стандартний образ із залежностями для локального ШІ | -| `:slim` | Полегшений образ із зовнішніми сервісами для ембедингів, видобування даних із документів і обробки мовлення | -| `:cuda` | Open WebUI з прискоренням CUDA | -| `:ollama` | Open WebUI із вбудованим Ollama | -| `:dev` | Найновіша збірка для розробки | +| Тег образу | Вміст | +| ---------- | ----------------------------------------------------------------------------------------------------------- | +| `:main` | Стандартний образ із залежностями для локального ШІ | +| `:slim` | Полегшений образ із зовнішніми сервісами для ембедингів, видобування даних із документів і обробки мовлення | +| `:cuda` | Open WebUI з прискоренням CUDA | +| `:ollama` | Open WebUI із вбудованим Ollama | +| `:dev` | Найновіша збірка для розробки | За потреби додайте ці параметри до `docker run` перед назвою образу: -| Параметр | Призначення | -| --- | --- | -| `-e OLLAMA_BASE_URL=http://your-ollama-server:11434` | Підключення до Ollama на іншому сервері | -| `-e OPENAI_API_KEY=your_secret_key` | Встановлення ключа API OpenAI | -| `-e HF_HUB_OFFLINE=1` | Вимкнення завантаження моделей Hugging Face для роботи офлайн | -| `--gpus all` | Доступ до GPU Nvidia для `:cuda` або `:ollama`; потрібен Nvidia Container Toolkit | +| Параметр | Призначення | +| ---------------------------------------------------- | --------------------------------------------------------------------------------- | +| `-e OLLAMA_BASE_URL=http://your-ollama-server:11434` | Підключення до Ollama на іншому сервері | +| `-e OPENAI_API_KEY=your_secret_key` | Встановлення ключа API OpenAI | +| `-e HF_HUB_OFFLINE=1` | Вимкнення завантаження моделей Hugging Face для роботи офлайн | +| `--gpus all` | Доступ до GPU Nvidia для `:cuda` або `:ollama`; потрібен Nvidia Container Toolkit | Інструкції та параметри налаштування наведено в [посібнику зі встановлення через Docker](https://docs.openwebui.com/getting-started/quick-start/). diff --git a/README.vi.md b/README.vi.md index 727296c15f..7e892b48ea 100644 --- a/README.vi.md +++ b/README.vi.md @@ -60,22 +60,22 @@ docker run -d -p 3000:8080 --add-host=host.docker.internal:host-gateway -v open- Sau đó mở [http://localhost:3000](http://localhost:3000). -| Thẻ image | Nội dung | -| --- | --- | -| `:main` | Image tiêu chuẩn với các thư viện phụ thuộc cho AI cục bộ | -| `:slim` | Image gọn nhẹ dùng dịch vụ bên ngoài cho embedding, trích xuất tài liệu và giọng nói | -| `:cuda` | Open WebUI với tăng tốc CUDA | -| `:ollama` | Open WebUI tích hợp sẵn Ollama | -| `:dev` | Bản dựng phát triển mới nhất | +| Thẻ image | Nội dung | +| --------- | ------------------------------------------------------------------------------------ | +| `:main` | Image tiêu chuẩn với các thư viện phụ thuộc cho AI cục bộ | +| `:slim` | Image gọn nhẹ dùng dịch vụ bên ngoài cho embedding, trích xuất tài liệu và giọng nói | +| `:cuda` | Open WebUI với tăng tốc CUDA | +| `:ollama` | Open WebUI tích hợp sẵn Ollama | +| `:dev` | Bản dựng phát triển mới nhất | Thêm các tùy chọn sau vào `docker run` trước tên image khi cần: -| Tùy chọn | Mục đích | -| --- | --- | -| `-e OLLAMA_BASE_URL=http://your-ollama-server:11434` | Kết nối đến Ollama trên máy chủ khác | -| `-e OPENAI_API_KEY=your_secret_key` | Thiết lập khóa API OpenAI | -| `-e HF_HUB_OFFLINE=1` | Tắt tải mô hình Hugging Face để sử dụng ngoại tuyến | -| `--gpus all` | Bật quyền truy cập GPU Nvidia cho `:cuda` hoặc `:ollama`; yêu cầu Nvidia Container Toolkit | +| Tùy chọn | Mục đích | +| ---------------------------------------------------- | ------------------------------------------------------------------------------------------ | +| `-e OLLAMA_BASE_URL=http://your-ollama-server:11434` | Kết nối đến Ollama trên máy chủ khác | +| `-e OPENAI_API_KEY=your_secret_key` | Thiết lập khóa API OpenAI | +| `-e HF_HUB_OFFLINE=1` | Tắt tải mô hình Hugging Face để sử dụng ngoại tuyến | +| `--gpus all` | Bật quyền truy cập GPU Nvidia cho `:cuda` hoặc `:ollama`; yêu cầu Nvidia Container Toolkit | Xem [hướng dẫn cài đặt Docker](https://docs.openwebui.com/getting-started/quick-start/) để biết các bước thiết lập và tùy chọn cấu hình. diff --git a/README.zh.md b/README.zh.md index 6bae944544..2cc59493f5 100644 --- a/README.zh.md +++ b/README.zh.md @@ -60,22 +60,22 @@ docker run -d -p 3000:8080 --add-host=host.docker.internal:host-gateway -v open- 然后打开 [http://localhost:3000](http://localhost:3000)。 -| 镜像标签 | 内容 | -| --- | --- | -| `:main` | 包含本地 AI 依赖的标准镜像 | -| `:slim` | 轻量镜像,通过外部服务处理嵌入、文档提取和语音 | -| `:cuda` | 支持 CUDA 加速的 Open WebUI | -| `:ollama` | 内置 Ollama 的 Open WebUI | -| `:dev` | 最新开发版本 | +| 镜像标签 | 内容 | +| --------- | ---------------------------------------------- | +| `:main` | 包含本地 AI 依赖的标准镜像 | +| `:slim` | 轻量镜像,通过外部服务处理嵌入、文档提取和语音 | +| `:cuda` | 支持 CUDA 加速的 Open WebUI | +| `:ollama` | 内置 Ollama 的 Open WebUI | +| `:dev` | 最新开发版本 | 根据需要,在 `docker run` 的镜像名称前添加以下选项: -| 选项 | 用途 | -| --- | --- | -| `-e OLLAMA_BASE_URL=http://your-ollama-server:11434` | 连接另一台服务器上的 Ollama | -| `-e OPENAI_API_KEY=your_secret_key` | 设置 OpenAI API 密钥 | -| `-e HF_HUB_OFFLINE=1` | 禁用 Hugging Face 模型下载,以便离线使用 | -| `--gpus all` | 为 `:cuda` 或 `:ollama` 启用 Nvidia GPU 访问;需要 Nvidia Container Toolkit | +| 选项 | 用途 | +| ---------------------------------------------------- | --------------------------------------------------------------------------- | +| `-e OLLAMA_BASE_URL=http://your-ollama-server:11434` | 连接另一台服务器上的 Ollama | +| `-e OPENAI_API_KEY=your_secret_key` | 设置 OpenAI API 密钥 | +| `-e HF_HUB_OFFLINE=1` | 禁用 Hugging Face 模型下载,以便离线使用 | +| `--gpus all` | 为 `:cuda` 或 `:ollama` 启用 Nvidia GPU 访问;需要 Nvidia Container Toolkit | 安装步骤和配置选项请参阅 [Docker 安装指南](https://docs.openwebui.com/getting-started/quick-start/)。 diff --git a/README.zht.md b/README.zht.md index 7b4574c856..bc52cfbf10 100644 --- a/README.zht.md +++ b/README.zht.md @@ -60,22 +60,22 @@ docker run -d -p 3000:8080 --add-host=host.docker.internal:host-gateway -v open- 接著開啟 [http://localhost:3000](http://localhost:3000)。 -| 映像標籤 | 內容 | -| --- | --- | -| `:main` | 包含本機 AI 相依套件的標準映像 | -| `:slim` | 輕量映像,透過外部服務處理嵌入、文件擷取與語音 | -| `:cuda` | 支援 CUDA 加速的 Open WebUI | -| `:ollama` | 內建 Ollama 的 Open WebUI | -| `:dev` | 最新開發版本 | +| 映像標籤 | 內容 | +| --------- | ---------------------------------------------- | +| `:main` | 包含本機 AI 相依套件的標準映像 | +| `:slim` | 輕量映像,透過外部服務處理嵌入、文件擷取與語音 | +| `:cuda` | 支援 CUDA 加速的 Open WebUI | +| `:ollama` | 內建 Ollama 的 Open WebUI | +| `:dev` | 最新開發版本 | 視需要在 `docker run` 的映像名稱前加入以下選項: -| 選項 | 用途 | -| --- | --- | -| `-e OLLAMA_BASE_URL=http://your-ollama-server:11434` | 連接另一台伺服器上的 Ollama | -| `-e OPENAI_API_KEY=your_secret_key` | 設定 OpenAI API 金鑰 | -| `-e HF_HUB_OFFLINE=1` | 停用 Hugging Face 模型下載,以便離線使用 | -| `--gpus all` | 為 `:cuda` 或 `:ollama` 啟用 Nvidia GPU 存取;需要 Nvidia Container Toolkit | +| 選項 | 用途 | +| ---------------------------------------------------- | --------------------------------------------------------------------------- | +| `-e OLLAMA_BASE_URL=http://your-ollama-server:11434` | 連接另一台伺服器上的 Ollama | +| `-e OPENAI_API_KEY=your_secret_key` | 設定 OpenAI API 金鑰 | +| `-e HF_HUB_OFFLINE=1` | 停用 Hugging Face 模型下載,以便離線使用 | +| `--gpus all` | 為 `:cuda` 或 `:ollama` 啟用 Nvidia GPU 存取;需要 Nvidia Container Toolkit | 安裝步驟與設定選項請參閱 [Docker 安裝指南](https://docs.openwebui.com/getting-started/quick-start/)。 diff --git a/backend/open_webui/events.py b/backend/open_webui/events.py index 071f23dec2..24d4f18d97 100644 --- a/backend/open_webui/events.py +++ b/backend/open_webui/events.py @@ -1168,9 +1168,7 @@ class SocketSessionEventSink: await disconnect_user_sessions(str(subject['id'])) -async def dispatch_event_functions( - request: Request, event: Event, extra_function_ids: list[str] | None = None -) -> None: +async def dispatch_event_functions(request: Request, event: Event, extra_function_ids: list[str] | None = None) -> None: if not ENABLE_FUNCTIONS: return diff --git a/backend/open_webui/models/chat_messages.py b/backend/open_webui/models/chat_messages.py index 352e819930..b6cda700a7 100644 --- a/backend/open_webui/models/chat_messages.py +++ b/backend/open_webui/models/chat_messages.py @@ -356,9 +356,7 @@ class ChatMessageTable: message = await db.get(ChatMessage, id) return ChatMessageModel.model_validate(message) if message else None - async def get_chat_ids_with_pending_approval( - self, chat_ids: list[str], db: AsyncSession | None = None - ) -> set[str]: + async def get_chat_ids_with_pending_approval(self, chat_ids: list[str], db: AsyncSession | None = None) -> set[str]: if not chat_ids: return set() async with get_async_db_context(db) as db: diff --git a/backend/open_webui/routers/channels.py b/backend/open_webui/routers/channels.py index b323027d7b..37e11b9d1b 100644 --- a/backend/open_webui/routers/channels.py +++ b/backend/open_webui/routers/channels.py @@ -709,8 +709,6 @@ async def add_members_by_id( raise HTTPException(status_code=status.HTTP_400_BAD_REQUEST, detail=ERROR_MESSAGES.DEFAULT()) - - class RemoveMembersForm(BaseModel): user_ids: list[str] = [] diff --git a/backend/open_webui/routers/folders.py b/backend/open_webui/routers/folders.py index b852d86c95..011f064384 100644 --- a/backend/open_webui/routers/folders.py +++ b/backend/open_webui/routers/folders.py @@ -619,9 +619,7 @@ async def get_shared_folder_chats( user_ids.update(uid for ids in participant_ids.values() for uid in ids) users = await Users.get_users_by_user_ids(list(user_ids), db=db) if user_ids else [] names = {u.id: u.name for u in users} - pending_approval_ids = await ChatMessages.get_chat_ids_with_pending_approval( - [chat['id'] for chat in chats], db=db - ) + pending_approval_ids = await ChatMessages.get_chat_ids_with_pending_approval([chat['id'] for chat in chats], db=db) for chat in chats: uid = chat['user_id'] chat['owner_name'] = names.get(uid, 'Unknown') diff --git a/backend/open_webui/routers/terminals.py b/backend/open_webui/routers/terminals.py index 55149dd104..494bc7c284 100644 --- a/backend/open_webui/routers/terminals.py +++ b/backend/open_webui/routers/terminals.py @@ -55,9 +55,7 @@ STRIPPED_RESPONSE_HEADERS = frozenset( def _port_browser_html(body: bytes, prefix: str, port: int) -> bytes: """Keep port links inside the proxy and report navigation from sandboxed frames.""" - config = json.dumps({'prefix': prefix, 'origin': f'http://localhost:{port}'}).replace( - '<', '\\u003c' - ) + config = json.dumps({'prefix': prefix, 'origin': f'http://localhost:{port}'}).replace('<', '\\u003c') script = r""" (() => { const config = __CONFIG__; @@ -119,7 +117,7 @@ def _port_browser_html(body: bytes, prefix: str, port: int) -> bytes: bridge = '' head = re.search(r']*>', html, re.I) if head: - html = html[:head.end()] + bridge + html[head.end():] + html = html[: head.end()] + bridge + html[head.end() :] else: html = bridge + html return html.encode('utf-8') @@ -248,7 +246,6 @@ async def browser_ws(ws: WebSocket, server_id: str, sid: str, ticket: str, kind: ssl=AIOHTTP_CLIENT_SESSION_SSL, max_msg_size=16 * 1024 * 1024, ) as upstream: - tasks = [ asyncio.create_task(relay_from_browser(ws, upstream)), asyncio.create_task(relay_to_browser(ws, upstream)), @@ -380,7 +377,14 @@ async def proxy_terminal( # auth_type == "none": no Authorization header if browser_auth is not None: - for name in ('accept', 'origin', 'access-control-request-method', 'access-control-request-headers', 'last-event-id', 'range'): + for name in ( + 'accept', + 'origin', + 'access-control-request-method', + 'access-control-request-headers', + 'last-event-id', + 'range', + ): if value := request.headers.get(name): headers[name] = value @@ -418,22 +422,18 @@ async def proxy_terminal( port_match = re.match(r'^proxy/(\d+)/', safe_path) port_prefix = None if port_match: - port_prefix = request.url.path[ - :request.url.path.index('/proxy/') + len(port_match[0]) + 1 - ] + port_prefix = request.url.path[: request.url.path.index('/proxy/') + len(port_match[0]) + 1] location = upstream_response.headers.get('location') if location: remote_origin = f'http://localhost:{port_match[1]}' - destination = urlsplit( - urljoin(f'{remote_origin}/{safe_path[len(port_match[0]):]}', location) - ) + destination = urlsplit(urljoin(f'{remote_origin}/{safe_path[len(port_match[0]) :]}', location)) if destination.netloc == urlsplit(remote_origin).netloc: filtered_headers = { - key: value for key, value in filtered_headers.items() - if key.lower() != 'location' + key: value for key, value in filtered_headers.items() if key.lower() != 'location' } filtered_headers['Location'] = ( - port_prefix + destination.path.lstrip('/') + port_prefix + + destination.path.lstrip('/') + (f'?{destination.query}' if destination.query else '') + (f'#{destination.fragment}' if destination.fragment else '') ) @@ -454,10 +454,16 @@ async def proxy_terminal( # Buffer text/JSON responses response_body = await upstream_response.read() - if safe_path.startswith('browser/sessions') and upstream_response.status < 300 and request.method in ('GET', 'POST', 'PATCH'): + if ( + safe_path.startswith('browser/sessions') + and upstream_response.status < 300 + and request.method in ('GET', 'POST', 'PATCH') + ): browser_session = json.loads(response_body) if isinstance(browser_session, dict) and browser_session.get('id') and browser_session.get('token'): - browser_session['token'] = browser_ticket(server_id, user.id, session_id or '', browser_session, headers, cookies) + browser_session['token'] = browser_ticket( + server_id, user.id, session_id or '', browser_session, headers, cookies + ) response_body = json.dumps(browser_session).encode() if port_prefix and 'text/html' in upstream_content_type: response_body = _port_browser_html(response_body, port_prefix, int(port_match[1])) @@ -575,8 +581,8 @@ async def ws_processes(ws: WebSocket, server_id: str): @router.websocket('/{server_id}/execute/{process_id}/status') async def ws_process_output(ws: WebSocket, server_id: str, process_id: str): from urllib.parse import quote - await _proxy_terminal_websocket(ws, server_id, - stream_path=f'execute/{quote(process_id, safe="")}/status') + + await _proxy_terminal_websocket(ws, server_id, stream_path=f'execute/{quote(process_id, safe="")}/status') @router.websocket('/{server_id}/api/terminals/{session_id}') @@ -631,8 +637,7 @@ async def _proxy_terminal_websocket( # Encode session_id as an opaque path segment so it cannot smuggle '?'/'#'/'&' (at any # decode depth) and inject an attacker-chosen user_id ahead of the one appended below. upstream_path = ( - f'api/terminals/{urllib.parse.quote(session_id, safe="")}' - if session_id is not None else stream_path + f'api/terminals/{urllib.parse.quote(session_id, safe="")}' if session_id is not None else stream_path ) upstream_url = f'{ws_base}/{upstream_path}' if upstream_params: diff --git a/backend/open_webui/utils/inbox.py b/backend/open_webui/utils/inbox.py index da55d9755b..a15ed17169 100644 --- a/backend/open_webui/utils/inbox.py +++ b/backend/open_webui/utils/inbox.py @@ -271,11 +271,7 @@ async def hydrate(rows, db): for row in rows: resource = objects.get(row.resource_type, {}).get(row.resource_id) obj = objects.get(row.object_type, {}).get(row.object_id) - title = ( - getattr(resource, 'title', None) - or getattr(resource, 'name', None) - or '' - ) + title = getattr(resource, 'title', None) or getattr(resource, 'name', None) or '' preview = ( replace_mentions(getattr(obj, 'content', '') or '')[:300] if row.object_type in {'comment', 'message'} diff --git a/src/lib/components/OnBoarding.svelte b/src/lib/components/OnBoarding.svelte index 3225b3bc61..8652d7207e 100644 --- a/src/lib/components/OnBoarding.svelte +++ b/src/lib/components/OnBoarding.svelte @@ -79,7 +79,9 @@ Open WebUI -

+

{$i18n.t('Welcome to your AI home.')}

diff --git a/src/lib/components/admin/Settings/Models.svelte b/src/lib/components/admin/Settings/Models.svelte index 94db5e4dc7..34a463f352 100644 --- a/src/lib/components/admin/Settings/Models.svelte +++ b/src/lib/components/admin/Settings/Models.svelte @@ -1244,7 +1244,8 @@ - (comments = request)} + (comments = request)} user={$user} {model} deleteLabel={canResetModel(model) ? $i18n.t('Reset') : $i18n.t('Delete')} diff --git a/src/lib/components/channel/Thread.svelte b/src/lib/components/channel/Thread.svelte index 87f0638ad0..166b95c97b 100644 --- a/src/lib/components/channel/Thread.svelte +++ b/src/lib/components/channel/Thread.svelte @@ -225,9 +225,7 @@ {#if channel}
-
+
{$i18n.t('Thread')}
diff --git a/src/lib/components/chat/Chat.svelte b/src/lib/components/chat/Chat.svelte index 85f84055e7..4c3399cab7 100644 --- a/src/lib/components/chat/Chat.svelte +++ b/src/lib/components/chat/Chat.svelte @@ -287,7 +287,11 @@ return Number.isFinite(threshold) && threshold > 0 ? threshold : null; }; - const getContextUsage = (chatHistory: typeof history, system: string, threshold: number | null) => { + const getContextUsage = ( + chatHistory: typeof history, + system: string, + threshold: number | null + ) => { if (!chatHistory?.currentId) { return null; } diff --git a/src/lib/components/chat/ChatTabs/GitBar.svelte b/src/lib/components/chat/ChatTabs/GitBar.svelte index d9312b7769..e2324bb2ba 100644 --- a/src/lib/components/chat/ChatTabs/GitBar.svelte +++ b/src/lib/components/chat/ChatTabs/GitBar.svelte @@ -621,7 +621,10 @@ on:click={toggle}>
- {#if error}{/if}
- {#if error}{/if} + {#if error}{/if} {#if creating || editing}
- {#if error}{/if} + {#if error}{/if} {#if sideChatAllowed} {/each}{/if}
- {#if error}{/if} + {#if error}{/if}
{fullPath}
{:else if error} - + diff --git a/src/lib/components/chat/MessageInput/VoiceRecording.svelte b/src/lib/components/chat/MessageInput/VoiceRecording.svelte index f99eee66fe..5dafdeb191 100644 --- a/src/lib/components/chat/MessageInput/VoiceRecording.svelte +++ b/src/lib/components/chat/MessageInput/VoiceRecording.svelte @@ -162,7 +162,6 @@ // if (domainData.some((value) => value > 0)) { // lastSoundTime = Date.now(); // } - } window.requestAnimationFrame(processFrame); diff --git a/src/lib/components/chat/Messages/ResponseMessage/WebSearchResults.svelte b/src/lib/components/chat/Messages/ResponseMessage/WebSearchResults.svelte index a5c4e5a79f..012262e58f 100644 --- a/src/lib/components/chat/Messages/ResponseMessage/WebSearchResults.svelte +++ b/src/lib/components/chat/Messages/ResponseMessage/WebSearchResults.svelte @@ -45,7 +45,6 @@
- - - - import { - commentSurface, - contentHash - } from '$lib/components/comments/anchors'; + import { commentSurface, contentHash } from '$lib/components/comments/anchors'; import { getContext } from 'svelte'; import Collapsible from '$lib/components/common/Collapsible.svelte'; import Image from '$lib/components/common/Image.svelte'; @@ -85,7 +82,8 @@
- import { - commentSurface, - contentHash - } from '$lib/components/comments/anchors'; + import { commentSurface, contentHash } from '$lib/components/comments/anchors'; import EditPencilIcon from '$lib/components/layout/Sidebar/icons/EditPencil.svelte'; import CopyIcon from '$lib/components/layout/Sidebar/icons/Copy.svelte'; import TrashIcon from '$lib/components/layout/Sidebar/icons/Trash.svelte'; @@ -443,7 +440,8 @@
{#each filteredItems.slice(visibleStart, visibleEnd) as item, i (item.value)} {@const index = visibleStart + i} - (comments = request)} + (comments = request)} bind:selectedModelIdx {item} {index} diff --git a/src/lib/components/chat/Settings/Audio.svelte b/src/lib/components/chat/Settings/Audio.svelte index d95c1756ea..059eeefbde 100644 --- a/src/lib/components/chat/Settings/Audio.svelte +++ b/src/lib/components/chat/Settings/Audio.svelte @@ -145,7 +145,6 @@ await getVoices(); - // const blobUrl = URL.createObjectURL(await rawAudio.toBlob()); // const audio = new Audio(blobUrl); diff --git a/src/lib/components/comments/CommentComposer.svelte b/src/lib/components/comments/CommentComposer.svelte index 6115345629..6f04745aab 100644 --- a/src/lib/components/comments/CommentComposer.svelte +++ b/src/lib/components/comments/CommentComposer.svelte @@ -171,7 +171,9 @@ />
- {#if error}{/if} + {#if error}{/if}
-
- {/if} -
- -
{ - if (e.deltaY !== 0) { - e.preventDefault(); - e.currentTarget.scrollLeft += e.deltaY; - } + + { + closeCreateModal(); }} - > -
- { - localStorage.workspaceViewOption = value; + /> + - await tick(); - }} - /> - - { - localStorage.workspaceKnowledgeSourceOption = sourceOption; - await tick(); - }} - /> -
-
-
- - {#if items !== null && total !== null} - {#if (items ?? []).length !== 0} -
-
- - -
{$i18n.t('Owner')}
- - - {$i18n.t('Actions')} +
+
+
+
+
- -
+ + {#if items !== null && total !== null} + {#if (items ?? []).length !== 0} +
+
+ + +
{$i18n.t('Owner')}
+ + + {$i18n.t('Actions')} +
+ +
+ {#each items as item} + {@const metaPreview = getKnowledgeMetaPreview(item)} + -
- - - - - {capitalizeFirstLetter( - item?.user?.name ?? item?.user?.email ?? $i18n.t('Deleted User') - )} +
+ + + + + {capitalizeFirstLetter( + item?.user?.name ?? item?.user?.email ?? $i18n.t('Deleted User') + )} + - - -
- -
- {dayjs(item.updated_at * 1000) - .locale($i18n.language) - .fromNow()} +
-
-
- (comments = request)} - modal - className="flex size-6 shrink-0 items-center justify-center rounded-lg text-gray-400 transition dark:text-gray-500" - resource={{ resource_type: 'knowledge', resource_id: item.id }} - /> - {#if item?.write_access || $user?.role === 'admin'} -
- (comments = request)} - resourceId={item.id} - accessHandler={$user?.permissions?.sharing?.knowledge || - $user?.role === 'admin' - ? () => accessModal.open(item.id) - : null} - onExport={$user?.role === 'admin' - ? () => { - exportHandler(item); - } - : null} - on:delete={() => { - selectedItem = item; - showDeleteConfirm = true; - }} - /> + +
+ {dayjs(item.updated_at * 1000) + .locale($i18n.language) + .fromNow()}
- {/if} +
+
+ (comments = request)} + modal + className="flex size-6 shrink-0 items-center justify-center rounded-lg text-gray-400 transition dark:text-gray-500" + resource={{ resource_type: 'knowledge', resource_id: item.id }} + /> + {#if item?.write_access || $user?.role === 'admin'} +
+ (comments = request)} + resourceId={item.id} + accessHandler={$user?.permissions?.sharing?.knowledge || + $user?.role === 'admin' + ? () => accessModal.open(item.id) + : null} + onExport={$user?.role === 'admin' + ? () => { + exportHandler(item); + } + : null} + on:delete={() => { + selectedItem = item; + showDeleteConfirm = true; + }} + /> +
+ {/if} +
-
- {/each} -
-
- - {#if !allItemsLoaded} - { - if (!itemsLoading) { - loadMoreItems(); - } - }} - > -
- -
{$i18n.t('Loading...')}
+ {/each}
-
+
+ + {#if !allItemsLoaded} + { + if (!itemsLoading) { + loadMoreItems(); + } + }} + > +
+ +
{$i18n.t('Loading...')}
+
+
+ {/if} + {:else} +
+
+
+ {hasFilters ? $i18n.t('No knowledge found') : $i18n.t('No knowledge yet')} +
+
+ {hasFilters + ? $i18n.t('Try adjusting your search or filter to find what you are looking for.') + : $i18n.t('Items you create or that are shared with you will appear here.')} +
+
+
{/if} {:else} -
-
-
- {hasFilters ? $i18n.t('No knowledge found') : $i18n.t('No knowledge yet')} -
-
- {hasFilters - ? $i18n.t('Try adjusting your search or filter to find what you are looking for.') - : $i18n.t('Items you create or that are shared with you will appear here.')} -
-
+
+
{/if} - {:else} -
- -
- {/if} -
-{:else} -
- -
-{/if} +
+ {:else} +
+ +
+ {/if} diff --git a/src/lib/components/workspace/Knowledge/ItemMenu.svelte b/src/lib/components/workspace/Knowledge/ItemMenu.svelte index f232836487..8672c8d232 100644 --- a/src/lib/components/workspace/Knowledge/ItemMenu.svelte +++ b/src/lib/components/workspace/Knowledge/ItemMenu.svelte @@ -56,7 +56,8 @@
- -
- {#if id && knowledge} - { - try { - const saved = await updateKnowledgeAccessGrants( - localStorage.token, - id, - knowledge.access_grants ?? [] - ); - savedAccessGrants = structuredClone(saved.access_grants); - toast.success($i18n.t('Saved')); - } catch (error) { - knowledge.access_grants = structuredClone(savedAccessGrants); - toast.error(`${error}`); - } - }} - accessRoles={['read', 'write']} - /> -
- - -
- {#if !isExternalKnowledge && knowledge?.id} (comments = request)} wrapperClassName="me-1" - resource={{ resource_type: 'knowledge', resource_id: knowledge.id }} - />{/if} - {#if !isExternalKnowledge && (knowledge.user_id === $user?.id || $user?.role === 'admin')} - - -
- - - -
-
- {/if} - {#if knowledge.write_access} - {#if $user?.permissions?.sharing?.knowledge || $user?.role === 'admin'} - { - savedAccessGrants = structuredClone(knowledge.access_grants ?? []); - showAccessControlModal = true; - }} - /> - {/if} - {:else} - {$i18n.t('Read Only')} - {/if} -
-
-
- + {#if id && knowledge} + { + try { + const saved = await updateKnowledgeAccessGrants( + localStorage.token, + id, + knowledge.access_grants ?? [] + ); + savedAccessGrants = structuredClone(saved.access_grants); + toast.success($i18n.t('Saved')); + } catch (error) { + knowledge.access_grants = structuredClone(savedAccessGrants); + toast.error(`${error}`); + } + }} + accessRoles={['read', 'write']} /> -
+
+ + +
+ {#if !isExternalKnowledge && knowledge?.id} (comments = request)} + wrapperClassName="me-1" + resource={{ resource_type: 'knowledge', resource_id: knowledge.id }} + />{/if} + {#if !isExternalKnowledge && (knowledge.user_id === $user?.id || $user?.role === 'admin')} + + +
+ + + +
+
+ {/if} + {#if knowledge.write_access} + {#if $user?.permissions?.sharing?.knowledge || $user?.role === 'admin'} + { + savedAccessGrants = structuredClone(knowledge.access_grants ?? []); + showAccessControlModal = true; + }} + /> + {/if} + {:else} + {$i18n.t('Read Only')} + {/if} +
+
+
- +
+ + +
-
-
- {#if isExternalKnowledge}
-
-
-
- {$i18n.t('Connected')} -
-
- {$i18n.t('Read Only')} -
-
- {knowledge?.meta?.external?.provider ?? $i18n.t('Provider')} -
-
- {$i18n.t('Service Account')} -
-
- -
-
-
{$i18n.t('Mapped Source')}
-
- {knowledge?.meta?.external?.source?.name ?? $i18n.t('Not configured')} +
+ {#if isExternalKnowledge}
+
+
+
+ {$i18n.t('Connected')} +
+
+ {$i18n.t('Read Only')} +
+
+ {knowledge?.meta?.external?.provider ?? $i18n.t('Provider')} +
+
+ {$i18n.t('Service Account')}
-
-
{$i18n.t('Auth Mode')}
-
- {$i18n.t('Admin-managed service account')} + +
+
+
{$i18n.t('Mapped Source')}
+
+ {knowledge?.meta?.external?.source?.name ?? $i18n.t('Not configured')} +
+
+
+
{$i18n.t('Auth Mode')}
+
+ {$i18n.t('Admin-managed service account')} +
-
-
- - {$i18n.t( - 'This knowledge base retrieves from a connected source. Open WebUI can query it, but cannot upload, sync, edit, delete, reset, or reindex its source data.' - )} -
- -
-
{$i18n.t('Test Query')}
-
- - + {$i18n.t( + 'This knowledge base retrieves from a connected source. Open WebUI can query it, but cannot upload, sync, edit, delete, reset, or reindex its source data.' + )}
-
- {#if externalTestResult} -
-
{$i18n.t('Preview')}
- {#each externalTestResult.documents ?? [] as document, idx} -
-
{document}
-
- {externalTestResult.metadatas?.[idx]?.source ?? ''} +
+
{$i18n.t('Test Query')}
+
+ + +
+
+ + {#if externalTestResult} +
+
{$i18n.t('Preview')}
+ {#each externalTestResult.documents ?? [] as document, idx} +
+
{document}
+
+ {externalTestResult.metadatas?.[idx]?.source ?? ''} +
-
- {/each} -
- {/if} -
-
{:else} - { - pendingSyncFiles = await collectDirectoryFiles(); - if (pendingSyncFiles?.length) showSyncConfirmModal = true; - }} - onReset={() => (showResetConfirm = true)} - /> - {/if} -
- {:else}{/if} -
+ {/each} +
+ {/if} +
+
{:else} + { + pendingSyncFiles = await collectDirectoryFiles(); + if (pendingSyncFiles?.length) showSyncConfirmModal = true; + }} + onReset={() => (showResetConfirm = true)} + /> + {/if} +
+ {:else}{/if} +
diff --git a/src/lib/components/workspace/Models.svelte b/src/lib/components/workspace/Models.svelte index 3f8dcdae19..465821ac56 100644 --- a/src/lib/components/workspace/Models.svelte +++ b/src/lib/components/workspace/Models.svelte @@ -530,525 +530,523 @@

{$i18n.t('Models')}

-{#if loaded} - { - deleteModelHandler(selectedModel); - }} - /> + {#if loaded} + { + deleteModelHandler(selectedModel); + }} + /> - { - console.log(importFiles); + { + console.log(importFiles); - let reader = new FileReader(); - reader.onload = async (event) => { - let savedModels = []; - try { - savedModels = JSON.parse(event.target.result); - console.log(savedModels); - } catch (e) { - toast.error($i18n.t('Invalid JSON file')); - return; - } + let reader = new FileReader(); + reader.onload = async (event) => { + let savedModels = []; + try { + savedModels = JSON.parse(event.target.result); + console.log(savedModels); + } catch (e) { + toast.error($i18n.t('Invalid JSON file')); + return; + } - if (!Array.isArray(savedModels)) { - toast.error($i18n.t('Invalid JSON file')); - return; - } - try { - await importModels( - localStorage.token, - savedModels.map((model) => model.info ?? model) + if (!Array.isArray(savedModels)) { + toast.error($i18n.t('Invalid JSON file')); + return; + } + try { + await importModels( + localStorage.token, + savedModels.map((model) => model.info ?? model) + ); + } catch (error: any) { + toast.error(`${error?.detail ?? error}`); + return; + } + + await _models.set( + await getModels( + localStorage.token, + $config?.features?.enable_direct_connections && ($settings?.directConnections ?? null) + ) ); - } catch (error: any) { - toast.error(`${error?.detail ?? error}`); - return; - } - await _models.set( - await getModels( - localStorage.token, - $config?.features?.enable_direct_connections && ($settings?.directConnections ?? null) - ) - ); + page = 1; + getModelList(); + }; - page = 1; - getModelList(); - }; + reader.readAsText(importFiles[0]); + }} + /> - reader.readAsText(importFiles[0]); - }} - /> - -
-
-
-
- -
- { - searchController?.abort(); - clearTimeout(searchDebounceTimer); - searchDebounceTimer = setTimeout(() => { - page = 1; - getModelList(); - }, 300); - }} - /> - - {#if query} -
- -
- {/if} -
- -
{ - if (e.deltaY !== 0) { - e.preventDefault(); - e.currentTarget.scrollLeft += e.deltaY; - } - }} - > -
- { - localStorage.workspaceViewOption = value; - page = 1; - await tick(); + }, 300); }} /> - {#if (tags ?? []).length > 0} - + +
+ {/if} +
+ +
{ + if (e.deltaY !== 0) { + e.preventDefault(); + e.currentTarget.scrollLeft += e.deltaY; + } + }} + > +
+ { - return { value: tag, label: tag }; - })} - onChange={async () => { + onChange={async (value) => { + localStorage.workspaceViewOption = value; page = 1; await tick(); }} /> - {/if} + + {#if (tags ?? []).length > 0} + { + return { value: tag, label: tag }; + })} + onChange={async () => { + page = 1; + await tick(); + }} + /> + {/if} +
+ + + + + + +
+ + + + + +
+ + + + +
+
+
- - - - - - -
- - - - - -
- - - - -
-
-
-
- {#if models !== null} - {#if (models ?? []).length !== 0} - -
-
- - -
{$i18n.t('Owner')}
- - - {$i18n.t('Actions')} -
- -
- {#each models as model (model.id)} - {@const localizedModelName = resolveLocalizedModelName(model, $i18n.language)} - + + + {$i18n.t('Actions')} +
+ +
+ {#each models as model (model.id)} + {@const localizedModelName = resolveLocalizedModelName(model, $i18n.language)} + - -
- - - - - {capitalizeFirstLetter( - model?.user?.name ?? model?.user?.email ?? $i18n.t('Deleted User') - )} - - - -
- - {dayjs(model.updated_at * 1000) - .locale($i18n.language) - .fromNow()} - -
-
- {#if shiftKey && model.write_access} - - - - - - - - {:else} -
- (comments = request)} - modal - className="flex size-6 shrink-0 items-center justify-center rounded-lg text-gray-400 transition dark:text-gray-500" - resource={{ resource_type: 'model', resource_id: model.id }} - /> - (comments = request)} - accessHandler={$user?.permissions?.sharing?.models || - $user?.role === 'admin' - ? () => accessModal.open(model.id) - : null} - user={$user} - {model} - writeAccess={model.write_access} - editHandler={() => { - goto(`/workspace/models/edit?id=${encodeURIComponent(model.id)}`); - }} - shareHandler={() => { - shareModelHandler(model); - }} - cloneHandler={() => { - cloneModelHandler(model); - }} - exportHandler={() => { - exportModelHandler(model); - }} - hideHandler={() => { - hideModelHandler(model); - }} - pinModelHandler={() => { - pinModelHandler(model.id); - }} - copyLinkHandler={() => { - copyLinkHandler(model); - }} - deleteHandler={() => { - confirmDeleteModel(model); - }} - onClose={() => {}} - > -
- -
-
- - {#if model.write_access} - - toggleModelHandler(model)} - /> - - {:else} - - {/if} -
- {/if} -
-
-
- {/each} + {/each} +
-
- {#if total > 30} - + {#if total > 30} + + {/if} + {:else} +
+
+
+ {hasFilters ? $i18n.t('No models found') : $i18n.t('No models yet')} +
+
+ {hasFilters + ? $i18n.t('Try adjusting your search or filter to find what you are looking for.') + : $i18n.t('Items you create or that are shared with you will appear here.')} +
+
+
{/if} {:else} -
-
-
- {hasFilters ? $i18n.t('No models found') : $i18n.t('No models yet')} -
-
- {hasFilters - ? $i18n.t('Try adjusting your search or filter to find what you are looking for.') - : $i18n.t('Items you create or that are shared with you will appear here.')} -
-
+
+
{/if} - {:else} -
- -
- {/if} -
+
- {#if $config?.features.enable_community_sharing} - + {#if $config?.features.enable_community_sharing} + + {/if} + {:else} +
+ +
{/if} -{:else} -
- -
-{/if} diff --git a/src/lib/components/workspace/Models/ModelEditor.svelte b/src/lib/components/workspace/Models/ModelEditor.svelte index 2909c3eb06..38d7ea69f2 100644 --- a/src/lib/components/workspace/Models/ModelEditor.svelte +++ b/src/lib/components/workspace/Models/ModelEditor.svelte @@ -802,1098 +802,1124 @@ -{#if loaded} - - { - const selected = backgroundInput.files?.[0]; - backgroundInput.value = ''; - if (!selected || readOnly || loading) return; - loading = true; - const candidate = URL.createObjectURL(selected); - try { - if (!['image/png', 'image/jpeg', 'image/webp', 'image/gif'].includes(selected.type)) { - throw new Error($i18n.t('Background image must be PNG, JPEG, WebP, or GIF.')); - } - if (selected.size > 5 * 1024 * 1024) - throw new Error($i18n.t('Background image must be at most 5 MiB.')); - const image = new Image(); - image.src = candidate; - await image.decode(); - if (image.naturalWidth * image.naturalHeight > 25_000_000) { - throw new Error($i18n.t('Background image must be at most 25 megapixels.')); - } - clearBackgroundPreview(); - backgroundPreview = candidate; - backgroundFile = selected; - } catch (error) { - URL.revokeObjectURL(candidate); - toast.error(error instanceof Error ? error.message : $i18n.t('Invalid background image.')); - } finally { - loading = false; - } - }} - /> - { - allowNavigation = true; - afterDiscard?.(); - }} - /> - { - if (edit && model?.id) { + {#if loaded} + + { + const selected = backgroundInput.files?.[0]; + backgroundInput.value = ''; + if (!selected || readOnly || loading) return; loading = true; + const candidate = URL.createObjectURL(selected); try { - const saved = await updateModelAccessGrants( - localStorage.token, - model.id, - model.name, - grants - ); - model.access_grants = structuredClone(saved.access_grants); - accessGrants = structuredClone(saved.access_grants); - onAccessUpdate(saved); - toast.success($i18n.t('Saved')); + if (!['image/png', 'image/jpeg', 'image/webp', 'image/gif'].includes(selected.type)) { + throw new Error($i18n.t('Background image must be PNG, JPEG, WebP, or GIF.')); + } + if (selected.size > 5 * 1024 * 1024) + throw new Error($i18n.t('Background image must be at most 5 MiB.')); + const image = new Image(); + image.src = candidate; + await image.decode(); + if (image.naturalWidth * image.naturalHeight > 25_000_000) { + throw new Error($i18n.t('Background image must be at most 25 megapixels.')); + } + clearBackgroundPreview(); + backgroundPreview = candidate; + backgroundFile = selected; } catch (error) { - accessGrants = structuredClone(model.access_grants ?? []); - toast.error(`${error?.detail ?? error}`); + URL.revokeObjectURL(candidate); + toast.error( + error instanceof Error ? error.message : $i18n.t('Invalid background image.') + ); } finally { loading = false; } - } - }} - /> + }} + /> + { + allowNavigation = true; + afterDiscard?.(); + }} + /> + { + if (edit && model?.id) { + loading = true; + try { + const saved = await updateModelAccessGrants( + localStorage.token, + model.id, + model.name, + grants + ); + model.access_grants = structuredClone(saved.access_grants); + accessGrants = structuredClone(saved.access_grants); + onAccessUpdate(saved); + toast.success($i18n.t('Saved')); + } catch (error) { + accessGrants = structuredClone(model.access_grants ?? []); + toast.error(`${error?.detail ?? error}`); + } finally { + loading = false; + } + } + }} + /> -
-
- {#if onBack} - - {/if} - - {#if edit && model?.version_id && !readOnly} - - {/if} -
- {#if edit && model?.id} (comments = request)} wrapperClassName="me-2" - resource={{ resource_type: 'model', resource_id: model.id }} - />{/if} - {#if !historical && !readOnly} - +
+
+ {#if onBack} + {/if} - {#if !historical && !readOnly && ($user?.permissions?.sharing?.models || $user?.role === 'admin')} - (showAccessControlModal = true)} /> - {/if} -
-
- - {#if selectingVersion} -
- {:else if selectedVersion} -
- {#key selectedVersion.id} - - {/key} -
-
- + {/if} +
+ {#if edit && model?.id} (comments = request)} + wrapperClassName="me-2" + resource={{ resource_type: 'model', resource_id: model.id }} + />{/if} + {#if !historical && !readOnly} + + {/if} + + {#if !historical && !readOnly && ($user?.permissions?.sharing?.models || $user?.role === 'admin')} + (showAccessControlModal = true)} /> + {/if} +
- {/if} -
- { - let reader = new FileReader(); - reader.onload = (event) => { - let originalImageUrl = `${event.target?.result}`; - // For animated formats (gif, webp), skip resizing to preserve animation - const fileType = (inputFiles[0] as any)?.['type']; - if (fileType === 'image/gif' || fileType === 'image/webp') { - info.meta.profile_image_url = originalImageUrl; - inputFiles = null; - filesInputElement.value = ''; - return; - } + {#if selectingVersion} +
+ {:else if selectedVersion} +
+ {#key selectedVersion.id} + + {/key} +
+
+ +
+ {/if} +
+ { + let reader = new FileReader(); + reader.onload = (event) => { + let originalImageUrl = `${event.target?.result}`; - const img = new Image(); - img.src = originalImageUrl; - - img.onload = function () { - const canvas = document.createElement('canvas'); - const ctx = canvas.getContext('2d'); - - // Calculate the aspect ratio of the image - const aspectRatio = img.width / img.height; - - // Calculate the new width and height to fit within 100x100 - let newWidth, newHeight; - if (aspectRatio > 1) { - newWidth = 250 * aspectRatio; - newHeight = 250; - } else { - newWidth = 250; - newHeight = 250 / aspectRatio; + // For animated formats (gif, webp), skip resizing to preserve animation + const fileType = (inputFiles[0] as any)?.['type']; + if (fileType === 'image/gif' || fileType === 'image/webp') { + info.meta.profile_image_url = originalImageUrl; + inputFiles = null; + filesInputElement.value = ''; + return; } - // Set the canvas size - canvas.width = 250; - canvas.height = 250; + const img = new Image(); + img.src = originalImageUrl; - // Calculate the position to center the image - const offsetX = (250 - newWidth) / 2; - const offsetY = (250 - newHeight) / 2; + img.onload = function () { + const canvas = document.createElement('canvas'); + const ctx = canvas.getContext('2d'); - // Draw the image on the canvas - ctx.drawImage(img, offsetX, offsetY, newWidth, newHeight); + // Calculate the aspect ratio of the image + const aspectRatio = img.width / img.height; - // Get the base64 representation of the compressed image - const compressedSrc = canvas.toDataURL('image/webp', 0.8); + // Calculate the new width and height to fit within 100x100 + let newWidth, newHeight; + if (aspectRatio > 1) { + newWidth = 250 * aspectRatio; + newHeight = 250; + } else { + newWidth = 250; + newHeight = 250 / aspectRatio; + } - // Display the compressed image - info.meta.profile_image_url = compressedSrc; + // Set the canvas size + canvas.width = 250; + canvas.height = 250; - inputFiles = null; - filesInputElement.value = ''; + // Calculate the position to center the image + const offsetX = (250 - newWidth) / 2; + const offsetY = (250 - newHeight) / 2; + + // Draw the image on the canvas + ctx.drawImage(img, offsetX, offsetY, newWidth, newHeight); + + // Get the base64 representation of the compressed image + const compressedSrc = canvas.toDataURL('image/webp', 0.8); + + // Display the compressed image + info.meta.profile_image_url = compressedSrc; + + inputFiles = null; + filesInputElement.value = ''; + }; }; - }; - if ( - inputFiles && - inputFiles.length > 0 && - ['image/gif', 'image/webp', 'image/jpeg', 'image/png', 'image/svg+xml'].includes( - (inputFiles[0] as any)?.['type'] - ) - ) { - reader.readAsDataURL(inputFiles[0]); - } else { - console.log(`Unsupported File Type '${(inputFiles[0] as any)?.['type']}'.`); - inputFiles = null; - } - }} - /> - - {#if !edit || (edit && model)} - - { - submitHandler(); + if ( + inputFiles && + inputFiles.length > 0 && + ['image/gif', 'image/webp', 'image/jpeg', 'image/png', 'image/svg+xml'].includes( + (inputFiles[0] as any)?.['type'] + ) + ) { + reader.readAsDataURL(inputFiles[0]); + } else { + console.log(`Unsupported File Type '${(inputFiles[0] as any)?.['type']}'.`); + inputFiles = null; + } }} - > -
-
-
-
- {#if backgroundPreview || info.meta.background_image_url} - {$i18n.t('Background - {:else} - - {/if} -
+ /> -
+ {#if !edit || (edit && model)} + + { + submitHandler(); + }} + > +
+
+
- -
- - - {#if info.meta.profile_image_url && info.meta.profile_image_url !== `${WEBUI_BASE_URL}/static/favicon.png`} - - {/if} -
- -
-
- {#if editingLocale} - - setLocalizedField( - 'name', - (e.currentTarget as HTMLInputElement).value - )} - /> - {:else} - - {/if} - {#if !readOnly}
+ + + {#if info.meta.profile_image_url && info.meta.profile_image_url !== `${WEBUI_BASE_URL}/static/favicon.png`} + - {#if loading}{/if} - - {#if backgroundPreview || info.meta.background_image_url} - - - {:else} - - {/if} -
{/if}
- {#if editingLocale} -
-
- - {#if localizedField('name')} - - {/if} -
+
+
+ {#if editingLocale} + + setLocalizedField( + 'name', + (e.currentTarget as HTMLInputElement).value + )} + /> + {:else} + + {/if} + {#if !readOnly} +
+ {#if loading}{/if} + + {#if backgroundPreview || info.meta.background_image_url} + + + {:else} + + {/if} +
+ {/if}
- {/if} - + {#if editingLocale} +
+
+ + {#if localizedField('name')} + + {/if} +
+
+ {/if} + + +
-
-
-
-
- {#if editingLocale} -
- {$i18n.t('Description ({{language}})', { - language: editingLocaleLabel || editingLocale - })} -
-
- - {#if localizedField('description')} -
+
+ - {/if} -
- {:else} - - + + {/if} +
+ + {#if editingLocale} + - {/if} -
+ {$i18n.t('Back')} + + {/if} +
+ {#if edit && prompt?.id} (comments = request)} + wrapperClassName="me-2" + resource={{ resource_type: 'prompt', resource_id: prompt.id }} + />{/if} - {#if historical} -
- {selectedHistoryEntry.id.slice(0, 7)} · {renderDate( - selectedHistoryEntry.created_at - )} - {#if !editingHistory}
- - {#if !disabled} + aria-label={$i18n.t('Close')} + class="p-1 text-gray-500 hover:text-gray-900 dark:hover:text-gray-100" + on:click={() => confirmDiscard(() => onCancel())}>{/if} +
+
+ +
+ +
+ +
+ / + { + hasManualEdit = true; + debouncedSaveMetadata(); + }} + required + {disabled} + /> +
+
+ {#if edit} + { + if (await copyToClipboard(prompt.id)) + toast.success($i18n.t('ID copied to clipboard')); + }}>{prompt.id} - {/if} -
{/if} -
- {/if} - - {#if !readOnly} -
- {#if edit}{:else}
{/if} -
- {#if historical}{/if} - + + {/if} +
+
+ { + tags = [...tags, { name: e.detail }]; + debouncedSaveMetadata(); + }} + on:delete={(e) => { + tags = tags.filter((tag) => tag.name !== e.detail); + debouncedSaveMetadata(); + }} + />
- {/if} - -
+ +
+ {#if historyDiff} + ({ + diff: historyDiff.content, + line_endings_only: historyDiff.line_endings_only + })} + onClose={() => (historyDiff = null)} + /> + {:else} +
+
+ {#if edit} + + +
+ + entry.id === prompt?.version_id) || + (productionEntry?.id === prompt?.version_id ? productionEntry : null)} + status={$i18n.t('Live')} + deleteDisabledReason={disabled + ? '' + : $i18n.t('Cannot delete the production version')} + selected={!historical} + onSelect={() => chooseVersion()} + /> + {#if history.some((entry) => entry.id !== prompt?.version_id)}
{/if} + {#each history.filter((entry) => entry.id !== prompt?.version_id) as entry (entry.id)} + chooseVersion(entry)} + onDelete={disabled + ? undefined + : () => { + deleteVersionId = entry.id; + showHistory = false; + showDeleteVersion = true; + }} + /> + {/each} + {#if historyLoading}
+ {$i18n.t('Loading...')} +
+ {:else if historyError} + {:else if !history.length}
+ {$i18n.t('No history available')} +
+ {:else if historyHasMore}
+ {/if} +
+
+
+ {:else}{$i18n.t('Prompt Content')}{/if} +
+ {#if !readOnly} + + {/if} + {'{{'}{$i18n.t('variable')}{'}}'} + +
+ + {/if} +
+ + {#if historical} +
+ {selectedHistoryEntry.id.slice(0, 7)} · {renderDate( + selectedHistoryEntry.created_at + )} + {#if !editingHistory}
+ + {#if !disabled} + + {/if} +
{/if} +
+ {/if} + + {#if !readOnly} +
+ {#if edit}{:else}
{/if} +
+ {#if historical}{/if} + +
+
+ {/if} + +
diff --git a/src/lib/components/workspace/Prompts/PromptMenu.svelte b/src/lib/components/workspace/Prompts/PromptMenu.svelte index 05bcd900f8..0c59268a6a 100644 --- a/src/lib/components/workspace/Prompts/PromptMenu.svelte +++ b/src/lib/components/workspace/Prompts/PromptMenu.svelte @@ -75,7 +75,8 @@
{$i18n.t('Edit')}
- {$i18n.t('Skills')} -{#if loaded} - loadSkillByUrl(localStorage.token, url)} - transformResult={(packages) => packages} - successMessage={$i18n.t('Skills loaded for preview')} - onImport={(packages) => { - bundleFiles = [ - new File([JSON.stringify(packages)], 'skills.json', { type: 'application/json' }) - ]; - showImport = true; - }} - /> - { - toast.success($i18n.t('Skill imported successfully')); - page = 1; - await loadSkillItems(); - _skills.set(await getSkills(localStorage.token)); - }} - /> - { - bundleFiles = Array.from(importInputElement.files || []); - showImport = true; - importInputElement.value = ''; - }} - /> - { - bundleFiles = Array.from(folderImportInput.files || []); - showImport = true; - folderImportInput.value = ''; - }} - /> + {#if loaded} + loadSkillByUrl(localStorage.token, url)} + transformResult={(packages) => packages} + successMessage={$i18n.t('Skills loaded for preview')} + onImport={(packages) => { + bundleFiles = [ + new File([JSON.stringify(packages)], 'skills.json', { type: 'application/json' }) + ]; + showImport = true; + }} + /> + { + toast.success($i18n.t('Skill imported successfully')); + page = 1; + await loadSkillItems(); + _skills.set(await getSkills(localStorage.token)); + }} + /> + { + bundleFiles = Array.from(importInputElement.files || []); + showImport = true; + importInputElement.value = ''; + }} + /> + { + bundleFiles = Array.from(folderImportInput.files || []); + showImport = true; + folderImportInput.value = ''; + }} + /> -
-
-
-
- -
- - {#if query} -
- +
+
+
+
+
- {/if} -
- -
{ - if (e.deltaY !== 0) { - e.preventDefault(); - e.currentTarget.scrollLeft += e.deltaY; - } - }} - > -
- { - localStorage.workspaceViewOption = value; - page = 1; - await tick(); - }} + + {#if query} +
+ +
+ {/if}
-
-
- {#if filteredItems === null || loading} -
- -
- {:else if (filteredItems ?? []).length !== 0} -
{ + if (e.deltaY !== 0) { + e.preventDefault(); + e.currentTarget.scrollLeft += e.deltaY; + } + }} > - - -
{$i18n.t('Owner')}
- - - {$i18n.t('Actions')} -
- -
- {#each filteredItems as skill (skill.id)} - + + {#if total > 30} +
+ +
+ {/if} + {:else} +
+
+
+ {hasFilters ? $i18n.t('No skills found') : $i18n.t('No skills yet')} +
+
+ {hasFilters + ? $i18n.t('Try adjusting your search or filter to find what you are looking for.') + : $i18n.t('Items you create or that are shared with you will appear here.')} +
+
{/if} - {:else} -
-
-
- {hasFilters ? $i18n.t('No skills found') : $i18n.t('No skills yet')} -
-
- {hasFilters - ? $i18n.t('Try adjusting your search or filter to find what you are looking for.') - : $i18n.t('Items you create or that are shared with you will appear here.')} -
-
-
- {/if} -
- - { - deleteHandler(selectedSkill); - }} - > -
- {$i18n.t('This will delete')} - {resolveLocalizedResource(selectedSkill, $i18n.language)}.
-
- {#if $config?.features?.enable_community_sharing} - + + { + deleteHandler(selectedSkill); + }} + > +
+ {$i18n.t('This will delete')} + {resolveLocalizedResource(selectedSkill, $i18n.language)}. +
+
+ {#if $config?.features?.enable_community_sharing} + + {/if} + {:else} +
+ +
{/if} -{:else} -
- -
-{/if} diff --git a/src/lib/components/workspace/Skills/SkillEditor.svelte b/src/lib/components/workspace/Skills/SkillEditor.svelte index d7c588129c..bc851811ee 100644 --- a/src/lib/components/workspace/Skills/SkillEditor.svelte +++ b/src/lib/components/workspace/Skills/SkillEditor.svelte @@ -346,305 +346,310 @@ /> -
-
-
- -
- {#if edit && skill?.id} (comments = request)} wrapperClassName="me-2" - resource={{ resource_type: 'skill', resource_id: skill.id }} - />{/if} - - - {#if !disabled} - {#if $user?.permissions?.sharing?.skills || $user?.role === 'admin'} - { - savedAccessGrants = structuredClone(accessGrants); - showAccessControlModal = true; - }} - /> - {/if} - {:else} - - {$i18n.t('Read Only')} - - {/if} -
-
- -
- - - - -
- + +
+ +
+ {#if edit && skill?.id} (comments = request)} + wrapperClassName="me-2" + resource={{ resource_type: 'skill', resource_id: skill.id }} + />{/if} + + + {#if !disabled} + {#if $user?.permissions?.sharing?.skills || $user?.role === 'admin'} + { + savedAccessGrants = structuredClone(accessGrants); + showAccessControlModal = true; + }} + /> + {/if} + {:else} + + {$i18n.t('Read Only')} + + {/if} +
+
+ +
+ - {#if edit} -
- {id} -
- {:else} +
- - {/if} -
-
- {#if conflict}{/if} -
- {#if historyDiff} - (historyDiff = null)} - loadFileDiff={async (path) => { - try { - return await ( - await skillRequest( - localStorage.token, - `/id/${id}/history/diff/file?${new URLSearchParams({ from_id: historyDiff.fromId, to_id: historyDiff.toId, path })}` - ) - ).json(); - } catch (error) { - throw new Error(skillError(error)); - } - }} - /> - {:else if ready} - {#snippet version()} - {#if edit} -
- { - if (open) { - historyPage = 1; - history = []; - loadHistory(); - } - }} - > - -
- - chooseVersion(currentVersionId!)} - /> - {#if historyLoading || historyError || history.some((entry) => entry.id !== currentVersionId)} -
- {/if} - {#if historyLoading} -
- {$i18n.t('Loading...')} -
- {:else if historyError} - - {:else} - {#each history.filter((entry) => entry.id !== currentVersionId) as entry} - chooseVersion(entry.id)} - onDelete={disabled - ? undefined - : () => { - deleteVersionId = entry.id; - showHistory = false; - showDeleteVersion = true; - }} - /> - {:else} - {#if historyPage > 1} -
- {$i18n.t('No more versions')} -
- {/if} - {/each} - {/if} - {#if historyPage > 1 || history.length === 20} -
-
- - -
- {/if} -
-
-
-
- {/if} - {/snippet} - {#snippet exports()} - + {id} +
+ {:else} + - - - {/snippet} - {/if} -
- - {#if historical} -
- {$i18n.t('Read Only')} -
- - {#if !disabled}{/if} + + + {/if}
- {/if} - {#if !readOnly} -
- - + {$i18n.t('This skill has a newer version. Your draft is preserved.')} +
{/if} +
+ {#if historyDiff} + (historyDiff = null)} + loadFileDiff={async (path) => { + try { + return await ( + await skillRequest( + localStorage.token, + `/id/${id}/history/diff/file?${new URLSearchParams({ from_id: historyDiff.fromId, to_id: historyDiff.toId, path })}` + ) + ).json(); + } catch (error) { + throw new Error(skillError(error)); + } + }} + /> + {:else if ready} + {#snippet version()} + {#if edit} +
+ { + if (open) { + historyPage = 1; + history = []; + loadHistory(); + } + }} + > + +
+ + chooseVersion(currentVersionId!)} + /> + {#if historyLoading || historyError || history.some((entry) => entry.id !== currentVersionId)} +
+ {/if} + {#if historyLoading} +
+ {$i18n.t('Loading...')} +
+ {:else if historyError} + + {:else} + {#each history.filter((entry) => entry.id !== currentVersionId) as entry} + chooseVersion(entry.id)} + onDelete={disabled + ? undefined + : () => { + deleteVersionId = entry.id; + showHistory = false; + showDeleteVersion = true; + }} + /> + {:else} + {#if historyPage > 1} +
+ {$i18n.t('No more versions')} +
+ {/if} + {/each} + {/if} + {#if historyPage > 1 || history.length === 20} +
+
+ + +
+ {/if} +
+
+
+
+ {/if} + {/snippet} + {#snippet exports()} + + + + {/snippet} +
{/if}
- {/if} - -
+ + {#if historical} +
+ {$i18n.t('Read Only')} +
+ + {#if !disabled}{/if} +
+
+ {/if} + + {#if !readOnly} +
+ + +
+ {/if} + +
diff --git a/src/lib/components/workspace/Skills/SkillMenu.svelte b/src/lib/components/workspace/Skills/SkillMenu.svelte index fc89904d74..591d85aa0e 100644 --- a/src/lib/components/workspace/Skills/SkillMenu.svelte +++ b/src/lib/components/workspace/Skills/SkillMenu.svelte @@ -71,7 +71,8 @@
{$i18n.t('Edit')}
- -{#if loaded} - { - console.log(importFiles); - showConfirm = true; - }} - /> + {#if loaded} + { + console.log(importFiles); + showConfirm = true; + }} + /> -
-
-
-
- -
- - {#if query} -
- +
+
+
+
+
- {/if} -
- -
{ - if (e.deltaY !== 0) { - e.preventDefault(); - e.currentTarget.scrollLeft += e.deltaY; - } - }} - > -
- { - localStorage.workspaceViewOption = value; - - await tick(); - }} + + {#if query} +
+ +
+ {/if} +
+ +
{ + if (e.deltaY !== 0) { + e.preventDefault(); + e.currentTarget.scrollLeft += e.deltaY; + } + }} + > +
+ { + localStorage.workspaceViewOption = value; + + await tick(); + }} + /> +
-
- {#if (filteredItems ?? []).length !== 0} -
-
- - -
{$i18n.t('Owner')}
- - - {$i18n.t('Actions')} -
- -
- {#each filteredItems as tool} - + +
+ {#each filteredItems as tool} + -
-
- - - - - {capitalizeFirstLetter( - tool?.user?.name ?? tool?.user?.email ?? $i18n.t('Deleted User') - )} +
+ + + + + {capitalizeFirstLetter( + tool?.user?.name ?? tool?.user?.email ?? $i18n.t('Deleted User') + )} + - - -
- -
- {dayjs(tool.updated_at * 1000) - .locale($i18n.language) - .fromNow()} +
-
-
- {#if tool.write_access} -
- {#if shiftKey} - - - - {:else} - {#if tool?.meta?.manifest?.funding_url ?? false} - + +
+ {dayjs(tool.updated_at * 1000) + .locale($i18n.language) + .fromNow()} +
+
+
+ {#if tool.write_access} +
+ {#if shiftKey} + + + {:else} + {#if tool?.meta?.manifest?.funding_url ?? false} + + + + {/if} + + + - {/if} - - - - - (comments = request)} - modal - className="flex size-6 shrink-0 items-center justify-center rounded-lg text-gray-400 transition dark:text-gray-500" - resource={{ resource_type: 'tool', resource_id: tool.id }} - /> - (comments = request)} - resourceId={tool.id} - accessHandler={$user?.permissions?.sharing?.tools || $user?.role === 'admin' - ? () => accessModal.open(tool.id) - : null} - show={openToolMenuId === tool.id} - editHandler={() => { - goto(`/workspace/tools/edit?id=${encodeURIComponent(tool.id)}`); - }} - shareHandler={() => { - shareHandler(tool); - }} - cloneHandler={() => { - cloneHandler(tool); - }} - exportHandler={() => { - exportHandler(tool); - }} - deleteHandler={async () => { - selectedTool = tool; - showDeleteConfirm = true; - }} - onClose={() => { - openToolMenuId = null; - }} - > - - - - toggleToolHandler(tool)} + (comments = request)} + modal + className="flex size-6 shrink-0 items-center justify-center rounded-lg text-gray-400 transition dark:text-gray-500" + resource={{ resource_type: 'tool', resource_id: tool.id }} /> - - {/if} -
- {/if} - {#if !tool.write_access} - (comments = request)} - modal - className="flex size-6 shrink-0 items-center justify-center rounded-lg text-gray-400 transition dark:text-gray-500" - resource={{ resource_type: 'tool', resource_id: tool.id }} - /> - - + {/if} + {#if !tool.write_access} + (comments = request)} + modal + className="flex size-6 shrink-0 items-center justify-center rounded-lg text-gray-400 transition dark:text-gray-500" + resource={{ resource_type: 'tool', resource_id: tool.id }} /> -
- {/if} + + + {/if} +
+ {/each} +
+
+ {:else} +
+
+
+ {hasFilters ? $i18n.t('No tools found') : $i18n.t('No tools yet')} +
+
+ {hasFilters + ? $i18n.t('Try adjusting your search or filter to find what you are looking for.') + : $i18n.t('Items you create or that are shared with you will appear here.')}
- {/each} -
-
- {:else} -
-
-
- {hasFilters ? $i18n.t('No tools found') : $i18n.t('No tools yet')} -
-
- {hasFilters - ? $i18n.t('Try adjusting your search or filter to find what you are looking for.') - : $i18n.t('Items you create or that are shared with you will appear here.')}
-
+ {/if} +
+ + {#if $config?.features.enable_community_sharing} + {/if} -
- {#if $config?.features.enable_community_sharing} - { + deleteHandler(selectedTool); + }} + > +
+ {$i18n.t('This will delete')} + {resolveLocalizedResource(selectedTool, $i18n.language)}. +
+ + + + + + { + const reader = new FileReader(); + reader.onload = async (event) => { + const _tools = JSON.parse(event.target.result); + console.log(_tools); + + for (const tool of _tools) { + const res = await createNewTool(localStorage.token, tool).catch((error) => { + toast.error(`${error}`); + return null; + }); + } + + toast.success($i18n.t('Tool imported successfully')); + await init(); + importFiles = null; + toolsImportInputElement.value = ''; + }; + + reader.readAsText(importFiles[0]); + }} + > +
+
+
{$i18n.t('Please carefully review the following warnings:')}
+ +
    +
  • + {$i18n.t( + 'Tools have a function calling system that allows arbitrary code execution.' + )}. +
  • +
  • {$i18n.t('Do not install tools from sources you do not fully trust.')}
  • +
+
+ +
+ {$i18n.t( + 'I acknowledge that I have read and I understand the implications of my action. I am aware of the risks associated with executing arbitrary code and I have verified the trustworthiness of the source.' + )} +
+
+
+ {:else} +
+ +
{/if} - - { - deleteHandler(selectedTool); - }} - > -
- {$i18n.t('This will delete')} - {resolveLocalizedResource(selectedTool, $i18n.language)}. -
-
- - - - - { - const reader = new FileReader(); - reader.onload = async (event) => { - const _tools = JSON.parse(event.target.result); - console.log(_tools); - - for (const tool of _tools) { - const res = await createNewTool(localStorage.token, tool).catch((error) => { - toast.error(`${error}`); - return null; - }); - } - - toast.success($i18n.t('Tool imported successfully')); - await init(); - importFiles = null; - toolsImportInputElement.value = ''; - }; - - reader.readAsText(importFiles[0]); - }} - > -
-
-
{$i18n.t('Please carefully review the following warnings:')}
- -
    -
  • - {$i18n.t('Tools have a function calling system that allows arbitrary code execution.')}. -
  • -
  • {$i18n.t('Do not install tools from sources you do not fully trust.')}
  • -
-
- -
- {$i18n.t( - 'I acknowledge that I have read and I understand the implications of my action. I am aware of the risks associated with executing arbitrary code and I have verified the trustworthiness of the source.' - )} -
-
-
-{:else} -
- -
-{/if} diff --git a/src/lib/components/workspace/Tools/ToolMenu.svelte b/src/lib/components/workspace/Tools/ToolMenu.svelte index 6c83a5438d..e65ab64933 100644 --- a/src/lib/components/workspace/Tools/ToolMenu.svelte +++ b/src/lib/components/workspace/Tools/ToolMenu.svelte @@ -73,7 +73,8 @@
{$i18n.t('Edit')}
- -
-
{ - if (selected) return; - if (edit) { - submitHandler(); - } else { - showConfirm = true; - } - }} - > -
-
- - - {#if edit && version_id} - - {/if} -
-
- {#if edit && id} (comments = request)} wrapperClassName="me-2" resource={{ resource_type: 'tool', resource_id: id }} />{/if} - - - {#if $user?.permissions?.sharing?.tools || $user?.role === 'admin'} - + { + if (selected) return; + if (edit) { + submitHandler(); + } else { + showConfirm = true; + } + }} + > +
+
+
-
- -
-
- - {#if selected} - - {:else} - - {/if} - - -
- {#if edit} -
- {id} -
- {:else} - - - - {/if} - - + + {$i18n.t('Back')} + + + {#if edit && version_id} + + {/if} +
+
+ {#if edit && id} (comments = request)} + wrapperClassName="me-2" + resource={{ resource_type: 'tool', resource_id: id }} + />{/if} + + + {#if $user?.permissions?.sharing?.tools || $user?.role === 'admin'} + { + savedAccessGrants = structuredClone(accessGrants); + showAccessControlModal = true; + }} + /> + {/if} +
+
+ +
+
+ {#if selected} {:else} {/if} + +
+ {#if edit} +
+ {id} +
+ {:else} + + + + {/if} + + + {#if selected} + + {:else} + + {/if} + +
-
-
- {#if locale && !comparison} - {#key selected?.id} - {#if selected} - - {:else} - - {/if} - {/key} - {/if} +
+ {#if locale && !comparison} + {#key selected?.id} + {#if selected} + + {:else} + + {/if} + {/key} + {/if} - {#if comparison} - ({ - diff: comparison.content_diff, - line_endings_only: comparison.line_endings_only - })} - onClose={() => { - comparison = null; - }} - /> - {/if} - {#if selected && !locale && !comparison} - - {/if} -
- { - if (selected) return; - content = e; - _content = e; - if (!edit) { - const fm = extractFrontmatter(e) as Record; - if (fm.title && !name) { - name = formatSkillName(fm.title); - id = nameToId(fm.title); + {#if comparison} + ({ + diff: comparison.content_diff, + line_endings_only: comparison.line_endings_only + })} + onClose={() => { + comparison = null; + }} + /> + {/if} + {#if selected && !locale && !comparison} + + {/if} +
+ { + if (selected) return; + content = e; + _content = e; + if (!edit) { + const fm = extractFrontmatter(e) as Record; + if (fm.title && !name) { + name = formatSkillName(fm.title); + id = nameToId(fm.title); + } + if (fm.description && !meta.description) { + meta = { ...meta, description: fm.description }; + } } - if (fm.description && !meta.description) { - meta = { ...meta, description: fm.description }; + }} + onSave={async () => { + if (formElement) { + formElement.requestSubmit(); } - } - }} - onSave={async () => { - if (formElement) { - formElement.requestSubmit(); - } - }} - /> + }} + /> +
-
-
-
- -
{warning}
-
+
+
+ +
{warning}
+
-
- {#if selected} - {#if !comparison} +
+ {#if selected} + {#if !comparison} + + {/if} + {:else} + + {/if} - - {:else} - - - {/if} +
-
- -
- + +
(showParticipants = false)}>