15 Commits
0.8.1 ... 0.8.5

Author SHA1 Message Date
jeffser
dc2df81c75 Changed version number 2024-05-26 01:06:36 -06:00
jeffser
ddc50ce621 Updated translations / new update title 2024-05-26 00:59:32 -06:00
jeffser
701fae92a0 Preparing for 0.8.5 2024-05-26 00:57:03 -06:00
jeffser
f3d22219b4 Quick tweak 2024-05-26 00:45:40 -06:00
jeffser
0027cf7c59 Merge branch 'main' of github.com-jeffser:Jeffser/Alpaca 2024-05-26 00:42:40 -06:00
jeffser
b6c45fc346 Fixed issue: Can't load chats 2024-05-26 00:42:23 -06:00
Jeffry Samuel
e6f2902bd1 Update README.md 2024-05-26 00:36:41 -06:00
jeffser
1190e367bb Tweak to footer of messages 2024-05-26 00:26:39 -06:00
jeffser
d619f55ff2 Quick fixes 2024-05-26 00:01:14 -06:00
jeffser
605d837716 Organized code 2024-05-25 23:13:25 -06:00
jeffser
3aa57c6d2f Better code 2024-05-25 23:10:16 -06:00
jeffser
1cf2f04b06 I can write good code sometimes 2024-05-25 23:03:26 -06:00
Nokse22
780de2b753 Code block and chat improvements (#43)
* moved toast overlay only to the chat

* used adwaita style in the sourceView
added copy button for code with toast notification
added changing source style when theme changed

* removed print
2024-05-25 15:07:51 -06:00
Daimar Stein
e19511469d Brazilian Portuguese translation updated (#42)
Minor updates to the pt_BR translation to match the most recent alpaca.pot
2024-05-25 15:06:31 -06:00
Alex K
bedf1a9bc5 Add files via upload (#41) 2024-05-24 21:53:27 -06:00
17 changed files with 2466 additions and 2599 deletions

View File

@@ -22,7 +22,8 @@ Alpaca is an [Ollama](https://github.com/ollama/ollama) client where you can man
- Delete messages
## Future features!
- Document recognition
- Document recognition (Probably only Markdown because it's really easy for AI to read)
- YouTube recognition (Ask questions about a YouTube video using the transcript)
- Edit messages
- Snap Package (maybe)

View File

@@ -5,15 +5,16 @@
<project_license>GPL-3.0-or-later</project_license>
<launchable type="desktop-id">com.jeffser.Alpaca.desktop</launchable>
<name>Alpaca</name>
<summary>Chat with local AI models</summary>
<summary>Chat with local AI models powered by Ollama</summary>
<description>
<p>An Ollama client</p>
<p>Features</p>
<ul>
<li>Built in Ollama instance</li>
<li>Talk to multiple models in the same conversation</li>
<li>Pull and delete models from the app</li>
<li>Have multiple conversations</li>
<li>Image recognition (Only available with LLaVA Model)</li>
<li>Image recognition (Only available with compatible models)</li>
<li>Import and export chats</li>
</ul>
<p>Disclaimer</p>
@@ -36,6 +37,8 @@
</requires>
<recommends>
<control>keyboard</control>
<control>pointing</control>
<control>touch</control>
</recommends>
<branding>
<color type="primary" scheme_preference="light">#8cdef5</color>
@@ -60,6 +63,17 @@
<url type="homepage">https://github.com/Jeffser/Alpaca</url>
<url type="donation">https://github.com/sponsors/Jeffser</url>
<releases>
<release version="0.8.5" date="2024-05-26">
<url type="details">https://github.com/Jeffser/Alpaca/releases/tag/0.8.5</url>
<description>
<p>Nice Update</p>
<ul>
<li>UI tweaks (Thanks Nokse22)</li>
<li>General optimizations</li>
<li>Metadata fixes</li>
</ul>
</description>
</release>
<release version="0.8.1" date="2024-05-24">
<url type="details">https://github.com/Jeffser/Alpaca/releases/tag/0.8.1</url>
<description>

View File

@@ -1,5 +1,5 @@
project('Alpaca',
version: '0.8.1',
version: '0.8.5',
meson_version: '>= 0.62.0',
default_options: [ 'warning_level=2', 'werror=false', ],
)

File diff suppressed because it is too large Load Diff

662
po/es.po

File diff suppressed because it is too large Load Diff

659
po/es.po~

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

708
po/ru.po
View File

@@ -2,8 +2,8 @@ msgid ""
msgstr ""
"Project-Id-Version: \n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2024-05-24 18:50-0600\n"
"PO-Revision-Date: 2024-05-22 19:33+0800\n"
"POT-Creation-Date: 2024-05-25 10:21+0800\n"
"PO-Revision-Date: 2024-05-25 10:44+0800\n"
"Last-Translator: \n"
"Language-Team: \n"
"Language: ru_RU\n"
@@ -14,752 +14,312 @@ msgstr ""
"X-Poedit-Basepath: ../src\n"
"X-Poedit-SearchPath-0: .\n"
#: data/com.jeffser.Alpaca.desktop.in:3
#: data/com.jeffser.Alpaca.metainfo.xml.in:7
#, fuzzy
msgid "Alpaca"
msgstr "О Программе"
#: data/com.jeffser.Alpaca.metainfo.xml.in:8
#, fuzzy
msgid "Chat with local AI models"
msgstr "Не удалось перечислить локальные модели"
#: data/com.jeffser.Alpaca.metainfo.xml.in:10
#, fuzzy
msgid "An Ollama client"
msgstr "Веб-сайт Ollama"
#: data/com.jeffser.Alpaca.metainfo.xml.in:11
#: data/com.jeffser.Alpaca.metainfo.xml.in:286
msgid "Features"
msgstr ""
#: data/com.jeffser.Alpaca.metainfo.xml.in:13
#: data/com.jeffser.Alpaca.metainfo.xml.in:288
msgid "Talk to multiple models in the same conversation"
msgstr ""
#: data/com.jeffser.Alpaca.metainfo.xml.in:14
#: data/com.jeffser.Alpaca.metainfo.xml.in:289
msgid "Pull and delete models from the app"
msgstr ""
#: data/com.jeffser.Alpaca.metainfo.xml.in:15
msgid "Have multiple conversations"
msgstr ""
#: data/com.jeffser.Alpaca.metainfo.xml.in:16
msgid "Image recognition (Only available with LLaVA Model)"
msgstr ""
#: data/com.jeffser.Alpaca.metainfo.xml.in:17
#, fuzzy
msgid "Import and export chats"
msgstr "Импорт чата"
#: data/com.jeffser.Alpaca.metainfo.xml.in:19 src/window.ui:432
msgid "Disclaimer"
msgstr "Отказ от ответственности"
#: data/com.jeffser.Alpaca.metainfo.xml.in:20
msgid ""
"This project is not affiliated at all with Ollama, I'm not responsible for "
"any damages to your device or software caused by running code given by any "
"models."
msgstr ""
#: data/com.jeffser.Alpaca.metainfo.xml.in:23
msgid "Jeffry Samuel Eduarte Rojas"
msgstr ""
#: data/com.jeffser.Alpaca.metainfo.xml.in:47
msgid "A conversation showing code highlight"
msgstr ""
#: data/com.jeffser.Alpaca.metainfo.xml.in:51
msgid "A conversation involving multiple models"
msgstr ""
#: data/com.jeffser.Alpaca.metainfo.xml.in:55
#, fuzzy
msgid "Managing models"
msgstr "Управление моделями"
#: data/com.jeffser.Alpaca.metainfo.xml.in:66
msgid "Quick fix"
msgstr ""
#: data/com.jeffser.Alpaca.metainfo.xml.in:68
msgid "Updated Spanish translation"
msgstr ""
#: data/com.jeffser.Alpaca.metainfo.xml.in:69
msgid "Added compatibility for PNG"
msgstr ""
#: data/com.jeffser.Alpaca.metainfo.xml.in:76
#, fuzzy
msgid "New Update"
msgstr "Новый Чат"
#: data/com.jeffser.Alpaca.metainfo.xml.in:78
msgid "Updated model list"
msgstr ""
#: data/com.jeffser.Alpaca.metainfo.xml.in:79
msgid "Added image recognition to more models"
msgstr ""
#: data/com.jeffser.Alpaca.metainfo.xml.in:80
msgid "Added Brazilian Portuguese translation (Thanks Daimaar Stein)"
msgstr ""
#: data/com.jeffser.Alpaca.metainfo.xml.in:81
msgid "Refined the general UI (Thanks Nokse22)"
msgstr ""
#: data/com.jeffser.Alpaca.metainfo.xml.in:82
msgid "Added 'delete message' feature"
msgstr ""
#: data/com.jeffser.Alpaca.metainfo.xml.in:83
msgid ""
"Added metadata so that software distributors know that the app is compatible "
"with mobile"
msgstr ""
#: data/com.jeffser.Alpaca.metainfo.xml.in:84
msgid ""
"Changed 'send' shortcut to just the return/enter key (to add a new line use "
"shift+return)"
msgstr ""
#: data/com.jeffser.Alpaca.metainfo.xml.in:91
msgid "Bug Fixes"
msgstr ""
#: data/com.jeffser.Alpaca.metainfo.xml.in:93
msgid "Fixed: Minor spelling mistake"
msgstr ""
#: data/com.jeffser.Alpaca.metainfo.xml.in:94
msgid "Added 'mobile' as a supported form factor"
msgstr ""
#: data/com.jeffser.Alpaca.metainfo.xml.in:95
msgid "Fixed: 'Connection Error' dialog not working properly"
msgstr ""
#: data/com.jeffser.Alpaca.metainfo.xml.in:96
msgid "Fixed: App might freeze randomly on startup"
msgstr ""
#: data/com.jeffser.Alpaca.metainfo.xml.in:97
msgid "Changed 'chats' label on sidebar for 'Alpaca'"
msgstr ""
#: data/com.jeffser.Alpaca.metainfo.xml.in:104
msgid "Cool Update"
msgstr ""
#: data/com.jeffser.Alpaca.metainfo.xml.in:106
msgid "Better design for chat window"
msgstr ""
#: data/com.jeffser.Alpaca.metainfo.xml.in:107
msgid "Better design for chat sidebar"
msgstr ""
#: data/com.jeffser.Alpaca.metainfo.xml.in:108
#, fuzzy
msgid "Fixed remote connections"
msgstr "Использовать удаленное подключение"
#: data/com.jeffser.Alpaca.metainfo.xml.in:109
msgid "Fixed Ollama restarting in loop"
msgstr ""
#: data/com.jeffser.Alpaca.metainfo.xml.in:110
msgid "Other cool backend stuff"
msgstr ""
#: data/com.jeffser.Alpaca.metainfo.xml.in:117
msgid "Huge Update"
msgstr ""
#: data/com.jeffser.Alpaca.metainfo.xml.in:119
msgid "Added Ollama as part of Alpaca, Ollama will run in a sandbox"
msgstr ""
#: data/com.jeffser.Alpaca.metainfo.xml.in:120
msgid "Added option to connect to remote instances (how it worked before)"
msgstr ""
#: data/com.jeffser.Alpaca.metainfo.xml.in:121
msgid "Added option to import and export chats"
msgstr ""
#: data/com.jeffser.Alpaca.metainfo.xml.in:122
msgid "Added option to run Alpaca with Ollama in the background"
msgstr ""
#: data/com.jeffser.Alpaca.metainfo.xml.in:123
msgid "Added preferences dialog"
msgstr ""
#: data/com.jeffser.Alpaca.metainfo.xml.in:124
msgid "Changed the welcome dialog"
msgstr ""
#: data/com.jeffser.Alpaca.metainfo.xml.in:126
#: data/com.jeffser.Alpaca.metainfo.xml.in:143
#: data/com.jeffser.Alpaca.metainfo.xml.in:155
#: data/com.jeffser.Alpaca.metainfo.xml.in:174
#: data/com.jeffser.Alpaca.metainfo.xml.in:195
#: data/com.jeffser.Alpaca.metainfo.xml.in:211
#: data/com.jeffser.Alpaca.metainfo.xml.in:227
#: data/com.jeffser.Alpaca.metainfo.xml.in:241
#: data/com.jeffser.Alpaca.metainfo.xml.in:251
#: data/com.jeffser.Alpaca.metainfo.xml.in:269
#: data/com.jeffser.Alpaca.metainfo.xml.in:291
msgid "Please report any errors to the issues page, thank you."
msgstr ""
#: data/com.jeffser.Alpaca.metainfo.xml.in:134
msgid "Yet Another Daily Update"
msgstr ""
#: data/com.jeffser.Alpaca.metainfo.xml.in:136
msgid "Added better UI for 'Manage Models' dialog"
msgstr ""
#: data/com.jeffser.Alpaca.metainfo.xml.in:137
msgid "Added better UI for the chat sidebar"
msgstr ""
#: data/com.jeffser.Alpaca.metainfo.xml.in:138
msgid ""
"Replaced model description with a button to open Ollama's website for the "
"model"
msgstr ""
#: data/com.jeffser.Alpaca.metainfo.xml.in:139
msgid "Added myself to the credits as the spanish translator"
msgstr ""
#: data/com.jeffser.Alpaca.metainfo.xml.in:140
msgid "Using XDG properly to get config folder"
msgstr ""
#: data/com.jeffser.Alpaca.metainfo.xml.in:141
msgid "Update for translations"
msgstr ""
#: data/com.jeffser.Alpaca.metainfo.xml.in:151
msgid "Quick Fix"
msgstr ""
#: data/com.jeffser.Alpaca.metainfo.xml.in:153
msgid "The last update had some mistakes in the description of the update"
msgstr ""
#: data/com.jeffser.Alpaca.metainfo.xml.in:163
msgid "Another Daily Update"
msgstr ""
#: data/com.jeffser.Alpaca.metainfo.xml.in:165
msgid "Added full Spanish translation"
msgstr ""
#: data/com.jeffser.Alpaca.metainfo.xml.in:166
msgid "Added support for background pulling of multiple models"
msgstr ""
#: data/com.jeffser.Alpaca.metainfo.xml.in:167
msgid "Added interrupt button"
msgstr ""
#: data/com.jeffser.Alpaca.metainfo.xml.in:168
#, fuzzy
msgid "Added basic shortcuts"
msgstr "Показывать ярлыки"
#: data/com.jeffser.Alpaca.metainfo.xml.in:169
msgid "Better translation support"
msgstr ""
#: data/com.jeffser.Alpaca.metainfo.xml.in:170
msgid ""
"User can now leave chat name empty when creating a new one, it will add a "
"placeholder name"
msgstr ""
#: data/com.jeffser.Alpaca.metainfo.xml.in:171
msgid "Better scalling for different window sizes"
msgstr ""
#: data/com.jeffser.Alpaca.metainfo.xml.in:172
msgid "Fixed: Can't close app if first time setup fails"
msgstr ""
#: data/com.jeffser.Alpaca.metainfo.xml.in:182
msgid "Really Big Update"
msgstr ""
#: data/com.jeffser.Alpaca.metainfo.xml.in:184
msgid "Added multiple chats support!"
msgstr ""
#: data/com.jeffser.Alpaca.metainfo.xml.in:185
msgid "Added Pango Markup support (bold, list, title, subtitle, monospace)"
msgstr ""
#: data/com.jeffser.Alpaca.metainfo.xml.in:186
msgid "Added autoscroll if the user is at the bottom of the chat"
msgstr ""
#: data/com.jeffser.Alpaca.metainfo.xml.in:187
msgid "Added support for multiple tags on a single model"
msgstr ""
#: data/com.jeffser.Alpaca.metainfo.xml.in:188
msgid "Added better model management dialog"
msgstr ""
#: data/com.jeffser.Alpaca.metainfo.xml.in:189
msgid "Added loading spinner when sending message"
msgstr ""
#: data/com.jeffser.Alpaca.metainfo.xml.in:190
msgid "Added notifications if app is not active and a model pull finishes"
msgstr ""
#: data/com.jeffser.Alpaca.metainfo.xml.in:191
msgid "Added new symbolic icon"
msgstr ""
#: data/com.jeffser.Alpaca.metainfo.xml.in:192
msgid "Added frame to message textview widget"
msgstr ""
#: data/com.jeffser.Alpaca.metainfo.xml.in:193
msgid "Fixed \"code blocks shouldn't be editable\""
msgstr ""
#: data/com.jeffser.Alpaca.metainfo.xml.in:203
#: data/com.jeffser.Alpaca.metainfo.xml.in:260
msgid "Big Update"
msgstr ""
#: data/com.jeffser.Alpaca.metainfo.xml.in:205
msgid "Added code highlighting"
msgstr ""
#: data/com.jeffser.Alpaca.metainfo.xml.in:206
msgid "Added image recognition (llava model)"
msgstr ""
#: data/com.jeffser.Alpaca.metainfo.xml.in:207
msgid "Added multiline prompt"
msgstr ""
#: data/com.jeffser.Alpaca.metainfo.xml.in:208
msgid "Fixed some small bugs"
msgstr ""
#: data/com.jeffser.Alpaca.metainfo.xml.in:209
msgid "General optimization"
msgstr ""
#: data/com.jeffser.Alpaca.metainfo.xml.in:219
msgid "Fixes and features"
msgstr ""
#: data/com.jeffser.Alpaca.metainfo.xml.in:221
msgid "Russian translation (thanks github/alexkdeveloper)"
msgstr ""
#: data/com.jeffser.Alpaca.metainfo.xml.in:222
msgid "Fixed: Cannot close app on first setup"
msgstr ""
#: data/com.jeffser.Alpaca.metainfo.xml.in:223
msgid "Fixed: Brand colors for Flathub"
msgstr ""
#: data/com.jeffser.Alpaca.metainfo.xml.in:224
msgid "Fixed: App description"
msgstr ""
#: data/com.jeffser.Alpaca.metainfo.xml.in:225
msgid "Fixed: Only show 'save changes dialog' when you actually change the url"
msgstr ""
#: data/com.jeffser.Alpaca.metainfo.xml.in:235
msgid "0.2.2 Bug fixes"
msgstr ""
#: data/com.jeffser.Alpaca.metainfo.xml.in:237
msgid "Toast messages appearing behind dialogs"
msgstr ""
#: data/com.jeffser.Alpaca.metainfo.xml.in:238
msgid "Local model list not updating when changing servers"
msgstr ""
#: data/com.jeffser.Alpaca.metainfo.xml.in:239
msgid "Closing the setup dialog closes the whole app"
msgstr ""
#: data/com.jeffser.Alpaca.metainfo.xml.in:249
msgid "0.2.1 Data saving fix"
msgstr ""
#: data/com.jeffser.Alpaca.metainfo.xml.in:250
msgid ""
"The app didn't save the config files and chat history to the right "
"directory, this is now fixed"
msgstr ""
#: data/com.jeffser.Alpaca.metainfo.xml.in:259
msgid "0.2.0"
msgstr ""
#: data/com.jeffser.Alpaca.metainfo.xml.in:261
#, fuzzy
msgid "New Features"
msgstr "Новый Чат"
#: data/com.jeffser.Alpaca.metainfo.xml.in:263
msgid "Restore chat after closing the app"
msgstr ""
#: data/com.jeffser.Alpaca.metainfo.xml.in:264
#, fuzzy
msgid "A button to clear the chat"
msgstr "Вы уверены, что хотите очистить чат?"
#: data/com.jeffser.Alpaca.metainfo.xml.in:265
msgid "Fixed multiple bugs involving how messages are shown"
msgstr ""
#: data/com.jeffser.Alpaca.metainfo.xml.in:266
msgid "Added welcome dialog"
msgstr ""
#: data/com.jeffser.Alpaca.metainfo.xml.in:267
msgid "More stability"
msgstr ""
#: data/com.jeffser.Alpaca.metainfo.xml.in:277
msgid "0.1.2 Quick fixes"
msgstr ""
#: data/com.jeffser.Alpaca.metainfo.xml.in:278
msgid ""
"This release fixes some metadata needed to have a proper Flatpak application"
msgstr ""
#: data/com.jeffser.Alpaca.metainfo.xml.in:284
msgid "0.1.1 Stable Release"
msgstr ""
#: data/com.jeffser.Alpaca.metainfo.xml.in:285
msgid "This is the first public version of Alpaca"
msgstr ""
#: src/window.py:57 src/window.py:783
#: 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:57 window.py:783
msgid "New Chat"
msgstr "Новый Чат"
#: src/window.py:102
#: window.py:102
msgid "An error occurred"
msgstr "Произошла ошибка"
#: src/window.py:103
#: window.py:103
msgid "Failed to connect to server"
msgstr "Не удалось подключиться к серверу"
#: src/window.py:104
#: window.py:104
msgid "Could not list local models"
msgstr "Не удалось перечислить локальные модели"
#: src/window.py:105
#: window.py:105
msgid "Could not delete model"
msgstr "Не удалось удалить модель"
#: src/window.py:106
#: window.py:106
msgid "Could not pull model"
msgstr "Не удалось извлечь модель"
#: src/window.py:107
#: window.py:107
msgid "Cannot open image"
msgstr "Не удается открыть изображение"
#: src/window.py:108
#: window.py:108
msgid "Cannot delete chat because it's the only one left"
msgstr "Не удается удалить чат, потому что он единственный оставшийся"
#: src/window.py:109
#: window.py:109
msgid "There was an error with the local Ollama instance, so it has been reset"
msgstr ""
"Произошла ошибка с локальным экземпляром Ollama, поэтому он был сброшен"
#: src/window.py:112
#: window.py:112
msgid "Please select a model before chatting"
msgstr "Пожалуйста, выберите модель перед началом общения"
#: src/window.py:113
#: window.py:113
msgid "Chat cannot be cleared while receiving a message"
msgstr "Чат не может быть удален при получении сообщения"
#: src/window.py:114
#: window.py:114
msgid "That tag is already being pulled"
msgstr "Этот тег уже удален"
#: src/window.py:115
#, fuzzy
#: window.py:115
msgid "That tag has been pulled already"
msgstr "Этот тег уже был удален"
#: src/window.py:118
#: window.py:118
msgid "Model deleted successfully"
msgstr "Модель успешно удалена"
#: src/window.py:119
#: window.py:119
msgid "Model pulled successfully"
msgstr "Модель успешно извлечена"
#: src/window.py:120
#: window.py:120
msgid "Chat exported successfully"
msgstr "Чат успешно экспортирован"
#: src/window.py:121
#: window.py:121
msgid "Chat imported successfully"
msgstr "Чат успешно импортирован"
#: src/window.py:476
#: window.py:476
msgid "Task Complete"
msgstr "Задача выполнена"
#: src/window.py:476
#: window.py:476
msgid "Model '{}' pulled successfully."
msgstr "Модель '{}' успешно извлечена."
#: src/window.py:481
#: window.py:481
msgid "Pull Model Error"
msgstr "Ошибка Извлечения Модели"
#: src/window.py:481
#: window.py:481
msgid "Failed to pull model '{}' due to network error."
msgstr "Не удалось извлечь модель '{}' из-за сетевой ошибки."
#: src/window.py:496
#: window.py:496
msgid "Stop Model"
msgstr "Остановить Модель"
#: src/window.py:497
#: window.py:497
msgid "Are you sure you want to stop pulling '{}'?"
msgstr "Вы уверены, что хотите прекратить извлечение '{}'?"
#: src/window.py:500 src/window.py:543 src/window.py:566 src/window.py:638
#: src/window.py:711 src/window.py:737 src/window.py:769 src/window.py:810
#: window.py:500 window.py:543 window.py:566 window.py:638 window.py:711
#: window.py:737 window.py:769 window.py:810
msgid "Cancel"
msgstr "Отмена"
#: src/window.py:501
#: window.py:501
msgid "Stop"
msgstr "Стоп"
#: src/window.py:539
#: window.py:539
msgid "Delete Model"
msgstr "Удалить Модель"
#: src/window.py:540 src/window.py:734
#: window.py:540 window.py:734
msgid "Are you sure you want to delete '{}'?"
msgstr "Вы уверены, что хотите удалить '{}'?"
#: src/window.py:544 src/window.py:738
#: window.py:544 window.py:738
msgid "Delete"
msgstr "Удалить"
#: src/window.py:561
#: window.py:561
msgid "Pull Model"
msgstr "Извлечение модели"
#: src/window.py:562
#: window.py:562
msgid "Please select a tag to pull '{}'"
msgstr "Пожалуйста, выберите тег для извлечения '{}'"
#: src/window.py:567
#: window.py:567
msgid "Pull"
msgstr "Извлечение"
#: src/window.py:634 src/window.ui:446
#: window.py:634 window.ui:446
msgid "Clear Chat"
msgstr "Очистить Чат"
#: src/window.py:635
#: window.py:635
msgid "Are you sure you want to clear the chat?"
msgstr "Вы уверены, что хотите очистить чат?"
#: src/window.py:639
#: window.py:639
msgid "Clear"
msgstr "Очистить"
#: src/window.py:707
#: window.py:707
msgid "Remove Image"
msgstr "Удалить Изображение"
#: src/window.py:708
#: window.py:708
msgid "Are you sure you want to remove image?"
msgstr "Вы уверены, что хотите удалить изображение?"
#: src/window.py:712 src/window.ui:466
#: window.py:712 window.ui:466
msgid "Remove"
msgstr "Удалить"
#: src/window.py:733
#: window.py:733
msgid "Delete Chat"
msgstr "Удалить Чат"
#: src/window.py:763
#: window.py:763
msgid "Rename Chat"
msgstr "Переименовать Чат"
#: src/window.py:770
#: window.py:770
msgid "Rename"
msgstr "Переименовать"
#: src/window.py:791
#: window.py:791
msgid "The name '{}' is already in use"
msgstr "Имя '{}' уже используется"
#: src/window.py:804
#: window.py:804
msgid "Create Chat"
msgstr "Создать Чат"
#: src/window.py:811
#: window.py:811
msgid "Create"
msgstr "Создать"
#: src/window.py:914
#, fuzzy
#: window.py:914
msgid "Connection Error"
msgstr "Удаленное подключение"
msgstr "Ошибка Соединения"
#: src/window.py:915
#: window.py:915
msgid "The remote instance has disconnected"
msgstr ""
msgstr "Удаленный экземпляр отключился"
#: src/window.py:919
#, fuzzy
#: window.py:919
msgid "Close Alpaca"
msgstr "Добро пожаловать в Alpaca"
msgstr "Закрыть Программу"
#: src/window.py:920
#, fuzzy
#: window.py:920
msgid "Use local instance"
msgstr "URL-адрес удаленного экземпляра"
msgstr "Использовать локальный экземпляр"
#: src/window.py:921
#: window.py:921
msgid "Connect"
msgstr ""
msgstr "Подключить"
#: src/window.ui:40
#: window.ui:40
msgid "New chat"
msgstr "Новый чат"
#: src/window.ui:49
#: window.ui:49
msgid "Import chat"
msgstr "Импорт чата"
#: src/window.ui:58
#: window.ui:58
msgid "Export chat"
msgstr "Экспорт чата"
#: src/window.ui:90
#: window.ui:90
msgid "Toggle Sidebar"
msgstr "Переключение боковой панели"
#: src/window.ui:111 src/window.ui:303
#: window.ui:111 window.ui:303
msgid "Manage models"
msgstr "Управление моделями"
#: src/window.ui:125
#: window.ui:125
msgid "Menu"
msgstr "Меню"
#: src/window.ui:216
#: window.ui:216
msgid "Send"
msgstr "Отправить"
#: src/window.ui:225
#: window.ui:225
msgid "Only available on selected models"
msgstr ""
msgstr "Доступно только для некоторых моделей"
#: src/window.ui:228
#: window.ui:228
msgid "Image"
msgstr "Изображение"
#: src/window.ui:254 src/window.ui:450 src/window.ui:508
#: window.ui:254 window.ui:450 window.ui:508
msgid "Preferences"
msgstr "Настройки"
#: src/window.ui:257 src/window.ui:492
#: window.ui:257 window.ui:492
msgid "General"
msgstr "Общие"
#: src/window.ui:261
#: window.ui:261
msgid "Remote Connection"
msgstr "Удаленное подключение"
#: src/window.ui:262
#: window.ui:262
msgid "Manage a remote connection to Ollama"
msgstr "Управление удаленным подключением к Ollama"
#: src/window.ui:265
#: window.ui:265
msgid "Use remote connection"
msgstr "Использовать удаленное подключение"
#: src/window.ui:270
#: window.ui:270
msgid "URL of remote instance"
msgstr "URL-адрес удаленного экземпляра"
#: src/window.ui:278
#: window.ui:278
msgid "Behavior"
msgstr "Поведение"
#: src/window.ui:279
#: window.ui:279
msgid "Manage Alpaca's Behavior"
msgstr "Управление поведением Alpaca"
#: src/window.ui:282
#: window.ui:282
msgid "Run in background"
msgstr "Запуск в фоновом режиме"
#: src/window.ui:371
#: window.ui:371
msgid "Previous"
msgstr "Предыдущий"
#: src/window.ui:386
#: window.ui:386
msgid "Next"
msgstr "Следующий"
#: src/window.ui:412
#: window.ui:412
msgid "Welcome to Alpaca"
msgstr "Добро пожаловать в Alpaca"
#: src/window.ui:413
#: window.ui:413
msgid "Powered by Ollama"
msgstr "При поддержке Ollama"
#: src/window.ui:416
#: window.ui:416
msgid "Ollama Website"
msgstr "Веб-сайт Ollama"
#: src/window.ui:433
#: window.ui:432
msgid "Disclaimer"
msgstr "Отказ от ответственности"
#: window.ui:433
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. "
@@ -771,57 +331,85 @@ msgstr ""
"Пожалуйста, будьте осторожны и внимательно ознакомьтесь с кодом перед его "
"запуском."
#: src/window.ui:454
#: window.ui:454
msgid "Keyboard Shortcuts"
msgstr "Комбинации Клавиш"
#: src/window.ui:458
#: window.ui:458
msgid "About Alpaca"
msgstr "О Программе"
#: src/window.ui:496
#: window.ui:496
msgid "Close application"
msgstr "Закрыть приложение"
#: src/window.ui:502
#: window.ui:502
msgid "Clear chat"
msgstr "Очистить чат"
#: src/window.ui:514
#: window.ui:514
msgid "Show shortcuts window"
msgstr "Показать окно комбинаций клавиш"
#: src/window.ui:521
#: window.ui:521
msgid "Editor"
msgstr "Редактор"
#: src/window.ui:525
#: window.ui:525
msgid "Copy"
msgstr "Копировать"
#: src/window.ui:531
#: window.ui:531
msgid "Paste"
msgstr "Вставить"
#: src/window.ui:537
#: window.ui:537
msgid "Insert new line"
msgstr ""
msgstr "Вставить новую строку"
#: src/window.ui:543
#: window.ui:543
msgid "Send Message"
msgstr "Отправить Сообщение"
#~ msgctxt "shortcut window"
#~ msgid "General"
#~ msgstr "Общие"
#, fuzzy
#~ msgid "Alpaca"
#~ msgstr "О Программе"
#~ msgctxt "shortcut window"
#~ msgid "Show Shortcuts"
#~ msgstr "Показывать комбинации клавиш"
#, fuzzy
#~ msgid "Chat with local AI models"
#~ msgstr "Не удалось перечислить локальные модели"
#~ msgctxt "shortcut window"
#~ msgid "Quit"
#~ msgstr "Выйти"
#, fuzzy
#~ msgid "An Ollama client"
#~ msgstr "Веб-сайт Ollama"
#, fuzzy
#~ msgid "Import and export chats"
#~ msgstr "Импорт чата"
#, fuzzy
#~ msgid "Managing models"
#~ msgstr "Управление моделями"
#, fuzzy
#~ msgid "New Update"
#~ msgstr "Новый Чат"
#, fuzzy
#~ msgid "Fixed remote connections"
#~ msgstr "Использовать удаленное подключение"
#, fuzzy
#~ msgid "Added basic shortcuts"
#~ msgstr "Показывать ярлыки"
#, fuzzy
#~ msgid "New Features"
#~ msgstr "Новый Чат"
#, fuzzy
#~ msgid "A button to clear the chat"
#~ msgstr "Вы уверены, что хотите очистить чат?"
#~ msgid "Chats"
#~ msgstr "Чаты"

View File

@@ -1,6 +1,8 @@
# connectionhandler.py
import json, requests
url = None
def simple_get(connection_url:str) -> dict:
try:
response = requests.get(connection_url)
@@ -37,25 +39,3 @@ def stream_post(connection_url:str, data, callback:callable) -> dict:
except Exception as e:
return {"status": "error", "status_code": 0}
from time import sleep
def stream_post_fake(connection_url:str, data, callback:callable) -> dict:
data = {
"status": "pulling manifest"
}
callback(data)
for i in range(2):
for a in range(11):
sleep(.1)
data = {
"status": f"downloading digestname {i}",
"digest": f"digestname {i}",
"total": 500,
"completed": a * 50
}
callback(data)
for msg in ["verifying sha256 digest", "writting manifest", "removing any unused layers", "success"]:
sleep(.1)
data = {"status": msg}
callback(data)
return {"status": "ok", "status_code": 200}

228
src/dialogs.py Normal file
View File

@@ -0,0 +1,228 @@
# dialogs.py
from gi.repository import Adw, Gtk, Gdk, GLib, GtkSource, Gio, GdkPixbuf
from .available_models import available_models
# CLEAR CHAT | WORKS
def clear_chat_response(self, dialog, task):
if dialog.choose_finish(task) == "clear":
self.clear_chat()
def clear_chat(self):
if self.bot_message is not None:
self.show_toast("info", 1, self.main_overlay)
return
dialog = Adw.AlertDialog(
heading=_("Clear Chat"),
body=_("Are you sure you want to clear the chat?"),
close_response="cancel"
)
dialog.add_response("cancel", _("Cancel"))
dialog.add_response("clear", _("Clear"))
dialog.set_response_appearance("clear", Adw.ResponseAppearance.DESTRUCTIVE)
dialog.choose(
parent = self,
cancellable = None,
callback = lambda dialog, task: clear_chat_response(self, dialog, task)
)
# DELETE CHAT | WORKS
def delete_chat_response(self, dialog, task, chat_name):
if dialog.choose_finish(task) == "delete":
self.delete_chat(chat_name)
def delete_chat(self, chat_name):
dialog = Adw.AlertDialog(
heading=_("Delete Chat"),
body=_("Are you sure you want to delete '{}'?").format(chat_name),
close_response="cancel"
)
dialog.add_response("cancel", _("Cancel"))
dialog.add_response("delete", _("Delete"))
dialog.set_response_appearance("delete", Adw.ResponseAppearance.DESTRUCTIVE)
dialog.choose(
parent = self,
cancellable = None,
callback = lambda dialog, task, chat_name=chat_name: delete_chat_response(self, dialog, task, chat_name)
)
# RENAME CHAT | WORKS
def rename_chat_response(self, dialog, task, old_chat_name, entry, label_element):
if not entry: return
new_chat_name = entry.get_text()
if old_chat_name == new_chat_name: return
if new_chat_name and (task is None or dialog.choose_finish(task) == "rename"):
self.rename_chat(old_chat_name, new_chat_name, label_element)
def rename_chat(self, chat_name:str, label_element):
entry = Gtk.Entry()
dialog = Adw.AlertDialog(
heading=_("Rename Chat"),
body=_("Renaming '{}'").format(chat_name),
extra_child=entry,
close_response="cancel"
)
entry.connect("activate", lambda dialog, old_chat_name=chat_name, entry=entry, label_element=label_element: rename_chat_response(self, dialog, None, old_chat_name, entry, label_element))
dialog.add_response("cancel", _("Cancel"))
dialog.add_response("rename", _("Rename"))
dialog.set_response_appearance("rename", Adw.ResponseAppearance.SUGGESTED)
dialog.choose(
parent = self,
cancellable = None,
callback = lambda dialog, task, old_chat_name=chat_name, entry=entry, label_element=label_element: rename_chat_response(self, dialog, task, old_chat_name, entry, label_element)
)
# NEW CHAT | WORKS
def new_chat_response(self, dialog, task, entry):
chat_name = _("New Chat")
if entry is not None and entry.get_text() != "": chat_name = entry.get_text()
if chat_name and (task is None or dialog.choose_finish(task) == "create"):
self.new_chat(chat_name)
def new_chat(self):
entry = Gtk.Entry()
dialog = Adw.AlertDialog(
heading=_("Create Chat"),
body=_("Enter name for new chat"),
extra_child=entry,
close_response="cancel"
)
entry.connect("activate", lambda dialog, entry: new_chat_response(self, dialog, None, entry))
dialog.add_response("cancel", _("Cancel"))
dialog.add_response("create", _("Create"))
dialog.set_response_appearance("create", Adw.ResponseAppearance.SUGGESTED)
dialog.choose(
parent = self,
cancellable = None,
callback = lambda dialog, task, entry=entry: new_chat_response(self, dialog, task, entry)
)
# STOP PULL MODEL | WORKS
def stop_pull_model_response(self, dialog, task, model_name):
if dialog.choose_finish(task) == "stop":
self.stop_pull_model(model_name)
def stop_pull_model(self, model_name):
dialog = Adw.AlertDialog(
heading=_("Stop Model"),
body=_("Are you sure you want to stop pulling '{}'?").format(model_name),
close_response="cancel"
)
dialog.add_response("cancel", _("Cancel"))
dialog.add_response("stop", _("Stop"))
dialog.set_response_appearance("stop", Adw.ResponseAppearance.DESTRUCTIVE)
dialog.choose(
parent = self.manage_models_dialog,
cancellable = None,
callback = lambda dialog, task, model_name = model_name: stop_pull_model_response(self, dialog, task, model_name)
)
# DELETE MODEL | WORKS
def delete_model_response(self, dialog, task, model_name):
if dialog.choose_finish(task) == "delete":
self.delete_model(model_name)
def delete_model(self, model_name):
dialog = Adw.AlertDialog(
heading=_("Delete Model"),
body=_("Are you sure you want to delete '{}'?").format(model_name),
close_response="cancel"
)
dialog.add_response("cancel", _("Cancel"))
dialog.add_response("delete", _("Delete"))
dialog.set_response_appearance("delete", Adw.ResponseAppearance.DESTRUCTIVE)
dialog.choose(
parent = self.manage_models_dialog,
cancellable = None,
callback = lambda dialog, task, model_name = model_name: delete_model_response(self, dialog, task, model_name)
)
# PULL MODEL | WORKS
def pull_model_response(self, dialog, task, model_name, tag_drop_down):
if dialog.choose_finish(task) == "pull":
model = f"{model_name}:{tag_drop_down.get_selected_item().get_string()}"
self.pull_model(model)
def pull_model(self, model_name):
tag_list = Gtk.StringList()
for tag in available_models[model_name]['tags']:
tag_list.append(tag)
tag_drop_down = Gtk.DropDown(
enable_search=True,
model=tag_list
)
dialog = Adw.AlertDialog(
heading=_("Pull Model"),
body=_("Please select a tag to pull '{}'").format(model_name),
extra_child=tag_drop_down,
close_response="cancel"
)
dialog.add_response("cancel", _("Cancel"))
dialog.add_response("pull", _("Pull"))
dialog.set_response_appearance("pull", Adw.ResponseAppearance.SUGGESTED)
dialog.choose(
parent = self.manage_models_dialog,
cancellable = None,
callback = lambda dialog, task, model_name = model_name, tag_drop_down = tag_drop_down: pull_model_response(self, dialog, task, model_name, tag_drop_down)
)
# REMOVE IMAGE | WORKS
def remove_image_response(self, dialog, task):
if dialog.choose_finish(task) == 'remove':
self.remove_image()
def remove_image(self):
dialog = Adw.AlertDialog(
heading=_("Remove Image"),
body=_("Are you sure you want to remove image?"),
close_response="cancel"
)
dialog.add_response("cancel", _("Cancel"))
dialog.add_response("remove", _("Remove"))
dialog.set_response_appearance("remove", Adw.ResponseAppearance.DESTRUCTIVE)
dialog.choose(
parent = self,
cancellable = None,
callback = lambda dialog, task: remove_image_response(self, dialog, task)
)
# RECONNECT REMOTE |
def reconnect_remote_response(self, dialog, task, entry):
response = dialog.choose_finish(task)
if not task or response == "remote":
self.connect_remote(entry.get_text())
elif response == "local":
self.connect_local()
elif response == "close":
self.destroy()
def reconnect_remote(self):
entry = Gtk.Entry(
css_classes = ["error"],
text = self.ollama_url
)
dialog = Adw.AlertDialog(
heading=_("Connection Error"),
body=_("The remote instance has disconnected"),
extra_child=entry
)
entry.connect("activate", lambda entry, dialog: reconnect_remote_response(self, dialog, None, entry))
dialog.add_response("close", _("Close Alpaca"))
dialog.add_response("local", _("Use local instance"))
dialog.add_response("remote", _("Connect"))
dialog.set_response_appearance("remote", Adw.ResponseAppearance.SUGGESTED)
dialog.choose(
parent = self,
cancellable = None,
callback = lambda dialog, task, entry=entry: reconnect_remote_response(self, dialog, task, entry)
)

23
src/local_instance.py Normal file
View File

@@ -0,0 +1,23 @@
# local_instance.py
import subprocess, os
from time import sleep
instance = None
port = 11435
def start(data_dir):
instance = subprocess.Popen(["/app/bin/ollama", "serve"], env={**os.environ, 'OLLAMA_HOST': f"127.0.0.1:{port}", "HOME": data_dir}, stderr=subprocess.PIPE, text=True)
print("Starting Alpaca's Ollama instance...")
sleep(1)
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")
def stop():
if instance: instance.kill()
print("Stopped Alpaca's Ollama instance")

View File

@@ -33,7 +33,6 @@ class AlpacaApplication(Adw.Application):
super().__init__(application_id='com.jeffser.Alpaca',
flags=Gio.ApplicationFlags.DEFAULT_FLAGS)
self.create_action('quit', lambda *_: self.quit(), ['<primary>q'])
self.create_action('clear', lambda *_: AlpacaWindow.clear_chat_dialog(self.props.active_window), ['<primary>e'])
self.create_action('preferences', lambda *_: AlpacaWindow.show_preferences_dialog(self.props.active_window), ['<primary>p'])
self.create_action('about', self.on_about_action)
@@ -48,7 +47,7 @@ class AlpacaApplication(Adw.Application):
application_name='Alpaca',
application_icon='com.jeffser.Alpaca',
developer_name='Jeffry Samuel Eduarte Rojas',
version='0.8.1',
version='0.8.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',

View File

@@ -31,7 +31,9 @@ alpaca_sources = [
'main.py',
'window.py',
'connection_handler.py',
'available_models.py'
'available_models.py',
'dialogs.py',
'local_instance.py'
]
install_data(alpaca_sources, install_dir: moduledir)

File diff suppressed because it is too large Load Diff

View File

@@ -27,8 +27,6 @@
</object>
</child>
<property name="content">
<object class="AdwToastOverlay" id="main_overlay">
<child>
<object class="AdwOverlaySplitView" id="split_view_overlay">
<property name="show-sidebar" bind-source="show_sidebar_button" bind-property="active" bind-flags="sync-create"/>
<property name="sidebar">
@@ -38,7 +36,7 @@
<child type="start">
<object class="GtkButton" id="add_chat_button">
<property name="tooltip-text" translatable="yes">New chat</property>
<property name="icon-name">tab-new-symbolic</property>
<property name="icon-name">chat-message-new-symbolic</property>
<style>
<class name="flat"/>
</style>
@@ -70,6 +68,7 @@
<property name="hexpand">true</property>
<child>
<object class="GtkListBox" id="chat_list_box">
<signal name="row-selected" handler="chat_changed"/>
<property name="selection-mode">single</property>
<style>
<class name="navigation-sidebar"></class>
@@ -97,6 +96,7 @@
<property name="spacing">12</property>
<child>
<object class="GtkDropDown" id="model_drop_down">
<signal name="notify" handler="verify_if_image_can_be_used"/>
<property name="enable-search">true</property>
<property name="model">
<object class="GtkStringList" id="model_string_list">
@@ -108,6 +108,7 @@
</child>
<child>
<object class="GtkButton" id="manage_models_button">
<signal name="clicked" handler="manage_models_button_activate"/>
<property name="tooltip-text" translatable="yes">Manage models</property>
<child>
<object class="AdwButtonContent">
@@ -133,6 +134,8 @@
<property name="orientation">1</property>
<property name="vexpand">true</property>
<property name="hexpand">true</property>
<child>
<object class="AdwToastOverlay" id="main_overlay">
<child>
<object class="GtkScrolledWindow" id="chat_window">
<property name="propagate-natural-height">true</property>
@@ -162,7 +165,8 @@
</child>
</object>
</child>
</object>
</child>
<child>
<object class="AdwClamp">
<property name="maximum-size">1000</property>
@@ -208,6 +212,7 @@
<property name="spacing">12</property>
<child>
<object class="GtkButton" id="send_button">
<signal name="clicked" handler="send_message"/>
<style>
<class name="suggested-action"/>
</style>
@@ -221,6 +226,7 @@
</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>
@@ -243,8 +249,6 @@
</property>
</object>
</child>
</object>
</child>
</object>
</property>
<object class="AdwPreferencesDialog" id="preferences_dialog">
@@ -267,6 +271,7 @@
</child>
<child>
<object class="AdwEntryRow" id="remote_connection_entry">
<signal name="apply" handler="change_remote_url"/>
<property name="title" translatable="yes">URL of remote instance</property>
<property name="show-apply-button">true</property>
</object>
@@ -368,6 +373,7 @@
<property name="margin-bottom">5</property>
<child type="start">
<object class="GtkButton" id="welcome_previous_button">
<signal name="clicked" handler="welcome_previous_button_activate"/>
<property name="tooltip-text" translatable="yes">Previous</property>
<property name="label">Previous</property>
<property name="sensitive">false</property>
@@ -383,6 +389,7 @@
</child>
<child type="end">
<object class="GtkButton" id="welcome_next_button">
<signal name="clicked" handler="welcome_next_button_activate"/>
<property name="tooltip-text" translatable="yes">Next</property>
<property name="label">Next</property>
<style>
@@ -395,6 +402,7 @@
<child>
<object class="AdwCarousel" id="welcome_carousel">
<signal name="page-changed" handler="welcome_carousel_page_changed"/>
<property name="hexpand">true</property>
<property name="vexpand">true</property>
<property name="allow-long-swipes">true</property>

View File

@@ -4,7 +4,7 @@ echo "Preparing template..."
xgettext --output=po/alpaca.pot --files-from=po/POTFILES
echo "Updating Spanish..."
msgmerge -U po/es.po po/alpaca.pot
echo "Updating Russian..."
msgmerge -U po/ru.po po/alpaca.pot
#echo "Updating Russian..."
#msgmerge -U po/ru.po po/alpaca.pot
echo "Updating Brazilian Portuguese"
msgmerge -U po/pt_BR.po po/alpaca.pot