Files
ragflow/api/apps/restful_apis/utils/compilation_template_validation.py
Kevin Hu 62f94cd59b Feat: Add knowledge compilation workflows (#16515)
## Summary
- Add knowledge compilation template APIs, services, and builtin
template seed data
- Add advanced knowledge compile structure/artifact/RAPTOR workflow
support
- Update parsing, dataset/document APIs, and supporting services for
compilation workflows
2026-07-02 23:22:07 +08:00

80 lines
3.9 KiB
Python

#
# Copyright 2026 The InfiniFlow Authors. All Rights Reserved.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#
def validate_template_payload(req: dict, require_all: bool = True) -> str:
"""Validate a single template payload (kind + config + name)."""
required = ["name", "kind", "config"] if require_all else []
for key in required:
if key not in req:
return f"Missing required field: {key}."
name = req.get("name")
if name is not None and (not isinstance(name, str) or not name.strip() or len(name.encode("utf-8")) > 128):
return "Invalid template name."
description = req.get("description")
if description is not None and (not isinstance(description, str) or len(description) > 1024):
return "Invalid template description."
kind = req.get("kind")
if kind is not None and (not isinstance(kind, str) or not kind):
return "Invalid template kind."
config = req.get("config")
if config is not None and not isinstance(config, dict):
return "Invalid template config."
if isinstance(config, dict):
if len(str(config.get("global_rules") or "")) > 4096:
return "Global compilation rules is too long."
for section in ["entity", "relation"]:
fields = (config.get(section) or {}).get("fields") or []
seen_types = set()
for field in fields:
field_type = str((field or {}).get("type") or "").strip()
if not field_type:
return f"{section.capitalize()} type is required."
if field_type in seen_types:
return f"{section.capitalize()} type can not be duplicated."
seen_types.add(field_type)
if not str((field or {}).get("description") or "").strip():
return f"{section.capitalize()} field description is required."
if len(str((field or {}).get("description") or "")) > 1024:
return f"{section.capitalize()} field description is too long."
if len(str((field or {}).get("rule") or "")) > 1024:
return f"{section.capitalize()} field rule is too long."
if config.get("kind") == "artifacts" or req.get("kind") == "artifacts":
for field in (config.get("claim") or {}).get("fields") or []:
if not str((field or {}).get("statement") or "").strip():
return "Claim statement is required."
if not str((field or {}).get("subject") or "").strip():
return "Claim subject is required."
if len(str((field or {}).get("statement") or "")) > 1024:
return "Claim statement is too long."
if len(str((field or {}).get("subject") or "")) > 1024:
return "Claim subject is too long."
for field in (config.get("concept") or {}).get("fields") or []:
if not str((field or {}).get("term") or "").strip():
return "Concept term is required."
if not str((field or {}).get("definition_excerpt") or "").strip():
return "Concept definition excerpt is required."
if len(str((field or {}).get("term") or "")) > 1024:
return "Concept term is too long."
if len(str((field or {}).get("definition_excerpt") or "")) > 1024:
return "Concept definition excerpt is too long."
return ""