Forem

Beck_Moulton
Beck_Moulton

Posted on

Beyond To-Do Lists: Building a Closed-Loop Health Agent with LangGraph and Google Calendar

Managing health is often a full-time job. Between tracking glucose levels, calculating macros, and managing a hectic work schedule, something usually falls through the cracks. But what if your calendar was "health-aware"? Imagine an AI agent that detects a blood sugar spike or crash and automatically reschedules your next meeting to give you time for a walk or a specific meal.

In this tutorial, we are building a Closed-Loop Health Intervention Agent. Using LangGraph for state management, we'll create a system that monitors Continuous Glucose Monitor (CGM) data, interacts with the Google Calendar API to adjust your life in real-time, and queries the FatSecret API to provide instant nutritional interventions.

By the end of this post, you'll master how to build sophisticated AI Health Agents and implement LLM-driven automation that goes beyond simple chatbots.


The Architecture: A State-Machine for Your Body

Unlike standard RAG pipelines, health interventions require a "stateful" approach. We need to remember the user's current glucose trend and the status of their calendar. LangGraph is perfect for this because it allows us to define a cyclic graph where the AI can "loop" until the health anomaly is resolved.

graph TD
    A[Start: Receive CGM Data] --> B{Analyze Glucose Level}
    B -- Normal --> C[Log & End]
    B -- High/Low Alert --> D[LangGraph Controller]
    D --> E[Tool: Google Calendar API]
    D --> F[Tool: FatSecret API]
    E --> G[Reschedule High-Stress Events]
    F --> H[Generate Recovery Meal Plan]
    G --> I[Notify User via FastAPI]
    H --> I
    I --> J{Resolution Check}
    J -- Pending --> D
    J -- Resolved --> C
Enter fullscreen mode Exit fullscreen mode

Tech Stack

  • LangChain/LangGraph: Orchestrating the agent's logic and state transitions.
  • FatSecret API: Accessing a massive database of food nutrition facts.
  • Google Calendar API: Reading and modifying your schedule.
  • FastAPI: The backbone for our webhook and API endpoints.
  • OpenAI GPT-4o: The "brain" making the intervention decisions.

Step 1: Defining the Agent State

In LangGraph, the State is a shared schema that evolves as each node in our graph executes.

from typing import Annotated, TypedDict, List, Union
from langgraph.graph import StateGraph, END

class AgentState(TypedDict):
    glucose_level: float
    trend: str # Rising, Falling, Stable
    calendar_status: str
    intervention_plan: List[str]
    is_critical: bool
Enter fullscreen mode Exit fullscreen mode

Step 2: The Health Intervention Logic

We’ll define a node that acts as the "Medical Dispatcher." This node looks at the glucose_level and decides if we need to trigger the calendar or diet tools.

import operator
from langchain_openai import ChatOpenAI

llm = ChatOpenAI(model="gpt-4o", temperature=0)

def health_monitor_node(state: AgentState):
    glucose = state['glucose_level']
    # Logic: If glucose > 180 (Hyper) or < 70 (Hypo), trigger intervention
    if glucose > 180 or glucose < 70:
        return {"is_critical": True, "intervention_plan": ["Schedule recovery time"]}
    return {"is_critical": False}

def calendar_adjustment_node(state: AgentState):
    # This is where we call Google Calendar API
    # For now, let's simulate the reschedule
    return {"calendar_status": "Next meeting pushed by 30 mins for a recovery walk."}
Enter fullscreen mode Exit fullscreen mode

Step 3: Integrating FatSecret for Nutritional Support

When a glucose anomaly is detected, the agent shouldn't just say "eat something." It should suggest exactly what to eat based on real data.

from fatsecret import Fatsecret

fs = Fatsecret(CLIENT_ID, CLIENT_SECRET)

def diet_recommendation_node(state: AgentState):
    if state['glucose_level'] < 70:
        # Search for fast-acting carbs
        food = fs.foods_search("Orange Juice")
        return {"intervention_plan": [f"Drink 150ml of {food[0]['food_name']} immediately."]}
    return {"intervention_plan": ["Maintain current hydration."]}
Enter fullscreen mode Exit fullscreen mode

Advanced Patterns & Production Readiness

While this prototype works for a "Learning in Public" project, building a production-grade health agent requires handling edge cases like OAuth token refreshes, HIPAA compliance, and complex conflict resolution in calendars.

For a deeper dive into production-ready AI patterns—including how to handle long-running agent states and advanced multi-agent orchestration—I highly recommend checking out the technical deep-dives at WellAlly Tech Blog. Their insights on "Human-in-the-loop" agent design are essential for anyone building in the healthcare space.


Step 4: Constructing the Graph

Now, let's wire everything together into a functional state machine.

workflow = StateGraph(AgentState)

# Add Nodes
workflow.add_node("monitor", health_monitor_node)
workflow.add_node("reschedule", calendar_adjustment_node)
workflow.add_node("diet_plan", diet_recommendation_node)

# Define Edges
workflow.set_entry_point("monitor")

workflow.add_conditional_edges(
    "monitor",
    lambda x: "critical" if x["is_critical"] else "end",
    {
        "critical": "reschedule",
        "end": END
    }
)

workflow.add_edge("reschedule", "diet_plan")
workflow.add_edge("diet_plan", END)

# Compile
app = workflow.compile()
Enter fullscreen mode Exit fullscreen mode

Step 5: Exposing via FastAPI

Finally, we wrap this in a FastAPI endpoint to receive CGM alerts (e.g., from a Dexcom webhook).

from fastapi import FastAPI

api = FastAPI()

@api.post("/cgm-webhook")
async def handle_glucose_alert(data: dict):
    # Initial state from webhook
    initial_state = {
        "glucose_level": data['value'],
        "trend": data['direction'],
        "calendar_status": "Idle",
        "intervention_plan": [],
        "is_critical": False
    }

    final_output = app.invoke(initial_state)
    return {"status": "Intervention Executed", "details": final_output}
Enter fullscreen mode Exit fullscreen mode

Conclusion: The Future of Proactive AI

We’ve moved from passive tracking to active intervention. By combining LangGraph's state management with real-world APIs like Google Calendar and FatSecret, we've built a tool that actually buys you time and health.

The key takeaway? Agents shouldn't just talk; they should act.

If you enjoyed this build, drop a comment below! What APIs would you connect to your personal health agent? And don't forget to visit the WellAlly Blog for more advanced AI engineering tutorials!

Top comments (0)