feat(analysis): add filtered API workflow runner
This commit is contained in:
@@ -0,0 +1,73 @@
|
||||
"""Queue a model-analysis API workflow and capture both report outputs."""
|
||||
|
||||
from __future__ import annotations
|
||||
|
||||
import argparse
|
||||
import json
|
||||
import sys
|
||||
from pathlib import Path
|
||||
|
||||
import run_cwb_api_workflow as api
|
||||
|
||||
|
||||
DEFAULT_WORKFLOW = Path("ANALYZETESTCANDIDATE_API.json")
|
||||
ANALYSIS_CLASS = "LoRAModelAnalysis"
|
||||
|
||||
|
||||
def _linked_previews(workflow: dict, analysis_id: str) -> dict[int, str]:
|
||||
linked = {}
|
||||
for node_id, node in workflow.items():
|
||||
if node.get("class_type") != "PreviewAny":
|
||||
continue
|
||||
source = node.get("inputs", {}).get("source")
|
||||
if isinstance(source, list) and len(source) == 2 and str(source[0]) == analysis_id:
|
||||
linked[int(source[1])] = node_id
|
||||
missing = [index for index in (0, 1) if index not in linked]
|
||||
if missing:
|
||||
raise RuntimeError(f"Missing PreviewAny capture for analysis output(s): {missing}")
|
||||
return linked
|
||||
|
||||
|
||||
def run_analysis(workflow: dict, server: str, poll_seconds: float) -> dict:
|
||||
analysis_id, _ = api._single_node(workflow, ANALYSIS_CLASS)
|
||||
linked = _linked_previews(workflow, analysis_id)
|
||||
queued = api._json_request(
|
||||
f"{server.rstrip('/')}/prompt",
|
||||
api._prompt_payload(workflow),
|
||||
)
|
||||
prompt_id = queued["prompt_id"]
|
||||
history = api._wait_for_history(server.rstrip("/"), prompt_id, poll_seconds)
|
||||
status = history.get("status", {})
|
||||
if status.get("status_str") == "error":
|
||||
raise RuntimeError(f"Analysis failed: {json.dumps(status, indent=2)}")
|
||||
outputs = history.get("outputs", {})
|
||||
return {
|
||||
"prompt_id": prompt_id,
|
||||
"comparison_report": api._text_output(outputs, linked[0]),
|
||||
"cwb_report": api._text_output(outputs, linked[1]),
|
||||
}
|
||||
|
||||
|
||||
def main() -> int:
|
||||
parser = argparse.ArgumentParser(description="Run a model-analysis API workflow.")
|
||||
parser.add_argument("--workflow", type=Path, default=DEFAULT_WORKFLOW)
|
||||
parser.add_argument("--server", default="http://127.0.0.1:8188")
|
||||
parser.add_argument("--poll-seconds", type=float, default=2.0)
|
||||
parser.add_argument("--result-json", type=Path)
|
||||
args = parser.parse_args()
|
||||
|
||||
workflow = json.loads(args.workflow.read_text(encoding="utf-8"))
|
||||
result = run_analysis(workflow, args.server, args.poll_seconds)
|
||||
if args.result_json:
|
||||
args.result_json.parent.mkdir(parents=True, exist_ok=True)
|
||||
args.result_json.write_text(
|
||||
json.dumps(result, indent=2, ensure_ascii=False) + "\n",
|
||||
encoding="utf-8",
|
||||
)
|
||||
sys.stdout.write(f"Prompt: {result['prompt_id']}\n")
|
||||
sys.stdout.write("Analysis reports captured\n")
|
||||
return 0
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
raise SystemExit(main())
|
||||
Reference in New Issue
Block a user