diff --git a/fam-edge/src/fam_edge/ai_orchestrator/json_parser.py b/fam-edge/src/fam_edge/ai_orchestrator/json_parser.py index ae0e7a8..c0b96c6 100644 --- a/fam-edge/src/fam_edge/ai_orchestrator/json_parser.py +++ b/fam-edge/src/fam_edge/ai_orchestrator/json_parser.py @@ -46,8 +46,12 @@ def parse_vlm_json(raw: str) -> dict: def validate_schema(data: dict) -> dict: - """Schema 校验 + 脏数据清洗""" - required = ["global_summary", "entities_json", "frame_details", "compute_provider"] + """Schema 校验 + 脏数据清洗 + + 注意: compute_provider 是内部记账字段(orchestrator 在解析成功后填充), + 提示词从不要求模型输出它,故不做必填校验。 + """ + required = ["global_summary", "entities_json", "frame_details"] for k in required: if k not in data: raise VLMOutputInvalidError(f"缺失字段: {k}") @@ -94,11 +98,11 @@ def validate_schema(data: dict) -> dict: }) data["frame_details"] = cleaned_frames - # compute_provider 校验为数组 - if not isinstance(data["compute_provider"], list): - raise VLMOutputInvalidError("compute_provider 必须为数组") - if len(data["compute_provider"]) == 0: - raise VLMOutputInvalidError("compute_provider 不能为空数组") - data["compute_provider"] = [str(p) for p in data["compute_provider"]] + # compute_provider: 模型通常不输出(提示词不要求),缺失/非法时归一为空数组, + # 由 orchestrator.format_cloud_result 用实际成功的 provider 覆盖填充 + cp = data.get("compute_provider") + if not isinstance(cp, list): + cp = [] + data["compute_provider"] = [str(p) for p in cp] return data