From c9edad2f9813110bd3ec2091bb28e9fd39edc594 Mon Sep 17 00:00:00 2001 From: Pine Date: Thu, 10 Sep 2026 10:33:53 +0800 Subject: [PATCH] =?UTF-8?q?feat(agent-gate):=20=E6=96=B0=E5=A2=9E=20GET=20?= =?UTF-8?q?/agents/directory=20=E4=BC=81=E4=B8=9A=E6=99=BA=E8=83=BD?= =?UTF-8?q?=E4=BD=93=E7=9B=AE=E5=BD=95=E6=8E=A5=E5=8F=A3=EF=BC=88=E6=88=90?= =?UTF-8?q?=E5=91=98+=E5=8F=AF=E8=B0=83=E7=94=A8=E6=99=BA=E8=83=BD?= =?UTF-8?q?=E4=BD=93=EF=BC=8C=E4=BE=9B=E6=A1=8C=E9=9D=A2=E7=AB=AF=E9=80=89?= =?UTF-8?q?=E6=8B=A9=E5=99=A8/=E6=8E=88=E6=9D=83=E9=A1=B5=E4=BD=BF?= =?UTF-8?q?=E7=94=A8=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/api/routers/agents.py | 42 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 42 insertions(+) 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,