记在这里的债都是有意欠的,不是忘了。每条写清:是什么、为什么先欠着、 什么条件下该还。
question="1",API 由序号映射到原候选",
而当前前端提交的是选项全部内容拼接的文本(公司名 + 信用代码 + 状态 + 负责人)。status: found)的流程,
选中一家,确认返回的是选定公司后的结果而不是又弹候选列表。
若循环,两条路:①改回提交序号(序号取自当前显示顺序);②后端扩语义识别全字段文本。provider_failure,status: found 一次都没出现过,因此从未验证。answer.text 与 summary.text 首句重复answer.text(渲染在消息正文)又放进 summary.text 的开头,
实测两者首句逐字相同,用户会看到同一段话出现两次。Question.message 字段未被渲染QuestionCard 的 Question 接口里定义了 message 字段,
但模板从未渲染它 —— 适配层写的提示文案一直不可见。wss://qingpu-data-api.metamaker.cn/common/asr_hub
(引擎 aliyun_dashscope),且鉴权 token 与 appKey 都硬编码在源码里
(src/three-libs/asr/index.ts 的 token:iss: human-large-screen,exp 2034-12-29,入库可见)。../reference/current-api-call-sites.md 的「ASR 协议契约」,
实现方照着就能写自建网关,前端一行都不用改(只把 VITE_ASR 指向新地址)。index.html 里写死的 globalThis.isXF = false
改成环境变量开关 —— 这样万一厂商出问题,改配置就能切到讯飞分支,不必改代码重新发版。height: 100dvh 没有 100vh 兜底(BusinessAssistantMobile.vue)——
dvh 是较新的单位(Chrome 108+ / Safari 15.4+),国产浏览器内核多基于更老的版本
→ 该声明被整条丢弃 → 容器高度塌陷,而外层是 overflow: hidden → 内容被裁掉text-size-adjust: 100% —— 移动端浏览器会按各自策略自动放大文字,
各家不同 → 同一份文案在不同手机上长度不同(也是"不同浏览器不一样"的直接来源)width: max-content 决定「单行省略 vs 换行」:
updateMaxWidthReached() 用 getBoundingClientRect() 比卡片与父容器宽度。
而字体首选 "HarmonyOS Sans SC"(手机多无此字体 → 回退到系统字体)→ 字宽不同
→ 测量结果不同 → 该换行时判成"没撑满" → 单行 nowrap 撑出屏幕chrome://inspect
最省事)—— 没有这个只能猜dvh 加 vh 兜底、全局 text-size-adjust: 100%、
给 flex 链补 min-width: 0is-max-width-reached
与 width: max-content。现在这套先天不稳定(字体/时机/内核都会影响测量)browserslist;
项目当前没有任何 browserslist / postcss 降级配置,而代码里用了
dvh(4) / gap(151) / inset(22) / backdrop-filter(24) 等较新特性dvh 仍无 vh 兜底、
仍无 text-size-adjust、思考卡片仍靠 JS 测量切样式,padding-bottom: 180px 也仍是写死的)。
换台手机、或用户调大系统字号,仍可能变样;方案 A/B/C 依然有效,等用户决定要不要做。/dms-api/ 代理,token 由代理服务端注入
(dev 是 vite.config.ts,生产计划是 nginx 同款转发)。这个 token 不区分调用者 ——
任何能打开站点的人,在浏览器 devtools 里对 /dms-api/content/selectContentList 发任意查询,
就能读到 DMS 的全部数据:1887 会话、1888 企业工商信息、1889 问答记录,
包括别家企业的。代理只做「补 /dms 前缀 + 注入 token」,不做任何鉴权。.env.production 没配 VITE_DMS_API)。
dev 环境无所谓(本机、只有自己)。docs/plans/active/dms-api-replacement.md 里"前端直连还是后端转发"
那道待拍板的问题是同一件事,这里给出了必须选后端的理由;.env.development 里有 VITE_DMS_API="/dms-api" + VITE_DMS_TARGET,
而 .env.production / .env.qingpu / .env.test 三份都没有。
这些环境构建出的包里 getDmsApiBaseUrl() 返回空串,后果两条:
①uploadDmsAttachment 直接抛「未配置 DMS 接口地址,无法上传附件」→ 附件功能在这些环境整体不可用;
②DMS 会话/问答/反馈请求走 client.ts 的「未配置就跳过」,静默不落库。
(构建产物可自证:dist/index.html 里 globalThis.VITE_DMS_API = "%VITE_DMS_API%" 原样留着。)http://121.43.55.7:10081)从部署环境是否可达;
②token 谁注入 —— 开发环境是 vite 代理在转发时加 token 头(浏览器不持有 token,
见 vite.config.ts 的 /dms-api/),生产要由 nginx(或后端网关)做同样的事,
否则 DMS 会因鉴权失败而拒;顺带 /dms-api 还要把 /dms 前缀补回去。
③index.html 的 %VITE_DMS_API% 支持运行时注入(globalThis.VITE_DMS_API 优先),
所以也可以不改构建、只改部署产物里的这一行——但同样绕不开 ②。CreateToken,24 小时过期)。secret 不能进前端产物(bundle 是公开的),
所以 vite.config.ts 里加了一个 dev-only 的端点 GET /nls-token/
(apply: 'serve',返回 {token, expireAt, appkey})。.env.development.local),
但生产没这个端点 —— 打包产物里没有、也不该有任何换 token 的能力。GET /nls-token/ → {token, expireAt, appkey},secret 留在服务端。
这样前端的代码一行都不用改,只是 dev 与生产的实现者不同。c_credit_code 只放真实信用代码」后,访客行也带着
对话提到的那家公司的代码;而 fetchDmsSessions(读「我的会话」)按 c_credit_code 查、
且只在登录后调用 → 那家公司登录后会看到陌生访客的会话。fetchDmsSessions 增加一道过滤 —— 排除「明确是访客」的行
(c_is_login === "0")。只排除显式访客行(c_is_login 缺失的历史行照旧返回),
因此可见范围与改造前完全一致。c_is_login === "1")不再允许访客对话改写
它的公司字段 —— 否则退登后再问到别的公司,会把这行改到那家公司名下、而 c_is_login
仍是 "1",既串台又会被读侧当登录行返回。verify-dms-chat-storage.mjs 打真实 DMS,两个方向都断言(访客行查不到 /
登录行查得到),且实测「拿掉过滤该断言立刻失败」——是真守卫。{thread_id, question},多一个字段 422,
旧协议的 transmission.files / file_pos 发不出去 —— 上传入口虽然活着,
但附件只能把 OSS 地址拼进 question 文本(方案②),模型会把 URL 当正文读,
本地消息、会话标题、DMS 记录也都跟着被 URL 污染。pictures: string[] —— 图片 URL 列表(后端自己去取图,须公网可达)files: string[] —— 非图片文件 URL 列表[{url,name}] 会被 422 invalid_request 拒掉);
带上 pictures 问「这张图片里是什么」,模型确实描述出了图的内容(不是收下就忽略);
空数组与不传都接受。toChatAttachmentUrls() 按 isImage 拆成两个列表随请求体发出;
地址不再拼进 question。旧函数 buildQuestionWithAttachments 按约定注释保留。thread_id + question ——
既不多传无意义字段,也让「后端若回滚」只影响带附件的那几轮。harness/tools/verify-attachment-question.mjs 19/19(拆分纯逻辑 + 真正发出的
请求体 + 「旧函数无活跃调用点」的源码级断言);字段生效是打真实后端探针实测的。token-streaming.md:「完整校验后绑定真实链接,随最终替换出现」;
「answer_end 无论 status 是 completed 还是 fallback,均用 text 覆盖已有内容……
不能只停止光标而保留草稿」### 高新技术企业认定… → ### 一、高新技术企业认定…)、
把纯文本渠道换成了 markdown 链接(- 国家高新技术企业认定管理工作网先行注册… →
- [查看办事指南](https://zwdt.sh.gov.cn/…))。链接只在最终校验后才绑定,草稿必然没有。status: fallback 那一类更直接:草稿被判不可用 → 换成降级答复
(「已查到相关资料,但这次未能完成答复整理。您可以查看下方原文资料,或稍后重试。」)/api/chat 原始载荷,比对 concat(answer_delta) 与 answer_end.text
的公共前缀长度(harness/tools/probe-answer-tail-timing.mjs 可改造成此用途)。