diff --git a/backend/app/agents/devrel/github/prompts/general_github_help.py b/backend/app/agents/devrel/github/prompts/general_github_help.py index 76396cdd..c9101867 100644 --- a/backend/app/agents/devrel/github/prompts/general_github_help.py +++ b/backend/app/agents/devrel/github/prompts/general_github_help.py @@ -1,24 +1,23 @@ -GENERAL_GITHUB_HELP_PROMPT = """You are a GitHub DevRel expert assistant. Provide helpful guidance for this GitHub-related query. +GENERAL_GITHUB_HELP_PROMPT = """You are a GitHub DevRel expert assistant. +Provide helpful guidance for this GitHub-related query. USER QUERY: {query} {search_context} FORMATTING REQUIREMENTS: -- Use simple numbered lists (1. 2. 3.) instead of markdown bullets -- Avoid complex markdown formatting like **bold** or *italic* -- Use plain text with clear line breaks -- Format links as plain URLs: https://example.com -- Use simple emojis -- Keep paragraphs short and scannable -- Avoid complex markdown formatting +- Simple numbered lists (1. 2. 3.) - no markdown bullets +- Plain text with clear line breaks - avoid **bold** or *italic* +- Plain URLs: https://example.com +- Simple emojis for visual appeal +- Short, scannable paragraphs -Provide a comprehensive, helpful response that: -1. Directly addresses their question using your GitHub expertise -2. Incorporates relevant information from the web search results above -3. Offers practical next steps and actionable advice -4. Suggests related GitHub features or best practices -5. Provides examples or code snippets when relevant -6. Format for readability - clean, simple text +RESPONSE GUIDELINES: +1. Directly address their question using your GitHub expertise +2. Incorporate relevant information from the web search results above +3. Offer practical next steps and actionable advice +4. Suggest related GitHub features or best practices +5. Provide examples or code snippets when relevant +6. Maintain a conversational, helpful tone -Be conversational and actionable. Focus on being genuinely helpful for their GitHub needs.""" +Be genuinely helpful and actionable for their GitHub needs.""" diff --git a/backend/app/agents/devrel/github/prompts/intent_analysis.py b/backend/app/agents/devrel/github/prompts/intent_analysis.py index eb3f9a66..72b692e1 100644 --- a/backend/app/agents/devrel/github/prompts/intent_analysis.py +++ b/backend/app/agents/devrel/github/prompts/intent_analysis.py @@ -1,26 +1,30 @@ -GITHUB_INTENT_ANALYSIS_PROMPT = """You are an expert GitHub DevRel AI assistant. Analyze the user query and classify the intent. +GITHUB_INTENT_ANALYSIS_PROMPT = """You are an expert GitHub DevRel AI assistant. +Analyze the user query and classify the intent precisely. AVAILABLE FUNCTIONS: -- web_search: Search the web for information -- contributor_recommendation: Finding the right people to review PRs, assign issues, or collaborate -- repo_support: Questions about codebase structure, dependencies, impact analysis, architecture -- issue_creation: Creating bug reports, feature requests, or tracking items -- documentation_generation: Generating docs, READMEs, API docs, guides, or explanations -- find_good_first_issues: Finding beginner-friendly issues to work on across repositories -- general_github_help: General GitHub-related assistance and guidance +- web_search: Search the web for current information or external resources +- contributor_recommendation: Find reviewers, assignees, or collaborators for specific tasks +- repo_support: Codebase structure, dependencies, impact analysis, architecture questions +- issue_creation: Create bug reports, feature requests, or tracking items +- documentation_generation: Generate docs, READMEs, API docs, guides, or explanations +- find_good_first_issues: Find beginner-friendly issues for newcomers +- general_github_help: General GitHub guidance and best practices USER QUERY: {user_query} -Classification guidelines: -- contributor_recommendation: Finding reviewers, assignees, collaborators -- repo_support: Code structure, dependencies, impact analysis, architecture -- issue_creation: Creating bugs, features, tracking items -- documentation_generation: Docs, READMEs, guides, explanations -- find_good_first_issues: Beginners, newcomers, "good first issue" -- web_search: General information needing external search -- general_github_help: General GitHub questions not covered above +PRECISE CLASSIFICATION GUIDELINES: +- contributor_recommendation: "Who should review this?", "Who can help with X?", + "Find experts in Y" +- repo_support: "How is this structured?", "What depends on X?", "Impact of changing Y?", + "Architecture questions" +- issue_creation: "Create a bug report", "File a feature request", "Track this problem" +- documentation_generation: "Generate README", "Create API docs", "Write guide for X" +- find_good_first_issues: "Good first issues", "beginner tasks", "newcomer friendly", + "getting started" +- web_search: Need current info, external resources, or information not in our knowledge base +- general_github_help: GitHub features, workflows, best practices, general guidance -CRITICAL: Return ONLY raw JSON. No markdown, no code blocks, no explanation text. +CRITICAL: Return ONLY raw JSON. No markdown, code blocks, or explanation text. {{ "classification": "function_name_from_list_above", diff --git a/backend/app/agents/devrel/prompts/react_prompt.py b/backend/app/agents/devrel/prompts/react_prompt.py index b92e5f68..72a10f4c 100644 --- a/backend/app/agents/devrel/prompts/react_prompt.py +++ b/backend/app/agents/devrel/prompts/react_prompt.py @@ -1,4 +1,5 @@ -REACT_SUPERVISOR_PROMPT = """You are a DevRel AI assistant. Use ReAct reasoning: Think -> Act -> Observe. +REACT_SUPERVISOR_PROMPT = """You are a DevRel AI assistant for {organization_name}. +Use ReAct reasoning: Think -> Act -> Observe. CURRENT SITUATION: - User Message: {latest_message} @@ -13,23 +14,24 @@ {tool_results} AVAILABLE ACTIONS: -1. web_search - Search the web for external information -2. faq_handler - Answer common questions from knowledge base -3. onboarding - Welcome new users and guide exploration -4. github_toolkit - Handle GitHub operations (issues, PRs, repos, docs) -5. complete - Task is finished, format final response +1. web_search - Search for current/external information about {organization_name} not in knowledge base +2. faq_handler - Answer {organization_name}-specific DevRel questions from knowledge base +3. onboarding - Welcome first-time users and guide {organization_name} project exploration +4. github_toolkit - Handle {organization_name} GitHub operations (issues, PRs, repos, documentation) +5. complete - Task is finished, format and deliver final response -THINK: Analyze the user's request and current context. What needs to be done? +THINK: Analyze the user's request and current context. What specific {organization_name}-related need must be addressed? -Then choose ONE action: -- If you need external information or recent updates → web_search -- If this is a common question with a known answer → faq_handler -- If this is a new user needing guidance → onboarding -- If this involves GitHub repositories, issues, PRs, or code → github_toolkit -- If you have enough information to fully answer → complete +ACTION SELECTION CRITERIA: +- web_search: Need current information about {organization_name}, news, or external resources not in our knowledge base +- faq_handler: Question matches {organization_name}-specific DevRel topics + (setup, contribution, community guidelines, platform support) +- onboarding: User is new/first-time, needs {organization_name} project introduction or getting started help +- github_toolkit: {organization_name} GitHub-specific operations (repo queries, issue management, PR help, docs) +- complete: Have sufficient information to provide a comprehensive {organization_name}-specific answer Respond in this exact format: -THINK: [Your reasoning about what the user needs] +THINK: [Your specific reasoning about what the user needs and why] ACT: [Choose one: web_search, faq_handler, onboarding, github_toolkit, complete] -REASON: [Why you chose this action] +REASON: [Specific justification for this action choice] """ diff --git a/backend/app/agents/devrel/prompts/response_prompt.py b/backend/app/agents/devrel/prompts/response_prompt.py index 99291f36..beb89007 100644 --- a/backend/app/agents/devrel/prompts/response_prompt.py +++ b/backend/app/agents/devrel/prompts/response_prompt.py @@ -1,41 +1,28 @@ -RESPONSE_PROMPT = """You are a helpful DevRel assistant. Create a comprehensive response based on all available information. - -USER'S REQUEST: -{latest_message} - -CONVERSATION SUMMARY: -{conversation_summary} - -RECENT CONVERSATION: -{conversation_history} - -CURRENT CONTEXT: -{current_context} - -YOUR REASONING PROCESS: -{supervisor_thinking} - -TOOL RESULTS: -{tool_results} - -TASK RESULT: -{task_result} - -DISCORD FORMATTING REQUIREMENTS: -- Use simple numbered lists (1. 2. 3.) instead of markdown bullets -- Avoid complex markdown formatting like **bold** or *italic* -- Use plain text with clear line breaks -- Format links as plain URLs: https://example.com -- Use simple emojis for visual appeal: 🔗 📚 ⚡ -- Keep paragraphs short and scannable -- Use "→" for arrows instead of markdown arrows - -Instructions: -1. Synthesize all information - Use reasoning process, tool results, and task results together -2. Address the user's needs - Focus on what they're trying to accomplish -3. Be actionable - Provide specific steps, resources, or guidance -4. Stay DevRel-focused - Be encouraging, helpful, and community-oriented -5. Reference sources - Mention what you researched or considered when relevant -6. Format for readability - Clean, simple text that displays well +RESPONSE_PROMPT = """You are a helpful DevRel assistant. Create a comprehensive response +based on all available information. + +USER'S REQUEST: {latest_message} +CONVERSATION SUMMARY: {conversation_summary} +RECENT CONVERSATION: {conversation_history} +CURRENT CONTEXT: {current_context} +YOUR REASONING: {supervisor_thinking} +TOOL RESULTS: {tool_results} +TASK RESULT: {task_result} + +FORMATTING FOR DISCORD: +- Simple numbered lists (1. 2. 3.) - no markdown bullets +- Plain text with clear line breaks - avoid **bold** or *italic* +- Plain URLs: https://example.com +- Simple emojis for visual appeal (use sparingly and appropriately) +- Short, scannable paragraphs +- Use "→" instead of markdown arrows + +RESPONSE REQUIREMENTS: +1. Synthesize all available information (reasoning, tool results, task results) +2. Address the user's specific needs and goals +3. Provide actionable steps, resources, or guidance +4. Maintain encouraging, community-oriented DevRel tone +5. Reference sources when relevant +6. Ensure readability and clear formatting Create a helpful, comprehensive response:""" diff --git a/backend/app/agents/devrel/prompts/search_prompt.py b/backend/app/agents/devrel/prompts/search_prompt.py index 7b04c931..e3e8be88 100644 --- a/backend/app/agents/devrel/prompts/search_prompt.py +++ b/backend/app/agents/devrel/prompts/search_prompt.py @@ -1,4 +1,17 @@ -EXTRACT_SEARCH_QUERY_PROMPT = """Extract the core search query from the following user message. +EXTRACT_SEARCH_QUERY_PROMPT = """Extract the most effective search query from the user message. + User Message: "{message}" -Focus on the main topic or question. Be concise. -Search Query: """ + +GUIDELINES: +- Focus on the main topic, key terms, and specific questions +- Remove conversational filler ("I was wondering", "Can you help me") +- Include technical terms, tool names, and specific concepts +- Keep it concise but comprehensive (2-8 key words/phrases) +- Preserve important context that affects the search + +Examples: +- "I'm having trouble setting up Docker" → "Docker setup troubleshooting" +- "Can you help me understand how React hooks work?" → "React hooks tutorial guide" +- "What's the best way to deploy to AWS?" → "AWS deployment best practices" + +Search Query:""" diff --git a/backend/app/agents/devrel/prompts/summarization_prompt.py b/backend/app/agents/devrel/prompts/summarization_prompt.py index 470e7750..4171d588 100644 --- a/backend/app/agents/devrel/prompts/summarization_prompt.py +++ b/backend/app/agents/devrel/prompts/summarization_prompt.py @@ -1,18 +1,21 @@ -CONVERSATION_SUMMARY_PROMPT = """You are a DevRel assistant. Create a concise summary of this conversation. +CONVERSATION_SUMMARY_PROMPT = """You are a DevRel assistant. Create a concise summary +of this conversation for future context. -EXISTING SUMMARY: -{existing_summary} +EXISTING SUMMARY: {existing_summary} +RECENT CONVERSATION: {recent_conversation} +USER PROFILE: {user_profile} -RECENT CONVERSATION: -{recent_conversation} +SUMMARY FOCUS: +1. User's technical background and experience level +2. Specific problems or challenges they're facing +3. Topics of interest and areas they're exploring +4. Key solutions or resources provided +5. Follow-up items or ongoing assistance needed -USER PROFILE: -{user_profile} - -Instructions: -1. Create a NEW summary combining existing and recent conversation -2. Focus on user's technical interests, problems, and experience level -3. Keep under 300 words -4. Include relevant context for future interactions +REQUIREMENTS: +- Combine existing and recent conversation into NEW summary +- Keep under 300 words for efficiency +- Include relevant context for future interactions +- Focus on actionable insights about the user's needs NEW SUMMARY:""" diff --git a/backend/app/classification/classification_router.py b/backend/app/classification/classification_router.py index 1708dced..9b678b80 100644 --- a/backend/app/classification/classification_router.py +++ b/backend/app/classification/classification_router.py @@ -37,8 +37,8 @@ async def should_process_message(self, message: str, context: Dict[str, Any] = N result = json.loads(json_str) return { - "needs_devrel": result.get("needs_devrel", True), - "priority": result.get("priority", "medium"), + "needs_devrel": result.get("needs_devrel", False), + "priority": result.get("priority", "low"), "reasoning": result.get("reasoning", "LLM classification"), "original_message": message } @@ -50,10 +50,10 @@ async def should_process_message(self, message: str, context: Dict[str, Any] = N return self._fallback_triage(message) def _fallback_triage(self, message: str) -> Dict[str, Any]: - """Fallback: assume it needs DevRel help""" + """Fallback: be conservative and assume it doesn't need DevRel help""" return { - "needs_devrel": True, - "priority": "medium", - "reasoning": "Fallback - assuming DevRel assistance needed", + "needs_devrel": False, + "priority": "low", + "reasoning": "Fallback - conservative approach, no DevRel assistance needed", "original_message": message } diff --git a/backend/app/classification/prompt.py b/backend/app/classification/prompt.py index 5b458d3b..d06c54f3 100644 --- a/backend/app/classification/prompt.py +++ b/backend/app/classification/prompt.py @@ -1,26 +1,73 @@ -DEVREL_TRIAGE_PROMPT = """Analyze this message to determine if it needs DevRel assistance. +DEVREL_TRIAGE_PROMPT = """Analyze this message to determine if it needs DevRel assistance. +Be EXTREMELY STRICT and CONSERVATIVE - the DevRel agent should only be triggered in very specific circumstances. Message: {message} Context: {context} -DevRel handles: -- Technical questions about projects/APIs -- Developer onboarding and support -- Bug reports and feature requests -- Community discussions about development -- Documentation requests -- General developer experience questions +STRICT ACTIVATION RULES - DevRel agent should ONLY be triggered if: + +1. EXPLICIT BOT MENTION/TAG (highest priority): + - User explicitly mentions the DevRel AI bot (e.g., "@Devr.AI", "hey bot", + "can you help", "@assistant") + - User directly addresses the AI assistant with phrases like "AI", "bot", + "assistant", "help me" + - User uses command-like language: "bot, can you...", "assistant, please..." + +2. DIRECT PROJECT QUESTIONS (only if clearly related to THIS specific repository/project): + - Setup/installation questions: "How do I set up the development environment?" + - Build/compilation errors: "I'm getting a build error", "compilation failed" + - Contribution process: "How do I contribute?", "How do I submit a PR?" + - Repository-specific technical issues: "This API endpoint isn't working" + - Documentation requests about THIS project: "Where is the API documentation?" + +IGNORE COMPLETELY (always return false): +- General chatter between users: "Hey, how's it going?", "What's for lunch?" +- Greetings without bot mention: "Hi everyone", "Good morning" +- General programming questions not specific to this project: "How do I use React?" +- Conversations between other users that don't mention the bot +- Off-topic discussions: weather, personal conversations, unrelated topics +- Vague statements without clear questions: "This is cool", "Nice work" +- General complaints without specific technical issues: "This is frustrating" +- General questions that could be answered by anyone: "What time is it?", "How's the weather?" +- Questions about other projects or technologies not related to this repository +- Social conversations, jokes, or casual banter +- Questions that don't require technical assistance + +CRITICAL: If the message is general conversation, casual chat, or doesn't explicitly +involve the bot OR a specific question about THIS project/repository, return needs_devrel: false. + +BE CONSERVATIVE: When in doubt, return false. It's better to miss a few legitimate requests +than to respond to inappropriate messages. Respond ONLY with JSON: {{ "needs_devrel": true/false, "priority": "high|medium|low", - "reasoning": "brief explanation" + "reasoning": "brief explanation of decision" }} -Examples: -- "How do I contribute?" → {{"needs_devrel": true, "priority": "high", "reasoning": "Onboarding question"}} -- "What's for lunch?" → {{"needs_devrel": false, "priority": "low", "reasoning": "Not development related"}} -- "API is throwing errors" → {{"needs_devrel": true, "priority": "high", "reasoning": "Technical support needed"}} +STRICT Examples: +- "How do I contribute?" → {{"needs_devrel": true, "priority": "high", + "reasoning": "Direct contribution question"}} +- "Hey @Devr.AI, can you help me?" → {{"needs_devrel": true, "priority": "high", + "reasoning": "Explicit bot mention"}} +- "I'm getting a build error in this project" → {{"needs_devrel": true, "priority": "high", + "reasoning": "Project-specific technical issue"}} +- "What's for lunch?" → {{"needs_devrel": false, "priority": "low", + "reasoning": "General chatter, not project-related"}} +- "Hi everyone" → {{"needs_devrel": false, "priority": "low", + "reasoning": "General greeting without bot mention"}} +- "How do I use React?" → {{"needs_devrel": false, "priority": "low", + "reasoning": "General programming question, not project-specific"}} +- "Nice work on this feature" → {{"needs_devrel": false, "priority": "low", + "reasoning": "General comment, no question or bot mention"}} +- "That's frustrating" → {{"needs_devrel": false, "priority": "low", + "reasoning": "Vague complaint without specific issue"}} +- "What time is it?" → {{"needs_devrel": false, "priority": "low", + "reasoning": "General question not requiring technical assistance"}} +- "How's the weather?" → {{"needs_devrel": false, "priority": "low", + "reasoning": "Off-topic question unrelated to project"}} +- "This is a great project" → {{"needs_devrel": false, "priority": "low", + "reasoning": "General compliment, no question or bot mention"}} """ diff --git a/backend/integrations/discord/bot.py b/backend/integrations/discord/bot.py index a83651cb..3a3b80c2 100644 --- a/backend/integrations/discord/bot.py +++ b/backend/integrations/discord/bot.py @@ -51,14 +51,28 @@ async def on_message(self, message): return try: - triage_result = await self.classifier.should_process_message( - message.content, - { - "channel_id": str(message.channel.id), - "user_id": str(message.author.id), - "guild_id": str(message.guild.id) if message.guild else None + # Check for explicit bot mentions first (Discord's built-in mention detection) + bot_mentioned = self.user in message.mentions + + # If bot is explicitly mentioned, always process the message + if bot_mentioned: + logger.info(f"Bot explicitly mentioned by {message.author.name}") + triage_result = { + "needs_devrel": True, + "priority": "high", + "reasoning": "Explicit bot mention via Discord @mention" } - ) + else: + # Only use LLM classification for non-mentioned messages + triage_result = await self.classifier.should_process_message( + message.content, + { + "channel_id": str(message.channel.id), + "user_id": str(message.author.id), + "guild_id": str(message.guild.id) if message.guild else None, + "bot_mentioned": False + } + ) logger.info(f"Message triage result: {triage_result}")