Skip to content

[design] client 生命周期归属 Core 管理并下沉认证契约(依赖后端纯 API Key 认证) #1742

Description

@SAKURA-CAT

背景

#1715 暴露:online 模式下服务端在实验结束后使 sid 失效,同一脚本内第二次 swanlab.init() 复用旧 client(持有失效 sid)导致 401。

现行临时方案:SDK 侧在 Run.finish() 的清理段调用 client.reset() 销毁全局 client 单例,下次 init() 重新认证获取新 sid。相关代码以 [随临时方案删除] 注释标记。

现状问题

  1. client 生命周期割裂:client 单例(swanlab/sdk/internal/core_python/client/)物理上属于 core_python,但创建由上层驱动(swanlab.login / init.py::_ensure_online_clientlogin_raw,夹带 welcome 打印、settings merge 等前端逻辑),销毁由 SDK 运行层兜底,core 自身不管理自己的 HTTP 客户端
  2. proto 契约缺口CoreSettings proto(Settings.to_core_proto)仅携带 run_id/run_dir/批量参数,不含 api_key/api_host。Go core 落地时无法自主完成认证,存在迁移负担
  3. 认证非纯 API Key:当前经 /api/login/api_key 换取 sid 中转认证,sid 会话结束即失效——这是本问题的根因,依赖后端完善

目标形态(方案 B)

  • CoreSettings proto 增加 api_key / api_host 字段(Python + Go 生成物同步)
  • CoreContext.from_proto 携带凭证字段
  • CorePython._start_when_online 自建 client,_confirm_finish_when_enabled 销毁 client,生命周期完全归 Core
  • 上层删除 init.py::_ensure_online_clientswanlab.login 仅保留显式登录语义(前端校验 + netrc 持久化)

前置依赖

  • 后端支持纯 API Key 认证(去除 sid 中转)

完成标准

  • 删除 SDK 内全部 [随临时方案删除] 标记的代码及对应测试用例

Metadata

Metadata

Assignees

No one assigned

    Labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions