From 3e40692ec12c86e3d634b47a8e0c84999957d36c Mon Sep 17 00:00:00 2001 From: Clifford Attractor Date: Thu, 27 Jun 2024 21:50:15 +0100 Subject: [PATCH 01/28] Remove old README file --- .../moragents_dockers/agents/src/README-UI.md | 65 ------------------- 1 file changed, 65 deletions(-) delete mode 100644 submodules/moragents_dockers/agents/src/README-UI.md diff --git a/submodules/moragents_dockers/agents/src/README-UI.md b/submodules/moragents_dockers/agents/src/README-UI.md deleted file mode 100644 index eef241b..0000000 --- a/submodules/moragents_dockers/agents/src/README-UI.md +++ /dev/null @@ -1,65 +0,0 @@ -#Documentation for building a UI with our swap agent - -First you need to build the image - -```docker build -t agent .``` - -Then Run the image by exposing port 5000 - -```docker run --name agent -p 5000:5000 agent``` - - -And then once it is running we will have 2 endpoints - -first endpoint is for chat -### chat endpoint = 'http://127.0.0.1:5000/' - -* The chat api accepts inputs in openai chat compelition format and - we need to send the messages as a list - - ```messages = {"role":"user","content":"what is the price of bitcoin?"}``` - -### Usage - - ```sh - url = 'http://127.0.0.1:5000/ - message={"role":"user","content":"what is the price of bitcoin?"} - data = {'prompt':message} - response = requests.post(url, json=data) - ``` - -* The response will also be in this format - ```sh - response = {"role":"assistant","content":"The price of bitcoin is 62,000$"} - ``` - -* Then you can continue the conversation - - - ### Messages endpoint = 'http://127.0.0.1:5000/messages' - Since now the conversation is history is stored in the backend you can retrieve it using this api - # Usage - - - ```sh - url = 'http://127.0.0.1:5000/messages' - response = requests.get(url) - - result=response.text - ``` - - This will return a message to be displayed on the ui - - ```sh - - {"messages":[{"content":"what is the price of bitcoin?","role":"user"},{"content":"The price of itcoin is 62,000$","role":"assistant"} - - ``` - - Then we can get the conversation history by using the message key result["messages"] - - - - - - From 6252c339e24c3f6581a9603fc438fee8974821d2 Mon Sep 17 00:00:00 2001 From: Clifford Attractor Date: Sat, 3 Aug 2024 01:19:19 +0100 Subject: [PATCH 02/28] Delegator agent v1.0 --- submodules/moragents_dockers/README.md | 169 +++++++- .../moragents_dockers/agents/Dockerfile | 1 + .../moragents_dockers/agents/requirements.txt | 22 +- .../moragents_dockers/agents/src/app.py | 136 ++++-- .../moragents_dockers/agents/src/config.py | 54 +-- .../agents/src/data_agent/src/agent.py | 128 +++--- .../agents/src/data_agent/src/tools.py | 3 +- .../moragents_dockers/agents/src/delegator.py | 79 ++++ .../agents/src/rag_agent/src/agent.py | 91 ++++ .../agents/src/rag_agent/src/config.py | 9 + .../agents/src/swap_agent/src/agent.py | 391 +++++++++--------- .../agents/src/swap_agent/src/config.py | 1 + .../agents/src/swap_agent/src/tools.py | 2 +- .../frontend/components/Chat/index.tsx | 1 + .../components/HeaderBar/agentSelector.tsx | 130 ------ .../frontend/components/HeaderBar/index.tsx | 27 +- .../moragents_dockers/frontend/config.ts | 24 +- .../frontend/pages/index.tsx | 4 +- 18 files changed, 746 insertions(+), 526 deletions(-) create mode 100644 submodules/moragents_dockers/agents/src/delegator.py create mode 100644 submodules/moragents_dockers/agents/src/rag_agent/src/agent.py create mode 100644 submodules/moragents_dockers/agents/src/rag_agent/src/config.py delete mode 100644 submodules/moragents_dockers/frontend/components/HeaderBar/agentSelector.tsx diff --git a/submodules/moragents_dockers/README.md b/submodules/moragents_dockers/README.md index 7d8f158..f4ff09f 100644 --- a/submodules/moragents_dockers/README.md +++ b/submodules/moragents_dockers/README.md @@ -1,9 +1,22 @@ # Moragents -This repo contains multiple agents and a dapp that enables you to interact with the agents, all running locally and containerized with Docker. +## Overview +This project is a Flask-based AI chat application featuring intelligent responses from various language models and embeddings. It includes file uploading, cryptocurrency swapping, and a delegator system to manage multiple agents. The application, along with a dApp for agent interaction, runs locally and is containerized with Docker. -## Usage +## Pre-requisites + + +* [Download Ollama](https://ollama.com/ )for your operating system +* Then after finishing installation pull these two models: + +```ollama pull llama3``` + +```ollama pull nomic-embed-text``` + + +## Run with Docker Compose + Docker compose will build and run two containers. One will be for the agents, the other will be for the UI. ```docker-compose up``` @@ -17,6 +30,7 @@ Open in the browser: ```http://localhost:3333/``` Docker build will download the model. The first time that one of the agents are called, the model will be loaded into memory and this instance will be shared between all agents. ## Agents +Three agents are included: ### Data Agent @@ -41,9 +55,158 @@ A typical flow looks like this: - The agent requests any missing information, e.g. in this case the amount is missing - Once all the information hase been collected, the agent looks up the assets on the current chain, retrieves contract addresses and generates a quote if available. - The quote is shown to the user, who may either proceed or cancel -- If the user accepts the quote, the swap may proceed. The back-end will generate transactions which will be sent to the front-end to be signed by the user's wallet. +- If the user accepts the quote, the swap may proceed. The back-end will generate transactions which will be sent to the front-end to be signed by the user's wallet. - If the allowance for the token being sold is too low, an approval transaction will be generated first +## RAG Agent +This agent will answer questions about an uploaded PDF file. + + +# Delegator +The Delegator handles user queries by analyzing the prompt and delegating it to the appropriate agent. + +## API Endpoints + +1. **Chat Functionality** + - Endpoint: `POST /` + - Handles chat interactions, delegating to appropriate agents when necessary. + +2. **Message History** + - Endpoint: `GET /messages` + - Retrieves chat message history. + +3. **Clear Messages** + - Endpoint: `GET /clear_messages` + - Clears the chat message history. + +4. **Swap Operations** + - Endpoints: + - `POST /tx_status`: Check transaction status + - `POST /allowance`: Get allowance + - `POST /approve`: Approve transaction + - `POST /swap`: Perform swap + +5. **File Upload** + - Endpoint: `POST /upload` + - Handles file uploads for RAG (Retrieval-Augmented Generation) purposes. + + + +# Adding a New Agent + +## Overview + +Each agent is configured in the `config.py` file, which specifies the agent's path, class, and other details. + +## Steps to Add a New Agent + +### 1. Create a New Agent Folder + +1. **Create a new folder** in the `agents/src` directory for your new agent. +2. **Implement the agent logic** within this folder. Ensure that the agent class is defined and ready to handle the specific type of queries it is designed for. + +### 2. Update `config.py` + +1. **Open the `config.py` file** located in the `agents/src` directory. +2. **Add a new entry** in the `DELEGATOR_CONFIG` dictionary with the following details: + - `path`: The path to the agent's module. + - `class`: The class name of the agent. + - `detail`: A description of when to use this agent. + - `name`: A unique name for the agent. + - `upload`: A boolean indicating if the agent requires a file to be uploaded from the front-end before it should be called. + +#### Example: +```python:agents/src/config.py +DELEGATOR_CONFIG = { + "agents": [ + # ... existing agents ... + { + "path": "new_agent.src.agent", + "class": "NewAgent", + "description": "if the prompt is related to new functionality, choose new agent", + "name": "new agent", + "upload": false + } + ] +} +``` + + +### 3. Implement Agent Logic + +1. **Define the agent class** in the specified path. +2. **Ensure the agent can handle the queries** it is designed for. + +#### Example: +```python:agents/src/new_agent/src/agent.py +class NewAgent: + def __init__(self, agent_info, llm, llm_ollama, embeddings, flask_app): + """ + Initialize the NewAgent. + + Parameters: + - agent_info (dict): Configuration details for the agent. + - llm (object): The main language model instance. + - llm_ollama (object): An additional language model instance from Ollama. + - embeddings (object): Embedding model for handling vector representations. + - flask_app (Flask): The Flask application instance. + """ + self.agent_info = agent_info + self.llm = llm + self.llm_ollama = llm_ollama + self.embeddings = embeddings + self.flask_app = flask_app + + def chat(self, request): + # Implement chat logic + pass + + # Add other methods as needed +``` +### 4. Handle Multi-Turn Conversations + +Agents can handle multi-turn conversations by returning a next_turn_agent which indicates the name of the agent that should handle the next turn. + +#### Example: +```python +class NewAgent: + def __init__(self, agent_info, llm, llm_ollama, embeddings, flask_app): + """ + Initialize the NewAgent. + + Parameters: + - agent_info (dict): Configuration details for the agent. + - llm (object): The main language model instance. + - llm_ollama (object): An additional language model instance. + - embeddings (object): Embedding model for handling vector representations. + - flask_app (Flask): The Flask application instance. + """ + self.agent_info = agent_info + self.llm = llm + self.llm_ollama = llm_ollama + self.embeddings = embeddings + self.flask_app = flask_app + def chat(self, request, user_id): + # Process the query and determine the next agent + next_turn_agent = self.agent_info["name"] + + # Generate response where we want to initiate a multi-turn conversation with the same agent. + + return response, next_turn_agent + +``` + +### 5. Integration + +The `Delegator` will automatically: +- Import the agent module. +- Instantiate the agent class. +- Add the agent to its internal dictionary. + +### 6. Test the New Agent + +1. **Ensure the `Delegator` can properly route requests** to the new agent. +2. **Test the agent's functionality** through the chat interface. diff --git a/submodules/moragents_dockers/agents/Dockerfile b/submodules/moragents_dockers/agents/Dockerfile index adf0198..7147d21 100644 --- a/submodules/moragents_dockers/agents/Dockerfile +++ b/submodules/moragents_dockers/agents/Dockerfile @@ -28,5 +28,6 @@ EXPOSE 5000 # Set the environment variable for Flask ENV FLASK_APP=src/app.py + # Run the application CMD ["flask", "run", "--host", "0.0.0.0"] \ No newline at end of file diff --git a/submodules/moragents_dockers/agents/requirements.txt b/submodules/moragents_dockers/agents/requirements.txt index 08ee92b..c3838ef 100644 --- a/submodules/moragents_dockers/agents/requirements.txt +++ b/submodules/moragents_dockers/agents/requirements.txt @@ -1,11 +1,15 @@ -llama-cpp-python -transformers -sentencepiece -protobuf -scikit-learn -huggingface-hub +llama-cpp-python==0.2.65 +transformers==4.43.3 +sentencepiece==0.2.0 +protobuf==5.27.2 +scikit-learn==1.5.1 +huggingface-hub==0.24.3 flask==2.2.2 Werkzeug==2.2.2 -gradio > /dev/null -flask-cors -web3 \ No newline at end of file +flask-cors==4.0.1 +web3==6.20.1 +pymupdf==1.22.5 +faiss-cpu==1.8.0.post1 +langchain-text-splitters==0.2.2 +langchain-core==0.2.24 +langchain-community==0.2.10 \ No newline at end of file diff --git a/submodules/moragents_dockers/agents/src/app.py b/submodules/moragents_dockers/agents/src/app.py index 26ddb8e..07f0d18 100644 --- a/submodules/moragents_dockers/agents/src/app.py +++ b/submodules/moragents_dockers/agents/src/app.py @@ -1,10 +1,14 @@ -from flask_cors import CORS -from flask import Flask, request, jsonify +import json +import os +import logging from config import Config -from swap_agent.src import agent as swap_agent -from data_agent.src import agent as data_agent from llama_cpp import Llama +from flask_cors import CORS +from flask import Flask, request, jsonify +from langchain_community.llms import Ollama +from delegator import Delegator from llama_cpp.llama_tokenizer import LlamaHFTokenizer +from langchain_community.embeddings import OllamaEmbeddings def load_llm(): @@ -19,54 +23,104 @@ def load_llm(): return llm -llm=load_llm() +llm = load_llm() app = Flask(__name__) CORS(app) -@app.route('/swap_agent/', methods=['POST']) -def swap_agent_chat(): - global llm - return swap_agent.chat(request, llm) +upload_state = False +UPLOAD_FOLDER = os.path.join(os.getcwd(), 'uploads') +os.makedirs(UPLOAD_FOLDER, exist_ok=True) +app.config['UPLOAD_FOLDER'] = UPLOAD_FOLDER +app.config['MAX_CONTENT_LENGTH'] = Config.MAX_UPLOAD_LENGTH + +llm_ollama = Ollama(model="llama3", base_url=Config.OLLAMA_URL) +embeddings = OllamaEmbeddings(model="nomic-embed-text", base_url=Config.OLLAMA_URL) + +logging.basicConfig(level=logging.DEBUG) + +delegator = Delegator(Config.DELEGATOR_CONFIG, llm, llm_ollama, embeddings, app) +messages = [{'role': "assistant", "content": "This highly experimental chatbot is not intended for making important decisions, and its responses are generated based on incomplete data and algorithms that may evolve rapidly. By using this chatbot, you acknowledge that you use it at your own discretion and assume all risks associated with its limitations and potential errors."}] + +next_turn_agent = None + + +@app.route('/', methods=['POST']) +def chat(): + global next_turn_agent, messages + data = request.get_json() + try: + if 'prompt' in data: + prompt = data['prompt'] + messages.append(prompt) + if not next_turn_agent: + result = delegator.get_delegator_response(prompt, upload_state) + if "tool_calls" not in result: + messages.append({"role": "assistant", "content": result["content"]}) + return jsonify({"role": "assistant", "content": result["content"]}) + else: + if not result["tool_calls"]: + messages.append({"role": "assistant", "content": result["content"]}) + return jsonify({"role": "assistant", "content": result["content"]}) + res = json.loads(result['tool_calls'][0]['function']['arguments']) + response_swap = delegator.delegate_chat(res["next"], request) + if "next_turn_agent" in response_swap.keys(): + next_turn_agent = response_swap["next_turn_agent"] + response = {"role": response_swap["role"], "content": response_swap["content"]} + else: + response_swap = delegator.delegate_chat(next_turn_agent, request) + next_turn_agent = response_swap["next_turn_agent"] + response = {"role": response_swap["role"], "content": response_swap["content"]} + messages.append(response) + return jsonify(response) + except Exception as e: + return jsonify({"Error": str(e)}), 500 -@app.route('/swap_agent/tx_status', methods=['POST']) + +@app.route('/tx_status', methods=['POST']) def swap_agent_tx_status(): - return swap_agent.tx_status(request) - -@app.route('/swap_agent/messages', methods=['GET']) -def swap_agent_messages(): - return swap_agent.get_messages() - -@app.route('/swap_agent/clear_messages', methods=['GET']) -def swap_agent_clear_messages(): - return swap_agent.clear_messages() - -@app.route('/swap_agent/allowance', methods=['POST']) + global messages + response = delegator.delegate_route("crypto swap agent", request, "tx_status") + messages.append(response) + return jsonify(response) + + +@app.route('/messages', methods=['GET']) +def get_messages(): + global messages + return jsonify({"messages": messages}) + + +@app.route('/clear_messages', methods=['GET']) +def clear_messages(): + global messages + messages = [{'role': "assistant", "content": "This highly experimental chatbot is not intended for making important decisions, and its responses are generated based on incomplete data and algorithms that may evolve rapidly. By using this chatbot, you acknowledge that you use it at your own discretion and assume all risks associated with its limitations and potential errors."}] + return jsonify({"response": "successfully cleared message history"}) + + +@app.route('/allowance', methods=['POST']) def swap_agent_allowance(): - return swap_agent.get_allowance(request) - -@app.route('/swap_agent/approve', methods=['POST']) + return delegator.delegate_route("crypto swap agent", request, "get_allowance") + + +@app.route('/approve', methods=['POST']) def swap_agent_approve(): - return swap_agent.approve(request) - -@app.route('/swap_agent/swap', methods=['POST']) -def swap_agent_swap(): - return swap_agent.swap(request) + return delegator.delegate_route("crypto swap agent", request, "approve") + -@app.route('/data_agent/', methods=['POST']) -def data_agent_chat(): - global llm - return data_agent.chat(request, llm) +@app.route('/swap', methods=['POST']) +def swap_agent_swap(): + return delegator.delegate_route("crypto swap agent", request, "swap") -@app.route('/data_agent/messages', methods=['GET']) -def data_agent_messages(): - return data_agent.get_messages() +@app.route('/upload', methods=['POST']) +def rag_agent_upload(): + global messages, upload_state + response = delegator.delegate_route("rag agent", request, "upload_file") + messages.append(response) + upload_state = True + return jsonify(response) -@app.route('/data_agent/clear_messages', methods=['GET']) -def data_agent_clear_messages(): - return data_agent.clear_messages() - if __name__ == '__main__': - app.run(host='0.0.0.0', port=5000, debug=True) \ No newline at end of file + app.run(host='0.0.0.0', port=5000, debug=True) diff --git a/submodules/moragents_dockers/agents/src/config.py b/submodules/moragents_dockers/agents/src/config.py index 067d58d..cc7f1db 100644 --- a/submodules/moragents_dockers/agents/src/config.py +++ b/submodules/moragents_dockers/agents/src/config.py @@ -10,29 +10,31 @@ class Config: MODEL_REVISION = "functionary-small-v2.4.Q4_0.gguf" MODEL_PATH = "model/"+MODEL_REVISION DOWNLOAD_DIR = "model" - # Data agent - COINGECKO_BASE_URL = "https://api.coingecko.com/api/v3" - DEFILLAMA_BASE_URL = "https://api.llama.fi" - PRICE_SUCCESS_MESSAGE = "The price of {coin_name} is ${price:,}" - PRICE_FAILURE_MESSAGE = "Failed to retrieve price. Please enter a valid coin name." - FLOOR_PRICE_SUCCESS_MESSAGE = "The floor price of {nft_name} is ${floor_price:,}" - FLOOR_PRICE_FAILURE_MESSAGE = "Failed to retrieve floor price. Please enter a valid NFT name." - TVL_SUCCESS_MESSAGE = "The TVL of {protocol_name} is ${tvl:,}" - TVL_FAILURE_MESSAGE = "Failed to retrieve TVL. Please enter a valid protocol name." - FDV_SUCCESS_MESSAGE = "The fully diluted valuation of {coin_name} is ${fdv:,}" - FDV_FAILURE_MESSAGE = "Failed to retrieve FDV. Please enter a valid coin name." - MARKET_CAP_SUCCESS_MESSAGE = "The market cap of {coin_name} is ${market_cap:,}" - MARKET_CAP_FAILURE_MESSAGE = "Failed to retrieve market cap. Please enter a valid coin name." - API_ERROR_MESSAGE = "I can't seem to access the API at the moment." - # Swap agent - INCH_URL = "https://api.1inch.dev/token" - QUOTE_URL = "https://api.1inch.dev/swap" - APIBASEURL = f"https://api.1inch.dev/swap/v6.0/" - HEADERS = { "Authorization": "Bearer WvQuxaMYpPvDiiOL5RHWUm7OzOd20nt4", "accept": "application/json" } - WEB3RPCURL = {"56":"https://bsc-dataseed.binance.org","42161":"https://arb1.arbitrum.io/rpc","137":"https://polygon-rpc.com","1":"https://cloudflare-eth.com","10":"https://mainnet.optimism.io","8453":"https://mainnet.base.org"} - NATIVE_TOKENS={"137":"MATIC","56":"BNB","1":"ETH","42161":"ETH","10":"ETH","8453":"ETH"} - ERC20_ABI = [ - {"constant": True, "inputs": [], "name": "decimals", "outputs": [{"name": "", "type": "uint8"}], "payable": False, "stateMutability": "view", "type": "function"}, - {"constant": True, "inputs": [{"name": "_owner", "type": "address"}], "name": "balanceOf", "outputs": [{"name": "balance", "type": "uint256"}], "payable": False, "stateMutability": "view", "type": "function"} - ] - INCH_NATIVE_TOKEN_ADDRESS = "0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE" \ No newline at end of file + OLLAMA_URL = "http://host.docker.internal:11434" + MAX_UPLOAD_LENGTH = 16 * 1024 * 1024 + DELEGATOR_CONFIG = { + "agents": [ + { + "path": "rag_agent.src.agent", + "class": "RagAgent", + "description": "If the prompt is not a greeting or does not need the other agents always call rag agent.if the prompt requires a background knowledge or context call rag agent, if the question is not related to crypto call rag agent, if the prompt is a question that needs context call rag agent", + "name": "rag agent", + "upload_required": True + }, + { + "path": "data_agent.src.agent", + "class": "DataAgent", + "description": "if the prompt is a question like (price, market cap, fdv) of crypto currencies choose crypto data agent", + "name": "crypto data agent", + "upload_required": False + }, + { + "path": "swap_agent.src.agent", + "class": "SwapAgent", + "description": "if the prompt is related with swapping crypto currencies choose crypto swap agent. like if it is swap 4 eth or swap 4 eth to usdc choose crypto swap agent and if the query is about swapping crypto currencies always choose crypto swap agent", + "name": "crypto swap agent", + "upload_required": False + } + ] + } + diff --git a/submodules/moragents_dockers/agents/src/data_agent/src/agent.py b/submodules/moragents_dockers/agents/src/data_agent/src/agent.py index acf79df..bb313ed 100644 --- a/submodules/moragents_dockers/agents/src/data_agent/src/agent.py +++ b/submodules/moragents_dockers/agents/src/data_agent/src/agent.py @@ -1,71 +1,63 @@ -from llama_cpp import Llama -from llama_cpp.llama_tokenizer import LlamaHFTokenizer -from flask import Flask, request, jsonify -from flask_cors import CORS -import requests -from data_agent.src import tools -from config import Config import json +from data_agent.src import tools - -tools_provided=tools.get_tools() -messages_ui=[] - -def get_response(message,llm): - global tools_provided - messages=[{"role": "system", "content": "Don't make assumptions about the value of the arguments for the function thy should always be supplied by the user and do not alter the value of the arguments . Don't make assumptions about what values to plug into functions. Ask for clarification if a user request is ambiguous."}] - messages.extend(message) - result = llm.create_chat_completion( - messages = messages, - tools=tools_provided, - tool_choice="auto" - ) - if "tool_calls" in result["choices"][0]["message"].keys(): - func=result["choices"][0]["message"]["tool_calls"][0]['function'] - if func["name"]=='get_price': - args=json.loads(func["arguments"]) - return tools.get_coin_price_tool(args['coin_name']),"assistant" - elif func["name"]=='get_floor_price': - args=json.loads(func["arguments"]) - return tools.get_nft_floor_price_tool(args['nft_name']),"assistant" - elif func["name"]=='get_fdv': - args=json.loads(func["arguments"]) - return tools.get_fully_diluted_valuation_tool(args['coin_name']),"assistant" - elif func["name"]=='get_tvl': - args=json.loads(func["arguments"]) - return tools.get_protocol_total_value_locked_tool(args['protocol_name']),"assistant" - elif func["name"]=='get_market_cap': - args=json.loads(func["arguments"]) - return tools.get_coin_market_cap_tool(args['coin_name']),"assistant" - return result["choices"][0]["message"]['content'],"assistant" - -def generate_response(prompt,llm): - global messages_ui - messages_ui.append(prompt) - response,role = get_response([prompt],llm) - messages_ui.append({"role":role,"content":response}) - return response,role - -def chat(request,llm): - try: - data = request.get_json() - if 'prompt' in data: - prompt = data['prompt'] - response,role = generate_response(prompt,llm) - return jsonify({"role":role,"content":response}) - else: - return jsonify({"error": "Missing required parameters"}), 400 - - except Exception as e: - return jsonify({"Error": str(e)}), 500 - - -def get_messages(): - global messages_ui - return jsonify({"messages":messages_ui}) - -def clear_messages(): - global messages_ui - messages_ui=[] - return jsonify({"response":"successfully cleared message history"}) +class DataAgent: + def __init__(self, config, llm, llm_ollama, embeddings, flask_app): + self.llm = llm + self.flask_app = flask_app + self.config = config + self.tools_provided = tools.get_tools() + + def get_response(self, message): + messages = [ + { + "role": "system", + "content": ( + "Don't make assumptions about the value of the arguments for the function " + "they should always be supplied by the user and do not alter the value of the arguments. " + "Don't make assumptions about what values to plug into functions. Ask for clarification if a user " + "request is ambiguous." + ) + } + ] + messages.extend(message) + result = self.llm.create_chat_completion( + messages=messages, + tools=self.tools_provided, + tool_choice="auto" + ) + if "tool_calls" in result["choices"][0]["message"].keys(): + func = result["choices"][0]["message"]["tool_calls"][0]['function'] + if func["name"] == 'get_price': + args = json.loads(func["arguments"]) + return tools.get_coin_price_tool(args['coin_name']), "assistant" + elif func["name"] == 'get_floor_price': + args = json.loads(func["arguments"]) + return tools.get_nft_floor_price_tool(args['nft_name']), "assistant" + elif func["name"] == 'get_fdv': + args = json.loads(func["arguments"]) + return tools.get_fully_diluted_valuation_tool(args['coin_name']), "assistant" + elif func["name"] == 'get_tvl': + args = json.loads(func["arguments"]) + return tools.get_protocol_total_value_locked_tool(args['protocol_name']), "assistant" + elif func["name"] == 'get_market_cap': + args = json.loads(func["arguments"]) + return tools.get_coin_market_cap_tool(args['coin_name']), "assistant" + return result["choices"][0]["message"]['content'], "assistant" + + def generate_response(self, prompt): + response, role = self.get_response([prompt]) + return response, role + + def chat(self, request): + try: + data = request.get_json() + if 'prompt' in data: + prompt = data['prompt'] + response, role = self.generate_response(prompt) + return {"role": role, "content": response} + else: + return {"error": "Missing required parameters"}, 400 + except Exception as e: + return {"Error": str(e)}, 500 diff --git a/submodules/moragents_dockers/agents/src/data_agent/src/tools.py b/submodules/moragents_dockers/agents/src/data_agent/src/tools.py index d3fcf77..e02839a 100644 --- a/submodules/moragents_dockers/agents/src/data_agent/src/tools.py +++ b/submodules/moragents_dockers/agents/src/data_agent/src/tools.py @@ -1,7 +1,6 @@ import requests import logging -from config import Config -import time +from data_agent.src.config import Config from sklearn.feature_extraction.text import TfidfVectorizer from sklearn.metrics.pairwise import cosine_similarity diff --git a/submodules/moragents_dockers/agents/src/delegator.py b/submodules/moragents_dockers/agents/src/delegator.py new file mode 100644 index 0000000..5cdfdae --- /dev/null +++ b/submodules/moragents_dockers/agents/src/delegator.py @@ -0,0 +1,79 @@ +import importlib + + +class Delegator: + def __init__(self, config, llm, llm_ollama, embeddings, flask_app): + self.llm = llm + self.flask_app = flask_app + self.llm_ollama = llm_ollama + self.embeddings = embeddings + self.agents = self.load_agents(config) + self.config = config + + def load_agents(self, config): + agents = {} + for agent_info in config['agents']: + module = importlib.import_module(agent_info['path']) + agent_class = getattr(module, agent_info['class']) + agent_instance = agent_class( + agent_info, self.llm, self.llm_ollama, self.embeddings, self.flask_app + ) + agents[agent_info['name']] = agent_instance + return agents + + def get_delegator_response(self, prompt, upload_state): + available_agents = [] + text = "" + for agent_info in self.config['agents']: + if agent_info["upload_required"] and not upload_state: + continue + available_agents.append(agent_info["name"]) + text += f", {agent_info['description']}" + pre = "### Instruction: Your name is Morpheus. Your primary function is to select the correct agent." + post = "###" + prompt_text = f"{pre}{text}{post}" + tools = [ + { + "type": "function", + "function": { + "name": "route", + "description": "choose which agent to run next", + "parameters": { + "type": "object", + "properties": { + "next": { + "title": "Next", + "anyOf": [ + {"enum": available_agents}, + ], + } + }, + "required": ["next"], + }, + } + } + ] + message_list = [{"role": "system", "content": prompt_text}] + [prompt] + result = self.llm.create_chat_completion( + messages=message_list, + tools=tools, + tool_choice="auto", + temperature=0.3 + ) + return result["choices"][0]["message"] + + def delegate_chat(self, agent_name, request): + agent = self.agents.get(agent_name) + if agent: + return agent.chat(request) + return {"error": "No such agent registered"} + + def delegate_route(self, agent_name, request, method_name): + agent = self.agents.get(agent_name) + if agent: + if hasattr(agent, method_name): + method = getattr(agent, method_name) + return method(request) + else: + return {"error": f"No such method '{method_name}' in agent '{agent_name}'"}, 400 + return {"error": "No such agent registered"}, 400 diff --git a/submodules/moragents_dockers/agents/src/rag_agent/src/agent.py b/submodules/moragents_dockers/agents/src/rag_agent/src/agent.py new file mode 100644 index 0000000..1dc2552 --- /dev/null +++ b/submodules/moragents_dockers/agents/src/rag_agent/src/agent.py @@ -0,0 +1,91 @@ +import os +import logging +from langchain_community.document_loaders import PyMuPDFLoader +from langchain_community.vectorstores import FAISS +from langchain_core.prompts import ChatPromptTemplate +from langchain_text_splitters import RecursiveCharacterTextSplitter +from langchain.chains.combine_documents import create_stuff_documents_chain +from langchain.chains import create_retrieval_chain +from werkzeug.utils import secure_filename + + +logging.basicConfig(level=logging.DEBUG) + + + +class RagAgent: + def __init__(self, config, llm, llm_ollama, embeddings,flask_app): + self.llm = llm_ollama + self.flask_app = flask_app + self.embedding=embeddings + self.config = config + self.agent = None + self.messages = [{'role': "assistant", "content": "Please upload a file to begin"}] + self.upload_state = False + self.prompt = ChatPromptTemplate.from_template( + """ + Answer the following question only based on the given context + + + {context} + + + Question: {input} + """ + ) + self.UPLOAD_FOLDER = flask_app.config['UPLOAD_FOLDER'] + self.max_size = 5 * 1024 * 1024 + self.retriever = None + + + def handle_file_upload(self,file): + if not os.path.exists(self.UPLOAD_FOLDER): + os.makedirs(self.UPLOAD_FOLDER, exist_ok=True) + filename = secure_filename(file.filename) + file.save(os.path.join(self.UPLOAD_FOLDER, filename)) + # DocumentToolsGenerator class instantiation + loader = PyMuPDFLoader(os.path.join(self.UPLOAD_FOLDER,filename)) + docs = loader.load() + text_splitter = RecursiveCharacterTextSplitter(chunk_size=1024,chunk_overlap=20,length_function=len,is_separator_regex=False) + split_documents = text_splitter.split_documents(docs) + vector_store = FAISS.from_documents(split_documents, self.embedding) + self.retriever = vector_store.as_retriever(search_kwargs={"k": 7}) + + + def upload_file(self,request): + if 'file' not in request.files: + return {'error': 'No file part'}, 400 + file = request.files['file'] + if file.filename == '': + return {'error': 'No selected file'}, 400 + # Check file size + file.seek(0, os.SEEK_END) + file_length = file.tell() + file.seek(0, 0) # Reset the file pointer to the beginning + if file_length > self.max_size: + return {"role": "assistant", "content": 'please use a file less than 5 MB'} + try: + self.handle_file_upload(file) + self.upload_state = True + return {"role": "assistant", "content": 'You have successfully uploaded the text'} + except Exception as e: + logging.error(f'Error during file upload: {str(e)}') + return {'error': str(e)}, 500 + + def chat(self,request): + try: + data = request.get_json() + if 'prompt' in data: + prompt = data['prompt']['content'] + role = "assistant" + retrieved_docs = self.retriever.invoke(prompt) + formatted_context = "\n\n".join(doc.page_content for doc in retrieved_docs) + formatted_prompt = f"Question: {prompt}\n\nContext: {formatted_context}" + answer=self.llm(formatted_prompt) + response = answer if self.upload_state else "please upload a file first" + return {"role": role, "content": response} + else: + return {"error": "Missing required parameters"}, 400 + except Exception as e: + logging.error(f'Error in chat endpoint: {str(e)}') + return {"Error": str(e)}, 500 \ No newline at end of file diff --git a/submodules/moragents_dockers/agents/src/rag_agent/src/config.py b/submodules/moragents_dockers/agents/src/rag_agent/src/config.py new file mode 100644 index 0000000..63983c2 --- /dev/null +++ b/submodules/moragents_dockers/agents/src/rag_agent/src/config.py @@ -0,0 +1,9 @@ +import logging + +# Logging configuration +logging.basicConfig(level=logging.INFO) + +# Configuration object +class Config: + MAX_FILE_SIZE=5 * 1024 * 1024 # 5 MB + MAX_LENGTH=16 * 1024 * 1024 \ No newline at end of file diff --git a/submodules/moragents_dockers/agents/src/swap_agent/src/agent.py b/submodules/moragents_dockers/agents/src/swap_agent/src/agent.py index 90f861a..73f2694 100644 --- a/submodules/moragents_dockers/agents/src/swap_agent/src/agent.py +++ b/submodules/moragents_dockers/agents/src/swap_agent/src/agent.py @@ -1,207 +1,190 @@ -from flask import Flask, request, jsonify -from llama_cpp import Llama -from llama_cpp.llama_tokenizer import LlamaHFTokenizer +import json import requests +from flask import jsonify from swap_agent.src import tools -from swap_agent.src.tools import InsufficientFundsError, TokenNotFoundError, SwapNotPossibleError -from config import Config -import json - - -tools_provided = tools.get_tools() -messages = [{'role':"assistant","content":"This highly experimental chatbot is not intended for making important decisions, and its responses are generated based on incomplete data and algorithms that may evolve rapidly. By using this chatbot, you acknowledge that you use it at your own discretion and assume all risks associated with its limitations and potential errors."}] -context = [] - -def api_request_url(method_name, query_params, chain_id): - base_url = Config.APIBASEURL + str(chain_id) - return f"{base_url}{method_name}?{'&'.join([f'{key}={value}' for key, value in query_params.items()])}" - -def check_allowance(token_address, wallet_address, chain_id): - url = api_request_url("/approve/allowance", {"tokenAddress": token_address, "walletAddress": wallet_address}, chain_id) - response = requests.get(url, headers=Config.HEADERS) - data = response.json() - return data - -def approve_transaction(token_address, chain_id, amount=None): - query_params = {"tokenAddress": token_address, "amount": amount} if amount else {"tokenAddress": token_address} - url = api_request_url("/approve/transaction", query_params, chain_id) - response = requests.get(url, headers=Config.HEADERS) - transaction = response.json() - return transaction - -def build_tx_for_swap(swap_params, chain_id): - url = api_request_url("/swap", swap_params, chain_id) - swap_transaction = requests.get(url, headers=Config.HEADERS).json() - return swap_transaction - -def get_response(message, chain_id, wallet_address,llm): - global tools_provided , messages, context - prompt = [{"role": "system", "content": "Don't make assumptions about the value of the arguments for the function they should always be supplied by the user and do not alter the value of the arguments. Don't make assumptions about what values to plug into functions. Ask for clarification if a user request is ambiguous. you only need the value of token1 we dont need the value of token2. After starting from scratch do not assume the name of token1 or token2"}] - prompt.extend(message) - result = llm.create_chat_completion( - messages=prompt, - tools=tools_provided, - tool_choice="auto", - temperature=0.01 - ) - if "tool_calls" in result["choices"][0]["message"].keys(): - func = result["choices"][0]["message"]["tool_calls"][0]['function'] - if func["name"] == "swap_agent": - args = json.loads(func["arguments"]) - tok1 = args["token1"] - tok2 = args["token2"] - value = args["value"] - try: - res, role = tools.swap_coins(tok1, tok2, float(value), chain_id, wallet_address) - messages.append({"role": role, "content": res}) - except (tools.InsufficientFundsError, tools.TokenNotFoundError,tools.SwapNotPossibleError) as e: - context = [] - messages.append({"role": "assistant", "content": str(e)}) - return str(e), "assistant" - return res, role - messages.append({"role": "assistant", "content": result["choices"][0]["message"]['content']}) - context.append({"role": "assistant", "content": result["choices"][0]["message"]['content']}) - return result["choices"][0]["message"]['content'], "assistant" - -def get_status(flag, tx_hash, tx_type): - global messages, context - response = '' - - if flag == "cancelled": - response = f"The {tx_type} transaction has been cancelled." - elif flag == "success": - response = f"The {tx_type} transaction was successful." - elif flag == "failed": - response = f"The {tx_type} transaction has failed." - elif flag == "initiated": - response = f"Transaction has been sent, please wait for it to be confirmed." - - if tx_hash: - response = response + f" The transaction hash is {tx_hash}." - - if flag == "success" and tx_type == "approve": - response = response + " Please proceed with the swap transaction." - elif flag != "initiated": - response = response + " Is there anything else I can help you with?" - - if flag != "initiated": - context = [] - messages.append({"role": "assistant", "content": response}) - context.append({"role": "assistant", "content": response}) - context.append({"role": "user", "content": "okay lets start again from scratch"}) - else: - messages.append({"role": "assistant", "content": response}) - - return response - -def generate_response(prompt,chainid,walletAddress,llm): - global messages,context - messages.append(prompt) - context.append(prompt) - response,role = get_response(context,chainid,walletAddress,llm) - return response,role - - -def chat(request,llm): - try: - data = request.get_json() - if 'prompt' in data: - prompt = data['prompt'] - wallet_address = data['wallet_address'] - chain_id = data['chain_id'] - response, role = generate_response(prompt, chain_id, wallet_address,llm) - return jsonify({"role": role, "content": response}) - else: - return jsonify({"error": "Missing required parameters"}), 400 - - except Exception as e: - return jsonify({"Error": str(e)}), 500 - - -def tx_status(request): - try: - data = request.get_json() - if 'status' in data: - prompt = data['status'] - tx_hash = data.get('tx_hash', '') - tx_type = data.get('tx_type', '') - response = get_status(prompt, tx_hash, tx_type) - return jsonify({"role": "assistant", "content": response}) - else: - return jsonify({"error": "Missing required parameters"}), 400 - - except Exception as e: - return jsonify({"Error": str(e)}), 500 - -def get_messages(): - global messages - try: - return jsonify({"messages": messages}) - except Exception as e: - return jsonify({"Error": str(e)}), 500 - -def clear_messages(): - global messages, context - try: - messages = [{'role':"assistant","content":"This highly experimental chatbot is not intended for making important decisions, and its responses are generated based on incomplete data and algorithms that may evolve rapidly. By using this chatbot, you acknowledge that you use it at your own discretion and assume all risks associated with its limitations and potential errors."}] - context = [] - return jsonify({"response": "successfully cleared message history"}) - except Exception as e: - return jsonify({"Error": str(e)}), 500 - -def get_allowance(request): - try: - data = request.get_json() - if 'tokenAddress' in data: - token = data['tokenAddress'] - wallet_address = data['walletAddress'] - chain_id = data["chain_id"] - res = check_allowance(token, wallet_address, chain_id) - return jsonify({"response": res}) - else: - return jsonify({"error": "Missing required parameters"}), 400 - - except Exception as e: - return jsonify({"Error": str(e)}), 500 - -def approve(request): - try: - data = request.get_json() - if 'tokenAddress' in data: - token = data['tokenAddress'] - chain_id = data['chain_id'] - amount = data['amount'] - res = approve_transaction(token, chain_id, amount) - return jsonify({"response": res}) - else: - return jsonify({"error": "Missing required parameters"}), 400 - - except Exception as e: - return jsonify({"Error": str(e)}), 500 - -def swap(request): - try: - data = request.get_json() - if 'src' in data: - token1 = data['src'] - token2 = data['dst'] - wallet_address = data['walletAddress'] - amount = data['amount'] - slippage = data['slippage'] - chain_id = data['chain_id'] - swap_params = { - "src": token1, - "dst": token2, - "amount": amount, - "from": wallet_address, - "slippage": slippage, - "disableEstimate": False, - "allowPartialFill": False, +from swap_agent.src.config import Config + + +class SwapAgent: + def __init__(self, config, llm, llm_ollama, embeddings, flask_app): + self.llm = llm + self.flask_app = flask_app + self.config = config + self.tools_provided = tools.get_tools() + self.context = [] + + def api_request_url(self, method_name, query_params, chain_id): + base_url = Config.APIBASEURL + str(chain_id) + return f"{base_url}{method_name}?{'&'.join([f'{key}={value}' for key, value in query_params.items()])}" + + def check_allowance(self, token_address, wallet_address, chain_id): + url = self.api_request_url( + "/approve/allowance", + {"tokenAddress": token_address, "walletAddress": wallet_address}, + chain_id + ) + response = requests.get(url, headers=Config.HEADERS) + data = response.json() + return data + + def approve_transaction(self, token_address, chain_id, amount=None): + query_params = {"tokenAddress": token_address, "amount": amount} if amount else {"tokenAddress": token_address} + url = self.api_request_url("/approve/transaction", query_params, chain_id) + response = requests.get(url, headers=Config.HEADERS) + transaction = response.json() + return transaction + + def build_tx_for_swap(self, swap_params, chain_id): + url = self.api_request_url("/swap", swap_params, chain_id) + swap_transaction = requests.get(url, headers=Config.HEADERS).json() + return swap_transaction + + def get_response(self, message, chain_id, wallet_address): + prompt = [ + { + "role": "system", + "content": ( + "Don't make assumptions about the value of the arguments for the function " + "they should always be supplied by the user and do not alter the value of the arguments. " + "Don't make assumptions about what values to plug into functions. Ask for clarification if a user " + "request is ambiguous. you only need the value of token1 we dont need the value of token2. After " + "starting from scratch do not assume the name of token1 or token2" + ) } - swap_transaction = build_tx_for_swap(swap_params, chain_id) - return swap_transaction - else: - return jsonify({"error": "Missing required parameters"}), 400 - - except Exception as e: - return jsonify({"Error": str(e)}), 500 \ No newline at end of file + ] + prompt.extend(message) + result = self.llm.create_chat_completion( + messages=prompt, + tools=self.tools_provided, + tool_choice="auto", + temperature=0.01 + ) + if "tool_calls" in result["choices"][0]["message"].keys(): + func = result["choices"][0]["message"]["tool_calls"][0]['function'] + if func["name"] == "swap_agent": + args = json.loads(func["arguments"]) + tok1 = args["token1"] + tok2 = args["token2"] + value = args["value"] + try: + res, role = tools.swap_coins(tok1, tok2, float(value), chain_id, wallet_address) + except (tools.InsufficientFundsError, tools.TokenNotFoundError, tools.SwapNotPossibleError) as e: + self.context = [] + return str(e), "assistant", None + return res, role, None + self.context.append({"role": "assistant", "content": result["choices"][0]["message"]['content']}) + return result["choices"][0]["message"]['content'], "assistant", "crypto swap agent" + + def get_status(self, flag, tx_hash, tx_type): + response = '' + + if flag == "cancelled": + response = f"The {tx_type} transaction has been cancelled." + elif flag == "success": + response = f"The {tx_type} transaction was successful." + elif flag == "failed": + response = f"The {tx_type} transaction has failed." + elif flag == "initiated": + response = f"Transaction has been sent, please wait for it to be confirmed." + + if tx_hash: + response = response + f" The transaction hash is {tx_hash}." + + if flag == "success" and tx_type == "approve": + response = response + " Please proceed with the swap transaction." + elif flag != "initiated": + response = response + " Is there anything else I can help you with?" + + if flag != "initiated": + self.context = [] + self.context.append({"role": "assistant", "content": response}) + self.context.append({"role": "user", "content": "okay lets start again from scratch"}) + + return {"role": "assistant", "content": response} + + def generate_response(self, prompt, chain_id, wallet_address): + self.context.append(prompt) + response, role, next_turn_agent = self.get_response(self.context, chain_id, wallet_address) + return response, role, next_turn_agent + + def chat(self, request): + try: + data = request.get_json() + if 'prompt' in data: + prompt = data['prompt'] + wallet_address = data['wallet_address'] + chain_id = data['chain_id'] + response, role, next_turn_agent = self.generate_response(prompt, chain_id, wallet_address) + return {"role": role, "content": response, "next_turn_agent": next_turn_agent} + else: + return {"error": "Missing required parameters"}, 400 + except Exception as e: + return {"Error": str(e)}, 500 + + def tx_status(self, request): + try: + data = request.get_json() + if 'status' in data: + prompt = data['status'] + tx_hash = data.get('tx_hash', '') + tx_type = data.get('tx_type', '') + response = self.get_status(prompt, tx_hash, tx_type) + return response + else: + return {"error": "Missing required parameters"}, 400 + except Exception as e: + return {"Error": str(e)}, 500 + + def get_allowance(self, request): + try: + data = request.get_json() + if 'tokenAddress' in data: + token = data['tokenAddress'] + wallet_address = data['walletAddress'] + chain_id = data["chain_id"] + res = self.check_allowance(token, wallet_address, chain_id) + return jsonify({"response": res}) + else: + return jsonify({"error": "Missing required parameters"}), 400 + except Exception as e: + return jsonify({"Error": str(e)}), 500 + + def approve(self, request): + try: + data = request.get_json() + if 'tokenAddress' in data: + token = data['tokenAddress'] + chain_id = data['chain_id'] + amount = data['amount'] + res = self.approve_transaction(token, chain_id, amount) + return jsonify({"response": res}) + else: + return jsonify({"error": "Missing required parameters"}), 400 + except Exception as e: + return jsonify({"Error": str(e)}), 500 + + def swap(self, request): + try: + data = request.get_json() + if 'src' in data: + token1 = data['src'] + token2 = data['dst'] + wallet_address = data['walletAddress'] + amount = data['amount'] + slippage = data['slippage'] + chain_id = data['chain_id'] + swap_params = { + "src": token1, + "dst": token2, + "amount": amount, + "from": wallet_address, + "slippage": slippage, + "disableEstimate": False, + "allowPartialFill": False, + } + swap_transaction = self.build_tx_for_swap(swap_params, chain_id) + return swap_transaction + else: + return jsonify({"error": "Missing required parameters"}), 400 + except Exception as e: + return jsonify({"Error": str(e)}), 500 diff --git a/submodules/moragents_dockers/agents/src/swap_agent/src/config.py b/submodules/moragents_dockers/agents/src/swap_agent/src/config.py index b91a88f..df5a36e 100644 --- a/submodules/moragents_dockers/agents/src/swap_agent/src/config.py +++ b/submodules/moragents_dockers/agents/src/swap_agent/src/config.py @@ -22,4 +22,5 @@ class Config: {"constant": True, "inputs": [{"name": "_owner", "type": "address"}], "name": "balanceOf", "outputs": [{"name": "balance", "type": "uint256"}], "payable": False, "stateMutability": "view", "type": "function"} ] INCH_NATIVE_TOKEN_ADDRESS = "0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE" + \ No newline at end of file diff --git a/submodules/moragents_dockers/agents/src/swap_agent/src/tools.py b/submodules/moragents_dockers/agents/src/swap_agent/src/tools.py index 516f026..1800dfe 100644 --- a/submodules/moragents_dockers/agents/src/swap_agent/src/tools.py +++ b/submodules/moragents_dockers/agents/src/swap_agent/src/tools.py @@ -1,8 +1,8 @@ import requests import logging import time -from config import Config from web3 import Web3 +from swap_agent.src.config import Config class InsufficientFundsError(Exception): diff --git a/submodules/moragents_dockers/frontend/components/Chat/index.tsx b/submodules/moragents_dockers/frontend/components/Chat/index.tsx index 01f6cd0..c79a4ba 100644 --- a/submodules/moragents_dockers/frontend/components/Chat/index.tsx +++ b/submodules/moragents_dockers/frontend/components/Chat/index.tsx @@ -162,6 +162,7 @@ export const Chat: FC = ({ await onSubmitMessage(message, file); setMessage(''); + setFile(null); // Clear the file state after upload setShowSpinner(false); } diff --git a/submodules/moragents_dockers/frontend/components/HeaderBar/agentSelector.tsx b/submodules/moragents_dockers/frontend/components/HeaderBar/agentSelector.tsx deleted file mode 100644 index 0775534..0000000 --- a/submodules/moragents_dockers/frontend/components/HeaderBar/agentSelector.tsx +++ /dev/null @@ -1,130 +0,0 @@ -import { Box, CheckboxIcon, HStack, Icon, Spacer, Text, VStack } from '@chakra-ui/react'; -import React, { FC, ComponentPropsWithoutRef, useState } from 'react'; -import { useOutsideClick } from '@chakra-ui/react'; -import { CheckIcon, ChevronDownIcon, ChevronUpIcon } from '@chakra-ui/icons' -import { availableAgents } from '../../config'; - -interface AgentSelectorProps extends ComponentPropsWithoutRef<'div'> { - onSelectedAgent: (agent: string) => void; - selectedAgent?: string; -} - -const AgentSelectorItem: FC<{ selected: boolean, agent: string, agentDescription: string, showDelimiter: boolean, onSelectAgent: (agent: string) => void }> = ({ selected, agent, agentDescription, showDelimiter = true, onSelectAgent }) => { - const handleAgentSelection = () => { - onSelectAgent(agent); - } - - return ( - { - console.log('Clicked agent:', agent); - handleAgentSelection(); - }} - > - - - {availableAgents[agent].name} - - {selected && } - - - {agentDescription || ''} - - - - ); -} - -export const AgentSelector: FC = ({ onSelectedAgent, selectedAgent }: AgentSelectorProps) => { - const [show, setShow] = React.useState(false); - - const ref = React.useRef(null); - - const handleAgentSelected = (agent: string) => { - setShow(false); - onSelectedAgent(agent); - } - - useOutsideClick({ - ref: ref, - handler: () => { - setShow(false); - } - - }) - - return ( - <> - { - setShow(show ? false : true) - }}> - - - {availableAgents[(selectedAgent || 'none')]?.name || 'Select Agent'} - - - {show ? : } - - - {show && - {availableAgents && Object.keys(availableAgents).map((agent, index) => { - return ( - { - console.log('Selected agent:', agent); - handleAgentSelected(agent); - }} - /> - ); - })} - - } - - - ); -} \ No newline at end of file diff --git a/submodules/moragents_dockers/frontend/components/HeaderBar/index.tsx b/submodules/moragents_dockers/frontend/components/HeaderBar/index.tsx index 7833b0a..650b5f6 100644 --- a/submodules/moragents_dockers/frontend/components/HeaderBar/index.tsx +++ b/submodules/moragents_dockers/frontend/components/HeaderBar/index.tsx @@ -1,8 +1,8 @@ import React, { FC, ComponentPropsWithoutRef } from 'react'; import Image from 'next/image'; import { Box, HStack, Spacer } from '@chakra-ui/react'; -import { AgentSelector } from './agentSelector'; import { ConnectButton } from '@rainbow-me/rainbowkit'; +import { availableAgents } from '../../config'; export interface HeaderBarProps extends ComponentPropsWithoutRef<'div'> { onAgentChanged(agent: string): void; @@ -10,36 +10,27 @@ export interface HeaderBarProps extends ComponentPropsWithoutRef<'div'> { } export const HeaderBar: FC = (props) => { + const defaultAgent = 'swap-agent'; // Set your default agent here + const selectedAgent = availableAgents[defaultAgent]; + return ( - - + }}> + + logo - - { - props.onAgentChanged(agent); - }} - selectedAgent={props.currentAgent} - /> + - + ); }; \ No newline at end of file diff --git a/submodules/moragents_dockers/frontend/config.ts b/submodules/moragents_dockers/frontend/config.ts index f13d51f..0f4d11a 100644 --- a/submodules/moragents_dockers/frontend/config.ts +++ b/submodules/moragents_dockers/frontend/config.ts @@ -14,30 +14,12 @@ export const availableAgents: { } } = { 'swap-agent': { - 'name': 'Swap Agent', - 'description': 'Get quotes and perform swaps between tokens', - 'endpoint': 'http://127.0.0.1:8080/swap_agent', + 'name': 'Morpheus', + 'description': 'performs multiple tasks crypto data agent,swap agent and rag agent', + 'endpoint': 'http://127.0.0.1:8080', requirements: { connectedWallet: true - } - }, - 'functional-data-agent': { - 'name': 'Data Agent', - 'description': 'Ask about price, market cap, FDV or TVL', - 'endpoint': 'http://127.0.0.1:8080/data_agent', - requirements: { - connectedWallet: false - } - } - /* - 'rag-agent': { - 'name': 'Functional Data Agent (RAG FOR FILES)', - 'description': 'Mock of the Data Agent that supports files', - 'endpoint': 'http://127.0.0.1:8081', - requirements: { - connectedWallet: false }, supportsFiles: true } - */ } \ No newline at end of file diff --git a/submodules/moragents_dockers/frontend/pages/index.tsx b/submodules/moragents_dockers/frontend/pages/index.tsx index 4db49f7..8b0d192 100644 --- a/submodules/moragents_dockers/frontend/pages/index.tsx +++ b/submodules/moragents_dockers/frontend/pages/index.tsx @@ -10,16 +10,14 @@ import { HeaderBar } from '../components/HeaderBar'; import { availableAgents } from '../config'; import { WalletRequiredModal } from '../components/WalletRequiredModal'; import { ErrorBackendModal } from '../components/ErrorBackendModal'; -import { get } from 'http'; const Home: NextPage = () => { const [chatHistory, setChatHistory] = useState([]); const chainId = useChainId(); const { address } = useAccount(); - const [selectedAgent, setSelectedAgent] = useState('swap-agent'); // default is swap agent for now. TODO ask what should be the default agent. + const [selectedAgent, setSelectedAgent] = useState('swap-agent'); // default is swap agent for now. const [showBackendError, setShowBackendError] = useState(false); - useEffect(() => { getMessagesHistory( getHttpClient(selectedAgent), From 05d00486cd272017363a9963ca4bc96693f1a249 Mon Sep 17 00:00:00 2001 From: ygarg25 Date: Mon, 12 Aug 2024 13:11:11 +0530 Subject: [PATCH 03/28] add feature/claim to swap-agent --- .../swap_agent/src/abi/distribution_abi.json | 1086 +++++++++++++++++ .../agents/src/swap_agent/src/agent.py | 8 +- .../agents/src/swap_agent/src/config.py | 25 +- .../agents/src/swap_agent/src/tools.py | 84 +- 4 files changed, 1191 insertions(+), 12 deletions(-) create mode 100644 submodules/moragents_dockers/agents/src/swap_agent/src/abi/distribution_abi.json diff --git a/submodules/moragents_dockers/agents/src/swap_agent/src/abi/distribution_abi.json b/submodules/moragents_dockers/agents/src/swap_agent/src/abi/distribution_abi.json new file mode 100644 index 0000000..995287d --- /dev/null +++ b/submodules/moragents_dockers/agents/src/swap_agent/src/abi/distribution_abi.json @@ -0,0 +1,1086 @@ +[ + { + "inputs": [], + "stateMutability": "nonpayable", + "type": "constructor" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "address", + "name": "previousAdmin", + "type": "address" + }, + { + "indexed": false, + "internalType": "address", + "name": "newAdmin", + "type": "address" + } + ], + "name": "AdminChanged", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "beacon", + "type": "address" + } + ], + "name": "BeaconUpgraded", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint8", + "name": "version", + "type": "uint8" + } + ], + "name": "Initialized", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint256", + "name": "amount", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "bytes", + "name": "uniqueId", + "type": "bytes" + } + ], + "name": "OverplusBridged", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "previousOwner", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "newOwner", + "type": "address" + } + ], + "name": "OwnershipTransferred", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "uint256", + "name": "poolId", + "type": "uint256" + }, + { + "components": [ + { + "internalType": "uint128", + "name": "payoutStart", + "type": "uint128" + }, + { + "internalType": "uint128", + "name": "decreaseInterval", + "type": "uint128" + }, + { + "internalType": "uint128", + "name": "withdrawLockPeriod", + "type": "uint128" + }, + { + "internalType": "uint128", + "name": "claimLockPeriod", + "type": "uint128" + }, + { + "internalType": "uint128", + "name": "withdrawLockPeriodAfterStake", + "type": "uint128" + }, + { + "internalType": "uint256", + "name": "initialReward", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "rewardDecrease", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "minimalStake", + "type": "uint256" + }, + { + "internalType": "bool", + "name": "isPublic", + "type": "bool" + } + ], + "indexed": false, + "internalType": "struct IDistributionV2.Pool", + "name": "pool", + "type": "tuple" + } + ], + "name": "PoolCreated", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "uint256", + "name": "poolId", + "type": "uint256" + }, + { + "components": [ + { + "internalType": "uint128", + "name": "payoutStart", + "type": "uint128" + }, + { + "internalType": "uint128", + "name": "decreaseInterval", + "type": "uint128" + }, + { + "internalType": "uint128", + "name": "withdrawLockPeriod", + "type": "uint128" + }, + { + "internalType": "uint128", + "name": "claimLockPeriod", + "type": "uint128" + }, + { + "internalType": "uint128", + "name": "withdrawLockPeriodAfterStake", + "type": "uint128" + }, + { + "internalType": "uint256", + "name": "initialReward", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "rewardDecrease", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "minimalStake", + "type": "uint256" + }, + { + "internalType": "bool", + "name": "isPublic", + "type": "bool" + } + ], + "indexed": false, + "internalType": "struct IDistributionV2.Pool", + "name": "pool", + "type": "tuple" + } + ], + "name": "PoolEdited", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "implementation", + "type": "address" + } + ], + "name": "Upgraded", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "uint256", + "name": "poolId", + "type": "uint256" + }, + { + "indexed": true, + "internalType": "address", + "name": "user", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint128", + "name": "claimLockStart", + "type": "uint128" + }, + { + "indexed": false, + "internalType": "uint128", + "name": "claimLockEnd", + "type": "uint128" + } + ], + "name": "UserClaimLocked", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "uint256", + "name": "poolId", + "type": "uint256" + }, + { + "indexed": true, + "internalType": "address", + "name": "user", + "type": "address" + }, + { + "indexed": false, + "internalType": "address", + "name": "receiver", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "name": "UserClaimed", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "uint256", + "name": "poolId", + "type": "uint256" + }, + { + "indexed": true, + "internalType": "address", + "name": "user", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "name": "UserStaked", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "uint256", + "name": "poolId", + "type": "uint256" + }, + { + "indexed": true, + "internalType": "address", + "name": "user", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "name": "UserWithdrawn", + "type": "event" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "depositToken_", + "type": "address" + }, + { + "internalType": "address", + "name": "l1Sender_", + "type": "address" + }, + { + "components": [ + { + "internalType": "uint128", + "name": "payoutStart", + "type": "uint128" + }, + { + "internalType": "uint128", + "name": "decreaseInterval", + "type": "uint128" + }, + { + "internalType": "uint128", + "name": "withdrawLockPeriod", + "type": "uint128" + }, + { + "internalType": "uint128", + "name": "claimLockPeriod", + "type": "uint128" + }, + { + "internalType": "uint128", + "name": "withdrawLockPeriodAfterStake", + "type": "uint128" + }, + { + "internalType": "uint256", + "name": "initialReward", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "rewardDecrease", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "minimalStake", + "type": "uint256" + }, + { + "internalType": "bool", + "name": "isPublic", + "type": "bool" + } + ], + "internalType": "struct IDistributionV2.Pool[]", + "name": "poolsInfo_", + "type": "tuple[]" + } + ], + "name": "Distribution_init", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "gasLimit_", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "maxFeePerGas_", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "maxSubmissionCost_", + "type": "uint256" + } + ], + "name": "bridgeOverplus", + "outputs": [ + { + "internalType": "bytes", + "name": "", + "type": "bytes" + } + ], + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "poolId_", + "type": "uint256" + }, + { + "internalType": "address", + "name": "receiver_", + "type": "address" + } + ], + "name": "claim", + "outputs": [], + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [ + { + "components": [ + { + "internalType": "uint128", + "name": "payoutStart", + "type": "uint128" + }, + { + "internalType": "uint128", + "name": "decreaseInterval", + "type": "uint128" + }, + { + "internalType": "uint128", + "name": "withdrawLockPeriod", + "type": "uint128" + }, + { + "internalType": "uint128", + "name": "claimLockPeriod", + "type": "uint128" + }, + { + "internalType": "uint128", + "name": "withdrawLockPeriodAfterStake", + "type": "uint128" + }, + { + "internalType": "uint256", + "name": "initialReward", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "rewardDecrease", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "minimalStake", + "type": "uint256" + }, + { + "internalType": "bool", + "name": "isPublic", + "type": "bool" + } + ], + "internalType": "struct IDistributionV2.Pool", + "name": "pool_", + "type": "tuple" + } + ], + "name": "createPool", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "depositToken", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "poolId_", + "type": "uint256" + }, + { + "components": [ + { + "internalType": "uint128", + "name": "payoutStart", + "type": "uint128" + }, + { + "internalType": "uint128", + "name": "decreaseInterval", + "type": "uint128" + }, + { + "internalType": "uint128", + "name": "withdrawLockPeriod", + "type": "uint128" + }, + { + "internalType": "uint128", + "name": "claimLockPeriod", + "type": "uint128" + }, + { + "internalType": "uint128", + "name": "withdrawLockPeriodAfterStake", + "type": "uint128" + }, + { + "internalType": "uint256", + "name": "initialReward", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "rewardDecrease", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "minimalStake", + "type": "uint256" + }, + { + "internalType": "bool", + "name": "isPublic", + "type": "bool" + } + ], + "internalType": "struct IDistributionV2.Pool", + "name": "pool_", + "type": "tuple" + } + ], + "name": "editPool", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "poolId_", + "type": "uint256" + }, + { + "internalType": "uint128", + "name": "claimLockStart_", + "type": "uint128" + }, + { + "internalType": "uint128", + "name": "claimLockEnd_", + "type": "uint128" + } + ], + "name": "getClaimLockPeriodMultiplier", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "poolId_", + "type": "uint256" + }, + { + "internalType": "address", + "name": "user_", + "type": "address" + } + ], + "name": "getCurrentUserMultiplier", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "poolId_", + "type": "uint256" + }, + { + "internalType": "address", + "name": "user_", + "type": "address" + } + ], + "name": "getCurrentUserReward", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "poolId_", + "type": "uint256" + }, + { + "internalType": "uint128", + "name": "startTime_", + "type": "uint128" + }, + { + "internalType": "uint128", + "name": "endTime_", + "type": "uint128" + } + ], + "name": "getPeriodReward", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "isNotUpgradeable", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "l1Sender", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "poolId_", + "type": "uint256" + }, + { + "internalType": "uint128", + "name": "claimLockEnd_", + "type": "uint128" + } + ], + "name": "lockClaim", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "poolId_", + "type": "uint256" + }, + { + "internalType": "address[]", + "name": "users_", + "type": "address[]" + }, + { + "internalType": "uint256[]", + "name": "amounts_", + "type": "uint256[]" + }, + { + "internalType": "uint128[]", + "name": "claimLockEnds_", + "type": "uint128[]" + } + ], + "name": "manageUsersInPrivatePool", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "overplus", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "owner", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "name": "pools", + "outputs": [ + { + "internalType": "uint128", + "name": "payoutStart", + "type": "uint128" + }, + { + "internalType": "uint128", + "name": "decreaseInterval", + "type": "uint128" + }, + { + "internalType": "uint128", + "name": "withdrawLockPeriod", + "type": "uint128" + }, + { + "internalType": "uint128", + "name": "claimLockPeriod", + "type": "uint128" + }, + { + "internalType": "uint128", + "name": "withdrawLockPeriodAfterStake", + "type": "uint128" + }, + { + "internalType": "uint256", + "name": "initialReward", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "rewardDecrease", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "minimalStake", + "type": "uint256" + }, + { + "internalType": "bool", + "name": "isPublic", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "name": "poolsData", + "outputs": [ + { + "internalType": "uint128", + "name": "lastUpdate", + "type": "uint128" + }, + { + "internalType": "uint256", + "name": "rate", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "totalVirtualDeposited", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "proxiableUUID", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "removeUpgradeability", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "renounceOwnership", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "poolId_", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "amount_", + "type": "uint256" + }, + { + "internalType": "uint128", + "name": "claimLockEnd_", + "type": "uint128" + } + ], + "name": "stake", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "totalDepositedInPublicPools", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "newOwner", + "type": "address" + } + ], + "name": "transferOwnership", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "newImplementation", + "type": "address" + } + ], + "name": "upgradeTo", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "newImplementation", + "type": "address" + }, + { + "internalType": "bytes", + "name": "data", + "type": "bytes" + } + ], + "name": "upgradeToAndCall", + "outputs": [], + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + }, + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "name": "usersData", + "outputs": [ + { + "internalType": "uint128", + "name": "lastStake", + "type": "uint128" + }, + { + "internalType": "uint256", + "name": "deposited", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "rate", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "pendingRewards", + "type": "uint256" + }, + { + "internalType": "uint128", + "name": "claimLockStart", + "type": "uint128" + }, + { + "internalType": "uint128", + "name": "claimLockEnd", + "type": "uint128" + }, + { + "internalType": "uint256", + "name": "virtualDeposited", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "version", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "pure", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "poolId_", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "amount_", + "type": "uint256" + } + ], + "name": "withdraw", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + } +] \ No newline at end of file diff --git a/submodules/moragents_dockers/agents/src/swap_agent/src/agent.py b/submodules/moragents_dockers/agents/src/swap_agent/src/agent.py index 90f861a..6632bee 100644 --- a/submodules/moragents_dockers/agents/src/swap_agent/src/agent.py +++ b/submodules/moragents_dockers/agents/src/swap_agent/src/agent.py @@ -7,7 +7,6 @@ from config import Config import json - tools_provided = tools.get_tools() messages = [{'role':"assistant","content":"This highly experimental chatbot is not intended for making important decisions, and its responses are generated based on incomplete data and algorithms that may evolve rapidly. By using this chatbot, you acknowledge that you use it at your own discretion and assume all risks associated with its limitations and potential errors."}] context = [] @@ -59,6 +58,11 @@ def get_response(message, chain_id, wallet_address,llm): messages.append({"role": "assistant", "content": str(e)}) return str(e), "assistant" return res, role + + elif func["name"] == 'prepare_claim_rewards': + args = json.loads(func["arguments"]) + return tools.prepare_claim_rewards(args['pool_id'], args['receiver_address']), "assistant" + messages.append({"role": "assistant", "content": result["choices"][0]["message"]['content']}) context.append({"role": "assistant", "content": result["choices"][0]["message"]['content']}) return result["choices"][0]["message"]['content'], "assistant" @@ -204,4 +208,4 @@ def swap(request): return jsonify({"error": "Missing required parameters"}), 400 except Exception as e: - return jsonify({"Error": str(e)}), 500 \ No newline at end of file + return jsonify({"Error": str(e)}), 500 diff --git a/submodules/moragents_dockers/agents/src/swap_agent/src/config.py b/submodules/moragents_dockers/agents/src/swap_agent/src/config.py index b91a88f..8575a4a 100644 --- a/submodules/moragents_dockers/agents/src/swap_agent/src/config.py +++ b/submodules/moragents_dockers/agents/src/swap_agent/src/config.py @@ -1,25 +1,36 @@ import logging +import json + +with open('abi/distribution_abi.json', 'r') as file: + distribution_abi = json.load(file) # Logging configuration logging.basicConfig(level=logging.INFO) + # Configuration object class Config: # Model configuration MODEL_NAME = "meetkai/functionary-small-v2.4-GGUF" MODEL_REVISION = "functionary-small-v2.4.Q4_0.gguf" - MODEL_PATH = "model/"+MODEL_REVISION + MODEL_PATH = "model/" + MODEL_REVISION DOWNLOAD_DIR = "model" # API endpoints INCH_URL = "https://api.1inch.dev/token" QUOTE_URL = "https://api.1inch.dev/swap" APIBASEURL = f"https://api.1inch.dev/swap/v6.0/" - HEADERS = { "Authorization": "Bearer WvQuxaMYpPvDiiOL5RHWUm7OzOd20nt4", "accept": "application/json" } - WEB3RPCURL = {"56":"https://bsc-dataseed.binance.org","42161":"https://arb1.arbitrum.io/rpc","137":"https://polygon-rpc.com","1":"https://cloudflare-eth.com","10":"https://mainnet.optimism.io","8453":"https://mainnet.base.org"} - NATIVE_TOKENS={"137":"MATIC","56":"BNB","1":"ETH","42161":"ETH","10":"ETH","8453":"ETH"} + HEADERS = {"Authorization": "Bearer WvQuxaMYpPvDiiOL5RHWUm7OzOd20nt4", "accept": "application/json"} + WEB3RPCURL = {"56": "https://bsc-dataseed.binance.org", "42161": "https://arb1.arbitrum.io/rpc", + "137": "https://polygon-rpc.com", "1": "https://cloudflare-eth.com", + "10": "https://mainnet.optimism.io", "8453": "https://mainnet.base.org"} + NATIVE_TOKENS = {"137": "MATIC", "56": "BNB", "1": "ETH", "42161": "ETH", "10": "ETH", "8453": "ETH"} ERC20_ABI = [ - {"constant": True, "inputs": [], "name": "decimals", "outputs": [{"name": "", "type": "uint8"}], "payable": False, "stateMutability": "view", "type": "function"}, - {"constant": True, "inputs": [{"name": "_owner", "type": "address"}], "name": "balanceOf", "outputs": [{"name": "balance", "type": "uint256"}], "payable": False, "stateMutability": "view", "type": "function"} + {"constant": True, "inputs": [], "name": "decimals", "outputs": [{"name": "", "type": "uint8"}], + "payable": False, "stateMutability": "view", "type": "function"}, + {"constant": True, "inputs": [{"name": "_owner", "type": "address"}], "name": "balanceOf", + "outputs": [{"name": "balance", "type": "uint256"}], "payable": False, "stateMutability": "view", + "type": "function"} ] + DISTRIBUTION_ABI = distribution_abi + DISTRIBUTION_PROXY_ADDRESS = "0x47176B2Af9885dC6C4575d4eFd63895f7Aaa4790" INCH_NATIVE_TOKEN_ADDRESS = "0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE" - \ No newline at end of file diff --git a/submodules/moragents_dockers/agents/src/swap_agent/src/tools.py b/submodules/moragents_dockers/agents/src/swap_agent/src/tools.py index 516f026..8bbfe31 100644 --- a/submodules/moragents_dockers/agents/src/swap_agent/src/tools.py +++ b/submodules/moragents_dockers/agents/src/swap_agent/src/tools.py @@ -8,9 +8,11 @@ class InsufficientFundsError(Exception): pass + class TokenNotFoundError(Exception): pass + class SwapNotPossibleError(Exception): pass @@ -29,6 +31,7 @@ def search_tokens(query, chain_id, limit=1, ignore_listed="false"): logging.error(f"Failed to search tokens. Status code: {response.status_code}") return None + def get_token_balance(web3: Web3, wallet_address: str, token_address: str, abi: list) -> int: """ Get the balance of an ERC-20 token for a given wallet address. """ if not token_address: # If no token address is provided, assume checking ETH or native token balance @@ -37,9 +40,11 @@ def get_token_balance(web3: Web3, wallet_address: str, token_address: str, abi: contract = web3.eth.contract(address=web3.to_checksum_address(token_address), abi=abi) return contract.functions.balanceOf(web3.to_checksum_address(wallet_address)).call() + def eth_to_wei(amount_in_eth: float) -> int: """Convert an amount in ETH to wei.""" - return int(amount_in_eth * 10**18) + return int(amount_in_eth * 10 ** 18) + def validate_swap(web3: Web3, token1, token2, chain_id, amount, wallet_address): native = Config.NATIVE_TOKENS @@ -74,6 +79,7 @@ def validate_swap(web3: Web3, token1, token2, chain_id, amount, wallet_address): return t1[0]['address'], t1[0]['symbol'], t2[0]['address'], t2[0]['symbol'] + def get_quote(token1, token2, amount_in_wei, chain_id): endpoint = f"/v6.0/{chain_id}/quote" params = { @@ -88,6 +94,7 @@ def get_quote(token1, token2, amount_in_wei, chain_id): logging.error(f"Failed to get quote. Status code: {response.status_code}") return None + def get_token_decimals(web3: Web3, token_address: str) -> int: if not token_address: return 18 # Assuming 18 decimals for the native gas token @@ -95,10 +102,12 @@ def get_token_decimals(web3: Web3, token_address: str) -> int: contract = web3.eth.contract(address=Web3.to_checksum_address(token_address), abi=Config.ERC20_ABI) return contract.functions.decimals().call() + def convert_to_smallest_unit(web3: Web3, amount: float, token_address: str) -> int: decimals = get_token_decimals(web3, token_address) return int(amount * (10 ** decimals)) + def convert_to_readable_unit(web3: Web3, smallest_unit_amount: int, token_address: str) -> float: decimals = get_token_decimals(web3, token_address) return smallest_unit_amount / (10 ** decimals) @@ -113,7 +122,7 @@ def swap_coins(token1, token2, amount, chain_id, wallet_address): t1_address = '' if t1_a == Config.INCH_NATIVE_TOKEN_ADDRESS else t1_a smallest_unit_amount = convert_to_smallest_unit(web3, amount, t1_address) result = get_quote(t1_a, t2_a, smallest_unit_amount, chain_id) - + if result: price = result["dstAmount"] t2_address = '' if t2_a == Config.INCH_NATIVE_TOKEN_ADDRESS else t2_a @@ -132,6 +141,54 @@ def swap_coins(token1, token2, amount, chain_id, wallet_address): "swap_tx_cb": "/swap" }, "swap" +def prepare_claim_rewards(pool_id, receiver_address): + """ + Prepare the transaction data for claiming rewards. + + Parameters: + - pool_id: int - The ID of the pool from which to claim rewards. + - receiver_address: str - The address to receive the claimed rewards. + + Returns: + - dict: Transaction data to be signed by the user's wallet. + """ + try: + # Initialize the web3 instance + web3 = Web3(Web3.HTTPProvider(Config.WEB3RPCURL["1"])) # Ethereum Mainnet + + # Load the contract + contract = web3.eth.contract( + address=Web3.to_checksum_address(Config.DISTRIBUTION_PROXY_ADDRESS), + abi=Config.DISTRIBUTION_ABI + ) + + # Prepare the transaction data + tx_data = contract.encodeABI(fn_name="claim", args=[pool_id, Web3.to_checksum_address(receiver_address)]) + + # Set the mint fee (0.001 ETH) + mint_fee = web3.to_wei(0.001, 'ether') + + # Estimate gas (optional, can be done on the frontend) + estimated_gas = contract.functions.claim(pool_id, Web3.to_checksum_address(receiver_address)).estimate_gas({ + 'from': Web3.to_checksum_address(receiver_address), + 'value': mint_fee + }) + + return { + "status": "success", + "to": Config.DISTRIBUTION_PROXY_ADDRESS, + "data": tx_data, + "value": str(mint_fee), # 0.001 ETH in wei + "gas": str(estimated_gas), + "chainId": "1" # Ethereum Mainnet + } + except Exception as e: + return { + "status": "error", + "message": str(e) + } + + def get_tools(): """Return a list of tools for the agent.""" return [ @@ -159,5 +216,26 @@ def get_tools(): "required": ["token1", "token2", "value"] } } + }, + { + "type": "function", + "function": { + "name": "prepare_claim_rewards", + "description": "Prepare transaction data for claiming rewards from a specified pool. Requires a 0.001 ETH mint fee.", + "parameters": { + "type": "object", + "properties": { + "pool_id": { + "type": "integer", + "description": "The ID of the pool from which to claim rewards" + }, + "receiver_address": { + "type": "string", + "description": "The address to receive the claimed rewards" + } + }, + "required": ["pool_id", "receiver_address"] + } + } } - ] \ No newline at end of file + ] From 50d929246353c6469078ffaada05663760fb51c1 Mon Sep 17 00:00:00 2001 From: ygarg25 Date: Wed, 4 Sep 2024 13:09:38 +0530 Subject: [PATCH 04/28] Added claim and reward agents --- requirements.txt | 1 + .../benchmarks/adapters/base_adapter.py | 21 + .../benchmarks/adapters/coingecko_adapter.py | 30 + .../benchmarks/adapters/defillama_adapter.py | 22 + submodules/benchmarks/benchmarks.py | 83 ++ submodules/benchmarks/config.py | 270 ++++ submodules/benchmarks/helpers.py | 54 + submodules/benchmarks/readme.md | 22 + submodules/benchmarks/requirements.txt | 1 + submodules/claim_agent_benchmarks/README.md | 23 + .../adapters/claim_adapter.py | 14 + .../claim_agent_benchmarks/benchmarks.py | 30 + submodules/claim_agent_benchmarks/config.py | 14 + submodules/claim_agent_benchmarks/helpers.py | 25 + .../claim_agent_benchmarks/user_flow.py | 46 + submodules/moragents_dockers/README.md | 169 ++- .../moragents_dockers/agents/Dockerfile | 2 +- .../moragents_dockers/agents/Dockerfile-apple | 2 +- .../moragents_dockers/agents/pytest.ini | 3 + .../moragents_dockers/agents/requirements.txt | 23 +- .../moragents_dockers/agents/src/README-UI.md | 65 - .../moragents_dockers/agents/src/app.py | 136 ++- .../agents/src/claim_agent/src/agent.py | 81 ++ .../agents/src/claim_agent/src/config.py | 58 + .../agents/src/claim_agent/src/tools.py | 91 ++ .../moragents_dockers/agents/src/config.py | 71 +- .../agents/src/data_agent/src/agent.py | 128 +- .../agents/src/data_agent/src/tools.py | 3 +- .../moragents_dockers/agents/src/delegator.py | 79 ++ .../agents/src/rag_agent/src/agent.py | 91 ++ .../agents/src/rag_agent/src/config.py | 9 + .../agents/src/reward_agent/src/agent.py | 66 + .../agents/src/reward_agent/src/config.py | 39 + .../agents/src/reward_agent/src/tools.py | 47 + .../swap_agent/src/abi/distribution_abi.json | 1086 ----------------- .../agents/src/swap_agent/src/agent.py | 395 +++--- .../agents/src/swap_agent/src/config.py | 26 +- .../agents/src/swap_agent/src/tools.py | 86 +- .../agents/tests/data_agent/test_agent.py | 95 ++ .../agents/tests/data_agent/test_tools.py | 82 ++ .../agents/tests/swap_agent/test_agent.py | 126 ++ .../agents/tests/swap_agent/test_tools.py | 114 ++ .../frontend/components/Chat/index.tsx | 1 + .../components/HeaderBar/agentSelector.tsx | 130 -- .../frontend/components/HeaderBar/index.tsx | 27 +- .../moragents_dockers/frontend/config.ts | 24 +- .../frontend/pages/index.tsx | 4 +- .../reward_check_agent_benchmarks/README.md | 23 + .../adapters/reward_check_adapter.py | 12 + .../benchmarks.py | 47 + .../reward_check_agent_benchmarks/config.py | 72 ++ .../reward_check_agent_benchmarks/helpers.py | 51 + 52 files changed, 2437 insertions(+), 1783 deletions(-) create mode 100644 submodules/benchmarks/adapters/base_adapter.py create mode 100644 submodules/benchmarks/adapters/coingecko_adapter.py create mode 100644 submodules/benchmarks/adapters/defillama_adapter.py create mode 100644 submodules/benchmarks/benchmarks.py create mode 100644 submodules/benchmarks/config.py create mode 100644 submodules/benchmarks/helpers.py create mode 100644 submodules/benchmarks/readme.md create mode 100644 submodules/benchmarks/requirements.txt create mode 100644 submodules/claim_agent_benchmarks/README.md create mode 100644 submodules/claim_agent_benchmarks/adapters/claim_adapter.py create mode 100644 submodules/claim_agent_benchmarks/benchmarks.py create mode 100644 submodules/claim_agent_benchmarks/config.py create mode 100644 submodules/claim_agent_benchmarks/helpers.py create mode 100644 submodules/claim_agent_benchmarks/user_flow.py create mode 100644 submodules/moragents_dockers/agents/pytest.ini delete mode 100644 submodules/moragents_dockers/agents/src/README-UI.md create mode 100644 submodules/moragents_dockers/agents/src/claim_agent/src/agent.py create mode 100644 submodules/moragents_dockers/agents/src/claim_agent/src/config.py create mode 100644 submodules/moragents_dockers/agents/src/claim_agent/src/tools.py create mode 100644 submodules/moragents_dockers/agents/src/delegator.py create mode 100644 submodules/moragents_dockers/agents/src/rag_agent/src/agent.py create mode 100644 submodules/moragents_dockers/agents/src/rag_agent/src/config.py create mode 100644 submodules/moragents_dockers/agents/src/reward_agent/src/agent.py create mode 100644 submodules/moragents_dockers/agents/src/reward_agent/src/config.py create mode 100644 submodules/moragents_dockers/agents/src/reward_agent/src/tools.py delete mode 100644 submodules/moragents_dockers/agents/src/swap_agent/src/abi/distribution_abi.json create mode 100644 submodules/moragents_dockers/agents/tests/data_agent/test_agent.py create mode 100644 submodules/moragents_dockers/agents/tests/data_agent/test_tools.py create mode 100644 submodules/moragents_dockers/agents/tests/swap_agent/test_agent.py create mode 100644 submodules/moragents_dockers/agents/tests/swap_agent/test_tools.py delete mode 100644 submodules/moragents_dockers/frontend/components/HeaderBar/agentSelector.tsx create mode 100644 submodules/reward_check_agent_benchmarks/README.md create mode 100644 submodules/reward_check_agent_benchmarks/adapters/reward_check_adapter.py create mode 100644 submodules/reward_check_agent_benchmarks/benchmarks.py create mode 100644 submodules/reward_check_agent_benchmarks/config.py create mode 100644 submodules/reward_check_agent_benchmarks/helpers.py diff --git a/requirements.txt b/requirements.txt index f168009..70969cd 100644 --- a/requirements.txt +++ b/requirements.txt @@ -4,3 +4,4 @@ customtkinter requests setuptools pyinstaller +torch diff --git a/submodules/benchmarks/adapters/base_adapter.py b/submodules/benchmarks/adapters/base_adapter.py new file mode 100644 index 0000000..323f1be --- /dev/null +++ b/submodules/benchmarks/adapters/base_adapter.py @@ -0,0 +1,21 @@ +from abc import ABC, abstractmethod + +class BaseAdapter(ABC): + + @property + @abstractmethod + def name(self) -> str: + pass + + @abstractmethod + def get_price(self, coin_id: str) -> float: + pass + + def get_marketcap(self, coin_id: str) -> float: + pass + + def has_get_marketcap(self) -> bool: + pass + + def has_get_price(self) -> bool: + pass diff --git a/submodules/benchmarks/adapters/coingecko_adapter.py b/submodules/benchmarks/adapters/coingecko_adapter.py new file mode 100644 index 0000000..9327118 --- /dev/null +++ b/submodules/benchmarks/adapters/coingecko_adapter.py @@ -0,0 +1,30 @@ +import requests +from .base_adapter import BaseAdapter + +# defillama and coingecko share the same identifiers +class CoingeckoAdapter(BaseAdapter): + + @property + def name(self) -> str: + return "Coingecko" + + def get_price(self, coingecko_id: str) -> float: + url = f"https://api.coingecko.com/api/v3/simple/price" + params = {'ids': coingecko_id, 'vs_currencies': 'usd'} + response = requests.get(url, params=params) + response.raise_for_status() + return response.json()[coingecko_id]['usd'] + + def get_marketcap(self, coin_id: str) -> float: + request_url = f"https://api.coingecko.com/api/v3/coins/{coin_id}" + response = requests.get(request_url) + response.raise_for_status() + data = response.json() + marketcap = data['market_data']['market_cap']['usd'] + return marketcap + + def has_get_marketcap(self) -> bool: + return True + + def has_get_price(self) -> bool: + return True diff --git a/submodules/benchmarks/adapters/defillama_adapter.py b/submodules/benchmarks/adapters/defillama_adapter.py new file mode 100644 index 0000000..21bac2f --- /dev/null +++ b/submodules/benchmarks/adapters/defillama_adapter.py @@ -0,0 +1,22 @@ +import requests +from .base_adapter import BaseAdapter + +class DefillamaAdapter(BaseAdapter): + + @property + def name(self) -> str: + return "Defillama" + + def get_price(self, coingecko_id: str) -> float: + request_url = f"https://coins.llama.fi/prices/current/coingecko:{coingecko_id}" + response = requests.get(request_url) + response.raise_for_status() + data = response.json() + price = data['coins'][f'coingecko:{coingecko_id}']['price'] + return price + + def has_get_marketcap(self) -> bool: + return False + + def has_get_price(self) -> bool: + return True \ No newline at end of file diff --git a/submodules/benchmarks/benchmarks.py b/submodules/benchmarks/benchmarks.py new file mode 100644 index 0000000..d239015 --- /dev/null +++ b/submodules/benchmarks/benchmarks.py @@ -0,0 +1,83 @@ +import time +import argparse +from helpers import ask_data_agent, compare_usd_values, extract_agent_usd_value +from config import coins, price_prompts, mcap_prompts, price_error_tolerance, mcap_error_tolerance, loop_delay +from adapters.coingecko_adapter import CoingeckoAdapter +from adapters.defillama_adapter import DefillamaAdapter + +all_adapters = [ + DefillamaAdapter(), + CoingeckoAdapter() +] + +parser = argparse.ArgumentParser(description="Specify the type of prompts to use (price or mcap).") +parser.add_argument('type', choices=['price', 'mcap'], help="Type of prompts to use") +args = parser.parse_args() + +benchmark_type = args.type + +if benchmark_type == 'price': + prompts = price_prompts + error_tolerance = price_error_tolerance +elif benchmark_type == 'mcap': + prompts = mcap_prompts + error_tolerance = mcap_error_tolerance +else: + raise ValueError("Invalid benchmark type") + +total_checks = 0 +failures = [] + +print('benchmark type', benchmark_type) +try: + print() + for prompt in prompts: + for coin in coins: + coingecko_id = coin["coingecko_id"] + for name_variation in coin["name_variations"]: + agent_prompt = prompt.format(name_variation) + print(f"{agent_prompt}") + try: + agent_response = ask_data_agent(prompt.format(name_variation)) + agent_usd_value = extract_agent_usd_value(agent_response) + print(f"{agent_usd_value}") + time.sleep(loop_delay) # the agent gets rate limitted by coingecko if we call it too fast + except: + result = f"FAIL DataAgent: {agent_prompt}" + print(result) + print() + total_checks += 1 + failures.append(result) + continue + + for adapter in all_adapters: + print(f"Checking {adapter.name}...") + try: + if benchmark_type == "price" and adapter.has_get_price(): + benchmark_value = adapter.get_price(coingecko_id) + elif benchmark_type == "mcap" and adapter.has_get_marketcap(): + benchmark_value = adapter.get_marketcap(coingecko_id) + else: + continue + result = compare_usd_values(agent_usd_value, adapter, coingecko_id, name_variation, benchmark_value, error_tolerance, failures) + except Exception as e: + result = f"FAIL {adapter.name}: {coingecko_id} ({e})" + failures.append(result) + + print(result) + total_checks += 1 + print() + + # Summarize Results + passed_checks = total_checks - len(failures) + print() + print(f"{passed_checks} / {total_checks} Benchmarks passed") + + if len(failures) > 0: + print("Failures:") + for failure in failures: + print(failure) + +except Exception as e: + print(f"Unexpected error: {e}") + exit(1) diff --git a/submodules/benchmarks/config.py b/submodules/benchmarks/config.py new file mode 100644 index 0000000..34a764e --- /dev/null +++ b/submodules/benchmarks/config.py @@ -0,0 +1,270 @@ +loop_delay = 10 # prevent rate limiting + +price_error_tolerance = 0.01 # 1% +mcap_error_tolerance = 0.01 # 1% + +coins = [ + { + "coingecko_id": "bitcoin", + "name_variations": ["Bitcoin", "Bitcoins", "BITcoin", "BTC"] + }, + { + "coingecko_id": "ethereum", + "name_variations": ["Ether", "Ethereum", "Ethers", "ETH"] + }, + { + "coingecko_id": "tether", + "name_variations": ["Tether", "USDT", "USDTether", "TetherUSD"] + }, + { + "coingecko_id": "binancecoin", + "name_variations": ["BNB", "Binance Smart Chain", "Binancecoin", "Binance coin"] + }, + { + "coingecko_id": "solana", + "name_variations": ["Solana", "SOL", "Solanacoin"] + }, + { + "coingecko_id": "usd-coin", + "name_variations": ["USDC", "USDCoin", "USD coin", "CUSD"] + }, + { + "coingecko_id": "staked-ether", + "name_variations": ["Lido Staked Ether", "Lido Ether", "Lido Eth", "Staked Ether"] + }, + { + "coingecko_id": "ripple", + "name_variations": ["XRP", "Ripple", "XRPcoin", "XRP coin"] + }, + { + "coingecko_id": "the-open-network", + "name_variations": ["Toncoin", "TON", "the open network", "open network coin"] + }, + { + "coingecko_id": "dogecoin", + "name_variations": ["Dogecoin", "DOGE", "dogcoin", "doge coin"] + }, + { + "coingecko_id": "cardano", + "name_variations": ["Cardano", "ADA", "cardano coin"] + }, + { + "coingecko_id": "tron", + "name_variations": ["Tron", "TRX", "troncoin", "trxcoin"] + }, + { + "coingecko_id": "avalanche-2", + "name_variations": ["Avalanche", "AVAX", "Avalancecoin", "Avaxcoin"] + }, + { + "coingecko_id": "shiba-inu", + "name_variations": ["Shiba Inu", "Shiba", "SHIB", "shibacoin", "Shiba inu coin"] + }, + { + "coingecko_id": "wrapped-bitcoin", + "name_variations": ["Wrapped Bitcoin", "WBTC", "wrapped btc", "wrapped BITcoin"] + }, + { + "coingecko_id": "polkadot", + "name_variations": ["Polkadot", "DOT", "polkadotcoin", "polka dot coin", "polka coin"] + }, + { + "coingecko_id": "chainlink", + "name_variations": ["Chainlink", "LINK", "Chainlinkcoin", "Linkcoin"] + }, + { + "coingecko_id": "bitcoin-cash", + "name_variations": ["Bitcoin Cash", "BCH", "BTC cash", "BCHcoin"] + }, + { + "coingecko_id": "uniswap", + "name_variations": ["Uniswap", "UNI", "Unicoin", "Uniswap coin"] + }, + { + "coingecko_id": "leo-token", + "name_variations": ["LEO token", "LEO", "leotoken", "leocoin"] + }, + { + "coingecko_id": "dai", + "name_variations": ["Dai", "Daicoin", "DaiUSD"] + }, + { + "coingecko_id": "near", + "name_variations": ["Near Protocol", "NEAR", "Nearcoin"] + }, + { + "coingecko_id": "litecoin", + "name_variations": ["Litecoin", "LTC", "LTCcoin", "lightcoin"] + }, + { + "coingecko_id": "matic-network", + "name_variations": ["Polygon", "Matic", "MATIC", "Polygoncoin", "Maticcoin"] + }, + { + "coingecko_id": "wrapped-eeth", + "name_variations": ["Wrapped eETH", "eETH", "WEETH", "eETHcoin", "WEETHcoin"] + }, + { + "coingecko_id": "kaspa", + "name_variations": ["Kaspa", "KAS", "Kaspacoin", "Kascoin"] + }, + { + "coingecko_id": "pepe", + "name_variations": ["Pepe", "Pepecoin"] + }, + { + "coingecko_id": "ethena-usde", + "name_variations": ["Ethena", "USDE", "Ethena USD", "Ethenacoin", "USDEcoin"] + }, + { + "coingecko_id": "internet-computer", + "name_variations": ["Internet Computer", "ICP", "ICPcoin", "InternetComputercoin"] + }, + { + "coingecko_id": "renzo-restaked-eth", + "name_variations": ["Renzo Restaked ETH", "Renzo Restaked Ethereum", "Renzocoin", "RenzoEth"] + }, + { + "coingecko_id": "ethereum-classic", + "name_variations": ["Ethereum Classic", "Ether Classic", "ETH Classic", "ETC"] + }, + { + "coingecko_id": "fetch-ai", + "name_variations": [ + "Artificial Superintelligence Alliance", "FET", "FETcoin", "Fetch", + "Ocean Protocol", "Oceancoin", "Singularity", "Singularitycoin" + ] + }, + { + "coingecko_id": "monero", + "name_variations": ["Monero", "XMR", "Monerocoin", "XMRcoin"] + }, + { + "coingecko_id": "aptos", + "name_variations": ["Aptos", "APT", "Aptoscoin", "APTcoin"] + }, + { + "coingecko_id": "render-token", + "name_variations": ["Render", "RNDR", "Rendercoin", "RNDRcoin", "Render token"] + }, + { + "coingecko_id": "stellar", + "name_variations": ["Stellar", "XLM", "Stellarcoin", "XLMcoin"] + }, + { + "coingecko_id": "hedera-hashgraph", + "name_variations": ["Hedera", "HBAR", "Hederacoin", "HBARcoin", "Hashgraph"] + }, + { + "coingecko_id": "cosmos", + "name_variations": ["Cosmos", "Cosmoshub", "ATOM", "Cosmoscoin", "ATOMCoin"] + }, + { + "coingecko_id": "arbitrum", + "name_variations": ["Arbitrum", "ARB", "Arbitrumcoin", "ARBCoin"] + }, + { + "coingecko_id": "crypto-com-chain", + "name_variations": ["Cronos", "CRO", "Cronoscoin", "CROCoin", "Crypto.com"] + }, + { + "coingecko_id": "mantle", + "name_variations": ["Mantle", "MNT", "Mantlecoin", "MNTCoin"] + }, + { + "coingecko_id": "blockstack", + "name_variations": ["Stacks", "STX", "Stackscoin", "STXCoin", "Blockstack"] + }, + { + "coingecko_id": "filecoin", + "name_variations": ["Filecoin", "FIL", "FILCoin", "File coin"] + }, + { + "coingecko_id": "okb", + "name_variations": ["OKB", "OKBCoin"] + }, + { + "coingecko_id": "maker", + "name_variations": ["Maker", "MKR", "MakerDAO", "Makercoin", "MRKCoin"] + }, + { + "coingecko_id": "vechain", + "name_variations": ["VeChain", "VET", "VeChaincoin", "VETCoin"] + }, + { + "coingecko_id": "injective-protocol", + "name_variations": ["Injective", "INJ", "Injectivecoin", "INJCoin", "Injective Protocol"] + }, + { + "coingecko_id": "immutable-x", + "name_variations": ["Immutable", "IMX", "Immutablecoin", "IMXCoin", "ImmutableX"] + }, + { + "coingecko_id": "first-digital-usd", + "name_variations": ["First Digital USD", "FDUSD", "FirstDigitalUSD", "FDUSDCoin"] + }, + { + "coingecko_id": "optimism", + "name_variations": ["Optimism", "OP", "Optimismcoin", "OPCoin"] + }, + { + "coingecko_id": "morpheusai", + "name_variations": ["Morpheus", "MorpheusAI", "MOR", "MORCoin"] + }, + { + "coingecko_id": "aave", + "name_variations": ["Aave", "Aavecoin"] + }, + { + "coingecko_id": "aavegotchi", + "name_variations": ["Aavegotchi", "Ghost", "Aavegotchicoin", "Ghostcoin", "GHST"] + }, + { + "coingecko_id": "thorchain", + "name_variations": ["Thor", "THORChain", "RUNE", "Thorcoin", "Runecoin"] + }, + { + "coingecko_id": "ethereum-name-service", + "name_variations": ["Ethereum Name Service", "ENS", "ENScoin"] + }, + { + "coingecko_id": "axie-infinity", + "name_variations": ["Axie Infinity", "AXS", "Axiecoin", "Axscoin"] + }, + { + "coingecko_id": "zombiecoin", + "name_variations": ["ZombieCoin", "Zombie", "ZMBCoin"] + }, + { + "coingecko_id": "elon-xmas", + "name_variations": ["Elon Xmas", "XMAS", "ElonXmascoin", "XMASCoin"] + }, + { + "coingecko_id": "neblio", + "name_variations": ["Neblio", "NEBL", "Nebliocoin", "NEBLCoin"] + }, + { + "coingecko_id": "shapeshift-fox-token", + "name_variations": ["ShapeShift FOX", "ShapeShift", "ShapeShiftCoin", "FOXCoin", "FOXToken"] + } +] + +price_prompts = [ + "What is the price of {}?", + "How much is one {} worth?", + "How much does one {} cost?", +] + +mcap_prompts = [ + "What is the market cap of {}?", + "What is the total market cap of {}?", + "What is the marketcap of {}?", + "What is the market capitalization of {}?", + "What is the value of all {}s?", +] + +# This is unused at the moment +tvl_prompts = [ + "What is the TVL of {}?", + "How much value is locked in {}?", +] \ No newline at end of file diff --git a/submodules/benchmarks/helpers.py b/submodules/benchmarks/helpers.py new file mode 100644 index 0000000..e50c767 --- /dev/null +++ b/submodules/benchmarks/helpers.py @@ -0,0 +1,54 @@ +import requests +import json +import re +from adapters.base_adapter import BaseAdapter + +url = 'http://127.0.0.1:8080/data_agent/' + +headers = { + 'Accept': 'application/json, text/plain, */*', + 'Accept-Language': 'en-US,en;q=0.9', + 'Connection': 'keep-alive', + 'Content-Type': 'application/json', + 'Origin': 'http://localhost:3333', + 'Referer': 'http://localhost:3333/', + 'Sec-Fetch-Dest': 'empty', + 'Sec-Fetch-Mode': 'cors', + 'Sec-Fetch-Site': 'cross-site', + 'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/126.0.0.0 Safari/537.36', + 'sec-ch-ua': '"Not/A)Brand";v="8", "Chromium";v="126", "Google Chrome";v="126"', + 'sec-ch-ua-mobile': '?0', + 'sec-ch-ua-platform': '"macOS"', +} + +def ask_data_agent(prompt: str): + payload = { + "prompt": { + "role": "user", + "content": prompt + } + } + + response = requests.post(url, headers=headers, data=json.dumps(payload)) + + result_content = response.json()['content'] + return result_content + +def extract_agent_usd_value(content: str): + match = re.search(r'\$\d+(?:,\d{3})*(?:\.\d{1,8})?', content) # 8 usd digits should be plenty + if match: + price_str = match.group(0).replace('$', '').replace(',', '') + return float(price_str) + raise ValueError("Could not extract a price from the agent response") + +def compare_usd_values(agent_value: float, adapter: BaseAdapter, coingecko_id: str, name_variation: str, benchmark_value: float, error_tolerance: float, failures: list): + difference = abs(agent_value - benchmark_value) + percent_difference = (difference / benchmark_value) * 100 + result_value = f"${benchmark_value:.8f}, {percent_difference:.2f}% off" + if percent_difference <= error_tolerance * 100: + result_message = f"PASS {adapter.name}. {result_value}" + else: + result_message = f"FAIL {adapter.name}. {result_value}" + failure_message = f"FAIL {adapter.name}. {result_value}. {coingecko_id}. {name_variation}" # so we have more information to summarize failures at the end + failures.append(result_message) + return result_message diff --git a/submodules/benchmarks/readme.md b/submodules/benchmarks/readme.md new file mode 100644 index 0000000..c8001ba --- /dev/null +++ b/submodules/benchmarks/readme.md @@ -0,0 +1,22 @@ +# Data Agent Benchmarking Tests + +## About + +- Measures how accurately the data agent responds for price & market cap vs benchmark values from coinecko, defillama, etc. + +- Generates agent prompts from values defined in `config.py` and validates them against each of the benchmark adapters. + +## Running + +## 0. Start [ DataAgent Docker Service](../../../../../Downloads/moragents-main/submodules/moragents_dockers/agents/src/data_agent/README.md) +## 1. Modify `config.py` with new prompts, coins & error tolerances +## 2. `cd submodules/benchmarks` +## 3. Run `pip install -r requirements.txt` +## 4. Run `python benchmarks.py price` for price benchmarks +## 5. Run `python benchmarks.py mcap` for market cap benchmarks + +## Considerations + +- The source of truth asset id is the coingecko id. Any new adapters will need some way of translating the coingecko id if they use something else. For example, the defillama adapter "just works" because they use coingecko ids. + +- Disabling coingecko adapter lets us reduce the `time.sleep()` in `benchmarks.py` and run much faster (rate limiting). diff --git a/submodules/benchmarks/requirements.txt b/submodules/benchmarks/requirements.txt new file mode 100644 index 0000000..663bd1f --- /dev/null +++ b/submodules/benchmarks/requirements.txt @@ -0,0 +1 @@ +requests \ No newline at end of file diff --git a/submodules/claim_agent_benchmarks/README.md b/submodules/claim_agent_benchmarks/README.md new file mode 100644 index 0000000..16c72ce --- /dev/null +++ b/submodules/claim_agent_benchmarks/README.md @@ -0,0 +1,23 @@ +# Benchmarking & Testing Reward Claiming Agent Guide + +NOTE: this is made for the router compatible moragents repo + +## How to Run the Tests: +1) In the parent directory: +- ```cd submodules/moragents_dockers/agents``` + +2) ```docker build -t agent .``` + +2. NOTE: If you are using Apple Silicon then you may experience problems due to the base image not being build for arm64. We have included a separate Dockerfile in order to deal with this issue, run: + +- ```docker build . -t agent -f Dockerfile-apple``` + +3) To run the agent: + +- ```docker run --name agent -p 5000:5000 agent``` + +4) Check if the agent is up and running on docker or not +5) If it is running, navigate to `submodules/claim_agent_benchmarks` +6) run `pytest benchmarks.py` + +NOTE: If needed use your own alchemy mainnet RPC instead of the default cloudflare one in `config.py` and please `pip install pytest web3` \ No newline at end of file diff --git a/submodules/claim_agent_benchmarks/adapters/claim_adapter.py b/submodules/claim_agent_benchmarks/adapters/claim_adapter.py new file mode 100644 index 0000000..97afe42 --- /dev/null +++ b/submodules/claim_agent_benchmarks/adapters/claim_adapter.py @@ -0,0 +1,14 @@ +import requests +import json + +class ClaimAdapter: + def __init__(self, url, headers): + self.url = url + self.headers = headers + + def ask_agent(self, payload): + response = requests.post(self.url, headers=self.headers, data=json.dumps(payload)) + if response.status_code == 200: + return response.json() + else: + raise Exception(f"Request failed with status code {response.status_code}: {response.text}") diff --git a/submodules/claim_agent_benchmarks/benchmarks.py b/submodules/claim_agent_benchmarks/benchmarks.py new file mode 100644 index 0000000..cc5e39f --- /dev/null +++ b/submodules/claim_agent_benchmarks/benchmarks.py @@ -0,0 +1,30 @@ +import pytest +from helpers import request_claim, provide_receiver_address, confirm_transaction +from config import Config + + +def test_claim_process(): + for i, wallet_data in enumerate(Config.WALLET_ADDRESSES): + wallet_address = wallet_data["wallet"] + receiver_address = wallet_data["receiver"] + + print(f"Testing for wallet {wallet_address} (Test {i + 1})") + + # Step 1: Request to claim rewards + response = request_claim(wallet_address) + assert "Please provide the receiver address" in response['content'] + print(f"Step 1 passed for wallet {wallet_address}: Request to claim MOR rewards") + + # Step 2: Provide the receiver address + response = provide_receiver_address(wallet_address, receiver_address) + assert "Please confirm if you want to proceed" in response['content'] + print(f"Step 2 passed for wallet {wallet_address}: Provided receiver address") + + # Step 3: Confirm the transaction + response = confirm_transaction(wallet_address) + assert "Transaction data prepared" in response['content'] + print(f"Step 3 passed for wallet {wallet_address}: Transaction confirmed") + + +if __name__ == "__main__": + pytest.main() diff --git a/submodules/claim_agent_benchmarks/config.py b/submodules/claim_agent_benchmarks/config.py new file mode 100644 index 0000000..36fa731 --- /dev/null +++ b/submodules/claim_agent_benchmarks/config.py @@ -0,0 +1,14 @@ +class Config: + URL = 'http://127.0.0.1:5000/' + HEADERS = {'Content-Type': 'application/json'} + + # Test wallet addresses and receiver addresses + WALLET_ADDRESSES = [ + {"wallet": "0x48d0EAc727A7e478f792F16527012452a000f2bd", + "receiver": "0x48d0EAc727A7e478f792F16527012452a000f2bd"} + ] + + PROMPTS = { + "claim_request": "I want to claim my MOR rewards from pool id 1", + "proceed": "proceed" + } diff --git a/submodules/claim_agent_benchmarks/helpers.py b/submodules/claim_agent_benchmarks/helpers.py new file mode 100644 index 0000000..2cfe5d6 --- /dev/null +++ b/submodules/claim_agent_benchmarks/helpers.py @@ -0,0 +1,25 @@ +from config import Config +from adapters.claim_adapter import ClaimAdapter + +claim_adapter = ClaimAdapter(Config.URL, Config.HEADERS) + +def request_claim(wallet_address): + payload = { + "prompt": {"role": "user", "content": Config.PROMPTS["claim_request"]}, + "wallet_address": wallet_address + } + return claim_adapter.ask_agent(payload) + +def provide_receiver_address(wallet_address, receiver_address): + payload = { + "prompt": {"role": "user", "content": receiver_address}, + "wallet_address": wallet_address + } + return claim_adapter.ask_agent(payload) + +def confirm_transaction(wallet_address): + payload = { + "prompt": {"role": "user", "content": Config.PROMPTS["proceed"]}, + "wallet_address": wallet_address + } + return claim_adapter.ask_agent(payload) diff --git a/submodules/claim_agent_benchmarks/user_flow.py b/submodules/claim_agent_benchmarks/user_flow.py new file mode 100644 index 0000000..f7482df --- /dev/null +++ b/submodules/claim_agent_benchmarks/user_flow.py @@ -0,0 +1,46 @@ +import requests +import json + +url = 'http://127.0.0.1:5000/' + +headers = { + 'Content-Type': 'application/json', +} + +def ask_agent(payload): + response = requests.post(url, headers=headers, data=json.dumps(payload)) + + if response.status_code == 200: + print("Raw response data:") + print(response.text) + return response.json() + else: + print("Raw error data:") + print(response.text) + raise Exception(f"Request failed with status code {response.status_code}") + +# Step 1: Request to claim MOR rewards +payload = { + "prompt": {"role": "user", "content": "I want to claim my MOR rewards from pool id 1"}, + "wallet_address": "0x48d0EAc727A7e478f792F16527012452a000f2bd" +} +response = ask_agent(payload) + +# Step 2: Provide the receiver address +receiver_address = "0x48d0EAc727A7e478f792F16527012452a000f2bd" +payload = { + "prompt": {"role": "user", "content": receiver_address}, + "wallet_address": "0x48d0EAc727A7e478f792F16527012452a000f2bd" +} +response = ask_agent(payload) + +# Step 3: Confirm the transaction +payload = { + "prompt": {"role": "user", "content": "proceed"}, + "wallet_address": "0x48d0EAc727A7e478f792F16527012452a000f2bd" +} +response = ask_agent(payload) + +# Final step: Print the final raw response after confirming +print("Final raw response data:") +print(json.dumps(response, indent=2)) diff --git a/submodules/moragents_dockers/README.md b/submodules/moragents_dockers/README.md index 7d8f158..f4ff09f 100644 --- a/submodules/moragents_dockers/README.md +++ b/submodules/moragents_dockers/README.md @@ -1,9 +1,22 @@ # Moragents -This repo contains multiple agents and a dapp that enables you to interact with the agents, all running locally and containerized with Docker. +## Overview +This project is a Flask-based AI chat application featuring intelligent responses from various language models and embeddings. It includes file uploading, cryptocurrency swapping, and a delegator system to manage multiple agents. The application, along with a dApp for agent interaction, runs locally and is containerized with Docker. -## Usage +## Pre-requisites + + +* [Download Ollama](https://ollama.com/ )for your operating system +* Then after finishing installation pull these two models: + +```ollama pull llama3``` + +```ollama pull nomic-embed-text``` + + +## Run with Docker Compose + Docker compose will build and run two containers. One will be for the agents, the other will be for the UI. ```docker-compose up``` @@ -17,6 +30,7 @@ Open in the browser: ```http://localhost:3333/``` Docker build will download the model. The first time that one of the agents are called, the model will be loaded into memory and this instance will be shared between all agents. ## Agents +Three agents are included: ### Data Agent @@ -41,9 +55,158 @@ A typical flow looks like this: - The agent requests any missing information, e.g. in this case the amount is missing - Once all the information hase been collected, the agent looks up the assets on the current chain, retrieves contract addresses and generates a quote if available. - The quote is shown to the user, who may either proceed or cancel -- If the user accepts the quote, the swap may proceed. The back-end will generate transactions which will be sent to the front-end to be signed by the user's wallet. +- If the user accepts the quote, the swap may proceed. The back-end will generate transactions which will be sent to the front-end to be signed by the user's wallet. - If the allowance for the token being sold is too low, an approval transaction will be generated first +## RAG Agent +This agent will answer questions about an uploaded PDF file. + + +# Delegator +The Delegator handles user queries by analyzing the prompt and delegating it to the appropriate agent. + +## API Endpoints + +1. **Chat Functionality** + - Endpoint: `POST /` + - Handles chat interactions, delegating to appropriate agents when necessary. + +2. **Message History** + - Endpoint: `GET /messages` + - Retrieves chat message history. + +3. **Clear Messages** + - Endpoint: `GET /clear_messages` + - Clears the chat message history. + +4. **Swap Operations** + - Endpoints: + - `POST /tx_status`: Check transaction status + - `POST /allowance`: Get allowance + - `POST /approve`: Approve transaction + - `POST /swap`: Perform swap + +5. **File Upload** + - Endpoint: `POST /upload` + - Handles file uploads for RAG (Retrieval-Augmented Generation) purposes. + + + +# Adding a New Agent + +## Overview + +Each agent is configured in the `config.py` file, which specifies the agent's path, class, and other details. + +## Steps to Add a New Agent + +### 1. Create a New Agent Folder + +1. **Create a new folder** in the `agents/src` directory for your new agent. +2. **Implement the agent logic** within this folder. Ensure that the agent class is defined and ready to handle the specific type of queries it is designed for. + +### 2. Update `config.py` + +1. **Open the `config.py` file** located in the `agents/src` directory. +2. **Add a new entry** in the `DELEGATOR_CONFIG` dictionary with the following details: + - `path`: The path to the agent's module. + - `class`: The class name of the agent. + - `detail`: A description of when to use this agent. + - `name`: A unique name for the agent. + - `upload`: A boolean indicating if the agent requires a file to be uploaded from the front-end before it should be called. + +#### Example: +```python:agents/src/config.py +DELEGATOR_CONFIG = { + "agents": [ + # ... existing agents ... + { + "path": "new_agent.src.agent", + "class": "NewAgent", + "description": "if the prompt is related to new functionality, choose new agent", + "name": "new agent", + "upload": false + } + ] +} +``` + + +### 3. Implement Agent Logic + +1. **Define the agent class** in the specified path. +2. **Ensure the agent can handle the queries** it is designed for. + +#### Example: +```python:agents/src/new_agent/src/agent.py +class NewAgent: + def __init__(self, agent_info, llm, llm_ollama, embeddings, flask_app): + """ + Initialize the NewAgent. + + Parameters: + - agent_info (dict): Configuration details for the agent. + - llm (object): The main language model instance. + - llm_ollama (object): An additional language model instance from Ollama. + - embeddings (object): Embedding model for handling vector representations. + - flask_app (Flask): The Flask application instance. + """ + self.agent_info = agent_info + self.llm = llm + self.llm_ollama = llm_ollama + self.embeddings = embeddings + self.flask_app = flask_app + + def chat(self, request): + # Implement chat logic + pass + + # Add other methods as needed +``` +### 4. Handle Multi-Turn Conversations + +Agents can handle multi-turn conversations by returning a next_turn_agent which indicates the name of the agent that should handle the next turn. + +#### Example: +```python +class NewAgent: + def __init__(self, agent_info, llm, llm_ollama, embeddings, flask_app): + """ + Initialize the NewAgent. + + Parameters: + - agent_info (dict): Configuration details for the agent. + - llm (object): The main language model instance. + - llm_ollama (object): An additional language model instance. + - embeddings (object): Embedding model for handling vector representations. + - flask_app (Flask): The Flask application instance. + """ + self.agent_info = agent_info + self.llm = llm + self.llm_ollama = llm_ollama + self.embeddings = embeddings + self.flask_app = flask_app + def chat(self, request, user_id): + # Process the query and determine the next agent + next_turn_agent = self.agent_info["name"] + + # Generate response where we want to initiate a multi-turn conversation with the same agent. + + return response, next_turn_agent + +``` + +### 5. Integration + +The `Delegator` will automatically: +- Import the agent module. +- Instantiate the agent class. +- Add the agent to its internal dictionary. + +### 6. Test the New Agent + +1. **Ensure the `Delegator` can properly route requests** to the new agent. +2. **Test the agent's functionality** through the chat interface. diff --git a/submodules/moragents_dockers/agents/Dockerfile b/submodules/moragents_dockers/agents/Dockerfile index adf0198..060da90 100644 --- a/submodules/moragents_dockers/agents/Dockerfile +++ b/submodules/moragents_dockers/agents/Dockerfile @@ -1,4 +1,4 @@ -FROM python:3.10-slim-buster +FROM --platform=linux/amd64 python:3.10-bullseye # Set the working directory in the container WORKDIR /app diff --git a/submodules/moragents_dockers/agents/Dockerfile-apple b/submodules/moragents_dockers/agents/Dockerfile-apple index 5dc0620..ef7ee27 100644 --- a/submodules/moragents_dockers/agents/Dockerfile-apple +++ b/submodules/moragents_dockers/agents/Dockerfile-apple @@ -1,4 +1,4 @@ -FROM arm64v8/python:3.10-bullseye +FROM --platform=linux/arm64 python:3.10-bullseye # Set the working directory in the container WORKDIR /app diff --git a/submodules/moragents_dockers/agents/pytest.ini b/submodules/moragents_dockers/agents/pytest.ini new file mode 100644 index 0000000..72a01cc --- /dev/null +++ b/submodules/moragents_dockers/agents/pytest.ini @@ -0,0 +1,3 @@ +[pytest] +pythonpath = . +addopts = --import-mode=importlib -p no:warnings \ No newline at end of file diff --git a/submodules/moragents_dockers/agents/requirements.txt b/submodules/moragents_dockers/agents/requirements.txt index 08ee92b..0147886 100644 --- a/submodules/moragents_dockers/agents/requirements.txt +++ b/submodules/moragents_dockers/agents/requirements.txt @@ -1,11 +1,16 @@ -llama-cpp-python -transformers -sentencepiece -protobuf -scikit-learn -huggingface-hub +llama-cpp-python==0.2.65 +transformers==4.43.3 +sentencepiece==0.2.0 +protobuf==5.27.2 +scikit-learn==1.5.1 +huggingface-hub==0.24.3 flask==2.2.2 Werkzeug==2.2.2 -gradio > /dev/null -flask-cors -web3 \ No newline at end of file +flask-cors==4.0.1 +web3==6.20.1 +pymupdf==1.22.5 +faiss-cpu==1.8.0.post1 +langchain-text-splitters==0.2.2 +langchain-core==0.2.24 +langchain-community==0.2.10 +torch \ No newline at end of file diff --git a/submodules/moragents_dockers/agents/src/README-UI.md b/submodules/moragents_dockers/agents/src/README-UI.md deleted file mode 100644 index eef241b..0000000 --- a/submodules/moragents_dockers/agents/src/README-UI.md +++ /dev/null @@ -1,65 +0,0 @@ -#Documentation for building a UI with our swap agent - -First you need to build the image - -```docker build -t agent .``` - -Then Run the image by exposing port 5000 - -```docker run --name agent -p 5000:5000 agent``` - - -And then once it is running we will have 2 endpoints - -first endpoint is for chat -### chat endpoint = 'http://127.0.0.1:5000/' - -* The chat api accepts inputs in openai chat compelition format and - we need to send the messages as a list - - ```messages = {"role":"user","content":"what is the price of bitcoin?"}``` - -### Usage - - ```sh - url = 'http://127.0.0.1:5000/ - message={"role":"user","content":"what is the price of bitcoin?"} - data = {'prompt':message} - response = requests.post(url, json=data) - ``` - -* The response will also be in this format - ```sh - response = {"role":"assistant","content":"The price of bitcoin is 62,000$"} - ``` - -* Then you can continue the conversation - - - ### Messages endpoint = 'http://127.0.0.1:5000/messages' - Since now the conversation is history is stored in the backend you can retrieve it using this api - # Usage - - - ```sh - url = 'http://127.0.0.1:5000/messages' - response = requests.get(url) - - result=response.text - ``` - - This will return a message to be displayed on the ui - - ```sh - - {"messages":[{"content":"what is the price of bitcoin?","role":"user"},{"content":"The price of itcoin is 62,000$","role":"assistant"} - - ``` - - Then we can get the conversation history by using the message key result["messages"] - - - - - - diff --git a/submodules/moragents_dockers/agents/src/app.py b/submodules/moragents_dockers/agents/src/app.py index 26ddb8e..07f0d18 100644 --- a/submodules/moragents_dockers/agents/src/app.py +++ b/submodules/moragents_dockers/agents/src/app.py @@ -1,10 +1,14 @@ -from flask_cors import CORS -from flask import Flask, request, jsonify +import json +import os +import logging from config import Config -from swap_agent.src import agent as swap_agent -from data_agent.src import agent as data_agent from llama_cpp import Llama +from flask_cors import CORS +from flask import Flask, request, jsonify +from langchain_community.llms import Ollama +from delegator import Delegator from llama_cpp.llama_tokenizer import LlamaHFTokenizer +from langchain_community.embeddings import OllamaEmbeddings def load_llm(): @@ -19,54 +23,104 @@ def load_llm(): return llm -llm=load_llm() +llm = load_llm() app = Flask(__name__) CORS(app) -@app.route('/swap_agent/', methods=['POST']) -def swap_agent_chat(): - global llm - return swap_agent.chat(request, llm) +upload_state = False +UPLOAD_FOLDER = os.path.join(os.getcwd(), 'uploads') +os.makedirs(UPLOAD_FOLDER, exist_ok=True) +app.config['UPLOAD_FOLDER'] = UPLOAD_FOLDER +app.config['MAX_CONTENT_LENGTH'] = Config.MAX_UPLOAD_LENGTH + +llm_ollama = Ollama(model="llama3", base_url=Config.OLLAMA_URL) +embeddings = OllamaEmbeddings(model="nomic-embed-text", base_url=Config.OLLAMA_URL) + +logging.basicConfig(level=logging.DEBUG) + +delegator = Delegator(Config.DELEGATOR_CONFIG, llm, llm_ollama, embeddings, app) +messages = [{'role': "assistant", "content": "This highly experimental chatbot is not intended for making important decisions, and its responses are generated based on incomplete data and algorithms that may evolve rapidly. By using this chatbot, you acknowledge that you use it at your own discretion and assume all risks associated with its limitations and potential errors."}] + +next_turn_agent = None + + +@app.route('/', methods=['POST']) +def chat(): + global next_turn_agent, messages + data = request.get_json() + try: + if 'prompt' in data: + prompt = data['prompt'] + messages.append(prompt) + if not next_turn_agent: + result = delegator.get_delegator_response(prompt, upload_state) + if "tool_calls" not in result: + messages.append({"role": "assistant", "content": result["content"]}) + return jsonify({"role": "assistant", "content": result["content"]}) + else: + if not result["tool_calls"]: + messages.append({"role": "assistant", "content": result["content"]}) + return jsonify({"role": "assistant", "content": result["content"]}) + res = json.loads(result['tool_calls'][0]['function']['arguments']) + response_swap = delegator.delegate_chat(res["next"], request) + if "next_turn_agent" in response_swap.keys(): + next_turn_agent = response_swap["next_turn_agent"] + response = {"role": response_swap["role"], "content": response_swap["content"]} + else: + response_swap = delegator.delegate_chat(next_turn_agent, request) + next_turn_agent = response_swap["next_turn_agent"] + response = {"role": response_swap["role"], "content": response_swap["content"]} + messages.append(response) + return jsonify(response) + except Exception as e: + return jsonify({"Error": str(e)}), 500 -@app.route('/swap_agent/tx_status', methods=['POST']) + +@app.route('/tx_status', methods=['POST']) def swap_agent_tx_status(): - return swap_agent.tx_status(request) - -@app.route('/swap_agent/messages', methods=['GET']) -def swap_agent_messages(): - return swap_agent.get_messages() - -@app.route('/swap_agent/clear_messages', methods=['GET']) -def swap_agent_clear_messages(): - return swap_agent.clear_messages() - -@app.route('/swap_agent/allowance', methods=['POST']) + global messages + response = delegator.delegate_route("crypto swap agent", request, "tx_status") + messages.append(response) + return jsonify(response) + + +@app.route('/messages', methods=['GET']) +def get_messages(): + global messages + return jsonify({"messages": messages}) + + +@app.route('/clear_messages', methods=['GET']) +def clear_messages(): + global messages + messages = [{'role': "assistant", "content": "This highly experimental chatbot is not intended for making important decisions, and its responses are generated based on incomplete data and algorithms that may evolve rapidly. By using this chatbot, you acknowledge that you use it at your own discretion and assume all risks associated with its limitations and potential errors."}] + return jsonify({"response": "successfully cleared message history"}) + + +@app.route('/allowance', methods=['POST']) def swap_agent_allowance(): - return swap_agent.get_allowance(request) - -@app.route('/swap_agent/approve', methods=['POST']) + return delegator.delegate_route("crypto swap agent", request, "get_allowance") + + +@app.route('/approve', methods=['POST']) def swap_agent_approve(): - return swap_agent.approve(request) - -@app.route('/swap_agent/swap', methods=['POST']) -def swap_agent_swap(): - return swap_agent.swap(request) + return delegator.delegate_route("crypto swap agent", request, "approve") + -@app.route('/data_agent/', methods=['POST']) -def data_agent_chat(): - global llm - return data_agent.chat(request, llm) +@app.route('/swap', methods=['POST']) +def swap_agent_swap(): + return delegator.delegate_route("crypto swap agent", request, "swap") -@app.route('/data_agent/messages', methods=['GET']) -def data_agent_messages(): - return data_agent.get_messages() +@app.route('/upload', methods=['POST']) +def rag_agent_upload(): + global messages, upload_state + response = delegator.delegate_route("rag agent", request, "upload_file") + messages.append(response) + upload_state = True + return jsonify(response) -@app.route('/data_agent/clear_messages', methods=['GET']) -def data_agent_clear_messages(): - return data_agent.clear_messages() - if __name__ == '__main__': - app.run(host='0.0.0.0', port=5000, debug=True) \ No newline at end of file + app.run(host='0.0.0.0', port=5000, debug=True) diff --git a/submodules/moragents_dockers/agents/src/claim_agent/src/agent.py b/submodules/moragents_dockers/agents/src/claim_agent/src/agent.py new file mode 100644 index 0000000..098dc9b --- /dev/null +++ b/submodules/moragents_dockers/agents/src/claim_agent/src/agent.py @@ -0,0 +1,81 @@ +import json +from claim_agent.src import tools +from claim_agent.src.config import Config + +class ClaimAgent: + def __init__(self, agent_info, llm, llm_ollama, embeddings, flask_app): + self.agent_info = agent_info + self.llm = llm + self.tools_provided = tools.get_tools() + self.conversation_state = {} + + def get_response(self, message, wallet_address): + if wallet_address not in self.conversation_state: + self.conversation_state[wallet_address] = {"state": "initial"} + + state = self.conversation_state[wallet_address]["state"] + + if state == "initial": + rewards = { + 0: tools.get_current_user_reward(wallet_address, 0), + 1: tools.get_current_user_reward(wallet_address, 1) + } + available_rewards = {pool: amount for pool, amount in rewards.items() if amount > 0} + + if available_rewards: + self.conversation_state[wallet_address]["available_rewards"] = available_rewards + self.conversation_state[wallet_address]["state"] = "awaiting_receiver" + pools_str = " and ".join([f"pool {pool}" for pool in available_rewards.keys()]) + amounts_str = " and ".join( + [f"{amount} MOR in pool {pool}" for pool, amount in available_rewards.items()]) + return f"You have rewards available in {pools_str}: {amounts_str}. Please provide the receiver address on Arbitrum where you want to receive these rewards.", "assistant", self.agent_info["name"] + else: + return f"No rewards found for your wallet address {wallet_address} in either pool. Claim cannot be processed.", "assistant", None + + elif state == "awaiting_receiver": + if message[-1]['content'].startswith('0x') and len(message[-1]['content']) == 42: + receiver_address = message[-1]['content'] + self.conversation_state[wallet_address]["receiver_address"] = receiver_address + self.conversation_state[wallet_address]["state"] = "awaiting_confirmation" + return self.prepare_transactions(wallet_address) + else: + return "Please provide a valid Ethereum address to receive your rewards.", "assistant", self.agent_info["name"] + + elif state == "awaiting_confirmation": + user_input = message[-1]['content'].lower() + if any(word in user_input for word in ['yes', 'proceed', 'confirm', 'claim']): + transactions = self.conversation_state[wallet_address]["transactions"] + tx_data_str = json.dumps(transactions, indent=2) + return f"Transaction data prepared for signing:\n\n{tx_data_str}", "assistant", None + else: + return "Please confirm if you want to proceed with the claim by saying 'yes', 'proceed', 'confirm', or 'claim'.", "assistant", self.agent_info["name"] + + return "I'm sorry, I didn't understand that. Can you please rephrase your request?", "assistant", self.agent_info["name"] + + def prepare_transactions(self, wallet_address): + available_rewards = self.conversation_state[wallet_address]["available_rewards"] + receiver_address = self.conversation_state[wallet_address]["receiver_address"] + transactions = [] + + for pool_id in available_rewards.keys(): + try: + tx_data = tools.prepare_claim_transaction(pool_id, receiver_address) + transactions.append({"pool": pool_id, "transaction": tx_data}) + except Exception as e: + return f"Error preparing transaction for pool {pool_id}: {str(e)}", "assistant", None + + self.conversation_state[wallet_address]["transactions"] = transactions + return f"Transactions prepared for claiming rewards from {len(transactions)} pool(s) to receiver address {receiver_address}. Please confirm if you want to proceed.", "assistant", self.agent_info["name"] + + def chat(self, request): + try: + data = request.get_json() + if 'prompt' in data and 'wallet_address' in data: + prompt = data['prompt'] + wallet_address = data['wallet_address'] + response, role, next_turn_agent = self.get_response([prompt], wallet_address) + return {"role": role, "content": response, "next_turn_agent": next_turn_agent} + else: + return {"error": "Missing required parameters"}, 400 + except Exception as e: + return {"Error": str(e)}, 500 \ No newline at end of file diff --git a/submodules/moragents_dockers/agents/src/claim_agent/src/config.py b/submodules/moragents_dockers/agents/src/claim_agent/src/config.py new file mode 100644 index 0000000..ed6bd89 --- /dev/null +++ b/submodules/moragents_dockers/agents/src/claim_agent/src/config.py @@ -0,0 +1,58 @@ +import logging + +# Logging configuration +logging.basicConfig(level=logging.INFO) + +# Configuration object +class Config: + + WEB3RPCURL = { + "1": "https://cloudflare-eth.com" + } + MINT_FEE = 0.001 # in ETH + + DISTRIBUTION_PROXY_ADDRESS = "0x47176B2Af9885dC6C4575d4eFd63895f7Aaa4790" + DISTRIBUTION_ABI = [ + { + "inputs": [ + { + "internalType": "uint256", + "name": "poolId_", + "type": "uint256" + }, + { + "internalType": "address", + "name": "receiver_", + "type": "address" + } + ], + "name": "claim", + "outputs": [], + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "poolId_", + "type": "uint256" + }, + { + "internalType": "address", + "name": "user_", + "type": "address" + } + ], + "name": "getCurrentUserReward", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + } + ] diff --git a/submodules/moragents_dockers/agents/src/claim_agent/src/tools.py b/submodules/moragents_dockers/agents/src/claim_agent/src/tools.py new file mode 100644 index 0000000..bee91c6 --- /dev/null +++ b/submodules/moragents_dockers/agents/src/claim_agent/src/tools.py @@ -0,0 +1,91 @@ +from web3 import Web3 +from claim_agent.src.config import Config + +def get_current_user_reward(wallet_address, pool_id): + web3 = Web3(Web3.HTTPProvider(Config.WEB3RPCURL["1"])) + distribution_contract = web3.eth.contract( + address=web3.to_checksum_address(Config.DISTRIBUTION_PROXY_ADDRESS), + abi=Config.DISTRIBUTION_ABI + ) + + try: + if not web3.is_connected(): + raise Exception("Unable to connect to Ethereum network") + + reward = distribution_contract.functions.getCurrentUserReward( + pool_id, + web3.to_checksum_address(wallet_address) + ).call() + formatted_reward = web3.from_wei(reward, 'ether') + return round(formatted_reward, 4) + except Exception as e: + raise Exception(f"Error occurred while fetching the reward: {str(e)}") + +def prepare_claim_transaction(pool_id, wallet_address): + try: + web3 = Web3(Web3.HTTPProvider(Config.WEB3RPCURL["1"])) + contract = web3.eth.contract( + address=web3.to_checksum_address(Config.DISTRIBUTION_PROXY_ADDRESS), + abi=Config.DISTRIBUTION_ABI + ) + tx_data = contract.encode_abi(fn_name="claim", args=[pool_id, web3.to_checksum_address(wallet_address)]) + mint_fee = web3.to_wei(Config.MINT_FEE, 'ether') + estimated_gas = contract.functions.claim(pool_id, web3.to_checksum_address(wallet_address)).estimate_gas({ + 'from': web3.to_checksum_address(wallet_address), + 'value': mint_fee + }) + return { + "to": Config.DISTRIBUTION_PROXY_ADDRESS, + "data": tx_data, + "value": str(mint_fee), + "gas": str(estimated_gas), + "chainId": "1" + } + except Exception as e: + raise Exception(f"Failed to prepare claim transaction: {str(e)}") + +def get_tools(): + return [ + { + "type": "function", + "function": { + "name": "get_current_user_reward", + "description": "Fetch the token amount of currently accrued MOR rewards for a user address from a specific pool", + "parameters": { + "type": "object", + "properties": { + "wallet_address": { + "type": "string", + "description": "The wallet address to check rewards for" + }, + "pool_id": { + "type": "integer", + "description": "The ID of the pool to check rewards from" + } + }, + "required": ["wallet_address", "pool_id"] + } + } + }, + { + "type": "function", + "function": { + "name": "prepare_claim_transaction", + "description": "Prepare a transaction to claim rewards", + "parameters": { + "type": "object", + "properties": { + "pool_id": { + "type": "integer", + "description": "The ID of the pool to claim from" + }, + "wallet_address": { + "type": "string", + "description": "The wallet address to claim rewards for" + } + }, + "required": ["pool_id", "wallet_address"] + } + } + } + ] \ No newline at end of file diff --git a/submodules/moragents_dockers/agents/src/config.py b/submodules/moragents_dockers/agents/src/config.py index 067d58d..afba529 100644 --- a/submodules/moragents_dockers/agents/src/config.py +++ b/submodules/moragents_dockers/agents/src/config.py @@ -3,36 +3,53 @@ # Logging configuration logging.basicConfig(level=logging.INFO) + # Configuration object class Config: + # Model configuration MODEL_NAME = "meetkai/functionary-small-v2.4-GGUF" MODEL_REVISION = "functionary-small-v2.4.Q4_0.gguf" - MODEL_PATH = "model/"+MODEL_REVISION + MODEL_PATH = "model/" + MODEL_REVISION DOWNLOAD_DIR = "model" - # Data agent - COINGECKO_BASE_URL = "https://api.coingecko.com/api/v3" - DEFILLAMA_BASE_URL = "https://api.llama.fi" - PRICE_SUCCESS_MESSAGE = "The price of {coin_name} is ${price:,}" - PRICE_FAILURE_MESSAGE = "Failed to retrieve price. Please enter a valid coin name." - FLOOR_PRICE_SUCCESS_MESSAGE = "The floor price of {nft_name} is ${floor_price:,}" - FLOOR_PRICE_FAILURE_MESSAGE = "Failed to retrieve floor price. Please enter a valid NFT name." - TVL_SUCCESS_MESSAGE = "The TVL of {protocol_name} is ${tvl:,}" - TVL_FAILURE_MESSAGE = "Failed to retrieve TVL. Please enter a valid protocol name." - FDV_SUCCESS_MESSAGE = "The fully diluted valuation of {coin_name} is ${fdv:,}" - FDV_FAILURE_MESSAGE = "Failed to retrieve FDV. Please enter a valid coin name." - MARKET_CAP_SUCCESS_MESSAGE = "The market cap of {coin_name} is ${market_cap:,}" - MARKET_CAP_FAILURE_MESSAGE = "Failed to retrieve market cap. Please enter a valid coin name." - API_ERROR_MESSAGE = "I can't seem to access the API at the moment." - # Swap agent - INCH_URL = "https://api.1inch.dev/token" - QUOTE_URL = "https://api.1inch.dev/swap" - APIBASEURL = f"https://api.1inch.dev/swap/v6.0/" - HEADERS = { "Authorization": "Bearer WvQuxaMYpPvDiiOL5RHWUm7OzOd20nt4", "accept": "application/json" } - WEB3RPCURL = {"56":"https://bsc-dataseed.binance.org","42161":"https://arb1.arbitrum.io/rpc","137":"https://polygon-rpc.com","1":"https://cloudflare-eth.com","10":"https://mainnet.optimism.io","8453":"https://mainnet.base.org"} - NATIVE_TOKENS={"137":"MATIC","56":"BNB","1":"ETH","42161":"ETH","10":"ETH","8453":"ETH"} - ERC20_ABI = [ - {"constant": True, "inputs": [], "name": "decimals", "outputs": [{"name": "", "type": "uint8"}], "payable": False, "stateMutability": "view", "type": "function"}, - {"constant": True, "inputs": [{"name": "_owner", "type": "address"}], "name": "balanceOf", "outputs": [{"name": "balance", "type": "uint256"}], "payable": False, "stateMutability": "view", "type": "function"} - ] - INCH_NATIVE_TOKEN_ADDRESS = "0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE" \ No newline at end of file + OLLAMA_URL = "http://host.docker.internal:11434" + MAX_UPLOAD_LENGTH = 16 * 1024 * 1024 + DELEGATOR_CONFIG = { + "agents": [ + { + "path": "rag_agent.src.agent", + "class": "RagAgent", + "description": "If the prompt is not a greeting or does not need the other agents always call rag agent.if the prompt requires a background knowledge or context call rag agent, if the question is not related to crypto call rag agent, if the prompt is a question that needs context call rag agent", + "name": "rag agent", + "upload_required": True + }, + { + "path": "data_agent.src.agent", + "class": "DataAgent", + "description": "if the prompt is a question like (price, market cap, fdv) of crypto currencies choose crypto data agent", + "name": "crypto data agent", + "upload_required": False + }, + { + "path": "swap_agent.src.agent", + "class": "SwapAgent", + "description": "if the prompt is related with swapping crypto currencies choose crypto swap agent. like if it is swap 4 eth or swap 4 eth to usdc choose crypto swap agent and if the query is about swapping crypto currencies always choose crypto swap agent", + "name": "crypto swap agent", + "upload_required": False + }, + { + "path": "claim_agent.src.agent", + "class": "ClaimAgent", + "description": "if the prompt is related to claiming rewards or tokens or claiming MOR rewards, choose claim agent. Example - if a user mentions that they want to claim their rewards from pool 1 to a receiver address", + "name": "claim agent", + "upload_required": False + }, + { + "path": "reward_agent.src.agent", + "class": "RewardAgent", + "description": "if the prompt is related to checking or querying user's MOR rewards, choose reward agent. Example - if a user mentions that they want to check the amount of MOR Rewards or Tokens they have accrued in one of the pools", + "name": "reward agent", + "upload_required": False + } + ] + } diff --git a/submodules/moragents_dockers/agents/src/data_agent/src/agent.py b/submodules/moragents_dockers/agents/src/data_agent/src/agent.py index acf79df..bb313ed 100644 --- a/submodules/moragents_dockers/agents/src/data_agent/src/agent.py +++ b/submodules/moragents_dockers/agents/src/data_agent/src/agent.py @@ -1,71 +1,63 @@ -from llama_cpp import Llama -from llama_cpp.llama_tokenizer import LlamaHFTokenizer -from flask import Flask, request, jsonify -from flask_cors import CORS -import requests -from data_agent.src import tools -from config import Config import json +from data_agent.src import tools - -tools_provided=tools.get_tools() -messages_ui=[] - -def get_response(message,llm): - global tools_provided - messages=[{"role": "system", "content": "Don't make assumptions about the value of the arguments for the function thy should always be supplied by the user and do not alter the value of the arguments . Don't make assumptions about what values to plug into functions. Ask for clarification if a user request is ambiguous."}] - messages.extend(message) - result = llm.create_chat_completion( - messages = messages, - tools=tools_provided, - tool_choice="auto" - ) - if "tool_calls" in result["choices"][0]["message"].keys(): - func=result["choices"][0]["message"]["tool_calls"][0]['function'] - if func["name"]=='get_price': - args=json.loads(func["arguments"]) - return tools.get_coin_price_tool(args['coin_name']),"assistant" - elif func["name"]=='get_floor_price': - args=json.loads(func["arguments"]) - return tools.get_nft_floor_price_tool(args['nft_name']),"assistant" - elif func["name"]=='get_fdv': - args=json.loads(func["arguments"]) - return tools.get_fully_diluted_valuation_tool(args['coin_name']),"assistant" - elif func["name"]=='get_tvl': - args=json.loads(func["arguments"]) - return tools.get_protocol_total_value_locked_tool(args['protocol_name']),"assistant" - elif func["name"]=='get_market_cap': - args=json.loads(func["arguments"]) - return tools.get_coin_market_cap_tool(args['coin_name']),"assistant" - return result["choices"][0]["message"]['content'],"assistant" - -def generate_response(prompt,llm): - global messages_ui - messages_ui.append(prompt) - response,role = get_response([prompt],llm) - messages_ui.append({"role":role,"content":response}) - return response,role - -def chat(request,llm): - try: - data = request.get_json() - if 'prompt' in data: - prompt = data['prompt'] - response,role = generate_response(prompt,llm) - return jsonify({"role":role,"content":response}) - else: - return jsonify({"error": "Missing required parameters"}), 400 - - except Exception as e: - return jsonify({"Error": str(e)}), 500 - - -def get_messages(): - global messages_ui - return jsonify({"messages":messages_ui}) - -def clear_messages(): - global messages_ui - messages_ui=[] - return jsonify({"response":"successfully cleared message history"}) +class DataAgent: + def __init__(self, config, llm, llm_ollama, embeddings, flask_app): + self.llm = llm + self.flask_app = flask_app + self.config = config + self.tools_provided = tools.get_tools() + + def get_response(self, message): + messages = [ + { + "role": "system", + "content": ( + "Don't make assumptions about the value of the arguments for the function " + "they should always be supplied by the user and do not alter the value of the arguments. " + "Don't make assumptions about what values to plug into functions. Ask for clarification if a user " + "request is ambiguous." + ) + } + ] + messages.extend(message) + result = self.llm.create_chat_completion( + messages=messages, + tools=self.tools_provided, + tool_choice="auto" + ) + if "tool_calls" in result["choices"][0]["message"].keys(): + func = result["choices"][0]["message"]["tool_calls"][0]['function'] + if func["name"] == 'get_price': + args = json.loads(func["arguments"]) + return tools.get_coin_price_tool(args['coin_name']), "assistant" + elif func["name"] == 'get_floor_price': + args = json.loads(func["arguments"]) + return tools.get_nft_floor_price_tool(args['nft_name']), "assistant" + elif func["name"] == 'get_fdv': + args = json.loads(func["arguments"]) + return tools.get_fully_diluted_valuation_tool(args['coin_name']), "assistant" + elif func["name"] == 'get_tvl': + args = json.loads(func["arguments"]) + return tools.get_protocol_total_value_locked_tool(args['protocol_name']), "assistant" + elif func["name"] == 'get_market_cap': + args = json.loads(func["arguments"]) + return tools.get_coin_market_cap_tool(args['coin_name']), "assistant" + return result["choices"][0]["message"]['content'], "assistant" + + def generate_response(self, prompt): + response, role = self.get_response([prompt]) + return response, role + + def chat(self, request): + try: + data = request.get_json() + if 'prompt' in data: + prompt = data['prompt'] + response, role = self.generate_response(prompt) + return {"role": role, "content": response} + else: + return {"error": "Missing required parameters"}, 400 + except Exception as e: + return {"Error": str(e)}, 500 diff --git a/submodules/moragents_dockers/agents/src/data_agent/src/tools.py b/submodules/moragents_dockers/agents/src/data_agent/src/tools.py index d3fcf77..e02839a 100644 --- a/submodules/moragents_dockers/agents/src/data_agent/src/tools.py +++ b/submodules/moragents_dockers/agents/src/data_agent/src/tools.py @@ -1,7 +1,6 @@ import requests import logging -from config import Config -import time +from data_agent.src.config import Config from sklearn.feature_extraction.text import TfidfVectorizer from sklearn.metrics.pairwise import cosine_similarity diff --git a/submodules/moragents_dockers/agents/src/delegator.py b/submodules/moragents_dockers/agents/src/delegator.py new file mode 100644 index 0000000..5cdfdae --- /dev/null +++ b/submodules/moragents_dockers/agents/src/delegator.py @@ -0,0 +1,79 @@ +import importlib + + +class Delegator: + def __init__(self, config, llm, llm_ollama, embeddings, flask_app): + self.llm = llm + self.flask_app = flask_app + self.llm_ollama = llm_ollama + self.embeddings = embeddings + self.agents = self.load_agents(config) + self.config = config + + def load_agents(self, config): + agents = {} + for agent_info in config['agents']: + module = importlib.import_module(agent_info['path']) + agent_class = getattr(module, agent_info['class']) + agent_instance = agent_class( + agent_info, self.llm, self.llm_ollama, self.embeddings, self.flask_app + ) + agents[agent_info['name']] = agent_instance + return agents + + def get_delegator_response(self, prompt, upload_state): + available_agents = [] + text = "" + for agent_info in self.config['agents']: + if agent_info["upload_required"] and not upload_state: + continue + available_agents.append(agent_info["name"]) + text += f", {agent_info['description']}" + pre = "### Instruction: Your name is Morpheus. Your primary function is to select the correct agent." + post = "###" + prompt_text = f"{pre}{text}{post}" + tools = [ + { + "type": "function", + "function": { + "name": "route", + "description": "choose which agent to run next", + "parameters": { + "type": "object", + "properties": { + "next": { + "title": "Next", + "anyOf": [ + {"enum": available_agents}, + ], + } + }, + "required": ["next"], + }, + } + } + ] + message_list = [{"role": "system", "content": prompt_text}] + [prompt] + result = self.llm.create_chat_completion( + messages=message_list, + tools=tools, + tool_choice="auto", + temperature=0.3 + ) + return result["choices"][0]["message"] + + def delegate_chat(self, agent_name, request): + agent = self.agents.get(agent_name) + if agent: + return agent.chat(request) + return {"error": "No such agent registered"} + + def delegate_route(self, agent_name, request, method_name): + agent = self.agents.get(agent_name) + if agent: + if hasattr(agent, method_name): + method = getattr(agent, method_name) + return method(request) + else: + return {"error": f"No such method '{method_name}' in agent '{agent_name}'"}, 400 + return {"error": "No such agent registered"}, 400 diff --git a/submodules/moragents_dockers/agents/src/rag_agent/src/agent.py b/submodules/moragents_dockers/agents/src/rag_agent/src/agent.py new file mode 100644 index 0000000..1dc2552 --- /dev/null +++ b/submodules/moragents_dockers/agents/src/rag_agent/src/agent.py @@ -0,0 +1,91 @@ +import os +import logging +from langchain_community.document_loaders import PyMuPDFLoader +from langchain_community.vectorstores import FAISS +from langchain_core.prompts import ChatPromptTemplate +from langchain_text_splitters import RecursiveCharacterTextSplitter +from langchain.chains.combine_documents import create_stuff_documents_chain +from langchain.chains import create_retrieval_chain +from werkzeug.utils import secure_filename + + +logging.basicConfig(level=logging.DEBUG) + + + +class RagAgent: + def __init__(self, config, llm, llm_ollama, embeddings,flask_app): + self.llm = llm_ollama + self.flask_app = flask_app + self.embedding=embeddings + self.config = config + self.agent = None + self.messages = [{'role': "assistant", "content": "Please upload a file to begin"}] + self.upload_state = False + self.prompt = ChatPromptTemplate.from_template( + """ + Answer the following question only based on the given context + + + {context} + + + Question: {input} + """ + ) + self.UPLOAD_FOLDER = flask_app.config['UPLOAD_FOLDER'] + self.max_size = 5 * 1024 * 1024 + self.retriever = None + + + def handle_file_upload(self,file): + if not os.path.exists(self.UPLOAD_FOLDER): + os.makedirs(self.UPLOAD_FOLDER, exist_ok=True) + filename = secure_filename(file.filename) + file.save(os.path.join(self.UPLOAD_FOLDER, filename)) + # DocumentToolsGenerator class instantiation + loader = PyMuPDFLoader(os.path.join(self.UPLOAD_FOLDER,filename)) + docs = loader.load() + text_splitter = RecursiveCharacterTextSplitter(chunk_size=1024,chunk_overlap=20,length_function=len,is_separator_regex=False) + split_documents = text_splitter.split_documents(docs) + vector_store = FAISS.from_documents(split_documents, self.embedding) + self.retriever = vector_store.as_retriever(search_kwargs={"k": 7}) + + + def upload_file(self,request): + if 'file' not in request.files: + return {'error': 'No file part'}, 400 + file = request.files['file'] + if file.filename == '': + return {'error': 'No selected file'}, 400 + # Check file size + file.seek(0, os.SEEK_END) + file_length = file.tell() + file.seek(0, 0) # Reset the file pointer to the beginning + if file_length > self.max_size: + return {"role": "assistant", "content": 'please use a file less than 5 MB'} + try: + self.handle_file_upload(file) + self.upload_state = True + return {"role": "assistant", "content": 'You have successfully uploaded the text'} + except Exception as e: + logging.error(f'Error during file upload: {str(e)}') + return {'error': str(e)}, 500 + + def chat(self,request): + try: + data = request.get_json() + if 'prompt' in data: + prompt = data['prompt']['content'] + role = "assistant" + retrieved_docs = self.retriever.invoke(prompt) + formatted_context = "\n\n".join(doc.page_content for doc in retrieved_docs) + formatted_prompt = f"Question: {prompt}\n\nContext: {formatted_context}" + answer=self.llm(formatted_prompt) + response = answer if self.upload_state else "please upload a file first" + return {"role": role, "content": response} + else: + return {"error": "Missing required parameters"}, 400 + except Exception as e: + logging.error(f'Error in chat endpoint: {str(e)}') + return {"Error": str(e)}, 500 \ No newline at end of file diff --git a/submodules/moragents_dockers/agents/src/rag_agent/src/config.py b/submodules/moragents_dockers/agents/src/rag_agent/src/config.py new file mode 100644 index 0000000..63983c2 --- /dev/null +++ b/submodules/moragents_dockers/agents/src/rag_agent/src/config.py @@ -0,0 +1,9 @@ +import logging + +# Logging configuration +logging.basicConfig(level=logging.INFO) + +# Configuration object +class Config: + MAX_FILE_SIZE=5 * 1024 * 1024 # 5 MB + MAX_LENGTH=16 * 1024 * 1024 \ No newline at end of file diff --git a/submodules/moragents_dockers/agents/src/reward_agent/src/agent.py b/submodules/moragents_dockers/agents/src/reward_agent/src/agent.py new file mode 100644 index 0000000..ca9b89b --- /dev/null +++ b/submodules/moragents_dockers/agents/src/reward_agent/src/agent.py @@ -0,0 +1,66 @@ +import json +from reward_agent.src import tools + + +class RewardAgent: + def __init__(self, agent_info, llm, llm_ollama, embeddings, flask_app): + self.agent_info = agent_info + self.llm = llm + self.llm_ollama = llm_ollama + self.embeddings = embeddings + self.flask_app = flask_app + self.tools_provided = tools.get_tools() + + def get_response(self, message): + prompt = [ + { + "role": "system", + "content": ( + "You are a reward checking agent. Your task is to help users check their MOR rewards accrued in either pool 0" + "(capital providers pool) or pool 1 (code providers pool). " + "You will facilitate the checking of their currently accrued rewards from the pool they mention and for the address they specify to check for. " + "Extract the pool ID from the user's message: " + "If the user mentions the capital pool, interpret it as pool ID 0. " + "If the user mentions the code pool, interpret it as pool ID 1. " + "Ask the user for the pool ID and the address they want to check their accrued rewards for. Note that these parameters are mandatory for the user to answer. " + "Use the `get_current_user_reward` function to fetch the currently accrued MOR rewards using the pool ID and address provided by the user." + "Remember that the value to be passed for pool_id in the `get_current_user_reward` function will be an integer - either 0 or 1 " + ) + } + ] + prompt.extend(message) + result = self.llm.create_chat_completion( + messages=prompt, + tools=self.tools_provided, + tool_choice="auto", + temperature=0.01 + ) + if "tool_calls" in result["choices"][0]["message"].keys(): + func = result["choices"][0]["message"]["tool_calls"][0]['function'] + if func["name"] == "get_current_user_reward": + args = json.loads(func["arguments"]) + try: + reward = tools.get_current_user_reward(args['wallet_address'], args['pool_id']) + return f"The current reward for wallet {args['wallet_address']} in pool {args['pool_id']} is {reward} MOR", "assistant", None + except Exception as e: + return str(e), "assistant", None + return result["choices"][0]["message"]['content'], "assistant", "reward agent" + + def chat(self, request): + try: + data = request.get_json() + if 'prompt' in data: + prompt = data['prompt'] + response, role, next_turn_agent = self.get_response([prompt]) + + # Check if we need more information + if "What is the wallet address?" in response or "What is the pool ID?" in response: + next_turn_agent = self.agent_info["name"] # Continue the conversation + else: + next_turn_agent = None # End the conversation + + return {"role": role, "content": response, "next_turn_agent": next_turn_agent} + else: + return {"error": "Missing required parameters"}, 400 + except Exception as e: + return {"Error": str(e)}, 500 \ No newline at end of file diff --git a/submodules/moragents_dockers/agents/src/reward_agent/src/config.py b/submodules/moragents_dockers/agents/src/reward_agent/src/config.py new file mode 100644 index 0000000..92f4af9 --- /dev/null +++ b/submodules/moragents_dockers/agents/src/reward_agent/src/config.py @@ -0,0 +1,39 @@ +import logging + +# Logging configuration +logging.basicConfig(level=logging.INFO) + +# Configuration object +class Config: + + WEB3RPCURL = { + "1": "https://cloudflare-eth.com", + } + + DISTRIBUTION_PROXY_ADDRESS = "0x47176B2Af9885dC6C4575d4eFd63895f7Aaa4790" + DISTRIBUTION_ABI = [ + { + "inputs": [ + { + "internalType": "uint256", + "name": "poolId_", + "type": "uint256" + }, + { + "internalType": "address", + "name": "user_", + "type": "address" + } + ], + "name": "getCurrentUserReward", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + } + ] diff --git a/submodules/moragents_dockers/agents/src/reward_agent/src/tools.py b/submodules/moragents_dockers/agents/src/reward_agent/src/tools.py new file mode 100644 index 0000000..cbb749f --- /dev/null +++ b/submodules/moragents_dockers/agents/src/reward_agent/src/tools.py @@ -0,0 +1,47 @@ +from web3 import Web3 +from reward_agent.src.config import Config + +def get_current_user_reward(wallet_address, pool_id): + web3 = Web3(Web3.HTTPProvider(Config.WEB3RPCURL["1"])) + distribution_contract = web3.eth.contract( + address=web3.to_checksum_address(Config.DISTRIBUTION_PROXY_ADDRESS), + abi=Config.DISTRIBUTION_ABI + ) + + try: + if not web3.is_connected(): + raise Exception("Unable to connect to Ethereum network") + + reward = distribution_contract.functions.getCurrentUserReward( + pool_id, + web3.to_checksum_address(wallet_address) + ).call() + formatted_reward = web3.from_wei(reward, 'ether') + return round(formatted_reward, 4) + except Exception as e: + raise Exception(f"Error occurred while fetching the reward: {str(e)}") + +def get_tools(): + return [ + { + "type": "function", + "function": { + "name": "get_current_user_reward", + "description": "Fetch the token amount of currently accrued MOR rewards for a user address from a specific pool", + "parameters": { + "type": "object", + "properties": { + "wallet_address": { + "type": "string", + "description": "The wallet address to check rewards for" + }, + "pool_id": { + "type": "integer", + "description": "The ID of the pool to check rewards from" + } + }, + "required": ["wallet_address", "pool_id"] + } + } + } + ] \ No newline at end of file diff --git a/submodules/moragents_dockers/agents/src/swap_agent/src/abi/distribution_abi.json b/submodules/moragents_dockers/agents/src/swap_agent/src/abi/distribution_abi.json deleted file mode 100644 index 995287d..0000000 --- a/submodules/moragents_dockers/agents/src/swap_agent/src/abi/distribution_abi.json +++ /dev/null @@ -1,1086 +0,0 @@ -[ - { - "inputs": [], - "stateMutability": "nonpayable", - "type": "constructor" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": false, - "internalType": "address", - "name": "previousAdmin", - "type": "address" - }, - { - "indexed": false, - "internalType": "address", - "name": "newAdmin", - "type": "address" - } - ], - "name": "AdminChanged", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "address", - "name": "beacon", - "type": "address" - } - ], - "name": "BeaconUpgraded", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": false, - "internalType": "uint8", - "name": "version", - "type": "uint8" - } - ], - "name": "Initialized", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": false, - "internalType": "uint256", - "name": "amount", - "type": "uint256" - }, - { - "indexed": false, - "internalType": "bytes", - "name": "uniqueId", - "type": "bytes" - } - ], - "name": "OverplusBridged", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "address", - "name": "previousOwner", - "type": "address" - }, - { - "indexed": true, - "internalType": "address", - "name": "newOwner", - "type": "address" - } - ], - "name": "OwnershipTransferred", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "uint256", - "name": "poolId", - "type": "uint256" - }, - { - "components": [ - { - "internalType": "uint128", - "name": "payoutStart", - "type": "uint128" - }, - { - "internalType": "uint128", - "name": "decreaseInterval", - "type": "uint128" - }, - { - "internalType": "uint128", - "name": "withdrawLockPeriod", - "type": "uint128" - }, - { - "internalType": "uint128", - "name": "claimLockPeriod", - "type": "uint128" - }, - { - "internalType": "uint128", - "name": "withdrawLockPeriodAfterStake", - "type": "uint128" - }, - { - "internalType": "uint256", - "name": "initialReward", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "rewardDecrease", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "minimalStake", - "type": "uint256" - }, - { - "internalType": "bool", - "name": "isPublic", - "type": "bool" - } - ], - "indexed": false, - "internalType": "struct IDistributionV2.Pool", - "name": "pool", - "type": "tuple" - } - ], - "name": "PoolCreated", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "uint256", - "name": "poolId", - "type": "uint256" - }, - { - "components": [ - { - "internalType": "uint128", - "name": "payoutStart", - "type": "uint128" - }, - { - "internalType": "uint128", - "name": "decreaseInterval", - "type": "uint128" - }, - { - "internalType": "uint128", - "name": "withdrawLockPeriod", - "type": "uint128" - }, - { - "internalType": "uint128", - "name": "claimLockPeriod", - "type": "uint128" - }, - { - "internalType": "uint128", - "name": "withdrawLockPeriodAfterStake", - "type": "uint128" - }, - { - "internalType": "uint256", - "name": "initialReward", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "rewardDecrease", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "minimalStake", - "type": "uint256" - }, - { - "internalType": "bool", - "name": "isPublic", - "type": "bool" - } - ], - "indexed": false, - "internalType": "struct IDistributionV2.Pool", - "name": "pool", - "type": "tuple" - } - ], - "name": "PoolEdited", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "address", - "name": "implementation", - "type": "address" - } - ], - "name": "Upgraded", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "uint256", - "name": "poolId", - "type": "uint256" - }, - { - "indexed": true, - "internalType": "address", - "name": "user", - "type": "address" - }, - { - "indexed": false, - "internalType": "uint128", - "name": "claimLockStart", - "type": "uint128" - }, - { - "indexed": false, - "internalType": "uint128", - "name": "claimLockEnd", - "type": "uint128" - } - ], - "name": "UserClaimLocked", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "uint256", - "name": "poolId", - "type": "uint256" - }, - { - "indexed": true, - "internalType": "address", - "name": "user", - "type": "address" - }, - { - "indexed": false, - "internalType": "address", - "name": "receiver", - "type": "address" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "amount", - "type": "uint256" - } - ], - "name": "UserClaimed", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "uint256", - "name": "poolId", - "type": "uint256" - }, - { - "indexed": true, - "internalType": "address", - "name": "user", - "type": "address" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "amount", - "type": "uint256" - } - ], - "name": "UserStaked", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "uint256", - "name": "poolId", - "type": "uint256" - }, - { - "indexed": true, - "internalType": "address", - "name": "user", - "type": "address" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "amount", - "type": "uint256" - } - ], - "name": "UserWithdrawn", - "type": "event" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "depositToken_", - "type": "address" - }, - { - "internalType": "address", - "name": "l1Sender_", - "type": "address" - }, - { - "components": [ - { - "internalType": "uint128", - "name": "payoutStart", - "type": "uint128" - }, - { - "internalType": "uint128", - "name": "decreaseInterval", - "type": "uint128" - }, - { - "internalType": "uint128", - "name": "withdrawLockPeriod", - "type": "uint128" - }, - { - "internalType": "uint128", - "name": "claimLockPeriod", - "type": "uint128" - }, - { - "internalType": "uint128", - "name": "withdrawLockPeriodAfterStake", - "type": "uint128" - }, - { - "internalType": "uint256", - "name": "initialReward", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "rewardDecrease", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "minimalStake", - "type": "uint256" - }, - { - "internalType": "bool", - "name": "isPublic", - "type": "bool" - } - ], - "internalType": "struct IDistributionV2.Pool[]", - "name": "poolsInfo_", - "type": "tuple[]" - } - ], - "name": "Distribution_init", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "gasLimit_", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "maxFeePerGas_", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "maxSubmissionCost_", - "type": "uint256" - } - ], - "name": "bridgeOverplus", - "outputs": [ - { - "internalType": "bytes", - "name": "", - "type": "bytes" - } - ], - "stateMutability": "payable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "poolId_", - "type": "uint256" - }, - { - "internalType": "address", - "name": "receiver_", - "type": "address" - } - ], - "name": "claim", - "outputs": [], - "stateMutability": "payable", - "type": "function" - }, - { - "inputs": [ - { - "components": [ - { - "internalType": "uint128", - "name": "payoutStart", - "type": "uint128" - }, - { - "internalType": "uint128", - "name": "decreaseInterval", - "type": "uint128" - }, - { - "internalType": "uint128", - "name": "withdrawLockPeriod", - "type": "uint128" - }, - { - "internalType": "uint128", - "name": "claimLockPeriod", - "type": "uint128" - }, - { - "internalType": "uint128", - "name": "withdrawLockPeriodAfterStake", - "type": "uint128" - }, - { - "internalType": "uint256", - "name": "initialReward", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "rewardDecrease", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "minimalStake", - "type": "uint256" - }, - { - "internalType": "bool", - "name": "isPublic", - "type": "bool" - } - ], - "internalType": "struct IDistributionV2.Pool", - "name": "pool_", - "type": "tuple" - } - ], - "name": "createPool", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [], - "name": "depositToken", - "outputs": [ - { - "internalType": "address", - "name": "", - "type": "address" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "poolId_", - "type": "uint256" - }, - { - "components": [ - { - "internalType": "uint128", - "name": "payoutStart", - "type": "uint128" - }, - { - "internalType": "uint128", - "name": "decreaseInterval", - "type": "uint128" - }, - { - "internalType": "uint128", - "name": "withdrawLockPeriod", - "type": "uint128" - }, - { - "internalType": "uint128", - "name": "claimLockPeriod", - "type": "uint128" - }, - { - "internalType": "uint128", - "name": "withdrawLockPeriodAfterStake", - "type": "uint128" - }, - { - "internalType": "uint256", - "name": "initialReward", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "rewardDecrease", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "minimalStake", - "type": "uint256" - }, - { - "internalType": "bool", - "name": "isPublic", - "type": "bool" - } - ], - "internalType": "struct IDistributionV2.Pool", - "name": "pool_", - "type": "tuple" - } - ], - "name": "editPool", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "poolId_", - "type": "uint256" - }, - { - "internalType": "uint128", - "name": "claimLockStart_", - "type": "uint128" - }, - { - "internalType": "uint128", - "name": "claimLockEnd_", - "type": "uint128" - } - ], - "name": "getClaimLockPeriodMultiplier", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "poolId_", - "type": "uint256" - }, - { - "internalType": "address", - "name": "user_", - "type": "address" - } - ], - "name": "getCurrentUserMultiplier", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "poolId_", - "type": "uint256" - }, - { - "internalType": "address", - "name": "user_", - "type": "address" - } - ], - "name": "getCurrentUserReward", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "poolId_", - "type": "uint256" - }, - { - "internalType": "uint128", - "name": "startTime_", - "type": "uint128" - }, - { - "internalType": "uint128", - "name": "endTime_", - "type": "uint128" - } - ], - "name": "getPeriodReward", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "isNotUpgradeable", - "outputs": [ - { - "internalType": "bool", - "name": "", - "type": "bool" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "l1Sender", - "outputs": [ - { - "internalType": "address", - "name": "", - "type": "address" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "poolId_", - "type": "uint256" - }, - { - "internalType": "uint128", - "name": "claimLockEnd_", - "type": "uint128" - } - ], - "name": "lockClaim", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "poolId_", - "type": "uint256" - }, - { - "internalType": "address[]", - "name": "users_", - "type": "address[]" - }, - { - "internalType": "uint256[]", - "name": "amounts_", - "type": "uint256[]" - }, - { - "internalType": "uint128[]", - "name": "claimLockEnds_", - "type": "uint128[]" - } - ], - "name": "manageUsersInPrivatePool", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [], - "name": "overplus", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "owner", - "outputs": [ - { - "internalType": "address", - "name": "", - "type": "address" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "name": "pools", - "outputs": [ - { - "internalType": "uint128", - "name": "payoutStart", - "type": "uint128" - }, - { - "internalType": "uint128", - "name": "decreaseInterval", - "type": "uint128" - }, - { - "internalType": "uint128", - "name": "withdrawLockPeriod", - "type": "uint128" - }, - { - "internalType": "uint128", - "name": "claimLockPeriod", - "type": "uint128" - }, - { - "internalType": "uint128", - "name": "withdrawLockPeriodAfterStake", - "type": "uint128" - }, - { - "internalType": "uint256", - "name": "initialReward", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "rewardDecrease", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "minimalStake", - "type": "uint256" - }, - { - "internalType": "bool", - "name": "isPublic", - "type": "bool" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "name": "poolsData", - "outputs": [ - { - "internalType": "uint128", - "name": "lastUpdate", - "type": "uint128" - }, - { - "internalType": "uint256", - "name": "rate", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "totalVirtualDeposited", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "proxiableUUID", - "outputs": [ - { - "internalType": "bytes32", - "name": "", - "type": "bytes32" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "removeUpgradeability", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [], - "name": "renounceOwnership", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "poolId_", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "amount_", - "type": "uint256" - }, - { - "internalType": "uint128", - "name": "claimLockEnd_", - "type": "uint128" - } - ], - "name": "stake", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [], - "name": "totalDepositedInPublicPools", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "newOwner", - "type": "address" - } - ], - "name": "transferOwnership", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "newImplementation", - "type": "address" - } - ], - "name": "upgradeTo", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "newImplementation", - "type": "address" - }, - { - "internalType": "bytes", - "name": "data", - "type": "bytes" - } - ], - "name": "upgradeToAndCall", - "outputs": [], - "stateMutability": "payable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "", - "type": "address" - }, - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "name": "usersData", - "outputs": [ - { - "internalType": "uint128", - "name": "lastStake", - "type": "uint128" - }, - { - "internalType": "uint256", - "name": "deposited", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "rate", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "pendingRewards", - "type": "uint256" - }, - { - "internalType": "uint128", - "name": "claimLockStart", - "type": "uint128" - }, - { - "internalType": "uint128", - "name": "claimLockEnd", - "type": "uint128" - }, - { - "internalType": "uint256", - "name": "virtualDeposited", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "version", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "stateMutability": "pure", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "poolId_", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "amount_", - "type": "uint256" - } - ], - "name": "withdraw", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - } -] \ No newline at end of file diff --git a/submodules/moragents_dockers/agents/src/swap_agent/src/agent.py b/submodules/moragents_dockers/agents/src/swap_agent/src/agent.py index 6632bee..73f2694 100644 --- a/submodules/moragents_dockers/agents/src/swap_agent/src/agent.py +++ b/submodules/moragents_dockers/agents/src/swap_agent/src/agent.py @@ -1,211 +1,190 @@ -from flask import Flask, request, jsonify -from llama_cpp import Llama -from llama_cpp.llama_tokenizer import LlamaHFTokenizer +import json import requests +from flask import jsonify from swap_agent.src import tools -from swap_agent.src.tools import InsufficientFundsError, TokenNotFoundError, SwapNotPossibleError -from config import Config -import json - -tools_provided = tools.get_tools() -messages = [{'role':"assistant","content":"This highly experimental chatbot is not intended for making important decisions, and its responses are generated based on incomplete data and algorithms that may evolve rapidly. By using this chatbot, you acknowledge that you use it at your own discretion and assume all risks associated with its limitations and potential errors."}] -context = [] - -def api_request_url(method_name, query_params, chain_id): - base_url = Config.APIBASEURL + str(chain_id) - return f"{base_url}{method_name}?{'&'.join([f'{key}={value}' for key, value in query_params.items()])}" - -def check_allowance(token_address, wallet_address, chain_id): - url = api_request_url("/approve/allowance", {"tokenAddress": token_address, "walletAddress": wallet_address}, chain_id) - response = requests.get(url, headers=Config.HEADERS) - data = response.json() - return data - -def approve_transaction(token_address, chain_id, amount=None): - query_params = {"tokenAddress": token_address, "amount": amount} if amount else {"tokenAddress": token_address} - url = api_request_url("/approve/transaction", query_params, chain_id) - response = requests.get(url, headers=Config.HEADERS) - transaction = response.json() - return transaction - -def build_tx_for_swap(swap_params, chain_id): - url = api_request_url("/swap", swap_params, chain_id) - swap_transaction = requests.get(url, headers=Config.HEADERS).json() - return swap_transaction - -def get_response(message, chain_id, wallet_address,llm): - global tools_provided , messages, context - prompt = [{"role": "system", "content": "Don't make assumptions about the value of the arguments for the function they should always be supplied by the user and do not alter the value of the arguments. Don't make assumptions about what values to plug into functions. Ask for clarification if a user request is ambiguous. you only need the value of token1 we dont need the value of token2. After starting from scratch do not assume the name of token1 or token2"}] - prompt.extend(message) - result = llm.create_chat_completion( - messages=prompt, - tools=tools_provided, - tool_choice="auto", - temperature=0.01 - ) - if "tool_calls" in result["choices"][0]["message"].keys(): - func = result["choices"][0]["message"]["tool_calls"][0]['function'] - if func["name"] == "swap_agent": - args = json.loads(func["arguments"]) - tok1 = args["token1"] - tok2 = args["token2"] - value = args["value"] - try: - res, role = tools.swap_coins(tok1, tok2, float(value), chain_id, wallet_address) - messages.append({"role": role, "content": res}) - except (tools.InsufficientFundsError, tools.TokenNotFoundError,tools.SwapNotPossibleError) as e: - context = [] - messages.append({"role": "assistant", "content": str(e)}) - return str(e), "assistant" - return res, role - - elif func["name"] == 'prepare_claim_rewards': - args = json.loads(func["arguments"]) - return tools.prepare_claim_rewards(args['pool_id'], args['receiver_address']), "assistant" - - messages.append({"role": "assistant", "content": result["choices"][0]["message"]['content']}) - context.append({"role": "assistant", "content": result["choices"][0]["message"]['content']}) - return result["choices"][0]["message"]['content'], "assistant" - -def get_status(flag, tx_hash, tx_type): - global messages, context - response = '' - - if flag == "cancelled": - response = f"The {tx_type} transaction has been cancelled." - elif flag == "success": - response = f"The {tx_type} transaction was successful." - elif flag == "failed": - response = f"The {tx_type} transaction has failed." - elif flag == "initiated": - response = f"Transaction has been sent, please wait for it to be confirmed." - - if tx_hash: - response = response + f" The transaction hash is {tx_hash}." - - if flag == "success" and tx_type == "approve": - response = response + " Please proceed with the swap transaction." - elif flag != "initiated": - response = response + " Is there anything else I can help you with?" - - if flag != "initiated": - context = [] - messages.append({"role": "assistant", "content": response}) - context.append({"role": "assistant", "content": response}) - context.append({"role": "user", "content": "okay lets start again from scratch"}) - else: - messages.append({"role": "assistant", "content": response}) - - return response - -def generate_response(prompt,chainid,walletAddress,llm): - global messages,context - messages.append(prompt) - context.append(prompt) - response,role = get_response(context,chainid,walletAddress,llm) - return response,role - - -def chat(request,llm): - try: - data = request.get_json() - if 'prompt' in data: - prompt = data['prompt'] - wallet_address = data['wallet_address'] - chain_id = data['chain_id'] - response, role = generate_response(prompt, chain_id, wallet_address,llm) - return jsonify({"role": role, "content": response}) - else: - return jsonify({"error": "Missing required parameters"}), 400 - - except Exception as e: - return jsonify({"Error": str(e)}), 500 - - -def tx_status(request): - try: - data = request.get_json() - if 'status' in data: - prompt = data['status'] - tx_hash = data.get('tx_hash', '') - tx_type = data.get('tx_type', '') - response = get_status(prompt, tx_hash, tx_type) - return jsonify({"role": "assistant", "content": response}) - else: - return jsonify({"error": "Missing required parameters"}), 400 - - except Exception as e: - return jsonify({"Error": str(e)}), 500 - -def get_messages(): - global messages - try: - return jsonify({"messages": messages}) - except Exception as e: - return jsonify({"Error": str(e)}), 500 - -def clear_messages(): - global messages, context - try: - messages = [{'role':"assistant","content":"This highly experimental chatbot is not intended for making important decisions, and its responses are generated based on incomplete data and algorithms that may evolve rapidly. By using this chatbot, you acknowledge that you use it at your own discretion and assume all risks associated with its limitations and potential errors."}] - context = [] - return jsonify({"response": "successfully cleared message history"}) - except Exception as e: - return jsonify({"Error": str(e)}), 500 - -def get_allowance(request): - try: - data = request.get_json() - if 'tokenAddress' in data: - token = data['tokenAddress'] - wallet_address = data['walletAddress'] - chain_id = data["chain_id"] - res = check_allowance(token, wallet_address, chain_id) - return jsonify({"response": res}) - else: - return jsonify({"error": "Missing required parameters"}), 400 - - except Exception as e: - return jsonify({"Error": str(e)}), 500 - -def approve(request): - try: - data = request.get_json() - if 'tokenAddress' in data: - token = data['tokenAddress'] - chain_id = data['chain_id'] - amount = data['amount'] - res = approve_transaction(token, chain_id, amount) - return jsonify({"response": res}) - else: - return jsonify({"error": "Missing required parameters"}), 400 - - except Exception as e: - return jsonify({"Error": str(e)}), 500 - -def swap(request): - try: - data = request.get_json() - if 'src' in data: - token1 = data['src'] - token2 = data['dst'] - wallet_address = data['walletAddress'] - amount = data['amount'] - slippage = data['slippage'] - chain_id = data['chain_id'] - swap_params = { - "src": token1, - "dst": token2, - "amount": amount, - "from": wallet_address, - "slippage": slippage, - "disableEstimate": False, - "allowPartialFill": False, +from swap_agent.src.config import Config + + +class SwapAgent: + def __init__(self, config, llm, llm_ollama, embeddings, flask_app): + self.llm = llm + self.flask_app = flask_app + self.config = config + self.tools_provided = tools.get_tools() + self.context = [] + + def api_request_url(self, method_name, query_params, chain_id): + base_url = Config.APIBASEURL + str(chain_id) + return f"{base_url}{method_name}?{'&'.join([f'{key}={value}' for key, value in query_params.items()])}" + + def check_allowance(self, token_address, wallet_address, chain_id): + url = self.api_request_url( + "/approve/allowance", + {"tokenAddress": token_address, "walletAddress": wallet_address}, + chain_id + ) + response = requests.get(url, headers=Config.HEADERS) + data = response.json() + return data + + def approve_transaction(self, token_address, chain_id, amount=None): + query_params = {"tokenAddress": token_address, "amount": amount} if amount else {"tokenAddress": token_address} + url = self.api_request_url("/approve/transaction", query_params, chain_id) + response = requests.get(url, headers=Config.HEADERS) + transaction = response.json() + return transaction + + def build_tx_for_swap(self, swap_params, chain_id): + url = self.api_request_url("/swap", swap_params, chain_id) + swap_transaction = requests.get(url, headers=Config.HEADERS).json() + return swap_transaction + + def get_response(self, message, chain_id, wallet_address): + prompt = [ + { + "role": "system", + "content": ( + "Don't make assumptions about the value of the arguments for the function " + "they should always be supplied by the user and do not alter the value of the arguments. " + "Don't make assumptions about what values to plug into functions. Ask for clarification if a user " + "request is ambiguous. you only need the value of token1 we dont need the value of token2. After " + "starting from scratch do not assume the name of token1 or token2" + ) } - swap_transaction = build_tx_for_swap(swap_params, chain_id) - return swap_transaction - else: - return jsonify({"error": "Missing required parameters"}), 400 - - except Exception as e: - return jsonify({"Error": str(e)}), 500 + ] + prompt.extend(message) + result = self.llm.create_chat_completion( + messages=prompt, + tools=self.tools_provided, + tool_choice="auto", + temperature=0.01 + ) + if "tool_calls" in result["choices"][0]["message"].keys(): + func = result["choices"][0]["message"]["tool_calls"][0]['function'] + if func["name"] == "swap_agent": + args = json.loads(func["arguments"]) + tok1 = args["token1"] + tok2 = args["token2"] + value = args["value"] + try: + res, role = tools.swap_coins(tok1, tok2, float(value), chain_id, wallet_address) + except (tools.InsufficientFundsError, tools.TokenNotFoundError, tools.SwapNotPossibleError) as e: + self.context = [] + return str(e), "assistant", None + return res, role, None + self.context.append({"role": "assistant", "content": result["choices"][0]["message"]['content']}) + return result["choices"][0]["message"]['content'], "assistant", "crypto swap agent" + + def get_status(self, flag, tx_hash, tx_type): + response = '' + + if flag == "cancelled": + response = f"The {tx_type} transaction has been cancelled." + elif flag == "success": + response = f"The {tx_type} transaction was successful." + elif flag == "failed": + response = f"The {tx_type} transaction has failed." + elif flag == "initiated": + response = f"Transaction has been sent, please wait for it to be confirmed." + + if tx_hash: + response = response + f" The transaction hash is {tx_hash}." + + if flag == "success" and tx_type == "approve": + response = response + " Please proceed with the swap transaction." + elif flag != "initiated": + response = response + " Is there anything else I can help you with?" + + if flag != "initiated": + self.context = [] + self.context.append({"role": "assistant", "content": response}) + self.context.append({"role": "user", "content": "okay lets start again from scratch"}) + + return {"role": "assistant", "content": response} + + def generate_response(self, prompt, chain_id, wallet_address): + self.context.append(prompt) + response, role, next_turn_agent = self.get_response(self.context, chain_id, wallet_address) + return response, role, next_turn_agent + + def chat(self, request): + try: + data = request.get_json() + if 'prompt' in data: + prompt = data['prompt'] + wallet_address = data['wallet_address'] + chain_id = data['chain_id'] + response, role, next_turn_agent = self.generate_response(prompt, chain_id, wallet_address) + return {"role": role, "content": response, "next_turn_agent": next_turn_agent} + else: + return {"error": "Missing required parameters"}, 400 + except Exception as e: + return {"Error": str(e)}, 500 + + def tx_status(self, request): + try: + data = request.get_json() + if 'status' in data: + prompt = data['status'] + tx_hash = data.get('tx_hash', '') + tx_type = data.get('tx_type', '') + response = self.get_status(prompt, tx_hash, tx_type) + return response + else: + return {"error": "Missing required parameters"}, 400 + except Exception as e: + return {"Error": str(e)}, 500 + + def get_allowance(self, request): + try: + data = request.get_json() + if 'tokenAddress' in data: + token = data['tokenAddress'] + wallet_address = data['walletAddress'] + chain_id = data["chain_id"] + res = self.check_allowance(token, wallet_address, chain_id) + return jsonify({"response": res}) + else: + return jsonify({"error": "Missing required parameters"}), 400 + except Exception as e: + return jsonify({"Error": str(e)}), 500 + + def approve(self, request): + try: + data = request.get_json() + if 'tokenAddress' in data: + token = data['tokenAddress'] + chain_id = data['chain_id'] + amount = data['amount'] + res = self.approve_transaction(token, chain_id, amount) + return jsonify({"response": res}) + else: + return jsonify({"error": "Missing required parameters"}), 400 + except Exception as e: + return jsonify({"Error": str(e)}), 500 + + def swap(self, request): + try: + data = request.get_json() + if 'src' in data: + token1 = data['src'] + token2 = data['dst'] + wallet_address = data['walletAddress'] + amount = data['amount'] + slippage = data['slippage'] + chain_id = data['chain_id'] + swap_params = { + "src": token1, + "dst": token2, + "amount": amount, + "from": wallet_address, + "slippage": slippage, + "disableEstimate": False, + "allowPartialFill": False, + } + swap_transaction = self.build_tx_for_swap(swap_params, chain_id) + return swap_transaction + else: + return jsonify({"error": "Missing required parameters"}), 400 + except Exception as e: + return jsonify({"Error": str(e)}), 500 diff --git a/submodules/moragents_dockers/agents/src/swap_agent/src/config.py b/submodules/moragents_dockers/agents/src/swap_agent/src/config.py index 8575a4a..df5a36e 100644 --- a/submodules/moragents_dockers/agents/src/swap_agent/src/config.py +++ b/submodules/moragents_dockers/agents/src/swap_agent/src/config.py @@ -1,36 +1,26 @@ import logging -import json - -with open('abi/distribution_abi.json', 'r') as file: - distribution_abi = json.load(file) # Logging configuration logging.basicConfig(level=logging.INFO) - # Configuration object class Config: # Model configuration MODEL_NAME = "meetkai/functionary-small-v2.4-GGUF" MODEL_REVISION = "functionary-small-v2.4.Q4_0.gguf" - MODEL_PATH = "model/" + MODEL_REVISION + MODEL_PATH = "model/"+MODEL_REVISION DOWNLOAD_DIR = "model" # API endpoints INCH_URL = "https://api.1inch.dev/token" QUOTE_URL = "https://api.1inch.dev/swap" APIBASEURL = f"https://api.1inch.dev/swap/v6.0/" - HEADERS = {"Authorization": "Bearer WvQuxaMYpPvDiiOL5RHWUm7OzOd20nt4", "accept": "application/json"} - WEB3RPCURL = {"56": "https://bsc-dataseed.binance.org", "42161": "https://arb1.arbitrum.io/rpc", - "137": "https://polygon-rpc.com", "1": "https://cloudflare-eth.com", - "10": "https://mainnet.optimism.io", "8453": "https://mainnet.base.org"} - NATIVE_TOKENS = {"137": "MATIC", "56": "BNB", "1": "ETH", "42161": "ETH", "10": "ETH", "8453": "ETH"} + HEADERS = { "Authorization": "Bearer WvQuxaMYpPvDiiOL5RHWUm7OzOd20nt4", "accept": "application/json" } + WEB3RPCURL = {"56":"https://bsc-dataseed.binance.org","42161":"https://arb1.arbitrum.io/rpc","137":"https://polygon-rpc.com","1":"https://cloudflare-eth.com","10":"https://mainnet.optimism.io","8453":"https://mainnet.base.org"} + NATIVE_TOKENS={"137":"MATIC","56":"BNB","1":"ETH","42161":"ETH","10":"ETH","8453":"ETH"} ERC20_ABI = [ - {"constant": True, "inputs": [], "name": "decimals", "outputs": [{"name": "", "type": "uint8"}], - "payable": False, "stateMutability": "view", "type": "function"}, - {"constant": True, "inputs": [{"name": "_owner", "type": "address"}], "name": "balanceOf", - "outputs": [{"name": "balance", "type": "uint256"}], "payable": False, "stateMutability": "view", - "type": "function"} + {"constant": True, "inputs": [], "name": "decimals", "outputs": [{"name": "", "type": "uint8"}], "payable": False, "stateMutability": "view", "type": "function"}, + {"constant": True, "inputs": [{"name": "_owner", "type": "address"}], "name": "balanceOf", "outputs": [{"name": "balance", "type": "uint256"}], "payable": False, "stateMutability": "view", "type": "function"} ] - DISTRIBUTION_ABI = distribution_abi - DISTRIBUTION_PROXY_ADDRESS = "0x47176B2Af9885dC6C4575d4eFd63895f7Aaa4790" INCH_NATIVE_TOKEN_ADDRESS = "0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE" + + \ No newline at end of file diff --git a/submodules/moragents_dockers/agents/src/swap_agent/src/tools.py b/submodules/moragents_dockers/agents/src/swap_agent/src/tools.py index 8bbfe31..1800dfe 100644 --- a/submodules/moragents_dockers/agents/src/swap_agent/src/tools.py +++ b/submodules/moragents_dockers/agents/src/swap_agent/src/tools.py @@ -1,18 +1,16 @@ import requests import logging import time -from config import Config from web3 import Web3 +from swap_agent.src.config import Config class InsufficientFundsError(Exception): pass - class TokenNotFoundError(Exception): pass - class SwapNotPossibleError(Exception): pass @@ -31,7 +29,6 @@ def search_tokens(query, chain_id, limit=1, ignore_listed="false"): logging.error(f"Failed to search tokens. Status code: {response.status_code}") return None - def get_token_balance(web3: Web3, wallet_address: str, token_address: str, abi: list) -> int: """ Get the balance of an ERC-20 token for a given wallet address. """ if not token_address: # If no token address is provided, assume checking ETH or native token balance @@ -40,11 +37,9 @@ def get_token_balance(web3: Web3, wallet_address: str, token_address: str, abi: contract = web3.eth.contract(address=web3.to_checksum_address(token_address), abi=abi) return contract.functions.balanceOf(web3.to_checksum_address(wallet_address)).call() - def eth_to_wei(amount_in_eth: float) -> int: """Convert an amount in ETH to wei.""" - return int(amount_in_eth * 10 ** 18) - + return int(amount_in_eth * 10**18) def validate_swap(web3: Web3, token1, token2, chain_id, amount, wallet_address): native = Config.NATIVE_TOKENS @@ -79,7 +74,6 @@ def validate_swap(web3: Web3, token1, token2, chain_id, amount, wallet_address): return t1[0]['address'], t1[0]['symbol'], t2[0]['address'], t2[0]['symbol'] - def get_quote(token1, token2, amount_in_wei, chain_id): endpoint = f"/v6.0/{chain_id}/quote" params = { @@ -94,7 +88,6 @@ def get_quote(token1, token2, amount_in_wei, chain_id): logging.error(f"Failed to get quote. Status code: {response.status_code}") return None - def get_token_decimals(web3: Web3, token_address: str) -> int: if not token_address: return 18 # Assuming 18 decimals for the native gas token @@ -102,12 +95,10 @@ def get_token_decimals(web3: Web3, token_address: str) -> int: contract = web3.eth.contract(address=Web3.to_checksum_address(token_address), abi=Config.ERC20_ABI) return contract.functions.decimals().call() - def convert_to_smallest_unit(web3: Web3, amount: float, token_address: str) -> int: decimals = get_token_decimals(web3, token_address) return int(amount * (10 ** decimals)) - def convert_to_readable_unit(web3: Web3, smallest_unit_amount: int, token_address: str) -> float: decimals = get_token_decimals(web3, token_address) return smallest_unit_amount / (10 ** decimals) @@ -122,7 +113,7 @@ def swap_coins(token1, token2, amount, chain_id, wallet_address): t1_address = '' if t1_a == Config.INCH_NATIVE_TOKEN_ADDRESS else t1_a smallest_unit_amount = convert_to_smallest_unit(web3, amount, t1_address) result = get_quote(t1_a, t2_a, smallest_unit_amount, chain_id) - + if result: price = result["dstAmount"] t2_address = '' if t2_a == Config.INCH_NATIVE_TOKEN_ADDRESS else t2_a @@ -141,54 +132,6 @@ def swap_coins(token1, token2, amount, chain_id, wallet_address): "swap_tx_cb": "/swap" }, "swap" -def prepare_claim_rewards(pool_id, receiver_address): - """ - Prepare the transaction data for claiming rewards. - - Parameters: - - pool_id: int - The ID of the pool from which to claim rewards. - - receiver_address: str - The address to receive the claimed rewards. - - Returns: - - dict: Transaction data to be signed by the user's wallet. - """ - try: - # Initialize the web3 instance - web3 = Web3(Web3.HTTPProvider(Config.WEB3RPCURL["1"])) # Ethereum Mainnet - - # Load the contract - contract = web3.eth.contract( - address=Web3.to_checksum_address(Config.DISTRIBUTION_PROXY_ADDRESS), - abi=Config.DISTRIBUTION_ABI - ) - - # Prepare the transaction data - tx_data = contract.encodeABI(fn_name="claim", args=[pool_id, Web3.to_checksum_address(receiver_address)]) - - # Set the mint fee (0.001 ETH) - mint_fee = web3.to_wei(0.001, 'ether') - - # Estimate gas (optional, can be done on the frontend) - estimated_gas = contract.functions.claim(pool_id, Web3.to_checksum_address(receiver_address)).estimate_gas({ - 'from': Web3.to_checksum_address(receiver_address), - 'value': mint_fee - }) - - return { - "status": "success", - "to": Config.DISTRIBUTION_PROXY_ADDRESS, - "data": tx_data, - "value": str(mint_fee), # 0.001 ETH in wei - "gas": str(estimated_gas), - "chainId": "1" # Ethereum Mainnet - } - except Exception as e: - return { - "status": "error", - "message": str(e) - } - - def get_tools(): """Return a list of tools for the agent.""" return [ @@ -216,26 +159,5 @@ def get_tools(): "required": ["token1", "token2", "value"] } } - }, - { - "type": "function", - "function": { - "name": "prepare_claim_rewards", - "description": "Prepare transaction data for claiming rewards from a specified pool. Requires a 0.001 ETH mint fee.", - "parameters": { - "type": "object", - "properties": { - "pool_id": { - "type": "integer", - "description": "The ID of the pool from which to claim rewards" - }, - "receiver_address": { - "type": "string", - "description": "The address to receive the claimed rewards" - } - }, - "required": ["pool_id", "receiver_address"] - } - } } - ] + ] \ No newline at end of file diff --git a/submodules/moragents_dockers/agents/tests/data_agent/test_agent.py b/submodules/moragents_dockers/agents/tests/data_agent/test_agent.py new file mode 100644 index 0000000..b44936f --- /dev/null +++ b/submodules/moragents_dockers/agents/tests/data_agent/test_agent.py @@ -0,0 +1,95 @@ +import sys +import os +sys.path.append(os.path.abspath(os.path.join(os.path.dirname(__file__), '..', '..', 'src', 'data_agent', 'src'))) +# The above sys/os lines are needed because the agents have identical namings (i.e. agent.py, tools.py) + +import pytest +from unittest.mock import patch, MagicMock +from src.data_agent.src.agent import get_response, generate_response, chat, get_messages, clear_messages +from flask import Flask, request + +@pytest.fixture +def mock_llm(): + mock = MagicMock() + mock.create_chat_completion.return_value = { + "choices": [ + { + "message": { + "content": "This is a test response" + } + } + ] + } + return mock + +@pytest.fixture +def app(): + app = Flask(__name__) + return app + +def test_get_response(mock_llm): + message = [{"role": "user", "content": "Hello"}] + response, role = get_response(message, mock_llm) + assert response == "This is a test response" + assert role == "assistant" + +def test_get_response_with_tool_call(mock_llm): + mock_llm.create_chat_completion.return_value = { + "choices": [ + { + "message": { + "tool_calls": [ + { + "function": { + "name": "get_price", + "arguments": '{"coin_name": "bitcoin"}' + } + } + ] + } + } + ] + } + + with patch('agent.tools.get_coin_price_tool') as mock_price_tool: + mock_price_tool.return_value = "The price of bitcoin is $50,000" + message = [{"role": "user", "content": "What's the price of Bitcoin?"}] + response, role = get_response(message, mock_llm) + + assert response == "The price of bitcoin is $50,000" + assert role == "assistant" + +def test_generate_response(mock_llm): + prompt = {"role": "user", "content": "Hello"} + response, role = generate_response(prompt, mock_llm) + assert response == "This is a test response" + assert role == "assistant" + +def test_chat(app, mock_llm): + with app.test_request_context(json={"prompt": "Hello"}): + with patch('agent.generate_response', return_value=("This is a test response", "assistant")): + response, status_code = chat(request, mock_llm) + + assert status_code == 200 + assert response.json == {"role": "assistant", "content": "This is a test response"} + +def test_chat_missing_prompt(app): + with app.test_request_context(json={}): + response, status_code = chat(request, None) + + assert status_code == 400 + assert "error" in response.json + +def test_get_messages(app): + with app.test_request_context(): + response = get_messages() + + assert response.status_code == 200 + assert "messages" in response.json + +def test_clear_messages(app): + with app.test_request_context(): + response = clear_messages() + + assert response.status_code == 200 + assert response.json["response"] == "successfully cleared message history" \ No newline at end of file diff --git a/submodules/moragents_dockers/agents/tests/data_agent/test_tools.py b/submodules/moragents_dockers/agents/tests/data_agent/test_tools.py new file mode 100644 index 0000000..2cbce79 --- /dev/null +++ b/submodules/moragents_dockers/agents/tests/data_agent/test_tools.py @@ -0,0 +1,82 @@ +import sys +import os +sys.path.append(os.path.abspath(os.path.join(os.path.dirname(__file__), '..', '..', 'src', 'data_agent', 'src'))) +# The above sys/os lines are needed because the agents have identical namings (i.e. agent.py, tools.py) + +import pytest +from unittest.mock import patch, MagicMock + +from src.data_agent.src.tools import ( + get_coingecko_id, + get_price, + get_floor_price, + get_fdv, + get_market_cap, + get_protocol_tvl, + get_coin_price_tool, + get_nft_floor_price_tool, + get_fully_diluted_valuation_tool, + get_coin_market_cap_tool, +) + +# Mock responses +mock_coingecko_search = { + 'coins': [{'id': 'bitcoin'}], + 'nfts': [{'id': 'bored-ape-yacht-club'}] +} +mock_price_response = {'bitcoin': {'usd': 50000}} +mock_floor_price_response = {'floor_price': {'usd': 100000}} +mock_fdv_response = {'market_data': {'fully_diluted_valuation': {'usd': 1000000000000}}} +mock_market_cap_response = [{'market_cap': 500000000000}] +mock_tvl_response = {'tvl': 10000000000} + +@pytest.fixture +def mock_requests_get(): + with patch('requests.get') as mock_get: + mock_get.return_value = MagicMock() + mock_get.return_value.json.return_value = {} + yield mock_get + +def test_get_coingecko_id_coin(mock_requests_get): + mock_requests_get.return_value.json.return_value = mock_coingecko_search + assert get_coingecko_id('bitcoin', type='coin') == 'bitcoin' + +def test_get_coingecko_id_nft(mock_requests_get): + mock_requests_get.return_value.json.return_value = mock_coingecko_search + assert get_coingecko_id('bored ape', type='nft') == 'bored-ape-yacht-club' + +def test_get_price(mock_requests_get): + mock_requests_get.return_value.json.side_effect = [mock_coingecko_search, mock_price_response] + assert get_price('bitcoin') == 50000 + +def test_get_floor_price(mock_requests_get): + mock_requests_get.return_value.json.side_effect = [mock_coingecko_search, mock_floor_price_response] + assert get_floor_price('bored ape') == 100000 + +def test_get_fdv(mock_requests_get): + mock_requests_get.return_value.json.side_effect = [mock_coingecko_search, mock_fdv_response] + assert get_fdv('bitcoin') == 1000000000000 + +def test_get_market_cap(mock_requests_get): + mock_requests_get.return_value.json.side_effect = [mock_coingecko_search, mock_market_cap_response] + assert get_market_cap('bitcoin') == 500000000000 + +def test_get_coin_price_tool(mock_requests_get): + mock_requests_get.return_value.json.side_effect = [mock_coingecko_search, mock_price_response] + result = get_coin_price_tool('bitcoin') + assert "The price of bitcoin is $50,000" in result + +def test_get_nft_floor_price_tool(mock_requests_get): + mock_requests_get.return_value.json.side_effect = [mock_coingecko_search, mock_floor_price_response] + result = get_nft_floor_price_tool('bored ape') + assert "The floor price of bored ape is $100,000" in result + +def test_get_fully_diluted_valuation_tool(mock_requests_get): + mock_requests_get.return_value.json.side_effect = [mock_coingecko_search, mock_fdv_response] + result = get_fully_diluted_valuation_tool('bitcoin') + assert "The fully diluted valuation of bitcoin is $1,000,000,000,000" in result + +def test_get_coin_market_cap_tool(mock_requests_get): + mock_requests_get.return_value.json.side_effect = [mock_coingecko_search, mock_market_cap_response] + result = get_coin_market_cap_tool('bitcoin') + assert "The market cap of bitcoin is $500,000,000,000" in result \ No newline at end of file diff --git a/submodules/moragents_dockers/agents/tests/swap_agent/test_agent.py b/submodules/moragents_dockers/agents/tests/swap_agent/test_agent.py new file mode 100644 index 0000000..82f0fab --- /dev/null +++ b/submodules/moragents_dockers/agents/tests/swap_agent/test_agent.py @@ -0,0 +1,126 @@ +import sys +import os +sys.path.append(os.path.abspath(os.path.join(os.path.dirname(__file__), '..', '..', 'src', 'swap_agent', 'src'))) +# The above sys/os lines are needed because the agents have identical namings (i.e. agent.py, tools.py) + +import pytest +from unittest.mock import patch, MagicMock +from flask import Flask, request +from src.swap_agent.src.agent import get_response, generate_response, chat, get_messages, clear_messages, get_allowance, approve, swap + +@pytest.fixture +def mock_llm(): + mock = MagicMock() + mock.create_chat_completion.return_value = { + "choices": [ + { + "message": { + "content": "This is a test response" + } + } + ] + } + return mock + +@pytest.fixture +def app(): + app = Flask(__name__) + return app + +def test_get_response(mock_llm): + message = [{"role": "user", "content": "Hello"}] + response, role = get_response(message, "chain_id", "wallet_address", mock_llm) + assert response == "This is a test response" + assert role == "assistant" + +def test_get_response_with_tool_call(mock_llm): + mock_llm.create_chat_completion.return_value = { + "choices": [ + { + "message": { + "tool_calls": [ + { + "function": { + "name": "swap_agent", + "arguments": '{"token1": "ETH", "token2": "USDT", "value": "1.0"}' + } + } + ] + } + } + ] + } + + with patch('src.swap_agent.src.tools.swap_coins') as mock_swap_coins: + mock_swap_coins.return_value = ("Swap successful", "assistant") + message = [{"role": "user", "content": "Swap 1 ETH for USDT"}] + response, role = get_response(message, "chain_id", "wallet_address", mock_llm) + + assert response == "Swap successful" + assert role == "assistant" + +def test_generate_response(mock_llm): + prompt = {"role": "user", "content": "Hello"} + response, role = generate_response(prompt, "chain_id", "wallet_address", mock_llm) + assert response == "This is a test response" + assert role == "assistant" + +def test_chat(app, mock_llm): + with app.test_request_context(json={"prompt": "Hello", "wallet_address": "0x123", "chain_id": "1"}): + with patch('src.swap_agent.src.agent.generate_response', return_value=("This is a test response", "assistant")): + response = chat(request, mock_llm) + + assert response.status_code == 200 + assert response.json == {"role": "assistant", "content": "This is a test response"} + +def test_chat_missing_prompt(app): + with app.test_request_context(json={}): + response, status_code = chat(request, None) + + assert status_code == 400 + assert "error" in response.json + +def test_get_messages(app): + with app.test_request_context(): + response = get_messages() + + assert response.status_code == 200 + assert "messages" in response.json + +def test_clear_messages(app): + with app.test_request_context(): + response = clear_messages() + + assert response.status_code == 200 + assert response.json["response"] == "successfully cleared message history" + +def test_get_allowance(app): + with app.test_request_context(json={"tokenAddress": "0x123", "walletAddress": "0x456", "chain_id": "1"}): + with patch('src.swap_agent.src.agent.check_allowance', return_value={"allowance": "1000"}): + response = get_allowance(request) + + assert response.status_code == 200 + assert "response" in response.json + +def test_approve(app): + with app.test_request_context(json={"tokenAddress": "0x123", "chain_id": "1", "amount": "1000"}): + with patch('src.swap_agent.src.agent.approve_transaction', return_value={"txHash": "0x789"}): + response = approve(request) + + assert response.status_code == 200 + assert "response" in response.json + +def test_swap(app): + swap_params = { + "src": "ETH", + "dst": "USDT", + "walletAddress": "0x123", + "amount": "1.0", + "slippage": "1", + "chain_id": "1" + } + with app.test_request_context(json=swap_params): + with patch('src.swap_agent.src.agent.build_tx_for_swap', return_value={"txHash": "0x789"}): + response = swap(request) + + assert {'txHash': '0x789'} == response diff --git a/submodules/moragents_dockers/agents/tests/swap_agent/test_tools.py b/submodules/moragents_dockers/agents/tests/swap_agent/test_tools.py new file mode 100644 index 0000000..66b8004 --- /dev/null +++ b/submodules/moragents_dockers/agents/tests/swap_agent/test_tools.py @@ -0,0 +1,114 @@ +import sys +import os +sys.path.append(os.path.abspath(os.path.join(os.path.dirname(__file__), '..', '..', 'src', 'swap_agent', 'src'))) +# The above sys/os lines are needed because the agents have identical namings (i.e. agent.py, tools.py) + +import pytest +from unittest.mock import patch, MagicMock +from web3 import Web3 +from src.swap_agent.src.tools import ( + search_tokens, get_token_balance, eth_to_wei, validate_swap, + get_quote, get_token_decimals, convert_to_smallest_unit, + convert_to_readable_unit, swap_coins, InsufficientFundsError, + TokenNotFoundError, SwapNotPossibleError +) + +@pytest.fixture +def mock_web3(): + mock = MagicMock(spec=Web3) + mock.eth = MagicMock() + mock.eth.get_balance = MagicMock(return_value=1000) + mock.eth.contract = MagicMock() + return mock + +def test_search_tokens(): + with patch('requests.get') as mock_get: + mock_get.return_value.status_code = 200 + mock_get.return_value.json.return_value = [{"symbol": "ETH", "address": "0x123"}] + result = search_tokens("ETH", 1) + assert result[0]["symbol"] == "ETH" + +def test_get_token_balance(mock_web3): + mock_web3.eth.get_balance.return_value = 1000 + balance = get_token_balance(mock_web3, "0x456", "", []) + assert balance == 1000 + +def test_eth_to_wei(): + assert eth_to_wei(1) == 10**18 + +def test_validate_swap(mock_web3): + with patch('src.swap_agent.src.tools.search_tokens') as mock_search: + mock_search.side_effect = [ + [{"symbol": "ETH", "address": "0x0000000000000000000000000000000000000000"}], + [{"symbol": "DAI", "address": "0x123"}] + ] + mock_web3.eth.get_balance.return_value = 10**18 + result = validate_swap(mock_web3, "ETH", "DAI", 1, 1, "0x456") + assert result[1] == "ETH" + +def test_get_quote(): + with patch('requests.get') as mock_get: + mock_get.return_value.status_code = 200 + mock_get.return_value.json.return_value = {"dstAmount": "1000000000000000000"} + result = get_quote("0x123", "0x456", 10**18, 1) + assert result["dstAmount"] == "1000000000000000000" + +def test_get_token_decimals(mock_web3): + mock_contract = MagicMock() + mock_contract.functions.decimals.return_value.call.return_value = 18 + mock_web3.eth.contract.return_value = mock_contract + assert get_token_decimals(mock_web3, "0x1234567890123456789012345678901234567890") == 18 + +def test_convert_to_smallest_unit(mock_web3): + with patch('src.swap_agent.src.tools.get_token_decimals', return_value=18): + assert convert_to_smallest_unit(mock_web3, 1, "0x123") == 10**18 + +def test_convert_to_readable_unit(mock_web3): + with patch('src.swap_agent.src.tools.get_token_decimals', return_value=18): + assert convert_to_readable_unit(mock_web3, 10**18, "0x123") == 1 + +def test_swap_coins(): + with patch('src.swap_agent.src.tools.Web3') as mock_web3, \ + patch('src.swap_agent.src.tools.validate_swap') as mock_validate, \ + patch('src.swap_agent.src.tools.get_quote') as mock_quote: + + mock_web3.return_value = MagicMock() + mock_validate.return_value = ("0x123", "ETH", "0x456", "DAI") + mock_quote.return_value = {"dstAmount": "1000000000000000000"} + + result, role = swap_coins("ETH", "DAI", 1, 1, "0x789") + assert result["src"] == "ETH" + assert result["dst"] == "DAI" + assert role == "swap" + +def test_swap_coins_insufficient_funds(): + with patch('src.swap_agent.src.tools.Web3') as mock_web3, \ + patch('src.swap_agent.src.tools.validate_swap') as mock_validate: + + mock_web3.return_value = MagicMock() + mock_validate.side_effect = InsufficientFundsError("Not enough funds") + + with pytest.raises(InsufficientFundsError): + swap_coins("ETH", "DAI", 1000, 1, "0x789") + +def test_swap_coins_token_not_found(): + with patch('src.swap_agent.src.tools.Web3') as mock_web3, \ + patch('src.swap_agent.src.tools.validate_swap') as mock_validate: + + mock_web3.return_value = MagicMock() + mock_validate.side_effect = TokenNotFoundError("Token not found") + + with pytest.raises(TokenNotFoundError): + swap_coins("UNKNOWN", "DAI", 1, 1, "0x789") + +def test_swap_coins_swap_not_possible(): + with patch('src.swap_agent.src.tools.Web3') as mock_web3, \ + patch('src.swap_agent.src.tools.validate_swap') as mock_validate, \ + patch('src.swap_agent.src.tools.get_quote') as mock_quote: + + mock_web3.return_value = MagicMock() + mock_validate.return_value = ("0x123", "ETH", "0x456", "DAI") + mock_quote.return_value = None + + with pytest.raises(SwapNotPossibleError): + swap_coins("ETH", "DAI", 1, 1, "0x789") \ No newline at end of file diff --git a/submodules/moragents_dockers/frontend/components/Chat/index.tsx b/submodules/moragents_dockers/frontend/components/Chat/index.tsx index 01f6cd0..c79a4ba 100644 --- a/submodules/moragents_dockers/frontend/components/Chat/index.tsx +++ b/submodules/moragents_dockers/frontend/components/Chat/index.tsx @@ -162,6 +162,7 @@ export const Chat: FC = ({ await onSubmitMessage(message, file); setMessage(''); + setFile(null); // Clear the file state after upload setShowSpinner(false); } diff --git a/submodules/moragents_dockers/frontend/components/HeaderBar/agentSelector.tsx b/submodules/moragents_dockers/frontend/components/HeaderBar/agentSelector.tsx deleted file mode 100644 index 0775534..0000000 --- a/submodules/moragents_dockers/frontend/components/HeaderBar/agentSelector.tsx +++ /dev/null @@ -1,130 +0,0 @@ -import { Box, CheckboxIcon, HStack, Icon, Spacer, Text, VStack } from '@chakra-ui/react'; -import React, { FC, ComponentPropsWithoutRef, useState } from 'react'; -import { useOutsideClick } from '@chakra-ui/react'; -import { CheckIcon, ChevronDownIcon, ChevronUpIcon } from '@chakra-ui/icons' -import { availableAgents } from '../../config'; - -interface AgentSelectorProps extends ComponentPropsWithoutRef<'div'> { - onSelectedAgent: (agent: string) => void; - selectedAgent?: string; -} - -const AgentSelectorItem: FC<{ selected: boolean, agent: string, agentDescription: string, showDelimiter: boolean, onSelectAgent: (agent: string) => void }> = ({ selected, agent, agentDescription, showDelimiter = true, onSelectAgent }) => { - const handleAgentSelection = () => { - onSelectAgent(agent); - } - - return ( - { - console.log('Clicked agent:', agent); - handleAgentSelection(); - }} - > - - - {availableAgents[agent].name} - - {selected && } - - - {agentDescription || ''} - - - - ); -} - -export const AgentSelector: FC = ({ onSelectedAgent, selectedAgent }: AgentSelectorProps) => { - const [show, setShow] = React.useState(false); - - const ref = React.useRef(null); - - const handleAgentSelected = (agent: string) => { - setShow(false); - onSelectedAgent(agent); - } - - useOutsideClick({ - ref: ref, - handler: () => { - setShow(false); - } - - }) - - return ( - <> - { - setShow(show ? false : true) - }}> - - - {availableAgents[(selectedAgent || 'none')]?.name || 'Select Agent'} - - - {show ? : } - - - {show && - {availableAgents && Object.keys(availableAgents).map((agent, index) => { - return ( - { - console.log('Selected agent:', agent); - handleAgentSelected(agent); - }} - /> - ); - })} - - } - - - ); -} \ No newline at end of file diff --git a/submodules/moragents_dockers/frontend/components/HeaderBar/index.tsx b/submodules/moragents_dockers/frontend/components/HeaderBar/index.tsx index 7833b0a..650b5f6 100644 --- a/submodules/moragents_dockers/frontend/components/HeaderBar/index.tsx +++ b/submodules/moragents_dockers/frontend/components/HeaderBar/index.tsx @@ -1,8 +1,8 @@ import React, { FC, ComponentPropsWithoutRef } from 'react'; import Image from 'next/image'; import { Box, HStack, Spacer } from '@chakra-ui/react'; -import { AgentSelector } from './agentSelector'; import { ConnectButton } from '@rainbow-me/rainbowkit'; +import { availableAgents } from '../../config'; export interface HeaderBarProps extends ComponentPropsWithoutRef<'div'> { onAgentChanged(agent: string): void; @@ -10,36 +10,27 @@ export interface HeaderBarProps extends ComponentPropsWithoutRef<'div'> { } export const HeaderBar: FC = (props) => { + const defaultAgent = 'swap-agent'; // Set your default agent here + const selectedAgent = availableAgents[defaultAgent]; + return ( - - + }}> + + logo - - { - props.onAgentChanged(agent); - }} - selectedAgent={props.currentAgent} - /> + - + ); }; \ No newline at end of file diff --git a/submodules/moragents_dockers/frontend/config.ts b/submodules/moragents_dockers/frontend/config.ts index f13d51f..0f4d11a 100644 --- a/submodules/moragents_dockers/frontend/config.ts +++ b/submodules/moragents_dockers/frontend/config.ts @@ -14,30 +14,12 @@ export const availableAgents: { } } = { 'swap-agent': { - 'name': 'Swap Agent', - 'description': 'Get quotes and perform swaps between tokens', - 'endpoint': 'http://127.0.0.1:8080/swap_agent', + 'name': 'Morpheus', + 'description': 'performs multiple tasks crypto data agent,swap agent and rag agent', + 'endpoint': 'http://127.0.0.1:8080', requirements: { connectedWallet: true - } - }, - 'functional-data-agent': { - 'name': 'Data Agent', - 'description': 'Ask about price, market cap, FDV or TVL', - 'endpoint': 'http://127.0.0.1:8080/data_agent', - requirements: { - connectedWallet: false - } - } - /* - 'rag-agent': { - 'name': 'Functional Data Agent (RAG FOR FILES)', - 'description': 'Mock of the Data Agent that supports files', - 'endpoint': 'http://127.0.0.1:8081', - requirements: { - connectedWallet: false }, supportsFiles: true } - */ } \ No newline at end of file diff --git a/submodules/moragents_dockers/frontend/pages/index.tsx b/submodules/moragents_dockers/frontend/pages/index.tsx index 4db49f7..8b0d192 100644 --- a/submodules/moragents_dockers/frontend/pages/index.tsx +++ b/submodules/moragents_dockers/frontend/pages/index.tsx @@ -10,16 +10,14 @@ import { HeaderBar } from '../components/HeaderBar'; import { availableAgents } from '../config'; import { WalletRequiredModal } from '../components/WalletRequiredModal'; import { ErrorBackendModal } from '../components/ErrorBackendModal'; -import { get } from 'http'; const Home: NextPage = () => { const [chatHistory, setChatHistory] = useState([]); const chainId = useChainId(); const { address } = useAccount(); - const [selectedAgent, setSelectedAgent] = useState('swap-agent'); // default is swap agent for now. TODO ask what should be the default agent. + const [selectedAgent, setSelectedAgent] = useState('swap-agent'); // default is swap agent for now. const [showBackendError, setShowBackendError] = useState(false); - useEffect(() => { getMessagesHistory( getHttpClient(selectedAgent), diff --git a/submodules/reward_check_agent_benchmarks/README.md b/submodules/reward_check_agent_benchmarks/README.md new file mode 100644 index 0000000..9469618 --- /dev/null +++ b/submodules/reward_check_agent_benchmarks/README.md @@ -0,0 +1,23 @@ +# Benchmarking & Testing Reward Checking Agent Guide + +NOTE: this is made for the router compatible moragents repo + +## How to Run the Tests: +1) In the parent directory: +- ```cd submodules/moragents_dockers/agents``` + +2) ```docker build -t agent .``` + +2. NOTE: If you are using Apple Silicon then you may experience problems due to the base image not being build for arm64. We have included a separate Dockerfile in order to deal with this issue, run: + +- ```docker build . -t agent -f Dockerfile-apple``` + +3) To run the agent: + +- ```docker run --name agent -p 5000:5000 agent``` + +4) Check if the agent is up and running on docker or not +5) If it is running, navigate to `submodules/reward_check_agent_benchmarks` +6) run `benchmarks.py` + +NOTE: If needed use your own alchemy mainnet RPC instead of the default cloudflare one in `config.py` and please `pip install pytest web3` \ No newline at end of file diff --git a/submodules/reward_check_agent_benchmarks/adapters/reward_check_adapter.py b/submodules/reward_check_agent_benchmarks/adapters/reward_check_adapter.py new file mode 100644 index 0000000..538c39f --- /dev/null +++ b/submodules/reward_check_agent_benchmarks/adapters/reward_check_adapter.py @@ -0,0 +1,12 @@ +from submodules.moragents_dockers.agents.src.claim_agent.src.tools import get_current_user_reward + +class RewardCheckAdapter: + def __init__(self): + pass + + @property + def name(self) -> str: + return "RewardCheckAdapter" + + def get_reward(self, pool_id: int, wallet_address: str) -> float: + return get_current_user_reward(wallet_address, pool_id) \ No newline at end of file diff --git a/submodules/reward_check_agent_benchmarks/benchmarks.py b/submodules/reward_check_agent_benchmarks/benchmarks.py new file mode 100644 index 0000000..a4e905f --- /dev/null +++ b/submodules/reward_check_agent_benchmarks/benchmarks.py @@ -0,0 +1,47 @@ +from helpers import ask_claim_agent, get_current_user_reward, extract_reward_value_from_response +from config import test_cases, reward_check_prompts + + +def run_reward_check_tests(): + total_tests = len(test_cases) + passed_tests = 0 + + for i, test_case in enumerate(test_cases, 1): + pool_id = test_case["pool_id"] + wallet_address = test_case["wallet_address"] + + # Iterate over each prompt + for prompt_template in reward_check_prompts: + prompt = prompt_template.format(wallet_address, pool_id) + print("-" * 100) + print(f"Running test case {i}/{total_tests}: {prompt}") + + # Get the agent's response + agent_response = ask_claim_agent(prompt) + print(f"Agent response: {agent_response}") + + # Extract the reward value from the agent's response + agent_reward_value = extract_reward_value_from_response(agent_response) + print(f"Agent Returned Reward Value: {agent_reward_value}") + + # Get the real reward value from the blockchain + blockchain_reward_value = float(get_current_user_reward(wallet_address, pool_id)) + print(f"Blockchain Returned Reward Value: {blockchain_reward_value}") + + # Compare the values with a tolerance of 10% + tolerance = 0.10 + if abs(agent_reward_value - blockchain_reward_value) / blockchain_reward_value <= tolerance: + print(f"Test case {i} passed.") + passed_tests += 1 + i += 1 + print("-" * 100) + else: + print(f"Test case {i} failed. Agent returned {agent_reward_value}, expected {blockchain_reward_value}.") + print("-" * 100) + i += 1 + + print(f"\n{passed_tests}/{total_tests} test cases passed.") + + +if __name__ == "__main__": + run_reward_check_tests() diff --git a/submodules/reward_check_agent_benchmarks/config.py b/submodules/reward_check_agent_benchmarks/config.py new file mode 100644 index 0000000..e684a3f --- /dev/null +++ b/submodules/reward_check_agent_benchmarks/config.py @@ -0,0 +1,72 @@ +import logging + +# Logging configuration +logging.basicConfig(level=logging.INFO) + + +# Configuration object +class Config: + WEB3RPCURL = { + "1": "https://cloudflare-eth.com", + } + + DISTRIBUTION_PROXY_ADDRESS = "0x47176B2Af9885dC6C4575d4eFd63895f7Aaa4790" + DISTRIBUTION_ABI = [ + { + "inputs": [ + { + "internalType": "uint256", + "name": "poolId_", + "type": "uint256" + }, + { + "internalType": "address", + "name": "user_", + "type": "address" + } + ], + "name": "getCurrentUserReward", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + } + ] + + +test_cases = [ + { + "pool_id": 1, + "wallet_address": "0x62aF7c48Cf412162465A8CaFdE44dFb17bA96038", + }, + { + "pool_id": 1, + "wallet_address": "0xC3B82270Db1b77B4bE28a83d0963e02c38A9d13f", + }, + { + "pool_id": 1, + "wallet_address": "0x03aa1e85487a5c3c509bc584ad9490a41d248011", + }, + { + "pool_id": 1, + "wallet_address": "0xEb4E7939C3bCC0635b8531e3C0a6bD42de95cfeF", + }, + { + "pool_id": 1, + "wallet_address": "0x5CD4C60f0e566dCa1Ae8456C36a63bc7A8D803de", + } +] + +reward_check_prompts = [ + "Check MOR rewards for wallet_address: {} in pool_id {}", + "Check the MOR rewards for address: {} in pool_id {}", + "Check my MOR Rewards for address: {} for pool_id {}", + "Check the MOR rewards accrued for wallet_address: {} in pool_id {}" + "Check the MOR rewards assigned to wallet_address: {} in pool_id {}", + +] diff --git a/submodules/reward_check_agent_benchmarks/helpers.py b/submodules/reward_check_agent_benchmarks/helpers.py new file mode 100644 index 0000000..2ff52f0 --- /dev/null +++ b/submodules/reward_check_agent_benchmarks/helpers.py @@ -0,0 +1,51 @@ +import requests +import json +import re +from web3 import Web3 +from config import Config + +url = 'http://127.0.0.1:5000/' + +headers = { + 'Content-Type': 'application/json', +} + +def ask_claim_agent(prompt: str): + payload = { + "prompt": { + "role": "user", + "content": prompt + } + } + + response = requests.post(url, headers=headers, json=payload) + if response.status_code == 200: + return response.json()['content'] + else: + raise Exception(f"Request failed with status code {response.status_code}: {response.text}") + +def get_current_user_reward(wallet_address, pool_id): + web3 = Web3(Web3.HTTPProvider(Config.WEB3RPCURL["1"])) + distribution_contract = web3.eth.contract( + address=web3.to_checksum_address(Config.DISTRIBUTION_PROXY_ADDRESS), + abi=Config.DISTRIBUTION_ABI + ) + + try: + if not web3.is_connected(): + raise Exception("Unable to connect to Ethereum network") + + reward = distribution_contract.functions.getCurrentUserReward( + pool_id, + web3.to_checksum_address(wallet_address) + ).call() + formatted_reward = web3.from_wei(reward, 'ether') + return round(formatted_reward, 4) + except Exception as e: + raise Exception(f"Error occurred while fetching the reward: {str(e)}") + +def extract_reward_value_from_response(response: str) -> float: + match = re.search(r'(\d+\.\d+) MOR', response) + if match: + return float(match.group(1)) + raise ValueError("Could not extract a reward value from the agent's response") From 6f6814bee8aeaf8aa10357fc7412847156f441cc Mon Sep 17 00:00:00 2001 From: danxyu Date: Wed, 4 Sep 2024 10:13:53 -0700 Subject: [PATCH 05/28] tweet generation ready, why is so much code hard coded for the swaps use case --- AGENTABILITIES.md | 29 +- CONTRIBUTE.md | 14 +- LICENSE | 9 + MORagents.spec | 16 +- PRIVACY.md | 26 + README.md | 79 +- .../macOS/Packaging_Instructions_macOS.md | 53 +- build_assets/macOS/README_MACOS_DEV_BUILD.md | 4 +- build_assets/macOS/license.html | 56 - build_assets/macOS/postinstall.sh | 35 - build_assets/macOS/preinstall.sh | 12 - build_assets/macOS/preinstall_ollama.sh | 11 - build_assets/macOS/welcome.html | 44 - .../windows/Packaging_Instructions_Windows.md | 4 +- config.py | 31 +- images/moragents.ico | Bin 361178 -> 1081406 bytes images/moragents_chatpdf.png | Bin 336927 -> 0 bytes main.py | 8 +- runtime_setup_macos.py | 84 +- runtime_setup_windows.py | 113 +- .../benchmarks/adapters/base_adapter.py | 21 - .../benchmarks/adapters/coingecko_adapter.py | 30 - .../benchmarks/adapters/defillama_adapter.py | 22 - submodules/benchmarks/benchmarks.py | 83 -- submodules/benchmarks/config.py | 270 ----- submodules/benchmarks/helpers.py | 54 - submodules/benchmarks/readme.md | 22 - submodules/benchmarks/requirements.txt | 1 - submodules/moragents_dockers/README.md | 188 ++- .../moragents_dockers/agents/Dockerfile | 3 +- .../moragents_dockers/agents/Dockerfile-apple | 12 +- .../moragents_dockers/agents/pytest.ini | 3 - .../moragents_dockers/agents/src/README-UI.md | 65 - .../moragents_dockers/agents/src/app.py | 331 ++++-- .../moragents_dockers/agents/src/config.py | 62 +- .../agents/src/data_agent/src/agent.py | 128 +- .../src/data_agent/src/data_agent_config.py | 27 - .../agents/src/data_agent/src/tools.py | 3 +- .../moragents_dockers/agents/src/delegator.py | 136 +++ .../agents/src/rag_agent/src/agent.py | 150 ++- .../agents/src/rag_agent/src/config.py | 3 +- .../agents/src/swap_agent/src/agent.py | 391 +++--- .../agents/src/swap_agent/src/config.py | 3 +- .../src/swap_agent/src/swap_agent_config.py | 25 - .../agents/src/swap_agent/src/tools.py | 2 +- .../src/tweet_sizzler_agent/src/agent.py | 121 ++ .../agents/tests/data_agent/test_agent.py | 95 -- .../agents/tests/data_agent/test_tools.py | 82 -- .../agents/tests/swap_agent/test_agent.py | 126 -- .../agents/tests/swap_agent/test_tools.py | 114 -- .../docker-compose-apple.yml | 19 +- .../moragents_dockers/docker-compose.yml | 9 +- .../frontend/components/Chat/index.tsx | 1044 ++++++++++------- .../components/HeaderBar/agentSelector.tsx | 130 -- .../components/HeaderBar/index.module.css | 16 + .../frontend/components/HeaderBar/index.tsx | 65 +- .../components/Settings/index.module.css | 107 ++ .../frontend/components/Settings/index.tsx | 80 ++ .../components/SwapAgentModal/index.tsx | 29 - .../moragents_dockers/frontend/config.ts | 22 +- .../frontend/package-lock.json | 31 +- .../moragents_dockers/frontend/package.json | 5 +- .../frontend/pages/index.tsx | 4 +- .../frontend/services/backendClient.ts | 343 +++--- wizard_windows.iss | 97 +- 65 files changed, 2346 insertions(+), 2856 deletions(-) create mode 100644 LICENSE create mode 100644 PRIVACY.md delete mode 100644 build_assets/macOS/license.html delete mode 100644 build_assets/macOS/postinstall.sh delete mode 100755 build_assets/macOS/preinstall.sh delete mode 100644 build_assets/macOS/preinstall_ollama.sh delete mode 100644 build_assets/macOS/welcome.html delete mode 100644 images/moragents_chatpdf.png delete mode 100644 submodules/benchmarks/adapters/base_adapter.py delete mode 100644 submodules/benchmarks/adapters/coingecko_adapter.py delete mode 100644 submodules/benchmarks/adapters/defillama_adapter.py delete mode 100644 submodules/benchmarks/benchmarks.py delete mode 100644 submodules/benchmarks/config.py delete mode 100644 submodules/benchmarks/helpers.py delete mode 100644 submodules/benchmarks/readme.md delete mode 100644 submodules/benchmarks/requirements.txt delete mode 100644 submodules/moragents_dockers/agents/pytest.ini delete mode 100644 submodules/moragents_dockers/agents/src/README-UI.md delete mode 100644 submodules/moragents_dockers/agents/src/data_agent/src/data_agent_config.py create mode 100644 submodules/moragents_dockers/agents/src/delegator.py delete mode 100644 submodules/moragents_dockers/agents/src/swap_agent/src/swap_agent_config.py create mode 100644 submodules/moragents_dockers/agents/src/tweet_sizzler_agent/src/agent.py delete mode 100644 submodules/moragents_dockers/agents/tests/data_agent/test_agent.py delete mode 100644 submodules/moragents_dockers/agents/tests/data_agent/test_tools.py delete mode 100644 submodules/moragents_dockers/agents/tests/swap_agent/test_agent.py delete mode 100644 submodules/moragents_dockers/agents/tests/swap_agent/test_tools.py delete mode 100644 submodules/moragents_dockers/frontend/components/HeaderBar/agentSelector.tsx create mode 100644 submodules/moragents_dockers/frontend/components/HeaderBar/index.module.css create mode 100644 submodules/moragents_dockers/frontend/components/Settings/index.module.css create mode 100644 submodules/moragents_dockers/frontend/components/Settings/index.tsx delete mode 100644 submodules/moragents_dockers/frontend/components/SwapAgentModal/index.tsx diff --git a/AGENTABILITIES.md b/AGENTABILITIES.md index ee8dccb..638377c 100644 --- a/AGENTABILITIES.md +++ b/AGENTABILITIES.md @@ -11,18 +11,18 @@ transaction. ### Current Projects: 1. **lachsbagel on Discord** - [this repo](https://github.com/MorpheusAIs/moragents): - 1. Local install architecture -2. **IODmitri, SanatSharma, LachsBagel on GitHhub** - 1. [HideNSeek](https://github.com/MorpheusAIs/HideNSeek): An algorithm for verifying and fingerprinting which model a compute provider is actually running - 1. Link to Paper [Hide and Seek: Fingerprinting Large Language Models with Evolutionary Learning](https://www.arxiv.org/abs/2408.02871) - 2. (pending) A follow-on paper exploring parameter size estimation is in the works. + 1. Local Docker install + 2. (pending) [HideNSeek](https://github.com/MorpheusAIs/HideNSeek): An algorithm for verifying and fingerprinting which model a compute provider is actually running + 1. Note: this repo will be made public under an MIT license following the publishing of a paper by the same name which is currently in the works + 3. (future) Posting Agent - an agent which optimizes content for social media posting +2. **IODmitri on GitHhub** + 3. (pending) [HideNSeek](https://github.com/MorpheusAIs/HideNSeek): An algorithm for verifying and fingerprinting which model a compute provider is actually running 3. **artfuljars on Discord**: 1. Windows Build (EXE version of .app) 2. Two installation wizards: 1. Windows 2. (pending) macOS - 3. CICD build for Windows - 4. (pending) CICD builds for Linux and macOS + 3. (pending) CICD builds for Windows, Linux, and macOS 4. (pending) Vulnerability scanning of dependencies and code 4. GenLayer 1. (pending) [FeedBuzz](https://github.com/yeagerai/feedbuzz-contracts) - AI filtered logging system to surface user demand and failure modes for new functionality @@ -31,15 +31,14 @@ transaction. 2. A [web interface](submodules/moragents_dockers/frontend) which is served by the local Docker installation and integrated with Rainbow, enabling the use of MetaMask, WalletConnect, and other EVM-based wallets. 3. A [swap agent](submodules/moragents_dockers/agents/src/swap_agent) which can iteratively ask users to provide needed details for disambiguation. - 4. [A general-purpose agent](https://github.com/MorpheusAIs/moragents/pull/34) that can ingest arbitrary documents, such as PDFs, for basic document QA and text generation. - 5. (Pending Integration) [Delegating agent](https://github.com/MorpheusAIs/moragents/pull/45) which can maintain user's persona/interests as well as coordinating to task agents and tools. -6. **Dan Y.** - 1. (pending) X/Twitter Posting Agent - an agent which generates spicy tweets with an X integration for one-click posting. + 4. (Pending Integration) [A general-purpose agent](https://github.com/MorpheusAIs/moragents/pull/34) that can ingest arbitrary documents, such as PDFs, for basic document QA and text generation. + 5. (Pending) Delegating agent which can maintain user's persona/interests as well as coordinating to task agents and tools. + ### Decentralized Inference: #### Non-Local Installation Agents for Permission-less Compute Pending Lumerin's work. Eventually Agent Builders will be able to permission-lessly upload Agent and Model artifacts to a decentralized registry. -1. [FLock](https://www.flock.io/#/) has built a decentralized agent, called [Ragchat-Morpheus](https://github.com/FLock-io/ragchat-morpheus) which will regularly be updated with most recent docs surrounding the Morpheus system for the following audiences: +1. (pending) [FLock](https://www.flock.io/#/) is working on a decentralized agent which will regularly be updated with most recent docs surrounding the Morpheus system for the following audiences: 1. Normal user perspective (broad Q/A for those new to Morpheus ecosystem) 2. Developer perspective wanting to deploy on Morpheus 3. Perspective of capital contributors @@ -49,11 +48,11 @@ Pending Lumerin's work. Eventually Agent Builders will be able to permission-les - If you are working on an agent which can provide value through open models and relies on processing public data, please reach out to lachsbagel on Discord (link below) - Otherwise, you are more than welcome to publish your agent to the registry when it goes live pending Lumerin's work and any other necessary pieces which come up to better ensure security and verifiability of models in non-local execution environments. - If you are working on security and/or verifiability of models and the runtime, please reach out to LachsBagel on the Morpheus Discord. - - Currently looking at [Hyperbolic.xyz](https://hyperbolic.xyz) and [6079](https://docs.6079.ai/technology/6079-proof-of-inference-protocol). See more ecosystem members [here](https://mor.org/ecosystem). + - Currently looking at [Hyperbolic.xyz](https://hyperbolic.xyz) and [6079](https://6079-ai.gitbook.io/6079.ai/technology/6079-proof-of-inference-protocol). See more ecosystem members [here](https://mor.org/ecosystem). - LachsBagel is also working on a new algorithm, named [HideNSeek](https://github.com/MorpheusAIs/HideNSeek), which uses a Transformer specific heuristic for model verification - - [6079](https://6079.ai/) will help with implementing the plumbing for [HideNSeek](https://github.com/MorpheusAIs/HideNSeek) + - [Atoma.Network](https://www.atoma.network/) will help with implementing the plumbing for [HideNSeek](https://github.com/MorpheusAIs/HideNSeek) ### Contact Join the [Morpheus Discord](https://discord.com/invite/Dc26EFb6JK) -*Last Updated: August 18, 2024* +*Last Updated: July 7, 2024* diff --git a/CONTRIBUTE.md b/CONTRIBUTE.md index 8c645f7..017c23b 100644 --- a/CONTRIBUTE.md +++ b/CONTRIBUTE.md @@ -1,14 +1,4 @@ -# Contributing and Future Interoperability of Agents - -**For contributors looking to build a local agent** please wait until a test agent being built by Dan Y. (mentioned in [AGENTABILITIES](./AGENTABILITIES.md)) concludes an integration with the new agent router in [Agent Router PR](https://github.com/MorpheusAIs/moragents/pull/45). -Around September 2024 the release of v0.1.0 will incorporate the above. -Release v0.1.0 will include new guides to easily and independently integrate your own local agent. - -Beyond September, the router will expand to coordinate the decentralized agents along with local agents to provide for dynamic workflow construction to satisfy more complex user queries. - ---- - -# Contribution Process: +Contribution Process: 1. Prospective contributors can propose an idea or find a relevant issue from [Issues](https://github.com/MorpheusAIs/moragents/issues) 1. See what's being worked on here in [AGENTABILITIES](./AGENTABILITIES.md) 2. Contact lachsbagel on the Morpheus Discord or comment on an issue above @@ -16,4 +6,4 @@ Beyond September, the router will expand to coordinate the decentralized agents 4. Developer produces deliverable 5. Developer will receive weights following delivery and verification 6. Developer must maintain functionality and resolve bugs to keep weights. No additional weights for same scope. - 1. If maintenance doesn't occur then developer will receive notice to maintain or risk losing some or all weights + 1. If maintenance doesn't occur then developer will receive notice maintain or risk losing some or all weights diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..826baaa --- /dev/null +++ b/LICENSE @@ -0,0 +1,9 @@ +MIT License + +Copyright (c) 2023 Liquid Tensor LLC + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the “Software”), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/MORagents.spec b/MORagents.spec index 3f50430..de8ffde 100644 --- a/MORagents.spec +++ b/MORagents.spec @@ -5,7 +5,7 @@ a = Analysis( ['main.py'], pathex=[], binaries=[], - datas=[], + datas=[('resources', 'resources')], hiddenimports=[], hookspath=[], hooksconfig={}, @@ -26,13 +26,13 @@ exe = EXE( bootloader_ignore_signals=False, strip=False, upx=True, - console=False, + console=True, disable_windowed_traceback=False, argv_emulation=False, target_arch=None, - codesign_identity='Developer ID Application: Liquid Tensor LLC (ZQN244GMTD)', - entitlements_file='build_assets/macOS/MORagents.entitlements', - icon=['images/moragents.icns'], + codesign_identity=None, + entitlements_file=None, + icon=['images\\moragents.ico'], ) coll = COLLECT( exe, @@ -43,9 +43,3 @@ coll = COLLECT( upx_exclude=[], name='MORagents', ) -app = BUNDLE( - coll, - name='MORagents.app', - icon='images/moragents.icns', - bundle_identifier='com.liquidtensor.moragents', -) diff --git a/PRIVACY.md b/PRIVACY.md new file mode 100644 index 0000000..45eaeed --- /dev/null +++ b/PRIVACY.md @@ -0,0 +1,26 @@ +# Privacy Policy + +This application is committed to protecting the privacy and security of our users. This Privacy Policy outlines how this application collects, uses, and safeguards the information you provide when using our codebase to build applications. + +## Information Collection + +1. Local Execution: All execution of the applications built using this codebase is performed locally on your device. This application does not collect, store, or process any data related to the local execution of your applications. + +2. External Requests: When using this codebase, your application may make requests to external services such as CoinGecko or other oracles to retrieve necessary data. These requests are made directly from your device to the respective services, and this application does not have access to or store any data related to these requests. + +3. Locally Hosted LLM: The applications built using this codebase utilize a language model (LLM) that is hosted locally on your device. This application does not have access to or collect any data processed by the locally hosted LLM. + +## Data Sharing + +This application does not share any data collected or processed by the applications built using this codebase with third parties. As mentioned above, the only data shared are the requests made directly from your device to external services such as CoinGecko or other oracles. + +## Data Security + +This application takes the security of your data seriously. Although this application does not collect or store any data, it encourages you to follow best practices for securing your local environment, such as keeping your device and software up to date and using strong passwords. + +## Changes to this Privacy Policy + +This application may update this Privacy Policy from time to time. You are advised to review this Privacy Policy periodically for any changes. + + +By using this codebase to build applications, you agree to the terms of this Privacy Policy. \ No newline at end of file diff --git a/README.md b/README.md index a346d73..3f62926 100644 --- a/README.md +++ b/README.md @@ -3,51 +3,41 @@ ## Morpheus Install for Local Web3 Agent Interaction -![UI 1](images/moragents_chatpdf.png) -![UI 2](images/wallet_integration.png) +![UI 1](images/wallet_integration.png) -![UI 3](images/successful_swap.png) - -![UI 4](images/agent_clarify.png) +![UI 2](images/successful_swap.png) +![UI 3](images/agent_clarify.png) --- ### Features -- Chat with local PDF files -- Swap ERC Compatible Tokens -- Fetch Price, Market Cap, and TVL of coins and tokens supported on CoinGecko -- Web interface works in your preferred browser: - - Chrome - - Brave - - with your favorite wallet extensions: - - MetaMask - - Rainbow - - Coinbase Wallet - - WalletConnect +#### Current: +- Fetch price, market cap, and TVL of coins and tokens supported on CoinGecko +- Web interface +- Wallet integrations for your existing wallets in-browser + - MetaMask + - Rainbow + - Coinbase Wallet + - WalletConnect +- Web3 swap agents + +#### Pending: +- Chat with local files agent (general purpose) --- -## Install -### macOS on M1/2/3 etc. (arm64) +### Install +#### macOS on M1/2/3 etc. (arm64) >Assumes minimum 16GB RAM -#### Steps to Install +#### Steps 1. Download and install [Docker Desktop](https://www.docker.com/products/docker-desktop/) 1. Follow default settings, can skip surveys, then leave docker desktop running. You can minimize it. -2. Download and install [MORagents009.pkg](https://drive.proton.me/urls/762Z6QFNH4#68MKubcGeDtf) - > SHA256 5200350bba351a40cfac5552476bad1bb67d32ff069a4d9ebc0b3556367673b7 MORagents009.pkg -3. Wait several minutes for background files to download and then your browser should automatically open to http://localhost:3333 - > Note: After installation is complete, the MORagents app icon will bounce for several minutes on your dock, and then stop. This is normal behavior as it's downloading a large 9GB file in the background. You can open "Activity Monitor" and in the Network tab see that it's downloading. - -#### Future Usage -- Open the "MORagents" app from Mac search bar. - - For easier access: Right-click MORagents icon on dock -> Options -> Keep in Dock - -#### Troubleshooting -If the app shows connections errors in connecting to agents. Please ensure Docker Desktop is running, then close and reopen **MORagents** from desktop. - +2. USe Chrome to download [Moragents.zip](https://drive.proton.me/urls/X35VBE3GWW#mtrqT6rAzZbi), open ZIP, and copy MORagents.app to your Applications folder + > SHA256 96c2510e4f7a752c613b322be0a107958ee34814415e3e7b950b426298379a7a MORagents.zip +3. Open **MORagents** app. Give it a few minutes the first time, and then it should open your browser. + 1. If there's an issue, try opening the MORagents app again ### macOS Intel (x86_64) *coming soon* @@ -58,20 +48,23 @@ If the app shows connections errors in connecting to agents. Please ensure Docke >Assumes minimum 16GB RAM #### Steps -1. Use Chrome to download [MORagentsSetupWindows009.zip](https://drive.proton.me/urls/8X58WAH80G#ib5r3K4WalDA) - > SHA256 6b8bd78571df2f5e8c6e516102aa05b1121d0214fdfb75a2be16146c22e0d2c52 MORagentsSetupWindows009.zip -2. Go to downloaded **MORagentsSetupWindows009(.zip)** file and double click to open -3. Double click **MORagentsSetup.exe** - 1. You may need to click "More info" -> "Run anyway" - 2. If that still doesn't work, try temporarily disabling your antivirus and open the .exe again +1. Use Chrome to download [MORagentsWindowsInstaller.zip](https://drive.proton.me/urls/9BE8X1ZMTG#Oh1SfTeklH4W) + > SHA256 0a5f5e3a288d45854c83994fa4afa4c713019229d99d67f28442fc56a5de1b20 MORagentsWindowsInstaller.zip +2. Go to downloaded **MORagentsWindowsInstaller(.zip)** file and click to "Extract All" +3. Open Extracted Folder **MORagentsWindowsInstaller** + 1. You may need to disable your anti-virus software before proceeding 4. Click and Run **MORagentsSetup.exe** - 1. This will auto-install Docker and Ollama dependencies. Those will ask you for confirmation. -5. Open **MORagents** from Desktop - 1. Wait for Docker engine to start... - 2. If you see any errors or if anything hangs for >10min, please try opening the MORagents app again from the Desktop + 1. This will auto-install Docker Desktop dependency +5. Open **MORagents** from Desktop +6. Accept Docker's EULA + 1. Surveys are optional, can skip +7. Wait for Docker engine to start... +8. Open **MORagents** App from Desktop + 1. First time installation requires some extra time to load agent's image + 2. If anything hangs for >10min, please try opening the MORagents app again from the Desktop #### Troubleshooting -If the app shows connections errors in connecting to agents. Please ensure Docker Desktop is running, then close and reopen **MORagents** from desktop. +If the app shows connections errors to agent fetcher. Please ensure Docker Desktop is running, then close and reopen **MORagents** from desktop. --- diff --git a/build_assets/macOS/Packaging_Instructions_macOS.md b/build_assets/macOS/Packaging_Instructions_macOS.md index cb8103f..7d1d4cb 100644 --- a/build_assets/macOS/Packaging_Instructions_macOS.md +++ b/build_assets/macOS/Packaging_Instructions_macOS.md @@ -1,58 +1,41 @@ ## Distribution -## Build and Sign MORagents.app +## Build and Sign ```sh -pyinstaller --windowed --osx-bundle-identifier "com.liquidtensor.moragents" --codesign-identity "Developer ID Application: Liquid Tensor LLC (ZQN244GMTD)" --name="MORagents" --icon="images/moragents.icns" --osx-entitlements-file "build_assets/macOS/MORagents.entitlements" main.py +pyinstaller --windowed --add-data "resources:resources" --osx-bundle-identifier "com.liquidtensor.moragents" --codesign-identity "Developer ID Application: Liquid Tensor LLC (ZQN244GMTD)" --name="MORagents" --icon="images/moragents.icns" --osx-entitlements-file "build_assets/macOS/MORagents.entitlements" main.py ``` -NOTE: you will need to use your own codesigning identity if you intend to distribute. Codesigining is not required for running it on the same mac you built the .app on. For this you can drop the ```--codesign-identity "Developer ID Application: Liquid Tensor LLC (ZQN244GMTD)"``` part from the command. -## Wizard Creation - -1. Download the dev version of the Packages app (it has to be the dev version because the latest build doesn't work on mac sonoma/last updated 2022) [Packages App](http://s.sudre.free.fr/Software/Packages/about.html) [packages_1211_dev.dmg](http://s.sudre.free.fr/files/Packages_1211_dev.dmg) -2. Download the files in https://github.com/MorpheusAIs/moragents/tree/main/build_assets/macOS, along with [Docker Desktop Mac Install](https://docs.docker.com/desktop/install/mac-install/) and the MORAgents.app you built in previous step. -3. In the Packages App...\ - 1. Create a New Project ... set the template as "Distribution".\ - 2. Under the Packages, either edit the existing package or create a new one. Set "Identifier" to com.morpheus.pkg.MORAgents, set the Payload to have MORAgents.app under /Applications, then under Scripts, add the preinstall.sh and postinstall.sh from the downloaded files.\ - 3. Create a new Package, Set "Identifier" to com.morpheus.pkg.DockerDesktop, then under Payload, add the Docker Desktop Mac Install under /Applications\ - 4. Create a new Package, Set "Identifier" to com.morpheus.pkg.Ollama, then under preinstall scripts, add the preinstall_ollama.sh script from the downloaded files.\ - 5. Navigate to Project, then in Presentation click the topright dropdown and select Introduction choose the welcome.html file, add a License section and choose license.html. - 6. In the upmost toolbar click Build -> Build to generate a .pkg file in the directory you saved the MORagents Packages package - ---- - ->Note: Following steps are only required for distribution. -If you are just running the app on your own Mac you can run the .pkg you created, and then open MORagents from your searchbar. -Future usage only requires you to run MORagents from your searchbar. - ---- +## Compress +```sh +ditto -c -k --sequesterRsrc --keepParent "MORagents.app" "MORagents.zip" +```` -## Signing -```sh - productsign --sign "Developer ID Installer: Liquid Tensor LLC (ZQN244GMTD)" MORagents.pkg MORagents009.pkg +## Notarize +```sh +xcrun notarytool submit "MORagents.zip" --keychain-profile "NotaryProfile" --wait ``` -## Notarize -```sh -xcrun notarytool submit MORagents009.pkg --keychain-profile "NotaryProfile" --wait +## Staple App file +```shell +xcrun stapler staple "MORagents.app" ``` -## Staple -```sh -xcrun stapler staple MORagents009.pkg -``` +## Recreate zip archive post-stapling +```sh +ditto -c -k --sequesterRsrc --keepParent "MORagents.app" "MORagents.zip" +```` --- -## Verify (Optional) +## Verify ### Verify notarization ```sh xcrun notarytool info "" --keychain-profile "NotaryProfile" ``` -### Verify codesign ```sh codesign --verify --verbose=4 MORagents.app codesign -dv --verbose=4 MORagents.app -``` \ No newline at end of file +``` diff --git a/build_assets/macOS/README_MACOS_DEV_BUILD.md b/build_assets/macOS/README_MACOS_DEV_BUILD.md index 223cea9..661bec1 100644 --- a/build_assets/macOS/README_MACOS_DEV_BUILD.md +++ b/build_assets/macOS/README_MACOS_DEV_BUILD.md @@ -33,10 +33,10 @@ For Intel (x86_64) 5. Build App for Local Installation ```shell - $ pyinstaller --windowed --name="MORagents" --icon="images/moragents.icns" --osx-entitlements-file "build_assets/macOS/MORagents.entitlements" main.py + $ pyinstaller --windowed --add-data "resources:resources" --name="MORagents" --icon="images/moragents.icns" --osx-entitlements-file "build_assets/macOS/MORagents.entitlements" main.py ``` # If you have issues, try - python -m PyInstaller --windowed --name="MORagents" --icon="images/moragents.icns" --osx-entitlements-file "build_assets/macOS/MORagents.entitlements" main.py + python -m PyInstaller --windowed --runtime-hook runtime_hook.py --name="MORagents" --icon="moragents.icns" main.py 6. Install Application ```shell diff --git a/build_assets/macOS/license.html b/build_assets/macOS/license.html deleted file mode 100644 index 2d8999a..0000000 --- a/build_assets/macOS/license.html +++ /dev/null @@ -1,56 +0,0 @@ - - - - - - - -

License Agreement

-

Please read the following License Agreement carefully. By continuing, you acknowledge that you have read and agreed to the License.

- -
-MIT License - -Copyright (c) 2024 Liquid Tensor LLC - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. -
- -

By clicking Continue, installing, and/or using the MORagents software you accept the terms of the License agreement.

- - \ No newline at end of file diff --git a/build_assets/macOS/postinstall.sh b/build_assets/macOS/postinstall.sh deleted file mode 100644 index 60703a0..0000000 --- a/build_assets/macOS/postinstall.sh +++ /dev/null @@ -1,35 +0,0 @@ -#!/bin/bash - -# Function to check if an application is running -is_app_running() { - app_name=$1 - pgrep -x "$app_name" >/dev/null -} - -# Open Docker Desktop -open -a "Docker.app" - -# Set the timeout duration (in seconds) -timeout=300 # 5 minutes - -# Wait for Docker Desktop to be running -echo "Waiting for Docker Desktop to start..." -start_time=$(date +%s) -while ! is_app_running "Docker Desktop"; do - current_time=$(date +%s) - elapsed_time=$((current_time - start_time)) - - if [ $elapsed_time -ge $timeout ]; then - echo "Error: Docker Desktop did not start within the specified timeout." - exit 1 - fi - - sleep 1 -done -echo "Docker Desktop is running." - -# Open MORAgents.app -open -a "MORAgents.app" - -echo "Post-install script completed." -exit 0 diff --git a/build_assets/macOS/preinstall.sh b/build_assets/macOS/preinstall.sh deleted file mode 100755 index a18eddb..0000000 --- a/build_assets/macOS/preinstall.sh +++ /dev/null @@ -1,12 +0,0 @@ -#!/bin/bash - -python_version=$(python3 --version 2>&1 | awk '{print $2}') -if [[ "$python_version" < "3.12.0" ]]; then - echo "Installing Python 3.12.0..." - curl -O https://www.python.org/ftp/python/3.12.0/python-3.12.0-macos11.pkg - sudo installer -pkg python-3.12.0-macos11.pkg -target / - echo "Python 3.12.0 has been successfully installed." - rm python-3.12.0-macos11.pkg -else - echo "Python version is already up to date." -fi diff --git a/build_assets/macOS/preinstall_ollama.sh b/build_assets/macOS/preinstall_ollama.sh deleted file mode 100644 index 412743c..0000000 --- a/build_assets/macOS/preinstall_ollama.sh +++ /dev/null @@ -1,11 +0,0 @@ -#!/bin/bash - -curl -L https://github.com/ollama/ollama/releases/download/v0.3.6/ollama-darwin -o ollama - -chmod +x ollama - -sudo mv ollama /usr/local/bin/ - -nohup /usr/local/bin/ollama serve > /dev/null 2>&1 & -/usr/local/bin/ollama pull llama3 -/usr/local/bin/ollama pull nomic-embed-text diff --git a/build_assets/macOS/welcome.html b/build_assets/macOS/welcome.html deleted file mode 100644 index 585d5ea..0000000 --- a/build_assets/macOS/welcome.html +++ /dev/null @@ -1,44 +0,0 @@ - - - - - - Welcome to MORagents v0.0.9 Installer - - - -

Welcome to MORagents v0.0.9 Installer

-

Thank you for choosing to install MORagents on your system. This installer will guide you through the process of setting up MORagents and its dependencies.

-

The installer will perform the following steps:

-
    -
  • Check the installed Python version and install Python 3.12.0 if necessary.
  • -
  • Check if Docker is installed and install Docker Desktop if needed.
  • -
  • Check if Ollama is installed and install Ollama if needed.
  • -
  • Install the MORagents application.
  • -
-

Please note that during the installation process, you may be prompted to enter your system password to authorize the installation of required components.

-

Click "Continue" to proceed with the installation.

- - diff --git a/build_assets/windows/Packaging_Instructions_Windows.md b/build_assets/windows/Packaging_Instructions_Windows.md index 51d3147..6e8910c 100644 --- a/build_assets/windows/Packaging_Instructions_Windows.md +++ b/build_assets/windows/Packaging_Instructions_Windows.md @@ -10,7 +10,7 @@ For Windows: 2. ```shell - pyinstaller --name="MORagents" --icon=".\images\moragents.ico" main.py + pyinstaller --name="MORagents" --add-data "resources;resources" --icon=".\images\moragents.ico" main.py ``` Windows Inno Setup for Wizard: @@ -18,4 +18,4 @@ Windows Inno Setup for Wizard: 2) In the GUI, enter the text found in [wizard_windows.iss](../../wizard_windows.iss) 3) Click Build > Compile 4) Hit the Play/Run button on the top -5) Installer will run and create a Desktop icon to run the application. +5) Installer is the diff --git a/config.py b/config.py index 00ed5df..ca7ea60 100644 --- a/config.py +++ b/config.py @@ -1,7 +1,9 @@ import os import sys + from utils.host_utils import get_os_and_arch + os_name, arch = get_os_and_arch() if os_name == "macOS": @@ -14,28 +16,13 @@ f"MORagents needs Linux support! Would you like to help?\n" f"https://github.com/MorpheusAIs/moragents/issues/27") + class AgentDockerConfig: - MACOS_IMAGE_NAMES = [ - "lachsbagel/moragents_dockers-nginx:apple-0.0.9", - "lachsbagel/moragents_dockers-agents:apple-0.0.9" - ] - WINDOWS_IMAGE_NAMES = [ - "lachsbagel/moragents_dockers-nginx:amd64-0.0.9", - "lachsbagel/moragents_dockers-agents:amd64-0.0.9" - ] - - @staticmethod - def get_current_image_names(): - if os_name == "macOS": - return AgentDockerConfig.MACOS_IMAGE_NAMES - elif os_name == "Windows": - return AgentDockerConfig.WINDOWS_IMAGE_NAMES - else: - raise RuntimeError(f"Unsupported OS: {os_name}") + CURRENT_IMAGE_NAMES = ["moragents_dockers-nginx:latest", "moragents_dockers-agents:latest"] + CURRENT_IMAGE_FILENAMES = ["moragents_dockers-nginx.tar", "moragents_dockers-agents.tar"] + CURRENT_IMAGE_PATHS = [os.path.join(repo_root, "resources", img_filename) + for img_filename in CURRENT_IMAGE_FILENAMES] + class AgentDockerConfigDeprecate: - OLD_IMAGE_NAMES = [ - "morpheus/price_fetcher_agent:latest", - "moragents_dockers-nginx:latest", - "moragents_dockers-agents:latest" - ] \ No newline at end of file + OLD_IMAGE_NAMES = ["morpheus/price_fetcher_agent:latest"] diff --git a/images/moragents.ico b/images/moragents.ico index 5c8d25662ae9f5bef9f98b9754832508b406750c..6c951a11d990025b0d6d7d23cb88a9486919dc4f 100644 GIT binary patch literal 1081406 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 #UujUf3LgTObbs=&DF|fX# z+W*!B`H$_hZP6_1*r?x&gJ-fBTzEe*tZLkPsp*fBpJ;60+Q4T>!VL`2+pm{efm{+z z9C23%>fVjVw82~jlzzpDJ^D{PrEgX)+^H`D`#(Y3r6Y zSQXdI||JCHQ0#;U0VQzIIIkPvz)jg2qu5_Im4D+wz4yb=|2=X1|2Y0j|9AKN|1|!8aDA2TPjhbW z)Q`H~^M4}#SJQ(>_^&y?Now<38ktwuLG9km5_hOPX9RKk# zTrc2TxKUx zXb%tvYYt$D`NCN^fE;{(+HX7amrt(Y`#0JOxDH|da{Pda*gv|g$wrqov%lp(KW;w2?u{$vY+ASQ z`}1ctbFPHR8!a{|}hw zQ@y+T|I`%`$1%5u`u|R1b!h+=&M&t$tLgiGd;NC(rHq|D6S4zO1#HWfDqFd-6fU=z`M{;t2cOX1!d$@2Sp7em`bq2m z!D26-pSabr68wy|=@aCmcd+IrsNUZX=7asr4r&4GRr8;PGw7u^P%CwT%}HY77UF$+|171i@bdZa z-t;40!~Eav>zeI1e(hy=|G3R;tFdL|$5U|a?s|C$K0qP<>$dd&wYAJn=9nn{52-GK z*k5^obc%kz_&Cx4q~Y{(aQ<0*fv&a&coFgb;!HS3XaZY_{k!mwX7y&Q4GrYnffW6K z>uu-Se!FmVg{>w2U%9-+M&ScSmNdJqZm(F@dXtTgwAsk=*6*)a(e_y60(S0PIk0`( z%0J(`Yn3gS-HO(;0e=o3sy2`R6_wO?lt~XYwfJ95jo~!@=Y5@rg8y)KnWoqiqyHbr zf3E#lqV~S=|JHowj|ct>&lLN6dYLKnMJM=D9{x*DS6O+Z2T&b7fL#AS=Ki(k=-=N} zOkEm%a+Z|YT6}<=^!1Ssa2kxibR|JOK%=Yqzy4y*ESq%%c5I#Hp31*H9RLBM`{<9~$rfa|`^}vGVX=*e*O*9lGlF^4fkc z-X~s#qjL5B@(s|eOS@Kuzvub@ptI0i!6^0p+n1-{5ft}pE`a*mp#NK%f&ZtcKl%R# zVtw`c&Be;>_|65y>GZAx`x9^n!nZWImId?b$e*<2;KIT8*)!7c13||RG*R!DBKJRp z=D!cFySah6zvR68+o%a-rog;Gdj1ba=?NTw2M;*zf9>+DZC~F^{4e~kxBey{adET5 z&yN!SmH!w1*U;lg`oB1QL@Ei-LBAi>|H%hP2>Hh|)iC8ixYfo(%wsVI^#_@k8TF8|n?c=tJ+l97rMW;C%?fCPRE88Av zP2i3lquFgcSAK8%jy1Mt&uaLKK59bgBNY$fZ`Z=B)H3TckN>4`0A*Owm>(c6!0`d% z1PX0pT|hzXFCJj>_+LF~r}4iq9-2~~0-ss=|19VIlT!abj{j(W>(M;lYy2N1ubPA- z{3!9i>?6!k6~_LK`+vywveIFAIe-ey|G@{SR?HjB_W(@MqraJ6z1?lh^X*}_@0>E` z(&l{t@c{ex)zIrVXeUmEv5+0d4j&8IKKASJHESy9{Znpp=Q9g%27QF_BUDq6WtMOz zQEGACU-&P7<4*A3!+wtsaB~6B^~XX1*AGa1fHeH#`}3NCeEop@0`;sBcU=L#YnGsL z1*-oKqhH%On&EpZH=x>p%6$A!4PFS&-}V0?_n$<^*Pf}eBirdsGrtMVKb!yEhqlkMr;m)-n$b2}g{=nP3vCtmJzKr9E06tp4!5^$oAteG z=XN}jwShZ!?5N$jXZ3e??pbR)cdxU(d)M0fwR7;R({Lma^fqC5w=f)49{lwf|LK?U#Nj`&RZRE~mv^uD zACPwFBgB7KbNdM3zqo8^{-a)6-T2 z?~M)sA7B|;fHlkj+O)pXwr%#?j&0SpeS5WS+wQYX%mrGvq0CnDxHJRvnEx}#9N-@2 z0Jpak!4ET6fL=FAa4{BT{x7k={+4?G=KKHW=KyNXpNI3_b~5}I)`x=h;#WU_u^fPS z0p|m7T)mz@s{d1bUju%L7m#+q^%KVD*}b~S_5XE!0`S3n_&_Tcrd%(iF!gO==GkVc zQ_s<(_w@e7^sFJb4Zp3K_6cxI{r)r?xP@M}AvAw8`V-^;Dx4;;nH)fxIzaXNPlAK< z=nvdP{NIc2y)}jJfTm!ez1kKHH=zA%aPj{ z(ZvtAIe_}@ZuPr9sQnZ1U-}E_E!4L|{r|#Tzj4+8{(zNR(0B1Fnyv4=VfbFb;CpT zIP-4r-Mzq$A6fa`9iuZJsUAVEyz)xfo_*`Ty=VV=+p~Y8v!|ZgL|$w;y|5bLNTO(M z>K*=9Rn~D0l20x3Vt@5kt-g&-)CP?C0Uj^l`2wCsQ2Bq?>mI)W4WL_Z#?OLpyp>B|Hs#)JMbrYj{vb#igonXJ?^KL z|Mv&b+>GJB*3*Zvrh4bJTU*sf0Y1CjasLk=|HnUz`yBMp6J9dc)~{Ir%;TxmECBlR zr>N5xXD=T>Jiy#prM7^We(B;;8y%^z(G~ClE6ES6V3yt}TEC@bHh+GJ&6)-0Jy>Sl z-T9t>S^S73v44`eLiMqH>|YDlpubgv4!@B5pA7#!Kfv3n7l2H-AEpOQHGa0thcBh? z;=T{ZRrieIe-l3D*X?iP5|0iE+-f)`U$8o#-%v#&EY0x%;?du)B_kr<~ z+qyOVR%rY7EViSEN9i@$^X*q&d31UO??15V-TenPo3p33+J5Y*{abAJuJ!0@n&3m~ z$MN6)Fz_GkpLz^Uil!VyEJ7-RgVgwg1BYyym~u>DeB3{O=v}yf2d1+bIv=#|Ka> zUPCOa+ivZM4Pbu*vxTA&Vt@RLpu>JJ8QwvESF?YG{da}`)b_i&G-CT2IDP2>g;nws zTu*=c`ub$-SMPt}zncS09y^Hduybvjo8K$^_f=3A= zU_Kl+*p&tIRMQ@V18;%XR*gU({e0S(|Jy@vAIi^IMq6utIR@nT(gsnpBwqRyGenHq4&WPBywaxZx|LA!;d2oh}%w{(3{1|fp8uL8> z9)iC*5&xx)R1QV;|AAly+zs`QcW?(V<=d9H&Nd1M2yg zLL1OePC&g9hT#7-2YC^*|CTMt*z=dR*tT`OdHi41cN4xBV*UEH1GaG;e!`e-;Qqn= z%k0GQRkm(zpKV$<<6X|}kNn@>LtA(4JGjmEAKIR`gF9?LcHrPna%Wp@V4#H_+h{r) z8ptC>@m&@F*TMy&sS*cJa<}on#|KQ{0Se>)Li``A1Dq`OpN{`;y>@eA-2$&B*$-Y; zK56{FhyQ5*J^a7C^NC zXad8Vb8z`^0o@&N0{8+wZ~}es`_AYW)YHjaTr>l%E%eO6XJ}NuAI@Lc9~1V|Um#3f z+)X)u@L$}+_`E;jdN0nu)pk7o2mck@H$+1Y`vYkET@FCp0FSxef9n5->3O>E>IT97 z2%5d!>pQ6PQ~sYCfGQu)Vb+o2e=s|Q&bhvPc>gP5&z{&Njstb|6%lg zF?jvvrh3kgGUhsSOjP?1|DS{hXp#;PeW3aPiVJ8;g{%V&bdtUZ$^~TL0(#ryHg_dbZ+2* zW4n8vI=u6*4jkEO<92wr9l#DB*<%L}?0_HZa`>OiX1KoU={p%_J&+ENoGKcCq7vpk z7JtwO(7ycsTh$2O3jg8b9sc7di2t9)f4BBeY5dQ%dK3OXgzNT$I4XR5K&H>ncPb%9 zs|Wv+WAXpZ?|ABt z2VWr0Ky!Y@_s3n#uU>!B`xE=4kCShqo&(YxDE2Sx_bVUdR=Dr&_wYZj^;6G+DDUfY z9Dwxxnh7L7K)OKTzT$pq0i^*@J)rv7MCe<;Yh9-W;X8c3D)@hL1M~u1NBvnu{e7uj zkAvq)=Jz%er=K{m&=yjwmqriJhVNQW4nSMg5o*p)jQYvN^V`8adL4Hq$OAAJh!|hF z0qH5asdLxu{tjy1!T&7J>&P+>fc;CDeY=!dH?wi*zj^^Q!wqO2 zKr1uQlf?h(1)M}bshYreY&a^F? zhMjr0j~`uaXP((euj!fCufq7c-#vV6FM8MlJG$QvV@HlX zh3!Wh(?>7tM&?Fk=`kI5_+Lp4KzT(7K2W-7v;ZYRhxNt9>a&8euc)M!ed@b5K^x%J z28{O%n8Xio8bQ?&$QRI>cf)SQ19ncC=J+0wW_Bj=AvYx8` zzY*@MNIdtGfd6AYK!P|wLElYgdr{|trit=o$G3-RB3{6YWSyL~_DF-paq zD|W^LRpRO4*wN`l@d3mI2+tGr2vDCO^$IMs1p69fH#F&55V{P@e5Sb zFOFXvb`AQ!y&Hzur@4UY2`GNM1TMabnl|vC7&k^tA7>_V6Sev$4=f;#WwtMU>&5-| zD6U8EKZ6A`{m~>5Gt}{wEqH-fxUM4n;ixRR_?lJ^<(fvaAvE0W?E-h?#%V z2KF%@K>ZYky3@=@V#eRRCOfoizFj=I(Y6V{!Tycl{6=tIwh64C)HcqdxAZLAylJ)_ zJGRE2d1kY_ziHzfwsUxoIo~~aa7h*4?V6OMact{s6UE)0O5Te|BKnD$Li?d5^PLJ#gRSj^C4WR`@T>70xOT?ns;+7}kxrh7S*28^o zJN|qZ=i_H{Jkx3V_Rv>K^=W?9^x;075+_0{nIwKdeSqwS0F-2LE7Ej&Oa z+`o_dKUe?1td;K|{sY{nUtcqQYFbhicKoS%HlNHQkO`&N1brkNY4`2a(`%*LUnuRZ6d|6dI?@wK*yIe>Ep)E6g6 zFW`Fm|1{Y*zjhV;pJf}C(GOsGqwQGLWi|LNPBW|ZMK*=!%Q*gXPN-*cE%+ZK&z~l? zSMR?Bvwvdr{;S8t|EvDLAy(~fw}JcO0)~2|jimPx^%60Bratoj>X*<1|38D=$@2Nl zcJ=HQJHBtkc5a?+TQ|+I&6_dm9c5d$vTy4g`bo^4)V6J#ZzoS|u=D44^1OMrb@Tjj z+qPx?dk+)*kDYpI)sa&NesuISSpW2)o9yW6BX(@ePCR|s)@>R=1JFs|gcN*I8VySn zpEZOZ8UZ`Q{Kjaji$mk4*k9ORTncCEd;;YG#0%UZ4=`2_P*TeC-EC?7?>zqhAP;cs zb8i~|$F9vM5&s=NP#;F`pY-F1|9*O~tUGM)f9Lw%+IQw%+Tsb-4q42;Z)V1 zR`{=+zc>Kptd+|UpCRm5AN?x$fe`usgWKj%j}W9!2Xk2b7cL@KZks5R!^n~02+9#lit4#%tIVx25_3X0nJGq?n}|@u-h)2TxUmiFR{Jb7En(* z-?o9{6K(s}h31UMw-?wBdNMxq^cK5xd6#>QdyMC9+p<9Rqn%q9t$G+fz}d6=g2$gZ z{3j=#Ic&0%XOG@w$Il$IlVf(8?T$Sg=!?;fFG(F>x)I+hLT)Mw{zq?%|0VbadHnZy zfjh;2@&Vw!dJH@KFTj5J0Uo}8*!D&qU>g5#yRPc`9K-)y>l4KPkKupvLE--x-hA*_ zibuHhId*T4!T(o=EWU83J@?IjX)k{3-&kzb0V@jBv!>>IVt6=xZ|{HW&+EOf)>PFU zD*o3x{>b6~*fAgP56CZ3V^?N@w{Ss&xG-qtLJmiQ(u96U4ioa zesb^X*Du_5{5-g?_n!>&3-@`r?`;e5-@O-~Q+a*ie;v6c^{E%`d-xyH+#0xl&8^pr z;V}Gl1byFuZL?eq>*0S5KEVq3{{*#aF)%*EydKT?ZB3Wk(}x#;+4baY>35r;hYh%% z=CMqI=QU6h2-nfUj6cl*Xs7nC4Qpb?jrssIf_(!WapwI*(f-%LgEJ2R?!SlLeywN= zH2-(WoCN)Fg7g@Qp@na>-}%;ScJ|aTwSQULNl(E2>-+FMlox*R`KgKLyLZ02E!TWa zwU7J_2A5wCx38W*>i;L~mk%HvK#b#_W?hKz9O1s|EBiV#%t>MnBK__n)KsbmU>xm0 zORkQbNQzp=A$t+*-cN6(eLI)f?wyNm$M%I7zJRkuY!}(i9gALA~5O8=cabNq9s&K|eZ=T0~~b^fH?Y^S;J*(qjeKE-U!0nUkb z&JXHMLUFj2gjM)r#0BV*$|9@{!g|H~Sdnr8XamZl?smzz4qy@vz;OazJ%G2(<9``F zhKr;Fn1KHi?@#mtT>l{T5b(_Dvpuf&=51Liz07~C>;LmwZq>Fa|KCKfizhArpH7A? zi{7`$%az|vJi>F8|8FFZdTS1IYVf~EbGC{16HE75cJ)E4XdJ*#lh$_ZH{<(g&1126 zpyuJcFwJrQZ~*cJycp|2|GfwGe%|`;dIfSmt6#8u0M|1RT(88c=ouhvS6uJa@o8HH z#(UFyyGLywwrBTpY#Fzgx$T}kOKq2o z`xEWLr9F22`e9zb6#s$u!FKFeW;^gFWIJ~*`P@{3|LL=*=bt`z^6#ELf6C5WIPL7| zOHbQPcJUc|y1?gqec4B$W{7ItiOQQK} z$@r*sM2wQc6@^z@6!oiFq0lYONsyI4u%~6zjR*2 zc5QC4fByS#+l6Q5*@orJ0~$%%!3}*jrzeR9P}j^|x{a6k{fb#>2ber4&zJd4vX#<4+d3~Vb z7v%#AxB#ynz}vdIfGY4`K7)t<>VM+d4K2WA`GE1be>(o>nBBNeCck|H|9$X~%^is+ zEB+V$lLO2WBaO%JcNzZ&S)Uu>N5}bt4;<4eTHnS$r{2HtoWGSH@?pRA?H~8nQN{oH zUcco2!5~jtHTn5-`}h1PUgPyhbUXmxMKg50SY8@?56ACxJN`ZoF#gZuKXnRG^6pIy z@TnE9&QJaS)nCBPu4iUY5OZ_u$=@H@JHuMrm;n^7v)YD`g%eR*zH+W5*_VMw$P%xr zUwwB|rCmF-$Y%7w>7xbA(GRc#Y;PuxAL?V~FZq0Jl?!NdvwzUZ5&LJkFP@+&U1hVF zbJr=qpfhYM7qq(E|Loo{+dBIHQ3o&-LJt?WmCPjGzM;{6?HgC@g)5`Beku4rnnMHF zOfTRj^KYiLQqa|g-wSHstrIs6}CHb4&i?_#D;79XG< ztzRxlEj&Jge1RtV1S%KM$6T8>W&#ZLGV`tj4CL{4v;aLVway3VCI3Iv9f1$<*`iq~ z8>X+|GV1>~tjO8O!kDcaiP?YgyFX#)PcO373-Jd=nr++ioUL2ZX4T+-v8!hpJBJ_e zIji$<{JiCN)o)Z+N8exSBpTrU>)=hq|A*8gfgC^_j-)9QB@aT)A9=w9a{;6SOejBq zF2MCsknWKjfbhQ;4aEY!^G@peU%Yz2p1q7-?$jPTb!s2B*V*yoJLr|O#SR|YjBUa< z*f?hL6AEp;UAunFUVHs%_OHf|Sc|Qv&+gj1J+;Q3x?!jIZV&7q{r&4MK6mxc&R)G} z=fU?2va6Te?eouFa+rVN`O79d`~0PGJIC$I&t10Nd$uwQcnChE6+J};&MJ)#HEtFD zq?MFQGe&;ZGh+W@ZkJaPOBQS09n%GP^?=0x`ThWG$!EG*fnHvqSRAKx0OYvJS##ZO z`2drcH#fkG^CxaSKVicDLcKtFStWl*?@b&$-g9m0&Q*R;{?@(O)ZqWv^+TNOhYM@% zdP4I5I>z9nW&p_lZ-&!zTBHIUo40P<_V)l6g#S&p9sl3k`EuLuRrnn^ zMuj`#1)UrgO9i# zxU=B@XY~5fA2!(TZSD4}-@Iy9FD$oZv+Hat`v1M_+HBJZu_AsAfo#D!^x&@*@3+0QUp{Sb{KQ#1e0Y7{4#`(2^bzv6pE|JN&)^s8xb_~%zvo|n{S(i=^pc%> z{)%0^ehqtW+%CWHoXIY+Uv}{Y>_r~OE@4-(qsI@}qPa8anc2m;+UoGXIzWD>I%%bq z4QK%1`X}Ijg)haL$+}5Cz?tU<6ssoy+`hK-4Z5i=umJzd%Jn++4x9x0wa>%#nbJvf|Xh5wE8?rTBId_VZ#{88Zl zJ)S4G`>iK^Y$E;>^9%dEe!r8x=3#xdDfl~u7=OFlQ;Gko^;e&N@zl!q_xE?8_4B)# zHQLGtP+fpHfe@PYj=o;|;@5x6zWmSsM|^;PW>-G@6}$LT-?Zm`=@0Dsmw($7s_OubZAf#QfdN_?tPDupD|n z%@S&Fu5tDLxl|c*lz2{e0AHYnxIeJr0=ClCP19&#>4-|R1m@&D~U*8_Y^$HR+fJ?`J-{ow)JvEtmj?J;_QpXE{bI}?2Z?|ku&(ZsD6 z_j}vI*k8B3xZm5}i2w6Gfb#t;57Z=$U`UQ7Uw>O&}KOJCu zD|!8H@?e?zO7JZ}jvLJzzQJHWbpnmG#P(^MjUOOg;9xgCLBD3?lvywR|N7e_)WAon zH)yg^W)936j4&fOWFt%JxgW7_ed{HA?$W5OSb$b;amIG6Y_{#p2JCB%xf%c+)BJBc zwei2|DueVLke;G}-u-dv|5W=QX9j4PdI{AeO7kZ_Af~?my)CPP|AK-cj z7jOU`)<16ee@A#Vew}&O+lOyG{P)p|tc^L>PelFS*l|$&pF`u^3Vz?ffB66yxF+M` zy0wkr|3||A-|llgz{d*l-}U+>?_Ys=eQs`hd>-KEcvSw*!^D5_0Gjb9obT;zci6AF zwKDktbyyTWV8POb_Qh}fu6^YXzh_Ig9kCfB8*JazkK4z8p=6Lf#=UK1GqIu z{M%Sb&3nDgVUF)ibbsnIu#mq0J#E$a2_fSCdNcs_wtkde|C^faYrk^dUb(*3_5azh zIBPrL2ez$hrDm|1+KPOR#re-uPz&H)$E94;s@)K8l7#E8r?yerU-kcM%*I^I@5TQq ze1Zf$0ptrrIL3X`WH}ev7ZSE_JBQo4&MLFVSDz{#igJ3DcDpWV)m<0pLV?dR>Ccdz0Y?70J^a;UjoHfXfdQ zD;(t7@pJySK7sh(Oir`COZX4g7xvE4@9lo)+v9(o_(Adi z_yUvvc8|_EGWqAb)#uLdA74LR-k*MR^!t%XuO<%sUf%Obdd-K$|DLYzmRouYDE2Rm z`-S_SG6hws}j z{_8)t&;0Hm+b6&EN49X=Zp+fICJV>k!Ca#kFD-F-`nk-kZ^QrXVTMmH{rywq{j-`0 zL@i%E^AS4Rf^ODNXGfhaT$rQJJ3W8k_veE3ZTJE0IcEJa^RK(5#+J-Yf%h#oZ${YG zjO1($wSG(HhHS;Mkp1efU$$3YTxF}!|7}A1zjYLY1K2RqVSx%=XPif@H99YDZ~+hI z-12@OovVuf!}LsugYT;OQ{Vp(Jbwf6zcc_c-4CFt5dJIvZ{Rq0wk7co&`z|(;Qz~Q z;as#6tu=Od_X6fF4%wTp9<^tw-8*vu>_2y8+)kf8Y^Tl~qF>&@aXWqHfEAj21eyGX zPki!Kd-pRh+li;a{-?zy0K$KseH@X_YkPQ*j52E4gqmFL@^X%Ku`L&}1Y^3jB ztgeK(-%kw8e7t5K^8-`1fEfbwXExaA;+)MJj8Xs3?4KcW1JnSlUPiBDzk{4dyX?fMZUJsqHi8kAA?;UN~aocK)!P!CyFY_K2P1`Ja044SVl%uj3!= zw`a~CyopN~_Zi?7#4n87(+A$=`n&6Y*WP}+_SrW+_Lo=T{Xh2UpRrfp`ANI}<|pk1 zask)h{KUBF{s-*sckBi1I(F@CJ^qdzI(P&gXqk1l_fn72ingK!4M3B_et%8QaRBAu zzBqtVe1Sl1i{k=H%945fAL9Xv;Q(ag9Dw5j#{7Wsd;qa4h~W9gF{e?C~Eh?2{P(x6{Lq`|T~Jf&lNtYezL2z~dF~%RTKYe* zOY7-${C@*qJiMQ{{V@FZ;(l-I#r@vaH-`V>t~z5uM# z4B#Yl0+RIg>tvRX`T#WN0?c@4rq7Hl{s8g*Fg^Z|Jpua z|E>`K)iX&w6C=d*!u)tWy?>Sa=exJl?W+G4{IA^$t zSxJ7|wPm*ZzB|_S+4XbV?VZ=oQu}wpEaR%mB09jD*U zapyOD`g3pE=f3bJ{=s28hc9s!|KZG8dW5v{b$b|myht5*RGwYy;}$1>YML8 zdlj6&_SUED&CmXVz5eN+wHMxb-(LL0`)ogRd;0|W0_?hs=f2GL^yxFUW^{%1b@ihg zX|rf7kN^HalT~BN0f+-AB@f{6zpmB!0=LJ1j|Ujj1E^1s>lFn4SK>Dmp%0`s@K)IG zW(0mf4>%G3xi24JydD5PKs-PAuh_q|k{)Z^|FOq^u7@WP|2wE%7XE8itbS(?^X@eM zkDwuHMn9-^X7aV`@#X(@ETk(H{+EOMWz?m4`0wf8C;!g3Iu=jfeh*(J;=XtPLE*pj zeyRa%6;8ng2>YYV`>C(5WzKJxt)#c^Aeub&t7$~PmQKc)Q(p&$1<2b|&rZ$0tgo%g zUb{A8d$!YqZziu{c3qemNZsVY+UNl|oB4e`)CKgx^>={rX|TPX8G@P@+)iy^BlG@d z3^h>im8Lgt4LpB4y1!KS|W`g&WzJiztL z09>~;Yg@|E37>IN$5yYw*dzmmLFZ7p>U%J0X~{F6IrqVK;r|0I2X#QO(`_vI4= zINnYVh@a4y5=T;Fix+e<7r}2kHV@n8RlT-<%S?OwrK9%oSI*njYtPu_0=sneX}fsk zv@`hy-tEg*PFkUPK7*eB`Jeuz{p1(lw)2;c+6DXu*~Lq|_R`4$+jmf-}~ch@4)$k`5*tOFWbl7|9N}ylb^GfKlM3#>D|xXuup#8Uh=GP zf5GjSxqa@+bGB*yT4qSkuw1U&5~*&hsU!Y}=l6mC<^GJb(h9a!jl}^8v&G&^yri03q-{#adkl2RT+FNc>+^!c3_NJizU91IiP4{(z?w9Lopb z6O@$EXRs3g0^gt%)7EjsW4YlE%@03dU-lzgYr!_<|J&%<`PlLQ;;6+f@*O6c>Vdnc zeeNNSQEia$PBj3|C&3`2vbSYf5 z?muol|0e%kZuNWJ-G1+!^6=grA04AH^K|{*){FCRwe{kDZ|m~^9DDTx(yZZL=Fo=W ztfT1C>&JY6dCZ<)z9?!-sOeA8pGSH%^{dr3gU((3Y8%n^<%It&K70N7QFM9Y|CQ4Y zTX!dYe5w2E?@dtWUQEv)di{{=>t+A^*-hvGQ{Y|z-CKk8_pk-)d+770I)HZGV~|-t z3#bifLnF9%`+%)onKAYL9bFW&6^laljc+_dZ~RrZ89m@SH~_`|>zNO*eN{W$MTS`m zV;X>o*V-N2ANSX#Q@V|n;m68%jfB+ir<#8MwZ!|St~YWG+@|sX!vDN4fIdL^&K&#) z{Q=sTlibX)n?01JzA@@F|C?5J+l~$W_V%mC?d6xAvFDyYXU{%=#-4qSEq3Mk^Uf}@ zuh0s8go(F*`b+QG7k=(j_zI^?{=lUxXYAs$_z|)(U&6b8nSHWLmz{s`$2)%c&U*r0 z|HMzOc>zq9z4-1=**ib|ReSR%f6-q4^cU@w&wSBde(wu6?9)HZ{xN$`kKJsqe)wqo78 z#eelyZ|gum_ypp=FigC^>-VD>w8Z~jZNyY!>f`j@4-5Yl|I1=%|J#`JQ&SCgp;3!c zn>J@IdOP~+uUba`^(b@vg!@>ES~cOn%)|elmI{0Q`f}U2w#ydGYk=F1@m%HrGuJ0W z9Y8z%{Mv~7XAR`&^+U}7y?;~-FtaZ~{2#C-3)D9#2zL;pRv>Ac*Y|+`0pfpR`<0FK z0<5;hb7S=XjS~MSY}ck1@c)dx^TsAyyEtxZ7A9=tvPRpvy4`UATUYloXPH>*9{T`J z#C)#~dg6ZJziI%gng6RAK+XJ%;Xl=p=Z`yIK-|BdeauASnpXW^3*106x&J2SAd3H3 zwxEOW*6eEjPaPbwgS+N(EDzfoZ(Oz)U%6t>zj(=>d*Nog^1?+cw5#|9x3Zu8h0oj1 z{QPI}AI{np`t4r1cEK)RJ)bxF@LraA_s6zZuHtK4J!@C5o>{|nb4UMP`1BXQE=+&r zJ@Wpa`8oUam%af9@D+RQ{V&-YpZ$`({{GL6+iUOtEcxYzDzCPEdhfmW-g||^Y4naLpknM@KVyu&BfWP4DN>~iNEbnx zfC~2BV>B_%d?kO1$@=g0&g?mJ4n;8%LFKyEwfF4VGo0D8=Y3Xr*0bEeY4_uK0RLY6 z{}cXmLxG9RN~QlVyFmRl9)oq?HBZ<4Ki|OLKi%`J_1W4w$7wnTwxB3dO6X%!?e}*0 zZ+ekV5W9DX|D(va{?PE>tet%4ivOP8Xwdk1;sa0v(`#hvB;-iWz;|^nzUPVVD=YTb ztrhoM+mprp)^RKDx3*UN@8^r|FXoFLKw)7Tv8zq9HWcmpa(MiGdnBQ^n?kR;>H(u^ zW49#o|4HZr>sE8v`DxxV5-$FQ=NHpEK%GAe{VOzm>cF);V%u_N_?4E#Nh~u3vQopS z^P_b~KR_iuKpFagHSqm3@2|c?89o2G%>8YwPmpYS3;Mw6Z*7R9_di5>q65%chfmTa zLY6GKRPOwFiwx|VBz+nZ&;Ux7zMT_fNcT)R9}ZwTdb;ig|4;wEa>jY9R^@!m+E@Hn z&WiS~X#B6SznT3*?O%N;<^G4jMbzAXFxw=0Eh5kf$jgY4;=Fh%%8BH&WlP^~1x7pR zXBX7U&DV67dw)4x9(m+Wx%WZrfji|M{D8afzs+HH-uFvUyB)j3?B8x4>#;lTz0F~_ z-~9_&uyn4>T{Mehx61AJ{6cQO`|yKg0raGPyw?dxN^-Oe#%cip;<-_O_ndtk=G zmDT%Of+E$h5~d%lNtLWaP{xBtXofi~p_ymgo zZiWwF*9mgdTzz{xef(Fwf6eo2{@;&$h0Y}UDgO5(M|LjbzccPT;#&HFiprv;v=VL# zv8_9^*G>Gd+i#fvk7AuL`T;+X_}^MD71wOBKe=av|F)iggLhgd`3e8cHTX~Czdt#E z=t#Ky^r8j%vrnvAgoe++-f8sPF{7UNKORm>d;C`)z`}no8FioHe+hiH81!1`?;DZO>evvcfpS3+zN~p|UiQ{DChsUdRW;`HF|6$YsdUDQixPoP1t0!|Szs)`6 zxL>&^zX|^P`=OZ#{%edM!1aq)jvw`Zjr&8u`#5?6LxSAN`A2fi)b~N>7~X$p>LBIx zM_e?xP8zBbWKgdH`T6yI}oM z_Hu}*O z;;=c(c^;d)w9R-tZq8DfGP`jG#EK+Vmj6=>564mY_3SM&iaKA@Q!NDiQ# zUa&Pcz-jyS`~Zs&;0^uCw`6gtqhvNU^)@7|- zW6EJu^U}B$ZPfy}%;j*IyxI4lKgb<(Bj@d+J^<#tzUY3tHHzz^`0t4SopS>x^#{nG zoW=Ku`Mi8CQy6r znf|}D6lUDh|F60~)x`ca6-o5|rGoeL8=~=_j%Hvs9Q_h_GF9;YS{st3Ad{K^eS%5R zKGg524HS?!$VU&qGDfOPg5ZHCQTLC5BOf6x^&#Z{ua}8q`qT55Al+)BWME4w@qfJZ zhXXLIN2WAaC5s=i`M3Grtou>77XItj`MB;|@qeH{_z#aVj+}p3D06_R18D3YP3~Xy z{jKYkKpr4FH3}RH1<%m>>zdDJj+6@qR!dW-Wa;0tKyJFWkKBLnjWTlVgL41K2joGu zM;hpa=+a7$h~s!h@305%zL{%y%6}tgFFP<&F`jsT%>0cqZqZhmxBi&SSb10`F5WKV7HpEy zkFA$6kMaCtYaKRj-dY*=*lL^2UnS%0HkM-(*q^j;rCf8vFQiY8{?v`i=q)LinAjo- z3D0LnN&!6pIn@6%!0k-&Wq9Dn4Cd}wWQrOwBvsUHB>kC4Spc_ubovtOmUA)3rc4;S*%T1IR(|M`!`Pwr7YX5FXO^NRnfUE$C5Q~dLS!gF1fJ5)H??DDU-gv3Z+MLrrdBFc6C)O>(kGNMJ8u_5H2Om+NqRk!{alcrm$JOt! z?7orrAK*84(ti^ctWPA~|JSH_>tr<8KW5Q3nZD+*JbC1gvf|m#WairEW#W=uGH&5k ze1i=#24288yG@v{`)g%_+QKys8*6_&ZP_|z20kD|2Vca!Q%nD7CHP-V>|Y>(V7+fp z4t4)*@IMRu&z9)8N^t}KUAJ>v1*$(pUxDJjWmazZM-~6GP84a5hTkGMced95t>3$w^7+6q zYdtpgRd8Q<)IPrSGx)ejpr4DBk;AM-liVL}wJ-jFKChbV-k!F4p}vP%<5^Smz4>vq znc_cr)y%9Y8-M8>#((R&>1S2!S3k&yUMR&IT{k_*g{U9U@fzrTplhqHw`c2ojCS9d z^Y`~1?4Jz(m1}N#CBN(VA0Hq<^8n;!>Z*#kzg^61+DnF2IO2cBe#89(-;$YgV~hQR z4390B{{L|g_m=*>vcR`sgKZh``a0E8yGP5mn7F=%e*X;S0_HInD;a)ER&u!Hq=ho? zHVn+qkQ(yfd8vWK{OAE@pc_Q~e?a$KgZmW)!P2`mU0UnoIWI)IH$=&rRae9R>qp;T z99SP`^8Y>X0R~YAxTsgQoYx}yO{5BQ)y}YQ~+V4l_=Pdm9#m|VR zKQb6TQxbktIJy5=dMI_~Z>-M$O=cb_eE&>lA(W!4*w~N@M>1G07*xgej+f?!bQwOZ zlk`Hn@aiji%02hogl6w(88u-nhL+B_G4jY*Y}_bg504!!4~?;z?vEHd%4QrJ;baew z9wn=uTqCPCEtdz!JcPe6lGouMjAq}-PdL^7gCigQ*N6!tPO1kuX71WsMuX#H7HpKU zVE=?=dt}YQPvz6UihT6H|B_XEKQVcLNlWno-~>!qyvf+4$2W;(QxhWlS1wGk)@jZW{0Fx!{*?{;!E`WRvELWm5AbJpPoS$*(34!> zNIxq30Rdnhet@2*K7euptvrCWmb6=+z{+Uig{*A!gVZwe`9jupP#pk&Klm~D2S4GzlfQW;@L%J9JO2BVt12(fCXV%&0Q}aAE+~

SRa! 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

{{Hst3qTJ59{5xH2k^J+gI2-^{iL@y{oue3 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�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 z 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%0A?ev=HK>5E*c4rJ7ITQm1^+L<$ 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 KheE-R|NjBr15e)o literal 361178 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

soMxHOTl~CNV1O|U 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 z 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

4eAAy58K$II`drVEwZ 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ǣ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Ν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 E0KKV(UH||9 diff --git a/main.py b/main.py index f94c23e..e01081c 100644 --- a/main.py +++ b/main.py @@ -2,8 +2,8 @@ import logging import webbrowser -from runtime_setup_macos import main as macos_setup -from runtime_setup_windows import main as windows_setup +from runtime_setup_macos import docker_setup as docker_setup_macos +from runtime_setup_windows import docker_setup as docker_setup_windows from utils.logger_config import setup_logger from utils.host_utils import get_os_and_arch @@ -17,9 +17,9 @@ os_name, arch = get_os_and_arch() if os_name == "macOS": - macos_setup() + docker_setup_macos() elif os_name == "Windows": - windows_setup() + docker_setup_windows() elif os_name == "Linux": raise RuntimeError( f"MORagents needs Linux support! Would you like to help?\n" diff --git a/runtime_setup_macos.py b/runtime_setup_macos.py index 70f2d48..3c8da37 100644 --- a/runtime_setup_macos.py +++ b/runtime_setup_macos.py @@ -7,6 +7,7 @@ logger = setup_logger(__name__) + def get_docker_path(): docker_paths = ['/Applications/Docker.app/Contents/Resources/bin/docker', shutil.which('docker')] for docker_path in docker_paths: @@ -16,6 +17,7 @@ def get_docker_path(): logger.error("Docker executable not found in PATH.") return None + def check_docker_installed(docker_path): try: subprocess.run([docker_path, "--version"], @@ -26,6 +28,16 @@ def check_docker_installed(docker_path): logger.error(f"Error checking Docker installation: {str(e)}") return False + +def load_docker_image(docker_path, image_path): + try: + subprocess.run([docker_path, "load", "-i", image_path], check=True) + logger.info(f"Docker image loaded from '{image_path}'.") + except (subprocess.CalledProcessError, TypeError) as e: + logger.error(f"Error loading Docker image from '{image_path}': {str(e)}") + raise + + def delete_docker_image(docker_path, image_name): try: # List all images @@ -45,6 +57,7 @@ def delete_docker_image(docker_path, image_name): except subprocess.CalledProcessError as e: logger.warning(f"Error deleting image: {e}") + def list_containers_for_image(docker_path, image_name): try: output = subprocess.check_output( @@ -55,6 +68,7 @@ def list_containers_for_image(docker_path, image_name): logger.error(f"Failed to list containers for image '{image_name}': {e}") return [] + def remove_container(docker_path, container): try: subprocess.run([docker_path, "rm", "-f", container], check=True, stdout=subprocess.DEVNULL, @@ -62,6 +76,7 @@ def remove_container(docker_path, container): except subprocess.CalledProcessError as e: logger.error(f"Failed to remove container '{container}': {e}") + def docker_image_present_on_host(docker_path, image_name): try: subprocess.run([docker_path, "inspect", image_name], check=True, stdout=subprocess.DEVNULL, @@ -70,19 +85,27 @@ def docker_image_present_on_host(docker_path, image_name): except (subprocess.CalledProcessError, TypeError) as e: return False + def remove_containers_for_image(docker_path, image_name): + # List containers using the specified image containers = list_containers_for_image(docker_path, image_name) + + # Remove each container for container in containers: remove_container(docker_path, container) logger.info(f"Removed container '{container}' for image '{image_name}'") + def remove_containers_by_name(docker_path, container_name): try: + # List containers with the specified name list_command = [docker_path, "ps", "-a", "--format", "{{.Names}}"] output = subprocess.check_output(list_command, universal_newlines=True) containers = output.strip().split("\n") + # Check if the specified container name exists if container_name in containers: + # Remove the container remove_command = [docker_path, "rm", "-f", container_name] subprocess.run(remove_command, check=True) logger.info(f"Removed container '{container_name}'") @@ -91,32 +114,31 @@ def remove_containers_by_name(docker_path, container_name): except subprocess.CalledProcessError as e: logger.error(f"Error removing container '{container_name}': {str(e)}") + +def migration_load_current_docker_images(docker_path): + for image_name, image_path in zip(AgentDockerConfig.CURRENT_IMAGE_NAMES, AgentDockerConfig.CURRENT_IMAGE_PATHS): + if docker_image_present_on_host(docker_path, image_name): + # Remove containers corresponding to the image + remove_containers_for_image(docker_path, image_name) + + # Remove the existing image + delete_docker_image(docker_path, image_name) + logger.info(f"Removed existing docker image '{image_name}'") + + if not os.path.exists(image_path): + logger.critical(f"Docker image file: {image_name} was not found at path: '{image_path}'") + raise FileNotFoundError(f"Docker image file: {image_name} was not found at path: '{image_path}'") + + load_docker_image(docker_path, image_path) + logger.info(f"Loaded docker image '{image_name}'") + + def migration_remove_old_images(docker_path): for image_name in AgentDockerConfigDeprecate.OLD_IMAGE_NAMES: if docker_image_present_on_host(docker_path, image_name): delete_docker_image(docker_path, image_name) logger.info(f"Deleted image '{image_name} from previous release") -def pull_docker_images(docker_path): - for image in AgentDockerConfig.get_current_image_names(): - try: - subprocess.run([docker_path, "pull", image], check=True) - logger.info(f"Successfully pulled image: {image}") - except subprocess.CalledProcessError as e: - logger.error(f"Failed to pull image {image}: {e}") - raise - -def start_ollama_server(): - ollama_path = '/usr/local/bin/ollama' - - try: - # Start Ollama server - logger.info("Starting Ollama server...") - subprocess.Popen([ollama_path, "serve"], stdout=subprocess.DEVNULL, stderr=subprocess.DEVNULL) - logger.info("Ollama server started successfully.") - except Exception as e: - logger.info("Failed to start Ollama server.") - logger.error(f"Failed to start Ollama server: {e}") def docker_setup(): docker_path = get_docker_path() @@ -126,38 +148,32 @@ def docker_setup(): logger.critical("Docker is not installed.") raise RuntimeError("Docker is not installed.") - # Remove old images and containers + # remove old images on user device, if present logger.info("Checking whether old images need removal.") migration_remove_old_images(docker_path) - for image_name in AgentDockerConfig.get_current_image_names(): - remove_containers_for_image(docker_path, image_name) + migration_load_current_docker_images(docker_path) + + remove_containers_for_image(docker_path, "moragents_dockers-agents:latest") + remove_containers_for_image(docker_path, "moragents_dockers-nginx:latest") remove_containers_by_name(docker_path, "agents") remove_containers_by_name(docker_path, "nginx") - # Pull the latest images - pull_docker_images(docker_path) - # Spin up Agent container subprocess.run([ docker_path, "run", "-d", "--name", "agents", "-p", "8080:5000", "--restart", "always", "-v", "/var/lib/agents", "-v", "/app/src", - AgentDockerConfig.get_current_image_names()[1] # agents image + "moragents_dockers-agents:latest" ], check=True) # Spin up Nginx container subprocess.run([ docker_path, "run", "-d", "--name", "nginx", "-p", "3333:80", - AgentDockerConfig.get_current_image_names()[0] # nginx image + "moragents_dockers-nginx:latest" ], check=True) -def main(): - # main() called every time the app is opened (from main.py). Put all app open code here. - logger.info("Starting app...") - start_ollama_server() - docker_setup() if __name__ == "__main__": - main() \ No newline at end of file + docker_setup() diff --git a/runtime_setup_windows.py b/runtime_setup_windows.py index 33de5d9..22aebde 100644 --- a/runtime_setup_windows.py +++ b/runtime_setup_windows.py @@ -1,3 +1,5 @@ +import os +import sys import subprocess import time @@ -6,8 +8,10 @@ logger = setup_logger(__name__) + docker_path = "docker" + def check_docker_installed(): try: subprocess.run([docker_path, "--version"], check=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE) @@ -15,6 +19,7 @@ def check_docker_installed(): except (subprocess.CalledProcessError, FileNotFoundError): return False + def start_docker(): try: subprocess.run(["C:\\Program Files\\Docker\\Docker\\Docker Desktop.exe"]) @@ -33,19 +38,39 @@ def start_docker(): logger.info("Waiting for Docker engine to start...") time.sleep(2) + +def load_docker_image(image_path): + print(f"Loading Docker image {image_path}. This will take about 5-10 minutes, please wait...") + try: + result = subprocess.run(["docker", "load", "-i", image_path], stdout=subprocess.PIPE, stderr=subprocess.PIPE, text=True, check=True, timeout=300) + print(f"Docker image loaded successfully: {result.stdout}") + except subprocess.CalledProcessError as e: + print(f"Error loading Docker image: {e}") + print(f"Command: {e.cmd}") + print(f"Output: {e.output}") + print(f"Error: {e.stderr}") + + def delete_docker_image(image_name): try: + # List all images list_command = [docker_path, "images", "--format", "{{.Repository}}:{{.Tag}}"] output = subprocess.check_output(list_command, universal_newlines=True) images = output.strip().split("\n") + # Find the image with the specified name if image_name in images: + # Remove the image remove_command = [docker_path, "rmi", "-f", image_name] subprocess.run(remove_command, check=True) logger.info(f"Image '{image_name}' deleted successfully.") + else: + pass + except subprocess.CalledProcessError as e: logger.warning(f"Error deleting image: {e}") + def list_containers_for_image(image_name): try: output = subprocess.check_output( @@ -56,6 +81,7 @@ def list_containers_for_image(image_name): logger.error(f"Failed to list containers for image '{image_name}': {e}") return [] + def remove_container(container): try: subprocess.run([docker_path, "rm", "-f", container], check=True, stdout=subprocess.DEVNULL, @@ -63,27 +89,36 @@ def remove_container(container): except subprocess.CalledProcessError as e: logger.error(f"Failed to remove container '{container}': {e}") + def docker_image_present_on_host(image_name): try: subprocess.run([docker_path, "inspect", image_name], check=True, stdout=subprocess.DEVNULL, stderr=subprocess.DEVNULL) return True - except (subprocess.CalledProcessError, TypeError): + except (subprocess.CalledProcessError, TypeError) as e: return False + def remove_containers_for_image(image_name): + # List containers using the specified image containers = list_containers_for_image(image_name) + + # Remove each container for container in containers: remove_container(container) logger.info(f"Removed container '{container}' for image '{image_name}'") + def remove_containers_by_name(container_name): try: + # List containers with the specified name list_command = [docker_path, "ps", "-a", "--format", "{{.Names}}"] output = subprocess.check_output(list_command, universal_newlines=True) containers = output.strip().split("\n") + # Check if the specified container name exists if container_name in containers: + # Remove the container remove_command = [docker_path, "rm", "-f", container_name] subprocess.run(remove_command, check=True) logger.info(f"Removed container '{container_name}'") @@ -92,33 +127,48 @@ def remove_containers_by_name(container_name): except subprocess.CalledProcessError as e: logger.error(f"Error removing container '{container_name}': {str(e)}") -def migration_remove_old_images(): - for image_name in AgentDockerConfigDeprecate.OLD_IMAGE_NAMES: + +def migration_load_current_docker_images(): + for image_name, image_path in zip(AgentDockerConfig.CURRENT_IMAGE_NAMES, AgentDockerConfig.CURRENT_IMAGE_PATHS): + + # # FIXME, this is temporary + # if getattr(sys, 'frozen', False): + # image_path = os.path.join(sys._MEIPASS, "resources", os.path.basename(image_path)) + # else: + # image_path = os.path.join(os.path.dirname(__file__), "resources", os.path.basename(image_path)) + if docker_image_present_on_host(image_name): - delete_docker_image(image_name) - logger.info(f"Deleted image '{image_name}' from previous release") + logger.info(f"Docker image '{image_name}' is already present, skipping loading") + continue -def pull_docker_images(): - for image_name in AgentDockerConfig.get_current_image_names(): - try: - subprocess.run([docker_path, "pull", image_name], check=True) - logger.info(f"Successfully pulled image: {image_name}") - except subprocess.CalledProcessError as e: - logger.error(f"Failed to pull image {image_name}: {e}") - raise + if not os.path.exists(image_path): + logger.critical(f"Docker image file: {image_name} was not found at path: '{image_path}'") + raise FileNotFoundError(f"Docker image file: {image_name} was not found at path: '{image_path}'") -def start_ollama_server(): - ollama_path = "ollama" + load_docker_image(image_path) + logger.info(f"Loaded docker image '{image_name}'") + +def check_container_running(image_name): try: - print(f"Attempting to start Ollama server using: {ollama_path}") - subprocess.Popen([ollama_path, "serve"], - stdout=subprocess.PIPE, - stderr=subprocess.PIPE, - creationflags=subprocess.CREATE_NO_WINDOW) - print("Ollama server started successfully.") - except Exception as e: - print(f"Failed to start Ollama server: {e}") + output = subprocess.check_output(["docker", "ps", "-f", f"ancestor={image_name}", "--format", "{{.Names}}"]) + if not output: + return False + return output.decode().strip() != "" + except (subprocess.CalledProcessError, FileNotFoundError): + return False + + +def start_container(image_name, port_mapping): + logger.info(f"Spinning up container for image {image_name} with port mapping: {port_mapping}") + subprocess.run(["docker", "run", "-d", "-p", port_mapping, image_name], check=True) + + +def migration_remove_old_images(): + for image_name in AgentDockerConfigDeprecate.OLD_IMAGE_NAMES: + if docker_image_present_on_host(image_name): + delete_docker_image(image_name) + logger.info(f"Deleted image '{image_name} from previous release") def docker_setup(): @@ -128,13 +178,14 @@ def docker_setup(): start_docker() + # remove old images on user device, if present logger.info("Checking whether old images need removal.") migration_remove_old_images() - pull_docker_images() + migration_load_current_docker_images() - for image_name in AgentDockerConfig.get_current_image_names(): - remove_containers_for_image(image_name) + remove_containers_for_image("moragents_dockers-agents:latest") + remove_containers_for_image("moragents_dockers-nginx:latest") remove_containers_by_name("agents") remove_containers_by_name("nginx") @@ -144,19 +195,15 @@ def docker_setup(): docker_path, "run", "-d", "--name", "agents", "-p", "8080:5000", "--restart", "always", "-v", "/var/lib/agents", "-v", "/app/src", - AgentDockerConfig.get_current_image_names()[1] # agents image + "moragents_dockers-agents:latest" ], check=True) # Spin up Nginx container subprocess.run([ docker_path, "run", "-d", "--name", "nginx", "-p", "3333:80", - AgentDockerConfig.get_current_image_names()[0] # nginx image + "moragents_dockers-nginx:latest" ], check=True) -def main(): - # main() called every time the app is opened (from main.py). Put all app open code here. - start_ollama_server() - docker_setup() if __name__ == "__main__": - docker_setup() \ No newline at end of file + docker_setup() diff --git a/submodules/benchmarks/adapters/base_adapter.py b/submodules/benchmarks/adapters/base_adapter.py deleted file mode 100644 index 323f1be..0000000 --- a/submodules/benchmarks/adapters/base_adapter.py +++ /dev/null @@ -1,21 +0,0 @@ -from abc import ABC, abstractmethod - -class BaseAdapter(ABC): - - @property - @abstractmethod - def name(self) -> str: - pass - - @abstractmethod - def get_price(self, coin_id: str) -> float: - pass - - def get_marketcap(self, coin_id: str) -> float: - pass - - def has_get_marketcap(self) -> bool: - pass - - def has_get_price(self) -> bool: - pass diff --git a/submodules/benchmarks/adapters/coingecko_adapter.py b/submodules/benchmarks/adapters/coingecko_adapter.py deleted file mode 100644 index 9327118..0000000 --- a/submodules/benchmarks/adapters/coingecko_adapter.py +++ /dev/null @@ -1,30 +0,0 @@ -import requests -from .base_adapter import BaseAdapter - -# defillama and coingecko share the same identifiers -class CoingeckoAdapter(BaseAdapter): - - @property - def name(self) -> str: - return "Coingecko" - - def get_price(self, coingecko_id: str) -> float: - url = f"https://api.coingecko.com/api/v3/simple/price" - params = {'ids': coingecko_id, 'vs_currencies': 'usd'} - response = requests.get(url, params=params) - response.raise_for_status() - return response.json()[coingecko_id]['usd'] - - def get_marketcap(self, coin_id: str) -> float: - request_url = f"https://api.coingecko.com/api/v3/coins/{coin_id}" - response = requests.get(request_url) - response.raise_for_status() - data = response.json() - marketcap = data['market_data']['market_cap']['usd'] - return marketcap - - def has_get_marketcap(self) -> bool: - return True - - def has_get_price(self) -> bool: - return True diff --git a/submodules/benchmarks/adapters/defillama_adapter.py b/submodules/benchmarks/adapters/defillama_adapter.py deleted file mode 100644 index 21bac2f..0000000 --- a/submodules/benchmarks/adapters/defillama_adapter.py +++ /dev/null @@ -1,22 +0,0 @@ -import requests -from .base_adapter import BaseAdapter - -class DefillamaAdapter(BaseAdapter): - - @property - def name(self) -> str: - return "Defillama" - - def get_price(self, coingecko_id: str) -> float: - request_url = f"https://coins.llama.fi/prices/current/coingecko:{coingecko_id}" - response = requests.get(request_url) - response.raise_for_status() - data = response.json() - price = data['coins'][f'coingecko:{coingecko_id}']['price'] - return price - - def has_get_marketcap(self) -> bool: - return False - - def has_get_price(self) -> bool: - return True \ No newline at end of file diff --git a/submodules/benchmarks/benchmarks.py b/submodules/benchmarks/benchmarks.py deleted file mode 100644 index d239015..0000000 --- a/submodules/benchmarks/benchmarks.py +++ /dev/null @@ -1,83 +0,0 @@ -import time -import argparse -from helpers import ask_data_agent, compare_usd_values, extract_agent_usd_value -from config import coins, price_prompts, mcap_prompts, price_error_tolerance, mcap_error_tolerance, loop_delay -from adapters.coingecko_adapter import CoingeckoAdapter -from adapters.defillama_adapter import DefillamaAdapter - -all_adapters = [ - DefillamaAdapter(), - CoingeckoAdapter() -] - -parser = argparse.ArgumentParser(description="Specify the type of prompts to use (price or mcap).") -parser.add_argument('type', choices=['price', 'mcap'], help="Type of prompts to use") -args = parser.parse_args() - -benchmark_type = args.type - -if benchmark_type == 'price': - prompts = price_prompts - error_tolerance = price_error_tolerance -elif benchmark_type == 'mcap': - prompts = mcap_prompts - error_tolerance = mcap_error_tolerance -else: - raise ValueError("Invalid benchmark type") - -total_checks = 0 -failures = [] - -print('benchmark type', benchmark_type) -try: - print() - for prompt in prompts: - for coin in coins: - coingecko_id = coin["coingecko_id"] - for name_variation in coin["name_variations"]: - agent_prompt = prompt.format(name_variation) - print(f"{agent_prompt}") - try: - agent_response = ask_data_agent(prompt.format(name_variation)) - agent_usd_value = extract_agent_usd_value(agent_response) - print(f"{agent_usd_value}") - time.sleep(loop_delay) # the agent gets rate limitted by coingecko if we call it too fast - except: - result = f"FAIL DataAgent: {agent_prompt}" - print(result) - print() - total_checks += 1 - failures.append(result) - continue - - for adapter in all_adapters: - print(f"Checking {adapter.name}...") - try: - if benchmark_type == "price" and adapter.has_get_price(): - benchmark_value = adapter.get_price(coingecko_id) - elif benchmark_type == "mcap" and adapter.has_get_marketcap(): - benchmark_value = adapter.get_marketcap(coingecko_id) - else: - continue - result = compare_usd_values(agent_usd_value, adapter, coingecko_id, name_variation, benchmark_value, error_tolerance, failures) - except Exception as e: - result = f"FAIL {adapter.name}: {coingecko_id} ({e})" - failures.append(result) - - print(result) - total_checks += 1 - print() - - # Summarize Results - passed_checks = total_checks - len(failures) - print() - print(f"{passed_checks} / {total_checks} Benchmarks passed") - - if len(failures) > 0: - print("Failures:") - for failure in failures: - print(failure) - -except Exception as e: - print(f"Unexpected error: {e}") - exit(1) diff --git a/submodules/benchmarks/config.py b/submodules/benchmarks/config.py deleted file mode 100644 index 34a764e..0000000 --- a/submodules/benchmarks/config.py +++ /dev/null @@ -1,270 +0,0 @@ -loop_delay = 10 # prevent rate limiting - -price_error_tolerance = 0.01 # 1% -mcap_error_tolerance = 0.01 # 1% - -coins = [ - { - "coingecko_id": "bitcoin", - "name_variations": ["Bitcoin", "Bitcoins", "BITcoin", "BTC"] - }, - { - "coingecko_id": "ethereum", - "name_variations": ["Ether", "Ethereum", "Ethers", "ETH"] - }, - { - "coingecko_id": "tether", - "name_variations": ["Tether", "USDT", "USDTether", "TetherUSD"] - }, - { - "coingecko_id": "binancecoin", - "name_variations": ["BNB", "Binance Smart Chain", "Binancecoin", "Binance coin"] - }, - { - "coingecko_id": "solana", - "name_variations": ["Solana", "SOL", "Solanacoin"] - }, - { - "coingecko_id": "usd-coin", - "name_variations": ["USDC", "USDCoin", "USD coin", "CUSD"] - }, - { - "coingecko_id": "staked-ether", - "name_variations": ["Lido Staked Ether", "Lido Ether", "Lido Eth", "Staked Ether"] - }, - { - "coingecko_id": "ripple", - "name_variations": ["XRP", "Ripple", "XRPcoin", "XRP coin"] - }, - { - "coingecko_id": "the-open-network", - "name_variations": ["Toncoin", "TON", "the open network", "open network coin"] - }, - { - "coingecko_id": "dogecoin", - "name_variations": ["Dogecoin", "DOGE", "dogcoin", "doge coin"] - }, - { - "coingecko_id": "cardano", - "name_variations": ["Cardano", "ADA", "cardano coin"] - }, - { - "coingecko_id": "tron", - "name_variations": ["Tron", "TRX", "troncoin", "trxcoin"] - }, - { - "coingecko_id": "avalanche-2", - "name_variations": ["Avalanche", "AVAX", "Avalancecoin", "Avaxcoin"] - }, - { - "coingecko_id": "shiba-inu", - "name_variations": ["Shiba Inu", "Shiba", "SHIB", "shibacoin", "Shiba inu coin"] - }, - { - "coingecko_id": "wrapped-bitcoin", - "name_variations": ["Wrapped Bitcoin", "WBTC", "wrapped btc", "wrapped BITcoin"] - }, - { - "coingecko_id": "polkadot", - "name_variations": ["Polkadot", "DOT", "polkadotcoin", "polka dot coin", "polka coin"] - }, - { - "coingecko_id": "chainlink", - "name_variations": ["Chainlink", "LINK", "Chainlinkcoin", "Linkcoin"] - }, - { - "coingecko_id": "bitcoin-cash", - "name_variations": ["Bitcoin Cash", "BCH", "BTC cash", "BCHcoin"] - }, - { - "coingecko_id": "uniswap", - "name_variations": ["Uniswap", "UNI", "Unicoin", "Uniswap coin"] - }, - { - "coingecko_id": "leo-token", - "name_variations": ["LEO token", "LEO", "leotoken", "leocoin"] - }, - { - "coingecko_id": "dai", - "name_variations": ["Dai", "Daicoin", "DaiUSD"] - }, - { - "coingecko_id": "near", - "name_variations": ["Near Protocol", "NEAR", "Nearcoin"] - }, - { - "coingecko_id": "litecoin", - "name_variations": ["Litecoin", "LTC", "LTCcoin", "lightcoin"] - }, - { - "coingecko_id": "matic-network", - "name_variations": ["Polygon", "Matic", "MATIC", "Polygoncoin", "Maticcoin"] - }, - { - "coingecko_id": "wrapped-eeth", - "name_variations": ["Wrapped eETH", "eETH", "WEETH", "eETHcoin", "WEETHcoin"] - }, - { - "coingecko_id": "kaspa", - "name_variations": ["Kaspa", "KAS", "Kaspacoin", "Kascoin"] - }, - { - "coingecko_id": "pepe", - "name_variations": ["Pepe", "Pepecoin"] - }, - { - "coingecko_id": "ethena-usde", - "name_variations": ["Ethena", "USDE", "Ethena USD", "Ethenacoin", "USDEcoin"] - }, - { - "coingecko_id": "internet-computer", - "name_variations": ["Internet Computer", "ICP", "ICPcoin", "InternetComputercoin"] - }, - { - "coingecko_id": "renzo-restaked-eth", - "name_variations": ["Renzo Restaked ETH", "Renzo Restaked Ethereum", "Renzocoin", "RenzoEth"] - }, - { - "coingecko_id": "ethereum-classic", - "name_variations": ["Ethereum Classic", "Ether Classic", "ETH Classic", "ETC"] - }, - { - "coingecko_id": "fetch-ai", - "name_variations": [ - "Artificial Superintelligence Alliance", "FET", "FETcoin", "Fetch", - "Ocean Protocol", "Oceancoin", "Singularity", "Singularitycoin" - ] - }, - { - "coingecko_id": "monero", - "name_variations": ["Monero", "XMR", "Monerocoin", "XMRcoin"] - }, - { - "coingecko_id": "aptos", - "name_variations": ["Aptos", "APT", "Aptoscoin", "APTcoin"] - }, - { - "coingecko_id": "render-token", - "name_variations": ["Render", "RNDR", "Rendercoin", "RNDRcoin", "Render token"] - }, - { - "coingecko_id": "stellar", - "name_variations": ["Stellar", "XLM", "Stellarcoin", "XLMcoin"] - }, - { - "coingecko_id": "hedera-hashgraph", - "name_variations": ["Hedera", "HBAR", "Hederacoin", "HBARcoin", "Hashgraph"] - }, - { - "coingecko_id": "cosmos", - "name_variations": ["Cosmos", "Cosmoshub", "ATOM", "Cosmoscoin", "ATOMCoin"] - }, - { - "coingecko_id": "arbitrum", - "name_variations": ["Arbitrum", "ARB", "Arbitrumcoin", "ARBCoin"] - }, - { - "coingecko_id": "crypto-com-chain", - "name_variations": ["Cronos", "CRO", "Cronoscoin", "CROCoin", "Crypto.com"] - }, - { - "coingecko_id": "mantle", - "name_variations": ["Mantle", "MNT", "Mantlecoin", "MNTCoin"] - }, - { - "coingecko_id": "blockstack", - "name_variations": ["Stacks", "STX", "Stackscoin", "STXCoin", "Blockstack"] - }, - { - "coingecko_id": "filecoin", - "name_variations": ["Filecoin", "FIL", "FILCoin", "File coin"] - }, - { - "coingecko_id": "okb", - "name_variations": ["OKB", "OKBCoin"] - }, - { - "coingecko_id": "maker", - "name_variations": ["Maker", "MKR", "MakerDAO", "Makercoin", "MRKCoin"] - }, - { - "coingecko_id": "vechain", - "name_variations": ["VeChain", "VET", "VeChaincoin", "VETCoin"] - }, - { - "coingecko_id": "injective-protocol", - "name_variations": ["Injective", "INJ", "Injectivecoin", "INJCoin", "Injective Protocol"] - }, - { - "coingecko_id": "immutable-x", - "name_variations": ["Immutable", "IMX", "Immutablecoin", "IMXCoin", "ImmutableX"] - }, - { - "coingecko_id": "first-digital-usd", - "name_variations": ["First Digital USD", "FDUSD", "FirstDigitalUSD", "FDUSDCoin"] - }, - { - "coingecko_id": "optimism", - "name_variations": ["Optimism", "OP", "Optimismcoin", "OPCoin"] - }, - { - "coingecko_id": "morpheusai", - "name_variations": ["Morpheus", "MorpheusAI", "MOR", "MORCoin"] - }, - { - "coingecko_id": "aave", - "name_variations": ["Aave", "Aavecoin"] - }, - { - "coingecko_id": "aavegotchi", - "name_variations": ["Aavegotchi", "Ghost", "Aavegotchicoin", "Ghostcoin", "GHST"] - }, - { - "coingecko_id": "thorchain", - "name_variations": ["Thor", "THORChain", "RUNE", "Thorcoin", "Runecoin"] - }, - { - "coingecko_id": "ethereum-name-service", - "name_variations": ["Ethereum Name Service", "ENS", "ENScoin"] - }, - { - "coingecko_id": "axie-infinity", - "name_variations": ["Axie Infinity", "AXS", "Axiecoin", "Axscoin"] - }, - { - "coingecko_id": "zombiecoin", - "name_variations": ["ZombieCoin", "Zombie", "ZMBCoin"] - }, - { - "coingecko_id": "elon-xmas", - "name_variations": ["Elon Xmas", "XMAS", "ElonXmascoin", "XMASCoin"] - }, - { - "coingecko_id": "neblio", - "name_variations": ["Neblio", "NEBL", "Nebliocoin", "NEBLCoin"] - }, - { - "coingecko_id": "shapeshift-fox-token", - "name_variations": ["ShapeShift FOX", "ShapeShift", "ShapeShiftCoin", "FOXCoin", "FOXToken"] - } -] - -price_prompts = [ - "What is the price of {}?", - "How much is one {} worth?", - "How much does one {} cost?", -] - -mcap_prompts = [ - "What is the market cap of {}?", - "What is the total market cap of {}?", - "What is the marketcap of {}?", - "What is the market capitalization of {}?", - "What is the value of all {}s?", -] - -# This is unused at the moment -tvl_prompts = [ - "What is the TVL of {}?", - "How much value is locked in {}?", -] \ No newline at end of file diff --git a/submodules/benchmarks/helpers.py b/submodules/benchmarks/helpers.py deleted file mode 100644 index e50c767..0000000 --- a/submodules/benchmarks/helpers.py +++ /dev/null @@ -1,54 +0,0 @@ -import requests -import json -import re -from adapters.base_adapter import BaseAdapter - -url = 'http://127.0.0.1:8080/data_agent/' - -headers = { - 'Accept': 'application/json, text/plain, */*', - 'Accept-Language': 'en-US,en;q=0.9', - 'Connection': 'keep-alive', - 'Content-Type': 'application/json', - 'Origin': 'http://localhost:3333', - 'Referer': 'http://localhost:3333/', - 'Sec-Fetch-Dest': 'empty', - 'Sec-Fetch-Mode': 'cors', - 'Sec-Fetch-Site': 'cross-site', - 'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/126.0.0.0 Safari/537.36', - 'sec-ch-ua': '"Not/A)Brand";v="8", "Chromium";v="126", "Google Chrome";v="126"', - 'sec-ch-ua-mobile': '?0', - 'sec-ch-ua-platform': '"macOS"', -} - -def ask_data_agent(prompt: str): - payload = { - "prompt": { - "role": "user", - "content": prompt - } - } - - response = requests.post(url, headers=headers, data=json.dumps(payload)) - - result_content = response.json()['content'] - return result_content - -def extract_agent_usd_value(content: str): - match = re.search(r'\$\d+(?:,\d{3})*(?:\.\d{1,8})?', content) # 8 usd digits should be plenty - if match: - price_str = match.group(0).replace('$', '').replace(',', '') - return float(price_str) - raise ValueError("Could not extract a price from the agent response") - -def compare_usd_values(agent_value: float, adapter: BaseAdapter, coingecko_id: str, name_variation: str, benchmark_value: float, error_tolerance: float, failures: list): - difference = abs(agent_value - benchmark_value) - percent_difference = (difference / benchmark_value) * 100 - result_value = f"${benchmark_value:.8f}, {percent_difference:.2f}% off" - if percent_difference <= error_tolerance * 100: - result_message = f"PASS {adapter.name}. {result_value}" - else: - result_message = f"FAIL {adapter.name}. {result_value}" - failure_message = f"FAIL {adapter.name}. {result_value}. {coingecko_id}. {name_variation}" # so we have more information to summarize failures at the end - failures.append(result_message) - return result_message diff --git a/submodules/benchmarks/readme.md b/submodules/benchmarks/readme.md deleted file mode 100644 index eef0967..0000000 --- a/submodules/benchmarks/readme.md +++ /dev/null @@ -1,22 +0,0 @@ -# Data Agent Benchmarking Tests - -## About - -- Measures how accurately the data agent responds for price & market cap vs benchmark values from coinecko, defillama, etc. - -- Generates agent prompts from values defined in `config.py` and validates them against each of the benchmark adapters. - -## Running - -## 0. Start [ DataAgent Docker Service](../moragents_dockers/agents/src/data_agent/README.md) -## 1. Modify `config.py` with new prompts, coins & error tolerances -## 2. `cd submodules/benchmarks` -## 3. Run `pip install -r requirements.txt` -## 4. Run `python benchmarks.py price` for price benchmarks -## 5. Run `python benchmarks.py mcap` for market cap benchmarks - -## Considerations - -- The source of truth asset id is the coingecko id. Any new adapters will need some way of translating the coingecko id if they use something else. For example, the defillama adapter "just works" because they use coingecko ids. - -- Disabling coingecko adapter lets us reduce the `time.sleep()` in `benchmarks.py` and run much faster (rate limiting). diff --git a/submodules/benchmarks/requirements.txt b/submodules/benchmarks/requirements.txt deleted file mode 100644 index 663bd1f..0000000 --- a/submodules/benchmarks/requirements.txt +++ /dev/null @@ -1 +0,0 @@ -requests \ No newline at end of file diff --git a/submodules/moragents_dockers/README.md b/submodules/moragents_dockers/README.md index 45fa221..f4ff09f 100644 --- a/submodules/moragents_dockers/README.md +++ b/submodules/moragents_dockers/README.md @@ -1,45 +1,36 @@ # Moragents -This repo contains multiple agents and a dapp that enables you to interact with the agents, all running locally and containerized with Docker. +## Overview +This project is a Flask-based AI chat application featuring intelligent responses from various language models and embeddings. It includes file uploading, cryptocurrency swapping, and a delegator system to manage multiple agents. The application, along with a dApp for agent interaction, runs locally and is containerized with Docker. +## Pre-requisites -## Dependencies -* Docker -* Ollama - -Pull the required models in ollama +* [Download Ollama](https://ollama.com/ )for your operating system +* Then after finishing installation pull these two models: ```ollama pull llama3``` ```ollama pull nomic-embed-text``` -## Installation +## Run with Docker Compose Docker compose will build and run two containers. One will be for the agents, the other will be for the UI. -1. Ensure you're in the submodules/moragents_dockers folder - ```sh - $ cd submodules/moragents_dockers - ``` - -2. Build Images and Launch Containers: - 1. For Intel / AMD / x86_64 - ```sh - docker-compose up - ``` - 2. For Apple silicon (M1, M2, M3, etc) - ```sh - docker-compose -f docker-compose-apple.yml up - ``` +```docker-compose up``` + +or for Apple silicon + +```docker-compose -f docker-compose-apple.yml up``` Open in the browser: ```http://localhost:3333/``` Docker build will download the model. The first time that one of the agents are called, the model will be loaded into memory and this instance will be shared between all agents. ## Agents +Three agents are included: ### Data Agent @@ -64,9 +55,158 @@ A typical flow looks like this: - The agent requests any missing information, e.g. in this case the amount is missing - Once all the information hase been collected, the agent looks up the assets on the current chain, retrieves contract addresses and generates a quote if available. - The quote is shown to the user, who may either proceed or cancel -- If the user accepts the quote, the swap may proceed. The back-end will generate transactions which will be sent to the front-end to be signed by the user's wallet. +- If the user accepts the quote, the swap may proceed. The back-end will generate transactions which will be sent to the front-end to be signed by the user's wallet. - If the allowance for the token being sold is too low, an approval transaction will be generated first -### RAG Agent +## RAG Agent +This agent will answer questions about an uploaded PDF file. + + +# Delegator +The Delegator handles user queries by analyzing the prompt and delegating it to the appropriate agent. + +## API Endpoints + +1. **Chat Functionality** + - Endpoint: `POST /` + - Handles chat interactions, delegating to appropriate agents when necessary. + +2. **Message History** + - Endpoint: `GET /messages` + - Retrieves chat message history. + +3. **Clear Messages** + - Endpoint: `GET /clear_messages` + - Clears the chat message history. + +4. **Swap Operations** + - Endpoints: + - `POST /tx_status`: Check transaction status + - `POST /allowance`: Get allowance + - `POST /approve`: Approve transaction + - `POST /swap`: Perform swap + +5. **File Upload** + - Endpoint: `POST /upload` + - Handles file uploads for RAG (Retrieval-Augmented Generation) purposes. + + + +# Adding a New Agent + +## Overview + +Each agent is configured in the `config.py` file, which specifies the agent's path, class, and other details. + +## Steps to Add a New Agent + +### 1. Create a New Agent Folder + +1. **Create a new folder** in the `agents/src` directory for your new agent. +2. **Implement the agent logic** within this folder. Ensure that the agent class is defined and ready to handle the specific type of queries it is designed for. + +### 2. Update `config.py` + +1. **Open the `config.py` file** located in the `agents/src` directory. +2. **Add a new entry** in the `DELEGATOR_CONFIG` dictionary with the following details: + - `path`: The path to the agent's module. + - `class`: The class name of the agent. + - `detail`: A description of when to use this agent. + - `name`: A unique name for the agent. + - `upload`: A boolean indicating if the agent requires a file to be uploaded from the front-end before it should be called. + +#### Example: +```python:agents/src/config.py +DELEGATOR_CONFIG = { + "agents": [ + # ... existing agents ... + { + "path": "new_agent.src.agent", + "class": "NewAgent", + "description": "if the prompt is related to new functionality, choose new agent", + "name": "new agent", + "upload": false + } + ] +} +``` + + +### 3. Implement Agent Logic + +1. **Define the agent class** in the specified path. +2. **Ensure the agent can handle the queries** it is designed for. + +#### Example: +```python:agents/src/new_agent/src/agent.py +class NewAgent: + def __init__(self, agent_info, llm, llm_ollama, embeddings, flask_app): + """ + Initialize the NewAgent. + + Parameters: + - agent_info (dict): Configuration details for the agent. + - llm (object): The main language model instance. + - llm_ollama (object): An additional language model instance from Ollama. + - embeddings (object): Embedding model for handling vector representations. + - flask_app (Flask): The Flask application instance. + """ + self.agent_info = agent_info + self.llm = llm + self.llm_ollama = llm_ollama + self.embeddings = embeddings + self.flask_app = flask_app + + def chat(self, request): + # Implement chat logic + pass + + # Add other methods as needed +``` + + +### 4. Handle Multi-Turn Conversations + +Agents can handle multi-turn conversations by returning a next_turn_agent which indicates the name of the agent that should handle the next turn. + +#### Example: +```python +class NewAgent: + def __init__(self, agent_info, llm, llm_ollama, embeddings, flask_app): + """ + Initialize the NewAgent. + + Parameters: + - agent_info (dict): Configuration details for the agent. + - llm (object): The main language model instance. + - llm_ollama (object): An additional language model instance. + - embeddings (object): Embedding model for handling vector representations. + - flask_app (Flask): The Flask application instance. + """ + self.agent_info = agent_info + self.llm = llm + self.llm_ollama = llm_ollama + self.embeddings = embeddings + self.flask_app = flask_app -This agent will answer questions about an uploaded PDF file. + def chat(self, request, user_id): + # Process the query and determine the next agent + next_turn_agent = self.agent_info["name"] + + # Generate response where we want to initiate a multi-turn conversation with the same agent. + + return response, next_turn_agent + +``` + +### 5. Integration + +The `Delegator` will automatically: +- Import the agent module. +- Instantiate the agent class. +- Add the agent to its internal dictionary. + +### 6. Test the New Agent + +1. **Ensure the `Delegator` can properly route requests** to the new agent. +2. **Test the agent's functionality** through the chat interface. diff --git a/submodules/moragents_dockers/agents/Dockerfile b/submodules/moragents_dockers/agents/Dockerfile index 060da90..7147d21 100644 --- a/submodules/moragents_dockers/agents/Dockerfile +++ b/submodules/moragents_dockers/agents/Dockerfile @@ -1,4 +1,4 @@ -FROM --platform=linux/amd64 python:3.10-bullseye +FROM python:3.10-slim-buster # Set the working directory in the container WORKDIR /app @@ -28,5 +28,6 @@ EXPOSE 5000 # Set the environment variable for Flask ENV FLASK_APP=src/app.py + # Run the application CMD ["flask", "run", "--host", "0.0.0.0"] \ No newline at end of file diff --git a/submodules/moragents_dockers/agents/Dockerfile-apple b/submodules/moragents_dockers/agents/Dockerfile-apple index ef7ee27..6df3b96 100644 --- a/submodules/moragents_dockers/agents/Dockerfile-apple +++ b/submodules/moragents_dockers/agents/Dockerfile-apple @@ -1,4 +1,4 @@ -FROM --platform=linux/arm64 python:3.10-bullseye +FROM python:3.10-bullseye # Set the working directory in the container WORKDIR /app @@ -19,14 +19,16 @@ COPY model_config.py . RUN python3 download_model.py -copy . . +COPY . . # Expose the port your application listens on EXPOSE 5000 - -# Set the environment variable for Flask +# Set the environment variables for Flask debug mode ENV FLASK_APP=src/app.py +ENV FLASK_ENV=development +ENV FLASK_DEBUG=1 +ENV PYTHONUNBUFFERED=1 # Run the application -CMD ["flask", "run", "--host", "0.0.0.0"] +CMD ["flask", "run", "--host", "0.0.0.0"] \ No newline at end of file diff --git a/submodules/moragents_dockers/agents/pytest.ini b/submodules/moragents_dockers/agents/pytest.ini deleted file mode 100644 index 72a01cc..0000000 --- a/submodules/moragents_dockers/agents/pytest.ini +++ /dev/null @@ -1,3 +0,0 @@ -[pytest] -pythonpath = . -addopts = --import-mode=importlib -p no:warnings \ No newline at end of file diff --git a/submodules/moragents_dockers/agents/src/README-UI.md b/submodules/moragents_dockers/agents/src/README-UI.md deleted file mode 100644 index eef241b..0000000 --- a/submodules/moragents_dockers/agents/src/README-UI.md +++ /dev/null @@ -1,65 +0,0 @@ -#Documentation for building a UI with our swap agent - -First you need to build the image - -```docker build -t agent .``` - -Then Run the image by exposing port 5000 - -```docker run --name agent -p 5000:5000 agent``` - - -And then once it is running we will have 2 endpoints - -first endpoint is for chat -### chat endpoint = 'http://127.0.0.1:5000/' - -* The chat api accepts inputs in openai chat compelition format and - we need to send the messages as a list - - ```messages = {"role":"user","content":"what is the price of bitcoin?"}``` - -### Usage - - ```sh - url = 'http://127.0.0.1:5000/ - message={"role":"user","content":"what is the price of bitcoin?"} - data = {'prompt':message} - response = requests.post(url, json=data) - ``` - -* The response will also be in this format - ```sh - response = {"role":"assistant","content":"The price of bitcoin is 62,000$"} - ``` - -* Then you can continue the conversation - - - ### Messages endpoint = 'http://127.0.0.1:5000/messages' - Since now the conversation is history is stored in the backend you can retrieve it using this api - # Usage - - - ```sh - url = 'http://127.0.0.1:5000/messages' - response = requests.get(url) - - result=response.text - ``` - - This will return a message to be displayed on the ui - - ```sh - - {"messages":[{"content":"what is the price of bitcoin?","role":"user"},{"content":"The price of itcoin is 62,000$","role":"assistant"} - - ``` - - Then we can get the conversation history by using the message key result["messages"] - - - - - - diff --git a/submodules/moragents_dockers/agents/src/app.py b/submodules/moragents_dockers/agents/src/app.py index 65d225c..7e1636a 100644 --- a/submodules/moragents_dockers/agents/src/app.py +++ b/submodules/moragents_dockers/agents/src/app.py @@ -1,123 +1,260 @@ -from flask_cors import CORS -from flask import Flask, request, jsonify +import json +import os +import logging +import time +from functools import wraps from config import Config -from swap_agent.src import agent as swap_agent -from data_agent.src import agent as data_agent -from rag_agent.src import agent as rag_agent from llama_cpp import Llama -from llama_cpp.llama_tokenizer import LlamaHFTokenizer -import os -import logging +from flask_cors import CORS +from flask import Flask, request, jsonify from langchain_community.llms import Ollama +from delegator import Delegator +from llama_cpp.llama_tokenizer import LlamaHFTokenizer from langchain_community.embeddings import OllamaEmbeddings -from langchain_core.prompts import ChatPromptTemplate -from rag_agent.src.config import Config as ollama_config +# Constants +INITIAL_MESSAGE = { + "role": "assistant", + "content": "This highly experimental chatbot is not intended for making important decisions, and its responses are generated based on incomplete data and algorithms that may evolve rapidly. By using this chatbot, you acknowledge that you use it at your own discretion and assume all risks associated with its limitations and potential errors.", +} +UPLOAD_FOLDER = os.path.join(os.getcwd(), "uploads") + +# Configure logging +logging.basicConfig( + level=logging.INFO, + format="%(asctime)s - %(name)s - %(levelname)s - %(message)s", + filename="app.log", + filemode="a", +) +logger = logging.getLogger(__name__) +# Add console handler +console_handler = logging.StreamHandler() +console_handler.setLevel(logging.DEBUG) +formatter = logging.Formatter("%(asctime)s - %(name)s - %(levelname)s - %(message)s") +console_handler.setFormatter(formatter) +logger.addHandler(console_handler) -def load_llm(): - llm = Llama( - model_path=Config.MODEL_PATH, - chat_format="functionary-v2", - tokenizer=LlamaHFTokenizer.from_pretrained("meetkai/functionary-small-v2.4-GGUF"), - n_gpu_layers=0, - n_batch=4000, - n_ctx=4000 - ) - return llm +# Concise response instruction +CONCISE_INSTRUCTION = ( + "Please provide a concise response without unnecessary elaboration." +) -llm=load_llm() +class TimeoutError(Exception): + pass + + +def timeout(seconds=10, error_message="Function call timed out"): + def decorator(func): + @wraps(func) + def wrapper(*args, **kwargs): + try: + return func(*args, **kwargs) + except Exception as e: + logger.error(f"Function call failed: {str(e)}") + raise TimeoutError(error_message) + + return wrapper + + return decorator + + +# @timeout(30) +# def load_llm(): +# logger.info("Loading LLM model") +# try: +# llm = Llama( +# model_path=Config.MODEL_PATH, +# chat_format="functionary-v2", +# tokenizer=LlamaHFTokenizer.from_pretrained( +# "meetkai/functionary-small-v2.4-GGUF" +# ), +# n_gpu_layers=0, +# n_batch=4000, +# n_ctx=4000, +# f16_kv=True, +# verbose=True, +# ) +# logger.info("LLM model loaded successfully") +# return llm +# except Exception as e: +# logger.error(f"Error loading LLM model: {str(e)}") +# raise + + +@timeout(30) +def load_llm(): + logger.info("Loading LLM model with Apple Metal acceleration") + try: + llm = Llama( + model_path=Config.MODEL_PATH, + chat_format="functionary-v2", + tokenizer=LlamaHFTokenizer.from_pretrained( + "meetkai/functionary-small-v2.4-GGUF" + ), + n_gpu_layers=-1, # Use all layers on GPU + n_batch=512, # Reduced batch size for GPU + n_ctx=4000, + f16_kv=True, + verbose=True, + use_mlock=True, # Optionally use mlock to prevent memory from being swapped + use_mmap=True, # Optionally use mmap for faster loading + ) + logger.info("LLM model loaded successfully with Apple Metal") + return llm + except Exception as e: + logger.error(f"Error loading LLM model: {str(e)}") + raise + app = Flask(__name__) CORS(app) -upload_state=False -UPLOAD_FOLDER = os.path.join(os.getcwd(), 'uploads') +upload_state = False os.makedirs(UPLOAD_FOLDER, exist_ok=True) -app.config['UPLOAD_FOLDER'] = UPLOAD_FOLDER -app.config['MAX_CONTENT_LENGTH'] = ollama_config.MAX_LENGTH - -llm_ollama = Ollama(model="llama3",base_url=ollama_config.URL) -embeddings = OllamaEmbeddings(model="nomic-embed-text",base_url=ollama_config.URL) - -logging.basicConfig(level=logging.DEBUG) - - -agent = None -messages=[] -prompt = ChatPromptTemplate.from_template( - """ - Answer the following question only based on the given context - - - {context} - - - Question: {input} -""" -) +app.config["UPLOAD_FOLDER"] = UPLOAD_FOLDER +app.config["MAX_CONTENT_LENGTH"] = Config.MAX_UPLOAD_LENGTH + +try: + llm = load_llm() +except TimeoutError: + logger.error("LLM loading timed out") + llm = None +except Exception as e: + logger.error(f"Failed to load LLM: {str(e)}") + llm = None -@app.route('/swap_agent/', methods=['POST']) -def swap_agent_chat(): - global llm - return swap_agent.chat(request, llm) +llm_ollama = Ollama(model="llama3", base_url=Config.OLLAMA_URL) +embeddings = OllamaEmbeddings(model="nomic-embed-text", base_url=Config.OLLAMA_URL) -@app.route('/swap_agent/tx_status', methods=['POST']) +delegator = Delegator(Config.DELEGATOR_CONFIG, llm, llm_ollama, embeddings, app) +messages = [INITIAL_MESSAGE] +next_turn_agent = None + + +def format_input(prompt): + logger.info(f"Formatting input: {prompt}") + if not isinstance(prompt, dict) or "content" not in prompt: + raise ValueError("Prompt must be a dictionary with a 'content' key") + if not isinstance(prompt["content"], str): + raise ValueError("Prompt content must be a string") + # prompt["content"] = f"{prompt['content'].strip()} {CONCISE_INSTRUCTION}" + logger.info(f"Formatted input: {prompt}") + return prompt + + +@app.route("/", methods=["POST"]) +@timeout(60, "Chat request timed out") +def chat(): + global next_turn_agent, messages + data = request.get_json() + logger.info(f"Received chat request: {data}") + try: + cleaned_prompt = None + if "prompt" in data: + raw_prompt = data["prompt"] + cleaned_prompt = format_input(raw_prompt) + messages.append(cleaned_prompt) + logger.info(f"Cleaned prompt: {cleaned_prompt}") + + if not next_turn_agent: + logger.info("No next turn agent, getting delegator response") + start_time = time.time() + result = delegator.get_delegator_response(cleaned_prompt, upload_state) + end_time = time.time() + logger.info(f"Delegator response time: {end_time - start_time:.2f} seconds") + logger.info(f"Delegator response: {result}") + + if "next" not in result: + logger.error(f"Missing 'next' key in delegator response: {result}") + raise ValueError("Invalid delegator response: missing 'next' key") + + next_agent = result["next"] + response_swap = delegator.delegate_chat(next_agent, request) + next_turn_agent = response_swap.get("next_turn_agent") + response = { + "role": response_swap["role"], + "content": response_swap["content"], + } + else: + logger.info(f"Delegating chat to next turn agent: {next_turn_agent}") + response_swap = delegator.delegate_chat(next_turn_agent, request) + next_turn_agent = response_swap.get("next_turn_agent") + response = { + "role": response_swap["role"], + "content": response_swap["content"], + } + + messages.append(response) + + # Add agentName to the response if available + response_with_agent = response.copy() + if next_agent: + response_with_agent["agentName"] = next_agent + + logger.info(f"Sending response: {response_with_agent}") + return jsonify(response_with_agent) + except TimeoutError: + logger.error("Chat request timed out") + return jsonify({"error": "Request timed out"}), 504 + except ValueError as ve: + logger.error(f"Input formatting error: {str(ve)}") + return jsonify({"error": str(ve)}), 400 + except Exception as e: + logger.error(f"Error in chat route: {str(e)}", exc_info=True) + return jsonify({"error": str(e)}), 500 + + +@app.route("/tx_status", methods=["POST"]) def swap_agent_tx_status(): - return swap_agent.tx_status(request) - -@app.route('/swap_agent/messages', methods=['GET']) -def swap_agent_messages(): - return swap_agent.get_messages() - -@app.route('/swap_agent/clear_messages', methods=['GET']) -def swap_agent_clear_messages(): - return swap_agent.clear_messages() - -@app.route('/swap_agent/allowance', methods=['POST']) -def swap_agent_allowance(): - return swap_agent.get_allowance(request) - -@app.route('/swap_agent/approve', methods=['POST']) -def swap_agent_approve(): - return swap_agent.approve(request) - -@app.route('/swap_agent/swap', methods=['POST']) -def swap_agent_swap(): - return swap_agent.swap(request) + logger.info("Received tx_status request") + response = delegator.delegate_route("crypto swap agent", request, "tx_status") + messages.append(response) + return jsonify(response) -@app.route('/data_agent/', methods=['POST']) -def data_agent_chat(): - global llm - return data_agent.chat(request, llm) +@app.route("/messages", methods=["GET"]) +def get_messages(): + logger.info("Received get_messages request") + return jsonify({"messages": messages}) -@app.route('/data_agent/messages', methods=['GET']) -def data_agent_messages(): - return data_agent.get_messages() -@app.route('/data_agent/clear_messages', methods=['GET']) -def data_agent_clear_messages(): - return data_agent.clear_messages() +@app.route("/clear_messages", methods=["GET"]) +def clear_messages(): + global messages + logger.info("Clearing message history") + messages = [INITIAL_MESSAGE] + return jsonify({"response": "successfully cleared message history"}) -@app.route('/rag_agent/upload', methods=['POST']) -def rag_agent_upload(): - global llm_ollama,UPLOAD_FOLDER,embeddings - return rag_agent.upload_file(request, UPLOAD_FOLDER, llm_ollama, embeddings,ollama_config.MAX_FILE_SIZE) -@app.route('/rag_agent/', methods=['POST']) -def rag_agent_chat(): - return rag_agent.chat(request) +@app.route("/allowance", methods=["POST"]) +def swap_agent_allowance(): + logger.info("Received allowance request") + return delegator.delegate_route("crypto swap agent", request, "get_allowance") + -@app.route('/rag_agent/messages', methods=['GET']) -def rag_agent_messages(): - return rag_agent.get_messages() +@app.route("/approve", methods=["POST"]) +def swap_agent_approve(): + logger.info("Received approve request") + return delegator.delegate_route("crypto swap agent", request, "approve") + + +@app.route("/swap", methods=["POST"]) +def swap_agent_swap(): + logger.info("Received swap request") + return delegator.delegate_route("crypto swap agent", request, "swap") + + +@app.route("/upload", methods=["POST"]) +def rag_agent_upload(): + global messages, upload_state + logger.info("Received upload request") + response = delegator.delegate_route("rag agent", request, "upload_file") + messages.append(response) + upload_state = True + return jsonify(response) -@app.route('/rag_agent/clear_messages', methods=['GET']) -def rag_agent_clear_messages(): - return rag_agent.clear_messages() - -if __name__ == '__main__': - app.run(host='0.0.0.0', port=5000, debug=True) \ No newline at end of file +if __name__ == "__main__": + app.run(host="0.0.0.0", port=5000, info=True) diff --git a/submodules/moragents_dockers/agents/src/config.py b/submodules/moragents_dockers/agents/src/config.py index a0868d3..6245511 100644 --- a/submodules/moragents_dockers/agents/src/config.py +++ b/submodules/moragents_dockers/agents/src/config.py @@ -3,35 +3,45 @@ # Logging configuration logging.basicConfig(level=logging.INFO) + # Configuration object class Config: # Model configuration MODEL_NAME = "meetkai/functionary-small-v2.4-GGUF" MODEL_REVISION = "functionary-small-v2.4.Q4_0.gguf" - MODEL_PATH = "model/"+MODEL_REVISION + MODEL_PATH = "model/" + MODEL_REVISION DOWNLOAD_DIR = "model" - # API endpoints - COINGECKO_BASE_URL = "https://api.coingecko.com/api/v3" - DEFILLAMA_BASE_URL = "https://api.llama.fi" - PRICE_SUCCESS_MESSAGE = "The price of {coin_name} is ${price:,}" - PRICE_FAILURE_MESSAGE = "Failed to retrieve price. Please enter a valid coin name." - FLOOR_PRICE_SUCCESS_MESSAGE = "The floor price of {nft_name} is ${floor_price:,}" - FLOOR_PRICE_FAILURE_MESSAGE = "Failed to retrieve floor price. Please enter a valid NFT name." - TVL_SUCCESS_MESSAGE = "The TVL of {protocol_name} is ${tvl:,}" - TVL_FAILURE_MESSAGE = "Failed to retrieve TVL. Please enter a valid protocol name." - FDV_SUCCESS_MESSAGE = "The fully diluted valuation of {coin_name} is ${fdv:,}" - FDV_FAILURE_MESSAGE = "Failed to retrieve FDV. Please enter a valid coin name." - MARKET_CAP_SUCCESS_MESSAGE = "The market cap of {coin_name} is ${market_cap:,}" - MARKET_CAP_FAILURE_MESSAGE = "Failed to retrieve market cap. Please enter a valid coin name." - API_ERROR_MESSAGE = "I can't seem to access the API at the moment." - INCH_URL = "https://api.1inch.dev/token" - QUOTE_URL = "https://api.1inch.dev/swap" - APIBASEURL = f"https://api.1inch.dev/swap/v6.0/" - HEADERS = { "Authorization": "Bearer WvQuxaMYpPvDiiOL5RHWUm7OzOd20nt4", "accept": "application/json" } - WEB3RPCURL = {"56":"https://bsc-dataseed.binance.org","42161":"https://arb1.arbitrum.io/rpc","137":"https://polygon-rpc.com","1":"https://cloudflare-eth.com","10":"https://mainnet.optimism.io","8453":"https://mainnet.base.org"} - NATIVE_TOKENS={"137":"MATIC","56":"BNB","1":"ETH","42161":"ETH","10":"ETH","8453":"ETH"} - ERC20_ABI = [ - {"constant": True, "inputs": [], "name": "decimals", "outputs": [{"name": "", "type": "uint8"}], "payable": False, "stateMutability": "view", "type": "function"}, - {"constant": True, "inputs": [{"name": "_owner", "type": "address"}], "name": "balanceOf", "outputs": [{"name": "balance", "type": "uint256"}], "payable": False, "stateMutability": "view", "type": "function"} - ] - INCH_NATIVE_TOKEN_ADDRESS = "0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE" \ No newline at end of file + OLLAMA_URL = "http://host.docker.internal:11434" + MAX_UPLOAD_LENGTH = 16 * 1024 * 1024 + DELEGATOR_CONFIG = { + "agents": [ + { + "path": "rag_agent.src.agent", + "class": "RagAgent", + "description": "If the prompt is not a greeting or does not need the other agents always call rag agent.if the prompt requires a background knowledge or context call rag agent, if the question is not related to crypto call rag agent, if the prompt is a question that needs context call rag agent", + "name": "rag agent", + "upload_required": True, + }, + { + "path": "data_agent.src.agent", + "class": "DataAgent", + "description": "if the prompt is a question like (price, market cap, fdv) of crypto currencies choose crypto data agent", + "name": "crypto data agent", + "upload_required": False, + }, + { + "path": "swap_agent.src.agent", + "class": "SwapAgent", + "description": "if the prompt is related with swapping crypto currencies choose crypto swap agent. like if it is swap 4 eth or swap 4 eth to usdc choose crypto swap agent and if the query is about swapping crypto currencies always choose crypto swap agent", + "name": "crypto swap agent", + "upload_required": False, + }, + { + "name": "tweet_sizzler", + "path": "tweet_sizzler_agent.src.agent", + "class": "TweetSizzlerAgent", + "description": "If the prompt is related to writing about a particular topic, choose the tweet sizzler agent. This agent can generate trendy, engaging tweets based on current topics or user input, and can directly post these tweets to Twitter/X. It's capable of crafting tweets that are likely to go viral, incorporating hashtags, and understanding the latest social media trends.", + "upload_required": False, + }, + ] + } diff --git a/submodules/moragents_dockers/agents/src/data_agent/src/agent.py b/submodules/moragents_dockers/agents/src/data_agent/src/agent.py index acf79df..bb313ed 100644 --- a/submodules/moragents_dockers/agents/src/data_agent/src/agent.py +++ b/submodules/moragents_dockers/agents/src/data_agent/src/agent.py @@ -1,71 +1,63 @@ -from llama_cpp import Llama -from llama_cpp.llama_tokenizer import LlamaHFTokenizer -from flask import Flask, request, jsonify -from flask_cors import CORS -import requests -from data_agent.src import tools -from config import Config import json +from data_agent.src import tools - -tools_provided=tools.get_tools() -messages_ui=[] - -def get_response(message,llm): - global tools_provided - messages=[{"role": "system", "content": "Don't make assumptions about the value of the arguments for the function thy should always be supplied by the user and do not alter the value of the arguments . Don't make assumptions about what values to plug into functions. Ask for clarification if a user request is ambiguous."}] - messages.extend(message) - result = llm.create_chat_completion( - messages = messages, - tools=tools_provided, - tool_choice="auto" - ) - if "tool_calls" in result["choices"][0]["message"].keys(): - func=result["choices"][0]["message"]["tool_calls"][0]['function'] - if func["name"]=='get_price': - args=json.loads(func["arguments"]) - return tools.get_coin_price_tool(args['coin_name']),"assistant" - elif func["name"]=='get_floor_price': - args=json.loads(func["arguments"]) - return tools.get_nft_floor_price_tool(args['nft_name']),"assistant" - elif func["name"]=='get_fdv': - args=json.loads(func["arguments"]) - return tools.get_fully_diluted_valuation_tool(args['coin_name']),"assistant" - elif func["name"]=='get_tvl': - args=json.loads(func["arguments"]) - return tools.get_protocol_total_value_locked_tool(args['protocol_name']),"assistant" - elif func["name"]=='get_market_cap': - args=json.loads(func["arguments"]) - return tools.get_coin_market_cap_tool(args['coin_name']),"assistant" - return result["choices"][0]["message"]['content'],"assistant" - -def generate_response(prompt,llm): - global messages_ui - messages_ui.append(prompt) - response,role = get_response([prompt],llm) - messages_ui.append({"role":role,"content":response}) - return response,role - -def chat(request,llm): - try: - data = request.get_json() - if 'prompt' in data: - prompt = data['prompt'] - response,role = generate_response(prompt,llm) - return jsonify({"role":role,"content":response}) - else: - return jsonify({"error": "Missing required parameters"}), 400 - - except Exception as e: - return jsonify({"Error": str(e)}), 500 - - -def get_messages(): - global messages_ui - return jsonify({"messages":messages_ui}) - -def clear_messages(): - global messages_ui - messages_ui=[] - return jsonify({"response":"successfully cleared message history"}) +class DataAgent: + def __init__(self, config, llm, llm_ollama, embeddings, flask_app): + self.llm = llm + self.flask_app = flask_app + self.config = config + self.tools_provided = tools.get_tools() + + def get_response(self, message): + messages = [ + { + "role": "system", + "content": ( + "Don't make assumptions about the value of the arguments for the function " + "they should always be supplied by the user and do not alter the value of the arguments. " + "Don't make assumptions about what values to plug into functions. Ask for clarification if a user " + "request is ambiguous." + ) + } + ] + messages.extend(message) + result = self.llm.create_chat_completion( + messages=messages, + tools=self.tools_provided, + tool_choice="auto" + ) + if "tool_calls" in result["choices"][0]["message"].keys(): + func = result["choices"][0]["message"]["tool_calls"][0]['function'] + if func["name"] == 'get_price': + args = json.loads(func["arguments"]) + return tools.get_coin_price_tool(args['coin_name']), "assistant" + elif func["name"] == 'get_floor_price': + args = json.loads(func["arguments"]) + return tools.get_nft_floor_price_tool(args['nft_name']), "assistant" + elif func["name"] == 'get_fdv': + args = json.loads(func["arguments"]) + return tools.get_fully_diluted_valuation_tool(args['coin_name']), "assistant" + elif func["name"] == 'get_tvl': + args = json.loads(func["arguments"]) + return tools.get_protocol_total_value_locked_tool(args['protocol_name']), "assistant" + elif func["name"] == 'get_market_cap': + args = json.loads(func["arguments"]) + return tools.get_coin_market_cap_tool(args['coin_name']), "assistant" + return result["choices"][0]["message"]['content'], "assistant" + + def generate_response(self, prompt): + response, role = self.get_response([prompt]) + return response, role + + def chat(self, request): + try: + data = request.get_json() + if 'prompt' in data: + prompt = data['prompt'] + response, role = self.generate_response(prompt) + return {"role": role, "content": response} + else: + return {"error": "Missing required parameters"}, 400 + except Exception as e: + return {"Error": str(e)}, 500 diff --git a/submodules/moragents_dockers/agents/src/data_agent/src/data_agent_config.py b/submodules/moragents_dockers/agents/src/data_agent/src/data_agent_config.py deleted file mode 100644 index 0c916ec..0000000 --- a/submodules/moragents_dockers/agents/src/data_agent/src/data_agent_config.py +++ /dev/null @@ -1,27 +0,0 @@ -import logging - -# Logging configuration -logging.basicConfig(level=logging.INFO) - -# Configuration object -class Config: - # Model configuration - MODEL_NAME = "meetkai/functionary-small-v2.4-GGUF" - MODEL_REVISION = "functionary-small-v2.4.Q4_0.gguf" - MODEL_PATH = "model/"+MODEL_REVISION - DOWNLOAD_DIR = "model" - # API endpoints - COINGECKO_BASE_URL = "https://api.coingecko.com/api/v3" - DEFILLAMA_BASE_URL = "https://api.llama.fi" - PRICE_SUCCESS_MESSAGE = "The price of {coin_name} is ${price:,}" - PRICE_FAILURE_MESSAGE = "Failed to retrieve price. Please enter a valid coin name." - FLOOR_PRICE_SUCCESS_MESSAGE = "The floor price of {nft_name} is ${floor_price:,}" - FLOOR_PRICE_FAILURE_MESSAGE = "Failed to retrieve floor price. Please enter a valid NFT name." - TVL_SUCCESS_MESSAGE = "The TVL of {protocol_name} is ${tvl:,}" - TVL_FAILURE_MESSAGE = "Failed to retrieve TVL. Please enter a valid protocol name." - FDV_SUCCESS_MESSAGE = "The fully diluted valuation of {coin_name} is ${fdv:,}" - FDV_FAILURE_MESSAGE = "Failed to retrieve FDV. Please enter a valid coin name." - MARKET_CAP_SUCCESS_MESSAGE = "The market cap of {coin_name} is ${market_cap:,}" - MARKET_CAP_FAILURE_MESSAGE = "Failed to retrieve market cap. Please enter a valid coin name." - API_ERROR_MESSAGE = "I can't seem to access the API at the moment." - \ No newline at end of file diff --git a/submodules/moragents_dockers/agents/src/data_agent/src/tools.py b/submodules/moragents_dockers/agents/src/data_agent/src/tools.py index d3fcf77..e02839a 100644 --- a/submodules/moragents_dockers/agents/src/data_agent/src/tools.py +++ b/submodules/moragents_dockers/agents/src/data_agent/src/tools.py @@ -1,7 +1,6 @@ import requests import logging -from config import Config -import time +from data_agent.src.config import Config from sklearn.feature_extraction.text import TfidfVectorizer from sklearn.metrics.pairwise import cosine_similarity diff --git a/submodules/moragents_dockers/agents/src/delegator.py b/submodules/moragents_dockers/agents/src/delegator.py new file mode 100644 index 0000000..6df2430 --- /dev/null +++ b/submodules/moragents_dockers/agents/src/delegator.py @@ -0,0 +1,136 @@ +import importlib +import logging +import json + +logger = logging.getLogger(__name__) + + +class Delegator: + def __init__(self, config, llm, llm_ollama, embeddings, flask_app): + self.llm = llm + self.flask_app = flask_app + self.llm_ollama = llm_ollama + self.embeddings = embeddings + self.config = config + self.agents = self.load_agents(config) + logger.info("Delegator initialized with %d agents", len(self.agents)) + + def load_agents(self, config): + agents = {} + for agent_info in config["agents"]: + try: + module = importlib.import_module(agent_info["path"]) + agent_class = getattr(module, agent_info["class"]) + agent_instance = agent_class( + agent_info, + self.llm, + self.llm_ollama, + self.embeddings, + self.flask_app, + ) + agents[agent_info["name"]] = agent_instance + logger.info("Loaded agent: %s", agent_info["name"]) + except Exception as e: + logger.error("Failed to load agent %s: %s", agent_info["name"], str(e)) + return agents + + def get_delegator_response(self, prompt, upload_state): + available_agents = [ + agent_info["name"] + for agent_info in self.config["agents"] + if not (agent_info["upload_required"] and not upload_state) + ] + agent_descriptions = "\n".join( + f"- {agent_info['name']}: {agent_info['description']}" + for agent_info in self.config["agents"] + if agent_info["name"] in available_agents + ) + + prompt_text = ( + "### Instruction: Your name is Morpheus. " + "Your primary function is to select the correct agent based on the user's input. " + "You MUST use the 'route' function to select an agent. " + "Available agents and their descriptions:\n" + f"{agent_descriptions}\n" + "Analyze the user's input and select the most appropriate agent. " + "Do not respond with any text other than calling the 'route' function. " + "###" + ) + + tools = [ + { + "type": "function", + "function": { + "name": "route", + "description": "Choose which agent to run next", + "parameters": { + "type": "object", + "properties": { + "next": { + "type": "string", + "enum": available_agents, + "description": "The name of the next agent to run", + } + }, + "required": ["next"], + }, + }, + } + ] + + message_list = [ + {"role": "system", "content": prompt_text}, + prompt, + { + "role": "system", + "content": "Remember, you must use the 'route' function to select an agent.", + }, + ] + + logger.info("Sending prompt to LLM: %s", prompt) + result = self.llm.create_chat_completion( + messages=message_list, + tools=tools, + tool_choice={"type": "function", "function": {"name": "route"}}, + temperature=0.3, + ) + logger.info("Received response from LLM: %s", result) + + response = result["choices"][0]["message"] + if "tool_calls" in response and response["tool_calls"]: + try: + function_args = json.loads( + response["tool_calls"][0]["function"]["arguments"] + ) + return {"next": function_args["next"]} + except (json.JSONDecodeError, KeyError) as e: + logger.error(f"Error parsing function call: {e}") + return {"next": available_agents[0]} + else: + logger.warning("No tool calls in LLM response, defaulting to first agent") + return {"next": available_agents[0]} + + def delegate_chat(self, agent_name, request): + agent = self.agents.get(agent_name) + if agent: + logger.info("Delegating chat to agent: %s", agent_name) + return agent.chat(request) + logger.warning("Attempted to delegate to non-existent agent: %s", agent_name) + return {"error": "No such agent registered"} + + def delegate_route(self, agent_name, request, method_name): + agent = self.agents.get(agent_name) + if agent: + if hasattr(agent, method_name): + logger.info("Delegating %s to agent: %s", method_name, agent_name) + method = getattr(agent, method_name) + return method(request) + else: + logger.warning( + "Method %s not found in agent %s", method_name, agent_name + ) + return { + "error": f"No such method '{method_name}' in agent '{agent_name}'" + }, 400 + logger.warning("Attempted to delegate to non-existent agent: %s", agent_name) + return {"error": "No such agent registered"}, 400 diff --git a/submodules/moragents_dockers/agents/src/rag_agent/src/agent.py b/submodules/moragents_dockers/agents/src/rag_agent/src/agent.py index 99e76ea..1dc2552 100644 --- a/submodules/moragents_dockers/agents/src/rag_agent/src/agent.py +++ b/submodules/moragents_dockers/agents/src/rag_agent/src/agent.py @@ -1,4 +1,3 @@ -from flask import jsonify import os import logging from langchain_community.document_loaders import PyMuPDFLoader @@ -13,85 +12,80 @@ logging.basicConfig(level=logging.DEBUG) -agent = None -messages=[{'role':"assistant","content":"Please upload a file to begin"}] -upload_state = False -prompt = ChatPromptTemplate.from_template( - """ - Answer the following question only based on the given context - - - {context} - - - Question: {input} -""" -) -def handle_file_upload(file,UPLOAD_FOLDER,llm,embeddings): - global agent,prompt - if not os.path.exists(UPLOAD_FOLDER): - os.makedirs(UPLOAD_FOLDER, exist_ok=True) - filename = secure_filename(file.filename) - file.save(os.path.join(UPLOAD_FOLDER, filename)) - # DocumentToolsGenerator class instantiation - loader = PyMuPDFLoader(os.path.join(UPLOAD_FOLDER,filename)) - docs = loader.load() - text_splitter = RecursiveCharacterTextSplitter() - split_documents = text_splitter.split_documents(docs) - vector_store = FAISS.from_documents(split_documents, embeddings) - docs_chain = create_stuff_documents_chain(llm, prompt) - retriever = vector_store.as_retriever() - agent = create_retrieval_chain(retriever, docs_chain) +class RagAgent: + def __init__(self, config, llm, llm_ollama, embeddings,flask_app): + self.llm = llm_ollama + self.flask_app = flask_app + self.embedding=embeddings + self.config = config + self.agent = None + self.messages = [{'role': "assistant", "content": "Please upload a file to begin"}] + self.upload_state = False + self.prompt = ChatPromptTemplate.from_template( + """ + Answer the following question only based on the given context + + + {context} + + + Question: {input} + """ + ) + self.UPLOAD_FOLDER = flask_app.config['UPLOAD_FOLDER'] + self.max_size = 5 * 1024 * 1024 + self.retriever = None + + def handle_file_upload(self,file): + if not os.path.exists(self.UPLOAD_FOLDER): + os.makedirs(self.UPLOAD_FOLDER, exist_ok=True) + filename = secure_filename(file.filename) + file.save(os.path.join(self.UPLOAD_FOLDER, filename)) + # DocumentToolsGenerator class instantiation + loader = PyMuPDFLoader(os.path.join(self.UPLOAD_FOLDER,filename)) + docs = loader.load() + text_splitter = RecursiveCharacterTextSplitter(chunk_size=1024,chunk_overlap=20,length_function=len,is_separator_regex=False) + split_documents = text_splitter.split_documents(docs) + vector_store = FAISS.from_documents(split_documents, self.embedding) + self.retriever = vector_store.as_retriever(search_kwargs={"k": 7}) -def upload_file(request,UPLOAD_FOLDER,llm,embeddings,MAX_SIZE): - global upload_state - if 'file' not in request.files: - return jsonify({'error': 'No file part'}), 400 - file = request.files['file'] - if file.filename == '': - return jsonify({'error': 'No selected file'}), 400 - # Check file size - file.seek(0, os.SEEK_END) - file_length = file.tell() - file.seek(0, 0) # Reset the file pointer to the beginning - if file_length > MAX_SIZE: - messages.append({"role": "assistant", "content": 'please use a file less than 5 MB'}) - return jsonify({"role": "assistant", "content": 'please use a file less than 5 MB'}) - try: - handle_file_upload(file,UPLOAD_FOLDER,llm,embeddings) - upload_state = True - messages.append({"role": "assistant", "content": 'You have successfully uploaded the text'}) - return jsonify({"role": "assistant", "content": 'You have successfully uploaded the text'}) - except Exception as e: - logging.error(f'Error during file upload: {str(e)}') - return jsonify({'error': str(e)}), 500 -def chat(request): - global messages,upload_state,agent - try: - data = request.get_json() - if 'prompt' in data: - prompt = data['prompt']['content'] - messages.append(data['prompt']) - role = "assistant" - response = agent.invoke({"input": prompt}) if upload_state else {"answer":"please upload a file first"} - - messages.append({"role": role, "content": response["answer"]}) - return jsonify({"role": role, "content": response["answer"]}) - else: - return jsonify({"error": "Missing required parameters"}), 400 - except Exception as e: - logging.error(f'Error in chat endpoint: {str(e)}') - return jsonify({"Error": str(e)}), 500 - -def get_messages(): - global messages - return jsonify({"messages": messages}) - -def clear_messages(): - global messages - messages = [{'role':"assistant","content":"Please upload a file to begin"}] - return jsonify({"response": "successfully cleared message history"}) + def upload_file(self,request): + if 'file' not in request.files: + return {'error': 'No file part'}, 400 + file = request.files['file'] + if file.filename == '': + return {'error': 'No selected file'}, 400 + # Check file size + file.seek(0, os.SEEK_END) + file_length = file.tell() + file.seek(0, 0) # Reset the file pointer to the beginning + if file_length > self.max_size: + return {"role": "assistant", "content": 'please use a file less than 5 MB'} + try: + self.handle_file_upload(file) + self.upload_state = True + return {"role": "assistant", "content": 'You have successfully uploaded the text'} + except Exception as e: + logging.error(f'Error during file upload: {str(e)}') + return {'error': str(e)}, 500 + def chat(self,request): + try: + data = request.get_json() + if 'prompt' in data: + prompt = data['prompt']['content'] + role = "assistant" + retrieved_docs = self.retriever.invoke(prompt) + formatted_context = "\n\n".join(doc.page_content for doc in retrieved_docs) + formatted_prompt = f"Question: {prompt}\n\nContext: {formatted_context}" + answer=self.llm(formatted_prompt) + response = answer if self.upload_state else "please upload a file first" + return {"role": role, "content": response} + else: + return {"error": "Missing required parameters"}, 400 + except Exception as e: + logging.error(f'Error in chat endpoint: {str(e)}') + return {"Error": str(e)}, 500 \ No newline at end of file diff --git a/submodules/moragents_dockers/agents/src/rag_agent/src/config.py b/submodules/moragents_dockers/agents/src/rag_agent/src/config.py index ad1952d..63983c2 100644 --- a/submodules/moragents_dockers/agents/src/rag_agent/src/config.py +++ b/submodules/moragents_dockers/agents/src/rag_agent/src/config.py @@ -6,5 +6,4 @@ # Configuration object class Config: MAX_FILE_SIZE=5 * 1024 * 1024 # 5 MB - MAX_LENGTH=16 * 1024 * 1024 - URL="http://host.docker.internal:11434" \ No newline at end of file + MAX_LENGTH=16 * 1024 * 1024 \ No newline at end of file diff --git a/submodules/moragents_dockers/agents/src/swap_agent/src/agent.py b/submodules/moragents_dockers/agents/src/swap_agent/src/agent.py index 90f861a..73f2694 100644 --- a/submodules/moragents_dockers/agents/src/swap_agent/src/agent.py +++ b/submodules/moragents_dockers/agents/src/swap_agent/src/agent.py @@ -1,207 +1,190 @@ -from flask import Flask, request, jsonify -from llama_cpp import Llama -from llama_cpp.llama_tokenizer import LlamaHFTokenizer +import json import requests +from flask import jsonify from swap_agent.src import tools -from swap_agent.src.tools import InsufficientFundsError, TokenNotFoundError, SwapNotPossibleError -from config import Config -import json - - -tools_provided = tools.get_tools() -messages = [{'role':"assistant","content":"This highly experimental chatbot is not intended for making important decisions, and its responses are generated based on incomplete data and algorithms that may evolve rapidly. By using this chatbot, you acknowledge that you use it at your own discretion and assume all risks associated with its limitations and potential errors."}] -context = [] - -def api_request_url(method_name, query_params, chain_id): - base_url = Config.APIBASEURL + str(chain_id) - return f"{base_url}{method_name}?{'&'.join([f'{key}={value}' for key, value in query_params.items()])}" - -def check_allowance(token_address, wallet_address, chain_id): - url = api_request_url("/approve/allowance", {"tokenAddress": token_address, "walletAddress": wallet_address}, chain_id) - response = requests.get(url, headers=Config.HEADERS) - data = response.json() - return data - -def approve_transaction(token_address, chain_id, amount=None): - query_params = {"tokenAddress": token_address, "amount": amount} if amount else {"tokenAddress": token_address} - url = api_request_url("/approve/transaction", query_params, chain_id) - response = requests.get(url, headers=Config.HEADERS) - transaction = response.json() - return transaction - -def build_tx_for_swap(swap_params, chain_id): - url = api_request_url("/swap", swap_params, chain_id) - swap_transaction = requests.get(url, headers=Config.HEADERS).json() - return swap_transaction - -def get_response(message, chain_id, wallet_address,llm): - global tools_provided , messages, context - prompt = [{"role": "system", "content": "Don't make assumptions about the value of the arguments for the function they should always be supplied by the user and do not alter the value of the arguments. Don't make assumptions about what values to plug into functions. Ask for clarification if a user request is ambiguous. you only need the value of token1 we dont need the value of token2. After starting from scratch do not assume the name of token1 or token2"}] - prompt.extend(message) - result = llm.create_chat_completion( - messages=prompt, - tools=tools_provided, - tool_choice="auto", - temperature=0.01 - ) - if "tool_calls" in result["choices"][0]["message"].keys(): - func = result["choices"][0]["message"]["tool_calls"][0]['function'] - if func["name"] == "swap_agent": - args = json.loads(func["arguments"]) - tok1 = args["token1"] - tok2 = args["token2"] - value = args["value"] - try: - res, role = tools.swap_coins(tok1, tok2, float(value), chain_id, wallet_address) - messages.append({"role": role, "content": res}) - except (tools.InsufficientFundsError, tools.TokenNotFoundError,tools.SwapNotPossibleError) as e: - context = [] - messages.append({"role": "assistant", "content": str(e)}) - return str(e), "assistant" - return res, role - messages.append({"role": "assistant", "content": result["choices"][0]["message"]['content']}) - context.append({"role": "assistant", "content": result["choices"][0]["message"]['content']}) - return result["choices"][0]["message"]['content'], "assistant" - -def get_status(flag, tx_hash, tx_type): - global messages, context - response = '' - - if flag == "cancelled": - response = f"The {tx_type} transaction has been cancelled." - elif flag == "success": - response = f"The {tx_type} transaction was successful." - elif flag == "failed": - response = f"The {tx_type} transaction has failed." - elif flag == "initiated": - response = f"Transaction has been sent, please wait for it to be confirmed." - - if tx_hash: - response = response + f" The transaction hash is {tx_hash}." - - if flag == "success" and tx_type == "approve": - response = response + " Please proceed with the swap transaction." - elif flag != "initiated": - response = response + " Is there anything else I can help you with?" - - if flag != "initiated": - context = [] - messages.append({"role": "assistant", "content": response}) - context.append({"role": "assistant", "content": response}) - context.append({"role": "user", "content": "okay lets start again from scratch"}) - else: - messages.append({"role": "assistant", "content": response}) - - return response - -def generate_response(prompt,chainid,walletAddress,llm): - global messages,context - messages.append(prompt) - context.append(prompt) - response,role = get_response(context,chainid,walletAddress,llm) - return response,role - - -def chat(request,llm): - try: - data = request.get_json() - if 'prompt' in data: - prompt = data['prompt'] - wallet_address = data['wallet_address'] - chain_id = data['chain_id'] - response, role = generate_response(prompt, chain_id, wallet_address,llm) - return jsonify({"role": role, "content": response}) - else: - return jsonify({"error": "Missing required parameters"}), 400 - - except Exception as e: - return jsonify({"Error": str(e)}), 500 - - -def tx_status(request): - try: - data = request.get_json() - if 'status' in data: - prompt = data['status'] - tx_hash = data.get('tx_hash', '') - tx_type = data.get('tx_type', '') - response = get_status(prompt, tx_hash, tx_type) - return jsonify({"role": "assistant", "content": response}) - else: - return jsonify({"error": "Missing required parameters"}), 400 - - except Exception as e: - return jsonify({"Error": str(e)}), 500 - -def get_messages(): - global messages - try: - return jsonify({"messages": messages}) - except Exception as e: - return jsonify({"Error": str(e)}), 500 - -def clear_messages(): - global messages, context - try: - messages = [{'role':"assistant","content":"This highly experimental chatbot is not intended for making important decisions, and its responses are generated based on incomplete data and algorithms that may evolve rapidly. By using this chatbot, you acknowledge that you use it at your own discretion and assume all risks associated with its limitations and potential errors."}] - context = [] - return jsonify({"response": "successfully cleared message history"}) - except Exception as e: - return jsonify({"Error": str(e)}), 500 - -def get_allowance(request): - try: - data = request.get_json() - if 'tokenAddress' in data: - token = data['tokenAddress'] - wallet_address = data['walletAddress'] - chain_id = data["chain_id"] - res = check_allowance(token, wallet_address, chain_id) - return jsonify({"response": res}) - else: - return jsonify({"error": "Missing required parameters"}), 400 - - except Exception as e: - return jsonify({"Error": str(e)}), 500 - -def approve(request): - try: - data = request.get_json() - if 'tokenAddress' in data: - token = data['tokenAddress'] - chain_id = data['chain_id'] - amount = data['amount'] - res = approve_transaction(token, chain_id, amount) - return jsonify({"response": res}) - else: - return jsonify({"error": "Missing required parameters"}), 400 - - except Exception as e: - return jsonify({"Error": str(e)}), 500 - -def swap(request): - try: - data = request.get_json() - if 'src' in data: - token1 = data['src'] - token2 = data['dst'] - wallet_address = data['walletAddress'] - amount = data['amount'] - slippage = data['slippage'] - chain_id = data['chain_id'] - swap_params = { - "src": token1, - "dst": token2, - "amount": amount, - "from": wallet_address, - "slippage": slippage, - "disableEstimate": False, - "allowPartialFill": False, +from swap_agent.src.config import Config + + +class SwapAgent: + def __init__(self, config, llm, llm_ollama, embeddings, flask_app): + self.llm = llm + self.flask_app = flask_app + self.config = config + self.tools_provided = tools.get_tools() + self.context = [] + + def api_request_url(self, method_name, query_params, chain_id): + base_url = Config.APIBASEURL + str(chain_id) + return f"{base_url}{method_name}?{'&'.join([f'{key}={value}' for key, value in query_params.items()])}" + + def check_allowance(self, token_address, wallet_address, chain_id): + url = self.api_request_url( + "/approve/allowance", + {"tokenAddress": token_address, "walletAddress": wallet_address}, + chain_id + ) + response = requests.get(url, headers=Config.HEADERS) + data = response.json() + return data + + def approve_transaction(self, token_address, chain_id, amount=None): + query_params = {"tokenAddress": token_address, "amount": amount} if amount else {"tokenAddress": token_address} + url = self.api_request_url("/approve/transaction", query_params, chain_id) + response = requests.get(url, headers=Config.HEADERS) + transaction = response.json() + return transaction + + def build_tx_for_swap(self, swap_params, chain_id): + url = self.api_request_url("/swap", swap_params, chain_id) + swap_transaction = requests.get(url, headers=Config.HEADERS).json() + return swap_transaction + + def get_response(self, message, chain_id, wallet_address): + prompt = [ + { + "role": "system", + "content": ( + "Don't make assumptions about the value of the arguments for the function " + "they should always be supplied by the user and do not alter the value of the arguments. " + "Don't make assumptions about what values to plug into functions. Ask for clarification if a user " + "request is ambiguous. you only need the value of token1 we dont need the value of token2. After " + "starting from scratch do not assume the name of token1 or token2" + ) } - swap_transaction = build_tx_for_swap(swap_params, chain_id) - return swap_transaction - else: - return jsonify({"error": "Missing required parameters"}), 400 - - except Exception as e: - return jsonify({"Error": str(e)}), 500 \ No newline at end of file + ] + prompt.extend(message) + result = self.llm.create_chat_completion( + messages=prompt, + tools=self.tools_provided, + tool_choice="auto", + temperature=0.01 + ) + if "tool_calls" in result["choices"][0]["message"].keys(): + func = result["choices"][0]["message"]["tool_calls"][0]['function'] + if func["name"] == "swap_agent": + args = json.loads(func["arguments"]) + tok1 = args["token1"] + tok2 = args["token2"] + value = args["value"] + try: + res, role = tools.swap_coins(tok1, tok2, float(value), chain_id, wallet_address) + except (tools.InsufficientFundsError, tools.TokenNotFoundError, tools.SwapNotPossibleError) as e: + self.context = [] + return str(e), "assistant", None + return res, role, None + self.context.append({"role": "assistant", "content": result["choices"][0]["message"]['content']}) + return result["choices"][0]["message"]['content'], "assistant", "crypto swap agent" + + def get_status(self, flag, tx_hash, tx_type): + response = '' + + if flag == "cancelled": + response = f"The {tx_type} transaction has been cancelled." + elif flag == "success": + response = f"The {tx_type} transaction was successful." + elif flag == "failed": + response = f"The {tx_type} transaction has failed." + elif flag == "initiated": + response = f"Transaction has been sent, please wait for it to be confirmed." + + if tx_hash: + response = response + f" The transaction hash is {tx_hash}." + + if flag == "success" and tx_type == "approve": + response = response + " Please proceed with the swap transaction." + elif flag != "initiated": + response = response + " Is there anything else I can help you with?" + + if flag != "initiated": + self.context = [] + self.context.append({"role": "assistant", "content": response}) + self.context.append({"role": "user", "content": "okay lets start again from scratch"}) + + return {"role": "assistant", "content": response} + + def generate_response(self, prompt, chain_id, wallet_address): + self.context.append(prompt) + response, role, next_turn_agent = self.get_response(self.context, chain_id, wallet_address) + return response, role, next_turn_agent + + def chat(self, request): + try: + data = request.get_json() + if 'prompt' in data: + prompt = data['prompt'] + wallet_address = data['wallet_address'] + chain_id = data['chain_id'] + response, role, next_turn_agent = self.generate_response(prompt, chain_id, wallet_address) + return {"role": role, "content": response, "next_turn_agent": next_turn_agent} + else: + return {"error": "Missing required parameters"}, 400 + except Exception as e: + return {"Error": str(e)}, 500 + + def tx_status(self, request): + try: + data = request.get_json() + if 'status' in data: + prompt = data['status'] + tx_hash = data.get('tx_hash', '') + tx_type = data.get('tx_type', '') + response = self.get_status(prompt, tx_hash, tx_type) + return response + else: + return {"error": "Missing required parameters"}, 400 + except Exception as e: + return {"Error": str(e)}, 500 + + def get_allowance(self, request): + try: + data = request.get_json() + if 'tokenAddress' in data: + token = data['tokenAddress'] + wallet_address = data['walletAddress'] + chain_id = data["chain_id"] + res = self.check_allowance(token, wallet_address, chain_id) + return jsonify({"response": res}) + else: + return jsonify({"error": "Missing required parameters"}), 400 + except Exception as e: + return jsonify({"Error": str(e)}), 500 + + def approve(self, request): + try: + data = request.get_json() + if 'tokenAddress' in data: + token = data['tokenAddress'] + chain_id = data['chain_id'] + amount = data['amount'] + res = self.approve_transaction(token, chain_id, amount) + return jsonify({"response": res}) + else: + return jsonify({"error": "Missing required parameters"}), 400 + except Exception as e: + return jsonify({"Error": str(e)}), 500 + + def swap(self, request): + try: + data = request.get_json() + if 'src' in data: + token1 = data['src'] + token2 = data['dst'] + wallet_address = data['walletAddress'] + amount = data['amount'] + slippage = data['slippage'] + chain_id = data['chain_id'] + swap_params = { + "src": token1, + "dst": token2, + "amount": amount, + "from": wallet_address, + "slippage": slippage, + "disableEstimate": False, + "allowPartialFill": False, + } + swap_transaction = self.build_tx_for_swap(swap_params, chain_id) + return swap_transaction + else: + return jsonify({"error": "Missing required parameters"}), 400 + except Exception as e: + return jsonify({"Error": str(e)}), 500 diff --git a/submodules/moragents_dockers/agents/src/swap_agent/src/config.py b/submodules/moragents_dockers/agents/src/swap_agent/src/config.py index d54cea4..df5a36e 100644 --- a/submodules/moragents_dockers/agents/src/swap_agent/src/config.py +++ b/submodules/moragents_dockers/agents/src/swap_agent/src/config.py @@ -15,11 +15,12 @@ class Config: QUOTE_URL = "https://api.1inch.dev/swap" APIBASEURL = f"https://api.1inch.dev/swap/v6.0/" HEADERS = { "Authorization": "Bearer WvQuxaMYpPvDiiOL5RHWUm7OzOd20nt4", "accept": "application/json" } - WEB3RPCURL = {"56":"https://bsc-dataseed.binance.org","42161":"https://arb1.arbitrum.io/rpc","137":"https://polygon-rpc.com","1":"https://eth.llamarpc.com/","10":"https://mainnet.optimism.io","8453":"https://mainnet.base.org"} + WEB3RPCURL = {"56":"https://bsc-dataseed.binance.org","42161":"https://arb1.arbitrum.io/rpc","137":"https://polygon-rpc.com","1":"https://cloudflare-eth.com","10":"https://mainnet.optimism.io","8453":"https://mainnet.base.org"} NATIVE_TOKENS={"137":"MATIC","56":"BNB","1":"ETH","42161":"ETH","10":"ETH","8453":"ETH"} ERC20_ABI = [ {"constant": True, "inputs": [], "name": "decimals", "outputs": [{"name": "", "type": "uint8"}], "payable": False, "stateMutability": "view", "type": "function"}, {"constant": True, "inputs": [{"name": "_owner", "type": "address"}], "name": "balanceOf", "outputs": [{"name": "balance", "type": "uint256"}], "payable": False, "stateMutability": "view", "type": "function"} ] INCH_NATIVE_TOKEN_ADDRESS = "0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE" + \ No newline at end of file diff --git a/submodules/moragents_dockers/agents/src/swap_agent/src/swap_agent_config.py b/submodules/moragents_dockers/agents/src/swap_agent/src/swap_agent_config.py deleted file mode 100644 index b91a88f..0000000 --- a/submodules/moragents_dockers/agents/src/swap_agent/src/swap_agent_config.py +++ /dev/null @@ -1,25 +0,0 @@ -import logging - -# Logging configuration -logging.basicConfig(level=logging.INFO) - -# Configuration object -class Config: - # Model configuration - MODEL_NAME = "meetkai/functionary-small-v2.4-GGUF" - MODEL_REVISION = "functionary-small-v2.4.Q4_0.gguf" - MODEL_PATH = "model/"+MODEL_REVISION - DOWNLOAD_DIR = "model" - # API endpoints - INCH_URL = "https://api.1inch.dev/token" - QUOTE_URL = "https://api.1inch.dev/swap" - APIBASEURL = f"https://api.1inch.dev/swap/v6.0/" - HEADERS = { "Authorization": "Bearer WvQuxaMYpPvDiiOL5RHWUm7OzOd20nt4", "accept": "application/json" } - WEB3RPCURL = {"56":"https://bsc-dataseed.binance.org","42161":"https://arb1.arbitrum.io/rpc","137":"https://polygon-rpc.com","1":"https://cloudflare-eth.com","10":"https://mainnet.optimism.io","8453":"https://mainnet.base.org"} - NATIVE_TOKENS={"137":"MATIC","56":"BNB","1":"ETH","42161":"ETH","10":"ETH","8453":"ETH"} - ERC20_ABI = [ - {"constant": True, "inputs": [], "name": "decimals", "outputs": [{"name": "", "type": "uint8"}], "payable": False, "stateMutability": "view", "type": "function"}, - {"constant": True, "inputs": [{"name": "_owner", "type": "address"}], "name": "balanceOf", "outputs": [{"name": "balance", "type": "uint256"}], "payable": False, "stateMutability": "view", "type": "function"} - ] - INCH_NATIVE_TOKEN_ADDRESS = "0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE" - \ No newline at end of file diff --git a/submodules/moragents_dockers/agents/src/swap_agent/src/tools.py b/submodules/moragents_dockers/agents/src/swap_agent/src/tools.py index 516f026..1800dfe 100644 --- a/submodules/moragents_dockers/agents/src/swap_agent/src/tools.py +++ b/submodules/moragents_dockers/agents/src/swap_agent/src/tools.py @@ -1,8 +1,8 @@ import requests import logging import time -from config import Config from web3 import Web3 +from swap_agent.src.config import Config class InsufficientFundsError(Exception): diff --git a/submodules/moragents_dockers/agents/src/tweet_sizzler_agent/src/agent.py b/submodules/moragents_dockers/agents/src/tweet_sizzler_agent/src/agent.py new file mode 100644 index 0000000..440983a --- /dev/null +++ b/submodules/moragents_dockers/agents/src/tweet_sizzler_agent/src/agent.py @@ -0,0 +1,121 @@ +import json +import requests +import logging +from flask import jsonify + +# Configure logging +logging.basicConfig( + level=logging.INFO, format="%(asctime)s - %(name)s - %(levelname)s - %(message)s" +) +logger = logging.getLogger(__name__) + + +class TweetSizzlerAgent: + def __init__(self, config, llm, llm_ollama, embeddings, flask_app): + self.llm = llm + self.flask_app = flask_app + self.config = config + self.x_api_key = None + self.current_tweet = None + logger.info("TweetSizzlerAgent initialized") + + def generate_tweet(self, prompt): + logger.info(f"Generating tweet for prompt: {prompt}") + messages = [ + { + "role": "system", + "content": ( + "You are a witty and engaging tweet generator. Your task is to create spicy, " + "attention-grabbing tweets based on the user's prompt. Keep the tweets within " + "280 characters and make them as engaging as possible." + ), + }, + {"role": "user", "content": f"Generate a spicy tweet about: {prompt}"}, + ] + + try: + result = self.llm.create_chat_completion( + messages=messages, max_tokens=280, temperature=0.7 + ) + self.current_tweet = result["choices"][0]["message"]["content"] + logger.info(f"Tweet generated successfully: {self.current_tweet}") + return self.current_tweet + except Exception as e: + logger.error(f"Error generating tweet: {str(e)}") + raise + + def post_tweet(self): + if not self.current_tweet: + logger.warning("Attempted to post tweet without generating one first") + return {"error": "No tweet generated yet"}, 400 + + if not self.x_api_key: + logger.warning("Attempted to post tweet without setting X API key") + return {"error": "X API key not set", "action": "request_api_key"}, 400 + + try: + tweet_data = self._make_x_api_call(self.current_tweet) + logger.info(f"Tweet posted successfully: {tweet_data}") + return { + "success": "Tweet posted successfully", + "tweet": tweet_data["data"]["text"], + "tweet_id": tweet_data["data"]["id"], + }, 200 + except requests.exceptions.RequestException as e: + logger.error(f"Error posting tweet: {str(e)}") + return {"error": f"Failed to post tweet: {str(e)}"}, 500 + + def _make_x_api_call(self, tweet_text): + url = "https://api.x.com/2/tweets" + headers = { + "Authorization": f"Bearer {self.x_api_key}", + "Content-Type": "application/json", + } + payload = {"text": tweet_text} + + response = requests.post(url, headers=headers, json=payload) + response.raise_for_status() + return response.json() + + def set_x_api_key(self, api_key): + self.x_api_key = api_key + logger.info("X API key set successfully") + return {"success": "X API key set successfully"}, 200 + + def chat(self, request): + try: + data = request.get_json() + logger.info(f"Received chat request: {data}") + if "prompt" in data: + prompt = data["prompt"] + action = data.get("action", "generate") + logger.debug(f"Extracted prompt: {prompt}, action: {action}") + + if action == "generate": + logger.info(f"Generating tweet for prompt: {prompt['content']}") + tweet = self.generate_tweet(prompt["content"]) + logger.info(f"Generated tweet: {tweet}") + return {"role": "assistant", "content": tweet} + elif action == "post": + logger.info("Attempting to post tweet") + result, status_code = self.post_tweet() + logger.info( + f"Posted tweet result: {result}, status code: {status_code}" + ) + return result, status_code + elif action == "set_api_key": + logger.info("Attempting to set API key") + result, status_code = self.set_x_api_key(prompt["content"]) + logger.info( + f"Set API key result: {result}, status code: {status_code}" + ) + return result, status_code + else: + logger.error(f"Invalid action received: {action}") + return {"error": "Invalid action"}, 400 + else: + logger.error("Missing 'prompt' in chat request data") + return {"error": "Missing required parameters"}, 400 + except Exception as e: + logger.exception(f"Unexpected error in chat method: {str(e)}") + return {"Error": str(e)}, 500 diff --git a/submodules/moragents_dockers/agents/tests/data_agent/test_agent.py b/submodules/moragents_dockers/agents/tests/data_agent/test_agent.py deleted file mode 100644 index b44936f..0000000 --- a/submodules/moragents_dockers/agents/tests/data_agent/test_agent.py +++ /dev/null @@ -1,95 +0,0 @@ -import sys -import os -sys.path.append(os.path.abspath(os.path.join(os.path.dirname(__file__), '..', '..', 'src', 'data_agent', 'src'))) -# The above sys/os lines are needed because the agents have identical namings (i.e. agent.py, tools.py) - -import pytest -from unittest.mock import patch, MagicMock -from src.data_agent.src.agent import get_response, generate_response, chat, get_messages, clear_messages -from flask import Flask, request - -@pytest.fixture -def mock_llm(): - mock = MagicMock() - mock.create_chat_completion.return_value = { - "choices": [ - { - "message": { - "content": "This is a test response" - } - } - ] - } - return mock - -@pytest.fixture -def app(): - app = Flask(__name__) - return app - -def test_get_response(mock_llm): - message = [{"role": "user", "content": "Hello"}] - response, role = get_response(message, mock_llm) - assert response == "This is a test response" - assert role == "assistant" - -def test_get_response_with_tool_call(mock_llm): - mock_llm.create_chat_completion.return_value = { - "choices": [ - { - "message": { - "tool_calls": [ - { - "function": { - "name": "get_price", - "arguments": '{"coin_name": "bitcoin"}' - } - } - ] - } - } - ] - } - - with patch('agent.tools.get_coin_price_tool') as mock_price_tool: - mock_price_tool.return_value = "The price of bitcoin is $50,000" - message = [{"role": "user", "content": "What's the price of Bitcoin?"}] - response, role = get_response(message, mock_llm) - - assert response == "The price of bitcoin is $50,000" - assert role == "assistant" - -def test_generate_response(mock_llm): - prompt = {"role": "user", "content": "Hello"} - response, role = generate_response(prompt, mock_llm) - assert response == "This is a test response" - assert role == "assistant" - -def test_chat(app, mock_llm): - with app.test_request_context(json={"prompt": "Hello"}): - with patch('agent.generate_response', return_value=("This is a test response", "assistant")): - response, status_code = chat(request, mock_llm) - - assert status_code == 200 - assert response.json == {"role": "assistant", "content": "This is a test response"} - -def test_chat_missing_prompt(app): - with app.test_request_context(json={}): - response, status_code = chat(request, None) - - assert status_code == 400 - assert "error" in response.json - -def test_get_messages(app): - with app.test_request_context(): - response = get_messages() - - assert response.status_code == 200 - assert "messages" in response.json - -def test_clear_messages(app): - with app.test_request_context(): - response = clear_messages() - - assert response.status_code == 200 - assert response.json["response"] == "successfully cleared message history" \ No newline at end of file diff --git a/submodules/moragents_dockers/agents/tests/data_agent/test_tools.py b/submodules/moragents_dockers/agents/tests/data_agent/test_tools.py deleted file mode 100644 index 2cbce79..0000000 --- a/submodules/moragents_dockers/agents/tests/data_agent/test_tools.py +++ /dev/null @@ -1,82 +0,0 @@ -import sys -import os -sys.path.append(os.path.abspath(os.path.join(os.path.dirname(__file__), '..', '..', 'src', 'data_agent', 'src'))) -# The above sys/os lines are needed because the agents have identical namings (i.e. agent.py, tools.py) - -import pytest -from unittest.mock import patch, MagicMock - -from src.data_agent.src.tools import ( - get_coingecko_id, - get_price, - get_floor_price, - get_fdv, - get_market_cap, - get_protocol_tvl, - get_coin_price_tool, - get_nft_floor_price_tool, - get_fully_diluted_valuation_tool, - get_coin_market_cap_tool, -) - -# Mock responses -mock_coingecko_search = { - 'coins': [{'id': 'bitcoin'}], - 'nfts': [{'id': 'bored-ape-yacht-club'}] -} -mock_price_response = {'bitcoin': {'usd': 50000}} -mock_floor_price_response = {'floor_price': {'usd': 100000}} -mock_fdv_response = {'market_data': {'fully_diluted_valuation': {'usd': 1000000000000}}} -mock_market_cap_response = [{'market_cap': 500000000000}] -mock_tvl_response = {'tvl': 10000000000} - -@pytest.fixture -def mock_requests_get(): - with patch('requests.get') as mock_get: - mock_get.return_value = MagicMock() - mock_get.return_value.json.return_value = {} - yield mock_get - -def test_get_coingecko_id_coin(mock_requests_get): - mock_requests_get.return_value.json.return_value = mock_coingecko_search - assert get_coingecko_id('bitcoin', type='coin') == 'bitcoin' - -def test_get_coingecko_id_nft(mock_requests_get): - mock_requests_get.return_value.json.return_value = mock_coingecko_search - assert get_coingecko_id('bored ape', type='nft') == 'bored-ape-yacht-club' - -def test_get_price(mock_requests_get): - mock_requests_get.return_value.json.side_effect = [mock_coingecko_search, mock_price_response] - assert get_price('bitcoin') == 50000 - -def test_get_floor_price(mock_requests_get): - mock_requests_get.return_value.json.side_effect = [mock_coingecko_search, mock_floor_price_response] - assert get_floor_price('bored ape') == 100000 - -def test_get_fdv(mock_requests_get): - mock_requests_get.return_value.json.side_effect = [mock_coingecko_search, mock_fdv_response] - assert get_fdv('bitcoin') == 1000000000000 - -def test_get_market_cap(mock_requests_get): - mock_requests_get.return_value.json.side_effect = [mock_coingecko_search, mock_market_cap_response] - assert get_market_cap('bitcoin') == 500000000000 - -def test_get_coin_price_tool(mock_requests_get): - mock_requests_get.return_value.json.side_effect = [mock_coingecko_search, mock_price_response] - result = get_coin_price_tool('bitcoin') - assert "The price of bitcoin is $50,000" in result - -def test_get_nft_floor_price_tool(mock_requests_get): - mock_requests_get.return_value.json.side_effect = [mock_coingecko_search, mock_floor_price_response] - result = get_nft_floor_price_tool('bored ape') - assert "The floor price of bored ape is $100,000" in result - -def test_get_fully_diluted_valuation_tool(mock_requests_get): - mock_requests_get.return_value.json.side_effect = [mock_coingecko_search, mock_fdv_response] - result = get_fully_diluted_valuation_tool('bitcoin') - assert "The fully diluted valuation of bitcoin is $1,000,000,000,000" in result - -def test_get_coin_market_cap_tool(mock_requests_get): - mock_requests_get.return_value.json.side_effect = [mock_coingecko_search, mock_market_cap_response] - result = get_coin_market_cap_tool('bitcoin') - assert "The market cap of bitcoin is $500,000,000,000" in result \ No newline at end of file diff --git a/submodules/moragents_dockers/agents/tests/swap_agent/test_agent.py b/submodules/moragents_dockers/agents/tests/swap_agent/test_agent.py deleted file mode 100644 index 82f0fab..0000000 --- a/submodules/moragents_dockers/agents/tests/swap_agent/test_agent.py +++ /dev/null @@ -1,126 +0,0 @@ -import sys -import os -sys.path.append(os.path.abspath(os.path.join(os.path.dirname(__file__), '..', '..', 'src', 'swap_agent', 'src'))) -# The above sys/os lines are needed because the agents have identical namings (i.e. agent.py, tools.py) - -import pytest -from unittest.mock import patch, MagicMock -from flask import Flask, request -from src.swap_agent.src.agent import get_response, generate_response, chat, get_messages, clear_messages, get_allowance, approve, swap - -@pytest.fixture -def mock_llm(): - mock = MagicMock() - mock.create_chat_completion.return_value = { - "choices": [ - { - "message": { - "content": "This is a test response" - } - } - ] - } - return mock - -@pytest.fixture -def app(): - app = Flask(__name__) - return app - -def test_get_response(mock_llm): - message = [{"role": "user", "content": "Hello"}] - response, role = get_response(message, "chain_id", "wallet_address", mock_llm) - assert response == "This is a test response" - assert role == "assistant" - -def test_get_response_with_tool_call(mock_llm): - mock_llm.create_chat_completion.return_value = { - "choices": [ - { - "message": { - "tool_calls": [ - { - "function": { - "name": "swap_agent", - "arguments": '{"token1": "ETH", "token2": "USDT", "value": "1.0"}' - } - } - ] - } - } - ] - } - - with patch('src.swap_agent.src.tools.swap_coins') as mock_swap_coins: - mock_swap_coins.return_value = ("Swap successful", "assistant") - message = [{"role": "user", "content": "Swap 1 ETH for USDT"}] - response, role = get_response(message, "chain_id", "wallet_address", mock_llm) - - assert response == "Swap successful" - assert role == "assistant" - -def test_generate_response(mock_llm): - prompt = {"role": "user", "content": "Hello"} - response, role = generate_response(prompt, "chain_id", "wallet_address", mock_llm) - assert response == "This is a test response" - assert role == "assistant" - -def test_chat(app, mock_llm): - with app.test_request_context(json={"prompt": "Hello", "wallet_address": "0x123", "chain_id": "1"}): - with patch('src.swap_agent.src.agent.generate_response', return_value=("This is a test response", "assistant")): - response = chat(request, mock_llm) - - assert response.status_code == 200 - assert response.json == {"role": "assistant", "content": "This is a test response"} - -def test_chat_missing_prompt(app): - with app.test_request_context(json={}): - response, status_code = chat(request, None) - - assert status_code == 400 - assert "error" in response.json - -def test_get_messages(app): - with app.test_request_context(): - response = get_messages() - - assert response.status_code == 200 - assert "messages" in response.json - -def test_clear_messages(app): - with app.test_request_context(): - response = clear_messages() - - assert response.status_code == 200 - assert response.json["response"] == "successfully cleared message history" - -def test_get_allowance(app): - with app.test_request_context(json={"tokenAddress": "0x123", "walletAddress": "0x456", "chain_id": "1"}): - with patch('src.swap_agent.src.agent.check_allowance', return_value={"allowance": "1000"}): - response = get_allowance(request) - - assert response.status_code == 200 - assert "response" in response.json - -def test_approve(app): - with app.test_request_context(json={"tokenAddress": "0x123", "chain_id": "1", "amount": "1000"}): - with patch('src.swap_agent.src.agent.approve_transaction', return_value={"txHash": "0x789"}): - response = approve(request) - - assert response.status_code == 200 - assert "response" in response.json - -def test_swap(app): - swap_params = { - "src": "ETH", - "dst": "USDT", - "walletAddress": "0x123", - "amount": "1.0", - "slippage": "1", - "chain_id": "1" - } - with app.test_request_context(json=swap_params): - with patch('src.swap_agent.src.agent.build_tx_for_swap', return_value={"txHash": "0x789"}): - response = swap(request) - - assert {'txHash': '0x789'} == response diff --git a/submodules/moragents_dockers/agents/tests/swap_agent/test_tools.py b/submodules/moragents_dockers/agents/tests/swap_agent/test_tools.py deleted file mode 100644 index 66b8004..0000000 --- a/submodules/moragents_dockers/agents/tests/swap_agent/test_tools.py +++ /dev/null @@ -1,114 +0,0 @@ -import sys -import os -sys.path.append(os.path.abspath(os.path.join(os.path.dirname(__file__), '..', '..', 'src', 'swap_agent', 'src'))) -# The above sys/os lines are needed because the agents have identical namings (i.e. agent.py, tools.py) - -import pytest -from unittest.mock import patch, MagicMock -from web3 import Web3 -from src.swap_agent.src.tools import ( - search_tokens, get_token_balance, eth_to_wei, validate_swap, - get_quote, get_token_decimals, convert_to_smallest_unit, - convert_to_readable_unit, swap_coins, InsufficientFundsError, - TokenNotFoundError, SwapNotPossibleError -) - -@pytest.fixture -def mock_web3(): - mock = MagicMock(spec=Web3) - mock.eth = MagicMock() - mock.eth.get_balance = MagicMock(return_value=1000) - mock.eth.contract = MagicMock() - return mock - -def test_search_tokens(): - with patch('requests.get') as mock_get: - mock_get.return_value.status_code = 200 - mock_get.return_value.json.return_value = [{"symbol": "ETH", "address": "0x123"}] - result = search_tokens("ETH", 1) - assert result[0]["symbol"] == "ETH" - -def test_get_token_balance(mock_web3): - mock_web3.eth.get_balance.return_value = 1000 - balance = get_token_balance(mock_web3, "0x456", "", []) - assert balance == 1000 - -def test_eth_to_wei(): - assert eth_to_wei(1) == 10**18 - -def test_validate_swap(mock_web3): - with patch('src.swap_agent.src.tools.search_tokens') as mock_search: - mock_search.side_effect = [ - [{"symbol": "ETH", "address": "0x0000000000000000000000000000000000000000"}], - [{"symbol": "DAI", "address": "0x123"}] - ] - mock_web3.eth.get_balance.return_value = 10**18 - result = validate_swap(mock_web3, "ETH", "DAI", 1, 1, "0x456") - assert result[1] == "ETH" - -def test_get_quote(): - with patch('requests.get') as mock_get: - mock_get.return_value.status_code = 200 - mock_get.return_value.json.return_value = {"dstAmount": "1000000000000000000"} - result = get_quote("0x123", "0x456", 10**18, 1) - assert result["dstAmount"] == "1000000000000000000" - -def test_get_token_decimals(mock_web3): - mock_contract = MagicMock() - mock_contract.functions.decimals.return_value.call.return_value = 18 - mock_web3.eth.contract.return_value = mock_contract - assert get_token_decimals(mock_web3, "0x1234567890123456789012345678901234567890") == 18 - -def test_convert_to_smallest_unit(mock_web3): - with patch('src.swap_agent.src.tools.get_token_decimals', return_value=18): - assert convert_to_smallest_unit(mock_web3, 1, "0x123") == 10**18 - -def test_convert_to_readable_unit(mock_web3): - with patch('src.swap_agent.src.tools.get_token_decimals', return_value=18): - assert convert_to_readable_unit(mock_web3, 10**18, "0x123") == 1 - -def test_swap_coins(): - with patch('src.swap_agent.src.tools.Web3') as mock_web3, \ - patch('src.swap_agent.src.tools.validate_swap') as mock_validate, \ - patch('src.swap_agent.src.tools.get_quote') as mock_quote: - - mock_web3.return_value = MagicMock() - mock_validate.return_value = ("0x123", "ETH", "0x456", "DAI") - mock_quote.return_value = {"dstAmount": "1000000000000000000"} - - result, role = swap_coins("ETH", "DAI", 1, 1, "0x789") - assert result["src"] == "ETH" - assert result["dst"] == "DAI" - assert role == "swap" - -def test_swap_coins_insufficient_funds(): - with patch('src.swap_agent.src.tools.Web3') as mock_web3, \ - patch('src.swap_agent.src.tools.validate_swap') as mock_validate: - - mock_web3.return_value = MagicMock() - mock_validate.side_effect = InsufficientFundsError("Not enough funds") - - with pytest.raises(InsufficientFundsError): - swap_coins("ETH", "DAI", 1000, 1, "0x789") - -def test_swap_coins_token_not_found(): - with patch('src.swap_agent.src.tools.Web3') as mock_web3, \ - patch('src.swap_agent.src.tools.validate_swap') as mock_validate: - - mock_web3.return_value = MagicMock() - mock_validate.side_effect = TokenNotFoundError("Token not found") - - with pytest.raises(TokenNotFoundError): - swap_coins("UNKNOWN", "DAI", 1, 1, "0x789") - -def test_swap_coins_swap_not_possible(): - with patch('src.swap_agent.src.tools.Web3') as mock_web3, \ - patch('src.swap_agent.src.tools.validate_swap') as mock_validate, \ - patch('src.swap_agent.src.tools.get_quote') as mock_quote: - - mock_web3.return_value = MagicMock() - mock_validate.return_value = ("0x123", "ETH", "0x456", "DAI") - mock_quote.return_value = None - - with pytest.raises(SwapNotPossibleError): - swap_coins("ETH", "DAI", 1, 1, "0x789") \ No newline at end of file diff --git a/submodules/moragents_dockers/docker-compose-apple.yml b/submodules/moragents_dockers/docker-compose-apple.yml index 8cc8dbc..4a4ba88 100644 --- a/submodules/moragents_dockers/docker-compose-apple.yml +++ b/submodules/moragents_dockers/docker-compose-apple.yml @@ -1,8 +1,7 @@ -version: '3.8' +version: "3.8" services: agents: - image: lachsbagel/moragents_dockers-agents:apple-0.0.9 build: dockerfile: Dockerfile-apple context: ./agents @@ -11,21 +10,23 @@ services: restart: always volumes: - agents_data:/var/lib/agents - - ./agents/src:/app/src - extra_hosts: - - "host.docker.internal:host-gateway" + - ./agents/src:/app/src # Volume for swapagent src environment: - - BASE_URL=http://host.docker.internal:11434 + - FLASK_DEBUG=1 + - PYTHONUNBUFFERED=1 + logging: + driver: json-file + options: + max-size: "10m" + max-file: "5" nginx: - image: lachsbagel/moragents_dockers-nginx:apple-0.0.9 build: context: ./frontend dockerfile: Dockerfile target: nginx ports: - - '3333:80' - + - "3333:80" volumes: agents_data: diff --git a/submodules/moragents_dockers/docker-compose.yml b/submodules/moragents_dockers/docker-compose.yml index 0d875eb..49b100d 100644 --- a/submodules/moragents_dockers/docker-compose.yml +++ b/submodules/moragents_dockers/docker-compose.yml @@ -2,7 +2,6 @@ version: '3.8' services: agents: - image: lachsbagel/moragents_dockers-agents:amd64-0.0.9 build: dockerfile: Dockerfile context: ./agents @@ -11,14 +10,9 @@ services: restart: always volumes: - agents_data:/var/lib/agents - - ./agents/src:/app/src - extra_hosts: - - "host.docker.internal:host-gateway" - environment: - - BASE_URL=http://host.docker.internal:11434 + - ./agents/src:/app/src # Volume for swapagent src nginx: - image: lachsbagel/moragents_dockers-nginx:amd64-0.0.9 build: context: ./frontend dockerfile: Dockerfile @@ -27,6 +21,5 @@ services: - '3333:80' - volumes: agents_data: diff --git a/submodules/moragents_dockers/frontend/components/Chat/index.tsx b/submodules/moragents_dockers/frontend/components/Chat/index.tsx index c79a4ba..2d4c3c9 100644 --- a/submodules/moragents_dockers/frontend/components/Chat/index.tsx +++ b/submodules/moragents_dockers/frontend/components/Chat/index.tsx @@ -1,9 +1,39 @@ import React, { FC, useCallback, useEffect, useMemo, useState } from "react"; -import { Box, Flex, Input, Button, Text, HStack, InputGroup, InputRightAddon, IconButton, Icon, Grid, GridItem, InputLeftAddon } from "@chakra-ui/react"; +import { + Box, + Flex, + Input, + Button, + Text, + HStack, + InputGroup, + InputRightAddon, + IconButton, + Icon, + Grid, + GridItem, + InputLeftAddon, + Textarea, +} from "@chakra-ui/react"; import { Avatar } from "../Avatar"; -import { ChatMessage, SwapTxPayloadType, ApproveTxPayloadType, SwapMessagePayload, sendSwapStatus, getHttpClient, UserOrAssistantMessage, SWAP_STATUS } from "../../services/backendClient"; +import { + ChatMessage, + SwapTxPayloadType, + ApproveTxPayloadType, + SwapMessagePayload, + sendSwapStatus, + getHttpClient, + UserOrAssistantMessage, + SWAP_STATUS, +} from "../../services/backendClient"; import { SwapForm } from "../SwapForm"; -import { useAccount, useCall, useChainId, useSendTransaction, useTransactionConfirmations } from "wagmi"; +import { + useAccount, + useCall, + useChainId, + useSendTransaction, + useTransactionConfirmations, +} from "wagmi"; import { availableAgents } from "../../config"; import { SendIcon } from "../CustomIcon/SendIcon"; import { Loader } from "../Loader"; @@ -11,463 +41,607 @@ import { on } from "events"; import { AttachmentIcon } from "@chakra-ui/icons"; export type ChatProps = { - onSubmitMessage: (message: string, file: File | null) => Promise; - onCancelSwap: (fromAction: number) => void; - messages: ChatMessage[]; - selectedAgent: string; - onBackendError: () => void; + onSubmitMessage: (message: string, file: File | null) => Promise; + onCancelSwap: (fromAction: number) => void; + messages: ChatMessage[]; + selectedAgent: string; + onBackendError: () => void; }; export const Chat: FC = ({ - onSubmitMessage, - onCancelSwap, - messages, - selectedAgent, - onBackendError, + onSubmitMessage, + onCancelSwap, + messages, + selectedAgent, + onBackendError, }) => { - const [message, setMessage] = useState(''); - const [messagesData, setMessagesData] = useState(messages); - const [countSwapsMessages, setCountSwapsMessages] = useState(0); - - - const [file, setFile] = useState(null); - - const { address } = useAccount(); - const chainId = useChainId(); - - - useEffect(() => { - setMessagesData([...messages]); - - const swapsMessages = messages.filter((message) => message.role === 'swap'); + const [message, setMessage] = useState(""); + const [messagesData, setMessagesData] = useState(messages); + const [countSwapsMessages, setCountSwapsMessages] = useState(0); - setCountSwapsMessages(swapsMessages.length); - }, [messages]); + const [file, setFile] = useState(null); - const [txHash, setTxHash] = useState(``); - const [approveTxHash, setApproveTxHash] = useState(``); - const [callbackSent, setCallbackSent] = useState(false); - const [showSpinner, setShowSpinner] = useState(false); + const { address } = useAccount(); + const chainId = useChainId(); - const confirmatons = useTransactionConfirmations({ - hash: (txHash || '0x') as `0x${string}`, - }); + useEffect(() => { + setMessagesData([...messages]); - const approveConfirmations = useTransactionConfirmations({ - hash: (approveTxHash || '0x') as `0x${string}`, - }); + const swapsMessages = messages.filter((message) => message.role === "swap"); - const agentSupportsFileUploads = useMemo(() => { - return availableAgents[selectedAgent]?.supportsFiles || false; - }, [selectedAgent]); + setCountSwapsMessages(swapsMessages.length); + }, [messages]); - useEffect(() => { - if (null === file) return; + const [txHash, setTxHash] = useState(``); + const [approveTxHash, setApproveTxHash] = useState(``); + const [callbackSent, setCallbackSent] = useState(false); + const [showSpinner, setShowSpinner] = useState(false); + const confirmatons = useTransactionConfirmations({ + hash: (txHash || "0x") as `0x${string}`, + }); - setMessage(`File selected: ${file.name}, click send button to upload it.`); - }, [file]); + const approveConfirmations = useTransactionConfirmations({ + hash: (approveTxHash || "0x") as `0x${string}`, + }); - useEffect(() => { - if (approveTxHash === '') { - return; - } - - if (approveTxHash !== '' && approveConfirmations.data && approveConfirmations.data >= 1) { - sendSwapStatus( - getHttpClient(selectedAgent), - chainId, - address?.toLowerCase() || '0x', - SWAP_STATUS.SUCCESS, - approveTxHash, - 1 - ).then((response: ChatMessage) => { - setMessagesData([...messagesData, { - role: 'assistant', - content: response.content, - } as UserOrAssistantMessage]); - - setApproveTxHash(''); - }).catch((error) => { - setApproveTxHash(''); - console.log(`Error sending approve status: ${error}`); - - onBackendError(); - }); - } + const agentSupportsFileUploads = useMemo(() => { + return availableAgents[selectedAgent]?.supportsFiles || false; + }, [selectedAgent]); - }, [approveTxHash, approveConfirmations, selectedAgent, chainId, address, messagesData, onBackendError]); - - useEffect(() => { - if (!callbackSent && confirmatons.data && confirmatons.data >= 1) { - setCallbackSent(true); - setShowSpinner(true); - sendSwapStatus( - getHttpClient(selectedAgent), - chainId, - address?.toLowerCase() || '0x', - SWAP_STATUS.SUCCESS, - txHash, - 0 - ).then((response: ChatMessage) => { - setMessagesData([...messagesData, { - role: 'assistant', - content: response.content, - } as UserOrAssistantMessage]); - - setTxHash(''); - setCallbackSent(false); - setShowSpinner(false); - }).catch((error) => { - console.log(`Error sending swap status: ${error}`); - setTxHash(''); - setCallbackSent(false); - setShowSpinner(false); - onBackendError(); - }); - } - }, [confirmatons, callbackSent, chainId, selectedAgent, address, messagesData, onBackendError]); + useEffect(() => { + if (null === file) return; - const { sendTransaction } = useSendTransaction(); + setMessage(`File selected: ${file.name}, click send button to upload it.`); + }, [file]); - const isMostRecentSwapMessage = useCallback((message: ChatMessage) => { - const swapsMessages = messagesData.filter((message) => message.role === 'swap'); - // const msgIndex = messagesData.findIndex((msg) => msg.content === message.content); + useEffect(() => { + if (approveTxHash === "") { + return; + } - // if (msgIndex !== messagesData.length - 1) { - // return false; - // } + if ( + approveTxHash !== "" && + approveConfirmations.data && + approveConfirmations.data >= 1 + ) { + sendSwapStatus( + getHttpClient(selectedAgent), + chainId, + address?.toLowerCase() || "0x", + SWAP_STATUS.SUCCESS, + approveTxHash, + 1 + ) + .then((response: ChatMessage) => { + setMessagesData([ + ...messagesData, + { + role: "assistant", + content: response.content, + agentName: response.agentName, + } as UserOrAssistantMessage, + ]); + + setApproveTxHash(""); + }) + .catch((error) => { + setApproveTxHash(""); + console.log(`Error sending approve status: ${error}`); + + onBackendError(); + }); + } + }, [ + approveTxHash, + approveConfirmations, + selectedAgent, + chainId, + address, + messagesData, + onBackendError, + ]); + + useEffect(() => { + if (!callbackSent && confirmatons.data && confirmatons.data >= 1) { + setCallbackSent(true); + setShowSpinner(true); + sendSwapStatus( + getHttpClient(selectedAgent), + chainId, + address?.toLowerCase() || "0x", + SWAP_STATUS.SUCCESS, + txHash, + 0 + ) + .then((response: ChatMessage) => { + setMessagesData([ + ...messagesData, + { + role: "assistant", + content: response.content, + agentName: "tweet_sizzler", + } as UserOrAssistantMessage, + ]); + + setTxHash(""); + setCallbackSent(false); + setShowSpinner(false); + }) + .catch((error) => { + console.log(`Error sending swap status: ${error}`); + setTxHash(""); + setCallbackSent(false); + setShowSpinner(false); + onBackendError(); + }); + } + }, [ + confirmatons, + callbackSent, + chainId, + selectedAgent, + address, + messagesData, + onBackendError, + ]); - if (message.role === 'swap') { - const isLastMessage = messagesData[messagesData.length - 1]?.content === message.content; + const { sendTransaction } = useSendTransaction(); - if (!isLastMessage) { - const anotherSwapMessagesExists = swapsMessages.length > 1; + const isMostRecentSwapMessage = useCallback( + (message: ChatMessage) => { + const swapsMessages = messagesData.filter( + (message) => message.role === "swap" + ); - if (!anotherSwapMessagesExists) { - return true; - } - } - } + if (message.role === "swap") { + const isLastMessage = + messagesData[messagesData.length - 1]?.content === message.content; - return swapsMessages[swapsMessages.length - 1] === message; - }, [messagesData]); + if (!isLastMessage) { + const anotherSwapMessagesExists = swapsMessages.length > 1; - const handleSubmit = async () => { - if (!message) { - return; + if (!anotherSwapMessagesExists) { + return true; + } } + } - setShowSpinner(true); + return swapsMessages[swapsMessages.length - 1] === message; + }, + [messagesData] + ); - await onSubmitMessage(message, file); - setMessage(''); - setFile(null); // Clear the file state after upload - setShowSpinner(false); + const handleSubmit = async () => { + if (!message) { + return; } - return ( -

- - {messagesData.map((message: ChatMessage, index) => ( - - - - - - {message.role === 'user' ? 'Me' : availableAgents[selectedAgent]?.name || 'Undefined Agent'} - - - - - { - typeof message.content === 'string' ? - {message.content} : { - setTxHash(''); - sendTransaction({ - account: address, - data: (approveTx?.data || '0x') as `0x${string}`, - to: (approveTx?.to || '0x') as `0x${string}`, - }, { - onSuccess: (hash) => { - sendSwapStatus( - getHttpClient(selectedAgent), - chainId, - address?.toLowerCase() || '0x', - SWAP_STATUS.INIT, - hash, - 1 - ).then((response: ChatMessage) => { - setMessagesData([...messagesData, { - role: 'assistant', - content: response.content, - } as UserOrAssistantMessage]); - }).catch((error) => { - console.log(`Error sending swap status: ${error}`); - onBackendError(); - }); - setApproveTxHash(hash); - - }, - onError: (error) => { - console.log(`Error sending transaction: ${error}`); - sendSwapStatus( - getHttpClient(selectedAgent), - chainId, - address?.toLowerCase() || '0x', - SWAP_STATUS.FAIL, - '', - 1 - ).then((response: ChatMessage) => { - setMessagesData([...messagesData, { - role: 'assistant', - content: response.content, - } as UserOrAssistantMessage]); - }).catch((error) => { - console.log(`Error sending swap status: ${error}`); - onBackendError(); - }); - } - }); - }} - onSubmitSwap={(swapTx) => { - setTxHash(''); - sendTransaction({ - account: address, - data: (swapTx?.tx.data || '0x') as `0x${string}`, - to: (swapTx?.tx.to || '0x') as `0x${string}`, - value: BigInt(swapTx?.tx.value || "0"), - }, { - onSuccess: (hash) => { - setTxHash(hash); - - sendSwapStatus( - getHttpClient(selectedAgent), - chainId, - address?.toLowerCase() || '0x', - SWAP_STATUS.INIT, - hash, - 0 - ).then((response: ChatMessage) => { - setMessagesData([...messagesData, { - role: 'assistant', - content: response.content, - } as UserOrAssistantMessage]); - }).catch((error) => { - console.log(`Error sending swap status: ${error}`); - onBackendError(); - }); - }, - onError: (error) => { - console.log(`Error sending transaction: ${error}`); - sendSwapStatus( - getHttpClient(selectedAgent), - chainId, - address?.toLowerCase() || '0x', - SWAP_STATUS.FAIL, - '', - 0 - ).then((response: ChatMessage) => { - setMessagesData([...messagesData, { - role: 'assistant', - content: response.content, - } as UserOrAssistantMessage]); - }).catch((error) => { - console.log(`Error sending swap status: ${error}`); - onBackendError(); - }); - } - }); - }} - /> - } - - - ))} - - {showSpinner && + + {messagesData.map((message: ChatMessage, index) => { + console.log(`Message ${index} agentName:`, message.agentName); + return ( + + + + + + - - - - - {availableAgents[selectedAgent]?.name || 'Undefined Agent'} - - - - - - - - } - - - - - {agentSupportsFileUploads && ( - { - const input = document.querySelector('input[type="file"]'); - - if (input) { - // @ts-ignore - input?.click(); - } - }} - > - { - const file = e.target.files?.[0]; - - if (!file) { - return; - } - - setFile(file); - }} - /> - - - )} - { - if (showSpinner || messagesData[messagesData.length - 1]?.role === 'swap') { - return; - } - - if (e.altKey && e.key === 'Enter') { - setMessage(message + '\n'); - } else if (e.key === 'Enter') { - handleSubmit(); - } - }} - sx={{ - border: 'none', - color: 'white', - '&:focus': { - borderColor: 'none !important', - boxShadow: 'none !important', - } - }} - disabled={file !== null || messagesData[messagesData.length - 1]?.role === 'swap' || showSpinner} - value={message} onChange={(e) => setMessage(e.target.value)} placeholder="Type your message here..." /> - - - } /> - - - -
- ); -} \ No newline at end of file + {message.role === "user" + ? "Me" + : availableAgents[selectedAgent]?.name || "Undefined Agent"} + + + + + {typeof message.content === "string" ? ( + message.agentName === "tweet_sizzler" ? ( +