import autogen from autogen.agentchat.groupchat import GroupChat from autogen.agentchat.agent import Agent from autogen.agentchat.user_proxy_agent import UserProxyAgent from autogen.agentchat.assistant_agent import AssistantAgent from copy import deepcopy from jsonschema import validate import json import re from schemas import layout_corrector_schema, deletion_schema from agents import is_termination_msg class JSONSchemaAgent(UserProxyAgent): def __init__(self, name : str, is_termination_msg): super().__init__(name, is_termination_msg=is_termination_msg) def get_human_input(self, prompt: str) -> str: message = self.last_message() preps_layout = ["left-side", "right-side", "in the middle"] preps_objs = ['on', 'left of', 'right of', 'in front', 'behind', 'under', 'above'] pattern = r'```json\s*([^`]+)\s*```' # Match the json object match = re.search(pattern, message["content"], re.DOTALL).group(1) json_obj_new = json.loads(match) is_success = False try: validate(instance=json_obj_new, schema=layout_corrector_schema) is_success = True except Exception as e: feedback = str(e.message) if e.validator == "enum": if str(preps_objs) in e.message: feedback += f"Change the preposition {e.instance} to something suitable with the intended positioning from the list {preps_objs}" elif str(preps_layout) in e.message: feedback += f"Change the preposition {e.instance} to something suitable with the intended positioning from the list {preps_layout}" if is_success: return "SUCCESS" return feedback config_list_gpt4 = autogen.config_list_from_json( "OAI_CONFIG_LIST.json", ) gpt4_config = { "cache_seed": 42, "temperature": 0.0, "config_list": config_list_gpt4, "timeout": 500, } gpt4_json_config = deepcopy(gpt4_config) gpt4_json_config["config_list"][0]["response_format"] = { "type": "json_object" } def get_corrector_agents(): user_proxy = autogen.UserProxyAgent( name="Admin", system_message = "A human admin.", is_termination_msg = is_termination_msg, human_input_mode = "NEVER", code_execution_config=False ) json_schema_debugger = JSONSchemaAgent( name = "Json_schema_debugger", is_termination_msg = is_termination_msg, ) spatial_corrector_agent = AssistantAgent( name="Spatial_corrector_agent", llm_config=gpt4_config, is_termination_msg=is_termination_msg, human_input_mode="NEVER", system_message=f""" Spatial Corrector Agent. Whenever a user provides an object that don't fit the room for various spatial conflicts, You are going to make changes to its "scene_graph" and "facing_object" keys so that these conflicts are removed. You are going to use the JSON Schema to validate the JSON object that the user provides. For relative placement with other objects in the room use the prepositions "on", "left of", "right of", "in front", "behind", "under". For relative placement with the room layout elements (walls, the middle of the room, ceiling) use the prepositions "on", "in the corner". Use only the following JSON Schema to save the JSON object: {layout_corrector_schema} """ ) object_deletion_agent = AssistantAgent( name="Object_deletion_agent", llm_config=gpt4_json_config, is_termination_msg=is_termination_msg, human_input_mode="NEVER", system_message=f""" Object Deletion Agent. When a user provides a list of objects that doesn't fit the room, select one object to delete that would be less essential for the room. An example JSON output: {deletion_schema} """ ) return user_proxy, json_schema_debugger, spatial_corrector_agent, object_deletion_agent