|
|
@@ -638,6 +638,32 @@ class OutlineGenerator:
|
|
|
return None
|
|
|
return self._keyword_rules_cache.get(code)
|
|
|
|
|
|
+ def _resolve_llm_model_name(
|
|
|
+ self,
|
|
|
+ function_name: Optional[str] = None,
|
|
|
+ model_name: Optional[str] = None
|
|
|
+ ) -> str:
|
|
|
+ """解析本次 LLM 调用实际会使用的模型名,用于日志排查。"""
|
|
|
+ try:
|
|
|
+ from foundation.ai.models.model_config_loader import get_model_for_function
|
|
|
+
|
|
|
+ # 保持和 generate_model_client.get_model_generate_invoke 的解析顺序一致。
|
|
|
+ if function_name:
|
|
|
+ resolved_model = get_model_for_function(function_name)
|
|
|
+ if resolved_model:
|
|
|
+ return resolved_model
|
|
|
+
|
|
|
+ if model_name:
|
|
|
+ return model_name
|
|
|
+
|
|
|
+ default_model = get_model_for_function("default")
|
|
|
+ if default_model:
|
|
|
+ return default_model
|
|
|
+ except Exception as e:
|
|
|
+ logger.warning(f"[LLM调用] 解析模型名失败: {str(e)}")
|
|
|
+
|
|
|
+ return model_name or "default"
|
|
|
+
|
|
|
async def _call_llm(
|
|
|
self,
|
|
|
trace_id: str,
|
|
|
@@ -709,7 +735,14 @@ class OutlineGenerator:
|
|
|
"task_prompt": chat_template
|
|
|
}
|
|
|
|
|
|
- logger.info(f"[LLM调用] trace_id: {trace_id}, 开始生成内容")
|
|
|
+ resolved_model_name = self._resolve_llm_model_name(
|
|
|
+ function_name=function_name,
|
|
|
+ model_name=model_name
|
|
|
+ )
|
|
|
+ logger.info(
|
|
|
+ f"[LLM调用] trace_id: {trace_id}, model: {resolved_model_name}, "
|
|
|
+ f"function_name: {function_name}, 开始生成内容"
|
|
|
+ )
|
|
|
|
|
|
# 调用模型生成(非流式)
|
|
|
generated_content = await generate_model_client.get_model_generate_invoke(
|
|
|
@@ -720,15 +753,26 @@ class OutlineGenerator:
|
|
|
function_name=function_name,
|
|
|
)
|
|
|
|
|
|
- logger.info(f"[LLM调用] trace_id: {trace_id}, 生成完成,内容长度: {len(generated_content)}")
|
|
|
+ logger.info(
|
|
|
+ f"[LLM调用] trace_id: {trace_id}, model: {resolved_model_name}, "
|
|
|
+ f"生成完成,内容长度: {len(generated_content)}"
|
|
|
+ )
|
|
|
|
|
|
return generated_content
|
|
|
|
|
|
except TimeoutError as e:
|
|
|
- logger.error(f"[LLM调用] trace_id: {trace_id}, 超时: {str(e)}")
|
|
|
+ resolved_model_name = self._resolve_llm_model_name(
|
|
|
+ function_name=function_name,
|
|
|
+ model_name=model_name
|
|
|
+ )
|
|
|
+ logger.error(f"[LLM调用] trace_id: {trace_id}, model: {resolved_model_name}, 超时: {str(e)}")
|
|
|
raise
|
|
|
except Exception as e:
|
|
|
- logger.error(f"[LLM调用] trace_id: {trace_id}, 异常: {str(e)}")
|
|
|
+ resolved_model_name = self._resolve_llm_model_name(
|
|
|
+ function_name=function_name,
|
|
|
+ model_name=model_name
|
|
|
+ )
|
|
|
+ logger.error(f"[LLM调用] trace_id: {trace_id}, model: {resolved_model_name}, 异常: {str(e)}")
|
|
|
raise
|
|
|
|
|
|
async def _generate_single_chapter(
|
|
|
@@ -1088,16 +1132,16 @@ class OutlineGenerator:
|
|
|
project_name = project_info.get("project_name", "未命名项目")
|
|
|
|
|
|
# 从 keyword_rules 获取该章节的编写要求
|
|
|
- keyword_rule = self._get_keyword_rule(chapter_code)
|
|
|
- if keyword_rule:
|
|
|
- writing_requirements = f"""【编写要求】
|
|
|
-{keyword_rule}
|
|
|
-
|
|
|
-"""
|
|
|
- logger.info(f"[章节生成] trace_id: {trace_id}, code={chapter_code}, 已加载 keyword_rule")
|
|
|
- else:
|
|
|
- writing_requirements = ""
|
|
|
- logger.warning(f"[章节生成] trace_id: {trace_id}, code={chapter_code}, 未找到 keyword_rule")
|
|
|
+# keyword_rule = self._get_keyword_rule(chapter_code)
|
|
|
+# if keyword_rule:
|
|
|
+# writing_requirements = f"""【编写要求】
|
|
|
+# {keyword_rule}
|
|
|
+
|
|
|
+# """
|
|
|
+# logger.info(f"[章节生成] trace_id: {trace_id}, code={chapter_code}, 已加载 keyword_rule")
|
|
|
+# else:
|
|
|
+# writing_requirements = ""
|
|
|
+# logger.warning(f"[章节生成] trace_id: {trace_id}, code={chapter_code}, 未找到 keyword_rule")
|
|
|
|
|
|
prompt = f"""请对【{chapter_title}】章节的模板文本进行受限校订。
|
|
|
【项目信息】
|