xiaoximew's picture
Init
031beb8
import json
from typing import Any, Dict, List, Union
import requests
from pydantic import BaseModel
class ReActStep(BaseModel):
"""RaAct 推理步骤"""
thought: Dict[str, Union[Dict[str, str], str]]
action: str
action_input: Dict[str, str]
observation: Dict[str, Any] = {}
def to_str(self) -> str:
s = f"Thought: {self.thought}\n"
s += f"Action: {self.action}\n"
s += f"Action Input: {self.action_input}\n"
if self.observation:
s += f"Observation: {self.observation}\n"
return s
class RequstField(BaseModel):
"""请求体字段"""
enum: List[str]
name: str
description: str
is_required: bool
parament_type: str
@property
def to_simple_dict(self) -> Dict[str, Any]:
data = {
"description": self.description,
"required": self.is_required,
}
if self.enum:
data["enum"] = self.enum
return data
class Plugin(BaseModel):
"""插件"""
url: str
method: str
headers: Dict[str, str]
request_body: List[RequstField]
name_for_human: str
description_for_human: str
description_for_model: str
unique_name_for_model: str
@property
def parameter_schema(self) -> str:
parameter = {}
for field in self.request_body:
if not field.is_required:
continue
parameter[field.name] = field.to_simple_dict
return json.dumps(parameter, ensure_ascii=False)
def run(self, **kwargs):
"""运行插件"""
response = requests.request(
self.method.upper(),
self.url,
headers=self.headers,
params=kwargs,
json=kwargs,
)
return response.text
@property
def required_parameters(self) -> List[RequstField]:
"""必填参数"""
return [field for field in self.request_body if field.is_required]