"""manifest.json 的 pydantic 模型。""" from __future__ import annotations from typing import List, Literal, Optional from pydantic import BaseModel, Field class OrgDependencies(BaseModel): """组织依赖声明。 ``python`` 列表会在 install 阶段交给 uv 处理;``plugins`` 留给后续做插件间依赖。 """ python: List[str] = Field(default_factory=list) plugins: List[str] = Field(default_factory=list) class OrgUIRef(BaseModel): """前端 dashboard 入口(先占位,Tauri 化后接通)。""" entry: Optional[str] = None icon: Optional[str] = None class OrgManifest(BaseModel): """重型插件的章程文件。 name 是目录名也是 actor 注册名前缀(实际 actor name = ``org_``)。 entry 留空则使用 ``BaseOrganization`` 默认实现,纯声明式插件即可跑起来; 填写时形如 ``core.organization:DataCleaningOrg`` 指向子类。 """ name: str version: str = "0.1.0" display_name: str = "" description: str = "" # 入口与并发 entry: Optional[str] = None concurrency: Literal["queue", "parallel"] = "queue" node_affinity: Literal["cpu", "core", "gpu"] = "cpu" # 对外 api_prefix: Optional[str] = None capabilities: List[str] = Field(default_factory=list) # 资源 dependencies: OrgDependencies = Field(default_factory=OrgDependencies) # UI ui: OrgUIRef = Field(default_factory=OrgUIRef) @property def actor_name(self) -> str: return f"org_{self.name}"