chore: import upstream snapshot with attribution
This commit is contained in:
@@ -0,0 +1,68 @@
|
||||
"""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: <agent-name>"`` 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: <name>..."`` 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}"
|
||||
Reference in New Issue
Block a user