Skip to content

构建(编译 APK)成功后文件卡片 100% 自动触发——产物自动挂载(方案 B) #19

Description

@X-SCI-TECH

使用场景 / 要解决的问题

用户让 AI 执行编译(如 ./gradlew assembleUniversalRelease)并成功后,预期聊天区稳定出现 APK 文件卡片(点击可安装/打开)。现状:

  • 文件卡片只在模型额外调用 sendFile(展示型工具)后才渲染:ToolMessageComponents.kt 的渲染条件是「工具结束且消息带附件」;
  • 是否调用 sendFile 由模型自主决定,构建成功却“忘记”调用时无卡片、无提示——触发率不是 100%,体验不稳定。

期望的解决方案(方案 B:产物自动挂载)

  1. 构建结果后处理:终端/构建命令整体成功后,正则扫描命令输出与工作区,识别构建产物(*.apkapp/build/outputs/apk/**/*.apk 等常见形态);
  2. 命中即自动附带文件卡片元数据:复用现有附件体系(StatefulAgentWorkflowattachments 字段,UI 渲染、不回放进模型上下文),不依赖模型调用 sendFile
  3. 沿用现有点击打开链路copyToLocal + FileProviderfile_paths.xml),APK 的 MIME 识别沿用 SendFileTool 已有的 application/vnd.android.package-archive
  4. 多产物支持:一次构建产出多个 APK(不同变体)时,一张卡片承载多个文件,可左右滑动;
  5. 路径兼容:覆盖不同变体输出目录(universal/releaseuniversal/debug 等)与自定义 outputDir;产物被清理/不存在时静默降级——无卡片、不报错、不阻塞对话;
  6. 与手动 sendFile 共存:自动挂载不改变模型手动 sendFile 的能力。

备选方案

  • 方案 A(仅提示词):在工具使用规则中硬性规定「构建成功后必须调用 sendFile 展示产物」——改动最小,但本质仍是模型概率性调用,只能提升触发率、无法保证 100%。
  • 方案 C(A+B 结合):以 B 兜底确定性,以 A 兜底非 APK 类其它产物(文档、压缩包等)的展示指引。

补充信息

  • 现状渲染条件:ToolMessageComponents.kt!running && message.attachments.isNotEmpty()
  • 附件元数据流:AgentWorkflow.kt / StatefulAgentWorkflow.ktattachments(仅展示型工具附带,供 UI 渲染,不入上下文)
  • SendFileTool.kt:已有 APK MIME 识别、原子校验、copyToLocal 本地预览链路,可作为自动挂载的实现参考
  • 点击打开权限:app/src/main/res/xml/file_paths.xml(FileProvider)

验收期望

  • 连续多次编译 APK,文件卡片触发率 = 100%;
  • 编译成功但产物缺失时,对话正常结束、无异常提示;
  • 点击卡片可正常安装/打开 APK;
  • 产物不进入模型上下文,Token 消耗不受影响。

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions