diff --git a/tools/standalone_llm_tool.py b/tools/standalone_llm_tool.py index 3c13291..8b9479b 100644 --- a/tools/standalone_llm_tool.py +++ b/tools/standalone_llm_tool.py @@ -9,6 +9,9 @@ import urllib.error class StandaloneLLMTool(BaseTool): def __init__(self): self.client = OpenAI(api_key=os.environ.get("OPENAI_API_KEY")) + self.copilot_url = os.getenv("COPILOT_API_URL") + if not self.copilot_url: + logging.warning("COPILOT_API_URL environment variable not set. call_external_copilot will not function.") def clear(self): pass @@ -55,28 +58,27 @@ class StandaloneLLMTool(BaseTool): "prompt": { "type": "string", "description": "The plain text prompt to send to the external copilot." - }, - "url": { - "type": "string", - "description": "The URL of the external copilot's API endpoint (e.g., 'http://localhost:8000/copilot')." } }, - "required": ["prompt", "url"] + "required": ["prompt"] } }, "_tags": ["copilot", "external", "http"] } ] - def _call_external_copilot(self, prompt: str, url: str): - logging.info(f"Calling external copilot at URL: {url} with prompt: {prompt[:50]}...") - if not url.startswith('http://') and not url.startswith('https://'): - error_message = f"Invalid URL scheme for external copilot: {url}. URL must start with http:// or https://" + def _call_external_copilot(self, prompt: str): + if not self.copilot_url: + return "Error: COPILOT_API_URL environment variable is not set. Cannot call external copilot." + + logging.info(f"Calling external copilot at URL: {self.copilot_url} with prompt: {prompt[:50]}...") + if not self.copilot_url.startswith('http://') and not self.copilot_url.startswith('https://'): + error_message = f"Invalid URL scheme for external copilot: {self.copilot_url}. URL must start with http:// or https://" logging.error(error_message) return error_message try: req = urllib.request.Request( - url, + self.copilot_url, data=prompt.encode('utf-8'), headers={'Content-Type': 'text/plain; charset=utf-8', 'User-Agent': 'DualAICopilot/0.1'}, method='POST' @@ -87,7 +89,7 @@ class StandaloneLLMTool(BaseTool): logging.info(f"Received response from external copilot: {response_data[:100]}...") return response_data else: - error_message = f"External copilot at {url} returned an error: {response.status} {response.reason}" + error_message = f"External copilot at {self.copilot_url} returned an error: {response.status} {response.reason}" logging.error(error_message) return error_message # Return error as string except urllib.error.HTTPError as e: @@ -96,15 +98,15 @@ class StandaloneLLMTool(BaseTool): error_body = e.read().decode('utf-8', 'replace') # Added error decoding fallback except Exception: pass - error_message = f"HTTP Error {e.code} calling external copilot at {url}: {e.reason}. Response: {error_body}" + error_message = f"HTTP Error {e.code} calling external copilot at {self.copilot_url}: {e.reason}. Response: {error_body}" logging.error(error_message) return error_message except urllib.error.URLError as e: - error_message = f"URL Error calling external copilot at {url}: {e.reason}" + error_message = f"URL Error calling external copilot at {self.copilot_url}: {e.reason}" logging.error(error_message) return error_message except Exception as e: - error_message = f"An unexpected error occurred while calling external copilot at {url}: {str(e)}" + error_message = f"An unexpected error occurred while calling external copilot at {self.copilot_url}: {str(e)}" logging.error(error_message) return error_message @@ -114,7 +116,7 @@ class StandaloneLLMTool(BaseTool): max_tokens = kwargs.get("max_tokens", 16384) # Default from spec return self.call_external_llm(kwargs.get("prompt"), model, max_tokens) elif function_name == "call_external_copilot": - return self._call_external_copilot(kwargs.get("prompt"), kwargs.get("url")) + return self._call_external_copilot(kwargs.get("prompt")) else: error_message = f"Unknown function: {function_name}" logging.error(error_message)