一个 Agent 应用开放给多人,实例怎么分,会直接影响会话、文件、业务身份和升级。共享页面不等于共享助手,给每人一个目录也不等于完成业务隔离。
我的设计把模板、逻辑实例和计算资源分别管理。模板复用能力,实例持久保存用户状态,执行时才分配环境。
实例有归属,也有明确用途
唯一范围包含 tenant、application、owner 和约定用途。同一个人在两个租户使用应用,不因 userId 相同而共用状态;允许一个用户多个实例时,以显式 slot 或实例选择表达,不暗中绕开唯一约束。
实例记录模板版本、配置覆盖与状态引用,会话、文件和产出关联实例。业务确实需要协作时,另建共享对象并授权,不以共用聊天历史代替协作模型。
首次启用不能只靠查询判断不存在
连续点击、网络重试和两个窗口并发,都可能同时得到“没有实例”。创建记录必须受唯一约束或等效机制保护,获得创建资格的尝试负责初始化。
初始化带 generation。提交 ready 时,状态仍需是 creating,代次也必须一致;执行者失联后由恢复者取得新代次,迟到执行者不能完成旧提交。
目录与外部资源的创建不自动享有数据库事务。临时目录按实例和 generation 隔离,初始化成功后通过条件提交切换有效引用;旧执行者即使继续写,也只影响自己的临时目录。步骤记录中间结果,失败可恢复,残留按归属与代次清理,不能删掉失败记录重建,让重复资源失去主人。
暂停回收计算,删除处理持久状态
逻辑实例不必对应常驻容器。空闲可回收计算环境,保留实例、会话与文件,下次运行重新分配。
暂停阻止或回收执行资源,删除按保留周期清理数据,升级替换模板引用。几个动作不共用一个含义不明的“重置”。正在执行的任务怎样停止、结果是否保留,属于各自生命周期规则。
运行记录使用 instanceId 与 generation,清理只作用于对应代次。旧执行器的迟到清理,不能删除已恢复实例的新资源。
状态隔离之外还要检查访问
请求带来的 instanceId 只是目标,不证明请求人拥有它。挂载目录和凭证按可信归属解析,日志、向量索引、缓存、下载和产出查询也带租户与实例条件。
两个实例如果都用宽权限服务身份,而工具不按用户范围限制,独立界面仍然会越权。实例归属、平台操作权限和业务执行身份分别检查,资源服务判断实际动作与范围。
多人打开同一页面时,助手上下文保留应用、会话和页面实例的对应关系,结果只返回匹配接收方,不向同工作空间所有页面广播。
模板升级不重置用户历史
记录旧模板与本地覆盖,在候选配置上检查依赖和迁移,切换未来运行使用的版本。运行中任务继续使用已解析版本,紧急撤权仍实时生效。
检查并发启用不重复、失联创建者无法提交、跨用户访问拒绝、暂停后文件保留、升级不覆盖私有状态。模板可以共享,状态、身份与生命周期仍有各自明确的归属,实例才适合长期使用。