成员

MOI SDK 的 /user 能力管理 Catalog Service 用户:创建用户、查询列表与详情、更新 资料或角色、启停用户和删除用户。它不是统一账户中心的邀请接口;不要把 SDK 的 create_user / CreateUser 描述为“邀请已有 AI Studio 账号加入 Workspace”。

方法一览

操作

Python

Go

创建用户

create_user(request)

CreateUser(ctx, req)

查询用户列表

list_users(request)

ListUsers(ctx, req)

查询用户详情

get_user_detail(request)

GetUserDetail(ctx, req)

更新电话、邮箱和描述

update_user_info(request)

UpdateUserInfo(ctx, req)

替换角色列表

update_user_roles(request)

UpdateUserRoles(ctx, req)

启用或禁用

update_user_status(request)

UpdateUserStatus(ctx, req)

重置密码

update_user_password(request)

UpdateUserPassword(ctx, req)

删除用户

delete_user(request)

DeleteUser(ctx, req)

Python 使用字典请求和响应。Go 对应的主要类型是 UserCreateRequestUserListRequestUserDetailInfoRequestUserUpdateInfoRequestUserUpdateRoleListRequestUserUpdateStatusRequestUserDeleteUserRequest

创建用户

创建前先用权限审计中的角色接口取得服务端角色 ID。 role_id_list 是初始角色的完整列表。

import os

from moi import RawClient

client = RawClient(
    base_url=os.environ["MOI_BASE_URL"],
    api_key=os.environ["MOI_API_KEY"],
)

created = client.create_user(
    {
        "name": "data_reader",
        "password": os.environ["MOI_NEW_USER_PASSWORD"],
        "role_id_list": [401],
        "description": "Read-only integration user",
        "email": "data-reader@example.com",
        "get_api_key": False,
    }
)
print("user id:", created["id"])
resp, err := client.CreateUser(ctx, &sdk.UserCreateRequest{
	UserName:    "data_reader",
	Password:    os.Getenv("MOI_NEW_USER_PASSWORD"),
	RoleIDList:  []sdk.RoleID{401},
	Description: "Read-only integration user",
	Email:       "data-reader@example.com",
	GetApiKey:   false,
})
if err != nil {
	return err
}
fmt.Println("user id:", resp.UserID)

只有明确需要在创建响应中交付 Key 时才将 get_api_key / GetApiKey 设为 true。 返回的 Key 应立即进入密钥管理系统,不能写入日志或工单。

分页查询

列表请求支持 pagepage_size、排序、过滤和 keyword。Python 将通用分页字段放在 common_condition 中;Go 的 UserListRequest 嵌入 CommonCondition

page = client.list_users(
    {
        "keyword": "reader",
        "common_condition": {
            "page": 1,
            "page_size": 50,
            "order": "desc",
            "order_by": "created_at",
            "filters": [],
        },
    }
)

for user in page["user_list"]:
    print(user["id"], user["name"], user["status"])

响应包含 totaluser_list。分页同步应持续到已经读取的条目覆盖 total,不要假设 空关键字会关闭其他过滤条件。

更新角色和状态

update_user_roles / UpdateUserRoles 替换用户现有的角色列表,不是追加单个角色。 修改前应读取详情,合并期望状态,再提交完整 role_id_list

detail = client.get_user_detail({"id": 501})
current_ids = {role["id"] for role in detail["role_list"]}
client.update_user_roles(
    {
        "id": 501,
        "role_id_list": sorted(current_ids | {402}),
    }
)

启停请求使用 idaction。官方集成测试覆盖 enabledisable;不要用布尔值替代 这些动作字符串。提交后重新读取详情确认最终状态。

删除与同步

删除使用稳定用户 ID,并且是高风险写操作。删除前先确认依赖和审计要求;请求超时后先 查询用户详情或列表,再决定是否重试。

批量同步时,应把创建、资料更新、角色替换、启停和删除拆成独立变更。以用户 ID 作为 后续更新主键,名称和邮箱只用于匹配候选与展示。API Key、明文密码和完整错误响应不得 进入普通日志。

统一账号和 Workspace 的产品侧成员流程见 用户权限。两套用户模型的部署映射由目标 环境决定,SDK 本身没有 Workspace 邀请方法。