| | 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 = 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 |
| |
|