From 41c67cf06990673924377dce0315d709eded4413 Mon Sep 17 00:00:00 2001 From: Jung Gyu Yoon Date: Thu, 14 Nov 2024 16:12:41 +0900 Subject: [PATCH 1/4] Fix bugs related to LlamaIndex, refactoring --- pyqt_openai/chat_widget/center/aiChatUnit.py | 2 +- pyqt_openai/chat_widget/center/chatBrowser.py | 2 +- pyqt_openai/chat_widget/center/chatWidget.py | 9 +- pyqt_openai/chat_widget/center/prompt.py | 2 +- .../chat_widget/center/responseInfoDialog.py | 2 +- pyqt_openai/chat_widget/chatMainWidget.py | 2 +- .../left_sidebar/chatImportDialog.py | 2 +- ...amaOpenAIThread.py => llamaIndexThread.py} | 11 +- .../chat_widget/prompt_gen_widget/formPage.py | 2 +- .../promptEntryDirectInputDialog.py | 2 +- .../promptGroupDirectInputDialog.py | 2 +- .../promptGroupExportDialog.py | 2 +- .../promptGroupImportDialog.py | 2 +- .../prompt_gen_widget/sentencePage.py | 2 +- .../right_sidebar/llama_widget/listWidget.py | 2 +- .../right_sidebar/modelSearchBar.py | 2 +- .../chat_widget/right_sidebar/usingAPIPage.py | 2 +- .../chat_widget/right_sidebar/usingG4FPage.py | 2 +- pyqt_openai/customizeDialog.py | 2 +- pyqt_openai/dalle_widget/dalleThread.py | 2 +- pyqt_openai/doNotAskAgainDialog.py | 2 +- .../g4f_image_widget/g4fImageRightSideBar.py | 2 +- .../g4f_image_widget/g4fImageThread.py | 4 +- pyqt_openai/globals.py | 6 +- pyqt_openai/main.py | 2 +- pyqt_openai/mainWindow.py | 2 +- .../replicate_widget/replicateMainWidget.py | 2 +- .../replicate_widget/replicateThread.py | 2 +- pyqt_openai/settings_dialog/apiWidget.py | 2 +- pyqt_openai/util/{script.py => common.py} | 154 +++++++----------- .../{llamapage_script.py => llamaindex.py} | 2 +- .../{replicate_script.py => replicate.py} | 0 pyqt_openai/widgets/imageControlWidget.py | 2 +- pyqt_openai/widgets/imageMainWidget.py | 2 +- pyqt_openai/widgets/inputDialog.py | 2 +- 35 files changed, 104 insertions(+), 138 deletions(-) rename pyqt_openai/chat_widget/{llamaOpenAIThread.py => llamaIndexThread.py} (81%) rename pyqt_openai/util/{script.py => common.py} (96%) rename pyqt_openai/util/{llamapage_script.py => llamaindex.py} (98%) rename pyqt_openai/util/{replicate_script.py => replicate.py} (100%) diff --git a/pyqt_openai/chat_widget/center/aiChatUnit.py b/pyqt_openai/chat_widget/center/aiChatUnit.py index 3bb2c58..8c65bc2 100644 --- a/pyqt_openai/chat_widget/center/aiChatUnit.py +++ b/pyqt_openai/chat_widget/center/aiChatUnit.py @@ -14,7 +14,7 @@ from pyqt_openai.chat_widget.center.responseInfoDialog import ResponseInfoDialog from pyqt_openai.models import ChatMessageContainer from pyqt_openai.globals import DB -from pyqt_openai.util.script import stream_to_speakers +from pyqt_openai.util.common import stream_to_speakers from pyqt_openai.widgets.button import Button from pyqt_openai.widgets.fileTableDialog import FileTableDialog diff --git a/pyqt_openai/chat_widget/center/chatBrowser.py b/pyqt_openai/chat_widget/center/chatBrowser.py index e5d71d9..4343298 100644 --- a/pyqt_openai/chat_widget/center/chatBrowser.py +++ b/pyqt_openai/chat_widget/center/chatBrowser.py @@ -14,7 +14,7 @@ from pyqt_openai.chat_widget.center.userChatUnit import UserChatUnit from pyqt_openai.models import ChatMessageContainer from pyqt_openai.globals import DB -from pyqt_openai.util.script import is_valid_regex +from pyqt_openai.util.common import is_valid_regex class ChatBrowser(QScrollArea): diff --git a/pyqt_openai/chat_widget/center/chatWidget.py b/pyqt_openai/chat_widget/center/chatWidget.py index e95585e..ef7dfe1 100644 --- a/pyqt_openai/chat_widget/center/chatWidget.py +++ b/pyqt_openai/chat_widget/center/chatWidget.py @@ -15,10 +15,10 @@ from pyqt_openai.chat_widget.center.chatHome import ChatHome from pyqt_openai.chat_widget.center.menuWidget import MenuWidget from pyqt_openai.chat_widget.center.prompt import Prompt -from pyqt_openai.chat_widget.llamaOpenAIThread import LlamaOpenAIThread +from pyqt_openai.chat_widget.llamaIndexThread import LlamaIndexThread from pyqt_openai.config_loader import CONFIG_MANAGER from pyqt_openai.globals import LLAMAINDEX_WRAPPER, DB -from pyqt_openai.util.script import get_argument, ChatThread +from pyqt_openai.util.common import get_argument, ChatThread from pyqt_openai.lang.translations import LangClass from pyqt_openai.models import ChatMessageContainer from pyqt_openai.widgets.notifier import NotifierWidget @@ -261,10 +261,9 @@ def __chat(self): query_text = self.__prompt.getContent() self.__browser.showLabel(query_text, False, container) - # Get parameters for OpenAI + # Run a different thread based on whether the llama-index is enabled or not. if is_llama_available: - # Run a different thread based on whether the llama-index is enabled or not. - self.__t = LlamaOpenAIThread( + self.__t = LlamaIndexThread( param, container, LLAMAINDEX_WRAPPER, query_text ) else: diff --git a/pyqt_openai/chat_widget/center/prompt.py b/pyqt_openai/chat_widget/center/prompt.py index f6ccd7d..e87d1fb 100644 --- a/pyqt_openai/chat_widget/center/prompt.py +++ b/pyqt_openai/chat_widget/center/prompt.py @@ -41,7 +41,7 @@ UploadedImageFileWidget, ) from pyqt_openai.lang.translations import LangClass -from pyqt_openai.util.script import ( +from pyqt_openai.util.common import ( get_content_of_text_file_for_send, RecorderThread, STTThread, diff --git a/pyqt_openai/chat_widget/center/responseInfoDialog.py b/pyqt_openai/chat_widget/center/responseInfoDialog.py index f1fc469..2d4f924 100644 --- a/pyqt_openai/chat_widget/center/responseInfoDialog.py +++ b/pyqt_openai/chat_widget/center/responseInfoDialog.py @@ -3,7 +3,7 @@ from pyqt_openai.lang.translations import LangClass from pyqt_openai.models import ChatMessageContainer -from pyqt_openai.util.script import getSeparator +from pyqt_openai.util.common import getSeparator class ResponseInfoDialog(QDialog): diff --git a/pyqt_openai/chat_widget/chatMainWidget.py b/pyqt_openai/chat_widget/chatMainWidget.py index 854d6ab..a4b3f22 100644 --- a/pyqt_openai/chat_widget/chatMainWidget.py +++ b/pyqt_openai/chat_widget/chatMainWidget.py @@ -43,7 +43,7 @@ CustomizeParamsContainer, ) from pyqt_openai.globals import DB, LLAMAINDEX_WRAPPER -from pyqt_openai.util.script import ( +from pyqt_openai.util.common import ( open_directory, get_generic_ext_out_of_qt_ext, message_list_to_txt, diff --git a/pyqt_openai/chat_widget/left_sidebar/chatImportDialog.py b/pyqt_openai/chat_widget/left_sidebar/chatImportDialog.py index d06703e..24d088e 100644 --- a/pyqt_openai/chat_widget/left_sidebar/chatImportDialog.py +++ b/pyqt_openai/chat_widget/left_sidebar/chatImportDialog.py @@ -21,7 +21,7 @@ HOW_TO_EXPORT_CHATGPT_CONVERSATION_HISTORY_URL, ) from pyqt_openai.lang.translations import LangClass -from pyqt_openai.util.script import ( +from pyqt_openai.util.common import ( get_chatgpt_data_for_import, get_chatgpt_data_for_preview, ) diff --git a/pyqt_openai/chat_widget/llamaOpenAIThread.py b/pyqt_openai/chat_widget/llamaIndexThread.py similarity index 81% rename from pyqt_openai/chat_widget/llamaOpenAIThread.py rename to pyqt_openai/chat_widget/llamaIndexThread.py index 0717ad2..fa57fcb 100644 --- a/pyqt_openai/chat_widget/llamaOpenAIThread.py +++ b/pyqt_openai/chat_widget/llamaIndexThread.py @@ -5,7 +5,7 @@ # Should combine with ChatThread -class LlamaOpenAIThread(QThread): +class LlamaIndexThread(QThread): replyGenerated = Signal(str, bool, ChatMessageContainer) streamFinished = Signal(ChatMessageContainer) @@ -37,6 +37,15 @@ def run(self): self.replyGenerated.emit(chunk, True, self.__info) else: self.__info.content = resp.response + # self.__info.prompt_tokens = "" + # self.__info.completion_tokens = "" + # self.__info.total_tokens = "" + + self.__info.finish_reason = "stop" + + if self.__input_args["stream"]: + self.streamFinished.emit(self.__info) + else: self.replyGenerated.emit(self.__info.content, False, self.__info) except Exception as e: self.__info.finish_reason = "Error" diff --git a/pyqt_openai/chat_widget/prompt_gen_widget/formPage.py b/pyqt_openai/chat_widget/prompt_gen_widget/formPage.py index 3bcc7bb..5d832f5 100644 --- a/pyqt_openai/chat_widget/prompt_gen_widget/formPage.py +++ b/pyqt_openai/chat_widget/prompt_gen_widget/formPage.py @@ -44,7 +44,7 @@ ) from pyqt_openai.lang.translations import LangClass from pyqt_openai.globals import DB -from pyqt_openai.util.script import open_directory, get_prompt_data +from pyqt_openai.util.common import open_directory, get_prompt_data from pyqt_openai.widgets.button import Button diff --git a/pyqt_openai/chat_widget/prompt_gen_widget/promptEntryDirectInputDialog.py b/pyqt_openai/chat_widget/prompt_gen_widget/promptEntryDirectInputDialog.py index 9923f86..cf8e1d6 100644 --- a/pyqt_openai/chat_widget/prompt_gen_widget/promptEntryDirectInputDialog.py +++ b/pyqt_openai/chat_widget/prompt_gen_widget/promptEntryDirectInputDialog.py @@ -11,7 +11,7 @@ ) from pyqt_openai.lang.translations import LangClass -from pyqt_openai.util.script import is_prompt_entry_name_valid, getSeparator +from pyqt_openai.util.common import is_prompt_entry_name_valid, getSeparator class PromptEntryDirectInputDialog(QDialog): diff --git a/pyqt_openai/chat_widget/prompt_gen_widget/promptGroupDirectInputDialog.py b/pyqt_openai/chat_widget/prompt_gen_widget/promptGroupDirectInputDialog.py index e8cbef1..5fbd049 100644 --- a/pyqt_openai/chat_widget/prompt_gen_widget/promptGroupDirectInputDialog.py +++ b/pyqt_openai/chat_widget/prompt_gen_widget/promptGroupDirectInputDialog.py @@ -10,7 +10,7 @@ ) from pyqt_openai.lang.translations import LangClass -from pyqt_openai.util.script import is_prompt_group_name_valid, getSeparator +from pyqt_openai.util.common import is_prompt_group_name_valid, getSeparator class PromptGroupDirectInputDialog(QDialog): diff --git a/pyqt_openai/chat_widget/prompt_gen_widget/promptGroupExportDialog.py b/pyqt_openai/chat_widget/prompt_gen_widget/promptGroupExportDialog.py index a782ed0..959f88c 100644 --- a/pyqt_openai/chat_widget/prompt_gen_widget/promptGroupExportDialog.py +++ b/pyqt_openai/chat_widget/prompt_gen_widget/promptGroupExportDialog.py @@ -10,7 +10,7 @@ from pyqt_openai import SENTENCE_PROMPT_GROUP_SAMPLE, FORM_PROMPT_GROUP_SAMPLE from pyqt_openai.lang.translations import LangClass -from pyqt_openai.util.script import showJsonSample +from pyqt_openai.util.common import showJsonSample from pyqt_openai.widgets.checkBoxListWidget import CheckBoxListWidget from pyqt_openai.widgets.jsonEditor import JSONEditor diff --git a/pyqt_openai/chat_widget/prompt_gen_widget/promptGroupImportDialog.py b/pyqt_openai/chat_widget/prompt_gen_widget/promptGroupImportDialog.py index 751e16f..1df5d0f 100644 --- a/pyqt_openai/chat_widget/prompt_gen_widget/promptGroupImportDialog.py +++ b/pyqt_openai/chat_widget/prompt_gen_widget/promptGroupImportDialog.py @@ -22,7 +22,7 @@ FORM_PROMPT_GROUP_SAMPLE, ) from pyqt_openai.lang.translations import LangClass -from pyqt_openai.util.script import ( +from pyqt_openai.util.common import ( validate_prompt_group_json, is_prompt_group_name_valid, showJsonSample, diff --git a/pyqt_openai/chat_widget/prompt_gen_widget/sentencePage.py b/pyqt_openai/chat_widget/prompt_gen_widget/sentencePage.py index c0e45d2..b14edb8 100644 --- a/pyqt_openai/chat_widget/prompt_gen_widget/sentencePage.py +++ b/pyqt_openai/chat_widget/prompt_gen_widget/sentencePage.py @@ -44,7 +44,7 @@ ) from pyqt_openai.lang.translations import LangClass from pyqt_openai.globals import DB -from pyqt_openai.util.script import open_directory, get_prompt_data +from pyqt_openai.util.common import open_directory, get_prompt_data from pyqt_openai.widgets.button import Button diff --git a/pyqt_openai/chat_widget/right_sidebar/llama_widget/listWidget.py b/pyqt_openai/chat_widget/right_sidebar/llama_widget/listWidget.py index 0834e2d..ebf7cd3 100644 --- a/pyqt_openai/chat_widget/right_sidebar/llama_widget/listWidget.py +++ b/pyqt_openai/chat_widget/right_sidebar/llama_widget/listWidget.py @@ -15,7 +15,7 @@ from pyqt_openai import TEXT_FILE_EXT_LIST, QFILEDIALOG_DEFAULT_DIRECTORY from pyqt_openai.lang.translations import LangClass -from pyqt_openai.util.script import getSeparator +from pyqt_openai.util.common import getSeparator class FileListWidget(QWidget): diff --git a/pyqt_openai/chat_widget/right_sidebar/modelSearchBar.py b/pyqt_openai/chat_widget/right_sidebar/modelSearchBar.py index b2255f9..266b933 100644 --- a/pyqt_openai/chat_widget/right_sidebar/modelSearchBar.py +++ b/pyqt_openai/chat_widget/right_sidebar/modelSearchBar.py @@ -1,7 +1,7 @@ from PySide6.QtCore import Qt from PySide6.QtWidgets import QLineEdit, QCompleter -from pyqt_openai.util.script import get_chat_model +from pyqt_openai.util.common import get_chat_model class ModelSearchBar(QLineEdit): diff --git a/pyqt_openai/chat_widget/right_sidebar/usingAPIPage.py b/pyqt_openai/chat_widget/right_sidebar/usingAPIPage.py index 99f95df..3616364 100644 --- a/pyqt_openai/chat_widget/right_sidebar/usingAPIPage.py +++ b/pyqt_openai/chat_widget/right_sidebar/usingAPIPage.py @@ -35,7 +35,7 @@ from pyqt_openai.chat_widget.right_sidebar.modelSearchBar import ModelSearchBar from pyqt_openai.config_loader import CONFIG_MANAGER from pyqt_openai.lang.translations import LangClass -from pyqt_openai.util.script import ( +from pyqt_openai.util.common import ( getSeparator, init_llama, ) diff --git a/pyqt_openai/chat_widget/right_sidebar/usingG4FPage.py b/pyqt_openai/chat_widget/right_sidebar/usingG4FPage.py index 1accf75..d57c321 100644 --- a/pyqt_openai/chat_widget/right_sidebar/usingG4FPage.py +++ b/pyqt_openai/chat_widget/right_sidebar/usingG4FPage.py @@ -11,7 +11,7 @@ from pyqt_openai import G4F_PROVIDER_DEFAULT from pyqt_openai.config_loader import CONFIG_MANAGER from pyqt_openai.lang.translations import LangClass -from pyqt_openai.util.script import ( +from pyqt_openai.util.common import ( get_g4f_providers, get_g4f_models_by_provider, get_chat_model, diff --git a/pyqt_openai/customizeDialog.py b/pyqt_openai/customizeDialog.py index 0c68f14..19da8c4 100644 --- a/pyqt_openai/customizeDialog.py +++ b/pyqt_openai/customizeDialog.py @@ -15,7 +15,7 @@ from pyqt_openai.fontWidget import FontWidget from pyqt_openai.lang.translations import LangClass from pyqt_openai.models import CustomizeParamsContainer -from pyqt_openai.util.script import getSeparator +from pyqt_openai.util.common import getSeparator from pyqt_openai.widgets.circleProfileImage import RoundedImage from pyqt_openai.widgets.findPathWidget import FindPathWidget from pyqt_openai.widgets.normalImageView import NormalImageView diff --git a/pyqt_openai/dalle_widget/dalleThread.py b/pyqt_openai/dalle_widget/dalleThread.py index 5a75474..75b9dbf 100644 --- a/pyqt_openai/dalle_widget/dalleThread.py +++ b/pyqt_openai/dalle_widget/dalleThread.py @@ -4,7 +4,7 @@ from pyqt_openai.models import ImagePromptContainer from pyqt_openai.globals import OPENAI_CLIENT -from pyqt_openai.util.script import generate_random_prompt +from pyqt_openai.util.common import generate_random_prompt class DallEThread(QThread): diff --git a/pyqt_openai/doNotAskAgainDialog.py b/pyqt_openai/doNotAskAgainDialog.py index 80d9761..480967c 100644 --- a/pyqt_openai/doNotAskAgainDialog.py +++ b/pyqt_openai/doNotAskAgainDialog.py @@ -12,7 +12,7 @@ ) from pyqt_openai.lang.translations import LangClass -from pyqt_openai.util.script import getSeparator +from pyqt_openai.util.common import getSeparator class DoNotAskAgainDialog(QDialog): diff --git a/pyqt_openai/g4f_image_widget/g4fImageRightSideBar.py b/pyqt_openai/g4f_image_widget/g4fImageRightSideBar.py index 1981a0b..9eed38c 100644 --- a/pyqt_openai/g4f_image_widget/g4fImageRightSideBar.py +++ b/pyqt_openai/g4f_image_widget/g4fImageRightSideBar.py @@ -12,7 +12,7 @@ from pyqt_openai.config_loader import CONFIG_MANAGER from pyqt_openai.g4f_image_widget.g4fImageThread import G4FImageThread from pyqt_openai.lang.translations import LangClass -from pyqt_openai.util.script import ( +from pyqt_openai.util.common import ( get_g4f_image_providers, get_g4f_image_models_from_provider, get_g4f_image_models, diff --git a/pyqt_openai/g4f_image_widget/g4fImageThread.py b/pyqt_openai/g4f_image_widget/g4fImageThread.py index 01fcd3d..ecb8a98 100644 --- a/pyqt_openai/g4f_image_widget/g4fImageThread.py +++ b/pyqt_openai/g4f_image_widget/g4fImageThread.py @@ -3,8 +3,8 @@ from pyqt_openai import G4F_PROVIDER_DEFAULT from pyqt_openai.globals import G4F_CLIENT from pyqt_openai.models import ImagePromptContainer -from pyqt_openai.util.replicate_script import download_image_as_base64 -from pyqt_openai.util.script import generate_random_prompt, convert_to_provider +from pyqt_openai.util.replicate import download_image_as_base64 +from pyqt_openai.util.common import generate_random_prompt, convert_to_provider class G4FImageThread(QThread): diff --git a/pyqt_openai/globals.py b/pyqt_openai/globals.py index e5f9704..5cfe507 100644 --- a/pyqt_openai/globals.py +++ b/pyqt_openai/globals.py @@ -6,12 +6,12 @@ from openai import OpenAI from pyqt_openai.sqlite import SqliteDatabase -from pyqt_openai.util.llamapage_script import GPTLLamaIndexWrapper -from pyqt_openai.util.replicate_script import ReplicateWrapper +from pyqt_openai.util.llamaindex import LlamaIndexWrapper +from pyqt_openai.util.replicate import ReplicateWrapper DB = SqliteDatabase() -LLAMAINDEX_WRAPPER = GPTLLamaIndexWrapper() +LLAMAINDEX_WRAPPER = LlamaIndexWrapper() G4F_CLIENT = Client() diff --git a/pyqt_openai/main.py b/pyqt_openai/main.py index b232b44..a5f9063 100644 --- a/pyqt_openai/main.py +++ b/pyqt_openai/main.py @@ -24,7 +24,7 @@ from pyqt_openai.config_loader import CONFIG_MANAGER from pyqt_openai.mainWindow import MainWindow -from pyqt_openai.util.script import handle_exception +from pyqt_openai.util.common import handle_exception from pyqt_openai.updateSoftwareDialog import update_software from pyqt_openai.sqlite import get_db_filename diff --git a/pyqt_openai/mainWindow.py b/pyqt_openai/mainWindow.py index 8255eaf..b072031 100644 --- a/pyqt_openai/mainWindow.py +++ b/pyqt_openai/mainWindow.py @@ -61,7 +61,7 @@ from pyqt_openai.settings_dialog.settingsDialog import SettingsDialog from pyqt_openai.shortcutDialog import ShortcutDialog from pyqt_openai.updateSoftwareDialog import update_software -from pyqt_openai.util.script import ( +from pyqt_openai.util.common import ( restart_app, show_message_box_after_change_to_restart, set_auto_start_windows, diff --git a/pyqt_openai/replicate_widget/replicateMainWidget.py b/pyqt_openai/replicate_widget/replicateMainWidget.py index dd8a88a..099d62f 100644 --- a/pyqt_openai/replicate_widget/replicateMainWidget.py +++ b/pyqt_openai/replicate_widget/replicateMainWidget.py @@ -23,7 +23,7 @@ from pyqt_openai.replicate_widget.replicateRightSideBar import ( ReplicateRightSideBarWidget, ) -from pyqt_openai.util.script import ( +from pyqt_openai.util.common import ( get_image_filename_for_saving, open_directory, get_image_prompt_filename_for_saving, diff --git a/pyqt_openai/replicate_widget/replicateThread.py b/pyqt_openai/replicate_widget/replicateThread.py index 9b9d34b..fe11cab 100644 --- a/pyqt_openai/replicate_widget/replicateThread.py +++ b/pyqt_openai/replicate_widget/replicateThread.py @@ -2,7 +2,7 @@ from pyqt_openai.globals import REPLICATE_CLIENT from pyqt_openai.models import ImagePromptContainer -from pyqt_openai.util.script import generate_random_prompt +from pyqt_openai.util.common import generate_random_prompt class ReplicateThread(QThread): diff --git a/pyqt_openai/settings_dialog/apiWidget.py b/pyqt_openai/settings_dialog/apiWidget.py index 537ab80..1404648 100644 --- a/pyqt_openai/settings_dialog/apiWidget.py +++ b/pyqt_openai/settings_dialog/apiWidget.py @@ -14,7 +14,7 @@ DEFAULT_API_CONFIGS, ) from pyqt_openai.config_loader import CONFIG_MANAGER -from pyqt_openai.util.script import set_api_key +from pyqt_openai.util.common import set_api_key from pyqt_openai.widgets.linkLabel import LinkLabel diff --git a/pyqt_openai/util/script.py b/pyqt_openai/util/common.py similarity index 96% rename from pyqt_openai/util/script.py rename to pyqt_openai/util/common.py index 5b7e025..b6067e5 100644 --- a/pyqt_openai/util/script.py +++ b/pyqt_openai/util/common.py @@ -45,7 +45,6 @@ from g4f.errors import ProviderNotFoundError from g4f.models import ModelUtils from g4f.providers.retry_provider import IterProvider -from google import generativeai as genai from jinja2 import Template import pyqt_openai.util @@ -585,78 +584,6 @@ def get_chat_model(is_g4f=False): ] return all_models - -def get_gpt_argument( - model, - system, - messages, - cur_text, - temperature, - top_p, - frequency_penalty, - presence_penalty, - stream, - use_max_tokens, - max_tokens, - images, - is_llama_available=False, - is_json_response_available=0, - json_content=None, -): - try: - if model in O1_MODELS: - stream = False - else: - system_obj = get_message_obj("system", system) - messages = [system_obj] + messages - - # Form argument - openai_arg = { - "model": model, - "messages": messages, - "temperature": temperature, - "top_p": top_p, - "frequency_penalty": frequency_penalty, - "presence_penalty": presence_penalty, - "stream": stream, - } - if is_json_response_available: - openai_arg["response_format"] = {"type": "json_object"} - cur_text += f" JSON {json_content}" - - # If there is at least one image, it should add - if len(images) > 0: - multiple_images_content = [] - for image in images: - multiple_images_content.append( - { - "type": "image_url", - "image_url": { - "url": get_image_url_from_local(image, is_openai=True), - }, - } - ) - - multiple_images_content = [ - {"type": "text", "text": cur_text} - ] + multiple_images_content[:] - openai_arg["messages"].append( - {"role": "user", "content": multiple_images_content} - ) - else: - openai_arg["messages"].append({"role": "user", "content": cur_text}) - - if is_llama_available: - del openai_arg["messages"] - if use_max_tokens: - openai_arg["max_tokens"] = max_tokens - - return openai_arg - except Exception as e: - print(e) - raise e - - def get_gemini_argument(model, system, messages, cur_text, stream, images): try: args = { @@ -896,24 +823,54 @@ def get_api_argument( json_content=None, ): try: - args = get_gpt_argument( - model, - system, - messages, - cur_text, - temperature, - top_p, - frequency_penalty, - presence_penalty, - stream, - use_max_tokens, - max_tokens, - images, - is_llama_available=is_llama_available, - is_json_response_available=is_json_response_available, - json_content=json_content, - ) - return args + if model in O1_MODELS: + stream = False + else: + system_obj = get_message_obj("system", system) + messages = [system_obj] + messages + + # Form argument + arg = { + "model": model, + "messages": messages, + "temperature": temperature, + "top_p": top_p, + "frequency_penalty": frequency_penalty, + "presence_penalty": presence_penalty, + "stream": stream, + } + if is_json_response_available: + arg["response_format"] = {"type": "json_object"} + cur_text += f" JSON {json_content}" + + # If there is at least one image, it should add + if len(images) > 0: + multiple_images_content = [] + for image in images: + multiple_images_content.append( + { + "type": "image_url", + "image_url": { + "url": get_image_url_from_local(image, is_openai=True), + }, + } + ) + + multiple_images_content = [ + {"type": "text", "text": cur_text} + ] + multiple_images_content[:] + arg["messages"].append( + {"role": "user", "content": multiple_images_content} + ) + else: + arg["messages"].append({"role": "user", "content": cur_text}) + + if is_llama_available: + del arg["messages"] + if use_max_tokens: + arg["max_tokens"] = max_tokens + + return arg except Exception as e: print(e) raise e @@ -1028,6 +985,7 @@ def get_response(args, is_g4f=False, get_content_only=True, provider=""): raise e +# This has to be here because of the circular import problem def init_llama(): llama_index_directory = CONFIG_MANAGER.get_general_property("llama_index_directory") if llama_index_directory and CONFIG_MANAGER.get_general_property("use_llama_index"): @@ -1362,18 +1320,18 @@ def run(self): # To manage only one TTS stream at a time -current_stream_thread = None +current_tts_thread = None -def stop_existing_thread(): - if pyqt_openai.util.script.current_stream_thread: - pyqt_openai.util.script.current_stream_thread.stop() - pyqt_openai.util.script.current_stream_thread = None +def stop_existing_tts_thread(): + if pyqt_openai.util.common.current_tts_thread: + pyqt_openai.util.common.current_tts_thread.stop() + pyqt_openai.util.common.current_tts_thread = None def stream_to_speakers(voice_provider, input_args): - stop_existing_thread() + stop_existing_tts_thread() stream_thread = TTSThread(voice_provider, input_args) - pyqt_openai.util.script.current_stream_thread = stream_thread + pyqt_openai.util.common.current_tts_thread = stream_thread return stream_thread diff --git a/pyqt_openai/util/llamapage_script.py b/pyqt_openai/util/llamaindex.py similarity index 98% rename from pyqt_openai/util/llamapage_script.py rename to pyqt_openai/util/llamaindex.py index a73ddaa..f165596 100644 --- a/pyqt_openai/util/llamapage_script.py +++ b/pyqt_openai/util/llamaindex.py @@ -3,7 +3,7 @@ from llama_index.core import VectorStoreIndex, SimpleDirectoryReader -class GPTLLamaIndexWrapper: +class LlamaIndexWrapper: def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) self._directory = "" diff --git a/pyqt_openai/util/replicate_script.py b/pyqt_openai/util/replicate.py similarity index 100% rename from pyqt_openai/util/replicate_script.py rename to pyqt_openai/util/replicate.py diff --git a/pyqt_openai/widgets/imageControlWidget.py b/pyqt_openai/widgets/imageControlWidget.py index 59742c4..67af79d 100644 --- a/pyqt_openai/widgets/imageControlWidget.py +++ b/pyqt_openai/widgets/imageControlWidget.py @@ -13,7 +13,7 @@ from pyqt_openai.lang.translations import LangClass from pyqt_openai.models import ImagePromptContainer -from pyqt_openai.util.script import getSeparator +from pyqt_openai.util.common import getSeparator from pyqt_openai.widgets.findPathWidget import FindPathWidget from pyqt_openai.widgets.notifier import NotifierWidget from pyqt_openai.widgets.randomImagePromptGeneratorWidget import ( diff --git a/pyqt_openai/widgets/imageMainWidget.py b/pyqt_openai/widgets/imageMainWidget.py index 05b9608..b4a9d59 100644 --- a/pyqt_openai/widgets/imageMainWidget.py +++ b/pyqt_openai/widgets/imageMainWidget.py @@ -19,7 +19,7 @@ from pyqt_openai.lang.translations import LangClass from pyqt_openai.models import ImagePromptContainer from pyqt_openai.globals import DB -from pyqt_openai.util.script import ( +from pyqt_openai.util.common import ( get_image_filename_for_saving, open_directory, get_image_prompt_filename_for_saving, diff --git a/pyqt_openai/widgets/inputDialog.py b/pyqt_openai/widgets/inputDialog.py index 6b7bd3a..d9baca7 100644 --- a/pyqt_openai/widgets/inputDialog.py +++ b/pyqt_openai/widgets/inputDialog.py @@ -9,7 +9,7 @@ ) from pyqt_openai.lang.translations import LangClass -from pyqt_openai.util.script import getSeparator +from pyqt_openai.util.common import getSeparator class InputDialog(QDialog): From 3fcb0eefe517a846031f71e3c64a50d8563fdb98 Mon Sep 17 00:00:00 2001 From: Jung Gyu Yoon Date: Thu, 14 Nov 2024 17:32:15 +0900 Subject: [PATCH 2/4] Update --- pyqt_openai/__init__.py | 1 + pyqt_openai/aboutDialog.py | 1 + .../chat_widget/right_sidebar/usingAPIPage.py | 7 +-- pyqt_openai/dalle_widget/dalleRightSideBar.py | 4 +- .../replicate_widget/replicateRightSideBar.py | 4 +- pyqt_openai/settings_dialog/apiWidget.py | 4 +- pyqt_openai/util/common.py | 6 ++- .../{modernButton.py => APIInputButton.py} | 2 +- pyqt_openai/widgets/modelInputManualDialog.py | 44 +++++++++++++++++++ 9 files changed, 61 insertions(+), 12 deletions(-) rename pyqt_openai/widgets/{modernButton.py => APIInputButton.py} (98%) create mode 100644 pyqt_openai/widgets/modelInputManualDialog.py diff --git a/pyqt_openai/__init__.py b/pyqt_openai/__init__.py index 97527dd..c1bb2fb 100644 --- a/pyqt_openai/__init__.py +++ b/pyqt_openai/__init__.py @@ -1139,6 +1139,7 @@ def move_bin(filename, dst_dir): "model", "width", "height", + "provider", "prompt", "negative_prompt", "n", diff --git a/pyqt_openai/aboutDialog.py b/pyqt_openai/aboutDialog.py index a29cbd4..98a20bb 100644 --- a/pyqt_openai/aboutDialog.py +++ b/pyqt_openai/aboutDialog.py @@ -54,6 +54,7 @@ def __initUi(self):

Powered by PySide6

Powered by GPT4Free

Powered by LiteLLM

+

Powered by LlamaIndex

""" ) diff --git a/pyqt_openai/chat_widget/right_sidebar/usingAPIPage.py b/pyqt_openai/chat_widget/right_sidebar/usingAPIPage.py index 3616364..caad1dd 100644 --- a/pyqt_openai/chat_widget/right_sidebar/usingAPIPage.py +++ b/pyqt_openai/chat_widget/right_sidebar/usingAPIPage.py @@ -40,7 +40,7 @@ init_llama, ) from pyqt_openai.widgets.linkLabel import LinkLabel -from pyqt_openai.widgets.modernButton import ModernButton +from pyqt_openai.widgets.APIInputButton import APIInputButton class UsingAPIPage(QWidget): @@ -123,15 +123,12 @@ def __initUi(self): modelSearchBar.setText(self.__model) modelSearchBar.textChanged.connect(self.__modelChanged) - prefixListBtn = ModernButton() - prefixListBtn.setText("Prefix List") - lay = QHBoxLayout() lay.addWidget(QLabel(LangClass.TRANSLATIONS["Model"])) lay.addWidget(modelSearchBar) lay.setContentsMargins(0, 0, 0, 0) - setApiBtn = ModernButton() + setApiBtn = APIInputButton() # TODO LANGUAGE setApiBtn.setText("Set API Key") diff --git a/pyqt_openai/dalle_widget/dalleRightSideBar.py b/pyqt_openai/dalle_widget/dalleRightSideBar.py index 2e7ac74..b59ca3b 100644 --- a/pyqt_openai/dalle_widget/dalleRightSideBar.py +++ b/pyqt_openai/dalle_widget/dalleRightSideBar.py @@ -13,7 +13,7 @@ from pyqt_openai.dalle_widget.dalleThread import DallEThread from pyqt_openai.lang.translations import LangClass from pyqt_openai.widgets.imageControlWidget import ImageControlWidget -from pyqt_openai.widgets.modernButton import ModernButton +from pyqt_openai.widgets.APIInputButton import APIInputButton class DallERightSideBarWidget(ImageControlWidget): @@ -51,7 +51,7 @@ def _initUi(self): super()._initUi() # TODO LANGUAGE - self.__setApiBtn = ModernButton() + self.__setApiBtn = APIInputButton() self.__setApiBtn.setText("Set API Key") self.__promptTypeToShowRadioGrpBox = QGroupBox( diff --git a/pyqt_openai/replicate_widget/replicateRightSideBar.py b/pyqt_openai/replicate_widget/replicateRightSideBar.py index df27c95..c0ee74a 100644 --- a/pyqt_openai/replicate_widget/replicateRightSideBar.py +++ b/pyqt_openai/replicate_widget/replicateRightSideBar.py @@ -13,7 +13,7 @@ from pyqt_openai.lang.translations import LangClass from pyqt_openai.replicate_widget.replicateThread import ReplicateThread from pyqt_openai.widgets.imageControlWidget import ImageControlWidget -from pyqt_openai.widgets.modernButton import ModernButton +from pyqt_openai.widgets.APIInputButton import APIInputButton class ReplicateRightSideBarWidget(ImageControlWidget): @@ -49,7 +49,7 @@ def _initUi(self): super()._initUi() # TODO LANGUAGE - self.__setApiBtn = ModernButton() + self.__setApiBtn = APIInputButton() self.__setApiBtn.setText("Set API Key") self.__modelTextEdit = QPlainTextEdit() diff --git a/pyqt_openai/settings_dialog/apiWidget.py b/pyqt_openai/settings_dialog/apiWidget.py index 1404648..3e28389 100644 --- a/pyqt_openai/settings_dialog/apiWidget.py +++ b/pyqt_openai/settings_dialog/apiWidget.py @@ -39,7 +39,7 @@ def __initVal(self): def __initUi(self): self.setWindowTitle("API Key") - columns = ["Provider", "API Key", "Get API Key"] + columns = ["Provider", "API Key", "Manual URL"] self.__tableWidget = QTableWidget() self.__tableWidget.setColumnCount(len(columns)) self.__tableWidget.setHorizontalHeaderLabels(columns) @@ -51,6 +51,8 @@ def __initUi(self): for i, obj in enumerate(self.__api_keys): self.__tableWidget.insertRow(i) modelItem = QTableWidgetItem(obj["display_name"]) + # Make item not editable + modelItem.setFlags(modelItem.flags() & ~Qt.ItemFlag.ItemIsEditable) self.__tableWidget.setItem(i, 0, modelItem) apiKeyLineEdit = QLineEdit(obj["api_key"]) diff --git a/pyqt_openai/util/common.py b/pyqt_openai/util/common.py index b6067e5..61bcd5f 100644 --- a/pyqt_openai/util/common.py +++ b/pyqt_openai/util/common.py @@ -66,7 +66,7 @@ OPENAI_CHAT_ENDPOINT, STT_MODEL, DEFAULT_DATETIME_FORMAT, - DEFAULT_TOKEN_CHUNK_SIZE, + DEFAULT_TOKEN_CHUNK_SIZE, DEFAULT_API_CONFIGS, ) from pyqt_openai.config_loader import CONFIG_MANAGER from pyqt_openai.globals import ( @@ -1335,3 +1335,7 @@ def stream_to_speakers(voice_provider, input_args): stream_thread = TTSThread(voice_provider, input_args) pyqt_openai.util.common.current_tts_thread = stream_thread return stream_thread + + +def get_litellm_prefixes(): + return [{'Provider': obj.get('display_name', ''), 'Prefix': obj.get('prefix', '')} for obj in DEFAULT_API_CONFIGS] \ No newline at end of file diff --git a/pyqt_openai/widgets/modernButton.py b/pyqt_openai/widgets/APIInputButton.py similarity index 98% rename from pyqt_openai/widgets/modernButton.py rename to pyqt_openai/widgets/APIInputButton.py index 53c6b72..9a94971 100644 --- a/pyqt_openai/widgets/modernButton.py +++ b/pyqt_openai/widgets/APIInputButton.py @@ -5,7 +5,7 @@ from pyqt_openai.settings_dialog.settingsDialog import SettingsDialog -class ModernButton(QPushButton): +class APIInputButton(QPushButton): def __init__(self, base_color="#007BFF"): super().__init__() self.setObjectName("modernButton") diff --git a/pyqt_openai/widgets/modelInputManualDialog.py b/pyqt_openai/widgets/modelInputManualDialog.py new file mode 100644 index 0000000..d27f2d1 --- /dev/null +++ b/pyqt_openai/widgets/modelInputManualDialog.py @@ -0,0 +1,44 @@ +from PySide6.QtCore import Qt +from PySide6.QtGui import QFont +from PySide6.QtWidgets import QDialog, QLabel, QHBoxLayout, QTableWidget + +from pyqt_openai import SMALL_LABEL_PARAM +from pyqt_openai.util.common import get_litellm_prefixes + + +class ModelInputManualDialog(QDialog): + def __init__(self, parent=None): + super().__init__(parent) + self.__initVal() + self.__initUi() + + def __initVal(self): + self.__warningMessage = ( + "💡 Tip For models other than OpenAI and Anthropic, enter the model name as `[ProviderName]/[ModelName]`.\n\n" + "🔗 For details on `ProviderName` and `ModelName`, check out the " + "LiteLLM documentation! 😊\n\n" + "⚠️ Note: Some models may not support JSON Mode or LlamaIndex features." + ) + + def __initUi(self): + self.__warningLbl = QLabel() + self.__warningLbl.setStyleSheet("color: orange;") + self.__warningLbl.setOpenExternalLinks(True) + self.__warningLbl.setFont(QFont(SMALL_LABEL_PARAM)) + self.__warningLbl.setText(self.__warningMessage) + self.__warningLbl.setTextInteractionFlags( + Qt.TextInteractionFlag.TextSelectableByMouse + ) + + # prefixTable = QTableWidget() + # prefixes = get_litellm_prefixes() + # prefixTable.setColumnCount(len(list(prefixes[0].keys()))) + # prefixTable.setHorizontalHeaderLabels(list(prefixes[0].keys())) + # for prefix in prefixes: + # prefixTable.insertRow(prefixTable.rowCount()) + # prefixTable.setItem(prefixTable.rowCount() - 1, 0, QLabel(prefix)) + + lay = QHBoxLayout() + lay.addWidget(self.__warningLbl) + # lay.addWidget(prefixTable) + self.setLayout(lay) From 671566567e8b3c32527817917d977473980e486d Mon Sep 17 00:00:00 2001 From: Jung Gyu Yoon Date: Thu, 14 Nov 2024 17:35:18 +0900 Subject: [PATCH 3/4] Bump ver --- pyproject.toml | 2 +- pyqt_openai/__init__.py | 2 +- version_info.txt | 8 ++++---- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/pyproject.toml b/pyproject.toml index 9d60761..4a4190b 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta" [project] name = "pyqt-openai" -version = "1.7.0" +version = "1.7.1" description = "Python multipurpose chatbot that user can use GPT, other AI models altogether (Release Name: VividNode)" authors = [{ name = "Jung Gyu Yoon", email = "yjg30737@gmail.com" }] license = { text = "MIT" } diff --git a/pyqt_openai/__init__.py b/pyqt_openai/__init__.py index c1bb2fb..c86ce85 100644 --- a/pyqt_openai/__init__.py +++ b/pyqt_openai/__init__.py @@ -23,7 +23,7 @@ # For the sake of following the PEP8 standard, we will declare module-level dunder names. # PEP8 standard about dunder names: https://peps.python.org/pep-0008/#module-level-dunder-names -__version__ = "1.7.0" +__version__ = "1.7.1" __author__ = "Jung Gyu Yoon" # Constants diff --git a/version_info.txt b/version_info.txt index c18c088..6332b8f 100644 --- a/version_info.txt +++ b/version_info.txt @@ -5,8 +5,8 @@ # VSVersionInfo( ffi=FixedFileInfo( - filevers=(1, 7, 0), - prodvers=(1, 7, 0), + filevers=(1, 7, 1), + prodvers=(1, 7, 1), mask=0x3f, flags=0x0, OS=0x4, @@ -19,10 +19,10 @@ VSVersionInfo( [ StringTable( u'040904B0', - [StringStruct(u'FileVersion', u'1.7.0'), + [StringStruct(u'FileVersion', u'1.7.1'), StringStruct(u'ProductName', u'VividNode'), StringStruct(u'LegalCopyright', u'Copyright © 2024 Jung Gyu Yoon'), - StringStruct(u'ProductVersion', u'1.7.0')]) + StringStruct(u'ProductVersion', u'1.7.1')]) ]), VarFileInfo([VarStruct(u'Translation', [1033, 1200])]) ] From 796328528a9a79bc27f49a5cd386c2f55bb980c8 Mon Sep 17 00:00:00 2001 From: Jung Gyu Yoon Date: Thu, 14 Nov 2024 17:45:49 +0900 Subject: [PATCH 4/4] Redesign modelInputManualDialog (will implement that next time, cause i'm exhausted) --- pyqt_openai/widgets/APIInputButton.py | 3 ++ pyqt_openai/widgets/modelInputManualDialog.py | 35 ++++++++----------- 2 files changed, 18 insertions(+), 20 deletions(-) diff --git a/pyqt_openai/widgets/APIInputButton.py b/pyqt_openai/widgets/APIInputButton.py index 9a94971..90f6a47 100644 --- a/pyqt_openai/widgets/APIInputButton.py +++ b/pyqt_openai/widgets/APIInputButton.py @@ -6,6 +6,9 @@ class APIInputButton(QPushButton): + """ + Stylish button for opening the API settings dialog. + """ def __init__(self, base_color="#007BFF"): super().__init__() self.setObjectName("modernButton") diff --git a/pyqt_openai/widgets/modelInputManualDialog.py b/pyqt_openai/widgets/modelInputManualDialog.py index d27f2d1..d715729 100644 --- a/pyqt_openai/widgets/modelInputManualDialog.py +++ b/pyqt_openai/widgets/modelInputManualDialog.py @@ -1,9 +1,8 @@ from PySide6.QtCore import Qt from PySide6.QtGui import QFont -from PySide6.QtWidgets import QDialog, QLabel, QHBoxLayout, QTableWidget +from PySide6.QtWidgets import QDialog, QLabel, QHBoxLayout from pyqt_openai import SMALL_LABEL_PARAM -from pyqt_openai.util.common import get_litellm_prefixes class ModelInputManualDialog(QDialog): @@ -14,31 +13,27 @@ def __init__(self, parent=None): def __initVal(self): self.__warningMessage = ( - "💡 Tip For models other than OpenAI and Anthropic, enter the model name as `[ProviderName]/[ModelName]`.\n\n" - "🔗 For details on `ProviderName` and `ModelName`, check out the " - "LiteLLM documentation! 😊\n\n" - "⚠️ Note: Some models may not support JSON Mode or LlamaIndex features." + "💡 Tip: For models other than OpenAI and Anthropic, enter the model name as " + "[ProviderName]/[ModelName].

" + "🔗 For details on ProviderName and ModelName, check out the " + "LiteLLM documentation! 😊

" + "⚠️ Note: Some models may not support JSON Mode or LlamaIndex features." ) def __initUi(self): + self.setWindowTitle('Model Input Manual') self.__warningLbl = QLabel() - self.__warningLbl.setStyleSheet("color: orange;") - self.__warningLbl.setOpenExternalLinks(True) + self.__warningLbl.setStyleSheet( + "color: orange;" + ) # Text color remains orange for visibility. + self.__warningLbl.setWordWrap(True) self.__warningLbl.setFont(QFont(SMALL_LABEL_PARAM)) - self.__warningLbl.setText(self.__warningMessage) self.__warningLbl.setTextInteractionFlags( - Qt.TextInteractionFlag.TextSelectableByMouse + Qt.TextInteractionFlag.TextBrowserInteraction ) - - # prefixTable = QTableWidget() - # prefixes = get_litellm_prefixes() - # prefixTable.setColumnCount(len(list(prefixes[0].keys()))) - # prefixTable.setHorizontalHeaderLabels(list(prefixes[0].keys())) - # for prefix in prefixes: - # prefixTable.insertRow(prefixTable.rowCount()) - # prefixTable.setItem(prefixTable.rowCount() - 1, 0, QLabel(prefix)) + self.__warningLbl.setOpenExternalLinks(True) # Enable hyperlink functionality. + self.__warningLbl.setText(self.__warningMessage) # Ensure HTML is passed as text. lay = QHBoxLayout() lay.addWidget(self.__warningLbl) - # lay.addWidget(prefixTable) - self.setLayout(lay) + self.setLayout(lay) \ No newline at end of file