67 lines
1.7 KiB
Python
67 lines
1.7 KiB
Python
from pydantic import BaseModel, Field
|
||
from typing import Literal
|
||
|
||
|
||
class TagProperties(BaseModel):
|
||
tag_path: str = Field(..., description="完整标签路径,如 '编程语言/Python/异步'")
|
||
short_name: str = Field(..., description="显示名称,如 '异步'")
|
||
level: int = Field(..., ge=1, description="层级深度,1为顶级")
|
||
parent_path: str | None = Field(None, description="父路径,如 '编程语言/Python'")
|
||
description: str | None = Field(None, description="AI生成的标签描述")
|
||
color: str | None = Field(None, description="标签颜色,如 '#FF5733'")
|
||
|
||
|
||
class KGNodeOut(BaseModel):
|
||
id: str
|
||
name: str
|
||
entity_type: str
|
||
description: str | None
|
||
properties_: dict | None
|
||
importance: float
|
||
created_at: str
|
||
# 新增:如果是 tag 节点,返回 tag 属性
|
||
tag_properties: TagProperties | None = None
|
||
|
||
model_config = {"from_attributes": True}
|
||
|
||
def model_post_init(self, __context):
|
||
if self.entity_type == "tag" and self.properties_:
|
||
self.tag_properties = TagProperties(**self.properties_)
|
||
|
||
|
||
class KGEdgeOut(BaseModel):
|
||
id: str
|
||
source_id: str
|
||
target_id: str
|
||
relation_type: str
|
||
weight: float
|
||
properties_: dict | None
|
||
|
||
model_config = {"from_attributes": True}
|
||
|
||
|
||
class GraphOut(BaseModel):
|
||
nodes: list[KGNodeOut]
|
||
edges: list[KGEdgeOut]
|
||
|
||
|
||
class KGBuildRequest(BaseModel):
|
||
user_id: str
|
||
document_ids: list[str] | None = None # None = 全量重建
|
||
|
||
|
||
class TagExtractRequest(BaseModel):
|
||
content: str = Field(..., min_length=10)
|
||
user_id: str
|
||
|
||
|
||
class TagExtractResponse(BaseModel):
|
||
tags: list[TagProperties]
|
||
tag_count: int
|
||
|
||
|
||
class RelatedContentRequest(BaseModel):
|
||
tag_ids: list[str]
|
||
user_id: str
|
||
limit: int = 10
|