mirror of
https://github.com/yuruotong1/autoMate.git
synced 2026-03-22 13:07:17 +08:00
增加本地存储(未完成)
This commit is contained in:
@@ -9,7 +9,7 @@ from pages.edit_action_list_view import GlobalUtil, ActionListViewItem
|
||||
from utils.qt_util import QtUtil
|
||||
|
||||
|
||||
class FunctionBase:
|
||||
class ActionBase:
|
||||
name = ""
|
||||
description = ""
|
||||
args_schema: Type[BaseModel]
|
||||
@@ -18,14 +18,14 @@ class FunctionBase:
|
||||
self.__config_ui = None
|
||||
self.tool = None
|
||||
self.__ui_name_and_link_edit = {}
|
||||
self.tool_arg = {}
|
||||
self.action_arg = {}
|
||||
self.action_pos = None
|
||||
|
||||
def run(self, *args, **kwargs):
|
||||
raise TypeError("Not realize run function")
|
||||
|
||||
def run_with_out_arg(self):
|
||||
return self.run(**self.tool_arg)
|
||||
return self.run(**self.action_arg)
|
||||
|
||||
def convert_langchain_tool(self):
|
||||
return StructuredTool.from_function(
|
||||
@@ -62,7 +62,7 @@ class FunctionBase:
|
||||
|
||||
def __save_button_clicked(self):
|
||||
for arg_name in self.__ui_name_and_link_edit:
|
||||
self.tool_arg[arg_name] = self.__ui_name_and_link_edit[arg_name].text()
|
||||
self.action_arg[arg_name] = self.__ui_name_and_link_edit[arg_name].text()
|
||||
# 如果双击应用列表打开的配置页面,保存后向应用列表最后插入
|
||||
if self.action_pos is None:
|
||||
self.action_pos = GlobalUtil.action_list_global.count()
|
||||
19
actions/action_list.py
Normal file
19
actions/action_list.py
Normal file
@@ -0,0 +1,19 @@
|
||||
from actions.llm_func import LLMAction
|
||||
from actions.open_application_func import OpenApplicationFunc
|
||||
from actions.open_browser_url_func import OpenBrowserUrlAction
|
||||
from actions.search_engine_func import SearchEngineFunc
|
||||
|
||||
|
||||
class ActionList:
|
||||
funcs = [OpenApplicationFunc(), OpenBrowserUrlAction(), SearchEngineFunc(), LLMAction()]
|
||||
|
||||
@classmethod
|
||||
def get_funcs(cls):
|
||||
return cls.funcs
|
||||
|
||||
@classmethod
|
||||
def get_fuc_by_name(cls, name):
|
||||
for i in cls.funcs:
|
||||
if i.name == name:
|
||||
return i
|
||||
return None
|
||||
@@ -1,8 +1,6 @@
|
||||
from langchain_core.messages import SystemMessage, HumanMessage
|
||||
from langchain_openai import ChatOpenAI
|
||||
from pydantic import BaseModel, Field
|
||||
|
||||
from functions.function_base import FunctionBase
|
||||
from actions.action_base import ActionBase
|
||||
from utils.llm_util import LLMUtil
|
||||
|
||||
|
||||
@@ -10,7 +8,7 @@ class LLMInput(BaseModel):
|
||||
question: str = Field(description="需要问的问题", title="问题内容")
|
||||
|
||||
|
||||
class LLMFunc(FunctionBase):
|
||||
class LLMAction(ActionBase):
|
||||
name = "大模型问答"
|
||||
description = "利用大模型进行回答"
|
||||
args_schema = LLMInput
|
||||
@@ -3,14 +3,14 @@ from typing import Type
|
||||
|
||||
from pydantic import BaseModel, Field
|
||||
|
||||
from functions.function_base import FunctionBase
|
||||
from actions.action_base import ActionBase
|
||||
|
||||
|
||||
class OpenApplicationInput(BaseModel):
|
||||
path: str = Field(description="要查询的关键词", title="应用路径")
|
||||
|
||||
|
||||
class OpenApplicationFunc(FunctionBase):
|
||||
class OpenApplicationAction(ActionBase):
|
||||
name = "打开应用"
|
||||
description = "打开指定目录的应用"
|
||||
args_schema: Type[BaseModel] = OpenApplicationInput
|
||||
@@ -1,8 +1,6 @@
|
||||
import subprocess
|
||||
from pydantic import BaseModel, Field
|
||||
|
||||
from data_class.search_data import SearchData
|
||||
from functions.function_base import FunctionBase
|
||||
from actions.action_base import ActionBase
|
||||
from utils.selenium_util import SeleniumUtil
|
||||
|
||||
|
||||
@@ -10,7 +8,7 @@ class OpenBrowserUrlInput(BaseModel):
|
||||
url: str = Field(description="要访问的网址", title="网址")
|
||||
|
||||
|
||||
class OpenBrowserUrlFunc(FunctionBase):
|
||||
class OpenBrowserUrlAction(ActionBase):
|
||||
name = "打开网页"
|
||||
description = "打开指定网址的页面"
|
||||
args_schema = OpenBrowserUrlInput
|
||||
@@ -1,8 +1,8 @@
|
||||
from pydantic import BaseModel, Field
|
||||
from selenium.webdriver.common.by import By
|
||||
|
||||
from actions.action_base import ActionBase
|
||||
from data_class.search_data import SearchData
|
||||
from functions.function_base import FunctionBase
|
||||
from utils.selenium_util import SeleniumUtil
|
||||
|
||||
|
||||
@@ -11,7 +11,7 @@ class SearchInput(BaseModel):
|
||||
|
||||
|
||||
# 利用搜索引擎搜索关键词
|
||||
class SearchEngineFunc(FunctionBase):
|
||||
class SearchEngineAction(ActionBase):
|
||||
name = "百度搜索内容"
|
||||
description = "利用搜索引擎搜索关键词,得到结果列表"
|
||||
args_schema = SearchInput
|
||||
@@ -1,19 +0,0 @@
|
||||
from functions.llm_func import LLMFunc
|
||||
from functions.open_application_func import OpenApplicationFunc
|
||||
from functions.open_browser_url_func import OpenBrowserUrlFunc
|
||||
from functions.search_engine_func import SearchEngineFunc
|
||||
|
||||
|
||||
class FunctionList:
|
||||
funcs = [OpenApplicationFunc(), OpenBrowserUrlFunc(), SearchEngineFunc(), LLMFunc()]
|
||||
|
||||
@classmethod
|
||||
def get_funcs(cls):
|
||||
return cls.funcs
|
||||
|
||||
@classmethod
|
||||
def get_fuc_by_name(cls, name):
|
||||
for i in cls.funcs:
|
||||
if i.name == name:
|
||||
return i
|
||||
return None
|
||||
@@ -1,3 +1,5 @@
|
||||
import pickle
|
||||
|
||||
from PyQt6.QtCore import Qt, QMimeData, QByteArray, QPoint
|
||||
from PyQt6.QtGui import QDrag
|
||||
from PyQt6.QtWidgets import QListWidget, QListWidgetItem, QApplication, QStyle
|
||||
@@ -17,6 +19,10 @@ class ActionListView(QListWidget):
|
||||
|
||||
def __init__(self):
|
||||
super().__init__()
|
||||
# 在func上的信息
|
||||
self.func_list_pos = [-1, -1]
|
||||
self.func_name = ""
|
||||
self.func_description = ""
|
||||
self.setAcceptDrops(True)
|
||||
# 拖动到当前位置对应的元素序号
|
||||
self.the_highlighted_row = -2
|
||||
@@ -29,6 +35,15 @@ class ActionListView(QListWidget):
|
||||
self.the_insert_row = 1
|
||||
# 不到一半行高:offset() = 19 = 40 / 2 - 1,其中40是行高
|
||||
self.offset = 19
|
||||
self.init()
|
||||
|
||||
def init(self):
|
||||
self.setStyleSheet(
|
||||
"QListView{background:rgb(245, 245, 247); border:0px; margin:0px 0px 0px 0px;}"
|
||||
"QListView::Item{height:40px; border:0px; padding-left:14px; color:rgba(200, 40, 40, 255);}"
|
||||
"QListView::Item:hover{color:rgba(40, 40, 200, 255); padding-left:14px;}"
|
||||
"QListView::Item:selected{color:rgba(40, 40, 200, 255); padding-left:15px;}")
|
||||
self.setItemDelegate(StyledItemDelegate())
|
||||
|
||||
# 记录拖拽初始位置
|
||||
def mousePressEvent(self, e):
|
||||
@@ -151,8 +166,8 @@ class ActionListView(QListWidget):
|
||||
return
|
||||
# 向指定行插入数据
|
||||
item_data = e.mimeData().data(self.my_mime_type)
|
||||
from functions.function_list import FunctionList
|
||||
function = FunctionList.get_fuc_by_name(item_data)
|
||||
from actions.action_list import ActionList
|
||||
function = ActionList.get_fuc_by_name(item_data)
|
||||
function.action_pos = self.the_insert_row
|
||||
function.config_page_show()
|
||||
# self.insertItem(self.the_insert_row, ActionListViewItem(function))
|
||||
@@ -164,14 +179,40 @@ class ActionListView(QListWidget):
|
||||
|
||||
|
||||
class GlobalUtil:
|
||||
action_list_global: ActionListView
|
||||
action_list_global: [ActionListView]
|
||||
|
||||
@classmethod
|
||||
def read_from_local(cls):
|
||||
with open("./cache", "rb") as file:
|
||||
cls.action_list_global = pickle.load(file)["action_list_global"]
|
||||
return cls.action_list_global
|
||||
|
||||
@classmethod
|
||||
def init(cls):
|
||||
cls.action_list_global = ActionListView()
|
||||
cls.action_list_global.setStyleSheet(
|
||||
"QListView{background:rgb(245, 245, 247); border:0px; margin:0px 0px 0px 0px;}"
|
||||
"QListView::Item{height:40px; border:0px; padding-left:14px; color:rgba(200, 40, 40, 255);}"
|
||||
"QListView::Item:hover{color:rgba(40, 40, 200, 255); padding-left:14px;}"
|
||||
"QListView::Item:selected{color:rgba(40, 40, 200, 255); padding-left:15px;}")
|
||||
cls.action_list_global.setItemDelegate(StyledItemDelegate())
|
||||
# 根据配置文件的配置,从本地文件中或者网上读取
|
||||
from utils.config import Config
|
||||
config = Config()
|
||||
cls.action_list_global = []
|
||||
if config.DATA_POSITION == "local":
|
||||
action_list_json = cls.read_from_local()
|
||||
elif config.DATA_POSITION == "remote":
|
||||
action_list_json = []
|
||||
else:
|
||||
action_list_json = []
|
||||
# 生成ActionListView
|
||||
for action_json in action_list_json:
|
||||
action_list_view = ActionListView()
|
||||
action_list_view.func_list_pos = action_json["func_list_pos"]
|
||||
action_list_view.func_name = action_json["func_name"]
|
||||
action_list_view.func_description = action_json["func_description"]
|
||||
for item in action_json["action_items"]:
|
||||
action_name = item["action_name"]
|
||||
action_arg = item["action_arg"]
|
||||
action_pos = item["action_pos"]
|
||||
from actions.action_list import ActionList
|
||||
from actions.action_base import ActionBase
|
||||
action: ActionBase = ActionList.get_fuc_by_name(action_name)()
|
||||
action.action_pos = action_pos
|
||||
action.action_arg = action_arg
|
||||
action_list_view.insertItem(item["row"], ActionListViewItem(action))
|
||||
cls.action_list_global.append(action_list_view)
|
||||
|
||||
@@ -11,11 +11,24 @@ class EditPage(BasePage):
|
||||
self.ui.function_list_layout.addWidget(function_list_view)
|
||||
self.ui.ListViewLayout.addWidget(GlobalUtil.action_list_global)
|
||||
self.ui.run_button.clicked.connect(self.__run_button_click)
|
||||
self.ui.save_button.clicked.connect()
|
||||
self.ui.cancel_button.clicked.connect()
|
||||
# 设置间距
|
||||
self.ui.ListViewLayout.setStretch(0, 1)
|
||||
self.ui.ListViewLayout.setStretch(1, 2)
|
||||
self.ui.ListViewLayout.setStretch(2, 10)
|
||||
|
||||
def __save_button_click(self):
|
||||
GlobalUtil.action_list_global
|
||||
self.ui.hide()
|
||||
self.func = FunctionListView()
|
||||
self.func.show()
|
||||
|
||||
def __cancel_button_click(self):
|
||||
self.ui.hide()
|
||||
self.func = FunctionListView()
|
||||
self.func.show()
|
||||
|
||||
def __run_button_click(self):
|
||||
GlobalUtil.action_list_global.model()
|
||||
for index in range(GlobalUtil.action_list_global.count()):
|
||||
|
||||
@@ -12,9 +12,11 @@ class Config:
|
||||
self.OPEN_AI = self.config["openai"]
|
||||
self.BROWSER = self.config["browser"]
|
||||
self.LEAN_CLOUD = self.config["leancloud"]
|
||||
self.DATA_POSITION = self.config["data_position"]
|
||||
|
||||
@staticmethod
|
||||
# Load content from a yaml file and return as variables
|
||||
def _load_config(self, file_path):
|
||||
def _load_config(file_path):
|
||||
with open(file_path, 'r') as file:
|
||||
config = yaml.safe_load(file)
|
||||
return config
|
||||
|
||||
Reference in New Issue
Block a user