Skip to main content

XML Schema Match (xml_schema_match)

Contents​

Metric description​

XML schema match checks whether the output XML conforms to an XSD (XML Schema Definition). Validation uses settings aimed at safer XML processing.

How to interpret the score​

  • 100: the document satisfies the XSD.
  • 0: the output fails XSD validation (schema rules are not met).
  • No score (null, is_success: false): missing or empty output, missing or invalid XSD in metric_args, or an unexpected evaluation error. Use explanation (not a score of 0) to tell setup or input errors from schema violations.

API usage​

Prerequisites

After the environment variables are configured, the next step is to create a JSON payload for the custom-runs request. For a field-by-field description of the payload (top-level keys, evaluations, and each row in data), see Custom run request body.

Shortname: xml_schema_match

Default threshold: 100

Structural metrics run without an LLM (deterministic checks). Your run may still include model_slug where the API expects it; scoring does not depend on it for this category.

Inputs (each object in data)

  • output (str, required): XML document to validate.

metric_args

  • schema (string | bytes optional): XSD schema content to validate against.
Important

You must supply a non-empty schema in metric_args. Without it, the evaluation returns an error instead of a score.

Eval metadata​

Structural metrics do not populate eval_metadata; the field is omitted or ull on the result object.

Example

import json
import os

import requests
from dotenv import load_dotenv

load_dotenv(override=True)

_API_KEY = os.getenv("AEGIS_API_KEY")
_BASE_URL = os.getenv("AEGIS_API_BASE_URL")
_CUSTOM_RUN_URL = f"{_BASE_URL}/runs/custom"


def post_custom_run(payload: dict) -> requests.Response:
"""POST JSON payload to Aegis custom runs; returns the raw response."""
headers = {
"Content-Type": "application/json",
"Authorization": f"Bearer {_API_KEY}",
}
return requests.post(
_CUSTOM_RUN_URL,
headers=headers,
data=json.dumps(payload),
)


if __name__ == "__main__":
data = [
{"output": "<book><title>Example</title></book>"}
]

payload = {
"threshold": 100,
"model_slug": "o4-mini",
"is_blocking": True,
"data_collection_id": None,
"evaluations": [
{
"metrics": [
{
"metric": "xml_schema_match",
"metric_args": {
"schema": """<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="book">
<xs:complexType>
<xs:sequence>
<xs:element name="title" type="xs:string"/>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:schema>""",
},
},
],
"threshold": 100,
"model_slug": "o4-mini",
"data": data,
}
],
}

response = post_custom_run(payload)
response.raise_for_status()
print(json.dumps(response.json(), indent=2))