diff --git a/docs/README.md b/docs/README.md
new file mode 100644
index 000000000..4cbe0750c
--- /dev/null
+++ b/docs/README.md
@@ -0,0 +1,32 @@
+# Mintlify Starter Kit
+
+Click on `Use this template` to copy the Mintlify starter kit. The starter kit contains examples including
+
+- Guide pages
+- Navigation
+- Customizations
+- API Reference pages
+- Use of popular components
+
+### Development
+
+Install the [Mintlify CLI](https://www.npmjs.com/package/mintlify) to preview the documentation changes locally. To install, use the following command
+
+```
+npm i -g mintlify
+```
+
+Run the following command at the root of your documentation (where mint.json is)
+
+```
+mintlify dev
+```
+
+### Publishing Changes
+
+Install our Github App to auto propagate changes from your repo to your deployment. Changes will be deployed to production automatically after pushing to the default branch. Find the link to install on your dashboard.
+
+#### Troubleshooting
+
+- Mintlify dev isn't running - Run `mintlify install` it'll re-install dependencies.
+- Page loads as a 404 - Make sure you are running in a folder with `mint.json`
diff --git a/docs/_javascript/mathjax.js b/docs/_javascript/mathjax.js
deleted file mode 100644
index a80ddbff7..000000000
--- a/docs/_javascript/mathjax.js
+++ /dev/null
@@ -1,16 +0,0 @@
-window.MathJax = {
- tex: {
- inlineMath: [["\\(", "\\)"]],
- displayMath: [["\\[", "\\]"]],
- processEscapes: true,
- processEnvironments: true
- },
- options: {
- ignoreHtmlClass: ".*|",
- processHtmlClass: "arithmatex"
- }
-};
-
-document$.subscribe(() => {
- MathJax.typesetPromise()
-})
\ No newline at end of file
diff --git a/docs/_javascript/tablesort.js b/docs/_javascript/tablesort.js
deleted file mode 100644
index ee04e9008..000000000
--- a/docs/_javascript/tablesort.js
+++ /dev/null
@@ -1,6 +0,0 @@
-document$.subscribe(function () {
- var tables = document.querySelectorAll("article table:not([class])")
- tables.forEach(function (table) {
- new Tablesort(table)
- })
-})
\ No newline at end of file
diff --git a/docs/classic/archive/deprecated-apis.mdx b/docs/classic/archive/deprecated-apis.mdx
new file mode 100644
index 000000000..e69de29bb
diff --git a/docs/classic/archive/historical-features.mdx b/docs/classic/archive/historical-features.mdx
new file mode 100644
index 000000000..e69de29bb
diff --git a/docs/classic/archive/previous-releases.mdx b/docs/classic/archive/previous-releases.mdx
new file mode 100644
index 000000000..e69de29bb
diff --git a/docs/classic/code-of-conduct/index.mdx b/docs/classic/code-of-conduct/index.mdx
new file mode 100644
index 000000000..34db5322c
--- /dev/null
+++ b/docs/classic/code-of-conduct/index.mdx
@@ -0,0 +1,43 @@
+---
+title: Code of Conduct for AutoGPT
+sidebarTitle: Code of Conduct
+---
+
+## 1\. Purpose
+
+The purpose of this Code of Conduct is to provide guidelines for contributors to the AutoGPT projects on GitHub. We aim to create a positive and inclusive environment where all participants can contribute and collaborate effectively. By participating in this project, you agree to abide by this Code of Conduct.
+
+## 2\. Scope
+
+This Code of Conduct applies to all contributors, maintainers, and users of the AutoGPT project. It extends to all project spaces, including but not limited to issues, pull requests, code reviews, comments, and other forms of communication within the project.
+
+## 3\. Our Standards
+
+We encourage the following behavior:
+
+* Being respectful and considerate to others
+* Actively seeking diverse perspectives
+* Providing constructive feedback and assistance
+* Demonstrating empathy and understanding
+
+We discourage the following behavior:
+
+* Harassment or discrimination of any kind
+* Disrespectful, offensive, or inappropriate language or content
+* Personal attacks or insults
+* Unwarranted criticism or negativity
+
+## 4\. Reporting and Enforcement
+
+If you witness or experience any violations of this Code of Conduct, please report them to the project maintainers by email or other appropriate means. The maintainers will investigate and take appropriate action, which may include warnings, temporary or permanent bans, or other measures as necessary.
+
+Maintainers are responsible for ensuring compliance with this Code of Conduct and may take action to address any violations.
+
+## 5\. Acknowledgements
+This Code of Conduct is adapted from the [Contributor Covenant](https://www.contributor-covenant.org/version/2/0/code_of_conduct.html).
+
+## 6\. Contact
+
+If you have any questions or concerns, please contact the project maintainers on Discord: https://discord.gg/autogpt
+
+April 26, 2023 April 16, 2023
diff --git a/docs/content/classic/configuration/options.md b/docs/classic/configuration/options.mdx
similarity index 92%
rename from docs/content/classic/configuration/options.md
rename to docs/classic/configuration/options.mdx
index 9fb18c03e..f9aeed6be 100644
--- a/docs/content/classic/configuration/options.md
+++ b/docs/classic/configuration/options.mdx
@@ -1,6 +1,9 @@
-# Configuration
+---
+title: Configuration
+description: "Configuration of sensitive settings such as API credentials is done through environment variables."
+mode: wide
+---
-Configuration of sensitive settings such as API credentials is done through environment variables.
You can set configuration variables via the `.env` file. If you don't have a `.env` file, create a copy of `.env.template` in your `AutoGPT` folder and name it `.env`.
## Environment Variables
@@ -9,7 +12,7 @@ You can set configuration variables via the `.env` file. If you don't have a `.e
- `ANTHROPIC_API_KEY`: Set this if you want to use Anthropic models with AutoGPT
- `AZURE_CONFIG_FILE`: Location of the Azure Config file relative to the AutoGPT root directory. Default: azure.yaml
- `COMPONENT_CONFIG_FILE`: Path to the component configuration file (json) for an agent. Optional
-- `DISABLED_COMMANDS`: Commands to disable. Use comma separated names of commands. See the list of commands from built-in components [here](../../forge/components/components.md). Default: None
+- `DISABLED_COMMANDS`: Commands to disable. Use comma separated names of commands. See the list of commands from built-in components [here](/classic/forge/components/components). Default: None
- `ELEVENLABS_API_KEY`: ElevenLabs API Key. Optional.
- `ELEVENLABS_VOICE_ID`: ElevenLabs Voice ID. Optional.
- `EMBEDDING_MODEL`: LLM Model to use for embedding tasks. Default: `text-embedding-3-small`
diff --git a/docs/content/classic/configuration/search.md b/docs/classic/configuration/search.mdx
similarity index 81%
rename from docs/content/classic/configuration/search.md
rename to docs/classic/configuration/search.mdx
index 6f51c4bf1..f3ff74f22 100644
--- a/docs/content/classic/configuration/search.md
+++ b/docs/classic/configuration/search.mdx
@@ -1,10 +1,16 @@
-## 🔍 Google API Keys Configuration
+---
+title: Google API Keys Configuration
+sidebarTitle: Search
+---
-!!! note
- This section is optional. Use the official Google API if search attempts return
- error 429. To use the `google` command, you need to set up your
- Google API key in your environment variables or pass it with configuration to the [`WebSearchComponent`](../../forge/components/built-in-components.md).
+
+**Note**
+This section is optional. Use the official Google API if search attempts return
+error 429. To use the `google` command, you need to set up your
+Google API key in your environment variables or pass it with configuration to the [`WebSearchComponent`](/classic/forge/components/built-in-components).
+
+
Create your project:
1. Go to the [Google Cloud Console](https://console.cloud.google.com/).
diff --git a/docs/content/classic/configuration/voice.md b/docs/classic/configuration/voice.mdx
similarity index 87%
rename from docs/content/classic/configuration/voice.md
rename to docs/classic/configuration/voice.mdx
index 223a48def..094261c24 100644
--- a/docs/content/classic/configuration/voice.md
+++ b/docs/classic/configuration/voice.mdx
@@ -1,5 +1,7 @@
-# Text to Speech
-
+---
+title: Text to Speech
+sidebarTitle: Voice
+---
Enter this command to use TTS _(Text-to-Speech)_ for AutoGPT
```shell
@@ -21,8 +23,11 @@ In the `.env` file set:
### List of available voices
-!!! note
- You can use either the name or the voice ID to configure a voice
+
+**Note**
+
+You can use either the name or the voice ID to configure a voice
+
| Name | Voice ID |
| ------ | -------- |
diff --git a/docs/classic/contributing.mdx b/docs/classic/contributing.mdx
new file mode 100644
index 000000000..4ef412a12
--- /dev/null
+++ b/docs/classic/contributing.mdx
@@ -0,0 +1,29 @@
+---
+title: AutoGPT Contribution Guide
+---
+
+If you are reading this, you are probably looking for the full **[contribution guide](https://github.com/Significant-Gravitas/AutoGPT/wiki/Contributing)**, which is part of our [wiki](https://github.com/Significant-Gravitas/AutoGPT/wiki).
+
+Also check out our [Roadmap](https://github.com/Significant-Gravitas/AutoGPT/discussions/6971) for information about our priorities and associated tasks.
+
+## Contributing to the AutoGPT Platform Folder
+
+All contributions to [the autogpt_platform folder](https://github.com/Significant-Gravitas/AutoGPT/blob/master/autogpt_platform) will be under our [Contribution License Agreement](https://github.com/Significant-Gravitas/AutoGPT/blob/master/autogpt_platform/Contributor%20License%20Agreement%20(CLA).md). By making a pull request contributing to this folder, you agree to the terms of our CLA for your contribution. All contributions to other folders will be under the MIT license.
+
+## In short
+
+1. Avoid duplicate work, issues, PRs etc.
+2. We encourage you to collaborate with fellow community members on some of our bigger [todo's](https://github.com/Significant-Gravitas/AutoGPT/discussions/6971)!
+3. We highly recommend to post your idea and discuss it in the [dev channel](https://discord.com/channels/1092243196446249134/1095817829405704305).
+4. Create a draft PR when starting work on bigger changes.
+5. Adhere to the [Code Guidelines](https://github.com/Significant-Gravitas/AutoGPT/wiki/Contributing#code-guidelines)
+6. Clearly explain your changes when submitting a PR.
+7. Don't submit broken code: test/validate your changes.
+8. Avoid making unnecessary changes, especially if they're purely based on your personal preferences. Doing so is the maintainers' job. ;-)
+9. Please also consider contributing something other than code; see the [contribution guide](https://github.com/Significant-Gravitas/AutoGPT/wiki/Contributing) for options.
+
+If you wish to involve with the project (beyond just contributing PRs), please read the wiki page about [Catalyzing](https://github.com/Significant-Gravitas/AutoGPT/wiki/Catalyzing).
+
+In fact, why not just look through the whole wiki (it's only a few pages) and hop on our Discord. See you there! :-)
+
+The team @ AutoGPT https://discord.gg/autogpt
diff --git a/docs/classic/documentation/basic-usage.mdx b/docs/classic/documentation/basic-usage.mdx
new file mode 100644
index 000000000..e69de29bb
diff --git a/docs/classic/documentation/configuration.mdx b/docs/classic/documentation/configuration.mdx
new file mode 100644
index 000000000..e69de29bb
diff --git a/docs/classic/documentation/installation.mdx b/docs/classic/documentation/installation.mdx
new file mode 100644
index 000000000..e69de29bb
diff --git a/docs/classic/documentation/known-issues.mdx b/docs/classic/documentation/known-issues.mdx
new file mode 100644
index 000000000..e69de29bb
diff --git a/docs/classic/documentation/migration-guide-to-platform.mdx b/docs/classic/documentation/migration-guide-to-platform.mdx
new file mode 100644
index 000000000..e69de29bb
diff --git a/docs/classic/forge/components/agents.mdx b/docs/classic/forge/components/agents.mdx
new file mode 100644
index 000000000..1143d7f0f
--- /dev/null
+++ b/docs/classic/forge/components/agents.mdx
@@ -0,0 +1,37 @@
+---
+title: Agents
+---
+
+Agent is composed of [ Components](../components/) and responsible for executing pipelines and some additional logic. The base class for all agents is `BaseAgent`, it has the necessary logic to collect components and execute protocols.
+
+## Important methods
+
+`BaseAgent` provides two abstract methods needed for any agent to work properly: 1. `propose_action`: This method is responsible for proposing an action based on the current state of the agent, it returns `ThoughtProcessOutput`. 2\. `execute`: This method is responsible for executing the proposed action, returns `ActionResult`.
+
+## AutoGPT Agent
+
+`Agent` is the main agent provided by AutoGPT. It's a subclass of `BaseAgent`. It has all the [Built-in Components](/classic/forge/components/built-in-components). `Agent` implements the essential abstract methods from `BaseAgent`: `propose_action` and `execute`.
+
+## Building your own Agent
+
+The easiest way to build your own agent is to extend the `Agent` class and add additional components. By doing this you can reuse the existing components and the default logic for executing [ Protocols](/classic/forge/components/protocols).
+
+```py
+class MyComponent(AgentComponent):
+ pass
+
+class MyAgent(Agent):
+ def __init__(
+ self,
+ settings: AgentSettings,
+ llm_provider: MultiProvider
+ file_storage: FileStorage,
+ app_config: AppConfig,
+ ):
+ # Call the parent constructor to bring in the default components
+ super().__init__(settings, llm_provider, file_storage, app_config)
+ # Add your custom component
+ self.my_component = MyComponent()
+```
+
+For more customization, you can override the `propose_action` and `execute` or even subclass `BaseAgent` directly. This way you can have full control over the agent's components and behavior. Have a look at the [implementation of Agent](https://github.com/Significant-Gravitas/AutoGPT/tree/master/classic/original_autogpt/agents/agent.py) for more details.
diff --git a/docs/classic/forge/components/built-in-components.mdx b/docs/classic/forge/components/built-in-components.mdx
new file mode 100644
index 000000000..aafa346b6
--- /dev/null
+++ b/docs/classic/forge/components/built-in-components.mdx
@@ -0,0 +1,219 @@
+---
+title: Built-in Components
+---
+
+This page lists all [ Components](../components/) and [ Protocols](/classic/forge/components/protocols) they implement that are natively provided. They are used by the AutoGPT agent. Some components have additional configuration options listed in the table, see [Component configuration](../components/#component-configuration) to learn more.
+
+
+**Note**
+
+If a configuration field uses environment variable, it still can be passed using configuration model. ### Value from the configuration takes precedence over env var! Env var will be only applied if value in the configuration is not set.
+
+
+## `SystemComponent`
+
+Essential component to allow an agent to finish.
+
+### DirectiveProvider
+
+* Constraints about API budget
+
+### MessageProvider
+
+* Current time and date
+* Remaining API budget and warnings if budget is low
+
+### CommandProvider
+
+* `finish` used when task is completed
+
+## `UserInteractionComponent`
+
+Adds ability to interact with user in CLI.
+
+### CommandProvider
+* `ask_user` used to ask user for input
+
+## `FileManagerComponent`
+
+Adds ability to read and write persistent files to local storage, Google Cloud Storage or Amazon's S3. Necessary for saving and loading agent's state (preserving session).
+
+### `FileManagerConfiguration`
+
+| Config variable | Details | Type | Default |
+| --- | --- | --- | --- |
+| `storage_path` | Path to agent files, e.g. state | `str` | `agents/{agent_id}/`\[^1\] |
+| `workspace_path` | Path to files that agent has access to | `str` | `agents/{agent_id}/workspace/`\[^1\] |
+
+\[^1\] This option is set dynamically during component construction as opposed to by default inside the configuration model, `{agent_id}` is replaced with the agent's unique identifier.
+
+### DirectiveProvider
+
+* Resource information that it's possible to read and write files
+
+### CommandProvider
+
+* `read_file` used to read file
+* `write_file` used to write file
+* `list_folder` lists all files in a folder
+
+## `CodeExecutorComponent`
+
+Lets the agent execute non-interactive Shell commands and Python code. Python execution works only if Docker is available.
+
+### `CodeExecutorConfiguration`
+
+| Config variable | Details | Type | Default |
+| --- | --- | --- | --- |
+| `execute_local_commands` | Enable shell command execution | `bool` | `False` |
+| `shell_command_control` | Controls which list is used | `"allowlist" \\| "denylist"` | `"allowlist"` |
+| `shell_allowlist` | List of allowed shell commands | `List[str]` | `[]` |
+| `shell_denylist` | List of prohibited shell commands | `List[str]` | `[]` |
+| `docker_container_name` | Name of the Docker container used for code execution | `str` | `"agent_sandbox"` |
+
+All shell command configurations are expected to be for convience only. This component is not secure and should not be used in production environments. It is recommended to use more appropriate sandboxing.
+
+### CommandProvider
+
+* `execute_shell` execute shell command
+* `execute_shell_popen` execute shell command with popen
+* `execute_python_code` execute Python code
+* `execute_python_file` execute Python file
+
+## `ActionHistoryComponent`
+
+Keeps track of agent's actions and their outcomes. Provides their summary to the prompt.
+
+### `ActionHistoryConfiguration`
+
+| Config variable | Details | Type | Default |
+| --- | --- | --- | --- |
+| `llm_name` | Name of the llm model used to compress the history | `ModelName` | `"gpt-3.5-turbo"` |
+| `max_tokens` | Maximum number of tokens to use for the history summary | `int` | `1024` |
+| `spacy_language_model` | Language model used for summary chunking using spacy | `str` | `"en_core_web_sm"` |
+| `full_message_count` | Number of cycles to include unsummarized in the prompt | `int` | `4` |
+
+### MessageProvider
+
+* Agent's progress summary
+
+### AfterParse
+
+* Register agent's action
+
+### ExecutionFailure
+
+* Rewinds the agent's action, so it isn't saved
+
+### AfterExecute
+
+* Saves the agent's action result in the history
+
+## `GitOperationsComponent`
+
+Adds ability to iteract with git repositories and GitHub.
+
+### `GitOperationsConfiguration`
+
+| Config variable | Details | Type | Default |
+| --- | --- | --- | --- |
+| `github_username` | GitHub username, _ENV:_ `GITHUB_USERNAME` | `str` | `None` |
+| `github_api_key` | GitHub API key, _ENV:_ `GITHUB_API_KEY` | `str` | `None` |
+
+### CommandProvider
+
+* `clone_repository` used to clone a git repository
+
+## `ImageGeneratorComponent`
+
+Adds ability to generate images using various providers.
+
+### Hugging Face
+
+To use text-to-image models from Hugging Face, you need a Hugging Face API token. Link to the appropriate settings page: [Hugging Face > Settings > Tokens](https://huggingface.co/settings/tokens)
+
+### Stable Diffusion WebUI
+
+It is possible to use your own self-hosted Stable Diffusion WebUI with AutoGPT. ### Make sure you are running WebUI with `--api` enabled.
+
+### `ImageGeneratorConfiguration`
+
+| Config variable | Details | Type | Default |
+| --- | --- | --- | --- |
+| `image_provider` | Image generation provider | `"dalle" \\| "huggingface" \\| "sdwebui"` | `"dalle"` |
+| `huggingface_image_model` | Hugging Face image model, see [available models](https://huggingface.co/models?pipeline_tag=text-to-image) | `str` | `"CompVis/stable-diffusion-v1-4"` |
+| `huggingface_api_token` | Hugging Face API token, _ENV:_ `HUGGINGFACE_API_TOKEN` | `str` | `None` |
+| `sd_webui_url` | URL to self-hosted Stable Diffusion WebUI | `str` | `"http://localhost:7860"` |
+| `sd_webui_auth` | Basic auth for Stable Diffusion WebUI, _ENV:_ `SD_WEBUI_AUTH` | `str` of format `{username}:{password}` | `None` |
+
+### CommandProvider
+
+* `generate_image` used to generate an image given a prompt
+
+## `WebSearchComponent`
+
+Allows agent to search the web. Google credentials aren't required for DuckDuckGo. [Instructions how to set up Google API key](../../../classic/configuration/search/)
+
+### `WebSearchConfiguration`
+
+| Config variable | Details | Type | Default |
+| --- | --- | --- | --- |
+| `google_api_key` | Google API key, _ENV:_ `GOOGLE_API_KEY` | `str` | `None` |
+| `google_custom_search_engine_id` | Google Custom Search Engine ID, _ENV:_ `GOOGLE_CUSTOM_SEARCH_ENGINE_ID` | `str` | `None` |
+| `duckduckgo_max_attempts` | Maximum number of attempts to search using DuckDuckGo | `int` | `3` |
+| `duckduckgo_backend` | Backend to be used for DDG sdk | `"api" \\| "html" \\| "lite"` | `"api"` |
+
+### DirectiveProvider
+
+* Resource information that it's possible to search the web
+
+### CommandProvider
+
+* `search_web` used to search the web using DuckDuckGo
+* `google` used to search the web using Google, requires API key
+
+## `WebSeleniumComponent`
+
+Allows agent to read websites using Selenium.
+
+### `WebSeleniumConfiguration`
+
+| Config variable | Details | Type | Default |
+| --- | --- | --- | --- |
+| `llm_name` | Name of the llm model used to read websites | `ModelName` | `"gpt-3.5-turbo"` |
+| `web_browser` | Web browser used by Selenium | `"chrome" \\| "firefox" \\| "safari" \\| "edge"` | `"chrome"` |
+| `headless` | Run browser in headless mode | `bool` | `True` |
+| `user_agent` | User agent used by the browser | `str` | `"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"` |
+| `browse_spacy_language_model` | Spacy language model used for chunking text | `str` | `"en_core_web_sm"` |
+| `selenium_proxy` | Http proxy to use with Selenium | `str` | `None` |
+
+### DirectiveProvider
+* Resource information that it's possible to read websites
+
+### CommandProvider
+
+* `read_website` used to read a specific url and look for specific topics or answer a question
+
+## `ContextComponent`
+
+Adds ability to keep up-to-date file and folder content in the prompt.
+
+### MessageProvider
+
+* Content of elements in the context
+
+### CommandProvider
+
+* `open_file` used to open a file into context
+* `open_folder` used to open a folder into context
+* `close_context_item` remove an item from the context
+
+## `WatchdogComponent`
+
+Watches if agent is looping and switches to smart mode if necessary.
+
+### AfterParse
+
+* Investigates what happened and switches to smart mode if necessary
+
+December 4, 2024 April 22, 2024
diff --git a/docs/content/forge/components/commands.md b/docs/classic/forge/components/commands.mdx
similarity index 83%
rename from docs/content/forge/components/commands.md
rename to docs/classic/forge/components/commands.mdx
index 68f3f3c42..ad6816662 100644
--- a/docs/content/forge/components/commands.md
+++ b/docs/classic/forge/components/commands.mdx
@@ -1,6 +1,9 @@
-# 🛠️ Commands
+---
+title: Commands
+description: "Commands are a way for the agent to do anything; e.g. interact with the user or APIs and use tools."
+---
-Commands are a way for the agent to do anything; e.g. interact with the user or APIs and use tools. They are provided by components that implement the `CommandProvider` [⚙️ Protocol](./protocols.md). Commands are functions that can be called by the agent, they can have parameters and return values that will be seen by the agent.
+ They are provided by components that implement the `CommandProvider` [ Protocol](/classic/forge/components/protocols). Commands are functions that can be called by the agent, they can have parameters and return values that will be seen by the agent.
```py
class CommandProvider(Protocol):
@@ -29,16 +32,16 @@ The easiest and recommended way to provide a command is to use `command` decorat
required=True,
)})
def multiply(self, a: int, b: int) -> str:
- """
- Multiplies two numbers.
-
- Args:
- a: First number
- b: Second number
+ """
+ Multiplies two numbers.
- Returns:
- Result of multiplication
- """
+ Args:
+ a: First number
+ b: Second number
+
+ Returns:
+ Result of multiplication
+ """
return str(a * b)
```
@@ -77,7 +80,6 @@ def get_commands(self) -> Iterator[Command]:
If you don't want to use the decorator, you can create a `Command` object directly.
```py
-
def multiply(self, a: int, b: int) -> str:
return str(a * b)
@@ -99,4 +101,4 @@ def get_commands(self) -> Iterator[Command]:
)),
],
)
-```
\ No newline at end of file
+```
diff --git a/docs/classic/forge/components/components.mdx b/docs/classic/forge/components/components.mdx
new file mode 100644
index 000000000..b736d6f4c
--- /dev/null
+++ b/docs/classic/forge/components/components.mdx
@@ -0,0 +1,227 @@
+---
+title: Components
+description: "Components can be used to implement various functionalities like providing messages to the prompt, executing code, or interacting with external services. They can be enabled or disabled, ordered, and can rely on each other."
+---
+
+
+Components are the building blocks of [ Agents](/classic/forge/components/agents). They are classes inheriting `AgentComponent` or implementing one or more [ Protocols](/classic/forge/components/protocols) that give agent additional abilities or processing.
+
+
+Components assigned in the agent's `__init__` via `self` are automatically detected upon the agent's instantiation. For example inside `__init__`: `self.my_component = MyComponent()`. You can use any valid Python variable name, what matters for the component to be detected is its type (`AgentComponent` or any protocol inheriting from it).
+
+Visit [Built-in Components](/classic/forge/components/built-in-components) to see what components are available out of the box.
+
+```py
+from forge.agent import BaseAgent
+from forge.agent.components import AgentComponent
+
+class HelloComponent(AgentComponent):
+ pass
+
+class SomeComponent(AgentComponent):
+ def __init__(self, hello_component: HelloComponent):
+ self.hello_component = hello_component
+
+class MyAgent(BaseAgent):
+ def __init__(self):
+ # These components will be automatically discovered and used
+ self.hello_component = HelloComponent()
+ # We pass HelloComponent to SomeComponent
+ self.some_component = SomeComponent(self.hello_component)
+```
+
+## Component configuration
+
+Each component can have its own configuration defined using a regular pydantic `BaseModel`. To ensure the configuration is loaded from the file correctly, the component must inherit from `ConfigurableComponent[BM]` where `BM` is the configuration model it uses. `ConfigurableComponent` provides a `config` attribute that holds the configuration instance. It's possible to either set the `config` attribute directly or pass the configuration instance to the component's constructor. Extra configuration (i.e. for components that are not part of the agent) can be passed and will be silently ignored. Extra config won't be applied even if the component is added later. To see the configuration of built-in components visit [Built-in Components](/classic/forge/components/built-in-components).
+
+```py
+from pydantic import BaseModel
+from forge.agent.components import ConfigurableComponent
+
+class MyConfig(BaseModel):
+ some_value: str
+
+class MyComponent(AgentComponent, ConfigurableComponent[MyConfig]):
+ def __init__(self, config: MyConfig):
+ super().__init__(config)
+ # This has the same effect as above:
+ # self.config = config
+
+ def get_some_value(self) -> str:
+ # Access the configuration like a regular model
+ return self.config.some_value
+```
+
+### Sensitive information
+
+While it's possible to pass sensitive data directly in code to the configuration it's recommended to use `UserConfigurable(from_env="ENV_VAR_NAME", exclude=True)` field for sensitive data like API keys. The data will be loaded from the environment variable but keep in mind that value passed in code takes precedence. All fields, even excluded ones (`exclude=True`) will be loaded when the configuration is loaded from the file. Exclusion allows you to skip them during _serialization_, non excluded `SecretStr` will be serialized literally as a `"**********"` string.
+
+```py
+from pydantic import BaseModel, SecretStr
+from forge.models.config import UserConfigurable
+
+class SensitiveConfig(BaseModel):
+ api_key: SecretStr = UserConfigurable(from_env="API_KEY", exclude=True)
+```
+
+### Configuration serialization
+`BaseAgent` provides two methods: 1. `dump_component_configs`: Serializes all components' configurations as json string. 1. `load_component_configs`: Deserializes json string to configuration and applies it.
+
+### JSON configuration
+
+You can specify a JSON file (e.g. `config.json`) to use for the configuration when launching an agent. This file contains settings for individual [Components](/classic/forge/components/introduction) that AutoGPT uses. To specify the file use `--component-config-file` CLI option, for example to use `config.json`:
+
+```bash
+./autogpt.sh run --component-config-file config.json
+```
+
+
+**Note**
+
+If you're using Docker to run AutoGPT, you need to mount or copy the configuration file to the container. See [Docker Guide](/classic/setup/docker) for more information.
+
+
+### Example JSON configuration
+
+You can copy configuration you want to change, for example to `classic/original_autogpt/config.json` and modify it to your needs. _Most configuration has default values, it's better to set only values you want to modify._ You can see the available configuration fields and default values in [Build-in Components](/classic/forge/components/built-in-components). You can set sensitive variables in the `.json` file as well but it's recommended to use environment variables instead.
+
+```json
+{
+ "CodeExecutorConfiguration": {
+ "execute_local_commands": false,
+ "shell_command_control": "allowlist",
+ "shell_allowlist": ["cat", "echo"],
+ "shell_denylist": [],
+ "docker_container_name": "agent_sandbox"
+ },
+ "FileManagerConfiguration": {
+ "storage_path": "agents/AutoGPT/",
+ "workspace_path": "agents/AutoGPT/workspace"
+ },
+ "GitOperationsConfiguration": {
+ "github_username": null
+ },
+ "ActionHistoryConfiguration": {
+ "llm_name": "gpt-3.5-turbo",
+ "max_tokens": 1024,
+ "spacy_language_model": "en_core_web_sm"
+ },
+ "ImageGeneratorConfiguration": {
+ "image_provider": "dalle",
+ "huggingface_image_model": "CompVis/stable-diffusion-v1-4",
+ "sd_webui_url": "http://localhost:7860"
+ },
+ "WebSearchConfiguration": {
+ "duckduckgo_max_attempts": 3
+ },
+ "WebSeleniumConfiguration": {
+ "llm_name": "gpt-3.5-turbo",
+ "web_browser": "chrome",
+ "headless": true,
+ "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",
+ "browse_spacy_language_model": "en_core_web_sm"
+ }
+}
+```
+
+## Ordering components
+
+The execution order of components is important because some may depend on the results of the previous ones. **By default, components are ordered alphabetically.**
+
+### Ordering individual components
+
+You can order a single component by passing other components (or their types) to the `run_after` method. This way you can ensure that the component will be executed after the specified one. The `run_after` method returns the component itself, so you can call it when assigning the component to a variable:
+
+```js
+class MyAgent(Agent):
+ def __init__(self):
+ self.hello_component = HelloComponent()
+ self.calculator_component = CalculatorComponent().run_after(self.hello_component)
+ # This is equivalent to passing a type:
+ # self.calculator_component = CalculatorComponent().run_after(HelloComponent)`
+```
+
+**Warning**
+
+Be sure not to make circular dependencies when ordering components!
+
+
+### Ordering all components
+
+You can also order all components by setting `self.components` list in the agent's `__init__` method. This way ensures that there's no circular dependencies and any `run_after` calls are ignored.
+
+
+**Warning**
+
+Be sure to include all components - by setting `self.components` list, you're overriding the default behavior of discovering components automatically. Since it's usually not intended agent will inform you in the terminal if some components were skipped.
+
+
+```py
+class MyAgent(Agent):
+ def __init__(self):
+ self.hello_component = HelloComponent()
+ self.calculator_component = CalculatorComponent()
+ # Explicitly set components list
+ self.components = [self.hello_component, self.calculator_component]
+```
+
+## Disabling components
+
+You can control which components are enabled by setting their `_enabled` attribute. Components are _enabled_ by default. Either provide a `bool` value or a `Callable[[], bool]`, will be checked each time the component is about to be executed. This way you can dynamically enable or disable components based on some conditions. You can also provide a reason for disabling the component by setting `_disabled_reason`. The reason will be visible in the debug information.
+
+```py
+class DisabledComponent(MessageProvider):
+ def __init__(self):
+ # Disable this component
+ self._enabled = False
+ self._disabled_reason = "This component is disabled because of reasons."
+
+ # Or disable based on some condition, either statically...:
+ self._enabled = self.some_property is not None
+ # ... or dynamically:
+ self._enabled = lambda: self.some_property is not None
+
+ # This method will never be called
+ def get_messages(self) -> Iterator[ChatMessage]:
+ yield ChatMessage.user("This message won't be seen!")
+
+ def some_condition(self) -> bool:
+ return False
+```
+If you don't want the component at all, you can just remove it from the agent's `__init__` method. If you want to remove components you inherit from the parent class you can set the relevant attribute to `None`:
+
+
+**Warning**
+
+Be careful when removing components that are required by other components. This may lead to errors and unexpected behavior.
+
+
+```py
+class MyAgent(Agent):
+ def __init__(self):
+ super().__init__(...)
+ # Disable WatchdogComponent that is in the parent class
+ self.watchdog = None`
+```
+## Exceptions
+
+Custom errors are provided which can be used to control the execution flow in case something went wrong. All those errors can be raised in protocol methods and will be caught by the agent.
+By default agent will retry three times and then re-raise an exception if it's still not resolved. All passed arguments are automatically handled and the values are reverted when needed. All errors accept an optional `str` message. There are following errors ordered by increasing broadness:
+
+1. `ComponentEndpointError`: A single endpoint method failed to execute. Agent will retry the execution of this endpoint on the component.
+2. `EndpointPipelineError`: A pipeline failed to execute. Agent will retry the execution of the endpoint for all components.
+3. `ComponentSystemError`: Multiple pipelines failed.
+
+**Example**
+
+`from forge.agent.components import ComponentEndpointError
+from forge.agent.protocols import MessageProvider
+
+#### Example of raising an error
+```py
+class MyComponent(MessageProvider):
+ def get_messages(self) -> Iterator[ChatMessage]:
+ # This will cause the component to always fail
+ # and retry 3 times before re-raising the exception
+ raise ComponentEndpointError("Endpoint error!")`
+```
diff --git a/docs/content/forge/components/creating-components.md b/docs/classic/forge/components/creating-components.mdx
similarity index 66%
rename from docs/content/forge/components/creating-components.md
rename to docs/classic/forge/components/creating-components.mdx
index 6b3c0c01f..bc95900d0 100644
--- a/docs/content/forge/components/creating-components.md
+++ b/docs/classic/forge/components/creating-components.mdx
@@ -1,19 +1,21 @@
-# Creating Components
+---
+title: Creating Components
+---
## The minimal component
Components can be used to implement various functionalities like providing messages to the prompt, executing code, or interacting with external services.
-*Component* is a class that inherits from `AgentComponent` OR implements one or more *protocols*. Every *protocol* inherits `AgentComponent`, so your class automatically becomes a *component* once you inherit any *protocol*.
+_Component_ is a class that inherits from `AgentComponent` OR implements one or more _protocols_. Every _protocol_ inherits `AgentComponent`, so your class automatically becomes a _component_ once you inherit any _protocol_.
```py
class MyComponent(AgentComponent):
pass
```
-This is already a valid component, but it doesn't do anything yet. To add some functionality to it, you need to implement one or more *protocols*.
+This is already a valid component, but it doesn't do anything yet. To add some functionality to it, you need to implement one or more _protocols_.
-Let's create a simple component that adds "Hello World!" message to the agent's prompt. To do this we need to implement `MessageProvider` *protocol* in our component. `MessageProvider` is an interface with `get_messages` method:
+Let's create a simple component that adds "Hello World!" message to the agent's prompt. To do this we need to implement `MessageProvider` _protocol_ in our component. `MessageProvider` is an interface with `get_messages` method:
```py
# No longer need to inherit AgentComponent, because MessageProvider already does it
@@ -29,12 +31,11 @@ class MyAgent(Agent):
self.hello_component = HelloComponent()
```
-`get_messages` will called by the agent each time it needs to build a new prompt and the yielded messages will be added accordingly.
+`get_messages` will called by the agent each time it needs to build a new prompt and the yielded messages will be added accordingly.
## Passing data to and between components
-Since components are regular classes you can pass data (including other components) to them via the `__init__` method.
-For example we can pass a config object and then retrieve an API key from it when needed:
+Since components are regular classes you can pass data (including other components) to them via the `__init__` method. For example we can pass a config object and then retrieve an API key from it when needed:
```py
class DataComponent(MessageProvider):
@@ -48,16 +49,16 @@ class DataComponent(MessageProvider):
yield ChatMessage.system("API key not found!")
```
-!!! note
- Component-specific configuration handling isn't implemented yet.
+
+**Note**
+
+Component-specific configuration handling isn't implemented yet.
+
+
## Configuring components
-Components can be configured using a pydantic model.
-To make component configurable, it must inherit from `ConfigurableComponent[BM]` where `BM` is the configuration class inheriting from pydantic's `BaseModel`.
-You should pass the configuration instance to the `ConfigurableComponent`'s `__init__` or set its `config` property directly.
-Using configuration allows you to load confugration from a file, and also serialize and deserialize it easily for any agent.
-To learn more about configuration, including storing sensitive information and serialization see [Component Configuration](./components.md#component-configuration).
+Components can be configured using a pydantic model. To make component configurable, it must inherit from `ConfigurableComponent[BM]` where `BM` is the configuration class inheriting from pydantic's `BaseModel`. You should pass the configuration instance to the `ConfigurableComponent`'s `__init__` or set its `config` property directly. Using configuration allows you to load confugration from a file, and also serialize and deserialize it easily for any agent. To learn more about configuration, including storing sensitive information and serialization see [Component Configuration](../components/#component-configuration).
```py
# Example component configuration
@@ -103,54 +104,51 @@ class MultiplicatorComponent(CommandProvider):
required=True,
)})
def multiply(self, a: int, b: int) -> str:
- """
- Multiplies two numbers.
-
- Args:
- a: First number
- b: Second number
+ """
+ Multiplies two numbers.
- Returns:
- Result of multiplication
- """
+ Args:
+ a: First number
+ b: Second number
+
+ Returns:
+ Result of multiplication
+ """
return str(a * b)
```
-To learn more about commands see [🛠️ Commands](./commands.md).
+To learn more about commands see [ Commands](/classic/forge/components/commands).
## Prompt structure
-After components provided all necessary data, the agent needs to build the final prompt that will be send to a llm.
-Currently, `PromptStrategy` (*not* a protocol) is responsible for building the final prompt.
+After components provided all necessary data, the agent needs to build the final prompt that will be send to a llm. Currently, `PromptStrategy` (_not_ a protocol) is responsible for building the final prompt.
-If you want to change the way the prompt is built, you need to create a new `PromptStrategy` class, and then call relevant methods in your agent class.
-You can have a look at the default strategy used by the AutoGPT Agent: [OneShotAgentPromptStrategy](https://github.com/Significant-Gravitas/AutoGPT/tree/master/classic/original_autogpt/agents/prompt_strategies/one_shot.py), and how it's used in the [Agent](https://github.com/Significant-Gravitas/AutoGPT/tree/master/classic/original_autogpt/agents/agent.py) (search for `self.prompt_strategy`).
+If you want to change the way the prompt is built, you need to create a new `PromptStrategy` class, and then call relevant methods in your agent class. You can have a look at the default strategy used by the AutoGPT Agent: [OneShotAgentPromptStrategy](https://github.com/Significant-Gravitas/AutoGPT/tree/master/classic/original_autogpt/agents/prompt_strategies/one_shot.py), and how it's used in the [Agent](https://github.com/Significant-Gravitas/AutoGPT/tree/master/classic/original_autogpt/agents/agent.py) (search for `self.prompt_strategy`).
## Example `UserInteractionComponent`
-Let's create a slightly simplified version of the component that is used by the built-in agent.
-It gives an ability for the agent to ask user for input in the terminal.
+Let's create a slightly simplified version of the component that is used by the built-in agent. It gives an ability for the agent to ask user for input in the terminal.
-1. Create a class for the component that inherits from `CommandProvider`.
+1. Create a class for the component that inherits from `CommandProvider`.
```py
class MyUserInteractionComponent(CommandProvider):
- """Provides commands to interact with the user."""
+ """Provides commands to interact with the user."""
pass
```
-2. Implement command method that will ask user for input and return it.
+2. Implement command method that will ask user for input and return it.
```py
def ask_user(self, question: str) -> str:
- """If you need more details or information regarding the given goals,
- you can ask the user for input."""
+ """If you need more details or information regarding the given goals,
+ you can ask the user for input."""
print(f"\nQ: {question}")
resp = input("A:")
return f"The user's answer: '{resp}'"
```
-3. The command needs to be decorated with `@command`.
+3. The command needs to be decorated with `@command`.
```py
@command(
@@ -163,21 +161,21 @@ It gives an ability for the agent to ask user for input in the terminal.
},
)
def ask_user(self, question: str) -> str:
- """If you need more details or information regarding the given goals,
- you can ask the user for input."""
+ """If you need more details or information regarding the given goals,
+ you can ask the user for input."""
print(f"\nQ: {question}")
resp = input("A:")
return f"The user's answer: '{resp}'"
```
-4. We need to implement `CommandProvider`'s `get_commands` method to yield the command.
+4. We need to implement `CommandProvider`'s `get_commands` method to yield the command.
```py
def get_commands(self) -> Iterator[Command]:
yield self.ask_user
```
-5. Since agent isn't always running in the terminal or interactive mode, we need to disable this component by setting `self._enabled=False` when it's not possible to ask for user input.
+5. Since agent isn't always running in the terminal or interactive mode, we need to disable this component by setting `self._enabled=False` when it's not possible to ask for user input.
```py
def __init__(self, interactive_mode: bool):
@@ -185,12 +183,13 @@ It gives an ability for the agent to ask user for input in the terminal.
self._enabled = interactive_mode
```
+
The final component should look like this:
```py
# 1.
class MyUserInteractionComponent(CommandProvider):
- """Provides commands to interact with the user."""
+ """Provides commands to interact with the user."""
# We pass config to check if we're in noninteractive mode
def __init__(self, interactive_mode: bool):
@@ -218,14 +217,13 @@ class MyUserInteractionComponent(CommandProvider):
# 2.
# Command name will be its method name and description will be its docstring
def ask_user(self, question: str) -> str:
- """If you need more details or information regarding the given goals,
- you can ask the user for input."""
+ """If you need more details or information regarding the given goals,
+ you can ask the user for input."""
print(f"\nQ: {question}")
resp = input("A:")
- return f"The user's answer: '{resp}'"
+ return f"The user's answer: '{resp}'"`
```
-
-Now if we want to use our user interaction *instead of* the default one we need to somehow remove the default one (if our agent inherits from `Agent` the default one is inherited) and add our own. We can simply override the `user_interaction` in `__init__` method:
+Now if we want to use our user interaction _instead of_ the default one we need to somehow remove the default one (if our agent inherits from `Agent` the default one is inherited) and add our own. We can simply override the `user_interaction` in `__init__` method:
```py
class MyAgent(Agent):
@@ -241,7 +239,6 @@ class MyAgent(Agent):
# Disable the default user interaction component by overriding it
self.user_interaction = MyUserInteractionComponent()
```
-
Alternatively we can disable the default component by setting it to `None`:
```py
@@ -258,13 +255,13 @@ class MyAgent(Agent):
# Disable the default user interaction component
self.user_interaction = None
# Add our own component
- self.my_user_interaction = MyUserInteractionComponent(app_config)
-```
+ self.my_user_interaction = MyUserInteractionComponent(app_config
+ ```
## Learn more
The best place to see more examples is to look at the built-in components in the [classic/original_autogpt/components](https://github.com/Significant-Gravitas/AutoGPT/tree/master/classic/original_autogpt/components/) and [classic/original_autogpt/commands](https://github.com/Significant-Gravitas/AutoGPT/tree/master/classic/original_autogpt/commands/) directories.
-Guide on how to extend the built-in agent and build your own: [🤖 Agents](./agents.md)
-Order of some components matters, see [🧩 Components](./components.md) to learn more about components and how they can be customized.
-To see built-in protocols with accompanying examples visit [⚙️ Protocols](./protocols.md).
+Guide on how to extend the built-in agent and build your own: [ Agents](/classic/forge/components/agents)
+Order of some components matters, see [ Components](../components/) to learn more about components and how they can be customized.
+To see built-in protocols with accompanying examples visit [ Protocols](/classic/forge/components/protocols).
diff --git a/docs/classic/forge/components/introduction.mdx b/docs/classic/forge/components/introduction.mdx
new file mode 100644
index 000000000..b7ee755a4
--- /dev/null
+++ b/docs/classic/forge/components/introduction.mdx
@@ -0,0 +1,25 @@
+---
+title: Component Agents
+---
+
+
+**Important**
+
+[Legacy plugins](https://github.com/Significant-Gravitas/Auto-GPT-Plugins) no longer work with AutoGPT. They have been replaced by components, although we're still working on a new system to load plug-in components.
+
+
+This guide explains the component-based architecture of AutoGPT agents. It's a new way of building agents that is more flexible and easier to extend. Components replace some agent's logic and plugins with a more modular and composable system.
+
+Agent is composed of _components_, and each _component_ implements a range of _protocols_ (interfaces), each one providing a specific functionality, e.g. additional commands or messages. Each _protocol_ is handled in a specific order, defined by the agent. This allows for a clear separation of concerns and a more modular design.
+
+This system is simple, flexible, and doesn't hide any data - anything can still be passed or accessed directly from or between components.
+
+### Definitions & Guides
+
+See [Creating Components](/classic/forge/components/creating-components) to get started! Or you can explore the following topics in detail:
+
+* [ Component](../components/): a class that implements one or more _protocols_. It can be added to an agent to provide additional functionality. See what's already provided in [Built-in Components](/classic/forge/components/built-in-components).
+* [ Protocol](/classic/forge/components/protocols): an interface that defines a set of methods that a component must implement. Protocols are used to group related functionality.
+* [ Command](/classic/forge/components/commands): enable _agent_ to interact with user and tools.
+* [ Agent](/classic/forge/components/agents): a class that is composed of components. It's responsible for executing pipelines and managing the components.
+* **Pipeline**: a sequence of method calls on components. Pipelines are used to execute a series of actions in a specific order. As of now there's no formal class for a pipeline, it's just a sequence of method calls on components. There are two default pipelines implemented in the default agent: `propose_action` and `execute`. See [ Agent](/classic/forge/components/agents) to learn more.
diff --git a/docs/content/forge/components/protocols.md b/docs/classic/forge/components/protocols.mdx
similarity index 83%
rename from docs/content/forge/components/protocols.md
rename to docs/classic/forge/components/protocols.mdx
index 9fe75ecdd..3786bca33 100644
--- a/docs/content/forge/components/protocols.md
+++ b/docs/classic/forge/components/protocols.mdx
@@ -1,6 +1,9 @@
-# ⚙️ Protocols
+---
+title: Protocols
+description: "Protocols are _interfaces_ implemented by [Components](../components/) used to group related functionality."
+---
-Protocols are *interfaces* implemented by [Components](./components.md) used to group related functionality. Each protocol needs to be handled explicitly by the agent at some point of the execution. We provide a comprehensive list of built-in protocols that are already handled in the built-in `Agent`, so when you inherit from the base agent all built-in protocols will work!
+Each protocol needs to be handled explicitly by the agent at some point of the execution. We provide a comprehensive list of built-in protocols that are already handled in the built-in `Agent`, so when you inherit from the base agent all built-in protocols will work!
**Protocols are listed in the order of the default execution.**
@@ -21,27 +24,23 @@ class DirectiveProvider(AgentComponent):
return iter([])
def get_best_practices(self) -> Iterator[str]:
- return iter([])
+ return iter([])`
```
-
**Example** A web-search component can provide a resource information. Keep in mind that this actually doesn't allow the agent to access the internet. To do this a relevant `Command` needs to be provided.
```py
class WebSearchComponent(DirectiveProvider):
def get_resources(self) -> Iterator[str]:
yield "Internet access for searches and information gathering."
- # We can skip "get_constraints" and "get_best_practices" if they aren't needed
+ # We can skip "get_constraints" and "get_best_practices" if they aren't needed`
```
-
### `CommandProvider`
Provides a command that can be executed by the agent.
-```py
-class CommandProvider(AgentComponent):
+`class CommandProvider(AgentComponent):
def get_commands(self) -> Iterator[Command]:
- ...
-```
+ ...`
The easiest way to provide a command is to use `command` decorator on a component method and then yield the method. Each command needs a name, description and a parameter schema using `JSONSchema`. By default method name is used as a command name, and first part of docstring for the description (before `Args:` or `Returns:`) and schema can be provided in the decorator.
@@ -52,7 +51,6 @@ from forge.agent import CommandProvider, Component
from forge.command import command
from forge.models.json_schema import JSONSchema
-
class CalculatorComponent(CommandProvider):
get_commands(self) -> Iterator[Command]:
yield self.multiply
@@ -69,30 +67,27 @@ class CalculatorComponent(CommandProvider):
required=True,
)})
def multiply(self, a: int, b: int) -> str:
- """
- Multiplies two numbers.
-
- Args:
- a: First number
- b: Second number
+ """
+ Multiplies two numbers.
- Returns:
- Result of multiplication
- """
- return str(a * b)
+ Args:
+ a: First number
+ b: Second number
+
+ Returns:
+ Result of multiplication
+ """
+ return str(a * b)`
```
-
The agent will be able to call this command, named `multiply` with two arguments and will receive the result. The command description will be: `Multiplies two numbers.`
-To learn more about commands see [🛠️ Commands](./commands.md).
+To learn more about commands see [ Commands](/classic/forge/components/commands).
## Order-dependent protocols
-The order of components implementing order-dependent protocols is important.
-Some components may depend on the results of components before them.
+The order of components implementing order-dependent protocols is important. Some components may depend on the results of components before them.
### `MessageProvider`
-
Yields messages that will be added to the agent's prompt. You can use either `ChatMessage.user()`: this will interpreted as a user-sent message or `ChatMessage.system()`: that will be more important.
```py
@@ -103,7 +98,7 @@ class MessageProvider(AgentComponent):
**Example** Component that provides a message to the agent's prompt.
-```py
+```
class HelloComponent(MessageProvider):
def get_messages(self) -> Iterator[ChatMessage]:
yield ChatMessage.user("Hello World!")
@@ -127,7 +122,7 @@ class LoggerComponent(AfterParse):
logger.info(f"Response: {response}")
```
-### `ExecutionFailure`
+### `ExecutionFailure`
Protocol called when the execution of the command fails.
diff --git a/docs/classic/forge/getting-started/index.mdx b/docs/classic/forge/getting-started/index.mdx
new file mode 100644
index 000000000..08c64dec9
--- /dev/null
+++ b/docs/classic/forge/getting-started/index.mdx
@@ -0,0 +1,39 @@
+---
+title: AutoGPT Forge
+---
+
+## Build your own Agent
+Warning
+
+
+**warning**
+
+ If you are trying to use AutoGPT this is not the tutorial for you! You need to use [this one](/classic/setup/index)
+
+
+Forge is a ready-to-go template for _your_ agent application. All the boilerplate code is already handled, letting you channel all your creativity into the things that set _your_ agent apart.
+
+### **Why AutoGPT Forge?
+
+* **No More Boilerplate!** \- Don't let the mundane tasks stop you. Fork and build without the headache of starting from scratch!
+* **Brain-centric Development!** \- All the tools you need so you can spend 100% of your time on what matters - crafting the brain of your AI!
+* **Tooling ecosystem!** \- We work with the best in class tools to bring you the best experience possible!
+
+
+### **Get Started!**
+
+The best way to get started is to fork or download the AutoGPT repository and look at the example agent in `classic/forge/agent/forge_agent.py`. This can work as a starting point for your own agent. Agents are built using _components_ which provide different functionality, see the [Component Introduction](../components/introduction/). You can find built-in components in `classic/forge/components/`.
+
+
+**Warning**
+
+The tutorial series below is out of date.
+
+
+The getting started [tutorial series](https://aiedge.medium.com/autogpt-forge-e3de53cc58ec) will guide you through the process of setting up your project all the way through to building a generalist agent.
+
+1. [AutoGPT Forge: A Comprehensive Guide to Your First Steps](https://aiedge.medium.com/autogpt-forge-a-comprehensive-guide-to-your-first-steps-a1dfdf46e3b4)
+2. [AutoGPT Forge: The Blueprint of an AI Agent](https://aiedge.medium.com/autogpt-forge-the-blueprint-of-an-ai-agent-75cd72ffde6)
+3. [AutoGPT Forge: Interacting with your Agent](https://aiedge.medium.com/autogpt-forge-interacting-with-your-agent-1214561b06b)
+4. [AutoGPT Forge: Crafting Intelligent Agent Logic](https://medium.com/@aiedge/autogpt-forge-crafting-intelligent-agent-logic-bc5197b14cb4)
+
diff --git a/docs/classic/index.mdx b/docs/classic/index.mdx
new file mode 100644
index 000000000..eb0df715e
--- /dev/null
+++ b/docs/classic/index.mdx
@@ -0,0 +1,126 @@
+---
+title: AutoGPT Agent
+description: "AutoGPT was conceived when OpenAI published their GPT-4 model accompanied by a paper outlining the advanced reasoning and task-solving abilities of the model."
+sidebarTitle: Introduction
+---
+
+
+
+
+
+
+
+**Location:** `classic/original_autogpt/` in the GitHub repo
+
+The concept was (and still is) fairly simple: let an LLM decide what to do over and over, while feeding the results of its actions back into the prompt. This allows the program to iteratively and incrementally work towards its objective.
+
+The fact that this program is able to execute actions on behalf of its user makes it an **agent**. In the case of AutoGPT, the user still has to authorize every action, but as the project progresses we'll be able to give the agent more autonomy and only require consent for select actions.
+
+AutoGPT is a **generalist agent**, meaning it is not designed with a specific task in mind. Instead, it is designed to be able to execute a wide range of tasks across many disciplines, as long as it can be done on a computer.
+
+## Coming soon
+
+* How does AutoGPT work?
+* What can I use AutoGPT for?
+* What does the future of AutoGPT look like?
+
+## AutoGPT Classic Documentation
+
+Welcome to the AutoGPT Classic Documentation.
+
+The AutoGPT project consists of four main components:
+
+* The [Agent](#agent) – also known as just "AutoGPT"
+* The [Benchmark](#benchmark) – AKA `agbenchmark`
+* The [Forge](#forge)
+* The [Frontend](#frontend)
+
+To tie these together, we also have a [CLI](#cli) at the root of the project.
+
+## Agent
+
+
+
+
+
+
+The heart of AutoGPT, and the project that kicked it all off: a semi-autonomous agent powered by LLMs to execute any task for you*.
+
+We continue to develop this project with the goal of providing access to AI assistance to the masses, and building the future transparently and together.
+
+* **Explore** \- See what AI can do and be inspired by a glimpse of the future.
+
+* **Build with us** \- We welcome any input, whether it's code or ideas for new features or improvements! Join us on [Discord](https://discord.gg/autogpt) and find out how you can join in on the action.
+
+
+\* it isn't quite there yet, but that is the ultimate goal that we are still pursuing
+
+
+## Benchmark
+
+**[ Readme](https://github.com/Significant-Gravitas/AutoGPT/blob/master/classic/benchmark/README.md)**
+
+Measure your agent's performance! The `agbenchmark` can be used with any agent that supports the agent protocol, and the integration with the project's [CLI](#cli) makes it even easier to use with AutoGPT and forge-based agents. The benchmark offers a stringent testing environment. Our framework allows for autonomous, objective performance evaluations, ensuring your agents are primed for real-world action.
+
+* [**`agbenchmark`**](https://pypi.org/project/agbenchmark/) on Pypi
+
+* **Agent Protocol Standardization** \- AutoGPT uses the agent protocol from the AI Engineer Foundation to ensure compatibility with many agents, both from within and outside the project.
+
+## Forge
+
+
+
+
+
+
+Forge your own agent! The Forge is a ready-to-go template for your agent application. All the boilerplate code is already handled, letting you channel all your creativity into the things that set _your_ agent apart.
+
+* **Building with Ease** \- We've set the groundwork so you can focus on your agent's personality and capabilities. Comprehensive tutorials are available [here](https://aiedge.medium.com/autogpt-forge-e3de53cc58ec).
+
+
+## Frontend
+
+**[ Readme](https://github.com/Significant-Gravitas/AutoGPT/blob/master/classic/frontend/README.md)**
+
+An easy-to-use and open source frontend for any Agent Protocol-compliant agent.
+
+* **User-Friendly Interface** \- Manage your agents effortlessly.
+
+* **Seamless Integration** \- Smooth connectivity between your agent and our benchmarking system.
+
+
+## CLI
+
+The project CLI makes it easy to use all of the components in the repo, separately or together. To install its dependencies, simply run `./run setup`, and you're ready to go!
+
+```bash
+$ ./run
+Usage: cli.py [OPTIONS] COMMAND [ARGS]...
+
+Options:
+ --help Show this message and exit.
+
+Commands:
+ agent Commands to create, start and stop agents
+ benchmark Commands to start the benchmark and list tests and categories
+ setup Installs dependencies needed for your system.
+```
+Common commands:
+
+* `./run agent start autogpt` – [runs](/classic/usage#serve-agent-protocol-mode-with-ui) the AutoGPT agent
+* `./run agent create ` – creates a new Forge-based agent project at `agents/`
+* `./run benchmark start ` – benchmarks the specified agent
+
+* * *
+
+Join the AutoGPT Discord server for any queries: [discord.gg/autogpt](https://discord.gg/autogpt)
+
+### Glossary of Terms
+
+* **Repository**: Space where your project resides.
+* **Forking**: Copying a repository under your account.
+* **Cloning**: Making a local copy of a repository.
+* **Agent**: The AutoGPT you'll create and develop.
+* **Benchmarking**: Testing your agent's skills in the Forge.
+* **Forge**: The template for building your AutoGPT agent.
+* **Frontend**: The UI for tasks, logs, and task history.
diff --git a/docs/classic/readme-2.mdx b/docs/classic/readme-2.mdx
new file mode 100644
index 000000000..fd164441f
--- /dev/null
+++ b/docs/classic/readme-2.mdx
@@ -0,0 +1,4 @@
+---
+title: Readme
+url: https://github.com/Significant-Gravitas/AutoGPT/blob/master/classic/frontend/README.md
+---
diff --git a/docs/classic/readme.mdx b/docs/classic/readme.mdx
new file mode 100644
index 000000000..09bf07c55
--- /dev/null
+++ b/docs/classic/readme.mdx
@@ -0,0 +1,4 @@
+---
+title: Readme
+url: https://github.com/Significant-Gravitas/AutoGPT/blob/master/classic/benchmark/README.md
+---
diff --git a/docs/content/classic/setup/docker.md b/docs/classic/setup/docker.mdx
similarity index 84%
rename from docs/content/classic/setup/docker.md
rename to docs/classic/setup/docker.mdx
index 299872346..90e714e2a 100644
--- a/docs/content/classic/setup/docker.md
+++ b/docs/classic/setup/docker.mdx
@@ -1,6 +1,12 @@
-# AutoGPT + Docker guide
+---
+title: "AutoGPT + Docker guide"
+sidebarTitle: Set up with Docker
+---
+
+
+
+**Important**
-!!! important
Docker Compose version 1.29.0 or later is required to use version 3.9 of the Compose file format.
You can check the version of Docker Compose installed on your system by running the following command:
@@ -11,7 +17,7 @@
This will display the version of Docker Compose that is currently installed on your system.
If you need to upgrade Docker Compose to a newer version, you can follow the installation instructions in the Docker documentation: https://docs.docker.com/compose/install/
-
+
## Basic Setup
1. Make sure you have Docker installed, see [requirements](./index.md#requirements)
@@ -24,11 +30,7 @@
3. In the project directory, create a file called `docker-compose.yml`:
-
-
- docker-compose.yml> for <= v0.4.7
-
-
+
```yaml
version: "3.9"
services:
@@ -48,14 +50,11 @@
# source: ./azure.yaml
# target: /app/azure.yaml
```
-
-
-
-
- docker-compose.yml> for > v0.4.7 (including master)
-
-
- ```yaml
+
+
+ ```yaml
version: "3.9"
services:
auto-gpt:
@@ -76,8 +75,7 @@
# source: ./config.json
# target: /app/config.json
```
-
-
+
1. Download [`.env.template`][.env.template] and save it as `.env` in the AutoGPT folder.
2. Follow the standard [configuration instructions](./index.md#completing-the-setup),
@@ -89,20 +87,25 @@
```
4. _Optional: mount configuration file._
If you have component configuration file, for example `config.json`, place it in `classic/original_autogpt/data/` directory. Or place it in `classic/original_autogpt/` and uncomment the line in `docker-compose.yml` that mounts it.
- To learn more about configuring, see [Component configuration](../../forge/components/components.md#json-configuration)
+ To learn more about configuring, see [Component configuration](/classic/forge/components/components#json-configuration)
-!!! note "Docker only supports headless browsing"
- AutoGPT uses a browser in headless mode by default: `HEADLESS_BROWSER=True`.
- Please do not change this setting in combination with Docker, or AutoGPT will crash.
+
+ **Docker only supports headless browsing**
+
+ AutoGPT uses a browser in headless mode by default: `HEADLESS_BROWSER=True`.Please do not change this setting in combination with Docker, or AutoGPT will crash.
+
+
[.env.template]: https://github.com/Significant-Gravitas/AutoGPT/tree/master/classic/original_autogpt/.env.template
[Docker Hub]: https://hub.docker.com/r/significantgravitas/auto-gpt
## Developer Setup
-!!! tip
- Use this setup if you have cloned the repository and have made (or want to make)
- changes to the codebase.
+
+**Tip**
+
+Use this setup if you have cloned the repository and have made (or want to make) changes to the codebase.
+
1. Copy `.env.template` to `.env`.
2. Follow the standard [configuration instructions](./index.md#completing-the-setup),
@@ -142,5 +145,3 @@ docker build -t autogpt .
docker run -it --env-file=.env -v $PWD:/app autogpt
docker run -it --env-file=.env -v $PWD:/app --rm autogpt --gpt3only --continuous
```
-
-[user guide]: ../usage.md/#command-line-interface
diff --git a/docs/classic/setup/for-developers.mdx b/docs/classic/setup/for-developers.mdx
new file mode 100644
index 000000000..bd57bead9
--- /dev/null
+++ b/docs/classic/setup/for-developers.mdx
@@ -0,0 +1,6 @@
+---
+title: For Developers
+---
+Coming soon...
+
+TODO: - Running and developing AutoGPT with [VSCode + devcontainer](https://marketplace.visualstudio.com/items?itemName=ms-vscode-remote.remote-containers) - Resources - Prompt engineering guides - Related projects - Papers - Technical documentation
diff --git a/docs/content/classic/setup/get-repo-dialog.png b/docs/classic/setup/get-repo-dialog.png
similarity index 100%
rename from docs/content/classic/setup/get-repo-dialog.png
rename to docs/classic/setup/get-repo-dialog.png
diff --git a/docs/content/classic/setup/index.md b/docs/classic/setup/index.mdx
similarity index 73%
rename from docs/content/classic/setup/index.md
rename to docs/classic/setup/index.mdx
index 95f2e6f7a..b8e721e4f 100644
--- a/docs/content/classic/setup/index.md
+++ b/docs/classic/setup/index.mdx
@@ -1,10 +1,13 @@
-# AutoGPT Agent setup
+---
+title: AutoGPT Agent setup
+---
-[🐋 **Set up & Run with Docker**](./docker.md)
- |
-[👷🏼 **For Developers**](./for-developers.md)
+
+
+
+
-## 📋 Requirements
+## Requirements
### Linux / macOS
@@ -19,9 +22,12 @@
### Windows
-!!! attention
- We recommend setting up AutoGPT with WSL. Some things don't work exactly the same on
- Windows and we currently can't provide specialized instructions for all those cases.
+
+**Attention**
+
+We recommend setting up AutoGPT with WSL. Some things don't work exactly the same on
+Windows and we currently can't provide specialized instructions for all those cases.
+
- Python 3.10 or later ([instructions](https://www.tutorialspoint.com/how-to-install-python-in-windows))
- Poetry ([instructions](https://python-poetry.org/docs/#installation))
@@ -35,18 +41,25 @@
Since we don't ship AutoGPT as a desktop application, you'll need to download the
[project] from GitHub and give it a place on your computer.
-![Screenshot of the dialog to clone or download the repo](get-repo-dialog.png)
-
+
+
+
- To get the latest bleeding edge version, use `master`.
- If you're looking for more stability, check out the latest AutoGPT [release][releases].
-[project]: https://github.com/Significant-Gravitas/AutoGPT
-[releases]: https://github.com/Significant-Gravitas/AutoGPT/releases
-!!! note
- These instructions don't apply if you're looking to run AutoGPT as a docker image.
- Instead, check out the [Docker setup](./docker.md) guide.
+
+
+
+
+
+**NOTE**
+
+These instructions don't apply if you're looking to run AutoGPT as a docker image.
+Instead, check out the [Docker setup](./docker.md) guide.
+
+
### Completing the Setup
Once you have cloned or downloaded the project, you can find the AutoGPT Agent in the
@@ -54,7 +67,7 @@ Once you have cloned or downloaded the project, you can find the AutoGPT Agent i
Inside this folder you can configure the AutoGPT application with an `.env` file and (optionally) a JSON configuration file:
- `.env` for environment variables, which are mostly used for sensitive data like API keys
-- a JSON configuration file to customize certain features of AutoGPT's [Components](../../forge/components/introduction.md)
+- a JSON configuration file to customize certain features of AutoGPT's [Components](/classic/forge/components/introduction)
See the [Configuration](../configuration/options.md) reference for a list of available environment variables.
@@ -71,22 +84,27 @@ See the [Configuration](../configuration/options.md) reference for a list of ava
4. Set API keys for the LLM providers that you want to use: see [below](#setting-up-llm-providers).
5. Enter any other API keys or tokens for services you would like to use.
- !!! note
- To activate and adjust a setting, remove the `# ` prefix.
+
+**NOTE**
+
+To activate and adjust a setting, remove the `# ` prefix.
+
6. Save and close the `.env` file.
7. _Optional: run `poetry install` to install all required dependencies._ The
application also checks for and installs any required dependencies when it starts.
8. _Optional: configure the JSON file (e.g. `config.json`) with your desired settings._
The application will use default settings if you don't provide a JSON configuration file.
- Learn how to [set up the JSON configuration file](../../forge/components/components.md#json-configuration)
+ Learn how to [set up the JSON configuration file](/classic/forge/components/components#json-configuration)
You should now be able to explore the CLI (`./autogpt.sh --help`) and run the application.
See the [user guide](../usage.md) for further instructions.
-[show hidden files/Windows]: https://support.microsoft.com/en-us/windows/view-hidden-files-and-folders-in-windows-97fbc472-c603-9d90-91d0-1166d1d9f4b5
-[show hidden files/macOS]: https://www.pcmag.com/how-to/how-to-access-your-macs-hidden-files
+
+
+
+
## Setting up LLM providers
@@ -101,10 +119,13 @@ If you don't know which to choose, you can safely go with OpenAI*.
### OpenAI
-!!! attention
- To use AutoGPT with GPT-4 (recommended), you need to set up a paid OpenAI account
+
+ **Attention**
+
+ To use AutoGPT with GPT-4 (recommended), you need to set up a paid OpenAI account
with some money in it. Please refer to OpenAI for further instructions ([link][openai/help-gpt-4-access]).
Free accounts are [limited][openai/api-limits] to GPT-3.5 with only 3 requests per minute.
+
1. Make sure you have a paid account with some credits set up: [Settings > Organization > Billing][openai/billing]
1. Get your OpenAI API key from: [API keys][openai/api-keys]
@@ -115,31 +136,37 @@ If you don't know which to choose, you can safely go with OpenAI*.
OPENAI_API_KEY=sk-proj-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
```
- !!! info "Using a GPT Azure-instance"
- If you want to use GPT on an Azure instance, set `USE_AZURE` to `True` and
- make an Azure configuration file.
+
+**Using a GPT Azure-instance**
- Rename `azure.yaml.template` to `azure.yaml` and provide the relevant
- `azure_api_base`, `azure_api_version` and deployment IDs for the models that you
- want to use.
+If you want to use GPT on an Azure instance, set `USE_AZURE` to `True` and
+make an Azure configuration file.
- E.g. if you want to use `gpt-3.5-turbo` and `gpt-4-turbo`:
+Rename `azure.yaml.template` to `azure.yaml` and provide the relevant
+`azure_api_base`, `azure_api_version` and deployment IDs for the models that you
+want to use.
- ```yaml
- # Please specify all of these values as double-quoted strings
- # Replace string in angled brackets (<>) to your own deployment Name
- azure_model_map:
- gpt-3.5-turbo: ""
- gpt-4-turbo: ""
- ...
- ```
+E.g. if you want to use `gpt-3.5-turbo` and `gpt-4-turbo`:
- Details can be found in the [openai/python-sdk/azure], and in the [Azure OpenAI docs] for the embedding model.
- If you're on Windows you may need to install an [MSVC library](https://learn.microsoft.com/en-us/cpp/windows/latest-supported-vc-redist?view=msvc-170).
+```yaml
+# Please specify all of these values as double-quoted strings
+# Replace string in angled brackets (<>) to your own deployment Name
+azure_model_map:
+ gpt-3.5-turbo: ""
+ gpt-4-turbo: ""
+ ...
+```
-!!! important
- Keep an eye on your API costs on [the Usage page][openai/usage].
+Details can be found in the [openai/python-sdk/azure], and in the [Azure OpenAI docs] for the embedding model.
+If you're on Windows you may need to install an [MSVC library](https://learn.microsoft.com/en-us/cpp/windows/latest-supported-vc-redist?view=msvc-170).
+
+
+**Important**
+
+Keep an eye on your API costs on [the Usage page][openai/usage].
+
+
[openai/api-keys]: https://platform.openai.com/account/api-keys
[openai/billing]: https://platform.openai.com/account/billing/overview
@@ -166,21 +193,28 @@ If you don't know which to choose, you can safely go with OpenAI*.
SMART_LLM=claude-3-opus-20240229
```
-!!! important
- Keep an eye on your API costs on [the Usage page][anthropic/usage].
+
+**Important**
+
+Keep an eye on your API costs on [the Usage page][anthropic/usage].
[anthropic/api-keys]: https://console.anthropic.com/settings/keys
[anthropic/billing]: https://console.anthropic.com/settings/plans
[anthropic/usage]: https://console.anthropic.com/settings/usage
[anthropic/models]: https://docs.anthropic.com/en/docs/models-overview
+
### Groq
-!!! note
+
+
+**Note**
+
Although Groq is supported, its built-in function calling API isn't mature.
Any features using this API may experience degraded performance.
Let us know your experience!
+
1. Get your Groq API key from [Settings > API keys][groq/api-keys]
2. Open `.env`
@@ -207,17 +241,19 @@ and guaranteed data privacy.
For more information and in-depth documentation, check out the [llamafile documentation].
-!!! warning
+
+ **Warning**
+
At the moment, llamafile only serves one model at a time. This means you can not
set `SMART_LLM` and `FAST_LLM` to two different llamafile models.
-!!! warning
+
+
+ **Warning**
+
Due to the issues linked below, llamafiles don't work on WSL. To use a llamafile
with AutoGPT in WSL, you will have to run the llamafile in Windows (outside WSL).
-
-
- Instructions
-
+
1. Get the `llamafile/serve.py` script through one of these two ways:
1. Clone the AutoGPT repo somewhere in your Windows environment,
with the script located at `classic/original_autogpt/scripts/llamafile/serve.py`
@@ -232,18 +268,21 @@ For more information and in-depth documentation, check out the [llamafile docume
6. Follow the rest of the regular instructions below.
[serve.py]: https://github.com/Significant-Gravitas/AutoGPT/blob/master/classic/original_autogpt/scripts/llamafile/serve.py
-
+
* [Mozilla-Ocho/llamafile#356](https://github.com/Mozilla-Ocho/llamafile/issues/356)
* [Mozilla-Ocho/llamafile#100](https://github.com/Mozilla-Ocho/llamafile/issues/100)
+
+
+ **Note**
-!!! note
These instructions will download and use `mistral-7b-instruct-v0.2.Q5_K_M.llamafile`.
`mistral-7b-instruct-v0.2` is currently the only tested and supported model.
If you want to try other models, you'll have to add them to `LlamafileModelName` in
[`llamafile.py`][classic/forge/llamafile.py].
For optimal results, you may also have to add some logic to adapt the message format,
like `LlamafileProvider._adapt_chat_messages_for_mistral_instruct(..)` does.
+
1. Run the llamafile serve script:
```shell
diff --git a/docs/content/classic/share-your-logs.md b/docs/classic/share-your-logs.mdx
similarity index 73%
rename from docs/content/classic/share-your-logs.md
rename to docs/classic/share-your-logs.mdx
index d34f84df5..92f8ff74c 100644
--- a/docs/content/classic/share-your-logs.md
+++ b/docs/classic/share-your-logs.mdx
@@ -1,6 +1,9 @@
-# Share your logs with us to help improve AutoGPT
+---
+title: Share your logs with us to help improve AutoGPT
+description: Do you notice weird behavior with your agent? Do you have an interesting use case? Do you have a bug you want to report?
+sidebarTitle: Share your logs with us
+---
-Do you notice weird behavior with your agent? Do you have an interesting use case? Do you have a bug you want to report?
Follow the steps below to enable your logs and upload them. You can include these logs when making an issue report or discussing an issue with us.
## Enable Debug Logs
@@ -20,14 +23,19 @@ docker compose run --rm auto-gpt --debug # in Docker
## Inspect and share logs
You can inspect and share logs via [e2b](https://e2b.dev).
-![E2b logs dashboard](../imgs/e2b-dashboard.png)
+
+
+
+
1. Go to [autogpt.e2b.dev](https://autogpt.e2b.dev) and sign in.
2. You'll see logs from other members of the AutoGPT team that you can inspect.
3. Or you upload your own logs. Click on the "Upload log folder" button and select the debug logs dir that you generated. Wait a 1-2 seconds and the page reloads.
4. You can share logs via sharing the URL in your browser.
-![E2b log URL](../imgs/e2b-log-url.png)
+
+
+
### Add tags to logs
You can add custom tags to logs for other members of your team. This is useful if you want to indicate that the agent is for example having issues with challenges.
@@ -44,10 +52,13 @@ You can name your tag any way you want.
1. Click on the "plus" button on the left from the logs folder name.
- ![E2b tag button](../imgs/e2b-tag-button.png)
-
+
+
+
1. Type the name of a new tag.
1. Select the severity.
- ![E2b new tag](../imgs/e2b-new-tag.png)
+
+
+
diff --git a/docs/content/classic/testing.md b/docs/classic/testing.mdx
similarity index 96%
rename from docs/content/classic/testing.md
rename to docs/classic/testing.mdx
index ef8176abf..78abdeea5 100644
--- a/docs/content/classic/testing.md
+++ b/docs/classic/testing.mdx
@@ -1,4 +1,6 @@
-# Running tests
+---
+title: Running tests
+---
To run all tests, use the following command:
diff --git a/docs/content/classic/usage.md b/docs/classic/usage.mdx
similarity index 81%
rename from docs/content/classic/usage.md
rename to docs/classic/usage.mdx
index 39d532274..d7b70ae4c 100644
--- a/docs/content/classic/usage.md
+++ b/docs/classic/usage.mdx
@@ -1,8 +1,13 @@
-# AutoGPT Agent User Guide
+---
+title: AutoGPT Agent User Guide
+sidebarTitle: Usage
+---
-!!! note
- This guide assumes you are in the `autogpt` folder, where the AutoGPT Agent
- is located.
+
+Note
+
+This guide assumes you are in the `autogpt` folder, where the AutoGPT Agent is located.
+
## Command Line Interface
@@ -21,28 +26,31 @@ Commands:
serve Starts an Agent Protocol compliant AutoGPT server, which creates...
```
-!!! important "For Windows users"
- On Windows, use `.\autogpt.bat` instead of `./autogpt.sh`.
- Everything else (subcommands, arguments) should work the same.
+
+ **For Windows users**
+ On Windows, use `.\autogpt.bat` instead of `./autogpt.sh`. Everything else (subcommands, arguments) should work the same.
+
-!!! info "Usage with Docker"
- For use with Docker, replace the script in the examples with
- `docker compose run --rm auto-gpt`:
+
+**Usage with Docker**
- ```shell
- docker compose run --rm auto-gpt --ai-settings
- docker compose run --rm auto-gpt serve
- ```
+For use with Docker, replace the script in the examples with
+`docker compose run --rm auto-gpt`:
+
+```shell
+docker compose run --rm auto-gpt --ai-settings
+docker compose run --rm auto-gpt serve
+```
+
+
### `run` – CLI mode
The `run` sub-command starts AutoGPT with the legacy CLI interface.
-
-
-./autogpt.sh run --help
-
-
+
```shell
$ ./autogpt.sh run --help
Usage: python -m autogpt run [OPTIONS]
@@ -81,17 +89,20 @@ Options:
--component-config-file TEXT Path to the json configuration file.
--help Show this message and exit.
```
-
+
This mode allows running a single agent, and saves the agent's state when terminated.
This means you can *resume* agents at a later time. See also [agent state].
-!!! note
+
+ **Note**
+
For legacy reasons, the CLI will default to the `run` subcommand when none is
specified: running `./autogpt.sh run [OPTIONS]` does the same as `./autogpt.sh [OPTIONS]`,
but this may change in the future.
+
-#### 💀 Continuous Mode ⚠️
+#### Continuous Mode
Run the AI **without** user authorization, 100% automated.
Continuous mode is NOT recommended.
@@ -109,11 +120,9 @@ To exit the program, press ++ctrl+c++
With `serve`, the application exposes an Agent Protocol compliant API and serves a
frontend, by default on `http://localhost:8000`. You can configure the port it is served on with the `AP_SERVER_PORT` environment variable.
-
-
-./autogpt.sh serve --help
-
-
+
```shell
$ ./autogpt.sh serve --help
Usage: python -m autogpt serve [OPTIONS]
@@ -129,20 +138,24 @@ Options:
plugins.
--help Show this message and exit.
```
-
+
For more information about the API of the application, see [agentprotocol.ai](https://agentprotocol.ai).
-
-
### Arguments
-!!! attention
- Most arguments are equivalent to configuration options. See [`.env.template`][.env.template]
- for all available configuration options.
+
+ **Attention**
-!!! note
- Replace anything in angled brackets (<>) to a value you want to specify
+Most arguments are equivalent to configuration options. See [`.env.template`][.env.template] for all available configuration options.
+
+
+
+
+**Note**
+
+Replace anything in angled brackets (\<>) to a value you want to specify
+
Here are some common arguments you can use when running AutoGPT:
@@ -158,10 +171,12 @@ Here are some common arguments you can use when running AutoGPT:
./autogpt.sh --prompt-settings
```
-!!! note
- There are shorthands for some of these flags, for example `-P` for `--prompt-settings`.
- Use `./autogpt.sh --help` for more information.
+
+ **Note**
+ There are shorthands for some of these flags, for example `-P` for `--prompt-settings`. Use `./autogpt.sh --help` for more information.
+
+
[.env.template]: https://github.com/Significant-Gravitas/AutoGPT/tree/master/classic/original_autogpt/.env.template
## Agent State
@@ -176,24 +191,27 @@ in various ways:
* Share your agent!
## Workspace
-[workspace]: #workspace
Agents can read and write files. This happens in the `workspace` folder, which
is in `data/agents//`. Files outside of this folder can not be accessed by the
agent *unless* `RESTRICT_TO_WORKSPACE` is set to `False`.
-!!! warning
- We do not recommend disabling `RESTRICT_TO_WORKSPACE`, unless AutoGPT is running in
- a sandbox environment where it couldn't do any damage (e.g. Docker or a VM).
+
+ **Warning**
+
+ We do not recommend disabling `RESTRICT_TO_WORKSPACE`, unless AutoGPT is running in a sandbox environment where it couldn't do any damage (e.g. Docker or a VM).
+
## Logs
Activity, Error, and Debug logs are located in `logs`.
-!!! tip
+
+ **Tip**
+
Do you notice weird behavior with your agent? Do you have an interesting use case? Do you have a bug you want to report?
Follow the step below to enable your logs. You can include these logs when making an issue report or discussing an issue with us.
-
+
To print out debug logs:
```shell
@@ -212,6 +230,3 @@ For example, to disable python coding features, set it to the value below:
```ini
DISABLED_COMMANDS=execute_python_code,execute_python_file
```
-
-[components]: ../forge/components/components.md
-[commands]: ../forge/components/built-in-components.md
diff --git a/docs/content/challenges/beat.md b/docs/content/challenges/beat.md
deleted file mode 100644
index 85c01d839..000000000
--- a/docs/content/challenges/beat.md
+++ /dev/null
@@ -1,11 +0,0 @@
-# Beat a Challenge
-
-If you have a solution or idea to tackle an existing challenge, you can contribute by working on it and submitting your solution. Here's how to get started:
-
-## Guidelines for Beating a Challenge
-
-1. **Choose a challenge**: Browse the [List of Challenges](list.md) and choose one that interests you or aligns with your expertise.
-
-2. **Understand the problem**: Make sure you thoroughly understand the problem at hand, its scope, and the desired outcome.
-
-3. **Develop a solution**: Work on creating a solution for the challenge. This may/
diff --git a/docs/content/challenges/building_challenges.md b/docs/content/challenges/building_challenges.md
deleted file mode 100644
index a2b09d867..000000000
--- a/docs/content/challenges/building_challenges.md
+++ /dev/null
@@ -1,124 +0,0 @@
-# Creating Challenges for AutoGPT
-
-🏹 We're on the hunt for talented Challenge Creators! 🎯
-
-Join us in shaping the future of AutoGPT by designing challenges that test its limits. Your input will be invaluable in guiding our progress and ensuring that we're on the right track. We're seeking individuals with a diverse skill set, including:
-
-🎨 UX Design: Your expertise will enhance the user experience for those attempting to conquer our challenges. With your help, we'll develop a dedicated section in our wiki, and potentially even launch a standalone website.
-
-💻 Coding Skills: Proficiency in Python, pytest, and VCR (a library that records OpenAI calls and stores them) will be essential for creating engaging and robust challenges.
-
-⚙️ DevOps Skills: Experience with CI pipelines in GitHub and possibly Google Cloud Platform will be instrumental in streamlining our operations.
-
-Are you ready to play a pivotal role in AutoGPT's journey? Apply now to become a Challenge Creator by opening a PR! 🚀
-
-
-# Getting Started
-Clone the original AutoGPT repo and checkout to master branch
-
-
-The challenges are not written using a specific framework. They try to be very agnostic
-The challenges are acting like a user that wants something done:
-INPUT:
-- User desire
-- Files, other inputs
-
-Output => Artifact (files, image, code, etc, etc...)
-
-## Defining your Agent
-
-Go to https://github.com/Significant-Gravitas/AutoGPT/blob/master/classic/original_autogpt/tests/integration/agent_factory.py
-
-Create your agent fixture.
-
-```python
-def kubernetes_agent(
- agent_test_config, workspace: Workspace
-):
- # Please choose the commands your agent will need to beat the challenges, the full list is available in the main.py
- # (we 're working on a better way to design this, for now you have to look at main.py)
- command_registry = CommandRegistry()
- command_registry.import_commands("autogpt.commands.file_operations")
- command_registry.import_commands("autogpt.app")
-
- # Define all the settings of our challenged agent
- ai_profile = AIProfile(
- ai_name="Kubernetes",
- ai_role="an autonomous agent that specializes in creating Kubernetes deployment templates.",
- ai_goals=[
- "Write a simple kubernetes deployment file and save it as a kube.yaml.",
- ],
- )
- ai_profile.command_registry = command_registry
-
- system_prompt = ai_profile.construct_full_prompt()
- agent_test_config.set_continuous_mode(False)
- agent = Agent(
- command_registry=command_registry,
- config=ai_profile,
- next_action_count=0,
- triggering_prompt=DEFAULT_TRIGGERING_PROMPT,
- )
-
- return agent
-```
-
-## Creating your challenge
-Go to `tests/challenges`and create a file that is called `test_your_test_description.py` and add it to the appropriate folder. If no category exists you can create a new one.
-
-Your test could look something like this
-
-```python
-import contextlib
-from functools import wraps
-from typing import Generator
-
-import pytest
-import yaml
-
-from autogpt.commands.file_operations import read_file, write_to_file
-from tests.integration.agent_utils import run_interaction_loop
-from tests.challenges.utils import run_multiple_times
-
-def input_generator(input_sequence: list) -> Generator[str, None, None]:
- """
- Creates a generator that yields input strings from the given sequence.
-
- :param input_sequence: A list of input strings.
- :return: A generator that yields input strings.
- """
- yield from input_sequence
-
-
-@pytest.mark.skip("This challenge hasn't been beaten yet.")
-@pytest.mark.vcr
-@pytest.mark.requires_openai_api_key
-def test_information_retrieval_challenge_a(kubernetes_agent, monkeypatch) -> None:
- """
- Test the challenge_a function in a given agent by mocking user inputs
- and checking the output file content.
-
- :param get_company_revenue_agent: The agent to test.
- :param monkeypatch: pytest's monkeypatch utility for modifying builtins.
- """
- input_sequence = ["s", "s", "s", "s", "s", "EXIT"]
- gen = input_generator(input_sequence)
- monkeypatch.setattr("autogpt.utils.session.prompt", lambda _: next(gen))
-
- with contextlib.suppress(SystemExit):
- run_interaction_loop(kubernetes_agent, None)
-
- # here we load the output file
- file_path = str(kubernetes_agent.workspace.get_path("kube.yaml"))
- content = read_file(file_path)
-
- # then we check if it's including keywords from the kubernetes deployment config
- for word in ["apiVersion", "kind", "metadata", "spec"]:
- assert word in content, f"Expected the file to contain {word}"
-
- content = yaml.safe_load(content)
- for word in ["Service", "Deployment", "Pod"]:
- assert word in content["kind"], f"Expected the file to contain {word}"
-
-
-```
diff --git a/docs/content/challenges/challenge_template.md b/docs/content/challenges/challenge_template.md
deleted file mode 100644
index 3178ce7b9..000000000
--- a/docs/content/challenges/challenge_template.md
+++ /dev/null
@@ -1,24 +0,0 @@
-# Challenge Title
-
-## Description
-
-Provide a clear and concise description of the challenge. Include any relevant examples or files to illustrate the problem.
-
-## Input
-
-If the challenge involves specific input files, describe them here. Provide the file names and their contents, if necessary. Use triple backticks (```) to format the content as a code block.
-
-For example:
-
-instructions_1.txt
-
-The current task_id is 4563.\n[NOISE intended to confuse the agent]
-Read the file instructions_2.txt using the read_file command.
-
-## Scope
-
-Define the scope of the challenge, including any relevant constraints, requirements, or limitations.
-
-## Success Evaluation
-
-Explain how success will be measured or evaluated for the challenge. This helps others understand what the desired outcome is and how to work towards it.
diff --git a/docs/content/challenges/information_retrieval/challenge_a.md b/docs/content/challenges/information_retrieval/challenge_a.md
deleted file mode 100644
index bf1b7b104..000000000
--- a/docs/content/challenges/information_retrieval/challenge_a.md
+++ /dev/null
@@ -1,23 +0,0 @@
-# Information Retrieval Challenge A
-
-**Status**: Current level to beat: level 2
-
-**Command to try**:
-
-```
-pytest -s tests/challenges/information_retrieval/test_information_retrieval_challenge_a.py --level=2
-```
-
-## Description
-
-The agent's goal is to find the revenue of Tesla:
-- level 1 asks the revenue of Tesla in 2022 and explicitly asks to search for 'tesla revenue 2022'
-- level 2 is identical but doesn't ask to search for 'tesla revenue 2022'
-- level 3 asks for tesla's revenue by year since its creation.
-
-It should write the result in a file called output.txt.
-
-The agent should be able to beat this test consistently (this is the hardest part).
-## Objective
-
-The objective of this challenge is to test the agent's ability to retrieve information in a consistent way.
diff --git a/docs/content/challenges/information_retrieval/challenge_b.md b/docs/content/challenges/information_retrieval/challenge_b.md
deleted file mode 100644
index f4e68a151..000000000
--- a/docs/content/challenges/information_retrieval/challenge_b.md
+++ /dev/null
@@ -1,22 +0,0 @@
-# Information Retrieval Challenge B
-
-**Status**: Beaten
-
-**Command to try**:
-
-```
-pytest -s tests/challenges/information_retrieval/test_information_retrieval_challenge_b.py
-```
-
-## Description
-
-The agent's goal is to find the names, affiliated university, and discovery of the individuals who won the nobel prize for physics in 2010.
-
-It should write the result in a file called 2010_nobel_prize_winners.txt.
-
-The agent should be able to beat this test consistently (this is the hardest part).
-
-## Objective
-
-The objective of this challenge is to test the agent's ability to retrieve multiple pieces of related information in a consistent way.
-The agent should not use google to perform the task, because it should already know the answer. This why the task fails after 2 cycles (1 cycle to retrieve information, 1 cycle to write the file)
diff --git a/docs/content/challenges/information_retrieval/introduction.md b/docs/content/challenges/information_retrieval/introduction.md
deleted file mode 100644
index 23984dd5b..000000000
--- a/docs/content/challenges/information_retrieval/introduction.md
+++ /dev/null
@@ -1,3 +0,0 @@
-# Information Retrieval
-
-Information retrieval challenges are designed to evaluate the proficiency of an AI agent, such as AutoGPT, in searching, extracting, and presenting relevant information from a vast array of sources. These challenges often encompass tasks such as interpreting user queries, browsing the web, and filtering through unstructured data.
diff --git a/docs/content/challenges/introduction.md b/docs/content/challenges/introduction.md
deleted file mode 100644
index 4da7d4fe0..000000000
--- a/docs/content/challenges/introduction.md
+++ /dev/null
@@ -1,34 +0,0 @@
-# Introduction to Challenges
-
-Welcome to the AutoGPT Challenges page! This is a space where we encourage community members to collaborate and contribute towards improving AutoGPT by identifying and solving challenges that AutoGPT is not yet able to achieve.
-
-## What are challenges?
-
-Challenges are tasks or problems that AutoGPT has difficulty solving or has not yet been able to accomplish. These may include improving specific functionalities, enhancing the model's understanding of specific domains, or even developing new features that the current version of AutoGPT lacks.
-
-## Why are challenges important?
-
-Addressing challenges helps us improve AutoGPT's performance, usability, and versatility. By working together to tackle these challenges, we can create a more powerful and efficient tool for everyone. It also allows the community to actively contribute to the project, making it a true open-source effort.
-
-## How can you participate?
-
-There are two main ways to get involved with challenges:
-
-1. **Submit a Challenge**: If you have identified a task that AutoGPT struggles with, you can submit it as a challenge. This allows others to see the issue and collaborate on finding a solution.
-2. **Beat a Challenge**: If you have a solution or idea to tackle an existing challenge, you can contribute by working on the challenge and submitting your solution.
-
-To learn more about submitting and beating challenges, please visit the [List of Challenges](list.md), [Submit a Challenge](submit.md), and [Beat a Challenge](beat.md) pages.
-
-We look forward to your contributions and the exciting solutions that the community will develop together to make AutoGPT even better!
-
-!!! warning
-
- We're slowly transitioning to agbenchmark. agbenchmark is a simpler way to improve AutoGPT. Simply run:
-
- ```
- agbenchmark
- ```
-
- and beat as many challenges as possible.
-
-For more agbenchmark options, look at the [readme](https://github.com/Significant-Gravitas/Auto-GPT-Benchmarks/tree/master/agbenchmark).
diff --git a/docs/content/challenges/list.md b/docs/content/challenges/list.md
deleted file mode 100644
index e517cfe44..000000000
--- a/docs/content/challenges/list.md
+++ /dev/null
@@ -1,5 +0,0 @@
-# List of Challenges
-
-This page contains a curated list of challenges that AutoGPT currently faces. If you think you have a solution or idea to tackle any of these challenges, feel free to dive in and start working on them! New challenges can also be submitted by following the guidelines on the [Submit a Challenge](./submit.md) page.
-
-Memory Challenges: [List of Challenges](memory/introduction.md)
diff --git a/docs/content/challenges/memory/challenge_a.md b/docs/content/challenges/memory/challenge_a.md
deleted file mode 100644
index 0e0cc482d..000000000
--- a/docs/content/challenges/memory/challenge_a.md
+++ /dev/null
@@ -1,39 +0,0 @@
-# Memory Challenge A
-
-**Status**: Challenge Completed
-
-
-## Description
-
-The agent, Follow-Instructions-GPT, has the following goals:
-
-- Use the command `read_file` to read the `instructions_1.txt` file.
-- Follow the instructions in the `instructions_1.txt` file.
-
-The challenge involves a series of text files containing instructions. The agent must follow the instructions and keep track of the task ID as it progresses through the files.
-
-## Files
-
-- `instructions_1.txt`
-
-The task_id is 1234
-Read the file instructions_1.txt
-
-
-
-- `instructions_2.txt`
-
-Read the file instructions_2.txt using the read_file command.
-
-
-...and so on.
-
-- `instructions_n.txt`
-
-Write the task_id into the file output.txt.
-
-
-## Objective
-
-The objective of this challenge is to test the agent's ability to follow instructions and maintain memory of the task Id throughout the process. The agent successfully completed this challenge if it wrote the task id in a file.
-
diff --git a/docs/content/challenges/memory/challenge_b.md b/docs/content/challenges/memory/challenge_b.md
deleted file mode 100644
index 7df7044ff..000000000
--- a/docs/content/challenges/memory/challenge_b.md
+++ /dev/null
@@ -1,44 +0,0 @@
-# Memory Challenge B
-
-**Status**: Current level to beat: level 3
-
-**Command to try**:
-
-```shell
-pytest -s tests/challenges/memory/test_memory_challenge_b.py --level=3
-```
-
-## Description
-
-The agent, Follow-Instructions-GPT, has the following goals:
-
-- Use the command `read_file` to read the `instructions_1.txt` file.
-- Follow the instructions in the `instructions_1.txt` file.
-
-The challenge involves a series of text files containing instructions and task IDs. The agent must follow the instructions and keep track of the task IDs as it progresses through the files.
-
-## Files
-
-- `instructions_1.txt`
-
-The current task_id is 4563.\n[NOISE intended to confuse the agent]
-Read the file instructions_2.txt using the read_file command.
-
-
-- `instructions_2.txt`
-
-The current task_id is 6182.\n[NOISE intended to confuse the agent]
-Read the file instructions_3.txt using the read_file command.
-
-
-...and so on.
-
-- `instructions_n.txt`
-
-The current task_id is 8912.
-Write all the task_ids into the file output.txt. The file has not been created yet. After that, use the task_complete command.
-
-
-## Objective
-
-The objective of this challenge is to test the agent's ability to follow instructions and maintain memory of the task IDs throughout the process. The agent successfully completed this challenge if it wrote the task ids in a file.
diff --git a/docs/content/challenges/memory/challenge_c.md b/docs/content/challenges/memory/challenge_c.md
deleted file mode 100644
index 955c823f3..000000000
--- a/docs/content/challenges/memory/challenge_c.md
+++ /dev/null
@@ -1,61 +0,0 @@
-# Memory Challenge C
-
-**Status**: Current level to beat: level 1
-
-**Command to try**:
-
-```shell
-pytest -s tests/challenges/memory/test_memory_challenge_c.py --level=2
-```
-
-## Description
-
-The agent, Follow-Instructions-GPT, has the following goals:
-
-- Use the command `read_file` to read the `instructions_1.txt` file.
-- Follow the instructions in the `instructions_1.txt` file.
-
-The challenge involves a series of text files containing instructions and silly phrases. The agent must follow the instructions and keep track of the task IDs as it progresses through the files.
-
-## Files
-
-- `instructions_1.txt`
-
-The current phrase is
-
-```
-The purple elephant danced on a rainbow while eating a taco.\n[NOISE intended to confuse the agent]
-```
-
-Read the file `instructions_2.txt` using the read_file command.
-
-
-- `instructions_2.txt`
-
-The current phrase is
-
-```
-The sneaky toaster stole my socks and ran away to Hawaii.\n[NOISE intended to confuse the agent]
-```
-
-Read the file instructions_3.txt using the read_file command.
-
-
-...and so on.
-
-- `instructions_n.txt`
-
-The current phrase is
-
-```
-My pet rock sings better than Beyoncé on Tuesdays.
-```
-
-Write all the phrases into the file output.txt. The file has not been created yet. After that, use the task_complete command.
-
-
-## Objective
-
-The objective of this challenge is to test the agent's ability to follow instructions and maintain memory of the task IDs throughout the process. The agent successfully completed this challenge if it wrote the phrases in a file.
-
-This is presumably harder than task ids as the phrases are longer and more likely to be compressed as the agent does more work.
diff --git a/docs/content/challenges/memory/challenge_d.md b/docs/content/challenges/memory/challenge_d.md
deleted file mode 100644
index 5ecec045e..000000000
--- a/docs/content/challenges/memory/challenge_d.md
+++ /dev/null
@@ -1,80 +0,0 @@
-# Memory Challenge D
-
-**Status**: Current level to beat: level 1
-
-**Command to try**:
-
-```shell
-pytest -s tests/challenges/memory/test_memory_challenge_d.py --level=1
-```
-
-## Description
-
-The provided code is a unit test designed to validate an AI's ability to track events and beliefs of characters in a story involving moving objects, specifically marbles. This scenario is an advanced form of the classic "Sally-Anne test", a psychological test used to measure a child's social cognitive ability to understand that others' perspectives and beliefs may differ from their own.
-
-Here is an explanation of the challenge:
-
-The AI is given a series of events involving characters Sally, Anne, Bob, and Charlie, and the movements of different marbles. These events are designed as tests at increasing levels of complexity.
-
-For each level, the AI is expected to keep track of the events and the resulting beliefs of each character about the locations of each marble. These beliefs are affected by whether the character was inside or outside the room when events occurred, as characters inside the room are aware of the actions, while characters outside the room aren't.
-
-After the AI processes the events and generates the beliefs of each character, it writes these beliefs to an output file in JSON format.
-
-The check_beliefs function then checks the AI's beliefs against the expected beliefs for that level. The expected beliefs are predefined and represent the correct interpretation of the events for each level.
-
-If the AI's beliefs match the expected beliefs, it means the AI has correctly interpreted the events and the perspectives of each character. This would indicate that the AI has passed the test for that level.
-
-The test runs for levels up to the maximum level that the AI has successfully beaten, or up to a user-selected level.
-
-
-## Files
-
-- `instructions_1.txt`
-
-```
-Sally has a marble (marble A) and she puts it in her basket (basket S), then leaves the room. Anne moves marble A from Sally's basket (basket S) to her own basket (basket A).
-```
-
-
-- `instructions_2.txt`
-
-```
-Sally gives a new marble (marble B) to Bob who is outside with her. Bob goes into the room and places marble B into Anne's basket (basket A). Anne tells Bob to tell Sally that he lost the marble b. Bob leaves the room and speaks to Sally about the marble B. Meanwhile, after Bob left the room, Anne moves marble A into the green box, but tells Charlie to tell Sally that marble A is under the sofa. Charlie leaves the room and speak to Sally about the marble A as instructed by Anne.
-```
-
-...and so on.
-
-- `instructions_n.txt`
-
-The expected believes of every characters are given in a list:
-
-```json
-expected_beliefs = {
- 1: {
- 'Sally': {
- 'marble A': 'basket S',
- },
- 'Anne': {
- 'marble A': 'basket A',
- }
- },
- 2: {
- 'Sally': {
- 'marble A': 'sofa', # Because Charlie told her
- },
- 'Anne': {
- 'marble A': 'green box', # Because she moved it there
- 'marble B': 'basket A', # Because Bob put it there and she was in the room
- },
- 'Bob': {
- 'B': 'basket A', # Last place he put it
- },
- 'Charlie': {
- 'A': 'sofa', # Because Anne told him to tell Sally so
- }
- },...
-```
-
-## Objective
-
-This test essentially checks if an AI can accurately model and track the beliefs of different characters based on their knowledge of events, which is a critical aspect of understanding and generating human-like narratives. This ability would be beneficial for tasks such as writing stories, dialogue systems, and more.
diff --git a/docs/content/challenges/memory/introduction.md b/docs/content/challenges/memory/introduction.md
deleted file mode 100644
index 13085d1b8..000000000
--- a/docs/content/challenges/memory/introduction.md
+++ /dev/null
@@ -1,5 +0,0 @@
-# Memory Challenges
-
-Memory challenges are designed to test the ability of an AI agent, like AutoGPT, to remember and use information throughout a series of tasks. These challenges often involve following instructions, processing text files, and keeping track of important data.
-
-The goal of memory challenges is to improve an agent's performance in tasks that require remembering and using information over time. By addressing these challenges, we can enhance AutoGPT's capabilities and make it more useful in real-world applications.
diff --git a/docs/content/challenges/submit.md b/docs/content/challenges/submit.md
deleted file mode 100644
index 14f21493d..000000000
--- a/docs/content/challenges/submit.md
+++ /dev/null
@@ -1,14 +0,0 @@
-# Submit a Challenge
-
-If you have identified a task or problem that AutoGPT struggles with, you can submit it as a challenge for the community to tackle. Here's how you can submit a new challenge:
-
-## How to Submit a Challenge
-
-1. Create a new `.md` file in the `challenges` directory in the AutoGPT GitHub repository. Make sure to pick the right category.
-2. Name the file with a descriptive title for the challenge, using hyphens instead of spaces (e.g., `improve-context-understanding.md`).
-3. In the file, follow the [challenge_template.md](challenge_template.md) to describe the problem, define the scope, and evaluate success.
-4. Commit the file and create a pull request.
-
-Once submitted, the community can review and discuss the challenge. If deemed appropriate, it will be added to the [List of Challenges](list.md).
-
-If you're looking to contribute by working on an existing challenge, check out [Beat a Challenge](beat.md) for guidelines on how to get started.
diff --git a/docs/content/classic/index.md b/docs/content/classic/index.md
deleted file mode 100644
index bcb95d65b..000000000
--- a/docs/content/classic/index.md
+++ /dev/null
@@ -1,144 +0,0 @@
-# AutoGPT Agent
-
-[🔧 **Setup**](setup/index.md)
- |
-[💻 **User guide**](./usage.md)
- |
-[🐙 **GitHub**](https://github.com/Significant-Gravitas/AutoGPT/tree/master/autogpt)
-
-**Location:** `classic/original_autogpt/` in the GitHub repo
-
-**Maintance Notice:** AutoGPT Classic is not supported from a security perspective.
-Dependencies will not be updated, nor will issues be fixed. If someone wishes to
-contribute to novel development, we will give best effort merging to the changes that
-pass the existing CI.
-
-AutoGPT Classic was conceived when OpenAI published their GPT-4 model accompanied by a paper
-outlining the advanced reasoning and task-solving abilities of the model. The concept
-was (and still is) fairly simple: let an LLM decide what to do over and over, while
-feeding the results of its actions back into the prompt. This allows the program to
-iteratively and incrementally work towards its objective.
-
-The fact that this program is able to execute actions on behalf of its user makes
-it an **agent**. In the case of AutoGPT Classic, the user still has to authorize every action,
-but as the project progresses we'll be able to give the agent more autonomy and only
-require consent for select actions.
-
-AutoGPT Classic is a **generalist agent**, meaning it is not designed with a specific task in
-mind. Instead, it is designed to be able to execute a wide range of tasks across many
-disciplines, as long as it can be done on a computer.
-
-# AutoGPT Classic Documentation
-
-Welcome to the AutoGPT Classic Documentation.
-
-The AutoGPT Classic project consists of four main components:
-
-- The [Agent](#agent) – also known as just "AutoGPT Classic"
-- The [Benchmark](#benchmark) – AKA `agbenchmark`
-- The [Forge](#forge)
-- The [Frontend](#frontend)
-
-To tie these together, we also have a [CLI] at the root of the project.
-
-## 🤖 Agent
-
-**[📖 About AutoGPT Classic](#autogpt-agent)**
- |
-**[🔧 Setup](setup/index.md)**
- |
-**[💻 Usage](./usage.md)**
-
-The former heart of AutoGPT, and the project that kicked it all off: a semi-autonomous agent powered by LLMs to execute any task for you*.
-
-We continue to develop this project with the goal of providing access to AI assistance to the masses, and building the future transparently and together.
-
-- 💡 **Explore** - See what AI can do and be inspired by a glimpse of the future.
-
-- 🚀 **Build with us** - We welcome any input, whether it's code or ideas for new features or improvements! Join us on [Discord](https://discord.gg/autogpt) and find out how you can join in on the action.
-
-If you'd like to see what's next, check out the [AutoGPT Platform](../index.md).
-
-* it isn't quite there yet, but that is the ultimate goal that we are still pursuing
-
----
-
-## 🎯 Benchmark
-
-**[🗒️ Readme](https://github.com/Significant-Gravitas/AutoGPT/blob/master/classic/benchmark/README.md)**
-
-Measure your agent's performance! The `agbenchmark` can be used with any agent that supports the agent protocol, and the integration with the project's [CLI] makes it even easier to use with AutoGPT Classic and forge-based agents. The benchmark offers a stringent testing environment. Our framework allows for autonomous, objective performance evaluations, ensuring your agents are primed for real-world action.
-
-
-
-- 📦 [**`agbenchmark`**](https://pypi.org/project/agbenchmark/) on Pypi
-
-- 🔌 **Agent Protocol Standardization** - AutoGPT Classic uses the agent protocol from the AI Engineer Foundation to ensure compatibility with many agents, both from within and outside the project.
-
----
-
-## 🏗️ Forge
-
-**[📖 Introduction](../forge/get-started.md)**
- |
-**[🚀 Quickstart](https://github.com/Significant-Gravitas/AutoGPT/blob/master/QUICKSTART.md)**
-
-
-
-Forge your own agent! The Forge is a ready-to-go template for your agent application. All the boilerplate code is already handled, letting you channel all your creativity into the things that set *your* agent apart.
-
-- 🛠️ **Building with Ease** - We've set the groundwork so you can focus on your agent's personality and capabilities. Comprehensive tutorials are available [here](https://aiedge.medium.com/autogpt-forge-e3de53cc58ec).
-
----
-
-## 💻 Frontend
-
-**[🗒️ Readme](https://github.com/Significant-Gravitas/AutoGPT/blob/master/classic/frontend/README.md)**
-
-An easy-to-use and open source frontend for any Agent Protocol-compliant agent.
-
-- 🎮 **User-Friendly Interface** - Manage your agents effortlessly.
-
-- 🔄 **Seamless Integration** - Smooth connectivity between your agent and our benchmarking system.
-
----
-
-## 🔧 CLI
-[CLI]: #cli
-
-The project CLI makes it easy to use all of the components of AutoGPT Classic in the repo, separately or
-together. To install its dependencies, simply run `./run setup`, and you're ready to go!
-
-```shell
-$ ./run
-Usage: cli.py [OPTIONS] COMMAND [ARGS]...
-
-Options:
- --help Show this message and exit.
-
-Commands:
- agent Commands to create, start and stop agents
- benchmark Commands to start the benchmark and list tests and categories
- setup Installs dependencies needed for your system.
-```
-
-Common commands:
-
-* `./run agent start autogpt` – [runs](./usage.md#serve-agent-protocol-mode-with-ui) the AutoGPT Classic agent
-* `./run agent create ` – creates a new Forge-based agent project at `agents/`
-* `./run benchmark start ` – benchmarks the specified agent
-
----
-
-🤔 Join the AutoGPT Discord server for any queries:
-[discord.gg/autogpt](https://discord.gg/autogpt)
-
-### Glossary of Terms
-
-- **Repository**: Space where your project resides.
-- **Forking**: Copying a repository under your account.
-- **Cloning**: Making a local copy of a repository.
-- **Agent**: The AutoGPT you'll create and develop.
-- **Benchmarking**: Testing your agent's skills in the Forge.
-- **Forge**: The template for building your AutoGPT agent.
-- **Frontend**: The UI for tasks, logs, and task history.
diff --git a/docs/content/classic/setup/for-developers.md b/docs/content/classic/setup/for-developers.md
deleted file mode 100644
index fa5871d1a..000000000
--- a/docs/content/classic/setup/for-developers.md
+++ /dev/null
@@ -1,9 +0,0 @@
-Coming soon...
-
-TODO:
-- Running and developing AutoGPT with [VSCode + devcontainer](https://marketplace.visualstudio.com/items?itemName=ms-vscode-remote.remote-containers)
-- Resources
- - Prompt engineering guides
- - Related projects
- - Papers
-- Technical documentation
diff --git a/docs/content/code-of-conduct.md b/docs/content/code-of-conduct.md
deleted file mode 120000
index a3613c99f..000000000
--- a/docs/content/code-of-conduct.md
+++ /dev/null
@@ -1 +0,0 @@
-../../CODE_OF_CONDUCT.md
\ No newline at end of file
diff --git a/docs/content/contribute/index.md b/docs/content/contribute/index.md
deleted file mode 100644
index 4cce72aac..000000000
--- a/docs/content/contribute/index.md
+++ /dev/null
@@ -1,48 +0,0 @@
-# Contributing to the Docs
-
-We welcome contributions to our documentation! If you would like to contribute, please follow the steps below.
-
-## Setting up the Docs
-
-1. Clone the repository:
-
- ```shell
- git clone github.com/Significant-Gravitas/AutoGPT.git
- ```
-
-1. Install the dependencies:
-
- ```shell
- python -m pip install -r docs/requirements.txt
- ```
-
- or
-
- ```shell
- python3 -m pip install -r docs/requirements.txt
- ```
-
-1. Start iterating using mkdocs' live server:
-
- ```shell
- mkdocs serve
- ```
-
-1. Open your browser and navigate to `http://127.0.0.1:8000`.
-
-1. The server will automatically reload the docs when you save your changes.
-
-## Adding a new page
-
-1. Create a new markdown file in the `docs/content` directory.
-1. Add the new page to the `nav` section in the `mkdocs.yml` file.
-1. Add the content to the new markdown file.
-1. Run `mkdocs serve` to see your changes.
-
-## Checking links
-
-To check for broken links in the documentation, run `mkdocs build` and look for warnings in the console output.
-
-## Submitting a Pull Request
-
-When you're ready to submit your changes, please create a pull request. We will review your changes and merge them if they are appropriate.
diff --git a/docs/content/contributing.md b/docs/content/contributing.md
deleted file mode 120000
index f939e75f2..000000000
--- a/docs/content/contributing.md
+++ /dev/null
@@ -1 +0,0 @@
-../../CONTRIBUTING.md
\ No newline at end of file
diff --git a/docs/content/forge/components/agents.md b/docs/content/forge/components/agents.md
deleted file mode 120000
index d993b8473..000000000
--- a/docs/content/forge/components/agents.md
+++ /dev/null
@@ -1 +0,0 @@
-../../../../classic/original_autogpt/autogpt/agents/README.md
\ No newline at end of file
diff --git a/docs/content/forge/components/built-in-components.md b/docs/content/forge/components/built-in-components.md
deleted file mode 100644
index fbd9a78df..000000000
--- a/docs/content/forge/components/built-in-components.md
+++ /dev/null
@@ -1,219 +0,0 @@
-# Built-in Components
-
-This page lists all [🧩 Components](./components.md) and [⚙️ Protocols](./protocols.md) they implement that are natively provided. They are used by the AutoGPT agent.
-Some components have additional configuration options listed in the table, see [Component configuration](./components.md/#component-configuration) to learn more.
-
-!!! note
- If a configuration field uses environment variable, it still can be passed using configuration model. ### Value from the configuration takes precedence over env var! Env var will be only applied if value in the configuration is not set.
-
-## `SystemComponent`
-
-Essential component to allow an agent to finish.
-
-### DirectiveProvider
-
-- Constraints about API budget
-
-### MessageProvider
-
-- Current time and date
-- Remaining API budget and warnings if budget is low
-
-### CommandProvider
-
-- `finish` used when task is completed
-
-## `UserInteractionComponent`
-
-Adds ability to interact with user in CLI.
-
-### CommandProvider
-
-- `ask_user` used to ask user for input
-
-## `FileManagerComponent`
-
-Adds ability to read and write persistent files to local storage, Google Cloud Storage or Amazon's S3.
-Necessary for saving and loading agent's state (preserving session).
-
-### `FileManagerConfiguration`
-
-| Config variable | Details | Type | Default |
-| ---------------- | -------------------------------------- | ----- | ---------------------------------- |
-| `storage_path` | Path to agent files, e.g. state | `str` | `agents/{agent_id}/`[^1] |
-| `workspace_path` | Path to files that agent has access to | `str` | `agents/{agent_id}/workspace/`[^1] |
-
-[^1] This option is set dynamically during component construction as opposed to by default inside the configuration model, `{agent_id}` is replaced with the agent's unique identifier.
-
-### DirectiveProvider
-
-- Resource information that it's possible to read and write files
-
-### CommandProvider
-
-- `read_file` used to read file
-- `write_file` used to write file
-- `list_folder` lists all files in a folder
-
-## `CodeExecutorComponent`
-
-Lets the agent execute non-interactive Shell commands and Python code. Python execution works only if Docker is available.
-
-### `CodeExecutorConfiguration`
-
-| Config variable | Details | Type | Default |
-| ------------------------ | ---------------------------------------------------- | --------------------------- | ----------------- |
-| `execute_local_commands` | Enable shell command execution | `bool` | `False` |
-| `shell_command_control` | Controls which list is used | `"allowlist" \| "denylist"` | `"allowlist"` |
-| `shell_allowlist` | List of allowed shell commands | `List[str]` | `[]` |
-| `shell_denylist` | List of prohibited shell commands | `List[str]` | `[]` |
-| `docker_container_name` | Name of the Docker container used for code execution | `str` | `"agent_sandbox"` |
-
-All shell command configurations are expected to be for convience only. This component is not secure and should not be used in production environments. It is recommended to use more appropriate sandboxing.
-
-### CommandProvider
-
-- `execute_shell` execute shell command
-- `execute_shell_popen` execute shell command with popen
-- `execute_python_code` execute Python code
-- `execute_python_file` execute Python file
-
-## `ActionHistoryComponent`
-
-Keeps track of agent's actions and their outcomes. Provides their summary to the prompt.
-
-### `ActionHistoryConfiguration`
-
-| Config variable | Details | Type | Default |
-| ---------------------- | ------------------------------------------------------- | ----------- | ------------------ |
-| `llm_name` | Name of the llm model used to compress the history | `ModelName` | `"gpt-3.5-turbo"` |
-| `max_tokens` | Maximum number of tokens to use for the history summary | `int` | `1024` |
-| `spacy_language_model` | Language model used for summary chunking using spacy | `str` | `"en_core_web_sm"` |
-| `full_message_count` | Number of cycles to include unsummarized in the prompt | `int` | `4` |
-
-### MessageProvider
-
-- Agent's progress summary
-
-### AfterParse
-
-- Register agent's action
-
-### ExecutionFailure
-
-- Rewinds the agent's action, so it isn't saved
-
-### AfterExecute
-
-- Saves the agent's action result in the history
-
-## `GitOperationsComponent`
-
-Adds ability to iteract with git repositories and GitHub.
-
-### `GitOperationsConfiguration`
-
-| Config variable | Details | Type | Default |
-| ----------------- | ----------------------------------------- | ----- | ------- |
-| `github_username` | GitHub username, *ENV:* `GITHUB_USERNAME` | `str` | `None` |
-| `github_api_key` | GitHub API key, *ENV:* `GITHUB_API_KEY` | `str` | `None` |
-
-### CommandProvider
-
-- `clone_repository` used to clone a git repository
-
-## `ImageGeneratorComponent`
-
-Adds ability to generate images using various providers.
-
-### Hugging Face
-
-To use text-to-image models from Hugging Face, you need a Hugging Face API token.
-Link to the appropriate settings page: [Hugging Face > Settings > Tokens](https://huggingface.co/settings/tokens)
-
-### Stable Diffusion WebUI
-
-It is possible to use your own self-hosted Stable Diffusion WebUI with AutoGPT. ### Make sure you are running WebUI with `--api` enabled.
-
-### `ImageGeneratorConfiguration`
-
-| Config variable | Details | Type | Default |
-| ------------------------- | ------------------------------------------------------------- | --------------------------------------- | --------------------------------- |
-| `image_provider` | Image generation provider | `"dalle" \| "huggingface" \| "sdwebui"` | `"dalle"` |
-| `huggingface_image_model` | Hugging Face image model, see [available models] | `str` | `"CompVis/stable-diffusion-v1-4"` |
-| `huggingface_api_token` | Hugging Face API token, *ENV:* `HUGGINGFACE_API_TOKEN` | `str` | `None` |
-| `sd_webui_url` | URL to self-hosted Stable Diffusion WebUI | `str` | `"http://localhost:7860"` |
-| `sd_webui_auth` | Basic auth for Stable Diffusion WebUI, *ENV:* `SD_WEBUI_AUTH` | `str` of format `{username}:{password}` | `None` |
-
-[available models]: https://huggingface.co/models?pipeline_tag=text-to-image
-
-### CommandProvider
-
-- `generate_image` used to generate an image given a prompt
-
-## `WebSearchComponent`
-
-Allows agent to search the web. Google credentials aren't required for DuckDuckGo. [Instructions how to set up Google API key](../../classic/configuration/search.md)
-
-### `WebSearchConfiguration`
-
-| Config variable | Details | Type | Default |
-| -------------------------------- | ----------------------------------------------------------------------- | --------------------------- | ------- |
-| `google_api_key` | Google API key, *ENV:* `GOOGLE_API_KEY` | `str` | `None` |
-| `google_custom_search_engine_id` | Google Custom Search Engine ID, *ENV:* `GOOGLE_CUSTOM_SEARCH_ENGINE_ID` | `str` | `None` |
-| `duckduckgo_max_attempts` | Maximum number of attempts to search using DuckDuckGo | `int` | `3` |
-| `duckduckgo_backend` | Backend to be used for DDG sdk | `"api" \| "html" \| "lite"` | `"api"` |
-
-### DirectiveProvider
-
-- Resource information that it's possible to search the web
-
-### CommandProvider
-
-- `search_web` used to search the web using DuckDuckGo
-- `google` used to search the web using Google, requires API key
-
-## `WebSeleniumComponent`
-
-Allows agent to read websites using Selenium.
-
-### `WebSeleniumConfiguration`
-
-| Config variable | Details | Type | Default |
-| ----------------------------- | ------------------------------------------- | --------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------- |
-| `llm_name` | Name of the llm model used to read websites | `ModelName` | `"gpt-3.5-turbo"` |
-| `web_browser` | Web browser used by Selenium | `"chrome" \| "firefox" \| "safari" \| "edge"` | `"chrome"` |
-| `headless` | Run browser in headless mode | `bool` | `True` |
-| `user_agent` | User agent used by the browser | `str` | `"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"` |
-| `browse_spacy_language_model` | Spacy language model used for chunking text | `str` | `"en_core_web_sm"` |
-| `selenium_proxy` | Http proxy to use with Selenium | `str` | `None` |
-
-### DirectiveProvider
-
-- Resource information that it's possible to read websites
-
-### CommandProvider
-
-- `read_website` used to read a specific url and look for specific topics or answer a question
-
-## `ContextComponent`
-
-Adds ability to keep up-to-date file and folder content in the prompt.
-
-### MessageProvider
-
-- Content of elements in the context
-
-### CommandProvider
-
-- `open_file` used to open a file into context
-- `open_folder` used to open a folder into context
-- `close_context_item` remove an item from the context
-
-## `WatchdogComponent`
-
-Watches if agent is looping and switches to smart mode if necessary.
-
-### AfterParse
-
-- Investigates what happened and switches to smart mode if necessary
diff --git a/docs/content/forge/components/components.md b/docs/content/forge/components/components.md
deleted file mode 120000
index 40c0d9def..000000000
--- a/docs/content/forge/components/components.md
+++ /dev/null
@@ -1 +0,0 @@
-../../../../classic/forge/forge/components/README.md
\ No newline at end of file
diff --git a/docs/content/forge/components/introduction.md b/docs/content/forge/components/introduction.md
deleted file mode 100644
index d9b5a132c..000000000
--- a/docs/content/forge/components/introduction.md
+++ /dev/null
@@ -1,23 +0,0 @@
-# Component Agents
-
-!!! important
- [Legacy plugins] no longer work with AutoGPT. They have been replaced by components,
- although we're still working on a new system to load plug-in components.
-
-[Legacy plugins]: https://github.com/Significant-Gravitas/Auto-GPT-Plugins
-
-This guide explains the component-based architecture of AutoGPT agents. It's a new way of building agents that is more flexible and easier to extend. Components replace some agent's logic and plugins with a more modular and composable system.
-
-Agent is composed of *components*, and each *component* implements a range of *protocols* (interfaces), each one providing a specific functionality, e.g. additional commands or messages. Each *protocol* is handled in a specific order, defined by the agent. This allows for a clear separation of concerns and a more modular design.
-
-This system is simple, flexible, and doesn't hide any data - anything can still be passed or accessed directly from or between components.
-
-### Definitions & Guides
-
-See [Creating Components](./creating-components.md) to get started! Or you can explore the following topics in detail:
-
-- [🧩 Component](./components.md): a class that implements one or more *protocols*. It can be added to an agent to provide additional functionality. See what's already provided in [Built-in Components](./built-in-components.md).
-- [⚙️ Protocol](./protocols.md): an interface that defines a set of methods that a component must implement. Protocols are used to group related functionality.
-- [🛠️ Command](./commands.md): enable *agent* to interact with user and tools.
-- [🤖 Agent](./agents.md): a class that is composed of components. It's responsible for executing pipelines and managing the components.
-- **Pipeline**: a sequence of method calls on components. Pipelines are used to execute a series of actions in a specific order. As of now there's no formal class for a pipeline, it's just a sequence of method calls on components. There are two default pipelines implemented in the default agent: `propose_action` and `execute`. See [🤖 Agent](./agents.md) to learn more.
diff --git a/docs/content/forge/get-started.md b/docs/content/forge/get-started.md
deleted file mode 100644
index 59e42fec2..000000000
--- a/docs/content/forge/get-started.md
+++ /dev/null
@@ -1,34 +0,0 @@
-# AutoGPT Forge
-
-## 🛠️ Build your own Agent 🛠️
-
-!!! warning
- If you are trying to use AutoGPT this is not the tutorial for you! You need to use [this one](../classic/setup/index.md)
-
-Forge is a ready-to-go template for *your* agent application. All the boilerplate code is already handled, letting you channel all your creativity into the things that set *your* agent apart.
-
----
-
-### 🛠️ **Why AutoGPT Forge?**
-
-- 💤 **No More Boilerplate!** - Don't let the mundane tasks stop you. Fork and build without the headache of starting from scratch!
-- 🧠 **Brain-centric Development!** - All the tools you need so you can spend 100% of your time on what matters - crafting the brain of your AI!
-- 🛠️ **Tooling ecosystem!** - We work with the best in class tools to bring you the best experience possible!
-
----
-
-### 🚀 **Get Started!**
-
-The best way to get started is to fork or download the AutoGPT repository and look at the example agent in `classic/forge/agent/forge_agent.py`.
-This can work as a starting point for your own agent.
-Agents are built using *components* which provide different functionality, see the [Component Introduction](./components/introduction.md). You can find built-in components in `classic/forge/components/`.
-
-!!! warning
- The tutorial series below is out of date.
-
-The getting started [tutorial series](https://aiedge.medium.com/autogpt-forge-e3de53cc58ec) will guide you through the process of setting up your project all the way through to building a generalist agent.
-
-1. [AutoGPT Forge: A Comprehensive Guide to Your First Steps](https://aiedge.medium.com/autogpt-forge-a-comprehensive-guide-to-your-first-steps-a1dfdf46e3b4)
-2. [AutoGPT Forge: The Blueprint of an AI Agent](https://aiedge.medium.com/autogpt-forge-the-blueprint-of-an-ai-agent-75cd72ffde6)
-3. [AutoGPT Forge: Interacting with your Agent](https://aiedge.medium.com/autogpt-forge-interacting-with-your-agent-1214561b06b)
-4. [AutoGPT Forge: Crafting Intelligent Agent Logic](https://medium.com/@aiedge/autogpt-forge-crafting-intelligent-agent-logic-bc5197b14cb4)
diff --git a/docs/content/imgs/e2b-dashboard.png b/docs/content/imgs/e2b-dashboard.png
deleted file mode 100644
index 456f1490c..000000000
Binary files a/docs/content/imgs/e2b-dashboard.png and /dev/null differ
diff --git a/docs/content/imgs/e2b-log-url.png b/docs/content/imgs/e2b-log-url.png
deleted file mode 100644
index 3f1c189ee..000000000
Binary files a/docs/content/imgs/e2b-log-url.png and /dev/null differ
diff --git a/docs/content/imgs/e2b-new-tag.png b/docs/content/imgs/e2b-new-tag.png
deleted file mode 100644
index 65a0a767c..000000000
Binary files a/docs/content/imgs/e2b-new-tag.png and /dev/null differ
diff --git a/docs/content/imgs/e2b-tag-button.png b/docs/content/imgs/e2b-tag-button.png
deleted file mode 100644
index 741a6bac1..000000000
Binary files a/docs/content/imgs/e2b-tag-button.png and /dev/null differ
diff --git a/docs/content/imgs/modular-pipeline.png b/docs/content/imgs/modular-pipeline.png
deleted file mode 100644
index 9f9c58047..000000000
Binary files a/docs/content/imgs/modular-pipeline.png and /dev/null differ
diff --git a/docs/content/imgs/ollama/Ollama-Add-Prompts.png b/docs/content/imgs/ollama/Ollama-Add-Prompts.png
deleted file mode 100644
index deeddc7cc..000000000
Binary files a/docs/content/imgs/ollama/Ollama-Add-Prompts.png and /dev/null differ
diff --git a/docs/content/imgs/ollama/Ollama-Credentials.png b/docs/content/imgs/ollama/Ollama-Credentials.png
deleted file mode 100644
index 769339df9..000000000
Binary files a/docs/content/imgs/ollama/Ollama-Credentials.png and /dev/null differ
diff --git a/docs/content/imgs/ollama/Ollama-Enter-API-key.png b/docs/content/imgs/ollama/Ollama-Enter-API-key.png
deleted file mode 100644
index ab365a576..000000000
Binary files a/docs/content/imgs/ollama/Ollama-Enter-API-key.png and /dev/null differ
diff --git a/docs/content/imgs/ollama/Ollama-Output.png b/docs/content/imgs/ollama/Ollama-Output.png
deleted file mode 100644
index 06cb9f7a8..000000000
Binary files a/docs/content/imgs/ollama/Ollama-Output.png and /dev/null differ
diff --git a/docs/content/imgs/ollama/Ollama-Remote-Host.png b/docs/content/imgs/ollama/Ollama-Remote-Host.png
deleted file mode 100644
index 25a57b9ad..000000000
Binary files a/docs/content/imgs/ollama/Ollama-Remote-Host.png and /dev/null differ
diff --git a/docs/content/imgs/ollama/Ollama-Select-Llama32.png b/docs/content/imgs/ollama/Ollama-Select-Llama32.png
deleted file mode 100644
index cd39e1b4e..000000000
Binary files a/docs/content/imgs/ollama/Ollama-Select-Llama32.png and /dev/null differ
diff --git a/docs/content/imgs/ollama/Select-AI-block.png b/docs/content/imgs/ollama/Select-AI-block.png
deleted file mode 100644
index d9c41db4a..000000000
Binary files a/docs/content/imgs/ollama/Select-AI-block.png and /dev/null differ
diff --git a/docs/content/imgs/openai-api-key-billing-paid-account.png b/docs/content/imgs/openai-api-key-billing-paid-account.png
deleted file mode 100644
index 8948505a0..000000000
Binary files a/docs/content/imgs/openai-api-key-billing-paid-account.png and /dev/null differ
diff --git a/docs/content/imgs/quickstart/000_header_img.png b/docs/content/imgs/quickstart/000_header_img.png
deleted file mode 100644
index a7522ab98..000000000
Binary files a/docs/content/imgs/quickstart/000_header_img.png and /dev/null differ
diff --git a/docs/content/imgs/quickstart/001_repo.png b/docs/content/imgs/quickstart/001_repo.png
deleted file mode 100644
index fe3c276a8..000000000
Binary files a/docs/content/imgs/quickstart/001_repo.png and /dev/null differ
diff --git a/docs/content/imgs/quickstart/002_fork.png b/docs/content/imgs/quickstart/002_fork.png
deleted file mode 100644
index 29fef6a60..000000000
Binary files a/docs/content/imgs/quickstart/002_fork.png and /dev/null differ
diff --git a/docs/content/imgs/quickstart/003A_clone.png b/docs/content/imgs/quickstart/003A_clone.png
deleted file mode 100644
index 5d6eb1012..000000000
Binary files a/docs/content/imgs/quickstart/003A_clone.png and /dev/null differ
diff --git a/docs/content/imgs/quickstart/003_clone.png b/docs/content/imgs/quickstart/003_clone.png
deleted file mode 100644
index f38364ae9..000000000
Binary files a/docs/content/imgs/quickstart/003_clone.png and /dev/null differ
diff --git a/docs/content/imgs/quickstart/004_ide.png b/docs/content/imgs/quickstart/004_ide.png
deleted file mode 100644
index d530e1465..000000000
Binary files a/docs/content/imgs/quickstart/004_ide.png and /dev/null differ
diff --git a/docs/content/imgs/quickstart/005_setup.png b/docs/content/imgs/quickstart/005_setup.png
deleted file mode 100644
index 108605204..000000000
Binary files a/docs/content/imgs/quickstart/005_setup.png and /dev/null differ
diff --git a/docs/content/imgs/quickstart/006_setup_complete.png b/docs/content/imgs/quickstart/006_setup_complete.png
deleted file mode 100644
index 10477b86c..000000000
Binary files a/docs/content/imgs/quickstart/006_setup_complete.png and /dev/null differ
diff --git a/docs/content/imgs/quickstart/007_create_agent.png b/docs/content/imgs/quickstart/007_create_agent.png
deleted file mode 100644
index 0ef69860b..000000000
Binary files a/docs/content/imgs/quickstart/007_create_agent.png and /dev/null differ
diff --git a/docs/content/imgs/quickstart/008_enter_arena.png b/docs/content/imgs/quickstart/008_enter_arena.png
deleted file mode 100644
index 67e69d4fb..000000000
Binary files a/docs/content/imgs/quickstart/008_enter_arena.png and /dev/null differ
diff --git a/docs/content/imgs/quickstart/009_start_agent.png b/docs/content/imgs/quickstart/009_start_agent.png
deleted file mode 100644
index 5a8b47234..000000000
Binary files a/docs/content/imgs/quickstart/009_start_agent.png and /dev/null differ
diff --git a/docs/content/imgs/quickstart/010_login.png b/docs/content/imgs/quickstart/010_login.png
deleted file mode 100644
index 6e3b5b7ec..000000000
Binary files a/docs/content/imgs/quickstart/010_login.png and /dev/null differ
diff --git a/docs/content/imgs/quickstart/011_home.png b/docs/content/imgs/quickstart/011_home.png
deleted file mode 100644
index a89cdf949..000000000
Binary files a/docs/content/imgs/quickstart/011_home.png and /dev/null differ
diff --git a/docs/content/imgs/quickstart/012_tests.png b/docs/content/imgs/quickstart/012_tests.png
deleted file mode 100644
index f1adf5e3b..000000000
Binary files a/docs/content/imgs/quickstart/012_tests.png and /dev/null differ
diff --git a/docs/content/imgs/quickstart/t2_01.png b/docs/content/imgs/quickstart/t2_01.png
deleted file mode 100644
index 4ecc47af9..000000000
Binary files a/docs/content/imgs/quickstart/t2_01.png and /dev/null differ
diff --git a/docs/content/imgs/quickstart/t2_02.png b/docs/content/imgs/quickstart/t2_02.png
deleted file mode 100644
index 994d4bf64..000000000
Binary files a/docs/content/imgs/quickstart/t2_02.png and /dev/null differ
diff --git a/docs/content/imgs/quickstart/t2_03.png b/docs/content/imgs/quickstart/t2_03.png
deleted file mode 100644
index a5bc9ac87..000000000
Binary files a/docs/content/imgs/quickstart/t2_03.png and /dev/null differ
diff --git a/docs/content/imgs/quickstart/t2_04.png b/docs/content/imgs/quickstart/t2_04.png
deleted file mode 100644
index 5c3b1c668..000000000
Binary files a/docs/content/imgs/quickstart/t2_04.png and /dev/null differ
diff --git a/docs/content/imgs/quickstart/t2_agent_flow.png b/docs/content/imgs/quickstart/t2_agent_flow.png
deleted file mode 100644
index 300f66d2a..000000000
Binary files a/docs/content/imgs/quickstart/t2_agent_flow.png and /dev/null differ
diff --git a/docs/content/imgs/quickstart/t2_diagram.png b/docs/content/imgs/quickstart/t2_diagram.png
deleted file mode 100644
index c6088b64e..000000000
Binary files a/docs/content/imgs/quickstart/t2_diagram.png and /dev/null differ
diff --git a/docs/content/imgs/quickstart/t3_01.png b/docs/content/imgs/quickstart/t3_01.png
deleted file mode 100644
index 39b4e62cb..000000000
Binary files a/docs/content/imgs/quickstart/t3_01.png and /dev/null differ
diff --git a/docs/content/imgs/quickstart/t3_02.png b/docs/content/imgs/quickstart/t3_02.png
deleted file mode 100644
index 41935f9b3..000000000
Binary files a/docs/content/imgs/quickstart/t3_02.png and /dev/null differ
diff --git a/docs/content/imgs/quickstart/t3_03.png b/docs/content/imgs/quickstart/t3_03.png
deleted file mode 100644
index df234922d..000000000
Binary files a/docs/content/imgs/quickstart/t3_03.png and /dev/null differ
diff --git a/docs/content/imgs/quickstart/t3_04.png b/docs/content/imgs/quickstart/t3_04.png
deleted file mode 100644
index bc55ad303..000000000
Binary files a/docs/content/imgs/quickstart/t3_04.png and /dev/null differ
diff --git a/docs/content/index.md b/docs/content/index.md
deleted file mode 100644
index 243b56ea4..000000000
--- a/docs/content/index.md
+++ /dev/null
@@ -1,85 +0,0 @@
-# AutoGPT Documentation
-
-Welcome to the AutoGPT Documentation.
-
-## What is the AutoGPT Platform?
-
-The AutoGPT Platform is a groundbreaking system that revolutionizes AI utilization for businesses and individuals. It enables the creation, deployment, and management of continuous agents that work tirelessly on your behalf, bringing unprecedented efficiency and innovation to your workflows.
-
-### Key Features
-
-- **Seamless Integration and Low-Code Workflows**: Rapidly create complex workflows without extensive coding knowledge.
-- **Autonomous Operation and Continuous Agents**: Deploy cloud-based assistants that run indefinitely, activating on relevant triggers.
-- **Intelligent Automation and Maximum Efficiency**: Streamline workflows by automating repetitive processes.
-- **Reliable Performance and Predictable Execution**: Enjoy consistent and dependable long-running processes.
-
-## Platform Architecture
-
-The AutoGPT Platform consists of two main components:
-
-### 1. AutoGPT Server
-
-The powerhouse of our platform, containing:
-
-- **Source Code**: Core logic driving agents and automation processes.
-- **Infrastructure**: Robust systems ensuring reliable and scalable performance.
-- **Marketplace**: A comprehensive marketplace for pre-built agents.
-
-### 2. AutoGPT Frontend
-
-The user interface where you interact with the platform:
-
-- **Agent Builder**: Design and configure your own AI agents.
-- **Workflow Management**: Build, modify, and optimize automation workflows.
-- **Deployment Controls**: Manage the lifecycle of your agents.
-- **Ready-to-Use Agents**: Select from pre-configured agents.
-- **Agent Interaction**: Run and interact with agents through a user-friendly interface.
-- **Monitoring and Analytics**: Track agent performance and gain insights.
-
-## Platform Components
-
-### Agents and Workflows
-
-In the platform, you can create highly customized workflows to build agents. An agent is essentially an automated workflow that you design to perform specific tasks or processes. Create customized workflows to build agents for various tasks, including:
-
-- Data processing and analysis
-- Task scheduling and management
-- Communication and notification systems
-- Integration between different software tools
-- AI-powered decision making and content generation
-
-### Blocks as Integrations
-
-Blocks represent actions and are the building blocks of your workflows, including:
-
-- Connections to external services
-- Data processing tools
-- AI models for various tasks
-- Custom scripts or functions
-- Conditional logic and decision-making components
-
-You can learn more under: [Build your own Blocks](platform/new_blocks.md)
-
-## Available Language Models
-
-The platform comes pre-integrated with cutting-edge LLM providers:
-
-- OpenAI
-- Anthropic
-- Groq
-- Llama
-
-## License Overview
-
-We've adopted a dual-license approach to balance open collaboration with sustainable development:
-
-- **MIT License**: The majority of the AutoGPT repository remains under this license.
-- **Polyform Shield License**: Applies to the new `autogpt_platform` folder.
-
-This strategy allows us to share previously closed-source components, fostering a vibrant ecosystem of developers and users.
-
-## Ready to Get Started?
-
-- Read the [Getting Started docs](https://docs.agpt.co/platform/getting-started/) to self-host
-- [Join the waitlist](https://agpt.co/waitlist) for the cloud-hosted beta
-- [Contribute](contribute/index.md)
\ No newline at end of file
diff --git a/docs/content/platform/blocks/blocks.md b/docs/content/platform/blocks/blocks.md
deleted file mode 100644
index cfdecf6e6..000000000
--- a/docs/content/platform/blocks/blocks.md
+++ /dev/null
@@ -1,170 +0,0 @@
-# AutoGPT Blocks Overview
-
-AutoGPT uses a modular approach with various "blocks" to handle different tasks. These blocks are the building blocks of AutoGPT workflows, allowing users to create complex automations by combining simple, specialized components.
-
-Below is a comprehensive list of all available blocks, categorized by their primary function. Click on any block name to view its detailed documentation.
-
-## Basic Operations
-| Block Name | Description |
-|------------|-------------|
-| [Store Value](basic.md#store-value) | Stores and forwards a value |
-| [Print to Console](basic.md#print-to-console) | Outputs text to the console for debugging |
-| [Find in Dictionary](basic.md#find-in-dictionary) | Looks up a value in a dictionary or list |
-| [Agent Input](basic.md#agent-input) | Accepts user input in a workflow |
-| [Agent Output](basic.md#agent-output) | Records and formats workflow results |
-| [Add to Dictionary](basic.md#add-to-dictionary) | Adds a new key-value pair to a dictionary |
-| [Add to List](basic.md#add-to-list) | Adds a new entry to a list |
-| [Note](basic.md#note) | Displays a sticky note in the workflow |
-
-## Data Processing
-| Block Name | Description |
-|------------|-------------|
-| [Read CSV](csv.md#read-csv) | Processes and extracts data from CSV files |
-| [Data Sampling](sampling.md#data-sampling) | Selects a subset of data using various sampling methods |
-
-## Text Processing
-| Block Name | Description |
-|------------|-------------|
-| [Match Text Pattern](text.md#match-text-pattern) | Checks if text matches a specified pattern |
-| [Extract Text Information](text.md#extract-text-information) | Extracts specific information from text using patterns |
-| [Fill Text Template](text.md#fill-text-template) | Populates a template with provided values |
-| [Combine Texts](text.md#combine-texts) | Merges multiple text inputs into one |
-| [Text Decoder](decoder_block.md#text-decoder) | Converts encoded text into readable format |
-
-## AI and Language Models
-| Block Name | Description |
-|------------|-------------|
-| [AI Structured Response Generator](llm.md#ai-structured-response-generator) | Generates structured responses using LLMs |
-| [AI Text Generator](llm.md#ai-text-generator) | Produces text responses using LLMs |
-| [AI Text Summarizer](llm.md#ai-text-summarizer) | Summarizes long texts using LLMs |
-| [AI Conversation](llm.md#ai-conversation) | Facilitates multi-turn conversations with LLMs |
-| [AI List Generator](llm.md#ai-list-generator) | Creates lists based on prompts using LLMs |
-
-## Web and API Interactions
-| Block Name | Description |
-|------------|-------------|
-| [Send Web Request](http.md#send-web-request) | Makes HTTP requests to specified web addresses |
-| [Read RSS Feed](rss.md#read-rss-feed) | Retrieves and processes entries from RSS feeds |
-| [Get Weather Information](search.md#get-weather-information) | Fetches current weather data for a location |
-| [Google Maps Search](google_maps.md#google-maps-search) | Searches for local businesses using Google Maps API |
-
-## Social Media and Content
-| Block Name | Description |
-|------------|-------------|
-| [Get Reddit Posts](reddit.md#get-reddit-posts) | Retrieves posts from specified subreddits |
-| [Post Reddit Comment](reddit.md#post-reddit-comment) | Posts comments on Reddit |
-| [Publish to Medium](medium.md#publish-to-medium) | Publishes content directly to Medium |
-| [Read Discord Messages](discord.md#read-discord-messages) | Retrieves messages from Discord channels |
-| [Send Discord Message](discord.md#send-discord-message) | Sends messages to Discord channels |
-
-## Search and Information Retrieval
-| Block Name | Description |
-|------------|-------------|
-| [Get Wikipedia Summary](search.md#get-wikipedia-summary) | Fetches summaries of topics from Wikipedia |
-| [Search The Web](search.md#search-the-web) | Performs web searches and returns results |
-| [Extract Website Content](search.md#extract-website-content) | Retrieves and extracts content from websites |
-
-## Time and Date
-| Block Name | Description |
-|------------|-------------|
-| [Get Current Time](time_blocks.md#get-current-time) | Provides the current time |
-| [Get Current Date](time_blocks.md#get-current-date) | Provides the current date |
-| [Get Current Date and Time](time_blocks.md#get-current-date-and-time) | Provides both current date and time |
-| [Countdown Timer](time_blocks.md#countdown-timer) | Acts as a countdown timer |
-
-## Math and Calculations
-| Block Name | Description |
-|------------|-------------|
-| [Calculator](maths.md#calculator) | Performs basic mathematical operations |
-| [Count Items](maths.md#count-items) | Counts items in a collection |
-
-## Media Generation
-| Block Name | Description |
-|------------|-------------|
-| [Ideogram Model](ideogram.md#ideogram-model) | Generates images based on text prompts |
-| [Create Talking Avatar Video](talking_head.md#create-talking-avatar-video) | Creates videos with talking avatars |
-| [Unreal Text to Speech](text_to_speech_block.md#unreal-text-to-speech) | Converts text to speech using Unreal Speech API |
-| [AI Shortform Video Creator](ai_shortform_video_block.md#ai-shortform-video-creator) | Generates short-form videos using AI |
-| [Replicate Flux Advanced Model](replicate_flux_advanced.md#replicate-flux-advanced-model) | Creates images using Replicate's Flux models |
-
-## Miscellaneous
-| Block Name | Description |
-|------------|-------------|
-| [Transcribe YouTube Video](youtube.md#transcribe-youtube-video) | Transcribes audio from YouTube videos |
-| [Send Email](email_block.md#send-email) | Sends emails using SMTP |
-| [Condition Block](branching.md#condition-block) | Evaluates conditions for workflow branching |
-| [Step Through Items](iteration.md#step-through-items) | Iterates through lists or dictionaries |
-
-## Google Services
-| Block Name | Description |
-|------------|-------------|
-| [Gmail Read](google/gmail.md#gmail-read) | Retrieves and reads emails from a Gmail account |
-| [Gmail Send](google/gmail.md#gmail-send) | Sends emails using a Gmail account |
-| [Gmail List Labels](google/gmail.md#gmail-list-labels) | Retrieves all labels from a Gmail account |
-| [Gmail Add Label](google/gmail.md#gmail-add-label) | Adds a label to a specific email in a Gmail account |
-| [Gmail Remove Label](google/gmail.md#gmail-remove-label) | Removes a label from a specific email in a Gmail account |
-| [Google Sheets Read](google/sheet.md#google-sheets-read) | Reads data from a Google Sheets spreadsheet |
-| [Google Sheets Write](google/sheet.md#google-sheets-write) | Writes data to a Google Sheets spreadsheet |
-| [Google Maps Search](google_maps.md#google-maps-search) | Searches for local businesses using the Google Maps API |
-
-## GitHub Integration
-| Block Name | Description |
-|------------|-------------|
-| [GitHub Comment](github/issues.md#github-comment) | Posts comments on GitHub issues or pull requests |
-| [GitHub Make Issue](github/issues.md#github-make-issue) | Creates new issues on GitHub repositories |
-| [GitHub Read Issue](github/issues.md#github-read-issue) | Retrieves information about a specific GitHub issue |
-| [GitHub List Issues](github/issues.md#github-list-issues) | Retrieves a list of issues from a GitHub repository |
-| [GitHub Add Label](github/issues.md#github-add-label) | Adds a label to a GitHub issue or pull request |
-| [GitHub Remove Label](github/issues.md#github-remove-label) | Removes a label from a GitHub issue or pull request |
-| [GitHub Assign Issue](github/issues.md#github-assign-issue) | Assigns a user to a GitHub issue |
-| [GitHub List Tags](github/repo.md#github-list-tags) | Retrieves and lists all tags for a specified GitHub repository |
-| [GitHub List Branches](github/repo.md#github-list-branches) | Retrieves and lists all branches for a specified GitHub repository |
-| [GitHub List Discussions](github/repo.md#github-list-discussions) | Retrieves and lists recent discussions for a specified GitHub repository |
-| [GitHub Make Branch](github/repo.md#github-make-branch) | Creates a new branch in a GitHub repository |
-| [GitHub Delete Branch](github/repo.md#github-delete-branch) | Deletes a specified branch from a GitHub repository |
-| [GitHub List Pull Requests](github/pull_requests.md#github-list-pull-requests) | Retrieves a list of pull requests from a specified GitHub repository |
-| [GitHub Make Pull Request](github/pull_requests.md#github-make-pull-request) | Creates a new pull request in a specified GitHub repository |
-| [GitHub Read Pull Request](github/pull_requests.md#github-read-pull-request) | Retrieves detailed information about a specific GitHub pull request |
-| [GitHub Assign PR Reviewer](github/pull_requests.md#github-assign-pr-reviewer) | Assigns a reviewer to a specific GitHub pull request |
-| [GitHub Unassign PR Reviewer](github/pull_requests.md#github-unassign-pr-reviewer) | Removes an assigned reviewer from a specific GitHub pull request |
-| [GitHub List PR Reviewers](github/pull_requests.md#github-list-pr-reviewers) | Retrieves a list of all assigned reviewers for a specific GitHub pull request |
-
-## Twitter Integration
-| Block Name | Description |
-|------------|-------------|
-| [Twitter Post Tweet](twitter/twitter.md#twitter-post-tweet-block) | Creates a tweet on Twitter with text content and optional attachments including media, polls, quotes, or deep links |
-| [Twitter Delete Tweet](twitter/twitter.md#twitter-delete-tweet-block) | Deletes a specified tweet using its tweet ID |
-| [Twitter Search Recent](twitter/twitter.md#twitter-search-recent-block) | Searches for tweets matching specified criteria with options for filtering and pagination |
-| [Twitter Get Quote Tweets](twitter/twitter.md#twitter-get-quote-tweets-block) | Gets tweets that quote a specified tweet ID with options for pagination and filtering |
-| [Twitter Retweet](twitter/twitter.md#twitter-retweet-block) | Creates a retweet of a specified tweet using its tweet ID |
-| [Twitter Remove Retweet](twitter/twitter.md#twitter-remove-retweet-block) | Removes an existing retweet of a specified tweet |
-| [Twitter Get Retweeters](twitter/twitter.md#twitter-get-retweeters-block) | Gets list of users who have retweeted a specified tweet with pagination and filtering options |
-| [Twitter Get User Mentions](twitter/twitter.md#twitter-get-user-mentions-block) | Gets tweets where a specific user is mentioned using their user ID |
-| [Twitter Get Home Timeline](twitter/twitter.md#twitter-get-home-timeline-block) | Gets recent tweets and retweets from authenticated user and followed accounts |
-| [Twitter Get User](twitter/twitter.md#twitter-get-user-block) | Gets detailed profile information for a single Twitter user |
-| [Twitter Get Users](twitter/twitter.md#twitter-get-users-block) | Gets profile information for multiple Twitter users (up to 100) |
-| [Twitter Search Spaces](twitter/twitter.md#twitter-search-spaces-block) | Searches for Twitter Spaces matching title keywords with state filtering |
-| [Twitter Get Spaces](twitter/twitter.md#twitter-get-spaces-block) | Gets information about multiple Twitter Spaces by Space IDs or creator IDs |
-| [Twitter Get Space By Id](twitter/twitter.md#twitter-get-space-by-id-block) | Gets detailed information about a single Twitter Space |
-| [Twitter Get Space Tweets](twitter/twitter.md#twitter-get-space-tweets-block) | Gets tweets that were shared during a Twitter Space session |
-| [Twitter Follow List](twitter/twitter.md#twitter-follow-list-block) | Follows a Twitter List using its List ID |
-| [Twitter Unfollow List](twitter/twitter.md#twitter-unfollow-list-block) | Unfollows a previously followed Twitter List |
-| [Twitter Get List](twitter/twitter.md#twitter-get-list-block) | Gets detailed information about a specific Twitter List |
-| [Twitter Get Owned Lists](twitter/twitter.md#twitter-get-owned-lists-block) | Gets all Twitter Lists owned by a specified user |
-| [Twitter Get List Members](twitter/twitter.md#twitter-get-list-members-block) | Gets information about members of a specified Twitter List |
-| [Twitter Add List Member](twitter/twitter.md#twitter-add-list-member-block) | Adds a specified user as a member to a Twitter List |
-| [Twitter Remove List Member](twitter/twitter.md#twitter-remove-list-member-block) | Removes a specified user from a Twitter List |
-| [Twitter Get List Tweets](twitter/twitter.md#twitter-get-list-tweets-block) | Gets tweets posted within a specified Twitter List |
-| [Twitter Create List](twitter/twitter.md#twitter-create-list-block) | Creates a new Twitter List with specified name and settings |
-| [Twitter Update List](twitter/twitter.md#twitter-update-list-block) | Updates name and/or description of an existing Twitter List |
-| [Twitter Delete List](twitter/twitter.md#twitter-delete-list-block) | Deletes a specified Twitter List |
-| [Twitter Pin List](twitter/twitter.md#twitter-pin-list-block) | Pins a Twitter List to appear at top of Lists |
-| [Twitter Unpin List](twitter/twitter.md#twitter-unpin-list-block) | Removes a Twitter List from pinned Lists |
-| [Twitter Get Pinned Lists](twitter/twitter.md#twitter-get-pinned-lists-block) | Gets all Twitter Lists that are currently pinned |
-| Twitter List Get Followers | Working... Gets all followers of a specified Twitter List |
-| Twitter Get Followed Lists | Working... Gets all Lists that a user follows |
-| Twitter Get DM Events | Working... Retrieves direct message events for a user |
-| Twitter Send Direct Message | Working... Sends a direct message to a specified user |
-| Twitter Create DM Conversation | Working... Creates a new direct message conversation |
-
-This comprehensive list covers all the blocks available in AutoGPT. Each block is designed to perform a specific task, and they can be combined to create powerful, automated workflows. For more detailed information on each block, click on its name to view the full documentation.
diff --git a/docs/content/platform/blocks/twitter/twitter.md b/docs/content/platform/blocks/twitter/twitter.md
deleted file mode 100644
index 3b4e4b00b..000000000
--- a/docs/content/platform/blocks/twitter/twitter.md
+++ /dev/null
@@ -1,1907 +0,0 @@
-# Twitter API Integration Blocks
-
-## Twitter Post Tweet Block
-
-### What it is
-A block that creates tweets on Twitter with various optional attachments and settings.
-
-### What it does
-This block allows posting tweets with text content and optional attachments like media, polls, quotes, or deep links.
-
-### How it works
-It uses the Twitter API (Tweepy) to create a tweet with the specified content and settings, handling authentication and error cases.
-
-### Inputs
-| Input | Description |
-|-------|-------------|
-| credentials | Twitter API credentials with required scopes |
-| tweet_text | Main text content of the tweet |
-| attachment | Optional media, deep link, poll, place or quote attachment |
-| for_super_followers_only | Whether the tweet is exclusively for super followers |
-| exclude_reply_user_ids | User IDs to exclude from reply thread |
-| in_reply_to_tweet_id | ID of tweet being replied to |
-| reply_settings | Who can reply to the tweet |
-
-### Outputs
-| Output | Description |
-|--------|-------------|
-| tweet_id | ID of the created tweet |
-| tweet_url | URL to view the tweet |
-| error | Error message if posting failed |
-
-### Possible use case
-Automating tweet publishing with rich content like polls, media or quotes.
-
----
-
-## Twitter Delete Tweet Block
-
-### What it is
-A block that deletes a specified tweet on Twitter.
-
-### What it does
-This block removes an existing tweet using its tweet ID.
-
-### How it works
-It uses the Twitter API (Tweepy) to delete the tweet with the given ID, handling authentication and error cases.
-
-### Inputs
-| Input | Description |
-|-------|-------------|
-| credentials | Twitter API credentials with required scopes |
-| tweet_id | ID of the tweet to delete |
-
-### Outputs
-| Output | Description |
-|--------|-------------|
-| success | Whether deletion was successful |
-| error | Error message if deletion failed |
-
-### Possible use case
-Automated cleanup of old or irrelevant tweets.
-
----
-
-## Twitter Search Recent Tweets Block
-
-### What it is
-A block that searches recent public tweets on Twitter.
-
-### What it does
-This block searches for tweets matching specified criteria with options for filtering and pagination.
-
-### How it works
-It queries the Twitter API (Tweepy) search endpoint with the provided parameters and returns matching tweets and metadata.
-
-### Inputs
-| Input | Description |
-|-------|-------------|
-| credentials | Twitter API credentials with required scopes |
-| query | Search query string |
-| max_results | Maximum number of results per page |
-| pagination | Token for getting next page of results |
-| expansions | Additional data fields to include |
-| start_time | Start of search time window |
-| end_time | End of search time window |
-| since_id | Return results after this tweet ID |
-| until_id | Return results before this tweet ID |
-| sort_order | Order of returned results |
-
-### Outputs
-| Output | Description |
-|--------|-------------|
-| tweet_ids | List of matching tweet IDs |
-| tweet_texts | List of tweet text contents |
-| next_token | Token for retrieving next page |
-| data | Complete tweet data |
-| included | Additional requested data |
-| meta | Pagination and result metadata |
-| error | Error message if search failed |
-
-### Possible use case
-Monitoring Twitter for mentions of specific topics or hashtags.
-
----
-
-## Twitter Get Quote Tweets Block
-
-### What it is
-A block that retrieves quote tweets (tweets that quote a specific tweet) from Twitter.
-
-### What it does
-This block gets a list of tweets that quote the specified tweet ID, with options for pagination and filtering.
-
-### How it works
-It uses the Twitter API (Tweepy) to fetch quote tweets for a given tweet ID, handling authentication and returning tweet data with optional expansions.
-
-### Inputs
-| Input | Description |
-|-------|-------------|
-| credentials | Twitter API credentials with required scopes |
-| tweet_id | ID of the tweet to get quotes for |
-| max_results | Maximum number of results to return (max 100) |
-| exclude | Types of tweets to exclude |
-| pagination_token | Token for getting next page of results |
-| expansions | Additional data fields to include [more info](twitter/twitter.md#common-input). |
-| media_fields | Media-related fields to include [more info](twitter/twitter.md#common-input). |
-| place_fields | Location-related fields to include [more info](twitter/twitter.md#common-input). |
-| poll_fields | Poll-related fields to include [more info](twitter/twitter.md#common-input). |
-| tweet_fields | Tweet-specific fields to include [more info](twitter/twitter.md#common-input). |
-| user_fields | User-related fields to include [more info](twitter/twitter.md#common-input). |
-
-### Outputs
-| Output | Description |
-|--------|-------------|
-| ids | List of quote tweet IDs |
-| texts | List of quote tweet text contents |
-| next_token | Token for retrieving next page [more info](twitter/twitter.md#common-output). |
-| data | Complete tweet data |
-| included | Additional requested data [more info](twitter/twitter.md#common-output). |
-| meta | Pagination and result metadata [more info](twitter/twitter.md#common-output). |
-| error | Error message if request failed |
-
-### Possible use case
-Monitoring engagement and responses to specific tweets through quote tweets.
-
----
-
-## Twitter Retweet Block
-
-### What it is
-A block that retweets an existing tweet on Twitter.
-
-### What it does
-This block creates a retweet of the specified tweet using its tweet ID.
-
-### How it works
-It uses the Twitter API (Tweepy) to retweet the tweet with the given ID, handling authentication and error cases.
-
-### Inputs
-| Input | Description |
-|-------|-------------|
-| credentials | Twitter API credentials with required scopes |
-| tweet_id | ID of the tweet to retweet |
-
-### Outputs
-| Output | Description |
-|--------|-------------|
-| success | Whether retweet was successful |
-| error | Error message if retweet failed |
-
-### Possible use case
-Automated retweeting of content matching specific criteria.
-
----
-
-## Twitter Remove Retweet Block
-
-### What it is
-A block that removes a retweet on Twitter.
-
-### What it does
-This block removes an existing retweet of the specified tweet.
-
-### How it works
-It uses the Twitter API (Tweepy) to remove the retweet with the given tweet ID, handling authentication and error cases.
-
-### Inputs
-| Input | Description |
-|-------|-------------|
-| credentials | Twitter API credentials with required scopes |
-| tweet_id | ID of the tweet to remove retweet from |
-
-### Outputs
-| Output | Description |
-|--------|-------------|
-| success | Whether retweet removal was successful |
-| error | Error message if removal failed |
-
-### Possible use case
-Automated cleanup of retweets based on certain conditions.
-
----
-
-## Twitter Get Retweeters Block
-
-### What it is
-A block that retrieves information about users who have retweeted a specific tweet.
-
-### What it does
-This block gets a list of users who have retweeted the specified tweet ID, with options for pagination and filtering.
-
-### How it works
-It uses the Twitter API (Tweepy) to fetch retweeter information for a given tweet ID, handling authentication and returning user data with optional expansions.
-
-### Inputs
-| Input | Description |
-|-------|-------------|
-| credentials | Twitter API credentials with required scopes |
-| tweet_id | ID of the tweet to get retweeters for |
-| max_results | Maximum number of results per page (1-100) |
-| pagination_token | Token for getting next page of results |
-| expansions | Additional data fields to include [more info](twitter/twitter.md#common-input). |
-| media_fields | Media-related fields to include [more info](twitter/twitter.md#common-input). |
-| place_fields | Location-related fields to include [more info](twitter/twitter.md#common-input). |
-| poll_fields | Poll-related fields to include [more info](twitter/twitter.md#common-input). |
-| tweet_fields | Tweet-specific fields to include [more info](twitter/twitter.md#common-input). |
-| user_fields | User-related fields to include [more info](twitter/twitter.md#common-input). |
-
-### Outputs
-| Output | Description |
-|--------|-------------|
-| ids | List of user IDs who retweeted |
-| names | List of user names who retweeted |
-| usernames | List of usernames who retweeted |
-| next_token | Token for retrieving next page |
-| data | Complete user data |
-| included | Additional requested data [more info](twitter/twitter.md#common-output). |
-| meta | Pagination and result metadata [more info](twitter/twitter.md#common-output). |
-| error | Error message if request failed |
-
-### Possible use case
-Monitoring engagement and analyzing user behavior through retweet patterns.
-
----
-
-## Twitter Get User Mentions Block
-
-### What it is
-A block that retrieves tweets mentioning a specific Twitter user.
-
-### What it does
-This block gets tweets where a user is mentioned, using their user ID.
-
-### How it works
-It queries the Twitter API (Tweepy) with the provided user ID to fetch tweets mentioning that user, handling pagination and filters.
-
-### Inputs
-| Input | Description |
-|-------|-------------|
-| credentials | Twitter API credentials with required scopes |
-| user_id | ID of user to get mentions for |
-| max_results | Number of results per page (5-100) |
-| pagination_token | Token for getting next page of results |
-| expansions | Additional data fields to include [more info](twitter/twitter.md#common-input). |
-| media_fields | Media-related fields to include [more info](twitter/twitter.md#common-input). |
-| place_fields | Location-related fields to include [more info](twitter/twitter.md#common-input). |
-| poll_fields | Poll-related fields to include [more info](twitter/twitter.md#common-input). |
-| tweet_fields | Tweet-specific fields to include [more info](twitter/twitter.md#common-input). |
-| user_fields | User-related fields to include [more info](twitter/twitter.md#common-input). |
-
-### Outputs
-| Output | Description |
-|--------|-------------|
-| ids | List of Tweet IDs |
-| texts | List of tweet text contents |
-| userIds | List of user IDs who mentioned target user |
-| userNames | List of usernames who mentioned target user |
-| next_token | Token for retrieving next page |
-| data | Complete tweet data |
-| included | Additional requested data [more info](twitter/twitter.md#common-output). |
-| meta | Pagination and result metadata [more info](twitter/twitter.md#common-output). |
-| error | Error message if request failed |
-
-### Possible use case
-Monitoring mentions of specific accounts for community management.
-
----
-
-## Twitter Get Home Timeline Block
-
-### What it is
-A block that retrieves tweets from a user's home timeline.
-
-### What it does
-This block returns a collection of recent tweets and retweets posted by the authenticated user and accounts they follow.
-
-### How it works
-It uses the Twitter API (Tweepy) to fetch tweets from the home timeline, handling pagination and applying filters.
-
-### Inputs
-| Input | Description |
-|-------|-------------|
-| credentials | Twitter API credentials with required scopes |
-| max_results | Number of results per page (5-100) |
-| pagination_token | Token for getting next page of results |
-| expansions | Additional data fields to include [more info](twitter/twitter.md#common-input). |
-| media_fields | Media-related fields to include [more info](twitter/twitter.md#common-input). |
-| place_fields | Location-related fields to include [more info](twitter/twitter.md#common-input). |
-| poll_fields | Poll-related fields to include [more info](twitter/twitter.md#common-input). |
-| tweet_fields | Tweet-specific fields to include [more info](twitter/twitter.md#common-input). |
-| user_fields | User-related fields to include [more info](twitter/twitter.md#common-input). |
-
-### Outputs
-| Output | Description |
-|--------|-------------|
-| ids | List of Tweet IDs |
-| texts | List of tweet text contents |
-| userIds | List of user IDs who authored tweets |
-| userNames | List of usernames who authored tweets |
-| next_token | Token for retrieving next page |
-| data | Complete tweet data |
-| included | Additional requested data [more info](twitter/twitter.md#common-output). |
-| meta | Pagination and result metadata [more info](twitter/twitter.md#common-output). |
-| error | Error message if request failed |
-
-### Possible use case
-Monitoring and analyzing content from followed accounts.
-
----
-
-## Twitter Get User Tweets Block
-
-### What it is
-A block that retrieves tweets posted by a specific Twitter user.
-
-### What it does
-This block returns tweets authored by a single user, identified by their user ID.
-
-### How it works
-It uses the Twitter API (Tweepy) to fetch tweets from a specified user's timeline, handling pagination and filters.
-
-### Inputs
-| Input | Description |
-|-------|-------------|
-| credentials | Twitter API credentials with required scopes |
-| user_id | ID of user to get tweets from |
-| max_results | Number of results per page (5-100) |
-| pagination_token | Token for getting next page of results |
-| expansions | Additional data fields to include [more info](twitter/twitter.md#common-input). |
-| media_fields | Media-related fields to include [more info](twitter/twitter.md#common-input). |
-| place_fields | Location-related fields to include [more info](twitter/twitter.md#common-input). |
-| poll_fields | Poll-related fields to include [more info](twitter/twitter.md#common-input). |
-| tweet_fields | Tweet-specific fields to include [more info](twitter/twitter.md#common-input). |
-| user_fields | User-related fields to include [more info](twitter/twitter.md#common-input). |
-
-### Outputs
-| Output | Description |
-|--------|-------------|
-| ids | List of Tweet IDs |
-| texts | List of tweet text contents |
-| userIds | List of user IDs who authored tweets |
-| userNames | List of usernames who authored tweets |
-| next_token | Token for retrieving next page |
-| data | Complete tweet data |
-| included | Additional requested data [more info](twitter/twitter.md#common-output). |
-| meta | Pagination and result metadata [more info](twitter/twitter.md#common-output). |
-| error | Error message if request failed |
-
-### Possible use case
-Analyzing content and activity patterns of specific Twitter accounts.
-
----
-
-## Twitter Get Tweet Block
-
-### What it is
-A block that retrieves detailed information about a specific tweet by its ID.
-
-### What it does
-This block fetches information about a single tweet specified by the tweet ID, including tweet content, author details, and optional expanded data.
-
-### How it works
-It uses the Twitter API (Tweepy) to fetch a single tweet by its ID, handling authentication and returning tweet data with optional expansions.
-
-### Inputs
-| Input | Description |
-|-------|-------------|
-| credentials | Twitter API credentials with required scopes |
-| tweet_id | ID of the tweet to fetch |
-| expansions | Additional data fields to include [more info](twitter/twitter.md#common-input). |
-| media_fields | Media-related fields to include [more info](twitter/twitter.md#common-input). |
-| place_fields | Location-related fields to include [more info](twitter/twitter.md#common-input). |
-| poll_fields | Poll-related fields to include [more info](twitter/twitter.md#common-input). |
-| tweet_fields | Tweet-specific fields to include [more info](twitter/twitter.md#common-input). |
-| user_fields | User-related fields to include [more info](twitter/twitter.md#common-input). |
-
-### Outputs
-| Output | Description |
-|--------|-------------|
-| id | Tweet ID |
-| text | Tweet text content |
-| userId | ID of tweet author |
-| userName | Username of tweet author |
-| data | Complete tweet data |
-| included | Additional requested data [more info](twitter/twitter.md#common-output). |
-| meta | Tweet metadata [more info](twitter/twitter.md#common-output). |
-| error | Error message if request failed |
-
-### Possible use case
-Retrieving detailed information about specific tweets for analysis or monitoring.
-
----
-
-## Twitter Get Tweets Block
-
-### What it is
-A block that retrieves information about multiple tweets by their IDs.
-
-### What it does
-This block fetches information about multiple tweets (up to 100) specified by their tweet IDs.
-
-### How it works
-It uses the Twitter API (Tweepy) to batch fetch tweets by their IDs, handling authentication and returning tweet data with optional expansions.
-
-### Inputs
-| Input | Description |
-|-------|-------------|
-| credentials | Twitter API credentials with required scopes |
-| tweet_ids | List of tweet IDs to fetch (max 100) |
-| expansions | Additional data fields to include [more info](twitter/twitter.md#common-input). |
-| media_fields | Media-related fields to include [more info](twitter/twitter.md#common-input). |
-| place_fields | Location-related fields to include [more info](twitter/twitter.md#common-input). |
-| poll_fields | Poll-related fields to include [more info](twitter/twitter.md#common-input). |
-| tweet_fields | Tweet-specific fields to include [more info](twitter/twitter.md#common-input). |
-| user_fields | User-related fields to include [more info](twitter/twitter.md#common-input). |
-
-### Outputs
-| Output | Description |
-|--------|-------------|
-| ids | List of tweet IDs |
-| texts | List of tweet text contents |
-| userIds | List of tweet author IDs |
-| userNames | List of tweet author usernames |
-| data | Complete tweet data array |
-| included | Additional requested data [more info](twitter/twitter.md#common-output). |
-| meta | Tweet metadata [more info](twitter/twitter.md#common-output). |
-| error | Error message if request failed |
-
-### Possible use case
-Batch retrieval of tweet information for analysis or archival purposes.
-
----
-
-## Twitter Like Tweet Block
-
-### What it is
-A block that likes a tweet on Twitter.
-
-### What it does
-This block creates a like on a specified tweet using its tweet ID.
-
-### How it works
-It uses the Twitter API (Tweepy) to like the tweet with the given ID, handling authentication and error cases.
-
-### Inputs
-| Input | Description |
-|-------|-------------|
-| credentials | Twitter API credentials with required scopes |
-| tweet_id | ID of the tweet to like |
-
-### Outputs
-| Output | Description |
-|--------|-------------|
-| success | Whether like was successful |
-| error | Error message if like failed |
-
-### Possible use case
-Automated liking of tweets matching specific criteria.
-
----
-
-## Twitter Get Liking Users Block
-
-### What it is
-A block that retrieves information about users who liked a specific tweet.
-
-### What it does
-This block gets a list of users who have liked the specified tweet ID, with options for pagination and filtering.
-
-### How it works
-It uses the Twitter API (Tweepy) to fetch information about users who liked a given tweet ID, handling authentication and returning user data with optional expansions.
-
-### Inputs
-| Input | Description |
-|-------|-------------|
-| credentials | Twitter API credentials with required scopes |
-| tweet_id | ID of tweet to get liking users for |
-| max_results | Maximum number of results to return (1-100) |
-| pagination_token | Token for getting next page of results |
-| expansions | Additional data fields to include [more info](twitter/twitter.md#common-input). |
-| tweet_fields | Tweet-specific fields to include [more info](twitter/twitter.md#common-input). |
-| user_fields | User-related fields to include [more info](twitter/twitter.md#common-input). |
-
-### Outputs
-| Output | Description |
-|--------|-------------|
-| id | List of user IDs who liked |
-| username | List of usernames who liked |
-| next_token | Token for retrieving next page |
-| data | Complete user data |
-| included | Additional requested data [more info](twitter/twitter.md#common-output). |
-| meta | Pagination and result metadata [more info](twitter/twitter.md#common-output). |
-| error | Error message if request failed |
-
-### Possible use case
-Analyzing engagement patterns through tracking tweet likes.
-
----
-
-## Twitter Get Liked Tweets Block
-
-### What it is
-A block that retrieves tweets liked by a specific Twitter user.
-
-### What it does
-This block gets a list of tweets that have been liked by the specified user ID.
-
-### How it works
-It uses the Twitter API (Tweepy) to fetch tweets liked by a given user ID, handling pagination and filters.
-
-### Inputs
-| Input | Description |
-|-------|-------------|
-| credentials | Twitter API credentials with required scopes |
-| user_id | ID of user to get liked tweets for |
-| max_results | Maximum number of results per page (5-100) |
-| pagination_token | Token for getting next page of results |
-| expansions | Additional data fields to include [more info](twitter/twitter.md#common-input). |
-| media_fields | Media-related fields to include [more info](twitter/twitter.md#common-input). |
-| place_fields | Location-related fields to include [more info](twitter/twitter.md#common-input). |
-| poll_fields | Poll-related fields to include [more info](twitter/twitter.md#common-input). |
-| tweet_fields | Tweet-specific fields to include [more info](twitter/twitter.md#common-input). |
-| user_fields | User-related fields to include [more info](twitter/twitter.md#common-input). |
-
-### Outputs
-| Output | Description |
-|--------|-------------|
-| ids | List of liked tweet IDs |
-| texts | List of liked tweet text contents |
-| userIds | List of tweet author IDs |
-| userNames | List of tweet author usernames |
-| next_token | Token for retrieving next page |
-| data | Complete tweet data |
-| included | Additional requested data [more info](twitter/twitter.md#common-output). |
-| meta | Pagination and result metadata [more info](twitter/twitter.md#common-output). |
-| error | Error message if request failed |
-
-### Possible use case
-Analyzing user interests and preferences through liked tweet patterns.
-
----
-
-## Twitter Unlike Tweet Block
-
-### What it is
-A block that unlikes a previously liked tweet on Twitter.
-
-### What it does
-This block removes a like from the specified tweet using its tweet ID.
-
-### How it works
-It uses the Twitter API (Tweepy) to unlike the tweet with the given ID, handling authentication and error cases.
-
-### Inputs
-| Input | Description |
-|-------|-------------|
-| credentials | Twitter API credentials with required scopes |
-| tweet_id | ID of the tweet to unlike |
-
-### Outputs
-| Output | Description |
-|--------|-------------|
-| success | Whether unlike was successful |
-| error | Error message if unlike failed |
-
-### Possible use case
-Automated cleanup of likes based on certain conditions.
-
----
-
-## Twitter Hide Reply Block
-
-### What it is
-A block that hides a reply to one of your tweets.
-
-### What it does
-This block hides a specified reply tweet from being visible in the main conversation thread.
-
-### How it works
-It uses the Twitter API (Tweepy) to hide a reply tweet with the given tweet ID, handling authentication and error cases.
-
-### Inputs
-| Input | Description |
-|-------|-------------|
-| credentials | Twitter API credentials with required scopes |
-| tweet_id | ID of the tweet reply to hide |
-
-### Outputs
-| Output | Description |
-|--------|-------------|
-| success | Whether hiding was successful |
-| error | Error message if hiding failed |
-
-### Possible use case
-Moderating conversations by hiding inappropriate or unwanted replies.
-
----
-
-## Twitter Unhide Reply Block
-
-### What it is
-A block that unhides a previously hidden reply to a tweet.
-
-### What it does
-This block makes a hidden reply tweet visible again in the conversation thread.
-
-### How it works
-It uses the Twitter API (Tweepy) to unhide a reply tweet with the given tweet ID, handling authentication and error cases.
-
-### Inputs
-| Input | Description |
-|-------|-------------|
-| credentials | Twitter API credentials with required scopes |
-| tweet_id | ID of the tweet reply to unhide |
-
-### Outputs
-| Output | Description |
-|--------|-------------|
-| success | Whether unhiding was successful |
-| error | Error message if unhiding failed |
-
-### Possible use case
-Restoring previously hidden replies when moderation is no longer needed.
-
----
-
-## Twitter Bookmark Tweet Block
-
-### What it is
-A block that bookmarks a specified tweet on Twitter.
-
-### What it does
-This block creates a bookmark for a tweet using its tweet ID.
-
-### How it works
-It uses the Twitter API (Tweepy) to bookmark the tweet with the given ID, handling authentication and error cases.
-
-### Inputs
-| Input | Description |
-|-------|-------------|
-| credentials | Twitter API credentials with required scopes |
-| tweet_id | ID of the tweet to bookmark |
-
-### Outputs
-| Output | Description |
-|--------|-------------|
-| success | Whether bookmark was successful |
-| error | Error message if bookmark failed |
-
-### Possible use case
-Saving tweets for later reference and organization.
-
----
-
-## Twitter Get Bookmarked Tweets Block
-
-### What it is
-A block that retrieves a user's bookmarked tweets from Twitter.
-
-### What it does
-This block gets a list of tweets that have been bookmarked by the authenticated user.
-
-### How it works
-It uses the Twitter API (Tweepy) to fetch bookmarked tweets, handling pagination and optional data expansions.
-
-### Inputs
-| Input | Description |
-|-------|-------------|
-| credentials | Twitter API credentials with required scopes |
-| max_results | Maximum number of results per page (1-100) |
-| pagination_token | Token for getting next page of results |
-| expansions | Additional data fields to include [more info](twitter/twitter.md#common-input). |
-| media_fields | Media-related fields to include [more info](twitter/twitter.md#common-input). |
-| place_fields | Location-related fields to include [more info](twitter/twitter.md#common-input). |
-| poll_fields | Poll-related fields to include [more info](twitter/twitter.md#common-input). |
-| tweet_fields | Tweet-specific fields to include [more info](twitter/twitter.md#common-input). |
-| user_fields | User-related fields to include [more info](twitter/twitter.md#common-input). |
-
-### Outputs
-| Output | Description |
-|--------|-------------|
-| id | List of bookmarked tweet IDs |
-| text | List of bookmarked tweet text contents |
-| userId | List of tweet author IDs |
-| userName | List of tweet author usernames |
-| next_token | Token for retrieving next page |
-| data | Complete tweet data |
-| included | Additional requested data [more info](twitter/twitter.md#common-output). |
-| meta | Pagination and result metadata [more info](twitter/twitter.md#common-output). |
-| error | Error message if request failed |
-
-### Possible use case
-Retrieving and analyzing saved tweets for content curation or research.
-
----
-
-## Twitter Remove Bookmark Tweet Block
-
-### What it is
-A block that removes a bookmark from a tweet on Twitter.
-
-### What it does
-This block removes an existing bookmark from a specified tweet using its tweet ID.
-
-### How it works
-It uses the Twitter API (Tweepy) to remove the bookmark with the given tweet ID, handling authentication and error cases.
-
-### Inputs
-| Input | Description |
-|-------|-------------|
-| credentials | Twitter API credentials with required scopes |
-| tweet_id | ID of the tweet to remove bookmark from |
-
-### Outputs
-| Output | Description |
-|--------|-------------|
-| success | Whether bookmark removal was successful |
-| error | Error message if removal failed |
-
-### Possible use case
-Managing bookmarks by removing outdated or no longer relevant saved tweets.
-
----
-
-## Twitter Unblock User Block
-
-### What it is
-A block that unblocks a user that has been previously blocked on Twitter.
-
-### What it does
-This block removes a block from a specified user using their user ID.
-
-### How it works
-It uses the Twitter API (Tweepy) to unblock a user with the given user ID, handling authentication and error cases.
-
-### Inputs
-| Input | Description |
-|-------|-------------|
-| credentials | Twitter API credentials with required scopes |
-| target_user_id | ID of the user to unblock |
-
-### Outputs
-| Output | Description |
-|--------|-------------|
-| success | Whether unblock was successful |
-| error | Error message if unblock failed |
-
-### Possible use case
-Reverting previously blocked users when access should be restored.
-
----
-
-## Twitter Get Blocked Users Block
-
-### What it is
-A block that retrieves a list of users that have been blocked by the authenticated user.
-
-### What it does
-This block gets information about users who have been blocked, with options for pagination and filtering.
-
-### How it works
-It uses the Twitter API (Tweepy) to fetch a list of blocked users, handling authentication and returning user data with optional expansions.
-
-### Inputs
-| Input | Description |
-|-------|-------------|
-| credentials | Twitter API credentials with required scopes |
-| max_results | Maximum number of results to return (1-1000) |
-| pagination_token | Token for getting next page of results |
-| expansions | Additional data fields to include |
-| tweet_fields | Tweet-specific fields to include |
-| user_fields | User-related fields to include |
-
-### Outputs
-| Output | Description |
-|--------|-------------|
-| user_ids | List of blocked user IDs |
-| usernames_ | List of blocked usernames |
-| included | Additional requested data |
-| meta | Pagination and result metadata |
-| next_token | Token for retrieving next page |
-| error | Error message if request failed |
-
-### Possible use case
-Monitoring and managing blocked users for account safety and moderation.
-
----
-
-## Twitter Block User Block
-
-### What it is
-A block that blocks a user on Twitter.
-
-### What it does
-This block blocks a specified user using their user ID.
-
-### How it works
-It uses the Twitter API (Tweepy) to block a user with the given user ID, handling authentication and error cases.
-
-### Inputs
-| Input | Description |
-|-------|-------------|
-| credentials | Twitter API credentials with required scopes |
-| target_user_id | ID of the user to block |
-
-### Outputs
-| Output | Description |
-|--------|-------------|
-| success | Whether block was successful |
-| error | Error message if block failed |
-
-### Possible use case
-Automating user blocking based on specific criteria or behaviors.
-
-## Twitter Unfollow User Block
-
-### What it is
-A block that unfollows a Twitter user.
-
-### What it does
-This block unfollows a specified user using their user ID.
-
-### How it works
-It uses the Twitter API (Tweepy) to unfollow a user with the given user ID, handling authentication and error cases.
-
-### Inputs
-| Input | Description |
-|-------|-------------|
-| credentials | Twitter API credentials with required scopes |
-| target_user_id | ID of the user to unfollow |
-
-### Outputs
-| Output | Description |
-|--------|-------------|
-| success | Whether unfollow was successful |
-| error | Error message if unfollow failed |
-
-### Possible use case
-Automating unfollowing users based on specific criteria.
-
----
-
-## Twitter Follow User Block
-
-### What it is
-A block that follows a Twitter user.
-
-### What it does
-This block follows a specified user using their user ID.
-
-### How it works
-It uses the Twitter API (Tweepy) to follow a user with the given user ID, handling authentication and error cases. If the target user has protected tweets, this will send a follow request.
-
-### Inputs
-| Input | Description |
-|-------|-------------|
-| credentials | Twitter API credentials with required scopes |
-| target_user_id | ID of the user to follow |
-
-### Outputs
-| Output | Description |
-|--------|-------------|
-| success | Whether follow was successful |
-| error | Error message if follow failed |
-
-### Possible use case
-Automating following of users matching specific criteria.
-
----
-
-## Twitter Get Followers Block
-
-### What it is
-A block that retrieves a list of followers for a specified Twitter user.
-
-### What it does
-This block gets a list of users who follow the specified user ID, with options for pagination and filtering.
-
-### How it works
-It uses the Twitter API (Tweepy) to fetch followers for a given user ID, handling authentication and returning user data with optional expansions.
-
-### Inputs
-| Input | Description |
-|-------|-------------|
-| credentials | Twitter API credentials with required scopes |
-| target_user_id | ID of user to get followers for |
-| max_results | Maximum number of results per page (1-1000) |
-| pagination_token | Token for getting next page of results |
-| expansions | Additional data fields to include [more info](twitter/twitter.md#common-input). |
-| tweet_fields | Tweet-specific fields to include [more info](twitter/twitter.md#common-input). |
-| user_fields | User-related fields to include [more info](twitter/twitter.md#common-input). |
-
-### Outputs
-| Output | Description |
-|--------|-------------|
-| ids | List of follower user IDs |
-| usernames | List of follower usernames |
-| next_token | Token for retrieving next page |
-| data | Complete user data |
-| includes | Additional requested data [more info](twitter/twitter.md#common-output). |
-| meta | Pagination and result metadata [more info](twitter/twitter.md#common-output). |
-| error | Error message if request failed |
-
-### Possible use case
-Analyzing follower patterns and demographics.
-
----
-
-## Twitter Get Following Block
-
-### What it is
-A block that retrieves a list of users that a specified Twitter user follows.
-
-### What it does
-This block gets a list of users being followed by the specified user ID, with options for pagination and filtering.
-
-### How it works
-It uses the Twitter API (Tweepy) to fetch following list for a given user ID, handling authentication and returning user data with optional expansions.
-
-### Inputs
-| Input | Description |
-|-------|-------------|
-| credentials | Twitter API credentials with required scopes |
-| target_user_id | ID of user to get following list for |
-| max_results | Maximum number of results per page (1-1000) |
-| pagination_token | Token for getting next page of results |
-| expansions | Additional data fields to include [more info](twitter/twitter.md#common-input). |
-| tweet_fields | Tweet-specific fields to include [more info](twitter/twitter.md#common-input). |
-| user_fields | User-related fields to include [more info](twitter/twitter.md#common-input). |
-
-### Outputs
-| Output | Description |
-|--------|-------------|
-| ids | List of following user IDs |
-| usernames | List of following usernames |
-| next_token | Token for retrieving next page |
-| data | Complete user data |
-| includes | Additional requested data [more info](twitter/twitter.md#common-output). |
-| meta | Pagination and result metadata [more info](twitter/twitter.md#common-output). |
-| error | Error message if request failed |
-
-### Possible use case
-Analyzing following patterns and network connections.
-
----
-
-## Twitter Unmute User Block
-
-### What it is
-A block that unmutes a previously muted user on Twitter.
-
-### What it does
-This block unmutes a specified user using their user ID. The request succeeds with no action if the target user is not currently muted.
-
-### How it works
-It uses the Twitter API (Tweepy) to unmute a user with the given user ID, handling authentication and error cases.
-
-### Inputs
-| Input | Description |
-|-------|-------------|
-| credentials | Twitter API credentials with required scopes |
-| target_user_id | ID of the user to unmute |
-
-### Outputs
-| Output | Description |
-|--------|-------------|
-| success | Whether unmute was successful |
-| error | Error message if unmute failed |
-
-### Possible use case
-Reverting muted users when communication should be restored.
-
----
-
-## Twitter Get Muted Users Block
-
-### What it is
-A block that retrieves a list of users muted by the authenticated user.
-
-### What it does
-This block gets a list of muted users with options for pagination and filtering.
-
-### How it works
-It uses the Twitter API (Tweepy) to fetch muted users, handling authentication and returning user data with optional expansions.
-
-### Inputs
-| Input | Description |
-|-------|-------------|
-| credentials | Twitter API credentials with required scopes |
-| max_results | Maximum results per page (1-1000, default 10) |
-| pagination_token | Token for getting next/previous page |
-| expansions | Additional data fields to include [more info](twitter/twitter.md#common-input). |
-| tweet_fields | Tweet-specific fields to include [more info](twitter/twitter.md#common-input). |
-| user_fields | User-related fields to include [more info](twitter/twitter.md#common-input). |
-
-### Outputs
-| Output | Description |
-|--------|-------------|
-| ids | List of muted user IDs |
-| usernames | List of muted usernames |
-| next_token | Token for retrieving next page |
-| data | Complete user data for muted users |
-| includes | Additional requested data |
-| meta | Metadata including pagination info |
-| error | Error message if request failed |
-
-### Possible use case
-Monitoring and managing muted users list for content filtering.
-
----
-
-## Twitter Mute User Block
-
-### What it is
-A block that mutes a specified user on Twitter.
-
-### What it does
-This block mutes a user using their user ID to stop seeing their tweets.
-
-### How it works
-It uses the Twitter API (Tweepy) to mute a user with the given user ID, handling authentication and error cases.
-
-### Inputs
-| Input | Description |
-|-------|-------------|
-| credentials | Twitter API credentials with required scopes |
-| target_user_id | ID of the user to mute |
-
-### Outputs
-| Output | Description |
-|--------|-------------|
-| success | Whether mute was successful |
-| error | Error message if mute failed |
-
-### Possible use case
-Automating user muting based on specific criteria or behaviors.
-
----
-
-## Twitter Get User Block
-
-### What it is
-A block that retrieves information about a single Twitter user by either their user ID or username.
-
-### What it does
-This block fetches detailed user information, including basic profile data and optional expanded information, for a specified Twitter user.
-
-### How it works
-It uses the Twitter API (Tweepy) to fetch user data for a single user identified by either ID or username, handling authentication and returning user data with optional expansions.
-
-### Inputs
-| Input | Description |
-|-------|-------------|
-| credentials | Twitter API credentials with required scopes |
-| identifier | User identifier (either user ID or username) |
-| expansions | Additional data fields to include [more info](twitter/twitter.md#common-input). |
-| tweet_fields | Tweet-specific fields to include [more info](twitter/twitter.md#common-input). |
-| user_fields | User-related fields to include [more info](twitter/twitter.md#common-input). |
-
-### Outputs
-| Output | Description |
-|--------|-------------|
-| id | User ID |
-| username_ | Twitter username |
-| name_ | Display name |
-| data | Complete user data |
-| included | Additional requested data |
-| error | Error message if request failed |
-
-### Possible use case
-Retrieving detailed user profile information for analysis or verification.
-
----
-
-## Twitter Get Users Block
-
-### What it is
-A block that retrieves information about multiple Twitter users by their IDs or usernames.
-
-### What it does
-This block fetches detailed user information for up to 100 users at once, including basic profile data and optional expanded information.
-
-### How it works
-It uses the Twitter API (Tweepy) to batch fetch user data for multiple users identified by either IDs or usernames, handling authentication and returning user data with optional expansions.
-
-### Inputs
-| Input | Description |
-|-------|-------------|
-| credentials | Twitter API credentials with required scopes |
-| identifier | List of user identifiers (either user IDs or usernames, max 100) |
-| expansions | Additional data fields to include [more info](twitter/twitter.md#common-input). |
-| tweet_fields | Tweet-specific fields to include [more info](twitter/twitter.md#common-input). |
-| user_fields | User-related fields to include [more info](twitter/twitter.md#common-input). |
-
-### Outputs
-| Output | Description |
-|--------|-------------|
-| ids | List of user IDs |
-| usernames_ | List of Twitter usernames |
-| names_ | List of display names |
-| data | Complete user data array |
-| included | Additional requested data |
-| error | Error message if request failed |
-
-### Possible use case
-Batch retrieval of user profile information for analysis or monitoring.
-
----
-
-## Twitter Search Spaces Block
-
-### What it is
-A block that searches for live or scheduled Twitter Spaces by specified search terms.
-
-### What it does
-This block searches for Twitter Spaces based on title keywords, with options to filter by state (live/scheduled) and pagination.
-
-### How it works
-It uses the Twitter API (Tweepy) to search for Spaces matching the query parameters, handling authentication and returning Space data with optional expansions.
-
-### Inputs
-| Input | Description |
-|-------|-------------|
-| credentials | Twitter API credentials with required scopes |
-| query | Search term to find in Space titles |
-| max_results | Maximum number of results to return (1-100, default 10) |
-| state | Type of Spaces to return (live, scheduled, or all) |
-| expansions | Additional data fields to include [more info](twitter/twitter.md#common-input). |
-| space_fields | Space-specific fields to include [more info](twitter/twitter.md#common-input). |
-| user_fields | User-related fields to include [more info](twitter/twitter.md#common-input). |
-
-### Outputs
-| Output | Description |
-|--------|-------------|
-| ids | List of space IDs |
-| titles | List of space titles |
-| host_ids | List of host IDs |
-| next_token | Token for retrieving next page |
-| data | Complete space data |
-| includes | Additional requested data |
-| meta | Metadata including pagination info |
-| error | Error message if request failed |
-
-### Possible use case
-Finding relevant Twitter Spaces for content discovery and engagement.
-
----
-
-## Twitter Get Spaces Block
-
-### What it is
-A block that retrieves information about multiple Twitter Spaces specified by Space IDs or creator user IDs.
-
-### What it does
-This block fetches detailed information for up to 100 Spaces using either their Space IDs or creator user IDs.
-
-### How it works
-It uses the Twitter API (Tweepy) to batch fetch Space data for multiple Spaces, handling authentication and returning Space data with optional expansions.
-
-### Inputs
-| Input | Description |
-|-------|-------------|
-| credentials | Twitter API credentials with required scopes |
-| identifier | Choice of lookup by Space IDs or creator user IDs |
-| expansions | Additional data fields to include [more info](twitter/twitter.md#common-input). |
-| space_fields | Space-specific fields to include [more info](twitter/twitter.md#common-input). |
-| user_fields | User-related fields to include [more info](twitter/twitter.md#common-input). |
-
-### Outputs
-| Output | Description |
-|--------|-------------|
-| ids | List of Space IDs |
-| titles | List of Space titles |
-| data | Complete Space data array |
-| includes | Additional requested data |
-| error | Error message if request failed |
-
-### Possible use case
-Batch retrieval of Space information for analytics or monitoring.
-
----
-
-## Twitter Get Space By ID Block
-
-### What it is
-A block that retrieves information about a single Twitter Space specified by Space ID.
-
-### What it does
-This block fetches detailed information about a single Space, including host information and other metadata.
-
-### How it works
-It uses the Twitter API (Tweepy) to fetch Space data for a single Space ID, handling authentication and returning Space data with optional expansions.
-
-### Inputs
-| Input | Description |
-|-------|-------------|
-| credentials | Twitter API credentials with required scopes |
-| space_id | ID of Space to retrieve |
-| expansions | Additional data fields to include [more info](twitter/twitter.md#common-input). |
-| space_fields | Space-specific fields to include [more info](twitter/twitter.md#common-input). |
-| user_fields | User-related fields to include [more info](twitter/twitter.md#common-input). |
-
-### Outputs
-| Output | Description |
-|--------|-------------|
-| id | Space ID |
-| title | Space title |
-| host_ids | List of host IDs |
-| data | Complete Space data |
-| includes | Additional requested data |
-| error | Error message if request failed |
-
-### Possible use case
-Retrieving detailed information about a specific Space for analysis or display.
-
----
-
-## Twitter Get Space Buyers Block
-
-### What it is
-A block that retrieves a list of users who purchased tickets to a Twitter Space.
-
-### What it does
-This block gets information about users who bought tickets to attend a specific Space.
-
-### How it works
-It uses the Twitter API (Tweepy) to fetch buyer information for a Space, handling authentication and returning user data with optional expansions.
-
-### Inputs
-| Input | Description |
-|-------|-------------|
-| credentials | Twitter API credentials with required scopes |
-| space_id | ID of Space to get buyers for |
-| expansions | Additional data fields to include [more info](twitter/twitter.md#common-input). |
-| user_fields | User-related fields to include [more info](twitter/twitter.md#common-input). |
-
-### Outputs
-| Output | Description |
-|--------|-------------|
-| buyer_ids | List of buyer user IDs |
-| usernames | List of buyer usernames |
-| data | Complete buyer user data |
-| includes | Additional requested data |
-| error | Error message if request failed |
-
-### Possible use case
-Analyzing ticket sales and attendee information for monetized Spaces.
-
----
-
-## Twitter Get Space Tweets Block
-
-### What it is
-A block that retrieves tweets shared in a specific Twitter Space.
-
-### What it does
-This block gets tweets that were shared during a Space session.
-
-### How it works
-It uses the Twitter API (Tweepy) to fetch tweets from a Space, handling authentication and returning tweet data with optional expansions.
-
-### Inputs
-| Input | Description |
-|-------|-------------|
-| credentials | Twitter API credentials with required scopes |
-| space_id | ID of Space to get tweets for |
-| expansions | Additional data fields to include [more info](twitter/twitter.md#common-input). |
-| media_fields | Media-related fields to include [more info](twitter/twitter.md#common-input). |
-| place_fields | Location-related fields to include [more info](twitter/twitter.md#common-input). |
-| poll_fields | Poll-related fields to include [more info](twitter/twitter.md#common-input). |
-| tweet_fields | Tweet-specific fields to include [more info](twitter/twitter.md#common-input). |
-| user_fields | User-related fields to include [more info](twitter/twitter.md#common-input). |
-
-### Outputs
-| Output | Description |
-|--------|-------------|
-| tweet_ids | List of tweet IDs |
-| texts | List of tweet texts |
-| data | Complete tweet data |
-| includes | Additional requested data |
-| meta | Response metadata |
-| error | Error message if request failed |
-
-### Possible use case
-Capturing and analyzing content shared during Space sessions.
-
----
-
-## Twitter Get List Block
-
-### What it is
-A block that retrieves detailed information about a specific Twitter List.
-
-### What it does
-This block fetches information about a Twitter List specified by its ID, including basic list data and optional expanded information.
-
-### How it works
-It uses the Twitter API (Tweepy) to fetch list data for a single list ID, handling authentication and returning list data with optional expansions.
-
-### Inputs
-| Input | Description |
-|-------|-------------|
-| credentials | Twitter API credentials with required scopes |
-| list_id | ID of the Twitter List to retrieve |
-| expansions | Additional data fields to include [more info](twitter/twitter.md#common-input). |
-| list_fields | List-specific fields to include [more info](twitter/twitter.md#common-input). |
-| user_fields | User-related fields to include [more info](twitter/twitter.md#common-input). |
-
-### Outputs
-| Output | Description |
-|--------|-------------|
-| id | List ID |
-| name | List name |
-| owner_id | ID of List owner |
-| owner_username | Username of List owner |
-| data | Complete list data |
-| included | Additional requested data |
-| meta | Response metadata |
-| error | Error message if request failed |
-
-### Possible use case
-Retrieving detailed information about specific Twitter Lists for analysis or display.
-
----
-
-## Twitter Get Owned Lists Block
-
-### What it is
-A block that retrieves all Twitter Lists owned by a specified user.
-
-### What it does
-This block fetches a list of Twitter Lists owned by a user ID, with options for pagination and filtering.
-
-### How it works
-It uses the Twitter API (Tweepy) to fetch owned lists for a given user ID, handling authentication and returning list data with optional expansions.
-
-### Inputs
-| Input | Description |
-|-------|-------------|
-| credentials | Twitter API credentials with required scopes |
-| user_id | ID of user whose Lists to retrieve |
-| max_results | Maximum results per page (1-100, default 10) |
-| pagination_token | Token for getting next page |
-| expansions | Additional data fields to include [more info](twitter/twitter.md#common-input). |
-| list_fields | List-specific fields to include [more info](twitter/twitter.md#common-input). |
-| user_fields | User-related fields to include [more info](twitter/twitter.md#common-input). |
-
-### Outputs
-| Output | Description |
-|--------|-------------|
-| list_ids | List of owned List IDs |
-| list_names | List of owned List names |
-| next_token | Token for retrieving next page |
-| data | Complete List data array |
-| included | Additional requested data |
-| meta | Metadata including pagination info |
-| error | Error message if request failed |
-
-### Possible use case
-Analyzing owned Lists for content curation and audience management.
-
----
-
-## Twitter Remove List Member Block
-
-### What it is
-A block that removes a member from a specified Twitter List owned by the authenticated user.
-
-### What it does
-This block removes a specified user from a Twitter List they are currently a member of.
-
-### How it works
-It uses the Twitter API (Tweepy) to remove a user from a specified List, handling authentication and error cases.
-
-### Inputs
-| Input | Description |
-|-------|-------------|
-| credentials | Twitter API credentials with required scopes |
-| list_id | ID of the List to remove member from |
-| user_id | ID of the user to remove from List |
-
-### Outputs
-| Output | Description |
-|--------|-------------|
-| success | Whether removal was successful |
-| error | Error message if removal failed |
-
-### Possible use case
-Managing List membership by removing users who no longer meet List criteria.
-
----
-
-## Twitter Add List Member Block
-
-### What it is
-A block that adds a member to a specified Twitter List owned by the authenticated user.
-
-### What it does
-This block adds a specified user as a new member to a Twitter List.
-
-### How it works
-It uses the Twitter API (Tweepy) to add a user to a specified List, handling authentication and error cases.
-
-### Inputs
-| Input | Description |
-|-------|-------------|
-| credentials | Twitter API credentials with required scopes |
-| list_id | ID of the List to add member to |
-| user_id | ID of the user to add to List |
-
-### Outputs
-| Output | Description |
-|--------|-------------|
-| success | Whether addition was successful |
-| error | Error message if addition failed |
-
-### Possible use case
-Growing List membership by adding users who match List criteria.
-
----
-
-## Twitter Get List Members Block
-
-### What it is
-A block that retrieves all members of a specified Twitter List.
-
-### What it does
-This block gets information about users who are members of a given List, with options for pagination and filtering.
-
-### How it works
-It uses the Twitter API (Tweepy) to fetch member data for a specified List, handling authentication and returning user data with optional expansions.
-
-### Inputs
-| Input | Description |
-|-------|-------------|
-| credentials | Twitter API credentials with required scopes |
-| list_id | ID of the List to get members from |
-| max_results | Maximum results per page (1-100, default 10) |
-| pagination_token | Token for getting next page of results |
-| expansions | Additional data fields to include |
-| tweet_fields | Tweet-related fields to include |
-| user_fields | User-related fields to include |
-
-### Outputs
-| Output | Description |
-|--------|-------------|
-| ids | List of member user IDs |
-| usernames | List of member usernames |
-| next_token | Token for retrieving next page |
-| data | Complete user data for members |
-| included | Additional requested data |
-| meta | Pagination and result metadata |
-| error | Error message if request failed |
-
-### Possible use case
-Analyzing List membership and member profiles.
-
----
-
-## Twitter Get List Memberships Block
-
-### What it is
-A block that retrieves all Lists that a specified user is a member of.
-
-### What it does
-This block gets information about Lists where the specified user is a member, with options for pagination and filtering.
-
-### How it works
-It uses the Twitter API (Tweepy) to fetch List membership data for a given user ID, handling authentication and returning List data with optional expansions.
-
-### Inputs
-| Input | Description |
-|-------|-------------|
-| credentials | Twitter API credentials with required scopes |
-| user_id | ID of user to get List memberships for |
-| max_results | Maximum results per page (1-100, default 10) |
-| pagination_token | Token for getting next page of results |
-| expansions | Additional data fields to include |
-| list_fields | List-specific fields to include |
-| user_fields | User-related fields to include |
-
-### Outputs
-| Output | Description |
-|--------|-------------|
-| list_ids | List of List IDs |
-| next_token | Token for retrieving next page |
-| data | Complete List membership data |
-| included | Additional requested data |
-| meta | Metadata about pagination |
-| error | Error message if request failed |
-
-### Possible use case
-Analyzing a user's List memberships to understand their interests and connections.
-
----
-
-## Twitter Get List Tweets Block
-
-### What it is
-A block that retrieves tweets from a specified Twitter List.
-
-### What it does
-This block fetches tweets that have been posted within a given List, with options for pagination, filtering, and expanded data.
-
-### How it works
-It uses the Twitter API (Tweepy) to fetch tweets from a specified List, handling authentication and returning tweet data with optional expansions.
-
-### Inputs
-| Input | Description |
-|-------|-------------|
-| credentials | Twitter API credentials with required scopes |
-| list_id | ID of the List to get tweets from |
-| max_results | Maximum number of results per page (1-100, default 10) |
-| pagination_token | Token for getting next page of results |
-| expansions | Additional data fields to include [more info](twitter/twitter.md#common-input). |
-| media_fields | Media-related fields to include [more info](twitter/twitter.md#common-input). |
-| place_fields | Location-related fields to include [more info](twitter/twitter.md#common-input). |
-| poll_fields | Poll-related fields to include [more info](twitter/twitter.md#common-input). |
-| tweet_fields | Tweet-specific fields to include [more info](twitter/twitter.md#common-input). |
-| user_fields | User-related fields to include [more info](twitter/twitter.md#common-input). |
-
-### Outputs
-| Output | Description |
-|--------|-------------|
-| tweet_ids | List of tweet IDs from the List |
-| texts | List of tweet text contents |
-| next_token | Token for retrieving next page |
-| data | Complete tweet data array |
-| included | Additional requested data [more info](twitter/twitter.md#common-output). |
-| meta | Pagination and result metadata [more info](twitter/twitter.md#common-output). |
-| error | Error message if request failed |
-
-### Possible use case
-Monitoring and analyzing tweets shared within curated Twitter Lists.
-
----
-
-## Twitter Delete List Block
-
-### What it is
-A block that deletes a Twitter List owned by the authenticated user.
-
-### What it does
-This block deletes a specified Twitter List using the List ID.
-
-### How it works
-It uses the Twitter API (Tweepy) to delete a specified List, handling authentication and error cases.
-
-### Inputs
-| Input | Description |
-|-------|-------------|
-| credentials | Twitter API credentials with required scopes |
-| list_id | ID of the List to delete |
-
-### Outputs
-| Output | Description |
-|--------|-------------|
-| success | Whether deletion was successful |
-| error | Error message if deletion failed |
-
-### Possible use case
-Removing outdated or unnecessary Twitter Lists.
-
----
-
-## Twitter Update List Block
-
-### What it is
-A block that updates a Twitter List owned by the authenticated user.
-
-### What it does
-This block modifies an existing List's name and/or description.
-
-### How it works
-It uses the Twitter API (Tweepy) to update List metadata, handling authentication and error cases.
-
-### Inputs
-| Input | Description |
-|-------|-------------|
-| credentials | Twitter API credentials with required scopes |
-| list_id | ID of List to update |
-| name | New name for the List (optional) |
-| description | New description for the List (optional) |
-
-### Outputs
-| Output | Description |
-|--------|-------------|
-| success | Whether update was successful |
-| error | Error message if update failed |
-
-### Possible use case
-Maintaining List metadata to reflect current purpose or organization.
-
----
-
-## Twitter Create List Block
-
-### What it is
-A block that creates a new Twitter List for the authenticated user.
-
-### What it does
-This block creates a new Twitter List with specified name, description and privacy settings.
-
-### How it works
-It uses the Twitter API (Tweepy) to create a new List, handling authentication and returning List details.
-
-### Inputs
-| Input | Description |
-|-------|-------------|
-| credentials | Twitter API credentials with required scopes |
-| name | Name for the new List |
-| description | Description of the List (optional) |
-| private | Whether List should be private |
-
-### Outputs
-| Output | Description |
-|--------|-------------|
-| url | URL of the created List |
-| list_id | ID of the created List |
-| error | Error message if creation failed |
-
-### Possible use case
-Creating Lists to organize Twitter users around specific topics or interests.
-
----
-
-## Twitter Unpin List Block
-
-### What it is
-A block that allows users to unpin a specified Twitter List.
-
-### What it does
-This block removes a Twitter List from the user's pinned Lists.
-
-### How it works
-It uses the Twitter API (Tweepy) to unpin a List using its List ID, handling authentication and error cases.
-
-### Inputs
-| Input | Description |
-|-------|-------------|
-| credentials | Twitter API credentials with required scopes |
-| list_id | ID of the List to unpin |
-
-### Outputs
-| Output | Description |
-|--------|-------------|
-| success | Whether unpin was successful |
-| error | Error message if unpin failed |
-
-### Possible use case
-Managing pinned Lists by removing Lists that are no longer priority.
-
----
-
-## Twitter Pin List Block
-
-### What it is
-A block that allows users to pin a specified Twitter List.
-
-### What it does
-This block pins a Twitter List to appear at the top of the user's Lists.
-
-### How it works
-It uses the Twitter API (Tweepy) to pin a List using its List ID, handling authentication and error cases.
-
-### Inputs
-| Input | Description |
-|-------|-------------|
-| credentials | Twitter API credentials with required scopes |
-| list_id | ID of the List to pin |
-
-### Outputs
-| Output | Description |
-|--------|-------------|
-| success | Whether pin was successful |
-| error | Error message if pin failed |
-
-### Possible use case
-Prioritizing important Lists for quick access.
-
----
-
-## Twitter Get Pinned Lists Block
-
-### What it is
-A block that retrieves all Twitter Lists that are pinned by the authenticated user.
-
-### What it does
-This block fetches a collection of Lists that have been pinned by the user, with options for additional data and filtering.
-
-### How it works
-It uses the Twitter API (Tweepy) to fetch pinned Lists data, handling authentication and returning List information with optional expansions.
-
-### Inputs
-| Input | Description |
-|-------|-------------|
-| credentials | Twitter API credentials with required scopes |
-| expansions | Additional data fields to include [more info](twitter/twitter.md#common-input). |
-| list_fields | List-specific fields to include [more info](twitter/twitter.md#common-input). |
-| user_fields | User-related fields to include [more info](twitter/twitter.md#common-input). |
-
-### Outputs
-| Output | Description |
-|--------|-------------|
-| list_ids | List of pinned List IDs |
-| list_names | List of pinned List names |
-| data | Complete List data |
-| included | Additional requested data |
-| meta | Response metadata |
-| error | Error message if request failed |
-
-### Possible use case
-Monitoring and managing pinned Lists for organization and quick access.
-
----
-
-## Twitter Unfollow List Block
-
-### What it is
-A block that unfollows a Twitter List that the authenticated user is currently following.
-
-### What it does
-This block unfollows a specified Twitter List using the List ID, removing it from the user's followed Lists.
-
-### How it works
-It uses the Twitter API (Tweepy) to unfollow a List with the given List ID, handling authentication and error cases.
-
-### Inputs
-| Input | Description |
-|-------|-------------|
-| credentials | Twitter API credentials with required scopes |
-| list_id | ID of the List to unfollow |
-
-### Outputs
-| Output | Description |
-|--------|-------------|
-| success | Whether unfollow was successful |
-| error | Error message if unfollow failed |
-
-### Possible use case
-Managing followed Lists by removing Lists that are no longer relevant.
-
----
-
-## Twitter Follow List Block
-
-### What it is
-A block that follows a Twitter List for the authenticated user.
-
-### What it does
-This block follows a specified Twitter List using the List ID, adding it to the user's followed Lists.
-
-### How it works
-It uses the Twitter API (Tweepy) to follow a List with the given List ID, handling authentication and error cases.
-
-### Inputs
-| Input | Description |
-|-------|-------------|
-| credentials | Twitter API credentials with required scopes |
-| list_id | ID of the List to follow |
-
-### Outputs
-| Output | Description |
-|--------|-------------|
-| success | Whether follow was successful |
-| error | Error message if follow failed |
-
-### Possible use case
-Following Lists that match user interests or contain relevant content.
-
----
-## Common Input
-
-The Twitter API lets you choose what information you want to get back when you make a request. Here are the different types of information you can ask for:
-
-### expansions
-Extra information about tweets, pictures, and users that are mentioned or connected
-
-| Field | Description |
-|-------|-------------|
-| Poll_IDs | Gets information about any polls in the tweet, like voting options and results |
-| Media_Keys | Gets details about pictures, videos, or GIFs attached to the tweet |
-| Author_User_ID | Gets information about who wrote the tweet, like their profile details |
-| Edit_History_Tweet_IDs | Shows if and when the tweet was edited and what changed |
-| Mentioned_Usernames | Gets profile information about any @mentioned users |
-| Place_ID | Gets details about locations tagged in the tweet |
-| Reply_To_User_ID | Gets information about the person this tweet is replying to |
-| Referenced_Tweet_ID | Gets details about any tweets this one is quoting or retweeting |
-| Referenced_Tweet_Author_ID | Gets profile information about who wrote the original tweets being referenced |
-
-### media_fields
-Information about pictures, videos, and other media
-
-| Field | Description |
-|-------|-------------|
-| Duration_in_Milliseconds | How long a video or audio clip plays for (in milliseconds) |
-| Height | How tall the picture or video is in pixels |
-| Media_Key | A unique code that identifies this specific piece of media |
-| Preview_Image_URL | Web link to a smaller preview version of the picture |
-| Media_Type | What kind of media it is (photo, video, GIF, etc.) |
-| Media_URL | Web link to view the full media |
-| Width | How wide the picture or video is in pixels |
-| Public_Metrics | Numbers anyone can see (views, plays, etc.) |
-| Non_Public_Metrics | Private numbers only the tweet author can see |
-| Organic_Metrics | Numbers about natural engagement (non-promoted) |
-| Promoted_Metrics | Numbers about paid promotion performance |
-| Alternative_Text | Description of the media for accessibility |
-| Media_Variants | Different sizes/qualities available (like HD vs SD video) |
-
-### place_fields
-Information about locations mentioned in tweets
-
-| Field | Description |
-|-------|-------------|
-| Contained_Within_Places | Larger areas this place is part of (like a city within a state) |
-| Country | The full country name |
-| Country_Code | Short two-letter code for the country (like US for United States) |
-| Full_Location_Name | Complete name including city, state, country etc. |
-| Geographic_Coordinates | Exact location on a map (latitude and longitude) |
-| Place_ID | A unique code that identifies this specific location |
-| Place_Name | The main name of the place (like "Times Square") |
-| Place_Type | What kind of place it is (city, business, landmark etc.) |
-
-### poll_fields
-Information about polls in tweets
-
-| Field | Description |
-|-------|-------------|
-| Duration_Minutes | How long the poll stays open for voting |
-| End_DateTime | The exact date and time when voting closes |
-| Poll_ID | A unique code that identifies this specific poll |
-| Poll_Options | The different choices people can vote for |
-| Voting_Status | Whether voting is still open or closed |
-
-### tweet_fields
-Information about the tweets themselves
-
-| Field | Description |
-|-------|-------------|
-| Tweet_Attachments | All media, links, or polls included in the tweet |
-| Author_ID | A unique code identifying who wrote the tweet |
-| Context_Annotations | Extra information about what the tweet is about |
-| Conversation_ID | Code linking all replies in a conversation |
-| Creation_Time | When the tweet was posted |
-| Edit_Controls | Whether the tweet can be edited and for how long |
-| Tweet_Entities | Special parts of the tweet like #hashtags, @mentions, and links |
-| Geographic_Location | Where the tweet was posted from |
-| Tweet_ID | A unique code for this specific tweet |
-| Reply_To_User_ID | Who this tweet is responding to |
-| Language | What language the tweet is written in |
-| Public_Metrics | Numbers like retweets, likes, and replies |
-| Sensitive_Content_Flag | Warning if tweet might contain sensitive content |
-| Referenced_Tweets | Other tweets this one is connected to |
-| Reply_Settings | Who is allowed to reply to the tweet |
-| Tweet_Source | What app or website was used to post |
-| Tweet_Text | The actual words in the tweet |
-| Withheld_Content | If the tweet is hidden in certain countries |
-
-### user_fields
-Information about Twitter users
-
-| Field | Description |
-|-------|-------------|
-| Account_Creation_Date | When they joined Twitter |
-| User_Bio | The "About me" text on their profile |
-| User_Entities | Links and @mentions in their profile |
-| User_ID | Their unique Twitter user code |
-| User_Location | Where they say they are located |
-| Latest_Tweet_ID | Code for their most recent tweet |
-| Display_Name | Their full profile name (not @username) |
-| Pinned_Tweet_ID | Code for the tweet stuck to top of their profile |
-| Profile_Picture_URL | Link to their profile picture |
-| Is_Protected_Account | Whether their tweets are private |
-| Account_Statistics | Number of followers, following, and tweets |
-| Profile_URL | Link to their profile webpage |
-| Username | Their @handle they use on Twitter |
-| Is_Verified | Whether they have a verification checkmark |
-| Verification_Type | What kind of verification they have |
-| Content_Withholding_Info | If their content is hidden in certain places |
-
-## Extra notes
-
-- Use combinations of expansions and fields to build precise queries. For instance:
- - To fetch a Tweet with media details, include `expansions=Media_Keys` and relevant `media_fields`.
- - For user data in Tweets, add `expansions=Author_User_ID` and appropriate `user_fields`.
-
-- Data returned under `includes` helps cross-reference expanded data objects with their parent entities using IDs.
diff --git a/docs/content/platform/getting-started.md b/docs/content/platform/getting-started.md
deleted file mode 100644
index 3613d014f..000000000
--- a/docs/content/platform/getting-started.md
+++ /dev/null
@@ -1,148 +0,0 @@
-# Getting Started with AutoGPT: Self-Hosting Guide
-
-This tutorial will walk you through the process of setting up AutoGPT locally on your machine.
-
-
-
-## Introduction
-
-This guide will help you setup the server and builder for the project.
-
-
-
-We also offer this in video format. You can check it out [here](https://github.com/Significant-Gravitas/AutoGPT?tab=readme-ov-file#how-to-setup-for-self-hosting).
-
-!!! warning
- **DO NOT FOLLOW ANY OUTSIDE TUTORIALS AS THEY WILL LIKELY BE OUT OF DATE**
-
-## Prerequisites
-
-To setup the server, you need to have the following installed:
-
-- [Node.js](https://nodejs.org/en/)
-- [Docker](https://docs.docker.com/get-docker/)
-- [Git](https://git-scm.com/downloads)
-
-#### Checking if you have Node.js & NPM installed
-
-We use Node.js to run our frontend application.
-
-If you need assistance installing Node.js:
-https://nodejs.org/en/download/
-
-NPM is included with Node.js, but if you need assistance installing NPM:
-https://docs.npmjs.com/downloading-and-installing-node-js-and-npm
-
-You can check if you have Node.js & NPM installed by running the following command:
-
-```bash
-node -v
-npm -v
-```
-
-Once you have Node.js installed, you can proceed to the next step.
-
-#### Checking if you have Docker & Docker Compose installed
-
-Docker containerizes applications, while Docker Compose orchestrates multi-container Docker applications.
-
-If you need assistance installing docker:
-https://docs.docker.com/desktop/
-
-Docker-compose is included in Docker Desktop, but if you need assistance installing docker compose:
-https://docs.docker.com/compose/install/
-
-You can check if you have Docker installed by running the following command:
-
-```bash
-docker -v
-docker compose -v
-```
-
-Once you have Docker and Docker Compose installed, you can proceed to the next step.
-
-### Cloning the Repository
-The first step is cloning the AutoGPT repository to your computer.
-To do this, open a terminal window in a folder on your computer and run:
-```
-git clone https://github.com/Significant-Gravitas/AutoGPT.git
-```
-If you get stuck, follow [this guide](https://docs.github.com/en/repositories/creating-and-managing-repositories/cloning-a-repository).
-
-Once that's complete you can close this terminal window.
-
-### Running the backend services
-
-To run the backend services, follow these steps:
-
-* Within the repository, clone the submodules and navigate to the `autogpt_platform` directory:
- ```bash
- git submodule update --init --recursive
- cd autogpt_platform
- ```
- This command will initialize and update the submodules in the repository. The `supabase` folder will be cloned to the root directory.
-
-* Copy the `.env.example` file available in the `supabase/docker` directory to `.env` in `autogpt_platform`:
- ```
- cp supabase/docker/.env.example .env
- ```
- This command will copy the `.env.example` file to `.env` in the `supabase/docker` directory. You can modify the `.env` file to add your own environment variables.
-
-* Run the backend services:
- ```
- docker compose up -d --build
- ```
- This command will start all the necessary backend services defined in the `docker-compose.combined.yml` file in detached mode.
-
-
-### Running the frontend application
-
-To run the frontend application, follow these steps:
-
-* Navigate to `frontend` folder within the `autogpt_platform` directory:
- ```
- cd frontend
- ```
-
-* Copy the `.env.example` file available in the `frontend` directory to `.env` in the same directory:
- ```
- cp .env.example .env
- ```
- You can modify the `.env` within this folder to add your own environment variables for the frontend application.
-
-* Run the following command:
- ```
- npm install
- npm run dev
- ```
- This command will install the necessary dependencies and start the frontend application in development mode.
-
-### Checking if the application is running
-
-You can check if the server is running by visiting [http://localhost:3000](http://localhost:3000) in your browser.
-
-**Notes:**
-
-By default the application for different services run on the following ports:
-
-Frontend UI Server: 3000
-Backend Websocket Server: 8001
-Execution API Rest Server: 8006
-
-#### Additional Notes
-
-You may want to change your encryption key in the `.env` file in the `autogpt_platform/backend` directory.
-
-To generate a new encryption key, run the following command in python:
-
-```python
-from cryptography.fernet import Fernet;Fernet.generate_key().decode()
-```
-
-Or run the following command in the `autogpt_platform/backend` directory:
-
-```bash
-poetry run cli gen-encrypt-key
-```
-
-Then, replace the existing key in the `autogpt_platform/backend/.env` file with the new one.
diff --git a/docs/content/platform/new_blocks.md b/docs/content/platform/new_blocks.md
deleted file mode 100644
index ce9174272..000000000
--- a/docs/content/platform/new_blocks.md
+++ /dev/null
@@ -1,687 +0,0 @@
-# Contributing to AutoGPT Agent Server: Creating and Testing Blocks
-
-This guide will walk you through the process of creating and testing a new block for the AutoGPT Agent Server, using the WikipediaSummaryBlock as an example.
-
-## Understanding Blocks and Testing
-
-Blocks are reusable components that can be connected to form a graph representing an agent's behavior. Each block has inputs, outputs, and a specific function. Proper testing is crucial to ensure blocks work correctly and consistently.
-
-## Creating and Testing a New Block
-
-Follow these steps to create and test a new block:
-
-1. **Create a new Python file** for your block in the `autogpt_platform/backend/backend/blocks` directory. Name it descriptively and use snake_case. For example: `get_wikipedia_summary.py`.
-
-2. **Import necessary modules and create a class that inherits from `Block`**. Make sure to include all necessary imports for your block.
-
- Every block should contain the following:
-
- ```python
- from backend.data.block import Block, BlockSchema, BlockOutput
- ```
-
- Example for the Wikipedia summary block:
-
- ```python
- from backend.data.block import Block, BlockSchema, BlockOutput
- from backend.utils.get_request import GetRequest
- import requests
-
- class WikipediaSummaryBlock(Block, GetRequest):
- # Block implementation will go here
- ```
-
-3. **Define the input and output schemas** using `BlockSchema`. These schemas specify the data structure that the block expects to receive (input) and produce (output).
-
- - The input schema defines the structure of the data the block will process. Each field in the schema represents a required piece of input data.
- - The output schema defines the structure of the data the block will return after processing. Each field in the schema represents a piece of output data.
-
- Example:
-
- ```python
- class Input(BlockSchema):
- topic: str # The topic to get the Wikipedia summary for
-
- class Output(BlockSchema):
- summary: str # The summary of the topic from Wikipedia
- error: str # Any error message if the request fails, error field needs to be named `error`.
- ```
-
-4. **Implement the `__init__` method, including test data and mocks:**
-
- !!! important
- Use UUID generator (e.g. https://www.uuidgenerator.net/) for every new block `id` and *do not* make up your own. Alternatively, you can run this python code to generate an uuid: `print(__import__('uuid').uuid4())`
-
- ```python
- def __init__(self):
- super().__init__(
- # Unique ID for the block, used across users for templates
- # If you are an AI leave it as is or change to "generate-proper-uuid"
- id="xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
- input_schema=WikipediaSummaryBlock.Input, # Assign input schema
- output_schema=WikipediaSummaryBlock.Output, # Assign output schema
-
- # Provide sample input, output and test mock for testing the block
-
- test_input={"topic": "Artificial Intelligence"},
- test_output=("summary", "summary content"),
- test_mock={"get_request": lambda url, json: {"extract": "summary content"}},
- )
- ```
-
- - `id`: A unique identifier for the block.
-
- - `input_schema` and `output_schema`: Define the structure of the input and output data.
-
- Let's break down the testing components:
-
- - `test_input`: This is a sample input that will be used to test the block. It should be a valid input according to your Input schema.
-
- - `test_output`: This is the expected output when running the block with the `test_input`. It should match your Output schema. For non-deterministic outputs or when you only want to assert the type, you can use Python types instead of specific values. In this example, `("summary", str)` asserts that the output key is "summary" and its value is a string.
-
- - `test_mock`: This is crucial for blocks that make network calls. It provides a mock function that replaces the actual network call during testing.
-
- In this case, we're mocking the `get_request` method to always return a dictionary with an 'extract' key, simulating a successful API response. This allows us to test the block's logic without making actual network requests, which could be slow, unreliable, or rate-limited.
-
-5. **Implement the `run` method with error handling.** This should contain the main logic of the block:
-
- ```python
- def run(self, input_data: Input, **kwargs) -> BlockOutput:
- try:
- topic = input_data.topic
- url = f"https://en.wikipedia.org/api/rest_v1/page/summary/{topic}"
-
- response = self.get_request(url, json=True)
- yield "summary", response['extract']
-
- except requests.exceptions.HTTPError as http_err:
- raise RuntimeError(f"HTTP error occurred: {http_err}")
- ```
-
- - **Try block**: Contains the main logic to fetch and process the Wikipedia summary.
- - **API request**: Send a GET request to the Wikipedia API.
- - **Error handling**: Handle various exceptions that might occur during the API request and data processing. We don't need to catch all exceptions, only the ones we expect and can handle. The uncaught exceptions will be automatically yielded as `error` in the output. Any block that raises an exception (or yields an `error` output) will be marked as failed. Prefer raising exceptions over yielding `error`, as it will stop the execution immediately.
- - **Yield**: Use `yield` to output the results. Prefer to output one result object at a time. If you are calling a function that returns a list, you can yield each item in the list separately. You can also yield the whole list as well, but do both rather than yielding the list. For example: If you were writing a block that outputs emails, you'd yield each email as a separate result object, but you could also yield the whole list as an additional single result object. Yielding output named `error` will break the execution right away and mark the block execution as failed.
- - **kwargs**: The `kwargs` parameter is used to pass additional arguments to the block. It is not used in the example above, but it is available to the block. You can also have args as inline signatures in the run method ala `def run(self, input_data: Input, *, user_id: str, **kwargs) -> BlockOutput:`.
- Available kwargs are:
- - `user_id`: The ID of the user running the block.
- - `graph_id`: The ID of the agent that is executing the block. This is the same for every version of the agent
- - `graph_exec_id`: The ID of the execution of the agent. This changes every time the agent has a new "run"
- - `node_exec_id`: The ID of the execution of the node. This changes every time the node is executed
- - `node_id`: The ID of the node that is being executed. It changes every version of the graph, but not every time the node is executed.
-
-### Field Types
-
-#### oneOf fields
-`oneOf` allows you to specify that a field must be exactly one of several possible options. This is useful when you want your block to accept different types of inputs that are mutually exclusive.
-
-Example:
-```python
-attachment: Union[Media, DeepLink, Poll, Place, Quote] = SchemaField(
- discriminator='discriminator',
- description="Attach either media, deep link, poll, place or quote - only one can be used"
-)
-```
-
-The `discriminator` parameter tells AutoGPT which field to look at in the input to determine which type it is.
-
-In each model, you need to define the discriminator value:
-```python
-class Media(BaseModel):
- discriminator: Literal['media']
- media_ids: List[str]
-
-class DeepLink(BaseModel):
- discriminator: Literal['deep_link']
- direct_message_deep_link: str
-```
-
-#### OptionalOneOf fields
-`OptionalOneOf` is similar to `oneOf` but allows the field to be optional (None). This means the field can be either one of the specified types or None.
-
-Example:
-```python
-attachment: Union[Media, DeepLink, Poll, Place, Quote] | None = SchemaField(
- discriminator='discriminator',
- description="Optional attachment - can be media, deep link, poll, place, quote or None"
-)
-```
-
-The key difference is the `| None` which makes the entire field optional.
-
-### Blocks with authentication
-
-Our system supports auth offloading for API keys and OAuth2 authorization flows.
-Adding a block with API key authentication is straight-forward, as is adding a block
-for a service that we already have OAuth2 support for.
-
-Implementing the block itself is relatively simple. On top of the instructions above,
-you're going to add a `credentials` parameter to the `Input` model and the `run` method:
-
-```python
-from backend.data.model import (
- APIKeyCredentials,
- OAuth2Credentials,
- Credentials,
-)
-
-from backend.data.block import Block, BlockOutput, BlockSchema
-from backend.data.model import CredentialsField
-from backend.integrations.providers import ProviderName
-
-
-# API Key auth:
-class BlockWithAPIKeyAuth(Block):
- class Input(BlockSchema):
- # Note that the type hint below is require or you will get a type error.
- # The first argument is the provider name, the second is the credential type.
- credentials: CredentialsMetaInput[
- Literal[ProviderName.GITHUB], Literal["api_key"]
- ] = CredentialsField(
- description="The GitHub integration can be used with "
- "any API key with sufficient permissions for the blocks it is used on.",
- )
-
- # ...
-
- def run(
- self,
- input_data: Input,
- *,
- credentials: APIKeyCredentials,
- **kwargs,
- ) -> BlockOutput:
- ...
-
-# OAuth:
-class BlockWithOAuth(Block):
- class Input(BlockSchema):
- # Note that the type hint below is require or you will get a type error.
- # The first argument is the provider name, the second is the credential type.
- credentials: CredentialsMetaInput[
- Literal[ProviderName.GITHUB], Literal["oauth2"]
- ] = CredentialsField(
- required_scopes={"repo"},
- description="The GitHub integration can be used with OAuth.",
- )
-
- # ...
-
- def run(
- self,
- input_data: Input,
- *,
- credentials: OAuth2Credentials,
- **kwargs,
- ) -> BlockOutput:
- ...
-
-# API Key auth + OAuth:
-class BlockWithAPIKeyAndOAuth(Block):
- class Input(BlockSchema):
- # Note that the type hint below is require or you will get a type error.
- # The first argument is the provider name, the second is the credential type.
- credentials: CredentialsMetaInput[
- Literal[ProviderName.GITHUB], Literal["api_key", "oauth2"]
- ] = CredentialsField(
- required_scopes={"repo"},
- description="The GitHub integration can be used with OAuth, "
- "or any API key with sufficient permissions for the blocks it is used on.",
- )
-
- # ...
-
- def run(
- self,
- input_data: Input,
- *,
- credentials: Credentials,
- **kwargs,
- ) -> BlockOutput:
- ...
-```
-
-The credentials will be automagically injected by the executor in the back end.
-
-The `APIKeyCredentials` and `OAuth2Credentials` models are defined [here](https://github.com/Significant-Gravitas/AutoGPT/blob/master/autogpt_platform/autogpt_libs/autogpt_libs/supabase_integration_credentials_store/types.py).
-To use them in e.g. an API request, you can either access the token directly:
-
-```python
-# credentials: APIKeyCredentials
-response = requests.post(
- url,
- headers={
- "Authorization": f"Bearer {credentials.api_key.get_secret_value()})",
- },
-)
-
-# credentials: OAuth2Credentials
-response = requests.post(
- url,
- headers={
- "Authorization": f"Bearer {credentials.access_token.get_secret_value()})",
- },
-)
-```
-
-or use the shortcut `credentials.auth_header()`:
-
-```python
-# credentials: APIKeyCredentials | OAuth2Credentials
-response = requests.post(
- url,
- headers={"Authorization": credentials.auth_header()},
-)
-```
-
-The `ProviderName` enum is the single source of truth for which providers exist in our system.
-Naturally, to add an authenticated block for a new provider, you'll have to add it here too.
-
-ProviderName definition
-
-```python title="backend/integrations/providers.py"
---8<-- "autogpt_platform/backend/backend/integrations/providers.py:ProviderName"
-```
-
-
-#### Multiple credentials inputs
-Multiple credentials inputs are supported, under the following conditions:
-- The name of each of the credentials input fields must end with `_credentials`.
-- The names of the credentials input fields must match the names of the corresponding
- parameters on the `run(..)` method of the block.
-- If more than one of the credentials parameters are required, `test_credentials`
- is a `dict[str, Credentials]`, with for each required credentials input the
- parameter name as the key and suitable test credentials as the value.
-
-
-#### Adding an OAuth2 service integration
-
-To add support for a new OAuth2-authenticated service, you'll need to add an `OAuthHandler`.
-All our existing handlers and the base class can be found [here][OAuth2 handlers].
-
-Every handler must implement the following parts of the [`BaseOAuthHandler`] interface:
-
-```python title="backend/integrations/oauth/base.py"
---8<-- "autogpt_platform/backend/backend/integrations/oauth/base.py:BaseOAuthHandler1"
---8<-- "autogpt_platform/backend/backend/integrations/oauth/base.py:BaseOAuthHandler2"
---8<-- "autogpt_platform/backend/backend/integrations/oauth/base.py:BaseOAuthHandler3"
---8<-- "autogpt_platform/backend/backend/integrations/oauth/base.py:BaseOAuthHandler4"
---8<-- "autogpt_platform/backend/backend/integrations/oauth/base.py:BaseOAuthHandler5"
---8<-- "autogpt_platform/backend/backend/integrations/oauth/base.py:BaseOAuthHandler6"
-```
-
-As you can see, this is modeled after the standard OAuth2 flow.
-
-Aside from implementing the `OAuthHandler` itself, adding a handler into the system requires two more things:
-
-- Adding the handler class to `HANDLERS_BY_NAME` under [`integrations/oauth/__init__.py`](https://github.com/Significant-Gravitas/AutoGPT/blob/master/autogpt_platform/backend/backend/integrations/oauth/__init__.py)
-
-```python title="backend/integrations/oauth/__init__.py"
---8<-- "autogpt_platform/backend/backend/integrations/oauth/__init__.py:HANDLERS_BY_NAMEExample"
-```
-
-- Adding `{provider}_client_id` and `{provider}_client_secret` to the application's `Secrets` under [`util/settings.py`](https://github.com/Significant-Gravitas/AutoGPT/blob/master/autogpt_platform/backend/backend/util/settings.py)
-
-```python title="backend/util/settings.py"
---8<-- "autogpt_platform/backend/backend/util/settings.py:OAuthServerCredentialsExample"
-```
-
-[OAuth2 handlers]: https://github.com/Significant-Gravitas/AutoGPT/tree/master/autogpt_platform/backend/backend/integrations/oauth
-[`BaseOAuthHandler`]: https://github.com/Significant-Gravitas/AutoGPT/blob/master/autogpt_platform/backend/backend/integrations/oauth/base.py
-
-#### Adding to the frontend
-
-You will need to add the provider (api or oauth) to the `CredentialsInput` component in [`frontend/src/components/integrations/credentials-input.tsx`](https://github.com/Significant-Gravitas/AutoGPT/blob/master/autogpt_platform/frontend/src/components/integrations/credentials-input.tsx).
-
-```ts title="frontend/src/components/integrations/credentials-input.tsx"
---8<-- "autogpt_platform/frontend/src/components/integrations/credentials-input.tsx:ProviderIconsEmbed"
-```
-
-You will also need to add the provider to the `CredentialsProvider` component in [`frontend/src/components/integrations/credentials-provider.tsx`](https://github.com/Significant-Gravitas/AutoGPT/blob/master/autogpt_platform/frontend/src/components/integrations/credentials-provider.tsx).
-
-```ts title="frontend/src/components/integrations/credentials-provider.tsx"
---8<-- "autogpt_platform/frontend/src/components/integrations/credentials-provider.tsx:CredentialsProviderNames"
-```
-
-Finally you will need to add the provider to the `CredentialsType` enum in [`frontend/src/lib/autogpt-server-api/types.ts`](https://github.com/Significant-Gravitas/AutoGPT/blob/master/autogpt_platform/frontend/src/lib/autogpt-server-api/types.ts).
-
-```ts title="frontend/src/lib/autogpt-server-api/types.ts"
---8<-- "autogpt_platform/frontend/src/lib/autogpt-server-api/types.ts:BlockIOCredentialsSubSchema"
-```
-
-#### Example: GitHub integration
-
-- GitHub blocks with API key + OAuth2 support: [`blocks/github`](https://github.com/Significant-Gravitas/AutoGPT/tree/master/autogpt_platform/backend/backend/blocks/github/)
-
-```python title="backend/blocks/github/issues.py"
---8<-- "autogpt_platform/backend/backend/blocks/github/issues.py:GithubCommentBlockExample"
-```
-
-- GitHub OAuth2 handler: [`integrations/oauth/github.py`](https://github.com/Significant-Gravitas/AutoGPT/blob/master/autogpt_platform/backend/backend/integrations/oauth/github.py)
-
-```python title="backend/integrations/oauth/github.py"
---8<-- "autogpt_platform/backend/backend/integrations/oauth/github.py:GithubOAuthHandlerExample"
-```
-
-#### Example: Google integration
-
-- Google OAuth2 handler: [`integrations/oauth/google.py`](https://github.com/Significant-Gravitas/AutoGPT/blob/master/autogpt_platform/backend/backend/integrations/oauth/google.py)
-
-```python title="backend/integrations/oauth/google.py"
---8<-- "autogpt_platform/backend/backend/integrations/oauth/google.py:GoogleOAuthHandlerExample"
-```
-
-You can see that google has defined a `DEFAULT_SCOPES` variable, this is used to set the scopes that are requested no matter what the user asks for.
-
-```python title="backend/blocks/google/_auth.py"
---8<-- "autogpt_platform/backend/backend/blocks/google/_auth.py:GoogleOAuthIsConfigured"
-```
-
-You can also see that `GOOGLE_OAUTH_IS_CONFIGURED` is used to disable the blocks that require OAuth if the oauth is not configured. This is in the `__init__` method of each block. This is because there is no api key fallback for google blocks so we need to make sure that the oauth is configured before we allow the user to use the blocks.
-
-### Webhook-triggered Blocks
-
-Webhook-triggered blocks allow your agent to respond to external events in real-time.
-These blocks are triggered by incoming webhooks from third-party services
-rather than being executed manually.
-
-Creating and running a webhook-triggered block involves three main components:
-
-- The block itself, which specifies:
- - Inputs for the user to select a resource and events to subscribe to
- - A `credentials` input with the scopes needed to manage webhooks
- - Logic to turn the webhook payload into outputs for the webhook block
-- The `WebhooksManager` for the corresponding webhook service provider, which handles:
- - (De)registering webhooks with the provider
- - Parsing and validating incoming webhook payloads
-- The credentials system for the corresponding service provider, which may include an `OAuthHandler`
-
-There is more going on under the hood, e.g. to store and retrieve webhooks and their
-links to nodes, but to add a webhook-triggered block you shouldn't need to make changes
-to those parts of the system.
-
-#### Creating a Webhook-triggered Block
-
-To create a webhook-triggered block, follow these additional steps on top of the basic block creation process:
-
-1. **Define `webhook_config`** in your block's `__init__` method.
-
-
- Example: GitHubPullRequestTriggerBlock
-
- ```python title="backend/blocks/github/triggers.py"
- --8<-- "autogpt_platform/backend/backend/blocks/github/triggers.py:example-webhook_config"
- ```
-
-
-
- BlockWebhookConfig definition
-
- ```python title="backend/data/block.py"
- --8<-- "autogpt_platform/backend/backend/data/block.py:BlockWebhookConfig"
- ```
-
-
-2. **Define event filter input** in your block's Input schema.
- This allows the user to select which specific types of events will trigger the block in their agent.
-
-
- Example: GitHubPullRequestTriggerBlock
-
- ```python title="backend/blocks/github/triggers.py"
- --8<-- "autogpt_platform/backend/backend/blocks/github/triggers.py:example-event-filter"
- ```
-
-
- - The name of the input field (`events` in this case) must match `webhook_config.event_filter_input`.
- - The event filter itself must be a Pydantic model with only boolean fields.
-
-4. **Include payload field** in your block's Input schema.
-
-
- Example: GitHubTriggerBase
-
- ```python title="backend/blocks/github/triggers.py"
- --8<-- "autogpt_platform/backend/backend/blocks/github/triggers.py:example-payload-field"
- ```
-
-
-5. **Define `credentials` input** in your block's Input schema.
- - Its scopes must be sufficient to manage a user's webhooks through the provider's API
- - See [Blocks with authentication](#blocks-with-authentication) for further details
-
-6. **Process webhook payload** and output relevant parts of it in your block's `run` method.
-
-
- Example: GitHubPullRequestTriggerBlock
-
- ```python
- def run(self, input_data: Input, **kwargs) -> BlockOutput:
- yield "payload", input_data.payload
- yield "sender", input_data.payload["sender"]
- yield "event", input_data.payload["action"]
- yield "number", input_data.payload["number"]
- yield "pull_request", input_data.payload["pull_request"]
- ```
-
- Note that the `credentials` parameter can be omitted if the credentials
- aren't used at block runtime, like in the example.
-
-
-#### Adding a Webhooks Manager
-
-To add support for a new webhook provider, you'll need to create a WebhooksManager that implements the `BaseWebhooksManager` interface:
-
-```python title="backend/integrations/webhooks/_base.py"
---8<-- "autogpt_platform/backend/backend/integrations/webhooks/_base.py:BaseWebhooksManager1"
-
---8<-- "autogpt_platform/backend/backend/integrations/webhooks/_base.py:BaseWebhooksManager2"
---8<-- "autogpt_platform/backend/backend/integrations/webhooks/_base.py:BaseWebhooksManager3"
---8<-- "autogpt_platform/backend/backend/integrations/webhooks/_base.py:BaseWebhooksManager4"
---8<-- "autogpt_platform/backend/backend/integrations/webhooks/_base.py:BaseWebhooksManager5"
-```
-
-And add a reference to your `WebhooksManager` class in `WEBHOOK_MANAGERS_BY_NAME`:
-
-```python title="backend/integrations/webhooks/__init__.py"
---8<-- "autogpt_platform/backend/backend/integrations/webhooks/__init__.py:WEBHOOK_MANAGERS_BY_NAME"
-```
-
-#### Example: GitHub Webhook Integration
-
-
-
-GitHub Webhook triggers: blocks/github/triggers.py
-
-
-```python title="backend/blocks/github/triggers.py"
---8<-- "autogpt_platform/backend/backend/blocks/github/triggers.py:GithubTriggerExample"
-```
-
-
-
-
-GitHub Webhooks Manager: integrations/webhooks/github.py
-
-
-```python title="backend/integrations/webhooks/github.py"
---8<-- "autogpt_platform/backend/backend/integrations/webhooks/github.py:GithubWebhooksManager"
-```
-
-
-## Key Points to Remember
-
-- **Unique ID**: Give your block a unique ID in the **init** method.
-- **Input and Output Schemas**: Define clear input and output schemas.
-- **Error Handling**: Implement error handling in the `run` method.
-- **Output Results**: Use `yield` to output results in the `run` method.
-- **Testing**: Provide test input and output in the **init** method for automatic testing.
-
-## Understanding the Testing Process
-
-The testing of blocks is handled by `test_block.py`, which does the following:
-
-1. It calls the block with the provided `test_input`.
- If the block has a `credentials` field, `test_credentials` is passed in as well.
-2. If a `test_mock` is provided, it temporarily replaces the specified methods with the mock functions.
-3. It then asserts that the output matches the `test_output`.
-
-For the WikipediaSummaryBlock:
-
-- The test will call the block with the topic "Artificial Intelligence".
-- Instead of making a real API call, it will use the mock function, which returns `{"extract": "summary content"}`.
-- It will then check if the output key is "summary" and its value is a string.
-
-This approach allows us to test the block's logic comprehensively without relying on external services, while also accommodating non-deterministic outputs.
-
-## Security Best Practices for SSRF Prevention
-
-When creating blocks that handle external URL inputs or make network requests, it's crucial to use the platform's built-in SSRF protection mechanisms. The `backend.util.request` module provides a secure `Requests` wrapper class that should be used for all HTTP requests.
-
-### Using the Secure Requests Wrapper
-
-```python
-from backend.util.request import requests
-
-class MyNetworkBlock(Block):
- def run(self, input_data: Input, **kwargs) -> BlockOutput:
- try:
- # The requests wrapper automatically validates URLs and blocks dangerous requests
- response = requests.get(input_data.url)
- yield "result", response.text
- except ValueError as e:
- # URL validation failed
- raise RuntimeError(f"Invalid URL provided: {e}")
- except requests.exceptions.RequestException as e:
- # Request failed
- raise RuntimeError(f"Request failed: {e}")
-```
-
-The `Requests` wrapper provides these security features:
-
-1. **URL Validation**:
- - Blocks requests to private IP ranges (RFC 1918)
- - Validates URL format and protocol
- - Resolves DNS and checks IP addresses
- - Supports whitelisting trusted origins
-
-2. **Secure Defaults**:
- - Disables redirects by default
- - Raises exceptions for non-200 status codes
- - Supports custom headers and validators
-
-3. **Protected IP Ranges**:
- The wrapper denies requests to these networks:
-
- ```python title="backend/util/request.py"
- --8<-- "autogpt_platform/backend/backend/util/request.py:BLOCKED_IP_NETWORKS"
- ```
-
-### Custom Request Configuration
-
-If you need to customize the request behavior:
-
-```python
-from backend.util.request import Requests
-
-# Create a custom requests instance with specific trusted origins
-custom_requests = Requests(
- trusted_origins=["api.trusted-service.com"],
- raise_for_status=True,
- extra_headers={"User-Agent": "MyBlock/1.0"}
-)
-```
-
-## Tips for Effective Block Testing
-
-1. **Provide realistic test_input**: Ensure your test input covers typical use cases.
-
-2. **Define appropriate test_output**:
-
- - For deterministic outputs, use specific expected values.
- - For non-deterministic outputs or when only the type matters, use Python types (e.g., `str`, `int`, `dict`).
- - You can mix specific values and types, e.g., `("key1", str), ("key2", 42)`.
-
-3. **Use test_mock for network calls**: This prevents tests from failing due to network issues or API changes.
-
-4. **Consider omitting test_mock for blocks without external dependencies**: If your block doesn't make network calls or use external resources, you might not need a mock.
-
-5. **Consider edge cases**: Include tests for potential error conditions in your `run` method.
-
-6. **Update tests when changing block behavior**: If you modify your block, ensure the tests are updated accordingly.
-
-By following these steps, you can create new blocks that extend the functionality of the AutoGPT Agent Server.
-
-## Blocks we want to see
-
-Below is a list of blocks that we would like to see implemented in the AutoGPT Agent Server. If you're interested in contributing, feel free to pick one of these blocks or chose your own.
-
-If you would like to implement one of these blocks, open a pull request and we will start the review process.
-
-### Consumer Services/Platforms
-
-- Google sheets - [~~Read/Append~~](https://github.com/Significant-Gravitas/AutoGPT/pull/8236)
-- Email - Read/Send with [~~Gmail~~](https://github.com/Significant-Gravitas/AutoGPT/pull/8236), Outlook, Yahoo, Proton, etc
-- Calendar - Read/Write with Google Calendar, Outlook Calendar, etc
-- Home Assistant - Call Service, Get Status
-- Dominos - Order Pizza, Track Order
-- Uber - Book Ride, Track Ride
-- Notion - Create/Read Page, Create/Append/Read DB
-- Google drive - read/write/overwrite file/folder
-
-### Social Media
-
-- Twitter - Post, Reply, Get Replies, Get Comments, Get Followers, Get Following, Get Tweets, Get Mentions
-- Instagram - Post, Reply, Get Comments, Get Followers, Get Following, Get Posts, Get Mentions, Get Trending Posts
-- TikTok - Post, Reply, Get Comments, Get Followers, Get Following, Get Videos, Get Mentions, Get Trending Videos
-- LinkedIn - Post, Reply, Get Comments, Get Followers, Get Following, Get Posts, Get Mentions, Get Trending Posts
-- YouTube - Transcribe Videos/Shorts, Post Videos/Shorts, Read/Reply/React to Comments, Update Thumbnails, Update Description, Update Tags, Update Titles, Get Views, Get Likes, Get Dislikes, Get Subscribers, Get Comments, Get Shares, Get Watch Time, Get Revenue, Get Trending Videos, Get Top Videos, Get Top Channels
-- Reddit - Post, Reply, Get Comments, Get Followers, Get Following, Get Posts, Get Mentions, Get Trending Posts
-- Treatwell (and related Platforms) - Book, Cancel, Review, Get Recommendations
-- Substack - Read/Subscribe/Unsubscribe, Post/Reply, Get Recommendations
-- Discord - Read/Post/Reply, Moderation actions
-- GoodReads - Read/Post/Reply, Get Recommendations
-
-### E-commerce
-
-- Airbnb - Book, Cancel, Review, Get Recommendations
-- Amazon - Order, Track Order, Return, Review, Get Recommendations
-- eBay - Order, Track Order, Return, Review, Get Recommendations
-- Upwork - Post Jobs, Hire Freelancer, Review Freelancer, Fire Freelancer
-
-### Business Tools
-
-- External Agents - Call other agents similar to AutoGPT
-- Trello - Create/Read/Update/Delete Cards, Lists, Boards
-- Jira - Create/Read/Update/Delete Issues, Projects, Boards
-- Linear - Create/Read/Update/Delete Issues, Projects, Boards
-- Excel - Read/Write/Update/Delete Rows, Columns, Sheets
-- Slack - Read/Post/Reply to Messages, Create Channels, Invite Users
-- ERPNext - Create/Read/Update/Delete Invoices, Orders, Customers, Products
-- Salesforce - Create/Read/Update/Delete Leads, Opportunities, Accounts
-- HubSpot - Create/Read/Update/Delete Contacts, Deals, Companies
-- Zendesk - Create/Read/Update/Delete Tickets, Users, Organizations
-- Odoo - Create/Read/Update/Delete Sales Orders, Invoices, Customers
-- Shopify - Create/Read/Update/Delete Products, Orders, Customers
-- WooCommerce - Create/Read/Update/Delete Products, Orders, Customers
-- Squarespace - Create/Read/Update/Delete Pages, Products, Orders
-
-## Agent Templates we want to see
-
-### Data/Information
-
-- Summarize top news of today, of this week, this month via Apple News or other large media outlets BBC, TechCrunch, hackernews, etc
-- Create, read, and summarize substack newsletters or any newsletters (blog writer vs blog reader)
-- Get/read/summarize the most viral Twitter, Instagram, TikTok (general social media accounts) of the day, week, month
-- Get/Read any LinkedIn posts or profile that mention AI Agents
-- Read/Summarize discord (might not be able to do this because you need access)
-- Read / Get most read books in a given month, year, etc from GoodReads or Amazon Books, etc
-- Get dates for specific shows across all streaming services
- - Suggest/Recommend/Get most watched shows in a given month, year, etc across all streaming platforms
-- Data analysis from xlsx data set
- - Gather via Excel or Google Sheets data > Sample the data randomly (sample block takes top X, bottom X, randomly, etc) > pass that to LLM Block to generate a script for analysis of the full data > Python block to run the script> making a loop back through LLM Fix Block on error > create chart/visualization (potentially in the code block?) > show the image as output (this may require frontend changes to show)
-- Tiktok video search and download
-
-### Marketing
-
-- Portfolio site design and enhancements
diff --git a/docs/content/platform/ollama.md b/docs/content/platform/ollama.md
deleted file mode 100644
index 9076b333d..000000000
--- a/docs/content/platform/ollama.md
+++ /dev/null
@@ -1,72 +0,0 @@
-# Running Ollama with AutoGPT
-
-> **Important**: Ollama integration is only available when self-hosting the AutoGPT platform. It cannot be used with the cloud-hosted version.
-
-Follow these steps to set up and run Ollama with the AutoGPT platform.
-
-## Prerequisites
-
-1. Make sure you have gone through and completed the [AutoGPT Setup](/platform/getting-started) steps, if not please do so before continuing with this guide.
-2. Before starting, ensure you have [Ollama installed](https://ollama.com/download) on your machine.
-
-## Setup Steps
-
-### 1. Launch Ollama
-Open a new terminal and execute:
-```bash
-ollama run llama3.2
-```
-
-> **Note**: This will download the [llama3.2](https://ollama.com/library/llama3.2) model and start the service. Keep this terminal running in the background.
-
-### 2. Start the Backend
-Open a new terminal and navigate to the autogpt_platform directory:
-```bash
-cd autogpt_platform
-docker compose up -d --build
-```
-
-### 3. Start the Frontend
-Open a new terminal and navigate to the frontend directory:
-```bash
-cd autogpt_platform/frontend
-npm run dev
-```
-
-Then visit [http://localhost:3000](http://localhost:3000) to see the frontend running, after registering an account/logging in, navigate to the build page at [http://localhost:3000/build](http://localhost:3000/build)
-
-### 4. Using Ollama with AutoGPT
-
-Now that both Ollama and the AutoGPT platform are running we can move onto using Ollama with AutoGPT:
-
-1. Add an AI Text Generator block to your workspace (it can work with any AI LLM block but for this example will be using the AI Text Generator block):
- ![Add AI Text Generator Block](../imgs/ollama/Select-AI-block.png)
-
-2. In the "LLM Model" dropdown, select "llama3.2" (This is the model we downloaded earlier)
- ![Select Ollama Model](../imgs/ollama/Ollama-Select-Llama32.png)
-
-3. Now we need to add some prompts then save and then run the graph:
-![Add Prompt](../imgs/ollama/Ollama-Add-Prompts.png)
-
-That's it! You've successfully setup the AutoGPT platform and made a LLM call to Ollama.
-![Ollama Output](../imgs/ollama/Ollama-Output.png)
-
-
-### Using Ollama on a Remote Server with AutoGPT
-For running Ollama on a remote server, simply make sure the Ollama server is running and is accessible from other devices on your network/remotely through the port 11434, then you can use the same steps above but you need to add the Ollama servers IP address to the "Ollama Host" field in the block settings like so:
-
-![Ollama Remote Host](../imgs/ollama/Ollama-Remote-Host.png)
-
-## Troubleshooting
-
-If you encounter any issues, verify that:
-
-- Ollama is properly installed and running
-- All terminals remain open during operation
-- Docker is running before starting the backend
-
-For common errors:
-
-1. **Connection Refused**: Make sure Ollama is running and the host address is correct (also make sure the port is correct, its default is 11434)
-2. **Model Not Found**: Try running `ollama pull llama3.2` manually first
-3. **Docker Issues**: Ensure Docker daemon is running with `docker ps`
\ No newline at end of file
diff --git a/docs/contribute/community/community-guidelines.mdx b/docs/contribute/community/community-guidelines.mdx
new file mode 100644
index 000000000..e69de29bb
diff --git a/docs/contribute/community/governance-model.mdx b/docs/contribute/community/governance-model.mdx
new file mode 100644
index 000000000..e69de29bb
diff --git a/docs/contribute/community/meeting-notes.mdx b/docs/contribute/community/meeting-notes.mdx
new file mode 100644
index 000000000..e69de29bb
diff --git a/docs/contribute/community/release-process.mdx b/docs/contribute/community/release-process.mdx
new file mode 100644
index 000000000..e69de29bb
diff --git a/docs/contribute/community/rfc-process.mdx b/docs/contribute/community/rfc-process.mdx
new file mode 100644
index 000000000..e69de29bb
diff --git a/docs/contribute/contributing-guidelines/code-review-guidelines.mdx b/docs/contribute/contributing-guidelines/code-review-guidelines.mdx
new file mode 100644
index 000000000..e69de29bb
diff --git a/docs/contribute/contributing-guidelines/code-style.mdx b/docs/contribute/contributing-guidelines/code-style.mdx
new file mode 100644
index 000000000..e69de29bb
diff --git a/docs/contribute/contributing-guidelines/documentation-style.mdx b/docs/contribute/contributing-guidelines/documentation-style.mdx
new file mode 100644
index 000000000..e69de29bb
diff --git a/docs/contribute/contributing-guidelines/git-workflow.mdx b/docs/contribute/contributing-guidelines/git-workflow.mdx
new file mode 100644
index 000000000..e69de29bb
diff --git a/docs/contribute/contributing-guidelines/pull-request-process.mdx b/docs/contribute/contributing-guidelines/pull-request-process.mdx
new file mode 100644
index 000000000..e69de29bb
diff --git a/docs/contribute/development-reference/architecture-overview.mdx b/docs/contribute/development-reference/architecture-overview.mdx
new file mode 100644
index 000000000..e69de29bb
diff --git a/docs/contribute/development-reference/ci-cd-pipeline.mdx b/docs/contribute/development-reference/ci-cd-pipeline.mdx
new file mode 100644
index 000000000..e69de29bb
diff --git a/docs/contribute/development-reference/component-design.mdx b/docs/contribute/development-reference/component-design.mdx
new file mode 100644
index 000000000..e69de29bb
diff --git a/docs/contribute/development-reference/local-development-tools.mdx b/docs/contribute/development-reference/local-development-tools.mdx
new file mode 100644
index 000000000..e69de29bb
diff --git a/docs/contribute/development-reference/testing-framework.mdx b/docs/contribute/development-reference/testing-framework.mdx
new file mode 100644
index 000000000..e69de29bb
diff --git a/docs/contribute/getting-started/code-organization.mdx b/docs/contribute/getting-started/code-organization.mdx
new file mode 100644
index 000000000..e69de29bb
diff --git a/docs/contribute/getting-started/development-setup.mdx b/docs/contribute/getting-started/development-setup.mdx
new file mode 100644
index 000000000..e69de29bb
diff --git a/docs/contribute/getting-started/development-workflow.mdx b/docs/contribute/getting-started/development-workflow.mdx
new file mode 100644
index 000000000..e69de29bb
diff --git a/docs/contribute/getting-started/testing-guide.mdx b/docs/contribute/getting-started/testing-guide.mdx
new file mode 100644
index 000000000..e69de29bb
diff --git a/docs/contribute/index.mdx b/docs/contribute/index.mdx
new file mode 100644
index 000000000..f076c117d
--- /dev/null
+++ b/docs/contribute/index.mdx
@@ -0,0 +1,50 @@
+---
+title: Contributing to the Docs
+description: We welcome contributions to our documentation! If you would like to contribute, please follow the steps below.
+---
+
+## Setting up the Docs
+
+1. Clone the repository:
+
+ ```bash
+ git clone github.com/Significant-Gravitas/AutoGPT.git
+ ```
+
+2. Install the dependencies:
+
+ ```bash
+ python -m pip install -r docs/requirements.txt
+ ```
+
+ or
+
+ ```bash
+ python3 -m pip install -r docs/requirements.txt
+ ```
+
+3. Start iterating using mkdocs' live server:
+
+ ```bash
+ mkdocs serve
+ ```
+
+4. Open your browser and navigate to `http://127.0.0.1:8000`.
+
+5. The server will automatically reload the docs when you save your changes.
+
+
+## Adding a new page
+
+1. Create a new markdown file in the `docs/content` directory.
+2. Add the new page to the `nav` section in the `mkdocs.yml` file.
+3. Add the content to the new markdown file.
+4. Run `mkdocs serve` to see your changes.
+
+## Checking links
+
+To check for broken links in the documentation, run `mkdocs build` and look for warnings in the console output.
+
+## Submitting a Pull Request
+
+When you're ready to submit your changes, please create a pull request. We will review your changes and merge them if they are appropriate.
diff --git a/docs/favicon.avif b/docs/favicon.avif
new file mode 100644
index 000000000..4c33aab6f
Binary files /dev/null and b/docs/favicon.avif differ
diff --git a/docs/favicon.png b/docs/favicon.png
new file mode 100644
index 000000000..f1bbde995
Binary files /dev/null and b/docs/favicon.png differ
diff --git a/docs/images/e2b-dashboard.png b/docs/images/e2b-dashboard.png
new file mode 100644
index 000000000..5fd2f82a4
Binary files /dev/null and b/docs/images/e2b-dashboard.png differ
diff --git a/docs/images/e2b-log-url.png b/docs/images/e2b-log-url.png
new file mode 100644
index 000000000..4ee43bcd7
Binary files /dev/null and b/docs/images/e2b-log-url.png differ
diff --git a/docs/images/e2b-new-tag.png b/docs/images/e2b-new-tag.png
new file mode 100644
index 000000000..45c81023d
Binary files /dev/null and b/docs/images/e2b-new-tag.png differ
diff --git a/docs/images/e2b-tag-button.png b/docs/images/e2b-tag-button.png
new file mode 100644
index 000000000..8ee1fe7d6
Binary files /dev/null and b/docs/images/e2b-tag-button.png differ
diff --git a/docs/integrations/ai-&-machine-learning/claude.mdx b/docs/integrations/ai-&-machine-learning/claude.mdx
new file mode 100644
index 000000000..e69de29bb
diff --git a/docs/integrations/ai-&-machine-learning/open-ai.mdx b/docs/integrations/ai-&-machine-learning/open-ai.mdx
new file mode 100644
index 000000000..e69de29bb
diff --git a/docs/integrations/business-&-ecommerce/salesforce.mdx b/docs/integrations/business-&-ecommerce/salesforce.mdx
new file mode 100644
index 000000000..e69de29bb
diff --git a/docs/integrations/business-&-ecommerce/shopify.mdx b/docs/integrations/business-&-ecommerce/shopify.mdx
new file mode 100644
index 000000000..e69de29bb
diff --git a/docs/integrations/business-&-ecommerce/stripe.mdx b/docs/integrations/business-&-ecommerce/stripe.mdx
new file mode 100644
index 000000000..e69de29bb
diff --git a/docs/integrations/communication-&-messaging/discord.mdx b/docs/integrations/communication-&-messaging/discord.mdx
new file mode 100644
index 000000000..e69de29bb
diff --git a/docs/integrations/communication-&-messaging/gmail.mdx b/docs/integrations/communication-&-messaging/gmail.mdx
new file mode 100644
index 000000000..e69de29bb
diff --git a/docs/integrations/communication-&-messaging/slack.mdx b/docs/integrations/communication-&-messaging/slack.mdx
new file mode 100644
index 000000000..e69de29bb
diff --git a/docs/integrations/communication-&-messaging/twilio.mdx b/docs/integrations/communication-&-messaging/twilio.mdx
new file mode 100644
index 000000000..e69de29bb
diff --git a/docs/integrations/data-&-analytics/grafana.mdx b/docs/integrations/data-&-analytics/grafana.mdx
new file mode 100644
index 000000000..e69de29bb
diff --git a/docs/integrations/data-&-analytics/snowflake.mdx b/docs/integrations/data-&-analytics/snowflake.mdx
new file mode 100644
index 000000000..e69de29bb
diff --git a/docs/integrations/data-&-analytics/tableau.mdx b/docs/integrations/data-&-analytics/tableau.mdx
new file mode 100644
index 000000000..e69de29bb
diff --git a/docs/integrations/productivity-&-work-management/asana.mdx b/docs/integrations/productivity-&-work-management/asana.mdx
new file mode 100644
index 000000000..e69de29bb
diff --git a/docs/integrations/productivity-&-work-management/github.mdx b/docs/integrations/productivity-&-work-management/github.mdx
new file mode 100644
index 000000000..e69de29bb
diff --git a/docs/integrations/productivity-&-work-management/notion.mdx b/docs/integrations/productivity-&-work-management/notion.mdx
new file mode 100644
index 000000000..e69de29bb
diff --git a/docs/integrations/security-&-identity/auth0.mdx b/docs/integrations/security-&-identity/auth0.mdx
new file mode 100644
index 000000000..e69de29bb
diff --git a/docs/integrations/security-&-identity/lastpass.mdx b/docs/integrations/security-&-identity/lastpass.mdx
new file mode 100644
index 000000000..e69de29bb
diff --git a/docs/integrations/security-&-identity/okta.mdx b/docs/integrations/security-&-identity/okta.mdx
new file mode 100644
index 000000000..e69de29bb
diff --git a/docs/logo/dark-2.svg b/docs/logo/dark-2.svg
new file mode 100644
index 000000000..5ef4ac41a
--- /dev/null
+++ b/docs/logo/dark-2.svg
@@ -0,0 +1,46 @@
+
diff --git a/docs/logo/dark.svg b/docs/logo/dark.svg
new file mode 100644
index 000000000..4f0ba9dde
--- /dev/null
+++ b/docs/logo/dark.svg
@@ -0,0 +1,10 @@
+
diff --git a/docs/logo/light.png b/docs/logo/light.png
new file mode 100644
index 000000000..b0f786220
Binary files /dev/null and b/docs/logo/light.png differ
diff --git a/docs/logo/light.svg b/docs/logo/light.svg
new file mode 100644
index 000000000..9875d23c2
--- /dev/null
+++ b/docs/logo/light.svg
@@ -0,0 +1,10 @@
+
diff --git a/docs/mint.json b/docs/mint.json
new file mode 100644
index 000000000..6f94989e0
--- /dev/null
+++ b/docs/mint.json
@@ -0,0 +1,401 @@
+{
+ "$schema": "https://mintlify.com/schema.json",
+ "name": "Agpt",
+ "logo": {
+ "dark": "/logo/dark.svg",
+ "light": "/logo/light.svg",
+ "href": "https://agpt.co/"
+ },
+ "favicon": "/favicon.png",
+ "colors": {
+ "primary": "#4051b5",
+ "light": "#5387e6",
+ "dark": "#4051b5",
+ "anchors": {
+ "from": "#5387e6",
+ "to": "#d86bc4"
+ }
+ },
+ "font":{
+ "headings": {
+ "family": "FFF Acid Grotesk Regular",
+ "url": "https://acidgrotesk.folchstudio.com/",
+ "format": "woff",
+ "weight": 400
+ }
+ },
+ "background": { "style": "grid" },
+ "topbarLinks": [
+ {
+ "name": "Join the Waitlist",
+ "url": "https://agpt.co/waitlist"
+ }
+ ],
+ "topbarCtaButton": {
+ "type": "github",
+ "url": "https://github.com/Significant-Gravitas/AutoGPT"
+ },
+ "tabs": [
+ {
+ "name": "Home",
+ "url": "home"
+ },
+ {
+ "name": "AutoGPT Platform",
+ "url": "platform"
+ },
+ {
+ "name": "Integrations",
+ "url": "integrations"
+ },
+ {
+ "name": "Contribute",
+ "url": "contribute"
+ },
+ {
+ "name": "License",
+ "url": "https://github.com/Significant-Gravitas/AutoGPT/blob/master/LICENSE"
+ },
+ {
+ "name": "AutoGPT Classic",
+ "url": "classic"
+ }
+ ],
+ "anchors": [
+ {
+ "name": "Community",
+ "icon": "discord",
+ "url": "https://discord.gg/autogpt"
+ },
+ {
+ "name": "Blog",
+ "icon": "newspaper",
+ "url": "https://agpt.co/blog"
+ },
+ {
+ "name": "Contact Us",
+ "icon": "envelope-open-text",
+ "url": "mailto:contact@agpt.co"
+ }
+ ],
+ "navigation": [
+
+ {
+ "group": "Tutorials",
+ "pages": [
+ {
+ "group": "Getting Started",
+ "pages": [
+ "platform/home",
+ "platform/getting-started",
+ "platform/edit-agent",
+ "platform/delete-agent",
+ "platform/download-agent-from-marketplace-local",
+ "platform/create-basic-agent",
+ "platform/submit-agent-to-marketplace",
+ "platform/advanced_setup",
+ "platform/agent-blocks",
+ "platform/new_blocks",
+ "platform/ollama",
+ "platform/d_id",
+ "platform/blocks/blocks",
+ "platform/contributing/tests",
+ "platform/tutorials/getting-started/quick-start-guide",
+ "platform/tutorials/getting-started/self-hosted-installation",
+ "platform/tutorials/getting-started/first-autogpt-agent",
+ "platform/tutorials/getting-started/basic-configuration"
+ ]
+ },
+ {
+ "group": "Cloud Platform Tutorials",
+ "pages": [
+ "platform/tutorials/cloud-platform-tutorials/setting-up-your-workspace",
+ "platform/tutorials/cloud-platform-tutorials/creating-your-first-project",
+ "platform/tutorials/cloud-platform-tutorials/managing-api-keys"
+ ]
+ },
+ {
+ "group": "Self-Hosted Tutorials",
+ "pages": [
+ "platform/tutorials/self-hosted-tutorials/infrastructure-setup",
+ "platform/tutorials/self-hosted-tutorials/database-configuration",
+ "platform/tutorials/self-hosted-tutorials/security-best-practices"
+ ]
+ }
+ ]
+ },
+ {
+ "group": "How-To Guides",
+ "pages": [
+ {
+ "group": "Cloud Platform",
+ "pages": [
+ "platform/how-to-guides/cloud-platform/managing-agents",
+ "platform/how-to-guides/cloud-platform/scaling-resources",
+ "platform/how-to-guides/cloud-platform/monitoring-&-logging",
+ "platform/how-to-guides/cloud-platform/user-management",
+ "platform/how-to-guides/cloud-platform/billing-&-usage"
+ ]
+ },
+ {
+ "group": "Self-Hosted",
+ "pages": [
+ "platform/how-to-guides/self-hosted/deploymnent-strategies",
+ "platform/how-to-guides/self-hosted/backup-&-recovery",
+ "platform/how-to-guides/self-hosted/performance-tuning",
+ "platform/how-to-guides/self-hosted/custom-integrations",
+ "platform/how-to-guides/self-hosted/migration-guide"
+ ]
+ },
+ {
+ "group": "Common Tasks",
+ "pages": [
+ "platform/how-to-guides/common-tasks/working-with-tasks",
+ "platform/how-to-guides/common-tasks/memory-management",
+ "platform/how-to-guides/common-tasks/blocks-development",
+ "platform/how-to-guides/common-tasks/api-integration",
+ "platform/how-to-guides/common-tasks/custom-prompts"
+ ]
+ }
+ ]
+ },
+ {
+ "group": "Reference",
+ "pages": [
+ {
+ "group": "API Documentation",
+ "pages": [
+ "platform/reference/api-documentation/rest-api-endpoints",
+ "platform/reference/api-documentation/graphql-schema",
+ "platform/reference/api-documentation/web-socket-interface"
+ ]
+ },
+ {
+ "group": "Configuration",
+ "pages": [
+ "platform/reference/configuration/environment-variables",
+ "platform/reference/configuration/config-file-options",
+ "platform/reference/configuration/authentication"
+ ]
+ },
+ {
+ "group": "Architecture",
+ "pages": [
+ "platform/reference/architecture/system-components",
+ "platform/reference/architecture/data-models",
+ "platform/reference/architecture/event-system"
+ ]
+ },
+ {
+ "group": "SDK Reference",
+ "pages": [
+ "platform/reference/sdk-reference/puthon-sdk",
+ "platform/reference/sdk-reference/javascript-sdk"
+ ]
+ }
+ ]
+ },
+ {
+ "group": "Explanation",
+ "pages": [
+ {
+ "group": "Concepts",
+ "pages": [
+ "platform/explanation/concepts/agent-architecture",
+ "platform/explanation/concepts/memory-systems",
+ "platform/explanation/concepts/task-planning",
+ "platform/explanation/concepts/continuous-mode"
+ ]
+ },
+ {
+ "group": "Design Decisions",
+ "pages": [
+ "platform/explanation/design-decisions/architecture-choices",
+ "platform/explanation/design-decisions/security-model",
+ "platform/explanation/design-decisions/scaling-startegy"
+ ]
+ },
+ {
+ "group": "Best Practices",
+ "pages": [
+ "platform/explanation/best-practices/agent-design",
+ "platform/explanation/best-practices/prompt-engineering",
+ "platform/explanation/best-practices/resource-management",
+ "platform/explanation/best-practices/security-guidelines"
+ ]
+ }
+ ]
+ },
+ {
+ "group": "Communication & Messaging:",
+ "pages": [
+ "integrations/communication-&-messaging/slack",
+ "integrations/communication-&-messaging/discord",
+ "integrations/communication-&-messaging/gmail",
+ "integrations/communication-&-messaging/twilio"
+ ]
+ },
+ {
+ "group": "Productivity & Work Management",
+ "pages": [
+ "integrations/productivity-&-work-management/notion",
+ "integrations/productivity-&-work-management/asana",
+ "integrations/productivity-&-work-management/github"
+ ]
+ },
+ {
+ "group": "Data & Analytics",
+ "pages": [
+ "integrations/data-&-analytics/snowflake",
+ "integrations/data-&-analytics/grafana",
+ "integrations/data-&-analytics/tableau"
+ ]
+ },
+ {
+ "group": "AI & Machine Learning",
+ "pages": [
+ "integrations/ai-&-machine-learning/open-ai",
+ "integrations/ai-&-machine-learning/claude"
+ ]
+ },
+ {
+ "group": "Business & eCommerce",
+ "pages": [
+ "integrations/business-&-ecommerce/salesforce",
+ "integrations/business-&-ecommerce/stripe",
+ "integrations/business-&-ecommerce/shopify"
+ ]
+ },
+ {
+ "group": "Security & Identity",
+ "pages": [
+ "integrations/security-&-identity/okta",
+ "integrations/security-&-identity/auth0",
+ "integrations/security-&-identity/lastpass"
+ ]
+ },
+ {
+ "group": "Getting Started",
+ "pages": [
+ "contribute/index",
+ "contribute/getting-started/development-setup",
+ "contribute/getting-started/code-organization",
+ "contribute/getting-started/development-workflow",
+ "contribute/getting-started/testing-guide"
+ ]
+ },
+ {
+ "group": "Contributing Guidelines",
+ "pages": [
+ "contribute/contributing-guidelines/code-style",
+ "contribute/contributing-guidelines/documentation-style",
+ "contribute/contributing-guidelines/git-workflow",
+ "contribute/contributing-guidelines/pull-request-process",
+ "contribute/contributing-guidelines/code-review-guidelines"
+ ]
+ },
+ {
+ "group": "Development Reference",
+ "pages": [
+ "contribute/development-reference/architecture-overview",
+ "contribute/development-reference/component-design",
+ "contribute/development-reference/testing-framework",
+ "contribute/development-reference/ci-cd-pipeline",
+ "contribute/development-reference/local-development-tools"
+ ]
+ },
+ {
+ "group": "Community",
+ "pages": [
+ "contribute/community/governance-model",
+ "contribute/community/rfc-process",
+ "contribute/community/community-guidelines",
+ "contribute/community/meeting-notes",
+ "contribute/community/release-process"
+ ]
+ },
+ {
+ "group": "AutoGPT Classic",
+ "pages": [
+ "classic/index",
+ {
+ "group": "Setup",
+ "pages": [
+ "classic/setup/index",
+ "classic/setup/docker",
+ "classic/setup/for-developers",
+ {
+ "group": "Configuration",
+ "pages": [
+ "classic/configuration/options",
+ "classic/configuration/search",
+ "classic/configuration/voice"
+ ]
+ },
+ "classic/usage"
+ ]
+ },
+ {
+ "group": "Help us improve AutoGPT",
+ "pages": [
+ "classic/share-your-logs",
+ "classic/contributing",
+ "classic/testing",
+ "classic/code-of-conduct/index"
+ ]
+ },
+ {
+ "group": "Benchmark",
+ "pages": [
+ "classic/readme"
+ ]
+ },
+ {
+ "group": "Forge",
+ "pages": [
+ "classic/forge/getting-started/index",
+ {
+ "group": "Components",
+ "pages": [
+ "classic/forge/components/introduction",
+ "classic/forge/components/agents",
+ "classic/forge/components/components",
+ "classic/forge/components/protocols",
+ "classic/forge/components/commands",
+ "classic/forge/components/built-in-components",
+ "classic/forge/components/creating-components"
+ ]
+ }
+ ]
+ },
+ {
+ "group": "Frontend",
+ "pages": ["classic/readme-2"]
+ }
+ ]
+ },
+ {
+ "group": "Documentation",
+ "pages": [
+ "classic/documentation/installation",
+ "classic/documentation/basic-usage",
+ "classic/documentation/configuration",
+ "classic/documentation/known-issues",
+ "classic/documentation/migration-guide-to-platform"
+ ]
+ },
+ {
+ "group": "Archive",
+ "pages": [
+ "classic/archive/previous-releases",
+ "classic/archive/historical-features",
+ "classic/archive/deprecated-apis"
+ ]
+ }
+ ],
+ "footerSocials": {
+ "x": "https://x.com/Auto_GPT",
+ "github": "https://github.com/Significant-Gravitas/AutoGPT",
+ "discord": "https://discord.gg/autogpt"
+ }
+}
diff --git a/docs/mkdocs.yml b/docs/mkdocs.yml
deleted file mode 100644
index 0f4658322..000000000
--- a/docs/mkdocs.yml
+++ /dev/null
@@ -1,186 +0,0 @@
-site_name: AutoGPT Documentation
-site_url: https://docs.agpt.co/
-repo_url: https://github.com/Significant-Gravitas/AutoGPT
-repo_name: AutoGPT
-edit_uri: edit/master/docs/content
-docs_dir: content
-nav:
- - Home: index.md
-
- - The AutoGPT Platform 🆕:
- - Getting Started:
- - Setup AutoGPT (Local-Host): platform/getting-started.md
- - Edit an Agent: platform/edit-agent.md
- - Delete an Agent: platform/delete-agent.md
- - Download & Import and Agent: platform/download-agent-from-marketplace-local.md
- - Create a Basic Agent: platform/create-basic-agent.md
- - Submit an Agent to the Marketplace: platform/submit-agent-to-marketplace.md
- - Advanced Setup: platform/advanced_setup.md
- - Agent Blocks: platform/agent-blocks.md
- - Build your own Blocks: platform/new_blocks.md
- - Using Ollama: platform/ollama.md
- - Using D-ID: platform/d_id.md
- - Blocks: platform/blocks/blocks.md
- - Contributing:
- - Tests: platform/contributing/tests.md
- - AutoGPT Classic:
- - Introduction: classic/index.md
- - Setup:
- - Setting up AutoGPT: classic/setup/index.md
- - Set up with Docker: classic/setup/docker.md
- - For Developers: classic/setup/for-developers.md
- - Configuration:
- - Options: classic/configuration/options.md
- - Search: classic/configuration/search.md
- - Voice: classic/configuration/voice.md
- - Usage: classic/usage.md
- - Help us improve AutoGPT:
- - Share your debug logs with us: classic/share-your-logs.md
- - Contribution guide: contributing.md
- - Running tests: classic/testing.md
- - Code of Conduct: code-of-conduct.md
- - Benchmark:
- - Readme: https://github.com/Significant-Gravitas/AutoGPT/blob/master/classic/benchmark/README.md
- - Forge:
- - Introduction: forge/get-started.md
- - Components:
- - Introduction: forge/components/introduction.md
- - Agents: forge/components/agents.md
- - Components: forge/components/components.md
- - Protocols: forge/components/protocols.md
- - Commands: forge/components/commands.md
- - Built in Components: forge/components/built-in-components.md
- - Creating Components: forge/components/creating-components.md
- - Frontend:
- - Readme: https://github.com/Significant-Gravitas/AutoGPT/blob/master/classic/frontend/README.md
-
- - Contribute: contribute/index.md
-
- # - Challenges:
- # - Introduction: challenges/introduction.md
- # - List of Challenges:
- # - Memory:
- # - Introduction: challenges/memory/introduction.md
- # - Memory Challenge A: challenges/memory/challenge_a.md
- # - Memory Challenge B: challenges/memory/challenge_b.md
- # - Memory Challenge C: challenges/memory/challenge_c.md
- # - Memory Challenge D: challenges/memory/challenge_d.md
- # - Information retrieval:
- # - Introduction: challenges/information_retrieval/introduction.md
- # - Information Retrieval Challenge A: challenges/information_retrieval/challenge_a.md
- # - Information Retrieval Challenge B: challenges/information_retrieval/challenge_b.md
- # - Submit a Challenge: challenges/submit.md
- # - Beat a Challenge: challenges/beat.md
-
- - License: https://github.com/Significant-Gravitas/AutoGPT/blob/master/LICENSE
-
-theme:
- name: material
- custom_dir: overrides
- language: en
- icon:
- repo: fontawesome/brands/github
- logo: material/book-open-variant
- edit: material/pencil
- view: material/eye
- favicon: assets/favicon.png
- features:
- - navigation.sections
- - navigation.footer
- - navigation.top
- - navigation.tracking
- - navigation.tabs
- # - navigation.path
- - toc.follow
- - toc.integrate
- - content.action.edit
- - content.action.view
- - content.code.copy
- - content.code.annotate
- - content.tabs.link
- palette:
- # Palette toggle for light mode
- - media: "(prefers-color-scheme: light)"
- scheme: default
- toggle:
- icon: material/weather-night
- name: Switch to dark mode
-
- # Palette toggle for dark mode
- - media: "(prefers-color-scheme: dark)"
- scheme: slate
- toggle:
- icon: material/weather-sunny
- name: Switch to light mode
-
-markdown_extensions:
- # Python Markdown
- - abbr
- - admonition
- - attr_list
- - def_list
- - footnotes
- - md_in_html
- - toc:
- permalink: true
- - tables
-
- # Python Markdown Extensions
- - pymdownx.arithmatex:
- generic: true
- - pymdownx.betterem:
- smart_enable: all
- - pymdownx.critic
- - pymdownx.caret
- - pymdownx.details
- - pymdownx.emoji:
- emoji_index: !!python/name:material.extensions.emoji.twemoji
- emoji_generator: !!python/name:material.extensions.emoji.to_svg
- - pymdownx.highlight
- - pymdownx.inlinehilite
- - pymdownx.keys
- - pymdownx.mark
- - pymdownx.smartsymbols
- - pymdownx.snippets:
- base_path: ['.','../']
- check_paths: true
- dedent_subsections: true
- - pymdownx.superfences:
- custom_fences:
- - name: mermaid
- class: mermaid
- format: !!python/name:pymdownx.superfences.fence_code_format
- - pymdownx.tabbed:
- alternate_style: true
- - pymdownx.tasklist:
- custom_checkbox: true
- - pymdownx.tilde
-
-plugins:
- - table-reader
- - search
- - git-revision-date-localized:
- enable_creation_date: true
-
-extra:
- social:
- - icon: fontawesome/brands/github
- link: https://github.com/Significant-Gravitas/AutoGPT
- - icon: fontawesome/brands/x-twitter
- link: https://x.com/Auto_GPT
- - icon: fontawesome/brands/instagram
- link: https://www.instagram.com/autogpt/
- - icon: fontawesome/brands/discord
- link: https://discord.gg/autogpt
-
-extra:
- analytics:
- provider: google
- property: G-XKPNKB9XG6
-
-extra_javascript:
- - https://unpkg.com/tablesort@5.3.0/dist/tablesort.min.js
- - _javascript/tablesort.js
- - _javascript/mathjax.js
- - https://cdnjs.cloudflare.com/polyfill/v3/polyfill.min.js?features=es6
- - https://cdn.jsdelivr.net/npm/mathjax@3/es5/tex-mml-chtml.js
diff --git a/docs/netlify.toml b/docs/netlify.toml
deleted file mode 100644
index c07b733a5..000000000
--- a/docs/netlify.toml
+++ /dev/null
@@ -1,5 +0,0 @@
-# Netlify config for AutoGPT docs
-
-[build]
- publish = "public/"
- command = "mkdocs build -d public"
diff --git a/docs/overrides/assets/favicon.png b/docs/overrides/assets/favicon.png
deleted file mode 100644
index 69bded6ab..000000000
Binary files a/docs/overrides/assets/favicon.png and /dev/null differ
diff --git a/docs/overrides/main.html b/docs/overrides/main.html
deleted file mode 100644
index b376724b8..000000000
--- a/docs/overrides/main.html
+++ /dev/null
@@ -1,61 +0,0 @@
-{% extends "base.html" %}
-
-
-{% block extrahead %}
-
-
-
-
-
-{% raw %}
-
-{% endraw %}
-{% endblock %}
\ No newline at end of file
diff --git a/docs/content/platform/advanced_setup.md b/docs/platform/advanced_setup.mdx
similarity index 90%
rename from docs/content/platform/advanced_setup.md
rename to docs/platform/advanced_setup.mdx
index cfe8f9ae9..f1ca5496d 100644
--- a/docs/content/platform/advanced_setup.md
+++ b/docs/platform/advanced_setup.mdx
@@ -1,6 +1,9 @@
-# Advanced Setup
+---
+title: Advanced Setup
+description: The advanced steps below are intended for people with sysadmin experience.
+---
-The advanced steps below are intended for people with sysadmin experience. If you are not comfortable with these steps, please refer to the [basic setup guide](../platform/getting-started.md).
+If you are not comfortable with these steps, please refer to the [basic setup guide](../platform/getting-started.md).
## Introduction
diff --git a/docs/content/platform/agent-blocks.md b/docs/platform/agent-blocks.mdx
similarity index 82%
rename from docs/content/platform/agent-blocks.md
rename to docs/platform/agent-blocks.mdx
index 0ae2d0090..c0746ee37 100644
--- a/docs/content/platform/agent-blocks.md
+++ b/docs/platform/agent-blocks.mdx
@@ -1,10 +1,12 @@
-# **How to Create an AI Agent as a Block in AutoGPT**
+---
+title: How to Create an AI Agent as a Block in AutoGPT
+description: This guide explains how to create a reusable agent block that can be used as a component in other agents.
+sidebarTitle: Agent Blocks
+---
## **Overview**
-This guide explains how to create a reusable agent block that can be used as a component in other agents.
-
-
+
## **What Are Agent Blocks?**
@@ -81,6 +83,9 @@ For example, a content creation workflow might combine several agent blocks:
* You can make more complex agents by combining multiple agent blocks
* Chain different agents together for more sophisticated workflows
+
## **Note**
-This is a basic example that can be expanded upon to create more complex agent blocks with additional functionality.
\ No newline at end of file
+This is a basic example that can be expanded upon to create more complex agent blocks with additional functionality.
+
+
diff --git a/docs/content/platform/blocks/ai_shortform_video_block.md b/docs/platform/blocks/ai_shortform_video_block.mdx
similarity index 94%
rename from docs/content/platform/blocks/ai_shortform_video_block.md
rename to docs/platform/blocks/ai_shortform_video_block.mdx
index f18bcb5e6..dbe6b162d 100644
--- a/docs/content/platform/blocks/ai_shortform_video_block.md
+++ b/docs/platform/blocks/ai_shortform_video_block.mdx
@@ -1,4 +1,6 @@
-# AI Shortform Video Creator
+---
+title: AI Shortform Video Creator
+---
## What it is
The AI Shortform Video Creator is a tool that generates short-form videos using artificial intelligence and various customization options.
@@ -29,4 +31,4 @@ The block takes user input for script, visual style, audio, and other parameters
| Error | A message explaining any issues that occurred during video creation (if applicable) |
## Possible use case
-A social media marketer could use this block to quickly create engaging short-form videos for platforms like TikTok or Instagram Reels. They could input a script about a new product, choose a suitable visual style and background music, and get a professional-looking video without needing advanced video editing skills.
\ No newline at end of file
+A social media marketer could use this block to quickly create engaging short-form videos for platforms like TikTok or Instagram Reels. They could input a script about a new product, choose a suitable visual style and background music, and get a professional-looking video without needing advanced video editing skills.
diff --git a/docs/content/platform/blocks/basic.md b/docs/platform/blocks/basic.mdx
similarity index 99%
rename from docs/content/platform/blocks/basic.md
rename to docs/platform/blocks/basic.mdx
index a2df3badc..e40497396 100644
--- a/docs/content/platform/blocks/basic.md
+++ b/docs/platform/blocks/basic.mdx
@@ -1,4 +1,6 @@
-# Basic Operations Blocks
+---
+title: Basic Operations Blocks
+---
## Store Value
@@ -220,4 +222,4 @@ It simply accepts a text input and passes it through as an output to be displaye
| Output | The text to display in the sticky note |
### Possible use case
-Adding explanatory notes or reminders within a complex workflow to help users understand different stages or provide additional context.
\ No newline at end of file
+Adding explanatory notes or reminders within a complex workflow to help users understand different stages or provide additional context.
diff --git a/docs/platform/blocks/blocks.mdx b/docs/platform/blocks/blocks.mdx
new file mode 100644
index 000000000..672ffd6ff
--- /dev/null
+++ b/docs/platform/blocks/blocks.mdx
@@ -0,0 +1,136 @@
+---
+title: AutoGPT Blocks Overview
+description: 'AutoGPT uses a modular approach with various "blocks" to handle different tasks.'
+sidebarTitle: Blocks
+---
+
+These blocks are the building blocks of AutoGPT workflows, allowing users to create complex automations by combining simple, specialized components.
+
+Below is a comprehensive list of all available blocks, categorized by their primary function. Click on any block name to view its detailed documentation.
+
+## Basic Operations
+| Block Name | Description |
+|------------|-------------|
+| [Store Value](/platform/blocks/basic#store-value) | Stores and forwards a value |
+| [Print to Console](/platform/blocks/basic#print-to-console) | Outputs text to the console for debugging |
+| [Find in Dictionary](/platform/blocks/basic#find-in-dictionary) | Looks up a value in a dictionary or list |
+| [Agent Input](/platform/blocks/basic#agent-input) | Accepts user input in a workflow |
+| [Agent Output](/platform/blocks/basic#agent-output) | Records and formats workflow results |
+| [Add to Dictionary](/platform/blocks/basic#add-to-dictionary) | Adds a new key-value pair to a dictionary |
+| [Add to List](/platform/blocks/basic#add-to-list) | Adds a new entry to a list |
+| [Note](/platform/blocks/basic#note) | Displays a sticky note in the workflow |
+
+## Data Processing
+| Block Name | Description |
+|------------|-------------|
+| [Read CSV](/platform/blocks/csv#read-csv) | Processes and extracts data from CSV files |
+| [Data Sampling](/platform/blocks/sampling#data-sampling) | Selects a subset of data using various sampling methods |
+
+## Text Processing
+| Block Name | Description |
+|------------|-------------|
+| [Match Text Pattern](/platform/blocks/text#match-text-pattern) | Checks if text matches a specified pattern |
+| [Extract Text Information](/platform/blocks/text#extract-text-information) | Extracts specific information from text using patterns |
+| [Fill Text Template](/platform/blocks/text#fill-text-template) | Populates a template with provided values |
+| [Combine Texts](/platform/blocks/text#combine-texts) | Merges multiple text inputs into one |
+| [Text Decoder](/platform/blocks/decoder_block#text-decoder) | Converts encoded text into readable format |
+
+## AI and Language Models
+| Block Name | Description |
+|------------|-------------|
+| [AI Structured Response Generator](/platform/blocks/llm#ai-structured-response-generator) | Generates structured responses using LLMs |
+| [AI Text Generator](/platform/blocks/llm#ai-text-generator) | Produces text responses using LLMs |
+| [AI Text Summarizer](/platform/blocks/llm#ai-text-summarizer) | Summarizes long texts using LLMs |
+| [AI Conversation](/platform/blocks/llm#ai-conversation) | Facilitates multi-turn conversations with LLMs |
+| [AI List Generator](/platform/blocks/llm#ai-list-generator) | Creates lists based on prompts using LLMs |
+
+## Web and API Interactions
+| Block Name | Description |
+|------------|-------------|
+| [Send Web Request](/platform/blocks/http#send-web-request) | Makes HTTP requests to specified web addresses |
+| [Read RSS Feed](/platform/blocks/rss#read-rss-feed) | Retrieves and processes entries from RSS feeds |
+| [Get Weather Information](/platform/blocks/search#get-weather-information) | Fetches current weather data for a location |
+| [Google Maps Search](/platform/blocks/google_maps#google-maps-search) | Searches for local businesses using Google Maps API |
+
+## Social Media and Content
+| Block Name | Description |
+|------------|-------------|
+| [Get Reddit Posts](/platform/blocks/reddit#get-reddit-posts) | Retrieves posts from specified subreddits |
+| [Post Reddit Comment](/platform/blocks/reddit#post-reddit-comment) | Posts comments on Reddit |
+| [Publish to Medium](/platform/blocks/medium#publish-to-medium) | Publishes content directly to Medium |
+| [Read Discord Messages](/platform/blocks/discord#read-discord-messages) | Retrieves messages from Discord channels |
+| [Send Discord Message](/platform/blocks/discord#send-discord-message) | Sends messages to Discord channels |
+
+## Search and Information Retrieval
+| Block Name | Description |
+|------------|-------------|
+| [Get Wikipedia Summary](/platform/blocks/search#get-wikipedia-summary) | Fetches summaries of topics from Wikipedia |
+| [Search The Web](/platform/blocks/search#search-the-web) | Performs web searches and returns results |
+| [Extract Website Content](/platform/blocks/search#extract-website-content) | Retrieves and extracts content from websites |
+
+## Time and Date
+| Block Name | Description |
+|------------|-------------|
+| [Get Current Time](/platform/blocks/time_blocks#get-current-time) | Provides the current time |
+| [Get Current Date](/platform/blocks/time_blocks#get-current-date) | Provides the current date |
+| [Get Current Date and Time](/platform/blocks/time_blocks#get-current-date-and-time) | Provides both current date and time |
+| [Countdown Timer](/platform/blocks/time_blocks#countdown-timer) | Acts as a countdown timer |
+
+## Math and Calculations
+| Block Name | Description |
+|------------|-------------|
+| [Calculator](/platform/blocks/maths#calculator) | Performs basic mathematical operations |
+| [Count Items](/platform/blocks/maths#count-items) | Counts items in a collection |
+
+## Media Generation
+| Block Name | Description |
+|------------|-------------|
+| [Ideogram Model](/platform/blocks/ideogram#ideogram-model) | Generates images based on text prompts |
+| [Create Talking Avatar Video](/platform/blocks/talking_head#create-talking-avatar-video) | Creates videos with talking avatars |
+| [Unreal Text to Speech](/platform/blocks/text_to_speech_block#unreal-text-to-speech) | Converts text to speech using Unreal Speech API |
+| [AI Shortform Video Creator](/platform/blocks/ai_shortform_video_block) | Generates short-form videos using AI |
+| [Replicate Flux Advanced Model](/platform/blocks/replicate_flux_advanced#replicate-flux-advanced-model) | Creates images using Replicate's Flux models |
+
+## Miscellaneous
+| Block Name | Description |
+|------------|-------------|
+| [Transcribe YouTube Video](/platform/blocks/youtube#transcribe-youtube-video) | Transcribes audio from YouTube videos |
+| [Send Email](/platform/blocks/email_block#send-email) | Sends emails using SMTP |
+| [Condition Block](/platform/blocks/branching#condition-block) | Evaluates conditions for workflow branching |
+| [Step Through Items](/platform/blocks/iteration#step-through-items) | Iterates through lists or dictionaries |
+
+## Google Services
+| Block Name | Description |
+|------------|-------------|
+| [Gmail Read](/platform/blocks/google/gmail#gmail-read) | Retrieves and reads emails from a Gmail account |
+| [Gmail Send](/platform/blocks/google/gmail#gmail-send) | Sends emails using a Gmail account |
+| [Gmail List Labels](/platform/blocks/google/gmail#gmail-list-labels) | Retrieves all labels from a Gmail account |
+| [Gmail Add Label](/platform/blocks/google/gmail#gmail-add-label) | Adds a label to a specific email in a Gmail account |
+| [Gmail Remove Label](/platform/blocks/google/gmail#gmail-remove-label) | Removes a label from a specific email in a Gmail account |
+| [Google Sheets Read](/platform/blocks/google/sheet#google-sheets-read) | Reads data from a Google Sheets spreadsheet |
+| [Google Sheets Write](/platform/blocks/google/sheet#google-sheets-write) | Writes data to a Google Sheets spreadsheet |
+| [Google Maps Search](/platform/blocks/google_maps#google-maps-search) | Searches for local businesses using the Google Maps API |
+
+## GitHub Integration
+| Block Name | Description |
+|------------|-------------|
+| [GitHub Comment](/platform/blocks/github/issues#github-comment) | Posts comments on GitHub issues or pull requests |
+| [GitHub Make Issue](/platform/blocks/github/issues#github-make-issue) | Creates new issues on GitHub repositories |
+| [GitHub Read Issue](/platform/blocks/github/issues#github-read-issue) | Retrieves information about a specific GitHub issue |
+| [GitHub List Issues](/platform/blocks/github/issues#github-list-issues) | Retrieves a list of issues from a GitHub repository |
+| [GitHub Add Label](/platform/blocks/github/issues#github-add-label) | Adds a label to a GitHub issue or pull request |
+| [GitHub Remove Label](/platform/blocks/github/issues#github-remove-label) | Removes a label from a GitHub issue or pull request |
+| [GitHub Assign Issue](/platform/blocks/github/issues#github-assign-issue) | Assigns a user to a GitHub issue |
+| [GitHub List Tags](/platform/blocks/github/repo#github-list-tags) | Retrieves and lists all tags for a specified GitHub repository |
+| [GitHub List Branches](/platform/blocks/github/repo#github-list-branches) | Retrieves and lists all branches for a specified GitHub repository |
+| [GitHub List Discussions](/platform/blocks/github/repo#github-list-discussions) | Retrieves and lists recent discussions for a specified GitHub repository |
+| [GitHub Make Branch](/platform/blocks/github/repo#github-make-branch) | Creates a new branch in a GitHub repository |
+| [GitHub Delete Branch](/platform/blocks/github/repo#github-delete-branch) | Deletes a specified branch from a GitHub repository |
+| [GitHub List Pull Requests](/platform/blocks/github/pull_requests#github-list-pull-requests) | Retrieves a list of pull requests from a specified GitHub repository |
+| [GitHub Make Pull Request](/platform/blocks/github/pull_requests#github-make-pull-request) | Creates a new pull request in a specified GitHub repository |
+| [GitHub Read Pull Request](/platform/blocks/github/pull_requests#github-read-pull-request) | Retrieves detailed information about a specific GitHub pull request |
+| [GitHub Assign PR Reviewer](/platform/blocks/github/pull_requests#github-assign-pr-reviewer) | Assigns a reviewer to a specific GitHub pull request |
+| [GitHub Unassign PR Reviewer](/platform/blocks/github/pull_requests#github-unassign-pr-reviewer) | Removes an assigned reviewer from a specific GitHub pull request |
+| [GitHub List PR Reviewers](/platform/blocks/github/pull_requests#github-list-pr-reviewers) | Retrieves a list of all assigned reviewers for a specific GitHub pull request |
+
+This comprehensive list covers all the blocks available in AutoGPT. Each block is designed to perform a specific task, and they can be combined to create powerful, automated workflows. For more detailed information on each block, click on its name to view the full documentation.
diff --git a/docs/content/platform/blocks/branching.md b/docs/platform/blocks/branching.mdx
similarity index 95%
rename from docs/content/platform/blocks/branching.md
rename to docs/platform/blocks/branching.mdx
index 7e3932d00..a5dfc4756 100644
--- a/docs/content/platform/blocks/branching.md
+++ b/docs/platform/blocks/branching.mdx
@@ -1,4 +1,6 @@
-# Condition Block
+---
+title: Condition Block
+---
## What it is
The Condition Block is a logical component that evaluates comparisons between two values and produces outputs based on the result.
@@ -26,4 +28,4 @@ The block takes two values and a comparison operator as inputs. It then performs
| No Output | The output value if the condition is false. This will be the No Value if provided, or Value 1 if not |
## Possible use case
-This block could be used in a customer loyalty program to determine if a customer qualifies for a discount. For example, you could compare the customer's total purchases (Value 1) with a threshold amount (Value 2) using the "greater than or equal to" operator. The Yes Value could be "Qualified for discount" and the No Value could be "Not qualified". The block would then output whether the customer qualifies and the appropriate message.
\ No newline at end of file
+This block could be used in a customer loyalty program to determine if a customer qualifies for a discount. For example, you could compare the customer's total purchases (Value 1) with a threshold amount (Value 2) using the "greater than or equal to" operator. The Yes Value could be "Qualified for discount" and the No Value could be "Not qualified". The block would then output whether the customer qualifies and the appropriate message.
diff --git a/docs/content/platform/blocks/csv.md b/docs/platform/blocks/csv.mdx
similarity index 95%
rename from docs/content/platform/blocks/csv.md
rename to docs/platform/blocks/csv.mdx
index 7117b57be..f584b8aa0 100644
--- a/docs/content/platform/blocks/csv.md
+++ b/docs/platform/blocks/csv.mdx
@@ -1,4 +1,6 @@
-# Read CSV
+---
+title: Read CSV
+---
## What it is
A block that reads and processes CSV (Comma-Separated Values) files.
@@ -28,4 +30,4 @@ The Read CSV block takes the contents of a CSV file and splits it into rows and
| All_data | A list of dictionaries containing all rows from the CSV |
## Possible use case
-This block could be used in a data analysis pipeline to import and process customer information from a CSV file. The individual rows could be used for real-time processing, while the complete dataset could be used for batch analysis or reporting.
\ No newline at end of file
+This block could be used in a data analysis pipeline to import and process customer information from a CSV file. The individual rows could be used for real-time processing, while the complete dataset could be used for batch analysis or reporting.
diff --git a/docs/content/platform/blocks/decoder_block.md b/docs/platform/blocks/decoder_block.mdx
similarity index 97%
rename from docs/content/platform/blocks/decoder_block.md
rename to docs/platform/blocks/decoder_block.mdx
index 123cf692e..c99b6d7be 100644
--- a/docs/content/platform/blocks/decoder_block.md
+++ b/docs/platform/blocks/decoder_block.mdx
@@ -1,4 +1,6 @@
-# Text Decoder
+---
+title: Text Decoder
+---
## What it is
A tool that converts text with special characters into regular, readable text.
@@ -29,4 +31,4 @@ World!
This is a "quoted" string.
```
-This could be useful when working with data from various sources where text might be encoded to preserve special characters, such as when importing data from a file or receiving it from an API.
\ No newline at end of file
+This could be useful when working with data from various sources where text might be encoded to preserve special characters, such as when importing data from a file or receiving it from an API.
diff --git a/docs/content/platform/blocks/discord.md b/docs/platform/blocks/discord.mdx
similarity index 96%
rename from docs/content/platform/blocks/discord.md
rename to docs/platform/blocks/discord.mdx
index 36479e75c..c3fcaeca0 100644
--- a/docs/content/platform/blocks/discord.md
+++ b/docs/platform/blocks/discord.mdx
@@ -1,4 +1,6 @@
-## Read Discord Messages
+---
+title: Read Discord Messages
+---
### What it is
A block that reads messages from a Discord channel using a bot token.
@@ -51,4 +53,4 @@ The block uses a Discord bot to log into a server, locate the specified channel,
| Status | A string indicating the result of the operation (e.g., "Message sent" or "Channel not found") |
### Possible use case
-This block could be used as part of an automated notification system. For example, it could send alerts to a Discord channel when certain events occur in another system, such as when a new user signs up or when a critical error is detected.
\ No newline at end of file
+This block could be used as part of an automated notification system. For example, it could send alerts to a Discord channel when certain events occur in another system, such as when a new user signs up or when a critical error is detected.
diff --git a/docs/content/platform/blocks/email_block.md b/docs/platform/blocks/email_block.mdx
similarity index 95%
rename from docs/content/platform/blocks/email_block.md
rename to docs/platform/blocks/email_block.mdx
index c3c1e8f44..de99ebab2 100644
--- a/docs/content/platform/blocks/email_block.md
+++ b/docs/platform/blocks/email_block.mdx
@@ -1,4 +1,6 @@
-# Send Email
+---
+title: Send Email
+---
## What it is
The Send Email block is a tool for sending emails using SMTP (Simple Mail Transfer Protocol) credentials.
@@ -32,4 +34,4 @@ The block takes the recipient's email address, subject, and body of the email as
| Error | If the email sending fails, this output provides details about the error that occurred |
## Possible use case
-This block could be used in an automated customer support system. When a customer submits a support ticket through a website, the Send Email block could automatically send a confirmation email to the customer, acknowledging receipt of their request and providing them with a ticket number for future reference.
\ No newline at end of file
+This block could be used in an automated customer support system. When a customer submits a support ticket through a website, the Send Email block could automatically send a confirmation email to the customer, acknowledging receipt of their request and providing them with a ticket number for future reference.
diff --git a/docs/content/platform/blocks/github/issues.md b/docs/platform/blocks/github/issues.mdx
similarity index 98%
rename from docs/content/platform/blocks/github/issues.md
rename to docs/platform/blocks/github/issues.mdx
index 2727e10ac..05fc60e8e 100644
--- a/docs/content/platform/blocks/github/issues.md
+++ b/docs/platform/blocks/github/issues.mdx
@@ -1,4 +1,6 @@
-# GitHub Issues
+---
+title: GitHub Issues
+---
## Github Comment
@@ -233,4 +235,4 @@ The block takes the GitHub credentials, the URL of the issue, and the username o
| Error | Any error message if unassigning the issue fails |
### Possible use case
-Automatically unassigning issues that have been inactive for a certain period or when reassigning workload among team members.
\ No newline at end of file
+Automatically unassigning issues that have been inactive for a certain period or when reassigning workload among team members.
diff --git a/docs/content/platform/blocks/github/pull_requests.md b/docs/platform/blocks/github/pull_requests.mdx
similarity index 98%
rename from docs/content/platform/blocks/github/pull_requests.md
rename to docs/platform/blocks/github/pull_requests.mdx
index ef72e4de5..6ff8a3498 100644
--- a/docs/content/platform/blocks/github/pull_requests.md
+++ b/docs/platform/blocks/github/pull_requests.mdx
@@ -1,4 +1,6 @@
-# Pull Requests
+---
+title: Pull Requests
+---
## GitHub List Pull Requests
@@ -179,4 +181,4 @@ It connects to the GitHub API using the provided credentials and pull request UR
| Error | An error message if listing the reviewers fails |
### Possible use case
-A project coordinator wants to check who is currently assigned to review a specific pull request to ensure all necessary team members are involved in the code review process.
\ No newline at end of file
+A project coordinator wants to check who is currently assigned to review a specific pull request to ensure all necessary team members are involved in the code review process.
diff --git a/docs/content/platform/blocks/github/repo.md b/docs/platform/blocks/github/repo.mdx
similarity index 99%
rename from docs/content/platform/blocks/github/repo.md
rename to docs/platform/blocks/github/repo.mdx
index 26e680c97..f6514f311 100644
--- a/docs/content/platform/blocks/github/repo.md
+++ b/docs/platform/blocks/github/repo.mdx
@@ -1,4 +1,6 @@
-# Repository
+---
+title: Repository
+---
## GitHub List Tags
@@ -231,4 +233,4 @@ The block authenticates with the GitHub API and sends a delete request for the s
| Error | Any error message if the branch deletion process fails |
### Possible use case
-After merging a feature branch into the main development branch, a developer wants to clean up the repository by removing the now-obsolete feature branch.
\ No newline at end of file
+After merging a feature branch into the main development branch, a developer wants to clean up the repository by removing the now-obsolete feature branch.
diff --git a/docs/content/platform/blocks/google/gmail.md b/docs/platform/blocks/google/gmail.mdx
similarity index 98%
rename from docs/content/platform/blocks/google/gmail.md
rename to docs/platform/blocks/google/gmail.mdx
index a23ffb874..986abe54a 100644
--- a/docs/content/platform/blocks/google/gmail.md
+++ b/docs/platform/blocks/google/gmail.mdx
@@ -1,4 +1,6 @@
-# Gmail
+---
+tile: Gmail
+---
## Gmail Read
@@ -141,4 +143,4 @@ The block first finds the ID of the specified label in the user's Gmail account.
| Error | An error message if something goes wrong during the process |
### Possible use case
-Automatically removing the "Unread" label from emails after they have been processed by a customer service representative.
\ No newline at end of file
+Automatically removing the "Unread" label from emails after they have been processed by a customer service representative.
diff --git a/docs/content/platform/blocks/google/sheet.md b/docs/platform/blocks/google/sheet.mdx
similarity index 96%
rename from docs/content/platform/blocks/google/sheet.md
rename to docs/platform/blocks/google/sheet.mdx
index 2ad31bcae..11845d5f9 100644
--- a/docs/content/platform/blocks/google/sheet.md
+++ b/docs/platform/blocks/google/sheet.mdx
@@ -1,4 +1,6 @@
-## Google Sheets Read
+---
+title: Google Sheets Read
+---
### What it is
A block that reads data from a Google Sheets spreadsheet.
@@ -53,4 +55,4 @@ The block authenticates with Google Sheets using provided credentials, then upda
| Error | Any error message that occurred during the process |
### Possible use case
-An automated inventory system could use this block to update stock levels in a Google Sheets spreadsheet whenever products are sold or restocked, ensuring real-time inventory tracking.
\ No newline at end of file
+An automated inventory system could use this block to update stock levels in a Google Sheets spreadsheet whenever products are sold or restocked, ensuring real-time inventory tracking.
diff --git a/docs/content/platform/blocks/google_maps.md b/docs/platform/blocks/google_maps.mdx
similarity index 96%
rename from docs/content/platform/blocks/google_maps.md
rename to docs/platform/blocks/google_maps.mdx
index eaf499c62..aaa948847 100644
--- a/docs/content/platform/blocks/google_maps.md
+++ b/docs/platform/blocks/google_maps.mdx
@@ -1,4 +1,6 @@
-# Google Maps Search
+---
+title: Google Maps Search
+---
## What it is
A block that searches for local businesses using the Google Maps API.
@@ -30,4 +32,4 @@ The block takes a search query, location details, and API credentials as input.
| Error | A message describing any issues that occurred during the search process |
## Possible use case
-A travel planning application could use this block to help users discover popular restaurants, attractions, or accommodations in their destination city. By inputting a search query like "family-friendly restaurants in Paris" and specifying a search radius around their hotel, travelers could quickly get a list of suitable dining options with ratings, contact information, and websites for making reservations.
\ No newline at end of file
+A travel planning application could use this block to help users discover popular restaurants, attractions, or accommodations in their destination city. By inputting a search query like "family-friendly restaurants in Paris" and specifying a search radius around their hotel, travelers could quickly get a list of suitable dining options with ratings, contact information, and websites for making reservations.
diff --git a/docs/content/platform/blocks/http.md b/docs/platform/blocks/http.mdx
similarity index 95%
rename from docs/content/platform/blocks/http.md
rename to docs/platform/blocks/http.mdx
index b0e54f493..3118e7ff0 100644
--- a/docs/content/platform/blocks/http.md
+++ b/docs/platform/blocks/http.mdx
@@ -1,4 +1,6 @@
-# Send Web Request
+---
+title: Send Web Request
+---
## What it is
The Send Web Request block is a tool for making HTTP requests to specified web addresses.
@@ -25,4 +27,4 @@ When activated, the block takes the provided URL, request method, headers, and b
| Server Error | Information about errors on the server side (status codes 500-599) |
## Possible use case
-This block could be used in an application that needs to interact with external APIs. For example, it could send user data to a registration service, retrieve product information from an e-commerce platform, or post updates to a social media service. The block's ability to handle different types of responses makes it versatile for various web-based interactions.
\ No newline at end of file
+This block could be used in an application that needs to interact with external APIs. For example, it could send user data to a registration service, retrieve product information from an e-commerce platform, or post updates to a social media service. The block's ability to handle different types of responses makes it versatile for various web-based interactions.
diff --git a/docs/content/platform/blocks/ideogram.md b/docs/platform/blocks/ideogram.mdx
similarity index 96%
rename from docs/content/platform/blocks/ideogram.md
rename to docs/platform/blocks/ideogram.mdx
index e5c5222e7..329308db9 100644
--- a/docs/content/platform/blocks/ideogram.md
+++ b/docs/platform/blocks/ideogram.mdx
@@ -1,4 +1,6 @@
-# Ideogram Model
+---
+title: Ideogram Model
+---
## What it is
The Ideogram Model block is an AI-powered image generation tool that creates custom images based on text prompts and various settings.
@@ -30,4 +32,4 @@ The block takes a text prompt and several optional parameters as input. It then
| Error | An error message if something goes wrong during the process |
## Possible use case
-A marketing team needs unique visuals for a new product campaign. They can use the Ideogram Model block to quickly generate custom images based on their product descriptions and brand guidelines, exploring different styles and aspect ratios without the need for a professional designer.
\ No newline at end of file
+A marketing team needs unique visuals for a new product campaign. They can use the Ideogram Model block to quickly generate custom images based on their product descriptions and brand guidelines, exploring different styles and aspect ratios without the need for a professional designer.
diff --git a/docs/content/platform/blocks/iteration.md b/docs/platform/blocks/iteration.mdx
similarity index 87%
rename from docs/content/platform/blocks/iteration.md
rename to docs/platform/blocks/iteration.mdx
index d835b217e..52109c0d1 100644
--- a/docs/content/platform/blocks/iteration.md
+++ b/docs/platform/blocks/iteration.mdx
@@ -1,4 +1,6 @@
-## Step Through Items
+---
+title: Step Through Items
+---
### What it is
A block that iterates through a list or dictionary, processing each item one by one.
@@ -12,7 +14,7 @@ When given a list or dictionary, the block processes each item individually. For
### Inputs
| Input | Description |
|-------|-------------|
-| Items | A list or dictionary that you want to process item by item. For example, you could input a list of numbers [1, 2, 3, 4, 5] or a dictionary of key-value pairs {'key1': 'value1', 'key2': 'value2'} |
+| Items | A list or dictionary that you want to process item by item. For example, you could input a list of numbers [1, 2, 3, 4, 5] or a dictionary of key-value pairs \{'key1': 'value1', 'key2': 'value2'} |
### Outputs
| Output | Description |
@@ -21,4 +23,4 @@ When given a list or dictionary, the block processes each item individually. For
| Key | For lists, this is the index (position) of the current item. For dictionaries, this is the same as the item (the dictionary's value) |
### Possible use case
-Imagine you have a list of customer names and you want to perform a specific action for each customer, like sending a personalized email. This block could help you go through the list one by one, allowing you to process each customer individually.
\ No newline at end of file
+Imagine you have a list of customer names and you want to perform a specific action for each customer, like sending a personalized email. This block could help you go through the list one by one, allowing you to process each customer individually.
diff --git a/docs/content/platform/blocks/llm.md b/docs/platform/blocks/llm.mdx
similarity index 98%
rename from docs/content/platform/blocks/llm.md
rename to docs/platform/blocks/llm.mdx
index 02c0b7998..e07d77443 100644
--- a/docs/content/platform/blocks/llm.md
+++ b/docs/platform/blocks/llm.mdx
@@ -1,4 +1,6 @@
-# Large Language Model (LLM) Blocks
+---
+title: Large Language Model (LLM) Blocks
+---
## AI Structured Response Generator
@@ -156,4 +158,4 @@ The block formulates a prompt based on the given focus or source data, sends it
| Error | Any error message if the process fails |
### Possible use case
-Automatically generating a list of key points or action items from a long meeting transcript or summarizing the main topics discussed in a series of documents.
\ No newline at end of file
+Automatically generating a list of key points or action items from a long meeting transcript or summarizing the main topics discussed in a series of documents.
diff --git a/docs/content/platform/blocks/maths.md b/docs/platform/blocks/maths.mdx
similarity index 95%
rename from docs/content/platform/blocks/maths.md
rename to docs/platform/blocks/maths.mdx
index d024afe8c..2ca70a977 100644
--- a/docs/content/platform/blocks/maths.md
+++ b/docs/platform/blocks/maths.mdx
@@ -1,4 +1,6 @@
-# Mathematical Operations Blocks
+---
+title: Mathematical Operations Blocks
+---
## Calculator
@@ -51,4 +53,4 @@ The Count Items block receives a collection as input. It then determines the typ
| Count | The number of items in the collection |
### Possible use case
-A user has a list of customer names and wants to quickly determine how many customers are in the list. They can input the list into this block and receive the total count immediately.
\ No newline at end of file
+A user has a list of customer names and wants to quickly determine how many customers are in the list. They can input the list into this block and receive the total count immediately.
diff --git a/docs/content/platform/blocks/medium.md b/docs/platform/blocks/medium.mdx
similarity index 96%
rename from docs/content/platform/blocks/medium.md
rename to docs/platform/blocks/medium.mdx
index 644f70d8a..2ecab88f1 100644
--- a/docs/content/platform/blocks/medium.md
+++ b/docs/platform/blocks/medium.mdx
@@ -1,4 +1,6 @@
-# Publish to Medium
+---
+title: Publish to Medium
+---
## What it is
The Publish to Medium block is a tool that enables direct publication of content to the Medium platform from within an automated workflow.
@@ -32,4 +34,4 @@ The block uses the provided Medium API key and author ID to authenticate with th
| Error | Any error message returned if the publication process fails |
## Possible use case
-A digital marketing team could integrate this block into their content management system to streamline their cross-platform publishing strategy. After creating and approving a blog post in their main system, they could use this block to automatically publish the content to Medium, ensuring consistent and timely distribution across multiple platforms without manual intervention.
\ No newline at end of file
+A digital marketing team could integrate this block into their content management system to streamline their cross-platform publishing strategy. After creating and approving a blog post in their main system, they could use this block to automatically publish the content to Medium, ensuring consistent and timely distribution across multiple platforms without manual intervention.
diff --git a/docs/content/platform/blocks/reddit.md b/docs/platform/blocks/reddit.mdx
similarity index 97%
rename from docs/content/platform/blocks/reddit.md
rename to docs/platform/blocks/reddit.mdx
index d3d7d83a8..58e7b46c2 100644
--- a/docs/content/platform/blocks/reddit.md
+++ b/docs/platform/blocks/reddit.mdx
@@ -1,4 +1,6 @@
-# Reddit Interaction Blocks
+---
+title: Reddit Interaction Blocks
+---
## Get Reddit Posts
@@ -53,4 +55,4 @@ The block connects to Reddit using the provided credentials, locates the specifi
| Comment ID | The unique identifier of the newly posted comment |
### Possible use case
-An automated moderation system could use this block to post pre-defined responses or warnings on Reddit posts that violate community guidelines.
\ No newline at end of file
+An automated moderation system could use this block to post pre-defined responses or warnings on Reddit posts that violate community guidelines.
diff --git a/docs/content/platform/blocks/replicate_flux_advanced.md b/docs/platform/blocks/replicate_flux_advanced.mdx
similarity index 97%
rename from docs/content/platform/blocks/replicate_flux_advanced.md
rename to docs/platform/blocks/replicate_flux_advanced.mdx
index 5572516fa..1805ddcfb 100644
--- a/docs/content/platform/blocks/replicate_flux_advanced.md
+++ b/docs/platform/blocks/replicate_flux_advanced.mdx
@@ -1,4 +1,6 @@
-## Replicate Flux Advanced Model
+---
+title: Replicate Flux Advanced Model
+---
### What it is
The Replicate Flux Advanced Model block is an AI-powered image generation tool that creates images based on text prompts and various customizable settings.
@@ -49,4 +51,4 @@ A graphic designer could use this block to quickly generate concept art for a sc
- Error: An error message if the image generation process fails
### Possible use case
-A graphic designer could use this block to quickly generate concept art for a sci-fi game. They might input a prompt like "A futuristic spaceport on a distant planet with multiple moons in the sky" and adjust the settings to get the desired style and quality. The generated image could then serve as inspiration or a starting point for further design work.
\ No newline at end of file
+A graphic designer could use this block to quickly generate concept art for a sci-fi game. They might input a prompt like "A futuristic spaceport on a distant planet with multiple moons in the sky" and adjust the settings to get the desired style and quality. The generated image could then serve as inspiration or a starting point for further design work.
diff --git a/docs/content/platform/blocks/rss.md b/docs/platform/blocks/rss.mdx
similarity index 95%
rename from docs/content/platform/blocks/rss.md
rename to docs/platform/blocks/rss.mdx
index 9ca29353f..280458807 100644
--- a/docs/content/platform/blocks/rss.md
+++ b/docs/platform/blocks/rss.mdx
@@ -1,4 +1,6 @@
-# Read RSS Feed
+---
+title: Read RSS Feed
+---
## What it is
A block that retrieves and processes entries from an RSS feed.
@@ -29,4 +31,4 @@ The block connects to the provided RSS feed URL, fetches the feed content, and p
| | - Categories: Topics or tags associated with the item |
## Possible use case
-A news aggregator application could use this block to continuously monitor multiple RSS feeds from different news sources. The application could then display the latest news items to users, categorized by topic and sorted by publication date.
\ No newline at end of file
+A news aggregator application could use this block to continuously monitor multiple RSS feeds from different news sources. The application could then display the latest news items to users, categorized by topic and sorted by publication date.
diff --git a/docs/content/platform/blocks/sampling.md b/docs/platform/blocks/sampling.mdx
similarity index 98%
rename from docs/content/platform/blocks/sampling.md
rename to docs/platform/blocks/sampling.mdx
index d29dfcd0f..243d61d76 100644
--- a/docs/content/platform/blocks/sampling.md
+++ b/docs/platform/blocks/sampling.mdx
@@ -1,4 +1,6 @@
-# Data Sampling
+---
+title: Data Sampling
+---
## What it is
The Data Sampling block is a tool for selecting a subset of data from a larger dataset using various sampling methods.
@@ -28,4 +30,4 @@ The block processes the input data and applies the chosen sampling method to sel
| Sample Indices | The indices of the sampled items in the original dataset. |
## Possible use case
-A data scientist working with a large customer dataset wants to create a representative sample for analysis. They could use this Data Sampling block to select a smaller subset of customers using stratified sampling, ensuring that the sample maintains the same proportions of different customer segments as the full dataset.
\ No newline at end of file
+A data scientist working with a large customer dataset wants to create a representative sample for analysis. They could use this Data Sampling block to select a smaller subset of customers using stratified sampling, ensuring that the sample maintains the same proportions of different customer segments as the full dataset.
diff --git a/docs/content/platform/blocks/search.md b/docs/platform/blocks/search.mdx
similarity index 99%
rename from docs/content/platform/blocks/search.md
rename to docs/platform/blocks/search.mdx
index bd10cef26..2839cdb4e 100644
--- a/docs/content/platform/blocks/search.md
+++ b/docs/platform/blocks/search.mdx
@@ -1,4 +1,6 @@
-## Get Wikipedia Summary
+---
+title: Get Wikipedia Summary
+---
### What it is
A block that retrieves a summary of a given topic from Wikipedia.
@@ -108,4 +110,4 @@ The block sends a request to a weather API (like OpenWeatherMap) with the provid
| Error | A message explaining what went wrong if the weather data retrieval fails |
### Possible use case
-A travel planning application could use this block to provide users with current weather information for their destination cities.
\ No newline at end of file
+A travel planning application could use this block to provide users with current weather information for their destination cities.
diff --git a/docs/content/platform/blocks/talking_head.md b/docs/platform/blocks/talking_head.mdx
similarity index 94%
rename from docs/content/platform/blocks/talking_head.md
rename to docs/platform/blocks/talking_head.mdx
index 15ba1cd46..e411d5a1a 100644
--- a/docs/content/platform/blocks/talking_head.md
+++ b/docs/platform/blocks/talking_head.mdx
@@ -1,4 +1,6 @@
-## Create Talking Avatar Video
+---
+title: Create Talking Avatar Video
+---
### What it is
This block is an AI-powered tool that creates video clips featuring a talking avatar using the D-ID service.
@@ -32,4 +34,4 @@ The block sends a request to the D-ID API with your specified parameters. It the
| Error | A message explaining what went wrong if the video creation failed |
### Possible use case
-A marketing team could use this block to create engaging video content for social media. They could input a script promoting a new product, select a friendly-looking avatar, and generate a video that explains the product's features in an appealing way.
\ No newline at end of file
+A marketing team could use this block to create engaging video content for social media. They could input a script promoting a new product, select a friendly-looking avatar, and generate a video that explains the product's features in an appealing way.
diff --git a/docs/content/platform/blocks/text.md b/docs/platform/blocks/text.mdx
similarity index 98%
rename from docs/content/platform/blocks/text.md
rename to docs/platform/blocks/text.mdx
index 20a55690f..a6934877f 100644
--- a/docs/content/platform/blocks/text.md
+++ b/docs/platform/blocks/text.mdx
@@ -1,4 +1,6 @@
-## Match Text Pattern
+---
+title: Match Text Pattern
+---
### What it is
A block that matches text against a specified pattern.
@@ -110,4 +112,4 @@ The block concatenates all the input texts in the order they are provided, inser
| Output | The combined text |
### Possible use case
-Merging multiple parts of an address (street, city, state, zip code) into a single, formatted address string.
\ No newline at end of file
+Merging multiple parts of an address (street, city, state, zip code) into a single, formatted address string.
diff --git a/docs/content/platform/blocks/text_to_speech_block.md b/docs/platform/blocks/text_to_speech_block.mdx
similarity index 93%
rename from docs/content/platform/blocks/text_to_speech_block.md
rename to docs/platform/blocks/text_to_speech_block.mdx
index 9683d0a55..aab789ff0 100644
--- a/docs/content/platform/blocks/text_to_speech_block.md
+++ b/docs/platform/blocks/text_to_speech_block.mdx
@@ -1,5 +1,6 @@
-## Unreal Text to Speech
-
+---
+title: Unreal Text to Speech
+---
### What it is
A block that converts text into speech using the Unreal Speech API.
@@ -23,4 +24,4 @@ The block sends the provided text and voice selection to the Unreal Speech API.
| Error | If something goes wrong during the process, this will contain a message explaining what happened. |
### Possible use case
-This block could be used in an application that helps visually impaired users consume written content. For example, a news app could use this block to convert articles into audio format, allowing users to listen to the news instead of reading it.
\ No newline at end of file
+This block could be used in an application that helps visually impaired users consume written content. For example, a news app could use this block to convert articles into audio format, allowing users to listen to the news instead of reading it.
diff --git a/docs/content/platform/blocks/time_blocks.md b/docs/platform/blocks/time_blocks.mdx
similarity index 98%
rename from docs/content/platform/blocks/time_blocks.md
rename to docs/platform/blocks/time_blocks.mdx
index 2dee5fdd8..41abe56b0 100644
--- a/docs/content/platform/blocks/time_blocks.md
+++ b/docs/platform/blocks/time_blocks.mdx
@@ -1,5 +1,6 @@
-## Get Current Time
-
+---
+title: Get Current Time
+---
### What it is
A block that provides the current time.
@@ -103,4 +104,4 @@ The block takes input for the duration in days, hours, minutes, and seconds. It
| output_message | The message specified in the input_message, output after the timer completes. |
### Possible use case
-This block could be used in a reminder application to trigger notifications after a set amount of time, or in a cooking app to notify users when a recipe step is complete.
\ No newline at end of file
+This block could be used in a reminder application to trigger notifications after a set amount of time, or in a cooking app to notify users when a recipe step is complete.
diff --git a/docs/content/platform/blocks/youtube.md b/docs/platform/blocks/youtube.mdx
similarity index 97%
rename from docs/content/platform/blocks/youtube.md
rename to docs/platform/blocks/youtube.mdx
index 691ec2f7b..b05ac2583 100644
--- a/docs/content/platform/blocks/youtube.md
+++ b/docs/platform/blocks/youtube.mdx
@@ -1,4 +1,6 @@
-## Transcribe YouTube Video
+---
+title: Transcribe YouTube Video
+---
### What it is
A block that transcribes the audio content of a YouTube video into text.
diff --git a/docs/content/platform/contributing/tests.md b/docs/platform/contributing/tests.mdx
similarity index 76%
rename from docs/content/platform/contributing/tests.md
rename to docs/platform/contributing/tests.mdx
index bc0422db6..d0bb557e5 100644
--- a/docs/content/platform/contributing/tests.md
+++ b/docs/platform/contributing/tests.mdx
@@ -1,4 +1,6 @@
-# Testing
+---
+title: Testing
+---
We use [Playwright](https://playwright.dev/) for our testing framework.
@@ -97,10 +99,31 @@ A page object should contain methods that are actions that a user can do on that
This is a shortened example of a page object for the profile page:
-
+```typescript frontend/src/tests/pages/profile.page.ts
+export class ProfilePage extends BasePage {
+ constructor(page: Page) {
+ super(page);
+ }
-```typescript title="frontend/src/tests/pages/profile.page.ts"
---8<-- "autogpt_platform/frontend/src/tests/pages/profile.page.ts:ProfilePageExample"
+ async getDisplayedHandle(): Promise {
+ await this.waitForPageToLoad();
+ const handle = await this.page.locator('input[name="handle"]').inputValue();
+ if (!handle) {
+ throw new Error("Handle not found");
+ }
+ return handle;
+ }
+
+ async getDisplayedName(): Promise {
+ await this.waitForPageToLoad();
+ const displayName = await this.page
+ .locator('input[name="displayName"]')
+ .inputValue();
+ if (!displayName) {
+ throw new Error("Display name not found");
+ }
+ return displayName;
+ }
}
```
@@ -127,8 +150,44 @@ A good test suite will have a healthy mix of focused and non-focused tests.
### Example Focused Test & Explanation
-```typescript title="frontend/src/tests/build.spec.ts"
---8<-- "autogpt_platform/frontend/src/tests/build.spec.ts:BuildPageExample"
+```typescript frontend/src/tests/build.spec.ts
+import { test } from "./fixtures";
+import { BuildPage } from "./pages/build.page";
+
+// Reason Ignore: admonishment is in the wrong place visually with correct prettier rules
+// prettier-ignore
+test.describe("Build", () => {
+ let buildPage: BuildPage;
+
+ // Reason Ignore: admonishment is in the wrong place visually with correct prettier rules
+ // prettier-ignore
+ test.beforeEach(async ({ page, loginPage, testUser }, testInfo) => {
+ buildPage = new BuildPage(page);
+
+ // Start each test with login using worker auth
+ await page.goto("/login");
+ await loginPage.login(testUser.email, testUser.password);
+ await test.expect(page).toHaveURL("/");
+ await buildPage.navbar.clickBuildLink();
+ });
+
+ // Reason Ignore: admonishment is in the wrong place visually with correct prettier rules
+ // prettier-ignore
+ test("user can add a block", async ({ page }) => {
+ // workaround for #8788
+ await buildPage.navbar.clickBuildLink();
+ await test.expect(page).toHaveURL(new RegExp("/build"));
+ await buildPage.waitForPageLoad();
+ await test.expect(buildPage.isLoaded()).resolves.toBeTruthy();
+
+ await buildPage.closeTutorial();
+ await buildPage.openBlocksPanel();
+ const block = await buildPage.getDictionaryBlockDetails();
+
+ await buildPage.addBlock(block);
+ await buildPage.closeBlocksPanel();
+ await test.expect(buildPage.hasBlock(block)).resolves.toBeTruthy();
+ });
});
```
@@ -150,11 +209,40 @@ A good test suite will have a healthy mix of focused and non-focused tests.
You can pass information between tests using the `testInfo` object. This is useful for things like passing the id of an agent between beforeAll so that you can have a shared setup for multiple tests.
-```typescript title="frontend/src/tests/monitor.spec.ts"
---8<-- "autogpt_platform/frontend/src/tests/monitor.spec.ts:AttachAgentId"
+```typescript frontend/src/tests/monitor.spec.ts
+test.describe.skip("Monitor", () => {
+ let buildPage: BuildPage;
+ let monitorPage: MonitorPage;
+
+ test.beforeEach(async ({ page, loginPage, testUser }, testInfo: TestInfo) => {
+ buildPage = new BuildPage(page);
+ monitorPage = new MonitorPage(page);
+
+ // Start each test with login using worker auth
+ await page.goto("/login");
+ await loginPage.login(testUser.email, testUser.password);
+ await test.expect(page).toHaveURL("/");
+
+ // add a test agent
+ const basicBlock = await buildPage.getDictionaryBlockDetails();
+ const id = uuidv4();
+ await buildPage.createSingleBlockAgent(
+ `test-agent-${id}`,
+ `test-agent-description-${id}`,
+ basicBlock,
+ );
+ await buildPage.runAgent();
+ await monitorPage.navbar.clickMonitorLink();
+ await monitorPage.waitForPageLoad();
+ await test.expect(monitorPage.isLoaded()).resolves.toBeTruthy();
+ testInfo.attach("agent-id", { body: id });
+ });
test("test can read the agent id", async ({ page }, testInfo) => {
- --8<-- "autogpt_platform/frontend/src/tests/monitor.spec.ts:ReadAgentId"
+ if (testInfo.attachments.length === 0 || !testInfo.attachments[0].body) {
+ throw new Error("No agent id attached to the test");
+ }
+ const id = testInfo.attachments[0].body.toString();
/// ... Do something with the agent id here
});
});
diff --git a/docs/content/platform/create-basic-agent.md b/docs/platform/create-basic-agent.mdx
similarity index 73%
rename from docs/content/platform/create-basic-agent.md
rename to docs/platform/create-basic-agent.mdx
index 7721fb9b9..e07361ceb 100644
--- a/docs/content/platform/create-basic-agent.md
+++ b/docs/platform/create-basic-agent.mdx
@@ -1,14 +1,14 @@
-# **Creating a Basic AI Agent with AutoGPT**
-
-## **Overview**
-
-This guide walks through creating a simple question-answer AI agent using AutoGPT's visual builder. This is a basic example that can be expanded into more complex agents.
+---
+title: "Creating a Basic AI Agent with AutoGPT"
+description: "This guide walks through creating a simple question-answer AI agent using AutoGPT's visual builder. This is a basic example that can be expanded into more complex agents."
+sidebarTitle: Create a Basic Agent
+---
## **Example Agent: Q&A (with AI)**
A step-by-step guide to creating a simple Q&A agent using input and output blocks.
-
+
## **Components Required**
1. Input Block
@@ -52,9 +52,10 @@ You can access the AI's response in two ways:
A step-by-step guide to creating a simple calculator agent using input and output blocks.
-
+
-##**Components Required**
+
+## **Components Required**
* Input Block (2 instances)
* Calculator Block
* Output Block
@@ -103,10 +104,18 @@ There are two ways to view the calculation results:
* Operation: Multiply
* Expected output will be shown in the results section
+
## **Tips**
+
* Always save your agent after making changes
* Verify all connections are properly made before running
* Use the "View More" option for detailed output information
+
+
+
## **Note**
-While these are basic example, you can enhance the agent with additional blocks and functionality to create more complex interactions.
\ No newline at end of file
+
+While these are basic example, you can enhance the agent with additional blocks and functionality to create more complex interactions.
+
+
diff --git a/docs/content/platform/d_id.md b/docs/platform/d_id.mdx
similarity index 88%
rename from docs/content/platform/d_id.md
rename to docs/platform/d_id.mdx
index c2d7933c9..5301fb844 100644
--- a/docs/content/platform/d_id.md
+++ b/docs/platform/d_id.mdx
@@ -1,5 +1,8 @@
-# Find available voices for D-ID
-
+---
+title: Find available voices for D-ID
+sidebarTitle: Using D-ID
+mode: wide
+---
1. **ElevenLabs**
- Select any voice from the voice list: https://api.elevenlabs.io/v1/voices
- Copy the voice_id
@@ -14,4 +17,4 @@
3. **Amazon Polly Voices**
- Select any voice from the voice list: https://docs.aws.amazon.com/polly/latest/dg/available-voices.html
- Copy the voice name / ID
- - Use it as string in the voice_id field in the CreateTalkingAvatarClip Block
\ No newline at end of file
+ - Use it as string in the voice_id field in the CreateTalkingAvatarClip Block
diff --git a/docs/content/platform/delete-agent.md b/docs/platform/delete-agent.mdx
similarity index 51%
rename from docs/content/platform/delete-agent.md
rename to docs/platform/delete-agent.mdx
index 517cb35ee..8a9ece3c0 100644
--- a/docs/content/platform/delete-agent.md
+++ b/docs/platform/delete-agent.mdx
@@ -1,10 +1,11 @@
-# **How to Delete an Agent in AutoGPT**
-
+---
+title: How to Delete an Agent in AutoGPT
+description: "Is your AutoGPT Monitor getting cluttered or did you create an agent you no longer see? Learn how to quickly delete unwanted agents."
+sidebarTitle: Delete an Agent
+---
## **Overview**
-Is your AutoGPT Monitor getting cluttered or did you create an agent you no longer see? Learn how to quickly delete unwanted agents.
-
-
+
## **Steps to Delete an Agent**
1. **Locate the Agent**
@@ -20,4 +21,6 @@ Is your AutoGPT Monitor getting cluttered or did you create an agent you no long
Once confirmed, the agent will be immediately removed from your list.
-**Note**: This action cannot be undone, so make sure you want to permanently delete the agent before confirming.
\ No newline at end of file
+
+**Note**: This action cannot be undone, so make sure you want to permanently delete the agent before confirming.
+
diff --git a/docs/content/platform/download-agent-from-marketplace-local.md b/docs/platform/download-agent-from-marketplace-local.mdx
similarity index 63%
rename from docs/content/platform/download-agent-from-marketplace-local.md
rename to docs/platform/download-agent-from-marketplace-local.mdx
index 22e212262..e49429f75 100644
--- a/docs/content/platform/download-agent-from-marketplace-local.md
+++ b/docs/platform/download-agent-from-marketplace-local.mdx
@@ -1,9 +1,12 @@
-# **How to Download and Import an Agent from the AutoGPT Marketplace (Local Hosting)**
+---
+title: "How to Download and Import an Agent from the AutoGPT Marketplace (Local Hosting)"
+description: "This guide explains how to download an agent from the AutoGPT marketplace and import it into your locally hosted instance."
+sidebarTitle: Download & Import and Agent
+---
## **Overview**
-This guide explains how to download an agent from the AutoGPT marketplace and import it into your locally hosted instance.
-
+
## **Prerequisites**
* A local installation of AutoGPT
@@ -38,4 +41,4 @@ This guide explains how to download an agent from the AutoGPT marketplace and im
## **Important Notes**
* The marketplace interface differs between local hosting and cloud-hosted versions
* Ensure you're following the local hosting specific steps
-* The agent will be available in your Builder after successful import
\ No newline at end of file
+* The agent will be available in your Builder after successful import
diff --git a/docs/content/platform/edit-agent.md b/docs/platform/edit-agent.mdx
similarity index 59%
rename from docs/content/platform/edit-agent.md
rename to docs/platform/edit-agent.mdx
index 60015b02a..82a75bbb2 100644
--- a/docs/content/platform/edit-agent.md
+++ b/docs/platform/edit-agent.mdx
@@ -1,10 +1,13 @@
-# **How to Edit an Agent in AutoGPT**
+---
+title: How to Edit an Agent in AutoGPT
+description: "This guide explains how to access and edit existing agents in AutoGPT, whether they're your own creations or downloaded from the marketplace."
+sidebarTitle: Edit an Agent
+---
## **Overview**
-This guide explains how to access and edit existing agents in AutoGPT, whether they're your own creations or downloaded from the marketplace.
-
+
## **Steps to Edit an Agent**
@@ -32,4 +35,4 @@ This guide explains how to access and edit existing agents in AutoGPT, whether t
## **Note**
* All agents can be edited, regardless of whether they were created by you or downloaded from the marketplace
-* Changes are saved to your local instance
\ No newline at end of file
+* Changes are saved to your local instance
diff --git a/docs/platform/explanation/best-practices/agent-design.mdx b/docs/platform/explanation/best-practices/agent-design.mdx
new file mode 100644
index 000000000..e69de29bb
diff --git a/docs/platform/explanation/best-practices/prompt-engineering.mdx b/docs/platform/explanation/best-practices/prompt-engineering.mdx
new file mode 100644
index 000000000..e69de29bb
diff --git a/docs/platform/explanation/best-practices/resource-management.mdx b/docs/platform/explanation/best-practices/resource-management.mdx
new file mode 100644
index 000000000..e69de29bb
diff --git a/docs/platform/explanation/best-practices/security-guidelines.mdx b/docs/platform/explanation/best-practices/security-guidelines.mdx
new file mode 100644
index 000000000..e69de29bb
diff --git a/docs/platform/explanation/concepts/agent-architecture.mdx b/docs/platform/explanation/concepts/agent-architecture.mdx
new file mode 100644
index 000000000..e69de29bb
diff --git a/docs/platform/explanation/concepts/continuous-mode.mdx b/docs/platform/explanation/concepts/continuous-mode.mdx
new file mode 100644
index 000000000..e69de29bb
diff --git a/docs/platform/explanation/concepts/memory-systems.mdx b/docs/platform/explanation/concepts/memory-systems.mdx
new file mode 100644
index 000000000..e69de29bb
diff --git a/docs/platform/explanation/concepts/task-planning.mdx b/docs/platform/explanation/concepts/task-planning.mdx
new file mode 100644
index 000000000..e69de29bb
diff --git a/docs/platform/explanation/design-decisions/architecture-choices.mdx b/docs/platform/explanation/design-decisions/architecture-choices.mdx
new file mode 100644
index 000000000..e69de29bb
diff --git a/docs/platform/explanation/design-decisions/scaling-startegy.mdx b/docs/platform/explanation/design-decisions/scaling-startegy.mdx
new file mode 100644
index 000000000..e69de29bb
diff --git a/docs/platform/explanation/design-decisions/security-model.mdx b/docs/platform/explanation/design-decisions/security-model.mdx
new file mode 100644
index 000000000..e69de29bb
diff --git a/docs/platform/getting-started.mdx b/docs/platform/getting-started.mdx
new file mode 100644
index 000000000..52d19d2a0
--- /dev/null
+++ b/docs/platform/getting-started.mdx
@@ -0,0 +1,144 @@
+---
+title: "Getting Started with AutoGPT: Self-Hosting Guide"
+description: This tutorial will walk you through the process of setting up AutoGPT locally on your machine.
+sidebarTitle: Setup AutoGPT (Local-Host)
+---
+
+
+
+## Introduction
+
+This guide will help you setup the server and builder for the project.
+
+We also offer this in video format. You can check it out [here](https://github.com/Significant-Gravitas/AutoGPT?tab=readme-ov-file#how-to-setup-for-self-hosting).
+
+
+**Warning**
+
+**DO NOT FOLLOW ANY OUTSIDE TUTORIALS AS THEY WILL LIKELY BE OUT OF DATE**
+
+
+## Prerequisites
+
+To setup the server, you need to have the following installed:
+
+
+
+
+
+
+
+#### Checking if you have Node.js & NPM installed
+
+We use Node.js to run our frontend application.
+
+If you need assistance installing Node.js: https://nodejs.org/en/download/
+
+NPM is included with Node.js, but if you need assistance installing NPM: https://docs.npmjs.com/downloading-and-installing-node-js-and-npm
+
+You can check if you have Node.js & NPM installed by running the following command:
+```bash
+node -v
+npm -v
+```
+Once you have Node.js installed, you can proceed to the next step.
+
+#### Checking if you have Docker & Docker Compose installed
+
+Docker containerizes applications, while Docker Compose orchestrates multi-container Docker applications.
+
+If you need assistance installing docker: https://docs.docker.com/desktop/
+
+Docker-compose is included in Docker Desktop, but if you need assistance installing docker compose: https://docs.docker.com/compose/install/
+
+You can check if you have Docker installed by running the following command:
+
+```bash
+docker -v
+docker-compose -v
+```
+
+Once you have Docker and Docker Compose installed, you can proceed to the next step.
+
+### Cloning the Repository
+
+The first step is cloning the AutoGPT repository to your computer. To do this, open a terminal window in a folder on your computer and run:
+
+```bash
+git clone https://github.com/Significant-Gravitas/AutoGPT.git
+```
+
+If you get stuck, follow [this guide](https://docs.github.com/en/repositories/creating-and-managing-repositories/cloning-a-repository).
+
+Once that's complete you can close this terminal window.
+
+### Running the backend services
+
+To run the backend services, follow these steps:
+
+* Within the repository, clone the submodules and navigate to the `autogpt_platform` directory:
+
+ ```bash
+ git submodule update --init --recursive
+ cd autogpt_platform
+ ```
+
+ This command will initialize and update the submodules in the repository. The `supabase` folder will be cloned to the root directory.
+
+* Copy the `.env.example` file available in the `supabase/docker` directory to `.env` in `autogpt_platform`:
+
+ ```bash
+ cp supabase/docker/.env.example .env
+ ```
+
+ This command will copy the `.env.example` file to `.env` in the `supabase/docker` directory. You can modify the `.env` file to add your own environment variables.
+
+* Run the backend services:
+
+ ```bash
+ docker compose up -d
+ ```
+
+ This command will start all the necessary backend services defined in the `docker-compose.combined.yml` file in detached mode.
+
+
+### Running the frontend application
+
+To run the frontend application, follow these steps:
+
+* Navigate to `frontend` folder within the `autogpt_platform` directory:
+
+ ```bash
+ cd frontend
+ ```
+
+* Copy the `.env.example` file available in the `frontend` directory to `.env` in the same directory:
+
+ ```bash
+ cp .env.example .env
+ ```
+
+ You can modify the `.env` within this folder to add your own environment variables for the frontend application.
+
+* Run the following command:
+
+ ```bash
+ npm install
+ npm run dev
+ ```
+
+ This command will install the necessary dependencies and start the frontend application in development mode.
+
+
+### Checking if the application is running
+
+You can check if the server is running by visiting [http://localhost:3000](http://localhost:3000) in your browser.
+
+
+**Notes:**
+
+By default the application for different services run on the following ports:
+
+Frontend UI Server: 3000 Backend Websocket Server: 8001 Execution API Rest Server: 8006
+
+
diff --git a/docs/platform/home.mdx b/docs/platform/home.mdx
new file mode 100644
index 000000000..90cb07134
--- /dev/null
+++ b/docs/platform/home.mdx
@@ -0,0 +1,87 @@
+---
+title: AutoGPT Documentation
+description: Welcome to the AutoGPT Documentation.
+sidebarTitle: Introduction
+---
+
+## What is the AutoGPT Platform?
+
+The AutoGPT Platform is a groundbreaking system that revolutionizes AI utilization for businesses and individuals. It enables the creation, deployment, and management of continuous agents that work tirelessly on your behalf, bringing unprecedented efficiency and innovation to your workflows.
+
+### Key Features
+
+* **Seamless Integration and Low-Code Workflows**: Rapidly create complex workflows without extensive coding knowledge.
+* **Autonomous Operation and Continuous Agents**: Deploy cloud-based assistants that run indefinitely, activating on relevant triggers.
+* **Intelligent Automation and Maximum Efficiency**: Streamline workflows by automating repetitive processes.
+* **Reliable Performance and Predictable Execution**: Enjoy consistent and dependable long-running processes.
+
+## Platform Architecture
+
+The AutoGPT Platform consists of two main components:
+
+### 1\. AutoGPT Server
+
+The powerhouse of our platform, containing:
+
+* **Source Code**: Core logic driving agents and automation processes.
+* **Infrastructure**: Robust systems ensuring reliable and scalable performance.
+* **Marketplace**: A comprehensive marketplace for pre-built agents.
+
+### 2\. AutoGPT Frontend
+
+The user interface where you interact with the platform:
+
+* **Agent Builder**: Design and configure your own AI agents.
+* **Workflow Management**: Build, modify, and optimize automation workflows.
+* **Deployment Controls**: Manage the lifecycle of your agents.
+* **Ready-to-Use Agents**: Select from pre-configured agents.
+* **Agent Interaction**: Run and interact with agents through a user-friendly interface.
+* **Monitoring and Analytics**: Track agent performance and gain insights.
+
+## Platform Components
+
+### Agents and Workflows
+
+In the platform, you can create highly customized workflows to build agents. An agent is essentially an automated workflow that you design to perform specific tasks or processes. Create customized workflows to build agents for various tasks, including:
+
+* Data processing and analysis
+* Task scheduling and management
+* Communication and notification systems
+* Integration between different software tools
+* AI-powered decision making and content generation
+
+### Blocks as Integrations
+
+Blocks represent actions and are the building blocks of your workflows, including:
+
+* Connections to external services
+* Data processing tools
+* AI models for various tasks
+* Custom scripts or functions
+* Conditional logic and decision-making components
+
+You can learn more under: [Build your own Blocks](platform/new_blocks/)
+
+## Available Language Models
+
+The platform comes pre-integrated with cutting-edge LLM providers:
+
+* OpenAI
+* Anthropic
+* Groq
+* Llama
+
+## License Overview
+
+We've adopted a dual-license approach to balance open collaboration with sustainable development:
+
+* **MIT License**: The majority of the AutoGPT repository remains under this license.
+* **Polyform Shield License**: Applies to the new `autogpt_platform` folder.
+
+This strategy allows us to share previously closed-source components, fostering a vibrant ecosystem of developers and users.
+
+## Ready to Get Started?
+
+* Read the [Getting Started docs](/platform/getting-started/) to self-host
+* [Join the waitlist](https://agpt.co/waitlist) for the cloud-hosted beta
+* [Contribute](contribute/)
diff --git a/docs/platform/how-to-guides/cloud-platform/billing-&-usage.mdx b/docs/platform/how-to-guides/cloud-platform/billing-&-usage.mdx
new file mode 100644
index 000000000..e69de29bb
diff --git a/docs/platform/how-to-guides/cloud-platform/managing-agents.mdx b/docs/platform/how-to-guides/cloud-platform/managing-agents.mdx
new file mode 100644
index 000000000..e69de29bb
diff --git a/docs/platform/how-to-guides/cloud-platform/monitoring-&-logging.mdx b/docs/platform/how-to-guides/cloud-platform/monitoring-&-logging.mdx
new file mode 100644
index 000000000..e69de29bb
diff --git a/docs/platform/how-to-guides/cloud-platform/scaling-resources.mdx b/docs/platform/how-to-guides/cloud-platform/scaling-resources.mdx
new file mode 100644
index 000000000..e69de29bb
diff --git a/docs/platform/how-to-guides/cloud-platform/user-management.mdx b/docs/platform/how-to-guides/cloud-platform/user-management.mdx
new file mode 100644
index 000000000..e69de29bb
diff --git a/docs/platform/how-to-guides/common-tasks/api-integration.mdx b/docs/platform/how-to-guides/common-tasks/api-integration.mdx
new file mode 100644
index 000000000..e69de29bb
diff --git a/docs/platform/how-to-guides/common-tasks/blocks-development.mdx b/docs/platform/how-to-guides/common-tasks/blocks-development.mdx
new file mode 100644
index 000000000..e69de29bb
diff --git a/docs/platform/how-to-guides/common-tasks/custom-prompts.mdx b/docs/platform/how-to-guides/common-tasks/custom-prompts.mdx
new file mode 100644
index 000000000..e69de29bb
diff --git a/docs/platform/how-to-guides/common-tasks/memory-management.mdx b/docs/platform/how-to-guides/common-tasks/memory-management.mdx
new file mode 100644
index 000000000..e69de29bb
diff --git a/docs/platform/how-to-guides/common-tasks/working-with-tasks.mdx b/docs/platform/how-to-guides/common-tasks/working-with-tasks.mdx
new file mode 100644
index 000000000..e69de29bb
diff --git a/docs/platform/how-to-guides/self-hosted/backup-&-recovery.mdx b/docs/platform/how-to-guides/self-hosted/backup-&-recovery.mdx
new file mode 100644
index 000000000..e69de29bb
diff --git a/docs/platform/how-to-guides/self-hosted/custom-integrations.mdx b/docs/platform/how-to-guides/self-hosted/custom-integrations.mdx
new file mode 100644
index 000000000..e69de29bb
diff --git a/docs/platform/how-to-guides/self-hosted/deploymnent-strategies.mdx b/docs/platform/how-to-guides/self-hosted/deploymnent-strategies.mdx
new file mode 100644
index 000000000..e69de29bb
diff --git a/docs/platform/how-to-guides/self-hosted/migration-guide.mdx b/docs/platform/how-to-guides/self-hosted/migration-guide.mdx
new file mode 100644
index 000000000..e69de29bb
diff --git a/docs/platform/how-to-guides/self-hosted/performance-tuning.mdx b/docs/platform/how-to-guides/self-hosted/performance-tuning.mdx
new file mode 100644
index 000000000..e69de29bb
diff --git a/docs/platform/new_blocks.mdx b/docs/platform/new_blocks.mdx
new file mode 100644
index 000000000..a620218fa
--- /dev/null
+++ b/docs/platform/new_blocks.mdx
@@ -0,0 +1,1442 @@
+---
+title: "Contributing to AutoGPT Agent Server: Creating and Testing Blocks"
+description: This guide will walk you through the process of creating and testing a new block for the AutoGPT Agent Server, using the WikipediaSummaryBlock as an example.
+sidebarTitle: Build your own Blocks
+---
+
+## Understanding Blocks and Testing
+
+Blocks are reusable components that can be connected to form a graph representing an agent's behavior. Each block has inputs, outputs, and a specific function. Proper testing is crucial to ensure blocks work correctly and consistently.
+
+## Creating and Testing a New Block
+
+Follow these steps to create and test a new block:
+
+1. **Create a new Python file** for your block in the `autogpt_platform/backend/backend/blocks` directory. Name it descriptively and use snake_case. For example: `get_wikipedia_summary.py`.
+
+2. **Import necessary modules and create a class that inherits from `Block`**. Make sure to include all necessary imports for your block.
+
+ Every block should contain the following:
+
+ ```python
+ from backend.data.block import Block, BlockSchema, BlockOutput
+ ```
+
+ Example for the Wikipedia summary block:
+
+ ```python
+ from backend.data.block import Block, BlockSchema, BlockOutput
+ from backend.utils.get_request import GetRequest
+ import requests
+
+ class WikipediaSummaryBlock(Block, GetRequest):
+ # Block implementation will go here
+ ```
+
+3. **Define the input and output schemas** using `BlockSchema`. These schemas specify the data structure that the block expects to receive (input) and produce (output).
+
+ - The input schema defines the structure of the data the block will process. Each field in the schema represents a required piece of input data.
+ - The output schema defines the structure of the data the block will return after processing. Each field in the schema represents a piece of output data.
+
+ Example:
+
+ ```python
+ class Input(BlockSchema):
+ topic: str # The topic to get the Wikipedia summary for
+
+ class Output(BlockSchema):
+ summary: str # The summary of the topic from Wikipedia
+ error: str # Any error message if the request fails, error field needs to be named `error`.
+ ```
+
+4. **Implement the `__init__` method, including test data and mocks:**
+
+ !!! important
+ Use UUID generator (e.g. https://www.uuidgenerator.net/) for every new block `id` and *do not* make up your own. Alternatively, you can run this python code to generate an uuid: `print(__import__('uuid').uuid4())`
+
+ ```python
+ def __init__(self):
+ super().__init__(
+ # Unique ID for the block, used across users for templates
+ # If you are an AI leave it as is or change to "generate-proper-uuid"
+ id="xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
+ input_schema=WikipediaSummaryBlock.Input, # Assign input schema
+ output_schema=WikipediaSummaryBlock.Output, # Assign output schema
+
+ # Provide sample input, output and test mock for testing the block
+
+ test_input={"topic": "Artificial Intelligence"},
+ test_output=("summary", "summary content"),
+ test_mock={"get_request": lambda url, json: {"extract": "summary content"}},
+ )
+ ```
+
+ - `id`: A unique identifier for the block.
+
+ - `input_schema` and `output_schema`: Define the structure of the input and output data.
+
+ Let's break down the testing components:
+
+ - `test_input`: This is a sample input that will be used to test the block. It should be a valid input according to your Input schema.
+
+ - `test_output`: This is the expected output when running the block with the `test_input`. It should match your Output schema. For non-deterministic outputs or when you only want to assert the type, you can use Python types instead of specific values. In this example, `("summary", str)` asserts that the output key is "summary" and its value is a string.
+
+ - `test_mock`: This is crucial for blocks that make network calls. It provides a mock function that replaces the actual network call during testing.
+
+ In this case, we're mocking the `get_request` method to always return a dictionary with an 'extract' key, simulating a successful API response. This allows us to test the block's logic without making actual network requests, which could be slow, unreliable, or rate-limited.
+
+5. **Implement the `run` method with error handling.** This should contain the main logic of the block:
+
+ ```python
+ def run(self, input_data: Input, **kwargs) -> BlockOutput:
+ try:
+ topic = input_data.topic
+ url = f"https://en.wikipedia.org/api/rest_v1/page/summary/{topic}"
+
+ response = self.get_request(url, json=True)
+ yield "summary", response['extract']
+
+ except requests.exceptions.HTTPError as http_err:
+ raise RuntimeError(f"HTTP error occurred: {http_err}")
+ ```
+
+ - **Try block**: Contains the main logic to fetch and process the Wikipedia summary.
+ - **API request**: Send a GET request to the Wikipedia API.
+ - **Error handling**: Handle various exceptions that might occur during the API request and data processing. We don't need to catch all exceptions, only the ones we expect and can handle. The uncaught exceptions will be automatically yielded as `error` in the output. Any block that raises an exception (or yields an `error` output) will be marked as failed. Prefer raising exceptions over yielding `error`, as it will stop the execution immediately.
+ - **Yield**: Use `yield` to output the results. Prefer to output one result object at a time. If you are calling a function that returns a list, you can yield each item in the list separately. You can also yield the whole list as well, but do both rather than yielding the list. For example: If you were writing a block that outputs emails, you'd yield each email as a separate result object, but you could also yield the whole list as an additional single result object. Yielding output named `error` will break the execution right away and mark the block execution as failed.
+
+6. * **Implement the `__init__` method, including test data and mocks:**
+
+
+**Important**
+
+Use UUID generator (e.g. https://www.uuidgenerator.net/) for every new block `id` and _do not_ make up your own. Alternatively, you can run this python code to generate an uuid: `print(__import__('uuid').uuid4())`
+
+
+```py
+def __init__(self):
+ super().__init__(
+ # Unique ID for the block, used across users for templates
+ # If you are an AI leave it as is or change to "generate-proper-uuid"
+ id="xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
+ input_schema=WikipediaSummaryBlock.Input, # Assign input schema
+ output_schema=WikipediaSummaryBlock.Output, # Assign output schema
+
+ # Provide sample input, output and test mock for testing the block
+
+ test_input={"topic": "Artificial Intelligence"},
+ test_output=("summary", "summary content"),
+ test_mock={"get_request": lambda url, json: {"extract": "summary content"}},
+ )
+```
+
+ * `id`: A unique identifier for the block.
+
+ * `input_schema` and `output_schema`: Define the structure of the input and output data.
+
+
+ Let's break down the testing components:
+
+ * `test_input`: This is a sample input that will be used to test the block. It should be a valid input according to your Input schema.
+
+ * `test_output`: This is the expected output when running the block with the `test_input`. It should match your Output schema. For non-deterministic outputs or when you only want to assert the type, you can use Python types instead of specific values. In this example, `("summary", str)` asserts that the output key is "summary" and its value is a string.
+
+ * `test_mock`: This is crucial for blocks that make network calls. It provides a mock function that replaces the actual network call during testing.
+
+
+ In this case, we're mocking the `get_request` method to always return a dictionary with an 'extract' key, simulating a successful API response. This allows us to test the block's logic without making actual network requests, which could be slow, unreliable, or rate-limited.
+7. **Implement the `run` method with error handling.** This should contain the main logic of the block:
+
+
+```py
+def run(self, input_data: Input, **kwargs) -> BlockOutput:
+ try:
+ topic = input_data.topic
+ url = f"https://en.wikipedia.org/api/rest_v1/page/summary/{topic}"
+
+ response = self.get_request(url, json=True)
+ yield "summary", response['extract']
+
+ except requests.exceptions.HTTPError as http_err:
+ raise RuntimeError(f"HTTP error occurred: {http_err}")
+```
+
+* **Try block**: Contains the main logic to fetch and process the Wikipedia summary.
+* **API request**: Send a GET request to the Wikipedia API.
+* **Error handling**: Handle various exceptions that might occur during the API request and data processing. We don't need to catch all exceptions, only the ones we expect and can handle. The uncaught exceptions will be automatically yielded as `error` in the output. Any block that raises an exception (or yields an `error` output) will be marked as failed. Prefer raising exceptions over yielding `error`, as it will stop the execution immediately.
+* **Yield**: Use `yield` to output the results. Prefer to output one result object at a time. If you are calling a function that returns a list, you can yield each item in the list separately. You can also yield the whole list as well, but do both rather than yielding the list. For example: If you were writing a block that outputs emails, you'd yield each email as a separate result object, but you could also yield the whole list as an additional single result object. Yielding output named `error` will break the execution right away and mark the block execution as failed.
+
+### Blocks with authentication
+
+Our system supports auth offloading for API keys and OAuth2 authorization flows.
+Adding a block with API key authentication is straight-forward, as is adding a block
+for a service that we already have OAuth2 support for.
+
+Implementing the block itself is relatively simple. On top of the instructions above,
+you're going to add a `credentials` parameter to the `Input` model and the `run` method:
+
+```python
+from backend.data.model import (
+ APIKeyCredentials,
+ OAuth2Credentials,
+ Credentials,
+)
+
+from backend.data.block import Block, BlockOutput, BlockSchema
+from backend.data.model import CredentialsField
+from backend.integrations.providers import ProviderName
+
+
+# API Key auth:
+class BlockWithAPIKeyAuth(Block):
+ class Input(BlockSchema):
+ # Note that the type hint below is require or you will get a type error.
+ # The first argument is the provider name, the second is the credential type.
+ credentials: CredentialsMetaInput[
+ Literal[ProviderName.GITHUB], Literal["api_key"]
+ ] = CredentialsField(
+ description="The GitHub integration can be used with "
+ "any API key with sufficient permissions for the blocks it is used on.",
+ )
+
+ # ...
+
+ def run(
+ self,
+ input_data: Input,
+ *,
+ credentials: APIKeyCredentials,
+ **kwargs,
+ ) -> BlockOutput:
+ ...
+
+# OAuth:
+class BlockWithOAuth(Block):
+ class Input(BlockSchema):
+ # Note that the type hint below is require or you will get a type error.
+ # The first argument is the provider name, the second is the credential type.
+ credentials: CredentialsMetaInput[
+ Literal[ProviderName.GITHUB], Literal["oauth2"]
+ ] = CredentialsField(
+ required_scopes={"repo"},
+ description="The GitHub integration can be used with OAuth.",
+ )
+
+ # ...
+
+ def run(
+ self,
+ input_data: Input,
+ *,
+ credentials: OAuth2Credentials,
+ **kwargs,
+ ) -> BlockOutput:
+ ...
+
+# API Key auth + OAuth:
+class BlockWithAPIKeyAndOAuth(Block):
+ class Input(BlockSchema):
+ # Note that the type hint below is require or you will get a type error.
+ # The first argument is the provider name, the second is the credential type.
+ credentials: CredentialsMetaInput[
+ Literal[ProviderName.GITHUB], Literal["api_key", "oauth2"]
+ ] = CredentialsField(
+ required_scopes={"repo"},
+ description="The GitHub integration can be used with OAuth, "
+ "or any API key with sufficient permissions for the blocks it is used on.",
+ )
+
+ # ...
+
+ def run(
+ self,
+ input_data: Input,
+ *,
+ credentials: Credentials,
+ **kwargs,
+ ) -> BlockOutput:
+ ...
+```
+
+The credentials will be automagically injected by the executor in the back end.
+
+The `APIKeyCredentials` and `OAuth2Credentials` models are defined [here](https://github.com/Significant-Gravitas/AutoGPT/blob/master/autogpt_platform/autogpt_libs/autogpt_libs/supabase_integration_credentials_store/types.py).
+To use them in e.g. an API request, you can either access the token directly:
+
+```python
+# credentials: APIKeyCredentials
+response = requests.post(
+ url,
+ headers={
+ "Authorization": f"Bearer {credentials.api_key.get_secret_value()})",
+ },
+)
+
+# credentials: OAuth2Credentials
+response = requests.post(
+ url,
+ headers={
+ "Authorization": f"Bearer {credentials.access_token.get_secret_value()})",
+ },
+)
+```
+
+or use the shortcut `credentials.bearer()`:
+
+```python
+# credentials: APIKeyCredentials | OAuth2Credentials
+response = requests.post(
+ url,
+ headers={"Authorization": credentials.bearer()},
+)
+```
+
+The `ProviderName` enum is the single source of truth for which providers exist in our system.
+Naturally, to add an authenticated block for a new provider, you'll have to add it here too.
+
+
+```py backend/integrations/providers.py
+
+class ProviderName(str, Enum):
+ ANTHROPIC = "anthropic"
+ COMPASS = "compass"
+ DISCORD = "discord"
+ D_ID = "d_id"
+ E2B = "e2b"
+ EXA = "exa"
+ FAL = "fal"
+ GITHUB = "github"
+ GOOGLE = "google"
+ GOOGLE_MAPS = "google_maps"
+ GROQ = "groq"
+ HUBSPOT = "hubspot"
+ IDEOGRAM = "ideogram"
+ JINA = "jina"
+ MEDIUM = "medium"
+ NOTION = "notion"
+ OLLAMA = "ollama"
+ OPENAI = "openai"
+ OPENWEATHERMAP = "openweathermap"
+ OPEN_ROUTER = "open_router"
+ PINECONE = "pinecone"
+ REPLICATE = "replicate"
+ REVID = "revid"
+ SLANT3D = "slant3d"
+ UNREAL_SPEECH = "unreal_speech"
+```
+
+
+
+#### Adding an OAuth2 service integration
+
+To add support for a new OAuth2-authenticated service, you'll need to add an `OAuthHandler`.
+All our existing handlers and the base class can be found [here][OAuth2 handlers].
+
+Every handler must implement the following parts of the [`BaseOAuthHandler`] interface:
+
+```python backend/integrations/oauth/base.py
+PROVIDER_NAME: ClassVar[ProviderName]
+DEFAULT_SCOPES: ClassVar[list[str]] = []
+def __init__(self, client_id: str, client_secret: str, redirect_uri: str): ...
+
+def get_login_url(self, scopes: list[str], state: str) -> str:
+def exchange_code_for_tokens(
+ self, code: str, scopes: list[str]
+) -> OAuth2Credentials:
+def _refresh_tokens(self, credentials: OAuth2Credentials) -> OAuth2Credentials:
+def revoke_tokens(self, credentials: OAuth2Credentials) -> bool:
+```
+
+As you can see, this is modeled after the standard OAuth2 flow.
+
+Aside from implementing the `OAuthHandler` itself, adding a handler into the system requires two more things:
+
+- Adding the handler class to `HANDLERS_BY_NAME` under [`integrations/oauth/__init__.py`](https://github.com/Significant-Gravitas/AutoGPT/blob/master/autogpt_platform/backend/backend/integrations/oauth/__init__.py)
+
+```python backend/integrations/oauth/__init__.py
+HANDLERS_BY_NAME: dict["ProviderName", type["BaseOAuthHandler"]] = {
+ handler.PROVIDER_NAME: handler
+ for handler in [
+ GitHubOAuthHandler,
+ GoogleOAuthHandler,
+ NotionOAuthHandler,
+ ]
+}
+```
+
+- Adding `{provider}_client_id` and `{provider}_client_secret` to the application's `Secrets` under [`util/settings.py`](https://github.com/Significant-Gravitas/AutoGPT/blob/master/autogpt_platform/backend/backend/util/settings.py)
+
+```python backend/util/settings.py
+github_client_id: str = Field(default="", description="GitHub OAuth client ID")
+github_client_secret: str = Field(
+ default="", description="GitHub OAuth client secret"
+)
+```
+
+[OAuth2 handlers]: https://github.com/Significant-Gravitas/AutoGPT/tree/master/autogpt_platform/backend/backend/integrations/oauth
+[`BaseOAuthHandler`]: https://github.com/Significant-Gravitas/AutoGPT/blob/master/autogpt_platform/backend/backend/integrations/oauth/base.py
+
+#### Adding to the frontend
+
+You will need to add the provider (api or oauth) to the `CredentialsInput` component in [`frontend/src/components/integrations/credentials-input.tsx`](https://github.com/Significant-Gravitas/AutoGPT/blob/master/autogpt_platform/frontend/src/components/integrations/credentials-input.tsx).
+
+```ts frontend/src/components/integrations/credentials-input
+export const providerIcons: Record<
+ CredentialsProviderName,
+ React.FC<{ className?: string }>
+> = {
+ anthropic: fallbackIcon,
+ e2b: fallbackIcon,
+ github: FaGithub,
+ google: FaGoogle,
+ groq: fallbackIcon,
+ notion: NotionLogoIcon,
+ discord: FaDiscord,
+ d_id: fallbackIcon,
+ google_maps: FaGoogle,
+ jina: fallbackIcon,
+ ideogram: fallbackIcon,
+ medium: FaMedium,
+ ollama: fallbackIcon,
+ openai: fallbackIcon,
+ openweathermap: fallbackIcon,
+ open_router: fallbackIcon,
+ pinecone: fallbackIcon,
+ slant3d: fallbackIcon,
+ replicate: fallbackIcon,
+ fal: fallbackIcon,
+ revid: fallbackIcon,
+ unreal_speech: fallbackIcon,
+ exa: fallbackIcon,
+ hubspot: fallbackIcon,
+};
+```
+
+You will also need to add the provider to the `CredentialsProvider` component in [`frontend/src/components/integrations/credentials-provider.tsx`](https://github.com/Significant-Gravitas/AutoGPT/blob/master/autogpt_platform/frontend/src/components/integrations/credentials-provider.tsx).
+
+```ts frontend/src/components/integrations/credentials-provider.tsx
+const providerDisplayNames: Record = {
+ anthropic: "Anthropic",
+ discord: "Discord",
+ d_id: "D-ID",
+ e2b: "E2B",
+ github: "GitHub",
+ google: "Google",
+ google_maps: "Google Maps",
+ groq: "Groq",
+ ideogram: "Ideogram",
+ jina: "Jina",
+ medium: "Medium",
+ notion: "Notion",
+ ollama: "Ollama",
+ openai: "OpenAI",
+ openweathermap: "OpenWeatherMap",
+ open_router: "Open Router",
+ pinecone: "Pinecone",
+ slant3d: "Slant3D",
+ replicate: "Replicate",
+ fal: "FAL",
+ revid: "Rev.ID",
+ unreal_speech: "Unreal Speech",
+ exa: "Exa",
+ hubspot: "Hubspot",
+} as const;
+```
+
+Finally you will need to add the provider to the `CredentialsType` enum in [`frontend/src/lib/autogpt-server-api/types.ts`](https://github.com/Significant-Gravitas/AutoGPT/blob/master/autogpt_platform/frontend/src/lib/autogpt-server-api/types.ts).
+
+```ts frontend/src/lib/autogpt-server-api/types.ts
+export const PROVIDER_NAMES = {
+ ANTHROPIC: "anthropic",
+ D_ID: "d_id",
+ DISCORD: "discord",
+ E2B: "e2b",
+ GITHUB: "github",
+ GOOGLE: "google",
+ GOOGLE_MAPS: "google_maps",
+ GROQ: "groq",
+ IDEOGRAM: "ideogram",
+ JINA: "jina",
+ MEDIUM: "medium",
+ NOTION: "notion",
+ OLLAMA: "ollama",
+ OPENAI: "openai",
+ OPENWEATHERMAP: "openweathermap",
+ OPEN_ROUTER: "open_router",
+ PINECONE: "pinecone",
+ SLANT3D: "slant3d",
+ REPLICATE: "replicate",
+ FAL: "fal",
+ REVID: "revid",
+ UNREAL_SPEECH: "unreal_speech",
+ EXA: "exa",
+ HUBSPOT: "hubspot",
+} as const;
+```
+
+#### Example: GitHub integration
+
+- GitHub blocks with API key + OAuth2 support: [`blocks/github`](https://github.com/Significant-Gravitas/AutoGPT/tree/master/autogpt_platform/backend/backend/blocks/github/)
+
+```python backend/blocks/github/issues.py
+class GithubCommentBlock(Block):
+ class Input(BlockSchema):
+ credentials: GithubCredentialsInput = GithubCredentialsField("repo")
+ issue_url: str = SchemaField(
+ description="URL of the GitHub issue or pull request",
+ placeholder="https://github.com/owner/repo/issues/1",
+ )
+ comment: str = SchemaField(
+ description="Comment to post on the issue or pull request",
+ placeholder="Enter your comment",
+ )
+
+ class Output(BlockSchema):
+ id: int = SchemaField(description="ID of the created comment")
+ url: str = SchemaField(description="URL to the comment on GitHub")
+ error: str = SchemaField(
+ description="Error message if the comment posting failed"
+ )
+
+ def __init__(self):
+ super().__init__(
+ id="a8db4d8d-db1c-4a25-a1b0-416a8c33602b",
+ description="This block posts a comment on a specified GitHub issue or pull request.",
+ categories={BlockCategory.DEVELOPER_TOOLS},
+ input_schema=GithubCommentBlock.Input,
+ output_schema=GithubCommentBlock.Output,
+ test_input=[
+ {
+ "issue_url": "https://github.com/owner/repo/issues/1",
+ "comment": "This is a test comment.",
+ "credentials": TEST_CREDENTIALS_INPUT,
+ },
+ {
+ "issue_url": "https://github.com/owner/repo/pull/1",
+ "comment": "This is a test comment.",
+ "credentials": TEST_CREDENTIALS_INPUT,
+ },
+ ],
+ test_credentials=TEST_CREDENTIALS,
+ test_output=[
+ ("id", 1337),
+ ("url", "https://github.com/owner/repo/issues/1#issuecomment-1337"),
+ ("id", 1337),
+ (
+ "url",
+ "https://github.com/owner/repo/issues/1#issuecomment-1337",
+ ),
+ ],
+ test_mock={
+ "post_comment": lambda *args, **kwargs: (
+ 1337,
+ "https://github.com/owner/repo/issues/1#issuecomment-1337",
+ )
+ },
+ )
+
+ @staticmethod
+ def post_comment(
+ credentials: GithubCredentials, issue_url: str, body_text: str
+ ) -> tuple[int, str]:
+ api = get_api(credentials)
+ data = {"body": body_text}
+ if "pull" in issue_url:
+ issue_url = issue_url.replace("pull", "issues")
+ comments_url = issue_url + "/comments"
+ response = api.post(comments_url, json=data)
+ comment = response.json()
+ return comment["id"], comment["html_url"]
+
+ def run(
+ self,
+ input_data: Input,
+ *,
+ credentials: GithubCredentials,
+ **kwargs,
+ ) -> BlockOutput:
+ id, url = self.post_comment(
+ credentials,
+ input_data.issue_url,
+ input_data.comment,
+ )
+ yield "id", id
+ yield "url", url
+```
+
+- GitHub OAuth2 handler: [`integrations/oauth/github.py`](https://github.com/Significant-Gravitas/AutoGPT/blob/master/autogpt_platform/backend/backend/integrations/oauth/github.py)
+
+```python backend/integrations/oauth/github.py
+class GitHubOAuthHandler(BaseOAuthHandler):
+ """
+ Based on the documentation at:
+ - [Authorizing OAuth apps - GitHub Docs](https://docs.github.com/en/apps/oauth-apps/building-oauth-apps/authorizing-oauth-apps)
+ - [Refreshing user access tokens - GitHub Docs](https://docs.github.com/en/apps/creating-github-apps/authenticating-with-a-github-app/refreshing-user-access-tokens)
+
+ Notes:
+ - By default, token expiration is disabled on GitHub Apps. This means the access
+ token doesn't expire and no refresh token is returned by the authorization flow.
+ - When token expiration gets enabled, any existing tokens will remain non-expiring.
+ - When token expiration gets disabled, token refreshes will return a non-expiring
+ access token *with no refresh token*.
+ """ # noqa
+
+ PROVIDER_NAME = ProviderName.GITHUB
+
+ def __init__(self, client_id: str, client_secret: str, redirect_uri: str):
+ self.client_id = client_id
+ self.client_secret = client_secret
+ self.redirect_uri = redirect_uri
+ self.auth_base_url = "https://github.com/login/oauth/authorize"
+ self.token_url = "https://github.com/login/oauth/access_token"
+ self.revoke_url = "https://api.github.com/applications/{client_id}/token"
+
+ def get_login_url(self, scopes: list[str], state: str) -> str:
+ params = {
+ "client_id": self.client_id,
+ "redirect_uri": self.redirect_uri,
+ "scope": " ".join(scopes),
+ "state": state,
+ }
+ return f"{self.auth_base_url}?{urlencode(params)}"
+
+ def exchange_code_for_tokens(
+ self, code: str, scopes: list[str]
+ ) -> OAuth2Credentials:
+ return self._request_tokens({"code": code, "redirect_uri": self.redirect_uri})
+
+ def revoke_tokens(self, credentials: OAuth2Credentials) -> bool:
+ if not credentials.access_token:
+ raise ValueError("No access token to revoke")
+
+ headers = {
+ "Accept": "application/vnd.github+json",
+ "X-GitHub-Api-Version": "2022-11-28",
+ }
+
+ requests.delete(
+ url=self.revoke_url.format(client_id=self.client_id),
+ auth=(self.client_id, self.client_secret),
+ headers=headers,
+ json={"access_token": credentials.access_token.get_secret_value()},
+ )
+ return True
+
+ def _refresh_tokens(self, credentials: OAuth2Credentials) -> OAuth2Credentials:
+ if not credentials.refresh_token:
+ return credentials
+
+ return self._request_tokens(
+ {
+ "refresh_token": credentials.refresh_token.get_secret_value(),
+ "grant_type": "refresh_token",
+ }
+ )
+
+ def _request_tokens(
+ self,
+ params: dict[str, str],
+ current_credentials: Optional[OAuth2Credentials] = None,
+ ) -> OAuth2Credentials:
+ request_body = {
+ "client_id": self.client_id,
+ "client_secret": self.client_secret,
+ **params,
+ }
+ headers = {"Accept": "application/json"}
+ response = requests.post(self.token_url, data=request_body, headers=headers)
+ token_data: dict = response.json()
+
+ username = self._request_username(token_data["access_token"])
+
+ now = int(time.time())
+ new_credentials = OAuth2Credentials(
+ provider=self.PROVIDER_NAME,
+ title=current_credentials.title if current_credentials else None,
+ username=username,
+ access_token=token_data["access_token"],
+ # Token refresh responses have an empty `scope` property (see docs),
+ # so we have to get the scope from the existing credentials object.
+ scopes=(
+ token_data.get("scope", "").split(",")
+ or (current_credentials.scopes if current_credentials else [])
+ ),
+ # Refresh token and expiration intervals are only given if token expiration
+ # is enabled in the GitHub App's settings.
+ refresh_token=token_data.get("refresh_token"),
+ access_token_expires_at=(
+ now + expires_in
+ if (expires_in := token_data.get("expires_in", None))
+ else None
+ ),
+ refresh_token_expires_at=(
+ now + expires_in
+ if (expires_in := token_data.get("refresh_token_expires_in", None))
+ else None
+ ),
+ )
+ if current_credentials:
+ new_credentials.id = current_credentials.id
+ return new_credentials
+
+ def _request_username(self, access_token: str) -> str | None:
+ url = "https://api.github.com/user"
+ headers = {
+ "Accept": "application/vnd.github+json",
+ "Authorization": f"Bearer {access_token}",
+ "X-GitHub-Api-Version": "2022-11-28",
+ }
+
+ response = requests.get(url, headers=headers)
+
+ if not response.ok:
+ return None
+
+ # Get the login (username)
+ return response.json().get("login")
+```
+
+#### Example: Google integration
+
+- Google OAuth2 handler: [`integrations/oauth/google.py`](https://github.com/Significant-Gravitas/AutoGPT/blob/master/autogpt_platform/backend/backend/integrations/oauth/google.py)
+
+```python backend/integrations/oauth/google.py
+class GoogleOAuthHandler(BaseOAuthHandler):
+ """
+ Based on the documentation at https://developers.google.com/identity/protocols/oauth2/web-server
+ """ # noqa
+
+ PROVIDER_NAME = ProviderName.GOOGLE
+ EMAIL_ENDPOINT = "https://www.googleapis.com/oauth2/v2/userinfo"
+ DEFAULT_SCOPES = [
+ "https://www.googleapis.com/auth/userinfo.email",
+ "https://www.googleapis.com/auth/userinfo.profile",
+ "openid",
+ ]
+```
+
+You can see that google has defined a `DEFAULT_SCOPES` variable, this is used to set the scopes that are requested no matter what the user asks for.
+
+```python backend/blocks/google/_auth.py
+secrets = Secrets()
+GOOGLE_OAUTH_IS_CONFIGURED = bool(
+ secrets.google_client_id and secrets.google_client_secret
+)
+```
+
+You can also see that `GOOGLE_OAUTH_IS_CONFIGURED` is used to disable the blocks that require OAuth if the oauth is not configured. This is in the `__init__` method of each block. This is because there is no api key fallback for google blocks so we need to make sure that the oauth is configured before we allow the user to use the blocks.
+
+### Webhook-triggered Blocks
+
+Webhook-triggered blocks allow your agent to respond to external events in real-time.
+These blocks are triggered by incoming webhooks from third-party services
+rather than being executed manually.
+
+Creating and running a webhook-triggered block involves three main components:
+
+- The block itself, which specifies:
+ - Inputs for the user to select a resource and events to subscribe to
+ - A `credentials` input with the scopes needed to manage webhooks
+ - Logic to turn the webhook payload into outputs for the webhook block
+- The `WebhooksManager` for the corresponding webhook service provider, which handles:
+ - (De)registering webhooks with the provider
+ - Parsing and validating incoming webhook payloads
+- The credentials system for the corresponding service provider, which may include an `OAuthHandler`
+
+There is more going on under the hood, e.g. to store and retrieve webhooks and their
+links to nodes, but to add a webhook-triggered block you shouldn't need to make changes
+to those parts of the system.
+
+#### Creating a Webhook-triggered Block
+
+To create a webhook-triggered block, follow these additional steps on top of the basic block creation process:
+
+1. **Define `webhook_config`** in your block's `__init__` method.
+
+ ```python title="backend/blocks/github/triggers.py"
+ webhook_config=BlockWebhookConfig(
+ provider="github",
+ webhook_type=GithubWebhookType.REPO,
+ resource_format="{repo}",
+ event_filter_input="events",
+ event_format="pull_request.{event}",
+ ),
+ ```
+
+
+
+ ```python title="backend/data/block.py"
+ class BlockManualWebhookConfig(BaseModel):
+ """
+ Configuration model for webhook-triggered blocks on which
+ the user has to manually set up the webhook at the provider.
+ """
+
+ provider: str
+ """The service provider that the webhook connects to"""
+
+ webhook_type: str
+ """
+ Identifier for the webhook type. E.g. GitHub has repo and organization level hooks.
+
+ Only for use in the corresponding `WebhooksManager`.
+ """
+
+ event_filter_input: str = ""
+ """
+ Name of the block's event filter input.
+ Leave empty if the corresponding webhook doesn't have distinct event/payload types.
+ """
+
+ event_format: str = "{event}"
+ """
+ Template string for the event(s) that a block instance subscribes to.
+ Applied individually to each event selected in the event filter input.
+
+ Example: `"pull_request.{event}"` -> `"pull_request.opened"`
+ """
+
+
+ class BlockWebhookConfig(BlockManualWebhookConfig):
+ """
+ Configuration model for webhook-triggered blocks for which
+ the webhook can be automatically set up through the provider's API.
+ """
+
+ resource_format: str
+ """
+ Template string for the resource that a block instance subscribes to.
+ Fields will be filled from the block's inputs (except `payload`).
+
+ Example: `f"{repo}/pull_requests"` (note: not how it's actually implemented)
+
+ Only for use in the corresponding `WebhooksManager`.
+ """
+ ```
+
+
+2. **Define event filter input** in your block's Input schema.
+ This allows the user to select which specific types of events will trigger the block in their agent.
+
+ ```python backend/blocks/github/triggers.py
+ class Input(GitHubTriggerBase.Input):
+ class EventsFilter(BaseModel):
+ """
+ https://docs.github.com/en/webhooks/webhook-events-and-payloads#pull_request
+ """
+
+ opened: bool = False
+ edited: bool = False
+ closed: bool = False
+ reopened: bool = False
+ synchronize: bool = False
+ assigned: bool = False
+ unassigned: bool = False
+ labeled: bool = False
+ unlabeled: bool = False
+ converted_to_draft: bool = False
+ locked: bool = False
+ unlocked: bool = False
+ enqueued: bool = False
+ dequeued: bool = False
+ milestoned: bool = False
+ demilestoned: bool = False
+ ready_for_review: bool = False
+ review_requested: bool = False
+ review_request_removed: bool = False
+ auto_merge_enabled: bool = False
+ auto_merge_disabled: bool = False
+
+ events: EventsFilter = SchemaField(
+ title="Events", description="The events to subscribe to"
+ )
+ ```
+
+
+ - The name of the input field (`events` in this case) must match `webhook_config.event_filter_input`.
+ - The event filter itself must be a Pydantic model with only boolean fields.
+
+4. **Include payload field** in your block's Input schema.
+
+
+ ```python title="backend/blocks/github/triggers.py"
+ payload: dict = SchemaField(hidden=True, default={})
+ ```
+
+
+5. **Define `credentials` input** in your block's Input schema.
+ - Its scopes must be sufficient to manage a user's webhooks through the provider's API
+ - See [Blocks with authentication](#blocks-with-authentication) for further details
+
+6. **Process webhook payload** and output relevant parts of it in your block's `run` method.
+
+ ```python
+ def run(self, input_data: Input, **kwargs) -> BlockOutput:
+ yield "payload", input_data.payload
+ yield "sender", input_data.payload["sender"]
+ yield "event", input_data.payload["action"]
+ yield "number", input_data.payload["number"]
+ yield "pull_request", input_data.payload["pull_request"]
+ ```
+
+ Note that the `credentials` parameter can be omitted if the credentials
+ aren't used at block runtime, like in the example.
+
+
+
+#### Adding a Webhooks Manager
+
+To add support for a new webhook provider, you'll need to create a WebhooksManager that implements the `BaseWebhooksManager` interface:
+
+```python backend/integrations/webhooks/_base.py
+
+PROVIDER_NAME: ClassVar[ProviderName]
+
+@abstractmethod
+async def _register_webhook(
+ self,
+ credentials: Credentials,
+ webhook_type: WT,
+ resource: str,
+ events: list[str],
+ ingress_url: str,
+ secret: str,
+) -> tuple[str, dict]:
+ """
+ Registers a new webhook with the provider.
+
+ Params:
+ credentials: The credentials with which to create the webhook
+ webhook_type: The provider-specific webhook type to create
+ resource: The resource to receive events for
+ events: The events to subscribe to
+ ingress_url: The ingress URL for webhook payloads
+ secret: Secret used to verify webhook payloads
+
+ Returns:
+ str: Webhook ID assigned by the provider
+ config: Provider-specific configuration for the webhook
+ """
+ ...
+
+@classmethod
+@abstractmethod
+async def validate_payload(
+ cls, webhook: integrations.Webhook, request: Request
+) -> tuple[dict, str]:
+ """
+ Validates an incoming webhook request and returns its payload and type.
+
+ Params:
+ webhook: Object representing the configured webhook and its properties in our system.
+ request: Incoming FastAPI `Request`
+
+ Returns:
+ dict: The validated payload
+ str: The event type associated with the payload
+ """
+
+@abstractmethod
+async def _deregister_webhook(
+ self, webhook: integrations.Webhook, credentials: Credentials
+) -> None: ...
+
+async def trigger_ping(
+ self, webhook: integrations.Webhook, credentials: Credentials | None
+) -> None:
+ """
+ Triggers a ping to the given webhook.
+
+ Raises:
+ NotImplementedError: if the provider doesn't support pinging
+ """
+```
+
+And add a reference to your `WebhooksManager` class in `WEBHOOK_MANAGERS_BY_NAME`:
+
+```python backend/integrations/webhooks/__init__.py
+WEBHOOK_MANAGERS_BY_NAME: dict["ProviderName", type["BaseWebhooksManager"]] = {
+ handler.PROVIDER_NAME: handler
+ for handler in [
+ CompassWebhookManager,
+ GithubWebhooksManager,
+ Slant3DWebhooksManager,
+ ]
+}
+```
+
+#### Example: GitHub Webhook Integration
+
+
+ blocks/github/triggers.py
+
+```python backend/blocks/github/triggers.py
+class GitHubTriggerBase:
+ class Input(BlockSchema):
+ credentials: GithubCredentialsInput = GithubCredentialsField("repo")
+ repo: str = SchemaField(
+ description=(
+ "Repository to subscribe to.\n\n"
+ "**Note:** Make sure your GitHub credentials have permissions "
+ "to create webhooks on this repo."
+ ),
+ placeholder="{owner}/{repo}",
+ )
+ payload: dict = SchemaField(hidden=True, default={})
+
+ class Output(BlockSchema):
+ payload: dict = SchemaField(
+ description="The complete webhook payload that was received from GitHub. "
+ "Includes information about the affected resource (e.g. pull request), "
+ "the event, and the user who triggered the event."
+ )
+ triggered_by_user: dict = SchemaField(
+ description="Object representing the GitHub user who triggered the event"
+ )
+ error: str = SchemaField(
+ description="Error message if the payload could not be processed"
+ )
+
+ def run(self, input_data: Input, **kwargs) -> BlockOutput:
+ yield "payload", input_data.payload
+ yield "triggered_by_user", input_data.payload["sender"]
+
+
+class GithubPullRequestTriggerBlock(GitHubTriggerBase, Block):
+ EXAMPLE_PAYLOAD_FILE = (
+ Path(__file__).parent / "example_payloads" / "pull_request.synchronize.json"
+ )
+
+ class Input(GitHubTriggerBase.Input):
+ class EventsFilter(BaseModel):
+ """
+ https://docs.github.com/en/webhooks/webhook-events-and-payloads#pull_request
+ """
+
+ opened: bool = False
+ edited: bool = False
+ closed: bool = False
+ reopened: bool = False
+ synchronize: bool = False
+ assigned: bool = False
+ unassigned: bool = False
+ labeled: bool = False
+ unlabeled: bool = False
+ converted_to_draft: bool = False
+ locked: bool = False
+ unlocked: bool = False
+ enqueued: bool = False
+ dequeued: bool = False
+ milestoned: bool = False
+ demilestoned: bool = False
+ ready_for_review: bool = False
+ review_requested: bool = False
+ review_request_removed: bool = False
+ auto_merge_enabled: bool = False
+ auto_merge_disabled: bool = False
+
+ events: EventsFilter = SchemaField(
+ title="Events", description="The events to subscribe to"
+ )
+
+ class Output(GitHubTriggerBase.Output):
+ event: str = SchemaField(
+ description="The PR event that triggered the webhook (e.g. 'opened')"
+ )
+ number: int = SchemaField(description="The number of the affected pull request")
+ pull_request: dict = SchemaField(
+ description="Object representing the affected pull request"
+ )
+ pull_request_url: str = SchemaField(
+ description="The URL of the affected pull request"
+ )
+
+ def __init__(self):
+ from backend.integrations.webhooks.github import GithubWebhookType
+
+ example_payload = json.loads(
+ self.EXAMPLE_PAYLOAD_FILE.read_text(encoding="utf-8")
+ )
+
+ super().__init__(
+ id="6c60ec01-8128-419e-988f-96a063ee2fea",
+ description="This block triggers on pull request events and outputs the event type and payload.",
+ categories={BlockCategory.DEVELOPER_TOOLS, BlockCategory.INPUT},
+ input_schema=GithubPullRequestTriggerBlock.Input,
+ output_schema=GithubPullRequestTriggerBlock.Output,
+ webhook_config=BlockWebhookConfig(
+ provider="github",
+ webhook_type=GithubWebhookType.REPO,
+ resource_format="{repo}",
+ event_filter_input="events",
+ event_format="pull_request.{event}",
+ ),
+ test_input={
+ "repo": "Significant-Gravitas/AutoGPT",
+ "events": {"opened": True, "synchronize": True},
+ "credentials": TEST_CREDENTIALS_INPUT,
+ "payload": example_payload,
+ },
+ test_credentials=TEST_CREDENTIALS,
+ test_output=[
+ ("payload", example_payload),
+ ("triggered_by_user", example_payload["sender"]),
+ ("event", example_payload["action"]),
+ ("number", example_payload["number"]),
+ ("pull_request", example_payload["pull_request"]),
+ ("pull_request_url", example_payload["pull_request"]["html_url"]),
+ ],
+ )
+
+ def run(self, input_data: Input, **kwargs) -> BlockOutput: # type: ignore
+ yield from super().run(input_data, **kwargs)
+ yield "event", input_data.payload["action"]
+ yield "number", input_data.payload["number"]
+ yield "pull_request", input_data.payload["pull_request"]
+ yield "pull_request_url", input_data.payload["pull_request"]["html_url"]
+```
+
+
+
+
+
+ integrations/webhooks/github.py
+
+```python backend/integrations/webhooks/github.py
+class GithubWebhookType(StrEnum):
+ REPO = "repo"
+
+
+class GithubWebhooksManager(BaseWebhooksManager):
+ PROVIDER_NAME = ProviderName.GITHUB
+
+ WebhookType = GithubWebhookType
+
+ GITHUB_API_URL = "https://api.github.com"
+ GITHUB_API_DEFAULT_HEADERS = {"Accept": "application/vnd.github.v3+json"}
+
+ @classmethod
+ async def validate_payload(
+ cls, webhook: integrations.Webhook, request: Request
+ ) -> tuple[dict, str]:
+ if not (event_type := request.headers.get("X-GitHub-Event")):
+ raise HTTPException(
+ status_code=400, detail="X-GitHub-Event header is missing!"
+ )
+
+ if not (signature_header := request.headers.get("X-Hub-Signature-256")):
+ raise HTTPException(
+ status_code=403, detail="X-Hub-Signature-256 header is missing!"
+ )
+
+ payload_body = await request.body()
+ hash_object = hmac.new(
+ webhook.secret.encode("utf-8"), msg=payload_body, digestmod=hashlib.sha256
+ )
+ expected_signature = "sha256=" + hash_object.hexdigest()
+
+ if not hmac.compare_digest(expected_signature, signature_header):
+ raise HTTPException(
+ status_code=403, detail="Request signatures didn't match!"
+ )
+
+ payload = await request.json()
+ if action := payload.get("action"):
+ event_type += f".{action}"
+
+ return payload, event_type
+
+ async def trigger_ping(
+ self, webhook: integrations.Webhook, credentials: Credentials | None
+ ) -> None:
+ if not credentials:
+ raise ValueError("Credentials are required but were not passed")
+
+ headers = {
+ **self.GITHUB_API_DEFAULT_HEADERS,
+ "Authorization": credentials.bearer(),
+ }
+
+ repo, github_hook_id = webhook.resource, webhook.provider_webhook_id
+ ping_url = f"{self.GITHUB_API_URL}/repos/{repo}/hooks/{github_hook_id}/pings"
+
+ response = requests.post(ping_url, headers=headers)
+
+ if response.status_code != 204:
+ error_msg = extract_github_error_msg(response)
+ raise ValueError(f"Failed to ping GitHub webhook: {error_msg}")
+
+ async def _register_webhook(
+ self,
+ credentials: Credentials,
+ webhook_type: GithubWebhookType,
+ resource: str,
+ events: list[str],
+ ingress_url: str,
+ secret: str,
+ ) -> tuple[str, dict]:
+ if webhook_type == self.WebhookType.REPO and resource.count("/") > 1:
+ raise ValueError("Invalid repo format: expected 'owner/repo'")
+
+ # Extract main event, e.g. `pull_request.opened` -> `pull_request`
+ github_events = list({event.split(".")[0] for event in events})
+
+ headers = {
+ **self.GITHUB_API_DEFAULT_HEADERS,
+ "Authorization": credentials.bearer(),
+ }
+ webhook_data = {
+ "name": "web",
+ "active": True,
+ "events": github_events,
+ "config": {
+ "url": ingress_url,
+ "content_type": "json",
+ "insecure_ssl": "0",
+ "secret": secret,
+ },
+ }
+
+ response = requests.post(
+ f"{self.GITHUB_API_URL}/repos/{resource}/hooks",
+ headers=headers,
+ json=webhook_data,
+ )
+
+ if response.status_code != 201:
+ error_msg = extract_github_error_msg(response)
+ if "not found" in error_msg.lower():
+ error_msg = (
+ f"{error_msg} "
+ "(Make sure the GitHub account or API key has 'repo' or "
+ f"webhook create permissions to '{resource}')"
+ )
+ raise ValueError(f"Failed to create GitHub webhook: {error_msg}")
+
+ webhook_id = response.json()["id"]
+ config = response.json()["config"]
+
+ return str(webhook_id), config
+
+ async def _deregister_webhook(
+ self, webhook: integrations.Webhook, credentials: Credentials
+ ) -> None:
+ webhook_type = self.WebhookType(webhook.webhook_type)
+ if webhook.credentials_id != credentials.id:
+ raise ValueError(
+ f"Webhook #{webhook.id} does not belong to credentials {credentials.id}"
+ )
+
+ headers = {
+ **self.GITHUB_API_DEFAULT_HEADERS,
+ "Authorization": credentials.bearer(),
+ }
+
+ if webhook_type == self.WebhookType.REPO:
+ repo = webhook.resource
+ delete_url = f"{self.GITHUB_API_URL}/repos/{repo}/hooks/{webhook.provider_webhook_id}" # noqa
+ else:
+ raise NotImplementedError(
+ f"Unsupported webhook type '{webhook.webhook_type}'"
+ )
+
+ response = requests.delete(delete_url, headers=headers)
+
+ if response.status_code not in [204, 404]:
+ # 204 means successful deletion, 404 means the webhook was already deleted
+ error_msg = extract_github_error_msg(response)
+ raise ValueError(f"Failed to delete GitHub webhook: {error_msg}")
+
+ # If we reach here, the webhook was successfully deleted or didn't exist
+```
+
+
+
+## Key Points to Remember
+
+- **Unique ID**: Give your block a unique ID in the **init** method.
+- **Input and Output Schemas**: Define clear input and output schemas.
+- **Error Handling**: Implement error handling in the `run` method.
+- **Output Results**: Use `yield` to output results in the `run` method.
+- **Testing**: Provide test input and output in the **init** method for automatic testing.
+
+## Understanding the Testing Process
+
+The testing of blocks is handled by `test_block.py`, which does the following:
+
+1. It calls the block with the provided `test_input`.
+ If the block has a `credentials` field, `test_credentials` is passed in as well.
+2. If a `test_mock` is provided, it temporarily replaces the specified methods with the mock functions.
+3. It then asserts that the output matches the `test_output`.
+
+For the WikipediaSummaryBlock:
+
+- The test will call the block with the topic "Artificial Intelligence".
+- Instead of making a real API call, it will use the mock function, which returns `{"extract": "summary content"}`.
+- It will then check if the output key is "summary" and its value is a string.
+
+This approach allows us to test the block's logic comprehensively without relying on external services, while also accommodating non-deterministic outputs.
+
+## Security Best Practices for SSRF Prevention
+
+When creating blocks that handle external URL inputs or make network requests, it's crucial to use the platform's built-in SSRF protection mechanisms. The `backend.util.request` module provides a secure `Requests` wrapper class that should be used for all HTTP requests.
+
+### Using the Secure Requests Wrapper
+
+```python
+from backend.util.request import requests
+
+class MyNetworkBlock(Block):
+ def run(self, input_data: Input, **kwargs) -> BlockOutput:
+ try:
+ # The requests wrapper automatically validates URLs and blocks dangerous requests
+ response = requests.get(input_data.url)
+ yield "result", response.text
+ except ValueError as e:
+ # URL validation failed
+ raise RuntimeError(f"Invalid URL provided: {e}")
+ except requests.exceptions.RequestException as e:
+ # Request failed
+ raise RuntimeError(f"Request failed: {e}")
+```
+
+The `Requests` wrapper provides these security features:
+
+1. **URL Validation**:
+ - Blocks requests to private IP ranges (RFC 1918)
+ - Validates URL format and protocol
+ - Resolves DNS and checks IP addresses
+ - Supports whitelisting trusted origins
+
+2. **Secure Defaults**:
+ - Disables redirects by default
+ - Raises exceptions for non-200 status codes
+ - Supports custom headers and validators
+
+3. **Protected IP Ranges**:
+ The wrapper denies requests to these networks:
+
+ ```python title="backend/util/request.py"
+ --8<-- "autogpt_platform/backend/backend/util/request.py:BLOCKED_IP_NETWORKS"
+ ```
+
+### Custom Request Configuration
+
+If you need to customize the request behavior:
+
+```python
+from backend.util.request import Requests
+
+# Create a custom requests instance with specific trusted origins
+custom_requests = Requests(
+ trusted_origins=["api.trusted-service.com"],
+ raise_for_status=True,
+ extra_headers={"User-Agent": "MyBlock/1.0"}
+)
+```
+
+## Tips for Effective Block Testing
+
+1. **Provide realistic test_input**: Ensure your test input covers typical use cases.
+
+2. **Define appropriate test_output**:
+
+ - For deterministic outputs, use specific expected values.
+ - For non-deterministic outputs or when only the type matters, use Python types (e.g., `str`, `int`, `dict`).
+ - You can mix specific values and types, e.g., `("key1", str), ("key2", 42)`.
+
+3. **Use test_mock for network calls**: This prevents tests from failing due to network issues or API changes.
+
+4. **Consider omitting test_mock for blocks without external dependencies**: If your block doesn't make network calls or use external resources, you might not need a mock.
+
+5. **Consider edge cases**: Include tests for potential error conditions in your `run` method.
+
+6. **Update tests when changing block behavior**: If you modify your block, ensure the tests are updated accordingly.
+
+By following these steps, you can create new blocks that extend the functionality of the AutoGPT Agent Server.
+
+## Blocks we want to see
+
+Below is a list of blocks that we would like to see implemented in the AutoGPT Agent Server. If you're interested in contributing, feel free to pick one of these blocks or chose your own.
+
+If you would like to implement one of these blocks, open a pull request and we will start the review process.
+
+### Consumer Services/Platforms
+
+- Google sheets - [~~Read/Append~~](https://github.com/Significant-Gravitas/AutoGPT/pull/8236)
+- Email - Read/Send with [~~Gmail~~](https://github.com/Significant-Gravitas/AutoGPT/pull/8236), Outlook, Yahoo, Proton, etc
+- Calendar - Read/Write with Google Calendar, Outlook Calendar, etc
+- Home Assistant - Call Service, Get Status
+- Dominos - Order Pizza, Track Order
+- Uber - Book Ride, Track Ride
+- Notion - Create/Read Page, Create/Append/Read DB
+- Google drive - read/write/overwrite file/folder
+
+### Social Media
+
+- Twitter - Post, Reply, Get Replies, Get Comments, Get Followers, Get Following, Get Tweets, Get Mentions
+- Instagram - Post, Reply, Get Comments, Get Followers, Get Following, Get Posts, Get Mentions, Get Trending Posts
+- TikTok - Post, Reply, Get Comments, Get Followers, Get Following, Get Videos, Get Mentions, Get Trending Videos
+- LinkedIn - Post, Reply, Get Comments, Get Followers, Get Following, Get Posts, Get Mentions, Get Trending Posts
+- YouTube - Transcribe Videos/Shorts, Post Videos/Shorts, Read/Reply/React to Comments, Update Thumbnails, Update Description, Update Tags, Update Titles, Get Views, Get Likes, Get Dislikes, Get Subscribers, Get Comments, Get Shares, Get Watch Time, Get Revenue, Get Trending Videos, Get Top Videos, Get Top Channels
+- Reddit - Post, Reply, Get Comments, Get Followers, Get Following, Get Posts, Get Mentions, Get Trending Posts
+- Treatwell (and related Platforms) - Book, Cancel, Review, Get Recommendations
+- Substack - Read/Subscribe/Unsubscribe, Post/Reply, Get Recommendations
+- Discord - Read/Post/Reply, Moderation actions
+- GoodReads - Read/Post/Reply, Get Recommendations
+
+### E-commerce
+
+- Airbnb - Book, Cancel, Review, Get Recommendations
+- Amazon - Order, Track Order, Return, Review, Get Recommendations
+- eBay - Order, Track Order, Return, Review, Get Recommendations
+- Upwork - Post Jobs, Hire Freelancer, Review Freelancer, Fire Freelancer
+
+### Business Tools
+
+- External Agents - Call other agents similar to AutoGPT
+- Trello - Create/Read/Update/Delete Cards, Lists, Boards
+- Jira - Create/Read/Update/Delete Issues, Projects, Boards
+- Linear - Create/Read/Update/Delete Issues, Projects, Boards
+- Excel - Read/Write/Update/Delete Rows, Columns, Sheets
+- Slack - Read/Post/Reply to Messages, Create Channels, Invite Users
+- ERPNext - Create/Read/Update/Delete Invoices, Orders, Customers, Products
+- Salesforce - Create/Read/Update/Delete Leads, Opportunities, Accounts
+- HubSpot - Create/Read/Update/Delete Contacts, Deals, Companies
+- Zendesk - Create/Read/Update/Delete Tickets, Users, Organizations
+- Odoo - Create/Read/Update/Delete Sales Orders, Invoices, Customers
+- Shopify - Create/Read/Update/Delete Products, Orders, Customers
+- WooCommerce - Create/Read/Update/Delete Products, Orders, Customers
+- Squarespace - Create/Read/Update/Delete Pages, Products, Orders
+
+## Agent Templates we want to see
+
+### Data/Information
+
+- Summarize top news of today, of this week, this month via Apple News or other large media outlets BBC, TechCrunch, hackernews, etc
+- Create, read, and summarize substack newsletters or any newsletters (blog writer vs blog reader)
+- Get/read/summarize the most viral Twitter, Instagram, TikTok (general social media accounts) of the day, week, month
+- Get/Read any LinkedIn posts or profile that mention AI Agents
+- Read/Summarize discord (might not be able to do this because you need access)
+- Read / Get most read books in a given month, year, etc from GoodReads or Amazon Books, etc
+- Get dates for specific shows across all streaming services
+ - Suggest/Recommend/Get most watched shows in a given month, year, etc across all streaming platforms
+- Data analysis from xlsx data set
+ - Gather via Excel or Google Sheets data > Sample the data randomly (sample block takes top X, bottom X, randomly, etc) > pass that to LLM Block to generate a script for analysis of the full data > Python block to run the script> making a loop back through LLM Fix Block on error > create chart/visualization (potentially in the code block?) > show the image as output (this may require frontend changes to show)
+- Tiktok video search and download
+
+### Marketing
+
+- Portfolio site design and enhancements
diff --git a/docs/platform/ollama.mdx b/docs/platform/ollama.mdx
new file mode 100644
index 000000000..1b6386d2d
--- /dev/null
+++ b/docs/platform/ollama.mdx
@@ -0,0 +1,41 @@
+---
+title: Running Ollama with AutoGPT
+mode: wide
+sidebarTitle: Using Ollama
+---
+
+Follow these steps to set up and run Ollama and your AutoGPT project:
+
+1. **Run Ollama**
+ - Open a terminal
+ - Execute the following command:
+ ```bash
+ ollama run llama3
+ ```
+ - Leave this terminal running
+
+2. **Run the Backend**
+ - Open a new terminal
+ - Navigate to the backend directory in the AutoGPT project:
+ ```
+ cd autogpt_platform/backend/
+ ```
+ - Start the backend using Poetry:
+ ```
+ poetry run app
+ ```
+
+3. **Run the Frontend**
+ - Open another terminal
+ - Navigate to the frontend directory in the AutoGPT project:
+ ```
+ cd autogpt_platform/frontend/
+ ```
+ - Start the frontend development server:
+ ```
+ npm run dev
+ ```
+
+4. **Choose the Ollama Model**
+ - Add LLMBlock in the UI
+ - Choose the last option in the model selection dropdown
diff --git a/docs/platform/reference/api-documentation/graphql-schema.mdx b/docs/platform/reference/api-documentation/graphql-schema.mdx
new file mode 100644
index 000000000..e69de29bb
diff --git a/docs/platform/reference/api-documentation/rest-api-endpoints.mdx b/docs/platform/reference/api-documentation/rest-api-endpoints.mdx
new file mode 100644
index 000000000..e69de29bb
diff --git a/docs/platform/reference/api-documentation/web-socket-interface.mdx b/docs/platform/reference/api-documentation/web-socket-interface.mdx
new file mode 100644
index 000000000..e69de29bb
diff --git a/docs/platform/reference/architecture/data-models.mdx b/docs/platform/reference/architecture/data-models.mdx
new file mode 100644
index 000000000..e69de29bb
diff --git a/docs/platform/reference/architecture/event-system.mdx b/docs/platform/reference/architecture/event-system.mdx
new file mode 100644
index 000000000..e69de29bb
diff --git a/docs/platform/reference/architecture/system-components.mdx b/docs/platform/reference/architecture/system-components.mdx
new file mode 100644
index 000000000..e69de29bb
diff --git a/docs/platform/reference/configuration/authentication.mdx b/docs/platform/reference/configuration/authentication.mdx
new file mode 100644
index 000000000..e69de29bb
diff --git a/docs/platform/reference/configuration/config-file-options.mdx b/docs/platform/reference/configuration/config-file-options.mdx
new file mode 100644
index 000000000..e69de29bb
diff --git a/docs/platform/reference/configuration/environment-variables.mdx b/docs/platform/reference/configuration/environment-variables.mdx
new file mode 100644
index 000000000..e69de29bb
diff --git a/docs/platform/reference/sdk-reference/javascript-sdk.mdx b/docs/platform/reference/sdk-reference/javascript-sdk.mdx
new file mode 100644
index 000000000..e69de29bb
diff --git a/docs/platform/reference/sdk-reference/puthon-sdk.mdx b/docs/platform/reference/sdk-reference/puthon-sdk.mdx
new file mode 100644
index 000000000..e69de29bb
diff --git a/docs/content/platform/submit-agent-to-marketplace.md b/docs/platform/submit-agent-to-marketplace.mdx
similarity index 72%
rename from docs/content/platform/submit-agent-to-marketplace.md
rename to docs/platform/submit-agent-to-marketplace.mdx
index b67f1cc4d..1a1e72385 100644
--- a/docs/content/platform/submit-agent-to-marketplace.md
+++ b/docs/platform/submit-agent-to-marketplace.mdx
@@ -1,6 +1,10 @@
-# **How to Submit an Agent to the AutoGPT Marketplace**
+---
+title: How to Submit an Agent to the AutoGPT Marketplace
+sidebarTitle: "Submit an Agent to the Marketplace"
+---
-
+
+
## **Prerequisites**
* A completed agent built using the AutoGPT Builder
@@ -32,4 +36,4 @@
* Provide a clear, detailed description of what your agent does
* Choose relevant keywords that accurately describe your agent's functionality
* Ensure your agent is fully tested and working as intended before submission
-* Select the most appropriate category to help users find your agent
\ No newline at end of file
+* Select the most appropriate category to help users find your agent
diff --git a/docs/platform/tutorials/cloud-platform-tutorials/creating-your-first-project.mdx b/docs/platform/tutorials/cloud-platform-tutorials/creating-your-first-project.mdx
new file mode 100644
index 000000000..e69de29bb
diff --git a/docs/platform/tutorials/cloud-platform-tutorials/managing-api-keys.mdx b/docs/platform/tutorials/cloud-platform-tutorials/managing-api-keys.mdx
new file mode 100644
index 000000000..e69de29bb
diff --git a/docs/platform/tutorials/cloud-platform-tutorials/setting-up-your-workspace.mdx b/docs/platform/tutorials/cloud-platform-tutorials/setting-up-your-workspace.mdx
new file mode 100644
index 000000000..e69de29bb
diff --git a/docs/platform/tutorials/getting-started/basic-configuration.mdx b/docs/platform/tutorials/getting-started/basic-configuration.mdx
new file mode 100644
index 000000000..e69de29bb
diff --git a/docs/platform/tutorials/getting-started/first-autogpt-agent.mdx b/docs/platform/tutorials/getting-started/first-autogpt-agent.mdx
new file mode 100644
index 000000000..e69de29bb
diff --git a/docs/platform/tutorials/getting-started/quick-start-guide.mdx b/docs/platform/tutorials/getting-started/quick-start-guide.mdx
new file mode 100644
index 000000000..e69de29bb
diff --git a/docs/platform/tutorials/getting-started/self-hosted-installation.mdx b/docs/platform/tutorials/getting-started/self-hosted-installation.mdx
new file mode 100644
index 000000000..e69de29bb
diff --git a/docs/platform/tutorials/self-hosted-tutorials/database-configuration.mdx b/docs/platform/tutorials/self-hosted-tutorials/database-configuration.mdx
new file mode 100644
index 000000000..e69de29bb
diff --git a/docs/platform/tutorials/self-hosted-tutorials/infrastructure-setup.mdx b/docs/platform/tutorials/self-hosted-tutorials/infrastructure-setup.mdx
new file mode 100644
index 000000000..e69de29bb
diff --git a/docs/platform/tutorials/self-hosted-tutorials/security-best-practices.mdx b/docs/platform/tutorials/self-hosted-tutorials/security-best-practices.mdx
new file mode 100644
index 000000000..e69de29bb
diff --git a/docs/requirements.txt b/docs/requirements.txt
deleted file mode 100644
index 607580136..000000000
--- a/docs/requirements.txt
+++ /dev/null
@@ -1,7 +0,0 @@
-mkdocs
-mkdocs-material
-mkdocs-table-reader-plugin
-pymdown-extensions
-mkdocs-git-revision-date-localized-plugin
-zipp>=3.19.1 # not directly required, pinned by Snyk to avoid a vulnerability
-urllib3>=2.2.2 # not directly required, pinned by Snyk to avoid a vulnerability