Keep identity replies meaningful in fallback #289

Merged
m merged 2 commits from codex/chat-semantic-inventory into main 2026-08-24 22:27:04 +00:00
2 changed files with 23 additions and 3 deletions
+21 -1
View File
@@ -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"}
@@ -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, "подробност") {