diff --git a/examples/chatbot-simulation-evaluation/agent-simulation-evaluation.ipynb b/examples/chatbot-simulation-evaluation/agent-simulation-evaluation.ipynb index 02f8782eb..266da1ce9 100644 --- a/examples/chatbot-simulation-evaluation/agent-simulation-evaluation.ipynb +++ b/examples/chatbot-simulation-evaluation/agent-simulation-evaluation.ipynb @@ -399,14 +399,6 @@ " print(chunk)\n", " print(\"----\")" ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "dde4f2b5-cfe8-4ff0-99ea-fe2c5fed70c0", - "metadata": {}, - "outputs": [], - "source": [] } ], "metadata": { diff --git a/examples/chatbot-simulation-evaluation/langsmith-agent-simulation-evaluation.ipynb b/examples/chatbot-simulation-evaluation/langsmith-agent-simulation-evaluation.ipynb index 47b0e0a2d..d0aaf00ee 100644 --- a/examples/chatbot-simulation-evaluation/langsmith-agent-simulation-evaluation.ipynb +++ b/examples/chatbot-simulation-evaluation/langsmith-agent-simulation-evaluation.ipynb @@ -359,14 +359,6 @@ " evaluation=evaluation,\n", ")" ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "26735ed2-766d-4e0a-a185-b2295a0615b8", - "metadata": {}, - "outputs": [], - "source": [] } ], "metadata": { diff --git a/examples/cloud_examples/configuration_cloud.ipynb b/examples/cloud_examples/configuration_cloud.ipynb index e8f00027f..e6d29170b 100644 --- a/examples/cloud_examples/configuration_cloud.ipynb +++ b/examples/cloud_examples/configuration_cloud.ipynb @@ -172,14 +172,6 @@ "):\n", " print(event)" ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "666d78f1-019a-433e-839e-52d2ebb3d9c8", - "metadata": {}, - "outputs": [], - "source": [] } ], "metadata": { diff --git a/examples/cloud_examples/same-thread.ipynb b/examples/cloud_examples/same-thread.ipynb index 30410566e..0fe171bef 100644 --- a/examples/cloud_examples/same-thread.ipynb +++ b/examples/cloud_examples/same-thread.ipynb @@ -166,14 +166,6 @@ "):\n", " print(event)" ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "4c26df68-c447-4a88-bc94-59df42b117b5", - "metadata": {}, - "outputs": [], - "source": [] } ], "metadata": { diff --git a/examples/create-react-agent-hitl.ipynb b/examples/create-react-agent-hitl.ipynb index 2bc6d306f..7a14da497 100644 --- a/examples/create-react-agent-hitl.ipynb +++ b/examples/create-react-agent-hitl.ipynb @@ -213,14 +213,6 @@ "source": [ "print_stream(graph.stream(None, config, stream_mode=\"values\"))" ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "6f6f8965-b016-4e25-be63-31c00fc0a6de", - "metadata": {}, - "outputs": [], - "source": [] } ], "metadata": { diff --git a/examples/create-react-agent-memory.ipynb b/examples/create-react-agent-memory.ipynb index 2611bda69..fbafb7c91 100644 --- a/examples/create-react-agent-memory.ipynb +++ b/examples/create-react-agent-memory.ipynb @@ -221,14 +221,6 @@ "inputs = {\"messages\": [(\"user\", \"What's it known for?\")]}\n", "print_stream(graph.stream(inputs, config=config, stream_mode=\"values\"))" ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "3decf001-7228-4ed5-8779-2b9ed98a74ea", - "metadata": {}, - "outputs": [], - "source": [] } ], "metadata": { diff --git a/examples/create-react-agent-system-prompt.ipynb b/examples/create-react-agent-system-prompt.ipynb index c258a74c5..b3bd0213e 100644 --- a/examples/create-react-agent-system-prompt.ipynb +++ b/examples/create-react-agent-system-prompt.ipynb @@ -173,14 +173,6 @@ "\n", "print_stream(graph.stream(inputs, stream_mode=\"values\"))" ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "3decf001-7228-4ed5-8779-2b9ed98a74ea", - "metadata": {}, - "outputs": [], - "source": [] } ], "metadata": { diff --git a/examples/extraction/retries.ipynb b/examples/extraction/retries.ipynb index 3e0dcce31..4ebf0c913 100644 --- a/examples/extraction/retries.ipynb +++ b/examples/extraction/retries.ipynb @@ -1010,14 +1010,6 @@ "\n", "If you notice high retry rates (using an observability tool like LangSmith), you can set up a rule to send the failure cases to a dataset alongside the corrected values and then automatically program those into your prompts or schemas (or use them as few-shots to have semantically relevant demonstrations)." ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "0ae295b1-da58-4cc9-834b-70e1466f8695", - "metadata": {}, - "outputs": [], - "source": [] } ], "metadata": { diff --git a/examples/human_in_the_loop/edit-graph-state.ipynb b/examples/human_in_the_loop/edit-graph-state.ipynb index 7f29740a3..17468b017 100644 --- a/examples/human_in_the_loop/edit-graph-state.ipynb +++ b/examples/human_in_the_loop/edit-graph-state.ipynb @@ -541,14 +541,6 @@ "for event in app.stream(None, thread, stream_mode=\"values\"):\n", " event[\"messages\"][-1].pretty_print()" ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "78780afe-409d-46cd-a734-e82538cdd8de", - "metadata": {}, - "outputs": [], - "source": [] } ], "metadata": { diff --git a/examples/human_in_the_loop/wait-user-input.ipynb b/examples/human_in_the_loop/wait-user-input.ipynb index eda7f0e6b..5b4ea5e86 100644 --- a/examples/human_in_the_loop/wait-user-input.ipynb +++ b/examples/human_in_the_loop/wait-user-input.ipynb @@ -55,7 +55,7 @@ "metadata": {}, "outputs": [ { - "name": "stdin", + "name": "stdout", "output_type": "stream", "text": [ "ANTHROPIC_API_KEY: ········\n" @@ -227,7 +227,7 @@ "metadata": {}, "outputs": [ { - "name": "stdin", + "name": "stdout", "output_type": "stream", "text": [ "Tell me how you want to update the state: go to step 3!\n" @@ -636,14 +636,6 @@ "for event in app.stream(None, config, stream_mode=\"values\"):\n", " event[\"messages\"][-1].pretty_print()" ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "f6f972d1-3d99-4fc1-8b33-92b71e74835d", - "metadata": {}, - "outputs": [], - "source": [] } ], "metadata": { diff --git a/examples/input_output_schema.ipynb b/examples/input_output_schema.ipynb index 4837b40a8..36c926156 100644 --- a/examples/input_output_schema.ipynb +++ b/examples/input_output_schema.ipynb @@ -62,14 +62,6 @@ "source": [ "Notice that the output of invoke only includes the output schema." ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "b952a554-f2a4-4be3-81ab-2e08f0f441c2", - "metadata": {}, - "outputs": [], - "source": [] } ], "metadata": { diff --git a/examples/map-reduce.ipynb b/examples/map-reduce.ipynb index 6fee482a4..cefecbc96 100644 --- a/examples/map-reduce.ipynb +++ b/examples/map-reduce.ipynb @@ -207,14 +207,6 @@ "for s in app.stream({\"topic\": \"animals\"}):\n", " print(s)" ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "f28eaf56", - "metadata": {}, - "outputs": [], - "source": [] } ], "metadata": { diff --git a/examples/memory/add-summary-conversation-history.ipynb b/examples/memory/add-summary-conversation-history.ipynb index 10584bc21..4b7f73955 100644 --- a/examples/memory/add-summary-conversation-history.ipynb +++ b/examples/memory/add-summary-conversation-history.ipynb @@ -508,14 +508,6 @@ "for event in app.stream({\"messages\": [input_message]}, config, stream_mode=\"updates\"):\n", " print_update(event)" ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "67d26013-1362-4cee-b135-ab5c3c4eb3d0", - "metadata": {}, - "outputs": [], - "source": [] } ], "metadata": { diff --git a/examples/memory/delete-messages.ipynb b/examples/memory/delete-messages.ipynb index dd4cab2eb..2cf6d1b5a 100644 --- a/examples/memory/delete-messages.ipynb +++ b/examples/memory/delete-messages.ipynb @@ -52,7 +52,7 @@ "metadata": {}, "outputs": [ { - "name": "stdin", + "name": "stdout", "output_type": "stream", "text": [ "ANTHROPIC_API_KEY: ········\n" @@ -466,14 +466,6 @@ "source": [ "Remember, when deleting messages you will want to make sure that the remaining message list is still valid. This message list **may actually not be** - this is because it currently starts with an AI message, which some models do not allow." ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "4d7222cd-5767-42f0-bc69-10615127eba5", - "metadata": {}, - "outputs": [], - "source": [] } ], "metadata": { diff --git a/examples/memory/manage-conversation-history.ipynb b/examples/memory/manage-conversation-history.ipynb index 559112a4a..ac835673f 100644 --- a/examples/memory/manage-conversation-history.ipynb +++ b/examples/memory/manage-conversation-history.ipynb @@ -360,14 +360,6 @@ "- [How to filter messages](https://python.langchain.com/v0.2/docs/how_to/filter_messages/)\n", "- [How to trim messages](https://python.langchain.com/v0.2/docs/how_to/trim_messages/)" ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "686861bb-ec32-46f3-b7b3-fdac106f22f6", - "metadata": {}, - "outputs": [], - "source": [] } ], "metadata": { diff --git a/examples/multi_agent/agent_supervisor.ipynb b/examples/multi_agent/agent_supervisor.ipynb index c6626d755..bd2a7c6ce 100644 --- a/examples/multi_agent/agent_supervisor.ipynb +++ b/examples/multi_agent/agent_supervisor.ipynb @@ -26,7 +26,10 @@ "id": "0d30b6f7-3bec-4d9f-af50-43dfdc81ae6c", "metadata": {}, "outputs": [], - "source": ["%%capture --no-stderr\n%pip install -U langgraph langchain langchain_openai langchain_experimental langsmith pandas"] + "source": [ + "%%capture --no-stderr\n", + "%pip install -U langgraph langchain langchain_openai langchain_experimental langsmith pandas" + ] }, { "cell_type": "code", @@ -34,7 +37,24 @@ "id": "30c2f3de-c730-4aec-85a6-af2c2f058803", "metadata": {}, "outputs": [], - "source": ["import getpass\nimport os\n\n\ndef _set_if_undefined(var: str):\n if not os.environ.get(var):\n os.environ[var] = getpass.getpass(f\"Please provide your {var}\")\n\n\n_set_if_undefined(\"OPENAI_API_KEY\")\n_set_if_undefined(\"LANGCHAIN_API_KEY\")\n_set_if_undefined(\"TAVILY_API_KEY\")\n\n# Optional, add tracing in LangSmith\nos.environ[\"LANGCHAIN_TRACING_V2\"] = \"true\"\nos.environ[\"LANGCHAIN_PROJECT\"] = \"Multi-agent Collaboration\""] + "source": [ + "import getpass\n", + "import os\n", + "\n", + "\n", + "def _set_if_undefined(var: str):\n", + " if not os.environ.get(var):\n", + " os.environ[var] = getpass.getpass(f\"Please provide your {var}\")\n", + "\n", + "\n", + "_set_if_undefined(\"OPENAI_API_KEY\")\n", + "_set_if_undefined(\"LANGCHAIN_API_KEY\")\n", + "_set_if_undefined(\"TAVILY_API_KEY\")\n", + "\n", + "# Optional, add tracing in LangSmith\n", + "os.environ[\"LANGCHAIN_TRACING_V2\"] = \"true\"\n", + "os.environ[\"LANGCHAIN_PROJECT\"] = \"Multi-agent Collaboration\"" + ] }, { "cell_type": "markdown", @@ -48,45 +68,51 @@ }, { "cell_type": "code", - "execution_count": 2, + "execution_count": 1, "id": "f04c6778-403b-4b49-9b93-678e910d5cec", "metadata": {}, "outputs": [], - "source": ["from typing import Annotated\n\nfrom langchain_community.tools.tavily_search import TavilySearchResults\nfrom langchain_experimental.tools import PythonREPLTool\n\ntavily_tool = TavilySearchResults(max_results=5)\n\n# This executes code locally, which can be unsafe\npython_repl_tool = PythonREPLTool()"] + "source": [ + "from typing import Annotated\n", + "\n", + "from langchain_community.tools.tavily_search import TavilySearchResults\n", + "from langchain_experimental.tools import PythonREPLTool\n", + "\n", + "tavily_tool = TavilySearchResults(max_results=5)\n", + "\n", + "# This executes code locally, which can be unsafe\n", + "python_repl_tool = PythonREPLTool()" + ] }, { "cell_type": "markdown", "id": "d58d1e85-22d4-4c22-9062-72a346a0d709", "metadata": {}, "source": [ - "## Helper Utilities\n", - "\n", - "Define a helper function below, which make it easier to add new agent worker nodes." + "## Helper Utilities" ] }, - { - "cell_type": "code", - "execution_count": 3, - "id": "c4823dd9-26bd-4e1a-8117-b97b2860211a", - "metadata": {}, - "outputs": [], - "source": ["from langchain.agents import AgentExecutor, create_openai_tools_agent\nfrom langchain_core.messages import BaseMessage, HumanMessage\nfrom langchain_openai import ChatOpenAI\n\n\ndef create_agent(llm: ChatOpenAI, tools: list, system_prompt: str):\n # Each worker node will be given a name and some tools.\n prompt = ChatPromptTemplate.from_messages(\n [\n (\n \"system\",\n system_prompt,\n ),\n MessagesPlaceholder(variable_name=\"messages\"),\n MessagesPlaceholder(variable_name=\"agent_scratchpad\"),\n ]\n )\n agent = create_openai_tools_agent(llm, tools, prompt)\n executor = AgentExecutor(agent=agent, tools=tools)\n return executor"] - }, { "cell_type": "markdown", "id": "b7c302b0-cd57-4913-986f-5dc7d6d77386", "metadata": {}, "source": [ - "We can also define a function that we will use to be the nodes in the graph - it takes care of converting the agent response to a human message. This is important because that is how we will add it the global state of the graph" + "Define a helper function that we will use to create the nodes in the graph - it takes care of converting the agent response to a human message. This is important because that is how we will add it the global state of the graph" ] }, { "cell_type": "code", - "execution_count": 4, + "execution_count": 2, "id": "80862241-a1a7-4726-bce5-f867b233832e", "metadata": {}, "outputs": [], - "source": ["def agent_node(state, agent, name):\n result = agent.invoke(state)\n return {\"messages\": [HumanMessage(content=result[\"output\"], name=name)]}"] + "source": [ + "from langchain_core.messages import HumanMessage\n", + "\n", + "def agent_node(state, agent, name):\n", + " result = agent.invoke(state)\n", + " return {\"messages\": [HumanMessage(content=result[\"messages\"][-1].content, name=name)]}" + ] }, { "cell_type": "markdown", @@ -100,11 +126,53 @@ }, { "cell_type": "code", - "execution_count": 5, + "execution_count": 13, "id": "311f0a58-b425-4496-adac-dc4cd8ffb912", "metadata": {}, "outputs": [], - "source": ["from langchain_core.output_parsers.openai_functions import JsonOutputFunctionsParser\nfrom langchain_core.prompts import ChatPromptTemplate, MessagesPlaceholder\n\nmembers = [\"Researcher\", \"Coder\"]\nsystem_prompt = (\n \"You are a supervisor tasked with managing a conversation between the\"\n \" following workers: {members}. Given the following user request,\"\n \" respond with the worker to act next. Each worker will perform a\"\n \" task and respond with their results and status. When finished,\"\n \" respond with FINISH.\"\n)\n# Our team supervisor is an LLM node. It just picks the next agent to process\n# and decides when the work is completed\noptions = [\"FINISH\"] + members\n# Using openai function calling can make output parsing easier for us\nfunction_def = {\n \"name\": \"route\",\n \"description\": \"Select the next role.\",\n \"parameters\": {\n \"title\": \"routeSchema\",\n \"type\": \"object\",\n \"properties\": {\n \"next\": {\n \"title\": \"Next\",\n \"anyOf\": [\n {\"enum\": options},\n ],\n }\n },\n \"required\": [\"next\"],\n },\n}\nprompt = ChatPromptTemplate.from_messages(\n [\n (\"system\", system_prompt),\n MessagesPlaceholder(variable_name=\"messages\"),\n (\n \"system\",\n \"Given the conversation above, who should act next?\"\n \" Or should we FINISH? Select one of: {options}\",\n ),\n ]\n).partial(options=str(options), members=\", \".join(members))\n\nllm = ChatOpenAI(model=\"gpt-4-1106-preview\")\n\nsupervisor_chain = (\n prompt\n | llm.bind_functions(functions=[function_def], function_call=\"route\")\n | JsonOutputFunctionsParser()\n)"] + "source": [ + "from langchain_core.prompts import ChatPromptTemplate, MessagesPlaceholder\n", + "from langchain_openai import ChatOpenAI\n", + "from pydantic import BaseModel\n", + "from typing import Literal\n", + "\n", + "members = [\"Researcher\", \"Coder\"]\n", + "system_prompt = (\n", + " \"You are a supervisor tasked with managing a conversation between the\"\n", + " \" following workers: {members}. Given the following user request,\"\n", + " \" respond with the worker to act next. Each worker will perform a\"\n", + " \" task and respond with their results and status. When finished,\"\n", + " \" respond with FINISH.\"\n", + ")\n", + "# Our team supervisor is an LLM node. It just picks the next agent to process\n", + "# and decides when the work is completed\n", + "options = [\"FINISH\"] + members\n", + "\n", + "class routeResponse(BaseModel):\n", + " next: Literal[*options]\n", + "\n", + "prompt = ChatPromptTemplate.from_messages(\n", + " [\n", + " (\"system\", system_prompt),\n", + " MessagesPlaceholder(variable_name=\"messages\"),\n", + " (\n", + " \"system\",\n", + " \"Given the conversation above, who should act next?\"\n", + " \" Or should we FINISH? Select one of: {options}\",\n", + " ),\n", + " ]\n", + ").partial(options=str(options), members=\", \".join(members))\n", + "\n", + "\n", + "llm = ChatOpenAI(model=\"gpt-4o\")\n", + "\n", + "def supervisor_agent(state):\n", + " supervisor_chain = (\n", + " prompt\n", + " | llm.with_structured_output(routeResponse)\n", + " )\n", + " return supervisor_chain.invoke(state)" + ] }, { "cell_type": "markdown", @@ -118,11 +186,41 @@ }, { "cell_type": "code", - "execution_count": 6, + "execution_count": 14, "id": "6a430af7-8fce-4e66-ba9e-d940c1bc48e8", "metadata": {}, "outputs": [], - "source": ["import functools\nimport operator\nfrom typing import Sequence, TypedDict\n\nfrom langchain_core.prompts import ChatPromptTemplate, MessagesPlaceholder\n\nfrom langgraph.graph import END, StateGraph, START\n\n\n# The agent state is the input to each node in the graph\nclass AgentState(TypedDict):\n # The annotation tells the graph that new messages will always\n # be added to the current states\n messages: Annotated[Sequence[BaseMessage], operator.add]\n # The 'next' field indicates where to route to next\n next: str\n\n\nresearch_agent = create_agent(llm, [tavily_tool], \"You are a web researcher.\")\nresearch_node = functools.partial(agent_node, agent=research_agent, name=\"Researcher\")\n\n# NOTE: THIS PERFORMS ARBITRARY CODE EXECUTION. PROCEED WITH CAUTION\ncode_agent = create_agent(\n llm,\n [python_repl_tool],\n \"You may generate safe python code to analyze data and generate charts using matplotlib.\",\n)\ncode_node = functools.partial(agent_node, agent=code_agent, name=\"Coder\")\n\nworkflow = StateGraph(AgentState)\nworkflow.add_node(\"Researcher\", research_node)\nworkflow.add_node(\"Coder\", code_node)\nworkflow.add_node(\"supervisor\", supervisor_chain)"] + "source": [ + "import functools\n", + "import operator\n", + "from typing import Sequence, TypedDict\n", + "\n", + "from langchain_core.messages import BaseMessage\n", + "\n", + "from langgraph.graph import END, StateGraph, START\n", + "from langgraph.prebuilt import create_react_agent\n", + "\n", + "# The agent state is the input to each node in the graph\n", + "class AgentState(TypedDict):\n", + " # The annotation tells the graph that new messages will always\n", + " # be added to the current states\n", + " messages: Annotated[Sequence[BaseMessage], operator.add]\n", + " # The 'next' field indicates where to route to next\n", + " next: str\n", + "\n", + "\n", + "research_agent = create_react_agent(llm, tools=[tavily_tool])\n", + "research_node = functools.partial(agent_node, agent=research_agent, name=\"Researcher\")\n", + "\n", + "# NOTE: THIS PERFORMS ARBITRARY CODE EXECUTION. PROCEED WITH CAUTION\n", + "code_agent = create_react_agent(llm, tools=[python_repl_tool])\n", + "code_node = functools.partial(agent_node, agent=code_agent, name=\"Coder\")\n", + "\n", + "workflow = StateGraph(AgentState)\n", + "workflow.add_node(\"Researcher\", research_node)\n", + "workflow.add_node(\"Coder\", code_node)\n", + "workflow.add_node(\"supervisor\", supervisor_chain)" + ] }, { "cell_type": "markdown", @@ -134,11 +232,24 @@ }, { "cell_type": "code", - "execution_count": 7, + "execution_count": 15, "id": "14778e86-077b-4e6a-893c-400e59b0cdbf", "metadata": {}, "outputs": [], - "source": ["for member in members:\n # We want our workers to ALWAYS \"report back\" to the supervisor when done\n workflow.add_edge(member, \"supervisor\")\n# The supervisor populates the \"next\" field in the graph state\n# which routes to a node or finishes\nconditional_map = {k: k for k in members}\nconditional_map[\"FINISH\"] = END\nworkflow.add_conditional_edges(\"supervisor\", lambda x: x[\"next\"], conditional_map)\n# Finally, add entrypoint\nworkflow.add_edge(START, \"supervisor\")\n\ngraph = workflow.compile()"] + "source": [ + "for member in members:\n", + " # We want our workers to ALWAYS \"report back\" to the supervisor when done\n", + " workflow.add_edge(member, \"supervisor\")\n", + "# The supervisor populates the \"next\" field in the graph state\n", + "# which routes to a node or finishes\n", + "conditional_map = {k: k for k in members}\n", + "conditional_map[\"FINISH\"] = END\n", + "workflow.add_conditional_edges(\"supervisor\", lambda x: x[\"next\"], conditional_map)\n", + "# Finally, add entrypoint\n", + "workflow.add_edge(START, \"supervisor\")\n", + "\n", + "graph = workflow.compile()" + ] }, { "cell_type": "markdown", @@ -152,7 +263,7 @@ }, { "cell_type": "code", - "execution_count": 8, + "execution_count": 16, "id": "56ba78e9-d9c1-457c-a073-d606d5d3e013", "metadata": {}, "outputs": [ @@ -161,32 +272,30 @@ "output_type": "stream", "text": [ "{'supervisor': {'next': 'Coder'}}\n", - "----\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "Python REPL can execute arbitrary code. Use with caution.\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "{'Coder': {'messages': [HumanMessage(content=\"The code `print('Hello, World!')` was executed, and the output is:\\n\\n```\\nHello, World!\\n```\", name='Coder')]}}\n", + "----\n", + "{'Coder': {'messages': [HumanMessage(content='The code to print \"Hello, World!\" to the terminal is:\\n\\n```python\\nprint(\\'Hello, World!\\')\\n```\\n\\nWhen executed, it prints:\\n```\\nHello, World!\\n```', name='Coder')]}}\n", "----\n", "{'supervisor': {'next': 'FINISH'}}\n", "----\n" ] } ], - "source": ["for s in graph.stream(\n {\n \"messages\": [\n HumanMessage(content=\"Code hello world and print it to the terminal\")\n ]\n }\n):\n if \"__end__\" not in s:\n print(s)\n print(\"----\")"] + "source": [ + "for s in graph.stream(\n", + " {\n", + " \"messages\": [\n", + " HumanMessage(content=\"Code hello world and print it to the terminal\")\n", + " ]\n", + " }\n", + "):\n", + " if \"__end__\" not in s:\n", + " print(s)\n", + " print(\"----\")" + ] }, { "cell_type": "code", - "execution_count": 9, + "execution_count": 7, "id": "45a92dfd-0e11-47f5-aad4-b68d24990e34", "metadata": {}, "outputs": [ @@ -196,22 +305,22 @@ "text": [ "{'supervisor': {'next': 'Researcher'}}\n", "----\n", - "{'Researcher': {'messages': [HumanMessage(content='**Research Report on Pikas**\\n\\nPikas are small mammals related to rabbits, known for their distinctive chirping sounds. They inhabit some of the most challenging environments, particularly boulder fields at high elevations, such as those found along the treeless slopes of the Southern Rockies, where they can be found at altitudes of up to 14,000 feet. Pikas are well-adapted to cold climates and typically do not fare well in warmer temperatures.\\n\\nRecent studies have shown that pikas are being impacted by climate change. Research by Peter Billman, a Ph.D. student from the University of Connecticut, indicates that pikas have moved upslope by approximately 1,160 feet. This upslope retreat is a direct response to changing climatic conditions, as pikas seek cooler temperatures at higher elevations.\\n\\nPikas are also known to be industrious foragers, particularly during the summer months when they gather vegetation to create haypiles for winter sustenance. Their behavior is encapsulated in the saying, \"making hay while the sun shines,\" reflecting their proactive approach to survival in harsh conditions.\\n\\nThe effects of climate change on pikas are not limited to the Southern Rockies. Studies published in Global Change Biology suggest that climate change is influencing pikas even in areas where they were previously thought to be less vulnerable, such as the Northern Rockies. These findings point to a broader trend of pikas moving to higher elevations, a behavior that may indicate a search for cooler, more suitable habitats.\\n\\nMoreover, researchers are exploring the possibility that pikas at lower elevations may have developed warm adaptations that could be beneficial for their future survival, given the ongoing climatic shifts. This line of research could help conservationists understand how pikas might cope with a warming world.\\n\\nIn conclusion, pikas are a species that not only fascinate with their unique behaviors and adaptations but also serve as indicators of environmental changes. Their upslope migration in response to climate change highlights the urgency for understanding and mitigating the effects of global warming on mountain ecosystems and the species that inhabit them.\\n\\n**Sources:**\\n- [Colorado Sun](https://coloradosun.com/2023/08/27/colorado-pika-population-climate-change/)\\n- [Wildlife.org](https://wildlife.org/climate-change-affects-pikas-even-in-unlikely-areas/)', name='Researcher')]}}\n", + "{'Researcher': {'messages': [HumanMessage(content='# Research Report on Pikas\\n\\nPikas, belonging to the genus Ochotona, are small, short-legged, and virtually tailless mammals that are often found in the mountains of western North America and across much of Asia. Despite their rodent-like appearance, pikas are not rodents but rather are part of the order Lagomorpha, which also includes rabbits and hares.\\n\\n## Behavior and Ecology\\nPikas are known for their unique behavior of not hibernating and remaining active throughout the winter. They navigate through tunnels under rocks and snow and rely on dried plants, which they have stored during warmer months in caches known as \"haypiles.\" This foraging strategy, termed \"haying,\" is crucial for their survival during the harsh winter months.\\n\\nPikas have a preference for cooler temperatures, typically foraging in temperatures below 25°C (77°F). They tend to avoid direct sunlight and stay in shaded regions when it gets warmer. A study has shown that for every 1°C (1.8°F) increase in ambient temperature, pikas can lose 3% of their foraging time, making them sensitive to climate change.\\n\\n## Distribution and Habitat\\nThe American pika (Ochotona princeps) and its relative, the collared pika (O. collaris), are found throughout the high mountainous regions of western North America. These species prefer cooler climates and have been observed to retreat to higher elevations as a response to increasing temperatures. Their current distribution is believed to be a result of a retreat from much larger ranges they occupied in the past, which included Western Europe and Eastern North America.\\n\\n## Conservation Status\\nThe International Union for Conservation of Nature and Natural Resources (IUCN) lists the American pika as a species of Least Concern but notes that populations are declining and unlikely to rebound due to habitat loss from extreme temperatures. The sensitivity of pikas to summer heat makes them an indicator species for the potential effects of climate change. Studies have shown that some populations are in decline, and there have been cases of local extirpation, particularly in the Great Basin.\\n\\n## Human Impact\\nHuman activity has impacted the ecosystems where pikas live, with recorded interactions dating back to the 1970s. Such interactions have been linked to pikas having reduced foraging time, limiting the amount of food they can stockpile for winter. Additionally, pikas have been considered pests in regions like the Tibetan plateau, where high densities of burrowing pikas are thought to reduce forage for domestic livestock and damage grasslands.\\n\\n## Conclusion\\nPikas are fascinating creatures with distinct adaptations that allow them to thrive in alpine environments. However, their future is uncertain due to the looming threats of climate change and habitat alteration. Conservation efforts, research, and monitoring are vital to ensure the survival of these unique mammals in a changing world.\\n\\n---\\n\\n**Sources:**\\n- [Wikipedia - Pika](https://en.wikipedia.org/wiki/Pika)\\n- [Treehugger - American Pika](https://www.treehugger.com/surprising-facts-about-american-pika-4864528)\\n- [National Park Service - Pikas at Rocky Mountain National Park](https://www.nps.gov/romo/learn/nature/pikas.htm)\\n- [Wikipedia - American Pika](https://en.wikipedia.org/wiki/American_pika)\\n- [Britannica - Pika](https://www.britannica.com/animal/pika)', name='Researcher')]}}\n", "----\n", "{'supervisor': {'next': 'FINISH'}}\n", "----\n" ] } ], - "source": ["for s in graph.stream(\n {\"messages\": [HumanMessage(content=\"Write a brief research report on pikas.\")]},\n {\"recursion_limit\": 100},\n):\n if \"__end__\" not in s:\n print(s)\n print(\"----\")"] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "1d363d2c-e0da-4cce-ba47-ad2aa9df0fef", - "metadata": {}, - "outputs": [], - "source": [""] + "source": [ + "for s in graph.stream(\n", + " {\"messages\": [HumanMessage(content=\"Write a brief research report on pikas.\")]},\n", + " {\"recursion_limit\": 100},\n", + "):\n", + " if \"__end__\" not in s:\n", + " print(s)\n", + " print(\"----\")" + ] } ], "metadata": { @@ -230,7 +339,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.11.1" + "version": "3.11.9" } }, "nbformat": 4, diff --git a/examples/multi_agent/hierarchical_agent_teams.ipynb b/examples/multi_agent/hierarchical_agent_teams.ipynb index e539c91f9..43b889cca 100644 --- a/examples/multi_agent/hierarchical_agent_teams.ipynb +++ b/examples/multi_agent/hierarchical_agent_teams.ipynb @@ -40,7 +40,10 @@ } }, "outputs": [], - "source": ["# %%capture --no-stderr\n# %pip install -U langgraph langchain langchain_openai langchain_experimental"] + "source": [ + "# %%capture --no-stderr\n", + "# %pip install -U langgraph langchain langchain_openai langchain_experimental" + ] }, { "cell_type": "code", @@ -53,7 +56,25 @@ } }, "outputs": [], - "source": ["import getpass\nimport os\n\n\ndef _set_if_undefined(var: str):\n if not os.environ.get(var):\n os.environ[var] = getpass.getpass(f\"Please provide your {var}\")\n\n\n_set_if_undefined(\"OPENAI_API_KEY\")\n_set_if_undefined(\"LANGCHAIN_API_KEY\")\n_set_if_undefined(\"TAVILY_API_KEY\")\n\n# Optional, add tracing in LangSmith.\n# This will help you visualize and debug the control flow\nos.environ[\"LANGCHAIN_TRACING_V2\"] = \"true\"\nos.environ[\"LANGCHAIN_PROJECT\"] = \"Multi-agent Collaboration\""] + "source": [ + "import getpass\n", + "import os\n", + "\n", + "\n", + "def _set_if_undefined(var: str):\n", + " if not os.environ.get(var):\n", + " os.environ[var] = getpass.getpass(f\"Please provide your {var}\")\n", + "\n", + "\n", + "_set_if_undefined(\"OPENAI_API_KEY\")\n", + "_set_if_undefined(\"LANGCHAIN_API_KEY\")\n", + "_set_if_undefined(\"TAVILY_API_KEY\")\n", + "\n", + "# Optional, add tracing in LangSmith.\n", + "# This will help you visualize and debug the control flow\n", + "os.environ[\"LANGCHAIN_TRACING_V2\"] = \"true\"\n", + "os.environ[\"LANGCHAIN_PROJECT\"] = \"Multi-agent Collaboration\"" + ] }, { "cell_type": "markdown", @@ -73,7 +94,7 @@ }, { "cell_type": "code", - "execution_count": 3, + "execution_count": 1, "id": "4024eb89-843d-4cc3-ab3f-e1eb4d031179", "metadata": { "ExecuteTime": { @@ -81,8 +102,37 @@ "start_time": "2024-05-15T08:19:42.397083Z" } }, - "outputs": [], - "source": ["from typing import Annotated, List\n\nfrom langchain_community.document_loaders import WebBaseLoader\nfrom langchain_community.tools.tavily_search import TavilySearchResults\nfrom langchain_core.tools import tool\n\ntavily_tool = TavilySearchResults(max_results=5)\n\n\n@tool\ndef scrape_webpages(urls: List[str]) -> str:\n \"\"\"Use requests and bs4 to scrape the provided web pages for detailed information.\"\"\"\n loader = WebBaseLoader(urls)\n docs = loader.load()\n return \"\\n\\n\".join(\n [\n f'\\n{doc.page_content}\\n'\n for doc in docs\n ]\n )"] + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "USER_AGENT environment variable not set, consider setting it to identify your requests.\n" + ] + } + ], + "source": [ + "from typing import Annotated, List\n", + "\n", + "from langchain_community.document_loaders import WebBaseLoader\n", + "from langchain_community.tools.tavily_search import TavilySearchResults\n", + "from langchain_core.tools import tool\n", + "\n", + "tavily_tool = TavilySearchResults(max_results=5)\n", + "\n", + "\n", + "@tool\n", + "def scrape_webpages(urls: List[str]) -> str:\n", + " \"\"\"Use requests and bs4 to scrape the provided web pages for detailed information.\"\"\"\n", + " loader = WebBaseLoader(urls)\n", + " docs = loader.load()\n", + " return \"\\n\\n\".join(\n", + " [\n", + " f'\\n{doc.page_content}\\n'\n", + " for doc in docs\n", + " ]\n", + " )" + ] }, { "cell_type": "markdown", @@ -99,7 +149,7 @@ }, { "cell_type": "code", - "execution_count": 4, + "execution_count": 2, "id": "f20a18ca-2709-4c12-84f3-88678591a9fa", "metadata": { "ExecuteTime": { @@ -108,7 +158,99 @@ } }, "outputs": [], - "source": ["from pathlib import Path\nfrom tempfile import TemporaryDirectory\nfrom typing import Dict, Optional\n\nfrom langchain_experimental.utilities import PythonREPL\nfrom typing_extensions import TypedDict\n\n_TEMP_DIRECTORY = TemporaryDirectory()\nWORKING_DIRECTORY = Path(_TEMP_DIRECTORY.name)\n\n\n@tool\ndef create_outline(\n points: Annotated[List[str], \"List of main points or sections.\"],\n file_name: Annotated[str, \"File path to save the outline.\"],\n) -> Annotated[str, \"Path of the saved outline file.\"]:\n \"\"\"Create and save an outline.\"\"\"\n with (WORKING_DIRECTORY / file_name).open(\"w\") as file:\n for i, point in enumerate(points):\n file.write(f\"{i + 1}. {point}\\n\")\n return f\"Outline saved to {file_name}\"\n\n\n@tool\ndef read_document(\n file_name: Annotated[str, \"File path to save the document.\"],\n start: Annotated[Optional[int], \"The start line. Default is 0\"] = None,\n end: Annotated[Optional[int], \"The end line. Default is None\"] = None,\n) -> str:\n \"\"\"Read the specified document.\"\"\"\n with (WORKING_DIRECTORY / file_name).open(\"r\") as file:\n lines = file.readlines()\n if start is not None:\n start = 0\n return \"\\n\".join(lines[start:end])\n\n\n@tool\ndef write_document(\n content: Annotated[str, \"Text content to be written into the document.\"],\n file_name: Annotated[str, \"File path to save the document.\"],\n) -> Annotated[str, \"Path of the saved document file.\"]:\n \"\"\"Create and save a text document.\"\"\"\n with (WORKING_DIRECTORY / file_name).open(\"w\") as file:\n file.write(content)\n return f\"Document saved to {file_name}\"\n\n\n@tool\ndef edit_document(\n file_name: Annotated[str, \"Path of the document to be edited.\"],\n inserts: Annotated[\n Dict[int, str],\n \"Dictionary where key is the line number (1-indexed) and value is the text to be inserted at that line.\",\n ],\n) -> Annotated[str, \"Path of the edited document file.\"]:\n \"\"\"Edit a document by inserting text at specific line numbers.\"\"\"\n\n with (WORKING_DIRECTORY / file_name).open(\"r\") as file:\n lines = file.readlines()\n\n sorted_inserts = sorted(inserts.items())\n\n for line_number, text in sorted_inserts:\n if 1 <= line_number <= len(lines) + 1:\n lines.insert(line_number - 1, text + \"\\n\")\n else:\n return f\"Error: Line number {line_number} is out of range.\"\n\n with (WORKING_DIRECTORY / file_name).open(\"w\") as file:\n file.writelines(lines)\n\n return f\"Document edited and saved to {file_name}\"\n\n\n# Warning: This executes code locally, which can be unsafe when not sandboxed\n\nrepl = PythonREPL()\n\n\n@tool\ndef python_repl(\n code: Annotated[str, \"The python code to execute to generate your chart.\"],\n):\n \"\"\"Use this to execute python code. If you want to see the output of a value,\n you should print it out with `print(...)`. This is visible to the user.\"\"\"\n try:\n result = repl.run(code)\n except BaseException as e:\n return f\"Failed to execute. Error: {repr(e)}\"\n return f\"Successfully executed:\\n```python\\n{code}\\n```\\nStdout: {result}\""] + "source": [ + "from pathlib import Path\n", + "from tempfile import TemporaryDirectory\n", + "from typing import Dict, Optional\n", + "\n", + "from langchain_experimental.utilities import PythonREPL\n", + "from typing_extensions import TypedDict\n", + "\n", + "_TEMP_DIRECTORY = TemporaryDirectory()\n", + "WORKING_DIRECTORY = Path(_TEMP_DIRECTORY.name)\n", + "\n", + "\n", + "@tool\n", + "def create_outline(\n", + " points: Annotated[List[str], \"List of main points or sections.\"],\n", + " file_name: Annotated[str, \"File path to save the outline.\"],\n", + ") -> Annotated[str, \"Path of the saved outline file.\"]:\n", + " \"\"\"Create and save an outline.\"\"\"\n", + " with (WORKING_DIRECTORY / file_name).open(\"w\") as file:\n", + " for i, point in enumerate(points):\n", + " file.write(f\"{i + 1}. {point}\\n\")\n", + " return f\"Outline saved to {file_name}\"\n", + "\n", + "\n", + "@tool\n", + "def read_document(\n", + " file_name: Annotated[str, \"File path to save the document.\"],\n", + " start: Annotated[Optional[int], \"The start line. Default is 0\"] = None,\n", + " end: Annotated[Optional[int], \"The end line. Default is None\"] = None,\n", + ") -> str:\n", + " \"\"\"Read the specified document.\"\"\"\n", + " with (WORKING_DIRECTORY / file_name).open(\"r\") as file:\n", + " lines = file.readlines()\n", + " if start is not None:\n", + " start = 0\n", + " return \"\\n\".join(lines[start:end])\n", + "\n", + "\n", + "@tool\n", + "def write_document(\n", + " content: Annotated[str, \"Text content to be written into the document.\"],\n", + " file_name: Annotated[str, \"File path to save the document.\"],\n", + ") -> Annotated[str, \"Path of the saved document file.\"]:\n", + " \"\"\"Create and save a text document.\"\"\"\n", + " with (WORKING_DIRECTORY / file_name).open(\"w\") as file:\n", + " file.write(content)\n", + " return f\"Document saved to {file_name}\"\n", + "\n", + "\n", + "@tool\n", + "def edit_document(\n", + " file_name: Annotated[str, \"Path of the document to be edited.\"],\n", + " inserts: Annotated[\n", + " Dict[int, str],\n", + " \"Dictionary where key is the line number (1-indexed) and value is the text to be inserted at that line.\",\n", + " ],\n", + ") -> Annotated[str, \"Path of the edited document file.\"]:\n", + " \"\"\"Edit a document by inserting text at specific line numbers.\"\"\"\n", + "\n", + " with (WORKING_DIRECTORY / file_name).open(\"r\") as file:\n", + " lines = file.readlines()\n", + "\n", + " sorted_inserts = sorted(inserts.items())\n", + "\n", + " for line_number, text in sorted_inserts:\n", + " if 1 <= line_number <= len(lines) + 1:\n", + " lines.insert(line_number - 1, text + \"\\n\")\n", + " else:\n", + " return f\"Error: Line number {line_number} is out of range.\"\n", + "\n", + " with (WORKING_DIRECTORY / file_name).open(\"w\") as file:\n", + " file.writelines(lines)\n", + "\n", + " return f\"Document edited and saved to {file_name}\"\n", + "\n", + "\n", + "# Warning: This executes code locally, which can be unsafe when not sandboxed\n", + "\n", + "repl = PythonREPL()\n", + "\n", + "\n", + "@tool\n", + "def python_repl(\n", + " code: Annotated[str, \"The python code to execute to generate your chart.\"],\n", + "):\n", + " \"\"\"Use this to execute python code. If you want to see the output of a value,\n", + " you should print it out with `print(...)`. This is visible to the user.\"\"\"\n", + " try:\n", + " result = repl.run(code)\n", + " except BaseException as e:\n", + " return f\"Failed to execute. Error: {repr(e)}\"\n", + " return f\"Successfully executed:\\n```python\\n{code}\\n```\\nStdout: {result}\"" + ] }, { "cell_type": "markdown", @@ -127,7 +269,7 @@ }, { "cell_type": "code", - "execution_count": 5, + "execution_count": 3, "id": "e09fb60f-1aac-455b-b67d-8d2e4ccfd747", "metadata": { "ExecuteTime": { @@ -136,7 +278,58 @@ } }, "outputs": [], - "source": ["from typing import List, Optional\n\nfrom langchain.agents import AgentExecutor, create_openai_functions_agent\nfrom langchain.output_parsers.openai_functions import JsonOutputFunctionsParser\nfrom langchain_core.prompts import ChatPromptTemplate, MessagesPlaceholder\nfrom langchain_openai import ChatOpenAI\n\nfrom langgraph.graph import END, StateGraph, START\n\n\ndef create_agent(\n llm: ChatOpenAI,\n tools: list,\n system_prompt: str,\n) -> str:\n \"\"\"Create a function-calling agent and add it to the graph.\"\"\"\n system_prompt += \"\\nWork autonomously according to your specialty, using the tools available to you.\"\n \" Do not ask for clarification.\"\n \" Your other team members (and other teams) will collaborate with you with their own specialties.\"\n \" You are chosen for a reason! You are one of the following team members: {team_members}.\"\n prompt = ChatPromptTemplate.from_messages(\n [\n (\n \"system\",\n system_prompt,\n ),\n MessagesPlaceholder(variable_name=\"messages\"),\n MessagesPlaceholder(variable_name=\"agent_scratchpad\"),\n ]\n )\n agent = create_openai_functions_agent(llm, tools, prompt)\n executor = AgentExecutor(agent=agent, tools=tools)\n return executor\n\n\ndef agent_node(state, agent, name):\n result = agent.invoke(state)\n return {\"messages\": [HumanMessage(content=result[\"output\"], name=name)]}\n\n\ndef create_team_supervisor(llm: ChatOpenAI, system_prompt, members) -> str:\n \"\"\"An LLM-based router.\"\"\"\n options = [\"FINISH\"] + members\n function_def = {\n \"name\": \"route\",\n \"description\": \"Select the next role.\",\n \"parameters\": {\n \"title\": \"routeSchema\",\n \"type\": \"object\",\n \"properties\": {\n \"next\": {\n \"title\": \"Next\",\n \"anyOf\": [\n {\"enum\": options},\n ],\n },\n },\n \"required\": [\"next\"],\n },\n }\n prompt = ChatPromptTemplate.from_messages(\n [\n (\"system\", system_prompt),\n MessagesPlaceholder(variable_name=\"messages\"),\n (\n \"system\",\n \"Given the conversation above, who should act next?\"\n \" Or should we FINISH? Select one of: {options}\",\n ),\n ]\n ).partial(options=str(options), team_members=\", \".join(members))\n return (\n prompt\n | llm.bind_functions(functions=[function_def], function_call=\"route\")\n | JsonOutputFunctionsParser()\n )"] + "source": [ + "from typing import List, Optional\n", + "from langchain.output_parsers.openai_functions import JsonOutputFunctionsParser\n", + "from langchain_core.prompts import ChatPromptTemplate, MessagesPlaceholder\n", + "from langchain_openai import ChatOpenAI\n", + "\n", + "from langgraph.graph import END, StateGraph, START\n", + "from langchain_core.messages import HumanMessage\n", + "\n", + "\n", + "def agent_node(state, agent, name):\n", + " result = agent.invoke(state)\n", + " return {\"messages\": [HumanMessage(content=result[\"messages\"][-1].content, name=name)]}\n", + "\n", + "\n", + "def create_team_supervisor(llm: ChatOpenAI, system_prompt, members) -> str:\n", + " \"\"\"An LLM-based router.\"\"\"\n", + " options = [\"FINISH\"] + members\n", + " function_def = {\n", + " \"name\": \"route\",\n", + " \"description\": \"Select the next role.\",\n", + " \"parameters\": {\n", + " \"title\": \"routeSchema\",\n", + " \"type\": \"object\",\n", + " \"properties\": {\n", + " \"next\": {\n", + " \"title\": \"Next\",\n", + " \"anyOf\": [\n", + " {\"enum\": options},\n", + " ],\n", + " },\n", + " },\n", + " \"required\": [\"next\"],\n", + " },\n", + " }\n", + " prompt = ChatPromptTemplate.from_messages(\n", + " [\n", + " (\"system\", system_prompt),\n", + " MessagesPlaceholder(variable_name=\"messages\"),\n", + " (\n", + " \"system\",\n", + " \"Given the conversation above, who should act next?\"\n", + " \" Or should we FINISH? Select one of: {options}\",\n", + " ),\n", + " ]\n", + " ).partial(options=str(options), team_members=\", \".join(members))\n", + " return (\n", + " prompt\n", + " | llm.bind_functions(functions=[function_def], function_call=\"route\")\n", + " | JsonOutputFunctionsParser()\n", + " )" + ] }, { "cell_type": "markdown", @@ -154,7 +347,7 @@ }, { "cell_type": "code", - "execution_count": 6, + "execution_count": 4, "id": "53db0c78-e357-48ba-ae5f-3fc04735a3b7", "metadata": { "ExecuteTime": { @@ -163,7 +356,44 @@ } }, "outputs": [], - "source": ["import functools\nimport operator\n\nfrom langchain_core.messages import BaseMessage, HumanMessage\nfrom langchain_openai.chat_models import ChatOpenAI\n\n\n# ResearchTeam graph state\nclass ResearchTeamState(TypedDict):\n # A message is added after each team member finishes\n messages: Annotated[List[BaseMessage], operator.add]\n # The team members are tracked so they are aware of\n # the others' skill-sets\n team_members: List[str]\n # Used to route work. The supervisor calls a function\n # that will update this every time it makes a decision\n next: str\n\n\nllm = ChatOpenAI(model=\"gpt-4-1106-preview\")\n\nsearch_agent = create_agent(\n llm,\n [tavily_tool],\n \"You are a research assistant who can search for up-to-date info using the tavily search engine.\",\n)\nsearch_node = functools.partial(agent_node, agent=search_agent, name=\"Search\")\n\nresearch_agent = create_agent(\n llm,\n [scrape_webpages],\n \"You are a research assistant who can scrape specified urls for more detailed information using the scrape_webpages function.\",\n)\nresearch_node = functools.partial(agent_node, agent=research_agent, name=\"WebScraper\")\n\nsupervisor_agent = create_team_supervisor(\n llm,\n \"You are a supervisor tasked with managing a conversation between the\"\n \" following workers: Search, WebScraper. Given the following user request,\"\n \" respond with the worker to act next. Each worker will perform a\"\n \" task and respond with their results and status. When finished,\"\n \" respond with FINISH.\",\n [\"Search\", \"WebScraper\"],\n)"] + "source": [ + "import functools\n", + "import operator\n", + "\n", + "from langchain_core.messages import BaseMessage, HumanMessage\n", + "from langchain_openai.chat_models import ChatOpenAI\n", + "from langgraph.prebuilt import create_react_agent\n", + "\n", + "# ResearchTeam graph state\n", + "class ResearchTeamState(TypedDict):\n", + " # A message is added after each team member finishes\n", + " messages: Annotated[List[BaseMessage], operator.add]\n", + " # The team members are tracked so they are aware of\n", + " # the others' skill-sets\n", + " team_members: List[str]\n", + " # Used to route work. The supervisor calls a function\n", + " # that will update this every time it makes a decision\n", + " next: str\n", + "\n", + "\n", + "llm = ChatOpenAI(model=\"gpt-4o\")\n", + "\n", + "search_agent = create_react_agent(llm, tools=[tavily_tool])\n", + "search_node = functools.partial(agent_node, agent=search_agent, name=\"Search\")\n", + "\n", + "research_agent = create_react_agent(llm, tools=[scrape_webpages])\n", + "research_node = functools.partial(agent_node, agent=research_agent, name=\"WebScraper\")\n", + "\n", + "supervisor_agent = create_team_supervisor(\n", + " llm,\n", + " \"You are a supervisor tasked with managing a conversation between the\"\n", + " \" following workers: Search, WebScraper. Given the following user request,\"\n", + " \" respond with the worker to act next. Each worker will perform a\"\n", + " \" task and respond with their results and status. When finished,\"\n", + " \" respond with FINISH.\",\n", + " [\"Search\", \"WebScraper\"],\n", + ")" + ] }, { "cell_type": "markdown", @@ -175,7 +405,7 @@ }, { "cell_type": "code", - "execution_count": 7, + "execution_count": 5, "id": "1a7a1260-d9f6-4011-b2b1-13fab5126997", "metadata": { "ExecuteTime": { @@ -184,11 +414,42 @@ } }, "outputs": [], - "source": ["research_graph = StateGraph(ResearchTeamState)\nresearch_graph.add_node(\"Search\", search_node)\nresearch_graph.add_node(\"WebScraper\", research_node)\nresearch_graph.add_node(\"supervisor\", supervisor_agent)\n\n# Define the control flow\nresearch_graph.add_edge(\"Search\", \"supervisor\")\nresearch_graph.add_edge(\"WebScraper\", \"supervisor\")\nresearch_graph.add_conditional_edges(\n \"supervisor\",\n lambda x: x[\"next\"],\n {\"Search\": \"Search\", \"WebScraper\": \"WebScraper\", \"FINISH\": END},\n)\n\n\nresearch_graph.add_edge(START, \"supervisor\")\nchain = research_graph.compile()\n\n\n# The following functions interoperate between the top level graph state\n# and the state of the research sub-graph\n# this makes it so that the states of each graph don't get intermixed\ndef enter_chain(message: str):\n results = {\n \"messages\": [HumanMessage(content=message)],\n }\n return results\n\n\nresearch_chain = enter_chain | chain"] + "source": [ + "research_graph = StateGraph(ResearchTeamState)\n", + "research_graph.add_node(\"Search\", search_node)\n", + "research_graph.add_node(\"WebScraper\", research_node)\n", + "research_graph.add_node(\"supervisor\", supervisor_agent)\n", + "\n", + "# Define the control flow\n", + "research_graph.add_edge(\"Search\", \"supervisor\")\n", + "research_graph.add_edge(\"WebScraper\", \"supervisor\")\n", + "research_graph.add_conditional_edges(\n", + " \"supervisor\",\n", + " lambda x: x[\"next\"],\n", + " {\"Search\": \"Search\", \"WebScraper\": \"WebScraper\", \"FINISH\": END},\n", + ")\n", + "\n", + "\n", + "research_graph.add_edge(START, \"supervisor\")\n", + "chain = research_graph.compile()\n", + "\n", + "\n", + "# The following functions interoperate between the top level graph state\n", + "# and the state of the research sub-graph\n", + "# this makes it so that the states of each graph don't get intermixed\n", + "def enter_chain(message: str):\n", + " results = {\n", + " \"messages\": [HumanMessage(content=message)],\n", + " }\n", + " return results\n", + "\n", + "\n", + "research_chain = enter_chain | chain" + ] }, { "cell_type": "code", - "execution_count": 8, + "execution_count": 6, "id": "110f59bed6134685", "metadata": { "ExecuteTime": { @@ -199,7 +460,7 @@ "outputs": [ { "data": { - "image/jpeg": "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L7HktlprlFSV1BHOHEU9ypn007NHEeNG8BzddNRqOwgrZrhmMJwdcbYFm8Lv/V5f+dmf5KmWEs3hd/6vL/zsz/JUy9/7G/iXf8f/AKpedl/8H4u7REX0D54REQEREBERAREQEREBERAREQEREBERAREQEREBERAREQEREBERAREQEREBERAREQYV6+89f/uJP4SouxRodilnaRqDRQgg/wC7ClqogbVU8sL9dkjSx2nmI0K4mn4RW2kp4oIbreo4YmhjGCt5NaBoB2LnynJ4yq1FvOwmJx7nfkmUU2Mc7ijL/R+4ZegGN/VcP/2r5/o/cMh//AMb+q4f/tUpfcqofli9+u/Yn3KqH5Yvfrv2LzfRlz13zduuWOnuhqYII6aCOGFjYoo2hjGMGga0DQADzL0Wy+5VQ/LF79d+xPuVUPyxe/XfsWfof+7HZLT0ha5S1qKNOi3S1vFjhc++3+93SS4C611JugqOrb1cU7mM5AdugHNS79yqh+WL3679ieh/7sdknpC1ylH+QcIcHyy6y3O9YjZbtcZQ0SVVZQRyyvAAA1c4EnQAD9i17uAPDRwaHYDjhDRo0G2Q8hrroPF85P8AzUofcqofli9+u/Yn3KqH5Yvfrv2LSPsuuNkXvmprtid9PdDl8axSy4bbjb7DaqOzUJeZe5qGBsMe86au2tAGp0HP5l0fC7/1eX/nZn+Spl6/cqofli9+u/Yt3i+J0eJQVkdJLUzmrn7omlqpese5+xrO3zbWNH7F25HkeqVV11V52dGHHnE8fc5spyqi7bzKYbtERdryxERAREQEREBERAREQEREBERAREQEREBERAREQEREBERAREQEREBERAREQEREBERAREQEREBERBXfoIfATJ+frp/mnqxCrv0EPgJk/P10/wA09WIQEREBERAREQEREBERAREQEREBERAREQEREBERAREQEREBERAREQEREBERAREQEREBERAREQEREBERAREQEREFd+gh8BMn5+un+aerEKu/QQ+AmT8/XT/NPViEBERAREQEREBERAREQEREBERAREQEREBERAREQEREBERAREQEREBERAREQEREBERAREQEXE3LiWx8rorFQOu5adrquSTqKXX8V+hL/wArGkeTXtWsOaZa7mKOyx/imSZ2n7dB/wBlvoZj8UxHvn6OmnJ7tcYxSklFGvhnl3xa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EREBERAREQEREBERAREQEREBERAREQEREBERAREQEREBERAREQEREBERAREQEREBERAREQEREBERAREQEREBERB//9k=", + "image/jpeg": "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", "text/plain": [ "" ] @@ -208,7 +469,11 @@ "output_type": "display_data" } ], - "source": ["from IPython.display import Image, display\n\ndisplay(Image(chain.get_graph(xray=True).draw_mermaid_png()))"] + "source": [ + "from IPython.display import Image, display\n", + "\n", + "display(Image(chain.get_graph(xray=True).draw_mermaid_png()))" + ] }, { "cell_type": "markdown", @@ -220,7 +485,7 @@ }, { "cell_type": "code", - "execution_count": 9, + "execution_count": 7, "id": "912b0604-a178-4246-a36f-2dedae606680", "metadata": { "ExecuteTime": { @@ -228,8 +493,28 @@ "start_time": "2024-05-15T08:19:51.937879Z" } }, - "outputs": [], - "source": ["for s in research_chain.stream(\n \"when is Taylor Swift's next tour?\", {\"recursion_limit\": 100}\n):\n if \"__end__\" not in s:\n print(s)\n print(\"---\")"] + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "{'supervisor': {'next': 'Search'}}\n", + "---\n", + "{'Search': {'messages': [HumanMessage(content='Taylor Swift\\'s next tour is called \"The Eras Tour,\" which is scheduled to hit U.S. stadiums beginning in March 2023 and running into August, with international dates set to be revealed later. The tour has already started with some shows, including the kickoff on March 18, 2023, in Glendale, AZ. The U.S. leg is set to wrap up in Los Angeles at SoFi Stadium on August 9, 2023.\\n\\nFor specific dates and locations, you may want to check Taylor Swift\\'s official website or trusted ticketing platforms, as the tour dates and details are subject to change.', name='Search')]}}\n", + "---\n", + "{'supervisor': {'next': 'FINISH'}}\n", + "---\n" + ] + } + ], + "source": [ + "for s in research_chain.stream(\n", + " \"when is Taylor Swift's next tour?\", {\"recursion_limit\": 100}\n", + "):\n", + " if \"__end__\" not in s:\n", + " print(s)\n", + " print(\"---\")" + ] }, { "cell_type": "markdown", @@ -245,7 +530,7 @@ }, { "cell_type": "code", - "execution_count": 10, + "execution_count": 9, "id": "1bcdbf44-9481-430c-8429-fa142ed8a626", "metadata": { "ExecuteTime": { @@ -254,7 +539,76 @@ } }, "outputs": [], - "source": ["import operator\nfrom pathlib import Path\n\n\n# Document writing team graph state\nclass DocWritingState(TypedDict):\n # This tracks the team's conversation internally\n messages: Annotated[List[BaseMessage], operator.add]\n # This provides each worker with context on the others' skill sets\n team_members: str\n # This is how the supervisor tells langgraph who to work next\n next: str\n # This tracks the shared directory state\n current_files: str\n\n\n# This will be run before each worker agent begins work\n# It makes it so they are more aware of the current state\n# of the working directory.\ndef prelude(state):\n written_files = []\n if not WORKING_DIRECTORY.exists():\n WORKING_DIRECTORY.mkdir()\n try:\n written_files = [\n f.relative_to(WORKING_DIRECTORY) for f in WORKING_DIRECTORY.rglob(\"*\")\n ]\n except Exception:\n pass\n if not written_files:\n return {**state, \"current_files\": \"No files written.\"}\n return {\n **state,\n \"current_files\": \"\\nBelow are files your team has written to the directory:\\n\"\n + \"\\n\".join([f\" - {f}\" for f in written_files]),\n }\n\n\nllm = ChatOpenAI(model=\"gpt-4-1106-preview\")\n\ndoc_writer_agent = create_agent(\n llm,\n [write_document, edit_document, read_document],\n \"You are an expert writing a research document.\\n\"\n # The {current_files} value is populated automatically by the graph state\n \"Below are files currently in your directory:\\n{current_files}\",\n)\n# Injects current directory working state before each call\ncontext_aware_doc_writer_agent = prelude | doc_writer_agent\ndoc_writing_node = functools.partial(\n agent_node, agent=context_aware_doc_writer_agent, name=\"DocWriter\"\n)\n\nnote_taking_agent = create_agent(\n llm,\n [create_outline, read_document],\n \"You are an expert senior researcher tasked with writing a paper outline and\"\n \" taking notes to craft a perfect paper.{current_files}\",\n)\ncontext_aware_note_taking_agent = prelude | note_taking_agent\nnote_taking_node = functools.partial(\n agent_node, agent=context_aware_note_taking_agent, name=\"NoteTaker\"\n)\n\nchart_generating_agent = create_agent(\n llm,\n [read_document, python_repl],\n \"You are a data viz expert tasked with generating charts for a research project.\"\n \"{current_files}\",\n)\ncontext_aware_chart_generating_agent = prelude | chart_generating_agent\nchart_generating_node = functools.partial(\n agent_node, agent=context_aware_note_taking_agent, name=\"ChartGenerator\"\n)\n\ndoc_writing_supervisor = create_team_supervisor(\n llm,\n \"You are a supervisor tasked with managing a conversation between the\"\n \" following workers: {team_members}. Given the following user request,\"\n \" respond with the worker to act next. Each worker will perform a\"\n \" task and respond with their results and status. When finished,\"\n \" respond with FINISH.\",\n [\"DocWriter\", \"NoteTaker\", \"ChartGenerator\"],\n)"] + "source": [ + "import operator\n", + "from pathlib import Path\n", + "\n", + "\n", + "# Document writing team graph state\n", + "class DocWritingState(TypedDict):\n", + " # This tracks the team's conversation internally\n", + " messages: Annotated[List[BaseMessage], operator.add]\n", + " # This provides each worker with context on the others' skill sets\n", + " team_members: str\n", + " # This is how the supervisor tells langgraph who to work next\n", + " next: str\n", + " # This tracks the shared directory state\n", + " current_files: str\n", + "\n", + "\n", + "# This will be run before each worker agent begins work\n", + "# It makes it so they are more aware of the current state\n", + "# of the working directory.\n", + "def prelude(state):\n", + " written_files = []\n", + " if not WORKING_DIRECTORY.exists():\n", + " WORKING_DIRECTORY.mkdir()\n", + " try:\n", + " written_files = [\n", + " f.relative_to(WORKING_DIRECTORY) for f in WORKING_DIRECTORY.rglob(\"*\")\n", + " ]\n", + " except Exception:\n", + " pass\n", + " if not written_files:\n", + " return {**state, \"current_files\": \"No files written.\"}\n", + " return {\n", + " **state,\n", + " \"current_files\": \"\\nBelow are files your team has written to the directory:\\n\"\n", + " + \"\\n\".join([f\" - {f}\" for f in written_files]),\n", + " }\n", + "\n", + "\n", + "llm = ChatOpenAI(model=\"gpt-4o\")\n", + "\n", + "doc_writer_agent = create_react_agent(llm, tools=[write_document, edit_document, read_document])\n", + "# Injects current directory working state before each call\n", + "context_aware_doc_writer_agent = prelude | doc_writer_agent\n", + "doc_writing_node = functools.partial(\n", + " agent_node, agent=context_aware_doc_writer_agent, name=\"DocWriter\"\n", + ")\n", + "\n", + "note_taking_agent = create_react_agent(llm,tools=[create_outline, read_document])\n", + "context_aware_note_taking_agent = prelude | note_taking_agent\n", + "note_taking_node = functools.partial(\n", + " agent_node, agent=context_aware_note_taking_agent, name=\"NoteTaker\"\n", + ")\n", + "\n", + "chart_generating_agent = create_react_agent(llm, tools=[read_document, python_repl])\n", + "context_aware_chart_generating_agent = prelude | chart_generating_agent\n", + "chart_generating_node = functools.partial(\n", + " agent_node, agent=context_aware_note_taking_agent, name=\"ChartGenerator\"\n", + ")\n", + "\n", + "doc_writing_supervisor = create_team_supervisor(\n", + " llm,\n", + " \"You are a supervisor tasked with managing a conversation between the\"\n", + " \" following workers: {team_members}. Given the following user request,\"\n", + " \" respond with the worker to act next. Each worker will perform a\"\n", + " \" task and respond with their results and status. When finished,\"\n", + " \" respond with FINISH.\",\n", + " [\"DocWriter\", \"NoteTaker\", \"ChartGenerator\"],\n", + ")" + ] }, { "cell_type": "markdown", @@ -266,7 +620,7 @@ }, { "cell_type": "code", - "execution_count": 11, + "execution_count": 10, "id": "9c5c644f-8966-4d2e-98d2-80d73520e9fe", "metadata": { "ExecuteTime": { @@ -275,11 +629,57 @@ } }, "outputs": [], - "source": ["# Create the graph here:\n# Note that we have unrolled the loop for the sake of this doc\nauthoring_graph = StateGraph(DocWritingState)\nauthoring_graph.add_node(\"DocWriter\", doc_writing_node)\nauthoring_graph.add_node(\"NoteTaker\", note_taking_node)\nauthoring_graph.add_node(\"ChartGenerator\", chart_generating_node)\nauthoring_graph.add_node(\"supervisor\", doc_writing_supervisor)\n\n# Add the edges that always occur\nauthoring_graph.add_edge(\"DocWriter\", \"supervisor\")\nauthoring_graph.add_edge(\"NoteTaker\", \"supervisor\")\nauthoring_graph.add_edge(\"ChartGenerator\", \"supervisor\")\n\n# Add the edges where routing applies\nauthoring_graph.add_conditional_edges(\n \"supervisor\",\n lambda x: x[\"next\"],\n {\n \"DocWriter\": \"DocWriter\",\n \"NoteTaker\": \"NoteTaker\",\n \"ChartGenerator\": \"ChartGenerator\",\n \"FINISH\": END,\n },\n)\n\nauthoring_graph.add_edge(START, \"supervisor\")\nchain = authoring_graph.compile()\n\n\n# The following functions interoperate between the top level graph state\n# and the state of the research sub-graph\n# this makes it so that the states of each graph don't get intermixed\ndef enter_chain(message: str, members: List[str]):\n results = {\n \"messages\": [HumanMessage(content=message)],\n \"team_members\": \", \".join(members),\n }\n return results\n\n\n# We reuse the enter/exit functions to wrap the graph\nauthoring_chain = (\n functools.partial(enter_chain, members=authoring_graph.nodes)\n | authoring_graph.compile()\n)"] + "source": [ + "# Create the graph here:\n", + "# Note that we have unrolled the loop for the sake of this doc\n", + "authoring_graph = StateGraph(DocWritingState)\n", + "authoring_graph.add_node(\"DocWriter\", doc_writing_node)\n", + "authoring_graph.add_node(\"NoteTaker\", note_taking_node)\n", + "authoring_graph.add_node(\"ChartGenerator\", chart_generating_node)\n", + "authoring_graph.add_node(\"supervisor\", doc_writing_supervisor)\n", + "\n", + "# Add the edges that always occur\n", + "authoring_graph.add_edge(\"DocWriter\", \"supervisor\")\n", + "authoring_graph.add_edge(\"NoteTaker\", \"supervisor\")\n", + "authoring_graph.add_edge(\"ChartGenerator\", \"supervisor\")\n", + "\n", + "# Add the edges where routing applies\n", + "authoring_graph.add_conditional_edges(\n", + " \"supervisor\",\n", + " lambda x: x[\"next\"],\n", + " {\n", + " \"DocWriter\": \"DocWriter\",\n", + " \"NoteTaker\": \"NoteTaker\",\n", + " \"ChartGenerator\": \"ChartGenerator\",\n", + " \"FINISH\": END,\n", + " },\n", + ")\n", + "\n", + "authoring_graph.add_edge(START, \"supervisor\")\n", + "chain = authoring_graph.compile()\n", + "\n", + "\n", + "# The following functions interoperate between the top level graph state\n", + "# and the state of the research sub-graph\n", + "# this makes it so that the states of each graph don't get intermixed\n", + "def enter_chain(message: str, members: List[str]):\n", + " results = {\n", + " \"messages\": [HumanMessage(content=message)],\n", + " \"team_members\": \", \".join(members),\n", + " }\n", + " return results\n", + "\n", + "\n", + "# We reuse the enter/exit functions to wrap the graph\n", + "authoring_chain = (\n", + " functools.partial(enter_chain, members=authoring_graph.nodes)\n", + " | authoring_graph.compile()\n", + ")" + ] }, { "cell_type": "code", - "execution_count": 19, + "execution_count": 11, "id": "58e7d1e48a9c39a5", "metadata": { "ExecuteTime": { @@ -290,7 +690,7 @@ "outputs": [ { "data": { - "image/jpeg": "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", + "image/jpeg": "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", "text/plain": [ "" ] @@ -299,11 +699,15 @@ "output_type": "display_data" } ], - "source": ["from IPython.display import Image, display\n\ndisplay(Image(chain.get_graph().draw_mermaid_png()))"] + "source": [ + "from IPython.display import Image, display\n", + "\n", + "display(Image(chain.get_graph().draw_mermaid_png()))" + ] }, { "cell_type": "code", - "execution_count": 13, + "execution_count": 12, "id": "9860fd46-c24d-40a5-a6ba-e8fddcd43369", "metadata": { "ExecuteTime": { @@ -311,8 +715,29 @@ "start_time": "2024-05-15T08:19:53.709307Z" } }, - "outputs": [], - "source": ["for s in authoring_chain.stream(\n \"Write an outline for poem and then write the poem to disk.\",\n {\"recursion_limit\": 100},\n):\n if \"__end__\" not in s:\n print(s)\n print(\"---\")"] + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "{'supervisor': {'next': 'NoteTaker'}}\n", + "---\n", + "{'NoteTaker': {'messages': [HumanMessage(content='The poem has been written and saved to \"poem.txt\".', name='NoteTaker')]}}\n", + "---\n", + "{'supervisor': {'next': 'FINISH'}}\n", + "---\n" + ] + } + ], + "source": [ + "for s in authoring_chain.stream(\n", + " \"Write an outline for poem and then write the poem to disk.\",\n", + " {\"recursion_limit\": 100},\n", + "):\n", + " if \"__end__\" not in s:\n", + " print(s)\n", + " print(\"---\")" + ] }, { "cell_type": "markdown", @@ -328,7 +753,7 @@ }, { "cell_type": "code", - "execution_count": 14, + "execution_count": 13, "id": "95ae7e52-92ed-41a3-88c4-21b6d7c8b041", "metadata": { "ExecuteTime": { @@ -337,11 +762,26 @@ } }, "outputs": [], - "source": ["from langchain_core.messages import BaseMessage\nfrom langchain_openai.chat_models import ChatOpenAI\n\nllm = ChatOpenAI(model=\"gpt-4-1106-preview\")\n\nsupervisor_node = create_team_supervisor(\n llm,\n \"You are a supervisor tasked with managing a conversation between the\"\n \" following teams: {team_members}. Given the following user request,\"\n \" respond with the worker to act next. Each worker will perform a\"\n \" task and respond with their results and status. When finished,\"\n \" respond with FINISH.\",\n [\"ResearchTeam\", \"PaperWritingTeam\"],\n)"] + "source": [ + "from langchain_core.messages import BaseMessage\n", + "from langchain_openai.chat_models import ChatOpenAI\n", + "\n", + "llm = ChatOpenAI(model=\"gpt-4o\")\n", + "\n", + "supervisor_node = create_team_supervisor(\n", + " llm,\n", + " \"You are a supervisor tasked with managing a conversation between the\"\n", + " \" following teams: {team_members}. Given the following user request,\"\n", + " \" respond with the worker to act next. Each worker will perform a\"\n", + " \" task and respond with their results and status. When finished,\"\n", + " \" respond with FINISH.\",\n", + " [\"ResearchTeam\", \"PaperWritingTeam\"],\n", + ")" + ] }, { "cell_type": "code", - "execution_count": 15, + "execution_count": 14, "id": "4880e573-612f-4d24-97c1-2079382a4a2f", "metadata": { "ExecuteTime": { @@ -350,11 +790,50 @@ } }, "outputs": [], - "source": ["# Top-level graph state\nclass State(TypedDict):\n messages: Annotated[List[BaseMessage], operator.add]\n next: str\n\n\ndef get_last_message(state: State) -> str:\n return state[\"messages\"][-1].content\n\n\ndef join_graph(response: dict):\n return {\"messages\": [response[\"messages\"][-1]]}\n\n\n# Define the graph.\nsuper_graph = StateGraph(State)\n# First add the nodes, which will do the work\nsuper_graph.add_node(\"ResearchTeam\", get_last_message | research_chain | join_graph)\nsuper_graph.add_node(\n \"PaperWritingTeam\", get_last_message | authoring_chain | join_graph\n)\nsuper_graph.add_node(\"supervisor\", supervisor_node)\n\n# Define the graph connections, which controls how the logic\n# propagates through the program\nsuper_graph.add_edge(\"ResearchTeam\", \"supervisor\")\nsuper_graph.add_edge(\"PaperWritingTeam\", \"supervisor\")\nsuper_graph.add_conditional_edges(\n \"supervisor\",\n lambda x: x[\"next\"],\n {\n \"PaperWritingTeam\": \"PaperWritingTeam\",\n \"ResearchTeam\": \"ResearchTeam\",\n \"FINISH\": END,\n },\n)\nsuper_graph.add_edge(START, \"supervisor\")\nsuper_graph = super_graph.compile()"] + "source": [ + "# Top-level graph state\n", + "class State(TypedDict):\n", + " messages: Annotated[List[BaseMessage], operator.add]\n", + " next: str\n", + "\n", + "\n", + "def get_last_message(state: State) -> str:\n", + " return state[\"messages\"][-1].content\n", + "\n", + "\n", + "def join_graph(response: dict):\n", + " return {\"messages\": [response[\"messages\"][-1]]}\n", + "\n", + "\n", + "# Define the graph.\n", + "super_graph = StateGraph(State)\n", + "# First add the nodes, which will do the work\n", + "super_graph.add_node(\"ResearchTeam\", get_last_message | research_chain | join_graph)\n", + "super_graph.add_node(\n", + " \"PaperWritingTeam\", get_last_message | authoring_chain | join_graph\n", + ")\n", + "super_graph.add_node(\"supervisor\", supervisor_node)\n", + "\n", + "# Define the graph connections, which controls how the logic\n", + "# propagates through the program\n", + "super_graph.add_edge(\"ResearchTeam\", \"supervisor\")\n", + "super_graph.add_edge(\"PaperWritingTeam\", \"supervisor\")\n", + "super_graph.add_conditional_edges(\n", + " \"supervisor\",\n", + " lambda x: x[\"next\"],\n", + " {\n", + " \"PaperWritingTeam\": \"PaperWritingTeam\",\n", + " \"ResearchTeam\": \"ResearchTeam\",\n", + " \"FINISH\": END,\n", + " },\n", + ")\n", + "super_graph.add_edge(START, \"supervisor\")\n", + "super_graph = super_graph.compile()" + ] }, { "cell_type": "code", - "execution_count": 20, + "execution_count": 15, "id": "270ff3ae26cd42ff", "metadata": { "ExecuteTime": { @@ -365,7 +844,7 @@ "outputs": [ { "data": { - "image/jpeg": "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a3Q3CIi1l7Pw7/XdlH8DRf1ysFV9w7/XdlH8DRf1ysFe9t/wrf8AbT/jDy2VfxqhERZtUREQEREBERAREQEREBERAREQEREBERAREQEREBERAREQEREBERAREQEREBERAREQEREBERAREQEREBERBTWD/rTtn8F/7laCo4DcN6qeSabA8dlmkcXvkfbIS5zidkk8vUkqy4OENrpImxU9zvEELd8sbKzTWj2Dov7/AAVUP2xe/wBN/sXLvezpuXq7tF3DOmZ2T0y7sZbZwiJhV7+APDSR7nvwHHHPcdlzrZCST7fqqaWy2Ullt1NQUFNFRUVNG2KCngYGRxsA0GtaOgAHqC3n4KqH7Yvf6b/Yn4KqH7Yvf6b/AGLXn2VVVtvR3SmMusxspa1FsvwVUP2xe/03+xVF5OtLW8Svwnd9Xu6P7gzi52Gi7Go5NUsHZdmHdPSd6Z2fWseZ/wDtjullzha3SstRfJ+FuHZrcGV2QYvaL1WsjELaivoo5ntYCSGhzgTrbnHX3lTr8FVD9sXv9N/sT8FVD9sXv9N/sUx7JmmcYux3SicvtTqmJVd/e/8ADPWvoBjevZ3XD/8AqpLi+F2DCKOWkx6y0FkpZZO1khoKdsLHv0BzENA2dADf3KWfgqofti9/pv8AYn4KqH7Yvf6b/Ysp9lV1RhN76sYy2zGuKXk4d/ruyj+Bov65WCtBjGGUWKTVs1NPV1M1XyCWSrm7R2mb5QOnT6xW/XbimKKaaInHCIjuiIci9XFy5NcdIiIikREQEREBERAREQEREBERAREQEREBERAREQEREBERAREQEREBERAREQEREBERAREQEREBERAREQEREBERAREQEREBc7+Rv/lx/wBqV8/qF0Qud/I3/wAuP+1K+f1CDohERAREQEREBERAREQEREBERAREQEREBERAREQEREBERAREQEREBERAREQEREBERAREQEREBERAREQEREBERAREQEREBERAREQEREBc7+Rv/lx/2pXz+oXRC538jf8Ay4/7Ur5/UIOiEREBERAREQEREBERAREQEREBERAREQEREBERAREQEREBERAREQEREBERAREQEREBERAREQEREBERAREQEREBERAREQERfCdDZ8EH1FB6/iYJ5DHYbebswHRrZZexpT97H6cZB97Wlp9TvZrTmmWuOxSWVn70yTO1/Hof8FfyMx96Yj4y2acmu1RjFKykVa/TPLv3NZP96ZPpnl37msn+9MnJR1o72WiXtypv7oZwOdxb4IS3i3w9rfsTMlxgAG3SU5aPOYx/5Wtf7SYgB4r87vI/4HP488brPZqmB0lhoj3hdna9HzeMj8Wf9Nxaz2+kT6l+tD8vyyVjmPpLG9jhotcZSCPYVU/AXg4/yeZMpfjdLanPv1caqQzmT8REN9lTs0PqM5n6J6nm6noE5KOtHeaJe3OpEVa/TPLv3NZP96ZPpnl37msn+9MnJR1o7zRL25ZSKtfpnl37msn+9MssGe5HTOBqrPb6yPY35pVuZIB6yGvZo/kLh+VOS3VR3k5Lej+lYqLT45ldBk8UhpXSRVEOu3o6hvJNDveuZvsOjpw206OidLcKqqmaZwqasxMThIiIsUCIiAiIgIiICIiAiIgIiICIiAiIgIiICIiAiIgIiICIiAiIgIiICIiAiIgIiICIiAiIgIiICIiAiIgKvc6urr1dnY/G7/oEEbZbhyn9WLt8kB/ekek4esFrTtpcDYSqOje6a+5NLJ+quukjXe3TWMa3+i1qut/ZpqrjbGxu5JRFdzX0PcAAAANAepFGOJ1TklHw/v0+HwRVOTR0r3UEUwBa6T8hIBOt6B6E630VPWfindzR4XDS5jW3msrMwhtV1gutohoa2lidRzSOppogwcp542uD2gbGgHEbJ1HcquRTOEuiEXO/Ezifl1qvfESgtV6FB3dcscpKB5pIpRTtq5Gtn6Ob6fNv9kenqIX85xxayngZdMpoLpdfpnDDjT77bp6ulip5YZm1DKfspOxaxroy6Zjt6B01w360wYzepjHHo9fo6KRc/wCK5HxYoL2zvWlvlXZpaGqfW1d6obZTNopmxF8ToPNp3uc0uHKWvDj1B5uhWvtOUcRqLgLYeJlbls11nbS0N3uNqht1MyGSiBBqA0iPnDzE4vJDgOZnohoOkwOVjdLoa6XahsdBNXXKsp7fRQgGSpqpWxRsBIA5nOIA6kDr7V6lzPxVzfIcowLiRklqvUUeLWuvpLfbaZ1BS1UFb2b2sqnv7WN/M10svKNeBp9jWzuVPzLJ7bxzmtmSZBUY5Y6msjhsVGLXFJQ3WMxAuYaoguZUc/N6Bc3o0codtDlYx2etfBdyLmmh4o5yeHdp4sz3+J1krrrDHJigoIhHHRS1gpmhs2u1MwDmvJLuXexy6U34XXPL8yzfNKqvyh8disWSVNtprVDRQDtomwxuDZJCwu00yAt5SHbDuZzgQAIuxMxERtWpWwzxyxV9veIbpS7dBJvQeOhdE/2xv0AR9wcNOa0iyMevUOR2WjuUALI6iMP5HH0mO8HMOvW0gg/eFAluOE73dx3KL/sorpVCPXhov53f0nO/nW1T9q1OPR+vr6tDLqIwivpTZERVOOIiICIiAiIgIiICIiAiIgIiICIiAiIgIiICIiAiIgIiICIiAiIgIiICIiAiIgIiICIiAiIgIiICIiAqzyWgdYswqJXAiivHLJG8n0W1LGBr4/uLmMa4e3lkPq62YtTkrLXVWetp7q0S0rYHTyRMDnShrPS52Bnp8zSAQWekHa110rKKojGKtk6l9m7NquKlbZFZRkVkrLaa6ttvnLOTzu3TdjURfvmP0dH+JV43ydbC621jJ7xfau9VVxp7q7IZ6phr2VEDOzhc0iMRgNYXN5eTRDjsHalXD3JavP8AFIcix6ir71YJpXxU8ldTihrnMa4jnMcnKx7XDTg9pbsH6oIIW7NdcW9HY1emu9YFM12v4w4hOQrn7uE/CfUu5F2zc1zKk+Ink8S/Ra/iw3C9Xu+X+62eor6murYhK1lNUMLpY3crAwtj5jodPRAa0eCmlo4DY9S/SCS81d0y+rvlH3dWVd/qGyyea9T2DORrGsZtxd6IB313sBTjvCv93L1+if2p3hX+7l6/RP7U0e7uImzE44wh+I8HocTjnhOVZPeaR9E+ghpbrXtlip4na+oAxu3ANADn8zgNjfUqQ4thVuxTB7bikHaVlqoaFluaKwte+WJrOT09AAkjx0APuXjsPEa3ZRcrvb7PT1d0r7RMILhTUbWSyUkh3psjWuJaTpw6+trh4tOvuNcQqPMTdRZbddLj3VXy2ut7Gl32FVFrtIndfrN5hv8AKmj3dzOK7UbJhqpOCeO/gii4cU5qqPH4oI4Gugkb2+mSCTmLi0jmc8bJ5euz4L+bvwZt9/zGmv1yv1/rYKaviucFlmrGmgiqY2gRyNZycw5dc3Lz8vN10pj3hX+7l6/RP7U7wr/dy9fon9qaPd3Iz7O+FeU3k645TXanlFxvT7JTXE3Wnxp9W022Gp5zJztj5ObQkJeGF5YHHfKpliOEUOGTX+SilqJXXq6S3ao84c0hkr2MYWs00abqNugdnqeq2PeFf7uXr9E/tWWAXyucG0uNV4JIHPWOjgjA9p24u/kaU0e70x5wjlLNOuJh/Vxrm26kfO5rpCNNZEz60rydNY0etznEAD2kLZcPMwxu3XeXh8L7SVGbUMJuFytjHkyxmUiVzvDq0GZoB9hb4eC22MYRJQ1cdyvE0dZcowexihBEFLsEEsB6ueQS3nPXWw0NDnB1QcdPK94X+T1nktDfrLdanKZKNrnVFutTQ98LtaaJ5HM52+gN8rnNBbrfM0gTOFFOZE473KyrKIuzFNOyHQ1HXU1xgbPSVEVVC7wkheHtP8Y6LOvzSx7ysOHV1tVNwm4U4Bf8Ojyy90zG1lFkRtk0FVLJCxsombHUOYNsjBDQRyg9OpC7tuOF5lS1+EssObuprLZ2Mp7vSXOhZV1F3jaGDndUE8zJNNOyB1LyT4BVNBYCKDW+955T5dk7Ltj9tfi1LTmaz1Nuq3Pq6pwA/FSRuADXHR0QddQN+JWkd5Q1lx7hjHm2cWi9YBQ+dmjlpbzQvfPE/ZAcWQh5LDo6dr7/AGILURaP6c46Lxb7Q+90EN3uFOKqkt09Q2OpniO/TZE4hzh0O9Dprqt4gIiICIiAiIgIiICIiAiIgIiICIiAiIgIiICIiAiIgIiICIiAiIgIiICIiAiIgIiICIq3/DXbcqt+bU/D1kWa5Riz/NqmziV1GDUkuAhM0jeUHbH7I2AW6JCCyFFLpxLsdHHksNvqW5DecfozWVtjs8jJ64DlcWsEfMPTdyENaSNnXtCj8+G5hnH0BvF3yStwystZFXeLBYZWSU1fN6BET5XN5jGC1wLR4h5G9gOUvs+D49j97ul5ttkt9Dd7q8SV1fT0zGT1JAAHaPA27w8CdfyoILUVfEPijh+I3bH53cMKiWsFTdbdfLe2qq/NmvOouXmDWF4aN+BDX+LSOsmtXCbGLLxHvOeUtvc3KrtTspKmufUSO3C0MAjawu5Wt2xpOgNnqVMEQEREBcD+XL5dVTiFwufDfh3VsZdogae736CQONK4jT6eAjwlHg9/iw7aNPBLe+Fy75Z2P2vitkPC/hc620dZd8huzp5q2SBj6igtkAbJVuikI5ojJyxt2CObkLeqDnv+5NXnlzDiLbnSF0lVRUtUQT49nJI3f/3l3Dwbu3ers5/6g/QPzbKK6m32HZd9cvJ/hL9Sj5u239b098n13eqD8E/I1xDyfeJ1yy3ELjdIqa40NRRTWiukbPFEHzwyx9i/QeGxiN7dPMjnB7SXAtPNZPDS15tazlf00vFFdxUX6qqLJ5mwN81tbuXzeCTUbNyN0/ZPOeo9N3qCaIiICIiAqj8pPyb8d8pHBn2e6tbR3emDpLXd2MBlpJSP6UbtAOZvroHoQ0i3EQflT5L/AJGefw8d8mtl0uF14f3bFaEVFJkFuDHgzzSGKFzGv0ZoZY2VY23Q9AtcWnbT179J/KQ4QdL3j1m4yWOPxr7E8W+6Bv7Z8DhyPP72MH8vs6ZRBRGE+Wlwyym5Cz3a4VWB5E0hslny6mNvmY72cz/xfj4Dm2fYryhmhradksT2TwSt5mvYQ5r2n1g+BBWhzbhzi3Ei2m35Tj9uv9Jo8sdfTNl5N+thI20/e0gqjKjyNJMFnkrODvEPIOG83MXi1PlNxtTj49aeUnx9pLteoIL4uOBY3d8otmSVtit9TkFsa5lFdJKdpqYGkOBa2TXMG6e/pvXpE+Ki1s4G2jGX59VY5c7tZbnmHaSVNU2sfMKSof2pM9Ox5IjdzSl2h09FvQAaVWfhe478I/Qz/hrT57Z4/rX3ApS6cN9rqOT0nO148vK0KdcN/K04W8UKgUVtyeC3Xnm5H2e9A0VW1/7Tkk0Hu+5hcg9Nxxfivi/DnH7XjGVWfJ8noqsuuF1yulfE2tpiZDyBkH1XgOjAO+vZ9T6RUiqMvymDipTY+3CpZcSmozMcqbXxckc4DiYXU+uf1NAdvRLj7FNUQVrj/H/F7zY8qu9dHdMZt+NVBp7jLf6F9KGddB7d75mHoQR7RsBTax5RZ8ltdvuNqudJcKG4R9rSVFPM17KhutksIPpa+7wXtrqCmudJLS1lPFV0sreWSCdgex49haehCh+UcFMHzKHHIbtjdJNBjlQ2ptMMPNBHRyNLSCxsZaNbY30SCOnggm6KG0XDh9BxNuOYtyjIZmV1KKZ2PT1gda4XAMAljh5QWv0w7PMd85+5RygoeLeHcM7q2e52XiJmzKprqB8tP3XBJTkxhzZA0uAeB2pBHTZaD4HYWqigFx4lXewXHCbdccIvdXV36Nra+ossbaqks85DNtml238WC5/pgeDN666XpsfGbD8iznI8PobuH5Dj0YmudNJBLG2BhDTzdq5oYR6Q8HHXXfggmyLXWHI7TlNuZcLLdKO70DyQ2qoKhk8TiPEBzSQf5VsUBERAREQEREBERAREQEREBERAREQEREBERAREQEREBFGncR8admc2IQ3qiqMripTWus0c7TUNiHL1c3fo752kA62Dvw6qCxV3EbjJwwlfSQVfBe+z1/Ix9bFBcanzIa28M3yxvfsgB3Vpb69gkLUnu9BTXGmt81bTxV9S1zoKV8rRLKGjbi1pO3ADx14KsH8Tck4o4Bk1Rw0tMtpyCirRQUU+Z2+alpajTmCSdgHpOY0GTR19aPRbpS38FmMT51Q5vV2imq8xpKIUMd5ewiVsen75RvlaT2jxsDena3ropagr93CeHIciwzKsmuFdVZLj9IGCKgrZYbe6qczllmEAIBJ5ngb/AGLtEHQ1OaWip6Fsgp4IqcSSOleImBvM9x25x14knqT61nRAREQEREBERAXNvAf/AOLXlB8TOKcn461Wt4w7H3nq3soDz1UjfaHykacPUXBT/wApzidLwl4J5JfKLmdepIRQWqKPq99ZOezh5R6y0u59exhW04C8MYuDnCDFsRYGme30bRVSN6iSpft8z9+wyOeR92kE/VU8ArXhNrdxH+hd4rbuajMrjUXvzxhb5rdHdn5xBHuNm426ZojnHU+m71Wsq64N3bvV2c/9QfoH5tlFdTb7Dsu+uXk/wl+pR83bb+t6e+T67vUFioiICIiAiIgIiICIiAoLxJ4GYDxepzFl+KW29PLeUVMsXJUsHsbMzUjf4nBTpEHMn96vm/C/8bwe4r3W0UjOrMbykd5W7X7RjiOeFv3tDnfen98pxN4V/i+LXCWtfQR/XyTCH+f0mv274SeeJv3udv7l02iCueGPlEcOOMMbPonltvuVU4b8wdJ2NW327hk5X9PbrX3qxlVXE7yXOGHFyR9RkGJ0ZujjzC60ANLWB3qcZY9FxHq5tj7lXH4CeNHCX8Zwz4qHJ7VH1ZjufxmpHKPBrapnpjp0DQGj2lB04i5lZ5YF54cvbTcZeGN9whrSGuv1sb3naj++MkfVm/U30irtwDi1hnFSh87xLJrbf4g3meyjqGukjH7+P6zD9zgEEtWCqoqeuhmhqaeKoimjMUkcrA5r2HoWuB8QfWCs6IK2yDyesLvPD04XRUE2M2EVXnrIsemNE6ObZPM0s8Op3rw6D2L33HA8hfnWNXW15tWWvHbXTebVmPGkjnZcNNcGudM70mOBLOoBJ5Pv2p0iCurbX8T7TUZ5V3q24/erdTNknxegsk0sVZVgdoWw1L5tRsedRN5mjlBc4nwWtuPHtuG8NrFlOb4ne8dq7lVmjls9JCbhNRu3IGukMQ1yERg8w/btCtdEEem4g41T5pDiEt9oIsonp/OorS+doqJIvS9JrD1cPQcenqaSt+x7ZG8zHBzeo207C1suLWaa/wAN8ktFBJe4YzFHcnUzDUsYRotbJrmAIJ6A+tQuh4A4rjtky+gxbvDD58plNRX3GzVr21QnO9yxOkLxG7qfAa6nogsdzgxpc4hrQNknwCwd4Uv7ph/OBV1dMLzeyY3idusGZNqYrXI0Xqov1L5zU3Wm2OcCQEcknLzaOiCSPDXXmfgJnV+4oUVgqKzjvG7IKiSSWoxWGhthl5I5XbjLRH2gBYzZPiAdoO3e8KX90w/nAneFL+6YfzgXFN049Znj+P010hY/IJW8RblY5aCKCNsk1uhFURFHoDb2tiaWn6zi0Ak7O5pduLVbc84q/o/eGT45NgU9/ozHExzTUCblZLst5ujenKTr2jaDqLvCl/dMP5wJ3hS/umH84Fxa3ipld+h4VW2tzeLBYsgxOnukmQy0FPJ3jcXtj5qZvat7Jh04v5QATzAN0plfuLX4OONFhsGXZfb6Cwy4nJUzVFw7Gkjqa9tTCwSBx6tJYZT2YdrW+h1tB1HFVQzu5Y5o5HAb01wJWVUD5O/FA8SOJnE9lFfKW+Y3bKijitU1EY3xNY+lifKGyMHp/jS/eydHY6a0r+QEREBERAREQEREBERAREQV1glryD8Jme3HIMas1DTmanhst8oooxVV1J2W3NmdzOftj+mnco9g11ViqtKi00Nk8oGlvNXm0kVTfLI62UOITy+hLJDJ20lVE0u8QzTSA0e0k70LLQEREBERAREQERVFxT8pjGOHN3bjdvhq8zzqcap8XsDO3qt+2Uj0YWjYJLzsA7AIQW3JIyGN0kjmsY0FznOOgAPEkrn/ACjyp3ZJe6nFuDVhdxIySI9nUXKN/Z2W3H2zVPg8jx5IyS7RAdvotdHwQ4gcfJG1vGa9dyY04h8fD7GqlzIXN9Ta2qaeaY+1rCG7AII8Ff2L4pZsKslNZ7Ba6Sz2umbyxUlFE2KNv8Q9Z9Z8T60FL4X5MlZdcot2a8XMmmz3LaKVtTQ0Ue4LRapQdtNPTjXM5p/7R/U6BI2Nq/URAUPvHDlt14j2TL2ZBe6GW208lLJaaasLaCtY4O120OtFzXO5g4aPogHYUwRBWVg4r3KxY1eLrxVtdu4eQ0V08wp6qa6MmpquN7miGVr9DlB5w0h3UFrieUAgWVBPHUwxzQyNlikaHskY4FrmkbBBHiCtfkmM2jMLLU2i+W2lu9rqW8s1HWwtliePva4EfeD6lGZcMyOl4mUF9t+VyU2IQW40c+JNoojE+RvN2cscnRzCObRA6ENaPBBOUUG4Z8URxAxyS5XHH7thdVFXOtz7fkMTYJXTDWuz6kPa7mHK4ePXXgpygIiICIiAiIgIiICIiAiKh+NXHm7U+Ts4ZcLaWG/cS62Pmmlk9KjsMB1upqndQCAQWx+J2Ng7a14e/jpx5lxC402CYVbGZbxOvEZ80s4O4aOI9DU1jv2ETd70SC7wGh1DydPJotHA2irrpVOgvGdXlxmu97ZA2JrnOPMYoGNAEcQPqAG9AnwaG7rgbwHtXBe01kgqpr/ll2f5xeskrvSqq+Y9SSTvlYCTysB0B7Tsmz0BERAREQEREBERB57h/iFT/BO/4Fc8+Tpw+qsC4S47bb3aoKC/0rJxOB2cj2l00jh+MYSDtrh4H16XRkkbZY3McNtcCCPaF4e4aH/Mf03fNByPZ+E2V0s9jdLauUU3Ey45BKfOIjy0EraoRzfX677Vnoj0hzdQNHXsdwDuONcTsxvFjPbY7ecYrqSltxka0UVbLK2R0cYJGo5HF8g9TXF/gCN9Wdw0P+Y/pu+ahnEaw5R53iX0Ogouw76g7888ed93ad2vZ7P198utfegoqSzZbZuDOGYTUcLqbNYG43S0VwhqrpTRR01VHA1hY9r9hzQQfTjJI1030K/nhpwZyDGc4wiTIYob3R2jB32aquMj2SM8886he1jWuPOQGMcA/l1pvXROl1V3DQ/5j+m75p3DQ/5j+m75oKd4H4RcMX4u8VLlNb2UVovFRQy258bmcsrI6OGOQhrTtuntcPSA34jY6q8l5aW201HIXwx8jiNE8xPT+Mr1ICIiAiIgIiICIiAiIgIiIKA8oTjpwl4U5Vid5yqe3XPJrNcxRRR0tYx9fZY6qL8bUvp2u7Qx9mG7AYSQ5uh1U74R+UFgHHbvb6DX/vzursvPP+h1FP2Xa8/Z/qsbObfZv8N6111sL84PL98lB/B/LZc2xqja3C73UEyQQM0221TtuMfKBpsbupZroOrdDTebpr+5dcPhjnAy55PLEG1OR3JxZIP2dPBuNgP5JDP/ACoOyUREBEWqyfKbPhdkqbxfrnS2e10zeaarrZWxRsH3k+s+AHiT0CDaqD8U+NOHcGrSyuyq8xULpjy0tFGDLVVb/ANhhbtzzsgdBobGyFVUnGfiBx5caTg9Z+4MYeeV/EDJaZzY3t9bqKkdp0x9j36bsEEDxU04W+TZi/De7PyOskq8wzicf9Iyi/yecVZPsi36MLOpAawDp0JOkEGLOMPlG/WNXwV4fS/sRo5FXxn2nq2kBH5Xgj1gq2+FnBfDuDNofQYpZobeZjzVNY7clVVv8S6WZ23POyT1Ohs6AU3RAREQEREBERAREQRPibwsxnjBjJsGV20XO29syoYwSvifFK3fLIx7CC1w2eoPrI9a8B+m9p4k1VRNPZpOGjLXzMhjhlNxp6lmtga2HscC49OvoAAb6unaIInww4oY/wAYMRgyPGqmWot0r3wnziB8MkcrDp8bmuAILT0Otj2EqWKE8TeFlNxKtNuo++7zjUtvr2XGCrsFWaWXtBzcwdoac1we8EEfsiVwX/dLvKGyJ2SS8JqdtFR2aCSmuk9VQVzn1FQOz3HDOxpAj0/cnI4EnUDxrpsP0qRc1+Q15TDePvDJtDd6kPzOwtZT3APPpVUetR1I9vNrTvY4E6Ac1dKICIiAiIgIi5p4kcXsk405hXcLuDtYKbzV3ZZLnLBzQWhh6OgpyP1SpPUdD6PXRBBcwNjxY43X/L8xqeFfB/sqvLWgC9ZI9vPRY7ETolx8Hz+PLH6j4+BAsPgrwRsHA/GZLbaO1rbjWSec3S9VrueruVQdl0srz1PUnQ8Bs+skn3cJOEWN8FcOp8dxmjMFMw9pPUynmqKyY/Wmmf4uefb4DoAAAAJogIiICIiAiIgIiICIiAiIgLn/AIpcVeEWZ1uFyycZ8ftRs1/p7m1tuvVPIKp0YcOxm5XnliO+rnaA0NroBfjD5cHAo8D+OVxhoYOzx2+buds5G6ZG17j2kI9Q5H7AH7UsJ8UH6+YjxGxPiAKs4vlFmyQUnJ5x3RcIqrsebfLz9m48u+V2t+PKfYpEqG8izgX+Argfa6Gtp+xyO66uV15h6TJXgckR9nZs5WkeHNzkeKvlAREQEREBa2/ZBRY3QiprZC0PeI4omDmkmkIJDGN8XHQJ+4Ak6AJGyVSxXI5Tc5r7IRJE/mht49UdNsdR98haHk+scg68oVlNMYTXVsj1g2bFnlq8OhsarMMnubi6lZRWOAj0WTxmqn8f2RDmsadeoc35V5O88s944/h8fzUez7iVjvDG3UddkddJRU9ZUijpzDSTVL5Ji1zgwMiY531WOO9a6LJhHETHOI9vmrccusVzggk7GYNa5kkL/HlkjeA5h+5wCcvVGyIiPhE/XGXZjJ7ETm4a297zyz3jj+Hx/NO88s944/h8fzWZE0ivdHhp4M9HtdVh7zyz3jj+Hx/NO88s944/h8fzWZE0ivdHhp4Gj2uqw955Z7xx/D4/mneeWe8cfw+P5rMiaRXujw08DR7XVR/M7Bc+IOL3LHcgutPcrPcIjDUU0tvYA5viCCDsEEAhwIIIBBBCxYDjN04aYbacXsN7ZS2i1wCCnjdQsc7Q6kuJPVxJJJ9pKkqj9r4gY9eaGhq6a6w9hXVktvpTMHROnqI3Pa+NjXgFxBjk8B4NJHTqmkV7o8NPBGj2Y/phuu88s944/h8fzTvPLPeOP4fH814Tk1tGTtx41B74dRmvFP2b/wBQDwwv5tcv1iBre/u0tomkV7o8NPA0ez1YYe88s944/h8fzVbZJwPizfNoMnym9T5PV0ruaiobtCJaCkPhuOm2I9/e5rj0B3sKz0TSK90eGngnR7XVYGXDKo2hrciia1o0ALdGAB/KvveeWe8cfw+P5rDa71QXyGaW31kFbFDNJTSPp5A9rZWOLXsJHra4EEeoghexNIr3R4aeBo9nqsPeeWe8cfw+P5oLnlY/7xxn8tvj+azImkV7o8NPA0e11WWkzHJrW7mq4qK+U4+s2mjNLUf+Xme5jj9xLPyqc2O+0eRUIqqKQuYHFkjHjlfE8eLHtPUEbHT2EEbBBUBXkFxOLXinvMZEcDnsguDeupISS1rj98bnB2/2vOPX0ypqi9ObMYT0YdPuw2etbUv5JTmzVb1TC2URFS4oiIgIiIMNXVwUFLNU1MzKemhYZJJZXBrWNA2SSfAAetQOuz67XR/+BaOGho9jlrLnG4ySD2thBaWj2c5B9renXDl9yN/yeS2b3b7SY3yx9fxlUWh7Ob2hjHMcB+2eDrbGlafJcjt2IY/cL3d6jzS2UEDqipn5HP7ONo248rQXHQ9QBKumYtYasavpudXJslpqp5S49pumWO6nIYWn2MtzAP53E/zrm3L/ACDsLzfJ7xf7lcrh3ndayavqpITyh0sry95DdkAczj0HgrfwbjbhfEi5y22wXnzm4xw+cGjqaWelmMW9c7WTMY5zdkdQCOo9qnCx0ivdHhp4N6LFmqMYiFBcI/JBsnBHM4MoxXIbpSXOKKSAiXT4pY3t0Wvb4OG9OAPra0+pXv3nlnvHH8Pj+azImkV7o8NPBlo9rqsPeeWe8cfw+P5p3nlnvHH8Pj+azImkV7o8NPA0e11WHvPLPeOP4fH807zyz3jj+Hx/NeDJsqteHW1lfd6rzSkfUQ0rZOze/cssjY426aCer3NG/Ab2dBbVNIr3R4aeCNHs7M2GhzC15LmeNXCyVOX1VDTV0Rhlnt1OyCcNPiGyA7bsdNjroleLh3hdTwoxSkxvFa+mtNopgeSGK3sJc4+L3uJJe4+tziSpPVVUNDTTVNRKyCnhYZJJZXBrGNA2XEnoAB12v4t9wprtQU1dRzsqaOpibNDPEdtkY4AtcD6wQQU0ivdHhp4J0ez1X3vPLPeOP4fH807zyz3jj+Hx/NZkTSK90eGngaPa6rE265Y3r9IYXH1B9vZr+Zw/4r30Oe3m1yf4Zo4LjR79Kqtkbmyxj2mAlxd9/I7fsYd6HlROXmfvREx8Ij6YMasltVRhgseirYLjSQ1VLMyemmYHxyxnbXNPUEFZ1WuK3I49lENCNNt14c/TOuo6oNL9j1APY1+/3zAfF7irKSumIwmNkuFdtzarmmRERVqRERBjneY4JHDxa0kfyKo8fyHLbzYbbXvyGKN9VTRzuY23xkNLmh2h1+9W3Vf4rN/oH/gqhwf9ZWP/AOr6f/ltVd+9XYs51GGOMdET0TviXF9qZRdye3TNqcMZbLz/ACv3kj+Hx/NPP8r95I/h8fzXpRcznDKN8eGng85zllfX8o4PN5/lfvJH8Pj+ahHEjhQ3i1V43U5PcIrjNj9c24UJNCxvLINba7R9JhIaS09DyjasBE5wyjfHhp4HOWV9fyjg83n+V+8kfw+P5p5/lfvJH8Pj+a9K1OL5Va8ztIudnqvPKEzTU/a9m9n4yKR0Ug04A9HscN60dbGx1TT8o3x4aeCeccrwxz/KOD2+f5X7yR/D4/mnn+V+8kfw+P5r0onOGUb48NPBHOWV9fyjg9/D++Xeuvl7t90rmV7aWGmlikbA2IjtDMHAgeP6mFOVXnD39euT/wDg6H/1VKsNdmqqaopqnpiPd0Q9nktdVyxRXVtmHivXa9z13Y/q3YScn+lynX86qvFuX6MWjl3y+Zw63465ArhVSxW04tcprFIAyJhdNbz11JT7HQffGXBhHqHIenMFZ961NMbYnH8ndyGuIqmmelT/AJTNRc6Wo4XS2ajgr7ozLoTT01TOYI5HeaVXRzw1xaPv0VEb5jWQY9WXm7ZG6ohzDP7pRUdFZsMubqQMbTQSkCSsc0OA5Odz3Nbv0Whu/BdB37E7Vk9RaJ7nS+cy2msbcKJ3aPZ2U4Y5gf6JHN6L3DTtjr4eCwZnglj4gW2GhvtEayCCdtTC5k0kMsMrQQHskjc17HaJG2kdCR61qYunVbmZmXM1DkGWzYmzG7pfbtRVVDxIpLGammuz5qoUkkUchhdVBrHSgGRw5nN3rW/Be7iPnORcGaziFYbDfq+6UUFstdZT1V4rXVMlpmqqx1PIDPIHu5eQCQc/NynrojobDzXya7BcbTbrbjttprbSPv8AQ3S6xSVU7RUxwhzXlpBJEzmu+uOUuI252wCprj/B7DsYsd3tFDYoDQXffeLKt76p9XscupXyuc54A6AEnXq0pVRbr2Y/mp6XGuJeEWDL7jUXCejsbcZuDpGVGUz3apbVtiLoZ4Xvp4nREadsNdrq0gAtVpcE8cmteDWe6Vt7u98ud1ttJPVz3OukmZz9nzExxk8sY9Mg8oG9DmJI2suP8DcKxi3Xaht1okjprpRut9U2auqJnOpyCDE1z5HFjdOOgwjW+i2l1sd+t1ptduw6ttNopqOIQFl1oZqwdm1rWxtaWzxkaAOy4u30/jhbTRNM4z6+iN8frhccaw6iyq3VlVTtx2501xroKeVzW1NEH8lTG9oOnNEb3P0d6MYPqVLScVsxyEz2GWrrKF/Ei4QVWK1dM98ctHbe1LKjThosc2mhZOOXXWp347XQ1tx/JbpS3K3ZlX2K82itpn0z6a3Wyakc4PHK4Oc+pk20tJGgAevitw7ErO6qstT3fCJ7M1zLe8DRpmuZ2bgz2As6IVUVVTjE4euCo+H2PVmZ8Q+Jc10ybITRWu/eZ0NvprrNDDA00cJd0Y4FwJfsNJIBBcACSTWNJZ5MywngmbxfL7UT/TG6UBrO+KhlQ5gkr2sJlDw4vAiY1r98wbzNB04g9V2TFbXjtZd6u3Uvm9Rd6rz2tf2j3drNyMj5tOJDfRjYNN0OnhslaCs4N4fXYfDi81nDrJBVvr4YBUzNfDUOlfK6Vkof2jXc8jzsOGuYgdOinFjNqZj1viVaZnNcMX4pZfS0N7vHmv4PKitZBNcppI4qiN/ZNlY1ziGP5WAlw6kkknZK1+KT33G7vwdroMjvN5qsutVR3lTXavdNBLKKDzmNzGH0YiHt1tgGwTvZ6q5Rwuxnn5zbnvkNnNgL31UznGhJ2YiS/Z6/s/rfvl6I+H1ghfjL46DT8ajdFaSZpD5s0w9iR9b0/wAWeX09+3x6onk6scfW1zjweut4yrM+HNZHkWU3a8NNbNmNBXT1DKKimbDIxrez0I2cszuRsbdhwHMQeXmHV7m87S0kgEa2DornHD/J/wA2xjI7bV26tsmLU9vfI4G23O6VkNW0xvayF9HPKI2RhzmuIa4n0AGlviLWprbxLbUxGoyPFJKcPBkZFYKlr3N31AJrSAdesg/kKItZ1Ma4UPh0lRwk4AcT8tsVZc6m8UNzu9NCyuuE9VDEW1r2CYxPc5vOAedz9bdo8xOypbh9kzzB7pDkd2ucjcOgt9TU3l9VlM15fOwQl7JoGOpYxG4OG/QIaWuPo9ArVoeEeJW2/Xm8U9naysvLZGXBhmldT1Paa7QugLjFt3KOY8uz6z1K8uJcEcKweeols9kEBnpn0bmT1U1RG2BxBdExkr3NYwkDbWgDoOiYoi1VGHuUjw/veVWPiBijn1F/hx7K7PcKmKHIL/3jUSdnFHLFN2fIG0z9P6tY5zdO1oFq8OI2+9XKwcDK2ozfLH1GWsNPdz3vLqaMUckwDR4RuBiaO0Zp5BcS4uPMrzsfADA8cr6Gut9jdDWUPMKWd9bUSPgY5jmGNhdIeWPle4dmPQ9etgLdUHDHGbZR4tS01t7KDGCTaGdvKfNtxOi8S7b/AEHuHp83jvx6oiLVXTPrV/tFuAlwr5KTNrPW3KsusVhyWpttHUXCYzT+biKGVrXyH0nlplcOZxJ0Bsqc5lr6IXzm3rzGffL4/qbvD71/dhxW14zNdpbbS+bSXWtdcaw9o9/a1DmMY5/pE8voxsGhodPDqV6hb/pTeKezRgSQNeye4O9UcIPM1p++RzQ3X7XnPq632I/5aZ6I1z+S2qYtW5mroWnR9p5nB236t2bef/S11/nWZEWM63mBERQCIiCo6Hn74yPtN9p3pNvfs03l/o8qgnlKf/IDiB/qWp/5ZVn5fbTYMnfc9AW+7GNkz+v4uqADGF3sD2NY0E/smNHi9oWnyXHLdl+P3CyXen87tlfA6nqYOdzO0jcNOHM0hw2PWCCrL+uvP6Jw/wB9z0dmYuWYiN2Dlq4Zhk7comvt9tVBYb3g2FVdyslvpp3VXeomhaHSmQsZtkRiaHR62C/eyNFSfhpjHFGoqsYv8F33QV8Hb3CprsnlucVXHLCS18VKaWNkTg8seBG4AAFpBB2rwuvD+wXussdVW29s1TZC7zCUSPa6EOZ2b2khw52Ob0LXbadDYOgtHi3AzB8Lubq+y2TzKcxyRMaKqd8ULJPrtiic8siB9jAFrkWqoqxx9dyg5s7yXg7w9zKku9wv/wCEqktUNS6S63Lz23TxvqmQOrqUkERtaZdmMtHLpu2kbJmePWjOeHFTW5DfrlUU+F0toq57t2+TzXqd5bHzsnpxJTR9m4adsNPKQ4eiNBWXjPA3BsRjuEdtsEXJX0vmNQ2rmlqg6m6/iR2rncsfX6jdN+5fcW4I4VhjK1lrsoZHWUrqGaOpqpqlhp3eMLWyvcGsP7Vuh9yEWq4w1+u7gpLB7xluNZ1QU1TPfaay5FjVfXw018v5udSHxCJ0c31AKd+pSCxjnN6+otXy2Vd+x7yfcDvgy6+S33L32i2Vt5rq58zaGGoe3mljjeTG14aeTtCOYk7cSequaycAcEx2upa2gsjo6yljkghqJK6olkZE+MxuiDnyE9nyuOmfVaeoAIBW+PDrG34LFhstphqMZipWUTbdUF0rBCwAMbtxLiRoacTvYB3vqhFqrDXPrUp7jhw8biXCeekpsjyGuNbfLM0TXW4urJKZ3n0Q54jIDyk73o7bto6eO5Nw9ir8O41ZHh3fl2vdndZKO8Q981bqqWnlfNPFI1sjvS5HCNruUnQO9aCkFu4E4RarXUW+C0SupqiemqZe3uFTM9z6eTtIPTfIXaY7qG714jWiVtb/AIfM68VGQ486goMqnpYqB9fcoJqmI0zHveI+yZNGN80jjzA769djWoZZkxOd66WHjBQMufCnL6d8k8TXWqpPNTyuif0jc4AOaQdHWiPWNg9CqLq6m64HwB4V2zGLhXmoy2ptlJPVVt5lBibJSc5ihne2XzcPMbWNDGEN5jygEgi87Na84dcGNyC8Y3cbQ5r2z01FZZ4JZAWkAB76qRoG9b207Gx03teGi4EYLQYtcMbjsLZLFXOa6WhqKmaaNpads7Pneey5Sdjs+XXqUpqpmucY1KwkhzHhpimUuyqsujbHXCjpLVR23In3G6NrZJuz5I6qaCMsbIXRj0i7l04gjelDLnk2b4XiPF+x1d1uluqbVR2m4W5817fcqmjM8zmvAqXMY5wPZg8pBA24bIK6Ho+COFUWMXPHmWYzWq5vZJVx1VXPPJK9uuRxle8yAt5WlpDgW6GtLyR+T5gMVLcqcWJxZc6dlLXPfXVLpKpjJBIztXmTme4OA09xLgPR3y9ExVzar6J9a/cr92A1UvG64YgM2zBlllxuO68gvk3aNqzUPi7Rsm+ZrdDfZghhPi3QAFieT9lFwzTgrh17u05qblV26N9ROQAZHj0S469Z1s/eVKxitrblbskFL/hp1ELcartH9acSGQM5d8v1iTvW/v0mKYra8Ix2gsVlpfMrVQRiGnp+0fJyM9nM8lx8fWSoW00TTVj8WS7c/nth7Pfa97UnLr2dqOb+jzK31WuKW05DlENd0dbrQ5/K/rqSqLSzQ9RDGOeD++eB4scFZS26/s0U0Tt29/8ArX+bj5ZXFVzCOgREVLQEREGKq/xWb/QP/BVDg/6ysf8A9X0//Lareqv8Vm/0D/wVQ4P+srH/APV9P/y2rVyz+X/9R9Jed9tfwqPj+jdoq/7r4p+82H//AE7Vf/3L6bXxS2dZLiAHs+j1Uf8A85cTNje8tmR1o8+Cmri/iLxWzTiCbJVz0ZsN0fare2HKJbYyk5ImObLJTMpZGzh7nF25HEEeiAOXZ2zbTkmYZxnVtv2VXm21lnxq1VPY2G5SU1PHXSRVHays5dEt54ujTprh9Zp0NWbkHAvDszubbxkNmhrL3LBHDWVNJNPSx1fKNakjZIBI0eoSc+hobKk0WF2aC9Xm7Mo+W4XinhpK6btX/joog8Rt5d6boSv6tAJ313oK2bkYavWxuTlFERhTHRu+Hv8AdPRCgsMyO+cbb1g9ku2R3Sy0n0Jo8iqu5ao0c9xqpXmNznSM04Rs5CeVugXSDfQAKdeSnTGj4NUlOZpakxXW6xmaYgvk1cKgcziANk+J6Lf3PgPg13tWP26oseqewQCmtj4ayeGaniADeQSseJHN0BsOcQddVjpOH17wa30tm4e1dgx/HYA97aK5W2prZBLJK+SRwkFUzTSX9G6OuujrQCqumqMI1IuXbdyiaKdWvdq6d3xWGigJtnFHkAGSYjz7Oz9HqrRHTXTz78qkGK0uT0zKn6S3K0XF5LewNqt8tIGDrzc3aTy82+mta1o+O+lMxG9pzTERjnR58Ej4e/r1yf8A8HQ/+qpVhqvOHv69cn/8HQ/+qpVhr0/9NP8AbT/jD3+Rfy1v4QLW37H6LI6IU1bGXBjxLFKw8skMgBAex3i06JH3gkHYJB2SJEzTOMN6JmJxhW1Vh+TWxxbSvor3AB6L55DSz+P7LlY5jjr1jl/IvJ3Zlfu5H8Qj+StRFbylM7aInvj6TENyMsuxGGKq+7Mr93I/iEfyTuzK/dyP4hH8laiKc+js4+binTbqq+7Mr93I/iEfyTuzK/dyP4hH8laiJn0dnHzcTTbqq+7Mr93I/iEfyTuzK/dyP4hH8laiJn0dnHzcTTbqq+7Mr93I/iEfyTuzK/dyP4hH8laiJn0dnHzcTTbqq+7Mr93I/iEfyTuzK/dyP4hH8laiJn0dnHzcTTbqq+7Mr93I/iEfyTuzK/dyP4hH8laiJn0dnHzcTTbqq+7Mr93I/iEfyTuzK/dyP4hH8laiJn0dnHzcTTbqq+7Mr93I/iEfyX3uzKz/AN3Yx+W4R/JWmijPo7OPm4mm3VbUmG5NdHctZLRWOnI9J1LIaqo8f2PMxrGn7yHj7lObHYqPHqEUtFGWMLi973nmfK8+L3uPUk6HX2AAdAAtgixqrxjNiMI93rFr3L1d370iIirUiIiAiIgw1dJBX0s1NUwsqKaZhjkhlaHMe0jRaQehBHqUDrsBu1rfuy1kNbR7HLR3N7g+MexswDi4eznBPtd7LCRWU1zTGG2N0+vott3a7U40yqw2rLG9Dj0Lj7WXBhH87Qf5l87syv3cj+IR/JWoiyz6Ozj5uLZ026qvuzK/dyP4hH8k7syv3cj+IR/JWoinPo7OPm4mm3VV92ZX7uR/EI/kndmV+7kfxCP5K1ETPo7OPm4mm3VV92ZX7uR/EI/kndmV+7kfxCP5K1ETPo7OPm4mm3VV92ZX7uR/EI/kndmV+7kfxCP5K1ETPo7OPm4mm3VV92ZX7uR/EI/kndmV+7kfxCP5K1ETPo7OPm4mm3VWC1ZW7oMehafUX3Bmv5mk/wAy2FDgV5ukn+GayC30f7Kltkj3SyD2Gchpb9/I0H2OGuthonKRGumiIn85+syxqyu7VGGLBRUUFupIaWlhZBTwsDI4oxprWgaAAWdEVMzjrlpiIigEREGOdhkgkaPFzSB/Iqjx/Hsts9httA/H4pH0tNHA57a+MBxa0N2On3K4EUzmVU5ldMTG3p/SYa1/J7WUxFN2McFXeYZX7uM+IR/JPMMr93GfEI/krRRV8jk/ZR31fuafNeSdTzniq7zDK/dxnxCP5J5hlfu4z4hH8laKJyOT9lHfV+45ryTqec8VXeYZX7uM+IR/JPMMr93GfEI/krRRORyfso76v3HNeSdTzniq7zDK/dxnxCP5J5hlfu4z4hH8laKJyOT9lHfV+45ryTqec8UG4f2O70N9vdwulCygbVQ00UUbZ2yk9mZi4kjw/VApyiK2qYnZGGyO6MHSoopt0xRTsh//2Q==", + "image/jpeg": "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AREQEREBERAREQEREBERAREQEREBERBrvmn/ABy8Of8AlS5frGrYha75p/xy8Of+VLl+satiEBERAREQEREBERAREQEREBERAREQEREBERAREQEREBERAREQEREBERAREQEREBERAREQEREBERAREQEREBERARFDp8vutzkkfYqCjmoWPdG2rrqh8fbOadEsY1jvM2CA4kb1sAtIcduHhVYn+K2umKKEeXcw/ILH9bm+7Ty7mH5BY/rc33a36LXvjrBZN1G+I+BWzihgl8xS8M57ddqV9NKQAXMJHmvbv8Jrg1w+doWM8u5h+QWP63N92nl3MPyCx/W5vu00WvfHWCz8Pcw4bX3C+Itwwitonvv9HXG3+LRNLjNIXcrOQd7g/bS31hw9a/bXweuFn7ivBfFMMdN4xPbKU+MSA7aZ5Hulm5f5PaSP182lVOR+DzLkvhC2Pi3U0FmF4tlP2bqMTyGGomaC2Gd5MW+djTofzYz05etx+Xcw/ILH9bm+7TRa98dYLJuihHl3MPyCx/W5vu08u5h+QWP63N92mi1746wWTdFCPLuYfkFj+tzfdrl7rr9ao3VV2tdE+gjBdM+3VEkksbR3uEboxzgDZIB5tDoHHQTRcT2t1gsmqLhFKyeJksT2yRvaHNew7Dge4g+kLmuNBERAREQEREBERAREQEREBERAREQEREBERAREQEREBERAREQEREBERAREQEREBERAREQEREBERAVc8ODzcP8AHHHvNvgJ/OYwrGVc8Nv932Nf1dT/AKtq9D0/6Vf1j7VL7JGi1vsnEbMbflWZUOWZPU2a+wwXSotOOzWiFlHUU8Qc6CekquUmYtZyue1ziQSdsACzdFxLySXE/B7rX3LdTlT6QXh/YRf6UH2yWd/Tl0zcjWu8zl7td3RM0IvVFqnYeJPES1cHce4o1+ZG9U8l2ZSV9gmtlNHFLTyXA0g7N8bGyCVoc1wOy066tXys4scWs3uWV3XDLfe5Ka03aqtltt1Nb7ZJb6o08hjPjMs1QyoBe5rtmMN5A4aDyNmZ4G1qKi8duud59xkzq1HK58ZsVhNqfFb6SipZpuealbLLE6WSN3mb31Hnbd0cANHD4VxTzHNKrDcIN28UzC311fHl1dDTQkiGi97BDHMLG+MPmpngtA80v5daVzDYG2XigvUEk1uraavhjlfA+SllbI1sjHFr2EtJ05rgQR3gggr1rUW1Zpnto4Z2mrpbtVUdmp8kvdPkWQ2Ww0s9XFHFUythmNKyLkLXOaTK9sZd6fSSp7R5blfFPNRjeK55FarXacdoLlPkFFbYJ33aep7Tke1kgcxkWoi4hvnbfrmGkioX6umsAdSTgjYLHbB/MtZcd4s55xRrOElFQ36LGX32hvYvc1HRRT80tFPFCJIBK1wbtweQDtoEh2HEDWycNPLSWZkE9U+tnipwySqla1r5nBui8hoDQSeugAOvQBZUzedQ93Dlxfw9xhzjsm10pJ/6TVIlHOG/+7vFv6qpf1LVI1yY/wCrX9Z+6ztERFoQREQEREBERAREQEREBERAREQEREBERAREQEREBERAREQEREBERAREQEREBERAREQEREBERAVc8Nv932Nf1dT/AKtqsZVBdsytXBWyUdHlc5tluikbQ0VxLC6Go3+9MHKPNkLQRyEfgkjYXoem10VURtvH7+WUa4s8FHwHtLM0jyO6X3IMjlpzVmiobxWtmpaLxkFs3ZtDGu0WOLAHucGtOhpY2w+DVZLDccTqG5HktdTYrOZbNb6ytjfT0rOyfEIg0RAuYGv0C8l45QA4DYM9bmtK9oc2230gjYIslX1//Wvvuzpviy/fYlX90t/yK+GTLO5SfBjwZZKLEcXOa3K/PqLVXTXBuMTXCKS2wzipkfDJyxtJdoFrw0yFoce70KeTcALVHldxvVpyLJcciudYLhcLVaLgIaOrqOnNK5pYXNc/lHNyObza67Uw92dN8WX77Eq/uli7lxdxyzXa22u4SV9Dc7m5zaGiqbbURzVZaNuETCwF5AIJ5QdbUj09cassmWdz32HA7fj2X5RkdNNUvrshdTPqo5XNMbDBF2TOzAaCNt6nZPXu13LjZeHNisGcZFltFS9ne7/HTR102wQ8QNLWa6dOhAPr5W+peSfivj9NfqayTG4xXmphdUQW59rqRUSxtOnPbGY+ZzR6SBoLJe7Om+LL99iVf3Sy+TXwyZZ3IbJwBoYbC21WvLcpsEXj9dXvltdbFG+V1XKZZWPBiLXNBceXzeZo/C31XnqfBsxyCnszMfu1+w6e2WttmbVWGtbHLUUjTtscpex4dpxc4OADgXO0RtTr3Z03xZfvsSr+6T3Z03xZfvsSr+6U+RXwyZZ3MDYeCmNYvcsOqrTHUUMeK0FVbqCljkBidHUGMyOk5gXOfuIHm5h1c4ne+k4qv9lm/mH/ALLC+7Om+LL99iVf3S+S3yqvUD6S1Wq5eNzNMbZa6hlpYot9OdzpGjoN70ASdaCsYVdO2LQWl18F+I+MZTw5t7rXe6OrbZqaC33FzZOUUtQyNrXRvJ1og9FYrHtkY1zXBzXDYcDsELTTLvC98Gymwm44TdI628W14bS3Cggs01LJUvi5QDIHCNwduNveQfN0dLnwd45cO/CGzrCMN4c/uiYlTYZTOqWU9HPTUtuloojC3s6sGZ8kzCWxxgAF25ST05nDzMWqK8SqqPeZSdrcpFBrbZ88oeJGQXKryG33PDKikHkyyCiENRSVAbGOsw3zscWyE76gvGtALAN4rZhiXDCqyTN+Hdx8s01YKc2TEHi7TTQktAnYBy6HVxLSdgN7+ulqRbCKFT8YsTt+RY3j1yuYtORZDTNqrfaa2NzJ5GkdWnQLQ4dQW77wdb0pXR3SiuEtTFS1cFTLTP7OdkMrXmJ/4rgD5p+YoPUiIgIiICIiAiIgIiICIiAiIgIiICIiAiIgIiICIiAiIgIiICIiAiIgIiICIiAiKDZ1xcteEQWCRtvu2R+Wq9tvphj9GazldvT3vLTprGAOLjvemO0DooJyoPxV4w2Dg9abbX31tfO241zLdSQWyjfUyyzuBIaA0dOjXHqR8E62ei4R2XN7tnOSRXm42mPh/UUPitupLcyaO4mR7W9pLJNzaYQTI1vJ6OU9COuS4bcNbFwoxGjxvHoJobZSufI0VNQ+eR0j3F0jy95J25znE60Nk6AQY6OPPq/iddYKxlmpuHAt4jpn08krbpNUuDeZxcDysa3TwNaPnNO+nT1cMuFll4VYrBYbVJXV0Ec76t9Vd6t9XUSzv+FI57+4n+SAOpOtk7mCICIiCmPCg8J2w+DNh9PcLjBJcr3cu0jtVrj23xh7A3nc9+tMY3nZs9T5w0D6PzI4Vcbso4l+GFgGXZTc311xqr/SUoHwYqeKSURiKJvcxgEh6fOSSSST+q3hD1+JWHhFkN/zKw2rIrVZKd9fFQ3ikjqYn1AaWRANeCA5zn8gPf559ZWq3B7/AMOSyyYpwvzCovdxx/MaSWku9zp2sbNBK0SunEQY7TopQ10UfOHOaOzJ7NxJKDaS+3WyReEFi9vnxSarv0tnqpKfJGtPZ0kQcOeAn1vPVWaoXc/dt+6vZfEfEvcF5Pn8o8+vGPG+Ydly+nl1vamiAiIgIiINFfD48C5uZ0ldxKwah/8AqCBhmu9qp2/7cwd80bQOsoHwm/hgbHnDT6/8BHgxxTxnh9PxTwV2NS1V4llo22rIafrV0cLgC6GqjcXwl0zZWljgATCxztgNI/SpEGvlD4XdHitXFbuLOH3rhdXvcI21tZH45apXHuDKyIFv94ADpsq87DkNqym1w3Ky3Kku9umG46uhnbNE/wDM5pIK9NbRU9ypJqWrp4qqlmaWSQzMD2Pae8OaehHzFUbfvA9xSC5zXrh/c7rwqyCQ8zqnGJzHSyn0CWkO4nt/kgNQXlPQ01TNDNNTxSywnmikewF0Z1rbSe7+xQ6m4L4lbLll10tNsNlvWUwOhud0t8ro6iTYf57TshjwXuIcBveid6Cq33Z8eeEPm5Pi9DxbsEffd8U1SXRrfxpKN55ZHfyYiFNOG/hP8OuKFb5Mt19bbMga7kksN7jNDXxv/E7KTXMf5hcg43HhZmuPcMbXjeC8Rq+mu9FWGaS+ZVC27VFVATITC9zuXWi9gDgNgRgeklSasuubwcTrfQU1ht1VgstGTVXh1dyVcFQA86EPLp7TqIdCNczj6AFMkQVpaOOlvfas0ueSY/fsKtmKzObU118oiyGqhBdqenLeZ0jCGg9G9OYDqpPY+I+MZFj9nvlDfKN9rvA3b6iWQRCp7+jA/RJ6HprakZAIII2Corl3CrEc8itEd+x+iuUdoqBVUDZGaFNKCCHM1rXUD5iglaKHUvDKmpOJ1XmzL7fzUVVIKWSzuuDjbOgaBIKfWu0Ab8Lf4TvWovbrHxdwzhrfohkln4hZmKsSWqa50QttP4vuPmikEJPnBva6dvqSzZ70Fsoq5uPEu/43UYHb7ng13uNwvzY4rnUWJgqKSzzkRh3avJHvYc9/nj0Rk66gLKWbjBiGQZxkOH0V5ZJkNgjE1ypHxSMEDCGkO53NDHDzxvROuu+5BMkXhst9tuSW+OvtNwpbpQyfAqaKds0TvzOaSCvcgIiICIiAiIgIiICIiAiIgIiICIiAiIgIiICIiAi8l0utFY7dUV9yrKe30FOwyTVVVK2KKJo73Oc4gAfOVCrtxVnfX4W3FsbrcztGSP53Xy2TRCioabzdzSSOd16P2GgbdyuA6jRCfSSNiY573BjGglznHQA9ZUCy/i9T49UYjHaLHdcxiyOsFNFWWCJtRTUsQc0STzSg6axocT03vlIXVT8NbxfLhnFPmuRR5TiV/j8UpcdNCyCOipiHBze0aed7nc5246I5W61pTDGMXtGF2Gislit1PabTRs7Ono6SMMjjGyToD1kkk95JJPUoIfDg+VX7Jc2hy6/UN1wO70viFvx+mouykhiczUrpJ98xc7me3Q6aDXAtOwpPhOD2Lhxi9DjuNW2G0WWiaWwUkGy1m3FzjskkkuJJJJJJO1nUQEREBERARF8JDQSSAB1JKDW3wmv/ALqcVOGfByH32irav3S5DGOo8n0p8yN4/Fll8387Qtk1rb4K7TxOzriTxmqBz019rzZbA89wtlIeQPZ6hLIC4j8ZhWySCsr7arJL4QWL3CfK5qS/RWeqjp8ba49nVxFw55yPWw9FZqrK+3WyReEFi9vnxSarv0tnqpKfJGtPZ0kQcOeAn1vPVWagIiICIiAiIgIiIChXEjgvg/F6h8Vy/Gbfew1vKyeaLlniH8iZuns/9rgpqiDXQ8A+JfCr33hTxKnrLbH1bi2dB1dSa9DI6lupomjuDRvv6lcovCxreH8rKTjHgN4wA7DPLtG03KzvPcD28QLo9+hrmkj0notiVwmhjqInxSsbJE8FrmPGw4HvBHpCDD4lm2P57aGXTG71QX23v7qm31DZmA+olpOj8x6hZtUZl3geYJd7s++4v5Q4bZOeou2IVJoi49+nxD3t7Se8coJ67KwvlPwhODvSvoLVxqx6L/zNv5bXeWN9bojuKTQ7gzziUGxqKmcC8Lfh1m908i1Vynw7J2kNksGVwG31bXHuaA/zXH5muJ+ZXKDsIPq6Kqip66GWKogjnimjMUjJGBwew9C0g94PqXeiCsb14OuGXDh3JhVqpqvEbK6s8fZ7m6l1HLFPvfO1w3rr6Na6Dp0WTuGF5b7uMZuFqziWgxS3U3i9wsE9vjqJLiQ1wbIapx52O2Wb0Ouj16qdogrygyDiJa3Z3V37HbVXW+3iSfHYLFUvdVXGMdoWxSiQAMlIbGNjzdvPoHXF1/hGWDE+HOP5dnFsvGERXerND4hcqF8lTTS80gHaMiDiGu7PYdrqHs7tq118c0PaWuAc0jRB7igxj8pszMgZYXXegbfHxdu22GpYKkx9fPEW+bl813XWuh9Syfco/Nw+xqfM4MuksVA7J4ITTR3bsGipERBBZz95Gieh9ajVh4P0mB2TIoMfvl5gfdasV7319Y+sbA7n5nsia86Y145gQPxt+gILD7Vn47f0p2rPx2/pWsnhM5tdMHxjF5rZkzMPZcMipbfWXiSGCRtPTPZKXuIma5g1ytOyPR3qI3XMb/juAsyGy8W25/T1V+tdtbVQ0VB2UDX1UbJ2B0MeiXMkAO+o6EaPVBuT2rPx2/pTtWfjt/StW8V41137veZYRfYwy0srYKex3Dla1nbGihmkpHkfhEOfIwnqdSDfmgKPcP8Aizld7h4JOrbr2xyO4XmC6f6PE3xhkEdS6EdGDk5TGzq3W9dd7KDcXtWfjt/Snas/Hb+lam8B8vybiPdp7tds6hiq6SqqobngbbdAx9v5XvZE1zz78CAGO5yS129BRez+FDQM8HXIK66Z7ZoeItNSXjxeCaemZUieOaobSjsNAE8rYtAt87pve+obtiRrjoOBPzFclXHC64VF2smN11XJ2tVU0EM0snKBzPdCC46HQbJPcrHQEREBERAREQEREBERBXvH43j9yS/tsWKUecXCRkUQx+uG4qyN0rGyNOyB0YXO6n8FTe022jtFspqK30UNuooIwyGkp4mxxxNHc1rW9GgeoLx5daq2+4perbbbhJabjWUU1PTXCL4dNK9hayUfO1xDv7FjeFz3Hh7YIZMlpswqaWkZSVF8pXhzKyaIdnJJsOcOYva7m6nzt7QSlERAREQEREBFwllZBE+SR7Y42Auc9x0Ggd5J9AWueUeE3eOIl9q8Q4FWiHLrtC7sq7K6sltktZPpMg/f3jvDWbHpHNohBbPFbjLiPBXHzd8su8VvifttPTN8+oqn/iQxDznu6ju6DeyQOqpPyBxU8Kvz8hNdwk4Wy91lp38t8u0Z/j3/APl43DvYOuiQQQQ5TXhT4L9qw7IPdlmF0qOIXEaXrJf7s0FtMe/kpYfgwtHo11HXRAOldqDDYdh9nwDF7bjtgomW6z26EQU1MwlwY0fOSSSSSSSSSSSVmURBD+K+EXTiDhdVaLNlVxw26Okjnp7tbQC+N7HBzQ5p+EwkDmbscw6E6JB8dJn9xoeJ9Ng1XjV6qKd1qFZHlZijNHPIw8srH8muzf1YQNDZcdNAAJni6qqliraWannjbLBMwxyRuGw5pGiD+cIFLVQ11NFUU00dRTytD45YnBzHtI2CCOhB9a7VTr+HV94JYZY7Hwbs1sntsV5M9fbb3XTdKSVx7RsEhLuQsLg4b30YejnHrOrFxPxbJsxv2KW29U1VkVjLPKFuaSJYQ5rXB2iPObp7QS3YBOjo9EEoREQEREBERAREQEREBfHODGlziGtA2Se4I5waCSQAOpJ9C1dyvKbx4XWS1+EYTXzWrhVb5TT5LllKdPujx8Kho3elpHR8g6EH0tIEgYbiJTQ+HHl4xSxUdMOF+P1Y8sZi6nY+aunYQTSW+RwPK3u55W+j1t0JNq8dx63YlYbfZbRSR0NroIGU1NTRfBjjaNNHXqeg7z1PpXVimKWjB8ct9hsNBDbLRQRCGmpYG6axo/xJJ2ST1JJJJJWWQEREBERAREQF01v+xz/+m7/su5cXsEjHMcNtcNEfMg15424Xcs0GCR2+hbXxW7KqK41rHvY0Mpo2yh7yHkc2uYeaNk76ArhxvwSuyXCLfbMdtsUk0V9tta+CIxwgRRVUckj+pA6NaTrvOtDZV9eQKL+KP98/tTyBRfxR/vn9qDWyPg5UZNfeLMN7gkoKG+3OirbRcYJWGaKSGjgY2oj0SWPjljOubW+X0g9Y3gHB3LMXh4I0tfTR1UmL194ku1XFNGGNbNHUtikA2CQ8yMOmgkc3UDR1tv5Aov4o/wB8/tUOxG+Y1kua5lY6C51lfcbDPTxV9FPEGRUbpIy9jY3BjS8OA2dudo+ruQUTV4zmXEDiziN8rcCpcLksFdLNU5D5ThqJq6l7J8YpmNjHMWvLmuIk1y8vTZ7+nHeDl2pPBYyLFquwU4y6qob3FBA50LnuknmqXQe+75RtskfUu6b660dbW+QKL+KP98/tTyBRfxR/vn9qCE8LrfUWmyY3Q1cfZVVNQQwyx8wPK9sIDhsdDog9ysdeKntFLSzNljjLXt7jzEr2oCIiAiIgIiICIiAiIgLWXhr4S3g+8MMWyS02XJaLH7LYbpLG6KasFU6sfK8OdNSMjklkmiLn97G6bpxIABKnvhTcBafwi+Eddi7qjxS5QSi4Wyoc4hjKtjHtZz672OD3tPfrm2ASAvx9wThBeL7xxsnDq60FRb7pPd4rdW08jdSQN7QCVx+ZrA52x3gbCD90rJeaTIrLQXWgkdNQ19PHVU8j43Rl0b2hzSWuAc0kEdHAEekBe1dcEEdNDHDExscUbQxjGDQaANAAepdiAiLy3O50dlt9RX3CrgoaGmYZZqmpkEccTB1LnOJAAHrKD1KtuMfhA4hwRoqfy7VyVV5rCG2+w22Pt7hXPJ0GxxDr1PTmOm76b3oKrLr4QeY8d7lUY/wJtzG2qN5hruId4hLaCnI+EKWNw3PIPWRyg62OUhyn/Bzwaca4TV09+nnqctzmtG67Kr07tquVxGiI97ETPQGt9GgS7QQV1Dwq4keE7Myu4r1E2DYA4h8GA2ioIqatnePH6hujo9Pe26/Mxw2djcXxSzYTYqSy2C2UtotVK3khpKOIRxsHp6D0k9ST1J6nqsqiAiIgIiICIiAo5k2E0t8or46hlNgvt0oTQOv9uiY2tiZp3IWyFpPmlxIB7idjR6qRogrCmyy9cLvcDil/p77nVbdOaiqsrobc1sMUw0WOqGMPvbXAkc3UDk2e8lWZHKyUEse14BLSWneiDoj+wrmqE4rU1t8FPhZxJ4g4fBBT19ZVRXSrprxVVM1JJUPmax/IxvMWPlMhGxoczmlxDW9AvtF+Q/ADw0r9YPCfr86zCsYLVls0dNfYaVnZwQxtaI6eRrN90ADQCeZxZz7Jc4k/rrFKyeJkkb2yRvAc17DsOB7iD6Qg5oiICIiAvhIAJJ0B6ShOhs9AtYcvyy8+Fjk1fgmDV81r4ZW+U0+T5fSnTrg4fCoKJ3cQR0fINjR9IIEgccsyu8eFrk1wwXCK+a18LrfKafJcupTp1ycPhUNE7uLSOj5BsaPpBAk2KxPE7PguOW+wWC3w2u0UEQhp6WBumsaP8SSdkk7JJJJJKYliVnwTG7fYLBb4bXaKCIQ09LA3TWNH+JJOySdkkkkklZdAREQEREBERAREQEREBERBhcrzXHcDt0dfkt+tmO0EkogZVXWsjpYnSEFwYHSOALiGuOu/TT6lSmBeFHwzruIvEKlqb5hOPUtJU0jae+NvdI03sOhJc8u5hzdmfM73d/oUm8K3gpHx64J3zG44w67xN8ftTiQOWrja7kGz0HOHPjJ9AkJ9C/JTwbuCNZxs43WXDpIZoKUTma6uLS10FNEdy79LXHowb7nPag/cG23KkvFupa+gqoa6hqomz09VTSCSKaNwDmvY4EhzSCCCOhBXpXRQ0VPbKKno6SFlNS08bYoYYm8rI2NGmtAHcAABpd6AiIgIiIOEsrIInySODWMaXOce4Ad5UHZfskyCKOuttTbrVb5mh8EdVRvqZnsI217i2VgbsdeUA62NnewpPlJ1jF3/AKHN/kKj+NneO2v+ixf5Au/ApiKJrteb2162Uaou6efMfj20fY8ntKc+Y/Hto+x5PaVBbX4TnDS75A2yw5MIq99Y+3s8boqmmhkqGvLDEyaSNsbncwI0HHZ7tq0VuiuJ2RHSPBdiOfMfj20fY8ntKc+Y/Hto+x5PaVl0Vz8o6R4LsRz5j8e2j7Hk9pTnzH49tH2PJ7SsuonRcVcVr8LGWRXeMY+Z/FTWSxSRBsvjHi/I5rmhzT2vm9QPX3dUz8o6R4Lsrz5j8e2j7Hk9pVcXLgH5U41Wnio+4WyLLbdTSUrZobU9sUwcwxh8jfGPOe1jnNDtjoQDvlbqxKnMrPSZdRYvJWavtZSS10NI2J7iYI3Na95cBytAc9o84jZPTeiuy95Va8drbRSXCpNPUXaq8SomCJ7+1m5HScu2ghvmscdu0OnfshM/KOkeC75z5j8e2j7Hk9pTnzH49tH2PJ7Su+gyG2XWGumoq6CsioZ5KapdTvEgilj/AHyN2u5ze4jvB6d64YzktuzHH7fe7RUGrtlfC2emnMbo+dh7jyuAcPzEApn5R0jwXdfPmPx7aPseT2lVdxS8H25cZr7b6nLcwfcrJRObIzGWUT4bbLIO58rGTB8h31855A7gNEg3QoJxG43Ydwnmiiyi4VdAZIHVIfDa6uqjbG0nbnPhie1utH4RHTqme22I6R4Ls1a7bkljt1Nb7dcrDQUFMwRQUtNY3xxRMHQNa0VAAA9QXq58x+PbR9jye0qP8O+M+JcVZamPGq2srDTxtme6otdXSN5HfBLXTRMDt/ySVN0z32RHSPBdiOfMfj20fY8ntKc+Y/Hto+x5PaVl0TPyjpHguxLrvlNnidV1M9uvMEQL5aamo300rmjv5HOle3mA2Q1wAcdDmb3qZUVbDcaKnq6aQS088bZYpB3Oa4bB/tBWBk/e3fmKcMnF/DbE3OJc42mkJJ7z7yxaMemJw89rTe2rVv8ACbYSVERcCCIiAopd8juNVd6m2WU0sLqPkFXWVcbpWte4BwiZG1zSXchDi4uAHMzQds8srUCsri7JcyBJIF1YAD6P9CpV1+mpiqapmL2i/eI/dYc+fMfj20fY8ntKrzjRwJdx9sVLacwulJVUlJIZqdtLTVUAjkOhzljKsMe4DbQXtcWh7+XXMd5riBx6wfhffILPkl2norjNS+Othht1VU6g5iztHOhieGjmBHnEKXY5kdry+x0V5stdBc7XWRiWnq6d/MyRvrB/PsEd4IIK6s8bLR0jwt2nUv8A4XeIySl7ctuUbT+A2maWj9Lt/wCK2c4c4VlHDTB7Pi9FllNcqK1QCmgqLlbHSTmME8jXObO0ENbpo6fBaO/vU7RXPyjpHguxHPmPx7aPseT2lOfMfj20fY8ntKy6Jn5R0jwXYjnzH49tH2PJ7SnPmPx7aPseT2lZdYe1Zdab3fb5ZqKr7a5WSSKKvg7N7exdLGJYxzEAO2xwPmk63o6PRM/KOkeC6LcTcCyvihh1bjdVmjLNQ1umVMtotroZpYvwoud0ztNd3Hl0SOm9Eg5LEMTvGA41b8fx+tsVrs9BEIaelgs0gaxv1nZJOySdkkkkklR/NfCV4e8O77UWfILtXUNfBJHC9rbLXTRl7wCxrZI4XMcTzDo1x6nXf0UtwXiBZOJNnkulgnqaiijmdTudVUM9I7nAa4jkmYxxGnDqBr5+hU+ZGy0dI8F3r58x+PbR9jye0pz5j8e2j7Hk9pWXRXPyjpHguxHPmPx7aPseT2ldkOR3uwTRSXuegr7dJIyJ89HTOp3wOc4Na5zXSPD27IB1oje9Hqsmo9xAJGIXAg6Pvfd/6jVnREYlUUVRFp1bIj7ETebLEREXjMRERAREQea43GltFDNWVs7KalhbzySyHTWhVRfeONZNI+OwWuNkQJAq7mXDm+cRN0dfznNPzLDcUsrlyPJ6i2xSf6qtbxHyDulqANucfWGbDQPQ4PPq1El9j8P+FYfy4xfUReZ123EzZKjxdzM9fGLMD6hb5Nfr0/dczL8ps/2fJ9+oqi9nQfS/646JmlKv3XMy/KbP9nyffqu8BsEnDXP8xzGyMtcN5yqZs1c59C9zGEEucIh2oLQ95L3bJ27XcAAM0iaD6X/XHQzSlX7rmZflNn+z5Pv0/dczL8ps/wBnyffqCXvIrfjraJ1wqPFxW1cdDB5jnc80h0xvmg62fSdAekrIqaF6WZt8uOi5pS2PjBmEZBc+zTj0tNFKzf5iJjr9BUzxHjJR3qrhoLvSeRq6Zwjhk7XtKaZx6BofoFrie4OABJABcTpU+uMkbZY3Me0PY4aLXDYIWnG+GelxabRTad8f2xm3tqEVd8G8unvdsq7TXzPnrrZyBs0h5nywOB7Nzie9wLXtJ6k8oJO3FWIvhPUYFXp8WrCr2wrF5V/Bi8f0Ob/IVHsa/g5av6JF/kCkOVfwYvH9Dm/yFR7Gv4OWr+iRf5AunB/Rn6/sezUbh9g2c8XeGFww6GisltwmfLK6oqr1NVySVxZFdHyuZFAIw1r+ZnKHF+tbOtr3VOZ5Cc7xnNsbrMkGKXbM2WR095yAy09ZFJUSQSNht/Z8scbXNdyP52v97BIO9raTE8PtGD2t9uslJ4lRPqZqt0Xavk3LLI6SR23knq9zjrehvQACh03g4cOqi6S3B+ODxl9YLizlrKhrKepEgl7aFgk5YXl4BLow0nrvYJ3hllFF3movVDwv4tcQo83yOkvmN5RdvJscl1lfQiOGq1HTOpnHs3Md8AAjY5gGkaAXtuFbxI4xcQM8itMtTbRj88NDSUlPlctoNG51NHKJpIY6WUT8znuIMjuXTeUNGiTYGE+C5jtJer9esrtlNd7pVZNW3uk5KyodTtZJOZITJAS2J0jQepLHaPc4qZ5pwHwXiDfDeL5YW1NyfCKeaeCqnpjURDuZMIntErR6nhw10TLNhWFoseVZdxvhsGW5TdqU0GEWyruFFj9ympKae4GoqGSTNLOVwB5D0HLzDlDthoCr7O8FrMw4i5bwIhdNR2y8XObNG1bNtEdLJTHzRr0C48rtfnW2lLhtnospmyOCjEd5moYra+pEj+tPG972M5N8o06R52Bvr1OgF6Pc5bRkRv3ikflg0gofG+vP2HPz8nq1zHauW40pfmOScRcDzPiTHW1+OX6B+O4fT1kDjFNTTMq6d1w162meoLD6HCPR2DpXfm2NTcPs94Rx23JMmnjrsgnpqyOvvdTUR1THUU7yJGOfyuAdE0ga03rygbVn13C7F7jj1XY57TGbVVXHyrPTxyPj7Sq8YFT2pc1wO+1Adreumta6LJXzEbTklwstdcaTxiqs1Ua2hk7R7exmMb4y7TSA7zJHjTtjrvWwEimRr/wF4d0UONcWJIrzkTJTkV7t+232r8xrZtiRvvnmzdBuUeednZ6lYThdPeuJFw4SWi65ZkcVFXcPpLnXeJXWaCWrqGz0zWvklaefm98J5gQ49xJBIOwdBwjxO15bdMlo7W6lu90DhWSQ1UzYpi5oa57oQ/s+cgDb+XmOu9dmN8K8WxGrstTabX4pPZrW6y0LvGJX9jRlzHmLTnEO86Nh5nbd07+pTKNaafP7zVYnw4pMsyq+2/FDdr5arrfrdPJFV1EtNO+OhZLNEO0aHMZJst1zOYNnr1mFngvkPgW58+/zXSqqprPf5oKi9PkNZNSubUGB8rX9WEx8h5dAAEdASVJeJ/AJlyslmocQstndHRV1XWviud3uNE8PqXF8ro6imfzt5nlxLXBze4ADQWf4ZcJ66zcK7niOZ3E5BDdHVUc9OKqolZBSzgt8VZPK7tnNa0kB7iHed01oKRE3FP3q75flGScPcCsT5o7fHhNNepIqbIJbJJVSFzYtdvFBK9zYwAeRvLvtASSAAsjeIc1osbxTBcirb1c8zuFdXTW6OwZK6j5qCHlINbXCFj3GMSsbtke3nlJB6q58p4LYZmlsstDdrMJ4rKwRW6aGpmgqKVgaGcrJo3tkALQARzddDe103LgXhF2sNks89lLKKyue63mmrJ4Jqfn32nLNG9smn784FxDvTtXLIoHHspyzJ8N4YWe65JdqOtdnFyx+4VlDcCKipp4I6wCN8zWt5zqNo7TlaSWh45XaIx+Qsv8Ai2C8ZL7SZxlctZgl67OysqbvLLG2JsVPMY5gT/pAcZnt995iGga11J2RsvBDCMcZbo7ZYo6GG3XN94pIYZ5WxwVbojC6RrOflALCRy65dku1zHa9Vx4SYndrNlVqq7V2tBlE5qbvD4zKPGZCxjC7YftnmxMGmFo6fOdzLNhLZP3t35ivnDD/AHaYl/VFJ+pYvsn7278xXzhh/u0xL+qKT9SxZ4v6M/WPtK+yTIiLzkEREBQGyfwmzP8ArZn/AMKlU+UBsn8Jsz/rZn/wqVd3pdlf0/eFj3UFxcybK8R8JOe64hjdNlNwpsBllkoZ6x1O4xtrebcemO7R+wAGebvfftV3hDMhrIsDwHEruLrZ6nHJ8smltl9lsIq6iorZC+NkscMsgZCXcvZDkO3bd3cq3D9x9oOYjKvFP9fCg8meN9q//Zu07Tk5N8vw+u9b9G9KH3DwcuHdzpRTzY6GNbXT3KJ9PW1EMlPPN1mML2SB0TXkbLGFrCevLtJplFR5PinFmz4bj1Tkdyu9ztFmqbhJdKPFb6Y7pJRkNNLIagsh8YfCBIHN0zn806cdheKqyfKOM3EGotGJXCvrcbtVgtddQOZlE1jqKsVMb3eNSOjppHTHzWtLTyta4HbSXdLvvPg/4Ff7HZ7PWWN5t9ojlio4oK6phMbJSDK0uZI1zw8gFwcTv07XZk3AXA8uFp8oY/Gx1qpRQ0clBUTUb4qYAAQc0L2ExjXwCS35kyyKfv8ABm14psOwW6V97uPEWmtU9fcJceyR1pohT9v2cM887YeaWTTWgNbHyk9oS3WlisXyXJuKlB4PENyyi7W43u33Y3iS01bqZ9d2EbA3mczWiS3fMNEczuUtJ2r5v3AzB8lis8ddYmllopPEKMU9TNT8lNoDsHGN7e0j80eY/mb07l6bDwfxDGJbDJa7O2i8guq3Wxkc8vJS+Mnc4Ywu5eV3oaRpv4ICZZuKsseOVvEvibnOPVuY5PZ7XhooLbbaK13eSCd4fStldVVEuy+dzy7QLyW+YdgkkqIZLiVZVZp4RF6ocryCyV1hp6Kro/JlcYWPnjtMb2vmaB78CWAFrtt0T02dq+M24GYRxEvLbtfbIKi5CHxZ1VT1U9K+WL+LkMT29o3qfNfsdVk4uGGMwx5LHHbAxmRwMp7o0TyaqI2QCna34XmaiAb5nL6+/qrlkVPxlvU+S8H+FN3qg0VNwyPGquUMGhzvnicdfNslRa/zcROLHE7iJR2WqqaSHG6yO3UMNNlcto8W3TskE8kEdLKJ+dz3EGR3LpvKGjRJ2GuPDnHbtj9lslVb+1tdmmpaigg7eQdjJTFpgPMHczuUtb0cSDrrtYXNOA+C8Qb4bxfLC2puT4RTzTwVU9MaiIdzJhE9olaPU8OGuiTTMijuKdfmV5gqbfS199dm2K4tBWX6ss+Qm12mlqXRyPEjYxE41D3mN7uRzQzla0baSVmbLV3bi/xCwyjueSX21UFz4d017qaex3GSiD6t8rB2m4yCNdo7uI3oA7A0rdyjghhGaXmO63mxR1lY2nZSP1PLHHPC0ktjmjY8MmaCToSNcBsr3YzwtxjD663VlptrqWpt1rFlpXuqZpOyow8PEID3kEBwGieoAAB10TLNxrhwzu+R2/EuB+ZVGX3+7XPJL35GukFwr3S0tRA6Gr5fefgNe008ZD2gOJ3zF21sxxC/gfcP+n+savFQ8JMTt1jxqz09q7O3Y3WC4WqHxmU+LzgSAP5i/b+k0nR5I87u6DXt4hfwPuH/AE/1jV0eni2JT9YZU7YWKiIvIYiIiAiIg1XaXuqa90g99dXVLpN/jGd5d/jtclIuIuNSYvmNY4MIt90kdWU8mugkd1mjPz823/OHnW+UqFZBDep6NjbHWUFFVCQF77hSvqGFmjsBrJIyDvXXZ7j069P1DBxacXCpxKNcTCVbWTUI42ZVcMK4XX68WstZXwRsbFI/uiL5GRmQ7BHmh5d1BHm9QV2i38QtHd9xknXTVlqPa130dlyavfLS5JXWC6WaeJ8U9JT2qWJ0gI1ol9Q9uvWC07Sua66ZppiYmffVq7orOHH89xihu9wkrpYbQLNWOqPGMjluUrpREXRTQl0EfZEEHfK7l04aA0EsFZdcYruGVyF7u93kyG2zvuNNXVbpo5ntovGGljD5sZDm680DYPXZ6qxrHwhxPG4K6G32t0UdZSuopmyVc8vvDu+NvO88jfmbpZaPC7NE/H3so9OsDDHbT2r/AHhpi7Ijv87zDrzt+vv6rlp9NXFpvu9+cco9uQoNlBWX7E+GmaXHIrncrjd8it1RNSmqPiUXPISI44fgt5Ncux12Dsna2XUFh4IYVTXWO4wWUQ1UVY24RBlVM2KOoDuYPbEH8jTvvAaAfSu/yfxD+PsZ+xKj2tZ4OHXg3zRe9tk7vfXbaJmihpt/ELfS/YyB6vIlR7WpfB2jaePt3MdKGjtHMaWtLtdSASdD5tn867Kapq2xZEy4NucOI0gaTyutUxeNdNiaHl/7u/xV7qreB+NyQUlbkNQwsNxayKka4dfF27If/wC9zifna1h9KtJfBfFsSnE9VVl9rR/fs2TudVTTsq6aWCUc0UrCxw9YI0VA4I77jFNDbjYay9w07BFFW0EsA7RgGml7ZZWEO1362CeuxvQsFF52FjTh3i145/xYugHly8/Iy9/S0XtKeXLz8jL39LRe0qfot+lRwR38l+SAeXLz8jL39LRe0p5cvPyMvf0tF7Sp+iaVHBHfyX5IB5cvPyMvf0tF7Snly8/Iy9/S0XtKn6JpUcEd/JfkgHly8/Iy9/S0XtKeXLz8jL39LRe0qfomlRwR38l+SAeXLz8jL39LRe0p5cvPyMvf0tF7Sp+iaVHBHfyX5IB5cvPyMvf0tF7Snly8/Iy9/S0XtKn6JpUcEd/JfkgHly8/Iy9/S0XtKeXLz8jL39LRe0qfomlRwR38l+SAeXLz8jL39LRe0p5cvPyMvf0tF7Sp+iaVHBHfyX5IC6bILzC6lprBV2eSUFhrLjLAWQg97uWKV7nEAkhvTZGiWg7U0tVuhs9so6Cn5uwpYWQR852eVrQ0bPr0F6kWnExpxItaIjl/Ny4iIudBERAUOutquVmvVbcLfROutJcHMknpopWsmila1rOZvOQ1zCxrdjYILdjm5/NmKLbh4k4c3jXdYmyAeXLz8jL39LRe0p5cvPyMvf0tF7Sp+i6dKjgjv5L8kA8uXn5GXv6Wi9pTy5efkZe/paL2lT9E0qOCO/kvyQDy5efkZe/paL2lPLl5+Rl7+lovaVP0TSo4I7+S/JAPLl5+Rl7+lovaU8uXn5GXv6Wi9pU/RNKjgjv5L8kA8uXn5GXv6Wi9pTy5efkZe/paL2lT9E0qOCO/kvyQDy5efkZe/paL2lPLl5+Rl7+lovaVP0TSo4I7+S/JAPLl5+Rl7+lovaV98n3bLezpKqz1Fkt3aMknkrZYXSSBrg4MY2KR4GyACXEdN9DvpPkU0qY/xpiJ/wC+S4iIuJBERAREQY+/WGhyW1zW+4Q9vTSaJGy1zSDsOaR1BB6ghU5feD2RWqV7rY+C+UmyWte8QVIHoBBHI7+dtv8ANV5ovQ9L67G9Jqw51bp2K1vOEZe3ocTrt/NU0h//ALL57icu+Sdf9YpPvlsii9T8d9RwU9/Jq3NbvcTl3yTr/rFJ98nuJy75J1/1ik++WyKJ+O+o4Ke/k1bmt3uJy75J1/1ik++T3E5d8k6/6xSffLZFE/HfUcFPfyatzXKPAswmIDcYqYyTrmmqqZrR+fUpP6AVM8U4KzGpjqsmngnjYQ5tspNuicR3dq8gF4/kBoHTRLgdK2kXPjfGPU4tOWLU/T+Zk+giIvDR/9k=", "text/plain": [ "" ] @@ -374,11 +853,15 @@ "output_type": "display_data" } ], - "source": ["from IPython.display import Image, display\n\ndisplay(Image(super_graph.get_graph().draw_mermaid_png()))"] + "source": [ + "from IPython.display import Image, display\n", + "\n", + "display(Image(super_graph.get_graph().draw_mermaid_png()))" + ] }, { "cell_type": "code", - "execution_count": null, + "execution_count": 16, "id": "6b8badbf-d728-44bd-a2a7-5b4e587c92fe", "metadata": { "ExecuteTime": { @@ -386,8 +869,215 @@ "start_time": "2024-05-15T08:19:55.796497Z" } }, - "outputs": [], - "source": ["for s in super_graph.stream(\n {\n \"messages\": [\n HumanMessage(\n content=\"Write a brief research report on the North American sturgeon. Include a chart.\"\n )\n ],\n },\n {\"recursion_limit\": 150},\n):\n if \"__end__\" not in s:\n print(s)\n print(\"---\")"] + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "{'supervisor': {'next': 'ResearchTeam'}}\n", + "---\n", + "{'ResearchTeam': {'messages': [HumanMessage(content=\"Unfortunately, the information obtained from the U.S. Fish & Wildlife Service web pages does not provide additional detailed information on the conservation status, size, or lifespan of the North American sturgeon species beyond what was already included in the initial research report. These pages primarily contain placeholders for the species' profiles without specific information on the topics of interest.\\n\\nBased on the information available, the research report provided earlier remains the most comprehensive summary of the North American sturgeon, including an overview of the species, their conservation status, size, lifespan, conservation efforts, and a chart summarizing key data for each species. Further details would require access to additional sources or in-depth research reports that are not currently available in the provided documents.\", name='WebScraper')]}}\n", + "---\n", + "{'supervisor': {'next': 'PaperWritingTeam'}}\n", + "---\n", + "{'PaperWritingTeam': {'messages': [HumanMessage(content=\"It appears that the information you were seeking from the U.S. Fish & Wildlife Service web pages was not as detailed as you needed for the North American sturgeon species. If you're looking for more comprehensive data on their conservation status, size, lifespan, and conservation efforts, you might need to consider exploring scientific journals, research papers, or contacting experts in the field.\\n\\nIf you have any specific questions or require assistance with creating an outline or reading a document related to the North American sturgeon, please let me know how I can assist you further.\", name='NoteTaker')]}}\n", + "---\n", + "{'supervisor': {'next': 'ResearchTeam'}}\n", + "---\n", + "{'ResearchTeam': {'messages': [HumanMessage(content='I\\'ve found several resources that could provide the comprehensive data you\\'re looking for on the conservation status, size, lifespan, and conservation efforts for North American sturgeon species:\\n\\n1. A paper titled \"Reconnecting Fragmented Sturgeon Populations in North American Rivers\" by Jager et al., which may contain information on distribution, range contraction, and conservation efforts ([Read the paper](https://web.ornl.gov/~zij/mypubs/sturgeon/Jager at al_2016_Reconnecting Fragmented Sturgeon Populations in North American Rivers_Fisheries.pdf)).\\n\\n2. The North American Sturgeon and Paddlefish Society (NASPS) website, which lists experts and provides details on the society\\'s mission to foster the conservation and restoration of sturgeon species in North America ([Visit NASPS](https://nasps-sturgeon.org/about/)).\\n\\n3. A press release from the U.S. Fish and Wildlife Service indicating that lake sturgeon do not require listing under the Endangered Species Act due to successful ongoing management efforts ([Read the press release](https://www.fws.gov/press-release/2024-04/collaborative-conservation-keeps-lake-sturgeon-endangered-list)).\\n\\n4. Information on the Conservation Genetics of Atlantic Sturgeon by the USGS, discussing genetic studies and management strategies for Atlantic Sturgeon populations ([Learn more from USGS](https://www.usgs.gov/centers/eesc/science/conservation-genetics-atlantic-sturgeon)).\\n\\n5. A story on restoring lake sturgeon along the Ontonagon River in Michigan and St. Louis River in Minnesota, detailing efforts by the Iron River National Fish Hatchery and Ashland Fish and Wildlife Conservation Office ([Read the story](https://www.fws.gov/story/2024-04/restoring-reverence-along-lake-sturgeon)).\\n\\nThese resources should provide a strong foundation for understanding the current state of North American sturgeon species. If you require more detailed summaries or have any other questions, feel free to ask.', name='Search')]}}\n", + "---\n", + "{'supervisor': {'next': 'ResearchTeam'}}\n", + "---\n", + "{'ResearchTeam': {'messages': [HumanMessage(content='Based on the search results obtained, here is a summary of the information available regarding the conservation status, size, lifespan, and conservation efforts for North American sturgeon species:\\n\\n1. **Reconnecting Fragmented Sturgeon Populations in North American Rivers (Jager et al.)**:\\n - This paper discusses the fragmentation of large North American rivers by dams that interrupt the migrations of wide-ranging fishes like sturgeons. Efforts to reconnect habitats are viewed as crucial for protecting sturgeon species in U.S. rivers, as these species have lost between 5% and 60% of their historical ranges. [Learn more from the paper](https://www.semanticscholar.org/paper/Reconnecting-Fragmented-Sturgeon-Populations-in-Jager-Parsley/45414d7c86cd2d4f04b9490c7143f36b5158e729/figure/0).\\n\\n2. **North American Sturgeon and Paddlefish Society (NASPS)**:\\n - NASPS is dedicated to promoting the conservation and restoration of sturgeon species in North America by developing and advancing research pertaining to their biology, management, and utilization. [Visit NASPS](https://nasps-sturgeon.org/about/).\\n\\n3. **U.S. Fish and Wildlife Service on Lake Sturgeon and the Endangered Species Act**:\\n - The U.S. Fish and Wildlife Service determined that lake sturgeon do not require listing under the Endangered Species Act, thanks to ongoing management efforts such as fish stocking that have contributed to their population stability. [Read the press release](https://www.fws.gov/press-release/2024-04/collaborative-conservation-keeps-lake-sturgeon-endangered-list).\\n\\n4. **Conservation Genetics of Atlantic Sturgeon (USGS)**:\\n - The USGS is conducting research on the conservation genetics of Atlantic sturgeon, with a focus on genetic assignment testing and population genetic studies. This is in response to the rediscovery of populations that were previously thought to be extirpated, necessitating updated management strategies. [Learn more from USGS](https://www.usgs.gov/centers/eesc/science/conservation-genetics-atlantic-sturgeon).\\n\\n5. **Restoration Efforts Along the Ontonagon River and St. Louis River**:\\n - The Iron River National Fish Hatchery and Ashland Fish and Wildlife Conservation Office are working with partners to restore lake sturgeon in Michigan and Minnesota. Efforts include collecting larval sturgeon and milt for breeding and stocking programs. [Read the story](https://www.fws.gov/story/2024-04/restoring-reverence-along-lake-sturgeon).\\n\\nThese resources provide comprehensive data on the state of North American sturgeon species and the various conservation efforts being undertaken to preserve and enhance their populations. If you require further information or assistance, feel free to ask.', name='Search')]}}\n", + "---\n", + "{'supervisor': {'next': 'ResearchTeam'}}\n", + "---\n", + "{'ResearchTeam': {'messages': [HumanMessage(content='Based on the search results obtained, here is a summary of the information available regarding the conservation status, size, lifespan, and conservation efforts for North American sturgeon species:\\n\\n1. **Reconnecting Fragmented Sturgeon Populations in North American Rivers (Jager et al.)**:\\n - This paper discusses the fragmentation of large North American rivers by dams that interrupt the migrations of wide-ranging fishes like sturgeons. Efforts to reconnect habitats are viewed as crucial for protecting sturgeon species in U.S. rivers, as these species have lost between 5% and 60% of their historical ranges. [Learn more from the paper](https://www.semanticscholar.org/paper/Reconnecting-Fragmented-Sturgeon-Populations-in-Jager-Parsley/45414d7c86cd2d4f04b9490c7143f36b5158e729/figure/0).\\n\\n2. **North American Sturgeon and Paddlefish Society (NASPS)**:\\n - NASPS is dedicated to promoting the conservation and restoration of sturgeon species in North America by developing and advancing research pertaining to their biology, management, and utilization. [Visit NASPS](https://nasps-sturgeon.org/about/).\\n\\n3. **U.S. Fish and Wildlife Service on Lake Sturgeon and the Endangered Species Act**:\\n - The U.S. Fish and Wildlife Service determined that lake sturgeon do not require listing under the Endangered Species Act, thanks to ongoing management efforts such as fish stocking that have contributed to their population stability. [Read the press release](https://www.fws.gov/press-release/2024-04/collaborative-conservation-keeps-lake-sturgeon-endangered-list).\\n\\n4. **Conservation Genetics of Atlantic Sturgeon (USGS)**:\\n - The USGS is conducting research on the conservation genetics of Atlantic sturgeon, with a focus on genetic assignment testing and population genetic studies. This is in response to the rediscovery of populations that were previously thought to be extirpated, necessitating updated management strategies. [Learn more from USGS](https://www.usgs.gov/centers/eesc/science/conservation-genetics-atlantic-sturgeon).\\n\\n5. **Restoration Efforts Along the Ontonagon River and St. Louis River**:\\n - The Iron River National Fish Hatchery and Ashland Fish and Wildlife Conservation Office are working with partners to restore lake sturgeon in Michigan and Minnesota. Efforts include collecting larval sturgeon and milt for breeding and stocking programs. [Read the story](https://www.fws.gov/story/2024-04/restoring-reverence-along-lake-sturgeon).\\n\\nThese resources provide comprehensive data on the state of North American sturgeon species and the various conservation efforts being undertaken to preserve and enhance their populations. If you require further information or assistance, feel free to ask.')]}}\n", + "---\n", + "{'supervisor': {'next': 'ResearchTeam'}}\n", + "---\n", + "{'ResearchTeam': {'messages': [HumanMessage(content='Based on the search results obtained, here is a summary of the information available regarding the conservation status, size, lifespan, and conservation efforts for North American sturgeon species:\\n\\n1. **Reconnecting Fragmented Sturgeon Populations in North American Rivers (Jager et al.)**:\\n - This paper discusses the fragmentation of large North American rivers by dams that interrupt the migrations of wide-ranging fishes like sturgeons. Efforts to reconnect habitats are viewed as crucial for protecting sturgeon species in U.S. rivers, as these species have lost between 5% and 60% of their historical ranges. [Learn more from the paper](https://www.semanticscholar.org/paper/Reconnecting-Fragmented-Sturgeon-Populations-in-Jager-Parsley/45414d7c86cd2d4f04b9490c7143f36b5158e729/figure/0).\\n\\n2. **North American Sturgeon and Paddlefish Society (NASPS)**:\\n - NASPS is dedicated to promoting the conservation and restoration of sturgeon species in North America by developing and advancing research pertaining to their biology, management, and utilization. [Visit NASPS](https://nasps-sturgeon.org/about/).\\n\\n3. **U.S. Fish and Wildlife Service on Lake Sturgeon and the Endangered Species Act**:\\n - The U.S. Fish and Wildlife Service determined that lake sturgeon do not require listing under the Endangered Species Act, thanks to ongoing management efforts such as fish stocking that have contributed to their population stability. [Read the press release](https://www.fws.gov/press-release/2024-04/collaborative-conservation-keeps-lake-sturgeon-endangered-list).\\n\\n4. **Conservation Genetics of Atlantic Sturgeon (USGS)**:\\n - The USGS is conducting research on the conservation genetics of Atlantic sturgeon, with a focus on genetic assignment testing and population genetic studies. This is in response to the rediscovery of populations that were previously thought to be extirpated, necessitating updated management strategies. [Learn more from USGS](https://www.usgs.gov/centers/eesc/science/conservation-genetics-atlantic-sturgeon).\\n\\n5. **Restoration Efforts Along the Ontonagon River and St. Louis River**:\\n - The Iron River National Fish Hatchery and Ashland Fish and Wildlife Conservation Office are working with partners to restore lake sturgeon in Michigan and Minnesota. Efforts include collecting larval sturgeon and milt for breeding and stocking programs. [Read the story](https://www.fws.gov/story/2024-04/restoring-reverence-along-lake-sturgeon).\\n\\nThese resources provide comprehensive data on the state of North American sturgeon species and the various conservation efforts being undertaken to preserve and enhance their populations. If you require further information or assistance, feel free to ask.')]}}\n", + "---\n", + "{'supervisor': {'next': 'ResearchTeam'}}\n", + "---\n", + "{'ResearchTeam': {'messages': [HumanMessage(content='Based on the search results obtained, here is a summary of the information available regarding the conservation status, size, lifespan, and conservation efforts for North American sturgeon species:\\n\\n1. **Reconnecting Fragmented Sturgeon Populations in North American Rivers (Jager et al.)**:\\n - This paper discusses the fragmentation of large North American rivers by dams that interrupt the migrations of wide-ranging fishes like sturgeons. Efforts to reconnect habitats are viewed as crucial for protecting sturgeon species in U.S. rivers, as these species have lost between 5% and 60% of their historical ranges. [Learn more from the paper](https://www.semanticscholar.org/paper/Reconnecting-Fragmented-Sturgeon-Populations-in-Jager-Parsley/45414d7c86cd2d4f04b9490c7143f36b5158e729/figure/0).\\n\\n2. **North American Sturgeon and Paddlefish Society (NASPS)**:\\n - NASPS is dedicated to promoting the conservation and restoration of sturgeon species in North America by developing and advancing research pertaining to their biology, management, and utilization. [Visit NASPS](https://nasps-sturgeon.org/about/).\\n\\n3. **U.S. Fish and Wildlife Service on Lake Sturgeon and the Endangered Species Act**:\\n - The U.S. Fish and Wildlife Service determined that lake sturgeon do not require listing under the Endangered Species Act, thanks to ongoing management efforts such as fish stocking that have contributed to their population stability. [Read the press release](https://www.fws.gov/press-release/2024-04/collaborative-conservation-keeps-lake-sturgeon-endangered-list).\\n\\n4. **Conservation Genetics of Atlantic Sturgeon (USGS)**:\\n - The USGS is conducting research on the conservation genetics of Atlantic sturgeon, with a focus on genetic assignment testing and population genetic studies. This is in response to the rediscovery of populations that were previously thought to be extirpated, necessitating updated management strategies. [Learn more from USGS](https://www.usgs.gov/centers/eesc/science/conservation-genetics-atlantic-sturgeon).\\n\\n5. **Restoration Efforts Along the Ontonagon River and St. Louis River**:\\n - The Iron River National Fish Hatchery and Ashland Fish and Wildlife Conservation Office are working with partners to restore lake sturgeon in Michigan and Minnesota. Efforts include collecting larval sturgeon and milt for breeding and stocking programs. [Read the story](https://www.fws.gov/story/2024-04/restoring-reverence-along-lake-sturgeon).\\n\\nThese resources provide comprehensive data on the state of North American sturgeon species and the various conservation efforts being undertaken to preserve and enhance their populations. If you require further information or assistance, feel free to ask.')]}}\n", + "---\n", + "{'supervisor': {'next': 'ResearchTeam'}}\n", + "---\n", + "{'ResearchTeam': {'messages': [HumanMessage(content='Based on the search results obtained, here is a summary of the information available regarding the conservation status, size, lifespan, and conservation efforts for North American sturgeon species:\\n\\n1. **Reconnecting Fragmented Sturgeon Populations in North American Rivers (Jager et al.)**:\\n - This paper discusses the fragmentation of large North American rivers by dams that interrupt the migrations of wide-ranging fishes like sturgeons. Efforts to reconnect habitats are viewed as crucial for protecting sturgeon species in U.S. rivers, as these species have lost between 5% and 60% of their historical ranges. [Learn more from the paper](https://www.semanticscholar.org/paper/Reconnecting-Fragmented-Sturgeon-Populations-in-Jager-Parsley/45414d7c86cd2d4f04b9490c7143f36b5158e729/figure/0).\\n\\n2. **North American Sturgeon and Paddlefish Society (NASPS)**:\\n - NASPS is dedicated to promoting the conservation and restoration of sturgeon species in North America by developing and advancing research pertaining to their biology, management, and utilization. [Visit NASPS](https://nasps-sturgeon.org/about/).\\n\\n3. **U.S. Fish and Wildlife Service on Lake Sturgeon and the Endangered Species Act**:\\n - The U.S. Fish and Wildlife Service determined that lake sturgeon do not require listing under the Endangered Species Act, thanks to ongoing management efforts such as fish stocking that have contributed to their population stability. [Read the press release](https://www.fws.gov/press-release/2024-04/collaborative-conservation-keeps-lake-sturgeon-endangered-list).\\n\\n4. **Conservation Genetics of Atlantic Sturgeon (USGS)**:\\n - The USGS is conducting research on the conservation genetics of Atlantic sturgeon, with a focus on genetic assignment testing and population genetic studies. This is in response to the rediscovery of populations that were previously thought to be extirpated, necessitating updated management strategies. [Learn more from USGS](https://www.usgs.gov/centers/eesc/science/conservation-genetics-atlantic-sturgeon).\\n\\n5. **Restoration Efforts Along the Ontonagon River and St. Louis River**:\\n - The Iron River National Fish Hatchery and Ashland Fish and Wildlife Conservation Office are working with partners to restore lake sturgeon in Michigan and Minnesota. Efforts include collecting larval sturgeon and milt for breeding and stocking programs. [Read the story](https://www.fws.gov/story/2024-04/restoring-reverence-along-lake-sturgeon).\\n\\nThese resources provide comprehensive data on the state of North American sturgeon species and the various conservation efforts being undertaken to preserve and enhance their populations. If you require further information or assistance, feel free to ask.')]}}\n", + "---\n", + "{'supervisor': {'next': 'ResearchTeam'}}\n", + "---\n", + "{'ResearchTeam': {'messages': [HumanMessage(content='Based on the search results obtained, here is a summary of the information available regarding the conservation status, size, lifespan, and conservation efforts for North American sturgeon species:\\n\\n1. **Reconnecting Fragmented Sturgeon Populations in North American Rivers (Jager et al.)**:\\n - This paper discusses the fragmentation of large North American rivers by dams that interrupt the migrations of wide-ranging fishes like sturgeons. Efforts to reconnect habitats are viewed as crucial for protecting sturgeon species in U.S. rivers, as these species have lost between 5% and 60% of their historical ranges. [Learn more from the paper](https://www.semanticscholar.org/paper/Reconnecting-Fragmented-Sturgeon-Populations-in-Jager-Parsley/45414d7c86cd2d4f04b9490c7143f36b5158e729/figure/0).\\n\\n2. **North American Sturgeon and Paddlefish Society (NASPS)**:\\n - NASPS is dedicated to promoting the conservation and restoration of sturgeon species in North America by developing and advancing research pertaining to their biology, management, and utilization. [Visit NASPS](https://nasps-sturgeon.org/about/).\\n\\n3. **U.S. Fish and Wildlife Service on Lake Sturgeon and the Endangered Species Act**:\\n - The U.S. Fish and Wildlife Service determined that lake sturgeon do not require listing under the Endangered Species Act, thanks to ongoing management efforts such as fish stocking that have contributed to their population stability. [Read the press release](https://www.fws.gov/press-release/2024-04/collaborative-conservation-keeps-lake-sturgeon-endangered-list).\\n\\n4. **Conservation Genetics of Atlantic Sturgeon (USGS)**:\\n - The USGS is conducting research on the conservation genetics of Atlantic sturgeon, with a focus on genetic assignment testing and population genetic studies. This is in response to the rediscovery of populations that were previously thought to be extirpated, necessitating updated management strategies. [Learn more from USGS](https://www.usgs.gov/centers/eesc/science/conservation-genetics-atlantic-sturgeon).\\n\\n5. **Restoration Efforts Along the Ontonagon River and St. Louis River**:\\n - The Iron River National Fish Hatchery and Ashland Fish and Wildlife Conservation Office are working with partners to restore lake sturgeon in Michigan and Minnesota. Efforts include collecting larval sturgeon and milt for breeding and stocking programs. [Read the story](https://www.fws.gov/story/2024-04/restoring-reverence-along-lake-sturgeon).\\n\\nThese resources provide comprehensive data on the state of North American sturgeon species and the various conservation efforts being undertaken to preserve and enhance their populations. If you require further information or assistance, feel free to ask.')]}}\n", + "---\n", + "{'supervisor': {'next': 'ResearchTeam'}}\n", + "---\n", + "{'ResearchTeam': {'messages': [HumanMessage(content='Based on the search results obtained, here is a summary of the information available regarding the conservation status, size, lifespan, and conservation efforts for North American sturgeon species:\\n\\n1. **Reconnecting Fragmented Sturgeon Populations in North American Rivers (Jager et al.)**:\\n - This paper discusses the fragmentation of large North American rivers by dams that interrupt the migrations of wide-ranging fishes like sturgeons. Efforts to reconnect habitats are viewed as crucial for protecting sturgeon species in U.S. rivers, as these species have lost between 5% and 60% of their historical ranges. [Learn more from the paper](https://www.semanticscholar.org/paper/Reconnecting-Fragmented-Sturgeon-Populations-in-Jager-Parsley/45414d7c86cd2d4f04b9490c7143f36b5158e729/figure/0).\\n\\n2. **North American Sturgeon and Paddlefish Society (NASPS)**:\\n - NASPS is dedicated to promoting the conservation and restoration of sturgeon species in North America by developing and advancing research pertaining to their biology, management, and utilization. [Visit NASPS](https://nasps-sturgeon.org/about/).\\n\\n3. **U.S. Fish and Wildlife Service on Lake Sturgeon and the Endangered Species Act**:\\n - The U.S. Fish and Wildlife Service determined that lake sturgeon do not require listing under the Endangered Species Act, thanks to ongoing management efforts such as fish stocking that have contributed to their population stability. [Read the press release](https://www.fws.gov/press-release/2024-04/collaborative-conservation-keeps-lake-sturgeon-endangered-list).\\n\\n4. **Conservation Genetics of Atlantic Sturgeon (USGS)**:\\n - The USGS is conducting research on the conservation genetics of Atlantic sturgeon, with a focus on genetic assignment testing and population genetic studies. This is in response to the rediscovery of populations that were previously thought to be extirpated, necessitating updated management strategies. [Learn more from USGS](https://www.usgs.gov/centers/eesc/science/conservation-genetics-atlantic-sturgeon).\\n\\n5. **Restoration Efforts Along the Ontonagon River and St. Louis River**:\\n - The Iron River National Fish Hatchery and Ashland Fish and Wildlife Conservation Office are working with partners to restore lake sturgeon in Michigan and Minnesota. Efforts include collecting larval sturgeon and milt for breeding and stocking programs. [Read the story](https://www.fws.gov/story/2024-04/restoring-reverence-along-lake-sturgeon).\\n\\nThese resources provide comprehensive data on the state of North American sturgeon species and the various conservation efforts being undertaken to preserve and enhance their populations. If you require further information or assistance, feel free to ask.')]}}\n", + "---\n", + "{'supervisor': {'next': 'ResearchTeam'}}\n", + "---\n", + "{'ResearchTeam': {'messages': [HumanMessage(content='Based on the search results obtained, here is a summary of the information available regarding the conservation status, size, lifespan, and conservation efforts for North American sturgeon species:\\n\\n1. **Reconnecting Fragmented Sturgeon Populations in North American Rivers (Jager et al.)**:\\n - This paper discusses the fragmentation of large North American rivers by dams that interrupt the migrations of wide-ranging fishes like sturgeons. Efforts to reconnect habitats are viewed as crucial for protecting sturgeon species in U.S. rivers, as these species have lost between 5% and 60% of their historical ranges. [Learn more from the paper](https://www.semanticscholar.org/paper/Reconnecting-Fragmented-Sturgeon-Populations-in-Jager-Parsley/45414d7c86cd2d4f04b9490c7143f36b5158e729/figure/0).\\n\\n2. **North American Sturgeon and Paddlefish Society (NASPS)**:\\n - NASPS is dedicated to promoting the conservation and restoration of sturgeon species in North America by developing and advancing research pertaining to their biology, management, and utilization. [Visit NASPS](https://nasps-sturgeon.org/about/).\\n\\n3. **U.S. Fish and Wildlife Service on Lake Sturgeon and the Endangered Species Act**:\\n - The U.S. Fish and Wildlife Service determined that lake sturgeon do not require listing under the Endangered Species Act, thanks to ongoing management efforts such as fish stocking that have contributed to their population stability. [Read the press release](https://www.fws.gov/press-release/2024-04/collaborative-conservation-keeps-lake-sturgeon-endangered-list).\\n\\n4. **Conservation Genetics of Atlantic Sturgeon (USGS)**:\\n - The USGS is conducting research on the conservation genetics of Atlantic sturgeon, with a focus on genetic assignment testing and population genetic studies. This is in response to the rediscovery of populations that were previously thought to be extirpated, necessitating updated management strategies. [Learn more from USGS](https://www.usgs.gov/centers/eesc/science/conservation-genetics-atlantic-sturgeon).\\n\\n5. **Restoration Efforts Along the Ontonagon River and St. Louis River**:\\n - The Iron River National Fish Hatchery and Ashland Fish and Wildlife Conservation Office are working with partners to restore lake sturgeon in Michigan and Minnesota. Efforts include collecting larval sturgeon and milt for breeding and stocking programs. [Read the story](https://www.fws.gov/story/2024-04/restoring-reverence-along-lake-sturgeon).\\n\\nThese resources provide comprehensive data on the state of North American sturgeon species and the various conservation efforts being undertaken to preserve and enhance their populations. If you require further information or assistance, feel free to ask.')]}}\n", + "---\n", + "{'supervisor': {'next': 'ResearchTeam'}}\n", + "---\n", + "{'ResearchTeam': {'messages': [HumanMessage(content='Based on the search results obtained, here is a summary of the information available regarding the conservation status, size, lifespan, and conservation efforts for North American sturgeon species:\\n\\n1. **Reconnecting Fragmented Sturgeon Populations in North American Rivers (Jager et al.)**:\\n - This paper discusses the fragmentation of large North American rivers by dams that interrupt the migrations of wide-ranging fishes like sturgeons. Efforts to reconnect habitats are viewed as crucial for protecting sturgeon species in U.S. rivers, as these species have lost between 5% and 60% of their historical ranges. [Learn more from the paper](https://www.semanticscholar.org/paper/Reconnecting-Fragmented-Sturgeon-Populations-in-Jager-Parsley/45414d7c86cd2d4f04b9490c7143f36b5158e729/figure/0).\\n\\n2. **North American Sturgeon and Paddlefish Society (NASPS)**:\\n - NASPS is dedicated to promoting the conservation and restoration of sturgeon species in North America by developing and advancing research pertaining to their biology, management, and utilization. [Visit NASPS](https://nasps-sturgeon.org/about/).\\n\\n3. **U.S. Fish and Wildlife Service on Lake Sturgeon and the Endangered Species Act**:\\n - The U.S. Fish and Wildlife Service determined that lake sturgeon do not require listing under the Endangered Species Act, thanks to ongoing management efforts such as fish stocking that have contributed to their population stability. [Read the press release](https://www.fws.gov/press-release/2024-04/collaborative-conservation-keeps-lake-sturgeon-endangered-list).\\n\\n4. **Conservation Genetics of Atlantic Sturgeon (USGS)**:\\n - The USGS is conducting research on the conservation genetics of Atlantic sturgeon, with a focus on genetic assignment testing and population genetic studies. This is in response to the rediscovery of populations that were previously thought to be extirpated, necessitating updated management strategies. [Learn more from USGS](https://www.usgs.gov/centers/eesc/science/conservation-genetics-atlantic-sturgeon).\\n\\n5. **Restoration Efforts Along the Ontonagon River and St. Louis River**:\\n - The Iron River National Fish Hatchery and Ashland Fish and Wildlife Conservation Office are working with partners to restore lake sturgeon in Michigan and Minnesota. Efforts include collecting larval sturgeon and milt for breeding and stocking programs. [Read the story](https://www.fws.gov/story/2024-04/restoring-reverence-along-lake-sturgeon).\\n\\nThese resources provide comprehensive data on the state of North American sturgeon species and the various conservation efforts being undertaken to preserve and enhance their populations. If you require further information or assistance, feel free to ask.')]}}\n", + "---\n", + "{'supervisor': {'next': 'ResearchTeam'}}\n", + "---\n", + "{'ResearchTeam': {'messages': [HumanMessage(content='Based on the search results obtained, here is a summary of the information available regarding the conservation status, size, lifespan, and conservation efforts for North American sturgeon species:\\n\\n1. **Reconnecting Fragmented Sturgeon Populations in North American Rivers (Jager et al.)**:\\n - This paper discusses the fragmentation of large North American rivers by dams that interrupt the migrations of wide-ranging fishes like sturgeons. Efforts to reconnect habitats are viewed as crucial for protecting sturgeon species in U.S. rivers, as these species have lost between 5% and 60% of their historical ranges. [Learn more from the paper](https://www.semanticscholar.org/paper/Reconnecting-Fragmented-Sturgeon-Populations-in-Jager-Parsley/45414d7c86cd2d4f04b9490c7143f36b5158e729/figure/0).\\n\\n2. **North American Sturgeon and Paddlefish Society (NASPS)**:\\n - NASPS is dedicated to promoting the conservation and restoration of sturgeon species in North America by developing and advancing research pertaining to their biology, management, and utilization. [Visit NASPS](https://nasps-sturgeon.org/about/).\\n\\n3. **U.S. Fish and Wildlife Service on Lake Sturgeon and the Endangered Species Act**:\\n - The U.S. Fish and Wildlife Service determined that lake sturgeon do not require listing under the Endangered Species Act, thanks to ongoing management efforts such as fish stocking that have contributed to their population stability. [Read the press release](https://www.fws.gov/press-release/2024-04/collaborative-conservation-keeps-lake-sturgeon-endangered-list).\\n\\n4. **Conservation Genetics of Atlantic Sturgeon (USGS)**:\\n - The USGS is conducting research on the conservation genetics of Atlantic sturgeon, with a focus on genetic assignment testing and population genetic studies. This is in response to the rediscovery of populations that were previously thought to be extirpated, necessitating updated management strategies. [Learn more from USGS](https://www.usgs.gov/centers/eesc/science/conservation-genetics-atlantic-sturgeon).\\n\\n5. **Restoration Efforts Along the Ontonagon River and St. Louis River**:\\n - The Iron River National Fish Hatchery and Ashland Fish and Wildlife Conservation Office are working with partners to restore lake sturgeon in Michigan and Minnesota. Efforts include collecting larval sturgeon and milt for breeding and stocking programs. [Read the story](https://www.fws.gov/story/2024-04/restoring-reverence-along-lake-sturgeon).\\n\\nThese resources provide comprehensive data on the state of North American sturgeon species and the various conservation efforts being undertaken to preserve and enhance their populations. If you require further information or assistance, feel free to ask.')]}}\n", + "---\n", + "{'supervisor': {'next': 'ResearchTeam'}}\n", + "---\n", + "{'ResearchTeam': {'messages': [HumanMessage(content='Based on the search results obtained, here is a summary of the information available regarding the conservation status, size, lifespan, and conservation efforts for North American sturgeon species:\\n\\n1. **Reconnecting Fragmented Sturgeon Populations in North American Rivers (Jager et al.)**:\\n - This paper discusses the fragmentation of large North American rivers by dams that interrupt the migrations of wide-ranging fishes like sturgeons. Efforts to reconnect habitats are viewed as crucial for protecting sturgeon species in U.S. rivers, as these species have lost between 5% and 60% of their historical ranges. [Learn more from the paper](https://www.semanticscholar.org/paper/Reconnecting-Fragmented-Sturgeon-Populations-in-Jager-Parsley/45414d7c86cd2d4f04b9490c7143f36b5158e729/figure/0).\\n\\n2. **North American Sturgeon and Paddlefish Society (NASPS)**:\\n - NASPS is dedicated to promoting the conservation and restoration of sturgeon species in North America by developing and advancing research pertaining to their biology, management, and utilization. [Visit NASPS](https://nasps-sturgeon.org/about/).\\n\\n3. **U.S. Fish and Wildlife Service on Lake Sturgeon and the Endangered Species Act**:\\n - The U.S. Fish and Wildlife Service determined that lake sturgeon do not require listing under the Endangered Species Act, thanks to ongoing management efforts such as fish stocking that have contributed to their population stability. [Read the press release](https://www.fws.gov/press-release/2024-04/collaborative-conservation-keeps-lake-sturgeon-endangered-list).\\n\\n4. **Conservation Genetics of Atlantic Sturgeon (USGS)**:\\n - The USGS is conducting research on the conservation genetics of Atlantic sturgeon, with a focus on genetic assignment testing and population genetic studies. This is in response to the rediscovery of populations that were previously thought to be extirpated, necessitating updated management strategies. [Learn more from USGS](https://www.usgs.gov/centers/eesc/science/conservation-genetics-atlantic-sturgeon).\\n\\n5. **Restoration Efforts Along the Ontonagon River and St. Louis River**:\\n - The Iron River National Fish Hatchery and Ashland Fish and Wildlife Conservation Office are working with partners to restore lake sturgeon in Michigan and Minnesota. Efforts include collecting larval sturgeon and milt for breeding and stocking programs. [Read the story](https://www.fws.gov/story/2024-04/restoring-reverence-along-lake-sturgeon).\\n\\nThese resources provide comprehensive data on the state of North American sturgeon species and the various conservation efforts being undertaken to preserve and enhance their populations. If you require further information or assistance, feel free to ask.')]}}\n", + "---\n", + "{'supervisor': {'next': 'ResearchTeam'}}\n", + "---\n", + "{'ResearchTeam': {'messages': [HumanMessage(content='Based on the search results obtained, here is a summary of the information available regarding the conservation status, size, lifespan, and conservation efforts for North American sturgeon species:\\n\\n1. **Reconnecting Fragmented Sturgeon Populations in North American Rivers (Jager et al.)**:\\n - This paper discusses the fragmentation of large North American rivers by dams that interrupt the migrations of wide-ranging fishes like sturgeons. Efforts to reconnect habitats are viewed as crucial for protecting sturgeon species in U.S. rivers, as these species have lost between 5% and 60% of their historical ranges. [Learn more from the paper](https://www.semanticscholar.org/paper/Reconnecting-Fragmented-Sturgeon-Populations-in-Jager-Parsley/45414d7c86cd2d4f04b9490c7143f36b5158e729/figure/0).\\n\\n2. **North American Sturgeon and Paddlefish Society (NASPS)**:\\n - NASPS is dedicated to promoting the conservation and restoration of sturgeon species in North America by developing and advancing research pertaining to their biology, management, and utilization. [Visit NASPS](https://nasps-sturgeon.org/about/).\\n\\n3. **U.S. Fish and Wildlife Service on Lake Sturgeon and the Endangered Species Act**:\\n - The U.S. Fish and Wildlife Service determined that lake sturgeon do not require listing under the Endangered Species Act, thanks to ongoing management efforts such as fish stocking that have contributed to their population stability. [Read the press release](https://www.fws.gov/press-release/2024-04/collaborative-conservation-keeps-lake-sturgeon-endangered-list).\\n\\n4. **Conservation Genetics of Atlantic Sturgeon (USGS)**:\\n - The USGS is conducting research on the conservation genetics of Atlantic sturgeon, with a focus on genetic assignment testing and population genetic studies. This is in response to the rediscovery of populations that were previously thought to be extirpated, necessitating updated management strategies. [Learn more from USGS](https://www.usgs.gov/centers/eesc/science/conservation-genetics-atlantic-sturgeon).\\n\\n5. **Restoration Efforts Along the Ontonagon River and St. Louis River**:\\n - The Iron River National Fish Hatchery and Ashland Fish and Wildlife Conservation Office are working with partners to restore lake sturgeon in Michigan and Minnesota. Efforts include collecting larval sturgeon and milt for breeding and stocking programs. [Read the story](https://www.fws.gov/story/2024-04/restoring-reverence-along-lake-sturgeon).\\n\\nThese resources provide comprehensive data on the state of North American sturgeon species and the various conservation efforts being undertaken to preserve and enhance their populations. If you require further information or assistance, feel free to ask.')]}}\n", + "---\n", + "{'supervisor': {'next': 'ResearchTeam'}}\n", + "---\n", + "{'ResearchTeam': {'messages': [HumanMessage(content='Based on the search results obtained, here is a summary of the information available regarding the conservation status, size, lifespan, and conservation efforts for North American sturgeon species:\\n\\n1. **Reconnecting Fragmented Sturgeon Populations in North American Rivers (Jager et al.)**:\\n - This paper discusses the fragmentation of large North American rivers by dams that interrupt the migrations of wide-ranging fishes like sturgeons. Efforts to reconnect habitats are viewed as crucial for protecting sturgeon species in U.S. rivers, as these species have lost between 5% and 60% of their historical ranges. [Learn more from the paper](https://www.semanticscholar.org/paper/Reconnecting-Fragmented-Sturgeon-Populations-in-Jager-Parsley/45414d7c86cd2d4f04b9490c7143f36b5158e729/figure/0).\\n\\n2. **North American Sturgeon and Paddlefish Society (NASPS)**:\\n - NASPS is dedicated to promoting the conservation and restoration of sturgeon species in North America by developing and advancing research pertaining to their biology, management, and utilization. [Visit NASPS](https://nasps-sturgeon.org/about/).\\n\\n3. **U.S. Fish and Wildlife Service on Lake Sturgeon and the Endangered Species Act**:\\n - The U.S. Fish and Wildlife Service determined that lake sturgeon do not require listing under the Endangered Species Act, thanks to ongoing management efforts such as fish stocking that have contributed to their population stability. [Read the press release](https://www.fws.gov/press-release/2024-04/collaborative-conservation-keeps-lake-sturgeon-endangered-list).\\n\\n4. **Conservation Genetics of Atlantic Sturgeon (USGS)**:\\n - The USGS is conducting research on the conservation genetics of Atlantic sturgeon, with a focus on genetic assignment testing and population genetic studies. This is in response to the rediscovery of populations that were previously thought to be extirpated, necessitating updated management strategies. [Learn more from USGS](https://www.usgs.gov/centers/eesc/science/conservation-genetics-atlantic-sturgeon).\\n\\n5. **Restoration Efforts Along the Ontonagon River and St. Louis River**:\\n - The Iron River National Fish Hatchery and Ashland Fish and Wildlife Conservation Office are working with partners to restore lake sturgeon in Michigan and Minnesota. Efforts include collecting larval sturgeon and milt for breeding and stocking programs. [Read the story](https://www.fws.gov/story/2024-04/restoring-reverence-along-lake-sturgeon).\\n\\nThese resources provide comprehensive data on the state of North American sturgeon species and the various conservation efforts being undertaken to preserve and enhance their populations. If you require further information or assistance, feel free to ask.')]}}\n", + "---\n", + "{'supervisor': {'next': 'ResearchTeam'}}\n", + "---\n", + "{'ResearchTeam': {'messages': [HumanMessage(content='Based on the search results obtained, here is a summary of the information available regarding the conservation status, size, lifespan, and conservation efforts for North American sturgeon species:\\n\\n1. **Reconnecting Fragmented Sturgeon Populations in North American Rivers (Jager et al.)**:\\n - This paper discusses the fragmentation of large North American rivers by dams that interrupt the migrations of wide-ranging fishes like sturgeons. Efforts to reconnect habitats are viewed as crucial for protecting sturgeon species in U.S. rivers, as these species have lost between 5% and 60% of their historical ranges. [Learn more from the paper](https://www.semanticscholar.org/paper/Reconnecting-Fragmented-Sturgeon-Populations-in-Jager-Parsley/45414d7c86cd2d4f04b9490c7143f36b5158e729/figure/0).\\n\\n2. **North American Sturgeon and Paddlefish Society (NASPS)**:\\n - NASPS is dedicated to promoting the conservation and restoration of sturgeon species in North America by developing and advancing research pertaining to their biology, management, and utilization. [Visit NASPS](https://nasps-sturgeon.org/about/).\\n\\n3. **U.S. Fish and Wildlife Service on Lake Sturgeon and the Endangered Species Act**:\\n - The U.S. Fish and Wildlife Service determined that lake sturgeon do not require listing under the Endangered Species Act, thanks to ongoing management efforts such as fish stocking that have contributed to their population stability. [Read the press release](https://www.fws.gov/press-release/2024-04/collaborative-conservation-keeps-lake-sturgeon-endangered-list).\\n\\n4. **Conservation Genetics of Atlantic Sturgeon (USGS)**:\\n - The USGS is conducting research on the conservation genetics of Atlantic sturgeon, with a focus on genetic assignment testing and population genetic studies. This is in response to the rediscovery of populations that were previously thought to be extirpated, necessitating updated management strategies. [Learn more from USGS](https://www.usgs.gov/centers/eesc/science/conservation-genetics-atlantic-sturgeon).\\n\\n5. **Restoration Efforts Along the Ontonagon River and St. Louis River**:\\n - The Iron River National Fish Hatchery and Ashland Fish and Wildlife Conservation Office are working with partners to restore lake sturgeon in Michigan and Minnesota. Efforts include collecting larval sturgeon and milt for breeding and stocking programs. [Read the story](https://www.fws.gov/story/2024-04/restoring-reverence-along-lake-sturgeon).\\n\\nThese resources provide comprehensive data on the state of North American sturgeon species and the various conservation efforts being undertaken to preserve and enhance their populations. If you require further information or assistance, feel free to ask.')]}}\n", + "---\n", + "{'supervisor': {'next': 'ResearchTeam'}}\n", + "---\n", + "{'ResearchTeam': {'messages': [HumanMessage(content='Based on the search results obtained, here is a summary of the information available regarding the conservation status, size, lifespan, and conservation efforts for North American sturgeon species:\\n\\n1. **Reconnecting Fragmented Sturgeon Populations in North American Rivers (Jager et al.)**:\\n - This paper discusses the fragmentation of large North American rivers by dams that interrupt the migrations of wide-ranging fishes like sturgeons. Efforts to reconnect habitats are viewed as crucial for protecting sturgeon species in U.S. rivers, as these species have lost between 5% and 60% of their historical ranges. [Learn more from the paper](https://www.semanticscholar.org/paper/Reconnecting-Fragmented-Sturgeon-Populations-in-Jager-Parsley/45414d7c86cd2d4f04b9490c7143f36b5158e729/figure/0).\\n\\n2. **North American Sturgeon and Paddlefish Society (NASPS)**:\\n - NASPS is dedicated to promoting the conservation and restoration of sturgeon species in North America by developing and advancing research pertaining to their biology, management, and utilization. [Visit NASPS](https://nasps-sturgeon.org/about/).\\n\\n3. **U.S. Fish and Wildlife Service on Lake Sturgeon and the Endangered Species Act**:\\n - The U.S. Fish and Wildlife Service determined that lake sturgeon do not require listing under the Endangered Species Act, thanks to ongoing management efforts such as fish stocking that have contributed to their population stability. [Read the press release](https://www.fws.gov/press-release/2024-04/collaborative-conservation-keeps-lake-sturgeon-endangered-list).\\n\\n4. **Conservation Genetics of Atlantic Sturgeon (USGS)**:\\n - The USGS is conducting research on the conservation genetics of Atlantic sturgeon, with a focus on genetic assignment testing and population genetic studies. This is in response to the rediscovery of populations that were previously thought to be extirpated, necessitating updated management strategies. [Learn more from USGS](https://www.usgs.gov/centers/eesc/science/conservation-genetics-atlantic-sturgeon).\\n\\n5. **Restoration Efforts Along the Ontonagon River and St. Louis River**:\\n - The Iron River National Fish Hatchery and Ashland Fish and Wildlife Conservation Office are working with partners to restore lake sturgeon in Michigan and Minnesota. Efforts include collecting larval sturgeon and milt for breeding and stocking programs. [Read the story](https://www.fws.gov/story/2024-04/restoring-reverence-along-lake-sturgeon).\\n\\nThese resources provide comprehensive data on the state of North American sturgeon species and the various conservation efforts being undertaken to preserve and enhance their populations. If you require further information or assistance, feel free to ask.')]}}\n", + "---\n", + "{'supervisor': {'next': 'ResearchTeam'}}\n", + "---\n", + "{'ResearchTeam': {'messages': [HumanMessage(content='Based on the search results obtained, here is a summary of the information available regarding the conservation status, size, lifespan, and conservation efforts for North American sturgeon species:\\n\\n1. **Reconnecting Fragmented Sturgeon Populations in North American Rivers (Jager et al.)**:\\n - This paper discusses the fragmentation of large North American rivers by dams that interrupt the migrations of wide-ranging fishes like sturgeons. Efforts to reconnect habitats are viewed as crucial for protecting sturgeon species in U.S. rivers, as these species have lost between 5% and 60% of their historical ranges. [Learn more from the paper](https://www.semanticscholar.org/paper/Reconnecting-Fragmented-Sturgeon-Populations-in-Jager-Parsley/45414d7c86cd2d4f04b9490c7143f36b5158e729/figure/0).\\n\\n2. **North American Sturgeon and Paddlefish Society (NASPS)**:\\n - NASPS is dedicated to promoting the conservation and restoration of sturgeon species in North America by developing and advancing research pertaining to their biology, management, and utilization. [Visit NASPS](https://nasps-sturgeon.org/about/).\\n\\n3. **U.S. Fish and Wildlife Service on Lake Sturgeon and the Endangered Species Act**:\\n - The U.S. Fish and Wildlife Service determined that lake sturgeon do not require listing under the Endangered Species Act, thanks to ongoing management efforts such as fish stocking that have contributed to their population stability. [Read the press release](https://www.fws.gov/press-release/2024-04/collaborative-conservation-keeps-lake-sturgeon-endangered-list).\\n\\n4. **Conservation Genetics of Atlantic Sturgeon (USGS)**:\\n - The USGS is conducting research on the conservation genetics of Atlantic sturgeon, with a focus on genetic assignment testing and population genetic studies. This is in response to the rediscovery of populations that were previously thought to be extirpated, necessitating updated management strategies. [Learn more from USGS](https://www.usgs.gov/centers/eesc/science/conservation-genetics-atlantic-sturgeon).\\n\\n5. **Restoration Efforts Along the Ontonagon River and St. Louis River**:\\n - The Iron River National Fish Hatchery and Ashland Fish and Wildlife Conservation Office are working with partners to restore lake sturgeon in Michigan and Minnesota. Efforts include collecting larval sturgeon and milt for breeding and stocking programs. [Read the story](https://www.fws.gov/story/2024-04/restoring-reverence-along-lake-sturgeon).\\n\\nThese resources provide comprehensive data on the state of North American sturgeon species and the various conservation efforts being undertaken to preserve and enhance their populations. If you require further information or assistance, feel free to ask.')]}}\n", + "---\n", + "{'supervisor': {'next': 'ResearchTeam'}}\n", + "---\n", + "{'ResearchTeam': {'messages': [HumanMessage(content='Based on the search results obtained, here is a summary of the information available regarding the conservation status, size, lifespan, and conservation efforts for North American sturgeon species:\\n\\n1. **Reconnecting Fragmented Sturgeon Populations in North American Rivers (Jager et al.)**:\\n - This paper discusses the fragmentation of large North American rivers by dams that interrupt the migrations of wide-ranging fishes like sturgeons. Efforts to reconnect habitats are viewed as crucial for protecting sturgeon species in U.S. rivers, as these species have lost between 5% and 60% of their historical ranges. [Learn more from the paper](https://www.semanticscholar.org/paper/Reconnecting-Fragmented-Sturgeon-Populations-in-Jager-Parsley/45414d7c86cd2d4f04b9490c7143f36b5158e729/figure/0).\\n\\n2. **North American Sturgeon and Paddlefish Society (NASPS)**:\\n - NASPS is dedicated to promoting the conservation and restoration of sturgeon species in North America by developing and advancing research pertaining to their biology, management, and utilization. [Visit NASPS](https://nasps-sturgeon.org/about/).\\n\\n3. **U.S. Fish and Wildlife Service on Lake Sturgeon and the Endangered Species Act**:\\n - The U.S. Fish and Wildlife Service determined that lake sturgeon do not require listing under the Endangered Species Act, thanks to ongoing management efforts such as fish stocking that have contributed to their population stability. [Read the press release](https://www.fws.gov/press-release/2024-04/collaborative-conservation-keeps-lake-sturgeon-endangered-list).\\n\\n4. **Conservation Genetics of Atlantic Sturgeon (USGS)**:\\n - The USGS is conducting research on the conservation genetics of Atlantic sturgeon, with a focus on genetic assignment testing and population genetic studies. This is in response to the rediscovery of populations that were previously thought to be extirpated, necessitating updated management strategies. [Learn more from USGS](https://www.usgs.gov/centers/eesc/science/conservation-genetics-atlantic-sturgeon).\\n\\n5. **Restoration Efforts Along the Ontonagon River and St. Louis River**:\\n - The Iron River National Fish Hatchery and Ashland Fish and Wildlife Conservation Office are working with partners to restore lake sturgeon in Michigan and Minnesota. Efforts include collecting larval sturgeon and milt for breeding and stocking programs. [Read the story](https://www.fws.gov/story/2024-04/restoring-reverence-along-lake-sturgeon).\\n\\nThese resources provide comprehensive data on the state of North American sturgeon species and the various conservation efforts being undertaken to preserve and enhance their populations. If you require further information or assistance, feel free to ask.')]}}\n", + "---\n", + "{'supervisor': {'next': 'ResearchTeam'}}\n", + "---\n", + "{'ResearchTeam': {'messages': [HumanMessage(content='Based on the search results obtained, here is a summary of the information available regarding the conservation status, size, lifespan, and conservation efforts for North American sturgeon species:\\n\\n1. **Reconnecting Fragmented Sturgeon Populations in North American Rivers (Jager et al.)**:\\n - This paper discusses the fragmentation of large North American rivers by dams that interrupt the migrations of wide-ranging fishes like sturgeons. Efforts to reconnect habitats are viewed as crucial for protecting sturgeon species in U.S. rivers, as these species have lost between 5% and 60% of their historical ranges. [Learn more from the paper](https://www.semanticscholar.org/paper/Reconnecting-Fragmented-Sturgeon-Populations-in-Jager-Parsley/45414d7c86cd2d4f04b9490c7143f36b5158e729/figure/0).\\n\\n2. **North American Sturgeon and Paddlefish Society (NASPS)**:\\n - NASPS is dedicated to promoting the conservation and restoration of sturgeon species in North America by developing and advancing research pertaining to their biology, management, and utilization. [Visit NASPS](https://nasps-sturgeon.org/about/).\\n\\n3. **U.S. Fish and Wildlife Service on Lake Sturgeon and the Endangered Species Act**:\\n - The U.S. Fish and Wildlife Service determined that lake sturgeon do not require listing under the Endangered Species Act, thanks to ongoing management efforts such as fish stocking that have contributed to their population stability. [Read the press release](https://www.fws.gov/press-release/2024-04/collaborative-conservation-keeps-lake-sturgeon-endangered-list).\\n\\n4. **Conservation Genetics of Atlantic Sturgeon (USGS)**:\\n - The USGS is conducting research on the conservation genetics of Atlantic sturgeon, with a focus on genetic assignment testing and population genetic studies. This is in response to the rediscovery of populations that were previously thought to be extirpated, necessitating updated management strategies. [Learn more from USGS](https://www.usgs.gov/centers/eesc/science/conservation-genetics-atlantic-sturgeon).\\n\\n5. **Restoration Efforts Along the Ontonagon River and St. Louis River**:\\n - The Iron River National Fish Hatchery and Ashland Fish and Wildlife Conservation Office are working with partners to restore lake sturgeon in Michigan and Minnesota. Efforts include collecting larval sturgeon and milt for breeding and stocking programs. [Read the story](https://www.fws.gov/story/2024-04/restoring-reverence-along-lake-sturgeon).\\n\\nThese resources provide comprehensive data on the state of North American sturgeon species and the various conservation efforts being undertaken to preserve and enhance their populations. If you require further information or assistance, feel free to ask.')]}}\n", + "---\n", + "{'supervisor': {'next': 'ResearchTeam'}}\n", + "---\n", + "{'ResearchTeam': {'messages': [HumanMessage(content='Based on the search results obtained, here is a summary of the information available regarding the conservation status, size, lifespan, and conservation efforts for North American sturgeon species:\\n\\n1. **Reconnecting Fragmented Sturgeon Populations in North American Rivers (Jager et al.)**:\\n - This paper discusses the fragmentation of large North American rivers by dams that interrupt the migrations of wide-ranging fishes like sturgeons. Efforts to reconnect habitats are viewed as crucial for protecting sturgeon species in U.S. rivers, as these species have lost between 5% and 60% of their historical ranges. [Learn more from the paper](https://www.semanticscholar.org/paper/Reconnecting-Fragmented-Sturgeon-Populations-in-Jager-Parsley/45414d7c86cd2d4f04b9490c7143f36b5158e729/figure/0).\\n\\n2. **North American Sturgeon and Paddlefish Society (NASPS)**:\\n - NASPS is dedicated to promoting the conservation and restoration of sturgeon species in North America by developing and advancing research pertaining to their biology, management, and utilization. [Visit NASPS](https://nasps-sturgeon.org/about/).\\n\\n3. **U.S. Fish and Wildlife Service on Lake Sturgeon and the Endangered Species Act**:\\n - The U.S. Fish and Wildlife Service determined that lake sturgeon do not require listing under the Endangered Species Act, thanks to ongoing management efforts such as fish stocking that have contributed to their population stability. [Read the press release](https://www.fws.gov/press-release/2024-04/collaborative-conservation-keeps-lake-sturgeon-endangered-list).\\n\\n4. **Conservation Genetics of Atlantic Sturgeon (USGS)**:\\n - The USGS is conducting research on the conservation genetics of Atlantic sturgeon, with a focus on genetic assignment testing and population genetic studies. This is in response to the rediscovery of populations that were previously thought to be extirpated, necessitating updated management strategies. [Learn more from USGS](https://www.usgs.gov/centers/eesc/science/conservation-genetics-atlantic-sturgeon).\\n\\n5. **Restoration Efforts Along the Ontonagon River and St. Louis River**:\\n - The Iron River National Fish Hatchery and Ashland Fish and Wildlife Conservation Office are working with partners to restore lake sturgeon in Michigan and Minnesota. Efforts include collecting larval sturgeon and milt for breeding and stocking programs. [Read the story](https://www.fws.gov/story/2024-04/restoring-reverence-along-lake-sturgeon).\\n\\nThese resources provide comprehensive data on the state of North American sturgeon species and the various conservation efforts being undertaken to preserve and enhance their populations. If you require further information or assistance, feel free to ask.')]}}\n", + "---\n", + "{'supervisor': {'next': 'ResearchTeam'}}\n", + "---\n", + "{'ResearchTeam': {'messages': [HumanMessage(content='Based on the search results obtained, here is a summary of the information available regarding the conservation status, size, lifespan, and conservation efforts for North American sturgeon species:\\n\\n1. **Reconnecting Fragmented Sturgeon Populations in North American Rivers (Jager et al.)**:\\n - This paper discusses the fragmentation of large North American rivers by dams that interrupt the migrations of wide-ranging fishes like sturgeons. Efforts to reconnect habitats are viewed as crucial for protecting sturgeon species in U.S. rivers, as these species have lost between 5% and 60% of their historical ranges. [Learn more from the paper](https://www.semanticscholar.org/paper/Reconnecting-Fragmented-Sturgeon-Populations-in-Jager-Parsley/45414d7c86cd2d4f04b9490c7143f36b5158e729/figure/0).\\n\\n2. **North American Sturgeon and Paddlefish Society (NASPS)**:\\n - NASPS is dedicated to promoting the conservation and restoration of sturgeon species in North America by developing and advancing research pertaining to their biology, management, and utilization. [Visit NASPS](https://nasps-sturgeon.org/about/).\\n\\n3. **U.S. Fish and Wildlife Service on Lake Sturgeon and the Endangered Species Act**:\\n - The U.S. Fish and Wildlife Service determined that lake sturgeon do not require listing under the Endangered Species Act, thanks to ongoing management efforts such as fish stocking that have contributed to their population stability. [Read the press release](https://www.fws.gov/press-release/2024-04/collaborative-conservation-keeps-lake-sturgeon-endangered-list).\\n\\n4. **Conservation Genetics of Atlantic Sturgeon (USGS)**:\\n - The USGS is conducting research on the conservation genetics of Atlantic sturgeon, with a focus on genetic assignment testing and population genetic studies. This is in response to the rediscovery of populations that were previously thought to be extirpated, necessitating updated management strategies. [Learn more from USGS](https://www.usgs.gov/centers/eesc/science/conservation-genetics-atlantic-sturgeon).\\n\\n5. **Restoration Efforts Along the Ontonagon River and St. Louis River**:\\n - The Iron River National Fish Hatchery and Ashland Fish and Wildlife Conservation Office are working with partners to restore lake sturgeon in Michigan and Minnesota. Efforts include collecting larval sturgeon and milt for breeding and stocking programs. [Read the story](https://www.fws.gov/story/2024-04/restoring-reverence-along-lake-sturgeon).\\n\\nThese resources provide comprehensive data on the state of North American sturgeon species and the various conservation efforts being undertaken to preserve and enhance their populations. If you require further information or assistance, feel free to ask.')]}}\n", + "---\n", + "{'supervisor': {'next': 'ResearchTeam'}}\n", + "---\n", + "{'ResearchTeam': {'messages': [HumanMessage(content='Based on the search results obtained, here is a summary of the information available regarding the conservation status, size, lifespan, and conservation efforts for North American sturgeon species:\\n\\n1. **Reconnecting Fragmented Sturgeon Populations in North American Rivers (Jager et al.)**:\\n - This paper discusses the fragmentation of large North American rivers by dams that interrupt the migrations of wide-ranging fishes like sturgeons. Efforts to reconnect habitats are viewed as crucial for protecting sturgeon species in U.S. rivers, as these species have lost between 5% and 60% of their historical ranges. [Learn more from the paper](https://www.semanticscholar.org/paper/Reconnecting-Fragmented-Sturgeon-Populations-in-Jager-Parsley/45414d7c86cd2d4f04b9490c7143f36b5158e729/figure/0).\\n\\n2. **North American Sturgeon and Paddlefish Society (NASPS)**:\\n - NASPS is dedicated to promoting the conservation and restoration of sturgeon species in North America by developing and advancing research pertaining to their biology, management, and utilization. [Visit NASPS](https://nasps-sturgeon.org/about/).\\n\\n3. **U.S. Fish and Wildlife Service on Lake Sturgeon and the Endangered Species Act**:\\n - The U.S. Fish and Wildlife Service determined that lake sturgeon do not require listing under the Endangered Species Act, thanks to ongoing management efforts such as fish stocking that have contributed to their population stability. [Read the press release](https://www.fws.gov/press-release/2024-04/collaborative-conservation-keeps-lake-sturgeon-endangered-list).\\n\\n4. **Conservation Genetics of Atlantic Sturgeon (USGS)**:\\n - The USGS is conducting research on the conservation genetics of Atlantic sturgeon, with a focus on genetic assignment testing and population genetic studies. This is in response to the rediscovery of populations that were previously thought to be extirpated, necessitating updated management strategies. [Learn more from USGS](https://www.usgs.gov/centers/eesc/science/conservation-genetics-atlantic-sturgeon).\\n\\n5. **Restoration Efforts Along the Ontonagon River and St. Louis River**:\\n - The Iron River National Fish Hatchery and Ashland Fish and Wildlife Conservation Office are working with partners to restore lake sturgeon in Michigan and Minnesota. Efforts include collecting larval sturgeon and milt for breeding and stocking programs. [Read the story](https://www.fws.gov/story/2024-04/restoring-reverence-along-lake-sturgeon).\\n\\nThese resources provide comprehensive data on the state of North American sturgeon species and the various conservation efforts being undertaken to preserve and enhance their populations. If you require further information or assistance, feel free to ask.')]}}\n", + "---\n", + "{'supervisor': {'next': 'ResearchTeam'}}\n", + "---\n", + "{'ResearchTeam': {'messages': [HumanMessage(content='Based on the search results obtained, here is a summary of the information available regarding the conservation status, size, lifespan, and conservation efforts for North American sturgeon species:\\n\\n1. **Reconnecting Fragmented Sturgeon Populations in North American Rivers (Jager et al.)**:\\n - This paper discusses the fragmentation of large North American rivers by dams that interrupt the migrations of wide-ranging fishes like sturgeons. Efforts to reconnect habitats are viewed as crucial for protecting sturgeon species in U.S. rivers, as these species have lost between 5% and 60% of their historical ranges. [Learn more from the paper](https://www.semanticscholar.org/paper/Reconnecting-Fragmented-Sturgeon-Populations-in-Jager-Parsley/45414d7c86cd2d4f04b9490c7143f36b5158e729/figure/0).\\n\\n2. **North American Sturgeon and Paddlefish Society (NASPS)**:\\n - NASPS is dedicated to promoting the conservation and restoration of sturgeon species in North America by developing and advancing research pertaining to their biology, management, and utilization. [Visit NASPS](https://nasps-sturgeon.org/about/).\\n\\n3. **U.S. Fish and Wildlife Service on Lake Sturgeon and the Endangered Species Act**:\\n - The U.S. Fish and Wildlife Service determined that lake sturgeon do not require listing under the Endangered Species Act, thanks to ongoing management efforts such as fish stocking that have contributed to their population stability. [Read the press release](https://www.fws.gov/press-release/2024-04/collaborative-conservation-keeps-lake-sturgeon-endangered-list).\\n\\n4. **Conservation Genetics of Atlantic Sturgeon (USGS)**:\\n - The USGS is conducting research on the conservation genetics of Atlantic sturgeon, with a focus on genetic assignment testing and population genetic studies. This is in response to the rediscovery of populations that were previously thought to be extirpated, necessitating updated management strategies. [Learn more from USGS](https://www.usgs.gov/centers/eesc/science/conservation-genetics-atlantic-sturgeon).\\n\\n5. **Restoration Efforts Along the Ontonagon River and St. Louis River**:\\n - The Iron River National Fish Hatchery and Ashland Fish and Wildlife Conservation Office are working with partners to restore lake sturgeon in Michigan and Minnesota. Efforts include collecting larval sturgeon and milt for breeding and stocking programs. [Read the story](https://www.fws.gov/story/2024-04/restoring-reverence-along-lake-sturgeon).\\n\\nThese resources provide comprehensive data on the state of North American sturgeon species and the various conservation efforts being undertaken to preserve and enhance their populations. If you require further information or assistance, feel free to ask.')]}}\n", + "---\n", + "{'supervisor': {'next': 'ResearchTeam'}}\n", + "---\n", + "{'ResearchTeam': {'messages': [HumanMessage(content='Based on the search results obtained, here is a summary of the information available regarding the conservation status, size, lifespan, and conservation efforts for North American sturgeon species:\\n\\n1. **Reconnecting Fragmented Sturgeon Populations in North American Rivers (Jager et al.)**:\\n - This paper discusses the fragmentation of large North American rivers by dams that interrupt the migrations of wide-ranging fishes like sturgeons. Efforts to reconnect habitats are viewed as crucial for protecting sturgeon species in U.S. rivers, as these species have lost between 5% and 60% of their historical ranges. [Learn more from the paper](https://www.semanticscholar.org/paper/Reconnecting-Fragmented-Sturgeon-Populations-in-Jager-Parsley/45414d7c86cd2d4f04b9490c7143f36b5158e729/figure/0).\\n\\n2. **North American Sturgeon and Paddlefish Society (NASPS)**:\\n - NASPS is dedicated to promoting the conservation and restoration of sturgeon species in North America by developing and advancing research pertaining to their biology, management, and utilization. [Visit NASPS](https://nasps-sturgeon.org/about/).\\n\\n3. **U.S. Fish and Wildlife Service on Lake Sturgeon and the Endangered Species Act**:\\n - The U.S. Fish and Wildlife Service determined that lake sturgeon do not require listing under the Endangered Species Act, thanks to ongoing management efforts such as fish stocking that have contributed to their population stability. [Read the press release](https://www.fws.gov/press-release/2024-04/collaborative-conservation-keeps-lake-sturgeon-endangered-list).\\n\\n4. **Conservation Genetics of Atlantic Sturgeon (USGS)**:\\n - The USGS is conducting research on the conservation genetics of Atlantic sturgeon, with a focus on genetic assignment testing and population genetic studies. This is in response to the rediscovery of populations that were previously thought to be extirpated, necessitating updated management strategies. [Learn more from USGS](https://www.usgs.gov/centers/eesc/science/conservation-genetics-atlantic-sturgeon).\\n\\n5. **Restoration Efforts Along the Ontonagon River and St. Louis River**:\\n - The Iron River National Fish Hatchery and Ashland Fish and Wildlife Conservation Office are working with partners to restore lake sturgeon in Michigan and Minnesota. Efforts include collecting larval sturgeon and milt for breeding and stocking programs. [Read the story](https://www.fws.gov/story/2024-04/restoring-reverence-along-lake-sturgeon).\\n\\nThese resources provide comprehensive data on the state of North American sturgeon species and the various conservation efforts being undertaken to preserve and enhance their populations. If you require further information or assistance, feel free to ask.')]}}\n", + "---\n", + "{'supervisor': {'next': 'ResearchTeam'}}\n", + "---\n", + "{'ResearchTeam': {'messages': [HumanMessage(content='Based on the search results obtained, here is a summary of the information available regarding the conservation status, size, lifespan, and conservation efforts for North American sturgeon species:\\n\\n1. **Reconnecting Fragmented Sturgeon Populations in North American Rivers (Jager et al.)**:\\n - This paper discusses the fragmentation of large North American rivers by dams that interrupt the migrations of wide-ranging fishes like sturgeons. Efforts to reconnect habitats are viewed as crucial for protecting sturgeon species in U.S. rivers, as these species have lost between 5% and 60% of their historical ranges. [Learn more from the paper](https://www.semanticscholar.org/paper/Reconnecting-Fragmented-Sturgeon-Populations-in-Jager-Parsley/45414d7c86cd2d4f04b9490c7143f36b5158e729/figure/0).\\n\\n2. **North American Sturgeon and Paddlefish Society (NASPS)**:\\n - NASPS is dedicated to promoting the conservation and restoration of sturgeon species in North America by developing and advancing research pertaining to their biology, management, and utilization. [Visit NASPS](https://nasps-sturgeon.org/about/).\\n\\n3. **U.S. Fish and Wildlife Service on Lake Sturgeon and the Endangered Species Act**:\\n - The U.S. Fish and Wildlife Service determined that lake sturgeon do not require listing under the Endangered Species Act, thanks to ongoing management efforts such as fish stocking that have contributed to their population stability. [Read the press release](https://www.fws.gov/press-release/2024-04/collaborative-conservation-keeps-lake-sturgeon-endangered-list).\\n\\n4. **Conservation Genetics of Atlantic Sturgeon (USGS)**:\\n - The USGS is conducting research on the conservation genetics of Atlantic sturgeon, with a focus on genetic assignment testing and population genetic studies. This is in response to the rediscovery of populations that were previously thought to be extirpated, necessitating updated management strategies. [Learn more from USGS](https://www.usgs.gov/centers/eesc/science/conservation-genetics-atlantic-sturgeon).\\n\\n5. **Restoration Efforts Along the Ontonagon River and St. Louis River**:\\n - The Iron River National Fish Hatchery and Ashland Fish and Wildlife Conservation Office are working with partners to restore lake sturgeon in Michigan and Minnesota. Efforts include collecting larval sturgeon and milt for breeding and stocking programs. [Read the story](https://www.fws.gov/story/2024-04/restoring-reverence-along-lake-sturgeon).\\n\\nThese resources provide comprehensive data on the state of North American sturgeon species and the various conservation efforts being undertaken to preserve and enhance their populations. If you require further information or assistance, feel free to ask.')]}}\n", + "---\n", + "{'supervisor': {'next': 'ResearchTeam'}}\n", + "---\n", + "{'ResearchTeam': {'messages': [HumanMessage(content='Based on the search results obtained, here is a summary of the information available regarding the conservation status, size, lifespan, and conservation efforts for North American sturgeon species:\\n\\n1. **Reconnecting Fragmented Sturgeon Populations in North American Rivers (Jager et al.)**:\\n - This paper discusses the fragmentation of large North American rivers by dams that interrupt the migrations of wide-ranging fishes like sturgeons. Efforts to reconnect habitats are viewed as crucial for protecting sturgeon species in U.S. rivers, as these species have lost between 5% and 60% of their historical ranges. [Learn more from the paper](https://www.semanticscholar.org/paper/Reconnecting-Fragmented-Sturgeon-Populations-in-Jager-Parsley/45414d7c86cd2d4f04b9490c7143f36b5158e729/figure/0).\\n\\n2. **North American Sturgeon and Paddlefish Society (NASPS)**:\\n - NASPS is dedicated to promoting the conservation and restoration of sturgeon species in North America by developing and advancing research pertaining to their biology, management, and utilization. [Visit NASPS](https://nasps-sturgeon.org/about/).\\n\\n3. **U.S. Fish and Wildlife Service on Lake Sturgeon and the Endangered Species Act**:\\n - The U.S. Fish and Wildlife Service determined that lake sturgeon do not require listing under the Endangered Species Act, thanks to ongoing management efforts such as fish stocking that have contributed to their population stability. [Read the press release](https://www.fws.gov/press-release/2024-04/collaborative-conservation-keeps-lake-sturgeon-endangered-list).\\n\\n4. **Conservation Genetics of Atlantic Sturgeon (USGS)**:\\n - The USGS is conducting research on the conservation genetics of Atlantic sturgeon, with a focus on genetic assignment testing and population genetic studies. This is in response to the rediscovery of populations that were previously thought to be extirpated, necessitating updated management strategies. [Learn more from USGS](https://www.usgs.gov/centers/eesc/science/conservation-genetics-atlantic-sturgeon).\\n\\n5. **Restoration Efforts Along the Ontonagon River and St. Louis River**:\\n - The Iron River National Fish Hatchery and Ashland Fish and Wildlife Conservation Office are working with partners to restore lake sturgeon in Michigan and Minnesota. Efforts include collecting larval sturgeon and milt for breeding and stocking programs. [Read the story](https://www.fws.gov/story/2024-04/restoring-reverence-along-lake-sturgeon).\\n\\nThese resources provide comprehensive data on the state of North American sturgeon species and the various conservation efforts being undertaken to preserve and enhance their populations. If you require further information or assistance, feel free to ask.')]}}\n", + "---\n", + "{'supervisor': {'next': 'ResearchTeam'}}\n", + "---\n", + "{'ResearchTeam': {'messages': [HumanMessage(content='Based on the search results obtained, here is a summary of the information available regarding the conservation status, size, lifespan, and conservation efforts for North American sturgeon species:\\n\\n1. **Reconnecting Fragmented Sturgeon Populations in North American Rivers (Jager et al.)**:\\n - This paper discusses the fragmentation of large North American rivers by dams that interrupt the migrations of wide-ranging fishes like sturgeons. Efforts to reconnect habitats are viewed as crucial for protecting sturgeon species in U.S. rivers, as these species have lost between 5% and 60% of their historical ranges. [Learn more from the paper](https://www.semanticscholar.org/paper/Reconnecting-Fragmented-Sturgeon-Populations-in-Jager-Parsley/45414d7c86cd2d4f04b9490c7143f36b5158e729/figure/0).\\n\\n2. **North American Sturgeon and Paddlefish Society (NASPS)**:\\n - NASPS is dedicated to promoting the conservation and restoration of sturgeon species in North America by developing and advancing research pertaining to their biology, management, and utilization. [Visit NASPS](https://nasps-sturgeon.org/about/).\\n\\n3. **U.S. Fish and Wildlife Service on Lake Sturgeon and the Endangered Species Act**:\\n - The U.S. Fish and Wildlife Service determined that lake sturgeon do not require listing under the Endangered Species Act, thanks to ongoing management efforts such as fish stocking that have contributed to their population stability. [Read the press release](https://www.fws.gov/press-release/2024-04/collaborative-conservation-keeps-lake-sturgeon-endangered-list).\\n\\n4. **Conservation Genetics of Atlantic Sturgeon (USGS)**:\\n - The USGS is conducting research on the conservation genetics of Atlantic sturgeon, with a focus on genetic assignment testing and population genetic studies. This is in response to the rediscovery of populations that were previously thought to be extirpated, necessitating updated management strategies. [Learn more from USGS](https://www.usgs.gov/centers/eesc/science/conservation-genetics-atlantic-sturgeon).\\n\\n5. **Restoration Efforts Along the Ontonagon River and St. Louis River**:\\n - The Iron River National Fish Hatchery and Ashland Fish and Wildlife Conservation Office are working with partners to restore lake sturgeon in Michigan and Minnesota. Efforts include collecting larval sturgeon and milt for breeding and stocking programs. [Read the story](https://www.fws.gov/story/2024-04/restoring-reverence-along-lake-sturgeon).\\n\\nThese resources provide comprehensive data on the state of North American sturgeon species and the various conservation efforts being undertaken to preserve and enhance their populations. If you require further information or assistance, feel free to ask.')]}}\n", + "---\n", + "{'supervisor': {'next': 'ResearchTeam'}}\n", + "---\n", + "{'ResearchTeam': {'messages': [HumanMessage(content='Based on the search results obtained, here is a summary of the information available regarding the conservation status, size, lifespan, and conservation efforts for North American sturgeon species:\\n\\n1. **Reconnecting Fragmented Sturgeon Populations in North American Rivers (Jager et al.)**:\\n - This paper discusses the fragmentation of large North American rivers by dams that interrupt the migrations of wide-ranging fishes like sturgeons. Efforts to reconnect habitats are viewed as crucial for protecting sturgeon species in U.S. rivers, as these species have lost between 5% and 60% of their historical ranges. [Learn more from the paper](https://www.semanticscholar.org/paper/Reconnecting-Fragmented-Sturgeon-Populations-in-Jager-Parsley/45414d7c86cd2d4f04b9490c7143f36b5158e729/figure/0).\\n\\n2. **North American Sturgeon and Paddlefish Society (NASPS)**:\\n - NASPS is dedicated to promoting the conservation and restoration of sturgeon species in North America by developing and advancing research pertaining to their biology, management, and utilization. [Visit NASPS](https://nasps-sturgeon.org/about/).\\n\\n3. **U.S. Fish and Wildlife Service on Lake Sturgeon and the Endangered Species Act**:\\n - The U.S. Fish and Wildlife Service determined that lake sturgeon do not require listing under the Endangered Species Act, thanks to ongoing management efforts such as fish stocking that have contributed to their population stability. [Read the press release](https://www.fws.gov/press-release/2024-04/collaborative-conservation-keeps-lake-sturgeon-endangered-list).\\n\\n4. **Conservation Genetics of Atlantic Sturgeon (USGS)**:\\n - The USGS is conducting research on the conservation genetics of Atlantic sturgeon, with a focus on genetic assignment testing and population genetic studies. This is in response to the rediscovery of populations that were previously thought to be extirpated, necessitating updated management strategies. [Learn more from USGS](https://www.usgs.gov/centers/eesc/science/conservation-genetics-atlantic-sturgeon).\\n\\n5. **Restoration Efforts Along the Ontonagon River and St. Louis River**:\\n - The Iron River National Fish Hatchery and Ashland Fish and Wildlife Conservation Office are working with partners to restore lake sturgeon in Michigan and Minnesota. Efforts include collecting larval sturgeon and milt for breeding and stocking programs. [Read the story](https://www.fws.gov/story/2024-04/restoring-reverence-along-lake-sturgeon).\\n\\nThese resources provide comprehensive data on the state of North American sturgeon species and the various conservation efforts being undertaken to preserve and enhance their populations. If you require further information or assistance, feel free to ask.')]}}\n", + "---\n", + "{'supervisor': {'next': 'ResearchTeam'}}\n", + "---\n", + "{'ResearchTeam': {'messages': [HumanMessage(content='Based on the search results obtained, here is a summary of the information available regarding the conservation status, size, lifespan, and conservation efforts for North American sturgeon species:\\n\\n1. **Reconnecting Fragmented Sturgeon Populations in North American Rivers (Jager et al.)**:\\n - This paper discusses the fragmentation of large North American rivers by dams that interrupt the migrations of wide-ranging fishes like sturgeons. Efforts to reconnect habitats are viewed as crucial for protecting sturgeon species in U.S. rivers, as these species have lost between 5% and 60% of their historical ranges. [Learn more from the paper](https://www.semanticscholar.org/paper/Reconnecting-Fragmented-Sturgeon-Populations-in-Jager-Parsley/45414d7c86cd2d4f04b9490c7143f36b5158e729/figure/0).\\n\\n2. **North American Sturgeon and Paddlefish Society (NASPS)**:\\n - NASPS is dedicated to promoting the conservation and restoration of sturgeon species in North America by developing and advancing research pertaining to their biology, management, and utilization. [Visit NASPS](https://nasps-sturgeon.org/about/).\\n\\n3. **U.S. Fish and Wildlife Service on Lake Sturgeon and the Endangered Species Act**:\\n - The U.S. Fish and Wildlife Service determined that lake sturgeon do not require listing under the Endangered Species Act, thanks to ongoing management efforts such as fish stocking that have contributed to their population stability. [Read the press release](https://www.fws.gov/press-release/2024-04/collaborative-conservation-keeps-lake-sturgeon-endangered-list).\\n\\n4. **Conservation Genetics of Atlantic Sturgeon (USGS)**:\\n - The USGS is conducting research on the conservation genetics of Atlantic sturgeon, with a focus on genetic assignment testing and population genetic studies. This is in response to the rediscovery of populations that were previously thought to be extirpated, necessitating updated management strategies. [Learn more from USGS](https://www.usgs.gov/centers/eesc/science/conservation-genetics-atlantic-sturgeon).\\n\\n5. **Restoration Efforts Along the Ontonagon River and St. Louis River**:\\n - The Iron River National Fish Hatchery and Ashland Fish and Wildlife Conservation Office are working with partners to restore lake sturgeon in Michigan and Minnesota. Efforts include collecting larval sturgeon and milt for breeding and stocking programs. [Read the story](https://www.fws.gov/story/2024-04/restoring-reverence-along-lake-sturgeon).\\n\\nThese resources provide comprehensive data on the state of North American sturgeon species and the various conservation efforts being undertaken to preserve and enhance their populations. If you require further information or assistance, feel free to ask.')]}}\n", + "---\n", + "{'supervisor': {'next': 'ResearchTeam'}}\n", + "---\n", + "{'ResearchTeam': {'messages': [HumanMessage(content='Based on the search results obtained, here is a summary of the information available regarding the conservation status, size, lifespan, and conservation efforts for North American sturgeon species:\\n\\n1. **Reconnecting Fragmented Sturgeon Populations in North American Rivers (Jager et al.)**:\\n - This paper discusses the fragmentation of large North American rivers by dams that interrupt the migrations of wide-ranging fishes like sturgeons. Efforts to reconnect habitats are viewed as crucial for protecting sturgeon species in U.S. rivers, as these species have lost between 5% and 60% of their historical ranges. [Learn more from the paper](https://www.semanticscholar.org/paper/Reconnecting-Fragmented-Sturgeon-Populations-in-Jager-Parsley/45414d7c86cd2d4f04b9490c7143f36b5158e729/figure/0).\\n\\n2. **North American Sturgeon and Paddlefish Society (NASPS)**:\\n - NASPS is dedicated to promoting the conservation and restoration of sturgeon species in North America by developing and advancing research pertaining to their biology, management, and utilization. [Visit NASPS](https://nasps-sturgeon.org/about/).\\n\\n3. **U.S. Fish and Wildlife Service on Lake Sturgeon and the Endangered Species Act**:\\n - The U.S. Fish and Wildlife Service determined that lake sturgeon do not require listing under the Endangered Species Act, thanks to ongoing management efforts such as fish stocking that have contributed to their population stability. [Read the press release](https://www.fws.gov/press-release/2024-04/collaborative-conservation-keeps-lake-sturgeon-endangered-list).\\n\\n4. **Conservation Genetics of Atlantic Sturgeon (USGS)**:\\n - The USGS is conducting research on the conservation genetics of Atlantic sturgeon, with a focus on genetic assignment testing and population genetic studies. This is in response to the rediscovery of populations that were previously thought to be extirpated, necessitating updated management strategies. [Learn more from USGS](https://www.usgs.gov/centers/eesc/science/conservation-genetics-atlantic-sturgeon).\\n\\n5. **Restoration Efforts Along the Ontonagon River and St. Louis River**:\\n - The Iron River National Fish Hatchery and Ashland Fish and Wildlife Conservation Office are working with partners to restore lake sturgeon in Michigan and Minnesota. Efforts include collecting larval sturgeon and milt for breeding and stocking programs. [Read the story](https://www.fws.gov/story/2024-04/restoring-reverence-along-lake-sturgeon).\\n\\nThese resources provide comprehensive data on the state of North American sturgeon species and the various conservation efforts being undertaken to preserve and enhance their populations. If you require further information or assistance, feel free to ask.')]}}\n", + "---\n", + "{'supervisor': {'next': 'ResearchTeam'}}\n", + "---\n", + "{'ResearchTeam': {'messages': [HumanMessage(content='Based on the search results obtained, here is a summary of the information available regarding the conservation status, size, lifespan, and conservation efforts for North American sturgeon species:\\n\\n1. **Reconnecting Fragmented Sturgeon Populations in North American Rivers (Jager et al.)**:\\n - This paper discusses the fragmentation of large North American rivers by dams that interrupt the migrations of wide-ranging fishes like sturgeons. Efforts to reconnect habitats are viewed as crucial for protecting sturgeon species in U.S. rivers, as these species have lost between 5% and 60% of their historical ranges. [Learn more from the paper](https://www.semanticscholar.org/paper/Reconnecting-Fragmented-Sturgeon-Populations-in-Jager-Parsley/45414d7c86cd2d4f04b9490c7143f36b5158e729/figure/0).\\n\\n2. **North American Sturgeon and Paddlefish Society (NASPS)**:\\n - NASPS is dedicated to promoting the conservation and restoration of sturgeon species in North America by developing and advancing research pertaining to their biology, management, and utilization. [Visit NASPS](https://nasps-sturgeon.org/about/).\\n\\n3. **U.S. Fish and Wildlife Service on Lake Sturgeon and the Endangered Species Act**:\\n - The U.S. Fish and Wildlife Service determined that lake sturgeon do not require listing under the Endangered Species Act, thanks to ongoing management efforts such as fish stocking that have contributed to their population stability. [Read the press release](https://www.fws.gov/press-release/2024-04/collaborative-conservation-keeps-lake-sturgeon-endangered-list).\\n\\n4. **Conservation Genetics of Atlantic Sturgeon (USGS)**:\\n - The USGS is conducting research on the conservation genetics of Atlantic sturgeon, with a focus on genetic assignment testing and population genetic studies. This is in response to the rediscovery of populations that were previously thought to be extirpated, necessitating updated management strategies. [Learn more from USGS](https://www.usgs.gov/centers/eesc/science/conservation-genetics-atlantic-sturgeon).\\n\\n5. **Restoration Efforts Along the Ontonagon River and St. Louis River**:\\n - The Iron River National Fish Hatchery and Ashland Fish and Wildlife Conservation Office are working with partners to restore lake sturgeon in Michigan and Minnesota. Efforts include collecting larval sturgeon and milt for breeding and stocking programs. [Read the story](https://www.fws.gov/story/2024-04/restoring-reverence-along-lake-sturgeon).\\n\\nThese resources provide comprehensive data on the state of North American sturgeon species and the various conservation efforts being undertaken to preserve and enhance their populations. If you require further information or assistance, feel free to ask.')]}}\n", + "---\n", + "{'supervisor': {'next': 'ResearchTeam'}}\n", + "---\n", + "{'ResearchTeam': {'messages': [HumanMessage(content='Based on the search results obtained, here is a summary of the information available regarding the conservation status, size, lifespan, and conservation efforts for North American sturgeon species:\\n\\n**Conservation Status of North American Sturgeon:**\\n- Lake sturgeon has origins dating back at least 150 million years and is one of the largest freshwater fish in North America. They are not currently listed under the Endangered Species Act, thanks to conservation efforts such as fish stocking ([U.S. Fish and Wildlife Service Press Release](https://www.fws.gov/press-release/2024-04/collaborative-conservation-keeps-lake-sturgeon-endangered-list)).\\n- The North American Sturgeon and Paddlefish Society (NASPS) is dedicated to promoting the conservation and restoration of sturgeon species in North America by developing research on their biology, management, and utilization ([NASPS About](https://nasps-sturgeon.org/about/)).\\n- All 26 remaining sturgeon species are now threatened with extinction according to the IUCN ([WWF News](https://wwf.panda.org/wwf_news/?6080466/sturgeon-slipping-towards-extinction)).\\n- The USGS is conducting research on the conservation genetics of Atlantic sturgeon to ensure appropriate management strategies can be developed ([USGS Conservation Genetics](https://www.usgs.gov/centers/eesc/science/conservation-genetics-atlantic-sturgeon)).\\n\\n**Size and Lifespan of North American Sturgeon Species:**\\n- The white sturgeon (Acipenser transmontanus), also known as the Pacific sturgeon, can grow up to 20 feet long and weigh up to 1,800 pounds. It is the largest freshwater fish in North America ([American Oceans](https://www.americanoceans.org/facts/types-of-sturgeon/)).\\n- The shortnose sturgeon (Acipenser brevirostrum) can grow up to 4 feet long and weigh up to 50 pounds. It inhabits the eastern coast of North America ([American Oceans](https://www.americanoceans.org/facts/types-of-sturgeon/)).\\n- The green sturgeon (Acipenser medirostris) can reach up to 7 feet long and weigh up to 350 pounds ([American Oceans](https://www.americanoceans.org/facts/types-of-sturgeon/)).\\n\\n**Conservation Efforts for North American Sturgeon Species:**\\n- Long-term conservation efforts in North America have helped to stabilize and increase some sturgeon populations, such as the white sturgeon in the Fraser River in the U.S. ([WWF News](https://wwf.panda.org/wwf_news/?6080466/sturgeon-slipping-towards-extinction)).\\n- The NASPS works to foster the conservation of sturgeon species and restoration of sturgeon stocks in North America ([NASPS About](https://nasps-sturgeon.org/about/)).\\n- The collaborative conservation efforts, including fish stocking, have contributed to the conservation and resiliency of lake sturgeon ([U.S. Fish and Wildlife Service Press Release](https://www.fws.gov/press-release/2024-04/collaborative-conservation-keeps-lake-sturgeon-endangered-list)).\\n- Work in the Chesapeake Bay includes identifying and protecting habitat used by Atlantic sturgeon for spawning, seeking to minimize vessel strikes, and educating students about these fish ([NOAA Fisheries](https://www.fisheries.noaa.gov/feature-story/supporting-endangered-atlantic-sturgeon-chesapeake-bay)).\\n\\nThese resources provide comprehensive data on the state of North American sturgeon species and the various conservation efforts being undertaken to preserve and enhance their populations. If you require further information or assistance, feel free to ask.', name='Search')]}}\n", + "---\n", + "{'supervisor': {'next': 'ResearchTeam'}}\n", + "---\n", + "{'ResearchTeam': {'messages': [HumanMessage(content='Based on the search results obtained, here is a summary of the information available regarding the conservation status, size, lifespan, and conservation efforts for North American sturgeon species:\\n\\n**Conservation Status of North American Sturgeon:**\\n- Lake sturgeon has origins dating back at least 150 million years and is one of the largest freshwater fish in North America. They are not currently listed under the Endangered Species Act, thanks to conservation efforts such as fish stocking ([U.S. Fish and Wildlife Service Press Release](https://www.fws.gov/press-release/2024-04/collaborative-conservation-keeps-lake-sturgeon-endangered-list)).\\n- The North American Sturgeon and Paddlefish Society (NASPS) is dedicated to promoting the conservation and restoration of sturgeon species in North America by developing research on their biology, management, and utilization ([NASPS About](https://nasps-sturgeon.org/about/)).\\n- All 26 remaining sturgeon species are now threatened with extinction according to the IUCN ([WWF News](https://wwf.panda.org/wwf_news/?6080466/sturgeon-slipping-towards-extinction)).\\n- The USGS is conducting research on the conservation genetics of Atlantic sturgeon to ensure appropriate management strategies can be developed ([USGS Conservation Genetics](https://www.usgs.gov/centers/eesc/science/conservation-genetics-atlantic-sturgeon)).\\n\\n**Size and Lifespan of North American Sturgeon Species:**\\n- The white sturgeon (Acipenser transmontanus), also known as the Pacific sturgeon, can grow up to 20 feet long and weigh up to 1,800 pounds. It is the largest freshwater fish in North America ([American Oceans](https://www.americanoceans.org/facts/types-of-sturgeon/)).\\n- The shortnose sturgeon (Acipenser brevirostrum) can grow up to 4 feet long and weigh up to 50 pounds. It inhabits the eastern coast of North America ([American Oceans](https://www.americanoceans.org/facts/types-of-sturgeon/)).\\n- The green sturgeon (Acipenser medirostris) can reach up to 7 feet long and weigh up to 350 pounds ([American Oceans](https://www.americanoceans.org/facts/types-of-sturgeon/)).\\n\\n**Conservation Efforts for North American Sturgeon Species:**\\n- Long-term conservation efforts in North America have helped to stabilize and increase some sturgeon populations, such as the white sturgeon in the Fraser River in the U.S. ([WWF News](https://wwf.panda.org/wwf_news/?6080466/sturgeon-slipping-towards-extinction)).\\n- The NASPS works to foster the conservation of sturgeon species and restoration of sturgeon stocks in North America ([NASPS About](https://nasps-sturgeon.org/about/)).\\n- The collaborative conservation efforts, including fish stocking, have contributed to the conservation and resiliency of lake sturgeon ([U.S. Fish and Wildlife Service Press Release](https://www.fws.gov/press-release/2024-04/collaborative-conservation-keeps-lake-sturgeon-endangered-list)).\\n- Work in the Chesapeake Bay includes identifying and protecting habitat used by Atlantic sturgeon for spawning, seeking to minimize vessel strikes, and educating students about these fish ([NOAA Fisheries](https://www.fisheries.noaa.gov/feature-story/supporting-endangered-atlantic-sturgeon-chesapeake-bay)).\\n\\nThese resources provide comprehensive data on the state of North American sturgeon species and the various conservation efforts being undertaken to preserve and enhance their populations. If you require further information or assistance, feel free to ask.')]}}\n", + "---\n", + "{'supervisor': {'next': 'ResearchTeam'}}\n", + "---\n", + "{'ResearchTeam': {'messages': [HumanMessage(content='Based on the search results obtained, here is a summary of the information available regarding the conservation status, size, lifespan, and conservation efforts for North American sturgeon species:\\n\\n**Conservation Status of North American Sturgeon:**\\n- Lake sturgeon has origins dating back at least 150 million years and is one of the largest freshwater fish in North America. They are not currently listed under the Endangered Species Act, thanks to conservation efforts such as fish stocking ([U.S. Fish and Wildlife Service Press Release](https://www.fws.gov/press-release/2024-04/collaborative-conservation-keeps-lake-sturgeon-endangered-list)).\\n- The North American Sturgeon and Paddlefish Society (NASPS) is dedicated to promoting the conservation and restoration of sturgeon species in North America by developing research on their biology, management, and utilization ([NASPS About](https://nasps-sturgeon.org/about/)).\\n- All 26 remaining sturgeon species are now threatened with extinction according to the IUCN ([WWF News](https://wwf.panda.org/wwf_news/?6080466/sturgeon-slipping-towards-extinction)).\\n- The USGS is conducting research on the conservation genetics of Atlantic sturgeon to ensure appropriate management strategies can be developed ([USGS Conservation Genetics](https://www.usgs.gov/centers/eesc/science/conservation-genetics-atlantic-sturgeon)).\\n\\n**Size and Lifespan of North American Sturgeon Species:**\\n- The white sturgeon (Acipenser transmontanus), also known as the Pacific sturgeon, can grow up to 20 feet long and weigh up to 1,800 pounds. It is the largest freshwater fish in North America ([American Oceans](https://www.americanoceans.org/facts/types-of-sturgeon/)).\\n- The shortnose sturgeon (Acipenser brevirostrum) can grow up to 4 feet long and weigh up to 50 pounds. It inhabits the eastern coast of North America ([American Oceans](https://www.americanoceans.org/facts/types-of-sturgeon/)).\\n- The green sturgeon (Acipenser medirostris) can reach up to 7 feet long and weigh up to 350 pounds ([American Oceans](https://www.americanoceans.org/facts/types-of-sturgeon/)).\\n\\n**Conservation Efforts for North American Sturgeon Species:**\\n- Long-term conservation efforts in North America have helped to stabilize and increase some sturgeon populations, such as the white sturgeon in the Fraser River in the U.S. ([WWF News](https://wwf.panda.org/wwf_news/?6080466/sturgeon-slipping-towards-extinction)).\\n- The NASPS works to foster the conservation of sturgeon species and restoration of sturgeon stocks in North America ([NASPS About](https://nasps-sturgeon.org/about/)).\\n- The collaborative conservation efforts, including fish stocking, have contributed to the conservation and resiliency of lake sturgeon ([U.S. Fish and Wildlife Service Press Release](https://www.fws.gov/press-release/2024-04/collaborative-conservation-keeps-lake-sturgeon-endangered-list)).\\n- Work in the Chesapeake Bay includes identifying and protecting habitat used by Atlantic sturgeon for spawning, seeking to minimize vessel strikes, and educating students about these fish ([NOAA Fisheries](https://www.fisheries.noaa.gov/feature-story/supporting-endangered-atlantic-sturgeon-chesapeake-bay)).\\n\\nThese resources provide comprehensive data on the state of North American sturgeon species and the various conservation efforts being undertaken to preserve and enhance their populations. If you require further information or assistance, feel free to ask.')]}}\n", + "---\n", + "{'supervisor': {'next': 'PaperWritingTeam'}}\n", + "---\n", + "{'PaperWritingTeam': {'messages': [HumanMessage(content='The outline for North American sturgeon species, including their conservation status, size, lifespan, and conservation efforts, has been successfully created and saved to a file named \"North_American_Sturgeon_Overview\". If you need to review the document or require additional information, please let me know.', name='NoteTaker')]}}\n", + "---\n", + "{'supervisor': {'next': 'PaperWritingTeam'}}\n", + "---\n", + "{'PaperWritingTeam': {'messages': [HumanMessage(content='The document \"North_American_Sturgeon_Overview\" contains the following outline:\\n\\n1. Conservation Status of North American Sturgeon\\n2. Size and Lifespan of North American Sturgeon Species\\n3. Conservation Efforts for North American Sturgeon Species\\n\\nIf you need more detailed information on any of these topics or have any other requests related to the document, feel free to let me know!', name='DocWriter')]}}\n", + "---\n", + "{'supervisor': {'next': 'ResearchTeam'}}\n", + "---\n", + "{'ResearchTeam': {'messages': [HumanMessage(content='The document \"North_American_Sturgeon_Overview\" contains the following outline:\\n\\n1. Conservation Status of North American Sturgeon\\n2. Size and Lifespan of North American Sturgeon Species\\n3. Conservation Efforts for North American Sturgeon Species\\n\\nIf you need more detailed information on any of these topics or have any other requests related to the document, feel free to let me know!')]}}\n", + "---\n", + "{'supervisor': {'next': 'ResearchTeam'}}\n", + "---\n", + "{'ResearchTeam': {'messages': [HumanMessage(content='The document \"North_American_Sturgeon_Overview\" contains the following outline:\\n\\n1. Conservation Status of North American Sturgeon\\n2. Size and Lifespan of North American Sturgeon Species\\n3. Conservation Efforts for North American Sturgeon Species\\n\\nIf you need more detailed information on any of these topics or have any other requests related to the document, feel free to let me know!')]}}\n", + "---\n", + "{'supervisor': {'next': 'ResearchTeam'}}\n", + "---\n", + "{'ResearchTeam': {'messages': [HumanMessage(content='The document \"North_American_Sturgeon_Overview\" contains the following outline:\\n\\n1. Conservation Status of North American Sturgeon\\n2. Size and Lifespan of North American Sturgeon Species\\n3. Conservation Efforts for North American Sturgeon Species\\n\\nIf you need more detailed information on any of these topics or have any other requests related to the document, feel free to let me know!')]}}\n", + "---\n", + "{'supervisor': {'next': 'PaperWritingTeam'}}\n", + "---\n", + "{'PaperWritingTeam': {'messages': [HumanMessage(content='It seems that the document \"North_American_Sturgeon_Overview\" contains exactly the outline provided earlier, with three main topics:\\n\\n1. Conservation Status of North American Sturgeon\\n2. Size and Lifespan of North American Sturgeon Species\\n3. Conservation Efforts for North American Sturgeon Species\\n\\nIf you would like to delve into any of these topics or have another request regarding the document, please let me know how I can assist you further!', name='NoteTaker')]}}\n", + "---\n", + "{'supervisor': {'next': 'ResearchTeam'}}\n", + "---\n", + "{'ResearchTeam': {'messages': [HumanMessage(content='It seems that the document \"North_American_Sturgeon_Overview\" contains exactly the outline provided earlier, with three main topics:\\n\\n1. Conservation Status of North American Sturgeon\\n2. Size and Lifespan of North American Sturgeon Species\\n3. Conservation Efforts for North American Sturgeon Species\\n\\nIf you would like to delve into any of these topics or have another request regarding the document, please let me know how I can assist you further!')]}}\n", + "---\n", + "{'supervisor': {'next': 'ResearchTeam'}}\n", + "---\n", + "{'ResearchTeam': {'messages': [HumanMessage(content='It seems that the document \"North_American_Sturgeon_Overview\" contains exactly the outline provided earlier, with three main topics:\\n\\n1. Conservation Status of North American Sturgeon\\n2. Size and Lifespan of North American Sturgeon Species\\n3. Conservation Efforts for North American Sturgeon Species\\n\\nIf you would like to delve into any of these topics or have another request regarding the document, please let me know how I can assist you further!')]}}\n", + "---\n", + "{'supervisor': {'next': 'PaperWritingTeam'}}\n", + "---\n", + "{'PaperWritingTeam': {'messages': [HumanMessage(content='The document \"North_American_Sturgeon_Overview\" indeed contains the three main topics outlined earlier:\\n\\n1. Conservation Status of North American Sturgeon\\n2. Size and Lifespan of North American Sturgeon Species\\n3. Conservation Efforts for North American Sturgeon Species\\n\\nIf you need detailed information on any of these topics or have another specific request related to the document, please let me know, and I can provide the information or take further action as needed.', name='NoteTaker')]}}\n", + "---\n", + "{'supervisor': {'next': 'ResearchTeam'}}\n", + "---\n", + "{'ResearchTeam': {'messages': [HumanMessage(content='The document \"North_American_Sturgeon_Overview\" indeed contains the three main topics outlined earlier:\\n\\n1. Conservation Status of North American Sturgeon\\n2. Size and Lifespan of North American Sturgeon Species\\n3. Conservation Efforts for North American Sturgeon Species\\n\\nIf you need detailed information on any of these topics or have another specific request related to the document, please let me know, and I can provide the information or take further action as needed.')]}}\n", + "---\n", + "{'supervisor': {'next': 'FINISH'}}\n", + "---\n" + ] + } + ], + "source": [ + "for s in super_graph.stream(\n", + " {\n", + " \"messages\": [\n", + " HumanMessage(\n", + " content=\"Write a brief research report on the North American sturgeon. Include a chart.\"\n", + " )\n", + " ],\n", + " },\n", + " {\"recursion_limit\": 150},\n", + "):\n", + " if \"__end__\" not in s:\n", + " print(s)\n", + " print(\"---\")" + ] } ], "metadata": { @@ -406,7 +1096,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.11.1" + "version": "3.11.9" } }, "nbformat": 4, diff --git a/examples/multi_agent/multi-agent-collaboration.ipynb b/examples/multi_agent/multi-agent-collaboration.ipynb index 5c2c89284..c660fd296 100644 --- a/examples/multi_agent/multi-agent-collaboration.ipynb +++ b/examples/multi_agent/multi-agent-collaboration.ipynb @@ -118,7 +118,7 @@ "id": "71b790ca-9cef-4b22-b469-4b1d5d8424d6", "metadata": {}, "outputs": [], - "source": ["import functools\n\nfrom langchain_core.messages import AIMessage\n\n\n# Helper function to create a node for a given agent\ndef agent_node(state, agent, name):\n result = agent.invoke(state)\n # We convert the agent output into a format that is suitable to append to the global state\n if isinstance(result, ToolMessage):\n pass\n else:\n result = AIMessage(**result.dict(exclude={\"type\", \"name\"}), name=name)\n return {\n \"messages\": [result],\n # Since we have a strict workflow, we can\n # track the sender so we know who to pass to next.\n \"sender\": name,\n }\n\n\nllm = ChatOpenAI(model=\"gpt-4-1106-preview\")\n\n# Research agent and node\nresearch_agent = create_agent(\n llm,\n [tavily_tool],\n system_message=\"You should provide accurate data for the chart_generator to use.\",\n)\nresearch_node = functools.partial(agent_node, agent=research_agent, name=\"Researcher\")\n\n# chart_generator\nchart_agent = create_agent(\n llm,\n [python_repl],\n system_message=\"Any charts you display will be visible by the user.\",\n)\nchart_node = functools.partial(agent_node, agent=chart_agent, name=\"chart_generator\")"] + "source": ["import functools\n\nfrom langchain_core.messages import AIMessage\n\n\n# Helper function to create a node for a given agent\ndef agent_node(state, agent, name):\n result = agent.invoke(state)\n # We convert the agent output into a format that is suitable to append to the global state\n if isinstance(result, ToolMessage):\n pass\n else:\n result = AIMessage(**result.dict(exclude={\"type\", \"name\"}), name=name)\n return {\n \"messages\": [result],\n # Since we have a strict workflow, we can\n # track the sender so we know who to pass to next.\n \"sender\": name,\n }\n\n\nllm = ChatOpenAI(model=\"gpt-4o\")\n\n# Research agent and node\nresearch_agent = create_agent(\n llm,\n [tavily_tool],\n system_message=\"You should provide accurate data for the chart_generator to use.\",\n)\nresearch_node = functools.partial(agent_node, agent=research_agent, name=\"Researcher\")\n\n# chart_generator\nchart_agent = create_agent(\n llm,\n [python_repl],\n system_message=\"Any charts you display will be visible by the user.\",\n)\nchart_node = functools.partial(agent_node, agent=chart_agent, name=\"chart_generator\")"] }, { "cell_type": "markdown", @@ -213,45 +213,45 @@ "name": "stdout", "output_type": "stream", "text": [ - "{'Researcher': {'messages': [AIMessage(content='', additional_kwargs={'tool_calls': [{'id': 'call_3zDlnDMUkWEJxnHASo59doCL', 'function': {'arguments': '{\"query\":\"UK GDP 2018 to 2023\"}', 'name': 'tavily_search_results_json'}, 'type': 'function'}]}, response_metadata={'token_usage': {'completion_tokens': 26, 'prompt_tokens': 221, 'total_tokens': 247}, 'model_name': 'gpt-4-1106-preview', 'system_fingerprint': None, 'finish_reason': 'tool_calls', 'logprobs': None}, name='Researcher', id='run-ac6640c6-2bb4-478f-b3c4-eabf98cf4900-0', tool_calls=[{'name': 'tavily_search_results_json', 'args': {'query': 'UK GDP 2018 to 2023'}, 'id': 'call_3zDlnDMUkWEJxnHASo59doCL'}])], 'sender': 'Researcher'}}\n", + "{'Researcher': {'messages': [AIMessage(content='', additional_kwargs={'tool_calls': [{'id': 'call_3zDlnDMUkWEJxnHASo59doCL', 'function': {'arguments': '{\"query\":\"UK GDP 2018 to 2023\"}', 'name': 'tavily_search_results_json'}, 'type': 'function'}]}, response_metadata={'token_usage': {'completion_tokens': 26, 'prompt_tokens': 221, 'total_tokens': 247}, 'model_name': 'gpt-4o', 'system_fingerprint': None, 'finish_reason': 'tool_calls', 'logprobs': None}, name='Researcher', id='run-ac6640c6-2bb4-478f-b3c4-eabf98cf4900-0', tool_calls=[{'name': 'tavily_search_results_json', 'args': {'query': 'UK GDP 2018 to 2023'}, 'id': 'call_3zDlnDMUkWEJxnHASo59doCL'}])], 'sender': 'Researcher'}}\n", "----\n", "{'call_tool': {'messages': [ToolMessage(content='[{\"url\": \"https://www.ons.gov.uk/economy/grossdomesticproductgdp/timeseries/ihyp/pn2\", \"content\": \"Preliminary estimate of GDP time series (PGDP), released on 27 April 2018\\\\nPublications that use this data\\\\nContact details for this data\\\\nFooter links\\\\nHelp\\\\nAbout ONS\\\\nConnect with us\\\\nAll content is available under the Open Government Licence v3.0, except where otherwise stated Year on Year growth: CVM SA %\\\\nDownload full time series as:\\\\nDownload filtered time series as:\\\\nTable\\\\nNotes\\\\nFollowing a quality review it has been identified that the methodology used to estimate elements of purchased software within gross fixed capital formation (GFCF) has led to some double counting from 1997 onwards. GDP quarterly national accounts time series (QNA), released on 22 December 2023\\\\nIHYP: UK Economic Accounts time series (UKEA), released on 22 December 2023\\\\nIHYP: GDP first quarterly estimate time series\\\\n(PN2), released on 10 November 2023\\\\nIHYP: Year on Year growth: CVM SA %\\\\nSource dataset: GDP first quarterly estimate time series (PN2)\\\\nContact: Niamh McAuley\\\\nRelease date: 10 November 2023\\\\nView previous versions\\\\n %\\\\nFilters\\\\nCustom time period\\\\nChart\\\\nDownload this time seriesGross Domestic Product:\"}, {\"url\": \"https://www.ons.gov.uk/economy/grossdomesticproductgdp\", \"content\": \"Quarter on Quarter growth: CVM SA %\\\\nChained Volume Measures (CVM)\\\\nGross Domestic Product: q-on-q4 growth rate CVM SA %\\\\nChained Volume Measures (CVM)\\\\nGross Domestic Product at market prices: Current price: Seasonally adjusted \\\\u00a3m\\\\nCurrent Prices (CP)\\\\nGross Domestic Product: quarter on quarter growth rate: CP SA %\\\\nCurrent Prices (CP)\\\\nGross Domestic Product: q-on-q4 growth quarter growth: CP SA %\\\\nCurrent Prices (CP)\\\\nDatasets related to Gross Domestic Product (GDP)\\\\n A roundup of the latest data and trends on the economy, business and jobs\\\\nTime series related to Gross Domestic Product (GDP)\\\\nGross Domestic Product: chained volume measures: Seasonally adjusted \\\\u00a3m\\\\nChained Volume Measures (CVM)\\\\nGross Domestic Product: Hide\\\\nData and analysis from Census 2021\\\\nGross Domestic Product (GDP)\\\\nGross domestic product (GDP) estimates as the main measure of UK economic growth based on the value of goods and services produced during a given period. Contains current and constant price data on the value of goods and services to indicate the economic performance of the UK.\\\\nEstimates of short-term indicators of investment in non-financial assets; business investment and asset and sector breakdowns of total gross fixed capital formation.\\\\n Monthly gross domestic product by gross value added\\\\nThe gross value added (GVA) tables showing the monthly and annual growths and indices as published within the monthly gross domestic product (GDP) statistical bulletin.\\\\n\"}, {\"url\": \"https://www.macrotrends.net/global-metrics/countries/GBR/united-kingdom/gdp-gross-domestic-product\", \"content\": \"U.K. gdp for 2021 was $3,141.51B, a 16.45% increase from 2020. U.K. gdp for 2020 was $2,697.81B, a 5.39% decline from 2019. U.K. gdp for 2019 was $2,851.41B, a 0.69% decline from 2018. GDP at purchaser\\'s prices is the sum of gross value added by all resident producers in the economy plus any product taxes and minus any subsidies not included in ...\"}, {\"url\": \"https://www.statista.com/statistics/281744/gdp-of-the-united-kingdom/\", \"content\": \"Industry Overview\\\\nDigital & Trend reports\\\\nOverview and forecasts on trending topics\\\\nIndustry & Market reports\\\\nIndustry and market insights and forecasts\\\\nCompanies & Products reports\\\\nKey figures and rankings about companies and products\\\\nConsumer & Brand reports\\\\nConsumer and brand insights and preferences in various industries\\\\nPolitics & Society reports\\\\nDetailed information about political and social topics\\\\nCountry & Region reports\\\\nAll key figures about countries and regions\\\\nMarket forecast and expert KPIs for 1000+ markets in 190+ countries & territories\\\\nInsights on consumer attitudes and behavior worldwide\\\\nBusiness information on 100m+ public and private companies\\\\nExplore Company Insights\\\\nDetailed information for 39,000+ online stores and marketplaces\\\\nDirectly accessible data for 170 industries from 150+ countries\\\\nand over 1\\\\u00a0Mio. facts.\\\\n Transforming data into design:\\\\nStatista Content & Design\\\\nStrategy and business building for the data-driven economy:\\\\nGDP of the UK 1948-2022\\\\nUK economy expected to shrink in 2023\\\\nHow big is the UK economy compared to others?\\\\nGross domestic product of the United Kingdom from 1948 to 2022\\\\n(in million GBP)\\\\nAdditional Information\\\\nShow sources information\\\\nShow publisher information\\\\nUse Ask Statista Research Service\\\\nDecember 2023\\\\nUnited Kingdom\\\\n1948 to 2022\\\\n*GDP is displayed in real terms (seasonally adjusted chained volume measure with 2019 as the reference year)\\\\n Statistics on\\\\n\\\\\"\\\\nEconomy of the UK\\\\n\\\\\"\\\\nOther statistics that may interest you Economy of the UK\\\\nGross domestic product\\\\nLabor Market\\\\nInflation\\\\nGovernment finances\\\\nBusiness Enterprise\\\\nFurther related statistics\\\\nFurther Content: You might find this interesting as well\\\\nStatistics\\\\nTopics Other statistics on the topicThe UK economy\\\\nEconomy\\\\nRPI annual inflation rate UK 2000-2028\\\\nEconomy\\\\nCPI annual inflation rate UK 2000-2028\\\\nEconomy\\\\nAverage annual earnings for full-time employees in the UK 1999-2023\\\\nEconomy\\\\nInflation rate in the UK 1989-2023\\\\nYou only have access to basic statistics.\\\\n Customized Research & Analysis projects:\\\\nGet quick analyses with our professional research service\\\\nThe best of the best: the portal for top lists & rankings:\\\\n\"}, {\"url\": \"https://www.statista.com/topics/3795/gdp-of-the-uk/\", \"content\": \"Monthly growth of gross domestic product in the United Kingdom from January 2019 to November 2023\\\\nContribution to GDP growth in the UK 2023, by sector\\\\nContribution to gross domestic product growth in the United Kingdom in January 2023, by sector\\\\nGDP growth rate in the UK 1999-2021, by country\\\\nAnnual growth rates of gross domestic product in the United Kingdom from 1999 to 2021, by country\\\\nGDP growth rate in the UK 2021, by region\\\\nAnnual growth rates of gross domestic product in the United Kingdom in 2021, by region\\\\nGDP growth of Scotland 2021, by local area\\\\nAnnual growth rates of gross domestic product in Scotland in 2021, by local (ITL 3) area\\\\nGDP growth of Wales 2021, by local area\\\\nAnnual growth rates of gross domestic product in Wales in 2021, by local (ITL 3) area\\\\nGDP growth of Northern Ireland 2021, by local area\\\\nAnnual growth rates of gross domestic product in Northern Ireland in 2021, by local (ITL 3) area\\\\nGDP per capita\\\\nGDP per capita\\\\nGDP per capita in the UK 1955-2022\\\\nGross domestic product per capita in the United Kingdom from 1955 to 2022 (in GBP)\\\\nAnnual GDP per capita growth in the UK 1956-2022\\\\nAnnual GDP per capita growth in the United Kingdom from 1956 to 2022\\\\nQuarterly GDP per capita in the UK 2019-2023\\\\nQuarterly GDP per capita in the United Kingdom from 1st quarter 2019 to 3rd quarter 2023 (in GBP)\\\\nQuarterly GDP per capita growth in the UK 2019-2023\\\\nQuarterly GDP per capita growth in the United Kingdom from 1st quarter 2019 to 3rd quarter 2023 (in GBP)\\\\nGDP per capita of the UK 1999-2021, by country\\\\nGross domestic product per capita of the United Kingdom from 1999 to 2021, by country (in GBP)\\\\nGDP per capita of the UK 2021, by region\\\\nGross domestic product per capita of the United Kingdom in 2021, by region (in GBP)\\\\nGlobal Comparisons\\\\nGlobal Comparisons\\\\nCountries with the largest gross domestic product (GDP) 2022\\\\n Monthly GDP of the UK 2019-2023\\\\nMonthly index of gross domestic product in the United Kingdom from January 2019 to November 2023 (2019=100)\\\\nGVA of the UK 2022, by sector\\\\nGross value added of the United Kingdom in 2022, by industry sector (in million GBP)\\\\nGDP of the UK 2021, by country\\\\nGross domestic product of the United Kingdom in 2021, by country (in million GBP)\\\\nGDP of the UK 2021, by region\\\\nGross domestic product of the United Kingdom in 2021, by region (in million GBP)\\\\nGDP of Scotland 2021, by local area\\\\nGross domestic product of Scotland in 2021, by local (ITL 3) area (in million GBP)\\\\nGDP of Wales 2021, by local area\\\\nGross domestic product of Wales in 2021, by local (ITL 3) area (in million GBP)\\\\nGDP of Northern Ireland 2021, by local area\\\\nGross domestic product of Northern Ireland in 2021, by local (ITL 3) area (in million GBP)\\\\nGDP growth\\\\nGDP growth\\\\nGDP growth forecast for the UK 2000-2028\\\\nForecasted annual growth of gross domestic product in the United Kingdom from 2000 to 2028\\\\nAnnual GDP growth in the UK 1949-2022\\\\nAnnual growth of gross domestic product in the United Kingdom from 1949 to 2022\\\\nQuarterly GDP growth of the UK 2019-2023\\\\nQuarterly growth of gross domestic product in the United Kingdom from 1st quarter 2019 to 3rd quarter 2023\\\\nMonthly GDP growth of the UK 2019-2023\\\\n Transforming data into design:\\\\nStatista Content & Design\\\\nStrategy and business building for the data-driven economy:\\\\nUK GDP - Statistics & Facts\\\\nUK economy expected to shrink in 2023\\\\nCharacteristics of UK GDP\\\\nKey insights\\\\nDetailed statistics\\\\nGDP of the UK 1948-2022\\\\nDetailed statistics\\\\nAnnual GDP growth in the UK 1949-2022\\\\nDetailed statistics\\\\nGDP per capita in the UK 1955-2022\\\\nEditor\\\\u2019s Picks\\\\nCurrent statistics on this topic\\\\nCurrent statistics on this topic\\\\nKey Economic Indicators\\\\nMonthly GDP growth of the UK 2019-2023\\\\nKey Economic Indicators\\\\nMonthly GDP of the UK 2019-2023\\\\nKey Economic Indicators\\\\nContribution to GDP growth in the UK 2023, by sector\\\\nRelated topics\\\\nRecommended\\\\nRecommended statistics\\\\nGDP\\\\nGDP\\\\nGDP of the UK 1948-2022\\\\nGross domestic product of the United Kingdom from 1948 to 2022 (in million GBP)\\\\nQuarterly GDP of the UK 2019-2023\\\\nQuarterly gross domestic product in the United Kingdom from 1st quarter 2019 to 3rd quarter 2023 (in million GBP)\\\\n The 20 countries with the largest gross domestic product (GDP) in 2022 (in billion U.S. dollars)\\\\nGDP of European countries in 2022\\\\nGross domestic product at current market prices of selected European countries in 2022 (in million euros)\\\\nReal GDP growth rates in Europe 2023\\\\nAnnual real gross domestic product (GDP) growth rate in European countries in 2023\\\\nGross domestic product (GDP) of Europe\\'s largest economies 1980-2028\\\\nGross domestic product (GDP) at current prices of Europe\\'s largest economies from 1980 to 2028 (in billion U.S dollars)\\\\nUnited Kingdom\\'s share of global gross domestic product (GDP) 2028\\\\nUnited Kingdom (UK): Share of global gross domestic product (GDP) adjusted for Purchasing Power Parity (PPP) from 2018 to 2028\\\\nRelated topics\\\\nRecommended\\\\nReport on the topic\\\\nKey figures\\\\nThe most important key figures provide you with a compact summary of the topic of \\\\\"UK GDP\\\\\" and take you straight to the corresponding statistics.\\\\n Industry Overview\\\\nDigital & Trend reports\\\\nOverview and forecasts on trending topics\\\\nIndustry & Market reports\\\\nIndustry and market insights and forecasts\\\\nCompanies & Products reports\\\\nKey figures and rankings about companies and products\\\\nConsumer & Brand reports\\\\nConsumer and brand insights and preferences in various industries\\\\nPolitics & Society reports\\\\nDetailed information about political and social topics\\\\nCountry & Region reports\\\\nAll key figures about countries and regions\\\\nMarket forecast and expert KPIs for 1000+ markets in 190+ countries & territories\\\\nInsights on consumer attitudes and behavior worldwide\\\\nBusiness information on 100m+ public and private companies\\\\nExplore Company Insights\\\\nDetailed information for 39,000+ online stores and marketplaces\\\\nDirectly accessible data for 170 industries from 150+ countries\\\\nand over 1\\\\u00a0Mio. facts.\\\\n\"}]', name='tavily_search_results_json', tool_call_id='call_3zDlnDMUkWEJxnHASo59doCL')]}}\n", "----\n", - "{'Researcher': {'messages': [AIMessage(content=\"The search results provide some information about the UK's GDP over the past years, but most of the relevant data is either not in a structured format that can be easily extracted or it is behind a source that requires further access for detailed statistics. To proceed with generating a line graph, we need specific GDP values for each year from 2018 to 2023.\\n\\nHowever, one of the search results from macrotrends.net does provide specific GDP values for the years 2018 to 2021:\\n\\n- U.K. GDP for 2021 was $3,141.51 billion, a 16.45% increase from 2020.\\n- U.K. GDP for 2020 was $2,697.81 billion, a 5.39% decline from 2019.\\n- U.K. GDP for 2019 was $2,851.41 billion, a 0.69% decline from 2018.\\n\\nWe still need the GDP values for 2022 and 2023 to complete the dataset for the past five years. I will now conduct a further search to find the missing GDP data for 2022 and 2023.\", additional_kwargs={'tool_calls': [{'id': 'call_nvB1wQyQuNeTrOXQZnEtgNDZ', 'function': {'arguments': '{\"query\":\"UK GDP 2022 2023\"}', 'name': 'tavily_search_results_json'}, 'type': 'function'}]}, response_metadata={'token_usage': {'completion_tokens': 263, 'prompt_tokens': 3199, 'total_tokens': 3462}, 'model_name': 'gpt-4-1106-preview', 'system_fingerprint': None, 'finish_reason': 'tool_calls', 'logprobs': None}, name='Researcher', id='run-25901401-0d62-485f-b7d5-37e3c159effe-0', tool_calls=[{'name': 'tavily_search_results_json', 'args': {'query': 'UK GDP 2022 2023'}, 'id': 'call_nvB1wQyQuNeTrOXQZnEtgNDZ'}])], 'sender': 'Researcher'}}\n", + "{'Researcher': {'messages': [AIMessage(content=\"The search results provide some information about the UK's GDP over the past years, but most of the relevant data is either not in a structured format that can be easily extracted or it is behind a source that requires further access for detailed statistics. To proceed with generating a line graph, we need specific GDP values for each year from 2018 to 2023.\\n\\nHowever, one of the search results from macrotrends.net does provide specific GDP values for the years 2018 to 2021:\\n\\n- U.K. GDP for 2021 was $3,141.51 billion, a 16.45% increase from 2020.\\n- U.K. GDP for 2020 was $2,697.81 billion, a 5.39% decline from 2019.\\n- U.K. GDP for 2019 was $2,851.41 billion, a 0.69% decline from 2018.\\n\\nWe still need the GDP values for 2022 and 2023 to complete the dataset for the past five years. I will now conduct a further search to find the missing GDP data for 2022 and 2023.\", additional_kwargs={'tool_calls': [{'id': 'call_nvB1wQyQuNeTrOXQZnEtgNDZ', 'function': {'arguments': '{\"query\":\"UK GDP 2022 2023\"}', 'name': 'tavily_search_results_json'}, 'type': 'function'}]}, response_metadata={'token_usage': {'completion_tokens': 263, 'prompt_tokens': 3199, 'total_tokens': 3462}, 'model_name': 'gpt-4o', 'system_fingerprint': None, 'finish_reason': 'tool_calls', 'logprobs': None}, name='Researcher', id='run-25901401-0d62-485f-b7d5-37e3c159effe-0', tool_calls=[{'name': 'tavily_search_results_json', 'args': {'query': 'UK GDP 2022 2023'}, 'id': 'call_nvB1wQyQuNeTrOXQZnEtgNDZ'}])], 'sender': 'Researcher'}}\n", "----\n", "{'call_tool': {'messages': [ToolMessage(content='[{\"url\": \"https://www.statista.com/statistics/281744/gdp-of-the-united-kingdom/\", \"content\": \"Industry Overview\\\\nDigital & Trend reports\\\\nOverview and forecasts on trending topics\\\\nIndustry & Market reports\\\\nIndustry and market insights and forecasts\\\\nCompanies & Products reports\\\\nKey figures and rankings about companies and products\\\\nConsumer & Brand reports\\\\nConsumer and brand insights and preferences in various industries\\\\nPolitics & Society reports\\\\nDetailed information about political and social topics\\\\nCountry & Region reports\\\\nAll key figures about countries and regions\\\\nMarket forecast and expert KPIs for 1000+ markets in 190+ countries & territories\\\\nInsights on consumer attitudes and behavior worldwide\\\\nBusiness information on 100m+ public and private companies\\\\nExplore Company Insights\\\\nDetailed information for 39,000+ online stores and marketplaces\\\\nDirectly accessible data for 170 industries from 150+ countries\\\\nand over 1\\\\u00a0Mio. facts.\\\\n Transforming data into design:\\\\nStatista Content & Design\\\\nStrategy and business building for the data-driven economy:\\\\nGDP of the UK 1948-2022\\\\nUK economy expected to shrink in 2023\\\\nHow big is the UK economy compared to others?\\\\nGross domestic product of the United Kingdom from 1948 to 2022\\\\n(in million GBP)\\\\nAdditional Information\\\\nShow sources information\\\\nShow publisher information\\\\nUse Ask Statista Research Service\\\\nDecember 2023\\\\nUnited Kingdom\\\\n1948 to 2022\\\\n*GDP is displayed in real terms (seasonally adjusted chained volume measure with 2019 as the reference year)\\\\n Statistics on\\\\n\\\\\"\\\\nEconomy of the UK\\\\n\\\\\"\\\\nOther statistics that may interest you Economy of the UK\\\\nGross domestic product\\\\nLabor Market\\\\nInflation\\\\nGovernment finances\\\\nBusiness Enterprise\\\\nFurther related statistics\\\\nFurther Content: You might find this interesting as well\\\\nStatistics\\\\nTopics Other statistics on the topicThe UK economy\\\\nEconomy\\\\nRPI annual inflation rate UK 2000-2028\\\\nEconomy\\\\nCPI annual inflation rate UK 2000-2028\\\\nEconomy\\\\nAverage annual earnings for full-time employees in the UK 1999-2023\\\\nEconomy\\\\nInflation rate in the UK 1989-2023\\\\nYou only have access to basic statistics.\\\\n Customized Research & Analysis projects:\\\\nGet quick analyses with our professional research service\\\\nThe best of the best: the portal for top lists & rankings:\\\\n\"}, {\"url\": \"https://www.ons.gov.uk/economy/grossdomesticproductgdp\", \"content\": \"Quarter on Quarter growth: CVM SA %\\\\nChained Volume Measures (CVM)\\\\nGross Domestic Product: q-on-q4 growth rate CVM SA %\\\\nChained Volume Measures (CVM)\\\\nGross Domestic Product at market prices: Current price: Seasonally adjusted \\\\u00a3m\\\\nCurrent Prices (CP)\\\\nGross Domestic Product: quarter on quarter growth rate: CP SA %\\\\nCurrent Prices (CP)\\\\nGross Domestic Product: q-on-q4 growth quarter growth: CP SA %\\\\nCurrent Prices (CP)\\\\nDatasets related to Gross Domestic Product (GDP)\\\\n A roundup of the latest data and trends on the economy, business and jobs\\\\nTime series related to Gross Domestic Product (GDP)\\\\nGross Domestic Product: chained volume measures: Seasonally adjusted \\\\u00a3m\\\\nChained Volume Measures (CVM)\\\\nGross Domestic Product: Hide\\\\nData and analysis from Census 2021\\\\nGross Domestic Product (GDP)\\\\nGross domestic product (GDP) estimates as the main measure of UK economic growth based on the value of goods and services produced during a given period. Contains current and constant price data on the value of goods and services to indicate the economic performance of the UK.\\\\nEstimates of short-term indicators of investment in non-financial assets; business investment and asset and sector breakdowns of total gross fixed capital formation.\\\\n Monthly gross domestic product by gross value added\\\\nThe gross value added (GVA) tables showing the monthly and annual growths and indices as published within the monthly gross domestic product (GDP) statistical bulletin.\\\\n\"}, {\"url\": \"https://www.ons.gov.uk/economy/grossdomesticproductgdp/bulletins/gdpfirstquarterlyestimateuk/octobertodecember2023\", \"content\": \"This review covered:\\\\nprocesses and quality assurance in making revisions to GDP\\\\npotential improvements to early estimates of GDP enabled through enhanced access to data\\\\ncommunication of revisions to GDP, the story behind the most recent set of revisions in particular, and uncertainty in early estimates of GDP\\\\nWe have already started work looking into the recommendations of this review and have set out our plans on how we will improve the way we communicate uncertainty.\\\\n Source: GDP first quarterly estimate from the Office for National Statistics\\\\nNotes\\\\nOffice for Statistics Regulation Revisions of estimates of UK GDP review\\\\nThe Office for Statistics Regulation (OSR) have completed a review of the practices around the preparation and release of information about revisions to estimates of GDP in our Impact of Blue Book 2023 article released on 1 September 2023, as announced on 6 September 2023 on the OSR website. Across 2023, the services sector sees revisions for the following reasons, with only Quarter 1 2023 seeing growth revised from our previous publication, including:\\\\nupdated input data for the deflator used for telecommunications\\\\nupdated seasonal adjustment which now uses a complete year of data for 2023\\\\nProduction\\\\nThe production sector is estimated to have decreased by 1.0% in the latest quarter after growth of 0.1% in Quarter 3 2023 (unrevised from our previous publication). Important quality information\\\\nThere are common pitfalls in interpreting data series, and these include:\\\\nexpectations of accuracy and reliability in early estimates are often too high\\\\nrevisions are an inevitable consequence of the trade-off between timeliness and accuracy\\\\nearly estimates are often based on incomplete data\\\\nVery few statistical revisions arise as a result of \\\\u201cerrors\\\\u201d in the popular sense of the word. Construction output in Great Britain: December 2023, new orders and Construction Output Price Indices, October to December 2023\\\\nBulletin | Released 15 February 2024\\\\nShort-term measures of output by the construction industry, contracts awarded for new construction work in Great Britain and a summary of the Construction Output Price Indices (OPIs) in the UK for Quarter 4 (October to December) 2023.\\\\n\"}, {\"url\": \"https://www.statista.com/topics/3795/gdp-of-the-uk/\", \"content\": \"Monthly growth of gross domestic product in the United Kingdom from January 2019 to November 2023\\\\nContribution to GDP growth in the UK 2023, by sector\\\\nContribution to gross domestic product growth in the United Kingdom in January 2023, by sector\\\\nGDP growth rate in the UK 1999-2021, by country\\\\nAnnual growth rates of gross domestic product in the United Kingdom from 1999 to 2021, by country\\\\nGDP growth rate in the UK 2021, by region\\\\nAnnual growth rates of gross domestic product in the United Kingdom in 2021, by region\\\\nGDP growth of Scotland 2021, by local area\\\\nAnnual growth rates of gross domestic product in Scotland in 2021, by local (ITL 3) area\\\\nGDP growth of Wales 2021, by local area\\\\nAnnual growth rates of gross domestic product in Wales in 2021, by local (ITL 3) area\\\\nGDP growth of Northern Ireland 2021, by local area\\\\nAnnual growth rates of gross domestic product in Northern Ireland in 2021, by local (ITL 3) area\\\\nGDP per capita\\\\nGDP per capita\\\\nGDP per capita in the UK 1955-2022\\\\nGross domestic product per capita in the United Kingdom from 1955 to 2022 (in GBP)\\\\nAnnual GDP per capita growth in the UK 1956-2022\\\\nAnnual GDP per capita growth in the United Kingdom from 1956 to 2022\\\\nQuarterly GDP per capita in the UK 2019-2023\\\\nQuarterly GDP per capita in the United Kingdom from 1st quarter 2019 to 3rd quarter 2023 (in GBP)\\\\nQuarterly GDP per capita growth in the UK 2019-2023\\\\nQuarterly GDP per capita growth in the United Kingdom from 1st quarter 2019 to 3rd quarter 2023 (in GBP)\\\\nGDP per capita of the UK 1999-2021, by country\\\\nGross domestic product per capita of the United Kingdom from 1999 to 2021, by country (in GBP)\\\\nGDP per capita of the UK 2021, by region\\\\nGross domestic product per capita of the United Kingdom in 2021, by region (in GBP)\\\\nGlobal Comparisons\\\\nGlobal Comparisons\\\\nCountries with the largest gross domestic product (GDP) 2022\\\\n Monthly GDP of the UK 2019-2023\\\\nMonthly index of gross domestic product in the United Kingdom from January 2019 to November 2023 (2019=100)\\\\nGVA of the UK 2022, by sector\\\\nGross value added of the United Kingdom in 2022, by industry sector (in million GBP)\\\\nGDP of the UK 2021, by country\\\\nGross domestic product of the United Kingdom in 2021, by country (in million GBP)\\\\nGDP of the UK 2021, by region\\\\nGross domestic product of the United Kingdom in 2021, by region (in million GBP)\\\\nGDP of Scotland 2021, by local area\\\\nGross domestic product of Scotland in 2021, by local (ITL 3) area (in million GBP)\\\\nGDP of Wales 2021, by local area\\\\nGross domestic product of Wales in 2021, by local (ITL 3) area (in million GBP)\\\\nGDP of Northern Ireland 2021, by local area\\\\nGross domestic product of Northern Ireland in 2021, by local (ITL 3) area (in million GBP)\\\\nGDP growth\\\\nGDP growth\\\\nGDP growth forecast for the UK 2000-2028\\\\nForecasted annual growth of gross domestic product in the United Kingdom from 2000 to 2028\\\\nAnnual GDP growth in the UK 1949-2022\\\\nAnnual growth of gross domestic product in the United Kingdom from 1949 to 2022\\\\nQuarterly GDP growth of the UK 2019-2023\\\\nQuarterly growth of gross domestic product in the United Kingdom from 1st quarter 2019 to 3rd quarter 2023\\\\nMonthly GDP growth of the UK 2019-2023\\\\n Transforming data into design:\\\\nStatista Content & Design\\\\nStrategy and business building for the data-driven economy:\\\\nUK GDP - Statistics & Facts\\\\nUK economy expected to shrink in 2023\\\\nCharacteristics of UK GDP\\\\nKey insights\\\\nDetailed statistics\\\\nGDP of the UK 1948-2022\\\\nDetailed statistics\\\\nAnnual GDP growth in the UK 1949-2022\\\\nDetailed statistics\\\\nGDP per capita in the UK 1955-2022\\\\nEditor\\\\u2019s Picks\\\\nCurrent statistics on this topic\\\\nCurrent statistics on this topic\\\\nKey Economic Indicators\\\\nMonthly GDP growth of the UK 2019-2023\\\\nKey Economic Indicators\\\\nMonthly GDP of the UK 2019-2023\\\\nKey Economic Indicators\\\\nContribution to GDP growth in the UK 2023, by sector\\\\nRelated topics\\\\nRecommended\\\\nRecommended statistics\\\\nGDP\\\\nGDP\\\\nGDP of the UK 1948-2022\\\\nGross domestic product of the United Kingdom from 1948 to 2022 (in million GBP)\\\\nQuarterly GDP of the UK 2019-2023\\\\nQuarterly gross domestic product in the United Kingdom from 1st quarter 2019 to 3rd quarter 2023 (in million GBP)\\\\n The 20 countries with the largest gross domestic product (GDP) in 2022 (in billion U.S. dollars)\\\\nGDP of European countries in 2022\\\\nGross domestic product at current market prices of selected European countries in 2022 (in million euros)\\\\nReal GDP growth rates in Europe 2023\\\\nAnnual real gross domestic product (GDP) growth rate in European countries in 2023\\\\nGross domestic product (GDP) of Europe\\'s largest economies 1980-2028\\\\nGross domestic product (GDP) at current prices of Europe\\'s largest economies from 1980 to 2028 (in billion U.S dollars)\\\\nUnited Kingdom\\'s share of global gross domestic product (GDP) 2028\\\\nUnited Kingdom (UK): Share of global gross domestic product (GDP) adjusted for Purchasing Power Parity (PPP) from 2018 to 2028\\\\nRelated topics\\\\nRecommended\\\\nReport on the topic\\\\nKey figures\\\\nThe most important key figures provide you with a compact summary of the topic of \\\\\"UK GDP\\\\\" and take you straight to the corresponding statistics.\\\\n Industry Overview\\\\nDigital & Trend reports\\\\nOverview and forecasts on trending topics\\\\nIndustry & Market reports\\\\nIndustry and market insights and forecasts\\\\nCompanies & Products reports\\\\nKey figures and rankings about companies and products\\\\nConsumer & Brand reports\\\\nConsumer and brand insights and preferences in various industries\\\\nPolitics & Society reports\\\\nDetailed information about political and social topics\\\\nCountry & Region reports\\\\nAll key figures about countries and regions\\\\nMarket forecast and expert KPIs for 1000+ markets in 190+ countries & territories\\\\nInsights on consumer attitudes and behavior worldwide\\\\nBusiness information on 100m+ public and private companies\\\\nExplore Company Insights\\\\nDetailed information for 39,000+ online stores and marketplaces\\\\nDirectly accessible data for 170 industries from 150+ countries\\\\nand over 1\\\\u00a0Mio. facts.\\\\n\"}, {\"url\": \"https://www.ons.gov.uk/economy/grossdomesticproductgdp/bulletins/quarterlynationalaccounts/latest\", \"content\": \"Looking at the quarters open to revision, real GDP growth is unrevised in five of the seven quarters compared with the first quarterly estimate; however, it is important to note that the typical absolute average revision between the initial quarterly GDP estimate and the estimate three years later is 0.2 percentage points, as there is potential for revision to GDP when the annual supply and use balance occurs as more comprehensive annual data sources are available at a detailed industry and product level; all the GDP growth vintages for these quarters are shown in Table 4.\\\\n Overall the revisions to production reflect:\\\\nrevised volume data from the\\\\u00a0Department for Energy Security and Net Zero (DESNZ) for electricity, gas, steam and air conditioning supply\\\\nnew Value Added Tax (VAT) turnover data for Quarter 2 2023\\\\nnew and revised Monthly Business Survey data\\\\nseasonal adjustment models\\\\nFigure 7: Revisions to production output across 2022 and 2023 are mainly driven by manufacturing; and the electricity, gas and steam subsectors\\\\nConstruction\\\\nConstruction output rose by 0.4% in Quarter 3 2023, revised up from a first estimate increase of 0.1%. Professional, scientific and technical activities: the upward revision in Quarter 4 (Oct to Dec) 2022 and Quarter 1 2023 are driven by new and revised survey data within the advertising and market research industry; in Quarter 3 2023, six of the eight industries in this section are revised down, with the largest contribution coming from architecture and engineering activities; technical testing and analysis, because of revised survey data since our last publication and the new VAT data for Quarter 2 2023.\\\\n This review covered:\\\\nprocesses and quality assurance in making revisions to GDP\\\\npotential improvements to early estimates of GDP enabled through enhanced access to data\\\\ncommunication of revisions to GDP, the story behind the most recent set of revisions in particular, and uncertainty in early estimates of GDP\\\\nWe have already started work looking into the recommendations of this review and will set out plans more fully during January 2024.\\\\n Important quality information\\\\nThere are common pitfalls in interpreting data series, and these include:\\\\nexpectations of accuracy and reliability in early estimates are often too high\\\\nrevisions are an inevitable consequence of the trade-off between timeliness and accuracy\\\\nearly estimates are based on incomplete data\\\\nVery few statistical revisions arise as a result of \\\\\"errors\\\\\" in the popular sense of the word.\"}]', name='tavily_search_results_json', tool_call_id='call_nvB1wQyQuNeTrOXQZnEtgNDZ')]}}\n", "----\n", - "{'Researcher': {'messages': [AIMessage(content=\"The search results did not provide exact figures for the UK's GDP in 2022 and 2023. While there are several references to GDP data, growth rates, and quarterly figures, we do not have the specific annual GDP values in a consistent currency format (such as USD or GBP) that would allow us to compile a complete dataset for the past five years.\\n\\nTo proceed, we will need to find another source or use a different method to obtain the missing GDP data for 2022 and 2023. If this data is not available, we may not be able to draw an accurate line graph of the UK's GDP over the past five years.\", response_metadata={'token_usage': {'completion_tokens': 134, 'prompt_tokens': 6996, 'total_tokens': 7130}, 'model_name': 'gpt-4-1106-preview', 'system_fingerprint': None, 'finish_reason': 'stop', 'logprobs': None}, name='Researcher', id='run-aa7d307d-cfdd-4c83-ad09-b6b0efbffe6e-0')], 'sender': 'Researcher'}}\n", + "{'Researcher': {'messages': [AIMessage(content=\"The search results did not provide exact figures for the UK's GDP in 2022 and 2023. While there are several references to GDP data, growth rates, and quarterly figures, we do not have the specific annual GDP values in a consistent currency format (such as USD or GBP) that would allow us to compile a complete dataset for the past five years.\\n\\nTo proceed, we will need to find another source or use a different method to obtain the missing GDP data for 2022 and 2023. If this data is not available, we may not be able to draw an accurate line graph of the UK's GDP over the past five years.\", response_metadata={'token_usage': {'completion_tokens': 134, 'prompt_tokens': 6996, 'total_tokens': 7130}, 'model_name': 'gpt-4o', 'system_fingerprint': None, 'finish_reason': 'stop', 'logprobs': None}, name='Researcher', id='run-aa7d307d-cfdd-4c83-ad09-b6b0efbffe6e-0')], 'sender': 'Researcher'}}\n", "----\n", - "{'chart_generator': {'messages': [AIMessage(content=\"It seems we have hit a roadblock in finding the exact GDP figures for the UK for the years 2022 and 2023. The information provided by the search results does not include the specific data we need. Therefore, we currently do not have the complete dataset to generate a line graph of the UK's GDP over the past five years.\\n\\nTo proceed, we might need to look for an official statistical release or a comprehensive economic report that includes the GDP figures for 2022 and 2023. If such data can be obtained, we can then use it to create the desired line graph. Without this data, we cannot fulfill the request as specified.\", response_metadata={'token_usage': {'completion_tokens': 134, 'prompt_tokens': 7150, 'total_tokens': 7284}, 'model_name': 'gpt-4-1106-preview', 'system_fingerprint': None, 'finish_reason': 'stop', 'logprobs': None}, name='chart_generator', id='run-a667e647-45b2-414e-b301-81f846fa59ad-0')], 'sender': 'chart_generator'}}\n", + "{'chart_generator': {'messages': [AIMessage(content=\"It seems we have hit a roadblock in finding the exact GDP figures for the UK for the years 2022 and 2023. The information provided by the search results does not include the specific data we need. Therefore, we currently do not have the complete dataset to generate a line graph of the UK's GDP over the past five years.\\n\\nTo proceed, we might need to look for an official statistical release or a comprehensive economic report that includes the GDP figures for 2022 and 2023. If such data can be obtained, we can then use it to create the desired line graph. Without this data, we cannot fulfill the request as specified.\", response_metadata={'token_usage': {'completion_tokens': 134, 'prompt_tokens': 7150, 'total_tokens': 7284}, 'model_name': 'gpt-4o', 'system_fingerprint': None, 'finish_reason': 'stop', 'logprobs': None}, name='chart_generator', id='run-a667e647-45b2-414e-b301-81f846fa59ad-0')], 'sender': 'chart_generator'}}\n", "----\n", - "{'Researcher': {'messages': [AIMessage(content=\"I am unable to proceed with generating the line graph as we lack the specific GDP data for the UK for the years 2022 and 2023. To complete this task, we would need to acquire the missing data points. If the data becomes available, or if there's an alternative source that can provide the figures, we can revisit this task and generate the line graph accordingly. For now, we must conclude this attempt.\", response_metadata={'token_usage': {'completion_tokens': 87, 'prompt_tokens': 7276, 'total_tokens': 7363}, 'model_name': 'gpt-4-1106-preview', 'system_fingerprint': None, 'finish_reason': 'stop', 'logprobs': None}, name='Researcher', id='run-1731ab9f-7ee9-4ff9-a920-7b998a41fe4d-0')], 'sender': 'Researcher'}}\n", + "{'Researcher': {'messages': [AIMessage(content=\"I am unable to proceed with generating the line graph as we lack the specific GDP data for the UK for the years 2022 and 2023. To complete this task, we would need to acquire the missing data points. If the data becomes available, or if there's an alternative source that can provide the figures, we can revisit this task and generate the line graph accordingly. For now, we must conclude this attempt.\", response_metadata={'token_usage': {'completion_tokens': 87, 'prompt_tokens': 7276, 'total_tokens': 7363}, 'model_name': 'gpt-4o', 'system_fingerprint': None, 'finish_reason': 'stop', 'logprobs': None}, name='Researcher', id='run-1731ab9f-7ee9-4ff9-a920-7b998a41fe4d-0')], 'sender': 'Researcher'}}\n", "----\n", - "{'chart_generator': {'messages': [AIMessage(content=\"As of my last attempt, I have not been able to find the exact GDP figures for the UK for the years 2022 and 2023. Without these figures, it's not possible to generate a complete and accurate line graph of the UK's GDP over the past five years. Should the data become available or if an alternative source can provide the figures, we can proceed with creating the graph. For the time being, this task cannot be completed.\", response_metadata={'token_usage': {'completion_tokens': 93, 'prompt_tokens': 7383, 'total_tokens': 7476}, 'model_name': 'gpt-4-1106-preview', 'system_fingerprint': None, 'finish_reason': 'stop', 'logprobs': None}, name='chart_generator', id='run-6e12dccd-b1b2-4c7d-befd-4a338d027756-0')], 'sender': 'chart_generator'}}\n", + "{'chart_generator': {'messages': [AIMessage(content=\"As of my last attempt, I have not been able to find the exact GDP figures for the UK for the years 2022 and 2023. Without these figures, it's not possible to generate a complete and accurate line graph of the UK's GDP over the past five years. Should the data become available or if an alternative source can provide the figures, we can proceed with creating the graph. For the time being, this task cannot be completed.\", response_metadata={'token_usage': {'completion_tokens': 93, 'prompt_tokens': 7383, 'total_tokens': 7476}, 'model_name': 'gpt-4o', 'system_fingerprint': None, 'finish_reason': 'stop', 'logprobs': None}, name='chart_generator', id='run-6e12dccd-b1b2-4c7d-befd-4a338d027756-0')], 'sender': 'chart_generator'}}\n", "----\n", - "{'Researcher': {'messages': [AIMessage(content=\"I have attempted to gather the UK's GDP data for the past five years to draw a line graph, but I was only able to obtain confirmed figures for the years 2018 through 2021. The GDP data for 2022 and 2023 was not available in the search results. Without complete data, it is not possible to generate the line graph as requested. If the missing data for 2022 and 2023 becomes available or an alternative verified source can provide these figures, we can revisit this task to create the graph.\", response_metadata={'token_usage': {'completion_tokens': 111, 'prompt_tokens': 7468, 'total_tokens': 7579}, 'model_name': 'gpt-4-1106-preview', 'system_fingerprint': None, 'finish_reason': 'stop', 'logprobs': None}, name='Researcher', id='run-9d93e637-cedd-4b17-945a-cc97e490432c-0')], 'sender': 'Researcher'}}\n", + "{'Researcher': {'messages': [AIMessage(content=\"I have attempted to gather the UK's GDP data for the past five years to draw a line graph, but I was only able to obtain confirmed figures for the years 2018 through 2021. The GDP data for 2022 and 2023 was not available in the search results. Without complete data, it is not possible to generate the line graph as requested. If the missing data for 2022 and 2023 becomes available or an alternative verified source can provide these figures, we can revisit this task to create the graph.\", response_metadata={'token_usage': {'completion_tokens': 111, 'prompt_tokens': 7468, 'total_tokens': 7579}, 'model_name': 'gpt-4o', 'system_fingerprint': None, 'finish_reason': 'stop', 'logprobs': None}, name='Researcher', id='run-9d93e637-cedd-4b17-945a-cc97e490432c-0')], 'sender': 'Researcher'}}\n", "----\n", - "{'chart_generator': {'messages': [AIMessage(content=\"I've exhausted the available tools to find the UK's GDP for the past five years, but I was able to obtain data up to the year 2021. Unfortunately, without the GDP data for 2022 and 2023, I cannot create a complete line graph for the UK's GDP over the past five years.\\n\\nTo generate the line graph, we would need to have all the necessary data points for each year from 2018 to 2023. If you can provide the GDP data for 2022 and 2023 or direct me to a specific source where these figures can be found, I will be able to create the line graph for you.\", response_metadata={'token_usage': {'completion_tokens': 136, 'prompt_tokens': 7599, 'total_tokens': 7735}, 'model_name': 'gpt-4-1106-preview', 'system_fingerprint': None, 'finish_reason': 'stop', 'logprobs': None}, name='chart_generator', id='run-82063d76-6655-473e-9f6a-a5c005d92bd3-0')], 'sender': 'chart_generator'}}\n", + "{'chart_generator': {'messages': [AIMessage(content=\"I've exhausted the available tools to find the UK's GDP for the past five years, but I was able to obtain data up to the year 2021. Unfortunately, without the GDP data for 2022 and 2023, I cannot create a complete line graph for the UK's GDP over the past five years.\\n\\nTo generate the line graph, we would need to have all the necessary data points for each year from 2018 to 2023. If you can provide the GDP data for 2022 and 2023 or direct me to a specific source where these figures can be found, I will be able to create the line graph for you.\", response_metadata={'token_usage': {'completion_tokens': 136, 'prompt_tokens': 7599, 'total_tokens': 7735}, 'model_name': 'gpt-4o', 'system_fingerprint': None, 'finish_reason': 'stop', 'logprobs': None}, name='chart_generator', id='run-82063d76-6655-473e-9f6a-a5c005d92bd3-0')], 'sender': 'chart_generator'}}\n", "----\n", - "{'Researcher': {'messages': [AIMessage(content=\"I have exhausted the available tools to find the UK's GDP for the past five years, but I was able to obtain data up to the year 2021. Unfortunately, without the GDP data for 2022 and 2023, I cannot create a complete line graph for the UK's GDP over the past five years.\\n\\nTo generate the line graph, we would need to have all the necessary data points for each year from 2018 to 2023. If you can provide the GDP data for 2022 and 2023 or direct me to a specific source where these figures can be found, I will be able to create the line graph for you.\", response_metadata={'token_usage': {'completion_tokens': 136, 'prompt_tokens': 7727, 'total_tokens': 7863}, 'model_name': 'gpt-4-1106-preview', 'system_fingerprint': 'fp_85bf4c41a2', 'finish_reason': 'stop', 'logprobs': None}, name='Researcher', id='run-954e7bb2-ae3e-4610-9927-4b16d733414e-0')], 'sender': 'Researcher'}}\n", + "{'Researcher': {'messages': [AIMessage(content=\"I have exhausted the available tools to find the UK's GDP for the past five years, but I was able to obtain data up to the year 2021. Unfortunately, without the GDP data for 2022 and 2023, I cannot create a complete line graph for the UK's GDP over the past five years.\\n\\nTo generate the line graph, we would need to have all the necessary data points for each year from 2018 to 2023. If you can provide the GDP data for 2022 and 2023 or direct me to a specific source where these figures can be found, I will be able to create the line graph for you.\", response_metadata={'token_usage': {'completion_tokens': 136, 'prompt_tokens': 7727, 'total_tokens': 7863}, 'model_name': 'gpt-4o', 'system_fingerprint': 'fp_85bf4c41a2', 'finish_reason': 'stop', 'logprobs': None}, name='Researcher', id='run-954e7bb2-ae3e-4610-9927-4b16d733414e-0')], 'sender': 'Researcher'}}\n", "----\n", - "{'chart_generator': {'messages': [AIMessage(content=\"Having attempted to find the UK's GDP figures for the years 2022 and 2023 through available data sources and coming up short, it appears we are currently unable to produce a complete line graph of the UK's GDP over the past five years as initially requested. To create a graph, we would need precise GDP data for each year from 2018 to 2023.\\n\\nIf the missing GDP data for 2022 and 2023 becomes available or if an alternative source can provide these figures, we can then proceed to generate the line graph. As of now, this task must be paused until the necessary data can be obtained.\", response_metadata={'token_usage': {'completion_tokens': 130, 'prompt_tokens': 7883, 'total_tokens': 8013}, 'model_name': 'gpt-4-1106-preview', 'system_fingerprint': 'fp_85bf4c41a2', 'finish_reason': 'stop', 'logprobs': None}, name='chart_generator', id='run-8d1382e2-a77c-4d2f-b06a-2597be59542b-0')], 'sender': 'chart_generator'}}\n", + "{'chart_generator': {'messages': [AIMessage(content=\"Having attempted to find the UK's GDP figures for the years 2022 and 2023 through available data sources and coming up short, it appears we are currently unable to produce a complete line graph of the UK's GDP over the past five years as initially requested. To create a graph, we would need precise GDP data for each year from 2018 to 2023.\\n\\nIf the missing GDP data for 2022 and 2023 becomes available or if an alternative source can provide these figures, we can then proceed to generate the line graph. As of now, this task must be paused until the necessary data can be obtained.\", response_metadata={'token_usage': {'completion_tokens': 130, 'prompt_tokens': 7883, 'total_tokens': 8013}, 'model_name': 'gpt-4o', 'system_fingerprint': 'fp_85bf4c41a2', 'finish_reason': 'stop', 'logprobs': None}, name='chart_generator', id='run-8d1382e2-a77c-4d2f-b06a-2597be59542b-0')], 'sender': 'chart_generator'}}\n", "----\n", - "{'Researcher': {'messages': [AIMessage(content=\"The search results do not provide the exact GDP figures for the UK for 2022 and 2023. Without this information, it is not possible to generate a line graph of the UK's GDP over the past five years. We would require the GDP values for those two years to complete the dataset and create the graph. As of now, I must conclude this task until the necessary data becomes available.\", response_metadata={'token_usage': {'completion_tokens': 82, 'prompt_tokens': 8005, 'total_tokens': 8087}, 'model_name': 'gpt-4-1106-preview', 'system_fingerprint': None, 'finish_reason': 'stop', 'logprobs': None}, name='Researcher', id='run-246b9b29-ffc7-4da9-a09a-0dcfbbb3bd7a-0')], 'sender': 'Researcher'}}\n", + "{'Researcher': {'messages': [AIMessage(content=\"The search results do not provide the exact GDP figures for the UK for 2022 and 2023. Without this information, it is not possible to generate a line graph of the UK's GDP over the past five years. We would require the GDP values for those two years to complete the dataset and create the graph. As of now, I must conclude this task until the necessary data becomes available.\", response_metadata={'token_usage': {'completion_tokens': 82, 'prompt_tokens': 8005, 'total_tokens': 8087}, 'model_name': 'gpt-4o', 'system_fingerprint': None, 'finish_reason': 'stop', 'logprobs': None}, name='Researcher', id='run-246b9b29-ffc7-4da9-a09a-0dcfbbb3bd7a-0')], 'sender': 'Researcher'}}\n", "----\n", - "{'chart_generator': {'messages': [AIMessage(content=\"I have attempted to find the UK's GDP for the past five years to create a line graph, but I could only obtain confirmed figures for the years 2018 through 2021. The GDP data for 2022 and 2023 was not available in the search results. Without complete data, it is not possible to generate the line graph as requested. If the missing data for 2022 and 2023 becomes available or an alternative verified source can provide these figures, we can revisit this task to create the graph.\", response_metadata={'token_usage': {'completion_tokens': 108, 'prompt_tokens': 8107, 'total_tokens': 8215}, 'model_name': 'gpt-4-1106-preview', 'system_fingerprint': 'fp_85bf4c41a2', 'finish_reason': 'stop', 'logprobs': None}, name='chart_generator', id='run-f2847a80-610d-49c5-924a-ccffccb7cd5a-0')], 'sender': 'chart_generator'}}\n", + "{'chart_generator': {'messages': [AIMessage(content=\"I have attempted to find the UK's GDP for the past five years to create a line graph, but I could only obtain confirmed figures for the years 2018 through 2021. The GDP data for 2022 and 2023 was not available in the search results. Without complete data, it is not possible to generate the line graph as requested. If the missing data for 2022 and 2023 becomes available or an alternative verified source can provide these figures, we can revisit this task to create the graph.\", response_metadata={'token_usage': {'completion_tokens': 108, 'prompt_tokens': 8107, 'total_tokens': 8215}, 'model_name': 'gpt-4o', 'system_fingerprint': 'fp_85bf4c41a2', 'finish_reason': 'stop', 'logprobs': None}, name='chart_generator', id='run-f2847a80-610d-49c5-924a-ccffccb7cd5a-0')], 'sender': 'chart_generator'}}\n", "----\n", - "{'Researcher': {'messages': [AIMessage(content=\"As of now, I was unable to obtain the complete data for the UK's GDP over the past five years due to lack of specific information for the years 2022 and 2023. Therefore, it's not possible to draw a line graph of the UK's GDP for this period without the complete dataset. Further action to acquire the missing data would be required to proceed.\", response_metadata={'token_usage': {'completion_tokens': 77, 'prompt_tokens': 8207, 'total_tokens': 8284}, 'model_name': 'gpt-4-1106-preview', 'system_fingerprint': None, 'finish_reason': 'stop', 'logprobs': None}, name='Researcher', id='run-28e09000-8787-4ac0-a7d8-0aba888c2520-0')], 'sender': 'Researcher'}}\n", + "{'Researcher': {'messages': [AIMessage(content=\"As of now, I was unable to obtain the complete data for the UK's GDP over the past five years due to lack of specific information for the years 2022 and 2023. Therefore, it's not possible to draw a line graph of the UK's GDP for this period without the complete dataset. Further action to acquire the missing data would be required to proceed.\", response_metadata={'token_usage': {'completion_tokens': 77, 'prompt_tokens': 8207, 'total_tokens': 8284}, 'model_name': 'gpt-4o', 'system_fingerprint': None, 'finish_reason': 'stop', 'logprobs': None}, name='Researcher', id='run-28e09000-8787-4ac0-a7d8-0aba888c2520-0')], 'sender': 'Researcher'}}\n", "----\n", - "{'chart_generator': {'messages': [AIMessage(content=\"It appears we have encountered a limitation in obtaining the complete GDP data for the UK for 2022 and 2023. Without these figures, we cannot create the line graph of the UK's GDP over the past five years as requested. If the data becomes available, or if there's an alternative source that can provide the figures, we can revisit this task and generate the line graph accordingly. For now, this task will have to be concluded without completion.\", response_metadata={'token_usage': {'completion_tokens': 93, 'prompt_tokens': 8304, 'total_tokens': 8397}, 'model_name': 'gpt-4-1106-preview', 'system_fingerprint': None, 'finish_reason': 'stop', 'logprobs': None}, name='chart_generator', id='run-8bf8f247-cb86-4ef0-a81b-14da2d27b6f1-0')], 'sender': 'chart_generator'}}\n", + "{'chart_generator': {'messages': [AIMessage(content=\"It appears we have encountered a limitation in obtaining the complete GDP data for the UK for 2022 and 2023. Without these figures, we cannot create the line graph of the UK's GDP over the past five years as requested. If the data becomes available, or if there's an alternative source that can provide the figures, we can revisit this task and generate the line graph accordingly. For now, this task will have to be concluded without completion.\", response_metadata={'token_usage': {'completion_tokens': 93, 'prompt_tokens': 8304, 'total_tokens': 8397}, 'model_name': 'gpt-4o', 'system_fingerprint': None, 'finish_reason': 'stop', 'logprobs': None}, name='chart_generator', id='run-8bf8f247-cb86-4ef0-a81b-14da2d27b6f1-0')], 'sender': 'chart_generator'}}\n", "----\n", - "{'Researcher': {'messages': [AIMessage(content='', additional_kwargs={'tool_calls': [{'id': 'call_df3UdS3vJkJFB30O0WYq38k8', 'function': {'arguments': '{\"query\":\"UK GDP 2022 2023 statistics\"}', 'name': 'tavily_search_results_json'}, 'type': 'function'}]}, response_metadata={'token_usage': {'completion_tokens': 26, 'prompt_tokens': 8389, 'total_tokens': 8415}, 'model_name': 'gpt-4-1106-preview', 'system_fingerprint': None, 'finish_reason': 'tool_calls', 'logprobs': None}, name='Researcher', id='run-e1577cc7-5673-4821-9683-34947c7a2bc5-0', tool_calls=[{'name': 'tavily_search_results_json', 'args': {'query': 'UK GDP 2022 2023 statistics'}, 'id': 'call_df3UdS3vJkJFB30O0WYq38k8'}])], 'sender': 'Researcher'}}\n", + "{'Researcher': {'messages': [AIMessage(content='', additional_kwargs={'tool_calls': [{'id': 'call_df3UdS3vJkJFB30O0WYq38k8', 'function': {'arguments': '{\"query\":\"UK GDP 2022 2023 statistics\"}', 'name': 'tavily_search_results_json'}, 'type': 'function'}]}, response_metadata={'token_usage': {'completion_tokens': 26, 'prompt_tokens': 8389, 'total_tokens': 8415}, 'model_name': 'gpt-4o', 'system_fingerprint': None, 'finish_reason': 'tool_calls', 'logprobs': None}, name='Researcher', id='run-e1577cc7-5673-4821-9683-34947c7a2bc5-0', tool_calls=[{'name': 'tavily_search_results_json', 'args': {'query': 'UK GDP 2022 2023 statistics'}, 'id': 'call_df3UdS3vJkJFB30O0WYq38k8'}])], 'sender': 'Researcher'}}\n", "----\n", "{'call_tool': {'messages': [ToolMessage(content='[{\"url\": \"https://www.statista.com/statistics/281744/gdp-of-the-united-kingdom/\", \"content\": \"Industry Overview\\\\nDigital & Trend reports\\\\nOverview and forecasts on trending topics\\\\nIndustry & Market reports\\\\nIndustry and market insights and forecasts\\\\nCompanies & Products reports\\\\nKey figures and rankings about companies and products\\\\nConsumer & Brand reports\\\\nConsumer and brand insights and preferences in various industries\\\\nPolitics & Society reports\\\\nDetailed information about political and social topics\\\\nCountry & Region reports\\\\nAll key figures about countries and regions\\\\nMarket forecast and expert KPIs for 1000+ markets in 190+ countries & territories\\\\nInsights on consumer attitudes and behavior worldwide\\\\nBusiness information on 100m+ public and private companies\\\\nExplore Company Insights\\\\nDetailed information for 39,000+ online stores and marketplaces\\\\nDirectly accessible data for 170 industries from 150+ countries\\\\nand over 1\\\\u00a0Mio. facts.\\\\n Transforming data into design:\\\\nStatista Content & Design\\\\nStrategy and business building for the data-driven economy:\\\\nGDP of the UK 1948-2022\\\\nUK economy expected to shrink in 2023\\\\nHow big is the UK economy compared to others?\\\\nGross domestic product of the United Kingdom from 1948 to 2022\\\\n(in million GBP)\\\\nAdditional Information\\\\nShow sources information\\\\nShow publisher information\\\\nUse Ask Statista Research Service\\\\nDecember 2023\\\\nUnited Kingdom\\\\n1948 to 2022\\\\n*GDP is displayed in real terms (seasonally adjusted chained volume measure with 2019 as the reference year)\\\\n Statistics on\\\\n\\\\\"\\\\nEconomy of the UK\\\\n\\\\\"\\\\nOther statistics that may interest you Economy of the UK\\\\nGross domestic product\\\\nLabor Market\\\\nInflation\\\\nGovernment finances\\\\nBusiness Enterprise\\\\nFurther related statistics\\\\nFurther Content: You might find this interesting as well\\\\nStatistics\\\\nTopics Other statistics on the topicThe UK economy\\\\nEconomy\\\\nRPI annual inflation rate UK 2000-2028\\\\nEconomy\\\\nCPI annual inflation rate UK 2000-2028\\\\nEconomy\\\\nAverage annual earnings for full-time employees in the UK 1999-2023\\\\nEconomy\\\\nInflation rate in the UK 1989-2023\\\\nYou only have access to basic statistics.\\\\n Customized Research & Analysis projects:\\\\nGet quick analyses with our professional research service\\\\nThe best of the best: the portal for top lists & rankings:\\\\n\"}, {\"url\": \"https://www.statista.com/topics/3795/gdp-of-the-uk/\", \"content\": \"Monthly growth of gross domestic product in the United Kingdom from January 2019 to November 2023\\\\nContribution to GDP growth in the UK 2023, by sector\\\\nContribution to gross domestic product growth in the United Kingdom in January 2023, by sector\\\\nGDP growth rate in the UK 1999-2021, by country\\\\nAnnual growth rates of gross domestic product in the United Kingdom from 1999 to 2021, by country\\\\nGDP growth rate in the UK 2021, by region\\\\nAnnual growth rates of gross domestic product in the United Kingdom in 2021, by region\\\\nGDP growth of Scotland 2021, by local area\\\\nAnnual growth rates of gross domestic product in Scotland in 2021, by local (ITL 3) area\\\\nGDP growth of Wales 2021, by local area\\\\nAnnual growth rates of gross domestic product in Wales in 2021, by local (ITL 3) area\\\\nGDP growth of Northern Ireland 2021, by local area\\\\nAnnual growth rates of gross domestic product in Northern Ireland in 2021, by local (ITL 3) area\\\\nGDP per capita\\\\nGDP per capita\\\\nGDP per capita in the UK 1955-2022\\\\nGross domestic product per capita in the United Kingdom from 1955 to 2022 (in GBP)\\\\nAnnual GDP per capita growth in the UK 1956-2022\\\\nAnnual GDP per capita growth in the United Kingdom from 1956 to 2022\\\\nQuarterly GDP per capita in the UK 2019-2023\\\\nQuarterly GDP per capita in the United Kingdom from 1st quarter 2019 to 3rd quarter 2023 (in GBP)\\\\nQuarterly GDP per capita growth in the UK 2019-2023\\\\nQuarterly GDP per capita growth in the United Kingdom from 1st quarter 2019 to 3rd quarter 2023 (in GBP)\\\\nGDP per capita of the UK 1999-2021, by country\\\\nGross domestic product per capita of the United Kingdom from 1999 to 2021, by country (in GBP)\\\\nGDP per capita of the UK 2021, by region\\\\nGross domestic product per capita of the United Kingdom in 2021, by region (in GBP)\\\\nGlobal Comparisons\\\\nGlobal Comparisons\\\\nCountries with the largest gross domestic product (GDP) 2022\\\\n Monthly GDP of the UK 2019-2023\\\\nMonthly index of gross domestic product in the United Kingdom from January 2019 to November 2023 (2019=100)\\\\nGVA of the UK 2022, by sector\\\\nGross value added of the United Kingdom in 2022, by industry sector (in million GBP)\\\\nGDP of the UK 2021, by country\\\\nGross domestic product of the United Kingdom in 2021, by country (in million GBP)\\\\nGDP of the UK 2021, by region\\\\nGross domestic product of the United Kingdom in 2021, by region (in million GBP)\\\\nGDP of Scotland 2021, by local area\\\\nGross domestic product of Scotland in 2021, by local (ITL 3) area (in million GBP)\\\\nGDP of Wales 2021, by local area\\\\nGross domestic product of Wales in 2021, by local (ITL 3) area (in million GBP)\\\\nGDP of Northern Ireland 2021, by local area\\\\nGross domestic product of Northern Ireland in 2021, by local (ITL 3) area (in million GBP)\\\\nGDP growth\\\\nGDP growth\\\\nGDP growth forecast for the UK 2000-2028\\\\nForecasted annual growth of gross domestic product in the United Kingdom from 2000 to 2028\\\\nAnnual GDP growth in the UK 1949-2022\\\\nAnnual growth of gross domestic product in the United Kingdom from 1949 to 2022\\\\nQuarterly GDP growth of the UK 2019-2023\\\\nQuarterly growth of gross domestic product in the United Kingdom from 1st quarter 2019 to 3rd quarter 2023\\\\nMonthly GDP growth of the UK 2019-2023\\\\n Transforming data into design:\\\\nStatista Content & Design\\\\nStrategy and business building for the data-driven economy:\\\\nUK GDP - Statistics & Facts\\\\nUK economy expected to shrink in 2023\\\\nCharacteristics of UK GDP\\\\nKey insights\\\\nDetailed statistics\\\\nGDP of the UK 1948-2022\\\\nDetailed statistics\\\\nAnnual GDP growth in the UK 1949-2022\\\\nDetailed statistics\\\\nGDP per capita in the UK 1955-2022\\\\nEditor\\\\u2019s Picks\\\\nCurrent statistics on this topic\\\\nCurrent statistics on this topic\\\\nKey Economic Indicators\\\\nMonthly GDP growth of the UK 2019-2023\\\\nKey Economic Indicators\\\\nMonthly GDP of the UK 2019-2023\\\\nKey Economic Indicators\\\\nContribution to GDP growth in the UK 2023, by sector\\\\nRelated topics\\\\nRecommended\\\\nRecommended statistics\\\\nGDP\\\\nGDP\\\\nGDP of the UK 1948-2022\\\\nGross domestic product of the United Kingdom from 1948 to 2022 (in million GBP)\\\\nQuarterly GDP of the UK 2019-2023\\\\nQuarterly gross domestic product in the United Kingdom from 1st quarter 2019 to 3rd quarter 2023 (in million GBP)\\\\n The 20 countries with the largest gross domestic product (GDP) in 2022 (in billion U.S. dollars)\\\\nGDP of European countries in 2022\\\\nGross domestic product at current market prices of selected European countries in 2022 (in million euros)\\\\nReal GDP growth rates in Europe 2023\\\\nAnnual real gross domestic product (GDP) growth rate in European countries in 2023\\\\nGross domestic product (GDP) of Europe\\'s largest economies 1980-2028\\\\nGross domestic product (GDP) at current prices of Europe\\'s largest economies from 1980 to 2028 (in billion U.S dollars)\\\\nUnited Kingdom\\'s share of global gross domestic product (GDP) 2028\\\\nUnited Kingdom (UK): Share of global gross domestic product (GDP) adjusted for Purchasing Power Parity (PPP) from 2018 to 2028\\\\nRelated topics\\\\nRecommended\\\\nReport on the topic\\\\nKey figures\\\\nThe most important key figures provide you with a compact summary of the topic of \\\\\"UK GDP\\\\\" and take you straight to the corresponding statistics.\\\\n Industry Overview\\\\nDigital & Trend reports\\\\nOverview and forecasts on trending topics\\\\nIndustry & Market reports\\\\nIndustry and market insights and forecasts\\\\nCompanies & Products reports\\\\nKey figures and rankings about companies and products\\\\nConsumer & Brand reports\\\\nConsumer and brand insights and preferences in various industries\\\\nPolitics & Society reports\\\\nDetailed information about political and social topics\\\\nCountry & Region reports\\\\nAll key figures about countries and regions\\\\nMarket forecast and expert KPIs for 1000+ markets in 190+ countries & territories\\\\nInsights on consumer attitudes and behavior worldwide\\\\nBusiness information on 100m+ public and private companies\\\\nExplore Company Insights\\\\nDetailed information for 39,000+ online stores and marketplaces\\\\nDirectly accessible data for 170 industries from 150+ countries\\\\nand over 1\\\\u00a0Mio. facts.\\\\n\"}, {\"url\": \"https://www.ons.gov.uk/economy/grossdomesticproductgdp/bulletins/quarterlynationalaccounts/latest\", \"content\": \"Looking at the quarters open to revision, real GDP growth is unrevised in five of the seven quarters compared with the first quarterly estimate; however, it is important to note that the typical absolute average revision between the initial quarterly GDP estimate and the estimate three years later is 0.2 percentage points, as there is potential for revision to GDP when the annual supply and use balance occurs as more comprehensive annual data sources are available at a detailed industry and product level; all the GDP growth vintages for these quarters are shown in Table 4.\\\\n Overall the revisions to production reflect:\\\\nrevised volume data from the\\\\u00a0Department for Energy Security and Net Zero (DESNZ) for electricity, gas, steam and air conditioning supply\\\\nnew Value Added Tax (VAT) turnover data for Quarter 2 2023\\\\nnew and revised Monthly Business Survey data\\\\nseasonal adjustment models\\\\nFigure 7: Revisions to production output across 2022 and 2023 are mainly driven by manufacturing; and the electricity, gas and steam subsectors\\\\nConstruction\\\\nConstruction output rose by 0.4% in Quarter 3 2023, revised up from a first estimate increase of 0.1%. Professional, scientific and technical activities: the upward revision in Quarter 4 (Oct to Dec) 2022 and Quarter 1 2023 are driven by new and revised survey data within the advertising and market research industry; in Quarter 3 2023, six of the eight industries in this section are revised down, with the largest contribution coming from architecture and engineering activities; technical testing and analysis, because of revised survey data since our last publication and the new VAT data for Quarter 2 2023.\\\\n This review covered:\\\\nprocesses and quality assurance in making revisions to GDP\\\\npotential improvements to early estimates of GDP enabled through enhanced access to data\\\\ncommunication of revisions to GDP, the story behind the most recent set of revisions in particular, and uncertainty in early estimates of GDP\\\\nWe have already started work looking into the recommendations of this review and will set out plans more fully during January 2024.\\\\n Important quality information\\\\nThere are common pitfalls in interpreting data series, and these include:\\\\nexpectations of accuracy and reliability in early estimates are often too high\\\\nrevisions are an inevitable consequence of the trade-off between timeliness and accuracy\\\\nearly estimates are based on incomplete data\\\\nVery few statistical revisions arise as a result of \\\\\"errors\\\\\" in the popular sense of the word.\"}, {\"url\": \"https://www.ons.gov.uk/economy/grossdomesticproductgdp/bulletins/gdpmonthlyestimateuk/latest\", \"content\": \"The following list contains the full SIC names of industries included in consumer-facing services and their corresponding shortened industry name where this has been used in Figure 5:\\\\nwholesale and retail trade and repair of motor vehicles and motorcycles - sales and repairs of motor vehicles\\\\nretail trade, except of motor vehicles and motorcycles - retail except motor vehicles\\\\nrail transport\\\\naccommodation\\\\nfood and beverage service activities - food and beverage\\\\nbuying and selling, renting and operating of own or leased real estate, excluding imputed rent - real estate activities\\\\nveterinary activities\\\\ntravel agency, tour operator and other reservation service and related activities - travel and tourism activities\\\\ngambling and betting services\\\\nsports activities and amusement and recreation activities - sports, amusement and recreation\\\\nactivities of membership organisations\\\\nother personal service activities\\\\nactivities of households as employers of domestic personnel - households as employers of domestic personnel\\\\nAdditional bank holiday in May 2023 for the Coronation of King Charles III\\\\nThere was an additional bank holiday for the coronation of King Charles III on Monday 8 May 2023. Source: Monthly GDP estimate from Office for National Statistics\\\\nThe main reasons for revisions in October 2023 are:\\\\nin the services sector, the upwards revision is mainly from updated and late monthly business survey responses primarily in the information and communication subsection\\\\nin the production sector, the downward revision is from source data replacing forecasts in mining and quarrying and electricity, gas, steam and air conditioning supply, as well as revised and late monthly business survey responses predominantly in the manufacture of pharmaceutical products and pharmaceutical preparations, and sewerage industries\\\\nin the construction sector, the upwards revisions is because of updated and late monthly business survey responses for new public housing and other public new work\\\\nDetails on the revisions to monthly GDP prior to October 2023 are provided in our GDP quarterly national accounts, UK: July to September 2023 bulletin.\\\\n This review covered:\\\\nprocesses and quality assurance in making revisions to GDP\\\\npotential improvements to early estimates of GDP enabled through enhanced access to data\\\\ncommunication of revisions to GDP, the story behind the most recent set of revisions in particular, and uncertainty in early estimates of GDP\\\\nWe have already started work looking into the recommendations of this review and will set out plans more fully during January 2024.\\\\n11. The main data source for these statistics is the Monthly Business Survey (MBS) and response rates for each can be found in our:\\\\nOutput in the construction industry dataset\\\\nMonthly Business Survey (production) response rates dataset\\\\nCurrent and historical Monthly Business Survey (services) response rates dataset\\\\nOur monthly gross domestic product (GDP) data sources catalogue provides a full breakdown of the data used in this publication.\\\\n On the negative side, the lack of demand for construction products was prevalent across manufacturing, with manufacture of wood, rubber and plastic, glass, cement and plaster all seeing declines on the month in November 2023 in line with the two consecutive monthly falls in construction output in October and November 2023.\\\\n\"}, {\"url\": \"https://www.ons.gov.uk/economy/grossdomesticproductgdp\", \"content\": \"Quarter on Quarter growth: CVM SA %\\\\nChained Volume Measures (CVM)\\\\nGross Domestic Product: q-on-q4 growth rate CVM SA %\\\\nChained Volume Measures (CVM)\\\\nGross Domestic Product at market prices: Current price: Seasonally adjusted \\\\u00a3m\\\\nCurrent Prices (CP)\\\\nGross Domestic Product: quarter on quarter growth rate: CP SA %\\\\nCurrent Prices (CP)\\\\nGross Domestic Product: q-on-q4 growth quarter growth: CP SA %\\\\nCurrent Prices (CP)\\\\nDatasets related to Gross Domestic Product (GDP)\\\\n A roundup of the latest data and trends on the economy, business and jobs\\\\nTime series related to Gross Domestic Product (GDP)\\\\nGross Domestic Product: chained volume measures: Seasonally adjusted \\\\u00a3m\\\\nChained Volume Measures (CVM)\\\\nGross Domestic Product: Hide\\\\nData and analysis from Census 2021\\\\nGross Domestic Product (GDP)\\\\nGross domestic product (GDP) estimates as the main measure of UK economic growth based on the value of goods and services produced during a given period. Contains current and constant price data on the value of goods and services to indicate the economic performance of the UK.\\\\nEstimates of short-term indicators of investment in non-financial assets; business investment and asset and sector breakdowns of total gross fixed capital formation.\\\\n Monthly gross domestic product by gross value added\\\\nThe gross value added (GVA) tables showing the monthly and annual growths and indices as published within the monthly gross domestic product (GDP) statistical bulletin.\\\\n\"}]', name='tavily_search_results_json', tool_call_id='call_df3UdS3vJkJFB30O0WYq38k8')]}}\n", "----\n", - "{'Researcher': {'messages': [AIMessage(content=\"The search results unfortunately do not provide specific figures for the UK's GDP in 2022 and 2023. While there are references to GDP data and related economic indicators, the exact annual GDP values needed to create the line graph are not present.\\n\\nOne possible approach to obtain these figures would be to access detailed statistical databases or reports from official sources such as the Office for National Statistics (ONS) or economic research institutions that publish historical GDP data. These sources might have the most recent and accurate GDP figures available for the UK, which are necessary to complete the line graph.\\n\\nSince I cannot directly access or retrieve the data from these sources using the tools available to me, I recommend consulting such databases or reports to find the UK's GDP for 2022 and 2023. Once the data is obtained, it can be used to create the line graph.\", response_metadata={'token_usage': {'completion_tokens': 172, 'prompt_tokens': 12099, 'total_tokens': 12271}, 'model_name': 'gpt-4-1106-preview', 'system_fingerprint': None, 'finish_reason': 'stop', 'logprobs': None}, name='Researcher', id='run-7b4bcbc3-3ed0-4fa0-8e5d-a366c5a80d5a-0')], 'sender': 'Researcher'}}\n", + "{'Researcher': {'messages': [AIMessage(content=\"The search results unfortunately do not provide specific figures for the UK's GDP in 2022 and 2023. While there are references to GDP data and related economic indicators, the exact annual GDP values needed to create the line graph are not present.\\n\\nOne possible approach to obtain these figures would be to access detailed statistical databases or reports from official sources such as the Office for National Statistics (ONS) or economic research institutions that publish historical GDP data. These sources might have the most recent and accurate GDP figures available for the UK, which are necessary to complete the line graph.\\n\\nSince I cannot directly access or retrieve the data from these sources using the tools available to me, I recommend consulting such databases or reports to find the UK's GDP for 2022 and 2023. Once the data is obtained, it can be used to create the line graph.\", response_metadata={'token_usage': {'completion_tokens': 172, 'prompt_tokens': 12099, 'total_tokens': 12271}, 'model_name': 'gpt-4o', 'system_fingerprint': None, 'finish_reason': 'stop', 'logprobs': None}, name='Researcher', id='run-7b4bcbc3-3ed0-4fa0-8e5d-a366c5a80d5a-0')], 'sender': 'Researcher'}}\n", "----\n", - "{'chart_generator': {'messages': [AIMessage(content='', additional_kwargs={'tool_calls': [{'id': 'call_JPVxDAzEFi21crVT7Rt6SRJl', 'function': {'arguments': '{\"code\":\"import matplotlib.pyplot as plt\\\\n\\\\n# UK GDP data obtained from search results for 2018-2021 (in billion USD)\\\\n# The data for 2022 and 2023 are placeholders and should be replaced with actual figures when available\\\\ngdp_data = {\\\\n \\'Year\\': [2018, 2019, 2020, 2021, 2022, 2023],\\\\n \\'GDP (Billion USD)\\': [2851.41, 2697.81, 3141.51, None, None]\\\\n}\\\\n\\\\n# Plot a line graph\\\\nplt.figure(figsize=(10, 5))\\\\nplt.plot(gdp_data[\\'Year\\'], gdp_data[\\'GDP (Billion USD)\\'], marker=\\'o\\')\\\\n\\\\n# Title and labels\\\\nplt.title(\\'UK GDP from 2018 to 2023\\')\\\\nplt.xlabel(\\'Year\\')\\\\nplt.ylabel(\\'GDP (Billion USD)\\')\\\\n\\\\n# Show grid\\\\nplt.grid(True)\\\\n\\\\n# Display the graph\\\\nplt.show()\"}', 'name': 'python_repl'}, 'type': 'function'}]}, response_metadata={'token_usage': {'completion_tokens': 240, 'prompt_tokens': 12291, 'total_tokens': 12531}, 'model_name': 'gpt-4-1106-preview', 'system_fingerprint': None, 'finish_reason': 'tool_calls', 'logprobs': None}, name='chart_generator', id='run-6cff57bc-ba87-4690-9528-4d15bba7986c-0', tool_calls=[{'name': 'python_repl', 'args': {'code': \"import matplotlib.pyplot as plt\\n\\n# UK GDP data obtained from search results for 2018-2021 (in billion USD)\\n# The data for 2022 and 2023 are placeholders and should be replaced with actual figures when available\\ngdp_data = {\\n 'Year': [2018, 2019, 2020, 2021, 2022, 2023],\\n 'GDP (Billion USD)': [2851.41, 2697.81, 3141.51, None, None]\\n}\\n\\n# Plot a line graph\\nplt.figure(figsize=(10, 5))\\nplt.plot(gdp_data['Year'], gdp_data['GDP (Billion USD)'], marker='o')\\n\\n# Title and labels\\nplt.title('UK GDP from 2018 to 2023')\\nplt.xlabel('Year')\\nplt.ylabel('GDP (Billion USD)')\\n\\n# Show grid\\nplt.grid(True)\\n\\n# Display the graph\\nplt.show()\"}, 'id': 'call_JPVxDAzEFi21crVT7Rt6SRJl'}])], 'sender': 'chart_generator'}}\n", + "{'chart_generator': {'messages': [AIMessage(content='', additional_kwargs={'tool_calls': [{'id': 'call_JPVxDAzEFi21crVT7Rt6SRJl', 'function': {'arguments': '{\"code\":\"import matplotlib.pyplot as plt\\\\n\\\\n# UK GDP data obtained from search results for 2018-2021 (in billion USD)\\\\n# The data for 2022 and 2023 are placeholders and should be replaced with actual figures when available\\\\ngdp_data = {\\\\n \\'Year\\': [2018, 2019, 2020, 2021, 2022, 2023],\\\\n \\'GDP (Billion USD)\\': [2851.41, 2697.81, 3141.51, None, None]\\\\n}\\\\n\\\\n# Plot a line graph\\\\nplt.figure(figsize=(10, 5))\\\\nplt.plot(gdp_data[\\'Year\\'], gdp_data[\\'GDP (Billion USD)\\'], marker=\\'o\\')\\\\n\\\\n# Title and labels\\\\nplt.title(\\'UK GDP from 2018 to 2023\\')\\\\nplt.xlabel(\\'Year\\')\\\\nplt.ylabel(\\'GDP (Billion USD)\\')\\\\n\\\\n# Show grid\\\\nplt.grid(True)\\\\n\\\\n# Display the graph\\\\nplt.show()\"}', 'name': 'python_repl'}, 'type': 'function'}]}, response_metadata={'token_usage': {'completion_tokens': 240, 'prompt_tokens': 12291, 'total_tokens': 12531}, 'model_name': 'gpt-4o', 'system_fingerprint': None, 'finish_reason': 'tool_calls', 'logprobs': None}, name='chart_generator', id='run-6cff57bc-ba87-4690-9528-4d15bba7986c-0', tool_calls=[{'name': 'python_repl', 'args': {'code': \"import matplotlib.pyplot as plt\\n\\n# UK GDP data obtained from search results for 2018-2021 (in billion USD)\\n# The data for 2022 and 2023 are placeholders and should be replaced with actual figures when available\\ngdp_data = {\\n 'Year': [2018, 2019, 2020, 2021, 2022, 2023],\\n 'GDP (Billion USD)': [2851.41, 2697.81, 3141.51, None, None]\\n}\\n\\n# Plot a line graph\\nplt.figure(figsize=(10, 5))\\nplt.plot(gdp_data['Year'], gdp_data['GDP (Billion USD)'], marker='o')\\n\\n# Title and labels\\nplt.title('UK GDP from 2018 to 2023')\\nplt.xlabel('Year')\\nplt.ylabel('GDP (Billion USD)')\\n\\n# Show grid\\nplt.grid(True)\\n\\n# Display the graph\\nplt.show()\"}, 'id': 'call_JPVxDAzEFi21crVT7Rt6SRJl'}])], 'sender': 'chart_generator'}}\n", "----\n", "{'call_tool': {'messages': [ToolMessage(content=\"Successfully executed:\\n```python\\nimport matplotlib.pyplot as plt\\n\\n# UK GDP data obtained from search results for 2018-2021 (in billion USD)\\n# The data for 2022 and 2023 are placeholders and should be replaced with actual figures when available\\ngdp_data = {\\n 'Year': [2018, 2019, 2020, 2021, 2022, 2023],\\n 'GDP (Billion USD)': [2851.41, 2697.81, 3141.51, None, None]\\n}\\n\\n# Plot a line graph\\nplt.figure(figsize=(10, 5))\\nplt.plot(gdp_data['Year'], gdp_data['GDP (Billion USD)'], marker='o')\\n\\n# Title and labels\\nplt.title('UK GDP from 2018 to 2023')\\nplt.xlabel('Year')\\nplt.ylabel('GDP (Billion USD)')\\n\\n# Show grid\\nplt.grid(True)\\n\\n# Display the graph\\nplt.show()\\n```\\nStdout: ValueError('x and y must have same first dimension, but have shapes (6,) and (5,)')\\n\\nIf you have completed all tasks, respond with FINAL ANSWER.\", name='python_repl', tool_call_id='call_JPVxDAzEFi21crVT7Rt6SRJl')]}}\n", "----\n" @@ -281,11 +281,11 @@ "name": "stdout", "output_type": "stream", "text": [ - "{'chart_generator': {'messages': [AIMessage(content=\"Unfortunately, I made an error in the provided code. There was a mismatch in the dimensions of the 'Year' and 'GDP (Billion USD)' data arrays, which caused a ValueError. Additionally, I mistakenly included placeholders for the years 2022 and 2023 without having the actual GDP data for those years.\\n\\nLet's correct this and generate a line graph with the data we have up to 2021. I will revise the code to only include the years for which we have data, and then we can create the graph accordingly.\", additional_kwargs={'tool_calls': [{'id': 'call_1zGQMGouC0oFQJRUkNPvs9zX', 'function': {'arguments': '{\"code\":\"import matplotlib.pyplot as plt\\\\n\\\\n# UK GDP data obtained from search results for 2018-2021 (in billion USD)\\\\n# No data for 2022 and 2023 are available\\\\n# Note: 2021 data is used as a placeholder and should be updated when actual figures are available\\\\ngdp_data = {\\\\n \\'Year\\': [2018, 2019, 2020, 2021],\\\\n \\'GDP (Billion USD)\\': [2851.41, 2851.41, 2697.81, 3141.51]\\\\n}\\\\n\\\\n# Plot a line graph\\\\nplt.figure(figsize=(10, 5))\\\\nplt.plot(gdp_data[\\'Year\\'], gdp_data[\\'GDP (Billion USD)\\'], marker=\\'o\\')\\\\n\\\\n# Title and labels\\\\nplt.title(\\'UK GDP from 2018 to 2021\\')\\\\nplt.xlabel(\\'Year\\')\\\\nplt.ylabel(\\'GDP (Billion USD)\\')\\\\n\\\\n# Show grid\\\\nplt.grid(True)\\\\n\\\\n# Display the graph\\\\nplt.show()\"}', 'name': 'python_repl'}, 'type': 'function'}]}, response_metadata={'token_usage': {'completion_tokens': 359, 'prompt_tokens': 12796, 'total_tokens': 13155}, 'model_name': 'gpt-4-1106-preview', 'system_fingerprint': None, 'finish_reason': 'tool_calls', 'logprobs': None}, name='chart_generator', id='run-0d4a67d2-696a-4955-990b-9a9d775b7635-0', tool_calls=[{'name': 'python_repl', 'args': {'code': \"import matplotlib.pyplot as plt\\n\\n# UK GDP data obtained from search results for 2018-2021 (in billion USD)\\n# No data for 2022 and 2023 are available\\n# Note: 2021 data is used as a placeholder and should be updated when actual figures are available\\ngdp_data = {\\n 'Year': [2018, 2019, 2020, 2021],\\n 'GDP (Billion USD)': [2851.41, 2851.41, 2697.81, 3141.51]\\n}\\n\\n# Plot a line graph\\nplt.figure(figsize=(10, 5))\\nplt.plot(gdp_data['Year'], gdp_data['GDP (Billion USD)'], marker='o')\\n\\n# Title and labels\\nplt.title('UK GDP from 2018 to 2021')\\nplt.xlabel('Year')\\nplt.ylabel('GDP (Billion USD)')\\n\\n# Show grid\\nplt.grid(True)\\n\\n# Display the graph\\nplt.show()\"}, 'id': 'call_1zGQMGouC0oFQJRUkNPvs9zX'}])], 'sender': 'chart_generator'}}\n", + "{'chart_generator': {'messages': [AIMessage(content=\"Unfortunately, I made an error in the provided code. There was a mismatch in the dimensions of the 'Year' and 'GDP (Billion USD)' data arrays, which caused a ValueError. Additionally, I mistakenly included placeholders for the years 2022 and 2023 without having the actual GDP data for those years.\\n\\nLet's correct this and generate a line graph with the data we have up to 2021. I will revise the code to only include the years for which we have data, and then we can create the graph accordingly.\", additional_kwargs={'tool_calls': [{'id': 'call_1zGQMGouC0oFQJRUkNPvs9zX', 'function': {'arguments': '{\"code\":\"import matplotlib.pyplot as plt\\\\n\\\\n# UK GDP data obtained from search results for 2018-2021 (in billion USD)\\\\n# No data for 2022 and 2023 are available\\\\n# Note: 2021 data is used as a placeholder and should be updated when actual figures are available\\\\ngdp_data = {\\\\n \\'Year\\': [2018, 2019, 2020, 2021],\\\\n \\'GDP (Billion USD)\\': [2851.41, 2851.41, 2697.81, 3141.51]\\\\n}\\\\n\\\\n# Plot a line graph\\\\nplt.figure(figsize=(10, 5))\\\\nplt.plot(gdp_data[\\'Year\\'], gdp_data[\\'GDP (Billion USD)\\'], marker=\\'o\\')\\\\n\\\\n# Title and labels\\\\nplt.title(\\'UK GDP from 2018 to 2021\\')\\\\nplt.xlabel(\\'Year\\')\\\\nplt.ylabel(\\'GDP (Billion USD)\\')\\\\n\\\\n# Show grid\\\\nplt.grid(True)\\\\n\\\\n# Display the graph\\\\nplt.show()\"}', 'name': 'python_repl'}, 'type': 'function'}]}, response_metadata={'token_usage': {'completion_tokens': 359, 'prompt_tokens': 12796, 'total_tokens': 13155}, 'model_name': 'gpt-4o', 'system_fingerprint': None, 'finish_reason': 'tool_calls', 'logprobs': None}, name='chart_generator', id='run-0d4a67d2-696a-4955-990b-9a9d775b7635-0', tool_calls=[{'name': 'python_repl', 'args': {'code': \"import matplotlib.pyplot as plt\\n\\n# UK GDP data obtained from search results for 2018-2021 (in billion USD)\\n# No data for 2022 and 2023 are available\\n# Note: 2021 data is used as a placeholder and should be updated when actual figures are available\\ngdp_data = {\\n 'Year': [2018, 2019, 2020, 2021],\\n 'GDP (Billion USD)': [2851.41, 2851.41, 2697.81, 3141.51]\\n}\\n\\n# Plot a line graph\\nplt.figure(figsize=(10, 5))\\nplt.plot(gdp_data['Year'], gdp_data['GDP (Billion USD)'], marker='o')\\n\\n# Title and labels\\nplt.title('UK GDP from 2018 to 2021')\\nplt.xlabel('Year')\\nplt.ylabel('GDP (Billion USD)')\\n\\n# Show grid\\nplt.grid(True)\\n\\n# Display the graph\\nplt.show()\"}, 'id': 'call_1zGQMGouC0oFQJRUkNPvs9zX'}])], 'sender': 'chart_generator'}}\n", "----\n", "{'call_tool': {'messages': [ToolMessage(content=\"Successfully executed:\\n```python\\nimport matplotlib.pyplot as plt\\n\\n# UK GDP data obtained from search results for 2018-2021 (in billion USD)\\n# No data for 2022 and 2023 are available\\n# Note: 2021 data is used as a placeholder and should be updated when actual figures are available\\ngdp_data = {\\n 'Year': [2018, 2019, 2020, 2021],\\n 'GDP (Billion USD)': [2851.41, 2851.41, 2697.81, 3141.51]\\n}\\n\\n# Plot a line graph\\nplt.figure(figsize=(10, 5))\\nplt.plot(gdp_data['Year'], gdp_data['GDP (Billion USD)'], marker='o')\\n\\n# Title and labels\\nplt.title('UK GDP from 2018 to 2021')\\nplt.xlabel('Year')\\nplt.ylabel('GDP (Billion USD)')\\n\\n# Show grid\\nplt.grid(True)\\n\\n# Display the graph\\nplt.show()\\n```\\nStdout: \\n\\nIf you have completed all tasks, respond with FINAL ANSWER.\", name='python_repl', tool_call_id='call_1zGQMGouC0oFQJRUkNPvs9zX')]}}\n", "----\n", - "{'chart_generator': {'messages': [AIMessage(content=\"FINAL ANSWER\\n\\nI have generated a line graph for the UK's GDP from 2018 to 2021 using the available data. Unfortunately, due to the lack of data for 2022 and 2023, the graph only includes figures up to 2021. Here is the graph:\\n\\n[Graph Image]\\n\\nPlease note that the data for 2022 and 2023 should be added to this graph once it becomes available to complete the analysis for the past five years.\", response_metadata={'token_usage': {'completion_tokens': 99, 'prompt_tokens': 13412, 'total_tokens': 13511}, 'model_name': 'gpt-4-1106-preview', 'system_fingerprint': None, 'finish_reason': 'stop', 'logprobs': None}, name='chart_generator', id='run-3474a61c-0773-4e44-bd6e-2e88cf56bb90-0')], 'sender': 'chart_generator'}}\n", + "{'chart_generator': {'messages': [AIMessage(content=\"FINAL ANSWER\\n\\nI have generated a line graph for the UK's GDP from 2018 to 2021 using the available data. Unfortunately, due to the lack of data for 2022 and 2023, the graph only includes figures up to 2021. Here is the graph:\\n\\n[Graph Image]\\n\\nPlease note that the data for 2022 and 2023 should be added to this graph once it becomes available to complete the analysis for the past five years.\", response_metadata={'token_usage': {'completion_tokens': 99, 'prompt_tokens': 13412, 'total_tokens': 13511}, 'model_name': 'gpt-4o', 'system_fingerprint': None, 'finish_reason': 'stop', 'logprobs': None}, name='chart_generator', id='run-3474a61c-0773-4e44-bd6e-2e88cf56bb90-0')], 'sender': 'chart_generator'}}\n", "----\n" ] } diff --git a/examples/pass_private_state.ipynb b/examples/pass_private_state.ipynb index d34ecc7e1..b790e312e 100644 --- a/examples/pass_private_state.ipynb +++ b/examples/pass_private_state.ipynb @@ -92,14 +92,6 @@ "\n", "graph.invoke({\"question\": \"foo\"})" ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "3ffc2d8c-717f-42c9-b0aa-15b178a5cc8b", - "metadata": {}, - "outputs": [], - "source": [] } ], "metadata": { diff --git a/examples/persistence.ipynb b/examples/persistence.ipynb index 715f7c0b5..376706da5 100644 --- a/examples/persistence.ipynb +++ b/examples/persistence.ipynb @@ -561,14 +561,6 @@ "):\n", " event[\"messages\"][-1].pretty_print()" ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "eb20430f", - "metadata": {}, - "outputs": [], - "source": [] } ], "metadata": { diff --git a/examples/rag/langgraph_agentic_rag.ipynb b/examples/rag/langgraph_agentic_rag.ipynb index 73d02f14a..56c4e7f30 100644 --- a/examples/rag/langgraph_agentic_rag.ipynb +++ b/examples/rag/langgraph_agentic_rag.ipynb @@ -500,14 +500,6 @@ " pprint.pprint(value, indent=2, width=80, depth=None)\n", " pprint.pprint(\"\\n---\\n\")" ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "189333cc-5d34-4869-9f9b-741210e1096f", - "metadata": {}, - "outputs": [], - "source": [] } ], "metadata": { diff --git a/examples/self-discover/self-discover.ipynb b/examples/self-discover/self-discover.ipynb index 9c4dbfeef..2ac5ca8fa 100644 --- a/examples/self-discover/self-discover.ipynb +++ b/examples/self-discover/self-discover.ipynb @@ -246,14 +246,6 @@ "):\n", " print(s)" ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "20cac598", - "metadata": {}, - "outputs": [], - "source": [] } ], "metadata": { diff --git a/examples/state-context-key.ipynb b/examples/state-context-key.ipynb index 3b6191fe6..e487106b2 100644 --- a/examples/state-context-key.ipynb +++ b/examples/state-context-key.ipynb @@ -465,14 +465,6 @@ "for chunk in app.stream(inputs, stream_mode=\"values\"):\n", " chunk[\"messages\"][-1].pretty_print()" ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "296c7456-da05-4326-95dc-47d6b312da9d", - "metadata": {}, - "outputs": [], - "source": [] } ], "metadata": { diff --git a/examples/state-model.ipynb b/examples/state-model.ipynb index 897c3c571..9487c9801 100644 --- a/examples/state-model.ipynb +++ b/examples/state-model.ipynb @@ -439,14 +439,6 @@ "for chunk in app.stream(inputs, stream_mode=\"values\"):\n", " chunk[\"messages\"][-1].pretty_print()" ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "296c7456-da05-4326-95dc-47d6b312da9d", - "metadata": {}, - "outputs": [], - "source": [] } ], "metadata": { diff --git a/examples/stream-multiple.ipynb b/examples/stream-multiple.ipynb index 1fa7e8533..79c14af1b 100644 --- a/examples/stream-multiple.ipynb +++ b/examples/stream-multiple.ipynb @@ -50,7 +50,7 @@ "metadata": {}, "outputs": [ { - "name": "stdin", + "name": "stdout", "output_type": "stream", "text": [ "OPENAI_API_KEY: ········\n" @@ -175,14 +175,6 @@ " print(chunk)\n", " print(\"\\n\\n\")" ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "8cc57240-243c-4d9a-a845-cb55ef973a59", - "metadata": {}, - "outputs": [], - "source": [] } ], "metadata": { diff --git a/examples/stream-updates.ipynb b/examples/stream-updates.ipynb index 95d99ba4f..371883fc2 100644 --- a/examples/stream-updates.ipynb +++ b/examples/stream-updates.ipynb @@ -55,7 +55,7 @@ "metadata": {}, "outputs": [ { - "name": "stdin", + "name": "stdout", "output_type": "stream", "text": [ "OPENAI_API_KEY: ········\n" @@ -151,14 +151,6 @@ " print(values)\n", " print(\"\\n\\n\")" ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "8cc57240-243c-4d9a-a845-cb55ef973a59", - "metadata": {}, - "outputs": [], - "source": [] } ], "metadata": { diff --git a/examples/streaming-content.ipynb b/examples/streaming-content.ipynb index 8c2c7ab36..76117c029 100644 --- a/examples/streaming-content.ipynb +++ b/examples/streaming-content.ipynb @@ -120,14 +120,6 @@ " # So we only print non-empty content\n", " print(data, end=\"|\")" ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "615cb9d2-bfa2-4f83-90b0-c6c2d1e6df95", - "metadata": {}, - "outputs": [], - "source": [] } ], "metadata": { diff --git a/examples/web-navigation/web_voyager.ipynb b/examples/web-navigation/web_voyager.ipynb index 8959d2025..dae64975a 100644 --- a/examples/web-navigation/web_voyager.ipynb +++ b/examples/web-navigation/web_voyager.ipynb @@ -751,14 +751,6 @@ ")\n", "print(f\"Final response: {res}\")" ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "dcb656d9-fff5-42b0-9b16-60716a51ca0b", - "metadata": {}, - "outputs": [], - "source": [] } ], "metadata": {