mirror of
https://github.com/infiniflow/ragflow.git
synced 2026-07-05 10:58:34 +08:00
## 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
80 lines
3.9 KiB
Python
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 ""
|