Spaces:
Sleeping
Sleeping
| # backend/fixed_output.py | |
| import os | |
| import warnings | |
| import json | |
| BASE = os.path.dirname(os.path.abspath(__file__)) | |
| def parse_fixed_md(content: str): | |
| lines = [line.strip() for line in content.split("\n") if line.strip()] | |
| result = { | |
| "type": None, | |
| "trigger": None, | |
| "steps": [], | |
| "options": [], | |
| "text": None | |
| } | |
| # ------------------------- | |
| # TYPE | |
| # ------------------------- | |
| if lines[0].startswith("TYPE:"): | |
| result["type"] = lines[0].split(":", 1)[1].strip() | |
| lines = lines[1:] | |
| # ------------------------- | |
| # TRIGGER | |
| # ------------------------- | |
| if lines and lines[0].startswith("TRIGGER:"): | |
| result["trigger"] = [ | |
| t.strip() for t in lines[0].split(":", 1)[1].split(",") | |
| ] | |
| lines = lines[1:] | |
| skill_type = result["type"] | |
| # ------------------------- | |
| # multi-step-options(多步驟) | |
| # ------------------------- | |
| if skill_type == "multi-step-options": | |
| steps = [] | |
| current_step = None | |
| i = 0 | |
| while i < len(lines): | |
| line = lines[i] | |
| if line == "[STEP]": | |
| if current_step: | |
| steps.append(current_step) | |
| i += 1 | |
| label = lines[i] if i < len(lines) else "" | |
| current_step = {"label": label, "options": []} | |
| elif line.startswith("-") and current_step: | |
| option = line.lstrip("-").strip() | |
| current_step["options"].append(option) | |
| i += 1 | |
| if current_step: | |
| steps.append(current_step) | |
| result["steps"] = steps | |
| warnings.warn(json.dumps(result, ensure_ascii=False, indent=2)) | |
| return result | |
| # ------------------------- | |
| # multi-options(單步驟多選) | |
| # ------------------------- | |
| if skill_type == "multi-options": | |
| result["options"] = [ | |
| line.lstrip("-").strip() | |
| for line in lines if line.startswith("-") | |
| ] | |
| return result | |
| # ------------------------- | |
| # fixed-sequence(固定句子) | |
| # ------------------------- | |
| if skill_type == "fixed-sequence": | |
| steps = [] | |
| for line in lines: | |
| if line.startswith("[STEP]"): | |
| label = line.replace("[STEP]", "").strip() | |
| steps.append({ | |
| "label": label, | |
| "options": [label] | |
| }) | |
| continue | |
| if line.startswith("-"): | |
| text = line.lstrip("-").strip() | |
| steps.append({ | |
| "label": text, | |
| "options": [text] | |
| }) | |
| continue | |
| result["steps"] = steps | |
| return result | |
| # ------------------------- | |
| # fallback | |
| # ------------------------- | |
| result["raw"] = content | |
| return result | |
| def run_fixed_output(field_name: str): | |
| path = os.path.join(BASE, "skills", f"{field_name}_fixed", f"{field_name}.md") | |
| if not os.path.exists(path): | |
| return f"[Error] 找不到固定輸出:{path}" | |
| with open(path, "r", encoding="utf-8") as f: | |
| content = f.read().strip() | |
| return parse_fixed_md(content) |