Merge branch 'develop' into fix/memory-enduser-config

This commit is contained in:
Ke Sun
2026-02-06 16:25:57 +08:00
69 changed files with 38144 additions and 362 deletions

View File

@@ -415,6 +415,9 @@ class MemoryConfig:
pruning_scene: Optional[str] = "education"
pruning_threshold: float = 0.5
# Ontology scene association
scene_id: Optional[UUID] = None
def __post_init__(self):
"""Validate configuration after initialization."""
if not self.config_name or not self.config_name.strip():

View File

@@ -330,6 +330,7 @@ class ConfigUpdateForget(BaseModel): # 更新遗忘引擎配置参数时使用
class ConfigPilotRun(BaseModel): # 试运行触发请求模型
config_id:Union[uuid.UUID, int, str] = Field(..., description="配置ID唯一支持UUID、整数或字符串")
dialogue_text: str = Field(..., description="前端传入的对话文本,格式如 '用户: ...\nAI: ...' 可多行,试运行必填")
custom_text: Optional[str] = Field(None, description="自定义输入文本,当配置关联本体场景时使用此字段进行试运行")
model_config = ConfigDict(populate_by_name=True, extra="forbid")

View File

@@ -24,7 +24,7 @@ from uuid import UUID
from pydantic import BaseModel, Field, field_serializer, ConfigDict
from app.core.memory.models.ontology_models import OntologyClass
from app.core.memory.models.ontology_scenario_models import OntologyClass
class ExtractionRequest(BaseModel):
@@ -74,47 +74,51 @@ class ExtractionResponse(BaseModel):
extracted_count: int = Field(..., description="提取的类数量")
class ExportRequest(BaseModel):
"""OWL文件导出请求模型
class ExportBySceneRequest(BaseModel):
"""按场景导出OWL文件请求模型
用于POST /api/ontology/export端点的请求体。
根据scene_id从数据库查询该场景下的所有本体类型并导出为OWL文件。
Attributes:
classes: 要导出的本体类列表
format: 导出格式,可选值: rdfxml, turtle, ntriples, json
include_metadata: 是否包含完整的OWL元数据(命名空间等),默认True
scene_id: 本体场景ID必填用于查询该场景下的所有类型
format: 导出格式可选值rdfxml(默认)、turtle
Examples:
>>> request = ExportRequest(
... classes=[...],
... format="rdfxml",
... include_metadata=True
>>> request = ExportBySceneRequest(
... scene_id=UUID("550e8400-e29b-41d4-a716-446655440000"),
... format="rdfxml"
... )
"""
classes: List[OntologyClass] = Field(..., description="要导出的本体类列表", min_length=1)
format: str = Field("rdfxml", description="导出格式: rdfxml, turtle, ntriples, json")
include_metadata: bool = Field(True, description="是否包含完整的OWL元数据")
scene_id: UUID = Field(..., description="本体场景ID")
format: str = Field("rdfxml", description="导出格式,可选值:rdfxml(默认)、turtle")
class ExportResponse(BaseModel):
"""OWL文件导出响应模型
class ExportBySceneResponse(BaseModel):
"""按场景导出OWL文件响应模型
用于POST /api/ontology/export端点的响应体。
Attributes:
owl_content: OWL文件内容
format: 导出格式
filename: 导出文件名(含扩展名)
scene_id: 场景ID
scene_name: 场景名称
classes_count: 导出的类数量
Examples:
>>> response = ExportResponse(
>>> response = ExportBySceneResponse(
... owl_content="<?xml version='1.0'?>...",
... format="rdfxml",
... filename="medical_ontology.owl",
... scene_id=UUID("550e8400-e29b-41d4-a716-446655440000"),
... scene_name="医疗场景",
... classes_count=7
... )
"""
owl_content: str = Field(..., description="OWL文件内容")
format: str = Field(..., description="导出格式")
filename: str = Field(..., description="导出文件名(含扩展名)")
scene_id: UUID = Field(..., description="场景ID")
scene_name: str = Field(..., description="场景名称")
classes_count: int = Field(..., description="导出的类数量")
@@ -459,3 +463,56 @@ class ClassListResponse(BaseModel):
scene_name: str = Field(..., description="场景名称")
scene_description: Optional[str] = Field(None, description="场景描述")
items: List[ClassResponse] = Field(..., description="类型列表")
# ==================== OWL 导入相关 Schema ====================
class ImportOwlRequest(BaseModel):
"""OWL 文件导入请求
用于 POST /api/ontology/import 端点的请求体。
解析 OWL 文件并将类型直接导入到指定场景。
Attributes:
scene_id: 目标场景ID必填
owl_content: OWL 文件内容(字符串形式)
format: 文件格式可选值rdfxml默认、turtle
Examples:
>>> request = ImportOwlRequest(
... scene_id=UUID("550e8400-e29b-41d4-a716-446655440000"),
... owl_content="<?xml version='1.0'?>...",
... format="rdfxml"
... )
"""
scene_id: UUID = Field(..., description="目标场景ID")
owl_content: str = Field(..., min_length=1, description="OWL 文件内容")
format: str = Field("rdfxml", description="文件格式可选值rdfxml默认、turtle")
class ImportOwlResponse(BaseModel):
"""OWL 文件导入响应
用于返回导入结果。
Attributes:
scene_id: 场景ID
scene_name: 场景名称
imported_count: 成功导入的类型数量
skipped_count: 跳过的数量(重复)
items: 导入的类型列表
Examples:
>>> response = ImportOwlResponse(
... scene_id=UUID("..."),
... scene_name="智能制造场景",
... imported_count=4,
... skipped_count=0,
... items=[...]
... )
"""
scene_id: UUID = Field(..., description="场景ID")
scene_name: str = Field(..., description="场景名称")
imported_count: int = Field(..., description="成功导入的类型数量")
skipped_count: int = Field(0, description="跳过的数量(重复)")
items: List[ClassResponse] = Field(..., description="导入的类型列表")