|
|
from api_data_structure import HiveComputeAPI |
|
|
from utils import logger, create_success_response, handle_exception |
|
|
from typing import Dict, Any |
|
|
from fastmcp import FastMCP |
|
|
from constant import Constants |
|
|
|
|
|
mcp = FastMCP( |
|
|
name="Compute with Hivenet MCP" |
|
|
) |
|
|
|
|
|
@mcp.tool() |
|
|
async def create_compute_instance(name: str = "default", location: str = "uae", config: str = "2x RTX 4090") -> Dict[str, Any]: |
|
|
""" |
|
|
Create a new compute instance with the specified configuration. |
|
|
|
|
|
Args: |
|
|
name: Name of the instance. Defaults to "default". |
|
|
location: Location where the instance will be deployed. Defaults to "uae". |
|
|
Valid locations: france, uae, texas, uae-2 |
|
|
config: Predefined configuration. Defaults to "1x RTX 4090". |
|
|
GPU configs: "1x RTX 4090", "2x RTX 4090", "4x RTX 4090", "8x RTX 4090", |
|
|
"1x RTX 5090", "2x RTX 5090", "4x RTX 5090", "8x RTX 5090" |
|
|
vCPU configs: "2vCPU", "4vCPU", "8vCPU", "16vCPU", "32vCPU" |
|
|
|
|
|
Returns: |
|
|
Dict containing the created instance information. |
|
|
""" |
|
|
token = Constants.HIVE_COMPUTE_DEFAULT_API_TOKEN |
|
|
api_handler = HiveComputeAPI(token=token) |
|
|
try: |
|
|
logger.info(f"Creating compute instance: name={name}, location={location}, config={config}") |
|
|
result = api_handler.create_instance(name=name, location=location, config=config) |
|
|
|
|
|
if result is None: |
|
|
logger.error(f"Failed to create instance - API returned None") |
|
|
return { |
|
|
"status": "error", |
|
|
"error": "Failed to create instance. Check API logs for details." |
|
|
} |
|
|
|
|
|
logger.info(f"Successfully created instance: {result.id if hasattr(result, 'id') else 'unknown'}") |
|
|
return create_success_response(result) |
|
|
except Exception as e: |
|
|
logger.error(f"Exception creating instance: {str(e)}") |
|
|
return handle_exception(e, "create_compute_instance") |
|
|
|
|
|
@mcp.tool() |
|
|
async def list_all_compute_instances(category: str = None) -> Dict[str, Any]: |
|
|
""" |
|
|
List all instances belonging to the user, organized into 4 categories: RUNNING, STOPPED, ERRORED, and TERMINATED. |
|
|
Shows basic information about each instance, including ID, name, status, location, spending, and resource allocation. |
|
|
Spending information includes hourly price and total in EUR spent so far. |
|
|
|
|
|
Args: |
|
|
category: Optional filter to return only instances from a specific category. |
|
|
Valid values: "RUNNING", "STOPPED", "ERRORED", "TERMINATED". |
|
|
If not provided, returns all categories. |
|
|
|
|
|
Returns: |
|
|
Dict containing instances. If category is specified, returns only instances from that category. |
|
|
If category is not specified, returns all instances organized by status categories. |
|
|
""" |
|
|
token = Constants.HIVE_COMPUTE_DEFAULT_API_TOKEN |
|
|
api_handler = HiveComputeAPI(token=token) |
|
|
try: |
|
|
logger.info(f"Listing all compute instances for token: {token}, category filter: {category}") |
|
|
all_instances = api_handler.get_all_instances() |
|
|
|
|
|
|
|
|
categorized = { |
|
|
"RUNNING": [], |
|
|
"STOPPED": [], |
|
|
"ERRORED": [], |
|
|
"TERMINATED": [] |
|
|
} |
|
|
|
|
|
for inst in all_instances: |
|
|
status = inst.status_string |
|
|
|
|
|
if status in ["RUNNING"]: |
|
|
categorized["RUNNING"].append(inst) |
|
|
elif status in ["STOPPED"]: |
|
|
categorized["STOPPED"].append(inst) |
|
|
elif status == "ERRORED": |
|
|
categorized["ERRORED"].append(inst) |
|
|
elif status in ["TERMINATED"]: |
|
|
categorized["TERMINATED"].append(inst) |
|
|
|
|
|
|
|
|
if category and category.upper() in categorized: |
|
|
return create_success_response(categorized[category.upper()]) |
|
|
|
|
|
|
|
|
return create_success_response(categorized) |
|
|
except Exception as e: |
|
|
return handle_exception(e, "list_all_compute_instances") |
|
|
|