Skip to content

Commit 7e9f0aa

Browse files
committed
docs: added configuration documentation and updated Readme
1 parent fb3dff0 commit 7e9f0aa

File tree

6 files changed

+562
-6
lines changed

6 files changed

+562
-6
lines changed

README.md

Lines changed: 24 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -23,24 +23,39 @@
2323

2424
> 一个利用大模型帮助我们在 Gitlab 上进行 Code Review 提升研发效能的项目 💪🏻 (( 包括但不限于 GPT 🎁))
2525
26-
2726
**这个项目有什么特点? ✨**
2827

2928
🐶 针对于 <span style="background-image: linear-gradient(to right, #ff9900, #ff66cc);-webkit-background-clip: text;color: transparent;font-weight: bold;">Gitlab 定制</span>
3029

3130
🐱 结合了<span style="background-image: linear-gradient(to right, #ff9900, #ff66cc);-webkit-background-clip: text;color: transparent;font-weight: bold;">GPT</span>的能力 🚀
3231

33-
🦊 正在尝试接入私有化 LLM <span style="background-image: linear-gradient(to right, #ff9900, #ff66cc);-webkit-background-clip: text;color: transparent;font-weight: bold;">代码安全问题</span>
32+
🦊 能够接入私有化 LLM <span style="background-image: linear-gradient(to right, #ff9900, #ff66cc);-webkit-background-clip: text;color: transparent;font-weight: bold;">代码安全问题</span>
3433

3534
🦁 我们将一直关注效能研发 <span style="background-image: linear-gradient(to right, #ff9900, #ff66cc);-webkit-background-clip: text;color: transparent;font-weight: bold;">最新的Coder Review动态</span> 融入这个项目
3635

3736

3837
# [项目架构 🚗](https://vze9i86ezn.feishu.cn/docx/BuFidAogAoH1ecxQstscBUdhnfb?openbrd=1&doc_app_id=501&blockId=YneudO6sRoXPFIxkohtcgbwenye&blockType=whiteboard&blockToken=Yd3CwIPdphgGmFbWcRfcx9aNnrf#YneudO6sRoXPFIxkohtcgbwenye)
3938

39+
### 🚀 **全新架构升级:更强大、更灵活、更高效!** 🌈
40+
4041
<p align="center">
4142
<img src="doc/img/project_framework.png" style="width:500px;"/>
4243
</p>
4344

45+
🌟 **丰富的模型接入** 支持轻松接入<span style="background-image: linear-gradient(to right, #ff9900, #ff66cc);-webkit-background-clip: text;color: transparent;font-weight: bold;">更多的模型</span> ,无论是经典模型还是最新的AI模型,都能轻松集成!
46+
47+
🔧 **高度定制化** 开发者可以<span style="background-image: linear-gradient(to right, #ff9900, #ff66cc);-webkit-background-clip: text;color: transparent;font-weight: bold;">便捷地自定义处理逻辑和回复机制</span>,打造专属于你的解决方案!
48+
49+
🔗 **扩展性强** 模块化设计使得功能扩展更加方便,未来可以<span style="background-image: linear-gradient(to right, #ff9900, #ff66cc);-webkit-background-clip: text;color: transparent;font-weight: bold;">轻松添加新功能</span>,满足不断变化的需求!
50+
51+
🛠️ **高可维护性** 代码结构清晰,注释详细,便于维护和二次开发,减少开发者的负担!
52+
53+
**快来体验我们的新架构吧,享受前所未有的强大功能和极致体验!**
54+
55+
56+
57+
58+
4459

4560
# 功能预览 🌈
4661

@@ -133,7 +148,10 @@
133148
<td></td>
134149
</tr>
135150
</table>
151+
### 4. 自定义更多的通知方式和处理手段
136152

153+
1. 可通过实现自定义``Reply``类添加如邮箱,私有机器人等多种通知方式,具体教程参见[reply.md](doc/reply.md)
154+
2. 可通过自定义更多的``Review Handle``引入自定义的代码审查逻辑,具体教程参见[review.md](doc/review.md)
137155

138156

139157

@@ -168,7 +186,7 @@ python3 app.py
168186

169187

170188

171-
189+
172190
#### Docker
173191

174192
```bash
@@ -180,14 +198,14 @@ todo dockerfile
180198

181199
- ✅ 使用 GPT 进行Code Review
182200
- ✅ 实现多模型支持
183-
- [ ] 尝试接入私有化大模型解决代码安全问题
184201
- [ ] 可以配置更多的触发方式
185202
- ✅ Merge Request
186203
- [ ] commit
187204
- [ ] tag
188205
- [ ] 兼容飞书的消息通知
189206
- [ ] 兼容钉钉的消息通知
190207
- [ ] 结合静态代码分析来提供修改代码的风险等级
208+
- [ ] 通过pydantic实现大模型输出内容的格式化
191209

192210
# 交流 👨‍👨‍👦‍👦
193211
👏🏻 很高兴你能向我们提出一些问题和修改建议(issue,pr), 欢迎 star 项目 ⭐️
@@ -198,11 +216,12 @@ todo dockerfile
198216

199217
👨‍👨‍👦‍👦 如果有任何使用问题,欢迎来这里交流 👋🏻
200218
<p float="left">
201-
<img src="doc/img/wechat.png" width="400" />
219+
<img src="doc/img/wechat.jpg" width="400" />
202220
<img src="doc/img/xuxin.png" width="400" />
203221
</p>
204222

205223

224+
206225
# 参考文献 📚
207226
- [(字节)基于大模型 + 知识库的 Code Review 实践](https://mp.weixin.qq.com/s?__biz=Mzg2ODQ1OTExOA==&mid=2247504479&idx=1&sn=1ec09afbb5b5b9b2aaf151994be5fd27&chksm=cea9655ef9deec48b17cbab05ddd1ab04c86736d8b469eaac6f5a707ca110ce4186e8985ff41&mpshare=1&scene=1&srcid=1011C8l5RmCM2EL4Rpl3wdRy&sharer_shareinfo=96d0a83631aaa25db87709baa250085d&sharer_shareinfo_first=96d0a83631aaa25db87709baa250085d#rd)
208227
- [(美团)代码变更风险可视化系统建设与实践](https://tech.meituan.com/2023/09/22/construction-and-practice-of-code-change-risk-visualization-system.html)

doc/config.md

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,9 @@
44
- 默认`llm_api_default`使用`UnionLLM`进行多模型支持,`UnionLLM`兼容`LiteLLM`
55
支持模型和参数配置方式参见:[UnionLLM仓库](https://github.com/EvalsOne/UnionLLM/)[LiteLLM文档](https://docs.litellm.ai/docs)
66
- 主流模型只需要修改`api_config`即可接入,无需修改该参数
7-
- 实现默认不支持的大模型接入,可实现`llm_api_interface`接口,并将类名传入该参数。
7+
- 实现默认不支持的大模型接入,可实现`AbstractApi`接口,并将类名传入该参数。
88
- `api_config`: 大模型API配置
9+
910
> 除必选参数外,其他参数根据模型需求填写,具体模型对应的参数参见[LiteLLM文档](https://docs.litellm.ai/docs)以及[UnionLLM仓库-DOC目录](https://github.com/EvalsOne/UnionLLM/tree/main/docs)中相应模型部分。具体而言:
1011
>
1112
> 国外模型请查找[LiteLLM文档](https://docs.litellm.ai/docs),并将`LiteLLM`示例中`litellm.completion`内的参数填写到`api_config`中,若示例需要通过环境变量鉴权,也请填写到`api_config`中。
@@ -35,6 +36,17 @@
3536
- 其他参数请参考上述文档
3637
- 该配置会自动传给`llm_api_impl``set_config`方法,用于初始化大模型API。
3738
### 示例
39+
40+
#### DeepSeek
41+
42+
```python
43+
api_config = {
44+
"api_key": "your deepseek key",
45+
"model": 'deepseek-chat',
46+
"provider": "deepseek",
47+
}
48+
```
49+
3850
#### ChatGPT
3951
```python
4052
# 直接传入

doc/img/project_framework.png

-1.35 MB
Loading

doc/img/wechat.jpg

161 KB
Loading

doc/reply.md

Lines changed: 222 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,222 @@
1+
# Reply 模块中文说明文档
2+
3+
4+
5+
## 1. 代码架构
6+
7+
### 树形图
8+
9+
```
10+
reply_module/
11+
├── reply.py
12+
├── reply_factory.py
13+
├── reply_target/
14+
│ ├── dingtalk_reply.py
15+
│ ├── gitlab_reply.py
16+
│ └── 更多自定义reply
17+
└── abstract_reply.py
18+
```
19+
20+
### 文件功能简要说明
21+
22+
- **reply.py**: 主要负责回复消息的管理和发送逻辑。包括添加回复消息、发送所有消息以及实时发送单条消息。
23+
- **reply_factory.py**: 实现了回复目标的工厂模式,用于创建不同类型的回复实例。
24+
- **abstract_reply.py**: 定义了一个抽象基类 `AbstractReply`,所有具体的回复类型都需要继承这个基类并实现其抽象方法,即**开发者需要通过继承此类来实现添加新Reply**
25+
- **reply_target/**: 存放具体的回复实现类,例如 `dingtalk_reply.py``gitlab_reply.py`**自定义的回复类可以放于此处**
26+
27+
## 2. 如何添加自定义的通知方式
28+
29+
>> 🚀 **增强功能**: 添加新的通知方式可以扩展系统的功能,使项目能够支持更多的消息发送平台。例如,除了现有的 Gitlab 和 Dingtalk 外,还可以添加对 Slack、Email 或其他平台的支持。
30+
31+
### 步骤详细说明
32+
33+
1. **创建新的 Reply 类**
34+
35+
*`reply_target` 目录下创建一个新的 Python 文件,例如 `slack_reply.py`
36+
* 文件中新建一个Reply类,例如`SlackReply`,并实现`AbstractReply`类,示例如下:
37+
38+
```python
39+
from reply_module.abstract_reply import AbstractReply
40+
41+
class SlackReply(AbstractReply):
42+
def __init__(self, config):
43+
self.config = config
44+
45+
def send(self, message):
46+
# 这里实现发送消息到 Slack 的逻辑
47+
print(f"Sending message to Slack: {message}")
48+
return True
49+
```
50+
51+
* config 主要包含了需要处理的请求的类型(`type`),如 `merge_request``push`等,参见[Config参数说明](#31-config)。
52+
* message 为`String`,内容为要发送的信息。
53+
54+
2. **将新的 Reply 类添加到工厂中**
55+
56+
`reply_factory.py` 文件中注册新的 Reply 类:
57+
58+
```python
59+
from reply_module.reply_target.slack_reply import SlackReply
60+
61+
ReplyFactory.register_target('slack', SlackReply)
62+
```
63+
64+
这样,工厂类 `ReplyFactory` 就可以自动创建新的 `SlackReply` 实例了。
65+
66+
3. **使用自定义类**
67+
68+
可以在自定义的Handle中使用新定义的类,使用方法参考使用示例。
69+
70+
## 3. 参数说明
71+
72+
### 3.1 Config
73+
74+
#### 3.1.1 功能
75+
76+
`config` 是一个字典,包含了初始化 Reply 实例时需要的配置信息。其功能如下:
77+
78+
1. **说明当前 Hook 的类型**: 如 `merge_request``push` 等。
79+
2. **包含项目的参数**: 如 `project_id``merge_request_iid` 等。
80+
81+
#### 3.1.2 格式
82+
83+
##### 基本格式
84+
85+
- `type`: 每个 `config` 一定包含该参数,根据 `type` 的不同,其他参数会有所不同。
86+
- **目前项目只会有 `merge_request` 一种 `type`,其他事件加急开发中**
87+
88+
```python
89+
config = {
90+
"type": "merge_request"
91+
# 其他参数
92+
}
93+
```
94+
95+
##### merge_request 事件
96+
97+
- `project_id`:
98+
- 类型: `int`
99+
- 说明: 项目的唯一标识符,用于标识具体的项目。
100+
101+
- `merge_request_iid`:
102+
- 类型: `int`
103+
- 说明: 合并请求的唯一标识符,用于标识具体的合并请求。
104+
105+
106+
```python
107+
config = {
108+
"type": "merge_request",
109+
"project_id": 95536, # 项目ID
110+
"merge_request_iid": 10 # 合并请求IID
111+
}
112+
```
113+
114+
### 3.2 Reply Message (reply_msg)
115+
116+
#### 3.2.1 功能
117+
118+
`reply_msg` 是一个字典,包含了发送消息时所需的信息。其功能如下:
119+
120+
1. **包含消息的实际内容**: 如消息的文本内容、标题等。
121+
2. **定义消息的类型**: 如 `MAIN``TITLE_IGNORE``SINGLE``NORM` 等。
122+
3. **分组消息**: 通过 `group_id` 将相同组的消息一起发送。
123+
124+
#### 3.2.2 格式
125+
126+
##### 基本格式
127+
128+
- `content`: 每个 `reply_msg` 一定包含该参数,表示消息的实际内容。
129+
- `title`: 可选参数,表示消息的标题。
130+
- `msg_type`: 表示消息的类型,默认值为 `NORM`
131+
- ``target``:标识发送给哪些平台,默认为``all``
132+
- `group_id`: 表示消息的分组ID,默认值为 `0`
133+
134+
```python
135+
reply_msg = {
136+
"content": "This is a message content",
137+
"title": "Optional Title",
138+
"msg_type": "NORM",
139+
"target": "all",
140+
"group_id": 0
141+
}
142+
```
143+
144+
##### 字段说明
145+
146+
- `content`:
147+
- 类型: `str`
148+
- 说明: 必须包含的字段,表示消息的实际内容。
149+
150+
- `title`:
151+
- 类型: `str`
152+
- 说明: 可选字段,表示消息的标题,如果无此字段或内容为空,则等同于``msg_type````TITLE_IGNORE``
153+
154+
- `msg_type`:
155+
- 类型: `str`
156+
- 说明: 表示消息的类型, 可以为多个类型,通过逗号``,``分割。默认值为 `NORM`,可选值包括:
157+
- `MAIN`: 标识主消息,要求唯一,项目自带handle默认使用。
158+
- `TITLE_IGNORE`: 忽略标题,即只发送内容。
159+
- `SINGLE`: 直接发送单条消息。
160+
- `NORMAL`: 正常消息类型,等待所有handle处理完成后拼接成一条消息发送。
161+
162+
- ``target``
163+
- 类型:``str``
164+
- 说明:标识调用哪些Reply通知类进行·发送,可以同时选择多个Reply,通过逗号``,``分割。默认值为 `all`,可选值包括:
165+
- ``all``:发送给所有在``reply_factory.py``中注册过的Reply通知类。
166+
- ``gitlab``:发送给gitlab平台,即在merge界面发送comment
167+
- ``dingtalk``:配置好钉钉机器人后,可以通过机器人发送到钉钉
168+
- ``自定义``:可以参考上文自定义Reply并在``reply_factory.py``中注册,然后可以使用自定义的通知类。
169+
- `group_id`:
170+
- 类型: `int`
171+
- 说明: 表示消息的分组ID。相同 `group_id` 的消息会一起发送。默认值为 `0`
172+
-
173+
174+
##### 示例
175+
176+
```python
177+
reply_msg = {
178+
"content": "This is the main content of the message.",
179+
"title": "Important Update",
180+
"msg_type": "MAIN, SINGLE",
181+
"target": "dingtalk, gitlab",
182+
"group_id": 1
183+
}
184+
```
185+
186+
在上述示例中,`reply_msg` 包含了一个主要类型的消息,带有标题,并且属于组 `1`
187+
188+
## 4. 其他说明
189+
190+
### 示例代码
191+
192+
以下是一个简单的使用示例:
193+
194+
```python
195+
from reply_module.reply import Reply
196+
197+
# 配置字典
198+
config = {
199+
'type': 'merge_request',
200+
'project_id': 9885,
201+
'merge_request_iid': 18
202+
}
203+
204+
# 创建 Reply 实例
205+
reply = Reply(config)
206+
207+
# 添加回复消息
208+
reply.add_reply({
209+
"target": "slack",
210+
"content": "This is a test message",
211+
"title": "Test Title",
212+
"msg_type": "NORM",
213+
"group_id": 0
214+
})
215+
216+
# 发送所有消息
217+
success = reply.send()
218+
print(f"Messages sent successfully: {success}")
219+
```
220+
221+
通过以上步骤和示例代码,您可以轻松地在项目中添加和使用新的回复类型。
222+

0 commit comments

Comments
 (0)