dsh 智能体如何作为服务、通过 HTTP/WebSocket 对企业后端提供多轮会话 API? #5834
Replies: 1 comment 1 reply
|
源级验证过你的大部分结论(master d347e70),你的方案与仓库里被认可的扩展形态一致。先说结论:你的架构 A(自定义窄网关 bundle)是正路,但有第二形态 B(复用首方 Remote/session-controller RPC 面 + 前置自己的鉴权)也值得权衡;另外你计划里的"插话/中断"需要从 你已验证的结论(均属实)
需要升级的两个点1. "中断/插话" ≠ followup。
2. 能力收敛:组合优于限制。 多用户形态的隐含前提(源码里没有现成答案)会话是单写者(每会话一个活跃 driver;并发 followup 会按 inbox 顺序排队)。这在单用户 chat 场景没问题,但你的网关是 SSO 多用户:
形态 B 供权衡(复用首方 RPC 面)你不必从零桥接:web UI 后端( 一个安全提醒自定义路由绕过栅栏 = 你就是栅栏。内网绑定(webserver config 支持非 loopback,CLI 拒绝 你的整个方案本质就是"为 dsh 写一个网关插件/bundle"——这正是仓库对第三方服务集成的开放形态(与 SDK stdio、ACP stdio 并列的第三条路:进程内宿主 + 自定义网络面)。如果落地后愿意分享网关骨架(去业务化的最小 bundle 模板),社区会受益。 |
Uh oh!
There was an error while loading. Please reload this page.
背景
我们基于 dsh 开发智能体, 消费方是企业系统:自研前端 + 集团统一登录
(SSO),后端是部署在内网的 Java 服务。我们希望能把 dsh 作为一个独立服务
通过网络调用——Java 服务不会去拉起 Node 子进程,所以 SDK 的 stdio 通道
(
dsh --profile sdk)不适用于我们。我们需要的能力是带多轮上下文的对话聊天:会话持久化、token 级流式回传给前端、
支持中断/插话。终端用户身份由 Java 后端(SSO)认证后透传给我们,前端不直连 dsh。
我在源码里的调研结论
阅读已安装的包之后,看起来可行的路径是写一个自定义网关插件(我们自己的 bundle),
而不是直接暴露内置的
/api/*BFF:ctx.webServer.register({kind:"exact",...})注册窄的服务路由,用ctx.webServer.registerUpgrade(...)注册 WebSocket(dsh-host-webserver)。这些自定义路由不经过
/api信任栅栏 / 浏览器 cookie 认证(
dsh-client-connection),所以服务间鉴权(mTLS / 服务 token)由我们自己实现,做法类似
dsh-webhook-github。ctx.agents.create({sessionId, meta:{cwd}, agentOptions, setup})/ctx.agents.resume(...),用agent.followup(createUserMessage(...))发消息(fire-and-forget),
await agent.whenIdle()等结束,并通过订阅ctx.on("session/event", ...)(assistant/chunk、turn/end等)拿到流式输出,再把这些事件桥接到我们自己的 WebSocket,大致参照
dsh-api-session-controller里的
follow()模式。setup(agentCtx)里收敛能力:tools.restrict({deny:["bash","write","edit"]}),只保留只读 / RAG / 对话类工具——因为一个网络可达的智能体绝不能持有 shell / 文件写权限。
dsh web命令行显式拒绝--host 0.0.0.0(RCE 警告),但 webserver配置本身支持该地址——所以我们打算通过自定义的服务化 profile 绑定内网网卡,而不是用
桌面 web profile。
想请教的问题
想请教下社区的大佬们, 这种dsh作为服务给其他后端提供 api 能力, 最佳实践是啥
All reactions