@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,173 @@
|
|
|
1
|
+
//! Template rendering utilities for SWE-agent
|
|
2
|
+
|
|
3
|
+
use crate::exceptions::{Result, SWEAgentError};
|
|
4
|
+
use handlebars::Handlebars;
|
|
5
|
+
use serde::Serialize;
|
|
6
|
+
use std::collections::HashMap;
|
|
7
|
+
|
|
8
|
+
/// Render a simple template with variable substitution
|
|
9
|
+
pub fn render_template(template: &str, vars: &HashMap<String, String>) -> Result<String> {
|
|
10
|
+
let mut result = template.to_string();
|
|
11
|
+
|
|
12
|
+
for (key, value) in vars {
|
|
13
|
+
// Replace {{key}} with value
|
|
14
|
+
let pattern = format!("{{{{{}}}}}", key);
|
|
15
|
+
result = result.replace(&pattern, value);
|
|
16
|
+
|
|
17
|
+
// Also replace {{ key }} (with spaces)
|
|
18
|
+
let pattern_spaced = format!("{{{{ {} }}}}", key);
|
|
19
|
+
result = result.replace(&pattern_spaced, value);
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
Ok(result)
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
/// Render an advanced template using Handlebars
|
|
26
|
+
pub fn render_advanced_template<T: Serialize>(template: &str, data: &T) -> Result<String> {
|
|
27
|
+
let mut handlebars = Handlebars::new();
|
|
28
|
+
handlebars.set_strict_mode(false);
|
|
29
|
+
|
|
30
|
+
// Register custom helpers
|
|
31
|
+
register_custom_helpers(&mut handlebars);
|
|
32
|
+
|
|
33
|
+
handlebars
|
|
34
|
+
.render_template(template, data)
|
|
35
|
+
.map_err(|e| SWEAgentError::TemplateError(e.to_string()))
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
/// Register custom Handlebars helpers
|
|
39
|
+
fn register_custom_helpers(handlebars: &mut Handlebars) {
|
|
40
|
+
// Helper for slicing strings: {{slice observation 0 100}}
|
|
41
|
+
handlebars.register_helper(
|
|
42
|
+
"slice",
|
|
43
|
+
Box::new(
|
|
44
|
+
|h: &handlebars::Helper,
|
|
45
|
+
_: &Handlebars,
|
|
46
|
+
_: &handlebars::Context,
|
|
47
|
+
_: &mut handlebars::RenderContext,
|
|
48
|
+
out: &mut dyn handlebars::Output|
|
|
49
|
+
-> handlebars::HelperResult {
|
|
50
|
+
let value = h.param(0).and_then(|v| v.value().as_str()).unwrap_or("");
|
|
51
|
+
let start: usize =
|
|
52
|
+
h.param(1).and_then(|v| v.value().as_u64()).unwrap_or(0) as usize;
|
|
53
|
+
let end: usize = h
|
|
54
|
+
.param(2)
|
|
55
|
+
.and_then(|v| v.value().as_u64())
|
|
56
|
+
.map(|v| v as usize)
|
|
57
|
+
.unwrap_or(value.len());
|
|
58
|
+
|
|
59
|
+
let sliced = &value[start.min(value.len())..end.min(value.len())];
|
|
60
|
+
out.write(sliced)?;
|
|
61
|
+
Ok(())
|
|
62
|
+
},
|
|
63
|
+
),
|
|
64
|
+
);
|
|
65
|
+
|
|
66
|
+
// Helper for length: {{len observation}}
|
|
67
|
+
handlebars.register_helper(
|
|
68
|
+
"len",
|
|
69
|
+
Box::new(
|
|
70
|
+
|h: &handlebars::Helper,
|
|
71
|
+
_: &Handlebars,
|
|
72
|
+
_: &handlebars::Context,
|
|
73
|
+
_: &mut handlebars::RenderContext,
|
|
74
|
+
out: &mut dyn handlebars::Output|
|
|
75
|
+
-> handlebars::HelperResult {
|
|
76
|
+
let value = h.param(0).and_then(|v| v.value().as_str()).unwrap_or("");
|
|
77
|
+
out.write(&value.len().to_string())?;
|
|
78
|
+
Ok(())
|
|
79
|
+
},
|
|
80
|
+
),
|
|
81
|
+
);
|
|
82
|
+
|
|
83
|
+
// Helper for subtraction: {{sub a b}}
|
|
84
|
+
handlebars.register_helper(
|
|
85
|
+
"sub",
|
|
86
|
+
Box::new(
|
|
87
|
+
|h: &handlebars::Helper,
|
|
88
|
+
_: &Handlebars,
|
|
89
|
+
_: &handlebars::Context,
|
|
90
|
+
_: &mut handlebars::RenderContext,
|
|
91
|
+
out: &mut dyn handlebars::Output|
|
|
92
|
+
-> handlebars::HelperResult {
|
|
93
|
+
let a: i64 = h.param(0).and_then(|v| v.value().as_i64()).unwrap_or(0);
|
|
94
|
+
let b: i64 = h.param(1).and_then(|v| v.value().as_i64()).unwrap_or(0);
|
|
95
|
+
out.write(&(a - b).to_string())?;
|
|
96
|
+
Ok(())
|
|
97
|
+
},
|
|
98
|
+
),
|
|
99
|
+
);
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
/// Create a Handlebars instance with all registered helpers
|
|
103
|
+
pub fn create_handlebars() -> Handlebars<'static> {
|
|
104
|
+
let mut handlebars = Handlebars::new();
|
|
105
|
+
handlebars.set_strict_mode(false);
|
|
106
|
+
register_custom_helpers(&mut handlebars);
|
|
107
|
+
handlebars
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
/// Warn about probably wrong Jinja syntax in template
|
|
111
|
+
pub fn warn_probably_wrong_jinja_syntax(template: &str) -> Vec<String> {
|
|
112
|
+
let mut warnings = Vec::new();
|
|
113
|
+
|
|
114
|
+
// Check for Python-style string formatting
|
|
115
|
+
if template.contains("{{") && template.contains("[:") {
|
|
116
|
+
warnings.push(
|
|
117
|
+
"Template contains Python-style slicing syntax. Use Handlebars slice helper instead."
|
|
118
|
+
.to_string(),
|
|
119
|
+
);
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
// Check for % formatting
|
|
123
|
+
if template.contains("%(") && template.contains(")s") {
|
|
124
|
+
warnings.push(
|
|
125
|
+
"Template contains Python-style % formatting. Use Handlebars syntax.".to_string(),
|
|
126
|
+
);
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
// Check for .format() style
|
|
130
|
+
if template.contains("{0}") || template.contains("{1}") {
|
|
131
|
+
warnings.push("Template contains Python .format() style placeholders.".to_string());
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
warnings
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
#[cfg(test)]
|
|
138
|
+
mod tests {
|
|
139
|
+
use super::*;
|
|
140
|
+
|
|
141
|
+
#[test]
|
|
142
|
+
fn test_render_template() {
|
|
143
|
+
let mut vars = HashMap::new();
|
|
144
|
+
vars.insert("name".to_string(), "world".to_string());
|
|
145
|
+
|
|
146
|
+
let result = render_template("Hello, {{name}}!", &vars).unwrap();
|
|
147
|
+
assert_eq!(result, "Hello, world!");
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
#[test]
|
|
151
|
+
fn test_render_advanced_template() {
|
|
152
|
+
#[derive(Serialize)]
|
|
153
|
+
struct Data {
|
|
154
|
+
observation: String,
|
|
155
|
+
}
|
|
156
|
+
|
|
157
|
+
let data = Data {
|
|
158
|
+
observation: "test output".to_string(),
|
|
159
|
+
};
|
|
160
|
+
|
|
161
|
+
let result = render_advanced_template("Result: {{observation}}", &data).unwrap();
|
|
162
|
+
assert_eq!(result, "Result: test output");
|
|
163
|
+
}
|
|
164
|
+
|
|
165
|
+
#[test]
|
|
166
|
+
fn test_warn_jinja_syntax() {
|
|
167
|
+
let warnings = warn_probably_wrong_jinja_syntax("{{observation[:100]}}");
|
|
168
|
+
assert!(!warnings.is_empty());
|
|
169
|
+
|
|
170
|
+
let no_warnings = warn_probably_wrong_jinja_syntax("{{observation}}");
|
|
171
|
+
assert!(no_warnings.is_empty());
|
|
172
|
+
}
|
|
173
|
+
}
|
|
@@ -0,0 +1,335 @@
|
|
|
1
|
+
# 🤖 swe-agent-ts
|
|
2
|
+
|
|
3
|
+
A fully-featured autonomous software engineer, written in typescript.
|
|
4
|
+
|
|
5
|
+
## ✨ Features
|
|
6
|
+
|
|
7
|
+
- 🚀 **Autonomous problem solving** - Give it a GitHub issue, bug report, or feature request
|
|
8
|
+
- 🔧 **Automatic code generation** - Writes, tests, and submits complete solutions
|
|
9
|
+
- 📊 **Full SWE-bench support** - Benchmark on thousands of real GitHub issues
|
|
10
|
+
- 🌐 **Multi-model support** - Works with OpenAI, Anthropic, and open-source models
|
|
11
|
+
- ⚡ **Parallel execution** - Run multiple instances simultaneously
|
|
12
|
+
- 🎯 **Interactive shell mode** - Step through solutions interactively
|
|
13
|
+
- 📈 **Complete parity** with Python SWE-agent functionality
|
|
14
|
+
|
|
15
|
+
## 📦 Installation
|
|
16
|
+
|
|
17
|
+
### Prerequisites
|
|
18
|
+
- Node.js 18+ and npm
|
|
19
|
+
- Docker (for sandboxed execution)
|
|
20
|
+
- Git
|
|
21
|
+
|
|
22
|
+
### Quick Install
|
|
23
|
+
|
|
24
|
+
```bash
|
|
25
|
+
# Clone the repository
|
|
26
|
+
git clone https://github.com/elizaos/swe-agent-ts.git
|
|
27
|
+
cd swe-agent-ts
|
|
28
|
+
|
|
29
|
+
# Install dependencies
|
|
30
|
+
npm install
|
|
31
|
+
|
|
32
|
+
# Build the project
|
|
33
|
+
npm run build
|
|
34
|
+
|
|
35
|
+
# Set up API keys (choose one)
|
|
36
|
+
export OPENAI_API_KEY=your_key
|
|
37
|
+
# OR
|
|
38
|
+
export ANTHROPIC_API_KEY=your_key
|
|
39
|
+
```
|
|
40
|
+
|
|
41
|
+
### Global Installation (Optional)
|
|
42
|
+
|
|
43
|
+
```bash
|
|
44
|
+
# Install globally for system-wide access
|
|
45
|
+
npm install -g .
|
|
46
|
+
|
|
47
|
+
# Now you can use 'sweagent' command anywhere
|
|
48
|
+
sweagent --help
|
|
49
|
+
```
|
|
50
|
+
|
|
51
|
+
## 🚀 Quick Start
|
|
52
|
+
|
|
53
|
+
### 1. Solve a GitHub Issue Automatically
|
|
54
|
+
|
|
55
|
+
```bash
|
|
56
|
+
# Have SWE-agent automatically fix a GitHub issue
|
|
57
|
+
npx sweagent run \
|
|
58
|
+
--agent.model.name gpt-4o \
|
|
59
|
+
--env.repo.github_url https://github.com/user/repo \
|
|
60
|
+
--problem_statement.github_url https://github.com/user/repo/issues/123
|
|
61
|
+
```
|
|
62
|
+
|
|
63
|
+
The agent will:
|
|
64
|
+
1. Clone the repository
|
|
65
|
+
2. Understand the issue
|
|
66
|
+
3. Write and test a solution
|
|
67
|
+
4. Create a patch file with the fix
|
|
68
|
+
|
|
69
|
+
### 2. Write Code from a Description
|
|
70
|
+
|
|
71
|
+
```bash
|
|
72
|
+
# Create a new feature from a text description
|
|
73
|
+
echo "Create a REST API with CRUD operations for a todo list app" > task.md
|
|
74
|
+
|
|
75
|
+
npx sweagent run \
|
|
76
|
+
--agent.model.name gpt-4o \
|
|
77
|
+
--env.repo.path ./my-project \
|
|
78
|
+
--problem_statement.path task.md
|
|
79
|
+
```
|
|
80
|
+
|
|
81
|
+
### 3. Interactive Shell Mode
|
|
82
|
+
|
|
83
|
+
```bash
|
|
84
|
+
# Work interactively with the agent
|
|
85
|
+
npx sweagent shell \
|
|
86
|
+
--repo ./my-project \
|
|
87
|
+
--config config/default.yaml
|
|
88
|
+
|
|
89
|
+
# In the shell, you can:
|
|
90
|
+
# - Ask it to implement features
|
|
91
|
+
# - Debug issues together
|
|
92
|
+
# - Review its proposed changes
|
|
93
|
+
```
|
|
94
|
+
|
|
95
|
+
## 📊 Running Benchmarks
|
|
96
|
+
|
|
97
|
+
### SWE-bench Benchmarking
|
|
98
|
+
|
|
99
|
+
Test the agent on real-world GitHub issues:
|
|
100
|
+
|
|
101
|
+
```bash
|
|
102
|
+
# Quick test on 3 instances
|
|
103
|
+
npx sweagent run-batch \
|
|
104
|
+
--instances.type swe_bench \
|
|
105
|
+
--instances.subset lite \
|
|
106
|
+
--instances.split dev \
|
|
107
|
+
--instances.slice :3 \
|
|
108
|
+
--agent.model.name gpt-4o
|
|
109
|
+
|
|
110
|
+
# Full benchmark with parallel execution
|
|
111
|
+
npx sweagent run-batch \
|
|
112
|
+
--instances.type swe_bench \
|
|
113
|
+
--instances.subset lite \
|
|
114
|
+
--instances.slice :50 \
|
|
115
|
+
--num_workers 5 \
|
|
116
|
+
--agent.model.name gpt-4o \
|
|
117
|
+
--instances.evaluate
|
|
118
|
+
```
|
|
119
|
+
|
|
120
|
+
### Custom Benchmarks
|
|
121
|
+
|
|
122
|
+
```bash
|
|
123
|
+
# Run on your own test cases
|
|
124
|
+
cat > my_tests.json << EOF
|
|
125
|
+
[
|
|
126
|
+
{
|
|
127
|
+
"imageName": "python:3.11",
|
|
128
|
+
"problemStatement": "Fix the authentication bug in login.py",
|
|
129
|
+
"instanceId": "auth-001",
|
|
130
|
+
"repoName": "my-app",
|
|
131
|
+
"baseCommit": "main"
|
|
132
|
+
}
|
|
133
|
+
]
|
|
134
|
+
EOF
|
|
135
|
+
|
|
136
|
+
npx sweagent run-batch \
|
|
137
|
+
--instances.type file \
|
|
138
|
+
--instances.path my_tests.json \
|
|
139
|
+
--agent.model.name gpt-4o
|
|
140
|
+
```
|
|
141
|
+
|
|
142
|
+
## 🧪 Running Tests
|
|
143
|
+
|
|
144
|
+
```bash
|
|
145
|
+
# Run all tests
|
|
146
|
+
npm test
|
|
147
|
+
|
|
148
|
+
# Run specific test suites
|
|
149
|
+
npm test -- test-agent
|
|
150
|
+
npm test -- test-swe-bench
|
|
151
|
+
npm test -- test-environment
|
|
152
|
+
|
|
153
|
+
# Run with coverage
|
|
154
|
+
npm test -- --coverage
|
|
155
|
+
|
|
156
|
+
# Run linting
|
|
157
|
+
npm run lint
|
|
158
|
+
|
|
159
|
+
# Format code
|
|
160
|
+
npm run format
|
|
161
|
+
```
|
|
162
|
+
|
|
163
|
+
## 💡 Examples and Demos
|
|
164
|
+
|
|
165
|
+
### Run Example Scripts
|
|
166
|
+
|
|
167
|
+
```bash
|
|
168
|
+
# Demo SWE-bench capabilities
|
|
169
|
+
node examples/demo_swe_bench.js
|
|
170
|
+
|
|
171
|
+
# Run comprehensive benchmark examples
|
|
172
|
+
./examples/run_swe_bench.sh
|
|
173
|
+
|
|
174
|
+
# Test basic functionality
|
|
175
|
+
node examples/test_swe_bench_simple.js
|
|
176
|
+
```
|
|
177
|
+
|
|
178
|
+
### Common Use Cases
|
|
179
|
+
|
|
180
|
+
#### Fix a Bug
|
|
181
|
+
```bash
|
|
182
|
+
npx sweagent run \
|
|
183
|
+
--agent.model.name gpt-4o \
|
|
184
|
+
--env.repo.path ./my-app \
|
|
185
|
+
--problem_statement.text "The login form throws an error when email contains special characters"
|
|
186
|
+
```
|
|
187
|
+
|
|
188
|
+
#### Add a Feature
|
|
189
|
+
```bash
|
|
190
|
+
npx sweagent run \
|
|
191
|
+
--agent.model.name claude-3-sonnet-20241022 \
|
|
192
|
+
--env.repo.github_url https://github.com/user/repo \
|
|
193
|
+
--problem_statement.text "Add dark mode support to the settings page"
|
|
194
|
+
```
|
|
195
|
+
|
|
196
|
+
#### Refactor Code
|
|
197
|
+
```bash
|
|
198
|
+
npx sweagent run \
|
|
199
|
+
--agent.model.name gpt-4o \
|
|
200
|
+
--env.repo.path ./legacy-app \
|
|
201
|
+
--problem_statement.text "Refactor the user service to use async/await instead of callbacks"
|
|
202
|
+
```
|
|
203
|
+
|
|
204
|
+
## 🏗️ Project Structure
|
|
205
|
+
|
|
206
|
+
```
|
|
207
|
+
swe-agent-ts/
|
|
208
|
+
├── src/
|
|
209
|
+
│ ├── agent/ # Core agent logic
|
|
210
|
+
│ ├── environment/ # Execution environment
|
|
211
|
+
│ ├── run/ # CLI and batch execution
|
|
212
|
+
│ ├── tools/ # Agent tools and commands
|
|
213
|
+
│ └── utils/ # Utilities
|
|
214
|
+
├── config/ # Configuration files
|
|
215
|
+
├── examples/ # Example scripts and demos
|
|
216
|
+
├── tests/ # Test suite
|
|
217
|
+
└── docs/ # Documentation
|
|
218
|
+
```
|
|
219
|
+
|
|
220
|
+
## ⚙️ Configuration
|
|
221
|
+
|
|
222
|
+
### Model Configuration
|
|
223
|
+
|
|
224
|
+
```yaml
|
|
225
|
+
# config/my_config.yaml
|
|
226
|
+
agent:
|
|
227
|
+
model:
|
|
228
|
+
name: gpt-4o
|
|
229
|
+
per_instance_cost_limit: 2.00
|
|
230
|
+
temperature: 0.7
|
|
231
|
+
|
|
232
|
+
tools:
|
|
233
|
+
execution_timeout: 30
|
|
234
|
+
max_consecutive_execution_timeouts: 3
|
|
235
|
+
```
|
|
236
|
+
|
|
237
|
+
### Using Different Models
|
|
238
|
+
|
|
239
|
+
```bash
|
|
240
|
+
# OpenAI GPT-4
|
|
241
|
+
export OPENAI_API_KEY=your_key
|
|
242
|
+
npx sweagent run --agent.model.name gpt-5 ...
|
|
243
|
+
|
|
244
|
+
# Anthropic Claude
|
|
245
|
+
export ANTHROPIC_API_KEY=your_key
|
|
246
|
+
npx sweagent run --agent.model.name claude-4-sonnet ...
|
|
247
|
+
|
|
248
|
+
# Local/Open-source models via LiteLLM
|
|
249
|
+
npx sweagent run --agent.model.name ollama/codellama ...
|
|
250
|
+
```
|
|
251
|
+
|
|
252
|
+
## 🔧 Advanced Usage
|
|
253
|
+
|
|
254
|
+
### Custom Tools and Commands
|
|
255
|
+
|
|
256
|
+
```typescript
|
|
257
|
+
// Create custom tools for the agent
|
|
258
|
+
import { Bundle } from 'swe-agent-ts';
|
|
259
|
+
|
|
260
|
+
const customBundle = new Bundle({
|
|
261
|
+
name: 'my-tools',
|
|
262
|
+
commands: [
|
|
263
|
+
{
|
|
264
|
+
name: 'analyze',
|
|
265
|
+
description: 'Analyze code quality',
|
|
266
|
+
script: 'npm run analyze'
|
|
267
|
+
}
|
|
268
|
+
]
|
|
269
|
+
});
|
|
270
|
+
```
|
|
271
|
+
|
|
272
|
+
### Hooks and Extensions
|
|
273
|
+
|
|
274
|
+
```typescript
|
|
275
|
+
// Add custom hooks to monitor agent behavior
|
|
276
|
+
import { AbstractAgentHook } from 'swe-agent-ts';
|
|
277
|
+
|
|
278
|
+
class MyHook extends AbstractAgentHook {
|
|
279
|
+
onStepStart() {
|
|
280
|
+
console.log('Agent is thinking...');
|
|
281
|
+
}
|
|
282
|
+
|
|
283
|
+
onActionExecuted(step) {
|
|
284
|
+
console.log(`Executed: ${step.action}`);
|
|
285
|
+
}
|
|
286
|
+
}
|
|
287
|
+
```
|
|
288
|
+
|
|
289
|
+
## 🐛 Troubleshooting
|
|
290
|
+
|
|
291
|
+
### Common Issues
|
|
292
|
+
|
|
293
|
+
1. **Node Version**: Ensure Node.js 18+
|
|
294
|
+
```bash
|
|
295
|
+
node --version # Should be v18.0.0 or higher
|
|
296
|
+
```
|
|
297
|
+
|
|
298
|
+
2. **Build Errors**: Clean and rebuild
|
|
299
|
+
```bash
|
|
300
|
+
npm run clean
|
|
301
|
+
npm install
|
|
302
|
+
npm run build
|
|
303
|
+
```
|
|
304
|
+
|
|
305
|
+
3. **Docker Issues**: Ensure Docker is running
|
|
306
|
+
```bash
|
|
307
|
+
docker ps # Should show running containers
|
|
308
|
+
```
|
|
309
|
+
|
|
310
|
+
4. **API Keys**: Verify environment variables
|
|
311
|
+
```bash
|
|
312
|
+
echo $OPENAI_API_KEY
|
|
313
|
+
echo $ANTHROPIC_API_KEY
|
|
314
|
+
```
|
|
315
|
+
|
|
316
|
+
```bash
|
|
317
|
+
# Fork and clone the repository
|
|
318
|
+
git clone https://github.com/elizaos/swe-agent-ts.git
|
|
319
|
+
|
|
320
|
+
# Create a feature branch
|
|
321
|
+
git checkout -b feature/amazing-feature
|
|
322
|
+
|
|
323
|
+
# Make changes and test
|
|
324
|
+
npm test
|
|
325
|
+
|
|
326
|
+
# Submit a pull request
|
|
327
|
+
```
|
|
328
|
+
|
|
329
|
+
## 📄 License
|
|
330
|
+
|
|
331
|
+
MIT License - see [LICENSE](LICENSE) file for details.
|
|
332
|
+
|
|
333
|
+
## 🙏 Acknowledgments
|
|
334
|
+
|
|
335
|
+
This TypeScript port is based on the original [SWE-agent](https://github.com/princeton-nlp/SWE-agent) by Princeton University and Stanford University researchers.
|