Skip to content

Commit 8334903

Browse files
committed
chore: code lint
1 parent eefda2c commit 8334903

File tree

141 files changed

+4002
-2735
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

141 files changed

+4002
-2735
lines changed

.pre-commit-config.yaml

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
repos:
2+
- repo: https://github.com/PyCQA/isort
3+
rev: 6.0.0
4+
hooks:
5+
- id: isort
6+
name: isort (python3)
7+
language_version: python3
8+
args: ["--atomic"]
9+
10+
- repo: https://github.com/myint/autoflake
11+
rev: v2.3.0
12+
hooks:
13+
- id: autoflake
14+
args:
15+
[
16+
"--remove-all-unused-imports",
17+
"--in-place",
18+
"--recursive",
19+
]

framework/config/config_loader.py

Lines changed: 15 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,14 @@
1+
import os
2+
import shutil
13
from functools import wraps
2-
import sys
3-
import warnings
4-
from ruamel.yaml import YAML
5-
from pydantic import BaseModel, ValidationError
64
from typing import Type
7-
import shutil
8-
import os
5+
6+
from pydantic import BaseModel, ValidationError
7+
from ruamel.yaml import YAML
98

109
from framework.logger import get_logger
1110

11+
1212
class ConfigLoader:
1313
"""
1414
配置文件加载器,支持加载和保存 YAML 文件,并保留注释。
@@ -42,7 +42,7 @@ def save_config(config_path: str, config_object: BaseModel):
4242
"""
4343
with open(config_path, "w", encoding="utf-8") as f:
4444
ConfigLoader.yaml.dump(config_object.model_dump(), f)
45-
45+
4646
@staticmethod
4747
def save_config_with_backup(config_path: str, config_object: BaseModel):
4848
"""
@@ -55,9 +55,11 @@ def save_config_with_backup(config_path: str, config_object: BaseModel):
5555
backup_path = f"{config_path}.bak"
5656
shutil.copy2(config_path, backup_path)
5757
ConfigLoader.save_config(config_path, config_object)
58-
58+
59+
5960
def pydantic_validation_wrapper(func):
6061
logger = get_logger("ConfigLoader")
62+
6163
@wraps(func)
6264
def wrapper(*args, **kwargs):
6365
try:
@@ -66,9 +68,12 @@ def wrapper(*args, **kwargs):
6668
# 使用 loguru 输出错误信息
6769
logger.error(f"Pydantic 验证错误: '{e.title}':")
6870
for error in e.errors():
69-
logger.error(f"字段: {error['loc'][0]}, 错误类型: {error['type']}, 错误信息: {error['msg']}")
71+
logger.error(
72+
f"字段: {error['loc'][0]}, 错误类型: {error['type']}, 错误信息: {error['msg']}"
73+
)
7074
# 记录堆栈跟踪
7175

7276
logger.opt(exception=True).error("堆栈跟踪如下:")
7377
raise # 可以选择重新抛出异常,或者处理异常后返回一个默认值
74-
return wrapper
78+
79+
return wrapper

framework/config/global_config.py

Lines changed: 28 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -5,57 +5,70 @@
55

66
class IMConfig(BaseModel):
77
"""IM配置"""
8+
89
name: str = Field(default="", description="IM标识名称")
910
enable: bool = Field(default=True, description="是否启用IM")
1011
adapter: str = Field(default="dummy", description="IM适配器类型")
1112
config: Dict[str, Any] = Field(default={}, description="IM的配置")
1213

14+
1315
class LLMBackendConfig(BaseModel):
1416
"""LLM后端配置"""
17+
1518
name: str = Field(description="后端标识名称")
1619
adapter: str = Field(description="LLM适配器类型")
1720
config: Dict[str, Any] = Field(default={}, description="后端配置")
1821
enable: bool = Field(default=True, description="是否启用")
1922
models: List[str] = Field(default=[], description="支持的模型列表")
2023

24+
2125
class LLMConfig(BaseModel):
22-
api_backends: List[LLMBackendConfig] = Field(default=[], description="LLM API后端列表")
26+
api_backends: List[LLMBackendConfig] = Field(
27+
default=[], description="LLM API后端列表"
28+
)
29+
2330

2431
class DefaultConfig(BaseModel):
25-
llm_model: str = Field(default="gemini-1.5-flash", description="默认使用的 LLM 模型名称")
32+
llm_model: str = Field(
33+
default="gemini-1.5-flash", description="默认使用的 LLM 模型名称"
34+
)
35+
2636

2737
class MemoryPersistenceConfig(BaseModel):
2838
type: str = Field(default="file", description="持久化类型: file/redis")
2939
file: Dict[str, Any] = Field(
30-
default={
31-
"storage_dir": "./data/memory"
32-
},
33-
description="文件持久化配置"
40+
default={"storage_dir": "./data/memory"}, description="文件持久化配置"
3441
)
3542
redis: Dict[str, Any] = Field(
36-
default={
37-
"host": "localhost",
38-
"port": 6379,
39-
"db": 0
40-
},
41-
description="Redis持久化配置"
43+
default={"host": "localhost", "port": 6379, "db": 0},
44+
description="Redis持久化配置",
4245
)
4346

47+
4448
class MemoryConfig(BaseModel):
4549
persistence: MemoryPersistenceConfig = MemoryPersistenceConfig()
4650
max_entries: int = Field(default=100, description="每个作用域最大记忆条目数")
4751
default_scope: str = Field(default="member", description="默认作用域类型")
48-
52+
53+
4954
class WebConfig(BaseModel):
5055
host: str = Field(default="127.0.0.1", description="Web服务绑定的IP地址")
5156
port: int = Field(default=8080, description="Web服务端口号")
5257
secret_key: str = Field(default="", description="Web服务的密钥,用于JWT等加密")
53-
password_file: str = Field(default="./data/web/password.hash", description="密码哈希存储路径")
58+
password_file: str = Field(
59+
default="./data/web/password.hash", description="密码哈希存储路径"
60+
)
61+
5462

5563
class PluginConfig(BaseModel):
5664
"""插件配置"""
65+
5766
enable: List[str] = Field(default=[], description="启用的外部插件列表")
58-
market_base_url: str = Field(default="https://kirara-plugin.app.lss233.com/api/v1", description="插件市场基础URL")
67+
market_base_url: str = Field(
68+
default="https://kirara-plugin.app.lss233.com/api/v1",
69+
description="插件市场基础URL",
70+
)
71+
5972

6073
class GlobalConfig(BaseModel):
6174
ims: List[IMConfig] = Field(default=[], description="IM配置列表")

framework/events/event.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,4 +25,4 @@ def decorator(func: Callable):
2525

2626
return func
2727

28-
return decorator
28+
return decorator

framework/events/event_bus.py

Lines changed: 10 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
import inspect
2-
from typing import Callable, Type, Dict, List
2+
from typing import Callable, Dict, List, Type
3+
34

45
class EventBus:
56
def __init__(self):
@@ -20,24 +21,26 @@ def post(self, event):
2021
for listener in self._listeners[event_type]:
2122
listener(event)
2223

24+
2325
def Event(event_bus: EventBus):
2426
def decorator(func: Callable):
2527
# 获取函数的参数签名
2628
signature = inspect.signature(func)
2729
params = list(signature.parameters.values())
28-
30+
2931
# 假设第一个参数是事件类型
3032
if len(params) == 0:
3133
raise ValueError("Listener function must have at least one parameter")
32-
34+
3335
event_type = params[0].annotation
34-
36+
3537
# 如果没有指定类型注解,抛出异常
3638
if event_type == inspect.Parameter.empty:
3739
raise ValueError("Listener function must have an annotated first parameter")
38-
40+
3941
# 注册监听器
4042
event_bus.register(event_type, func)
41-
43+
4244
return func
43-
return decorator
45+
46+
return decorator

framework/im/adapter.py

Lines changed: 14 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,41 +1,50 @@
11
from abc import ABC, abstractmethod
22
from typing import Any, Protocol
3+
34
from typing_extensions import runtime_checkable
5+
46
from framework.im.message import IMMessage
57
from framework.im.sender import ChatSender
68
from framework.llm.llm_manager import LLMManager
9+
710
from .profile import UserProfile
811

12+
913
@runtime_checkable
1014
class EditStateAdapter(Protocol):
1115
"""
1216
编辑状态适配器接口,定义了如何设置或取消对话的编辑状态
1317
"""
14-
async def set_chat_editing_state(self, chat_sender: ChatSender, is_editing: bool = True):
18+
19+
async def set_chat_editing_state(
20+
self, chat_sender: ChatSender, is_editing: bool = True
21+
):
1522
"""
1623
设置或取消对话的编辑状态
1724
:param chat_sender: 对话的发送者
1825
:param is_editing: True 表示正在编辑,False 表示取消编辑状态
1926
"""
20-
pass
27+
2128

2229
@runtime_checkable
2330
class UserProfileAdapter(Protocol):
2431
"""
2532
用户资料查询适配器接口,定义了如何获取用户资料
2633
"""
34+
2735
async def query_user_profile(self, chat_sender: ChatSender) -> UserProfile:
2836
"""
2937
查询用户资料
3038
:param chat_sender: 用户的聊天发送者信息
3139
:return: 用户资料
3240
"""
33-
pass
41+
3442

3543
class IMAdapter(ABC):
3644
"""
3745
通用的 IM 适配器接口,定义了如何将不同平台的原始消息转换为 Message 对象。
3846
"""
47+
3948
llm_manager: LLMManager
4049

4150
@abstractmethod
@@ -45,7 +54,6 @@ def convert_to_message(self, raw_message: Any) -> IMMessage:
4554
:param raw_message: 平台的原始消息对象。
4655
:return: 转换后的 Message 对象。
4756
"""
48-
pass
4957

5058
@abstractmethod
5159
async def send_message(self, message: IMMessage, recipient: Any):
@@ -54,12 +62,11 @@ async def send_message(self, message: IMMessage, recipient: Any):
5462
:param message: 要发送的消息对象。
5563
:param recipient: 接收消息的目标对象,可以是用户ID、用户对象、群组ID等,具体由各平台实现决定。
5664
"""
57-
pass
5865

5966
@abstractmethod
6067
async def start(self):
6168
pass
62-
69+
6370
@abstractmethod
6471
async def stop(self):
65-
pass
72+
pass

framework/im/im_registry.py

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,10 @@
11
from typing import Dict, Type
2+
23
from pydantic import BaseModel
34

45
from framework.im.adapter import IMAdapter
56

7+
68
class IMRegistry:
79
"""
810
适配器注册表,用于动态注册和管理 adapter。
@@ -11,7 +13,9 @@ class IMRegistry:
1113
_registry: Dict[str, Type[IMAdapter]] = {}
1214
_config_registry: Dict[str, Type[BaseModel]] = {}
1315

14-
def register(self, name: str, adapter_class: Type[IMAdapter], config_class: Type[BaseModel]):
16+
def register(
17+
self, name: str, adapter_class: Type[IMAdapter], config_class: Type[BaseModel]
18+
):
1519
"""
1620
注册一个新的 adapter 及其配置类。
1721
:param name: adapter 的名称。
@@ -20,7 +24,7 @@ def register(self, name: str, adapter_class: Type[IMAdapter], config_class: Type
2024
"""
2125
self._registry[name] = adapter_class
2226
self._config_registry[name] = config_class
23-
27+
2428
def unregister(self, name: str):
2529
"""
2630
注销一个 adapter。
@@ -48,11 +52,10 @@ def get_config_class(self, name: str) -> Type[BaseModel]:
4852
if name not in self._config_registry:
4953
raise ValueError(f"Config class for adapter '{name}' is not registered.")
5054
return self._config_registry[name]
51-
55+
5256
def get_all_adapters(self) -> Dict[str, Type[IMAdapter]]:
5357
"""
5458
获取所有已注册的 adapter。
5559
:return: 所有已注册的 adapter。
5660
"""
5761
return self._registry
58-

0 commit comments

Comments
 (0)