diff --git a/swarms/agents/.sourcery.yaml b/swarms/agents/.sourcery.yaml new file mode 100644 index 00000000..e229d597 --- /dev/null +++ b/swarms/agents/.sourcery.yaml @@ -0,0 +1,74 @@ +# 🪄 This is your project's Sourcery configuration file. + +# You can use it to get Sourcery working in the way you want, such as +# ignoring specific refactorings, skipping directories in your project, +# or writing custom rules. + +# 📚 For a complete reference to this file, see the documentation at +# https://docs.sourcery.ai/Configuration/Project-Settings/ + +# This file was auto-generated by Sourcery on 2023-10-06 at 17:14. + +version: '1' # The schema version of this config file + +ignore: # A list of paths or files which Sourcery will ignore. +- .git +- venv +- .venv +- env +- .env +- .tox +- node_modules +- vendor + +rule_settings: + enable: + - default + disable: [] # A list of rule IDs Sourcery will never suggest. + rule_types: + - refactoring + - suggestion + - comment + python_version: '3.9' # A string specifying the lowest Python version your project supports. Sourcery will not suggest refactorings requiring a higher Python version. + +# rules: # A list of custom rules Sourcery will include in its analysis. +# - id: no-print-statements +# description: Do not use print statements in the test directory. +# pattern: print(...) +# language: python +# replacement: +# condition: +# explanation: +# paths: +# include: +# - test +# exclude: +# - conftest.py +# tests: [] +# tags: [] + +# rule_tags: {} # Additional rule tags. + +# metrics: +# quality_threshold: 25.0 + +# github: +# labels: [] +# ignore_labels: +# - sourcery-ignore +# request_review: author +# sourcery_branch: sourcery/{base_branch} + +# clone_detection: +# min_lines: 3 +# min_duplicates: 2 +# identical_clones_only: false + +# proxy: +# url: +# ssl_certs_file: +# no_ssl_verify: false + +# coding_assistant: +# project_description: '' +# enabled: diff --git a/swarms/agents/discordwithweb.py b/swarms/agents/discordwithweb.py new file mode 100644 index 00000000..cb113598 --- /dev/null +++ b/swarms/agents/discordwithweb.py @@ -0,0 +1,112 @@ +import discord +from discord.ext import commands + +import os +import openai +import requests + +from swarms.agents import Agent +from swarms.agents.memory import VectorStoreRetriever +from swarms.tools.base import BaseTool + +""" +Custom tools for web search and memory retrieval. + +This code snippet defines two custom tools, `WebSearchTool` and `MemoryTool`, which are subclasses of the `BaseTool` class. The `WebSearchTool` makes a request to a search engine API and extracts the text from the top result. The `MemoryTool` retrieves relevant documents from a vector store and extracts the text from the document. + +Example Usage: +```python +web_search = WebSearchTool() +result = web_search.run("python programming") +print(result) +# Output: The text from the top search result for "python programming" + +memory_tool = MemoryTool(retriever) +result = memory_tool.run("python programming") +print(result) +# Output: The text from the relevant document retrieved from the vector store for "python programming" +``` + +Inputs: +- `query` (str): The search query or document retrieval query. + +Flow: +1. The `WebSearchTool` makes a request to the Bing search engine API with the provided query. +2. The API response is stored in the `response` variable. +3. The text from the top search result is extracted from the API response and stored in the `text` variable. +4. The `MemoryTool` retrieves relevant documents from the vector store using the provided query. +5. The relevant document is stored in the `relevant_doc` variable. +6. The text from the relevant document is extracted and stored in the `text` variable. + +Outputs: +- `text` (str): The extracted text from the top search result or relevant document. +""" + +# Custom tools +class WebSearchTool(BaseTool): + + def run(self, query: str) -> str: + + # Make request to search engine API + response = requests.get( + "https://api.bing.com/v7.0/search", + params={ + "q": query, + "count": 1 + }, + headers={ + "Ocp-Apim-Subscription-Key": "YOUR_API_KEY" + } + ) + + # Extract text from top result + top_result = response.json()["webPages"]["value"][0] + return top_result["snippet"] + + +class MemoryTool(BaseTool): + + def __init__(self, retriever): + self.retriever = retriever + + def run(self, query: str) -> str: + + # Retrieve relevant document from vectorstore + docs = self.retriever.retrieve(query) + relevant_doc = docs[0] + + # Extract text from document + text = relevant_doc.text + + return text + +# Discord bot setup +intents = discord.Intents.default() +bot = commands.Bot(command_prefix='!', intents=intents) + +# OpenAI API setup +openai.api_key = os.getenv("OPENAI_API_KEY") + +# Memory setup +vectorstore_client = VectorStoreClient() +retriever = VectorStoreRetriever(vectorstore_client) + +# Tools setup +web_search = WebSearchTool() +memory = MemoryTool(retriever) +tools = [web_search, memory] + +# Create the agent +agent = Agent( + name="DiscordAssistant", + llm=openai, + memory=retriever, + tools=tools +) + +@bot.command() +async def query(ctx, *, input): + response = agent.run(input) + await ctx.send(response) + +bot.run(os.getenv("DISCORD_BOT_TOKEN"))