Begin implementation, basic inferenece
This commit is contained in:
47
sia/util.py
Normal file
47
sia/util.py
Normal file
@@ -0,0 +1,47 @@
|
||||
from .inference_result import InferenceResult
|
||||
|
||||
import xml.etree.ElementTree as ET
|
||||
import re
|
||||
|
||||
def get_valid_root_elements(schema: str) -> set:
|
||||
"""
|
||||
Extract valid root element names from the XML schema.
|
||||
|
||||
Args:
|
||||
schema: XML schema string
|
||||
|
||||
Returns:
|
||||
set: Set of valid root element names
|
||||
"""
|
||||
try:
|
||||
schema = schema.strip()
|
||||
ET.register_namespace('xs', 'http://www.w3.org/2001/XMLSchema')
|
||||
root = ET.fromstring(schema)
|
||||
ns = {'xs': 'http://www.w3.org/2001/XMLSchema'}
|
||||
elements = root.findall(".//xs:element", ns)
|
||||
return {elem.get('name') for elem in elements if elem.get('name')}
|
||||
except ET.ParseError as e:
|
||||
print(f"Error parsing schema: {e}")
|
||||
return set()
|
||||
|
||||
def split_response(response: str, valid_elements: set) -> InferenceResult:
|
||||
"""
|
||||
Split the response into reasoning and actions based on valid XML elements.
|
||||
|
||||
Args:
|
||||
response: Raw response string from the model
|
||||
valid_elements: Set of valid root element names from the schema
|
||||
|
||||
Returns:
|
||||
InferenceResult: Tuple containing reasoning and actions
|
||||
"""
|
||||
elements_pattern = '|'.join(map(re.escape, valid_elements))
|
||||
pattern = f"<({elements_pattern})[^>]*>"
|
||||
matches = list(re.finditer(pattern, response))
|
||||
if not matches:
|
||||
return InferenceResult(response.strip(), "")
|
||||
last_match = matches[-1]
|
||||
split_point = last_match.start()
|
||||
reasoning = response[:split_point].strip()
|
||||
actions = response[split_point:].strip()
|
||||
return InferenceResult(reasoning, actions)
|
||||
Reference in New Issue
Block a user