Skill全文级超长内容转文件:新增host发文件能力(issue #163) #169
Loading…
Add table
Add a link
Reference in a new issue
No description provided.
Delete branch "feat/163-file-egress-capability"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Closes #163
What
从 issue #154 拆出的第三级"文件"部分:设计并落地 host 侧发文件能力,
inject_skills全文级超长内容改为转文件,不再只是截断+提示。CapabilitySet.file+EgressPort.send_file(chat_id, content: str, *, filename: str) -> str,形状仿sticker/voice(能力位+方法成对,位为假时 core 不走这条路径)——落点经 design-verify 核对ArisePortsdocstring 判据(resource/economic_hook/is_group_admin三个可选 port 都是"host 要不要接一层带载荷的服务",而发文件是一次纯粹的发送动作,精确落在"能力位+方法成对"这一类,不新开ArisePorts可选字段)inject_skills(_handle_inject_skills)全文级内容超过arise_skill_full_text_max_chars时,capabilities.file为真且本轮发送预算未耗尽才改经send_file发送,否则维持 issue #154 落地的截断+提示既有降级路径_PendingSend/_flush/_send_pending管线,不是对egress.send_file的孤立裸调用——因此自动获得MAX_SENDS_PER_TURN预算约束(与send_message/edit降级路径共享同一个 turn 级预算)、Sent Log 句柄记录(可self_recall)、issue #95 的失败回灌保护,避免绕开发送预算无限发文件,也避免制造 ADR-0013 点名的"孤儿消息"_PendingSend新增filename/file_payload字段,与既有content字段分开:content只放一句人类可读的短摘要(记进 Sent Log/Delta),真正发给平台的原文只在file_payload里——避免技能全文经_append_delta原样写回下一轮上下文,把"转文件省 token"这件事自己抵消inject_skills是信息检索工具,有兜底内容可给,不照搬edit降级路径的硬错误)Design-Verify
两轮独立方案 + 对抗式交叉核实 + 合并,产出比两份原方案都更完整的最终决策:两份原方案都遗漏了"必须流经
_PendingSend/_flush管线"这一关键要求(会绕开MAX_SENDS_PER_TURN且制造孤儿消息),也都没意识到"技能全文经 Delta 回灌抵消转文件收益"这个问题——这两点是合并阶段新发现并采纳进最终方案的。Review 修复
两轴 review + 对抗式 Verify 确认 5 处文档漂移问题(无功能性 bug)并已修复:
docs/design.md的"技能"条未跟随 CONTEXT.md 同步更新——已同步edit降级路径)——已订正为"新增第三个消费方"tests/test_skill.py的TestRenderSkillFulldocstring 仍写"issue #163 落地前的过渡行为"——已同步skill.py的新措辞Test plan
uv run pytest -q:1999 passeduv run ruff check src/ tests/:全通过uv run lint-imports:2 kept, 0 brokenty check:47 diagnostics(与 main 基线一致,无新增)_handle_inject_skills的能力位/预算耗尽守卫 +_send_pending的 file 分支路由/参数传递逐一变异验证测试能捕获