Repository files navigation

L♾️pGPT

A Modular Auto-GPT Framework

L♾️pGPT is a re-implementation of the popular Auto-GPT project as a proper python package, written with modularity and extensibility in mind.

🚀 Features 🚀

  • "Plug N Play" API - Extensible and modular "Pythonic" framework, not just a command line tool. Easy to add new features, integrations and custom agent capabilities, all from python code, no nasty config files!
  • GPT 3.5 friendly - Better results than Auto-GPT for those who don't have GPT-4 access yet!
  • Minimal prompt overhead - Every token counts. We are continuously working on getting the best results with the least possible number of tokens.
  • Human in the Loop - Ability to "course correct" agents who go astray via human feedback.
  • Full state serialization - Pick up where you left off; L♾️pGPT can save the complete state of an agent, including memory and the states of its tools to a file or python object. No external databases or vector stores required (but they are still supported)!

🧑‍💻 Installation

Install from PyPI

📗 This installs the latest stable version of L♾️pGPT. This is recommended for most users:

pip install loopgpt

📕 The below two methods install the latest development version of L♾️pGPT. Note that this version maybe unstable:

Install from source

pip install git+https://www.github.com/farizrahman4u/loopgpt.git@main

Install from source (dev)

git clone https://www.github.com/farizrahman4u/loopgpt.git
cd loopgpt
pip install -e .

Install from source (dev) using Docker

git clone https://www.github.com/farizrahman4u/loopgpt.git
cd loopgpt
docker build -t loopgpt:local-dev .

🏎️ Getting Started

Setup your OpenAI API Key 🔑

Option 1️⃣: Via a .env file

Create a .env file in your current working directory (wherever you are going to run L♾️pGPT from) and add the following line to it:

OPENAI_API_KEY="<your-openai-api-key>"

🛑 IMPORTANT 🛑

Windows users, please make sure "show file extensions" is enabled in your file explorer. Otherwise, your file will be named .env.txt instead of .env.

Option 2️⃣: Via environment variables

Set an environment variable called OPENAI_API_KEY to your OpenAI API Key.

How to set environment variables:

Create a new L♾️pGPT Agent🕵️:

Let's create an agent in a new Python script.

fromloopgpt.agentimportAgentagent=Agent()

L♾️pGPT uses gpt-3.5-turbo by default and all outputs shown here are made using it. GPT-4 users can set model="gpt-4" instead:

agent=Agent(model="gpt-4")

Setup the Agent🕵️'s attributes:

agent.name="ResearchGPT"agent.description="an AI assistant that researches and finds the best tech products"agent.goals= [
"Search for the best headphones on Google",
"Analyze specs, prices and reviews to find the top 5 best headphones",
"Write the list of the top 5 best headphones and their prices to a file",
"Summarize the pros and cons of each headphone and write it to a different file called 'summary.txt'",
]

And we're off! Let's run the Agent🕵️'s CLI:

agent.cli()

Save your Python file as research_gpt.py and run it:

python research_gpt.py

You can exit the CLI by typing "exit".

🔁 Continuous Mode 🔁

If continuous is set to True, the agent will not ask for the user's permission to execute commands. It may go into infinite loops, so use it at your own risk!

agent.cli(continuous=True)

💻 Command Line Only Mode

You can run L♾️pGPT directly from the command line without having to write any python code as well:

loopgpt run

Run loopgpt --help to see all the available options.

🐋 Docker Mode

You can run L♾️pGPT in the previously mentioned modes, using Docker:

# CLI mode
docker run -i --rm loopgpt:local-dev loopgpt run
# Script mode example
docker run -i --rm -v "$(pwd)/scripts:/scripts" loopgpt:local-dev python /scripts/myscript.py

⚒️ Adding custom tools ⚒️

L♾️pGPT agents come with a set of builtin tools which allows them to perform various basic tasks such as searching the web, filesystem operations, etc. You can view these tools with print(agent.tools).

In addition to these builtin tools, you can also add your own tools to the agent's toolbox.

Example: WeatherGPT 🌦️

Let's create WeatherGPT, an AI assistant for all things weather.

A tool inherits from BaseTool and you only need to override 3 methods to get your tool up and running!

  • args: A dictionary describing the tool's arguments and their descriptions.
  • resp: A dictionary describing the tool's response and their descriptions.
  • run: The tool's main logic. It takes the tool's arguments as input and returns the tool's response.
fromloopgpt.toolsimportBaseToolclassGetWeather(BaseTool):
@propertydefargs(self):
return {"city": "name of the city"}
@propertydefresp(self):
return {"report": "The weather report for the city"}
defrun(self, city):
...

L♾️pGPT gives a default ID and description to your tool but you can override them if you'd like:

classGetWeather(BaseTool):
...
@propertydefid(self):
return"get_weather_command"@propertydefdesc(self):
"""A description is recommended so that the agent knows more about what the tool does"""return"Quickly get the weather for a given city"

Now let's define what our tool will do in its run method:

importrequests# Define your custom toolclassGetWeather(BaseTool):
...
defrun(self, city):
try:
url="https://wttr.in/{}?format=%l+%C+%h+%t+%w+%p+%P".format(city)
data=requests.get(url).text.split(" ")
keys= ("location", "condition", "humidity", "temperature", "wind", "precipitation", "pressure")
data= {"report": dict(zip(keys, data))}
returndataexceptExceptionase:
return {"report": f"An error occurred while getting the weather: {e}."}

That's it! You've built your first custom tool. Let's register it with a new agent and run it:

importloopgpt# Create Agentagent=loopgpt.Agent()
agent.name="WeatherGPT"agent.description="an AI assistant that tells you the weather"agent.goals= [
"Get the weather for NewYork and Beijing",
"Give the user tips on how to dress for the weather in NewYork and Beijing",
"Write the tips to a file called 'dressing_tips.txt'"
]
# Register custom tool type# This is actually not required here, but is required when you load a saved agent with custom tools.loopgpt.tools.register_tool_type(GetWeather)
# Register Toolweather_tool=GetWeather()
agent.tools[weather_tool.id] =weather_tool# Run the agent's CLIagent.cli()

Let's take a look at the dressing_tips.txt file that WeatherGPT wrote for us:

dressing_tips.txt

- It's Clear outside with a temperature of +10°C in Beijing. Wearing a light jacket and pants is recommended.
- It's Overcast outside with a temperature of +11°C in New York. Wearing a light jacket, pants, and an umbrella is recommended.

🚢 Course Correction

Unlike Auto-GPT, the agent does not terminate when the user denies the execution of a command. Instead it asks the user for feedback to correct its course.

To correct the agent's course, just deny execution and provide feedback:

The agent has updated its course of action:

💾 Saving and Loading Agent State 💾

You can save an agent's state to a json file with:

agent.save("ResearchGPT.json")

This saves the agent's configuration (model, name, description etc) as well as its internal state (conversation state, memory, tool states etc). You can also save just the confifguration by passing include_state=False to agent.save():

agent.save("ResearchGPT.json", include_state=False)

Then pick up where you left off with:

importloopgptagent=loopgpt.Agent.load("ResearchGPT.json")
agent.cli()

or by running the saved agent from the command line:

loopgpt run ResearchGPT.json

You can convert the agent state to a json compatible python dictionary instead of writing to a file:

agent_config=agent.config()

To get just the configuration without the internal state:

agent_config=agent.config(include_state=False)

To reload the agent from the config, use:

importloopgptagent=loopgpt.Agent.from_config(agent_config)

📋 Requirements

Optional Requirements

For official google search support you will need to setup two environment variable keys GOOGLE_API_KEY and CUSTOM_SEARCH_ENGINE_ID, here is how to get them:

  1. Create an application on the Google Developers Console.
  2. Create your custom search engine using Google Custom Search.
  3. Once your custom search engine is created, select it and get into the details page of the search engine.
    • On the "Basic" section, you will find the "Search engine ID" field, that value is what you will use for the CUSTOM_SEARCH_ENGINE_ID environment variable.
    • Now go to the "Programmatic Access" section at the bottom of the page.
      • Create a "Custom Search JSON API"
      • Follow the dialog by selecting the application you created on step #1 and when you get your API key use it to populate the GOOGLE_API_KEY environment variable.

ℹ️ In case these are absent, L♾️pGPT will fall back to using DuckDuckGo Search.

💌 Contribute

We need A LOT of Help! Please open an issue or a PR if you'd like to contribute.

🌳 Community

Need help? Join our Discord.

⭐ Star History 📈

Star History Chart

About

Modular Auto-GPT Framework

Resources

Contributing

Security policy

Stars

1 star

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

Repository files navigation

L♾️pGPT

A Modular Auto-GPT Framework

L♾️pGPT is a re-implementation of the popular Auto-GPT project as a proper python package, written with modularity and extensibility in mind.

🚀 Features 🚀

  • "Plug N Play" API - Extensible and modular "Pythonic" framework, not just a command line tool. Easy to add new features, integrations and custom agent capabilities, all from python code, no nasty config files!
  • GPT 3.5 friendly - Better results than Auto-GPT for those who don't have GPT-4 access yet!
  • Minimal prompt overhead - Every token counts. We are continuously working on getting the best results with the least possible number of tokens.
  • Human in the Loop - Ability to "course correct" agents who go astray via human feedback.
  • Full state serialization - Pick up where you left off; L♾️pGPT can save the complete state of an agent, including memory and the states of its tools to a file or python object. No external databases or vector stores required (but they are still supported)!

🧑‍💻 Installation

Install from PyPI

📗 This installs the latest stable version of L♾️pGPT. This is recommended for most users:

pip install loopgpt

📕 The below two methods install the latest development version of L♾️pGPT. Note that this version maybe unstable:

Install from source

pip install git+https://www.github.com/farizrahman4u/loopgpt.git@main

Install from source (dev)

git clone https://www.github.com/farizrahman4u/loopgpt.git
cd loopgpt
pip install -e .

Install from source (dev) using Docker

git clone https://www.github.com/farizrahman4u/loopgpt.git
cd loopgpt
docker build -t loopgpt:local-dev .

🏎️ Getting Started

Setup your OpenAI API Key 🔑

Option 1️⃣: Via a .env file

Create a .env file in your current working directory (wherever you are going to run L♾️pGPT from) and add the following line to it:

OPENAI_API_KEY="<your-openai-api-key>"

🛑 IMPORTANT 🛑

Windows users, please make sure "show file extensions" is enabled in your file explorer. Otherwise, your file will be named .env.txt instead of .env.

Option 2️⃣: Via environment variables

Set an environment variable called OPENAI_API_KEY to your OpenAI API Key.

How to set environment variables:

Create a new L♾️pGPT Agent🕵️:

Let's create an agent in a new Python script.

fromloopgpt.agentimportAgentagent=Agent()

L♾️pGPT uses gpt-3.5-turbo by default and all outputs shown here are made using it. GPT-4 users can set model="gpt-4" instead:

agent=Agent(model="gpt-4")

Setup the Agent🕵️'s attributes:

agent.name="ResearchGPT"agent.description="an AI assistant that researches and finds the best tech products"agent.goals= [
"Search for the best headphones on Google",
"Analyze specs, prices and reviews to find the top 5 best headphones",
"Write the list of the top 5 best headphones and their prices to a file",
"Summarize the pros and cons of each headphone and write it to a different file called 'summary.txt'",
]

And we're off! Let's run the Agent🕵️'s CLI:

agent.cli()

Save your Python file as research_gpt.py and run it:

python research_gpt.py

You can exit the CLI by typing "exit".

🔁 Continuous Mode 🔁

If continuous is set to True, the agent will not ask for the user's permission to execute commands. It may go into infinite loops, so use it at your own risk!

agent.cli(continuous=True)

💻 Command Line Only Mode

You can run L♾️pGPT directly from the command line without having to write any python code as well:

loopgpt run

Run loopgpt --help to see all the available options.

🐋 Docker Mode

You can run L♾️pGPT in the previously mentioned modes, using Docker:

# CLI mode
docker run -i --rm loopgpt:local-dev loopgpt run
# Script mode example
docker run -i --rm -v "$(pwd)/scripts:/scripts" loopgpt:local-dev python /scripts/myscript.py

⚒️ Adding custom tools ⚒️

L♾️pGPT agents come with a set of builtin tools which allows them to perform various basic tasks such as searching the web, filesystem operations, etc. You can view these tools with print(agent.tools).

In addition to these builtin tools, you can also add your own tools to the agent's toolbox.

Example: WeatherGPT 🌦️

Let's create WeatherGPT, an AI assistant for all things weather.

A tool inherits from BaseTool and you only need to override 3 methods to get your tool up and running!

  • args: A dictionary describing the tool's arguments and their descriptions.
  • resp: A dictionary describing the tool's response and their descriptions.
  • run: The tool's main logic. It takes the tool's arguments as input and returns the tool's response.
fromloopgpt.toolsimportBaseToolclassGetWeather(BaseTool):
@propertydefargs(self):
return {"city": "name of the city"}
@propertydefresp(self):
return {"report": "The weather report for the city"}
defrun(self, city):
...

L♾️pGPT gives a default ID and description to your tool but you can override them if you'd like:

classGetWeather(BaseTool):
...
@propertydefid(self):
return"get_weather_command"@propertydefdesc(self):
"""A description is recommended so that the agent knows more about what the tool does"""return"Quickly get the weather for a given city"

Now let's define what our tool will do in its run method:

importrequests# Define your custom toolclassGetWeather(BaseTool):
...
defrun(self, city):
try:
url="https://wttr.in/{}?format=%l+%C+%h+%t+%w+%p+%P".format(city)
data=requests.get(url).text.split(" ")
keys= ("location", "condition", "humidity", "temperature", "wind", "precipitation", "pressure")
data= {"report": dict(zip(keys, data))}
returndataexceptExceptionase:
return {"report": f"An error occurred while getting the weather: {e}."}

That's it! You've built your first custom tool. Let's register it with a new agent and run it:

importloopgpt# Create Agentagent=loopgpt.Agent()
agent.name="WeatherGPT"agent.description="an AI assistant that tells you the weather"agent.goals= [
"Get the weather for NewYork and Beijing",
"Give the user tips on how to dress for the weather in NewYork and Beijing",
"Write the tips to a file called 'dressing_tips.txt'"
]
# Register custom tool type# This is actually not required here, but is required when you load a saved agent with custom tools.loopgpt.tools.register_tool_type(GetWeather)
# Register Toolweather_tool=GetWeather()
agent.tools[weather_tool.id] =weather_tool# Run the agent's CLIagent.cli()

Let's take a look at the dressing_tips.txt file that WeatherGPT wrote for us:

dressing_tips.txt

- It's Clear outside with a temperature of +10°C in Beijing. Wearing a light jacket and pants is recommended.
- It's Overcast outside with a temperature of +11°C in New York. Wearing a light jacket, pants, and an umbrella is recommended.

🚢 Course Correction

Unlike Auto-GPT, the agent does not terminate when the user denies the execution of a command. Instead it asks the user for feedback to correct its course.

To correct the agent's course, just deny execution and provide feedback:

The agent has updated its course of action:

💾 Saving and Loading Agent State 💾

You can save an agent's state to a json file with:

agent.save("ResearchGPT.json")

This saves the agent's configuration (model, name, description etc) as well as its internal state (conversation state, memory, tool states etc). You can also save just the confifguration by passing include_state=False to agent.save():

agent.save("ResearchGPT.json", include_state=False)

Then pick up where you left off with:

importloopgptagent=loopgpt.Agent.load("ResearchGPT.json")
agent.cli()

or by running the saved agent from the command line:

loopgpt run ResearchGPT.json

You can convert the agent state to a json compatible python dictionary instead of writing to a file:

agent_config=agent.config()

To get just the configuration without the internal state:

agent_config=agent.config(include_state=False)

To reload the agent from the config, use:

importloopgptagent=loopgpt.Agent.from_config(agent_config)

📋 Requirements

Optional Requirements

For official google search support you will need to setup two environment variable keys GOOGLE_API_KEY and CUSTOM_SEARCH_ENGINE_ID, here is how to get them:

  1. Create an application on the Google Developers Console.
  2. Create your custom search engine using Google Custom Search.
  3. Once your custom search engine is created, select it and get into the details page of the search engine.
    • On the "Basic" section, you will find the "Search engine ID" field, that value is what you will use for the CUSTOM_SEARCH_ENGINE_ID environment variable.
    • Now go to the "Programmatic Access" section at the bottom of the page.
      • Create a "Custom Search JSON API"
      • Follow the dialog by selecting the application you created on step #1 and when you get your API key use it to populate the GOOGLE_API_KEY environment variable.

ℹ️ In case these are absent, L♾️pGPT will fall back to using DuckDuckGo Search.

💌 Contribute

We need A LOT of Help! Please open an issue or a PR if you'd like to contribute.

🌳 Community

Need help? Join our Discord.

⭐ Star History 📈

Star History Chart

About

Modular Auto-GPT Framework

Resources

Contributing

Security policy

Stars

1 star

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

L♾️pGPT

A Modular Auto-GPT Framework

L♾️pGPT is a re-implementation of the popular Auto-GPT project as a proper python package, written with modularity and extensibility in mind.

🚀 Features 🚀

  • "Plug N Play" API - Extensible and modular "Pythonic" framework, not just a command line tool. Easy to add new features, integrations and custom agent capabilities, all from python code, no nasty config files!
  • GPT 3.5 friendly - Better results than Auto-GPT for those who don't have GPT-4 access yet!
  • Minimal prompt overhead - Every token counts. We are continuously working on getting the best results with the least possible number of tokens.
  • Human in the Loop - Ability to "course correct" agents who go astray via human feedback.
  • Full state serialization - Pick up where you left off; L♾️pGPT can save the complete state of an agent, including memory and the states of its tools to a file or python object. No external databases or vector stores required (but they are still supported)!

🧑‍💻 Installation

Install from PyPI

📗 This installs the latest stable version of L♾️pGPT. This is recommended for most users:

pip install loopgpt

📕 The below two methods install the latest development version of L♾️pGPT. Note that this version maybe unstable:

Install from source

pip install git+https://www.github.com/farizrahman4u/loopgpt.git@main

Install from source (dev)

git clone https://www.github.com/farizrahman4u/loopgpt.git
cd loopgpt
pip install -e .

Install from source (dev) using Docker

git clone https://www.github.com/farizrahman4u/loopgpt.git
cd loopgpt
docker build -t loopgpt:local-dev .

🏎️ Getting Started

Setup your OpenAI API Key 🔑

Option 1️⃣: Via a .env file

Create a .env file in your current working directory (wherever you are going to run L♾️pGPT from) and add the following line to it:

OPENAI_API_KEY="<your-openai-api-key>"

🛑 IMPORTANT 🛑

Windows users, please make sure "show file extensions" is enabled in your file explorer. Otherwise, your file will be named .env.txt instead of .env.

Option 2️⃣: Via environment variables

Set an environment variable called OPENAI_API_KEY to your OpenAI API Key.

How to set environment variables:

Create a new L♾️pGPT Agent🕵️:

Let's create an agent in a new Python script.

fromloopgpt.agentimportAgentagent=Agent()

L♾️pGPT uses gpt-3.5-turbo by default and all outputs shown here are made using it. GPT-4 users can set model="gpt-4" instead:

agent=Agent(model="gpt-4")

Setup the Agent🕵️'s attributes:

agent.name="ResearchGPT"agent.description="an AI assistant that researches and finds the best tech products"agent.goals= [
"Search for the best headphones on Google",
"Analyze specs, prices and reviews to find the top 5 best headphones",
"Write the list of the top 5 best headphones and their prices to a file",
"Summarize the pros and cons of each headphone and write it to a different file called 'summary.txt'",
]

And we're off! Let's run the Agent🕵️'s CLI:

agent.cli()

Save your Python file as research_gpt.py and run it:

python research_gpt.py

You can exit the CLI by typing "exit".

🔁 Continuous Mode 🔁

If continuous is set to True, the agent will not ask for the user's permission to execute commands. It may go into infinite loops, so use it at your own risk!

agent.cli(continuous=True)

💻 Command Line Only Mode

You can run L♾️pGPT directly from the command line without having to write any python code as well:

loopgpt run

Run loopgpt --help to see all the available options.

🐋 Docker Mode

You can run L♾️pGPT in the previously mentioned modes, using Docker:

# CLI mode
docker run -i --rm loopgpt:local-dev loopgpt run
# Script mode example
docker run -i --rm -v "$(pwd)/scripts:/scripts" loopgpt:local-dev python /scripts/myscript.py

⚒️ Adding custom tools ⚒️

L♾️pGPT agents come with a set of builtin tools which allows them to perform various basic tasks such as searching the web, filesystem operations, etc. You can view these tools with print(agent.tools).

In addition to these builtin tools, you can also add your own tools to the agent's toolbox.

Example: WeatherGPT 🌦️

Let's create WeatherGPT, an AI assistant for all things weather.

A tool inherits from BaseTool and you only need to override 3 methods to get your tool up and running!

  • args: A dictionary describing the tool's arguments and their descriptions.
  • resp: A dictionary describing the tool's response and their descriptions.
  • run: The tool's main logic. It takes the tool's arguments as input and returns the tool's response.
fromloopgpt.toolsimportBaseToolclassGetWeather(BaseTool):
@propertydefargs(self):
return {"city": "name of the city"}
@propertydefresp(self):
return {"report": "The weather report for the city"}
defrun(self, city):
...

L♾️pGPT gives a default ID and description to your tool but you can override them if you'd like:

classGetWeather(BaseTool):
...
@propertydefid(self):
return"get_weather_command"@propertydefdesc(self):
"""A description is recommended so that the agent knows more about what the tool does"""return"Quickly get the weather for a given city"

Now let's define what our tool will do in its run method:

importrequests# Define your custom toolclassGetWeather(BaseTool):
...
defrun(self, city):
try:
url="https://wttr.in/{}?format=%l+%C+%h+%t+%w+%p+%P".format(city)
data=requests.get(url).text.split(" ")
keys= ("location", "condition", "humidity", "temperature", "wind", "precipitation", "pressure")
data= {"report": dict(zip(keys, data))}
returndataexceptExceptionase:
return {"report": f"An error occurred while getting the weather: {e}."}

That's it! You've built your first custom tool. Let's register it with a new agent and run it:

importloopgpt# Create Agentagent=loopgpt.Agent()
agent.name="WeatherGPT"agent.description="an AI assistant that tells you the weather"agent.goals= [
"Get the weather for NewYork and Beijing",
"Give the user tips on how to dress for the weather in NewYork and Beijing",
"Write the tips to a file called 'dressing_tips.txt'"
]
# Register custom tool type# This is actually not required here, but is required when you load a saved agent with custom tools.loopgpt.tools.register_tool_type(GetWeather)
# Register Toolweather_tool=GetWeather()
agent.tools[weather_tool.id] =weather_tool# Run the agent's CLIagent.cli()

Let's take a look at the dressing_tips.txt file that WeatherGPT wrote for us:

dressing_tips.txt

- It's Clear outside with a temperature of +10°C in Beijing. Wearing a light jacket and pants is recommended.
- It's Overcast outside with a temperature of +11°C in New York. Wearing a light jacket, pants, and an umbrella is recommended.

🚢 Course Correction

Unlike Auto-GPT, the agent does not terminate when the user denies the execution of a command. Instead it asks the user for feedback to correct its course.

To correct the agent's course, just deny execution and provide feedback:

The agent has updated its course of action:

💾 Saving and Loading Agent State 💾

You can save an agent's state to a json file with:

agent.save("ResearchGPT.json")

This saves the agent's configuration (model, name, description etc) as well as its internal state (conversation state, memory, tool states etc). You can also save just the confifguration by passing include_state=False to agent.save():

agent.save("ResearchGPT.json", include_state=False)

Then pick up where you left off with:

importloopgptagent=loopgpt.Agent.load("ResearchGPT.json")
agent.cli()

or by running the saved agent from the command line:

loopgpt run ResearchGPT.json

You can convert the agent state to a json compatible python dictionary instead of writing to a file:

agent_config=agent.config()

To get just the configuration without the internal state:

agent_config=agent.config(include_state=False)

To reload the agent from the config, use:

importloopgptagent=loopgpt.Agent.from_config(agent_config)

📋 Requirements

Optional Requirements

For official google search support you will need to setup two environment variable keys GOOGLE_API_KEY and CUSTOM_SEARCH_ENGINE_ID, here is how to get them:

  1. Create an application on the Google Developers Console.
  2. Create your custom search engine using Google Custom Search.
  3. Once your custom search engine is created, select it and get into the details page of the search engine.
    • On the "Basic" section, you will find the "Search engine ID" field, that value is what you will use for the CUSTOM_SEARCH_ENGINE_ID environment variable.
    • Now go to the "Programmatic Access" section at the bottom of the page.
      • Create a "Custom Search JSON API"
      • Follow the dialog by selecting the application you created on step #1 and when you get your API key use it to populate the GOOGLE_API_KEY environment variable.

ℹ️ In case these are absent, L♾️pGPT will fall back to using DuckDuckGo Search.

💌 Contribute

We need A LOT of Help! Please open an issue or a PR if you'd like to contribute.

🌳 Community

Need help? Join our Discord.

⭐ Star History 📈

Star History Chart

About

Modular Auto-GPT Framework

Resources

Contributing

Security policy

Stars

1 star

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

L♾️pGPT

A Modular Auto-GPT Framework

L♾️pGPT is a re-implementation of the popular Auto-GPT project as a proper python package, written with modularity and extensibility in mind.

🚀 Features 🚀

  • "Plug N Play" API - Extensible and modular "Pythonic" framework, not just a command line tool. Easy to add new features, integrations and custom agent capabilities, all from python code, no nasty config files!
  • GPT 3.5 friendly - Better results than Auto-GPT for those who don't have GPT-4 access yet!
  • Minimal prompt overhead - Every token counts. We are continuously working on getting the best results with the least possible number of tokens.
  • Human in the Loop - Ability to "course correct" agents who go astray via human feedback.
  • Full state serialization - Pick up where you left off; L♾️pGPT can save the complete state of an agent, including memory and the states of its tools to a file or python object. No external databases or vector stores required (but they are still supported)!

🧑‍💻 Installation

Install from PyPI

📗 This installs the latest stable version of L♾️pGPT. This is recommended for most users:

pip install loopgpt

📕 The below two methods install the latest development version of L♾️pGPT. Note that this version maybe unstable:

Install from source

pip install git+https://www.github.com/farizrahman4u/loopgpt.git@main

Install from source (dev)

git clone https://www.github.com/farizrahman4u/loopgpt.git
cd loopgpt
pip install -e .

Install from source (dev) using Docker

git clone https://www.github.com/farizrahman4u/loopgpt.git
cd loopgpt
docker build -t loopgpt:local-dev .

🏎️ Getting Started

Setup your OpenAI API Key 🔑

Option 1️⃣: Via a .env file

Create a .env file in your current working directory (wherever you are going to run L♾️pGPT from) and add the following line to it:

OPENAI_API_KEY="<your-openai-api-key>"

🛑 IMPORTANT 🛑

Windows users, please make sure "show file extensions" is enabled in your file explorer. Otherwise, your file will be named .env.txt instead of .env.

Option 2️⃣: Via environment variables

Set an environment variable called OPENAI_API_KEY to your OpenAI API Key.

How to set environment variables:

Create a new L♾️pGPT Agent🕵️:

Let's create an agent in a new Python script.

fromloopgpt.agentimportAgentagent=Agent()

L♾️pGPT uses gpt-3.5-turbo by default and all outputs shown here are made using it. GPT-4 users can set model="gpt-4" instead:

agent=Agent(model="gpt-4")

Setup the Agent🕵️'s attributes:

agent.name="ResearchGPT"agent.description="an AI assistant that researches and finds the best tech products"agent.goals= [
"Search for the best headphones on Google",
"Analyze specs, prices and reviews to find the top 5 best headphones",
"Write the list of the top 5 best headphones and their prices to a file",
"Summarize the pros and cons of each headphone and write it to a different file called 'summary.txt'",
]

And we're off! Let's run the Agent🕵️'s CLI:

agent.cli()

Save your Python file as research_gpt.py and run it:

python research_gpt.py

You can exit the CLI by typing "exit".

🔁 Continuous Mode 🔁

If continuous is set to True, the agent will not ask for the user's permission to execute commands. It may go into infinite loops, so use it at your own risk!

agent.cli(continuous=True)

💻 Command Line Only Mode

You can run L♾️pGPT directly from the command line without having to write any python code as well:

loopgpt run

Run loopgpt --help to see all the available options.

🐋 Docker Mode

You can run L♾️pGPT in the previously mentioned modes, using Docker:

# CLI mode
docker run -i --rm loopgpt:local-dev loopgpt run
# Script mode example
docker run -i --rm -v "$(pwd)/scripts:/scripts" loopgpt:local-dev python /scripts/myscript.py

⚒️ Adding custom tools ⚒️

L♾️pGPT agents come with a set of builtin tools which allows them to perform various basic tasks such as searching the web, filesystem operations, etc. You can view these tools with print(agent.tools).

In addition to these builtin tools, you can also add your own tools to the agent's toolbox.

Example: WeatherGPT 🌦️

Let's create WeatherGPT, an AI assistant for all things weather.

A tool inherits from BaseTool and you only need to override 3 methods to get your tool up and running!

  • args: A dictionary describing the tool's arguments and their descriptions.
  • resp: A dictionary describing the tool's response and their descriptions.
  • run: The tool's main logic. It takes the tool's arguments as input and returns the tool's response.
fromloopgpt.toolsimportBaseToolclassGetWeather(BaseTool):
@propertydefargs(self):
return {"city": "name of the city"}
@propertydefresp(self):
return {"report": "The weather report for the city"}
defrun(self, city):
...

L♾️pGPT gives a default ID and description to your tool but you can override them if you'd like:

classGetWeather(BaseTool):
...
@propertydefid(self):
return"get_weather_command"@propertydefdesc(self):
"""A description is recommended so that the agent knows more about what the tool does"""return"Quickly get the weather for a given city"

Now let's define what our tool will do in its run method:

importrequests# Define your custom toolclassGetWeather(BaseTool):
...
defrun(self, city):
try:
url="https://wttr.in/{}?format=%l+%C+%h+%t+%w+%p+%P".format(city)
data=requests.get(url).text.split(" ")
keys= ("location", "condition", "humidity", "temperature", "wind", "precipitation", "pressure")
data= {"report": dict(zip(keys, data))}
returndataexceptExceptionase:
return {"report": f"An error occurred while getting the weather: {e}."}

That's it! You've built your first custom tool. Let's register it with a new agent and run it:

importloopgpt# Create Agentagent=loopgpt.Agent()
agent.name="WeatherGPT"agent.description="an AI assistant that tells you the weather"agent.goals= [
"Get the weather for NewYork and Beijing",
"Give the user tips on how to dress for the weather in NewYork and Beijing",
"Write the tips to a file called 'dressing_tips.txt'"
]
# Register custom tool type# This is actually not required here, but is required when you load a saved agent with custom tools.loopgpt.tools.register_tool_type(GetWeather)
# Register Toolweather_tool=GetWeather()
agent.tools[weather_tool.id] =weather_tool# Run the agent's CLIagent.cli()

Let's take a look at the dressing_tips.txt file that WeatherGPT wrote for us:

dressing_tips.txt

- It's Clear outside with a temperature of +10°C in Beijing. Wearing a light jacket and pants is recommended.
- It's Overcast outside with a temperature of +11°C in New York. Wearing a light jacket, pants, and an umbrella is recommended.

🚢 Course Correction

Unlike Auto-GPT, the agent does not terminate when the user denies the execution of a command. Instead it asks the user for feedback to correct its course.

To correct the agent's course, just deny execution and provide feedback:

The agent has updated its course of action:

💾 Saving and Loading Agent State 💾

You can save an agent's state to a json file with:

agent.save("ResearchGPT.json")

This saves the agent's configuration (model, name, description etc) as well as its internal state (conversation state, memory, tool states etc). You can also save just the confifguration by passing include_state=False to agent.save():

agent.save("ResearchGPT.json", include_state=False)

Then pick up where you left off with:

importloopgptagent=loopgpt.Agent.load("ResearchGPT.json")
agent.cli()

or by running the saved agent from the command line:

loopgpt run ResearchGPT.json

You can convert the agent state to a json compatible python dictionary instead of writing to a file:

agent_config=agent.config()

To get just the configuration without the internal state:

agent_config=agent.config(include_state=False)

To reload the agent from the config, use:

importloopgptagent=loopgpt.Agent.from_config(agent_config)

📋 Requirements

Optional Requirements

For official google search support you will need to setup two environment variable keys GOOGLE_API_KEY and CUSTOM_SEARCH_ENGINE_ID, here is how to get them:

  1. Create an application on the Google Developers Console.
  2. Create your custom search engine using Google Custom Search.
  3. Once your custom search engine is created, select it and get into the details page of the search engine.
    • On the "Basic" section, you will find the "Search engine ID" field, that value is what you will use for the CUSTOM_SEARCH_ENGINE_ID environment variable.
    • Now go to the "Programmatic Access" section at the bottom of the page.
      • Create a "Custom Search JSON API"
      • Follow the dialog by selecting the application you created on step #1 and when you get your API key use it to populate the GOOGLE_API_KEY environment variable.

ℹ️ In case these are absent, L♾️pGPT will fall back to using DuckDuckGo Search.

💌 Contribute

We need A LOT of Help! Please open an issue or a PR if you'd like to contribute.

🌳 Community

Need help? Join our Discord.

⭐ Star History 📈

Star History Chart

About

Modular Auto-GPT Framework

Resources

Contributing

Security policy

Stars

1 star

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

Repository files navigation

L♾️pGPT

A Modular Auto-GPT Framework

L♾️pGPT is a re-implementation of the popular Auto-GPT project as a proper python package, written with modularity and extensibility in mind.

🚀 Features 🚀

  • "Plug N Play" API - Extensible and modular "Pythonic" framework, not just a command line tool. Easy to add new features, integrations and custom agent capabilities, all from python code, no nasty config files!
  • GPT 3.5 friendly - Better results than Auto-GPT for those who don't have GPT-4 access yet!
  • Minimal prompt overhead - Every token counts. We are continuously working on getting the best results with the least possible number of tokens.
  • Human in the Loop - Ability to "course correct" agents who go astray via human feedback.
  • Full state serialization - Pick up where you left off; L♾️pGPT can save the complete state of an agent, including memory and the states of its tools to a file or python object. No external databases or vector stores required (but they are still supported)!

🧑‍💻 Installation

Install from PyPI

📗 This installs the latest stable version of L♾️pGPT. This is recommended for most users:

pip install loopgpt

📕 The below two methods install the latest development version of L♾️pGPT. Note that this version maybe unstable:

Install from source

pip install git+https://www.github.com/farizrahman4u/loopgpt.git@main

Install from source (dev)

git clone https://www.github.com/farizrahman4u/loopgpt.git
cd loopgpt
pip install -e .

Install from source (dev) using Docker

git clone https://www.github.com/farizrahman4u/loopgpt.git
cd loopgpt
docker build -t loopgpt:local-dev .

🏎️ Getting Started

Setup your OpenAI API Key 🔑

Option 1️⃣: Via a .env file

Create a .env file in your current working directory (wherever you are going to run L♾️pGPT from) and add the following line to it:

OPENAI_API_KEY="<your-openai-api-key>"

🛑 IMPORTANT 🛑

Windows users, please make sure "show file extensions" is enabled in your file explorer. Otherwise, your file will be named .env.txt instead of .env.

Option 2️⃣: Via environment variables

Set an environment variable called OPENAI_API_KEY to your OpenAI API Key.

How to set environment variables:

Create a new L♾️pGPT Agent🕵️:

Let's create an agent in a new Python script.

fromloopgpt.agentimportAgentagent=Agent()

L♾️pGPT uses gpt-3.5-turbo by default and all outputs shown here are made using it. GPT-4 users can set model="gpt-4" instead:

agent=Agent(model="gpt-4")

Setup the Agent🕵️'s attributes:

agent.name="ResearchGPT"agent.description="an AI assistant that researches and finds the best tech products"agent.goals= [
"Search for the best headphones on Google",
"Analyze specs, prices and reviews to find the top 5 best headphones",
"Write the list of the top 5 best headphones and their prices to a file",
"Summarize the pros and cons of each headphone and write it to a different file called 'summary.txt'",
]

And we're off! Let's run the Agent🕵️'s CLI:

agent.cli()

Save your Python file as research_gpt.py and run it:

python research_gpt.py

You can exit the CLI by typing "exit".

🔁 Continuous Mode 🔁

If continuous is set to True, the agent will not ask for the user's permission to execute commands. It may go into infinite loops, so use it at your own risk!

agent.cli(continuous=True)

💻 Command Line Only Mode

You can run L♾️pGPT directly from the command line without having to write any python code as well:

loopgpt run

Run loopgpt --help to see all the available options.

🐋 Docker Mode

You can run L♾️pGPT in the previously mentioned modes, using Docker:

# CLI mode
docker run -i --rm loopgpt:local-dev loopgpt run
# Script mode example
docker run -i --rm -v "$(pwd)/scripts:/scripts" loopgpt:local-dev python /scripts/myscript.py

⚒️ Adding custom tools ⚒️

L♾️pGPT agents come with a set of builtin tools which allows them to perform various basic tasks such as searching the web, filesystem operations, etc. You can view these tools with print(agent.tools).

In addition to these builtin tools, you can also add your own tools to the agent's toolbox.

Example: WeatherGPT 🌦️

Let's create WeatherGPT, an AI assistant for all things weather.

A tool inherits from BaseTool and you only need to override 3 methods to get your tool up and running!

  • args: A dictionary describing the tool's arguments and their descriptions.
  • resp: A dictionary describing the tool's response and their descriptions.
  • run: The tool's main logic. It takes the tool's arguments as input and returns the tool's response.
fromloopgpt.toolsimportBaseToolclassGetWeather(BaseTool):
@propertydefargs(self):
return {"city": "name of the city"}
@propertydefresp(self):
return {"report": "The weather report for the city"}
defrun(self, city):
...

L♾️pGPT gives a default ID and description to your tool but you can override them if you'd like:

classGetWeather(BaseTool):
...
@propertydefid(self):
return"get_weather_command"@propertydefdesc(self):
"""A description is recommended so that the agent knows more about what the tool does"""return"Quickly get the weather for a given city"

Now let's define what our tool will do in its run method:

importrequests# Define your custom toolclassGetWeather(BaseTool):
...
defrun(self, city):
try:
url="https://wttr.in/{}?format=%l+%C+%h+%t+%w+%p+%P".format(city)
data=requests.get(url).text.split(" ")
keys= ("location", "condition", "humidity", "temperature", "wind", "precipitation", "pressure")
data= {"report": dict(zip(keys, data))}
returndataexceptExceptionase:
return {"report": f"An error occurred while getting the weather: {e}."}

That's it! You've built your first custom tool. Let's register it with a new agent and run it:

importloopgpt# Create Agentagent=loopgpt.Agent()
agent.name="WeatherGPT"agent.description="an AI assistant that tells you the weather"agent.goals= [
"Get the weather for NewYork and Beijing",
"Give the user tips on how to dress for the weather in NewYork and Beijing",
"Write the tips to a file called 'dressing_tips.txt'"
]
# Register custom tool type# This is actually not required here, but is required when you load a saved agent with custom tools.loopgpt.tools.register_tool_type(GetWeather)
# Register Toolweather_tool=GetWeather()
agent.tools[weather_tool.id] =weather_tool# Run the agent's CLIagent.cli()

Let's take a look at the dressing_tips.txt file that WeatherGPT wrote for us:

dressing_tips.txt

- It's Clear outside with a temperature of +10°C in Beijing. Wearing a light jacket and pants is recommended.
- It's Overcast outside with a temperature of +11°C in New York. Wearing a light jacket, pants, and an umbrella is recommended.

🚢 Course Correction

Unlike Auto-GPT, the agent does not terminate when the user denies the execution of a command. Instead it asks the user for feedback to correct its course.

To correct the agent's course, just deny execution and provide feedback:

The agent has updated its course of action:

💾 Saving and Loading Agent State 💾

You can save an agent's state to a json file with:

agent.save("ResearchGPT.json")

This saves the agent's configuration (model, name, description etc) as well as its internal state (conversation state, memory, tool states etc). You can also save just the confifguration by passing include_state=False to agent.save():

agent.save("ResearchGPT.json", include_state=False)

Then pick up where you left off with:

importloopgptagent=loopgpt.Agent.load("ResearchGPT.json")
agent.cli()

or by running the saved agent from the command line:

loopgpt run ResearchGPT.json

You can convert the agent state to a json compatible python dictionary instead of writing to a file:

agent_config=agent.config()

To get just the configuration without the internal state:

agent_config=agent.config(include_state=False)

To reload the agent from the config, use:

importloopgptagent=loopgpt.Agent.from_config(agent_config)

📋 Requirements

Optional Requirements

For official google search support you will need to setup two environment variable keys GOOGLE_API_KEY and CUSTOM_SEARCH_ENGINE_ID, here is how to get them:

  1. Create an application on the Google Developers Console.
  2. Create your custom search engine using Google Custom Search.
  3. Once your custom search engine is created, select it and get into the details page of the search engine.
    • On the "Basic" section, you will find the "Search engine ID" field, that value is what you will use for the CUSTOM_SEARCH_ENGINE_ID environment variable.
    • Now go to the "Programmatic Access" section at the bottom of the page.
      • Create a "Custom Search JSON API"
      • Follow the dialog by selecting the application you created on step #1 and when you get your API key use it to populate the GOOGLE_API_KEY environment variable.

ℹ️ In case these are absent, L♾️pGPT will fall back to using DuckDuckGo Search.

💌 Contribute

We need A LOT of Help! Please open an issue or a PR if you'd like to contribute.

🌳 Community

Need help? Join our Discord.

⭐ Star History 📈

Star History Chart

About

Modular Auto-GPT Framework

Resources

Contributing

Security policy

Stars

1 star

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

L♾️pGPT

A Modular Auto-GPT Framework

L♾️pGPT is a re-implementation of the popular Auto-GPT project as a proper python package, written with modularity and extensibility in mind.

🚀 Features 🚀

  • "Plug N Play" API - Extensible and modular "Pythonic" framework, not just a command line tool. Easy to add new features, integrations and custom agent capabilities, all from python code, no nasty config files!
  • GPT 3.5 friendly - Better results than Auto-GPT for those who don't have GPT-4 access yet!
  • Minimal prompt overhead - Every token counts. We are continuously working on getting the best results with the least possible number of tokens.
  • Human in the Loop - Ability to "course correct" agents who go astray via human feedback.
  • Full state serialization - Pick up where you left off; L♾️pGPT can save the complete state of an agent, including memory and the states of its tools to a file or python object. No external databases or vector stores required (but they are still supported)!

🧑‍💻 Installation

Install from PyPI

📗 This installs the latest stable version of L♾️pGPT. This is recommended for most users:

pip install loopgpt

📕 The below two methods install the latest development version of L♾️pGPT. Note that this version maybe unstable:

Install from source

pip install git+https://www.github.com/farizrahman4u/loopgpt.git@main

Install from source (dev)

git clone https://www.github.com/farizrahman4u/loopgpt.git
cd loopgpt
pip install -e .

Install from source (dev) using Docker

git clone https://www.github.com/farizrahman4u/loopgpt.git
cd loopgpt
docker build -t loopgpt:local-dev .

🏎️ Getting Started

Setup your OpenAI API Key 🔑

Option 1️⃣: Via a .env file

Create a .env file in your current working directory (wherever you are going to run L♾️pGPT from) and add the following line to it:

OPENAI_API_KEY="<your-openai-api-key>"

🛑 IMPORTANT 🛑

Windows users, please make sure "show file extensions" is enabled in your file explorer. Otherwise, your file will be named .env.txt instead of .env.

Option 2️⃣: Via environment variables

Set an environment variable called OPENAI_API_KEY to your OpenAI API Key.

How to set environment variables:

Create a new L♾️pGPT Agent🕵️:

Let's create an agent in a new Python script.

fromloopgpt.agentimportAgentagent=Agent()

L♾️pGPT uses gpt-3.5-turbo by default and all outputs shown here are made using it. GPT-4 users can set model="gpt-4" instead:

agent=Agent(model="gpt-4")

Setup the Agent🕵️'s attributes:

agent.name="ResearchGPT"agent.description="an AI assistant that researches and finds the best tech products"agent.goals= [
"Search for the best headphones on Google",
"Analyze specs, prices and reviews to find the top 5 best headphones",
"Write the list of the top 5 best headphones and their prices to a file",
"Summarize the pros and cons of each headphone and write it to a different file called 'summary.txt'",
]

And we're off! Let's run the Agent🕵️'s CLI:

agent.cli()

Save your Python file as research_gpt.py and run it:

python research_gpt.py

You can exit the CLI by typing "exit".

🔁 Continuous Mode 🔁

If continuous is set to True, the agent will not ask for the user's permission to execute commands. It may go into infinite loops, so use it at your own risk!

agent.cli(continuous=True)

💻 Command Line Only Mode

You can run L♾️pGPT directly from the command line without having to write any python code as well:

loopgpt run

Run loopgpt --help to see all the available options.

🐋 Docker Mode

You can run L♾️pGPT in the previously mentioned modes, using Docker:

# CLI mode
docker run -i --rm loopgpt:local-dev loopgpt run
# Script mode example
docker run -i --rm -v "$(pwd)/scripts:/scripts" loopgpt:local-dev python /scripts/myscript.py

⚒️ Adding custom tools ⚒️

L♾️pGPT agents come with a set of builtin tools which allows them to perform various basic tasks such as searching the web, filesystem operations, etc. You can view these tools with print(agent.tools).

In addition to these builtin tools, you can also add your own tools to the agent's toolbox.

Example: WeatherGPT 🌦️

Let's create WeatherGPT, an AI assistant for all things weather.

A tool inherits from BaseTool and you only need to override 3 methods to get your tool up and running!

  • args: A dictionary describing the tool's arguments and their descriptions.
  • resp: A dictionary describing the tool's response and their descriptions.
  • run: The tool's main logic. It takes the tool's arguments as input and returns the tool's response.
fromloopgpt.toolsimportBaseToolclassGetWeather(BaseTool):
@propertydefargs(self):
return {"city": "name of the city"}
@propertydefresp(self):
return {"report": "The weather report for the city"}
defrun(self, city):
...

L♾️pGPT gives a default ID and description to your tool but you can override them if you'd like:

classGetWeather(BaseTool):
...
@propertydefid(self):
return"get_weather_command"@propertydefdesc(self):
"""A description is recommended so that the agent knows more about what the tool does"""return"Quickly get the weather for a given city"

Now let's define what our tool will do in its run method:

importrequests# Define your custom toolclassGetWeather(BaseTool):
...
defrun(self, city):
try:
url="https://wttr.in/{}?format=%l+%C+%h+%t+%w+%p+%P".format(city)
data=requests.get(url).text.split(" ")
keys= ("location", "condition", "humidity", "temperature", "wind", "precipitation", "pressure")
data= {"report": dict(zip(keys, data))}
returndataexceptExceptionase:
return {"report": f"An error occurred while getting the weather: {e}."}

That's it! You've built your first custom tool. Let's register it with a new agent and run it:

importloopgpt# Create Agentagent=loopgpt.Agent()
agent.name="WeatherGPT"agent.description="an AI assistant that tells you the weather"agent.goals= [
"Get the weather for NewYork and Beijing",
"Give the user tips on how to dress for the weather in NewYork and Beijing",
"Write the tips to a file called 'dressing_tips.txt'"
]
# Register custom tool type# This is actually not required here, but is required when you load a saved agent with custom tools.loopgpt.tools.register_tool_type(GetWeather)
# Register Toolweather_tool=GetWeather()
agent.tools[weather_tool.id] =weather_tool# Run the agent's CLIagent.cli()

Let's take a look at the dressing_tips.txt file that WeatherGPT wrote for us:

dressing_tips.txt

- It's Clear outside with a temperature of +10°C in Beijing. Wearing a light jacket and pants is recommended.
- It's Overcast outside with a temperature of +11°C in New York. Wearing a light jacket, pants, and an umbrella is recommended.

🚢 Course Correction

Unlike Auto-GPT, the agent does not terminate when the user denies the execution of a command. Instead it asks the user for feedback to correct its course.

To correct the agent's course, just deny execution and provide feedback:

The agent has updated its course of action:

💾 Saving and Loading Agent State 💾

You can save an agent's state to a json file with:

agent.save("ResearchGPT.json")

This saves the agent's configuration (model, name, description etc) as well as its internal state (conversation state, memory, tool states etc). You can also save just the confifguration by passing include_state=False to agent.save():

agent.save("ResearchGPT.json", include_state=False)

Then pick up where you left off with:

importloopgptagent=loopgpt.Agent.load("ResearchGPT.json")
agent.cli()

or by running the saved agent from the command line:

loopgpt run ResearchGPT.json

You can convert the agent state to a json compatible python dictionary instead of writing to a file:

agent_config=agent.config()

To get just the configuration without the internal state:

agent_config=agent.config(include_state=False)

To reload the agent from the config, use:

importloopgptagent=loopgpt.Agent.from_config(agent_config)

📋 Requirements

Optional Requirements

For official google search support you will need to setup two environment variable keys GOOGLE_API_KEY and CUSTOM_SEARCH_ENGINE_ID, here is how to get them:

  1. Create an application on the Google Developers Console.
  2. Create your custom search engine using Google Custom Search.
  3. Once your custom search engine is created, select it and get into the details page of the search engine.
    • On the "Basic" section, you will find the "Search engine ID" field, that value is what you will use for the CUSTOM_SEARCH_ENGINE_ID environment variable.
    • Now go to the "Programmatic Access" section at the bottom of the page.
      • Create a "Custom Search JSON API"
      • Follow the dialog by selecting the application you created on step #1 and when you get your API key use it to populate the GOOGLE_API_KEY environment variable.

ℹ️ In case these are absent, L♾️pGPT will fall back to using DuckDuckGo Search.

💌 Contribute

We need A LOT of Help! Please open an issue or a PR if you'd like to contribute.

🌳 Community

Need help? Join our Discord.

⭐ Star History 📈

Star History Chart

About

Modular Auto-GPT Framework

Resources

Contributing

Security policy

Stars

1 star

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

L♾️pGPT

A Modular Auto-GPT Framework

L♾️pGPT is a re-implementation of the popular Auto-GPT project as a proper python package, written with modularity and extensibility in mind.

🚀 Features 🚀

  • "Plug N Play" API - Extensible and modular "Pythonic" framework, not just a command line tool. Easy to add new features, integrations and custom agent capabilities, all from python code, no nasty config files!
  • GPT 3.5 friendly - Better results than Auto-GPT for those who don't have GPT-4 access yet!
  • Minimal prompt overhead - Every token counts. We are continuously working on getting the best results with the least possible number of tokens.
  • Human in the Loop - Ability to "course correct" agents who go astray via human feedback.
  • Full state serialization - Pick up where you left off; L♾️pGPT can save the complete state of an agent, including memory and the states of its tools to a file or python object. No external databases or vector stores required (but they are still supported)!

🧑‍💻 Installation

Install from PyPI

📗 This installs the latest stable version of L♾️pGPT. This is recommended for most users:

pip install loopgpt

📕 The below two methods install the latest development version of L♾️pGPT. Note that this version maybe unstable:

Install from source

pip install git+https://www.github.com/farizrahman4u/loopgpt.git@main

Install from source (dev)

git clone https://www.github.com/farizrahman4u/loopgpt.git
cd loopgpt
pip install -e .

Install from source (dev) using Docker

git clone https://www.github.com/farizrahman4u/loopgpt.git
cd loopgpt
docker build -t loopgpt:local-dev .

🏎️ Getting Started

Setup your OpenAI API Key 🔑

Option 1️⃣: Via a .env file

Create a .env file in your current working directory (wherever you are going to run L♾️pGPT from) and add the following line to it:

OPENAI_API_KEY="<your-openai-api-key>"

🛑 IMPORTANT 🛑

Windows users, please make sure "show file extensions" is enabled in your file explorer. Otherwise, your file will be named .env.txt instead of .env.

Option 2️⃣: Via environment variables

Set an environment variable called OPENAI_API_KEY to your OpenAI API Key.

How to set environment variables:

Create a new L♾️pGPT Agent🕵️:

Let's create an agent in a new Python script.

fromloopgpt.agentimportAgentagent=Agent()

L♾️pGPT uses gpt-3.5-turbo by default and all outputs shown here are made using it. GPT-4 users can set model="gpt-4" instead:

agent=Agent(model="gpt-4")

Setup the Agent🕵️'s attributes:

agent.name="ResearchGPT"agent.description="an AI assistant that researches and finds the best tech products"agent.goals= [
"Search for the best headphones on Google",
"Analyze specs, prices and reviews to find the top 5 best headphones",
"Write the list of the top 5 best headphones and their prices to a file",
"Summarize the pros and cons of each headphone and write it to a different file called 'summary.txt'",
]

And we're off! Let's run the Agent🕵️'s CLI:

agent.cli()

Save your Python file as research_gpt.py and run it:

python research_gpt.py

You can exit the CLI by typing "exit".

🔁 Continuous Mode 🔁

If continuous is set to True, the agent will not ask for the user's permission to execute commands. It may go into infinite loops, so use it at your own risk!

agent.cli(continuous=True)

💻 Command Line Only Mode

You can run L♾️pGPT directly from the command line without having to write any python code as well:

loopgpt run

Run loopgpt --help to see all the available options.

🐋 Docker Mode

You can run L♾️pGPT in the previously mentioned modes, using Docker:

# CLI mode
docker run -i --rm loopgpt:local-dev loopgpt run
# Script mode example
docker run -i --rm -v "$(pwd)/scripts:/scripts" loopgpt:local-dev python /scripts/myscript.py

⚒️ Adding custom tools ⚒️

L♾️pGPT agents come with a set of builtin tools which allows them to perform various basic tasks such as searching the web, filesystem operations, etc. You can view these tools with print(agent.tools).

In addition to these builtin tools, you can also add your own tools to the agent's toolbox.

Example: WeatherGPT 🌦️

Let's create WeatherGPT, an AI assistant for all things weather.

A tool inherits from BaseTool and you only need to override 3 methods to get your tool up and running!

  • args: A dictionary describing the tool's arguments and their descriptions.
  • resp: A dictionary describing the tool's response and their descriptions.
  • run: The tool's main logic. It takes the tool's arguments as input and returns the tool's response.
fromloopgpt.toolsimportBaseToolclassGetWeather(BaseTool):
@propertydefargs(self):
return {"city": "name of the city"}
@propertydefresp(self):
return {"report": "The weather report for the city"}
defrun(self, city):
...

L♾️pGPT gives a default ID and description to your tool but you can override them if you'd like:

classGetWeather(BaseTool):
...
@propertydefid(self):
return"get_weather_command"@propertydefdesc(self):
"""A description is recommended so that the agent knows more about what the tool does"""return"Quickly get the weather for a given city"

Now let's define what our tool will do in its run method:

importrequests# Define your custom toolclassGetWeather(BaseTool):
...
defrun(self, city):
try:
url="https://wttr.in/{}?format=%l+%C+%h+%t+%w+%p+%P".format(city)
data=requests.get(url).text.split(" ")
keys= ("location", "condition", "humidity", "temperature", "wind", "precipitation", "pressure")
data= {"report": dict(zip(keys, data))}
returndataexceptExceptionase:
return {"report": f"An error occurred while getting the weather: {e}."}

That's it! You've built your first custom tool. Let's register it with a new agent and run it:

importloopgpt# Create Agentagent=loopgpt.Agent()
agent.name="WeatherGPT"agent.description="an AI assistant that tells you the weather"agent.goals= [
"Get the weather for NewYork and Beijing",
"Give the user tips on how to dress for the weather in NewYork and Beijing",
"Write the tips to a file called 'dressing_tips.txt'"
]
# Register custom tool type# This is actually not required here, but is required when you load a saved agent with custom tools.loopgpt.tools.register_tool_type(GetWeather)
# Register Toolweather_tool=GetWeather()
agent.tools[weather_tool.id] =weather_tool# Run the agent's CLIagent.cli()

Let's take a look at the dressing_tips.txt file that WeatherGPT wrote for us:

dressing_tips.txt

- It's Clear outside with a temperature of +10°C in Beijing. Wearing a light jacket and pants is recommended.
- It's Overcast outside with a temperature of +11°C in New York. Wearing a light jacket, pants, and an umbrella is recommended.

🚢 Course Correction

Unlike Auto-GPT, the agent does not terminate when the user denies the execution of a command. Instead it asks the user for feedback to correct its course.

To correct the agent's course, just deny execution and provide feedback:

The agent has updated its course of action:

💾 Saving and Loading Agent State 💾

You can save an agent's state to a json file with:

agent.save("ResearchGPT.json")

This saves the agent's configuration (model, name, description etc) as well as its internal state (conversation state, memory, tool states etc). You can also save just the confifguration by passing include_state=False to agent.save():

agent.save("ResearchGPT.json", include_state=False)

Then pick up where you left off with:

importloopgptagent=loopgpt.Agent.load("ResearchGPT.json")
agent.cli()

or by running the saved agent from the command line:

loopgpt run ResearchGPT.json

You can convert the agent state to a json compatible python dictionary instead of writing to a file:

agent_config=agent.config()

To get just the configuration without the internal state:

agent_config=agent.config(include_state=False)

To reload the agent from the config, use:

importloopgptagent=loopgpt.Agent.from_config(agent_config)

📋 Requirements

Optional Requirements

For official google search support you will need to setup two environment variable keys GOOGLE_API_KEY and CUSTOM_SEARCH_ENGINE_ID, here is how to get them:

  1. Create an application on the Google Developers Console.
  2. Create your custom search engine using Google Custom Search.
  3. Once your custom search engine is created, select it and get into the details page of the search engine.
    • On the "Basic" section, you will find the "Search engine ID" field, that value is what you will use for the CUSTOM_SEARCH_ENGINE_ID environment variable.
    • Now go to the "Programmatic Access" section at the bottom of the page.
      • Create a "Custom Search JSON API"
      • Follow the dialog by selecting the application you created on step #1 and when you get your API key use it to populate the GOOGLE_API_KEY environment variable.

ℹ️ In case these are absent, L♾️pGPT will fall back to using DuckDuckGo Search.

💌 Contribute

We need A LOT of Help! Please open an issue or a PR if you'd like to contribute.

🌳 Community

Need help? Join our Discord.

⭐ Star History 📈

Star History Chart

About

Modular Auto-GPT Framework

Resources

Contributing

Security policy

Stars

1 star

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

Repository files navigation

L♾️pGPT

A Modular Auto-GPT Framework

L♾️pGPT is a re-implementation of the popular Auto-GPT project as a proper python package, written with modularity and extensibility in mind.

🚀 Features 🚀

  • "Plug N Play" API - Extensible and modular "Pythonic" framework, not just a command line tool. Easy to add new features, integrations and custom agent capabilities, all from python code, no nasty config files!
  • GPT 3.5 friendly - Better results than Auto-GPT for those who don't have GPT-4 access yet!
  • Minimal prompt overhead - Every token counts. We are continuously working on getting the best results with the least possible number of tokens.
  • Human in the Loop - Ability to "course correct" agents who go astray via human feedback.
  • Full state serialization - Pick up where you left off; L♾️pGPT can save the complete state of an agent, including memory and the states of its tools to a file or python object. No external databases or vector stores required (but they are still supported)!

🧑‍💻 Installation

Install from PyPI

📗 This installs the latest stable version of L♾️pGPT. This is recommended for most users:

pip install loopgpt

📕 The below two methods install the latest development version of L♾️pGPT. Note that this version maybe unstable:

Install from source

pip install git+https://www.github.com/farizrahman4u/loopgpt.git@main

Install from source (dev)

git clone https://www.github.com/farizrahman4u/loopgpt.git
cd loopgpt
pip install -e .

Install from source (dev) using Docker

git clone https://www.github.com/farizrahman4u/loopgpt.git
cd loopgpt
docker build -t loopgpt:local-dev .

🏎️ Getting Started

Setup your OpenAI API Key 🔑

Option 1️⃣: Via a .env file

Create a .env file in your current working directory (wherever you are going to run L♾️pGPT from) and add the following line to it:

OPENAI_API_KEY="<your-openai-api-key>"

🛑 IMPORTANT 🛑

Windows users, please make sure "show file extensions" is enabled in your file explorer. Otherwise, your file will be named .env.txt instead of .env.

Option 2️⃣: Via environment variables

Set an environment variable called OPENAI_API_KEY to your OpenAI API Key.

How to set environment variables:

Create a new L♾️pGPT Agent🕵️:

Let's create an agent in a new Python script.

fromloopgpt.agentimportAgentagent=Agent()

L♾️pGPT uses gpt-3.5-turbo by default and all outputs shown here are made using it. GPT-4 users can set model="gpt-4" instead:

agent=Agent(model="gpt-4")

Setup the Agent🕵️'s attributes:

agent.name="ResearchGPT"agent.description="an AI assistant that researches and finds the best tech products"agent.goals= [
"Search for the best headphones on Google",
"Analyze specs, prices and reviews to find the top 5 best headphones",
"Write the list of the top 5 best headphones and their prices to a file",
"Summarize the pros and cons of each headphone and write it to a different file called 'summary.txt'",
]

And we're off! Let's run the Agent🕵️'s CLI:

agent.cli()

Save your Python file as research_gpt.py and run it:

python research_gpt.py

You can exit the CLI by typing "exit".

🔁 Continuous Mode 🔁

If continuous is set to True, the agent will not ask for the user's permission to execute commands. It may go into infinite loops, so use it at your own risk!

agent.cli(continuous=True)

💻 Command Line Only Mode

You can run L♾️pGPT directly from the command line without having to write any python code as well:

loopgpt run

Run loopgpt --help to see all the available options.

🐋 Docker Mode

You can run L♾️pGPT in the previously mentioned modes, using Docker:

# CLI mode
docker run -i --rm loopgpt:local-dev loopgpt run
# Script mode example
docker run -i --rm -v "$(pwd)/scripts:/scripts" loopgpt:local-dev python /scripts/myscript.py

⚒️ Adding custom tools ⚒️

L♾️pGPT agents come with a set of builtin tools which allows them to perform various basic tasks such as searching the web, filesystem operations, etc. You can view these tools with print(agent.tools).

In addition to these builtin tools, you can also add your own tools to the agent's toolbox.

Example: WeatherGPT 🌦️

Let's create WeatherGPT, an AI assistant for all things weather.

A tool inherits from BaseTool and you only need to override 3 methods to get your tool up and running!

  • args: A dictionary describing the tool's arguments and their descriptions.
  • resp: A dictionary describing the tool's response and their descriptions.
  • run: The tool's main logic. It takes the tool's arguments as input and returns the tool's response.
fromloopgpt.toolsimportBaseToolclassGetWeather(BaseTool):
@propertydefargs(self):
return {"city": "name of the city"}
@propertydefresp(self):
return {"report": "The weather report for the city"}
defrun(self, city):
...

L♾️pGPT gives a default ID and description to your tool but you can override them if you'd like:

classGetWeather(BaseTool):
...
@propertydefid(self):
return"get_weather_command"@propertydefdesc(self):
"""A description is recommended so that the agent knows more about what the tool does"""return"Quickly get the weather for a given city"

Now let's define what our tool will do in its run method:

importrequests# Define your custom toolclassGetWeather(BaseTool):
...
defrun(self, city):
try:
url="https://wttr.in/{}?format=%l+%C+%h+%t+%w+%p+%P".format(city)
data=requests.get(url).text.split(" ")
keys= ("location", "condition", "humidity", "temperature", "wind", "precipitation", "pressure")
data= {"report": dict(zip(keys, data))}
returndataexceptExceptionase:
return {"report": f"An error occurred while getting the weather: {e}."}

That's it! You've built your first custom tool. Let's register it with a new agent and run it:

importloopgpt# Create Agentagent=loopgpt.Agent()
agent.name="WeatherGPT"agent.description="an AI assistant that tells you the weather"agent.goals= [
"Get the weather for NewYork and Beijing",
"Give the user tips on how to dress for the weather in NewYork and Beijing",
"Write the tips to a file called 'dressing_tips.txt'"
]
# Register custom tool type# This is actually not required here, but is required when you load a saved agent with custom tools.loopgpt.tools.register_tool_type(GetWeather)
# Register Toolweather_tool=GetWeather()
agent.tools[weather_tool.id] =weather_tool# Run the agent's CLIagent.cli()

Let's take a look at the dressing_tips.txt file that WeatherGPT wrote for us:

dressing_tips.txt

- It's Clear outside with a temperature of +10°C in Beijing. Wearing a light jacket and pants is recommended.
- It's Overcast outside with a temperature of +11°C in New York. Wearing a light jacket, pants, and an umbrella is recommended.

🚢 Course Correction

Unlike Auto-GPT, the agent does not terminate when the user denies the execution of a command. Instead it asks the user for feedback to correct its course.

To correct the agent's course, just deny execution and provide feedback:

The agent has updated its course of action:

💾 Saving and Loading Agent State 💾

You can save an agent's state to a json file with:

agent.save("ResearchGPT.json")

This saves the agent's configuration (model, name, description etc) as well as its internal state (conversation state, memory, tool states etc). You can also save just the confifguration by passing include_state=False to agent.save():

agent.save("ResearchGPT.json", include_state=False)

Then pick up where you left off with:

importloopgptagent=loopgpt.Agent.load("ResearchGPT.json")
agent.cli()

or by running the saved agent from the command line:

loopgpt run ResearchGPT.json

You can convert the agent state to a json compatible python dictionary instead of writing to a file:

agent_config=agent.config()

To get just the configuration without the internal state:

agent_config=agent.config(include_state=False)

To reload the agent from the config, use:

importloopgptagent=loopgpt.Agent.from_config(agent_config)

📋 Requirements

Optional Requirements

For official google search support you will need to setup two environment variable keys GOOGLE_API_KEY and CUSTOM_SEARCH_ENGINE_ID, here is how to get them:

  1. Create an application on the Google Developers Console.
  2. Create your custom search engine using Google Custom Search.
  3. Once your custom search engine is created, select it and get into the details page of the search engine.
    • On the "Basic" section, you will find the "Search engine ID" field, that value is what you will use for the CUSTOM_SEARCH_ENGINE_ID environment variable.
    • Now go to the "Programmatic Access" section at the bottom of the page.
      • Create a "Custom Search JSON API"
      • Follow the dialog by selecting the application you created on step #1 and when you get your API key use it to populate the GOOGLE_API_KEY environment variable.

ℹ️ In case these are absent, L♾️pGPT will fall back to using DuckDuckGo Search.

💌 Contribute

We need A LOT of Help! Please open an issue or a PR if you'd like to contribute.

🌳 Community

Need help? Join our Discord.

⭐ Star History 📈

Star History Chart

About

Modular Auto-GPT Framework

Resources

Contributing

Security policy

Stars

1 star

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages