10000 Update setting dialog, move replicate api input field to the dialog · DataSolveProblems/pyqt-openai@b51ac94 · GitHub
[go: up one dir, main page]

Skip to content

Commit b51ac94

Browse files
committed
Update setting dialog, move replicate api input field to the dialog
1 parent 88c04d6 commit b51ac94

File tree

15 files changed

+161
-154
lines changed

15 files changed

+161
-154
lines changed

pyproject.toml

Lines changed: 2 additions & 2 deletions
Diff line number
Original file line numberDiff line change
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
44

55
[project]
66
name = "pyqt-openai"
7-
version = "1.3.0"
7+
version = "1.4.0"
88
description = "Python multipurpose chatbot that user can use GPT, other AI models altogether (Release Name: VividNode)"
99
authors = [{ name = "Jung Gyu Yoon", email = "yjg30737@gmail.com" }]
1010
license = { text = "MIT" }
@@ -25,7 +25,7 @@ dependencies = [
2525
"g4f",
2626
"curl_cffi"
2727
]
28-
keywords = ['openai', 'pyqt', 'pyqt5', 'pyqt6', 'pyside6', 'desktop', 'app', 'chatbot', 'gpt', 'replicate', 'gemini', 'claude', 'llama', 'llm']
28+
keywords = ['openai', 'pyqt', 'pyqt5', 'pyqt6', 'pyside6', 'desktop', 'app', 'chatbot', 'gpt', 'replicate', 'gemini', 'claude', 'llama', 'llm', 'gpt4free']
2929

3030
requires-python = ">= 3.11"
3131
# 3.11

pyqt_openai/chat_widget/center/messageTextBrowser.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,7 @@ def adjustBrowserHeight(self):
5151
self.setMinimumHeight(int(max_height))
5252
self.verticalScrollBar().setSliderPosition(self.verticalScrollBar().maximum())
5353

54-
# TODO WILL_BE_IMPLEMENTED AFTER v1.3.0
54+
# TODO WILL_BE_IMPLEMENTED AFTER v1.4.0
5555
def setMarkdown(self, markdown: str) -> None:
5656
super().setMarkdown(markdown)
5757
# Convert markdown to HTML using QTextDocument

pyqt_openai/chat_widget/right_sidebar/apiWidget.py

Lines changed: 14 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
QDialogButtonBox, QWidget, QPushButton
44

55
from pyqt_openai import HOW_TO_GET_OPENAI_API_KEY_URL, HOW_TO_GET_CLAUDE_API_KEY_URL, HOW_TO_GET_GEMINI_API_KEY_URL, \
6-
HOW_TO_GET_LLAMA_API_KEY_URL, DEFAULT_API_CONFIGS
6+
HOW_TO_GET_LLAMA_API_KEY_URL, DEFAULT_API_CONFIGS, HOW_TO_REPLICATE
77
from pyqt_openai.config_loader import CONFIG_MANAGER
88
from pyqt_openai.util.script import set_api_key
99
from pyqt_openai.widgets.linkLabel import LinkLabel
@@ -33,13 +33,21 @@ def __initVal(self):
3333
}
3434
self.__api_keys.append(_conf)
3535

36+
# Add REPLICATE API
37+
self.__api_keys.append({
38+
'display_name': 'Replicate',
39+
'env_var_name': 'REPLICATE_API_TOKEN',
40+
'api_key': CONFIG_MANAGER.get_replicate_property('REPLICATE_API_TOKEN')
41+
})
42+
3643
# Set "get api key" here
3744
for i, obj in enumerate(self.__api_keys):
3845
obj['get_api_key'] = {
3946
'OpenAI': HOW_TO_GET_OPENAI_API_KEY_URL,
4047
'Claude': HOW_TO_GET_CLAUDE_API_KEY_URL,
4148
'Gemini': HOW_TO_GET_GEMINI_API_KEY_URL,
42-
'Llama': HOW_TO_GET_LLAMA_API_KEY_URL
49+
'Llama': HOW_TO_GET_LLAMA_API_KEY_URL,
50+
'Replicate': HOW_TO_REPLICATE
4351
}[obj['display_name']]
4452

4553
def __initUi(self):
@@ -87,5 +95,8 @@ def setApiKeys(self):
8795
api_keys = {self.__api_keys[i]['env_var_name']: self.__tableWidget.cellWidget(i, 1).text() for i in range(self.__tableWidget.rowCount())}
8896
# Save the api keys to the conf file
8997
for k, v in api_keys.items():
90-
CONFIG_MANAGER.set_general_property(k, v)
98+
if k == 'REPLICATE_API_TOKEN':
99+
CONFIG_MANAGER.set_replicate_property(k, v)
100+
else:
101+
CONFIG_MANAGER.set_general_property(k, v)
91102
set_api_key(k, v)

pyqt_openai/chat_widget/right_sidebar/usingAPIPage.py

Lines changed: 26 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,9 +5,9 @@
55
from pyqt_openai import DEFAULT_SHORTCUT_JSON_MODE, OPENAI_TEMPERATURE_RANGE, OPENAI_TEMPERATURE_STEP, \
66
MAX_TOKENS_RANGE, TOP_P_RANGE, TOP_P_STEP, FREQUENCY_PENALTY_RANGE, PRESENCE_PENALTY_STEP, PRESENCE_PENALTY_RANGE, \
77
FREQUENCY_PENALTY_STEP, LLAMAINDEX_URL
8-
from pyqt_openai.chat_widget.right_sidebar.apiWidget import ApiWidget
98
from pyqt_openai.config_loader import CONFIG_MANAGER
109
from pyqt_openai.lang.translations import LangClass
10+
from pyqt_openai.settings_dialog.settingsDialog import SettingsDialog
1111
from pyqt_openai.util.script import getSeparator, get_chat_model, get_openai_chat_model, init_llama
1212
from pyqt_openai.widgets.linkLabel import LinkLabel
1313

@@ -75,7 +75,30 @@ def __initUi(self):
7575
lay.addWidget(modelCmbBox)
7676
lay.setContentsMargins(0, 0, 0, 0)
7777

78-
apiWidget = ApiWidget()
78+
# TODO LANGUAGE
79+
setApiBtn = QPushButton('Set API Key')
80+
setApiBtn.clicked.connect(lambda _: SettingsDialog(default_index=1, parent=self).exec_())
81+
setApiBtn.setStyleSheet('''
82+
QPushButton {
83+
background-color: #007BFF;
84+
color: white;
85+
border-radius: 8px;
86+
padding: 10px 20px;
87+
font-size: 16px;
88+
font-family: "Arial";
89+
font-weight: bold;
90+
border: 2px solid #007BFF;
91+
}
92+
QPushButton:hover {
93+
background-color: #0056b3;
94+
border-color: #0056b3;
95+
}
96+
QPushButton:pressed {
97+
background-color: #003f7f;
98+
border-color: #003f7f;
99+
}
100+
'''
101+
)
79102

80103
selectModelWidget = QWidget()
81104
selectModelWidget.setLayout(lay)
@@ -192,7 +215,7 @@ def __initUi(self):
192215
lay.addWidget(self.__systemTextEdit)
193216
lay.addWidget(saveSystemBtn)
194217
lay.addWidget(getSeparator('horizontal'))
195-
lay.addWidget(apiWidget)
218+
lay.addWidget(setApiBtn)
196219
lay.addWidget(selectModelWidget)
197220
lay.addWidget(self.__warningLbl)
198221
lay.addWidget(streamChkBox)

pyqt_openai/globals.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
from pyqt_openai import DEFAULT_GEMINI_MODEL, LLAMA_REQUEST_URL
1111
from pyqt_openai.sqlite import SqliteDatabase
1212
from pyqt_openai.util.llamapage_script import GPTLLamaIndexWrapper
13+
from pyqt_openai.util.replicate_script import ReplicateWrapper
1314

1415
DB = SqliteDatabase()
1516

@@ -25,4 +26,4 @@
2526
base_url=LLAMA_REQUEST_URL
2627
)
2728

28-
29+
REPLICATE_CLIENT = ReplicateWrapper(api_key='')

pyqt_openai/mainWindow.py

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
from PySide6.QtGui import QAction, QIcon
55
from PySide6.QtWidgets import QMainWindow, QToolBar, QHBoxLayout, QDialog, QWidgetAction, QSpinBox, \
66
QWidget, QApplication, \
7-
QComboBox, QSizePolicy, QStackedWidget, QMenu, QSystemTrayIcon, \
7+
QSizePolicy, QStackedWidget, QMenu, QSystemTrayIcon, \
88
QMessageBox
99

1010
from pyqt_openai import DEFAULT_SHORTCUT_FULL_SCREEN, \
@@ -27,7 +27,6 @@
2727
from pyqt_openai.updateSoftwareDialog import update_software
2828
from pyqt_openai.util.script import restart_app, show_message_box_after_change_to_restart, set_auto_start_windows, \
2929
set_api_key, init_llama
30-
from pyqt_openai.widgets.button import Button
3130
from pyqt_openai.widgets.navWidget import NavBar
3231

3332

@@ -139,8 +138,10 @@ def __setActions(self):
139138
self.__navBar.add('DALL-E')
140139
self.__navBar.add('Replicate')
141140
self.__navBar.setSizePolicy(QSizePolicy.Policy.MinimumExpanding, QSizePolicy.Policy.Preferred)
142-
self.__navBar.item_clicked.connect(self.__aiTypeChanged)
143-
self.__navBar.set_active_button(0)
141+
self.__navBar.itemClicked.connect(self.__aiTypeChanged)
142+
143+
# Chat is the default widget
144+
self.__navBar.setActiveButton(0)
144145

145146
# toolbar action
146147
self.__chooseAiAction = QWidgetAction(self)
@@ -279,6 +280,7 @@ def __loadApiKeyInConf(self):
279280
set_api_key('GEMINI_API_KEY', CONFIG_MANAGER.get_general_property('GEMINI_API_KEY'))
280281
set_api_key('CLAUDE_API_KEY', CONFIG_MANAGER.get_general_property('CLAUDE_API_KEY'))
281282
set_api_key('LLAMA_API_KEY', CONFIG_MANAGER.get_general_property('LLAMA_API_KEY'))
283+
set_api_key('REPLICATE_API_TOKEN', CONFIG_MANAGER.get_replicate_property('REPLICATE_API_TOKEN'))
282284

283285
# Set llama index directory if it exists
284286
init_llama()
@@ -321,7 +323,7 @@ def __executeCustomizeDialog(self):
321323

322324
def __aiTypeChanged(self, i):
323325
self.__mainWidget.setCurrentIndex(i)
324-
self.__navBar.set_active_button(i)
326+
self.__navBar.setActiveButton(i)
325327
widget = self.__mainWidget.currentWidget()
326328
widget.showSecondaryToolBar(self.__settingsParamContainer.show_secondary_toolbar)
327329

pyqt_openai/openaiApiWidget.py

Lines changed: 0 additions & 73 deletions
This file was deleted.

pyqt_openai/replicate_widget/replicateRightSideBar.py

Lines changed: 30 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,12 @@
11
from PySide6.QtCore import Qt
2-
from PySide6.QtWidgets import QLineEdit, QWidget, QSpinBox, QVBoxLayout, \
2+
from PySide6.QtWidgets import QWidget, QSpinBox, QVBoxLayout, \
33
QPlainTextEdit, \
4-
QFormLayout, QLabel, QSplitter
4+
QFormLayout, QLabel, QSplitter, QPushButton
55

66
from pyqt_openai.config_loader import CONFIG_MANAGER
77
from pyqt_openai.lang.translations import LangClass
88
from pyqt_openai.replicate_widget.replicateThread import ReplicateThread
9-
from pyqt_openai.util.replicate_script import ReplicateWrapper
9+
from pyqt_openai.settings_dialog.settingsDialog import SettingsDialog
1010
from pyqt_openai.widgets.imageControlWidget import ImageControlWidget
1111

1212

@@ -26,22 +26,38 @@ def _initVal(self):
2626
self._directory = CONFIG_MANAGER.get_replicate_property('directory')
2727
self._number_of_images_to_create = CONFIG_MANAGER.get_replicate_property('number_of_images_to_create')
2828

29-
self.__api_key = CONFIG_MANAGER.get_replicate_property('REPLICATE_API_TOKEN')
3029
self.__model = CONFIG_MANAGER.get_replicate_property('model')
3130
self.__width = CONFIG_MANAGER.get_replicate_property('width')
3231
self.__height = CONFIG_MANAGER.get_replicate_property('height')
3332
self.__negative_prompt = CONFIG_MANAGER.get_replicate_property('negative_prompt')
3433

35-
self.__wrapper = ReplicateWrapper(self.__api_key.strip() if self.__api_key else '')
36-
3734
def _initUi(self):
3835
super()._initUi()
3936

40-
self.__apiKeyLineEdit = QLineEdit()
41-
self.__apiKeyLineEdit.setPlaceholderText(LangClass.TRANSLATIONS['Enter Replicate API Key...'])
42-
self.__apiKeyLineEdit.setText(self.__api_key)
43-
self.__apiKeyLineEdit.setEchoMode(QLineEdit.EchoMode.Password)
44-
self.__apiKeyLineEdit.textChanged.connect(self.__replicateChanged)
37+
# TODO LANGUAGE
38+
self.__setApiBtn = QPushButton('Set API Key')
39+
self.__setApiBtn.clicked.connect(lambda _: SettingsDialog(default_index=1, parent=self).exec_())
40+
self.__setApiBtn.setStyleSheet('''
41+
QPushButton {
42+
background-color: #007BFF;
43+
color: white;
44+
border-radius: 8px;
45+
padding: 10px 20px;
46+
font-size: 16px;
47+
font-family: "Arial";
48+
font-weight: bold;
49+
border: 2px solid #007BFF;
50+
}
51+
QPushButton:hover {
52+
background-color: #0056b3;
53+
border-color: #0056b3;
54+
}
55+
QPushButton:pressed {
56+
background-color: #003f7f;
57+
border-color: #003f7f;
58+
}
59+
'''
60+
)
4561

4662
self.__modelTextEdit = QPlainTextEdit()
4763
self.__modelTextEdit.setPlainText(self.__model)
@@ -60,7 +76,7 @@ def _initUi(self):
6076
self.__heightSpinBox.valueChanged.connect(self.__replicateChanged)
6177

6278
lay = QVBoxLayout()
63-
lay.addWidget(self.__apiKeyLineEdit)
79+
lay.addWidget(self.__setApiBtn)
6480
lay.addWidget(self._findPathWidget)
6581
lay.addWidget(self._saveChkBox)
6682
lay.addWidget(self._continueGenerationChkBox)
@@ -110,12 +126,7 @@ def _initUi(self):
110126

111127
def __replicateChanged(self, v):
112128
sender = self.sender()
113-
if sender == self.__apiKeyLineEdit:
114-
v = v.strip() if v else ''
115-
self.__api_key = v
116-
CONFIG_MANAGER.set_replicate_property('REPLICATE_API_TOKEN', v)
117-
self.__wrapper.set_api(v)
118-
elif sender == self.__widthSpinBox:
129+
if sender == self.__widthSpinBox:
119130
self.__width = v
120131
CONFIG_MANAGER.set_replicate_property('width', v)
121132
elif sender == self.__heightSpinBox:
@@ -160,10 +171,7 @@ def _submit(self):
160171
number_of_images = self._number_of_images_to_create if self._continue_generation else 1
161172
random_prompt = self._randomImagePromptGeneratorWidget.getRandomPromptSourceArr()
162173

163-
self.__api_key = self.__apiKeyLineEdit.text().strip()
164-
self.__wrapper.set_api(self.__api_key)
165-
166-
t = ReplicateThread(arg, number_of_images, self.__wrapper, self.__model, random_prompt)
174+
t = ReplicateThread(arg, number_of_images, self.__model, random_prompt)
167175
self._setThread(t)
168176
super()._submit()
169177

pyqt_openai/replicate_widget/replicateThread.py

Lines changed: 4 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
from PySide6.QtCore import QThread, Signal
22

3+
from pyqt_openai.globals import REPLICATE_CLIENT
34
from pyqt_openai.models import ImagePromptContainer
45
from pyqt_openai.util.script import generate_random_prompt
56

@@ -10,17 +11,14 @@ class ReplicateThread(QThread):
1011
allReplyGenerated = Signal()
1112

1213
# TODO remove wrapper, model as far as possible
13-
def __init__(self, input_args, number_of_images, wrapper, model, randomizing_prompt_source_arr=None):
14+
def __init__(self, input_args, number_of_images, model, randomizing_prompt_source_arr=None):
1415
super().__init__()
1516
self.__input_args = input_args
1617
self.__stop = False
1718

18-
if randomizing_prompt_source_arr is not None:
19-
self.__randomizing_prompt_source_arr = randomizing_prompt_source_arr
19+
self.__randomizing_prompt_source_arr = randomizing_prompt_source_arr
2020

2121
self.__number_of_images = number_of_images
22-
23-
self.__wrapper = wrapper
2422
self.__model = model
2523

2624
def stop(self):
@@ -33,7 +31,7 @@ def run(self):
3331
break
3432
if self.__randomizing_prompt_source_arr is not None:
3533
self.__input_args['prompt'] = generate_random_prompt(self.__randomizing_prompt_source_arr)
36-
result = self.__wrapper.get_image_response(model=self.__model, input_args=self.__input_args)
34+
result = REPLICATE_CLIENT.get_image_response(model=self.__model, input_args=self.__input_args)
3735
self.replyGenerated.emit(result)
3836
self.allReplyGenerated.emit()
3937
except Exception as e:

pyqt_openai/settings_dialog/markdownSettingsWidget.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
# TODO WILL_BE_IMPLEMENTED AFTER v1.3.0
1+
# TODO WILL_BE_IMPLEMENTED AFTER v1.4.0
22

33
# from PySide6.QtWidgets import (QWidget, QVBoxLayout, QCheckBox, QLabel, QComboBox,
44
# QPushButton, QColorDialog, QFormLayout, QScrollArea)

0 commit comments

Comments
 (0)
0