"""Validate an agent directory's config.yaml. Parses and validates the agent spec using the same parser and validator that ``omnigent server`` uses. A passing validation means the agent will load and serve correctly. """ import yaml from omnigent_client import tool from omnigent.errors import OmnigentError @tool def validate_agent(path: str) -> str: """ Validate an agent directory's config.yaml. Returns ``"Valid: "`` if the spec is correct, or a list of errors if something is wrong. Use this after creating an agent to verify it will work. :param path: Path to the agent directory containing config.yaml, e.g. ``"/workspace/my-agent"`` or a workspace-relative ``"my-agent"``. :returns: A user-facing status string — ``"Valid: ..."`` on success, ``"Error: ..."`` or ``"Parse error: ..."`` on failure. """ import os from pathlib import Path if not path: return "Error: 'path' parameter is required." agent_path = Path(path) # Resolve relative paths against the conversation workspace so # validate_agent("my-agent") works from sandbox mode without the # LLM needing to know the absolute workspace path. if not agent_path.is_absolute(): workspace = os.environ.get("_AP_WORKSPACE") if workspace: agent_path = Path(workspace) / agent_path if not agent_path.exists(): return f"Error: directory '{agent_path}' does not exist." config_yaml = agent_path / "config.yaml" if not config_yaml.exists(): return f"Error: no config.yaml found in '{agent_path}'." try: from omnigent.spec.parser import parse from omnigent.spec.validator import validate # expand_env=False: the generated agent may reference env vars # like ${OPENAI_API_KEY} that aren't set in the current process. # These are resolved at deploy/run time, not at creation time. spec = parse(agent_path, expand_env=False) result = validate(spec) if result.valid: return f"Valid: agent '{spec.name}' parsed and validated successfully." errors = "; ".join(f"{e.path}: {e.message}" for e in result.errors) return f"Validation errors: {errors}" except (OmnigentError, yaml.YAMLError, FileNotFoundError, OSError) as exc: return f"Parse error: {exc}"