|
| 1 | +import os |
1 | 2 | import re |
2 | 3 | import yaml |
3 | 4 | import abc |
4 | 5 | from typing import Dict, Any, List |
5 | 6 |
|
6 | 7 | from biz.utils.log import logger |
7 | 8 | from biz.llm.factory import Factory |
| 9 | +from biz.utils.token_util import count_tokens, truncate_text_by_tokens |
8 | 10 |
|
9 | 11 |
|
10 | 12 | class BaseReviewer(abc.ABC): |
@@ -54,16 +56,25 @@ def __init__(self): |
54 | 56 | super().__init__("code_review_prompt") |
55 | 57 |
|
56 | 58 | def review_and_strip_code(self, changes_text: str, commits_text: str = '') -> str: |
57 | | - # 如果超长,取前REVIEW_MAX_LENGTH字符 |
58 | | - review_max_length = int(os.getenv('REVIEW_MAX_LENGTH', 5000)) |
| 59 | + """ |
| 60 | + Review判断changes_text超出取前REVIEW_MAX_TOKENS个token,超出则截断changes_text, |
| 61 | + 调用review_code方法,返回review_result,如果review_result是markdown格式,则去掉头尾的``` |
| 62 | + :param changes_text: |
| 63 | + :param commits_text: |
| 64 | + :return: |
| 65 | + """ |
| 66 | + # 如果超长,取前REVIEW_MAX_TOKENS个token |
| 67 | + review_max_tokens = int(os.getenv('REVIEW_MAX_TOKENS', 10000)) |
59 | 68 | # 如果changes为空,打印日志 |
60 | 69 | if not changes_text: |
61 | 70 | logger.info('代码为空, diffs_text = %', str(changes_text)) |
62 | 71 | return '代码为空' |
63 | 72 |
|
64 | | - if len(changes_text) > review_max_length: |
65 | | - changes_text = changes_text[:review_max_length] |
66 | | - logger.info(f'文本超长,截段后content: {changes_text}') |
| 73 | + # 计算tokens数量,如果超过REVIEW_MAX_TOKENS,截断changes_text |
| 74 | + tokens_count = count_tokens(changes_text) |
| 75 | + if tokens_count > review_max_tokens: |
| 76 | + changes_text = truncate_text_by_tokens(changes_text, review_max_tokens) |
| 77 | + |
67 | 78 | review_result = self.review_code(changes_text, commits_text).strip() |
68 | 79 | if review_result.startswith("```markdown") and review_result.endswith("```"): |
69 | 80 | return review_result[11:-3].strip() |
|
0 commit comments