大模型多模态专题:验证记录

« 返回专题

本页由 docs/tools/llm-vision/publish.py 根据最终归档的校验报告生成,表中的 SHA-256 就是下载文件的哈希。

校验总览

课 模型 下载 SHA-256(前 12 位) 积木数 编辑器载入 / 保存重开 后台导入 Android APK 业务检查
第 1 课 拍照识物 DeepSeek VisionSnap.aia a4a85931c2a0 176 0 错误 通过 通过 27 项通过
第 2 课 拍题讲解 DeepSeek HomeworkTutor.aia 6432fcd562ba 209 0 错误 通过 通过 25 项通过
第 3 课 拍餐估热量 通义千问 MealCalorie.aia d8ca6246b5e5 342 0 错误 通过 通过 24 项通过
第 4 课 AI 画图 豆包 AiPainter.aia 1b52fb7544e2 254 0 错误 通过 通过 24 项通过
第 5 课 照片变漫画 豆包 PhotoComic.aia 4ef55bfbc3ec 194 0 错误 通过 通过 20 项通过
第 6 课 视频摘要 通义千问 VideoSummary.aia 93c83d140fde 228 0 错误 通过 通过 22 项通过
第 7 课 照片绘本 DeepSeek + 豆包 PhotoStory.aia 5e24dfd7def7 317 0 错误 通过 通过 20 项通过

每一项是怎么验的

  • 编辑器载入 / 保存重开:用与线上编辑器同源的 Blockly 载入最终 .aia 的全部积木,核对积木数、变量下拉框的内部值和完整 YAIL 生成,再保存、重开一次,均为 0 错误。
  • 后台导入:用平台真实的项目导入代码导入 .aia(含 LLMAI2Ext 拓展),核对屏幕、积木、拓展与素材都保留。
  • Android APK:把最终工程交给真实的编译服务器,编出非空 APK。
  • 业务检查:直接执行最终 .aia 里的积木。大模型组件(DeepSeek / 通义千问 / 豆包)用替身,行为照拓展源码实现:参数校验、流式分段与最后一次 finished 为真、思考过程走 GotReasoning、多轮历史(识图消息与回答都进历史,StartNewChat 清空)、本地图片真读文件编码、出错时错误编号 3300 与 Error <码> in extension LLMAI2Ext: … 的消息格式;每次请求的模型名、提示词、图片尺寸、对话历史都被记录下来逐条核对。模型的回答内容由测试脚本给出(含带客套话、JSON 被截断、字段缺失、数字写成文字等坏情况)。图片压缩、转 Base64 用 Pillow 真做;JSON 解码按严格模式(与鸿蒙一致,比安卓更严)。
  • 教程摘录:每课页面里的每一段积木,都逐块核对与该课工程源码逐字相同(check_excerpts.py),读者照抄的就是经过上述检查的那一份。
  • 没有做的:真实调用大模型(需要付费 API Key,回答也不固定)、真机运行、AI 伴侣联调、鸿蒙 HAP 编译。

各课业务检查明细

第 1 课 拍照识物(VisionSnap.aia)

SHA-256:a4a85931c2a04e662279c45838aaa8a4ff9104e5238f2759abf4a7e4582c219a,校验时间 2026-10-12。未验证:浏览器界面里手动导入、AI 伴侣实时调试、真机运行、鸿蒙 HAP 编译;真实调用大模型。

  1. 没填 API Key 时拍完照不发请求,提示先填 Key
  2. 首次打开提示先填 API Key
  3. 没粘贴 Key 就点保存:提示,不存
  4. 保存时去掉首尾空格,存到手机并设给大模型组件
  5. 重新打开 App 自动读出保存的 API Key
  6. 用 DeepSeek 默认模型 deepseek-flash(文本与识图同一个模型)
  7. 点「拍照」打开照相机
  8. 发给模型的是压缩后的图:最长边 1024,409 KB → 33 KB
  9. 提问用「想问它什么」框里的话
  10. 预览显示的就是发出去的那张压缩图
  11. 发图前先开新对话
  12. 请求发出后三个按钮变灰、显示「正在看图」
  13. 回答没完时再选图:提示稍等,不发第二个请求
  14. 第一段到达就显示,按钮仍然不可点
  15. 后面的片段接在后面,不覆盖
  16. 最后一段(finished 为真)到达后按钮恢复,提示可以追问
  17. 追问框是空的:提示,不发请求
  18. 追问用普通对话发出,请求里带着刚才那张图和上一轮回答(模型记得这张图)
  19. 追问的回答替换上一段,追问框清空
  20. 从相册换一张图:开新对话,请求里只有这一张新图
  21. 「想问它什么」留空时用默认问题
  22. 竖拍照片同样按最长边压到 1024(768×1024)
  23. Key 错了(401):状态行说清原因,按钮恢复
  24. 余额不足(402):状态行说清原因,按钮恢复
  25. 请求太频繁(429):状态行说清原因,按钮恢复
  26. 照片文件读不出来(压缩失败):提示换一张,不发请求
  27. Key 被清空后:拍照不发请求

第 2 课 拍题讲解(HomeworkTutor.aia)

SHA-256:6432fcd562ba37bfdbe25bee4d990526973162c614dbe617b7e71365d8c04fef,校验时间 2026-10-12。未验证:浏览器界面里手动导入、AI 伴侣实时调试、真机运行、鸿蒙 HAP 编译;真实调用大模型。

  1. 首次打开提示先填 API Key
  2. 没粘贴 Key 就点保存:提示,不存
  3. 保存时去掉首尾空格,存到手机并设给大模型组件
  4. 重新打开 App 自动读出保存的 API Key
  5. 打开就开启思考模式,思考强度 high
  6. 还没拍题时追问框空:提示先写问题
  7. 还没拍题就追问:提示先拍题,不发请求
  8. 默认只讲思路、不显示思考过程
  9. 拍题后用识图对话发出,请求带思考模式
  10. 题目照片压到最长边 1600(字要看得清)
  11. 「只讲思路」开着:提示词要求不给答案、只用纯文字
  12. 发出后按钮全部变灰,显示「正在思考」
  13. 思考片段只进「思考过程」标签,讲解标签还是空的
  14. 思考结束(GotReasoning 的 finished 为真)时提示开始讲解
  15. 讲解一段段接上,思考内容不混进讲解
  16. 讲完后按钮恢复
  17. 打开「显示思考过程」开关:思考区域出现(内容一直在收,只是不显示)
  18. 「这步没看懂」:普通对话发固定的话,请求里还带着这道题的图
  19. 新一轮开始时清空上一轮的思考与讲解
  20. 「出道类似题」:要求只给题目、不给答案
  21. 自己写的追问去掉首尾空格发出,输入框清空
  22. 多轮历史一直累积:第 4 次提问时,请求里是前 3 问 3 答 + 这一问,共 7 条
  23. 关掉「只讲思路」再拍一题:开新对话,提示词要求写出答案
  24. Key 错了(401):状态行说清原因,按钮恢复
  25. 余额不足(402):状态行说清原因,按钮恢复

第 3 课 拍餐估热量(MealCalorie.aia)

SHA-256:d8ca6246b5e5eed5310cd7588c8a968275b05d12f9cd8bbe864013de98e427b1,校验时间 2026-10-12。未验证:浏览器界面里手动导入、AI 伴侣实时调试、真机运行、鸿蒙 HAP 编译;真实调用大模型。

  1. 首次打开提示先填 API Key
  2. 没粘贴 Key 就点保存:提示,不存
  3. 保存时去掉首尾空格,存到手机并设给大模型组件
  4. 重新打开 App 自动读出保存的 API Key
  5. 打开时显示今天的账本(还没有记录)
  6. 识图前换成视觉模型 qwen3-vl-plus,并关掉流式(要拿完整 JSON)
  7. 提示词约定只回一个 JSON 对象,并说明 foods / kcal / total / tip 字段
  8. 照片压到 1024 发出,识别期间按钮变灰
  9. 每样食物一行:名称 + 「分量 · 约 N 千卡」(小数四舍五入)
  10. 合计按各项自己加(174+260+82.5≈517),不用模型写的 total=480
  11. 显示建议,「记到今天」可点,状态说明认出几样、热量是估算值
  12. 记一笔:存进今天的标签(meals-2027-01-15),账本更新,按钮变灰防重复记
  13. 回答前后带了客套话和 ```json 代码块:从第一个 { 截到最后一个 } 照样解析
  14. kcal 写成文字「约550」不是数字:这一项按 0 计,不让整顿崩掉
  15. 第二顿累加到今天的账本
  16. 重新打开 App:今天的账本还在
  17. 第二天打开:换了新标签,从零开始
  18. 回答里根本没有 JSON:提示再拍一次,列表清空,不能记账
  19. JSON 被截断(解码失败报 1105):提示再拍一次,列表清空,不能记账
  20. 图里没有食物(foods 为空):提示换个角度
  21. 清空今天:删掉今天的标签
  22. Key 错了(401):状态行说清原因,按钮恢复
  23. 阿里云欠费(Arrearage):状态行说清原因,按钮恢复
  24. 模型名换回了纯文本模型:状态行说清原因,按钮恢复

第 4 课 AI 画图(AiPainter.aia)

SHA-256:1b52fb7544e2820caca6d61d6c655c4a6895b6442dbd420155113d2593cbc852,校验时间 2026-10-12。未验证:浏览器界面里手动导入、AI 伴侣实时调试、真机运行、鸿蒙 HAP 编译;真实调用大模型。

  1. 首次打开提示先填 API Key
  2. 没粘贴 Key 就点保存:提示,不存
  3. 保存时去掉首尾空格,存到手机并设给大模型组件
  4. 重新打开 App 自动读出保存的 API Key
  5. 还没有作品时「改」「下载保存」「分享」都是灰的
  6. 描述是空的:提示,不发请求
  7. 文生图:描述去掉首尾空格,默认尺寸 2K,生图模型用 ImageModelName 默认值
  8. 生成期间「开始画」变灰,显示「正在画」
  9. GotImage:图片地址直接给图像组件显示,记为第 1 版
  10. 选「竖版 9:16」时尺寸传 1440x2560
  11. 选「横版 16:9」时尺寸传 2560x1440
  12. 「改」的输入框是空的:提示怎么写
  13. 图生图:在当前这一版(第 1 版的地址)上改,输入框清空
  14. 改好的是第 2 版,「上一版」可点
  15. 退回上一版:显示第 1 版,已经是最早的一版时「上一版」变灰
  16. 退回后再改:以正在看的第 1 版为底,结果追加为第 3 版
  17. 下载保存:请求当前这一版的地址,文件名带时间戳不会互相覆盖
  18. 下载完成(200):说明存在哪,「分享」可点
  19. 分享的是刚下载的那个文件
  20. 切到别的版本后「分享」变灰(下载的不是这一版)
  21. 链接过期下载失败(404):提示重新画
  22. Key 错了(401):状态行说清原因,按钮恢复
  23. 生图模型没开通(ModelNotOpen):状态行说清原因,按钮恢复
  24. 内容审核没通过(Sensitive):状态行说清原因,按钮恢复

第 5 课 照片变漫画(PhotoComic.aia)

SHA-256:4ef55bfbc3eceff827582ad377bf05c903c637ac1012ef63a6791bf3ddc6b744,校验时间 2026-10-12。未验证:浏览器界面里手动导入、AI 伴侣实时调试、真机运行、鸿蒙 HAP 编译;真实调用大模型。

  1. 首次打开提示先填 API Key
  2. 没粘贴 Key 就点保存:提示,不存
  3. 保存时去掉首尾空格,存到手机并设给大模型组件
  4. 重新打开 App 自动读出保存的 API Key
  5. 还没选照片就点风格:提示先选照片
  6. 本地照片压缩后转成 data:image/jpeg;base64, 开头的图片地址,内容就是压缩后的文件
  7. 先压缩再编码:原图 409 KB → 编码后的地址约 50 KB
  8. 照片选好后提示选风格
  9. 图生图:参考图传 Base64 地址,提示词写明风格并要求保留人物与构图
  10. 生成期间风格按钮和换照片按钮全部变灰
  11. 生成期间换照片:提示稍等,原图不变
  12. 返回后显示结果,按钮恢复
  13. 「水彩插画」:同一张原图,只换提示词里的风格名
  14. 「像素游戏」:同一张原图,只换提示词里的风格名
  15. 「3D 黏土动画」:同一张原图,只换提示词里的风格名
  16. 四种风格的提示词除了风格名完全一样
  17. 新照片读不出来:提示换一张,保留上一张
  18. Key 错了(401):状态行说清原因,按钮恢复
  19. 照片审核没通过(Sensitive):状态行说清原因,按钮恢复
  20. 生图模型没开通(ModelNotOpen):状态行说清原因,按钮恢复

第 6 课 视频摘要(VideoSummary.aia)

SHA-256:93c83d140fde7c7c059fd95a8cb99fc4a52eea624f0f03b8846fc58f95dbf799,校验时间 2026-10-12。未验证:浏览器界面里手动导入、AI 伴侣实时调试、真机运行、鸿蒙 HAP 编译;真实调用大模型。

  1. 首次打开提示先填 API Key
  2. 没粘贴 Key 就点保存:提示,不存
  3. 保存时去掉首尾空格,存到手机并设给大模型组件
  4. 重新打开 App 自动读出保存的 API Key
  5. 打开时把模型换成能看视频的 qwen3-vl-plus
  6. 预览:地址不以 http(s):// 开头时提示
  7. 开始:地址不对时不发请求
  8. 预览:去掉空格后交给视频播放器播放
  9. 用视频对话发出:视频以 video_url 传给模型(模型自己去下载)
  10. 默认任务「一句话概括」;发出后按钮变灰
  11. 结果一段段出现
  12. 看完后按钮恢复
  13. 复制结果到剪贴板
  14. 追问:普通对话发出,请求里还带着这个视频
  15. 任务「分段时间线」:换对应的提示词,并开新对话(不重复带上一轮)
  16. 任务「列出画面里的文字」:换对应的提示词,并开新对话(不重复带上一轮)
  17. 任务「出 3 道理解题」:换对应的提示词,并开新对话(不重复带上一轮)
  18. 没有结果时点复制:提示
  19. 还没看过视频就追问:提示
  20. 视频地址下载不了:状态行说清原因,按钮恢复
  21. Key 错了(401):状态行说清原因,按钮恢复
  22. 阿里云欠费(Arrearage):状态行说清原因,按钮恢复

第 7 课 照片绘本(PhotoStory.aia)

SHA-256:5e24dfd7def7ec263b50bdc964967aca7b650147c7139df84940de50d3d6a124,校验时间 2026-10-12。未验证:浏览器界面里手动导入、AI 伴侣实时调试、真机运行、鸿蒙 HAP 编译;真实调用大模型。

  1. 首次打开说明两个 Key 都没填
  2. 只存了 DeepSeek 的 Key:状态行写明还差豆包
  3. 少一个 Key 时选照片:提示填全,不发请求
  4. 火山方舟 Key 为空时点保存:提示,不存
  5. 两个都存好后状态行确认
  6. 重新打开 App:两个 Key 都自动读出
  7. 写故事这一步关掉了流式(设计器属性),要拿完整 JSON
  8. 第一棒:照片交给 DeepSeek,约定返回 title / story / scene 三个字段的 JSON
  9. 写故事期间按钮变灰
  10. 解析出题目和正文(正文里的换行原样保留)
  11. 第二棒:把 scene 加上所选风格交给豆包文生图
  12. 插画回来后显示,「换个结局」「重画插画」可点
  13. 换风格重画:同一个画面描述,只重画插画,不重写故事
  14. 换个结局:普通对话发出,请求里带着照片和上一版故事
  15. 新故事回来后自动按新的画面重画插画
  16. 回答里缺 scene:用题目当画面描述,第二棒照样能画
  17. 回答不是 JSON:提示重选照片,不调用画图,按钮恢复(还没有故事时「换个结局」仍是灰的)
  18. JSON 被截断(解码失败):提示重选照片,不调用画图,按钮恢复(还没有故事时「换个结局」仍是灰的)
  19. 第一棒出错:状态行写明是「写故事」失败
  20. 第二棒出错:故事保留,状态行写明是「画插画」失败,可以点「重画插画」再试

复现

# 在仓库 appinventor/ 目录下
python3 docs/tools/llm-vision/specs.py
node skills/ai2-app/lib/ai2gen.js build docs/llm-vision-benchmark/sources/<应用名> \
     --ext docs/markdown/reference/extensions/LLMAI2Ext/cn.fun123.LLMAI2Ext.aix --repo .
python3 docs/tools/llm-vision/check_business.py --report docs/llm-vision-benchmark/reports/business.json
python3 docs/tools/llm-vision/capture.py
python3 docs/tools/llm-vision/publish.py
文档反馈