import json from data.field_tree import FieldTree, Field from agents.llm import LLMClient P1 = "You are a COBOL COPYBOOK parser. Output JSON: {\"fields\":[{\"name\":\"...\",\"level\":N,\"pic\":\"...\",\"usage\":\"DISPLAY|COMP-3|COMP\",\"offset\":N,\"length\":N,\"decimal\":N,\"signed\":bool,\"occurs\":N|null,\"redefines\":\"...\"|null,\"conditions\":[{\"name\":\"...\",\"value\":\"...\"}],\"children\":[...]}]} Return JSON only." class Agent1Parser: def __init__(self, llm: LLMClient): self.llm = llm def parse(self, text: str) -> FieldTree: r = self.llm.call([{"role": "system", "content": P1}, {"role": "user", "content": text}]) try: return self._load(json.loads(r)) except: return FieldTree(copybook_name="parse_error") def _load(self, d): return FieldTree(fields=self._fields(d.get("fields", []), 0)) def _fields(self, raw, off): result = [] cur = off for rf in raw: f = Field(name=rf.get("name", ""), level=rf.get("level", 0), pic=rf.get("pic", ""), usage=rf.get("usage", "DISPLAY"), offset=cur, length=rf.get("length", 0), decimal=rf.get("decimal", 0), signed=rf.get("signed", False), occurs=rf.get("occurs"), redefines=rf.get("redefines"), conditions=rf.get("conditions", [])) f.children = self._fields(rf.get("children", []), cur) cur += f.length result.append(f) return result