Compare commits
83 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
3fe9b6e121 | ||
|
|
6979d1a775 | ||
|
|
90385ce461 | ||
|
|
c579e6ec99 | ||
|
|
b8d93cfd17 | ||
|
|
359f28f5c1 | ||
|
|
6e8bff8493 | ||
|
|
ad25d5a50f | ||
|
|
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 | ||
|
|
16f620b034 | ||
|
|
77b32b4912 | ||
|
|
257197d4d8 | ||
|
|
19cc97a1c4 | ||
|
|
93652cd9f7 | ||
|
|
540a0dc915 | ||
|
|
54c1b9a96e | ||
|
|
a9663b45fc | ||
|
|
9bf029f8b3 | ||
|
|
a94d1dfc92 | ||
|
|
e90ef93a04 | ||
|
|
a7ba5da943 | ||
|
|
1e287dde6f | ||
|
|
05461fb03a | ||
|
|
aa79368b54 | ||
|
|
cb4e52f103 | ||
|
|
91fc745d2f | ||
|
|
a719783cce | ||
|
|
766636718a | ||
|
|
59d2430e2f | ||
|
|
074b4dc643 | ||
|
|
92dd56b0c4 | ||
|
|
25c414faa3 | ||
|
|
dc2df81c75 | ||
|
|
ddc50ce621 | ||
|
|
701fae92a0 | ||
|
|
f3d22219b4 | ||
|
|
0027cf7c59 | ||
|
|
b6c45fc346 | ||
|
|
e6f2902bd1 | ||
|
|
1190e367bb | ||
|
|
d619f55ff2 | ||
|
|
605d837716 | ||
|
|
3aa57c6d2f | ||
|
|
1cf2f04b06 | ||
|
|
780de2b753 | ||
|
|
e19511469d | ||
|
|
bedf1a9bc5 | ||
|
|
6e330448e6 | ||
|
|
31802da0e3 |
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
@@ -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
@@ -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.
|
||||||
18
README.md
@@ -22,7 +22,8 @@ Alpaca is an [Ollama](https://github.com/ollama/ollama) client where you can man
|
|||||||
- Delete messages
|
- Delete messages
|
||||||
|
|
||||||
## Future features!
|
## Future features!
|
||||||
- Document recognition
|
- Document recognition (Probably only Markdown because it's really easy for AI to read)
|
||||||
|
- YouTube recognition (Ask questions about a YouTube video using the transcript)
|
||||||
- Edit messages
|
- Edit messages
|
||||||
- Snap Package (maybe)
|
- Snap Package (maybe)
|
||||||
|
|
||||||
@@ -40,6 +41,20 @@ Login to Ollama instance | Chatting with models | Managing
|
|||||||
2. Download the latest flatpak package
|
2. Download the latest flatpak package
|
||||||
3. Open it
|
3. Open it
|
||||||
|
|
||||||
|
## Ollama session tips
|
||||||
|
|
||||||
|
### Migrate Ollama session to Alpaca's integrated session
|
||||||
|
For now Alpaca doesn't offer a way to do this from the GUI but it's really simple, when you are using Ollama it creates a folder in the home directory called `.ollama`, you just need to move that folder to `~/.var/app/com.jeffser.Alpaca/data/`
|
||||||
|
|
||||||
|
### Change the port of the integrated Ollama instance
|
||||||
|
Go to `~/.var/app/com.jeffser.Alpaca/config/server.json` and change the `"local_port"` value, by default it is `11435`.
|
||||||
|
|
||||||
|
### Backup all the chats
|
||||||
|
The chat data is located in `~/.var/app/com.jeffser.Alpaca/config/chats.json` you can copy that file wherever you want to.
|
||||||
|
|
||||||
|
### Force showing the welcome dialog
|
||||||
|
To do that you just need to delete the file `~/.var/app/com.jeffser.Alpaca/config/server.json`, this won't affect your saved chats or models.
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
## Thanks
|
## Thanks
|
||||||
@@ -48,6 +63,7 @@ Login to Ollama instance | Chatting with models | Managing
|
|||||||
- [Alexkdeveloper](https://github.com/alexkdeveloper) for their help translating the app to Russian
|
- [Alexkdeveloper](https://github.com/alexkdeveloper) for their help translating the app to Russian
|
||||||
- [Imbev](https://github.com/imbev) for their reports and suggestions
|
- [Imbev](https://github.com/imbev) for their reports and suggestions
|
||||||
- [Nokse](https://github.com/Nokse22) for their contributions to the UI
|
- [Nokse](https://github.com/Nokse22) for their contributions to the UI
|
||||||
|
- [Louis Chauvet-Villaret](https://github.com/loulou64490) for their suggestions and help translating the app to French
|
||||||
|
|
||||||
## About forks
|
## About forks
|
||||||
If you want to fork this... I mean, I think it would be better if you start from scratch, my code isn't well documented at all, but if you really want to, please give me some credit, that's all I ask for... And maybe a donation (joke)
|
If you want to fork this... I mean, I think it would be better if you start from scratch, my code isn't well documented at all, but if you really want to, please give me some credit, that's all I ask for... And maybe a donation (joke)
|
||||||
|
|||||||
@@ -80,16 +80,16 @@
|
|||||||
"sources": [
|
"sources": [
|
||||||
{
|
{
|
||||||
"type": "file",
|
"type": "file",
|
||||||
"url": "https://github.com/ollama/ollama/releases/download/v0.1.38/ollama-linux-amd64",
|
"url": "https://github.com/ollama/ollama/releases/download/v0.1.39/ollama-linux-amd64",
|
||||||
"sha256": "c3360812503a9756a507ebb9d78667e2b21800a760b45046bc48a8f3b81972f4",
|
"sha256": "4d19be355842a6297c93ab5ada139fe396126736bf3c3882a879dc245dffe3af",
|
||||||
"only-arches": [
|
"only-arches": [
|
||||||
"x86_64"
|
"x86_64"
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"type": "file",
|
"type": "file",
|
||||||
"url": "https://github.com/ollama/ollama/releases/download/v0.1.38/ollama-linux-arm64",
|
"url": "https://github.com/ollama/ollama/releases/download/v0.1.39/ollama-linux-arm64",
|
||||||
"sha256": "f2d091afe665b2d5ba8b68e2473d36cdfaf80c61c7d2844a0a8f533c4e62f547",
|
"sha256": "60ec2d36928c11d6c6d84fe91451308a46aafaedbdba44664e5a6080009ce097",
|
||||||
"only-arches": [
|
"only-arches": [
|
||||||
"aarch64"
|
"aarch64"
|
||||||
]
|
]
|
||||||
|
|||||||
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
@@ -0,0 +1,3 @@
|
|||||||
|
[D-BUS Service]
|
||||||
|
Name=@appid@.SearchProvider
|
||||||
|
Exec=@libexecdir@/alpaca_search_provider
|
||||||
@@ -10,10 +10,11 @@
|
|||||||
<p>An Ollama client</p>
|
<p>An Ollama client</p>
|
||||||
<p>Features</p>
|
<p>Features</p>
|
||||||
<ul>
|
<ul>
|
||||||
|
<li>Built in Ollama instance</li>
|
||||||
<li>Talk to multiple models in the same conversation</li>
|
<li>Talk to multiple models in the same conversation</li>
|
||||||
<li>Pull and delete models from the app</li>
|
<li>Pull and delete models from the app</li>
|
||||||
<li>Have multiple conversations</li>
|
<li>Have multiple conversations</li>
|
||||||
<li>Image recognition (Only available with LLaVA Model)</li>
|
<li>Image recognition (Only available with compatible models)</li>
|
||||||
<li>Import and export chats</li>
|
<li>Import and export chats</li>
|
||||||
</ul>
|
</ul>
|
||||||
<p>Disclaimer</p>
|
<p>Disclaimer</p>
|
||||||
@@ -36,6 +37,8 @@
|
|||||||
</requires>
|
</requires>
|
||||||
<recommends>
|
<recommends>
|
||||||
<control>keyboard</control>
|
<control>keyboard</control>
|
||||||
|
<control>pointing</control>
|
||||||
|
<control>touch</control>
|
||||||
</recommends>
|
</recommends>
|
||||||
<branding>
|
<branding>
|
||||||
<color type="primary" scheme_preference="light">#8cdef5</color>
|
<color type="primary" scheme_preference="light">#8cdef5</color>
|
||||||
@@ -60,6 +63,105 @@
|
|||||||
<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.3" date="2024-06-01">
|
||||||
|
<url type="details">https://github.com/Jeffser/Alpaca/releases/tag/0.9.3</url>
|
||||||
|
<description>
|
||||||
|
<p>Big Update</p>
|
||||||
|
<ul>
|
||||||
|
<li>Added: Support for GGUF models (experimental)</li>
|
||||||
|
<li>Added: Support for customization and creation of models</li>
|
||||||
|
<li>Fixed: Icons don't appear on non Gnome systems</li>
|
||||||
|
<li>Update Ollama to v0.1.39</li>
|
||||||
|
</ul>
|
||||||
|
</description>
|
||||||
|
</release>
|
||||||
|
<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">
|
||||||
|
<url type="details">https://github.com/Jeffser/Alpaca/releases/tag/0.8.8</url>
|
||||||
|
<description>
|
||||||
|
<p>The fix</p>
|
||||||
|
<ul>
|
||||||
|
<li>Fixed: Ollama instance keeps running on the background even when it is disabled</li>
|
||||||
|
<li>Fixed: Can't pull models on the integrated instance</li>
|
||||||
|
</ul>
|
||||||
|
</description>
|
||||||
|
</release>
|
||||||
|
<release version="0.8.7" date="2024-05-27">
|
||||||
|
<url type="details">https://github.com/Jeffser/Alpaca/releases/tag/0.8.7</url>
|
||||||
|
<description>
|
||||||
|
<p>Quick tweaks</p>
|
||||||
|
<ul>
|
||||||
|
<li>Added progress bar to models that are being pulled</li>
|
||||||
|
<li>Added size to tags when pulling a model</li>
|
||||||
|
<li>General optimizations on the background</li>
|
||||||
|
</ul>
|
||||||
|
</description>
|
||||||
|
</release>
|
||||||
|
<release version="0.8.6" date="2024-05-26">
|
||||||
|
<url type="details">https://github.com/Jeffser/Alpaca/releases/tag/0.8.6</url>
|
||||||
|
<description>
|
||||||
|
<p>Quick fixes</p>
|
||||||
|
<ul>
|
||||||
|
<li>Fixed: Scroll when message is received</li>
|
||||||
|
<li>Fixed: Content doesn't change when creating a new chat</li>
|
||||||
|
<li>Added 'Featured Models' page on welcome dialog</li>
|
||||||
|
</ul>
|
||||||
|
</description>
|
||||||
|
</release>
|
||||||
|
<release version="0.8.5" date="2024-05-26">
|
||||||
|
<url type="details">https://github.com/Jeffser/Alpaca/releases/tag/0.8.5</url>
|
||||||
|
<description>
|
||||||
|
<p>Nice Update</p>
|
||||||
|
<ul>
|
||||||
|
<li>UI tweaks (Thanks Nokse22)</li>
|
||||||
|
<li>General optimizations</li>
|
||||||
|
<li>Metadata fixes</li>
|
||||||
|
</ul>
|
||||||
|
</description>
|
||||||
|
</release>
|
||||||
|
<release version="0.8.1" date="2024-05-24">
|
||||||
|
<url type="details">https://github.com/Jeffser/Alpaca/releases/tag/0.8.1</url>
|
||||||
|
<description>
|
||||||
|
<p>Quick fix</p>
|
||||||
|
<ul>
|
||||||
|
<li>Updated Spanish translation</li>
|
||||||
|
<li>Added compatibility for PNG</li>
|
||||||
|
</ul>
|
||||||
|
</description>
|
||||||
|
</release>
|
||||||
<release version="0.8.0" date="2024-05-24">
|
<release version="0.8.0" date="2024-05-24">
|
||||||
<url type="details">https://github.com/Jeffser/Alpaca/releases/tag/0.8.0</url>
|
<url type="details">https://github.com/Jeffser/Alpaca/releases/tag/0.8.0</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.0',
|
version: '0.9.3',
|
||||||
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')
|
||||||
|
|||||||
@@ -1,3 +1,4 @@
|
|||||||
ru
|
ru
|
||||||
es
|
es
|
||||||
pt_BR
|
pt_BR
|
||||||
|
fr
|
||||||
907
po/alpaca.pot
1052
po/pt_BR.po
1140
po/pt_BR.po~
Normal file
242
po/ru.po
@@ -2,8 +2,8 @@ msgid ""
|
|||||||
msgstr ""
|
msgstr ""
|
||||||
"Project-Id-Version: \n"
|
"Project-Id-Version: \n"
|
||||||
"Report-Msgid-Bugs-To: \n"
|
"Report-Msgid-Bugs-To: \n"
|
||||||
"POT-Creation-Date: 2024-05-22 19:17+0800\n"
|
"POT-Creation-Date: 2024-05-25 10:21+0800\n"
|
||||||
"PO-Revision-Date: 2024-05-22 19:33+0800\n"
|
"PO-Revision-Date: 2024-05-25 10:44+0800\n"
|
||||||
"Last-Translator: \n"
|
"Last-Translator: \n"
|
||||||
"Language-Team: \n"
|
"Language-Team: \n"
|
||||||
"Language: ru_RU\n"
|
"Language: ru_RU\n"
|
||||||
@@ -29,281 +29,297 @@ msgctxt "shortcut window"
|
|||||||
msgid "Quit"
|
msgid "Quit"
|
||||||
msgstr "Выйти"
|
msgstr "Выйти"
|
||||||
|
|
||||||
#: window.py:54 window.py:761
|
#: window.py:57 window.py:783
|
||||||
msgid "New Chat"
|
msgid "New Chat"
|
||||||
msgstr "Новый Чат"
|
msgstr "Новый Чат"
|
||||||
|
|
||||||
#: window.py:100
|
#: window.py:102
|
||||||
msgid "An error occurred"
|
msgid "An error occurred"
|
||||||
msgstr "Произошла ошибка"
|
msgstr "Произошла ошибка"
|
||||||
|
|
||||||
#: window.py:101
|
#: window.py:103
|
||||||
msgid "Failed to connect to server"
|
msgid "Failed to connect to server"
|
||||||
msgstr "Не удалось подключиться к серверу"
|
msgstr "Не удалось подключиться к серверу"
|
||||||
|
|
||||||
#: window.py:102
|
#: window.py:104
|
||||||
msgid "Could not list local models"
|
msgid "Could not list local models"
|
||||||
msgstr "Не удалось перечислить локальные модели"
|
msgstr "Не удалось перечислить локальные модели"
|
||||||
|
|
||||||
#: window.py:103
|
#: window.py:105
|
||||||
msgid "Could not delete model"
|
msgid "Could not delete model"
|
||||||
msgstr "Не удалось удалить модель"
|
msgstr "Не удалось удалить модель"
|
||||||
|
|
||||||
#: window.py:104
|
#: window.py:106
|
||||||
msgid "Could not pull model"
|
msgid "Could not pull model"
|
||||||
msgstr "Не удалось извлечь модель"
|
msgstr "Не удалось извлечь модель"
|
||||||
|
|
||||||
#: window.py:105
|
#: window.py:107
|
||||||
msgid "Cannot open image"
|
msgid "Cannot open image"
|
||||||
msgstr "Не удается открыть изображение"
|
msgstr "Не удается открыть изображение"
|
||||||
|
|
||||||
#: window.py:106
|
#: window.py:108
|
||||||
msgid "Cannot delete chat because it's the only one left"
|
msgid "Cannot delete chat because it's the only one left"
|
||||||
msgstr "Не удается удалить чат, потому что он единственный оставшийся"
|
msgstr "Не удается удалить чат, потому что он единственный оставшийся"
|
||||||
|
|
||||||
#: window.py:107
|
#: window.py:109
|
||||||
msgid "There was an error with the local Ollama instance, so it has been reset"
|
msgid "There was an error with the local Ollama instance, so it has been reset"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
"Произошла ошибка с локальным экземпляром Ollama, поэтому он был сброшен"
|
"Произошла ошибка с локальным экземпляром Ollama, поэтому он был сброшен"
|
||||||
|
|
||||||
#: window.py:110
|
#: window.py:112
|
||||||
msgid "Please select a model before chatting"
|
msgid "Please select a model before chatting"
|
||||||
msgstr "Пожалуйста, выберите модель перед началом общения"
|
msgstr "Пожалуйста, выберите модель перед началом общения"
|
||||||
|
|
||||||
#: window.py:111
|
#: window.py:113
|
||||||
msgid "Chat cannot be cleared while receiving a message"
|
msgid "Chat cannot be cleared while receiving a message"
|
||||||
msgstr "Чат не может быть удален при получении сообщения"
|
msgstr "Чат не может быть удален при получении сообщения"
|
||||||
|
|
||||||
#: window.py:112
|
#: window.py:114
|
||||||
msgid "That tag is already being pulled"
|
msgid "That tag is already being pulled"
|
||||||
msgstr "Этот тег уже удален"
|
msgstr "Этот тег уже удален"
|
||||||
|
|
||||||
#: window.py:113
|
#: window.py:115
|
||||||
msgid "That tag has been pulled alreay"
|
msgid "That tag has been pulled already"
|
||||||
msgstr "Этот тег уже был удален"
|
msgstr "Этот тег уже был удален"
|
||||||
|
|
||||||
#: window.py:116
|
#: window.py:118
|
||||||
msgid "Model deleted successfully"
|
msgid "Model deleted successfully"
|
||||||
msgstr "Модель успешно удалена"
|
msgstr "Модель успешно удалена"
|
||||||
|
|
||||||
#: window.py:117
|
#: window.py:119
|
||||||
msgid "Model pulled successfully"
|
msgid "Model pulled successfully"
|
||||||
msgstr "Модель успешно извлечена"
|
msgstr "Модель успешно извлечена"
|
||||||
|
|
||||||
#: window.py:118
|
#: window.py:120
|
||||||
msgid "Chat exported successfully"
|
msgid "Chat exported successfully"
|
||||||
msgstr "Чат успешно экспортирован"
|
msgstr "Чат успешно экспортирован"
|
||||||
|
|
||||||
#: window.py:119
|
#: window.py:121
|
||||||
msgid "Chat imported successfully"
|
msgid "Chat imported successfully"
|
||||||
msgstr "Чат успешно импортирован"
|
msgstr "Чат успешно импортирован"
|
||||||
|
|
||||||
#: window.py:451
|
#: window.py:476
|
||||||
msgid "Task Complete"
|
msgid "Task Complete"
|
||||||
msgstr "Задача выполнена"
|
msgstr "Задача выполнена"
|
||||||
|
|
||||||
#: window.py:451
|
#: window.py:476
|
||||||
msgid "Model '{}' pulled successfully."
|
msgid "Model '{}' pulled successfully."
|
||||||
msgstr "Модель '{}' успешно извлечена."
|
msgstr "Модель '{}' успешно извлечена."
|
||||||
|
|
||||||
#: window.py:456
|
#: window.py:481
|
||||||
msgid "Pull Model Error"
|
msgid "Pull Model Error"
|
||||||
msgstr "Ошибка Извлечения Модели"
|
msgstr "Ошибка Извлечения Модели"
|
||||||
|
|
||||||
#: window.py:456
|
#: window.py:481
|
||||||
msgid "Failed to pull model '{}' due to network error."
|
msgid "Failed to pull model '{}' due to network error."
|
||||||
msgstr "Не удалось извлечь модель '{}' из-за сетевой ошибки."
|
msgstr "Не удалось извлечь модель '{}' из-за сетевой ошибки."
|
||||||
|
|
||||||
#: window.py:472
|
#: window.py:496
|
||||||
msgid "Stop Model"
|
msgid "Stop Model"
|
||||||
msgstr "Остановить Модель"
|
msgstr "Остановить Модель"
|
||||||
|
|
||||||
#: window.py:473
|
#: window.py:497
|
||||||
msgid "Are you sure you want to stop pulling '{}'?"
|
msgid "Are you sure you want to stop pulling '{}'?"
|
||||||
msgstr "Вы уверены, что хотите прекратить извлечение '{}'?"
|
msgstr "Вы уверены, что хотите прекратить извлечение '{}'?"
|
||||||
|
|
||||||
#: window.py:476 window.py:519 window.py:542 window.py:615 window.py:688
|
#: window.py:500 window.py:543 window.py:566 window.py:638 window.py:711
|
||||||
#: window.py:715 window.py:748 window.py:788
|
#: window.py:737 window.py:769 window.py:810
|
||||||
msgid "Cancel"
|
msgid "Cancel"
|
||||||
msgstr "Отмена"
|
msgstr "Отмена"
|
||||||
|
|
||||||
#: window.py:477
|
#: window.py:501
|
||||||
msgid "Stop"
|
msgid "Stop"
|
||||||
msgstr "Стоп"
|
msgstr "Стоп"
|
||||||
|
|
||||||
#: window.py:515
|
#: window.py:539
|
||||||
msgid "Delete Model"
|
msgid "Delete Model"
|
||||||
msgstr "Удалить Модель"
|
msgstr "Удалить Модель"
|
||||||
|
|
||||||
#: window.py:516 window.py:712
|
#: window.py:540 window.py:734
|
||||||
msgid "Are you sure you want to delete '{}'?"
|
msgid "Are you sure you want to delete '{}'?"
|
||||||
msgstr "Вы уверены, что хотите удалить '{}'?"
|
msgstr "Вы уверены, что хотите удалить '{}'?"
|
||||||
|
|
||||||
#: window.py:520 window.py:716
|
#: window.py:544 window.py:738
|
||||||
msgid "Delete"
|
msgid "Delete"
|
||||||
msgstr "Удалить"
|
msgstr "Удалить"
|
||||||
|
|
||||||
#: window.py:537
|
#: window.py:561
|
||||||
msgid "Pull Model"
|
msgid "Pull Model"
|
||||||
msgstr "Извлечение модели"
|
msgstr "Извлечение модели"
|
||||||
|
|
||||||
#: window.py:538
|
#: window.py:562
|
||||||
msgid "Please select a tag to pull '{}'"
|
msgid "Please select a tag to pull '{}'"
|
||||||
msgstr "Пожалуйста, выберите тег для извлечения '{}'"
|
msgstr "Пожалуйста, выберите тег для извлечения '{}'"
|
||||||
|
|
||||||
#: window.py:543
|
#: window.py:567
|
||||||
msgid "Pull"
|
msgid "Pull"
|
||||||
msgstr "Извлечение"
|
msgstr "Извлечение"
|
||||||
|
|
||||||
#: window.py:611 window.ui:462
|
#: window.py:634 window.ui:446
|
||||||
msgid "Clear Chat"
|
msgid "Clear Chat"
|
||||||
msgstr "Очистить Чат"
|
msgstr "Очистить Чат"
|
||||||
|
|
||||||
#: window.py:612
|
#: window.py:635
|
||||||
msgid "Are you sure you want to clear the chat?"
|
msgid "Are you sure you want to clear the chat?"
|
||||||
msgstr "Вы уверены, что хотите очистить чат?"
|
msgstr "Вы уверены, что хотите очистить чат?"
|
||||||
|
|
||||||
#: window.py:616
|
#: window.py:639
|
||||||
msgid "Clear"
|
msgid "Clear"
|
||||||
msgstr "Очистить"
|
msgstr "Очистить"
|
||||||
|
|
||||||
#: window.py:684
|
#: window.py:707
|
||||||
msgid "Remove Image"
|
msgid "Remove Image"
|
||||||
msgstr "Удалить Изображение"
|
msgstr "Удалить Изображение"
|
||||||
|
|
||||||
#: window.py:685
|
#: window.py:708
|
||||||
msgid "Are you sure you want to remove image?"
|
msgid "Are you sure you want to remove image?"
|
||||||
msgstr "Вы уверены, что хотите удалить изображение?"
|
msgstr "Вы уверены, что хотите удалить изображение?"
|
||||||
|
|
||||||
#: window.py:689
|
#: window.py:712 window.ui:466
|
||||||
msgid "Remove"
|
msgid "Remove"
|
||||||
msgstr "Удалить"
|
msgstr "Удалить"
|
||||||
|
|
||||||
#: window.py:711
|
#: window.py:733
|
||||||
msgid "Delete Chat"
|
msgid "Delete Chat"
|
||||||
msgstr "Удалить Чат"
|
msgstr "Удалить Чат"
|
||||||
|
|
||||||
#: window.py:742
|
#: window.py:763
|
||||||
msgid "Rename Chat"
|
msgid "Rename Chat"
|
||||||
msgstr "Переименовать Чат"
|
msgstr "Переименовать Чат"
|
||||||
|
|
||||||
#: window.py:749
|
#: window.py:770
|
||||||
msgid "Rename"
|
msgid "Rename"
|
||||||
msgstr "Переименовать"
|
msgstr "Переименовать"
|
||||||
|
|
||||||
#: window.py:769
|
#: window.py:791
|
||||||
msgid "The name '{}' is already in use"
|
msgid "The name '{}' is already in use"
|
||||||
msgstr "Имя '{}' уже используется"
|
msgstr "Имя '{}' уже используется"
|
||||||
|
|
||||||
#: window.py:782
|
#: window.py:804
|
||||||
msgid "Create Chat"
|
msgid "Create Chat"
|
||||||
msgstr "Создать Чат"
|
msgstr "Создать Чат"
|
||||||
|
|
||||||
#: window.py:789
|
#: window.py:811
|
||||||
msgid "Create"
|
msgid "Create"
|
||||||
msgstr "Создать"
|
msgstr "Создать"
|
||||||
|
|
||||||
#: window.ui:46
|
#: window.py:914
|
||||||
msgid "Chats"
|
msgid "Connection Error"
|
||||||
msgstr "Чаты"
|
msgstr "Ошибка Соединения"
|
||||||
|
|
||||||
#: window.ui:56
|
#: window.py:915
|
||||||
msgid "Import chat"
|
msgid "The remote instance has disconnected"
|
||||||
msgstr "Импорт чата"
|
msgstr "Удаленный экземпляр отключился"
|
||||||
|
|
||||||
#: window.ui:69
|
#: window.py:919
|
||||||
msgid "Export chat"
|
msgid "Close Alpaca"
|
||||||
msgstr "Экспорт чата"
|
msgstr "Закрыть Программу"
|
||||||
|
|
||||||
#: window.ui:82
|
#: window.py:920
|
||||||
|
msgid "Use local instance"
|
||||||
|
msgstr "Использовать локальный экземпляр"
|
||||||
|
|
||||||
|
#: window.py:921
|
||||||
|
msgid "Connect"
|
||||||
|
msgstr "Подключить"
|
||||||
|
|
||||||
|
#: window.ui:40
|
||||||
msgid "New chat"
|
msgid "New chat"
|
||||||
msgstr "Новый чат"
|
msgstr "Новый чат"
|
||||||
|
|
||||||
#: window.ui:118
|
#: window.ui:49
|
||||||
|
msgid "Import chat"
|
||||||
|
msgstr "Импорт чата"
|
||||||
|
|
||||||
|
#: window.ui:58
|
||||||
|
msgid "Export chat"
|
||||||
|
msgstr "Экспорт чата"
|
||||||
|
|
||||||
|
#: window.ui:90
|
||||||
msgid "Toggle Sidebar"
|
msgid "Toggle Sidebar"
|
||||||
msgstr "Переключение боковой панели"
|
msgstr "Переключение боковой панели"
|
||||||
|
|
||||||
#: window.ui:139 window.ui:315
|
#: window.ui:111 window.ui:303
|
||||||
msgid "Manage models"
|
msgid "Manage models"
|
||||||
msgstr "Управление моделями"
|
msgstr "Управление моделями"
|
||||||
|
|
||||||
#: window.ui:153
|
#: window.ui:125
|
||||||
msgid "Menu"
|
msgid "Menu"
|
||||||
msgstr "Меню"
|
msgstr "Меню"
|
||||||
|
|
||||||
#: window.ui:231
|
#: window.ui:216
|
||||||
msgid "Send"
|
msgid "Send"
|
||||||
msgstr "Отправить"
|
msgstr "Отправить"
|
||||||
|
|
||||||
#: window.ui:240
|
#: window.ui:225
|
||||||
msgid "Requires model 'llava' to be selected"
|
msgid "Only available on selected models"
|
||||||
msgstr "Требуется выбрать модель \"llava\""
|
msgstr "Доступно только для некоторых моделей"
|
||||||
|
|
||||||
#: window.ui:243
|
#: window.ui:228
|
||||||
msgid "Image"
|
msgid "Image"
|
||||||
msgstr "Изображение"
|
msgstr "Изображение"
|
||||||
|
|
||||||
#: window.ui:266 window.ui:466 window.ui:517
|
#: window.ui:254 window.ui:450 window.ui:508
|
||||||
msgid "Preferences"
|
msgid "Preferences"
|
||||||
msgstr "Настройки"
|
msgstr "Настройки"
|
||||||
|
|
||||||
#: window.ui:269 window.ui:501
|
#: window.ui:257 window.ui:492
|
||||||
msgid "General"
|
msgid "General"
|
||||||
msgstr "Общие"
|
msgstr "Общие"
|
||||||
|
|
||||||
#: window.ui:273
|
#: window.ui:261
|
||||||
msgid "Remote Connection"
|
msgid "Remote Connection"
|
||||||
msgstr "Удаленное подключение"
|
msgstr "Удаленное подключение"
|
||||||
|
|
||||||
#: window.ui:274
|
#: window.ui:262
|
||||||
msgid "Manage a remote connection to Ollama"
|
msgid "Manage a remote connection to Ollama"
|
||||||
msgstr "Управление удаленным подключением к Ollama"
|
msgstr "Управление удаленным подключением к Ollama"
|
||||||
|
|
||||||
#: window.ui:277
|
#: window.ui:265
|
||||||
msgid "Use remote connection"
|
msgid "Use remote connection"
|
||||||
msgstr "Использовать удаленное подключение"
|
msgstr "Использовать удаленное подключение"
|
||||||
|
|
||||||
#: window.ui:282
|
#: window.ui:270
|
||||||
msgid "URL of remote instance"
|
msgid "URL of remote instance"
|
||||||
msgstr "URL-адрес удаленного экземпляра"
|
msgstr "URL-адрес удаленного экземпляра"
|
||||||
|
|
||||||
#: window.ui:290
|
#: window.ui:278
|
||||||
msgid "Behavior"
|
msgid "Behavior"
|
||||||
msgstr "Поведение"
|
msgstr "Поведение"
|
||||||
|
|
||||||
#: window.ui:291
|
#: window.ui:279
|
||||||
msgid "Manage Alpaca's Behavior"
|
msgid "Manage Alpaca's Behavior"
|
||||||
msgstr "Управление поведением Alpaca"
|
msgstr "Управление поведением Alpaca"
|
||||||
|
|
||||||
#: window.ui:294
|
#: window.ui:282
|
||||||
msgid "Run in background"
|
msgid "Run in background"
|
||||||
msgstr "Запуск в фоновом режиме"
|
msgstr "Запуск в фоновом режиме"
|
||||||
|
|
||||||
#: window.ui:385
|
#: window.ui:371
|
||||||
msgid "Previous"
|
msgid "Previous"
|
||||||
msgstr "Предыдущий"
|
msgstr "Предыдущий"
|
||||||
|
|
||||||
#: window.ui:400
|
#: window.ui:386
|
||||||
msgid "Next"
|
msgid "Next"
|
||||||
msgstr "Следующий"
|
msgstr "Следующий"
|
||||||
|
|
||||||
#: window.ui:426
|
#: window.ui:412
|
||||||
msgid "Welcome to Alpaca"
|
msgid "Welcome to Alpaca"
|
||||||
msgstr "Добро пожаловать в Alpaca"
|
msgstr "Добро пожаловать в Alpaca"
|
||||||
|
|
||||||
#: window.ui:427
|
#: window.ui:413
|
||||||
msgid "Powered by Ollama"
|
msgid "Powered by Ollama"
|
||||||
msgstr "При поддержке Ollama"
|
msgstr "При поддержке Ollama"
|
||||||
|
|
||||||
#: window.ui:430
|
#: window.ui:416
|
||||||
msgid "Ollama Website"
|
msgid "Ollama Website"
|
||||||
msgstr "Веб-сайт Ollama"
|
msgstr "Веб-сайт Ollama"
|
||||||
|
|
||||||
#: window.ui:446
|
#: window.ui:432
|
||||||
msgid "Disclaimer"
|
msgid "Disclaimer"
|
||||||
msgstr "Отказ от ответственности"
|
msgstr "Отказ от ответственности"
|
||||||
|
|
||||||
#: window.ui:447
|
#: window.ui:433
|
||||||
msgid ""
|
msgid ""
|
||||||
"Alpaca and its developers are not liable for any damages to devices or "
|
"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. "
|
"software resulting from the execution of code generated by an AI model. "
|
||||||
@@ -315,46 +331,92 @@ msgstr ""
|
|||||||
"Пожалуйста, будьте осторожны и внимательно ознакомьтесь с кодом перед его "
|
"Пожалуйста, будьте осторожны и внимательно ознакомьтесь с кодом перед его "
|
||||||
"запуском."
|
"запуском."
|
||||||
|
|
||||||
#: window.ui:470
|
#: window.ui:454
|
||||||
msgid "Keyboard Shortcuts"
|
msgid "Keyboard Shortcuts"
|
||||||
msgstr "Комбинации Клавиш"
|
msgstr "Комбинации Клавиш"
|
||||||
|
|
||||||
#: window.ui:474
|
#: window.ui:458
|
||||||
msgid "About Alpaca"
|
msgid "About Alpaca"
|
||||||
msgstr "О Программе"
|
msgstr "О Программе"
|
||||||
|
|
||||||
#: window.ui:505
|
#: window.ui:496
|
||||||
msgid "Close application"
|
msgid "Close application"
|
||||||
msgstr "Закрыть приложение"
|
msgstr "Закрыть приложение"
|
||||||
|
|
||||||
#: window.ui:511
|
#: window.ui:502
|
||||||
msgid "Clear chat"
|
msgid "Clear chat"
|
||||||
msgstr "Очистить чат"
|
msgstr "Очистить чат"
|
||||||
|
|
||||||
#: window.ui:523
|
#: window.ui:514
|
||||||
msgid "Show shortcuts window"
|
msgid "Show shortcuts window"
|
||||||
msgstr "Показать окно комбинаций клавиш"
|
msgstr "Показать окно комбинаций клавиш"
|
||||||
|
|
||||||
#: window.ui:530
|
#: window.ui:521
|
||||||
msgid "Editor"
|
msgid "Editor"
|
||||||
msgstr "Редактор"
|
msgstr "Редактор"
|
||||||
|
|
||||||
#: window.ui:534
|
#: window.ui:525
|
||||||
msgid "Copy"
|
msgid "Copy"
|
||||||
msgstr "Копировать"
|
msgstr "Копировать"
|
||||||
|
|
||||||
#: window.ui:540
|
#: window.ui:531
|
||||||
msgid "Paste"
|
msgid "Paste"
|
||||||
msgstr "Вставить"
|
msgstr "Вставить"
|
||||||
|
|
||||||
#: window.ui:546
|
#: window.ui:537
|
||||||
|
msgid "Insert new line"
|
||||||
|
msgstr "Вставить новую строку"
|
||||||
|
|
||||||
|
#: window.ui:543
|
||||||
msgid "Send Message"
|
msgid "Send Message"
|
||||||
msgstr "Отправить Сообщение"
|
msgstr "Отправить Сообщение"
|
||||||
|
|
||||||
|
#, fuzzy
|
||||||
|
#~ msgid "Alpaca"
|
||||||
|
#~ msgstr "О Программе"
|
||||||
|
|
||||||
|
#, fuzzy
|
||||||
|
#~ msgid "Chat with local AI models"
|
||||||
|
#~ msgstr "Не удалось перечислить локальные модели"
|
||||||
|
|
||||||
|
#, fuzzy
|
||||||
|
#~ msgid "An Ollama client"
|
||||||
|
#~ msgstr "Веб-сайт Ollama"
|
||||||
|
|
||||||
|
#, fuzzy
|
||||||
|
#~ msgid "Import and export chats"
|
||||||
|
#~ msgstr "Импорт чата"
|
||||||
|
|
||||||
|
#, fuzzy
|
||||||
|
#~ msgid "Managing models"
|
||||||
|
#~ msgstr "Управление моделями"
|
||||||
|
|
||||||
|
#, fuzzy
|
||||||
|
#~ msgid "New Update"
|
||||||
|
#~ msgstr "Новый Чат"
|
||||||
|
|
||||||
|
#, fuzzy
|
||||||
|
#~ msgid "Fixed remote connections"
|
||||||
|
#~ msgstr "Использовать удаленное подключение"
|
||||||
|
|
||||||
#, fuzzy
|
#, fuzzy
|
||||||
#~ msgid "Added basic shortcuts"
|
#~ msgid "Added basic shortcuts"
|
||||||
#~ msgstr "Показывать ярлыки"
|
#~ msgstr "Показывать ярлыки"
|
||||||
|
|
||||||
|
#, fuzzy
|
||||||
|
#~ msgid "New Features"
|
||||||
|
#~ msgstr "Новый Чат"
|
||||||
|
|
||||||
|
#, fuzzy
|
||||||
|
#~ msgid "A button to clear the chat"
|
||||||
|
#~ msgstr "Вы уверены, что хотите очистить чат?"
|
||||||
|
|
||||||
|
#~ msgid "Chats"
|
||||||
|
#~ msgstr "Чаты"
|
||||||
|
|
||||||
|
#~ msgid "Requires model 'llava' to be selected"
|
||||||
|
#~ msgstr "Требуется выбрать модель \"llava\""
|
||||||
|
|
||||||
#~ msgid "Save Changes"
|
#~ msgid "Save Changes"
|
||||||
#~ msgstr "Сохранить Изменения"
|
#~ msgstr "Сохранить Изменения"
|
||||||
|
|
||||||
|
|||||||
@@ -3,6 +3,24 @@
|
|||||||
<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/chat-message-new-symbolic.svg">icons/chat-message-new-symbolic.svg</file>
|
||||||
|
<file alias="icons/scalable/status/dialog-warning-symbolic.svg">icons/dialog-warning-symbolic.svg</file>
|
||||||
|
<file alias="icons/scalable/status/document-edit-symbolic.svg">icons/document-edit-symbolic.svg</file>
|
||||||
|
<file alias="icons/scalable/status/edit-copy-symbolic.svg">icons/edit-copy-symbolic.svg</file>
|
||||||
|
<file alias="icons/scalable/status/folder-download-symbolic.svg">icons/folder-download-symbolic.svg</file>
|
||||||
|
<file alias="icons/scalable/status/image-x-generic-symbolic.svg">icons/image-x-generic-symbolic.svg</file>
|
||||||
|
<file alias="icons/scalable/status/media-playback-stop-symbolic.svg">icons/media-playback-stop-symbolic.svg</file>
|
||||||
|
<file alias="icons/scalable/status/open-menu-symbolicsvg">icons/open-menu-symbolic.svg</file>
|
||||||
|
<file alias="icons/scalable/status/preferences-other-symbolic.svg">icons/preferences-other-symbolic.svg</file>
|
||||||
|
<file alias="icons/scalable/status/preferences-system-symbolic.svg">icons/preferences-system-symbolic.svg</file>
|
||||||
|
<file alias="icons/scalable/status/sidebar-show-symbolic.svg">icons/sidebar-show-symbolic.svg</file>
|
||||||
|
<file alias="icons/scalable/status/user-trash-symbolic.svg">icons/user-trash-symbolic.svg</file>
|
||||||
|
<file alias="icons/scalable/status/view-more-symbolic.svg">icons/view-more-symbolic.svg</file>
|
||||||
|
<file alias="icons/scalable/status/document-open-symbolic.svg">icons/document-open-symbolic.svg</file>
|
||||||
|
<file alias="icons/scalable/status/list-add-symbolic.svg">icons/list-add-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>
|
||||||
|
|||||||
127
src/alpaca_search_provider.in
Normal file
@@ -0,0 +1,127 @@
|
|||||||
|
#!@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,
|
||||||
|
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="aa{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="u" name="timestamp" direction="in" />
|
||||||
|
</method>
|
||||||
|
|
||||||
|
<method name="LaunchSearch">
|
||||||
|
<arg type="as" name="terms" direction="in" />
|
||||||
|
<arg type="u" 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")
|
||||||
@@ -1,6 +1,8 @@
|
|||||||
# connectionhandler.py
|
# connectionhandler.py
|
||||||
import json, requests
|
import json, requests
|
||||||
|
|
||||||
|
url = None
|
||||||
|
|
||||||
def simple_get(connection_url:str) -> dict:
|
def simple_get(connection_url:str) -> dict:
|
||||||
try:
|
try:
|
||||||
response = requests.get(connection_url)
|
response = requests.get(connection_url)
|
||||||
@@ -11,6 +13,19 @@ def simple_get(connection_url:str) -> dict:
|
|||||||
except Exception as e:
|
except Exception as e:
|
||||||
return {"status": "error", "status_code": 0}
|
return {"status": "error", "status_code": 0}
|
||||||
|
|
||||||
|
def simple_post(connection_url:str, data) -> dict:
|
||||||
|
try:
|
||||||
|
headers = {
|
||||||
|
"Content-Type": "application/json"
|
||||||
|
}
|
||||||
|
response = requests.post(connection_url, headers=headers, data=data, stream=False)
|
||||||
|
if response.status_code == 200:
|
||||||
|
return {"status": "ok", "text": response.text, "status_code": response.status_code}
|
||||||
|
else:
|
||||||
|
return {"status": "error", "status_code": response.status_code}
|
||||||
|
except Exception as e:
|
||||||
|
return {"status": "error", "status_code": 0}
|
||||||
|
|
||||||
def simple_delete(connection_url:str, data) -> dict:
|
def simple_delete(connection_url:str, data) -> dict:
|
||||||
try:
|
try:
|
||||||
response = requests.delete(connection_url, json=data)
|
response = requests.delete(connection_url, json=data)
|
||||||
@@ -36,26 +51,3 @@ def stream_post(connection_url:str, data, callback:callable) -> dict:
|
|||||||
return {"status": "error", "status_code": response.status_code}
|
return {"status": "error", "status_code": response.status_code}
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
return {"status": "error", "status_code": 0}
|
return {"status": "error", "status_code": 0}
|
||||||
|
|
||||||
|
|
||||||
from time import sleep
|
|
||||||
def stream_post_fake(connection_url:str, data, callback:callable) -> dict:
|
|
||||||
data = {
|
|
||||||
"status": "pulling manifest"
|
|
||||||
}
|
|
||||||
callback(data)
|
|
||||||
for i in range(2):
|
|
||||||
for a in range(11):
|
|
||||||
sleep(.1)
|
|
||||||
data = {
|
|
||||||
"status": f"downloading digestname {i}",
|
|
||||||
"digest": f"digestname {i}",
|
|
||||||
"total": 500,
|
|
||||||
"completed": a * 50
|
|
||||||
}
|
|
||||||
callback(data)
|
|
||||||
for msg in ["verifying sha256 digest", "writting manifest", "removing any unused layers", "success"]:
|
|
||||||
sleep(.1)
|
|
||||||
data = {"status": msg}
|
|
||||||
callback(data)
|
|
||||||
return {"status": "ok", "status_code": 200}
|
|
||||||
|
|||||||
269
src/dialogs.py
Normal file
@@ -0,0 +1,269 @@
|
|||||||
|
# dialogs.py
|
||||||
|
|
||||||
|
from gi.repository import Adw, Gtk, Gdk, GLib, GtkSource, Gio, GdkPixbuf
|
||||||
|
from .available_models import available_models
|
||||||
|
|
||||||
|
# CLEAR CHAT | WORKS
|
||||||
|
|
||||||
|
def clear_chat_response(self, dialog, task):
|
||||||
|
if dialog.choose_finish(task) == "clear":
|
||||||
|
self.clear_chat()
|
||||||
|
|
||||||
|
def clear_chat(self):
|
||||||
|
if self.bot_message is not None:
|
||||||
|
self.show_toast("info", 1, self.main_overlay)
|
||||||
|
return
|
||||||
|
dialog = Adw.AlertDialog(
|
||||||
|
heading=_("Clear Chat"),
|
||||||
|
body=_("Are you sure you want to clear the chat?"),
|
||||||
|
close_response="cancel"
|
||||||
|
)
|
||||||
|
dialog.add_response("cancel", _("Cancel"))
|
||||||
|
dialog.add_response("clear", _("Clear"))
|
||||||
|
dialog.set_response_appearance("clear", Adw.ResponseAppearance.DESTRUCTIVE)
|
||||||
|
dialog.choose(
|
||||||
|
parent = self,
|
||||||
|
cancellable = None,
|
||||||
|
callback = lambda dialog, task: clear_chat_response(self, dialog, task)
|
||||||
|
)
|
||||||
|
|
||||||
|
# DELETE CHAT | WORKS
|
||||||
|
|
||||||
|
def delete_chat_response(self, dialog, task, chat_name):
|
||||||
|
if dialog.choose_finish(task) == "delete":
|
||||||
|
self.delete_chat(chat_name)
|
||||||
|
|
||||||
|
def delete_chat(self, chat_name):
|
||||||
|
dialog = Adw.AlertDialog(
|
||||||
|
heading=_("Delete Chat"),
|
||||||
|
body=_("Are you sure you want to delete '{}'?").format(chat_name),
|
||||||
|
close_response="cancel"
|
||||||
|
)
|
||||||
|
dialog.add_response("cancel", _("Cancel"))
|
||||||
|
dialog.add_response("delete", _("Delete"))
|
||||||
|
dialog.set_response_appearance("delete", Adw.ResponseAppearance.DESTRUCTIVE)
|
||||||
|
dialog.choose(
|
||||||
|
parent = self,
|
||||||
|
cancellable = None,
|
||||||
|
callback = lambda dialog, task, chat_name=chat_name: delete_chat_response(self, dialog, task, chat_name)
|
||||||
|
)
|
||||||
|
|
||||||
|
# RENAME CHAT | WORKS
|
||||||
|
|
||||||
|
def rename_chat_response(self, dialog, task, old_chat_name, entry, label_element):
|
||||||
|
if not entry: return
|
||||||
|
new_chat_name = entry.get_text()
|
||||||
|
if old_chat_name == new_chat_name: return
|
||||||
|
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)
|
||||||
|
|
||||||
|
def rename_chat(self, label_element):
|
||||||
|
chat_name = label_element.get_parent().get_name()
|
||||||
|
entry = Gtk.Entry()
|
||||||
|
dialog = Adw.AlertDialog(
|
||||||
|
heading=_("Rename Chat"),
|
||||||
|
body=_("Renaming '{}'").format(chat_name),
|
||||||
|
extra_child=entry,
|
||||||
|
close_response="cancel"
|
||||||
|
)
|
||||||
|
entry.connect("activate", lambda dialog, old_chat_name=chat_name, entry=entry, label_element=label_element: rename_chat_response(self, dialog, None, old_chat_name, entry, label_element))
|
||||||
|
dialog.add_response("cancel", _("Cancel"))
|
||||||
|
dialog.add_response("rename", _("Rename"))
|
||||||
|
dialog.set_response_appearance("rename", Adw.ResponseAppearance.SUGGESTED)
|
||||||
|
dialog.choose(
|
||||||
|
parent = self,
|
||||||
|
cancellable = None,
|
||||||
|
callback = lambda dialog, task, old_chat_name=chat_name, entry=entry, label_element=label_element: rename_chat_response(self, dialog, task, old_chat_name, entry, label_element)
|
||||||
|
)
|
||||||
|
|
||||||
|
# NEW CHAT | WORKS | UNUSED REASON: The 'Add Chat' button now creates a chat without a name AKA "New Chat"
|
||||||
|
|
||||||
|
def new_chat_response(self, dialog, task, entry):
|
||||||
|
chat_name = _("New Chat")
|
||||||
|
if entry is not None and entry.get_text() != "": chat_name = entry.get_text()
|
||||||
|
if chat_name and (task is None or dialog.choose_finish(task) == "create"):
|
||||||
|
self.new_chat(chat_name)
|
||||||
|
|
||||||
|
|
||||||
|
def new_chat(self):
|
||||||
|
entry = Gtk.Entry()
|
||||||
|
dialog = Adw.AlertDialog(
|
||||||
|
heading=_("Create Chat"),
|
||||||
|
body=_("Enter name for new chat"),
|
||||||
|
extra_child=entry,
|
||||||
|
close_response="cancel"
|
||||||
|
)
|
||||||
|
entry.connect("activate", lambda dialog, entry: new_chat_response(self, dialog, None, entry))
|
||||||
|
dialog.add_response("cancel", _("Cancel"))
|
||||||
|
dialog.add_response("create", _("Create"))
|
||||||
|
dialog.set_response_appearance("create", Adw.ResponseAppearance.SUGGESTED)
|
||||||
|
dialog.choose(
|
||||||
|
parent = self,
|
||||||
|
cancellable = None,
|
||||||
|
callback = lambda dialog, task, entry=entry: new_chat_response(self, dialog, task, entry)
|
||||||
|
)
|
||||||
|
|
||||||
|
# STOP PULL MODEL | WORKS
|
||||||
|
|
||||||
|
def stop_pull_model_response(self, dialog, task, model_name):
|
||||||
|
if dialog.choose_finish(task) == "stop":
|
||||||
|
self.stop_pull_model(model_name)
|
||||||
|
|
||||||
|
def stop_pull_model(self, model_name):
|
||||||
|
dialog = Adw.AlertDialog(
|
||||||
|
heading=_("Stop Model"),
|
||||||
|
body=_("Are you sure you want to stop pulling '{}'?").format(model_name),
|
||||||
|
close_response="cancel"
|
||||||
|
)
|
||||||
|
dialog.add_response("cancel", _("Cancel"))
|
||||||
|
dialog.add_response("stop", _("Stop"))
|
||||||
|
dialog.set_response_appearance("stop", Adw.ResponseAppearance.DESTRUCTIVE)
|
||||||
|
dialog.choose(
|
||||||
|
parent = self.manage_models_dialog,
|
||||||
|
cancellable = None,
|
||||||
|
callback = lambda dialog, task, model_name = model_name: stop_pull_model_response(self, dialog, task, model_name)
|
||||||
|
)
|
||||||
|
|
||||||
|
# DELETE MODEL | WORKS
|
||||||
|
|
||||||
|
def delete_model_response(self, dialog, task, model_name):
|
||||||
|
if dialog.choose_finish(task) == "delete":
|
||||||
|
self.delete_model(model_name)
|
||||||
|
|
||||||
|
def delete_model(self, model_name):
|
||||||
|
dialog = Adw.AlertDialog(
|
||||||
|
heading=_("Delete Model"),
|
||||||
|
body=_("Are you sure you want to delete '{}'?").format(model_name),
|
||||||
|
close_response="cancel"
|
||||||
|
)
|
||||||
|
dialog.add_response("cancel", _("Cancel"))
|
||||||
|
dialog.add_response("delete", _("Delete"))
|
||||||
|
dialog.set_response_appearance("delete", Adw.ResponseAppearance.DESTRUCTIVE)
|
||||||
|
dialog.choose(
|
||||||
|
parent = self.manage_models_dialog,
|
||||||
|
cancellable = None,
|
||||||
|
callback = lambda dialog, task, model_name = model_name: delete_model_response(self, dialog, task, model_name)
|
||||||
|
)
|
||||||
|
|
||||||
|
# PULL MODEL | WORKS
|
||||||
|
|
||||||
|
def pull_model_response(self, dialog, task, model_name, tag_drop_down):
|
||||||
|
if dialog.choose_finish(task) == "pull":
|
||||||
|
model = f"{model_name}:{tag_drop_down.get_selected_item().get_string().split(' | ')[0]}"
|
||||||
|
self.pull_model(model)
|
||||||
|
|
||||||
|
def pull_model(self, model_name):
|
||||||
|
tag_list = Gtk.StringList()
|
||||||
|
for tag in available_models[model_name]['tags']:
|
||||||
|
tag_list.append(f"{tag[0]} | {tag[1]}")
|
||||||
|
tag_drop_down = Gtk.DropDown(
|
||||||
|
enable_search=True,
|
||||||
|
model=tag_list
|
||||||
|
)
|
||||||
|
dialog = Adw.AlertDialog(
|
||||||
|
heading=_("Pull Model"),
|
||||||
|
body=_("Please select a tag to pull '{}'").format(model_name),
|
||||||
|
extra_child=tag_drop_down,
|
||||||
|
close_response="cancel"
|
||||||
|
)
|
||||||
|
dialog.add_response("cancel", _("Cancel"))
|
||||||
|
dialog.add_response("pull", _("Pull"))
|
||||||
|
dialog.set_response_appearance("pull", Adw.ResponseAppearance.SUGGESTED)
|
||||||
|
dialog.choose(
|
||||||
|
parent = self.manage_models_dialog,
|
||||||
|
cancellable = None,
|
||||||
|
callback = lambda dialog, task, model_name = model_name, tag_drop_down = tag_drop_down: pull_model_response(self, dialog, task, model_name, tag_drop_down)
|
||||||
|
)
|
||||||
|
|
||||||
|
# REMOVE IMAGE | WORKS
|
||||||
|
|
||||||
|
def remove_image_response(self, dialog, task):
|
||||||
|
if dialog.choose_finish(task) == 'remove':
|
||||||
|
self.remove_image()
|
||||||
|
|
||||||
|
def remove_image(self):
|
||||||
|
dialog = Adw.AlertDialog(
|
||||||
|
heading=_("Remove Image"),
|
||||||
|
body=_("Are you sure you want to remove image?"),
|
||||||
|
close_response="cancel"
|
||||||
|
)
|
||||||
|
dialog.add_response("cancel", _("Cancel"))
|
||||||
|
dialog.add_response("remove", _("Remove"))
|
||||||
|
dialog.set_response_appearance("remove", Adw.ResponseAppearance.DESTRUCTIVE)
|
||||||
|
dialog.choose(
|
||||||
|
parent = self,
|
||||||
|
cancellable = None,
|
||||||
|
callback = lambda dialog, task: remove_image_response(self, dialog, task)
|
||||||
|
)
|
||||||
|
|
||||||
|
# RECONNECT REMOTE | WORKS
|
||||||
|
|
||||||
|
def reconnect_remote_response(self, dialog, task, entry):
|
||||||
|
response = dialog.choose_finish(task)
|
||||||
|
if not task or response == "remote":
|
||||||
|
self.connect_remote(entry.get_text())
|
||||||
|
elif response == "local":
|
||||||
|
self.connect_local()
|
||||||
|
elif response == "close":
|
||||||
|
self.destroy()
|
||||||
|
|
||||||
|
def reconnect_remote(self, current_url):
|
||||||
|
entry = Gtk.Entry(
|
||||||
|
css_classes = ["error"],
|
||||||
|
text = current_url
|
||||||
|
)
|
||||||
|
dialog = Adw.AlertDialog(
|
||||||
|
heading=_("Connection Error"),
|
||||||
|
body=_("The remote instance has disconnected"),
|
||||||
|
extra_child=entry
|
||||||
|
)
|
||||||
|
entry.connect("activate", lambda entry, dialog: reconnect_remote_response(self, dialog, None, entry))
|
||||||
|
dialog.add_response("close", _("Close Alpaca"))
|
||||||
|
dialog.add_response("local", _("Use local instance"))
|
||||||
|
dialog.add_response("remote", _("Connect"))
|
||||||
|
dialog.set_response_appearance("remote", Adw.ResponseAppearance.SUGGESTED)
|
||||||
|
dialog.choose(
|
||||||
|
parent = self,
|
||||||
|
cancellable = None,
|
||||||
|
callback = lambda dialog, task, entry=entry: reconnect_remote_response(self, dialog, task, entry)
|
||||||
|
)
|
||||||
|
|
||||||
|
# CREATE MODEL |
|
||||||
|
|
||||||
|
def create_model_from_existing_response(self, dialog, task, dropdown):
|
||||||
|
model = dropdown.get_selected_item().get_string()
|
||||||
|
if dialog.choose_finish(task) == 'accept' and model:
|
||||||
|
self.create_model(model, False)
|
||||||
|
|
||||||
|
def create_model_from_existing(self):
|
||||||
|
string_list = Gtk.StringList()
|
||||||
|
for model in self.local_models:
|
||||||
|
string_list.append(model)
|
||||||
|
|
||||||
|
dropdown = Gtk.DropDown()
|
||||||
|
dropdown.set_model(string_list)
|
||||||
|
dialog = Adw.AlertDialog(
|
||||||
|
heading=_("Select Model"),
|
||||||
|
body=_("This model will be used as the base for the new model"),
|
||||||
|
extra_child=dropdown
|
||||||
|
)
|
||||||
|
dialog.add_response("cancel", _("Cancel"))
|
||||||
|
dialog.add_response("accept", _("Accept"))
|
||||||
|
dialog.set_response_appearance("accept", Adw.ResponseAppearance.SUGGESTED)
|
||||||
|
dialog.choose(
|
||||||
|
parent = self,
|
||||||
|
cancellable = None,
|
||||||
|
callback = lambda dialog, task, dropdown=dropdown: create_model_from_existing_response(self, dialog, task, dropdown)
|
||||||
|
)
|
||||||
|
|
||||||
|
def create_model_from_file_response(self, file_dialog, result):
|
||||||
|
try: file = file_dialog.open_finish(result)
|
||||||
|
except: return
|
||||||
|
try:
|
||||||
|
self.create_model(file.get_path(), True)
|
||||||
|
except Exception as e:
|
||||||
|
self.show_toast("error", 5, self.main_overlay) ##TODO NEW ERROR MESSAGE
|
||||||
|
|
||||||
|
def create_model_from_file(self):
|
||||||
|
file_dialog = Gtk.FileDialog(default_filter=self.file_filter_gguf)
|
||||||
|
file_dialog.open(self, None, lambda file_dialog, result: create_model_from_file_response(self, file_dialog, result))
|
||||||
4
src/icons/chat-message-new-symbolic.svg
Normal file
@@ -0,0 +1,4 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<svg height="16px" viewBox="0 0 16 16" width="16px" xmlns="http://www.w3.org/2000/svg">
|
||||||
|
<path d="m 3 1 c -1.644531 0 -3 1.355469 -3 3 v 6 c 0 1.644531 1.355469 3 3 3 h 1 v 3 l 3 -3 v -1 c 0 -0.550781 -0.449219 -1 -1 -1 h -3 c -0.570312 0 -1 -0.429688 -1 -1 v -6 c 0 -0.554688 0.445312 -1 1 -1 h 10 c 0.554688 0 1 0.445312 1 1 v 4 c 0 0.550781 0.449219 1 1 1 s 1 -0.449219 1 -1 v -4 c 0 -1.644531 -1.355469 -3 -3 -3 z m 8 7 v 3 h -3 v 2 h 3 v 3 h 2 v -3 h 3 v -2 h -3 v -3 z m 0 0" fill="#2e3436"/>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 548 B |
4
src/icons/dialog-warning-symbolic.svg
Normal file
@@ -0,0 +1,4 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<svg height="16px" viewBox="0 0 16 16" width="16px" xmlns="http://www.w3.org/2000/svg">
|
||||||
|
<path d="m 7.90625 0.09375 c -0.527344 -0.0273438 -1.039062 0.28125 -1.4375 0.96875 l -6.25 11.59375 c -0.535156 0.964844 0.046875 2.34375 1.09375 2.34375 h 13.15625 c 0.980469 0 1.902344 -1.160156 1.21875 -2.34375 l -6.3125 -11.53125 c -0.398438 -0.644531 -0.941406 -1.003906 -1.46875 -1.03125 z m 1.09375 3.90625 v 5 c 0.007812 0.527344 -0.472656 1 -1 1 s -1.007812 -0.472656 -1 -1 v -5 z m -1 7 c 0.550781 0 1 0.449219 1 1 s -0.449219 1 -1 1 s -1 -0.449219 -1 -1 s 0.449219 -1 1 -1 z m 0 0" fill="#2e3436"/>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 649 B |
4
src/icons/document-edit-symbolic.svg
Normal file
@@ -0,0 +1,4 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<svg height="16px" viewBox="0 0 16 16" width="16px" xmlns="http://www.w3.org/2000/svg">
|
||||||
|
<path d="m 12.277344 0.832031 c -0.578125 0.007813 -1.167969 0.230469 -1.691406 0.753907 l -9 9 c -0.375 0.375 -0.585938 0.882812 -0.585938 1.414062 v 3 h 3 c 0.53125 0 1.039062 -0.210938 1.414062 -0.585938 l 9 -9 c 1.789063 -1.789062 0.082032 -4.390624 -1.890624 -4.570312 c -0.082032 -0.011719 -0.164063 -0.011719 -0.246094 -0.011719 z m -1.777344 3.605469 l 1.0625 1.0625 l -7.0625 7.0625 l -1.0625 -1.0625 z m 0 0" fill="#2e3436"/>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 574 B |
7
src/icons/document-open-symbolic.svg
Normal file
@@ -0,0 +1,7 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<svg height="16px" viewBox="0 0 16 16" width="16px" xmlns="http://www.w3.org/2000/svg">
|
||||||
|
<g fill="#2e3436">
|
||||||
|
<path d="m 3 1 c -1.644531 0 -3 1.355469 -3 3 v 8 c 0 1.644531 1.355469 3 3 3 h 8.882812 c 0.832032 0 1.578126 -0.402344 2.054688 -0.9375 c 0.472656 -0.53125 0.738281 -1.167969 0.910156 -1.800781 l 0.972656 -2.609375 c 0.390626 -1.449219 -0.09375 -2.652344 -0.820312 -3.167969 c -0.484375 -0.34375 -0.714844 -0.292969 -1 -0.324219 v -1.160156 c 0 -0.855469 -0.558594 -1.589844 -1.09375 -1.828125 c -0.53125 -0.238281 -1.011719 -0.167969 -1.011719 -0.167969 l 0.105469 -0.003906 h -3.585938 l -1.707031 -1.707031 c -0.1875 -0.1875 -0.441406 -0.292969 -0.707031 -0.292969 z m 0 2 h 2.585938 l 1.707031 1.707031 c 0.1875 0.1875 0.441406 0.292969 0.707031 0.292969 h 4 c 0.035156 0 0.070312 -0.003906 0.105469 -0.007812 c 0 0 0.019531 0.019531 -0.011719 0.003906 c -0.035156 -0.011719 -0.09375 -0.25 -0.09375 0.003906 v 2 c 0 0.550781 0.449219 1 1 1 c 1 0 1.046875 0.703125 0.886719 1.128906 l -0.972657 2.609375 c -0.117187 0.4375 -0.296874 0.800781 -0.472656 0.996094 c -0.175781 0.199219 -0.285156 0.265625 -0.558594 0.265625 h -8.882812 c -0.570312 0 -1 -0.429688 -1 -1 v -8 c 0 -0.570312 0.46875 -0.792969 1 -1 z m 0 0"/>
|
||||||
|
<path d="m 7 6 l 0.042969 0.003906 c -0.914063 -0.042968 -1.75 0.390625 -2.195313 0.96875 c -0.710937 1.222656 -1.15625 2.277344 -1.800781 3.71875 c -0.171875 0.523438 0.117187 1.089844 0.640625 1.261719 c 0.527344 0.171875 1.09375 -0.117187 1.261719 -0.640625 c 0.488281 -1.011719 0.921875 -1.816406 1.339843 -2.808594 c 0.210938 -0.503906 0.703126 -0.492187 0.898438 -0.503906 h 5.8125 c 0.550781 0 1 -0.449219 1 -1 s -0.449219 -1 -1 -1 z m 0 0"/>
|
||||||
|
</g>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 1.7 KiB |
4
src/icons/edit-copy-symbolic.svg
Normal file
@@ -0,0 +1,4 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<svg height="16px" viewBox="0 0 16 16" width="16px" xmlns="http://www.w3.org/2000/svg">
|
||||||
|
<path d="m 0 3 c 0 -1.644531 1.355469 -3 3 -3 h 5 c 1.644531 0 3 1.355469 3 3 c 0 0.550781 -0.449219 1 -1 1 s -1 -0.449219 -1 -1 c 0 -0.570312 -0.429688 -1 -1 -1 h -5 c -0.570312 0 -1 0.429688 -1 1 v 5 c 0 0.570312 0.429688 1 1 1 c 0.550781 0 1 0.449219 1 1 s -0.449219 1 -1 1 c -1.644531 0 -3 -1.355469 -3 -3 z m 5 5 c 0 -1.644531 1.355469 -3 3 -3 h 5 c 1.644531 0 3 1.355469 3 3 v 5 c 0 1.644531 -1.355469 3 -3 3 h -5 c -1.644531 0 -3 -1.355469 -3 -3 z m 2 0 v 5 c 0 0.570312 0.429688 1 1 1 h 5 c 0.570312 0 1 -0.429688 1 -1 v -5 c 0 -0.570312 -0.429688 -1 -1 -1 h -5 c -0.570312 0 -1 0.429688 -1 1 z m 0 0" fill="#2e3436"/>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 765 B |
4
src/icons/folder-download-symbolic.svg
Normal file
@@ -0,0 +1,4 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<svg height="16px" viewBox="0 0 16 16" width="16px" xmlns="http://www.w3.org/2000/svg">
|
||||||
|
<path d="m 8 0 c -0.550781 0 -1 0.449219 -1 1 v 8.585938 l -2.292969 -2.292969 c -0.1875 -0.1875 -0.441406 -0.292969 -0.707031 -0.292969 s -0.519531 0.105469 -0.707031 0.292969 c -0.390625 0.390625 -0.390625 1.023437 0 1.414062 l 4 4 c 0.390625 0.390625 1.023437 0.390625 1.414062 0 l 4 -4 c 0.390625 -0.390625 0.390625 -1.023437 0 -1.414062 s -1.023437 -0.390625 -1.414062 0 l -2.292969 2.292969 v -8.585938 c 0 -0.550781 -0.449219 -1 -1 -1 z m -6 14 v 2 h 12 v -2 z m 0 0" fill="#2e3436"/>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 630 B |
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 |
7
src/icons/image-x-generic-symbolic.svg
Normal file
@@ -0,0 +1,7 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<svg height="16px" viewBox="0 0 16 16" width="16px" xmlns="http://www.w3.org/2000/svg">
|
||||||
|
<g fill="#2e3436">
|
||||||
|
<path d="m 6 5 c -0.550781 0 -1 0.449219 -1 1 s 0.449219 1 1 1 s 1 -0.449219 1 -1 s -0.449219 -1 -1 -1 z m 3.5 3 l -2 2 l -1.5 -1 l -2 2 v 0.5 c 0 0.5 0.5 0.5 0.5 0.5 h 7 s 0.472656 -0.035156 0.5 -0.5 v -1 z m 0 0"/>
|
||||||
|
<path d="m 4 1 c -1.644531 0 -3 1.355469 -3 3 v 8 c 0 1.644531 1.355469 3 3 3 h 8 c 1.644531 0 3 -1.355469 3 -3 v -8 c 0 -1.644531 -1.355469 -3 -3 -3 z m 0 2 h 8 c 0.570312 0 1 0.429688 1 1 v 8 c 0 0.570312 -0.429688 1 -1 1 h -8 c -0.570312 0 -1 -0.429688 -1 -1 v -8 c 0 -0.570312 0.429688 -1 1 -1 z m 0 0"/>
|
||||||
|
</g>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 708 B |
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 |
4
src/icons/list-add-symbolic.svg
Normal file
@@ -0,0 +1,4 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<svg height="16px" viewBox="0 0 16 16" width="16px" xmlns="http://www.w3.org/2000/svg">
|
||||||
|
<path d="m 7 1 v 6 h -6 v 2 h 6 v 6 h 2 v -6 h 6 v -2 h -6 v -6 z m 0 0" fill="#2e3436"/>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 228 B |
4
src/icons/media-playback-stop-symbolic.svg
Normal file
@@ -0,0 +1,4 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<svg height="16px" viewBox="0 0 16 16" width="16px" xmlns="http://www.w3.org/2000/svg">
|
||||||
|
<path d="m 3.5 2 h 9 c 0.828125 0 1.5 0.671875 1.5 1.5 v 9 c 0 0.828125 -0.671875 1.5 -1.5 1.5 h -9 c -0.828125 0 -1.5 -0.671875 -1.5 -1.5 v -9 c 0 -0.828125 0.671875 -1.5 1.5 -1.5 z m 0 0" fill="#2e3436"/>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 345 B |
8
src/icons/open-menu-symbolic.svg
Normal file
@@ -0,0 +1,8 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<svg height="16px" viewBox="0 0 16 16" width="16px" xmlns="http://www.w3.org/2000/svg">
|
||||||
|
<g fill="#2e3436">
|
||||||
|
<path d="m 1 2 h 14 v 2 h -14 z m 0 0"/>
|
||||||
|
<path d="m 1 7 h 14 v 2 h -14 z m 0 0"/>
|
||||||
|
<path d="m 1 12 h 14 v 2 h -14 z m 0 0"/>
|
||||||
|
</g>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 314 B |
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 |
4
src/icons/preferences-other-symbolic.svg
Normal file
@@ -0,0 +1,4 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<svg height="16px" viewBox="0 0 16 16" width="16px" xmlns="http://www.w3.org/2000/svg">
|
||||||
|
<path d="m 12.5 0.0234375 c -0.292969 -0.0039063 -0.59375 0.0195313 -0.882812 0.0937505 c -1.867188 0.488281 -2.984376 2.382812 -2.496094 4.234374 c 0.101562 0.386719 0.289062 0.742188 0.5 1.054688 c -0.109375 0.015625 -1.625 2.59375 -1.625 2.59375 l 3.410156 0.023438 l 0.800781 -1.117188 c 0.378907 0.03125 0.78125 0.023438 1.171875 -0.078125 c 1.863282 -0.484375 2.980469 -2.382813 2.496094 -4.234375 c -0.105469 -0.386719 -0.292969 -0.738281 -0.503906 -1.054688 l -1.359375 2.304688 c -0.28125 0.476562 -0.882813 0.632812 -1.355469 0.355469 l -0.875 -0.507813 c -0.476562 -0.277344 -0.636719 -0.875 -0.355469 -1.347656 l 1.363281 -2.3085938 c -0.097656 -0.0039062 -0.195312 -0.0117187 -0.289062 -0.0117187 z m -8.875 0.6914065 c -0.011719 0 -0.019531 0 -0.027344 0.003906 c -0.230468 0.046875 -0.445312 0.132812 -0.65625 0.21875 c -0.019531 0.625 0.085938 1.441406 -0.15625 1.65625 c -0.242187 0.210938 -1.039062 0.035156 -1.652344 -0.03125 c -0.132812 0.238281 -0.238281 0.484375 -0.3125 0.75 c 0.476563 0.394531 1.136719 0.839844 1.152344 1.15625 c 0.015625 0.320312 -0.625 0.804688 -1.058594 1.25 c 0.101563 0.257812 0.25 0.492188 0.40625 0.71875 c 0.605469 -0.125 1.359376 -0.375 1.621094 -0.1875 c 0.261719 0.1875 0.261719 1.003906 0.34375 1.625 c 0.246094 0.074219 0.507813 0.105469 0.777344 0.125 c 0.28125 -0.554688 0.566406 -1.320312 0.875 -1.40625 c 0.316406 -0.089844 0.960938 0.457031 1.5 0.78125 c 0.214844 -0.152344 0.410156 -0.335938 0.589844 -0.53125 c -0.253906 -0.574219 -0.71875 -1.292969 -0.589844 -1.59375 c 0.125 -0.300781 0.96875 -0.46875 1.558594 -0.6875 c 0.003906 -0.074219 0.03125 -0.144531 0.03125 -0.21875 c 0 -0.191406 -0.035156 -0.378906 -0.0625 -0.5625 c -0.605469 -0.160156 -1.464844 -0.242188 -1.621094 -0.53125 c -0.160156 -0.289062 0.238281 -1.0625 0.433594 -1.65625 c -0.199219 -0.179688 -0.417969 -0.335938 -0.652344 -0.46875 c -0.503906 0.375 -1.085938 0.996094 -1.40625 0.9375 c -0.316406 -0.054688 -0.660156 -0.820312 -0.996094 -1.34375 c -0.03125 0.003906 -0.066406 0 -0.097656 -0.003906 z m 0.59375 1.878906 c 0.929688 0 1.6875 0.753906 1.6875 1.6875 s -0.757812 1.6875 -1.6875 1.6875 s -1.683594 -0.753906 -1.683594 -1.6875 s 0.753906 -1.6875 1.683594 -1.6875 z m 8.621094 6.332031 c -0.144532 0 -0.273438 0.023438 -0.359375 0.074219 h -9.050781 c -0.246094 -0.105469 -0.746094 -0.046875 -0.964844 0.179688 l -2.160156 2.113281 c -0.191407 0.175781 -0.30078175 0.484375 -0.304688 0.707031 c -0.0546875 0.886719 1 1.320312 1.636719 0.792969 l 1.363281 -1.332031 l 0.003906 3.539062 c 0 0.570312 0.457032 1 0.996094 1 h 7.992188 c 0.523437 0 0.996093 -0.445312 0.996093 -0.9375 l -0.003906 -3.601562 l 1.335937 1.308593 c 0.636719 0.527344 1.6875 0.09375 1.636719 -0.792969 c -0.003906 -0.222656 -0.113281 -0.53125 -0.300781 -0.703124 l -2.164062 -2.117188 c -0.144532 -0.152344 -0.417969 -0.226562 -0.652344 -0.230469 z m 0 0" fill="#2e3436"/>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 3.0 KiB |
4
src/icons/preferences-system-symbolic.svg
Normal file
@@ -0,0 +1,4 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<svg height="16px" viewBox="0 0 16 16" width="16px" xmlns="http://www.w3.org/2000/svg">
|
||||||
|
<path d="m 13.855469 0 l -1.539063 1.4375 c -0.453125 0.421875 -0.53125 1.148438 -0.269531 1.707031 l -5.886719 5.996094 c -0.011718 0 -0.019531 0 -0.03125 0 c -0.257812 -0.128906 -0.550781 -0.183594 -0.839844 -0.148437 c -0.328124 0.046874 -0.632812 0.199218 -0.867187 0.441406 l -3.945313 3.996094 c -0.3906245 0.375 -0.5468745 0.933593 -0.4062495 1.457031 c 0.1406255 0.523437 0.5546875 0.929687 1.0820315 1.058593 c 0.527344 0.132813 1.082031 -0.03125 1.453125 -0.425781 l 3.945312 -3.996093 c 0.472657 -0.453126 0.59375 -1.15625 0.296875 -1.738282 l 5.890625 -5.964844 c 0.558594 0.25 1.273438 0.148438 1.707031 -0.289062 l 1.414063 -1.5625 z m -10.308594 0.0898438 c -0.398437 0 -0.785156 0.0937502 -1.140625 0.2187502 l 1.882812 1.878906 c 0.390626 0.382812 0.390626 1 0 1.386719 l -0.710937 0.707031 c -0.386719 0.386719 -1 0.386719 -1.390625 0 l -1.882812 -1.878906 c -0.125 0.355468 -0.2187505 0.742187 -0.2187505 1.140625 c 0 1.90625 1.5507815 3.453125 3.4609375 3.453125 c 0.402344 0 0.789063 -0.09375 1.144531 -0.21875 l 1.175782 1.171875 h 0.058593 l 2.070313 -2.0625 l -1.203125 -1.203125 c 0.125 -0.359375 0.214843 -0.742188 0.214843 -1.140625 c 0 -1.90625 -1.546874 -3.4531252 -3.460937 -3.4531252 z m 6.550781 7.8906252 l -2.070312 2.066406 c 0.011718 0.027344 0.023437 0.058594 0.03125 0.089844 l 1.144531 1.140625 c -0.125 0.355468 -0.21875 0.742187 -0.21875 1.140625 c 0 1.902343 1.550781 3.449219 3.460937 3.449219 c 0.433594 0 0.855469 -0.101563 1.238282 -0.246094 l -2.007813 -2 c -0.386719 -0.386719 -0.386719 -1.035156 0 -1.417969 l 0.679688 -0.679687 c 0.195312 -0.191407 0.457031 -0.308594 0.710937 -0.308594 s 0.515625 0.117187 0.710938 0.308594 l 1.945312 1.941406 c 0.105469 -0.328125 0.183594 -0.683594 0.183594 -1.046875 c 0 -1.90625 -1.546875 -3.453125 -3.460938 -3.453125 c -0.398437 0 -0.785156 0.09375 -1.140624 0.21875 z m 0 0" fill="#2e3436"/>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 2.0 KiB |
8
src/icons/sidebar-show-symbolic.svg
Normal file
@@ -0,0 +1,8 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<svg height="16px" viewBox="0 0 16 16" width="16px" xmlns="http://www.w3.org/2000/svg">
|
||||||
|
<g fill="#2e3436">
|
||||||
|
<path d="m 6.5 14 v -12 h -5 v 12 z m 0 0" fill-opacity="0.34902"/>
|
||||||
|
<path d="m 3 1 c -1.644531 0 -3 1.355469 -3 3 v 8 c 0 1.644531 1.355469 3 3 3 h 10 c 1.644531 0 3 -1.355469 3 -3 v -8 c 0 -1.644531 -1.355469 -3 -3 -3 z m 0 2 h 10 c 0.570312 0 1 0.429688 1 1 v 8 c 0 0.570312 -0.429688 1 -1 1 h -10 c -0.570312 0 -1 -0.429688 -1 -1 v -8 c 0 -0.570312 0.429688 -1 1 -1 z m 0 0"/>
|
||||||
|
<path d="m 6 2 h 1 v 12 h -1 z m 0 0"/>
|
||||||
|
</g>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 610 B |
10
src/icons/user-trash-symbolic.svg
Normal file
@@ -0,0 +1,10 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<svg height="16px" viewBox="0 0 16 16" width="16px" xmlns="http://www.w3.org/2000/svg">
|
||||||
|
<g fill="#2e3436">
|
||||||
|
<path d="m 1 3 h 14 c 0.550781 0 1 0.449219 1 1 s -0.449219 1 -1 1 h -14 c -0.550781 0 -1 -0.449219 -1 -1 s 0.449219 -1 1 -1 z m 0 0"/>
|
||||||
|
<path d="m 4 4 v -1.5 c 0 -1.386719 1.113281 -2.5 2.5 -2.5 h 2.980469 c 1.382812 0 2.5 1.113281 2.5 2.5 v 1.5 h -2 v -1.5 c 0 -0.269531 -0.230469 -0.5 -0.5 -0.5 h -2.980469 c -0.269531 0 -0.5 0.230469 -0.5 0.5 v 1.5 z m 0 0"/>
|
||||||
|
<path d="m 4 4 v 9 c 0 0.546875 0.453125 1 1 1 h 6 c 0.546875 0 1 -0.453125 1 -1 v -9 h 2 v 9 c 0 1.660156 -1.339844 3 -3 3 h -6 c -1.660156 0 -3 -1.339844 -3 -3 v -9 z m 0 0"/>
|
||||||
|
<path d="m 7 7 v 5 c 0 0.277344 -0.222656 0.5 -0.5 0.5 s -0.5 -0.222656 -0.5 -0.5 v -5 c 0 -0.277344 0.222656 -0.5 0.5 -0.5 s 0.5 0.222656 0.5 0.5 z m 0 0"/>
|
||||||
|
<path d="m 10 7 v 5 c 0 0.277344 -0.222656 0.5 -0.5 0.5 s -0.5 -0.222656 -0.5 -0.5 v -5 c 0 -0.277344 0.222656 -0.5 0.5 -0.5 s 0.5 0.222656 0.5 0.5 z m 0 0"/>
|
||||||
|
</g>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 1.0 KiB |
4
src/icons/view-more-symbolic.svg
Normal file
@@ -0,0 +1,4 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<svg height="16px" viewBox="0 0 16 16" width="16px" xmlns="http://www.w3.org/2000/svg">
|
||||||
|
<path d="m 7.996094 0 c -1.105469 0 -2 0.894531 -2 2 s 0.894531 2 2 2 c 1.101562 0 2 -0.894531 2 -2 s -0.898438 -2 -2 -2 z m 0 6 c -1.105469 0 -2 0.894531 -2 2 s 0.894531 2 2 2 c 1.101562 0 2 -0.894531 2 -2 s -0.898438 -2 -2 -2 z m 0 6 c -1.105469 0 -2 0.894531 -2 2 s 0.894531 2 2 2 c 1.101562 0 2 -0.894531 2 -2 s -0.898438 -2 -2 -2 z m 0 0" fill="#2e3436"/>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 499 B |
28
src/local_instance.py
Normal file
@@ -0,0 +1,28 @@
|
|||||||
|
# local_instance.py
|
||||||
|
import subprocess, os, threading
|
||||||
|
from time import sleep
|
||||||
|
|
||||||
|
instance = None
|
||||||
|
port = 11435
|
||||||
|
data_dir = os.getenv("XDG_DATA_HOME")
|
||||||
|
|
||||||
|
def start():
|
||||||
|
global instance
|
||||||
|
instance = subprocess.Popen(["/app/bin/ollama", "serve"], env={**os.environ, 'OLLAMA_HOST': f"127.0.0.1:{port}", "HOME": data_dir}, stderr=subprocess.PIPE, text=True)
|
||||||
|
print("Starting Alpaca's Ollama instance...")
|
||||||
|
sleep(1)
|
||||||
|
print("Started Alpaca's Ollama instance")
|
||||||
|
|
||||||
|
def stop():
|
||||||
|
global instance
|
||||||
|
if instance:
|
||||||
|
instance.kill()
|
||||||
|
instance.wait()
|
||||||
|
instance = None
|
||||||
|
print("Stopped Alpaca's Ollama instance")
|
||||||
|
|
||||||
|
def reset():
|
||||||
|
stop()
|
||||||
|
sleep(1)
|
||||||
|
start()
|
||||||
|
|
||||||
@@ -33,7 +33,6 @@ class AlpacaApplication(Adw.Application):
|
|||||||
super().__init__(application_id='com.jeffser.Alpaca',
|
super().__init__(application_id='com.jeffser.Alpaca',
|
||||||
flags=Gio.ApplicationFlags.DEFAULT_FLAGS)
|
flags=Gio.ApplicationFlags.DEFAULT_FLAGS)
|
||||||
self.create_action('quit', lambda *_: self.quit(), ['<primary>q'])
|
self.create_action('quit', lambda *_: self.quit(), ['<primary>q'])
|
||||||
self.create_action('clear', lambda *_: AlpacaWindow.clear_chat_dialog(self.props.active_window), ['<primary>e'])
|
|
||||||
self.create_action('preferences', lambda *_: AlpacaWindow.show_preferences_dialog(self.props.active_window), ['<primary>p'])
|
self.create_action('preferences', lambda *_: AlpacaWindow.show_preferences_dialog(self.props.active_window), ['<primary>p'])
|
||||||
self.create_action('about', self.on_about_action)
|
self.create_action('about', self.on_about_action)
|
||||||
|
|
||||||
@@ -48,10 +47,10 @@ 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.0',
|
version='0.9.3',
|
||||||
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',
|
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',
|
||||||
copyright='© 2024 Jeffser\n© 2024 Ollama',
|
copyright='© 2024 Jeffser\n© 2024 Ollama',
|
||||||
issue_url='https://github.com/Jeffser/Alpaca/issues')
|
issue_url='https://github.com/Jeffser/Alpaca/issues')
|
||||||
about.present(parent=self.props.active_window)
|
about.present(parent=self.props.active_window)
|
||||||
|
|||||||
@@ -26,12 +26,23 @@ 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',
|
||||||
'window.py',
|
'window.py',
|
||||||
'connection_handler.py',
|
'connection_handler.py',
|
||||||
'available_models.py'
|
'available_models.py',
|
||||||
|
'dialogs.py',
|
||||||
|
'local_instance.py'
|
||||||
]
|
]
|
||||||
|
|
||||||
install_data(alpaca_sources, install_dir: moduledir)
|
install_data(alpaca_sources, install_dir: moduledir)
|
||||||
|
|||||||
@@ -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;
|
||||||
}
|
}
|
||||||
|
|||||||
963
src/window.py
407
src/window.ui
@@ -3,6 +3,7 @@
|
|||||||
<requires lib="gtk" version="4.0"/>
|
<requires lib="gtk" version="4.0"/>
|
||||||
<requires lib="Adw" version="1.0"/>
|
<requires lib="Adw" version="1.0"/>
|
||||||
<template class="AlpacaWindow" parent="AdwApplicationWindow">
|
<template class="AlpacaWindow" parent="AdwApplicationWindow">
|
||||||
|
<signal name="close-request" handler="closing_app"/>
|
||||||
<property name="resizable">True</property>
|
<property name="resizable">True</property>
|
||||||
<property name="width-request">360</property>
|
<property name="width-request">360</property>
|
||||||
<property name="height-request">700</property>
|
<property name="height-request">700</property>
|
||||||
@@ -23,12 +24,11 @@
|
|||||||
<setter object="split_view_overlay" property="collapsed">true</setter>
|
<setter object="split_view_overlay" property="collapsed">true</setter>
|
||||||
<setter object="welcome_dialog" property="width-request">360</setter>
|
<setter object="welcome_dialog" property="width-request">360</setter>
|
||||||
<setter object="manage_models_dialog" property="width-request">360</setter>
|
<setter object="manage_models_dialog" property="width-request">360</setter>
|
||||||
|
<setter object="create_model_dialog" property="width-request">360</setter>
|
||||||
<setter object="preferences_dialog" property="width-request">360</setter>
|
<setter object="preferences_dialog" property="width-request">360</setter>
|
||||||
</object>
|
</object>
|
||||||
</child>
|
</child>
|
||||||
<property name="content">
|
<property name="content">
|
||||||
<object class="AdwToastOverlay" id="main_overlay">
|
|
||||||
<child>
|
|
||||||
<object class="AdwOverlaySplitView" id="split_view_overlay">
|
<object class="AdwOverlaySplitView" id="split_view_overlay">
|
||||||
<property name="show-sidebar" bind-source="show_sidebar_button" bind-property="active" bind-flags="sync-create"/>
|
<property name="show-sidebar" bind-source="show_sidebar_button" bind-property="active" bind-flags="sync-create"/>
|
||||||
<property name="sidebar">
|
<property name="sidebar">
|
||||||
@@ -38,28 +38,18 @@
|
|||||||
<child type="start">
|
<child type="start">
|
||||||
<object class="GtkButton" id="add_chat_button">
|
<object class="GtkButton" id="add_chat_button">
|
||||||
<property name="tooltip-text" translatable="yes">New chat</property>
|
<property name="tooltip-text" translatable="yes">New chat</property>
|
||||||
<property name="icon-name">tab-new-symbolic</property>
|
<property name="icon-name">chat-message-new-symbolic</property>
|
||||||
<style>
|
<style>
|
||||||
<class name="flat"/>
|
<class name="flat"/>
|
||||||
</style>
|
</style>
|
||||||
</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_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>
|
||||||
@@ -70,6 +60,7 @@
|
|||||||
<property name="hexpand">true</property>
|
<property name="hexpand">true</property>
|
||||||
<child>
|
<child>
|
||||||
<object class="GtkListBox" id="chat_list_box">
|
<object class="GtkListBox" id="chat_list_box">
|
||||||
|
<signal name="row-selected" handler="chat_changed"/>
|
||||||
<property name="selection-mode">single</property>
|
<property name="selection-mode">single</property>
|
||||||
<style>
|
<style>
|
||||||
<class name="navigation-sidebar"></class>
|
<class name="navigation-sidebar"></class>
|
||||||
@@ -97,6 +88,7 @@
|
|||||||
<property name="spacing">12</property>
|
<property name="spacing">12</property>
|
||||||
<child>
|
<child>
|
||||||
<object class="GtkDropDown" id="model_drop_down">
|
<object class="GtkDropDown" id="model_drop_down">
|
||||||
|
<signal name="notify" handler="verify_if_image_can_be_used"/>
|
||||||
<property name="enable-search">true</property>
|
<property name="enable-search">true</property>
|
||||||
<property name="model">
|
<property name="model">
|
||||||
<object class="GtkStringList" id="model_string_list">
|
<object class="GtkStringList" id="model_string_list">
|
||||||
@@ -108,10 +100,11 @@
|
|||||||
</child>
|
</child>
|
||||||
<child>
|
<child>
|
||||||
<object class="GtkButton" id="manage_models_button">
|
<object class="GtkButton" id="manage_models_button">
|
||||||
|
<signal name="clicked" handler="manage_models_button_activate"/>
|
||||||
<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>
|
||||||
@@ -133,6 +126,8 @@
|
|||||||
<property name="orientation">1</property>
|
<property name="orientation">1</property>
|
||||||
<property name="vexpand">true</property>
|
<property name="vexpand">true</property>
|
||||||
<property name="hexpand">true</property>
|
<property name="hexpand">true</property>
|
||||||
|
<child>
|
||||||
|
<object class="AdwToastOverlay" id="main_overlay">
|
||||||
<child>
|
<child>
|
||||||
<object class="GtkScrolledWindow" id="chat_window">
|
<object class="GtkScrolledWindow" id="chat_window">
|
||||||
<property name="propagate-natural-height">true</property>
|
<property name="propagate-natural-height">true</property>
|
||||||
@@ -162,7 +157,8 @@
|
|||||||
</child>
|
</child>
|
||||||
</object>
|
</object>
|
||||||
</child>
|
</child>
|
||||||
|
</object>
|
||||||
|
</child>
|
||||||
<child>
|
<child>
|
||||||
<object class="AdwClamp">
|
<object class="AdwClamp">
|
||||||
<property name="maximum-size">1000</property>
|
<property name="maximum-size">1000</property>
|
||||||
@@ -175,60 +171,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>
|
|
||||||
<object class="GtkBox">
|
|
||||||
<property name="orientation">1</property>
|
|
||||||
<property name="spacing">12</property>
|
|
||||||
<child>
|
<child>
|
||||||
<object class="GtkButton" id="send_button">
|
<object class="GtkButton" id="send_button">
|
||||||
|
<signal name="clicked" handler="send_message"/>
|
||||||
|
<property name="vexpand">false</property>
|
||||||
|
<property name="valign">3</property>
|
||||||
<style>
|
<style>
|
||||||
<class name="suggested-action"/>
|
<class name="suggested-action"/>
|
||||||
|
<class name="circular"/>
|
||||||
</style>
|
</style>
|
||||||
<child>
|
<child>
|
||||||
<object class="AdwButtonContent">
|
<object class="AdwButtonContent">
|
||||||
<property name="label" translatable="yes">Send</property>
|
<property name="icon-name">paper-plane-symbolic</property>
|
||||||
<property name="icon-name">send-to-symbolic</property>
|
|
||||||
</object>
|
</object>
|
||||||
</child>
|
</child>
|
||||||
</object>
|
</object>
|
||||||
</child>
|
</child>
|
||||||
<child>
|
<child>
|
||||||
<object class="GtkButton" id="image_button">
|
<object class="GtkButton" id="stop_button">
|
||||||
<property name="sensitive">false</property>
|
<signal name="clicked" handler="stop_message"/>
|
||||||
<property name="tooltip-text" translatable="yes">Only available on selected models</property>
|
<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="AdwButtonContent">
|
<object class="AdwButtonContent">
|
||||||
<property name="label" translatable="yes">Image</property>
|
<property name="icon-name">media-playback-stop-symbolic</property>
|
||||||
<property name="icon-name">image-x-generic-symbolic</property>
|
|
||||||
</object>
|
|
||||||
</child>
|
|
||||||
</object>
|
</object>
|
||||||
</child>
|
</child>
|
||||||
</object>
|
</object>
|
||||||
@@ -244,8 +259,6 @@
|
|||||||
</object>
|
</object>
|
||||||
</child>
|
</child>
|
||||||
</object>
|
</object>
|
||||||
</child>
|
|
||||||
</object>
|
|
||||||
</property>
|
</property>
|
||||||
<object class="AdwPreferencesDialog" id="preferences_dialog">
|
<object class="AdwPreferencesDialog" id="preferences_dialog">
|
||||||
<property name="can-close">true</property>
|
<property name="can-close">true</property>
|
||||||
@@ -253,9 +266,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>
|
||||||
@@ -267,6 +280,7 @@
|
|||||||
</child>
|
</child>
|
||||||
<child>
|
<child>
|
||||||
<object class="AdwEntryRow" id="remote_connection_entry">
|
<object class="AdwEntryRow" id="remote_connection_entry">
|
||||||
|
<signal name="apply" handler="change_remote_url"/>
|
||||||
<property name="title" translatable="yes">URL of remote instance</property>
|
<property name="title" translatable="yes">URL of remote instance</property>
|
||||||
<property name="show-apply-button">true</property>
|
<property name="show-apply-button">true</property>
|
||||||
</object>
|
</object>
|
||||||
@@ -286,6 +300,185 @@
|
|||||||
</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 class="AdwDialog" id="create_model_dialog">
|
||||||
|
<property name="can-close">true</property>
|
||||||
|
<property name="width-request">400</property>
|
||||||
|
<property name="height-request">600</property>
|
||||||
|
<child>
|
||||||
|
<object class="AdwToastOverlay" id="create_model_overlay">
|
||||||
|
<child>
|
||||||
|
<object class="AdwToolbarView">
|
||||||
|
<child type="bottom">
|
||||||
|
<object class="GtkActionBar">
|
||||||
|
<property name="revealed">true</property>
|
||||||
|
<child type="end">
|
||||||
|
<object class="GtkButton">
|
||||||
|
<property name="label" translatable="yes">Create</property>
|
||||||
|
<signal name="clicked" handler="create_model_start"/>
|
||||||
|
<style>
|
||||||
|
<class name="suggested-action" />
|
||||||
|
</style>
|
||||||
|
</object>
|
||||||
|
</child>
|
||||||
|
</object>
|
||||||
|
</child>
|
||||||
|
<child type="top">
|
||||||
|
<object class="AdwHeaderBar">
|
||||||
|
<property name="title-widget">
|
||||||
|
<object class="AdwWindowTitle">
|
||||||
|
<property name="title" translatable="yes">Create model</property>
|
||||||
|
</object>
|
||||||
|
</property>
|
||||||
|
</object>
|
||||||
|
</child>
|
||||||
|
<child>
|
||||||
|
<object class="GtkScrolledWindow">
|
||||||
|
<property name="vexpand">true</property>
|
||||||
|
<property name="hexpand">true</property>
|
||||||
|
<child>
|
||||||
|
<object class="GtkBox">
|
||||||
|
<property name="margin-start">12</property>
|
||||||
|
<property name="margin-end">12</property>
|
||||||
|
<property name="margin-top">12</property>
|
||||||
|
<property name="margin-bottom">12</property>
|
||||||
|
<property name="orientation">1</property>
|
||||||
|
<property name="spacing">12</property>
|
||||||
|
<child>
|
||||||
|
<object class="GtkListBox">
|
||||||
|
<style>
|
||||||
|
<class name="boxed-list"/>
|
||||||
|
<class name="card"/>
|
||||||
|
</style>
|
||||||
|
<property name="selection-mode">none</property>
|
||||||
|
<child>
|
||||||
|
<object class="AdwActionRow" id="create_model_base">
|
||||||
|
<property name="title" translatable="yes">Base</property>
|
||||||
|
<property name="subtitle"></property>
|
||||||
|
<style>
|
||||||
|
<class name="property"/>
|
||||||
|
</style>
|
||||||
|
</object>
|
||||||
|
</child>
|
||||||
|
</object>
|
||||||
|
</child>
|
||||||
|
<child>
|
||||||
|
<object class="GtkListBox">
|
||||||
|
<style>
|
||||||
|
<class name="boxed-list"/>
|
||||||
|
<class name="card"/>
|
||||||
|
</style>
|
||||||
|
<property name="selection-mode">none</property>
|
||||||
|
<child>
|
||||||
|
<object class="AdwEntryRow" id="create_model_name">
|
||||||
|
<property name="title" translatable="yes">Name</property>
|
||||||
|
<property name="input-purpose">alpha</property>
|
||||||
|
</object>
|
||||||
|
</child>
|
||||||
|
<child>
|
||||||
|
<object class="AdwEntryRow" id="create_model_system">
|
||||||
|
<property name="title" translatable="yes">Context</property>
|
||||||
|
<property name="input-purpose">alpha</property>
|
||||||
|
</object>
|
||||||
|
</child>
|
||||||
|
</object>
|
||||||
|
</child>
|
||||||
|
<child>
|
||||||
|
<object class="GtkListBox">
|
||||||
|
<style>
|
||||||
|
<class name="boxed-list"/>
|
||||||
|
<class name="card"/>
|
||||||
|
</style>
|
||||||
|
<property name="selection-mode">none</property>
|
||||||
|
<child>
|
||||||
|
<object class="AdwEntryRow" id="create_model_template">
|
||||||
|
<property name="title" translatable="yes">Template</property>
|
||||||
|
<property name="input-purpose">alpha</property>
|
||||||
|
</object>
|
||||||
|
</child>
|
||||||
|
<child>
|
||||||
|
<object class="GtkLabel">
|
||||||
|
<property name="label" translatable="yes">Some models require a specific template. Please visit the model's website for more information if you're unsure.</property>
|
||||||
|
<property name="margin-start">12</property>
|
||||||
|
<property name="margin-end">12</property>
|
||||||
|
<property name="margin-top">12</property>
|
||||||
|
<property name="margin-bottom">12</property>
|
||||||
|
<property name="halign">1</property>
|
||||||
|
<property name="wrap">true</property>
|
||||||
|
<style>
|
||||||
|
<class name="caption"/>
|
||||||
|
</style>
|
||||||
|
</object>
|
||||||
|
</child>
|
||||||
|
</object>
|
||||||
|
</child>
|
||||||
|
</object>
|
||||||
|
</child>
|
||||||
|
</object>
|
||||||
|
</child>
|
||||||
|
</object>
|
||||||
|
</child>
|
||||||
|
</object>
|
||||||
|
</child>
|
||||||
</object>
|
</object>
|
||||||
|
|
||||||
<object class="AdwDialog" id="manage_models_dialog">
|
<object class="AdwDialog" id="manage_models_dialog">
|
||||||
@@ -298,6 +491,14 @@
|
|||||||
<object class="AdwToolbarView">
|
<object class="AdwToolbarView">
|
||||||
<child type="top">
|
<child type="top">
|
||||||
<object class="AdwHeaderBar">
|
<object class="AdwHeaderBar">
|
||||||
|
<child type="start">
|
||||||
|
<object class="GtkMenuButton">
|
||||||
|
<property name="primary">True</property>
|
||||||
|
<property name="icon-name">list-add-symbolic</property>
|
||||||
|
<property name="tooltip-text" translatable="yes">Create model</property>
|
||||||
|
<property name="menu-model">create_model_menu</property>
|
||||||
|
</object>
|
||||||
|
</child>
|
||||||
<property name="title-widget">
|
<property name="title-widget">
|
||||||
<object class="AdwWindowTitle">
|
<object class="AdwWindowTitle">
|
||||||
<property name="title" translatable="yes">Manage models</property>
|
<property name="title" translatable="yes">Manage models</property>
|
||||||
@@ -368,6 +569,7 @@
|
|||||||
<property name="margin-bottom">5</property>
|
<property name="margin-bottom">5</property>
|
||||||
<child type="start">
|
<child type="start">
|
||||||
<object class="GtkButton" id="welcome_previous_button">
|
<object class="GtkButton" id="welcome_previous_button">
|
||||||
|
<signal name="clicked" handler="welcome_previous_button_activate"/>
|
||||||
<property name="tooltip-text" translatable="yes">Previous</property>
|
<property name="tooltip-text" translatable="yes">Previous</property>
|
||||||
<property name="label">Previous</property>
|
<property name="label">Previous</property>
|
||||||
<property name="sensitive">false</property>
|
<property name="sensitive">false</property>
|
||||||
@@ -383,6 +585,7 @@
|
|||||||
</child>
|
</child>
|
||||||
<child type="end">
|
<child type="end">
|
||||||
<object class="GtkButton" id="welcome_next_button">
|
<object class="GtkButton" id="welcome_next_button">
|
||||||
|
<signal name="clicked" handler="welcome_next_button_activate"/>
|
||||||
<property name="tooltip-text" translatable="yes">Next</property>
|
<property name="tooltip-text" translatable="yes">Next</property>
|
||||||
<property name="label">Next</property>
|
<property name="label">Next</property>
|
||||||
<style>
|
<style>
|
||||||
@@ -395,6 +598,7 @@
|
|||||||
|
|
||||||
<child>
|
<child>
|
||||||
<object class="AdwCarousel" id="welcome_carousel">
|
<object class="AdwCarousel" id="welcome_carousel">
|
||||||
|
<signal name="page-changed" handler="welcome_carousel_page_changed"/>
|
||||||
<property name="hexpand">true</property>
|
<property name="hexpand">true</property>
|
||||||
<property name="vexpand">true</property>
|
<property name="vexpand">true</property>
|
||||||
<property name="allow-long-swipes">true</property>
|
<property name="allow-long-swipes">true</property>
|
||||||
@@ -433,6 +637,94 @@
|
|||||||
<property name="description" translatable="yes">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.</property>
|
<property name="description" translatable="yes">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.</property>
|
||||||
</object>
|
</object>
|
||||||
</child>
|
</child>
|
||||||
|
<child>
|
||||||
|
<object class="AdwStatusPage">
|
||||||
|
<property name="hexpand">true</property>
|
||||||
|
<property name="vexpand">true</property>
|
||||||
|
<property name="margin-top">12</property>
|
||||||
|
<property name="margin-bottom">12</property>
|
||||||
|
<property name="margin-start">12</property>
|
||||||
|
<property name="margin-end">12</property>
|
||||||
|
<property name="title" translatable="yes">Featured Models</property>
|
||||||
|
<property name="description" translatable="yes">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.</property>
|
||||||
|
<child>
|
||||||
|
<object class="GtkListBox">
|
||||||
|
<property name="selection-mode">none</property>
|
||||||
|
<style>
|
||||||
|
<class name="boxed-list"/>
|
||||||
|
</style>
|
||||||
|
<child>
|
||||||
|
<object class="AdwActionRow">
|
||||||
|
<property name="title" translatable="no">Llama3</property>
|
||||||
|
<property name="subtitle" translatable="yes">Built by Meta</property>
|
||||||
|
<child type="suffix">
|
||||||
|
<object class="GtkButton">
|
||||||
|
<signal name="clicked" handler="pull_featured_model"/>
|
||||||
|
<property name="vexpand">false</property>
|
||||||
|
<property name="icon-name">folder-download-symbolic</property>
|
||||||
|
<property name="valign">3</property>
|
||||||
|
<style>
|
||||||
|
<class name="accent"/>
|
||||||
|
</style>
|
||||||
|
</object>
|
||||||
|
</child>
|
||||||
|
</object>
|
||||||
|
</child>
|
||||||
|
<child>
|
||||||
|
<object class="AdwActionRow">
|
||||||
|
<property name="title" translatable="no">Gemma</property>
|
||||||
|
<property name="subtitle" translatable="yes">Built by Google DeepMind</property>
|
||||||
|
<child type="suffix">
|
||||||
|
<object class="GtkButton">
|
||||||
|
<signal name="clicked" handler="pull_featured_model"/>
|
||||||
|
<property name="vexpand">false</property>
|
||||||
|
<property name="icon-name">folder-download-symbolic</property>
|
||||||
|
<property name="valign">3</property>
|
||||||
|
<style>
|
||||||
|
<class name="accent"/>
|
||||||
|
</style>
|
||||||
|
</object>
|
||||||
|
</child>
|
||||||
|
</object>
|
||||||
|
</child>
|
||||||
|
<child>
|
||||||
|
<object class="AdwActionRow">
|
||||||
|
<property name="title" translatable="no">Phi3</property>
|
||||||
|
<property name="subtitle" translatable="yes">Built by Microsoft</property>
|
||||||
|
<child type="suffix">
|
||||||
|
<object class="GtkButton">
|
||||||
|
<signal name="clicked" handler="pull_featured_model"/>
|
||||||
|
<property name="vexpand">false</property>
|
||||||
|
<property name="icon-name">folder-download-symbolic</property>
|
||||||
|
<property name="valign">3</property>
|
||||||
|
<style>
|
||||||
|
<class name="accent"/>
|
||||||
|
</style>
|
||||||
|
</object>
|
||||||
|
</child>
|
||||||
|
</object>
|
||||||
|
</child>
|
||||||
|
<child>
|
||||||
|
<object class="AdwActionRow">
|
||||||
|
<property name="title" translatable="no">Llava</property>
|
||||||
|
<property name="subtitle" translatable="yes">Multimodal AI with image recognition</property>
|
||||||
|
<child type="suffix">
|
||||||
|
<object class="GtkButton">
|
||||||
|
<signal name="clicked" handler="pull_featured_model"/>
|
||||||
|
<property name="vexpand">false</property>
|
||||||
|
<property name="icon-name">folder-download-symbolic</property>
|
||||||
|
<property name="valign">3</property>
|
||||||
|
<style>
|
||||||
|
<class name="accent"/>
|
||||||
|
</style>
|
||||||
|
</object>
|
||||||
|
</child>
|
||||||
|
</object>
|
||||||
|
</child>
|
||||||
|
</object>
|
||||||
|
</child>
|
||||||
|
</object>
|
||||||
|
</child>
|
||||||
</object>
|
</object>
|
||||||
</child>
|
</child>
|
||||||
</object>
|
</object>
|
||||||
@@ -460,10 +752,27 @@
|
|||||||
</item>
|
</item>
|
||||||
</section>
|
</section>
|
||||||
</menu>
|
</menu>
|
||||||
<menu id="chat_context_menu">
|
<menu id="chats_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>
|
||||||
|
</section>
|
||||||
|
</menu>
|
||||||
|
<menu id="create_model_menu">
|
||||||
|
<section>
|
||||||
|
<item>
|
||||||
|
<attribute name="label" translatable="yes">From existing model</attribute>
|
||||||
|
<attribute name="action">app.create_model_from_existing</attribute>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<attribute name="label" translatable="yes">From GGUF file (Testing)</attribute>
|
||||||
|
<attribute name="action">app.create_model_from_file</attribute>
|
||||||
</item>
|
</item>
|
||||||
</section>
|
</section>
|
||||||
</menu>
|
</menu>
|
||||||
@@ -481,6 +790,11 @@
|
|||||||
<mime-type>application/json</mime-type>
|
<mime-type>application/json</mime-type>
|
||||||
</mime-types>
|
</mime-types>
|
||||||
</object>
|
</object>
|
||||||
|
<object class="GtkFileFilter" id="file_filter_gguf">
|
||||||
|
<suffixes>
|
||||||
|
<suffix>gguf</suffix>
|
||||||
|
</suffixes>
|
||||||
|
</object>
|
||||||
<object class="GtkShortcutsWindow" id="shortcut_window">
|
<object class="GtkShortcutsWindow" id="shortcut_window">
|
||||||
<property name="modal">1</property>
|
<property name="modal">1</property>
|
||||||
<child>
|
<child>
|
||||||
@@ -508,6 +822,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>
|
||||||
@@ -549,4 +869,3 @@
|
|||||||
</child>
|
</child>
|
||||||
</object>
|
</object>
|
||||||
</interface>
|
</interface>
|
||||||
|
|
||||||
|
|||||||
@@ -4,7 +4,9 @@ echo "Preparing template..."
|
|||||||
xgettext --output=po/alpaca.pot --files-from=po/POTFILES
|
xgettext --output=po/alpaca.pot --files-from=po/POTFILES
|
||||||
echo "Updating Spanish..."
|
echo "Updating Spanish..."
|
||||||
msgmerge -U po/es.po po/alpaca.pot
|
msgmerge -U po/es.po po/alpaca.pot
|
||||||
echo "Updating Russian..."
|
#echo "Updating Russian..."
|
||||||
msgmerge -U po/ru.po po/alpaca.pot
|
#msgmerge -U po/ru.po po/alpaca.pot
|
||||||
|
echo "Updating French"
|
||||||
|
msgmerge -U po/fr.po po/alpaca.pot
|
||||||
echo "Updating Brazilian Portuguese"
|
echo "Updating Brazilian Portuguese"
|
||||||
msgmerge -U po/pt_BR.po po/alpaca.pot
|
msgmerge -U po/pt_BR.po po/alpaca.pot
|
||||||
|
|||||||