mirror of
https://github.com/OpenHands/OpenHands.git
synced 2025-12-26 05:48:36 +08:00
* add draft dockerfile for build all * add rsync for build * add all-in-one docker * update prepare scripts * Update swe_env_box.py * Add swe_entry.sh (buggy now) * Parse the test command in swe_entry.sh * Update README for instance eval in sandbox * revert specialized config * replace run_as_devin as an init arg * set container & run_as_root via args * update swe entry script * update env * remove mounting * allow error after swe_entry * update swe_env_box * move file * update gitignore * get swe_env_box a working demo * support faking user response & provide sandox ahead of time; also return state for controller * tweak main to support adding controller kwargs * add module * initialize plugin for provided sandbox * add pip cache to plugin & fix jupyter kernel waiting * better print Observation output * add run infer scripts * update readme * add utility for getting diff patch * use get_diff_patch in infer * update readme * support cost tracking for codeact * add swe agent edit hack * disable color in git diff * fix git diff cmd * fix state return * support limit eval * increase t imeout and export pip cache * add eval limit config * return state when hit turn limit * save log to file; allow agent to give up * run eval with max 50 turns * add outputs to gitignore * save swe_instance & instruction * add uuid to swebench * add streamlit dep * fix save series * fix the issue where session id might be duplicated * allow setting temperature for llm (use 0 for eval) * Get report from agent running log * support evaluating task success right after inference. * remove extra log * comment out prompt for baseline * add visualizer for eval * use plaintext for instruction * reduce timeout for all; only increase timeout for init * reduce timeout for all; only increase timeout for init * ignore sid for swe env * close sandbox in each eval loop * update visualizer instruction * increase max chars * add finish action to history too * show test result in metrics * add sidebars for visualizer * also visualize swe_instance * cleanup browser when agent controller finish runinng * do not mount workspace for swe-eval to avoid accidentally overwrite files * Revert "do not mount workspace for swe-eval to avoid accidentally overwrite files" This reverts commit 8ef77390543e562e6f0a5a9992418014d8b3010c. * Revert "Revert "do not mount workspace for swe-eval to avoid accidentally overwrite files"" This reverts commit 016cfbb9f0475f32bacbad5822996b4eaff24a5e. * run jupyter command via copy to, instead of cp to mount * only print mixin output when failed * change ssh box logging * add visualizer for pass rate * add instance id to sandbox name * only remove container we created * use opendevin logger in main * support multi-processing infer * add back metadata, support keyboard interrupt * remove container with startswith * make pbar behave correctly * update instruction w/ multi-processing * show resolved rate by repo * rename tmp dir name * attempt to fix racing for copy to ssh_box * fix script * bump swe-bench-all version * fix ipython with self-contained commands * add jupyter demo to swe_env_box * make resolved count two column * increase height * do not add glob to url params * analyze obs length * print instance id prior to removal handler * add gold patch in visualizer * fix interactive git by adding a git --no-pager as alias * increase max_char to 10k to cover 98% of swe-bench obs cases * allow parsing note * prompt v2 * add iteration reminder * adjust user response * adjust order * fix return eval * fix typo * add reminder before logging * remove other resolve rate * re adjust to new folder structure * support adding eval note * fix eval note path * make sure first log of each instance is printed * add eval note * fix the display for visualizer * tweak visualizer for better git patch reading * exclude empty patch * add retry mechanism for swe_env_box start * fix ssh timeout issue * add stat field for apply test patch success * add visualization for fine-grained report * attempt to support monologue agent by constraining it to single thread * also log error msg when stopeed * save error as well * override WORKSPACE_MOUNT_PATH and WORKSPACE_BASE for monologue to work in mp * add retry mechanism for sshbox * remove retry for swe env box * try to handle loop state stopped * Add get report scripts * Add script to convert agent output to swe-bench format * Merge fine grained report for visualizer * Update eval readme * Update README.md * Add CodeAct gpt4-1106 output and eval logs on swe-bench-lite * Update the script to get model report * Update get_model_report.sh * Update get_agent_report.sh * Update report merge script * Add agent output conversion script * Update swe_lite_env_setup.sh * Add example swe-bench output files * Update eval readme * Remove redundant scripts * set iteration count down to false by default * fix: Issue where CodeAct agent was trying to log cost on local llm and throwing Undefined Model execption out of litellm (#1666) * fix: Issue where CodeAct agent was trying to log cost on local llm and throwing Undefined Model execption out of litellm * Review Feedback * Missing None Check * Review feedback and improved error handling --------- Co-authored-by: Robert Brennan <accounts@rbren.io> * fix prepare_swe_util scripts * update builder images * update setup script * remove swe-bench build workflow * update lock * remove experiments since they are moved to hf * remove visualizer (since it is moved to hf repo) * simply jupyter execution via heredoc * update ssh_box * add initial docker readme * add pkg-config as dependency * add script for swe_bench all-in-one docker * add rsync to builder * rename var * update commit * update readme * update lock * support specify timeout for long running tasks * fix path * separate building of all deps and files * support returning states at the end of controller * remove return None * support specify timeout for long running tasks * add timeout for all existing sandbox impl * fix swe_env_box for new codebase * update llm config in config.py * support pass sandbox in * remove force set * update eval script * fix issue of overriding final state * change default eval output to hf demo * change default eval output to hf demo * fix config * only close it when it is NOT external sandbox * add scripts * tweak config * only put in hostory when state has history attr * fix agent controller on the case of run out interaction budget * always assume state is always not none * remove print of final state * catch all exception when cannot compute completion cost * Update README.md * save source into json * fix path * update docker path * return the final state on close * merge AgentState with State * fix integration test * merge AgentState with State * fix integration test * add ChangeAgentStateAction to history in attempt to fix integration * add back set agent state * update tests * update tests * move scripts for setup * update script and readme for infer * do not reset logger when n processes == 1 * update eval_infer scripts and readme * simplify readme * copy over dir after eval * copy over dir after eval * directly return get state * update lock * fix output saving of infer * replace print with logger * update eval_infer script * add back the missing .close * increase timeout * copy all swe_bench_format file * attempt to fix output parsing * log git commit id as metadata * fix eval script * update lock * update unit tests * fix argparser unit test * fix lock * the deps are now lightweight enough to be incude in make build * add spaces for tests * add eval outputs to gitignore * remove git submodule * readme * tweak git email * update upload instruction * bump codeact version for eval --------- Co-authored-by: Bowen Li <libowen.ne@gmail.com> Co-authored-by: huybery <huybery@gmail.com> Co-authored-by: Bart Shappee <bshappee@gmail.com> Co-authored-by: Robert Brennan <accounts@rbren.io>
289 lines
12 KiB
Makefile
289 lines
12 KiB
Makefile
SHELL=/bin/bash
|
|
# Makefile for OpenDevin project
|
|
|
|
# Variables
|
|
DOCKER_IMAGE = ghcr.io/opendevin/sandbox
|
|
BACKEND_PORT = 3000
|
|
BACKEND_HOST = "127.0.0.1:$(BACKEND_PORT)"
|
|
FRONTEND_PORT = 3001
|
|
DEFAULT_WORKSPACE_DIR = "./workspace"
|
|
DEFAULT_MODEL = "gpt-3.5-turbo"
|
|
CONFIG_FILE = config.toml
|
|
PRECOMMIT_CONFIG_PATH = "./dev_config/python/.pre-commit-config.yaml"
|
|
|
|
# ANSI color codes
|
|
GREEN=$(shell tput -Txterm setaf 2)
|
|
YELLOW=$(shell tput -Txterm setaf 3)
|
|
RED=$(shell tput -Txterm setaf 1)
|
|
BLUE=$(shell tput -Txterm setaf 6)
|
|
RESET=$(shell tput -Txterm sgr0)
|
|
|
|
# Build
|
|
build:
|
|
@echo "$(GREEN)Building project...$(RESET)"
|
|
@$(MAKE) -s check-dependencies
|
|
ifeq ($(INSTALL_DOCKER),)
|
|
@$(MAKE) -s pull-docker-image
|
|
endif
|
|
@$(MAKE) -s install-python-dependencies
|
|
@$(MAKE) -s install-frontend-dependencies
|
|
@$(MAKE) -s install-precommit-hooks
|
|
@$(MAKE) -s build-frontend
|
|
@echo "$(GREEN)Build completed successfully.$(RESET)"
|
|
|
|
check-dependencies:
|
|
@echo "$(YELLOW)Checking dependencies...$(RESET)"
|
|
@$(MAKE) -s check-system
|
|
@$(MAKE) -s check-python
|
|
@$(MAKE) -s check-npm
|
|
@$(MAKE) -s check-nodejs
|
|
ifeq ($(INSTALL_DOCKER),)
|
|
@$(MAKE) -s check-docker
|
|
endif
|
|
@$(MAKE) -s check-poetry
|
|
@echo "$(GREEN)Dependencies checked successfully.$(RESET)"
|
|
|
|
check-system:
|
|
@echo "$(YELLOW)Checking system...$(RESET)"
|
|
@if [ "$(shell uname)" = "Darwin" ]; then \
|
|
echo "$(BLUE)macOS detected.$(RESET)"; \
|
|
elif [ "$(shell uname)" = "Linux" ]; then \
|
|
if [ -f "/etc/manjaro-release" ]; then \
|
|
echo "$(BLUE)Manjaro Linux detected.$(RESET)"; \
|
|
else \
|
|
echo "$(BLUE)Linux detected.$(RESET)"; \
|
|
fi; \
|
|
elif [ "$$(uname -r | grep -i microsoft)" ]; then \
|
|
echo "$(BLUE)Windows Subsystem for Linux detected.$(RESET)"; \
|
|
else \
|
|
echo "$(RED)Unsupported system detected. Please use macOS, Linux, or Windows Subsystem for Linux (WSL).$(RESET)"; \
|
|
exit 1; \
|
|
fi
|
|
|
|
check-python:
|
|
@echo "$(YELLOW)Checking Python installation...$(RESET)"
|
|
@if command -v python3.11 > /dev/null; then \
|
|
echo "$(BLUE)$(shell python3.11 --version) is already installed.$(RESET)"; \
|
|
else \
|
|
echo "$(RED)Python 3.11 is not installed. Please install Python 3.11 to continue.$(RESET)"; \
|
|
exit 1; \
|
|
fi
|
|
|
|
check-npm:
|
|
@echo "$(YELLOW)Checking npm installation...$(RESET)"
|
|
@if command -v npm > /dev/null; then \
|
|
echo "$(BLUE)npm $(shell npm --version) is already installed.$(RESET)"; \
|
|
else \
|
|
echo "$(RED)npm is not installed. Please install Node.js to continue.$(RESET)"; \
|
|
exit 1; \
|
|
fi
|
|
|
|
check-nodejs:
|
|
@echo "$(YELLOW)Checking Node.js installation...$(RESET)"
|
|
@if command -v node > /dev/null; then \
|
|
NODE_VERSION=$(shell node --version | sed -E 's/v//g'); \
|
|
IFS='.' read -r -a NODE_VERSION_ARRAY <<< "$$NODE_VERSION"; \
|
|
if [ "$${NODE_VERSION_ARRAY[0]}" -gt 18 ] || ([ "$${NODE_VERSION_ARRAY[0]}" -eq 18 ] && [ "$${NODE_VERSION_ARRAY[1]}" -gt 17 ]) || ([ "$${NODE_VERSION_ARRAY[0]}" -eq 18 ] && [ "$${NODE_VERSION_ARRAY[1]}" -eq 17 ] && [ "$${NODE_VERSION_ARRAY[2]}" -ge 1 ]); then \
|
|
echo "$(BLUE)Node.js $$NODE_VERSION is already installed.$(RESET)"; \
|
|
else \
|
|
echo "$(RED)Node.js 18.17.1 or later is required. Please install Node.js 18.17.1 or later to continue.$(RESET)"; \
|
|
exit 1; \
|
|
fi; \
|
|
else \
|
|
echo "$(RED)Node.js is not installed. Please install Node.js to continue.$(RESET)"; \
|
|
exit 1; \
|
|
fi
|
|
|
|
check-docker:
|
|
@echo "$(YELLOW)Checking Docker installation...$(RESET)"
|
|
@if command -v docker > /dev/null; then \
|
|
echo "$(BLUE)$(shell docker --version) is already installed.$(RESET)"; \
|
|
else \
|
|
echo "$(RED)Docker is not installed. Please install Docker to continue.$(RESET)"; \
|
|
exit 1; \
|
|
fi
|
|
|
|
check-poetry:
|
|
@echo "$(YELLOW)Checking Poetry installation...$(RESET)"
|
|
@if command -v poetry > /dev/null; then \
|
|
POETRY_VERSION=$(shell poetry --version 2>&1 | sed -E 's/Poetry \(version ([0-9]+\.[0-9]+\.[0-9]+)\)/\1/'); \
|
|
IFS='.' read -r -a POETRY_VERSION_ARRAY <<< "$$POETRY_VERSION"; \
|
|
if [ $${POETRY_VERSION_ARRAY[0]} -ge 1 ] && [ $${POETRY_VERSION_ARRAY[1]} -ge 8 ]; then \
|
|
echo "$(BLUE)$(shell poetry --version) is already installed.$(RESET)"; \
|
|
else \
|
|
echo "$(RED)Poetry 1.8 or later is required. You can install poetry by running the following command, then adding Poetry to your PATH:"; \
|
|
echo "$(RED) curl -sSL https://install.python-poetry.org | python3 -$(RESET)"; \
|
|
echo "$(RED)More detail here: https://python-poetry.org/docs/#installing-with-the-official-installer$(RESET)"; \
|
|
exit 1; \
|
|
fi; \
|
|
else \
|
|
echo "$(RED)Poetry is not installed. You can install poetry by running the following command, then adding Poetry to your PATH:"; \
|
|
echo "$(RED) curl -sSL https://install.python-poetry.org | python3.11 -$(RESET)"; \
|
|
echo "$(RED)More detail here: https://python-poetry.org/docs/#installing-with-the-official-installer$(RESET)"; \
|
|
exit 1; \
|
|
fi
|
|
|
|
pull-docker-image:
|
|
@echo "$(YELLOW)Pulling Docker image...$(RESET)"
|
|
@docker pull $(DOCKER_IMAGE)
|
|
@echo "$(GREEN)Docker image pulled successfully.$(RESET)"
|
|
|
|
install-python-dependencies:
|
|
@echo "$(GREEN)Installing Python dependencies...$(RESET)"
|
|
@if [ "$(shell uname)" = "Darwin" ]; then \
|
|
echo "$(BLUE)Installing `chroma-hnswlib`...$(RESET)"; \
|
|
export HNSWLIB_NO_NATIVE=1; \
|
|
poetry run pip install chroma-hnswlib; \
|
|
fi
|
|
@poetry install
|
|
@if [ -f "/etc/manjaro-release" ]; then \
|
|
echo "$(BLUE)Detected Manjaro Linux. Installing Playwright dependencies...$(RESET)"; \
|
|
poetry run pip install playwright; \
|
|
poetry run playwright install chromium; \
|
|
else \
|
|
poetry run playwright install --with-deps chromium; \
|
|
fi
|
|
@echo "$(GREEN)Python dependencies installed successfully.$(RESET)"
|
|
|
|
install-frontend-dependencies:
|
|
@echo "$(YELLOW)Setting up frontend environment...$(RESET)"
|
|
@echo "$(YELLOW)Detect Node.js version...$(RESET)"
|
|
@cd frontend && node ./scripts/detect-node-version.js
|
|
@cd frontend && \
|
|
echo "$(BLUE)Installing frontend dependencies with npm...$(RESET)" && \
|
|
npm install && \
|
|
echo "$(BLUE)Running make-i18n with npm...$(RESET)" && \
|
|
npm run make-i18n
|
|
@echo "$(GREEN)Frontend dependencies installed successfully.$(RESET)"
|
|
|
|
install-precommit-hooks:
|
|
@echo "$(YELLOW)Installing pre-commit hooks...$(RESET)"
|
|
@git config --unset-all core.hooksPath || true
|
|
@poetry run pre-commit install --config $(PRECOMMIT_CONFIG_PATH)
|
|
@echo "$(GREEN)Pre-commit hooks installed successfully.$(RESET)"
|
|
|
|
lint-backend:
|
|
@echo "$(YELLOW)Running linters...$(RESET)"
|
|
@poetry run pre-commit run --files $$(git diff --name-only $$(git merge-base main $$(git branch --show-current)) $$(git branch --show-current) | tr '\n' ' ') --show-diff-on-failure --config $(PRECOMMIT_CONFIG_PATH)
|
|
|
|
lint-frontend:
|
|
@echo "$(YELLOW)Running linters for frontend...$(RESET)"
|
|
@cd frontend && npm run lint
|
|
|
|
lint:
|
|
@$(MAKE) -s lint-frontend
|
|
@$(MAKE) -s lint-backend
|
|
|
|
test-frontend:
|
|
@echo "$(YELLOW)Running tests for frontend...$(RESET)"
|
|
@cd frontend && npm run test
|
|
|
|
test:
|
|
@$(MAKE) -s test-frontend
|
|
|
|
build-frontend:
|
|
@echo "$(YELLOW)Building frontend...$(RESET)"
|
|
@cd frontend && npm run build
|
|
|
|
# Start backend
|
|
start-backend:
|
|
@echo "$(YELLOW)Starting backend...$(RESET)"
|
|
@poetry run uvicorn opendevin.server.listen:app --port $(BACKEND_PORT) --reload --reload-exclude "workspace/*"
|
|
|
|
# Start frontend
|
|
start-frontend:
|
|
@echo "$(YELLOW)Starting frontend...$(RESET)"
|
|
@cd frontend && VITE_BACKEND_HOST=$(BACKEND_HOST) VITE_FRONTEND_PORT=$(FRONTEND_PORT) npm run start
|
|
|
|
# Run the app
|
|
run:
|
|
@echo "$(YELLOW)Running the app...$(RESET)"
|
|
@if [ "$(OS)" = "Windows_NT" ]; then \
|
|
echo "$(RED)`make run` is not supported on Windows. Please run `make start-frontend` and `make start-backend` separately.$(RESET)"; \
|
|
exit 1; \
|
|
fi
|
|
@mkdir -p logs
|
|
@echo "$(YELLOW)Starting backend server...$(RESET)"
|
|
@poetry run uvicorn opendevin.server.listen:app --port $(BACKEND_PORT) &
|
|
@echo "$(YELLOW)Waiting for the backend to start...$(RESET)"
|
|
@until nc -z localhost $(BACKEND_PORT); do sleep 0.1; done
|
|
@echo "$(GREEN)Backend started successfully.$(RESET)"
|
|
@cd frontend && echo "$(BLUE)Starting frontend with npm...$(RESET)" && npm run start -- --port $(FRONTEND_PORT)
|
|
@echo "$(GREEN)Application started successfully.$(RESET)"
|
|
|
|
# Setup config.toml
|
|
setup-config:
|
|
@echo "$(YELLOW)Setting up config.toml...$(RESET)"
|
|
@$(MAKE) setup-config-prompts
|
|
@mv $(CONFIG_FILE).tmp $(CONFIG_FILE)
|
|
@echo "$(GREEN)Config.toml setup completed.$(RESET)"
|
|
|
|
setup-config-prompts:
|
|
@echo "[core]" > $(CONFIG_FILE).tmp
|
|
|
|
@read -p "Enter your workspace directory [default: $(DEFAULT_WORKSPACE_DIR)]: " workspace_dir; \
|
|
workspace_dir=$${workspace_dir:-$(DEFAULT_WORKSPACE_DIR)}; \
|
|
echo "workspace_base=\"$$workspace_dir\"" >> $(CONFIG_FILE).tmp
|
|
|
|
@echo "" >> $(CONFIG_FILE).tmp
|
|
|
|
@echo "[llm]" >> $(CONFIG_FILE).tmp
|
|
@read -p "Enter your LLM model name, used for running without UI. Set the model in the UI after you start the app. (see https://docs.litellm.ai/docs/providers for full list) [default: $(DEFAULT_MODEL)]: " llm_model; \
|
|
llm_model=$${llm_model:-$(DEFAULT_MODEL)}; \
|
|
echo "model=\"$$llm_model\"" >> $(CONFIG_FILE).tmp
|
|
|
|
@read -p "Enter your LLM api key: " llm_api_key; \
|
|
echo "api_key=\"$$llm_api_key\"" >> $(CONFIG_FILE).tmp
|
|
|
|
@read -p "Enter your LLM base URL [mostly used for local LLMs, leave blank if not needed - example: http://localhost:5001/v1/]: " llm_base_url; \
|
|
if [[ ! -z "$$llm_base_url" ]]; then echo "base_url=\"$$llm_base_url\"" >> $(CONFIG_FILE).tmp; fi
|
|
|
|
@echo "Enter your LLM Embedding Model"; \
|
|
echo "Choices are:"; \
|
|
echo " - openai"; \
|
|
echo " - azureopenai"; \
|
|
echo " - Embeddings available only with OllamaEmbedding:"; \
|
|
echo " - llama2"; \
|
|
echo " - mxbai-embed-large"; \
|
|
echo " - nomic-embed-text"; \
|
|
echo " - all-minilm"; \
|
|
echo " - stable-code"; \
|
|
echo " - Leave blank to default to 'BAAI/bge-small-en-v1.5' via huggingface"; \
|
|
read -p "> " llm_embedding_model; \
|
|
echo "embedding_model=\"$$llm_embedding_model\"" >> $(CONFIG_FILE).tmp; \
|
|
if [ "$$llm_embedding_model" = "llama2" ] || [ "$$llm_embedding_model" = "mxbai-embed-large" ] || [ "$$llm_embedding_model" = "nomic-embed-text" ] || [ "$$llm_embedding_model" = "all-minilm" ] || [ "$$llm_embedding_model" = "stable-code" ]; then \
|
|
read -p "Enter the local model URL for the embedding model (will set llm.embedding_base_url): " llm_embedding_base_url; \
|
|
echo "embedding_base_url=\"$$llm_embedding_base_url\"" >> $(CONFIG_FILE).tmp; \
|
|
elif [ "$$llm_embedding_model" = "azureopenai" ]; then \
|
|
read -p "Enter the Azure endpoint URL (will overwrite llm.base_url): " llm_base_url; \
|
|
echo "base_url=\"$$llm_base_url\"" >> $(CONFIG_FILE).tmp; \
|
|
read -p "Enter the Azure LLM Embedding Deployment Name: " llm_embedding_deployment_name; \
|
|
echo "embedding_deployment_name=\"$$llm_embedding_deployment_name\"" >> $(CONFIG_FILE).tmp; \
|
|
read -p "Enter the Azure API Version: " llm_api_version; \
|
|
echo "api_version=\"$$llm_api_version\"" >> $(CONFIG_FILE).tmp; \
|
|
fi
|
|
|
|
|
|
# Clean up all caches
|
|
clean:
|
|
@echo "$(YELLOW)Cleaning up caches...$(RESET)"
|
|
@rm -rf opendevin/.cache
|
|
@echo "$(GREEN)Caches cleaned up successfully.$(RESET)"
|
|
|
|
# Help
|
|
help:
|
|
@echo "$(BLUE)Usage: make [target]$(RESET)"
|
|
@echo "Targets:"
|
|
@echo " $(GREEN)build$(RESET) - Build project, including environment setup and dependencies."
|
|
@echo " $(GREEN)lint$(RESET) - Run linters on the project."
|
|
@echo " $(GREEN)setup-config$(RESET) - Setup the configuration for OpenDevin by providing LLM API key,"
|
|
@echo " LLM Model name, and workspace directory."
|
|
@echo " $(GREEN)start-backend$(RESET) - Start the backend server for the OpenDevin project."
|
|
@echo " $(GREEN)start-frontend$(RESET) - Start the frontend server for the OpenDevin project."
|
|
@echo " $(GREEN)run$(RESET) - Run the OpenDevin application, starting both backend and frontend servers."
|
|
@echo " Backend Log file will be stored in the 'logs' directory."
|
|
@echo " $(GREEN)help$(RESET) - Display this help message, providing information on available targets."
|
|
|
|
# Phony targets
|
|
.PHONY: build check-dependencies check-python check-npm check-docker check-poetry pull-docker-image install-python-dependencies install-frontend-dependencies install-precommit-hooks lint start-backend start-frontend run setup-config setup-config-prompts help
|