diff --git a/src/api/endpoints.py b/src/api/endpoints.py index ab6688f..9e009ea 100644 --- a/src/api/endpoints.py +++ b/src/api/endpoints.py @@ -71,10 +71,26 @@ def extract_state_and_content(data1: str) -> dict | None: return None -def extract_form_update_from_flow_nodes(nodes) -> str: +def parse_json_value(value): + """Parse JSON string values when possible.""" + parsed = value + for _ in range(3): + if not isinstance(parsed, str): + return parsed + parsed = parsed.strip() + if not parsed: + return {} + try: + parsed = json.loads(parsed) + except json.JSONDecodeError: + return parsed + return parsed + + +def extract_form_update_from_flow_nodes(nodes): """Extract form update data from the configured FastGPT content-extract node.""" if not isinstance(nodes, list): - return "" + return {} for node in nodes: if not isinstance(node, dict): @@ -84,16 +100,14 @@ def extract_form_update_from_flow_nodes(nodes) -> str: extract_result = node.get("extractResult", {}) if not isinstance(extract_result, dict): - return "" + return {} - form_update = extract_result.get("formUpdate", "") - if isinstance(form_update, str): - return form_update - if form_update: - return json.dumps(form_update, ensure_ascii=False) - return "" + form_update = extract_result.get("formUpdate") or extract_result.get("form") or "" + if not form_update: + return {} + return parse_json_value(form_update) - return "" + return {} def format_set_info_input(payload: dict, include_input_info: bool) -> str: @@ -180,8 +194,8 @@ async def chat( def flush_text_delta(text: str): return create_sse_event("text_delta", {"text": text}) - def flush_form_update(form_update: str): - return create_sse_event("formUpdate", {"formUpdate": form_update}) + def flush_form_update(form_update): + return create_sse_event("formUpdate", form_update) async for event in aiter_stream_events(response): try: diff --git a/src/schemas/models.py b/src/schemas/models.py index 0335d5f..f178959 100644 --- a/src/schemas/models.py +++ b/src/schemas/models.py @@ -1,5 +1,5 @@ from pydantic import BaseModel, Field -from typing import Optional +from typing import Any, Optional class ProcessRequest_chat(BaseModel): sessionId: str = Field(..., max_length=64) @@ -11,7 +11,7 @@ class ProcessResponse_chat(BaseModel): sessionId: str = Field(..., max_length=64) timeStamp: str = Field(..., max_length=32) outputText: str = Field(...) - formUpdate: str = Field(default="") + formUpdate: Any = Field(default_factory=dict) nextStage: str = Field(..., max_length=32) nextStageCode: str = Field(..., max_length=4) code: str = Field(..., max_length=4)