Compare commits
185 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
9e2b55a249 | ||
|
|
0fbb94cd72 | ||
|
|
004b3f8574 | ||
|
|
7d1931dd17 | ||
|
|
8b7f41afa7 | ||
|
|
4bc0832865 | ||
|
|
a66c6d5f40 | ||
|
|
33b7cae24d | ||
|
|
47f5c88ef2 | ||
|
|
ffe382aee2 | ||
|
|
919f71ee78 | ||
|
|
404d4476ae | ||
|
|
f2b243cd5f | ||
|
|
c2fae41355 | ||
|
|
8fda2cde9e | ||
|
|
930380cdce | ||
|
|
5b788ffe15 | ||
|
|
521c2bdde5 | ||
|
|
eee73b1218 | ||
|
|
87d6da26c9 | ||
|
|
2029cd5cd2 | ||
|
|
36be752ee6 | ||
|
|
5b3586789f | ||
|
|
6ce670e643 | ||
|
|
dd70e8139c | ||
|
|
3ac0936d1a | ||
|
|
1477bacf6a | ||
|
|
d339a18901 | ||
|
|
f9460416d9 | ||
|
|
a9112cf3da | ||
|
|
c873b49700 | ||
|
|
3c553e37d8 | ||
|
|
0c47fbb1f7 | ||
|
|
476138ef53 | ||
|
|
385ca4f0fa | ||
|
|
46fd642789 | ||
|
|
e48249c7c9 | ||
|
|
9e8535e97e | ||
|
|
a794c63a5a | ||
|
|
f3610a46a2 | ||
|
|
20fd2cf6e3 | ||
|
|
7bf345d09d | ||
|
|
17e9560449 | ||
|
|
c02e6a565e | ||
|
|
7fbc9b9bde | ||
|
|
416e97d488 | ||
|
|
753060d9f3 | ||
|
|
972c53000c | ||
|
|
2b948a49a0 | ||
|
|
7999548738 | ||
|
|
d4d13b793f | ||
|
|
210b6f0d89 | ||
|
|
7f5894b274 | ||
|
|
2dc24ab945 | ||
|
|
2f153c9974 | ||
|
|
fa22647acd | ||
|
|
dd5d82fe7a | ||
|
|
98b179aeb5 | ||
|
|
e1f1c005a0 | ||
|
|
6e226c5a4f | ||
|
|
7440fa5a37 | ||
|
|
4fe204605a | ||
|
|
4446b42b82 | ||
|
|
4b6cd17d0a | ||
|
|
1a6e74271c | ||
|
|
6ba3719031 | ||
|
|
dd95e3df7e | ||
|
|
69fd7853c8 | ||
|
|
c01c478ffe | ||
|
|
f8be1da83a | ||
|
|
3a7625486e | ||
|
|
fdc3b6c573 | ||
|
|
76939ed51f | ||
|
|
b9cf761f4a | ||
|
|
4c515ba541 | ||
|
|
d7c3595bf1 | ||
|
|
1fbd6a0824 | ||
|
|
ccb59c7f02 | ||
|
|
04bef3e82a | ||
|
|
17105b98ed | ||
|
|
4bff1515a9 | ||
|
|
0a75893346 | ||
|
|
2ed92467f9 | ||
|
|
634ac122d9 | ||
|
|
44640b7e53 | ||
|
|
47e7b22a7e | ||
|
|
918928d4bb | ||
|
|
69fc172779 | ||
|
|
d84dabbe4d | ||
|
|
23114210c4 | ||
|
|
ea80e5a223 | ||
|
|
6087f31d41 | ||
|
|
30ee292a32 | ||
|
|
705a9319f5 | ||
|
|
c789d9d87c | ||
|
|
a7681b5505 | ||
|
|
9e74d8af0b | ||
|
|
b52061f849 | ||
|
|
01b875c283 | ||
|
|
4cc3b78321 | ||
|
|
6205db87e6 | ||
|
|
518633b153 | ||
|
|
988ee7b7e7 | ||
|
|
cdadde60ce | ||
|
|
4bb01d86d9 | ||
|
|
4cac43520f | ||
|
|
d6dddd16f1 | ||
|
|
c0da054635 | ||
|
|
2b4d94ca55 | ||
|
|
e8e564738a | ||
|
|
d48fbd8b62 | ||
|
|
c1f80f209e | ||
|
|
ed6b32c827 | ||
|
|
fc436fd352 | ||
|
|
ee6fdb1ca1 | ||
|
|
988db30355 | ||
|
|
ea98ee5e99 | ||
|
|
b8d1d43822 | ||
|
|
0d017c6d14 | ||
|
|
2825e9a003 | ||
|
|
6e9ddfcbf2 | ||
|
|
378689be39 | ||
|
|
31858fad12 | ||
|
|
60351d629d | ||
|
|
715a97159a | ||
|
|
b48ce28b35 | ||
|
|
7ab0448cd3 | ||
|
|
5f6642fa63 | ||
|
|
5a0d1ed408 | ||
|
|
131e8fb6be | ||
|
|
1c7fb8ef93 | ||
|
|
8c0ec3957f | ||
|
|
72063a15d9 | ||
|
|
0d1b15aafc | ||
|
|
ca10369bdc | ||
|
|
42af75d8d2 | ||
|
|
a02871dd28 | ||
|
|
e65a8bc648 | ||
|
|
b373b6a34f | ||
|
|
6d6a0255e2 | ||
|
|
003d6a3d5f | ||
|
|
77a2c60fe5 | ||
|
|
ac3bd699ee | ||
|
|
596498c81e | ||
|
|
c95f764c77 | ||
|
|
5c5be05843 | ||
|
|
3fb26ec49e | ||
|
|
3f767d22e9 | ||
|
|
7f3fb0d82d | ||
|
|
d56c132459 | ||
|
|
acdce762c9 | ||
|
|
bd557d9652 | ||
|
|
3363d13fa0 | ||
|
|
52ba44e260 | ||
|
|
f06c2dae23 | ||
|
|
55a636f4d1 | ||
|
|
0fc8730272 | ||
|
|
61a2bc466e | ||
|
|
62b1923bf4 | ||
|
|
8e25376a12 | ||
|
|
a9ab5d45a4 | ||
|
|
ce2a2f0b93 | ||
|
|
9cb6b0b665 | ||
|
|
dfc21fc0e9 | ||
|
|
19b089e6c6 | ||
|
|
02aa2734e0 | ||
|
|
66f9fd7231 | ||
|
|
1b125cb704 | ||
|
|
29f5d85c7b | ||
|
|
c192a1f31c | ||
|
|
3b20daf807 | ||
|
|
760c00e8ae | ||
|
|
6d8d3788a6 | ||
|
|
98e23e0033 | ||
|
|
4d7aff3458 | ||
|
|
33e47696dc | ||
|
|
c0f8825f83 | ||
|
|
7c26956cd4 | ||
|
|
52f02cd5d0 | ||
|
|
0df6b20147 | ||
|
|
253a2dda7d | ||
|
|
d762a85130 | ||
|
|
a765e8cf2e | ||
|
|
3e7fd1140c | ||
|
|
a56631510d |
2
.github/ISSUE_TEMPLATE/bug_report.md
vendored
2
.github/ISSUE_TEMPLATE/bug_report.md
vendored
@@ -6,7 +6,7 @@ labels: bug
|
|||||||
assignees: ''
|
assignees: ''
|
||||||
|
|
||||||
---
|
---
|
||||||
|
<!--Please be aware that GNOME Code of Conduct applies to Alpaca, https://conduct.gnome.org/-->
|
||||||
**Describe the bug**
|
**Describe the bug**
|
||||||
A clear and concise description of what the bug is.
|
A clear and concise description of what the bug is.
|
||||||
|
|
||||||
|
|||||||
2
.github/ISSUE_TEMPLATE/feature_request.md
vendored
2
.github/ISSUE_TEMPLATE/feature_request.md
vendored
@@ -6,7 +6,7 @@ labels: enhancement
|
|||||||
assignees: ''
|
assignees: ''
|
||||||
|
|
||||||
---
|
---
|
||||||
|
<!--Please be aware that GNOME Code of Conduct applies to Alpaca, https://conduct.gnome.org/-->
|
||||||
**Is your feature request related to a problem? Please describe.**
|
**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 [...]
|
A clear and concise description of what the problem is. Ex. I'm always frustrated when [...]
|
||||||
|
|
||||||
|
|||||||
18
.github/workflows/flatpak-builder.yml
vendored
Normal file
18
.github/workflows/flatpak-builder.yml
vendored
Normal file
@@ -0,0 +1,18 @@
|
|||||||
|
# .github/workflows/flatpak-build.yml
|
||||||
|
on:
|
||||||
|
workflow_dispatch:
|
||||||
|
name: Flatpak Build
|
||||||
|
jobs:
|
||||||
|
flatpak:
|
||||||
|
name: "Flatpak"
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
container:
|
||||||
|
image: bilelmoussaoui/flatpak-github-actions:gnome-46
|
||||||
|
options: --privileged
|
||||||
|
steps:
|
||||||
|
- uses: actions/checkout@v4
|
||||||
|
- uses: flatpak/flatpak-github-actions/flatpak-builder@v6
|
||||||
|
with:
|
||||||
|
bundle: Alpaca.flatpak
|
||||||
|
manifest-path: com.jeffser.Alpaca.json
|
||||||
|
cache-key: flatpak-builder-${{ github.sha }}
|
||||||
24
.github/workflows/pylint.yml
vendored
Normal file
24
.github/workflows/pylint.yml
vendored
Normal file
@@ -0,0 +1,24 @@
|
|||||||
|
name: Pylint
|
||||||
|
|
||||||
|
on:
|
||||||
|
workflow_dispatch:
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
build:
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
strategy:
|
||||||
|
matrix:
|
||||||
|
python-version: ["3.11"]
|
||||||
|
steps:
|
||||||
|
- uses: actions/checkout@v4
|
||||||
|
- name: Set up Python ${{ matrix.python-version }}
|
||||||
|
uses: actions/setup-python@v3
|
||||||
|
with:
|
||||||
|
python-version: ${{ matrix.python-version }}
|
||||||
|
- name: Install dependencies
|
||||||
|
run: |
|
||||||
|
python -m pip install --upgrade pip
|
||||||
|
pip install pylint
|
||||||
|
- name: Analysing the code with pylint
|
||||||
|
run: |
|
||||||
|
pylint --rcfile=.pylintrc $(git ls-files '*.py' | grep -v 'src/available_models_descriptions.py')
|
||||||
14
.pylintrc
Normal file
14
.pylintrc
Normal file
@@ -0,0 +1,14 @@
|
|||||||
|
[MASTER]
|
||||||
|
|
||||||
|
[MESSAGES CONTROL]
|
||||||
|
disable=undefined-variable, line-too-long, missing-function-docstring, consider-using-f-string, import-error
|
||||||
|
|
||||||
|
[FORMAT]
|
||||||
|
max-line-length=200
|
||||||
|
|
||||||
|
# Reasons for removing some checks:
|
||||||
|
# undefined-variable: _() is used by the translator on build time but it is not defined on the scripts
|
||||||
|
# line-too-long: I... I'm too lazy to make the lines shorter, maybe later
|
||||||
|
# missing-function-docstring I'm not adding a docstring to all the functions, most are self explanatory
|
||||||
|
# consider-using-f-string I can't use f-string because of the translator
|
||||||
|
# import-error The linter doesn't have access to all the libraries that the project itself does
|
||||||
34
Alpaca.doap
Normal file
34
Alpaca.doap
Normal file
@@ -0,0 +1,34 @@
|
|||||||
|
<Project xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
||||||
|
xmlns:rdfs="http://www.w3.org/2000/01/rdf-schema#"
|
||||||
|
xmlns:foaf="http://xmlns.com/foaf/0.1/"
|
||||||
|
xmlns:gnome="http://api.gnome.org/doap-extensions#"
|
||||||
|
xmlns="http://usefulinc.com/ns/doap#">
|
||||||
|
|
||||||
|
<name xml:lang="en">Alpaca</name>
|
||||||
|
<shortdesc xml:lang="en">An Ollama client made with GTK4 and Adwaita</shortdesc>
|
||||||
|
<homepage rdf:resource="https://jeffser.com/alpaca" />
|
||||||
|
<bug-database rdf:resource="https://github.com/Jeffser/Alpaca/issues"/>
|
||||||
|
<programming-language>Python</programming-language>
|
||||||
|
|
||||||
|
<platform>GTK 4</platform>
|
||||||
|
<platform>Libadwaita</platform>
|
||||||
|
|
||||||
|
<maintainer>
|
||||||
|
<foaf:Person>
|
||||||
|
<foaf:name>Jeffry Samuel</foaf:name>
|
||||||
|
<foaf:mbox rdf:resource="mailto:jeffrysamuer@gmail.com"/>
|
||||||
|
<foaf:account>
|
||||||
|
<foaf:OnlineAccount>
|
||||||
|
<foaf:accountServiceHomepage rdf:resource="https://github.com"/>
|
||||||
|
<foaf:accountName>jeffser</foaf:accountName>
|
||||||
|
</foaf:OnlineAccount>
|
||||||
|
</foaf:account>
|
||||||
|
<foaf:account>
|
||||||
|
<foaf:OnlineAccount>
|
||||||
|
<foaf:accountServiceHomepage rdf:resource="https://gitlab.gnome.org"/>
|
||||||
|
<foaf:accountName>jeffser</foaf:accountName>
|
||||||
|
</foaf:OnlineAccount>
|
||||||
|
</foaf:account>
|
||||||
|
</foaf:Person>
|
||||||
|
</maintainer>
|
||||||
|
</Project>
|
||||||
61
README.md
61
README.md
@@ -11,7 +11,11 @@ Alpaca is an [Ollama](https://github.com/ollama/ollama) client where you can man
|
|||||||
> [!WARNING]
|
> [!WARNING]
|
||||||
> 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 AI models.
|
> 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 AI models.
|
||||||
|
|
||||||
|
> [!IMPORTANT]
|
||||||
|
> Please be aware that [GNOME Code of Conduct](https://conduct.gnome.org) applies to Alpaca before interacting with this repository.
|
||||||
|
|
||||||
## Features!
|
## Features!
|
||||||
|
|
||||||
- Talk to multiple models in the same conversation
|
- Talk to multiple models in the same conversation
|
||||||
- Pull and delete models from the app
|
- Pull and delete models from the app
|
||||||
- Image recognition
|
- Image recognition
|
||||||
@@ -21,47 +25,38 @@ Alpaca is an [Ollama](https://github.com/ollama/ollama) client where you can man
|
|||||||
- Notifications
|
- Notifications
|
||||||
- Import / Export chats
|
- Import / Export chats
|
||||||
- Delete / Edit messages
|
- Delete / Edit messages
|
||||||
|
- Regenerate messages
|
||||||
- YouTube recognition (Ask questions about a YouTube video using the transcript)
|
- YouTube recognition (Ask questions about a YouTube video using the transcript)
|
||||||
- Website recognition (Ask questions about a certain question by parsing the url)
|
- Website recognition (Ask questions about a certain website by parsing the url)
|
||||||
|
|
||||||
## Screenies
|
## Screenies
|
||||||
Chatting with a model | Image recognition | Code highlighting
|
|
||||||
:--------------------:|:-----------------:|:----------------------:
|
|
||||||
 |  | 
|
|
||||||
|
|
||||||
## Preview
|
Normal conversation | Image recognition | Code highlighting | YouTube transcription | Model management
|
||||||
1. Clone repo using Gnome Builder
|
:------------------:|:-----------------:|:-----------------:|:---------------------:|:----------------:
|
||||||
2. Press the `run` button
|
 |  |  |  | 
|
||||||
|
|
||||||
## Instalation
|
## Translators
|
||||||
1. Go to the `releases` page
|
|
||||||
2. Download the latest flatpak package
|
|
||||||
3. Open it
|
|
||||||
|
|
||||||
## Ollama session tips
|
Language | Contributors
|
||||||
|
:----------------------|:-----------
|
||||||
### Change the port of the integrated Ollama instance
|
🇷🇺 Russian | [Alex K](https://github.com/alexkdeveloper)
|
||||||
Go to `~/.var/app/com.jeffser.Alpaca/config/server.json` and change the `"local_port"` value, by default it is `11435`.
|
🇪🇸 Spanish | [Jeffry Samuel](https://github.com/jeffser)
|
||||||
|
🇫🇷 French | [Louis Chauvet-Villaret](https://github.com/loulou64490) , [Théo FORTIN](https://github.com/topiga)
|
||||||
### Backup all the chats
|
🇧🇷 Brazilian Portuguese | [Daimar Stein](https://github.com/not-a-dev-stein)
|
||||||
The chat data is located in `~/.var/app/com.jeffser.Alpaca/data/chats` you can copy that directory wherever you want to.
|
🇳🇴 Norwegian | [CounterFlow64](https://github.com/CounterFlow64)
|
||||||
|
🇮🇳 Bengali | [Aritra Saha](https://github.com/olumolu)
|
||||||
### Force showing the welcome dialog
|
🇨🇳 Simplified Chinese | [Yuehao Sui](https://github.com/8ar10der) , [Aleksana](https://github.com/Aleksanaa)
|
||||||
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.
|
🇮🇳 Hindi | [Aritra Saha](https://github.com/olumolu)
|
||||||
|
|
||||||
### Add/Change environment variables for Ollama
|
|
||||||
You can change anything except `$HOME` and `$OLLAMA_HOST`, to do this go to `~/.var/app/com.jeffser.Alpaca/config/server.json` and change `ollama_overrides` accordingly, some overrides are available to change on the GUI.
|
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
## Thanks
|
## Thanks
|
||||||
- [not-a-dev-stein](https://github.com/not-a-dev-stein) for their help with requesting a new icon, bug reports and the translation to Brazilian Portuguese
|
|
||||||
- [TylerLaBree](https://github.com/TylerLaBree) for their requests and ideas
|
|
||||||
- [Alexkdeveloper](https://github.com/alexkdeveloper) for their help translating the app to Russian
|
|
||||||
- [Imbev](https://github.com/imbev) for their reports and suggestions
|
|
||||||
- [Nokse](https://github.com/Nokse22) for their contributions to the UI
|
|
||||||
- [Louis Chauvet-Villaret](https://github.com/loulou64490) for their suggestions and help translating the app to French
|
|
||||||
- [CounterFlow64](https://github.com/CounterFlow64) for their help translating the app to Norwegian
|
|
||||||
|
|
||||||
## About forks
|
- [not-a-dev-stein](https://github.com/not-a-dev-stein) for their help with requesting a new icon and bug reports
|
||||||
If you want to fork this... I mean, I think it would be better if you start from scratch, my code isn't well documented at all, but if you really want to, please give me some credit, that's all I ask for... And maybe a donation (joke)
|
- [TylerLaBree](https://github.com/TylerLaBree) for their requests and ideas
|
||||||
|
- [Imbev](https://github.com/imbev) for their reports and suggestions
|
||||||
|
- [Nokse](https://github.com/Nokse22) for their contributions to the UI and table rendering
|
||||||
|
- [Louis Chauvet-Villaret](https://github.com/loulou64490) for their suggestions
|
||||||
|
- [Aleksana](https://github.com/Aleksanaa) for her help with better handling of directories
|
||||||
|
- Sponsors for giving me enough money to be able to take a ride to my campus every time I need to <3
|
||||||
|
- Everyone that has shared kind words of encouragement!
|
||||||
|
|||||||
@@ -122,16 +122,16 @@
|
|||||||
"sources": [
|
"sources": [
|
||||||
{
|
{
|
||||||
"type": "file",
|
"type": "file",
|
||||||
"url": "https://github.com/ollama/ollama/releases/download/v0.2.8/ollama-linux-amd64",
|
"url": "https://github.com/ollama/ollama/releases/download/v0.3.3/ollama-linux-amd64",
|
||||||
"sha256": "7641b21e9d0822ba44e494f5ed3d3796d9e9fcdf4dbb66064f8c34c865bbec0b",
|
"sha256": "2b2a4ee4c86fa5b09503e95616bd1b3ee95238b1b3bf12488b9c27c66b84061a",
|
||||||
"only-arches": [
|
"only-arches": [
|
||||||
"x86_64"
|
"x86_64"
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"type": "file",
|
"type": "file",
|
||||||
"url": "https://github.com/ollama/ollama/releases/download/v0.2.8/ollama-linux-arm64",
|
"url": "https://github.com/ollama/ollama/releases/download/v0.3.3/ollama-linux-arm64",
|
||||||
"sha256": "8ccaea237c3ef2a34d0cc00d8a89ffb1179d5c49211b6cbdf80d8d88e3f0add6",
|
"sha256": "28fddbea0c161bc539fd08a3dc78d51413cfe8da97386cb39420f4f30667e22c",
|
||||||
"only-arches": [
|
"only-arches": [
|
||||||
"aarch64"
|
"aarch64"
|
||||||
]
|
]
|
||||||
@@ -145,7 +145,7 @@
|
|||||||
"sources" : [
|
"sources" : [
|
||||||
{
|
{
|
||||||
"type" : "git",
|
"type" : "git",
|
||||||
"url" : "file:///home/tentri/Documents/Alpaca",
|
"url": "https://github.com/Jeffser/Alpaca.git",
|
||||||
"branch" : "main"
|
"branch" : "main"
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
|
|||||||
@@ -78,6 +78,140 @@
|
|||||||
<url type="contribute">https://github.com/Jeffser/Alpaca/discussions/154</url>
|
<url type="contribute">https://github.com/Jeffser/Alpaca/discussions/154</url>
|
||||||
<url type="vcs-browser">https://github.com/Jeffser/Alpaca</url>
|
<url type="vcs-browser">https://github.com/Jeffser/Alpaca</url>
|
||||||
<releases>
|
<releases>
|
||||||
|
<release version="1.1.0" date="2024-08-10">
|
||||||
|
<url type="details">https://github.com/Jeffser/Alpaca/releases/tag/1.1.0</url>
|
||||||
|
<description>
|
||||||
|
<p>New</p>
|
||||||
|
<ul>
|
||||||
|
<li>Model manager opens faster</li>
|
||||||
|
<li>Delete chat option in secondary menu</li>
|
||||||
|
<li>New model selector popup</li>
|
||||||
|
<li>Standard shortcuts</li>
|
||||||
|
<li>Model manager is navigable with keyboard</li>
|
||||||
|
<li>Changed sidebar collapsing behavior</li>
|
||||||
|
<li>Focus indicators on messages</li>
|
||||||
|
<li>Welcome screen</li>
|
||||||
|
<li>Give message entry focus at launch</li>
|
||||||
|
<li>Generally better code</li>
|
||||||
|
</ul>
|
||||||
|
<p>Fixes</p>
|
||||||
|
<ul>
|
||||||
|
<li>Better width for dialogs</li>
|
||||||
|
<li>Better compatibility with screen readers</li>
|
||||||
|
<li>Fixed message regenerator</li>
|
||||||
|
<li>Removed 'Featured models' from welcome dialog</li>
|
||||||
|
<li>Added default buttons to dialogs</li>
|
||||||
|
<li>Fixed import / export of chats</li>
|
||||||
|
<li>Changed Python2 title to Python on code blocks</li>
|
||||||
|
<li>Prevent regeneration of title when the user changed it to a custom title</li>
|
||||||
|
<li>Show date on stopped messages</li>
|
||||||
|
<li>Fix clear chat error</li>
|
||||||
|
</ul>
|
||||||
|
</description>
|
||||||
|
</release>
|
||||||
|
<release version="1.0.6" date="2024-08-04">
|
||||||
|
<url type="details">https://github.com/Jeffser/Alpaca/releases/tag/1.0.6</url>
|
||||||
|
<description>
|
||||||
|
<p>New</p>
|
||||||
|
<ul>
|
||||||
|
<li>Changed shortcuts to standards</li>
|
||||||
|
<li>Moved 'Manage Models' button to primary menu</li>
|
||||||
|
<li>Stable support for GGUF model files</li>
|
||||||
|
<li>General optimizations</li>
|
||||||
|
</ul>
|
||||||
|
<p>Fixes</p>
|
||||||
|
<ul>
|
||||||
|
<li>Better handling of enter key (important for Japanese input)</li>
|
||||||
|
<li>Removed sponsor dialog</li>
|
||||||
|
<li>Added sponsor link in about dialog</li>
|
||||||
|
<li>Changed window and elements dimensions</li>
|
||||||
|
<li>Selected model changes when entering model manager</li>
|
||||||
|
<li>Better image tooltips</li>
|
||||||
|
<li>GGUF Support</li>
|
||||||
|
</ul>
|
||||||
|
</description>
|
||||||
|
</release>
|
||||||
|
<release version="1.0.5" date="2024-08-02">
|
||||||
|
<url type="details">https://github.com/Jeffser/Alpaca/releases/tag/1.0.5</url>
|
||||||
|
<description>
|
||||||
|
<p>New</p>
|
||||||
|
<ul>
|
||||||
|
<li>Regenerate any response, even if they are incomplete</li>
|
||||||
|
<li>Support for pulling models by name:tag</li>
|
||||||
|
<li>Stable support for GGUF model files</li>
|
||||||
|
<li>Restored sidebar toggle button</li>
|
||||||
|
</ul>
|
||||||
|
<p>Fixes</p>
|
||||||
|
<ul>
|
||||||
|
<li>Reverted back to standard styles</li>
|
||||||
|
<li>Fixed generated titles having "'S" for some reason</li>
|
||||||
|
<li>Changed min width for model dropdown</li>
|
||||||
|
<li>Changed message entry shadow</li>
|
||||||
|
<li>The last model used is now restored when the user changes chat</li>
|
||||||
|
<li>Better check for message finishing</li>
|
||||||
|
</ul>
|
||||||
|
</description>
|
||||||
|
</release>
|
||||||
|
<release version="1.0.4" date="2024-08-01">
|
||||||
|
<url type="details">https://github.com/Jeffser/Alpaca/releases/tag/1.0.4</url>
|
||||||
|
<description>
|
||||||
|
<p>New</p>
|
||||||
|
<ul>
|
||||||
|
<li>Added table rendering (Thanks Nokse)</li>
|
||||||
|
</ul>
|
||||||
|
<p>Fixes</p>
|
||||||
|
<ul>
|
||||||
|
<li>Made support dialog more common</li>
|
||||||
|
<li>Dialog title on tag chooser when downloading models didn't display properly</li>
|
||||||
|
<li>Prevent chat generation from generating a title with multiple lines</li>
|
||||||
|
</ul>
|
||||||
|
</description>
|
||||||
|
</release>
|
||||||
|
<release version="1.0.3" date="2024-08-01">
|
||||||
|
<url type="details">https://github.com/Jeffser/Alpaca/releases/tag/1.0.3</url>
|
||||||
|
<description>
|
||||||
|
<p>New</p>
|
||||||
|
<ul>
|
||||||
|
<li>Bearer Token entry on connection error dialog</li>
|
||||||
|
<li>Small appearance changes</li>
|
||||||
|
<li>Compatibility with code blocks without explicit language</li>
|
||||||
|
<li>Rare, optional and dismissible support dialog</li>
|
||||||
|
</ul>
|
||||||
|
<p>Fixes</p>
|
||||||
|
<ul>
|
||||||
|
<li>Date format for Simplified Chinese translation</li>
|
||||||
|
<li>Bug with unsupported localizations</li>
|
||||||
|
<li>Min height being too large to be used on mobile</li>
|
||||||
|
<li>Remote connection checker bug</li>
|
||||||
|
</ul>
|
||||||
|
</description>
|
||||||
|
</release>
|
||||||
|
<release version="1.0.2" date="2024-07-29">
|
||||||
|
<url type="details">https://github.com/Jeffser/Alpaca/releases/tag/1.0.2</url>
|
||||||
|
<description>
|
||||||
|
<p>Fixes</p>
|
||||||
|
<ul>
|
||||||
|
<li>Models with capital letters on their tag don't work</li>
|
||||||
|
<li>Ollama fails to launch on some systems</li>
|
||||||
|
<li>YouTube transcripts are not being saved in the right TMP directory</li>
|
||||||
|
</ul>
|
||||||
|
<p>New</p>
|
||||||
|
<ul>
|
||||||
|
<li>Debug messages are now shown on the 'About Alpaca' dialog</li>
|
||||||
|
<li>Updated Ollama to v0.3.0 (new models)</li>
|
||||||
|
</ul>
|
||||||
|
</description>
|
||||||
|
</release>
|
||||||
|
<release version="1.0.1" date="2024-07-23">
|
||||||
|
<url type="details">https://github.com/Jeffser/Alpaca/releases/tag/1.0.1</url>
|
||||||
|
<description>
|
||||||
|
<p>Fixes</p>
|
||||||
|
<ul>
|
||||||
|
<li>Models with '-' in their names didn't work properly, this is now fixed</li>
|
||||||
|
<li>Better connection check for Ollama</li>
|
||||||
|
</ul>
|
||||||
|
</description>
|
||||||
|
</release>
|
||||||
<release version="1.0.0" date="2024-07-22">
|
<release version="1.0.0" date="2024-07-22">
|
||||||
<url type="details">https://github.com/Jeffser/Alpaca/releases/tag/1.0.0</url>
|
<url type="details">https://github.com/Jeffser/Alpaca/releases/tag/1.0.0</url>
|
||||||
<description>
|
<description>
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
project('Alpaca', 'c',
|
project('Alpaca', 'c',
|
||||||
version: '1.0.0',
|
version: '1.1.0',
|
||||||
meson_version: '>= 0.62.0',
|
meson_version: '>= 0.62.0',
|
||||||
default_options: [ 'warning_level=2', 'werror=false', ],
|
default_options: [ 'warning_level=2', 'werror=false', ],
|
||||||
)
|
)
|
||||||
|
|||||||
@@ -4,4 +4,5 @@ pt_BR
|
|||||||
fr
|
fr
|
||||||
nb_NO
|
nb_NO
|
||||||
bn
|
bn
|
||||||
zh_CN
|
zh_CN
|
||||||
|
hi
|
||||||
|
|||||||
1724
po/alpaca.pot
1724
po/alpaca.pot
File diff suppressed because it is too large
Load Diff
1858
po/nb_NO.po
1858
po/nb_NO.po
File diff suppressed because it is too large
Load Diff
1761
po/pt_BR.po
1761
po/pt_BR.po
File diff suppressed because it is too large
Load Diff
1824
po/zh_CN.po
1824
po/zh_CN.po
File diff suppressed because it is too large
Load Diff
@@ -28,6 +28,8 @@
|
|||||||
<file alias="icons/scalable/status/edit-find-symbolic.svg">icons/edit-find-symbolic.svg</file>
|
<file alias="icons/scalable/status/edit-find-symbolic.svg">icons/edit-find-symbolic.svg</file>
|
||||||
<file alias="icons/scalable/status/edit-symbolic.svg">icons/edit-symbolic.svg</file>
|
<file alias="icons/scalable/status/edit-symbolic.svg">icons/edit-symbolic.svg</file>
|
||||||
<file alias="icons/scalable/status/image-missing-symbolic.svg">icons/image-missing-symbolic.svg</file>
|
<file alias="icons/scalable/status/image-missing-symbolic.svg">icons/image-missing-symbolic.svg</file>
|
||||||
|
<file alias="icons/scalable/status/update-symbolic.svg">icons/update-symbolic.svg</file>
|
||||||
|
<file alias="icons/scalable/status/down-symbolic.svg">icons/down-symbolic.svg</file>
|
||||||
<file preprocess="xml-stripblanks">window.ui</file>
|
<file preprocess="xml-stripblanks">window.ui</file>
|
||||||
<file preprocess="xml-stripblanks">gtk/help-overlay.ui</file>
|
<file preprocess="xml-stripblanks">gtk/help-overlay.ui</file>
|
||||||
</gresource>
|
</gresource>
|
||||||
|
|||||||
File diff suppressed because it is too large
Load Diff
@@ -1,16 +1,18 @@
|
|||||||
descriptions = {
|
descriptions = {
|
||||||
|
'llama3.1': _("Llama 3.1 is a new state-of-the-art model from Meta available in 8B, 70B and 405B parameter sizes."),
|
||||||
'gemma2': _("Google Gemma 2 is now available in 2 sizes, 9B and 27B."),
|
'gemma2': _("Google Gemma 2 is now available in 2 sizes, 9B and 27B."),
|
||||||
'llama3': _("Meta Llama 3: The most capable openly available LLM to date"),
|
'mistral-nemo': _("A state-of-the-art 12B model with 128k context length, built by Mistral AI in collaboration with NVIDIA."),
|
||||||
|
'mistral-large': _("Mistral Large 2 is Mistral's new flagship model that is significantly more capable in code generation, mathematics, and reasoning with 128k context window and support for dozens of languages."),
|
||||||
'qwen2': _("Qwen2 is a new series of large language models from Alibaba group"),
|
'qwen2': _("Qwen2 is a new series of large language models from Alibaba group"),
|
||||||
'deepseek-coder-v2': _("An open-source Mixture-of-Experts code language model that achieves performance comparable to GPT4-Turbo in code-specific tasks."),
|
'deepseek-coder-v2': _("An open-source Mixture-of-Experts code language model that achieves performance comparable to GPT4-Turbo in code-specific tasks."),
|
||||||
'phi3': _("Phi-3 is a family of lightweight 3B (Mini) and 14B (Medium) state-of-the-art open models by Microsoft."),
|
'phi3': _("Phi-3 is a family of lightweight 3B (Mini) and 14B (Medium) state-of-the-art open models by Microsoft."),
|
||||||
'aya': _("Aya 23, released by Cohere, is a new family of state-of-the-art, multilingual models that support 23 languages."),
|
|
||||||
'mistral': _("The 7B model released by Mistral AI, updated to version 0.3."),
|
'mistral': _("The 7B model released by Mistral AI, updated to version 0.3."),
|
||||||
'mixtral': _("A set of Mixture of Experts (MoE) model with open weights by Mistral AI in 8x7b and 8x22b parameter sizes."),
|
'mixtral': _("A set of Mixture of Experts (MoE) model with open weights by Mistral AI in 8x7b and 8x22b parameter sizes."),
|
||||||
'codegemma': _("CodeGemma is a collection of powerful, lightweight models that can perform a variety of coding tasks like fill-in-the-middle code completion, code generation, natural language understanding, mathematical reasoning, and instruction following."),
|
'codegemma': _("CodeGemma is a collection of powerful, lightweight models that can perform a variety of coding tasks like fill-in-the-middle code completion, code generation, natural language understanding, mathematical reasoning, and instruction following."),
|
||||||
'command-r': _("Command R is a Large Language Model optimized for conversational interaction and long context tasks."),
|
'command-r': _("Command R is a Large Language Model optimized for conversational interaction and long context tasks."),
|
||||||
'command-r-plus': _("Command R+ is a powerful, scalable large language model purpose-built to excel at real-world enterprise use cases."),
|
'command-r-plus': _("Command R+ is a powerful, scalable large language model purpose-built to excel at real-world enterprise use cases."),
|
||||||
'llava': _("🌋 LLaVA is a novel end-to-end trained large multimodal model that combines a vision encoder and Vicuna for general-purpose visual and language understanding. Updated to version 1.6."),
|
'llava': _("🌋 LLaVA is a novel end-to-end trained large multimodal model that combines a vision encoder and Vicuna for general-purpose visual and language understanding. Updated to version 1.6."),
|
||||||
|
'llama3': _("Meta Llama 3: The most capable openly available LLM to date"),
|
||||||
'gemma': _("Gemma is a family of lightweight, state-of-the-art open models built by Google DeepMind. Updated to version 1.1"),
|
'gemma': _("Gemma is a family of lightweight, state-of-the-art open models built by Google DeepMind. Updated to version 1.1"),
|
||||||
'qwen': _("Qwen 1.5 is a series of large language models by Alibaba Cloud spanning from 0.5B to 110B parameters"),
|
'qwen': _("Qwen 1.5 is a series of large language models by Alibaba Cloud spanning from 0.5B to 110B parameters"),
|
||||||
'llama2': _("Llama 2 is a collection of foundation language models ranging from 7B to 70B parameters."),
|
'llama2': _("Llama 2 is a collection of foundation language models ranging from 7B to 70B parameters."),
|
||||||
@@ -18,49 +20,50 @@ descriptions = {
|
|||||||
'dolphin-mixtral': _("Uncensored, 8x7b and 8x22b fine-tuned models based on the Mixtral mixture of experts models that excels at coding tasks. Created by Eric Hartford."),
|
'dolphin-mixtral': _("Uncensored, 8x7b and 8x22b fine-tuned models based on the Mixtral mixture of experts models that excels at coding tasks. Created by Eric Hartford."),
|
||||||
'nomic-embed-text': _("A high-performing open embedding model with a large token context window."),
|
'nomic-embed-text': _("A high-performing open embedding model with a large token context window."),
|
||||||
'llama2-uncensored': _("Uncensored Llama 2 model by George Sung and Jarrad Hope."),
|
'llama2-uncensored': _("Uncensored Llama 2 model by George Sung and Jarrad Hope."),
|
||||||
'deepseek-coder': _("DeepSeek Coder is a capable coding model trained on two trillion code and natural language tokens."),
|
|
||||||
'phi': _("Phi-2: a 2.7B language model by Microsoft Research that demonstrates outstanding reasoning and language understanding capabilities."),
|
'phi': _("Phi-2: a 2.7B language model by Microsoft Research that demonstrates outstanding reasoning and language understanding capabilities."),
|
||||||
|
'deepseek-coder': _("DeepSeek Coder is a capable coding model trained on two trillion code and natural language tokens."),
|
||||||
'dolphin-mistral': _("The uncensored Dolphin model based on Mistral that excels at coding tasks. Updated to version 2.8."),
|
'dolphin-mistral': _("The uncensored Dolphin model based on Mistral that excels at coding tasks. Updated to version 2.8."),
|
||||||
'orca-mini': _("A general-purpose model ranging from 3 billion parameters to 70 billion, suitable for entry-level hardware."),
|
'orca-mini': _("A general-purpose model ranging from 3 billion parameters to 70 billion, suitable for entry-level hardware."),
|
||||||
'dolphin-llama3': _("Dolphin 2.9 is a new model with 8B and 70B sizes by Eric Hartford based on Llama 3 that has a variety of instruction, conversational, and coding skills."),
|
'dolphin-llama3': _("Dolphin 2.9 is a new model with 8B and 70B sizes by Eric Hartford based on Llama 3 that has a variety of instruction, conversational, and coding skills."),
|
||||||
'mxbai-embed-large': _("State-of-the-art large embedding model from mixedbread.ai"),
|
'mxbai-embed-large': _("State-of-the-art large embedding model from mixedbread.ai"),
|
||||||
'mistral-openorca': _("Mistral OpenOrca is a 7 billion parameter model, fine-tuned on top of the Mistral 7B model using the OpenOrca dataset."),
|
|
||||||
'starcoder2': _("StarCoder2 is the next generation of transparently trained open code LLMs that comes in three sizes: 3B, 7B and 15B parameters."),
|
'starcoder2': _("StarCoder2 is the next generation of transparently trained open code LLMs that comes in three sizes: 3B, 7B and 15B parameters."),
|
||||||
'zephyr': _("Zephyr is a series of fine-tuned versions of the Mistral and Mixtral models that are trained to act as helpful assistants."),
|
'mistral-openorca': _("Mistral OpenOrca is a 7 billion parameter model, fine-tuned on top of the Mistral 7B model using the OpenOrca dataset."),
|
||||||
'yi': _("Yi 1.5 is a high-performing, bilingual language model."),
|
'yi': _("Yi 1.5 is a high-performing, bilingual language model."),
|
||||||
|
'zephyr': _("Zephyr is a series of fine-tuned versions of the Mistral and Mixtral models that are trained to act as helpful assistants."),
|
||||||
'llama2-chinese': _("Llama 2 based model fine tuned to improve Chinese dialogue ability."),
|
'llama2-chinese': _("Llama 2 based model fine tuned to improve Chinese dialogue ability."),
|
||||||
'llava-llama3': _("A LLaVA model fine-tuned from Llama 3 Instruct with better scores in several benchmarks."),
|
'llava-llama3': _("A LLaVA model fine-tuned from Llama 3 Instruct with better scores in several benchmarks."),
|
||||||
'vicuna': _("General use chat model based on Llama and Llama 2 with 2K to 16K context sizes."),
|
'vicuna': _("General use chat model based on Llama and Llama 2 with 2K to 16K context sizes."),
|
||||||
'nous-hermes2': _("The powerful family of models by Nous Research that excels at scientific discussion and coding tasks."),
|
'nous-hermes2': _("The powerful family of models by Nous Research that excels at scientific discussion and coding tasks."),
|
||||||
'wizard-vicuna-uncensored': _("Wizard Vicuna Uncensored is a 7B, 13B, and 30B parameter model based on Llama 2 uncensored by Eric Hartford."),
|
|
||||||
'tinyllama': _("The TinyLlama project is an open endeavor to train a compact 1.1B Llama model on 3 trillion tokens."),
|
'tinyllama': _("The TinyLlama project is an open endeavor to train a compact 1.1B Llama model on 3 trillion tokens."),
|
||||||
|
'wizard-vicuna-uncensored': _("Wizard Vicuna Uncensored is a 7B, 13B, and 30B parameter model based on Llama 2 uncensored by Eric Hartford."),
|
||||||
'codestral': _("Codestral is Mistral AI’s first-ever code model designed for code generation tasks."),
|
'codestral': _("Codestral is Mistral AI’s first-ever code model designed for code generation tasks."),
|
||||||
'starcoder': _("StarCoder is a code generation model trained on 80+ programming languages."),
|
'starcoder': _("StarCoder is a code generation model trained on 80+ programming languages."),
|
||||||
'wizardlm2': _("State of the art large language model from Microsoft AI with improved performance on complex chat, multilingual, reasoning and agent use cases."),
|
'wizardlm2': _("State of the art large language model from Microsoft AI with improved performance on complex chat, multilingual, reasoning and agent use cases."),
|
||||||
'openchat': _("A family of open-source models trained on a wide variety of data, surpassing ChatGPT on various benchmarks. Updated to version 3.5-0106."),
|
'openchat': _("A family of open-source models trained on a wide variety of data, surpassing ChatGPT on various benchmarks. Updated to version 3.5-0106."),
|
||||||
|
'aya': _("Aya 23, released by Cohere, is a new family of state-of-the-art, multilingual models that support 23 languages."),
|
||||||
'tinydolphin': _("An experimental 1.1B parameter model trained on the new Dolphin 2.8 dataset by Eric Hartford and based on TinyLlama."),
|
'tinydolphin': _("An experimental 1.1B parameter model trained on the new Dolphin 2.8 dataset by Eric Hartford and based on TinyLlama."),
|
||||||
'openhermes': _("OpenHermes 2.5 is a 7B model fine-tuned by Teknium on Mistral with fully open datasets."),
|
'openhermes': _("OpenHermes 2.5 is a 7B model fine-tuned by Teknium on Mistral with fully open datasets."),
|
||||||
'wizardcoder': _("State-of-the-art code generation model"),
|
'wizardcoder': _("State-of-the-art code generation model"),
|
||||||
'stable-code': _("Stable Code 3B is a coding model with instruct and code completion variants on par with models such as Code Llama 7B that are 2.5x larger."),
|
'stable-code': _("Stable Code 3B is a coding model with instruct and code completion variants on par with models such as Code Llama 7B that are 2.5x larger."),
|
||||||
'codeqwen': _("CodeQwen1.5 is a large language model pretrained on a large amount of code data."),
|
'codeqwen': _("CodeQwen1.5 is a large language model pretrained on a large amount of code data."),
|
||||||
'neural-chat': _("A fine-tuned model based on Mistral with good coverage of domain and language."),
|
|
||||||
'wizard-math': _("Model focused on math and logic problems"),
|
'wizard-math': _("Model focused on math and logic problems"),
|
||||||
|
'neural-chat': _("A fine-tuned model based on Mistral with good coverage of domain and language."),
|
||||||
'stablelm2': _("Stable LM 2 is a state-of-the-art 1.6B and 12B parameter language model trained on multilingual data in English, Spanish, German, Italian, French, Portuguese, and Dutch."),
|
'stablelm2': _("Stable LM 2 is a state-of-the-art 1.6B and 12B parameter language model trained on multilingual data in English, Spanish, German, Italian, French, Portuguese, and Dutch."),
|
||||||
'all-minilm': _("Embedding models on very large sentence level datasets."),
|
|
||||||
'granite-code': _("A family of open foundation models by IBM for Code Intelligence"),
|
'granite-code': _("A family of open foundation models by IBM for Code Intelligence"),
|
||||||
|
'all-minilm': _("Embedding models on very large sentence level datasets."),
|
||||||
'phind-codellama': _("Code generation model based on Code Llama."),
|
'phind-codellama': _("Code generation model based on Code Llama."),
|
||||||
'dolphincoder': _("A 7B and 15B uncensored variant of the Dolphin model family that excels at coding, based on StarCoder2."),
|
'dolphincoder': _("A 7B and 15B uncensored variant of the Dolphin model family that excels at coding, based on StarCoder2."),
|
||||||
'nous-hermes': _("General use models based on Llama and Llama 2 from Nous Research."),
|
'nous-hermes': _("General use models based on Llama and Llama 2 from Nous Research."),
|
||||||
'sqlcoder': _("SQLCoder is a code completion model fined-tuned on StarCoder for SQL generation tasks"),
|
'sqlcoder': _("SQLCoder is a code completion model fined-tuned on StarCoder for SQL generation tasks"),
|
||||||
'llama3-gradient': _("This model extends LLama-3 8B's context length from 8k to over 1m tokens."),
|
'llama3-gradient': _("This model extends LLama-3 8B's context length from 8k to over 1m tokens."),
|
||||||
'starling-lm': _("Starling is a large language model trained by reinforcement learning from AI feedback focused on improving chatbot helpfulness."),
|
'starling-lm': _("Starling is a large language model trained by reinforcement learning from AI feedback focused on improving chatbot helpfulness."),
|
||||||
'deepseek-llm': _("An advanced language model crafted with 2 trillion bilingual tokens."),
|
|
||||||
'yarn-llama2': _("An extension of Llama 2 that supports a context of up to 128k tokens."),
|
'yarn-llama2': _("An extension of Llama 2 that supports a context of up to 128k tokens."),
|
||||||
'xwinlm': _("Conversational model based on Llama 2 that performs competitively on various benchmarks."),
|
'xwinlm': _("Conversational model based on Llama 2 that performs competitively on various benchmarks."),
|
||||||
|
'deepseek-llm': _("An advanced language model crafted with 2 trillion bilingual tokens."),
|
||||||
'llama3-chatqa': _("A model from NVIDIA based on Llama 3 that excels at conversational question answering (QA) and retrieval-augmented generation (RAG)."),
|
'llama3-chatqa': _("A model from NVIDIA based on Llama 3 that excels at conversational question answering (QA) and retrieval-augmented generation (RAG)."),
|
||||||
'orca2': _("Orca 2 is built by Microsoft research, and are a fine-tuned version of Meta's Llama 2 models. The model is designed to excel particularly in reasoning."),
|
'orca2': _("Orca 2 is built by Microsoft research, and are a fine-tuned version of Meta's Llama 2 models. The model is designed to excel particularly in reasoning."),
|
||||||
'solar': _("A compact, yet powerful 10.7B large language model designed for single-turn conversation."),
|
|
||||||
'wizardlm': _("General use model based on Llama 2."),
|
'wizardlm': _("General use model based on Llama 2."),
|
||||||
|
'solar': _("A compact, yet powerful 10.7B large language model designed for single-turn conversation."),
|
||||||
'samantha-mistral': _("A companion assistant trained in philosophy, psychology, and personal relationships. Based on Mistral."),
|
'samantha-mistral': _("A companion assistant trained in philosophy, psychology, and personal relationships. Based on Mistral."),
|
||||||
'dolphin-phi': _("2.7B uncensored Dolphin model by Eric Hartford, based on the Phi language model by Microsoft Research."),
|
'dolphin-phi': _("2.7B uncensored Dolphin model by Eric Hartford, based on the Phi language model by Microsoft Research."),
|
||||||
'stable-beluga': _("Llama 2 based model fine tuned on an Orca-style dataset. Originally called Free Willy."),
|
'stable-beluga': _("Llama 2 based model fine tuned on an Orca-style dataset. Originally called Free Willy."),
|
||||||
@@ -68,22 +71,23 @@ descriptions = {
|
|||||||
'bakllava': _("BakLLaVA is a multimodal model consisting of the Mistral 7B base model augmented with the LLaVA architecture."),
|
'bakllava': _("BakLLaVA is a multimodal model consisting of the Mistral 7B base model augmented with the LLaVA architecture."),
|
||||||
'wizardlm-uncensored': _("Uncensored version of Wizard LM model"),
|
'wizardlm-uncensored': _("Uncensored version of Wizard LM model"),
|
||||||
'snowflake-arctic-embed': _("A suite of text embedding models by Snowflake, optimized for performance."),
|
'snowflake-arctic-embed': _("A suite of text embedding models by Snowflake, optimized for performance."),
|
||||||
|
'deepseek-v2': _("A strong, economical, and efficient Mixture-of-Experts language model."),
|
||||||
'medllama2': _("Fine-tuned Llama 2 model to answer medical questions based on an open source medical dataset."),
|
'medllama2': _("Fine-tuned Llama 2 model to answer medical questions based on an open source medical dataset."),
|
||||||
'yarn-mistral': _("An extension of Mistral to support context windows of 64K or 128K."),
|
'yarn-mistral': _("An extension of Mistral to support context windows of 64K or 128K."),
|
||||||
'nous-hermes2-mixtral': _("The Nous Hermes 2 model from Nous Research, now trained over Mixtral."),
|
|
||||||
'llama-pro': _("An expansion of Llama 2 that specializes in integrating both general language understanding and domain-specific knowledge, particularly in programming and mathematics."),
|
'llama-pro': _("An expansion of Llama 2 that specializes in integrating both general language understanding and domain-specific knowledge, particularly in programming and mathematics."),
|
||||||
'deepseek-v2': _("A strong, economical, and efficient Mixture-of-Experts language model."),
|
'nous-hermes2-mixtral': _("The Nous Hermes 2 model from Nous Research, now trained over Mixtral."),
|
||||||
'meditron': _("Open-source medical large language model adapted from Llama 2 to the medical domain."),
|
'meditron': _("Open-source medical large language model adapted from Llama 2 to the medical domain."),
|
||||||
'codeup': _("Great code generation model based on Llama2."),
|
'codeup': _("Great code generation model based on Llama2."),
|
||||||
'nexusraven': _("Nexus Raven is a 13B instruction tuned model for function calling tasks."),
|
'nexusraven': _("Nexus Raven is a 13B instruction tuned model for function calling tasks."),
|
||||||
'everythinglm': _("Uncensored Llama2 based model with support for a 16K context window."),
|
'everythinglm': _("Uncensored Llama2 based model with support for a 16K context window."),
|
||||||
'llava-phi3': _("A new small LLaVA model fine-tuned from Phi 3 Mini."),
|
'llava-phi3': _("A new small LLaVA model fine-tuned from Phi 3 Mini."),
|
||||||
|
'codegeex4': _("A versatile model for AI software development scenarios, including code completion."),
|
||||||
|
'glm4': _("A strong multi-lingual general language model with competitive performance to Llama 3."),
|
||||||
'magicoder': _("🎩 Magicoder is a family of 7B parameter models trained on 75K synthetic instruction data using OSS-Instruct, a novel approach to enlightening LLMs with open-source code snippets."),
|
'magicoder': _("🎩 Magicoder is a family of 7B parameter models trained on 75K synthetic instruction data using OSS-Instruct, a novel approach to enlightening LLMs with open-source code snippets."),
|
||||||
'stablelm-zephyr': _("A lightweight chat model allowing accurate, and responsive output without requiring high-end hardware."),
|
'stablelm-zephyr': _("A lightweight chat model allowing accurate, and responsive output without requiring high-end hardware."),
|
||||||
'codebooga': _("A high-performing code instruct model created by merging two existing code models."),
|
'codebooga': _("A high-performing code instruct model created by merging two existing code models."),
|
||||||
'mistrallite': _("MistralLite is a fine-tuned model based on Mistral with enhanced capabilities of processing long contexts."),
|
'mistrallite': _("MistralLite is a fine-tuned model based on Mistral with enhanced capabilities of processing long contexts."),
|
||||||
'glm4': _("A strong multi-lingual general language model with competitive performance to Llama 3."),
|
'wizard-vicuna': _("Wizard Vicuna is a 13B parameter model based on Llama 2 trained by MelodysDreamj."),
|
||||||
'wizard-vicuna': _("A strong multi-lingual general language model with competitive performance to Llama 3."),
|
|
||||||
'duckdb-nsql': _("7B parameter text-to-SQL model made by MotherDuck and Numbers Station."),
|
'duckdb-nsql': _("7B parameter text-to-SQL model made by MotherDuck and Numbers Station."),
|
||||||
'megadolphin': _("MegaDolphin-2.2-120b is a transformation of Dolphin-2.2-70b created by interleaving the model with itself."),
|
'megadolphin': _("MegaDolphin-2.2-120b is a transformation of Dolphin-2.2-70b created by interleaving the model with itself."),
|
||||||
'goliath': _("A language model created by combining two fine-tuned Llama 2 70B models into one."),
|
'goliath': _("A language model created by combining two fine-tuned Llama 2 70B models into one."),
|
||||||
@@ -92,12 +96,10 @@ descriptions = {
|
|||||||
'falcon2': _("Falcon2 is an 11B parameters causal decoder-only model built by TII and trained over 5T tokens."),
|
'falcon2': _("Falcon2 is an 11B parameters causal decoder-only model built by TII and trained over 5T tokens."),
|
||||||
'notus': _("A 7B chat model fine-tuned with high-quality data and based on Zephyr."),
|
'notus': _("A 7B chat model fine-tuned with high-quality data and based on Zephyr."),
|
||||||
'dbrx': _("DBRX is an open, general-purpose LLM created by Databricks."),
|
'dbrx': _("DBRX is an open, general-purpose LLM created by Databricks."),
|
||||||
'codegeex4': _("A versatile model for AI software development scenarios, including code completion."),
|
|
||||||
'alfred': _("A robust conversational model designed to be used for both chat and instruct use cases."),
|
|
||||||
'internlm2': _("InternLM2.5 is a 7B parameter model tailored for practical scenarios with outstanding reasoning capability."),
|
'internlm2': _("InternLM2.5 is a 7B parameter model tailored for practical scenarios with outstanding reasoning capability."),
|
||||||
|
'alfred': _("A robust conversational model designed to be used for both chat and instruct use cases."),
|
||||||
'llama3-groq-tool-use': _("A series of models from Groq that represent a significant advancement in open-source AI capabilities for tool use/function calling."),
|
'llama3-groq-tool-use': _("A series of models from Groq that represent a significant advancement in open-source AI capabilities for tool use/function calling."),
|
||||||
'mathstral': _("MathΣtral: a 7B model designed for math reasoning and scientific discovery by Mistral AI."),
|
'mathstral': _("MathΣtral: a 7B model designed for math reasoning and scientific discovery by Mistral AI."),
|
||||||
'mistral-nemo': _("A state-of-the-art 12B model with 128k context length, built by Mistral AI in collaboration with NVIDIA."),
|
|
||||||
'firefunction-v2': _("An open weights function calling model based on Llama 3, competitive with GPT-4o function calling capabilities."),
|
'firefunction-v2': _("An open weights function calling model based on Llama 3, competitive with GPT-4o function calling capabilities."),
|
||||||
'nuextract': _("A 3.8B model fine-tuned on a private high-quality synthetic dataset for information extraction, based on Phi-3."),
|
'nuextract': _("A 3.8B model fine-tuned on a private high-quality synthetic dataset for information extraction, based on Phi-3."),
|
||||||
}
|
}
|
||||||
@@ -1,15 +1,19 @@
|
|||||||
# connection_handler.py
|
# connection_handler.py
|
||||||
import json, requests
|
"""
|
||||||
|
Handles requests to remote and integrated instances of Ollama
|
||||||
|
"""
|
||||||
|
import json
|
||||||
|
import requests
|
||||||
#OK=200 response.status_code
|
#OK=200 response.status_code
|
||||||
url = None
|
URL = None
|
||||||
bearer_token = None
|
BEARER_TOKEN = None
|
||||||
|
|
||||||
def get_headers(include_json:bool) -> dict:
|
def get_headers(include_json:bool) -> dict:
|
||||||
headers = {}
|
headers = {}
|
||||||
if include_json:
|
if include_json:
|
||||||
headers["Content-Type"] = "application/json"
|
headers["Content-Type"] = "application/json"
|
||||||
if bearer_token:
|
if BEARER_TOKEN:
|
||||||
headers["Authorization"] = "Bearer {}".format(bearer_token)
|
headers["Authorization"] = "Bearer {}".format(BEARER_TOKEN)
|
||||||
return headers if len(headers.keys()) > 0 else None
|
return headers if len(headers.keys()) > 0 else None
|
||||||
|
|
||||||
def simple_get(connection_url:str) -> dict:
|
def simple_get(connection_url:str) -> dict:
|
||||||
|
|||||||
124
src/dialogs.py
124
src/dialogs.py
@@ -1,11 +1,15 @@
|
|||||||
# dialogs.py
|
# dialogs.py
|
||||||
|
"""
|
||||||
from gi.repository import Adw, Gtk, Gdk, GLib, GtkSource, Gio, GdkPixbuf
|
Handles UI dialogs
|
||||||
|
"""
|
||||||
import os
|
import os
|
||||||
|
import logging
|
||||||
from pytube import YouTube
|
from pytube import YouTube
|
||||||
from html2text import html2text
|
from html2text import html2text
|
||||||
|
from gi.repository import Adw, Gtk
|
||||||
from . import connection_handler
|
from . import connection_handler
|
||||||
|
|
||||||
|
logger = logging.getLogger(__name__)
|
||||||
# CLEAR CHAT | WORKS
|
# CLEAR CHAT | WORKS
|
||||||
|
|
||||||
def clear_chat_response(self, dialog, task):
|
def clear_chat_response(self, dialog, task):
|
||||||
@@ -24,6 +28,7 @@ def clear_chat(self):
|
|||||||
dialog.add_response("cancel", _("Cancel"))
|
dialog.add_response("cancel", _("Cancel"))
|
||||||
dialog.add_response("clear", _("Clear"))
|
dialog.add_response("clear", _("Clear"))
|
||||||
dialog.set_response_appearance("clear", Adw.ResponseAppearance.DESTRUCTIVE)
|
dialog.set_response_appearance("clear", Adw.ResponseAppearance.DESTRUCTIVE)
|
||||||
|
dialog.set_default_response("clear")
|
||||||
dialog.choose(
|
dialog.choose(
|
||||||
parent = self,
|
parent = self,
|
||||||
cancellable = None,
|
cancellable = None,
|
||||||
@@ -45,6 +50,7 @@ def delete_chat(self, chat_name):
|
|||||||
dialog.add_response("cancel", _("Cancel"))
|
dialog.add_response("cancel", _("Cancel"))
|
||||||
dialog.add_response("delete", _("Delete"))
|
dialog.add_response("delete", _("Delete"))
|
||||||
dialog.set_response_appearance("delete", Adw.ResponseAppearance.DESTRUCTIVE)
|
dialog.set_response_appearance("delete", Adw.ResponseAppearance.DESTRUCTIVE)
|
||||||
|
dialog.set_default_response("delete")
|
||||||
dialog.choose(
|
dialog.choose(
|
||||||
parent = self,
|
parent = self,
|
||||||
cancellable = None,
|
cancellable = None,
|
||||||
@@ -54,9 +60,11 @@ def delete_chat(self, chat_name):
|
|||||||
# RENAME CHAT | WORKS
|
# RENAME CHAT | WORKS
|
||||||
|
|
||||||
def rename_chat_response(self, dialog, task, old_chat_name, entry, label_element):
|
def rename_chat_response(self, dialog, task, old_chat_name, entry, label_element):
|
||||||
if not entry: return
|
if not entry:
|
||||||
|
return
|
||||||
new_chat_name = entry.get_text()
|
new_chat_name = entry.get_text()
|
||||||
if old_chat_name == new_chat_name: return
|
if old_chat_name == new_chat_name:
|
||||||
|
return
|
||||||
if new_chat_name and (task is None or dialog.choose_finish(task) == "rename"):
|
if new_chat_name and (task is None or dialog.choose_finish(task) == "rename"):
|
||||||
self.rename_chat(old_chat_name, new_chat_name, label_element)
|
self.rename_chat(old_chat_name, new_chat_name, label_element)
|
||||||
|
|
||||||
@@ -68,10 +76,10 @@ def rename_chat(self, chat_name, label_element):
|
|||||||
extra_child=entry,
|
extra_child=entry,
|
||||||
close_response="cancel"
|
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("cancel", _("Cancel"))
|
||||||
dialog.add_response("rename", _("Rename"))
|
dialog.add_response("rename", _("Rename"))
|
||||||
dialog.set_response_appearance("rename", Adw.ResponseAppearance.SUGGESTED)
|
dialog.set_response_appearance("rename", Adw.ResponseAppearance.SUGGESTED)
|
||||||
|
dialog.set_default_response("rename")
|
||||||
dialog.choose(
|
dialog.choose(
|
||||||
parent = self,
|
parent = self,
|
||||||
cancellable = None,
|
cancellable = None,
|
||||||
@@ -82,7 +90,8 @@ def rename_chat(self, chat_name, label_element):
|
|||||||
|
|
||||||
def new_chat_response(self, dialog, task, entry):
|
def new_chat_response(self, dialog, task, entry):
|
||||||
chat_name = _("New Chat")
|
chat_name = _("New Chat")
|
||||||
if entry is not None and entry.get_text() != "": chat_name = entry.get_text()
|
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"):
|
if chat_name and (task is None or dialog.choose_finish(task) == "create"):
|
||||||
self.new_chat(chat_name)
|
self.new_chat(chat_name)
|
||||||
|
|
||||||
@@ -95,10 +104,10 @@ def new_chat(self):
|
|||||||
extra_child=entry,
|
extra_child=entry,
|
||||||
close_response="cancel"
|
close_response="cancel"
|
||||||
)
|
)
|
||||||
entry.connect("activate", lambda dialog, entry: new_chat_response(self, dialog, None, entry))
|
|
||||||
dialog.add_response("cancel", _("Cancel"))
|
dialog.add_response("cancel", _("Cancel"))
|
||||||
dialog.add_response("create", _("Create"))
|
dialog.add_response("create", _("Create"))
|
||||||
dialog.set_response_appearance("create", Adw.ResponseAppearance.SUGGESTED)
|
dialog.set_response_appearance("create", Adw.ResponseAppearance.SUGGESTED)
|
||||||
|
dialog.set_default_response("create")
|
||||||
dialog.choose(
|
dialog.choose(
|
||||||
parent = self,
|
parent = self,
|
||||||
cancellable = None,
|
cancellable = None,
|
||||||
@@ -121,6 +130,7 @@ def stop_pull_model(self, model_name):
|
|||||||
dialog.add_response("cancel", _("Cancel"))
|
dialog.add_response("cancel", _("Cancel"))
|
||||||
dialog.add_response("stop", _("Stop"))
|
dialog.add_response("stop", _("Stop"))
|
||||||
dialog.set_response_appearance("stop", Adw.ResponseAppearance.DESTRUCTIVE)
|
dialog.set_response_appearance("stop", Adw.ResponseAppearance.DESTRUCTIVE)
|
||||||
|
dialog.set_default_response("stop")
|
||||||
dialog.choose(
|
dialog.choose(
|
||||||
parent = self.manage_models_dialog,
|
parent = self.manage_models_dialog,
|
||||||
cancellable = None,
|
cancellable = None,
|
||||||
@@ -142,6 +152,7 @@ def delete_model(self, model_name):
|
|||||||
dialog.add_response("cancel", _("Cancel"))
|
dialog.add_response("cancel", _("Cancel"))
|
||||||
dialog.add_response("delete", _("Delete"))
|
dialog.add_response("delete", _("Delete"))
|
||||||
dialog.set_response_appearance("delete", Adw.ResponseAppearance.DESTRUCTIVE)
|
dialog.set_response_appearance("delete", Adw.ResponseAppearance.DESTRUCTIVE)
|
||||||
|
dialog.set_default_response("delete")
|
||||||
dialog.choose(
|
dialog.choose(
|
||||||
parent = self.manage_models_dialog,
|
parent = self.manage_models_dialog,
|
||||||
cancellable = None,
|
cancellable = None,
|
||||||
@@ -164,6 +175,7 @@ def remove_attached_file(self, name):
|
|||||||
dialog.add_response("cancel", _("Cancel"))
|
dialog.add_response("cancel", _("Cancel"))
|
||||||
dialog.add_response("remove", _("Remove"))
|
dialog.add_response("remove", _("Remove"))
|
||||||
dialog.set_response_appearance("remove", Adw.ResponseAppearance.DESTRUCTIVE)
|
dialog.set_response_appearance("remove", Adw.ResponseAppearance.DESTRUCTIVE)
|
||||||
|
dialog.set_default_response("remove")
|
||||||
dialog.choose(
|
dialog.choose(
|
||||||
parent = self,
|
parent = self,
|
||||||
cancellable = None,
|
cancellable = None,
|
||||||
@@ -172,34 +184,46 @@ def remove_attached_file(self, name):
|
|||||||
|
|
||||||
# RECONNECT REMOTE | WORKS
|
# RECONNECT REMOTE | WORKS
|
||||||
|
|
||||||
def reconnect_remote_response(self, dialog, task, entry):
|
def reconnect_remote_response(self, dialog, task, url_entry, bearer_entry):
|
||||||
response = dialog.choose_finish(task)
|
response = dialog.choose_finish(task)
|
||||||
if not task or response == "remote":
|
if not task or response == "remote":
|
||||||
self.connect_remote(entry.get_text())
|
self.connect_remote(url_entry.get_text(), bearer_entry.get_text())
|
||||||
elif response == "local":
|
elif response == "local":
|
||||||
self.connect_local()
|
self.connect_local()
|
||||||
elif response == "close":
|
elif response == "close":
|
||||||
self.destroy()
|
self.destroy()
|
||||||
|
|
||||||
def reconnect_remote(self, current_url):
|
def reconnect_remote(self, current_url, current_bearer_token):
|
||||||
entry = Gtk.Entry(
|
entry_url = Gtk.Entry(
|
||||||
css_classes = ["error"],
|
css_classes = ["error"],
|
||||||
text = current_url
|
text = current_url,
|
||||||
|
placeholder_text = "URL"
|
||||||
)
|
)
|
||||||
|
entry_bearer_token = Gtk.Entry(
|
||||||
|
css_classes = ["error"] if current_bearer_token else None,
|
||||||
|
text = current_bearer_token,
|
||||||
|
placeholder_text = "Bearer Token (Optional)"
|
||||||
|
)
|
||||||
|
container = Gtk.Box(
|
||||||
|
orientation = 1,
|
||||||
|
spacing = 10
|
||||||
|
)
|
||||||
|
container.append(entry_url)
|
||||||
|
container.append(entry_bearer_token)
|
||||||
dialog = Adw.AlertDialog(
|
dialog = Adw.AlertDialog(
|
||||||
heading=_("Connection Error"),
|
heading=_("Connection Error"),
|
||||||
body=_("The remote instance has disconnected"),
|
body=_("The remote instance has disconnected"),
|
||||||
extra_child=entry
|
extra_child=container
|
||||||
)
|
)
|
||||||
entry.connect("activate", lambda entry, dialog: reconnect_remote_response(self, dialog, None, entry))
|
|
||||||
dialog.add_response("close", _("Close Alpaca"))
|
dialog.add_response("close", _("Close Alpaca"))
|
||||||
dialog.add_response("local", _("Use local instance"))
|
dialog.add_response("local", _("Use local instance"))
|
||||||
dialog.add_response("remote", _("Connect"))
|
dialog.add_response("remote", _("Connect"))
|
||||||
dialog.set_response_appearance("remote", Adw.ResponseAppearance.SUGGESTED)
|
dialog.set_response_appearance("remote", Adw.ResponseAppearance.SUGGESTED)
|
||||||
|
dialog.set_default_response("remote")
|
||||||
dialog.choose(
|
dialog.choose(
|
||||||
parent = self,
|
parent = self,
|
||||||
cancellable = None,
|
cancellable = None,
|
||||||
callback = lambda dialog, task, entry=entry: reconnect_remote_response(self, dialog, task, entry)
|
callback = lambda dialog, task, url_entry=entry_url, bearer_entry=entry_bearer_token: reconnect_remote_response(self, dialog, task, url_entry, bearer_entry)
|
||||||
)
|
)
|
||||||
|
|
||||||
# CREATE MODEL | WORKS
|
# CREATE MODEL | WORKS
|
||||||
@@ -212,7 +236,7 @@ def create_model_from_existing_response(self, dialog, task, dropdown):
|
|||||||
def create_model_from_existing(self):
|
def create_model_from_existing(self):
|
||||||
string_list = Gtk.StringList()
|
string_list = Gtk.StringList()
|
||||||
for model in self.local_models:
|
for model in self.local_models:
|
||||||
string_list.append(model)
|
string_list.append(self.convert_model_name(model, 0))
|
||||||
|
|
||||||
dropdown = Gtk.DropDown()
|
dropdown = Gtk.DropDown()
|
||||||
dropdown.set_model(string_list)
|
dropdown.set_model(string_list)
|
||||||
@@ -224,6 +248,7 @@ def create_model_from_existing(self):
|
|||||||
dialog.add_response("cancel", _("Cancel"))
|
dialog.add_response("cancel", _("Cancel"))
|
||||||
dialog.add_response("accept", _("Accept"))
|
dialog.add_response("accept", _("Accept"))
|
||||||
dialog.set_response_appearance("accept", Adw.ResponseAppearance.SUGGESTED)
|
dialog.set_response_appearance("accept", Adw.ResponseAppearance.SUGGESTED)
|
||||||
|
dialog.set_default_response("accept")
|
||||||
dialog.choose(
|
dialog.choose(
|
||||||
parent = self,
|
parent = self,
|
||||||
cancellable = None,
|
cancellable = None,
|
||||||
@@ -231,20 +256,42 @@ def create_model_from_existing(self):
|
|||||||
)
|
)
|
||||||
|
|
||||||
def create_model_from_file_response(self, file_dialog, result):
|
def create_model_from_file_response(self, file_dialog, result):
|
||||||
try: file = file_dialog.open_finish(result)
|
|
||||||
except:
|
|
||||||
self.logger.error(e)
|
|
||||||
return
|
|
||||||
try:
|
try:
|
||||||
self.create_model(file.get_path(), True)
|
file = file_dialog.open_finish(result)
|
||||||
|
try:
|
||||||
|
self.create_model(file.get_path(), True)
|
||||||
|
except Exception as e:
|
||||||
|
logger.error(e)
|
||||||
|
self.show_toast(_("An error occurred while creating the model"), self.main_overlay)
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
self.logger.error(e)
|
logger.error(e)
|
||||||
self.show_toast(_("An error occurred while creating the model"), self.main_overlay)
|
|
||||||
|
|
||||||
def create_model_from_file(self):
|
def create_model_from_file(self):
|
||||||
file_dialog = Gtk.FileDialog(default_filter=self.file_filter_gguf)
|
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_dialog.open(self, None, lambda file_dialog, result: create_model_from_file_response(self, file_dialog, result))
|
||||||
|
|
||||||
|
def create_model_from_name_response(self, dialog, task, entry):
|
||||||
|
model = entry.get_text().lower().strip()
|
||||||
|
if dialog.choose_finish(task) == 'accept' and model:
|
||||||
|
self.pull_model(model)
|
||||||
|
|
||||||
|
def create_model_from_name(self):
|
||||||
|
entry = Gtk.Entry()
|
||||||
|
entry.get_delegate().connect("insert-text", lambda *_ : self.check_alphanumeric(*_, ['-', '.', ':', '_', '/']))
|
||||||
|
dialog = Adw.AlertDialog(
|
||||||
|
heading=_("Pull Model"),
|
||||||
|
body=_("Input the name of the model in this format\nname:tag"),
|
||||||
|
extra_child=entry
|
||||||
|
)
|
||||||
|
dialog.add_response("cancel", _("Cancel"))
|
||||||
|
dialog.add_response("accept", _("Accept"))
|
||||||
|
dialog.set_response_appearance("accept", Adw.ResponseAppearance.SUGGESTED)
|
||||||
|
dialog.set_default_response("accept")
|
||||||
|
dialog.choose(
|
||||||
|
parent = self,
|
||||||
|
cancellable = None,
|
||||||
|
callback = lambda dialog, task, entry=entry: create_model_from_name_response(self, dialog, task, entry)
|
||||||
|
)
|
||||||
# FILE CHOOSER | WORKS
|
# FILE CHOOSER | WORKS
|
||||||
|
|
||||||
def attach_file_response(self, file_dialog, result):
|
def attach_file_response(self, file_dialog, result):
|
||||||
@@ -253,24 +300,24 @@ def attach_file_response(self, file_dialog, result):
|
|||||||
"image": ["png", "jpeg", "jpg", "webp", "gif"],
|
"image": ["png", "jpeg", "jpg", "webp", "gif"],
|
||||||
"pdf": ["pdf"]
|
"pdf": ["pdf"]
|
||||||
}
|
}
|
||||||
try: file = file_dialog.open_finish(result)
|
try:
|
||||||
except:
|
file = file_dialog.open_finish(result)
|
||||||
self.logger.error(e)
|
except Exception as e:
|
||||||
|
logger.error(e)
|
||||||
return
|
return
|
||||||
extension = file.get_path().split(".")[-1]
|
extension = file.get_path().split(".")[-1]
|
||||||
file_type = next(key for key, value in file_types.items() if extension in value)
|
file_type = next(key for key, value in file_types.items() if extension in value)
|
||||||
if not file_type: return
|
if not file_type:
|
||||||
|
return
|
||||||
if file_type == 'image' and not self.verify_if_image_can_be_used():
|
if file_type == 'image' and not self.verify_if_image_can_be_used():
|
||||||
self.show_toast(_("Image recognition is only available on specific models"), self.main_overlay)
|
self.show_toast(_("Image recognition is only available on specific models"), self.main_overlay)
|
||||||
return
|
return
|
||||||
self.attach_file(file.get_path(), file_type)
|
self.attach_file(file.get_path(), file_type)
|
||||||
|
|
||||||
|
def attach_file(self, file_filter):
|
||||||
def attach_file(self, filter):
|
file_dialog = Gtk.FileDialog(default_filter=file_filter)
|
||||||
file_dialog = Gtk.FileDialog(default_filter=filter)
|
|
||||||
file_dialog.open(self, None, lambda file_dialog, result: attach_file_response(self, file_dialog, result))
|
file_dialog.open(self, None, lambda file_dialog, result: attach_file_response(self, file_dialog, result))
|
||||||
|
|
||||||
|
|
||||||
# YouTube caption | WORKS
|
# YouTube caption | WORKS
|
||||||
|
|
||||||
def youtube_caption_response(self, dialog, task, video_url, caption_drop_down):
|
def youtube_caption_response(self, dialog, task, video_url, caption_drop_down):
|
||||||
@@ -285,10 +332,10 @@ def youtube_caption_response(self, dialog, task, video_url, caption_drop_down):
|
|||||||
selected_caption = caption_drop_down.get_selected_item().get_string()
|
selected_caption = caption_drop_down.get_selected_item().get_string()
|
||||||
for event in yt.captions[selected_caption.split(' | ')[1]].json_captions['events']:
|
for event in yt.captions[selected_caption.split(' | ')[1]].json_captions['events']:
|
||||||
text += "{}\n".format(event['segs'][0]['utf8'].replace('\n', '\\n'))
|
text += "{}\n".format(event['segs'][0]['utf8'].replace('\n', '\\n'))
|
||||||
if not os.path.exists('/tmp/alpaca/youtube'):
|
if not os.path.exists(os.path.join(self.cache_dir, 'tmp/youtube')):
|
||||||
os.makedirs('/tmp/alpaca/youtube')
|
os.makedirs(os.path.join(self.cache_dir, 'tmp/youtube'))
|
||||||
file_path = os.path.join('/tmp/alpaca/youtube', f'{yt.title} ({selected_caption.split(" | ")[0]})')
|
file_path = os.path.join(os.path.join(self.cache_dir, 'tmp/youtube'), f'{yt.title} ({selected_caption.split(" | ")[0]})')
|
||||||
with open(file_path, 'w+') as f:
|
with open(file_path, 'w+', encoding="utf-8") as f:
|
||||||
f.write(text)
|
f.write(text)
|
||||||
self.attach_file(file_path, 'youtube')
|
self.attach_file(file_path, 'youtube')
|
||||||
|
|
||||||
@@ -300,7 +347,8 @@ def youtube_caption(self, video_url):
|
|||||||
self.show_toast(_("This video does not have any transcriptions"), self.main_overlay)
|
self.show_toast(_("This video does not have any transcriptions"), self.main_overlay)
|
||||||
return
|
return
|
||||||
caption_list = Gtk.StringList()
|
caption_list = Gtk.StringList()
|
||||||
for caption in captions: caption_list.append("{} | {}".format(caption.name, caption.code))
|
for caption in captions:
|
||||||
|
caption_list.append("{} | {}".format(caption.name, caption.code))
|
||||||
caption_drop_down = Gtk.DropDown(
|
caption_drop_down = Gtk.DropDown(
|
||||||
enable_search=True,
|
enable_search=True,
|
||||||
model=caption_list
|
model=caption_list
|
||||||
@@ -314,6 +362,7 @@ def youtube_caption(self, video_url):
|
|||||||
dialog.add_response("cancel", _("Cancel"))
|
dialog.add_response("cancel", _("Cancel"))
|
||||||
dialog.add_response("accept", _("Accept"))
|
dialog.add_response("accept", _("Accept"))
|
||||||
dialog.set_response_appearance("accept", Adw.ResponseAppearance.SUGGESTED)
|
dialog.set_response_appearance("accept", Adw.ResponseAppearance.SUGGESTED)
|
||||||
|
dialog.set_default_response("accept")
|
||||||
dialog.choose(
|
dialog.choose(
|
||||||
parent = self,
|
parent = self,
|
||||||
cancellable = None,
|
cancellable = None,
|
||||||
@@ -336,7 +385,7 @@ def attach_website_response(self, dialog, task, url):
|
|||||||
os.makedirs('/tmp/alpaca/websites/')
|
os.makedirs('/tmp/alpaca/websites/')
|
||||||
md_name = self.generate_numbered_name('website.md', os.listdir('/tmp/alpaca/websites'))
|
md_name = self.generate_numbered_name('website.md', os.listdir('/tmp/alpaca/websites'))
|
||||||
file_path = os.path.join('/tmp/alpaca/websites/', md_name)
|
file_path = os.path.join('/tmp/alpaca/websites/', md_name)
|
||||||
with open(file_path, 'w+') as f:
|
with open(file_path, 'w+', encoding="utf-8") as f:
|
||||||
f.write('{}\n\n{}'.format(url, md))
|
f.write('{}\n\n{}'.format(url, md))
|
||||||
self.attach_file(file_path, 'website')
|
self.attach_file(file_path, 'website')
|
||||||
else:
|
else:
|
||||||
@@ -352,6 +401,7 @@ def attach_website(self, url):
|
|||||||
dialog.add_response("cancel", _("Cancel"))
|
dialog.add_response("cancel", _("Cancel"))
|
||||||
dialog.add_response("accept", _("Accept"))
|
dialog.add_response("accept", _("Accept"))
|
||||||
dialog.set_response_appearance("accept", Adw.ResponseAppearance.SUGGESTED)
|
dialog.set_response_appearance("accept", Adw.ResponseAppearance.SUGGESTED)
|
||||||
|
dialog.set_default_response("accept")
|
||||||
dialog.choose(
|
dialog.choose(
|
||||||
parent = self,
|
parent = self,
|
||||||
cancellable = None,
|
cancellable = None,
|
||||||
|
|||||||
2
src/icons/down-symbolic.svg
Normal file
2
src/icons/down-symbolic.svg
Normal file
@@ -0,0 +1,2 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<svg xmlns="http://www.w3.org/2000/svg" height="16px" viewBox="0 0 16 16" width="16px"><path d="m 2.292969 6.707031 l 5 5 c 0.390625 0.390625 1.023437 0.390625 1.414062 0 l 5 -5 c 0.390625 -0.390625 0.390625 -1.023437 0 -1.414062 s -1.023437 -0.390625 -1.414062 0 l -4.292969 4.292969 l -4.292969 -4.292969 c -0.390625 -0.390625 -1.023437 -0.390625 -1.414062 0 s -0.390625 1.023437 0 1.414062 z m 0 0" fill="#222222" fill-rule="evenodd"/></svg>
|
||||||
|
After Width: | Height: | Size: 484 B |
2
src/icons/update-symbolic.svg
Normal file
2
src/icons/update-symbolic.svg
Normal file
@@ -0,0 +1,2 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<svg xmlns="http://www.w3.org/2000/svg" height="16px" viewBox="0 0 16 16" width="16px"><g fill="#222222"><path d="m 7.957031 2 c -0.082031 0 -0.164062 0.003906 -0.246093 0.007812 c -0.1875 0.011719 -0.375 0.03125 -0.5625 0.0625 c -1.582032 0.226563 -3.007813 1.070313 -3.96875 2.34375 c -0.804688 1.074219 -1.183594 2.332032 -1.179688 3.585938 h 2.003906 c 0 -0.832031 0.253906 -1.671875 0.796875 -2.398438 c 1.335938 -1.777343 3.820313 -2.113281 5.597657 -0.78125 c 0.429687 0.320313 0.769531 0.734376 1.03125 1.1875 h -1.4375 c -0.550782 0 -1 0.449219 -1 1 v 1 h 6 v -6 h -1 c -0.550782 0 -1 0.449219 -1 1 v 1.6875 c -1.113282 -1.695312 -3.007813 -2.710937 -5.039063 -2.695312 z m 0 0"/><path d="m 8.035156 15.007812 c 0.082032 0 0.164063 -0.003906 0.246094 -0.007812 c 0.1875 -0.011719 0.375 -0.03125 0.5625 -0.0625 c 1.582031 -0.226562 3.007812 -1.066406 3.96875 -2.34375 c 0.804688 -1.074219 1.183594 -2.332031 1.179688 -3.585938 h -2.003907 c -0.003906 0.832032 -0.257812 1.675782 -0.796875 2.398438 c -1.335937 1.777344 -3.820312 2.113281 -5.597656 0.78125 c -0.429688 -0.320312 -0.769531 -0.734375 -1.03125 -1.1875 h 1.4375 c 0.550781 0 1 -0.449219 1 -1 v -1 h -6 v 6 h 1 c 0.550781 0 1 -0.449219 1 -1 v -1.6875 c 1.113281 1.695312 3.007812 2.710938 5.035156 2.695312 z m 0 0"/></g></svg>
|
||||||
|
After Width: | Height: | Size: 1.3 KiB |
25
src/internal.py
Normal file
25
src/internal.py
Normal file
@@ -0,0 +1,25 @@
|
|||||||
|
# internal.py
|
||||||
|
"""
|
||||||
|
Handles paths, they can be different if the app is running as a Flatpak
|
||||||
|
"""
|
||||||
|
import os
|
||||||
|
|
||||||
|
APP_ID = "com.jeffser.Alpaca"
|
||||||
|
|
||||||
|
IN_FLATPAK = bool(os.getenv("FLATPAK_ID"))
|
||||||
|
|
||||||
|
def get_xdg_home(env, default):
|
||||||
|
if IN_FLATPAK:
|
||||||
|
return os.getenv(env)
|
||||||
|
base = os.getenv(env) or os.path.expanduser(default)
|
||||||
|
path = os.path.join(base, APP_ID)
|
||||||
|
if not os.path.exists(path):
|
||||||
|
os.makedirs(path)
|
||||||
|
return path
|
||||||
|
|
||||||
|
|
||||||
|
data_dir = get_xdg_home("XDG_DATA_HOME", "~/.local/share")
|
||||||
|
config_dir = get_xdg_home("XDG_CONFIG_HOME", "~/.config")
|
||||||
|
cache_dir = get_xdg_home("XDG_CACHE_HOME", "~/.cache")
|
||||||
|
|
||||||
|
source_dir = os.path.abspath(os.path.dirname(__file__))
|
||||||
@@ -1,26 +1,35 @@
|
|||||||
# local_instance.py
|
# local_instance.py
|
||||||
import subprocess, os, threading
|
"""
|
||||||
|
Handles running, stopping and resetting the integrated Ollama instance
|
||||||
|
"""
|
||||||
|
import subprocess
|
||||||
|
import os
|
||||||
from time import sleep
|
from time import sleep
|
||||||
from logging import getLogger
|
from logging import getLogger
|
||||||
|
from .internal import data_dir, cache_dir
|
||||||
|
|
||||||
|
|
||||||
logger = getLogger(__name__)
|
logger = getLogger(__name__)
|
||||||
|
|
||||||
instance = None
|
instance = None
|
||||||
port = 11435
|
port = 11435
|
||||||
data_dir = os.getenv("XDG_DATA_HOME")
|
|
||||||
overrides = {}
|
overrides = {}
|
||||||
|
|
||||||
def start():
|
def start():
|
||||||
global instance, overrides
|
if not os.path.isdir(os.path.join(cache_dir, 'tmp/ollama')):
|
||||||
|
os.mkdir(os.path.join(cache_dir, 'tmp/ollama'))
|
||||||
|
global instance
|
||||||
params = overrides.copy()
|
params = overrides.copy()
|
||||||
params["OLLAMA_HOST"] = f"127.0.0.1:{port}" # You can't change this directly sorry :3
|
params["OLLAMA_HOST"] = f"127.0.0.1:{port}" # You can't change this directly sorry :3
|
||||||
params["HOME"] = data_dir
|
params["HOME"] = data_dir
|
||||||
instance = subprocess.Popen(["/app/bin/ollama", "serve"], env={**os.environ, **params}, stderr=subprocess.PIPE, text=True)
|
params["TMPDIR"] = os.path.join(cache_dir, 'tmp/ollama')
|
||||||
|
instance = subprocess.Popen(["ollama", "serve"], env={**os.environ, **params}, stderr=subprocess.PIPE, text=True)
|
||||||
logger.info("Starting Alpaca's Ollama instance...")
|
logger.info("Starting Alpaca's Ollama instance...")
|
||||||
logger.debug(params)
|
logger.debug(params)
|
||||||
sleep(1)
|
sleep(1)
|
||||||
logger.info("Started Alpaca's Ollama instance")
|
logger.info("Started Alpaca's Ollama instance")
|
||||||
|
v_str = subprocess.check_output("ollama -v", shell=True).decode('utf-8')
|
||||||
|
logger.info('Ollama version: {}'.format(v_str.split('client version is ')[1].strip()))
|
||||||
|
|
||||||
def stop():
|
def stop():
|
||||||
logger.info("Stopping Alpaca's Ollama instance")
|
logger.info("Stopping Alpaca's Ollama instance")
|
||||||
@@ -36,4 +45,3 @@ def reset():
|
|||||||
stop()
|
stop()
|
||||||
sleep(1)
|
sleep(1)
|
||||||
start()
|
start()
|
||||||
|
|
||||||
|
|||||||
57
src/main.py
57
src/main.py
@@ -16,31 +16,47 @@
|
|||||||
# along with this program. If not, see <https://www.gnu.org/licenses/>.
|
# along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||||
#
|
#
|
||||||
# SPDX-License-Identifier: GPL-3.0-or-later
|
# SPDX-License-Identifier: GPL-3.0-or-later
|
||||||
|
"""
|
||||||
|
Main script run at launch, handles actions, about dialog and the app itself (not the window)
|
||||||
|
"""
|
||||||
|
|
||||||
|
import gi
|
||||||
|
gi.require_version('Gtk', '4.0')
|
||||||
|
gi.require_version('Adw', '1')
|
||||||
|
from gi.repository import Gtk, Gio, Adw, GLib
|
||||||
|
|
||||||
|
from .window import AlpacaWindow
|
||||||
|
from .internal import cache_dir, data_dir
|
||||||
|
|
||||||
import sys
|
import sys
|
||||||
import logging
|
import logging
|
||||||
import gi
|
import os
|
||||||
|
|
||||||
gi.require_version('Gtk', '4.0')
|
|
||||||
gi.require_version('Adw', '1')
|
|
||||||
|
|
||||||
from gi.repository import Gtk, Gio, Adw, GLib
|
|
||||||
from .window import AlpacaWindow
|
|
||||||
|
|
||||||
|
|
||||||
logger = logging.getLogger(__name__)
|
logger = logging.getLogger(__name__)
|
||||||
|
|
||||||
|
translators = [
|
||||||
|
'Alex K (Russian) https://github.com/alexkdeveloper',
|
||||||
|
'Jeffry Samuel (Spanish) https://github.com/jeffser',
|
||||||
|
'Louis Chauvet-Villaret (French) https://github.com/loulou64490',
|
||||||
|
'Théo FORTIN (French) https://github.com/topiga',
|
||||||
|
'Daimar Stein (Brazilian Portuguese) https://github.com/not-a-dev-stein',
|
||||||
|
'CounterFlow64 (Norwegian) https://github.com/CounterFlow64',
|
||||||
|
'Aritra Saha (Bengali) https://github.com/olumolu',
|
||||||
|
'Yuehao Sui (Simplified Chinese) https://github.com/8ar10der',
|
||||||
|
'Aleksana (Simplified Chinese) https://github.com/Aleksanaa',
|
||||||
|
'Aritra Saha (Hindi) https://github.com/olumolu'
|
||||||
|
]
|
||||||
|
|
||||||
class AlpacaApplication(Adw.Application):
|
class AlpacaApplication(Adw.Application):
|
||||||
"""The main application singleton class."""
|
"""The main application singleton class."""
|
||||||
|
|
||||||
def __init__(self):
|
def __init__(self, version):
|
||||||
super().__init__(application_id='com.jeffser.Alpaca',
|
super().__init__(application_id='com.jeffser.Alpaca',
|
||||||
flags=Gio.ApplicationFlags.DEFAULT_FLAGS)
|
flags=Gio.ApplicationFlags.DEFAULT_FLAGS)
|
||||||
self.create_action('quit', lambda *_: self.quit(), ['<primary>q'])
|
self.create_action('quit', lambda *_: self.quit(), ['<primary>w', '<primary>q'])
|
||||||
self.create_action('preferences', lambda *_: AlpacaWindow.show_preferences_dialog(self.props.active_window), ['<primary>p'])
|
self.create_action('preferences', lambda *_: AlpacaWindow.show_preferences_dialog(self.props.active_window), ['<primary>comma'])
|
||||||
self.create_action('about', self.on_about_action)
|
self.create_action('about', self.on_about_action)
|
||||||
self.version = '1.0.0'
|
self.version = version
|
||||||
|
|
||||||
def do_activate(self):
|
def do_activate(self):
|
||||||
win = self.props.active_window
|
win = self.props.active_window
|
||||||
@@ -57,11 +73,13 @@ class AlpacaApplication(Adw.Application):
|
|||||||
support_url="https://github.com/Jeffser/Alpaca/discussions/155",
|
support_url="https://github.com/Jeffser/Alpaca/discussions/155",
|
||||||
developers=['Jeffser https://jeffser.com'],
|
developers=['Jeffser https://jeffser.com'],
|
||||||
designers=['Jeffser https://jeffser.com', 'Tobias Bernard (App Icon) https://tobiasbernard.com/'],
|
designers=['Jeffser https://jeffser.com', 'Tobias Bernard (App Icon) https://tobiasbernard.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\nCounterFlow64 (Norwegian) https://github.com/CounterFlow64\nAritra Saha (Bengali) https://github.com/olumolu\nYuehao Sui (Simplified Chinese) https://github.com/8ar10der',
|
translator_credits='\n'.join(translators),
|
||||||
copyright='© 2024 Jeffser\n© 2024 Ollama',
|
copyright='© 2024 Jeffser\n© 2024 Ollama',
|
||||||
issue_url='https://github.com/Jeffser/Alpaca/issues',
|
issue_url='https://github.com/Jeffser/Alpaca/issues',
|
||||||
license_type=3,
|
license_type=3,
|
||||||
website="https://jeffser.com/alpaca")
|
website="https://jeffser.com/alpaca",
|
||||||
|
debug_info=open(os.path.join(data_dir, 'tmp.log'), 'r').read())
|
||||||
|
about.add_link("Become a Sponsor", "https://github.com/sponsors/Jeffser")
|
||||||
about.present(parent=self.props.active_window)
|
about.present(parent=self.props.active_window)
|
||||||
|
|
||||||
def create_action(self, name, callback, shortcuts=None):
|
def create_action(self, name, callback, shortcuts=None):
|
||||||
@@ -73,10 +91,17 @@ class AlpacaApplication(Adw.Application):
|
|||||||
|
|
||||||
|
|
||||||
def main(version):
|
def main(version):
|
||||||
|
if os.path.isfile(os.path.join(data_dir, 'tmp.log')):
|
||||||
|
os.remove(os.path.join(data_dir, 'tmp.log'))
|
||||||
|
if os.path.isdir(os.path.join(cache_dir, 'tmp')):
|
||||||
|
os.system('rm -rf ' + os.path.join(cache_dir, "tmp/*"))
|
||||||
|
else:
|
||||||
|
os.mkdir(os.path.join(cache_dir, 'tmp'))
|
||||||
logging.basicConfig(
|
logging.basicConfig(
|
||||||
format="%(levelname)s\t[%(filename)s | %(funcName)s] %(message)s",
|
format="%(levelname)s\t[%(filename)s | %(funcName)s] %(message)s",
|
||||||
level=logging.INFO
|
level=logging.INFO,
|
||||||
|
handlers=[logging.FileHandler(filename=os.path.join(data_dir, 'tmp.log')), logging.StreamHandler(stream=sys.stdout)]
|
||||||
)
|
)
|
||||||
app = AlpacaApplication()
|
app = AlpacaApplication(version)
|
||||||
logger.info(f"Alpaca version: {app.version}")
|
logger.info(f"Alpaca version: {app.version}")
|
||||||
return app.run(sys.argv)
|
return app.run(sys.argv)
|
||||||
|
|||||||
@@ -43,7 +43,9 @@ alpaca_sources = [
|
|||||||
'dialogs.py',
|
'dialogs.py',
|
||||||
'local_instance.py',
|
'local_instance.py',
|
||||||
'available_models.json',
|
'available_models.json',
|
||||||
'available_models_descriptions.py'
|
'available_models_descriptions.py',
|
||||||
|
'table_widget.py',
|
||||||
|
'internal.py'
|
||||||
]
|
]
|
||||||
|
|
||||||
install_data(alpaca_sources, install_dir: moduledir)
|
install_data(alpaca_sources, install_dir: moduledir)
|
||||||
|
|||||||
@@ -1,8 +1,4 @@
|
|||||||
.message_input_scroll_window > * {
|
.message_text_view, .modelfile_textview {
|
||||||
box-shadow: none;
|
|
||||||
border-width: 0;
|
|
||||||
}
|
|
||||||
.message_text_view {
|
|
||||||
background-color: rgba(0,0,0,0);
|
background-color: rgba(0,0,0,0);
|
||||||
}
|
}
|
||||||
.chat_image_button {
|
.chat_image_button {
|
||||||
@@ -12,3 +8,19 @@
|
|||||||
border-radius: 5px;
|
border-radius: 5px;
|
||||||
padding: 5px;
|
padding: 5px;
|
||||||
}
|
}
|
||||||
|
.model_list_box {
|
||||||
|
padding: 0;
|
||||||
|
}
|
||||||
|
.manage_models_button {
|
||||||
|
padding: 6px 8px 6px 8px;
|
||||||
|
}
|
||||||
|
.model_list_box > * {
|
||||||
|
margin: 0;
|
||||||
|
}
|
||||||
|
.user_message, .response_message {
|
||||||
|
padding: 12px;
|
||||||
|
border-radius: 10px;
|
||||||
|
}
|
||||||
|
.user_message:focus, .response_message:focus, .editing_message_textview:focus, .code_block:focus {
|
||||||
|
box-shadow: 0 0 1px 2px mix(@accent_color, @window_bg_color, 0.5);
|
||||||
|
}
|
||||||
|
|||||||
131
src/table_widget.py
Normal file
131
src/table_widget.py
Normal file
@@ -0,0 +1,131 @@
|
|||||||
|
#table_widget.py
|
||||||
|
"""
|
||||||
|
Handles the table widget shown in chat responses
|
||||||
|
"""
|
||||||
|
|
||||||
|
import gi
|
||||||
|
gi.require_version('Gtk', '4.0')
|
||||||
|
from gi.repository import Gtk, GObject, Gio
|
||||||
|
|
||||||
|
import re
|
||||||
|
|
||||||
|
class MarkdownTable:
|
||||||
|
def __init__(self):
|
||||||
|
self.headers = []
|
||||||
|
self.rows = Gio.ListStore()
|
||||||
|
self.alignments = []
|
||||||
|
|
||||||
|
def __repr__(self):
|
||||||
|
table_repr = 'Headers: {}\n'.format(self.headers)
|
||||||
|
table_repr += 'Alignments: {}\n'.format(self.alignments)
|
||||||
|
table_repr += 'Rows:\n'
|
||||||
|
for row in self.rows:
|
||||||
|
table_repr += ' | '.join(row) + '\n'
|
||||||
|
return table_repr
|
||||||
|
|
||||||
|
class Row(GObject.GObject):
|
||||||
|
def __init__(self, _values):
|
||||||
|
super().__init__()
|
||||||
|
|
||||||
|
self.values = _values
|
||||||
|
|
||||||
|
def get_column_value(self, index):
|
||||||
|
return self.values[index]
|
||||||
|
|
||||||
|
class TableWidget(Gtk.Frame):
|
||||||
|
__gtype_name__ = 'TableWidget'
|
||||||
|
|
||||||
|
def __init__(self, markdown):
|
||||||
|
super().__init__()
|
||||||
|
|
||||||
|
self.table = MarkdownTable()
|
||||||
|
|
||||||
|
self.set_halign(Gtk.Align.START)
|
||||||
|
|
||||||
|
self.table_widget = Gtk.ColumnView(
|
||||||
|
show_column_separators=True,
|
||||||
|
show_row_separators=True,
|
||||||
|
reorderable=False,
|
||||||
|
)
|
||||||
|
scrolled_window = Gtk.ScrolledWindow(
|
||||||
|
vscrollbar_policy=Gtk.PolicyType.NEVER,
|
||||||
|
propagate_natural_width=True
|
||||||
|
)
|
||||||
|
self.set_child(scrolled_window)
|
||||||
|
|
||||||
|
try:
|
||||||
|
self.parse_markdown_table(markdown)
|
||||||
|
self.make_table()
|
||||||
|
scrolled_window.set_child(self.table_widget)
|
||||||
|
except:
|
||||||
|
label = Gtk.Label(
|
||||||
|
label=markdown.lstrip('\n').rstrip('\n'),
|
||||||
|
selectable=True,
|
||||||
|
margin_top=6,
|
||||||
|
margin_bottom=6,
|
||||||
|
margin_start=6,
|
||||||
|
margin_end=6
|
||||||
|
)
|
||||||
|
scrolled_window.set_child(label)
|
||||||
|
|
||||||
|
def parse_markdown_table(self, markdown_text):
|
||||||
|
# Define regex patterns for matching the table components
|
||||||
|
header_pattern = r'^\|(.+?)\|$'
|
||||||
|
separator_pattern = r'^\|(\s*[:-]+:?\s*\|)+$'
|
||||||
|
row_pattern = r'^\|(.+?)\|$'
|
||||||
|
|
||||||
|
# Split the text into lines
|
||||||
|
lines = markdown_text.strip().split('\n')
|
||||||
|
|
||||||
|
# Extract headers
|
||||||
|
header_match = re.match(header_pattern, lines[0], re.MULTILINE)
|
||||||
|
if header_match:
|
||||||
|
headers = [header.strip() for header in header_match.group(1).replace("*", "").split('|') if header.strip()]
|
||||||
|
self.table.headers = headers
|
||||||
|
|
||||||
|
# Extract alignments
|
||||||
|
separator_match = re.match(separator_pattern, lines[1], re.MULTILINE)
|
||||||
|
if separator_match:
|
||||||
|
alignments = []
|
||||||
|
separator_columns = lines[1].replace(" ", "").split('|')[1:-1]
|
||||||
|
for sep in separator_columns:
|
||||||
|
if ':' in sep:
|
||||||
|
if sep.startswith('-') and sep.endswith(':'):
|
||||||
|
alignments.append(1)
|
||||||
|
elif sep.startswith(':') and sep.endswith('-'):
|
||||||
|
alignments.append(0)
|
||||||
|
else:
|
||||||
|
alignments.append(0.5)
|
||||||
|
else:
|
||||||
|
alignments.append(0) # Default alignment is start
|
||||||
|
self.table.alignments = alignments
|
||||||
|
|
||||||
|
# Extract rows
|
||||||
|
for line in lines[2:]:
|
||||||
|
row_match = re.match(row_pattern, line, re.MULTILINE)
|
||||||
|
if row_match:
|
||||||
|
rows = line.split('|')[1:-1]
|
||||||
|
row = Row(rows)
|
||||||
|
self.table.rows.append(row)
|
||||||
|
|
||||||
|
def make_table(self):
|
||||||
|
|
||||||
|
def _on_factory_setup(_factory, list_item, align):
|
||||||
|
label = Gtk.Label(xalign=align, ellipsize=3, selectable=True)
|
||||||
|
list_item.set_child(label)
|
||||||
|
|
||||||
|
def _on_factory_bind(_factory, list_item, index):
|
||||||
|
label_widget = list_item.get_child()
|
||||||
|
row = list_item.get_item()
|
||||||
|
label_widget.set_label(row.get_column_value(index))
|
||||||
|
|
||||||
|
for index, column_name in enumerate(self.table.headers):
|
||||||
|
column = Gtk.ColumnViewColumn(title=column_name, expand=True)
|
||||||
|
factory = Gtk.SignalListItemFactory()
|
||||||
|
factory.connect("setup", _on_factory_setup, self.table.alignments[index])
|
||||||
|
factory.connect("bind", _on_factory_bind, index)
|
||||||
|
column.set_factory(factory)
|
||||||
|
self.table_widget.append_column(column)
|
||||||
|
|
||||||
|
selection = Gtk.NoSelection.new(model=self.table.rows)
|
||||||
|
self.table_widget.set_model(model=selection)
|
||||||
893
src/window.py
893
src/window.py
File diff suppressed because it is too large
Load Diff
606
src/window.ui
606
src/window.ui
@@ -5,35 +5,21 @@
|
|||||||
<template class="AlpacaWindow" parent="AdwApplicationWindow">
|
<template class="AlpacaWindow" parent="AdwApplicationWindow">
|
||||||
<signal name="close-request" handler="closing_app"/>
|
<signal name="close-request" handler="closing_app"/>
|
||||||
<property name="resizable">True</property>
|
<property name="resizable">True</property>
|
||||||
<property name="width-request">360</property>
|
<property name="width-request">400</property>
|
||||||
<property name="height-request">700</property>
|
<property name="height-request">400</property>
|
||||||
<property name="default-width">1300</property>
|
<property name="default-width">1300</property>
|
||||||
<property name="default-height">800</property>
|
<property name="default-height">800</property>
|
||||||
<property name="title">Alpaca</property>
|
<property name="title">Alpaca</property>
|
||||||
<child>
|
<child>
|
||||||
<object class="AdwBreakpoint">
|
<object class="AdwBreakpoint">
|
||||||
<condition>max-width: 800sp</condition>
|
<condition>max-width: 690sp</condition>
|
||||||
<setter object="split_view_overlay" property="collapsed">true</setter>
|
<setter object="split_view_overlay" property="collapsed">true</setter>
|
||||||
<setter object="show_sidebar_button" property="visible">true</setter>
|
|
||||||
</object>
|
|
||||||
</child>
|
|
||||||
<child>
|
|
||||||
</child>
|
|
||||||
<child>
|
|
||||||
<object class="AdwBreakpoint">
|
|
||||||
<condition>max-width: 500sp</condition>
|
|
||||||
<setter object="split_view_overlay" property="collapsed">true</setter>
|
|
||||||
<setter object="show_sidebar_button" property="visible">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>
|
</object>
|
||||||
</child>
|
</child>
|
||||||
<property name="content">
|
<property name="content">
|
||||||
<object class="AdwOverlaySplitView" id="split_view_overlay">
|
<object class="AdwOverlaySplitView" id="split_view_overlay">
|
||||||
<property name="show-sidebar" bind-source="show_sidebar_button" bind-property="active" bind-flags="sync-create"/>
|
<property name="show-sidebar" bind-source="show_sidebar_button" bind-property="active" bind-flags="sync-create"/>
|
||||||
|
<property name="sidebar-width-fraction">0.4</property>
|
||||||
<property name="sidebar">
|
<property name="sidebar">
|
||||||
<object class="AdwToolbarView">
|
<object class="AdwToolbarView">
|
||||||
<child type="top">
|
<child type="top">
|
||||||
@@ -80,7 +66,6 @@
|
|||||||
<object class="AdwHeaderBar" id="header_bar">
|
<object class="AdwHeaderBar" id="header_bar">
|
||||||
<child type="start">
|
<child type="start">
|
||||||
<object class="GtkToggleButton" id="show_sidebar_button">
|
<object class="GtkToggleButton" id="show_sidebar_button">
|
||||||
<property name="visible">false</property>
|
|
||||||
<property name="icon-name">sidebar-show-symbolic</property>
|
<property name="icon-name">sidebar-show-symbolic</property>
|
||||||
<property name="tooltip-text" translatable="yes">Toggle Sidebar</property>
|
<property name="tooltip-text" translatable="yes">Toggle Sidebar</property>
|
||||||
<property name="active" bind-source="split_view_overlay" bind-property="show-sidebar" bind-flags="sync-create"/>
|
<property name="active" bind-source="split_view_overlay" bind-property="show-sidebar" bind-flags="sync-create"/>
|
||||||
@@ -91,28 +76,79 @@
|
|||||||
<property name="orientation">0</property>
|
<property name="orientation">0</property>
|
||||||
<property name="spacing">12</property>
|
<property name="spacing">12</property>
|
||||||
<child>
|
<child>
|
||||||
<object class="GtkDropDown" id="model_drop_down">
|
<object class="GtkMenuButton" id="model_selector_button">
|
||||||
<signal name="notify" handler="verify_if_image_can_be_used"/>
|
<property name="tooltip-text" translatable="yes">Select Model</property>
|
||||||
<property name="width-request">150</property>
|
<property name="child">
|
||||||
<property name="enable-search">true</property>
|
<object class="GtkBox">
|
||||||
<property name="tooltip-text">Select Model</property>
|
<property name="spacing">10</property>
|
||||||
<property name="model">
|
<child>
|
||||||
<object class="GtkStringList" id="model_string_list">
|
<object class="GtkLabel">
|
||||||
<items>
|
<property name="label" translatable="yes">Select a Model</property>
|
||||||
</items>
|
<property name="ellipsize">2</property>
|
||||||
|
</object>
|
||||||
|
</child>
|
||||||
|
<child>
|
||||||
|
<object class="GtkImage">
|
||||||
|
<property name="icon-name">down-symbolic</property>
|
||||||
|
</object>
|
||||||
|
</child>
|
||||||
</object>
|
</object>
|
||||||
</property>
|
</property>
|
||||||
</object>
|
<property name="halign">1</property>
|
||||||
</child>
|
<style>
|
||||||
<child>
|
<class name="raised"/>
|
||||||
<object class="GtkButton" id="manage_models_button">
|
</style>
|
||||||
<signal name="clicked" handler="manage_models_button_activate"/>
|
<property name="popover">
|
||||||
<property name="tooltip-text" translatable="yes">Manage Models</property>
|
<object class="GtkPopover" id="model_popover">
|
||||||
<child>
|
<property name="has-arrow">false</property>
|
||||||
<object class="AdwButtonContent">
|
<child>
|
||||||
<property name="icon-name">brain-augemnted-symbolic</property>
|
<object class="GtkBox">
|
||||||
|
<property name="orientation">1</property>
|
||||||
|
<property name="spacing">5</property>
|
||||||
|
<child>
|
||||||
|
<object class="GtkButton">
|
||||||
|
<property name="child">
|
||||||
|
<object class="GtkLabel">
|
||||||
|
<property name="label" translatable="yes">Manage Models</property>
|
||||||
|
<property name="justify">left</property>
|
||||||
|
<property name="halign">1</property>
|
||||||
|
</object>
|
||||||
|
</property>
|
||||||
|
<property name="hexpand">true</property>
|
||||||
|
<property name="tooltip-text" translatable="yes">Manage Models</property>
|
||||||
|
<property name="action-name">app.manage_models</property>
|
||||||
|
<signal name="clicked" handler="close_model_popup"/>
|
||||||
|
<style>
|
||||||
|
<class name="flat"/>
|
||||||
|
<class name="manage_models_button"/>
|
||||||
|
</style>
|
||||||
|
</object>
|
||||||
|
</child>
|
||||||
|
<child>
|
||||||
|
<object class="GtkSeparator"/>
|
||||||
|
</child>
|
||||||
|
<child>
|
||||||
|
<object class="GtkScrolledWindow">
|
||||||
|
<property name="max-content-height">300</property>
|
||||||
|
<property name="propagate-natural-width">true</property>
|
||||||
|
<property name="propagate-natural-height">true</property>
|
||||||
|
<child>
|
||||||
|
<object class="GtkListBox" id="model_list_box">
|
||||||
|
<property name="hexpand">true</property>
|
||||||
|
<style>
|
||||||
|
<class name="navigation-sidebar"/>
|
||||||
|
<class name="model_list_box"/>
|
||||||
|
</style>
|
||||||
|
<signal name="row-selected" handler="change_model"/>
|
||||||
|
</object>
|
||||||
|
</child>
|
||||||
|
</object>
|
||||||
|
</child>
|
||||||
|
|
||||||
|
</object>
|
||||||
|
</child>
|
||||||
</object>
|
</object>
|
||||||
</child>
|
</property>
|
||||||
</object>
|
</object>
|
||||||
</child>
|
</child>
|
||||||
</object>
|
</object>
|
||||||
@@ -217,6 +253,8 @@
|
|||||||
<object class="GtkScrolledWindow">
|
<object class="GtkScrolledWindow">
|
||||||
<property name="max-content-height">150</property>
|
<property name="max-content-height">150</property>
|
||||||
<property name="propagate-natural-height">true</property>
|
<property name="propagate-natural-height">true</property>
|
||||||
|
<property name="margin-start">10</property>
|
||||||
|
<property name="margin-end">10</property>
|
||||||
<style>
|
<style>
|
||||||
<class name="message_input_scroll_window"/>
|
<class name="message_input_scroll_window"/>
|
||||||
</style>
|
</style>
|
||||||
@@ -226,11 +264,13 @@
|
|||||||
<class name="message_text_view"/>
|
<class name="message_text_view"/>
|
||||||
</style>
|
</style>
|
||||||
<property name="wrap-mode">word</property>
|
<property name="wrap-mode">word</property>
|
||||||
<property name="margin-start">10</property>
|
|
||||||
<property name="margin-end">10</property>
|
|
||||||
<property name="top-margin">10</property>
|
<property name="top-margin">10</property>
|
||||||
<property name="bottom-margin">10</property>
|
<property name="bottom-margin">10</property>
|
||||||
<property name="hexpand">true</property>
|
<property name="hexpand">true</property>
|
||||||
|
<property name="input-hints">spellcheck</property>
|
||||||
|
<accessibility>
|
||||||
|
<property name="label" translatable="yes">Message text box</property>
|
||||||
|
</accessibility>
|
||||||
</object>
|
</object>
|
||||||
</child>
|
</child>
|
||||||
</object>
|
</object>
|
||||||
@@ -244,8 +284,9 @@
|
|||||||
<property name="valign">3</property>
|
<property name="valign">3</property>
|
||||||
<property name="tooltip-text" translatable="yes">Send Message</property>
|
<property name="tooltip-text" translatable="yes">Send Message</property>
|
||||||
<style>
|
<style>
|
||||||
<class name="suggested-action"/>
|
<class name="accent"/>
|
||||||
<class name="circular"/>
|
<class name="circular"/>
|
||||||
|
<class name="suggested-action"/>
|
||||||
</style>
|
</style>
|
||||||
<child>
|
<child>
|
||||||
<object class="AdwButtonContent">
|
<object class="AdwButtonContent">
|
||||||
@@ -456,128 +497,10 @@
|
|||||||
</child>
|
</child>
|
||||||
</object>
|
</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"/>
|
|
||||||
<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">
|
<object class="AdwDialog" id="manage_models_dialog">
|
||||||
|
<accessibility>
|
||||||
|
<property name="label" translatable="yes">Manage models dialog</property>
|
||||||
|
</accessibility>
|
||||||
<property name="can-close">true</property>
|
<property name="can-close">true</property>
|
||||||
<property name="width-request">400</property>
|
<property name="width-request">400</property>
|
||||||
<property name="height-request">600</property>
|
<property name="height-request">600</property>
|
||||||
@@ -612,12 +535,18 @@
|
|||||||
</child>
|
</child>
|
||||||
<child type="top">
|
<child type="top">
|
||||||
<object class="GtkSearchBar" id="model_searchbar">
|
<object class="GtkSearchBar" id="model_searchbar">
|
||||||
|
<accessibility>
|
||||||
|
<property name="label" translatable="yes">Model search bar</property>
|
||||||
|
</accessibility>
|
||||||
<property name="key-capture-widget">AlpacaWindow</property>
|
<property name="key-capture-widget">AlpacaWindow</property>
|
||||||
<child>
|
<child>
|
||||||
<object class="GtkSearchEntry" id="searchentry">
|
<object class="GtkSearchEntry" id="searchentry">
|
||||||
<signal name="search-changed" handler="model_search_changed"/>
|
<signal name="search-changed" handler="model_search_changed"/>
|
||||||
<property name="search-delay">100</property>
|
<property name="search-delay">100</property>
|
||||||
<property name="placeholder-text" translatable="yes">Search models</property>
|
<property name="placeholder-text" translatable="yes">Search models</property>
|
||||||
|
<accessibility>
|
||||||
|
<property name="label" translatable="yes">Search models</property>
|
||||||
|
</accessibility>
|
||||||
</object>
|
</object>
|
||||||
</child>
|
</child>
|
||||||
</object>
|
</object>
|
||||||
@@ -653,7 +582,7 @@
|
|||||||
</child>
|
</child>
|
||||||
<child>
|
<child>
|
||||||
<object class="GtkListBox" id="available_model_list_box">
|
<object class="GtkListBox" id="available_model_list_box">
|
||||||
<property name="selection-mode">single</property>
|
<property name="selection-mode">none</property>
|
||||||
<style>
|
<style>
|
||||||
<class name="boxed-list"/>
|
<class name="boxed-list"/>
|
||||||
</style>
|
</style>
|
||||||
@@ -716,7 +645,7 @@
|
|||||||
<child>
|
<child>
|
||||||
<object class="GtkListBox" id="model_tag_list_box">
|
<object class="GtkListBox" id="model_tag_list_box">
|
||||||
<property name="valign">1</property>
|
<property name="valign">1</property>
|
||||||
<property name="selection-mode">single</property>
|
<property name="selection-mode">none</property>
|
||||||
<style>
|
<style>
|
||||||
<class name="boxed-list"/>
|
<class name="boxed-list"/>
|
||||||
</style>
|
</style>
|
||||||
@@ -730,6 +659,143 @@
|
|||||||
</property>
|
</property>
|
||||||
</object>
|
</object>
|
||||||
</child>
|
</child>
|
||||||
|
<child>
|
||||||
|
<object class="AdwNavigationPage">
|
||||||
|
<property name="title" translatable="yes">Create Model</property>
|
||||||
|
<property name="tag">model_create_page</property>
|
||||||
|
<property name="child">
|
||||||
|
<object class="AdwToolbarView">
|
||||||
|
<child type="top">
|
||||||
|
<object class="AdwHeaderBar">
|
||||||
|
<child type="start">
|
||||||
|
<object class="GtkButton">
|
||||||
|
<signal name="clicked" handler="link_button_handler"/>
|
||||||
|
<property name="icon-name">globe-symbolic</property>
|
||||||
|
</object>
|
||||||
|
</child>
|
||||||
|
</object>
|
||||||
|
</child>
|
||||||
|
<property name="content">
|
||||||
|
<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="sensitive">false</property>
|
||||||
|
<property name="subtitle"/>
|
||||||
|
<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="GtkBox">
|
||||||
|
<property name="height-request">140</property>
|
||||||
|
<property name="margin-top">10</property>
|
||||||
|
<property name="margin-bottom">10</property>
|
||||||
|
<property name="margin-start">10</property>
|
||||||
|
<property name="margin-end">10</property>
|
||||||
|
<style>
|
||||||
|
<class name="card"/>
|
||||||
|
</style>
|
||||||
|
<child>
|
||||||
|
<object class="GtkScrolledWindow">
|
||||||
|
<property name="margin-start">10</property>
|
||||||
|
<property name="margin-end">10</property>
|
||||||
|
<child>
|
||||||
|
<object class="GtkTextView" id="create_model_modelfile">
|
||||||
|
<style>
|
||||||
|
<class name="modelfile_textview"/>
|
||||||
|
</style>
|
||||||
|
<property name="wrap-mode">word</property>
|
||||||
|
<property name="top-margin">10</property>
|
||||||
|
<property name="bottom-margin">10</property>
|
||||||
|
<property name="hexpand">true</property>
|
||||||
|
</object>
|
||||||
|
</child>
|
||||||
|
</object>
|
||||||
|
</child>
|
||||||
|
</object>
|
||||||
|
</child>
|
||||||
|
<child>
|
||||||
|
<object class="GtkLabel">
|
||||||
|
<property name="label" translatable="yes">Some models require a modelfile, Alpaca fills FROM and SYSTEM (context) instructions automatically. Please visit the model's website or Ollama documentation for more information if you're unsure.</property>
|
||||||
|
<property name="margin-top">10</property>
|
||||||
|
<property name="margin-bottom">10</property>
|
||||||
|
<property name="margin-start">10</property>
|
||||||
|
<property name="margin-end">10</property>
|
||||||
|
<property name="halign">1</property>
|
||||||
|
<property name="wrap">true</property>
|
||||||
|
<style>
|
||||||
|
<class name="caption"/>
|
||||||
|
</style>
|
||||||
|
</object>
|
||||||
|
</child>
|
||||||
|
</object>
|
||||||
|
</child>
|
||||||
|
<child>
|
||||||
|
<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>
|
||||||
|
</object>
|
||||||
|
</property>
|
||||||
|
</object>
|
||||||
|
</property>
|
||||||
|
</object>
|
||||||
|
</child>
|
||||||
</object>
|
</object>
|
||||||
</child>
|
</child>
|
||||||
</object>
|
</object>
|
||||||
@@ -737,9 +803,12 @@
|
|||||||
</object>
|
</object>
|
||||||
|
|
||||||
<object class="AdwDialog" id="file_preview_dialog">
|
<object class="AdwDialog" id="file_preview_dialog">
|
||||||
|
<accessibility>
|
||||||
|
<property name="label" translatable="yes">File preview dialog</property>
|
||||||
|
</accessibility>
|
||||||
<property name="can-close">true</property>
|
<property name="can-close">true</property>
|
||||||
<property name="width-request">450</property>
|
<property name="width-request">400</property>
|
||||||
<property name="height-request">450</property>
|
<property name="height-request">600</property>
|
||||||
<child>
|
<child>
|
||||||
<object class="AdwToolbarView">
|
<object class="AdwToolbarView">
|
||||||
<child type="top">
|
<child type="top">
|
||||||
@@ -804,8 +873,8 @@
|
|||||||
|
|
||||||
<object class="AdwDialog" id="welcome_dialog">
|
<object class="AdwDialog" id="welcome_dialog">
|
||||||
<property name="can-close">false</property>
|
<property name="can-close">false</property>
|
||||||
<property name="width-request">450</property>
|
<property name="width-request">400</property>
|
||||||
<property name="height-request">450</property>
|
<property name="height-request">600</property>
|
||||||
<child>
|
<child>
|
||||||
<object class="AdwToolbarView">
|
<object class="AdwToolbarView">
|
||||||
<child type="bottom">
|
<child type="bottom">
|
||||||
@@ -884,141 +953,6 @@
|
|||||||
<property name="description" translatable="yes">Alpaca and its developers are not liable for any damages to devices or software resulting from the execution of code generated by an AI model. Please exercise caution and review the code carefully before running it.</property>
|
<property name="description" translatable="yes">Alpaca and its developers are not liable for any damages to devices or software resulting from the execution of code generated by an AI model. Please exercise caution and review the code carefully before running it.</property>
|
||||||
</object>
|
</object>
|
||||||
</child>
|
</child>
|
||||||
<child>
|
|
||||||
<object class="AdwStatusPage">
|
|
||||||
<property name="hexpand">true</property>
|
|
||||||
<property name="vexpand">true</property>
|
|
||||||
<property name="margin-top">12</property>
|
|
||||||
<property name="margin-bottom">12</property>
|
|
||||||
<property name="margin-start">12</property>
|
|
||||||
<property name="margin-end">12</property>
|
|
||||||
<property name="title" translatable="yes">Featured Models</property>
|
|
||||||
<property name="description" translatable="yes">Alpaca works locally on your device, to start chatting you'll need an AI model, you can either pull models from this list or the 'Manage Models' menu later.
|
|
||||||
|
|
||||||
By downloading any model you accept their license agreement available on the model's website.
|
|
||||||
</property>
|
|
||||||
<child>
|
|
||||||
<object class="GtkListBox">
|
|
||||||
<property name="selection-mode">none</property>
|
|
||||||
<style>
|
|
||||||
<class name="boxed-list"/>
|
|
||||||
</style>
|
|
||||||
<child>
|
|
||||||
<object class="AdwActionRow">
|
|
||||||
<property name="title" translatable="no">Llama3</property>
|
|
||||||
<property name="subtitle" translatable="yes">Built by Meta</property>
|
|
||||||
<child type="suffix">
|
|
||||||
<object class="GtkButton">
|
|
||||||
<signal name="clicked" handler="link_button_handler"/>
|
|
||||||
<property name="vexpand">false</property>
|
|
||||||
<property name="icon-name">globe-symbolic</property>
|
|
||||||
<property name="valign">3</property>
|
|
||||||
<property name="name">https://ollama.com/library/llama3</property>
|
|
||||||
<property name="tooltip-text">https://ollama.com/library/llama3</property>
|
|
||||||
</object>
|
|
||||||
</child>
|
|
||||||
<child type="suffix">
|
|
||||||
<object class="GtkButton">
|
|
||||||
<signal name="clicked" handler="pull_featured_model"/>
|
|
||||||
<property name="vexpand">false</property>
|
|
||||||
<property name="icon-name">folder-download-symbolic</property>
|
|
||||||
<property name="valign">3</property>
|
|
||||||
<property name="tooltip-text">Pull 'Llama3 (latest)'</property>
|
|
||||||
<style>
|
|
||||||
<class name="accent"/>
|
|
||||||
</style>
|
|
||||||
</object>
|
|
||||||
</child>
|
|
||||||
</object>
|
|
||||||
</child>
|
|
||||||
<child>
|
|
||||||
<object class="AdwActionRow">
|
|
||||||
<property name="title" translatable="no">Gemma2</property>
|
|
||||||
<property name="subtitle" translatable="yes">Built by Google DeepMind</property>
|
|
||||||
<child type="suffix">
|
|
||||||
<object class="GtkButton">
|
|
||||||
<signal name="clicked" handler="link_button_handler"/>
|
|
||||||
<property name="vexpand">false</property>
|
|
||||||
<property name="icon-name">globe-symbolic</property>
|
|
||||||
<property name="valign">3</property>
|
|
||||||
<property name="name">https://ollama.com/library/gemma2</property>
|
|
||||||
<property name="tooltip-text">https://ollama.com/library/gemma2</property>
|
|
||||||
</object>
|
|
||||||
</child>
|
|
||||||
<child type="suffix">
|
|
||||||
<object class="GtkButton">
|
|
||||||
<signal name="clicked" handler="pull_featured_model"/>
|
|
||||||
<property name="vexpand">false</property>
|
|
||||||
<property name="icon-name">folder-download-symbolic</property>
|
|
||||||
<property name="valign">3</property>
|
|
||||||
<property name="tooltip-text">Pull 'Gemma2 (latest)'</property>
|
|
||||||
<style>
|
|
||||||
<class name="accent"/>
|
|
||||||
</style>
|
|
||||||
</object>
|
|
||||||
</child>
|
|
||||||
</object>
|
|
||||||
</child>
|
|
||||||
<child>
|
|
||||||
<object class="AdwActionRow">
|
|
||||||
<property name="title" translatable="no">Phi3</property>
|
|
||||||
<property name="subtitle" translatable="yes">Built by Microsoft</property>
|
|
||||||
<child type="suffix">
|
|
||||||
<object class="GtkButton">
|
|
||||||
<signal name="clicked" handler="link_button_handler"/>
|
|
||||||
<property name="vexpand">false</property>
|
|
||||||
<property name="icon-name">globe-symbolic</property>
|
|
||||||
<property name="valign">3</property>
|
|
||||||
<property name="name">https://ollama.com/library/phi3</property>
|
|
||||||
<property name="tooltip-text">https://ollama.com/library/phi3</property>
|
|
||||||
</object>
|
|
||||||
</child>
|
|
||||||
<child type="suffix">
|
|
||||||
<object class="GtkButton">
|
|
||||||
<signal name="clicked" handler="pull_featured_model"/>
|
|
||||||
<property name="vexpand">false</property>
|
|
||||||
<property name="icon-name">folder-download-symbolic</property>
|
|
||||||
<property name="valign">3</property>
|
|
||||||
<property name="tooltip-text">Pull 'Phi3 (latest)'</property>
|
|
||||||
<style>
|
|
||||||
<class name="accent"/>
|
|
||||||
</style>
|
|
||||||
</object>
|
|
||||||
</child>
|
|
||||||
</object>
|
|
||||||
</child>
|
|
||||||
<child>
|
|
||||||
<object class="AdwActionRow">
|
|
||||||
<property name="title" translatable="no">Llava</property>
|
|
||||||
<property name="subtitle" translatable="yes">Multimodal AI with image recognition</property>
|
|
||||||
<child type="suffix">
|
|
||||||
<object class="GtkButton">
|
|
||||||
<signal name="clicked" handler="link_button_handler"/>
|
|
||||||
<property name="vexpand">false</property>
|
|
||||||
<property name="icon-name">globe-symbolic</property>
|
|
||||||
<property name="valign">3</property>
|
|
||||||
<property name="name">https://ollama.com/library/llava</property>
|
|
||||||
<property name="tooltip-text">https://ollama.com/library/llava</property>
|
|
||||||
</object>
|
|
||||||
</child>
|
|
||||||
<child type="suffix">
|
|
||||||
<object class="GtkButton">
|
|
||||||
<signal name="clicked" handler="pull_featured_model"/>
|
|
||||||
<property name="vexpand">false</property>
|
|
||||||
<property name="icon-name">folder-download-symbolic</property>
|
|
||||||
<property name="valign">3</property>
|
|
||||||
<property name="tooltip-text">Pull 'Llava (latest)'</property>
|
|
||||||
<style>
|
|
||||||
<class name="accent"/>
|
|
||||||
</style>
|
|
||||||
</object>
|
|
||||||
</child>
|
|
||||||
</object>
|
|
||||||
</child>
|
|
||||||
</object>
|
|
||||||
</child>
|
|
||||||
</object>
|
|
||||||
</child>
|
|
||||||
</object>
|
</object>
|
||||||
</child>
|
</child>
|
||||||
</object>
|
</object>
|
||||||
@@ -1032,6 +966,10 @@ By downloading any model you accept their license agreement available on the mod
|
|||||||
<attribute name="label" translatable="yes">Import Chat</attribute>
|
<attribute name="label" translatable="yes">Import Chat</attribute>
|
||||||
<attribute name="action">app.import_chat</attribute>
|
<attribute name="action">app.import_chat</attribute>
|
||||||
</item>
|
</item>
|
||||||
|
<item>
|
||||||
|
<attribute name="label" translatable="yes">Manage Models</attribute>
|
||||||
|
<attribute name="action">app.manage_models</attribute>
|
||||||
|
</item>
|
||||||
</section>
|
</section>
|
||||||
<section>
|
<section>
|
||||||
<item>
|
<item>
|
||||||
@@ -1049,25 +987,29 @@ By downloading any model you accept their license agreement available on the mod
|
|||||||
</section>
|
</section>
|
||||||
</menu>
|
</menu>
|
||||||
<menu id="secondary_menu">
|
<menu id="secondary_menu">
|
||||||
<item>
|
<section>
|
||||||
<attribute name="label" translatable="yes">Rename Chat</attribute>
|
<item>
|
||||||
<attribute name="action">app.rename_current_chat</attribute>
|
<attribute name="label" translatable="yes">Rename Chat</attribute>
|
||||||
</item>
|
<attribute name="action">app.rename_current_chat</attribute>
|
||||||
<item>
|
</item>
|
||||||
<attribute name="label" translatable="yes">Export Chat</attribute>
|
<item>
|
||||||
<attribute name="action">app.export_current_chat</attribute>
|
<attribute name="label" translatable="yes">Export Chat</attribute>
|
||||||
</item>
|
<attribute name="action">app.export_current_chat</attribute>
|
||||||
<item>
|
</item>
|
||||||
<attribute name="label" translatable="yes">Clear Chat</attribute>
|
<item>
|
||||||
<attribute name="action">app.clear</attribute>
|
<attribute name="label" translatable="yes">Clear Chat</attribute>
|
||||||
</item>
|
<attribute name="action">app.clear</attribute>
|
||||||
</menu>
|
</item>
|
||||||
<menu id="chat_right_click_menu">
|
</section>
|
||||||
<section>
|
<section>
|
||||||
<item>
|
<item>
|
||||||
<attribute name="label" translatable="yes">Delete Chat</attribute>
|
<attribute name="label" translatable="yes">Delete Chat</attribute>
|
||||||
<attribute name="action">app.delete_chat</attribute>
|
<attribute name="action">app.delete_current_chat</attribute>
|
||||||
</item>
|
</item>
|
||||||
|
</section>
|
||||||
|
</menu>
|
||||||
|
<menu id="chat_right_click_menu">
|
||||||
|
<section>
|
||||||
<item>
|
<item>
|
||||||
<attribute name="label" translatable="yes">Rename Chat</attribute>
|
<attribute name="label" translatable="yes">Rename Chat</attribute>
|
||||||
<attribute name="action">app.rename_chat</attribute>
|
<attribute name="action">app.rename_chat</attribute>
|
||||||
@@ -1077,6 +1019,12 @@ By downloading any model you accept their license agreement available on the mod
|
|||||||
<attribute name="action">app.export_chat</attribute>
|
<attribute name="action">app.export_chat</attribute>
|
||||||
</item>
|
</item>
|
||||||
</section>
|
</section>
|
||||||
|
<section>
|
||||||
|
<item>
|
||||||
|
<attribute name="label" translatable="yes">Delete Chat</attribute>
|
||||||
|
<attribute name="action">app.delete_chat</attribute>
|
||||||
|
</item>
|
||||||
|
</section>
|
||||||
</menu>
|
</menu>
|
||||||
<menu id="create_model_menu">
|
<menu id="create_model_menu">
|
||||||
<section>
|
<section>
|
||||||
@@ -1085,9 +1033,13 @@ By downloading any model you accept their license agreement available on the mod
|
|||||||
<attribute name="action">app.create_model_from_existing</attribute>
|
<attribute name="action">app.create_model_from_existing</attribute>
|
||||||
</item>
|
</item>
|
||||||
<item>
|
<item>
|
||||||
<attribute name="label" translatable="yes">From GGUF File (Experimental)</attribute>
|
<attribute name="label" translatable="yes">From GGUF File</attribute>
|
||||||
<attribute name="action">app.create_model_from_file</attribute>
|
<attribute name="action">app.create_model_from_file</attribute>
|
||||||
</item>
|
</item>
|
||||||
|
<item>
|
||||||
|
<attribute name="label" translatable="yes">From Name</attribute>
|
||||||
|
<attribute name="action">app.create_model_from_name</attribute>
|
||||||
|
</item>
|
||||||
</section>
|
</section>
|
||||||
</menu>
|
</menu>
|
||||||
<object class="GtkFileFilter" id="file_filter_attachments">
|
<object class="GtkFileFilter" id="file_filter_attachments">
|
||||||
@@ -1130,7 +1082,7 @@ By downloading any model you accept their license agreement available on the mod
|
|||||||
<property name="title" translatable="yes">General</property>
|
<property name="title" translatable="yes">General</property>
|
||||||
<child>
|
<child>
|
||||||
<object class="GtkShortcutsShortcut">
|
<object class="GtkShortcutsShortcut">
|
||||||
<property name="accelerator"><ctrl>Q</property>
|
<property name="accelerator"><ctrl>W</property>
|
||||||
<property name="title" translatable="yes">Close application</property>
|
<property name="title" translatable="yes">Close application</property>
|
||||||
</object>
|
</object>
|
||||||
</child>
|
</child>
|
||||||
@@ -1148,7 +1100,7 @@ By downloading any model you accept their license agreement available on the mod
|
|||||||
</child>
|
</child>
|
||||||
<child>
|
<child>
|
||||||
<object class="GtkShortcutsShortcut">
|
<object class="GtkShortcutsShortcut">
|
||||||
<property name="accelerator"><ctrl>P</property>
|
<property name="accelerator"><ctrl>comma</property>
|
||||||
<property name="title" translatable="yes">Preferences</property>
|
<property name="title" translatable="yes">Preferences</property>
|
||||||
</object>
|
</object>
|
||||||
</child>
|
</child>
|
||||||
@@ -1164,6 +1116,18 @@ By downloading any model you accept their license agreement available on the mod
|
|||||||
<property name="title" translatable="yes">Show shortcuts window</property>
|
<property name="title" translatable="yes">Show shortcuts window</property>
|
||||||
</object>
|
</object>
|
||||||
</child>
|
</child>
|
||||||
|
<child>
|
||||||
|
<object class="GtkShortcutsShortcut">
|
||||||
|
<property name="accelerator"><ctrl>M</property>
|
||||||
|
<property name="title" translatable="yes">Manage models</property>
|
||||||
|
</object>
|
||||||
|
</child>
|
||||||
|
<child>
|
||||||
|
<object class="GtkShortcutsShortcut">
|
||||||
|
<property name="accelerator">F9</property>
|
||||||
|
<property name="title" translatable="yes">Toggle sidebar</property>
|
||||||
|
</object>
|
||||||
|
</child>
|
||||||
</object>
|
</object>
|
||||||
</child>
|
</child>
|
||||||
<child>
|
<child>
|
||||||
|
|||||||
@@ -1,9 +1,15 @@
|
|||||||
|
"""
|
||||||
|
Moves the descriptions of models to src/available_models_descriptions.py
|
||||||
|
so they can be translated
|
||||||
|
"""
|
||||||
import json
|
import json
|
||||||
with open('src/available_models.json', 'r') as f:
|
|
||||||
data = json.load(f)
|
if __name__ == "__main__":
|
||||||
results = 'descriptions = {\n'
|
with open('src/available_models.json', 'r', encoding="utf-8") as f:
|
||||||
for key, value in data.items():
|
data = json.load(f)
|
||||||
results += f" '{key}': _(\"{value['description']}\"),\n"
|
RESULTS = 'descriptions = {\n'
|
||||||
results += '}'
|
for key, value in data.items():
|
||||||
with open('src/available_models_descriptions.py', 'w+') as f:
|
RESULTS += f" '{key}': _(\"{value['description']}\"),\n"
|
||||||
f.write(results)
|
RESULTS += '}'
|
||||||
|
with open('src/available_models_descriptions.py', 'w+', encoding="utf-8") as f:
|
||||||
|
f.write(RESULTS)
|
||||||
|
|||||||
@@ -15,4 +15,6 @@ msgmerge --no-fuzzy-matching -U po/nb_NO.po po/alpaca.pot
|
|||||||
echo "Updating Bengali"
|
echo "Updating Bengali"
|
||||||
msgmerge --no-fuzzy-matching -U po/bn.po po/alpaca.pot
|
msgmerge --no-fuzzy-matching -U po/bn.po po/alpaca.pot
|
||||||
echo "Updating Simplified Chinese"
|
echo "Updating Simplified Chinese"
|
||||||
msgmerge --no-fuzzy-matching -U po/zh_CN.po po/alpaca.pot
|
msgmerge --no-fuzzy-matching -U po/zh_CN.po po/alpaca.pot
|
||||||
|
echo "Updating Hindi"
|
||||||
|
msgmerge --no-fuzzy-matching -U po/hi.po po/alpaca.pot
|
||||||
|
|||||||
Reference in New Issue
Block a user