Compare commits
75 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
a4d26b2bda | ||
|
|
d7961f2510 | ||
|
|
45f5214ec9 | ||
|
|
5e1e770aee | ||
|
|
5eb18d00d3 | ||
|
|
bcbfd44e1f | ||
|
|
073c619d89 | ||
|
|
71ab8cfba4 | ||
|
|
0ec812099c | ||
|
|
f7f05a0538 | ||
|
|
82a0ab0d9e | ||
|
|
60b24da482 | ||
|
|
66d209e4c6 | ||
|
|
0c9ab4e17e | ||
|
|
fff3a68b29 | ||
|
|
580a104894 | ||
|
|
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 |
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.
|
||||||
10
README.md
@@ -15,6 +15,7 @@ Alpaca is an [Ollama](https://github.com/ollama/ollama) client where you can man
|
|||||||
- Talk to multiple models in the same conversation
|
- Talk to multiple models in the same conversation
|
||||||
- Pull and delete models from the app
|
- Pull and delete models from the app
|
||||||
- Image recognition
|
- Image recognition
|
||||||
|
- Document recognition (plain text files)
|
||||||
- Code highlighting
|
- Code highlighting
|
||||||
- Multiple conversations
|
- Multiple conversations
|
||||||
- Notifications
|
- Notifications
|
||||||
@@ -22,13 +23,12 @@ Alpaca is an [Ollama](https://github.com/ollama/ollama) client where you can man
|
|||||||
- Delete messages
|
- Delete messages
|
||||||
|
|
||||||
## Future features!
|
## Future features!
|
||||||
- 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)
|
- YouTube recognition (Ask questions about a YouTube video using the transcript)
|
||||||
- Edit messages
|
- Edit messages
|
||||||
- Snap Package (maybe)
|
- Snap Package (maybe)
|
||||||
|
|
||||||
## Screenies
|
## Screenies
|
||||||
Login to Ollama instance | Chatting with models | Managing models
|
Code highlighting | Chatting with models | Managing models
|
||||||
:-------------------------:|:-------------------------:|:-------------------------:
|
:-------------------------:|:-------------------------:|:-------------------------:
|
||||||
 |  | 
|
 |  | 
|
||||||
|
|
||||||
@@ -50,11 +50,14 @@ For now Alpaca doesn't offer a way to do this from the GUI but it's really simpl
|
|||||||
Go to `~/.var/app/com.jeffser.Alpaca/config/server.json` and change the `"local_port"` value, by default it is `11435`.
|
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
|
### 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.
|
The chat data is located in `~/.var/app/com.jeffser.Alpaca/data/chats` you can copy that directory wherever you want to.
|
||||||
|
|
||||||
### Force showing the welcome dialog
|
### 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.
|
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.
|
||||||
|
|
||||||
|
### Add/Change environment variables for Ollama
|
||||||
|
You can change anything except `$HOME` and `$OLLAMA_HOST`, to do this go to `~/.var/app/com.jeffser.Alpaca/config/server.json` and change `ollama_overrides` accordingly, some overrides are available to change on the GUI.
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
## Thanks
|
## Thanks
|
||||||
@@ -63,6 +66,7 @@ To do that you just need to delete the file `~/.var/app/com.jeffser.Alpaca/confi
|
|||||||
- [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
|
||||||
@@ -5,7 +5,7 @@
|
|||||||
<project_license>GPL-3.0-or-later</project_license>
|
<project_license>GPL-3.0-or-later</project_license>
|
||||||
<launchable type="desktop-id">com.jeffser.Alpaca.desktop</launchable>
|
<launchable type="desktop-id">com.jeffser.Alpaca.desktop</launchable>
|
||||||
<name>Alpaca</name>
|
<name>Alpaca</name>
|
||||||
<summary>Chat with local AI models powered by Ollama</summary>
|
<summary>Chat with local AI models</summary>
|
||||||
<description>
|
<description>
|
||||||
<p>An Ollama client</p>
|
<p>An Ollama client</p>
|
||||||
<p>Features</p>
|
<p>Features</p>
|
||||||
@@ -15,6 +15,7 @@
|
|||||||
<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 compatible models)</li>
|
<li>Image recognition (Only available with compatible models)</li>
|
||||||
|
<li>Plain text documents recognition</li>
|
||||||
<li>Import and export chats</li>
|
<li>Import and export chats</li>
|
||||||
</ul>
|
</ul>
|
||||||
<p>Disclaimer</p>
|
<p>Disclaimer</p>
|
||||||
@@ -63,8 +64,87 @@
|
|||||||
<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.4" date="2024-06-04">
|
||||||
|
<url type="details">https://github.com/Jeffser/Alpaca/releases/tag/0.9.4</url>
|
||||||
|
<description>
|
||||||
|
<p>Huge Update</p>
|
||||||
|
<ul>
|
||||||
|
<li>Added: Support for plain text files</li>
|
||||||
|
<li>Added: New backend system for storing messages</li>
|
||||||
|
<li>Added: Support for changing Ollama's overrides</li>
|
||||||
|
<li>General Optimization</li>
|
||||||
|
</ul>
|
||||||
|
</description>
|
||||||
|
</release>
|
||||||
|
<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">
|
<release version="0.8.6" date="2024-05-26">
|
||||||
<url type="details">https://github.com/Jeffser/Alpaca/releases/tag/0.8.5</url>
|
<url type="details">https://github.com/Jeffser/Alpaca/releases/tag/0.8.6</url>
|
||||||
<description>
|
<description>
|
||||||
<p>Quick fixes</p>
|
<p>Quick fixes</p>
|
||||||
<ul>
|
<ul>
|
||||||
|
|||||||
@@ -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.6',
|
version: '0.9.4',
|
||||||
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
|
||||||
636
po/alpaca.pot
660
po/pt_BR.po
661
po/pt_BR.po~
394
po/ru.po~
@@ -1,394 +0,0 @@
|
|||||||
msgid ""
|
|
||||||
msgstr ""
|
|
||||||
"Project-Id-Version: \n"
|
|
||||||
"Report-Msgid-Bugs-To: \n"
|
|
||||||
"POT-Creation-Date: 2024-05-22 19:17+0800\n"
|
|
||||||
"PO-Revision-Date: 2024-05-22 19:33+0800\n"
|
|
||||||
"Last-Translator: \n"
|
|
||||||
"Language-Team: \n"
|
|
||||||
"Language: ru_RU\n"
|
|
||||||
"MIME-Version: 1.0\n"
|
|
||||||
"Content-Type: text/plain; charset=UTF-8\n"
|
|
||||||
"Content-Transfer-Encoding: 8bit\n"
|
|
||||||
"X-Generator: Poedit 3.4.4\n"
|
|
||||||
"X-Poedit-Basepath: ../src\n"
|
|
||||||
"X-Poedit-SearchPath-0: .\n"
|
|
||||||
|
|
||||||
#: gtk/help-overlay.ui:11
|
|
||||||
msgctxt "shortcut window"
|
|
||||||
msgid "General"
|
|
||||||
msgstr "Общие"
|
|
||||||
|
|
||||||
#: gtk/help-overlay.ui:14
|
|
||||||
msgctxt "shortcut window"
|
|
||||||
msgid "Show Shortcuts"
|
|
||||||
msgstr "Показывать комбинации клавиш"
|
|
||||||
|
|
||||||
#: gtk/help-overlay.ui:20
|
|
||||||
msgctxt "shortcut window"
|
|
||||||
msgid "Quit"
|
|
||||||
msgstr "Выйти"
|
|
||||||
|
|
||||||
#: window.py:54 window.py:761
|
|
||||||
msgid "New Chat"
|
|
||||||
msgstr "Новый Чат"
|
|
||||||
|
|
||||||
#: window.py:100
|
|
||||||
msgid "An error occurred"
|
|
||||||
msgstr "Произошла ошибка"
|
|
||||||
|
|
||||||
#: window.py:101
|
|
||||||
msgid "Failed to connect to server"
|
|
||||||
msgstr "Не удалось подключиться к серверу"
|
|
||||||
|
|
||||||
#: window.py:102
|
|
||||||
msgid "Could not list local models"
|
|
||||||
msgstr "Не удалось перечислить локальные модели"
|
|
||||||
|
|
||||||
#: window.py:103
|
|
||||||
msgid "Could not delete model"
|
|
||||||
msgstr "Не удалось удалить модель"
|
|
||||||
|
|
||||||
#: window.py:104
|
|
||||||
msgid "Could not pull model"
|
|
||||||
msgstr "Не удалось извлечь модель"
|
|
||||||
|
|
||||||
#: window.py:105
|
|
||||||
msgid "Cannot open image"
|
|
||||||
msgstr "Не удается открыть изображение"
|
|
||||||
|
|
||||||
#: window.py:106
|
|
||||||
msgid "Cannot delete chat because it's the only one left"
|
|
||||||
msgstr "Не удается удалить чат, потому что он единственный оставшийся"
|
|
||||||
|
|
||||||
#: window.py:107
|
|
||||||
msgid "There was an error with the local Ollama instance, so it has been reset"
|
|
||||||
msgstr ""
|
|
||||||
"Произошла ошибка с локальным экземпляром Ollama, поэтому он был сброшен"
|
|
||||||
|
|
||||||
#: window.py:110
|
|
||||||
msgid "Please select a model before chatting"
|
|
||||||
msgstr "Пожалуйста, выберите модель перед началом общения"
|
|
||||||
|
|
||||||
#: window.py:111
|
|
||||||
msgid "Chat cannot be cleared while receiving a message"
|
|
||||||
msgstr "Чат не может быть удален при получении сообщения"
|
|
||||||
|
|
||||||
#: window.py:112
|
|
||||||
msgid "That tag is already being pulled"
|
|
||||||
msgstr "Этот тег уже удален"
|
|
||||||
|
|
||||||
#: window.py:113
|
|
||||||
msgid "That tag has been pulled alreay"
|
|
||||||
msgstr "Этот тег уже был удален"
|
|
||||||
|
|
||||||
#: window.py:116
|
|
||||||
msgid "Model deleted successfully"
|
|
||||||
msgstr "Модель успешно удалена"
|
|
||||||
|
|
||||||
#: window.py:117
|
|
||||||
msgid "Model pulled successfully"
|
|
||||||
msgstr "Модель успешно извлечена"
|
|
||||||
|
|
||||||
#: window.py:118
|
|
||||||
msgid "Chat exported successfully"
|
|
||||||
msgstr "Чат успешно экспортирован"
|
|
||||||
|
|
||||||
#: window.py:119
|
|
||||||
msgid "Chat imported successfully"
|
|
||||||
msgstr "Чат успешно импортирован"
|
|
||||||
|
|
||||||
#: window.py:451
|
|
||||||
msgid "Task Complete"
|
|
||||||
msgstr "Задача выполнена"
|
|
||||||
|
|
||||||
#: window.py:451
|
|
||||||
msgid "Model '{}' pulled successfully."
|
|
||||||
msgstr "Модель '{}' успешно извлечена."
|
|
||||||
|
|
||||||
#: window.py:456
|
|
||||||
msgid "Pull Model Error"
|
|
||||||
msgstr "Ошибка Извлечения Модели"
|
|
||||||
|
|
||||||
#: window.py:456
|
|
||||||
msgid "Failed to pull model '{}' due to network error."
|
|
||||||
msgstr "Не удалось извлечь модель '{}' из-за сетевой ошибки."
|
|
||||||
|
|
||||||
#: window.py:472
|
|
||||||
msgid "Stop Model"
|
|
||||||
msgstr "Остановить Модель"
|
|
||||||
|
|
||||||
#: window.py:473
|
|
||||||
msgid "Are you sure you want to stop pulling '{}'?"
|
|
||||||
msgstr "Вы уверены, что хотите прекратить извлечение '{}'?"
|
|
||||||
|
|
||||||
#: window.py:476 window.py:519 window.py:542 window.py:615 window.py:688
|
|
||||||
#: window.py:715 window.py:748 window.py:788
|
|
||||||
msgid "Cancel"
|
|
||||||
msgstr "Отмена"
|
|
||||||
|
|
||||||
#: window.py:477
|
|
||||||
msgid "Stop"
|
|
||||||
msgstr "Стоп"
|
|
||||||
|
|
||||||
#: window.py:515
|
|
||||||
msgid "Delete Model"
|
|
||||||
msgstr "Удалить Модель"
|
|
||||||
|
|
||||||
#: window.py:516 window.py:712
|
|
||||||
msgid "Are you sure you want to delete '{}'?"
|
|
||||||
msgstr "Вы уверены, что хотите удалить '{}'?"
|
|
||||||
|
|
||||||
#: window.py:520 window.py:716
|
|
||||||
msgid "Delete"
|
|
||||||
msgstr "Удалить"
|
|
||||||
|
|
||||||
#: window.py:537
|
|
||||||
msgid "Pull Model"
|
|
||||||
msgstr "Извлечение модели"
|
|
||||||
|
|
||||||
#: window.py:538
|
|
||||||
msgid "Please select a tag to pull '{}'"
|
|
||||||
msgstr "Пожалуйста, выберите тег для извлечения '{}'"
|
|
||||||
|
|
||||||
#: window.py:543
|
|
||||||
msgid "Pull"
|
|
||||||
msgstr "Извлечение"
|
|
||||||
|
|
||||||
#: window.py:611 window.ui:462
|
|
||||||
msgid "Clear Chat"
|
|
||||||
msgstr "Очистить Чат"
|
|
||||||
|
|
||||||
#: window.py:612
|
|
||||||
msgid "Are you sure you want to clear the chat?"
|
|
||||||
msgstr "Вы уверены, что хотите очистить чат?"
|
|
||||||
|
|
||||||
#: window.py:616
|
|
||||||
msgid "Clear"
|
|
||||||
msgstr "Очистить"
|
|
||||||
|
|
||||||
#: window.py:684
|
|
||||||
msgid "Remove Image"
|
|
||||||
msgstr "Удалить Изображение"
|
|
||||||
|
|
||||||
#: window.py:685
|
|
||||||
msgid "Are you sure you want to remove image?"
|
|
||||||
msgstr "Вы уверены, что хотите удалить изображение?"
|
|
||||||
|
|
||||||
#: window.py:689
|
|
||||||
msgid "Remove"
|
|
||||||
msgstr "Удалить"
|
|
||||||
|
|
||||||
#: window.py:711
|
|
||||||
msgid "Delete Chat"
|
|
||||||
msgstr "Удалить Чат"
|
|
||||||
|
|
||||||
#: window.py:742
|
|
||||||
msgid "Rename Chat"
|
|
||||||
msgstr "Переименовать Чат"
|
|
||||||
|
|
||||||
#: window.py:749
|
|
||||||
msgid "Rename"
|
|
||||||
msgstr "Переименовать"
|
|
||||||
|
|
||||||
#: window.py:769
|
|
||||||
msgid "The name '{}' is already in use"
|
|
||||||
msgstr "Имя '{}' уже используется"
|
|
||||||
|
|
||||||
#: window.py:782
|
|
||||||
msgid "Create Chat"
|
|
||||||
msgstr "Создать Чат"
|
|
||||||
|
|
||||||
#: window.py:789
|
|
||||||
msgid "Create"
|
|
||||||
msgstr "Создать"
|
|
||||||
|
|
||||||
#: window.ui:46
|
|
||||||
msgid "Chats"
|
|
||||||
msgstr "Чаты"
|
|
||||||
|
|
||||||
#: window.ui:56
|
|
||||||
msgid "Import chat"
|
|
||||||
msgstr "Импорт чата"
|
|
||||||
|
|
||||||
#: window.ui:69
|
|
||||||
msgid "Export chat"
|
|
||||||
msgstr "Экспорт чата"
|
|
||||||
|
|
||||||
#: window.ui:82
|
|
||||||
msgid "New chat"
|
|
||||||
msgstr "Новый чат"
|
|
||||||
|
|
||||||
#: window.ui:118
|
|
||||||
msgid "Toggle Sidebar"
|
|
||||||
msgstr "Переключение боковой панели"
|
|
||||||
|
|
||||||
#: window.ui:139 window.ui:315
|
|
||||||
msgid "Manage models"
|
|
||||||
msgstr "Управление моделями"
|
|
||||||
|
|
||||||
#: window.ui:153
|
|
||||||
msgid "Menu"
|
|
||||||
msgstr "Меню"
|
|
||||||
|
|
||||||
#: window.ui:231
|
|
||||||
msgid "Send"
|
|
||||||
msgstr "Отправить"
|
|
||||||
|
|
||||||
#: window.ui:240
|
|
||||||
msgid "Requires model 'llava' to be selected"
|
|
||||||
msgstr "Требуется выбрать модель \"llava\""
|
|
||||||
|
|
||||||
#: window.ui:243
|
|
||||||
msgid "Image"
|
|
||||||
msgstr "Изображение"
|
|
||||||
|
|
||||||
#: window.ui:266 window.ui:466 window.ui:517
|
|
||||||
msgid "Preferences"
|
|
||||||
msgstr "Настройки"
|
|
||||||
|
|
||||||
#: window.ui:269 window.ui:501
|
|
||||||
msgid "General"
|
|
||||||
msgstr "Общие"
|
|
||||||
|
|
||||||
#: window.ui:273
|
|
||||||
msgid "Remote Connection"
|
|
||||||
msgstr "Удаленное подключение"
|
|
||||||
|
|
||||||
#: window.ui:274
|
|
||||||
msgid "Manage a remote connection to Ollama"
|
|
||||||
msgstr "Управление удаленным подключением к Ollama"
|
|
||||||
|
|
||||||
#: window.ui:277
|
|
||||||
msgid "Use remote connection"
|
|
||||||
msgstr "Использовать удаленное подключение"
|
|
||||||
|
|
||||||
#: window.ui:282
|
|
||||||
msgid "URL of remote instance"
|
|
||||||
msgstr "URL-адрес удаленного экземпляра"
|
|
||||||
|
|
||||||
#: window.ui:290
|
|
||||||
msgid "Behavior"
|
|
||||||
msgstr "Поведение"
|
|
||||||
|
|
||||||
#: window.ui:291
|
|
||||||
msgid "Manage Alpaca's Behavior"
|
|
||||||
msgstr "Управление поведением Alpaca"
|
|
||||||
|
|
||||||
#: window.ui:294
|
|
||||||
msgid "Run in background"
|
|
||||||
msgstr "Запуск в фоновом режиме"
|
|
||||||
|
|
||||||
#: window.ui:385
|
|
||||||
msgid "Previous"
|
|
||||||
msgstr "Предыдущий"
|
|
||||||
|
|
||||||
#: window.ui:400
|
|
||||||
msgid "Next"
|
|
||||||
msgstr "Следующий"
|
|
||||||
|
|
||||||
#: window.ui:426
|
|
||||||
msgid "Welcome to Alpaca"
|
|
||||||
msgstr "Добро пожаловать в Alpaca"
|
|
||||||
|
|
||||||
#: window.ui:427
|
|
||||||
msgid "Powered by Ollama"
|
|
||||||
msgstr "При поддержке Ollama"
|
|
||||||
|
|
||||||
#: window.ui:430
|
|
||||||
msgid "Ollama Website"
|
|
||||||
msgstr "Веб-сайт Ollama"
|
|
||||||
|
|
||||||
#: window.ui:446
|
|
||||||
msgid "Disclaimer"
|
|
||||||
msgstr "Отказ от ответственности"
|
|
||||||
|
|
||||||
#: window.ui:447
|
|
||||||
msgid ""
|
|
||||||
"Alpaca and its developers are not liable for any damages to devices or "
|
|
||||||
"software resulting from the execution of code generated by an AI model. "
|
|
||||||
"Please exercise caution and review the code carefully before running it."
|
|
||||||
msgstr ""
|
|
||||||
"Alpaca и ее разработчики не несут ответственности за любой ущерб, "
|
|
||||||
"причиненный устройствам или программному обеспечению в результате выполнения "
|
|
||||||
"кода, сгенерированного с помощью модели искусственного интеллекта. "
|
|
||||||
"Пожалуйста, будьте осторожны и внимательно ознакомьтесь с кодом перед его "
|
|
||||||
"запуском."
|
|
||||||
|
|
||||||
#: window.ui:470
|
|
||||||
msgid "Keyboard Shortcuts"
|
|
||||||
msgstr "Комбинации Клавиш"
|
|
||||||
|
|
||||||
#: window.ui:474
|
|
||||||
msgid "About Alpaca"
|
|
||||||
msgstr "О Программе"
|
|
||||||
|
|
||||||
#: window.ui:505
|
|
||||||
msgid "Close application"
|
|
||||||
msgstr "Закрыть приложение"
|
|
||||||
|
|
||||||
#: window.ui:511
|
|
||||||
msgid "Clear chat"
|
|
||||||
msgstr "Очистить чат"
|
|
||||||
|
|
||||||
#: window.ui:523
|
|
||||||
msgid "Show shortcuts window"
|
|
||||||
msgstr "Показать окно комбинаций клавиш"
|
|
||||||
|
|
||||||
#: window.ui:530
|
|
||||||
msgid "Editor"
|
|
||||||
msgstr "Редактор"
|
|
||||||
|
|
||||||
#: window.ui:534
|
|
||||||
msgid "Copy"
|
|
||||||
msgstr "Копировать"
|
|
||||||
|
|
||||||
#: window.ui:540
|
|
||||||
msgid "Paste"
|
|
||||||
msgstr "Вставить"
|
|
||||||
|
|
||||||
#: window.ui:546
|
|
||||||
msgid "Send Message"
|
|
||||||
msgstr "Отправить Сообщение"
|
|
||||||
|
|
||||||
#, fuzzy
|
|
||||||
#~ msgid "Added basic shortcuts"
|
|
||||||
#~ msgstr "Показывать ярлыки"
|
|
||||||
|
|
||||||
#~ msgid "Save Changes"
|
|
||||||
#~ msgstr "Сохранить Изменения"
|
|
||||||
|
|
||||||
#~ msgid "Do you want to save the URL change?"
|
|
||||||
#~ msgstr "Хотите сохранить изменение URL?"
|
|
||||||
|
|
||||||
#~ msgid "Discard"
|
|
||||||
#~ msgstr "Отказаться"
|
|
||||||
|
|
||||||
#~ msgid "Save"
|
|
||||||
#~ msgstr "Сохранить"
|
|
||||||
|
|
||||||
#~ msgid ""
|
|
||||||
#~ "To get started, please ensure you have an Ollama instance set up. You can "
|
|
||||||
#~ "either run Ollama locally on your machine or connect to a remote instance."
|
|
||||||
#~ msgstr ""
|
|
||||||
#~ "Для начала, пожалуйста, убедитесь, что у вас настроен экземпляр Ollama. "
|
|
||||||
#~ "Вы можете либо запустить Ollama локально на своем компьютере, либо "
|
|
||||||
#~ "подключиться к удаленному экземпляру."
|
|
||||||
|
|
||||||
#~ msgid "Setup"
|
|
||||||
#~ msgstr "Установка"
|
|
||||||
|
|
||||||
#~ msgid ""
|
|
||||||
#~ "If you are running an Ollama instance locally and haven't modified the "
|
|
||||||
#~ "default ports, you can use the default URL. Otherwise, please enter the "
|
|
||||||
#~ "URL of your Ollama instance."
|
|
||||||
#~ msgstr ""
|
|
||||||
#~ "Если вы запускаете локальный экземпляр Ollama и не изменили порты по "
|
|
||||||
#~ "умолчанию, вы можете использовать URL-адрес по умолчанию. В противном "
|
|
||||||
#~ "случае, пожалуйста, введите URL-адрес вашего экземпляра Ollama."
|
|
||||||
|
|
||||||
#~ msgid "Change Server"
|
|
||||||
#~ msgstr "Изменить Сервер"
|
|
||||||
|
|
||||||
#~ msgid "Change server"
|
|
||||||
#~ msgstr "Изменить Сервер"
|
|
||||||
@@ -3,6 +3,27 @@
|
|||||||
<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 alias="icons/scalable/status/brain-augemnted-symbolic.svg">icons/brain-augemnted-symbolic.svg</file>
|
||||||
|
<file alias="icons/scalable/status/chain-link-loose-symbolic.svg">icons/chain-link-loose-symbolic.svg</file>
|
||||||
|
<file alias="icons/scalable/status/document-text-symbolic.svg">icons/document-text-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")
|
||||||
@@ -13,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)
|
||||||
@@ -38,4 +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}
|
||||||
|
|
||||||
|
|||||||
@@ -57,7 +57,8 @@ def rename_chat_response(self, dialog, task, old_chat_name, entry, label_element
|
|||||||
if new_chat_name and (task is None or dialog.choose_finish(task) == "rename"):
|
if new_chat_name and (task is None or dialog.choose_finish(task) == "rename"):
|
||||||
self.rename_chat(old_chat_name, new_chat_name, label_element)
|
self.rename_chat(old_chat_name, new_chat_name, label_element)
|
||||||
|
|
||||||
def rename_chat(self, chat_name:str, label_element):
|
def rename_chat(self, label_element):
|
||||||
|
chat_name = label_element.get_parent().get_name()
|
||||||
entry = Gtk.Entry()
|
entry = Gtk.Entry()
|
||||||
dialog = Adw.AlertDialog(
|
dialog = Adw.AlertDialog(
|
||||||
heading=_("Rename Chat"),
|
heading=_("Rename Chat"),
|
||||||
@@ -75,7 +76,7 @@ def rename_chat(self, chat_name:str, label_element):
|
|||||||
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)
|
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
|
# 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):
|
def new_chat_response(self, dialog, task, entry):
|
||||||
chat_name = _("New Chat")
|
chat_name = _("New Chat")
|
||||||
@@ -148,13 +149,13 @@ def delete_model(self, model_name):
|
|||||||
|
|
||||||
def pull_model_response(self, dialog, task, model_name, tag_drop_down):
|
def pull_model_response(self, dialog, task, model_name, tag_drop_down):
|
||||||
if dialog.choose_finish(task) == "pull":
|
if dialog.choose_finish(task) == "pull":
|
||||||
model = f"{model_name}:{tag_drop_down.get_selected_item().get_string()}"
|
model = f"{model_name}:{tag_drop_down.get_selected_item().get_string().split(' | ')[0]}"
|
||||||
self.pull_model(model)
|
self.pull_model(model)
|
||||||
|
|
||||||
def pull_model(self, model_name):
|
def pull_model(self, model_name):
|
||||||
tag_list = Gtk.StringList()
|
tag_list = Gtk.StringList()
|
||||||
for tag in available_models[model_name]['tags']:
|
for tag in available_models[model_name]['tags']:
|
||||||
tag_list.append(tag)
|
tag_list.append(f"{tag[0]} | {tag[1]}")
|
||||||
tag_drop_down = Gtk.DropDown(
|
tag_drop_down = Gtk.DropDown(
|
||||||
enable_search=True,
|
enable_search=True,
|
||||||
model=tag_list
|
model=tag_list
|
||||||
@@ -176,14 +177,14 @@ def pull_model(self, model_name):
|
|||||||
|
|
||||||
# REMOVE IMAGE | WORKS
|
# REMOVE IMAGE | WORKS
|
||||||
|
|
||||||
def remove_image_response(self, dialog, task):
|
def remove_attached_file_response(self, dialog, task, button):
|
||||||
if dialog.choose_finish(task) == 'remove':
|
if dialog.choose_finish(task) == 'remove':
|
||||||
self.remove_image()
|
self.remove_attached_file(button)
|
||||||
|
|
||||||
def remove_image(self):
|
def remove_attached_file(self, button):
|
||||||
dialog = Adw.AlertDialog(
|
dialog = Adw.AlertDialog(
|
||||||
heading=_("Remove Image"),
|
heading=_("Remove File"),
|
||||||
body=_("Are you sure you want to remove image?"),
|
body=_("Are you sure you want to remove file?"),
|
||||||
close_response="cancel"
|
close_response="cancel"
|
||||||
)
|
)
|
||||||
dialog.add_response("cancel", _("Cancel"))
|
dialog.add_response("cancel", _("Cancel"))
|
||||||
@@ -192,10 +193,10 @@ def remove_image(self):
|
|||||||
dialog.choose(
|
dialog.choose(
|
||||||
parent = self,
|
parent = self,
|
||||||
cancellable = None,
|
cancellable = None,
|
||||||
callback = lambda dialog, task: remove_image_response(self, dialog, task)
|
callback = lambda dialog, task, button=button: remove_attached_file_response(self, dialog, task, button)
|
||||||
)
|
)
|
||||||
|
|
||||||
# RECONNECT REMOTE |
|
# RECONNECT REMOTE | WORKS
|
||||||
|
|
||||||
def reconnect_remote_response(self, dialog, task, entry):
|
def reconnect_remote_response(self, dialog, task, entry):
|
||||||
response = dialog.choose_finish(task)
|
response = dialog.choose_finish(task)
|
||||||
@@ -206,10 +207,10 @@ def reconnect_remote_response(self, dialog, task, entry):
|
|||||||
elif response == "close":
|
elif response == "close":
|
||||||
self.destroy()
|
self.destroy()
|
||||||
|
|
||||||
def reconnect_remote(self):
|
def reconnect_remote(self, current_url):
|
||||||
entry = Gtk.Entry(
|
entry = Gtk.Entry(
|
||||||
css_classes = ["error"],
|
css_classes = ["error"],
|
||||||
text = self.ollama_url
|
text = current_url
|
||||||
)
|
)
|
||||||
dialog = Adw.AlertDialog(
|
dialog = Adw.AlertDialog(
|
||||||
heading=_("Connection Error"),
|
heading=_("Connection Error"),
|
||||||
@@ -226,3 +227,58 @@ def reconnect_remote(self):
|
|||||||
cancellable = None,
|
cancellable = None,
|
||||||
callback = lambda dialog, task, entry=entry: reconnect_remote_response(self, dialog, task, entry)
|
callback = lambda dialog, task, entry=entry: reconnect_remote_response(self, dialog, task, entry)
|
||||||
)
|
)
|
||||||
|
|
||||||
|
# CREATE MODEL | WORKS
|
||||||
|
|
||||||
|
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))
|
||||||
|
|
||||||
|
# FILE CHOOSER | WORKS
|
||||||
|
|
||||||
|
def attach_file_response(self, file_dialog, result, file_type):
|
||||||
|
try: file = file_dialog.open_finish(result)
|
||||||
|
except: return
|
||||||
|
self.attach_file(file.get_path(), file_type)
|
||||||
|
|
||||||
|
|
||||||
|
def attach_file(self, filter, file_type):
|
||||||
|
if file_type == 'image' and not self.verify_if_image_can_be_used():
|
||||||
|
self.show_toast('error', 8, self.main_overlay)
|
||||||
|
return
|
||||||
|
file_dialog = Gtk.FileDialog(default_filter=filter)
|
||||||
|
file_dialog.open(self, None, lambda file_dialog, result, file_type=file_type: attach_file_response(self, file_dialog, result, file_type))
|
||||||
|
|||||||
2
src/icons/brain-augemnted-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 5.976562 2 c 0.546876 0 1 0.453125 1 1 v 10 c 0 0.546875 -0.453124 1 -1 1 h -0.976562 c -1.652344 0 -3 -1.347656 -3 -3 v -6 c 0 -1.652344 1.347656 -3 3 -3 z m -5.976562 3 v 6 c 0 2.765625 2.234375 5 5 5 h 0.976562 c 1.660157 0 3 -1.339844 3 -3 v -10 c 0 -1.660156 -1.339843 -3 -3 -3 h -0.976562 c -2.765625 0 -5 2.234375 -5 5 z m 0 0"/><path d="m 1.488281 8.996094 h 1.511719 c 1.101562 0 1.988281 -0.886719 1.988281 -1.984375 v -0.515625 c 0 -0.273438 -0.222656 -0.5 -0.5 -0.5 c -0.273437 0 -0.5 0.226562 -0.5 0.5 v 0.515625 c 0 0.542969 -0.445312 0.984375 -0.988281 0.984375 h -1.511719 c -0.273437 0 -0.5 0.226562 -0.5 0.5 c 0 0.277344 0.226563 0.5 0.5 0.5 z m 0 0"/><path d="m 7.5 9.992188 h -1.511719 c -1.101562 0 -1.988281 0.886718 -1.988281 1.984374 v 0.515626 c 0 0.273437 0.222656 0.5 0.5 0.5 s 0.5 -0.226563 0.5 -0.5 v -0.515626 c 0 -0.539062 0.445312 -0.984374 0.988281 -0.984374 h 1.511719 c 0.277344 0 0.5 -0.226563 0.5 -0.5 c 0 -0.277344 -0.222656 -0.5 -0.5 -0.5 z m 0 0"/><path d="m 11.015625 14 h -1.035156 c -0.546875 0 -1 -0.453125 -1 -1 v -10 c 0 -0.546875 0.453125 -1 1 -1 h 1.035156 v -2 h -1.035156 c -1.664063 0 -3 1.339844 -3 3 v 10 c 0 1.660156 1.335937 3 3 3 h 1.035156 z m 0 0"/><path d="m 10 5 h 2.242188 l 2.148437 -2.6875 l -0.78125 -0.625 l -2 2.5 l 0.390625 -0.1875 h -2 z m 0 0"/><path d="m 10 11 h 2 l -0.390625 -0.1875 l 2 2.5 l 0.78125 -0.625 l -2.148437 -2.6875 h -2.242188 z m 0 0"/><path d="m 14.488281 1.976562 c -0.265625 0 -0.488281 -0.21875 -0.488281 -0.488281 c 0 -0.265625 0.222656 -0.488281 0.488281 -0.488281 c 0.269531 0 0.488281 0.222656 0.488281 0.488281 c 0 0.269531 -0.21875 0.488281 -0.488281 0.488281 z m 0 -1.976562 c -0.824219 0 -1.488281 0.664062 -1.488281 1.488281 s 0.664062 1.488281 1.488281 1.488281 s 1.488281 -0.664062 1.488281 -1.488281 s -0.664062 -1.488281 -1.488281 -1.488281 z m 0 0"/><path d="m 14.488281 13.976562 c -0.265625 0 -0.488281 -0.21875 -0.488281 -0.488281 c 0 -0.265625 0.222656 -0.488281 0.488281 -0.488281 c 0.269531 0 0.488281 0.222656 0.488281 0.488281 c 0 0.269531 -0.21875 0.488281 -0.488281 0.488281 z m 0 -1.976562 c -0.824219 0 -1.488281 0.664062 -1.488281 1.488281 s 0.664062 1.488281 1.488281 1.488281 s 1.488281 -0.664062 1.488281 -1.488281 s -0.664062 -1.488281 -1.488281 -1.488281 z m 0 0"/><path d="m 14.488281 7.976562 c -0.265625 0 -0.488281 -0.21875 -0.488281 -0.488281 c 0 -0.265625 0.222656 -0.488281 0.488281 -0.488281 c 0.269531 0 0.488281 0.222656 0.488281 0.488281 c 0 0.269531 -0.21875 0.488281 -0.488281 0.488281 z m 0 -1.976562 c -0.824219 0 -1.488281 0.664062 -1.488281 1.488281 s 0.664062 1.488281 1.488281 1.488281 s 1.488281 -0.664062 1.488281 -1.488281 s -0.664062 -1.488281 -1.488281 -1.488281 z m 0 0"/></g><path d="m 10 7.53125 h 4" fill="none" stroke="#222222"/><path d="m 4.5 4 h 3 c 0.277344 0 0.5 0.222656 0.5 0.5 s -0.222656 0.5 -0.5 0.5 h -3 c -0.277344 0 -0.5 -0.222656 -0.5 -0.5 s 0.222656 -0.5 0.5 -0.5 z m 0 0" fill="#222222"/></svg>
|
||||||
|
After Width: | Height: | Size: 3.0 KiB |
2
src/icons/chain-link-loose-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 2.683594 9.777344 c -1.570313 -0.542969 -2.683594 -2.039063 -2.683594 -3.777344 c 0 -2.199219 1.800781 -4 4 -4 h 3 c 2.199219 0 4 1.800781 4 4 c 0 1.640625 -0.992188 3.070312 -2.421875 3.679688 l -0.785156 -1.839844 c 0.710937 -0.304688 1.207031 -1 1.207031 -1.839844 c 0 -1.125 -0.875 -2 -2 -2 h -3 c -1.125 0 -2 0.875 -2 2 c 0 0.890625 0.558594 1.621094 1.339844 1.890625 z m 0 0"/><path d="m 8 14 c -2.199219 0 -4 -1.800781 -4 -4 c 0 -1.621094 0.96875 -3.03125 2.367188 -3.65625 l 0.816406 1.828125 c -0.699219 0.3125 -1.183594 1 -1.183594 1.828125 c 0 1.125 0.875 2 2 2 h 3 c 1.125 0 2 -0.875 2 -2 c 0 -0.867188 -0.53125 -1.582031 -1.277344 -1.867188 l 0.714844 -1.867187 c 1.503906 0.574219 2.5625 2.039063 2.5625 3.734375 c 0 2.199219 -1.800781 4 -4 4 z m 0 0"/></g></svg>
|
||||||
|
After Width: | Height: | Size: 934 B |
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 |
2
src/icons/document-text-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 9 2 v 5 h 4 v -1 z m -4 2 v 1 h 3 v -1 z m 0 2 v 1 h 3 v -1 z m 0 2 v 1 h 6 v -1 z m 0 2 v 1 h 6 v -1 z m 0 2 v 1 h 6 v -1 z m 0 0"/><path d="m 2 13 c 0 1.660156 1.339844 3 3 3 h 6 c 1.660156 0 3 -1.339844 3 -3 v -6 c 0 -0.90625 -0.359375 -1.773438 -1 -2.414062 l -2.585938 -2.585938 c -0.640624 -0.640625 -1.507812 -1 -2.414062 -1 h -3 c -1.660156 0 -3 1.339844 -3 3 z m 3 -10 h 3 c 0.375 0 0.734375 0.148438 1 0.414062 l 2.585938 2.585938 c 0.265624 0.265625 0.414062 0.625 0.414062 1 v 6 c 0 0.546875 -0.453125 1 -1 1 h -6 c -0.546875 0 -1 -0.453125 -1 -1 v -9 c 0 -0.546875 0.453125 -1 1 -1 z m 0 0"/></g></svg>
|
||||||
|
After Width: | Height: | Size: 771 B |
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 |
@@ -1,23 +1,32 @@
|
|||||||
# local_instance.py
|
# local_instance.py
|
||||||
import subprocess, os
|
import subprocess, os, threading
|
||||||
from time import sleep
|
from time import sleep
|
||||||
|
|
||||||
instance = None
|
instance = None
|
||||||
port = 11435
|
port = 11435
|
||||||
|
data_dir = os.getenv("XDG_DATA_HOME")
|
||||||
|
overrides = {}
|
||||||
|
|
||||||
def start(data_dir):
|
def start():
|
||||||
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)
|
global instance, overrides
|
||||||
|
params = overrides.copy()
|
||||||
|
params["OLLAMA_HOST"] = f"127.0.0.1:{port}" # You can't change this directly sorry :3
|
||||||
|
params["HOME"] = data_dir
|
||||||
|
instance = subprocess.Popen(["/app/bin/ollama", "serve"], env={**os.environ, **params}, stderr=subprocess.PIPE, text=True)
|
||||||
print("Starting Alpaca's Ollama instance...")
|
print("Starting Alpaca's Ollama instance...")
|
||||||
sleep(1)
|
sleep(1)
|
||||||
while True:
|
|
||||||
err = instance.stderr.readline()
|
|
||||||
if err == '' and instance.poll() is not None:
|
|
||||||
break
|
|
||||||
if 'msg="inference compute"' in err: #Ollama outputs a line with this when it finishes loading, yeah
|
|
||||||
break
|
|
||||||
print("Started Alpaca's Ollama instance")
|
print("Started Alpaca's Ollama instance")
|
||||||
|
|
||||||
def stop():
|
def stop():
|
||||||
if instance: instance.kill()
|
global instance
|
||||||
print("Stopped Alpaca's Ollama instance")
|
if instance:
|
||||||
|
instance.kill()
|
||||||
|
instance.wait()
|
||||||
|
instance = None
|
||||||
|
print("Stopped Alpaca's Ollama instance")
|
||||||
|
|
||||||
|
def reset():
|
||||||
|
stop()
|
||||||
|
sleep(1)
|
||||||
|
start()
|
||||||
|
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
# main.py
|
# main.py
|
||||||
#
|
#
|
||||||
# Copyright 2024 Unknown
|
# Copyright 2024 Jeffser
|
||||||
#
|
#
|
||||||
# This program is free software: you can redistribute it and/or modify
|
# This program is free software: you can redistribute it and/or modify
|
||||||
# it under the terms of the GNU General Public License as published by
|
# it under the terms of the GNU General Public License as published by
|
||||||
@@ -47,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.6',
|
version='0.9.4',
|
||||||
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,6 +26,15 @@ configure_file(
|
|||||||
install_mode: 'r-xr-xr-x'
|
install_mode: 'r-xr-xr-x'
|
||||||
)
|
)
|
||||||
|
|
||||||
|
#configure_file(
|
||||||
|
#input: 'alpaca_search_provider.in',
|
||||||
|
#output: 'alpaca_search_provider',
|
||||||
|
#configuration: conf,
|
||||||
|
#install: true,
|
||||||
|
#install_dir: get_option('bindir'),
|
||||||
|
#install_mode: 'r-xr-xr-x'
|
||||||
|
#)
|
||||||
|
|
||||||
alpaca_sources = [
|
alpaca_sources = [
|
||||||
'__init__.py',
|
'__init__.py',
|
||||||
'main.py',
|
'main.py',
|
||||||
@@ -33,7 +42,8 @@ alpaca_sources = [
|
|||||||
'connection_handler.py',
|
'connection_handler.py',
|
||||||
'available_models.py',
|
'available_models.py',
|
||||||
'dialogs.py',
|
'dialogs.py',
|
||||||
'local_instance.py'
|
'local_instance.py',
|
||||||
|
'update_history.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;
|
||||||
}
|
}
|
||||||
|
|||||||
38
src/update_history.py
Normal file
@@ -0,0 +1,38 @@
|
|||||||
|
# update_history.py
|
||||||
|
# This script updates the old chats.json file to the structure needed for the new version
|
||||||
|
import os, json, base64
|
||||||
|
from PIL import Image
|
||||||
|
import io
|
||||||
|
|
||||||
|
|
||||||
|
def update(self):
|
||||||
|
old_data = None
|
||||||
|
new_data = {"chats": {}}
|
||||||
|
with open(os.path.join(self.config_dir, "chats.json"), 'r') as f:
|
||||||
|
old_data = json.load(f)["chats"]
|
||||||
|
for chat_name, content in old_data.items():
|
||||||
|
directory = os.path.join(self.data_dir, "chats", chat_name)
|
||||||
|
if not os.path.exists(directory): os.makedirs(directory)
|
||||||
|
new_messages = {}
|
||||||
|
for message in content['messages']:
|
||||||
|
message_id = self.generate_uuid()
|
||||||
|
if 'images' in message:
|
||||||
|
if not os.path.exists(os.path.join(directory, message_id)): os.makedirs(os.path.join(directory, message_id))
|
||||||
|
new_images = []
|
||||||
|
for image in message['images']:
|
||||||
|
file_name = f"{self.generate_uuid()}.png"
|
||||||
|
decoded = base64.b64decode(image)
|
||||||
|
buffer = io.BytesIO(decoded)
|
||||||
|
im = Image.open(buffer)
|
||||||
|
im.save(os.path.join(directory, message_id, file_name))
|
||||||
|
new_images.append(file_name)
|
||||||
|
message['images'] = new_images
|
||||||
|
new_messages[message_id] = message
|
||||||
|
new_data['chats'][chat_name] = {}
|
||||||
|
new_data['chats'][chat_name]['messages'] = new_messages
|
||||||
|
|
||||||
|
with open(os.path.join(self.data_dir, "chats", "chats.json"), "w+") as f:
|
||||||
|
json.dump(new_data, f, indent=6)
|
||||||
|
|
||||||
|
os.remove(os.path.join(self.config_dir, "chats.json"))
|
||||||
|
|
||||||
778
src/window.py
546
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,7 +24,9 @@
|
|||||||
<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>
|
||||||
|
<setter object="file_preview_dialog" property="width-request">360</setter>
|
||||||
</object>
|
</object>
|
||||||
</child>
|
</child>
|
||||||
<property name="content">
|
<property name="content">
|
||||||
@@ -43,21 +46,11 @@
|
|||||||
</object>
|
</object>
|
||||||
</child>
|
</child>
|
||||||
<child type="end">
|
<child type="end">
|
||||||
<object class="GtkButton" id="import_chat_button">
|
<object class="GtkMenuButton" id="chats_menu_button">
|
||||||
<property name="tooltip-text" translatable="yes">Import chat</property>
|
<property name="direction">1</property>
|
||||||
<property name="icon-name">document-open-symbolic</property>
|
<property name="halign">3</property>
|
||||||
<style>
|
<property name="menu-model">chats_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>
|
||||||
@@ -112,7 +105,7 @@
|
|||||||
<property name="tooltip-text" translatable="yes">Manage models</property>
|
<property name="tooltip-text" translatable="yes">Manage models</property>
|
||||||
<child>
|
<child>
|
||||||
<object class="AdwButtonContent">
|
<object class="AdwButtonContent">
|
||||||
<property name="icon-name">package-x-generic-symbolic</property>
|
<property name="icon-name">library-symbolic</property>
|
||||||
</object>
|
</object>
|
||||||
</child>
|
</child>
|
||||||
</object>
|
</object>
|
||||||
@@ -171,75 +164,115 @@
|
|||||||
<object class="AdwClamp">
|
<object class="AdwClamp">
|
||||||
<property name="maximum-size">1000</property>
|
<property name="maximum-size">1000</property>
|
||||||
<property name="tightening-threshold">800</property>
|
<property name="tightening-threshold">800</property>
|
||||||
<child>
|
<child>
|
||||||
<object class="GtkBox">
|
<object class="GtkBox">
|
||||||
<property name="orientation">0</property>
|
<property name="orientation">1</property>
|
||||||
<property name="spacing">12</property>
|
<property name="spacing">12</property>
|
||||||
<property name="margin-top">12</property>
|
<property name="margin-top">12</property>
|
||||||
<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="GtkBox">
|
|
||||||
<style>
|
|
||||||
<class name="message-input"/>
|
|
||||||
</style>
|
|
||||||
<child>
|
|
||||||
<object class="GtkScrolledWindow">
|
|
||||||
<property name="margin-start">12</property>
|
|
||||||
<property name="margin-end">12</property>
|
|
||||||
|
|
||||||
<child>
|
|
||||||
<object class="GtkTextView" id="message_text_view">
|
|
||||||
<property name="wrap-mode">word</property>
|
|
||||||
<property name="top-margin">6</property>
|
|
||||||
<property name="bottom-margin">6</property>
|
|
||||||
<property name="margin-end">12</property>
|
|
||||||
<property name="hexpand">true</property>
|
|
||||||
<style>
|
|
||||||
<class name="message-text-view"/>
|
|
||||||
</style>
|
|
||||||
</object>
|
|
||||||
</child>
|
|
||||||
</object>
|
|
||||||
</child>
|
|
||||||
</object>
|
|
||||||
|
|
||||||
</child>
|
|
||||||
<child>
|
<child>
|
||||||
<object class="GtkBox">
|
<object class="GtkScrolledWindow" id="attachment_box">
|
||||||
<property name="orientation">1</property>
|
<property name="visible">false</property>
|
||||||
<property name="spacing">12</property>
|
|
||||||
<child>
|
<child>
|
||||||
<object class="GtkButton" id="send_button">
|
<object class="GtkBox" id="attachment_container">
|
||||||
<signal name="clicked" handler="send_message"/>
|
<property name="orientation">0</property>
|
||||||
<style>
|
<property name="vexpand">false</property>
|
||||||
<class name="suggested-action"/>
|
<property name="spacing">12</property>
|
||||||
</style>
|
|
||||||
<child>
|
|
||||||
<object class="AdwButtonContent">
|
|
||||||
<property name="label" translatable="yes">Send</property>
|
|
||||||
<property name="icon-name">send-to-symbolic</property>
|
|
||||||
</object>
|
|
||||||
</child>
|
|
||||||
</object>
|
|
||||||
</child>
|
|
||||||
<child>
|
|
||||||
<object class="GtkButton" id="image_button">
|
|
||||||
<signal name="clicked" handler="open_image"/>
|
|
||||||
<property name="sensitive">false</property>
|
|
||||||
<property name="tooltip-text" translatable="yes">Only available on selected models</property>
|
|
||||||
<child>
|
|
||||||
<object class="AdwButtonContent">
|
|
||||||
<property name="label" translatable="yes">Image</property>
|
|
||||||
<property name="icon-name">image-x-generic-symbolic</property>
|
|
||||||
</object>
|
|
||||||
</child>
|
|
||||||
</object>
|
</object>
|
||||||
</child>
|
</child>
|
||||||
</object>
|
</object>
|
||||||
</child>
|
</child>
|
||||||
|
<child>
|
||||||
|
<object class="GtkBox">
|
||||||
|
<property name="orientation">0</property>
|
||||||
|
<property name="spacing">12</property>
|
||||||
|
<child>
|
||||||
|
<object class="GtkMenuButton" id="attachment_button">
|
||||||
|
<property name="menu-model">attachment_menu</property>
|
||||||
|
<property name="direction">0</property>
|
||||||
|
<property name="vexpand">false</property>
|
||||||
|
<property name="valign">3</property>
|
||||||
|
<property name="tooltip-text" translatable="yes">Attach file</property>
|
||||||
|
<style>
|
||||||
|
<class name="circular"/>
|
||||||
|
</style>
|
||||||
|
<child>
|
||||||
|
<object class="AdwButtonContent">
|
||||||
|
<property name="icon-name">chain-link-loose-symbolic</property>
|
||||||
|
</object>
|
||||||
|
</child>
|
||||||
|
</object>
|
||||||
|
</child>
|
||||||
|
<child>
|
||||||
|
<object class="GtkBox">
|
||||||
|
<style>
|
||||||
|
<class name="card"/>
|
||||||
|
<class name="message-input"/>
|
||||||
|
</style>
|
||||||
|
<child>
|
||||||
|
<object class="GtkScrolledWindow">
|
||||||
|
<property name="margin-start">12</property>
|
||||||
|
<property name="margin-end">12</property>
|
||||||
|
<style>
|
||||||
|
<class name="message-input"/>
|
||||||
|
<class name="undershoot-bottom"/>
|
||||||
|
<class name="undershoot-top"/>
|
||||||
|
</style>
|
||||||
|
<child>
|
||||||
|
<object class="GtkTextView" id="message_text_view">
|
||||||
|
<property name="wrap-mode">word</property>
|
||||||
|
<property name="top-margin">6</property>
|
||||||
|
<property name="bottom-margin">6</property>
|
||||||
|
<property name="hexpand">true</property>
|
||||||
|
<style>
|
||||||
|
<class name="message-input"/>
|
||||||
|
</style>
|
||||||
|
</object>
|
||||||
|
</child>
|
||||||
|
</object>
|
||||||
|
</child>
|
||||||
|
</object>
|
||||||
|
</child>
|
||||||
|
<child>
|
||||||
|
<object class="GtkButton" id="send_button">
|
||||||
|
<signal name="clicked" handler="send_message"/>
|
||||||
|
<property name="vexpand">false</property>
|
||||||
|
<property name="valign">3</property>
|
||||||
|
<property name="tooltip-text" translatable="yes">Send message</property>
|
||||||
|
<style>
|
||||||
|
<class name="suggested-action"/>
|
||||||
|
<class name="circular"/>
|
||||||
|
</style>
|
||||||
|
<child>
|
||||||
|
<object class="AdwButtonContent">
|
||||||
|
<property name="icon-name">paper-plane-symbolic</property>
|
||||||
|
</object>
|
||||||
|
</child>
|
||||||
|
</object>
|
||||||
|
</child>
|
||||||
|
<child>
|
||||||
|
<object class="GtkButton" id="stop_button">
|
||||||
|
<signal name="clicked" handler="stop_message"/>
|
||||||
|
<property name="vexpand">false</property>
|
||||||
|
<property name="valign">3</property>
|
||||||
|
<property name="visible">false</property>
|
||||||
|
<style>
|
||||||
|
<class name="destructive-action"/>
|
||||||
|
<class name="circular"/>
|
||||||
|
</style>
|
||||||
|
<child>
|
||||||
|
<object class="AdwButtonContent">
|
||||||
|
<property name="icon-name">media-playback-stop-symbolic</property>
|
||||||
|
</object>
|
||||||
|
</child>
|
||||||
|
</object>
|
||||||
|
</child>
|
||||||
|
</object>
|
||||||
|
</child>
|
||||||
</object>
|
</object>
|
||||||
|
|
||||||
</child>
|
</child>
|
||||||
</object>
|
</object>
|
||||||
</child>
|
</child>
|
||||||
@@ -257,9 +290,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>
|
||||||
@@ -291,6 +324,257 @@
|
|||||||
</child>
|
</child>
|
||||||
</object>
|
</object>
|
||||||
</child>
|
</child>
|
||||||
|
<child>
|
||||||
|
<object class="AdwPreferencesPage" id="model_page">
|
||||||
|
<property name="title" translatable="yes">Model</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>
|
||||||
|
<child>
|
||||||
|
<object class="AdwPreferencesPage" id="instance_page">
|
||||||
|
<property name="title" translatable="yes">Ollama Instance</property>
|
||||||
|
<property name="icon-name">brain-augemnted-symbolic</property>
|
||||||
|
<child>
|
||||||
|
<object class="AdwPreferencesGroup">
|
||||||
|
<property name="title" translatable="yes">Ollama Overrides</property>
|
||||||
|
<property name="description" translatable="yes">Manage the arguments used on Ollama, any changes on this page only applies to the integrated instance, the instance will restart if you make changes</property>
|
||||||
|
<child>
|
||||||
|
<object class="AdwEntryRow" id="override_HSA_OVERRIDE_GFX_VERSION">
|
||||||
|
<signal name="apply" handler="override_changed"/>
|
||||||
|
<property name="name">HSA_OVERRIDE_GFX_VERSION</property>
|
||||||
|
<property name="title" translatable="no">HSA_OVERRIDE_GFX_VERSION</property>
|
||||||
|
<property name="show-apply-button">true</property>
|
||||||
|
<child type="prefix">
|
||||||
|
<object class="GtkButton">
|
||||||
|
<signal name="clicked" handler="link_button_handler"/>
|
||||||
|
<property name="name">https://github.com/ollama/ollama/blob/main/docs/gpu.md#overrides</property>
|
||||||
|
<property name="vexpand">false</property>
|
||||||
|
<property name="valign">3</property>
|
||||||
|
<property name="icon-name">globe-symbolic</property>
|
||||||
|
<style>
|
||||||
|
<class name="success"/>
|
||||||
|
</style>
|
||||||
|
</object>
|
||||||
|
</child>
|
||||||
|
</object>
|
||||||
|
</child>
|
||||||
|
<child>
|
||||||
|
<object class="AdwEntryRow" id="override_CUDA_VISIBLE_DEVICES">
|
||||||
|
<signal name="apply" handler="override_changed"/>
|
||||||
|
<property name="name">CUDA_VISIBLE_DEVICES</property>
|
||||||
|
<property name="title" translatable="no">CUDA_VISIBLE_DEVICES</property>
|
||||||
|
<property name="show-apply-button">true</property>
|
||||||
|
<child type="prefix">
|
||||||
|
<object class="GtkButton">
|
||||||
|
<signal name="clicked" handler="link_button_handler"/>
|
||||||
|
<property name="name">https://github.com/ollama/ollama/blob/main/docs/gpu.md#gpu-selection</property>
|
||||||
|
<property name="vexpand">false</property>
|
||||||
|
<property name="valign">3</property>
|
||||||
|
<property name="icon-name">globe-symbolic</property>
|
||||||
|
<style>
|
||||||
|
<class name="success"/>
|
||||||
|
</style>
|
||||||
|
</object>
|
||||||
|
</child>
|
||||||
|
</object>
|
||||||
|
</child>
|
||||||
|
<child>
|
||||||
|
<object class="AdwEntryRow" id="override_HIP_VISIBLE_DEVICES">
|
||||||
|
<signal name="apply" handler="override_changed"/>
|
||||||
|
<property name="name">HIP_VISIBLE_DEVICES</property>
|
||||||
|
<property name="title" translatable="no">HIP_VISIBLE_DEVICES</property>
|
||||||
|
<property name="show-apply-button">true</property>
|
||||||
|
<child type="prefix">
|
||||||
|
<object class="GtkButton">
|
||||||
|
<signal name="clicked" handler="link_button_handler"/>
|
||||||
|
<property name="name">https://github.com/ollama/ollama/blob/main/docs/gpu.md#gpu-selection-1</property>
|
||||||
|
<property name="vexpand">false</property>
|
||||||
|
<property name="valign">3</property>
|
||||||
|
<property name="icon-name">globe-symbolic</property>
|
||||||
|
<style>
|
||||||
|
<class name="success"/>
|
||||||
|
</style>
|
||||||
|
</object>
|
||||||
|
</child>
|
||||||
|
</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">
|
||||||
@@ -303,6 +587,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>
|
||||||
@@ -359,6 +651,37 @@
|
|||||||
</child>
|
</child>
|
||||||
</object>
|
</object>
|
||||||
|
|
||||||
|
<object class="AdwDialog" id="file_preview_dialog">
|
||||||
|
<property name="can-close">true</property>
|
||||||
|
<property name="width-request">450</property>
|
||||||
|
<property name="height-request">450</property>
|
||||||
|
<child>
|
||||||
|
<object class="AdwToolbarView">
|
||||||
|
<child type="top">
|
||||||
|
<object class="AdwHeaderBar">
|
||||||
|
</object>
|
||||||
|
</child>
|
||||||
|
<child>
|
||||||
|
<object class="GtkScrolledWindow">
|
||||||
|
<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>
|
||||||
|
<child>
|
||||||
|
<object class="GtkTextView" id="file_preview_text_view">
|
||||||
|
<property name="hexpand">true</property>
|
||||||
|
<property name="vexpand">true</property>
|
||||||
|
<property name="editable">false</property>
|
||||||
|
</object>
|
||||||
|
</child>
|
||||||
|
</object>
|
||||||
|
</child>
|
||||||
|
</object>
|
||||||
|
</child>
|
||||||
|
</object>
|
||||||
|
|
||||||
<object class="AdwDialog" id="welcome_dialog">
|
<object class="AdwDialog" id="welcome_dialog">
|
||||||
<property name="can-close">false</property>
|
<property name="can-close">false</property>
|
||||||
<property name="width-request">450</property>
|
<property name="width-request">450</property>
|
||||||
@@ -556,13 +879,56 @@
|
|||||||
</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>
|
</item>
|
||||||
</section>
|
</section>
|
||||||
</menu>
|
</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>
|
||||||
|
</section>
|
||||||
|
</menu>
|
||||||
|
<menu id="attachment_menu">
|
||||||
|
<section>
|
||||||
|
<item>
|
||||||
|
<attribute name="label" translatable="yes">Plain text file</attribute>
|
||||||
|
<attribute name="action">app.attach_plain_text</attribute>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<attribute name="label" translatable="yes">Image</attribute>
|
||||||
|
<attribute name="action">app.attach_image</attribute>
|
||||||
|
</item>
|
||||||
|
</section>
|
||||||
|
</menu>
|
||||||
|
<object class="GtkFileFilter" id="file_filter_text">
|
||||||
|
<suffixes>
|
||||||
|
<suffix></suffix>
|
||||||
|
<suffix>txt</suffix>
|
||||||
|
<suffix>md</suffix>
|
||||||
|
<suffix>html</suffix>
|
||||||
|
<suffix>css</suffix>
|
||||||
|
<suffix>js</suffix>
|
||||||
|
<suffix>py</suffix>
|
||||||
|
<suffix>java</suffix>
|
||||||
|
<suffix>json</suffix>
|
||||||
|
<suffix>xml</suffix>
|
||||||
|
</suffixes>
|
||||||
|
</object>
|
||||||
<object class="GtkFileFilter" id="file_filter_image">
|
<object class="GtkFileFilter" id="file_filter_image">
|
||||||
<mime-types>
|
<mime-types>
|
||||||
<mime-type>image/svg+xml</mime-type>
|
<mime-type>image/svg+xml</mime-type>
|
||||||
@@ -572,11 +938,16 @@
|
|||||||
<mime-type>image/gif</mime-type>
|
<mime-type>image/gif</mime-type>
|
||||||
</mime-types>
|
</mime-types>
|
||||||
</object>
|
</object>
|
||||||
<object class="GtkFileFilter" id="file_filter_json">
|
<object class="GtkFileFilter" id="file_filter_tar">
|
||||||
<mime-types>
|
<mime-types>
|
||||||
<mime-type>application/json</mime-type>
|
<mime-type>application/x-tar</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>
|
||||||
@@ -604,6 +975,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>
|
||||||
@@ -645,4 +1022,3 @@
|
|||||||
</child>
|
</child>
|
||||||
</object>
|
</object>
|
||||||
</interface>
|
</interface>
|
||||||
|
|
||||||
|
|||||||
@@ -6,5 +6,7 @@ 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
|
||||||
|
|||||||