Have you ever wanted to build an AI assistant that can actually respond to questions about the weather using real-time data? In this blog post, I’ll show you how to build a smart agent that integrates LangGraph, LangChain, OpenAI, and a weather API to deliver real-time temperature updates.
We’ll build a conversational agent that:
✅ Understands your messages with GPT-4
✅ Detects when to use tools (like checking the weather)
✅ Returns the current temperature for any given location
Let’s dive in. 🌍🌦️
📦 Requirements
Before we begin, make sure you have the following Python packages installed:
pip install python-weather openai langchain langgraph python-dotenv
Also, grab your OpenAI API key and pop it into a .env
file like so:
OPENAI_API_KEY=your-api-key-here
🧠 The Code
Step 1: Set Up Environment & Imports
We start by importing all the necessary libraries and loading our environment variables.
from dotenv import load_dotenv
from openai import OpenAI
import python_weather
import asyncio
from langgraph.graph import END, START, StateGraph, MessagesState
from langchain_openai import ChatOpenAI
from langchain_core.tools import tool
from langgraph.prebuilt import ToolNode
from typing import Literal
load_dotenv()
Step 2: Create a Weather Tool 🌡️
We use python_weather
to fetch the current temperature asynchronously.
async def generate_response(location):
async with python_weather.Client(unit=python_weather.IMPERIAL) as client:
weather = await client.get(location)
return weather.temperature
@tool
def get_weather(location: str):
"""Call to get the current temperature."""
return asyncio.run(generate_response(location))
This tool will later be integrated with our AI agent.
Step 3: Connect Tools to the Model
Next, we bind the get_weather
tool to GPT-4 using LangChain’s ChatOpenAI
.
tools = [get_weather]
model = ChatOpenAI(model="gpt-4o-mini").bind_tools(tools)
Step 4: Create the Agent Workflow using LangGraph
Here's where the magic happens! We define how the agent will think and act using a graph-based workflow.
def call_model(state: MessagesState):
messages = state["messages"]
response = model.invoke(messages)
return {"messages": [response]}
def should_continue(state: MessagesState) -> Literal["tools", END]:
messages = state["messages"]
last_message = messages[-1]
if last_message.tool_calls:
return "tools"
return END
workflow = StateGraph(MessagesState)
tool_node = ToolNode(tools)
workflow.add_node("agent", call_model)
workflow.add_node("tools", tool_node)
workflow.add_edge(START, "agent")
workflow.add_conditional_edges("agent", should_continue)
workflow.add_edge("tools", "agent")
graph = workflow.compile()
This setup allows the agent to:
- Respond to user input
- Decide if it needs a tool
- Call the weather tool if needed
- Respond again with the result
Step 5: Visualize the Workflow 🌐
If you're using Jupyter, visualize your agent's graph with Mermaid:
from IPython.display import Image, display
from langchain_core.runnables.graph import MermaidDrawMethod
display(
Image(
graph.get_graph().draw_mermaid_png(
draw_method=MermaidDrawMethod.API,
)
)
)
Step 6: Try It Out!
Let’s test how the agent responds to different types of messages.
from langchain_core.messages import HumanMessage
messages1 = [HumanMessage(content="Hello, how are you?")]
messages2 = [HumanMessage(content="How is the temperature in Lagos?")]
graph.invoke({"messages": messages1})
graph.invoke({"messages": messages2})
You’ll see GPT-4 respond conversationally to the first, and call the weather tool for the second. 🎯
🚀 Wrap-Up
You now have a fully functioning conversational AI agent that can:
✅ Understand user intent
✅ Decide when to use external tools
✅ Fetch real-time weather data
✅ Reply intelligently using GPT-4
This is just scratching the surface. You could add more tools (news, calendar, reminders) and turn this into a real personal assistant.
Got questions or building something similar? Drop a comment below! 🧠💬
Happy coding!
Top comments (0)