Compare commits
35 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
4b17601baf | ||
|
|
c994307954 | ||
|
|
a13ffd22f1 | ||
|
|
7b8f40e117 | ||
|
|
add4dad8c0 | ||
|
|
7faa805176 | ||
|
|
91651b918e | ||
|
|
725e0930fe | ||
|
|
93ba903fc8 | ||
|
|
56064831d3 | ||
|
|
4bdb813b64 | ||
|
|
ad69887e4a | ||
|
|
c8f148d1f8 | ||
|
|
365e39a20a | ||
|
|
48c2fd2e81 | ||
|
|
3a5dc568c5 | ||
|
|
a180f7a46c | ||
|
|
07a12ba41f | ||
|
|
dd5351a3de | ||
|
|
ae48a17301 | ||
|
|
9e19698788 | ||
|
|
323725df33 | ||
|
|
7c40420048 | ||
|
|
fac51aefb9 | ||
|
|
8f1fbc511a | ||
|
|
f0bf112faf | ||
|
|
b2a15b92cd | ||
|
|
9b71bbea2e | ||
|
|
2645ab3732 | ||
|
|
8672c4ac40 | ||
|
|
b8bfd54515 | ||
|
|
a29d245381 | ||
|
|
f57427e2c4 | ||
|
|
3631f06075 | ||
|
|
67a66f85da |
1
.github/FUNDING.yml
vendored
1
.github/FUNDING.yml
vendored
@@ -1,6 +1,7 @@
|
|||||||
# These are supported funding model platforms
|
# These are supported funding model platforms
|
||||||
|
|
||||||
github: jeffser # Replace with up to 4 GitHub Sponsors-enabled usernames e.g., [user1, user2]
|
github: jeffser # Replace with up to 4 GitHub Sponsors-enabled usernames e.g., [user1, user2]
|
||||||
|
ko_fi: jeffser
|
||||||
#patreon: # Replace with a single Patreon username
|
#patreon: # Replace with a single Patreon username
|
||||||
#open_collective: # Replace with a single Open Collective username
|
#open_collective: # Replace with a single Open Collective username
|
||||||
#ko_fi: # Replace with a single Ko-fi username
|
#ko_fi: # Replace with a single Ko-fi username
|
||||||
|
|||||||
20
.github/ISSUE_TEMPLATE/bug_report.md
vendored
Normal file
20
.github/ISSUE_TEMPLATE/bug_report.md
vendored
Normal file
@@ -0,0 +1,20 @@
|
|||||||
|
---
|
||||||
|
name: Bug report
|
||||||
|
about: Something is wrong
|
||||||
|
title: ''
|
||||||
|
labels: bug
|
||||||
|
assignees: ''
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
**Describe the bug**
|
||||||
|
A clear and concise description of what the bug is.
|
||||||
|
|
||||||
|
**Expected behavior**
|
||||||
|
A clear and concise description of what you expected to happen.
|
||||||
|
|
||||||
|
**Screenshots**
|
||||||
|
If applicable, add screenshots to help explain your problem.
|
||||||
|
|
||||||
|
**Additional context**
|
||||||
|
Add any other context about the problem here.
|
||||||
20
.github/ISSUE_TEMPLATE/feature_request.md
vendored
Normal file
20
.github/ISSUE_TEMPLATE/feature_request.md
vendored
Normal file
@@ -0,0 +1,20 @@
|
|||||||
|
---
|
||||||
|
name: Feature request
|
||||||
|
about: Suggest an idea for this project
|
||||||
|
title: ''
|
||||||
|
labels: enhancement
|
||||||
|
assignees: ''
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
**Is your feature request related to a problem? Please describe.**
|
||||||
|
A clear and concise description of what the problem is. Ex. I'm always frustrated when [...]
|
||||||
|
|
||||||
|
**Describe the solution you'd like**
|
||||||
|
A clear and concise description of what you want to happen.
|
||||||
|
|
||||||
|
**Describe alternatives you've considered**
|
||||||
|
A clear and concise description of any alternative solutions or features you've considered.
|
||||||
|
|
||||||
|
**Additional context**
|
||||||
|
Add any other context or screenshots about the feature request here.
|
||||||
6
data/com.jeffser.Alpaca.SearchProvider.ini.in
Normal file
6
data/com.jeffser.Alpaca.SearchProvider.ini.in
Normal file
@@ -0,0 +1,6 @@
|
|||||||
|
[Shell Search Provider]
|
||||||
|
DesktopId=@appid@.desktop
|
||||||
|
BusName=@appid@.SearchProvider
|
||||||
|
ObjectPath=/com/jeffser/Alpaca/SearchProvider
|
||||||
|
Version=2
|
||||||
|
|
||||||
3
data/com.jeffser.Alpaca.SearchProvider.service.in
Normal file
3
data/com.jeffser.Alpaca.SearchProvider.service.in
Normal file
@@ -0,0 +1,3 @@
|
|||||||
|
[D-BUS Service]
|
||||||
|
Name=@appid@.SearchProvider
|
||||||
|
Exec=@libexecdir@/alpaca_search_provider
|
||||||
@@ -63,6 +63,40 @@
|
|||||||
<url type="homepage">https://github.com/Jeffser/Alpaca</url>
|
<url type="homepage">https://github.com/Jeffser/Alpaca</url>
|
||||||
<url type="donation">https://github.com/sponsors/Jeffser</url>
|
<url type="donation">https://github.com/sponsors/Jeffser</url>
|
||||||
<releases>
|
<releases>
|
||||||
|
<release version="0.9.2" date="2024-05-30">
|
||||||
|
<url type="details">https://github.com/Jeffser/Alpaca/releases/tag/0.9.2</url>
|
||||||
|
<description>
|
||||||
|
<p>Fix</p>
|
||||||
|
<ul>
|
||||||
|
<li>Fixed: app didn't open if models tweaks wasn't present in the config files</li>
|
||||||
|
</ul>
|
||||||
|
</description>
|
||||||
|
</release>
|
||||||
|
<release version="0.9.1" date="2024-05-29">
|
||||||
|
<url type="details">https://github.com/Jeffser/Alpaca/releases/tag/0.9.1</url>
|
||||||
|
<description>
|
||||||
|
<p>Big Update</p>
|
||||||
|
<ul>
|
||||||
|
<li>Changed multiple icons (paper airplane for the send button)</li>
|
||||||
|
<li>Combined export / import chat buttons into a menu</li>
|
||||||
|
<li>Added 'model tweaks' (temperature, seed, keep_alive)</li>
|
||||||
|
<li>Fixed send / stop button</li>
|
||||||
|
<li>Fixed app not checking if remote connection works when starting</li>
|
||||||
|
</ul>
|
||||||
|
</description>
|
||||||
|
</release>
|
||||||
|
<release version="0.9.0" date="2024-05-29">
|
||||||
|
<url type="details">https://github.com/Jeffser/Alpaca/releases/tag/0.9.0</url>
|
||||||
|
<description>
|
||||||
|
<p>Daily Update</p>
|
||||||
|
<ul>
|
||||||
|
<li>Added text ellipsis to chat name so it doesn't change the button width</li>
|
||||||
|
<li>New shortcut for creating a chat (CTRL+N)</li>
|
||||||
|
<li>New message entry design</li>
|
||||||
|
<li>Fixed: Can't rename the same chat multiple times</li>
|
||||||
|
</ul>
|
||||||
|
</description>
|
||||||
|
</release>
|
||||||
<release version="0.8.8" date="2024-05-28">
|
<release version="0.8.8" date="2024-05-28">
|
||||||
<url type="details">https://github.com/Jeffser/Alpaca/releases/tag/0.8.8</url>
|
<url type="details">https://github.com/Jeffser/Alpaca/releases/tag/0.8.8</url>
|
||||||
<description>
|
<description>
|
||||||
|
|||||||
@@ -33,4 +33,24 @@ test('Validate schema file',
|
|||||||
compile_schemas,
|
compile_schemas,
|
||||||
args: ['--strict', '--dry-run', meson.current_source_dir()])
|
args: ['--strict', '--dry-run', meson.current_source_dir()])
|
||||||
|
|
||||||
|
#service_conf = configuration_data()
|
||||||
|
#service_conf.set('appid', application_id)
|
||||||
|
#service_conf.set('libexecdir', join_paths(get_option('prefix'), get_option('bindir')))
|
||||||
|
#configure_file(
|
||||||
|
#input: 'com.jeffser.Alpaca.SearchProvider.service.in',
|
||||||
|
#output: '@0@.SearchProvider.service'.format(application_id),
|
||||||
|
#configuration: service_conf,
|
||||||
|
#install_dir: join_paths(join_paths(get_option('prefix'), get_option('datadir')), 'dbus-1', 'services')
|
||||||
|
#)
|
||||||
|
|
||||||
|
#search_provider_conf = configuration_data()
|
||||||
|
#search_provider_conf.set('appid', application_id)
|
||||||
|
#configure_file(
|
||||||
|
#configuration: search_provider_conf,
|
||||||
|
#input: files('com.jeffser.Alpaca.SearchProvider.ini.in'),
|
||||||
|
#install_dir: join_paths(get_option('datadir'), 'gnome-shell', 'search-providers'),
|
||||||
|
#output: '@0@.SearchProvider.ini'.format(application_id)
|
||||||
|
#)
|
||||||
|
|
||||||
|
|
||||||
subdir('icons')
|
subdir('icons')
|
||||||
@@ -1,11 +1,12 @@
|
|||||||
project('Alpaca',
|
project('Alpaca', 'c',
|
||||||
version: '0.8.8',
|
version: '0.9.2',
|
||||||
meson_version: '>= 0.62.0',
|
meson_version: '>= 0.62.0',
|
||||||
default_options: [ 'warning_level=2', 'werror=false', ],
|
default_options: [ 'warning_level=2', 'werror=false', ],
|
||||||
)
|
)
|
||||||
|
|
||||||
i18n = import('i18n')
|
i18n = import('i18n')
|
||||||
gnome = import('gnome')
|
gnome = import('gnome')
|
||||||
|
application_id = 'com.jeffser.Alpaca'
|
||||||
|
|
||||||
subdir('data')
|
subdir('data')
|
||||||
subdir('src')
|
subdir('src')
|
||||||
|
|||||||
515
po/alpaca.pot
515
po/alpaca.pot
File diff suppressed because it is too large
Load Diff
951
po/fr.po~
Normal file
951
po/fr.po~
Normal file
@@ -0,0 +1,951 @@
|
|||||||
|
# French translation for Alpaca
|
||||||
|
#
|
||||||
|
# Translate guideline :
|
||||||
|
#
|
||||||
|
# English French
|
||||||
|
# to chat discuter
|
||||||
|
# a chat une discussion
|
||||||
|
#
|
||||||
|
#
|
||||||
|
msgid ""
|
||||||
|
msgstr ""
|
||||||
|
"Project-Id-Version: 0.8.7\n"
|
||||||
|
"Report-Msgid-Bugs-To: \n"
|
||||||
|
"POT-Creation-Date: 2024-05-29 16:15-0600\n"
|
||||||
|
"PO-Revision-Date: 2024-05-28 21:02+0200\n"
|
||||||
|
"Last-Translator: Louis Chauvet-Villaret <louischauvet0@gmail.com>\n"
|
||||||
|
"Language-Team: \n"
|
||||||
|
"Language: fr\n"
|
||||||
|
"MIME-Version: 1.0\n"
|
||||||
|
"Content-Type: text/plain; charset=UTF-8\n"
|
||||||
|
"Content-Transfer-Encoding: 8bit\n"
|
||||||
|
"X-Generator: Poedit 3.4.4\n"
|
||||||
|
|
||||||
|
#: data/com.jeffser.Alpaca.desktop.in:3
|
||||||
|
#: data/com.jeffser.Alpaca.metainfo.xml.in:7
|
||||||
|
msgid "Alpaca"
|
||||||
|
msgstr "Alpaca"
|
||||||
|
|
||||||
|
#: data/com.jeffser.Alpaca.metainfo.xml.in:8
|
||||||
|
#, fuzzy
|
||||||
|
msgid "Chat with local AI models"
|
||||||
|
msgstr "Discutez avec des modèles d'IA fonctionnant localement grâce à Ollama"
|
||||||
|
|
||||||
|
#: data/com.jeffser.Alpaca.metainfo.xml.in:10
|
||||||
|
msgid "An Ollama client"
|
||||||
|
msgstr "Un client Ollama"
|
||||||
|
|
||||||
|
#: data/com.jeffser.Alpaca.metainfo.xml.in:11
|
||||||
|
#: data/com.jeffser.Alpaca.metainfo.xml.in:357
|
||||||
|
msgid "Features"
|
||||||
|
msgstr "Fonctionnalités"
|
||||||
|
|
||||||
|
#: data/com.jeffser.Alpaca.metainfo.xml.in:13
|
||||||
|
msgid "Built in Ollama instance"
|
||||||
|
msgstr "Intégrée dans l'instance Ollama"
|
||||||
|
|
||||||
|
#: data/com.jeffser.Alpaca.metainfo.xml.in:14
|
||||||
|
#: data/com.jeffser.Alpaca.metainfo.xml.in:359
|
||||||
|
msgid "Talk to multiple models in the same conversation"
|
||||||
|
msgstr "Discutez avec plusieurs modèles dans la même discussion"
|
||||||
|
|
||||||
|
#: data/com.jeffser.Alpaca.metainfo.xml.in:15
|
||||||
|
#: data/com.jeffser.Alpaca.metainfo.xml.in:360
|
||||||
|
msgid "Pull and delete models from the app"
|
||||||
|
msgstr "Téléchargez et supprimez des modèles depuis l'application"
|
||||||
|
|
||||||
|
#: data/com.jeffser.Alpaca.metainfo.xml.in:16
|
||||||
|
msgid "Have multiple conversations"
|
||||||
|
msgstr "Ayez plusieurs discussions"
|
||||||
|
|
||||||
|
#: data/com.jeffser.Alpaca.metainfo.xml.in:17
|
||||||
|
msgid "Image recognition (Only available with compatible models)"
|
||||||
|
msgstr ""
|
||||||
|
"Reconnaissance d'image (Uniquement disponible avec les modèles compatibles)"
|
||||||
|
|
||||||
|
#: data/com.jeffser.Alpaca.metainfo.xml.in:18
|
||||||
|
msgid "Import and export chats"
|
||||||
|
msgstr "Importez et exportez des discussions"
|
||||||
|
|
||||||
|
#: data/com.jeffser.Alpaca.metainfo.xml.in:20 src/window.ui:506
|
||||||
|
msgid "Disclaimer"
|
||||||
|
msgstr "Avertissement"
|
||||||
|
|
||||||
|
#: data/com.jeffser.Alpaca.metainfo.xml.in:21
|
||||||
|
msgid ""
|
||||||
|
"This project is not affiliated at all with Ollama, I'm not responsible for "
|
||||||
|
"any damages to your device or software caused by running code given by any "
|
||||||
|
"models."
|
||||||
|
msgstr ""
|
||||||
|
"Ce projet n'est aucunement affilié avec Ollama, et je ne suis aucunement "
|
||||||
|
"responsable des dommages causés à votre appareil ou vos logiciels en "
|
||||||
|
"exécutant du code donné par n'importe quel modèle."
|
||||||
|
|
||||||
|
#: data/com.jeffser.Alpaca.metainfo.xml.in:24
|
||||||
|
msgid "Jeffry Samuel Eduarte Rojas"
|
||||||
|
msgstr "Jeffry Samuel Eduarte Rojas"
|
||||||
|
|
||||||
|
#: data/com.jeffser.Alpaca.metainfo.xml.in:50
|
||||||
|
msgid "A conversation showing code highlight"
|
||||||
|
msgstr "Une discussion montrant code avec de la coloration syntaxique"
|
||||||
|
|
||||||
|
#: data/com.jeffser.Alpaca.metainfo.xml.in:54
|
||||||
|
msgid "A conversation involving multiple models"
|
||||||
|
msgstr "Une discussion utilisant plusieurs modèles"
|
||||||
|
|
||||||
|
#: data/com.jeffser.Alpaca.metainfo.xml.in:58
|
||||||
|
msgid "Managing models"
|
||||||
|
msgstr "Gestion des modèles"
|
||||||
|
|
||||||
|
#: data/com.jeffser.Alpaca.metainfo.xml.in:69
|
||||||
|
#: data/com.jeffser.Alpaca.metainfo.xml.in:274
|
||||||
|
#: data/com.jeffser.Alpaca.metainfo.xml.in:331
|
||||||
|
msgid "Big Update"
|
||||||
|
msgstr "Mise à jour majeure"
|
||||||
|
|
||||||
|
#: data/com.jeffser.Alpaca.metainfo.xml.in:71
|
||||||
|
msgid "Changed multiple icons (paper airplane for the send button)"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: data/com.jeffser.Alpaca.metainfo.xml.in:72
|
||||||
|
msgid "Combined export / import chat buttons into a menu"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: data/com.jeffser.Alpaca.metainfo.xml.in:73
|
||||||
|
msgid "Added 'model tweaks' (temperature, seed, keep_alive)"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: data/com.jeffser.Alpaca.metainfo.xml.in:74
|
||||||
|
msgid "Fixed send / stop button"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: data/com.jeffser.Alpaca.metainfo.xml.in:75
|
||||||
|
msgid "Fixed app not checking if remote connection works when starting"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: data/com.jeffser.Alpaca.metainfo.xml.in:82
|
||||||
|
#, fuzzy
|
||||||
|
msgid "Daily Update"
|
||||||
|
msgstr "Une autre mise à jour quotidienne"
|
||||||
|
|
||||||
|
#: data/com.jeffser.Alpaca.metainfo.xml.in:84
|
||||||
|
msgid "Added text ellipsis to chat name so it doesn't change the button width"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: data/com.jeffser.Alpaca.metainfo.xml.in:85
|
||||||
|
msgid "New shortcut for creating a chat (CTRL+N)"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: data/com.jeffser.Alpaca.metainfo.xml.in:86
|
||||||
|
msgid "New message entry design"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: data/com.jeffser.Alpaca.metainfo.xml.in:87
|
||||||
|
msgid "Fixed: Can't rename the same chat multiple times"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: data/com.jeffser.Alpaca.metainfo.xml.in:94
|
||||||
|
msgid "The fix"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: data/com.jeffser.Alpaca.metainfo.xml.in:96
|
||||||
|
msgid ""
|
||||||
|
"Fixed: Ollama instance keeps running on the background even when it is "
|
||||||
|
"disabled"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: data/com.jeffser.Alpaca.metainfo.xml.in:97
|
||||||
|
msgid "Fixed: Can't pull models on the integrated instance"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: data/com.jeffser.Alpaca.metainfo.xml.in:104
|
||||||
|
#, fuzzy
|
||||||
|
msgid "Quick tweaks"
|
||||||
|
msgstr "Petites corrections"
|
||||||
|
|
||||||
|
#: data/com.jeffser.Alpaca.metainfo.xml.in:106
|
||||||
|
msgid "Added progress bar to models that are being pulled"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: data/com.jeffser.Alpaca.metainfo.xml.in:107
|
||||||
|
msgid "Added size to tags when pulling a model"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: data/com.jeffser.Alpaca.metainfo.xml.in:108
|
||||||
|
#, fuzzy
|
||||||
|
msgid "General optimizations on the background"
|
||||||
|
msgstr "Optimisations générales"
|
||||||
|
|
||||||
|
#: data/com.jeffser.Alpaca.metainfo.xml.in:115
|
||||||
|
msgid "Quick fixes"
|
||||||
|
msgstr "Petites corrections"
|
||||||
|
|
||||||
|
#: data/com.jeffser.Alpaca.metainfo.xml.in:117
|
||||||
|
msgid "Fixed: Scroll when message is received"
|
||||||
|
msgstr "Correction: Défilement lors de la réception d'un message"
|
||||||
|
|
||||||
|
#: data/com.jeffser.Alpaca.metainfo.xml.in:118
|
||||||
|
msgid "Fixed: Content doesn't change when creating a new chat"
|
||||||
|
msgstr ""
|
||||||
|
"Correction: Le contenu ne change pas lors de la création d'un nouveau chat"
|
||||||
|
|
||||||
|
#: data/com.jeffser.Alpaca.metainfo.xml.in:119
|
||||||
|
msgid "Added 'Featured Models' page on welcome dialog"
|
||||||
|
msgstr ""
|
||||||
|
"Ajout de la page 'Modèles Suggérés' sur la fenêtre de dialogue d'accueil"
|
||||||
|
|
||||||
|
#: data/com.jeffser.Alpaca.metainfo.xml.in:126
|
||||||
|
msgid "Nice Update"
|
||||||
|
msgstr "Bonne mise à jour"
|
||||||
|
|
||||||
|
#: data/com.jeffser.Alpaca.metainfo.xml.in:128
|
||||||
|
msgid "UI tweaks (Thanks Nokse22)"
|
||||||
|
msgstr "Ajustement de l'interface utilisateur (Merci à Nokse22)"
|
||||||
|
|
||||||
|
#: data/com.jeffser.Alpaca.metainfo.xml.in:129
|
||||||
|
msgid "General optimizations"
|
||||||
|
msgstr "Optimisations générales"
|
||||||
|
|
||||||
|
#: data/com.jeffser.Alpaca.metainfo.xml.in:130
|
||||||
|
msgid "Metadata fixes"
|
||||||
|
msgstr "Correction des métadonnées"
|
||||||
|
|
||||||
|
#: data/com.jeffser.Alpaca.metainfo.xml.in:137
|
||||||
|
msgid "Quick fix"
|
||||||
|
msgstr "Petite correction"
|
||||||
|
|
||||||
|
#: data/com.jeffser.Alpaca.metainfo.xml.in:139
|
||||||
|
msgid "Updated Spanish translation"
|
||||||
|
msgstr "Mise à jour de la traduction Espagnol"
|
||||||
|
|
||||||
|
#: data/com.jeffser.Alpaca.metainfo.xml.in:140
|
||||||
|
msgid "Added compatibility for PNG"
|
||||||
|
msgstr "Ajout de la compatibilité pour les images PNG"
|
||||||
|
|
||||||
|
#: data/com.jeffser.Alpaca.metainfo.xml.in:147
|
||||||
|
msgid "New Update"
|
||||||
|
msgstr "Nouvelle mise à jour"
|
||||||
|
|
||||||
|
#: data/com.jeffser.Alpaca.metainfo.xml.in:149
|
||||||
|
msgid "Updated model list"
|
||||||
|
msgstr "Liste des modèles mise à jour"
|
||||||
|
|
||||||
|
#: data/com.jeffser.Alpaca.metainfo.xml.in:150
|
||||||
|
msgid "Added image recognition to more models"
|
||||||
|
msgstr "Ajout de la reconnaissance d'image à plus de modèles"
|
||||||
|
|
||||||
|
#: data/com.jeffser.Alpaca.metainfo.xml.in:151
|
||||||
|
msgid "Added Brazilian Portuguese translation (Thanks Daimaar Stein)"
|
||||||
|
msgstr "Ajout de la traduction en Portugais Brésilien (Merci à Daimaar Stein)"
|
||||||
|
|
||||||
|
#: data/com.jeffser.Alpaca.metainfo.xml.in:152
|
||||||
|
msgid "Refined the general UI (Thanks Nokse22)"
|
||||||
|
msgstr "Peaufinage de l'interface utilisateur (Merci à Nokse22)"
|
||||||
|
|
||||||
|
#: data/com.jeffser.Alpaca.metainfo.xml.in:153
|
||||||
|
msgid "Added 'delete message' feature"
|
||||||
|
msgstr "Ajout de l'option 'supprimer le message'"
|
||||||
|
|
||||||
|
#: data/com.jeffser.Alpaca.metainfo.xml.in:154
|
||||||
|
msgid ""
|
||||||
|
"Added metadata so that software distributors know that the app is compatible "
|
||||||
|
"with mobile"
|
||||||
|
msgstr ""
|
||||||
|
"Ajout de métadonnées pour que les distributeurs de logiciels sachent que "
|
||||||
|
"l'application est compatible avec les téléphones"
|
||||||
|
|
||||||
|
#: data/com.jeffser.Alpaca.metainfo.xml.in:155
|
||||||
|
msgid ""
|
||||||
|
"Changed 'send' shortcut to just the return/enter key (to add a new line use "
|
||||||
|
"shift+return)"
|
||||||
|
msgstr ""
|
||||||
|
"Changement du raccourci 'envoyer' en une simple touche retour/entrée (pour "
|
||||||
|
"ajouter une nouvelle ligne, utiliser shift+retour)"
|
||||||
|
|
||||||
|
#: data/com.jeffser.Alpaca.metainfo.xml.in:162
|
||||||
|
msgid "Bug Fixes"
|
||||||
|
msgstr "Résolution de bogues"
|
||||||
|
|
||||||
|
#: data/com.jeffser.Alpaca.metainfo.xml.in:164
|
||||||
|
msgid "Fixed: Minor spelling mistake"
|
||||||
|
msgstr "Corrigé: Petite faute d'orthographe"
|
||||||
|
|
||||||
|
#: data/com.jeffser.Alpaca.metainfo.xml.in:165
|
||||||
|
msgid "Added 'mobile' as a supported form factor"
|
||||||
|
msgstr "Ajout de la mise en page 'mobile'"
|
||||||
|
|
||||||
|
#: data/com.jeffser.Alpaca.metainfo.xml.in:166
|
||||||
|
msgid "Fixed: 'Connection Error' dialog not working properly"
|
||||||
|
msgstr ""
|
||||||
|
"Correction: La boîte de dialogue « Erreur de connexion » ne fonctionnait pas "
|
||||||
|
"correctement"
|
||||||
|
|
||||||
|
#: data/com.jeffser.Alpaca.metainfo.xml.in:167
|
||||||
|
msgid "Fixed: App might freeze randomly on startup"
|
||||||
|
msgstr ""
|
||||||
|
"Correction: L'application pouvait se bloquer aléatoirement au démarrage"
|
||||||
|
|
||||||
|
#: data/com.jeffser.Alpaca.metainfo.xml.in:168
|
||||||
|
msgid "Changed 'chats' label on sidebar for 'Alpaca'"
|
||||||
|
msgstr "Changement du titre 'chats' de la barre latéral par 'Alpaca'"
|
||||||
|
|
||||||
|
#: data/com.jeffser.Alpaca.metainfo.xml.in:175
|
||||||
|
msgid "Cool Update"
|
||||||
|
msgstr "Mise à jour sympa"
|
||||||
|
|
||||||
|
#: data/com.jeffser.Alpaca.metainfo.xml.in:177
|
||||||
|
msgid "Better design for chat window"
|
||||||
|
msgstr "Meilleur design pour de fenêtre de discussion"
|
||||||
|
|
||||||
|
#: data/com.jeffser.Alpaca.metainfo.xml.in:178
|
||||||
|
msgid "Better design for chat sidebar"
|
||||||
|
msgstr "Meilleur design pour de la barre latérale"
|
||||||
|
|
||||||
|
#: data/com.jeffser.Alpaca.metainfo.xml.in:179
|
||||||
|
msgid "Fixed remote connections"
|
||||||
|
msgstr "Correction des connexions à distance"
|
||||||
|
|
||||||
|
#: data/com.jeffser.Alpaca.metainfo.xml.in:180
|
||||||
|
msgid "Fixed Ollama restarting in loop"
|
||||||
|
msgstr "Correction d'Ollama qui redémarrait en boucle"
|
||||||
|
|
||||||
|
#: data/com.jeffser.Alpaca.metainfo.xml.in:181
|
||||||
|
msgid "Other cool backend stuff"
|
||||||
|
msgstr "Autres trucs sympas en arrière-plan"
|
||||||
|
|
||||||
|
#: data/com.jeffser.Alpaca.metainfo.xml.in:188
|
||||||
|
msgid "Huge Update"
|
||||||
|
msgstr "Grande mise à jour"
|
||||||
|
|
||||||
|
#: data/com.jeffser.Alpaca.metainfo.xml.in:190
|
||||||
|
msgid "Added Ollama as part of Alpaca, Ollama will run in a sandbox"
|
||||||
|
msgstr ""
|
||||||
|
"Ajout d'Ollama comme partie d'Alpaca, Ollama fonctionnera dans un bac à sable"
|
||||||
|
|
||||||
|
#: data/com.jeffser.Alpaca.metainfo.xml.in:191
|
||||||
|
msgid "Added option to connect to remote instances (how it worked before)"
|
||||||
|
msgstr ""
|
||||||
|
"Ajout de l'option pour se connecter à des instances distantes (comme cela "
|
||||||
|
"fonctionnait précédemment)"
|
||||||
|
|
||||||
|
#: data/com.jeffser.Alpaca.metainfo.xml.in:192
|
||||||
|
msgid "Added option to import and export chats"
|
||||||
|
msgstr "Ajout de l'option pour importer et exporter les discussions"
|
||||||
|
|
||||||
|
#: data/com.jeffser.Alpaca.metainfo.xml.in:193
|
||||||
|
msgid "Added option to run Alpaca with Ollama in the background"
|
||||||
|
msgstr "Ajout de l'option pour exécuter Alpaca avec Ollama en arrière-plan"
|
||||||
|
|
||||||
|
#: data/com.jeffser.Alpaca.metainfo.xml.in:194
|
||||||
|
msgid "Added preferences dialog"
|
||||||
|
msgstr "Ajout de la boite de dialogue des paramètres"
|
||||||
|
|
||||||
|
#: data/com.jeffser.Alpaca.metainfo.xml.in:195
|
||||||
|
msgid "Changed the welcome dialog"
|
||||||
|
msgstr "Changement de la boite de dialogue de bienvenue"
|
||||||
|
|
||||||
|
#: data/com.jeffser.Alpaca.metainfo.xml.in:197
|
||||||
|
#: data/com.jeffser.Alpaca.metainfo.xml.in:214
|
||||||
|
#: data/com.jeffser.Alpaca.metainfo.xml.in:226
|
||||||
|
#: data/com.jeffser.Alpaca.metainfo.xml.in:245
|
||||||
|
#: data/com.jeffser.Alpaca.metainfo.xml.in:266
|
||||||
|
#: data/com.jeffser.Alpaca.metainfo.xml.in:282
|
||||||
|
#: data/com.jeffser.Alpaca.metainfo.xml.in:298
|
||||||
|
#: data/com.jeffser.Alpaca.metainfo.xml.in:312
|
||||||
|
#: data/com.jeffser.Alpaca.metainfo.xml.in:322
|
||||||
|
#: data/com.jeffser.Alpaca.metainfo.xml.in:340
|
||||||
|
#: data/com.jeffser.Alpaca.metainfo.xml.in:362
|
||||||
|
msgid "Please report any errors to the issues page, thank you."
|
||||||
|
msgstr "Merci de reporter n'importe quel erreur sur la page des problèmes."
|
||||||
|
|
||||||
|
#: data/com.jeffser.Alpaca.metainfo.xml.in:205
|
||||||
|
msgid "Yet Another Daily Update"
|
||||||
|
msgstr "Encore une autre mise à jour quotidienne"
|
||||||
|
|
||||||
|
#: data/com.jeffser.Alpaca.metainfo.xml.in:207
|
||||||
|
msgid "Added better UI for 'Manage Models' dialog"
|
||||||
|
msgstr ""
|
||||||
|
"Ajout d'une meilleur interface utilisateur pour la boite de dialogue "
|
||||||
|
"'Gestion des modèles'"
|
||||||
|
|
||||||
|
#: data/com.jeffser.Alpaca.metainfo.xml.in:208
|
||||||
|
msgid "Added better UI for the chat sidebar"
|
||||||
|
msgstr "Ajout d'une meilleur interface utilisateur pour la barre latérale"
|
||||||
|
|
||||||
|
#: data/com.jeffser.Alpaca.metainfo.xml.in:209
|
||||||
|
msgid ""
|
||||||
|
"Replaced model description with a button to open Ollama's website for the "
|
||||||
|
"model"
|
||||||
|
msgstr ""
|
||||||
|
"Remplacement de la description du modèle par un bouton pour ouvrir le site "
|
||||||
|
"web Ollama pour le modèle"
|
||||||
|
|
||||||
|
#: data/com.jeffser.Alpaca.metainfo.xml.in:210
|
||||||
|
msgid "Added myself to the credits as the spanish translator"
|
||||||
|
msgstr "Ajout de moi-même aux crédits en tant que traducteur espagnol"
|
||||||
|
|
||||||
|
#: data/com.jeffser.Alpaca.metainfo.xml.in:211
|
||||||
|
msgid "Using XDG properly to get config folder"
|
||||||
|
msgstr "Utilisation de XDG correctement pour avoir un dossier de configuration"
|
||||||
|
|
||||||
|
#: data/com.jeffser.Alpaca.metainfo.xml.in:212
|
||||||
|
msgid "Update for translations"
|
||||||
|
msgstr "Mise à jour concernant les traductions"
|
||||||
|
|
||||||
|
#: data/com.jeffser.Alpaca.metainfo.xml.in:222
|
||||||
|
msgid "Quick Fix"
|
||||||
|
msgstr "Petite correction"
|
||||||
|
|
||||||
|
#: data/com.jeffser.Alpaca.metainfo.xml.in:224
|
||||||
|
msgid "The last update had some mistakes in the description of the update"
|
||||||
|
msgstr ""
|
||||||
|
"La dernière mise à jour avait quelques erreurs dans la description de la "
|
||||||
|
"mise à jour"
|
||||||
|
|
||||||
|
#: data/com.jeffser.Alpaca.metainfo.xml.in:234
|
||||||
|
msgid "Another Daily Update"
|
||||||
|
msgstr "Une autre mise à jour quotidienne"
|
||||||
|
|
||||||
|
#: data/com.jeffser.Alpaca.metainfo.xml.in:236
|
||||||
|
msgid "Added full Spanish translation"
|
||||||
|
msgstr "Ajout de la traduction complète Espagnol"
|
||||||
|
|
||||||
|
#: data/com.jeffser.Alpaca.metainfo.xml.in:237
|
||||||
|
msgid "Added support for background pulling of multiple models"
|
||||||
|
msgstr ""
|
||||||
|
"Ajout du support pour le téléchargement de plusieurs modèles en arrière-plan"
|
||||||
|
|
||||||
|
#: data/com.jeffser.Alpaca.metainfo.xml.in:238
|
||||||
|
msgid "Added interrupt button"
|
||||||
|
msgstr "Ajout d'un bouton d'interruptions"
|
||||||
|
|
||||||
|
#: data/com.jeffser.Alpaca.metainfo.xml.in:239
|
||||||
|
msgid "Added basic shortcuts"
|
||||||
|
msgstr "Ajout de raccourcis claviers simples"
|
||||||
|
|
||||||
|
#: data/com.jeffser.Alpaca.metainfo.xml.in:240
|
||||||
|
msgid "Better translation support"
|
||||||
|
msgstr "Meilleur support des traductions"
|
||||||
|
|
||||||
|
#: data/com.jeffser.Alpaca.metainfo.xml.in:241
|
||||||
|
msgid ""
|
||||||
|
"User can now leave chat name empty when creating a new one, it will add a "
|
||||||
|
"placeholder name"
|
||||||
|
msgstr ""
|
||||||
|
"L'utilisateur peut maintenant quitter une discussion vide quand il en crée "
|
||||||
|
"un nouvelle, cela va ajouter un nom de remplacement"
|
||||||
|
|
||||||
|
#: data/com.jeffser.Alpaca.metainfo.xml.in:242
|
||||||
|
msgid "Better scalling for different window sizes"
|
||||||
|
msgstr "Meilleure mise à l'échelle pour différente taille de fenêtre"
|
||||||
|
|
||||||
|
#: data/com.jeffser.Alpaca.metainfo.xml.in:243
|
||||||
|
msgid "Fixed: Can't close app if first time setup fails"
|
||||||
|
msgstr ""
|
||||||
|
"Correction: Impossible de fermer l'application si la première configuration "
|
||||||
|
"échouait"
|
||||||
|
|
||||||
|
#: data/com.jeffser.Alpaca.metainfo.xml.in:253
|
||||||
|
msgid "Really Big Update"
|
||||||
|
msgstr "Mise à jour vraiment majeure"
|
||||||
|
|
||||||
|
#: data/com.jeffser.Alpaca.metainfo.xml.in:255
|
||||||
|
msgid "Added multiple chats support!"
|
||||||
|
msgstr "Ajout du support de plusieurs discussions !"
|
||||||
|
|
||||||
|
#: data/com.jeffser.Alpaca.metainfo.xml.in:256
|
||||||
|
msgid "Added Pango Markup support (bold, list, title, subtitle, monospace)"
|
||||||
|
msgstr ""
|
||||||
|
"Ajout du support de Pango Markup (gras, liste, titre, sous-titre, chasse-"
|
||||||
|
"fixe)"
|
||||||
|
|
||||||
|
#: data/com.jeffser.Alpaca.metainfo.xml.in:257
|
||||||
|
msgid "Added autoscroll if the user is at the bottom of the chat"
|
||||||
|
msgstr ""
|
||||||
|
"Ajout d'un défilement automatique si l'utilisateur est en haut d'une "
|
||||||
|
"conersation"
|
||||||
|
|
||||||
|
#: data/com.jeffser.Alpaca.metainfo.xml.in:258
|
||||||
|
msgid "Added support for multiple tags on a single model"
|
||||||
|
msgstr "Ajout du support de plusieurs tag sur un seul modèle"
|
||||||
|
|
||||||
|
#: data/com.jeffser.Alpaca.metainfo.xml.in:259
|
||||||
|
msgid "Added better model management dialog"
|
||||||
|
msgstr "Ajout d'une meilleur boite de dialogue pour la gestion des modèles"
|
||||||
|
|
||||||
|
#: data/com.jeffser.Alpaca.metainfo.xml.in:260
|
||||||
|
msgid "Added loading spinner when sending message"
|
||||||
|
msgstr "Ajout d'un loader lors de m'envoie d'un message"
|
||||||
|
|
||||||
|
#: data/com.jeffser.Alpaca.metainfo.xml.in:261
|
||||||
|
msgid "Added notifications if app is not active and a model pull finishes"
|
||||||
|
msgstr ""
|
||||||
|
"Ajout d'une notification si l'application n'est pas active et que le "
|
||||||
|
"téléchargement d'un modèle est terminé"
|
||||||
|
|
||||||
|
#: data/com.jeffser.Alpaca.metainfo.xml.in:262
|
||||||
|
msgid "Added new symbolic icon"
|
||||||
|
msgstr "Ajout de nouveau icônes symboliques"
|
||||||
|
|
||||||
|
#: data/com.jeffser.Alpaca.metainfo.xml.in:263
|
||||||
|
msgid "Added frame to message textview widget"
|
||||||
|
msgstr "Ajout d'un cadre pour le widget des messages"
|
||||||
|
|
||||||
|
#: data/com.jeffser.Alpaca.metainfo.xml.in:264
|
||||||
|
msgid "Fixed \"code blocks shouldn't be editable\""
|
||||||
|
msgstr "Correction 'les blocs de codes ne peuvent pas être édité'"
|
||||||
|
|
||||||
|
#: data/com.jeffser.Alpaca.metainfo.xml.in:276
|
||||||
|
msgid "Added code highlighting"
|
||||||
|
msgstr "Ajout de coloration syntaxique du code"
|
||||||
|
|
||||||
|
#: data/com.jeffser.Alpaca.metainfo.xml.in:277
|
||||||
|
msgid "Added image recognition (llava model)"
|
||||||
|
msgstr "Ajout de la reconnaissance d'image (modèle llava)"
|
||||||
|
|
||||||
|
#: data/com.jeffser.Alpaca.metainfo.xml.in:278
|
||||||
|
msgid "Added multiline prompt"
|
||||||
|
msgstr "Ajout des prompts multilignes"
|
||||||
|
|
||||||
|
#: data/com.jeffser.Alpaca.metainfo.xml.in:279
|
||||||
|
msgid "Fixed some small bugs"
|
||||||
|
msgstr "Correction de petits bogues"
|
||||||
|
|
||||||
|
#: data/com.jeffser.Alpaca.metainfo.xml.in:280
|
||||||
|
msgid "General optimization"
|
||||||
|
msgstr "Optimisation générale"
|
||||||
|
|
||||||
|
#: data/com.jeffser.Alpaca.metainfo.xml.in:290
|
||||||
|
msgid "Fixes and features"
|
||||||
|
msgstr "Corrections et fonctionnalités"
|
||||||
|
|
||||||
|
#: data/com.jeffser.Alpaca.metainfo.xml.in:292
|
||||||
|
msgid "Russian translation (thanks github/alexkdeveloper)"
|
||||||
|
msgstr "Traduction Russe (Merci github/alexkdeveloper)"
|
||||||
|
|
||||||
|
#: data/com.jeffser.Alpaca.metainfo.xml.in:293
|
||||||
|
msgid "Fixed: Cannot close app on first setup"
|
||||||
|
msgstr ""
|
||||||
|
"Correction: Impossible de fermer l'application lors de la première "
|
||||||
|
"installation"
|
||||||
|
|
||||||
|
#: data/com.jeffser.Alpaca.metainfo.xml.in:294
|
||||||
|
msgid "Fixed: Brand colors for Flathub"
|
||||||
|
msgstr "Correction: Couleurs de la marque Flathub"
|
||||||
|
|
||||||
|
#: data/com.jeffser.Alpaca.metainfo.xml.in:295
|
||||||
|
msgid "Fixed: App description"
|
||||||
|
msgstr "Correction: Description de l'application"
|
||||||
|
|
||||||
|
#: data/com.jeffser.Alpaca.metainfo.xml.in:296
|
||||||
|
msgid "Fixed: Only show 'save changes dialog' when you actually change the url"
|
||||||
|
msgstr ""
|
||||||
|
"Correction: N'afficher la boîte de dialogue « enregistrer les "
|
||||||
|
"modifications » que lorsque l'url est réellement modifiée"
|
||||||
|
|
||||||
|
#: data/com.jeffser.Alpaca.metainfo.xml.in:306
|
||||||
|
msgid "0.2.2 Bug fixes"
|
||||||
|
msgstr "0.2.2 Corrections de bug"
|
||||||
|
|
||||||
|
#: data/com.jeffser.Alpaca.metainfo.xml.in:308
|
||||||
|
msgid "Toast messages appearing behind dialogs"
|
||||||
|
msgstr ""
|
||||||
|
"Les messages de notifications apparaissaient derrière les boites de dialogue"
|
||||||
|
|
||||||
|
#: data/com.jeffser.Alpaca.metainfo.xml.in:309
|
||||||
|
msgid "Local model list not updating when changing servers"
|
||||||
|
msgstr ""
|
||||||
|
"La liste des modèles locaux n'était pas mise à jour lors d'un changement de "
|
||||||
|
"serveur"
|
||||||
|
|
||||||
|
#: data/com.jeffser.Alpaca.metainfo.xml.in:310
|
||||||
|
msgid "Closing the setup dialog closes the whole app"
|
||||||
|
msgstr ""
|
||||||
|
"La fermeture de la boite de dialogue des paramètres fermait toute "
|
||||||
|
"l'application"
|
||||||
|
|
||||||
|
#: data/com.jeffser.Alpaca.metainfo.xml.in:320
|
||||||
|
msgid "0.2.1 Data saving fix"
|
||||||
|
msgstr "0.2.1 Correction de la sauvegarde des données"
|
||||||
|
|
||||||
|
#: data/com.jeffser.Alpaca.metainfo.xml.in:321
|
||||||
|
msgid ""
|
||||||
|
"The app didn't save the config files and chat history to the right "
|
||||||
|
"directory, this is now fixed"
|
||||||
|
msgstr ""
|
||||||
|
"L'application ne sauvegardais pas le fichier de configuration et "
|
||||||
|
"l'historique de discussion dans le bon dossier, c'est maintenant corrigé"
|
||||||
|
|
||||||
|
#: data/com.jeffser.Alpaca.metainfo.xml.in:330
|
||||||
|
msgid "0.2.0"
|
||||||
|
msgstr "0.2.0"
|
||||||
|
|
||||||
|
#: data/com.jeffser.Alpaca.metainfo.xml.in:332
|
||||||
|
msgid "New Features"
|
||||||
|
msgstr "Nouvelles fonctionnalités"
|
||||||
|
|
||||||
|
#: data/com.jeffser.Alpaca.metainfo.xml.in:334
|
||||||
|
msgid "Restore chat after closing the app"
|
||||||
|
msgstr "Restaurer la discussion après avoir fermé l'application"
|
||||||
|
|
||||||
|
#: data/com.jeffser.Alpaca.metainfo.xml.in:335
|
||||||
|
msgid "A button to clear the chat"
|
||||||
|
msgstr "Un bouton pour effacer le chat"
|
||||||
|
|
||||||
|
#: data/com.jeffser.Alpaca.metainfo.xml.in:336
|
||||||
|
msgid "Fixed multiple bugs involving how messages are shown"
|
||||||
|
msgstr "Correction de plusieurs bogues concernant l'affichage des messages"
|
||||||
|
|
||||||
|
#: data/com.jeffser.Alpaca.metainfo.xml.in:337
|
||||||
|
msgid "Added welcome dialog"
|
||||||
|
msgstr "Ajout de la boite de dialogue de bienvenue"
|
||||||
|
|
||||||
|
#: data/com.jeffser.Alpaca.metainfo.xml.in:338
|
||||||
|
msgid "More stability"
|
||||||
|
msgstr "Plus de stabilité"
|
||||||
|
|
||||||
|
#: data/com.jeffser.Alpaca.metainfo.xml.in:348
|
||||||
|
msgid "0.1.2 Quick fixes"
|
||||||
|
msgstr "0.1.2 Petites corrections"
|
||||||
|
|
||||||
|
#: data/com.jeffser.Alpaca.metainfo.xml.in:349
|
||||||
|
msgid ""
|
||||||
|
"This release fixes some metadata needed to have a proper Flatpak application"
|
||||||
|
msgstr ""
|
||||||
|
"Cette version corrige quelques métadonnées pour avoir une application "
|
||||||
|
"Flatpak correct"
|
||||||
|
|
||||||
|
#: data/com.jeffser.Alpaca.metainfo.xml.in:355
|
||||||
|
msgid "0.1.1 Stable Release"
|
||||||
|
msgstr "0.1.1 Version stable"
|
||||||
|
|
||||||
|
#: data/com.jeffser.Alpaca.metainfo.xml.in:356
|
||||||
|
msgid "This is the first public version of Alpaca"
|
||||||
|
msgstr "Ceci est la première version publique d'Alpaca"
|
||||||
|
|
||||||
|
#: src/window.py:53 src/window.py:670 src/window.py:675 src/window.py:735
|
||||||
|
#: src/window.ui:681
|
||||||
|
msgid "New Chat"
|
||||||
|
msgstr "Nouvelle discussion"
|
||||||
|
|
||||||
|
#: src/window.py:98
|
||||||
|
msgid "An error occurred"
|
||||||
|
msgstr "Une erreur est survenue"
|
||||||
|
|
||||||
|
#: src/window.py:99
|
||||||
|
msgid "Failed to connect to server"
|
||||||
|
msgstr "Erreur de connexion au serveur"
|
||||||
|
|
||||||
|
#: src/window.py:100
|
||||||
|
msgid "Could not list local models"
|
||||||
|
msgstr "Impossible de lister les modèles locaux"
|
||||||
|
|
||||||
|
#: src/window.py:101
|
||||||
|
msgid "Could not delete model"
|
||||||
|
msgstr "Impossible de supprimer le modèle"
|
||||||
|
|
||||||
|
#: src/window.py:102
|
||||||
|
msgid "Could not pull model"
|
||||||
|
msgstr "Impossible de télécharger le modèle"
|
||||||
|
|
||||||
|
#: src/window.py:103
|
||||||
|
msgid "Cannot open image"
|
||||||
|
msgstr "Impossible d'ouvrir l'image"
|
||||||
|
|
||||||
|
#: src/window.py:104
|
||||||
|
msgid "Cannot delete chat because it's the only one left"
|
||||||
|
msgstr ""
|
||||||
|
"Vous ne pouvez pas supprimer la discussion car c'est la seule qui reste"
|
||||||
|
|
||||||
|
#: src/window.py:105
|
||||||
|
msgid "There was an error with the local Ollama instance, so it has been reset"
|
||||||
|
msgstr ""
|
||||||
|
"Une erreur est survenue avec l'instance local d'Ollama, elle a donc été "
|
||||||
|
"reinitialisée"
|
||||||
|
|
||||||
|
#: src/window.py:108
|
||||||
|
msgid "Please select a model before chatting"
|
||||||
|
msgstr "Merci de sélectionner un modèle avant de discuter"
|
||||||
|
|
||||||
|
#: src/window.py:109
|
||||||
|
msgid "Chat cannot be cleared while receiving a message"
|
||||||
|
msgstr ""
|
||||||
|
"La discussion ne peut pas être supprimé pendant la réception d'un message"
|
||||||
|
|
||||||
|
#: src/window.py:110
|
||||||
|
msgid "That tag is already being pulled"
|
||||||
|
msgstr "Ce tag est déjà en train d'être téléchargé"
|
||||||
|
|
||||||
|
#: src/window.py:111
|
||||||
|
msgid "That tag has been pulled already"
|
||||||
|
msgstr "Ce tag à déjà été télécharger"
|
||||||
|
|
||||||
|
#: src/window.py:112
|
||||||
|
msgid "Code copied to the clipboard"
|
||||||
|
msgstr "Code copié dans le presse-papier"
|
||||||
|
|
||||||
|
#: src/window.py:115
|
||||||
|
msgid "Model deleted successfully"
|
||||||
|
msgstr "Modèle supprimé avec succès"
|
||||||
|
|
||||||
|
#: src/window.py:116
|
||||||
|
msgid "Model pulled successfully"
|
||||||
|
msgstr "Modèle téléchargé avec succès"
|
||||||
|
|
||||||
|
#: src/window.py:117
|
||||||
|
msgid "Chat exported successfully"
|
||||||
|
msgstr "Discussion exportée avec succès"
|
||||||
|
|
||||||
|
#: src/window.py:118
|
||||||
|
msgid "Chat imported successfully"
|
||||||
|
msgstr "Discussion importée avec succès"
|
||||||
|
|
||||||
|
#: src/window.py:130
|
||||||
|
msgid "Upload image"
|
||||||
|
msgstr "Charger une image"
|
||||||
|
|
||||||
|
#: src/window.py:134 src/window.ui:179
|
||||||
|
msgid "Only available on selected models"
|
||||||
|
msgstr "Seulement disponible sur les modèles sélectionnés"
|
||||||
|
|
||||||
|
#: src/window.py:195
|
||||||
|
msgid "Close"
|
||||||
|
msgstr "Fermer"
|
||||||
|
|
||||||
|
#: src/window.py:196 src/window.ui:459
|
||||||
|
msgid "Next"
|
||||||
|
msgstr "Suivant"
|
||||||
|
|
||||||
|
#: src/window.py:243
|
||||||
|
msgid "Pulling in the background..."
|
||||||
|
msgstr "Téléchargement en arrière-plan..."
|
||||||
|
|
||||||
|
#: src/window.py:576
|
||||||
|
msgid "Task Complete"
|
||||||
|
msgstr "Tache terminée"
|
||||||
|
|
||||||
|
#: src/window.py:576
|
||||||
|
msgid "Model '{}' pulled successfully."
|
||||||
|
msgstr "Modèle '{}' téléchargé avec succès."
|
||||||
|
|
||||||
|
#: src/window.py:581
|
||||||
|
msgid "Pull Model Error"
|
||||||
|
msgstr "Erreur de téléchargement du modèle"
|
||||||
|
|
||||||
|
#: src/window.py:581
|
||||||
|
msgid "Failed to pull model '{}' due to network error."
|
||||||
|
msgstr ""
|
||||||
|
"Échec du téléchargement du modèle '{}' à cause d'une erreur de connexion."
|
||||||
|
|
||||||
|
#: src/window.ui:39
|
||||||
|
msgid "New chat"
|
||||||
|
msgstr "Nouvelle discussion"
|
||||||
|
|
||||||
|
#: src/window.ui:80
|
||||||
|
msgid "Toggle Sidebar"
|
||||||
|
msgstr "Basculer la barre latérale"
|
||||||
|
|
||||||
|
#: src/window.ui:103 src/window.ui:374
|
||||||
|
msgid "Manage models"
|
||||||
|
msgstr "Gestion des modèles"
|
||||||
|
|
||||||
|
#: src/window.ui:117
|
||||||
|
msgid "Menu"
|
||||||
|
msgstr "Menu"
|
||||||
|
|
||||||
|
#: src/window.ui:266 src/window.ui:612 src/window.ui:675
|
||||||
|
msgid "Preferences"
|
||||||
|
msgstr "Paramètres"
|
||||||
|
|
||||||
|
#: src/window.ui:269 src/window.ui:659
|
||||||
|
msgid "General"
|
||||||
|
msgstr "Général"
|
||||||
|
|
||||||
|
#: src/window.ui:273
|
||||||
|
msgid "Remote Connection"
|
||||||
|
msgstr "Connexion à distance"
|
||||||
|
|
||||||
|
#: src/window.ui:274
|
||||||
|
msgid "Manage a remote connection to Ollama"
|
||||||
|
msgstr "Gérer une connexion à distance d'Ollama"
|
||||||
|
|
||||||
|
#: src/window.ui:277
|
||||||
|
msgid "Use remote connection"
|
||||||
|
msgstr "Utiliser une connexion à distance"
|
||||||
|
|
||||||
|
#: src/window.ui:283
|
||||||
|
msgid "URL of remote instance"
|
||||||
|
msgstr "URL de l'instance distante"
|
||||||
|
|
||||||
|
#: src/window.ui:291
|
||||||
|
msgid "Behavior"
|
||||||
|
msgstr "Comportement"
|
||||||
|
|
||||||
|
#: src/window.ui:292
|
||||||
|
msgid "Manage Alpaca's Behavior"
|
||||||
|
msgstr "Gérer le comportement d'Alpaca"
|
||||||
|
|
||||||
|
#: src/window.ui:295
|
||||||
|
msgid "Run in background"
|
||||||
|
msgstr "Exécution en arrière-plan"
|
||||||
|
|
||||||
|
#: src/window.ui:304
|
||||||
|
msgid "Advanced Model Settings"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: src/window.ui:308
|
||||||
|
msgid "Model Tweaks"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: src/window.ui:309
|
||||||
|
msgid "Manage the behavior of the AI models"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: src/window.ui:314
|
||||||
|
#, fuzzy
|
||||||
|
msgid "Temperature"
|
||||||
|
msgstr "Fonctionnalités"
|
||||||
|
|
||||||
|
#: src/window.ui:315
|
||||||
|
msgid ""
|
||||||
|
"The temperature of the model. Increasing the temperature will make the model "
|
||||||
|
"answer more creatively. (Default: 0.8)"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: src/window.ui:330
|
||||||
|
msgid "Seed"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: src/window.ui:331
|
||||||
|
msgid ""
|
||||||
|
"Sets the random number seed to use for generation. Setting this to a "
|
||||||
|
"specific number will make the model generate the same text for the same "
|
||||||
|
"prompt. (Default: 0 (random))"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: src/window.ui:344
|
||||||
|
msgid "keep_alive"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: src/window.ui:345
|
||||||
|
msgid "Keep Alive Time"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: src/window.ui:443
|
||||||
|
msgid "Previous"
|
||||||
|
msgstr "Précédent"
|
||||||
|
|
||||||
|
#: src/window.ui:486
|
||||||
|
msgid "Welcome to Alpaca"
|
||||||
|
msgstr "Bienvenue sur Alpaca"
|
||||||
|
|
||||||
|
#: src/window.ui:487
|
||||||
|
msgid "Powered by Ollama"
|
||||||
|
msgstr "Fonctionne grâce à Ollama"
|
||||||
|
|
||||||
|
#: src/window.ui:490
|
||||||
|
msgid "Ollama Website"
|
||||||
|
msgstr "Site web d'Ollama"
|
||||||
|
|
||||||
|
#: src/window.ui:507
|
||||||
|
msgid ""
|
||||||
|
"Alpaca and its developers are not liable for any damages to devices or "
|
||||||
|
"software resulting from the execution of code generated by an AI model. "
|
||||||
|
"Please exercise caution and review the code carefully before running it."
|
||||||
|
msgstr ""
|
||||||
|
"Alpaca et ses développeurs ne sont pas responsables des dommages causés à "
|
||||||
|
"votre appareil ou vos logiciels lors de l'exécution de code généré par les "
|
||||||
|
"modèles d'IA. Merci de faire attention et de relire attentivement le code "
|
||||||
|
"avant de l'exécuter."
|
||||||
|
|
||||||
|
#: src/window.ui:518
|
||||||
|
msgid "Featured Models"
|
||||||
|
msgstr "Modèles recommandés"
|
||||||
|
|
||||||
|
#: src/window.ui:519
|
||||||
|
msgid ""
|
||||||
|
"Alpaca works locally on your device, to start chatting you'll need an AI "
|
||||||
|
"model, you can either pull models from this list or the 'Manage Models' menu "
|
||||||
|
"later."
|
||||||
|
msgstr ""
|
||||||
|
"Alpaca fonctionne localement sur votre ordinateur, pour commencer à discuter "
|
||||||
|
"vous aurez besoin d'un modèle d'IA, vous pouvez télécharger un modèle soit "
|
||||||
|
"depuis cette liste soit depuis le menu 'Gérer les modèles' plus tard."
|
||||||
|
|
||||||
|
#: src/window.ui:529
|
||||||
|
msgid "Built by Meta"
|
||||||
|
msgstr "Développé par Meta"
|
||||||
|
|
||||||
|
#: src/window.ui:546
|
||||||
|
msgid "Built by Google DeepMind"
|
||||||
|
msgstr "Développé par Google DeepMind"
|
||||||
|
|
||||||
|
#: src/window.ui:563
|
||||||
|
msgid "Built by Microsoft"
|
||||||
|
msgstr "Développé par Microsoft"
|
||||||
|
|
||||||
|
#: src/window.ui:580
|
||||||
|
msgid "Multimodal AI with image recognition"
|
||||||
|
msgstr "IA multimodale avec reconnaissance d'image"
|
||||||
|
|
||||||
|
#: src/window.ui:608
|
||||||
|
msgid "Clear Chat"
|
||||||
|
msgstr "Supprimer la discussion"
|
||||||
|
|
||||||
|
#: src/window.ui:616
|
||||||
|
msgid "Keyboard Shortcuts"
|
||||||
|
msgstr "Raccourcis claviers"
|
||||||
|
|
||||||
|
#: src/window.ui:620
|
||||||
|
msgid "About Alpaca"
|
||||||
|
msgstr "À propos d'Alpaca"
|
||||||
|
|
||||||
|
#: src/window.ui:628
|
||||||
|
#, fuzzy
|
||||||
|
msgid "Export current chat"
|
||||||
|
msgstr "Exporter la discussion"
|
||||||
|
|
||||||
|
#: src/window.ui:632
|
||||||
|
msgid "Import chat"
|
||||||
|
msgstr "Importer une discussion"
|
||||||
|
|
||||||
|
#: src/window.ui:663
|
||||||
|
msgid "Close application"
|
||||||
|
msgstr "Fermer l'application"
|
||||||
|
|
||||||
|
#: src/window.ui:669
|
||||||
|
msgid "Clear chat"
|
||||||
|
msgstr "Supprimer la discussion"
|
||||||
|
|
||||||
|
#: src/window.ui:687
|
||||||
|
msgid "Show shortcuts window"
|
||||||
|
msgstr "Voir les raccourcis clavier"
|
||||||
|
|
||||||
|
#: src/window.ui:694
|
||||||
|
msgid "Editor"
|
||||||
|
msgstr "Éditeur"
|
||||||
|
|
||||||
|
#: src/window.ui:698
|
||||||
|
msgid "Copy"
|
||||||
|
msgstr "Copier"
|
||||||
|
|
||||||
|
#: src/window.ui:704
|
||||||
|
msgid "Paste"
|
||||||
|
msgstr "Coller"
|
||||||
|
|
||||||
|
#: src/window.ui:710
|
||||||
|
msgid "Insert new line"
|
||||||
|
msgstr "Ajouter un ligne"
|
||||||
|
|
||||||
|
#: src/window.ui:716
|
||||||
|
msgid "Send Message"
|
||||||
|
msgstr "Envoyer le message"
|
||||||
|
|
||||||
|
#~ msgid "Remove"
|
||||||
|
#~ msgstr "Supprimer"
|
||||||
|
|
||||||
|
#~ msgid "Send"
|
||||||
|
#~ msgstr "Envoyer"
|
||||||
|
|
||||||
|
#~ msgid "Image"
|
||||||
|
#~ msgstr "Image"
|
||||||
509
po/pt_BR.po
509
po/pt_BR.po
File diff suppressed because it is too large
Load Diff
1074
po/pt_BR.po~
Normal file
1074
po/pt_BR.po~
Normal file
File diff suppressed because it is too large
Load Diff
@@ -3,6 +3,10 @@
|
|||||||
<gresource prefix="/com/jeffser/Alpaca">
|
<gresource prefix="/com/jeffser/Alpaca">
|
||||||
<file>style.css</file>
|
<file>style.css</file>
|
||||||
<file>style-dark.css</file>
|
<file>style-dark.css</file>
|
||||||
|
<file alias="icons/scalable/status/library-symbolic.svg">icons/library-symbolic.svg</file>
|
||||||
|
<file alias="icons/scalable/status/paper-plane-symbolic.svg">icons/paper-plane-symbolic.svg</file>
|
||||||
|
<file alias="icons/scalable/status/globe-symbolic.svg">icons/globe-symbolic.svg</file>
|
||||||
|
<file alias="icons/scalable/status/controls-big-symbolic.svg">icons/controls-big-symbolic.svg</file>
|
||||||
<file preprocess="xml-stripblanks">window.ui</file>
|
<file preprocess="xml-stripblanks">window.ui</file>
|
||||||
<file preprocess="xml-stripblanks">gtk/help-overlay.ui</file>
|
<file preprocess="xml-stripblanks">gtk/help-overlay.ui</file>
|
||||||
</gresource>
|
</gresource>
|
||||||
|
|||||||
111
src/alpaca_search_provider.in
Normal file
111
src/alpaca_search_provider.in
Normal file
@@ -0,0 +1,111 @@
|
|||||||
|
#!@PYTHON@
|
||||||
|
|
||||||
|
import sys
|
||||||
|
from gi.repository import Gio, GLib
|
||||||
|
|
||||||
|
DBUS_NAME = "com.jeffser.Alpaca.SearchProvider"
|
||||||
|
DBUS_OBJECT_PATH = "/com/jeffser/Alpaca/SearchProvider"
|
||||||
|
DBUS_INTERFACE = "org.gnome.Shell.SearchProvider2"
|
||||||
|
|
||||||
|
class SearchProvider:
|
||||||
|
def __init__(self):
|
||||||
|
print("ALPACA __init__")
|
||||||
|
self.connection = Gio.bus_get_sync(Gio.BusType.SESSION, None)
|
||||||
|
if not self.connection:
|
||||||
|
print("ALPACA Failed to get D-Bus connection")
|
||||||
|
return
|
||||||
|
|
||||||
|
print("ALPACA D-Bus connection obtained")
|
||||||
|
|
||||||
|
interface_info = self.get_interface_info()
|
||||||
|
self.registration_id = self.connection.register_object(DBUS_OBJECT_PATH, interface_info, self.handle_method_call, None)
|
||||||
|
|
||||||
|
if self.registration_id > 0:
|
||||||
|
print(f"ALPACA Object registered with ID: {self.registration_id}")
|
||||||
|
else:
|
||||||
|
print("ALPACA Failed to register object")
|
||||||
|
|
||||||
|
def get_interface_info(self):
|
||||||
|
print("ALPACA get_interface_info")
|
||||||
|
xml = """
|
||||||
|
<node>
|
||||||
|
<interface name='org.gnome.Shell.SearchProvider2'>
|
||||||
|
<method name='GetInitialResultSet'>
|
||||||
|
<arg type='as' name='terms' direction='in'/>
|
||||||
|
<arg type='as' name='results' direction='out'/>
|
||||||
|
</method>
|
||||||
|
<method name='GetSubsearchResultSet'>
|
||||||
|
<arg type='as' name='previous_results' direction='in'/>
|
||||||
|
<arg type='as' name='terms' direction='in'/>
|
||||||
|
<arg type='as' name='results' direction='out'/>
|
||||||
|
</method>
|
||||||
|
<method name='GetResultMetas'>
|
||||||
|
<arg type='as' name='identifiers' direction='in'/>
|
||||||
|
<arg type='a{sv}' name='metas' direction='out'/>
|
||||||
|
</method>
|
||||||
|
<method name='ActivateResult'>
|
||||||
|
<arg type='s' name='identifier' direction='in'/>
|
||||||
|
<arg type='as' name='terms' direction='in'/>
|
||||||
|
<arg type='i' name='timestamp' direction='in'/>
|
||||||
|
</method>
|
||||||
|
</interface>
|
||||||
|
</node>
|
||||||
|
"""
|
||||||
|
return Gio.DBusNodeInfo.new_for_xml(xml).interfaces[0]
|
||||||
|
|
||||||
|
def handle_method_call(self, connection, sender, object_path, interface_name, method_name, parameters, invocation):
|
||||||
|
print(f"ALPACA handle_method_call: {method_name}")
|
||||||
|
if method_name == "GetInitialResultSet":
|
||||||
|
self.handle_get_initial_result_set(invocation, parameters)
|
||||||
|
elif method_name == "GetSubsearchResultSet":
|
||||||
|
self.handle_get_subsearch_result_set(invocation, parameters)
|
||||||
|
elif method_name == "GetResultMetas":
|
||||||
|
self.handle_get_result_metas(invocation, parameters)
|
||||||
|
elif method_name == "ActivateResult":
|
||||||
|
self.handle_activate_result(invocation, parameters)
|
||||||
|
|
||||||
|
def handle_get_initial_result_set(self, invocation, parameters):
|
||||||
|
print("ALPACA handle_get_initial_result_set")
|
||||||
|
terms = parameters.unpack()[0]
|
||||||
|
print(f"Initial search terms: {terms}")
|
||||||
|
results = ["result1", "result2"]
|
||||||
|
if "Alpaca" in terms:
|
||||||
|
results.append("alpaca_placeholder_result")
|
||||||
|
print(f"Returning results: {results}")
|
||||||
|
invocation.return_value(GLib.Variant("(as)", [results]))
|
||||||
|
|
||||||
|
def handle_get_subsearch_result_set(self, invocation, parameters):
|
||||||
|
print("ALPACA handle_get_subsearch_result_set")
|
||||||
|
previous_results, terms = parameters.unpack()
|
||||||
|
print(f"Subsearch terms: {terms}, previous results: {previous_results}")
|
||||||
|
results = ["result3", "result4"]
|
||||||
|
if "Alpaca" in terms:
|
||||||
|
results.append("sub_alpaca_placeholder_result")
|
||||||
|
print(f"Returning subsearch results: {results}")
|
||||||
|
invocation.return_value(GLib.Variant("(as)", [results]))
|
||||||
|
|
||||||
|
def handle_get_result_metas(self, invocation, parameters):
|
||||||
|
print("ALPACA handle_get_result_metas")
|
||||||
|
identifiers = parameters.unpack()[0]
|
||||||
|
print(f"Result metas for identifiers: {identifiers}")
|
||||||
|
metas = []
|
||||||
|
for identifier in identifiers:
|
||||||
|
meta = {"name": GLib.Variant("s", "Placeholder result for " + identifier)}
|
||||||
|
metas.append(GLib.Variant("a{sv}", meta))
|
||||||
|
print(f"Returning metas: {metas}")
|
||||||
|
invocation.return_value(GLib.Variant("(a{sv})", [metas]))
|
||||||
|
|
||||||
|
def handle_activate_result(self, invocation, parameters):
|
||||||
|
print("ALPACA handle_activate_result")
|
||||||
|
identifier, terms, timestamp = parameters.unpack()
|
||||||
|
print(f"Activated result: {identifier}, terms: {terms}, timestamp: {timestamp}")
|
||||||
|
invocation.return_value(None)
|
||||||
|
|
||||||
|
if __name__ == "__main__":
|
||||||
|
provider = SearchProvider()
|
||||||
|
if provider.registration_id > 0:
|
||||||
|
loop = GLib.MainLoop()
|
||||||
|
print("ALPACA Running main loop")
|
||||||
|
loop.run()
|
||||||
|
else:
|
||||||
|
print("ALPACA Failed to start main loop due to object registration failure")
|
||||||
@@ -57,7 +57,8 @@ def rename_chat_response(self, dialog, task, old_chat_name, entry, label_element
|
|||||||
if new_chat_name and (task is None or dialog.choose_finish(task) == "rename"):
|
if new_chat_name and (task is None or dialog.choose_finish(task) == "rename"):
|
||||||
self.rename_chat(old_chat_name, new_chat_name, label_element)
|
self.rename_chat(old_chat_name, new_chat_name, label_element)
|
||||||
|
|
||||||
def rename_chat(self, chat_name:str, label_element):
|
def rename_chat(self, label_element):
|
||||||
|
chat_name = label_element.get_parent().get_name()
|
||||||
entry = Gtk.Entry()
|
entry = Gtk.Entry()
|
||||||
dialog = Adw.AlertDialog(
|
dialog = Adw.AlertDialog(
|
||||||
heading=_("Rename Chat"),
|
heading=_("Rename Chat"),
|
||||||
|
|||||||
2
src/icons/controls-big-symbolic.svg
Normal file
2
src/icons/controls-big-symbolic.svg
Normal file
@@ -0,0 +1,2 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<svg xmlns="http://www.w3.org/2000/svg" height="16px" viewBox="0 0 16 16" width="16px"><g fill="#222222"><path d="m 4.550781 1 c -1.9375 0 -3.5 1.5625 -3.5 3.5 s 1.5625 3.5 3.5 3.5 h 7 c 1.941407 0 3.5 -1.5625 3.5 -3.5 s -1.558593 -3.5 -3.5 -3.5 z m 7 1 c 1.386719 0 2.5 1.113281 2.5 2.5 c 0 1.382812 -1.113281 2.5 -2.5 2.5 c -1.382812 0 -2.5 -1.117188 -2.5 -2.5 c 0 -1.386719 1.117188 -2.5 2.5 -2.5 z m 0 0"/><path d="m 4.550781 9 c -1.9375 0 -3.5 1.5625 -3.5 3.5 s 1.5625 3.5 3.5 3.5 h 7 c 1.941407 0 3.5 -1.5625 3.5 -3.5 s -1.558593 -3.5 -3.5 -3.5 z m 0 1 c 1.386719 0 2.5 1.113281 2.5 2.5 c 0 1.382812 -1.113281 2.5 -2.5 2.5 c -1.382812 0 -2.5 -1.117188 -2.5 -2.5 c 0 -1.386719 1.117188 -2.5 2.5 -2.5 z m 0 0" fill-opacity="0.35"/></g></svg>
|
||||||
|
After Width: | Height: | Size: 785 B |
2
src/icons/globe-symbolic.svg
Normal file
2
src/icons/globe-symbolic.svg
Normal file
@@ -0,0 +1,2 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<svg xmlns="http://www.w3.org/2000/svg" height="16px" viewBox="0 0 16 16" width="16px"><path d="m 7.5 0 c -4.128906 0 -7.5 3.371094 -7.5 7.5 s 3.371094 7.5 7.5 7.5 s 7.5 -3.371094 7.5 -7.5 s -3.371094 -7.5 -7.5 -7.5 z m 0 2 c 0.257812 0 0.503906 0.023438 0.75 0.054688 c 0.191406 0.261718 0.382812 0.59375 0.550781 1.027343 c 0.105469 0.277344 0.203125 0.585938 0.289063 0.917969 h -3.179688 c 0.085938 -0.332031 0.183594 -0.640625 0.289063 -0.917969 c 0.167969 -0.433593 0.359375 -0.765625 0.550781 -1.027343 c 0.246094 -0.03125 0.492188 -0.054688 0.75 -0.054688 z m -2.085938 0.40625 c -0.050781 0.109375 -0.105468 0.203125 -0.148437 0.316406 c -0.148437 0.386719 -0.269531 0.820313 -0.378906 1.277344 h -1.617188 c 0.570313 -0.691406 1.296875 -1.246094 2.144531 -1.59375 z m 4.171876 0 c 0.847656 0.347656 1.574218 0.902344 2.144531 1.59375 h -1.617188 c -0.109375 -0.457031 -0.230469 -0.890625 -0.378906 -1.277344 c -0.042969 -0.113281 -0.097656 -0.207031 -0.148437 -0.316406 z m -6.980469 2.59375 h 2.082031 c -0.097656 0.628906 -0.148438 1.300781 -0.167969 2 h -2.480469 c 0.0625 -0.714844 0.253907 -1.390625 0.566407 -2 z m 3.09375 0 h 3.601562 c 0.101563 0.617188 0.15625 1.292969 0.179688 2 h -3.960938 c 0.023438 -0.707031 0.078125 -1.382812 0.179688 -2 z m 4.613281 0 h 2.082031 c 0.3125 0.609375 0.503907 1.285156 0.566407 2 h -2.480469 c -0.019531 -0.699219 -0.070313 -1.371094 -0.167969 -2 z m -8.273438 3 h 2.480469 c 0.019531 0.699219 0.070313 1.375 0.167969 2 h -2.082031 c -0.3125 -0.609375 -0.503907 -1.285156 -0.566407 -2 z m 3.480469 0 h 3.960938 c -0.023438 0.707031 -0.078125 1.382812 -0.179688 2 h -3.601562 c -0.101563 -0.617188 -0.15625 -1.292969 -0.179688 -2 z m 4.960938 0 h 2.480469 c -0.0625 0.714844 -0.253907 1.390625 -0.566407 2 h -2.082031 c 0.097656 -0.625 0.148438 -1.300781 0.167969 -2 z m -7.210938 3 h 1.617188 c 0.109375 0.457031 0.230469 0.890625 0.378906 1.273438 c 0.042969 0.117187 0.097656 0.210937 0.148437 0.320312 c -0.847656 -0.347656 -1.574218 -0.902344 -2.144531 -1.59375 z m 2.640625 0 h 3.179688 c -0.085938 0.332031 -0.183594 0.640625 -0.289063 0.917969 c -0.167969 0.433593 -0.359375 0.765625 -0.550781 1.027343 c -0.246094 0.03125 -0.496094 0.054688 -0.75 0.054688 s -0.503906 -0.023438 -0.75 -0.054688 c -0.191406 -0.261718 -0.382812 -0.59375 -0.550781 -1.027343 c -0.105469 -0.277344 -0.203125 -0.585938 -0.289063 -0.917969 z m 4.203125 0 h 1.617188 c -0.570313 0.691406 -1.296875 1.246094 -2.144531 1.59375 c 0.050781 -0.109375 0.105468 -0.203125 0.148437 -0.320312 c 0.148437 -0.382813 0.269531 -0.816407 0.378906 -1.273438 z m 0 0" fill="#222222"/></svg>
|
||||||
|
After Width: | Height: | Size: 2.6 KiB |
2
src/icons/library-symbolic.svg
Normal file
2
src/icons/library-symbolic.svg
Normal file
@@ -0,0 +1,2 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<svg xmlns="http://www.w3.org/2000/svg" height="16px" viewBox="0 0 16 16" width="16px"><g fill="#222222"><path d="m 1.5 2 h 2 c 0.277344 0 0.5 0.222656 0.5 0.5 v 12 c 0 0.277344 -0.222656 0.5 -0.5 0.5 h -2 c -0.277344 0 -0.5 -0.222656 -0.5 -0.5 v -12 c 0 -0.277344 0.222656 -0.5 0.5 -0.5 z m 0 0"/><path d="m 5.5 4 h 1 c 0.277344 0 0.5 0.222656 0.5 0.5 v 10 c 0 0.277344 -0.222656 0.5 -0.5 0.5 h -1 c -0.277344 0 -0.5 -0.222656 -0.5 -0.5 v -10 c 0 -0.277344 0.222656 -0.5 0.5 -0.5 z m 0 0"/><path d="m 8.5 3 h 1 c 0.277344 0 0.5 0.222656 0.5 0.5 v 11 c 0 0.277344 -0.222656 0.5 -0.5 0.5 h -1 c -0.277344 0 -0.5 -0.222656 -0.5 -0.5 v -11 c 0 -0.277344 0.222656 -0.5 0.5 -0.5 z m 0 0"/><path d="m 10.707031 1.460938 l 0.964844 -0.261719 c 0.265625 -0.070313 0.539063 0.089843 0.613281 0.355469 l 3.363282 12.558593 c 0.070312 0.265625 -0.085938 0.539063 -0.351563 0.609375 l -0.96875 0.261719 c -0.265625 0.070313 -0.539063 -0.089844 -0.613281 -0.355469 l -3.363282 -12.554687 c -0.070312 -0.269531 0.085938 -0.542969 0.355469 -0.613281 z m 0 0"/></g></svg>
|
||||||
|
After Width: | Height: | Size: 1.1 KiB |
2
src/icons/paper-plane-symbolic.svg
Normal file
2
src/icons/paper-plane-symbolic.svg
Normal file
@@ -0,0 +1,2 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<svg xmlns="http://www.w3.org/2000/svg" height="16px" viewBox="0 0 16 16" width="16px"><path d="m 15 8 l -14 -7 v 6 l 8 1 l -8 1 v 6 z m 0 0" fill="#222222"/></svg>
|
||||||
|
After Width: | Height: | Size: 204 B |
@@ -47,7 +47,7 @@ class AlpacaApplication(Adw.Application):
|
|||||||
application_name='Alpaca',
|
application_name='Alpaca',
|
||||||
application_icon='com.jeffser.Alpaca',
|
application_icon='com.jeffser.Alpaca',
|
||||||
developer_name='Jeffry Samuel Eduarte Rojas',
|
developer_name='Jeffry Samuel Eduarte Rojas',
|
||||||
version='0.8.8',
|
version='0.9.2',
|
||||||
developers=['Jeffser https://jeffser.com'],
|
developers=['Jeffser https://jeffser.com'],
|
||||||
designers=['Jeffser https://jeffser.com'],
|
designers=['Jeffser https://jeffser.com'],
|
||||||
translator_credits='Alex K (Russian) https://github.com/alexkdeveloper\nJeffser (Spanish) https://jeffser.com\nDaimar Stein (Brazilian Portuguese) https://github.com/not-a-dev-stein\nLouis Chauvet-Villaret (French) https://github.com/loulou64490',
|
translator_credits='Alex K (Russian) https://github.com/alexkdeveloper\nJeffser (Spanish) https://jeffser.com\nDaimar Stein (Brazilian Portuguese) https://github.com/not-a-dev-stein\nLouis Chauvet-Villaret (French) https://github.com/loulou64490',
|
||||||
|
|||||||
@@ -26,6 +26,15 @@ configure_file(
|
|||||||
install_mode: 'r-xr-xr-x'
|
install_mode: 'r-xr-xr-x'
|
||||||
)
|
)
|
||||||
|
|
||||||
|
configure_file(
|
||||||
|
input: 'alpaca_search_provider.in',
|
||||||
|
output: 'alpaca_search_provider',
|
||||||
|
configuration: conf,
|
||||||
|
install: true,
|
||||||
|
install_dir: get_option('bindir'),
|
||||||
|
install_mode: 'r-xr-xr-x'
|
||||||
|
)
|
||||||
|
|
||||||
alpaca_sources = [
|
alpaca_sources = [
|
||||||
'__init__.py',
|
'__init__.py',
|
||||||
'main.py',
|
'main.py',
|
||||||
|
|||||||
@@ -2,6 +2,3 @@
|
|||||||
background-color: #343434;
|
background-color: #343434;
|
||||||
}
|
}
|
||||||
|
|
||||||
.message-text-view {
|
|
||||||
background-color: #343434;
|
|
||||||
}
|
|
||||||
|
|||||||
@@ -1,11 +1,7 @@
|
|||||||
.message-input {
|
.message-input {
|
||||||
background-color: #EBEBEB;
|
background-color: #EBEBEB;
|
||||||
border-radius: 10px;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
.message-text-view {
|
|
||||||
background-color: #EBEBEB;
|
|
||||||
}
|
|
||||||
.chat_row box.header {
|
.chat_row box.header {
|
||||||
font-size: 14px;
|
font-size: 14px;
|
||||||
}
|
}
|
||||||
|
|||||||
238
src/window.py
238
src/window.py
@@ -47,13 +47,16 @@ class AlpacaWindow(Adw.ApplicationWindow):
|
|||||||
run_on_background = False
|
run_on_background = False
|
||||||
remote_url = ""
|
remote_url = ""
|
||||||
run_remote = False
|
run_remote = False
|
||||||
|
model_tweaks = {"temperature": 0.7, "seed": 0, "keep_alive": 5}
|
||||||
local_models = []
|
local_models = []
|
||||||
pulling_models = {}
|
pulling_models = {}
|
||||||
current_chat_elements = [] #Used for deleting
|
|
||||||
chats = {"chats": {_("New Chat"): {"messages": []}}, "selected_chat": "New Chat"}
|
chats = {"chats": {_("New Chat"): {"messages": []}}, "selected_chat": "New Chat"}
|
||||||
attached_image = {"path": None, "base64": None}
|
attached_image = {"path": None, "base64": None}
|
||||||
|
|
||||||
#Elements
|
#Elements
|
||||||
|
temperature_spin = Gtk.Template.Child()
|
||||||
|
seed_spin = Gtk.Template.Child()
|
||||||
|
keep_alive_spin = Gtk.Template.Child()
|
||||||
preferences_dialog = Gtk.Template.Child()
|
preferences_dialog = Gtk.Template.Child()
|
||||||
shortcut_window : Gtk.ShortcutsWindow = Gtk.Template.Child()
|
shortcut_window : Gtk.ShortcutsWindow = Gtk.Template.Child()
|
||||||
bot_message : Gtk.TextBuffer = None
|
bot_message : Gtk.TextBuffer = None
|
||||||
@@ -69,6 +72,7 @@ class AlpacaWindow(Adw.ApplicationWindow):
|
|||||||
chat_window = Gtk.Template.Child()
|
chat_window = Gtk.Template.Child()
|
||||||
message_text_view = Gtk.Template.Child()
|
message_text_view = Gtk.Template.Child()
|
||||||
send_button = Gtk.Template.Child()
|
send_button = Gtk.Template.Child()
|
||||||
|
stop_button = Gtk.Template.Child()
|
||||||
image_button = Gtk.Template.Child()
|
image_button = Gtk.Template.Child()
|
||||||
file_filter_image = Gtk.Template.Child()
|
file_filter_image = Gtk.Template.Child()
|
||||||
file_filter_json = Gtk.Template.Child()
|
file_filter_json = Gtk.Template.Child()
|
||||||
@@ -82,8 +86,6 @@ class AlpacaWindow(Adw.ApplicationWindow):
|
|||||||
|
|
||||||
chat_list_box = Gtk.Template.Child()
|
chat_list_box = Gtk.Template.Child()
|
||||||
add_chat_button = Gtk.Template.Child()
|
add_chat_button = Gtk.Template.Child()
|
||||||
export_chat_button = Gtk.Template.Child()
|
|
||||||
import_chat_button = Gtk.Template.Child()
|
|
||||||
|
|
||||||
loading_spinner = None
|
loading_spinner = None
|
||||||
|
|
||||||
@@ -107,7 +109,8 @@ class AlpacaWindow(Adw.ApplicationWindow):
|
|||||||
_("Chat cannot be cleared while receiving a message"),
|
_("Chat cannot be cleared while receiving a message"),
|
||||||
_("That tag is already being pulled"),
|
_("That tag is already being pulled"),
|
||||||
_("That tag has been pulled already"),
|
_("That tag has been pulled already"),
|
||||||
_("Code copied to the clipboard")
|
_("Code copied to the clipboard"),
|
||||||
|
_("Message copied to the clipboard")
|
||||||
],
|
],
|
||||||
"good": [
|
"good": [
|
||||||
_("Model deleted successfully"),
|
_("Model deleted successfully"),
|
||||||
@@ -130,59 +133,56 @@ class AlpacaWindow(Adw.ApplicationWindow):
|
|||||||
else:
|
else:
|
||||||
self.image_button.set_sensitive(False)
|
self.image_button.set_sensitive(False)
|
||||||
self.image_button.set_tooltip_text(_("Only available on selected models"))
|
self.image_button.set_tooltip_text(_("Only available on selected models"))
|
||||||
self.image_button.set_css_classes([])
|
self.image_button.set_css_classes(["circular"])
|
||||||
self.image_button.get_child().set_icon_name("image-x-generic-symbolic")
|
|
||||||
self.attached_image = {"path": None, "base64": None}
|
self.attached_image = {"path": None, "base64": None}
|
||||||
return False
|
return False
|
||||||
|
|
||||||
|
@Gtk.Template.Callback()
|
||||||
|
def stop_message(self, button=None):
|
||||||
|
if self.loading_spinner: self.chat_container.remove(self.loading_spinner)
|
||||||
|
if self.verify_if_image_can_be_used(): self.image_button.set_sensitive(True)
|
||||||
|
self.image_button.set_css_classes(["circular"])
|
||||||
|
self.attached_image = {"path": None, "base64": None}
|
||||||
|
self.toggle_ui_sensitive(True)
|
||||||
|
self.switch_send_stop_button()
|
||||||
|
self.bot_message = None
|
||||||
|
self.bot_message_box = None
|
||||||
|
self.bot_message_view = None
|
||||||
|
|
||||||
@Gtk.Template.Callback()
|
@Gtk.Template.Callback()
|
||||||
def send_message(self, button=None):
|
def send_message(self, button=None):
|
||||||
if button and self.bot_message: #STOP BUTTON
|
if not self.message_text_view.get_buffer().get_text(self.message_text_view.get_buffer().get_start_iter(), self.message_text_view.get_buffer().get_end_iter(), False): return
|
||||||
if self.loading_spinner: self.chat_container.remove(self.loading_spinner)
|
current_model = self.model_drop_down.get_selected_item()
|
||||||
if self.verify_if_image_can_be_used(): self.image_button.set_sensitive(True)
|
if current_model is None:
|
||||||
self.image_button.set_css_classes([])
|
self.show_toast("info", 0, self.main_overlay)
|
||||||
self.image_button.get_child().set_icon_name("image-x-generic-symbolic")
|
return
|
||||||
self.attached_image = {"path": None, "base64": None}
|
formated_datetime = datetime.now().strftime("%Y/%m/%d %H:%M")
|
||||||
self.toggle_ui_sensitive(True)
|
self.chats["chats"][self.chats["selected_chat"]]["messages"].append({
|
||||||
self.send_button.set_css_classes(["suggested-action"])
|
"role": "user",
|
||||||
self.send_button.get_child().set_label("Send")
|
"model": "User",
|
||||||
self.send_button.get_child().set_icon_name("send-to-symbolic")
|
"date": formated_datetime,
|
||||||
self.bot_message = None
|
"content": self.message_text_view.get_buffer().get_text(self.message_text_view.get_buffer().get_start_iter(), self.message_text_view.get_buffer().get_end_iter(), False)
|
||||||
self.bot_message_box = None
|
})
|
||||||
self.bot_message_view = None
|
data = {
|
||||||
else:
|
"model": current_model.get_string(),
|
||||||
if not self.message_text_view.get_buffer().get_text(self.message_text_view.get_buffer().get_start_iter(), self.message_text_view.get_buffer().get_end_iter(), False): return
|
"messages": self.chats["chats"][self.chats["selected_chat"]]["messages"],
|
||||||
current_model = self.model_drop_down.get_selected_item()
|
"options": {"temperature": self.model_tweaks["temperature"], "seed": self.model_tweaks["seed"]},
|
||||||
if current_model is None:
|
"keep_alive": f"{self.model_tweaks['keep_alive']}m"
|
||||||
self.show_toast("info", 0, self.main_overlay)
|
}
|
||||||
return
|
if self.verify_if_image_can_be_used() and self.attached_image["base64"] is not None:
|
||||||
formated_datetime = datetime.now().strftime("%Y/%m/%d %H:%M")
|
data["messages"][-1]["images"] = [self.attached_image["base64"]]
|
||||||
self.chats["chats"][self.chats["selected_chat"]]["messages"].append({
|
self.switch_send_stop_button()
|
||||||
"role": "user",
|
self.toggle_ui_sensitive(False)
|
||||||
"model": "User",
|
self.image_button.set_sensitive(False)
|
||||||
"date": formated_datetime,
|
|
||||||
"content": self.message_text_view.get_buffer().get_text(self.message_text_view.get_buffer().get_start_iter(), self.message_text_view.get_buffer().get_end_iter(), False)
|
|
||||||
})
|
|
||||||
data = {
|
|
||||||
"model": current_model.get_string(),
|
|
||||||
"messages": self.chats["chats"][self.chats["selected_chat"]]["messages"]
|
|
||||||
}
|
|
||||||
if self.verify_if_image_can_be_used() and self.attached_image["base64"] is not None:
|
|
||||||
data["messages"][-1]["images"] = [self.attached_image["base64"]]
|
|
||||||
self.send_button.set_css_classes(["destructive-action"])
|
|
||||||
self.send_button.get_child().set_label("Stop")
|
|
||||||
self.send_button.get_child().set_icon_name("edit-delete-symbolic")
|
|
||||||
self.toggle_ui_sensitive(False)
|
|
||||||
self.image_button.set_sensitive(False)
|
|
||||||
|
|
||||||
self.show_message(self.message_text_view.get_buffer().get_text(self.message_text_view.get_buffer().get_start_iter(), self.message_text_view.get_buffer().get_end_iter(), False), False, f"\n\n<small>{formated_datetime}</small>", self.attached_image["base64"])
|
self.show_message(self.message_text_view.get_buffer().get_text(self.message_text_view.get_buffer().get_start_iter(), self.message_text_view.get_buffer().get_end_iter(), False), False, f"\n\n<small>{formated_datetime}</small>", self.attached_image["base64"], id=len(self.chats["chats"][self.chats["selected_chat"]]["messages"])-1)
|
||||||
self.message_text_view.get_buffer().set_text("", 0)
|
self.message_text_view.get_buffer().set_text("", 0)
|
||||||
self.loading_spinner = Gtk.Spinner(spinning=True, margin_top=12, margin_bottom=12, hexpand=True)
|
self.loading_spinner = Gtk.Spinner(spinning=True, margin_top=12, margin_bottom=12, hexpand=True)
|
||||||
self.chat_container.append(self.loading_spinner)
|
self.chat_container.append(self.loading_spinner)
|
||||||
self.show_message("", True)
|
self.show_message("", True, id=len(self.chats["chats"][self.chats["selected_chat"]]["messages"]))
|
||||||
|
|
||||||
thread = threading.Thread(target=self.run_message, args=(data['messages'], data['model']))
|
thread = threading.Thread(target=self.run_message, args=(data['messages'], data['model']))
|
||||||
thread.start()
|
thread.start()
|
||||||
|
|
||||||
@Gtk.Template.Callback()
|
@Gtk.Template.Callback()
|
||||||
def manage_models_button_activate(self, button=None):
|
def manage_models_button_activate(self, button=None):
|
||||||
@@ -256,6 +256,16 @@ class AlpacaWindow(Adw.ApplicationWindow):
|
|||||||
print("Closing app...")
|
print("Closing app...")
|
||||||
local_instance.stop()
|
local_instance.stop()
|
||||||
|
|
||||||
|
@Gtk.Template.Callback()
|
||||||
|
def model_spin_changed(self, spin):
|
||||||
|
value = spin.get_value()
|
||||||
|
if spin.get_name() != "temperature": value = round(value)
|
||||||
|
else: value = round(value, 1)
|
||||||
|
if self.model_tweaks[spin.get_name()] is not None and self.model_tweaks[spin.get_name()] != value:
|
||||||
|
self.model_tweaks[spin.get_name()] = value
|
||||||
|
print(self.model_tweaks)
|
||||||
|
self.save_server_config()
|
||||||
|
|
||||||
def show_toast(self, message_type:str, message_id:int, overlay):
|
def show_toast(self, message_type:str, message_id:int, overlay):
|
||||||
if message_type not in self.toast_messages or message_id > len(self.toast_messages[message_type] or message_id < 0):
|
if message_type not in self.toast_messages or message_id > len(self.toast_messages[message_type] or message_id < 0):
|
||||||
message_type = "error"
|
message_type = "error"
|
||||||
@@ -274,13 +284,20 @@ class AlpacaWindow(Adw.ApplicationWindow):
|
|||||||
self.get_application().send_notification(None, notification)
|
self.get_application().send_notification(None, notification)
|
||||||
|
|
||||||
def delete_message(self, message_element):
|
def delete_message(self, message_element):
|
||||||
message_index = self.current_chat_elements.index(message_element)
|
message_index = int(message_element.get_name())
|
||||||
del self.chats["chats"][self.chats["selected_chat"]]["messages"][message_index]
|
if message_index < len(self.chats["chats"][self.chats["selected_chat"]]["messages"]):
|
||||||
self.chat_container.remove(message_element)
|
self.chats["chats"][self.chats["selected_chat"]]["messages"][message_index] = None
|
||||||
del self.current_chat_elements[message_index]
|
self.chat_container.remove(message_element)
|
||||||
self.save_history()
|
self.save_history()
|
||||||
|
|
||||||
def show_message(self, msg:str, bot:bool, footer:str=None, image_base64:str=None):
|
def copy_message(self, message_element):
|
||||||
|
message_index = int(message_element.get_name())
|
||||||
|
print(message_index)
|
||||||
|
clipboard = Gdk.Display().get_default().get_clipboard()
|
||||||
|
clipboard.set(self.chats["chats"][self.chats["selected_chat"]]["messages"][message_index]["content"])
|
||||||
|
self.show_toast("info", 5, self.main_overlay)
|
||||||
|
|
||||||
|
def show_message(self, msg:str, bot:bool, footer:str=None, image_base64:str=None, id:int=-1):
|
||||||
message_text = Gtk.TextView(
|
message_text = Gtk.TextView(
|
||||||
editable=False,
|
editable=False,
|
||||||
focusable=True,
|
focusable=True,
|
||||||
@@ -299,10 +316,20 @@ class AlpacaWindow(Adw.ApplicationWindow):
|
|||||||
delete_button = Gtk.Button(
|
delete_button = Gtk.Button(
|
||||||
icon_name = "user-trash-symbolic",
|
icon_name = "user-trash-symbolic",
|
||||||
css_classes = ["flat", "circular", "delete-message-button"],
|
css_classes = ["flat", "circular", "delete-message-button"],
|
||||||
valign="end",
|
|
||||||
halign="end",
|
)
|
||||||
|
copy_button = Gtk.Button(
|
||||||
|
icon_name = "edit-copy-symbolic",
|
||||||
|
css_classes = ["flat", "circular", "delete-message-button"],
|
||||||
|
)
|
||||||
|
|
||||||
|
button_container = Gtk.Box(
|
||||||
|
orientation=0,
|
||||||
|
spacing=6,
|
||||||
|
margin_end=6,
|
||||||
margin_bottom=6,
|
margin_bottom=6,
|
||||||
margin_end=6
|
valign="end",
|
||||||
|
halign="end"
|
||||||
)
|
)
|
||||||
|
|
||||||
message_box = Gtk.Box(
|
message_box = Gtk.Box(
|
||||||
@@ -332,12 +359,15 @@ class AlpacaWindow(Adw.ApplicationWindow):
|
|||||||
message_box.append(image)
|
message_box.append(image)
|
||||||
|
|
||||||
message_box.append(message_text)
|
message_box.append(message_text)
|
||||||
self.current_chat_elements.append(Gtk.Overlay(css_classes=["message"]))
|
overlay = Gtk.Overlay(css_classes=["message"], name=id)
|
||||||
self.current_chat_elements[-1].set_child(message_box)
|
overlay.set_child(message_box)
|
||||||
|
|
||||||
delete_button.connect("clicked", lambda button, element=self.current_chat_elements[-1]: self.delete_message(element))
|
delete_button.connect("clicked", lambda button, element=overlay: self.delete_message(element))
|
||||||
self.current_chat_elements[-1].add_overlay(delete_button)
|
copy_button.connect("clicked", lambda button, element=overlay: self.copy_message(element))
|
||||||
self.chat_container.append(self.current_chat_elements[-1])
|
button_container.append(delete_button)
|
||||||
|
button_container.append(copy_button)
|
||||||
|
overlay.add_overlay(button_container)
|
||||||
|
self.chat_container.append(overlay)
|
||||||
|
|
||||||
if bot:
|
if bot:
|
||||||
self.bot_message = message_buffer
|
self.bot_message = message_buffer
|
||||||
@@ -378,12 +408,15 @@ class AlpacaWindow(Adw.ApplicationWindow):
|
|||||||
else:
|
else:
|
||||||
self.connection_error()
|
self.connection_error()
|
||||||
|
|
||||||
|
def save_server_config(self):
|
||||||
|
with open(os.path.join(self.config_dir, "server.json"), "w+") as f:
|
||||||
|
json.dump({'remote_url': self.remote_url, 'run_remote': self.run_remote, 'local_port': local_instance.port, 'run_on_background': self.run_on_background, 'model_tweaks': self.model_tweaks}, f)
|
||||||
|
|
||||||
def verify_connection(self):
|
def verify_connection(self):
|
||||||
response = connection_handler.simple_get(connection_handler.url)
|
response = connection_handler.simple_get(connection_handler.url)
|
||||||
if response['status'] == 'ok':
|
if response['status'] == 'ok':
|
||||||
if "Ollama is running" in response['text']:
|
if "Ollama is running" in response['text']:
|
||||||
with open(os.path.join(self.config_dir, "server.json"), "w+") as f:
|
self.save_server_config()
|
||||||
json.dump({'remote_url': self.remote_url, 'run_remote': self.run_remote, 'local_port': local_instance.port, 'run_on_background': self.run_on_background}, f)
|
|
||||||
self.update_list_local_models()
|
self.update_list_local_models()
|
||||||
return True
|
return True
|
||||||
return False
|
return False
|
||||||
@@ -429,7 +462,7 @@ class AlpacaWindow(Adw.ApplicationWindow):
|
|||||||
|
|
||||||
footer = None
|
footer = None
|
||||||
if part['text'].split("\n")[-1] == parts[-1]['text'].split("\n")[-1]:
|
if part['text'].split("\n")[-1] == parts[-1]['text'].split("\n")[-1]:
|
||||||
footer = "\n\n<small>" + part['text'].split('\n')[-1] + "</small>"
|
footer = "\n<small>" + part['text'].split('\n')[-1] + "</small>"
|
||||||
part['text'] = '\n'.join(part['text'].split("\n")[:-1])
|
part['text'] = '\n'.join(part['text'].split("\n")[:-1])
|
||||||
|
|
||||||
part['text'] = part['text'].replace("\n* ", "\n• ")
|
part['text'] = part['text'].replace("\n* ", "\n• ")
|
||||||
@@ -527,22 +560,24 @@ class AlpacaWindow(Adw.ApplicationWindow):
|
|||||||
self.chats["chats"][self.chats["selected_chat"]]["messages"][-1]['content'] += data['message']['content']
|
self.chats["chats"][self.chats["selected_chat"]]["messages"][-1]['content'] += data['message']['content']
|
||||||
|
|
||||||
def toggle_ui_sensitive(self, status):
|
def toggle_ui_sensitive(self, status):
|
||||||
for element in [self.chat_list_box, self.export_chat_button, self.import_chat_button, self.add_chat_button]:
|
for element in [self.chat_list_box, self.add_chat_button]:
|
||||||
element.set_sensitive(status)
|
element.set_sensitive(status)
|
||||||
|
|
||||||
|
def switch_send_stop_button(self):
|
||||||
|
self.stop_button.set_visible(self.send_button.get_visible())
|
||||||
|
self.send_button.set_visible(not self.send_button.get_visible())
|
||||||
|
|
||||||
def run_message(self, messages, model):
|
def run_message(self, messages, model):
|
||||||
response = connection_handler.stream_post(f"{connection_handler.url}/api/chat", data=json.dumps({"model": model, "messages": messages}), callback=self.update_bot_message)
|
response = connection_handler.stream_post(f"{connection_handler.url}/api/chat", data=json.dumps({"model": model, "messages": messages}), callback=self.update_bot_message)
|
||||||
GLib.idle_add(self.add_code_blocks)
|
GLib.idle_add(self.add_code_blocks)
|
||||||
GLib.idle_add(self.send_button.set_css_classes, ["suggested-action"])
|
GLib.idle_add(self.switch_send_stop_button)
|
||||||
GLib.idle_add(self.send_button.get_child().set_label, "Send")
|
|
||||||
GLib.idle_add(self.send_button.get_child().set_icon_name, "send-to-symbolic")
|
|
||||||
GLib.idle_add(self.toggle_ui_sensitive, True)
|
GLib.idle_add(self.toggle_ui_sensitive, True)
|
||||||
if self.verify_if_image_can_be_used(): GLib.idle_add(self.image_button.set_sensitive, True)
|
if self.verify_if_image_can_be_used(): GLib.idle_add(self.image_button.set_sensitive, True)
|
||||||
GLib.idle_add(self.image_button.set_css_classes, [])
|
GLib.idle_add(self.image_button.set_css_classes, ["circular"])
|
||||||
GLib.idle_add(self.image_button.get_child().set_icon_name, "image-x-generic-symbolic")
|
|
||||||
self.attached_image = {"path": None, "base64": None}
|
self.attached_image = {"path": None, "base64": None}
|
||||||
if response['status'] == 'error':
|
if response['status'] == 'error':
|
||||||
GLib.idle_add(self.connection_error)
|
GLib.idle_add(self.connection_error)
|
||||||
|
print(response)
|
||||||
|
|
||||||
def pull_model_update(self, data, model_name):
|
def pull_model_update(self, data, model_name):
|
||||||
if model_name in list(self.pulling_models.keys()):
|
if model_name in list(self.pulling_models.keys()):
|
||||||
@@ -574,10 +609,10 @@ class AlpacaWindow(Adw.ApplicationWindow):
|
|||||||
|
|
||||||
def pull_model(self, model):
|
def pull_model(self, model):
|
||||||
if model in list(self.pulling_models.keys()):
|
if model in list(self.pulling_models.keys()):
|
||||||
self.show_toast("info", 3, self.manage_models_overlay)
|
self.show_toast("info", 2, self.manage_models_overlay)
|
||||||
return
|
return
|
||||||
if model in self.local_models:
|
if model in self.local_models:
|
||||||
self.show_toast("info", 4, self.manage_models_overlay)
|
self.show_toast("info", 3, self.manage_models_overlay)
|
||||||
return
|
return
|
||||||
self.pulling_model_list_box.set_visible(True)
|
self.pulling_model_list_box.set_visible(True)
|
||||||
model_row = Adw.ActionRow(
|
model_row = Adw.ActionRow(
|
||||||
@@ -615,7 +650,7 @@ class AlpacaWindow(Adw.ApplicationWindow):
|
|||||||
subtitle = "Image recognition" if model_info["image"] else None
|
subtitle = "Image recognition" if model_info["image"] else None
|
||||||
)
|
)
|
||||||
link_button = Gtk.Button(
|
link_button = Gtk.Button(
|
||||||
icon_name = "web-browser-symbolic",
|
icon_name = "globe-symbolic",
|
||||||
vexpand = False,
|
vexpand = False,
|
||||||
valign = 3,
|
valign = 3,
|
||||||
css_classes = ["success"]
|
css_classes = ["success"]
|
||||||
@@ -638,13 +673,14 @@ class AlpacaWindow(Adw.ApplicationWindow):
|
|||||||
|
|
||||||
def load_history_into_chat(self):
|
def load_history_into_chat(self):
|
||||||
for widget in list(self.chat_container): self.chat_container.remove(widget)
|
for widget in list(self.chat_container): self.chat_container.remove(widget)
|
||||||
for message in self.chats['chats'][self.chats["selected_chat"]]['messages']:
|
for i, message in enumerate(self.chats['chats'][self.chats["selected_chat"]]['messages']):
|
||||||
if message['role'] == 'user':
|
if message:
|
||||||
self.show_message(message['content'], False, f"\n\n<small>{message['date']}</small>", message['images'][0] if 'images' in message and len(message['images']) > 0 else None)
|
if message['role'] == 'user':
|
||||||
else:
|
self.show_message(message['content'], False, f"\n\n<small>{message['date']}</small>", message['images'][0] if 'images' in message and len(message['images']) > 0 else None, id=i)
|
||||||
self.show_message(message['content'], True, f"\n\n<small>{message['model']}\t|\t{message['date']}</small>")
|
else:
|
||||||
self.add_code_blocks()
|
self.show_message(message['content'], True, f"\n\n<small>{message['model']}\t|\t{message['date']}</small>", id=i)
|
||||||
self.bot_message = None
|
self.add_code_blocks()
|
||||||
|
self.bot_message = None
|
||||||
|
|
||||||
def load_history(self):
|
def load_history(self):
|
||||||
if os.path.exists(os.path.join(self.config_dir, "chats.json")):
|
if os.path.exists(os.path.join(self.config_dir, "chats.json")):
|
||||||
@@ -653,6 +689,9 @@ class AlpacaWindow(Adw.ApplicationWindow):
|
|||||||
self.chats = json.load(f)
|
self.chats = json.load(f)
|
||||||
if "selected_chat" not in self.chats or self.chats["selected_chat"] not in self.chats["chats"]: self.chats["selected_chat"] = list(self.chats["chats"].keys())[0]
|
if "selected_chat" not in self.chats or self.chats["selected_chat"] not in self.chats["chats"]: self.chats["selected_chat"] = list(self.chats["chats"].keys())[0]
|
||||||
if len(list(self.chats["chats"].keys())) == 0: self.chats["chats"][_("New Chat")] = {"messages": []}
|
if len(list(self.chats["chats"].keys())) == 0: self.chats["chats"][_("New Chat")] = {"messages": []}
|
||||||
|
for chat_name, content in self.chats['chats'].items():
|
||||||
|
for i, content in enumerate(content['messages']):
|
||||||
|
if not content: del self.chats['chats'][chat_name]['messages'][i]
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
self.chats = {"chats": {_("New Chat"): {"messages": []}}, "selected_chat": _("New Chat")}
|
self.chats = {"chats": {_("New Chat"): {"messages": []}}, "selected_chat": _("New Chat")}
|
||||||
self.load_history_into_chat()
|
self.load_history_into_chat()
|
||||||
@@ -677,14 +716,12 @@ class AlpacaWindow(Adw.ApplicationWindow):
|
|||||||
image_data = output.getvalue()
|
image_data = output.getvalue()
|
||||||
self.attached_image["base64"] = base64.b64encode(image_data).decode("utf-8")
|
self.attached_image["base64"] = base64.b64encode(image_data).decode("utf-8")
|
||||||
|
|
||||||
self.image_button.set_css_classes(["destructive-action"])
|
self.image_button.set_css_classes(["destructive-action", "circular"])
|
||||||
self.image_button.get_child().set_icon_name("edit-delete-symbolic")
|
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
self.show_toast("error", 5, self.main_overlay)
|
self.show_toast("error", 5, self.main_overlay)
|
||||||
|
|
||||||
def remove_image(self):
|
def remove_image(self):
|
||||||
self.image_button.set_css_classes([])
|
self.image_button.set_css_classes(["circular"])
|
||||||
self.image_button.get_child().set_icon_name("image-x-generic-symbolic")
|
|
||||||
self.attached_image = {"path": None, "base64": None}
|
self.attached_image = {"path": None, "base64": None}
|
||||||
|
|
||||||
def generate_numbered_chat_name(self, chat_name) -> str:
|
def generate_numbered_chat_name(self, chat_name) -> str:
|
||||||
@@ -705,13 +742,14 @@ class AlpacaWindow(Adw.ApplicationWindow):
|
|||||||
self.save_history()
|
self.save_history()
|
||||||
self.update_chat_list()
|
self.update_chat_list()
|
||||||
if len(self.chats['chats'])==0:
|
if len(self.chats['chats'])==0:
|
||||||
self.chat_new()
|
self.new_chat()
|
||||||
|
|
||||||
def rename_chat(self, old_chat_name, new_chat_name, label_element):
|
def rename_chat(self, old_chat_name, new_chat_name, label_element):
|
||||||
new_chat_name = self.generate_numbered_chat_name(new_chat_name)
|
new_chat_name = self.generate_numbered_chat_name(new_chat_name)
|
||||||
self.chats["chats"][new_chat_name] = self.chats["chats"][old_chat_name]
|
self.chats["chats"][new_chat_name] = self.chats["chats"][old_chat_name]
|
||||||
del self.chats["chats"][old_chat_name]
|
del self.chats["chats"][old_chat_name]
|
||||||
label_element.set_label(new_chat_name)
|
label_element.set_label(new_chat_name)
|
||||||
|
label_element.get_parent().set_name(new_chat_name)
|
||||||
self.save_history()
|
self.save_history()
|
||||||
|
|
||||||
def new_chat(self):
|
def new_chat(self):
|
||||||
@@ -746,8 +784,13 @@ class AlpacaWindow(Adw.ApplicationWindow):
|
|||||||
chat_label = Gtk.Label(
|
chat_label = Gtk.Label(
|
||||||
label=chat_name,
|
label=chat_name,
|
||||||
hexpand=True,
|
hexpand=True,
|
||||||
halign=1
|
halign=0,
|
||||||
|
wrap=True,
|
||||||
|
ellipsize=3,
|
||||||
|
wrap_mode=2,
|
||||||
|
xalign=0
|
||||||
)
|
)
|
||||||
|
|
||||||
button_delete = Gtk.Button(
|
button_delete = Gtk.Button(
|
||||||
icon_name = "user-trash-symbolic",
|
icon_name = "user-trash-symbolic",
|
||||||
vexpand = False,
|
vexpand = False,
|
||||||
@@ -761,7 +804,8 @@ class AlpacaWindow(Adw.ApplicationWindow):
|
|||||||
valign = 3,
|
valign = 3,
|
||||||
css_classes = ["accent", "flat"]
|
css_classes = ["accent", "flat"]
|
||||||
)
|
)
|
||||||
button_rename.connect("clicked", lambda button, chat_name=chat_name, label_element=chat_label: dialogs.rename_chat(self, chat_name, label_element))
|
chat_content.set_name(chat_name)
|
||||||
|
button_rename.connect("clicked", lambda button, label_element=chat_label: dialogs.rename_chat(self, label_element))
|
||||||
chat_content.append(chat_label)
|
chat_content.append(chat_label)
|
||||||
chat_content.append(button_delete)
|
chat_content.append(button_delete)
|
||||||
chat_content.append(button_rename)
|
chat_content.append(button_rename)
|
||||||
@@ -857,13 +901,13 @@ class AlpacaWindow(Adw.ApplicationWindow):
|
|||||||
GtkSource.init()
|
GtkSource.init()
|
||||||
self.set_help_overlay(self.shortcut_window)
|
self.set_help_overlay(self.shortcut_window)
|
||||||
self.get_application().set_accels_for_action("win.show-help-overlay", ['<primary>slash'])
|
self.get_application().set_accels_for_action("win.show-help-overlay", ['<primary>slash'])
|
||||||
|
self.get_application().create_action('new_chat', lambda *_: self.new_chat(), ['<primary>n'])
|
||||||
self.get_application().create_action('clear', lambda *_: dialogs.clear_chat(self), ['<primary>e'])
|
self.get_application().create_action('clear', lambda *_: dialogs.clear_chat(self), ['<primary>e'])
|
||||||
self.get_application().create_action('send', lambda *_: self.send_message(self), ['Return'])
|
self.get_application().create_action('send', lambda *_: self.send_message(self), ['Return'])
|
||||||
|
self.get_application().create_action('export_current_chat', lambda *_: self.export_current_chat())
|
||||||
|
self.get_application().create_action('import_chat', lambda *_: self.import_chat())
|
||||||
self.add_chat_button.connect("clicked", lambda button : self.new_chat())
|
self.add_chat_button.connect("clicked", lambda button : self.new_chat())
|
||||||
|
|
||||||
self.export_chat_button.connect("clicked", lambda button : self.export_current_chat())
|
|
||||||
self.import_chat_button.connect("clicked", lambda button : self.import_chat())
|
|
||||||
|
|
||||||
self.remote_connection_entry.connect("entry-activated", lambda entry : entry.set_css_classes([]))
|
self.remote_connection_entry.connect("entry-activated", lambda entry : entry.set_css_classes([]))
|
||||||
self.remote_connection_switch.connect("notify", lambda pspec, user_data : self.connection_switched())
|
self.remote_connection_switch.connect("notify", lambda pspec, user_data : self.connection_switched())
|
||||||
self.background_switch.connect("notify", lambda pspec, user_data : self.switch_run_on_background())
|
self.background_switch.connect("notify", lambda pspec, user_data : self.switch_run_on_background())
|
||||||
@@ -874,6 +918,12 @@ class AlpacaWindow(Adw.ApplicationWindow):
|
|||||||
local_instance.port = data['local_port']
|
local_instance.port = data['local_port']
|
||||||
self.remote_url = data['remote_url']
|
self.remote_url = data['remote_url']
|
||||||
self.run_on_background = data['run_on_background']
|
self.run_on_background = data['run_on_background']
|
||||||
|
#Model Tweaks
|
||||||
|
if "model_tweaks" in data: self.model_tweaks = data['model_tweaks']
|
||||||
|
self.temperature_spin.set_value(self.model_tweaks['temperature'])
|
||||||
|
self.seed_spin.set_value(self.model_tweaks['seed'])
|
||||||
|
self.keep_alive_spin.set_value(self.model_tweaks['keep_alive'])
|
||||||
|
|
||||||
self.background_switch.set_active(self.run_on_background)
|
self.background_switch.set_active(self.run_on_background)
|
||||||
self.set_hide_on_close(self.run_on_background)
|
self.set_hide_on_close(self.run_on_background)
|
||||||
self.remote_connection_entry.set_text(self.remote_url)
|
self.remote_connection_entry.set_text(self.remote_url)
|
||||||
@@ -888,7 +938,7 @@ class AlpacaWindow(Adw.ApplicationWindow):
|
|||||||
local_instance.start()
|
local_instance.start()
|
||||||
connection_handler.url = f"http://127.0.0.1:{local_instance.port}"
|
connection_handler.url = f"http://127.0.0.1:{local_instance.port}"
|
||||||
self.welcome_dialog.present(self)
|
self.welcome_dialog.present(self)
|
||||||
if self.verify_connection() is False and self.run_remote == False: self.connection_error()
|
if self.verify_connection() is False: self.connection_error()
|
||||||
self.update_list_available_models()
|
self.update_list_available_models()
|
||||||
self.load_history()
|
self.load_history()
|
||||||
self.update_chat_list()
|
self.update_chat_list()
|
||||||
|
|||||||
173
src/window.ui
173
src/window.ui
@@ -44,21 +44,11 @@
|
|||||||
</object>
|
</object>
|
||||||
</child>
|
</child>
|
||||||
<child type="end">
|
<child type="end">
|
||||||
<object class="GtkButton" id="import_chat_button">
|
<object class="GtkMenuButton" id="chats_menu_button">
|
||||||
<property name="tooltip-text" translatable="yes">Import chat</property>
|
<property name="direction">1</property>
|
||||||
<property name="icon-name">document-open-symbolic</property>
|
<property name="halign">3</property>
|
||||||
<style>
|
<property name="menu-model">chats_button_menu</property>
|
||||||
<class name="flat"/>
|
<property name="icon-name">view-more-symbolic</property>
|
||||||
</style>
|
|
||||||
</object>
|
|
||||||
</child>
|
|
||||||
<child type="end">
|
|
||||||
<object class="GtkButton" id="export_chat_button">
|
|
||||||
<property name="tooltip-text" translatable="yes">Export chat</property>
|
|
||||||
<property name="icon-name">folder-download-symbolic</property>
|
|
||||||
<style>
|
|
||||||
<class name="flat"/>
|
|
||||||
</style>
|
|
||||||
</object>
|
</object>
|
||||||
</child>
|
</child>
|
||||||
</object>
|
</object>
|
||||||
@@ -113,7 +103,7 @@
|
|||||||
<property name="tooltip-text" translatable="yes">Manage models</property>
|
<property name="tooltip-text" translatable="yes">Manage models</property>
|
||||||
<child>
|
<child>
|
||||||
<object class="AdwButtonContent">
|
<object class="AdwButtonContent">
|
||||||
<property name="icon-name">package-x-generic-symbolic</property>
|
<property name="icon-name">library-symbolic</property>
|
||||||
</object>
|
</object>
|
||||||
</child>
|
</child>
|
||||||
</object>
|
</object>
|
||||||
@@ -180,62 +170,79 @@
|
|||||||
<property name="margin-bottom">12</property>
|
<property name="margin-bottom">12</property>
|
||||||
<property name="margin-start">12</property>
|
<property name="margin-start">12</property>
|
||||||
<property name="margin-end">12</property>
|
<property name="margin-end">12</property>
|
||||||
|
<child>
|
||||||
|
<object class="GtkButton" id="image_button">
|
||||||
|
<signal name="clicked" handler="open_image"/>
|
||||||
|
<property name="vexpand">false</property>
|
||||||
|
<property name="valign">3</property>
|
||||||
|
<property name="sensitive">false</property>
|
||||||
|
<property name="tooltip-text" translatable="yes">Only available on selected models</property>
|
||||||
|
<child>
|
||||||
|
<object class="AdwButtonContent">
|
||||||
|
<property name="icon-name">image-x-generic-symbolic</property>
|
||||||
|
</object>
|
||||||
|
</child>
|
||||||
|
</object>
|
||||||
|
</child>
|
||||||
<child>
|
<child>
|
||||||
<object class="GtkBox">
|
<object class="GtkBox">
|
||||||
<style>
|
<style>
|
||||||
|
<class name="card"/>
|
||||||
<class name="message-input"/>
|
<class name="message-input"/>
|
||||||
</style>
|
</style>
|
||||||
<child>
|
<child>
|
||||||
<object class="GtkScrolledWindow">
|
<object class="GtkScrolledWindow">
|
||||||
<property name="margin-start">12</property>
|
<property name="margin-start">12</property>
|
||||||
<property name="margin-end">12</property>
|
<property name="margin-end">12</property>
|
||||||
|
<style>
|
||||||
|
<class name="message-input"/>
|
||||||
|
<class name="undershoot-bottom"/>
|
||||||
|
<class name="undershoot-top"/>
|
||||||
|
</style>
|
||||||
<child>
|
<child>
|
||||||
<object class="GtkTextView" id="message_text_view">
|
<object class="GtkTextView" id="message_text_view">
|
||||||
<property name="wrap-mode">word</property>
|
<property name="wrap-mode">word</property>
|
||||||
<property name="top-margin">6</property>
|
<property name="top-margin">6</property>
|
||||||
<property name="bottom-margin">6</property>
|
<property name="bottom-margin">6</property>
|
||||||
<property name="margin-end">12</property>
|
|
||||||
<property name="hexpand">true</property>
|
<property name="hexpand">true</property>
|
||||||
<style>
|
<style>
|
||||||
<class name="message-text-view"/>
|
<class name="message-input"/>
|
||||||
</style>
|
</style>
|
||||||
</object>
|
</object>
|
||||||
</child>
|
</child>
|
||||||
</object>
|
</object>
|
||||||
</child>
|
</child>
|
||||||
</object>
|
</object>
|
||||||
|
|
||||||
</child>
|
</child>
|
||||||
<child>
|
<child>
|
||||||
<object class="GtkBox">
|
<object class="GtkButton" id="send_button">
|
||||||
<property name="orientation">1</property>
|
<signal name="clicked" handler="send_message"/>
|
||||||
<property name="spacing">12</property>
|
<property name="vexpand">false</property>
|
||||||
|
<property name="valign">3</property>
|
||||||
|
<style>
|
||||||
|
<class name="suggested-action"/>
|
||||||
|
<class name="circular"/>
|
||||||
|
</style>
|
||||||
<child>
|
<child>
|
||||||
<object class="GtkButton" id="send_button">
|
<object class="AdwButtonContent">
|
||||||
<signal name="clicked" handler="send_message"/>
|
<property name="icon-name">paper-plane-symbolic</property>
|
||||||
<style>
|
|
||||||
<class name="suggested-action"/>
|
|
||||||
</style>
|
|
||||||
<child>
|
|
||||||
<object class="AdwButtonContent">
|
|
||||||
<property name="label" translatable="yes">Send</property>
|
|
||||||
<property name="icon-name">send-to-symbolic</property>
|
|
||||||
</object>
|
|
||||||
</child>
|
|
||||||
</object>
|
</object>
|
||||||
</child>
|
</child>
|
||||||
|
</object>
|
||||||
|
</child>
|
||||||
|
<child>
|
||||||
|
<object class="GtkButton" id="stop_button">
|
||||||
|
<signal name="clicked" handler="stop_message"/>
|
||||||
|
<property name="vexpand">false</property>
|
||||||
|
<property name="valign">3</property>
|
||||||
|
<property name="visible">false</property>
|
||||||
|
<style>
|
||||||
|
<class name="destructive-action"/>
|
||||||
|
<class name="circular"/>
|
||||||
|
</style>
|
||||||
<child>
|
<child>
|
||||||
<object class="GtkButton" id="image_button">
|
<object class="AdwButtonContent">
|
||||||
<signal name="clicked" handler="open_image"/>
|
<property name="icon-name">media-playback-stop-symbolic</property>
|
||||||
<property name="sensitive">false</property>
|
|
||||||
<property name="tooltip-text" translatable="yes">Only available on selected models</property>
|
|
||||||
<child>
|
|
||||||
<object class="AdwButtonContent">
|
|
||||||
<property name="label" translatable="yes">Image</property>
|
|
||||||
<property name="icon-name">image-x-generic-symbolic</property>
|
|
||||||
</object>
|
|
||||||
</child>
|
|
||||||
</object>
|
</object>
|
||||||
</child>
|
</child>
|
||||||
</object>
|
</object>
|
||||||
@@ -258,9 +265,9 @@
|
|||||||
<property name="height-request">600</property>
|
<property name="height-request">600</property>
|
||||||
<property name="title" translatable="yes">Preferences</property>
|
<property name="title" translatable="yes">Preferences</property>
|
||||||
<child>
|
<child>
|
||||||
<object class="AdwPreferencesPage" id="connection_page">
|
<object class="AdwPreferencesPage" id="general_page">
|
||||||
<property name="title" translatable="yes">General</property>
|
<property name="title" translatable="yes">General</property>
|
||||||
<property name="icon-name">insert-link-symbolic</property>
|
<property name="icon-name">preferences-system-symbolic</property>
|
||||||
<child>
|
<child>
|
||||||
<object class="AdwPreferencesGroup">
|
<object class="AdwPreferencesGroup">
|
||||||
<property name="title" translatable="yes">Remote Connection</property>
|
<property name="title" translatable="yes">Remote Connection</property>
|
||||||
@@ -292,6 +299,64 @@
|
|||||||
</child>
|
</child>
|
||||||
</object>
|
</object>
|
||||||
</child>
|
</child>
|
||||||
|
<child>
|
||||||
|
<object class="AdwPreferencesPage" id="model_page">
|
||||||
|
<property name="title" translatable="yes">Advanced Model Settings</property>
|
||||||
|
<property name="icon-name">preferences-other-symbolic</property>
|
||||||
|
<child>
|
||||||
|
<object class="AdwPreferencesGroup">
|
||||||
|
<property name="title" translatable="yes">Model Tweaks</property>
|
||||||
|
<property name="description" translatable="yes">Manage the behavior of the AI models</property>
|
||||||
|
<child>
|
||||||
|
<object class="AdwSpinRow" id="temperature_spin">
|
||||||
|
<signal name="changed" handler="model_spin_changed"/>
|
||||||
|
<property name="name">temperature</property>
|
||||||
|
<property name="title" translatable="yes">Temperature</property>
|
||||||
|
<property name="subtitle" translatable="yes">The temperature of the model. Increasing the temperature will make the model answer more creatively. (Default: 0.8)</property>
|
||||||
|
<property name="digits">1</property>
|
||||||
|
<property name="adjustment">
|
||||||
|
<object class="GtkAdjustment">
|
||||||
|
<property name="lower">0</property>
|
||||||
|
<property name="upper">1</property>
|
||||||
|
<property name="step-increment">0.1</property>
|
||||||
|
</object>
|
||||||
|
</property>
|
||||||
|
</object>
|
||||||
|
</child>
|
||||||
|
<child>
|
||||||
|
<object class="AdwSpinRow" id="seed_spin">
|
||||||
|
<signal name="changed" handler="model_spin_changed"/>
|
||||||
|
<property name="name">seed</property>
|
||||||
|
<property name="title" translatable="yes">Seed</property>
|
||||||
|
<property name="subtitle" translatable="yes">Sets the random number seed to use for generation. Setting this to a specific number will make the model generate the same text for the same prompt. (Default: 0 (random))</property>
|
||||||
|
<property name="adjustment">
|
||||||
|
<object class="GtkAdjustment">
|
||||||
|
<property name="lower">0</property>
|
||||||
|
<property name="upper">999999</property>
|
||||||
|
<property name="step-increment">1</property>
|
||||||
|
</object>
|
||||||
|
</property>
|
||||||
|
</object>
|
||||||
|
</child>
|
||||||
|
<child>
|
||||||
|
<object class="AdwSpinRow" id="keep_alive_spin">
|
||||||
|
<signal name="changed" handler="model_spin_changed"/>
|
||||||
|
<property name="name">keep_alive</property>
|
||||||
|
<property name="title" translatable="yes">Keep Alive Time</property>
|
||||||
|
<property name="subtitle" translatable="yes">Controls how long the model will stay loaded into memory following the request in minutes (default: 5)</property>
|
||||||
|
<property name="adjustment">
|
||||||
|
<object class="GtkAdjustment">
|
||||||
|
<property name="lower">-1</property>
|
||||||
|
<property name="upper">999999</property>
|
||||||
|
<property name="step-increment">1</property>
|
||||||
|
</object>
|
||||||
|
</property>
|
||||||
|
</object>
|
||||||
|
</child>
|
||||||
|
</object>
|
||||||
|
</child>
|
||||||
|
</object>
|
||||||
|
</child>
|
||||||
</object>
|
</object>
|
||||||
|
|
||||||
<object class="AdwDialog" id="manage_models_dialog">
|
<object class="AdwDialog" id="manage_models_dialog">
|
||||||
@@ -557,10 +622,15 @@
|
|||||||
</item>
|
</item>
|
||||||
</section>
|
</section>
|
||||||
</menu>
|
</menu>
|
||||||
<menu id="chat_context_menu">
|
<menu id="chats_button_menu">
|
||||||
<section>
|
<section>
|
||||||
<item>
|
<item>
|
||||||
<attribute name="label" translatable="yes">Remove</attribute>
|
<attribute name="label" translatable="yes">Export current chat</attribute>
|
||||||
|
<attribute name="action">app.export_current_chat</attribute>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<attribute name="label" translatable="yes">Import chat</attribute>
|
||||||
|
<attribute name="action">app.import_chat</attribute>
|
||||||
</item>
|
</item>
|
||||||
</section>
|
</section>
|
||||||
</menu>
|
</menu>
|
||||||
@@ -605,6 +675,12 @@
|
|||||||
<property name="title" translatable="yes">Preferences</property>
|
<property name="title" translatable="yes">Preferences</property>
|
||||||
</object>
|
</object>
|
||||||
</child>
|
</child>
|
||||||
|
<child>
|
||||||
|
<object class="GtkShortcutsShortcut">
|
||||||
|
<property name="accelerator"><ctrl>N</property>
|
||||||
|
<property name="title" translatable="yes">New Chat</property>
|
||||||
|
</object>
|
||||||
|
</child>
|
||||||
<child>
|
<child>
|
||||||
<object class="GtkShortcutsShortcut">
|
<object class="GtkShortcutsShortcut">
|
||||||
<property name="accelerator"><ctrl>slash</property>
|
<property name="accelerator"><ctrl>slash</property>
|
||||||
@@ -646,4 +722,3 @@
|
|||||||
</child>
|
</child>
|
||||||
</object>
|
</object>
|
||||||
</interface>
|
</interface>
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user