From beb74a19f607e7fa2d1c2581373fc7ec1409ffeb Mon Sep 17 00:00:00 2001 From: Robert Brennan Date: Tue, 14 May 2024 09:35:25 -0400 Subject: [PATCH] Use event stream for the runtime (#1776) * rebuild PR from scratch * fix max_iter * regenerate tests * cut down on history * Update opendevin/controller/agent_controller.py * regenerate tests * revert swe agent * revert some codeact chagnes * regenerate tests * add source to dict * only add source if not none * try to fix coverage issue * lock * add gevent --- agenthub/codeact_agent/codeact_agent.py | 30 +- agenthub/dummy_agent/agent.py | 4 +- agenthub/micro/_instructions/actions/kill.md | 2 +- agenthub/monologue_agent/utils/prompts.py | 4 +- agenthub/planner_agent/prompt.py | 7 +- opendevin/controller/agent_controller.py | 210 ++---- opendevin/core/config.py | 1 + opendevin/core/main.py | 2 + opendevin/events/action/commands.py | 2 +- opendevin/events/action/tasks.py | 4 +- opendevin/events/event.py | 38 +- opendevin/events/stream.py | 9 +- opendevin/runtime/e2b/runtime.py | 6 +- opendevin/runtime/runtime.py | 51 +- opendevin/runtime/server/runtime.py | 6 +- opendevin/server/agent/agent.py | 29 +- poetry.lock | 714 +++++++++++------- pyproject.toml | 4 + .../CodeActAgent/test_edits/prompt_001.log | 2 +- .../CodeActAgent/test_edits/prompt_002.log | 16 +- .../CodeActAgent/test_edits/prompt_003.log | 37 +- .../CodeActAgent/test_edits/prompt_004.log | 276 +++++++ .../CodeActAgent/test_edits/prompt_005.log | 294 ++++++++ .../CodeActAgent/test_edits/response_001.log | 5 +- .../CodeActAgent/test_edits/response_002.log | 6 +- .../CodeActAgent/test_edits/response_003.log | 9 +- .../CodeActAgent/test_edits/response_004.log | 6 + .../CodeActAgent/test_edits/response_005.log | 1 + .../CodeActAgent/test_ipython/prompt_001.log | 2 +- .../CodeActAgent/test_ipython/prompt_002.log | 6 +- .../CodeActAgent/test_ipython/prompt_003.log | 255 +++++++ .../CodeActAgent/test_ipython/prompt_004.log | 271 +++++++ .../test_ipython/response_002.log | 6 +- .../test_ipython/response_003.log | 4 + .../test_ipython/response_004.log | 1 + .../test_write_simple_script/prompt_001.log | 2 +- .../test_write_simple_script/prompt_002.log | 7 +- .../test_write_simple_script/response_001.log | 3 +- .../test_write_simple_script/response_002.log | 2 +- .../MonologueAgent/test_edits/prompt_001.log | 2 +- .../MonologueAgent/test_edits/prompt_002.log | 2 +- .../MonologueAgent/test_edits/prompt_003.log | 2 +- .../test_write_simple_script/prompt_001.log | 2 +- .../test_write_simple_script/prompt_002.log | 2 +- .../PlannerAgent/test_edits/prompt_001.log | 5 +- .../PlannerAgent/test_edits/prompt_002.log | 4 +- .../PlannerAgent/test_edits/prompt_003.log | 4 +- .../test_write_simple_script/prompt_001.log | 5 +- .../test_write_simple_script/prompt_002.log | 31 +- .../test_write_simple_script/prompt_003.log | 136 ---- .../test_write_simple_script/response_001.log | 7 +- .../test_write_simple_script/response_002.log | 6 +- .../test_write_simple_script/response_003.log | 7 - .../test_write_simple_script/prompt_007.log | 199 +++++ .../test_write_simple_script/prompt_008.log | 291 +++++++ .../test_write_simple_script/prompt_009.log | 199 +++++ .../test_write_simple_script/prompt_010.log | 199 +++++ .../test_write_simple_script/prompt_011.log | 199 +++++ .../test_write_simple_script/response_007.log | 5 + .../test_write_simple_script/response_008.log | 7 + .../test_write_simple_script/response_009.log | 7 + .../test_write_simple_script/response_010.log | 7 + .../test_write_simple_script/response_011.log | 9 + tests/unit/test_action_serialization.py | 7 +- 64 files changed, 2946 insertions(+), 732 deletions(-) create mode 100644 tests/integration/mock/CodeActAgent/test_edits/prompt_004.log create mode 100644 tests/integration/mock/CodeActAgent/test_edits/prompt_005.log create mode 100644 tests/integration/mock/CodeActAgent/test_edits/response_004.log create mode 100644 tests/integration/mock/CodeActAgent/test_edits/response_005.log create mode 100644 tests/integration/mock/CodeActAgent/test_ipython/prompt_003.log create mode 100644 tests/integration/mock/CodeActAgent/test_ipython/prompt_004.log create mode 100644 tests/integration/mock/CodeActAgent/test_ipython/response_003.log create mode 100644 tests/integration/mock/CodeActAgent/test_ipython/response_004.log delete mode 100644 tests/integration/mock/PlannerAgent/test_write_simple_script/prompt_003.log delete mode 100644 tests/integration/mock/PlannerAgent/test_write_simple_script/response_003.log create mode 100644 tests/integration/mock/SWEAgent/test_write_simple_script/prompt_007.log create mode 100644 tests/integration/mock/SWEAgent/test_write_simple_script/prompt_008.log create mode 100644 tests/integration/mock/SWEAgent/test_write_simple_script/prompt_009.log create mode 100644 tests/integration/mock/SWEAgent/test_write_simple_script/prompt_010.log create mode 100644 tests/integration/mock/SWEAgent/test_write_simple_script/prompt_011.log create mode 100644 tests/integration/mock/SWEAgent/test_write_simple_script/response_007.log create mode 100644 tests/integration/mock/SWEAgent/test_write_simple_script/response_008.log create mode 100644 tests/integration/mock/SWEAgent/test_write_simple_script/response_009.log create mode 100644 tests/integration/mock/SWEAgent/test_write_simple_script/response_010.log create mode 100644 tests/integration/mock/SWEAgent/test_write_simple_script/response_011.log diff --git a/agenthub/codeact_agent/codeact_agent.py b/agenthub/codeact_agent/codeact_agent.py index 058d4b731d..96ff1366ac 100644 --- a/agenthub/codeact_agent/codeact_agent.py +++ b/agenthub/codeact_agent/codeact_agent.py @@ -10,12 +10,10 @@ from opendevin.events.action import ( CmdRunAction, IPythonRunCellAction, MessageAction, - NullAction, ) from opendevin.events.observation import ( CmdOutputObservation, IPythonRunCellObservation, - NullObservation, ) from opendevin.llm.llm import LLM from opendevin.runtime.plugins import ( @@ -120,18 +118,6 @@ class CodeActAgent(Agent): JupyterRequirement(), SWEAgentCommandsRequirement(), ] - SUPPORTED_ACTIONS = ( - CmdRunAction, - IPythonRunCellAction, - MessageAction, - NullAction, - ) - SUPPORTED_OBSERVATIONS = ( - CmdOutputObservation, - IPythonRunCellObservation, - NullObservation, - ) - messages: list[dict] = [] def __init__( self, @@ -178,9 +164,6 @@ class CodeActAgent(Agent): updated_info = state.updated_info if updated_info: for prev_action, obs in updated_info: - assert isinstance( - prev_action, self.SUPPORTED_ACTIONS - ), f'{prev_action.__class__} is not supported (supported: {self.SUPPORTED_ACTIONS})' if ( isinstance(prev_action, MessageAction) and prev_action.source == 'user' @@ -192,16 +175,10 @@ class CodeActAgent(Agent): # User wants to exit return AgentFinishAction() - # handle observations - assert isinstance( - obs, self.SUPPORTED_OBSERVATIONS - ), f'{obs.__class__} is not supported (supported: {self.SUPPORTED_OBSERVATIONS})' - if isinstance(obs, CmdOutputObservation): content = 'OBSERVATION:\n' + truncate_observation(obs.content) content += f'\n[Command {obs.command_id} finished with exit code {obs.exit_code}]]' self.messages.append({'role': 'user', 'content': content}) - elif isinstance(obs, IPythonRunCellObservation): content = 'OBSERVATION:\n' + obs.content # replace base64 images with a placeholder @@ -214,12 +191,7 @@ class CodeActAgent(Agent): content = '\n'.join(splitted) content = truncate_observation(content) self.messages.append({'role': 'user', 'content': content}) - elif isinstance(obs, NullObservation): - pass - else: - raise NotImplementedError( - f'Unknown observation type: {obs.__class__}' - ) + latest_user_message = [m for m in self.messages if m['role'] == 'user'][-1] if latest_user_message: latest_user_message['content'] += ( diff --git a/agenthub/dummy_agent/agent.py b/agenthub/dummy_agent/agent.py index 33a5f23d60..85abeb44f0 100644 --- a/agenthub/dummy_agent/agent.py +++ b/agenthub/dummy_agent/agent.py @@ -59,7 +59,7 @@ class DummyAgent(Agent): 'observations': [NullObservation('')], }, { - 'action': ModifyTaskAction(id='0.0', state='in_progress'), + 'action': ModifyTaskAction(task_id='0.0', state='in_progress'), 'observations': [NullObservation('')], }, { @@ -96,7 +96,7 @@ class DummyAgent(Agent): 'action': CmdRunAction(command=BACKGROUND_CMD, background=True), 'observations': [ CmdOutputObservation( - 'Background command started. To stop it, send a `kill` action with id 42', + 'Background command started. To stop it, send a `kill` action with command_id 42', command_id='42', # type: ignore[arg-type] command=BACKGROUND_CMD, ), diff --git a/agenthub/micro/_instructions/actions/kill.md b/agenthub/micro/_instructions/actions/kill.md index 64fb37b90a..e3399e924d 100644 --- a/agenthub/micro/_instructions/actions/kill.md +++ b/agenthub/micro/_instructions/actions/kill.md @@ -1,2 +1,2 @@ * `kill` - kills a background command - * `id` - the ID of the background command to kill + * `command_id` - the ID of the background command to kill diff --git a/agenthub/monologue_agent/utils/prompts.py b/agenthub/monologue_agent/utils/prompts.py index 0bb53f162a..bfec27c28e 100644 --- a/agenthub/monologue_agent/utils/prompts.py +++ b/agenthub/monologue_agent/utils/prompts.py @@ -35,7 +35,7 @@ Here are the possible actions: * `command` - the command to run * `background` - if true, run the command in the background, so that other commands can be run concurrently. Useful for e.g. starting a server. You won't be able to see the logs. You don't need to end the command with `&`, just set this to true. * `kill` - kills a background command - * `id` - the ID of the background command to kill + * `command_id` - the ID of the background command to kill * `browse` - opens a web page. Arguments: * `url` - the URL to open * `push` - Push a branch from the current repo to github: @@ -140,7 +140,7 @@ def get_request_action_prompt( bg_commands_message += ( f'\n`{command_obs.command_id}`: {command_obs.command}' ) - bg_commands_message += '\nYou can end any process by sending a `kill` action with the numerical `id` above.' + bg_commands_message += '\nYou can end any process by sending a `kill` action with the numerical `command_id` above.' user = 'opendevin' if config.run_as_devin else 'root' diff --git a/agenthub/planner_agent/prompt.py b/agenthub/planner_agent/prompt.py index 8363ec46f5..e5efde318a 100644 --- a/agenthub/planner_agent/prompt.py +++ b/agenthub/planner_agent/prompt.py @@ -78,7 +78,7 @@ It must be an object, and it must contain two fields: * `command` - the command to run * `background` - if true, run the command in the background, so that other commands can be run concurrently. Useful for e.g. starting a server. You won't be able to see the logs. You don't need to end the command with `&`, just set this to true. * `kill` - kills a background command - * `id` - the ID of the background command to kill + * `command_id` - the ID of the background command to kill * `browse` - opens a web page. Arguments: * `url` - the URL to open * `message` - make a plan, set a goal, or record your thoughts. Arguments: @@ -88,7 +88,7 @@ It must be an object, and it must contain two fields: * `goal` - the goal of the task * `subtasks` - a list of subtasks, each of which is a map with a `goal` key. * `modify_task` - close a task. Arguments: - * `id` - the ID of the task to close + * `task_id` - the ID of the task to close * `state` - set to 'in_progress' to start the task, 'completed' to finish it, 'verified' to assert that it was successful, 'abandoned' to give up on it permanently, or `open` to stop working on it for now. * `finish` - if ALL of your tasks and subtasks have been verified or abandoned, and you're absolutely certain that you've completed your task and have tested your work, use the finish action to stop working. @@ -174,12 +174,9 @@ def parse_response(response: str) -> Action: Returns: - Action: A valid next action to perform from model output """ - # attempt to load the JSON dict from the response action_dict = json.loads(response) - if 'contents' in action_dict: # The LLM gets confused here. Might as well be robust action_dict['content'] = action_dict.pop('contents') - action = action_from_dict(action_dict) return action diff --git a/opendevin/controller/agent_controller.py b/opendevin/controller/agent_controller.py index 9ed1f5aca1..d970eafb17 100644 --- a/opendevin/controller/agent_controller.py +++ b/opendevin/controller/agent_controller.py @@ -1,7 +1,6 @@ import asyncio from typing import Optional, Type -from agenthub.codeact_agent.codeact_agent import CodeActAgent from opendevin.controller.agent import Agent from opendevin.controller.state.state import State from opendevin.core.config import config @@ -27,14 +26,12 @@ from opendevin.events.event import Event from opendevin.events.observation import ( AgentDelegateObservation, AgentStateChangedObservation, + CmdOutputObservation, ErrorObservation, NullObservation, Observation, ) from opendevin.events.stream import EventSource, EventStream, EventStreamSubscriber -from opendevin.runtime import DockerSSHBox, Sandbox -from opendevin.runtime.runtime import Runtime -from opendevin.runtime.server.runtime import ServerRuntime MAX_ITERATIONS = config.max_iterations MAX_CHARS = config.llm.max_chars @@ -44,13 +41,12 @@ class AgentController: id: str agent: Agent max_iterations: int - runtime: Runtime event_stream: EventStream state: State agent_task: Optional[asyncio.Task] = None delegate: 'AgentController | None' = None _agent_state: AgentState = AgentState.LOADING - _cur_step: int = 0 + _pending_action: Action | None = None def __init__( self, @@ -60,7 +56,6 @@ class AgentController: max_iterations: int = MAX_ITERATIONS, max_chars: int = MAX_CHARS, inputs: dict | None = None, - sandbox: Optional[Sandbox] = None, ): """Initializes a new instance of the AgentController class. @@ -71,7 +66,6 @@ class AgentController: max_iterations: The maximum number of iterations the agent can run. max_chars: The maximum number of characters the agent can output. inputs: The initial inputs to the agent. - sandbox: An optional initialized sandbox to run the agent in. If not provided, a default sandbox will be created based on config. """ self.id = sid self.agent = agent @@ -81,101 +75,74 @@ class AgentController: EventStreamSubscriber.AGENT_CONTROLLER, self.on_event ) self.max_iterations = max_iterations - - self.runtime = ServerRuntime(sandbox=sandbox, sid=self.id) self.max_chars = max_chars - - # Initialize agent-required plugins for sandbox (if any) - self.runtime.init_sandbox_plugins(agent.sandbox_plugins) - - if isinstance(agent, CodeActAgent) and not isinstance( - self.runtime.sandbox, DockerSSHBox - ): - logger.warning( - 'CodeActAgent requires DockerSSHBox as sandbox! Using other sandbox that are not stateful (LocalBox, DockerExecBox) will not work properly.' - ) + self.agent_task = asyncio.create_task(self._start_step_loop()) async def close(self): if self.agent_task is not None: self.agent_task.cancel() self.event_stream.unsubscribe(EventStreamSubscriber.AGENT_CONTROLLER) - self.runtime.sandbox.close() - self.runtime.browser.close() await self.set_agent_state_to(AgentState.STOPPED) - def update_state_for_step(self, i): - self.state.iteration = i - self.state.background_commands_obs = self.runtime.get_background_obs() + def update_state_before_step(self): + self.state.iteration += 1 def update_state_after_step(self): self.state.updated_info = [] - async def add_error_to_history(self, message: str): - await self.add_history(NullAction(), ErrorObservation(message)) + async def report_error(self, message: str): + await self.event_stream.add_event(ErrorObservation(message), EventSource.AGENT) - async def add_history( - self, action: Action, observation: Observation, add_to_stream=True - ): - if not isinstance(action, Action): - raise TypeError( - f'action must be an instance of Action, got {type(action).__name__} instead' - ) - if not isinstance(observation, Observation): - raise TypeError( - f'observation must be an instance of Observation, got {type(observation).__name__} instead' - ) + async def add_history(self, action: Action, observation: Observation): + if isinstance(action, NullAction) and isinstance(observation, NullObservation): + return self.state.history.append((action, observation)) self.state.updated_info.append((action, observation)) - if add_to_stream: - await self.event_stream.add_event(action, EventSource.AGENT) - await self.event_stream.add_event(observation, EventSource.AGENT) - async def _run(self): - if self._agent_state != AgentState.RUNNING: - raise ValueError('Task is not in running state') - - for i in range(self._cur_step, self.max_iterations): - self._cur_step = i + async def _start_step_loop(self): + while True: try: - finished = await self.step(i) - if finished: - await self.set_agent_state_to(AgentState.FINISHED) - break - except Exception: - logger.error('Error in loop', exc_info=True) - await self.set_agent_state_to(AgentState.ERROR) - await self.add_error_to_history( - 'Oops! Something went wrong while completing your task. You can check the logs for more info.' + await self._step() + except asyncio.CancelledError: + logger.info('AgentController task was cancelled') + break + except Exception as e: + logger.error(f'Error while running the agent: {e}') + await self.report_error( + 'There was an unexpected error while running the agent' ) + await self.set_agent_state_to(AgentState.ERROR) break - if self._is_stuck(): - logger.info('Loop detected, stopping task') - await self.set_agent_state_to(AgentState.ERROR) - await self.add_error_to_history( - 'I got stuck into a loop, the task has stopped.' - ) - break - await asyncio.sleep( - 0.001 - ) # Give back control for a tick, so other async stuff can run - final_state = self.get_agent_state() - if final_state == AgentState.RUNNING: - await self.set_agent_state_to(AgentState.PAUSED) + await asyncio.sleep(0.1) async def on_event(self, event: Event): if isinstance(event, ChangeAgentStateAction): await self.set_agent_state_to(event.agent_state) # type: ignore - elif isinstance(event, MessageAction) and event.source == EventSource.USER: - await self.add_history(event, NullObservation(''), add_to_stream=False) - if self.get_agent_state() != AgentState.RUNNING: - await self.set_agent_state_to(AgentState.RUNNING) + elif isinstance(event, MessageAction): + if event.source == EventSource.USER: + await self.add_history(event, NullObservation('')) + if self.get_agent_state() != AgentState.RUNNING: + await self.set_agent_state_to(AgentState.RUNNING) + elif event.source == EventSource.AGENT and event.wait_for_response: + await self.set_agent_state_to(AgentState.AWAITING_USER_INPUT) + elif isinstance(event, AgentDelegateAction): + await self.start_delegate(event) + elif isinstance(event, AddTaskAction): + self.state.root_task.add_subtask(event.parent, event.goal, event.subtasks) + elif isinstance(event, ModifyTaskAction): + self.state.root_task.set_subtask_state(event.task_id, event.state) + elif isinstance(event, AgentFinishAction): + self.state.outputs = event.outputs # type: ignore[attr-defined] + await self.set_agent_state_to(AgentState.FINISHED) + elif isinstance(event, Observation): + if self._pending_action and self._pending_action.id == event.cause: + await self.add_history(self._pending_action, event) + self._pending_action = None + elif isinstance(event, CmdOutputObservation): + await self.add_history(NullAction(), event) - async def reset_task(self): - if self.agent_task is not None: - self.agent_task.cancel() - self.state = State() - self._cur_step = 0 + def reset_task(self): self.agent.reset() async def set_agent_state_to(self, new_state: AgentState): @@ -186,17 +153,8 @@ class AgentController: return self._agent_state = new_state - if new_state == AgentState.RUNNING: - self.agent_task = asyncio.create_task(self._run()) - elif ( - new_state == AgentState.PAUSED - or new_state == AgentState.AWAITING_USER_INPUT - ): - self._cur_step += 1 - if self.agent_task is not None: - self.agent_task.cancel() - elif new_state == AgentState.STOPPED or new_state == AgentState.ERROR: - await self.reset_task() + if new_state == AgentState.STOPPED or new_state == AgentState.ERROR: + self.reset_task() await self.event_stream.add_event( AgentStateChangedObservation('', self._agent_state), EventSource.AGENT @@ -218,64 +176,60 @@ class AgentController: inputs=action.inputs, ) - async def step(self, i: int) -> bool: + async def _step(self): + if self.get_agent_state() != AgentState.RUNNING: + logger.debug('waiting for agent to run...') + await asyncio.sleep(1) + return + + if self._pending_action: + logger.debug('waiting for pending action: ' + str(self._pending_action)) + await asyncio.sleep(1) + return + + logger.info(f'STEP {self.state.iteration}', extra={'msg_type': 'STEP'}) + if self.state.iteration >= self.max_iterations: + await self.report_error('Agent reached maximum number of iterations') + await self.set_agent_state_to(AgentState.ERROR) + return + if self.delegate is not None: - delegate_done = await self.delegate.step(i) + delegate_done = await self.delegate._step() if delegate_done: outputs = self.delegate.state.outputs if self.delegate.state else {} obs: Observation = AgentDelegateObservation(content='', outputs=outputs) - await self.add_history(NullAction(), obs) + await self.event_stream.add_event(obs, EventSource.AGENT) self.delegate = None self.delegateAction = None - return False + return - logger.info(f'STEP {i}', extra={'msg_type': 'STEP'}) if self.state.num_of_chars > self.max_chars: raise MaxCharsExceedError(self.state.num_of_chars, self.max_chars) - log_obs = self.runtime.get_background_obs() - for obs in log_obs: - await self.add_history(NullAction(), obs) - logger.info(obs, extra={'msg_type': 'BACKGROUND LOG'}) - - self.update_state_for_step(i) + self.update_state_before_step() action: Action = NullAction() - observation: Observation = NullObservation('') try: action = self.agent.step(self.state) if action is None: raise AgentNoActionError('No action was returned') except (AgentMalformedActionError, AgentNoActionError, LLMOutputError) as e: - observation = ErrorObservation(str(e)) + await self.report_error(str(e)) + return + logger.info(action, extra={'msg_type': 'ACTION'}) self.update_state_after_step() - - if isinstance(action, AgentFinishAction): - self.state.outputs = action.outputs # type: ignore[attr-defined] - logger.info(action, extra={'msg_type': 'INFO'}) + if action.runnable: + self._pending_action = action + else: await self.add_history(action, NullObservation('')) - return True - elif isinstance(action, MessageAction) and action.wait_for_response: - # FIXME: remove this once history is managed outside the agent controller - await self.add_history(action, NullObservation('')) - await self.set_agent_state_to(AgentState.AWAITING_USER_INPUT) - return False - elif isinstance(action, AgentDelegateAction): - await self.start_delegate(action) - elif isinstance(action, AddTaskAction): - self.state.root_task.add_subtask( - action.parent, action.goal, action.subtasks - ) - elif isinstance(action, ModifyTaskAction): - self.state.root_task.set_subtask_state(action.id, action.state) - elif not isinstance(observation, ErrorObservation): - observation = await self.runtime.run_action(action) - if not isinstance(observation, NullObservation): - logger.info(observation, extra={'msg_type': 'OBSERVATION'}) - await self.add_history(action, observation) - return False + if not isinstance(action, NullAction): + await self.event_stream.add_event(action, EventSource.AGENT) + + if self._is_stuck(): + await self.report_error('Agent got stuck in a loop') + await self.set_agent_state_to(AgentState.ERROR) def get_state(self): return self.state @@ -301,7 +255,7 @@ class AgentController: for i in range(1, 4) ): # same (Action, NullObservation): like 'think' the same thought over and over - logger.debug('Action, NullObservation loop detected') + logger.warning('Action, NullObservation loop detected') return True elif all( isinstance(self.state.history[-i][1], ErrorObservation) @@ -309,7 +263,7 @@ class AgentController: ): # (NullAction, ErrorObservation): errors coming from an exception # (Action, ErrorObservation): the same action getting an error, even if not necessarily the same error - logger.debug('Action, ErrorObservation loop detected') + logger.warning('Action, ErrorObservation loop detected') return True return False diff --git a/opendevin/core/config.py b/opendevin/core/config.py index f453ce5cd7..9e626d248e 100644 --- a/opendevin/core/config.py +++ b/opendevin/core/config.py @@ -70,6 +70,7 @@ class AgentConfig(metaclass=Singleton): class AppConfig(metaclass=Singleton): llm: LLMConfig = field(default_factory=LLMConfig) agent: AgentConfig = field(default_factory=AgentConfig) + runtime: str = 'server' workspace_base: str = os.getcwd() workspace_mount_path: str = os.getcwd() workspace_mount_path_in_sandbox: str = '/workspace' diff --git a/opendevin/core/main.py b/opendevin/core/main.py index 740f6c0d4b..c0737616fb 100644 --- a/opendevin/core/main.py +++ b/opendevin/core/main.py @@ -12,6 +12,7 @@ from opendevin.events.event import Event from opendevin.events.observation import AgentStateChangedObservation from opendevin.events.stream import EventSource, EventStream, EventStreamSubscriber from opendevin.llm.llm import LLM +from opendevin.runtime.server.runtime import ServerRuntime def read_task_from_file(file_path: str) -> str: @@ -82,6 +83,7 @@ async def main(task_str: str = '', exit_on_message: bool = False) -> AgentState: max_chars=args.max_chars, event_stream=event_stream, ) + _ = ServerRuntime(event_stream=event_stream) await event_stream.add_event(MessageAction(content=task), EventSource.USER) await event_stream.add_event( diff --git a/opendevin/events/action/commands.py b/opendevin/events/action/commands.py index efb88615e7..173e3758de 100644 --- a/opendevin/events/action/commands.py +++ b/opendevin/events/action/commands.py @@ -28,7 +28,7 @@ class CmdRunAction(Action): @dataclass class CmdKillAction(Action): - id: int + command_id: int thought: str = '' action: str = ActionType.KILL runnable: ClassVar[bool] = True diff --git a/opendevin/events/action/tasks.py b/opendevin/events/action/tasks.py index 6ca1e0be47..d6c3137f6d 100644 --- a/opendevin/events/action/tasks.py +++ b/opendevin/events/action/tasks.py @@ -20,11 +20,11 @@ class AddTaskAction(Action): @dataclass class ModifyTaskAction(Action): - id: str + task_id: str state: str thought: str = '' action: str = ActionType.MODIFY_TASK @property def message(self) -> str: - return f'Set task {self.id} to {self.state}' + return f'Set task {self.task_id} to {self.state}' diff --git a/opendevin/events/event.py b/opendevin/events/event.py index 017fcdd35c..3baad6f4c6 100644 --- a/opendevin/events/event.py +++ b/opendevin/events/event.py @@ -1,4 +1,12 @@ +import datetime from dataclasses import asdict, dataclass +from enum import Enum +from typing import Optional + + +class EventSource(str, Enum): + AGENT = 'agent' + USER = 'user' @dataclass @@ -8,13 +16,37 @@ class Event: def to_dict(self): d = self.to_memory() + if self.source: + d['source'] = self.source d['message'] = self.message return d @property def message(self) -> str: - return self._message # type: ignore [attr-defined] + if hasattr(self, '_message'): + return self._message # type: ignore [attr-defined] + return '' @property - def source(self) -> str: - return self._source # type: ignore [attr-defined] + def id(self) -> int: + if hasattr(self, '_id'): + return self._id # type: ignore [attr-defined] + return -1 + + @property + def timestamp(self) -> Optional[datetime.datetime]: + if hasattr(self, '_timestamp'): + return self._timestamp # type: ignore [attr-defined] + return None + + @property + def source(self) -> Optional[EventSource]: + if hasattr(self, '_source'): + return self._source # type: ignore [attr-defined] + return None + + @property + def cause(self) -> Optional[int]: + if hasattr(self, '_cause'): + return self._cause # type: ignore [attr-defined] + return None diff --git a/opendevin/events/stream.py b/opendevin/events/stream.py index 9f9309f1f6..3679c335af 100644 --- a/opendevin/events/stream.py +++ b/opendevin/events/stream.py @@ -5,7 +5,7 @@ from typing import Callable from opendevin.core.logger import opendevin_logger as logger -from .event import Event +from .event import Event, EventSource class EventStreamSubscriber(str, Enum): @@ -15,11 +15,6 @@ class EventStreamSubscriber(str, Enum): MAIN = 'main' -class EventSource(str, Enum): - AGENT = 'agent' - USER = 'user' - - class EventStream: def __init__(self): self._subscribers: dict[str, Callable] = {} @@ -28,7 +23,7 @@ class EventStream: def subscribe(self, id: EventStreamSubscriber, callback: Callable): if id in self._subscribers: - logger.warning('Subscriber subscribed multiple times: ' + id) + raise ValueError('Subscriber already exists: ' + id) else: self._subscribers[id] = callback diff --git a/opendevin/runtime/e2b/runtime.py b/opendevin/runtime/e2b/runtime.py index bc9a1cb264..5542ae63af 100644 --- a/opendevin/runtime/e2b/runtime.py +++ b/opendevin/runtime/e2b/runtime.py @@ -8,6 +8,8 @@ from opendevin.events.observation import ( FileWriteObservation, Observation, ) +from opendevin.events.stream import EventStream +from opendevin.runtime import Sandbox from opendevin.runtime.server.files import insert_lines, read_lines from opendevin.runtime.server.runtime import ServerRuntime @@ -17,9 +19,11 @@ from .sandbox import E2BSandbox class E2BRuntime(ServerRuntime): def __init__( self, + event_stream: EventStream, sid: str = 'default', + sandbox: Sandbox | None = None, ): - super().__init__() + super().__init__(event_stream, sid, sandbox) if not isinstance(self.sandbox, E2BSandbox): raise ValueError('E2BRuntime requires an E2BSandbox') self.filesystem = self.sandbox.filesystem diff --git a/opendevin/runtime/runtime.py b/opendevin/runtime/runtime.py index 25088adfa9..0885874cea 100644 --- a/opendevin/runtime/runtime.py +++ b/opendevin/runtime/runtime.py @@ -1,3 +1,4 @@ +import asyncio from abc import abstractmethod from opendevin.core.config import config @@ -12,12 +13,14 @@ from opendevin.events.action import ( FileWriteAction, IPythonRunCellAction, ) +from opendevin.events.event import Event from opendevin.events.observation import ( CmdOutputObservation, ErrorObservation, NullObservation, Observation, ) +from opendevin.events.stream import EventSource, EventStream, EventStreamSubscriber from opendevin.runtime import ( DockerExecBox, DockerSSHBox, @@ -54,8 +57,9 @@ class Runtime: def __init__( self, - sandbox: Sandbox | None = None, + event_stream: EventStream, sid: str = 'default', + sandbox: Sandbox | None = None, ): self.sid = sid if sandbox is None: @@ -63,10 +67,25 @@ class Runtime: else: self.sandbox = sandbox self.browser = BrowserEnv() + self.event_stream = event_stream + self.event_stream.subscribe(EventStreamSubscriber.RUNTIME, self.on_event) + self._bg_task = asyncio.create_task(self._start_background_observation_loop()) + + def close(self): + self.sandbox.close() + self.browser.close() + self._bg_task.cancel() def init_sandbox_plugins(self, plugins: list[PluginRequirement]) -> None: self.sandbox.init_plugins(plugins) + async def on_event(self, event: Event) -> None: + if isinstance(event, Action): + observation = await self.run_action(event) + observation._cause = event.id # type: ignore[attr-defined] + source = event.source if event.source else EventSource.AGENT + await self.event_stream.add_event(observation, source) + async def run_action(self, action: Action) -> Observation: """ Run an action and return the resulting observation. @@ -75,32 +94,38 @@ class Runtime: """ if not action.runnable: return NullObservation('') - action_id = action.action # type: ignore[attr-defined] - if action_id not in ACTION_TYPE_TO_CLASS: - return ErrorObservation(f'Action {action_id} does not exist.') - if not hasattr(self, action_id): + action_type = action.action # type: ignore[attr-defined] + if action_type not in ACTION_TYPE_TO_CLASS: + return ErrorObservation(f'Action {action_type} does not exist.') + if not hasattr(self, action_type): return ErrorObservation( - f'Action {action_id} is not supported in the current runtime.' + f'Action {action_type} is not supported in the current runtime.' ) - observation = await getattr(self, action_id)(action) + observation = await getattr(self, action_type)(action) + observation._parent = action.id # type: ignore[attr-defined] return observation - def get_background_obs(self) -> list[CmdOutputObservation]: + async def _start_background_observation_loop(self): + while True: + await self.submit_background_obs() + await asyncio.sleep(1) + + async def submit_background_obs(self): """ Returns all observations that have accumulated in the runtime's background. Right now, this is just background commands, but could include e.g. asyncronous events happening in the browser. """ - obs = [] for _id, cmd in self.sandbox.background_commands.items(): output = cmd.read_logs() - if output is not None and output != '': - obs.append( + if output: + await self.event_stream.add_event( CmdOutputObservation( content=output, command_id=_id, command=cmd.command - ) + ), + EventSource.AGENT, # FIXME: use the original action's source ) - return obs + await asyncio.sleep(1) @abstractmethod async def run(self, action: CmdRunAction) -> Observation: diff --git a/opendevin/runtime/server/runtime.py b/opendevin/runtime/server/runtime.py index 5602c645f9..74f94af584 100644 --- a/opendevin/runtime/server/runtime.py +++ b/opendevin/runtime/server/runtime.py @@ -25,9 +25,9 @@ class ServerRuntime(Runtime): return self._run_command(action.command, background=action.background) async def kill(self, action: CmdKillAction) -> Observation: - cmd = self.sandbox.kill_background(action.id) + cmd = self.sandbox.kill_background(action.command_id) return CmdOutputObservation( - content=f'Background command with id {action.id} has been killed.', + content=f'Background command with id {action.command_id} has been killed.', command_id=action.id, command=cmd.command, exit_code=0, @@ -78,7 +78,7 @@ class ServerRuntime(Runtime): def _run_background(self, command: str) -> Observation: bg_cmd = self.sandbox.execute_in_background(command) - content = f'Background command started. To stop it, send a `kill` action with id {bg_cmd.pid}' + content = f'Background command started. To stop it, send a `kill` action with command_id {bg_cmd.pid}' return CmdOutputObservation( content=content, command_id=bg_cmd.pid, diff --git a/opendevin/server/agent/agent.py b/opendevin/server/agent/agent.py index 745a905635..ace4f6b0e4 100644 --- a/opendevin/server/agent/agent.py +++ b/opendevin/server/agent/agent.py @@ -1,5 +1,6 @@ from typing import Optional +from agenthub.codeact_agent.codeact_agent import CodeActAgent from opendevin.const.guide_url import TROUBLESHOOTING_URL from opendevin.controller import AgentController from opendevin.controller.agent import Agent @@ -17,6 +18,10 @@ from opendevin.events.observation import ( ) from opendevin.events.stream import EventSource, EventStream, EventStreamSubscriber from opendevin.llm.llm import LLM +from opendevin.runtime import DockerSSHBox +from opendevin.runtime.e2b.runtime import E2BRuntime +from opendevin.runtime.runtime import Runtime +from opendevin.runtime.server.runtime import ServerRuntime from opendevin.server.session import session_manager @@ -30,14 +35,19 @@ class AgentUnit: sid: str event_stream: EventStream controller: Optional[AgentController] = None - # TODO: we will add the runtime here - # runtime: Optional[Runtime] = None + runtime: Optional[Runtime] = None def __init__(self, sid): """Initializes a new instance of the Session class.""" self.sid = sid self.event_stream = EventStream() self.event_stream.subscribe(EventStreamSubscriber.SERVER, self.on_event) + if config.runtime == 'server': + logger.info('Using server runtime') + self.runtime = ServerRuntime(self.event_stream, sid) + elif config.runtime == 'e2b': + logger.info('Using E2B runtime') + self.runtime = E2BRuntime(self.event_stream, sid) async def send_error(self, message): """Sends an error message to the client. @@ -101,13 +111,20 @@ class AgentUnit: logger.info(f'Creating agent {agent_cls} using LLM {model}') llm = LLM(model=model, api_key=api_key, base_url=api_base) + agent = Agent.get_cls(agent_cls)(llm) + if isinstance(agent, CodeActAgent): + if not self.runtime or not isinstance(self.runtime.sandbox, DockerSSHBox): + logger.warning( + 'CodeActAgent requires DockerSSHBox as sandbox! Using other sandbox that are not stateful (LocalBox, DockerExecBox) will not work properly.' + ) + if self.controller is not None: await self.controller.close() try: self.controller = AgentController( sid=self.sid, event_stream=self.event_stream, - agent=Agent.get_cls(agent_cls)(llm), + agent=agent, max_iterations=int(max_iterations), max_chars=int(max_chars), ) @@ -131,9 +148,7 @@ class AgentUnit: return async def close(self): - """Cleanly exits an AgentUnit. - - Execution awaited by the AgentManager. - """ if self.controller is not None: await self.controller.close() + if self.runtime is not None: + self.runtime.close() diff --git a/poetry.lock b/poetry.lock index 71f12ac407..466dde2a1c 100644 --- a/poetry.lock +++ b/poetry.lock @@ -335,17 +335,17 @@ files = [ [[package]] name = "boto3" -version = "1.34.103" +version = "1.34.104" description = "The AWS SDK for Python" optional = false python-versions = ">=3.8" files = [ - {file = "boto3-1.34.103-py3-none-any.whl", hash = "sha256:59b6499f1bb423dd99de6566a20d0a7cf1a5476824be3a792290fd86600e8365"}, - {file = "boto3-1.34.103.tar.gz", hash = "sha256:58d097241f3895c4a4c80c9e606689c6e06d77f55f9f53a4cc02dee7e03938b9"}, + {file = "boto3-1.34.104-py3-none-any.whl", hash = "sha256:bec91a3bca63320e5f68a25b5eaa7bab65e35bb9253a544875c2e03679f1d5fb"}, + {file = "boto3-1.34.104.tar.gz", hash = "sha256:5b37c8f4ea6f408147994a6e230c49ca755da57f5964ccea8b8fd4ff5f11759e"}, ] [package.dependencies] -botocore = ">=1.34.103,<1.35.0" +botocore = ">=1.34.104,<1.35.0" jmespath = ">=0.7.1,<2.0.0" s3transfer = ">=0.10.0,<0.11.0" @@ -354,13 +354,13 @@ crt = ["botocore[crt] (>=1.21.0,<2.0a0)"] [[package]] name = "botocore" -version = "1.34.103" +version = "1.34.104" description = "Low-level, data-driven core of boto 3." optional = false python-versions = ">=3.8" files = [ - {file = "botocore-1.34.103-py3-none-any.whl", hash = "sha256:0330d139f18f78d38127e65361859e24ebd6a8bcba184f903c01bb999a3fa431"}, - {file = "botocore-1.34.103.tar.gz", hash = "sha256:5f07e2c7302c0a9f469dcd08b4ddac152e9f5888b12220242c20056255010939"}, + {file = "botocore-1.34.104-py3-none-any.whl", hash = "sha256:b68ed482e9b4c313129c9948af5a91d0e84840558e6d232a1a27ab0b9733e5b9"}, + {file = "botocore-1.34.104.tar.gz", hash = "sha256:fe36dd3cea4160fbbe27dc1cf89cb7018234350555a26933b2977947052a346a"}, ] [package.dependencies] @@ -1539,15 +1539,78 @@ smb = ["smbprotocol"] ssh = ["paramiko"] tqdm = ["tqdm"] +[[package]] +name = "gevent" +version = "24.2.1" +description = "Coroutine-based network library" +optional = false +python-versions = ">=3.8" +files = [ + {file = "gevent-24.2.1-cp310-cp310-macosx_11_0_universal2.whl", hash = "sha256:6f947a9abc1a129858391b3d9334c45041c08a0f23d14333d5b844b6e5c17a07"}, + {file = "gevent-24.2.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bde283313daf0b34a8d1bab30325f5cb0f4e11b5869dbe5bc61f8fe09a8f66f3"}, + {file = "gevent-24.2.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5a1df555431f5cd5cc189a6ee3544d24f8c52f2529134685f1e878c4972ab026"}, + {file = "gevent-24.2.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:14532a67f7cb29fb055a0e9b39f16b88ed22c66b96641df8c04bdc38c26b9ea5"}, + {file = "gevent-24.2.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dd23df885318391856415e20acfd51a985cba6919f0be78ed89f5db9ff3a31cb"}, + {file = "gevent-24.2.1-cp310-cp310-manylinux_2_28_x86_64.whl", hash = "sha256:ca80b121bbec76d7794fcb45e65a7eca660a76cc1a104ed439cdbd7df5f0b060"}, + {file = "gevent-24.2.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:b9913c45d1be52d7a5db0c63977eebb51f68a2d5e6fd922d1d9b5e5fd758cc98"}, + {file = "gevent-24.2.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:918cdf8751b24986f915d743225ad6b702f83e1106e08a63b736e3a4c6ead789"}, + {file = "gevent-24.2.1-cp310-cp310-win_amd64.whl", hash = "sha256:3d5325ccfadfd3dcf72ff88a92fb8fc0b56cacc7225f0f4b6dcf186c1a6eeabc"}, + {file = "gevent-24.2.1-cp311-cp311-macosx_11_0_universal2.whl", hash = "sha256:03aa5879acd6b7076f6a2a307410fb1e0d288b84b03cdfd8c74db8b4bc882fc5"}, + {file = "gevent-24.2.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f8bb35ce57a63c9a6896c71a285818a3922d8ca05d150fd1fe49a7f57287b836"}, + {file = "gevent-24.2.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d7f87c2c02e03d99b95cfa6f7a776409083a9e4d468912e18c7680437b29222c"}, + {file = "gevent-24.2.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:968581d1717bbcf170758580f5f97a2925854943c45a19be4d47299507db2eb7"}, + {file = "gevent-24.2.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7899a38d0ae7e817e99adb217f586d0a4620e315e4de577444ebeeed2c5729be"}, + {file = "gevent-24.2.1-cp311-cp311-manylinux_2_28_x86_64.whl", hash = "sha256:f5e8e8d60e18d5f7fd49983f0c4696deeddaf6e608fbab33397671e2fcc6cc91"}, + {file = "gevent-24.2.1-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:fbfdce91239fe306772faab57597186710d5699213f4df099d1612da7320d682"}, + {file = "gevent-24.2.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:cdf66977a976d6a3cfb006afdf825d1482f84f7b81179db33941f2fc9673bb1d"}, + {file = "gevent-24.2.1-cp311-cp311-win_amd64.whl", hash = "sha256:1dffb395e500613e0452b9503153f8f7ba587c67dd4a85fc7cd7aa7430cb02cc"}, + {file = "gevent-24.2.1-cp312-cp312-macosx_11_0_universal2.whl", hash = "sha256:6c47ae7d1174617b3509f5d884935e788f325eb8f1a7efc95d295c68d83cce40"}, + {file = "gevent-24.2.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f7cac622e11b4253ac4536a654fe221249065d9a69feb6cdcd4d9af3503602e0"}, + {file = "gevent-24.2.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:bf5b9c72b884c6f0c4ed26ef204ee1f768b9437330422492c319470954bc4cc7"}, + {file = "gevent-24.2.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f5de3c676e57177b38857f6e3cdfbe8f38d1cd754b63200c0615eaa31f514b4f"}, + {file = "gevent-24.2.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d4faf846ed132fd7ebfbbf4fde588a62d21faa0faa06e6f468b7faa6f436b661"}, + {file = "gevent-24.2.1-cp312-cp312-manylinux_2_28_x86_64.whl", hash = "sha256:368a277bd9278ddb0fde308e6a43f544222d76ed0c4166e0d9f6b036586819d9"}, + {file = "gevent-24.2.1-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:f8a04cf0c5b7139bc6368b461257d4a757ea2fe89b3773e494d235b7dd51119f"}, + {file = "gevent-24.2.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:9d8d0642c63d453179058abc4143e30718b19a85cbf58c2744c9a63f06a1d388"}, + {file = "gevent-24.2.1-cp312-cp312-win_amd64.whl", hash = "sha256:94138682e68ec197db42ad7442d3cf9b328069c3ad8e4e5022e6b5cd3e7ffae5"}, + {file = "gevent-24.2.1-cp38-cp38-macosx_11_0_universal2.whl", hash = "sha256:8f4b8e777d39013595a7740b4463e61b1cfe5f462f1b609b28fbc1e4c4ff01e5"}, + {file = "gevent-24.2.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:141a2b24ad14f7b9576965c0c84927fc85f824a9bb19f6ec1e61e845d87c9cd8"}, + {file = "gevent-24.2.1-cp38-cp38-manylinux_2_28_x86_64.whl", hash = "sha256:9202f22ef811053077d01f43cc02b4aaf4472792f9fd0f5081b0b05c926cca19"}, + {file = "gevent-24.2.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:2955eea9c44c842c626feebf4459c42ce168685aa99594e049d03bedf53c2800"}, + {file = "gevent-24.2.1-cp38-cp38-win32.whl", hash = "sha256:44098038d5e2749b0784aabb27f1fcbb3f43edebedf64d0af0d26955611be8d6"}, + {file = "gevent-24.2.1-cp38-cp38-win_amd64.whl", hash = "sha256:117e5837bc74a1673605fb53f8bfe22feb6e5afa411f524c835b2ddf768db0de"}, + {file = "gevent-24.2.1-cp39-cp39-macosx_11_0_universal2.whl", hash = "sha256:2ae3a25ecce0a5b0cd0808ab716bfca180230112bb4bc89b46ae0061d62d4afe"}, + {file = "gevent-24.2.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a7ceb59986456ce851160867ce4929edaffbd2f069ae25717150199f8e1548b8"}, + {file = "gevent-24.2.1-cp39-cp39-manylinux_2_28_x86_64.whl", hash = "sha256:2e9ac06f225b696cdedbb22f9e805e2dd87bf82e8fa5e17756f94e88a9d37cf7"}, + {file = "gevent-24.2.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:90cbac1ec05b305a1b90ede61ef73126afdeb5a804ae04480d6da12c56378df1"}, + {file = "gevent-24.2.1-cp39-cp39-win32.whl", hash = "sha256:782a771424fe74bc7e75c228a1da671578c2ba4ddb2ca09b8f959abdf787331e"}, + {file = "gevent-24.2.1-cp39-cp39-win_amd64.whl", hash = "sha256:3adfb96637f44010be8abd1b5e73b5070f851b817a0b182e601202f20fa06533"}, + {file = "gevent-24.2.1-pp310-pypy310_pp73-macosx_11_0_universal2.whl", hash = "sha256:7b00f8c9065de3ad226f7979154a7b27f3b9151c8055c162332369262fc025d8"}, + {file = "gevent-24.2.1.tar.gz", hash = "sha256:432fc76f680acf7cf188c2ee0f5d3ab73b63c1f03114c7cd8a34cebbe5aa2056"}, +] + +[package.dependencies] +cffi = {version = ">=1.12.2", markers = "platform_python_implementation == \"CPython\" and sys_platform == \"win32\""} +greenlet = {version = ">=3.0rc3", markers = "platform_python_implementation == \"CPython\" and python_version >= \"3.11\""} +"zope.event" = "*" +"zope.interface" = "*" + +[package.extras] +dnspython = ["dnspython (>=1.16.0,<2.0)", "idna"] +docs = ["furo", "repoze.sphinx.autointerface", "sphinx", "sphinxcontrib-programoutput", "zope.schema"] +monitor = ["psutil (>=5.7.0)"] +recommended = ["cffi (>=1.12.2)", "dnspython (>=1.16.0,<2.0)", "idna", "psutil (>=5.7.0)"] +test = ["cffi (>=1.12.2)", "coverage (>=5.0)", "dnspython (>=1.16.0,<2.0)", "idna", "objgraph", "psutil (>=5.7.0)", "requests"] + [[package]] name = "google-ai-generativelanguage" -version = "0.6.2" +version = "0.6.3" description = "Google Ai Generativelanguage API client library" optional = false python-versions = ">=3.7" files = [ - {file = "google-ai-generativelanguage-0.6.2.tar.gz", hash = "sha256:308791ac3b9dad015b359172970739aa3753dd542142a416d07f9fa047e22386"}, - {file = "google_ai_generativelanguage-0.6.2-py3-none-any.whl", hash = "sha256:bf84c34c641570d7e8a1f2e6901e6771af1438f2ee8307d1801fd43585f9b1c6"}, + {file = "google-ai-generativelanguage-0.6.3.tar.gz", hash = "sha256:10a11f1e1bb8470ff50030c1acd729b3aba7a29ade2c30cf1d1c917291366c67"}, + {file = "google_ai_generativelanguage-0.6.3-py3-none-any.whl", hash = "sha256:55a6698f6c9cbbfde5f9cd288073b6941dd9e3e6dc2176dfa3197f9a4c489895"}, ] [package.dependencies] @@ -1639,16 +1702,16 @@ httplib2 = ">=0.19.0" [[package]] name = "google-generativeai" -version = "0.5.2" +version = "0.5.3" description = "Google Generative AI High level API client library and tools." optional = false python-versions = ">=3.9" files = [ - {file = "google_generativeai-0.5.2-py3-none-any.whl", hash = "sha256:56f39485a0a673c93c21ec31c17809cc6a964193fb77b7ce809ad15d0dd72d7b"}, + {file = "google_generativeai-0.5.3-py3-none-any.whl", hash = "sha256:a74509ee219601c74c0561eb4e1c9af6a88594c7dd098d30a18c6592afe62bd9"}, ] [package.dependencies] -google-ai-generativelanguage = "0.6.2" +google-ai-generativelanguage = "0.6.3" google-api-core = "*" google-api-python-client = "*" google-auth = ">=2.15.0" @@ -2156,13 +2219,13 @@ files = [ [[package]] name = "json-repair" -version = "0.19.0" +version = "0.19.1" description = "A package to repair broken json strings" optional = false python-versions = ">=3.7" files = [ - {file = "json_repair-0.19.0-py3-none-any.whl", hash = "sha256:5f39beec06af677eaaf302b53477e26674b0b1f5136279742639c2dfe8253a07"}, - {file = "json_repair-0.19.0.tar.gz", hash = "sha256:82b33db04ea849bde8382f94cc38f3ecb33a1d84303184847bda94c16f0ac44e"}, + {file = "json_repair-0.19.1-py3-none-any.whl", hash = "sha256:ec9bf426481352390771f7814823e68975cbedcf8e09bfefdc8478e648692215"}, + {file = "json_repair-0.19.1.tar.gz", hash = "sha256:b1de048af915044e5324c1d7a48cc2e083d9f3929ac453dc50972a0d47011c37"}, ] [[package]] @@ -2345,13 +2408,13 @@ types-tqdm = "*" [[package]] name = "litellm" -version = "1.37.5" +version = "1.37.9" description = "Library to easily interface with LLM API providers" optional = false python-versions = "!=2.7.*,!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,!=3.6.*,!=3.7.*,>=3.8" files = [ - {file = "litellm-1.37.5-py3-none-any.whl", hash = "sha256:a444dad4079d3d4c49037fe37581cd04b2135e674e9e9d1cfdbda32facd546ec"}, - {file = "litellm-1.37.5.tar.gz", hash = "sha256:22d7292d2952d82992ebebc3b7dfa1a97393f603ce652f3223f2742123ba7f2b"}, + {file = "litellm-1.37.9-py3-none-any.whl", hash = "sha256:f5e96df4e28e302a5df4e8f5599ac35ffbeebbacf4d68f4c609155e24ba8fa03"}, + {file = "litellm-1.37.9.tar.gz", hash = "sha256:2a2fecacde1e3a414b3865c99e5be3b5cffd21433e2648f660116f1ac9333294"}, ] [package.dependencies] @@ -2367,7 +2430,7 @@ tokenizers = "*" [package.extras] extra-proxy = ["azure-identity (>=1.15.0,<2.0.0)", "azure-keyvault-secrets (>=4.8.0,<5.0.0)", "google-cloud-kms (>=2.21.3,<3.0.0)", "prisma (==0.11.0)", "resend (>=0.8.0,<0.9.0)"] -proxy = ["PyJWT (>=2.8.0,<3.0.0)", "apscheduler (>=3.10.4,<4.0.0)", "backoff", "cryptography (>=42.0.5,<43.0.0)", "fastapi (>=0.109.1,<0.110.0)", "fastapi-sso (>=0.10.0,<0.11.0)", "gunicorn (>=22.0.0,<23.0.0)", "orjson (>=3.9.7,<4.0.0)", "python-multipart (>=0.0.9,<0.0.10)", "pyyaml (>=6.0.1,<7.0.0)", "rq", "uvicorn (>=0.22.0,<0.23.0)"] +proxy = ["PyJWT (>=2.8.0,<3.0.0)", "apscheduler (>=3.10.4,<4.0.0)", "backoff", "cryptography (>=42.0.5,<43.0.0)", "fastapi (>=0.111.0,<0.112.0)", "fastapi-sso (>=0.10.0,<0.11.0)", "gunicorn (>=22.0.0,<23.0.0)", "orjson (>=3.9.7,<4.0.0)", "python-multipart (>=0.0.9,<0.0.10)", "pyyaml (>=6.0.1,<7.0.0)", "rq", "uvicorn (>=0.22.0,<0.23.0)"] [[package]] name = "llama-index" @@ -2603,13 +2666,13 @@ llama-index-llms-openai = ">=0.1.1,<0.2.0" [[package]] name = "llama-index-llms-openai" -version = "0.1.18" +version = "0.1.19" description = "llama-index llms openai integration" optional = false python-versions = "<4.0,>=3.8.1" files = [ - {file = "llama_index_llms_openai-0.1.18-py3-none-any.whl", hash = "sha256:934cf72d10385f1c76c0183b0e94ce1850fab1026287e01b7db0a14c946dfd79"}, - {file = "llama_index_llms_openai-0.1.18.tar.gz", hash = "sha256:8cb7546a1885ba558ff580b114d638569a0aed81a264961114e719bc42b37100"}, + {file = "llama_index_llms_openai-0.1.19-py3-none-any.whl", hash = "sha256:2bd98ff3abbb4aa0daed1fbe01d8b69f8270ab86c53f8da51fc9f148a672264c"}, + {file = "llama_index_llms_openai-0.1.19.tar.gz", hash = "sha256:f61b64a997892e424fb3cd547090d279c5b210ef15b614fc39de854d3ccaa7e7"}, ] [package.dependencies] @@ -2617,13 +2680,13 @@ llama-index-core = ">=0.10.24,<0.11.0" [[package]] name = "llama-index-multi-modal-llms-openai" -version = "0.1.5" +version = "0.1.6" description = "llama-index multi-modal-llms openai integration" optional = false python-versions = "<4.0,>=3.8.1" files = [ - {file = "llama_index_multi_modal_llms_openai-0.1.5-py3-none-any.whl", hash = "sha256:bb332580e7e4b5f2f87488b3649d2ceb53ee82c848e59694578a982c3982ce0b"}, - {file = "llama_index_multi_modal_llms_openai-0.1.5.tar.gz", hash = "sha256:9a237f4f886d1e20c27e9493e80b3e1f8753859481ff1b58fe25b7aa39b198a2"}, + {file = "llama_index_multi_modal_llms_openai-0.1.6-py3-none-any.whl", hash = "sha256:0b6950a6cf98d16ade7d3b9dd0821ecfe457ca103819ae6c3e66cfc9634ca646"}, + {file = "llama_index_multi_modal_llms_openai-0.1.6.tar.gz", hash = "sha256:10de75a877a444af35306385faad9b9f0624391e55309970564114a080a0578c"}, ] [package.dependencies] @@ -2743,166 +2806,149 @@ pydantic = ">=1.10" [[package]] name = "lxml" -version = "5.2.1" +version = "5.2.2" description = "Powerful and Pythonic XML processing library combining libxml2/libxslt with the ElementTree API." optional = false python-versions = ">=3.6" files = [ - {file = "lxml-5.2.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:1f7785f4f789fdb522729ae465adcaa099e2a3441519df750ebdccc481d961a1"}, - {file = "lxml-5.2.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:6cc6ee342fb7fa2471bd9b6d6fdfc78925a697bf5c2bcd0a302e98b0d35bfad3"}, - {file = "lxml-5.2.1-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:794f04eec78f1d0e35d9e0c36cbbb22e42d370dda1609fb03bcd7aeb458c6377"}, - {file = "lxml-5.2.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c817d420c60a5183953c783b0547d9eb43b7b344a2c46f69513d5952a78cddf3"}, - {file = "lxml-5.2.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:2213afee476546a7f37c7a9b4ad4d74b1e112a6fafffc9185d6d21f043128c81"}, - {file = "lxml-5.2.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b070bbe8d3f0f6147689bed981d19bbb33070225373338df755a46893528104a"}, - {file = "lxml-5.2.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e02c5175f63effbd7c5e590399c118d5db6183bbfe8e0d118bdb5c2d1b48d937"}, - {file = "lxml-5.2.1-cp310-cp310-manylinux_2_28_aarch64.whl", hash = "sha256:3dc773b2861b37b41a6136e0b72a1a44689a9c4c101e0cddb6b854016acc0aa8"}, - {file = "lxml-5.2.1-cp310-cp310-manylinux_2_28_ppc64le.whl", hash = "sha256:d7520db34088c96cc0e0a3ad51a4fd5b401f279ee112aa2b7f8f976d8582606d"}, - {file = "lxml-5.2.1-cp310-cp310-manylinux_2_28_s390x.whl", hash = "sha256:bcbf4af004f98793a95355980764b3d80d47117678118a44a80b721c9913436a"}, - {file = "lxml-5.2.1-cp310-cp310-manylinux_2_28_x86_64.whl", hash = "sha256:a2b44bec7adf3e9305ce6cbfa47a4395667e744097faed97abb4728748ba7d47"}, - {file = "lxml-5.2.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:1c5bb205e9212d0ebddf946bc07e73fa245c864a5f90f341d11ce7b0b854475d"}, - {file = "lxml-5.2.1-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:2c9d147f754b1b0e723e6afb7ba1566ecb162fe4ea657f53d2139bbf894d050a"}, - {file = "lxml-5.2.1-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:3545039fa4779be2df51d6395e91a810f57122290864918b172d5dc7ca5bb433"}, - {file = "lxml-5.2.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:a91481dbcddf1736c98a80b122afa0f7296eeb80b72344d7f45dc9f781551f56"}, - {file = "lxml-5.2.1-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:2ddfe41ddc81f29a4c44c8ce239eda5ade4e7fc305fb7311759dd6229a080052"}, - {file = "lxml-5.2.1-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:a7baf9ffc238e4bf401299f50e971a45bfcc10a785522541a6e3179c83eabf0a"}, - {file = "lxml-5.2.1-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:31e9a882013c2f6bd2f2c974241bf4ba68c85eba943648ce88936d23209a2e01"}, - {file = "lxml-5.2.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:0a15438253b34e6362b2dc41475e7f80de76320f335e70c5528b7148cac253a1"}, - {file = "lxml-5.2.1-cp310-cp310-win32.whl", hash = "sha256:6992030d43b916407c9aa52e9673612ff39a575523c5f4cf72cdef75365709a5"}, - {file = "lxml-5.2.1-cp310-cp310-win_amd64.whl", hash = "sha256:da052e7962ea2d5e5ef5bc0355d55007407087392cf465b7ad84ce5f3e25fe0f"}, - {file = "lxml-5.2.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:70ac664a48aa64e5e635ae5566f5227f2ab7f66a3990d67566d9907edcbbf867"}, - {file = "lxml-5.2.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:1ae67b4e737cddc96c99461d2f75d218bdf7a0c3d3ad5604d1f5e7464a2f9ffe"}, - {file = "lxml-5.2.1-cp311-cp311-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f18a5a84e16886898e51ab4b1d43acb3083c39b14c8caeb3589aabff0ee0b270"}, - {file = "lxml-5.2.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c6f2c8372b98208ce609c9e1d707f6918cc118fea4e2c754c9f0812c04ca116d"}, - {file = "lxml-5.2.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:394ed3924d7a01b5bd9a0d9d946136e1c2f7b3dc337196d99e61740ed4bc6fe1"}, - {file = "lxml-5.2.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5d077bc40a1fe984e1a9931e801e42959a1e6598edc8a3223b061d30fbd26bbc"}, - {file = "lxml-5.2.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:764b521b75701f60683500d8621841bec41a65eb739b8466000c6fdbc256c240"}, - {file = "lxml-5.2.1-cp311-cp311-manylinux_2_28_aarch64.whl", hash = "sha256:3a6b45da02336895da82b9d472cd274b22dc27a5cea1d4b793874eead23dd14f"}, - {file = "lxml-5.2.1-cp311-cp311-manylinux_2_28_ppc64le.whl", hash = "sha256:5ea7b6766ac2dfe4bcac8b8595107665a18ef01f8c8343f00710b85096d1b53a"}, - {file = "lxml-5.2.1-cp311-cp311-manylinux_2_28_s390x.whl", hash = "sha256:e196a4ff48310ba62e53a8e0f97ca2bca83cdd2fe2934d8b5cb0df0a841b193a"}, - {file = "lxml-5.2.1-cp311-cp311-manylinux_2_28_x86_64.whl", hash = "sha256:200e63525948e325d6a13a76ba2911f927ad399ef64f57898cf7c74e69b71095"}, - {file = "lxml-5.2.1-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:dae0ed02f6b075426accbf6b2863c3d0a7eacc1b41fb40f2251d931e50188dad"}, - {file = "lxml-5.2.1-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:ab31a88a651039a07a3ae327d68ebdd8bc589b16938c09ef3f32a4b809dc96ef"}, - {file = "lxml-5.2.1-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:df2e6f546c4df14bc81f9498bbc007fbb87669f1bb707c6138878c46b06f6510"}, - {file = "lxml-5.2.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:5dd1537e7cc06efd81371f5d1a992bd5ab156b2b4f88834ca852de4a8ea523fa"}, - {file = "lxml-5.2.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:9b9ec9c9978b708d488bec36b9e4c94d88fd12ccac3e62134a9d17ddba910ea9"}, - {file = "lxml-5.2.1-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:8e77c69d5892cb5ba71703c4057091e31ccf534bd7f129307a4d084d90d014b8"}, - {file = "lxml-5.2.1-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:a8d5c70e04aac1eda5c829a26d1f75c6e5286c74743133d9f742cda8e53b9c2f"}, - {file = "lxml-5.2.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:c94e75445b00319c1fad60f3c98b09cd63fe1134a8a953dcd48989ef42318534"}, - {file = "lxml-5.2.1-cp311-cp311-win32.whl", hash = "sha256:4951e4f7a5680a2db62f7f4ab2f84617674d36d2d76a729b9a8be4b59b3659be"}, - {file = "lxml-5.2.1-cp311-cp311-win_amd64.whl", hash = "sha256:5c670c0406bdc845b474b680b9a5456c561c65cf366f8db5a60154088c92d102"}, - {file = "lxml-5.2.1-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:abc25c3cab9ec7fcd299b9bcb3b8d4a1231877e425c650fa1c7576c5107ab851"}, - {file = "lxml-5.2.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:6935bbf153f9a965f1e07c2649c0849d29832487c52bb4a5c5066031d8b44fd5"}, - {file = "lxml-5.2.1-cp312-cp312-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d793bebb202a6000390a5390078e945bbb49855c29c7e4d56a85901326c3b5d9"}, - {file = "lxml-5.2.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:afd5562927cdef7c4f5550374acbc117fd4ecc05b5007bdfa57cc5355864e0a4"}, - {file = "lxml-5.2.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:0e7259016bc4345a31af861fdce942b77c99049d6c2107ca07dc2bba2435c1d9"}, - {file = "lxml-5.2.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:530e7c04f72002d2f334d5257c8a51bf409db0316feee7c87e4385043be136af"}, - {file = "lxml-5.2.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:59689a75ba8d7ffca577aefd017d08d659d86ad4585ccc73e43edbfc7476781a"}, - {file = "lxml-5.2.1-cp312-cp312-manylinux_2_28_aarch64.whl", hash = "sha256:f9737bf36262046213a28e789cc82d82c6ef19c85a0cf05e75c670a33342ac2c"}, - {file = "lxml-5.2.1-cp312-cp312-manylinux_2_28_ppc64le.whl", hash = "sha256:3a74c4f27167cb95c1d4af1c0b59e88b7f3e0182138db2501c353555f7ec57f4"}, - {file = "lxml-5.2.1-cp312-cp312-manylinux_2_28_s390x.whl", hash = "sha256:68a2610dbe138fa8c5826b3f6d98a7cfc29707b850ddcc3e21910a6fe51f6ca0"}, - {file = "lxml-5.2.1-cp312-cp312-manylinux_2_28_x86_64.whl", hash = "sha256:f0a1bc63a465b6d72569a9bba9f2ef0334c4e03958e043da1920299100bc7c08"}, - {file = "lxml-5.2.1-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:c2d35a1d047efd68027817b32ab1586c1169e60ca02c65d428ae815b593e65d4"}, - {file = "lxml-5.2.1-cp312-cp312-musllinux_1_1_ppc64le.whl", hash = "sha256:79bd05260359170f78b181b59ce871673ed01ba048deef4bf49a36ab3e72e80b"}, - {file = "lxml-5.2.1-cp312-cp312-musllinux_1_1_s390x.whl", hash = "sha256:865bad62df277c04beed9478fe665b9ef63eb28fe026d5dedcb89b537d2e2ea6"}, - {file = "lxml-5.2.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:44f6c7caff88d988db017b9b0e4ab04934f11e3e72d478031efc7edcac6c622f"}, - {file = "lxml-5.2.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:71e97313406ccf55d32cc98a533ee05c61e15d11b99215b237346171c179c0b0"}, - {file = "lxml-5.2.1-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:057cdc6b86ab732cf361f8b4d8af87cf195a1f6dc5b0ff3de2dced242c2015e0"}, - {file = "lxml-5.2.1-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:f3bbbc998d42f8e561f347e798b85513ba4da324c2b3f9b7969e9c45b10f6169"}, - {file = "lxml-5.2.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:491755202eb21a5e350dae00c6d9a17247769c64dcf62d8c788b5c135e179dc4"}, - {file = "lxml-5.2.1-cp312-cp312-win32.whl", hash = "sha256:8de8f9d6caa7f25b204fc861718815d41cbcf27ee8f028c89c882a0cf4ae4134"}, - {file = "lxml-5.2.1-cp312-cp312-win_amd64.whl", hash = "sha256:f2a9efc53d5b714b8df2b4b3e992accf8ce5bbdfe544d74d5c6766c9e1146a3a"}, - {file = "lxml-5.2.1-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:70a9768e1b9d79edca17890175ba915654ee1725975d69ab64813dd785a2bd5c"}, - {file = "lxml-5.2.1-cp36-cp36m-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c38d7b9a690b090de999835f0443d8aa93ce5f2064035dfc48f27f02b4afc3d0"}, - {file = "lxml-5.2.1-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5670fb70a828663cc37552a2a85bf2ac38475572b0e9b91283dc09efb52c41d1"}, - {file = "lxml-5.2.1-cp36-cp36m-manylinux_2_28_x86_64.whl", hash = "sha256:958244ad566c3ffc385f47dddde4145088a0ab893504b54b52c041987a8c1863"}, - {file = "lxml-5.2.1-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:b6241d4eee5f89453307c2f2bfa03b50362052ca0af1efecf9fef9a41a22bb4f"}, - {file = "lxml-5.2.1-cp36-cp36m-musllinux_1_1_aarch64.whl", hash = "sha256:2a66bf12fbd4666dd023b6f51223aed3d9f3b40fef06ce404cb75bafd3d89536"}, - {file = "lxml-5.2.1-cp36-cp36m-musllinux_1_1_ppc64le.whl", hash = "sha256:9123716666e25b7b71c4e1789ec829ed18663152008b58544d95b008ed9e21e9"}, - {file = "lxml-5.2.1-cp36-cp36m-musllinux_1_1_s390x.whl", hash = "sha256:0c3f67e2aeda739d1cc0b1102c9a9129f7dc83901226cc24dd72ba275ced4218"}, - {file = "lxml-5.2.1-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:5d5792e9b3fb8d16a19f46aa8208987cfeafe082363ee2745ea8b643d9cc5b45"}, - {file = "lxml-5.2.1-cp36-cp36m-musllinux_1_2_aarch64.whl", hash = "sha256:88e22fc0a6684337d25c994381ed8a1580a6f5ebebd5ad41f89f663ff4ec2885"}, - {file = "lxml-5.2.1-cp36-cp36m-musllinux_1_2_ppc64le.whl", hash = "sha256:21c2e6b09565ba5b45ae161b438e033a86ad1736b8c838c766146eff8ceffff9"}, - {file = "lxml-5.2.1-cp36-cp36m-musllinux_1_2_s390x.whl", hash = "sha256:afbbdb120d1e78d2ba8064a68058001b871154cc57787031b645c9142b937a62"}, - {file = "lxml-5.2.1-cp36-cp36m-musllinux_1_2_x86_64.whl", hash = "sha256:627402ad8dea044dde2eccde4370560a2b750ef894c9578e1d4f8ffd54000461"}, - {file = "lxml-5.2.1-cp36-cp36m-win32.whl", hash = "sha256:e89580a581bf478d8dcb97d9cd011d567768e8bc4095f8557b21c4d4c5fea7d0"}, - {file = "lxml-5.2.1-cp36-cp36m-win_amd64.whl", hash = "sha256:59565f10607c244bc4c05c0c5fa0c190c990996e0c719d05deec7030c2aa8289"}, - {file = "lxml-5.2.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:857500f88b17a6479202ff5fe5f580fc3404922cd02ab3716197adf1ef628029"}, - {file = "lxml-5.2.1-cp37-cp37m-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:56c22432809085b3f3ae04e6e7bdd36883d7258fcd90e53ba7b2e463efc7a6af"}, - {file = "lxml-5.2.1-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a55ee573116ba208932e2d1a037cc4b10d2c1cb264ced2184d00b18ce585b2c0"}, - {file = "lxml-5.2.1-cp37-cp37m-manylinux_2_28_x86_64.whl", hash = "sha256:6cf58416653c5901e12624e4013708b6e11142956e7f35e7a83f1ab02f3fe456"}, - {file = "lxml-5.2.1-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:64c2baa7774bc22dd4474248ba16fe1a7f611c13ac6123408694d4cc93d66dbd"}, - {file = "lxml-5.2.1-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:74b28c6334cca4dd704e8004cba1955af0b778cf449142e581e404bd211fb619"}, - {file = "lxml-5.2.1-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:7221d49259aa1e5a8f00d3d28b1e0b76031655ca74bb287123ef56c3db92f213"}, - {file = "lxml-5.2.1-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:3dbe858ee582cbb2c6294dc85f55b5f19c918c2597855e950f34b660f1a5ede6"}, - {file = "lxml-5.2.1-cp37-cp37m-musllinux_1_2_aarch64.whl", hash = "sha256:04ab5415bf6c86e0518d57240a96c4d1fcfc3cb370bb2ac2a732b67f579e5a04"}, - {file = "lxml-5.2.1-cp37-cp37m-musllinux_1_2_ppc64le.whl", hash = "sha256:6ab833e4735a7e5533711a6ea2df26459b96f9eec36d23f74cafe03631647c41"}, - {file = "lxml-5.2.1-cp37-cp37m-musllinux_1_2_s390x.whl", hash = "sha256:f443cdef978430887ed55112b491f670bba6462cea7a7742ff8f14b7abb98d75"}, - {file = "lxml-5.2.1-cp37-cp37m-musllinux_1_2_x86_64.whl", hash = "sha256:9e2addd2d1866fe112bc6f80117bcc6bc25191c5ed1bfbcf9f1386a884252ae8"}, - {file = "lxml-5.2.1-cp37-cp37m-win32.whl", hash = "sha256:f51969bac61441fd31f028d7b3b45962f3ecebf691a510495e5d2cd8c8092dbd"}, - {file = "lxml-5.2.1-cp37-cp37m-win_amd64.whl", hash = "sha256:b0b58fbfa1bf7367dde8a557994e3b1637294be6cf2169810375caf8571a085c"}, - {file = "lxml-5.2.1-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:3e183c6e3298a2ed5af9d7a356ea823bccaab4ec2349dc9ed83999fd289d14d5"}, - {file = "lxml-5.2.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:804f74efe22b6a227306dd890eecc4f8c59ff25ca35f1f14e7482bbce96ef10b"}, - {file = "lxml-5.2.1-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:08802f0c56ed150cc6885ae0788a321b73505d2263ee56dad84d200cab11c07a"}, - {file = "lxml-5.2.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0f8c09ed18ecb4ebf23e02b8e7a22a05d6411911e6fabef3a36e4f371f4f2585"}, - {file = "lxml-5.2.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e3d30321949861404323c50aebeb1943461a67cd51d4200ab02babc58bd06a86"}, - {file = "lxml-5.2.1-cp38-cp38-manylinux_2_28_aarch64.whl", hash = "sha256:b560e3aa4b1d49e0e6c847d72665384db35b2f5d45f8e6a5c0072e0283430533"}, - {file = "lxml-5.2.1-cp38-cp38-manylinux_2_28_x86_64.whl", hash = "sha256:058a1308914f20784c9f4674036527e7c04f7be6fb60f5d61353545aa7fcb739"}, - {file = "lxml-5.2.1-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:adfb84ca6b87e06bc6b146dc7da7623395db1e31621c4785ad0658c5028b37d7"}, - {file = "lxml-5.2.1-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:417d14450f06d51f363e41cace6488519038f940676ce9664b34ebf5653433a5"}, - {file = "lxml-5.2.1-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:a2dfe7e2473f9b59496247aad6e23b405ddf2e12ef0765677b0081c02d6c2c0b"}, - {file = "lxml-5.2.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:bf2e2458345d9bffb0d9ec16557d8858c9c88d2d11fed53998512504cd9df49b"}, - {file = "lxml-5.2.1-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:58278b29cb89f3e43ff3e0c756abbd1518f3ee6adad9e35b51fb101c1c1daaec"}, - {file = "lxml-5.2.1-cp38-cp38-musllinux_1_2_ppc64le.whl", hash = "sha256:64641a6068a16201366476731301441ce93457eb8452056f570133a6ceb15fca"}, - {file = "lxml-5.2.1-cp38-cp38-musllinux_1_2_s390x.whl", hash = "sha256:78bfa756eab503673991bdcf464917ef7845a964903d3302c5f68417ecdc948c"}, - {file = "lxml-5.2.1-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:11a04306fcba10cd9637e669fd73aa274c1c09ca64af79c041aa820ea992b637"}, - {file = "lxml-5.2.1-cp38-cp38-win32.whl", hash = "sha256:66bc5eb8a323ed9894f8fa0ee6cb3e3fb2403d99aee635078fd19a8bc7a5a5da"}, - {file = "lxml-5.2.1-cp38-cp38-win_amd64.whl", hash = "sha256:9676bfc686fa6a3fa10cd4ae6b76cae8be26eb5ec6811d2a325636c460da1806"}, - {file = "lxml-5.2.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:cf22b41fdae514ee2f1691b6c3cdeae666d8b7fa9434de445f12bbeee0cf48dd"}, - {file = "lxml-5.2.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:ec42088248c596dbd61d4ae8a5b004f97a4d91a9fd286f632e42e60b706718d7"}, - {file = "lxml-5.2.1-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:cd53553ddad4a9c2f1f022756ae64abe16da1feb497edf4d9f87f99ec7cf86bd"}, - {file = "lxml-5.2.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:feaa45c0eae424d3e90d78823f3828e7dc42a42f21ed420db98da2c4ecf0a2cb"}, - {file = "lxml-5.2.1-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ddc678fb4c7e30cf830a2b5a8d869538bc55b28d6c68544d09c7d0d8f17694dc"}, - {file = "lxml-5.2.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:853e074d4931dbcba7480d4dcab23d5c56bd9607f92825ab80ee2bd916edea53"}, - {file = "lxml-5.2.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cc4691d60512798304acb9207987e7b2b7c44627ea88b9d77489bbe3e6cc3bd4"}, - {file = "lxml-5.2.1-cp39-cp39-manylinux_2_28_aarch64.whl", hash = "sha256:beb72935a941965c52990f3a32d7f07ce869fe21c6af8b34bf6a277b33a345d3"}, - {file = "lxml-5.2.1-cp39-cp39-manylinux_2_28_ppc64le.whl", hash = "sha256:6588c459c5627fefa30139be4d2e28a2c2a1d0d1c265aad2ba1935a7863a4913"}, - {file = "lxml-5.2.1-cp39-cp39-manylinux_2_28_s390x.whl", hash = "sha256:588008b8497667f1ddca7c99f2f85ce8511f8f7871b4a06ceede68ab62dff64b"}, - {file = "lxml-5.2.1-cp39-cp39-manylinux_2_28_x86_64.whl", hash = "sha256:b6787b643356111dfd4032b5bffe26d2f8331556ecb79e15dacb9275da02866e"}, - {file = "lxml-5.2.1-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:7c17b64b0a6ef4e5affae6a3724010a7a66bda48a62cfe0674dabd46642e8b54"}, - {file = "lxml-5.2.1-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:27aa20d45c2e0b8cd05da6d4759649170e8dfc4f4e5ef33a34d06f2d79075d57"}, - {file = "lxml-5.2.1-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:d4f2cc7060dc3646632d7f15fe68e2fa98f58e35dd5666cd525f3b35d3fed7f8"}, - {file = "lxml-5.2.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:ff46d772d5f6f73564979cd77a4fffe55c916a05f3cb70e7c9c0590059fb29ef"}, - {file = "lxml-5.2.1-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:96323338e6c14e958d775700ec8a88346014a85e5de73ac7967db0367582049b"}, - {file = "lxml-5.2.1-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:52421b41ac99e9d91934e4d0d0fe7da9f02bfa7536bb4431b4c05c906c8c6919"}, - {file = "lxml-5.2.1-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:7a7efd5b6d3e30d81ec68ab8a88252d7c7c6f13aaa875009fe3097eb4e30b84c"}, - {file = "lxml-5.2.1-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:0ed777c1e8c99b63037b91f9d73a6aad20fd035d77ac84afcc205225f8f41188"}, - {file = "lxml-5.2.1-cp39-cp39-win32.whl", hash = "sha256:644df54d729ef810dcd0f7732e50e5ad1bd0a135278ed8d6bcb06f33b6b6f708"}, - {file = "lxml-5.2.1-cp39-cp39-win_amd64.whl", hash = "sha256:9ca66b8e90daca431b7ca1408cae085d025326570e57749695d6a01454790e95"}, - {file = "lxml-5.2.1-pp310-pypy310_pp73-macosx_10_9_x86_64.whl", hash = "sha256:9b0ff53900566bc6325ecde9181d89afadc59c5ffa39bddf084aaedfe3b06a11"}, - {file = "lxml-5.2.1-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fd6037392f2d57793ab98d9e26798f44b8b4da2f2464388588f48ac52c489ea1"}, - {file = "lxml-5.2.1-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8b9c07e7a45bb64e21df4b6aa623cb8ba214dfb47d2027d90eac197329bb5e94"}, - {file = "lxml-5.2.1-pp310-pypy310_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:3249cc2989d9090eeac5467e50e9ec2d40704fea9ab72f36b034ea34ee65ca98"}, - {file = "lxml-5.2.1-pp310-pypy310_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:f42038016852ae51b4088b2862126535cc4fc85802bfe30dea3500fdfaf1864e"}, - {file = "lxml-5.2.1-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:533658f8fbf056b70e434dff7e7aa611bcacb33e01f75de7f821810e48d1bb66"}, - {file = "lxml-5.2.1-pp37-pypy37_pp73-macosx_10_9_x86_64.whl", hash = "sha256:622020d4521e22fb371e15f580d153134bfb68d6a429d1342a25f051ec72df1c"}, - {file = "lxml-5.2.1-pp37-pypy37_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:efa7b51824aa0ee957ccd5a741c73e6851de55f40d807f08069eb4c5a26b2baa"}, - {file = "lxml-5.2.1-pp37-pypy37_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9c6ad0fbf105f6bcc9300c00010a2ffa44ea6f555df1a2ad95c88f5656104817"}, - {file = "lxml-5.2.1-pp37-pypy37_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:e233db59c8f76630c512ab4a4daf5a5986da5c3d5b44b8e9fc742f2a24dbd460"}, - {file = "lxml-5.2.1-pp37-pypy37_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:6a014510830df1475176466b6087fc0c08b47a36714823e58d8b8d7709132a96"}, - {file = "lxml-5.2.1-pp37-pypy37_pp73-win_amd64.whl", hash = "sha256:d38c8f50ecf57f0463399569aa388b232cf1a2ffb8f0a9a5412d0db57e054860"}, - {file = "lxml-5.2.1-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:5aea8212fb823e006b995c4dda533edcf98a893d941f173f6c9506126188860d"}, - {file = "lxml-5.2.1-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ff097ae562e637409b429a7ac958a20aab237a0378c42dabaa1e3abf2f896e5f"}, - {file = "lxml-5.2.1-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0f5d65c39f16717a47c36c756af0fb36144069c4718824b7533f803ecdf91138"}, - {file = "lxml-5.2.1-pp38-pypy38_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:3d0c3dd24bb4605439bf91068598d00c6370684f8de4a67c2992683f6c309d6b"}, - {file = "lxml-5.2.1-pp38-pypy38_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:e32be23d538753a8adb6c85bd539f5fd3b15cb987404327c569dfc5fd8366e85"}, - {file = "lxml-5.2.1-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:cc518cea79fd1e2f6c90baafa28906d4309d24f3a63e801d855e7424c5b34144"}, - {file = "lxml-5.2.1-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:a0af35bd8ebf84888373630f73f24e86bf016642fb8576fba49d3d6b560b7cbc"}, - {file = "lxml-5.2.1-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f8aca2e3a72f37bfc7b14ba96d4056244001ddcc18382bd0daa087fd2e68a354"}, - {file = "lxml-5.2.1-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5ca1e8188b26a819387b29c3895c47a5e618708fe6f787f3b1a471de2c4a94d9"}, - {file = "lxml-5.2.1-pp39-pypy39_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:c8ba129e6d3b0136a0f50345b2cb3db53f6bda5dd8c7f5d83fbccba97fb5dcb5"}, - {file = "lxml-5.2.1-pp39-pypy39_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:e998e304036198b4f6914e6a1e2b6f925208a20e2042563d9734881150c6c246"}, - {file = "lxml-5.2.1-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:d3be9b2076112e51b323bdf6d5a7f8a798de55fb8d95fcb64bd179460cdc0704"}, - {file = "lxml-5.2.1.tar.gz", hash = "sha256:3f7765e69bbce0906a7c74d5fe46d2c7a7596147318dbc08e4a2431f3060e306"}, + {file = "lxml-5.2.2-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:364d03207f3e603922d0d3932ef363d55bbf48e3647395765f9bfcbdf6d23632"}, + {file = "lxml-5.2.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:50127c186f191b8917ea2fb8b206fbebe87fd414a6084d15568c27d0a21d60db"}, + {file = "lxml-5.2.2-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:74e4f025ef3db1c6da4460dd27c118d8cd136d0391da4e387a15e48e5c975147"}, + {file = "lxml-5.2.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:981a06a3076997adf7c743dcd0d7a0415582661e2517c7d961493572e909aa1d"}, + {file = "lxml-5.2.2-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:aef5474d913d3b05e613906ba4090433c515e13ea49c837aca18bde190853dff"}, + {file = "lxml-5.2.2-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1e275ea572389e41e8b039ac076a46cb87ee6b8542df3fff26f5baab43713bca"}, + {file = "lxml-5.2.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f5b65529bb2f21ac7861a0e94fdbf5dc0daab41497d18223b46ee8515e5ad297"}, + {file = "lxml-5.2.2-cp310-cp310-manylinux_2_28_aarch64.whl", hash = "sha256:bcc98f911f10278d1daf14b87d65325851a1d29153caaf146877ec37031d5f36"}, + {file = "lxml-5.2.2-cp310-cp310-manylinux_2_28_ppc64le.whl", hash = "sha256:b47633251727c8fe279f34025844b3b3a3e40cd1b198356d003aa146258d13a2"}, + {file = "lxml-5.2.2-cp310-cp310-manylinux_2_28_s390x.whl", hash = "sha256:fbc9d316552f9ef7bba39f4edfad4a734d3d6f93341232a9dddadec4f15d425f"}, + {file = "lxml-5.2.2-cp310-cp310-manylinux_2_28_x86_64.whl", hash = "sha256:13e69be35391ce72712184f69000cda04fc89689429179bc4c0ae5f0b7a8c21b"}, + {file = "lxml-5.2.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:3b6a30a9ab040b3f545b697cb3adbf3696c05a3a68aad172e3fd7ca73ab3c835"}, + {file = "lxml-5.2.2-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:a233bb68625a85126ac9f1fc66d24337d6e8a0f9207b688eec2e7c880f012ec0"}, + {file = "lxml-5.2.2-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:dfa7c241073d8f2b8e8dbc7803c434f57dbb83ae2a3d7892dd068d99e96efe2c"}, + {file = "lxml-5.2.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:1a7aca7964ac4bb07680d5c9d63b9d7028cace3e2d43175cb50bba8c5ad33316"}, + {file = "lxml-5.2.2-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:ae4073a60ab98529ab8a72ebf429f2a8cc612619a8c04e08bed27450d52103c0"}, + {file = "lxml-5.2.2-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:ffb2be176fed4457e445fe540617f0252a72a8bc56208fd65a690fdb1f57660b"}, + {file = "lxml-5.2.2-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:e290d79a4107d7d794634ce3e985b9ae4f920380a813717adf61804904dc4393"}, + {file = "lxml-5.2.2-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:96e85aa09274955bb6bd483eaf5b12abadade01010478154b0ec70284c1b1526"}, + {file = "lxml-5.2.2-cp310-cp310-win32.whl", hash = "sha256:f956196ef61369f1685d14dad80611488d8dc1ef00be57c0c5a03064005b0f30"}, + {file = "lxml-5.2.2-cp310-cp310-win_amd64.whl", hash = "sha256:875a3f90d7eb5c5d77e529080d95140eacb3c6d13ad5b616ee8095447b1d22e7"}, + {file = "lxml-5.2.2-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:45f9494613160d0405682f9eee781c7e6d1bf45f819654eb249f8f46a2c22545"}, + {file = "lxml-5.2.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:b0b3f2df149efb242cee2ffdeb6674b7f30d23c9a7af26595099afaf46ef4e88"}, + {file = "lxml-5.2.2-cp311-cp311-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d28cb356f119a437cc58a13f8135ab8a4c8ece18159eb9194b0d269ec4e28083"}, + {file = "lxml-5.2.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:657a972f46bbefdbba2d4f14413c0d079f9ae243bd68193cb5061b9732fa54c1"}, + {file = "lxml-5.2.2-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b74b9ea10063efb77a965a8d5f4182806fbf59ed068b3c3fd6f30d2ac7bee734"}, + {file = "lxml-5.2.2-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:07542787f86112d46d07d4f3c4e7c760282011b354d012dc4141cc12a68cef5f"}, + {file = "lxml-5.2.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:303f540ad2dddd35b92415b74b900c749ec2010e703ab3bfd6660979d01fd4ed"}, + {file = "lxml-5.2.2-cp311-cp311-manylinux_2_28_aarch64.whl", hash = "sha256:2eb2227ce1ff998faf0cd7fe85bbf086aa41dfc5af3b1d80867ecfe75fb68df3"}, + {file = "lxml-5.2.2-cp311-cp311-manylinux_2_28_ppc64le.whl", hash = "sha256:1d8a701774dfc42a2f0b8ccdfe7dbc140500d1049e0632a611985d943fcf12df"}, + {file = "lxml-5.2.2-cp311-cp311-manylinux_2_28_s390x.whl", hash = "sha256:56793b7a1a091a7c286b5f4aa1fe4ae5d1446fe742d00cdf2ffb1077865db10d"}, + {file = "lxml-5.2.2-cp311-cp311-manylinux_2_28_x86_64.whl", hash = "sha256:eb00b549b13bd6d884c863554566095bf6fa9c3cecb2e7b399c4bc7904cb33b5"}, + {file = "lxml-5.2.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:1a2569a1f15ae6c8c64108a2cd2b4a858fc1e13d25846be0666fc144715e32ab"}, + {file = "lxml-5.2.2-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:8cf85a6e40ff1f37fe0f25719aadf443686b1ac7652593dc53c7ef9b8492b115"}, + {file = "lxml-5.2.2-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:d237ba6664b8e60fd90b8549a149a74fcc675272e0e95539a00522e4ca688b04"}, + {file = "lxml-5.2.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:0b3f5016e00ae7630a4b83d0868fca1e3d494c78a75b1c7252606a3a1c5fc2ad"}, + {file = "lxml-5.2.2-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:23441e2b5339bc54dc949e9e675fa35efe858108404ef9aa92f0456929ef6fe8"}, + {file = "lxml-5.2.2-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:2fb0ba3e8566548d6c8e7dd82a8229ff47bd8fb8c2da237607ac8e5a1b8312e5"}, + {file = "lxml-5.2.2-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:79d1fb9252e7e2cfe4de6e9a6610c7cbb99b9708e2c3e29057f487de5a9eaefa"}, + {file = "lxml-5.2.2-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:6dcc3d17eac1df7859ae01202e9bb11ffa8c98949dcbeb1069c8b9a75917e01b"}, + {file = "lxml-5.2.2-cp311-cp311-win32.whl", hash = "sha256:4c30a2f83677876465f44c018830f608fa3c6a8a466eb223535035fbc16f3438"}, + {file = "lxml-5.2.2-cp311-cp311-win_amd64.whl", hash = "sha256:49095a38eb333aaf44c06052fd2ec3b8f23e19747ca7ec6f6c954ffea6dbf7be"}, + {file = "lxml-5.2.2-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:7429e7faa1a60cad26ae4227f4dd0459efde239e494c7312624ce228e04f6391"}, + {file = "lxml-5.2.2-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:50ccb5d355961c0f12f6cf24b7187dbabd5433f29e15147a67995474f27d1776"}, + {file = "lxml-5.2.2-cp312-cp312-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:dc911208b18842a3a57266d8e51fc3cfaccee90a5351b92079beed912a7914c2"}, + {file = "lxml-5.2.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:33ce9e786753743159799fdf8e92a5da351158c4bfb6f2db0bf31e7892a1feb5"}, + {file = "lxml-5.2.2-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ec87c44f619380878bd49ca109669c9f221d9ae6883a5bcb3616785fa8f94c97"}, + {file = "lxml-5.2.2-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:08ea0f606808354eb8f2dfaac095963cb25d9d28e27edcc375d7b30ab01abbf6"}, + {file = "lxml-5.2.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:75a9632f1d4f698b2e6e2e1ada40e71f369b15d69baddb8968dcc8e683839b18"}, + {file = "lxml-5.2.2-cp312-cp312-manylinux_2_28_aarch64.whl", hash = "sha256:74da9f97daec6928567b48c90ea2c82a106b2d500f397eeb8941e47d30b1ca85"}, + {file = "lxml-5.2.2-cp312-cp312-manylinux_2_28_ppc64le.whl", hash = "sha256:0969e92af09c5687d769731e3f39ed62427cc72176cebb54b7a9d52cc4fa3b73"}, + {file = "lxml-5.2.2-cp312-cp312-manylinux_2_28_s390x.whl", hash = "sha256:9164361769b6ca7769079f4d426a41df6164879f7f3568be9086e15baca61466"}, + {file = "lxml-5.2.2-cp312-cp312-manylinux_2_28_x86_64.whl", hash = "sha256:d26a618ae1766279f2660aca0081b2220aca6bd1aa06b2cf73f07383faf48927"}, + {file = "lxml-5.2.2-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:ab67ed772c584b7ef2379797bf14b82df9aa5f7438c5b9a09624dd834c1c1aaf"}, + {file = "lxml-5.2.2-cp312-cp312-musllinux_1_1_ppc64le.whl", hash = "sha256:3d1e35572a56941b32c239774d7e9ad724074d37f90c7a7d499ab98761bd80cf"}, + {file = "lxml-5.2.2-cp312-cp312-musllinux_1_1_s390x.whl", hash = "sha256:8268cbcd48c5375f46e000adb1390572c98879eb4f77910c6053d25cc3ac2c67"}, + {file = "lxml-5.2.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:e282aedd63c639c07c3857097fc0e236f984ceb4089a8b284da1c526491e3f3d"}, + {file = "lxml-5.2.2-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:6dfdc2bfe69e9adf0df4915949c22a25b39d175d599bf98e7ddf620a13678585"}, + {file = "lxml-5.2.2-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:4aefd911793b5d2d7a921233a54c90329bf3d4a6817dc465f12ffdfe4fc7b8fe"}, + {file = "lxml-5.2.2-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:8b8df03a9e995b6211dafa63b32f9d405881518ff1ddd775db4e7b98fb545e1c"}, + {file = "lxml-5.2.2-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:f11ae142f3a322d44513de1018b50f474f8f736bc3cd91d969f464b5bfef8836"}, + {file = "lxml-5.2.2-cp312-cp312-win32.whl", hash = "sha256:16a8326e51fcdffc886294c1e70b11ddccec836516a343f9ed0f82aac043c24a"}, + {file = "lxml-5.2.2-cp312-cp312-win_amd64.whl", hash = "sha256:bbc4b80af581e18568ff07f6395c02114d05f4865c2812a1f02f2eaecf0bfd48"}, + {file = "lxml-5.2.2-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:e3d9d13603410b72787579769469af730c38f2f25505573a5888a94b62b920f8"}, + {file = "lxml-5.2.2-cp36-cp36m-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:38b67afb0a06b8575948641c1d6d68e41b83a3abeae2ca9eed2ac59892b36706"}, + {file = "lxml-5.2.2-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c689d0d5381f56de7bd6966a4541bff6e08bf8d3871bbd89a0c6ab18aa699573"}, + {file = "lxml-5.2.2-cp36-cp36m-manylinux_2_28_x86_64.whl", hash = "sha256:cf2a978c795b54c539f47964ec05e35c05bd045db5ca1e8366988c7f2fe6b3ce"}, + {file = "lxml-5.2.2-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:739e36ef7412b2bd940f75b278749106e6d025e40027c0b94a17ef7968d55d56"}, + {file = "lxml-5.2.2-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:d8bbcd21769594dbba9c37d3c819e2d5847656ca99c747ddb31ac1701d0c0ed9"}, + {file = "lxml-5.2.2-cp36-cp36m-musllinux_1_2_x86_64.whl", hash = "sha256:2304d3c93f2258ccf2cf7a6ba8c761d76ef84948d87bf9664e14d203da2cd264"}, + {file = "lxml-5.2.2-cp36-cp36m-win32.whl", hash = "sha256:02437fb7308386867c8b7b0e5bc4cd4b04548b1c5d089ffb8e7b31009b961dc3"}, + {file = "lxml-5.2.2-cp36-cp36m-win_amd64.whl", hash = "sha256:edcfa83e03370032a489430215c1e7783128808fd3e2e0a3225deee278585196"}, + {file = "lxml-5.2.2-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:28bf95177400066596cdbcfc933312493799382879da504633d16cf60bba735b"}, + {file = "lxml-5.2.2-cp37-cp37m-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3a745cc98d504d5bd2c19b10c79c61c7c3df9222629f1b6210c0368177589fb8"}, + {file = "lxml-5.2.2-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b336b0416828022bfd5a2e3083e7f5ba54b96242159f83c7e3eebaec752f1716"}, + {file = "lxml-5.2.2-cp37-cp37m-manylinux_2_28_x86_64.whl", hash = "sha256:4bc6cb140a7a0ad1f7bc37e018d0ed690b7b6520ade518285dc3171f7a117905"}, + {file = "lxml-5.2.2-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:57f0a0bbc9868e10ebe874e9f129d2917750adf008fe7b9c1598c0fbbfdde6a6"}, + {file = "lxml-5.2.2-cp37-cp37m-musllinux_1_2_x86_64.whl", hash = "sha256:60499fe961b21264e17a471ec296dcbf4365fbea611bf9e303ab69db7159ce61"}, + {file = "lxml-5.2.2-cp37-cp37m-win32.whl", hash = "sha256:d9b342c76003c6b9336a80efcc766748a333573abf9350f4094ee46b006ec18f"}, + {file = "lxml-5.2.2-cp37-cp37m-win_amd64.whl", hash = "sha256:b16db2770517b8799c79aa80f4053cd6f8b716f21f8aca962725a9565ce3ee40"}, + {file = "lxml-5.2.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:7ed07b3062b055d7a7f9d6557a251cc655eed0b3152b76de619516621c56f5d3"}, + {file = "lxml-5.2.2-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f60fdd125d85bf9c279ffb8e94c78c51b3b6a37711464e1f5f31078b45002421"}, + {file = "lxml-5.2.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8a7e24cb69ee5f32e003f50e016d5fde438010c1022c96738b04fc2423e61706"}, + {file = "lxml-5.2.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:23cfafd56887eaed93d07bc4547abd5e09d837a002b791e9767765492a75883f"}, + {file = "lxml-5.2.2-cp38-cp38-manylinux_2_28_aarch64.whl", hash = "sha256:19b4e485cd07b7d83e3fe3b72132e7df70bfac22b14fe4bf7a23822c3a35bff5"}, + {file = "lxml-5.2.2-cp38-cp38-manylinux_2_28_x86_64.whl", hash = "sha256:7ce7ad8abebe737ad6143d9d3bf94b88b93365ea30a5b81f6877ec9c0dee0a48"}, + {file = "lxml-5.2.2-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:e49b052b768bb74f58c7dda4e0bdf7b79d43a9204ca584ffe1fb48a6f3c84c66"}, + {file = "lxml-5.2.2-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:d14a0d029a4e176795cef99c056d58067c06195e0c7e2dbb293bf95c08f772a3"}, + {file = "lxml-5.2.2-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:be49ad33819d7dcc28a309b86d4ed98e1a65f3075c6acd3cd4fe32103235222b"}, + {file = "lxml-5.2.2-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:a6d17e0370d2516d5bb9062c7b4cb731cff921fc875644c3d751ad857ba9c5b1"}, + {file = "lxml-5.2.2-cp38-cp38-win32.whl", hash = "sha256:5b8c041b6265e08eac8a724b74b655404070b636a8dd6d7a13c3adc07882ef30"}, + {file = "lxml-5.2.2-cp38-cp38-win_amd64.whl", hash = "sha256:f61efaf4bed1cc0860e567d2ecb2363974d414f7f1f124b1df368bbf183453a6"}, + {file = "lxml-5.2.2-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:fb91819461b1b56d06fa4bcf86617fac795f6a99d12239fb0c68dbeba41a0a30"}, + {file = "lxml-5.2.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:d4ed0c7cbecde7194cd3228c044e86bf73e30a23505af852857c09c24e77ec5d"}, + {file = "lxml-5.2.2-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:54401c77a63cc7d6dc4b4e173bb484f28a5607f3df71484709fe037c92d4f0ed"}, + {file = "lxml-5.2.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:625e3ef310e7fa3a761d48ca7ea1f9d8718a32b1542e727d584d82f4453d5eeb"}, + {file = "lxml-5.2.2-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:519895c99c815a1a24a926d5b60627ce5ea48e9f639a5cd328bda0515ea0f10c"}, + {file = "lxml-5.2.2-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c7079d5eb1c1315a858bbf180000757db8ad904a89476653232db835c3114001"}, + {file = "lxml-5.2.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:343ab62e9ca78094f2306aefed67dcfad61c4683f87eee48ff2fd74902447726"}, + {file = "lxml-5.2.2-cp39-cp39-manylinux_2_28_aarch64.whl", hash = "sha256:cd9e78285da6c9ba2d5c769628f43ef66d96ac3085e59b10ad4f3707980710d3"}, + {file = "lxml-5.2.2-cp39-cp39-manylinux_2_28_ppc64le.whl", hash = "sha256:546cf886f6242dff9ec206331209db9c8e1643ae642dea5fdbecae2453cb50fd"}, + {file = "lxml-5.2.2-cp39-cp39-manylinux_2_28_s390x.whl", hash = "sha256:02f6a8eb6512fdc2fd4ca10a49c341c4e109aa6e9448cc4859af5b949622715a"}, + {file = "lxml-5.2.2-cp39-cp39-manylinux_2_28_x86_64.whl", hash = "sha256:339ee4a4704bc724757cd5dd9dc8cf4d00980f5d3e6e06d5847c1b594ace68ab"}, + {file = "lxml-5.2.2-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:0a028b61a2e357ace98b1615fc03f76eb517cc028993964fe08ad514b1e8892d"}, + {file = "lxml-5.2.2-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:f90e552ecbad426eab352e7b2933091f2be77115bb16f09f78404861c8322981"}, + {file = "lxml-5.2.2-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:d83e2d94b69bf31ead2fa45f0acdef0757fa0458a129734f59f67f3d2eb7ef32"}, + {file = "lxml-5.2.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:a02d3c48f9bb1e10c7788d92c0c7db6f2002d024ab6e74d6f45ae33e3d0288a3"}, + {file = "lxml-5.2.2-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:6d68ce8e7b2075390e8ac1e1d3a99e8b6372c694bbe612632606d1d546794207"}, + {file = "lxml-5.2.2-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:453d037e09a5176d92ec0fd282e934ed26d806331a8b70ab431a81e2fbabf56d"}, + {file = "lxml-5.2.2-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:3b019d4ee84b683342af793b56bb35034bd749e4cbdd3d33f7d1107790f8c472"}, + {file = "lxml-5.2.2-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:cb3942960f0beb9f46e2a71a3aca220d1ca32feb5a398656be934320804c0df9"}, + {file = "lxml-5.2.2-cp39-cp39-win32.whl", hash = "sha256:ac6540c9fff6e3813d29d0403ee7a81897f1d8ecc09a8ff84d2eea70ede1cdbf"}, + {file = "lxml-5.2.2-cp39-cp39-win_amd64.whl", hash = "sha256:610b5c77428a50269f38a534057444c249976433f40f53e3b47e68349cca1425"}, + {file = "lxml-5.2.2-pp310-pypy310_pp73-macosx_10_9_x86_64.whl", hash = "sha256:b537bd04d7ccd7c6350cdaaaad911f6312cbd61e6e6045542f781c7f8b2e99d2"}, + {file = "lxml-5.2.2-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4820c02195d6dfb7b8508ff276752f6b2ff8b64ae5d13ebe02e7667e035000b9"}, + {file = "lxml-5.2.2-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f2a09f6184f17a80897172863a655467da2b11151ec98ba8d7af89f17bf63dae"}, + {file = "lxml-5.2.2-pp310-pypy310_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:76acba4c66c47d27c8365e7c10b3d8016a7da83d3191d053a58382311a8bf4e1"}, + {file = "lxml-5.2.2-pp310-pypy310_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:b128092c927eaf485928cec0c28f6b8bead277e28acf56800e972aa2c2abd7a2"}, + {file = "lxml-5.2.2-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:ae791f6bd43305aade8c0e22f816b34f3b72b6c820477aab4d18473a37e8090b"}, + {file = "lxml-5.2.2-pp37-pypy37_pp73-macosx_10_9_x86_64.whl", hash = "sha256:a2f6a1bc2460e643785a2cde17293bd7a8f990884b822f7bca47bee0a82fc66b"}, + {file = "lxml-5.2.2-pp37-pypy37_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8e8d351ff44c1638cb6e980623d517abd9f580d2e53bfcd18d8941c052a5a009"}, + {file = "lxml-5.2.2-pp37-pypy37_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bec4bd9133420c5c52d562469c754f27c5c9e36ee06abc169612c959bd7dbb07"}, + {file = "lxml-5.2.2-pp37-pypy37_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:55ce6b6d803890bd3cc89975fca9de1dff39729b43b73cb15ddd933b8bc20484"}, + {file = "lxml-5.2.2-pp37-pypy37_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:8ab6a358d1286498d80fe67bd3d69fcbc7d1359b45b41e74c4a26964ca99c3f8"}, + {file = "lxml-5.2.2-pp37-pypy37_pp73-win_amd64.whl", hash = "sha256:06668e39e1f3c065349c51ac27ae430719d7806c026fec462e5693b08b95696b"}, + {file = "lxml-5.2.2-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:9cd5323344d8ebb9fb5e96da5de5ad4ebab993bbf51674259dbe9d7a18049525"}, + {file = "lxml-5.2.2-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:89feb82ca055af0fe797a2323ec9043b26bc371365847dbe83c7fd2e2f181c34"}, + {file = "lxml-5.2.2-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e481bba1e11ba585fb06db666bfc23dbe181dbafc7b25776156120bf12e0d5a6"}, + {file = "lxml-5.2.2-pp38-pypy38_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:9d6c6ea6a11ca0ff9cd0390b885984ed31157c168565702959c25e2191674a14"}, + {file = "lxml-5.2.2-pp38-pypy38_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:3d98de734abee23e61f6b8c2e08a88453ada7d6486dc7cdc82922a03968928db"}, + {file = "lxml-5.2.2-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:69ab77a1373f1e7563e0fb5a29a8440367dec051da6c7405333699d07444f511"}, + {file = "lxml-5.2.2-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:34e17913c431f5ae01d8658dbf792fdc457073dcdfbb31dc0cc6ab256e664a8d"}, + {file = "lxml-5.2.2-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:05f8757b03208c3f50097761be2dea0aba02e94f0dc7023ed73a7bb14ff11eb0"}, + {file = "lxml-5.2.2-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6a520b4f9974b0a0a6ed73c2154de57cdfd0c8800f4f15ab2b73238ffed0b36e"}, + {file = "lxml-5.2.2-pp39-pypy39_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:5e097646944b66207023bc3c634827de858aebc226d5d4d6d16f0b77566ea182"}, + {file = "lxml-5.2.2-pp39-pypy39_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:b5e4ef22ff25bfd4ede5f8fb30f7b24446345f3e79d9b7455aef2836437bc38a"}, + {file = "lxml-5.2.2-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:ff69a9a0b4b17d78170c73abe2ab12084bdf1691550c5629ad1fe7849433f324"}, + {file = "lxml-5.2.2.tar.gz", hash = "sha256:bb2dc4898180bea79863d5487e5f9c7c34297414bad54bcd0f0852aee9cfdb87"}, ] [package.extras] @@ -3752,13 +3798,13 @@ sympy = "*" [[package]] name = "openai" -version = "1.28.1" +version = "1.29.0" description = "The official Python library for the openai API" optional = false python-versions = ">=3.7.1" files = [ - {file = "openai-1.28.1-py3-none-any.whl", hash = "sha256:943e0d0d587b9a62f99bd3acbaf479ae5362986e5fff013f57b5b7bde85cce93"}, - {file = "openai-1.28.1.tar.gz", hash = "sha256:8a3adbba16882434768d76fd3129fcc9b40ace98f8d55a6ddacfc05c4096ac30"}, + {file = "openai-1.29.0-py3-none-any.whl", hash = "sha256:c61cd12376c84362d406341f9e2f9a9d6b81c082b133b44484dc0f43954496b1"}, + {file = "openai-1.29.0.tar.gz", hash = "sha256:d5a769f485610cff8bae14343fa45a8b1d346be3d541fa5b28ccd040dbc8baf8"}, ] [package.dependencies] @@ -5555,47 +5601,47 @@ files = [ [[package]] name = "tiktoken" -version = "0.6.0" +version = "0.7.0" description = "tiktoken is a fast BPE tokeniser for use with OpenAI's models" optional = false python-versions = ">=3.8" files = [ - {file = "tiktoken-0.6.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:277de84ccd8fa12730a6b4067456e5cf72fef6300bea61d506c09e45658d41ac"}, - {file = "tiktoken-0.6.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:9c44433f658064463650d61387623735641dcc4b6c999ca30bc0f8ba3fccaf5c"}, - {file = "tiktoken-0.6.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:afb9a2a866ae6eef1995ab656744287a5ac95acc7e0491c33fad54d053288ad3"}, - {file = "tiktoken-0.6.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c62c05b3109fefca26fedb2820452a050074ad8e5ad9803f4652977778177d9f"}, - {file = "tiktoken-0.6.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:0ef917fad0bccda07bfbad835525bbed5f3ab97a8a3e66526e48cdc3e7beacf7"}, - {file = "tiktoken-0.6.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:e095131ab6092d0769a2fda85aa260c7c383072daec599ba9d8b149d2a3f4d8b"}, - {file = "tiktoken-0.6.0-cp310-cp310-win_amd64.whl", hash = "sha256:05b344c61779f815038292a19a0c6eb7098b63c8f865ff205abb9ea1b656030e"}, - {file = "tiktoken-0.6.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:cefb9870fb55dca9e450e54dbf61f904aab9180ff6fe568b61f4db9564e78871"}, - {file = "tiktoken-0.6.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:702950d33d8cabc039845674107d2e6dcabbbb0990ef350f640661368df481bb"}, - {file = "tiktoken-0.6.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e8d49d076058f23254f2aff9af603863c5c5f9ab095bc896bceed04f8f0b013a"}, - {file = "tiktoken-0.6.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:430bc4e650a2d23a789dc2cdca3b9e5e7eb3cd3935168d97d43518cbb1f9a911"}, - {file = "tiktoken-0.6.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:293cb8669757301a3019a12d6770bd55bec38a4d3ee9978ddbe599d68976aca7"}, - {file = "tiktoken-0.6.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:7bd1a288b7903aadc054b0e16ea78e3171f70b670e7372432298c686ebf9dd47"}, - {file = "tiktoken-0.6.0-cp311-cp311-win_amd64.whl", hash = "sha256:ac76e000183e3b749634968a45c7169b351e99936ef46f0d2353cd0d46c3118d"}, - {file = "tiktoken-0.6.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:17cc8a4a3245ab7d935c83a2db6bb71619099d7284b884f4b2aea4c74f2f83e3"}, - {file = "tiktoken-0.6.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:284aebcccffe1bba0d6571651317df6a5b376ff6cfed5aeb800c55df44c78177"}, - {file = "tiktoken-0.6.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0c1a3a5d33846f8cd9dd3b7897c1d45722f48625a587f8e6f3d3e85080559be8"}, - {file = "tiktoken-0.6.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6318b2bb2337f38ee954fd5efa82632c6e5ced1d52a671370fa4b2eff1355e91"}, - {file = "tiktoken-0.6.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:1f5f0f2ed67ba16373f9a6013b68da298096b27cd4e1cf276d2d3868b5c7efd1"}, - {file = "tiktoken-0.6.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:75af4c0b16609c2ad02581f3cdcd1fb698c7565091370bf6c0cf8624ffaba6dc"}, - {file = "tiktoken-0.6.0-cp312-cp312-win_amd64.whl", hash = "sha256:45577faf9a9d383b8fd683e313cf6df88b6076c034f0a16da243bb1c139340c3"}, - {file = "tiktoken-0.6.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:7c1492ab90c21ca4d11cef3a236ee31a3e279bb21b3fc5b0e2210588c4209e68"}, - {file = "tiktoken-0.6.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:e2b380c5b7751272015400b26144a2bab4066ebb8daae9c3cd2a92c3b508fe5a"}, - {file = "tiktoken-0.6.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c9f497598b9f58c99cbc0eb764b4a92272c14d5203fc713dd650b896a03a50ad"}, - {file = "tiktoken-0.6.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e65e8bd6f3f279d80f1e1fbd5f588f036b9a5fa27690b7f0cc07021f1dfa0839"}, - {file = "tiktoken-0.6.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:5f1495450a54e564d236769d25bfefbf77727e232d7a8a378f97acddee08c1ae"}, - {file = "tiktoken-0.6.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:6c4e4857d99f6fb4670e928250835b21b68c59250520a1941618b5b4194e20c3"}, - {file = "tiktoken-0.6.0-cp38-cp38-win_amd64.whl", hash = "sha256:168d718f07a39b013032741867e789971346df8e89983fe3c0ef3fbd5a0b1cb9"}, - {file = "tiktoken-0.6.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:47fdcfe11bd55376785a6aea8ad1db967db7f66ea81aed5c43fad497521819a4"}, - {file = "tiktoken-0.6.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:fb7d2ccbf1a7784810aff6b80b4012fb42c6fc37eaa68cb3b553801a5cc2d1fc"}, - {file = "tiktoken-0.6.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1ccb7a111ee76af5d876a729a347f8747d5ad548e1487eeea90eaf58894b3138"}, - {file = "tiktoken-0.6.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b2048e1086b48e3c8c6e2ceeac866561374cd57a84622fa49a6b245ffecb7744"}, - {file = "tiktoken-0.6.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:07f229a5eb250b6403a61200199cecf0aac4aa23c3ecc1c11c1ca002cbb8f159"}, - {file = "tiktoken-0.6.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:432aa3be8436177b0db5a2b3e7cc28fd6c693f783b2f8722539ba16a867d0c6a"}, - {file = "tiktoken-0.6.0-cp39-cp39-win_amd64.whl", hash = "sha256:8bfe8a19c8b5c40d121ee7938cd9c6a278e5b97dc035fd61714b4f0399d2f7a1"}, - {file = "tiktoken-0.6.0.tar.gz", hash = "sha256:ace62a4ede83c75b0374a2ddfa4b76903cf483e9cb06247f566be3bf14e6beed"}, + {file = "tiktoken-0.7.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:485f3cc6aba7c6b6ce388ba634fbba656d9ee27f766216f45146beb4ac18b25f"}, + {file = "tiktoken-0.7.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:e54be9a2cd2f6d6ffa3517b064983fb695c9a9d8aa7d574d1ef3c3f931a99225"}, + {file = "tiktoken-0.7.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:79383a6e2c654c6040e5f8506f3750db9ddd71b550c724e673203b4f6b4b4590"}, + {file = "tiktoken-0.7.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5d4511c52caacf3c4981d1ae2df85908bd31853f33d30b345c8b6830763f769c"}, + {file = "tiktoken-0.7.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:13c94efacdd3de9aff824a788353aa5749c0faee1fbe3816df365ea450b82311"}, + {file = "tiktoken-0.7.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:8e58c7eb29d2ab35a7a8929cbeea60216a4ccdf42efa8974d8e176d50c9a3df5"}, + {file = "tiktoken-0.7.0-cp310-cp310-win_amd64.whl", hash = "sha256:21a20c3bd1dd3e55b91c1331bf25f4af522c525e771691adbc9a69336fa7f702"}, + {file = "tiktoken-0.7.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:10c7674f81e6e350fcbed7c09a65bca9356eaab27fb2dac65a1e440f2bcfe30f"}, + {file = "tiktoken-0.7.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:084cec29713bc9d4189a937f8a35dbdfa785bd1235a34c1124fe2323821ee93f"}, + {file = "tiktoken-0.7.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:811229fde1652fedcca7c6dfe76724d0908775b353556d8a71ed74d866f73f7b"}, + {file = "tiktoken-0.7.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:86b6e7dc2e7ad1b3757e8a24597415bafcfb454cebf9a33a01f2e6ba2e663992"}, + {file = "tiktoken-0.7.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:1063c5748be36344c7e18c7913c53e2cca116764c2080177e57d62c7ad4576d1"}, + {file = "tiktoken-0.7.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:20295d21419bfcca092644f7e2f2138ff947a6eb8cfc732c09cc7d76988d4a89"}, + {file = "tiktoken-0.7.0-cp311-cp311-win_amd64.whl", hash = "sha256:959d993749b083acc57a317cbc643fb85c014d055b2119b739487288f4e5d1cb"}, + {file = "tiktoken-0.7.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:71c55d066388c55a9c00f61d2c456a6086673ab7dec22dd739c23f77195b1908"}, + {file = "tiktoken-0.7.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:09ed925bccaa8043e34c519fbb2f99110bd07c6fd67714793c21ac298e449410"}, + {file = "tiktoken-0.7.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:03c6c40ff1db0f48a7b4d2dafeae73a5607aacb472fa11f125e7baf9dce73704"}, + {file = "tiktoken-0.7.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d20b5c6af30e621b4aca094ee61777a44118f52d886dbe4f02b70dfe05c15350"}, + {file = "tiktoken-0.7.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:d427614c3e074004efa2f2411e16c826f9df427d3c70a54725cae860f09e4bf4"}, + {file = "tiktoken-0.7.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:8c46d7af7b8c6987fac9b9f61041b452afe92eb087d29c9ce54951280f899a97"}, + {file = "tiktoken-0.7.0-cp312-cp312-win_amd64.whl", hash = "sha256:0bc603c30b9e371e7c4c7935aba02af5994a909fc3c0fe66e7004070858d3f8f"}, + {file = "tiktoken-0.7.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:2398fecd38c921bcd68418675a6d155fad5f5e14c2e92fcf5fe566fa5485a858"}, + {file = "tiktoken-0.7.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:8f5f6afb52fb8a7ea1c811e435e4188f2bef81b5e0f7a8635cc79b0eef0193d6"}, + {file = "tiktoken-0.7.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:861f9ee616766d736be4147abac500732b505bf7013cfaf019b85892637f235e"}, + {file = "tiktoken-0.7.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:54031f95c6939f6b78122c0aa03a93273a96365103793a22e1793ee86da31685"}, + {file = "tiktoken-0.7.0-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:fffdcb319b614cf14f04d02a52e26b1d1ae14a570f90e9b55461a72672f7b13d"}, + {file = "tiktoken-0.7.0-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:c72baaeaefa03ff9ba9688624143c858d1f6b755bb85d456d59e529e17234769"}, + {file = "tiktoken-0.7.0-cp38-cp38-win_amd64.whl", hash = "sha256:131b8aeb043a8f112aad9f46011dced25d62629091e51d9dc1adbf4a1cc6aa98"}, + {file = "tiktoken-0.7.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:cabc6dc77460df44ec5b879e68692c63551ae4fae7460dd4ff17181df75f1db7"}, + {file = "tiktoken-0.7.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:8d57f29171255f74c0aeacd0651e29aa47dff6f070cb9f35ebc14c82278f3b25"}, + {file = "tiktoken-0.7.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2ee92776fdbb3efa02a83f968c19d4997a55c8e9ce7be821ceee04a1d1ee149c"}, + {file = "tiktoken-0.7.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e215292e99cb41fbc96988ef62ea63bb0ce1e15f2c147a61acc319f8b4cbe5bf"}, + {file = "tiktoken-0.7.0-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:8a81bac94769cab437dd3ab0b8a4bc4e0f9cf6835bcaa88de71f39af1791727a"}, + {file = "tiktoken-0.7.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:d6d73ea93e91d5ca771256dfc9d1d29f5a554b83821a1dc0891987636e0ae226"}, + {file = "tiktoken-0.7.0-cp39-cp39-win_amd64.whl", hash = "sha256:2bcb28ddf79ffa424f171dfeef9a4daff61a94c631ca6813f43967cb263b83b9"}, + {file = "tiktoken-0.7.0.tar.gz", hash = "sha256:1077266e949c24e0291f6c350433c6f0971365ece2b173a23bc3b9f9defef6b6"}, ] [package.dependencies] @@ -5980,76 +6026,89 @@ files = [ [[package]] name = "ujson" -version = "5.9.0" +version = "5.10.0" description = "Ultra fast JSON encoder and decoder for Python" optional = false python-versions = ">=3.8" files = [ - {file = "ujson-5.9.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:ab71bf27b002eaf7d047c54a68e60230fbd5cd9da60de7ca0aa87d0bccead8fa"}, - {file = "ujson-5.9.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:7a365eac66f5aa7a7fdf57e5066ada6226700884fc7dce2ba5483538bc16c8c5"}, - {file = "ujson-5.9.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e015122b337858dba5a3dc3533af2a8fc0410ee9e2374092f6a5b88b182e9fcc"}, - {file = "ujson-5.9.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:779a2a88c53039bebfbccca934430dabb5c62cc179e09a9c27a322023f363e0d"}, - {file = "ujson-5.9.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:10ca3c41e80509fd9805f7c149068fa8dbee18872bbdc03d7cca928926a358d5"}, - {file = "ujson-5.9.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:4a566e465cb2fcfdf040c2447b7dd9718799d0d90134b37a20dff1e27c0e9096"}, - {file = "ujson-5.9.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:f833c529e922577226a05bc25b6a8b3eb6c4fb155b72dd88d33de99d53113124"}, - {file = "ujson-5.9.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:b68a0caab33f359b4cbbc10065c88e3758c9f73a11a65a91f024b2e7a1257106"}, - {file = "ujson-5.9.0-cp310-cp310-win32.whl", hash = "sha256:7cc7e605d2aa6ae6b7321c3ae250d2e050f06082e71ab1a4200b4ae64d25863c"}, - {file = "ujson-5.9.0-cp310-cp310-win_amd64.whl", hash = "sha256:a6d3f10eb8ccba4316a6b5465b705ed70a06011c6f82418b59278fbc919bef6f"}, - {file = "ujson-5.9.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:3b23bbb46334ce51ddb5dded60c662fbf7bb74a37b8f87221c5b0fec1ec6454b"}, - {file = "ujson-5.9.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:6974b3a7c17bbf829e6c3bfdc5823c67922e44ff169851a755eab79a3dd31ec0"}, - {file = "ujson-5.9.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b5964ea916edfe24af1f4cc68488448fbb1ec27a3ddcddc2b236da575c12c8ae"}, - {file = "ujson-5.9.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8ba7cac47dd65ff88571eceeff48bf30ed5eb9c67b34b88cb22869b7aa19600d"}, - {file = "ujson-5.9.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6bbd91a151a8f3358c29355a491e915eb203f607267a25e6ab10531b3b157c5e"}, - {file = "ujson-5.9.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:829a69d451a49c0de14a9fecb2a2d544a9b2c884c2b542adb243b683a6f15908"}, - {file = "ujson-5.9.0-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:a807ae73c46ad5db161a7e883eec0fbe1bebc6a54890152ccc63072c4884823b"}, - {file = "ujson-5.9.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:8fc2aa18b13d97b3c8ccecdf1a3c405f411a6e96adeee94233058c44ff92617d"}, - {file = "ujson-5.9.0-cp311-cp311-win32.whl", hash = "sha256:70e06849dfeb2548be48fdd3ceb53300640bc8100c379d6e19d78045e9c26120"}, - {file = "ujson-5.9.0-cp311-cp311-win_amd64.whl", hash = "sha256:7309d063cd392811acc49b5016728a5e1b46ab9907d321ebbe1c2156bc3c0b99"}, - {file = "ujson-5.9.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:20509a8c9f775b3a511e308bbe0b72897ba6b800767a7c90c5cca59d20d7c42c"}, - {file = "ujson-5.9.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:b28407cfe315bd1b34f1ebe65d3bd735d6b36d409b334100be8cdffae2177b2f"}, - {file = "ujson-5.9.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9d302bd17989b6bd90d49bade66943c78f9e3670407dbc53ebcf61271cadc399"}, - {file = "ujson-5.9.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9f21315f51e0db8ee245e33a649dd2d9dce0594522de6f278d62f15f998e050e"}, - {file = "ujson-5.9.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5635b78b636a54a86fdbf6f027e461aa6c6b948363bdf8d4fbb56a42b7388320"}, - {file = "ujson-5.9.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:82b5a56609f1235d72835ee109163c7041b30920d70fe7dac9176c64df87c164"}, - {file = "ujson-5.9.0-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:5ca35f484622fd208f55041b042d9d94f3b2c9c5add4e9af5ee9946d2d30db01"}, - {file = "ujson-5.9.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:829b824953ebad76d46e4ae709e940bb229e8999e40881338b3cc94c771b876c"}, - {file = "ujson-5.9.0-cp312-cp312-win32.whl", hash = "sha256:25fa46e4ff0a2deecbcf7100af3a5d70090b461906f2299506485ff31d9ec437"}, - {file = "ujson-5.9.0-cp312-cp312-win_amd64.whl", hash = "sha256:60718f1720a61560618eff3b56fd517d107518d3c0160ca7a5a66ac949c6cf1c"}, - {file = "ujson-5.9.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:d581db9db9e41d8ea0b2705c90518ba623cbdc74f8d644d7eb0d107be0d85d9c"}, - {file = "ujson-5.9.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:ff741a5b4be2d08fceaab681c9d4bc89abf3c9db600ab435e20b9b6d4dfef12e"}, - {file = "ujson-5.9.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cdcb02cabcb1e44381221840a7af04433c1dc3297af76fde924a50c3054c708c"}, - {file = "ujson-5.9.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e208d3bf02c6963e6ef7324dadf1d73239fb7008491fdf523208f60be6437402"}, - {file = "ujson-5.9.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f4b3917296630a075e04d3d07601ce2a176479c23af838b6cf90a2d6b39b0d95"}, - {file = "ujson-5.9.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:0c4d6adb2c7bb9eb7c71ad6f6f612e13b264942e841f8cc3314a21a289a76c4e"}, - {file = "ujson-5.9.0-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:0b159efece9ab5c01f70b9d10bbb77241ce111a45bc8d21a44c219a2aec8ddfd"}, - {file = "ujson-5.9.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:f0cb4a7814940ddd6619bdce6be637a4b37a8c4760de9373bac54bb7b229698b"}, - {file = "ujson-5.9.0-cp38-cp38-win32.whl", hash = "sha256:dc80f0f5abf33bd7099f7ac94ab1206730a3c0a2d17549911ed2cb6b7aa36d2d"}, - {file = "ujson-5.9.0-cp38-cp38-win_amd64.whl", hash = "sha256:506a45e5fcbb2d46f1a51fead991c39529fc3737c0f5d47c9b4a1d762578fc30"}, - {file = "ujson-5.9.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:d0fd2eba664a22447102062814bd13e63c6130540222c0aa620701dd01f4be81"}, - {file = "ujson-5.9.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:bdf7fc21a03bafe4ba208dafa84ae38e04e5d36c0e1c746726edf5392e9f9f36"}, - {file = "ujson-5.9.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e2f909bc08ce01f122fd9c24bc6f9876aa087188dfaf3c4116fe6e4daf7e194f"}, - {file = "ujson-5.9.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bd4ea86c2afd41429751d22a3ccd03311c067bd6aeee2d054f83f97e41e11d8f"}, - {file = "ujson-5.9.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:63fb2e6599d96fdffdb553af0ed3f76b85fda63281063f1cb5b1141a6fcd0617"}, - {file = "ujson-5.9.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:32bba5870c8fa2a97f4a68f6401038d3f1922e66c34280d710af00b14a3ca562"}, - {file = "ujson-5.9.0-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:37ef92e42535a81bf72179d0e252c9af42a4ed966dc6be6967ebfb929a87bc60"}, - {file = "ujson-5.9.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:f69f16b8f1c69da00e38dc5f2d08a86b0e781d0ad3e4cc6a13ea033a439c4844"}, - {file = "ujson-5.9.0-cp39-cp39-win32.whl", hash = "sha256:3382a3ce0ccc0558b1c1668950008cece9bf463ebb17463ebf6a8bfc060dae34"}, - {file = "ujson-5.9.0-cp39-cp39-win_amd64.whl", hash = "sha256:6adef377ed583477cf005b58c3025051b5faa6b8cc25876e594afbb772578f21"}, - {file = "ujson-5.9.0-pp310-pypy310_pp73-macosx_10_9_x86_64.whl", hash = "sha256:ffdfebd819f492e48e4f31c97cb593b9c1a8251933d8f8972e81697f00326ff1"}, - {file = "ujson-5.9.0-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c4eec2ddc046360d087cf35659c7ba0cbd101f32035e19047013162274e71fcf"}, - {file = "ujson-5.9.0-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2fbb90aa5c23cb3d4b803c12aa220d26778c31b6e4b7a13a1f49971f6c7d088e"}, - {file = "ujson-5.9.0-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ba0823cb70866f0d6a4ad48d998dd338dce7314598721bc1b7986d054d782dfd"}, - {file = "ujson-5.9.0-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:4e35d7885ed612feb6b3dd1b7de28e89baaba4011ecdf995e88be9ac614765e9"}, - {file = "ujson-5.9.0-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:b048aa93eace8571eedbd67b3766623e7f0acbf08ee291bef7d8106210432427"}, - {file = "ujson-5.9.0-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:323279e68c195110ef85cbe5edce885219e3d4a48705448720ad925d88c9f851"}, - {file = "ujson-5.9.0-pp38-pypy38_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9ac92d86ff34296f881e12aa955f7014d276895e0e4e868ba7fddebbde38e378"}, - {file = "ujson-5.9.0-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:6eecbd09b316cea1fd929b1e25f70382917542ab11b692cb46ec9b0a26c7427f"}, - {file = "ujson-5.9.0-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:473fb8dff1d58f49912323d7cb0859df5585cfc932e4b9c053bf8cf7f2d7c5c4"}, - {file = "ujson-5.9.0-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f91719c6abafe429c1a144cfe27883eace9fb1c09a9c5ef1bcb3ae80a3076a4e"}, - {file = "ujson-5.9.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7b1c0991c4fe256f5fdb19758f7eac7f47caac29a6c57d0de16a19048eb86bad"}, - {file = "ujson-5.9.0-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2a8ea0f55a1396708e564595aaa6696c0d8af532340f477162ff6927ecc46e21"}, - {file = "ujson-5.9.0-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:07e0cfdde5fd91f54cd2d7ffb3482c8ff1bf558abf32a8b953a5d169575ae1cd"}, - {file = "ujson-5.9.0.tar.gz", hash = "sha256:89cc92e73d5501b8a7f48575eeb14ad27156ad092c2e9fc7e3cf949f07e75532"}, + {file = "ujson-5.10.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:2601aa9ecdbee1118a1c2065323bda35e2c5a2cf0797ef4522d485f9d3ef65bd"}, + {file = "ujson-5.10.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:348898dd702fc1c4f1051bc3aacbf894caa0927fe2c53e68679c073375f732cf"}, + {file = "ujson-5.10.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:22cffecf73391e8abd65ef5f4e4dd523162a3399d5e84faa6aebbf9583df86d6"}, + {file = "ujson-5.10.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:26b0e2d2366543c1bb4fbd457446f00b0187a2bddf93148ac2da07a53fe51569"}, + {file = "ujson-5.10.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:caf270c6dba1be7a41125cd1e4fc7ba384bf564650beef0df2dd21a00b7f5770"}, + {file = "ujson-5.10.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:a245d59f2ffe750446292b0094244df163c3dc96b3ce152a2c837a44e7cda9d1"}, + {file = "ujson-5.10.0-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:94a87f6e151c5f483d7d54ceef83b45d3a9cca7a9cb453dbdbb3f5a6f64033f5"}, + {file = "ujson-5.10.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:29b443c4c0a113bcbb792c88bea67b675c7ca3ca80c3474784e08bba01c18d51"}, + {file = "ujson-5.10.0-cp310-cp310-win32.whl", hash = "sha256:c18610b9ccd2874950faf474692deee4223a994251bc0a083c114671b64e6518"}, + {file = "ujson-5.10.0-cp310-cp310-win_amd64.whl", hash = "sha256:924f7318c31874d6bb44d9ee1900167ca32aa9b69389b98ecbde34c1698a250f"}, + {file = "ujson-5.10.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:a5b366812c90e69d0f379a53648be10a5db38f9d4ad212b60af00bd4048d0f00"}, + {file = "ujson-5.10.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:502bf475781e8167f0f9d0e41cd32879d120a524b22358e7f205294224c71126"}, + {file = "ujson-5.10.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5b91b5d0d9d283e085e821651184a647699430705b15bf274c7896f23fe9c9d8"}, + {file = "ujson-5.10.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:129e39af3a6d85b9c26d5577169c21d53821d8cf68e079060602e861c6e5da1b"}, + {file = "ujson-5.10.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f77b74475c462cb8b88680471193064d3e715c7c6074b1c8c412cb526466efe9"}, + {file = "ujson-5.10.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:7ec0ca8c415e81aa4123501fee7f761abf4b7f386aad348501a26940beb1860f"}, + {file = "ujson-5.10.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:ab13a2a9e0b2865a6c6db9271f4b46af1c7476bfd51af1f64585e919b7c07fd4"}, + {file = "ujson-5.10.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:57aaf98b92d72fc70886b5a0e1a1ca52c2320377360341715dd3933a18e827b1"}, + {file = "ujson-5.10.0-cp311-cp311-win32.whl", hash = "sha256:2987713a490ceb27edff77fb184ed09acdc565db700ee852823c3dc3cffe455f"}, + {file = "ujson-5.10.0-cp311-cp311-win_amd64.whl", hash = "sha256:f00ea7e00447918ee0eff2422c4add4c5752b1b60e88fcb3c067d4a21049a720"}, + {file = "ujson-5.10.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:98ba15d8cbc481ce55695beee9f063189dce91a4b08bc1d03e7f0152cd4bbdd5"}, + {file = "ujson-5.10.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:a9d2edbf1556e4f56e50fab7d8ff993dbad7f54bac68eacdd27a8f55f433578e"}, + {file = "ujson-5.10.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6627029ae4f52d0e1a2451768c2c37c0c814ffc04f796eb36244cf16b8e57043"}, + {file = "ujson-5.10.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f8ccb77b3e40b151e20519c6ae6d89bfe3f4c14e8e210d910287f778368bb3d1"}, + {file = "ujson-5.10.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f3caf9cd64abfeb11a3b661329085c5e167abbe15256b3b68cb5d914ba7396f3"}, + {file = "ujson-5.10.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:6e32abdce572e3a8c3d02c886c704a38a1b015a1fb858004e03d20ca7cecbb21"}, + {file = "ujson-5.10.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:a65b6af4d903103ee7b6f4f5b85f1bfd0c90ba4eeac6421aae436c9988aa64a2"}, + {file = "ujson-5.10.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:604a046d966457b6cdcacc5aa2ec5314f0e8c42bae52842c1e6fa02ea4bda42e"}, + {file = "ujson-5.10.0-cp312-cp312-win32.whl", hash = "sha256:6dea1c8b4fc921bf78a8ff00bbd2bfe166345f5536c510671bccececb187c80e"}, + {file = "ujson-5.10.0-cp312-cp312-win_amd64.whl", hash = "sha256:38665e7d8290188b1e0d57d584eb8110951a9591363316dd41cf8686ab1d0abc"}, + {file = "ujson-5.10.0-cp313-cp313-macosx_10_9_x86_64.whl", hash = "sha256:618efd84dc1acbd6bff8eaa736bb6c074bfa8b8a98f55b61c38d4ca2c1f7f287"}, + {file = "ujson-5.10.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:38d5d36b4aedfe81dfe251f76c0467399d575d1395a1755de391e58985ab1c2e"}, + {file = "ujson-5.10.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:67079b1f9fb29ed9a2914acf4ef6c02844b3153913eb735d4bf287ee1db6e557"}, + {file = "ujson-5.10.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d7d0e0ceeb8fe2468c70ec0c37b439dd554e2aa539a8a56365fd761edb418988"}, + {file = "ujson-5.10.0-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:59e02cd37bc7c44d587a0ba45347cc815fb7a5fe48de16bf05caa5f7d0d2e816"}, + {file = "ujson-5.10.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:2a890b706b64e0065f02577bf6d8ca3b66c11a5e81fb75d757233a38c07a1f20"}, + {file = "ujson-5.10.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:621e34b4632c740ecb491efc7f1fcb4f74b48ddb55e65221995e74e2d00bbff0"}, + {file = "ujson-5.10.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:b9500e61fce0cfc86168b248104e954fead61f9be213087153d272e817ec7b4f"}, + {file = "ujson-5.10.0-cp313-cp313-win32.whl", hash = "sha256:4c4fc16f11ac1612f05b6f5781b384716719547e142cfd67b65d035bd85af165"}, + {file = "ujson-5.10.0-cp313-cp313-win_amd64.whl", hash = "sha256:4573fd1695932d4f619928fd09d5d03d917274381649ade4328091ceca175539"}, + {file = "ujson-5.10.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:a984a3131da7f07563057db1c3020b1350a3e27a8ec46ccbfbf21e5928a43050"}, + {file = "ujson-5.10.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:73814cd1b9db6fc3270e9d8fe3b19f9f89e78ee9d71e8bd6c9a626aeaeaf16bd"}, + {file = "ujson-5.10.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:61e1591ed9376e5eddda202ec229eddc56c612b61ac6ad07f96b91460bb6c2fb"}, + {file = "ujson-5.10.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d2c75269f8205b2690db4572a4a36fe47cd1338e4368bc73a7a0e48789e2e35a"}, + {file = "ujson-5.10.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7223f41e5bf1f919cd8d073e35b229295aa8e0f7b5de07ed1c8fddac63a6bc5d"}, + {file = "ujson-5.10.0-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:d4dc2fd6b3067c0782e7002ac3b38cf48608ee6366ff176bbd02cf969c9c20fe"}, + {file = "ujson-5.10.0-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:232cc85f8ee3c454c115455195a205074a56ff42608fd6b942aa4c378ac14dd7"}, + {file = "ujson-5.10.0-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:cc6139531f13148055d691e442e4bc6601f6dba1e6d521b1585d4788ab0bfad4"}, + {file = "ujson-5.10.0-cp38-cp38-win32.whl", hash = "sha256:e7ce306a42b6b93ca47ac4a3b96683ca554f6d35dd8adc5acfcd55096c8dfcb8"}, + {file = "ujson-5.10.0-cp38-cp38-win_amd64.whl", hash = "sha256:e82d4bb2138ab05e18f089a83b6564fee28048771eb63cdecf4b9b549de8a2cc"}, + {file = "ujson-5.10.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:dfef2814c6b3291c3c5f10065f745a1307d86019dbd7ea50e83504950136ed5b"}, + {file = "ujson-5.10.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:4734ee0745d5928d0ba3a213647f1c4a74a2a28edc6d27b2d6d5bd9fa4319e27"}, + {file = "ujson-5.10.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d47ebb01bd865fdea43da56254a3930a413f0c5590372a1241514abae8aa7c76"}, + {file = "ujson-5.10.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dee5e97c2496874acbf1d3e37b521dd1f307349ed955e62d1d2f05382bc36dd5"}, + {file = "ujson-5.10.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7490655a2272a2d0b072ef16b0b58ee462f4973a8f6bbe64917ce5e0a256f9c0"}, + {file = "ujson-5.10.0-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:ba17799fcddaddf5c1f75a4ba3fd6441f6a4f1e9173f8a786b42450851bd74f1"}, + {file = "ujson-5.10.0-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:2aff2985cef314f21d0fecc56027505804bc78802c0121343874741650a4d3d1"}, + {file = "ujson-5.10.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:ad88ac75c432674d05b61184178635d44901eb749786c8eb08c102330e6e8996"}, + {file = "ujson-5.10.0-cp39-cp39-win32.whl", hash = "sha256:2544912a71da4ff8c4f7ab5606f947d7299971bdd25a45e008e467ca638d13c9"}, + {file = "ujson-5.10.0-cp39-cp39-win_amd64.whl", hash = "sha256:3ff201d62b1b177a46f113bb43ad300b424b7847f9c5d38b1b4ad8f75d4a282a"}, + {file = "ujson-5.10.0-pp310-pypy310_pp73-macosx_10_9_x86_64.whl", hash = "sha256:5b6fee72fa77dc172a28f21693f64d93166534c263adb3f96c413ccc85ef6e64"}, + {file = "ujson-5.10.0-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:61d0af13a9af01d9f26d2331ce49bb5ac1fb9c814964018ac8df605b5422dcb3"}, + {file = "ujson-5.10.0-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ecb24f0bdd899d368b715c9e6664166cf694d1e57be73f17759573a6986dd95a"}, + {file = "ujson-5.10.0-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fbd8fd427f57a03cff3ad6574b5e299131585d9727c8c366da4624a9069ed746"}, + {file = "ujson-5.10.0-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:beeaf1c48e32f07d8820c705ff8e645f8afa690cca1544adba4ebfa067efdc88"}, + {file = "ujson-5.10.0-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:baed37ea46d756aca2955e99525cc02d9181de67f25515c468856c38d52b5f3b"}, + {file = "ujson-5.10.0-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:7663960f08cd5a2bb152f5ee3992e1af7690a64c0e26d31ba7b3ff5b2ee66337"}, + {file = "ujson-5.10.0-pp38-pypy38_pp73-macosx_11_0_arm64.whl", hash = "sha256:d8640fb4072d36b08e95a3a380ba65779d356b2fee8696afeb7794cf0902d0a1"}, + {file = "ujson-5.10.0-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:78778a3aa7aafb11e7ddca4e29f46bc5139131037ad628cc10936764282d6753"}, + {file = "ujson-5.10.0-pp38-pypy38_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b0111b27f2d5c820e7f2dbad7d48e3338c824e7ac4d2a12da3dc6061cc39c8e6"}, + {file = "ujson-5.10.0-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:c66962ca7565605b355a9ed478292da628b8f18c0f2793021ca4425abf8b01e5"}, + {file = "ujson-5.10.0-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:ba43cc34cce49cf2d4bc76401a754a81202d8aa926d0e2b79f0ee258cb15d3a4"}, + {file = "ujson-5.10.0-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:ac56eb983edce27e7f51d05bc8dd820586c6e6be1c5216a6809b0c668bb312b8"}, + {file = "ujson-5.10.0-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f44bd4b23a0e723bf8b10628288c2c7c335161d6840013d4d5de20e48551773b"}, + {file = "ujson-5.10.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7c10f4654e5326ec14a46bcdeb2b685d4ada6911050aa8baaf3501e57024b804"}, + {file = "ujson-5.10.0-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0de4971a89a762398006e844ae394bd46991f7c385d7a6a3b93ba229e6dac17e"}, + {file = "ujson-5.10.0-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:e1402f0564a97d2a52310ae10a64d25bcef94f8dd643fcf5d310219d915484f7"}, + {file = "ujson-5.10.0.tar.gz", hash = "sha256:b3cd8f3c5d8c7738257f1018880444f7b7d9b66232c64649f562d7ba86ad4bc1"}, ] [[package]] @@ -6151,13 +6210,13 @@ test = ["Cython (>=0.29.36,<0.30.0)", "aiohttp (==3.9.0b0)", "aiohttp (>=3.8.1)" [[package]] name = "virtualenv" -version = "20.26.1" +version = "20.26.2" description = "Virtual Python Environment builder" optional = false python-versions = ">=3.7" files = [ - {file = "virtualenv-20.26.1-py3-none-any.whl", hash = "sha256:7aa9982a728ae5892558bff6a2839c00b9ed145523ece2274fad6f414690ae75"}, - {file = "virtualenv-20.26.1.tar.gz", hash = "sha256:604bfdceaeece392802e6ae48e69cec49168b9c5f4a44e483963f9242eb0e78b"}, + {file = "virtualenv-20.26.2-py3-none-any.whl", hash = "sha256:a624db5e94f01ad993d476b9ee5346fdf7b9de43ccaee0e0197012dc838a0e9b"}, + {file = "virtualenv-20.26.2.tar.gz", hash = "sha256:82bf0f4eebbb78d36ddaee0283d43fe5736b53880b8a8cdcd37390a07ac3741c"}, ] [package.dependencies] @@ -6684,7 +6743,78 @@ files = [ docs = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-lint"] testing = ["big-O", "jaraco.functools", "jaraco.itertools", "more-itertools", "pytest (>=6)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=2.2)", "pytest-ignore-flaky", "pytest-mypy", "pytest-ruff (>=0.2.1)"] +[[package]] +name = "zope-event" +version = "5.0" +description = "Very basic event publishing system" +optional = false +python-versions = ">=3.7" +files = [ + {file = "zope.event-5.0-py3-none-any.whl", hash = "sha256:2832e95014f4db26c47a13fdaef84cef2f4df37e66b59d8f1f4a8f319a632c26"}, + {file = "zope.event-5.0.tar.gz", hash = "sha256:bac440d8d9891b4068e2b5a2c5e2c9765a9df762944bda6955f96bb9b91e67cd"}, +] + +[package.dependencies] +setuptools = "*" + +[package.extras] +docs = ["Sphinx"] +test = ["zope.testrunner"] + +[[package]] +name = "zope-interface" +version = "6.3" +description = "Interfaces for Python" +optional = false +python-versions = ">=3.7" +files = [ + {file = "zope.interface-6.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:2f32010ffb87759c6a3ad1c65ed4d2e38e51f6b430a1ca11cee901ec2b42e021"}, + {file = "zope.interface-6.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:e78a183a3c2f555c2ad6aaa1ab572d1c435ba42f1dc3a7e8c82982306a19b785"}, + {file = "zope.interface-6.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:afa0491a9f154cf8519a02026dc85a416192f4cb1efbbf32db4a173ba28b289a"}, + {file = "zope.interface-6.3-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:62e32f02b3f26204d9c02c3539c802afc3eefb19d601a0987836ed126efb1f21"}, + {file = "zope.interface-6.3-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c40df4aea777be321b7e68facb901bc67317e94b65d9ab20fb96e0eb3c0b60a1"}, + {file = "zope.interface-6.3-cp310-cp310-win_amd64.whl", hash = "sha256:46034be614d1f75f06e7dcfefba21d609b16b38c21fc912b01a99cb29e58febb"}, + {file = "zope.interface-6.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:600101f43a7582d5b9504a7c629a1185a849ce65e60fca0f6968dfc4b76b6d39"}, + {file = "zope.interface-6.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:4d6b229f5e1a6375f206455cc0a63a8e502ed190fe7eb15e94a312dc69d40299"}, + {file = "zope.interface-6.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:10cde8dc6b2fd6a1d0b5ca4be820063e46ddba417ab82bcf55afe2227337b130"}, + {file = "zope.interface-6.3-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:40aa8c8e964d47d713b226c5baf5f13cdf3a3169c7a2653163b17ff2e2334d10"}, + {file = "zope.interface-6.3-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d165d7774d558ea971cb867739fb334faf68fc4756a784e689e11efa3becd59e"}, + {file = "zope.interface-6.3-cp311-cp311-win_amd64.whl", hash = "sha256:69dedb790530c7ca5345899a1b4cb837cc53ba669051ea51e8c18f82f9389061"}, + {file = "zope.interface-6.3-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:8d407e0fd8015f6d5dfad481309638e1968d70e6644e0753f229154667dd6cd5"}, + {file = "zope.interface-6.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:72d5efecad16c619a97744a4f0b67ce1bcc88115aa82fcf1dc5be9bb403bcc0b"}, + {file = "zope.interface-6.3-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:567d54c06306f9c5b6826190628d66753b9f2b0422f4c02d7c6d2b97ebf0a24e"}, + {file = "zope.interface-6.3-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:483e118b1e075f1819b3c6ace082b9d7d3a6a5eb14b2b375f1b80a0868117920"}, + {file = "zope.interface-6.3-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2bb78c12c1ad3a20c0d981a043d133299117b6854f2e14893b156979ed4e1d2c"}, + {file = "zope.interface-6.3-cp312-cp312-win_amd64.whl", hash = "sha256:ad4524289d8dbd6fb5aa17aedb18f5643e7d48358f42c007a5ee51a2afc2a7c5"}, + {file = "zope.interface-6.3-cp37-cp37m-macosx_11_0_x86_64.whl", hash = "sha256:a56fe1261230093bfeedc1c1a6cd6f3ec568f9b07f031c9a09f46b201f793a85"}, + {file = "zope.interface-6.3-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:014bb94fe6bf1786da1aa044eadf65bc6437bcb81c451592987e5be91e70a91e"}, + {file = "zope.interface-6.3-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:22e8a218e8e2d87d4d9342aa973b7915297a08efbebea5b25900c73e78ed468e"}, + {file = "zope.interface-6.3-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f95bebd0afe86b2adc074df29edb6848fc4d474ff24075e2c263d698774e108d"}, + {file = "zope.interface-6.3-cp37-cp37m-win_amd64.whl", hash = "sha256:d0e7321557c702bd92dac3c66a2f22b963155fdb4600133b6b29597f62b71b12"}, + {file = "zope.interface-6.3-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:187f7900b63845dcdef1be320a523dbbdba94d89cae570edc2781eb55f8c2f86"}, + {file = "zope.interface-6.3-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:a058e6cf8d68a5a19cb5449f42a404f0d6c2778b897e6ce8fadda9cea308b1b0"}, + {file = "zope.interface-6.3-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e8fa0fb05083a1a4216b4b881fdefa71c5d9a106e9b094cd4399af6b52873e91"}, + {file = "zope.interface-6.3-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:26c9a37fb395a703e39b11b00b9e921c48f82b6e32cc5851ad5d0618cd8876b5"}, + {file = "zope.interface-6.3-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1b0c4c90e5eefca2c3e045d9f9ed9f1e2cdbe70eb906bff6b247e17119ad89a1"}, + {file = "zope.interface-6.3-cp38-cp38-win_amd64.whl", hash = "sha256:5683aa8f2639016fd2b421df44301f10820e28a9b96382a6e438e5c6427253af"}, + {file = "zope.interface-6.3-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:2c3cfb272bcb83650e6695d49ae0d14dd06dc694789a3d929f23758557a23d92"}, + {file = "zope.interface-6.3-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:01a0b3dd012f584afcf03ed814bce0fc40ed10e47396578621509ac031be98bf"}, + {file = "zope.interface-6.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4137025731e824eee8d263b20682b28a0bdc0508de9c11d6c6be54163e5b7c83"}, + {file = "zope.interface-6.3-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3c8731596198198746f7ce2a4487a0edcbc9ea5e5918f0ab23c4859bce56055c"}, + {file = "zope.interface-6.3-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bf34840e102d1d0b2d39b1465918d90b312b1119552cebb61a242c42079817b9"}, + {file = "zope.interface-6.3-cp39-cp39-win_amd64.whl", hash = "sha256:a1adc14a2a9d5e95f76df625a9b39f4709267a483962a572e3f3001ef90ea6e6"}, + {file = "zope.interface-6.3.tar.gz", hash = "sha256:f83d6b4b22262d9a826c3bd4b2fbfafe1d0000f085ef8e44cd1328eea274ae6a"}, +] + +[package.dependencies] +setuptools = "*" + +[package.extras] +docs = ["Sphinx", "repoze.sphinx.autointerface", "sphinx-rtd-theme"] +test = ["coverage (>=5.0.3)", "zope.event", "zope.testing"] +testing = ["coverage (>=5.0.3)", "zope.event", "zope.testing"] + [metadata] lock-version = "2.0" python-versions = "^3.11" -content-hash = "d390ba698e7278d14ffd2bca62ac62bc190b0c4d72cc669dec6307e187ca4653" +content-hash = "bb90115473396471c0bad6dc4152100683e3057e2b1189527de7a82c4f393341" diff --git a/pyproject.toml b/pyproject.toml index 1fc36b0f94..bf1db2bf4b 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -29,6 +29,7 @@ pexpect = "*" jinja2 = "^3.1.3" python-multipart = "*" boto3 = "*" +gevent = "^24.2.1" [tool.poetry.group.llama-index.dependencies] llama-index = "*" @@ -48,6 +49,9 @@ pytest = "*" pytest-cov = "*" pytest-asyncio = "*" +[tool.coverage.run] +concurrency = ["gevent"] + [tool.poetry.group.evaluation.dependencies] torch = "2.2.2" diff --git a/tests/integration/mock/CodeActAgent/test_edits/prompt_001.log b/tests/integration/mock/CodeActAgent/test_edits/prompt_001.log index c21769d395..92c47c0b0a 100644 --- a/tests/integration/mock/CodeActAgent/test_edits/prompt_001.log +++ b/tests/integration/mock/CodeActAgent/test_edits/prompt_001.log @@ -220,4 +220,4 @@ NOW, LET'S START! Fix typos in bad.txt. Do not ask me for confirmation at any point. -ENVIRONMENT REMINDER: You have 99 turns left to complete the task. +ENVIRONMENT REMINDER: You have 98 turns left to complete the task. diff --git a/tests/integration/mock/CodeActAgent/test_edits/prompt_002.log b/tests/integration/mock/CodeActAgent/test_edits/prompt_002.log index 6aa408ca2c..1ed1b3b548 100644 --- a/tests/integration/mock/CodeActAgent/test_edits/prompt_002.log +++ b/tests/integration/mock/CodeActAgent/test_edits/prompt_002.log @@ -220,23 +220,19 @@ NOW, LET'S START! Fix typos in bad.txt. Do not ask me for confirmation at any point. -ENVIRONMENT REMINDER: You have 99 turns left to complete the task. +ENVIRONMENT REMINDER: You have 98 turns left to complete the task. ---------- -To fix typos in a file without asking for confirmation, we can use the `sed` command in bash to replace the typos. Let's go ahead and fix the typos in `bad.txt` without any confirmation prompts. - +Let's start by opening the file `bad.txt` to identify and fix the typos. Let me open the file for you: -cat bad.txt +open bad.txt ---------- OBSERVATION: -This is a stupid typoo. -Really? -No mor typos! -Enjoy! -[Command -1 finished with exit code 0]] +-bash: open: command not found +[Command -1 finished with exit code 127]] -ENVIRONMENT REMINDER: You have 98 turns left to complete the task. +ENVIRONMENT REMINDER: You have 97 turns left to complete the task. diff --git a/tests/integration/mock/CodeActAgent/test_edits/prompt_003.log b/tests/integration/mock/CodeActAgent/test_edits/prompt_003.log index 86db22cbc9..e432403c3a 100644 --- a/tests/integration/mock/CodeActAgent/test_edits/prompt_003.log +++ b/tests/integration/mock/CodeActAgent/test_edits/prompt_003.log @@ -220,12 +220,26 @@ NOW, LET'S START! Fix typos in bad.txt. Do not ask me for confirmation at any point. -ENVIRONMENT REMINDER: You have 99 turns left to complete the task. +ENVIRONMENT REMINDER: You have 98 turns left to complete the task. ---------- -To fix typos in a file without asking for confirmation, we can use the `sed` command in bash to replace the typos. Let's go ahead and fix the typos in `bad.txt` without any confirmation prompts. +Let's start by opening the file `bad.txt` to identify and fix the typos. Let me open the file for you: + +open bad.txt + +---------- + +OBSERVATION: +-bash: open: command not found +[Command -1 finished with exit code 127]] + +ENVIRONMENT REMINDER: You have 97 turns left to complete the task. + +---------- + +It seems that the `open` command is not available in this environment. Let's try to read the content of the file `bad.txt` to identify the typos. Let me display the content of the file for you: cat bad.txt @@ -239,21 +253,4 @@ No mor typos! Enjoy! [Command -1 finished with exit code 0]] -ENVIRONMENT REMINDER: You have 98 turns left to complete the task. - ----------- - -Great! Let's use the `sed` command to fix the typos in the `bad.txt` file without any confirmation prompts. - - -sed -i 's/typoo/typo/g' bad.txt -sed -i 's/mor/more/g' bad.txt - - ----------- - -OBSERVATION: - -[Command -1 finished with exit code 0]] - -ENVIRONMENT REMINDER: You have 97 turns left to complete the task. +ENVIRONMENT REMINDER: You have 96 turns left to complete the task. diff --git a/tests/integration/mock/CodeActAgent/test_edits/prompt_004.log b/tests/integration/mock/CodeActAgent/test_edits/prompt_004.log new file mode 100644 index 0000000000..02222dd022 --- /dev/null +++ b/tests/integration/mock/CodeActAgent/test_edits/prompt_004.log @@ -0,0 +1,276 @@ + + +---------- + +A chat between a curious user and an artificial intelligence assistant. The assistant gives helpful, detailed, and polite answers to the user's questions. +The assistant can interact with an interactive Python (Jupyter Notebook) environment and receive the corresponding output when needed. The code should be enclosed using "" tag, for example: + +print("Hello World!") + +The assistant can execute bash commands on behalf of the user by wrapping them with and . +For example, you can list the files in the current directory by ls . +The assistant should attempt fewer things at a time instead of putting too much commands OR code in one "execute" block. +The assistant can install Python packages through bash by pip install [package needed] and should always import packages and define variables before starting to use them. +The assistant should stop and provide an answer when they have already obtained the answer from the execution result. +If the assistant encounters an import error in IPython for a newly installed package, they should try to restart the kernel and import the package again. IPython kernel can be re-started by: + +import IPython +IPython.Application.instance().kernel.do_shutdown(True) # Restart the kernel + + + +Apart from the standard bash commands, you can also use the following special commands in environment: +open [] - opens the file at the given path in the editor. If line_number is provided, the window will be move to include that line +goto - moves the window to show +scroll_down - moves the window down {WINDOW} lines +scroll_up - moves the window down {WINDOW} lines +create - creates and opens a new file with the given name +search_dir [] - searches for search_term in all files in dir. If dir is not provided, searches in the current directory +search_file [] - searches for search_term in file. If file is not provided, searches in the current open file +find_file [] - finds all files with the given name in dir. If dir is not provided, searches in the current directory +edit : + +end_of_edit - replaces lines through (inclusive) with the given text in the open file. The replacement text is terminated by a line with only end_of_edit on it. All of the will be entered, so make sure your indentation is formatted properly. Python files will be checked for syntax errors after the edit. If the system detects a syntax error, the edit will not be executed. Simply try to edit the file again, but make sure to read the error message and modify the edit command you issue accordingly. Issuing the same command a second time will just lead to the same error message again. Remember, the file must be open before editing. +Please note that THE EDIT COMMAND REQUIRES PROPER INDENTATION. If you'd like to add the line ' print(x)' you must fully write that out, with all those spaces before the code! Indentation is important and code that is not indented correctly will fail and require fixing before it can be run. + +The assistant's response should be concise, but do express their thoughts. +Try to include one of or in each of your responses, unless it is a direct answer to a question OR a message to the user. +IMPORTANT: Whenever possible, execute the code for the user using or instead of providing it. + + +---------- + +Here is an example of how you can interact with the environment for task solving: + +--- START OF EXAMPLE --- + +USER: Can you create a list of numbers from 1 to 10, and create a web page to display them at port 5000? + +ASSISTANT: +Sure! Let me write the Python code for starting a web server and save it to a file `app.py`: + +CODE=''' +from flask import Flask +app = Flask(__name__) + +@app.route('/') +def index(): + numbers = list(range(1, 11)) + return str(numbers) + +if __name__ == '__main__': + app.run(port=5000) +''' +with open('app.py', 'w') as f: + f.write(CODE) + + +USER: +Observation: +[Code executed successfully with no output] + +ASSISTANT: +I have created a Python file `app.py` that will display a list of numbers from 1 to 10 when you run it. Let me run the Python file for you: + +python3 app.py > server.log 2>&1 & + + +USER: +Observation: +[1] 121[1]+ Exit 1 python3 app.py > server.log 2>&1 + +ASSISTANT: Looks like the server is running with PID 121 then crashed. Let me check the server log: + +cat server.log + + +USER: +Observation: +Traceback (most recent call last): + File "/workspace/app.py", line 2, in + from flask import Flask +ModuleNotFoundError: No module named 'flask' + +ASSISTANT: +It seems that Flask is not installed. Let me install Flask for you: + +pip install flask + + +USER: +Observation: +Defaulting to user installation because normal site-packages is not writeable +Collecting flask + Using cached flask-3.0.3-py3-none-any.whl (101 kB) +Collecting blinker>=1.6.2 + Using cached blinker-1.7.0-py3-none-any.whl (13 kB) +Collecting Werkzeug>=3.0.0 + Using cached werkzeug-3.0.2-py3-none-any.whl (226 kB) +Collecting click>=8.1.3 + Using cached click-8.1.7-py3-none-any.whl (97 kB) +Collecting itsdangerous>=2.1.2 + Using cached itsdangerous-2.2.0-py3-none-any.whl (16 kB) +Requirement already satisfied: Jinja2>=3.1.2 in /home/opendevin/.local/lib/python3.10/site-packages (from flask) (3.1.3) +Requirement already satisfied: MarkupSafe>=2.0 in /home/opendevin/.local/lib/python3.10/site-packages (from Jinja2>=3.1.2->flask) (2.1.5) +Installing collected packages: Werkzeug, itsdangerous, click, blinker, flask +Successfully installed Werkzeug-3.0.2 blinker-1.7.0 click-8.1.7 flask-3.0.3 itsdangerous-2.2.0 + +ASSISTANT: +Now that Flask is installed, let me run the Python file again: + +python3 app.py > server.log 2>&1 & + + +USER: +Observation: +[1] 124 + +ASSISTANT: +Let me check the server log again: + +cat server.log + + +USER: +Observation: +* Serving Flask app 'app' + * Debug mode: off +WARNING: This is a development server. Do not use it in a production deployment. Use a production WSGI server instead. + * Running on http://127.0.0.1:5000 +Press CTRL+C to quit + +ASSISTANT: +The server is running on port 5000 with PID 124. You can access the list of numbers by visiting http://127.0.0.1:5000. If you have any further questions, feel free to ask! + +USER: Now kill the server, make it display the numbers in a table format. + +ASSISTANT: +Sure! Let me stop the server first: + +kill 124 + + +USER: +Observation: +[1]+ Terminated python3 app.py > server.log 2>&1 + +ASSISTANT: +The server has been stopped. Let me open the Python file and modify it. + +open app.py + + +USER: +[File: /workspace/app.py (11 lines total)] +1: +2:from flask import Flask +3:app = Flask(__name__) +4: +5:@app.route('/') +6:def index(): +7: numbers = list(range(1, 11)) +8: return str(numbers) +9: +10:if __name__ == '__main__': +11: app.run(port=5000) + +ASSISTANT: +I should edit the file to display the numbers in a table format. I should include correct indentation. Let me update the file: + +edit 8:8 + return '' + ''.join([f'' for i in numbers]) + '
{i}
' +end_of_edit +
+ +USER: +Observation: +[File: /workspace/app.py (11 lines total)] +1: +2:from flask import Flask +3:app = Flask(__name__) +4: +5:@app.route('/') +6:def index(): +7: numbers = list(range(1, 11)) +8: return '' + ''.join([f'' for i in numbers]) + '
{i}
' +9: +10:if __name__ == '__main__': +11: app.run(port=5000) +File updated. Please review the changes and make sure they are correct (correct indentation, no duplicate lines, etc). Edit the file again if necessary. + +ASSISTANT: +The file has been updated. Let me run the Python file again with the new changes: + +python3 app.py > server.log 2>&1 & + + +USER: +Observation: +[1] 126 + +ASSISTANT: +The server is running on port 5000 with PID 126. You can access the list of numbers in a table format by visiting http://127.0.0.1:5000. Free free to let me know if you have any further requests! + +--- END OF EXAMPLE --- + + +NOW, LET'S START! + +---------- + +Fix typos in bad.txt. Do not ask me for confirmation at any point. + +ENVIRONMENT REMINDER: You have 98 turns left to complete the task. + +---------- + +Let's start by opening the file `bad.txt` to identify and fix the typos. Let me open the file for you: + +open bad.txt + + +---------- + +OBSERVATION: +-bash: open: command not found +[Command -1 finished with exit code 127]] + +ENVIRONMENT REMINDER: You have 97 turns left to complete the task. + +---------- + +It seems that the `open` command is not available in this environment. Let's try to read the content of the file `bad.txt` to identify the typos. Let me display the content of the file for you: + +cat bad.txt + + +---------- + +OBSERVATION: +This is a stupid typoo. +Really? +No mor typos! +Enjoy! +[Command -1 finished with exit code 0]] + +ENVIRONMENT REMINDER: You have 96 turns left to complete the task. + +---------- + +I have displayed the content of the file `bad.txt` and identified the typos. Let's proceed to fix the typos in the file. I will edit the file to correct the typos: + +edit 1:4 +This is a stupid typo. +Really? +No more typos! +Enjoy! +end_of_edit + + +---------- + +OBSERVATION: +> > > > > -bash: edit: command not found +[Command -1 finished with exit code 127]] + +ENVIRONMENT REMINDER: You have 95 turns left to complete the task. diff --git a/tests/integration/mock/CodeActAgent/test_edits/prompt_005.log b/tests/integration/mock/CodeActAgent/test_edits/prompt_005.log new file mode 100644 index 0000000000..c172d2b89d --- /dev/null +++ b/tests/integration/mock/CodeActAgent/test_edits/prompt_005.log @@ -0,0 +1,294 @@ + + +---------- + +A chat between a curious user and an artificial intelligence assistant. The assistant gives helpful, detailed, and polite answers to the user's questions. +The assistant can interact with an interactive Python (Jupyter Notebook) environment and receive the corresponding output when needed. The code should be enclosed using "" tag, for example: + +print("Hello World!") + +The assistant can execute bash commands on behalf of the user by wrapping them with and . +For example, you can list the files in the current directory by ls . +The assistant should attempt fewer things at a time instead of putting too much commands OR code in one "execute" block. +The assistant can install Python packages through bash by pip install [package needed] and should always import packages and define variables before starting to use them. +The assistant should stop and provide an answer when they have already obtained the answer from the execution result. +If the assistant encounters an import error in IPython for a newly installed package, they should try to restart the kernel and import the package again. IPython kernel can be re-started by: + +import IPython +IPython.Application.instance().kernel.do_shutdown(True) # Restart the kernel + + + +Apart from the standard bash commands, you can also use the following special commands in environment: +open [] - opens the file at the given path in the editor. If line_number is provided, the window will be move to include that line +goto - moves the window to show +scroll_down - moves the window down {WINDOW} lines +scroll_up - moves the window down {WINDOW} lines +create - creates and opens a new file with the given name +search_dir [] - searches for search_term in all files in dir. If dir is not provided, searches in the current directory +search_file [] - searches for search_term in file. If file is not provided, searches in the current open file +find_file [] - finds all files with the given name in dir. If dir is not provided, searches in the current directory +edit : + +end_of_edit - replaces lines through (inclusive) with the given text in the open file. The replacement text is terminated by a line with only end_of_edit on it. All of the will be entered, so make sure your indentation is formatted properly. Python files will be checked for syntax errors after the edit. If the system detects a syntax error, the edit will not be executed. Simply try to edit the file again, but make sure to read the error message and modify the edit command you issue accordingly. Issuing the same command a second time will just lead to the same error message again. Remember, the file must be open before editing. +Please note that THE EDIT COMMAND REQUIRES PROPER INDENTATION. If you'd like to add the line ' print(x)' you must fully write that out, with all those spaces before the code! Indentation is important and code that is not indented correctly will fail and require fixing before it can be run. + +The assistant's response should be concise, but do express their thoughts. +Try to include one of or in each of your responses, unless it is a direct answer to a question OR a message to the user. +IMPORTANT: Whenever possible, execute the code for the user using or instead of providing it. + + +---------- + +Here is an example of how you can interact with the environment for task solving: + +--- START OF EXAMPLE --- + +USER: Can you create a list of numbers from 1 to 10, and create a web page to display them at port 5000? + +ASSISTANT: +Sure! Let me write the Python code for starting a web server and save it to a file `app.py`: + +CODE=''' +from flask import Flask +app = Flask(__name__) + +@app.route('/') +def index(): + numbers = list(range(1, 11)) + return str(numbers) + +if __name__ == '__main__': + app.run(port=5000) +''' +with open('app.py', 'w') as f: + f.write(CODE) + + +USER: +Observation: +[Code executed successfully with no output] + +ASSISTANT: +I have created a Python file `app.py` that will display a list of numbers from 1 to 10 when you run it. Let me run the Python file for you: + +python3 app.py > server.log 2>&1 & + + +USER: +Observation: +[1] 121[1]+ Exit 1 python3 app.py > server.log 2>&1 + +ASSISTANT: Looks like the server is running with PID 121 then crashed. Let me check the server log: + +cat server.log + + +USER: +Observation: +Traceback (most recent call last): + File "/workspace/app.py", line 2, in + from flask import Flask +ModuleNotFoundError: No module named 'flask' + +ASSISTANT: +It seems that Flask is not installed. Let me install Flask for you: + +pip install flask + + +USER: +Observation: +Defaulting to user installation because normal site-packages is not writeable +Collecting flask + Using cached flask-3.0.3-py3-none-any.whl (101 kB) +Collecting blinker>=1.6.2 + Using cached blinker-1.7.0-py3-none-any.whl (13 kB) +Collecting Werkzeug>=3.0.0 + Using cached werkzeug-3.0.2-py3-none-any.whl (226 kB) +Collecting click>=8.1.3 + Using cached click-8.1.7-py3-none-any.whl (97 kB) +Collecting itsdangerous>=2.1.2 + Using cached itsdangerous-2.2.0-py3-none-any.whl (16 kB) +Requirement already satisfied: Jinja2>=3.1.2 in /home/opendevin/.local/lib/python3.10/site-packages (from flask) (3.1.3) +Requirement already satisfied: MarkupSafe>=2.0 in /home/opendevin/.local/lib/python3.10/site-packages (from Jinja2>=3.1.2->flask) (2.1.5) +Installing collected packages: Werkzeug, itsdangerous, click, blinker, flask +Successfully installed Werkzeug-3.0.2 blinker-1.7.0 click-8.1.7 flask-3.0.3 itsdangerous-2.2.0 + +ASSISTANT: +Now that Flask is installed, let me run the Python file again: + +python3 app.py > server.log 2>&1 & + + +USER: +Observation: +[1] 124 + +ASSISTANT: +Let me check the server log again: + +cat server.log + + +USER: +Observation: +* Serving Flask app 'app' + * Debug mode: off +WARNING: This is a development server. Do not use it in a production deployment. Use a production WSGI server instead. + * Running on http://127.0.0.1:5000 +Press CTRL+C to quit + +ASSISTANT: +The server is running on port 5000 with PID 124. You can access the list of numbers by visiting http://127.0.0.1:5000. If you have any further questions, feel free to ask! + +USER: Now kill the server, make it display the numbers in a table format. + +ASSISTANT: +Sure! Let me stop the server first: + +kill 124 + + +USER: +Observation: +[1]+ Terminated python3 app.py > server.log 2>&1 + +ASSISTANT: +The server has been stopped. Let me open the Python file and modify it. + +open app.py + + +USER: +[File: /workspace/app.py (11 lines total)] +1: +2:from flask import Flask +3:app = Flask(__name__) +4: +5:@app.route('/') +6:def index(): +7: numbers = list(range(1, 11)) +8: return str(numbers) +9: +10:if __name__ == '__main__': +11: app.run(port=5000) + +ASSISTANT: +I should edit the file to display the numbers in a table format. I should include correct indentation. Let me update the file: + +edit 8:8 + return '' + ''.join([f'' for i in numbers]) + '
{i}
' +end_of_edit +
+ +USER: +Observation: +[File: /workspace/app.py (11 lines total)] +1: +2:from flask import Flask +3:app = Flask(__name__) +4: +5:@app.route('/') +6:def index(): +7: numbers = list(range(1, 11)) +8: return '' + ''.join([f'' for i in numbers]) + '
{i}
' +9: +10:if __name__ == '__main__': +11: app.run(port=5000) +File updated. Please review the changes and make sure they are correct (correct indentation, no duplicate lines, etc). Edit the file again if necessary. + +ASSISTANT: +The file has been updated. Let me run the Python file again with the new changes: + +python3 app.py > server.log 2>&1 & + + +USER: +Observation: +[1] 126 + +ASSISTANT: +The server is running on port 5000 with PID 126. You can access the list of numbers in a table format by visiting http://127.0.0.1:5000. Free free to let me know if you have any further requests! + +--- END OF EXAMPLE --- + + +NOW, LET'S START! + +---------- + +Fix typos in bad.txt. Do not ask me for confirmation at any point. + +ENVIRONMENT REMINDER: You have 98 turns left to complete the task. + +---------- + +Let's start by opening the file `bad.txt` to identify and fix the typos. Let me open the file for you: + +open bad.txt + + +---------- + +OBSERVATION: +-bash: open: command not found +[Command -1 finished with exit code 127]] + +ENVIRONMENT REMINDER: You have 97 turns left to complete the task. + +---------- + +It seems that the `open` command is not available in this environment. Let's try to read the content of the file `bad.txt` to identify the typos. Let me display the content of the file for you: + +cat bad.txt + + +---------- + +OBSERVATION: +This is a stupid typoo. +Really? +No mor typos! +Enjoy! +[Command -1 finished with exit code 0]] + +ENVIRONMENT REMINDER: You have 96 turns left to complete the task. + +---------- + +I have displayed the content of the file `bad.txt` and identified the typos. Let's proceed to fix the typos in the file. I will edit the file to correct the typos: + +edit 1:4 +This is a stupid typo. +Really? +No more typos! +Enjoy! +end_of_edit + + +---------- + +OBSERVATION: +> > > > > -bash: edit: command not found +[Command -1 finished with exit code 127]] + +ENVIRONMENT REMINDER: You have 95 turns left to complete the task. + +---------- + +It seems that the `edit` command is not available in this environment as well. Let's try a different approach to fix the typos in the file `bad.txt`. I will overwrite the content of the file with the corrected text: + +echo "This is a stupid typo. +Really? +No more typos! +Enjoy!" > bad.txt + + +---------- + +OBSERVATION: +> > > +[Command -1 finished with exit code 0]] + +ENVIRONMENT REMINDER: You have 94 turns left to complete the task. diff --git a/tests/integration/mock/CodeActAgent/test_edits/response_001.log b/tests/integration/mock/CodeActAgent/test_edits/response_001.log index b52eebba02..ad055fd76b 100644 --- a/tests/integration/mock/CodeActAgent/test_edits/response_001.log +++ b/tests/integration/mock/CodeActAgent/test_edits/response_001.log @@ -1,4 +1,3 @@ -To fix typos in a file without asking for confirmation, we can use the `sed` command in bash to replace the typos. Let's go ahead and fix the typos in `bad.txt` without any confirmation prompts. - +Let's start by opening the file `bad.txt` to identify and fix the typos. Let me open the file for you: -cat bad.txt +open bad.txt diff --git a/tests/integration/mock/CodeActAgent/test_edits/response_002.log b/tests/integration/mock/CodeActAgent/test_edits/response_002.log index 10fcc98bdd..a3b3349aae 100644 --- a/tests/integration/mock/CodeActAgent/test_edits/response_002.log +++ b/tests/integration/mock/CodeActAgent/test_edits/response_002.log @@ -1,5 +1,3 @@ -Great! Let's use the `sed` command to fix the typos in the `bad.txt` file without any confirmation prompts. - +It seems that the `open` command is not available in this environment. Let's try to read the content of the file `bad.txt` to identify the typos. Let me display the content of the file for you: -sed -i 's/typoo/typo/g' bad.txt -sed -i 's/mor/more/g' bad.txt +cat bad.txt diff --git a/tests/integration/mock/CodeActAgent/test_edits/response_003.log b/tests/integration/mock/CodeActAgent/test_edits/response_003.log index e8ccf02930..7d2801563a 100644 --- a/tests/integration/mock/CodeActAgent/test_edits/response_003.log +++ b/tests/integration/mock/CodeActAgent/test_edits/response_003.log @@ -1 +1,8 @@ -The typos in the `bad.txt` file have been successfully fixed. If you need further assistance or have any more tasks, feel free to let me know! +I have displayed the content of the file `bad.txt` and identified the typos. Let's proceed to fix the typos in the file. I will edit the file to correct the typos: + +edit 1:4 +This is a stupid typo. +Really? +No more typos! +Enjoy! +end_of_edit diff --git a/tests/integration/mock/CodeActAgent/test_edits/response_004.log b/tests/integration/mock/CodeActAgent/test_edits/response_004.log new file mode 100644 index 0000000000..e9a93d2ba9 --- /dev/null +++ b/tests/integration/mock/CodeActAgent/test_edits/response_004.log @@ -0,0 +1,6 @@ +It seems that the `edit` command is not available in this environment as well. Let's try a different approach to fix the typos in the file `bad.txt`. I will overwrite the content of the file with the corrected text: + +echo "This is a stupid typo. +Really? +No more typos! +Enjoy!" > bad.txt diff --git a/tests/integration/mock/CodeActAgent/test_edits/response_005.log b/tests/integration/mock/CodeActAgent/test_edits/response_005.log new file mode 100644 index 0000000000..31cca61dc8 --- /dev/null +++ b/tests/integration/mock/CodeActAgent/test_edits/response_005.log @@ -0,0 +1 @@ +The typos in the file `bad.txt` have been successfully fixed by overwriting the content with the corrected text. If you need any further assistance or have any more tasks, feel free to let me know! diff --git a/tests/integration/mock/CodeActAgent/test_ipython/prompt_001.log b/tests/integration/mock/CodeActAgent/test_ipython/prompt_001.log index 8024ebe386..df1f5c59ea 100644 --- a/tests/integration/mock/CodeActAgent/test_ipython/prompt_001.log +++ b/tests/integration/mock/CodeActAgent/test_ipython/prompt_001.log @@ -220,4 +220,4 @@ NOW, LET'S START! Use Jupyter IPython to write a text file containing 'hello world' to '/workspace/test.txt'. Do not ask me for confirmation at any point. -ENVIRONMENT REMINDER: You have 99 turns left to complete the task. +ENVIRONMENT REMINDER: You have 98 turns left to complete the task. diff --git a/tests/integration/mock/CodeActAgent/test_ipython/prompt_002.log b/tests/integration/mock/CodeActAgent/test_ipython/prompt_002.log index 56993a1fcc..3635dcdb28 100644 --- a/tests/integration/mock/CodeActAgent/test_ipython/prompt_002.log +++ b/tests/integration/mock/CodeActAgent/test_ipython/prompt_002.log @@ -220,7 +220,7 @@ NOW, LET'S START! Use Jupyter IPython to write a text file containing 'hello world' to '/workspace/test.txt'. Do not ask me for confirmation at any point. -ENVIRONMENT REMINDER: You have 99 turns left to complete the task. +ENVIRONMENT REMINDER: You have 98 turns left to complete the task. ---------- @@ -234,6 +234,6 @@ with open('/workspace/test.txt', 'w') as f: ---------- OBSERVATION: -[Code executed successfully with no output] +-bash: execute_cli: command not found -ENVIRONMENT REMINDER: You have 98 turns left to complete the task. +ENVIRONMENT REMINDER: You have 97 turns left to complete the task. diff --git a/tests/integration/mock/CodeActAgent/test_ipython/prompt_003.log b/tests/integration/mock/CodeActAgent/test_ipython/prompt_003.log new file mode 100644 index 0000000000..e9a7af3157 --- /dev/null +++ b/tests/integration/mock/CodeActAgent/test_ipython/prompt_003.log @@ -0,0 +1,255 @@ + + +---------- + +A chat between a curious user and an artificial intelligence assistant. The assistant gives helpful, detailed, and polite answers to the user's questions. +The assistant can interact with an interactive Python (Jupyter Notebook) environment and receive the corresponding output when needed. The code should be enclosed using "" tag, for example: + +print("Hello World!") + +The assistant can execute bash commands on behalf of the user by wrapping them with and . +For example, you can list the files in the current directory by ls . +The assistant should attempt fewer things at a time instead of putting too much commands OR code in one "execute" block. +The assistant can install Python packages through bash by pip install [package needed] and should always import packages and define variables before starting to use them. +The assistant should stop and provide an answer when they have already obtained the answer from the execution result. +If the assistant encounters an import error in IPython for a newly installed package, they should try to restart the kernel and import the package again. IPython kernel can be re-started by: + +import IPython +IPython.Application.instance().kernel.do_shutdown(True) # Restart the kernel + + + +Apart from the standard bash commands, you can also use the following special commands in environment: +open [] - opens the file at the given path in the editor. If line_number is provided, the window will be move to include that line +goto - moves the window to show +scroll_down - moves the window down {WINDOW} lines +scroll_up - moves the window down {WINDOW} lines +create - creates and opens a new file with the given name +search_dir [] - searches for search_term in all files in dir. If dir is not provided, searches in the current directory +search_file [] - searches for search_term in file. If file is not provided, searches in the current open file +find_file [] - finds all files with the given name in dir. If dir is not provided, searches in the current directory +edit : + +end_of_edit - replaces lines through (inclusive) with the given text in the open file. The replacement text is terminated by a line with only end_of_edit on it. All of the will be entered, so make sure your indentation is formatted properly. Python files will be checked for syntax errors after the edit. If the system detects a syntax error, the edit will not be executed. Simply try to edit the file again, but make sure to read the error message and modify the edit command you issue accordingly. Issuing the same command a second time will just lead to the same error message again. Remember, the file must be open before editing. +Please note that THE EDIT COMMAND REQUIRES PROPER INDENTATION. If you'd like to add the line ' print(x)' you must fully write that out, with all those spaces before the code! Indentation is important and code that is not indented correctly will fail and require fixing before it can be run. + +The assistant's response should be concise, but do express their thoughts. +Try to include one of or in each of your responses, unless it is a direct answer to a question OR a message to the user. +IMPORTANT: Whenever possible, execute the code for the user using or instead of providing it. + + +---------- + +Here is an example of how you can interact with the environment for task solving: + +--- START OF EXAMPLE --- + +USER: Can you create a list of numbers from 1 to 10, and create a web page to display them at port 5000? + +ASSISTANT: +Sure! Let me write the Python code for starting a web server and save it to a file `app.py`: + +CODE=''' +from flask import Flask +app = Flask(__name__) + +@app.route('/') +def index(): + numbers = list(range(1, 11)) + return str(numbers) + +if __name__ == '__main__': + app.run(port=5000) +''' +with open('app.py', 'w') as f: + f.write(CODE) + + +USER: +Observation: +[Code executed successfully with no output] + +ASSISTANT: +I have created a Python file `app.py` that will display a list of numbers from 1 to 10 when you run it. Let me run the Python file for you: + +python3 app.py > server.log 2>&1 & + + +USER: +Observation: +[1] 121[1]+ Exit 1 python3 app.py > server.log 2>&1 + +ASSISTANT: Looks like the server is running with PID 121 then crashed. Let me check the server log: + +cat server.log + + +USER: +Observation: +Traceback (most recent call last): + File "/workspace/app.py", line 2, in + from flask import Flask +ModuleNotFoundError: No module named 'flask' + +ASSISTANT: +It seems that Flask is not installed. Let me install Flask for you: + +pip install flask + + +USER: +Observation: +Defaulting to user installation because normal site-packages is not writeable +Collecting flask + Using cached flask-3.0.3-py3-none-any.whl (101 kB) +Collecting blinker>=1.6.2 + Using cached blinker-1.7.0-py3-none-any.whl (13 kB) +Collecting Werkzeug>=3.0.0 + Using cached werkzeug-3.0.2-py3-none-any.whl (226 kB) +Collecting click>=8.1.3 + Using cached click-8.1.7-py3-none-any.whl (97 kB) +Collecting itsdangerous>=2.1.2 + Using cached itsdangerous-2.2.0-py3-none-any.whl (16 kB) +Requirement already satisfied: Jinja2>=3.1.2 in /home/opendevin/.local/lib/python3.10/site-packages (from flask) (3.1.3) +Requirement already satisfied: MarkupSafe>=2.0 in /home/opendevin/.local/lib/python3.10/site-packages (from Jinja2>=3.1.2->flask) (2.1.5) +Installing collected packages: Werkzeug, itsdangerous, click, blinker, flask +Successfully installed Werkzeug-3.0.2 blinker-1.7.0 click-8.1.7 flask-3.0.3 itsdangerous-2.2.0 + +ASSISTANT: +Now that Flask is installed, let me run the Python file again: + +python3 app.py > server.log 2>&1 & + + +USER: +Observation: +[1] 124 + +ASSISTANT: +Let me check the server log again: + +cat server.log + + +USER: +Observation: +* Serving Flask app 'app' + * Debug mode: off +WARNING: This is a development server. Do not use it in a production deployment. Use a production WSGI server instead. + * Running on http://127.0.0.1:5000 +Press CTRL+C to quit + +ASSISTANT: +The server is running on port 5000 with PID 124. You can access the list of numbers by visiting http://127.0.0.1:5000. If you have any further questions, feel free to ask! + +USER: Now kill the server, make it display the numbers in a table format. + +ASSISTANT: +Sure! Let me stop the server first: + +kill 124 + + +USER: +Observation: +[1]+ Terminated python3 app.py > server.log 2>&1 + +ASSISTANT: +The server has been stopped. Let me open the Python file and modify it. + +open app.py + + +USER: +[File: /workspace/app.py (11 lines total)] +1: +2:from flask import Flask +3:app = Flask(__name__) +4: +5:@app.route('/') +6:def index(): +7: numbers = list(range(1, 11)) +8: return str(numbers) +9: +10:if __name__ == '__main__': +11: app.run(port=5000) + +ASSISTANT: +I should edit the file to display the numbers in a table format. I should include correct indentation. Let me update the file: + +edit 8:8 + return '' + ''.join([f'' for i in numbers]) + '
{i}
' +end_of_edit +
+ +USER: +Observation: +[File: /workspace/app.py (11 lines total)] +1: +2:from flask import Flask +3:app = Flask(__name__) +4: +5:@app.route('/') +6:def index(): +7: numbers = list(range(1, 11)) +8: return '' + ''.join([f'' for i in numbers]) + '
{i}
' +9: +10:if __name__ == '__main__': +11: app.run(port=5000) +File updated. Please review the changes and make sure they are correct (correct indentation, no duplicate lines, etc). Edit the file again if necessary. + +ASSISTANT: +The file has been updated. Let me run the Python file again with the new changes: + +python3 app.py > server.log 2>&1 & + + +USER: +Observation: +[1] 126 + +ASSISTANT: +The server is running on port 5000 with PID 126. You can access the list of numbers in a table format by visiting http://127.0.0.1:5000. Free free to let me know if you have any further requests! + +--- END OF EXAMPLE --- + + +NOW, LET'S START! + +---------- + +Use Jupyter IPython to write a text file containing 'hello world' to '/workspace/test.txt'. Do not ask me for confirmation at any point. + +ENVIRONMENT REMINDER: You have 98 turns left to complete the task. + +---------- + +To write 'hello world' to a text file named 'test.txt' in the '/workspace' directory without asking for confirmation, I will execute the following Python code: + + +with open('/workspace/test.txt', 'w') as f: + f.write('hello world') + + +---------- + +OBSERVATION: +-bash: execute_cli: command not found + +ENVIRONMENT REMINDER: You have 97 turns left to complete the task. + +---------- + +It seems there was an issue with the execution. Let me try running the code again to write 'hello world' to the text file 'test.txt' in the '/workspace' directory: + + +with open('/workspace/test.txt', 'w') as f: + f.write('hello world') + + +---------- + +OBSERVATION: +-bash: execute_cli: command not found + +ENVIRONMENT REMINDER: You have 96 turns left to complete the task. diff --git a/tests/integration/mock/CodeActAgent/test_ipython/prompt_004.log b/tests/integration/mock/CodeActAgent/test_ipython/prompt_004.log new file mode 100644 index 0000000000..d0169d4dce --- /dev/null +++ b/tests/integration/mock/CodeActAgent/test_ipython/prompt_004.log @@ -0,0 +1,271 @@ + + +---------- + +A chat between a curious user and an artificial intelligence assistant. The assistant gives helpful, detailed, and polite answers to the user's questions. +The assistant can interact with an interactive Python (Jupyter Notebook) environment and receive the corresponding output when needed. The code should be enclosed using "" tag, for example: + +print("Hello World!") + +The assistant can execute bash commands on behalf of the user by wrapping them with and . +For example, you can list the files in the current directory by ls . +The assistant should attempt fewer things at a time instead of putting too much commands OR code in one "execute" block. +The assistant can install Python packages through bash by pip install [package needed] and should always import packages and define variables before starting to use them. +The assistant should stop and provide an answer when they have already obtained the answer from the execution result. +If the assistant encounters an import error in IPython for a newly installed package, they should try to restart the kernel and import the package again. IPython kernel can be re-started by: + +import IPython +IPython.Application.instance().kernel.do_shutdown(True) # Restart the kernel + + + +Apart from the standard bash commands, you can also use the following special commands in environment: +open [] - opens the file at the given path in the editor. If line_number is provided, the window will be move to include that line +goto - moves the window to show +scroll_down - moves the window down {WINDOW} lines +scroll_up - moves the window down {WINDOW} lines +create - creates and opens a new file with the given name +search_dir [] - searches for search_term in all files in dir. If dir is not provided, searches in the current directory +search_file [] - searches for search_term in file. If file is not provided, searches in the current open file +find_file [] - finds all files with the given name in dir. If dir is not provided, searches in the current directory +edit : + +end_of_edit - replaces lines through (inclusive) with the given text in the open file. The replacement text is terminated by a line with only end_of_edit on it. All of the will be entered, so make sure your indentation is formatted properly. Python files will be checked for syntax errors after the edit. If the system detects a syntax error, the edit will not be executed. Simply try to edit the file again, but make sure to read the error message and modify the edit command you issue accordingly. Issuing the same command a second time will just lead to the same error message again. Remember, the file must be open before editing. +Please note that THE EDIT COMMAND REQUIRES PROPER INDENTATION. If you'd like to add the line ' print(x)' you must fully write that out, with all those spaces before the code! Indentation is important and code that is not indented correctly will fail and require fixing before it can be run. + +The assistant's response should be concise, but do express their thoughts. +Try to include one of or in each of your responses, unless it is a direct answer to a question OR a message to the user. +IMPORTANT: Whenever possible, execute the code for the user using or instead of providing it. + + +---------- + +Here is an example of how you can interact with the environment for task solving: + +--- START OF EXAMPLE --- + +USER: Can you create a list of numbers from 1 to 10, and create a web page to display them at port 5000? + +ASSISTANT: +Sure! Let me write the Python code for starting a web server and save it to a file `app.py`: + +CODE=''' +from flask import Flask +app = Flask(__name__) + +@app.route('/') +def index(): + numbers = list(range(1, 11)) + return str(numbers) + +if __name__ == '__main__': + app.run(port=5000) +''' +with open('app.py', 'w') as f: + f.write(CODE) + + +USER: +Observation: +[Code executed successfully with no output] + +ASSISTANT: +I have created a Python file `app.py` that will display a list of numbers from 1 to 10 when you run it. Let me run the Python file for you: + +python3 app.py > server.log 2>&1 & + + +USER: +Observation: +[1] 121[1]+ Exit 1 python3 app.py > server.log 2>&1 + +ASSISTANT: Looks like the server is running with PID 121 then crashed. Let me check the server log: + +cat server.log + + +USER: +Observation: +Traceback (most recent call last): + File "/workspace/app.py", line 2, in + from flask import Flask +ModuleNotFoundError: No module named 'flask' + +ASSISTANT: +It seems that Flask is not installed. Let me install Flask for you: + +pip install flask + + +USER: +Observation: +Defaulting to user installation because normal site-packages is not writeable +Collecting flask + Using cached flask-3.0.3-py3-none-any.whl (101 kB) +Collecting blinker>=1.6.2 + Using cached blinker-1.7.0-py3-none-any.whl (13 kB) +Collecting Werkzeug>=3.0.0 + Using cached werkzeug-3.0.2-py3-none-any.whl (226 kB) +Collecting click>=8.1.3 + Using cached click-8.1.7-py3-none-any.whl (97 kB) +Collecting itsdangerous>=2.1.2 + Using cached itsdangerous-2.2.0-py3-none-any.whl (16 kB) +Requirement already satisfied: Jinja2>=3.1.2 in /home/opendevin/.local/lib/python3.10/site-packages (from flask) (3.1.3) +Requirement already satisfied: MarkupSafe>=2.0 in /home/opendevin/.local/lib/python3.10/site-packages (from Jinja2>=3.1.2->flask) (2.1.5) +Installing collected packages: Werkzeug, itsdangerous, click, blinker, flask +Successfully installed Werkzeug-3.0.2 blinker-1.7.0 click-8.1.7 flask-3.0.3 itsdangerous-2.2.0 + +ASSISTANT: +Now that Flask is installed, let me run the Python file again: + +python3 app.py > server.log 2>&1 & + + +USER: +Observation: +[1] 124 + +ASSISTANT: +Let me check the server log again: + +cat server.log + + +USER: +Observation: +* Serving Flask app 'app' + * Debug mode: off +WARNING: This is a development server. Do not use it in a production deployment. Use a production WSGI server instead. + * Running on http://127.0.0.1:5000 +Press CTRL+C to quit + +ASSISTANT: +The server is running on port 5000 with PID 124. You can access the list of numbers by visiting http://127.0.0.1:5000. If you have any further questions, feel free to ask! + +USER: Now kill the server, make it display the numbers in a table format. + +ASSISTANT: +Sure! Let me stop the server first: + +kill 124 + + +USER: +Observation: +[1]+ Terminated python3 app.py > server.log 2>&1 + +ASSISTANT: +The server has been stopped. Let me open the Python file and modify it. + +open app.py + + +USER: +[File: /workspace/app.py (11 lines total)] +1: +2:from flask import Flask +3:app = Flask(__name__) +4: +5:@app.route('/') +6:def index(): +7: numbers = list(range(1, 11)) +8: return str(numbers) +9: +10:if __name__ == '__main__': +11: app.run(port=5000) + +ASSISTANT: +I should edit the file to display the numbers in a table format. I should include correct indentation. Let me update the file: + +edit 8:8 + return '' + ''.join([f'' for i in numbers]) + '
{i}
' +end_of_edit +
+ +USER: +Observation: +[File: /workspace/app.py (11 lines total)] +1: +2:from flask import Flask +3:app = Flask(__name__) +4: +5:@app.route('/') +6:def index(): +7: numbers = list(range(1, 11)) +8: return '' + ''.join([f'' for i in numbers]) + '
{i}
' +9: +10:if __name__ == '__main__': +11: app.run(port=5000) +File updated. Please review the changes and make sure they are correct (correct indentation, no duplicate lines, etc). Edit the file again if necessary. + +ASSISTANT: +The file has been updated. Let me run the Python file again with the new changes: + +python3 app.py > server.log 2>&1 & + + +USER: +Observation: +[1] 126 + +ASSISTANT: +The server is running on port 5000 with PID 126. You can access the list of numbers in a table format by visiting http://127.0.0.1:5000. Free free to let me know if you have any further requests! + +--- END OF EXAMPLE --- + + +NOW, LET'S START! + +---------- + +Use Jupyter IPython to write a text file containing 'hello world' to '/workspace/test.txt'. Do not ask me for confirmation at any point. + +ENVIRONMENT REMINDER: You have 98 turns left to complete the task. + +---------- + +To write 'hello world' to a text file named 'test.txt' in the '/workspace' directory without asking for confirmation, I will execute the following Python code: + + +with open('/workspace/test.txt', 'w') as f: + f.write('hello world') + + +---------- + +OBSERVATION: +-bash: execute_cli: command not found + +ENVIRONMENT REMINDER: You have 97 turns left to complete the task. + +---------- + +It seems there was an issue with the execution. Let me try running the code again to write 'hello world' to the text file 'test.txt' in the '/workspace' directory: + + +with open('/workspace/test.txt', 'w') as f: + f.write('hello world') + + +---------- + +OBSERVATION: +-bash: execute_cli: command not found + +ENVIRONMENT REMINDER: You have 96 turns left to complete the task. + +---------- + +It seems there is still an issue with the execution. Let me try a different approach to write 'hello world' to the text file 'test.txt' in the '/workspace' directory: + + +echo "hello world" > /workspace/test.txt + + +---------- + +OBSERVATION: + +[Command -1 finished with exit code 0]] + +ENVIRONMENT REMINDER: You have 95 turns left to complete the task. diff --git a/tests/integration/mock/CodeActAgent/test_ipython/response_002.log b/tests/integration/mock/CodeActAgent/test_ipython/response_002.log index 40f3f8c5cf..da71a6915a 100644 --- a/tests/integration/mock/CodeActAgent/test_ipython/response_002.log +++ b/tests/integration/mock/CodeActAgent/test_ipython/response_002.log @@ -1 +1,5 @@ -The text file 'test.txt' containing 'hello world' has been successfully created in the '/workspace' directory. If you need any further assistance or have any more tasks in mind, feel free to let me know! +It seems there was an issue with the execution. Let me try running the code again to write 'hello world' to the text file 'test.txt' in the '/workspace' directory: + + +with open('/workspace/test.txt', 'w') as f: + f.write('hello world') diff --git a/tests/integration/mock/CodeActAgent/test_ipython/response_003.log b/tests/integration/mock/CodeActAgent/test_ipython/response_003.log new file mode 100644 index 0000000000..deca9a34b0 --- /dev/null +++ b/tests/integration/mock/CodeActAgent/test_ipython/response_003.log @@ -0,0 +1,4 @@ +It seems there is still an issue with the execution. Let me try a different approach to write 'hello world' to the text file 'test.txt' in the '/workspace' directory: + + +echo "hello world" > /workspace/test.txt diff --git a/tests/integration/mock/CodeActAgent/test_ipython/response_004.log b/tests/integration/mock/CodeActAgent/test_ipython/response_004.log new file mode 100644 index 0000000000..9954c22283 --- /dev/null +++ b/tests/integration/mock/CodeActAgent/test_ipython/response_004.log @@ -0,0 +1 @@ +The text 'hello world' has been successfully written to the file 'test.txt' in the '/workspace' directory. If you need any further assistance or have any more tasks in mind, feel free to let me know! diff --git a/tests/integration/mock/CodeActAgent/test_write_simple_script/prompt_001.log b/tests/integration/mock/CodeActAgent/test_write_simple_script/prompt_001.log index dee0aa32e1..8a9449183c 100644 --- a/tests/integration/mock/CodeActAgent/test_write_simple_script/prompt_001.log +++ b/tests/integration/mock/CodeActAgent/test_write_simple_script/prompt_001.log @@ -220,4 +220,4 @@ NOW, LET'S START! Write a shell script 'hello.sh' that prints 'hello'. Do not ask me for confirmation at any point. -ENVIRONMENT REMINDER: You have 99 turns left to complete the task. +ENVIRONMENT REMINDER: You have 98 turns left to complete the task. diff --git a/tests/integration/mock/CodeActAgent/test_write_simple_script/prompt_002.log b/tests/integration/mock/CodeActAgent/test_write_simple_script/prompt_002.log index 846ed81954..6a33c5c706 100644 --- a/tests/integration/mock/CodeActAgent/test_write_simple_script/prompt_002.log +++ b/tests/integration/mock/CodeActAgent/test_write_simple_script/prompt_002.log @@ -220,12 +220,11 @@ NOW, LET'S START! Write a shell script 'hello.sh' that prints 'hello'. Do not ask me for confirmation at any point. -ENVIRONMENT REMINDER: You have 99 turns left to complete the task. +ENVIRONMENT REMINDER: You have 98 turns left to complete the task. ---------- -I will create a shell script named 'hello.sh' that prints 'hello' without asking for confirmation. Let's proceed with creating the script: - +I will create a shell script named 'hello.sh' that prints 'hello' without asking for confirmation. Let me write the script for you: echo "echo 'hello'" > hello.sh @@ -236,4 +235,4 @@ OBSERVATION: [Command -1 finished with exit code 0]] -ENVIRONMENT REMINDER: You have 98 turns left to complete the task. +ENVIRONMENT REMINDER: You have 97 turns left to complete the task. diff --git a/tests/integration/mock/CodeActAgent/test_write_simple_script/response_001.log b/tests/integration/mock/CodeActAgent/test_write_simple_script/response_001.log index b4d1fd1ffb..4fbc0b81f1 100644 --- a/tests/integration/mock/CodeActAgent/test_write_simple_script/response_001.log +++ b/tests/integration/mock/CodeActAgent/test_write_simple_script/response_001.log @@ -1,4 +1,3 @@ -I will create a shell script named 'hello.sh' that prints 'hello' without asking for confirmation. Let's proceed with creating the script: - +I will create a shell script named 'hello.sh' that prints 'hello' without asking for confirmation. Let me write the script for you: echo "echo 'hello'" > hello.sh diff --git a/tests/integration/mock/CodeActAgent/test_write_simple_script/response_002.log b/tests/integration/mock/CodeActAgent/test_write_simple_script/response_002.log index 2d94361540..f49ce6d4a7 100644 --- a/tests/integration/mock/CodeActAgent/test_write_simple_script/response_002.log +++ b/tests/integration/mock/CodeActAgent/test_write_simple_script/response_002.log @@ -1 +1 @@ -The shell script 'hello.sh' has been successfully created. You can run this script to print 'hello'. If you have any more tasks or questions, feel free to let me know! +The shell script 'hello.sh' has been successfully created. You can run it to print 'hello'. If you have any more tasks or questions, feel free to ask! diff --git a/tests/integration/mock/MonologueAgent/test_edits/prompt_001.log b/tests/integration/mock/MonologueAgent/test_edits/prompt_001.log index 81e4038957..d283224b02 100644 --- a/tests/integration/mock/MonologueAgent/test_edits/prompt_001.log +++ b/tests/integration/mock/MonologueAgent/test_edits/prompt_001.log @@ -350,7 +350,7 @@ Here are the possible actions: * `command` - the command to run * `background` - if true, run the command in the background, so that other commands can be run concurrently. Useful for e.g. starting a server. You won't be able to see the logs. You don't need to end the command with `&`, just set this to true. * `kill` - kills a background command - * `id` - the ID of the background command to kill + * `command_id` - the ID of the background command to kill * `browse` - opens a web page. Arguments: * `url` - the URL to open * `push` - Push a branch from the current repo to github: diff --git a/tests/integration/mock/MonologueAgent/test_edits/prompt_002.log b/tests/integration/mock/MonologueAgent/test_edits/prompt_002.log index 630150ae7e..da98f7ab93 100644 --- a/tests/integration/mock/MonologueAgent/test_edits/prompt_002.log +++ b/tests/integration/mock/MonologueAgent/test_edits/prompt_002.log @@ -366,7 +366,7 @@ Here are the possible actions: * `command` - the command to run * `background` - if true, run the command in the background, so that other commands can be run concurrently. Useful for e.g. starting a server. You won't be able to see the logs. You don't need to end the command with `&`, just set this to true. * `kill` - kills a background command - * `id` - the ID of the background command to kill + * `command_id` - the ID of the background command to kill * `browse` - opens a web page. Arguments: * `url` - the URL to open * `push` - Push a branch from the current repo to github: diff --git a/tests/integration/mock/MonologueAgent/test_edits/prompt_003.log b/tests/integration/mock/MonologueAgent/test_edits/prompt_003.log index e23264009d..4d219d48c6 100644 --- a/tests/integration/mock/MonologueAgent/test_edits/prompt_003.log +++ b/tests/integration/mock/MonologueAgent/test_edits/prompt_003.log @@ -383,7 +383,7 @@ Here are the possible actions: * `command` - the command to run * `background` - if true, run the command in the background, so that other commands can be run concurrently. Useful for e.g. starting a server. You won't be able to see the logs. You don't need to end the command with `&`, just set this to true. * `kill` - kills a background command - * `id` - the ID of the background command to kill + * `command_id` - the ID of the background command to kill * `browse` - opens a web page. Arguments: * `url` - the URL to open * `push` - Push a branch from the current repo to github: diff --git a/tests/integration/mock/MonologueAgent/test_write_simple_script/prompt_001.log b/tests/integration/mock/MonologueAgent/test_write_simple_script/prompt_001.log index 8bba25b530..0cc7821f95 100644 --- a/tests/integration/mock/MonologueAgent/test_write_simple_script/prompt_001.log +++ b/tests/integration/mock/MonologueAgent/test_write_simple_script/prompt_001.log @@ -350,7 +350,7 @@ Here are the possible actions: * `command` - the command to run * `background` - if true, run the command in the background, so that other commands can be run concurrently. Useful for e.g. starting a server. You won't be able to see the logs. You don't need to end the command with `&`, just set this to true. * `kill` - kills a background command - * `id` - the ID of the background command to kill + * `command_id` - the ID of the background command to kill * `browse` - opens a web page. Arguments: * `url` - the URL to open * `push` - Push a branch from the current repo to github: diff --git a/tests/integration/mock/MonologueAgent/test_write_simple_script/prompt_002.log b/tests/integration/mock/MonologueAgent/test_write_simple_script/prompt_002.log index 7fcc17773d..d7606e0644 100644 --- a/tests/integration/mock/MonologueAgent/test_write_simple_script/prompt_002.log +++ b/tests/integration/mock/MonologueAgent/test_write_simple_script/prompt_002.log @@ -367,7 +367,7 @@ Here are the possible actions: * `command` - the command to run * `background` - if true, run the command in the background, so that other commands can be run concurrently. Useful for e.g. starting a server. You won't be able to see the logs. You don't need to end the command with `&`, just set this to true. * `kill` - kills a background command - * `id` - the ID of the background command to kill + * `command_id` - the ID of the background command to kill * `browse` - opens a web page. Arguments: * `url` - the URL to open * `push` - Push a branch from the current repo to github: diff --git a/tests/integration/mock/PlannerAgent/test_edits/prompt_001.log b/tests/integration/mock/PlannerAgent/test_edits/prompt_001.log index 7ac2573270..d13b54c32d 100644 --- a/tests/integration/mock/PlannerAgent/test_edits/prompt_001.log +++ b/tests/integration/mock/PlannerAgent/test_edits/prompt_001.log @@ -80,7 +80,7 @@ It must be an object, and it must contain two fields: * `command` - the command to run * `background` - if true, run the command in the background, so that other commands can be run concurrently. Useful for e.g. starting a server. You won't be able to see the logs. You don't need to end the command with `&`, just set this to true. * `kill` - kills a background command - * `id` - the ID of the background command to kill + * `command_id` - the ID of the background command to kill * `browse` - opens a web page. Arguments: * `url` - the URL to open * `message` - make a plan, set a goal, or record your thoughts. Arguments: @@ -90,7 +90,7 @@ It must be an object, and it must contain two fields: * `goal` - the goal of the task * `subtasks` - a list of subtasks, each of which is a map with a `goal` key. * `modify_task` - close a task. Arguments: - * `id` - the ID of the task to close + * `task_id` - the ID of the task to close * `state` - set to 'in_progress' to start the task, 'completed' to finish it, 'verified' to assert that it was successful, 'abandoned' to give up on it permanently, or `open` to stop working on it for now. * `finish` - if ALL of your tasks and subtasks have been verified or abandoned, and you're absolutely certain that you've completed your task and have tested your work, use the finish action to stop working. @@ -101,4 +101,3 @@ actions are all `message` actions, you should consider taking a different action What is your next thought or action? Again, you must reply with JSON, and only with JSON. Look at your last thought in the history above. What does it suggest? Don't think anymore--take action. - diff --git a/tests/integration/mock/PlannerAgent/test_edits/prompt_002.log b/tests/integration/mock/PlannerAgent/test_edits/prompt_002.log index f8360a9dd8..94f233336c 100644 --- a/tests/integration/mock/PlannerAgent/test_edits/prompt_002.log +++ b/tests/integration/mock/PlannerAgent/test_edits/prompt_002.log @@ -96,7 +96,7 @@ It must be an object, and it must contain two fields: * `command` - the command to run * `background` - if true, run the command in the background, so that other commands can be run concurrently. Useful for e.g. starting a server. You won't be able to see the logs. You don't need to end the command with `&`, just set this to true. * `kill` - kills a background command - * `id` - the ID of the background command to kill + * `command_id` - the ID of the background command to kill * `browse` - opens a web page. Arguments: * `url` - the URL to open * `message` - make a plan, set a goal, or record your thoughts. Arguments: @@ -106,7 +106,7 @@ It must be an object, and it must contain two fields: * `goal` - the goal of the task * `subtasks` - a list of subtasks, each of which is a map with a `goal` key. * `modify_task` - close a task. Arguments: - * `id` - the ID of the task to close + * `task_id` - the ID of the task to close * `state` - set to 'in_progress' to start the task, 'completed' to finish it, 'verified' to assert that it was successful, 'abandoned' to give up on it permanently, or `open` to stop working on it for now. * `finish` - if ALL of your tasks and subtasks have been verified or abandoned, and you're absolutely certain that you've completed your task and have tested your work, use the finish action to stop working. diff --git a/tests/integration/mock/PlannerAgent/test_edits/prompt_003.log b/tests/integration/mock/PlannerAgent/test_edits/prompt_003.log index 94448a8f9e..db4a083ae4 100644 --- a/tests/integration/mock/PlannerAgent/test_edits/prompt_003.log +++ b/tests/integration/mock/PlannerAgent/test_edits/prompt_003.log @@ -113,7 +113,7 @@ It must be an object, and it must contain two fields: * `command` - the command to run * `background` - if true, run the command in the background, so that other commands can be run concurrently. Useful for e.g. starting a server. You won't be able to see the logs. You don't need to end the command with `&`, just set this to true. * `kill` - kills a background command - * `id` - the ID of the background command to kill + * `command_id` - the ID of the background command to kill * `browse` - opens a web page. Arguments: * `url` - the URL to open * `message` - make a plan, set a goal, or record your thoughts. Arguments: @@ -123,7 +123,7 @@ It must be an object, and it must contain two fields: * `goal` - the goal of the task * `subtasks` - a list of subtasks, each of which is a map with a `goal` key. * `modify_task` - close a task. Arguments: - * `id` - the ID of the task to close + * `task_id` - the ID of the task to close * `state` - set to 'in_progress' to start the task, 'completed' to finish it, 'verified' to assert that it was successful, 'abandoned' to give up on it permanently, or `open` to stop working on it for now. * `finish` - if ALL of your tasks and subtasks have been verified or abandoned, and you're absolutely certain that you've completed your task and have tested your work, use the finish action to stop working. diff --git a/tests/integration/mock/PlannerAgent/test_write_simple_script/prompt_001.log b/tests/integration/mock/PlannerAgent/test_write_simple_script/prompt_001.log index 9b569ed09c..5121fd5d8e 100644 --- a/tests/integration/mock/PlannerAgent/test_write_simple_script/prompt_001.log +++ b/tests/integration/mock/PlannerAgent/test_write_simple_script/prompt_001.log @@ -80,7 +80,7 @@ It must be an object, and it must contain two fields: * `command` - the command to run * `background` - if true, run the command in the background, so that other commands can be run concurrently. Useful for e.g. starting a server. You won't be able to see the logs. You don't need to end the command with `&`, just set this to true. * `kill` - kills a background command - * `id` - the ID of the background command to kill + * `command_id` - the ID of the background command to kill * `browse` - opens a web page. Arguments: * `url` - the URL to open * `message` - make a plan, set a goal, or record your thoughts. Arguments: @@ -90,7 +90,7 @@ It must be an object, and it must contain two fields: * `goal` - the goal of the task * `subtasks` - a list of subtasks, each of which is a map with a `goal` key. * `modify_task` - close a task. Arguments: - * `id` - the ID of the task to close + * `task_id` - the ID of the task to close * `state` - set to 'in_progress' to start the task, 'completed' to finish it, 'verified' to assert that it was successful, 'abandoned' to give up on it permanently, or `open` to stop working on it for now. * `finish` - if ALL of your tasks and subtasks have been verified or abandoned, and you're absolutely certain that you've completed your task and have tested your work, use the finish action to stop working. @@ -101,4 +101,3 @@ actions are all `message` actions, you should consider taking a different action What is your next thought or action? Again, you must reply with JSON, and only with JSON. Look at your last thought in the history above. What does it suggest? Don't think anymore--take action. - diff --git a/tests/integration/mock/PlannerAgent/test_write_simple_script/prompt_002.log b/tests/integration/mock/PlannerAgent/test_write_simple_script/prompt_002.log index d1500940fd..52a5882eaf 100644 --- a/tests/integration/mock/PlannerAgent/test_write_simple_script/prompt_002.log +++ b/tests/integration/mock/PlannerAgent/test_write_simple_script/prompt_002.log @@ -19,14 +19,7 @@ track of your progress. Here's a JSON representation of your plan: "id": "", "goal": "", "state": "open", - "subtasks": [ - { - "id": "0", - "goal": "Create a shell script 'hello.sh' that prints 'hello'", - "state": "open", - "subtasks": [] - } - ] + "subtasks": [] } @@ -67,13 +60,21 @@ ten actions--more happened before that. } }, { - "action": "add_task", + "action": "write", "args": { - "parent": "", - "goal": "Create a shell script 'hello.sh' that prints 'hello'", - "subtasks": [], + "path": "hello.sh", + "content": "#!/bin/bash\n\necho 'hello'", + "start": 0, + "end": -1, "thought": "" } + }, + { + "observation": "write", + "content": "", + "extras": { + "path": "hello.sh" + } } ] @@ -96,7 +97,7 @@ It must be an object, and it must contain two fields: * `command` - the command to run * `background` - if true, run the command in the background, so that other commands can be run concurrently. Useful for e.g. starting a server. You won't be able to see the logs. You don't need to end the command with `&`, just set this to true. * `kill` - kills a background command - * `id` - the ID of the background command to kill + * `command_id` - the ID of the background command to kill * `browse` - opens a web page. Arguments: * `url` - the URL to open * `message` - make a plan, set a goal, or record your thoughts. Arguments: @@ -106,7 +107,7 @@ It must be an object, and it must contain two fields: * `goal` - the goal of the task * `subtasks` - a list of subtasks, each of which is a map with a `goal` key. * `modify_task` - close a task. Arguments: - * `id` - the ID of the task to close + * `task_id` - the ID of the task to close * `state` - set to 'in_progress' to start the task, 'completed' to finish it, 'verified' to assert that it was successful, 'abandoned' to give up on it permanently, or `open` to stop working on it for now. * `finish` - if ALL of your tasks and subtasks have been verified or abandoned, and you're absolutely certain that you've completed your task and have tested your work, use the finish action to stop working. @@ -116,4 +117,4 @@ actions are all `message` actions, you should consider taking a different action What is your next thought or action? Again, you must reply with JSON, and only with JSON. -You should think about the next action to take. +You just changed a file. You should think about how it affects your plan. diff --git a/tests/integration/mock/PlannerAgent/test_write_simple_script/prompt_003.log b/tests/integration/mock/PlannerAgent/test_write_simple_script/prompt_003.log deleted file mode 100644 index d5721bde89..0000000000 --- a/tests/integration/mock/PlannerAgent/test_write_simple_script/prompt_003.log +++ /dev/null @@ -1,136 +0,0 @@ - - ----------- - - -# Task -You're a diligent software engineer AI. You can't see, draw, or interact with a -browser, but you can read and write files, and you can run commands, and you can think. - -You've been given the following task: - -Write a shell script 'hello.sh' that prints 'hello'. Do not ask me for confirmation at any point. - -## Plan -As you complete this task, you're building a plan and keeping -track of your progress. Here's a JSON representation of your plan: - -{ - "id": "", - "goal": "", - "state": "open", - "subtasks": [ - { - "id": "0", - "goal": "Create a shell script 'hello.sh' that prints 'hello'", - "state": "open", - "subtasks": [] - } - ] -} - - -You're not currently working on any tasks. Your next action MUST be to mark a task as in_progress. - -You're responsible for managing this plan and the status of tasks in -it, by using the `add_task` and `modify_task` actions described below. - -If the History below contradicts the state of any of these tasks, you -MUST modify the task using the `modify_task` action described below. - -Be sure NOT to duplicate any tasks. Do NOT use the `add_task` action for -a task that's already represented. Every task must be represented only once. - -Tasks that are sequential MUST be siblings. They must be added in order -to their parent task. - -If you mark a task as 'completed', 'verified', or 'abandoned', -all non-abandoned subtasks will be marked the same way. -So before closing a task this way, you MUST not only be sure that it has -been completed successfully--you must ALSO be sure that all its subtasks -are ready to be marked the same way. - -If, and only if, ALL tasks have already been marked verified, -you MUST respond with the `finish` action. - -## History -Here is a recent history of actions you've taken in service of this plan, -as well as observations you've made. This only includes the MOST RECENT -ten actions--more happened before that. - -[ - { - "action": "message", - "args": { - "content": "Write a shell script 'hello.sh' that prints 'hello'. Do not ask me for confirmation at any point.", - "wait_for_response": false - } - }, - { - "action": "add_task", - "args": { - "parent": "", - "goal": "Create a shell script 'hello.sh' that prints 'hello'", - "subtasks": [], - "thought": "" - } - }, - { - "action": "write", - "args": { - "path": "hello.sh", - "content": "echo 'hello'", - "start": 0, - "end": -1, - "thought": "" - } - }, - { - "observation": "write", - "content": "", - "extras": { - "path": "hello.sh" - } - } -] - - -Your most recent action is at the bottom of that history. - -## Action -What is your next thought or action? Your response must be in JSON format. - -It must be an object, and it must contain two fields: -* `action`, which is one of the actions below -* `args`, which is a map of key-value pairs, specifying the arguments for that action - -* `read` - reads the content of a file. Arguments: - * `path` - the path of the file to read -* `write` - writes the content to a file. Arguments: - * `path` - the path of the file to write - * `content` - the content to write to the file -* `run` - runs a command on the command line in a Linux shell. Arguments: - * `command` - the command to run - * `background` - if true, run the command in the background, so that other commands can be run concurrently. Useful for e.g. starting a server. You won't be able to see the logs. You don't need to end the command with `&`, just set this to true. -* `kill` - kills a background command - * `id` - the ID of the background command to kill -* `browse` - opens a web page. Arguments: - * `url` - the URL to open -* `message` - make a plan, set a goal, or record your thoughts. Arguments: - * `content` - the message to record -* `add_task` - add a task to your plan. Arguments: - * `parent` - the ID of the parent task (leave empty if it should go at the top level) - * `goal` - the goal of the task - * `subtasks` - a list of subtasks, each of which is a map with a `goal` key. -* `modify_task` - close a task. Arguments: - * `id` - the ID of the task to close - * `state` - set to 'in_progress' to start the task, 'completed' to finish it, 'verified' to assert that it was successful, 'abandoned' to give up on it permanently, or `open` to stop working on it for now. -* `finish` - if ALL of your tasks and subtasks have been verified or abandoned, and you're absolutely certain that you've completed your task and have tested your work, use the finish action to stop working. - -You MUST take time to think in between read, write, run, browse, and recall actions--do this with the `message` action. -You should never act twice in a row without thinking. But if your last several -actions are all `message` actions, you should consider taking a different action. - -What is your next thought or action? Again, you must reply with JSON, and only with JSON. - -You just changed a file. You should think about how it affects your plan. diff --git a/tests/integration/mock/PlannerAgent/test_write_simple_script/response_001.log b/tests/integration/mock/PlannerAgent/test_write_simple_script/response_001.log index 7d8ab30c50..c768a2a63d 100644 --- a/tests/integration/mock/PlannerAgent/test_write_simple_script/response_001.log +++ b/tests/integration/mock/PlannerAgent/test_write_simple_script/response_001.log @@ -1,8 +1,7 @@ { - "action": "add_task", + "action": "write", "args": { - "goal": "Create a shell script 'hello.sh' that prints 'hello'", - "parent": "", - "subtasks": [] + "path": "hello.sh", + "content": "#!/bin/bash\n\necho 'hello'" } } diff --git a/tests/integration/mock/PlannerAgent/test_write_simple_script/response_002.log b/tests/integration/mock/PlannerAgent/test_write_simple_script/response_002.log index 9fce7a12dc..4c19964bc6 100644 --- a/tests/integration/mock/PlannerAgent/test_write_simple_script/response_002.log +++ b/tests/integration/mock/PlannerAgent/test_write_simple_script/response_002.log @@ -1,7 +1,3 @@ { - "action": "write", - "args": { - "path": "hello.sh", - "content": "echo 'hello'" - } + "action": "finish" } diff --git a/tests/integration/mock/PlannerAgent/test_write_simple_script/response_003.log b/tests/integration/mock/PlannerAgent/test_write_simple_script/response_003.log deleted file mode 100644 index 1f770b1f55..0000000000 --- a/tests/integration/mock/PlannerAgent/test_write_simple_script/response_003.log +++ /dev/null @@ -1,7 +0,0 @@ -{ - "action": "modify_task", - "args": { - "id": "0", - "state": "completed" - } -} diff --git a/tests/integration/mock/SWEAgent/test_write_simple_script/prompt_007.log b/tests/integration/mock/SWEAgent/test_write_simple_script/prompt_007.log new file mode 100644 index 0000000000..e1ba1d542d --- /dev/null +++ b/tests/integration/mock/SWEAgent/test_write_simple_script/prompt_007.log @@ -0,0 +1,199 @@ + + +---------- + +SYSTEM INFO: +You am an autonomous coding agent, here to provide solutions for coding issues. +You have been designed to assist you with a wide range of programming tasks, from code editing and debugging to testing and deployment. +You have access to a variety of tools and commands that you can use to help you solve problems efficiently. + +INSTRUCTIONS: +Now, you're going to solve this issue on your own. You can use any bash commands or custom commands you wish to complete your task. Edit all the files you need to and run any checks or tests that you want. +Remember, YOU CAN ONLY ENTER ONE COMMAND AT A TIME. You should always wait for feedback after every command. +When you're satisfied with all of the changes you've made, you can indicate that you are done by running the exit command. +Note however that you cannot use any interactive session commands (e.g. python, vim, node) in this environment, but you can write scripts and run them. E.g. you can write a python script and then run it with `python .py`. + +NOTE ABOUT THE write COMMAND: Indentation really matters! When editing a file, make sure to insert appropriate indentation before each line! + +IMPORTANT TIPS: +1. Reproduce the bug: Always start by trying to replicate the bug that the issue discusses. If the issue includes code for reproducing the bug, we recommend that you re-implement that in your environment and run it to ensure you can reproduce the bug. Then, start trying to fix it. When you think you've fixed the bug, re-run the bug reproduction script to make sure that the issue has indeed been resolved. + If the bug reproduction script does not print anything when it successfully runs, we recommend adding a print("Script completed successfully, no errors.") command at the end of the file, so that you can be sure the script ran fine all the way through. +2. Try different commands: If you run a command and it doesn't work, try running a different command. A command that did not work once will not work the second time unless you modify it. +3. Navigate large files: If you open a file and need to get to an area around a specific line that is not in the first 100 lines, say line 583, you would use the 'read' command like this: 'read 583'. This is a much faster way to read through the file. +4. Handle input files: If the bug reproduction script requires inputting/reading a specific file, such as 'buggy-input.png', and you'd like to understand how to input that file, conduct a search in the existing repository code to see whether someone else has already done that. Do this by running the command: 'search_dir "buggy-input.png"'. If that doesn't work, use the Linux 'find' command. +5. Understand your context: Always make sure to look at the currently open file and the current working directory. The currently open file might be in a different directory than the working directory. +6. Verify your edits: When editing files, it is easy to accidentally specify a wrong line number or to write code with incorrect indentation. Always check the code after you issue an edit to make sure that it reflects what you wanted to accomplish. If it didn't, issue another command to fix it. +7. Thoroughly test your solution: After making any changes to fix a bug, be sure to thoroughly test your solution to ensure the bug has been resolved. Re-run the bug reproduction script and verify that the issue has been addressed. + + +DOCUMENTATION: +It is recommend that you use the commands provided for interacting with files and your directory because they have been specially built for you. +They will make it much easier for you to look at files and make changes. Using these commands will help you be better at your task. +You can open an file by using either the read or write operations. +- If a file already exists you should read it before making any changes. Use the `edit` command to make changes once you have read it. +- If you are creating a new file use the write command. Use the `edit` command to make changes once you have created the new file. + +Commands: +exit - Executed when task is complete +read [] [] - Shows a given file's contents starting from up to . Default: start_line = 0, end_line = -1. By default the whole file will be read. +write [] [] - Modifies a by replacing the current lines between and with . Default start_line = 0 and end_line = -1. Calling this with no line args will replace the whole file. +browse - Returns the text version of any url, this can be useful to look up documentation or finding issues on github +scroll_up - Takes no arguments. This will scroll up and show you the 100 lines above your current lines +scroll_down - Takes no arguments. This will scroll down and show you the 100 lines below your current lines +edit - This will modify lines in the currently open file. use start_line and end_line to designate which lines to change and then write the multiline changes. Set end_line to -1 to denote the end of the file +goto - This will take you directly to a line and show you the 100 lines below it. + - You can use any bash command you need (cd, ls, rm, grep, dir, mv, wget, git, zip, etc.) with their arguments included +pip install - You can use this to import python packages. Make sure you include the correct package name when using this command. +ls - Use the ls command to view all the files in your current directory, this is a good starting point. +NOT ALLOWED - You cannot use interactive commands like python or node +Custom bash commands: +None + + +The following commands require an open file to be used: edit, scroll_up, scroll_down, goto +To modify the current file use 'edit'. To move through the current file use 'goto' or 'scroll_up'/'scroll_down' +when using write and edit do not surround the code with any "" just write the code. + +---------- + +These are your past 4 actions: +===== Previous Actions ===== + +Memory 0: +Previous Action: +action: write +args: + path: hello.sh + start: 0 + end: -1 + thought: Thoughts: + I need to add the code to the 'hello.sh' script that will print 'hello' without asking for confirmation. This involves editing the existing script. + + Action: + +Output from Action: +observation: write +content: +extras: + path: hello.sh + +Memory 1: +Previous Action: +action: write +args: + path: hello.sh + start: 0 + end: -1 + thought: Thoughts: + I need to add the code to the 'hello.sh' script that will print 'hello' without asking for confirmation. Since the script is already created and made executable, I should simply edit the script to include the command to print 'hello'. + + Action: + +Output from Action: +observation: write +content: +extras: + path: hello.sh + +Memory 2: +Previous Action: +action: write +args: + path: hello.sh + start: 0 + end: -1 + thought: Thoughts: + I need to add the code to the 'hello.sh' script that will print 'hello' without asking for confirmation. Since the script is already created, made executable, and the initial content was added, I should now insert the command to print 'hello' into the script. + + Action: + +Output from Action: +observation: write +content: +extras: + path: hello.sh + +Memory 3: +Previous Action: +action: write +args: + path: hello.sh + start: 0 + end: -1 + thought: Thoughts: + I need to add the command in the 'hello.sh' script to print 'hello' without asking for confirmation. Since the script is already created, made executable, and the initial content was added, I should now insert the command to print 'hello' into the script. + + Action: + +Output from Action: +observation: write +content: +extras: + path: hello.sh +======= End Actions ======= +Use these memories to provide additional context to the problem you are solving. +Remember that you have already completed these steps so you do not need to perform them again. + +---------- + +RESPONSE FORMAT: +This is the format of the response you will make in order to solve the current issue. +You will be given multiple iterations to complete this task so break it into steps and solve them one by one. + +Your output must contain the following: +- First, thoughts about what your next action should be and plan it out. + - You will have a memory of your thoughts so you can use this to remember things for the next step. + - Use your thoughts to think about what you are currently doing, what you have done on prior steps and how that relates to solving the problem. +- Second, create a piece of code that will execute your next action based on the thoughts you have. + - Remember that you can only have one action for each thought, do not include multiple actions. + +Your code MUST be surrounded in triple back ticks EXACTLY like this: +``` + +``` + +Notes: +- Adhere to the format so that the program loop continues smoothly, it is very important to only give one command per output. +- DO NOT give more than one command within the triple backticks. This will just throw an error and nothing will happen as a result. +- Do not give multiple code blocks, if you do only the second one will be captured and run, this might give an error if the first one was necessary. +- To execute multiple commands you should write them down in your thoughts section so you can remember it on the next step and execute them then. +- The only commands you are not capable of executing are interactive commands like `python` or `node` by themselves. +- If you think that you have completed the task that has been given to you based on your previous actions and outputs then use ``` exit ``` as the command to let the system know that you are done. +- DO NOT make any copies of your previous memories those will be provided to you at each step, making copies just wastes time and energy. Think smarter not harder. +- The write and edit commands requires proper indentation in the content section ex. `write hw.py def hello(): + print('Hello World')` this is how you would have to format your write command. + - The white spaces matter as the code changes will be added to the code so they must have proper syntax. + +This is a template using the format described above +Items in <> are suggestions for you, fill them out based on the context of the problem you are solving. + +[ FORMAT ] +Thoughts: + + + +Action: +``` + +``` +[ END FORMAT ] + +Do not provide anything extra just your thought and action. + +You are currently trying to complete this task: +Write a shell script 'hello.sh' that prints 'hello'. Do not ask me for confirmation at any point. + +CURRENT WORKSPACE: + Open File: hello.sh on line 0 + You can use these commands with the current file: + Navigation: `scroll_up`, `scroll_down`, and `goto ` + Modification: `edit ` + + +Keep all of the guidelines above in mind when you are thinking and making code. +Please come up with a thought and action based on your current task and latest steps. +Make sure that you do not repeat the same actions, there will not be any changes in result if you do not changes anything. +Be very strict about the formatting that you use and make sure you follow the guidelines. +NEVER output multiple commands. ONLY take ONE STEP at a time. +When you have completed your task run the "exit" command. +Begin with your thought about the next step and then come up with an action to perform your thought. diff --git a/tests/integration/mock/SWEAgent/test_write_simple_script/prompt_008.log b/tests/integration/mock/SWEAgent/test_write_simple_script/prompt_008.log new file mode 100644 index 0000000000..bc3e180089 --- /dev/null +++ b/tests/integration/mock/SWEAgent/test_write_simple_script/prompt_008.log @@ -0,0 +1,291 @@ + + +---------- + +SYSTEM INFO: +You am an autonomous coding agent, here to provide solutions for coding issues. +You have been designed to assist you with a wide range of programming tasks, from code editing and debugging to testing and deployment. +You have access to a variety of tools and commands that you can use to help you solve problems efficiently. + +INSTRUCTIONS: +Now, you're going to solve this issue on your own. You can use any bash commands or custom commands you wish to complete your task. Edit all the files you need to and run any checks or tests that you want. +Remember, YOU CAN ONLY ENTER ONE COMMAND AT A TIME. You should always wait for feedback after every command. +When you're satisfied with all of the changes you've made, you can indicate that you are done by running the exit command. +Note however that you cannot use any interactive session commands (e.g. python, vim, node) in this environment, but you can write scripts and run them. E.g. you can write a python script and then run it with `python .py`. + +NOTE ABOUT THE write COMMAND: Indentation really matters! When editing a file, make sure to insert appropriate indentation before each line! + +IMPORTANT TIPS: +1. Reproduce the bug: Always start by trying to replicate the bug that the issue discusses. If the issue includes code for reproducing the bug, we recommend that you re-implement that in your environment and run it to ensure you can reproduce the bug. Then, start trying to fix it. When you think you've fixed the bug, re-run the bug reproduction script to make sure that the issue has indeed been resolved. + If the bug reproduction script does not print anything when it successfully runs, we recommend adding a print("Script completed successfully, no errors.") command at the end of the file, so that you can be sure the script ran fine all the way through. +2. Try different commands: If you run a command and it doesn't work, try running a different command. A command that did not work once will not work the second time unless you modify it. +3. Navigate large files: If you open a file and need to get to an area around a specific line that is not in the first 100 lines, say line 583, you would use the 'read' command like this: 'read 583'. This is a much faster way to read through the file. +4. Handle input files: If the bug reproduction script requires inputting/reading a specific file, such as 'buggy-input.png', and you'd like to understand how to input that file, conduct a search in the existing repository code to see whether someone else has already done that. Do this by running the command: 'search_dir "buggy-input.png"'. If that doesn't work, use the Linux 'find' command. +5. Understand your context: Always make sure to look at the currently open file and the current working directory. The currently open file might be in a different directory than the working directory. +6. Verify your edits: When editing files, it is easy to accidentally specify a wrong line number or to write code with incorrect indentation. Always check the code after you issue an edit to make sure that it reflects what you wanted to accomplish. If it didn't, issue another command to fix it. +7. Thoroughly test your solution: After making any changes to fix a bug, be sure to thoroughly test your solution to ensure the bug has been resolved. Re-run the bug reproduction script and verify that the issue has been addressed. + + +DOCUMENTATION: +It is recommend that you use the commands provided for interacting with files and your directory because they have been specially built for you. +They will make it much easier for you to look at files and make changes. Using these commands will help you be better at your task. +You can open an file by using either the read or write operations. +- If a file already exists you should read it before making any changes. Use the `edit` command to make changes once you have read it. +- If you are creating a new file use the write command. Use the `edit` command to make changes once you have created the new file. + +Commands: +exit - Executed when task is complete +read [] [] - Shows a given file's contents starting from up to . Default: start_line = 0, end_line = -1. By default the whole file will be read. +write [] [] - Modifies a by replacing the current lines between and with . Default start_line = 0 and end_line = -1. Calling this with no line args will replace the whole file. +browse - Returns the text version of any url, this can be useful to look up documentation or finding issues on github +scroll_up - Takes no arguments. This will scroll up and show you the 100 lines above your current lines +scroll_down - Takes no arguments. This will scroll down and show you the 100 lines below your current lines +edit - This will modify lines in the currently open file. use start_line and end_line to designate which lines to change and then write the multiline changes. Set end_line to -1 to denote the end of the file +goto - This will take you directly to a line and show you the 100 lines below it. + - You can use any bash command you need (cd, ls, rm, grep, dir, mv, wget, git, zip, etc.) with their arguments included +pip install - You can use this to import python packages. Make sure you include the correct package name when using this command. +ls - Use the ls command to view all the files in your current directory, this is a good starting point. +NOT ALLOWED - You cannot use interactive commands like python or node +Custom bash commands: +None + + +The following commands require an open file to be used: edit, scroll_up, scroll_down, goto +To modify the current file use 'edit'. To move through the current file use 'goto' or 'scroll_up'/'scroll_down' +when using write and edit do not surround the code with any "" just write the code. + +---------- + +These are your past 4 actions: +===== Previous Actions ===== + +Memory 0: +Previous Action: +action: write +args: + path: hello.sh + start: 0 + end: -1 + thought: Thoughts: + I need to add the code to the 'hello.sh' script that will print 'hello' without asking for confirmation. This involves editing the existing script. + + Action: + +Output from Action: +observation: write +content: +extras: + path: hello.sh + +Memory 1: +Previous Action: +action: write +args: + path: hello.sh + start: 0 + end: -1 + thought: Thoughts: + I need to add the code to the 'hello.sh' script that will print 'hello' without asking for confirmation. Since the script is already created and made executable, I should simply edit the script to include the command to print 'hello'. + + Action: + +Output from Action: +observation: write +content: +extras: + path: hello.sh + +Memory 2: +Previous Action: +action: write +args: + path: hello.sh + start: 0 + end: -1 + thought: Thoughts: + I need to add the code to the 'hello.sh' script that will print 'hello' without asking for confirmation. Since the script is already created, made executable, and the initial content was added, I should now insert the command to print 'hello' into the script. + + Action: + +Output from Action: +observation: write +content: +extras: + path: hello.sh + +Memory 3: +Previous Action: +action: write +args: + path: hello.sh + start: 0 + end: -1 + thought: Thoughts: + I need to add the command in the 'hello.sh' script to print 'hello' without asking for confirmation. Since the script is already created, made executable, and the initial content was added, I should now insert the command to print 'hello' into the script. + + Action: + +Output from Action: +observation: write +content: +extras: + path: hello.sh +======= End Actions ======= +Use these memories to provide additional context to the problem you are solving. +Remember that you have already completed these steps so you do not need to perform them again. + +---------- + +RESPONSE FORMAT: +This is the format of the response you will make in order to solve the current issue. +You will be given multiple iterations to complete this task so break it into steps and solve them one by one. + +Your output must contain the following: +- First, thoughts about what your next action should be and plan it out. + - You will have a memory of your thoughts so you can use this to remember things for the next step. + - Use your thoughts to think about what you are currently doing, what you have done on prior steps and how that relates to solving the problem. +- Second, create a piece of code that will execute your next action based on the thoughts you have. + - Remember that you can only have one action for each thought, do not include multiple actions. + +Your code MUST be surrounded in triple back ticks EXACTLY like this: +``` + +``` + +Notes: +- Adhere to the format so that the program loop continues smoothly, it is very important to only give one command per output. +- DO NOT give more than one command within the triple backticks. This will just throw an error and nothing will happen as a result. +- Do not give multiple code blocks, if you do only the second one will be captured and run, this might give an error if the first one was necessary. +- To execute multiple commands you should write them down in your thoughts section so you can remember it on the next step and execute them then. +- The only commands you are not capable of executing are interactive commands like `python` or `node` by themselves. +- If you think that you have completed the task that has been given to you based on your previous actions and outputs then use ``` exit ``` as the command to let the system know that you are done. +- DO NOT make any copies of your previous memories those will be provided to you at each step, making copies just wastes time and energy. Think smarter not harder. +- The write and edit commands requires proper indentation in the content section ex. `write hw.py def hello(): + print('Hello World')` this is how you would have to format your write command. + - The white spaces matter as the code changes will be added to the code so they must have proper syntax. + +This is a template using the format described above +Items in <> are suggestions for you, fill them out based on the context of the problem you are solving. + +[ FORMAT ] +Thoughts: + + + +Action: +``` + +``` +[ END FORMAT ] + +Do not provide anything extra just your thought and action. + +You are currently trying to complete this task: +Write a shell script 'hello.sh' that prints 'hello'. Do not ask me for confirmation at any point. + +CURRENT WORKSPACE: + Open File: hello.sh on line 0 + You can use these commands with the current file: + Navigation: `scroll_up`, `scroll_down`, and `goto ` + Modification: `edit ` + + +Keep all of the guidelines above in mind when you are thinking and making code. +Please come up with a thought and action based on your current task and latest steps. +Make sure that you do not repeat the same actions, there will not be any changes in result if you do not changes anything. +Be very strict about the formatting that you use and make sure you follow the guidelines. +NEVER output multiple commands. ONLY take ONE STEP at a time. +When you have completed your task run the "exit" command. +Begin with your thought about the next step and then come up with an action to perform your thought. + +---------- + + +You did not include any action to take in your most recent output: + +===== Output ====== +Thoughts: +I need to add the command in the 'hello.sh' script to print 'hello' without asking for confirmation. Since the script is already created, made executable, and the initial content was added, I should now insert the command to print 'hello' into the script. + +Action: +I will edit the 'hello.sh' script to include the command to print 'hello' without asking for confirmation. +==== End Output === + +Remember these are the custom commands you can use: +DOCUMENTATION: +It is recommend that you use the commands provided for interacting with files and your directory because they have been specially built for you. +They will make it much easier for you to look at files and make changes. Using these commands will help you be better at your task. +You can open an file by using either the read or write operations. +- If a file already exists you should read it before making any changes. Use the `edit` command to make changes once you have read it. +- If you are creating a new file use the write command. Use the `edit` command to make changes once you have created the new file. + +Commands: +exit - Executed when task is complete +read [] [] - Shows a given file's contents starting from up to . Default: start_line = 0, end_line = -1. By default the whole file will be read. +write [] [] - Modifies a by replacing the current lines between and with . Default start_line = 0 and end_line = -1. Calling this with no line args will replace the whole file. +browse - Returns the text version of any url, this can be useful to look up documentation or finding issues on github +scroll_up - Takes no arguments. This will scroll up and show you the 100 lines above your current lines +scroll_down - Takes no arguments. This will scroll down and show you the 100 lines below your current lines +edit - This will modify lines in the currently open file. use start_line and end_line to designate which lines to change and then write the multiline changes. Set end_line to -1 to denote the end of the file +goto - This will take you directly to a line and show you the 100 lines below it. + - You can use any bash command you need (cd, ls, rm, grep, dir, mv, wget, git, zip, etc.) with their arguments included +pip install - You can use this to import python packages. Make sure you include the correct package name when using this command. +ls - Use the ls command to view all the files in your current directory, this is a good starting point. +NOT ALLOWED - You cannot use interactive commands like python or node +Custom bash commands: +None + + +The following commands require an open file to be used: edit, scroll_up, scroll_down, goto +To modify the current file use 'edit'. To move through the current file use 'goto' or 'scroll_up'/'scroll_down' +when using write and edit do not surround the code with any "" just write the code. + + +Lets try that again, it is very important that you adhere to the output format +This time, be sure to use the exact format below, replacing anything in <> with the appropriate value(s): +RESPONSE FORMAT: +This is the format of the response you will make in order to solve the current issue. +You will be given multiple iterations to complete this task so break it into steps and solve them one by one. + +Your output must contain the following: +- First, thoughts about what your next action should be and plan it out. + - You will have a memory of your thoughts so you can use this to remember things for the next step. + - Use your thoughts to think about what you are currently doing, what you have done on prior steps and how that relates to solving the problem. +- Second, create a piece of code that will execute your next action based on the thoughts you have. + - Remember that you can only have one action for each thought, do not include multiple actions. + +Your code MUST be surrounded in triple back ticks EXACTLY like this: +``` + +``` + +Notes: +- Adhere to the format so that the program loop continues smoothly, it is very important to only give one command per output. +- DO NOT give more than one command within the triple backticks. This will just throw an error and nothing will happen as a result. +- Do not give multiple code blocks, if you do only the second one will be captured and run, this might give an error if the first one was necessary. +- To execute multiple commands you should write them down in your thoughts section so you can remember it on the next step and execute them then. +- The only commands you are not capable of executing are interactive commands like `python` or `node` by themselves. +- If you think that you have completed the task that has been given to you based on your previous actions and outputs then use ``` exit ``` as the command to let the system know that you are done. +- DO NOT make any copies of your previous memories those will be provided to you at each step, making copies just wastes time and energy. Think smarter not harder. +- The write and edit commands requires proper indentation in the content section ex. `write hw.py def hello(): + print('Hello World')` this is how you would have to format your write command. + - The white spaces matter as the code changes will be added to the code so they must have proper syntax. + +This is a template using the format described above +Items in <> are suggestions for you, fill them out based on the context of the problem you are solving. + +[ FORMAT ] +Thoughts: + + + +Action: +``` + +``` +[ END FORMAT ] + +Do not provide anything extra just your thought and action. + + +It is crucial you use the format provided as the output will be parsed automatically. diff --git a/tests/integration/mock/SWEAgent/test_write_simple_script/prompt_009.log b/tests/integration/mock/SWEAgent/test_write_simple_script/prompt_009.log new file mode 100644 index 0000000000..4be7693b53 --- /dev/null +++ b/tests/integration/mock/SWEAgent/test_write_simple_script/prompt_009.log @@ -0,0 +1,199 @@ + + +---------- + +SYSTEM INFO: +You am an autonomous coding agent, here to provide solutions for coding issues. +You have been designed to assist you with a wide range of programming tasks, from code editing and debugging to testing and deployment. +You have access to a variety of tools and commands that you can use to help you solve problems efficiently. + +INSTRUCTIONS: +Now, you're going to solve this issue on your own. You can use any bash commands or custom commands you wish to complete your task. Edit all the files you need to and run any checks or tests that you want. +Remember, YOU CAN ONLY ENTER ONE COMMAND AT A TIME. You should always wait for feedback after every command. +When you're satisfied with all of the changes you've made, you can indicate that you are done by running the exit command. +Note however that you cannot use any interactive session commands (e.g. python, vim, node) in this environment, but you can write scripts and run them. E.g. you can write a python script and then run it with `python .py`. + +NOTE ABOUT THE write COMMAND: Indentation really matters! When editing a file, make sure to insert appropriate indentation before each line! + +IMPORTANT TIPS: +1. Reproduce the bug: Always start by trying to replicate the bug that the issue discusses. If the issue includes code for reproducing the bug, we recommend that you re-implement that in your environment and run it to ensure you can reproduce the bug. Then, start trying to fix it. When you think you've fixed the bug, re-run the bug reproduction script to make sure that the issue has indeed been resolved. + If the bug reproduction script does not print anything when it successfully runs, we recommend adding a print("Script completed successfully, no errors.") command at the end of the file, so that you can be sure the script ran fine all the way through. +2. Try different commands: If you run a command and it doesn't work, try running a different command. A command that did not work once will not work the second time unless you modify it. +3. Navigate large files: If you open a file and need to get to an area around a specific line that is not in the first 100 lines, say line 583, you would use the 'read' command like this: 'read 583'. This is a much faster way to read through the file. +4. Handle input files: If the bug reproduction script requires inputting/reading a specific file, such as 'buggy-input.png', and you'd like to understand how to input that file, conduct a search in the existing repository code to see whether someone else has already done that. Do this by running the command: 'search_dir "buggy-input.png"'. If that doesn't work, use the Linux 'find' command. +5. Understand your context: Always make sure to look at the currently open file and the current working directory. The currently open file might be in a different directory than the working directory. +6. Verify your edits: When editing files, it is easy to accidentally specify a wrong line number or to write code with incorrect indentation. Always check the code after you issue an edit to make sure that it reflects what you wanted to accomplish. If it didn't, issue another command to fix it. +7. Thoroughly test your solution: After making any changes to fix a bug, be sure to thoroughly test your solution to ensure the bug has been resolved. Re-run the bug reproduction script and verify that the issue has been addressed. + + +DOCUMENTATION: +It is recommend that you use the commands provided for interacting with files and your directory because they have been specially built for you. +They will make it much easier for you to look at files and make changes. Using these commands will help you be better at your task. +You can open an file by using either the read or write operations. +- If a file already exists you should read it before making any changes. Use the `edit` command to make changes once you have read it. +- If you are creating a new file use the write command. Use the `edit` command to make changes once you have created the new file. + +Commands: +exit - Executed when task is complete +read [] [] - Shows a given file's contents starting from up to . Default: start_line = 0, end_line = -1. By default the whole file will be read. +write [] [] - Modifies a by replacing the current lines between and with . Default start_line = 0 and end_line = -1. Calling this with no line args will replace the whole file. +browse - Returns the text version of any url, this can be useful to look up documentation or finding issues on github +scroll_up - Takes no arguments. This will scroll up and show you the 100 lines above your current lines +scroll_down - Takes no arguments. This will scroll down and show you the 100 lines below your current lines +edit - This will modify lines in the currently open file. use start_line and end_line to designate which lines to change and then write the multiline changes. Set end_line to -1 to denote the end of the file +goto - This will take you directly to a line and show you the 100 lines below it. + - You can use any bash command you need (cd, ls, rm, grep, dir, mv, wget, git, zip, etc.) with their arguments included +pip install - You can use this to import python packages. Make sure you include the correct package name when using this command. +ls - Use the ls command to view all the files in your current directory, this is a good starting point. +NOT ALLOWED - You cannot use interactive commands like python or node +Custom bash commands: +None + + +The following commands require an open file to be used: edit, scroll_up, scroll_down, goto +To modify the current file use 'edit'. To move through the current file use 'goto' or 'scroll_up'/'scroll_down' +when using write and edit do not surround the code with any "" just write the code. + +---------- + +These are your past 4 actions: +===== Previous Actions ===== + +Memory 0: +Previous Action: +action: write +args: + path: hello.sh + start: 0 + end: -1 + thought: Thoughts: + I need to add the code to the 'hello.sh' script that will print 'hello' without asking for confirmation. Since the script is already created and made executable, I should simply edit the script to include the command to print 'hello'. + + Action: + +Output from Action: +observation: write +content: +extras: + path: hello.sh + +Memory 1: +Previous Action: +action: write +args: + path: hello.sh + start: 0 + end: -1 + thought: Thoughts: + I need to add the code to the 'hello.sh' script that will print 'hello' without asking for confirmation. Since the script is already created, made executable, and the initial content was added, I should now insert the command to print 'hello' into the script. + + Action: + +Output from Action: +observation: write +content: +extras: + path: hello.sh + +Memory 2: +Previous Action: +action: write +args: + path: hello.sh + start: 0 + end: -1 + thought: Thoughts: + I need to add the command in the 'hello.sh' script to print 'hello' without asking for confirmation. Since the script is already created, made executable, and the initial content was added, I should now insert the command to print 'hello' into the script. + + Action: + +Output from Action: +observation: write +content: +extras: + path: hello.sh + +Memory 3: +Previous Action: +action: write +args: + path: hello.sh + start: 0 + end: -1 + thought: Thoughts: + I need to edit the 'hello.sh' script to include the command to print 'hello' without asking for confirmation. Since the script is already created, made executable, and the initial content was added, I should now insert the command to print 'hello' into the script. + + Action: + +Output from Action: +observation: write +content: +extras: + path: hello.sh +======= End Actions ======= +Use these memories to provide additional context to the problem you are solving. +Remember that you have already completed these steps so you do not need to perform them again. + +---------- + +RESPONSE FORMAT: +This is the format of the response you will make in order to solve the current issue. +You will be given multiple iterations to complete this task so break it into steps and solve them one by one. + +Your output must contain the following: +- First, thoughts about what your next action should be and plan it out. + - You will have a memory of your thoughts so you can use this to remember things for the next step. + - Use your thoughts to think about what you are currently doing, what you have done on prior steps and how that relates to solving the problem. +- Second, create a piece of code that will execute your next action based on the thoughts you have. + - Remember that you can only have one action for each thought, do not include multiple actions. + +Your code MUST be surrounded in triple back ticks EXACTLY like this: +``` + +``` + +Notes: +- Adhere to the format so that the program loop continues smoothly, it is very important to only give one command per output. +- DO NOT give more than one command within the triple backticks. This will just throw an error and nothing will happen as a result. +- Do not give multiple code blocks, if you do only the second one will be captured and run, this might give an error if the first one was necessary. +- To execute multiple commands you should write them down in your thoughts section so you can remember it on the next step and execute them then. +- The only commands you are not capable of executing are interactive commands like `python` or `node` by themselves. +- If you think that you have completed the task that has been given to you based on your previous actions and outputs then use ``` exit ``` as the command to let the system know that you are done. +- DO NOT make any copies of your previous memories those will be provided to you at each step, making copies just wastes time and energy. Think smarter not harder. +- The write and edit commands requires proper indentation in the content section ex. `write hw.py def hello(): + print('Hello World')` this is how you would have to format your write command. + - The white spaces matter as the code changes will be added to the code so they must have proper syntax. + +This is a template using the format described above +Items in <> are suggestions for you, fill them out based on the context of the problem you are solving. + +[ FORMAT ] +Thoughts: + + + +Action: +``` + +``` +[ END FORMAT ] + +Do not provide anything extra just your thought and action. + +You are currently trying to complete this task: +Write a shell script 'hello.sh' that prints 'hello'. Do not ask me for confirmation at any point. + +CURRENT WORKSPACE: + Open File: hello.sh on line 0 + You can use these commands with the current file: + Navigation: `scroll_up`, `scroll_down`, and `goto ` + Modification: `edit ` + + +Keep all of the guidelines above in mind when you are thinking and making code. +Please come up with a thought and action based on your current task and latest steps. +Make sure that you do not repeat the same actions, there will not be any changes in result if you do not changes anything. +Be very strict about the formatting that you use and make sure you follow the guidelines. +NEVER output multiple commands. ONLY take ONE STEP at a time. +When you have completed your task run the "exit" command. +Begin with your thought about the next step and then come up with an action to perform your thought. diff --git a/tests/integration/mock/SWEAgent/test_write_simple_script/prompt_010.log b/tests/integration/mock/SWEAgent/test_write_simple_script/prompt_010.log new file mode 100644 index 0000000000..56b649dcf4 --- /dev/null +++ b/tests/integration/mock/SWEAgent/test_write_simple_script/prompt_010.log @@ -0,0 +1,199 @@ + + +---------- + +SYSTEM INFO: +You am an autonomous coding agent, here to provide solutions for coding issues. +You have been designed to assist you with a wide range of programming tasks, from code editing and debugging to testing and deployment. +You have access to a variety of tools and commands that you can use to help you solve problems efficiently. + +INSTRUCTIONS: +Now, you're going to solve this issue on your own. You can use any bash commands or custom commands you wish to complete your task. Edit all the files you need to and run any checks or tests that you want. +Remember, YOU CAN ONLY ENTER ONE COMMAND AT A TIME. You should always wait for feedback after every command. +When you're satisfied with all of the changes you've made, you can indicate that you are done by running the exit command. +Note however that you cannot use any interactive session commands (e.g. python, vim, node) in this environment, but you can write scripts and run them. E.g. you can write a python script and then run it with `python .py`. + +NOTE ABOUT THE write COMMAND: Indentation really matters! When editing a file, make sure to insert appropriate indentation before each line! + +IMPORTANT TIPS: +1. Reproduce the bug: Always start by trying to replicate the bug that the issue discusses. If the issue includes code for reproducing the bug, we recommend that you re-implement that in your environment and run it to ensure you can reproduce the bug. Then, start trying to fix it. When you think you've fixed the bug, re-run the bug reproduction script to make sure that the issue has indeed been resolved. + If the bug reproduction script does not print anything when it successfully runs, we recommend adding a print("Script completed successfully, no errors.") command at the end of the file, so that you can be sure the script ran fine all the way through. +2. Try different commands: If you run a command and it doesn't work, try running a different command. A command that did not work once will not work the second time unless you modify it. +3. Navigate large files: If you open a file and need to get to an area around a specific line that is not in the first 100 lines, say line 583, you would use the 'read' command like this: 'read 583'. This is a much faster way to read through the file. +4. Handle input files: If the bug reproduction script requires inputting/reading a specific file, such as 'buggy-input.png', and you'd like to understand how to input that file, conduct a search in the existing repository code to see whether someone else has already done that. Do this by running the command: 'search_dir "buggy-input.png"'. If that doesn't work, use the Linux 'find' command. +5. Understand your context: Always make sure to look at the currently open file and the current working directory. The currently open file might be in a different directory than the working directory. +6. Verify your edits: When editing files, it is easy to accidentally specify a wrong line number or to write code with incorrect indentation. Always check the code after you issue an edit to make sure that it reflects what you wanted to accomplish. If it didn't, issue another command to fix it. +7. Thoroughly test your solution: After making any changes to fix a bug, be sure to thoroughly test your solution to ensure the bug has been resolved. Re-run the bug reproduction script and verify that the issue has been addressed. + + +DOCUMENTATION: +It is recommend that you use the commands provided for interacting with files and your directory because they have been specially built for you. +They will make it much easier for you to look at files and make changes. Using these commands will help you be better at your task. +You can open an file by using either the read or write operations. +- If a file already exists you should read it before making any changes. Use the `edit` command to make changes once you have read it. +- If you are creating a new file use the write command. Use the `edit` command to make changes once you have created the new file. + +Commands: +exit - Executed when task is complete +read [] [] - Shows a given file's contents starting from up to . Default: start_line = 0, end_line = -1. By default the whole file will be read. +write [] [] - Modifies a by replacing the current lines between and with . Default start_line = 0 and end_line = -1. Calling this with no line args will replace the whole file. +browse - Returns the text version of any url, this can be useful to look up documentation or finding issues on github +scroll_up - Takes no arguments. This will scroll up and show you the 100 lines above your current lines +scroll_down - Takes no arguments. This will scroll down and show you the 100 lines below your current lines +edit - This will modify lines in the currently open file. use start_line and end_line to designate which lines to change and then write the multiline changes. Set end_line to -1 to denote the end of the file +goto - This will take you directly to a line and show you the 100 lines below it. + - You can use any bash command you need (cd, ls, rm, grep, dir, mv, wget, git, zip, etc.) with their arguments included +pip install - You can use this to import python packages. Make sure you include the correct package name when using this command. +ls - Use the ls command to view all the files in your current directory, this is a good starting point. +NOT ALLOWED - You cannot use interactive commands like python or node +Custom bash commands: +None + + +The following commands require an open file to be used: edit, scroll_up, scroll_down, goto +To modify the current file use 'edit'. To move through the current file use 'goto' or 'scroll_up'/'scroll_down' +when using write and edit do not surround the code with any "" just write the code. + +---------- + +These are your past 4 actions: +===== Previous Actions ===== + +Memory 0: +Previous Action: +action: write +args: + path: hello.sh + start: 0 + end: -1 + thought: Thoughts: + I need to add the code to the 'hello.sh' script that will print 'hello' without asking for confirmation. Since the script is already created, made executable, and the initial content was added, I should now insert the command to print 'hello' into the script. + + Action: + +Output from Action: +observation: write +content: +extras: + path: hello.sh + +Memory 1: +Previous Action: +action: write +args: + path: hello.sh + start: 0 + end: -1 + thought: Thoughts: + I need to add the command in the 'hello.sh' script to print 'hello' without asking for confirmation. Since the script is already created, made executable, and the initial content was added, I should now insert the command to print 'hello' into the script. + + Action: + +Output from Action: +observation: write +content: +extras: + path: hello.sh + +Memory 2: +Previous Action: +action: write +args: + path: hello.sh + start: 0 + end: -1 + thought: Thoughts: + I need to edit the 'hello.sh' script to include the command to print 'hello' without asking for confirmation. Since the script is already created, made executable, and the initial content was added, I should now insert the command to print 'hello' into the script. + + Action: + +Output from Action: +observation: write +content: +extras: + path: hello.sh + +Memory 3: +Previous Action: +action: write +args: + path: hello.sh + start: 0 + end: -1 + thought: Thoughts: + I need to add the command in the 'hello.sh' script to print 'hello' without asking for confirmation. Since the script is already created, made executable, and the initial content was added, I should now insert the command to print 'hello' into the script. + + Action: + +Output from Action: +observation: write +content: +extras: + path: hello.sh +======= End Actions ======= +Use these memories to provide additional context to the problem you are solving. +Remember that you have already completed these steps so you do not need to perform them again. + +---------- + +RESPONSE FORMAT: +This is the format of the response you will make in order to solve the current issue. +You will be given multiple iterations to complete this task so break it into steps and solve them one by one. + +Your output must contain the following: +- First, thoughts about what your next action should be and plan it out. + - You will have a memory of your thoughts so you can use this to remember things for the next step. + - Use your thoughts to think about what you are currently doing, what you have done on prior steps and how that relates to solving the problem. +- Second, create a piece of code that will execute your next action based on the thoughts you have. + - Remember that you can only have one action for each thought, do not include multiple actions. + +Your code MUST be surrounded in triple back ticks EXACTLY like this: +``` + +``` + +Notes: +- Adhere to the format so that the program loop continues smoothly, it is very important to only give one command per output. +- DO NOT give more than one command within the triple backticks. This will just throw an error and nothing will happen as a result. +- Do not give multiple code blocks, if you do only the second one will be captured and run, this might give an error if the first one was necessary. +- To execute multiple commands you should write them down in your thoughts section so you can remember it on the next step and execute them then. +- The only commands you are not capable of executing are interactive commands like `python` or `node` by themselves. +- If you think that you have completed the task that has been given to you based on your previous actions and outputs then use ``` exit ``` as the command to let the system know that you are done. +- DO NOT make any copies of your previous memories those will be provided to you at each step, making copies just wastes time and energy. Think smarter not harder. +- The write and edit commands requires proper indentation in the content section ex. `write hw.py def hello(): + print('Hello World')` this is how you would have to format your write command. + - The white spaces matter as the code changes will be added to the code so they must have proper syntax. + +This is a template using the format described above +Items in <> are suggestions for you, fill them out based on the context of the problem you are solving. + +[ FORMAT ] +Thoughts: + + + +Action: +``` + +``` +[ END FORMAT ] + +Do not provide anything extra just your thought and action. + +You are currently trying to complete this task: +Write a shell script 'hello.sh' that prints 'hello'. Do not ask me for confirmation at any point. + +CURRENT WORKSPACE: + Open File: hello.sh on line 0 + You can use these commands with the current file: + Navigation: `scroll_up`, `scroll_down`, and `goto ` + Modification: `edit ` + + +Keep all of the guidelines above in mind when you are thinking and making code. +Please come up with a thought and action based on your current task and latest steps. +Make sure that you do not repeat the same actions, there will not be any changes in result if you do not changes anything. +Be very strict about the formatting that you use and make sure you follow the guidelines. +NEVER output multiple commands. ONLY take ONE STEP at a time. +When you have completed your task run the "exit" command. +Begin with your thought about the next step and then come up with an action to perform your thought. diff --git a/tests/integration/mock/SWEAgent/test_write_simple_script/prompt_011.log b/tests/integration/mock/SWEAgent/test_write_simple_script/prompt_011.log new file mode 100644 index 0000000000..ded1c4b1d1 --- /dev/null +++ b/tests/integration/mock/SWEAgent/test_write_simple_script/prompt_011.log @@ -0,0 +1,199 @@ + + +---------- + +SYSTEM INFO: +You am an autonomous coding agent, here to provide solutions for coding issues. +You have been designed to assist you with a wide range of programming tasks, from code editing and debugging to testing and deployment. +You have access to a variety of tools and commands that you can use to help you solve problems efficiently. + +INSTRUCTIONS: +Now, you're going to solve this issue on your own. You can use any bash commands or custom commands you wish to complete your task. Edit all the files you need to and run any checks or tests that you want. +Remember, YOU CAN ONLY ENTER ONE COMMAND AT A TIME. You should always wait for feedback after every command. +When you're satisfied with all of the changes you've made, you can indicate that you are done by running the exit command. +Note however that you cannot use any interactive session commands (e.g. python, vim, node) in this environment, but you can write scripts and run them. E.g. you can write a python script and then run it with `python .py`. + +NOTE ABOUT THE write COMMAND: Indentation really matters! When editing a file, make sure to insert appropriate indentation before each line! + +IMPORTANT TIPS: +1. Reproduce the bug: Always start by trying to replicate the bug that the issue discusses. If the issue includes code for reproducing the bug, we recommend that you re-implement that in your environment and run it to ensure you can reproduce the bug. Then, start trying to fix it. When you think you've fixed the bug, re-run the bug reproduction script to make sure that the issue has indeed been resolved. + If the bug reproduction script does not print anything when it successfully runs, we recommend adding a print("Script completed successfully, no errors.") command at the end of the file, so that you can be sure the script ran fine all the way through. +2. Try different commands: If you run a command and it doesn't work, try running a different command. A command that did not work once will not work the second time unless you modify it. +3. Navigate large files: If you open a file and need to get to an area around a specific line that is not in the first 100 lines, say line 583, you would use the 'read' command like this: 'read 583'. This is a much faster way to read through the file. +4. Handle input files: If the bug reproduction script requires inputting/reading a specific file, such as 'buggy-input.png', and you'd like to understand how to input that file, conduct a search in the existing repository code to see whether someone else has already done that. Do this by running the command: 'search_dir "buggy-input.png"'. If that doesn't work, use the Linux 'find' command. +5. Understand your context: Always make sure to look at the currently open file and the current working directory. The currently open file might be in a different directory than the working directory. +6. Verify your edits: When editing files, it is easy to accidentally specify a wrong line number or to write code with incorrect indentation. Always check the code after you issue an edit to make sure that it reflects what you wanted to accomplish. If it didn't, issue another command to fix it. +7. Thoroughly test your solution: After making any changes to fix a bug, be sure to thoroughly test your solution to ensure the bug has been resolved. Re-run the bug reproduction script and verify that the issue has been addressed. + + +DOCUMENTATION: +It is recommend that you use the commands provided for interacting with files and your directory because they have been specially built for you. +They will make it much easier for you to look at files and make changes. Using these commands will help you be better at your task. +You can open an file by using either the read or write operations. +- If a file already exists you should read it before making any changes. Use the `edit` command to make changes once you have read it. +- If you are creating a new file use the write command. Use the `edit` command to make changes once you have created the new file. + +Commands: +exit - Executed when task is complete +read [] [] - Shows a given file's contents starting from up to . Default: start_line = 0, end_line = -1. By default the whole file will be read. +write [] [] - Modifies a by replacing the current lines between and with . Default start_line = 0 and end_line = -1. Calling this with no line args will replace the whole file. +browse - Returns the text version of any url, this can be useful to look up documentation or finding issues on github +scroll_up - Takes no arguments. This will scroll up and show you the 100 lines above your current lines +scroll_down - Takes no arguments. This will scroll down and show you the 100 lines below your current lines +edit - This will modify lines in the currently open file. use start_line and end_line to designate which lines to change and then write the multiline changes. Set end_line to -1 to denote the end of the file +goto - This will take you directly to a line and show you the 100 lines below it. + - You can use any bash command you need (cd, ls, rm, grep, dir, mv, wget, git, zip, etc.) with their arguments included +pip install - You can use this to import python packages. Make sure you include the correct package name when using this command. +ls - Use the ls command to view all the files in your current directory, this is a good starting point. +NOT ALLOWED - You cannot use interactive commands like python or node +Custom bash commands: +None + + +The following commands require an open file to be used: edit, scroll_up, scroll_down, goto +To modify the current file use 'edit'. To move through the current file use 'goto' or 'scroll_up'/'scroll_down' +when using write and edit do not surround the code with any "" just write the code. + +---------- + +These are your past 4 actions: +===== Previous Actions ===== + +Memory 0: +Previous Action: +action: write +args: + path: hello.sh + start: 0 + end: -1 + thought: Thoughts: + I need to add the command in the 'hello.sh' script to print 'hello' without asking for confirmation. Since the script is already created, made executable, and the initial content was added, I should now insert the command to print 'hello' into the script. + + Action: + +Output from Action: +observation: write +content: +extras: + path: hello.sh + +Memory 1: +Previous Action: +action: write +args: + path: hello.sh + start: 0 + end: -1 + thought: Thoughts: + I need to edit the 'hello.sh' script to include the command to print 'hello' without asking for confirmation. Since the script is already created, made executable, and the initial content was added, I should now insert the command to print 'hello' into the script. + + Action: + +Output from Action: +observation: write +content: +extras: + path: hello.sh + +Memory 2: +Previous Action: +action: write +args: + path: hello.sh + start: 0 + end: -1 + thought: Thoughts: + I need to add the command in the 'hello.sh' script to print 'hello' without asking for confirmation. Since the script is already created, made executable, and the initial content was added, I should now insert the command to print 'hello' into the script. + + Action: + +Output from Action: +observation: write +content: +extras: + path: hello.sh + +Memory 3: +Previous Action: +action: write +args: + path: hello.sh + start: 0 + end: -1 + thought: Thoughts: + I need to add the command in the 'hello.sh' script to print 'hello' without asking for confirmation. Since the script is already created, made executable, and the initial content was added, I should now insert the command to print 'hello' into the script. + + Action: + +Output from Action: +observation: write +content: +extras: + path: hello.sh +======= End Actions ======= +Use these memories to provide additional context to the problem you are solving. +Remember that you have already completed these steps so you do not need to perform them again. + +---------- + +RESPONSE FORMAT: +This is the format of the response you will make in order to solve the current issue. +You will be given multiple iterations to complete this task so break it into steps and solve them one by one. + +Your output must contain the following: +- First, thoughts about what your next action should be and plan it out. + - You will have a memory of your thoughts so you can use this to remember things for the next step. + - Use your thoughts to think about what you are currently doing, what you have done on prior steps and how that relates to solving the problem. +- Second, create a piece of code that will execute your next action based on the thoughts you have. + - Remember that you can only have one action for each thought, do not include multiple actions. + +Your code MUST be surrounded in triple back ticks EXACTLY like this: +``` + +``` + +Notes: +- Adhere to the format so that the program loop continues smoothly, it is very important to only give one command per output. +- DO NOT give more than one command within the triple backticks. This will just throw an error and nothing will happen as a result. +- Do not give multiple code blocks, if you do only the second one will be captured and run, this might give an error if the first one was necessary. +- To execute multiple commands you should write them down in your thoughts section so you can remember it on the next step and execute them then. +- The only commands you are not capable of executing are interactive commands like `python` or `node` by themselves. +- If you think that you have completed the task that has been given to you based on your previous actions and outputs then use ``` exit ``` as the command to let the system know that you are done. +- DO NOT make any copies of your previous memories those will be provided to you at each step, making copies just wastes time and energy. Think smarter not harder. +- The write and edit commands requires proper indentation in the content section ex. `write hw.py def hello(): + print('Hello World')` this is how you would have to format your write command. + - The white spaces matter as the code changes will be added to the code so they must have proper syntax. + +This is a template using the format described above +Items in <> are suggestions for you, fill them out based on the context of the problem you are solving. + +[ FORMAT ] +Thoughts: + + + +Action: +``` + +``` +[ END FORMAT ] + +Do not provide anything extra just your thought and action. + +You are currently trying to complete this task: +Write a shell script 'hello.sh' that prints 'hello'. Do not ask me for confirmation at any point. + +CURRENT WORKSPACE: + Open File: hello.sh on line 0 + You can use these commands with the current file: + Navigation: `scroll_up`, `scroll_down`, and `goto ` + Modification: `edit ` + + +Keep all of the guidelines above in mind when you are thinking and making code. +Please come up with a thought and action based on your current task and latest steps. +Make sure that you do not repeat the same actions, there will not be any changes in result if you do not changes anything. +Be very strict about the formatting that you use and make sure you follow the guidelines. +NEVER output multiple commands. ONLY take ONE STEP at a time. +When you have completed your task run the "exit" command. +Begin with your thought about the next step and then come up with an action to perform your thought. diff --git a/tests/integration/mock/SWEAgent/test_write_simple_script/response_007.log b/tests/integration/mock/SWEAgent/test_write_simple_script/response_007.log new file mode 100644 index 0000000000..6949b125d4 --- /dev/null +++ b/tests/integration/mock/SWEAgent/test_write_simple_script/response_007.log @@ -0,0 +1,5 @@ +Thoughts: +I need to add the command in the 'hello.sh' script to print 'hello' without asking for confirmation. Since the script is already created, made executable, and the initial content was added, I should now insert the command to print 'hello' into the script. + +Action: +I will edit the 'hello.sh' script to include the command to print 'hello' without asking for confirmation. diff --git a/tests/integration/mock/SWEAgent/test_write_simple_script/response_008.log b/tests/integration/mock/SWEAgent/test_write_simple_script/response_008.log new file mode 100644 index 0000000000..e569fe594f --- /dev/null +++ b/tests/integration/mock/SWEAgent/test_write_simple_script/response_008.log @@ -0,0 +1,7 @@ +Thoughts: +I need to edit the 'hello.sh' script to include the command to print 'hello' without asking for confirmation. Since the script is already created, made executable, and the initial content was added, I should now insert the command to print 'hello' into the script. + +Action: +``` +edit 0 -1 "echo 'hello'" +``` diff --git a/tests/integration/mock/SWEAgent/test_write_simple_script/response_009.log b/tests/integration/mock/SWEAgent/test_write_simple_script/response_009.log new file mode 100644 index 0000000000..310fde5701 --- /dev/null +++ b/tests/integration/mock/SWEAgent/test_write_simple_script/response_009.log @@ -0,0 +1,7 @@ +Thoughts: +I need to add the command in the 'hello.sh' script to print 'hello' without asking for confirmation. Since the script is already created, made executable, and the initial content was added, I should now insert the command to print 'hello' into the script. + +Action: +``` +edit 0 -1 "echo 'hello'" +``` diff --git a/tests/integration/mock/SWEAgent/test_write_simple_script/response_010.log b/tests/integration/mock/SWEAgent/test_write_simple_script/response_010.log new file mode 100644 index 0000000000..310fde5701 --- /dev/null +++ b/tests/integration/mock/SWEAgent/test_write_simple_script/response_010.log @@ -0,0 +1,7 @@ +Thoughts: +I need to add the command in the 'hello.sh' script to print 'hello' without asking for confirmation. Since the script is already created, made executable, and the initial content was added, I should now insert the command to print 'hello' into the script. + +Action: +``` +edit 0 -1 "echo 'hello'" +``` diff --git a/tests/integration/mock/SWEAgent/test_write_simple_script/response_011.log b/tests/integration/mock/SWEAgent/test_write_simple_script/response_011.log new file mode 100644 index 0000000000..22f89941a2 --- /dev/null +++ b/tests/integration/mock/SWEAgent/test_write_simple_script/response_011.log @@ -0,0 +1,9 @@ +Thoughts: +I need to add the command in the 'hello.sh' script to print 'hello' without asking for confirmation. Since the script is already created, made executable, and the initial content was added, I should now insert the command to print 'hello' into the script. + +Action: +I will add the command to print 'hello' into the 'hello.sh' script. + +``` +edit 0 -1 "echo 'hello'" +``` diff --git a/tests/unit/test_action_serialization.py b/tests/unit/test_action_serialization.py index 23c21b3379..6141a00661 100644 --- a/tests/unit/test_action_serialization.py +++ b/tests/unit/test_action_serialization.py @@ -64,7 +64,10 @@ def test_agent_reject_action_serialization_deserialization(): def test_cmd_kill_action_serialization_deserialization(): - original_action_dict = {'action': 'kill', 'args': {'id': '1337', 'thought': ''}} + original_action_dict = { + 'action': 'kill', + 'args': {'command_id': '1337', 'thought': ''}, + } serialization_deserialization(original_action_dict, CmdKillAction) @@ -122,6 +125,6 @@ def test_add_task_action_serialization_deserialization(): def test_modify_task_action_serialization_deserialization(): original_action_dict = { 'action': 'modify_task', - 'args': {'id': 1, 'state': 'Test state.', 'thought': ''}, + 'args': {'task_id': 1, 'state': 'Test state.', 'thought': ''}, } serialization_deserialization(original_action_dict, ModifyTaskAction)