|
|
@@ -0,0 +1,191 @@
|
|
|
+"""
|
|
|
+语法检查模块
|
|
|
+使用自定义OpenAI兼容API进行语法检查
|
|
|
+"""
|
|
|
+
|
|
|
+import time
|
|
|
+import asyncio
|
|
|
+from typing import Dict, Any
|
|
|
+from openai import AsyncOpenAI
|
|
|
+from core.construction_review.component.reviewers.base_reviewer import ReviewResult
|
|
|
+from core.construction_review.component.reviewers.utils.prompt_loader import prompt_loader
|
|
|
+from foundation.observability.logger.loggering import server_logger as logger
|
|
|
+
|
|
|
+
|
|
|
+# 模型配置信息
|
|
|
+# 暂时写死,未来从配置文件读取
|
|
|
+GRAMMAR_CHECK_MODEL_CONFIG = {
|
|
|
+ "base_url": "http://192.168.91.253:8003/v1",
|
|
|
+ "api_key": "sk-123456",
|
|
|
+ "model": "qwen3-30b",
|
|
|
+ "temperature": 0.7,
|
|
|
+ "max_tokens": 2000
|
|
|
+}
|
|
|
+
|
|
|
+
|
|
|
+class GrammarCheckReviewer:
|
|
|
+ """语法检查审查器"""
|
|
|
+
|
|
|
+ def __init__(self):
|
|
|
+ """初始化语法检查审查器"""
|
|
|
+ self.client = AsyncOpenAI(
|
|
|
+ base_url=GRAMMAR_CHECK_MODEL_CONFIG["base_url"],
|
|
|
+ api_key=GRAMMAR_CHECK_MODEL_CONFIG["api_key"]
|
|
|
+ )
|
|
|
+ self.model = GRAMMAR_CHECK_MODEL_CONFIG["model"]
|
|
|
+ self.temperature = GRAMMAR_CHECK_MODEL_CONFIG["temperature"]
|
|
|
+ self.max_tokens = GRAMMAR_CHECK_MODEL_CONFIG["max_tokens"]
|
|
|
+
|
|
|
+ async def check_grammar(
|
|
|
+ self,
|
|
|
+ trace_id: str,
|
|
|
+ review_content: str,
|
|
|
+ review_references: str = "",
|
|
|
+ review_location_label: str = "",
|
|
|
+ state: Dict[str, Any] = None,
|
|
|
+ stage_name: str = None
|
|
|
+ ) -> ReviewResult:
|
|
|
+ """
|
|
|
+ 执行语法检查
|
|
|
+
|
|
|
+ Args:
|
|
|
+ trace_id: 追踪ID
|
|
|
+ review_content: 待审查内容
|
|
|
+ review_references: 审查参考信息
|
|
|
+ review_location_label: 审查位置标签
|
|
|
+ state: 状态字典(包含progress_manager和callback_task_id)
|
|
|
+ stage_name: 阶段名称
|
|
|
+
|
|
|
+ Returns:
|
|
|
+ ReviewResult: 审查结果对象
|
|
|
+ """
|
|
|
+ start_time = time.time()
|
|
|
+
|
|
|
+ try:
|
|
|
+ logger.info(f"开始语法检查,trace_id: {trace_id}, 内容长度: {len(review_content)}")
|
|
|
+
|
|
|
+ # 构造提示词参数
|
|
|
+ prompt_kwargs = {}
|
|
|
+ prompt_kwargs["review_content"] = review_content
|
|
|
+ prompt_kwargs["review_references"] = review_references or ""
|
|
|
+
|
|
|
+ # 获取提示词模板
|
|
|
+ prompt_template = prompt_loader.get_prompt_template(
|
|
|
+ "basic",
|
|
|
+ "grammar_check",
|
|
|
+ **prompt_kwargs
|
|
|
+ )
|
|
|
+
|
|
|
+ # 格式化提示词消息
|
|
|
+ messages = prompt_template.format_messages()
|
|
|
+
|
|
|
+ # 转换为OpenAI API格式
|
|
|
+ api_messages = []
|
|
|
+ for msg in messages:
|
|
|
+ if hasattr(msg, 'type'):
|
|
|
+ role = msg.type if msg.type in ['system', 'user', 'assistant'] else 'user'
|
|
|
+ else:
|
|
|
+ role = 'user'
|
|
|
+ api_messages.append({
|
|
|
+ "role": role,
|
|
|
+ "content": msg.content
|
|
|
+ })
|
|
|
+
|
|
|
+ logger.info(f"调用语法检查模型: {self.model}")
|
|
|
+
|
|
|
+ # 调用OpenAI兼容API
|
|
|
+ response = await self.client.chat.completions.create(
|
|
|
+ model=self.model,
|
|
|
+ messages=api_messages,
|
|
|
+ temperature=self.temperature,
|
|
|
+ max_tokens=self.max_tokens
|
|
|
+ )
|
|
|
+
|
|
|
+ # 提取模型响应
|
|
|
+ model_response = response.choices[0].message.content
|
|
|
+
|
|
|
+ logger.info(f"语法检查模型响应成功,响应长度: {len(model_response)}")
|
|
|
+
|
|
|
+ # 计算执行时间
|
|
|
+ execution_time = time.time() - start_time
|
|
|
+
|
|
|
+ # 构造审查结果
|
|
|
+ result = ReviewResult(
|
|
|
+ success=True,
|
|
|
+ details={
|
|
|
+ "name": "grammar_check",
|
|
|
+ "response": model_response
|
|
|
+ },
|
|
|
+ error_message=None,
|
|
|
+ execution_time=execution_time
|
|
|
+ )
|
|
|
+
|
|
|
+ # 推送审查完成信息
|
|
|
+ if state and state.get("progress_manager"):
|
|
|
+ review_result_data = {
|
|
|
+ 'name': 'grammar_check',
|
|
|
+ 'success': result.success,
|
|
|
+ 'details': result.details,
|
|
|
+ 'error_message': result.error_message,
|
|
|
+ 'execution_time': result.execution_time,
|
|
|
+ 'timestamp': time.time()
|
|
|
+ }
|
|
|
+
|
|
|
+ asyncio.create_task(
|
|
|
+ state["progress_manager"].update_stage_progress(
|
|
|
+ callback_task_id=state["callback_task_id"],
|
|
|
+ stage_name=stage_name,
|
|
|
+ current=None,
|
|
|
+ status="processing",
|
|
|
+ message=f"grammar_check 审查完成,耗时: {result.execution_time:.2f}s",
|
|
|
+ issues=[review_result_data],
|
|
|
+ event_type="processing"
|
|
|
+ )
|
|
|
+ )
|
|
|
+
|
|
|
+ logger.info(f"grammar_check 审查完成,耗时: {result.execution_time:.2f}s")
|
|
|
+
|
|
|
+ return result
|
|
|
+
|
|
|
+ except Exception as e:
|
|
|
+ execution_time = time.time() - start_time
|
|
|
+ error_msg = f"语法检查失败: {str(e)}"
|
|
|
+ logger.error(error_msg, exc_info=True)
|
|
|
+
|
|
|
+ # 返回失败结果
|
|
|
+ result = ReviewResult(
|
|
|
+ success=False,
|
|
|
+ details={"name": "grammar_check"},
|
|
|
+ error_message=error_msg,
|
|
|
+ execution_time=execution_time
|
|
|
+ )
|
|
|
+
|
|
|
+ # 推送失败信息
|
|
|
+ if state and state.get("progress_manager"):
|
|
|
+ review_result_data = {
|
|
|
+ 'name': 'grammar_check',
|
|
|
+ 'success': False,
|
|
|
+ 'details': result.details,
|
|
|
+ 'error_message': error_msg,
|
|
|
+ 'execution_time': execution_time,
|
|
|
+ 'timestamp': time.time()
|
|
|
+ }
|
|
|
+
|
|
|
+ asyncio.create_task(
|
|
|
+ state["progress_manager"].update_stage_progress(
|
|
|
+ callback_task_id=state["callback_task_id"],
|
|
|
+ stage_name=stage_name,
|
|
|
+ current=None,
|
|
|
+ status="processing",
|
|
|
+ message=f"grammar_check 审查失败: {error_msg}",
|
|
|
+ issues=[review_result_data],
|
|
|
+ event_type="processing"
|
|
|
+ )
|
|
|
+ )
|
|
|
+
|
|
|
+ return result
|
|
|
+
|
|
|
+
|
|
|
+# 全局单例实例
|
|
|
+grammar_check_reviewer = GrammarCheckReviewer()
|
|
|
+
|