ControlLLM / cllm /agents /tog /compiler.py
zwgao's picture
add file
3fdcc70
raw
history blame contribute delete
No virus
1.96 kB
from typing import List, Union
import ast
import sys
import os
sys.path.append(os.getcwd())
from .cllm.agents.base import Action
class Parser:
def parse(self, plan) -> List[Action]:
# ignore indent
input = "\n".join([line.strip() for line in plan.split("\n")])
actions = []
for stmt in ast.parse(input).body:
if isinstance(stmt, ast.Assign):
assign: ast.Assign = stmt
output: ast.Name = assign.targets[0]
func_call: ast.Call = assign.value
func_name: ast.Name = func_call.func
kwargs: List[ast.keyword] = func_call.keywords
args = {}
for kwarg in kwargs:
k = kwarg.arg
if isinstance(kwarg.value, ast.Name):
v = kwarg.value.id
else:
v = ast.literal_eval(kwarg.value)
args[k] = v
action = Action(
tool_name=func_name.id, outputs=[output.id], inputs=args
)
actions.append(action)
return actions
class Compiler:
def __init__(self):
self.parser = Parser()
def compile(self, plan: Union[str, List[Union[Action, str]]]) -> List[Action]:
"""The input could be a plain string, a list of structured `Action`
or combination of structured `Action` or unstructured action string.
"""
actions = self.parse(plan)
actions = self.correct(actions)
return actions
def parse(self, plan) -> List[Action]:
if isinstance(plan, str):
return self.parser.parse(plan)
actions = []
for action in plan:
if isinstance(action, str):
action = self.parser.parse(action)[0]
actions.append(action)
return actions
def correct(self, actions):
return actions