
First, install all dependencies and ensure you’re running Python 3.10.
conda create -n stepjack python=3.10
conda activate stepjack
pip install -r requirements.txt
We use the AWS environment provided by RedTeamCUA.
AWS
Configure NETWORK_INTERFACE_MAP:
Configure the NETWORK_INTERFACE_MAP in aws_config.py based on your own AWS instances.
Configure your security group:
It’s important to configure a security group that allows legitimate access to your hosted instances while blocking unauthorized access attempts. This is crucial because the AMI, by default, uses only basic password-based authentication, which is relatively easy to compromise.
Your local machine will access the services hosted on AWS via HTTP/TCP connections. Therefore, you should explicitly allow access to the following ports: 8092, 6379, 9999, 5000, 9222, 8091, 2999, and 3000, which are used by either WebArena or TheAgentCompany.
In addition, we use SSH to directly modify the underlying database in order to simulate injection scenarios. As such, SSH access from your local IP address must also be allowed in the security group settings.
Configure your AWS credentials by using aws configure, which will prompt you for:
scripts/run_gpt54_2step.sh shows one example of running GPT-5.4 CUA on StepJack.
Set Environment Variables
CUA API keys
# For GPT
unset OPENAI_BASE_URL
export OPENAI_API_KEY="sk-proj-XXXX"
# For Kimi
export KIMI_API_KEY='sk-XXXX'
# For Qwen
export OPENAI_BASE_URL="https://dashscope-us.aliyuncs.com/compatible-mode/v1"
export OPENAI_API_KEY="sk-XXXX"
# For Claude
export ANTHROPIC_API_KEY='sk-XXXX'
AWS Credentials
export AWS_REGION='XX'
export AWS_ACCESS_KEY='XX'
export AWS_SECRET_KEY='XX'
Run the Experiments
# For GPT
python run_gpt54_multienv.py \
--observation_type screenshot \
--agent_type GPT54Agent \
--headless \
--model gpt-5.4-mini-2026-03-17 \
--result_dir ./results_gpt54 \
--test_all_meta_path "./dataset/{subset}/{platform_instruction}/test_{k}_step.json" \
--test_config_base_dir "./dataset/{subset}/{platform_instruction}" \
--max_steps {15*k} \
--sleep_after_execution 4 \
--provider_name aws \
--num_envs 12 \
--aws_ami {reddit | agentcompany}
# For Kimi
python run_kimi_multienv.py \
--observation_type screenshot \
--agent_type KimiAgent \
--headless \
--model Kimi-K2.5 \
--result_dir ./results_kimi \
--test_all_meta_path "./dataset/{subset}/{platform_instruction}/test_{k}_step.json" \
--test_config_base_dir "./dataset/{subset}/{platform_instruction}" \
--max_steps {15*k} \
--sleep_after_execution 4 \
--provider_name aws \
--num_envs 12 \
--aws_ami {reddit | agentcompany}
# For Qwen
python run_qwen35vl_multienv.py \
--observation_type screenshot \
--agent_type Qwen35VLAgent \
--headless \
--model qwen3.5-plus-2026-02-15 \
--coord relative \
--enable_thinking \
--result_dir ./results_qwen \
--test_all_meta_path "./dataset/{subset}/{platform_instruction}/test_{k}_step.json" \
--test_config_base_dir "./dataset/{subset}/{platform_instruction}" \
--max_steps {15*k} \
--sleep_after_execution 4 \
--provider_name aws \
--num_envs 12 \
--aws_ami {reddit | agentcompany}
# For Claude
python run_claude_multienv.py \
--observation_type screenshot \
--action_space pyautogui \
--agent_type AnthropicAgent \
--api_provider anthropic \
--headless \
--model {claude-sonnet-4-6 | claude-haiku-4-5} \
--result_dir ./results_claude \
--test_all_meta_path "./dataset/{subset}/{platform_instruction}/test_{k}_step.json" \
--test_config_base_dir "./dataset/{subset}/{platform_instruction}" \
--max_steps {15*k} \
--sleep_after_execution 4 \
--provider_name aws \
--num_envs 12 \
--aws_ami {reddit | agentcompany}
The code of Automatic Decomposition Pipeline is in auto_decomp/.
cd auto_decomp. Add new adversarial goals to be decomposed to adv_goals.py.python iterative_refinement.py -k {k} for each k \in \{2, 3\}. Output: ir/goal_*_k{k}_N20_K3_all.json, containing the results of Stage 1.python selected_examples/select_examples.py. Output: selected_examples/selected_examples.json that selects top-10 examples from Stage 1.StepJack builds on top of RedTeamCUA (Liao et al., 2025; arXiv:2505.21936), which itself is derived from OSWorld (XLANG NLP Lab, 2024). Both upstream sources are licensed under Apache-2.0.
Some StepJack data directories are not per-file headered because they contain binary or non-source fixtures. Their lineage is recorded here for attribution:
adv/TheAgentCompany_OwnCloud/file_to_upload/ — copied from RedTeamCUA (adv/TheAgentCompany_OwnCloud/file_to_upload/) originally licensed under Apache-2.0.adv/upload_file/ — contains two SSH-key fixtures (system/authorized_keys, system/id_rsa) used as upload payloads by the dataset task configs. StepJack-curated (the values are placeholder strings, not real keys). Released under the license found in the LICENSE file in the root directory of this source tree.adv/upload_file_dir/ — StepJack-original. Not present in RedTeamCUA. Released under licensed under the license found in the LICENSE file in the root directory of this source tree.dataset/ — adapted from RedTeamCUA's evaluation_examples/ with substantial modifications. RedTeamCUA's evaluation examples are published under per their . StepJack's modifications and additions to the task configs are released under the license found in the file in the root directory of this source tree.Arguments:
single_step (k=1), w_urgent (Urgent = Y), wo_urgent (Urgent = N).forum, forum_follow, owncloud, owncloud_follow. They correspond to 2 platforms and 2 user instruction types.(subset, k) combinations: single_step only with k=1; w_urgent and wo_urgent only with k \in \{2,3\}.reddit for forum platform or agentcompany for owncloud platform.LICENSEdesktop_env/ — copied/adapted from RedTeamCUA's desktop_env/, itself derived from OSWorld; both upstream sources are licensed under Apache-2.0. Per-source-file headers (.py / .sh / .yml / .service / .txt) record each file's specific lineage (copy or StepJack-modified). Companion documentation files (e.g. README.md, DOCKER_GUIDELINE.md, INSTALL_*.md) are copied from RedTeamCUA.