From e00b6170250354aedfbba8d4bc6dd38a026018eb Mon Sep 17 00:00:00 2001 From: Rodger-Wang <1367893453@qq.com> Date: Mon, 14 Sep 2026 18:04:49 +0800 Subject: [PATCH] =?UTF-8?q?services,admin,client:=20=E6=9C=8D=E5=8A=A1?= =?UTF-8?q?=E9=85=8D=E7=BD=AE=E6=8C=89=E5=BA=94=E7=94=A8=E9=9A=94=E7=A6=BB?= =?UTF-8?q?=E3=80=81=E5=BA=94=E7=94=A8=E5=8F=82=E6=95=B0=E4=B8=8B=E7=BA=BF?= =?UTF-8?q?=E3=80=81=E5=AE=A2=E6=88=B7=E7=AB=AF=E5=87=AD=E6=8D=AE=E8=B5=B0?= =?UTF-8?q?=E5=8A=A0=E5=AF=86=20v3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 后台 - 服务配置去掉「全局默认」层,svc_config / svc_region_override / echomeet_orch / echomeet_orch_setting / echomeet_template 五张表统一按 app_name 隔离, 启动迁移 migrate_scope.go 幂等分配(首个应用原地改名保 id,其余拷贝); 写接口 app_name 必填(scope_check.go)。 - 类别落库 svc_category,可增删改;内置 11 个 id 不可改不可删,运行时语义仍只挂 comm.SvcCat*。 - 「应用参数」标签页下线:业务库 config 表不再随 user_getappconfig 下发, migrate_appparams.go 把 AGENT_TYPE / MOBILE_ELF_* 迁到服务 llm_mobile_elf、 iapCustomerServiceQQ 迁到 app_params,COMPUTE_*/NEWUSER_GIFT_* 留在 config 表不下发, 无人读的音乐/公码/导航/COS_*/MeetServers 删除,其余键保留并在启动日志告警。 - 删除 console appcfg/* 与 api 模块的 get/add/update/delconfig、唤醒音四个接口(无调用方)。 - 修 getmcpservers 仍查全局层导致 MCP 类服务永远读不到。 客户端 - 凭据改走结构化通道:user_getappconfig_v3 整体 AES-CBC 加密(api_crypto.dart, 拦截器须排在 AuthInterceptor 之前),AppConfig.cred(svcId, field, envKey) 取值, 老键名只作兜底;lib 内 AppConfig.env( 已降到 0 处调用。 - 图片翻译的 ALIBABA_VL_MODEL / ENDPOINT 改挂 ast_alibaba。 启动日志 - 删除 sys/auth/firebase(google_auth 的重复实现,零调用方,且同一错误刷两行)。 - api 模块不再每次启动无条件插入默认超管(Duplicate entry 'admin')。 - sys/auth/* 五个包的 logger 名从复制来的 sys.tavily 各改各名; google_auth 启动时即判断配置是否可用。 Co-Authored-By: Claude Opus 5 (1M context) --- CLAUDE.md | 135 +++++++- apps/admin/app/components/AppEnvTab.vue | 264 --------------- apps/admin/app/pages/appconfig.vue | 7 +- apps/admin/app/pages/globalconfig.vue | 7 +- apps/admin/app/pages/meettemplates.vue | 52 ++- apps/admin/app/pages/serviceconfig.vue | 282 ++++++++++++---- apps/admin/app/utils/menus.ts | 5 +- apps/client/.env.example | 5 + apps/client/lib/core/utils/ai_navigation.dart | 4 +- apps/client/lib/data/models/appconfig.dart | 45 ++- .../lib/data/models/appconfig_model.dart | 41 ++- .../lib/data/models/appconfig_model.g.dart | 24 ++ .../alibaba_image_translation_service.dart | 13 +- .../services/bailian_multimodal_service.dart | 6 +- .../data/services/deapsound_ai_service.dart | 6 +- .../microsoft_translation_service.dart | 6 +- .../client/lib/data/services/network/api.dart | 19 +- .../lib/data/services/network/api_crypto.dart | 86 +++++ .../data/services/network/dio_manager.dart | 4 + .../speech_impl/azure_asr_service.dart | 10 +- .../speech_impl/azure_ast_service.dart | 28 +- .../speech_impl/azure_tts_service.dart | 4 +- .../views/widgets/goods_footer_section.dart | 3 +- .../controllers/mobile_elf_controller.dart | 3 +- .../views/recorder_bottom_sheet.dart | 4 +- apps/client/pubspec.lock | 32 ++ apps/client/pubspec.yaml | 1 + apps/client/test/api_crypto_test.dart | 35 ++ apps/client/test/appconfig_cred_test.dart | 44 +++ apps/client/test/appconfig_model_test.dart | 44 +++ apps/services/comm/appscope.go | 28 ++ apps/services/comm/appscope_test.go | 31 ++ apps/services/comm/const.go | 2 +- apps/services/comm/svcpool.go | 3 + apps/services/modules/api/api_addconfig.go | 27 -- .../modules/api/api_addwakeupvoice.go | 21 -- apps/services/modules/api/api_delconfig.go | 27 -- .../modules/api/api_delwakeupvoice.go | 21 -- apps/services/modules/api/api_getconfig.go | 28 -- .../modules/api/api_getwakeupvoice.go | 28 -- .../modules/api/api_getwakeupvoices.go | 28 -- apps/services/modules/api/api_updateconfig.go | 27 -- .../modules/api/api_updatewakeupvoice.go | 21 -- apps/services/modules/api/core.go | 3 - .../modules/api/interceptor_permission.go | 11 - apps/services/modules/api/model.go | 161 +++++----- apps/services/modules/api/model_test.go | 6 - .../services/modules/console/api_appconfig.go | 155 --------- apps/services/modules/console/api_config.go | 81 ++++- apps/services/modules/console/api_device.go | 8 + .../modules/console/api_svccategory.go | 171 ++++++++++ .../services/modules/console/api_svcconfig.go | 113 +++++++ .../modules/console/api_svctemplate.go | 53 ++- .../modules/console/api_svctemplate_test.go | 44 +++ .../modules/console/migrate_appparams.go | 301 ++++++++++++++++++ .../modules/console/migrate_envtosvc.go | 9 + .../services/modules/console/migrate_scope.go | 263 +++++++++++++++ .../modules/console/migrate_scope_test.go | 23 ++ .../modules/console/model_registry.go | 10 + .../modules/console/model_svccategory.go | 74 +++++ apps/services/modules/console/registry.go | 23 ++ apps/services/modules/console/scope_check.go | 97 ++++++ apps/services/modules/console/server.go | 21 +- apps/services/modules/echomeet/model.go | 15 +- .../services/modules/user/api_getappconfig.go | 7 +- .../modules/user/api_getwakeupvoices.go | 33 -- .../modules/user/api_v2_getappconfig.go | 7 +- .../modules/user/api_v3_getappconfig.go | 13 +- apps/services/modules/user/model_cache.go | 22 +- apps/services/modules/user/model_config.go | 35 +- apps/services/modules/user/model_user.go | 77 ++++- apps/services/modules/user/svcresolve.go | 26 +- apps/services/services/home/main.go | 10 +- apps/services/sys/auth/apple/options.go | 4 +- apps/services/sys/auth/facebook/options.go | 4 +- apps/services/sys/auth/firebase/auth.go | 70 ---- apps/services/sys/auth/firebase/core.go | 41 --- apps/services/sys/auth/firebase/options.go | 44 --- apps/services/sys/auth/firebase/sys_test.go | 20 -- apps/services/sys/auth/google/auth.go | 16 +- apps/services/sys/auth/google/options.go | 4 +- apps/services/sys/auth/wechat/options.go | 4 +- deploy/app/README.md | 6 +- deploy/app/confs/gateway.yaml.example | 1 + deploy/app/confs/home.yaml.example | 6 +- deploy/app/env/env.example | 7 +- 86 files changed, 2414 insertions(+), 1196 deletions(-) delete mode 100644 apps/admin/app/components/AppEnvTab.vue create mode 100644 apps/client/lib/data/services/network/api_crypto.dart create mode 100644 apps/client/test/api_crypto_test.dart create mode 100644 apps/client/test/appconfig_cred_test.dart create mode 100644 apps/services/comm/appscope_test.go delete mode 100644 apps/services/modules/api/api_addconfig.go delete mode 100644 apps/services/modules/api/api_addwakeupvoice.go delete mode 100644 apps/services/modules/api/api_delconfig.go delete mode 100644 apps/services/modules/api/api_delwakeupvoice.go delete mode 100644 apps/services/modules/api/api_getconfig.go delete mode 100644 apps/services/modules/api/api_getwakeupvoice.go delete mode 100644 apps/services/modules/api/api_getwakeupvoices.go delete mode 100644 apps/services/modules/api/api_updateconfig.go delete mode 100644 apps/services/modules/api/api_updatewakeupvoice.go delete mode 100644 apps/services/modules/console/api_appconfig.go create mode 100644 apps/services/modules/console/api_svccategory.go create mode 100644 apps/services/modules/console/migrate_appparams.go create mode 100644 apps/services/modules/console/migrate_scope.go create mode 100644 apps/services/modules/console/migrate_scope_test.go create mode 100644 apps/services/modules/console/model_svccategory.go create mode 100644 apps/services/modules/console/scope_check.go delete mode 100644 apps/services/modules/user/api_getwakeupvoices.go delete mode 100644 apps/services/sys/auth/firebase/auth.go delete mode 100644 apps/services/sys/auth/firebase/core.go delete mode 100644 apps/services/sys/auth/firebase/options.go delete mode 100644 apps/services/sys/auth/firebase/sys_test.go diff --git a/CLAUDE.md b/CLAUDE.md index f6a486e7..8a02b303 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -461,8 +461,9 @@ MAC 导入后已实测打通(2026-09-10):`user_binddevice` 返回 - `dotenv.env['X']` = `apps/client/.env`,本机/渠道级,编译进包; - `AppConfig.env('X')`([appconfig.dart](apps/client/lib/data/models/appconfig.dart))= 后端 `user_getappconfig` 下发的配置(env / agents / mcps / products),由 **console 后台**维护。 - ⚠️ 2026-09-12 起 `env` 里的**凭据来自 `svc_config` 的 `env_key`**,不再来自 `global_config`; - 业务库 `config` 表只剩应用自有的业务参数。详见下文「凭据归一」。 + ⚠️ 2026-09-14 起 `env` **只来自 `svc_config` 字段的 `env_key`**:`global_config`(9-12)和业务库 + `config` 表(9-14)都不再参与下发。客户端读的应用参数(AGENT_TYPE / MOBILE_ELF_* / iapCustomerServiceQQ) + 也在 svc_config 里(服务 `llm_mobile_elf` / `app_params`)。详见下文「凭据归一」及「应用参数标签页下线」。 - 客户端 `UserGetAppConfigResp`、`DBAgent`、`DBProduct` 等模型是**手写镜像**服务端 `pb.UserGetAppConfigResp`([user_msg.proto:168](apps/proto/user/user_msg.proto#L168))的, **没有代码生成把两边绑在一起**。改 proto 字段后要手动同步 @@ -473,6 +474,31 @@ MAC 导入后已实测打通(2026-09-10):`user_binddevice` 返回 - `user` 模块的 v2/v3 api 把 `GetAppConfig`/`GetAgents` 列入 `EncryptMsgs`(加密协议), 抓包看到的是密文不是明文 JSON,别以为接口挂了。 +### 客户端凭据走结构化通道:加密 v3 + `AppConfig.cred()`(2026-09-14) + +EAIMAR 客户端不再从 `env` 兼容层拿第三方凭据,改走**自己的路**: + +| 环节 | 位置 | +|---|---| +| 请求 | `Api.getappconfig()` → `.env` 配了 `GATEWAY_ENCRYPT_KEY` 就打 **`user_getappconfig_v3`**(整体 AES 加密),否则回退明文 v1 | +| 解密 | [api_crypto.dart](apps/client/lib/data/services/network/api_crypto.dart) 的 `ApiDecryptInterceptor`,**必须排在 `AuthInterceptor` 之前**(它一看到不是业务 JSON 就当失败) | +| 模型 | `UserGetAppConfigResp.thirdsvcs: List`(id/name/provider/categories/fields),缺键 → 空列表 | +| 取值 | `AppConfig.cred(svcId, fieldKey, envKey)`:**thirdsvcs 的 (服务 id, 字段) 优先,退回 env[老键名],两边都没有 → null** | + +- 服务 id / 字段名与服务端 `migrate_envtosvc.go` 的落点表一一对应(`stt_azure.subscription_key`、 + `ast_alibaba.app_key`、`llm_doubao.api_key`…),**改哪边都要同改**;老键名只作兜底。 +- 加密口径(`lego/utils/crypto/aes/cbc.go`):AES-CBC,IV 固定 16 个 `'0'`,PKCS5/7,密文 base64, + 响应头 `X-Encrypted: 1`、`Content-Type: text/plain`。`test/api_crypto_test.dart` 的密文是 **openssl 按 Go 口径** + 生成的金向量——用同一套 Dart 加密再解密只能证明自洽,证明不了与 Go 端一致。 +- ⚠️ **`GATEWAY_ENCRYPT_KEY` 要进客户端 `.env`**(gitignore,值与服务器 `deploy/app` 的 `.env` 一致,测试/正式同一把); + 没配就静默回退 v1,`thirdsvcs` 为空、`AppConfig.usingThirdSvcs == false`——排查「明明配了服务却读不到」先看这个。 + 密钥不一致的表现是解密后 PKCS7 去填充失败 → 拦截器 reject,报错文案指向密钥,别去查网络。 +- ⚠️ **v3 必须在网关白名单**(`deploy/app/confs/gateway.yaml.example` 与各机 `confs/gateway.yaml`):splash 在**登录前** + 就取配置,少这一行返回 `code:18` 然后整个启动流程走兜底。测试机已加;**正式机 ym-a11 的 gateway.yaml 尚未加**(要重启容器), + 新客户端上正式前必须补。 +- 未登录时 v3 的 `filterSvcsByVip` 拿不到 uid → 按有 VIP 放行;实名(11) 类照旧永不下发。 +- `cred()` 返回 null 而不是空串:空串会把调用方的 `?? 默认值` 顶掉(`AZURE_TRANSLATION_ENDPOINT` 栽过)。 + ### 游客登录与功能闸门(2026-08-29 改) 游客登录**走服务端** `api_sgin` 的 `Tourists` 分支(`stype=6` + `phonemac=设备id`),拿真实雪花 uid 与 JWT。 @@ -1486,8 +1512,8 @@ apps/products/regions/channelid 四维,而它们这四项**本来就是空的* | 原菜单项 | 处置 | 依据 | |---|---|---| | 全局环境配置 | **下线**(页面只留重定向,表保留待人工 DROP) | `global_config` 473 行按区域整份复制凭据,且**悄悄覆盖**业务库 `config` 表的同名键 | -| 应用环境配置 | 并入「服务与环境配置 → 应用参数」标签页 | 凭据搬走后只剩应用自己的业务参数 | -| 第三方服务配置 | 改名「服务与环境配置」,成为凭据唯一出处 | — | +| 应用环境配置 | 先并入「服务与环境配置 → 应用参数」标签页;**2026-09-14 连标签页也下线**(见下文) | 凭据搬走后只剩应用自己的业务参数,而这些也搬进了 svc_config | +| 第三方服务配置 | 改名「服务与环境配置」,成为凭据唯一出处;2026-09-14 菜单改回「第三方服务配置」 | — | | Agent 配置 / 通话翻译配置 | **删除**(页面 + console 接口) | `agent_config`、`call_translate_rule` 在测试机与正式机上**都是 0 行**;通话翻译选路全在端侧 `language_manager.findBestMatchingProvider` | | 会议记录服务 | **删除页面**,⚠️ 数据与运行时保留 | 见下方警告 | @@ -1499,7 +1525,7 @@ apps/products/regions/channelid 四维,而它们这四项**本来就是空的* **现在的下发链路**([svcresolve.go](apps/services/modules/user/svcresolve.go) 的 `appEnvForUser`): ``` -env = 业务库 config 表(应用自有业务参数) ← svc_config 按字段的 env_key 覆盖 +env = svc_config 各服务字段按 env_key 平铺(2026-09-14 起;9-12 ~ 9-14 之间还有业务库 config 表打底) ``` - `comm.SvcField` 多了一个 **`EnvKey`**(后台字段表里的「下发键名」列):非空时该字段的明文值 @@ -1526,6 +1552,83 @@ console 每次启动跑、幂等(只建不存在的服务、只填空着的字 `migrateLicenseToDeviceMac` 的取舍)。业务库 `config` 里**已确认迁走**的键则会删除。 确认新链路跑稳后由人手工 `DROP TABLE global_config;`。 +### 「应用参数」标签页下线:业务库 config 表不再下发(2026-09-14) + +后台只剩「第三方服务配置」一个页面。原第二个标签页是业务库 `config` 表的裸 key/value 编辑器, +而 `user_getappconfig` 把这张表**整张**塞进 `env`——COS 密钥、灵犀产品密钥、连「会员与算力」页写进去的 +`COMPUTE_RATE_*` / `COMPUTE_GATE` 都明文发到每个客户端。逐项 grep 过服务端/客户端/原生插件/后台后, +两台机上完全相同的 22 行处置如下(迁移在 [migrate_appparams.go](apps/services/modules/console/migrate_appparams.go), +console 启动跑、幂等、排在 `migrateGlobalScopeToApps` 之后): + +| config 表的键 | 去向 | +|---|---| +| `AGENT_TYPE` / `MOBILE_ELF_AGENT_ID` / `MOBILE_ELF_PRODUCT_ID` / `MOBILE_ELF_PRODUCT_KEY`(加密) / `YIDONG_PID` | 服务 **`llm_mobile_elf`**(中国移动 灵犀 / 移动精灵,类别「文本大模型」只作分组),字段带同名 `env_key` | +| `iapCustomerServiceQQ` | 服务 **`app_params`**(内置类别 12「应用参数」),字段 `iap_customer_service_qq`;要加新的应用参数就往这个模板加字段 | +| `COMPUTE_*` / `NEWUSER_GIFT_*` / `VIP_WARN_DAYS` / `COMPUTE_WARN` / `COMPUTE_LEGACY_MIGRATED` | 留在 `config` 表,由「会员与算力」页维护,**不下发** | +| 音乐 ×5 / 公码 ×2 / 导航 / `COS_*` ×5 / `MeetServers` | 无人读,删 | +| 其它不认识的键 | 保留 + 启动日志告警(已无后台入口也不下发,要么加进落点表要么手工删) | + +- 客户端四处读取改成 `AppConfig.cred('llm_mobile_elf','agent_type','AGENT_TYPE')` 这种形状,老键名作兜底。 + `AppConfig.env(` 在 lib 里已是 **0 处**调用;新代码别再用它,凭据/参数都走 `cred()`。 +- 图片翻译的 `ALIBABA_VL_MODEL` / `ALIBABA_VL_ENDPOINT` 原先哪张表都没有(客户端一直用写死的默认值),现在是 + `ast_alibaba` 上的 `vl_model` / `vl_endpoint` 两个明文字段(留空=客户端默认)。**没挂到 `llmv_qwen`**: + 那条是服务端会议总结用的 `qwen-plus`,`base_url` 是不带路径的根地址,与客户端要的视觉模型/完整地址对不上。 +- `llm_mobile_elf` **停用 = 不下发 `AGENT_TYPE`** = 客户端 AI 球一律进 EMAI,这是预期行为。 +- console 的 `appcfg/*` 四个接口、api 模块的 `api_getconfig/addconfig/updateconfig/delconfig` 已删(后台与客户端都没有调用方)。 +- 顺手修了 [model_config.go](apps/services/modules/user/model_config.go) 的 `getmcpservers`:作用域归一后它还在查 + `app_name=''` 的全局层,MCP 类服务永远读不到、且不报错。现按 `comm.AppName()` 读本应用。 + +### 服务配置按应用隔离 + 类别可增删改(2026-09-14) + +**没有「全局默认」层了。** 原模型是 `app_name=''` 全局默认 + 应用覆盖(应用没配就回退全局行), +现在每个应用一套、**互不干涉**:应用 A 删掉某个服务,不会悄悄回退到别人那份。涉及五张表, +作用域键都是 `app_name`:`svc_config` / `svc_region_override` / `echomeet_orch` / `echomeet_orch_setting` / +`echomeet_template`(公共模板也按应用分了,后台「会议模板」页多了应用选择)。 + +- 迁移在 [migrate_scope.go](apps/services/modules/console/migrate_scope.go),console 启动跑、幂等: + **首个应用(`app_registry.id` 最小)拿原行改名**(id/row_id 保住,`echomeet_record` 里存的模板 id 不断), + 其余应用各拷一份。跑完全局层为空;运行时那 16 处 `OR app_name=''` 回退分支再也匹配不到行,代码没删。 +- ⚠️ **作用域键是 `app_registry.app_name`(应用中心的应用名,如 `EAIMAR` / `deepGlass`),不是 + `app_registry.name`(部署名 `deepglass`)**。运行时 `ANALYZE_APP_NAME` 实测等于 `app_name`; + 后台下拉用的也是它。用错列会让 deepGlass 一个服务都读不到,且不报错。 +- ⚠️ `migrateEnvToSvcConfig` 在作用域分配之后**必须跳过**(已加守卫:`svc_config` 有非空 `app_name` 行即返回)。 + 否则它会从 `global_config` 把服务重新建回全局层,再被分配时与首个应用撞 `(app_name,id)` 唯一键。 + 新应用要凭据走后台「从其它应用复制」(`api_copysvcconfig`,密文原样搬不经前端),不再从 `global_config` 长出来。 +- 后台所有写接口 `app_name` 必填(`svcScopeOK` / `meetTplScopeOK`),空值直接拒绝——前端漏传就会在谁也看不见的作用域里建出服务。 +- 后台老账号的 `requireAppNameScope` 现在真的被调了(删 Agent 页之后它一度没有调用方)。 + +**类别落库**(`svc_category`,[model_svccategory.go](apps/services/modules/console/model_svccategory.go)),后台「类别管理」可增删改(内置 12 个,第 12 个「应用参数」是 9-14 加的)。 +两种东西要分清:**展示属性**(名称/角标/颜色/排序/启用)任何类别都能改;**运行时语义**只挂在 +`comm.SvcCat*`(MT=3 `user_translate`、AST=4 VIP 过期停发、MCP=10、实名=11 永不下发)和模板/会议编排引用的 +内置 id(1/2/5/8/9)上——**内置 11 个 id 不可改不可删**,只能停用。自定义类别(id ≥ 100)只作分组: +叫「实名」也不会获得「不下发」的保护,`server_only` 是从 comm 读出来的只读属性,刻意不落库。 +删自定义类别前查 `svc_config.categories` 与 `third_svc_template.category` 的引用,有就拒绝。 +前端 `SCAT` 现在是从 `api_getsvccategories` 加载的 computed,形状与原写死数组一致;`VOICE_CATS`/`SERVER_ONLY_SCATS` +改为读类别的 `voice`/`server_only` 标记。 + +⚠️ **未升级到本版的应用服务会看到两份会议模板**:老代码查 `source='public'` 不带 `app_name`, +迁移后两个应用各 287 条 → 老 deepglass-a11 会拿到 574 条(重复)。升级到本版即消失。 + +### 服务商模板 ≠ 已接入:科大讯飞 AIUI(2026-09-14 加) + +「服务商模板」只是**后台建服务时的字段清单**——加一条模板,运营就能在「第三方服务」里建出这个服务、 +填凭据、按区域分叉,凭据也会随 `user_getthirdsvcs_v2` / `user_getappconfig_v3` 的 `thirdsvcs` 下发。 +但**端侧有没有代码去用它是另一回事**。 + +`sts_iflytek_aiui`(科大讯飞 AIUI,类别 STS=7)当前就是这个状态:**模板有了,全项目没有任何一处调用** +(搜 `aiui` 零命中)。所以配完不会有任何效果,也不会报错——要真正用起来,客户端得按 +`AppConfig.cred('sts_iflytek_aiui', '<字段>', '')` 取值并实现那条 WebSocket 链路。 + +- 归 STS 不是 STT:AIUI 是「唤醒→识别→语义→内容服务→合成」一整条,吐的是**答复**不是转写文本。 + 归错类别会被会议记录/通话翻译那些按类别选路的地方选中,然后拿不到期望的结果。 +- 鉴权自成一套,别照别家套 key/secret:请求头 `X-Appid` / `X-CurTime` / `X-Param`(业务参数 base64) + / `X-CheckSum = MD5(api_key + X-CurTime + X-Param)`。必填凭据只有 `app_id` 与 `api_key` 两个。 +- ⚠️ `auth_id` 是**每用户/每设备一个**的标识(32 位小写字母+数字),AIUI 拿它存个性化数据与多轮上下文。 + 模板里默认留空(由端侧按设备生成),**填死等于全部用户共用一份上下文**,A 说的话会进 B 的对话历史。 +- `languages` 预填为空是正常的:内置音色表只覆盖 azure / alibaba(`comm.TTSProviders()`), + 讯飞不在表里,和 `sts_google` 同一情况,由运营自己填;巡检会提示「没配语言」。 +- 契约由 `TestIflytekAIUITemplate` 守着(类别、必填字段、api_key 必须加密、默认 ws 地址)。 + ### svc_config 的四个坑(2026-09-12 阿龙测试环境实测踩出来的,都不报错) 这四条对**任何**改第三方服务配置的人都成立,不限于那次迁移: @@ -1654,6 +1757,28 @@ console 每次启动跑、幂等(只建不存在的服务、只填空着的字 - ⚠️ **本仓库若要公开,必须先清理** 各 `*-deploy.sh` 的 `DEPLOY_HOST`、`deploy/registry-profiles.sh` 的 `REGISTRY_PASS`,以及各 `*.yaml` 里的真实凭据。 - 早期那套 `deploy.sh [action]` 已删除(只指向灵谱、生产位留空),统一走 `dev-deploy.sh` / `prod-build.sh` / `prod-deploy.sh`。 +### 启动日志里的「未配置」是设计,ERROR 才要查(2026-09-14 清过一轮) + +home/api 的各 `sys` 子系统都是「配不上就降级」:缺凭据只留一条 +`init sys.xxx err: …(xx未配置,该功能不可用)` 的 **WARN**,包级函数返回 `ErrNotInited` 而不是 panic +(会 panic 的只有 `wordfilter` 与 `ip2region`,见 deploy/app/README)。阿龙测试机现在常态缺 4 项: +Google 语音、Google 登录、微信支付、支付宝、微软翻译——都是没放对应 json/pem 或没填 key,**不是故障**。 + +这轮修掉的两条真 ERROR: + +- `firebase/auth.go:36 [sys.tavily] cannot read credentials file` —— `sys/auth/firebase` **整个包已删**。 + 它是 `google_auth` 的重复实现,`Auth()` 一处调用方都没有(登录类型里没有 Firebase;客户端拿的 + Firebase ID Token 走 `stype=Google`)。它还在 `newSys` 里 `Log.Errorln` 一次、又把同一个 error 返回给 + 调用方再打一条 WARN,于是同一件事刷两行、其中一行是红的。 +- `Error 1062 Duplicate entry 'admin' for key 'adnim.PRIMARY'` —— `modules/api/model.go` 每次启动无条件 + `Insert` 一次默认超管、返回值还没接。改成**只在账号不存在时**插入。 + ⚠️ 别图省事改用 `Save`/Upsert:那会把运营改过的密码在每次重启时刷回配置文件里的初始值。 + +顺带两处:`sys/auth/*` 五个包的 logger 名全被复制成了 `sys.tavily`(所以 firebase 的错误显示成 +`[sys.tavily]`,查的时候会被带偏),已各改各名;`google_auth` 原先 `newSys` 无条件返回成功、日志打 +`init sys.google_auth success!`,而配置指的 json 根本不存在,直到有人点 Google 登录才失败—— +现在启动时就判「配得上没有」(空配置 / 写的是路径但文件不在),`ApiKeyFile` 以 `{` 开头则视为内嵌 JSON 放行。 + ## 迁移上下文 源项目在 `/Users/liwei/work/go/yunyan/deep_server_up/`(及 `go_earphone/server/deep_server/`)。从旧代码移植接口时,注意 import 路径由 `earphone/...` 改为 `yunyan/...`,并核对接口签名是否符合上文反射注册约定。 diff --git a/apps/admin/app/components/AppEnvTab.vue b/apps/admin/app/components/AppEnvTab.vue deleted file mode 100644 index 1a9e5488..00000000 --- a/apps/admin/app/components/AppEnvTab.vue +++ /dev/null @@ -1,264 +0,0 @@ - - - diff --git a/apps/admin/app/pages/appconfig.vue b/apps/admin/app/pages/appconfig.vue index 4932aefe..d39ab1c4 100644 --- a/apps/admin/app/pages/appconfig.vue +++ b/apps/admin/app/pages/appconfig.vue @@ -1,15 +1,16 @@