@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,277 @@
|
|
|
1
|
+
//! History processors for managing conversation history
|
|
2
|
+
//!
|
|
3
|
+
//! These processors transform the conversation history before it's sent to the model.
|
|
4
|
+
|
|
5
|
+
use crate::types::{Content, History};
|
|
6
|
+
use regex::Regex;
|
|
7
|
+
use serde::{Deserialize, Serialize};
|
|
8
|
+
|
|
9
|
+
/// Trait for history processors
|
|
10
|
+
pub trait HistoryProcessor: Send + Sync {
|
|
11
|
+
fn process(&self, history: History) -> History;
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
/// Default history processor that passes through unchanged
|
|
15
|
+
pub struct DefaultHistoryProcessor;
|
|
16
|
+
|
|
17
|
+
impl HistoryProcessor for DefaultHistoryProcessor {
|
|
18
|
+
fn process(&self, history: History) -> History {
|
|
19
|
+
history
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
/// Processor that keeps only the last N observations
|
|
24
|
+
pub struct LastNObservations {
|
|
25
|
+
n: usize,
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
impl LastNObservations {
|
|
29
|
+
pub fn new(n: usize) -> Self {
|
|
30
|
+
Self { n }
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
impl HistoryProcessor for LastNObservations {
|
|
35
|
+
fn process(&self, history: History) -> History {
|
|
36
|
+
if self.n == 0 {
|
|
37
|
+
return history;
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
let mut result = Vec::new();
|
|
41
|
+
let mut observation_count = 0;
|
|
42
|
+
|
|
43
|
+
// Iterate in reverse to count observations from the end
|
|
44
|
+
for item in history.iter().rev() {
|
|
45
|
+
let is_observation = item
|
|
46
|
+
.message_type
|
|
47
|
+
.as_ref()
|
|
48
|
+
.map(|t| matches!(t, crate::types::MessageType::Observation))
|
|
49
|
+
.unwrap_or(false);
|
|
50
|
+
|
|
51
|
+
if is_observation {
|
|
52
|
+
observation_count += 1;
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
if observation_count <= self.n || !is_observation {
|
|
56
|
+
result.push(item.clone());
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
result.reverse();
|
|
61
|
+
result
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
/// Processor that wraps tool call observations in tags
|
|
66
|
+
pub struct TagToolCallObservations {
|
|
67
|
+
tag: String,
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
impl TagToolCallObservations {
|
|
71
|
+
pub fn new(tag: impl Into<String>) -> Self {
|
|
72
|
+
Self { tag: tag.into() }
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
impl HistoryProcessor for TagToolCallObservations {
|
|
77
|
+
fn process(&self, history: History) -> History {
|
|
78
|
+
history
|
|
79
|
+
.into_iter()
|
|
80
|
+
.map(|mut item| {
|
|
81
|
+
if item.tool_call_ids.is_some() {
|
|
82
|
+
let content = item.content.as_str();
|
|
83
|
+
item.content =
|
|
84
|
+
Content::Text(format!("<{}>\n{}\n</{}>", self.tag, content, self.tag));
|
|
85
|
+
}
|
|
86
|
+
item
|
|
87
|
+
})
|
|
88
|
+
.collect()
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
/// Processor that handles closed window files
|
|
93
|
+
pub struct ClosedWindowHistoryProcessor;
|
|
94
|
+
|
|
95
|
+
impl HistoryProcessor for ClosedWindowHistoryProcessor {
|
|
96
|
+
fn process(&self, history: History) -> History {
|
|
97
|
+
// Implementation would track open/closed files and adjust history
|
|
98
|
+
history
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
/// Processor that adds cache control headers for Anthropic
|
|
103
|
+
pub struct CacheControlHistoryProcessor;
|
|
104
|
+
|
|
105
|
+
impl HistoryProcessor for CacheControlHistoryProcessor {
|
|
106
|
+
fn process(&self, history: History) -> History {
|
|
107
|
+
// Add cache control for last few messages
|
|
108
|
+
history
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
/// Processor that removes content matching a regex pattern
|
|
113
|
+
pub struct RemoveRegex {
|
|
114
|
+
pattern: Regex,
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
impl RemoveRegex {
|
|
118
|
+
pub fn new(pattern: &str) -> Option<Self> {
|
|
119
|
+
Regex::new(pattern).ok().map(|pattern| Self { pattern })
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
impl HistoryProcessor for RemoveRegex {
|
|
124
|
+
fn process(&self, history: History) -> History {
|
|
125
|
+
history
|
|
126
|
+
.into_iter()
|
|
127
|
+
.map(|mut item| {
|
|
128
|
+
let content = item.content.as_str();
|
|
129
|
+
let cleaned = self.pattern.replace_all(&content, "").to_string();
|
|
130
|
+
item.content = Content::Text(cleaned);
|
|
131
|
+
item
|
|
132
|
+
})
|
|
133
|
+
.collect()
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
/// Processor that handles image parsing in history
|
|
138
|
+
pub struct ImageParsingHistoryProcessor {
|
|
139
|
+
disable_images: bool,
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
impl ImageParsingHistoryProcessor {
|
|
143
|
+
pub fn new(disable_images: bool) -> Self {
|
|
144
|
+
Self { disable_images }
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
impl HistoryProcessor for ImageParsingHistoryProcessor {
|
|
149
|
+
fn process(&self, history: History) -> History {
|
|
150
|
+
if !self.disable_images {
|
|
151
|
+
return history;
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
// Remove image content parts
|
|
155
|
+
history
|
|
156
|
+
.into_iter()
|
|
157
|
+
.map(|mut item| {
|
|
158
|
+
if let Content::Structured(parts) = &item.content {
|
|
159
|
+
let filtered: Vec<_> = parts
|
|
160
|
+
.iter()
|
|
161
|
+
.filter(|p| !matches!(p, crate::types::ContentPart::Image { .. }))
|
|
162
|
+
.cloned()
|
|
163
|
+
.collect();
|
|
164
|
+
item.content = Content::Structured(filtered);
|
|
165
|
+
}
|
|
166
|
+
item
|
|
167
|
+
})
|
|
168
|
+
.collect()
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
|
|
172
|
+
/// Chain multiple history processors together
|
|
173
|
+
pub struct ChainedHistoryProcessor {
|
|
174
|
+
processors: Vec<Box<dyn HistoryProcessor>>,
|
|
175
|
+
}
|
|
176
|
+
|
|
177
|
+
impl ChainedHistoryProcessor {
|
|
178
|
+
pub fn new(processors: Vec<Box<dyn HistoryProcessor>>) -> Self {
|
|
179
|
+
Self { processors }
|
|
180
|
+
}
|
|
181
|
+
}
|
|
182
|
+
|
|
183
|
+
impl HistoryProcessor for ChainedHistoryProcessor {
|
|
184
|
+
fn process(&self, mut history: History) -> History {
|
|
185
|
+
for processor in &self.processors {
|
|
186
|
+
history = processor.process(history);
|
|
187
|
+
}
|
|
188
|
+
history
|
|
189
|
+
}
|
|
190
|
+
}
|
|
191
|
+
|
|
192
|
+
/// Configuration for history processors
|
|
193
|
+
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
|
|
194
|
+
#[serde(tag = "type", rename_all = "snake_case")]
|
|
195
|
+
pub enum HistoryProcessorConfig {
|
|
196
|
+
#[default]
|
|
197
|
+
Default,
|
|
198
|
+
LastNObservations { n: usize },
|
|
199
|
+
TagToolCallObservations { tag: String },
|
|
200
|
+
ClosedWindow,
|
|
201
|
+
CacheControl,
|
|
202
|
+
RemoveRegex { pattern: String },
|
|
203
|
+
ImageParsing { disable_images: bool },
|
|
204
|
+
}
|
|
205
|
+
|
|
206
|
+
/// Create a history processor from configuration
|
|
207
|
+
pub fn create_history_processor(config: &HistoryProcessorConfig) -> Box<dyn HistoryProcessor> {
|
|
208
|
+
match config {
|
|
209
|
+
HistoryProcessorConfig::Default => Box::new(DefaultHistoryProcessor),
|
|
210
|
+
HistoryProcessorConfig::LastNObservations { n } => Box::new(LastNObservations::new(*n)),
|
|
211
|
+
HistoryProcessorConfig::TagToolCallObservations { tag } => {
|
|
212
|
+
Box::new(TagToolCallObservations::new(tag))
|
|
213
|
+
}
|
|
214
|
+
HistoryProcessorConfig::ClosedWindow => Box::new(ClosedWindowHistoryProcessor),
|
|
215
|
+
HistoryProcessorConfig::CacheControl => Box::new(CacheControlHistoryProcessor),
|
|
216
|
+
HistoryProcessorConfig::RemoveRegex { pattern } => RemoveRegex::new(pattern)
|
|
217
|
+
.map(|p| Box::new(p) as Box<dyn HistoryProcessor>)
|
|
218
|
+
.unwrap_or_else(|| Box::new(DefaultHistoryProcessor)),
|
|
219
|
+
HistoryProcessorConfig::ImageParsing { disable_images } => {
|
|
220
|
+
Box::new(ImageParsingHistoryProcessor::new(*disable_images))
|
|
221
|
+
}
|
|
222
|
+
}
|
|
223
|
+
}
|
|
224
|
+
|
|
225
|
+
#[cfg(test)]
|
|
226
|
+
mod tests {
|
|
227
|
+
use super::*;
|
|
228
|
+
use crate::types::{HistoryItem, MessageType, Role};
|
|
229
|
+
|
|
230
|
+
#[test]
|
|
231
|
+
fn test_default_processor() {
|
|
232
|
+
let processor = DefaultHistoryProcessor;
|
|
233
|
+
let history = vec![HistoryItem::user("test")];
|
|
234
|
+
let result = processor.process(history.clone());
|
|
235
|
+
assert_eq!(result.len(), history.len());
|
|
236
|
+
}
|
|
237
|
+
|
|
238
|
+
#[test]
|
|
239
|
+
fn test_last_n_observations() {
|
|
240
|
+
let processor = LastNObservations::new(2);
|
|
241
|
+
let history = vec![
|
|
242
|
+
HistoryItem {
|
|
243
|
+
role: Role::User,
|
|
244
|
+
content: Content::Text("obs1".to_string()),
|
|
245
|
+
message_type: Some(MessageType::Observation),
|
|
246
|
+
..Default::default()
|
|
247
|
+
},
|
|
248
|
+
HistoryItem {
|
|
249
|
+
role: Role::User,
|
|
250
|
+
content: Content::Text("obs2".to_string()),
|
|
251
|
+
message_type: Some(MessageType::Observation),
|
|
252
|
+
..Default::default()
|
|
253
|
+
},
|
|
254
|
+
HistoryItem {
|
|
255
|
+
role: Role::User,
|
|
256
|
+
content: Content::Text("obs3".to_string()),
|
|
257
|
+
message_type: Some(MessageType::Observation),
|
|
258
|
+
..Default::default()
|
|
259
|
+
},
|
|
260
|
+
];
|
|
261
|
+
|
|
262
|
+
let result = processor.process(history);
|
|
263
|
+
assert_eq!(result.len(), 2);
|
|
264
|
+
}
|
|
265
|
+
|
|
266
|
+
#[test]
|
|
267
|
+
fn test_remove_regex() {
|
|
268
|
+
let processor = RemoveRegex::new(r"\[DEBUG\]").unwrap();
|
|
269
|
+
let history = vec![HistoryItem {
|
|
270
|
+
content: Content::Text("Hello [DEBUG] world".to_string()),
|
|
271
|
+
..Default::default()
|
|
272
|
+
}];
|
|
273
|
+
|
|
274
|
+
let result = processor.process(history);
|
|
275
|
+
assert_eq!(result[0].content.as_str(), "Hello world");
|
|
276
|
+
}
|
|
277
|
+
}
|
|
@@ -0,0 +1,208 @@
|
|
|
1
|
+
//! Agent hooks for monitoring and extending agent behavior
|
|
2
|
+
|
|
3
|
+
use crate::types::{AgentInfo, History, StepOutput, Trajectory};
|
|
4
|
+
use async_trait::async_trait;
|
|
5
|
+
|
|
6
|
+
/// Abstract hook for agent events
|
|
7
|
+
#[async_trait]
|
|
8
|
+
pub trait AgentHook: Send + Sync {
|
|
9
|
+
/// Called when agent is initialized
|
|
10
|
+
fn on_init(&mut self, _agent: &dyn std::any::Any) {}
|
|
11
|
+
|
|
12
|
+
/// Called when tools installation starts
|
|
13
|
+
fn on_tools_installation_started(&mut self) {}
|
|
14
|
+
|
|
15
|
+
/// Called when setup attempt begins
|
|
16
|
+
fn on_setup_attempt(&mut self) {}
|
|
17
|
+
|
|
18
|
+
/// Called when setup is complete
|
|
19
|
+
fn on_setup_done(&mut self) {}
|
|
20
|
+
|
|
21
|
+
/// Called when a query message is added to history
|
|
22
|
+
fn on_query_message_added(&mut self, _message: &QueryMessageEvent) {}
|
|
23
|
+
|
|
24
|
+
/// Called when model is queried
|
|
25
|
+
fn on_model_query(&mut self, _history: &History, _agent_name: &str) {}
|
|
26
|
+
|
|
27
|
+
/// Called when actions are generated
|
|
28
|
+
fn on_actions_generated(&mut self, _step: &StepOutput) {}
|
|
29
|
+
|
|
30
|
+
/// Called when action execution starts
|
|
31
|
+
fn on_action_started(&mut self, _step: &StepOutput) {}
|
|
32
|
+
|
|
33
|
+
/// Called when action execution completes
|
|
34
|
+
fn on_action_executed(&mut self, _step: &StepOutput) {}
|
|
35
|
+
|
|
36
|
+
/// Called when a step starts
|
|
37
|
+
fn on_step_start(&mut self) {}
|
|
38
|
+
|
|
39
|
+
/// Called when a step completes
|
|
40
|
+
fn on_step_done(&mut self, _step: &StepOutput, _info: &AgentInfo) {}
|
|
41
|
+
|
|
42
|
+
/// Called when a run starts
|
|
43
|
+
fn on_run_start(&mut self) {}
|
|
44
|
+
|
|
45
|
+
/// Called when a run completes
|
|
46
|
+
fn on_run_done(&mut self, _trajectory: &Trajectory, _info: &AgentInfo) {}
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
/// Event data for query message added
|
|
50
|
+
#[derive(Debug, Clone)]
|
|
51
|
+
pub struct QueryMessageEvent {
|
|
52
|
+
pub agent: String,
|
|
53
|
+
pub role: String,
|
|
54
|
+
pub content: String,
|
|
55
|
+
pub message_type: String,
|
|
56
|
+
pub is_demo: Option<bool>,
|
|
57
|
+
pub thought: Option<String>,
|
|
58
|
+
pub action: Option<String>,
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
/// Combined hook that wraps multiple hooks
|
|
62
|
+
pub struct CombinedAgentHook {
|
|
63
|
+
hooks: Vec<Box<dyn AgentHook>>,
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
impl CombinedAgentHook {
|
|
67
|
+
pub fn new() -> Self {
|
|
68
|
+
Self { hooks: Vec::new() }
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
pub fn add_hook(&mut self, hook: Box<dyn AgentHook>) {
|
|
72
|
+
self.hooks.push(hook);
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
impl Default for CombinedAgentHook {
|
|
77
|
+
fn default() -> Self {
|
|
78
|
+
Self::new()
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
#[async_trait]
|
|
83
|
+
impl AgentHook for CombinedAgentHook {
|
|
84
|
+
fn on_init(&mut self, agent: &dyn std::any::Any) {
|
|
85
|
+
for hook in &mut self.hooks {
|
|
86
|
+
hook.on_init(agent);
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
fn on_tools_installation_started(&mut self) {
|
|
91
|
+
for hook in &mut self.hooks {
|
|
92
|
+
hook.on_tools_installation_started();
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
fn on_setup_attempt(&mut self) {
|
|
97
|
+
for hook in &mut self.hooks {
|
|
98
|
+
hook.on_setup_attempt();
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
fn on_setup_done(&mut self) {
|
|
103
|
+
for hook in &mut self.hooks {
|
|
104
|
+
hook.on_setup_done();
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
fn on_query_message_added(&mut self, message: &QueryMessageEvent) {
|
|
109
|
+
for hook in &mut self.hooks {
|
|
110
|
+
hook.on_query_message_added(message);
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
fn on_model_query(&mut self, history: &History, agent_name: &str) {
|
|
115
|
+
for hook in &mut self.hooks {
|
|
116
|
+
hook.on_model_query(history, agent_name);
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
fn on_actions_generated(&mut self, step: &StepOutput) {
|
|
121
|
+
for hook in &mut self.hooks {
|
|
122
|
+
hook.on_actions_generated(step);
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
fn on_action_started(&mut self, step: &StepOutput) {
|
|
127
|
+
for hook in &mut self.hooks {
|
|
128
|
+
hook.on_action_started(step);
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
fn on_action_executed(&mut self, step: &StepOutput) {
|
|
133
|
+
for hook in &mut self.hooks {
|
|
134
|
+
hook.on_action_executed(step);
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
fn on_step_start(&mut self) {
|
|
139
|
+
for hook in &mut self.hooks {
|
|
140
|
+
hook.on_step_start();
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
fn on_step_done(&mut self, step: &StepOutput, info: &AgentInfo) {
|
|
145
|
+
for hook in &mut self.hooks {
|
|
146
|
+
hook.on_step_done(step, info);
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
fn on_run_start(&mut self) {
|
|
151
|
+
for hook in &mut self.hooks {
|
|
152
|
+
hook.on_run_start();
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
|
|
156
|
+
fn on_run_done(&mut self, trajectory: &Trajectory, info: &AgentInfo) {
|
|
157
|
+
for hook in &mut self.hooks {
|
|
158
|
+
hook.on_run_done(trajectory, info);
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
|
|
163
|
+
/// Status hook that logs agent progress
|
|
164
|
+
pub struct StatusHook {
|
|
165
|
+
pub show_progress: bool,
|
|
166
|
+
}
|
|
167
|
+
|
|
168
|
+
impl StatusHook {
|
|
169
|
+
pub fn new(show_progress: bool) -> Self {
|
|
170
|
+
Self { show_progress }
|
|
171
|
+
}
|
|
172
|
+
}
|
|
173
|
+
|
|
174
|
+
impl Default for StatusHook {
|
|
175
|
+
fn default() -> Self {
|
|
176
|
+
Self::new(true)
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
|
|
180
|
+
#[async_trait]
|
|
181
|
+
impl AgentHook for StatusHook {
|
|
182
|
+
fn on_step_start(&mut self) {
|
|
183
|
+
if self.show_progress {
|
|
184
|
+
tracing::info!("Step started");
|
|
185
|
+
}
|
|
186
|
+
}
|
|
187
|
+
|
|
188
|
+
fn on_step_done(&mut self, step: &StepOutput, _info: &AgentInfo) {
|
|
189
|
+
if self.show_progress {
|
|
190
|
+
tracing::info!(
|
|
191
|
+
done = step.done,
|
|
192
|
+
exit_status = ?step.exit_status,
|
|
193
|
+
"Step completed"
|
|
194
|
+
);
|
|
195
|
+
}
|
|
196
|
+
}
|
|
197
|
+
|
|
198
|
+
fn on_run_done(&mut self, trajectory: &Trajectory, info: &AgentInfo) {
|
|
199
|
+
if self.show_progress {
|
|
200
|
+
tracing::info!(
|
|
201
|
+
steps = trajectory.len(),
|
|
202
|
+
submission = ?info.submission,
|
|
203
|
+
exit_status = ?info.exit_status,
|
|
204
|
+
"Run completed"
|
|
205
|
+
);
|
|
206
|
+
}
|
|
207
|
+
}
|
|
208
|
+
}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
//! Agent module for SWE-agent
|
|
2
|
+
//!
|
|
3
|
+
//! This module contains the core agent implementations including:
|
|
4
|
+
//! - `DefaultAgent` - The main agent implementation
|
|
5
|
+
//! - `RetryAgent` - An agent that retries with different configurations
|
|
6
|
+
//! - Various model implementations for LLM interaction
|
|
7
|
+
//! - History processors for managing conversation history
|
|
8
|
+
//! - Problem statement handling
|
|
9
|
+
|
|
10
|
+
pub mod action_sampler;
|
|
11
|
+
pub mod agents;
|
|
12
|
+
pub mod history_processors;
|
|
13
|
+
pub mod hooks;
|
|
14
|
+
pub mod models;
|
|
15
|
+
pub mod problem_statement;
|
|
16
|
+
pub mod reviewer;
|
|
17
|
+
|
|
18
|
+
pub use action_sampler::*;
|
|
19
|
+
pub use agents::*;
|
|
20
|
+
pub use history_processors::*;
|
|
21
|
+
pub use hooks::*;
|
|
22
|
+
pub use models::*;
|
|
23
|
+
pub use problem_statement::*;
|
|
24
|
+
pub use reviewer::*;
|