mirror of
https://github.com/OpenHands/OpenHands.git
synced 2025-12-26 05:48:36 +08:00
* move multi-line bash tests to test_runtime; support multi-line bash for esruntime; * add testcase to handle PS2 prompt * use bashlex for bash parsing to handle multi-line commands; add testcases for multi-line commands * revert ghcr runtime change * Apply stash * fix run as other user; make test async; * fix test runtime for run as od * add run-as-devin to all the runtime tests * handle the case when username is root * move all run-as-devin tests from sandbox; only tests a few cases on different user to save time; * move over multi-line echo related tests to test_runtime * fix user-specific jupyter by fixing the pypoetry virtualenv folder * make plugin's init async; chdir at initialization of jupyter plugin; move ipy simple testcase to test runtime; * support agentskills import in move tests for jupyter pwd tests; overload `add_env_vars` for EventStreamRuntime to update env var also in Jupyter; make agentskills read env var lazily, in case env var is updated; * fix ServerRuntime agentskills issue * move agnostic image test to test_runtime * merge runtime tests in CI * fix enable auto lint as env var * update warning message * update warning message * test for different container images * change parsing output as debug * add exception handling for update_pwd_decorator * fix unit test indentation * add plugins as default input to Runtime class; remove init_sandbox_plugins; implement add_env_var (include jupyter) in the base class; * fix server runtime auto lint * Revert "add exception handling for update_pwd_decorator" This reverts commit 2b668b1506e02145cb8f87e321aad62febca3d50. * tries to print debugging info for agentskills * explictly setting uid (try fix permission issue) * Revert "tries to print debugging info for agentskills" This reverts commit 8be4c86756f0e3fc62957b327ba2ac4999c419de. * set sandbox user id during testing to hopefully fix the permission issue * add browser tools for server runtime * try to debug for old pwd * update debug cmd * only test agnostic runtime when TEST_RUNTIME is Server * fix temp dir mkdir * load TEST_RUNTIME at the beginning * remove ipython tests * only log to file when DEBUG * default logging to project root * temporarily remove log to file * fix LLM logger dir * fix logger * make set pwd an optional aux action * fix prev pwd * fix infinity recursion * simplify * do not import the whole od library to avoid logger folder by jupyter * fix browsing * increase timeout * attempt to fix agentskills yet again * clean up in testcases, since CI maybe run as non-root * add _cause attribute for event.id * remove parent * add a bunch of debugging statement again for CI :( * fix temp_dir fixture * change all temp dir to follow pytest's tmp_path_factory * remove extra bracket * clean up error printing a bit * jupyter chdir to self.config.workspace_mount_path_in_sandbox on initialization * jupyter chdir to self.config.workspace_mount_path_in_sandbox on initialization * add typing for tmp dir fixture * clear the directory before running the test to avoid weird CI temp dir * remove agnostic test case for server runtime * Revert "remove agnostic test case for server runtime" This reverts commit 30e2181c3fc1410e69596c2dcd06be01f1d016b3. * disable agnostic tests in CI * fix test * make sure plugin arg is not passed when no plugin is specified; remove redundant on_event function; * move mock prompt * rename runtime * remove extra logging * refactor run_controller's interface; support multiple runtime for integration test; filter out hostname for prompt * uncomment other tests * pass the right runtime to controller * log runtime when start * uncomment tests * improve symbol filters * add intergration test prompts that seemd ok * add integration test workflow * add python3 to default ubuntu image * symlink python and fix permission to jupyter pip * add retry for jupyter execute server * fix jupyter pip install; add post-process for jupyter pip install; simplify init by add agent_skills path to PYTHONPATH; add testcase to tests jupyter pip install; * fix bug * use ubuntu:22.04 for eventstream integration tests * add todo * update testcase * remove redundant code * fix unit test * reduce dependency for runtime * try making llama-index an optional dependency that's not installed by default * remove pip install since it seemd not needed * log ipython execution; await write message since it returns a future * update ipy testcase * do not install llama-index in CI * do not install llama-index in the app docker as well * set sandbox container image in the integration test script * log plugins & env var for runtime * update conftest for sha256 * add git * remove all non-alphanumeric chalracters * add working ipy module tests! * default to use host network * remove is_async from browser to make thing a little more reliable; retry loading browser when error; * add sleep to wait a bit for http server * kill http server before regenerate browsing tests * fix browsing * only set sandbox container image if undefined * skip empty config value * update evaluation to use the latest run_controller * revert logger in execute_server to be compatible with server runtime * revert logging level to fix jupyter * set logger level * revert the logging * chmod for workspace to fix permission * support getting timeout from action * update test for server runtime * try to fix file permission * fix test_cmd_run_action_serialization_deserialization test (added timeout) * poetry: pip 24.2, torch 2.2.2 * revert adding pip to pyproject.toml * add build to dependencies in pyproject.toml * forgot poetry lock --no-update * fix a DelegatorAgent prompt_002.log (timeout) * fix a DelegatorAgent prompt_003.log (timeout) * couple more timeout attribs in prompt files * some more prompt files * prompts galore * add clarification comment for timeout * default timeout to config * add assert * update integraton tests for eventstream * update integration tests * fix timeout for action<->dict * remove redundant on_event * default to use instance image * update run_controller interface * add logging for copy * refactor swe_bench for the new design * fix action execution timeout * updatelock * remove build sandbox locally * fix runtime * use plain for-loop for single process * remove extra print * get swebench inference working * print whole `test_result` dict * got swebench patch post-process working * update swe-bench evaluation readme * refactor using shared reset_logger function * move messy swebench prompt to a different file * support the ability to specify whether to keep prompt * support the ability to specify whether to keep prompt * fix dockerfile * fix import and remove unnecessary strip logic * fix action serialization * get agentbench running * remove extra ls for agent bench * fix agentbench metric * factor out common documentation for eval * update biocoder doc * remove swe_env_box since it is no longer needed * get biocoder working * add func timeout for bird * fix jupyter pwd with ~ as user name * fix jupyter pwd with ~ as user name * get bird working * get browsing evaluation working * make eda runnable * fix id column * fix eda run_infer * unify eval output using a structured format; make swebench coompatible with that format; update client source code for every swebench run; do not inject testcmd for swebench * standardize existing benchs for the new eval output * set update source code = true * get gaia standardized * fix gaia * gorilla refactored but stuck at language.so to test * refactor and make gpqa work * refactor humanevalfix and get it working * refactor logic reasoning and get it working * refactor browser env so it works with eventstream runtime for eval * add initial version of miniwob refactor * fix browsergym environment * get miniwob working!! * allowing injecting additional dependency to OD runtime docker image * allowing injecting additional dependency to OD runtime docker image * support logic reasoning with pre-injected dependency * get mint working * update runtime build * fix mint docker * add test for keep_prompt; add missing await close for some tests * update integration tests for eventstream runtime * fix integration tests for server runtime * refactor ml bench and toolqa * refactor webarena * fix default factory * Update run_infer.py * add APIError to retry * increase timeout for swebench * make sure to hide api key when dump eval output * update the behavior of put source code to put files instead of tarball * add dishash to dependency * sendintr when timeout * fix dockerfile copy * reduce timeout * use dirhash to avoid repeat building for update source * fix runtime_build testcase * add dir_hash to docker build pipeline * revert api error * update poetry lock * add retries for swebench run infer * fix git patch * update poetry lock * adjust config order * fix mount volumns * enforce all eval to use "instance_id" * remove file store from runtime * make file_store public inside eventstream * move the runtime logic inside `main` out * support using async function for process_instance_fn * refactor run_infer with the create_time * fix file store * Update evaluation/toolqa/utils.py Co-authored-by: Graham Neubig <neubig@gmail.com> * fix typo --------- Co-authored-by: tobitege <tobitege@gmx.de> Co-authored-by: super-dainiu <78588128+super-dainiu@users.noreply.github.com> Co-authored-by: Graham Neubig <neubig@gmail.com>
131 lines
4.7 KiB
Python
131 lines
4.7 KiB
Python
import json
|
|
import os
|
|
import re
|
|
import string
|
|
import zipfile
|
|
|
|
import requests
|
|
|
|
|
|
def download_data(dir):
|
|
import gdown
|
|
|
|
data_path = os.path.join(dir, 'data/external_corpus')
|
|
if os.path.exists(data_path):
|
|
return data_path
|
|
url = 'https://drive.google.com/uc?id=1zRbHzPW2x4dDcfmphBWlan8cxUCRNmqk'
|
|
zip_path = os.path.join(dir, 'data.zip')
|
|
gdown.download(url, zip_path, quiet=False)
|
|
with zipfile.ZipFile(zip_path, 'r') as zip_ref:
|
|
zip_ref.extractall(os.path.join(dir, 'data'))
|
|
if os.path.exists(zip_path):
|
|
os.remove(zip_path)
|
|
print(f'Data saved to {data_path}')
|
|
return data_path
|
|
|
|
|
|
def download_tools(dir, wolfram_alpha_appid='YOUR_WOLFRAMALPHA_APPID'):
|
|
tool_path = os.path.join(dir, 'tools')
|
|
if os.path.exists(tool_path):
|
|
return tool_path
|
|
os.mkdir(tool_path)
|
|
tools = [
|
|
'code/sql_interpreter.py',
|
|
'graph/graphtools.py',
|
|
'math/calculator.py',
|
|
'table/mysql_db_create.py',
|
|
'table/tabtools.py',
|
|
'text/agenda_retriever.py',
|
|
'text/scirex_retriever.py',
|
|
]
|
|
for tool in tools:
|
|
url = f'https://raw.githubusercontent.com/night-chen/ToolQA/main/benchmark/ReAct/code/tools/{tool}'
|
|
response = requests.get(url)
|
|
output_file = os.path.join(tool_path, tool.split('/')[1])
|
|
with open(output_file, 'wb') as f:
|
|
f.write(response.content)
|
|
print(f'Tool saved to {output_file}')
|
|
with open(os.path.join(tool_path, 'calculator.py'), 'r') as f:
|
|
content = f.read()
|
|
new_content = content.replace('YOUR_WOLFRAMALPHA_APPID', wolfram_alpha_appid)
|
|
with open(os.path.join(tool_path, 'calculator.py'), 'w') as f:
|
|
f.write(new_content)
|
|
with open(os.path.join(tool_path, 'agenda_retriever.py'), 'r') as f:
|
|
content = f.read()
|
|
new_content = content.replace('/<YOUR_OWN_PATH>/ToolQA/', '')
|
|
with open(os.path.join(tool_path, 'agenda_retriever.py'), 'w') as f:
|
|
f.write(new_content)
|
|
with open(os.path.join(tool_path, 'mysql_db_create.py'), 'r') as f:
|
|
content = f.read()
|
|
new_content = content.replace('/<YOUR_OWN_PATH>/ToolQA/', '')
|
|
with open(os.path.join(tool_path, 'mysql_db_create.py'), 'w') as f:
|
|
f.write(new_content)
|
|
with open(os.path.join(tool_path, 'scirex_retriever.py'), 'r') as f:
|
|
content = f.read()
|
|
new_content = content.replace('/<YOUR_OWN_PATH>/ToolQA/', '')
|
|
with open(os.path.join(tool_path, 'scirex_retriever.py'), 'w') as f:
|
|
f.write(new_content)
|
|
|
|
|
|
LOCAL_DATA_DIR = os.path.join(os.path.dirname(__file__), 'data')
|
|
|
|
|
|
def get_data(dataset, hardness):
|
|
data_path = os.path.join(LOCAL_DATA_DIR, f'{dataset}-{hardness}.jsonl')
|
|
if os.path.exists(data_path):
|
|
print(f'Loading data from {data_path}')
|
|
with open(data_path, 'r') as f:
|
|
return json.load(f)
|
|
else:
|
|
print(
|
|
f'Downloading data from https://raw.githubusercontent.com/night-chen/ToolQA/main/data/questions/{hardness}/{dataset}-{hardness}.jsonl'
|
|
)
|
|
data = []
|
|
url = f'https://raw.githubusercontent.com/night-chen/ToolQA/main/data/questions/{hardness}/{dataset}-{hardness}.jsonl'
|
|
url = requests.get(url)
|
|
if url.status_code == 200:
|
|
lines = url.text.splitlines()
|
|
for line in lines:
|
|
data.append(json.loads(line))
|
|
with open(data_path, 'w') as f:
|
|
json.dump(data, f)
|
|
print(f'Data saved to {data_path}')
|
|
return data
|
|
|
|
|
|
REACT_INSTRUCTION = """Use tools in the tools directory to solve the task: {question}
|
|
You could use all tools which are under the tools/ directory and all the data under the data/ directory.
|
|
When you think you finished the task, respond with `Finish[answer]` where you include your answer in `[]`.
|
|
IMPORTANT: Make sure that in your final answer, you should not print any additional text/instructions other than the actual answer, which should be a word or a simple phrase.
|
|
"""
|
|
|
|
|
|
def encode_question(question):
|
|
return REACT_INSTRUCTION.format(question=question)
|
|
|
|
|
|
# imported from https://github.com/night-chen/ToolQA/tree/main/benchmark/ReAct/code/agents_chatgpt.py
|
|
def normalize_answer(s):
|
|
def remove_articles(text):
|
|
return re.sub(r'\b(a|an|the|usd)\b', ' ', text)
|
|
|
|
def white_space_fix(text):
|
|
return ' '.join(text.split())
|
|
|
|
def remove_punc(text):
|
|
exclude = set(string.punctuation)
|
|
return ''.join(ch for ch in text if ch not in exclude)
|
|
|
|
def lower(text):
|
|
return text.lower()
|
|
|
|
return white_space_fix(remove_articles(remove_punc(lower(s))))
|
|
|
|
|
|
def eval_answer(pred, answer):
|
|
pattern = r'Finish\[(.*?)\]'
|
|
match = re.search(pattern, pred)
|
|
if match:
|
|
pred = match.group(1)
|
|
return normalize_answer(pred) == normalize_answer(answer)
|