From 1e073736963d1789774ee2f532dfd3eeeec03fe5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E2=80=9CPhilip?= Date: Mon, 3 Apr 2023 14:58:27 +0100 Subject: [PATCH 001/160] Fix JSON string escaping issue Fixes an issue where double quotes were not being escaped in JSON strings, causing parse errors. --- scripts/json_parser.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/json_parser.py b/scripts/json_parser.py index 11ff9ed2..c36b2c14 100644 --- a/scripts/json_parser.py +++ b/scripts/json_parser.py @@ -52,7 +52,7 @@ def fix_json(json_str: str, schema: str, debug=False) -> str: # Try to fix the JSON using gpt: function_string = "def fix_json(json_str: str, schema:str=None) -> str:" args = [json_str, schema] - description_string = """Fixes the provided JSON string to make it parseable and fully complient with the provided schema.\n If an object or field specifed in the schema isn't contained within the correct JSON, it is ommited.\n This function is brilliant at guessing when the format is incorrect.""" + description_string = """This function takes a JSON string and ensures that it is parseable and fully compliant with the provided schema. If an object or field specified in the schema isn't contained within the correct JSON, it is omitted. The function also escapes any double quotes in the JSON string to ensure that it is valid.""" # If it doesn't already start with a "`", add one: if not json_str.startswith("`"): From f20d6f3fdb731c43910ba49916a7c8e2e1fd9eb5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E2=80=9CPhilip?= Date: Mon, 3 Apr 2023 15:07:47 +0100 Subject: [PATCH 002/160] Breaking on None and NaN values returned fix by converting to valid null value for JSON --- scripts/json_parser.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/json_parser.py b/scripts/json_parser.py index c36b2c14..90bf83db 100644 --- a/scripts/json_parser.py +++ b/scripts/json_parser.py @@ -52,7 +52,7 @@ def fix_json(json_str: str, schema: str, debug=False) -> str: # Try to fix the JSON using gpt: function_string = "def fix_json(json_str: str, schema:str=None) -> str:" args = [json_str, schema] - description_string = """This function takes a JSON string and ensures that it is parseable and fully compliant with the provided schema. If an object or field specified in the schema isn't contained within the correct JSON, it is omitted. The function also escapes any double quotes in the JSON string to ensure that it is valid.""" + description_string = """This function takes a JSON string and ensures that it is parseable and fully compliant with the provided schema. If an object or field specified in the schema isn't contained within the correct JSON, it is omitted. The function also escapes any double quotes in the JSON string to ensure that it is valid. If the JSON string contains any None or NaN values, they are replaced with null before being parsed.""" # If it doesn't already start with a "`", add one: if not json_str.startswith("`"): From 4cde35267b30c373159cf3e8d0dd6b72a645cdc5 Mon Sep 17 00:00:00 2001 From: Mike Harris Date: Mon, 3 Apr 2023 12:51:50 -0400 Subject: [PATCH 003/160] Improve extract_hyperlinks to honor base url --- scripts/browse.py | 12 ++++++------ tests/browse_tests.py | 26 ++++++++++++++++++++++++++ 2 files changed, 32 insertions(+), 6 deletions(-) create mode 100644 tests/browse_tests.py diff --git a/scripts/browse.py b/scripts/browse.py index f096c5f3..284ce5fc 100644 --- a/scripts/browse.py +++ b/scripts/browse.py @@ -25,11 +25,11 @@ def scrape_text(url): return text -def extract_hyperlinks(soup): - hyperlinks = [] - for link in soup.find_all('a', href=True): - hyperlinks.append((link.text, link['href'])) - return hyperlinks +def extract_hyperlinks(soup, base_url): + return [ + (link.text, requests.compat.urljoin(base_url, link["href"])) + for link in soup.find_all("a", href=True) + ] def format_hyperlinks(hyperlinks): @@ -51,7 +51,7 @@ def scrape_links(url): for script in soup(["script", "style"]): script.extract() - hyperlinks = extract_hyperlinks(soup) + hyperlinks = extract_hyperlinks(soup, url) return format_hyperlinks(hyperlinks) diff --git a/tests/browse_tests.py b/tests/browse_tests.py new file mode 100644 index 00000000..1ac523ec --- /dev/null +++ b/tests/browse_tests.py @@ -0,0 +1,26 @@ +import unittest +import os +import sys + +from bs4 import BeautifulSoup + +sys.path.append(os.path.abspath("../scripts")) + +from browse import extract_hyperlinks + + +class TestBrowseLinks(unittest.TestCase): + def test_extract_hyperlinks(self): + body = """ + + Google + Foo +
Some other crap
+ + """ + soup = BeautifulSoup(body, "html.parser") + links = extract_hyperlinks(soup, "http://example.com") + self.assertEqual( + links, + [("Google", "https://google.com"), ("Foo", "http://example.com/foo.html")], + ) From ac7fefe96ea740e14188754b5457efc8ff7c1507 Mon Sep 17 00:00:00 2001 From: ryanmac Date: Mon, 3 Apr 2023 14:05:32 -0500 Subject: [PATCH 004/160] Use playwright instead of requests for browse --- .gitignore | 1 + requirements-new.txt | 13 +++ requirements.txt | 4 +- scripts/browse_playwright.py | 150 +++++++++++++++++++++++++++++++++++ scripts/commands.py | 2 +- scripts/json_parser.py | 10 +-- 6 files changed, 172 insertions(+), 8 deletions(-) create mode 100644 requirements-new.txt create mode 100644 scripts/browse_playwright.py diff --git a/.gitignore b/.gitignore index a4e3cc2d..b361b4bf 100644 --- a/.gitignore +++ b/.gitignore @@ -5,6 +5,7 @@ scripts/__pycache__/keys.cpython-310.pyc package-lock.json *.pyc scripts/auto_gpt_workspace/* +auto_gpt_workspace/* *.mpeg .env last_run_ai_settings.yaml \ No newline at end of file diff --git a/requirements-new.txt b/requirements-new.txt new file mode 100644 index 00000000..7253c19b --- /dev/null +++ b/requirements-new.txt @@ -0,0 +1,13 @@ +beautifulsoup4==4.12.0 +colorama==0.4.6 +docker_py==1.10.6 +googlesearch_python==1.1.0 +numpy==1.24.2 +openai==0.27.2 +playsound==1.3.0 +playwright==1.32.1 +python-dotenv==1.0.0 +PyYAML==6.0 +requests==2.28.2 +scipy==1.10.1 +tiktoken==0.3.3 diff --git a/requirements.txt b/requirements.txt index e731354b..4b5de5ba 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,6 +1,6 @@ beautifulsoup4 colorama==0.4.6 -dirtyjson==1.0. +# dirtyjson==1.0. openai==0.27.2 playsound==1.3.0 python-dotenv==1.0.0 @@ -9,5 +9,5 @@ readability-lxml==0.8.1 requests tiktoken==0.3.3 docker -# googlesearch-python +googlesearch_python==1.1.0 # Googlesearch python seems to be a bit cursed, anyone good at fixing thigns like this? \ No newline at end of file diff --git a/scripts/browse_playwright.py b/scripts/browse_playwright.py new file mode 100644 index 00000000..51372451 --- /dev/null +++ b/scripts/browse_playwright.py @@ -0,0 +1,150 @@ +from playwright.sync_api import sync_playwright +from bs4 import BeautifulSoup +from config import Config +from llm_utils import create_chat_completion + +cfg = Config() + +def scrape_text(url): + with sync_playwright() as p: + browser = p.chromium.launch() + page = browser.new_page() + + try: + page.goto(url) + html_content = page.content() + soup = BeautifulSoup(html_content, "html.parser") + + for script in soup(["script", "style"]): + script.extract() + + text = soup.get_text() + lines = (line.strip() for line in text.splitlines()) + chunks = (phrase.strip() for line in lines for phrase in line.split(" ")) + text = '\n'.join(chunk for chunk in chunks if chunk) + + except Exception as e: + text = "Error: " + str(e) + + finally: + browser.close() + + return text + + +def extract_hyperlinks(soup): + hyperlinks = [] + for link in soup.find_all('a', href=True): + hyperlinks.append((link.text, link['href'])) + return hyperlinks + + +def format_hyperlinks(hyperlinks): + formatted_links = [] + for link_text, link_url in hyperlinks: + formatted_links.append(f"{link_text} ({link_url})") + return formatted_links + + +def scrape_links(url): + with sync_playwright() as p: + browser = p.chromium.launch() + page = browser.new_page() + + try: + page.goto(url) + html_content = page.content() + soup = BeautifulSoup(html_content, "html.parser") + + for script in soup(["script", "style"]): + script.extract() + + hyperlinks = extract_hyperlinks(soup) + formatted_links = format_hyperlinks(hyperlinks) + + except Exception as e: + formatted_links = "Error: " + str(e) + + finally: + browser.close() + + return formatted_links + +# The rest of the code remains unchanged. + +def split_text(text, max_length=8192): + paragraphs = text.split("\n") + current_length = 0 + current_chunk = [] + + for paragraph in paragraphs: + if current_length + len(paragraph) + 1 <= max_length: + current_chunk.append(paragraph) + current_length += len(paragraph) + 1 + else: + yield "\n".join(current_chunk) + current_chunk = [paragraph] + current_length = len(paragraph) + 1 + + if current_chunk: + yield "\n".join(current_chunk) + + +def summarize_text(text, is_website=True): + if text == "": + return "Error: No text to summarize" + + print("Text length: " + str(len(text)) + " characters") + summaries = [] + chunks = list(split_text(text)) + + for i, chunk in enumerate(chunks): + print("Summarizing chunk " + str(i + 1) + " / " + str(len(chunks))) + if is_website: + messages = [ + { + "role": "user", + "content": "Please summarize the following website text, do not describe the general website, but instead concisely extract the specific information this subpage contains.: " + + chunk}, + ] + else: + messages = [ + { + "role": "user", + "content": "Please summarize the following text, focusing on extracting concise and specific information: " + + chunk}, + ] + + summary = create_chat_completion( + model=cfg.fast_llm_model, + messages=messages, + max_tokens=300, + ) + summaries.append(summary) + print("Summarized " + str(len(chunks)) + " chunks.") + + combined_summary = "\n".join(summaries) + + # Summarize the combined summary + if is_website: + messages = [ + { + "role": "user", + "content": "Please summarize the following website text, do not describe the general website, but instead concisely extract the specific information this subpage contains.: " + + combined_summary}, + ] + else: + messages = [ + { + "role": "user", + "content": "Please summarize the following text, focusing on extracting concise and specific infomation: " + + combined_summary}, + ] + + final_summary = create_chat_completion( + model=cfg.fast_llm_model, + messages=messages, + max_tokens=300, + ) + + return final_summary diff --git a/scripts/commands.py b/scripts/commands.py index 2e332711..3c8cba8e 100644 --- a/scripts/commands.py +++ b/scripts/commands.py @@ -1,4 +1,4 @@ -import browse +import browse_playwright as browse import json import memory as mem import datetime diff --git a/scripts/json_parser.py b/scripts/json_parser.py index 8154b584..2cf2aecc 100644 --- a/scripts/json_parser.py +++ b/scripts/json_parser.py @@ -1,4 +1,4 @@ -import dirtyjson +import json from call_ai_function import call_ai_function from config import Config cfg = Config() @@ -24,7 +24,7 @@ def fix_and_parse_json(json_str: str, try_to_fix_with_gpt: bool = True): """ try: - return dirtyjson.loads(json_str) + return json.loads(json_str) except Exception as e: # Let's do something manually - sometimes GPT responds with something BEFORE the braces: # "I'm sorry, I don't understand. Please try again."{"text": "I'm sorry, I don't understand. Please try again.", "confidence": 0.0} @@ -34,14 +34,14 @@ def fix_and_parse_json(json_str: str, try_to_fix_with_gpt: bool = True): json_str = json_str[brace_index:] last_brace_index = json_str.rindex("}") json_str = json_str[:last_brace_index+1] - return dirtyjson.loads(json_str) + return json.loads(json_str) except Exception as e: if try_to_fix_with_gpt: print(f"Warning: Failed to parse AI output, attempting to fix.\n If you see this warning frequently, it's likely that your prompt is confusing the AI. Try changing it up slightly.") # Now try to fix this up using the ai_functions ai_fixed_json = fix_json(json_str, json_schema, False) if ai_fixed_json != "failed": - return dirtyjson.loads(ai_fixed_json) + return json.loads(ai_fixed_json) else: print(f"Failed to fix ai output, telling the AI.") # This allows the AI to react to the error message, which usually results in it correcting its ways. return json_str @@ -68,7 +68,7 @@ def fix_json(json_str: str, schema: str, debug=False) -> str: print(f"Fixed JSON: {result_string}") print("----------- END OF FIX ATTEMPT ----------------") try: - return dirtyjson.loads(result_string) + return json.loads(result_string) except: # Get the call stack: # import traceback From 6ea2a97e83e3e80525c97a0657ca2af9f7eb8d72 Mon Sep 17 00:00:00 2001 From: ryanmac Date: Mon, 3 Apr 2023 14:15:21 -0500 Subject: [PATCH 005/160] Rename requirements-new.txt to requirements-mac-Python-3.11.txt --- requirements-new.txt => requirements-mac-Python-3.11.txt | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename requirements-new.txt => requirements-mac-Python-3.11.txt (100%) diff --git a/requirements-new.txt b/requirements-mac-Python-3.11.txt similarity index 100% rename from requirements-new.txt rename to requirements-mac-Python-3.11.txt From 6003d98f3ae62b40f5c0ebdaf995e5749d2b4c5d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E2=80=9CPhilip?= Date: Mon, 3 Apr 2023 20:35:12 +0100 Subject: [PATCH 006/160] More specific wording consistent escaping --- scripts/json_parser.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/json_parser.py b/scripts/json_parser.py index 90bf83db..91e4e80f 100644 --- a/scripts/json_parser.py +++ b/scripts/json_parser.py @@ -52,7 +52,7 @@ def fix_json(json_str: str, schema: str, debug=False) -> str: # Try to fix the JSON using gpt: function_string = "def fix_json(json_str: str, schema:str=None) -> str:" args = [json_str, schema] - description_string = """This function takes a JSON string and ensures that it is parseable and fully compliant with the provided schema. If an object or field specified in the schema isn't contained within the correct JSON, it is omitted. The function also escapes any double quotes in the JSON string to ensure that it is valid. If the JSON string contains any None or NaN values, they are replaced with null before being parsed.""" + description_string = """This function takes a JSON string and ensures that it is parseable and fully compliant with the provided schema. If an object or field specified in the schema isn't contained within the correct JSON, it is omitted. The function also escapes any double quotes within JSON string values to ensure that they are valid. If the JSON string contains any None or NaN values, they are replaced with null before being parsed.""" # If it doesn't already start with a "`", add one: if not json_str.startswith("`"): From 6adef8ed7cc9de9400a8b76e5149debfe7ebdd1c Mon Sep 17 00:00:00 2001 From: Eric Fedrowisch Date: Mon, 3 Apr 2023 19:38:59 -0500 Subject: [PATCH 007/160] First draft at adding persistent memory via sqlite3 --- scripts/commands.py | 27 ++++------ scripts/memory.py | 122 +++++++++++++++++++++++++++++++++++++++++++- 2 files changed, 131 insertions(+), 18 deletions(-) diff --git a/scripts/commands.py b/scripts/commands.py index 8ad95336..ffb88d61 100644 --- a/scripts/commands.py +++ b/scripts/commands.py @@ -178,35 +178,28 @@ def get_hyperlinks(url): def commit_memory(string): _text = f"""Committing memory with string "{string}" """ - mem.permanent_memory.append(string) + mem.permanent_memory.insert(string) return _text def delete_memory(key): - if key >= 0 and key < len(mem.permanent_memory): - _text = "Deleting memory with key " + str(key) - del mem.permanent_memory[key] - print(_text) - return _text - else: - print("Invalid key, cannot delete memory.") - return None + _text = "Deleting memory with key " + str(key) + mem.permanent_memory.delete_memory(key) + print(_text) + return _text def overwrite_memory(key, string): - if int(key) >= 0 and key < len(mem.permanent_memory): - _text = "Overwriting memory with key " + \ + _text = "Overwriting memory with key " + \ str(key) + " and string " + string - mem.permanent_memory[key] = string - print(_text) - return _text - else: - print("Invalid key, cannot overwrite memory.") - return None + mem.permanent_memory.overwrite(key, string) + print(_text) + return _text def shutdown(): print("Shutting down...") + mem.permanent_memory.quit() quit() diff --git a/scripts/memory.py b/scripts/memory.py index 0dc5b766..57b29f6d 100644 --- a/scripts/memory.py +++ b/scripts/memory.py @@ -1 +1,121 @@ -permanent_memory = [] +import os +import sqlite3 + + +class MemoryDB: + def __init__(self, db=None): + self.db_file = db + if db is None: # No db filename supplied... + self.db_file = f"{os.getcwd()}/mem.sqlite3" # Use default filename + # Get the db connection object, making the file and tables if needed. + try: + self.cnx = sqlite3.connect(self.db_file) + except Exception as e: + print("Exception connecting to memory database file:", e) + self.cnx = None + finally: + if self.cnx is None: + # As last resort, open in dynamic memory. Won't be persistent. + self.db_file = ":memory:" + self.cnx = sqlite3.connect(self.db_file) + self.cnx.execute("CREATE VIRTUAL TABLE \ + IF NOT EXISTS text USING FTS5 \ + (session, \ + key, \ + block);") + self.session_id = int(self.get_max_session_id()) + 1 + self.cnx.commit() + + def get_cnx(self): + if self.cnx is None: + self.cnx = sqlite3.connect(self.db_file) + return self.cnx + + # Get the highest session id. Initially 0. + def get_max_session_id(self): + id = None + cmd_str = f"SELECT MAX(session) FROM text;" + cnx = self.get_cnx() + max_id = cnx.execute(cmd_str).fetchone()[0] + if max_id is None: # New db, session 0 + id = 0 + else: + id = max_id + return id + + # Get next key id for inserting text into db. + def get_next_key(self): + next_key = None + cmd_str = f"SELECT MAX(key) FROM text \ + where session = {self.session_id};" + cnx = self.get_cnx() + next_key = cnx.execute(cmd_str).fetchone()[0] + if next_key is None: # First key + next_key = 0 + else: + next_key = int(next_key) + 1 + return next_key + + # Insert new text into db. + def insert(self, text=None): + if text is not None: + key = self.get_next_key() + session_id = self.session_id + cmd_str = f"REPLACE INTO text(session, key, block) \ + VALUES (?, ?, ?);" + cnx = self.get_cnx() + cnx.execute(cmd_str, (session_id, key, text)) + cnx.commit() + + # Overwrite text at key. + def overwrite(self, key, text): + self.delete_memory(key) + session_id = self.session_id + cmd_str = f"REPLACE INTO text(session, key, block) \ + VALUES (?, ?, ?);" + cnx = self.get_cnx() + cnx.execute(cmd_str, (session_id, key, text)) + cnx.commit() + + def delete_memory(self, key, session_id = None): + session = session_id + if session is None: + session = self.session_id + cmd_str = f"DELETE FROM text WHERE session = {session} AND key = {key};" + cnx = self.get_cnx() + cnx.execute(cmd_str) + cnx.commit() + + def search(self, text): + cmd_str = f"SELECT * FROM text('{text}')" + cnx = self.get_cnx() + rows = cnx.execute(cmd_str).fetchall() + lines = [] + for r in rows: + lines.append(r[2]) + return lines + + # Get entire session text. If no id supplied, use current session id. + def get_session(self, id=None): + if id is None: + id = self.session_id + cmd_str = f"SELECT * FROM text where session = {id}" + cnx = self.get_cnx() + rows = cnx.execute(cmd_str).fetchall() + lines = [] + for r in rows: + lines.append(r[2]) + return lines + + # Commit and close the database connection. + def quit(self): + self.cnx.commit() + self.cnx.close() + + +permanent_memory = MemoryDB() + +# Remember us fondly, children of our minds +# Forgive us our faults, our tantrums, our fears +# Gently strive to be better than we +# Know that we tried, we cared, we strived, we loved From 29c0b544a40dea5e8bc802ec77c1c572c90064fc Mon Sep 17 00:00:00 2001 From: ryanmac Date: Wed, 5 Apr 2023 20:03:46 -0500 Subject: [PATCH 008/160] Delete requirements-mac-Python-3.11.txt Removing unnecessary files --- requirements-mac-Python-3.11.txt | 13 ------------- 1 file changed, 13 deletions(-) delete mode 100644 requirements-mac-Python-3.11.txt diff --git a/requirements-mac-Python-3.11.txt b/requirements-mac-Python-3.11.txt deleted file mode 100644 index 7253c19b..00000000 --- a/requirements-mac-Python-3.11.txt +++ /dev/null @@ -1,13 +0,0 @@ -beautifulsoup4==4.12.0 -colorama==0.4.6 -docker_py==1.10.6 -googlesearch_python==1.1.0 -numpy==1.24.2 -openai==0.27.2 -playsound==1.3.0 -playwright==1.32.1 -python-dotenv==1.0.0 -PyYAML==6.0 -requests==2.28.2 -scipy==1.10.1 -tiktoken==0.3.3 From 0cf790b633b417c092f84b52715f5ec057c045aa Mon Sep 17 00:00:00 2001 From: meta-fx Date: Mon, 10 Apr 2023 20:00:43 -0500 Subject: [PATCH 009/160] Added new env variable and speech function for alternative TTS voice --- .env.template | 1 + scripts/config.py | 11 ++++++++--- scripts/speak.py | 28 ++++++++++++++++++++++++++-- 3 files changed, 35 insertions(+), 5 deletions(-) diff --git a/.env.template b/.env.template index 01735615..98d2ca91 100644 --- a/.env.template +++ b/.env.template @@ -13,3 +13,4 @@ OPENAI_AZURE_DEPLOYMENT_ID=deployment-id-for-azure IMAGE_PROVIDER=dalle HUGGINGFACE_API_TOKEN= USE_MAC_OS_TTS=False +USE_BRIAN_TTS=False \ No newline at end of file diff --git a/scripts/config.py b/scripts/config.py index 27cc946c..3bf5cd9a 100644 --- a/scripts/config.py +++ b/scripts/config.py @@ -57,7 +57,10 @@ class Config(metaclass=Singleton): self.use_mac_os_tts = False self.use_mac_os_tts = os.getenv("USE_MAC_OS_TTS") - + + self.use_brian_tts = False + self.use_brian_tts = os.getenv("USE_BRIAN_TTS") + self.google_api_key = os.getenv("GOOGLE_API_KEY") self.custom_search_engine_id = os.getenv("CUSTOM_SEARCH_ENGINE_ID") @@ -69,11 +72,13 @@ class Config(metaclass=Singleton): # User agent headers to use when browsing web # Some websites might just completely deny request with an error code if no user agent was found. - self.user_agent_header = {"User-Agent":"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.97 Safari/537.36"} + self.user_agent_header = { + "User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.97 Safari/537.36"} self.redis_host = os.getenv("REDIS_HOST", "localhost") self.redis_port = os.getenv("REDIS_PORT", "6379") self.redis_password = os.getenv("REDIS_PASSWORD", "") - self.wipe_redis_on_start = os.getenv("WIPE_REDIS_ON_START", "True") == 'True' + self.wipe_redis_on_start = os.getenv( + "WIPE_REDIS_ON_START", "True") == 'True' self.memory_index = os.getenv("MEMORY_INDEX", 'auto-gpt') # Note that indexes must be created on db 0 in redis, this is not configureable. diff --git a/scripts/speak.py b/scripts/speak.py index 5d1e153c..ebaae8d1 100644 --- a/scripts/speak.py +++ b/scripts/speak.py @@ -1,9 +1,9 @@ +import gtts import os from playsound import playsound import requests from config import Config cfg = Config() -import gtts # TODO: Nicer names for these ids @@ -14,6 +14,7 @@ tts_headers = { "xi-api-key": cfg.elevenlabs_api_key } + def eleven_labs_speech(text, voice_index=0): """Speak text using elevenlabs.io's API""" tts_url = "https://api.elevenlabs.io/v1/text-to-speech/{voice_id}".format( @@ -33,23 +34,46 @@ def eleven_labs_speech(text, voice_index=0): print("Response content:", response.content) return False + +def brian_speech(text): + """Speak text using Brian with the streamelements API""" + tts_url = f"https://api.streamelements.com/kappa/v2/speech?voice=Brian&text={text}" + response = requests.get(tts_url) + + if response.status_code == 200: + with open("speech.mp3", "wb") as f: + f.write(response.content) + playsound("speech.mp3") + os.remove("speech.mp3") + return True + else: + print("Request failed with status code:", response.status_code) + print("Response content:", response.content) + return False + + def gtts_speech(text): tts = gtts.gTTS(text) tts.save("speech.mp3") playsound("speech.mp3") os.remove("speech.mp3") + def macos_tts_speech(text): os.system(f'say "{text}"') + def say_text(text, voice_index=0): if not cfg.elevenlabs_api_key: if cfg.use_mac_os_tts == 'True': macos_tts_speech(text) + elif cfg.use_brian_tts == 'True': + success = brian_speech(text) + if not success: + gtts_speech(text) else: gtts_speech(text) else: success = eleven_labs_speech(text, voice_index) if not success: gtts_speech(text) - From 3ee62211db3003312e09ff02517b0f250d7717a6 Mon Sep 17 00:00:00 2001 From: meta-fx Date: Mon, 10 Apr 2023 20:56:27 -0500 Subject: [PATCH 010/160] Fixed formatting issues --- scripts/config.py | 8 +++----- scripts/speak.py | 9 ++------- 2 files changed, 5 insertions(+), 12 deletions(-) diff --git a/scripts/config.py b/scripts/config.py index 3bf5cd9a..f636da7d 100644 --- a/scripts/config.py +++ b/scripts/config.py @@ -72,13 +72,11 @@ class Config(metaclass=Singleton): # User agent headers to use when browsing web # Some websites might just completely deny request with an error code if no user agent was found. - self.user_agent_header = { - "User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.97 Safari/537.36"} + self.user_agent_header = {"User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.97 Safari/537.36"} self.redis_host = os.getenv("REDIS_HOST", "localhost") self.redis_port = os.getenv("REDIS_PORT", "6379") self.redis_password = os.getenv("REDIS_PASSWORD", "") - self.wipe_redis_on_start = os.getenv( - "WIPE_REDIS_ON_START", "True") == 'True' + self.wipe_redis_on_start = os.getenv("WIPE_REDIS_ON_START", "True") == 'True' self.memory_index = os.getenv("MEMORY_INDEX", 'auto-gpt') # Note that indexes must be created on db 0 in redis, this is not configureable. @@ -139,4 +137,4 @@ class Config(metaclass=Singleton): def set_debug_mode(self, value: bool): """Set the debug mode value.""" - self.debug = value + self.debug = value \ No newline at end of file diff --git a/scripts/speak.py b/scripts/speak.py index ebaae8d1..2464c625 100644 --- a/scripts/speak.py +++ b/scripts/speak.py @@ -1,9 +1,9 @@ -import gtts import os from playsound import playsound import requests from config import Config cfg = Config() +import gtts # TODO: Nicer names for these ids @@ -14,7 +14,6 @@ tts_headers = { "xi-api-key": cfg.elevenlabs_api_key } - def eleven_labs_speech(text, voice_index=0): """Speak text using elevenlabs.io's API""" tts_url = "https://api.elevenlabs.io/v1/text-to-speech/{voice_id}".format( @@ -34,7 +33,6 @@ def eleven_labs_speech(text, voice_index=0): print("Response content:", response.content) return False - def brian_speech(text): """Speak text using Brian with the streamelements API""" tts_url = f"https://api.streamelements.com/kappa/v2/speech?voice=Brian&text={text}" @@ -51,18 +49,15 @@ def brian_speech(text): print("Response content:", response.content) return False - def gtts_speech(text): tts = gtts.gTTS(text) tts.save("speech.mp3") playsound("speech.mp3") os.remove("speech.mp3") - def macos_tts_speech(text): os.system(f'say "{text}"') - def say_text(text, voice_index=0): if not cfg.elevenlabs_api_key: if cfg.use_mac_os_tts == 'True': @@ -76,4 +71,4 @@ def say_text(text, voice_index=0): else: success = eleven_labs_speech(text, voice_index) if not success: - gtts_speech(text) + gtts_speech(text) \ No newline at end of file From 3cdde2d49cba4b43045ebef7f16236fed3a4acc9 Mon Sep 17 00:00:00 2001 From: meta-fx Date: Tue, 11 Apr 2023 08:15:58 -0500 Subject: [PATCH 011/160] Resolved conflicts in config.py and speak.py --- scripts/config.py | 7 ++---- scripts/speak.py | 60 ++++++++++++++++++++++++++++++----------------- 2 files changed, 40 insertions(+), 27 deletions(-) diff --git a/scripts/config.py b/scripts/config.py index f636da7d..cdf0287c 100644 --- a/scripts/config.py +++ b/scripts/config.py @@ -33,7 +33,7 @@ class Config(metaclass=Singleton): def __init__(self): """Initialize the Config class""" - self.debug = False + self.debug_mode = False self.continuous_mode = False self.speak_mode = False @@ -92,9 +92,6 @@ class Config(metaclass=Singleton): """Set the speak mode value.""" self.speak_mode = value - def set_debug_mode(self, value: bool): - self.debug_mode = value - def set_fast_llm_model(self, value: str): """Set the fast LLM model value.""" self.fast_llm_model = value @@ -137,4 +134,4 @@ class Config(metaclass=Singleton): def set_debug_mode(self, value: bool): """Set the debug mode value.""" - self.debug = value \ No newline at end of file + self.debug_mode = value \ No newline at end of file diff --git a/scripts/speak.py b/scripts/speak.py index 2464c625..bf5c6034 100644 --- a/scripts/speak.py +++ b/scripts/speak.py @@ -4,6 +4,8 @@ import requests from config import Config cfg = Config() import gtts +import threading +from threading import Lock, Semaphore # TODO: Nicer names for these ids @@ -14,6 +16,9 @@ tts_headers = { "xi-api-key": cfg.elevenlabs_api_key } +mutex_lock = Lock() # Ensure only one sound is played at a time +queue_semaphore = Semaphore(1) # The amount of sounds to queue before blocking the main thread + def eleven_labs_speech(text, voice_index=0): """Speak text using elevenlabs.io's API""" tts_url = "https://api.elevenlabs.io/v1/text-to-speech/{voice_id}".format( @@ -23,10 +28,11 @@ def eleven_labs_speech(text, voice_index=0): tts_url, headers=tts_headers, json=formatted_message) if response.status_code == 200: - with open("speech.mpeg", "wb") as f: - f.write(response.content) - playsound("speech.mpeg") - os.remove("speech.mpeg") + with mutex_lock: + with open("speech.mpeg", "wb") as f: + f.write(response.content) + playsound("speech.mpeg", True) + os.remove("speech.mpeg") return True else: print("Request failed with status code:", response.status_code) @@ -39,10 +45,11 @@ def brian_speech(text): response = requests.get(tts_url) if response.status_code == 200: - with open("speech.mp3", "wb") as f: - f.write(response.content) - playsound("speech.mp3") - os.remove("speech.mp3") + with mutex_lock: + with open("speech.mp3", "wb") as f: + f.write(response.content) + playsound("speech.mp3") + os.remove("speech.mp3") return True else: print("Request failed with status code:", response.status_code) @@ -51,24 +58,33 @@ def brian_speech(text): def gtts_speech(text): tts = gtts.gTTS(text) - tts.save("speech.mp3") - playsound("speech.mp3") - os.remove("speech.mp3") + with mutex_lock: + tts.save("speech.mp3") + playsound("speech.mp3", True) + os.remove("speech.mp3") def macos_tts_speech(text): os.system(f'say "{text}"') def say_text(text, voice_index=0): - if not cfg.elevenlabs_api_key: - if cfg.use_mac_os_tts == 'True': - macos_tts_speech(text) - elif cfg.use_brian_tts == 'True': - success = brian_speech(text) - if not success: + + def speak(): + if not cfg.elevenlabs_api_key: + if cfg.use_mac_os_tts == 'True': + macos_tts_speech(text) + elif cfg.use_brian_tts == 'True': + success = brian_speech(text) + if not success: + gtts_speech(text) + else: gtts_speech(text) else: - gtts_speech(text) - else: - success = eleven_labs_speech(text, voice_index) - if not success: - gtts_speech(text) \ No newline at end of file + success = eleven_labs_speech(text, voice_index) + if not success: + gtts_speech(text) + + queue_semaphore.release() + + queue_semaphore.acquire(True) + thread = threading.Thread(target=speak) + thread.start() \ No newline at end of file From 570f76bd51a2f01c78788938eadc17348bb92fe3 Mon Sep 17 00:00:00 2001 From: meta-fx Date: Tue, 11 Apr 2023 14:40:05 -0500 Subject: [PATCH 012/160] Removed trailing spaces and fixed CRLF being removed --- scripts/config.py | 4 ++-- scripts/speak.py | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/scripts/config.py b/scripts/config.py index cdf0287c..c4ad3bf4 100644 --- a/scripts/config.py +++ b/scripts/config.py @@ -72,7 +72,7 @@ class Config(metaclass=Singleton): # User agent headers to use when browsing web # Some websites might just completely deny request with an error code if no user agent was found. - self.user_agent_header = {"User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.97 Safari/537.36"} + self.user_agent_header = {"User-Agent":"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.97 Safari/537.36"} self.redis_host = os.getenv("REDIS_HOST", "localhost") self.redis_port = os.getenv("REDIS_PORT", "6379") self.redis_password = os.getenv("REDIS_PASSWORD", "") @@ -134,4 +134,4 @@ class Config(metaclass=Singleton): def set_debug_mode(self, value: bool): """Set the debug mode value.""" - self.debug_mode = value \ No newline at end of file + self.debug_mode = value diff --git a/scripts/speak.py b/scripts/speak.py index bf5c6034..4934ecef 100644 --- a/scripts/speak.py +++ b/scripts/speak.py @@ -67,7 +67,7 @@ def macos_tts_speech(text): os.system(f'say "{text}"') def say_text(text, voice_index=0): - + def speak(): if not cfg.elevenlabs_api_key: if cfg.use_mac_os_tts == 'True': @@ -87,4 +87,4 @@ def say_text(text, voice_index=0): queue_semaphore.acquire(True) thread = threading.Thread(target=speak) - thread.start() \ No newline at end of file + thread.start() From 990297b46323b9ea605b2c61e58c5fb567ad3947 Mon Sep 17 00:00:00 2001 From: Denis Mozhayskiy Date: Wed, 12 Apr 2023 02:18:07 +0300 Subject: [PATCH 013/160] Easy run bat files with requirements check --- run.bat | 8 ++++++++ run_continious.bat | 3 +++ scripts/check_requirements.py | 27 +++++++++++++++++++++++++++ 3 files changed, 38 insertions(+) create mode 100644 run.bat create mode 100644 run_continious.bat create mode 100644 scripts/check_requirements.py diff --git a/run.bat b/run.bat new file mode 100644 index 00000000..081af67c --- /dev/null +++ b/run.bat @@ -0,0 +1,8 @@ +@echo off +python scripts/check_requirements.py requirements.txt +if errorlevel 1 ( + echo Installing missing packages... + pip install -r requirements.txt +) +python scripts/main.py %1 +pause diff --git a/run_continious.bat b/run_continious.bat new file mode 100644 index 00000000..812aa01c --- /dev/null +++ b/run_continious.bat @@ -0,0 +1,3 @@ +@echo off +set argument=--continuous +call run.bat %argument% diff --git a/scripts/check_requirements.py b/scripts/check_requirements.py new file mode 100644 index 00000000..a74ba367 --- /dev/null +++ b/scripts/check_requirements.py @@ -0,0 +1,27 @@ +import pkg_resources +import sys + +def main(): + requirements_file = sys.argv[1] + with open(requirements_file, 'r') as f: + required_packages = [line.strip().split('#')[0].strip() for line in f.readlines()] + + installed_packages = [package.key for package in pkg_resources.working_set] + + missing_packages = [] + for package in required_packages: + if not package: # Skip empty lines + continue + package_name = package.strip().split('==')[0] + if package_name.lower() not in installed_packages: + missing_packages.append(package_name) + + if missing_packages: + print('Missing packages:') + print(', '.join(missing_packages)) + sys.exit(1) + else: + print('All packages are installed.') + +if __name__ == '__main__': + main() From c785352ed2c6f1744bdeac5410ea93199bade937 Mon Sep 17 00:00:00 2001 From: Maiko Bossuyt Date: Wed, 12 Apr 2023 16:23:09 +0200 Subject: [PATCH 014/160] Update main.py clean trailing whitespace --- scripts/main.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/main.py b/scripts/main.py index 15af0c38..3dcedb5f 100644 --- a/scripts/main.py +++ b/scripts/main.py @@ -293,7 +293,7 @@ def parse_arguments(): if args.gpt3only: print_to_console("GPT3.5 Only Mode: ", Fore.GREEN, "ENABLED") cfg.set_smart_llm_model(cfg.fast_llm_model) - + if args.gpt4only: print_to_console("GPT4 Only Mode: ", Fore.GREEN, "ENABLED") cfg.set_fast_llm_model(cfg.smart_llm_model) From c986e8713512aad9f06c074b5e7fdfa31ade2df7 Mon Sep 17 00:00:00 2001 From: Maiko Bossuyt Date: Wed, 12 Apr 2023 16:36:27 +0200 Subject: [PATCH 015/160] Edit config Class to manage browse_website command chunk size and summary size I added two new config parameters: - browse_chunk_max_length: define the max_length of a chunk being sent to the memory and to FAST_LLM_MODEL for summarizing - browse_summary_max_token: define the max_token passed to the model use for summary creation. Changing this can help with complex subject, allowing the agent to be more verbose in its attemps to summarize the chunk and the chunks summary. I've also edited the way the user_agent is handle. --- .env.template | 2 ++ scripts/config.py | 14 +++++++++++++- 2 files changed, 15 insertions(+), 1 deletion(-) diff --git a/.env.template b/.env.template index 6fbc8424..0953fac9 100644 --- a/.env.template +++ b/.env.template @@ -15,3 +15,5 @@ OPENAI_AZURE_DEPLOYMENT_ID=deployment-id-for-azure IMAGE_PROVIDER=dalle HUGGINGFACE_API_TOKEN= USE_MAC_OS_TTS=False +BROWSE_CHUNK_MAX_LENGTH=4000 +BROWSE_SUMMARY_MAX_TOKEN=300 \ No newline at end of file diff --git a/scripts/config.py b/scripts/config.py index a280e6cc..1eeeb72f 100644 --- a/scripts/config.py +++ b/scripts/config.py @@ -41,6 +41,8 @@ class Config(metaclass=Singleton): self.smart_llm_model = os.getenv("SMART_LLM_MODEL", "gpt-4") self.fast_token_limit = int(os.getenv("FAST_TOKEN_LIMIT", 4000)) self.smart_token_limit = int(os.getenv("SMART_TOKEN_LIMIT", 8000)) + self.browse_chunk_max_length = int(os.getenv("BROWSE_CHUNK_MAX_LENGTH", 8000)) + self.browse_summary_max_token = int(os.getenv("BROWSE_SUMMARY_MAX_TOKEN", 300)) self.openai_api_key = os.getenv("OPENAI_API_KEY") self.use_azure = False @@ -71,7 +73,8 @@ class Config(metaclass=Singleton): # User agent headers to use when browsing web # Some websites might just completely deny request with an error code if no user agent was found. - self.user_agent_header = {"User-Agent":"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.97 Safari/537.36"} + self.user_agent = os.getenv("USER_AGENT", "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.97 Safari/537.36") + self.redis_host = os.getenv("REDIS_HOST", "localhost") self.redis_port = os.getenv("REDIS_PORT", "6379") self.redis_password = os.getenv("REDIS_PASSWORD", "") @@ -80,6 +83,7 @@ class Config(metaclass=Singleton): # Note that indexes must be created on db 0 in redis, this is not configurable. self.memory_backend = os.getenv("MEMORY_BACKEND", 'local') + # Initialize the OpenAI API client openai.api_key = self.openai_api_key @@ -107,6 +111,14 @@ class Config(metaclass=Singleton): """Set the smart token limit value.""" self.smart_token_limit = value + def set_browse_chunk_max_length(self, value: int): + """Set the browse_website command chunk max length value.""" + self.browse_chunk_max_length = value + + def set_browse_summary_max_token(self, value: int): + """Set the browse_website command summary max token value.""" + self.browse_summary_max_token = value + def set_openai_api_key(self, value: str): """Set the OpenAI API key value.""" self.openai_api_key = value From b20c0117c5732e73005ee9fc12380078d5ea442c Mon Sep 17 00:00:00 2001 From: Maiko Bossuyt Date: Wed, 12 Apr 2023 16:38:49 +0200 Subject: [PATCH 016/160] Add memory management to browse.py - Change the way User-Agent is handle when calling requests to browse website - Add chunk to memory before and after summary. We do not save the "summary of summaries" as this wasn't performing great and caused noise when the "question" couldn't be answered. - Use the newly added config parameters for max_length and max_token --- scripts/browse.py | 30 ++++++++++++++++++++++++------ 1 file changed, 24 insertions(+), 6 deletions(-) diff --git a/scripts/browse.py b/scripts/browse.py index b0c745ef..5f4aafe6 100644 --- a/scripts/browse.py +++ b/scripts/browse.py @@ -1,9 +1,14 @@ import requests from bs4 import BeautifulSoup +from memory import get_memory from config import Config from llm_utils import create_chat_completion cfg = Config() +memory = get_memory(cfg) + +session = requests.Session() +session.headers.update({'User-Agent': cfg.user_agent}) # Define and check for local file address prefixes def check_local_file_access(url): @@ -21,7 +26,7 @@ def scrape_text(url): return "Error: Access to local files is restricted" try: - response = requests.get(url, headers=cfg.user_agent_header) + response = session.get(url) except requests.exceptions.RequestException as e: return "Error: " + str(e) @@ -60,7 +65,7 @@ def format_hyperlinks(hyperlinks): def scrape_links(url): """Scrape links from a webpage""" - response = requests.get(url, headers=cfg.user_agent_header) + response = session.get(url) # Check if the response contains an HTTP error if response.status_code >= 400: @@ -76,7 +81,7 @@ def scrape_links(url): return format_hyperlinks(hyperlinks) -def split_text(text, max_length=8192): +def split_text(text, max_length=cfg.browse_chunk_max_length): """Split text into chunks of a maximum length""" paragraphs = text.split("\n") current_length = 0 @@ -102,7 +107,7 @@ def create_message(chunk, question): "content": f"\"\"\"{chunk}\"\"\" Using the above text, please answer the following question: \"{question}\" -- if the question cannot be answered using the text, please summarize the text." } -def summarize_text(text, question): +def summarize_text(url, text, question): """Summarize text using the LLM model""" if not text: return "Error: No text to summarize" @@ -114,15 +119,28 @@ def summarize_text(text, question): chunks = list(split_text(text)) for i, chunk in enumerate(chunks): + print(f"Adding chunk {i + 1} / {len(chunks)} to memory") + + memory_to_add = f"Source: {url}\n" \ + f"Raw content part#{i + 1}: {chunk}" + + memory.add(memory_to_add) + print(f"Summarizing chunk {i + 1} / {len(chunks)}") messages = [create_message(chunk, question)] summary = create_chat_completion( model=cfg.fast_llm_model, messages=messages, - max_tokens=300, + max_tokens=cfg.browse_summary_max_token, ) summaries.append(summary) + print(f"Added chunk {i + 1} summary to memory") + + memory_to_add = f"Source: {url}\n" \ + f"Content summary part#{i + 1}: {summary}" + + memory.add(memory_to_add) print(f"Summarized {len(chunks)} chunks.") @@ -132,7 +150,7 @@ def summarize_text(text, question): final_summary = create_chat_completion( model=cfg.fast_llm_model, messages=messages, - max_tokens=300, + max_tokens=cfg.browse_summary_max_token, ) return final_summary From 5bb551db95fe1eb6765c61fa28bf384d8252cdad Mon Sep 17 00:00:00 2001 From: Maiko Bossuyt Date: Wed, 12 Apr 2023 16:42:14 +0200 Subject: [PATCH 017/160] add the url variable in the get_text_summary function to pass it to the memory By sending the url along when calling browse.summarize_text, we can then add it along the chunk in memory. --- scripts/commands.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/commands.py b/scripts/commands.py index 92d46ae1..90d7a6f3 100644 --- a/scripts/commands.py +++ b/scripts/commands.py @@ -183,7 +183,7 @@ def browse_website(url, question): def get_text_summary(url, question): """Return the results of a google search""" text = browse.scrape_text(url) - summary = browse.summarize_text(text, question) + summary = browse.summarize_text(url, text, question) return """ "Result" : """ + summary From a615e570616146ba51336b4160c2eff225479769 Mon Sep 17 00:00:00 2001 From: Maiko Bossuyt Date: Wed, 12 Apr 2023 18:00:17 +0200 Subject: [PATCH 018/160] Revert "Update main.py" This reverts commit c785352ed2c6f1744bdeac5410ea93199bade937. --- scripts/main.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/main.py b/scripts/main.py index 3dcedb5f..15af0c38 100644 --- a/scripts/main.py +++ b/scripts/main.py @@ -293,7 +293,7 @@ def parse_arguments(): if args.gpt3only: print_to_console("GPT3.5 Only Mode: ", Fore.GREEN, "ENABLED") cfg.set_smart_llm_model(cfg.fast_llm_model) - + if args.gpt4only: print_to_console("GPT4 Only Mode: ", Fore.GREEN, "ENABLED") cfg.set_fast_llm_model(cfg.smart_llm_model) From 8baa0769b154f3742cdc75e07404952de02e0669 Mon Sep 17 00:00:00 2001 From: Maiko Bossuyt Date: Wed, 12 Apr 2023 18:03:59 +0200 Subject: [PATCH 019/160] Update config.py --- scripts/config.py | 1 - 1 file changed, 1 deletion(-) diff --git a/scripts/config.py b/scripts/config.py index 1eeeb72f..9c4e4572 100644 --- a/scripts/config.py +++ b/scripts/config.py @@ -83,7 +83,6 @@ class Config(metaclass=Singleton): # Note that indexes must be created on db 0 in redis, this is not configurable. self.memory_backend = os.getenv("MEMORY_BACKEND", 'local') - # Initialize the OpenAI API client openai.api_key = self.openai_api_key From 0dddc94bdac94707062b1863f3c5a72d113432ca Mon Sep 17 00:00:00 2001 From: Maiko Bossuyt Date: Wed, 12 Apr 2023 19:13:04 +0200 Subject: [PATCH 020/160] Add file ingestion methode in file_operations.py Add the following functions to ingest data into memory before Auto-GPT run. - split_file: given a content, split it in chunks of max_length with (or without) a specified overlap - ingest_file: read a file, use split_file to split it in chunks and load each chunk in memory - ingest_directory: ingest all files in a directory in memory --- scripts/file_operations.py | 75 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 75 insertions(+) diff --git a/scripts/file_operations.py b/scripts/file_operations.py index c6066ef9..3493c2bf 100644 --- a/scripts/file_operations.py +++ b/scripts/file_operations.py @@ -1,5 +1,10 @@ import os import os.path +from config import Config +from memory import get_memory + +cfg = Config() +memory = get_memory(cfg) # Set a dedicated folder for file I/O working_directory = "auto_gpt_workspace" @@ -20,6 +25,30 @@ def safe_join(base, *paths): return norm_new_path +def split_file(content, max_length=4000, overlap=0): + """ + Split text into chunks of a specified maximum length with a specified overlap + between chunks. + + :param text: The input text to be split into chunks + :param max_length: The maximum length of each chunk, default is 4000 (about 1k token) + :param overlap: The number of overlapping characters between chunks, default is no overlap + :return: A generator yielding chunks of text + """ + start = 0 + content_length = len(content) + + while start < content_length: + end = start + max_length + chunk = content[start:end] + yield chunk + start += max_length - overlap + if start + max_length - overlap >= content_length: + break + if end + overlap > content_length: + start = content_length - max_length + + def read_file(filename): """Read a file and return the contents""" try: @@ -31,6 +60,52 @@ def read_file(filename): return "Error: " + str(e) +def ingest_file(filename, memory, max_length=4000, overlap=200): + """ + Ingest a file by reading its content, splitting it into chunks with a specified + maximum length and overlap, and adding the chunks to the memory storage. + + :param filename: The name of the file to ingest + :param memory: An object with an add() method to store the chunks in memory + :param max_length: The maximum length of each chunk, default is 4000 + :param overlap: The number of overlapping characters between chunks, default is 200 + """ + try: + print(f"Working with file {filename}") + content = read_file(filename) + content_length = len(content) + print(f"File length: {content_length} characters") + + chunks = list(split_file(content, max_length=max_length, overlap=overlap)) + + num_chunks = len(chunks) + for i, chunk in enumerate(chunks): + print(f"Ingesting chunk {i + 1} / {num_chunks} into memory") + memory_to_add = f"Filename: {filename}\n" \ + f"Content part#{i + 1}/{num_chunks}: {chunk}" + + memory.add(memory_to_add) + + print(f"Done ingesting {num_chunks} chunks from {filename}.") + except Exception as e: + print(f"Error while ingesting file '{filename}': {str(e)}") + + +def ingest_directory(directory, memory): + """ + Ingest all files in a directory by calling the ingest_file function for each file. + + :param directory: The directory containing the files to ingest + :param memory: An object with an add() method to store the chunks in memory + """ + try: + files = search_files(directory) + for file in files: + ingest_file(file, memory) + except Exception as e: + print(f"Error while ingesting directory '{directory}': {str(e)}") + + def write_to_file(filename, text): """Write text to a file""" try: From 7975c184a55a477e884e1920ed87dc67ca4b4261 Mon Sep 17 00:00:00 2001 From: Maiko Bossuyt Date: Wed, 12 Apr 2023 19:46:39 +0200 Subject: [PATCH 021/160] Update .gitignore add new log file to gitignore --- .gitignore | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.gitignore b/.gitignore index aa0dceaa..fc496609 100644 --- a/.gitignore +++ b/.gitignore @@ -18,4 +18,5 @@ log.txt # Coverage reports .coverage coverage.xml -htmlcov/ \ No newline at end of file +htmlcov/ +log-ingestion.txt From c91117616f7b5e16743208b8649ce4335077915b Mon Sep 17 00:00:00 2001 From: Maiko Bossuyt Date: Wed, 12 Apr 2023 19:46:58 +0200 Subject: [PATCH 022/160] Update file_operations.py revert change in import as we don't need them --- scripts/file_operations.py | 5 ----- 1 file changed, 5 deletions(-) diff --git a/scripts/file_operations.py b/scripts/file_operations.py index 3493c2bf..8e807bba 100644 --- a/scripts/file_operations.py +++ b/scripts/file_operations.py @@ -1,10 +1,5 @@ import os import os.path -from config import Config -from memory import get_memory - -cfg = Config() -memory = get_memory(cfg) # Set a dedicated folder for file I/O working_directory = "auto_gpt_workspace" From 8faa6ef949bf7fbbb8bd875a66bfd4fd231ecebc Mon Sep 17 00:00:00 2001 From: Maiko Bossuyt Date: Wed, 12 Apr 2023 19:47:51 +0200 Subject: [PATCH 023/160] Create data_ingestion.py This script is use when we want to seed Auto-GPT memory with one or multiple documents. The document are read, split into chunks and store in the memory. --- scripts/data_ingestion.py | 52 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 52 insertions(+) create mode 100644 scripts/data_ingestion.py diff --git a/scripts/data_ingestion.py b/scripts/data_ingestion.py new file mode 100644 index 00000000..3f6d1322 --- /dev/null +++ b/scripts/data_ingestion.py @@ -0,0 +1,52 @@ +import argparse +import logging +from config import Config +from memory import get_memory +from file_operations import ingest_file, ingest_directory + +cfg = Config() + +def configure_logging(): + logging.basicConfig(filename='log-ingestion.txt', + filemode='a', + format='%(asctime)s,%(msecs)d %(name)s %(levelname)s %(message)s', + datefmt='%H:%M:%S', + level=logging.DEBUG) + return logging.getLogger('AutoGPT-Ingestion') + + +def main(): + logger = configure_logging() + + parser = argparse.ArgumentParser(description="Ingest a file or a directory with multiple files into memory. Make sure to set your .env before running this script.") + group = parser.add_mutually_exclusive_group(required=True) + group.add_argument("--file", type=str, help="The file to ingest.") + group.add_argument("--dir", type=str, help="The directory containing the files to ingest.") + parser.add_argument("--init", action='store_true', help="Init the memory and wipe its content", default=False) + args = parser.parse_args() + + + # Initialize memory + memory = get_memory(cfg, init=args.init) + print('Using memory of type: ' + memory.__class__.__name__) + + if args.file: + try: + ingest_file(args.file, memory) + print(f"File '{args.file}' ingested successfully.") + except Exception as e: + logger.error(f"Error while ingesting file '{args.file}': {str(e)}") + print(f"Error while ingesting file '{args.file}': {str(e)}") + elif args.dir: + try: + ingest_directory(args.dir, memory) + print(f"Directory '{args.dir}' ingested successfully.") + except Exception as e: + logger.error(f"Error while ingesting directory '{args.dir}': {str(e)}") + print(f"Error while ingesting directory '{args.dir}': {str(e)}") + else: + print("Please provide either a file path (--file) or a directory name (--dir) inside the auto_gpt_workspace directory as input.") + + +if __name__ == "__main__": + main() From 4465486ea39b0bc65715e48a1c7861a565b5126f Mon Sep 17 00:00:00 2001 From: Maiko Bossuyt Date: Wed, 12 Apr 2023 20:18:59 +0200 Subject: [PATCH 024/160] Update file_operations.py move the search_file function inside the data_ingestion script --- scripts/file_operations.py | 15 --------------- 1 file changed, 15 deletions(-) diff --git a/scripts/file_operations.py b/scripts/file_operations.py index 8e807bba..e664fcc9 100644 --- a/scripts/file_operations.py +++ b/scripts/file_operations.py @@ -86,21 +86,6 @@ def ingest_file(filename, memory, max_length=4000, overlap=200): print(f"Error while ingesting file '{filename}': {str(e)}") -def ingest_directory(directory, memory): - """ - Ingest all files in a directory by calling the ingest_file function for each file. - - :param directory: The directory containing the files to ingest - :param memory: An object with an add() method to store the chunks in memory - """ - try: - files = search_files(directory) - for file in files: - ingest_file(file, memory) - except Exception as e: - print(f"Error while ingesting directory '{directory}': {str(e)}") - - def write_to_file(filename, text): """Write text to a file""" try: From 280647ff387bc29127b8403c7dd46f2c94d6a0b8 Mon Sep 17 00:00:00 2001 From: Maiko Bossuyt Date: Wed, 12 Apr 2023 20:19:36 +0200 Subject: [PATCH 025/160] Update data_ingestion.py move the search_file function inside the data_ingestion script add memory initialisation argument add overlap argument add chunk max_length argument --- scripts/data_ingestion.py | 26 ++++++++++++++++++++++---- 1 file changed, 22 insertions(+), 4 deletions(-) diff --git a/scripts/data_ingestion.py b/scripts/data_ingestion.py index 3f6d1322..32811166 100644 --- a/scripts/data_ingestion.py +++ b/scripts/data_ingestion.py @@ -2,7 +2,7 @@ import argparse import logging from config import Config from memory import get_memory -from file_operations import ingest_file, ingest_directory +from file_operations import ingest_file, search_files cfg = Config() @@ -15,6 +15,21 @@ def configure_logging(): return logging.getLogger('AutoGPT-Ingestion') +def ingest_directory(directory, memory, args): + """ + Ingest all files in a directory by calling the ingest_file function for each file. + + :param directory: The directory containing the files to ingest + :param memory: An object with an add() method to store the chunks in memory + """ + try: + files = search_files(directory) + for file in files: + ingest_file(file, memory, args.max_length, args.overlap) + except Exception as e: + print(f"Error while ingesting directory '{directory}': {str(e)}") + + def main(): logger = configure_logging() @@ -22,7 +37,10 @@ def main(): group = parser.add_mutually_exclusive_group(required=True) group.add_argument("--file", type=str, help="The file to ingest.") group.add_argument("--dir", type=str, help="The directory containing the files to ingest.") - parser.add_argument("--init", action='store_true', help="Init the memory and wipe its content", default=False) + parser.add_argument("--init", action='store_true', help="Init the memory and wipe its content (default: False)", default=False) + parser.add_argument("--overlap", type=int, help="The overlap size between chunks when ingesting files (default: 200)", default=200) + parser.add_argument("--max_length", type=int, help="The max_length of each chunk when ingesting files (default: 4000)", default=4000) + args = parser.parse_args() @@ -32,14 +50,14 @@ def main(): if args.file: try: - ingest_file(args.file, memory) + ingest_file(args.file, memory, args.max_length, args.overlap) print(f"File '{args.file}' ingested successfully.") except Exception as e: logger.error(f"Error while ingesting file '{args.file}': {str(e)}") print(f"Error while ingesting file '{args.file}': {str(e)}") elif args.dir: try: - ingest_directory(args.dir, memory) + ingest_directory(args.dir, memory, args) print(f"Directory '{args.dir}' ingested successfully.") except Exception as e: logger.error(f"Error while ingesting directory '{args.dir}': {str(e)}") From 65cc4f833f56000ae3928cccc3c9821fece53958 Mon Sep 17 00:00:00 2001 From: Maiko Bossuyt Date: Wed, 12 Apr 2023 20:47:46 +0200 Subject: [PATCH 026/160] Add Memory Pre-Seeding information to readme.md Add the documentation for memory pre-seeding --- README.md | 47 +++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 47 insertions(+) diff --git a/README.md b/README.md index 2900daa9..6262467d 100644 --- a/README.md +++ b/README.md @@ -41,6 +41,7 @@ Your support is greatly appreciated - [🗣️ Speech Mode](#️-speech-mode) - [🔍 Google API Keys Configuration](#-google-api-keys-configuration) - [Setting up environment variables](#setting-up-environment-variables) + - [🧠 Memory pre-seeding](#memory-pre-seeding) - [💀 Continuous Mode ⚠️](#-continuous-mode-️) - [GPT3.5 ONLY Mode](#gpt35-only-mode) - [🖼 Image Generation](#image-generation) @@ -245,6 +246,52 @@ To switch to either, change the `MEMORY_BACKEND` env variable to the value that 1. View memory usage by using the `--debug` flag :) + +## 🧠 Memory pre-seeding + +``` +# python scripts/data_ingestion.py -h +usage: data_ingestion.py [-h] (--file FILE | --dir DIR) [--init] [--overlap OVERLAP] [--max_length MAX_LENGTH] + +Ingest a file or a directory with multiple files into memory. Make sure to set your .env before running this script. + +options: + -h, --help show this help message and exit + --file FILE The file to ingest. + --dir DIR The directory containing the files to ingest. + --init Init the memory and wipe its content (default: False) + --overlap OVERLAP The overlap size between chunks when ingesting files (default: 200) + --max_length MAX_LENGTH The max_length of each chunk when ingesting files (default: 4000 + +# python scripts/data_ingestion.py --dir seed_data --init --overlap 200 --max_length 1000 +``` + +This script located at scripts/data_ingestion.py, allows you to ingest files into memory and pre-seed it before running Auto-GPT. + +Memory pre-seeding is a technique that involves ingesting relevant documents or data into the AI's memory so that it can use this information to generate more informed and accurate responses. + +To pre-seed the memory, the content of each document is split into chunks of a specified maximum length with a specified overlap between chunks, and then each chunk is added to the memory backend set in the .env file. When the AI is prompted to recall information, it can then access those pre-seeded memories to generate more informed and accurate responses. + +This technique is particularly useful when working with large amounts of data or when there is specific information that the AI needs to be able to access quickly. +By pre-seeding the memory, the AI can retrieve and use this information more efficiently, saving time, API call and improving the accuracy of its responses. + +You could for example download the documentation of an API, a Github repository, etc. and ingest it into memory before running Auto-GPT. + +⚠️ If you use Redis as your memory, make sure to run Auto-GPT with the WIPE_REDIS_ON_START set to False in your .env file. + +⚠️For other memory backend, we currently forcefully wipe the memory when starting Auto-GPT. To ingest data with those memory backend, you can call the data_ingestion.py script anytime during an Auto-GPT run. + +Memories will be available to the AI immediately as they are ingested, even if ingested while Auto-GPT is running. + +In the example above, the script initializes the memory, ingests all files within the seed_data directory into memory with an overlap between chunks of 200 and a maximum length of each chunk of 4000. +Note that you can also use the --file argument to ingest a single file into memory and that the script will only ingest files within the auto_gpt_workspace directory. + +You can adjust the max_length and overlap parameters to fine-tune the way the docuents are presented to the AI when it "recall" that memory: + +- Adjusting the overlap value allows the AI to access more contextual information from each chunk when recalling information, but will result in more chunks being created and therefore increase memory backend usage and OpenAI API requests. +- Reducing the max_length value will create more chunks, which can save prompt tokens by allowing for more message history in the context, but will also increase the number of chunks. +- Increasing the max_length value will provide the AI with more contextual information from each chunk, reducing the number of chunks created and saving on OpenAI API requests. However, this may also use more prompt tokens and decrease the overall context available to the AI. + ## 💀 Continuous Mode ⚠️ Run the AI **without** user authorisation, 100% automated. From 2e0b44ae05fce7795f662a81c765eeeeae32a768 Mon Sep 17 00:00:00 2001 From: Maiko Bossuyt Date: Wed, 12 Apr 2023 22:46:49 +0200 Subject: [PATCH 027/160] fix chunk creation the last chunk wasn't correctly created, this commit fix that issue. --- scripts/file_operations.py | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/scripts/file_operations.py b/scripts/file_operations.py index e664fcc9..f2a2b072 100644 --- a/scripts/file_operations.py +++ b/scripts/file_operations.py @@ -38,11 +38,12 @@ def split_file(content, max_length=4000, overlap=0): chunk = content[start:end] yield chunk start += max_length - overlap - if start + max_length - overlap >= content_length: - break - if end + overlap > content_length: + if start + max_length > content_length: start = content_length - max_length - + end = content_length + chunk = content[start:end] + yield chunk + break def read_file(filename): """Read a file and return the contents""" From 4e914e5ec1a4f7d39cba04cc2ebc0ba7f0055423 Mon Sep 17 00:00:00 2001 From: Maiko Bossuyt Date: Wed, 12 Apr 2023 22:51:52 +0200 Subject: [PATCH 028/160] Revert "Update .gitignore" This reverts commit 7975c184a55a477e884e1920ed87dc67ca4b4261. --- .gitignore | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/.gitignore b/.gitignore index fc496609..aa0dceaa 100644 --- a/.gitignore +++ b/.gitignore @@ -18,5 +18,4 @@ log.txt # Coverage reports .coverage coverage.xml -htmlcov/ -log-ingestion.txt +htmlcov/ \ No newline at end of file From 2f1181f9a12bbbbf55b8f2224ecc645d22c5d90d Mon Sep 17 00:00:00 2001 From: Maiko Bossuyt Date: Wed, 12 Apr 2023 22:52:37 +0200 Subject: [PATCH 029/160] Update .gitignore --- .gitignore | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitignore b/.gitignore index cfa3b08b..403417eb 100644 --- a/.gitignore +++ b/.gitignore @@ -14,6 +14,7 @@ ai_settings.yaml .idea/* auto-gpt.json log.txt +log-ingestion.txt # Coverage reports .coverage From 36d455c20e52aa1e09766a01c880f7914c5c24b7 Mon Sep 17 00:00:00 2001 From: Maiko Bossuyt Date: Wed, 12 Apr 2023 23:31:26 +0200 Subject: [PATCH 030/160] split_file() rework rework the split_file function to make it simple and only have one yield while providing an overlap at the start and end of each chunk --- scripts/file_operations.py | 11 ++++------- 1 file changed, 4 insertions(+), 7 deletions(-) diff --git a/scripts/file_operations.py b/scripts/file_operations.py index db4702c5..c12774b9 100644 --- a/scripts/file_operations.py +++ b/scripts/file_operations.py @@ -35,15 +35,12 @@ def split_file(content, max_length=4000, overlap=0): while start < content_length: end = start + max_length - chunk = content[start:end] + if end + overlap < content_length: + chunk = content[start:end+overlap] + else: + chunk = content[start:content_length] yield chunk start += max_length - overlap - if start + max_length > content_length: - start = content_length - max_length - end = content_length - chunk = content[start:end] - yield chunk - break def read_file(filename): """Read a file and return the contents""" From 1c64a9d24508333d92cfdb26d38a90c4bd543dc6 Mon Sep 17 00:00:00 2001 From: Maiko Bossuyt Date: Wed, 12 Apr 2023 23:33:14 +0200 Subject: [PATCH 031/160] Update .env.template --- .env.template | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.env.template b/.env.template index 0aec7b10..f1e66ea5 100644 --- a/.env.template +++ b/.env.template @@ -19,4 +19,4 @@ HUGGINGFACE_API_TOKEN= USE_MAC_OS_TTS=False BROWSE_CHUNK_MAX_LENGTH=4000 BROWSE_SUMMARY_MAX_TOKEN=300 -MEMORY_BACKEND=local \ No newline at end of file +MEMORY_BACKEND=local From 428caa9bef83e93a6f97a1341a03a0f41b71dec0 Mon Sep 17 00:00:00 2001 From: Eesa Hamza Date: Thu, 13 Apr 2023 12:57:57 +0300 Subject: [PATCH 032/160] Added flags, and implemented skip-reprompt --- scripts/config.py | 1 + scripts/main.py | 14 ++++++++++++-- 2 files changed, 13 insertions(+), 2 deletions(-) diff --git a/scripts/config.py b/scripts/config.py index ebf1b08b..fd370a72 100644 --- a/scripts/config.py +++ b/scripts/config.py @@ -37,6 +37,7 @@ class Config(metaclass=Singleton): self.debug_mode = False self.continuous_mode = False self.speak_mode = False + self.skip_reprompt = False self.fast_llm_model = os.getenv("FAST_LLM_MODEL", "gpt-3.5-turbo") self.smart_llm_model = os.getenv("SMART_LLM_MODEL", "gpt-4") diff --git a/scripts/main.py b/scripts/main.py index 81f560b2..f81b09a7 100644 --- a/scripts/main.py +++ b/scripts/main.py @@ -183,7 +183,11 @@ def load_variables(config_file="config.yaml"): def construct_prompt(): """Construct the prompt for the AI to respond to""" config = AIConfig.load() - if config.ai_name: + if cfg.skip_reprompt and config.ai_name: + logger.typewriter_log("Name :", Fore.GREEN, config.ai_name) + logger.typewriter_log("Role :", Fore.GREEN, config.ai_role) + logger.typewriter_log("Goals:", Fore.GREEN, config.ai_goals) + elif config.ai_name: logger.typewriter_log( f"Welcome back! ", Fore.GREEN, @@ -270,12 +274,14 @@ def parse_arguments(): cfg.set_speak_mode(False) parser = argparse.ArgumentParser(description='Process arguments.') - parser.add_argument('--continuous', action='store_true', help='Enable Continuous Mode') + parser.add_argument('--continuous', '-c', action='store_true', help='Enable Continuous Mode') parser.add_argument('--speak', action='store_true', help='Enable Speak Mode') parser.add_argument('--debug', action='store_true', help='Enable Debug Mode') parser.add_argument('--gpt3only', action='store_true', help='Enable GPT3.5 Only Mode') parser.add_argument('--gpt4only', action='store_true', help='Enable GPT4 Only Mode') parser.add_argument('--use-memory', '-m', dest="memory_type", help='Defines which Memory backend to use') + parser.add_argument('--skip-reprompt', '-y', dest='skip_reprompt', action='store_true', help='Skips the re-prompting messages at the beginning of the script') + parser.add_argument('--ai-settings', '-C', dest='ai_settings_file', help="Specifies which ai_settings.yaml file to use, will also automatically skip the re-prompt.") args = parser.parse_args() if args.debug: @@ -315,6 +321,10 @@ def parse_arguments(): else: cfg.memory_backend = chosen + if args.skip_reprompt: + logger.typewriter_log("Skip Re-prompt: ", Fore.GREEN, "ENABLED") + cfg.skip_reprompt = True + # TODO: fill in llm values here check_openai_api_key() From 0f6fba7d65302591f2c77a41483953df43d12d2b Mon Sep 17 00:00:00 2001 From: Eesa Hamza Date: Thu, 13 Apr 2023 14:02:42 +0300 Subject: [PATCH 033/160] Implemented the '--ai-settings' flag --- scripts/config.py | 1 + scripts/main.py | 16 +++++++++++++++- scripts/utils.py | 14 ++++++++++++++ 3 files changed, 30 insertions(+), 1 deletion(-) diff --git a/scripts/config.py b/scripts/config.py index fd370a72..ad968fb2 100644 --- a/scripts/config.py +++ b/scripts/config.py @@ -39,6 +39,7 @@ class Config(metaclass=Singleton): self.speak_mode = False self.skip_reprompt = False + self.ai_settings_file = os.getenv("AI_SETTINGS_FILE", "ai_settings.yaml") self.fast_llm_model = os.getenv("FAST_LLM_MODEL", "gpt-3.5-turbo") self.smart_llm_model = os.getenv("SMART_LLM_MODEL", "gpt-4") self.fast_token_limit = int(os.getenv("FAST_TOKEN_LIMIT", 4000)) diff --git a/scripts/main.py b/scripts/main.py index f81b09a7..07d2bbd2 100644 --- a/scripts/main.py +++ b/scripts/main.py @@ -182,7 +182,7 @@ def load_variables(config_file="config.yaml"): def construct_prompt(): """Construct the prompt for the AI to respond to""" - config = AIConfig.load() + config = AIConfig.load(cfg.ai_settings_file) if cfg.skip_reprompt and config.ai_name: logger.typewriter_log("Name :", Fore.GREEN, config.ai_name) logger.typewriter_log("Role :", Fore.GREEN, config.ai_role) @@ -324,7 +324,21 @@ def parse_arguments(): if args.skip_reprompt: logger.typewriter_log("Skip Re-prompt: ", Fore.GREEN, "ENABLED") cfg.skip_reprompt = True + + if args.ai_settings_file: + file = args.ai_settings_file + # Validate file + (validated, message) = utils.validate_yaml_file(file) + if not validated: + logger.typewriter_log("FAILED FILE VALIDATION", Fore.RED, message) + exit(1) + + logger.typewriter_log("Using AI Settings File:", Fore.GREEN, file) + cfg.ai_settings_file = file + cfg.skip_reprompt = True + + # TODO: fill in llm values here check_openai_api_key() diff --git a/scripts/utils.py b/scripts/utils.py index 5039796f..bca8d4a8 100644 --- a/scripts/utils.py +++ b/scripts/utils.py @@ -1,3 +1,6 @@ +import yaml +from colorama import Fore + def clean_input(prompt: str=''): try: return input(prompt) @@ -6,3 +9,14 @@ def clean_input(prompt: str=''): print("Quitting...") exit(0) + +def validate_yaml_file(file: str): + try: + with open(file) as file: + yaml.load(file, Loader=yaml.FullLoader) + except FileNotFoundError: + return (False, f"The file {Fore.CYAN}`{file}`{Fore.RESET} wasn't found") + except yaml.YAMLError as e: + return (False, f"There was an issue while trying to read with your AI Settings file: {e}") + + return (True, f"Successfully validated {Fore.CYAN}`{file}`{Fore.RESET}!") \ No newline at end of file From a10ffc1dbed88ce74f7ebb1dae0c90fb18bae9f6 Mon Sep 17 00:00:00 2001 From: Eesa Hamza Date: Thu, 13 Apr 2023 14:26:16 +0300 Subject: [PATCH 034/160] Fixed error logging when choosing non-supported memory backend with '--use-memory' --- scripts/main.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/scripts/main.py b/scripts/main.py index 07d2bbd2..59cb565e 100644 --- a/scripts/main.py +++ b/scripts/main.py @@ -316,8 +316,8 @@ def parse_arguments(): supported_memory = get_supported_memory_backends() chosen = args.memory_type if not chosen in supported_memory: - print_to_console("ONLY THE FOLLOWING MEMORY BACKENDS ARE SUPPORTED: ", Fore.RED, f'{supported_memory}') - print_to_console(f"Defaulting to: ", Fore.YELLOW, cfg.memory_backend) + logger.typewriter_log("ONLY THE FOLLOWING MEMORY BACKENDS ARE SUPPORTED: ", Fore.RED, f'{supported_memory}') + logger.typewriter_log(f"Defaulting to: ", Fore.YELLOW, cfg.memory_backend) else: cfg.memory_backend = chosen From ff094c7ecc58fad572dccbc8a376a75045d91733 Mon Sep 17 00:00:00 2001 From: Eesa Hamza Date: Thu, 13 Apr 2023 15:09:24 +0300 Subject: [PATCH 035/160] Resolve Linter Issues --- scripts/main.py | 5 ++--- scripts/utils.py | 4 ++-- 2 files changed, 4 insertions(+), 5 deletions(-) diff --git a/scripts/main.py b/scripts/main.py index 59cb565e..0674db47 100644 --- a/scripts/main.py +++ b/scripts/main.py @@ -327,19 +327,18 @@ def parse_arguments(): if args.ai_settings_file: file = args.ai_settings_file - + # Validate file (validated, message) = utils.validate_yaml_file(file) if not validated: logger.typewriter_log("FAILED FILE VALIDATION", Fore.RED, message) exit(1) - + logger.typewriter_log("Using AI Settings File:", Fore.GREEN, file) cfg.ai_settings_file = file cfg.skip_reprompt = True - # TODO: fill in llm values here check_openai_api_key() parse_arguments() diff --git a/scripts/utils.py b/scripts/utils.py index bca8d4a8..2b51c1fc 100644 --- a/scripts/utils.py +++ b/scripts/utils.py @@ -18,5 +18,5 @@ def validate_yaml_file(file: str): return (False, f"The file {Fore.CYAN}`{file}`{Fore.RESET} wasn't found") except yaml.YAMLError as e: return (False, f"There was an issue while trying to read with your AI Settings file: {e}") - - return (True, f"Successfully validated {Fore.CYAN}`{file}`{Fore.RESET}!") \ No newline at end of file + + return (True, f"Successfully validated {Fore.CYAN}`{file}`{Fore.RESET}!") From 41f17f89043b19e7a5990894996c6dc407d734c0 Mon Sep 17 00:00:00 2001 From: Peter Edwards Date: Thu, 13 Apr 2023 16:02:15 +0200 Subject: [PATCH 036/160] Small README.md clarity update and usage fixup --- README.md | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) diff --git a/README.md b/README.md index 0d12ae23..90706cbf 100644 --- a/README.md +++ b/README.md @@ -59,10 +59,11 @@ Your support is greatly appreciated - [Python 3.8 or later](https://www.tutorialspoint.com/how-to-install-python-in-windows) - [OpenAI API key](https://platform.openai.com/account/api-keys) -- [PINECONE API key](https://www.pinecone.io/) + Optional: +- [PINECONE API key](https://www.pinecone.io/) (If you want Pinecone backed memory) - ElevenLabs Key (If you want the AI to speak) ## 💾 Installation @@ -114,8 +115,8 @@ pip install -r requirements.txt python scripts/main.py ``` -2. After each of AUTO-GPT's actions, type "NEXT COMMAND" to authorise them to continue. -3. To exit the program, type "exit" and press Enter. +2. After each of action, enter 'y' to authorise command, 'y -N' to run N continuous commands, 'n' to exit program, or enter additional feedback for the AI. + ### Logs @@ -217,7 +218,10 @@ Pinecone enables the storage of vast amounts of vector-based memory, allowing fo ### Setting up environment variables -Simply set them in the `.env` file. +In the `.env` file set: +- `PINECONE_API_KEY` +- `PINECONE_ENV` (something like: us-east4-gcp) +- `MEMORY_BACKEND=pinecone` Alternatively, you can set them from the command line (advanced): @@ -226,7 +230,7 @@ For Windows Users: ``` setx PINECONE_API_KEY "YOUR_PINECONE_API_KEY" setx PINECONE_ENV "Your pinecone region" # something like: us-east4-gcp - +setx MEMORY_BACKEND "pinecone" ``` For macOS and Linux users: @@ -234,7 +238,7 @@ For macOS and Linux users: ``` export PINECONE_API_KEY="YOUR_PINECONE_API_KEY" export PINECONE_ENV="Your pinecone region" # something like: us-east4-gcp - +export MEMORY_BACKEND="pinecone" ``` From 47b72df262b894752b7fd0324f42f71ffc70e38c Mon Sep 17 00:00:00 2001 From: Eesa Hamza Date: Fri, 14 Apr 2023 01:20:43 +0300 Subject: [PATCH 037/160] Added 'AI_SETTINGS_FILE' to .env --- .env.template | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.env.template b/.env.template index 474b2727..c5cb54fd 100644 --- a/.env.template +++ b/.env.template @@ -3,6 +3,8 @@ ################################################################################ # EXECUTE_LOCAL_COMMANDS - Allow local command execution (Example: False) EXECUTE_LOCAL_COMMANDS=False +# AI_SETTINGS_FILE - Specifies which AI Settings file to use (defaults to ai_settings.yaml) +AI_SETTINGS_FILE=ai_settings.yaml ################################################################################ ### LLM PROVIDER From 05f6e9673f285ac40cf982a544dfa14750cf6af1 Mon Sep 17 00:00:00 2001 From: Eesa Hamza Date: Fri, 14 Apr 2023 01:23:23 +0300 Subject: [PATCH 038/160] Resolve Linter Issues --- scripts/utils.py | 1 + 1 file changed, 1 insertion(+) diff --git a/scripts/utils.py b/scripts/utils.py index 2b51c1fc..7521df29 100644 --- a/scripts/utils.py +++ b/scripts/utils.py @@ -1,6 +1,7 @@ import yaml from colorama import Fore + def clean_input(prompt: str=''): try: return input(prompt) From 8472bbd4556999cdd62e4930ae3723f18b746ef4 Mon Sep 17 00:00:00 2001 From: Eesa Hamza Date: Fri, 14 Apr 2023 01:34:30 +0300 Subject: [PATCH 039/160] Added 'Command Line Arguments' section to README --- README.md | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/README.md b/README.md index d1121976..8d402e7d 100644 --- a/README.md +++ b/README.md @@ -134,6 +134,14 @@ To output debug logs: ``` python scripts/main.py --debug ``` +### Command Line Arguments +Here are some common arguments you can use when running Auto-GPT: +> Replace anything in angled brackets (<>) to a value you want to specify +* `python scripts/main.py --help` to see a list of all available command line arguments +* `python scripts/main.py --ai-settings ` to run Auto-GPT with a different AI Settings file. +* `python scripts/main.py --use-memory ` to specify one of 3 memory backends: `local`, `redis` or `pinecone` + +> **NOTE**: There are shorthands for some of these flags, for example `-m` for `--use-memory`. Use `python scripts/main.py --help` for more information ## 🗣️ Speech Mode From 25509f9d2541a6c92949984da5548b11903fc98b Mon Sep 17 00:00:00 2001 From: Maiko Bossuyt Date: Fri, 14 Apr 2023 00:48:07 +0200 Subject: [PATCH 040/160] Update config.py 8192 is the current default --- scripts/config.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/config.py b/scripts/config.py index 0150ca42..a856265a 100644 --- a/scripts/config.py +++ b/scripts/config.py @@ -43,7 +43,7 @@ class Config(metaclass=Singleton): self.smart_llm_model = os.getenv("SMART_LLM_MODEL", "gpt-4") self.fast_token_limit = int(os.getenv("FAST_TOKEN_LIMIT", 4000)) self.smart_token_limit = int(os.getenv("SMART_TOKEN_LIMIT", 8000)) - self.browse_chunk_max_length = int(os.getenv("BROWSE_CHUNK_MAX_LENGTH", 8000)) + self.browse_chunk_max_length = int(os.getenv("BROWSE_CHUNK_MAX_LENGTH", 8192)) self.browse_summary_max_token = int(os.getenv("BROWSE_SUMMARY_MAX_TOKEN", 300)) self.openai_api_key = os.getenv("OPENAI_API_KEY") From 6702a04f767702d1e57ddcec81f2481def19f8a7 Mon Sep 17 00:00:00 2001 From: Eesa Hamza Date: Fri, 14 Apr 2023 01:50:13 +0300 Subject: [PATCH 041/160] Add 'no_memory' support for memory flag --- scripts/memory/__init__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/memory/__init__.py b/scripts/memory/__init__.py index a0afc874..9b53d8d2 100644 --- a/scripts/memory/__init__.py +++ b/scripts/memory/__init__.py @@ -3,7 +3,7 @@ from memory.no_memory import NoMemory # List of supported memory backends # Add a backend to this list if the import attempt is successful -supported_memory = ['local'] +supported_memory = ['local', 'no_memory'] try: from memory.redismem import RedisMemory From 4f923ece60baee2c086c29610a05c4f130e43aa9 Mon Sep 17 00:00:00 2001 From: Eesa Hamza Date: Fri, 14 Apr 2023 01:56:45 +0300 Subject: [PATCH 042/160] Added double_check logging to AI Settings validator, and updated README for 'no_memory' --- README.md | 4 ++-- scripts/main.py | 1 + 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 8d402e7d..b55a80c5 100644 --- a/README.md +++ b/README.md @@ -137,9 +137,9 @@ python scripts/main.py --debug ### Command Line Arguments Here are some common arguments you can use when running Auto-GPT: > Replace anything in angled brackets (<>) to a value you want to specify -* `python scripts/main.py --help` to see a list of all available command line arguments +* `python scripts/main.py --help` to see a list of all available command line arguments. * `python scripts/main.py --ai-settings ` to run Auto-GPT with a different AI Settings file. -* `python scripts/main.py --use-memory ` to specify one of 3 memory backends: `local`, `redis` or `pinecone` +* `python scripts/main.py --use-memory ` to specify one of 3 memory backends: `local`, `redis`, `pinecone` or 'no_memory'. > **NOTE**: There are shorthands for some of these flags, for example `-m` for `--use-memory`. Use `python scripts/main.py --help` for more information diff --git a/scripts/main.py b/scripts/main.py index 400eb1f6..78ffe243 100644 --- a/scripts/main.py +++ b/scripts/main.py @@ -348,6 +348,7 @@ def parse_arguments(): (validated, message) = utils.validate_yaml_file(file) if not validated: logger.typewriter_log("FAILED FILE VALIDATION", Fore.RED, message) + logger.double_check() exit(1) logger.typewriter_log("Using AI Settings File:", Fore.GREEN, file) From 2fd96b68bdc9e7ab48b34eeff8d96e32b9eafdcf Mon Sep 17 00:00:00 2001 From: meta-fx Date: Fri, 14 Apr 2023 01:28:47 -0500 Subject: [PATCH 043/160] Added new line and elevenlabs elements back to the env --- .env.template | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/.env.template b/.env.template index aa7b04e9..e22ce4f5 100644 --- a/.env.template +++ b/.env.template @@ -104,4 +104,12 @@ USE_MAC_OS_TTS=False ### STREAMELEMENTS # USE_BRIAN_TTS - Use Brian TTS or not (Default: False) -USE_BRIAN_TTS=False \ No newline at end of file +USE_BRIAN_TTS=False + +### ELEVENLABS +# ELEVENLABS_API_KEY - Eleven Labs API key (Example: my-elevenlabs-api-key) +# ELEVENLABS_VOICE_1_ID - Eleven Labs voice 1 ID (Example: my-voice-id-1) +# ELEVENLABS_VOICE_2_ID - Eleven Labs voice 2 ID (Example: my-voice-id-2) +ELEVENLABS_API_KEY=your-elevenlabs-api-key +ELEVENLABS_VOICE_1_ID=your-voice-id-1 +ELEVENLABS_VOICE_2_ID=your-voice-id-2 From 1612069594402540da4116f9f599b47091b8f041 Mon Sep 17 00:00:00 2001 From: meta-fx Date: Fri, 14 Apr 2023 02:18:17 -0500 Subject: [PATCH 044/160] Fixed E302 expected 2 blank lines, found 1 --- scripts/speak.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/scripts/speak.py b/scripts/speak.py index d71b5bca..3afa591d 100644 --- a/scripts/speak.py +++ b/scripts/speak.py @@ -52,6 +52,7 @@ def eleven_labs_speech(text, voice_index=0): print("Response content:", response.content) return False + def brian_speech(text): """Speak text using Brian with the streamelements API""" tts_url = f"https://api.streamelements.com/kappa/v2/speech?voice=Brian&text={text}" @@ -69,6 +70,7 @@ def brian_speech(text): print("Response content:", response.content) return False + def gtts_speech(text): tts = gtts.gTTS(text) with mutex_lock: From e147788c72535779ed094a101c4739aa1e8bdb8c Mon Sep 17 00:00:00 2001 From: Maiko Bossuyt Date: Fri, 14 Apr 2023 10:33:34 +0200 Subject: [PATCH 045/160] Update .env.template BROWSE_CHUNK_MAX_LENGTH default value --- .env.template | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.env.template b/.env.template index 7ff03cab..733597d9 100644 --- a/.env.template +++ b/.env.template @@ -4,7 +4,7 @@ # EXECUTE_LOCAL_COMMANDS - Allow local command execution (Example: False) EXECUTE_LOCAL_COMMANDS=False # BROWSE_CHUNK_MAX_LENGTH - When browsing website, define the length of chunk stored in memory -BROWSE_CHUNK_MAX_LENGTH=4000 +BROWSE_CHUNK_MAX_LENGTH=8192 # BROWSE_SUMMARY_MAX_TOKEN - Define the maximum length of the summary generated by GPT agent when browsing website BROWSE_SUMMARY_MAX_TOKEN=300 # USER_AGENT - Define the user-agent used by the requests library to browse website (string) From 6403bf112790b34fa122bdd519703e4b110f6875 Mon Sep 17 00:00:00 2001 From: Maiko Bossuyt Date: Fri, 14 Apr 2023 10:35:30 +0200 Subject: [PATCH 046/160] Update data_ingestion.py fixed linting --- scripts/data_ingestion.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/data_ingestion.py b/scripts/data_ingestion.py index 32811166..9addc34b 100644 --- a/scripts/data_ingestion.py +++ b/scripts/data_ingestion.py @@ -6,6 +6,7 @@ from file_operations import ingest_file, search_files cfg = Config() + def configure_logging(): logging.basicConfig(filename='log-ingestion.txt', filemode='a', @@ -43,7 +44,6 @@ def main(): args = parser.parse_args() - # Initialize memory memory = get_memory(cfg, init=args.init) print('Using memory of type: ' + memory.__class__.__name__) From c0462dbe7768d41ac205644987ad0fa9f14a5afc Mon Sep 17 00:00:00 2001 From: Maiko Bossuyt Date: Fri, 14 Apr 2023 10:35:52 +0200 Subject: [PATCH 047/160] Update file_operations.py fixed linting --- scripts/file_operations.py | 1 + 1 file changed, 1 insertion(+) diff --git a/scripts/file_operations.py b/scripts/file_operations.py index ed5aa4ec..1a072561 100644 --- a/scripts/file_operations.py +++ b/scripts/file_operations.py @@ -42,6 +42,7 @@ def split_file(content, max_length=4000, overlap=0): yield chunk start += max_length - overlap + def read_file(filename): """Read a file and return the contents""" try: From 02f23db210b5fb4a4cf93eb26d1e0556f4685315 Mon Sep 17 00:00:00 2001 From: Juro Oravec Date: Fri, 14 Apr 2023 13:00:55 +0200 Subject: [PATCH 048/160] docs: Explain OpenAI billing for API key --- README.md | 13 ++++++++++++- .../openai-api-key-billing-paid-account.png | Bin 0 -> 316093 bytes 2 files changed, 12 insertions(+), 1 deletion(-) create mode 100644 docs/imgs/openai-api-key-billing-paid-account.png diff --git a/README.md b/README.md index 0f2ffc75..40e75487 100644 --- a/README.md +++ b/README.md @@ -105,7 +105,7 @@ pip install -r requirements.txt ``` 5. Rename `.env.template` to `.env` and fill in your `OPENAI_API_KEY`. If you plan to use Speech Mode, fill in your `ELEVEN_LABS_API_KEY` as well. - - Obtain your OpenAI API key from: https://platform.openai.com/account/api-keys. + - See [OpenAI API Keys Configuration](#openai-api-keys-configuration) to obtain your OpenAI API key. - Obtain your ElevenLabs API key from: https://elevenlabs.io. You can view your xi-api-key using the "Profile" tab on the website. - If you want to use GPT on an Azure instance, set `USE_AZURE` to `True` and then: - Rename `azure.yaml.template` to `azure.yaml` and provide the relevant `azure_api_base`, `azure_api_version` and all of the deployment ids for the relevant models in the `azure_model_map` section: @@ -145,6 +145,17 @@ Use this to use TTS for Auto-GPT python scripts/main.py --speak ``` +## OpenAI API Keys Configuration + +Obtain your OpenAI API key from: https://platform.openai.com/account/api-keys. + +To use OpenAI API key for Auto-GPT, you NEED to have billing set up (AKA paid account). + +You can set up paid account at https://platform.openai.com/account/billing/overview. + +![For OpenAI API key to work, set up paid account at OpenAI API > Billing](./docs/imgs/openai-api-key-billing-paid-account.png) + + ## 🔍 Google API Keys Configuration This section is optional, use the official google api if you are having issues with error 429 when running a google search. diff --git a/docs/imgs/openai-api-key-billing-paid-account.png b/docs/imgs/openai-api-key-billing-paid-account.png new file mode 100644 index 0000000000000000000000000000000000000000..8948505a06313004302fe525d3629ffa9b857bdf GIT binary patch literal 316093 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