diff --git a/cmd/cognitive-worker/gateway.go b/cmd/cognitive-worker/gateway.go index 5bdb8a1..ed2e9fc 100644 --- a/cmd/cognitive-worker/gateway.go +++ b/cmd/cognitive-worker/gateway.go @@ -187,6 +187,9 @@ func selectionObjectiveForMeaning(meaning cognitive.TaskMeaning, message string) func builtinAdvisory(request cognitive.GatewayAdvisoryRequest) cognitive.GatewayAdvisoryResponse { text := "Проверю запрос доступным маршрутом и сообщу результат." + if request.Meaning.SpeechAct == "QUESTION" && isIdentityInquiry(request.Meaning.RequestedOutcome) { + text = "Я — Домовой, ваш помощник." + } switch request.Meaning.InformationRequestKind { case interaction.InformationRequestCognitiveModelInventory: text = "Проверю подключённые модели. Ключи и пароли не показываю." @@ -201,7 +204,9 @@ func builtinAdvisory(request cognitive.GatewayAdvisoryRequest) cognitive.Gateway case "REQUEST_TO_INVESTIGATE": text = "Понял задачу. Проверю доступный путь и сообщу результат." case "QUESTION": - text = "Проверю вопрос доступным источником и отвечу по существу." + if !isIdentityInquiry(request.Meaning.RequestedOutcome) { + text = "Проверю вопрос доступным источником и отвечу по существу." + } case "CONVERSATIONAL": text = "Я — Домовой, ваш помощник." } @@ -209,6 +214,21 @@ func builtinAdvisory(request cognitive.GatewayAdvisoryRequest) cognitive.Gateway return cognitive.GatewayAdvisoryResponse{Version: request.Version, RequestID: request.RequestID, AdvisoryText: text, FinishReason: cognitive.FinishCompleted} } +func isIdentityInquiry(message string) bool { + tokens := strings.Fields(strings.ToLower(strings.NewReplacer("?", " ", "!", " ", ",", " ").Replace(message))) + hasIdentitySubject := false + hasAssistantReference := false + for _, token := range tokens { + switch token { + case "кто", "зовут", "имя": + hasIdentitySubject = true + case "ты", "тебя", "тебе", "вы", "вас": + hasAssistantReference = true + } + } + return hasIdentitySubject && hasAssistantReference +} + func (g cognitiveGateway) invokeBuiltinAdvisory(ctx context.Context, request cognitive.GatewayAdvisoryRequest, maxOutputBytes int) cognitive.GatewayAdvisoryResponse { if g.builtinLocal != nil && g.builtinLocal.Provider != nil { invocation := cognitive.AdvisoryRequest{Version: request.Version, RequestID: request.RequestID, ActorID: request.ActorID, PrincipalID: request.PrincipalID, ScopeID: request.ScopeID, Message: request.Message, Context: request.Context, Locale: request.Locale, MaxOutputBytes: maxOutputBytes, ProviderBindingID: "builtin-local-binding-v1", ProviderBindingRevision: 1, ProviderInstanceID: "builtin-local-lifeboat-v1", ModelDescriptorID: "builtin-local-model-v1", ProviderModelID: "domovoy-lifeboat"} diff --git a/cmd/cognitive-worker/gateway_registry_test.go b/cmd/cognitive-worker/gateway_registry_test.go index 6f8d40c..f6d2c16 100644 --- a/cmd/cognitive-worker/gateway_registry_test.go +++ b/cmd/cognitive-worker/gateway_registry_test.go @@ -194,9 +194,9 @@ func TestBuiltInAdvisoryIdentityIsNaturalAndDoesNotMentionResponseLength(t *test response := builtinAdvisory(cognitive.GatewayAdvisoryRequest{ Version: cognitive.CreatorAdvisoryV1, RequestID: "request-identity", - Meaning: cognitive.TaskMeaning{SpeechAct: "QUESTION"}, + Meaning: cognitive.TaskMeaning{SpeechAct: "QUESTION", RequestedOutcome: "ты кто?"}, }) - if response.AdvisoryText != "Проверю вопрос доступным источником и отвечу по существу." { + if response.AdvisoryText != "Я — Домовой, ваш помощник." { t.Fatalf("unexpected identity response: %q", response.AdvisoryText) } if strings.Contains(response.AdvisoryText, "коротко") || strings.Contains(response.AdvisoryText, "подробност") {