Key technical highlights
🔹 LangGraph StateGraph – clean state machine with nodes for extraction, validation, agent, and tools
🔹 True tool calling – LLM emits a tool call → ToolNode executes it → result returns to LLM (no manual shortcuts)
🔹 Structured output – ChatOpenAI.with_structured_output(ShipmentDetails) replaces fragile JSON parsing
🔹 Human‑in‑the‑loop – interrupt() pauses the graph, waits for user input, then resumes with Command(resume=...)
🔹 Checkpointing – MemorySaver preserves conversation state across interruptions
🔹 Pydantic validation – weight, dimensions, and required fields validated before shipment creation