From 3a1fbb936b1f7d073f6762edaa036ac42722c2e7 Mon Sep 17 00:00:00 2001 From: Austen Adler Date: Sat, 11 May 2024 00:32:29 -0400 Subject: [PATCH 01/28] Always open links in a new tab --- src/lib/components/chat/Messages/ResponseMessage.svelte | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/src/lib/components/chat/Messages/ResponseMessage.svelte b/src/lib/components/chat/Messages/ResponseMessage.svelte index 5b228a9ffe..1ad252f639 100644 --- a/src/lib/components/chat/Messages/ResponseMessage.svelte +++ b/src/lib/components/chat/Messages/ResponseMessage.svelte @@ -78,6 +78,13 @@ return `${code.replaceAll('&', '&')}`; }; + // Open all links in a new tab/window (from https://github.com/markedjs/marked/issues/655#issuecomment-383226346) + const origLinkRenderer = renderer.link; + renderer.link = (href, title, text) => { + const html = origLinkRenderer.call(renderer, href, title, text); + return html.replace(/^ Date: Thu, 16 May 2024 16:18:42 -0400 Subject: [PATCH 02/28] Also replace > with > --- src/lib/utils/index.ts | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/lib/utils/index.ts b/src/lib/utils/index.ts index 03cbc62629..2f9b1dc2c7 100644 --- a/src/lib/utils/index.ts +++ b/src/lib/utils/index.ts @@ -36,11 +36,14 @@ export const sanitizeResponseContent = (content: string) => { .replace(/<$/, '') .replaceAll(/<\|[a-z]+\|>/g, ' ') .replaceAll('<', '<') + .replaceAll('>', '>') .trim(); }; export const revertSanitizedResponseContent = (content: string) => { - return content.replaceAll('<', '<'); + return content + .replaceAll('<', '<') + .replaceAll('>', '>'); }; export const capitalizeFirstLetter = (string) => { From b6474aa02d1452ae352ffa0d1c41717223527d7c Mon Sep 17 00:00:00 2001 From: Kubik <84036232+KodeurKubik@users.noreply.github.com> Date: Sat, 25 May 2024 14:34:05 +0300 Subject: [PATCH 03/28] Hopefully no conflicts here --- src/lib/i18n/locales/fr-FR/translation.json | 974 ++++++++++---------- 1 file changed, 487 insertions(+), 487 deletions(-) diff --git a/src/lib/i18n/locales/fr-FR/translation.json b/src/lib/i18n/locales/fr-FR/translation.json index 5fdc7513f7..7071bd9a9a 100644 --- a/src/lib/i18n/locales/fr-FR/translation.json +++ b/src/lib/i18n/locales/fr-FR/translation.json @@ -1,489 +1,489 @@ { - "'s', 'm', 'h', 'd', 'w' or '-1' for no expiration.": "'s', 'm', 'h', 'd', 'w' ou '-1' pour aucune expiration.", - "(Beta)": "(Bêta)", - "(e.g. `sh webui.sh --api`)": "(par ex. `sh webui.sh --api`)", - "(latest)": "(dernière)", - "{{ models }}": "", - "{{ owner }}: You cannot delete a base model": "", - "{{modelName}} is thinking...": "{{modelName}} réfléchit...", - "{{user}}'s Chats": "{{user}}'s Chats", - "{{webUIName}} Backend Required": "Backend {{webUIName}} requis", - "a user": "un utilisateur", - "About": "À propos", - "Account": "Compte", - "Accurate information": "Information précise", - "Add": "Ajouter", - "Add a model id": "", - "Add a short description about what this model does": "", - "Add a short title for this prompt": "Ajouter un court titre pour ce prompt", - "Add a tag": "Ajouter un tag", - "Add custom prompt": "Ajouter un prompt personnalisé", - "Add Docs": "Ajouter des documents", - "Add Files": "Ajouter des fichiers", - "Add Memory": "Ajouter une mémoire", - "Add message": "Ajouter un message", - "Add Model": "Ajouter un modèle", - "Add Tags": "ajouter des tags", - "Add User": "Ajouter un utilisateur", - "Adjusting these settings will apply changes universally to all users.": "L'ajustement de ces paramètres appliquera les changements à tous les utilisateurs.", - "admin": "Administrateur", - "Admin Panel": "Panneau d'administration", - "Admin Settings": "Paramètres d'administration", - "Advanced Parameters": "Paramètres avancés", - "Advanced Params": "", - "all": "tous", - "All Documents": "Tous les documents", - "All Users": "Tous les utilisateurs", - "Allow": "Autoriser", - "Allow Chat Deletion": "Autoriser la suppression du chat", - "alphanumeric characters and hyphens": "caractères alphanumériques et tirets", - "Already have an account?": "Vous avez déjà un compte ?", - "an assistant": "un assistant", - "and": "et", - "and create a new shared link.": "et créer un nouveau lien partagé.", - "API Base URL": "URL de base de l'API", - "API Key": "Clé API", - "API Key created.": "Clé API créée.", - "API keys": "Clés API", - "April": "Avril", - "Archive": "Archiver", - "Archived Chats": "enregistrement du chat", - "are allowed - Activate this command by typing": "sont autorisés - Activez cette commande en tapant", - "Are you sure?": "Êtes-vous sûr ?", - "Attach file": "Joindre un fichier", - "Attention to detail": "Attention aux détails", - "Audio": "Audio", - "August": "Août", - "Auto-playback response": "Réponse en lecture automatique", - "Auto-send input after 3 sec.": "Envoyer automatiquement l'entrée après 3 sec.", - "AUTOMATIC1111 Base URL": "URL de base AUTOMATIC1111", - "AUTOMATIC1111 Base URL is required.": "L'URL de base AUTOMATIC1111 est requise.", - "available!": "disponible !", - "Back": "Retour", - "Bad Response": "Mauvaise réponse", - "Base Model (From)": "", - "before": "avant", - "Being lazy": "En manque de temps", - "Bypass SSL verification for Websites": "Parcourir la vérification SSL pour les sites Web", - "Cancel": "Annuler", - "Capabilities": "", - "Change Password": "Changer le mot de passe", - "Chat": "Chat", - "Chat Bubble UI": "Chat Bubble UI", - "Chat direction": "Direction du chat", - "Chat History": "Historique du chat", - "Chat History is off for this browser.": "L'historique du chat est désactivé pour ce navigateur.", - "Chats": "Chats", - "Check Again": "Vérifier à nouveau", - "Check for updates": "Vérifier les mises à jour", - "Checking for updates...": "Vérification des mises à jour...", - "Choose a model before saving...": "Choisissez un modèle avant d'enregistrer...", - "Chunk Overlap": "Chevauchement de bloc", - "Chunk Params": "Paramètres de bloc", - "Chunk Size": "Taille de bloc", - "Citation": "Citations", - "Click here for help.": "Cliquez ici pour de l'aide.", - "Click here to": "Cliquez ici pour", - "Click here to select": "Cliquez ici pour sélectionner", - "Click here to select a csv file.": "Cliquez ici pour sélectionner un fichier csv.", - "Click here to select documents.": "Cliquez ici pour sélectionner des documents.", - "click here.": "cliquez ici.", - "Click on the user role button to change a user's role.": "Cliquez sur le bouton de rôle d'utilisateur pour changer le rôle d'un utilisateur.", - "Close": "Fermer", - "Collection": "Collection", - "ComfyUI": "ComfyUI", - "ComfyUI Base URL": "ComfyUI Base URL", - "ComfyUI Base URL is required.": "ComfyUI Base URL est requis.", - "Command": "Commande", - "Confirm Password": "Confirmer le mot de passe", - "Connections": "Connexions", - "Content": "Contenu", - "Context Length": "Longueur du contexte", - "Continue Response": "Continuer la réponse", - "Conversation Mode": "Mode de conversation", - "Copied shared chat URL to clipboard!": "URL de chat partagé copié dans le presse-papier !", - "Copy": "Copier", - "Copy last code block": "Copier le dernier bloc de code", - "Copy last response": "Copier la dernière réponse", - "Copy Link": "Copier le lien", - "Copying to clipboard was successful!": "La copie dans le presse-papiers a réussi !", - "Create a concise, 3-5 word phrase as a header for the following query, strictly adhering to the 3-5 word limit and avoiding the use of the word 'title':": "Créez une phrase concise de 3-5 mots comme en-tête pour la requête suivante, en respectant strictement la limite de 3-5 mots et en évitant l'utilisation du mot 'titre' :", - "Create a model": "", - "Create Account": "Créer un compte", - "Create new key": "Créer une nouvelle clé", - "Create new secret key": "Créer une nouvelle clé secrète", - "Created at": "Créé le", - "Created At": "Créé le", - "Current Model": "Modèle actuel", - "Current Password": "Mot de passe actuel", - "Custom": "Personnalisé", - "Customize models for a specific purpose": "", - "Dark": "Sombre", - "Dashboard": "Tableau de bord", - "Database": "Base de données", - "December": "Décembre", - "Default": "Par défaut", - "Default (Automatic1111)": "Par défaut (Automatic1111)", - "Default (SentenceTransformers)": "Par défaut (SentenceTransformers)", - "Default (Web API)": "Par défaut (API Web)", - "Default model updated": "Modèle par défaut mis à jour", - "Default Prompt Suggestions": "Suggestions de prompt par défaut", - "Default User Role": "Rôle d'utilisateur par défaut", - "delete": "supprimer", - "Delete": "Supprimer", - "Delete a model": "Supprimer un modèle", - "Delete chat": "Supprimer le chat", - "Delete Chat": "Supprimer le chat", - "Delete Chats": "Supprimer les chats", - "delete this link": "supprimer ce lien", - "Delete User": "Supprimer l'utilisateur", - "Deleted {{deleteModelTag}}": "{{deleteModelTag}} supprimé", - "Deleted {{name}}": "", - "Description": "Description", - "Didn't fully follow instructions": "Ne suit pas les instructions", - "Disabled": "Désactivé", - "Discover a model": "", - "Discover a prompt": "Découvrir un prompt", - "Discover, download, and explore custom prompts": "Découvrir, télécharger et explorer des prompts personnalisés", - "Discover, download, and explore model presets": "Découvrir, télécharger et explorer des préconfigurations de modèles", - "Display the username instead of You in the Chat": "Afficher le nom d'utilisateur au lieu de 'Vous' dans le Chat", - "Document": "Document", - "Document Settings": "Paramètres du document", - "Documents": "Documents", - "does not make any external connections, and your data stays securely on your locally hosted server.": "ne fait aucune connexion externe, et vos données restent en sécurité sur votre serveur hébergé localement.", - "Don't Allow": "Ne pas autoriser", - "Don't have an account?": "Vous n'avez pas de compte ?", - "Don't like the style": "Vous n'aimez pas le style ?", - "Download": "Télécharger", - "Download canceled": "Téléchargement annulé", - "Download Database": "Télécharger la base de données", - "Drop any files here to add to the conversation": "Déposez des fichiers ici pour les ajouter à la conversation", - "e.g. '30s','10m'. Valid time units are 's', 'm', 'h'.": "par ex. '30s', '10m'. Les unités de temps valides sont 's', 'm', 'h'.", - "Edit": "Éditer", - "Edit Doc": "Éditer le document", - "Edit User": "Éditer l'utilisateur", - "Email": "Email", - "Embedding Model": "Modèle d'embedding", - "Embedding Model Engine": "Moteur du modèle d'embedding", - "Embedding model set to \"{{embedding_model}}\"": "Modèle d'embedding défini sur \"{{embedding_model}}\"", - "Enable Chat History": "Activer l'historique du chat", - "Enable New Sign Ups": "Activer les nouvelles inscriptions", - "Enabled": "Activé", - "Ensure your CSV file includes 4 columns in this order: Name, Email, Password, Role.": "Assurez-vous que votre fichier CSV inclut 4 colonnes dans cet ordre : Nom, Email, Mot de passe, Rôle.", - "Enter {{role}} message here": "Entrez le message {{role}} ici", - "Enter a detail about yourself for your LLMs to recall": "Entrez un détail sur vous pour que vos LLM puissent le rappeler", - "Enter Chunk Overlap": "Entrez le chevauchement de bloc", - "Enter Chunk Size": "Entrez la taille du bloc", - "Enter Image Size (e.g. 512x512)": "Entrez la taille de l'image (p. ex. 512x512)", - "Enter language codes": "Entrez les codes de langue", - "Enter model tag (e.g. {{modelTag}})": "Entrez le tag du modèle (p. ex. {{modelTag}})", - "Enter Number of Steps (e.g. 50)": "Entrez le nombre d'étapes (p. ex. 50)", - "Enter Score": "Entrez le score", - "Enter stop sequence": "Entrez la séquence de fin", - "Enter Top K": "Entrez Top K", - "Enter URL (e.g. http://127.0.0.1:7860/)": "Entrez l'URL (p. ex. http://127.0.0.1:7860/)", - "Enter URL (e.g. http://localhost:11434)": "Entrez l'URL (p. ex. http://localhost:11434)", - "Enter Your Email": "Entrez votre email", - "Enter Your Full Name": "Entrez votre nom complet", - "Enter Your Password": "Entrez votre mot de passe", - "Enter Your Role": "Entrez votre rôle", - "Experimental": "Expérimental", - "Export All Chats (All Users)": "Exporter tous les chats (tous les utilisateurs)", - "Export Chats": "Exporter les chats", - "Export Documents Mapping": "Exporter la correspondance des documents", - "Export Models": "", - "Export Prompts": "Exporter les prompts", - "Failed to create API Key.": "Impossible de créer la clé API.", - "Failed to read clipboard contents": "Échec de la lecture du contenu du presse-papiers", - "February": "Février", - "Feel free to add specific details": "Vous pouvez ajouter des détails spécifiques", - "File Mode": "Mode fichier", - "File not found.": "Fichier non trouvé.", - "Fingerprint spoofing detected: Unable to use initials as avatar. Defaulting to default profile image.": "Détection de falsification de empreinte digitale\u00a0: impossible d'utiliser les initiales comme avatar. Par défaut, l'image de profil par défaut est utilisée.", - "Fluidly stream large external response chunks": "Diffusez de manière fluide de gros morceaux de réponses externes", - "Focus chat input": "Concentrer sur l'entrée du chat", - "Followed instructions perfectly": "Suivi des instructions parfaitement", - "Format your variables using square brackets like this:": "Formatez vos variables en utilisant des crochets comme ceci :", - "Frequencey Penalty": "", - "Full Screen Mode": "Mode plein écran", - "General": "Général", - "General Settings": "Paramètres généraux", - "Generation Info": "Informations de génération", - "Good Response": "Bonne réponse", - "h:mm a": "h:mm a", - "has no conversations.": "n'a pas de conversations.", - "Hello, {{name}}": "Bonjour, {{name}}", - "Help": "Aide", - "Hide": "Cacher", - "How can I help you today?": "Comment puis-je vous aider aujourd'hui ?", - "Hybrid Search": "Recherche hybride", - "Image Generation (Experimental)": "Génération d'image (Expérimental)", - "Image Generation Engine": "Moteur de génération d'image", - "Image Settings": "Paramètres d'image", - "Images": "Images", - "Import Chats": "Importer les chats", - "Import Documents Mapping": "Importer la correspondance des documents", - "Import Models": "", - "Import Prompts": "Importer les prompts", - "Include `--api` flag when running stable-diffusion-webui": "Inclure le drapeau `--api` lors de l'exécution de stable-diffusion-webui", - "Input commands": "Entrez les commandes d'entrée", - "Interface": "Interface", - "Invalid Tag": "Tag invalide", - "January": "Janvier", - "join our Discord for help.": "rejoignez notre Discord pour obtenir de l'aide.", - "JSON": "JSON", - "JSON Preview": "", - "July": "Juillet", - "June": "Juin", - "JWT Expiration": "Expiration JWT", - "JWT Token": "Jeton JWT", - "Keep Alive": "Garder en vie", - "Keyboard shortcuts": "Raccourcis clavier", - "Language": "Langue", - "Last Active": "Dernière activité", - "Light": "Clair", - "Listening...": "Écoute...", - "LLMs can make mistakes. Verify important information.": "Les LLMs peuvent faire des erreurs. Vérifiez les informations importantes.", - "LTR": "LTR", - "Made by OpenWebUI Community": "Réalisé par la communauté OpenWebUI", - "Make sure to enclose them with": "Assurez-vous de les entourer avec", - "Manage Models": "Gérer les modèles", - "Manage Ollama Models": "Gérer les modèles Ollama", - "March": "Mars", - "Max Tokens (num_predict)": "", - "Maximum of 3 models can be downloaded simultaneously. Please try again later.": "Un maximum de 3 modèles peut être téléchargé simultanément. Veuillez réessayer plus tard.", - "May": "Mai", - "Memories accessible by LLMs will be shown here.": "Les mémoires accessibles par les LLM seront affichées ici.", - "Memory": "Mémoire", - "Messages you send after creating your link won't be shared. Users with the URL will be able to view the shared chat.": "Les messages que vous envoyez après la création de votre lien ne seront pas partagés. Les utilisateurs avec l'URL pourront voir le chat partagé.", - "Minimum Score": "Score minimum", - "Mirostat": "Mirostat", - "Mirostat Eta": "Mirostat Eta", - "Mirostat Tau": "Mirostat Tau", - "MMMM DD, YYYY": "MMMM DD, YYYY", - "MMMM DD, YYYY HH:mm": "MMMM DD, YYYY HH:mm", - "Model '{{modelName}}' has been successfully downloaded.": "Le modèle '{{modelName}}' a été téléchargé avec succès.", - "Model '{{modelTag}}' is already in queue for downloading.": "Le modèle '{{modelTag}}' est déjà dans la file d'attente pour le téléchargement.", - "Model {{modelId}} not found": "Modèle {{modelId}} non trouvé", - "Model {{modelName}} is not vision capable": "", - "Model filesystem path detected. Model shortname is required for update, cannot continue.": "Le chemin du système de fichiers du modèle a été détecté. Le nom court du modèle est nécessaire pour la mise à jour, impossible de continuer.", - "Model ID": "", - "Model not selected": "Modèle non sélectionné", - "Model Params": "", - "Model Whitelisting": "Liste blanche de modèle", - "Model(s) Whitelisted": "Modèle(s) sur liste blanche", - "Modelfile Content": "Contenu du fichier de modèle", - "Models": "Modèles", - "More": "Plus", - "Name": "Nom", - "Name Tag": "Tag de nom", - "Name your model": "", - "New Chat": "Nouveau chat", - "New Password": "Nouveau mot de passe", - "No results found": "Aucun résultat trouvé", - "No source available": "Aucune source disponible", - "Not factually correct": "Non, pas exactement correct", - "Note: If you set a minimum score, the search will only return documents with a score greater than or equal to the minimum score.": "Note: Si vous définissez un score minimum, la recherche ne retournera que les documents avec un score supérieur ou égal au score minimum.", - "Notifications": "Notifications de bureau", - "November": "Novembre", - "October": "Octobre", - "Off": "Désactivé", - "Okay, Let's Go!": "D'accord, allons-y !", - "OLED Dark": "OLED Sombre", - "Ollama": "Ollama", - "Ollama API": "", - "Ollama Version": "Version Ollama", - "On": "Activé", - "Only": "Seulement", - "Only alphanumeric characters and hyphens are allowed in the command string.": "Seuls les caractères alphanumériques et les tirets sont autorisés dans la chaîne de commande.", - "Oops! Hold tight! Your files are still in the processing oven. We're cooking them up to perfection. Please be patient and we'll let you know once they're ready.": "Oups ! Tenez bon ! Vos fichiers sont encore dans le four. Nous les cuisinons à la perfection. Soyez patient et nous vous informerons dès qu'ils seront prêts.", - "Oops! Looks like the URL is invalid. Please double-check and try again.": "Oops! Looks like the URL is invalid. Please double-check and try again.", - "Oops! You're using an unsupported method (frontend only). Please serve the WebUI from the backend.": "Oops! You're using an unsupported method (frontend only). Please serve the WebUI from the backend.", - "Open": "Ouvrir", - "Open AI": "Open AI", - "Open AI (Dall-E)": "Open AI (Dall-E)", - "Open new chat": "Ouvrir un nouveau chat", - "OpenAI": "OpenAI", - "OpenAI API": "API OpenAI", - "OpenAI API Config": "Configuration API OpenAI", - "OpenAI API Key is required.": "La clé API OpenAI est requise.", - "OpenAI URL/Key required.": "L'URL/Clé OpenAI est requise.", - "or": "ou", - "Other": "Autre", - "Overview": "Aperçu", - "Password": "Mot de passe", - "PDF document (.pdf)": "Document PDF (.pdf)", - "PDF Extract Images (OCR)": "Extraction d'images PDF (OCR)", - "pending": "en attente", - "Permission denied when accessing microphone: {{error}}": "Permission refusée lors de l'accès au microphone : {{error}}", - "Personalization": "Personnalisation", - "Plain text (.txt)": "Texte brut (.txt)", - "Playground": "Aire de jeu", - "Positive attitude": "Attitude positive", - "Previous 30 days": "30 derniers jours", - "Previous 7 days": "7 derniers jours", - "Profile Image": "Image de profil", - "Prompt": "Prompt", - "Prompt (e.g. Tell me a fun fact about the Roman Empire)": "Prompt (par exemple, Dites-moi un fait amusant sur l'Imperium romain)", - "Prompt Content": "Contenu du prompt", - "Prompt suggestions": "Suggestions de prompt", - "Prompts": "Prompts", - "Pull \"{{searchValue}}\" from Ollama.com": "Tirer \"{{searchValue}}\" de Ollama.com", - "Pull a model from Ollama.com": "Tirer un modèle de Ollama.com", - "Query Params": "Paramètres de requête", - "RAG Template": "Modèle RAG", - "Read Aloud": "Lire à l'oreille", - "Record voice": "Enregistrer la voix", - "Redirecting you to OpenWebUI Community": "Vous redirige vers la communauté OpenWebUI", - "Refused when it shouldn't have": "Refusé quand il ne devrait pas l'être", - "Regenerate": "Régénérer", - "Release Notes": "Notes de version", - "Remove": "Supprimer", - "Remove Model": "Supprimer le modèle", - "Rename": "Renommer", - "Repeat Last N": "Répéter les derniers N", - "Request Mode": "Mode de demande", - "Reranking Model": "Modèle de reranking", - "Reranking model disabled": "Modèle de reranking désactivé", - "Reranking model set to \"{{reranking_model}}\"": "Modèle de reranking défini sur \"{{reranking_model}}\"", - "Reset Vector Storage": "Réinitialiser le stockage de vecteur", - "Response AutoCopy to Clipboard": "Copie automatique de la réponse dans le presse-papiers", - "Role": "Rôle", - "Rosé Pine": "Pin Rosé", - "Rosé Pine Dawn": "Aube Pin Rosé", - "RTL": "RTL", - "Save": "Enregistrer", - "Save & Create": "Enregistrer & Créer", - "Save & Update": "Enregistrer & Mettre à jour", - "Saving chat logs directly to your browser's storage is no longer supported. Please take a moment to download and delete your chat logs by clicking the button below. Don't worry, you can easily re-import your chat logs to the backend through": "La sauvegarde des chat directement dans le stockage de votre navigateur n'est plus prise en charge. Veuillez prendre un moment pour télécharger et supprimer vos journaux de chat en cliquant sur le bouton ci-dessous. Ne vous inquiétez pas, vous pouvez facilement importer vos sauvegardes de chat via", - "Scan": "Scanner", - "Scan complete!": "Scan terminé !", - "Scan for documents from {{path}}": "Scanner des documents depuis {{path}}", - "Search": "Recherche", - "Search a model": "Rechercher un modèle", - "Search Documents": "Rechercher des documents", - "Search Prompts": "Rechercher des prompts", - "See readme.md for instructions": "Voir readme.md pour les instructions", - "See what's new": "Voir les nouveautés", - "Seed": "Graine", - "Select a base model": "", - "Select a mode": "Sélectionnez un mode", - "Select a model": "Sélectionner un modèle", - "Select an Ollama instance": "Sélectionner une instance Ollama", - "Select model": "Sélectionner un modèle", - "Selected model(s) do not support image inputs": "", - "Send": "Envoyer", - "Send a Message": "Envoyer un message", - "Send message": "Envoyer un message", - "September": "Septembre", - "Server connection verified": "Connexion au serveur vérifiée", - "Set as default": "Définir par défaut", - "Set Default Model": "Définir le modèle par défaut", - "Set embedding model (e.g. {{model}})": "Définir le modèle d'embedding (par exemple {{model}})", - "Set Image Size": "Définir la taille de l'image", - "Set Model": "Définir le modèle", - "Set reranking model (e.g. {{model}})": "Définir le modèle de reranking (par exemple {{model}})", - "Set Steps": "Définir les étapes", - "Set Title Auto-Generation Model": "Définir le modèle de génération automatique de titre", - "Set Voice": "Définir la voix", - "Settings": "Paramètres", - "Settings saved successfully!": "Paramètres enregistrés avec succès !", - "Share": "Partager", - "Share Chat": "Partager le chat", - "Share to OpenWebUI Community": "Partager avec la communauté OpenWebUI", - "short-summary": "résumé court", - "Show": "Montrer", - "Show shortcuts": "Afficher les raccourcis", - "Showcased creativity": "Créativité affichée", - "sidebar": "barre latérale", - "Sign in": "Se connecter", - "Sign Out": "Se déconnecter", - "Sign up": "S'inscrire", - "Signing in": "Connexion en cours", - "Source": "Source", - "Speech recognition error: {{error}}": "Erreur de reconnaissance vocale : {{error}}", - "Speech-to-Text Engine": "Moteur de reconnaissance vocale", - "SpeechRecognition API is not supported in this browser.": "L'API SpeechRecognition n'est pas prise en charge dans ce navigateur.", - "Stop Sequence": "Séquence d'arrêt", - "STT Settings": "Paramètres STT", - "Submit": "Soumettre", - "Subtitle (e.g. about the Roman Empire)": "Sous-titre (par exemple, sur l'empire romain)", - "Success": "Succès", - "Successfully updated.": "Mis à jour avec succès.", - "Suggested": "Suggéré", - "System": "Système", - "System Prompt": "Invite de système", - "Tags": "Tags", - "Tell us more:": "Donnez-nous plus:", - "Temperature": "Température", - "Template": "Modèle", - "Text Completion": "Complétion de texte", - "Text-to-Speech Engine": "Moteur de synthèse vocale", - "Tfs Z": "Tfs Z", - "Thanks for your feedback!": "Merci pour votre feedback!", - "The score should be a value between 0.0 (0%) and 1.0 (100%).": "Le score doit être une valeur comprise entre 0.0 (0%) et 1.0 (100%).", - "Theme": "Thème", - "This ensures that your valuable conversations are securely saved to your backend database. Thank you!": "Cela garantit que vos précieuses conversations sont en sécurité dans votre base de données. Merci !", - "This setting does not sync across browsers or devices.": "Ce paramètre ne se synchronise pas entre les navigateurs ou les appareils.", - "Thorough explanation": "Explication approfondie", - "Tip: Update multiple variable slots consecutively by pressing the tab key in the chat input after each replacement.": "Tip: Update multiple variable slots consecutively by pressing the tab key in the chat input after each replacement.", - "Title": "Titre", - "Title (e.g. Tell me a fun fact)": "Titre (par exemple, Dites-moi un fait amusant)", - "Title Auto-Generation": "Génération automatique de titre", - "Title cannot be an empty string.": "Le titre ne peut pas être une chaîne vide.", - "Title Generation Prompt": "Prompt de génération de titre", - "to": "à", - "To access the available model names for downloading,": "Pour accéder aux noms de modèles disponibles pour le téléchargement,", - "To access the GGUF models available for downloading,": "Pour accéder aux modèles GGUF disponibles pour le téléchargement,", - "to chat input.": "à l'entrée du chat.", - "Today": "Aujourd'hui", - "Toggle settings": "Basculer les paramètres", - "Toggle sidebar": "Basculer la barre latérale", - "Top K": "Top K", - "Top P": "Top P", - "Trouble accessing Ollama?": "Problèmes d'accès à Ollama ?", - "TTS Settings": "Paramètres TTS", - "Type Hugging Face Resolve (Download) URL": "Entrez l'URL de résolution (téléchargement) Hugging Face", - "Uh-oh! There was an issue connecting to {{provider}}.": "Uh-oh ! Il y a eu un problème de connexion à {{provider}}.", - "Unknown File Type '{{file_type}}', but accepting and treating as plain text": "Type de fichier inconnu '{{file_type}}', mais accepté et traité comme du texte brut", - "Update and Copy Link": "Mettre à jour et copier le lien", - "Update password": "Mettre à jour le mot de passe", - "Upload a GGUF model": "Téléverser un modèle GGUF", - "Upload files": "Téléverser des fichiers", - "Upload Progress": "Progression du Téléversement", - "URL Mode": "Mode URL", - "Use '#' in the prompt input to load and select your documents.": "Utilisez '#' dans l'entrée du prompt pour charger et sélectionner vos documents.", - "Use Gravatar": "Utiliser Gravatar", - "Use Initials": "Utiliser les Initiales", - "user": "utilisateur", - "User Permissions": "Permissions d'utilisateur", - "Users": "Utilisateurs", - "Utilize": "Utiliser", - "Valid time units:": "Unités de temps valides :", - "variable": "variable", - "variable to have them replaced with clipboard content.": "variable pour les remplacer par le contenu du presse-papiers.", - "Version": "Version", - "Warning: If you update or change your embedding model, you will need to re-import all documents.": "Attention : Si vous mettez à jour ou changez votre modèle d'intégration, vous devrez réimporter tous les documents.", - "Web": "Web", - "Web Loader Settings": "Paramètres du chargeur Web", - "Web Params": "Paramètres Web", - "Webhook URL": "URL Webhook", - "WebUI Add-ons": "Add-ons WebUI", - "WebUI Settings": "Paramètres WebUI", - "WebUI will make requests to": "WebUI effectuera des demandes à", - "What’s New in": "Quoi de neuf dans", - "When history is turned off, new chats on this browser won't appear in your history on any of your devices.": "Lorsque l'historique est désactivé, les nouveaux chats sur ce navigateur n'apparaîtront pas dans votre historique sur aucun de vos appareils.", - "Whisper (Local)": "Whisper (Local)", - "Workspace": "Espace de travail", - "Write a prompt suggestion (e.g. Who are you?)": "Écrivez un prompt (e.x. Qui est-tu ?)", - "Write a summary in 50 words that summarizes [topic or keyword].": "Ecrivez un résumé en 50 mots [sujet ou mot-clé]", - "Yesterday": "hier", - "You": "Vous", - "You cannot clone a base model": "", - "You have no archived conversations.": "Vous n'avez aucune conversation archivée.", - "You have shared this chat": "Vous avez partagé cette conversation.", - "You're a helpful assistant.": "Vous êtes un assistant utile", - "You're now logged in.": "Vous êtes maintenant connecté.", - "Youtube": "Youtube", - "Youtube Loader Settings": "Paramètres du chargeur de Youtube" + "'s', 'm', 'h', 'd', 'w' or '-1' for no expiration.": "'s', 'm', 'h', 'd', 'w' ou '-1' pour aucune expiration.", + "(Beta)": "(Bêta)", + "(e.g. `sh webui.sh --api`)": "(par ex. `sh webui.sh --api`)", + "(latest)": "(plus récent)", + "{{ models }}": "{{ models }}", + "{{ owner }}: You cannot delete a base model": "{{ owner }}: Vous ne pouvez pas supprimer un modèle de base", + "{{modelName}} is thinking...": "{{modelName}} réfléchit...", + "{{user}}'s Chats": "Chats de {{user}}", + "{{webUIName}} Backend Required": "Backend {{webUIName}} requis", + "a user": "un utilisateur", + "About": "À Propos", + "Account": "Compte", + "Accurate information": "Information précise", + "Add": "Ajouter", + "Add a model id": "Ajouter un identifiant modèle", + "Add a short description about what this model does": "Ajouter une courte description de ce que fait ce modèle", + "Add a short title for this prompt": "Ajouter un court titre pour ce prompt", + "Add a tag": "Ajouter un tag", + "Add custom prompt": "Ajouter un prompt personnalisé", + "Add Docs": "Ajouter des Documents", + "Add Files": "Ajouter des Fichiers", + "Add Memory": "Ajouter de la Mémoire", + "Add message": "Ajouter un message", + "Add Model": "Ajouter un Modèle", + "Add Tags": "Ajouter des Tags", + "Add User": "Ajouter un Utilisateur", + "Adjusting these settings will apply changes universally to all users.": "L'ajustement de ces paramètres appliquera les changements à tous les utilisateurs.", + "admin": "admin", + "Admin Panel": "Panneau d'Administration", + "Admin Settings": "Paramètres d'Administration", + "Advanced Parameters": "Paramètres Avancés", + "Advanced Params": "Params Avancés", + "all": "tous", + "All Documents": "Tous les Documents", + "All Users": "Tous les Utilisateurs", + "Allow": "Autoriser", + "Allow Chat Deletion": "Autoriser la suppression du chat", + "alphanumeric characters and hyphens": "caractères alphanumériques et tirets", + "Already have an account?": "Vous avez déjà un compte ?", + "an assistant": "un assistant", + "and": "et", + "and create a new shared link.": "et créer un nouveau lien partagé.", + "API Base URL": "URL de base de l'API", + "API Key": "Clé API", + "API Key created.": "Clé d'API créée.", + "API keys": "Clés API", + "April": "Avril", + "Archive": "Archiver", + "Archived Chats": "Chats Archivés", + "are allowed - Activate this command by typing": "sont autorisés - Activez cette commande en tapant", + "Are you sure?": "Êtes-vous sûr ?", + "Attach file": "Joindre un fichier", + "Attention to detail": "Attention aux détails", + "Audio": "Audio", + "August": "Août", + "Auto-playback response": "Réponse en lecture automatique", + "Auto-send input after 3 sec.": "Envoyer automatiquement l'entrée après 3 sec.", + "AUTOMATIC1111 Base URL": "URL de base AUTOMATIC1111", + "AUTOMATIC1111 Base URL is required.": "L'URL de base AUTOMATIC1111 est requise.", + "available!": "disponible !", + "Back": "Retour", + "Bad Response": "Mauvaise Réponse", + "Base Model (From)": "Modèle de Base (De)", + "before": "avant", + "Being lazy": "Est paresseux", + "Bypass SSL verification for Websites": "Contourner la vérification SSL pour les sites Web.", + "Cancel": "Annuler", + "Capabilities": "Capacités", + "Change Password": "Changer le mot de passe", + "Chat": "Chat", + "Chat Bubble UI": "UI Bulles de Chat", + "Chat direction": "Direction du chat", + "Chat History": "Historique du chat", + "Chat History is off for this browser.": "L'historique du chat est désactivé pour ce navigateur.", + "Chats": "Chats", + "Check Again": "Vérifier à nouveau", + "Check for updates": "Vérifier les mises à jour", + "Checking for updates...": "Vérification des mises à jour...", + "Choose a model before saving...": "Choisissez un modèle avant d'enregistrer...", + "Chunk Overlap": "Chevauchement de bloc", + "Chunk Params": "Paramètres de bloc", + "Chunk Size": "Taille de bloc", + "Citation": "Citation", + "Click here for help.": "Cliquez ici pour de l'aide.", + "Click here to": "Cliquez ici pour", + "Click here to select": "Cliquez ici pour sélectionner", + "Click here to select a csv file.": "Cliquez ici pour sélectionner un fichier csv.", + "Click here to select documents.": "Cliquez ici pour sélectionner des documents.", + "click here.": "cliquez ici.", + "Click on the user role button to change a user's role.": "Cliquez sur le bouton de rôle d'utilisateur pour changer le rôle d'un utilisateur.", + "Close": "Fermer", + "Collection": "Collection", + "ComfyUI": "ComfyUI", + "ComfyUI Base URL": "URL de base ComfyUI", + "ComfyUI Base URL is required.": "L'URL de base ComfyUI est requise.", + "Command": "Commande", + "Confirm Password": "Confirmer le mot de passe", + "Connections": "Connexions", + "Content": "Contenu", + "Context Length": "Longueur du contexte", + "Continue Response": "Continuer la Réponse", + "Conversation Mode": "Mode de conversation", + "Copied shared chat URL to clipboard!": "URL du chat copié dans le presse-papiers !", + "Copy": "Copier", + "Copy last code block": "Copier le dernier bloc de code", + "Copy last response": "Copier la dernière réponse", + "Copy Link": "Copier le Lien", + "Copying to clipboard was successful!": "La copie dans le presse-papiers a réussi !", + "Create a concise, 3-5 word phrase as a header for the following query, strictly adhering to the 3-5 word limit and avoiding the use of the word 'title':": "Créez une phrase concise de 3-5 mots comme en-tête pour la requête suivante, en respectant strictement la limite de 3-5 mots et en évitant l'utilisation du mot 'titre' :", + "Create a model": "Créer un modèle", + "Create Account": "Créer un compte", + "Create new key": "Créer une nouvelle clé", + "Create new secret key": "Créer une nouvelle clé secrète", + "Created at": "Créé le", + "Created At": "Crée Le", + "Current Model": "Modèle actuel", + "Current Password": "Mot de passe actuel", + "Custom": "Personnalisé", + "Customize models for a specific purpose": "Personnaliser les modèles pour un objectif spécifique", + "Dark": "Sombre", + "Dashboard": "Tableau de bord", + "Database": "Base de données", + "December": "Décembre", + "Default": "Par défaut", + "Default (Automatic1111)": "Par défaut (Automatic1111)", + "Default (SentenceTransformers)": "Par défaut (SentenceTransformers)", + "Default (Web API)": "Par défaut (API Web)", + "Default model updated": "Modèle par défaut mis à jour", + "Default Prompt Suggestions": "Suggestions de prompt par défaut", + "Default User Role": "Rôle d'utilisateur par défaut", + "delete": "supprimer", + "Delete": "Supprimer", + "Delete a model": "Supprimer un modèle", + "Delete chat": "Supprimer le chat", + "Delete Chat": "Supprimer le Chat", + "Delete Chats": "Supprimer les chats", + "delete this link": "supprimer ce lien", + "Delete User": "Supprimer l'Utilisateur", + "Deleted {{deleteModelTag}}": "{{deleteModelTag}} supprimé", + "Deleted {{name}}": "{{name}} supprimé", + "Description": "Description", + "Didn't fully follow instructions": "N'a pas suivi entièrement les instructions", + "Disabled": "Désactivé", + "Discover a model": "Découvrir un modèle", + "Discover a prompt": "Découvrir un prompt", + "Discover, download, and explore custom prompts": "Découvrir, télécharger et explorer des prompts personnalisés", + "Discover, download, and explore model presets": "Découvrir, télécharger et explorer des préconfigurations de modèles", + "Display the username instead of You in the Chat": "Afficher le nom d'utilisateur au lieu de 'Vous' dans le Chat", + "Document": "Document", + "Document Settings": "Paramètres du document", + "Documents": "Documents", + "does not make any external connections, and your data stays securely on your locally hosted server.": "ne fait aucune connexion externe, et vos données restent en sécurité sur votre serveur hébergé localement.", + "Don't Allow": "Ne pas autoriser", + "Don't have an account?": "Vous n'avez pas de compte ?", + "Don't like the style": "N'aime pas le style", + "Download": "Télécharger", + "Download canceled": "Téléchargement annulé", + "Download Database": "Télécharger la base de données", + "Drop any files here to add to the conversation": "Déposez des fichiers ici pour les ajouter à la conversation", + "e.g. '30s','10m'. Valid time units are 's', 'm', 'h'.": "par ex. '30s', '10m'. Les unités de temps valides sont 's', 'm', 'h'.", + "Edit": "Éditer", + "Edit Doc": "Éditer le document", + "Edit User": "Éditer l'utilisateur", + "Email": "Email", + "Embedding Model": "Modèle pour l'Embedding", + "Embedding Model Engine": "Moteur du Modèle d'Embedding", + "Embedding model set to \"{{embedding_model}}\"": "Modèle d'embedding défini sur \"{{embedding_model}}\"", + "Enable Chat History": "Activer l'historique du chat", + "Enable New Sign Ups": "Activer les nouvelles inscriptions", + "Enabled": "Activé", + "Ensure your CSV file includes 4 columns in this order: Name, Email, Password, Role.": "Vérifiez que le fichier CSV contienne 4 colonnes dans cet ordre : Name (Nom), Email, Password (Mot de passe), Role (Rôle).", + "Enter {{role}} message here": "Entrez le message {{role}} ici", + "Enter a detail about yourself for your LLMs to recall": "Saisissez une donnée vous concernant pour que vos LLMs s'en souviennent", + "Enter Chunk Overlap": "Entrez le chevauchement de bloc", + "Enter Chunk Size": "Entrez la taille du bloc", + "Enter Image Size (e.g. 512x512)": "Entrez la taille de l'image (p. ex. 512x512)", + "Enter language codes": "Entrez les codes du language", + "Enter model tag (e.g. {{modelTag}})": "Entrez le tag du modèle (p. ex. {{modelTag}})", + "Enter Number of Steps (e.g. 50)": "Entrez le nombre d'étapes (p. ex. 50)", + "Enter Score": "Entrez le Score", + "Enter stop sequence": "Entrez la séquence de fin", + "Enter Top K": "Entrez Top K", + "Enter URL (e.g. http://127.0.0.1:7860/)": "Entrez l'URL (p. ex. http://127.0.0.1:7860/)", + "Enter URL (e.g. http://localhost:11434)": "Entrez l'URL (p. ex. http://localhost:11434)", + "Enter Your Email": "Entrez Votre Email", + "Enter Your Full Name": "Entrez Votre Nom Complet", + "Enter Your Password": "Entrez Votre Mot De Passe", + "Enter Your Role": "Entrez Votre Rôle", + "Experimental": "Expérimental", + "Export All Chats (All Users)": "Exporter Tous les Chats (Tous les Utilisateurs)", + "Export Chats": "Exporter les Chats", + "Export Documents Mapping": "Exporter la Correspondance des Documents", + "Export Models": "Exporter les Modèles", + "Export Prompts": "Exporter les Prompts", + "Failed to create API Key.": "Échec de la création de la clé d'API.", + "Failed to read clipboard contents": "Échec de la lecture du contenu du presse-papiers", + "February": "Février", + "Feel free to add specific details": "N'hésitez pas à ajouter des détails spécifiques", + "File Mode": "Mode Fichier", + "File not found.": "Fichier non trouvé.", + "Fingerprint spoofing detected: Unable to use initials as avatar. Defaulting to default profile image.": "Usurpation d'empreinte digitale détectée : Impossible d'utiliser les initiales comme avatar. L'image de profil par défaut sera utilisée.", + "Fluidly stream large external response chunks": "Diffusez de manière fluide de gros morceaux de réponses externes", + "Focus chat input": "Concentrer sur l'entrée du chat", + "Followed instructions perfectly": "A suivi les instructions parfaitement", + "Format your variables using square brackets like this:": "Formatez vos variables en utilisant des crochets comme ceci :", + "Frequencey Penalty": "Pénalité de Fréquence", + "Full Screen Mode": "Mode plein écran", + "General": "Général", + "General Settings": "Paramètres Généraux", + "Generation Info": "Informations de la Génération", + "Good Response": "Bonne Réponse", + "h:mm a": "h:mm a", + "has no conversations.": "n'a pas de conversations.", + "Hello, {{name}}": "Bonjour, {{name}}", + "Help": "Aide", + "Hide": "Cacher", + "How can I help you today?": "Comment puis-je vous aider aujourd'hui ?", + "Hybrid Search": "Recherche Hybride", + "Image Generation (Experimental)": "Génération d'Image (Expérimental)", + "Image Generation Engine": "Moteur de Génération d'Image", + "Image Settings": "Paramètres d'Image", + "Images": "Images", + "Import Chats": "Importer les Chats", + "Import Documents Mapping": "Importer la Correspondance des Documents", + "Import Models": "Importer des Modèles", + "Import Prompts": "Importer des Prompts", + "Include `--api` flag when running stable-diffusion-webui": "Inclure le drapeau `--api` lors de l'exécution de stable-diffusion-webui", + "Input commands": "Entrez les commandes d'entrée", + "Interface": "Interface", + "Invalid Tag": "Tag Invalide", + "January": "Janvier", + "join our Discord for help.": "rejoignez notre Discord pour obtenir de l'aide.", + "JSON": "JSON", + "JSON Preview": "Aperçu JSON", + "July": "Juillet", + "June": "Juin", + "JWT Expiration": "Expiration JWT", + "JWT Token": "Jeton JWT", + "Keep Alive": "Rester en vie", + "Keyboard shortcuts": "Raccourcis clavier", + "Language": "Langue", + "Last Active": "Dernier Activité", + "Light": "Clair", + "Listening...": "Écoute...", + "LLMs can make mistakes. Verify important information.": "Les LLMs peuvent faire des erreurs. Vérifiez les informations importantes.", + "LTR": "LTR", + "Made by OpenWebUI Community": "Réalisé par la communauté OpenWebUI", + "Make sure to enclose them with": "Assurez-vous de les entourer avec", + "Manage Models": "Gérer les modèles", + "Manage Ollama Models": "Gérer les modèles Ollama", + "March": "Mars", + "Max Tokens (num_predict)": "Tokens maximaux (num_predict)", + "Maximum of 3 models can be downloaded simultaneously. Please try again later.": "Un maximum de 3 modèles peut être téléchargé simultanément. Veuillez réessayer plus tard.", + "May": "Mai", + "Memories accessible by LLMs will be shown here.": "Les Mémoires des LLMs apparaîtront ici.", + "Memory": "Mémoire", + "Messages you send after creating your link won't be shared. Users with the URL will be able to view the shared chat.": "Les messages que vous envoyéz après la création du lien ne seront pas partagés. Les utilisateurs disposant de l'URL pourront voir le chat partagé.", + "Minimum Score": "Score Minimum", + "Mirostat": "Mirostat", + "Mirostat Eta": "Mirostat Eta", + "Mirostat Tau": "Mirostat Tau", + "MMMM DD, YYYY": "MMMM DD, YYYY", + "MMMM DD, YYYY HH:mm": "MMMM DD, YYYY HH:mm", + "Model '{{modelName}}' has been successfully downloaded.": "Le modèle '{{modelName}}' a été téléchargé avec succès.", + "Model '{{modelTag}}' is already in queue for downloading.": "Le modèle '{{modelTag}}' est déjà dans la file d'attente pour le téléchargement.", + "Model {{modelId}} not found": "Modèle {{modelId}} non trouvé", + "Model {{modelName}} is not vision capable": "Modèle {{modelName}} n'est pas capable de voir", + "Model filesystem path detected. Model shortname is required for update, cannot continue.": "Chemin du système de fichier du modèle détecté. Le nom court du modèle est requis pour la mise à jour, ne peut pas continuer.", + "Model ID": "ID du Modèle", + "Model not selected": "Modèle non sélectionné", + "Model Params": "Paramètres du Modèle", + "Model Whitelisting": "Liste Blanche de Modèle", + "Model(s) Whitelisted": "Modèle(s) sur Liste Blanche", + "Modelfile Content": "Contenu du Fichier de Modèle", + "Models": "Modèles", + "More": "Plus", + "Name": "Nom", + "Name Tag": "Tag de Nom", + "Name your model": "Nommez votre modèle", + "New Chat": "Nouveau chat", + "New Password": "Nouveau mot de passe", + "No results found": "Aucun résultat", + "No source available": "Aucune source disponible", + "Not factually correct": "Faits incorrects", + "Note: If you set a minimum score, the search will only return documents with a score greater than or equal to the minimum score.": "Note : Si vous définissez un score minimum, la recherche ne renverra que les documents ayant un score supérieur ou égal au score minimum.", + "Notifications": "Notifications de bureau", + "November": "Novembre", + "October": "Octobre", + "Off": "Désactivé", + "Okay, Let's Go!": "D'accord, allons-y !", + "OLED Dark": "Sombre OLED", + "Ollama": "Ollama", + "Ollama API": "API Ollama", + "Ollama Version": "Version Ollama", + "On": "Activé", + "Only": "Seulement", + "Only alphanumeric characters and hyphens are allowed in the command string.": "Seuls les caractères alphanumériques et les tirets sont autorisés dans la chaîne de commande.", + "Oops! Hold tight! Your files are still in the processing oven. We're cooking them up to perfection. Please be patient and we'll let you know once they're ready.": "Oups ! Tenez bon ! Vos fichiers sont encore dans le four. Nous les cuisinons à la perfection. Soyez patient et nous vous informerons dès qu'ils seront prêts.", + "Oops! Looks like the URL is invalid. Please double-check and try again.": "Oups ! On dirait que l'URL est invalide. Vérifiez et réessayez.", + "Oops! You're using an unsupported method (frontend only). Please serve the WebUI from the backend.": "Oups ! Vous utilisez une méthode non-supportée (frontend uniquement). Veuillez également servir WebUI depuis le backend.", + "Open": "Ouvrir", + "Open AI": "Open AI", + "Open AI (Dall-E)": "Open AI (Dall-E)", + "Open new chat": "Ouvrir un nouveau chat", + "OpenAI": "OpenAI", + "OpenAI API": "API OpenAI", + "OpenAI API Config": "Config API OpenAI", + "OpenAI API Key is required.": "La clé d'API OpenAI est requise.", + "OpenAI URL/Key required.": "URL/Clé OpenAI requise.", + "or": "ou", + "Other": "Autre", + "Overview": "Aperçu", + "Password": "Mot de passe", + "PDF document (.pdf)": "Document PDF (.pdf)", + "PDF Extract Images (OCR)": "Extraction d'images PDF (OCR)", + "pending": "en attente", + "Permission denied when accessing microphone: {{error}}": "Permission refusée lors de l'accès au microphone : {{error}}", + "Personalization": "Personnalisation", + "Plain text (.txt)": "Texte Brute (.txt)", + "Playground": "Aire de jeu", + "Positive attitude": "Attitude Positive", + "Previous 30 days": "30 jours précédents", + "Previous 7 days": "7 jours précédents", + "Profile Image": "Image du Profil", + "Prompt": "Prompt", + "Prompt (e.g. Tell me a fun fact about the Roman Empire)": "Prompt (p. ex. Raconte moi un fait amusant sur l'Empire Romain)", + "Prompt Content": "Contenu du prompt", + "Prompt suggestions": "Suggestions de prompt", + "Prompts": "Prompts", + "Pull \"{{searchValue}}\" from Ollama.com": "Récupérer \"{{searchValue}}\" de Ollama.com", + "Pull a model from Ollama.com": "Récupérer un modèle de Ollama.com", + "Query Params": "Paramètres de Requête", + "RAG Template": "Modèle RAG", + "Read Aloud": "Lire à Voix Haute", + "Record voice": "Enregistrer la voix", + "Redirecting you to OpenWebUI Community": "Redirection vers la communauté OpenWebUI", + "Refused when it shouldn't have": "Refuse quand il ne devrait pas", + "Regenerate": "Regénérer", + "Release Notes": "Notes de Version", + "Remove": "Retirer", + "Remove Model": "Retirer le Modèle", + "Rename": "Renommer", + "Repeat Last N": "Répéter les Derniers N", + "Request Mode": "Mode de Demande", + "Reranking Model": "Modèle de Reclassement", + "Reranking model disabled": "Modèle de Reclassement Désactivé", + "Reranking model set to \"{{reranking_model}}\"": "Modèle de reclassement défini sur \"{{reranking_model}}\"", + "Reset Vector Storage": "Réinitialiser le Stockage de Vecteur", + "Response AutoCopy to Clipboard": "Copie Automatique de la Réponse dans le Presse-papiers", + "Role": "Rôle", + "Rosé Pine": "Pin Rosé", + "Rosé Pine Dawn": "Aube Pin Rosé", + "RTL": "RTL", + "Save": "Enregistrer", + "Save & Create": "Enregistrer & Créer", + "Save & Update": "Enregistrer & Mettre à jour", + "Saving chat logs directly to your browser's storage is no longer supported. Please take a moment to download and delete your chat logs by clicking the button below. Don't worry, you can easily re-import your chat logs to the backend through": "La sauvegarde des chat directement dans le stockage de votre navigateur n'est plus prise en charge. Veuillez prendre un moment pour télécharger et supprimer vos journaux de chat en cliquant sur le bouton ci-dessous. Ne vous inquiétez pas, vous pouvez facilement importer vos sauvegardes de chat via", + "Scan": "Scanner", + "Scan complete!": "Scan terminé !", + "Scan for documents from {{path}}": "Scanner des documents depuis {{path}}", + "Search": "Recherche", + "Search a model": "Rechercher un modèle", + "Search Documents": "Rechercher des Documents", + "Search Prompts": "Rechercher des Prompts", + "See readme.md for instructions": "Voir readme.md pour les instructions", + "See what's new": "Voir les nouveautés", + "Seed": "Graine", + "Select a base model": "Sélectionner un modèle de base", + "Select a mode": "Sélectionner un mode", + "Select a model": "Sélectionner un modèle", + "Select an Ollama instance": "Sélectionner une instance Ollama", + "Select model": "Sélectionner un modèle", + "Selected model(s) do not support image inputs": "Modèle(s) séléctionés ne supportent pas les entrées images", + "Send": "Envoyer", + "Send a Message": "Envoyer un message", + "Send message": "Envoyer un message", + "September": "Septembre", + "Server connection verified": "Connexion au serveur vérifiée", + "Set as default": "Définir par défaut", + "Set Default Model": "Définir le Modèle par Défaut", + "Set embedding model (e.g. {{model}})": "Définir le modèle d'embedding (p. ex. {{model}})", + "Set Image Size": "Définir la Taille de l'Image", + "Set Model": "Définir le Modèle", + "Set reranking model (e.g. {{model}})": "Définir le modèle de reclassement (p. ex. {{model}})", + "Set Steps": "Définir les Étapes", + "Set Title Auto-Generation Model": "Définir le Modèle de Génération Automatique de Titre", + "Set Voice": "Définir la Voix", + "Settings": "Paramètres", + "Settings saved successfully!": "Paramètres enregistrés avec succès !", + "Share": "Partager", + "Share Chat": "Partager le Chat", + "Share to OpenWebUI Community": "Partager avec la communauté OpenWebUI", + "short-summary": "résumé court", + "Show": "Montrer", + "Show shortcuts": "Afficher les raccourcis", + "Showcased creativity": "Créativité affichée", + "sidebar": "barre latérale", + "Sign in": "Se connecter", + "Sign Out": "Se déconnecter", + "Sign up": "S'inscrire", + "Signing in": "Connexion en cours", + "Source": "Source", + "Speech recognition error: {{error}}": "Erreur de reconnaissance vocale : {{error}}", + "Speech-to-Text Engine": "Moteur de Reconnaissance Vocale", + "SpeechRecognition API is not supported in this browser.": "L'API SpeechRecognition n'est pas prise en charge dans ce navigateur.", + "Stop Sequence": "Séquence d'Arrêt", + "STT Settings": "Paramètres STT", + "Submit": "Envoyer", + "Subtitle (e.g. about the Roman Empire)": "Sous-Titres (p. ex. à propos de l'Empire Romain)", + "Success": "Succès", + "Successfully updated.": "Mis à jour avec succès.", + "Suggested": "Suggéré", + "System": "Système", + "System Prompt": "Prompt du Système", + "Tags": "Tags", + "Tell us more:": "Dites-nous en plus :", + "Temperature": "Température", + "Template": "Modèle", + "Text Completion": "Complétion de Texte", + "Text-to-Speech Engine": "Moteur de Synthèse Vocale", + "Tfs Z": "Tfs Z", + "Thanks for your feedback!": "Merci pour votre avis !", + "The score should be a value between 0.0 (0%) and 1.0 (100%).": "Le score devrait avoir une valeur entre 0.0 (0%) et 1.0 (100%).", + "Theme": "Thème", + "This ensures that your valuable conversations are securely saved to your backend database. Thank you!": "Cela garantit que vos précieuses conversations sont en sécurité dans votre base de données. Merci !", + "This setting does not sync across browsers or devices.": "Ce paramètre ne se synchronise pas entre les navigateurs ou les appareils.", + "Thorough explanation": "Explication détaillée", + "Tip: Update multiple variable slots consecutively by pressing the tab key in the chat input after each replacement.": "Conseil : Mettez à jour plusieurs emplacements de variables consécutivement en appuyant sur la touche tab dans l'entrée de chat après chaque remplacement", + "Title": "Titre", + "Title (e.g. Tell me a fun fact)": "Titre (p. ex. Donne moi un fait amusant)", + "Title Auto-Generation": "Génération Automatique du Titre", + "Title cannot be an empty string.": "Le Titre ne peut pas être vide.", + "Title Generation Prompt": "Prompt de Génération du Titre", + "to": "à", + "To access the available model names for downloading,": "Pour accéder aux noms de modèles disponibles pour le téléchargement,", + "To access the GGUF models available for downloading,": "Pour accéder aux modèles GGUF disponibles pour le téléchargement,", + "to chat input.": "à l'entrée du chat.", + "Today": "Aujourd'hui", + "Toggle settings": "Basculer les paramètres", + "Toggle sidebar": "Basculer la barre latérale", + "Top K": "Top K", + "Top P": "Top P", + "Trouble accessing Ollama?": "Problèmes d'accès à Ollama ?", + "TTS Settings": "Paramètres TTS", + "Type Hugging Face Resolve (Download) URL": "Entrez l'URL de Résolution (Téléchargement) Hugging Face", + "Uh-oh! There was an issue connecting to {{provider}}.": "Uh-oh ! Il y a eu un problème de connexion à {{provider}}.", + "Unknown File Type '{{file_type}}', but accepting and treating as plain text": "Type de Fichier Inconnu '{{file_type}}', mais accepté et traité comme du texte brut", + "Update and Copy Link": "Mettre à Jour et Copier le Lien", + "Update password": "Mettre à Jour le Mot de Passe", + "Upload a GGUF model": "Téléverser un modèle GGUF", + "Upload files": "Téléverser des fichiers", + "Upload Progress": "Progression du Téléversement", + "URL Mode": "Mode URL", + "Use '#' in the prompt input to load and select your documents.": "Utilisez '#' dans l'entrée du prompt pour charger et sélectionner vos documents.", + "Use Gravatar": "Utiliser Gravatar", + "Use Initials": "Utiliser les Initiales", + "user": "utilisateur", + "User Permissions": "Permissions d'utilisateur", + "Users": "Utilisateurs", + "Utilize": "Utiliser", + "Valid time units:": "Unités de temps valides :", + "variable": "variable", + "variable to have them replaced with clipboard content.": "variable pour les remplacer par le contenu du presse-papiers.", + "Version": "Version", + "Warning: If you update or change your embedding model, you will need to re-import all documents.": "Avertissement : Si vous mettez à jour ou modifier votre modèle d'embedding, vous devrez réimporter tous les documents.", + "Web": "Web", + "Web Loader Settings": "Paramètres du Chargeur Web", + "Web Params": "Paramètres Web", + "Webhook URL": "URL du Webhook", + "WebUI Add-ons": "Add-ons WebUI", + "WebUI Settings": "Paramètres WebUI", + "WebUI will make requests to": "WebUI effectuera des demandes à", + "What’s New in": "Quoi de neuf dans", + "When history is turned off, new chats on this browser won't appear in your history on any of your devices.": "Lorsque l'historique est désactivé, les nouveaux chats sur ce navigateur n'apparaîtront pas dans votre historique sur aucun de vos appareils.", + "Whisper (Local)": "Whisper (Local)", + "Workspace": "Espace de Travail", + "Write a prompt suggestion (e.g. Who are you?)": "Écrivez une suggestion de prompt (e.x. Qui est-tu ?)", + "Write a summary in 50 words that summarizes [topic or keyword].": "Ecrivez un résumé en 50 mots qui résume [sujet ou mot-clé]", + "Yesterday": "Hier", + "You": "Vous", + "You cannot clone a base model": "Vous ne pouvez pas cloner un modèle de base", + "You have no archived conversations.": "Vous n'avez pas de conversations archivées", + "You have shared this chat": "Vous avez partagé ce chat", + "You're a helpful assistant.": "Vous êtes un assistant utile.", + "You're now logged in.": "Vous êtes maintenant connecté.", + "Youtube": "Youtube", + "Youtube Loader Settings": "Paramètres du Chargeur YouTube" } From b936c9bff7d82049c97f1b5af560d21cab2a0b08 Mon Sep 17 00:00:00 2001 From: Kubik <84036232+KodeurKubik@users.noreply.github.com> Date: Sat, 25 May 2024 14:40:42 +0300 Subject: [PATCH 04/28] Tabs back (idk my editor changed it to spaces) --- src/lib/i18n/locales/fr-FR/translation.json | 974 ++++++++++---------- 1 file changed, 487 insertions(+), 487 deletions(-) diff --git a/src/lib/i18n/locales/fr-FR/translation.json b/src/lib/i18n/locales/fr-FR/translation.json index 7071bd9a9a..e69d6add13 100644 --- a/src/lib/i18n/locales/fr-FR/translation.json +++ b/src/lib/i18n/locales/fr-FR/translation.json @@ -1,489 +1,489 @@ { - "'s', 'm', 'h', 'd', 'w' or '-1' for no expiration.": "'s', 'm', 'h', 'd', 'w' ou '-1' pour aucune expiration.", - "(Beta)": "(Bêta)", - "(e.g. `sh webui.sh --api`)": "(par ex. `sh webui.sh --api`)", - "(latest)": "(plus récent)", - "{{ models }}": "{{ models }}", - "{{ owner }}: You cannot delete a base model": "{{ owner }}: Vous ne pouvez pas supprimer un modèle de base", - "{{modelName}} is thinking...": "{{modelName}} réfléchit...", - "{{user}}'s Chats": "Chats de {{user}}", - "{{webUIName}} Backend Required": "Backend {{webUIName}} requis", - "a user": "un utilisateur", - "About": "À Propos", - "Account": "Compte", - "Accurate information": "Information précise", - "Add": "Ajouter", - "Add a model id": "Ajouter un identifiant modèle", - "Add a short description about what this model does": "Ajouter une courte description de ce que fait ce modèle", - "Add a short title for this prompt": "Ajouter un court titre pour ce prompt", - "Add a tag": "Ajouter un tag", - "Add custom prompt": "Ajouter un prompt personnalisé", - "Add Docs": "Ajouter des Documents", - "Add Files": "Ajouter des Fichiers", - "Add Memory": "Ajouter de la Mémoire", - "Add message": "Ajouter un message", - "Add Model": "Ajouter un Modèle", - "Add Tags": "Ajouter des Tags", - "Add User": "Ajouter un Utilisateur", - "Adjusting these settings will apply changes universally to all users.": "L'ajustement de ces paramètres appliquera les changements à tous les utilisateurs.", - "admin": "admin", - "Admin Panel": "Panneau d'Administration", - "Admin Settings": "Paramètres d'Administration", - "Advanced Parameters": "Paramètres Avancés", - "Advanced Params": "Params Avancés", - "all": "tous", - "All Documents": "Tous les Documents", - "All Users": "Tous les Utilisateurs", - "Allow": "Autoriser", - "Allow Chat Deletion": "Autoriser la suppression du chat", - "alphanumeric characters and hyphens": "caractères alphanumériques et tirets", - "Already have an account?": "Vous avez déjà un compte ?", - "an assistant": "un assistant", - "and": "et", - "and create a new shared link.": "et créer un nouveau lien partagé.", - "API Base URL": "URL de base de l'API", - "API Key": "Clé API", - "API Key created.": "Clé d'API créée.", - "API keys": "Clés API", - "April": "Avril", - "Archive": "Archiver", - "Archived Chats": "Chats Archivés", - "are allowed - Activate this command by typing": "sont autorisés - Activez cette commande en tapant", - "Are you sure?": "Êtes-vous sûr ?", - "Attach file": "Joindre un fichier", - "Attention to detail": "Attention aux détails", - "Audio": "Audio", - "August": "Août", - "Auto-playback response": "Réponse en lecture automatique", - "Auto-send input after 3 sec.": "Envoyer automatiquement l'entrée après 3 sec.", - "AUTOMATIC1111 Base URL": "URL de base AUTOMATIC1111", - "AUTOMATIC1111 Base URL is required.": "L'URL de base AUTOMATIC1111 est requise.", - "available!": "disponible !", - "Back": "Retour", - "Bad Response": "Mauvaise Réponse", - "Base Model (From)": "Modèle de Base (De)", - "before": "avant", - "Being lazy": "Est paresseux", - "Bypass SSL verification for Websites": "Contourner la vérification SSL pour les sites Web.", - "Cancel": "Annuler", - "Capabilities": "Capacités", - "Change Password": "Changer le mot de passe", - "Chat": "Chat", - "Chat Bubble UI": "UI Bulles de Chat", - "Chat direction": "Direction du chat", - "Chat History": "Historique du chat", - "Chat History is off for this browser.": "L'historique du chat est désactivé pour ce navigateur.", - "Chats": "Chats", - "Check Again": "Vérifier à nouveau", - "Check for updates": "Vérifier les mises à jour", - "Checking for updates...": "Vérification des mises à jour...", - "Choose a model before saving...": "Choisissez un modèle avant d'enregistrer...", - "Chunk Overlap": "Chevauchement de bloc", - "Chunk Params": "Paramètres de bloc", - "Chunk Size": "Taille de bloc", - "Citation": "Citation", - "Click here for help.": "Cliquez ici pour de l'aide.", - "Click here to": "Cliquez ici pour", - "Click here to select": "Cliquez ici pour sélectionner", - "Click here to select a csv file.": "Cliquez ici pour sélectionner un fichier csv.", - "Click here to select documents.": "Cliquez ici pour sélectionner des documents.", - "click here.": "cliquez ici.", - "Click on the user role button to change a user's role.": "Cliquez sur le bouton de rôle d'utilisateur pour changer le rôle d'un utilisateur.", - "Close": "Fermer", - "Collection": "Collection", - "ComfyUI": "ComfyUI", - "ComfyUI Base URL": "URL de base ComfyUI", - "ComfyUI Base URL is required.": "L'URL de base ComfyUI est requise.", - "Command": "Commande", - "Confirm Password": "Confirmer le mot de passe", - "Connections": "Connexions", - "Content": "Contenu", - "Context Length": "Longueur du contexte", - "Continue Response": "Continuer la Réponse", - "Conversation Mode": "Mode de conversation", - "Copied shared chat URL to clipboard!": "URL du chat copié dans le presse-papiers !", - "Copy": "Copier", - "Copy last code block": "Copier le dernier bloc de code", - "Copy last response": "Copier la dernière réponse", - "Copy Link": "Copier le Lien", - "Copying to clipboard was successful!": "La copie dans le presse-papiers a réussi !", - "Create a concise, 3-5 word phrase as a header for the following query, strictly adhering to the 3-5 word limit and avoiding the use of the word 'title':": "Créez une phrase concise de 3-5 mots comme en-tête pour la requête suivante, en respectant strictement la limite de 3-5 mots et en évitant l'utilisation du mot 'titre' :", - "Create a model": "Créer un modèle", - "Create Account": "Créer un compte", - "Create new key": "Créer une nouvelle clé", - "Create new secret key": "Créer une nouvelle clé secrète", - "Created at": "Créé le", - "Created At": "Crée Le", - "Current Model": "Modèle actuel", - "Current Password": "Mot de passe actuel", - "Custom": "Personnalisé", - "Customize models for a specific purpose": "Personnaliser les modèles pour un objectif spécifique", - "Dark": "Sombre", - "Dashboard": "Tableau de bord", - "Database": "Base de données", - "December": "Décembre", - "Default": "Par défaut", - "Default (Automatic1111)": "Par défaut (Automatic1111)", - "Default (SentenceTransformers)": "Par défaut (SentenceTransformers)", - "Default (Web API)": "Par défaut (API Web)", - "Default model updated": "Modèle par défaut mis à jour", - "Default Prompt Suggestions": "Suggestions de prompt par défaut", - "Default User Role": "Rôle d'utilisateur par défaut", - "delete": "supprimer", - "Delete": "Supprimer", - "Delete a model": "Supprimer un modèle", - "Delete chat": "Supprimer le chat", - "Delete Chat": "Supprimer le Chat", - "Delete Chats": "Supprimer les chats", - "delete this link": "supprimer ce lien", - "Delete User": "Supprimer l'Utilisateur", - "Deleted {{deleteModelTag}}": "{{deleteModelTag}} supprimé", - "Deleted {{name}}": "{{name}} supprimé", - "Description": "Description", - "Didn't fully follow instructions": "N'a pas suivi entièrement les instructions", - "Disabled": "Désactivé", - "Discover a model": "Découvrir un modèle", - "Discover a prompt": "Découvrir un prompt", - "Discover, download, and explore custom prompts": "Découvrir, télécharger et explorer des prompts personnalisés", - "Discover, download, and explore model presets": "Découvrir, télécharger et explorer des préconfigurations de modèles", - "Display the username instead of You in the Chat": "Afficher le nom d'utilisateur au lieu de 'Vous' dans le Chat", - "Document": "Document", - "Document Settings": "Paramètres du document", - "Documents": "Documents", - "does not make any external connections, and your data stays securely on your locally hosted server.": "ne fait aucune connexion externe, et vos données restent en sécurité sur votre serveur hébergé localement.", - "Don't Allow": "Ne pas autoriser", - "Don't have an account?": "Vous n'avez pas de compte ?", - "Don't like the style": "N'aime pas le style", - "Download": "Télécharger", - "Download canceled": "Téléchargement annulé", - "Download Database": "Télécharger la base de données", - "Drop any files here to add to the conversation": "Déposez des fichiers ici pour les ajouter à la conversation", - "e.g. '30s','10m'. Valid time units are 's', 'm', 'h'.": "par ex. '30s', '10m'. Les unités de temps valides sont 's', 'm', 'h'.", - "Edit": "Éditer", - "Edit Doc": "Éditer le document", - "Edit User": "Éditer l'utilisateur", - "Email": "Email", - "Embedding Model": "Modèle pour l'Embedding", - "Embedding Model Engine": "Moteur du Modèle d'Embedding", - "Embedding model set to \"{{embedding_model}}\"": "Modèle d'embedding défini sur \"{{embedding_model}}\"", - "Enable Chat History": "Activer l'historique du chat", - "Enable New Sign Ups": "Activer les nouvelles inscriptions", - "Enabled": "Activé", - "Ensure your CSV file includes 4 columns in this order: Name, Email, Password, Role.": "Vérifiez que le fichier CSV contienne 4 colonnes dans cet ordre : Name (Nom), Email, Password (Mot de passe), Role (Rôle).", - "Enter {{role}} message here": "Entrez le message {{role}} ici", - "Enter a detail about yourself for your LLMs to recall": "Saisissez une donnée vous concernant pour que vos LLMs s'en souviennent", - "Enter Chunk Overlap": "Entrez le chevauchement de bloc", - "Enter Chunk Size": "Entrez la taille du bloc", - "Enter Image Size (e.g. 512x512)": "Entrez la taille de l'image (p. ex. 512x512)", - "Enter language codes": "Entrez les codes du language", - "Enter model tag (e.g. {{modelTag}})": "Entrez le tag du modèle (p. ex. {{modelTag}})", - "Enter Number of Steps (e.g. 50)": "Entrez le nombre d'étapes (p. ex. 50)", - "Enter Score": "Entrez le Score", - "Enter stop sequence": "Entrez la séquence de fin", - "Enter Top K": "Entrez Top K", - "Enter URL (e.g. http://127.0.0.1:7860/)": "Entrez l'URL (p. ex. http://127.0.0.1:7860/)", - "Enter URL (e.g. http://localhost:11434)": "Entrez l'URL (p. ex. http://localhost:11434)", - "Enter Your Email": "Entrez Votre Email", - "Enter Your Full Name": "Entrez Votre Nom Complet", - "Enter Your Password": "Entrez Votre Mot De Passe", - "Enter Your Role": "Entrez Votre Rôle", - "Experimental": "Expérimental", - "Export All Chats (All Users)": "Exporter Tous les Chats (Tous les Utilisateurs)", - "Export Chats": "Exporter les Chats", - "Export Documents Mapping": "Exporter la Correspondance des Documents", - "Export Models": "Exporter les Modèles", - "Export Prompts": "Exporter les Prompts", - "Failed to create API Key.": "Échec de la création de la clé d'API.", - "Failed to read clipboard contents": "Échec de la lecture du contenu du presse-papiers", - "February": "Février", - "Feel free to add specific details": "N'hésitez pas à ajouter des détails spécifiques", - "File Mode": "Mode Fichier", - "File not found.": "Fichier non trouvé.", - "Fingerprint spoofing detected: Unable to use initials as avatar. Defaulting to default profile image.": "Usurpation d'empreinte digitale détectée : Impossible d'utiliser les initiales comme avatar. L'image de profil par défaut sera utilisée.", - "Fluidly stream large external response chunks": "Diffusez de manière fluide de gros morceaux de réponses externes", - "Focus chat input": "Concentrer sur l'entrée du chat", - "Followed instructions perfectly": "A suivi les instructions parfaitement", - "Format your variables using square brackets like this:": "Formatez vos variables en utilisant des crochets comme ceci :", - "Frequencey Penalty": "Pénalité de Fréquence", - "Full Screen Mode": "Mode plein écran", - "General": "Général", - "General Settings": "Paramètres Généraux", - "Generation Info": "Informations de la Génération", - "Good Response": "Bonne Réponse", - "h:mm a": "h:mm a", - "has no conversations.": "n'a pas de conversations.", - "Hello, {{name}}": "Bonjour, {{name}}", - "Help": "Aide", - "Hide": "Cacher", - "How can I help you today?": "Comment puis-je vous aider aujourd'hui ?", - "Hybrid Search": "Recherche Hybride", - "Image Generation (Experimental)": "Génération d'Image (Expérimental)", - "Image Generation Engine": "Moteur de Génération d'Image", - "Image Settings": "Paramètres d'Image", - "Images": "Images", - "Import Chats": "Importer les Chats", - "Import Documents Mapping": "Importer la Correspondance des Documents", - "Import Models": "Importer des Modèles", - "Import Prompts": "Importer des Prompts", - "Include `--api` flag when running stable-diffusion-webui": "Inclure le drapeau `--api` lors de l'exécution de stable-diffusion-webui", - "Input commands": "Entrez les commandes d'entrée", - "Interface": "Interface", - "Invalid Tag": "Tag Invalide", - "January": "Janvier", - "join our Discord for help.": "rejoignez notre Discord pour obtenir de l'aide.", - "JSON": "JSON", - "JSON Preview": "Aperçu JSON", - "July": "Juillet", - "June": "Juin", - "JWT Expiration": "Expiration JWT", - "JWT Token": "Jeton JWT", - "Keep Alive": "Rester en vie", - "Keyboard shortcuts": "Raccourcis clavier", - "Language": "Langue", - "Last Active": "Dernier Activité", - "Light": "Clair", - "Listening...": "Écoute...", - "LLMs can make mistakes. Verify important information.": "Les LLMs peuvent faire des erreurs. Vérifiez les informations importantes.", - "LTR": "LTR", - "Made by OpenWebUI Community": "Réalisé par la communauté OpenWebUI", - "Make sure to enclose them with": "Assurez-vous de les entourer avec", - "Manage Models": "Gérer les modèles", - "Manage Ollama Models": "Gérer les modèles Ollama", - "March": "Mars", - "Max Tokens (num_predict)": "Tokens maximaux (num_predict)", - "Maximum of 3 models can be downloaded simultaneously. Please try again later.": "Un maximum de 3 modèles peut être téléchargé simultanément. Veuillez réessayer plus tard.", - "May": "Mai", - "Memories accessible by LLMs will be shown here.": "Les Mémoires des LLMs apparaîtront ici.", - "Memory": "Mémoire", - "Messages you send after creating your link won't be shared. Users with the URL will be able to view the shared chat.": "Les messages que vous envoyéz après la création du lien ne seront pas partagés. Les utilisateurs disposant de l'URL pourront voir le chat partagé.", - "Minimum Score": "Score Minimum", - "Mirostat": "Mirostat", - "Mirostat Eta": "Mirostat Eta", - "Mirostat Tau": "Mirostat Tau", - "MMMM DD, YYYY": "MMMM DD, YYYY", - "MMMM DD, YYYY HH:mm": "MMMM DD, YYYY HH:mm", - "Model '{{modelName}}' has been successfully downloaded.": "Le modèle '{{modelName}}' a été téléchargé avec succès.", - "Model '{{modelTag}}' is already in queue for downloading.": "Le modèle '{{modelTag}}' est déjà dans la file d'attente pour le téléchargement.", - "Model {{modelId}} not found": "Modèle {{modelId}} non trouvé", - "Model {{modelName}} is not vision capable": "Modèle {{modelName}} n'est pas capable de voir", - "Model filesystem path detected. Model shortname is required for update, cannot continue.": "Chemin du système de fichier du modèle détecté. Le nom court du modèle est requis pour la mise à jour, ne peut pas continuer.", - "Model ID": "ID du Modèle", - "Model not selected": "Modèle non sélectionné", - "Model Params": "Paramètres du Modèle", - "Model Whitelisting": "Liste Blanche de Modèle", - "Model(s) Whitelisted": "Modèle(s) sur Liste Blanche", - "Modelfile Content": "Contenu du Fichier de Modèle", - "Models": "Modèles", - "More": "Plus", - "Name": "Nom", - "Name Tag": "Tag de Nom", - "Name your model": "Nommez votre modèle", - "New Chat": "Nouveau chat", - "New Password": "Nouveau mot de passe", - "No results found": "Aucun résultat", - "No source available": "Aucune source disponible", - "Not factually correct": "Faits incorrects", - "Note: If you set a minimum score, the search will only return documents with a score greater than or equal to the minimum score.": "Note : Si vous définissez un score minimum, la recherche ne renverra que les documents ayant un score supérieur ou égal au score minimum.", - "Notifications": "Notifications de bureau", - "November": "Novembre", - "October": "Octobre", - "Off": "Désactivé", - "Okay, Let's Go!": "D'accord, allons-y !", - "OLED Dark": "Sombre OLED", - "Ollama": "Ollama", - "Ollama API": "API Ollama", - "Ollama Version": "Version Ollama", - "On": "Activé", - "Only": "Seulement", - "Only alphanumeric characters and hyphens are allowed in the command string.": "Seuls les caractères alphanumériques et les tirets sont autorisés dans la chaîne de commande.", - "Oops! Hold tight! Your files are still in the processing oven. We're cooking them up to perfection. Please be patient and we'll let you know once they're ready.": "Oups ! Tenez bon ! Vos fichiers sont encore dans le four. Nous les cuisinons à la perfection. Soyez patient et nous vous informerons dès qu'ils seront prêts.", - "Oops! Looks like the URL is invalid. Please double-check and try again.": "Oups ! On dirait que l'URL est invalide. Vérifiez et réessayez.", - "Oops! You're using an unsupported method (frontend only). Please serve the WebUI from the backend.": "Oups ! Vous utilisez une méthode non-supportée (frontend uniquement). Veuillez également servir WebUI depuis le backend.", - "Open": "Ouvrir", - "Open AI": "Open AI", - "Open AI (Dall-E)": "Open AI (Dall-E)", - "Open new chat": "Ouvrir un nouveau chat", - "OpenAI": "OpenAI", - "OpenAI API": "API OpenAI", - "OpenAI API Config": "Config API OpenAI", - "OpenAI API Key is required.": "La clé d'API OpenAI est requise.", - "OpenAI URL/Key required.": "URL/Clé OpenAI requise.", - "or": "ou", - "Other": "Autre", - "Overview": "Aperçu", - "Password": "Mot de passe", - "PDF document (.pdf)": "Document PDF (.pdf)", - "PDF Extract Images (OCR)": "Extraction d'images PDF (OCR)", - "pending": "en attente", - "Permission denied when accessing microphone: {{error}}": "Permission refusée lors de l'accès au microphone : {{error}}", - "Personalization": "Personnalisation", - "Plain text (.txt)": "Texte Brute (.txt)", - "Playground": "Aire de jeu", - "Positive attitude": "Attitude Positive", - "Previous 30 days": "30 jours précédents", - "Previous 7 days": "7 jours précédents", - "Profile Image": "Image du Profil", - "Prompt": "Prompt", - "Prompt (e.g. Tell me a fun fact about the Roman Empire)": "Prompt (p. ex. Raconte moi un fait amusant sur l'Empire Romain)", - "Prompt Content": "Contenu du prompt", - "Prompt suggestions": "Suggestions de prompt", - "Prompts": "Prompts", - "Pull \"{{searchValue}}\" from Ollama.com": "Récupérer \"{{searchValue}}\" de Ollama.com", - "Pull a model from Ollama.com": "Récupérer un modèle de Ollama.com", - "Query Params": "Paramètres de Requête", - "RAG Template": "Modèle RAG", - "Read Aloud": "Lire à Voix Haute", - "Record voice": "Enregistrer la voix", - "Redirecting you to OpenWebUI Community": "Redirection vers la communauté OpenWebUI", - "Refused when it shouldn't have": "Refuse quand il ne devrait pas", - "Regenerate": "Regénérer", - "Release Notes": "Notes de Version", - "Remove": "Retirer", - "Remove Model": "Retirer le Modèle", - "Rename": "Renommer", - "Repeat Last N": "Répéter les Derniers N", - "Request Mode": "Mode de Demande", - "Reranking Model": "Modèle de Reclassement", - "Reranking model disabled": "Modèle de Reclassement Désactivé", - "Reranking model set to \"{{reranking_model}}\"": "Modèle de reclassement défini sur \"{{reranking_model}}\"", - "Reset Vector Storage": "Réinitialiser le Stockage de Vecteur", - "Response AutoCopy to Clipboard": "Copie Automatique de la Réponse dans le Presse-papiers", - "Role": "Rôle", - "Rosé Pine": "Pin Rosé", - "Rosé Pine Dawn": "Aube Pin Rosé", - "RTL": "RTL", - "Save": "Enregistrer", - "Save & Create": "Enregistrer & Créer", - "Save & Update": "Enregistrer & Mettre à jour", - "Saving chat logs directly to your browser's storage is no longer supported. Please take a moment to download and delete your chat logs by clicking the button below. Don't worry, you can easily re-import your chat logs to the backend through": "La sauvegarde des chat directement dans le stockage de votre navigateur n'est plus prise en charge. Veuillez prendre un moment pour télécharger et supprimer vos journaux de chat en cliquant sur le bouton ci-dessous. Ne vous inquiétez pas, vous pouvez facilement importer vos sauvegardes de chat via", - "Scan": "Scanner", - "Scan complete!": "Scan terminé !", - "Scan for documents from {{path}}": "Scanner des documents depuis {{path}}", - "Search": "Recherche", - "Search a model": "Rechercher un modèle", - "Search Documents": "Rechercher des Documents", - "Search Prompts": "Rechercher des Prompts", - "See readme.md for instructions": "Voir readme.md pour les instructions", - "See what's new": "Voir les nouveautés", - "Seed": "Graine", - "Select a base model": "Sélectionner un modèle de base", - "Select a mode": "Sélectionner un mode", - "Select a model": "Sélectionner un modèle", - "Select an Ollama instance": "Sélectionner une instance Ollama", - "Select model": "Sélectionner un modèle", - "Selected model(s) do not support image inputs": "Modèle(s) séléctionés ne supportent pas les entrées images", - "Send": "Envoyer", - "Send a Message": "Envoyer un message", - "Send message": "Envoyer un message", - "September": "Septembre", - "Server connection verified": "Connexion au serveur vérifiée", - "Set as default": "Définir par défaut", - "Set Default Model": "Définir le Modèle par Défaut", - "Set embedding model (e.g. {{model}})": "Définir le modèle d'embedding (p. ex. {{model}})", - "Set Image Size": "Définir la Taille de l'Image", - "Set Model": "Définir le Modèle", - "Set reranking model (e.g. {{model}})": "Définir le modèle de reclassement (p. ex. {{model}})", - "Set Steps": "Définir les Étapes", - "Set Title Auto-Generation Model": "Définir le Modèle de Génération Automatique de Titre", - "Set Voice": "Définir la Voix", - "Settings": "Paramètres", - "Settings saved successfully!": "Paramètres enregistrés avec succès !", - "Share": "Partager", - "Share Chat": "Partager le Chat", - "Share to OpenWebUI Community": "Partager avec la communauté OpenWebUI", - "short-summary": "résumé court", - "Show": "Montrer", - "Show shortcuts": "Afficher les raccourcis", - "Showcased creativity": "Créativité affichée", - "sidebar": "barre latérale", - "Sign in": "Se connecter", - "Sign Out": "Se déconnecter", - "Sign up": "S'inscrire", - "Signing in": "Connexion en cours", - "Source": "Source", - "Speech recognition error: {{error}}": "Erreur de reconnaissance vocale : {{error}}", - "Speech-to-Text Engine": "Moteur de Reconnaissance Vocale", - "SpeechRecognition API is not supported in this browser.": "L'API SpeechRecognition n'est pas prise en charge dans ce navigateur.", - "Stop Sequence": "Séquence d'Arrêt", - "STT Settings": "Paramètres STT", - "Submit": "Envoyer", - "Subtitle (e.g. about the Roman Empire)": "Sous-Titres (p. ex. à propos de l'Empire Romain)", - "Success": "Succès", - "Successfully updated.": "Mis à jour avec succès.", - "Suggested": "Suggéré", - "System": "Système", - "System Prompt": "Prompt du Système", - "Tags": "Tags", - "Tell us more:": "Dites-nous en plus :", - "Temperature": "Température", - "Template": "Modèle", - "Text Completion": "Complétion de Texte", - "Text-to-Speech Engine": "Moteur de Synthèse Vocale", - "Tfs Z": "Tfs Z", - "Thanks for your feedback!": "Merci pour votre avis !", - "The score should be a value between 0.0 (0%) and 1.0 (100%).": "Le score devrait avoir une valeur entre 0.0 (0%) et 1.0 (100%).", - "Theme": "Thème", - "This ensures that your valuable conversations are securely saved to your backend database. Thank you!": "Cela garantit que vos précieuses conversations sont en sécurité dans votre base de données. Merci !", - "This setting does not sync across browsers or devices.": "Ce paramètre ne se synchronise pas entre les navigateurs ou les appareils.", - "Thorough explanation": "Explication détaillée", - "Tip: Update multiple variable slots consecutively by pressing the tab key in the chat input after each replacement.": "Conseil : Mettez à jour plusieurs emplacements de variables consécutivement en appuyant sur la touche tab dans l'entrée de chat après chaque remplacement", - "Title": "Titre", - "Title (e.g. Tell me a fun fact)": "Titre (p. ex. Donne moi un fait amusant)", - "Title Auto-Generation": "Génération Automatique du Titre", - "Title cannot be an empty string.": "Le Titre ne peut pas être vide.", - "Title Generation Prompt": "Prompt de Génération du Titre", - "to": "à", - "To access the available model names for downloading,": "Pour accéder aux noms de modèles disponibles pour le téléchargement,", - "To access the GGUF models available for downloading,": "Pour accéder aux modèles GGUF disponibles pour le téléchargement,", - "to chat input.": "à l'entrée du chat.", - "Today": "Aujourd'hui", - "Toggle settings": "Basculer les paramètres", - "Toggle sidebar": "Basculer la barre latérale", - "Top K": "Top K", - "Top P": "Top P", - "Trouble accessing Ollama?": "Problèmes d'accès à Ollama ?", - "TTS Settings": "Paramètres TTS", - "Type Hugging Face Resolve (Download) URL": "Entrez l'URL de Résolution (Téléchargement) Hugging Face", - "Uh-oh! There was an issue connecting to {{provider}}.": "Uh-oh ! Il y a eu un problème de connexion à {{provider}}.", - "Unknown File Type '{{file_type}}', but accepting and treating as plain text": "Type de Fichier Inconnu '{{file_type}}', mais accepté et traité comme du texte brut", - "Update and Copy Link": "Mettre à Jour et Copier le Lien", - "Update password": "Mettre à Jour le Mot de Passe", - "Upload a GGUF model": "Téléverser un modèle GGUF", - "Upload files": "Téléverser des fichiers", - "Upload Progress": "Progression du Téléversement", - "URL Mode": "Mode URL", - "Use '#' in the prompt input to load and select your documents.": "Utilisez '#' dans l'entrée du prompt pour charger et sélectionner vos documents.", - "Use Gravatar": "Utiliser Gravatar", - "Use Initials": "Utiliser les Initiales", - "user": "utilisateur", - "User Permissions": "Permissions d'utilisateur", - "Users": "Utilisateurs", - "Utilize": "Utiliser", - "Valid time units:": "Unités de temps valides :", - "variable": "variable", - "variable to have them replaced with clipboard content.": "variable pour les remplacer par le contenu du presse-papiers.", - "Version": "Version", - "Warning: If you update or change your embedding model, you will need to re-import all documents.": "Avertissement : Si vous mettez à jour ou modifier votre modèle d'embedding, vous devrez réimporter tous les documents.", - "Web": "Web", - "Web Loader Settings": "Paramètres du Chargeur Web", - "Web Params": "Paramètres Web", - "Webhook URL": "URL du Webhook", - "WebUI Add-ons": "Add-ons WebUI", - "WebUI Settings": "Paramètres WebUI", - "WebUI will make requests to": "WebUI effectuera des demandes à", - "What’s New in": "Quoi de neuf dans", - "When history is turned off, new chats on this browser won't appear in your history on any of your devices.": "Lorsque l'historique est désactivé, les nouveaux chats sur ce navigateur n'apparaîtront pas dans votre historique sur aucun de vos appareils.", - "Whisper (Local)": "Whisper (Local)", - "Workspace": "Espace de Travail", - "Write a prompt suggestion (e.g. Who are you?)": "Écrivez une suggestion de prompt (e.x. Qui est-tu ?)", - "Write a summary in 50 words that summarizes [topic or keyword].": "Ecrivez un résumé en 50 mots qui résume [sujet ou mot-clé]", - "Yesterday": "Hier", - "You": "Vous", - "You cannot clone a base model": "Vous ne pouvez pas cloner un modèle de base", - "You have no archived conversations.": "Vous n'avez pas de conversations archivées", - "You have shared this chat": "Vous avez partagé ce chat", - "You're a helpful assistant.": "Vous êtes un assistant utile.", - "You're now logged in.": "Vous êtes maintenant connecté.", - "Youtube": "Youtube", - "Youtube Loader Settings": "Paramètres du Chargeur YouTube" + "'s', 'm', 'h', 'd', 'w' or '-1' for no expiration.": "'s', 'm', 'h', 'd', 'w' ou '-1' pour aucune expiration.", + "(Beta)": "(Bêta)", + "(e.g. `sh webui.sh --api`)": "(par ex. `sh webui.sh --api`)", + "(latest)": "(plus récent)", + "{{ models }}": "{{ models }}", + "{{ owner }}: You cannot delete a base model": "{{ owner }}: Vous ne pouvez pas supprimer un modèle de base", + "{{modelName}} is thinking...": "{{modelName}} réfléchit...", + "{{user}}'s Chats": "Chats de {{user}}", + "{{webUIName}} Backend Required": "Backend {{webUIName}} requis", + "a user": "un utilisateur", + "About": "À Propos", + "Account": "Compte", + "Accurate information": "Information précise", + "Add": "Ajouter", + "Add a model id": "Ajouter un identifiant modèle", + "Add a short description about what this model does": "Ajouter une courte description de ce que fait ce modèle", + "Add a short title for this prompt": "Ajouter un court titre pour ce prompt", + "Add a tag": "Ajouter un tag", + "Add custom prompt": "Ajouter un prompt personnalisé", + "Add Docs": "Ajouter des Documents", + "Add Files": "Ajouter des Fichiers", + "Add Memory": "Ajouter de la Mémoire", + "Add message": "Ajouter un message", + "Add Model": "Ajouter un Modèle", + "Add Tags": "Ajouter des Tags", + "Add User": "Ajouter un Utilisateur", + "Adjusting these settings will apply changes universally to all users.": "L'ajustement de ces paramètres appliquera les changements à tous les utilisateurs.", + "admin": "admin", + "Admin Panel": "Panneau d'Administration", + "Admin Settings": "Paramètres d'Administration", + "Advanced Parameters": "Paramètres Avancés", + "Advanced Params": "Params Avancés", + "all": "tous", + "All Documents": "Tous les Documents", + "All Users": "Tous les Utilisateurs", + "Allow": "Autoriser", + "Allow Chat Deletion": "Autoriser la suppression du chat", + "alphanumeric characters and hyphens": "caractères alphanumériques et tirets", + "Already have an account?": "Vous avez déjà un compte ?", + "an assistant": "un assistant", + "and": "et", + "and create a new shared link.": "et créer un nouveau lien partagé.", + "API Base URL": "URL de base de l'API", + "API Key": "Clé API", + "API Key created.": "Clé d'API créée.", + "API keys": "Clés API", + "April": "Avril", + "Archive": "Archiver", + "Archived Chats": "Chats Archivés", + "are allowed - Activate this command by typing": "sont autorisés - Activez cette commande en tapant", + "Are you sure?": "Êtes-vous sûr ?", + "Attach file": "Joindre un fichier", + "Attention to detail": "Attention aux détails", + "Audio": "Audio", + "August": "Août", + "Auto-playback response": "Réponse en lecture automatique", + "Auto-send input after 3 sec.": "Envoyer automatiquement l'entrée après 3 sec.", + "AUTOMATIC1111 Base URL": "URL de base AUTOMATIC1111", + "AUTOMATIC1111 Base URL is required.": "L'URL de base AUTOMATIC1111 est requise.", + "available!": "disponible !", + "Back": "Retour", + "Bad Response": "Mauvaise Réponse", + "Base Model (From)": "Modèle de Base (De)", + "before": "avant", + "Being lazy": "Est paresseux", + "Bypass SSL verification for Websites": "Contourner la vérification SSL pour les sites Web.", + "Cancel": "Annuler", + "Capabilities": "Capacités", + "Change Password": "Changer le mot de passe", + "Chat": "Chat", + "Chat Bubble UI": "UI Bulles de Chat", + "Chat direction": "Direction du chat", + "Chat History": "Historique du chat", + "Chat History is off for this browser.": "L'historique du chat est désactivé pour ce navigateur.", + "Chats": "Chats", + "Check Again": "Vérifier à nouveau", + "Check for updates": "Vérifier les mises à jour", + "Checking for updates...": "Vérification des mises à jour...", + "Choose a model before saving...": "Choisissez un modèle avant d'enregistrer...", + "Chunk Overlap": "Chevauchement de bloc", + "Chunk Params": "Paramètres de bloc", + "Chunk Size": "Taille de bloc", + "Citation": "Citation", + "Click here for help.": "Cliquez ici pour de l'aide.", + "Click here to": "Cliquez ici pour", + "Click here to select": "Cliquez ici pour sélectionner", + "Click here to select a csv file.": "Cliquez ici pour sélectionner un fichier csv.", + "Click here to select documents.": "Cliquez ici pour sélectionner des documents.", + "click here.": "cliquez ici.", + "Click on the user role button to change a user's role.": "Cliquez sur le bouton de rôle d'utilisateur pour changer le rôle d'un utilisateur.", + "Close": "Fermer", + "Collection": "Collection", + "ComfyUI": "ComfyUI", + "ComfyUI Base URL": "URL de base ComfyUI", + "ComfyUI Base URL is required.": "L'URL de base ComfyUI est requise.", + "Command": "Commande", + "Confirm Password": "Confirmer le mot de passe", + "Connections": "Connexions", + "Content": "Contenu", + "Context Length": "Longueur du contexte", + "Continue Response": "Continuer la Réponse", + "Conversation Mode": "Mode de conversation", + "Copied shared chat URL to clipboard!": "URL du chat copié dans le presse-papiers !", + "Copy": "Copier", + "Copy last code block": "Copier le dernier bloc de code", + "Copy last response": "Copier la dernière réponse", + "Copy Link": "Copier le Lien", + "Copying to clipboard was successful!": "La copie dans le presse-papiers a réussi !", + "Create a concise, 3-5 word phrase as a header for the following query, strictly adhering to the 3-5 word limit and avoiding the use of the word 'title':": "Créez une phrase concise de 3-5 mots comme en-tête pour la requête suivante, en respectant strictement la limite de 3-5 mots et en évitant l'utilisation du mot 'titre' :", + "Create a model": "Créer un modèle", + "Create Account": "Créer un compte", + "Create new key": "Créer une nouvelle clé", + "Create new secret key": "Créer une nouvelle clé secrète", + "Created at": "Créé le", + "Created At": "Crée Le", + "Current Model": "Modèle actuel", + "Current Password": "Mot de passe actuel", + "Custom": "Personnalisé", + "Customize models for a specific purpose": "Personnaliser les modèles pour un objectif spécifique", + "Dark": "Sombre", + "Dashboard": "Tableau de bord", + "Database": "Base de données", + "December": "Décembre", + "Default": "Par défaut", + "Default (Automatic1111)": "Par défaut (Automatic1111)", + "Default (SentenceTransformers)": "Par défaut (SentenceTransformers)", + "Default (Web API)": "Par défaut (API Web)", + "Default model updated": "Modèle par défaut mis à jour", + "Default Prompt Suggestions": "Suggestions de prompt par défaut", + "Default User Role": "Rôle d'utilisateur par défaut", + "delete": "supprimer", + "Delete": "Supprimer", + "Delete a model": "Supprimer un modèle", + "Delete chat": "Supprimer le chat", + "Delete Chat": "Supprimer le Chat", + "Delete Chats": "Supprimer les chats", + "delete this link": "supprimer ce lien", + "Delete User": "Supprimer l'Utilisateur", + "Deleted {{deleteModelTag}}": "{{deleteModelTag}} supprimé", + "Deleted {{name}}": "{{name}} supprimé", + "Description": "Description", + "Didn't fully follow instructions": "N'a pas suivi entièrement les instructions", + "Disabled": "Désactivé", + "Discover a model": "Découvrir un modèle", + "Discover a prompt": "Découvrir un prompt", + "Discover, download, and explore custom prompts": "Découvrir, télécharger et explorer des prompts personnalisés", + "Discover, download, and explore model presets": "Découvrir, télécharger et explorer des préconfigurations de modèles", + "Display the username instead of You in the Chat": "Afficher le nom d'utilisateur au lieu de 'Vous' dans le Chat", + "Document": "Document", + "Document Settings": "Paramètres du document", + "Documents": "Documents", + "does not make any external connections, and your data stays securely on your locally hosted server.": "ne fait aucune connexion externe, et vos données restent en sécurité sur votre serveur hébergé localement.", + "Don't Allow": "Ne pas autoriser", + "Don't have an account?": "Vous n'avez pas de compte ?", + "Don't like the style": "N'aime pas le style", + "Download": "Télécharger", + "Download canceled": "Téléchargement annulé", + "Download Database": "Télécharger la base de données", + "Drop any files here to add to the conversation": "Déposez des fichiers ici pour les ajouter à la conversation", + "e.g. '30s','10m'. Valid time units are 's', 'm', 'h'.": "par ex. '30s', '10m'. Les unités de temps valides sont 's', 'm', 'h'.", + "Edit": "Éditer", + "Edit Doc": "Éditer le document", + "Edit User": "Éditer l'utilisateur", + "Email": "Email", + "Embedding Model": "Modèle pour l'Embedding", + "Embedding Model Engine": "Moteur du Modèle d'Embedding", + "Embedding model set to \"{{embedding_model}}\"": "Modèle d'embedding défini sur \"{{embedding_model}}\"", + "Enable Chat History": "Activer l'historique du chat", + "Enable New Sign Ups": "Activer les nouvelles inscriptions", + "Enabled": "Activé", + "Ensure your CSV file includes 4 columns in this order: Name, Email, Password, Role.": "Vérifiez que le fichier CSV contienne 4 colonnes dans cet ordre : Name (Nom), Email, Password (Mot de passe), Role (Rôle).", + "Enter {{role}} message here": "Entrez le message {{role}} ici", + "Enter a detail about yourself for your LLMs to recall": "Saisissez une donnée vous concernant pour que vos LLMs s'en souviennent", + "Enter Chunk Overlap": "Entrez le chevauchement de bloc", + "Enter Chunk Size": "Entrez la taille du bloc", + "Enter Image Size (e.g. 512x512)": "Entrez la taille de l'image (p. ex. 512x512)", + "Enter language codes": "Entrez les codes du language", + "Enter model tag (e.g. {{modelTag}})": "Entrez le tag du modèle (p. ex. {{modelTag}})", + "Enter Number of Steps (e.g. 50)": "Entrez le nombre d'étapes (p. ex. 50)", + "Enter Score": "Entrez le Score", + "Enter stop sequence": "Entrez la séquence de fin", + "Enter Top K": "Entrez Top K", + "Enter URL (e.g. http://127.0.0.1:7860/)": "Entrez l'URL (p. ex. http://127.0.0.1:7860/)", + "Enter URL (e.g. http://localhost:11434)": "Entrez l'URL (p. ex. http://localhost:11434)", + "Enter Your Email": "Entrez Votre Email", + "Enter Your Full Name": "Entrez Votre Nom Complet", + "Enter Your Password": "Entrez Votre Mot De Passe", + "Enter Your Role": "Entrez Votre Rôle", + "Experimental": "Expérimental", + "Export All Chats (All Users)": "Exporter Tous les Chats (Tous les Utilisateurs)", + "Export Chats": "Exporter les Chats", + "Export Documents Mapping": "Exporter la Correspondance des Documents", + "Export Models": "Exporter les Modèles", + "Export Prompts": "Exporter les Prompts", + "Failed to create API Key.": "Échec de la création de la clé d'API.", + "Failed to read clipboard contents": "Échec de la lecture du contenu du presse-papiers", + "February": "Février", + "Feel free to add specific details": "N'hésitez pas à ajouter des détails spécifiques", + "File Mode": "Mode Fichier", + "File not found.": "Fichier non trouvé.", + "Fingerprint spoofing detected: Unable to use initials as avatar. Defaulting to default profile image.": "Usurpation d'empreinte digitale détectée : Impossible d'utiliser les initiales comme avatar. L'image de profil par défaut sera utilisée.", + "Fluidly stream large external response chunks": "Diffusez de manière fluide de gros morceaux de réponses externes", + "Focus chat input": "Concentrer sur l'entrée du chat", + "Followed instructions perfectly": "A suivi les instructions parfaitement", + "Format your variables using square brackets like this:": "Formatez vos variables en utilisant des crochets comme ceci :", + "Frequencey Penalty": "Pénalité de Fréquence", + "Full Screen Mode": "Mode plein écran", + "General": "Général", + "General Settings": "Paramètres Généraux", + "Generation Info": "Informations de la Génération", + "Good Response": "Bonne Réponse", + "h:mm a": "h:mm a", + "has no conversations.": "n'a pas de conversations.", + "Hello, {{name}}": "Bonjour, {{name}}", + "Help": "Aide", + "Hide": "Cacher", + "How can I help you today?": "Comment puis-je vous aider aujourd'hui ?", + "Hybrid Search": "Recherche Hybride", + "Image Generation (Experimental)": "Génération d'Image (Expérimental)", + "Image Generation Engine": "Moteur de Génération d'Image", + "Image Settings": "Paramètres d'Image", + "Images": "Images", + "Import Chats": "Importer les Chats", + "Import Documents Mapping": "Importer la Correspondance des Documents", + "Import Models": "Importer des Modèles", + "Import Prompts": "Importer des Prompts", + "Include `--api` flag when running stable-diffusion-webui": "Inclure le drapeau `--api` lors de l'exécution de stable-diffusion-webui", + "Input commands": "Entrez les commandes d'entrée", + "Interface": "Interface", + "Invalid Tag": "Tag Invalide", + "January": "Janvier", + "join our Discord for help.": "rejoignez notre Discord pour obtenir de l'aide.", + "JSON": "JSON", + "JSON Preview": "Aperçu JSON", + "July": "Juillet", + "June": "Juin", + "JWT Expiration": "Expiration JWT", + "JWT Token": "Jeton JWT", + "Keep Alive": "Rester en vie", + "Keyboard shortcuts": "Raccourcis clavier", + "Language": "Langue", + "Last Active": "Dernier Activité", + "Light": "Clair", + "Listening...": "Écoute...", + "LLMs can make mistakes. Verify important information.": "Les LLMs peuvent faire des erreurs. Vérifiez les informations importantes.", + "LTR": "LTR", + "Made by OpenWebUI Community": "Réalisé par la communauté OpenWebUI", + "Make sure to enclose them with": "Assurez-vous de les entourer avec", + "Manage Models": "Gérer les modèles", + "Manage Ollama Models": "Gérer les modèles Ollama", + "March": "Mars", + "Max Tokens (num_predict)": "Tokens maximaux (num_predict)", + "Maximum of 3 models can be downloaded simultaneously. Please try again later.": "Un maximum de 3 modèles peut être téléchargé simultanément. Veuillez réessayer plus tard.", + "May": "Mai", + "Memories accessible by LLMs will be shown here.": "Les Mémoires des LLMs apparaîtront ici.", + "Memory": "Mémoire", + "Messages you send after creating your link won't be shared. Users with the URL will be able to view the shared chat.": "Les messages que vous envoyéz après la création du lien ne seront pas partagés. Les utilisateurs disposant de l'URL pourront voir le chat partagé.", + "Minimum Score": "Score Minimum", + "Mirostat": "Mirostat", + "Mirostat Eta": "Mirostat Eta", + "Mirostat Tau": "Mirostat Tau", + "MMMM DD, YYYY": "MMMM DD, YYYY", + "MMMM DD, YYYY HH:mm": "MMMM DD, YYYY HH:mm", + "Model '{{modelName}}' has been successfully downloaded.": "Le modèle '{{modelName}}' a été téléchargé avec succès.", + "Model '{{modelTag}}' is already in queue for downloading.": "Le modèle '{{modelTag}}' est déjà dans la file d'attente pour le téléchargement.", + "Model {{modelId}} not found": "Modèle {{modelId}} non trouvé", + "Model {{modelName}} is not vision capable": "Modèle {{modelName}} n'est pas capable de voir", + "Model filesystem path detected. Model shortname is required for update, cannot continue.": "Chemin du système de fichier du modèle détecté. Le nom court du modèle est requis pour la mise à jour, ne peut pas continuer.", + "Model ID": "ID du Modèle", + "Model not selected": "Modèle non sélectionné", + "Model Params": "Paramètres du Modèle", + "Model Whitelisting": "Liste Blanche de Modèle", + "Model(s) Whitelisted": "Modèle(s) sur Liste Blanche", + "Modelfile Content": "Contenu du Fichier de Modèle", + "Models": "Modèles", + "More": "Plus", + "Name": "Nom", + "Name Tag": "Tag de Nom", + "Name your model": "Nommez votre modèle", + "New Chat": "Nouveau chat", + "New Password": "Nouveau mot de passe", + "No results found": "Aucun résultat", + "No source available": "Aucune source disponible", + "Not factually correct": "Faits incorrects", + "Note: If you set a minimum score, the search will only return documents with a score greater than or equal to the minimum score.": "Note : Si vous définissez un score minimum, la recherche ne renverra que les documents ayant un score supérieur ou égal au score minimum.", + "Notifications": "Notifications de bureau", + "November": "Novembre", + "October": "Octobre", + "Off": "Désactivé", + "Okay, Let's Go!": "D'accord, allons-y !", + "OLED Dark": "Sombre OLED", + "Ollama": "Ollama", + "Ollama API": "API Ollama", + "Ollama Version": "Version Ollama", + "On": "Activé", + "Only": "Seulement", + "Only alphanumeric characters and hyphens are allowed in the command string.": "Seuls les caractères alphanumériques et les tirets sont autorisés dans la chaîne de commande.", + "Oops! Hold tight! Your files are still in the processing oven. We're cooking them up to perfection. Please be patient and we'll let you know once they're ready.": "Oups ! Tenez bon ! Vos fichiers sont encore dans le four. Nous les cuisinons à la perfection. Soyez patient et nous vous informerons dès qu'ils seront prêts.", + "Oops! Looks like the URL is invalid. Please double-check and try again.": "Oups ! On dirait que l'URL est invalide. Vérifiez et réessayez.", + "Oops! You're using an unsupported method (frontend only). Please serve the WebUI from the backend.": "Oups ! Vous utilisez une méthode non-supportée (frontend uniquement). Veuillez également servir WebUI depuis le backend.", + "Open": "Ouvrir", + "Open AI": "Open AI", + "Open AI (Dall-E)": "Open AI (Dall-E)", + "Open new chat": "Ouvrir un nouveau chat", + "OpenAI": "OpenAI", + "OpenAI API": "API OpenAI", + "OpenAI API Config": "Config API OpenAI", + "OpenAI API Key is required.": "La clé d'API OpenAI est requise.", + "OpenAI URL/Key required.": "URL/Clé OpenAI requise.", + "or": "ou", + "Other": "Autre", + "Overview": "Aperçu", + "Password": "Mot de passe", + "PDF document (.pdf)": "Document PDF (.pdf)", + "PDF Extract Images (OCR)": "Extraction d'images PDF (OCR)", + "pending": "en attente", + "Permission denied when accessing microphone: {{error}}": "Permission refusée lors de l'accès au microphone : {{error}}", + "Personalization": "Personnalisation", + "Plain text (.txt)": "Texte Brute (.txt)", + "Playground": "Aire de jeu", + "Positive attitude": "Attitude Positive", + "Previous 30 days": "30 jours précédents", + "Previous 7 days": "7 jours précédents", + "Profile Image": "Image du Profil", + "Prompt": "Prompt", + "Prompt (e.g. Tell me a fun fact about the Roman Empire)": "Prompt (p. ex. Raconte moi un fait amusant sur l'Empire Romain)", + "Prompt Content": "Contenu du prompt", + "Prompt suggestions": "Suggestions de prompt", + "Prompts": "Prompts", + "Pull \"{{searchValue}}\" from Ollama.com": "Récupérer \"{{searchValue}}\" de Ollama.com", + "Pull a model from Ollama.com": "Récupérer un modèle de Ollama.com", + "Query Params": "Paramètres de Requête", + "RAG Template": "Modèle RAG", + "Read Aloud": "Lire à Voix Haute", + "Record voice": "Enregistrer la voix", + "Redirecting you to OpenWebUI Community": "Redirection vers la communauté OpenWebUI", + "Refused when it shouldn't have": "Refuse quand il ne devrait pas", + "Regenerate": "Regénérer", + "Release Notes": "Notes de Version", + "Remove": "Retirer", + "Remove Model": "Retirer le Modèle", + "Rename": "Renommer", + "Repeat Last N": "Répéter les Derniers N", + "Request Mode": "Mode de Demande", + "Reranking Model": "Modèle de Reclassement", + "Reranking model disabled": "Modèle de Reclassement Désactivé", + "Reranking model set to \"{{reranking_model}}\"": "Modèle de reclassement défini sur \"{{reranking_model}}\"", + "Reset Vector Storage": "Réinitialiser le Stockage de Vecteur", + "Response AutoCopy to Clipboard": "Copie Automatique de la Réponse dans le Presse-papiers", + "Role": "Rôle", + "Rosé Pine": "Pin Rosé", + "Rosé Pine Dawn": "Aube Pin Rosé", + "RTL": "RTL", + "Save": "Enregistrer", + "Save & Create": "Enregistrer & Créer", + "Save & Update": "Enregistrer & Mettre à jour", + "Saving chat logs directly to your browser's storage is no longer supported. Please take a moment to download and delete your chat logs by clicking the button below. Don't worry, you can easily re-import your chat logs to the backend through": "La sauvegarde des chat directement dans le stockage de votre navigateur n'est plus prise en charge. Veuillez prendre un moment pour télécharger et supprimer vos journaux de chat en cliquant sur le bouton ci-dessous. Ne vous inquiétez pas, vous pouvez facilement importer vos sauvegardes de chat via", + "Scan": "Scanner", + "Scan complete!": "Scan terminé !", + "Scan for documents from {{path}}": "Scanner des documents depuis {{path}}", + "Search": "Recherche", + "Search a model": "Rechercher un modèle", + "Search Documents": "Rechercher des Documents", + "Search Prompts": "Rechercher des Prompts", + "See readme.md for instructions": "Voir readme.md pour les instructions", + "See what's new": "Voir les nouveautés", + "Seed": "Graine", + "Select a base model": "Sélectionner un modèle de base", + "Select a mode": "Sélectionner un mode", + "Select a model": "Sélectionner un modèle", + "Select an Ollama instance": "Sélectionner une instance Ollama", + "Select model": "Sélectionner un modèle", + "Selected model(s) do not support image inputs": "Modèle(s) séléctionés ne supportent pas les entrées images", + "Send": "Envoyer", + "Send a Message": "Envoyer un message", + "Send message": "Envoyer un message", + "September": "Septembre", + "Server connection verified": "Connexion au serveur vérifiée", + "Set as default": "Définir par défaut", + "Set Default Model": "Définir le Modèle par Défaut", + "Set embedding model (e.g. {{model}})": "Définir le modèle d'embedding (p. ex. {{model}})", + "Set Image Size": "Définir la Taille de l'Image", + "Set Model": "Définir le Modèle", + "Set reranking model (e.g. {{model}})": "Définir le modèle de reclassement (p. ex. {{model}})", + "Set Steps": "Définir les Étapes", + "Set Title Auto-Generation Model": "Définir le Modèle de Génération Automatique de Titre", + "Set Voice": "Définir la Voix", + "Settings": "Paramètres", + "Settings saved successfully!": "Paramètres enregistrés avec succès !", + "Share": "Partager", + "Share Chat": "Partager le Chat", + "Share to OpenWebUI Community": "Partager avec la communauté OpenWebUI", + "short-summary": "résumé court", + "Show": "Montrer", + "Show shortcuts": "Afficher les raccourcis", + "Showcased creativity": "Créativité affichée", + "sidebar": "barre latérale", + "Sign in": "Se connecter", + "Sign Out": "Se déconnecter", + "Sign up": "S'inscrire", + "Signing in": "Connexion en cours", + "Source": "Source", + "Speech recognition error: {{error}}": "Erreur de reconnaissance vocale : {{error}}", + "Speech-to-Text Engine": "Moteur de Reconnaissance Vocale", + "SpeechRecognition API is not supported in this browser.": "L'API SpeechRecognition n'est pas prise en charge dans ce navigateur.", + "Stop Sequence": "Séquence d'Arrêt", + "STT Settings": "Paramètres STT", + "Submit": "Envoyer", + "Subtitle (e.g. about the Roman Empire)": "Sous-Titres (p. ex. à propos de l'Empire Romain)", + "Success": "Succès", + "Successfully updated.": "Mis à jour avec succès.", + "Suggested": "Suggéré", + "System": "Système", + "System Prompt": "Prompt du Système", + "Tags": "Tags", + "Tell us more:": "Dites-nous en plus :", + "Temperature": "Température", + "Template": "Modèle", + "Text Completion": "Complétion de Texte", + "Text-to-Speech Engine": "Moteur de Synthèse Vocale", + "Tfs Z": "Tfs Z", + "Thanks for your feedback!": "Merci pour votre avis !", + "The score should be a value between 0.0 (0%) and 1.0 (100%).": "Le score devrait avoir une valeur entre 0.0 (0%) et 1.0 (100%).", + "Theme": "Thème", + "This ensures that your valuable conversations are securely saved to your backend database. Thank you!": "Cela garantit que vos précieuses conversations sont en sécurité dans votre base de données. Merci !", + "This setting does not sync across browsers or devices.": "Ce paramètre ne se synchronise pas entre les navigateurs ou les appareils.", + "Thorough explanation": "Explication détaillée", + "Tip: Update multiple variable slots consecutively by pressing the tab key in the chat input after each replacement.": "Conseil : Mettez à jour plusieurs emplacements de variables consécutivement en appuyant sur la touche tab dans l'entrée de chat après chaque remplacement", + "Title": "Titre", + "Title (e.g. Tell me a fun fact)": "Titre (p. ex. Donne moi un fait amusant)", + "Title Auto-Generation": "Génération Automatique du Titre", + "Title cannot be an empty string.": "Le Titre ne peut pas être vide.", + "Title Generation Prompt": "Prompt de Génération du Titre", + "to": "à", + "To access the available model names for downloading,": "Pour accéder aux noms de modèles disponibles pour le téléchargement,", + "To access the GGUF models available for downloading,": "Pour accéder aux modèles GGUF disponibles pour le téléchargement,", + "to chat input.": "à l'entrée du chat.", + "Today": "Aujourd'hui", + "Toggle settings": "Basculer les paramètres", + "Toggle sidebar": "Basculer la barre latérale", + "Top K": "Top K", + "Top P": "Top P", + "Trouble accessing Ollama?": "Problèmes d'accès à Ollama ?", + "TTS Settings": "Paramètres TTS", + "Type Hugging Face Resolve (Download) URL": "Entrez l'URL de Résolution (Téléchargement) Hugging Face", + "Uh-oh! There was an issue connecting to {{provider}}.": "Uh-oh ! Il y a eu un problème de connexion à {{provider}}.", + "Unknown File Type '{{file_type}}', but accepting and treating as plain text": "Type de Fichier Inconnu '{{file_type}}', mais accepté et traité comme du texte brut", + "Update and Copy Link": "Mettre à Jour et Copier le Lien", + "Update password": "Mettre à Jour le Mot de Passe", + "Upload a GGUF model": "Téléverser un modèle GGUF", + "Upload files": "Téléverser des fichiers", + "Upload Progress": "Progression du Téléversement", + "URL Mode": "Mode URL", + "Use '#' in the prompt input to load and select your documents.": "Utilisez '#' dans l'entrée du prompt pour charger et sélectionner vos documents.", + "Use Gravatar": "Utiliser Gravatar", + "Use Initials": "Utiliser les Initiales", + "user": "utilisateur", + "User Permissions": "Permissions d'utilisateur", + "Users": "Utilisateurs", + "Utilize": "Utiliser", + "Valid time units:": "Unités de temps valides :", + "variable": "variable", + "variable to have them replaced with clipboard content.": "variable pour les remplacer par le contenu du presse-papiers.", + "Version": "Version", + "Warning: If you update or change your embedding model, you will need to re-import all documents.": "Avertissement : Si vous mettez à jour ou modifier votre modèle d'embedding, vous devrez réimporter tous les documents.", + "Web": "Web", + "Web Loader Settings": "Paramètres du Chargeur Web", + "Web Params": "Paramètres Web", + "Webhook URL": "URL du Webhook", + "WebUI Add-ons": "Add-ons WebUI", + "WebUI Settings": "Paramètres WebUI", + "WebUI will make requests to": "WebUI effectuera des demandes à", + "What’s New in": "Quoi de neuf dans", + "When history is turned off, new chats on this browser won't appear in your history on any of your devices.": "Lorsque l'historique est désactivé, les nouveaux chats sur ce navigateur n'apparaîtront pas dans votre historique sur aucun de vos appareils.", + "Whisper (Local)": "Whisper (Local)", + "Workspace": "Espace de Travail", + "Write a prompt suggestion (e.g. Who are you?)": "Écrivez une suggestion de prompt (e.x. Qui est-tu ?)", + "Write a summary in 50 words that summarizes [topic or keyword].": "Ecrivez un résumé en 50 mots qui résume [sujet ou mot-clé]", + "Yesterday": "Hier", + "You": "Vous", + "You cannot clone a base model": "Vous ne pouvez pas cloner un modèle de base", + "You have no archived conversations.": "Vous n'avez pas de conversations archivées", + "You have shared this chat": "Vous avez partagé ce chat", + "You're a helpful assistant.": "Vous êtes un assistant utile.", + "You're now logged in.": "Vous êtes maintenant connecté.", + "Youtube": "Youtube", + "Youtube Loader Settings": "Paramètres du Chargeur YouTube" } From 3d0b3eb5774419b75fad4197eb796ce7f352c09e Mon Sep 17 00:00:00 2001 From: "Timothy J. Baek" Date: Sat, 25 May 2024 13:13:25 -0700 Subject: [PATCH 05/28] fix: styling --- src/routes/(app)/workspace/models/create/+page.svelte | 6 ++---- src/routes/(app)/workspace/models/edit/+page.svelte | 6 ++---- 2 files changed, 4 insertions(+), 8 deletions(-) diff --git a/src/routes/(app)/workspace/models/create/+page.svelte b/src/routes/(app)/workspace/models/create/+page.svelte index bc71cad7b4..95bb5d5b36 100644 --- a/src/routes/(app)/workspace/models/create/+page.svelte +++ b/src/routes/(app)/workspace/models/create/+page.svelte @@ -316,11 +316,9 @@ bind:value={info.base_model_id} required > - + {#each $models.filter((m) => !m?.preset) as model} - + {/each} diff --git a/src/routes/(app)/workspace/models/edit/+page.svelte b/src/routes/(app)/workspace/models/edit/+page.svelte index 3323b96de2..bd751bdcb6 100644 --- a/src/routes/(app)/workspace/models/edit/+page.svelte +++ b/src/routes/(app)/workspace/models/edit/+page.svelte @@ -291,11 +291,9 @@ bind:value={info.base_model_id} required > - + {#each $models.filter((m) => m.id !== model.id && !m?.preset) as model} - + {/each} From afcab78cabebaeeb59524c10fbd6cec7ded56cd1 Mon Sep 17 00:00:00 2001 From: "Timothy J. Baek" Date: Sat, 25 May 2024 13:48:45 -0700 Subject: [PATCH 06/28] fix: models --- backend/apps/web/routers/models.py | 6 +++--- src/lib/apis/models/index.ts | 15 ++++++++++++--- src/lib/components/chat/Settings/General.svelte | 2 +- .../(app)/workspace/models/create/+page.svelte | 2 +- .../(app)/workspace/models/edit/+page.svelte | 2 +- 5 files changed, 18 insertions(+), 9 deletions(-) diff --git a/backend/apps/web/routers/models.py b/backend/apps/web/routers/models.py index 654d0d2fb7..81140c8610 100644 --- a/backend/apps/web/routers/models.py +++ b/backend/apps/web/routers/models.py @@ -53,7 +53,7 @@ async def add_new_model( ############################ -@router.get("/{id}", response_model=Optional[ModelModel]) +@router.get("/", response_model=Optional[ModelModel]) async def get_model_by_id(id: str, user=Depends(get_verified_user)): model = Models.get_model_by_id(id) @@ -71,7 +71,7 @@ async def get_model_by_id(id: str, user=Depends(get_verified_user)): ############################ -@router.post("/{id}/update", response_model=Optional[ModelModel]) +@router.post("/update", response_model=Optional[ModelModel]) async def update_model_by_id( request: Request, id: str, form_data: ModelForm, user=Depends(get_admin_user) ): @@ -102,7 +102,7 @@ async def update_model_by_id( ############################ -@router.delete("/{id}/delete", response_model=bool) +@router.delete("/delete", response_model=bool) async def delete_model_by_id(id: str, user=Depends(get_admin_user)): result = Models.delete_model_by_id(id) return result diff --git a/src/lib/apis/models/index.ts b/src/lib/apis/models/index.ts index 0929265830..73b9d619af 100644 --- a/src/lib/apis/models/index.ts +++ b/src/lib/apis/models/index.ts @@ -63,7 +63,10 @@ export const getModelInfos = async (token: string = '') => { export const getModelById = async (token: string, id: string) => { let error = null; - const res = await fetch(`${WEBUI_API_BASE_URL}/models/${id}`, { + const url = new URL(`${WEBUI_API_BASE_URL}/models`); + url.searchParams.append('id', id); + + const res = await fetch(url.toString(), { method: 'GET', headers: { Accept: 'application/json', @@ -95,7 +98,10 @@ export const getModelById = async (token: string, id: string) => { export const updateModelById = async (token: string, id: string, model: object) => { let error = null; - const res = await fetch(`${WEBUI_API_BASE_URL}/models/${id}/update`, { + const url = new URL(`${WEBUI_API_BASE_URL}/models/update`); + url.searchParams.append('id', id); + + const res = await fetch(url.toString(), { method: 'POST', headers: { Accept: 'application/json', @@ -128,7 +134,10 @@ export const updateModelById = async (token: string, id: string, model: object) export const deleteModelById = async (token: string, id: string) => { let error = null; - const res = await fetch(`${WEBUI_API_BASE_URL}/models/${id}/delete`, { + const url = new URL(`${WEBUI_API_BASE_URL}/models/delete`); + url.searchParams.append('id', id); + + const res = await fetch(url.toString(), { method: 'DELETE', headers: { Accept: 'application/json', diff --git a/src/lib/components/chat/Settings/General.svelte b/src/lib/components/chat/Settings/General.svelte index ae08e5234c..c20c9465b9 100644 --- a/src/lib/components/chat/Settings/General.svelte +++ b/src/lib/components/chat/Settings/General.svelte @@ -302,7 +302,7 @@ system: system !== '' ? system : undefined, params: { seed: (params.seed !== 0 ? params.seed : undefined) ?? undefined, - stop: params.stop !== null ? params.stop.split(',').filter((e) => e) : undefined, + stop: params.stop ? params.stop.split(',').filter((e) => e) : undefined, temperature: params.temperature !== '' ? params.temperature : undefined, frequency_penalty: params.frequency_penalty !== '' ? params.frequency_penalty : undefined, diff --git a/src/routes/(app)/workspace/models/create/+page.svelte b/src/routes/(app)/workspace/models/create/+page.svelte index 95bb5d5b36..1db35f4e8d 100644 --- a/src/routes/(app)/workspace/models/create/+page.svelte +++ b/src/routes/(app)/workspace/models/create/+page.svelte @@ -62,7 +62,7 @@ info.id = id; info.name = name; info.meta.capabilities = capabilities; - info.params.stop = params.stop !== null ? params.stop.split(',').filter((s) => s.trim()) : null; + info.params.stop = params.stop ? params.stop.split(',').filter((s) => s.trim()) : null; if ($models.find((m) => m.id === info.id)) { toast.error( diff --git a/src/routes/(app)/workspace/models/edit/+page.svelte b/src/routes/(app)/workspace/models/edit/+page.svelte index bd751bdcb6..21e0f6e41e 100644 --- a/src/routes/(app)/workspace/models/edit/+page.svelte +++ b/src/routes/(app)/workspace/models/edit/+page.svelte @@ -63,7 +63,7 @@ info.id = id; info.name = name; info.meta.capabilities = capabilities; - info.params.stop = params.stop !== null ? params.stop.split(',').filter((s) => s.trim()) : null; + info.params.stop = params.stop ? params.stop.split(',').filter((s) => s.trim()) : null; const res = await updateModelById(localStorage.token, info.id, info); From 9ad4a9387687ec776d3626feb9aa2b2619a5c374 Mon Sep 17 00:00:00 2001 From: "Timothy J. Baek" Date: Sat, 25 May 2024 14:08:41 -0700 Subject: [PATCH 07/28] fix: ollama settings --- src/lib/components/chat/Settings/Models.svelte | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/src/lib/components/chat/Settings/Models.svelte b/src/lib/components/chat/Settings/Models.svelte index 25fd1743d8..c99de9251b 100644 --- a/src/lib/components/chat/Settings/Models.svelte +++ b/src/lib/components/chat/Settings/Models.svelte @@ -56,8 +56,11 @@ const updateModelsHandler = async () => { for (const model of $models.filter( (m) => - m.size != null && - (selectedOllamaUrlIdx === null ? true : (m?.urls ?? []).includes(selectedOllamaUrlIdx)) + !(m?.preset ?? false) && + m.owned_by === 'ollama' && + (selectedOllamaUrlIdx === null + ? true + : (m?.ollama?.urls ?? []).includes(selectedOllamaUrlIdx)) )) { console.log(model); @@ -644,9 +647,12 @@ {#if !deleteModelTag} {/if} - {#each $models.filter((m) => m.size != null && (selectedOllamaUrlIdx === null ? true : (m?.urls ?? []).includes(selectedOllamaUrlIdx))) as model} + {#each $models.filter((m) => !(m?.preset ?? false) && m.owned_by === 'ollama' && (selectedOllamaUrlIdx === null ? true : (m?.ollama?.urls ?? []).includes(selectedOllamaUrlIdx))) as model} {model.name + + ' (' + + (model.ollama.size / 1024 ** 3).toFixed(1) + + ' GB)'} {/each} From 6c8997fcbc7be63fbea200eb8f9fe688b461a07c Mon Sep 17 00:00:00 2001 From: "Timothy J. Baek" Date: Sat, 25 May 2024 14:24:00 -0700 Subject: [PATCH 08/28] fix --- src/lib/apis/models/index.ts | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/src/lib/apis/models/index.ts b/src/lib/apis/models/index.ts index 73b9d619af..9faa358d33 100644 --- a/src/lib/apis/models/index.ts +++ b/src/lib/apis/models/index.ts @@ -32,7 +32,7 @@ export const addNewModel = async (token: string, model: object) => { export const getModelInfos = async (token: string = '') => { let error = null; - const res = await fetch(`${WEBUI_API_BASE_URL}/models/`, { + const res = await fetch(`${WEBUI_API_BASE_URL}/models`, { method: 'GET', headers: { Accept: 'application/json', @@ -63,10 +63,10 @@ export const getModelInfos = async (token: string = '') => { export const getModelById = async (token: string, id: string) => { let error = null; - const url = new URL(`${WEBUI_API_BASE_URL}/models`); - url.searchParams.append('id', id); + const searchParams = new URLSearchParams(); + searchParams.append('id', id); - const res = await fetch(url.toString(), { + const res = await fetch(`${WEBUI_API_BASE_URL}/models?${searchParams.toString()}`, { method: 'GET', headers: { Accept: 'application/json', @@ -98,10 +98,10 @@ export const getModelById = async (token: string, id: string) => { export const updateModelById = async (token: string, id: string, model: object) => { let error = null; - const url = new URL(`${WEBUI_API_BASE_URL}/models/update`); - url.searchParams.append('id', id); + const searchParams = new URLSearchParams(); + searchParams.append('id', id); - const res = await fetch(url.toString(), { + const res = await fetch(`${WEBUI_API_BASE_URL}/models/update?${searchParams.toString()}`, { method: 'POST', headers: { Accept: 'application/json', @@ -134,10 +134,10 @@ export const updateModelById = async (token: string, id: string, model: object) export const deleteModelById = async (token: string, id: string) => { let error = null; - const url = new URL(`${WEBUI_API_BASE_URL}/models/delete`); - url.searchParams.append('id', id); + const searchParams = new URLSearchParams(); + searchParams.append('id', id); - const res = await fetch(url.toString(), { + const res = await fetch(`${WEBUI_API_BASE_URL}/models/delete?${searchParams.toString()}`, { method: 'DELETE', headers: { Accept: 'application/json', From 50951459c92c48048be9210a8274dc7ef1f0b6fc Mon Sep 17 00:00:00 2001 From: "Timothy J. Baek" Date: Sat, 25 May 2024 14:25:53 -0700 Subject: [PATCH 09/28] refac: styling --- src/routes/(app)/workspace/models/create/+page.svelte | 6 +++--- src/routes/(app)/workspace/models/edit/+page.svelte | 4 ++-- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/src/routes/(app)/workspace/models/create/+page.svelte b/src/routes/(app)/workspace/models/create/+page.svelte index 1db35f4e8d..46763bf62b 100644 --- a/src/routes/(app)/workspace/models/create/+page.svelte +++ b/src/routes/(app)/workspace/models/create/+page.svelte @@ -316,9 +316,9 @@ bind:value={info.base_model_id} required > - - {#each $models.filter((m) => !m?.preset) as model} - + + {#each $models.filter((m) => m.id !== model.id && !m?.preset) as model} + {/each} diff --git a/src/routes/(app)/workspace/models/edit/+page.svelte b/src/routes/(app)/workspace/models/edit/+page.svelte index 21e0f6e41e..e21190d6a6 100644 --- a/src/routes/(app)/workspace/models/edit/+page.svelte +++ b/src/routes/(app)/workspace/models/edit/+page.svelte @@ -291,9 +291,9 @@ bind:value={info.base_model_id} required > - + {#each $models.filter((m) => m.id !== model.id && !m?.preset) as model} - + {/each} From 79f440f302fb283bbfebdd4b9d3cc20c3159cb0a Mon Sep 17 00:00:00 2001 From: "Timothy J. Baek" Date: Sat, 25 May 2024 14:43:35 -0700 Subject: [PATCH 10/28] refac: byebye litellm --- .env.example | 6 +- Dockerfile | 13 +- backend/apps/litellm/main.py | 388 ------------------ backend/apps/web/models/modelfiles.py | 144 ------- backend/config.py | 21 +- backend/main.py | 18 - backend/requirements.txt | 2 - backend/space/litellm_config.yaml | 43 -- backend/start.sh | 5 - src/lib/apis/litellm/index.ts | 151 ------- src/lib/components/chat/Chat.svelte | 11 +- .../components/workspace/Playground.svelte | 19 +- src/lib/constants.ts | 1 - 13 files changed, 14 insertions(+), 808 deletions(-) delete mode 100644 backend/apps/litellm/main.py delete mode 100644 backend/apps/web/models/modelfiles.py delete mode 100644 backend/space/litellm_config.yaml delete mode 100644 src/lib/apis/litellm/index.ts diff --git a/.env.example b/.env.example index 2d782fce10..c38bf88bfb 100644 --- a/.env.example +++ b/.env.example @@ -10,8 +10,4 @@ OPENAI_API_KEY='' # DO NOT TRACK SCARF_NO_ANALYTICS=true DO_NOT_TRACK=true -ANONYMIZED_TELEMETRY=false - -# Use locally bundled version of the LiteLLM cost map json -# to avoid repetitive startup connections -LITELLM_LOCAL_MODEL_COST_MAP="True" \ No newline at end of file +ANONYMIZED_TELEMETRY=false \ No newline at end of file diff --git a/Dockerfile b/Dockerfile index c2c42aa17f..52987b5a6f 100644 --- a/Dockerfile +++ b/Dockerfile @@ -59,11 +59,6 @@ ENV OPENAI_API_KEY="" \ DO_NOT_TRACK=true \ ANONYMIZED_TELEMETRY=false -# Use locally bundled version of the LiteLLM cost map json -# to avoid repetitive startup connections -ENV LITELLM_LOCAL_MODEL_COST_MAP="True" - - #### Other models ######################################################### ## whisper TTS model settings ## ENV WHISPER_MODEL="base" \ @@ -83,10 +78,10 @@ WORKDIR /app/backend ENV HOME /root # Create user and group if not root RUN if [ $UID -ne 0 ]; then \ - if [ $GID -ne 0 ]; then \ - addgroup --gid $GID app; \ - fi; \ - adduser --uid $UID --gid $GID --home $HOME --disabled-password --no-create-home app; \ + if [ $GID -ne 0 ]; then \ + addgroup --gid $GID app; \ + fi; \ + adduser --uid $UID --gid $GID --home $HOME --disabled-password --no-create-home app; \ fi RUN mkdir -p $HOME/.cache/chroma diff --git a/backend/apps/litellm/main.py b/backend/apps/litellm/main.py deleted file mode 100644 index 2b771d5c6e..0000000000 --- a/backend/apps/litellm/main.py +++ /dev/null @@ -1,388 +0,0 @@ -import sys -from contextlib import asynccontextmanager - -from fastapi import FastAPI, Depends, HTTPException -from fastapi.routing import APIRoute -from fastapi.middleware.cors import CORSMiddleware - -import logging -from fastapi import FastAPI, Request, Depends, status, Response -from fastapi.responses import JSONResponse - -from starlette.middleware.base import BaseHTTPMiddleware, RequestResponseEndpoint -from starlette.responses import StreamingResponse -import json -import time -import requests - -from pydantic import BaseModel, ConfigDict -from typing import Optional, List - -from apps.web.models.models import Models -from utils.utils import get_verified_user, get_current_user, get_admin_user -from config import SRC_LOG_LEVELS -from constants import MESSAGES - -import os - -log = logging.getLogger(__name__) -log.setLevel(SRC_LOG_LEVELS["LITELLM"]) - - -from config import ( - ENABLE_LITELLM, - ENABLE_MODEL_FILTER, - MODEL_FILTER_LIST, - DATA_DIR, - LITELLM_PROXY_PORT, - LITELLM_PROXY_HOST, -) - -import warnings - -warnings.simplefilter("ignore") - -from litellm.utils import get_llm_provider - -import asyncio -import subprocess -import yaml - - -@asynccontextmanager -async def lifespan(app: FastAPI): - log.info("startup_event") - # TODO: Check config.yaml file and create one - asyncio.create_task(start_litellm_background()) - yield - - -app = FastAPI(lifespan=lifespan) - -origins = ["*"] - -app.add_middleware( - CORSMiddleware, - allow_origins=origins, - allow_credentials=True, - allow_methods=["*"], - allow_headers=["*"], -) - - -LITELLM_CONFIG_DIR = f"{DATA_DIR}/litellm/config.yaml" - -with open(LITELLM_CONFIG_DIR, "r") as file: - litellm_config = yaml.safe_load(file) - - -app.state.ENABLE_MODEL_FILTER = ENABLE_MODEL_FILTER.value -app.state.MODEL_FILTER_LIST = MODEL_FILTER_LIST.value -app.state.MODEL_CONFIG = Models.get_all_models() - -app.state.ENABLE = ENABLE_LITELLM -app.state.CONFIG = litellm_config - -# Global variable to store the subprocess reference -background_process = None - -CONFLICT_ENV_VARS = [ - # Uvicorn uses PORT, so LiteLLM might use it as well - "PORT", - # LiteLLM uses DATABASE_URL for Prisma connections - "DATABASE_URL", -] - - -async def run_background_process(command): - global background_process - log.info("run_background_process") - - try: - # Log the command to be executed - log.info(f"Executing command: {command}") - # Filter environment variables known to conflict with litellm - env = {k: v for k, v in os.environ.items() if k not in CONFLICT_ENV_VARS} - # Execute the command and create a subprocess - process = await asyncio.create_subprocess_exec( - *command, stdout=subprocess.PIPE, stderr=subprocess.PIPE, env=env - ) - background_process = process - log.info("Subprocess started successfully.") - - # Capture STDERR for debugging purposes - stderr_output = await process.stderr.read() - stderr_text = stderr_output.decode().strip() - if stderr_text: - log.info(f"Subprocess STDERR: {stderr_text}") - - # log.info output line by line - async for line in process.stdout: - log.info(line.decode().strip()) - - # Wait for the process to finish - returncode = await process.wait() - log.info(f"Subprocess exited with return code {returncode}") - except Exception as e: - log.error(f"Failed to start subprocess: {e}") - raise # Optionally re-raise the exception if you want it to propagate - - -async def start_litellm_background(): - log.info("start_litellm_background") - # Command to run in the background - command = [ - "litellm", - "--port", - str(LITELLM_PROXY_PORT), - "--host", - LITELLM_PROXY_HOST, - "--telemetry", - "False", - "--config", - LITELLM_CONFIG_DIR, - ] - - await run_background_process(command) - - -async def shutdown_litellm_background(): - log.info("shutdown_litellm_background") - global background_process - if background_process: - background_process.terminate() - await background_process.wait() # Ensure the process has terminated - log.info("Subprocess terminated") - background_process = None - - -@app.get("/") -async def get_status(): - return {"status": True} - - -async def restart_litellm(): - """ - Endpoint to restart the litellm background service. - """ - log.info("Requested restart of litellm service.") - try: - # Shut down the existing process if it is running - await shutdown_litellm_background() - log.info("litellm service shutdown complete.") - - # Restart the background service - - asyncio.create_task(start_litellm_background()) - log.info("litellm service restart complete.") - - return { - "status": "success", - "message": "litellm service restarted successfully.", - } - except Exception as e: - log.info(f"Error restarting litellm service: {e}") - raise HTTPException( - status_code=status.HTTP_500_INTERNAL_SERVER_ERROR, detail=str(e) - ) - - -@app.get("/restart") -async def restart_litellm_handler(user=Depends(get_admin_user)): - return await restart_litellm() - - -@app.get("/config") -async def get_config(user=Depends(get_admin_user)): - return app.state.CONFIG - - -class LiteLLMConfigForm(BaseModel): - general_settings: Optional[dict] = None - litellm_settings: Optional[dict] = None - model_list: Optional[List[dict]] = None - router_settings: Optional[dict] = None - - model_config = ConfigDict(protected_namespaces=()) - - -@app.post("/config/update") -async def update_config(form_data: LiteLLMConfigForm, user=Depends(get_admin_user)): - app.state.CONFIG = form_data.model_dump(exclude_none=True) - - with open(LITELLM_CONFIG_DIR, "w") as file: - yaml.dump(app.state.CONFIG, file) - - await restart_litellm() - return app.state.CONFIG - - -@app.get("/models") -@app.get("/v1/models") -async def get_models(user=Depends(get_current_user)): - - if app.state.ENABLE: - while not background_process: - await asyncio.sleep(0.1) - - url = f"http://localhost:{LITELLM_PROXY_PORT}/v1" - r = None - try: - r = requests.request(method="GET", url=f"{url}/models") - r.raise_for_status() - - data = r.json() - - if app.state.ENABLE_MODEL_FILTER: - if user and user.role == "user": - data["data"] = list( - filter( - lambda model: model["id"] in app.state.MODEL_FILTER_LIST, - data["data"], - ) - ) - - return data - except Exception as e: - - log.exception(e) - error_detail = "Open WebUI: Server Connection Error" - if r is not None: - try: - res = r.json() - if "error" in res: - error_detail = f"External: {res['error']}" - except: - error_detail = f"External: {e}" - - return { - "data": [ - { - "id": model["model_name"], - "object": "model", - "created": int(time.time()), - "owned_by": "openai", - "custom_info": next( - ( - item - for item in app.state.MODEL_CONFIG - if item.id == model["model_name"] - ), - None, - ), - } - for model in app.state.CONFIG["model_list"] - ], - "object": "list", - } - else: - return { - "data": [], - "object": "list", - } - - -@app.get("/model/info") -async def get_model_list(user=Depends(get_admin_user)): - return {"data": app.state.CONFIG["model_list"]} - - -class AddLiteLLMModelForm(BaseModel): - model_name: str - litellm_params: dict - - model_config = ConfigDict(protected_namespaces=()) - - -@app.post("/model/new") -async def add_model_to_config( - form_data: AddLiteLLMModelForm, user=Depends(get_admin_user) -): - try: - get_llm_provider(model=form_data.model_name) - app.state.CONFIG["model_list"].append(form_data.model_dump()) - - with open(LITELLM_CONFIG_DIR, "w") as file: - yaml.dump(app.state.CONFIG, file) - - await restart_litellm() - - return {"message": MESSAGES.MODEL_ADDED(form_data.model_name)} - except Exception as e: - print(e) - raise HTTPException( - status_code=status.HTTP_500_INTERNAL_SERVER_ERROR, detail=str(e) - ) - - -class DeleteLiteLLMModelForm(BaseModel): - id: str - - -@app.post("/model/delete") -async def delete_model_from_config( - form_data: DeleteLiteLLMModelForm, user=Depends(get_admin_user) -): - app.state.CONFIG["model_list"] = [ - model - for model in app.state.CONFIG["model_list"] - if model["model_name"] != form_data.id - ] - - with open(LITELLM_CONFIG_DIR, "w") as file: - yaml.dump(app.state.CONFIG, file) - - await restart_litellm() - - return {"message": MESSAGES.MODEL_DELETED(form_data.id)} - - -@app.api_route("/{path:path}", methods=["GET", "POST", "PUT", "DELETE"]) -async def proxy(path: str, request: Request, user=Depends(get_verified_user)): - body = await request.body() - - url = f"http://localhost:{LITELLM_PROXY_PORT}" - - target_url = f"{url}/{path}" - - headers = {} - # headers["Authorization"] = f"Bearer {key}" - headers["Content-Type"] = "application/json" - - r = None - - try: - r = requests.request( - method=request.method, - url=target_url, - data=body, - headers=headers, - stream=True, - ) - - r.raise_for_status() - - # Check if response is SSE - if "text/event-stream" in r.headers.get("Content-Type", ""): - return StreamingResponse( - r.iter_content(chunk_size=8192), - status_code=r.status_code, - headers=dict(r.headers), - ) - else: - response_data = r.json() - return response_data - except Exception as e: - log.exception(e) - error_detail = "Open WebUI: Server Connection Error" - if r is not None: - try: - res = r.json() - if "error" in res: - error_detail = f"External: {res['error']['message'] if 'message' in res['error'] else res['error']}" - except: - error_detail = f"External: {e}" - - raise HTTPException( - status_code=r.status_code if r else 500, detail=error_detail - ) diff --git a/backend/apps/web/models/modelfiles.py b/backend/apps/web/models/modelfiles.py deleted file mode 100644 index fe278ed5f9..0000000000 --- a/backend/apps/web/models/modelfiles.py +++ /dev/null @@ -1,144 +0,0 @@ -################################################################################ -# DEPRECATION NOTICE # -# # -# This file has been deprecated since version 0.2.0. # -# # -################################################################################ - - -from pydantic import BaseModel -from peewee import * -from playhouse.shortcuts import model_to_dict -from typing import List, Union, Optional -import time - -from utils.utils import decode_token -from utils.misc import get_gravatar_url - -from apps.web.internal.db import DB - -import json - -#################### -# Modelfile DB Schema -#################### - - -class Modelfile(Model): - tag_name = CharField(unique=True) - user_id = CharField() - modelfile = TextField() - timestamp = BigIntegerField() - - class Meta: - database = DB - - -class ModelfileModel(BaseModel): - tag_name: str - user_id: str - modelfile: str - timestamp: int # timestamp in epoch - - -#################### -# Forms -#################### - - -class ModelfileForm(BaseModel): - modelfile: dict - - -class ModelfileTagNameForm(BaseModel): - tag_name: str - - -class ModelfileUpdateForm(ModelfileForm, ModelfileTagNameForm): - pass - - -class ModelfileResponse(BaseModel): - tag_name: str - user_id: str - modelfile: dict - timestamp: int # timestamp in epoch - - -class ModelfilesTable: - - def __init__(self, db): - self.db = db - self.db.create_tables([Modelfile]) - - def insert_new_modelfile( - self, user_id: str, form_data: ModelfileForm - ) -> Optional[ModelfileModel]: - if "tagName" in form_data.modelfile: - modelfile = ModelfileModel( - **{ - "user_id": user_id, - "tag_name": form_data.modelfile["tagName"], - "modelfile": json.dumps(form_data.modelfile), - "timestamp": int(time.time()), - } - ) - - try: - result = Modelfile.create(**modelfile.model_dump()) - if result: - return modelfile - else: - return None - except: - return None - - else: - return None - - def get_modelfile_by_tag_name(self, tag_name: str) -> Optional[ModelfileModel]: - try: - modelfile = Modelfile.get(Modelfile.tag_name == tag_name) - return ModelfileModel(**model_to_dict(modelfile)) - except: - return None - - def get_modelfiles(self, skip: int = 0, limit: int = 50) -> List[ModelfileResponse]: - return [ - ModelfileResponse( - **{ - **model_to_dict(modelfile), - "modelfile": json.loads(modelfile.modelfile), - } - ) - for modelfile in Modelfile.select() - # .limit(limit).offset(skip) - ] - - def update_modelfile_by_tag_name( - self, tag_name: str, modelfile: dict - ) -> Optional[ModelfileModel]: - try: - query = Modelfile.update( - modelfile=json.dumps(modelfile), - timestamp=int(time.time()), - ).where(Modelfile.tag_name == tag_name) - - query.execute() - - modelfile = Modelfile.get(Modelfile.tag_name == tag_name) - return ModelfileModel(**model_to_dict(modelfile)) - except: - return None - - def delete_modelfile_by_tag_name(self, tag_name: str) -> bool: - try: - query = Modelfile.delete().where((Modelfile.tag_name == tag_name)) - query.execute() # Remove the rows, return number of rows removed. - - return True - except: - return False - - -Modelfiles = ModelfilesTable(DB) diff --git a/backend/config.py b/backend/config.py index 0b18eab435..81f8afcad8 100644 --- a/backend/config.py +++ b/backend/config.py @@ -56,7 +56,6 @@ log_sources = [ "CONFIG", "DB", "IMAGES", - "LITELLM", "MAIN", "MODELS", "OLLAMA", @@ -374,10 +373,10 @@ def create_config_file(file_path): LITELLM_CONFIG_PATH = f"{DATA_DIR}/litellm/config.yaml" -if not os.path.exists(LITELLM_CONFIG_PATH): - log.info("Config file doesn't exist. Creating...") - create_config_file(LITELLM_CONFIG_PATH) - log.info("Config file created successfully.") +# if not os.path.exists(LITELLM_CONFIG_PATH): +# log.info("Config file doesn't exist. Creating...") +# create_config_file(LITELLM_CONFIG_PATH) +# log.info("Config file created successfully.") #################################### @@ -826,18 +825,6 @@ AUDIO_OPENAI_API_VOICE = PersistentConfig( os.getenv("AUDIO_OPENAI_API_VOICE", "alloy"), ) -#################################### -# LiteLLM -#################################### - - -ENABLE_LITELLM = os.environ.get("ENABLE_LITELLM", "True").lower() == "true" - -LITELLM_PROXY_PORT = int(os.getenv("LITELLM_PROXY_PORT", "14365")) -if LITELLM_PROXY_PORT < 0 or LITELLM_PROXY_PORT > 65535: - raise ValueError("Invalid port number for LITELLM_PROXY_PORT") -LITELLM_PROXY_HOST = os.getenv("LITELLM_PROXY_HOST", "127.0.0.1") - #################################### # Database diff --git a/backend/main.py b/backend/main.py index aa3004865e..d9ebe922c0 100644 --- a/backend/main.py +++ b/backend/main.py @@ -22,13 +22,6 @@ from starlette.responses import StreamingResponse, Response from apps.ollama.main import app as ollama_app, get_all_models as get_ollama_models from apps.openai.main import app as openai_app, get_all_models as get_openai_models -from apps.litellm.main import ( - app as litellm_app, - start_litellm_background, - shutdown_litellm_background, -) - - from apps.audio.main import app as audio_app from apps.images.main import app as images_app from apps.rag.main import app as rag_app @@ -55,7 +48,6 @@ from config import ( STATIC_DIR, ENABLE_OPENAI_API, ENABLE_OLLAMA_API, - ENABLE_LITELLM, ENABLE_MODEL_FILTER, MODEL_FILTER_LIST, GLOBAL_LOG_LEVEL, @@ -100,11 +92,7 @@ https://github.com/open-webui/open-webui @asynccontextmanager async def lifespan(app: FastAPI): - if ENABLE_LITELLM: - asyncio.create_task(start_litellm_background()) yield - if ENABLE_LITELLM: - await shutdown_litellm_background() app = FastAPI( @@ -262,9 +250,6 @@ async def update_embedding_function(request: Request, call_next): return response -# TODO: Deprecate LiteLLM -app.mount("/litellm/api", litellm_app) - app.mount("/ollama", ollama_app) app.mount("/openai", openai_app) @@ -407,9 +392,6 @@ async def update_model_filter_config( openai_app.state.config.ENABLE_MODEL_FILTER = app.state.config.ENABLE_MODEL_FILTER openai_app.state.config.MODEL_FILTER_LIST = app.state.config.MODEL_FILTER_LIST - litellm_app.state.ENABLE_MODEL_FILTER = app.state.config.ENABLE_MODEL_FILTER - litellm_app.state.MODEL_FILTER_LIST = app.state.config.MODEL_FILTER_LIST - return { "enabled": app.state.config.ENABLE_MODEL_FILTER, "models": app.state.config.MODEL_FILTER_LIST, diff --git a/backend/requirements.txt b/backend/requirements.txt index 29e37f8b8b..7a3668428f 100644 --- a/backend/requirements.txt +++ b/backend/requirements.txt @@ -18,8 +18,6 @@ psycopg2-binary==2.9.9 PyMySQL==1.1.1 bcrypt==4.1.3 -litellm[proxy]==1.37.20 - boto3==1.34.110 argon2-cffi==23.1.0 diff --git a/backend/space/litellm_config.yaml b/backend/space/litellm_config.yaml deleted file mode 100644 index af4f880b9f..0000000000 --- a/backend/space/litellm_config.yaml +++ /dev/null @@ -1,43 +0,0 @@ -litellm_settings: - drop_params: true -model_list: - - model_name: 'HuggingFace: Mistral: Mistral 7B Instruct v0.1' - litellm_params: - model: huggingface/mistralai/Mistral-7B-Instruct-v0.1 - api_key: os.environ/HF_TOKEN - max_tokens: 1024 - - model_name: 'HuggingFace: Mistral: Mistral 7B Instruct v0.2' - litellm_params: - model: huggingface/mistralai/Mistral-7B-Instruct-v0.2 - api_key: os.environ/HF_TOKEN - max_tokens: 1024 - - model_name: 'HuggingFace: Meta: Llama 3 8B Instruct' - litellm_params: - model: huggingface/meta-llama/Meta-Llama-3-8B-Instruct - api_key: os.environ/HF_TOKEN - max_tokens: 2047 - - model_name: 'HuggingFace: Mistral: Mixtral 8x7B Instruct v0.1' - litellm_params: - model: huggingface/mistralai/Mixtral-8x7B-Instruct-v0.1 - api_key: os.environ/HF_TOKEN - max_tokens: 8192 - - model_name: 'HuggingFace: Microsoft: Phi-3 Mini-4K-Instruct' - litellm_params: - model: huggingface/microsoft/Phi-3-mini-4k-instruct - api_key: os.environ/HF_TOKEN - max_tokens: 1024 - - model_name: 'HuggingFace: Google: Gemma 7B 1.1' - litellm_params: - model: huggingface/google/gemma-1.1-7b-it - api_key: os.environ/HF_TOKEN - max_tokens: 1024 - - model_name: 'HuggingFace: Yi-1.5 34B Chat' - litellm_params: - model: huggingface/01-ai/Yi-1.5-34B-Chat - api_key: os.environ/HF_TOKEN - max_tokens: 1024 - - model_name: 'HuggingFace: Nous Research: Nous Hermes 2 Mixtral 8x7B DPO' - litellm_params: - model: huggingface/NousResearch/Nous-Hermes-2-Mixtral-8x7B-DPO - api_key: os.environ/HF_TOKEN - max_tokens: 2048 diff --git a/backend/start.sh b/backend/start.sh index ba7741e1df..15fc568d3c 100755 --- a/backend/start.sh +++ b/backend/start.sh @@ -34,11 +34,6 @@ fi # Check if SPACE_ID is set, if so, configure for space if [ -n "$SPACE_ID" ]; then echo "Configuring for HuggingFace Space deployment" - - # Copy litellm_config.yaml with specified ownership - echo "Copying litellm_config.yaml to the desired location with specified ownership..." - cp -f ./space/litellm_config.yaml ./data/litellm/config.yaml - if [ -n "$ADMIN_USER_EMAIL" ] && [ -n "$ADMIN_USER_PASSWORD" ]; then echo "Admin user configured, creating" WEBUI_SECRET_KEY="$WEBUI_SECRET_KEY" uvicorn main:app --host "$HOST" --port "$PORT" --forwarded-allow-ips '*' & diff --git a/src/lib/apis/litellm/index.ts b/src/lib/apis/litellm/index.ts deleted file mode 100644 index b1c24c5bde..0000000000 --- a/src/lib/apis/litellm/index.ts +++ /dev/null @@ -1,151 +0,0 @@ -import { LITELLM_API_BASE_URL } from '$lib/constants'; - -export const getLiteLLMModels = async (token: string = '') => { - let error = null; - - const res = await fetch(`${LITELLM_API_BASE_URL}/v1/models`, { - method: 'GET', - headers: { - Accept: 'application/json', - 'Content-Type': 'application/json', - ...(token && { authorization: `Bearer ${token}` }) - } - }) - .then(async (res) => { - if (!res.ok) throw await res.json(); - return res.json(); - }) - .catch((err) => { - console.log(err); - error = `LiteLLM: ${err?.error?.message ?? 'Network Problem'}`; - return []; - }); - - if (error) { - throw error; - } - - const models = Array.isArray(res) ? res : res?.data ?? null; - - return models - ? models - .map((model) => ({ - id: model.id, - name: model.name ?? model.id, - external: true, - source: 'LiteLLM', - custom_info: model.custom_info - })) - .sort((a, b) => { - return a.name.localeCompare(b.name); - }) - : models; -}; - -export const getLiteLLMModelInfo = async (token: string = '') => { - let error = null; - - const res = await fetch(`${LITELLM_API_BASE_URL}/model/info`, { - method: 'GET', - headers: { - Accept: 'application/json', - 'Content-Type': 'application/json', - ...(token && { authorization: `Bearer ${token}` }) - } - }) - .then(async (res) => { - if (!res.ok) throw await res.json(); - return res.json(); - }) - .catch((err) => { - console.log(err); - error = `LiteLLM: ${err?.error?.message ?? 'Network Problem'}`; - return []; - }); - - if (error) { - throw error; - } - - const models = Array.isArray(res) ? res : res?.data ?? null; - - return models; -}; - -type AddLiteLLMModelForm = { - name: string; - model: string; - api_base: string; - api_key: string; - rpm: string; - max_tokens: string; -}; - -export const addLiteLLMModel = async (token: string = '', payload: AddLiteLLMModelForm) => { - let error = null; - - const res = await fetch(`${LITELLM_API_BASE_URL}/model/new`, { - method: 'POST', - headers: { - Accept: 'application/json', - 'Content-Type': 'application/json', - ...(token && { authorization: `Bearer ${token}` }) - }, - body: JSON.stringify({ - model_name: payload.name, - litellm_params: { - model: payload.model, - ...(payload.api_base === '' ? {} : { api_base: payload.api_base }), - ...(payload.api_key === '' ? {} : { api_key: payload.api_key }), - ...(isNaN(parseInt(payload.rpm)) ? {} : { rpm: parseInt(payload.rpm) }), - ...(payload.max_tokens === '' ? {} : { max_tokens: payload.max_tokens }) - } - }) - }) - .then(async (res) => { - if (!res.ok) throw await res.json(); - return res.json(); - }) - .catch((err) => { - console.log(err); - error = `LiteLLM: ${err?.error?.message ?? 'Network Problem'}`; - return []; - }); - - if (error) { - throw error; - } - - return res; -}; - -export const deleteLiteLLMModel = async (token: string = '', id: string) => { - let error = null; - - const res = await fetch(`${LITELLM_API_BASE_URL}/model/delete`, { - method: 'POST', - headers: { - Accept: 'application/json', - 'Content-Type': 'application/json', - ...(token && { authorization: `Bearer ${token}` }) - }, - body: JSON.stringify({ - id: id - }) - }) - .then(async (res) => { - if (!res.ok) throw await res.json(); - return res.json(); - }) - .catch((err) => { - console.log(err); - error = `LiteLLM: ${err?.error?.message ?? 'Network Problem'}`; - return []; - }); - - if (error) { - throw error; - } - - return res; -}; diff --git a/src/lib/components/chat/Chat.svelte b/src/lib/components/chat/Chat.svelte index ff025868cb..507aa785d6 100644 --- a/src/lib/components/chat/Chat.svelte +++ b/src/lib/components/chat/Chat.svelte @@ -35,12 +35,7 @@ import MessageInput from '$lib/components/chat/MessageInput.svelte'; import Messages from '$lib/components/chat/Messages.svelte'; import Navbar from '$lib/components/layout/Navbar.svelte'; - import { - LITELLM_API_BASE_URL, - OLLAMA_API_BASE_URL, - OPENAI_API_BASE_URL, - WEBUI_BASE_URL - } from '$lib/constants'; + import { OLLAMA_API_BASE_URL, OPENAI_API_BASE_URL, WEBUI_BASE_URL } from '$lib/constants'; import { createOpenAITextStream } from '$lib/apis/streaming'; import { queryMemory } from '$lib/apis/memories'; import type { Writable } from 'svelte/store'; @@ -733,9 +728,7 @@ docs: docs.length > 0 ? docs : undefined, citations: docs.length > 0 }, - model?.source?.toLowerCase() === 'litellm' - ? `${LITELLM_API_BASE_URL}/v1` - : `${OPENAI_API_BASE_URL}` + `${OPENAI_API_BASE_URL}` ); // Wait until history/message have been updated diff --git a/src/lib/components/workspace/Playground.svelte b/src/lib/components/workspace/Playground.svelte index 2142b15d6f..476ce774dc 100644 --- a/src/lib/components/workspace/Playground.svelte +++ b/src/lib/components/workspace/Playground.svelte @@ -5,12 +5,7 @@ import { toast } from 'svelte-sonner'; - import { - LITELLM_API_BASE_URL, - OLLAMA_API_BASE_URL, - OPENAI_API_BASE_URL, - WEBUI_API_BASE_URL - } from '$lib/constants'; + import { OLLAMA_API_BASE_URL, OPENAI_API_BASE_URL, WEBUI_API_BASE_URL } from '$lib/constants'; import { WEBUI_NAME, config, user, models, settings } from '$lib/stores'; import { cancelOllamaRequest, generateChatCompletion } from '$lib/apis/ollama'; @@ -79,11 +74,7 @@ } ] }, - model.external - ? model.source === 'litellm' - ? `${LITELLM_API_BASE_URL}/v1` - : `${OPENAI_API_BASE_URL}` - : `${OLLAMA_API_BASE_URL}/v1` + model?.owned_by === 'openai' ? `${OPENAI_API_BASE_URL}` : `${OLLAMA_API_BASE_URL}/v1` ); if (res && res.ok) { @@ -150,11 +141,7 @@ ...messages ].filter((message) => message) }, - model.external - ? model.source === 'litellm' - ? `${LITELLM_API_BASE_URL}/v1` - : `${OPENAI_API_BASE_URL}` - : `${OLLAMA_API_BASE_URL}/v1` + model?.owned_by === 'openai' ? `${OPENAI_API_BASE_URL}` : `${OLLAMA_API_BASE_URL}/v1` ); let responseMessage; diff --git a/src/lib/constants.ts b/src/lib/constants.ts index 3ae4244403..9f6070beeb 100644 --- a/src/lib/constants.ts +++ b/src/lib/constants.ts @@ -6,7 +6,6 @@ export const WEBUI_BASE_URL = browser ? (dev ? `http://${location.hostname}:8080 export const WEBUI_API_BASE_URL = `${WEBUI_BASE_URL}/api/v1`; -export const LITELLM_API_BASE_URL = `${WEBUI_BASE_URL}/litellm/api`; export const OLLAMA_API_BASE_URL = `${WEBUI_BASE_URL}/ollama`; export const OPENAI_API_BASE_URL = `${WEBUI_BASE_URL}/openai`; export const AUDIO_API_BASE_URL = `${WEBUI_BASE_URL}/audio/api/v1`; From 7f77b3addbe68299a46484ba50cf84665e8761f8 Mon Sep 17 00:00:00 2001 From: "Timothy J. Baek" Date: Sat, 25 May 2024 14:52:08 -0700 Subject: [PATCH 11/28] rm litellm dependency --- requirements-dev.lock | 10 +++------- requirements.lock | 10 +++------- 2 files changed, 6 insertions(+), 14 deletions(-) diff --git a/requirements-dev.lock b/requirements-dev.lock index 93c126eb48..39b1d0ef02 100644 --- a/requirements-dev.lock +++ b/requirements-dev.lock @@ -273,7 +273,6 @@ langsmith==0.1.57 # via langchain-community # via langchain-core litellm==1.37.20 - # via litellm # via open-webui lxml==5.2.2 # via unstructured @@ -396,7 +395,6 @@ pandas==2.2.2 # via open-webui passlib==1.7.4 # via open-webui - # via passlib pathspec==0.12.1 # via black peewee==3.17.5 @@ -454,7 +452,6 @@ pygments==2.18.0 pyjwt==2.8.0 # via litellm # via open-webui - # via pyjwt pymysql==1.1.0 # via open-webui pypandoc==1.13 @@ -559,6 +556,9 @@ scipy==1.13.0 # via sentence-transformers sentence-transformers==2.7.0 # via open-webui +setuptools==69.5.1 + # via ctranslate2 + # via opentelemetry-instrumentation shapely==2.0.4 # via rapidocr-onnxruntime shellingham==1.5.4 @@ -659,7 +659,6 @@ uvicorn==0.22.0 # via fastapi # via litellm # via open-webui - # via uvicorn uvloop==0.19.0 # via uvicorn validators==0.28.1 @@ -687,6 +686,3 @@ youtube-transcript-api==0.6.2 # via open-webui zipp==3.18.1 # via importlib-metadata -setuptools==69.5.1 - # via ctranslate2 - # via opentelemetry-instrumentation diff --git a/requirements.lock b/requirements.lock index 93c126eb48..39b1d0ef02 100644 --- a/requirements.lock +++ b/requirements.lock @@ -273,7 +273,6 @@ langsmith==0.1.57 # via langchain-community # via langchain-core litellm==1.37.20 - # via litellm # via open-webui lxml==5.2.2 # via unstructured @@ -396,7 +395,6 @@ pandas==2.2.2 # via open-webui passlib==1.7.4 # via open-webui - # via passlib pathspec==0.12.1 # via black peewee==3.17.5 @@ -454,7 +452,6 @@ pygments==2.18.0 pyjwt==2.8.0 # via litellm # via open-webui - # via pyjwt pymysql==1.1.0 # via open-webui pypandoc==1.13 @@ -559,6 +556,9 @@ scipy==1.13.0 # via sentence-transformers sentence-transformers==2.7.0 # via open-webui +setuptools==69.5.1 + # via ctranslate2 + # via opentelemetry-instrumentation shapely==2.0.4 # via rapidocr-onnxruntime shellingham==1.5.4 @@ -659,7 +659,6 @@ uvicorn==0.22.0 # via fastapi # via litellm # via open-webui - # via uvicorn uvloop==0.19.0 # via uvicorn validators==0.28.1 @@ -687,6 +686,3 @@ youtube-transcript-api==0.6.2 # via open-webui zipp==3.18.1 # via importlib-metadata -setuptools==69.5.1 - # via ctranslate2 - # via opentelemetry-instrumentation From 74ca4189e2b2dcff8439e72e2763537b06c5a055 Mon Sep 17 00:00:00 2001 From: "Timothy J. Baek" Date: Sat, 25 May 2024 15:46:22 -0700 Subject: [PATCH 12/28] fix --- backend/config.py | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/backend/config.py b/backend/config.py index 81f8afcad8..ac880c8696 100644 --- a/backend/config.py +++ b/backend/config.py @@ -27,6 +27,8 @@ from constants import ERROR_MESSAGES BACKEND_DIR = Path(__file__).parent # the path containing this file BASE_DIR = BACKEND_DIR.parent # the path containing the backend/ +print(BASE_DIR) + try: from dotenv import load_dotenv, find_dotenv @@ -121,7 +123,9 @@ def parse_section(section): try: - changelog_content = (BASE_DIR / "CHANGELOG.md").read_text() + with open(BASE_DIR / "CHANGELOG.md", "r") as file: + changelog_content = file.read() + except: changelog_content = (pkgutil.get_data("open_webui", "CHANGELOG.md") or b"").decode() From 5e4a1ff6fbb68dd6a64980cd79dfce3e782c62e5 Mon Sep 17 00:00:00 2001 From: "Timothy J. Baek" Date: Sat, 25 May 2024 15:54:00 -0700 Subject: [PATCH 13/28] fix --- backend/config.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/backend/config.py b/backend/config.py index ac880c8696..4ba33f0766 100644 --- a/backend/config.py +++ b/backend/config.py @@ -123,7 +123,8 @@ def parse_section(section): try: - with open(BASE_DIR / "CHANGELOG.md", "r") as file: + changelog_path = BASE_DIR / "CHANGELOG.md" + with open(str(changelog_path.absolute()), "r") as file: changelog_content = file.read() except: From c1526b00229b335804d422ae52060a37ddd5d0d0 Mon Sep 17 00:00:00 2001 From: "Timothy J. Baek" Date: Sat, 25 May 2024 15:56:47 -0700 Subject: [PATCH 14/28] fix --- backend/config.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/backend/config.py b/backend/config.py index 4ba33f0766..daa89de575 100644 --- a/backend/config.py +++ b/backend/config.py @@ -124,7 +124,7 @@ def parse_section(section): try: changelog_path = BASE_DIR / "CHANGELOG.md" - with open(str(changelog_path.absolute()), "r") as file: + with open(str(changelog_path.absolute()), "r", encoding="utf8") as file: changelog_content = file.read() except: From 1ab01170b9d61b8229140bb9c0fdc6d57895268f Mon Sep 17 00:00:00 2001 From: "Timothy J. Baek" Date: Sat, 25 May 2024 16:26:25 -0700 Subject: [PATCH 15/28] refac: loading --- src/lib/apis/ollama/index.ts | 2 +- src/lib/components/chat/Settings/Models.svelte | 14 +++++++++++--- src/lib/components/common/Spinner.svelte | 6 +++--- 3 files changed, 15 insertions(+), 7 deletions(-) diff --git a/src/lib/apis/ollama/index.ts b/src/lib/apis/ollama/index.ts index b7f8421771..efc3f0d0f0 100644 --- a/src/lib/apis/ollama/index.ts +++ b/src/lib/apis/ollama/index.ts @@ -164,7 +164,7 @@ export const getOllamaVersion = async (token: string = '') => { throw error; } - return res?.version ?? ''; + return res?.version ?? false; }; export const getOllamaModels = async (token: string = '') => { diff --git a/src/lib/components/chat/Settings/Models.svelte b/src/lib/components/chat/Settings/Models.svelte index c99de9251b..7254f2d270 100644 --- a/src/lib/components/chat/Settings/Models.svelte +++ b/src/lib/components/chat/Settings/Models.svelte @@ -18,6 +18,7 @@ import { onMount, getContext } from 'svelte'; import Tooltip from '$lib/components/common/Tooltip.svelte'; + import Spinner from '$lib/components/common/Spinner.svelte'; const i18n = getContext('i18n'); @@ -34,7 +35,8 @@ let updateProgress = null; let showExperimentalOllama = false; - let ollamaVersion = ''; + + let ollamaVersion = null; const MAX_PARALLEL_DOWNLOADS = 3; let modelTransferring = false; @@ -449,7 +451,7 @@
- {#if ollamaVersion} + {#if ollamaVersion !== null}
{$i18n.t('Manage Ollama Models')}
@@ -880,8 +882,14 @@ {/if}
- {:else} + {:else if ollamaVersion === false}
Ollama Not Detected
+ {:else} +
+
+ +
+
{/if}
diff --git a/src/lib/components/common/Spinner.svelte b/src/lib/components/common/Spinner.svelte index 4b7f5e3961..a22f56dcb2 100644 --- a/src/lib/components/common/Spinner.svelte +++ b/src/lib/components/common/Spinner.svelte @@ -1,9 +1,9 @@ -
- +
{$i18n.t('Models')}
+
+
+
- {#each $models as model} + {#each $models.filter((m) => searchValue === '' || m.name + .toLowerCase() + .includes(searchValue.toLowerCase())) as model}
From 27f034b216e6ee9a1d9d0d17b8efffe97bd209c8 Mon Sep 17 00:00:00 2001 From: "Timothy J. Baek" Date: Sun, 26 May 2024 00:17:20 -0700 Subject: [PATCH 18/28] feat: auto detect user language --- src/routes/+layout.svelte | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/src/routes/+layout.svelte b/src/routes/+layout.svelte index d4a3f08115..c0ede634f7 100644 --- a/src/routes/+layout.svelte +++ b/src/routes/+layout.svelte @@ -13,7 +13,7 @@ import 'tippy.js/dist/tippy.css'; import { WEBUI_BASE_URL } from '$lib/constants'; - import i18n, { initI18n } from '$lib/i18n'; + import i18n, { initI18n, getLanguages } from '$lib/i18n'; setContext('i18n', i18n); @@ -43,7 +43,14 @@ } // Initialize i18n even if we didn't get a backend config, // so `/error` can show something that's not `undefined`. - initI18n(backendConfig?.default_locale); + + const languages = await getLanguages(); + + const browserLanguage = navigator.languages + ? navigator.languages[0] + : navigator.language || navigator.userLanguage; + + initI18n(languages.includes(browserLanguage) ? browserLanguage : backendConfig?.default_locale); if (backendConfig) { // Save Backend Status to Store From 1fce4662535bdee9f64727c8a849e7c81536a50a Mon Sep 17 00:00:00 2001 From: "Timothy J. Baek" Date: Sun, 26 May 2024 01:15:48 -0700 Subject: [PATCH 19/28] refac: folder rename web -> webui --- backend/apps/ollama/main.py | 4 ++-- backend/apps/openai/main.py | 4 ++-- backend/apps/{web => webui}/internal/db.py | 0 .../internal/migrations/001_initial_schema.py | 0 .../internal/migrations/002_add_local_sharing.py | 0 .../internal/migrations/003_add_auth_api_key.py | 0 .../{web => webui}/internal/migrations/004_add_archived.py | 0 .../internal/migrations/005_add_updated_at.py | 0 .../migrations/006_migrate_timestamps_and_charfields.py | 0 .../internal/migrations/007_add_user_last_active_at.py | 0 .../{web => webui}/internal/migrations/008_add_memory.py | 0 .../{web => webui}/internal/migrations/009_add_models.py | 0 .../internal/migrations/010_migrate_modelfiles_to_models.py | 0 backend/apps/{web => webui}/internal/migrations/README.md | 2 +- backend/apps/{web => webui}/main.py | 2 +- backend/apps/{web => webui}/models/auths.py | 4 ++-- backend/apps/{web => webui}/models/chats.py | 2 +- backend/apps/{web => webui}/models/documents.py | 2 +- backend/apps/{web => webui}/models/memories.py | 4 ++-- backend/apps/{web => webui}/models/models.py | 2 +- backend/apps/{web => webui}/models/prompts.py | 2 +- backend/apps/{web => webui}/models/tags.py | 2 +- backend/apps/{web => webui}/models/users.py | 4 ++-- backend/apps/{web => webui}/routers/auths.py | 4 ++-- backend/apps/{web => webui}/routers/chats.py | 6 +++--- backend/apps/{web => webui}/routers/configs.py | 2 +- backend/apps/{web => webui}/routers/documents.py | 2 +- backend/apps/{web => webui}/routers/memories.py | 2 +- backend/apps/{web => webui}/routers/models.py | 2 +- backend/apps/{web => webui}/routers/prompts.py | 2 +- backend/apps/{web => webui}/routers/users.py | 6 +++--- backend/apps/{web => webui}/routers/utils.py | 2 +- backend/main.py | 4 ++-- backend/utils/models.py | 2 +- backend/utils/utils.py | 2 +- 35 files changed, 35 insertions(+), 35 deletions(-) rename backend/apps/{web => webui}/internal/db.py (100%) rename backend/apps/{web => webui}/internal/migrations/001_initial_schema.py (100%) rename backend/apps/{web => webui}/internal/migrations/002_add_local_sharing.py (100%) rename backend/apps/{web => webui}/internal/migrations/003_add_auth_api_key.py (100%) rename backend/apps/{web => webui}/internal/migrations/004_add_archived.py (100%) rename backend/apps/{web => webui}/internal/migrations/005_add_updated_at.py (100%) rename backend/apps/{web => webui}/internal/migrations/006_migrate_timestamps_and_charfields.py (100%) rename backend/apps/{web => webui}/internal/migrations/007_add_user_last_active_at.py (100%) rename backend/apps/{web => webui}/internal/migrations/008_add_memory.py (100%) rename backend/apps/{web => webui}/internal/migrations/009_add_models.py (100%) rename backend/apps/{web => webui}/internal/migrations/010_migrate_modelfiles_to_models.py (100%) rename backend/apps/{web => webui}/internal/migrations/README.md (84%) rename backend/apps/{web => webui}/main.py (98%) rename backend/apps/{web => webui}/models/auths.py (98%) rename backend/apps/{web => webui}/models/chats.py (99%) rename backend/apps/{web => webui}/models/documents.py (99%) rename backend/apps/{web => webui}/models/memories.py (97%) rename backend/apps/{web => webui}/models/models.py (98%) rename backend/apps/{web => webui}/models/prompts.py (98%) rename backend/apps/{web => webui}/models/tags.py (99%) rename backend/apps/{web => webui}/models/users.py (98%) rename backend/apps/{web => webui}/routers/auths.py (99%) rename backend/apps/{web => webui}/routers/chats.py (99%) rename backend/apps/{web => webui}/routers/configs.py (97%) rename backend/apps/{web => webui}/routers/documents.py (98%) rename backend/apps/{web => webui}/routers/memories.py (98%) rename backend/apps/{web => webui}/routers/models.py (97%) rename backend/apps/{web => webui}/routers/prompts.py (97%) rename backend/apps/{web => webui}/routers/users.py (96%) rename backend/apps/{web => webui}/routers/utils.py (98%) diff --git a/backend/apps/ollama/main.py b/backend/apps/ollama/main.py index 7288f34676..09c50286a4 100644 --- a/backend/apps/ollama/main.py +++ b/backend/apps/ollama/main.py @@ -29,8 +29,8 @@ import time from urllib.parse import urlparse from typing import Optional, List, Union -from apps.web.models.models import Models -from apps.web.models.users import Users +from apps.webui.models.models import Models +from apps.webui.models.users import Users from constants import ERROR_MESSAGES from utils.utils import ( decode_token, diff --git a/backend/apps/openai/main.py b/backend/apps/openai/main.py index ded7e66266..74ac18a12f 100644 --- a/backend/apps/openai/main.py +++ b/backend/apps/openai/main.py @@ -10,8 +10,8 @@ import logging from pydantic import BaseModel -from apps.web.models.models import Models -from apps.web.models.users import Users +from apps.webui.models.models import Models +from apps.webui.models.users import Users from constants import ERROR_MESSAGES from utils.utils import ( decode_token, diff --git a/backend/apps/web/internal/db.py b/backend/apps/webui/internal/db.py similarity index 100% rename from backend/apps/web/internal/db.py rename to backend/apps/webui/internal/db.py diff --git a/backend/apps/web/internal/migrations/001_initial_schema.py b/backend/apps/webui/internal/migrations/001_initial_schema.py similarity index 100% rename from backend/apps/web/internal/migrations/001_initial_schema.py rename to backend/apps/webui/internal/migrations/001_initial_schema.py diff --git a/backend/apps/web/internal/migrations/002_add_local_sharing.py b/backend/apps/webui/internal/migrations/002_add_local_sharing.py similarity index 100% rename from backend/apps/web/internal/migrations/002_add_local_sharing.py rename to backend/apps/webui/internal/migrations/002_add_local_sharing.py diff --git a/backend/apps/web/internal/migrations/003_add_auth_api_key.py b/backend/apps/webui/internal/migrations/003_add_auth_api_key.py similarity index 100% rename from backend/apps/web/internal/migrations/003_add_auth_api_key.py rename to backend/apps/webui/internal/migrations/003_add_auth_api_key.py diff --git a/backend/apps/web/internal/migrations/004_add_archived.py b/backend/apps/webui/internal/migrations/004_add_archived.py similarity index 100% rename from backend/apps/web/internal/migrations/004_add_archived.py rename to backend/apps/webui/internal/migrations/004_add_archived.py diff --git a/backend/apps/web/internal/migrations/005_add_updated_at.py b/backend/apps/webui/internal/migrations/005_add_updated_at.py similarity index 100% rename from backend/apps/web/internal/migrations/005_add_updated_at.py rename to backend/apps/webui/internal/migrations/005_add_updated_at.py diff --git a/backend/apps/web/internal/migrations/006_migrate_timestamps_and_charfields.py b/backend/apps/webui/internal/migrations/006_migrate_timestamps_and_charfields.py similarity index 100% rename from backend/apps/web/internal/migrations/006_migrate_timestamps_and_charfields.py rename to backend/apps/webui/internal/migrations/006_migrate_timestamps_and_charfields.py diff --git a/backend/apps/web/internal/migrations/007_add_user_last_active_at.py b/backend/apps/webui/internal/migrations/007_add_user_last_active_at.py similarity index 100% rename from backend/apps/web/internal/migrations/007_add_user_last_active_at.py rename to backend/apps/webui/internal/migrations/007_add_user_last_active_at.py diff --git a/backend/apps/web/internal/migrations/008_add_memory.py b/backend/apps/webui/internal/migrations/008_add_memory.py similarity index 100% rename from backend/apps/web/internal/migrations/008_add_memory.py rename to backend/apps/webui/internal/migrations/008_add_memory.py diff --git a/backend/apps/web/internal/migrations/009_add_models.py b/backend/apps/webui/internal/migrations/009_add_models.py similarity index 100% rename from backend/apps/web/internal/migrations/009_add_models.py rename to backend/apps/webui/internal/migrations/009_add_models.py diff --git a/backend/apps/web/internal/migrations/010_migrate_modelfiles_to_models.py b/backend/apps/webui/internal/migrations/010_migrate_modelfiles_to_models.py similarity index 100% rename from backend/apps/web/internal/migrations/010_migrate_modelfiles_to_models.py rename to backend/apps/webui/internal/migrations/010_migrate_modelfiles_to_models.py diff --git a/backend/apps/web/internal/migrations/README.md b/backend/apps/webui/internal/migrations/README.md similarity index 84% rename from backend/apps/web/internal/migrations/README.md rename to backend/apps/webui/internal/migrations/README.md index 63d92e802e..2602141137 100644 --- a/backend/apps/web/internal/migrations/README.md +++ b/backend/apps/webui/internal/migrations/README.md @@ -14,7 +14,7 @@ You will need to create a migration file to ensure that existing databases are u 2. Make your changes to the models. 3. From the `backend` directory, run the following command: ```bash - pw_migrate create --auto --auto-source apps.web.models --database sqlite:///${SQLITE_DB} --directory apps/web/internal/migrations ${MIGRATION_NAME} + pw_migrate create --auto --auto-source apps.webui.models --database sqlite:///${SQLITE_DB} --directory apps/web/internal/migrations ${MIGRATION_NAME} ``` - `$SQLITE_DB` should be the path to the database file. - `$MIGRATION_NAME` should be a descriptive name for the migration. diff --git a/backend/apps/web/main.py b/backend/apps/webui/main.py similarity index 98% rename from backend/apps/web/main.py rename to backend/apps/webui/main.py index 9704cde776..d736cef9ae 100644 --- a/backend/apps/web/main.py +++ b/backend/apps/webui/main.py @@ -1,7 +1,7 @@ from fastapi import FastAPI, Depends from fastapi.routing import APIRoute from fastapi.middleware.cors import CORSMiddleware -from apps.web.routers import ( +from apps.webui.routers import ( auths, users, chats, diff --git a/backend/apps/web/models/auths.py b/backend/apps/webui/models/auths.py similarity index 98% rename from backend/apps/web/models/auths.py rename to backend/apps/webui/models/auths.py index dfa0c43953..e3b659e43b 100644 --- a/backend/apps/web/models/auths.py +++ b/backend/apps/webui/models/auths.py @@ -5,10 +5,10 @@ import uuid import logging from peewee import * -from apps.web.models.users import UserModel, Users +from apps.webui.models.users import UserModel, Users from utils.utils import verify_password -from apps.web.internal.db import DB +from apps.webui.internal.db import DB from config import SRC_LOG_LEVELS diff --git a/backend/apps/web/models/chats.py b/backend/apps/webui/models/chats.py similarity index 99% rename from backend/apps/web/models/chats.py rename to backend/apps/webui/models/chats.py index 891151b94e..a07ec5e304 100644 --- a/backend/apps/web/models/chats.py +++ b/backend/apps/webui/models/chats.py @@ -7,7 +7,7 @@ import json import uuid import time -from apps.web.internal.db import DB +from apps.webui.internal.db import DB #################### # Chat DB Schema diff --git a/backend/apps/web/models/documents.py b/backend/apps/webui/models/documents.py similarity index 99% rename from backend/apps/web/models/documents.py rename to backend/apps/webui/models/documents.py index 42b99596cc..3b730535fb 100644 --- a/backend/apps/web/models/documents.py +++ b/backend/apps/webui/models/documents.py @@ -8,7 +8,7 @@ import logging from utils.utils import decode_token from utils.misc import get_gravatar_url -from apps.web.internal.db import DB +from apps.webui.internal.db import DB import json diff --git a/backend/apps/web/models/memories.py b/backend/apps/webui/models/memories.py similarity index 97% rename from backend/apps/web/models/memories.py rename to backend/apps/webui/models/memories.py index 8382b3e525..70e5577e94 100644 --- a/backend/apps/web/models/memories.py +++ b/backend/apps/webui/models/memories.py @@ -3,8 +3,8 @@ from peewee import * from playhouse.shortcuts import model_to_dict from typing import List, Union, Optional -from apps.web.internal.db import DB -from apps.web.models.chats import Chats +from apps.webui.internal.db import DB +from apps.webui.models.chats import Chats import time import uuid diff --git a/backend/apps/web/models/models.py b/backend/apps/webui/models/models.py similarity index 98% rename from backend/apps/web/models/models.py rename to backend/apps/webui/models/models.py index bf835c8fdb..8513523989 100644 --- a/backend/apps/web/models/models.py +++ b/backend/apps/webui/models/models.py @@ -8,7 +8,7 @@ from peewee import * from playhouse.shortcuts import model_to_dict from pydantic import BaseModel, ConfigDict -from apps.web.internal.db import DB, JSONField +from apps.webui.internal.db import DB, JSONField from typing import List, Union, Optional from config import SRC_LOG_LEVELS diff --git a/backend/apps/web/models/prompts.py b/backend/apps/webui/models/prompts.py similarity index 98% rename from backend/apps/web/models/prompts.py rename to backend/apps/webui/models/prompts.py index bc4e3e58bf..c4ac6be149 100644 --- a/backend/apps/web/models/prompts.py +++ b/backend/apps/webui/models/prompts.py @@ -7,7 +7,7 @@ import time from utils.utils import decode_token from utils.misc import get_gravatar_url -from apps.web.internal.db import DB +from apps.webui.internal.db import DB import json diff --git a/backend/apps/web/models/tags.py b/backend/apps/webui/models/tags.py similarity index 99% rename from backend/apps/web/models/tags.py rename to backend/apps/webui/models/tags.py index d9a967ff77..4c4fa82e68 100644 --- a/backend/apps/web/models/tags.py +++ b/backend/apps/webui/models/tags.py @@ -8,7 +8,7 @@ import uuid import time import logging -from apps.web.internal.db import DB +from apps.webui.internal.db import DB from config import SRC_LOG_LEVELS diff --git a/backend/apps/web/models/users.py b/backend/apps/webui/models/users.py similarity index 98% rename from backend/apps/web/models/users.py rename to backend/apps/webui/models/users.py index 450dd91870..8f600c6d52 100644 --- a/backend/apps/web/models/users.py +++ b/backend/apps/webui/models/users.py @@ -5,8 +5,8 @@ from typing import List, Union, Optional import time from utils.misc import get_gravatar_url -from apps.web.internal.db import DB -from apps.web.models.chats import Chats +from apps.webui.internal.db import DB +from apps.webui.models.chats import Chats #################### # User DB Schema diff --git a/backend/apps/web/routers/auths.py b/backend/apps/webui/routers/auths.py similarity index 99% rename from backend/apps/web/routers/auths.py rename to backend/apps/webui/routers/auths.py index 998e746598..ce9b92061a 100644 --- a/backend/apps/web/routers/auths.py +++ b/backend/apps/webui/routers/auths.py @@ -10,7 +10,7 @@ import uuid import csv -from apps.web.models.auths import ( +from apps.webui.models.auths import ( SigninForm, SignupForm, AddUserForm, @@ -21,7 +21,7 @@ from apps.web.models.auths import ( Auths, ApiKey, ) -from apps.web.models.users import Users +from apps.webui.models.users import Users from utils.utils import ( get_password_hash, diff --git a/backend/apps/web/routers/chats.py b/backend/apps/webui/routers/chats.py similarity index 99% rename from backend/apps/web/routers/chats.py rename to backend/apps/webui/routers/chats.py index aaf1735210..e0c824a8ee 100644 --- a/backend/apps/web/routers/chats.py +++ b/backend/apps/webui/routers/chats.py @@ -7,8 +7,8 @@ from pydantic import BaseModel import json import logging -from apps.web.models.users import Users -from apps.web.models.chats import ( +from apps.webui.models.users import Users +from apps.webui.models.chats import ( ChatModel, ChatResponse, ChatTitleForm, @@ -18,7 +18,7 @@ from apps.web.models.chats import ( ) -from apps.web.models.tags import ( +from apps.webui.models.tags import ( TagModel, ChatIdTagModel, ChatIdTagForm, diff --git a/backend/apps/web/routers/configs.py b/backend/apps/webui/routers/configs.py similarity index 97% rename from backend/apps/web/routers/configs.py rename to backend/apps/webui/routers/configs.py index 143ed5e0ae..00feafb18b 100644 --- a/backend/apps/web/routers/configs.py +++ b/backend/apps/webui/routers/configs.py @@ -8,7 +8,7 @@ from pydantic import BaseModel import time import uuid -from apps.web.models.users import Users +from apps.webui.models.users import Users from utils.utils import ( get_password_hash, diff --git a/backend/apps/web/routers/documents.py b/backend/apps/webui/routers/documents.py similarity index 98% rename from backend/apps/web/routers/documents.py rename to backend/apps/webui/routers/documents.py index 7c69514fe9..c5447a3fe6 100644 --- a/backend/apps/web/routers/documents.py +++ b/backend/apps/webui/routers/documents.py @@ -6,7 +6,7 @@ from fastapi import APIRouter from pydantic import BaseModel import json -from apps.web.models.documents import ( +from apps.webui.models.documents import ( Documents, DocumentForm, DocumentUpdateForm, diff --git a/backend/apps/web/routers/memories.py b/backend/apps/webui/routers/memories.py similarity index 98% rename from backend/apps/web/routers/memories.py rename to backend/apps/webui/routers/memories.py index f20e026014..6448ebe1ee 100644 --- a/backend/apps/web/routers/memories.py +++ b/backend/apps/webui/routers/memories.py @@ -7,7 +7,7 @@ from fastapi import APIRouter from pydantic import BaseModel import logging -from apps.web.models.memories import Memories, MemoryModel +from apps.webui.models.memories import Memories, MemoryModel from utils.utils import get_verified_user from constants import ERROR_MESSAGES diff --git a/backend/apps/web/routers/models.py b/backend/apps/webui/routers/models.py similarity index 97% rename from backend/apps/web/routers/models.py rename to backend/apps/webui/routers/models.py index 81140c8610..363737e259 100644 --- a/backend/apps/web/routers/models.py +++ b/backend/apps/webui/routers/models.py @@ -5,7 +5,7 @@ from typing import List, Union, Optional from fastapi import APIRouter from pydantic import BaseModel import json -from apps.web.models.models import Models, ModelModel, ModelForm, ModelResponse +from apps.webui.models.models import Models, ModelModel, ModelForm, ModelResponse from utils.utils import get_verified_user, get_admin_user from constants import ERROR_MESSAGES diff --git a/backend/apps/web/routers/prompts.py b/backend/apps/webui/routers/prompts.py similarity index 97% rename from backend/apps/web/routers/prompts.py rename to backend/apps/webui/routers/prompts.py index db76196765..47d8c7012e 100644 --- a/backend/apps/web/routers/prompts.py +++ b/backend/apps/webui/routers/prompts.py @@ -6,7 +6,7 @@ from fastapi import APIRouter from pydantic import BaseModel import json -from apps.web.models.prompts import Prompts, PromptForm, PromptModel +from apps.webui.models.prompts import Prompts, PromptForm, PromptModel from utils.utils import get_current_user, get_admin_user from constants import ERROR_MESSAGES diff --git a/backend/apps/web/routers/users.py b/backend/apps/webui/routers/users.py similarity index 96% rename from backend/apps/web/routers/users.py rename to backend/apps/webui/routers/users.py index d77475d8df..bb9c557dbb 100644 --- a/backend/apps/web/routers/users.py +++ b/backend/apps/webui/routers/users.py @@ -9,9 +9,9 @@ import time import uuid import logging -from apps.web.models.users import UserModel, UserUpdateForm, UserRoleUpdateForm, Users -from apps.web.models.auths import Auths -from apps.web.models.chats import Chats +from apps.webui.models.users import UserModel, UserUpdateForm, UserRoleUpdateForm, Users +from apps.webui.models.auths import Auths +from apps.webui.models.chats import Chats from utils.utils import get_verified_user, get_password_hash, get_admin_user from constants import ERROR_MESSAGES diff --git a/backend/apps/web/routers/utils.py b/backend/apps/webui/routers/utils.py similarity index 98% rename from backend/apps/web/routers/utils.py rename to backend/apps/webui/routers/utils.py index 12805873d4..b95fe88347 100644 --- a/backend/apps/web/routers/utils.py +++ b/backend/apps/webui/routers/utils.py @@ -8,7 +8,7 @@ from pydantic import BaseModel from fpdf import FPDF import markdown -from apps.web.internal.db import DB +from apps.webui.internal.db import DB from utils.utils import get_admin_user from utils.misc import calculate_sha256, get_gravatar_url diff --git a/backend/main.py b/backend/main.py index d9ebe922c0..135676f1ad 100644 --- a/backend/main.py +++ b/backend/main.py @@ -25,13 +25,13 @@ from apps.openai.main import app as openai_app, get_all_models as get_openai_mod from apps.audio.main import app as audio_app from apps.images.main import app as images_app from apps.rag.main import app as rag_app -from apps.web.main import app as webui_app +from apps.webui.main import app as webui_app import asyncio from pydantic import BaseModel from typing import List, Optional -from apps.web.models.models import Models, ModelModel +from apps.webui.models.models import Models, ModelModel from utils.utils import get_admin_user, get_verified_user from apps.rag.utils import rag_messages diff --git a/backend/utils/models.py b/backend/utils/models.py index 7a57b4fdb5..c4d675d295 100644 --- a/backend/utils/models.py +++ b/backend/utils/models.py @@ -1,4 +1,4 @@ -from apps.web.models.models import Models, ModelModel, ModelForm, ModelResponse +from apps.webui.models.models import Models, ModelModel, ModelForm, ModelResponse def get_model_id_from_custom_model_id(id: str): diff --git a/backend/utils/utils.py b/backend/utils/utils.py index af4fd85c09..cc6bb06b86 100644 --- a/backend/utils/utils.py +++ b/backend/utils/utils.py @@ -1,7 +1,7 @@ from fastapi.security import HTTPBearer, HTTPAuthorizationCredentials from fastapi import HTTPException, status, Depends -from apps.web.models.users import Users +from apps.webui.models.users import Users from pydantic import BaseModel from typing import Union, Optional From 633607a5c2c5785c097d82bd8f90eb78f73a9c3f Mon Sep 17 00:00:00 2001 From: "Timothy J. Baek" Date: Sun, 26 May 2024 01:16:58 -0700 Subject: [PATCH 20/28] fix --- backend/apps/webui/internal/db.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/backend/apps/webui/internal/db.py b/backend/apps/webui/internal/db.py index c8011460c1..0e7b1f95d1 100644 --- a/backend/apps/webui/internal/db.py +++ b/backend/apps/webui/internal/db.py @@ -31,7 +31,9 @@ else: DB = connect(DATABASE_URL) log.info(f"Connected to a {DB.__class__.__name__} database.") router = Router( - DB, migrate_dir=BACKEND_DIR / "apps" / "web" / "internal" / "migrations", logger=log + DB, + migrate_dir=BACKEND_DIR / "apps" / "webui" / "internal" / "migrations", + logger=log, ) router.run() DB.connect(reuse_if_open=True) From 84bfebd05ec8d183efb3697b3bb867d87dd03be5 Mon Sep 17 00:00:00 2001 From: "Timothy J. Baek" Date: Sun, 26 May 2024 01:17:57 -0700 Subject: [PATCH 21/28] fix --- backend/apps/rag/main.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/backend/apps/rag/main.py b/backend/apps/rag/main.py index f08d81a3b6..d04c256d78 100644 --- a/backend/apps/rag/main.py +++ b/backend/apps/rag/main.py @@ -46,7 +46,7 @@ import json import sentence_transformers -from apps.web.models.documents import ( +from apps.webui.models.documents import ( Documents, DocumentForm, DocumentResponse, From 555e4e32d59e2e2f83cd03b5927f7494f078761c Mon Sep 17 00:00:00 2001 From: "Timothy J. Baek" Date: Sun, 26 May 2024 01:31:17 -0700 Subject: [PATCH 22/28] feat: allow insecure pull --- backend/apps/ollama/main.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/backend/apps/ollama/main.py b/backend/apps/ollama/main.py index 09c50286a4..01e127074b 100644 --- a/backend/apps/ollama/main.py +++ b/backend/apps/ollama/main.py @@ -306,6 +306,9 @@ async def pull_model( r = None + # Admin should be able to pull models from any source + payload = {**form_data.model_dump(exclude_none=True), "insecure": True} + def get_request(): nonlocal url nonlocal r @@ -333,7 +336,7 @@ async def pull_model( r = requests.request( method="POST", url=f"{url}/api/pull", - data=form_data.model_dump_json(exclude_none=True).encode(), + data=json.dumps(payload), stream=True, ) From 62d37f1f1041d0cb9e0a37a67278e34477f505f7 Mon Sep 17 00:00:00 2001 From: "Timothy J. Baek" Date: Sun, 26 May 2024 01:48:18 -0700 Subject: [PATCH 23/28] refac --- src/lib/components/chat/Settings/Chats.svelte | 6 +++--- src/lib/i18n/locales/ar-BH/translation.json | 3 ++- src/lib/i18n/locales/bg-BG/translation.json | 3 ++- src/lib/i18n/locales/bn-BD/translation.json | 3 ++- src/lib/i18n/locales/ca-ES/translation.json | 3 ++- src/lib/i18n/locales/ceb-PH/translation.json | 3 ++- src/lib/i18n/locales/de-DE/translation.json | 3 ++- src/lib/i18n/locales/dg-DG/translation.json | 3 ++- src/lib/i18n/locales/en-GB/translation.json | 3 ++- src/lib/i18n/locales/en-US/translation.json | 3 ++- src/lib/i18n/locales/es-ES/translation.json | 3 ++- src/lib/i18n/locales/fa-IR/translation.json | 3 ++- src/lib/i18n/locales/fi-FI/translation.json | 3 ++- src/lib/i18n/locales/fr-CA/translation.json | 3 ++- src/lib/i18n/locales/fr-FR/translation.json | 3 ++- src/lib/i18n/locales/he-IL/translation.json | 3 ++- src/lib/i18n/locales/hi-IN/translation.json | 3 ++- src/lib/i18n/locales/hr-HR/translation.json | 3 ++- src/lib/i18n/locales/it-IT/translation.json | 3 ++- src/lib/i18n/locales/ja-JP/translation.json | 3 ++- src/lib/i18n/locales/ka-GE/translation.json | 3 ++- src/lib/i18n/locales/ko-KR/translation.json | 3 ++- src/lib/i18n/locales/nl-NL/translation.json | 3 ++- src/lib/i18n/locales/pa-IN/translation.json | 3 ++- src/lib/i18n/locales/pl-PL/translation.json | 3 ++- src/lib/i18n/locales/pt-BR/translation.json | 3 ++- src/lib/i18n/locales/pt-PT/translation.json | 3 ++- src/lib/i18n/locales/ru-RU/translation.json | 3 ++- src/lib/i18n/locales/sr-RS/translation.json | 3 ++- src/lib/i18n/locales/sv-SE/translation.json | 3 ++- src/lib/i18n/locales/tr-TR/translation.json | 3 ++- src/lib/i18n/locales/uk-UA/translation.json | 3 ++- src/lib/i18n/locales/vi-VN/translation.json | 3 ++- src/lib/i18n/locales/zh-CN/translation.json | 3 ++- src/lib/i18n/locales/zh-TW/translation.json | 3 ++- 35 files changed, 71 insertions(+), 37 deletions(-) diff --git a/src/lib/components/chat/Settings/Chats.svelte b/src/lib/components/chat/Settings/Chats.svelte index b9cbd5447d..cfed66de8b 100644 --- a/src/lib/components/chat/Settings/Chats.svelte +++ b/src/lib/components/chat/Settings/Chats.svelte @@ -75,7 +75,7 @@ saveAs(blob, `all-chats-export-${Date.now()}.json`); }; - const deleteChats = async () => { + const deleteAllChatsHandler = async () => { await goto('/'); await deleteAllChats(localStorage.token).catch((error) => { toast.error(error); @@ -240,7 +240,7 @@
-
{$i18n.t('Delete Chats')}
+
{$i18n.t('Delete All Chats')}
{/if} diff --git a/src/lib/i18n/locales/ar-BH/translation.json b/src/lib/i18n/locales/ar-BH/translation.json index 1d40b256e1..61ad966275 100644 --- a/src/lib/i18n/locales/ar-BH/translation.json +++ b/src/lib/i18n/locales/ar-BH/translation.json @@ -132,9 +132,9 @@ "delete": "حذف", "Delete": "حذف", "Delete a model": "حذف الموديل", + "Delete All Chats": "", "Delete chat": "حذف المحادثه", "Delete Chat": "حذف المحادثه.", - "Delete Chats": "حذف المحادثات", "delete this link": "أحذف هذا الرابط", "Delete User": "حذف المستخدم", "Deleted {{deleteModelTag}}": "{{deleteModelTag}} حذف", @@ -362,6 +362,7 @@ "Search": "البحث", "Search a model": "البحث عن موديل", "Search Documents": "البحث المستندات", + "Search Models": "", "Search Prompts": "أبحث حث", "See readme.md for instructions": "readme.md للحصول على التعليمات", "See what's new": "ما الجديد", diff --git a/src/lib/i18n/locales/bg-BG/translation.json b/src/lib/i18n/locales/bg-BG/translation.json index ef844b730f..6bde240d43 100644 --- a/src/lib/i18n/locales/bg-BG/translation.json +++ b/src/lib/i18n/locales/bg-BG/translation.json @@ -132,9 +132,9 @@ "delete": "изтриване", "Delete": "Изтриване", "Delete a model": "Изтриване на модел", + "Delete All Chats": "", "Delete chat": "Изтриване на чат", "Delete Chat": "Изтриване на Чат", - "Delete Chats": "Изтриване на Чатове", "delete this link": "Изтриване на този линк", "Delete User": "Изтриване на потребител", "Deleted {{deleteModelTag}}": "Изтрито {{deleteModelTag}}", @@ -362,6 +362,7 @@ "Search": "Търси", "Search a model": "Търси модел", "Search Documents": "Търси Документи", + "Search Models": "", "Search Prompts": "Търси Промптове", "See readme.md for instructions": "Виж readme.md за инструкции", "See what's new": "Виж какво е новото", diff --git a/src/lib/i18n/locales/bn-BD/translation.json b/src/lib/i18n/locales/bn-BD/translation.json index faab1b405e..6f845796f9 100644 --- a/src/lib/i18n/locales/bn-BD/translation.json +++ b/src/lib/i18n/locales/bn-BD/translation.json @@ -132,9 +132,9 @@ "delete": "মুছে ফেলুন", "Delete": "মুছে ফেলুন", "Delete a model": "একটি মডেল মুছে ফেলুন", + "Delete All Chats": "", "Delete chat": "চ্যাট মুছে ফেলুন", "Delete Chat": "চ্যাট মুছে ফেলুন", - "Delete Chats": "চ্যাটগুলো মুছে ফেলুন", "delete this link": "এই লিংক মুছে ফেলুন", "Delete User": "ইউজার মুছে ফেলুন", "Deleted {{deleteModelTag}}": "{{deleteModelTag}} মুছে ফেলা হয়েছে", @@ -362,6 +362,7 @@ "Search": "অনুসন্ধান", "Search a model": "মডেল অনুসন্ধান করুন", "Search Documents": "ডকুমেন্টসমূহ অনুসন্ধান করুন", + "Search Models": "", "Search Prompts": "প্রম্পটসমূহ অনুসন্ধান করুন", "See readme.md for instructions": "নির্দেশিকার জন্য readme.md দেখুন", "See what's new": "নতুন কী আছে দেখুন", diff --git a/src/lib/i18n/locales/ca-ES/translation.json b/src/lib/i18n/locales/ca-ES/translation.json index 086228f2b2..05deb53056 100644 --- a/src/lib/i18n/locales/ca-ES/translation.json +++ b/src/lib/i18n/locales/ca-ES/translation.json @@ -132,9 +132,9 @@ "delete": "esborra", "Delete": "Esborra", "Delete a model": "Esborra un model", + "Delete All Chats": "", "Delete chat": "Esborra xat", "Delete Chat": "Esborra Xat", - "Delete Chats": "Esborra Xats", "delete this link": "Esborra aquest enllaç", "Delete User": "Esborra Usuari", "Deleted {{deleteModelTag}}": "Esborrat {{deleteModelTag}}", @@ -362,6 +362,7 @@ "Search": "Cerca", "Search a model": "Cerca un model", "Search Documents": "Cerca Documents", + "Search Models": "", "Search Prompts": "Cerca Prompts", "See readme.md for instructions": "Consulta el readme.md per a instruccions", "See what's new": "Veure novetats", diff --git a/src/lib/i18n/locales/ceb-PH/translation.json b/src/lib/i18n/locales/ceb-PH/translation.json index d3946f3647..ada55caf34 100644 --- a/src/lib/i18n/locales/ceb-PH/translation.json +++ b/src/lib/i18n/locales/ceb-PH/translation.json @@ -132,9 +132,9 @@ "delete": "DELETE", "Delete": "", "Delete a model": "Pagtangtang sa usa ka template", + "Delete All Chats": "", "Delete chat": "Pagtangtang sa panaghisgot", "Delete Chat": "", - "Delete Chats": "Pagtangtang sa mga chat", "delete this link": "", "Delete User": "", "Deleted {{deleteModelTag}}": "{{deleteModelTag}} gipapas", @@ -362,6 +362,7 @@ "Search": "Pagpanukiduki", "Search a model": "", "Search Documents": "Pangitaa ang mga dokumento", + "Search Models": "", "Search Prompts": "Pangitaa ang mga prompt", "See readme.md for instructions": "Tan-awa ang readme.md alang sa mga panudlo", "See what's new": "Tan-awa unsay bag-o", diff --git a/src/lib/i18n/locales/de-DE/translation.json b/src/lib/i18n/locales/de-DE/translation.json index db6c8971ad..b73cca4f25 100644 --- a/src/lib/i18n/locales/de-DE/translation.json +++ b/src/lib/i18n/locales/de-DE/translation.json @@ -132,9 +132,9 @@ "delete": "löschen", "Delete": "Löschen", "Delete a model": "Ein Modell löschen", + "Delete All Chats": "", "Delete chat": "Chat löschen", "Delete Chat": "Chat löschen", - "Delete Chats": "Chats löschen", "delete this link": "diesen Link zu löschen", "Delete User": "Benutzer löschen", "Deleted {{deleteModelTag}}": "{{deleteModelTag}} gelöscht", @@ -362,6 +362,7 @@ "Search": "Suchen", "Search a model": "Nach einem Modell suchen", "Search Documents": "Dokumente suchen", + "Search Models": "", "Search Prompts": "Prompts suchen", "See readme.md for instructions": "Anleitung in readme.md anzeigen", "See what's new": "Was gibt's Neues", diff --git a/src/lib/i18n/locales/dg-DG/translation.json b/src/lib/i18n/locales/dg-DG/translation.json index 784a34407b..cb334376cb 100644 --- a/src/lib/i18n/locales/dg-DG/translation.json +++ b/src/lib/i18n/locales/dg-DG/translation.json @@ -132,9 +132,9 @@ "delete": "delete", "Delete": "", "Delete a model": "Delete a model", + "Delete All Chats": "", "Delete chat": "Delete chat", "Delete Chat": "", - "Delete Chats": "Delete Chats", "delete this link": "", "Delete User": "", "Deleted {{deleteModelTag}}": "Deleted {{deleteModelTag}}", @@ -362,6 +362,7 @@ "Search": "Search very search", "Search a model": "", "Search Documents": "Search Documents much find", + "Search Models": "", "Search Prompts": "Search Prompts much wow", "See readme.md for instructions": "See readme.md for instructions wow", "See what's new": "See what's new so amaze", diff --git a/src/lib/i18n/locales/en-GB/translation.json b/src/lib/i18n/locales/en-GB/translation.json index 5b19bbaac3..f0bfcf3a76 100644 --- a/src/lib/i18n/locales/en-GB/translation.json +++ b/src/lib/i18n/locales/en-GB/translation.json @@ -132,9 +132,9 @@ "delete": "", "Delete": "", "Delete a model": "", + "Delete All Chats": "", "Delete chat": "", "Delete Chat": "", - "Delete Chats": "", "delete this link": "", "Delete User": "", "Deleted {{deleteModelTag}}": "", @@ -362,6 +362,7 @@ "Search": "", "Search a model": "", "Search Documents": "", + "Search Models": "", "Search Prompts": "", "See readme.md for instructions": "", "See what's new": "", diff --git a/src/lib/i18n/locales/en-US/translation.json b/src/lib/i18n/locales/en-US/translation.json index 5b19bbaac3..f0bfcf3a76 100644 --- a/src/lib/i18n/locales/en-US/translation.json +++ b/src/lib/i18n/locales/en-US/translation.json @@ -132,9 +132,9 @@ "delete": "", "Delete": "", "Delete a model": "", + "Delete All Chats": "", "Delete chat": "", "Delete Chat": "", - "Delete Chats": "", "delete this link": "", "Delete User": "", "Deleted {{deleteModelTag}}": "", @@ -362,6 +362,7 @@ "Search": "", "Search a model": "", "Search Documents": "", + "Search Models": "", "Search Prompts": "", "See readme.md for instructions": "", "See what's new": "", diff --git a/src/lib/i18n/locales/es-ES/translation.json b/src/lib/i18n/locales/es-ES/translation.json index fdcf4157bf..96159732fd 100644 --- a/src/lib/i18n/locales/es-ES/translation.json +++ b/src/lib/i18n/locales/es-ES/translation.json @@ -132,9 +132,9 @@ "delete": "borrar", "Delete": "Borrar", "Delete a model": "Borra un modelo", + "Delete All Chats": "", "Delete chat": "Borrar chat", "Delete Chat": "Borrar Chat", - "Delete Chats": "Borrar Chats", "delete this link": "Borrar este enlace", "Delete User": "Borrar Usuario", "Deleted {{deleteModelTag}}": "Se borró {{deleteModelTag}}", @@ -362,6 +362,7 @@ "Search": "Buscar", "Search a model": "Buscar un modelo", "Search Documents": "Buscar Documentos", + "Search Models": "", "Search Prompts": "Buscar Prompts", "See readme.md for instructions": "Vea el readme.md para instrucciones", "See what's new": "Ver las novedades", diff --git a/src/lib/i18n/locales/fa-IR/translation.json b/src/lib/i18n/locales/fa-IR/translation.json index f3da130458..81e918a4f7 100644 --- a/src/lib/i18n/locales/fa-IR/translation.json +++ b/src/lib/i18n/locales/fa-IR/translation.json @@ -132,9 +132,9 @@ "delete": "حذف", "Delete": "حذف", "Delete a model": "حذف یک مدل", + "Delete All Chats": "", "Delete chat": "حذف گپ", "Delete Chat": "حذف گپ", - "Delete Chats": "حذف گپ\u200cها", "delete this link": "حذف این لینک", "Delete User": "حذف کاربر", "Deleted {{deleteModelTag}}": "{{deleteModelTag}} پاک شد", @@ -362,6 +362,7 @@ "Search": "جستجو", "Search a model": "جستجوی مدل", "Search Documents": "جستجوی اسناد", + "Search Models": "", "Search Prompts": "جستجوی پرامپت\u200cها", "See readme.md for instructions": "برای مشاهده دستورالعمل\u200cها به readme.md مراجعه کنید", "See what's new": "ببینید موارد جدید چه بوده", diff --git a/src/lib/i18n/locales/fi-FI/translation.json b/src/lib/i18n/locales/fi-FI/translation.json index 5cc9cf914b..cdf2bae97e 100644 --- a/src/lib/i18n/locales/fi-FI/translation.json +++ b/src/lib/i18n/locales/fi-FI/translation.json @@ -132,9 +132,9 @@ "delete": "poista", "Delete": "Poista", "Delete a model": "Poista malli", + "Delete All Chats": "", "Delete chat": "Poista keskustelu", "Delete Chat": "Poista keskustelu", - "Delete Chats": "Poista keskustelut", "delete this link": "poista tämä linkki", "Delete User": "Poista käyttäjä", "Deleted {{deleteModelTag}}": "Poistettu {{deleteModelTag}}", @@ -362,6 +362,7 @@ "Search": "Haku", "Search a model": "Hae mallia", "Search Documents": "Hae asiakirjoja", + "Search Models": "", "Search Prompts": "Hae kehotteita", "See readme.md for instructions": "Katso lisää ohjeita readme.md:stä", "See what's new": "Katso, mitä uutta", diff --git a/src/lib/i18n/locales/fr-CA/translation.json b/src/lib/i18n/locales/fr-CA/translation.json index 80f6291d96..c0bbea9352 100644 --- a/src/lib/i18n/locales/fr-CA/translation.json +++ b/src/lib/i18n/locales/fr-CA/translation.json @@ -132,9 +132,9 @@ "delete": "supprimer", "Delete": "Supprimer", "Delete a model": "Supprimer un modèle", + "Delete All Chats": "", "Delete chat": "Supprimer la discussion", "Delete Chat": "Supprimer la discussion", - "Delete Chats": "Supprimer les discussions", "delete this link": "supprimer ce lien", "Delete User": "Supprimer l'utilisateur", "Deleted {{deleteModelTag}}": "{{deleteModelTag}} supprimé", @@ -362,6 +362,7 @@ "Search": "Recherche", "Search a model": "Rechercher un modèle", "Search Documents": "Rechercher des documents", + "Search Models": "", "Search Prompts": "Rechercher des prompts", "See readme.md for instructions": "Voir readme.md pour les instructions", "See what's new": "Voir les nouveautés", diff --git a/src/lib/i18n/locales/fr-FR/translation.json b/src/lib/i18n/locales/fr-FR/translation.json index e69d6add13..37c315eacc 100644 --- a/src/lib/i18n/locales/fr-FR/translation.json +++ b/src/lib/i18n/locales/fr-FR/translation.json @@ -132,9 +132,9 @@ "delete": "supprimer", "Delete": "Supprimer", "Delete a model": "Supprimer un modèle", + "Delete All Chats": "", "Delete chat": "Supprimer le chat", "Delete Chat": "Supprimer le Chat", - "Delete Chats": "Supprimer les chats", "delete this link": "supprimer ce lien", "Delete User": "Supprimer l'Utilisateur", "Deleted {{deleteModelTag}}": "{{deleteModelTag}} supprimé", @@ -362,6 +362,7 @@ "Search": "Recherche", "Search a model": "Rechercher un modèle", "Search Documents": "Rechercher des Documents", + "Search Models": "", "Search Prompts": "Rechercher des Prompts", "See readme.md for instructions": "Voir readme.md pour les instructions", "See what's new": "Voir les nouveautés", diff --git a/src/lib/i18n/locales/he-IL/translation.json b/src/lib/i18n/locales/he-IL/translation.json index 3b50965def..97af0fbac7 100644 --- a/src/lib/i18n/locales/he-IL/translation.json +++ b/src/lib/i18n/locales/he-IL/translation.json @@ -132,9 +132,9 @@ "delete": "מחק", "Delete": "מחק", "Delete a model": "מחק מודל", + "Delete All Chats": "", "Delete chat": "מחק צ'אט", "Delete Chat": "מחק צ'אט", - "Delete Chats": "מחק צ'אטים", "delete this link": "מחק את הקישור הזה", "Delete User": "מחק משתמש", "Deleted {{deleteModelTag}}": "נמחק {{deleteModelTag}}", @@ -362,6 +362,7 @@ "Search": "חפש", "Search a model": "חפש מודל", "Search Documents": "חפש מסמכים", + "Search Models": "", "Search Prompts": "חפש פקודות", "See readme.md for instructions": "ראה את readme.md להוראות", "See what's new": "ראה מה חדש", diff --git a/src/lib/i18n/locales/hi-IN/translation.json b/src/lib/i18n/locales/hi-IN/translation.json index a84c4d6adb..735d88f1e8 100644 --- a/src/lib/i18n/locales/hi-IN/translation.json +++ b/src/lib/i18n/locales/hi-IN/translation.json @@ -132,9 +132,9 @@ "delete": "डिलीट", "Delete": "डिलीट", "Delete a model": "एक मॉडल हटाएँ", + "Delete All Chats": "", "Delete chat": "चैट हटाएं", "Delete Chat": "चैट हटाएं", - "Delete Chats": "चैट हटाएं", "delete this link": "इस लिंक को हटाएं", "Delete User": "उपभोक्ता मिटायें", "Deleted {{deleteModelTag}}": "{{deleteModelTag}} हटा दिया गया", @@ -362,6 +362,7 @@ "Search": "खोजें", "Search a model": "एक मॉडल खोजें", "Search Documents": "दस्तावेज़ खोजें", + "Search Models": "", "Search Prompts": "प्रॉम्प्ट खोजें", "See readme.md for instructions": "निर्देशों के लिए readme.md देखें", "See what's new": "देखें, क्या नया है", diff --git a/src/lib/i18n/locales/hr-HR/translation.json b/src/lib/i18n/locales/hr-HR/translation.json index 9d86e0c24b..cc87934fba 100644 --- a/src/lib/i18n/locales/hr-HR/translation.json +++ b/src/lib/i18n/locales/hr-HR/translation.json @@ -132,9 +132,9 @@ "delete": "izbriši", "Delete": "Izbriši", "Delete a model": "Izbriši model", + "Delete All Chats": "", "Delete chat": "Izbriši razgovor", "Delete Chat": "Izbriši razgovor", - "Delete Chats": "Izbriši razgovore", "delete this link": "izbriši ovu vezu", "Delete User": "Izbriši korisnika", "Deleted {{deleteModelTag}}": "Izbrisan {{deleteModelTag}}", @@ -362,6 +362,7 @@ "Search": "Pretraga", "Search a model": "Pretraži model", "Search Documents": "Pretraga dokumenata", + "Search Models": "", "Search Prompts": "Pretraga prompta", "See readme.md for instructions": "Pogledajte readme.md za upute", "See what's new": "Pogledajte što je novo", diff --git a/src/lib/i18n/locales/it-IT/translation.json b/src/lib/i18n/locales/it-IT/translation.json index 97a81297e5..747bbbc7a5 100644 --- a/src/lib/i18n/locales/it-IT/translation.json +++ b/src/lib/i18n/locales/it-IT/translation.json @@ -132,9 +132,9 @@ "delete": "elimina", "Delete": "Elimina", "Delete a model": "Elimina un modello", + "Delete All Chats": "", "Delete chat": "Elimina chat", "Delete Chat": "Elimina chat", - "Delete Chats": "Elimina le chat", "delete this link": "elimina questo link", "Delete User": "Elimina utente", "Deleted {{deleteModelTag}}": "Eliminato {{deleteModelTag}}", @@ -362,6 +362,7 @@ "Search": "Cerca", "Search a model": "Cerca un modello", "Search Documents": "Cerca documenti", + "Search Models": "", "Search Prompts": "Cerca prompt", "See readme.md for instructions": "Vedi readme.md per le istruzioni", "See what's new": "Guarda le novità", diff --git a/src/lib/i18n/locales/ja-JP/translation.json b/src/lib/i18n/locales/ja-JP/translation.json index 55c2021ce7..66a799c681 100644 --- a/src/lib/i18n/locales/ja-JP/translation.json +++ b/src/lib/i18n/locales/ja-JP/translation.json @@ -132,9 +132,9 @@ "delete": "削除", "Delete": "削除", "Delete a model": "モデルを削除", + "Delete All Chats": "", "Delete chat": "チャットを削除", "Delete Chat": "チャットを削除", - "Delete Chats": "チャットを削除", "delete this link": "このリンクを削除します", "Delete User": "ユーザーを削除", "Deleted {{deleteModelTag}}": "{{deleteModelTag}} を削除しました", @@ -362,6 +362,7 @@ "Search": "検索", "Search a model": "モデルを検索", "Search Documents": "ドキュメントを検索", + "Search Models": "", "Search Prompts": "プロンプトを検索", "See readme.md for instructions": "手順については readme.md を参照してください", "See what's new": "新機能を見る", diff --git a/src/lib/i18n/locales/ka-GE/translation.json b/src/lib/i18n/locales/ka-GE/translation.json index ba980639ad..9c90b916ce 100644 --- a/src/lib/i18n/locales/ka-GE/translation.json +++ b/src/lib/i18n/locales/ka-GE/translation.json @@ -132,9 +132,9 @@ "delete": "წაშლა", "Delete": "წაშლა", "Delete a model": "მოდელის წაშლა", + "Delete All Chats": "", "Delete chat": "შეტყობინების წაშლა", "Delete Chat": "შეტყობინების წაშლა", - "Delete Chats": "შეტყობინებების წაშლა", "delete this link": "ბმულის წაშლა", "Delete User": "მომხმარებლის წაშლა", "Deleted {{deleteModelTag}}": "{{deleteModelTag}} წაშლილია", @@ -362,6 +362,7 @@ "Search": "ძიება", "Search a model": "მოდელის ძიება", "Search Documents": "დოკუმენტების ძიება", + "Search Models": "", "Search Prompts": "მოთხოვნების ძიება", "See readme.md for instructions": "იხილეთ readme.md ინსტრუქციებისთვის", "See what's new": "სიახლეების ნახვა", diff --git a/src/lib/i18n/locales/ko-KR/translation.json b/src/lib/i18n/locales/ko-KR/translation.json index 67c633fc85..4259c3425d 100644 --- a/src/lib/i18n/locales/ko-KR/translation.json +++ b/src/lib/i18n/locales/ko-KR/translation.json @@ -132,9 +132,9 @@ "delete": "삭제", "Delete": "삭제", "Delete a model": "모델 삭제", + "Delete All Chats": "", "Delete chat": "채팅 삭제", "Delete Chat": "채팅 삭제", - "Delete Chats": "채팅들 삭제", "delete this link": "이 링크를 삭제합니다.", "Delete User": "사용자 삭제", "Deleted {{deleteModelTag}}": "{{deleteModelTag}} 삭제됨", @@ -362,6 +362,7 @@ "Search": "검색", "Search a model": "모델 검색", "Search Documents": "문서 검색", + "Search Models": "", "Search Prompts": "프롬프트 검색", "See readme.md for instructions": "설명은 readme.md를 참조하세요.", "See what's new": "새로운 기능 보기", diff --git a/src/lib/i18n/locales/nl-NL/translation.json b/src/lib/i18n/locales/nl-NL/translation.json index e6779d05c7..e393894edb 100644 --- a/src/lib/i18n/locales/nl-NL/translation.json +++ b/src/lib/i18n/locales/nl-NL/translation.json @@ -132,9 +132,9 @@ "delete": "verwijderen", "Delete": "Verwijderen", "Delete a model": "Verwijder een model", + "Delete All Chats": "", "Delete chat": "Verwijder chat", "Delete Chat": "Verwijder Chat", - "Delete Chats": "Verwijder Chats", "delete this link": "verwijder deze link", "Delete User": "Verwijder Gebruiker", "Deleted {{deleteModelTag}}": "{{deleteModelTag}} is verwijderd", @@ -362,6 +362,7 @@ "Search": "Zoeken", "Search a model": "Zoek een model", "Search Documents": "Zoek Documenten", + "Search Models": "", "Search Prompts": "Zoek Prompts", "See readme.md for instructions": "Zie readme.md voor instructies", "See what's new": "Zie wat er nieuw is", diff --git a/src/lib/i18n/locales/pa-IN/translation.json b/src/lib/i18n/locales/pa-IN/translation.json index 77ebc83b1c..e12b25afbc 100644 --- a/src/lib/i18n/locales/pa-IN/translation.json +++ b/src/lib/i18n/locales/pa-IN/translation.json @@ -132,9 +132,9 @@ "delete": "ਮਿਟਾਓ", "Delete": "ਮਿਟਾਓ", "Delete a model": "ਇੱਕ ਮਾਡਲ ਮਿਟਾਓ", + "Delete All Chats": "", "Delete chat": "ਗੱਲਬਾਤ ਮਿਟਾਓ", "Delete Chat": "ਗੱਲਬਾਤ ਮਿਟਾਓ", - "Delete Chats": "ਗੱਲਾਂ ਮਿਟਾਓ", "delete this link": "ਇਸ ਲਿੰਕ ਨੂੰ ਮਿਟਾਓ", "Delete User": "ਉਪਭੋਗਤਾ ਮਿਟਾਓ", "Deleted {{deleteModelTag}}": "{{deleteModelTag}} ਮਿਟਾਇਆ ਗਿਆ", @@ -362,6 +362,7 @@ "Search": "ਖੋਜ", "Search a model": "ਇੱਕ ਮਾਡਲ ਖੋਜੋ", "Search Documents": "ਡਾਕੂਮੈਂਟ ਖੋਜੋ", + "Search Models": "", "Search Prompts": "ਪ੍ਰੰਪਟ ਖੋਜੋ", "See readme.md for instructions": "ਹਦਾਇਤਾਂ ਲਈ readme.md ਵੇਖੋ", "See what's new": "ਨਵਾਂ ਕੀ ਹੈ ਵੇਖੋ", diff --git a/src/lib/i18n/locales/pl-PL/translation.json b/src/lib/i18n/locales/pl-PL/translation.json index b8088e2c6f..91e469fa7f 100644 --- a/src/lib/i18n/locales/pl-PL/translation.json +++ b/src/lib/i18n/locales/pl-PL/translation.json @@ -132,9 +132,9 @@ "delete": "usuń", "Delete": "Usuń", "Delete a model": "Usuń model", + "Delete All Chats": "", "Delete chat": "Usuń czat", "Delete Chat": "Usuń czat", - "Delete Chats": "Usuń czaty", "delete this link": "usuń ten link", "Delete User": "Usuń użytkownika", "Deleted {{deleteModelTag}}": "Usunięto {{deleteModelTag}}", @@ -362,6 +362,7 @@ "Search": "Szukaj", "Search a model": "Szukaj modelu", "Search Documents": "Szukaj dokumentów", + "Search Models": "", "Search Prompts": "Szukaj promptów", "See readme.md for instructions": "Zajrzyj do readme.md po instrukcje", "See what's new": "Zobacz co nowego", diff --git a/src/lib/i18n/locales/pt-BR/translation.json b/src/lib/i18n/locales/pt-BR/translation.json index 1655c693c7..845a95db66 100644 --- a/src/lib/i18n/locales/pt-BR/translation.json +++ b/src/lib/i18n/locales/pt-BR/translation.json @@ -132,9 +132,9 @@ "delete": "excluir", "Delete": "Excluir", "Delete a model": "Excluir um modelo", + "Delete All Chats": "", "Delete chat": "Excluir bate-papo", "Delete Chat": "Excluir Bate-papo", - "Delete Chats": "Excluir Bate-papos", "delete this link": "excluir este link", "Delete User": "Excluir Usuário", "Deleted {{deleteModelTag}}": "{{deleteModelTag}} excluído", @@ -362,6 +362,7 @@ "Search": "Pesquisar", "Search a model": "Pesquisar um modelo", "Search Documents": "Pesquisar Documentos", + "Search Models": "", "Search Prompts": "Pesquisar Prompts", "See readme.md for instructions": "Consulte readme.md para obter instruções", "See what's new": "Veja o que há de novo", diff --git a/src/lib/i18n/locales/pt-PT/translation.json b/src/lib/i18n/locales/pt-PT/translation.json index b20f6e1295..ea4668b23e 100644 --- a/src/lib/i18n/locales/pt-PT/translation.json +++ b/src/lib/i18n/locales/pt-PT/translation.json @@ -132,9 +132,9 @@ "delete": "excluir", "Delete": "Excluir", "Delete a model": "Excluir um modelo", + "Delete All Chats": "", "Delete chat": "Excluir bate-papo", "Delete Chat": "Excluir Bate-papo", - "Delete Chats": "Excluir Bate-papos", "delete this link": "excluir este link", "Delete User": "Excluir Usuário", "Deleted {{deleteModelTag}}": "{{deleteModelTag}} excluído", @@ -362,6 +362,7 @@ "Search": "Pesquisar", "Search a model": "Pesquisar um modelo", "Search Documents": "Pesquisar Documentos", + "Search Models": "", "Search Prompts": "Pesquisar Prompts", "See readme.md for instructions": "Consulte readme.md para obter instruções", "See what's new": "Veja o que há de novo", diff --git a/src/lib/i18n/locales/ru-RU/translation.json b/src/lib/i18n/locales/ru-RU/translation.json index 543e34b65f..818f7958da 100644 --- a/src/lib/i18n/locales/ru-RU/translation.json +++ b/src/lib/i18n/locales/ru-RU/translation.json @@ -132,9 +132,9 @@ "delete": "удалить", "Delete": "Удалить", "Delete a model": "Удалить модель", + "Delete All Chats": "", "Delete chat": "Удалить чат", "Delete Chat": "Удалить чат", - "Delete Chats": "Удалить чаты", "delete this link": "удалить эту ссылку", "Delete User": "Удалить пользователя", "Deleted {{deleteModelTag}}": "Удалено {{deleteModelTag}}", @@ -362,6 +362,7 @@ "Search": "Поиск", "Search a model": "Поиск модели", "Search Documents": "Поиск документов", + "Search Models": "", "Search Prompts": "Поиск промтов", "See readme.md for instructions": "Смотрите readme.md для инструкций", "See what's new": "Посмотреть, что нового", diff --git a/src/lib/i18n/locales/sr-RS/translation.json b/src/lib/i18n/locales/sr-RS/translation.json index ddcc1af857..4f856a4554 100644 --- a/src/lib/i18n/locales/sr-RS/translation.json +++ b/src/lib/i18n/locales/sr-RS/translation.json @@ -132,9 +132,9 @@ "delete": "обриши", "Delete": "Обриши", "Delete a model": "Обриши модел", + "Delete All Chats": "", "Delete chat": "Обриши ћаскање", "Delete Chat": "Обриши ћаскање", - "Delete Chats": "Обриши ћаскања", "delete this link": "обриши ову везу", "Delete User": "Обриши корисника", "Deleted {{deleteModelTag}}": "Обрисано {{deleteModelTag}}", @@ -362,6 +362,7 @@ "Search": "Претражи", "Search a model": "Претражи модел", "Search Documents": "Претражи документе", + "Search Models": "", "Search Prompts": "Претражи упите", "See readme.md for instructions": "Погледај readme.md за упутства", "See what's new": "Погледај шта је ново", diff --git a/src/lib/i18n/locales/sv-SE/translation.json b/src/lib/i18n/locales/sv-SE/translation.json index e67a47b6b3..e499bf3151 100644 --- a/src/lib/i18n/locales/sv-SE/translation.json +++ b/src/lib/i18n/locales/sv-SE/translation.json @@ -132,9 +132,9 @@ "delete": "radera", "Delete": "Radera", "Delete a model": "Ta bort en modell", + "Delete All Chats": "", "Delete chat": "Radera chatt", "Delete Chat": "Radera chatt", - "Delete Chats": "Radera chattar", "delete this link": "radera denna länk", "Delete User": "Radera användare", "Deleted {{deleteModelTag}}": "Raderad {{deleteModelTag}}", @@ -362,6 +362,7 @@ "Search": "Sök", "Search a model": "Sök efter en modell", "Search Documents": "Sök dokument", + "Search Models": "", "Search Prompts": "Sök promptar", "See readme.md for instructions": "Se readme.md för instruktioner", "See what's new": "Se vad som är nytt", diff --git a/src/lib/i18n/locales/tr-TR/translation.json b/src/lib/i18n/locales/tr-TR/translation.json index 8015abafa0..437d7ebe38 100644 --- a/src/lib/i18n/locales/tr-TR/translation.json +++ b/src/lib/i18n/locales/tr-TR/translation.json @@ -132,9 +132,9 @@ "delete": "sil", "Delete": "Sil", "Delete a model": "Bir modeli sil", + "Delete All Chats": "", "Delete chat": "Sohbeti sil", "Delete Chat": "Sohbeti Sil", - "Delete Chats": "Sohbetleri Sil", "delete this link": "bu bağlantıyı sil", "Delete User": "Kullanıcıyı Sil", "Deleted {{deleteModelTag}}": "{{deleteModelTag}} silindi", @@ -362,6 +362,7 @@ "Search": "Ara", "Search a model": "Bir model ara", "Search Documents": "Belgeleri Ara", + "Search Models": "", "Search Prompts": "Prompt Ara", "See readme.md for instructions": "Yönergeler için readme.md dosyasına bakın", "See what's new": "Yeniliklere göz atın", diff --git a/src/lib/i18n/locales/uk-UA/translation.json b/src/lib/i18n/locales/uk-UA/translation.json index 03f252217e..c9b20423a6 100644 --- a/src/lib/i18n/locales/uk-UA/translation.json +++ b/src/lib/i18n/locales/uk-UA/translation.json @@ -132,9 +132,9 @@ "delete": "видалити", "Delete": "Видалити", "Delete a model": "Видалити модель", + "Delete All Chats": "", "Delete chat": "Видалити чат", "Delete Chat": "Видалити чат", - "Delete Chats": "Видалити чати", "delete this link": "видалити це посилання", "Delete User": "Видалити користувача", "Deleted {{deleteModelTag}}": "Видалено {{deleteModelTag}}", @@ -362,6 +362,7 @@ "Search": "Пошук", "Search a model": "Шукати модель", "Search Documents": "Пошук документів", + "Search Models": "", "Search Prompts": "Пошук промтів", "See readme.md for instructions": "Див. readme.md для інструкцій", "See what's new": "Подивіться, що нового", diff --git a/src/lib/i18n/locales/vi-VN/translation.json b/src/lib/i18n/locales/vi-VN/translation.json index 893b41256f..44beb851c3 100644 --- a/src/lib/i18n/locales/vi-VN/translation.json +++ b/src/lib/i18n/locales/vi-VN/translation.json @@ -132,9 +132,9 @@ "delete": "xóa", "Delete": "Xóa", "Delete a model": "Xóa mô hình", + "Delete All Chats": "", "Delete chat": "Xóa nội dung chat", "Delete Chat": "Xóa chat", - "Delete Chats": "Xóa nội dung chat", "delete this link": "Xóa link này", "Delete User": "Xóa người dùng", "Deleted {{deleteModelTag}}": "Đã xóa {{deleteModelTag}}", @@ -362,6 +362,7 @@ "Search": "Tìm kiếm", "Search a model": "Tìm model", "Search Documents": "Tìm tài liệu", + "Search Models": "", "Search Prompts": "Tìm prompt", "See readme.md for instructions": "Xem readme.md để biết hướng dẫn", "See what's new": "Xem những cập nhật mới", diff --git a/src/lib/i18n/locales/zh-CN/translation.json b/src/lib/i18n/locales/zh-CN/translation.json index 008641f4c7..6c04b2f8c4 100644 --- a/src/lib/i18n/locales/zh-CN/translation.json +++ b/src/lib/i18n/locales/zh-CN/translation.json @@ -132,9 +132,9 @@ "delete": "删除", "Delete": "删除", "Delete a model": "删除一个模型", + "Delete All Chats": "", "Delete chat": "删除聊天", "Delete Chat": "删除聊天", - "Delete Chats": "删除聊天记录", "delete this link": "删除这个链接", "Delete User": "删除用户", "Deleted {{deleteModelTag}}": "已删除{{deleteModelTag}}", @@ -362,6 +362,7 @@ "Search": "搜索", "Search a model": "搜索模型", "Search Documents": "搜索文档", + "Search Models": "", "Search Prompts": "搜索提示词", "See readme.md for instructions": "查看 readme.md 以获取说明", "See what's new": "查看最新内容", diff --git a/src/lib/i18n/locales/zh-TW/translation.json b/src/lib/i18n/locales/zh-TW/translation.json index 9b24b0a95d..2dfc80525a 100644 --- a/src/lib/i18n/locales/zh-TW/translation.json +++ b/src/lib/i18n/locales/zh-TW/translation.json @@ -132,9 +132,9 @@ "delete": "刪除", "Delete": "刪除", "Delete a model": "刪除一個模型", + "Delete All Chats": "", "Delete chat": "刪除聊天紀錄", "Delete Chat": "刪除聊天紀錄", - "Delete Chats": "刪除聊天紀錄", "delete this link": "刪除此連結", "Delete User": "刪除用戶", "Deleted {{deleteModelTag}}": "已刪除 {{deleteModelTag}}", @@ -362,6 +362,7 @@ "Search": "搜尋", "Search a model": "搜尋模型", "Search Documents": "搜尋文件", + "Search Models": "", "Search Prompts": "搜尋提示詞", "See readme.md for instructions": "查看 readme.md 獲取指南", "See what's new": "查看最新內容", From e20bb234096219c6931a36fdf9d45128562db746 Mon Sep 17 00:00:00 2001 From: "Timothy J. Baek" Date: Sun, 26 May 2024 02:00:31 -0700 Subject: [PATCH 24/28] feat: access archived chats as admin --- backend/apps/webui/models/chats.py | 48 +++++++--- backend/apps/webui/routers/chats.py | 88 +++++++++++-------- .../chat/Messages/ResponseMessage.svelte | 2 +- src/lib/utils/index.ts | 4 +- 4 files changed, 90 insertions(+), 52 deletions(-) diff --git a/backend/apps/webui/models/chats.py b/backend/apps/webui/models/chats.py index a07ec5e304..d4597f16db 100644 --- a/backend/apps/webui/models/chats.py +++ b/backend/apps/webui/models/chats.py @@ -191,6 +191,20 @@ class ChatTable: except: return None + def archive_all_chats_by_user_id(self, user_id: str) -> bool: + try: + chats = self.get_chats_by_user_id(user_id) + for chat in chats: + query = Chat.update( + archived=True, + ).where(Chat.id == chat.id) + + query.execute() + + return True + except: + return False + def get_archived_chat_list_by_user_id( self, user_id: str, skip: int = 0, limit: int = 50 ) -> List[ChatModel]: @@ -205,17 +219,31 @@ class ChatTable: ] def get_chat_list_by_user_id( - self, user_id: str, skip: int = 0, limit: int = 50 + self, + user_id: str, + include_archived: bool = False, + skip: int = 0, + limit: int = 50, ) -> List[ChatModel]: - return [ - ChatModel(**model_to_dict(chat)) - for chat in Chat.select() - .where(Chat.archived == False) - .where(Chat.user_id == user_id) - .order_by(Chat.updated_at.desc()) - # .limit(limit) - # .offset(skip) - ] + if include_archived: + return [ + ChatModel(**model_to_dict(chat)) + for chat in Chat.select() + .where(Chat.user_id == user_id) + .order_by(Chat.updated_at.desc()) + # .limit(limit) + # .offset(skip) + ] + else: + return [ + ChatModel(**model_to_dict(chat)) + for chat in Chat.select() + .where(Chat.archived == False) + .where(Chat.user_id == user_id) + .order_by(Chat.updated_at.desc()) + # .limit(limit) + # .offset(skip) + ] def get_chat_list_by_chat_ids( self, chat_ids: List[str], skip: int = 0, limit: int = 50 diff --git a/backend/apps/webui/routers/chats.py b/backend/apps/webui/routers/chats.py index e0c824a8ee..02c9335e08 100644 --- a/backend/apps/webui/routers/chats.py +++ b/backend/apps/webui/routers/chats.py @@ -78,43 +78,25 @@ async def delete_all_user_chats(request: Request, user=Depends(get_current_user) async def get_user_chat_list_by_user_id( user_id: str, user=Depends(get_admin_user), skip: int = 0, limit: int = 50 ): - return Chats.get_chat_list_by_user_id(user_id, skip, limit) + return Chats.get_chat_list_by_user_id( + user_id, include_archived=True, skip=skip, limit=limit + ) ############################ -# GetArchivedChats +# CreateNewChat ############################ -@router.get("/archived", response_model=List[ChatTitleIdResponse]) -async def get_archived_session_user_chat_list( - user=Depends(get_current_user), skip: int = 0, limit: int = 50 -): - return Chats.get_archived_chat_list_by_user_id(user.id, skip, limit) - - -############################ -# GetSharedChatById -############################ - - -@router.get("/share/{share_id}", response_model=Optional[ChatResponse]) -async def get_shared_chat_by_id(share_id: str, user=Depends(get_current_user)): - if user.role == "pending": - raise HTTPException( - status_code=status.HTTP_401_UNAUTHORIZED, detail=ERROR_MESSAGES.NOT_FOUND - ) - - if user.role == "user": - chat = Chats.get_chat_by_share_id(share_id) - elif user.role == "admin": - chat = Chats.get_chat_by_id(share_id) - - if chat: +@router.post("/new", response_model=Optional[ChatResponse]) +async def create_new_chat(form_data: ChatForm, user=Depends(get_current_user)): + try: + chat = Chats.insert_new_chat(user.id, form_data) return ChatResponse(**{**chat.model_dump(), "chat": json.loads(chat.chat)}) - else: + except Exception as e: + log.exception(e) raise HTTPException( - status_code=status.HTTP_401_UNAUTHORIZED, detail=ERROR_MESSAGES.NOT_FOUND + status_code=status.HTTP_400_BAD_REQUEST, detail=ERROR_MESSAGES.DEFAULT() ) @@ -150,19 +132,49 @@ async def get_all_user_chats_in_db(user=Depends(get_admin_user)): ############################ -# CreateNewChat +# GetArchivedChats ############################ -@router.post("/new", response_model=Optional[ChatResponse]) -async def create_new_chat(form_data: ChatForm, user=Depends(get_current_user)): - try: - chat = Chats.insert_new_chat(user.id, form_data) - return ChatResponse(**{**chat.model_dump(), "chat": json.loads(chat.chat)}) - except Exception as e: - log.exception(e) +@router.get("/archived", response_model=List[ChatTitleIdResponse]) +async def get_archived_session_user_chat_list( + user=Depends(get_current_user), skip: int = 0, limit: int = 50 +): + return Chats.get_archived_chat_list_by_user_id(user.id, skip, limit) + + +############################ +# ArchiveAllChats +############################ + + +@router.get("/archive/all", response_model=List[ChatTitleIdResponse]) +async def archive_all_chats(user=Depends(get_current_user)): + return Chats.archive_all_chats_by_user_id(user.id) + + +############################ +# GetSharedChatById +############################ + + +@router.get("/share/{share_id}", response_model=Optional[ChatResponse]) +async def get_shared_chat_by_id(share_id: str, user=Depends(get_current_user)): + if user.role == "pending": raise HTTPException( - status_code=status.HTTP_400_BAD_REQUEST, detail=ERROR_MESSAGES.DEFAULT() + status_code=status.HTTP_401_UNAUTHORIZED, detail=ERROR_MESSAGES.NOT_FOUND + ) + + if user.role == "user": + chat = Chats.get_chat_by_share_id(share_id) + elif user.role == "admin": + chat = Chats.get_chat_by_id(share_id) + + if chat: + return ChatResponse(**{**chat.model_dump(), "chat": json.loads(chat.chat)}) + else: + raise HTTPException( + status_code=status.HTTP_401_UNAUTHORIZED, detail=ERROR_MESSAGES.NOT_FOUND ) diff --git a/src/lib/components/chat/Messages/ResponseMessage.svelte b/src/lib/components/chat/Messages/ResponseMessage.svelte index 15a0501a3a..cae705b64a 100644 --- a/src/lib/components/chat/Messages/ResponseMessage.svelte +++ b/src/lib/components/chat/Messages/ResponseMessage.svelte @@ -82,7 +82,7 @@ // Open all links in a new tab/window (from https://github.com/markedjs/marked/issues/655#issuecomment-383226346) const origLinkRenderer = renderer.link; - renderer.link = (href, title, text) => { + renderer.link = (href, title, text) => { const html = origLinkRenderer.call(renderer, href, title, text); return html.replace(/^
{ }; export const revertSanitizedResponseContent = (content: string) => { - return content - .replaceAll('<', '<') - .replaceAll('>', '>'); + return content.replaceAll('<', '<').replaceAll('>', '>'); }; export const capitalizeFirstLetter = (string) => { From d9de426fcd5fb902aa68be64ca80932ac863b61a Mon Sep 17 00:00:00 2001 From: "Timothy J. Baek" Date: Sun, 26 May 2024 02:22:46 -0700 Subject: [PATCH 25/28] feat: export all archived chats --- .../layout/Sidebar/ArchivedChatsModal.svelte | 57 ++++++++++++++++--- 1 file changed, 49 insertions(+), 8 deletions(-) diff --git a/src/lib/components/layout/Sidebar/ArchivedChatsModal.svelte b/src/lib/components/layout/Sidebar/ArchivedChatsModal.svelte index a7075133e5..931931f364 100644 --- a/src/lib/components/layout/Sidebar/ArchivedChatsModal.svelte +++ b/src/lib/components/layout/Sidebar/ArchivedChatsModal.svelte @@ -1,4 +1,6 @@ + + + + {$i18n.t('Admin Panel')} | {$WEBUI_NAME} + + + +
+
+
+
+ +
+
{$i18n.t('Workspace')}
+
+
+ + + +
+ +
+ +
+
diff --git a/src/routes/(app)/admin/+page.svelte b/src/routes/(app)/admin/+page.svelte index 449b69eb25..f0ff3fc843 100644 --- a/src/routes/(app)/admin/+page.svelte +++ b/src/routes/(app)/admin/+page.svelte @@ -82,10 +82,6 @@ }); - - {$i18n.t('Admin Panel')} | {$WEBUI_NAME} - - {#key selectedUser} -
- {#if loaded} -
-
-
+{#if loaded} +
+
+ {$i18n.t('All Users')} +
+ {users.length} +
+ +
+ + +
+ -
-
{$i18n.t('Dashboard')}
-
-
+ - - -
- -
-
-
- {$i18n.t('All Users')} -
- {users.length} -
- -
- - -
- - - - - - - -
-
-
- -
- - + - - - - - - - - - - - {#each users - .filter((user) => { - if (search === '') { - return true; - } else { - let name = user.name.toLowerCase(); - const query = search.toLowerCase(); - return name.includes(query); - } - }) - .slice((page - 1) * 20, page * 20) as user} - - - - - - - - - - - - {/each} - -
{$i18n.t('Role')} {$i18n.t('Name')} {$i18n.t('Email')} {$i18n.t('Last Active')} {$i18n.t('Created at')} -
- - -
- user - -
{user.name}
-
-
{user.email} - {dayjs(user.last_active_at * 1000).fromNow()} - - {dayjs(user.created_at * 1000).format($i18n.t('MMMM DD, YYYY'))} - -
- {#if user.role !== 'admin'} - - - - - - - - - - - - {/if} -
-
+ + + + +
- -
- ⓘ {$i18n.t("Click on the user role button to change a user's role.")} -
- -
- {/if} -
+
+ +
+ + + + + + + + + + + + + + {#each users + .filter((user) => { + if (search === '') { + return true; + } else { + let name = user.name.toLowerCase(); + const query = search.toLowerCase(); + return name.includes(query); + } + }) + .slice((page - 1) * 20, page * 20) as user} + + + + + + + + + + + + {/each} + +
{$i18n.t('Role')} {$i18n.t('Name')} {$i18n.t('Email')} {$i18n.t('Last Active')} {$i18n.t('Created at')} +
+ + +
+ user + +
{user.name}
+
+
{user.email} + {dayjs(user.last_active_at * 1000).fromNow()} + + {dayjs(user.created_at * 1000).format($i18n.t('MMMM DD, YYYY'))} + +
+ {#if user.role !== 'admin'} + + + + + + + + + + + + {/if} +
+
+
+ +
+ ⓘ {$i18n.t("Click on the user role button to change a user's role.")} +
+ + +{/if}