feat(agent-gate): 新增 GET /agents/directory 企业智能体目录接口(成员+可调用智能体,供桌面端选择器/授权页使用)
This commit is contained in:
@@ -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,
|
||||
|
||||
Reference in New Issue
Block a user