Skip to content

Commit dfe3361

Browse files
committed
Add support formats for llamaindex
1 parent 8b2d804 commit dfe3361

File tree

12 files changed

+80
-38
lines changed

12 files changed

+80
-38
lines changed

pyproject.toml

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,9 +21,12 @@ dependencies = [
2121
"openai",
2222
"anthropic",
2323
"google-generativeai",
24-
"llama-index",
2524
"replicate",
2625

26+
"llama-index",
27+
"docx2txt",
28+
"openpyxl",
29+
2730
"g4f",
2831
"curl_cffi",
2932
"litellm",

pyqt_openai/__init__.py

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -487,7 +487,7 @@ def move_bin(filename, dst_dir):
487487
"env_var_name": "ANTHROPIC_API_KEY",
488488
"api_key": "",
489489
"manual_url": HOW_TO_GET_CLAUDE_API_KEY_URL,
490-
"model_list": ["claude-3-5-sonnet-20240620"]
490+
"model_list": ["claude-3-haiku-20240307", "claude-3-5-sonnet-20240620"]
491491
},
492492
# AWS Sagemaker
493493
{
@@ -903,6 +903,10 @@ def move_bin(filename, dst_dir):
903903
MAXIMUM_MESSAGES_IN_PARAMETER = 40
904904
MAXIMUM_MESSAGES_IN_PARAMETER_RANGE = 2, 1000
905905

906+
# llamaIndex
907+
LLAMA_INDEX_DEFAULT_SUPPORTED_FORMATS_LIST = ['.txt']
908+
LLAMA_INDEX_DEFAULT_ALL_SUPPORTED_FORMATS_LIST = ['.txt', '.docx', '.hwp', '.ipynb', '.csv', '.jpeg', '.jpg', '.mbox', '.md', '.mp3', '.mp4', '.pdf', '.png', '.ppt', '.pptx', '.pptm']
909+
906910
# PROMPT
907911
## DEFAULT JSON FILENAME FOR PROMPT
908912
AWESOME_CHATGPT_PROMPTS_FILENAME = "prompt_res/awesome_chatgpt_prompts.json"
@@ -1142,6 +1146,7 @@ def move_bin(filename, dst_dir):
11421146
# Llama Index
11431147
"use_llama_index": False,
11441148
"llama_index_directory": "",
1149+
"llama_index_supported_formats": LLAMA_INDEX_DEFAULT_SUPPORTED_FORMATS_LIST,
11451150
# Customize
11461151
"background_image": "",
11471152
"user_image": DEFAULT_USER_IMAGE_PATH,

pyqt_openai/aboutDialog.py

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -51,10 +51,7 @@ def __initUi(self):
5151
descWidget3.setText(
5252
f"""
5353
<br/><br/>Contact: {CONTACT}<br/>
54-
<p>Powered by PySide6</p>
55-
<p>Powered by GPT4Free</p>
56-
<p>Powered by LiteLLM</p>
57-
<p>Powered by LlamaIndex</p>
54+
<p>Powered by<br><br> PySide6, GPT4Free, LiteLLM,<br>LlamaIndex</p>
5855
"""
5956
)
6057

pyqt_openai/chat_widget/chatMainWidget.py

Lines changed: 0 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -100,13 +100,6 @@ def __initUi(self):
100100

101101
self.__chatWidget.setG4F(self.__chatRightSideBarWidget.currentTabIdx())
102102

103-
try:
104-
self.__chatRightSideBarWidget.onDirectorySelected.connect(
105-
LLAMAINDEX_WRAPPER.set_directory
106-
)
107-
except Exception as e:
108-
QMessageBox.critical(self, LangClass.TRANSLATIONS["Error"], str(e))
109-
110103
self.__promptGeneratorWidget = PromptGeneratorWidget()
111104

112105
self.__sideBarBtn = Button()

pyqt_openai/chat_widget/right_sidebar/chatRightSideBarWidget.py

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,18 @@
11
from functools import partial
22

33
from PySide6.QtCore import Signal
4-
from PySide6.QtWidgets import QScrollArea, QWidget, QTabWidget, QGridLayout
4+
from PySide6.QtWidgets import QScrollArea, QWidget, QTabWidget, QGridLayout, QMessageBox
55

66
from pyqt_openai.chat_widget.right_sidebar.usingAPIPage import UsingAPIPage
77
from pyqt_openai.chat_widget.right_sidebar.llama_widget.llamaPage import LlamaPage
88
from pyqt_openai.chat_widget.right_sidebar.usingG4FPage import UsingG4FPage
99
from pyqt_openai.config_loader import CONFIG_MANAGER
10+
from pyqt_openai.globals import LLAMAINDEX_WRAPPER
11+
from pyqt_openai.lang.translations import LangClass
1012

1113

1214
class ChatRightSideBarWidget(QScrollArea):
1315
onTabChanged = Signal(int)
14-
onDirectorySelected = Signal(str)
1516
onToggleJSON = Signal(bool)
1617

1718
def __init__(self, parent=None):
@@ -65,7 +66,11 @@ def __tabChanged(self, idx):
6566
def __onDirectorySelected(self, selected_dirname):
6667
self.__llama_index_directory = selected_dirname
6768
CONFIG_MANAGER.set_general_property("llama_index_directory", selected_dirname)
68-
self.onDirectorySelected.emit(selected_dirname)
69+
try:
70+
LLAMAINDEX_WRAPPER.set_directory(selected_dirname)
71+
except Exception as e:
72+
QMessageBox.critical(self, LangClass.TRANSLATIONS["Error"], str(e))
73+
6974

7075
def currentTabIdx(self):
7176
return self.__cur_idx

pyqt_openai/chat_widget/right_sidebar/llama_widget/filesWidget.py

Lines changed: 20 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414
)
1515

1616
from pyqt_openai import TEXT_FILE_EXT_LIST, QFILEDIALOG_DEFAULT_DIRECTORY
17+
from pyqt_openai.config_loader import CONFIG_MANAGER
1718
from pyqt_openai.lang.translations import LangClass
1819
from pyqt_openai.util.common import getSeparator
1920

@@ -29,14 +30,15 @@ def __init__(self, parent=None):
2930
self.__initUi()
3031

3132
def __initVal(self):
32-
self.__dirLblPrefix = LangClass.TRANSLATIONS["Directory"]
33-
self.__curDirName = ""
33+
self.__directory_label_prefix = LangClass.TRANSLATIONS["Directory"]
34+
self.__current_directory_name = ""
35+
self.__extension = CONFIG_MANAGER.get_general_property("llama_index_supported_formats")
3436

3537
def __initUi(self):
3638
lbl = QLabel(LangClass.TRANSLATIONS["Files"])
3739
setDirBtn = QPushButton(LangClass.TRANSLATIONS["Set Directory"])
3840
setDirBtn.clicked.connect(self.setDirectory)
39-
self.__dirLbl = QLabel(self.__dirLblPrefix)
41+
self.__dirLbl = QLabel(self.__directory_label_prefix)
4042

4143
lay = QHBoxLayout()
4244
lay.addWidget(lbl)
@@ -60,6 +62,15 @@ def __initUi(self):
6062
lay.setContentsMargins(0, 0, 0, 0)
6163
self.setLayout(lay)
6264

65+
def setExtension(self, ext):
66+
# Set extension
67+
self.__extension = ext
68+
CONFIG_MANAGER.set_general_property("llama_index_supported_formats", ext)
69+
70+
# Refresh list based on new extension
71+
self.__listWidget.clear()
72+
self.setDirectory(self.__current_directory_name, called_from_btn=False)
73+
6374
def setDirectory(self, directory=None, called_from_btn=True):
6475
try:
6576
if called_from_btn:
@@ -74,28 +85,28 @@ def setDirectory(self, directory=None, called_from_btn=True):
7485
self.__listWidget.clear()
7586
filenames = list(
7687
filter(
77-
lambda x: os.path.splitext(x)[-1] in TEXT_FILE_EXT_LIST,
88+
lambda x: os.path.splitext(x)[-1] in self.__extension,
7889
os.listdir(directory),
7990
)
8091
)
8192
self.__listWidget.addItems(filenames)
8293
self.itemUpdate.emit(len(filenames) > 0)
83-
self.__curDirName = directory
84-
self.__dirLbl.setText(self.__curDirName.split("/")[-1])
94+
self.__current_directory_name = directory
95+
self.__dirLbl.setText(self.__current_directory_name.split("/")[-1])
8596

8697
self.__listWidget.setCurrentRow(0)
8798
# activate event as clicking first item (because this selects the first item anyway)
8899
self.clicked.emit(
89100
os.path.join(
90-
self.__curDirName, self.__listWidget.currentItem().text()
101+
self.__current_directory_name, self.__listWidget.currentItem().text()
91102
)
92103
)
93104
self.onDirectorySelected.emit()
94105
except Exception as e:
95106
print(e)
96107

97108
def getDirectory(self):
98-
return self.__curDirName
109+
return self.__current_directory_name
99110

100111
def __sendDirectory(self, item):
101-
self.clicked.emit(os.path.join(self.__curDirName, item.text()))
112+
self.clicked.emit(os.path.join(self.__current_directory_name, item.text()))

pyqt_openai/chat_widget/right_sidebar/llama_widget/llamaPage.py

Lines changed: 14 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,13 @@
11
from PySide6.QtCore import Qt, Signal
22
from PySide6.QtGui import QFont
3-
from PySide6.QtWidgets import QTextBrowser
3+
from PySide6.QtWidgets import QTextBrowser, QMessageBox
44
from PySide6.QtWidgets import QWidget, QLabel, QVBoxLayout
55

66
from pyqt_openai import SMALL_LABEL_PARAM
77
from pyqt_openai.config_loader import CONFIG_MANAGER
88
from pyqt_openai.chat_widget.right_sidebar.llama_widget.filesWidget import FilesWidget
99
from pyqt_openai.chat_widget.right_sidebar.llama_widget.supportedFileFormatsWidget import SupportedFileFormatsWidget
10+
from pyqt_openai.globals import LLAMAINDEX_WRAPPER
1011
from pyqt_openai.lang.translations import LangClass
1112

1213

@@ -26,6 +27,7 @@ def __initUi(self):
2627
self.__filesWidget.onDirectorySelected.connect(self.__onDirectorySelected)
2728

2829
self.__supportedFileFormatsWidget = SupportedFileFormatsWidget()
30+
self.__supportedFileFormatsWidget.checkedSignal.connect(self.__formatCheckedSignal)
2931

3032
self.__txtBrowser = QTextBrowser()
3133
self.__txtBrowser.setPlaceholderText(
@@ -49,10 +51,18 @@ def __onDirectorySelected(self):
4951
selected_dirname = self.__filesWidget.getDirectory()
5052
self.onDirectorySelected.emit(selected_dirname)
5153

52-
def __setTextInBrowser(self, txt_file):
53-
with open(txt_file, "r", encoding="utf-8") as f:
54-
self.__txtBrowser.setText(f.read())
54+
def __setTextInBrowser(self, file):
55+
try:
56+
with open(file, "r", encoding="utf-8") as f:
57+
self.__txtBrowser.setText(f.read())
58+
except UnicodeDecodeError as e:
59+
self.__txtBrowser.setText('Some files like Excel files cannot be previewed.')
60+
except Exception as e:
61+
print(e)
5562

5663
def setDirectory(self):
5764
directory = CONFIG_MANAGER.get_general_property("llama_index_directory")
5865
self.__filesWidget.setDirectory(directory, called_from_btn=False)
66+
67+
def __formatCheckedSignal(self, ext):
68+
self.__filesWidget.setExtension(ext)
Lines changed: 14 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,14 @@
1+
from PySide6.QtCore import Signal, Qt
12
from PySide6.QtWidgets import QWidget, QVBoxLayout, QLabel
23

4+
from pyqt_openai import LLAMA_INDEX_DEFAULT_ALL_SUPPORTED_FORMATS_LIST
5+
from pyqt_openai.config_loader import CONFIG_MANAGER
36
from pyqt_openai.widgets.checkBoxListWidget import CheckBoxListWidget
47

58

69
class SupportedFileFormatsWidget(QWidget):
10+
checkedSignal = Signal(list)
11+
712
def __init__(self, parent=None):
813
super().__init__(parent)
914
self.__initUi()
@@ -12,15 +17,21 @@ def __initUi(self):
1217
self.__listWidget = CheckBoxListWidget()
1318
self.__listWidget.checkedSignal.connect(self.__sendCheckedSignal)
1419

15-
ext_lst = ['.txt', '.docx', '.xlsx', '.md', '.pdf', '.html']
20+
all_supported_format_lst = LLAMA_INDEX_DEFAULT_ALL_SUPPORTED_FORMATS_LIST
21+
self.__listWidget.addItems(all_supported_format_lst)
1622

17-
self.__listWidget.addItems(ext_lst, checked=True)
23+
current_supported_format_lst = CONFIG_MANAGER.get_general_property("llama_index_supported_formats")
24+
for i in range(self.__listWidget.count()):
25+
supported_format = self.__listWidget.item(i).text()
26+
if supported_format in current_supported_format_lst:
27+
self.__listWidget.item(i).setCheckState(Qt.CheckState.Checked)
1828

1929
lay = QVBoxLayout()
2030
# TODO LANGUAGE
2131
lay.addWidget(QLabel('Supported File Formats'))
2232
lay.addWidget(self.__listWidget)
33+
lay.setContentsMargins(0, 0, 0, 0)
2334
self.setLayout(lay)
2435

2536
def __sendCheckedSignal(self, r_idx, state):
26-
print(r_idx, state)
37+
self.checkedSignal.emit(self.__listWidget.getCheckedItemsText())

pyqt_openai/chat_widget/right_sidebar/usingAPIPage.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -279,7 +279,7 @@ def __initUi(self):
279279
self.__llamaChkBox = QCheckBox()
280280
self.__llamaChkBox.setChecked(self.__use_llama_index)
281281
self.__llamaChkBox.toggled.connect(self.__use_llama_indexChecked)
282-
self.__llamaChkBox.setText(LangClass.TRANSLATIONS["Use LlamaIndex"])
282+
self.__llamaChkBox.setText(LangClass.TRANSLATIONS["Use LlamaIndex (You need OpenAI API key)"])
283283

284284
lay = QVBoxLayout()
285285
lay.addWidget(manualBrowser)

pyqt_openai/util/common.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -578,7 +578,7 @@ def get_chat_model(is_g4f=False):
578578
else:
579579
all_models = []
580580
for obj in DEFAULT_API_CONFIGS:
581-
all_models.extend(obj["model_list"])
581+
all_models.extend(obj.get("model_list", []))
582582
return all_models
583583

584584
def get_gemini_argument(model, system, messages, cur_text, stream, images):
@@ -678,7 +678,7 @@ def get_message_obj(role, content):
678678
# Check which provider a specific model belongs to
679679
def get_provider_from_model(model):
680680
for obj in DEFAULT_API_CONFIGS:
681-
if model in obj["model_list"]:
681+
if model in obj.get("model_list", []):
682682
return obj["display_name"]
683683
return None
684684

0 commit comments

Comments
 (0)