Skip to content

Instantly share code, notes, and snippets.

@DiegoHernanSalazar
Last active August 22, 2025 16:36
Show Gist options
  • Select an option

  • Save DiegoHernanSalazar/233e78e70f82f2583d3c4f90d50d5a32 to your computer and use it in GitHub Desktop.

Select an option

Save DiegoHernanSalazar/233e78e70f82f2583d3c4f90d50d5a32 to your computer and use it in GitHub Desktop.
DeepLearning.AI - LangChain - Tavily: Lesson 6: Essay Writer
Display the source blob
Display the rendered blob
Raw
{
"metadata": {
"kernelspec": {
"name": "python",
"display_name": "Python (Pyodide)",
"language": "python"
},
"language_info": {
"codemirror_mode": {
"name": "python",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.8"
}
},
"nbformat_minor": 5,
"nbformat": 4,
"cells": [
{
"id": "6a160428-2703-43d3-ad34-8595907b1265",
"cell_type": "markdown",
"source": "<img src=\"https://media.licdn.com/dms/image/sync/v2/D5627AQGTZahmqVia0w/articleshare-shrink_800/articleshare-shrink_800/0/1735447634970?e=2147483647&v=beta&t=f8-WnRWXXPIOJzOk74aASHT6dfSRE-syA_kxPxjWuSM\"/>",
"metadata": {}
},
{
"id": "23566d66-e6ca-488b-80b3-965007cac60a",
"cell_type": "markdown",
"source": "# Lesson 6: Essay Writer",
"metadata": {}
},
{
"id": "8d480093-f2c1-4fc2-8d69-3b2e6e67eaa6",
"cell_type": "code",
"source": "# Loads environment variables from a file called '.env'. \n# This function does not return data directly, \n# but loads the variables into the runtime environment.\nfrom dotenv import load_dotenv\n\n# load environment variables from a '.env' file into the \n# current directory or process's environment\n# This is our OpenAI API key\n_ = load_dotenv()",
"metadata": {
"trusted": true
},
"outputs": [],
"execution_count": null
},
{
"id": "3e7680d6-4ee9-4447-90c4-814ab77b0497",
"cell_type": "code",
"source": "# 'StateGraph' and 'END' are used to construct graphs. \n# 'StateGraph' allows nodes to communicate, by reading and writing to a common state. \n# The 'END' node is used to signal the completion of a graph, \n# ensuring that cycles eventually conclude.\nfrom langgraph.graph import StateGraph, END\n\n# The typing module in Python, which includes 'TypedDict' and 'Annotated', \n# provides tools for creating advanced type annotations. \n# 'TypedDict allows you to define {dictionaries}={messages} with specific types for each 'key',\n# while 'Annotated' ADDS new data or messages values to LangChain types.\n# 'TypedDict' and 'Annotated' are used to construct the class AgentState()\n# 'List' is a generic type used to indicate lists of a specific type\nfrom typing import TypedDict, Annotated, List\n\n# 'operator' module provides efficient functions that correspond to the \n# language's intrinsic operators. It offers functions for mathematical, logical, relational, \n# bitwise, and other operations. For example, operator.add(x, y) is equivalent to x + y.\n# It's useful for situations where you need to treat 'operators' as 'functions()'.\n# 'operator' is used to construct the class AgentState()\nimport operator\n\n# 'SqliteSaver()' class in LangGraph is used for saving checkpoints \n# in a SQLite database.\nfrom langgraph.checkpoint.sqlite import SqliteSaver\n\n# Messages in LangChain are classified into different roles/types: \n# 'SystemMessage' <- 'system', 'HumanMessage' <- 'user', 'AIMessage' <- 'assistant' \n# 'AnyMessage' <- 'Any historical message', ChatMessage <- \nfrom langchain_core.messages import AnyMessage, SystemMessage, HumanMessage, AIMessage, ChatMessage\n\n# Create a 'SqliteSaver()' instance (obj) that saves data in memory, \n# rather than to a file on disk. The \":memory:\" parameter\n# specifies that the built-in (under the hood) SQLite database will be \n# created and maintained entirely in system RAM -> checkpoint (obj)\n# If we refresh the notebook, this saved SQLite database will disappear.\nmemory = SqliteSaver.from_conn_string(\":memory:\")",
"metadata": {
"trusted": true
},
"outputs": [],
"execution_count": null
},
{
"id": "4e88c90d-63a7-46a3-ab82-17874ec5b173",
"cell_type": "code",
"source": "# More Complex Agent State\nclass AgentState(TypedDict):\n \n # ‘key’ of Human ’user’ input as type ’string’ (str). \n # The topic what we’re trying to write an essay about.\n task: str\n \n # ‘key’ of ‘Plan’ node as type ‘string’ (str), \n # contains the plan generated by of AI agent\n plan: str\n \n # ‘key’ of ‘draft‘ document for the essay /Documento borrador/ \n # as type ‘string‘ (str)\n draft: str\n \n # ‘key’ of ’critique’ to draft of essay as type ‘string‘ (str)\n critique: str\n \n # ‘key’ of ’content’ as type List of ’strings’-> List[str] -> \n # List of string documents researched backed by Tavily -> \n # [doc_research_str1, doc_research_ str2, doc_research_3, ...]\n content: List[str]\n \n # ‘key’ of ’max_revisions’ as type (int) -> \n # keeps track of the number of docs revisions we’ve made\n revision_number: int\n \n # ‘key’ of ’revision_number’ as type (int) -> \n # keeps track to the MAX number of docs revisions, we want to make\n max_revisions: int",
"metadata": {
"trusted": true
},
"outputs": [],
"execution_count": null
},
{
"id": "45c52b85-5f02-489b-beae-05b8fc9b4b49",
"cell_type": "code",
"source": "# To start using OpenAI chat models on Langchain, you need to install \n# the 'langchain-openai' library and set the 'OPENAI_API_KEY' environment variable\n# to your OpenAI API key.\n# This is a container/wrapper of OpenAI API in LangChain, exposing a standard\n# interface for ALL Language Models (LM). It means that even we'll use 'ChatOpenAI',\n# we can change it to any other different Language Model (LM) provider, that\n# LangChain supports, without changing any other lines of code.\nfrom langchain_openai import ChatOpenAI\n\n# Use \"gpt-3.5-turbo\" as model from OpenAI. \n# temperature = 0 -> NO creativity in model, to AVOID hallucinations\nmodel = ChatOpenAI(model=\"gpt-3.5-turbo\", temperature=0)",
"metadata": {
"trusted": true
},
"outputs": [],
"execution_count": null
},
{
"id": "1b4b0643-4f5e-4d6c-972e-99f7b3f32eef",
"cell_type": "code",
"source": "# “Prompt” for the LLM, that’s going to ‘write out a plan’ (at plan node) for our essay\nPLAN_PROMPT = \"\"\"You are an expert writer tasked with writing a high level outline of an essay. \\\nWrite such an outline for the user provided topic. Give an outline of the essay along with any relevant notes \\\nor instructions for the sections.\"\"\"",
"metadata": {
"trusted": true
},
"outputs": [],
"execution_count": null
},
{
"id": "2da03e4b-67b0-4cc2-86b1-5b25f8167ac5",
"cell_type": "code",
"source": "# “Prompt” with instructions about how to write / generate the essay, \n# given ALL the content previously researched, and backed by Tavily\nWRITER_PROMPT = \"\"\"You are an essay assistant tasked with writing excellent 5-paragraph essays.\\\nGenerate the best essay possible for the user's request and the initial outline. \\\nIf the user provides critique, respond with a revised version of your previous attempts. \\\nUtilize all the information below as needed: \n\n------\n\n{content}\"\"\"",
"metadata": {
"trusted": true
},
"outputs": [],
"execution_count": null
},
{
"id": "d51f4630-ac85-415e-a2df-c793b48bc81e",
"cell_type": "code",
"source": "# \"Prompt\" with instructions for grading / qualifying / critique essay\nREFLECTION_PROMPT = \"\"\"You are a teacher grading an essay submission. \\\nGenerate critique and recommendations for the user's submission. \\\nProvide detailed recommendations, including requests for length, depth, style, etc.\"\"\"",
"metadata": {
"trusted": true
},
"outputs": [],
"execution_count": null
},
{
"id": "9e037d77-2e2d-42ce-965c-5a6af4f2fc3f",
"cell_type": "code",
"source": "# “Prompt” with instructions for doing research, searching info and providing this to write essay, \n# after the planning step.\nRESEARCH_PLAN_PROMPT = \"\"\"You are a researcher charged with providing information that can \\\nbe used when writing the following essay. Generate a list of search queries that will gather \\\nany relevant information. Only generate 3 queries max.\"\"\"\n",
"metadata": {
"trusted": true
},
"outputs": [],
"execution_count": null
},
{
"id": "ea9e6db1-de79-4a00-a2dd-decfe31f684f",
"cell_type": "code",
"source": "# “Prompt” with instructions of gathering any relevant information based on critique. \n# Generate a list of search queries. Only generate 3 queries max, based on critique, to obtain information.\nRESEARCH_CRITIQUE_PROMPT = \"\"\"You are a researcher charged with providing information that can \\\nbe used when making any requested revisions (as outlined below). \\\nGenerate a list of search queries that will gather any relevant information. Only generate 3 queries max.\"\"\"",
"metadata": {
"trusted": true
},
"outputs": [],
"execution_count": null
},
{
"id": "918b63a7-6c88-4103-9331-b953284b53ab",
"cell_type": "code",
"source": "# 'BaseModel’ is crucial to use pydantic-based data models in the ‘langchain_core’ library \n# 'BaseModel’ represents the result that we want to get back from LM -> \n# List of 'strings’ -> List[str] -> [’str_query1’, ’str_query2’, ’str_query3’]\nfrom langchain_core.pydantic_v1 import BaseModel\n\nclass Queries(BaseModel):\n \n # Data model we want to get back is a List of 'strings’ -> \n # value -> List[str] -> [’str_query1’, ’str_query2’, ’str_query3’]\n # key -> queries \n queries: List[str]",
"metadata": {
"trusted": true
},
"outputs": [],
"execution_count": null
},
{
"id": "f51b0fcf-f60e-4096-8b42-99877759c9c7",
"cell_type": "code",
"source": "# Provides a way to interact with the operating system (os)\nimport os\n\n# Import 'TavilyClient' function to interact with the 'Tavily API',\n# which performs web searches.\nfrom tavily import TavilyClient\n\n# Create initial connection to 'Tavily API' \n# using a \"TAVILY_API_KEY\" from the environment variable (at os), \n# via 'TavilyClient' function, creating a 'client(obj)'\nclient = TavilyClient(api_key=os.environ.get(\"TAVILY_API_KEY\"))",
"metadata": {
"trusted": true
},
"outputs": [],
"execution_count": null
},
{
"id": "92884373-c197-4126-a2ca-38522ab6f243",
"cell_type": "code",
"source": "# Create planning node, including as input ‘AgentState’ class / Typed dict { }\ndef plan_node(state: AgentState):\n \n # Create a list of messages -> [’system msg’, ’user msg’]\n messages = [ # Open list\n \n # Add 'system' msg -> 'String’ msg for creating a plan to write an essay outline, \n # related to ’user’ msg provided topic, including instructions for creating \n # each essay section.\n SystemMessage(content=PLAN_PROMPT),\n \n # Add ’user’ msg -> ’String’ msg including ’user’ provided topic of essay, \n # which has to be used for writing about.\n HumanMessage(content=state['task'])\n \n ] # Close list\n \n # Get Agent / model response plan, for input list with [’system’, ’user’] messages, \n # which prompt to create a plan for writting an essay, \n # related to an specific ‘user’ provided topic.\n response = model.invoke(messages)\n \n # Create a dict = {“new key”:value} to return the ’.content’ -> \n # ’text’ of {’Agent’ response msg} as planning result\n return {\"plan\": response.content}",
"metadata": {
"trusted": true
},
"outputs": [],
"execution_count": null
},
{
"id": "c816a0a6-7dfe-4276-85bf-1e70c009a814",
"cell_type": "code",
"source": "# Agent takes in the plan for creating an essay and does some reseach\ndef research_plan_node(state: AgentState):\n \n # Create a list of messages -> [’system msg’, ’user msg’]\n messages = [ # Open list\n \n # Add ’system’ msg -> ’String’ msg with instructions for doing research, \n # searching info and providing a list of queries, gathering as max 3 ones \n # to write this essay, after the planning step.\n SystemMessage(content=RESEARCH_PLAN_PROMPT),\n \n # Add ’user’ msg -> ’String’ msg including ’user’ provided topic of essay, \n # which has to be used for writing about.\n HumanMessage(content=state['task'])\n \n ] # Close list\n \n # Generates some queries /consultas/ based on the list of messages -> [’system msg’, ’user msg’] \n # that includes instructions at ’system’ msg for doing research and getting info \n # (max 3 queries returned) related to a desired essay topic coming at ’user’ msg\n # queries( queries = [’str_query1’, ’str_query2’, ’str_query3’] )\n queries = model.with_structured_output(Queries).invoke(messages)\n \n # Look in state dict { } for ’content’ key value -> List of string documents researched, \n # backed by Tavily, that we’re going to use (if it exist or it’s NOT empty) to write our essay -> \n # List[str] -> [doc_research_str1, doc_research_ str2, doc_research_str3] \n # or if it doesn’t exist, we’re going to create an empty list [ ]\n content = state['content'] or []\n \n # Iterate over each of the ‘queries’ /consultas/, at list\n # [’str_query1’, ’str_query2’, ’str_query3’]\n for q in queries.queries:\n \n # Search for each 'query’ msg /consulta/ in Tavily \n # and get back a research response for each 'query’ msg. \n # Get max ‘2‘ responses for each 'query’ msg\n response = tavily.search(query=q, max_results=2)\n \n # Extract the ’results’ inner dict { }, from each response = { ‘results’: {inner dict value} }, \n # related to each input 'query’ msg\n for r in response['results']:\n \n # From inner dict r = {’content’ : ’Tavily doc research response’ } Append each \n # ’Tavily doc reasearch response‘ string / msg value from ’content’ key, at content list[str] -> \n # content = [doc_research_str1, doc_research_ str2, doc_research_str3] list of ‘strings’ / docs\n content.append(r['content'])\n \n # Create a dict {’key‘:value} with a new key -> \"content\" with value \n # content = [doc_research_str1, doc_research_ str2, doc_research_str3] list of ‘strings’ / docs \n # and return dict {”content”: content}\n return {\"content\": content}",
"metadata": {
"trusted": true
},
"outputs": [],
"execution_count": null
},
{
"id": "27b4121c-60da-4c59-bf90-31d7478ab4e1",
"cell_type": "code",
"source": "# Agent creates a draft of essay, based on tavily researched ‘content’ -> \n# content = [doc_research_str1, doc_research_ str2, doc_research_str3] list of ‘strings’ / docs\ndef generation_node(state: AgentState):\n \n # Join list of Tavily researched documents, splitting them \n # with a Double Enter character -> “\\n\\n”\n content = \"\\n\\n\".join(state['content'] or [])\n \n # Create ’user’ msg combining the ”task” with topic of essay, and the \n # ”plan” with instructions for creating each essay section.\n user_message = HumanMessage(\n \n content=f\"{state['task']}\\n\\nHere is my plan:\\n\\n{state['plan']}\")\n \n # Create a list of messages with -> [’system msg’, ’user msg’]\n messages = [ # Open list\n \n # Add prompt with instructions about how to write / generate the essay, \n # including the ’content splitted by double enter character ”\\n\\n” ’ \n # previously researched, and backed by Tavily\n SystemMessage(\n content=WRITER_PROMPT.format(content=content)\n ),\n \n # Topic of essay + Plan with instructions for creating each essay section\n user_message\n\n ] # Close list\n \n # Get {Agent Written Essay Draft} dict for the List of messages -> \n # [’system msg’, ’user msg’] input\n response = model.invoke(messages)\n \n # UPDATE \"draft\" key value -> Agent written Draft essay \n # and UPDATE \"revision_number” key value -> current_revision_number (Init as 1 when doesn‘t exist) + 1 \n # This is useful for tracking and managing multiple versions of a draft essay\n return {\n \"draft\": response.content, \n \"revision_number\": state.get(\"revision_number\", 1) + 1\n }",
"metadata": {
"trusted": true
},
"outputs": [],
"execution_count": null
},
{
"id": "349151e6-0a25-47c2-94e2-2ae228064b36",
"cell_type": "code",
"source": "# Node that takes instructions for grading / qualifying / critiquing essay, with detailed recommendations, \n# including length, depth, style as ’system‘ msg -> REFLECTION_PROMPT. \n# It also takes in the Agent written Draft essay as ‘user’ msg, and response with a critique.\ndef reflection_node(state: AgentState):\n \n # Create a list of message -> [’system msg’, ’user msg’]\n messages = [ # Open list\n \n # Add Instructions for grading / qualifying / critiquing essay, with detailed recommendations \n # including length, depth, style -> ’system’ msg\n SystemMessage(content=REFLECTION_PROMPT),\n \n # Add \"draft\" key value, or Agent written Draft essay -> ‘user’ msg \n HumanMessage(content=state['draft'])\n \n ] # Close list \n \n # Get critique / reflection of Draft Agent Essay\n response = model.invoke(messages)\n \n # UPDATE \"critique\" key value -> Agent critique / reflection for written Draft essay\n # and return a dict -> {\"critique\", critique 'text'}\n return {\"critique\": response.content}",
"metadata": {
"trusted": true
},
"outputs": [],
"execution_count": null
},
{
"id": "6aa93928-6e80-4b30-838b-e4bc02b23dba",
"cell_type": "code",
"source": "# Node after reflection_node, with instructions of gathering any relevant information based on critique. \n# Generate a list of search queries. Only generate 3 queries max, based on critique, to obtain information. \n# Use returned information to generate a new draft essay.\ndef research_critique_node(state: AgentState):\n \n # Create a list of messages -> [’system msg’, ’user msg’]\n messages = [ # Open list\n \n # Add 'system’ msg with instructions of gathering any relevant information \n # based on critique. Generate a list of search queries (3 max) resultant \n # as information, used for generating a new draft essay.\n SystemMessage(content= RESEARCH_CRITIQUE_PROMPT),\n \n # Add ’user’ msg including Agent critique / reflection \n # about written Draft essay\n HumanMessage(content=state['critique'])\n \n ] # Close list\n \n # Generates some queries /consultas/ based on the list of messages -> [’system msg’, ’user msg’] \n # that includes instructions at ’system’ msg for doing research consisting on 3 queries max \n # with gathered relevant info related to Agent critique / reflection about written Draft essay\n # coming at ’user’ msg.\n # queries( queries = [’str_query1’, ’str_query2’, ’str_query3’] )\n queries = model.with_structured_output(Queries).invoke(messages)\n \n # Look in state dict { } for ’content’ key value -> List of string documents researched, \n # backed by Tavily, that we’re going to use (if it exist or it’s NOT empty) to re-write our essay -> \n # List[str] -> [doc_research_str1, doc_research_ str2, doc_research_str3] \n # or if it doesn’t exist, we’re going to create an empty list [ ]\n content = state['content'] or []\n \n # Iterate over each of the ‘queries’ /consultas/, at list \n # [’str_query1’, ’str_query2’, ’str_query3’] \n for q in queries.queries:\n \n # Search for each 'query’ msg /consulta/ in Tavily \n # and get back a research response for each 'query’ msg. \n # Get max ‘2‘ responses for each 'query’ msg\n response = tavily.search(query=q, max_results=2)\n \n # Extract the ’results’ inner dict { }, from each response = { ‘results’: {inner dict value} }, \n # related to each input 'query’ msg\n for r in response['results']:\n \n # From inner dict r = {’content’ : ’Tavily doc research response’ } Append each \n # ’Tavily doc reasearch response‘ string / msg value from ’content’ key, at content list[str] -> \n # content = [doc_research_str1, doc_research_ str2, doc_research_str3] list of ‘strings’ / docs\n content.append(r['content'])\n \n # Create a dict {’key‘:value} and Update key -> \"content\" with value \n # content = [doc_research_str1, doc_research_ str2, doc_research_str3] list of ‘strings’ / docs \n # and return dict {”content”: content} \n return {\"content\": content}",
"metadata": {
"trusted": true
},
"outputs": [],
"execution_count": null
},
{
"id": "f9ca5d19-9513-4faa-bb13-d8023a21f3a7",
"cell_type": "code",
"source": "# Create function to be executed at ‘conditional_edge’ \ndef should_continue(state):\n \n # If \"revision_number\" (int) > \"max_revisions\" (int) is 'True'\n if state[\"revision_number\"] > state[\"max_revisions\"]:\n \n # Then execute END node for Finishing\n return END\n \n # Otherwise return the node name “reflection”, \n # which will call 'reflection_node()’ function\n return \"reflect\"",
"metadata": {
"trusted": true
},
"outputs": [],
"execution_count": null
},
{
"id": "6afb05ee-26b0-4ca3-9b78-38c2cc3fdbfc",
"cell_type": "code",
"source": "### Start creating the graph (obj) ###\n# 1st initialize the 'StateGraph' with the 'AgentState' class as input\n# without any nodes or edges attached to it. \n# builder -> 'graph' Agent of states\nbuilder = StateGraph(AgentState)",
"metadata": {
"trusted": true
},
"outputs": [],
"execution_count": null
},
{
"id": "fc8821c7-19c8-4d46-b96f-86481f9a81ac",
"cell_type": "code",
"source": "# Add 'plan_node()' function passing in its name, \n# being the 1st node of the 'graph' for Agent states \n# 'graph -> builder' and ’name’ this 1st node as -> \"planner\"\nbuilder.add_node(\"planner\", plan_node)\n\n# Add 'generation_node()' function passing in its name, \n# being the 3rd node of the 'graph' for Agent states \n# 'graph -> builder' and ’name’ this 3rd node as -> \"generate\"\nbuilder.add_node(\"generate\", generation_node)\n\n# Add 'reflection_node()' function passing in its name, \n# being the 4th node of the 'graph' for Agent states \n# 'graph -> builder' and ’name’ this 4th node as -> \"reflect\"\nbuilder.add_node(\"reflect\", reflection_node)\n\n# Add 'research_plan_node()' function passing in its name, \n# being the 2nd node of the 'graph' for Agent states \n# 'graph -> builder' and ’name’ this 2nd node as -> \"research_plan\"\nbuilder.add_node(\"research_plan\", research_plan_node)\n\n# Add 'research_critique_node()' function passing in its name, \n# being the 5th node of the 'graph' for Agent states \n# 'graph -> builder' and ’name’ this 5th node as -> \"research_critique\"\nbuilder.add_node(\"research_critique\", research_critique_node)",
"metadata": {
"trusted": true
},
"outputs": [],
"execution_count": null
},
{
"id": "89670941-9a2c-4434-a849-a98247863ad4",
"cell_type": "code",
"source": "# Set the entry point of the 'graph -> builder' as \"planner\" node name\nbuilder.set_entry_point(\"planner\")",
"metadata": {
"trusted": true
},
"outputs": [],
"execution_count": null
},
{
"id": "39f019f0-97d5-4740-844b-4364cdaf591c",
"cell_type": "code",
"source": "# Add 'should_continue()' function to be executed \n# as our conditional edge <-/\\-> \n# Conditional Edge <-/\\-> Input is -> \"generate\" output \n# {\"lnode\": \"node_2\", \"count\": 1} response \n# Question -> is \"revision_number\" (int) > \"max_revisions\" (int) -> (True)? \n# We'll use a {Dictionary} to MAP the response of the 'should_continue()' \n# function to the next node to go to. \n# if 'should_continue()' returns END -> Executes ‘END’ node and finish, \n# if 'should_continue()' returns \"reflect\" -> Goes to \"reflect” node name\n# -> 'reflection_node()‘ function\nbuilder.add_conditional_edges(\"generate\", \n should_continue, \n {END: END, \"reflect\": \"reflect\"})\n",
"metadata": {
"trusted": true
},
"outputs": [],
"execution_count": null
},
{
"id": "06aa299f-8f79-466c-8223-027c82dde07a",
"cell_type": "code",
"source": "# Add a regular edge 1st argument: Start of edge (->) 2nd argument: End of edge \n# From 'planner' node (->) to 'research_plan' node\nbuilder.add_edge(\"planner\", \"research_plan\")\n\n# Add a regular edge 1st argument: Start of edge (->) 2nd argument: End of edge \n# From ’research_plan' node (->) to 'generate' node\nbuilder.add_edge(\"research_plan\", \"generate\")\n\n# Add a regular edge 1st argument: Start of edge (->) 2nd argument: End of edge \n# From ‘reflect' node (->) to 'research_critique' node\nbuilder.add_edge(\"reflect\", \"research_critique\")\n\n# Add a regular edge 1st argument: Start of edge (->) 2nd argument: End of edge \n# From ‘research_critique' node (->) back to 'generate' node\nbuilder.add_edge(\"research_critique\", \"generate\")",
"metadata": {
"trusted": true
},
"outputs": [],
"execution_count": null
},
{
"id": "2a89fea9-c092-4620-9d73-64ec27fa9061",
"cell_type": "code",
"source": "# ‘obj.compile()' the ’graph -> builder’ so updates / overwrite this \n# as a NEW compiled graph (obj). Do this after we've done all the setups, \n# and we'll turn it into a LangChain runnable/executable \n# A LangChain runnable exposes a standard interface for calling \n# and invoking this graph (obj). \n# ADD checkpointer = memory for saving data using Sync or Async SQLite database \n# (short term memory in notebook).\ngraph = builder.compile(checkpointer=memory)",
"metadata": {
"trusted": true
},
"outputs": [],
"execution_count": null
},
{
"id": "aa87414e-8f1c-4ace-940d-0f0e6c587104",
"cell_type": "code",
"source": "# Get 'Image' function for plotting a png image for 'graph'\nfrom IPython.display import Image \n\n# Let's apply '.get_graph().draw_png()' over 'graph (obj)'\n# for plotting png 'Image' for this 'graph (obj)'\nImage(graph.get_graph().draw_png())",
"metadata": {
"trusted": true
},
"outputs": [],
"execution_count": null
},
{
"id": "c9a4e058-0262-4030-a0d3-e5b2c952f639",
"cell_type": "code",
"source": "from PIL import Image\nimg = Image.open(\"Lesson_6 graph.png\")\nimg",
"metadata": {
"trusted": true
},
"outputs": [
{
"execution_count": 1,
"output_type": "execute_result",
"data": {
"text/plain": "<PIL.PngImagePlugin.PngImageFile image mode=RGBA size=521x779>",
"image/png": "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hARIgARIgARsRYBKgq26g40hARIgARIgAfsQoJJgn75gS0iABEiABEjAVgSoJNiqO9gYEiABEiABErAPASoJ9ukLtoQESIAESIAEbEWASoKtuoONIQESIAESIAH7EKCSYJ++YEtIgARIgARIwFYEqCTYqjvYGBIgARIgARKwDwEqCfbpC7aEBEiABEiABGxFgEqCrbqDjSEBEiABEiAB+xCgkmCfvmBLSIAESIAESMBWBKgk2Ko72BgSIAESIAESsA8BKgn26Qu2hARIgARIgARsRYBKgq26g40hARIgARIgAfsQoJJgn75gS0iABEiABEjAVgSoJNiqO9gYEiABEiABErAPASoJ9ukLtoQESIAESIAEbEWASoKtuoONIQESIAESIAH7EKCSYJ++YEtIgARIgARIwFYEqCTYqjvYGBIgARIgARKwDwEqCfbpC7aEBEiABEiABGxFgEqCrbqDjSEBEiABEiAB+xCgkmCfvmBLSIAESIAESMBWBKgk2Ko72BgSIAESIAESsA8BKgn26Qu2hARIgARIgARsRYBKgq26g40hARIgARIgAfsQoJJgn75gS0iABEiABEjAVgSoJNiqO9gYEiABEiABErAPASoJ9ukLtoQESIAESIAEbEWASoKtuoONIQESIAESIAH7EKCSYJ++YEtIgARIgARIwFYEqCTYqjvYGBIgARIgARKwDwEqCfbpC7aEBEiABEiABGxFgEqCrbqDjSEBEiABEiAB+xCgkmCfvmBLSIAESIAESMBWBKgk2Ko72BgSIAESIAESsA8BKgn26Qu2hARIgARIgARsRYBKgq26g40hARIgARIgAfsQoJJgn75gS0iABEiABEjAVgSoJNiqO9gYEiABEiABErAPASoJ9ukLtoQESIAESIAEbEWASoKtuoONIQESIAESIAH7EKCSYJ++YEtIgARIgARIwFYEqCTYqjvYGBIgARIgARKwDwEqCfbpC7aEBEiABEiABGxFgEqCrbqDjSEBEiABEiAB+xCgkmCfvmBLSIAESIAESMBWBKgk2Ko72BgSIAESIAESsA8BKgn26Qu2hARIgARIgARsRYBKgq26g40hARIgARIgAfsQoJJgn75gS0iABEiABEjAVgSoJNiqO9gYEiABEiABErAPASoJ9ukLtoQESIAESIAEbEWASoKtuoONIQESIAESIAH7EKCS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CByeIgESIAESIAE3E6CS4Obep+wkQAIkQAIkEIQAlYQgcHiKBEiABEiABNxMgEqCm3ufspMACZAACZBAEAJUEoLA4SkSIAESIAEScDMBKglu7n3KTgIkQAIkQAJBCFBJCAKHp0iABEiABEjAzQSoJLi59yk7CZAACZAACQQhQCUhCByeIgESIAESIAE3E6CS4Obep+wkQAIkQAIkEIQAlYQgcHiKBEiABEiABNxMgEqCm3ufspMACZAACZBAEAJUEoLA4SkSIAESIAEScDMBKglu7n3KTgIkQAIkQAJBCFBJCAKHp0iABEiABEjAzQSoJLi59yk7CZAACZAACQQhQCUhCByeIgESIAESIAE3E6CS4Obep+wkQAIkQAIkEIQAlYQgcHiKBEiABEiABNxMgEqCm3ufspMACZAACZBAEAJUEoLA4SkSIAESIAEScDMBKglu7n3KTgIkQAIkQAJBCFBJCAKHp0iABEiABEjAzQSoJLi59yk7CZAACZAACQQhQCUhCByeIgESIAESIAE3E6CS4Obep+wkQAIkQAIkEIQAlYQgcHiKBEiABEiABNxMgEqCm3ufspMACZAACZBAEAJUEoLA4SkSIAESIAEScDMBKglu7n3KTgIkQAIkQAJBCFBJCAKHp0iABEiABEjAzQSoJLi59yk7CZAACZAACQQhQCUhCByeIgESIAESIAE3E6CS4Obep+wkQAIkQAIkEIQAlYQgcHiKBEiABEiABNxMgEqCm3ufspMACZAACZBAEAJUEoLA4SkSIAESIAEScDMBKglu7n3KTgIkQAIkQAJBCFBJCAKHp0iABEiABEjAzQSoJLi59yk7CZAACZAACQQhQCUhCByeIgESIAESIAE3E6CS4Obep+wkQAIkQAIkEIQAlYQgcHiKBEiABEiABNxMgEqCm3ufspMACZAACZBAEAJUEoLA4SkSIAESIAEScDMBKglu7n3KTgIkQAIkQAJBCFBJCAKHp0iABEiABEjAzQSoJLi59yk7CZAACZAACQQhQCUhCByeIgESIAESIAE3E6CS4Obep+wkQAIkQAIkEIQAlYQgcHiKBEiABEiABNxMINHNwlN2EiCByBJITU3F+vXrs1W6adMm83nNmjVISUnJdq5evXrZPvMDCZBAZAnEeSVFtkrWRgIk4FYChw4dQuXKlbF3795jImjXrh1mzpx5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\n"
},
"metadata": {}
}
],
"execution_count": 1
},
{
"id": "ca716926-3003-4739-9f5f-09ce5be60ca8",
"cell_type": "code",
"source": "# Initialize ‘thread config’ for id = 1 related to ‘task’ or ‘user’ topic -> 1 -> \n# thread = {\"configurable\": {\"thread_id\": \"1\"}} \nthread = {\"configurable\": {\"thread_id\": \"1\"}}\n\nInit_dict = {\n 'task': \"what is the difference between langchain and langsmith\",\n \"max_revisions\": 2,\n \"revision_number\": 1}\n\n# [ {”planner” : {...} }, {”research_plan” : {...} }, {”generate” : {LangChain VS LangSmith 1st draft essay ...} }, \n# {”reflect” : {Critique with strenghts and weaknesses ...} }, {”research_critique” : {Done based on critique...} }, \n# {”generate” : {Again LangChain VS LangSmith 2nd draft essay ...} } ] \nstream_of_events = graph.stream(Init_dict, thread)\n\n# Iterate through each node / event -> [ { }, { }, { }, ...]\nfor s in stream_of_events:\n \n # Print out one (1) node / event {”node_name” ... } per iteration\n print(s)",
"metadata": {
"trusted": true
},
"outputs": [],
"execution_count": null
},
{
"id": "29a4c3a1-ddfb-4cb7-8d63-276b9d793e98",
"cell_type": "markdown",
"source": "```\n{'planner': {'plan': 'I. Introduction\\n A. Brief overview of Langchain and Langsmith\\n B. Thesis statement: Exploring the differences between Langchain and Langsmith\\n\\nII. Langchain\\n A. Definition and explanation\\n B. Key features and characteristics\\n C. Use cases and applications\\n D. Advantages and disadvantages\\n\\nIII. Langsmith\\n A. Definition and explanation\\n B. Key features and characteristics\\n C. Use cases and applications\\n D. Advantages and disadvantages\\n\\nIV. Comparison between Langchain and Langsmith\\n A. Technology stack\\n B. Scalability\\n C. Security\\n D. Performance\\n E. Adoption and popularity\\n\\nV. Conclusion\\n A. Recap of main differences between Langchain and Langsmith\\n B. Future outlook for both technologies\\n C. Final thoughts on the significance of understanding these differences'}}\n```",
"metadata": {}
},
{
"id": "b7efd10f-14cb-4cbe-ac22-96d6ffb2c9e5",
"cell_type": "markdown",
"source": "## Essay Writer Interface",
"metadata": {}
},
{
"id": "2b0a551e-2a3d-4a62-b2a3-518583aa43e7",
"cell_type": "code",
"source": "# Get ‘warnings’ module \nimport warnings\n\n# Ignore any warning\nwarnings.filterwarnings(\"ignore\")\n\n# Load ‘helper.py’ file and import essay writer ‘ewriter’ and GUI ‘writer_gui’\nfrom helper import ewriter, writer_gui",
"metadata": {
"trusted": true
},
"outputs": [],
"execution_count": null
},
{
"id": "81c178a4-0414-44e8-b51b-1fdde23cdfb6",
"cell_type": "code",
"source": "# Load Essay Writer class\nMultiAgent = ewriter()\n\n# Create GUI / APP based on Essay Writer 'graph'\napp = writer_gui(MultiAgent.graph)\n\n# Execute GUI / APP\napp.launch()",
"metadata": {
"trusted": true
},
"outputs": [],
"execution_count": null
},
{
"id": "f76547b8-9852-45db-a4ab-bda847f43bc7",
"cell_type": "markdown",
"source": "```\nIMPORTANT: You are using gradio version 4.31.3, however version 4.44.1 is available, please upgrade.\n--------\nRunning on local URL: http://0.0.0.0:8081\nRunning on public URL: https://923c19b50ebd2cbf59.gradio.live\n\nThis share link expires in 72 hours. For free permanent hosting and GPU upgrades, run `gradio deploy` from Terminal to deploy to Spaces (https://huggingface.co/spaces)\n```",
"metadata": {}
},
{
"id": "e8c86767-08b8-4e34-a7bf-fdb6c9be4c70",
"cell_type": "markdown",
"source": "```\nAgent \nEssay Topic \n\nPizza Shop \n\nManage Agent \nInterrupt After State \n\nPlanner ✔ research_plan ✔ generate ✔ reflect ✔ research_critique ✔ \n\nchoose thread \n0 \n \n\nPlan \n\nI. Introduction \n\n- Briefly introduce the topic of pizza shops and their popularity. \n\n- Mention the variety of pizza options available and the competitive nature of the industry. \n\nII. The Importance of Quality Ingredients \n\n- Discuss the significance of using fresh and high-quality ingredients in pizza making. \n\n- Explain how quality ingredients can enhance the taste and overall experience for customers. \n\n- Provide examples of popular pizza toppings and their impact on the final product. \n\nIII. Customer Experience and Loyalty \n\n- Explore the role of customer service in the success of a pizza shop. \n\n- Highlight the importance of creating a positive and memorable experience for customers. \n\n- Discuss strategies for building customer loyalty and repeat business, such as loyalty programs or personalized service. \n \n\nStateSnapshots \n\nStateSnapshot(values={'task': 'Pizza Shop', 'lnode': 'planner', 'plan': 'I. Introduction\\n- Briefly introduce the topic of pizza shops and their popularit...', 'draft': 'no draft...', 'critique': 'no critique...', 'content': ['no content...'], 'queries': 'no queries', 'revision_number': 0, 'max_revisions': 2, 'count': 1}, next=('research_plan',), config={'configurable': {'thread_id': '0', 'thread_ts': '1f07ee2f-42f1-6f65-8001-e979695d096b'}}, metadata={'source': 'loop', 'step': 1, 'writes': 'not shown'}, created_at='2025-08-21T23:02:47.292269+00:00', parent_config={'configurable': {'thread_id': '0', 'thread_ts': '1f07ee2f-42a9-64b2-8000-aa7bd1638a80'}}) \n\nStateSnapshot(values={'task': 'Pizza Shop', 'lnode': '', 'draft': 'no draft...', 'critique': 'no critique...', 'content': ['no content...'], 'queries': 'no queries', 'revision_number': 0, 'max_revisions': 2, 'count': 0}, next=('planner',), config={'configurable': {'thread_id': '0', 'thread_ts': '1f07ee2f-42a9-64b2-8000-aa7bd1638a80'}}, metadata={'source': 'loop', 'step': 0, 'writes': 'not shown'}, created_at='2025-08-21T23:02:47.262520+00:00', parent_config={'configurable': {'thread_id': '0', 'thread_ts': '1f07ee2f-42a4-6f02-bfff-36ef03a718cf'}}) \n\nStateSnapshot(values={'count': 0}, next=('start',), config={'configurable': {'thread_id': '0', 'thread_ts': '1f07ee2f-42a4-6f02-bfff-36ef03a718cf'}}, metadata={'source': 'input', 'step': -1, 'writes': 'not shown'}, created_at='2025-08-21T23:02:47.260731+00:00', parent_config=None) \n\nAgent \nEssay Topic \n\nElectric Cars \n\nManage Agent \nInterrupt After State \n\nPlanner ✔ research_plan ✔ generate ✔ reflect ✔ research_critique ✔ \n\nchoose thread \n1 \n\nPlan \nI. Introduction \n\n- Brief overview of the increasing popularity of electric cars \n\n- Thesis statement: Electric cars are becoming a more viable and sustainable option for consumers due to advancements in technology and environmental concerns. \n\nII. Advantages of Electric Cars \n\n- Environmental benefits: reduced emissions, lower carbon footprint \n\n- Cost savings: lower fuel and maintenance costs \n\n- Technological advancements: improved battery life and charging infrastructure \n\nIII. Challenges and Future Outlook \n\n- Infrastructure challenges: need for more charging stations \n\n- Consumer concerns: range anxiety and initial cost \n\n- Future trends: government incentives, advancements in battery technology, and increasing consumer acceptance. \n\n\nStateSnapshots \n\nStateSnapshot(values={'task': 'Electric Cars', 'lnode': 'planner', 'plan': 'I. Introduction\\n- Brief overview of the increasing popularity of electric cars\\n-...', 'draft': 'no draft...', 'critique': 'no critique...', 'content': ['no content...'], 'queries': 'no queries', 'revision_number': 0, 'max_revisions': 2, 'count': 1}, next=('research_plan',), config={'configurable': {'thread_id': '1', 'thread_ts': '1f07ee4a-6f6f-63b6-8001-b34f22279876'}}, metadata={'source': 'loop', 'step': 1, 'writes': 'not shown'}, created_at='2025-08-21T23:14:56.733044+00:00', parent_config={'configurable': {'thread_id': '1', 'thread_ts': '1f07ee4a-6435-6b3b-8000-dd1b533be102'}}) \n\nStateSnapshot(values={'task': 'Electric Cars', 'lnode': '', 'draft': 'no draft...', 'critique': 'no critique...', 'content': ['no content...'], 'queries': 'no queries', 'revision_number': 0, 'max_revisions': 2, 'count': 0}, next=('planner',), config={'configurable': {'thread_id': '1', 'thread_ts': '1f07ee4a-6435-6b3b-8000-dd1b533be102'}}, metadata={'source': 'loop', 'step': 0, 'writes': 'not shown'}, created_at='2025-08-21T23:14:55.556054+00:00', parent_config={'configurable': {'thread_id': '1', 'thread_ts': '1f07ee4a-6432-6570-bfff-722017a45fa4'}}) \n\nStateSnapshot(values={'count': 0}, next=('start',), config={'configurable': {'thread_id': '1', 'thread_ts': '1f07ee4a-6432-6570-bfff-722017a45fa4'}}, metadata={'source': 'input', 'step': -1, 'writes': 'not shown'}, created_at='2025-08-21T23:14:55.554681+00:00', parent_config=None)\n```",
"metadata": {}
}
]
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment