|
@@ -27,6 +27,7 @@ class ChatState(TypedDict):
|
|
|
child_id: int | None
|
|
child_id: int | None
|
|
|
intent: Intent | None
|
|
intent: Intent | None
|
|
|
context: dict | None
|
|
context: dict | None
|
|
|
|
|
+ self_check_result: str | None # P1-2: 自检结果 JSON
|
|
|
messages: list | None
|
|
messages: list | None
|
|
|
answer: str | None
|
|
answer: str | None
|
|
|
tasks: list[dict]
|
|
tasks: list[dict]
|
|
@@ -96,6 +97,28 @@ def create_chat_graph():
|
|
|
if portrait_text:
|
|
if portrait_text:
|
|
|
messages.insert(1, SystemMessage(content=portrait_text))
|
|
messages.insert(1, SystemMessage(content=portrait_text))
|
|
|
|
|
|
|
|
|
|
+ # P1-2: 自检结果注入(如有)
|
|
|
|
|
+ self_check_result = state.get("self_check_result")
|
|
|
|
|
+ if self_check_result:
|
|
|
|
|
+ try:
|
|
|
|
|
+ import json as _json
|
|
|
|
|
+ sc = _json.loads(self_check_result)
|
|
|
|
|
+ sc_text = f"用户最近一次五维自检结果:\n总分 {sc.get('totalScore', 0)}/45,"
|
|
|
|
|
+ dims = sc.get('dimensions') or sc.get('scores') or {}
|
|
|
|
|
+ if isinstance(dims, list):
|
|
|
|
|
+ dim_lines = [f"{d.get('name','')}: {d.get('score',0)}分" for d in dims]
|
|
|
|
|
+ elif isinstance(dims, dict):
|
|
|
|
|
+ dim_lines = [f"{k}: {v}分" for k, v in dims.items()]
|
|
|
|
|
+ else:
|
|
|
|
|
+ dim_lines = [str(dims)]
|
|
|
|
|
+ sc_text += " | ".join(dim_lines)
|
|
|
|
|
+ insight = sc.get('familyInsight') or sc.get('aiInsight')
|
|
|
|
|
+ if insight:
|
|
|
|
|
+ sc_text += f"\nAI 洞察: {insight}"
|
|
|
|
|
+ messages.insert(1, SystemMessage(content=sc_text))
|
|
|
|
|
+ except Exception as _e:
|
|
|
|
|
+ logger.warning("解析 self_check_result 失败: %s", _e)
|
|
|
|
|
+
|
|
|
# 注入家庭上下文 + 用户健康现状
|
|
# 注入家庭上下文 + 用户健康现状
|
|
|
ctx = state.get("context", {})
|
|
ctx = state.get("context", {})
|
|
|
if isinstance(ctx, dict):
|
|
if isinstance(ctx, dict):
|