mirror of
https://github.com/openclaw/openclaw.git
synced 2026-03-27 09:21:35 +07:00
refactor: require canonical talk resolved payload
This commit is contained in:
@@ -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
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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() {
|
||||
|
||||
Reference in New Issue
Block a user