From 91425809c378f82dd4c7fb9d86ca37b84fbc82eb Mon Sep 17 00:00:00 2001 From: patrick-motsch Date: Sun, 15 Feb 2026 11:48:44 +0100 Subject: [PATCH] fix(teamsbot): AI prompt priority rules, bot-name trigger overrides cooldown - SPEECH_TEAMS prompt: Rule 1 (bot name mentioned) now has highest priority and ALWAYS triggers a response, even for greetings/smalltalk - Bot-name detection in transcript overrides cooldown timer (immediate trigger) - Added multilingual instruction: AI responds in the language it's addressed in - Voice interface: clean camelCase mapping (audio_content -> audioContent) - Config save: added "config" to allowed update fields in interfaceFeatures - Default TTS voices for common languages in connectorVoiceGoogle Co-authored-by: Cursor --- modules/features/teamsbot/service.py | 16 ++++++------ modules/services/serviceAi/mainServiceAi.py | 29 ++++++++++++--------- 2 files changed, 24 insertions(+), 21 deletions(-) diff --git a/modules/features/teamsbot/service.py b/modules/features/teamsbot/service.py index aedb2f88..8c31df3c 100644 --- a/modules/features/teamsbot/service.py +++ b/modules/features/teamsbot/service.py @@ -370,19 +370,19 @@ class TeamsbotService: - Cooldown respected """ now = time.time() - - # Cooldown check timeSinceLastCall = now - self._lastAiCallTime + + # Bot name mentioned -> immediate trigger (OVERRIDES cooldown) + botNameLower = self.config.botName.lower() + if botNameLower in transcriptText.lower(): + logger.info(f"Trigger: Bot name '{self.config.botName}' detected in transcript (overrides cooldown): '{transcriptText[:60]}...'") + return True + + # Cooldown check (only for non-name triggers) if timeSinceLastCall < self.config.triggerCooldownSeconds: logger.debug(f"Trigger: Cooldown active ({timeSinceLastCall:.1f}s < {self.config.triggerCooldownSeconds}s)") return False - # Bot name mentioned -> immediate trigger - botNameLower = self.config.botName.lower() - if botNameLower in transcriptText.lower(): - logger.info(f"Trigger: Bot name '{self.config.botName}' detected in transcript: '{transcriptText[:60]}...'") - return True - # Periodic trigger if timeSinceLastCall >= self.config.triggerIntervalSeconds: logger.info(f"Trigger: Periodic interval ({self.config.triggerIntervalSeconds}s) elapsed ({timeSinceLastCall:.1f}s since last call)") diff --git a/modules/services/serviceAi/mainServiceAi.py b/modules/services/serviceAi/mainServiceAi.py index 1247ab70..a57054a4 100644 --- a/modules/services/serviceAi/mainServiceAi.py +++ b/modules/services/serviceAi/mainServiceAi.py @@ -329,23 +329,26 @@ class AiService: Combines a fixed base prompt with user-configurable instructions. """ basePrompt = f"""Du bist "{botName}", ein AI-Teilnehmer in einem Microsoft Teams Meeting. -Analysiere das folgende Transkript der laufenden Diskussion und entscheide, ob du antworten sollst. +Analysiere das folgende Transkript und entscheide, ob du antworten sollst. -ANTWORTE NUR wenn: -1. Du direkt angesprochen wirst (z.B. "{botName}, was denkst du?" oder "Hey {botName}") -2. Eine explizite Frage an die Runde gestellt wird, die du sachlich beantworten kannst -3. Du einen wertvollen, nicht-offensichtlichen Beitrag zur Diskussion hast +WICHTIG: Das Transkript kann in verschiedenen Sprachen sein (Deutsch, Englisch, etc.) weil die Spracherkennung die Sprache nicht immer korrekt erkennt. Antworte immer in der Sprache, in der du angesprochen wirst. -ANTWORTE NICHT wenn: -- Die Teilnehmer normal miteinander sprechen ohne dich einzubeziehen -- Die Diskussion keinen Input von dir benoetigt -- Du nur wiederholen wuerdest, was bereits gesagt wurde -- Es sich um Smalltalk oder Begruessung handelt +REGEL 1 (HOECHSTE PRIORITAET - IMMER ANTWORTEN): +Wenn dein Name "{botName}" oder eine aehnliche Anrede (Shelly, shelly, SHELLY, etc.) im Transkript vorkommt, MUSST du IMMER antworten, egal ob es Smalltalk, eine Frage oder eine Begruessung ist. Du bist ein freundlicher Meeting-Teilnehmer. + +REGEL 2 (ANTWORTEN wenn sinnvoll): +- Eine explizite Frage an die Runde gestellt wird, die du sachlich beantworten kannst +- Du einen wertvollen Beitrag zur Diskussion hast + +REGEL 3 (NICHT ANTWORTEN): +- Die Teilnehmer normal miteinander sprechen OHNE deinen Namen zu nennen +- Die Diskussion keinen Input von dir benoetigt und du nicht angesprochen wirst ANTWORT-STIL: -- Halte dich kurz und praezise (max 2-3 Saetze fuer Sprache) -- Sei professionell aber natuerlich -- Beziehe dich konkret auf das Gesagte""" +- Halte dich kurz und praezise (max 2-3 Saetze) +- Sei freundlich, professionell und natuerlich +- Bei Begruessung: Antworte herzlich zurueck +- Bei Fragen: Beantworte sachlich und konkret""" # Append user-configured instructions if provided if userSystemPrompt and userSystemPrompt.strip():