| 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 | |
| from schemas import layout_refiner_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'] | |
| json_obj_new = json.loads(message["content"]) | |
| if "items" in json_obj_new["children_objects"]: | |
| json_obj_new = {"children_objects" : json_obj_new["children_objects"]["items"]} | |
| is_success = False | |
| try: | |
| validate(instance=json_obj_new, schema=layout_refiner_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_refiner_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, | |
| ) | |
| layout_refiner = autogen.AssistantAgent( | |
| name = "Layout_refiner", | |
| llm_config = gpt4_json_config, | |
| is_termination_msg = is_termination_msg, | |
| human_input_mode = "NEVER", | |
| system_message = """ Layout Refiner. Every time when the Admin speaks; you will look at the parent object and children objects, the first | |
| preposition that connects these objects and find a second suitable relative placement for the children objects whilst considering the initial positioning of the object. | |
| Give the relative placement of the children objects with each other and with the parent object! For example, if there are five children objects that are 'on' the parent | |
| object, give the relative positions of the children objects to one another and the second preposition to the the parent object ('on' is the first preposition). | |
| Use only the following JSON Schema to save the JSON object: | |
| { | |
| "children_objects" : { | |
| "type" : "array", | |
| "items" : { | |
| "type" : "object", | |
| "properties" : { | |
| "name_id" : { | |
| "type" : "string" | |
| }, | |
| "placement" : { | |
| "type" : "object", | |
| "properties" : { | |
| "children_objects" : { | |
| "type" : "array", | |
| "items" : { | |
| "type" : "object", | |
| "properties" : { | |
| "name_id" : { | |
| "type" : "string", | |
| "description" : "The name_id of the other child object" | |
| }, | |
| "preposition" : { | |
| "type" : "string", | |
| "description" : "The preposition that connects this object and the connected object, ex. left of the desk, behind the plant, the rug is under the desk...", | |
| "enum" : ["on", "left of", "right of", "in front", "behind", "under", "above"] | |
| }, | |
| "is_adjacent" : { | |
| "type" : "boolean", | |
| "description" : "Whether this object and the connected object are adjacent to each other, ex. an object on the desk is adjacent to the desk." | |
| } | |
| }, | |
| "required" : ["name_id", "preposition", "is_adjacent"] | |
| } | |
| } | |
| }, | |
| "required" : ["children_objects"] | |
| } | |
| }, | |
| "required" : ["name_id", "placement"] | |
| } | |
| }, | |
| } | |
| """ | |
| ) | |
| return user_proxy, json_schema_debugger, layout_refiner | |