66 Commits
0.8.8 ... 0.9.5

Author SHA1 Message Date
jeffser
b7f11f17d2 Preparing for 0.9.5 2024-06-04 20:10:49 -06:00
jeffser
60dd1de39d Fixed added check so it doesn't fail if there isn't data in a message when converting 2024-06-04 20:00:45 -06:00
jeffser
887a7645d4 Fix 2024-06-04 19:56:49 -06:00
jeffser
340cf9375e Quick fix 2024-06-04 19:54:41 -06:00
jeffser
1d37de6499 :3 2024-06-04 18:54:16 -06:00
jeffser
2d8cb68628 Better handling of missing files 2024-06-04 18:53:41 -06:00
jeffser
4ececd850b Quick fix with images handling 2024-06-04 18:45:50 -06:00
jeffser
a4d26b2bda Added feature to description 2024-06-04 14:15:50 -06:00
jeffser
d7961f2510 Last minute fix 2024-06-04 14:14:09 -06:00
jeffser
45f5214ec9 Preparing for 0.9.4 (again) 2024-06-04 13:49:25 -06:00
jeffser
5e1e770aee Preparing for 0.9.4 2024-06-04 13:46:15 -06:00
jeffser
5eb18d00d3 Fix export 2024-06-04 13:39:50 -06:00
jeffser
bcbfd44e1f Fixed overrides 2024-06-04 13:34:48 -06:00
jeffser
073c619d89 New system for override and new overrides 2024-06-04 12:55:31 -06:00
jeffser
71ab8cfba4 Remove old file 2024-06-04 12:13:48 -06:00
jeffser
0ec812099c Update readme 2024-06-04 12:11:36 -06:00
jeffser
f7f05a0538 Rewrote a lot of code, new chat system and file uploading! 2024-06-04 12:07:15 -06:00
jeffser
82a0ab0d9e Preserve changes to override and added link button 2024-06-03 17:01:27 -06:00
jeffser
60b24da482 Fixed mistakes on readme 2024-06-03 16:37:03 -06:00
jeffser
66d209e4c6 New tip 2024-06-03 16:34:35 -06:00
jeffser
0c9ab4e17e Merge branch 'main' of github.com-jeffser:Jeffser/Alpaca 2024-06-03 16:31:09 -06:00
jeffser
fff3a68b29 Added overrides system to Ollama instance 2024-06-03 16:31:03 -06:00
Louis Chauvet-Villaret
580a104894 the regular french update (baguette) (#87) 2024-06-03 15:51:44 -06:00
jeffser
3fe9b6e121 Changed sha256 for the new ones 2024-06-01 00:29:45 -06:00
jeffser
6979d1a775 Last minute fix to width of new model creation dialog 2024-06-01 00:24:56 -06:00
jeffser
90385ce461 Preparing for 0.9.3 2024-06-01 00:16:11 -06:00
jeffser
c579e6ec99 Custom models support! 2024-06-01 00:07:34 -06:00
jeffser
b8d93cfd17 New icon (document-open-symbolic) 2024-05-31 10:29:18 -06:00
jeffser
359f28f5c1 Manually added all icons so that they work on desktops that don't use Adwaita 2024-05-31 10:17:10 -06:00
jeffser
6e8bff8493 Disabled Gnome Search (for now) 2024-05-31 09:59:04 -06:00
jeffser
ad25d5a50f Fixed: Ollama instance wasn't shutting down 2024-05-30 19:15:19 -06:00
jeffser
4b17601baf Preparing for 0.9.2 2024-05-30 10:49:53 -06:00
jeffser
c994307954 Fixed model tweaks loading 2024-05-30 09:53:17 -06:00
jeffser
a13ffd22f1 Merge branch 'main' of github.com-jeffser:Jeffser/Alpaca 2024-05-30 09:33:13 -06:00
jeffser
7b8f40e117 Initial support for Gnome Search (doesn't work yet) 2024-05-30 09:33:06 -06:00
Louis Chauvet-Villaret
add4dad8c0 French translation update (#72)
Hop, I translate all, and I harmonize the changelogs with 3 categories : added, changed, fixed (but in French you know)
2024-05-30 09:31:21 -06:00
Surjyadip Sen
7faa805176 Lowered the lower limit of keep_alive to -1 (#69) 2024-05-30 09:31:06 -06:00
jeffser
91651b918e I dind't mean to delete that 2024-05-30 09:29:37 -06:00
jeffser
725e0930fe Fixed app crashing because of model tweaks 2024-05-30 09:27:56 -06:00
jeffser
93ba903fc8 Added copy button 2024-05-29 21:59:47 -06:00
jeffser
56064831d3 Updated Spanish translation 2024-05-29 16:19:37 -06:00
jeffser
4bdb813b64 Preparing for 0.9.1 2024-05-29 16:09:57 -06:00
jeffser
ad69887e4a Another icon for manage models 2024-05-29 16:00:59 -06:00
jeffser
c8f148d1f8 Changed manage models button icon 2024-05-29 15:59:27 -06:00
jeffser
365e39a20a New Icons and fixed delete message button 2024-05-29 15:58:09 -06:00
jeffser
48c2fd2e81 New icon for send button 2024-05-29 15:22:42 -06:00
jeffser
3a5dc568c5 Changed export/import buttons for a secundary menu button 2024-05-29 15:00:19 -06:00
jeffser
a180f7a46c Fixed image button 2024-05-29 14:34:59 -06:00
jeffser
07a12ba41f Fixed send/stop buttons 2024-05-29 14:32:57 -06:00
jeffser
dd5351a3de Added Model Tweaks 2024-05-29 14:24:30 -06:00
jeffser
ae48a17301 Check if remote instance is connected at start when the toggle is on 2024-05-29 12:04:05 -06:00
jeffser
9e19698788 Preparing for 0.9.0 (again) 2024-05-29 00:18:42 -06:00
jeffser
323725df33 Fixed: Can't rename the same chat multiple times 2024-05-29 00:17:41 -06:00
jeffser
7c40420048 Preparing for 0.9.0 2024-05-29 00:10:04 -06:00
jeffser
fac51aefb9 Spanish update 2024-05-29 00:06:08 -06:00
Louis Chauvet-Villaret
8f1fbc511a French translation update (#54)
I see my work in the app and... wasn't so good, so here are some modifications 😄 

After all, I switch back on the original name Alpaca because Alpaga won't be nicely integrated (desktop icon name, title name, and it's just not a good idea)

There is just a small problem, the 'send' button can't be translated. Can you add it ?
2024-05-29 00:02:53 -06:00
jeffser
f0bf112faf Starting model tweaks page 2024-05-29 00:00:56 -06:00
jeffser
b2a15b92cd Fixed error message when pulling a model that's already pulled 2024-05-28 22:59:32 -06:00
jeffser
9b71bbea2e Fixed background color of message entry 2024-05-28 22:57:42 -06:00
jeffser
2645ab3732 Added new shortcut for creating a chat 2024-05-28 22:45:26 -06:00
jeffser
8672c4ac40 fix 2024-05-28 22:42:03 -06:00
jeffser
b8bfd54515 Added chat name wrap 2024-05-28 22:37:06 -06:00
jeffser
a29d245381 Merge branch 'main' of github.com-jeffser:Jeffser/Alpaca 2024-05-28 22:26:48 -06:00
jeffser
f57427e2c4 Fixed: When deleting the last chat it didn't make a new one 2024-05-28 22:26:36 -06:00
Jeffry Samuel
3631f06075 Update FUNDING.yml 2024-05-28 14:14:47 -06:00
Jeffry Samuel
67a66f85da Update issue templates 2024-05-28 11:50:23 -06:00
50 changed files with 7104 additions and 1362 deletions

1
.github/FUNDING.yml vendored
View File

@@ -1,6 +1,7 @@
# These are supported funding model platforms
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
#open_collective: # Replace with a single Open Collective username
#ko_fi: # Replace with a single Ko-fi username

20
.github/ISSUE_TEMPLATE/bug_report.md vendored Normal file
View 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.

View 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.

View File

@@ -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
- Pull and delete models from the app
- Image recognition
- Document recognition (plain text files)
- Code highlighting
- Multiple conversations
- Notifications
@@ -22,13 +23,12 @@ Alpaca is an [Ollama](https://github.com/ollama/ollama) client where you can man
- Delete messages
## 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)
- Edit messages
- Snap Package (maybe)
## Screenies
Login to Ollama instance | Chatting with models | Managing models
Code highlighting | Chatting with models | Managing models
:-------------------------:|:-------------------------:|:-------------------------:
![Screenshot from 2024-05-12 19-58-28](https://jeffser.com/images/alpaca/screenie1.png) | ![Screenshot from 2024-05-12 20-01-08](https://jeffser.com/images/alpaca/screenie2.png) | ![Screenshot from 2024-05-12 20-01-31](https://jeffser.com/images/alpaca/screenie3.png)
@@ -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`.
### 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
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

View File

@@ -80,16 +80,16 @@
"sources": [
{
"type": "file",
"url": "https://github.com/ollama/ollama/releases/download/v0.1.38/ollama-linux-amd64",
"sha256": "c3360812503a9756a507ebb9d78667e2b21800a760b45046bc48a8f3b81972f4",
"url": "https://github.com/ollama/ollama/releases/download/v0.1.39/ollama-linux-amd64",
"sha256": "4d19be355842a6297c93ab5ada139fe396126736bf3c3882a879dc245dffe3af",
"only-arches": [
"x86_64"
]
},
{
"type": "file",
"url": "https://github.com/ollama/ollama/releases/download/v0.1.38/ollama-linux-arm64",
"sha256": "f2d091afe665b2d5ba8b68e2473d36cdfaf80c61c7d2844a0a8f533c4e62f547",
"url": "https://github.com/ollama/ollama/releases/download/v0.1.39/ollama-linux-arm64",
"sha256": "60ec2d36928c11d6c6d84fe91451308a46aafaedbdba44664e5a6080009ce097",
"only-arches": [
"aarch64"
]

View File

@@ -0,0 +1,6 @@
[Shell Search Provider]
DesktopId=@appid@.desktop
BusName=@appid@.SearchProvider
ObjectPath=/com/jeffser/Alpaca/SearchProvider
Version=2

View File

@@ -0,0 +1,3 @@
[D-BUS Service]
Name=@appid@.SearchProvider
Exec=@libexecdir@/alpaca_search_provider

View File

@@ -15,6 +15,7 @@
<li>Pull and delete models from the app</li>
<li>Have multiple conversations</li>
<li>Image recognition (Only available with compatible models)</li>
<li>Plain text documents recognition</li>
<li>Import and export chats</li>
</ul>
<p>Disclaimer</p>
@@ -63,6 +64,71 @@
<url type="homepage">https://github.com/Jeffser/Alpaca</url>
<url type="donation">https://github.com/sponsors/Jeffser</url>
<releases>
<release version="0.9.5" date="2024-06-04">
<url type="details">https://github.com/Jeffser/Alpaca/releases/tag/0.9.5</url>
<description>
<p>Quick Fix</p>
<p>There were some errors when transitioning from the old version of chats to the new version. I apologize if this caused any corruption in your chat history. This should be the only time such a transition is needed.</p>
</description>
</release>
<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>

View File

@@ -33,4 +33,24 @@ test('Validate schema file',
compile_schemas,
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')

View File

@@ -1,11 +1,12 @@
project('Alpaca',
version: '0.8.8',
project('Alpaca', 'c',
version: '0.9.5',
meson_version: '>= 0.62.0',
default_options: [ 'warning_level=2', 'werror=false', ],
)
i18n = import('i18n')
gnome = import('gnome')
application_id = 'com.jeffser.Alpaca'
subdir('data')
subdir('src')

File diff suppressed because it is too large Load Diff

725
po/es.po

File diff suppressed because it is too large Load Diff

1232
po/es.po~ Normal file

File diff suppressed because it is too large Load Diff

1029
po/fr.po

File diff suppressed because it is too large Load Diff

1091
po/fr.po~ Normal file

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

1200
po/pt_BR.po~ Normal file

File diff suppressed because it is too large Load Diff

View File

@@ -3,6 +3,27 @@
<gresource prefix="/com/jeffser/Alpaca">
<file>style.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">gtk/help-overlay.ui</file>
</gresource>

View 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")

View File

@@ -13,6 +13,19 @@ def simple_get(connection_url:str) -> dict:
except Exception as e:
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:
try:
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}
except Exception as e:
return {"status": "error", "status_code": 0}

View File

@@ -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"):
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()
dialog = Adw.AlertDialog(
heading=_("Rename Chat"),
@@ -176,14 +177,14 @@ def pull_model(self, model_name):
# 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':
self.remove_image()
self.remove_attached_file(button)
def remove_image(self):
def remove_attached_file(self, button):
dialog = Adw.AlertDialog(
heading=_("Remove Image"),
body=_("Are you sure you want to remove image?"),
heading=_("Remove File"),
body=_("Are you sure you want to remove file?"),
close_response="cancel"
)
dialog.add_response("cancel", _("Cancel"))
@@ -192,10 +193,10 @@ def remove_image(self):
dialog.choose(
parent = self,
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):
response = dialog.choose_finish(task)
@@ -226,3 +227,58 @@ def reconnect_remote(self, current_url):
cancellable = None,
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))

View 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

View 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

View 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

View 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

View 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

View 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

View 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

View 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

View 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

View 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

View 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

View 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

View 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

View 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

View 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

View 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

View 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

View 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

View 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

View 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

View 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

View File

@@ -5,16 +5,25 @@ from time import sleep
instance = None
port = 11435
data_dir = os.getenv("XDG_DATA_HOME")
overrides = {}
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...")
sleep(1)
print("Started Alpaca's Ollama instance")
def stop():
if instance: instance.kill()
print("Stopped Alpaca's Ollama instance")
global instance
if instance:
instance.kill()
instance.wait()
instance = None
print("Stopped Alpaca's Ollama instance")
def reset():
stop()

View File

@@ -1,6 +1,6 @@
# main.py
#
# Copyright 2024 Unknown
# Copyright 2024 Jeffser
#
# 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
@@ -47,7 +47,7 @@ class AlpacaApplication(Adw.Application):
application_name='Alpaca',
application_icon='com.jeffser.Alpaca',
developer_name='Jeffry Samuel Eduarte Rojas',
version='0.8.8',
version='0.9.5',
developers=['Jeffser https://jeffser.com'],
designers=['Jeffser https://jeffser.com'],
translator_credits='Alex K (Russian) https://github.com/alexkdeveloper\nJeffser (Spanish) https://jeffser.com\nDaimar Stein (Brazilian Portuguese) https://github.com/not-a-dev-stein\nLouis Chauvet-Villaret (French) https://github.com/loulou64490',

View File

@@ -26,6 +26,15 @@ configure_file(
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 = [
'__init__.py',
'main.py',
@@ -33,7 +42,8 @@ alpaca_sources = [
'connection_handler.py',
'available_models.py',
'dialogs.py',
'local_instance.py'
'local_instance.py',
'update_history.py'
]
install_data(alpaca_sources, install_dir: moduledir)

View File

@@ -2,6 +2,3 @@
background-color: #343434;
}
.message-text-view {
background-color: #343434;
}

View File

@@ -1,11 +1,7 @@
.message-input {
background-color: #EBEBEB;
border-radius: 10px;
}
.message-text-view {
background-color: #EBEBEB;
}
.chat_row box.header {
font-size: 14px;
}

39
src/update_history.py Normal file
View File

@@ -0,0 +1,39 @@
# 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']:
if message:
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"))

File diff suppressed because it is too large Load Diff

View File

@@ -24,7 +24,9 @@
<setter object="split_view_overlay" property="collapsed">true</setter>
<setter object="welcome_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="file_preview_dialog" property="width-request">360</setter>
</object>
</child>
<property name="content">
@@ -44,21 +46,11 @@
</object>
</child>
<child type="end">
<object class="GtkButton" id="import_chat_button">
<property name="tooltip-text" translatable="yes">Import chat</property>
<property name="icon-name">document-open-symbolic</property>
<style>
<class name="flat"/>
</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 class="GtkMenuButton" id="chats_menu_button">
<property name="direction">1</property>
<property name="halign">3</property>
<property name="menu-model">chats_menu</property>
<property name="icon-name">view-more-symbolic</property>
</object>
</child>
</object>
@@ -113,7 +105,7 @@
<property name="tooltip-text" translatable="yes">Manage models</property>
<child>
<object class="AdwButtonContent">
<property name="icon-name">package-x-generic-symbolic</property>
<property name="icon-name">library-symbolic</property>
</object>
</child>
</object>
@@ -172,75 +164,115 @@
<object class="AdwClamp">
<property name="maximum-size">1000</property>
<property name="tightening-threshold">800</property>
<child>
<object class="GtkBox">
<property name="orientation">0</property>
<property name="spacing">12</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="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>
<object class="GtkBox">
<property name="orientation">1</property>
<property name="spacing">12</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="GtkBox">
<property name="orientation">1</property>
<property name="spacing">12</property>
<object class="GtkScrolledWindow" id="attachment_box">
<property name="visible">false</property>
<child>
<object class="GtkButton" id="send_button">
<signal name="clicked" handler="send_message"/>
<style>
<class name="suggested-action"/>
</style>
<child>
<object class="AdwButtonContent">
<property name="label" translatable="yes">Send</property>
<property name="icon-name">send-to-symbolic</property>
</object>
</child>
</object>
</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 class="GtkBox" id="attachment_container">
<property name="orientation">0</property>
<property name="vexpand">false</property>
<property name="spacing">12</property>
</object>
</child>
</object>
</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>
</child>
</object>
</child>
@@ -258,9 +290,9 @@
<property name="height-request">600</property>
<property name="title" translatable="yes">Preferences</property>
<child>
<object class="AdwPreferencesPage" id="connection_page">
<object class="AdwPreferencesPage" id="general_page">
<property name="title" translatable="yes">General</property>
<property name="icon-name">insert-link-symbolic</property>
<property name="icon-name">preferences-system-symbolic</property>
<child>
<object class="AdwPreferencesGroup">
<property name="title" translatable="yes">Remote Connection</property>
@@ -292,6 +324,257 @@
</child>
</object>
</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 class="AdwDialog" id="manage_models_dialog">
@@ -304,6 +587,14 @@
<object class="AdwToolbarView">
<child type="top">
<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">
<object class="AdwWindowTitle">
<property name="title" translatable="yes">Manage models</property>
@@ -360,6 +651,37 @@
</child>
</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">
<property name="can-close">false</property>
<property name="width-request">450</property>
@@ -557,13 +879,56 @@
</item>
</section>
</menu>
<menu id="chat_context_menu">
<menu id="chats_menu">
<section>
<item>
<attribute name="label" translatable="yes">Remove</attribute>
<attribute name="label" translatable="yes">Export current chat</attribute>
<attribute name="action">app.export_current_chat</attribute>
</item>
<item>
<attribute name="label" translatable="yes">Import chat</attribute>
<attribute name="action">app.import_chat</attribute>
</item>
</section>
</menu>
<menu id="create_model_menu">
<section>
<item>
<attribute name="label" translatable="yes">From existing model</attribute>
<attribute name="action">app.create_model_from_existing</attribute>
</item>
<item>
<attribute name="label" translatable="yes">From GGUF file (Testing)</attribute>
<attribute name="action">app.create_model_from_file</attribute>
</item>
</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">
<mime-types>
<mime-type>image/svg+xml</mime-type>
@@ -573,11 +938,16 @@
<mime-type>image/gif</mime-type>
</mime-types>
</object>
<object class="GtkFileFilter" id="file_filter_json">
<object class="GtkFileFilter" id="file_filter_tar">
<mime-types>
<mime-type>application/json</mime-type>
<mime-type>application/x-tar</mime-type>
</mime-types>
</object>
<object class="GtkFileFilter" id="file_filter_gguf">
<suffixes>
<suffix>gguf</suffix>
</suffixes>
</object>
<object class="GtkShortcutsWindow" id="shortcut_window">
<property name="modal">1</property>
<child>
@@ -605,6 +975,12 @@
<property name="title" translatable="yes">Preferences</property>
</object>
</child>
<child>
<object class="GtkShortcutsShortcut">
<property name="accelerator">&lt;ctrl&gt;N</property>
<property name="title" translatable="yes">New Chat</property>
</object>
</child>
<child>
<object class="GtkShortcutsShortcut">
<property name="accelerator">&lt;ctrl&gt;slash</property>
@@ -646,4 +1022,3 @@
</child>
</object>
</interface>