From 7cd407b7b4a9f4395761e772335e859e40e8c3d3 Mon Sep 17 00:00:00 2001 From: Luke <2609441+lc0rp@users.noreply.github.com> Date: Tue, 1 Aug 2023 13:17:33 -0400 Subject: [PATCH] Use modern material theme for docs (#5035) * Use modern material theme for docs * Update mkdocs.yml Added search plugin Co-authored-by: James Collins * Updating mkdocs material theme config per recommendations to enable all markdown options * Updated highlight extension settings and codeblocks throughout the docs to align with mkdocs-material recommendations. codehilite is deprecated in favor of the highlight extension: https://squidfunk.github.io/mkdocs-material/setup/extensions/python-markdown-extensions/#highlight --------- Co-authored-by: lc0rp <2609411+lc0rp@users.noreply.github.com> Co-authored-by: James Collins Co-authored-by: Nicholas Tindle --- docs/_javascript/mathjax.js | 16 ++++ docs/_javascript/tablesort.js | 6 ++ docs/challenges/memory/challenge_b.md | 5 +- docs/challenges/memory/challenge_c.md | 28 ++++-- docs/challenges/memory/challenge_d.md | 19 ++-- docs/configuration/imagegen.md | 12 ++- docs/configuration/memory.md | 24 ++--- docs/configuration/voice.md | 2 +- docs/imgs/Auto_GPT_Logo.png | Bin 0 -> 26841 bytes docs/setup.md | 113 +++++++++++++----------- docs/share-your-logs.md | 2 +- docs/testing.md | 25 +++--- docs/usage.md | 42 +++++---- mkdocs.yml | 121 ++++++++++++++++++++------ requirements.txt | 2 + tests/unit/test_config.py | 17 ++-- 16 files changed, 291 insertions(+), 143 deletions(-) create mode 100644 docs/_javascript/mathjax.js create mode 100644 docs/_javascript/tablesort.js create mode 100644 docs/imgs/Auto_GPT_Logo.png diff --git a/docs/_javascript/mathjax.js b/docs/_javascript/mathjax.js new file mode 100644 index 000000000000..a80ddbff75af --- /dev/null +++ b/docs/_javascript/mathjax.js @@ -0,0 +1,16 @@ +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 new file mode 100644 index 000000000000..ee04e9008218 --- /dev/null +++ b/docs/_javascript/tablesort.js @@ -0,0 +1,6 @@ +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/challenges/memory/challenge_b.md b/docs/challenges/memory/challenge_b.md index abc6da6bef89..7df7044ff39a 100644 --- a/docs/challenges/memory/challenge_b.md +++ b/docs/challenges/memory/challenge_b.md @@ -3,9 +3,10 @@ **Status**: Current level to beat: level 3 **Command to try**: -``` + +```shell pytest -s tests/challenges/memory/test_memory_challenge_b.py --level=3 -`` +``` ## Description diff --git a/docs/challenges/memory/challenge_c.md b/docs/challenges/memory/challenge_c.md index e197ddbd2c68..955c823f31cd 100644 --- a/docs/challenges/memory/challenge_c.md +++ b/docs/challenges/memory/challenge_c.md @@ -3,9 +3,10 @@ **Status**: Current level to beat: level 1 **Command to try**: -``` + +```shell pytest -s tests/challenges/memory/test_memory_challenge_c.py --level=2 -`` +``` ## Description @@ -20,13 +21,23 @@ The challenge involves a series of text files containing instructions and silly - `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. +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] +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. @@ -34,7 +45,12 @@ Read the file instructions_3.txt using the read_file command. - `instructions_n.txt` -The current phrase is "My pet rock sings better than Beyoncé on Tuesdays." +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. diff --git a/docs/challenges/memory/challenge_d.md b/docs/challenges/memory/challenge_d.md index 7563cce5939d..5ecec045e01a 100644 --- a/docs/challenges/memory/challenge_d.md +++ b/docs/challenges/memory/challenge_d.md @@ -1,11 +1,12 @@ -# Memory Challenge C +# 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 @@ -30,13 +31,16 @@ The test runs for levels up to the maximum level that the AI has successfully be - `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).", +``` +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.", - +``` +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. @@ -44,6 +48,7 @@ The test runs for levels up to the maximum level that the AI has successfully be The expected believes of every characters are given in a list: +```json expected_beliefs = { 1: { 'Sally': { @@ -68,7 +73,7 @@ expected_beliefs = { 'A': 'sofa', # Because Anne told him to tell Sally so } },... - +``` ## Objective diff --git a/docs/configuration/imagegen.md b/docs/configuration/imagegen.md index 38fdcebb28bf..1a10d61d2827 100644 --- a/docs/configuration/imagegen.md +++ b/docs/configuration/imagegen.md @@ -7,7 +7,8 @@ ## DALL-e In `.env`, make sure `IMAGE_PROVIDER` is commented (or set to `dalle`): -``` ini + +```ini # IMAGE_PROVIDER=dalle # this is the default ``` @@ -23,7 +24,8 @@ 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) Once you have an API token, uncomment and adjust these variables in your `.env`: -``` ini + +```ini IMAGE_PROVIDER=huggingface HUGGINGFACE_API_TOKEN=your-huggingface-api-token ``` @@ -39,7 +41,8 @@ Further optional configuration: ## Stable Diffusion WebUI It is possible to use your own self-hosted Stable Diffusion WebUI with Auto-GPT: -``` ini + +```ini IMAGE_PROVIDER=sdwebui ``` @@ -54,6 +57,7 @@ Further optional configuration: | `SD_WEBUI_AUTH` | `{username}:{password}` | *Note: do not copy the braces!* | ## Selenium -``` shell + +```shell sudo Xvfb :10 -ac -screen 0 1024x768x24 & DISPLAY=:10 ``` diff --git a/docs/configuration/memory.md b/docs/configuration/memory.md index 9d18f5ba2aca..3fa908b26169 100644 --- a/docs/configuration/memory.md +++ b/docs/configuration/memory.md @@ -51,17 +51,19 @@ Links to memory backends 1. Launch Redis container - :::shell - docker run -d --name redis-stack-server -p 6379:6379 redis/redis-stack-server:latest + ```shell + docker run -d --name redis-stack-server -p 6379:6379 redis/redis-stack-server:latest + ``` 3. Set the following settings in `.env` - :::ini - MEMORY_BACKEND=redis - REDIS_HOST=localhost - REDIS_PORT=6379 - REDIS_PASSWORD= - + ```shell + MEMORY_BACKEND=redis + REDIS_HOST=localhost + REDIS_PORT=6379 + REDIS_PASSWORD= + ``` + Replace `` by your password, omitting the angled brackets (<>). Optional configuration: @@ -157,7 +159,7 @@ To enable it, set `USE_WEAVIATE_EMBEDDED` to `True` and make sure you `pip insta Install the Weaviate client before usage. -``` shell +```shell $ pip install weaviate-client ``` @@ -165,7 +167,7 @@ $ pip install weaviate-client In your `.env` file set the following: -``` ini +```ini MEMORY_BACKEND=weaviate WEAVIATE_HOST="127.0.0.1" # the IP or domain of the running Weaviate instance WEAVIATE_PORT="8080" @@ -195,7 +197,7 @@ View memory usage by using the `--debug` flag :) Memory pre-seeding allows you to ingest files into memory and pre-seed it before running Auto-GPT. -``` shell +```shell $ python data_ingestion.py -h usage: data_ingestion.py [-h] (--file FILE | --dir DIR) [--init] [--overlap OVERLAP] [--max_length MAX_LENGTH] diff --git a/docs/configuration/voice.md b/docs/configuration/voice.md index 728fbaf5fd43..654d2ee45b43 100644 --- a/docs/configuration/voice.md +++ b/docs/configuration/voice.md @@ -2,7 +2,7 @@ Enter this command to use TTS _(Text-to-Speech)_ for Auto-GPT -``` shell +```shell python -m autogpt --speak ``` diff --git a/docs/imgs/Auto_GPT_Logo.png b/docs/imgs/Auto_GPT_Logo.png new file mode 100644 index 0000000000000000000000000000000000000000..9c60eea982b46802df3094fc11ca76824631f089 GIT binary patch literal 26841 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 JE7G=m{9n8>3@ZQt literal 0 HcmV?d00001 diff --git a/docs/setup.md b/docs/setup.md index d0079e0f0c7a..bd2f142e0412 100644 --- a/docs/setup.md +++ b/docs/setup.md @@ -36,40 +36,43 @@ Get your OpenAI API key from: [https://platform.openai.com/account/api-keys](htt 1. Make sure you have Docker installed, see [requirements](#requirements) 2. Create a project directory for Auto-GPT - :::shell - mkdir Auto-GPT - cd Auto-GPT + ```shell + mkdir Auto-GPT + cd Auto-GPT + ``` 3. In the project directory, create a file called `docker-compose.yml` with the following contents: - :::yaml - version: "3.9" - services: - auto-gpt: - image: significantgravitas/auto-gpt - env_file: - - .env - profiles: ["exclude-from-up"] - volumes: - - ./auto_gpt_workspace:/app/auto_gpt_workspace - - ./data:/app/data - ## allow auto-gpt to write logs to disk - - ./logs:/app/logs - ## uncomment following lines if you want to make use of these files - ## you must have them existing in the same folder as this docker-compose.yml - #- type: bind - # source: ./azure.yaml - # target: /app/azure.yaml - #- type: bind - # source: ./ai_settings.yaml - # target: /app/ai_settings.yaml + ```yaml + version: "3.9" + services: + auto-gpt: + image: significantgravitas/auto-gpt + env_file: + - .env + profiles: ["exclude-from-up"] + volumes: + - ./auto_gpt_workspace:/app/auto_gpt_workspace + - ./data:/app/data + ## allow auto-gpt to write logs to disk + - ./logs:/app/logs + ## uncomment following lines if you want to make use of these files + ## you must have them existing in the same folder as this docker-compose.yml + #- type: bind + # source: ./azure.yaml + # target: /app/azure.yaml + #- type: bind + # source: ./ai_settings.yaml + # target: /app/ai_settings.yaml + ``` 4. Create the necessary [configuration](#configuration) files. If needed, you can find templates in the [repository]. 5. Pull the latest image from [Docker Hub] - :::shell - docker pull significantgravitas/auto-gpt + ```shell + docker pull significantgravitas/auto-gpt + ``` 6. Continue to [Run with Docker](#run-with-docker) @@ -92,14 +95,15 @@ Get your OpenAI API key from: [https://platform.openai.com/account/api-keys](htt 1. Clone the repository - :::shell - git clone -b stable https://github.com/Significant-Gravitas/Auto-GPT.git + ```shell + git clone -b stable https://github.com/Significant-Gravitas/Auto-GPT.git + ``` 2. Navigate to the directory where you downloaded the repository - :::shell - cd Auto-GPT - + ```shell + cd Auto-GPT + ``` ### Set up without Git/Docker @@ -139,12 +143,13 @@ Get your OpenAI API key from: [https://platform.openai.com/account/api-keys](htt Example: - :::yaml - # Please specify all of these values as double-quoted strings - # Replace string in angled brackets (<>) to your own deployment Name - azure_model_map: - fast_llm_deployment_id: "" - ... + ```yaml + # Please specify all of these values as double-quoted strings + # Replace string in angled brackets (<>) to your own deployment Name + azure_model_map: + fast_llm_deployment_id: "" + ... + ``` Details can be found in the [openai-python docs], 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). @@ -164,7 +169,9 @@ Easiest is to use `docker compose`. 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: - docker compose version +```shell +docker compose version +``` This will display the version of Docker Compose that is currently installed on your system. @@ -174,13 +181,15 @@ Once you have a recent version of Docker Compose, run the commands below in your 1. Build the image. If you have pulled the image from Docker Hub, skip this step (NOTE: You *will* need to do this if you are modifying requirements.txt to add/remove dependencies like Python libs/frameworks) - :::shell - docker compose build auto-gpt - + ```shell + docker compose build auto-gpt + ``` + 2. Run Auto-GPT - :::shell - docker compose run --rm auto-gpt + ```shell + docker compose run --rm auto-gpt + ``` By default, this will also start and attach a Redis memory backend. If you do not want this, comment or remove the `depends: - redis` and `redis:` sections from @@ -189,12 +198,14 @@ Once you have a recent version of Docker Compose, run the commands below in your For related settings, see [Memory > Redis setup](./configuration/memory.md#redis-setup). You can pass extra arguments, e.g. running with `--gpt3only` and `--continuous`: -``` shell + +```shell docker compose run --rm auto-gpt --gpt3only --continuous ``` If you dare, you can also build and run it with "vanilla" docker commands: -``` shell + +```shell docker build -t auto-gpt . docker run -it --env-file=.env -v $PWD:/app auto-gpt docker run -it --env-file=.env -v $PWD:/app --rm auto-gpt --gpt3only --continuous @@ -218,7 +229,7 @@ docker run -it --env-file=.env -v $PWD:/app --rm auto-gpt --gpt3only --continuou Create a virtual environment to run in. -``` shell +```shell python -m venv venvAutoGPT source venvAutoGPT/bin/activate pip3 install --upgrade pip @@ -232,13 +243,15 @@ packages and launch Auto-GPT. - On Linux/MacOS: - :::shell - ./run.sh + ```shell + ./run.sh + ``` - On Windows: - :::shell - .\run.bat + ```shell + .\run.bat + ``` If this gives errors, make sure you have a compatible Python version installed. See also the [requirements](./installation.md#requirements). diff --git a/docs/share-your-logs.md b/docs/share-your-logs.md index f673e375cf45..ebcce83933b4 100644 --- a/docs/share-your-logs.md +++ b/docs/share-your-logs.md @@ -8,7 +8,7 @@ Activity, Error, and Debug logs are located in `./logs` To print out debug logs: -``` shell +```shell ./run.sh --debug # on Linux / macOS .\run.bat --debug # on Windows diff --git a/docs/testing.md b/docs/testing.md index 9a1735966e95..ef8176abfe5b 100644 --- a/docs/testing.md +++ b/docs/testing.md @@ -2,12 +2,13 @@ To run all tests, use the following command: -``` shell +```shell pytest ``` If `pytest` is not found: -``` shell + +```shell python -m pytest ``` @@ -15,18 +16,21 @@ python -m pytest - To run without integration tests: - :::shell - pytest --without-integration +```shell +pytest --without-integration +``` - To run without *slow* integration tests: - :::shell - pytest --without-slow-integration +```shell +pytest --without-slow-integration +``` - To run tests and see coverage: - :::shell - pytest --cov=autogpt --without-integration --without-slow-integration +```shell +pytest --cov=autogpt --without-integration --without-slow-integration +``` ## Running the linter @@ -36,11 +40,12 @@ See the [flake8 rules](https://www.flake8rules.com/) for more information. To run the linter: -``` shell +```shell flake8 . ``` Or: -``` shell + +```shell python -m flake8 . ``` diff --git a/docs/usage.md b/docs/usage.md index cb74ef7f6feb..f280bc8f5ae7 100644 --- a/docs/usage.md +++ b/docs/usage.md @@ -3,7 +3,7 @@ ## Command Line Arguments Running with `--help` lists all the possible command line arguments you can pass: -``` shell +```shell ./run.sh --help # on Linux / macOS .\run.bat --help # on Windows @@ -13,9 +13,10 @@ Running with `--help` lists all the possible command line arguments you can pass For use with Docker, replace the script in the examples with `docker compose run --rm auto-gpt`: - :::shell - docker compose run --rm auto-gpt --help - docker compose run --rm auto-gpt --ai-settings + ```shell + docker compose run --rm auto-gpt --help + docker compose run --rm auto-gpt --ai-settings + ``` !!! note Replace anything in angled brackets (<>) to a value you want to specify @@ -23,18 +24,22 @@ Running with `--help` lists all the possible command line arguments you can pass Here are some common arguments you can use when running Auto-GPT: * Run Auto-GPT with a different AI Settings file - ``` shell - ./run.sh --ai-settings - ``` + +```shell +./run.sh --ai-settings +``` + * Run Auto-GPT with a different Prompt Settings file - ``` shell - ./run.sh --prompt-settings - ``` -* Specify a memory backend - :::shell - ./run.sh --use-memory +```shell +./run.sh --prompt-settings +``` + +* Specify a memory backend +```shell +./run.sh --use-memory +``` !!! note There are shorthands for some of these flags, for example `-m` for `--use-memory`. @@ -44,7 +49,7 @@ Here are some common arguments you can use when running Auto-GPT: Enter this command to use TTS _(Text-to-Speech)_ for Auto-GPT -``` shell +```shell ./run.sh --speak ``` @@ -55,9 +60,10 @@ Continuous mode is NOT recommended. It is potentially dangerous and may cause your AI to run forever or carry out actions you would not usually authorize. Use at your own risk. -``` shell +```shell ./run.sh --continuous ``` + To exit the program, press ++ctrl+c++ ### ♻️ Self-Feedback Mode ⚠️ @@ -68,7 +74,7 @@ Running Self-Feedback will **INCREASE** token use and thus cost more. This featu If you don't have access to GPT-4, this mode allows you to use Auto-GPT! -``` shell +```shell ./run.sh --gpt3only ``` @@ -79,7 +85,7 @@ You can achieve the same by setting `SMART_LLM` in `.env` to `gpt-3.5-turbo`. If you have access to GPT-4, this mode allows you to use Auto-GPT solely with GPT-4. This may give your bot increased intelligence. -``` shell +```shell ./run.sh --gpt4only ``` @@ -97,7 +103,7 @@ Activity, Error, and Debug logs are located in `./logs` To print out debug logs: -``` shell +```shell ./run.sh --debug # on Linux / macOS .\run.bat --debug # on Windows diff --git a/mkdocs.yml b/mkdocs.yml index 2265a63fa690..0a9bb9e12d74 100644 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -7,39 +7,110 @@ nav: - Usage: usage.md - Plugins: plugins.md - Configuration: - - Options: configuration/options.md - - Search: configuration/search.md - - Memory: configuration/memory.md - - Voice: configuration/voice.md - - Image Generation: configuration/imagegen.md + - Options: configuration/options.md + - Search: configuration/search.md + - Memory: configuration/memory.md + - Voice: configuration/voice.md + - Image Generation: configuration/imagegen.md - Help us improve Auto-GPT: - - Share your debug logs with us: share-your-logs.md - - Contribution guide: contributing.md - - Running tests: testing.md - - Code of Conduct: code-of-conduct.md + - Share your debug logs with us: share-your-logs.md + - Contribution guide: contributing.md + - Running tests: testing.md + - Code of Conduct: code-of-conduct.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 + - 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/Auto-GPT/blob/master/LICENSE -theme: readthedocs +theme: + name: material + icon: + logo: material/book-open-variant + favicon: imgs/Auto_GPT_Logo.png + features: + - navigation.sections + - toc.follow + - navigation.top + - content.code.copy + 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: - admonition: - codehilite: - pymdownx.keys: + # 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:materialx.emoji.twemoji + emoji_generator: !!python/name:materialx.emoji.to_svg + - pymdownx.highlight + - pymdownx.inlinehilite + - pymdownx.keys + - pymdownx.mark + - pymdownx.smartsymbols + - pymdownx.snippets: + auto_append: + - includes/abbreviations.md + - 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 + +extra_javascript: + - https://unpkg.com/tablesort@5.3.0/dist/tablesort.min.js + - _javascript/tablesort.js + - _javascript/mathjax.js + - https://polyfill.io/v3/polyfill.min.js?features=es6 + - https://cdn.jsdelivr.net/npm/mathjax@3/es5/tex-mml-chtml.js diff --git a/requirements.txt b/requirements.txt index e401e26685aa..5dc87ff62da1 100644 --- a/requirements.txt +++ b/requirements.txt @@ -48,6 +48,8 @@ isort gitpython==3.1.31 auto-gpt-plugin-template @ git+https://github.com/Significant-Gravitas/Auto-GPT-Plugin-Template@0.1.0 mkdocs +mkdocs-material +mkdocs-table-reader-plugin pymdown-extensions mypy types-Markdown diff --git a/tests/unit/test_config.py b/tests/unit/test_config.py index 80de7073a791..9d63b26a362b 100644 --- a/tests/unit/test_config.py +++ b/tests/unit/test_config.py @@ -3,6 +3,7 @@ for the AI and ensures it behaves as a singleton. """ import os +from typing import Any from unittest import mock from unittest.mock import patch @@ -13,7 +14,7 @@ from autogpt.workspace.workspace import Workspace -def test_initial_values(config: Config): +def test_initial_values(config: Config) -> None: """ Test if the initial values of the config class attributes are set correctly. """ @@ -24,7 +25,7 @@ def test_initial_values(config: Config): assert config.smart_llm == "gpt-4-0314" -def test_set_continuous_mode(config: Config): +def test_set_continuous_mode(config: Config) -> None: """ Test if the set_continuous_mode() method updates the continuous_mode attribute. """ @@ -38,7 +39,7 @@ def test_set_continuous_mode(config: Config): config.continuous_mode = continuous_mode -def test_set_speak_mode(config: Config): +def test_set_speak_mode(config: Config) -> None: """ Test if the set_speak_mode() method updates the speak_mode attribute. """ @@ -52,7 +53,7 @@ def test_set_speak_mode(config: Config): config.speak_mode = speak_mode -def test_set_fast_llm(config: Config): +def test_set_fast_llm(config: Config) -> None: """ Test if the set_fast_llm() method updates the fast_llm attribute. """ @@ -66,7 +67,7 @@ def test_set_fast_llm(config: Config): config.fast_llm = fast_llm -def test_set_smart_llm(config: Config): +def test_set_smart_llm(config: Config) -> None: """ Test if the set_smart_llm() method updates the smart_llm attribute. """ @@ -80,7 +81,7 @@ def test_set_smart_llm(config: Config): config.smart_llm = smart_llm -def test_set_debug_mode(config: Config): +def test_set_debug_mode(config: Config) -> None: """ Test if the set_debug_mode() method updates the debug_mode attribute. """ @@ -95,7 +96,7 @@ def test_set_debug_mode(config: Config): @patch("openai.Model.list") -def test_smart_and_fast_llms_set_to_gpt4(mock_list_models, config: Config): +def test_smart_and_fast_llms_set_to_gpt4(mock_list_models: Any, config: Config) -> None: """ Test if models update to gpt-3.5-turbo if both are set to gpt-4. """ @@ -132,7 +133,7 @@ def test_smart_and_fast_llms_set_to_gpt4(mock_list_models, config: Config): config.smart_llm = smart_llm -def test_missing_azure_config(workspace: Workspace): +def test_missing_azure_config(workspace: Workspace) -> None: config_file = workspace.get_path("azure_config.yaml") with pytest.raises(FileNotFoundError): ConfigBuilder.load_azure_config(str(config_file))