Skip to content

Commit 8800b9b

Browse files
committed
refactor(llm): rewrite large model related code
1 parent 7fab448 commit 8800b9b

File tree

10 files changed

+58
-45
lines changed

10 files changed

+58
-45
lines changed

config/config.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
model_programming_translate = "code-davinci-002"
77

88
# api 接口封装类
9-
llm_api_impl = "llm_api.llm_api_default.LLMApiDefault"
9+
llm_api_impl = "large_model.api.default_api.DefaultApi"
1010

1111
# api 配置方式参考 docs/llm_api.md
1212
# 默认使用认UnionLLM,参考:https://github.com/EvalsOne/UnionLLM/tree/main/docs
@@ -56,4 +56,4 @@
5656
# ------------- Message notification --------------------
5757
# dingding notification (un necessary)
5858
dingding_bot_webhook = "https://oapi.dingtalk.com/robot/send?access_token=*****************************************"
59-
dingding_secret = "S********************************950f"
59+
dingding_secret = "S********************************950f"

large_model/__init__.py

Whitespace-only changes.

llm_api/llm_api_interface.py renamed to large_model/abstract_api.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
from abc import ABC, abstractmethod
22

3-
class LLMApiInterface(ABC):
3+
class AbstractApi(ABC):
44

55
@abstractmethod
66
def set_config(self, api_config: dict) -> bool:

large_model/api/__init__.py

Whitespace-only changes.
Lines changed: 3 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,12 @@
11
import os
22
from math import trunc
33

4-
from litellm import completion
5-
from config.config import api_config as out_config
6-
from llm_api.llm_api_interface import LLMApiInterface
7-
from llm_api.load_api import create_llm_api_instance
84
from unionllm import unionchat
95

6+
from large_model.abstract_api import AbstractApi
107

11-
class LLMApiDefault(LLMApiInterface):
8+
9+
class DefaultApi(AbstractApi):
1210

1311
def __init__(self):
1412
self.params = {}
@@ -36,19 +34,3 @@ def get_respond_content(self) -> str:
3634

3735
def get_respond_tokens(self) -> int:
3836
return trunc(int(self.response['usage']['total_tokens']))
39-
40-
41-
# 示例使用
42-
if __name__ == "__main__":
43-
api = create_llm_api_instance()
44-
api.set_config(out_config)
45-
api.generate_text([
46-
{"role": "system",
47-
"content": "你是一位作家"
48-
},
49-
{"role": "user",
50-
"content": "请写一首抒情的诗",
51-
}
52-
])
53-
print(api.get_respond_content())
54-
print(api.get_respond_tokens())

large_model/llm_generator.py

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
import importlib
2+
import warnings
3+
4+
from config.config import llm_api_impl, api_config
5+
6+
7+
class LLMGenerator:
8+
9+
@classmethod
10+
def new_model(cls, config = api_config):
11+
api = cls.create_model_instance()
12+
api.set_config(config)
13+
return api
14+
15+
@classmethod
16+
def get_llm_api_class(cls):
17+
module_name, class_name = llm_api_impl.rsplit('.', 1)
18+
module = importlib.import_module(module_name)
19+
llm_class = getattr(module, class_name)
20+
return llm_class
21+
22+
@classmethod
23+
def create_model_instance(cls):
24+
"""
25+
使用工厂函数获取类实例
26+
"""
27+
with warnings.catch_warnings():
28+
warnings.simplefilter("ignore", category=UserWarning)
29+
llm_class = cls.get_llm_api_class()
30+
return llm_class()

review_engine/handler/abstract_handler.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,5 +7,5 @@ class ReviewHandle(object):
77
def __init__(self):
88
pass
99

10-
def merge_handle(self, changes, merge_info, hook_info, reply):
10+
def merge_handle(self, changes, merge_info, hook_info, reply, model):
1111
pass

review_engine/handler/default_handler.py

Lines changed: 13 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -4,20 +4,19 @@
44
from retrying import retry
55

66
from config.config import api_config, gpt_message
7-
from llm_api.load_api import create_llm_api_instance
87
from review_engine.handler.abstract_handler import ReviewHandle
98
from utils.gitlab_parser import filter_diff_content
109
from utils.logger import log
1110

1211

13-
def chat_review(changes):
12+
def chat_review(changes, model):
1413
log.info('开始code review')
1514
with concurrent.futures.ThreadPoolExecutor() as executor:
1615
review_results = []
1716
result_lock = threading.Lock()
1817

1918
def process_change(change):
20-
result = generate_review_note(change)
19+
result = generate_review_note(change, model)
2120
with result_lock:
2221
review_results.append(result)
2322

@@ -34,7 +33,7 @@ def process_change(change):
3433
return "\n\n".join(review_results) if review_results else ""
3534

3635
@retry(stop_max_attempt_number=3, wait_fixed=60000)
37-
def generate_review_note(change):
36+
def generate_review_note(change, model):
3837
try:
3938
content = filter_diff_content(change['diff'])
4039
messages = [
@@ -46,13 +45,11 @@ def generate_review_note(change):
4645
},
4746
]
4847
log.info(f"发送给gpt 内容如下:{messages}")
49-
api = create_llm_api_instance()
50-
api.set_config(api_config)
51-
api.generate_text(messages)
48+
model.generate_text(messages)
5249
new_path = change['new_path']
5350
log.info(f'对 {new_path} review中...')
54-
response_content = api.get_respond_content().replace('\n\n', '\n')
55-
total_tokens = api.get_respond_tokens()
51+
response_content = model.get_respond_content().replace('\n\n', '\n')
52+
total_tokens = model.get_respond_tokens()
5653
review_note = f'# 📚`{new_path}`' + '\n\n'
5754
review_note += f'({total_tokens} tokens) {"AI review 意见如下:"}' + '\n\n'
5855
review_note += response_content + """
@@ -71,14 +68,14 @@ def generate_review_note(change):
7168

7269

7370
class MainReviewHandle(ReviewHandle):
74-
def merge_handle(self, changes, merge_info, hook_info, reply):
75-
self.default_handle(changes, merge_info, hook_info, reply)
71+
def merge_handle(self, changes, merge_info, hook_info, reply, model):
72+
self.default_handle(changes, merge_info, hook_info, reply, model)
7673

77-
def default_handle(self, changes, merge_info, hook_info, reply):
74+
def default_handle(self, changes, merge_info, hook_info, reply, model):
7875
maximum_files = 50
7976
if changes and len(changes) <= maximum_files:
8077
# Code Review 信息
81-
review_info = chat_review(changes)
78+
review_info = chat_review(changes, model)
8279
if review_info:
8380
reply.add_reply({
8481
'title': '__MAIN_REVIEW__',
@@ -150,6 +147,8 @@ def default_handle(self, changes, merge_info, hook_info, reply):
150147
reply = Reply({'type': 'merge_request',
151148
'project_id': 9885,
152149
'merge_request_iid': 18})
150+
from large_model.llm_generator import LLMGenerator
151+
model = LLMGenerator.new_model()
153152
hook_info = {
154153
"object_kind": "merge_request",
155154
"event_type": "merge_request",
@@ -198,4 +197,4 @@ def default_handle(self, changes, merge_info, hook_info, reply):
198197
]
199198
}
200199
}
201-
main_handle.merge_handle(changes, info, hook_info, reply)
200+
main_handle.merge_handle(changes, info, hook_info, reply, model)

review_engine/review_engine.py

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
import threading
22

3+
from large_model.llm_generator import LLMGenerator
34
from utils.tools import import_submodules
45

56
import_submodules('review_engine.handler')
@@ -15,7 +16,8 @@ def __init__(self, reply):
1516

1617
def handle_merge(self, changes, merge_info, webhook_info):
1718
# 多线程处理
18-
threads = [threading.Thread(target=handle.merge_handle, args=(changes, merge_info, webhook_info, self.reply))
19+
threads = [threading.Thread(target=handle.merge_handle, args=(changes, merge_info, webhook_info,
20+
self.reply, LLMGenerator.new_model()))
1921
for handle in self.handles]
2022
for thread in threads:
2123
thread.start()

utils/args_check.py

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -54,8 +54,9 @@ def check_dingding_config(config):
5454
"""
5555
result = {'passed': True, 'errors': []}
5656
try:
57-
from utils.dingding import send_dingtalk_message_by_sign
58-
response = send_dingtalk_message_by_sign("连通性测试:测试消息,请勿回复。")
57+
from reply_module.reply_target.dingtalk_reply import DingtalkReply
58+
dingtalk_reply = DingtalkReply({'type': 'merge_request', 'project_id': 1, 'merge_request_iid': 1})
59+
response = dingtalk_reply.send("连通性测试:测试消息,请勿回复。")
5960
if not response:
6061
error_msg = "Dingding configuration is invalid"
6162
result['errors'].append(error_msg)
@@ -100,9 +101,8 @@ def check_api_config(config):
100101
"""
101102
result = {'passed': True, 'errors': []}
102103
try:
103-
from llm_api.load_api import create_llm_api_instance
104-
api = create_llm_api_instance()
105-
api.set_config(config.api_config)
104+
from large_model.llm_generator import LLMGenerator
105+
api = LLMGenerator.new_model()
106106
api.generate_text([
107107
{"role": "system",
108108
"content": "你是一个有用的助手"

0 commit comments

Comments
 (0)