Skip to content

Commit

Permalink
Catch json decode error in file surfer (microsoft#352)
Browse files Browse the repository at this point in the history
* Remove commented code

* Removed unused code

* Add try except to catch json decode error

---------

Co-authored-by: afourney <[email protected]>
  • Loading branch information
gagb and afourney authored Aug 9, 2024
1 parent 30631c7 commit 698a8f3
Show file tree
Hide file tree
Showing 2 changed files with 6 additions and 153 deletions.
64 changes: 0 additions & 64 deletions python/teams/team-one/src/team_one/agents/file_surfer/_tools.py
Original file line number Diff line number Diff line change
Expand Up @@ -48,67 +48,3 @@
name="find_next",
description="Scroll the viewport to next occurrence of the search string.",
)

# TOOL_OPEN_LOCAL_FILE = {
# "type": "function",
# "function": {
# "name": "open_local_file",
# "description": "Open a local file at a path in the text-based browser and return current viewport content.",
# "parameters": {
# "type": "object",
# "properties": {
# "path": {
# "type": "string",
# "description": "The relative or absolute path of a local file to visit.",
# },
# },
# "required": ["path"],
# },
# },
# }


# TOOL_PAGE_UP = {
# "type": "function",
# "function": {
# "name": "page_up",
# "description": "Scroll the viewport UP one page-length in the current file and return the new viewport content.",
# },
# }


# TOOL_PAGE_DOWN = {
# "type": "function",
# "function": {
# "name": "page_down",
# "description": "Scroll the viewport DOWN one page-length in the current file and return the new viewport content.",
# },
# }


# TOOL_FIND_ON_PAGE_CTRL_F = {
# "type": "function",
# "function": {
# "name": "find_on_page_ctrl_f",
# "description": "Scroll the viewport to the first occurrence of the search string. This is equivalent to Ctrl+F.",
# "parameters": {
# "type": "object",
# "properties": {
# "search_string": {
# "type": "string",
# "description": "The string to search for on the page. This search string supports wildcards like '*'",
# },
# },
# "required": ["search_string"],
# },
# },
# }


# TOOL_FIND_NEXT = {
# "type": "function",
# "function": {
# "name": "find_next",
# "description": "Scroll the viewport to next occurrence of the search string.",
# },
# }
Original file line number Diff line number Diff line change
Expand Up @@ -8,8 +8,6 @@
SystemMessage,
UserMessage,
)

# from agnext.components.tools import FunctionTool
from agnext.core import CancellationToken

from ...markdown_browser import RequestsMarkdownBrowser
Expand All @@ -18,36 +16,6 @@
# from typing_extensions import Annotated
from ._tools import TOOL_FIND_NEXT, TOOL_FIND_ON_PAGE_CTRL_F, TOOL_OPEN_LOCAL_FILE, TOOL_PAGE_DOWN, TOOL_PAGE_UP

# async def read_local_file(file_path: Annotated[str, "relative or absolute path of file to read"]) -> str:
# """Read contents of a file."""
# try:
# async with aiofiles.open(file_path, mode="r") as file:
# file_contents = str(await file.read())
# return f"""
# Here are the contents of the file at path: {file_path}
# ```
# {file_contents}
# ```
# """

# except FileNotFoundError:
# return f"File not found: {file_path}"


# def list_files_and_dirs_like_tree(dir_path: str) -> str:
# """List files and directories in a directory in a format similar to 'tree' command with level 1."""
# path = Path(dir_path)
# if not path.is_dir():
# return f"{dir_path} is not a valid directory."

# items = [f"{dir_path}"]
# for item in path.iterdir():
# if item.is_dir():
# items.append(f"├── {item.name}/") # Indicate directories with a trailing slash
# else:
# items.append(f"├── {item.name}") # List files as is
# return "\n".join(items)


class FileSurfer(BaseWorker):
"""An agent that uses tools to read and navigate local files."""
Expand All @@ -72,18 +40,6 @@ def __init__(
self._system_messages = system_messages
self._browser = browser
self._tools = [TOOL_OPEN_LOCAL_FILE, TOOL_PAGE_UP, TOOL_PAGE_DOWN, TOOL_FIND_ON_PAGE_CTRL_F, TOOL_FIND_NEXT]
# self._tools = [
# FunctionTool(
# read_local_file,
# description="Use this function to read the contents of a local file whose relative or absolute path is given.",
# name="read_local_file",
# ),
# FunctionTool(
# list_files_and_dirs_like_tree,
# description="List files and directories in a directory in a format similar to 'tree' command with level 1",
# name="list_files_and_dirs_like_tree",
# ),
# ]

def _get_browser_state(self) -> Tuple[str, str]:
"""
Expand All @@ -110,49 +66,6 @@ def _get_browser_state(self) -> Tuple[str, str]:

return (header, self._browser.viewport)

# async def _generate_reply(self, cancellation_token: CancellationToken) -> Tuple[bool, UserContent]:

# if self._browser is None:
# self._browse = RequestsMarkdownBrowser(viewport_size=1024 * 5, downloads_folder="coding")

# response = await self._model_client.create(self._system_messages + self._chat_history, tools=self._tools)

# if isinstance(response.content, str):
# final_result = response.content

# elif isinstance(response.content, list) and all(isinstance(item, FunctionCall) for item in response.content):
# results = await asyncio.gather(*[self.send_message(call, self.id) for call in response.content])
# for result in results:
# assert isinstance(result, FunctionExecutionResult)
# final_result = "\n".join(result.content for result in results)
# else:
# raise ValueError(f"Unexpected response type: {response.content}")

# assert isinstance(final_result, str)

# return "TERMINATE" in final_result, final_result

# @message_handler
# async def handle_tool_call(
# self, message: FunctionCall, cancellation_token: CancellationToken
# ) -> FunctionExecutionResult:
# """Handle a tool execution task. This method executes the tool and publishes the result."""
# function_call = message
# # Find the tool
# tool = next((tool for tool in self._tools if tool.name == function_call.name), None)
# if tool is None:
# result_as_str = f"Error: Tool not found: {function_call.name}"
# else:
# try:
# arguments = json.loads(function_call.arguments)
# result = await tool.run_json(args=arguments, cancellation_token=cancellation_token)
# result_as_str = tool.return_value_as_string(result)
# except json.JSONDecodeError:
# result_as_str = f"Error: Invalid arguments: {function_call.arguments}"
# except Exception as e:
# result_as_str = f"Error: {e}"
# return FunctionExecutionResult(content=result_as_str, call_id=function_call.id)

async def _generate_reply(self, cancellation_token: CancellationToken) -> Tuple[bool, str]:
if self._browser is None:
self._browser = RequestsMarkdownBrowser(viewport_size=1024 * 5, downloads_folder="coding")
Expand All @@ -164,7 +77,6 @@ async def _generate_reply(self, cancellation_token: CancellationToken) -> Tuple[
task_content = last_message.content # the last message from the sender is the task

assert self._browser is not None
# assert self._browser.page_title is not None

context_message = UserMessage(
source="user",
Expand All @@ -189,7 +101,12 @@ async def _generate_reply(self, cancellation_token: CancellationToken) -> Tuple[
function_calls = response
for function_call in function_calls:
tool_name = function_call.name
arguments = json.loads(function_call.arguments)

try:
arguments = json.loads(function_call.arguments)
except json.JSONDecodeError as e:
error_str = f"File surfer encountered an error decoding JSON arguments: {e}"
return False, error_str

if tool_name == "open_local_file":
path = arguments["path"]
Expand Down

0 comments on commit 698a8f3

Please sign in to comment.