diff --git a/cmd/core-runtime/main.go b/cmd/core-runtime/main.go index b86a35f..b863b68 100644 --- a/cmd/core-runtime/main.go +++ b/cmd/core-runtime/main.go @@ -591,6 +591,9 @@ func main() { semantic.NeedsCognition = true semantic.Interpretation.NeedsCognition = true semantic.CapabilityHints = append(semantic.CapabilityHints, string(capability.CapabilityKindCognitiveReasoning)) + if creativeFallbackReply != "" { + semantic.Reply = creativeFallbackReply + } } } locationReply := interactiondomain.LocationContextReply(utterance.Content) diff --git a/cmd/creator-web/server.go b/cmd/creator-web/server.go index 69b9c76..3e4d4a7 100644 --- a/cmd/creator-web/server.go +++ b/cmd/creator-web/server.go @@ -485,7 +485,7 @@ func (g *gateway) handleChatMessage(w http.ResponseWriter, r *http.Request) { status, err = g.postTrustedJSON(r, g.cognitive, "/v1/advisories", "", payload, &advisory) if err == nil && status == http.StatusOK && validAdvisoryResponse(advisory, trusted) { cognition = string(advisory.FinishReason) - if advisory.FinishReason == cognitive.FinishCompleted { + if advisory.FinishReason == cognitive.FinishCompleted && (strings.TrimSpace(saved.FallbackText) == "" || !isBoilerplateAdvisory(advisory.AdvisoryText)) { reply = advisory.AdvisoryText } } @@ -516,6 +516,15 @@ func (g *gateway) handleChatMessage(w http.ResponseWriter, r *http.Request) { }) } +func isBoilerplateAdvisory(value string) bool { + switch strings.ToLower(strings.TrimSpace(value)) { + case "я рядом.", "я рядом", "понял.", "понял", "принял.", "принял": + return true + default: + return false + } +} + func localChatContext(saved interaction.ChatMessageResponse) []cognitive.ContextExcerpt { assistantName := strings.TrimSpace(saved.AssistantName) if assistantName == "" { diff --git a/cmd/creator-web/server_test.go b/cmd/creator-web/server_test.go index 8afe9bf..e2d1a54 100644 --- a/cmd/creator-web/server_test.go +++ b/cmd/creator-web/server_test.go @@ -23,6 +23,17 @@ func TestLocalChatContextIncludesDomovoyIdentityAndOptionalActiveProject(t *test } } +func TestBoilerplateAdvisoryDoesNotReplaceUsefulFallback(t *testing.T) { + for _, value := range []string{"Я рядом", "Понял.", "Принял."} { + if !isBoilerplateAdvisory(value) { + t.Fatalf("%q was not recognized as boilerplate", value) + } + } + if isBoilerplateAdvisory("Жили-были дед и баба.") { + t.Fatal("useful creative reply was treated as boilerplate") + } +} + func TestCreatorRouteAllowsOnlyBoundedDelegationReads(t *testing.T) { tests := []struct { path string