feat: add aihorde
Build / Flatpak (x86_64) (push) Has been cancelled Details

This commit is contained in:
0xMRTT 2023-08-22 17:40:10 +02:00
parent 90ef5a9c14
commit 1f45e14990
9 changed files with 178 additions and 12 deletions

View File

@ -0,0 +1,3 @@
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" version="1.1">
<path style="fill:#dfdfdf" d="M 12.279,3.3705 6,10.561 3.75,8.3105 C 3.2882,7.8608 2.69,7.9405 2.31,8.3105 1.94,8.6905 1.8543,9.2947 2.31,9.7505 L 6.09,13.5 13.779,4.6905 C 14.538,3.8206 13.215,2.2986 12.279,3.3705 Z"/>
</svg>

After

Width:  |  Height:  |  Size: 306 B

View File

@ -8,7 +8,7 @@ msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2023-08-21 12:44+0200\n"
"POT-Creation-Date: 2023-08-22 17:12+0200\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
@ -37,11 +37,11 @@ msgid ""
"help/huggingface/)"
msgstr ""
#: src/providers/hfbasechat.py:49
#: src/providers/hfbasechat.py:50
msgid "Sorry, I don't know what to say!"
msgstr ""
#: src/providers/hfbasechat.py:57
#: src/providers/hfbasechat.py:58
msgid "API Key"
msgstr ""
@ -106,7 +106,7 @@ msgid "Cancel"
msgstr ""
#: src/views/preferences_window.py:78 src/views/window.py:218
#: src/widgets/thread_item.blp:56 src/widgets/thread_item.py:108
#: src/widgets/thread_item.blp:58 src/widgets/thread_item.py:108
msgid "Delete"
msgstr ""
@ -398,7 +398,7 @@ msgstr ""
msgid "Edit Title"
msgstr ""
#: src/widgets/thread_item.blp:61
#: src/widgets/thread_item.blp:63
msgid "Star"
msgstr ""
@ -418,16 +418,16 @@ msgstr ""
msgid "Thread Deleted"
msgstr ""
#: src/main.py:261
#: src/main.py:265
msgid ""
"Please download a model from Preferences by clicking on the Dot Menu at the "
"top!"
msgstr ""
#: src/main.py:265
#: src/main.py:269
msgid "Hello, I am Bavarder, a Chit-Chat AI"
msgstr ""
#: src/main.py:288
#: src/main.py:292
msgid "Please enable a provider from the Dot Menu"
msgstr ""

View File

@ -8,6 +8,7 @@ fa
fi
fr
gl
he
hu
it
nl
@ -21,4 +22,3 @@ tr
uk
zh_Hans
zh_Hant
he

View File

@ -26,6 +26,7 @@
<file preprocess="xml-stripblanks" alias="cloud-filled-symbolic.svg">../data/icons/hicolor/scalable/actions/cloud-filled-symbolic.svg</file>
<file preprocess="xml-stripblanks" alias="document-edit-symbolic.svg">../data/icons/hicolor/scalable/actions/document-edit-symbolic.svg</file>
<file preprocess="xml-stripblanks" alias="go-bottom-symbolic.svg">../data/icons/hicolor/scalable/actions/go-bottom-symbolic.svg</file>
<file preprocess="xml-stripblanks" alias="object-select-symbolic.svg">../data/icons/hicolor/scalable/actions/object-select-symbolic.svg</file>
<file preprocess="xml-stripblanks" alias="paper-plane-symbolic.svg">../data/icons/hicolor/scalable/actions/paper-plane-symbolic.svg</file>
<file preprocess="xml-stripblanks" alias="settings-symbolic.svg">../data/icons/hicolor/scalable/actions/settings-symbolic.svg</file>
<file preprocess="xml-stripblanks" alias="terminal-symbolic.svg">../data/icons/hicolor/scalable/actions/terminal-symbolic.svg</file>

View File

@ -84,7 +84,11 @@ class BavarderApplication(Adw.Application):
self.data = {
"chats": [],
"providers": {},
"providers": {
"google-flan-t5-xxl": {"enabled": True, "data": {}},
"gpt-2": {"enabled": True, "data": {}},
},
"models": {}
}
@ -216,8 +220,8 @@ class BavarderApplication(Adw.Application):
def on_preferences_action(self, widget, _):
"""Callback for the app.preferences action."""
preferences = PreferencesWindow(self.win)
preferences.present()
self.preferences_window = PreferencesWindow(self.win)
self.preferences_window.present()
def create_action(self, name, callback, shortcuts=None):

View File

@ -9,8 +9,10 @@ from .gpt2 import GPT2Provider
from .openassistantsft1pythia12b import HuggingFaceOpenAssistantSFT1PythiaProvider
from .robertasquad2 import RobertaSquad2Provider
from .local import LocalProvider
from .aihorde import AIHordeProvider
PROVIDERS = {
AIHordeProvider,
BlenderBotProvider,
CatGPTProvider,
DialoGPTProvider,

154
src/providers/aihorde.py Normal file
View File

@ -0,0 +1,154 @@
from .base import BaseProvider
import json
import requests
import time
from gi.repository import Adw, Gtk
class AIHordeProvider(BaseProvider):
name = "AI Horde"
ASYNC_URL = "https://stablehorde.net/api/v2/generate/text/async"
STATUS_URL = "https://stablehorde.net/api/v2/generate/text/status/"
API_KEY = "0000000000"
model = "PygmalionAI/pygmalion-7b"
def ask(self, prompt, chat, **kwargs):
self.API_KEY = self.data.get("api_key", "0000000000")
chat = chat["content"]
self.headers = {
"Client-Agent": "bavarder:1:linux",
"apikey": self.API_KEY,
}
data = {
"prompt": prompt,
"models": [
self.model
]
}
r = requests.post(self.ASYNC_URL, json=data, headers=self.headers)
if r.status_code == 202:
rid = r.json()["id"]
else:
print(r.json())
print(r.status_code)
return _("I'm sorry, I don't know what to say!")
# do the request every seconds and check if it's finished
while True:
r = self.check_status(rid)
if r:
return r
else:
time.sleep(1)
return _("I'm sorry, I don't know what to say!")
def check_status(self, rid):
r = requests.get(self.STATUS_URL + rid)
rj = r.json()
if r.status_code == 200:
print(rj)
if rj["done"]:
return r.json()["generations"][0]["text"]
return None
def get_settings_rows(self):
self.rows = []
self.api_row = Adw.PasswordEntryRow()
self.api_row.connect("apply", self.on_apply)
self.api_row.props.text = self.data.get('api_key') or self.API_KEY
self.api_row.props.title = _("API Key")
self.api_row.set_show_apply_button(True)
self.api_row.add_suffix(self.how_to_get_a_token())
self.rows.append(self.api_row)
r = requests.get("https://stablehorde.net/api/v2/status/models?type=text")
if r.status_code != 200:
print(r.json())
return self.rows
else:
rj = r.json()
models_row = Adw.ActionRow()
models_row.set_title(_("Models"))
models_row.set_subtitle(_("Select a model to use"))
go_to_sub_button = Gtk.Button.new_from_icon_name("go-next-symbolic")
go_to_sub_button.set_valign(Gtk.Align.CENTER)
go_to_sub_button.set_tooltip_text(_("Go to the models page"))
go_to_sub_button.add_css_class("flat")
go_to_sub_button.connect("clicked", self.open_subpage)
models_row.add_suffix(go_to_sub_button)
self.page = Adw.NavigationPage()
prefpage = Adw.PreferencesPage()
group = Adw.PreferencesGroup()
self.selected_row = Adw.ActionRow()
self.selected_row.set_title(_("Selected model"))
if self.model:
self.selected_row.set_subtitle(self.model)
else:
self.selected_row.set_subtitle(_("No model selected"))
group.add(self.selected_row)
for model in rj:
mr = Adw.ActionRow()
mr.props.title = model["name"]
mr.props.subtitle = f"Performance {model['performance']} - Jobs {model['jobs']} - Queued {model['queued']}"
apply_button = Gtk.Button.new_from_icon_name("object-select-symbolic")
apply_button.connect("clicked", self.on_apply_model, model["name"])
apply_button.set_valign(Gtk.Align.CENTER)
apply_button.set_tooltip_text(_("Select this model"))
apply_button.add_css_class("flat")
mr.add_suffix(apply_button)
group.add(mr)
toolbar = Adw.ToolbarView()
header = Adw.HeaderBar()
label = Gtk.Label()
label.set_label(_("Models"))
header.set_title_widget(label)
toolbar.add_top_bar(header)
prefpage.add(group)
toolbar.set_content(prefpage)
self.page.set_child(toolbar)
self.rows.append(models_row)
return self.rows
def open_subpage(self, widget):
self.app.preferences_window.push_subpage(self.page)
def on_apply(self, widget):
self.API_KEY = self.api_row.get_text()
self.data["api_key"] = self.API_KEY
def on_apply_model(self, widget, name):
self.model = name
if self.model:
self.selected_row.set_subtitle(self.model)
else:
self.selected_row.set_subtitle(_("No model selected"))

View File

@ -46,6 +46,7 @@ class BaseHFChatProvider(BaseProvider):
if 'generated_text' in output[0]:
return output[0]['generated_text']
else:
print(output)
return _("Sorry, I don't know what to say!")
def get_settings_rows(self):

View File

@ -2,6 +2,7 @@ providers_dir = join_paths(MODULE_DIR, 'providers')
providers_sources = [
'__init__.py',
'aihorde.py',
'base.py',
'blenderbot.py',
'catgpt.py',