Skip to content

Command line basics

Command line basics

This tutorial walks you through running SWE-agent from the command line.

  • Please read our hello world tutorial before proceeding.
  • This tutorial focuses on using SWE-agent as a tool to solve individual issues. Benchmarking SWE-agent is covered separately. Finally, we have a different tutorial for using SWE-agent for coding challenges.

A few examples

Before we start with a more structured explanation of the command line options, here are a few examples that you might find immediately useful:

Fix a github issue
python run.py \
  --agent.model.name=gpt4 \
  --agent.model.per_instance_cost_limit=2.00 \
  --env.repo.github_url=https://github.com/SWE-agent/test-repo \
  --problem_statement.github_url=https://github.com/SWE-agent/test-repo/issues/1
Work on a github repo with a custom problem statement
python run.py \
  ...
  --env.repo.github_url=https://github.com/SWE-agent/test-repo \
  --problem_statement.text="Hey, can you fix all the bugs?"
Fix a bug in a local repository using a custom docker image
git clone https://github.com/SWE-agent/test-repo.git
python run.py \
  --agent.model.name=claude-3.5 \
  --env.repo.path=test-repo \
  --problem_statement.path=test-repo/problem_statements/1.md \
  --env.deployment.image=python:3.12
  1. Make sure to add anthropic keys (or keys for your model provider) to the environment for this one!
  2. --env.deployment.image points to the dockerhub image of the same name

For the next example, we will use a cloud-based execution environment instead of using local docker containers. For this, you first need to set up a modal account, install the necessary extra dependencies pip install 'swe-rex[modal]', then run:

Deployment on modal (cloud-based execution)
python run.py \
  ...
  --env.deployment.type=modal \
  --env.deployment.image=python:3.12

All options

Run python run.py --help to see all available options for run.py. This tutorial will only cover a subset of options.

Configuration files

All configuration options can be specified either in one or more .yaml files, or as command line arguments. For example, our first command can be written as

python run.py --config my_run.yaml
my_run.yaml
agent:
  model:
    name: gpt4
    per_instance_cost_limit: 2.00
env:
  repo:
    github_url: https://github.com/SWE-agent/test-repo
problem_statement:
  github_url: https://github.com/SWE-agent/test-repo/issues/1

But we can also split it up into multiple files and additional command line options:

python run.py --config agent.yaml --config env.yaml \
    --problem_statement.text="Hey, can you fix all the bugs?"
agent.yaml
agent:
  model:
    name: gpt4
    per_instance_cost_limit: 2.00
env.yaml
env:
  repo:
    github_url: https://github.com/SWE-agent/test-repo

The default config file is config/anthropic_filemap.yaml. Let's take a look at it:

Example: default config anthropic_filemap.yaml
# This template is heavily inspired by anthropic's computer use demo
agent:
  templates:
    system_template: |-
      You are a helpful assistant that can interact with a computer to solve tasks.
    instance_template: |-
      <uploaded_files>
      {{working_dir}}
      </uploaded_files>
      I've uploaded a python code repository in the directory {{working_dir}}. Consider the following PR description:

      <pr_description>
      {{problem_statement}}
      </pr_description>

      Can you help me implement the necessary changes to the repository so that the requirements specified in the <pr_description> are met?
      I've already taken care of all changes to any of the test files described in the <pr_description>. This means you DON'T have to modify the testing logic or any of the tests in any way!
      Your task is to make the minimal changes to non-tests files in the {{working_dir}} directory to ensure the <pr_description> is satisfied.
      Follow these steps to resolve the issue:
      1. As a first step, it might be a good idea to find and read code relevant to the <pr_description>
      2. Create a script to reproduce the error and execute it with `python <filename.py>` using the bash tool, to confirm the error
      3. Edit the sourcecode of the repo to resolve the issue
      4. Rerun your reproduce script and confirm that the error is fixed!
      5. Think about edgecases and make sure your fix handles them as well
      Your thinking should be thorough and so it's fine if it's very long.
    next_step_template: |-
      OBSERVATION:
      {{observation}}
    next_step_no_output_template: |-
      Your command ran successfully and did not produce any output.
  tools:
    bundles:
      - path: tools/registry
      - path: tools/edit_anthropic
      - path: tools/review_on_submit_m
    registry_variables:
      USE_FILEMAP: 'true'
      SUBMIT_REVIEW_MESSAGES:
        - |
          Thank you for your work on this issue. Please carefully follow the steps below to help review your changes.

          1. If you made any changes to your code after running the reproduction script, please run the reproduction script again.
            If the reproduction script is failing, please revisit your changes and make sure they are correct.
            If you have already removed your reproduction script, please ignore this step.
          2. Remove your reproduction script (if you haven't done so already).
          3. If you have modified any TEST files, please revert them to the state they had before you started fixing the issue.
            You can do this with `git checkout -- /path/to/test/file.py`. Use below <diff> to find the files you need to revert.
          4. Run the submit command again to confirm.

          Here is a list of all of your changes:

          <diff>
          {{diff}}
          </diff>
    enable_bash_tool: true
    parse_function:
      type: function_calling
  history_processors:
    - type: cache_control
      last_n_messages: 2

As you can see, this is where all the templates are defined!

This file is also loaded when no other --config options are specified. So to make sure that we get the default templates in the above examples with --config, we should have added

--config config/anthropic_filemap.yaml

in addition to all the other --config options for the two examples above.

Problem statements and union types

Operating in batch mode: Running on SWE-bench and other benchmark sets

If you want to run SWE-agent in batch mode on SWE-bench or another whole evaluation set, see batch mode. This tutorial focuses on using SWE-agent on individual issues.

We've already seen a few examples of how to specify the problem to solve, namely

--problem_statement.data_path /path/to/problem.md
--problem_statement.repo_path /path/to/repo
--problem_statement.text="..."

Each of these types of problems can have specific configuration options.

To understand how this works, we'll need to understand union types. Running sweagent run builds up a configuration object that essentially looks like this:

agent: AgentConfig
env: EnvironmentConfig
problem_statement: TextProblemStatement | GithubIssue | FileProblemStatement  # (1)!
  1. This is a union type, meaning that the problem statement can be one of the three types.

Each of these configuration objects has its own set of options:

So how do we know which configuration object to initialize? It's simple: Each of these types has a different set of required options (e.g., github_url is required for GithubIssue, but not for TextProblemStatement). SWE-agent will automatically select the correct configuration object based on the command line options you provide.

However, you can also explicitly specify the type of problem statement you want to use by adding a --problem_statement.type option.

Union type errors

If you ever ran a SWE-agent command and got a very long error message about various configuration options not working, it is because for union types. If everything works correctly, we try to initialize every option until we find the one that works based on your inputs (for example stopping at TextProblemStatement if you provided a --problem_statement.text). However, if none of them work, we throw an error which then tells you why we cannot initialize any of the types (so it will tell you that github_url is required for GithubIssue, even though you might not even have tried to work on a GitHub issue).

Example union type errors Example union type errors

This is the output of running

sweagent run --problem_statement.path="test" --problem_statement.github_url="asdf"

╭───────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ Validation error                                                                                                  │
│                                                                                                                   │
│ The following errors are raised by Pydantic, trying to instantiate the configuration based on                     │
│ the merged configuration dictionary (see above).                                                                  │
│                                                                                                                   │
│ Every new indented block corresponds to a different error from Pydantic.                                          │
│ The first line of each block is the attribute that failed validation, the following lines are the error messages. │
│                                                                                                                   │
│ If you see many lines of errors, there are probably different ways to instantiate the same object (a union type). │
│ For example, there are different deployments with different options each. Pydantic is then trying                 │
│ one after the other and reporting the failures for each of them.                                                  │
│                                                                                                                   │
│ 8 validation errors for RunSingleConfig                                                                           │
│ agent.model                                                                                                       │
│   Field required }, input_type=dict]                                                                              │
│     For further information visit https://errors.pydantic.dev/2.9/v/missing                                       │
│ problem_statement.TextProblemStatement.text                                                                       │
│   Field required                                                                                                  │
│     For further information visit https://errors.pydantic.dev/2.9/v/missing                                       │
│ problem_statement.TextProblemStatement.path                                                                       │
│   Extra inputs are not permitted                                                                                  │
│     For further information visit https://errors.pydantic.dev/2.9/v/extra_forbidden                               │
│ problem_statement.TextProblemStatement.github_url                                                                 │
│   Extra inputs are not permitted                                                                                  │
│     For further information visit https://errors.pydantic.dev/2.9/v/extra_forbidden                               │
│ problem_statement.GithubIssue.path                                                                                │
│   Extra inputs are not permitted                                                                                  │
│     For further information visit https://errors.pydantic.dev/2.9/v/extra_forbidden                               │
│ problem_statement.EmptyProblemStatement.path                                                                      │
│   Extra inputs are not permitted                                                                                  │
│     For further information visit https://errors.pydantic.dev/2.9/v/extra_forbidden                               │
│ problem_statement.EmptyProblemStatement.github_url                                                                │
│   Extra inputs are not permitted                                                                                  │
│     For further information visit https://errors.pydantic.dev/2.9/v/extra_forbidden                               │
│ problem_statement.FileProblemStatement.github_url                                                                 │
│   Extra inputs are not permitted                                                                                  │
│     For further information visit https://errors.pydantic.dev/2.9/v/extra_forbidden                               │
╰───────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯

If you want to read more about how this works, check out the pydantic docs.

Specifying the repository

The repository can be specified in a few different ways:

--env.repo.github_url=https://github.com/SWE-agent/test-repo
--env.repo.path=/path/to/repo

Again, those are union types. See here for all the options:

Configuring the environment

We mainly recommend you to build a docker image with all the dependencies you need and then use that with --env.deployment.image. In addition, you can also execute additional commands before starting the agent with env.post_startup_commands, which takes a list of commands, e.g.,

sweagent run \
    --agent.model.name=claude-3-7-sonnet-latest \
    --env.post_startup_commands='["pip install flake8"]' \
    ...

Note the list syntax that is passed as a string using single ticks '. This is particularly important for zsh where [, ] have special meaning.

Here's an example of a custom docker environment (it's also available in the repo as docker/tiny_test.Dockerfile):

tiny_test.Dockerfile
FROM python:3.11.10-bullseye  # (1)!

ARG DEBIAN_FRONTEND=noninteractive  # (2)!
ENV TZ=Etc/UTC  # (3)!

WORKDIR /

# SWE-ReX will always attempt to install its server into your docker container
# however, this takes a couple of seconds. If we already provide it in the image,
# this is much faster.
RUN pip install pipx
RUN pipx install swe-rex  # (4)!
RUN pipx ensurepath  # (5)!

RUN pip install flake8  # (6)!

SHELL ["/bin/bash", "-c"]
# This is where pipx installs things
ENV PATH="$PATH:/root/.local/bin/"  # (7)!

Click on the icon in the right margin of the code snippet to see more information about the lines.

  1. This is the base image.
  2. This is to avoid any interactive prompts from the package manager.
  3. Again, this avoids interactive prompts
  4. SWE-ReX is our execution backend. We start a small server within the container, which receives commands from the agent and executes them.
  5. This ensures that the path where pipx installs things is in the $PATH variable.
  6. This is to install flake8, which is used by some of our edit tools.
  7. Unfortunately, step 5 sometimes still doesn't properly add the SWE-ReX server to the $PATH variable. So we do it here again.

Taking actions

  • You can use --actions.apply_patch_locally to have SWE-agent apply successful solution attempts to local files.
  • Alternatively, when running on a GitHub issue, you can have the agent automatically open a PR if the issue has been solved by supplying the --actions.open_pr flag. Please use this feature responsibly (on your own repositories or after careful consideration).

All action options

See RunSingleActionConfig for all action options.

Alternatively, you can always retrieve the patch that was generated by SWE-agent. Watch out for the following message in the log:

╭──────────────────────────── 🎉 Submission successful 🎉 ────────────────────────────╮
│ SWE-agent has produced a patch that it believes will solve the issue you submitted! │
│ Use the code snippet below to inspect or apply it!                                  │
╰─────────────────────────────────────────────────────────────────────────────────────╯

And follow the instructions below it:

 # The patch has been saved to your local filesystem at:
 PATCH_FILE_PATH='/Users/.../patches/05917d.patch'
 # Inspect it:
 cat "${PATCH_FILE_PATH}"
 # Apply it to a local repository:
 cd <your local repo root>
 git apply "${PATCH_FILE_PATH}"