You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
155 lines
3.5 KiB
155 lines
3.5 KiB
from enum import Enum, unique, auto
|
|
import abc
|
|
import hashlib
|
|
import re
|
|
from typing import List, Optional
|
|
import json
|
|
from dataclasses import dataclass, field
|
|
|
|
|
|
@unique
|
|
class LLMStatusCode(Enum):
|
|
SUCCESS = 0
|
|
ERROR = 1
|
|
|
|
|
|
@unique
|
|
class NodeType(Enum):
|
|
action = auto()
|
|
trigger = auto()
|
|
|
|
|
|
@unique
|
|
class WorkflowType(Enum):
|
|
Main = auto()
|
|
Sub = auto()
|
|
|
|
|
|
@unique
|
|
class ToolCallStatus(Enum):
|
|
ToolCallSuccess = auto()
|
|
ToolCallPartlySuccess = auto()
|
|
NoSuchTool = auto()
|
|
NoSuchFunction = auto()
|
|
InputCannotParsed = auto()
|
|
|
|
UndefinedParam = auto()
|
|
ParamTypeError = auto()
|
|
UnSupportedParam = auto()
|
|
UnsupportedExpression = auto()
|
|
ExpressionError = auto()
|
|
RequiredParamUnprovided = auto()
|
|
|
|
|
|
@unique
|
|
class TestDataType(Enum):
|
|
NoInput = auto()
|
|
TriggerInput = auto()
|
|
ActionInput = auto()
|
|
SubWorkflowInput = auto()
|
|
|
|
|
|
@unique
|
|
class RunTimeStatus(Enum):
|
|
FunctionExecuteSuccess = auto()
|
|
TriggerAcivatedSuccess = auto()
|
|
ErrorRaisedHere = auto()
|
|
ErrorRaisedInner = auto()
|
|
DidNotImplemented = auto()
|
|
DidNotBeenCalled = auto()
|
|
|
|
|
|
@dataclass
|
|
class TestResult:
|
|
"""
|
|
Responsible for handling the data structure of [{}]
|
|
"""
|
|
|
|
data_type: TestDataType = TestDataType.ActionInput
|
|
|
|
input_data: Optional[list] = field(default_factory=lambda: [])
|
|
|
|
runtime_status: RunTimeStatus = RunTimeStatus.DidNotBeenCalled
|
|
visit_times: int = 0
|
|
|
|
error_message: str = ""
|
|
output_data: Optional[list] = field(default_factory=lambda: [])
|
|
|
|
def load_from_json(self):
|
|
pass
|
|
|
|
def to_json(self):
|
|
pass
|
|
|
|
def to_str(self):
|
|
prompt = f"""
|
|
This function has been executed for {self.visit_times} times. Last execution:
|
|
1.Status: {self.runtime_status.name}
|
|
2.Input:
|
|
{self.input_data}
|
|
|
|
3.Output:
|
|
{self.output_data}"""
|
|
return prompt
|
|
|
|
|
|
@dataclass
|
|
class Action:
|
|
content: str = ""
|
|
thought: str = ""
|
|
plan: List[str] = field(default_factory=lambda: [])
|
|
criticism: str = ""
|
|
tool_name: str = ""
|
|
tool_input: dict = field(default_factory=lambda: {})
|
|
|
|
tool_output_status: ToolCallStatus = ToolCallStatus.ToolCallSuccess
|
|
tool_output: str = ""
|
|
|
|
def to_json(self):
|
|
try:
|
|
tool_output = json.loads(self.tool_output)
|
|
except:
|
|
tool_output = self.tool_output
|
|
return {
|
|
"thought": self.thought,
|
|
"plan": self.plan,
|
|
"criticism": self.criticism,
|
|
"tool_name": self.tool_name,
|
|
"tool_input": self.tool_input,
|
|
"tool_output_status": self.tool_output_status.name,
|
|
"tool_output": tool_output,
|
|
}
|
|
|
|
|
|
@dataclass
|
|
class userQuery:
|
|
task: str
|
|
additional_information: List[str] = field(default_factory=lambda: [])
|
|
refine_prompt: str = field(default_factory=lambda: "")
|
|
|
|
def print_self(self):
|
|
lines = [self.task]
|
|
for info in self.additional_information:
|
|
lines.append(f"- {info}")
|
|
return "\n".join(lines)
|
|
|
|
|
|
class Singleton(abc.ABCMeta, type):
|
|
"""
|
|
Singleton metaclass for ensuring only one instance of a class.
|
|
"""
|
|
|
|
_instances = {}
|
|
|
|
def __call__(cls, *args, **kwargs):
|
|
"""Call method for the singleton metaclass."""
|
|
if cls not in cls._instances:
|
|
cls._instances[cls] = super(Singleton, cls).__call__(*args, **kwargs)
|
|
return cls._instances[cls]
|
|
|
|
|
|
class AbstractSingleton(abc.ABC, metaclass=Singleton):
|
|
"""
|
|
Abstract singleton class for ensuring only one instance of a class.
|
|
"""
|