83 lines
2.7 KiB
Go
83 lines
2.7 KiB
Go
package region
|
|
|
|
import (
|
|
"strings"
|
|
|
|
"ai-operator/internal/dialogue/state"
|
|
)
|
|
|
|
func ShouldApplyRegionResolution(ctx SelectionContext, result ResolutionResult) RegionDecision {
|
|
d := RegionDecision{RegionCode: result.RegionCode, Candidates: result.Candidates, ReasonCode: result.ReasonCode}
|
|
if ctx.CurrentState == state.StateEnded || ctx.CurrentState == state.StateClosing || ctx.CurrentState == state.StateHandoff {
|
|
d.ReasonCode = "call_ended"
|
|
d.MessageKey = "closing.started"
|
|
return d
|
|
}
|
|
if result.Intent == IntentUnsupported || result.ReasonCode == "disabled_region" {
|
|
d.ReasonCode = result.ReasonCode
|
|
d.MessageKey = "region.unsupported"
|
|
return d
|
|
}
|
|
if result.NeedsClarification || result.Intent == IntentAmbiguous {
|
|
d.NeedsClarification = true
|
|
d.MessageKey = nonEmpty(result.ClarificationMessageKey, "region.ask_clarify")
|
|
return d
|
|
}
|
|
if result.RegionCode == "" || result.Region == nil {
|
|
d.MessageKey = "region.not_understood"
|
|
return d
|
|
}
|
|
switch ctx.CurrentState {
|
|
case state.StateLanguageSelection:
|
|
d.ReasonCode = "language_required"
|
|
d.MessageKey = "language.ask"
|
|
return d
|
|
case state.StateRegionSelection:
|
|
if result.Confidence >= MediumConfidence && result.Region.Enabled {
|
|
d.Apply = true
|
|
d.MessageKey = "region.selected"
|
|
}
|
|
return d
|
|
case state.StateReadyToHelp, state.StateQuestionAnswering:
|
|
if ctx.CurrentRegionCode == "" && result.Confidence >= MediumConfidence && result.Region.Enabled {
|
|
d.Apply = true
|
|
d.MessageKey = "region.selected"
|
|
return d
|
|
}
|
|
if ctx.AllowChange && result.Intent == IntentRegionChange && result.Confidence >= HighConfidence && result.Region.Enabled {
|
|
d.Apply = true
|
|
d.MessageKey = "region.changed"
|
|
return d
|
|
}
|
|
d.ReasonCode = "state_not_ready"
|
|
d.MessageKey = "ready.to_help"
|
|
return d
|
|
default:
|
|
d.ReasonCode = "state_not_ready"
|
|
d.MessageKey = "region.ask"
|
|
return d
|
|
}
|
|
}
|
|
|
|
func IsExplicitChangeRequest(input string) bool {
|
|
n := Normalize(input)
|
|
phrases := []string{
|
|
"сменить регион", "поменять регион", "изменить регион", "другой регион", "я из другого региона", "мой регион", "регион ", "я в ", "я из ", "выберите регион", "укажите регион",
|
|
"аймақты ауыстыру", "өңірді өзгерту", "басқа өңір", "менің өңірім", "өңірім", "аймағым", "мен астанадамын", "мен алматыдамын", "облысынанмын",
|
|
"change region", "switch region", "my region is", "i am in", "i am from",
|
|
}
|
|
for _, p := range phrases {
|
|
if strings.Contains(n, Normalize(p)) {
|
|
return true
|
|
}
|
|
}
|
|
return false
|
|
}
|
|
|
|
func nonEmpty(v, fallback string) string {
|
|
if v != "" {
|
|
return v
|
|
}
|
|
return fallback
|
|
}
|