# 开发、验证与发布 > [README.md](../README.md) 的补充材料。 ## 余额与花费怎么算 ### 余额 `GET https://api.deepseek.com/user/balance`,用 DSH 里配置的 `DEEPSEEK_API_KEY` 鉴权。 结果缓存 25 秒,并发请求合并;网络抖动时继续显示上一次的值并标注「(缓存)」。 ### 今日已用 两种来源,自动选择: 1. **官方用量接口**(准确)—— 配置 `DEEPSEEK_PLATFORM_TOKEN` 后调用 `platform.deepseek.com/api/v0/usage/by_api_key/amount`,按真实 token 分桶计价。 2. **余额差额记账**(保底)—— 只靠 `DEEPSEEK_API_KEY`:每次读到余额就和上一次比较, 减少的部分记为消费,累加进当天用量;跨天归零并把前一天归档。余额上升(充值)只更新 基准不计消费,币种跳变也只重设基准。 账本文件:`%USERPROFILE%\.dsh\.dsh-gal-usage.json` ### 每轮消耗 监听 DSH 的 `session/event` 事件流: * `assistant/message` 带每一步真实的 `usage`(输入 / 缓存命中 / 输出 / 推理 token), 按 `(会话 id, 轮次)` 分桶累加,主会话与并行子代理不会串账。 * `turn/end` 结算该会话本轮,生成自增的 `seq`;前端轮询到 `seq` 变化就弹对话框。 计价用 DeepSeek 官方价(人民币 / 百万 token),区分高峰与空闲时段,见 [customize.md 的定价表](customize.md)。 ## 宿主侧 HTTP 接口 | 方法 | 路径 | 说明 | |---|---|---| | GET | `/dsh-gal/client.js` | 浏览器侧脚本 | | GET | `/dsh-gal/api/bootstrap` | 启动时一次性拉取配置 + 包列表 + 对话框几何 + 余额 + 今日用量 | | GET | `/dsh-gal/api/state` | 余额与今日用量 | | GET | `/dsh-gal/api/turn` | 最近一轮的 token / 花费(含自增 `seq`) | | GET | `/dsh-gal/api/next` | 随机抽一条语音 + 一张立绘(返回台词) | | GET | `/dsh-gal/api/packs` | 立绘包 / 语音包列表 | | GET/PUT | `/dsh-gal/api/config` | 读取 / 局部更新配置 | | GET/PUT/DELETE | `/dsh-gal/api/dialog-image` | 换底图:GET 报当前几何,PUT 传图片或 `?preset=blank`,DELETE 恢复默认 | | GET | `/dsh-gal/asset/ui/dialog.json` | 对话框底图的裁切与排版几何(每次请求重读,改完即时生效) | | GET | `/dsh-gal/asset/ui/{dialog.png,settings.png,click.wav}` | 固定 UI 素材 | | GET | `/dsh-gal/asset/sprite?pack=&file=` | 立绘图片 | | GET | `/dsh-gal/asset/voice?pack=&file=` | 语音文件 | 素材路由只返回扫描到的文件名,路径穿越(`../`)在结构上就不可能。 ### 客户端脚本怎么进到页面里(两条通道,缺一不可) | 页面形态 | index 从哪来 | 用哪条通道 | |---|---|---| | 官方桌面端(`dsh-app://app/`) | 打包好的静态 `dsh-web-frontend/dist/index.html` | **结构化注入行**:`ctx.on('webserver/index-inject', …)` 推 `{ kind: 'script-src', src: '/dsh-gal/client.js' }` | | web / HTTP(含 `npx dsh web`、社区桌面端) | 宿主 `renderIndex()` 渲染 | `ctx.webServer.tapIndex(html => …)` 插 `