ControlLLM / cllm /agents /tog /compiler.py
zwgao's picture
add file
3fdcc70
raw
history blame
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