Skip to content

Commit fb3dff0

Browse files
committed
refactor: update project configuration and enhance reply module functionality
1 parent 41c6b0a commit fb3dff0

File tree

5 files changed

+95
-56
lines changed

5 files changed

+95
-56
lines changed

config/config.py

Lines changed: 24 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,22 +1,33 @@
1-
# GPT 相关配置
2-
# model list
3-
model_quester_anster = "text-davinci-003"
4-
model_gpt_35_turbo = "gpt-3.5-turbo"
5-
model_gpt_4o = "gpt-4o"
6-
model_programming_translate = "code-davinci-002"
7-
81
# api 接口封装类
92
llm_api_impl = "large_model.api.default_api.DefaultApi"
103

11-
# api 配置方式参考 docs/llm_api.md
4+
# DeepSeek配置示例
5+
# api 配置方式参考 docs/config.md
126
# 默认使用认UnionLLM,参考:https://github.com/EvalsOne/UnionLLM/tree/main/docs
137
# UnionLLM兼容LiteLLM,参考LiteLLM文档:https://docs.litellm.ai/docs
148
api_config = {
15-
"api_key": "your openai key",
16-
"api_base": "https://api.openai.com/v1",
17-
"model": model_gpt_4o,
18-
"provider": "openai",
9+
"api_key": "your deepseek key",
10+
"model": 'deepseek-chat',
11+
"provider": "deepseek",
1912
}
13+
# # GPT API 配置示例
14+
# # model list
15+
# model_gpt_35_turbo = "gpt-3.5-turbo"
16+
# model_gpt_4o = "gpt-4o"
17+
#
18+
# api_config = {
19+
# "api_key": "your openai key",
20+
# "api_base": "https://api.openai.com/v1",
21+
# "model": model_gpt_4o,
22+
# "provider": "openai",
23+
# }
24+
25+
# ollama 配置示例
26+
# api_config = {
27+
# "api_base": "http://localhost:11434",
28+
# "model": "llama3.2",
29+
# "provider": "ollama",
30+
# }
2031

2132
# 2. 提示词
2233
gpt_message = """
@@ -39,7 +50,7 @@
3950
#### 💻修改后的代码:
4051
```python
4152
{变量4}
42-
53+
```
4354
"""
4455

4556
# -------------Gitlab info------------------

reply_module/reply.py

Lines changed: 63 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,11 @@
55

66
class Reply:
77
def __init__(self, config):
8+
"""
9+
初始化 Reply 实例
10+
Args:
11+
config (dict): 配置字典,包含初始化所需的配置信息
12+
"""
813
if not isinstance(config, dict):
914
raise Exception('Reply config should be a dict.')
1015
if 'type' not in config:
@@ -14,68 +19,98 @@ def __init__(self, config):
1419
self.lock = threading.Lock()
1520

1621
def add_reply(self, reply_msg):
17-
# reply 格式检查:title, content 必选
22+
"""
23+
添加回复消息
24+
Args:
25+
reply_msg (dict): 回复消息字典,必须包含 'content' 字段
26+
"""
1827
if 'content' not in reply_msg:
1928
raise Exception('Reply format error, title and content are required.')
20-
if 'priority' in reply_msg:
21-
if not isinstance(reply_msg['priority'], int):
22-
raise Exception('Reply format error, priority should be an integer.')
23-
elif reply_msg['priority'] == 0:
29+
if 'msg_type' in reply_msg:
30+
if not isinstance(reply_msg['msg_type'], str):
31+
raise Exception('Reply format error, msg_type should be a string.')
32+
reply_msg['msg_type'] = [t.strip() for t in reply_msg['msg_type'].split(',')]
33+
if 'SINGLE' in reply_msg['msg_type']:
2434
self.send_single_message(reply_msg)
2535
return
26-
36+
else:
37+
reply_msg['msg_type'] = ['NORMAL']
38+
if 'target' not in reply_msg:
39+
reply_msg['target'] = 'all'
40+
if 'title' not in reply_msg:
41+
reply_msg['title'] = ''
42+
if 'group_id' not in reply_msg:
43+
reply_msg['group_id'] = 0
2744
with self.lock: # 加锁
2845
self.replies.append(reply_msg)
2946

3047
def send(self):
31-
msg_list = {}
32-
main_msg = None
48+
"""
49+
实时发送单条消息
50+
Args:
51+
reply (dict): 单条回复消息字典,必须包含 'content' 字段
52+
Returns:
53+
bool: 表示发送是否成功
54+
"""
55+
msg_groups = {}
56+
main_msg_group = []
3357
with self.lock: # 加锁
3458
# 发送所有消息的逻辑
3559
for msg in self.replies:
36-
if msg['title'] == '__MAIN_REVIEW__':
37-
main_msg = msg
60+
if 'MAIN' in msg['msg_type']:
61+
# msg 加入到 main_msg 中
62+
main_msg_group.append(msg)
3863
continue
39-
self.__parse_msg(msg, msg_list)
64+
self.__parse_msg(msg, msg_groups)
4065

4166
self.replies = [] # 清空已发送的消息
42-
if main_msg:
43-
self.__parse_msg(main_msg, msg_list)
67+
for main_msg in main_msg_group:
68+
self.__parse_msg(main_msg, msg_groups)
4469
ret = True
45-
for target, msg in msg_list.items():
70+
for target, msg_group in msg_groups.items():
4671
reply_target = ReplyFactory.get_reply_instance(target, self.config)
47-
ret &= reply_target.send(msg)
72+
for msg in msg_group:
73+
ret &= reply_target.send(msg)
4874
return ret
4975

5076
def send_single_message(self, reply):
5177
"""
52-
实时发送消息
78+
实时发送单条消息
79+
80+
Args:
81+
reply (dict): 单条回复消息字典,必须包含 'content' 字段
82+
Returns:
83+
bool: 表示发送是否成功
5384
"""
5485
targets = [t.strip() for t in reply['target'].split(',')]
5586
if 'all' in targets:
5687
targets = ReplyFactory.get_all_targets()
5788
ret = True
5889
for target in targets:
5990
reply_target = ReplyFactory.get_reply_instance(target, self.config)
60-
# 如果title不为__IGNORE__ or __MAIN_REVIEW__, 则发送带有标题的消息
61-
if 'title' not in reply or reply['title'] not in ['__IGNORE__', '__MAIN_REVIEW__']:
62-
ret &= reply_target.send(f"## {reply['title']}\n\n{reply['content']}\n\n")
63-
else:
91+
if ('TITLE_IGNORE' in reply['msg_type'] or 'MAIN' in reply['msg_type']
92+
or 'title' not in reply or not reply['title']):
6493
ret &= reply_target.send(reply['content'])
94+
else:
95+
title = f"## {reply['title']}\n\n" if 'title' in reply else ''
96+
ret &= reply_target.send(f"{title}{reply['content']}\n\n")
6597
return ret
6698

67-
def __parse_msg(self, msg, msg_list):
99+
def __parse_msg(self, msg, msg_groups):
68100
targets = [t.strip() for t in msg['target'].split(',')]
69-
if 'all' in targets:
101+
if 'target' not in msg or 'all' in targets:
70102
targets = ReplyFactory.get_all_targets()
71103
for target in targets:
72-
msg_list[target] = msg_list.get(target, '')
73-
# 如果msg['title']不存在
74-
if 'title' not in msg or msg['title'] in ['__IGNORE__', '__MAIN_REVIEW__']:
75-
msg_list[target] = f"{msg['content']}\n\n" + msg_list[target]
104+
if target not in msg_groups:
105+
msg_groups[target] = {}
106+
if msg['group_id'] not in msg_groups[target]:
107+
msg_groups[target][msg['group_id']] = []
108+
if ('TITLE_IGNORE' in msg['msg_type'] or 'MAIN' in msg['msg_type']
109+
or 'title' not in msg or not msg['title']):
110+
msg_groups[target][msg['group_id']].insert(0, msg['content'])
76111
else:
77-
msg_list[target] += f"## {msg['title']}\n\n{msg['content']}\n\n"
78-
112+
title = f"## {msg['title']}\n\n" if 'title' in msg else ''
113+
msg_groups[target][msg['group_id']].append(f"{title}{msg['content']}\n\n")
79114

80115
if __name__ == '__main__':
81116
reply = Reply({'type': 'merge_request',
File renamed without changes.

review_engine/handler/default_handler.py

Lines changed: 6 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,8 @@
33

44
from retrying import retry
55

6-
from config.config import api_config, gpt_message
7-
from review_engine.handler.abstract_handler import ReviewHandle
6+
from config.config import gpt_message
7+
from review_engine.abstract_handler import ReviewHandle
88
from utils.gitlab_parser import filter_diff_content
99
from utils.logger import log
1010

@@ -78,10 +78,9 @@ def default_handle(self, changes, merge_info, hook_info, reply, model):
7878
review_info = chat_review(changes, model)
7979
if review_info:
8080
reply.add_reply({
81-
'title': '__MAIN_REVIEW__',
8281
'content': review_info,
82+
'msg_type': 'MAIN, SINGLE',
8383
'target': 'all',
84-
'priority': 0
8584
})
8685
reply.add_reply({
8786
'title': '__MAIN_REVIEW__',
@@ -96,7 +95,7 @@ def default_handle(self, changes, merge_info, hook_info, reply, model):
9695
f"- **Code Review 状态**: ✅\n"
9796
),
9897
'target': 'dingtalk',
99-
'priority': 0
98+
'msg_type': 'MAIN, SINGLE',
10099
})
101100
else:
102101
reply.add_reply({
@@ -113,7 +112,7 @@ def default_handle(self, changes, merge_info, hook_info, reply, model):
113112
f"- **Code Review 状态**: pass ✅\n"
114113
),
115114
'target': 'dingtalk',
116-
'priority': 0
115+
'msg_type': 'MAIN, SINGLE',
117116
})
118117

119118

@@ -130,7 +129,7 @@ def default_handle(self, changes, merge_info, hook_info, reply, model):
130129
f"- **目标分支**: `{hook_info['object_attributes']['target_branch']}`\n"
131130
),
132131
'target': 'dingtalk',
133-
'priority': 0
132+
'msg_type': 'MAIN, SINGLE',
134133
})
135134

136135
else:

review_engine/review_engine.py

Lines changed: 2 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ def __init__(self, reply):
1010
self.handles = []
1111
self.reply = reply
1212
# 动态导入所有的handle,位置在handle目录下
13-
from .handler.abstract_handler import ReviewHandle
13+
from review_engine.abstract_handler import ReviewHandle
1414
for handle in ReviewHandle.__subclasses__():
1515
self.handles.append(handle())
1616

@@ -23,10 +23,4 @@ def handle_merge(self, changes, merge_info, webhook_info):
2323
thread.start()
2424
for thread in threads:
2525
thread.join()
26-
self.reply.send()
27-
28-
29-
30-
31-
32-
26+
self.reply.send()

0 commit comments

Comments
 (0)