Skip to content

Commit 7e2e67f

Browse files
committed
Merge branch 'dev' of https://github.com/MaiM-with-u/MaiBot into dev
2 parents 5fcedd1 + 59f6bcb commit 7e2e67f

6 files changed

Lines changed: 95 additions & 98 deletions

File tree

plugins/example_plugin/plugin.py

Lines changed: 12 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -59,14 +59,14 @@ class SmartGreetingAction(BaseAction):
5959
# ===== 功能定义必须项 =====
6060
action_parameters = {
6161
"username": "要问候的用户名(可选)",
62-
"greeting_style": "问候风格:casual(随意)、formal(正式)、friendly(友好),默认casual"
62+
"greeting_style": "问候风格:casual(随意)、formal(正式)、friendly(友好),默认casual",
6363
}
6464

6565
action_require = [
6666
"用户发送包含问候词汇的消息时使用",
67-
"检测到新用户加入时使用",
67+
"检测到新用户加入时使用",
6868
"响应友好交流需求时使用",
69-
"避免在短时间内重复问候同一用户"
69+
"避免在短时间内重复问候同一用户",
7070
]
7171

7272
associated_types = ["text", "emoji"]
@@ -115,12 +115,12 @@ async def _generate_template_greeting(self, template: str, username: str, style:
115115
style_templates = {
116116
"casual": "嗨{username}!很开心见到你~",
117117
"formal": "您好{username},很荣幸为您服务!",
118-
"friendly": "你好{username}!欢迎来到这里,希望我们能成为好朋友!😊"
118+
"friendly": "你好{username}!欢迎来到这里,希望我们能成为好朋友!😊",
119119
}
120120

121121
selected_template = style_templates.get(style, template)
122122
username_display = f" {username}" if username else ""
123-
123+
124124
return selected_template.format(username=username_display)
125125

126126
async def _generate_llm_greeting(self, username: str, style: str) -> str:
@@ -150,7 +150,7 @@ async def _generate_llm_greeting(self, username: str, style: str) -> str:
150150
model_config=model_config,
151151
request_type="plugin.greeting",
152152
temperature=0.7,
153-
max_tokens=100
153+
max_tokens=100,
154154
)
155155

156156
if success and response:
@@ -201,14 +201,14 @@ class HelpfulAction(BaseAction):
201201
action_parameters = {
202202
"help_type": "帮助类型:explanation(解释)、suggestion(建议)、guidance(指导)、tips(提示)",
203203
"topic": "帮助主题或用户关心的问题",
204-
"complexity": "复杂度:simple(简单)、medium(中等)、advanced(高级)"
204+
"complexity": "复杂度:simple(简单)、medium(中等)、advanced(高级)",
205205
}
206206

207207
action_require = [
208208
"用户表达困惑或寻求帮助时使用",
209209
"检测到用户遇到技术问题时使用",
210210
"对话中出现知识盲点时主动提供帮助",
211-
"避免过度频繁地提供帮助,要恰到好处"
211+
"避免过度频繁地提供帮助,要恰到好处",
212212
]
213213

214214
associated_types = ["text", "emoji"]
@@ -246,7 +246,7 @@ async def _generate_help_message(self, help_type: str, topic: str, complexity: s
246246
"""生成帮助消息"""
247247
# 获取配置
248248
enable_llm = self.api.get_config("help.enable_llm", False)
249-
249+
250250
if enable_llm:
251251
return await self._generate_llm_help(help_type, topic, complexity)
252252
else:
@@ -258,11 +258,11 @@ async def _generate_template_help(self, help_type: str, topic: str, complexity:
258258
"explanation": f"关于{topic},我来为你解释一下:这是一个{complexity}级别的概念...",
259259
"suggestion": f"针对{topic},我建议你可以尝试以下方法...",
260260
"guidance": f"在{topic}方面,我可以为你提供一些指导...",
261-
"tips": f"关于{topic},这里有一些实用的小贴士..."
261+
"tips": f"关于{topic},这里有一些实用的小贴士...",
262262
}
263263

264264
base_message = help_templates.get(help_type, f"关于{topic},我很乐意为你提供帮助!")
265-
265+
266266
# 根据复杂度调整消息
267267
if complexity == "advanced":
268268
base_message += "\n\n这个话题比较深入,需要一些基础知识。"
@@ -291,11 +291,7 @@ async def _generate_llm_help(self, help_type: str, topic: str, complexity: str)
291291

292292
model_config = next(iter(models.values()))
293293
success, response, reasoning, model_name = await self.api.generate_with_model(
294-
prompt=prompt,
295-
model_config=model_config,
296-
request_type="plugin.help",
297-
temperature=0.7,
298-
max_tokens=300
294+
prompt=prompt, model_config=model_config, request_type="plugin.help", temperature=0.7, max_tokens=300
299295
)
300296

301297
if success and response:

src/plugin_system/base/base_action.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -366,7 +366,7 @@ async def send_message_by_replyer(self, target: str = "", extra_info_block: str
366366
@classmethod
367367
def get_action_info(cls) -> "ActionInfo":
368368
"""从类属性生成ActionInfo
369-
369+
370370
所有信息都从类属性中读取,确保一致性和完整性。
371371
Action类必须定义所有必要的类属性。
372372
@@ -376,7 +376,7 @@ def get_action_info(cls) -> "ActionInfo":
376376

377377
# 从类属性读取名称,如果没有定义则使用类名自动生成
378378
name = getattr(cls, "action_name", cls.__name__.lower().replace("action", ""))
379-
379+
380380
# 从类属性读取描述,如果没有定义则使用文档字符串的第一行
381381
description = getattr(cls, "action_description", None)
382382
if description is None:

src/plugin_system/base/component_types.py

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -36,17 +36,17 @@ class ChatMode(Enum):
3636
@dataclass
3737
class PythonDependency:
3838
"""Python包依赖信息"""
39-
39+
4040
package_name: str # 包名称
4141
version: str = "" # 版本要求,例如: ">=1.0.0", "==2.1.3", ""表示任意版本
4242
optional: bool = False # 是否为可选依赖
4343
description: str = "" # 依赖描述
4444
install_name: str = "" # 安装时的包名(如果与import名不同)
45-
45+
4646
def __post_init__(self):
4747
if not self.install_name:
4848
self.install_name = self.package_name
49-
49+
5050
def get_pip_requirement(self) -> str:
5151
"""获取pip安装格式的依赖字符串"""
5252
if self.version:
@@ -141,7 +141,7 @@ def __post_init__(self):
141141
self.python_dependencies = []
142142
if self.metadata is None:
143143
self.metadata = {}
144-
144+
145145
def get_missing_packages(self) -> List[PythonDependency]:
146146
"""检查缺失的Python包"""
147147
missing = []
@@ -152,7 +152,7 @@ def get_missing_packages(self) -> List[PythonDependency]:
152152
if not dep.optional:
153153
missing.append(dep)
154154
return missing
155-
155+
156156
def get_pip_requirements(self) -> List[str]:
157157
"""获取所有pip安装格式的依赖"""
158158
return [dep.get_pip_requirement() for dep in self.python_dependencies]

src/plugin_system/core/dependency_manager.py

Lines changed: 40 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -7,8 +7,7 @@
77
import subprocess
88
import sys
99
import importlib
10-
from typing import List, Dict, Tuple, Optional
11-
from pathlib import Path
10+
from typing import List, Dict, Tuple
1211

1312
from src.common.logger import get_logger
1413
from src.plugin_system.base.component_types import PythonDependency
@@ -22,19 +21,21 @@ class DependencyManager:
2221
def __init__(self):
2322
self.install_log: List[str] = []
2423
self.failed_installs: Dict[str, str] = {}
25-
26-
def check_dependencies(self, dependencies: List[PythonDependency]) -> Tuple[List[PythonDependency], List[PythonDependency]]:
24+
25+
def check_dependencies(
26+
self, dependencies: List[PythonDependency]
27+
) -> Tuple[List[PythonDependency], List[PythonDependency]]:
2728
"""检查依赖包状态
28-
29+
2930
Args:
3031
dependencies: 依赖包列表
31-
32+
3233
Returns:
3334
Tuple[List[PythonDependency], List[PythonDependency]]: (缺失的依赖, 可选缺失的依赖)
3435
"""
3536
missing_required = []
3637
missing_optional = []
37-
38+
3839
for dep in dependencies:
3940
if not self._is_package_available(dep.package_name):
4041
if dep.optional:
@@ -45,71 +46,71 @@ def check_dependencies(self, dependencies: List[PythonDependency]) -> Tuple[List
4546
logger.error(f"必需依赖包缺失: {dep.package_name} - {dep.description}")
4647
else:
4748
logger.debug(f"依赖包已存在: {dep.package_name}")
48-
49+
4950
return missing_required, missing_optional
50-
51+
5152
def _is_package_available(self, package_name: str) -> bool:
5253
"""检查包是否可用"""
5354
try:
5455
importlib.import_module(package_name)
5556
return True
5657
except ImportError:
5758
return False
58-
59+
5960
def install_dependencies(self, dependencies: List[PythonDependency], auto_install: bool = False) -> bool:
6061
"""安装依赖包
61-
62+
6263
Args:
6364
dependencies: 需要安装的依赖包列表
6465
auto_install: 是否自动安装(True时不询问用户)
65-
66+
6667
Returns:
6768
bool: 安装是否成功
6869
"""
6970
if not dependencies:
7071
return True
71-
72+
7273
logger.info(f"需要安装 {len(dependencies)} 个依赖包")
73-
74+
7475
# 显示将要安装的包
7576
for dep in dependencies:
7677
install_cmd = dep.get_pip_requirement()
7778
logger.info(f" - {install_cmd} {'(可选)' if dep.optional else '(必需)'}")
7879
if dep.description:
7980
logger.info(f" 说明: {dep.description}")
80-
81+
8182
if not auto_install:
8283
# 这里可以添加用户确认逻辑
8384
logger.warning("手动安装模式:请手动运行 pip install 命令安装依赖包")
8485
return False
85-
86+
8687
# 执行安装
8788
success_count = 0
8889
for dep in dependencies:
8990
if self._install_single_package(dep):
9091
success_count += 1
9192
else:
9293
self.failed_installs[dep.package_name] = f"安装失败: {dep.get_pip_requirement()}"
93-
94+
9495
logger.info(f"依赖安装完成: {success_count}/{len(dependencies)} 个成功")
9596
return success_count == len(dependencies)
96-
97+
9798
def _install_single_package(self, dependency: PythonDependency) -> bool:
9899
"""安装单个包"""
99100
pip_requirement = dependency.get_pip_requirement()
100-
101+
101102
try:
102103
logger.info(f"正在安装: {pip_requirement}")
103-
104+
104105
# 使用subprocess安装包
105106
cmd = [sys.executable, "-m", "pip", "install", pip_requirement]
106107
result = subprocess.run(
107108
cmd,
108109
capture_output=True,
109110
text=True,
110-
timeout=300 # 5分钟超时
111+
timeout=300, # 5分钟超时
111112
)
112-
113+
113114
if result.returncode == 0:
114115
logger.info(f"✅ 成功安装: {pip_requirement}")
115116
self.install_log.append(f"成功安装: {pip_requirement}")
@@ -119,28 +120,29 @@ def _install_single_package(self, dependency: PythonDependency) -> bool:
119120
logger.error(f"错误输出: {result.stderr}")
120121
self.install_log.append(f"安装失败: {pip_requirement} - {result.stderr}")
121122
return False
122-
123+
123124
except subprocess.TimeoutExpired:
124125
logger.error(f"❌ 安装超时: {pip_requirement}")
125126
return False
126127
except Exception as e:
127128
logger.error(f"❌ 安装异常: {pip_requirement} - {str(e)}")
128129
return False
129-
130-
def generate_requirements_file(self, plugins_dependencies: List[List[PythonDependency]],
131-
output_path: str = "plugin_requirements.txt") -> bool:
130+
131+
def generate_requirements_file(
132+
self, plugins_dependencies: List[List[PythonDependency]], output_path: str = "plugin_requirements.txt"
133+
) -> bool:
132134
"""生成插件依赖的requirements文件
133-
135+
134136
Args:
135137
plugins_dependencies: 所有插件的依赖列表
136138
output_path: 输出文件路径
137-
139+
138140
Returns:
139141
bool: 生成是否成功
140142
"""
141143
try:
142144
all_deps = {}
143-
145+
144146
# 合并所有插件的依赖
145147
for plugin_deps in plugins_dependencies:
146148
for dep in plugin_deps:
@@ -152,39 +154,39 @@ def generate_requirements_file(self, plugins_dependencies: List[List[PythonDepen
152154
logger.warning(f"依赖版本冲突: {key} ({existing.version} vs {dep.version})")
153155
else:
154156
all_deps[key] = dep
155-
157+
156158
# 写入requirements文件
157159
with open(output_path, "w", encoding="utf-8") as f:
158160
f.write("# 插件依赖包自动生成\n")
159161
f.write("# Auto-generated plugin dependencies\n\n")
160-
162+
161163
# 按包名排序
162164
sorted_deps = sorted(all_deps.values(), key=lambda x: x.install_name)
163-
165+
164166
for dep in sorted_deps:
165167
requirement = dep.get_pip_requirement()
166168
if dep.description:
167169
f.write(f"# {dep.description}\n")
168170
if dep.optional:
169-
f.write(f"# Optional dependency\n")
171+
f.write("# Optional dependency\n")
170172
f.write(f"{requirement}\n\n")
171-
173+
172174
logger.info(f"已生成插件依赖文件: {output_path} ({len(all_deps)} 个包)")
173175
return True
174-
176+
175177
except Exception as e:
176178
logger.error(f"生成requirements文件失败: {str(e)}")
177179
return False
178-
180+
179181
def get_install_summary(self) -> Dict[str, any]:
180182
"""获取安装摘要"""
181183
return {
182184
"install_log": self.install_log.copy(),
183185
"failed_installs": self.failed_installs.copy(),
184186
"total_attempts": len(self.install_log),
185-
"failed_count": len(self.failed_installs)
187+
"failed_count": len(self.failed_installs),
186188
}
187189

188190

189191
# 全局依赖管理器实例
190-
dependency_manager = DependencyManager()
192+
dependency_manager = DependencyManager()

0 commit comments

Comments
 (0)