docs/usage/cl_tutorial.md
!!! abstract "Command line basics" This tutorial walks you through running SWE-agent from the command line.
* Please read our [hello world](hello_world.md) tutorial before proceeding.
* This tutorial focuses on using SWE-agent as a tool to solve individual issues.
Benchmarking SWE-agent is covered [separately](batch_mode.md).
Finally, we have a different tutorial for using SWE-agent for [coding challenges](coding_challenges.md).
!!! tip "Mini-SWE-Agent"
Looking for a simple, no-fuzz version of SWE-agent that can also help you in your daily work?
Check out [Mini-SWE-Agent](https://mini-swe-agent.com/)!
Before we start with a more structured explanation of the command line options, here are a few examples that you might find immediately useful:
sweagent run \
--agent.model.name=gpt-4o \
--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
sweagent run \
...
--env.repo.github_url=https://github.com/SWE-agent/test-repo \
--problem_statement.text="Hey, can you fix all the bugs?"
git clone https://github.com/SWE-agent/test-repo.git
sweagent run \
--agent.model.name=claude-sonnet-4-20250514 \
--env.repo.path=test-repo \
--problem_statement.path=test-repo/problem_statements/1.md \
--env.deployment.image=python:3.12
--env.deployment.image points to the dockerhub image of the same nameFor 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:
sweagent run \
...
--env.deployment.type=modal \
--env.deployment.image=python:3.12
!!! tip "All options"
Run sweagent run --help to see all available options for run.py. This tutorial will only cover a subset of options.
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
=== "Command line"
```bash
sweagent run --config my_run.yaml
```
=== "Configuration file"
```yaml title="my_run.yaml"
agent:
model:
name: gpt-4o
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:
=== "Command line"
```bash
# Note that you need --config in front of every config file
sweagent run --config agent.yaml --config env.yaml \
--problem_statement.text="Hey, can you fix all the bugs?"
```
=== "agent.yaml"
```yaml title="agent.yaml"
agent:
model:
name: gpt-4o
per_instance_cost_limit: 2.00
```
=== "env.yaml"
```yaml title="env.yaml"
env:
repo:
github_url: https://github.com/SWE-agent/test-repo
```
!!! warning "Multiple config files"
Prior to version SWE-agent 1.1.0, configs were merged with simple dictionary updates,
rather than a hierarchical merge, so specifying agent (or any key with subkeys) in the
second config would completely overwrite all agent settings of the first config.
This is fixed since SWE-agent 1.1.0.
The default config file is config/default.yaml. Let's take a look at it:
--8<-- "config/default.yaml"
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/default.yaml
in addition to all the other --config options for the two examples above.
!!! note "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)!
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.
!!! tip "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).
<details>Example union type errors
<summary>Example union type errors</summary>
This is the output of running
```bash
sweagent run --problem_statement.path="test" --problem_statement.github_url="asdf"
```
```
--8<-- "docs/usage/union_type_error.txt"
```
</details>
If you want to read more about how this works, check out the pydantic docs.
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:
GithubRepoConfig: Pull a repository from GitHub.LocalRepoConfig: Copies a repository from your local filesystem to the docker container.PreExistingRepoConfig: If you want to use a repository that already exists on the docker container.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):
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 :material-chevron-right-circle: icon in the right margin of the code snippet to see more information about the lines.
$PATH variable.$PATH variable.
So we do it here again.--actions.apply_patch_locally to have SWE-agent apply successful solution attempts to local files.--actions.open_pr flag.
Please use this feature responsibly (on your own repositories or after careful consideration).!!! tip "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}"
{% include-markdown "../_footer.md" %}