fix(voice): 修 r1 复审四条(正文进日志的隐私泄漏 / format 假开关 / Stats 无消费者 / redactURL 兜底)
上一版把 r1 的三条 finding 静默漏了(我在交付前没读 inbox),本提交逐条补齐:
1. 🔴 隐私:upstreamStatus 不再读也不记响应体
FastAPI 的 422 会把请求体里的 input 整段回显,原来「错误体前 512 字节进 WARN」
等于把她的原话写进日志。现在只记 status / content_type / response_bytes
(字节数优先取 Content-Length,缺失时有界排空取上界,读到即丢)。
新用例 TestSpeechRejectLogOmitsRequestText 用**回显正文**的假上游抓它;
变异(把 body 塞回 WARN)实测打红。
2. format 键彻底删除(假开关)
上游只拿 response_format 改自报 media_type,产物恒 .wav 无转码,我方只按字节
嗅探裁决 ⇒ wav/mp3/ogg 交付字节与响应头完全相同。删 tts.Config.Format 与
VoiceTTSTuning.Format,encodeSpeech 硬编码 requestFormat="wav"(不可配置)。
用例钉住请求体恒为 wav;变异(改成 mp3)打红。旧文件里残留的 format 键被忽略。
3. Stats 接进 degrade 的 WARN(attempts/failures)
否则统计在生产日志里没有消费者。TestServiceDegradeLogsCounters 钉住;
变异(去掉两个字段)打红。
4. redactURL 兜底含 "@" 整体打码
解析失败/无 host 时原来原样返回,user:pass@ 会漏凭据。TestRedactURLCredentials
覆盖合法 URL 去 userinfo、非法含 @ 打码;变异(退回原样返回)打红。
另:关闭态零行为变化的**当前 tip 重跑**——
- handleSpeech 的 persona 解析改为只在语音服务实现 personaVoice 且 PrimaryActive
时才查库;未接 emotionTTS(既有链/stub)时零额外 I/O、ctx 不改、音频字节相同。
用例 TestSpeechEndpointDisabledVoiceDoesNotReadPersona(含对照组证明闸不是恒关);
变异(去掉闸)打红。
- voice.go 在 dev 基线里本就有 env.PersonaID 解析(无人格解析新增 I/O),本次未改。
Config.Normalized 去掉未使用的 logger 参数。go build/vet/test(含 -race)全绿;
真机 live 复测:cyrene 264104 B、furina 221194 B。
This commit is contained in:
1 parent
efc25c6a7f
commit
8820b0b316
12 files changed
+333
-69
No files matched your search
@@ -158,15 +158,20 @@ func (s *Service) fallback(ctx context.Context, text string) (mvoice.Audio, stri
|
||||
|
||||
// degrade 记录一次 emotionTTS 降级:未启用是 DEBUG(正常状态),其余是 WARN
|
||||
// (异常状态,但已被回落吸收)。日志只带文本长度,**绝不带正文**。
|
||||
//
|
||||
// attempts / failures 也挂在这条 WARN 上:`Stats()` 若没有消费者,生产日志里就永远
|
||||
// 看不到"降级过几次",那这个计数等于没做(复审 r1 的 P2-3)。
|
||||
func (s *Service) degrade(ctx context.Context, sel Selection, text string, err error) {
|
||||
stats := s.Stats()
|
||||
if ctx.Err() != nil {
|
||||
// 回合被取消/超时的情形已由 Client 记过(unreachable),这里只补一句
|
||||
// 「因此这次没声音」,避免同一条失败刷两条 WARN。
|
||||
s.log.Debug("voice tts skipped after cancel", "provider", ProviderName, "text_len", len(text))
|
||||
s.log.Debug("voice tts skipped after cancel", "provider", ProviderName,
|
||||
"text_len", len(text), "attempts", stats.Attempts, "failures", stats.Failures)
|
||||
return
|
||||
}
|
||||
s.log.Warn("voice tts degraded to fallback chain",
|
||||
"provider", ProviderName, "persona", sel.PersonaID,
|
||||
"character", sel.Character, "source", string(sel.Source),
|
||||
"text_len", len(text), "err", err)
|
||||
"text_len", len(text), "attempts", stats.Attempts, "failures", stats.Failures, "err", err)
|
||||
}
|
||||
Reference in new issue
Block a user