feat(agent-gate): 新增 GET /agents/directory 企业智能体目录接口(成员+可调用智能体,供桌面端选择器/授权页使用)

This commit is contained in:
Pine
2026-09-10 10:33:53 +08:00
parent 23e17560f6
commit c9edad2f98
+42
View File
@@ -31,6 +31,48 @@ async def list_agents(
return [_agent_info(r) for r in await db.agents.get_by_user(user["id"], port=user["port"])]
@router.get("/directory", summary="企业智能体目录(智能体互通选择器用)")
async def agent_directory(
user: dict = Depends(require_port),
db: Database = Depends(get_db),
):
"""返回当前用户所在企业的成员及其可被调用的智能体(external_callable=1)。
用于桌面端 IM「调用智能体」选择器与授权管理页:
[{user_id, name, avatar, agents: [{agent_id, name, avatar, call_mode}]}]
非企业成员返回空列表(无权调用他人智能体)。
"""
memberships = await db.company_members.list_by_user(user["id"])
if not memberships:
return []
company_ids = list({m["company_id"] for m in memberships})
by_user: dict[str, dict] = {}
for cid in company_ids:
for m in await db.company_members.list_by_company(cid):
uid = m["user_id"]
if uid in by_user:
continue
rec = await db.users.get_by_id(uid)
by_user[uid] = {
"user_id": uid,
"name": (rec or {}).get("nickname") or (rec or {}).get("username") or uid,
"avatar": (rec or {}).get("avatar", ""),
"agents": [],
}
for uid in list(by_user):
for a in await db.agents.get_by_user(uid, port=user["port"]):
if not a.get("external_callable", True):
continue
from ...infrastructure.oss import resolve_url
by_user[uid]["agents"].append({
"agent_id": a["id"],
"name": a.get("name", ""),
"avatar": resolve_url(a.get("avatar", "") or ""),
"call_mode": a.get("call_mode", "auto"),
})
return list(by_user.values())
@router.get("/{agent_id}", response_model=AgentInfo, summary="智能体详情")
async def get_agent(
agent_id: str,