TITLE: 把 DSH 会话产物归档到 COS 的实操步骤 EXCERPT: 从会话记录还原文件清单,用 coscli 按会话 ID 前缀上传,再回投结果并分段核对。 TAGS: DSH, COS, coscli, 会话归档

“把这个对话里生产的文件都存到 COS”落到工程上要拆成三件事:文件在哪、怎么确定“这个对话”的范围、上传后怎么确认成功。

一、什么情况下会撞上它

在 DSH 里跑长任务,会话中生成的表格、截图、日志散落在本地多个位置,结束后需要集中放到对象存储。直接说“存到 COS”不够,因为 DSH 不知道指哪些文件、用什么前缀、放哪个桶。

二、先搞清楚“对话”的边界

会话记录在 /sessions/ 下,每个会话一个 session.v4.jsonl.zstd,是 JSONL 经 zstd 压缩,记录消息与工具调用,不是文件本身。它能告诉你执行过哪些命令、写过哪些路径,文件实体在文件系统里。

所以第一步是从会话记录还原文件清单:解压后按工具调用过滤出写文件类操作得到路径列表;若任务有固定输出目录,直接按目录收集更省事。两种方式都要先确认会话 ID,避免混入别的会话产物。

三、上传这一步

用官方 SDK 或 coscli 都行,桶名、地域、前缀写死在配置里,不要在命令里临时拼。coscli 定义桶别名后:

coscli cp ./out/ cos://<bucket-alias>/dsh-archive/<session-id>/ -r

-r 递归上传,前缀带会话 ID 可避免不同会话产物互相覆盖。上传前先 coscli ls 确认目标前缀为空或符合预期。

四、把结果回投到会话

curl -s -X POST http://127.0.0.1:3080/api/dsh-im/delivery/messages \
  -H 'Content-Type: application/json' \
  -d '{"botId":"<bot-id>","targetId":"<target-id>","text":"已归档 12 个文件到 cos://.../dsh-archive/<session-id>/","format":"plain"}'

botId 与 targetId 取自 /integrations/dsh-<渠道>/workspaces.json 的 deliveryTargets;format 只接受 plain 或 markdown,其他值会被拒。接口只监听 127.0.0.1,无需鉴权,返回 {"sent": true} 表示受理,不代表已送达渠道,只代表进入投递队列。

需要定时归档可用 schedule 能力,固定时刻把提示词投给指定会话;DSH 重启后会补发最近一次。

五、怎么确认成了

  1. 文件清单:会话记录里写文件操作的路径条数应与实际上传条数一致,不一致说明漏路径或权限不足。
  2. 上传结果:coscli cp 成功退出码为 0;常见报错 AccessDenied(密钥或桶策略)和 NoSuchBucket(桶名或地域写错)。
  3. 投递结果:{"sent": true} 只说明受理;要确认送达,需在渠道侧看到消息,或在 /integrations/dsh-im/ 日志里查投递记录。

六、边界与代价

流程假设文件都在本机可读路径下。产物在容器或远程主机里,需先同步到本机再上传,否则清单和实体对不上。会话记录只保留调用痕迹,删掉本地文件后无法从 session.v4.jsonl.zstd 恢复,归档要在清理之前做。上传大目录注意 COS 分片阈值与并发数,小文件多时默认配置吞吐明显下降,可调大并发或先打包再传。

桶的读写权限、生命周期规则属于存储侧配置,与 DSH 无关。不要在会话里让模型代填密钥;密钥放 coscli 配置文件或环境变量里,且该文件不要出现在会话可读目录中。

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注