def call_(
        self,
        task: Task,
        llm_model: str = None,
        retry: int = 3
    ) -> Any:
        """
        Call GPT-4 with optional tools and MCP servers.

        Args:
            prompt: The input prompt for GPT-4
            response_format: The expected response format (can be a type or Pydantic model)
            tools: Optional list of tool names to use
            retry: Number of retries for failed calls (default: 3)

        Returns:
            The response in the specified format
        """
        # Try to get the current event loop
        try:
            loop = asyncio.get_running_loop()
            if loop.is_running():
                # If there's a running loop, run the async function in that loop
                return asyncio.run_coroutine_threadsafe(self.call_async_(task, llm_model, retry), loop).result()
            else:
                # If there's a loop but it's not running, use asyncio.run
                return asyncio.run(self.call_async_(task, llm_model, retry))
        except RuntimeError:
            # No event loop exists, create one with asyncio.run
            return asyncio.run(self.call_async_(task, llm_model, retry))

        Call GPT-4 with optional tools and MCP servers.

        Args:
            prompt: The input prompt for GPT-4
            response_format: The expected response format (can be a type or Pydantic model)
            tools: Optional list of tool names to use
            retry: Number of retries for failed calls (default: 3)

        Returns:
            The response in the specified format
        
src/upsonic/client/level_one/call.py