fix(voice): CloneVoice 的 200-with-message 泄漏收口到 dashscopeOKBodyError
M41 同族的最后一条缺口:HTTP 200 的响应里用顶层 message 报业务失败,而这句话 是上游自由文本 —— create_voice 的 input.url 是参考音频的公开地址(可能是预签名 URL,带凭据),上游报错常把它原样回显。 - ERROR 只留「打到了、但 200 是个业务失败」这个形状事实 + 体积摘要; message 原文不进 error,code/type 若真的带回来也只以令牌形态出镜 - errors.Is(err, ErrProviderFailed) 不变(熔断口径不动) - 用例断言失败仍被识别、且 error 文本里搜不到哨兵正文
This commit is contained in:
1 parent
66dda084cd
commit
9e88605cc8
3 files changed
+54
-1
No files matched your search
@@ -151,6 +151,35 @@ func TestDashscopeCloner_ModelError(t *testing.T) {
|
||||
}
|
||||
}
|
||||
|
||||
// TestDashscopeCloner_ModelErrorHidesMessage 覆盖 M41 的最后一条同族缺口:
|
||||
// HTTP **200** 的响应里用顶层 message 报错(200 不会走非 2xx 的收口),而这句话是
|
||||
// 上游自由文本 —— create_voice 的 input.url 是参考音频的公开地址(可能是预签名
|
||||
// URL,带凭据),上游经常把它原样回显在 message 里。
|
||||
//
|
||||
// 两个断言缺一不可:① 失败必须**仍被识别**(ErrProviderFailed,熔断口径不变);
|
||||
// ② error 文本里搜不到哨兵(旧实现 `%s resp.Message` 会整句带出)。
|
||||
func TestDashscopeCloner_ModelErrorHidesMessage(t *testing.T) {
|
||||
t.Parallel()
|
||||
const echoed = "SENTINEL-CLONE-MESSAGE-3c7b"
|
||||
srv := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
|
||||
w.Header().Set("Content-Type", "application/json")
|
||||
_, _ = w.Write([]byte(`{"message":"cannot fetch ` + echoed + `: signature expired","request_id":"req-abc"}`))
|
||||
}))
|
||||
defer srv.Close()
|
||||
|
||||
cloner := NewDashscopeCloner(config.VoiceConfig{DashscopeBaseURL: srv.URL, DashscopeAPIKey: "sk"})
|
||||
_, err := cloner.CloneVoice(context.Background(), "https://example.com/ref.wav", "x")
|
||||
if !errors.Is(err, ErrProviderFailed) {
|
||||
t.Fatalf("err = %v, want ErrProviderFailed", err)
|
||||
}
|
||||
if strings.Contains(err.Error(), echoed) {
|
||||
t.Errorf("error text carries the provider message: %v", err)
|
||||
}
|
||||
if !strings.Contains(err.Error(), "200") {
|
||||
t.Errorf("err = %v, want the 200-on-business-failure fact kept", err)
|
||||
}
|
||||
}
|
||||
|
||||
// TestDashscopeTTS_Instruction_ClonedVoice 断言复刻音色会在请求 input 中
|
||||
// 携带配置的 instruction。
|
||||
func TestDashscopeTTS_Instruction_ClonedVoice(t *testing.T) {
|
||||
|
||||
Reference in new issue
Block a user