Problem
算法内核抽象已经有了:~/.xskill/kernels/<id>/、配置里的 kernel.kernel_id / kernel.kernels_path、离线 xskill distill --kernel,以及 OpenEarth 接入 PR #155 。用户侧缺的不是「再发明一套装核方式」,而是完整闭环里最后两步:启动后能看见核、能安全切换核。
预期用户闭环:
pip install 第三方 SDK / wheel(与运行 xskill 的同一 Python 环境)
按该内核自带 README 准备 ~/.xskill/kernels/<id>/(至少 kernel.py、自有 config.yaml;目录名与 KernelMetadata.id 一致)
xskill serve(standalone 或 team server)启动后,平台扫描 kernel.kernels_path
Dashboard 设置页展示:当前启用核、已发现核、可用/不可用及原因
admin 在 UI 切换启用核;失败可读、可回退;成功后说明何时生效
当前缺口:
装包与目录准备可以靠内核 README 完成,但设置页只有整份 config.yaml 编辑器,没有内核区块
换核等于手改 kernel.kernel_id,看不到哪些核已发现、哪些因缺 SDK 不可用
feat(kernel): integrate OpenEarth SDK v2 #155 只是把某一个第三方核接进来,不等于平台已经支持用户按需更换任意第三方核
Dashboard 已经演进很大(overview / skills / pipeline / traj / users / canary / admin / settings),不能靠整页重做塞进换核
Proposed solution
保留现有目录契约、BaseKernel API 和 KernelCatalog 发现逻辑;平台第一期只做发现、诊断、切换。包安装与目录准备仍留在内核 README。
设计决策
安装边界:不代用户 pip install,也不从 UI 上传 wheel
UI 落点:只在现有「设置」页、admin 可见区域上方增加「算法内核」卡片;保留下方整份 config 编辑器作逃生舱。不新增一级导航,不大改其他页
切换写路径:专用 API 只改 kernel.kernel_id(校验目标核 available),不让 UI 为切核去整文件重写 yaml
生效语义:与现有 config hot-reload 口径对齐。切核后返回明确状态;加载失败时不静默空跑,保留旧启用核或降级,并返回可读错误
前端安全改造:纯增量。新卡片独立 DOM / JS;若 API 404(旧 serve)则隐藏卡片、不影响现有设置页
权限:仅 admin。standalone 与 team server 共用同一设置入口
API / CLI 最小面
GET /api/v1/dashboard/admin/kernels:复用 KernelCatalog.list(),返回当前 active、各核 available/error/version/source/...
POST /api/v1/dashboard/admin/kernels/active:body { "kernel_id": "..." };不可用则 400 + 原因
CLI 可并行提供 xskill kernel list/status 与 xskill kernel use <id> 作运维兜底;第一期以 Dashboard 为用户主路径
前端改动范围
改设置区:展示当前启用核;列表里可用可点「启用」,不可用禁用并展示 error;切换后给出成功、失败原因、是否需重启;文案指向「请按该内核 README 准备目录并 pip install」。
Alternatives considered
只靠改 config.yaml:开发者够用,对终端用户不友好,也难暴露「已装但不可用」
Dashboard 代装 pip / 上传 wheel:权限与环境风险高,第一期不做
新开「内核」一级导航或重做设置页:Dashboard 已很大,增量卡片风险更低、可回滚
平台内置并硬编码 OpenEarth:feat(kernel): integrate OpenEarth SDK v2 #155 接通单个核,不能替代可插拔换核
自动从 examples 拷目录:用户应按该核 README 准备;平台不假装完成安装
明确不做(第一期)
Dashboard 代装 pip / 上传 wheel / 远程拉包
自动从 examples 拷目录
新开「内核」一级导航或重做设置页
在 overview / pipeline 大面积散落内核控件(overview 只读「当前核」以后再说)
热替换正在执行的 run() 中途(等本轮结束再换绑定即可)
Acceptance
按 OpenEarth(feat(kernel): integrate OpenEarth SDK v2 #155 )或 demo kernel README:pip install → 准备目录 → serve → 设置页能看到该核
缺 SDK 时该核显示不可用及原因,不能被启用
admin 切换到可用核后配置中 kernel.kernel_id 更新,后续 kernel-host 使用新核;切到坏核被拒绝且旧核仍工作
旧版无 kernels API 时设置页其他功能仍可用
Related
Problem
算法内核抽象已经有了:
~/.xskill/kernels/<id>/、配置里的kernel.kernel_id/kernel.kernels_path、离线xskill distill --kernel,以及 OpenEarth 接入 PR #155。用户侧缺的不是「再发明一套装核方式」,而是完整闭环里最后两步:启动后能看见核、能安全切换核。预期用户闭环:
pip install第三方 SDK / wheel(与运行 xskill 的同一 Python 环境)~/.xskill/kernels/<id>/(至少kernel.py、自有config.yaml;目录名与KernelMetadata.id一致)xskill serve(standalone 或 team server)启动后,平台扫描kernel.kernels_path当前缺口:
config.yaml编辑器,没有内核区块kernel.kernel_id,看不到哪些核已发现、哪些因缺 SDK 不可用Proposed solution
保留现有目录契约、
BaseKernelAPI 和KernelCatalog发现逻辑;平台第一期只做发现、诊断、切换。包安装与目录准备仍留在内核 README。设计决策
pip install,也不从 UI 上传 wheelkernel.kernel_id(校验目标核available),不让 UI 为切核去整文件重写 yamlAPI / CLI 最小面
GET /api/v1/dashboard/admin/kernels:复用KernelCatalog.list(),返回当前active、各核available/error/version/source/...POST /api/v1/dashboard/admin/kernels/active:body{ "kernel_id": "..." };不可用则 400 + 原因xskill kernel list/status与xskill kernel use <id>作运维兜底;第一期以 Dashboard 为用户主路径前端改动范围
改设置区:展示当前启用核;列表里可用可点「启用」,不可用禁用并展示
error;切换后给出成功、失败原因、是否需重启;文案指向「请按该内核 README 准备目录并 pip install」。Alternatives considered
config.yaml:开发者够用,对终端用户不友好,也难暴露「已装但不可用」明确不做(第一期)
run()中途(等本轮结束再换绑定即可)Acceptance
kernel.kernel_id更新,后续 kernel-host 使用新核;切到坏核被拒绝且旧核仍工作Related