mirror of
http://hblu.top:3000/st2411020106/111.git
synced 2026-01-27 22:43:24 +08:00
65 lines
2.3 KiB
Python
65 lines
2.3 KiB
Python
from services.ai_service import ai_service
|
||
from models.schemas import CodeExplanation
|
||
from typing import List, Optional
|
||
|
||
class CodeExplainer:
|
||
"""代码解释智能体"""
|
||
|
||
def __init__(self):
|
||
self.service = ai_service
|
||
|
||
def explain(self, code: str, language: str, depth: str = "detailed") -> CodeExplanation:
|
||
"""解释代码"""
|
||
explanation_text = self.service.generate_explanation(code, language, depth)
|
||
|
||
return CodeExplanation(
|
||
explanation=explanation_text,
|
||
line_by_line=self._parse_line_explanations(explanation_text),
|
||
key_concepts=self._extract_concepts(explanation_text),
|
||
suggestions=self._extract_suggestions(explanation_text)
|
||
)
|
||
|
||
def _parse_line_explanations(self, explanation: str) -> List[dict]:
|
||
"""解析逐行解释"""
|
||
lines = explanation.split('\n')
|
||
parsed = []
|
||
current_item = {}
|
||
|
||
for line in lines:
|
||
if line.strip().startswith(('第', 'Line', '行')):
|
||
if current_item:
|
||
parsed.append(current_item)
|
||
current_item = {"line": line}
|
||
elif current_item:
|
||
current_item["explanation"] = current_item.get("explanation", "") + line + "\n"
|
||
|
||
if current_item:
|
||
parsed.append(current_item)
|
||
|
||
return parsed if parsed else None
|
||
|
||
def _extract_concepts(self, explanation: str) -> List[str]:
|
||
"""提取关键概念"""
|
||
import re
|
||
patterns = [
|
||
r'关键概念[::]\s*(.+?)(?:\n|$)',
|
||
r'概念[::]\s*(.+?)(?:\n|$)',
|
||
r'(?:concept|term|关键字)[s]*[::]\s*(.+?)(?:\n|$)'
|
||
]
|
||
|
||
concepts = []
|
||
for pattern in patterns:
|
||
matches = re.findall(pattern, explanation, re.IGNORECASE)
|
||
concepts.extend(matches)
|
||
|
||
return concepts if concepts else None
|
||
|
||
def _extract_suggestions(self, explanation: str) -> List[str]:
|
||
"""提取建议"""
|
||
import re
|
||
pattern = r'(?:建议|tips?|提示|最佳实践)[::]\s*(.+?)(?:\n|$)'
|
||
matches = re.findall(pattern, explanation, re.IGNORECASE)
|
||
return matches if matches else None
|
||
|
||
code_explainer = CodeExplainer()
|