CoolFace
Apppublic

cjoyy/ops-agent

sourceHugging Faceupdated 3mo agoView on Hugging Face
0likes
main.py71 linesDownload Raw Back to root
1import sys2from uuid import uuid43 4from langgraph.checkpoint.sqlite import SqliteSaver5from langgraph.types import Command6 7from graph_supervisor import get_app, get_message_content8 9 10def build_initial_state(ticket: str) -> dict:11    return {12        "messages": [ticket],13        "resolved_categories": [],14        "needs_followup": False,15        "followup_category": None,16        "runbook_context": "",17    }18 19 20def ask_security_approval(interrupts) -> bool:21    interrupt_value = interrupts[0].value if interrupts else {}22 23    print("\n=== Human Approval Required ===")24    print("Action:", interrupt_value.get("action"))25    print("Ticket summary:", interrupt_value.get("ticket_summary"))26    print("Proposed action:", interrupt_value.get("proposed_action"))27 28    while True:29        answer = input("Approve action? [y/n]: ").strip().lower()30        if answer in {"y", "yes"}:31            return True32        if answer in {"n", "no"}:33            return False34        print("Please answer y or n.")35 36 37def run_ticket(ticket: str) -> dict:38    thread_id = f"main-{uuid4()}"39    config = {"configurable": {"thread_id": thread_id}}40 41    with SqliteSaver.from_conn_string("checkpoints.sqlite") as checkpointer:42        app = get_app(checkpointer)43        result = app.invoke(build_initial_state(ticket), config=config)44 45        while "__interrupt__" in result:46            approved = ask_security_approval(result["__interrupt__"])47            result = app.invoke(48                Command(resume={"approved": approved}),49                config=config,50            )51 52        return result53 54 55def main():56    if len(sys.argv) < 2:57        print('Usage: python main.py "isi ticket di sini"')58        raise SystemExit(1)59 60    ticket = " ".join(sys.argv[1:])61    result = run_ticket(ticket)62 63    print("\n=== Final Response ===")64    print("Category:", result.get("category"))65    print("Resolved categories:", result.get("resolved_categories", []))66    print(get_message_content(result["messages"][-1]))67 68 69if __name__ == "__main__":70    main()71