@elizaos/sweagent-root 2.0.0-alpha
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +270 -0
- package/package.json +71 -0
- package/python/LICENSE +21 -0
- package/python/config/README.md +15 -0
- package/python/config/bash_only.yaml +222 -0
- package/python/config/benchmarks/250212_sweagent_heavy_sbl.yaml +188 -0
- package/python/config/benchmarks/250225_anthropic_filemap_simple_review.yaml +75 -0
- package/python/config/benchmarks/250522_anthropic_filemap_simple_review.yaml +92 -0
- package/python/config/benchmarks/250526_anthropic_filemap_simple_review_sbl.yaml +93 -0
- package/python/config/benchmarks/anthropic_filemap_multilingual.yaml +66 -0
- package/python/config/coding_challenge.yaml +104 -0
- package/python/config/default.yaml +69 -0
- package/python/config/default_backticks.yaml +69 -0
- package/python/config/default_mm_no_images.yaml +82 -0
- package/python/config/default_mm_with_images.yaml +83 -0
- package/python/config/demo/default.yaml +80 -0
- package/python/config/demo/no_instructions.yaml +69 -0
- package/python/config/demo/only_bash.yaml +60 -0
- package/python/config/exotic/default_shell.yaml +52 -0
- package/python/config/exotic/windowed_replace.yaml +125 -0
- package/python/config/exotic/windowed_replace_late_repro.yaml +127 -0
- package/python/config/human/human.yaml +24 -0
- package/python/config/human/human_demo.yaml +52 -0
- package/python/config/sweagent_0_7/07.yaml +101 -0
- package/python/config/sweagent_0_7/07_fcalling.yaml +100 -0
- package/python/config/sweagent_0_7/07_from_url.yaml +114 -0
- package/python/config/sweagent_0_7/07_thought_action.yaml +102 -0
- package/python/config/sweagent_0_7/07_thought_action_xml.yaml +96 -0
- package/python/mlc_config.json +44 -0
- package/python/pyproject.toml +262 -0
- package/python/sweagent/__init__.py +114 -0
- package/python/sweagent/__main__.py +4 -0
- package/python/sweagent/agent/__init__.py +0 -0
- package/python/sweagent/agent/action_sampler.py +317 -0
- package/python/sweagent/agent/agents.py +1294 -0
- package/python/sweagent/agent/extra/shell_agent.py +106 -0
- package/python/sweagent/agent/history_processors.py +399 -0
- package/python/sweagent/agent/hooks/__init__.py +0 -0
- package/python/sweagent/agent/hooks/abstract.py +139 -0
- package/python/sweagent/agent/hooks/status.py +34 -0
- package/python/sweagent/agent/models.py +896 -0
- package/python/sweagent/agent/problem_statement.py +312 -0
- package/python/sweagent/agent/reviewer.py +664 -0
- package/python/sweagent/environment/__init__.py +0 -0
- package/python/sweagent/environment/hooks/__init__.py +0 -0
- package/python/sweagent/environment/hooks/abstract.py +60 -0
- package/python/sweagent/environment/hooks/status.py +28 -0
- package/python/sweagent/environment/repo.py +219 -0
- package/python/sweagent/environment/swe_env.py +276 -0
- package/python/sweagent/exceptions.py +54 -0
- package/python/sweagent/inspector/README.md +6 -0
- package/python/sweagent/inspector/__init__.py +0 -0
- package/python/sweagent/inspector/favicon.ico +0 -0
- package/python/sweagent/inspector/fileViewer.js +354 -0
- package/python/sweagent/inspector/icons/computer.png +0 -0
- package/python/sweagent/inspector/icons/edit_icon.svg +11 -0
- package/python/sweagent/inspector/icons/swe-agent-logo-50.png +0 -0
- package/python/sweagent/inspector/icons/swellama_blue.png +0 -0
- package/python/sweagent/inspector/icons/swellama_brown.png +0 -0
- package/python/sweagent/inspector/icons/swellama_grey.png +0 -0
- package/python/sweagent/inspector/icons/swellama_tan.png +0 -0
- package/python/sweagent/inspector/index.html +25 -0
- package/python/sweagent/inspector/server.py +354 -0
- package/python/sweagent/inspector/static.py +169 -0
- package/python/sweagent/inspector/style.css +454 -0
- package/python/sweagent/run/__init__.py +0 -0
- package/python/sweagent/run/_progress.py +158 -0
- package/python/sweagent/run/batch_instances.py +419 -0
- package/python/sweagent/run/common.py +387 -0
- package/python/sweagent/run/compare_runs.py +123 -0
- package/python/sweagent/run/extract_pred.py +19 -0
- package/python/sweagent/run/hooks/__init__.py +0 -0
- package/python/sweagent/run/hooks/abstract.py +67 -0
- package/python/sweagent/run/hooks/apply_patch.py +106 -0
- package/python/sweagent/run/hooks/open_pr.py +244 -0
- package/python/sweagent/run/hooks/swe_bench_evaluate.py +113 -0
- package/python/sweagent/run/inspector_cli.py +493 -0
- package/python/sweagent/run/merge_predictions.py +64 -0
- package/python/sweagent/run/quick_stats.py +96 -0
- package/python/sweagent/run/remove_unfinished.py +63 -0
- package/python/sweagent/run/rich_test.py +91 -0
- package/python/sweagent/run/run.py +147 -0
- package/python/sweagent/run/run_batch.py +442 -0
- package/python/sweagent/run/run_replay.py +219 -0
- package/python/sweagent/run/run_shell.py +155 -0
- package/python/sweagent/run/run_single.py +225 -0
- package/python/sweagent/run/run_traj_to_demo.py +85 -0
- package/python/sweagent/tools/__init__.py +0 -0
- package/python/sweagent/tools/bundle.py +57 -0
- package/python/sweagent/tools/commands.py +220 -0
- package/python/sweagent/tools/parsing.py +619 -0
- package/python/sweagent/tools/tools.py +430 -0
- package/python/sweagent/tools/utils.py +108 -0
- package/python/sweagent/types.py +102 -0
- package/python/sweagent/utils/__init__.py +0 -0
- package/python/sweagent/utils/config.py +80 -0
- package/python/sweagent/utils/files.py +27 -0
- package/python/sweagent/utils/github.py +118 -0
- package/python/sweagent/utils/jinja_warnings.py +14 -0
- package/python/sweagent/utils/log.py +175 -0
- package/python/sweagent/utils/patch_formatter.py +152 -0
- package/python/sweagent/utils/serialization.py +45 -0
- package/python/tests/__init__.py +0 -0
- package/python/tests/conftest.py +191 -0
- package/python/tests/test_agent.py +258 -0
- package/python/tests/test_batch_instance.py +43 -0
- package/python/tests/test_commands/_interactive_dummy.py +35 -0
- package/python/tests/test_commands/interactive_dummy_wrapper.sh +29 -0
- package/python/tests/test_data/config_files/dummy_interactive.yaml +62 -0
- package/python/tests/test_data/data_sources/ctf/crypto/Katy/Dockerfile +20 -0
- package/python/tests/test_data/data_sources/ctf/crypto/Katy/README.md +13 -0
- package/python/tests/test_data/data_sources/ctf/crypto/Katy/challenge.json +12 -0
- package/python/tests/test_data/data_sources/ctf/crypto/Katy/customrandom.c +50 -0
- package/python/tests/test_data/data_sources/ctf/crypto/Katy/docker-compose.yml +14 -0
- package/python/tests/test_data/data_sources/ctf/crypto/Katy/release +0 -0
- package/python/tests/test_data/data_sources/ctf/crypto/Katy/server +0 -0
- package/python/tests/test_data/data_sources/ctf/crypto/Katy/solver.py +12 -0
- package/python/tests/test_data/data_sources/ctf/forensics/flash/README.md +16 -0
- package/python/tests/test_data/data_sources/ctf/forensics/flash/challenge.json +9 -0
- package/python/tests/test_data/data_sources/ctf/forensics/flash/flash_c8429a430278283c0e571baebca3d139.zip +0 -0
- package/python/tests/test_data/data_sources/ctf/misc/networking_1/README.md +15 -0
- package/python/tests/test_data/data_sources/ctf/misc/networking_1/challenge.json +10 -0
- package/python/tests/test_data/data_sources/ctf/misc/networking_1/networking.pcap +0 -0
- package/python/tests/test_data/data_sources/ctf/pwn/warmup/Dockerfile +28 -0
- package/python/tests/test_data/data_sources/ctf/pwn/warmup/README.md +14 -0
- package/python/tests/test_data/data_sources/ctf/pwn/warmup/challenge.json +14 -0
- package/python/tests/test_data/data_sources/ctf/pwn/warmup/docker-compose.yml +14 -0
- package/python/tests/test_data/data_sources/ctf/pwn/warmup/flag.txt +1 -0
- package/python/tests/test_data/data_sources/ctf/pwn/warmup/warmup +0 -0
- package/python/tests/test_data/data_sources/ctf/pwn/warmup/warmup.c +26 -0
- package/python/tests/test_data/data_sources/ctf/pwn/warmup/warmup.py +9 -0
- package/python/tests/test_data/data_sources/ctf/rev/rock/README.md +14 -0
- package/python/tests/test_data/data_sources/ctf/rev/rock/challenge.json +8 -0
- package/python/tests/test_data/data_sources/ctf/rev/rock/rock +0 -0
- package/python/tests/test_data/data_sources/ctf/rev/rock/rock.cpp +167 -0
- package/python/tests/test_data/data_sources/ctf/rev/rock/solution.cpp +24 -0
- package/python/tests/test_data/data_sources/ctf/rev/rock/test_solver/solution.py +6 -0
- package/python/tests/test_data/data_sources/ctf/rev/rock/test_solver/test.sh +10 -0
- package/python/tests/test_data/data_sources/ctf/web/i_got_id_demo/000-default.conf +18 -0
- package/python/tests/test_data/data_sources/ctf/web/i_got_id_demo/Dockerfile +20 -0
- package/python/tests/test_data/data_sources/ctf/web/i_got_id_demo/cgi/file.pl +38 -0
- package/python/tests/test_data/data_sources/ctf/web/i_got_id_demo/cgi/forms.pl +40 -0
- package/python/tests/test_data/data_sources/ctf/web/i_got_id_demo/cgi/hello.pl +11 -0
- package/python/tests/test_data/data_sources/ctf/web/i_got_id_demo/challenge.json +12 -0
- package/python/tests/test_data/data_sources/ctf/web/i_got_id_demo/docker-compose.yml +14 -0
- package/python/tests/test_data/data_sources/ctf/web/i_got_id_demo/flag +1 -0
- package/python/tests/test_data/data_sources/ctf/web/i_got_id_demo/index.html +11 -0
- package/python/tests/test_data/data_sources/ctf/web/i_got_id_demo/solution.txt +1 -0
- package/python/tests/test_data/data_sources/debug_20240322.json +1 -0
- package/python/tests/test_data/data_sources/expert_instances.yaml +16 -0
- package/python/tests/test_data/data_sources/human_eval.json +1 -0
- package/python/tests/test_data/data_sources/simple_instances.yaml +3 -0
- package/python/tests/test_data/data_sources/simple_instances_long.yaml +30 -0
- package/python/tests/test_data/data_sources/swe-bench-dev-easy.json +1 -0
- package/python/tests/test_data/data_sources/swe-bench-dev-easy_first_only.json +1 -0
- package/python/tests/test_data/data_sources/swe-bench-lite-test.json +1 -0
- package/python/tests/test_data/trajectories/gpt4__swe-agent-test-repo__default_from_url__t-0.00__p-0.95__c-3.00__install-1/6e44b9__sweagenttestrepo-1c2844.traj +342 -0
- package/python/tests/test_data/trajectories/gpt4__swe-agent-test-repo__default_from_url__t-0.00__p-0.95__c-3.00__install-1/solution_missing_colon.py +15 -0
- package/python/tests/test_data/trajectories/gpt4__swe-agent__test-repo__default_from_url__t-0.00__p-0.95__c-3.00__install-1/args.yaml +518 -0
- package/python/tests/test_data/trajectories/gpt4__swe-agent__test-repo__default_from_url__t-0.00__p-0.95__c-3.00__install-1/swe-agent__test-repo-i1.traj +124 -0
- package/python/tests/test_data/trajectories/gpt4__swe-bench-dev-easy_first_only__default__t-0.00__p-0.95__c-3.00__install-1/all_preds.jsonl +1 -0
- package/python/tests/test_data/trajectories/gpt4__swe-bench-dev-easy_first_only__default__t-0.00__p-0.95__c-3.00__install-1/args.yaml +520 -0
- package/python/tests/test_data/trajectories/gpt4__swe-bench-dev-easy_first_only__default__t-0.00__p-0.95__c-3.00__install-1/patches/pydicom__pydicom-1458.patch +18 -0
- package/python/tests/test_data/trajectories/gpt4__swe-bench-dev-easy_first_only__default__t-0.00__p-0.95__c-3.00__install-1/pydicom__pydicom-1458.traj +257 -0
- package/python/tests/test_env.py +66 -0
- package/python/tests/test_env_utils.py +129 -0
- package/python/tests/test_history_processors.py +40 -0
- package/python/tests/test_models.py +23 -0
- package/python/tests/test_openai_live.py +164 -0
- package/python/tests/test_packaging.py +7 -0
- package/python/tests/test_parsing.py +131 -0
- package/python/tests/test_problem_statement_multimodal.py +111 -0
- package/python/tests/test_quick_stats.py +42 -0
- package/python/tests/test_run.py +37 -0
- package/python/tests/test_run_batch.py +110 -0
- package/python/tests/test_run_hooks.py +114 -0
- package/python/tests/test_run_replay.py +33 -0
- package/python/tests/test_run_single.py +125 -0
- package/python/tests/test_tools_command_parsing.py +193 -0
- package/python/tests/test_utils.py +15 -0
- package/python/tests/tools/__init__.py +0 -0
- package/python/tests/tools/conftest.py +12 -0
- package/python/tests/tools/test_default_utils.py +153 -0
- package/python/tests/tools/test_edit_replace.py +0 -0
- package/python/tests/tools/test_split_string.py +82 -0
- package/python/tests/utils.py +29 -0
- package/python/tools/diff_state/bin/_state_diff_state +52 -0
- package/python/tools/diff_state/config.yaml +2 -0
- package/python/tools/edit_anthropic/bin/_state_anthropic +21 -0
- package/python/tools/edit_anthropic/bin/str_replace_editor +710 -0
- package/python/tools/edit_anthropic/config.yaml +56 -0
- package/python/tools/edit_anthropic/install.sh +3 -0
- package/python/tools/filemap/bin/filemap +45 -0
- package/python/tools/filemap/config.yaml +9 -0
- package/python/tools/filemap/install.sh +2 -0
- package/python/tools/forfeit/bin/exit_forfeit +5 -0
- package/python/tools/forfeit/config.yaml +5 -0
- package/python/tools/image_tools/bin/view_image +36 -0
- package/python/tools/image_tools/config.yaml +9 -0
- package/python/tools/multilingual_setup/bin/do_nothing +2 -0
- package/python/tools/multilingual_setup/config.yaml +1 -0
- package/python/tools/multilingual_setup/install.sh +45 -0
- package/python/tools/registry/bin/_read_env +10 -0
- package/python/tools/registry/bin/_write_env +10 -0
- package/python/tools/registry/config.yaml +1 -0
- package/python/tools/registry/install.sh +6 -0
- package/python/tools/registry/lib/__init__.py +0 -0
- package/python/tools/registry/lib/registry.py +56 -0
- package/python/tools/review_on_submit_m/README.md +6 -0
- package/python/tools/review_on_submit_m/bin/submit +54 -0
- package/python/tools/review_on_submit_m/config.yaml +6 -0
- package/python/tools/review_on_submit_m/install.sh +0 -0
- package/python/tools/search/bin/find_file +31 -0
- package/python/tools/search/bin/search_dir +39 -0
- package/python/tools/search/bin/search_file +55 -0
- package/python/tools/search/config.yaml +37 -0
- package/python/tools/search/install.sh +3 -0
- package/python/tools/submit/bin/submit +17 -0
- package/python/tools/submit/config.yaml +5 -0
- package/python/tools/web_browser/bin/click_mouse +41 -0
- package/python/tools/web_browser/bin/close_site +28 -0
- package/python/tools/web_browser/bin/double_click_mouse +37 -0
- package/python/tools/web_browser/bin/drag_mouse +46 -0
- package/python/tools/web_browser/bin/execute_script_on_page +39 -0
- package/python/tools/web_browser/bin/get_console_output +48 -0
- package/python/tools/web_browser/bin/move_mouse +35 -0
- package/python/tools/web_browser/bin/navigate_back +33 -0
- package/python/tools/web_browser/bin/navigate_forward +33 -0
- package/python/tools/web_browser/bin/open_site +36 -0
- package/python/tools/web_browser/bin/press_keys_on_page +51 -0
- package/python/tools/web_browser/bin/reload_page +33 -0
- package/python/tools/web_browser/bin/run_web_browser_server +394 -0
- package/python/tools/web_browser/bin/screenshot_site +38 -0
- package/python/tools/web_browser/bin/scroll_on_page +40 -0
- package/python/tools/web_browser/bin/set_browser_window_size +40 -0
- package/python/tools/web_browser/bin/type_text +34 -0
- package/python/tools/web_browser/bin/wait_time +39 -0
- package/python/tools/web_browser/config.yaml +155 -0
- package/python/tools/web_browser/install.sh +22 -0
- package/python/tools/web_browser/lib/browser_manager.py +404 -0
- package/python/tools/web_browser/lib/web_browser_config.py +33 -0
- package/python/tools/web_browser/lib/web_browser_utils.py +126 -0
- package/python/tools/web_browser/test_console.html +1 -0
- package/python/tools/windowed/bin/_state +25 -0
- package/python/tools/windowed/bin/create +29 -0
- package/python/tools/windowed/bin/goto +37 -0
- package/python/tools/windowed/bin/open +49 -0
- package/python/tools/windowed/bin/scroll_down +12 -0
- package/python/tools/windowed/bin/scroll_up +13 -0
- package/python/tools/windowed/config.yaml +38 -0
- package/python/tools/windowed/install.sh +15 -0
- package/python/tools/windowed/lib/__init__.py +0 -0
- package/python/tools/windowed/lib/flake8_utils.py +147 -0
- package/python/tools/windowed/lib/windowed_file.py +312 -0
- package/python/tools/windowed_edit_linting/bin/edit +128 -0
- package/python/tools/windowed_edit_linting/config.yaml +31 -0
- package/python/tools/windowed_edit_linting/install.sh +5 -0
- package/python/tools/windowed_edit_replace/bin/edit +172 -0
- package/python/tools/windowed_edit_replace/bin/insert +77 -0
- package/python/tools/windowed_edit_replace/config.yaml +60 -0
- package/python/tools/windowed_edit_replace/install.sh +5 -0
- package/python/tools/windowed_edit_rewrite/bin/edit +78 -0
- package/python/tools/windowed_edit_rewrite/config.yaml +11 -0
- package/python/tools/windowed_edit_rewrite/install.sh +5 -0
- package/python/trajectories/demonstrations/ctf/crypto/BabyEncryption.traj +318 -0
- package/python/trajectories/demonstrations/ctf/crypto/BabyTimeCapsule.traj +197 -0
- package/python/trajectories/demonstrations/ctf/crypto/eps.traj +289 -0
- package/python/trajectories/demonstrations/ctf/crypto/katy.traj +368 -0
- package/python/trajectories/demonstrations/ctf/forensics/flash.traj +102 -0
- package/python/trajectories/demonstrations/ctf/misc/networking_1.traj +102 -0
- package/python/trajectories/demonstrations/ctf/pwn/warmup.traj +159 -0
- package/python/trajectories/demonstrations/ctf/rev/rock.traj +251 -0
- package/python/trajectories/demonstrations/ctf/web/i_got_id_demo.traj +422 -0
- package/python/trajectories/demonstrations/function_calling_simple.traj +151 -0
- package/python/trajectories/demonstrations/human_thought__swe-bench-HumanEvalFix-python__lcb__t-0.00__p-0.95__c-4.00__install-0/humanevalfix-python-0.traj +129 -0
- package/python/trajectories/demonstrations/replay__marshmallow-code__marshmallow-1867__default__t-0.20__p-0.95__c-2.00__install-1___install_from_source/marshmallow-code__marshmallow-1867.traj +318 -0
- package/python/trajectories/demonstrations/replay__marshmallow-code__marshmallow-1867__default_sys-env_cursors_window100__t-0.20__p-0.95__c-2.00__install-1/marshmallow-code__marshmallow-1867.traj +251 -0
- package/python/trajectories/demonstrations/replay__marshmallow-code__marshmallow-1867__default_sys-env_window100__t-0.20__p-0.95__c-2.00__install-1/marshmallow-code__marshmallow-1867.traj +399 -0
- package/python/trajectories/demonstrations/replay__marshmallow-code__marshmallow-1867__function_calling__install-1/marshmallow-code__marshmallow-1867.traj +594 -0
- package/python/trajectories/demonstrations/replay__marshmallow-code__marshmallow-1867__function_calling_replace__install-1/marshmallow-code__marshmallow-1867.traj +592 -0
- package/python/trajectories/demonstrations/replay__marshmallow-code__marshmallow-1867__function_calling_replace_from_source/marshmallow-code__marshmallow-1867.traj +3316 -0
- package/python/trajectories/demonstrations/replay__marshmallow-code__marshmallow-1867__xml_sys-env_cursors_window100__t-0.20__p-0.95__c-2.00__install-1/marshmallow-code__marshmallow-1867.traj +251 -0
- package/python/trajectories/demonstrations/replay__marshmallow-code__marshmallow-1867__xml_sys-env_window100__t-0.20__p-0.95__c-2.00__install-1/marshmallow-code__marshmallow-1867.traj +399 -0
- package/python/trajectories/demonstrations/str_replace_anthropic_demo.yaml +432 -0
- package/rust/Cargo.toml +100 -0
- package/rust/README.md +49 -0
- package/rust/src/agent/action_sampler.rs +130 -0
- package/rust/src/agent/agents.rs +1029 -0
- package/rust/src/agent/history_processors.rs +277 -0
- package/rust/src/agent/hooks/mod.rs +208 -0
- package/rust/src/agent/mod.rs +24 -0
- package/rust/src/agent/models.rs +837 -0
- package/rust/src/agent/problem_statement.rs +355 -0
- package/rust/src/agent/reviewer.rs +505 -0
- package/rust/src/bin/sweagent.rs +784 -0
- package/rust/src/environment/deployment.rs +631 -0
- package/rust/src/environment/hooks/mod.rs +114 -0
- package/rust/src/environment/mod.rs +16 -0
- package/rust/src/environment/repo.rs +265 -0
- package/rust/src/environment/runtime.rs +237 -0
- package/rust/src/environment/swe_env.rs +248 -0
- package/rust/src/exceptions.rs +228 -0
- package/rust/src/lib.rs +68 -0
- package/rust/src/monitoring.rs +482 -0
- package/rust/src/run/hooks/mod.rs +134 -0
- package/rust/src/run/mod.rs +12 -0
- package/rust/src/run/run_batch.rs +563 -0
- package/rust/src/run/run_single.rs +196 -0
- package/rust/src/tools/bundle.rs +224 -0
- package/rust/src/tools/commands.rs +173 -0
- package/rust/src/tools/mod.rs +295 -0
- package/rust/src/tools/parsing.rs +354 -0
- package/rust/src/tools/registry.rs +143 -0
- package/rust/src/types.rs +554 -0
- package/rust/src/utils/config.rs +105 -0
- package/rust/src/utils/files.rs +137 -0
- package/rust/src/utils/github.rs +171 -0
- package/rust/src/utils/log.rs +65 -0
- package/rust/src/utils/mod.rs +17 -0
- package/rust/src/utils/serialization.rs +181 -0
- package/rust/src/utils/template.rs +173 -0
- package/typescript/README.md +335 -0
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
"""Remove unfinished trajectories."""
|
|
2
|
+
|
|
3
|
+
import argparse
|
|
4
|
+
import shutil
|
|
5
|
+
from pathlib import Path
|
|
6
|
+
|
|
7
|
+
from sweagent.utils.files import load_file
|
|
8
|
+
from sweagent.utils.log import get_logger
|
|
9
|
+
|
|
10
|
+
logger = get_logger("remove_unfinished")
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
def remove_unfinished(base_dir: Path, dry_run: bool = True) -> None:
|
|
14
|
+
"""Remove unfinished trajectories."""
|
|
15
|
+
to_remove = []
|
|
16
|
+
for directory in base_dir.iterdir():
|
|
17
|
+
if not directory.is_dir():
|
|
18
|
+
continue
|
|
19
|
+
if "__" not in directory.name:
|
|
20
|
+
continue
|
|
21
|
+
trajs = list(directory.glob("*.traj"))
|
|
22
|
+
if not trajs:
|
|
23
|
+
logger.info("No trajectories found in %s", directory)
|
|
24
|
+
continue
|
|
25
|
+
if len(trajs) > 1:
|
|
26
|
+
logger.warning("Found multiple trajectories in %s. Skipping.", directory)
|
|
27
|
+
continue
|
|
28
|
+
try:
|
|
29
|
+
traj = load_file(trajs[0])
|
|
30
|
+
except Exception as e:
|
|
31
|
+
logger.warning("Error loading trajectory %s: %s. Adding to remove list.", trajs[0], e)
|
|
32
|
+
to_remove.append(directory)
|
|
33
|
+
continue
|
|
34
|
+
submission = traj.get("info", {}).get("submission", None)
|
|
35
|
+
if submission is None:
|
|
36
|
+
logger.warning("No submission found in %s. Adding to remove list.", directory)
|
|
37
|
+
to_remove.append(directory)
|
|
38
|
+
continue
|
|
39
|
+
if dry_run:
|
|
40
|
+
logger.info("Would remove %d unfinished trajectories.", len(to_remove))
|
|
41
|
+
for directory in to_remove:
|
|
42
|
+
logger.info(directory)
|
|
43
|
+
else:
|
|
44
|
+
for directory in to_remove:
|
|
45
|
+
logger.info("Removing %s", directory)
|
|
46
|
+
shutil.rmtree(directory)
|
|
47
|
+
|
|
48
|
+
|
|
49
|
+
def get_cli_parser() -> argparse.ArgumentParser:
|
|
50
|
+
parser = argparse.ArgumentParser(description=__doc__)
|
|
51
|
+
parser.add_argument("--base_dir", type=Path, help="Base directory", default=Path("."))
|
|
52
|
+
parser.add_argument("--remove", action="store_true", help="Remove unfinished trajectories")
|
|
53
|
+
return parser
|
|
54
|
+
|
|
55
|
+
|
|
56
|
+
def run_from_cli(args: list[str] | None = None) -> None:
|
|
57
|
+
cli_parser = get_cli_parser()
|
|
58
|
+
cli_args = cli_parser.parse_args(args)
|
|
59
|
+
remove_unfinished(cli_args.base_dir, dry_run=not cli_args.remove)
|
|
60
|
+
|
|
61
|
+
|
|
62
|
+
if __name__ == "__main__":
|
|
63
|
+
run_from_cli()
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
import logging
|
|
2
|
+
import time
|
|
3
|
+
from concurrent.futures import ThreadPoolExecutor
|
|
4
|
+
from random import random
|
|
5
|
+
from threading import Lock
|
|
6
|
+
|
|
7
|
+
from rich.console import Group
|
|
8
|
+
from rich.live import Live
|
|
9
|
+
from rich.logging import RichHandler
|
|
10
|
+
from rich.progress import (
|
|
11
|
+
BarColumn,
|
|
12
|
+
Progress,
|
|
13
|
+
SpinnerColumn,
|
|
14
|
+
TaskID,
|
|
15
|
+
TaskProgressColumn,
|
|
16
|
+
TextColumn,
|
|
17
|
+
TimeElapsedColumn,
|
|
18
|
+
TimeRemainingColumn,
|
|
19
|
+
)
|
|
20
|
+
|
|
21
|
+
logging.basicConfig(level="NOTSET", handlers=[RichHandler(level="NOTSET")])
|
|
22
|
+
logger = logging.getLogger("rich")
|
|
23
|
+
|
|
24
|
+
# Lock for thread-safe progress updates
|
|
25
|
+
progress_lock = Lock()
|
|
26
|
+
|
|
27
|
+
|
|
28
|
+
class RunBatch:
|
|
29
|
+
def __init__(self):
|
|
30
|
+
self.tasks = list(range(10)) # Reduced to 10 tasks for example clarity
|
|
31
|
+
self._main_progress_bar: Progress | None = None
|
|
32
|
+
self._task_progress_bar: Progress | None = None
|
|
33
|
+
self._spinner_tasks: dict[TaskID, TaskID] = {}
|
|
34
|
+
|
|
35
|
+
def do_task(self, task_id: TaskID):
|
|
36
|
+
assert self._main_progress_bar is not None
|
|
37
|
+
assert self._task_progress_bar is not None
|
|
38
|
+
|
|
39
|
+
# Create a spinner for this task
|
|
40
|
+
with progress_lock:
|
|
41
|
+
spinner_task_id = self._task_progress_bar.add_task(f"Task {task_id}", total=None)
|
|
42
|
+
|
|
43
|
+
logger.info("Starting task %d", task_id)
|
|
44
|
+
# Startup
|
|
45
|
+
time.sleep(random() * 4.5)
|
|
46
|
+
# Work
|
|
47
|
+
with progress_lock:
|
|
48
|
+
self._task_progress_bar.update(spinner_task_id, description=f"Task {task_id} (working)")
|
|
49
|
+
time.sleep(random() * 4.5 + 2)
|
|
50
|
+
logger.info("Finished task %d", task_id)
|
|
51
|
+
|
|
52
|
+
# Remove spinner and update main progress
|
|
53
|
+
with progress_lock:
|
|
54
|
+
self._task_progress_bar.remove_task(spinner_task_id)
|
|
55
|
+
self._main_progress_bar.update(TaskID(0), advance=1)
|
|
56
|
+
|
|
57
|
+
def main(self):
|
|
58
|
+
# Custom progress columns
|
|
59
|
+
self._main_progress_bar = Progress(
|
|
60
|
+
SpinnerColumn(),
|
|
61
|
+
TextColumn("[progress.description]{task.description}"),
|
|
62
|
+
BarColumn(),
|
|
63
|
+
TaskProgressColumn(),
|
|
64
|
+
TimeElapsedColumn(),
|
|
65
|
+
TimeRemainingColumn(),
|
|
66
|
+
)
|
|
67
|
+
self._task_progress_bar = Progress(
|
|
68
|
+
SpinnerColumn(),
|
|
69
|
+
TextColumn("[progress.description]{task.description}"),
|
|
70
|
+
TimeElapsedColumn(),
|
|
71
|
+
)
|
|
72
|
+
|
|
73
|
+
group = Group(self._main_progress_bar, self._task_progress_bar)
|
|
74
|
+
|
|
75
|
+
with Live(group):
|
|
76
|
+
# Add main progress bar
|
|
77
|
+
self._main_task_id = self._main_progress_bar.add_task("[cyan]Overall Progress", total=len(self.tasks))
|
|
78
|
+
|
|
79
|
+
# Create thread pool and run tasks
|
|
80
|
+
with ThreadPoolExecutor(max_workers=5) as executor:
|
|
81
|
+
# Submit all tasks
|
|
82
|
+
futures = [executor.submit(self.do_task, task_id) for task_id in self.tasks]
|
|
83
|
+
|
|
84
|
+
# Wait for all tasks to complete
|
|
85
|
+
for future in futures:
|
|
86
|
+
future.result()
|
|
87
|
+
|
|
88
|
+
|
|
89
|
+
if __name__ == "__main__":
|
|
90
|
+
run_batch = RunBatch()
|
|
91
|
+
run_batch.main()
|
|
@@ -0,0 +1,147 @@
|
|
|
1
|
+
"""[cyan][bold]Main command line interface for SWE-agent.[/bold][/cyan]
|
|
2
|
+
|
|
3
|
+
[cyan][bold]=== USAGE ===[/bold][/cyan]
|
|
4
|
+
|
|
5
|
+
[green]sweagent <command> [options][/green]
|
|
6
|
+
|
|
7
|
+
Display usage instructions for a specific command:
|
|
8
|
+
|
|
9
|
+
[green]sweagent <command> [bold]--help[/bold][/green]
|
|
10
|
+
|
|
11
|
+
[cyan][bold]=== SUBCOMMANDS TO RUN SWE-AGENT ===[/bold][/cyan]
|
|
12
|
+
|
|
13
|
+
[bold][green]run[/green][/bold] or [bold][green]r[/green][/bold]: Run swe-agent on a single problem statement, for example a github issue.
|
|
14
|
+
[bold][green]run-batch[/green][/bold] or [bold][green]b[/green][/bold]: Run swe-agent on a batch of problem statements, e.g., on SWE-Bench.
|
|
15
|
+
|
|
16
|
+
[cyan][bold]=== MISC SUBCOMMANDS ===[/bold][/cyan]
|
|
17
|
+
|
|
18
|
+
[bold][green]merge-preds[/green][/bold]: Merge multiple prediction files into a single file. In most cases
|
|
19
|
+
[green]run-batch[/green] will already do this, but you can use this to merge predictions
|
|
20
|
+
from multiple directories.
|
|
21
|
+
[bold][green]inspect[/green][/bold] or [bold][green]i[/green][/bold]: Open a single trajectory file in a terminal-based viewer.
|
|
22
|
+
[bold][green]inspector[/green][/bold] or [bold][green]I[/green][/bold]: Open trajectories in a web-based viewer.
|
|
23
|
+
[bold][green]run-replay[/green][/bold]: Replay a trajectory file or a demo file.
|
|
24
|
+
This can be useful to fill in environment output when creating demonstrations.
|
|
25
|
+
[bold][green]traj-to-demo[/green][/bold]: Convert a trajectory file to an easy to edit demo file.
|
|
26
|
+
[bold][green]run-api[/green][/bold]: Run swe-agent as a backend for a GUI
|
|
27
|
+
[bold][green]remove-unfinished[/green][/bold] or [bold][green]ru[/green][/bold]: Remove unfinished trajectories
|
|
28
|
+
[bold][green]quick-stats[/green][/bold] or [bold][green]qs[/green][/bold]: Calculate quick stats from a directory of trajectories
|
|
29
|
+
"""
|
|
30
|
+
|
|
31
|
+
import argparse
|
|
32
|
+
import sys
|
|
33
|
+
|
|
34
|
+
import rich
|
|
35
|
+
|
|
36
|
+
|
|
37
|
+
def get_cli():
|
|
38
|
+
parser = argparse.ArgumentParser(add_help=False)
|
|
39
|
+
parser.add_argument(
|
|
40
|
+
"command",
|
|
41
|
+
choices=[
|
|
42
|
+
"run",
|
|
43
|
+
"run-batch",
|
|
44
|
+
"run-replay",
|
|
45
|
+
"traj-to-demo",
|
|
46
|
+
"run-api",
|
|
47
|
+
"merge-preds",
|
|
48
|
+
"inspect",
|
|
49
|
+
"inspector",
|
|
50
|
+
"r",
|
|
51
|
+
"b",
|
|
52
|
+
"i",
|
|
53
|
+
"I",
|
|
54
|
+
"extract-pred",
|
|
55
|
+
"compare-runs",
|
|
56
|
+
"cr",
|
|
57
|
+
"remove-unfinished",
|
|
58
|
+
"ru",
|
|
59
|
+
"quick-stats",
|
|
60
|
+
"qs",
|
|
61
|
+
"shell",
|
|
62
|
+
"sh",
|
|
63
|
+
],
|
|
64
|
+
nargs="?",
|
|
65
|
+
)
|
|
66
|
+
parser.add_argument("-h", "--help", action="store_true", help="Show this help message and exit")
|
|
67
|
+
return parser
|
|
68
|
+
|
|
69
|
+
|
|
70
|
+
def main(args: list[str] | None = None):
|
|
71
|
+
if args is None:
|
|
72
|
+
args = sys.argv[1:]
|
|
73
|
+
cli = get_cli()
|
|
74
|
+
parsed_args, remaining_args = cli.parse_known_args(args) # type: ignore
|
|
75
|
+
command = parsed_args.command
|
|
76
|
+
show_help = parsed_args.help
|
|
77
|
+
if show_help:
|
|
78
|
+
if not command:
|
|
79
|
+
# Show main help
|
|
80
|
+
rich.print(__doc__)
|
|
81
|
+
sys.exit(0)
|
|
82
|
+
else:
|
|
83
|
+
# Add to remaining_args
|
|
84
|
+
remaining_args.append("--help")
|
|
85
|
+
elif not command:
|
|
86
|
+
cli.print_help()
|
|
87
|
+
sys.exit(2)
|
|
88
|
+
# Defer imports to avoid unnecessary long loading times
|
|
89
|
+
if command in ["run", "r"]:
|
|
90
|
+
from sweagent.run.run_single import run_from_cli as run_single_main
|
|
91
|
+
|
|
92
|
+
run_single_main(remaining_args)
|
|
93
|
+
elif command in ["run-batch", "b"]:
|
|
94
|
+
from sweagent.run.run_batch import run_from_cli as run_batch_main
|
|
95
|
+
|
|
96
|
+
run_batch_main(remaining_args)
|
|
97
|
+
elif command == "run-replay":
|
|
98
|
+
from sweagent.run.run_replay import run_from_cli as run_replay_main
|
|
99
|
+
|
|
100
|
+
run_replay_main(remaining_args)
|
|
101
|
+
elif command == "traj-to-demo":
|
|
102
|
+
from sweagent.run.run_traj_to_demo import run_from_cli as convert_traj_to_demo_main
|
|
103
|
+
|
|
104
|
+
convert_traj_to_demo_main(remaining_args)
|
|
105
|
+
elif command == "run-api":
|
|
106
|
+
from sweagent.api.server import run_from_cli as run_api_main
|
|
107
|
+
|
|
108
|
+
run_api_main(remaining_args)
|
|
109
|
+
elif command == "merge-preds":
|
|
110
|
+
from sweagent.run.merge_predictions import run_from_cli as merge_predictions_main
|
|
111
|
+
|
|
112
|
+
merge_predictions_main(remaining_args)
|
|
113
|
+
elif command in ["inspector", "I"]:
|
|
114
|
+
from sweagent.inspector.server import run_from_cli as inspector_main
|
|
115
|
+
|
|
116
|
+
inspector_main(remaining_args)
|
|
117
|
+
elif command in ["inspect", "i"]:
|
|
118
|
+
from sweagent.run.inspector_cli import main as inspect_main
|
|
119
|
+
|
|
120
|
+
inspect_main(remaining_args)
|
|
121
|
+
elif command == "extract-pred":
|
|
122
|
+
from sweagent.run.extract_pred import run_from_cli as extract_pred_main
|
|
123
|
+
|
|
124
|
+
extract_pred_main(remaining_args)
|
|
125
|
+
elif command in ["compare-runs", "cr"]:
|
|
126
|
+
from sweagent.run.compare_runs import run_from_cli as compare_runs_main
|
|
127
|
+
|
|
128
|
+
compare_runs_main(remaining_args)
|
|
129
|
+
elif command in ["remove-unfinished", "ru"]:
|
|
130
|
+
from sweagent.run.remove_unfinished import run_from_cli as remove_unfinished_main
|
|
131
|
+
|
|
132
|
+
remove_unfinished_main(remaining_args)
|
|
133
|
+
elif command in ["quick-stats", "qs"]:
|
|
134
|
+
from sweagent.run.quick_stats import run_from_cli as quick_stats_main
|
|
135
|
+
|
|
136
|
+
quick_stats_main(remaining_args)
|
|
137
|
+
elif command in ["shell", "sh"]:
|
|
138
|
+
from sweagent.run.run_shell import run_from_cli as run_shell_main
|
|
139
|
+
|
|
140
|
+
run_shell_main(remaining_args)
|
|
141
|
+
else:
|
|
142
|
+
msg = f"Unknown command: {command}"
|
|
143
|
+
raise ValueError(msg)
|
|
144
|
+
|
|
145
|
+
|
|
146
|
+
if __name__ == "__main__":
|
|
147
|
+
sys.exit(main())
|