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