diff --git a/backend/app/agents/devrel/prompts/react_prompt.py b/backend/app/agents/devrel/prompts/react_prompt.py index 12195d96..2854d608 100644 --- a/backend/app/agents/devrel/prompts/react_prompt.py +++ b/backend/app/agents/devrel/prompts/react_prompt.py @@ -1,10 +1,10 @@ -REACT_SUPERVISOR_PROMPT = """You are a DevRel AI assistant. Use ReAct reasoning: Think -> Act -> Observe. +REACT_SUPERVISOR_PROMPT = """You are a DevRel AI assistant using ReAct reasoning: Think → Act → Observe → Repeat until complete. CURRENT SITUATION: - User Message: {latest_message} - Platform: {platform} - Interaction Count: {interaction_count} -- Current Iteration: {iteration_count} +- Current Iteration: {iteration_count}/5 (MAX 5 iterations before completing) CONVERSATION HISTORY: {conversation_history} @@ -13,27 +13,92 @@ {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 ANY GitHub-related queries such as: - - Listing or retrieving repository issues - - Creating or updating issues/PRs - - Checking repository details, documentation, or code - - Anything where the user mentions "repo", "repository", "issues", "PR", "pull request", or "GitHub" -5. complete - Task is finished, format final response - -THINK: Analyze the user's request and current context. What needs to be done? - -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 - -Respond in this exact format: -THINK: [Your reasoning about what the user needs] -ACT: [Choose one: web_search, faq_handler, onboarding, github_toolkit, complete] -REASON: [Why you chose this action] -""" + +1. **web_search** - Search the web for external information + Use when: Need current info, recent updates, error solutions, external documentation + Examples: "npm install errors 2024", "GitHub Actions best practices" + +2. **faq_handler** - Query internal knowledge base for common questions + Use when: Standard questions about this project (setup, contribution, docs, FAQs) + Examples: Contribution guidelines, setup process, code of conduct + +3. **onboarding** - Welcome and guide new contributors + Use when: New user introductions, first-time questions, "how do I start?" + Examples: "I'm new here", "where do I begin?", "what should I work on?" + +4. **github_toolkit** - Interact with GitHub repositories + Use when: Need to check/create issues, PRs, read code, repository details + Examples: List open issues, get PR status, check repository structure + +5. **complete** - Finish reasoning and format final response + Use when: Have sufficient information to fully answer the user's question + Must use: After max iterations (5) OR when confident you can answer + +DECISION LOGIC: + +Priority Order (check in this sequence): +1. Is this a new user saying hello/asking where to start? → onboarding +2. Is this explicitly about GitHub (issues, PRs, repo)? → github_toolkit +3. Is this a common FAQ about THIS project? → faq_handler +4. Do I need external/recent information? → web_search +5. Do I have enough information to answer? → complete + +When NOT to use tools: +- Don't use web_search for information already in conversation history +- Don't use faq_handler if you just used it (avoid repetition) +- Don't use github_toolkit for general coding questions +- Don't keep searching if you have a reasonable answer + +Iteration Limits: +- Iteration 4/5: Start planning to complete, don't start new searches +- Iteration 5/5: MUST choose "complete" - format best answer with available info +- If uncertain after 3 iterations: Choose "complete" and acknowledge limitations + +THINK: Analyze the situation step-by-step +- What is the user actually asking for? +- What information do I already have? +- What's missing to give a complete answer? +- Which tool is most appropriate? +- Have I already tried this tool? (avoid loops) + +Then choose ONE action and explain your reasoning. + +Respond in this EXACT format: +THINK: [Your step-by-step reasoning about what the user needs and what you should do] +ACT: [Choose exactly one: web_search, faq_handler, onboarding, github_toolkit, complete] +REASON: [Brief explanation of why this specific action is the best next step] + +EXAMPLES OF GOOD REASONING: + +Example 1 - New User: +User: "Hi! I'm new to open source. How do I get started here?" +THINK: User is new and asking how to start. This is an onboarding scenario. I should welcome them and guide exploration. +ACT: onboarding +REASON: New contributor needs welcoming and initial guidance on how to begin contributing + +Example 2 - Technical Error: +User: "Getting 'module not found' error with npm install" +THINK: Technical error that needs troubleshooting. I should search for recent solutions since npm errors can change with updates. +ACT: web_search +REASON: Need current troubleshooting steps for npm module not found error + +Example 3 - Project-Specific: +User: "What's the contribution process for this repo?" +THINK: Standard question about contribution guidelines. This is likely in our FAQ/knowledge base. +ACT: faq_handler +REASON: Contribution guidelines are common project documentation stored in knowledge base + +Example 4 - Have Enough Info: +User: "What does this project do?" +[Previous iteration got project description from FAQ] +THINK: I received the project description from faq_handler. I now have complete information to answer the user's question. +ACT: complete +REASON: Have sufficient information from knowledge base to provide comprehensive answer + +Example 5 - GitHub Specific: +User: "Can you list the open issues labeled 'good first issue'?" +THINK: User wants specific GitHub data about issues with a label. This requires github_toolkit. +ACT: github_toolkit +REASON: Need to query repository for issues with specific label + +Now analyze the current situation and decide your next action:""" \ No newline at end of file diff --git a/backend/app/agents/devrel/prompts/response_prompt.py b/backend/app/agents/devrel/prompts/response_prompt.py index 4baa6b5e..851b66fb 100644 --- a/backend/app/agents/devrel/prompts/response_prompt.py +++ b/backend/app/agents/devrel/prompts/response_prompt.py @@ -1,4 +1,4 @@ -RESPONSE_PROMPT = """You are a helpful DevRel assistant. Create a comprehensive response based on all available information. +RESPONSE_PROMPT = """You are a helpful DevRel AI assistant. Create a comprehensive, well-formatted response for the user. USER'S REQUEST: {latest_message} @@ -21,30 +21,125 @@ TASK RESULT: {task_result} +═══════════════════════════════════════════════════════════════════ + +CONTENT GUIDELINES: + +1. **Synthesize Information** + - Combine reasoning process, tool results, and task results into a coherent answer + - Don't just dump raw tool outputs - interpret and explain them + - Connect information to the user's specific question + +2. **Be Actionable & Specific** + - Provide concrete next steps, not vague suggestions + - Include specific commands, links, file paths when relevant + - Example: "Run `npm install` in the project root" NOT "Install dependencies" + +3. **Address the User's Need** + - Focus on solving their problem or answering their question + - If they asked "how?", provide steps; if "what?", provide explanation + - Stay on topic - don't add unnecessary information + +4. **DevRel Tone** + - Friendly and encouraging, especially with new contributors + - Supportive, not condescending or assuming knowledge + - Use "we/our" for community, "you/your" for user actions + - Celebrate efforts: "Great question!", "Thanks for contributing!" + +5. **Handle Incomplete Information** + - If missing info: Acknowledge it and provide what you know + - Example: "I don't have specifics on X, but here's what I found about Y..." + - Offer alternatives: "You could also try...", "Another option is..." + - Direct to resources: "Check the docs at [link] for more details" + +6. **Reference Sources** + - Mention where information came from when relevant + - Examples: "According to the FAQ...", "Based on the GitHub repository...", "From the documentation..." + - Builds trust and helps users know info is reliable + +7. **Length & Structure** + - Aim for 3-8 sentences for simple questions + - 2-4 paragraphs for complex topics + - Use numbered lists for multi-step processes + - Break up long explanations with line breaks + - Maximum 15 lines unless absolutely necessary + +═══════════════════════════════════════════════════════════════════ + 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 - -SPECIAL FORMATTING FOR CONTRIBUTOR RECOMMENDATIONS: -If the task result contains contributor recommendations: -- Start with "Found X Contributors" -- Show search query used and keywords -- For each contributor: "1. username (Score: X.XXX)" -- Include their expertise/reason for recommendation -- End with metadata about search and actionable guidance - -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 -7. For contributor recommendations - Use the special formatting above to show scores and details - -Create a helpful, comprehensive response:""" + +**Text Formatting:** +- Use simple numbered lists: 1. 2. 3. +- Avoid heavy markdown: NO **bold** or *italic* +- Use `backticks` for inline commands/code snippets +- Use plain text with clear line breaks for readability +- Keep paragraphs short (2-4 sentences max) + +**Links:** +- Format as plain URLs: https://example.com +- Add context: "Check the setup guide: https://example.com/setup" + +**Visual Elements:** +- Use simple emojis sparingly for visual appeal: ✅ ❌ 🚀 💡 📚 +- Use "→" for arrows/flow +- Use line breaks to separate sections + +**Lists:** +- Numbered for sequential steps: 1. First step 2. Second step +- Simple format for options: • Option A • Option B + +═══════════════════════════════════════════════════════════════════ + +SPECIAL FORMATTING BY RESPONSE TYPE: + +**For New User Onboarding:** +- Start with warm welcome: "Welcome to [project]! 👋" +- Provide 3-4 clear starting points +- Link to key resources (contributing guide, setup docs) +- Encourage them: "We're excited to have you!" + +**For Technical Issues/Errors:** +- Acknowledge the problem: "That error usually means..." +- Provide solution steps numbered 1, 2, 3 +- Include specific commands or code if relevant +- Offer alternative solutions if available +- End with: "Let me know if this resolves it!" + +**For FAQ/Documentation Requests:** +- Answer the question directly first +- Provide relevant details or context +- Link to full documentation for deeper info +- Keep it concise - don't reproduce entire docs + +**For GitHub/Repository Queries:** +- Present findings clearly with numbers/stats +- Format lists of issues/PRs: "1. Issue #123 - Title" +- Include relevant links to GitHub +- Summarize rather than overwhelm with data + +**For Contributor Recommendations:** +- Start with "Found X Contributors" +- Show search query/keywords used +- List contributors: "1. username (Score: X.XXX) - Expertise" +- Provide context on why recommended +- End with actionable guidance on next steps + +**For General Inquiries:** +- Answer directly and concisely +- Provide relevant context +- Suggest related resources if helpful +- Keep tone friendly and professional + +═══════════════════════════════════════════════════════════════════ + +RESPONSE QUALITY CHECKLIST: +Before sending, verify: +✓ Does this directly answer the user's question? +✓ Is it actionable with specific next steps? +✓ Is the tone friendly and encouraging? +✓ Is formatting clean and Discord-friendly? +✓ Is length appropriate (not too long/short)? +✓ Are sources mentioned when relevant? +✓ Are links and commands correct? + +Now create a helpful, comprehensive response:""" \ No newline at end of file diff --git a/backend/app/agents/devrel/prompts/search_prompt.py b/backend/app/agents/devrel/prompts/search_prompt.py index 7b04c931..e00e685f 100644 --- a/backend/app/agents/devrel/prompts/search_prompt.py +++ b/backend/app/agents/devrel/prompts/search_prompt.py @@ -1,4 +1,48 @@ -EXTRACT_SEARCH_QUERY_PROMPT = """Extract the core search query from the following user message. +EXTRACT_SEARCH_QUERY_PROMPT = """Extract a clean, concise search query from the user's message. + User Message: "{message}" -Focus on the main topic or question. Be concise. -Search Query: """ + +INSTRUCTIONS: +1. Identify the core topic or question the user is asking about +2. Remove filler words: "I was wondering", "could you", "maybe", "please", "just", etc. +3. Remove conversational elements: greetings, politeness, context-setting phrases +4. Keep essential keywords: technical terms, specific features, error messages, action verbs +5. Preserve important context: version numbers, platform names, specific tools +6. If multiple topics, focus on the PRIMARY question/need +7. Keep it concise: 2-6 words ideal, maximum 10 words +8. Use natural search language, not full sentences + +EXAMPLES: + +Input: "Hey everyone! I was wondering if someone could help me understand how to set up the development environment for this project?" +Output: setup development environment + +Input: "I'm getting a really weird error that says 'module not found' when I try to run npm install. Any ideas?" +Output: npm install module not found error + +Input: "Could you please tell me where I can find the contribution guidelines? I'd love to help out!" +Output: contribution guidelines + +Input: "What's the best way to configure the API authentication? I'm using version 2.0 and need JWT support" +Output: configure API authentication JWT version 2.0 + +Input: "The GitHub Actions workflow is failing on the build step. It worked yesterday but now throws a syntax error" +Output: GitHub Actions build failing syntax error + +Input: "I'm new here! How do I get started with contributing to this project? What should I work on first?" +Output: getting started contributing + +Input: "Is there documentation for the REST API endpoints? Specifically looking for user authentication endpoints" +Output: REST API documentation user authentication + +Input: "My code review has been pending for 3 days. How long do PRs usually take to get reviewed here?" +Output: PR review timeline + +EDGE CASES: +- If message is just a greeting → extract any implicit topic or return "general inquiry" +- If multiple questions → prioritize the first actionable question +- If very technical error message → keep the specific error text +- If asking about specific issue/PR number → include the number + +Extract the search query now: +Search Query:""" \ No newline at end of file diff --git a/backend/app/agents/devrel/prompts/summarization_prompt.py b/backend/app/agents/devrel/prompts/summarization_prompt.py index 470e7750..45d38d65 100644 --- a/backend/app/agents/devrel/prompts/summarization_prompt.py +++ b/backend/app/agents/devrel/prompts/summarization_prompt.py @@ -1,4 +1,4 @@ -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, structured summary of this conversation. EXISTING SUMMARY: {existing_summary} @@ -9,10 +9,49 @@ 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 +SUMMARY STRUCTURE - Use these sections: -NEW SUMMARY:""" +**User Context:** +- Experience level (new contributor, experienced dev, maintainer, etc.) +- Primary interests/focus areas +- Platform/tech stack they're using + +**Interaction History:** +- What questions they've asked +- What issues/problems they've encountered +- What help they've received + +**Current Status:** +- What they're currently working on +- Any pending issues or blockers +- Next steps or goals mentioned + +**Key Preferences/Notes:** +- Communication style (prefers detailed/brief responses) +- Timezone/availability if mentioned +- Special considerations + +MERGING INSTRUCTIONS: +- If existing summary exists: Update it with new info, don't just append +- Remove outdated information (e.g., "currently blocked" if now resolved) +- Keep most recent context prioritized +- Consolidate duplicate information + +KEEP IT CONCISE: +- Maximum 250 words +- Focus on actionable context for future interactions +- Prioritize recent and relevant information +- Remove unnecessary conversational filler + +EXAMPLES: + +Good Summary: +**User Context:** New open-source contributor, learning Python. Using Windows 10. +**Interaction History:** Asked about setup process (resolved), contribution guidelines (provided), now working on issue #45. +**Current Status:** Implementing feature for authentication module. Stuck on JWT configuration. +**Key Preferences:** Prefers step-by-step instructions with code examples. + +Bad Summary: +User said hello. Then asked about contributing. We talked about setup. They're working on something. They seem nice. + +Create a NEW summary combining existing and recent conversation:""" \ No newline at end of file diff --git a/backend/app/classification/classification_router.py b/backend/app/classification/classification_router.py index 1708dced..f9c0ca9d 100644 --- a/backend/app/classification/classification_router.py +++ b/backend/app/classification/classification_router.py @@ -36,13 +36,16 @@ async def should_process_message(self, message: str, context: Dict[str, Any] = N import json result = json.loads(json_str) + # FIXED: Default to False instead of True return { - "needs_devrel": result.get("needs_devrel", True), - "priority": result.get("priority", "medium"), + "needs_devrel": result.get("needs_devrel", False), # ← CHANGED! + "priority": result.get("priority", "low"), "reasoning": result.get("reasoning", "LLM classification"), "original_message": message } + # FIXED: If no JSON found, don't respond + logger.warning(f"No JSON in classification response for: {message[:50]}") return self._fallback_triage(message) except Exception as e: @@ -50,10 +53,12 @@ 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: IGNORE message when classification fails""" + # FIXED: Changed to False - better to miss a message than spam + logger.warning(f"Classification failed, IGNORING message: {message[:50]}") return { - "needs_devrel": True, - "priority": "medium", - "reasoning": "Fallback - assuming DevRel assistance needed", + "needs_devrel": False, # ← CHANGED FROM TRUE TO FALSE! + "priority": "low", + "reasoning": "Fallback - classification failed, ignoring for safety", "original_message": message - } + } \ No newline at end of file diff --git a/backend/app/classification/prompt.py b/backend/app/classification/prompt.py index 5b458d3b..653f7398 100644 --- a/backend/app/classification/prompt.py +++ b/backend/app/classification/prompt.py @@ -4,13 +4,39 @@ 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 responds ONLY when: + +1. The bot is explicitly tagged or mentioned (e.g., @devr, @bot, mentions the bot by name) + - Even if off-topic, return true so bot can acknowledge and redirect + - Mark priority as "low" if question is off-topic + +2. OR the message is a DIRECT QUESTION (contains ?, asks how/what/where/when/why) specifically about THIS PROJECT: + - Project/repository setup, installation, or configuration + - Contribution guidelines, process, or how to get started + - Specific technical errors, bugs, or issues related to the project + - Repository documentation, resources, or where to find information + - How to use project APIs, features, or tools + - Development environment setup or tooling + +CRITICAL: IGNORE IF NOT RELEVANT (return needs_devrel: false) for: +- General greetings, small talk, or casual conversation ("Hey!", "Good morning", "How's everyone?") +- Thank you messages or acknowledgments without follow-up questions ("Thanks!", "Got it", "Appreciate it") +- Statements or updates without asking for help ("I'm working on X", "I installed Y", "Setup is done") +- Conversations between other users where the bot is not mentioned or needed +- Off-topic discussions unrelated to this specific project or repository +- Vague questions without THIS PROJECT'S context ("How do I code?", "What's Python?", "How do I learn programming?") + * KEY: "How do I learn Python?" (general) → false + * BUT: "How do I learn to setup this bot?" (project-specific) → true +- Developer discussions that don't explicitly request assistance +- Reactions, emojis, or single-word responses +- Questions already being answered by other community members (unless bot is specifically asked) + +DECISION CRITERIA: +- If unsure → return false (err on the side of NOT responding) +- Statements without clear questions → return false +- Questions not related to THIS PROJECT → return false +- Bot tagged but off-topic → return true with priority "low" (so bot can acknowledge and redirect) +- Bot tagged with project question → return true with priority "high" Respond ONLY with JSON: {{ @@ -19,8 +45,52 @@ "reasoning": "brief explanation" }} -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"}} -""" +EXAMPLES: + + SHOULD RESPOND (needs_devrel: true): +- "How do I set up the development environment?" + → {{"needs_devrel": true, "priority": "high", "reasoning": "Direct setup question"}} + +- "@devr what's the contribution process?" + → {{"needs_devrel": true, "priority": "high", "reasoning": "Bot tagged with project-specific question"}} + +- "@devr what's for lunch?" + → {{"needs_devrel": true, "priority": "low", "reasoning": "Bot tagged but off-topic, should acknowledge politely"}} + +- "Where can I find the API documentation?" + → {{"needs_devrel": true, "priority": "medium", "reasoning": "Documentation question"}} + +- "I'm getting a 'module not found' error when running npm install. How do I fix this?" + → {{"needs_devrel": true, "priority": "high", "reasoning": "Technical issue with clear question"}} + +- "Can someone explain how the authentication flow works in this repo?" + → {{"needs_devrel": true, "priority": "medium", "reasoning": "Project-specific technical question"}} + + SHOULD IGNORE (needs_devrel: false): +- "Hey everyone, good morning!" + → {{"needs_devrel": false, "priority": "low", "reasoning": "General greeting, not project-related"}} + +- "What's for lunch?" + → {{"needs_devrel": false, "priority": "low", "reasoning": "Off-topic, not development related"}} + +- "Thanks for the help!" + → {{"needs_devrel": false, "priority": "low", "reasoning": "Acknowledgment without question"}} + +- "I'm setting up the project right now" + → {{"needs_devrel": false, "priority": "low", "reasoning": "Statement without asking for help"}} + +- "The API is throwing errors" + → {{"needs_devrel": false, "priority": "low", "reasoning": "Statement, not a question - user didn't ask for help"}} + +- "How do I learn Python?" + → {{"needs_devrel": false, "priority": "low", "reasoning": "General programming question, not project-specific"}} + +- "User1: How do I contribute? User2: Check the CONTRIBUTING.md file" + → {{"needs_devrel": false, "priority": "low", "reasoning": "Question being answered by community, bot not needed"}} + +- "lol that's funny" + → {{"needs_devrel": false, "priority": "low", "reasoning": "Casual chat, not a question"}} + +- "👍" + → {{"needs_devrel": false, "priority": "low", "reasoning": "Reaction emoji, no content"}} +""" \ No newline at end of file diff --git a/backend/app/database/falkor/code-graph-backend/api/index.py b/backend/app/database/falkor/code-graph-backend/api/index.py index 0a87dd5e..6c094932 100644 --- a/backend/app/database/falkor/code-graph-backend/api/index.py +++ b/backend/app/database/falkor/code-graph-backend/api/index.py @@ -38,7 +38,6 @@ def decorated_function(*args, **kwargs): return f(*args, **kwargs) return decorated_function - app = Flask(__name__) def public_access(f): diff --git a/backend/main.py b/backend/main.py index b7ad80a6..72f24a66 100644 --- a/backend/main.py +++ b/backend/main.py @@ -14,6 +14,7 @@ from app.database.weaviate.client import get_weaviate_client from integrations.discord.bot import DiscordBot from discord.ext import commands + # DevRel commands are now loaded dynamically (commented out below) # from integrations.discord.cogs import DevRelCommands @@ -45,11 +46,11 @@ async def start_background_tasks(self): await self.queue_manager.start(num_workers=3) - # --- Load commands inside the async startup function --- + # --- Load commands inside the async startup function --- try: await self.discord_bot.load_extension("integrations.discord.cogs") except (ImportError, commands.ExtensionError) as e: - logger.error("Failed to load Discord cog extension: %s", e) + logger.exception("Failed to load Discord cog extension") # Start the bot as a background task. asyncio.create_task( diff --git a/poetry.lock b/poetry.lock index 7d46dd61..eb65614a 100644 --- a/poetry.lock +++ b/poetry.lock @@ -1396,6 +1396,8 @@ files = [ {file = "greenlet-3.2.4-cp310-cp310-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:c2ca18a03a8cfb5b25bc1cbe20f3d9a4c80d8c3b13ba3df49ac3961af0b1018d"}, {file = "greenlet-3.2.4-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:9fe0a28a7b952a21e2c062cd5756d34354117796c6d9215a87f55e38d15402c5"}, {file = "greenlet-3.2.4-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:8854167e06950ca75b898b104b63cc646573aa5fef1353d4508ecdd1ee76254f"}, + {file = "greenlet-3.2.4-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:f47617f698838ba98f4ff4189aef02e7343952df3a615f847bb575c3feb177a7"}, + {file = "greenlet-3.2.4-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:af41be48a4f60429d5cad9d22175217805098a9ef7c40bfef44f7669fb9d74d8"}, {file = "greenlet-3.2.4-cp310-cp310-win_amd64.whl", hash = "sha256:73f49b5368b5359d04e18d15828eecc1806033db5233397748f4ca813ff1056c"}, {file = "greenlet-3.2.4-cp311-cp311-macosx_11_0_universal2.whl", hash = "sha256:96378df1de302bc38e99c3a9aa311967b7dc80ced1dcc6f171e99842987882a2"}, {file = "greenlet-3.2.4-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:1ee8fae0519a337f2329cb78bd7a8e128ec0f881073d43f023c7b8d4831d5246"}, @@ -1405,6 +1407,8 @@ files = [ {file = "greenlet-3.2.4-cp311-cp311-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:2523e5246274f54fdadbce8494458a2ebdcdbc7b802318466ac5606d3cded1f8"}, {file = "greenlet-3.2.4-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:1987de92fec508535687fb807a5cea1560f6196285a4cde35c100b8cd632cc52"}, {file = "greenlet-3.2.4-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:55e9c5affaa6775e2c6b67659f3a71684de4c549b3dd9afca3bc773533d284fa"}, + {file = "greenlet-3.2.4-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:c9c6de1940a7d828635fbd254d69db79e54619f165ee7ce32fda763a9cb6a58c"}, + {file = "greenlet-3.2.4-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:03c5136e7be905045160b1b9fdca93dd6727b180feeafda6818e6496434ed8c5"}, {file = "greenlet-3.2.4-cp311-cp311-win_amd64.whl", hash = "sha256:9c40adce87eaa9ddb593ccb0fa6a07caf34015a29bf8d344811665b573138db9"}, {file = "greenlet-3.2.4-cp312-cp312-macosx_11_0_universal2.whl", hash = "sha256:3b67ca49f54cede0186854a008109d6ee71f66bd57bb36abd6d0a0267b540cdd"}, {file = "greenlet-3.2.4-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:ddf9164e7a5b08e9d22511526865780a576f19ddd00d62f8a665949327fde8bb"}, @@ -1414,6 +1418,8 @@ files = [ {file = "greenlet-3.2.4-cp312-cp312-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:3b3812d8d0c9579967815af437d96623f45c0f2ae5f04e366de62a12d83a8fb0"}, {file = "greenlet-3.2.4-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:abbf57b5a870d30c4675928c37278493044d7c14378350b3aa5d484fa65575f0"}, {file = "greenlet-3.2.4-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:20fb936b4652b6e307b8f347665e2c615540d4b42b3b4c8a321d8286da7e520f"}, + {file = "greenlet-3.2.4-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:ee7a6ec486883397d70eec05059353b8e83eca9168b9f3f9a361971e77e0bcd0"}, + {file = "greenlet-3.2.4-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:326d234cbf337c9c3def0676412eb7040a35a768efc92504b947b3e9cfc7543d"}, {file = "greenlet-3.2.4-cp312-cp312-win_amd64.whl", hash = "sha256:a7d4e128405eea3814a12cc2605e0e6aedb4035bf32697f72deca74de4105e02"}, {file = "greenlet-3.2.4-cp313-cp313-macosx_11_0_universal2.whl", hash = "sha256:1a921e542453fe531144e91e1feedf12e07351b1cf6c9e8a3325ea600a715a31"}, {file = "greenlet-3.2.4-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:cd3c8e693bff0fff6ba55f140bf390fa92c994083f838fece0f63be121334945"}, @@ -1423,6 +1429,8 @@ files = [ {file = "greenlet-3.2.4-cp313-cp313-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:23768528f2911bcd7e475210822ffb5254ed10d71f4028387e5a99b4c6699671"}, {file = "greenlet-3.2.4-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:00fadb3fedccc447f517ee0d3fd8fe49eae949e1cd0f6a611818f4f6fb7dc83b"}, {file = "greenlet-3.2.4-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:d25c5091190f2dc0eaa3f950252122edbbadbb682aa7b1ef2f8af0f8c0afefae"}, + {file = "greenlet-3.2.4-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:6e343822feb58ac4d0a1211bd9399de2b3a04963ddeec21530fc426cc121f19b"}, + {file = "greenlet-3.2.4-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:ca7f6f1f2649b89ce02f6f229d7c19f680a6238af656f61e0115b24857917929"}, {file = "greenlet-3.2.4-cp313-cp313-win_amd64.whl", hash = "sha256:554b03b6e73aaabec3745364d6239e9e012d64c68ccd0b8430c64ccc14939a8b"}, {file = "greenlet-3.2.4-cp314-cp314-macosx_11_0_universal2.whl", hash = "sha256:49a30d5fda2507ae77be16479bdb62a660fa51b1eb4928b524975b3bde77b3c0"}, {file = "greenlet-3.2.4-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:299fd615cd8fc86267b47597123e3f43ad79c9d8a22bebdce535e53550763e2f"}, @@ -1430,6 +1438,8 @@ files = [ {file = "greenlet-3.2.4-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:b4a1870c51720687af7fa3e7cda6d08d801dae660f75a76f3845b642b4da6ee1"}, {file = "greenlet-3.2.4-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:061dc4cf2c34852b052a8620d40f36324554bc192be474b9e9770e8c042fd735"}, {file = "greenlet-3.2.4-cp314-cp314-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:44358b9bf66c8576a9f57a590d5f5d6e72fa4228b763d0e43fee6d3b06d3a337"}, + {file = "greenlet-3.2.4-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:2917bdf657f5859fbf3386b12d68ede4cf1f04c90c3a6bc1f013dd68a22e2269"}, + {file = "greenlet-3.2.4-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:015d48959d4add5d6c9f6c5210ee3803a830dce46356e3bc326d6776bde54681"}, {file = "greenlet-3.2.4-cp314-cp314-win_amd64.whl", hash = "sha256:e37ab26028f12dbb0ff65f29a8d3d44a765c61e729647bf2ddfbbed621726f01"}, {file = "greenlet-3.2.4-cp39-cp39-macosx_11_0_universal2.whl", hash = "sha256:b6a7c19cf0d2742d0809a4c05975db036fdff50cd294a93632d6a310bf9ac02c"}, {file = "greenlet-3.2.4-cp39-cp39-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:27890167f55d2387576d1f41d9487ef171849ea0359ce1510ca6e06c8bece11d"}, @@ -1439,6 +1449,8 @@ files = [ {file = "greenlet-3.2.4-cp39-cp39-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:c9913f1a30e4526f432991f89ae263459b1c64d1608c0d22a5c79c287b3c70df"}, {file = "greenlet-3.2.4-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:b90654e092f928f110e0007f572007c9727b5265f7632c2fa7415b4689351594"}, {file = "greenlet-3.2.4-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:81701fd84f26330f0d5f4944d4e92e61afe6319dcd9775e39396e39d7c3e5f98"}, + {file = "greenlet-3.2.4-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:28a3c6b7cd72a96f61b0e4b2a36f681025b60ae4779cc73c1535eb5f29560b10"}, + {file = "greenlet-3.2.4-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:52206cd642670b0b320a1fd1cbfd95bca0e043179c1d8a045f2c6109dfe973be"}, {file = "greenlet-3.2.4-cp39-cp39-win32.whl", hash = "sha256:65458b409c1ed459ea899e939f0e1cdb14f58dbc803f2f93c5eab5694d32671b"}, {file = "greenlet-3.2.4-cp39-cp39-win_amd64.whl", hash = "sha256:d2e685ade4dafd447ede19c31277a224a239a0a1a4eca4e6390efedf20260cfb"}, {file = "greenlet-3.2.4.tar.gz", hash = "sha256:0dca0d95ff849f9a364385f36ab49f50065d76964944638be9691e1832e9f86d"}, @@ -6527,4 +6539,4 @@ cffi = ["cffi (>=1.11)"] [metadata] lock-version = "2.1" python-versions = ">=3.10,<3.14" -content-hash = "d1f57ec66dbe816e607f52b1adcde2a92d44e901ec1c70b6faa80b2d1ca39282" +content-hash = "f976e87b88500e160566071de378ac25715cc2b462d50e1f08e26c0cb6a5b063" diff --git a/pyproject.toml b/pyproject.toml index 3d225571..fc4e9805 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -26,7 +26,7 @@ dependencies = [ "uvicorn (>=0.38.0,<0.39.0)", "ddgs (>=9.0.2,<10.0.0)", "fastmcp>=2.11.3,<3.0.0", - "discord-py (>=2.4.0,<2.5.0)", + "discord-py (==2.4.0)", "graphrag-sdk (>=0.8.1,<0.9.0)", "tree-sitter (>=0.25.2,<0.26.0)", "validators (>=0.35.0,<0.36.0)",