refactor(adapter): 抽出 provider 抽象层(阶段0),controller 不再依赖火山实现

- 新增 adapter/provider:Provider/Capabilities/Request/Credentials/MetricsRecorder/UpstreamError + 注册表
- 火山实现 Provider(provider.go),Synthesis 收敛为私有 synthesize,提供 BuildRequest 过渡映射
- controller 经 provider.Get(name).Synthesize 调用,voice 路由改在 Request 上覆盖
- UpstreamError 上移到 provider 包,火山用类型别名沿用旧名
- setting 新增 GetTTSRequest/GetDefaultFormat/GetDefaultProviderName
- main.go 空导入注册火山
- docs/UPSTREAM_ADAPTER_GUIDE.md 更新为 v1.1(阶段0已落地)
This commit is contained in:
dev
2026-10-11 13:39:09 +08:00
parent ec82e895c3
commit 5c130f0be4
10 changed files with 386 additions and 101 deletions
+9 -4
View File
@@ -9,6 +9,7 @@ package metrics
import (
"time"
"github.com/volcano-tts/tts-api/adapter/provider"
"github.com/volcano-tts/tts-api/telemetry"
)
@@ -117,17 +118,21 @@ func Init() {
)
}
// AdapterRecorder 把 telemetry 指标适配为 volcano.MetricsRecorder。
// AdapterRecorder 把 telemetry 指标适配为 provider.MetricsRecorder。
// 上游适配器只需实现 provider.MetricsRecorder,metrics 包统一汇聚。
type AdapterRecorder struct{}
// UpstreamStarted 满足 volcano.MetricsRecorder 接口。
// 编译期断言:AdapterRecorder 必须实现 provider.MetricsRecorder,防止接口漂移。
var _ provider.MetricsRecorder = AdapterRecorder{}
// UpstreamStarted 满足 provider.MetricsRecorder 接口。
func (AdapterRecorder) UpstreamStarted(speaker, model, format string) {
// speaker 用 sha1[:8] 替代,保护火山复刻音色 ID
// (无鉴权 /metrics 端点可枚举,这是 P0 隐私问题)
UpstreamTotal.Inc(telemetry.Labels{"status": "started", "format": format, "model": model, "speaker": telemetry.SpeakerLabel(speaker)})
}
// UpstreamFinished 满足 volcano.MetricsRecorder 接口。
// UpstreamFinished 满足 provider.MetricsRecorder 接口。
func (AdapterRecorder) UpstreamFinished(speaker, model, format, status string, duration, ttfb time.Duration, chunks, audioBytes, errCode int) {
labels := telemetry.Labels{"status": status, "format": format, "model": model, "speaker": telemetry.SpeakerLabel(speaker)}
UpstreamTotal.Inc(labels)
@@ -149,7 +154,7 @@ func (AdapterRecorder) UpstreamFinished(speaker, model, format, status string, d
}
}
// UpstreamUsage 满足 volcano.MetricsRecorder 接口。
// UpstreamUsage 满足 provider.MetricsRecorder 接口。
func (AdapterRecorder) UpstreamUsage(model string, textWords int) {
if textWords <= 0 {
return