From d9e46762759232fcf5b1a34f6388f4d4df52465a Mon Sep 17 00:00:00 2001 From: 7000pctAUTO Date: Wed, 4 Feb 2026 12:32:36 +0000 Subject: [PATCH] Add testing module (ab_test, metrics, validator) --- src/promptforge/testing/validator.py | 43 ++++++++++++++++++++++++++++ 1 file changed, 43 insertions(+) create mode 100644 src/promptforge/testing/validator.py diff --git a/src/promptforge/testing/validator.py b/src/promptforge/testing/validator.py new file mode 100644 index 0000000..0a09f13 --- /dev/null +++ b/src/promptforge/testing/validator.py @@ -0,0 +1,43 @@ +import re +from typing import Any, Dict, List, Optional +import json + +from ..core.prompt import ValidationRule +from ..core.exceptions import ValidationError + + +class Validator: + def __init__(self, rules: Optional[List[ValidationRule]] = None): + self.rules = rules or [] + + def validate(self, response: str) -> List[str]: + errors = [] + + for rule in self.rules: + if rule.type == "regex": + if rule.pattern and not re.search(rule.pattern, response): + errors.append(rule.message or f"Response failed regex validation") + + elif rule.type == "json": + try: + json.loads(response) + except json.JSONDecodeError: + errors.append(rule.message or "Response is not valid JSON") + + elif rule.type == "length": + min_len = rule.json_schema.get("minLength", 0) if rule.json_schema else 0 + max_len = rule.json_schema.get("maxLength", float("inf")) if rule.json_schema else float("inf") + if len(response) < min_len or len(response) > max_len: + errors.append(rule.message or f"Response length must be between {min_len} and {max_len}") + + return errors + + def is_valid(self, response: str) -> bool: + return len(self.validate(response)) == 0 + + @staticmethod + def from_prompt_rules(rules: List[Dict[str, Any]]) -> "Validator": + validation_rules = [] + for rule_data in rules: + validation_rules.append(ValidationRule(**rule_data)) + return Validator(validation_rules) \ No newline at end of file