diff --git a/.github/workflows/auto_format.yml b/.github/workflows/auto_format.yml deleted file mode 100644 index c33cd39755d5..000000000000 --- a/.github/workflows/auto_format.yml +++ /dev/null @@ -1,23 +0,0 @@ -name: auto-format -on: pull_request -jobs: - format: - runs-on: ubuntu-latest - steps: - - name: Checkout PR branch - uses: actions/checkout@v2 - with: - ref: ${{ github.event.pull_request.head.sha }} - - name: autopep8 - uses: peter-evans/autopep8@v1 - with: - args: --exit-code --recursive --in-place --aggressive --aggressive . - - name: Check for modified files - id: git-check - run: echo "modified=$(if git diff-index --quiet HEAD --; then echo "false"; else echo "true"; fi)" >> $GITHUB_ENV - - name: Push changes - if: steps.git-check.outputs.modified == 'true' - run: | - git config --global user.name 'Torantulino' - git config --global user.email 'toran.richards@gmail.com' - git remote set diff --git a/.github/workflows/benchmark.yml b/.github/workflows/benchmarks.yml similarity index 60% rename from .github/workflows/benchmark.yml rename to .github/workflows/benchmarks.yml index 0d9822f70530..272fca17bdcb 100644 --- a/.github/workflows/benchmark.yml +++ b/.github/workflows/benchmarks.yml @@ -1,4 +1,4 @@ -name: benchmark +name: Run Benchmarks on: workflow_dispatch: @@ -6,26 +6,26 @@ on: jobs: build: runs-on: ubuntu-latest - environment: benchmark - strategy: - matrix: - python-version: ['3.10', '3.11'] + + env: + python-version: '3.10' steps: - - name: Check out repository + - name: Checkout repository uses: actions/checkout@v3 - - name: Set up Python ${{ matrix.python-version }} - uses: actions/setup-python@v2 + - name: Set up Python ${{ env.python-version }} + uses: actions/setup-python@v4 with: - python-version: ${{ matrix.python-version }} + python-version: ${{ env.python-version }} - name: Install dependencies run: | python -m pip install --upgrade pip pip install -r requirements.txt + - name: benchmark - run: | - python benchmark/benchmark_entrepreneur_gpt_with_undecisive_user.py env: OPENAI_API_KEY: ${{ secrets.OPENAI_API_KEY }} + run: | + python benchmark/benchmark_entrepreneur_gpt_with_undecisive_user.py diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 780db14fc6c5..0b2bbde668e6 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -2,12 +2,12 @@ name: Python CI on: push: - branches: [master] + branches: [ master ] pull_request: - branches: [master] + branches: [ master ] concurrency: - group: ${{ format('ci-{0}', format('pr-{0}', github.event.pull_request.number) || github.sha) }} + group: ${{ format('ci-{0}', github.head_ref && format('pr-{0}', github.event.pull_request.number) || github.sha) }} cancel-in-progress: ${{ github.event_name == 'pull_request' }} jobs: @@ -17,7 +17,7 @@ jobs: min-python-version: "3.10" steps: - - name: Check out repository + - name: Checkout repository uses: actions/checkout@v3 - name: Set up Python ${{ env.min-python-version }} @@ -74,6 +74,7 @@ jobs: pytest --cov=autogpt --cov-report term-missing --cov-branch --cov-report xml --cov-report term env: OPENAI_API_KEY: ${{ secrets.OPENAI_API_KEY }} + - name: Generate coverage report run: | coverage report diff --git a/.github/workflows/docker-cache-clean.yml b/.github/workflows/docker-cache-clean.yml new file mode 100644 index 000000000000..f3fc8c10b4e8 --- /dev/null +++ b/.github/workflows/docker-cache-clean.yml @@ -0,0 +1,58 @@ +name: Purge Docker CI cache + +on: + schedule: + - cron: 20 4 * * 1,4 + +env: + BASE_BRANCH: master + IMAGE_NAME: auto-gpt + +jobs: + build: + runs-on: ubuntu-latest + strategy: + matrix: + build-type: [release, dev] + steps: + - name: Checkout repository + uses: actions/checkout@v3 + + - name: Set up Docker Buildx + uses: docker/setup-buildx-action@v2 + + - id: build + name: Build image + uses: docker/build-push-action@v3 + with: + build-args: BUILD_TYPE=${{ matrix.build-type }} + load: true # save to docker images + # use GHA cache as read-only + cache-to: type=gha,scope=docker-${{ matrix.build-type }},mode=max + + - name: Generate build report + env: + event_name: ${{ github.event_name }} + event_ref: ${{ github.event.schedule }} + + build_type: ${{ matrix.build-type }} + + prod_branch: stable + dev_branch: master + repository: ${{ github.repository }} + base_branch: ${{ github.ref_name != 'master' && github.ref_name != 'stable' && 'master' || 'stable' }} + + current_ref: ${{ github.ref_name }} + commit_hash: ${{ github.sha }} + source_url: ${{ format('{0}/tree/{1}', github.event.repository.url, github.sha) }} + push_forced_label: + + new_commits_json: ${{ null }} + compare_url_template: ${{ format('/{0}/compare/{{base}}...{{head}}', github.repository) }} + + github_context_json: ${{ toJSON(github) }} + job_env_json: ${{ toJSON(env) }} + vars_json: ${{ toJSON(vars) }} + + run: .github/workflows/scripts/docker-ci-summary.sh >> $GITHUB_STEP_SUMMARY + continue-on-error: true diff --git a/.github/workflows/docker-ci.yml b/.github/workflows/docker-ci.yml new file mode 100644 index 000000000000..c933202f16db --- /dev/null +++ b/.github/workflows/docker-ci.yml @@ -0,0 +1,115 @@ +name: Docker CI + +on: + push: + branches: [ master ] + pull_request: + branches: [ master ] + +concurrency: + group: ${{ format('docker-ci-{0}', github.head_ref && format('pr-{0}', github.event.pull_request.number) || github.sha) }} + cancel-in-progress: ${{ github.event_name == 'pull_request' }} + +env: + IMAGE_NAME: auto-gpt + +jobs: + build: + runs-on: ubuntu-latest + strategy: + matrix: + build-type: [release, dev] + steps: + - name: Checkout repository + uses: actions/checkout@v3 + + - name: Set up Docker Buildx + uses: docker/setup-buildx-action@v2 + + - if: runner.debug + run: | + ls -al + du -hs * + + - id: build + name: Build image + uses: docker/build-push-action@v3 + with: + build-args: BUILD_TYPE=${{ matrix.build-type }} + tags: ${{ env.IMAGE_NAME }} + load: true # save to docker images + # cache layers in GitHub Actions cache to speed up builds + cache-from: type=gha,scope=docker-${{ matrix.build-type }} + cache-to: type=gha,scope=docker-${{ matrix.build-type }},mode=max + + - name: Generate build report + env: + event_name: ${{ github.event_name }} + event_ref: ${{ github.event.ref }} + event_ref_type: ${{ github.event.ref}} + + build_type: ${{ matrix.build-type }} + + prod_branch: stable + dev_branch: master + repository: ${{ github.repository }} + base_branch: ${{ github.ref_name != 'master' && github.ref_name != 'stable' && 'master' || 'stable' }} + + current_ref: ${{ github.ref_name }} + commit_hash: ${{ github.event.after }} + source_url: ${{ format('{0}/tree/{1}', github.event.repository.url, github.event.release && github.event.release.tag_name || github.sha) }} + push_forced_label: ${{ github.event.forced && '☢️ forced' || '' }} + + new_commits_json: ${{ toJSON(github.event.commits) }} + compare_url_template: ${{ format('/{0}/compare/{{base}}...{{head}}', github.repository) }} + + github_context_json: ${{ toJSON(github) }} + job_env_json: ${{ toJSON(env) }} + vars_json: ${{ toJSON(vars) }} + + run: .github/workflows/scripts/docker-ci-summary.sh >> $GITHUB_STEP_SUMMARY + continue-on-error: true + + # Docker setup needs fixing before this is going to work: #1843 + test: + runs-on: ubuntu-latest + needs: build + steps: + - name: Checkout repository + uses: actions/checkout@v3 + + - name: Set up Docker Buildx + uses: docker/setup-buildx-action@v2 + + - id: build + name: Build image + uses: docker/build-push-action@v3 + with: + build-args: BUILD_TYPE=dev # include pytest + tags: ${{ env.IMAGE_NAME }} + load: true # save to docker images + # cache layers in GitHub Actions cache to speed up builds + cache-from: type=gha,scope=docker-dev + cache-to: type=gha,scope=docker-dev,mode=max + + - id: test + name: Run tests + env: + CI: true + OPENAI_API_KEY: ${{ secrets.OPENAI_API_KEY }} + run: | + set +e + test_output=$( + docker run --env CI --env OPENAI_API_KEY --entrypoint python ${{ env.IMAGE_NAME }} -m \ + pytest --cov=autogpt --cov-report term-missing --cov-branch --cov-report xml --cov-report term 2>&1 + ) + test_failure=$? + + echo "$test_output" + + cat << $EOF >> $GITHUB_STEP_SUMMARY + # Tests $([ $test_failure = 0 ] && echo '✅' || echo '❌') + \`\`\` + $test_output + \`\`\` + $EOF diff --git a/.github/workflows/docker-image.yml b/.github/workflows/docker-image.yml deleted file mode 100644 index d63ff1f4e765..000000000000 --- a/.github/workflows/docker-image.yml +++ /dev/null @@ -1,21 +0,0 @@ -name: Docker Image CI - -on: - push: - branches: [ "master" ] - pull_request: - branches: [ "master" ] -concurrency: - group: ${{ format('docker-ci-{0}', github.event.pull_request.number || github.sha) }} - cancel-in-progress: true - -jobs: - - build: - - runs-on: ubuntu-latest - - steps: - - uses: actions/checkout@v3 - - name: Build the Docker image - run: docker build . --build-arg BUILD_TYPE=release --tag autogpt:$(date +%s) diff --git a/.github/workflows/docker-release.yml b/.github/workflows/docker-release.yml new file mode 100644 index 000000000000..e066641f04fb --- /dev/null +++ b/.github/workflows/docker-release.yml @@ -0,0 +1,81 @@ +name: Docker Release + +on: + release: + types: [ published, edited ] + + workflow_dispatch: + inputs: + no_cache: + type: boolean + description: 'Build from scratch, without using cached layers' + +env: + IMAGE_NAME: auto-gpt + DEPLOY_IMAGE_NAME: ${{ secrets.DOCKER_USER }}/auto-gpt + +jobs: + build: + runs-on: ubuntu-latest + steps: + - name: Checkout repository + uses: actions/checkout@v3 + + - name: Log in to Docker hub + uses: docker/login-action@v2 + with: + username: ${{ secrets.DOCKER_USER }} + password: ${{ secrets.DOCKER_PASSWORD }} + + - name: Set up Docker Buildx + uses: docker/setup-buildx-action@v2 + + # slashes are not allowed in image tags, but can appear in git branch or tag names + - id: sanitize_tag + name: Sanitize image tag + run: echo tag=${raw_tag//\//-} >> $GITHUB_OUTPUT + env: + raw_tag: ${{ github.ref_name }} + + - id: build + name: Build image + uses: docker/build-push-action@v3 + with: + build-args: BUILD_TYPE=release + load: true # save to docker images + # push: true # TODO: uncomment when this issue is fixed: https://github.com/moby/buildkit/issues/1555 + tags: > + ${{ env.IMAGE_NAME }}, + ${{ env.DEPLOY_IMAGE_NAME }}:latest, + ${{ env.DEPLOY_IMAGE_NAME }}:${{ steps.sanitize_tag.outputs.tag }} + + # cache layers in GitHub Actions cache to speed up builds + cache-from: ${{ !inputs.no_cache && 'type=gha' || '' }},scope=docker-release + cache-to: type=gha,scope=docker-release,mode=max + + - name: Push image to Docker Hub + run: docker push --all-tags ${{ env.DEPLOY_IMAGE_NAME }} + + - name: Generate build report + env: + event_name: ${{ github.event_name }} + event_ref: ${{ github.event.ref }} + event_ref_type: ${{ github.event.ref}} + inputs_no_cache: ${{ inputs.no_cache }} + + prod_branch: stable + dev_branch: master + repository: ${{ github.repository }} + base_branch: ${{ github.ref_name != 'master' && github.ref_name != 'stable' && 'master' || 'stable' }} + + ref_type: ${{ github.ref_type }} + current_ref: ${{ github.ref_name }} + commit_hash: ${{ github.sha }} + source_url: ${{ format('{0}/tree/{1}', github.event.repository.url, github.event.release && github.event.release.tag_name || github.sha) }} + + github_context_json: ${{ toJSON(github) }} + job_env_json: ${{ toJSON(env) }} + vars_json: ${{ toJSON(vars) }} + + run: .github/workflows/scripts/docker-release-summary.sh >> $GITHUB_STEP_SUMMARY + continue-on-error: true diff --git a/.github/workflows/dockerhub-imagepush.yml b/.github/workflows/dockerhub-imagepush.yml deleted file mode 100644 index 165f62658daa..000000000000 --- a/.github/workflows/dockerhub-imagepush.yml +++ /dev/null @@ -1,31 +0,0 @@ -name: Push Docker Image on Release - -on: - release: - types: [published,edited] - -jobs: - - build: - - runs-on: ubuntu-latest - - steps: - - uses: actions/checkout@v3 - - name: Log in to Docker hub - env: - DOCKER_USER: ${{secrets.DOCKER_USER}} - DOCKER_PASSWORD: ${{secrets.DOCKER_PASSWORD}} - run: | - docker login -u $DOCKER_USER -p $DOCKER_PASSWORD - - name: Build the Docker image - run: | - tag_v=$(git describe --tags $(git rev-list --tags --max-count=1)) - tag=$(echo $tag_v | sed 's/v//') - docker build . --file Dockerfile --tag ${{secrets.DOCKER_USER}}/auto-gpt:${tag} - - name: Docker Push - run: | - tag_v2=$(git describe --tags $(git rev-list --tags --max-count=1)) - tag2=$(echo $tag_v | sed 's/v//') - docker push ${{secrets.DOCKER_USER}}/auto-gpt:${tag2} - diff --git a/.github/workflows/documentation.yml b/.github/workflows/documentation-release.yml similarity index 65% rename from .github/workflows/documentation.yml rename to .github/workflows/documentation-release.yml index 7a7fd784a630..ef97e1e435ce 100644 --- a/.github/workflows/documentation.yml +++ b/.github/workflows/documentation-release.yml @@ -13,17 +13,25 @@ on: permissions: contents: write + jobs: deploy: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v3 - - uses: actions/setup-python@v4 + - name: Checkout repository + uses: actions/checkout@v3 + + - name: Set up Python 3 + uses: actions/setup-python@v4 with: python-version: 3.x - - uses: actions/cache@v2 + + - name: Set up workflow cache + uses: actions/cache@v3 with: key: ${{ github.ref }} path: .cache - - run: pip install mkdocs-material + + - run: pip install mkdocs-material + - run: mkdocs gh-deploy --force diff --git a/.github/workflows/pr-label.yml b/.github/workflows/pr-label.yml index f1b200b0b387..d4e9a5e720f0 100644 --- a/.github/workflows/pr-label.yml +++ b/.github/workflows/pr-label.yml @@ -1,12 +1,15 @@ name: "Pull Request auto-label" + on: # So that PRs touching the same files as the push are updated push: + branches: [ master ] # So that the `dirtyLabel` is removed if conflicts are resolve # We recommend `pull_request_target` so that github secrets are available. # In `pull_request` we wouldn't be able to change labels of fork PRs pull_request_target: - types: [opened, synchronize] + types: [ opened, synchronize ] + concurrency: group: ${{ format('pr-label-{0}', github.event.pull_request.number || github.sha) }} cancel-in-progress: true @@ -34,15 +37,15 @@ jobs: pull-requests: write runs-on: ubuntu-latest steps: - - uses: codelytv/pr-size-labeler@v1.7.0 + - uses: codelytv/pr-size-labeler@v1 with: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - s_label: "size/s" - s_max_size: "10" - m_label: "size/m" - m_max_size: "50" - l_label: "size/l" - l_max_size: "200" - xl_label: "size/xl" - fail_if_xl: "false" - github_api_url: "api.github.com" + xs_label: 'size/xs' + xs_max_size: 2 + s_label: 'size/s' + s_max_size: 10 + m_label: 'size/m' + m_max_size: 50 + l_label: 'size/l' + l_max_size: 200 + xl_label: 'size/xl' diff --git a/.github/workflows/scripts/docker-ci-summary.sh b/.github/workflows/scripts/docker-ci-summary.sh new file mode 100755 index 000000000000..0a55293f7178 --- /dev/null +++ b/.github/workflows/scripts/docker-ci-summary.sh @@ -0,0 +1,98 @@ +#!/bin/bash +meta=$(docker image inspect "$IMAGE_NAME" | jq '.[0]') +head_compare_url=$(sed "s/{base}/$base_branch/; s/{head}/$current_ref/" <<< $compare_url_template) +ref_compare_url=$(sed "s/{base}/$base_branch/; s/{head}/$commit_hash/" <<< $compare_url_template) + +EOF=$(dd if=/dev/urandom bs=15 count=1 status=none | base64) + +cat << $EOF +# Docker Build summary 🔨 + +**Source:** branch \`$current_ref\` -> [$repository@\`${commit_hash:0:7}\`]($source_url) + +**Build type:** \`$build_type\` + +**Image size:** $((`jq -r .Size <<< $meta` / 10**6))MB + +## Image details + +**Tags:** +$(jq -r '.RepoTags | map("* `\(.)`") | join("\n")' <<< $meta) + +
+

Layers

+ +| Age | Size | Created by instruction | +| --------- | ------ | ---------------------- | +$(docker history --no-trunc --format "{{.CreatedSince}}\t{{.Size}}\t\`{{.CreatedBy}}\`\t{{.Comment}}" $IMAGE_NAME \ + | grep 'buildkit.dockerfile' `# filter for layers created in this build process`\ + | cut -f-3 `# yeet Comment column`\ + | sed 's/ ago//' `# fix Layer age`\ + | sed 's/ # buildkit//' `# remove buildkit comment from instructions`\ + | sed 's/\$/\\$/g' `# escape variable and shell expansions`\ + | sed 's/|/\\|/g' `# escape pipes so they don't interfere with column separators`\ + | column -t -s$'\t' -o' | ' `# align columns and add separator`\ + | sed 's/^/| /; s/$/ |/' `# add table row start and end pipes`) +
+ +
+

ENV

+ +| Variable | Value | +| -------- | -------- | +$(jq -r \ + '.Config.Env + | map( + split("=") + | "\(.[0]) | `\(.[1] | gsub("\\s+"; " "))`" + ) + | map("| \(.) |") + | .[]' <<< $meta +) +
+ +
+Raw metadata + +\`\`\`JSON +$meta +\`\`\` +
+ +## Build details +**Build trigger:** $push_forced_label $event_name \`$event_ref\` + +
+github context + +\`\`\`JSON +$github_context_json +\`\`\` +
+ +### Source +**HEAD:** [$repository@\`${commit_hash:0:7}\`]($source_url) on branch [$current_ref]($ref_compare_url) + +**Diff with previous HEAD:** $head_compare_url + +#### New commits +$(jq -r 'map([ + "**Commit [`\(.id[0:7])`](\(.url)) by \(if .author.username then "@"+.author.username else .author.name end):**", + .message, + (if .committer.name != .author.name then "\n> **Committer:** \(.committer.name) <\(.committer.email)>" else "" end), + "**Timestamp:** \(.timestamp)" +] | map("> \(.)\n") | join("")) | join("\n")' <<< $new_commits_json) + +### Job environment + +#### \`vars\` context: +\`\`\`JSON +$vars_json +\`\`\` + +#### \`env\` context: +\`\`\`JSON +$job_env_json +\`\`\` + +$EOF diff --git a/.github/workflows/scripts/docker-release-summary.sh b/.github/workflows/scripts/docker-release-summary.sh new file mode 100755 index 000000000000..1e00f41d4563 --- /dev/null +++ b/.github/workflows/scripts/docker-release-summary.sh @@ -0,0 +1,85 @@ +#!/bin/bash +meta=$(docker image inspect "$IMAGE_NAME" | jq '.[0]') + +EOF=$(dd if=/dev/urandom bs=15 count=1 status=none | base64) + +cat << $EOF +# Docker Release Build summary 🚀🔨 + +**Source:** $ref_type \`$current_ref\` -> [$repository@\`${commit_hash:0:7}\`]($source_url) + +**Image size:** $((`jq -r .Size <<< $meta` / 10**6))MB + +## Image details + +**Tags:** +$(jq -r '.RepoTags | map("* `\(.)`") | join("\n")' <<< $meta) + +
+

Layers

+ +| Age | Size | Created by instruction | +| --------- | ------ | ---------------------- | +$(docker history --no-trunc --format "{{.CreatedSince}}\t{{.Size}}\t\`{{.CreatedBy}}\`\t{{.Comment}}" $IMAGE_NAME \ + | grep 'buildkit.dockerfile' `# filter for layers created in this build process`\ + | cut -f-3 `# yeet Comment column`\ + | sed 's/ ago//' `# fix Layer age`\ + | sed 's/ # buildkit//' `# remove buildkit comment from instructions`\ + | sed 's/\$/\\$/g' `# escape variable and shell expansions`\ + | sed 's/|/\\|/g' `# escape pipes so they don't interfere with column separators`\ + | column -t -s$'\t' -o' | ' `# align columns and add separator`\ + | sed 's/^/| /; s/$/ |/' `# add table row start and end pipes`) +
+ +
+

ENV

+ +| Variable | Value | +| -------- | -------- | +$(jq -r \ + '.Config.Env + | map( + split("=") + | "\(.[0]) | `\(.[1] | gsub("\\s+"; " "))`" + ) + | map("| \(.) |") + | .[]' <<< $meta +) +
+ +
+Raw metadata + +\`\`\`JSON +$meta +\`\`\` +
+ +## Build details +**Build trigger:** $event_name \`$current_ref\` + +| Parameter | Value | +| -------------- | ------------ | +| \`no_cache\` | \`$inputs_no_cache\` | + +
+github context + +\`\`\`JSON +$github_context_json +\`\`\` +
+ +### Job environment + +#### \`vars\` context: +\`\`\`JSON +$vars_json +\`\`\` + +#### \`env\` context: +\`\`\`JSON +$job_env_json +\`\`\` + +$EOF diff --git a/.github/workflows/sponsors_readme.yml b/.github/workflows/sponsors_readme.yml index fffdbd4dabf9..7e51a4f820b1 100644 --- a/.github/workflows/sponsors_readme.yml +++ b/.github/workflows/sponsors_readme.yml @@ -1,14 +1,17 @@ name: Generate Sponsors README + on: workflow_dispatch: schedule: - cron: '0 */12 * * *' + jobs: deploy: runs-on: ubuntu-latest steps: - name: Checkout 🛎️ - uses: actions/checkout@v2 + uses: actions/checkout@v3 + - name: Generate Sponsors 💖 uses: JamesIves/github-sponsors-readme-action@v1 with: diff --git a/Dockerfile b/Dockerfile index 05ec1a429863..6023cefac6ae 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,9 +1,9 @@ -# Use an official Python base image from the Docker Hub -FROM python:3.10-slim - # 'dev' or 'release' container build ARG BUILD_TYPE=dev +# Use an official Python base image from the Docker Hub +FROM python:3.10-slim AS autogpt-base + # Install browsers RUN apt-get update && apt-get install -y \ chromium-driver firefox-esr \ @@ -21,13 +21,20 @@ ENV PIP_NO_CACHE_DIR=yes \ ENV PATH="$PATH:/root/.local/bin" COPY requirements.txt . -# Only install dev dependencies in dev container builds -RUN [ '${BUILD_TYPE}' = 'dev' ] || sed -i '/Items below this point will not be included in the Docker Image/,$d' requirements.txt && \ - pip install --no-cache-dir -r requirements.txt +# Set the entrypoint +ENTRYPOINT ["python", "-m", "autogpt"] -# Copy the application files +# dev build -> include everything +FROM autogpt-base as autogpt-dev +RUN pip install --no-cache-dir -r requirements.txt WORKDIR /app -COPY autogpt/ ./autogpt +ONBUILD COPY . ./ -# Set the entrypoint -ENTRYPOINT ["python", "-m", "autogpt"] +# release build -> include bare minimum +FROM autogpt-base as autogpt-release +RUN sed -i '/Items below this point will not be included in the Docker Image/,$d' requirements.txt && \ + pip install --no-cache-dir -r requirements.txt +WORKDIR /app +ONBUILD COPY autogpt/ ./autogpt + +FROM autogpt-${BUILD_TYPE} AS auto-gpt