diff --git a/app/api/routers/agents.py b/app/api/routers/agents.py index 5ac47e1..26cf4d6 100644 --- a/app/api/routers/agents.py +++ b/app/api/routers/agents.py @@ -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,