- Updated build process to include a new script for building the client bundle in ModuleLoader format. - Introduced `build-client.mjs` to handle client-side bundling with esbuild. - Added `client.ts` to implement the DSH web UI, including settings and usage pages. - Registered new settings section for managing credentials and token usage. - Refactored API routes to remove `/api` prefix for consistency. - Cleaned up Vite configuration by removing unused client entry.
11 KiB
bailian-cli-dsh
把阿里云百炼(Model Studio)的能力接入 DeepSeek Harness(dsh)的 profile bundle。
本包提供两项能力:
| 能力 | 说明 |
|---|---|
| Bailian 设置页 | 通用的百炼凭证配置(AK/SK 存入 dsh bl profile + DashScope API Key)+ TokenPlan 用量展示 + 记忆库配置 + 新会话欢迎页 |
| 跨会话长期记忆 | 自动检索注入 + 自动落库,模型可主动 search/add/list。按量计费,默认停用 |
1. 前置条件
-
Node ≥ 22.19(
dsh的要求) -
bl(用量展示通过子进程调用bl console call)npm install -g bailian-cli -
阿里云 AK/SK(AccessKey ID + AccessKey Secret)—— 用于控制台鉴权,查询用量信息。在 webui 设置页填入即可,无需环境变量。
-
DashScope API Key(
sk-前缀,按量付费)—— 用于记忆库等 DashScope API 调用。在设置页「凭证配置」填入,与 AK/SK 并列为通用凭证。
2. 安装到 web profile
npx @deepseek-ai/dsh web 是 dsh --profile web 的别名,配置目录是 ~/.dsh/profiles/web/。
pnpm -F bailian-cli-dsh build # vp pack(host)+ esbuild(client.bundle.js)
cd packages/dsh && pnpm pack
npx @deepseek-ai/dsh plugin --profile web add /absolute/path/to/bailian-cli-dsh-<version>.tgz
确认 bailian 行都在:
npx @deepseek-ai/dsh --profile web --dump-config | grep -E 'bailian'
启动:
npx @deepseek-ai/dsh web
Web UI 在 http://127.0.0.1:3080。
3. Bailian 设置页 + 欢迎页
安装并重启后:
- Settings → Bailian:通用设置页(凭证配置 / TokenPlan 用量 / 记忆库)。
- 新会话欢迎页:每个新会话(blank)在输入框上方显示「百炼 Agent」欢迎页(Tab + 功能卡片),发出第一条消息后自动隐藏。
凭证配置(通用)
- 在「凭证配置」区填入 AccessKey ID 和 AccessKey Secret
- 点击 「保存凭证」
Host 会执行 bl auth login --open-api --config dsh,将 AK/SK 和新生成的 access_token 存入 bl 的 dsh 专属 profile。所有后续百炼插件共用此凭证,无需重复配置。
TokenPlan 用量
- 选择区域和站点
- 点击 「查询用量」
Host 执行 bl console call --config dsh 调用 3 个个人版控制台接口,返回:
- 用量百分比 —— 5 小时窗口 / 1 周窗口的用量百分比和重置时间
- 套餐信息 —— 套餐类型(基础版/标准版/高级版)、状态、剩余天数、到期时间、自动续费
- 额外用量包 —— Credits 总量、剩余量、生效中数量
凭证解析优先级
凭证保存到 bl 的 dsh profile 后,所有百炼插件通过 --config dsh 读取。行内 config 的 accessKeyId/accessKeySecret 作为兜底(未通过 UI 保存时自动使用)。
行内配置(可选)
如果不想在 UI 里每次输入,可以在 profile 的 cordis.patch.yml 里固化凭证:
- id: bailian-tokenplan-usage
config:
# accessKeyId / accessKeySecret: 兜底凭证(未通过 UI 保存时使用)
# consoleRegion: cn-beijing
# consoleSite: domestic
# profile: dsh # 默认用 dsh 专属 profile
配置后 UI 表单会留空,但点击「查询用量」会使用行内凭证。
4. 跨会话长期记忆
默认停用(按量计费)。在 cordis.patch.yml 中设 disabled: false 启用,然后在设置页配置 API Key 和参数。
功能
- 自动检索注入:新会话首轮,用用户消息搜索记忆,将结果注入上下文(
autoInject,默认开启) - 自动落库:每轮结束,将该轮新消息发送到记忆库 add API(
autoPersist,默认开启) - 模型工具:
bailian_memory_search(检索)、bailian_memory_add(存储)、bailian_memory_list(浏览)
触发机制
| 时机 | 触发方式 |
|---|---|
| 新会话首轮 | 自动检索记忆注入上下文(agent/pre-step 事件) |
| 对话中 | 模型主动调用 bailian_memory_search/bailian_memory_add |
| 轮次结束 | 自动落库新消息(agent/turn-stopping 事件) |
凭证与配置
- API Key:DashScope 按量付费 Key(
sk-),在设置页「凭证配置」填入 - Base URL:默认
https://dashscope.aliyuncs.com/api/v2/apps/memory/ - User ID:记忆归属 ID,默认读系统用户名
- Plan Version:
lite(便宜,关闭 rerank)或pro(开启 rerank,约 50 倍成本)。注意:实际计费由enable_rerank控制 - Top K:检索返回数量(1-100,默认 10)
- Memory Library ID:记忆库 ID,留空用默认
计费
- Add:120 QPM
- Search:300 QPM(Lite ¥0.00002/次,Pro ¥0.001/次)
- 总计不超过 3000 QPM
启用
- id: bailian-memory
disabled: false
config:
baseUrl: "https://dashscope.aliyuncs.com/api/v2/apps/memory/"
planVersion: "lite"
topK: 10
autoInject: true
autoPersist: true
启用后在设置页「记忆库」section 配置 API Key 和参数。
记忆库调用 DashScope memory v2 API(非
bl memory),因为 v2 API 暴露了min_score、enable_rerank、plan_version、memory_library_id等参数bl memory不支持。
5. 验证
# 配置合成
npx @deepseek-ai/dsh --profile web --dump-config | grep bailian
# bl 就绪
bl auth status
启动后验证:
- 欢迎页:新开一个会话,输入框上方出现「百炼 Agent」欢迎页
- 凭证配置:打开 Settings → Bailian → 填入 AK/SK → 保存凭证
- 用量展示:同页面选择区域 → 查询用量
- 记忆库:启用
bailian-memory后,同页面配置 API Key
6. 常见问题
| 现象 | 原因 |
|---|---|
用量查询报 bl auth login failed |
AK/SK 无效或无权限;确认 AK 有百炼控制台访问权限 |
用量查询报 NotLogined 或 token 过期 |
bl 的 access token 已过期;Host 会自动通过 AK/SK 刷新,确认 AK/SK 正确 |
用量查询报 bl console call failed |
控制台接口调用失败;检查 region/site 是否匹配你的账号 |
用量查询报 Workspace.NotAuthorised |
bl 用了其他 profile 的旧 access_token;Host 默认用 --config dsh 专属 profile 隔离,首次 login 会生成新 token |
工具报找不到 bl |
bl 不在 PATH:npm install -g bailian-cli |
| 设置页/欢迎页看不到 Bailian | 需重启 dsh web(bundle 在启动时加载);确认 dump-config 有 bailian-client 行,且 client.bundle.js 为 ModuleLoader 格式 |
启动报 invalid plugin ... apply |
包根 dist/index.mjs 必须导出 apply(no-op 插件);重新 pnpm build 再装 |
7. 卸载
npx @deepseek-ai/dsh plugin --profile web remove bailian-cli-dsh
架构说明
Host 半
src/tokenplan-usage/index.ts—— 凭证 + TokenPlan 用量。inject: ['subprocess'],所有 bl 命令带--config dsh隔离凭证。两个 webServer 路由:POST /bailian/credentials— 保存 AK/SK(bl auth login --open-api --config dsh,生成新 token)POST /bailian/tokenplan/usage— 查询用量(bl console call --config dsh,3 个个人版接口)
src/memory/index.ts—— 记忆库(默认停用)。直接调 DashScope memory v2 API,注册 tools + auto-inject/persist。路由/bailian/memory/config、/bailian/memory/status。src/index.ts—— 包根 no-op 插件,供bailian-client行加载(该行只为了让 client-modules 服务浏览器 bundle)。
路由用
/bailian/*而非/api/*:/api前缀被 dsh 的 RPC 网关(apiProxy)占用,自定义路由会被遮蔽。
调用链路:AK/SK → bl auth login --open-api --config dsh(存入 dsh profile)→ bl console call --config dsh(读 dsh profile token → 控制台网关)→ 个人版 TokenPlan 接口
Client 半(src/client.ts)
- 唯一的浏览器源码,构建为 DSH ModuleLoader 格式(见下)。
- 注册
settings.section(id:bailian,label:Bailian),渲染通用百炼设置页(凭证配置 / TokenPlan 用量 / 记忆库)。 - 注册
conversation.input.dock(id:bailian-welcome):当session.blank === true(新会话)渲染「百炼 Agent」欢迎页(Tab + 功能卡片),开始对话后自动隐藏。 - 通过
fetch('/bailian/*')调 Host 路由。
Client 构建(ModuleLoader 格式)
DSH 浏览器只加载 window.__ModuleLoader__.load({ id, factory }) 格式的 bundle(require('react') 由浏览器 ModuleLoader 提供)。vite-plus 产出裸 ES module,格式不对,所以 client 单独用 esbuild 构建:
scripts/build-client.mjs—— 把src/client.ts构建为 CJS + browser +reactexternal,包上 ModuleLoader banner/footer,输出client.bundle.js。package.json的build=vp pack && node scripts/build-client.mjs。package.json的exports["./client"]与dsh.client: { platform: "web" }指向client.bundle.js,被 client-modules 扫描并服务。cordis.patch.yml的bailian-client行name必须是包根(bailian-cli-dsh,无子路径),client-modules 才能require.resolve("<name>/package.json")识别dsh.client。
改 client UI 只需编辑 src/client.ts,pnpm build 自动重新生成 client.bundle.js。
共享模块(src/shared/)
bl.ts——bl子进程调用封装(env 转发、stdout/stderr 收集、JSON 解析)credentials.ts—— TokenPlan / 按量付费 Key 分类工具http.ts—— DashScope HTTP 客户端
这些模块来自早期版本(vision / image / managed-agent / RAG / memory 工具),已移除工具实现但保留共享逻辑作为参考。