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