""" chatbotApi tool registry / execution HTTP client. """ import os from typing import Any, Dict, List, Optional import httpx CHATBOT_API_BASE_URL = os.getenv( "CHATBOT_API_BASE_URL", os.getenv("TOOL_API_BASE_URL", "http://127.0.0.1:8086/api"), ).rstrip("/") INTERNAL_TOOL_API_KEY = os.getenv("INTERNAL_TOOL_API_KEY", "") TOOL_TIMEOUT = float(os.getenv("CHATBOT_TOOL_TIMEOUT", "30")) class ChatbotToolClient: """Fetch tool schemas and execute domain tools via chatbotApi.""" def __init__(self, base_url: Optional[str] = None, timeout: float = TOOL_TIMEOUT): self.base_url = (base_url or CHATBOT_API_BASE_URL).rstrip("/") headers = {} if INTERNAL_TOOL_API_KEY: headers["X-Internal-Tool-Key"] = INTERNAL_TOOL_API_KEY self.client = httpx.Client(timeout=timeout, headers=headers) def list_tool_definitions(self) -> List[Dict[str, Any]]: url = f"{self.base_url}/v1/tools/definitions" response = self.client.get(url) response.raise_for_status() payload = response.json() return payload.get("tools") or [] def execute_tool( self, tool_name: str, arguments: Dict[str, Any], *, bot_id: Optional[str] = None, user_input: Optional[str] = None, ) -> Dict[str, Any]: url = f"{self.base_url}/v1/tools/execute" body = { "toolName": tool_name, "arguments": arguments or {}, "botId": bot_id, "userInput": user_input, } response = self.client.post(url, json=body) response.raise_for_status() return response.json() def close(self) -> None: self.client.close()