refactor: require canonical talk resolved payload

This commit is contained in:
Peter Steinberger
2026-03-08 16:08:22 +00:00
parent 87640f9a61
commit 8d3d742c6a
8 changed files with 18 additions and 72 deletions

View File

@@ -26,28 +26,9 @@ public enum TalkConfigParsing {
if let resolvedSelection = self.resolvedProviderConfig(talk) {
return resolvedSelection
}
let rawProvider = talk["provider"]?.stringValue
let rawProviders = talk["providers"]
let hasNormalizedPayload = rawProvider != nil || rawProviders != nil
let hasNormalizedPayload = talk["provider"] != nil || talk["providers"] != nil
if hasNormalizedPayload {
let normalizedProviders = self.normalizedTalkProviders(rawProviders)
let explicitProviderID = self.normalizedTalkProviderID(rawProvider)
if let explicitProviderID {
if !normalizedProviders.isEmpty, normalizedProviders[explicitProviderID] == nil {
return nil
}
return TalkProviderConfigSelection(
provider: explicitProviderID,
config: normalizedProviders[explicitProviderID] ?? [:],
normalizedPayload: true)
}
guard normalizedProviders.count == 1, let providerID = normalizedProviders.keys.first else {
return nil
}
return TalkProviderConfigSelection(
provider: providerID,
config: normalizedProviders[providerID] ?? [:],
normalizedPayload: true)
return nil
}
guard allowLegacyFallback else { return nil }
return TalkProviderConfigSelection(
@@ -92,15 +73,4 @@ public enum TalkConfigParsing {
config: resolved["config"]?.dictionaryValue ?? [:],
normalizedPayload: true)
}
private static func normalizedTalkProviders(_ raw: AnyCodable?) -> [String: [String: AnyCodable]] {
guard let providerMap = raw?.dictionaryValue else { return [:] }
return providerMap.reduce(into: [String: [String: AnyCodable]]()) { acc, entry in
guard
let providerID = self.normalizedTalkProviderID(entry.key),
let providerConfig = entry.value.dictionaryValue
else { return }
acc[providerID] = providerConfig
}
}
}

View File

@@ -24,7 +24,7 @@ struct TalkConfigParsingTests {
#expect(selection?.config["voiceId"]?.stringValue == "voice-resolved")
}
@Test func prefersNormalizedTalkProviderPayload() {
@Test func rejectsNormalizedTalkProviderPayloadWithoutResolved() {
let talk: [String: AnyCodable] = [
"provider": AnyCodable("elevenlabs"),
"providers": AnyCodable([
@@ -36,9 +36,7 @@ struct TalkConfigParsingTests {
]
let selection = TalkConfigParsing.selectProviderConfig(talk, defaultProvider: "elevenlabs")
#expect(selection?.provider == "elevenlabs")
#expect(selection?.normalizedPayload == true)
#expect(selection?.config["voiceId"]?.stringValue == "voice-normalized")
#expect(selection == nil)
}
@Test func fallsBackToLegacyTalkFieldsWhenNormalizedPayloadMissing() {