feat: add aihorde
Build / Flatpak (x86_64) (push) Has been cancelled
Details
Build / Flatpak (x86_64) (push) Has been cancelled
Details
This commit is contained in:
parent
90ef5a9c14
commit
1f45e14990
|
@ -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 |
|
@ -8,7 +8,7 @@ msgid ""
|
||||||
msgstr ""
|
msgstr ""
|
||||||
"Project-Id-Version: PACKAGE VERSION\n"
|
"Project-Id-Version: PACKAGE VERSION\n"
|
||||||
"Report-Msgid-Bugs-To: \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"
|
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
|
||||||
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
|
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
|
||||||
"Language-Team: LANGUAGE <LL@li.org>\n"
|
"Language-Team: LANGUAGE <LL@li.org>\n"
|
||||||
|
@ -37,11 +37,11 @@ msgid ""
|
||||||
"help/huggingface/)"
|
"help/huggingface/)"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: src/providers/hfbasechat.py:49
|
#: src/providers/hfbasechat.py:50
|
||||||
msgid "Sorry, I don't know what to say!"
|
msgid "Sorry, I don't know what to say!"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: src/providers/hfbasechat.py:57
|
#: src/providers/hfbasechat.py:58
|
||||||
msgid "API Key"
|
msgid "API Key"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
@ -106,7 +106,7 @@ msgid "Cancel"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: src/views/preferences_window.py:78 src/views/window.py:218
|
#: 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"
|
msgid "Delete"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
@ -398,7 +398,7 @@ msgstr ""
|
||||||
msgid "Edit Title"
|
msgid "Edit Title"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: src/widgets/thread_item.blp:61
|
#: src/widgets/thread_item.blp:63
|
||||||
msgid "Star"
|
msgid "Star"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
@ -418,16 +418,16 @@ msgstr ""
|
||||||
msgid "Thread Deleted"
|
msgid "Thread Deleted"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: src/main.py:261
|
#: src/main.py:265
|
||||||
msgid ""
|
msgid ""
|
||||||
"Please download a model from Preferences by clicking on the Dot Menu at the "
|
"Please download a model from Preferences by clicking on the Dot Menu at the "
|
||||||
"top!"
|
"top!"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: src/main.py:265
|
#: src/main.py:269
|
||||||
msgid "Hello, I am Bavarder, a Chit-Chat AI"
|
msgid "Hello, I am Bavarder, a Chit-Chat AI"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: src/main.py:288
|
#: src/main.py:292
|
||||||
msgid "Please enable a provider from the Dot Menu"
|
msgid "Please enable a provider from the Dot Menu"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
|
@ -8,6 +8,7 @@ fa
|
||||||
fi
|
fi
|
||||||
fr
|
fr
|
||||||
gl
|
gl
|
||||||
|
he
|
||||||
hu
|
hu
|
||||||
it
|
it
|
||||||
nl
|
nl
|
||||||
|
@ -21,4 +22,3 @@ tr
|
||||||
uk
|
uk
|
||||||
zh_Hans
|
zh_Hans
|
||||||
zh_Hant
|
zh_Hant
|
||||||
he
|
|
||||||
|
|
|
@ -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="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="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="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="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="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>
|
<file preprocess="xml-stripblanks" alias="terminal-symbolic.svg">../data/icons/hicolor/scalable/actions/terminal-symbolic.svg</file>
|
||||||
|
|
10
src/main.py
10
src/main.py
|
@ -84,7 +84,11 @@ class BavarderApplication(Adw.Application):
|
||||||
|
|
||||||
self.data = {
|
self.data = {
|
||||||
"chats": [],
|
"chats": [],
|
||||||
"providers": {},
|
"providers": {
|
||||||
|
"google-flan-t5-xxl": {"enabled": True, "data": {}},
|
||||||
|
"gpt-2": {"enabled": True, "data": {}},
|
||||||
|
|
||||||
|
},
|
||||||
"models": {}
|
"models": {}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -216,8 +220,8 @@ class BavarderApplication(Adw.Application):
|
||||||
|
|
||||||
def on_preferences_action(self, widget, _):
|
def on_preferences_action(self, widget, _):
|
||||||
"""Callback for the app.preferences action."""
|
"""Callback for the app.preferences action."""
|
||||||
preferences = PreferencesWindow(self.win)
|
self.preferences_window = PreferencesWindow(self.win)
|
||||||
preferences.present()
|
self.preferences_window.present()
|
||||||
|
|
||||||
|
|
||||||
def create_action(self, name, callback, shortcuts=None):
|
def create_action(self, name, callback, shortcuts=None):
|
||||||
|
|
|
@ -9,8 +9,10 @@ from .gpt2 import GPT2Provider
|
||||||
from .openassistantsft1pythia12b import HuggingFaceOpenAssistantSFT1PythiaProvider
|
from .openassistantsft1pythia12b import HuggingFaceOpenAssistantSFT1PythiaProvider
|
||||||
from .robertasquad2 import RobertaSquad2Provider
|
from .robertasquad2 import RobertaSquad2Provider
|
||||||
from .local import LocalProvider
|
from .local import LocalProvider
|
||||||
|
from .aihorde import AIHordeProvider
|
||||||
|
|
||||||
PROVIDERS = {
|
PROVIDERS = {
|
||||||
|
AIHordeProvider,
|
||||||
BlenderBotProvider,
|
BlenderBotProvider,
|
||||||
CatGPTProvider,
|
CatGPTProvider,
|
||||||
DialoGPTProvider,
|
DialoGPTProvider,
|
||||||
|
|
|
@ -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"))
|
|
@ -46,6 +46,7 @@ class BaseHFChatProvider(BaseProvider):
|
||||||
if 'generated_text' in output[0]:
|
if 'generated_text' in output[0]:
|
||||||
return output[0]['generated_text']
|
return output[0]['generated_text']
|
||||||
else:
|
else:
|
||||||
|
print(output)
|
||||||
return _("Sorry, I don't know what to say!")
|
return _("Sorry, I don't know what to say!")
|
||||||
|
|
||||||
def get_settings_rows(self):
|
def get_settings_rows(self):
|
||||||
|
|
|
@ -2,6 +2,7 @@ providers_dir = join_paths(MODULE_DIR, 'providers')
|
||||||
|
|
||||||
providers_sources = [
|
providers_sources = [
|
||||||
'__init__.py',
|
'__init__.py',
|
||||||
|
'aihorde.py',
|
||||||
'base.py',
|
'base.py',
|
||||||
'blenderbot.py',
|
'blenderbot.py',
|
||||||
'catgpt.py',
|
'catgpt.py',
|
||||||
|
|
Loading…
Reference in New Issue