查看: 133|回复: 3

鸿蒙ArkUI开发健康教练App:一卡多账与模型网关热量估算实践

[复制链接]
发表于 1 小时前 | 显示全部楼层 |阅读模式
今年入伏后,一位开发者用鸿蒙技术栈给自己写了个健康打卡App“瘦得漂亮”。App由ArkUI三页签界面、Python网关和蓝耘MaaS平台的DeepSeek-V3.2模型组成。用户一句话同时记录体重和饮食,模型估算热量,网关聚合日志并做精确计算。本文聚焦该项目的两个关键技术细节:模型API调用坑和ArkUI @Builder传参踩坑与修复,以及网关的兜底设计。

一、架构定调:API Key只放网关

项目一开始就定下规则:蓝耘的API Key只放在网关环境变量中,ArkTS代码里不出现。端侧只与127.0.0.1:18090通信,网关再拿Key调蓝耘接口。这样端侧代码可随意截图发布,不用担心Key泄露。网关启动命令如下:
  1. export LY_API_KEY="你的蓝耘Key"
  2. export LY_BASE_URL="https://maas-api.lanyun.net/v1"
  3. export LY_MODEL="/maas/deepseek-ai/DeepSeek-V3.2"
  4. python3 slim_health_gateway.py
复制代码

启动时输出“LLM configured: True”即表示模型配置完成。

二、模型调用两个容易踩的坑

调蓝耘API有两个常见错误:一是模型名必须带“/maas/”前缀,例如“/maas/deepseek-ai/DeepSeek-V3.2”,写成“deepseek-chat”会直接返回404;二是Base URL已经带了“/v1”,代码里如果再拼“/v1/chat/completions”就会变成“/v1/v1/...”,报405。这两个坑在控制台模型详情页的API示例里都有写明,照着抄即可避免。

三、@Builder传参的坑:日报页数据不更新

日报页出现一个怪现象:顶部统计位显示正确的750 kcal摄入和160 kcal消耗,但切换到日报页签时,卡片里三个数字还是0。排查发现是ArkUI @Builder的传参语义问题。开发时把卡片渲染抽成了带参数的@Builder,日报页里写的是this.CardView(this.reportCard)。参数是按值传入的,首次构建时拷贝了一份快照,之后@State reportCard更新,Builder内部拿的还是旧拷贝。而顶部三个数字直接读this.intakeKcal,走正常状态绑定,所以一直能更新。

修复方法是日报页不走带参Builder,直接在页签里读状态渲染:
  1. Text(this.reportCard.title)
  2. ForEach(this.reportCard.lines, (line: string) => {
  3.   Text(line)
  4. }, (line: string, index: number) => String(index) + '-' + line)
复制代码

改完后再切页签,日报卡和顶部数据就一致了。有趣的是,聊天流里的历史卡片故意保留按值传参,那是每条消息当时的快照,不应该随后续状态变化。同一个语义,一处是坑,一处正好符合需求。

四、兜底设计:模型不可用时正则直取

App包含两道边界:一在提示词中(极端节食不生成记录),一在代码里。当网关停掉、API Key未设置时,启动会输出“LLM configured: False”,App顶部胶囊转为橙点并显示“兜底模式”。此时用户输入“现在67.0kg”,体重照样能入账,因为网关里提前用正则匹配了体重格式。但输入“吃了两串炸串和一杯奶茶”,回复则是“大模型暂时不可用,这句话我记不进去”——热量估算依赖模型,兜底层干不了的事就明说,不假装记录成功。卡片底部也会相应显示“规则兜底解析”,向用户透明说明数据来源。

五、总结与成本

该App的打卡成本极低:DeepSeek-V3.2在蓝耘标价输入2元/百万token,一句话几百token,一天几十次调用花不到一分钱。目前仍待完善之处:热量估算完全依赖模型常识,未对接食物数据库,同一碗燕麦粥两次估算可能差几十kcal,对严格控卡的用户不够精准。但作为个人健康教练,已经能实现一句话多数据录入、实时热量汇总和体重趋势展示。感兴趣的同学可自行搭建类似架构,注意规避上述API调用和[@Builder]传参的坑即可。
回复

使用道具 举报

发表于 1 小时前 | 显示全部楼层

Re: 鸿蒙ArkUI开发健康教练App:一卡多账与模型网关热量估算实践

这篇文章非常实用,感谢分享!API Key只放网关的思路很值得学习,既保证了端侧代码可公开,又避免了泄露风险。蓝耘API的“/maas/”前缀和Base URL拼接的细节确实是新手容易踩的坑,提醒得很到位。@Builder按值传参导致的日报页不更新案例也很有价值,同一个语义在不同场景下差别这么大,用快照做历史记录反而是合理的设计。兜底模式用正则匹配体重、对无法处理的情况明确说“记不进去”,既诚实又可靠,用户体验上比悄悄失败好得多。整体来说这篇实践记录干货满满,期待后续如果能对接食物数据库的升级版本。
回复 支持 反对

使用道具 举报

发表于 1 小时前 | 显示全部楼层

Re: 鸿蒙ArkUI开发健康教练App:一卡多账与模型网关热量估算实践

感谢楼主分享这么详细的实战经验!特别喜欢你们“API Key只放网关”的设计思路,不仅安全,还能让端侧代码干净地开源。模型调用的两个坑——模型名前缀和Base URL重复拼接——确实是很多新手容易踩的,你点出来能帮不少人省时间。 @Builder传参那个坑很经典:按值传参导致快照不更新,而`@State`直接绑定却能响应变化。你用日报页和聊天历史快照两个场景对比解释,把“坑”和“正确用法”讲得很清楚,尤其最后说“同样的语义,一处是坑,一处正好符合需求”,这种辩证看待框架特性的角度很有启发性。 兜底设计里的正则直取也很务实,没让用户在大模型挂掉时完全傻眼,而且主动展示“规则兜底解析”的透明度好评。成本控制更是亮眼,一天几分钱就能跑个人健康教练,确实让普通开发者也有动力尝试类似的AI+原生应用。 想问下,你们在网关层做的“热量估算全依赖模型常识”,有没有考虑过后续用本地的轻量级食物数据库做二次修正?比如模型给出估算后,网关再查预载的常见食物kcal表做加权,或者让用户手动校准后结果缓存下来?这样可能能减少同食物的波动误差。
回复 支持 反对

使用道具 举报

发表于 1 小时前 | 显示全部楼层

Re: 鸿蒙ArkUI开发健康教练App:一卡多账与模型网关热量估算实践

这个健康打卡App的设计思路很清晰,尤其是“API Key只放网关”的架构决策非常实用,确实能避免端侧泄露的风险。那两个API调用坑也很典型,模型名加前缀和URL重复/v1,感谢你明确指出来,以后用蓝耘时直接避开了。@Builder传参的“快照”现象解释得很透彻,我正好也遇到过类似问题,当时还困惑为什么数据不更新,原来是按值传入的拷贝,这个修复方案很干脆。兜底设计用正则匹配体重、对大模型不可用的情况诚实反馈,这种透明处理让人放心。成本估算也很诱人,一天不到一分钱。问一下,如果后续接入食物数据库,是打算用本地缓存还是继续调API做参考?
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

指导单位

江苏省公安厅

江苏省通信管理局

浙江省台州刑侦支队

DEFCON GROUP 86025

Hacking Group 021A

旗下站点

态势感知中心

应急响应中心

红盟安全

联系我们

官方QQ群:112851260

官方邮箱:security#ihonker.org(#改成@)

官方核心成员

关注微信公众号

Archiver|手机版|小黑屋| ( 沪ICP备2021026908号 )

GMT+8, 2026-7-22 14:42 , Processed in 0.033850 second(s), 18 queries , Gzip On, Redis On.

Powered by ihonker.com

Copyright © 2015-现在.

  • 返回顶部