o2o-negosium-original/agent/negotiation/profiling/script_verifier.py

48 lines
1.8 KiB
Python

import re
import logging
logger = logging.getLogger(__name__)
class ScriptVerifier:
"""수정된 스크립트가 원본의 필수 구조/데이터(파라미터 placeholder)를 유지하는지 검증.
구 N-profiling/script_verifier.py 이식 (로직 동일, 외부 의존성 없음).
"""
def verify_script(self, original_script: list, modified_script: list) -> bool:
if not isinstance(modified_script, list):
logger.warning("Verification Failed: Modified script is not a list.")
return False
original_params = self._extract_params(original_script)
modified_params = self._extract_params(modified_script)
# 원본의 모든 파라미터가 수정본에 존재해야 한다(데이터 주입 보장).
missing_params = original_params - modified_params
if missing_params:
logger.warning(f"Verification Failed: Missing parameters {missing_params}")
return False
# 환각으로 추가된 파라미터(원본에 없던 변수) 금지.
added_params = modified_params - original_params
if added_params:
logger.warning(f"Verification Failed: Added unknown parameters {added_params}")
return False
return True
def _extract_params(self, script: list) -> set:
"""스크립트 구조에서 {param_name} 형태 파라미터를 추출한다."""
params = set()
for block in script:
if not isinstance(block, dict):
continue
children = block.get("children", [])
for child in children:
text = child.get("text", "")
matches = re.findall(r"\{([^}]+)\}", text)
for match in matches:
params.add(match)
return params