import re import json import argparse from pathlib import Path def _split_blocks(text): parts = re.split(r"^={80}\n", text, flags=re.M) return [p.strip() for p in parts if p.strip()] def _extract_query(text): query_match = re.search(r"^Query:\s*(.+)$", text, re.M) if not query_match: return "" return query_match.group(1).strip() def parse_output_txt(path, query=None): with open(path, "r", encoding="utf-8") as f: text = f.read() blocks = _split_blocks(text) if not blocks: raise ValueError("No output blocks found in output.txt") chosen_block = blocks[-1] if query: for block in reversed(blocks): if _extract_query(block) == query: chosen_block = block break text = chosen_block # Extract query query_match = re.search(r"^Query:\s*(.+)$", text, re.M) query = query_match.group(1).strip() # Extract chunks chunk_pattern = re.compile( r"\[(\d+)\]\s+Score:\s+([\d.]+)\s+\|\s+ID:\s+([^\n]+)\n\s+(.*?)(?=\n\n|\Z)", re.S ) results = [] for _, score, chunk_id, content in chunk_pattern.findall(text): results.append({ "chunk_id": chunk_id.strip(), "score": float(score), "content": content.strip() }) return { "query": query, "retrieved_results": results } if __name__ == "__main__": parser = argparse.ArgumentParser(description="Parse the latest output block.") parser.add_argument("--query", help="Query text to match in output.txt") args = parser.parse_args() parsed = parse_output_txt("../04_vectoredb/output.txt", query=args.query) with open("parsed_input.json", "w") as f: json.dump(parsed, f, indent=2) print("Parsed input written to parsed_input.json")