robotmcp--ros-mcp-server
db1d565b64
Integration Tests / melodic (push) Has been cancelled
Integration Tests / noetic (push) Has been cancelled
Integration Tests / humble (push) Has been cancelled
Integration Tests / jazzy (push) Has been cancelled
Ruff Lint & Format / ruff (push) Has been cancelled
Sync main to develop / Check if sync is needed (push) Has been cancelled
Sync main to develop / Sync main to develop (push) Has been cancelled
89 行
2.8 KiB
Python
89 行
2.8 KiB
Python
from pathlib import Path
|
|
|
|
import yaml
|
|
|
|
|
|
def load_robot_config(robot_name: str, specs_dir: str) -> dict:
|
|
"""
|
|
Load the robot configuration from a YAML file by robot name.
|
|
|
|
Args:
|
|
robot_name (str): The name of the robot.
|
|
specs_dir (str): Directory containing robot specification files.
|
|
|
|
Returns:
|
|
dict: The robot configuration.
|
|
|
|
Raises:
|
|
FileNotFoundError: If the YAML file does not exist.
|
|
"""
|
|
file_path = Path(specs_dir) / f"{robot_name}.yaml"
|
|
|
|
if not file_path.exists():
|
|
raise FileNotFoundError(f"Robot config file not found: {file_path}")
|
|
|
|
with file_path.open("r") as file:
|
|
return yaml.safe_load(file) or {}
|
|
|
|
|
|
def get_verified_robot_spec_util(name: str) -> dict:
|
|
"""
|
|
Get the verified robot specification in a more accessible format.
|
|
|
|
Args:
|
|
name (str): The name of the robot.
|
|
|
|
Returns:
|
|
dict: Parsed robot configuration with robot name as key.
|
|
"""
|
|
# Resolve relative to the project root (two levels up from utils)
|
|
specs_dir = Path(__file__).parent.parent.parent / "robot_specifications"
|
|
|
|
name = name.replace(" ", "_")
|
|
config = load_robot_config(name, str(specs_dir))
|
|
parsed_config = {}
|
|
|
|
# Check if the loaded config has the required fields
|
|
if not config:
|
|
raise ValueError(f"No configuration found for robot '{name}'")
|
|
|
|
# Check required fields
|
|
for field in ("type", "prompts"):
|
|
if field not in config or config[field] in (None, ""):
|
|
raise ValueError(f"Robot '{name}' is missing required field: {field}")
|
|
|
|
# Create configuration with robot name as key
|
|
parsed_config[name] = {"type": config["type"], "prompts": config["prompts"]}
|
|
|
|
return parsed_config
|
|
|
|
|
|
def get_verified_robots_list_util() -> dict:
|
|
"""
|
|
Get a list of all available robot specification files.
|
|
|
|
Returns:
|
|
dict: List of available robot names that can be used with get_verified_robot_spec_util.
|
|
"""
|
|
# Resolve relative to the project root (two levels up from utils)
|
|
specs_path = Path(__file__).parent.parent.parent / "robot_specifications"
|
|
|
|
if not specs_path.exists():
|
|
return {"error": f"Robot specifications directory not found: {specs_path}"}
|
|
|
|
try:
|
|
# Find all YAML files in the specifications directory
|
|
yaml_files = list(specs_path.glob("*.yaml"))
|
|
|
|
if not yaml_files:
|
|
return {"error": "No robot specification files found"}
|
|
|
|
# Extract robot names (file names without .yaml extension)
|
|
robot_names = [file.stem for file in yaml_files]
|
|
robot_names.sort() # Sort alphabetically for consistency
|
|
|
|
return {"robot_specifications": robot_names, "count": len(robot_names)}
|
|
|
|
except Exception as e:
|
|
return {"error": f"Failed to read robot specifications directory: {str(e)}"}
|