From 9bbcf9e7498dc7bb4a7ba39d1731e4f900d47c31 Mon Sep 17 00:00:00 2001 From: yuruo Date: Wed, 10 Apr 2024 15:07:11 +0800 Subject: [PATCH] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E9=85=8D=E7=BD=AE=E9=A1=B5?= =?UTF-8?q?=E9=9D=A2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore | 2 +- config.yaml.tmp | 3 -- pages/chat_page.py | 28 +++++++++- pages/chat_page.ui | 38 ++++--------- pages/setting_page.ui | 120 +++++++++++++++++++++++++++++++++++++++++ pyproject.toml | 3 +- utils/config.py | 28 ++++++++-- utils/llm_util.py | 9 ++-- utils/selenium_util.py | 2 +- 9 files changed, 190 insertions(+), 43 deletions(-) create mode 100644 pages/setting_page.ui diff --git a/.gitignore b/.gitignore index df278f4..d41e60e 100644 --- a/.gitignore +++ b/.gitignore @@ -2,7 +2,7 @@ # Ignore IDE and editor files .idea/ .vscode/ - +dist/ # Ignore environment-specific files .venv config.yaml diff --git a/config.yaml.tmp b/config.yaml.tmp index d2600a4..c8f5d96 100644 --- a/config.yaml.tmp +++ b/config.yaml.tmp @@ -1,6 +1,3 @@ -browser: - browser_type: edge - openai: # key api_key: xxx diff --git a/pages/chat_page.py b/pages/chat_page.py index 89d8d00..2a74679 100644 --- a/pages/chat_page.py +++ b/pages/chat_page.py @@ -5,6 +5,7 @@ from PyQt6.QtWidgets import QLabel, QTextEdit, QListWidgetItem, QSpacerItem, QSi from agent.woker_agent import WorkerAgent from pages.bse_page import BasePage +from utils.config import Config from utils.qt_util import QtUtil @@ -42,6 +43,10 @@ class ChatInput(QTextEdit): class ChatPage(BasePage): + def __init__(self): + super().__init__() + self.setting_page = None + def setup_up(self): self.ui = QtUtil.load_ui("chat_page.ui") self.ui.text_edit = ChatInput() @@ -61,9 +66,30 @@ class ChatPage(BasePage): # 设置 QListWidget 的焦点策略为 NoFocus self.ui.chat_list.setFocusPolicy(Qt.FocusPolicy.NoFocus) # self.ui.select_action.clicked.connect(self.select_action_clicked) + setting_action = self.ui.setting_action + setting_action.triggered.connect(self.open_setting_page) + + def open_setting_page(self): + self.setting_page = QtUtil.load_ui("setting_page.ui") + config = Config() + self.setting_page.openai_key.setText(config.OPEN_AI.get("openai_key")) + self.setting_page.openai_url.setText(config.OPEN_AI.get("openai_url")) + self.setting_page.openai_model.setText(config.OPEN_AI.get("openai_model")) + self.setting_page.save_btn.clicked.connect(self.save_setting) + self.setting_page.cancel_btn.clicked.connect(self.cancel_btn) + self.setting_page.show() + + def save_setting(self): + config = Config() + config.update_config(Config.OPENAI, Config.OPENAI_KEY, self.setting_page.openai_key.text()) + config.update_config(Config.OPENAI, Config.OPENAI_URL, self.setting_page.openai_url.text()) + config.update_config(Config.OPENAI, Config.OPENAI_MODEL, self.setting_page.openai_model.text()) + self.setting_page.close() + + def cancel_btn(self): + self.setting_page.close() def hide_action(self, event): - print("hello") action_widget = self.ui.action_widget if not QRect(action_widget.mapToGlobal(QPoint(0, 0)), action_widget.size()).contains(event.globalPos()): action_widget.hide() diff --git a/pages/chat_page.ui b/pages/chat_page.ui index 0cfd26a..8d5658e 100644 --- a/pages/chat_page.ui +++ b/pages/chat_page.ui @@ -40,19 +40,6 @@ border-radius: 30px - - - - - - - - - - - - - @@ -116,26 +103,21 @@ border: none; 22 - + - 主页 + 文件 + + - - - 个人空间 - - - - - 商店 - - - - - + + + + 设置 + + diff --git a/pages/setting_page.ui b/pages/setting_page.ui new file mode 100644 index 0000000..1161312 --- /dev/null +++ b/pages/setting_page.ui @@ -0,0 +1,120 @@ + + + setting_window + + + + 0 + 0 + 606 + 443 + + + + 设置 + + + + + + 160 + 70 + 341 + 181 + + + + + + + + + openai_key + + + + + + + + + + + + + + openai_url + + + + + + + https://api.fast-tunnel.one/v1/ + + + + + + + + + + + model + + + + + + + gpt-4-1106-preview + + + + + + + + + + + 380 + 330 + 75 + 23 + + + + 保存 + + + + + + 480 + 330 + 75 + 23 + + + + 取消 + + + + + + + 0 + 0 + 606 + 22 + + + + + + + + diff --git a/pyproject.toml b/pyproject.toml index 1f2bb29..b5df1f8 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -6,7 +6,7 @@ authors = ["yuruotong"] readme = "README.md" [tool.poetry.dependencies] -python = "^3.9" +python = ">=3.9,<3.13" PyYAML = "6.0.1" requests = "2.31.0" selenium = "4.16.0" @@ -18,6 +18,7 @@ pyqt6 = "^6.6.1" leancloud = "^2.9.12" pyautogui = "^0.9.54" langchainhub = "^0.1.15" +pyinstaller = "^6.5.0" [build-system] diff --git a/utils/config.py b/utils/config.py index bd4b2ad..c0d7bfb 100644 --- a/utils/config.py +++ b/utils/config.py @@ -4,13 +4,20 @@ import yaml class Config: + OPENAI_KEY = "openai_key" + OPENAI_URL = "openai_url" + OPENAI_MODEL = "openai_model" + OPENAI = "openai" + BROWSER = "browser" + def __init__(self): # 项目根目录 project_root_path = os.path.abspath(os.path.dirname(__file__)) + self.path = os.path.join(project_root_path, "..", "config.yaml") # 上一层目录 - self.config = self._load_config(os.path.join(project_root_path, "..", "config.yaml")) - self.OPEN_AI = self.config["openai"] - self.BROWSER = self.config["browser"] + self.config = self._load_config(self.path) + self.OPEN_AI = self.config[self.OPENAI] + self.BROWSER_CONFIG = self.config[self.BROWSER] self.DATA_POSITION = self.config["data_position"] self.LEAN_CLOUD = None if self.DATA_POSITION == "remote": @@ -19,6 +26,21 @@ class Config: @staticmethod # Load content from a yaml file and return as variables def _load_config(file_path): + # 如果文件不存在,则生成一个yaml文件 + if not os.path.exists(file_path): + with open(file_path, 'w') as file: + data = {Config.OPENAI: {Config.OPENAI_KEY: "your_api_key", + Config.OPENAI_URL: "https://api.openai.com/v1/", + Config.OPENAI_MODEL: "gpt-4-1106-preview"}, + "data_position": "local", + Config.BROWSER: "edge"} + yaml.dump(data, file) + with open(file_path, 'r') as file: config = yaml.safe_load(file) return config + + def update_config(self, loc, key, value): + self.config[loc][key] = value + with open(self.path, 'w') as file: + yaml.dump(self.config, file) diff --git a/utils/llm_util.py b/utils/llm_util.py index d963866..911717a 100644 --- a/utils/llm_util.py +++ b/utils/llm_util.py @@ -5,12 +5,11 @@ class LLM_Util: def __init__(self): super().__init__() self.config = Config() - self.api_key = self.config.OPEN_AI.get("api_key") - self.base_url = self.config.OPEN_AI.get("api_url") - self.open_ai_model = self.config.OPEN_AI.get("model") - self.model_name = self.config.OPEN_AI.get("model_name", self.open_ai_model) + self.api_key = self.config.OPEN_AI.get(Config.OPENAI_KEY) + self.base_url = self.config.OPEN_AI.get(Config.OPENAI_URL) + self.open_ai_model = self.config.OPEN_AI.get(Config.OPENAI_MODEL) def llm(self): from langchain_openai import ChatOpenAI - return ChatOpenAI(temperature=0, model_name=self.model_name, openai_api_key=self.api_key, + return ChatOpenAI(temperature=0, model_name=self.open_ai_model, openai_api_key=self.api_key, openai_api_base=self.base_url) diff --git a/utils/selenium_util.py b/utils/selenium_util.py index 2f82c50..4a561a7 100644 --- a/utils/selenium_util.py +++ b/utils/selenium_util.py @@ -12,7 +12,7 @@ from utils.config import Config class SeleniumUtil: def __init__(self): config = Config() - browser_type = config.BROWSER.get("browser_type") + browser_type = config.BROWSER_CONFIG.get("browser_type") if browser_type == "chrome": options = webdriver.ChromeOptions() options.add_argument("--headless") # Enable headless mode