cjoyy/ops-agent
0
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 