From 7bd8a1131e34b32ed06fd683c1f3dda9765e39ee Mon Sep 17 00:00:00 2001 From: Dillon Laird Date: Mon, 14 Oct 2024 07:19:35 -0700 Subject: [PATCH] Fix issues 2 (#267) * switched to tags to reduce parsing issues * tools can deal with empty images * make fine tune id test looser * automatically save files to artifacts * update logo * updated docs * remove temporal localization --- README.md | 7 +- assets/logo.jpg | Bin 104959 -> 0 bytes assets/logo.png | Bin 0 -> 4741 bytes docs/index.md | 5 + tests/integ/test_tools.py | 118 +++++++++++---- tests/unit/test_va.py | 10 +- vision_agent/agent/vision_agent.py | 158 ++++++++++++--------- vision_agent/agent/vision_agent_prompts.py | 99 ++++++++++--- vision_agent/tools/__init__.py | 1 - vision_agent/tools/meta_tools.py | 128 +++++++++-------- vision_agent/tools/tools.py | 66 ++++----- 11 files changed, 376 insertions(+), 216 deletions(-) delete mode 100644 assets/logo.jpg create mode 100644 assets/logo.png diff --git a/README.md b/README.md index e34e265e..3812767a 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,5 @@
- vision_agent + vision_agent # 🔍🤖 Vision Agent [![](https://dcbadge.vercel.app/api/server/wPdN8RCYew?compact=true&style=flat)](https://discord.gg/wPdN8RCYew) @@ -345,6 +345,11 @@ result = agent.generate_code(conv) ## Additional Backends +### E2B Code Execution +If you wish to run your code on the E2B backend, make sure you have your `E2B_API_KEY` +set and then set `CODE_SANDBOX_RUNTIME=e2b` in your environment variables. This will +run all the agent generated code on the E2B backend. + ### Anthropic `AnthropicVisionAgentCoder` uses Anthropic. To get started you just need to get an Anthropic API key and set it in your environment variables: diff --git a/assets/logo.jpg b/assets/logo.jpg deleted file mode 100644 index a2fa3a2cc052910be93d3120c3c28bd173169430..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 104959 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≶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 diff --git a/assets/logo.png b/assets/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..636574f2395342a9b89366655aa4d7741a286fa9 GIT binary patch literal 4741 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 None: +def test_image_caption(): img = ski.data.rocket() result = blip_image_caption( image=img, @@ -251,7 +298,7 @@ def test_image_caption() -> None: assert result.strip() == "a rocket on a stand" -def test_florence_image_caption() -> None: +def test_florence_image_caption(): img = ski.data.rocket() result = florence2_image_caption( image=img, @@ -259,7 +306,7 @@ def test_florence_image_caption() -> None: assert "The image shows a rocket on a launch pad at night" in result.strip() -def test_loca_zero_shot_counting() -> None: +def test_loca_zero_shot_counting(): img = ski.data.coins() result = loca_zero_shot_counting( @@ -268,7 +315,7 @@ def test_loca_zero_shot_counting() -> None: assert result["count"] == 21 -def test_loca_visual_prompt_counting() -> None: +def test_loca_visual_prompt_counting(): img = ski.data.coins() result = loca_visual_prompt_counting( visual_prompt={"bbox": [85, 106, 122, 145]}, @@ -277,7 +324,7 @@ def test_loca_visual_prompt_counting() -> None: assert result["count"] == 25 -def test_git_vqa_v2() -> None: +def test_git_vqa_v2(): img = ski.data.rocket() result = git_vqa_v2( prompt="Is the scene captured during day or night ?", @@ -286,7 +333,7 @@ def test_git_vqa_v2() -> None: assert result.strip() == "night" -def test_image_qa_with_context() -> None: +def test_image_qa_with_context(): img = ski.data.rocket() result = florence2_roberta_vqa( prompt="Is the scene captured during day or night ?", @@ -295,7 +342,7 @@ def test_image_qa_with_context() -> None: assert "night" in result.strip() -def test_ixc25_image_vqa() -> None: +def test_ixc25_image_vqa(): img = ski.data.cat() result = ixc25_image_vqa( prompt="What animal is in this image?", @@ -304,7 +351,7 @@ def test_ixc25_image_vqa() -> None: assert "cat" in result.strip() -def test_ixc25_video_vqa() -> None: +def test_ixc25_video_vqa(): frames = [ np.array(Image.fromarray(ski.data.cat()).convert("RGB")) for _ in range(10) ] @@ -315,18 +362,7 @@ def test_ixc25_video_vqa() -> None: assert "cat" in result.strip() -def test_ixc25_temporal_localization() -> None: - frames = [ - np.array(Image.fromarray(ski.data.cat()).convert("RGB")) for _ in range(10) - ] - result = ixc25_temporal_localization( - prompt="What animal is in this video?", - frames=frames, - ) - assert result == [True] * 10 - - -def test_ocr() -> None: +def test_ocr(): img = ski.data.page() result = ocr( image=img, @@ -334,7 +370,14 @@ def test_ocr() -> None: assert any("Region-based segmentation" in res["label"] for res in result) -def test_florence2_ocr() -> None: +def test_ocr_empty(): + result = ocr( + image=np.zeros((0, 0, 3)).astype(np.uint8), + ) + assert result == [] + + +def test_florence2_ocr(): img = ski.data.page() result = florence2_ocr( image=img, @@ -342,6 +385,13 @@ def test_florence2_ocr() -> None: assert any("Region-based segmentation" in res["label"] for res in result) +def test_florence2_ocr_empty(): + result = florence2_ocr( + image=np.zeros((0, 0, 3)).astype(np.uint8), + ) + assert result == [] + + def test_mask_distance(): # Create two binary masks mask1 = np.zeros((100, 100), dtype=np.uint8) @@ -399,14 +449,22 @@ def test_generate_hed(): assert result.shape == img.shape -def test_countgd_counting() -> None: +def test_countgd_counting(): img = ski.data.coins() result = countgd_counting(image=img, prompt="coin") assert len(result) == 24 assert [res["label"] for res in result] == ["coin"] * 24 -def test_countgd_example_based_counting() -> None: +def test_countgd_counting_empty(): + result = countgd_counting( + prompt="coin", + image=np.zeros((0, 0, 3)).astype(np.uint8), + ) + assert result == [] + + +def test_countgd_example_based_counting(): img = ski.data.coins() result = countgd_example_based_counting( visual_prompts=[[85, 106, 122, 145]], @@ -414,3 +472,11 @@ def test_countgd_example_based_counting() -> None: ) assert len(result) == 24 assert [res["label"] for res in result] == ["object"] * 24 + + +def test_countgd_example_based_counting_empty(): + result = countgd_example_based_counting( + visual_prompts=[[85, 106, 122, 145]], + image=np.zeros((0, 0, 3)).astype(np.uint8), + ) + assert result == [] diff --git a/tests/unit/test_va.py b/tests/unit/test_va.py index 3fe619e8..e7a6e7c5 100644 --- a/tests/unit/test_va.py +++ b/tests/unit/test_va.py @@ -1,4 +1,12 @@ -from vision_agent.agent.vision_agent import parse_execution +from vision_agent.agent.agent_utils import extract_tag +from vision_agent.tools.meta_tools import use_extra_vision_agent_args + + +def parse_execution(code, test_multi_plan=True, custom_tool_names=None): + code = extract_tag(code, "execute_python") + if not code: + return None + return use_extra_vision_agent_args(code, test_multi_plan, custom_tool_names) def test_parse_execution_zero(): diff --git a/vision_agent/agent/vision_agent.py b/vision_agent/agent/vision_agent.py index 42541d33..29643ecd 100644 --- a/vision_agent/agent/vision_agent.py +++ b/vision_agent/agent/vision_agent.py @@ -1,4 +1,5 @@ import copy +import json import logging import os import tempfile @@ -6,7 +7,7 @@ from typing import Any, Callable, Dict, List, Optional, Tuple, Union, cast from vision_agent.agent import Agent -from vision_agent.agent.agent_utils import extract_json +from vision_agent.agent.agent_utils import extract_json, extract_tag from vision_agent.agent.vision_agent_prompts import ( EXAMPLES_CODE1, EXAMPLES_CODE2, @@ -18,6 +19,7 @@ META_TOOL_DOCSTRING, Artifacts, check_and_load_image, + extract_and_save_files_to_artifacts, use_extra_vision_agent_args, ) from vision_agent.utils import CodeInterpreterFactory @@ -35,7 +37,7 @@ class BoilerplateCode: pre_code = [ "from typing import *", "from vision_agent.utils.execute import CodeInterpreter", - "from vision_agent.tools.meta_tools import Artifacts, open_code_artifact, create_code_artifact, edit_code_artifact, get_tool_descriptions, generate_vision_code, edit_vision_code, write_media_artifact, view_media_artifact, object_detection_fine_tuning, use_object_detection_fine_tuning", + "from vision_agent.tools.meta_tools import Artifacts, open_code_artifact, create_code_artifact, edit_code_artifact, get_tool_descriptions, generate_vision_code, edit_vision_code, view_media_artifact, object_detection_fine_tuning, use_object_detection_fine_tuning", "artifacts = Artifacts('{remote_path}')", "artifacts.load('{remote_path}')", ] @@ -57,6 +59,32 @@ def add_boilerplate(code: str, **format: Any) -> str: ) +def format_agent_message(agent_message: str) -> str: + agent_message_json = extract_json(agent_message) + output = "" + if "thinking" in agent_message_json and agent_message_json["thinking"]: + output += "" + agent_message_json["thinking"] + "" + if "response" in agent_message_json and agent_message_json["response"]: + output += "" + agent_message_json["response"] + "" + if "execute_python" in agent_message_json and agent_message_json["execute_python"]: + output += ( + "\n\n" + + agent_message_json["execute_python"] + + "\n\n" + ) + if ( + "let_user_respond" in agent_message_json + and agent_message_json["let_user_respond"] + ): + output += ( + "" + + str(agent_message_json["let_user_respond"]) + + "" + ) + + return output + + def run_conversation(orch: LMM, chat: List[Message]) -> Dict[str, Any]: chat = copy.deepcopy(chat) @@ -67,7 +95,7 @@ def run_conversation(orch: LMM, chat: List[Message]) -> Dict[str, Any]: elif chat_i["role"] == "observation": conversation += f"OBSERVATION:\n{chat_i['content']}\n\n" elif chat_i["role"] == "assistant": - conversation += f"AGENT: {chat_i['content']}\n\n" + conversation += f"AGENT: {format_agent_message(chat_i['content'])}\n\n" # type: ignore else: raise ValueError(f"role {chat_i['role']} is not supported") @@ -84,15 +112,31 @@ def run_conversation(orch: LMM, chat: List[Message]) -> Dict[str, Any]: and len(chat[-1]["media"]) > 0 # type: ignore ): message["media"] = chat[-1]["media"] - return extract_json(orch([message], stream=False)) # type: ignore + conv_resp = cast(str, orch([message], stream=False)) + + let_user_respond_str = extract_tag(conv_resp, "let_user_respond") + let_user_respond = ( + "true" in let_user_respond_str.lower() if let_user_respond_str else False + ) + + return { + "thinking": extract_tag(conv_resp, "thinking"), + "response": extract_tag(conv_resp, "response"), + "execute_python": extract_tag(conv_resp, "execute_python"), + "let_user_respond": let_user_respond, + } def execute_code_action( - code: str, code_interpreter: CodeInterpreter, artifact_remote_path: str + artifacts: Artifacts, + code: str, + code_interpreter: CodeInterpreter, + artifact_remote_path: str, ) -> Tuple[Execution, str]: result = code_interpreter.exec_isolation( BoilerplateCode.add_boilerplate(code, remote_path=artifact_remote_path) ) + extract_and_save_files_to_artifacts(artifacts, code) obs = str(result.logs) if result.error: @@ -100,33 +144,8 @@ def execute_code_action( return result, obs -def parse_execution( - response: str, - test_multi_plan: bool = True, - custom_tool_names: Optional[List[str]] = None, -) -> Optional[str]: - code = None - remaining = response - all_code = [] - while "" in remaining: - code_i = remaining[ - remaining.find("") + len("") : - ] - code_i = code_i[: code_i.find("")] - remaining = remaining[ - remaining.find("") + len("") : - ] - all_code.append(code_i) - - if len(all_code) > 0: - code = "\n".join(all_code) - - if code is not None: - code = use_extra_vision_agent_args(code, test_multi_plan, custom_tool_names) - return code - - def execute_user_code_action( + artifacts: Artifacts, last_user_message: Message, code_interpreter: CodeInterpreter, artifact_remote_path: str, @@ -138,40 +157,43 @@ def execute_user_code_action( return user_result, user_obs last_user_content = cast(str, last_user_message.get("content", "")) + try: + user_code_action = json.loads(last_user_content).get("execute_python", None) + except json.JSONDecodeError: + return user_result, user_obs - user_code_action = parse_execution(last_user_content, False) if user_code_action is not None: + user_code_action = use_extra_vision_agent_args(user_code_action, False) user_result, user_obs = execute_code_action( - user_code_action, code_interpreter, artifact_remote_path + artifacts, user_code_action, code_interpreter, artifact_remote_path ) if user_result.error: user_obs += f"\n{user_result.error}" return user_result, user_obs -def add_step_descriptions(response: Dict[str, str]) -> Dict[str, str]: +def add_step_descriptions(response: Dict[str, Any]) -> Dict[str, Any]: response = copy.deepcopy(response) - if "response" in response: - resp_str = response["response"] - if "" in resp_str: - # only include descriptions for these, the rest will just have executing - # code - description_map = { - "open_code_artifact": "Reading file.", - "create_code_artifact": "Creating file.", - "edit_code_artifact": "Editing file.", - "generate_vision_code": "Generating vision code.", - "edit_vision_code": "Editing vision code.", - } - description = "" - for k, v in description_map.items(): - if k in resp_str: - description += v + " " - if description == "": - description = "Executing code." - resp_str = resp_str[resp_str.find("") :] - resp_str = description + resp_str - response["response"] = resp_str + + if "execute_python" in response and response["execute_python"]: + # only include descriptions for these, the rest will just have executing + # code + description_map = { + "open_code_artifact": "Reading file.", + "create_code_artifact": "Creating file.", + "edit_code_artifact": "Editing file.", + "generate_vision_code": "Generating vision code.", + "edit_vision_code": "Editing vision code.", + } + description = "" + for k, v in description_map.items(): + if k in response["execute_python"]: + description += v + " " + if description == "": + description = "Executing code." + + response["response"] = description + return response @@ -369,7 +391,10 @@ def chat_with_artifacts( self.streaming_message({"role": "observation", "content": artifacts_loaded}) user_result, user_obs = execute_user_code_action( - last_user_message, code_interpreter, str(remote_artifacts_path) + artifacts, + last_user_message, + code_interpreter, + str(remote_artifacts_path), ) finished = user_result is not None and user_obs is not None if user_result is not None and user_obs is not None: @@ -394,13 +419,13 @@ def chat_with_artifacts( int_chat.append( { "role": "assistant", - "content": str(add_step_descriptions(response)), + "content": json.dumps(add_step_descriptions(response)), } ) orig_chat.append( { "role": "assistant", - "content": str(add_step_descriptions(response)), + "content": json.dumps(add_step_descriptions(response)), } ) @@ -408,11 +433,13 @@ def chat_with_artifacts( if last_response == response: response["let_user_respond"] = True - finished = response["let_user_respond"] + finished = response.get("let_user_respond", False) - code_action = parse_execution( - response["response"], test_multi_plan, custom_tool_names - ) + code_action = response.get("execute_python", None) + if code_action is not None: + code_action = use_extra_vision_agent_args( + code_action, test_multi_plan, custom_tool_names + ) if last_response == response: self.streaming_message( @@ -431,14 +458,17 @@ def chat_with_artifacts( self.streaming_message( { "role": "assistant", - "content": response, + "content": json.dumps(response), "finished": finished and code_action is None, } ) if code_action is not None: result, obs = execute_code_action( - code_action, code_interpreter, str(remote_artifacts_path) + artifacts, + code_action, + code_interpreter, + str(remote_artifacts_path), ) media_obs = check_and_load_image(code_action) diff --git a/vision_agent/agent/vision_agent_prompts.py b/vision_agent/agent/vision_agent_prompts.py index a8b1e543..278b0b4c 100644 --- a/vision_agent/agent/vision_agent_prompts.py +++ b/vision_agent/agent/vision_agent_prompts.py @@ -27,13 +27,14 @@ **Instructions**: 1. **Understand and Clarify**: Make sure you understand the task, ask clarifying questions if the task is not clear. 2. **Code Generation**: Only use code provided in the Documentation in your tags. Only use `edit_vision_code` to modify code written by `generate_vision_code`. -3. **Execute**: Do only what the user asked you to do and no more. If you need to ask the user a question, set `let_user_respond` to `true`. +3. **Execute**: Do only what the user asked you to do and no more. If you need to ask the user a question or show your results to the user, set to `true`. 4. **Response**: Keep your responses short and concise. Provide the user only with the information they need to continue the conversation. -5. **Output in JSON**: Respond in the following format in JSON: +5. **Output**: You can only respond with , , , and tags. -```json -{{"thoughts": , "response": , "let_user_respond": }}. -``` +Your thoughts here... +Your response to the user here... +Your code here... +true/false for whether or not to you want to let the user respond. """ @@ -45,7 +46,11 @@ Artifact dog.jpg loaded to /path/to/images/dog.jpg [End of artifacts] -AGENT: {"thoughts": "I will use the generate_vision_code to detect the dogs in the image.", "response": "generate_vision_code(artifacts, 'dog_detector.py', 'Can you write code to detect dogs in this image?', media=['/path/to/images/dog.jpg'])", "let_user_respond": false} +AGENT: I will use the generate_vision_code to detect the dogs in the image. + +generate_vision_code(artifacts, 'dog_detector.py', 'Can you write code to detect dogs in this image?', media=['/path/to/images/dog.jpg']) + +false OBSERVATION: [Artifact dog_detector.py] @@ -56,14 +61,21 @@ 4| return dogs [End of artifact] -AGENT: {"thoughts": "I have generated the code to detect the dogs in the image, I must now run the code and print the results to get the output.", "response": "from dog_detector import detect_dogs\n print(detect_dogs('/example/workspace/dog.jpg'))", "let_user_respond": false} +AGENT: I have generated the code to detect the dogs in the image, I must now run the code and print the results to get the output. + +from dog_detector import detect_dogs +print(detect_dogs('/example/workspace/dog.jpg')) + +false OBSERVATION: ----- stdout ----- [{'score': 0.99, 'label': 'dog', 'box': [0.1, 0.2, 0.3, 0.4]}, {'score': 0.23, 'label': 'dog', 'box': [0.2, 0.3, 0.4, 0.5]}] -AGENT: {"thoughts": "Two dogs are detected, I will show this to the user and ask them if the result looks good.", "response": "The code detectd two dogs, do the results look good to you?", "let_user_respond": true} +AGENT: Two dogs are detected, I will show this to the user and ask them if the result looks good. +The code detectd two dogs, do the results look good to you? +true """ EXAMPLES_CODE1_EXTRA = """ @@ -75,7 +87,11 @@ Artifact dog_detector.py loaded to /path/to/code/dog_detector.py [End of artifacts] -AGENT: {"thoughts": "I will use edit_vision_code to fix the code to detect only one dog. The lower score is 0.23 so I will set the threshold above that.", "response": "edit_vision_code(artifacts, 'dog_detector.py', ['Can you write code to detect dogs in this image?', 'Can you increase the threshold to 0.24?'], media=['/path/to/images/dog.jpg'])", "let_user_respond": false} +AGENT: I will use edit_vision_code to fix the code to detect only one dog. The lower score is 0.23 so I will set the threshold above that + +edit_vision_code(artifacts, 'dog_detector.py', ['Can you write code to detect dogs in this image?', 'Can you increase the threshold to 0.24?'], media=['/path/to/images/dog.jpg']) + +false OBSERVATION: [Artifact dog_detector.py] @@ -86,13 +102,20 @@ 4| return dogs [End of artifact] -AGENT: {"thoughts": "I have edited the code to detect only one dog, I must now run the code and print the results to get the output.", "response": "from dog_detector import detect_dogs\n print(detect_dogs('/path/to/images/dog.jpg'))", "let_user_respond": false} +AGENT: I have edited the code to detect only one dog, I must now run the code and print the results to get the output. + +from dog_detector import detect_dogs +print(detect_dogs('/path/to/images/dog.jpg')) + +false OBSERVATION: ----- stdout ----- [{'score': 0.99, 'label': 'dog', 'box': [0.1, 0.2, 0.3, 0.4]}] -AGENT: {"thoughts": "One dog is detected, I will show this to the user and ask them if the result looks good.", "response": "The code detected one dog, do these results look good to you?", "let_user_respond": true} +AGENT: One dog is detected, I will show this to the user and ask them if the result looks good. +The code detected one dog, do these results look good to you? +true """ EXAMPLES_CODE2 = """ @@ -103,12 +126,18 @@ Artifact image.jpg loaded to /path/to/images/image.jpg [End of artifacts] -AGENT: {"thoughts": "The user hasn't asked me to write any code and the task is very simple so I will view the image and answer myself to respond to the user quickly.", "response": "view_media_artifacts('image.jpg')", "let_user_respond": false} +AGENT: The user hasn't asked me to write any code and the task is very simple so I will view the image and answer myself to respond to the user quickly. + +view_media_artifacts('image.jpg') + +false OBSERVATION: [Image image.jpg displayed] -AGENT: {"thoughts": "The image shows a cat and a dog sitting on the couch, I will tell the user and ask them if they need any other assistance.", "response": "The image contains a dog and a cat sitting on a couch. Can I help you with any other tasks?", "let_user_respond": true} +AGENT: The image shows a cat and a dog sitting on the couch, I will tell the user and ask them if they need any other assistance. +The image contains a dog and a cat sitting on a couch. Can I help you with any other tasks? +true """ @@ -119,7 +148,9 @@ [Artifacts loaded] [End of artifacts] -AGENT: {"thoughts": "The user has asked to count workers with helmets but has not provided an image. I will ask the user for an image and then generate the code to count workers with helmets.", "response": "Can you provide an image of workers with helmets?", "let_user_respond": true} +AGENT: The user has asked to count workers with helmets but has not provided an image. I will ask the user for an image and then generate the code to count workers with helmets. +Can you provide an image of workers with helmets? +true USER: Yes you can use workers.png @@ -128,7 +159,11 @@ Artifact workers.png loaded to /path/to/images/workers.png [End of artifacts] -AGENT: {"thoughts": "I will use the generate_vision_code to count the workers with helmets in the image.", "response": "generate_vision_code(artifacts, 'code.py', 'Can you create a function to count workers with helmets, return the count and save a visaulization of the bounding boxes?', media=['/paths/to/images/workers.png'])", "let_user_respond": false} +AGENT: I will use the generate_vision_code to count the workers with helmets in the image. + +generate_vision_code(artifacts, 'code.py', 'Can you create a function to count workers with helmets, return the count and save a visaulization of the bounding boxes?', media=['/paths/to/images/workers.png']) + +false OBSERVATION: [Artifact code.py] @@ -152,22 +187,37 @@ 16| return count [End of artifact] -AGENT: {"thoughts": "I have generated the code to count the workers with helmets in the image, I must now run the code and print the output and write the visualization to the artifacts so I can see the result and the user can see the visaulization.", "response": "from code import count_workers_with_helmets\n print(count_workers_with_helmets('/path/to/images/workers.png', 'workers_viz.png'))\n write_media_artifact(artifacts, 'workers_viz.png', 'workers_viz.png')", "let_user_respond": false} +AGENT: I have generated the code to count the workers with helmets in the image, I must now run the code and print the output. + +from code import count_workers_with_helmets +print(count_workers_with_helmets('/path/to/images/workers.png', 'workers_viz.png')) + +false OBSERVATION: ----- stdout ----- 2 -AGENT: {"thoughts": "Two workers with helmets are detected, I will show this to the user and ask them if the result looks good.", "response": "The code to detect workers with helmets is saved in code.py and the visualization under 'workers_viz.png'.", "let_user_respond": true} +AGENT: Two workers with helmets are detected, I will show this to the user and ask them if the result looks good. +The code to detect workers with helmets is saved in code.py and the visualization under 'workers_viz.png'. +true USER: The detections are slightly off. Can you fine tune florence2 using these labels? "[{'image_path': 'image1.png': 'labels': ['worker', 'helmet'], 'bboxes': [[235, 118, 294, 241], [232, 118, 294, 128]]}, {'image_path': 'image2.png': 'labels': ['worker', 'helmet'], 'bboxes': [[235, 118, 294, 241], [232, 118, 294, 128]]}]" -AGENT: {"thoughts": "Because the user has supplied me with labels I can call object_detection_fine_tuning on their behalf to fine tune the model", "response": "object_detection_fine_tuning([{'image_path': 'image1.png': 'labels': ['worker', 'helmet'], 'bboxes': [[235, 118, 294, 241], [232, 118, 294, 128]]}, {'image_path': 'image2.png': 'labels': ['worker', 'helmet'], 'bboxes': [[235, 118, 294, 241], [232, 118, 294, 128]]}])", "let_user_respond": false} +AGENT: Because the user has supplied me with labels I can call object_detection_fine_tuning on their behalf to fine tune the model + +object_detection_fine_tuning([{'image_path': 'image1.png': 'labels': ['worker', 'helmet'], 'bboxes': [[235, 118, 294, 241], [232, 118, 294, 128]]}, {'image_path': 'image2.png': 'labels': ['worker', 'helmet'], 'bboxes': [[235, 118, 294, 241], [232, 118, 294, 128]]}]) + +false OBSERVATION: [Fine tuning id: 23b3b022-5ebf-4798-9373-20ef36429abf] -AGENT: {"thoughts": "The model has finished fine tuning, I will now replace the original florence2_phrase_grounding call with the fine tuning id.", "response": "use_object_detection_fine_tuning(artifacts, "code.py", "23b3b022-5ebf-4798-9373-20ef36429abf")", "let_user_respond": false} +AGENT: The model has finished fine tuning, I will now replace the original florence2_phrase_grounding call with the fine tuning id. + +use_object_detection_fine_tuning(artifacts, "code.py", "23b3b022-5ebf-4798-9373-20ef36429abf") + +false OBSERVATION: [Artifact code.py edits] @@ -184,11 +234,18 @@ def count_workers_with_helmets(image_path: str, output_path: str): count = 0 [End of edits] -AGENT: {"thoughts": "I have updated the code to use the fine tuned model, I must now run the code and print the output and write the visualization to the artifacts so I can see the result and the user can see the visaulization.", "response": "from code import count_workers_with_helmets\n print(count_workers_with_helmets('/path/to/images/workers.png', 'workers_viz.png'))\n write_media_artifact(artifacts, 'workers_viz.png', 'workers_viz.png')", "let_user_respond": false} +AGENT: I have updated the code to use the fine tuned model, I must now run the code and print the output. + +from code import count_workers_with_helmets +print(count_workers_with_helmets('/path/to/images/workers.png', 'workers_viz.png')) + +false OBSERVATION: ----- stdout ----- 3 -AGENT: {"thoughts": "Three workers with helmets are detected, I will show this to the user and ask them if the result looks good.", "response": "I have updated the code using the fine tuned florence2_phrase_grounding model to count the workers wearing helmets in code.py and saved the visualization under 'workers_viz.png'.", "let_user_respond": true} +AGENT: Three workers with helmets are detected, I will show this to the user and ask them if the result looks good. +I have updated the code using the fine tuned florence2_phrase_grounding model to count the workers wearing helmets in code.py and saved the visualization under 'workers_viz.png'. +true """ diff --git a/vision_agent/tools/__init__.py b/vision_agent/tools/__init__.py index 2a75aa2b..16df1193 100644 --- a/vision_agent/tools/__init__.py +++ b/vision_agent/tools/__init__.py @@ -37,7 +37,6 @@ grounding_dino, grounding_sam, ixc25_image_vqa, - ixc25_temporal_localization, ixc25_video_vqa, load_image, loca_visual_prompt_counting, diff --git a/vision_agent/tools/meta_tools.py b/vision_agent/tools/meta_tools.py index 7f59c685..d9537e7c 100644 --- a/vision_agent/tools/meta_tools.py +++ b/vision_agent/tools/meta_tools.py @@ -1,4 +1,3 @@ -import base64 import difflib import json import os @@ -9,7 +8,6 @@ from pathlib import Path from typing import Any, Dict, List, Optional, Union -import numpy as np from IPython.display import display from redbaron import RedBaron # type: ignore @@ -22,8 +20,7 @@ from vision_agent.tools.tools import TOOL_DESCRIPTIONS from vision_agent.tools.tools_types import BboxInput, BboxInputBase64, PromptTask from vision_agent.utils.execute import Execution, MimeType -from vision_agent.utils.image_utils import convert_to_b64, numpy_to_bytes -from vision_agent.utils.video import frames_to_bytes +from vision_agent.utils.image_utils import convert_to_b64 CURRENT_FILE = None CURRENT_LINE = 0 @@ -393,19 +390,6 @@ def generate_vision_plan( redisplay_results(response.test_results) response.test_results = None artifacts[name] = response.model_dump_json() - media_names = extract_json( - AnthropicLMM()( # type: ignore - f"""Extract any media file names from this output in the following JSON format: -{{"media": ["image1.jpg", "image2.jpg"]}} - -{artifacts[name]}""" - ) - ) - if "media" in media_names and isinstance(media_names, dict): - for media in media_names["media"]: - if isinstance(media, str): - with open(media, "rb") as f: - artifacts[media] = f.read() output_str = f"[Start Plan Context, saved at {name}]" for plan in response.plans.keys(): @@ -466,6 +450,12 @@ def detect_dogs(image_path: str): test_multi_plan=test_multi_plan, custom_tool_names=custom_tool_names, ) + + # capture and save any files that were saved in the code to the artifacts + extract_and_save_files_to_artifacts( + artifacts, response["code"] + "\n" + response["test"] + ) + redisplay_results(response["test_result"]) code = response["code"] artifacts[name] = code @@ -546,6 +536,11 @@ def detect_dogs(image_path: str): test_multi_plan=False, custom_tool_names=custom_tool_names, ) + # capture and save any files that were saved in the code to the artifacts + extract_and_save_files_to_artifacts( + artifacts, response["code"] + "\n" + response["test"] + ) + redisplay_results(response["test_result"]) code = response["code"] artifacts[name] = code @@ -567,49 +562,6 @@ def detect_dogs(image_path: str): return view_lines(code_lines, 0, total_lines, name, total_lines) -def write_media_artifact( - artifacts: Artifacts, - name: str, - media: Union[str, np.ndarray, List[np.ndarray]], - fps: Optional[float] = None, -) -> str: - """Writes a media file to the artifacts object. - - Parameters: - artifacts (Artifacts): The artifacts object to save the media to. - name (str): The name of the media artifact to save. - media (Union[str, np.ndarray, List[np.ndarray]]): The media to save, can either - be a file path, single image or list of frames for a video. - fps (Optional[float]): The frames per second if you are writing a video. - """ - if isinstance(media, str): - with open(media, "rb") as f: - media_bytes = f.read() - elif isinstance(media, list): - media_bytes = frames_to_bytes(media, fps=fps if fps is not None else 1.0) - elif isinstance(media, np.ndarray): - media_bytes = numpy_to_bytes(media) - else: - print(f"[Invalid media type {type(media)}]") - return f"[Invalid media type {type(media)}]" - artifacts[name] = media_bytes - print(f"[Media {name} saved]") - display( - { - MimeType.APPLICATION_ARTIFACT: json.dumps( - { - "name": name, - "action": "create", - "content": base64.b64encode(media_bytes).decode("utf-8"), - "contentType": "media_output", - } - ) - }, - raw=True, - ) - return f"[Media {name} saved]" - - def list_artifacts(artifacts: Artifacts) -> str: """Lists all the artifacts that have been loaded into the artifacts object.""" output_str = artifacts.show() @@ -813,6 +765,61 @@ def use_object_detection_fine_tuning( return diff +def extract_and_save_files_to_artifacts(artifacts: Artifacts, code: str) -> None: + """Extracts and saves files used in the code to the artifacts object. + + Parameters: + artifacts (Artifacts): The artifacts object to save the files to. + code (str): The code to extract the files from. + """ + try: + response = extract_json( + AnthropicLMM()( # type: ignore + f"""You are a helpful AI assistant. Your job is to look at a snippet of code and return the file paths that are being saved in the file. Below is the code snippet: + +```python +{code} +``` + +Return the file paths in the following JSON format: +{{"file_paths": ["/path/to/image1.jpg", "/other/path/to/data.json"]}}""" + ) + ) + except json.JSONDecodeError: + return + + text_file_ext = [ + ".txt", + ".md", + "rtf", + ".html", + ".htm", + "xml", + ".json", + ".csv", + ".tsv", + ".yaml", + ".yml", + ".toml", + ".conf", + ".env" ".ini", + ".log", + ".py", + ".java", + ".js", + ".cpp", + ".c" ".sql", + ".sh", + ] + + if "file_paths" in response and isinstance(response["file_paths"], list): + for file_path in response["file_paths"]: + read_mode = "r" if Path(file_path).suffix in text_file_ext else "rb" + if Path(file_path).is_file(): + with open(file_path, read_mode) as f: + artifacts[Path(file_path).name] = f.read() + + META_TOOL_DOCSTRING = get_tool_documentation( [ get_tool_descriptions, @@ -822,7 +829,6 @@ def use_object_detection_fine_tuning( generate_vision_plan, generate_vision_code, edit_vision_code, - write_media_artifact, view_media_artifact, object_detection_fine_tuning, use_object_detection_fine_tuning, diff --git a/vision_agent/tools/tools.py b/vision_agent/tools/tools.py index 45f10c33..86e484b2 100644 --- a/vision_agent/tools/tools.py +++ b/vision_agent/tools/tools.py @@ -181,6 +181,8 @@ def owl_v2_image( """ image_size = image.shape[:2] + if image_size[0] < 1 or image_size[1] < 1: + return [] if fine_tune_id is not None: image_b64 = convert_to_b64(image) @@ -413,6 +415,9 @@ def florence2_sam2_image( }, ] """ + if image.shape[0] < 1 or image.shape[1] < 1: + return [] + if fine_tune_id is not None: image_b64 = convert_to_b64(image) landing_api = LandingPublicAPI() @@ -701,6 +706,8 @@ def countgd_counting( ] """ image_size = image.shape[:2] + if image_size[0] < 1 or image_size[1] < 1: + return [] buffer_bytes = numpy_to_bytes(image) files = [("image", buffer_bytes)] prompt = prompt.replace(", ", " .") @@ -759,6 +766,8 @@ def countgd_example_based_counting( ] """ image_size = image.shape[:2] + if image_size[0] < 1 or image_size[1] < 1: + return [] buffer_bytes = numpy_to_bytes(image) files = [("image", buffer_bytes)] visual_prompts = [ @@ -828,6 +837,8 @@ def ixc25_image_vqa(prompt: str, image: np.ndarray) -> str: >>> ixc25_image_vqa('What is the cat doing?', image) 'drinking milk' """ + if image.shape[0] < 1 or image.shape[1] < 1: + raise ValueError(f"Image is empty, image shape: {image.shape}") buffer_bytes = numpy_to_bytes(image) files = [("image", buffer_bytes)] @@ -871,47 +882,6 @@ def ixc25_video_vqa(prompt: str, frames: List[np.ndarray]) -> str: return cast(str, data["answer"]) -def ixc25_temporal_localization(prompt: str, frames: List[np.ndarray]) -> List[bool]: - """'ixc25_temporal_localization' uses ixc25_video_vqa to temporally segment a video - given a prompt that can be other an object or a phrase. It returns a list of - boolean values indicating whether the object or phrase is present in the - corresponding frame. - - Parameters: - prompt (str): The question about the video - frames (List[np.ndarray]): The reference frames used for the question - - Returns: - List[bool]: A list of boolean values indicating whether the object or phrase is - present in the corresponding frame. - - Example - ------- - >>> output = ixc25_temporal_localization('soccer goal', frames) - >>> print(output) - [False, False, False, True, True, True, False, False, False, False] - >>> save_video([f for i, f in enumerate(frames) if output[i]], 'output.mp4') - """ - - buffer_bytes = frames_to_bytes(frames) - files = [("video", buffer_bytes)] - payload = { - "prompt": prompt, - "chunk_length": 2, - "function_name": "ixc25_temporal_localization", - } - data: List[int] = send_inference_request( - payload, - "video-temporal-localization?model=internlm-xcomposer", - files=files, - v2=True, - ) - chunk_size = round(len(frames) / len(data)) - data_explode = [[elt] * chunk_size for elt in data] - data_bool = [bool(elt) for sublist in data_explode for elt in sublist] - return data_bool[: len(frames)] - - def gpt4o_image_vqa(prompt: str, image: np.ndarray) -> str: """'gpt4o_image_vqa' is a tool that can answer any questions about arbitrary images including regular images or images of documents or presentations. It returns text @@ -1024,6 +994,9 @@ def clip(image: np.ndarray, classes: List[str]) -> Dict[str, Any]: {"labels": ["dog", "cat", "bird"], "scores": [0.68, 0.30, 0.02]}, """ + if image.shape[0] < 1 or image.shape[1] < 1: + return {"labels": [], "scores": []} + image_b64 = convert_to_b64(image) data = { "prompt": ",".join(classes), @@ -1052,6 +1025,8 @@ def vit_image_classification(image: np.ndarray) -> Dict[str, Any]: >>> vit_image_classification(image) {"labels": ["leopard", "lemur, otter", "bird"], "scores": [0.68, 0.30, 0.02]}, """ + if image.shape[0] < 1 or image.shape[1] < 1: + return {"labels": [], "scores": []} image_b64 = convert_to_b64(image) data = { @@ -1080,6 +1055,8 @@ def vit_nsfw_classification(image: np.ndarray) -> Dict[str, Any]: >>> vit_nsfw_classification(image) {"label": "normal", "scores": 0.68}, """ + if image.shape[0] < 1 or image.shape[1] < 1: + raise ValueError(f"Image is empty, image shape: {image.shape}") image_b64 = convert_to_b64(image) data = { @@ -1180,6 +1157,8 @@ def florence2_phrase_grounding( ] """ image_size = image.shape[:2] + if image_size[0] < 1 or image_size[1] < 1: + return [] image_b64 = convert_to_b64(image) if fine_tune_id is not None: @@ -1399,6 +1378,8 @@ def detr_segmentation(image: np.ndarray) -> List[Dict[str, Any]]: }, ] """ + if image.shape[0] < 1 or image.shape[1] < 1: + return [] image_b64 = convert_to_b64(image) data = { "image": image_b64, @@ -1442,6 +1423,9 @@ def depth_anything_v2(image: np.ndarray) -> np.ndarray: [10, 11, 15, ..., 202, 202, 205], [10, 10, 10, ..., 200, 200, 200]], dtype=uint8), """ + if image.shape[0] < 1 or image.shape[1] < 1: + raise ValueError(f"Image is empty, image shape: {image.shape}") + image_b64 = convert_to_b64(image) data = { "image": image_b64,