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.
 
 
 

43 lines
1.7 KiB

import httpx
import json
class CustomToolExecutor:
def __init__(self, tool_def: dict):
self.endpoint_url = tool_def.get("endpoint_url", "")
self.method = tool_def.get("method", "GET")
self.path = tool_def.get("path", "")
self.headers = dict(tool_def.get("headers_json", {}))
self.auth_type = tool_def.get("auth_type", "none")
self.auth_config = dict(tool_def.get("auth_config", {}))
self.timeout = int(tool_def.get("timeout", 30))
async def execute(self, params: dict) -> str:
url = f"{self.endpoint_url.rstrip('/')}/{self.path.lstrip('/')}"
headers = dict(self.headers)
req_params = dict(params)
if self.auth_type == "api_key":
key = self.auth_config.get("key", "")
loc = self.auth_config.get("location", "header")
name = self.auth_config.get("name", "X-API-Key")
if loc == "header":
headers[name] = key
else:
req_params[name] = key
elif self.auth_type == "bearer":
headers["Authorization"] = f"Bearer {self.auth_config.get('token', '')}"
timeout = httpx.Timeout(self.timeout)
async with httpx.AsyncClient(timeout=timeout) as client:
if self.method == "GET":
resp = await client.get(url, params=req_params, headers=headers)
else:
resp = await client.request(
self.method, url, json=req_params, headers=headers
)
try:
data = resp.json()
return json.dumps(data, ensure_ascii=False, indent=2)[:4000]
except Exception:
return resp.text[:4000]