"""agents.json 的 pydantic 模型。""" from __future__ import annotations from typing import List, Literal, Optional from pydantic import BaseModel, Field class AgentModelRef(BaseModel): """agent 用哪个 provider + 哪个 model。""" provider_title: str model_id: str class AgentDef(BaseModel): """单个专家 agent 定义。 ``peers`` 列出本 agent 能 ``consult`` 的同事;为空则不能向同事发起咨询。 ``tools`` / ``skills`` 名字按下面顺序解析: 1. 本组织 toolset/ 里声明的工具 2. cabinet 全局工具白名单(python_executor 等基础工具) ``model`` 留空表示这是一个 **slot**:插件不指定 provider/model,由用户在前端 Agent 设置页装配。组织实际构建 agent 时从 DB 中按 ``(plugin, slot)`` 查询用户 配置;查不到则跳过该 slot 并日志告警。 """ name: str role: str = "" system_prompt: str = "" model: Optional[AgentModelRef] = None tools: List[str] = Field(default_factory=list) skills: List[str] = Field(default_factory=list) peers: List[str] = Field(default_factory=list) class OrchestrationConfig(BaseModel): """编排策略:第一版只有 react;entry 决定任务进来交给谁。""" type: Literal["react"] = "react" entry: str class AgentsConfig(BaseModel): agents: List[AgentDef] orchestration: OrchestrationConfig def get(self, name: str) -> Optional[AgentDef]: for a in self.agents: if a.name == name: return a return None