Actor 模型
概述
Actor 是 wesgine 运行时的一等标识符。wesgine 不定义用户身份体系(认证、授权、组织架构归应用层),但 Actor 是引擎内部用于记忆隔离、资源调度、认知路由和行为归因的核心概念。
简单理解:Cell = 租户(物理隔离),Actor = 请求主体(逻辑隔离)。
两层隔离模型
wesgine 采用 Tenant + Actor 两层隔离:
| 层 | 对应概念 | 隔离方式 | 示例 |
|---|---|---|---|
| Tenant | Cell | 物理隔离(独立数据库) | 法务部、审计部 |
| Actor | 请求主体 | 逻辑隔离(同一 Cell 内按 Actor 过滤) | 张三、李四 |
Cell 之间完全物理隔离——不同 Cell 的数据库文件互相独立,表内没有 cell_id 列。Actor 隔离发生在 Cell 内部,通过引擎的判据单点实现。
结构资源 vs 运行时行为
Cell 内的资源分为两类,Actor 隔离规则不同:
结构资源(归 Cell,不区分 Actor):
- Agent 配置
- Skill 包
- MCP 连接
- Knowledge 语料库
- Cron 定时任务
- IM 渠道
运行时行为(按 Actor 隔离):
- Memory(记忆):读写都按 Actor 过滤
- Session(会话):每个 Session 有明确的 Actor 归属
- HITL(人机协作):审批请求只推送给对应 Actor
- Token 用量:按 Actor 归因统计
- Run 追踪:观测数据按 Actor 可见性过滤
记忆四层与 Actor
wesgine 的记忆分为七个层,其中四个是用户记忆层:
| 层 | 名称 | Actor 关系 | 说明 |
|---|---|---|---|
| L1 | environment | 共享 | 宿主环境信息,所有人可见 |
| L2 | consensus | 共享 | 部门共识,所有人可见 |
| L3 | about_me | 按 Actor 隔离 | 个人偏好,仅本人可见 |
| L4 | agent_memory | 按 Actor 隔离 | 角色记忆,仅本人可见 |
L1/L2 是 Cell 级共享资产,L3/L4 按 Actor 隔离——张三的个人偏好不会出现在李四的对话中。
使用方式
必填字段
AppRunRequest.Actor 是必填一等字段。如果为空,引擎直接返回 ErrActorRequired:
events, err := cell.Runtime().Run(ctx, wesgine.AppRunRequest{
Actor: "alice", // ★ 必填
SessionID: "s1",
AgentID: "agent-legal",
Messages: []Message{...},
})
Actor 来源
Actor 的值由应用层决定,引擎不规定格式:
| 产品 | Actor 来源 |
|---|---|
| 桌面应用(wesclaw/wescode/wescraft) | 登录用户 uid 或固定 "local" |
| 企业 SaaS(teleclaw) | JWT claim 中的 user_id |
管理视图
空 Actor 在引擎中表示管理视图(需要 admin token)。例如 GET /memory?actor= 返回 Cell 内全部记忆条目。普通用户请求始终携带 Actor,只能看到自己的数据。
设计原则
- 身份无关(AX-2):wesgine 不定义用户身份体系,Actor 只是运行时标识符
- 判据收敛:读侧由
ActorVisible单点判定,写侧由saveCore的RequireActor单点执行 - 无主 = 隐藏:没有 Actor 的运行时数据对所有非管理员不可见