From 56cecdb3cb8b3aa047d84eabd9685952e56688b4 Mon Sep 17 00:00:00 2001 From: William Fu-Hinthorn <13333726+hinthornw@users.noreply.github.com> Date: Mon, 15 Jan 2024 16:56:03 -0800 Subject: [PATCH 01/18] Add LLMCompiler --- examples/LLMCompiler.ipynb | 957 +++++++++++++++++++++++++++++++++++++ 1 file changed, 957 insertions(+) create mode 100644 examples/LLMCompiler.ipynb diff --git a/examples/LLMCompiler.ipynb b/examples/LLMCompiler.ipynb new file mode 100644 index 000000000..ca73266b2 --- /dev/null +++ b/examples/LLMCompiler.ipynb @@ -0,0 +1,957 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "0c8b472b-f3fb-46c2-841f-930a4692697b", + "metadata": {}, + "source": [ + "# Implementing LLMCompiler using LangGraph\n", + "By Kim, et. al [đŸ”—](https://arxiv.org/abs/2312.04511)\n", + "\n", + "LLMCompiler is an agent architecture intented on speeding up the latency of agentic tasks via fast, parallel tool execution.\n", + "\n", + "It has 3 main components:\n", + "\n", + "1. Planner: generate a DAG of tasks.\n", + "2. Task Fetching Unit: schedules and executes the tasks\n", + "3. Joiner: Responds to the user or triggers a second plan." + ] + }, + { + "cell_type": "markdown", + "id": "1abdedbd-d81b-4ee9-b46f-f29439ed1350", + "metadata": {}, + "source": [ + "# Part 1: Planner" + ] + }, + { + "cell_type": "markdown", + "id": "278f76b0-a2e1-42dc-bd3e-6f624984e3dd", + "metadata": {}, + "source": [ + "#### Output Parser\n", + "\n", + "Parses task lists in the following form:\n", + "```plaintext\n", + "1. tool_1(\"arg1\", 3.5, ...)\n", + "Thought: I then want to find out Y by using tool_2\n", + "2. tool_2(\"\", ${1})'\n", + "3. join()\"\n", + "```\n", + "\n", + "The \"Thought\" lines are optional. The `${#}` placeholders are variables. These are used to route tool (task) outputs to other tools." + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "id": "cc71b6c4-d701-4217-9701-95ac0857e4e1", + "metadata": {}, + "outputs": [], + "source": [ + "import ast\n", + "import json\n", + "import re\n", + "from typing import Any, Optional, Sequence, Union\n", + "\n", + "from langchain.agents.agent import AgentOutputParser\n", + "from langchain.schema import OutputParserException\n", + "from langchain_core.tools import BaseTool\n", + "\n", + "THOUGHT_PATTERN = r\"Thought: ([^\\n]*)\"\n", + "# ACTION_PATTERN = r\"\\n*(\\d+)\\. (.*?})(\\s*#\\w+\\n)?\"\n", + "# $1 or ${1} -> 1\n", + "ID_PATTERN = r\"\\$\\{?(\\d+)\\}?\"\n", + "END_OF_PLAN = \"\"\n", + "\n", + "\n", + "class ActionParserFSM:\n", + " def __init__(self):\n", + " self.reset()\n", + "\n", + " def reset(self):\n", + " self.state = \"START\"\n", + " self.task_index = \"\"\n", + " self.action = \"\"\n", + " self.comment = \"\"\n", + " self.bracket_count = 0\n", + " self.actions = []\n", + "\n", + " def parse(self, text: str):\n", + " for char in text:\n", + " action = self.process_char(char)\n", + " if action:\n", + " yield action\n", + " action = self.save_action()\n", + " if action:\n", + " yield action\n", + "\n", + " def process_char(self, char: str) -> Optional[dict]:\n", + " action = None\n", + " if self.state == \"START\":\n", + " if char.isdigit():\n", + " self.state = \"NUMBER\"\n", + " self.task_index += char\n", + " elif char == \"\\n\":\n", + " self.reset()\n", + " elif self.state == \"NUMBER\":\n", + " if char == \".\":\n", + " self.state = \"ACTION\"\n", + " elif char.isdigit():\n", + " self.task_index += char\n", + " else:\n", + " self.reset()\n", + " elif self.state == \"ACTION\":\n", + " if char == \"{\":\n", + " self.bracket_count += 1\n", + " elif char == \"}\":\n", + " self.bracket_count -= 1\n", + " if self.bracket_count == 0:\n", + " self.state = \"COMMENT\"\n", + " self.action += char\n", + " elif self.state == \"COMMENT\":\n", + " if char == \"\\n\":\n", + " action = self.save_action()\n", + " self.reset()\n", + " else:\n", + " self.comment += char\n", + " return action\n", + "\n", + " def save_action(self):\n", + " if self.task_index and self.action:\n", + " parsed_action = json.loads(self.action.strip())\n", + " tool_name, args = next(iter(parsed_action.items()))\n", + " return {\n", + " \"task_index\": int(self.task_index),\n", + " \"tool_name\": tool_name,\n", + " \"args\": args,\n", + " }\n", + "\n", + "\n", + "class LLMCompilerPlanParser(AgentOutputParser, extra=\"allow\"):\n", + " \"\"\"Planning output parser.\"\"\"\n", + "\n", + " def __init__(self, tools: Sequence[BaseTool], **kwargs):\n", + " super().__init__(**kwargs)\n", + " self.tools = tools\n", + "\n", + " def parse(self, text: str) -> list[str]:\n", + " parser = ActionParserFSM()\n", + " graph_dict = {}\n", + " for task in parser.parse(text):\n", + " idx = int(task[\"task_index\"])\n", + "\n", + " task = instantiate_task(\n", + " tools=self.tools,\n", + " idx=idx,\n", + " tool_name=task[\"tool_name\"],\n", + " args=task[\"args\"],\n", + " )\n", + "\n", + " graph_dict[idx] = task\n", + " if task[\"tool\"] == \"join\":\n", + " break\n", + "\n", + " return graph_dict\n", + "\n", + "\n", + "### Helper functions\n", + "\n", + "\n", + "def default_dependency_rule(idx, args: str):\n", + " matches = re.findall(ID_PATTERN, args)\n", + " numbers = [int(match) for match in matches]\n", + " return idx in numbers\n", + "\n", + "\n", + "def _get_dependencies_from_graph(\n", + " idx: int, tool_name: str, args: Sequence[Any]\n", + ") -> dict[str, list[str]]:\n", + " \"\"\"Get dependencies from a graph.\"\"\"\n", + " if tool_name == \"join\":\n", + " return list(range(1, idx))\n", + " return [i for i in range(1, idx) if default_dependency_rule(i, str(args))]\n", + "\n", + "\n", + "def instantiate_task(\n", + " tools: Sequence[BaseTool],\n", + " idx: int,\n", + " tool_name: str,\n", + " args: Union[dict, str, bool, None],\n", + ") -> dict:\n", + " dependencies = _get_dependencies_from_graph(idx, tool_name, args)\n", + " if tool_name == \"join\":\n", + " tool = \"join\"\n", + " else:\n", + " try:\n", + " tool = tools[[tool.name for tool in tools].index(tool_name)]\n", + " except ValueError as e:\n", + " raise OutputParserException(f\"Tool {tool_name} not found.\")\n", + " return dict(\n", + " tool=tool,\n", + " args=args,\n", + " dependencies=dependencies,\n", + " )" + ] + }, + { + "cell_type": "markdown", + "id": "228a2f75-68b1-4dbf-95dc-4bfc738c3b3b", + "metadata": {}, + "source": [ + "#### Planner Code\n", + "\n", + "This takes the input and outputs a plan." + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "id": "58af9746-1011-41e9-a77a-be9cef202aea", + "metadata": {}, + "outputs": [], + "source": [ + "import asyncio\n", + "import json\n", + "import re\n", + "from typing import Any, Optional, Sequence, Union\n", + "from uuid import UUID\n", + "\n", + "from langchain.callbacks.base import AsyncCallbackHandler, Callbacks\n", + "from langchain.chat_models.base import BaseChatModel\n", + "from langchain.schema import LLMResult\n", + "from langchain.schema.messages import HumanMessage, SystemMessage\n", + "from langchain_core.prompts import ChatPromptTemplate\n", + "from langchain_core.pydantic_v1 import BaseModel\n", + "from langchain_core.runnables import RunnableBranch\n", + "from langchain_core.tools import BaseTool\n", + "\n", + "END_OF_PLAN = \"\"\n", + "\n", + "JOINER_FINISH = \"Finish\"\n", + "JOINER_REPLAN = \"Replan\"\n", + "\n", + "\n", + "JOIN_DESCRIPTION = (\n", + " \"join():\\n\"\n", + " \" - Collects and combines results from prior actions.\\n\"\n", + " \" - A LLM agent is called upon invoking join to either finalize the user query or wait until the plans are executed.\\n\"\n", + " \" - join should always be the last action in the plan, and will be called in two scenarios:\\n\"\n", + " \" (a) if the answer can be determined by gathering the outputs from tasks to generate the final response.\\n\"\n", + " \" (b) if the answer cannot be determined in the planning phase before you execute the plans. \"\n", + ")\n", + "\n", + "planner_prompt_tmpl_str = (\n", + " \"Given a user query, create a plan to solve it with the utmost parallelizability. \"\n", + " \"Each plan should comprise an action from the following {num_tools} types:\\n\"\n", + " \"{tool_descriptions}\"\n", + " f\"\\n{{num_toolsp1}}. {JOIN_DESCRIPTION}\"\n", + " \"Guidelines:\\n\"\n", + " \" - Each action described above contains input/output types and description.\\n\"\n", + " \" - You must strictly adhere to the input and output types for each action.\\n\"\n", + " \" - The action descriptions contain the guidelines. You MUST strictly follow those guidelines when you use the actions.\\n\"\n", + " \" - Each action in the plan should strictly be one of the above types. Follow the Python conventions for each action.\\n\"\n", + " \" - Pass arguments by keyword ONLY\\n\"\n", + " \" - Each action MUST have a unique ID, which is strictly increasing.\\n\"\n", + " \" - Inputs for actions can either be constants or outputs from preceding actions. \"\n", + " \"In the latter case, use the format $id to denote the ID of the previous action whose output will be the input.\\n\"\n", + " f\" - Always call join as the last action in the plan. Say '{END_OF_PLAN}' after you call join\\n\"\n", + " \" - Ensure the plan maximizes parallelizability.\\n\"\n", + " \" - Only use the provided action types. If a query cannot be addressed using these, invoke the join action for the next steps.\\n\"\n", + " \" - Never explain the plan with comments (e.g. #).\\n\"\n", + " \" - Never introduce new actions other than the ones provided.\\n\\n\"\n", + " \"{replan}\"\n", + " \"{examples}\"\n", + ")\n", + "\n", + "\n", + "def _generate_planner_prompt(\n", + " tools: Sequence[BaseTool],\n", + " example_prompt=str,\n", + "):\n", + " tool_descriptions = \"\\n\".join(\n", + " f\"{i+1}. {tool.description}\" for i, tool in enumerate(tools)\n", + " )\n", + " planner_prompt_template = ChatPromptTemplate.from_messages(\n", + " [(\"system\", planner_prompt_tmpl_str), (\"user\", \"Question: {input}{context}\")]\n", + " ).partial(\n", + " tool_descriptions=tool_descriptions,\n", + " examples=\"Here are some examples:\\n\\n\" + example_prompt\n", + " if example_prompt\n", + " else \"\",\n", + " num_tools=len(tools),\n", + " num_toolsp1=len(tools) + 1,\n", + " )\n", + "\n", + " return planner_prompt_template\n", + "\n", + "\n", + "def create_planner(\n", + " llm: BaseChatModel,\n", + " example_prompt: str,\n", + " example_prompt_replan: str,\n", + " tools: Sequence[Union[BaseTool]],\n", + " stop: Optional[list[str]] = None,\n", + "):\n", + " og_planner_prompt = _generate_planner_prompt(tools, example_prompt).partial(\n", + " replan=\"\",\n", + " context=\"\",\n", + " )\n", + " replanner_prompt = _generate_planner_prompt(tools, example_prompt).partial(\n", + " replan=' - You are given \"Previous Plan\" which is the plan that the previous agent created along with the execution results '\n", + " \"(given as Observation) of each plan and a general thought (given as Thought) about the executed results.\"\n", + " 'You MUST use these information to create the next plan under \"Current Plan\".\\n'\n", + " ' - When starting the Current Plan, you should start with \"Thought\" that outlines the strategy for the next plan.\\n'\n", + " \" - In the Current Plan, you should NEVER repeat the actions that are already executed in the Previous Plan.\\n\"\n", + " )\n", + " bound_llm = llm.bind(stop=stop)\n", + " return (\n", + " RunnableBranch(\n", + " ((lambda x: x.get(\"replan\")), replanner_prompt),\n", + " og_planner_prompt,\n", + " )\n", + " | bound_llm\n", + " | LLMCompilerPlanParser(tools=tools)\n", + " )" + ] + }, + { + "cell_type": "markdown", + "id": "7feb5c82-b1a9-40ae-863a-0362fe3ce5ea", + "metadata": {}, + "source": [ + "#### Example usage\n", + "\n", + "Here's an example usage of the planner module" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "id": "3fe074ea-7314-47a7-9a9f-a8e6191ea1f3", + "metadata": {}, + "outputs": [], + "source": [ + "from langchain.tools import tool\n", + "from langchain_openai import ChatOpenAI\n", + "\n", + "\n", + "@tool\n", + "def get_user_id(first_name: str, last_name: Optional[str] = None):\n", + " \"\"\"Query the user IDs of everyone with the provided name.\"\"\"\n", + " return 4\n", + "\n", + "\n", + "@tool\n", + "def get_scores(class_name: str, user_id: int):\n", + " \"\"\"Query the class registry for grades of the provided user ID.\"\"\"\n", + " return \"A+\"\n", + "\n", + "\n", + "examples = (\n", + " \"Question: What's the user ID for Johnny Drop Tables?\\n\"\n", + " '1. {\"get_user_id\": {\"first_name\": \"Johnny\", \"last_name\":\"Drop Tables\"}}\\n'\n", + " f'2. {{\"join\": null}}{END_OF_PLAN}\\n'\n", + " \"###\\n\"\n", + " \"\\n\"\n", + " \"Question: What was Eric Zhang's score in Calc?\\n\"\n", + " '1. {\"get_user_id\": {\"first_name\": \"Eric\", \"last_name\":\"Zhang\"}}\\n'\n", + " '2. {\"get_scores\": {\"class_name\": \"calc\", \"user_id\": \"$1\"}}\\n'\n", + " f'3. {{\"join\": null}}{END_OF_PLAN}\\n'\n", + " \"###\\n\"\n", + " \"\\n\"\n", + ")\n", + "\n", + "planner = create_planner(\n", + " ChatOpenAI(model=\"gpt-3.5-turbo\"),\n", + " example_prompt=examples,\n", + " example_prompt_replan=\"\",\n", + " tools=[get_user_id, get_scores],\n", + ")" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "id": "55fb0f99-4e59-4e5a-b687-a90bb4d06d39", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "{1: {'tool': StructuredTool(name='get_user_id', description='get_user_id(first_name: str, last_name: Optional[str] = None) - Query the user IDs of everyone with the provided name.', args_schema=, func=),\n", + " 'args': {'first_name': 'Sam', 'last_name': 'Van Damm'},\n", + " 'dependencies': []},\n", + " 2: {'tool': StructuredTool(name='get_user_id', description='get_user_id(first_name: str, last_name: Optional[str] = None) - Query the user IDs of everyone with the provided name.', args_schema=, func=),\n", + " 'args': {'first_name': 'Will', 'last_name': 'Van Damm'},\n", + " 'dependencies': []},\n", + " 3: {'tool': StructuredTool(name='get_scores', description='get_scores(class_name: str, user_id: int) - Query the class registry for grades of the provided user ID.', args_schema=, func=),\n", + " 'args': {'class_name': 'Calc BC', 'user_id': '$1'},\n", + " 'dependencies': [1]},\n", + " 4: {'tool': StructuredTool(name='get_scores', description='get_scores(class_name: str, user_id: int) - Query the class registry for grades of the provided user ID.', args_schema=, func=),\n", + " 'args': {'class_name': 'Calc BC', 'user_id': '$2'},\n", + " 'dependencies': [2]},\n", + " 5: {'tool': 'join', 'args': None, 'dependencies': [1, 2, 3, 4]}}" + ] + }, + "execution_count": 4, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "tasks = planner.invoke(\n", + " {\"input\": \"What are the Calc BC grades for Sam and Will Van Damm?\"}\n", + ")\n", + "tasks" + ] + }, + { + "cell_type": "markdown", + "id": "5d0e795f-61ff-4553-9823-23e7624ca180", + "metadata": {}, + "source": [ + "## 2. Task Fetching Unit\n", + "\n", + "This component scheudles the tasks. In the paper, it's kept separate from the \"executor\", but here we execute the tasks within the same DAG.\n", + "\n", + "Basic idea is that, given a list of dicts of the form:\n", + "\n", + "```typescript\n", + "{\n", + " tool: BaseTool,\n", + " dependencies: number[],\n", + "}\n", + "```\n", + "\n", + "1. Create a topological sort of the tasks\n", + "2. Execute them on the previous step's output, ensuring to perform variable substitution where appropriate" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "id": "c70a0e28-43db-4ea2-af48-8a2f310dce83", + "metadata": {}, + "outputs": [], + "source": [ + "import logging\n", + "\n", + "from langchain_core.agents import AgentFinish\n", + "from langchain_core.runnables import (\n", + " RunnableLambda,\n", + " RunnableParallel,\n", + " RunnablePassthrough,\n", + ")\n", + "from langgraph.graph import END, Graph\n", + "\n", + "logging.basicConfig(level=logging.INFO)\n", + "logger = logging.getLogger()\n", + "\n", + "\n", + "def _sort_tasks(data):\n", + " sorted_tasks = []\n", + " while data:\n", + " no_deps = {k: v for k, v in data.items() if not v[\"dependencies\"]}\n", + " if not no_deps:\n", + " raise ValueError(\"We seem to have run into a circular dependency.\")\n", + "\n", + " sorted_tasks.append(no_deps)\n", + " data = {\n", + " k: {\n", + " **v,\n", + " \"dependencies\": [d for d in v[\"dependencies\"] if d not in no_deps],\n", + " }\n", + " for k, v in data.items()\n", + " if k not in no_deps\n", + " }\n", + " return sorted_tasks\n", + "\n", + "\n", + "def _resolve_arg(x: dict, arg):\n", + " return x[f\"task_{arg[1:]}\"] if isinstance(arg, str) and arg.startswith(\"$\") else arg\n", + "\n", + "\n", + "def _execute_task(task, x, config):\n", + " tool_to_use = task[\"tool\"]\n", + " args = task[\"args\"]\n", + " if isinstance(args, str):\n", + " resolved_args = _resolve_arg(x, args)\n", + " elif isinstance(args, dict):\n", + " resolved_args = {key: _resolve_arg(x, val) for key, val in args.items()}\n", + " else:\n", + " logger.warning(f\"Unsupported arg type: {args}\")\n", + " return tool_to_use.invoke(resolved_args, config)\n", + "\n", + "\n", + "def construct_dag(tasks):\n", + " sorted_tasks = _sort_tasks(tasks)\n", + " chain = None\n", + " for idx, task_group in enumerate(sorted_tasks):\n", + " if len(task_group) == 1 and next(iter(task_group.values()))[\"tool\"] == \"join\":\n", + " # TODO: actually join the values\n", + " step = lambda x: {\"join\": x}\n", + " else:\n", + " # Cascade all results forward\n", + " constructor = (\n", + " RunnableParallel if chain is None else RunnablePassthrough.assign\n", + " )\n", + " step = constructor(\n", + " **{\n", + " f\"task_{idx}\": RunnableLambda(\n", + " lambda x, config: _execute_task(task, x, config)\n", + " ).with_config(run_name=f\"task_{idx}\")\n", + " for idx, task in task_group.items()\n", + " }\n", + " ).with_config(run_name=f\"TaskGroup{idx}\")\n", + " if chain is None:\n", + " chain = step\n", + " else:\n", + " chain |= step\n", + "\n", + " if chain is not None:\n", + " return chain | RunnablePassthrough.assign(tasks=lambda _: tasks)\n", + " return chain" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "id": "6fecaefc-d904-4409-af63-53c5b7a3785f", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + " +------------------------------+ \n", + " | ParallelInput | \n", + " +------------------------------+ \n", + " ***** ***** \n", + " **** **** \n", + " *** *** \n", + " +---------------------------------------+ +---------------------------------------+ \n", + " | Lambda(lambda x, config: _execute_... | | Lambda(lambda x, config: _execute_... | \n", + " +---------------------------------------+ +---------------------------------------+ \n", + " ***** ***** \n", + " **** **** \n", + " *** *** \n", + " +-------------------------------+ \n", + " | ParallelOutput | \n", + " +-------------------------------+ \n", + " * \n", + " * \n", + " * \n", + " +------------------------------+ \n", + " | ParallelInput | \n", + " ****+------------------------------+***** \n", + " ******** * ********* \n", + " ******** * ******** \n", + " ***** * ***** \n", + "+---------------------------------------+ +---------------------------------------+ +-------------+ \n", + "| Lambda(lambda x, config: _execute_... | | Lambda(lambda x, config: _execute_... | ****| Passthrough | \n", + "+---------------------------------------+* +---------------------------------------+ ******** +-------------+ \n", + " ******** * ********* \n", + " ******** * ******** \n", + " ***** * ***** \n", + " +-------------------------------+ \n", + " | ParallelOutput | \n", + " +-------------------------------+ \n", + " * \n", + " * \n", + " * \n", + " +-------------------------------+ \n", + " | Lambda(lambda x: {'join': x}) | \n", + " +-------------------------------+ \n", + " * \n", + " * \n", + " * \n", + " +----------------------+ \n", + " | ParallelInput | \n", + " +----------------------+ \n", + " *** *** \n", + " *** *** \n", + " ** ** \n", + " +-------------------------+ +-------------+ \n", + " | Lambda(lambda _: tasks) | | Passthrough | \n", + " +-------------------------+ +-------------+ \n", + " *** *** \n", + " *** *** \n", + " ** ** \n", + " +-----------------------+ \n", + " | ParallelOutput | \n", + " +-----------------------+ \n" + ] + } + ], + "source": [ + "graph = construct_dag(tasks)\n", + "graph.get_graph().print_ascii()" + ] + }, + { + "cell_type": "markdown", + "id": "9efa15ae-817a-48c6-86ed-16bc112fedc5", + "metadata": {}, + "source": [ + "### Example\n", + "\n", + "We still haven't introduced any cycles in our computation graph, so this is all easily expressed in LCEL." + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "id": "133d124a-0d41-4c6d-a86a-34fa4cb1430f", + "metadata": {}, + "outputs": [], + "source": [ + "chain = planner | construct_dag" + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "id": "55142257-2674-4a47-988e-0d2810917329", + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "INFO:httpx:HTTP Request: POST https://api.openai.com/v1/chat/completions \"HTTP/1.1 200 OK\"\n" + ] + }, + { + "ename": "KeyError", + "evalue": "\"Input to ChatPromptTemplate is missing variables {'input'}. Expected: ['input', 'scratchpad'] Received: ['join', 'tasks', 'scratchpad']\"", + "output_type": "error", + "traceback": [ + "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", + "\u001b[0;31mKeyError\u001b[0m Traceback (most recent call last)", + "Cell \u001b[0;32mIn[15], line 2\u001b[0m\n\u001b[1;32m 1\u001b[0m example_question \u001b[38;5;241m=\u001b[39m \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mDid Aliya get a better score than Roger in Geology?\u001b[39m\u001b[38;5;124m\"\u001b[39m\n\u001b[0;32m----> 2\u001b[0m task_results \u001b[38;5;241m=\u001b[39m \u001b[43mchain\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43minvoke\u001b[49m\u001b[43m(\u001b[49m\u001b[43m{\u001b[49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[38;5;124;43minput\u001b[39;49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[43m:\u001b[49m\u001b[43m \u001b[49m\u001b[43mexample_question\u001b[49m\u001b[43m}\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 3\u001b[0m task_results[\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mjoin\u001b[39m\u001b[38;5;124m\"\u001b[39m]\n", + "File \u001b[0;32m~/code/lc/langgraph/langgraph/pregel/__init__.py:456\u001b[0m, in \u001b[0;36mPregel.invoke\u001b[0;34m(self, input, config, output, **kwargs)\u001b[0m\n\u001b[1;32m 447\u001b[0m \u001b[38;5;28;01mdef\u001b[39;00m \u001b[38;5;21minvoke\u001b[39m(\n\u001b[1;32m 448\u001b[0m \u001b[38;5;28mself\u001b[39m,\n\u001b[1;32m 449\u001b[0m \u001b[38;5;28minput\u001b[39m: Union[\u001b[38;5;28mdict\u001b[39m[\u001b[38;5;28mstr\u001b[39m, Any], Any],\n\u001b[0;32m (...)\u001b[0m\n\u001b[1;32m 453\u001b[0m \u001b[38;5;241m*\u001b[39m\u001b[38;5;241m*\u001b[39mkwargs: Any,\n\u001b[1;32m 454\u001b[0m ) \u001b[38;5;241m-\u001b[39m\u001b[38;5;241m>\u001b[39m Union[\u001b[38;5;28mdict\u001b[39m[\u001b[38;5;28mstr\u001b[39m, Any], Any]:\n\u001b[1;32m 455\u001b[0m latest: Union[\u001b[38;5;28mdict\u001b[39m[\u001b[38;5;28mstr\u001b[39m, Any], Any] \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;01mNone\u001b[39;00m\n\u001b[0;32m--> 456\u001b[0m \u001b[43m \u001b[49m\u001b[38;5;28;43;01mfor\u001b[39;49;00m\u001b[43m \u001b[49m\u001b[43mchunk\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;129;43;01min\u001b[39;49;00m\u001b[43m \u001b[49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mstream\u001b[49m\u001b[43m(\u001b[49m\n\u001b[1;32m 457\u001b[0m \u001b[43m \u001b[49m\u001b[38;5;28;43minput\u001b[39;49m\u001b[43m,\u001b[49m\n\u001b[1;32m 458\u001b[0m \u001b[43m \u001b[49m\u001b[43mconfig\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 459\u001b[0m \u001b[43m \u001b[49m\u001b[43moutput\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43moutput\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;28;43;01mif\u001b[39;49;00m\u001b[43m \u001b[49m\u001b[43moutput\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;129;43;01mis\u001b[39;49;00m\u001b[43m \u001b[49m\u001b[38;5;129;43;01mnot\u001b[39;49;00m\u001b[43m \u001b[49m\u001b[38;5;28;43;01mNone\u001b[39;49;00m\u001b[43m \u001b[49m\u001b[38;5;28;43;01melse\u001b[39;49;00m\u001b[43m \u001b[49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43moutput\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 460\u001b[0m \u001b[43m \u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43mkwargs\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 461\u001b[0m \u001b[43m \u001b[49m\u001b[43m)\u001b[49m\u001b[43m:\u001b[49m\n\u001b[1;32m 462\u001b[0m \u001b[43m \u001b[49m\u001b[43mlatest\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43m \u001b[49m\u001b[43mchunk\u001b[49m\n\u001b[1;32m 463\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m latest\n", + "File \u001b[0;32m~/code/lc/langgraph/langgraph/pregel/__init__.py:483\u001b[0m, in \u001b[0;36mPregel.transform\u001b[0;34m(self, input, config, output, **kwargs)\u001b[0m\n\u001b[1;32m 475\u001b[0m \u001b[38;5;28;01mdef\u001b[39;00m \u001b[38;5;21mtransform\u001b[39m(\n\u001b[1;32m 476\u001b[0m \u001b[38;5;28mself\u001b[39m,\n\u001b[1;32m 477\u001b[0m \u001b[38;5;28minput\u001b[39m: Iterator[Union[\u001b[38;5;28mdict\u001b[39m[\u001b[38;5;28mstr\u001b[39m, Any], Any]],\n\u001b[0;32m (...)\u001b[0m\n\u001b[1;32m 481\u001b[0m \u001b[38;5;241m*\u001b[39m\u001b[38;5;241m*\u001b[39mkwargs: Any,\n\u001b[1;32m 482\u001b[0m ) \u001b[38;5;241m-\u001b[39m\u001b[38;5;241m>\u001b[39m Iterator[Union[\u001b[38;5;28mdict\u001b[39m[\u001b[38;5;28mstr\u001b[39m, Any], Any]]:\n\u001b[0;32m--> 483\u001b[0m \u001b[43m \u001b[49m\u001b[38;5;28;43;01mfor\u001b[39;49;00m\u001b[43m \u001b[49m\u001b[43mchunk\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;129;43;01min\u001b[39;49;00m\u001b[43m \u001b[49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43m_transform_stream_with_config\u001b[49m\u001b[43m(\u001b[49m\n\u001b[1;32m 484\u001b[0m \u001b[43m \u001b[49m\u001b[38;5;28;43minput\u001b[39;49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43m_transform\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mconfig\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43moutput\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43moutput\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43mkwargs\u001b[49m\n\u001b[1;32m 485\u001b[0m \u001b[43m \u001b[49m\u001b[43m)\u001b[49m\u001b[43m:\u001b[49m\n\u001b[1;32m 486\u001b[0m \u001b[43m \u001b[49m\u001b[38;5;28;43;01myield\u001b[39;49;00m\u001b[43m \u001b[49m\u001b[43mchunk\u001b[49m\n", + "File \u001b[0;32m~/.pyenv/versions/3.11.2/lib/python3.11/site-packages/langchain_core/runnables/base.py:1226\u001b[0m, in \u001b[0;36mRunnable._transform_stream_with_config\u001b[0;34m(self, input, transformer, config, run_type, **kwargs)\u001b[0m\n\u001b[1;32m 1224\u001b[0m \u001b[38;5;28;01mtry\u001b[39;00m:\n\u001b[1;32m 1225\u001b[0m \u001b[38;5;28;01mwhile\u001b[39;00m \u001b[38;5;28;01mTrue\u001b[39;00m:\n\u001b[0;32m-> 1226\u001b[0m chunk: Output \u001b[38;5;241m=\u001b[39m \u001b[43mcontext\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mrun\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;28;43mnext\u001b[39;49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43miterator\u001b[49m\u001b[43m)\u001b[49m \u001b[38;5;66;03m# type: ignore\u001b[39;00m\n\u001b[1;32m 1227\u001b[0m \u001b[38;5;28;01myield\u001b[39;00m chunk\n\u001b[1;32m 1228\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m final_output_supported:\n", + "File \u001b[0;32m~/code/lc/langgraph/langgraph/pregel/__init__.py:301\u001b[0m, in \u001b[0;36mPregel._transform\u001b[0;34m(self, input, run_manager, config, output)\u001b[0m\n\u001b[1;32m 291\u001b[0m done, inflight \u001b[38;5;241m=\u001b[39m concurrent\u001b[38;5;241m.\u001b[39mfutures\u001b[38;5;241m.\u001b[39mwait(\n\u001b[1;32m 292\u001b[0m [\n\u001b[1;32m 293\u001b[0m executor\u001b[38;5;241m.\u001b[39msubmit(proc\u001b[38;5;241m.\u001b[39minvoke, \u001b[38;5;28minput\u001b[39m, config)\n\u001b[0;32m (...)\u001b[0m\n\u001b[1;32m 297\u001b[0m timeout\u001b[38;5;241m=\u001b[39m\u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mstep_timeout,\n\u001b[1;32m 298\u001b[0m )\n\u001b[1;32m 300\u001b[0m \u001b[38;5;66;03m# interrupt on failure or timeout\u001b[39;00m\n\u001b[0;32m--> 301\u001b[0m \u001b[43m_interrupt_or_proceed\u001b[49m\u001b[43m(\u001b[49m\u001b[43mdone\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43minflight\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mstep\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 303\u001b[0m \u001b[38;5;66;03m# apply writes to channels\u001b[39;00m\n\u001b[1;32m 304\u001b[0m _apply_writes(checkpoint, channels, pending_writes, config, step \u001b[38;5;241m+\u001b[39m \u001b[38;5;241m1\u001b[39m)\n", + "File \u001b[0;32m~/code/lc/langgraph/langgraph/pregel/__init__.py:548\u001b[0m, in \u001b[0;36m_interrupt_or_proceed\u001b[0;34m(done, inflight, step)\u001b[0m\n\u001b[1;32m 546\u001b[0m inflight\u001b[38;5;241m.\u001b[39mpop()\u001b[38;5;241m.\u001b[39mcancel()\n\u001b[1;32m 547\u001b[0m \u001b[38;5;66;03m# raise the exception\u001b[39;00m\n\u001b[0;32m--> 548\u001b[0m \u001b[38;5;28;01mraise\u001b[39;00m exc\n\u001b[1;32m 549\u001b[0m \u001b[38;5;66;03m# TODO this is where retry of an entire step would happen\u001b[39;00m\n\u001b[1;32m 551\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m inflight:\n\u001b[1;32m 552\u001b[0m \u001b[38;5;66;03m# if we got here means we timed out\u001b[39;00m\n", + "File \u001b[0;32m~/.pyenv/versions/3.11.2/lib/python3.11/concurrent/futures/thread.py:58\u001b[0m, in \u001b[0;36m_WorkItem.run\u001b[0;34m(self)\u001b[0m\n\u001b[1;32m 55\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m\n\u001b[1;32m 57\u001b[0m \u001b[38;5;28;01mtry\u001b[39;00m:\n\u001b[0;32m---> 58\u001b[0m result \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mfn\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43margs\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mkwargs\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 59\u001b[0m \u001b[38;5;28;01mexcept\u001b[39;00m \u001b[38;5;167;01mBaseException\u001b[39;00m \u001b[38;5;28;01mas\u001b[39;00m exc:\n\u001b[1;32m 60\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mfuture\u001b[38;5;241m.\u001b[39mset_exception(exc)\n", + "File \u001b[0;32m~/.pyenv/versions/3.11.2/lib/python3.11/site-packages/langchain_core/runnables/base.py:3596\u001b[0m, in \u001b[0;36mRunnableBindingBase.invoke\u001b[0;34m(self, input, config, **kwargs)\u001b[0m\n\u001b[1;32m 3590\u001b[0m \u001b[38;5;28;01mdef\u001b[39;00m \u001b[38;5;21minvoke\u001b[39m(\n\u001b[1;32m 3591\u001b[0m \u001b[38;5;28mself\u001b[39m,\n\u001b[1;32m 3592\u001b[0m \u001b[38;5;28minput\u001b[39m: Input,\n\u001b[1;32m 3593\u001b[0m config: Optional[RunnableConfig] \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;01mNone\u001b[39;00m,\n\u001b[1;32m 3594\u001b[0m \u001b[38;5;241m*\u001b[39m\u001b[38;5;241m*\u001b[39mkwargs: Optional[Any],\n\u001b[1;32m 3595\u001b[0m ) \u001b[38;5;241m-\u001b[39m\u001b[38;5;241m>\u001b[39m Output:\n\u001b[0;32m-> 3596\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mbound\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43minvoke\u001b[49m\u001b[43m(\u001b[49m\n\u001b[1;32m 3597\u001b[0m \u001b[43m \u001b[49m\u001b[38;5;28;43minput\u001b[39;49m\u001b[43m,\u001b[49m\n\u001b[1;32m 3598\u001b[0m \u001b[43m \u001b[49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43m_merge_configs\u001b[49m\u001b[43m(\u001b[49m\u001b[43mconfig\u001b[49m\u001b[43m)\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 3599\u001b[0m \u001b[43m \u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43m{\u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mkwargs\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43mkwargs\u001b[49m\u001b[43m}\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 3600\u001b[0m \u001b[43m \u001b[49m\u001b[43m)\u001b[49m\n", + "File \u001b[0;32m~/.pyenv/versions/3.11.2/lib/python3.11/site-packages/langchain_core/runnables/base.py:1774\u001b[0m, in \u001b[0;36mRunnableSequence.invoke\u001b[0;34m(self, input, config)\u001b[0m\n\u001b[1;32m 1772\u001b[0m \u001b[38;5;28;01mtry\u001b[39;00m:\n\u001b[1;32m 1773\u001b[0m \u001b[38;5;28;01mfor\u001b[39;00m i, step \u001b[38;5;129;01min\u001b[39;00m \u001b[38;5;28menumerate\u001b[39m(\u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39msteps):\n\u001b[0;32m-> 1774\u001b[0m \u001b[38;5;28minput\u001b[39m \u001b[38;5;241m=\u001b[39m \u001b[43mstep\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43minvoke\u001b[49m\u001b[43m(\u001b[49m\n\u001b[1;32m 1775\u001b[0m \u001b[43m \u001b[49m\u001b[38;5;28;43minput\u001b[39;49m\u001b[43m,\u001b[49m\n\u001b[1;32m 1776\u001b[0m \u001b[43m \u001b[49m\u001b[38;5;66;43;03m# mark each step as a child run\u001b[39;49;00m\n\u001b[1;32m 1777\u001b[0m \u001b[43m \u001b[49m\u001b[43mpatch_config\u001b[49m\u001b[43m(\u001b[49m\n\u001b[1;32m 1778\u001b[0m \u001b[43m \u001b[49m\u001b[43mconfig\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mcallbacks\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mrun_manager\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mget_child\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;124;43mf\u001b[39;49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[38;5;124;43mseq:step:\u001b[39;49m\u001b[38;5;132;43;01m{\u001b[39;49;00m\u001b[43mi\u001b[49m\u001b[38;5;241;43m+\u001b[39;49m\u001b[38;5;241;43m1\u001b[39;49m\u001b[38;5;132;43;01m}\u001b[39;49;00m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[43m)\u001b[49m\n\u001b[1;32m 1779\u001b[0m \u001b[43m \u001b[49m\u001b[43m)\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 1780\u001b[0m \u001b[43m \u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 1781\u001b[0m \u001b[38;5;66;03m# finish the root run\u001b[39;00m\n\u001b[1;32m 1782\u001b[0m \u001b[38;5;28;01mexcept\u001b[39;00m \u001b[38;5;167;01mBaseException\u001b[39;00m \u001b[38;5;28;01mas\u001b[39;00m e:\n", + "File \u001b[0;32m~/.pyenv/versions/3.11.2/lib/python3.11/site-packages/langchain_core/prompts/base.py:93\u001b[0m, in \u001b[0;36mBasePromptTemplate.invoke\u001b[0;34m(self, input, config)\u001b[0m\n\u001b[1;32m 90\u001b[0m \u001b[38;5;28;01mdef\u001b[39;00m \u001b[38;5;21minvoke\u001b[39m(\n\u001b[1;32m 91\u001b[0m \u001b[38;5;28mself\u001b[39m, \u001b[38;5;28minput\u001b[39m: Dict, config: Optional[RunnableConfig] \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;01mNone\u001b[39;00m\n\u001b[1;32m 92\u001b[0m ) \u001b[38;5;241m-\u001b[39m\u001b[38;5;241m>\u001b[39m PromptValue:\n\u001b[0;32m---> 93\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43m_call_with_config\u001b[49m\u001b[43m(\u001b[49m\n\u001b[1;32m 94\u001b[0m \u001b[43m \u001b[49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43m_format_prompt_with_error_handling\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 95\u001b[0m \u001b[43m \u001b[49m\u001b[38;5;28;43minput\u001b[39;49m\u001b[43m,\u001b[49m\n\u001b[1;32m 96\u001b[0m \u001b[43m \u001b[49m\u001b[43mconfig\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 97\u001b[0m \u001b[43m \u001b[49m\u001b[43mrun_type\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[38;5;124;43mprompt\u001b[39;49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[43m,\u001b[49m\n\u001b[1;32m 98\u001b[0m \u001b[43m \u001b[49m\u001b[43m)\u001b[49m\n", + "File \u001b[0;32m~/.pyenv/versions/3.11.2/lib/python3.11/site-packages/langchain_core/runnables/base.py:975\u001b[0m, in \u001b[0;36mRunnable._call_with_config\u001b[0;34m(self, func, input, config, run_type, **kwargs)\u001b[0m\n\u001b[1;32m 971\u001b[0m context \u001b[38;5;241m=\u001b[39m copy_context()\n\u001b[1;32m 972\u001b[0m context\u001b[38;5;241m.\u001b[39mrun(var_child_runnable_config\u001b[38;5;241m.\u001b[39mset, child_config)\n\u001b[1;32m 973\u001b[0m output \u001b[38;5;241m=\u001b[39m cast(\n\u001b[1;32m 974\u001b[0m Output,\n\u001b[0;32m--> 975\u001b[0m \u001b[43mcontext\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mrun\u001b[49m\u001b[43m(\u001b[49m\n\u001b[1;32m 976\u001b[0m \u001b[43m \u001b[49m\u001b[43mcall_func_with_variable_args\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 977\u001b[0m \u001b[43m \u001b[49m\u001b[43mfunc\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;66;43;03m# type: ignore[arg-type]\u001b[39;49;00m\n\u001b[1;32m 978\u001b[0m \u001b[43m \u001b[49m\u001b[38;5;28;43minput\u001b[39;49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;66;43;03m# type: ignore[arg-type]\u001b[39;49;00m\n\u001b[1;32m 979\u001b[0m \u001b[43m \u001b[49m\u001b[43mconfig\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 980\u001b[0m \u001b[43m \u001b[49m\u001b[43mrun_manager\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 981\u001b[0m \u001b[43m \u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43mkwargs\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 982\u001b[0m \u001b[43m \u001b[49m\u001b[43m)\u001b[49m,\n\u001b[1;32m 983\u001b[0m )\n\u001b[1;32m 984\u001b[0m \u001b[38;5;28;01mexcept\u001b[39;00m \u001b[38;5;167;01mBaseException\u001b[39;00m \u001b[38;5;28;01mas\u001b[39;00m e:\n\u001b[1;32m 985\u001b[0m run_manager\u001b[38;5;241m.\u001b[39mon_chain_error(e)\n", + "File \u001b[0;32m~/.pyenv/versions/3.11.2/lib/python3.11/site-packages/langchain_core/runnables/config.py:323\u001b[0m, in \u001b[0;36mcall_func_with_variable_args\u001b[0;34m(func, input, config, run_manager, **kwargs)\u001b[0m\n\u001b[1;32m 321\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m run_manager \u001b[38;5;129;01mis\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m \u001b[38;5;28;01mNone\u001b[39;00m \u001b[38;5;129;01mand\u001b[39;00m accepts_run_manager(func):\n\u001b[1;32m 322\u001b[0m kwargs[\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mrun_manager\u001b[39m\u001b[38;5;124m\"\u001b[39m] \u001b[38;5;241m=\u001b[39m run_manager\n\u001b[0;32m--> 323\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[43mfunc\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;28;43minput\u001b[39;49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43mkwargs\u001b[49m\u001b[43m)\u001b[49m\n", + "File \u001b[0;32m~/.pyenv/versions/3.11.2/lib/python3.11/site-packages/langchain_core/prompts/base.py:83\u001b[0m, in \u001b[0;36mBasePromptTemplate._format_prompt_with_error_handling\u001b[0;34m(self, inner_input)\u001b[0m\n\u001b[1;32m 81\u001b[0m missing \u001b[38;5;241m=\u001b[39m \u001b[38;5;28mset\u001b[39m(\u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39minput_variables)\u001b[38;5;241m.\u001b[39mdifference(inner_input)\n\u001b[1;32m 82\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m missing:\n\u001b[0;32m---> 83\u001b[0m \u001b[38;5;28;01mraise\u001b[39;00m \u001b[38;5;167;01mKeyError\u001b[39;00m(\n\u001b[1;32m 84\u001b[0m \u001b[38;5;124mf\u001b[39m\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mInput to \u001b[39m\u001b[38;5;132;01m{\u001b[39;00m\u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m\u001b[38;5;18m__class__\u001b[39m\u001b[38;5;241m.\u001b[39m\u001b[38;5;18m__name__\u001b[39m\u001b[38;5;132;01m}\u001b[39;00m\u001b[38;5;124m is missing variables \u001b[39m\u001b[38;5;132;01m{\u001b[39;00mmissing\u001b[38;5;132;01m}\u001b[39;00m\u001b[38;5;124m. \u001b[39m\u001b[38;5;124m\"\u001b[39m\n\u001b[1;32m 85\u001b[0m \u001b[38;5;124mf\u001b[39m\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124m Expected: \u001b[39m\u001b[38;5;132;01m{\u001b[39;00m\u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39minput_variables\u001b[38;5;132;01m}\u001b[39;00m\u001b[38;5;124m\"\u001b[39m\n\u001b[1;32m 86\u001b[0m \u001b[38;5;124mf\u001b[39m\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124m Received: \u001b[39m\u001b[38;5;132;01m{\u001b[39;00m\u001b[38;5;28mlist\u001b[39m(inner_input\u001b[38;5;241m.\u001b[39mkeys())\u001b[38;5;132;01m}\u001b[39;00m\u001b[38;5;124m\"\u001b[39m\n\u001b[1;32m 87\u001b[0m )\n\u001b[1;32m 88\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mformat_prompt(\u001b[38;5;241m*\u001b[39m\u001b[38;5;241m*\u001b[39minner_input)\n", + "\u001b[0;31mKeyError\u001b[0m: \"Input to ChatPromptTemplate is missing variables {'input'}. Expected: ['input', 'scratchpad'] Received: ['join', 'tasks', 'scratchpad']\"" + ] + } + ], + "source": [ + "example_question = \"Did Aliya get a better score than Roger in Geology?\"\n", + "task_results = chain.invoke({\"input\": example_question})\n", + "task_results[\"join\"]" + ] + }, + { + "cell_type": "markdown", + "id": "563d5311-55f0-4ca1-afbd-01fd970cf3e3", + "metadata": {}, + "source": [ + "## Agent Logic\n", + "\n", + "So now we have the planning and initial execution done. We need a component to process these outputs and either:\n", + "1. Respond with the correct answer.\n", + "2. Loop with a new plan.\n", + "\n", + "The paper calls this the \"joiner\"." + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "id": "2978991e-45a4-44e6-9deb-f941f44fe93a", + "metadata": {}, + "outputs": [], + "source": [ + "from langchain_core.output_parsers import StrOutputParser\n", + "from typing_extensions import TypedDict\n", + "\n", + "\n", + "def format_task(task, idx):\n", + " thought = \"\" # TODO: Pass through CoT\n", + " tool = task[\"tool\"]\n", + " tool_name = tool if isinstance(tool, str) else tool.name # Handle join()\n", + " return f\"{thought}{idx}. {{{tool_name}: {task['args']}}}\"\n", + "\n", + "\n", + "def format_tasks(executor_output: dict):\n", + " tasks = executor_output[\"tasks\"]\n", + " formatted_plan = \"\\n\".join(format_task(task, idx) for idx, task in tasks.items())\n", + " observations = \"\\n\".join(f\"{k}: {v}\" for k, v in executor_output[\"join\"].items())\n", + " return f\"Original Plan:\\n{formatted_plan}\\nExecuted plan results:\\n{observations}\"\n", + "\n", + "\n", + "def _parse_joiner_output(raw_answer: str) -> str:\n", + " thought, answer, is_replan = \"\", \"\", False # default values\n", + " raw_answers = raw_answer.split(\"\\n\")\n", + " for ans in raw_answers:\n", + " if ans.startswith(\"Action:\"):\n", + " answer = ans[ans.find(\"(\") + 1 : ans.find(\")\")]\n", + " is_replan = JOINER_REPLAN in ans\n", + " elif ans.startswith(\"Thought:\"):\n", + " thought = ans.split(\"Thought:\")[1].strip()\n", + " if is_replan:\n", + " return {\"thought\": thought, \"context\": answer}\n", + " else:\n", + " return {\"thought\": thought, \"answer\": answer}" + ] + }, + { + "cell_type": "code", + "execution_count": 17, + "id": "b2feea5a-e0e4-4cff-8cb5-fdbfec95ba57", + "metadata": {}, + "outputs": [], + "source": [ + "def create_joiner(prompt, llm):\n", + " return (\n", + " (lambda x: {**x[\"plan\"], \"input\": x[\"input\"]})\n", + " | RunnablePassthrough.assign(scratchpad=format_tasks)\n", + " | ChatPromptTemplate.from_messages([(\"system\", prompt), (\"user\", \"{input}\")])\n", + " | llm\n", + " | StrOutputParser()\n", + " | _parse_joiner_output\n", + " )" + ] + }, + { + "cell_type": "code", + "execution_count": 18, + "id": "942dab42-ad42-4ba2-90d5-49edbe4fae68", + "metadata": {}, + "outputs": [], + "source": [ + "system_prompt = (\n", + " \"Solve a question answering task with interleaving Observation, Thought, and Action steps. Here are some guidelines:\\n\"\n", + " \" - In the Assistant Scratchpad, you will be given results of a plan you have executed to answer the user's question.\\n\"\n", + " \" - Thought needs to reason about the question based on the Observations in 1-2 sentences.\\n\"\n", + " \" - There are cases where the Observations are unclear or irrelevant (in the case the task execution was unsuccessful or subpar). Only heed the relevant ones\\n\"\n", + " \" Respond in the following format:\\n\\n\"\n", + " \"Thought: \\n\"\n", + " \"Action: \\n\"\n", + " \"Available actions:\\n\"\n", + " f\" (1) {JOINER_FINISH}(the final answer to return to the user): returns the answer and finishes the task.\\n\"\n", + " f\" (2) {JOINER_REPLAN}(the reasoning and information to provide to make a better next plan): instructs why we must replan\\n\\n\"\n", + " \" Examples:\\n\"\n", + " \"Question: How many users are currently using the new product?\\n\"\n", + " \"...task returns the number 32,000\\n\"\n", + " \"Thought: I find no issue with the original plan, and the results satisfy everything in the user question.\\n\"\n", + " f\"Action: {JOINER_FINISH}(32,000 users currently use the new product)\\n###\\n\"\n", + " \"Question: Are the gophers beating the rabbits??\\n\"\n", + " \"...task returns the a score of 7 for rabbits but no other value...\\n\"\n", + " \"Thought: I need the gophers' score to make a final decision.\\n\"\n", + " f\"Action: {JOINER_REPLAN}(The rabbits have a score of 7, but I need the gophers' score.)\"\n", + " \"Assistant Scratchpad:\\n{scratchpad}\"\n", + ")" + ] + }, + { + "cell_type": "code", + "execution_count": 19, + "id": "a07d0804-2ce5-4462-98eb-4473f36ef704", + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "INFO:httpx:HTTP Request: POST https://api.openai.com/v1/chat/completions \"HTTP/1.1 200 OK\"\n" + ] + }, + { + "data": { + "text/plain": [ + "{'thought': 'Based on the executed plan, both Aliya and Roger received an A+ score in Geology. Therefore, Aliya did not get a better score than Roger in Geology.',\n", + " 'answer': 'No, Aliya did not get a better score than Roger in Geology. They both received an A+.'}" + ] + }, + "execution_count": 19, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "joiner = create_joiner(system_prompt, ChatOpenAI(model=\"gpt-3.5-turbo\"))\n", + "joiner.invoke({\"plan\": task_results, \"input\": example_question})" + ] + }, + { + "cell_type": "markdown", + "id": "b099e5ee-2c23-47d9-9387-0f64e02627d3", + "metadata": {}, + "source": [ + "### Construct Agent\n", + "\n", + "Now we have all the required pieces!" + ] + }, + { + "cell_type": "code", + "execution_count": 25, + "id": "768b5f11-e3d2-47be-8143-a7dcd8765243", + "metadata": {}, + "outputs": [], + "source": [ + "from langgraph.graph import END, Graph\n", + "\n", + "workflow = Graph()\n", + "\n", + "# 1. Define vertices\n", + "\n", + "planner = create_planner(\n", + " llm=ChatOpenAI(model=\"gpt-3.5-turbo\"),\n", + " example_prompt=examples,\n", + " # TODO: You can update and optimize the replanner prompt to\n", + " # better critique the original plan\n", + " example_prompt_replan=examples,\n", + " tools=[get_user_id, get_scores],\n", + ")\n", + "plan_and_execute = RunnablePassthrough.assign(plan=planner | construct_dag)\n", + "joiner = create_joiner(system_prompt, ChatOpenAI(model=\"gpt-3.5-turbo\"))\n", + "joiner_node = RunnablePassthrough.assign(joined_output=joiner)\n", + "\n", + "\n", + "workflow.add_node(\"plan_and_execute\", plan_and_execute)\n", + "workflow.add_node(\"join\", joiner_node)\n", + "workflow.add_node(\"end\", lambda x: x[\"joined_output\"].get(\"answer\", x))\n", + "\n", + "## Define edges\n", + "\n", + "workflow.add_edge(\"plan_and_execute\", \"join\")\n", + "\n", + "### This condition determines looping logic\n", + "\n", + "\n", + "def should_continue(joiner_output):\n", + " if joiner_output[\"joined_output\"].get(\"context\"):\n", + " return \"continue\"\n", + " return \"end\"\n", + "\n", + "\n", + "workflow.add_conditional_edges(\n", + " start_key=\"join\",\n", + " # Next, we pass in the function that will determine which node is called next.\n", + " condition=should_continue,\n", + " conditional_edge_mapping={\n", + " # If it generates context, we must replan\n", + " \"continue\": \"plan_and_execute\",\n", + " # Otherwise we finish.\n", + " \"end\": \"end\",\n", + " },\n", + ")\n", + "workflow.set_entry_point(\"plan_and_execute\")\n", + "workflow.set_finish_point(\"end\")\n", + "chain = workflow.compile()" + ] + }, + { + "cell_type": "code", + "execution_count": 28, + "id": "0b3a0916-d8ca-4092-b91c-d9e2b05259d8", + "metadata": {}, + "outputs": [], + "source": [ + "# chain.invoke({\"input\": \"Did Aliya get a better score than Roger in Geology?\"})" + ] + }, + { + "cell_type": "code", + "execution_count": 29, + "id": "e3f3e409-11e7-4171-b2bc-7b0e82dfd10d", + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "INFO:httpx:HTTP Request: POST https://api.openai.com/v1/chat/completions \"HTTP/1.1 200 OK\"\n", + "INFO:httpx:HTTP Request: POST https://api.openai.com/v1/chat/completions \"HTTP/1.1 200 OK\"\n" + ] + }, + { + "ename": "KeyError", + "evalue": "\"Input to ChatPromptTemplate is missing variables {'input'}. Expected: ['input'] Received: ['thought', 'context']\"", + "output_type": "error", + "traceback": [ + "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", + "\u001b[0;31mKeyError\u001b[0m Traceback (most recent call last)", + "Cell \u001b[0;32mIn[29], line 2\u001b[0m\n\u001b[1;32m 1\u001b[0m \u001b[38;5;66;03m# Try something to trigger replanning\u001b[39;00m\n\u001b[0;32m----> 2\u001b[0m \u001b[43mchain\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43minvoke\u001b[49m\u001b[43m(\u001b[49m\n\u001b[1;32m 3\u001b[0m \u001b[43m \u001b[49m\u001b[43m{\u001b[49m\n\u001b[1;32m 4\u001b[0m \u001b[43m \u001b[49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[38;5;124;43minput\u001b[39;49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[43m:\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[38;5;124;43mDid the sum of Aliya and Roger\u001b[39;49m\u001b[38;5;124;43m'\u001b[39;49m\u001b[38;5;124;43ms grades in Calc map out to less than\u001b[39;49m\u001b[38;5;124;43m\"\u001b[39;49m\n\u001b[1;32m 5\u001b[0m \u001b[43m \u001b[49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[38;5;124;43m the total grade for the class?\u001b[39;49m\u001b[38;5;124;43m\"\u001b[39;49m\n\u001b[1;32m 6\u001b[0m \u001b[43m \u001b[49m\u001b[43m}\u001b[49m\n\u001b[1;32m 7\u001b[0m \u001b[43m)\u001b[49m\n", + "File \u001b[0;32m~/code/lc/langgraph/langgraph/pregel/__init__.py:456\u001b[0m, in \u001b[0;36mPregel.invoke\u001b[0;34m(self, input, config, output, **kwargs)\u001b[0m\n\u001b[1;32m 447\u001b[0m \u001b[38;5;28;01mdef\u001b[39;00m \u001b[38;5;21minvoke\u001b[39m(\n\u001b[1;32m 448\u001b[0m \u001b[38;5;28mself\u001b[39m,\n\u001b[1;32m 449\u001b[0m \u001b[38;5;28minput\u001b[39m: Union[\u001b[38;5;28mdict\u001b[39m[\u001b[38;5;28mstr\u001b[39m, Any], Any],\n\u001b[0;32m (...)\u001b[0m\n\u001b[1;32m 453\u001b[0m \u001b[38;5;241m*\u001b[39m\u001b[38;5;241m*\u001b[39mkwargs: Any,\n\u001b[1;32m 454\u001b[0m ) \u001b[38;5;241m-\u001b[39m\u001b[38;5;241m>\u001b[39m Union[\u001b[38;5;28mdict\u001b[39m[\u001b[38;5;28mstr\u001b[39m, Any], Any]:\n\u001b[1;32m 455\u001b[0m latest: Union[\u001b[38;5;28mdict\u001b[39m[\u001b[38;5;28mstr\u001b[39m, Any], Any] \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;01mNone\u001b[39;00m\n\u001b[0;32m--> 456\u001b[0m \u001b[43m \u001b[49m\u001b[38;5;28;43;01mfor\u001b[39;49;00m\u001b[43m \u001b[49m\u001b[43mchunk\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;129;43;01min\u001b[39;49;00m\u001b[43m \u001b[49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mstream\u001b[49m\u001b[43m(\u001b[49m\n\u001b[1;32m 457\u001b[0m \u001b[43m \u001b[49m\u001b[38;5;28;43minput\u001b[39;49m\u001b[43m,\u001b[49m\n\u001b[1;32m 458\u001b[0m \u001b[43m \u001b[49m\u001b[43mconfig\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 459\u001b[0m \u001b[43m \u001b[49m\u001b[43moutput\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43moutput\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;28;43;01mif\u001b[39;49;00m\u001b[43m \u001b[49m\u001b[43moutput\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;129;43;01mis\u001b[39;49;00m\u001b[43m \u001b[49m\u001b[38;5;129;43;01mnot\u001b[39;49;00m\u001b[43m \u001b[49m\u001b[38;5;28;43;01mNone\u001b[39;49;00m\u001b[43m \u001b[49m\u001b[38;5;28;43;01melse\u001b[39;49;00m\u001b[43m \u001b[49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43moutput\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 460\u001b[0m \u001b[43m \u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43mkwargs\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 461\u001b[0m \u001b[43m \u001b[49m\u001b[43m)\u001b[49m\u001b[43m:\u001b[49m\n\u001b[1;32m 462\u001b[0m \u001b[43m \u001b[49m\u001b[43mlatest\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43m \u001b[49m\u001b[43mchunk\u001b[49m\n\u001b[1;32m 463\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m latest\n", + "File \u001b[0;32m~/code/lc/langgraph/langgraph/pregel/__init__.py:483\u001b[0m, in \u001b[0;36mPregel.transform\u001b[0;34m(self, input, config, output, **kwargs)\u001b[0m\n\u001b[1;32m 475\u001b[0m \u001b[38;5;28;01mdef\u001b[39;00m \u001b[38;5;21mtransform\u001b[39m(\n\u001b[1;32m 476\u001b[0m \u001b[38;5;28mself\u001b[39m,\n\u001b[1;32m 477\u001b[0m \u001b[38;5;28minput\u001b[39m: Iterator[Union[\u001b[38;5;28mdict\u001b[39m[\u001b[38;5;28mstr\u001b[39m, Any], Any]],\n\u001b[0;32m (...)\u001b[0m\n\u001b[1;32m 481\u001b[0m \u001b[38;5;241m*\u001b[39m\u001b[38;5;241m*\u001b[39mkwargs: Any,\n\u001b[1;32m 482\u001b[0m ) \u001b[38;5;241m-\u001b[39m\u001b[38;5;241m>\u001b[39m Iterator[Union[\u001b[38;5;28mdict\u001b[39m[\u001b[38;5;28mstr\u001b[39m, Any], Any]]:\n\u001b[0;32m--> 483\u001b[0m \u001b[43m \u001b[49m\u001b[38;5;28;43;01mfor\u001b[39;49;00m\u001b[43m \u001b[49m\u001b[43mchunk\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;129;43;01min\u001b[39;49;00m\u001b[43m \u001b[49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43m_transform_stream_with_config\u001b[49m\u001b[43m(\u001b[49m\n\u001b[1;32m 484\u001b[0m \u001b[43m \u001b[49m\u001b[38;5;28;43minput\u001b[39;49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43m_transform\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mconfig\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43moutput\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43moutput\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43mkwargs\u001b[49m\n\u001b[1;32m 485\u001b[0m \u001b[43m \u001b[49m\u001b[43m)\u001b[49m\u001b[43m:\u001b[49m\n\u001b[1;32m 486\u001b[0m \u001b[43m \u001b[49m\u001b[38;5;28;43;01myield\u001b[39;49;00m\u001b[43m \u001b[49m\u001b[43mchunk\u001b[49m\n", + "File \u001b[0;32m~/.pyenv/versions/3.11.2/lib/python3.11/site-packages/langchain_core/runnables/base.py:1226\u001b[0m, in \u001b[0;36mRunnable._transform_stream_with_config\u001b[0;34m(self, input, transformer, config, run_type, **kwargs)\u001b[0m\n\u001b[1;32m 1224\u001b[0m \u001b[38;5;28;01mtry\u001b[39;00m:\n\u001b[1;32m 1225\u001b[0m \u001b[38;5;28;01mwhile\u001b[39;00m \u001b[38;5;28;01mTrue\u001b[39;00m:\n\u001b[0;32m-> 1226\u001b[0m chunk: Output \u001b[38;5;241m=\u001b[39m context\u001b[38;5;241m.\u001b[39mrun(\u001b[38;5;28mnext\u001b[39m, iterator) \u001b[38;5;66;03m# type: ignore\u001b[39;00m\n\u001b[1;32m 1227\u001b[0m \u001b[38;5;28;01myield\u001b[39;00m chunk\n\u001b[1;32m 1228\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m final_output_supported:\n", + "File \u001b[0;32m~/code/lc/langgraph/langgraph/pregel/__init__.py:301\u001b[0m, in \u001b[0;36mPregel._transform\u001b[0;34m(self, input, run_manager, config, output)\u001b[0m\n\u001b[1;32m 291\u001b[0m done, inflight \u001b[38;5;241m=\u001b[39m concurrent\u001b[38;5;241m.\u001b[39mfutures\u001b[38;5;241m.\u001b[39mwait(\n\u001b[1;32m 292\u001b[0m [\n\u001b[1;32m 293\u001b[0m executor\u001b[38;5;241m.\u001b[39msubmit(proc\u001b[38;5;241m.\u001b[39minvoke, \u001b[38;5;28minput\u001b[39m, config)\n\u001b[0;32m (...)\u001b[0m\n\u001b[1;32m 297\u001b[0m timeout\u001b[38;5;241m=\u001b[39m\u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mstep_timeout,\n\u001b[1;32m 298\u001b[0m )\n\u001b[1;32m 300\u001b[0m \u001b[38;5;66;03m# interrupt on failure or timeout\u001b[39;00m\n\u001b[0;32m--> 301\u001b[0m \u001b[43m_interrupt_or_proceed\u001b[49m\u001b[43m(\u001b[49m\u001b[43mdone\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43minflight\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mstep\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 303\u001b[0m \u001b[38;5;66;03m# apply writes to channels\u001b[39;00m\n\u001b[1;32m 304\u001b[0m _apply_writes(checkpoint, channels, pending_writes, config, step \u001b[38;5;241m+\u001b[39m \u001b[38;5;241m1\u001b[39m)\n", + "File \u001b[0;32m~/code/lc/langgraph/langgraph/pregel/__init__.py:548\u001b[0m, in \u001b[0;36m_interrupt_or_proceed\u001b[0;34m(done, inflight, step)\u001b[0m\n\u001b[1;32m 546\u001b[0m inflight\u001b[38;5;241m.\u001b[39mpop()\u001b[38;5;241m.\u001b[39mcancel()\n\u001b[1;32m 547\u001b[0m \u001b[38;5;66;03m# raise the exception\u001b[39;00m\n\u001b[0;32m--> 548\u001b[0m \u001b[38;5;28;01mraise\u001b[39;00m exc\n\u001b[1;32m 549\u001b[0m \u001b[38;5;66;03m# TODO this is where retry of an entire step would happen\u001b[39;00m\n\u001b[1;32m 551\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m inflight:\n\u001b[1;32m 552\u001b[0m \u001b[38;5;66;03m# if we got here means we timed out\u001b[39;00m\n", + "File \u001b[0;32m~/.pyenv/versions/3.11.2/lib/python3.11/concurrent/futures/thread.py:58\u001b[0m, in \u001b[0;36m_WorkItem.run\u001b[0;34m(self)\u001b[0m\n\u001b[1;32m 55\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m\n\u001b[1;32m 57\u001b[0m \u001b[38;5;28;01mtry\u001b[39;00m:\n\u001b[0;32m---> 58\u001b[0m result \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mfn\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43margs\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mkwargs\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 59\u001b[0m \u001b[38;5;28;01mexcept\u001b[39;00m \u001b[38;5;167;01mBaseException\u001b[39;00m \u001b[38;5;28;01mas\u001b[39;00m exc:\n\u001b[1;32m 60\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mfuture\u001b[38;5;241m.\u001b[39mset_exception(exc)\n", + "File \u001b[0;32m~/.pyenv/versions/3.11.2/lib/python3.11/site-packages/langchain_core/runnables/base.py:3596\u001b[0m, in \u001b[0;36mRunnableBindingBase.invoke\u001b[0;34m(self, input, config, **kwargs)\u001b[0m\n\u001b[1;32m 3590\u001b[0m \u001b[38;5;28;01mdef\u001b[39;00m \u001b[38;5;21minvoke\u001b[39m(\n\u001b[1;32m 3591\u001b[0m \u001b[38;5;28mself\u001b[39m,\n\u001b[1;32m 3592\u001b[0m \u001b[38;5;28minput\u001b[39m: Input,\n\u001b[1;32m 3593\u001b[0m config: Optional[RunnableConfig] \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;01mNone\u001b[39;00m,\n\u001b[1;32m 3594\u001b[0m \u001b[38;5;241m*\u001b[39m\u001b[38;5;241m*\u001b[39mkwargs: Optional[Any],\n\u001b[1;32m 3595\u001b[0m ) \u001b[38;5;241m-\u001b[39m\u001b[38;5;241m>\u001b[39m Output:\n\u001b[0;32m-> 3596\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mbound\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43minvoke\u001b[49m\u001b[43m(\u001b[49m\n\u001b[1;32m 3597\u001b[0m \u001b[43m \u001b[49m\u001b[38;5;28;43minput\u001b[39;49m\u001b[43m,\u001b[49m\n\u001b[1;32m 3598\u001b[0m \u001b[43m \u001b[49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43m_merge_configs\u001b[49m\u001b[43m(\u001b[49m\u001b[43mconfig\u001b[49m\u001b[43m)\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 3599\u001b[0m \u001b[43m \u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43m{\u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mkwargs\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43mkwargs\u001b[49m\u001b[43m}\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 3600\u001b[0m \u001b[43m \u001b[49m\u001b[43m)\u001b[49m\n", + "File \u001b[0;32m~/.pyenv/versions/3.11.2/lib/python3.11/site-packages/langchain_core/runnables/base.py:1774\u001b[0m, in \u001b[0;36mRunnableSequence.invoke\u001b[0;34m(self, input, config)\u001b[0m\n\u001b[1;32m 1772\u001b[0m \u001b[38;5;28;01mtry\u001b[39;00m:\n\u001b[1;32m 1773\u001b[0m \u001b[38;5;28;01mfor\u001b[39;00m i, step \u001b[38;5;129;01min\u001b[39;00m \u001b[38;5;28menumerate\u001b[39m(\u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39msteps):\n\u001b[0;32m-> 1774\u001b[0m \u001b[38;5;28minput\u001b[39m \u001b[38;5;241m=\u001b[39m \u001b[43mstep\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43minvoke\u001b[49m\u001b[43m(\u001b[49m\n\u001b[1;32m 1775\u001b[0m \u001b[43m \u001b[49m\u001b[38;5;28;43minput\u001b[39;49m\u001b[43m,\u001b[49m\n\u001b[1;32m 1776\u001b[0m \u001b[43m \u001b[49m\u001b[38;5;66;43;03m# mark each step as a child run\u001b[39;49;00m\n\u001b[1;32m 1777\u001b[0m \u001b[43m \u001b[49m\u001b[43mpatch_config\u001b[49m\u001b[43m(\u001b[49m\n\u001b[1;32m 1778\u001b[0m \u001b[43m \u001b[49m\u001b[43mconfig\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mcallbacks\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mrun_manager\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mget_child\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;124;43mf\u001b[39;49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[38;5;124;43mseq:step:\u001b[39;49m\u001b[38;5;132;43;01m{\u001b[39;49;00m\u001b[43mi\u001b[49m\u001b[38;5;241;43m+\u001b[39;49m\u001b[38;5;241;43m1\u001b[39;49m\u001b[38;5;132;43;01m}\u001b[39;49;00m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[43m)\u001b[49m\n\u001b[1;32m 1779\u001b[0m \u001b[43m \u001b[49m\u001b[43m)\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 1780\u001b[0m \u001b[43m \u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 1781\u001b[0m \u001b[38;5;66;03m# finish the root run\u001b[39;00m\n\u001b[1;32m 1782\u001b[0m \u001b[38;5;28;01mexcept\u001b[39;00m \u001b[38;5;167;01mBaseException\u001b[39;00m \u001b[38;5;28;01mas\u001b[39;00m e:\n", + "File \u001b[0;32m~/.pyenv/versions/3.11.2/lib/python3.11/site-packages/langchain_core/runnables/passthrough.py:415\u001b[0m, in \u001b[0;36mRunnableAssign.invoke\u001b[0;34m(self, input, config, **kwargs)\u001b[0m\n\u001b[1;32m 409\u001b[0m \u001b[38;5;28;01mdef\u001b[39;00m \u001b[38;5;21minvoke\u001b[39m(\n\u001b[1;32m 410\u001b[0m \u001b[38;5;28mself\u001b[39m,\n\u001b[1;32m 411\u001b[0m \u001b[38;5;28minput\u001b[39m: Dict[\u001b[38;5;28mstr\u001b[39m, Any],\n\u001b[1;32m 412\u001b[0m config: Optional[RunnableConfig] \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;01mNone\u001b[39;00m,\n\u001b[1;32m 413\u001b[0m \u001b[38;5;241m*\u001b[39m\u001b[38;5;241m*\u001b[39mkwargs: Any,\n\u001b[1;32m 414\u001b[0m ) \u001b[38;5;241m-\u001b[39m\u001b[38;5;241m>\u001b[39m Dict[\u001b[38;5;28mstr\u001b[39m, Any]:\n\u001b[0;32m--> 415\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43m_call_with_config\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43m_invoke\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;28;43minput\u001b[39;49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mconfig\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43mkwargs\u001b[49m\u001b[43m)\u001b[49m\n", + "File \u001b[0;32m~/.pyenv/versions/3.11.2/lib/python3.11/site-packages/langchain_core/runnables/base.py:975\u001b[0m, in \u001b[0;36mRunnable._call_with_config\u001b[0;34m(self, func, input, config, run_type, **kwargs)\u001b[0m\n\u001b[1;32m 971\u001b[0m context \u001b[38;5;241m=\u001b[39m copy_context()\n\u001b[1;32m 972\u001b[0m context\u001b[38;5;241m.\u001b[39mrun(var_child_runnable_config\u001b[38;5;241m.\u001b[39mset, child_config)\n\u001b[1;32m 973\u001b[0m output \u001b[38;5;241m=\u001b[39m cast(\n\u001b[1;32m 974\u001b[0m Output,\n\u001b[0;32m--> 975\u001b[0m \u001b[43mcontext\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mrun\u001b[49m\u001b[43m(\u001b[49m\n\u001b[1;32m 976\u001b[0m \u001b[43m \u001b[49m\u001b[43mcall_func_with_variable_args\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 977\u001b[0m \u001b[43m \u001b[49m\u001b[43mfunc\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;66;43;03m# type: ignore[arg-type]\u001b[39;49;00m\n\u001b[1;32m 978\u001b[0m \u001b[43m \u001b[49m\u001b[38;5;28;43minput\u001b[39;49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;66;43;03m# type: ignore[arg-type]\u001b[39;49;00m\n\u001b[1;32m 979\u001b[0m \u001b[43m \u001b[49m\u001b[43mconfig\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 980\u001b[0m \u001b[43m \u001b[49m\u001b[43mrun_manager\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 981\u001b[0m \u001b[43m \u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43mkwargs\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 982\u001b[0m \u001b[43m \u001b[49m\u001b[43m)\u001b[49m,\n\u001b[1;32m 983\u001b[0m )\n\u001b[1;32m 984\u001b[0m \u001b[38;5;28;01mexcept\u001b[39;00m \u001b[38;5;167;01mBaseException\u001b[39;00m \u001b[38;5;28;01mas\u001b[39;00m e:\n\u001b[1;32m 985\u001b[0m run_manager\u001b[38;5;241m.\u001b[39mon_chain_error(e)\n", + "File \u001b[0;32m~/.pyenv/versions/3.11.2/lib/python3.11/site-packages/langchain_core/runnables/config.py:323\u001b[0m, in \u001b[0;36mcall_func_with_variable_args\u001b[0;34m(func, input, config, run_manager, **kwargs)\u001b[0m\n\u001b[1;32m 321\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m run_manager \u001b[38;5;129;01mis\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m \u001b[38;5;28;01mNone\u001b[39;00m \u001b[38;5;129;01mand\u001b[39;00m accepts_run_manager(func):\n\u001b[1;32m 322\u001b[0m kwargs[\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mrun_manager\u001b[39m\u001b[38;5;124m\"\u001b[39m] \u001b[38;5;241m=\u001b[39m run_manager\n\u001b[0;32m--> 323\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[43mfunc\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;28;43minput\u001b[39;49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43mkwargs\u001b[49m\u001b[43m)\u001b[49m\n", + "File \u001b[0;32m~/.pyenv/versions/3.11.2/lib/python3.11/site-packages/langchain_core/runnables/passthrough.py:402\u001b[0m, in \u001b[0;36mRunnableAssign._invoke\u001b[0;34m(self, input, run_manager, config, **kwargs)\u001b[0m\n\u001b[1;32m 389\u001b[0m \u001b[38;5;28;01mdef\u001b[39;00m \u001b[38;5;21m_invoke\u001b[39m(\n\u001b[1;32m 390\u001b[0m \u001b[38;5;28mself\u001b[39m,\n\u001b[1;32m 391\u001b[0m \u001b[38;5;28minput\u001b[39m: Dict[\u001b[38;5;28mstr\u001b[39m, Any],\n\u001b[0;32m (...)\u001b[0m\n\u001b[1;32m 394\u001b[0m \u001b[38;5;241m*\u001b[39m\u001b[38;5;241m*\u001b[39mkwargs: Any,\n\u001b[1;32m 395\u001b[0m ) \u001b[38;5;241m-\u001b[39m\u001b[38;5;241m>\u001b[39m Dict[\u001b[38;5;28mstr\u001b[39m, Any]:\n\u001b[1;32m 396\u001b[0m \u001b[38;5;28;01massert\u001b[39;00m \u001b[38;5;28misinstance\u001b[39m(\n\u001b[1;32m 397\u001b[0m \u001b[38;5;28minput\u001b[39m, \u001b[38;5;28mdict\u001b[39m\n\u001b[1;32m 398\u001b[0m ), \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mThe input to RunnablePassthrough.assign() must be a dict.\u001b[39m\u001b[38;5;124m\"\u001b[39m\n\u001b[1;32m 400\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m {\n\u001b[1;32m 401\u001b[0m \u001b[38;5;241m*\u001b[39m\u001b[38;5;241m*\u001b[39m\u001b[38;5;28minput\u001b[39m,\n\u001b[0;32m--> 402\u001b[0m \u001b[38;5;241m*\u001b[39m\u001b[38;5;241m*\u001b[39m\u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mmapper\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43minvoke\u001b[49m\u001b[43m(\u001b[49m\n\u001b[1;32m 403\u001b[0m \u001b[43m \u001b[49m\u001b[38;5;28;43minput\u001b[39;49m\u001b[43m,\u001b[49m\n\u001b[1;32m 404\u001b[0m \u001b[43m \u001b[49m\u001b[43mpatch_config\u001b[49m\u001b[43m(\u001b[49m\u001b[43mconfig\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mcallbacks\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mrun_manager\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mget_child\u001b[49m\u001b[43m(\u001b[49m\u001b[43m)\u001b[49m\u001b[43m)\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 405\u001b[0m \u001b[43m \u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43mkwargs\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 406\u001b[0m \u001b[43m \u001b[49m\u001b[43m)\u001b[49m,\n\u001b[1;32m 407\u001b[0m }\n", + "File \u001b[0;32m~/.pyenv/versions/3.11.2/lib/python3.11/site-packages/langchain_core/runnables/base.py:2339\u001b[0m, in \u001b[0;36mRunnableParallel.invoke\u001b[0;34m(self, input, config)\u001b[0m\n\u001b[1;32m 2326\u001b[0m \u001b[38;5;28;01mwith\u001b[39;00m get_executor_for_config(config) \u001b[38;5;28;01mas\u001b[39;00m executor:\n\u001b[1;32m 2327\u001b[0m futures \u001b[38;5;241m=\u001b[39m [\n\u001b[1;32m 2328\u001b[0m executor\u001b[38;5;241m.\u001b[39msubmit(\n\u001b[1;32m 2329\u001b[0m step\u001b[38;5;241m.\u001b[39minvoke,\n\u001b[0;32m (...)\u001b[0m\n\u001b[1;32m 2337\u001b[0m \u001b[38;5;28;01mfor\u001b[39;00m key, step \u001b[38;5;129;01min\u001b[39;00m steps\u001b[38;5;241m.\u001b[39mitems()\n\u001b[1;32m 2338\u001b[0m ]\n\u001b[0;32m-> 2339\u001b[0m output \u001b[38;5;241m=\u001b[39m \u001b[43m{\u001b[49m\u001b[43mkey\u001b[49m\u001b[43m:\u001b[49m\u001b[43m \u001b[49m\u001b[43mfuture\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mresult\u001b[49m\u001b[43m(\u001b[49m\u001b[43m)\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;28;43;01mfor\u001b[39;49;00m\u001b[43m \u001b[49m\u001b[43mkey\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mfuture\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;129;43;01min\u001b[39;49;00m\u001b[43m \u001b[49m\u001b[38;5;28;43mzip\u001b[39;49m\u001b[43m(\u001b[49m\u001b[43msteps\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mfutures\u001b[49m\u001b[43m)\u001b[49m\u001b[43m}\u001b[49m\n\u001b[1;32m 2340\u001b[0m \u001b[38;5;66;03m# finish the root run\u001b[39;00m\n\u001b[1;32m 2341\u001b[0m \u001b[38;5;28;01mexcept\u001b[39;00m \u001b[38;5;167;01mBaseException\u001b[39;00m \u001b[38;5;28;01mas\u001b[39;00m e:\n", + "File \u001b[0;32m~/.pyenv/versions/3.11.2/lib/python3.11/site-packages/langchain_core/runnables/base.py:2339\u001b[0m, in \u001b[0;36m\u001b[0;34m(.0)\u001b[0m\n\u001b[1;32m 2326\u001b[0m \u001b[38;5;28;01mwith\u001b[39;00m get_executor_for_config(config) \u001b[38;5;28;01mas\u001b[39;00m executor:\n\u001b[1;32m 2327\u001b[0m futures \u001b[38;5;241m=\u001b[39m [\n\u001b[1;32m 2328\u001b[0m executor\u001b[38;5;241m.\u001b[39msubmit(\n\u001b[1;32m 2329\u001b[0m step\u001b[38;5;241m.\u001b[39minvoke,\n\u001b[0;32m (...)\u001b[0m\n\u001b[1;32m 2337\u001b[0m \u001b[38;5;28;01mfor\u001b[39;00m key, step \u001b[38;5;129;01min\u001b[39;00m steps\u001b[38;5;241m.\u001b[39mitems()\n\u001b[1;32m 2338\u001b[0m ]\n\u001b[0;32m-> 2339\u001b[0m output \u001b[38;5;241m=\u001b[39m {key: \u001b[43mfuture\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mresult\u001b[49m\u001b[43m(\u001b[49m\u001b[43m)\u001b[49m \u001b[38;5;28;01mfor\u001b[39;00m key, future \u001b[38;5;129;01min\u001b[39;00m \u001b[38;5;28mzip\u001b[39m(steps, futures)}\n\u001b[1;32m 2340\u001b[0m \u001b[38;5;66;03m# finish the root run\u001b[39;00m\n\u001b[1;32m 2341\u001b[0m \u001b[38;5;28;01mexcept\u001b[39;00m \u001b[38;5;167;01mBaseException\u001b[39;00m \u001b[38;5;28;01mas\u001b[39;00m e:\n", + "File \u001b[0;32m~/.pyenv/versions/3.11.2/lib/python3.11/concurrent/futures/_base.py:456\u001b[0m, in \u001b[0;36mFuture.result\u001b[0;34m(self, timeout)\u001b[0m\n\u001b[1;32m 454\u001b[0m \u001b[38;5;28;01mraise\u001b[39;00m CancelledError()\n\u001b[1;32m 455\u001b[0m \u001b[38;5;28;01melif\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_state \u001b[38;5;241m==\u001b[39m FINISHED:\n\u001b[0;32m--> 456\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43m__get_result\u001b[49m\u001b[43m(\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 457\u001b[0m \u001b[38;5;28;01melse\u001b[39;00m:\n\u001b[1;32m 458\u001b[0m \u001b[38;5;28;01mraise\u001b[39;00m \u001b[38;5;167;01mTimeoutError\u001b[39;00m()\n", + "File \u001b[0;32m~/.pyenv/versions/3.11.2/lib/python3.11/concurrent/futures/_base.py:401\u001b[0m, in \u001b[0;36mFuture.__get_result\u001b[0;34m(self)\u001b[0m\n\u001b[1;32m 399\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_exception:\n\u001b[1;32m 400\u001b[0m \u001b[38;5;28;01mtry\u001b[39;00m:\n\u001b[0;32m--> 401\u001b[0m \u001b[38;5;28;01mraise\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_exception\n\u001b[1;32m 402\u001b[0m \u001b[38;5;28;01mfinally\u001b[39;00m:\n\u001b[1;32m 403\u001b[0m \u001b[38;5;66;03m# Break a reference cycle with the exception in self._exception\u001b[39;00m\n\u001b[1;32m 404\u001b[0m \u001b[38;5;28mself\u001b[39m \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;01mNone\u001b[39;00m\n", + "File \u001b[0;32m~/.pyenv/versions/3.11.2/lib/python3.11/concurrent/futures/thread.py:58\u001b[0m, in \u001b[0;36m_WorkItem.run\u001b[0;34m(self)\u001b[0m\n\u001b[1;32m 55\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m\n\u001b[1;32m 57\u001b[0m \u001b[38;5;28;01mtry\u001b[39;00m:\n\u001b[0;32m---> 58\u001b[0m result \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mfn\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43margs\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mkwargs\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 59\u001b[0m \u001b[38;5;28;01mexcept\u001b[39;00m \u001b[38;5;167;01mBaseException\u001b[39;00m \u001b[38;5;28;01mas\u001b[39;00m exc:\n\u001b[1;32m 60\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mfuture\u001b[38;5;241m.\u001b[39mset_exception(exc)\n", + "File \u001b[0;32m~/.pyenv/versions/3.11.2/lib/python3.11/site-packages/langchain_core/runnables/base.py:1774\u001b[0m, in \u001b[0;36mRunnableSequence.invoke\u001b[0;34m(self, input, config)\u001b[0m\n\u001b[1;32m 1772\u001b[0m \u001b[38;5;28;01mtry\u001b[39;00m:\n\u001b[1;32m 1773\u001b[0m \u001b[38;5;28;01mfor\u001b[39;00m i, step \u001b[38;5;129;01min\u001b[39;00m \u001b[38;5;28menumerate\u001b[39m(\u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39msteps):\n\u001b[0;32m-> 1774\u001b[0m \u001b[38;5;28minput\u001b[39m \u001b[38;5;241m=\u001b[39m \u001b[43mstep\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43minvoke\u001b[49m\u001b[43m(\u001b[49m\n\u001b[1;32m 1775\u001b[0m \u001b[43m \u001b[49m\u001b[38;5;28;43minput\u001b[39;49m\u001b[43m,\u001b[49m\n\u001b[1;32m 1776\u001b[0m \u001b[43m \u001b[49m\u001b[38;5;66;43;03m# mark each step as a child run\u001b[39;49;00m\n\u001b[1;32m 1777\u001b[0m \u001b[43m \u001b[49m\u001b[43mpatch_config\u001b[49m\u001b[43m(\u001b[49m\n\u001b[1;32m 1778\u001b[0m \u001b[43m \u001b[49m\u001b[43mconfig\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mcallbacks\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mrun_manager\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mget_child\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;124;43mf\u001b[39;49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[38;5;124;43mseq:step:\u001b[39;49m\u001b[38;5;132;43;01m{\u001b[39;49;00m\u001b[43mi\u001b[49m\u001b[38;5;241;43m+\u001b[39;49m\u001b[38;5;241;43m1\u001b[39;49m\u001b[38;5;132;43;01m}\u001b[39;49;00m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[43m)\u001b[49m\n\u001b[1;32m 1779\u001b[0m \u001b[43m \u001b[49m\u001b[43m)\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 1780\u001b[0m \u001b[43m \u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 1781\u001b[0m \u001b[38;5;66;03m# finish the root run\u001b[39;00m\n\u001b[1;32m 1782\u001b[0m \u001b[38;5;28;01mexcept\u001b[39;00m \u001b[38;5;167;01mBaseException\u001b[39;00m \u001b[38;5;28;01mas\u001b[39;00m e:\n", + "File \u001b[0;32m~/.pyenv/versions/3.11.2/lib/python3.11/site-packages/langchain_core/runnables/branch.py:211\u001b[0m, in \u001b[0;36mRunnableBranch.invoke\u001b[0;34m(self, input, config, **kwargs)\u001b[0m\n\u001b[1;32m 209\u001b[0m \u001b[38;5;28;01mbreak\u001b[39;00m\n\u001b[1;32m 210\u001b[0m \u001b[38;5;28;01melse\u001b[39;00m:\n\u001b[0;32m--> 211\u001b[0m output \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mdefault\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43minvoke\u001b[49m\u001b[43m(\u001b[49m\n\u001b[1;32m 212\u001b[0m \u001b[43m \u001b[49m\u001b[38;5;28;43minput\u001b[39;49m\u001b[43m,\u001b[49m\n\u001b[1;32m 213\u001b[0m \u001b[43m \u001b[49m\u001b[43mconfig\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mpatch_config\u001b[49m\u001b[43m(\u001b[49m\n\u001b[1;32m 214\u001b[0m \u001b[43m \u001b[49m\u001b[43mconfig\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mcallbacks\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mrun_manager\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mget_child\u001b[49m\u001b[43m(\u001b[49m\u001b[43mtag\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[38;5;124;43mbranch:default\u001b[39;49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[43m)\u001b[49m\n\u001b[1;32m 215\u001b[0m \u001b[43m \u001b[49m\u001b[43m)\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 216\u001b[0m \u001b[43m \u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43mkwargs\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 217\u001b[0m \u001b[43m \u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 218\u001b[0m \u001b[38;5;28;01mexcept\u001b[39;00m \u001b[38;5;167;01mBaseException\u001b[39;00m \u001b[38;5;28;01mas\u001b[39;00m e:\n\u001b[1;32m 219\u001b[0m run_manager\u001b[38;5;241m.\u001b[39mon_chain_error(e)\n", + "File \u001b[0;32m~/.pyenv/versions/3.11.2/lib/python3.11/site-packages/langchain_core/prompts/base.py:93\u001b[0m, in \u001b[0;36mBasePromptTemplate.invoke\u001b[0;34m(self, input, config)\u001b[0m\n\u001b[1;32m 90\u001b[0m \u001b[38;5;28;01mdef\u001b[39;00m \u001b[38;5;21minvoke\u001b[39m(\n\u001b[1;32m 91\u001b[0m \u001b[38;5;28mself\u001b[39m, \u001b[38;5;28minput\u001b[39m: Dict, config: Optional[RunnableConfig] \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;01mNone\u001b[39;00m\n\u001b[1;32m 92\u001b[0m ) \u001b[38;5;241m-\u001b[39m\u001b[38;5;241m>\u001b[39m PromptValue:\n\u001b[0;32m---> 93\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43m_call_with_config\u001b[49m\u001b[43m(\u001b[49m\n\u001b[1;32m 94\u001b[0m \u001b[43m \u001b[49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43m_format_prompt_with_error_handling\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 95\u001b[0m \u001b[43m \u001b[49m\u001b[38;5;28;43minput\u001b[39;49m\u001b[43m,\u001b[49m\n\u001b[1;32m 96\u001b[0m \u001b[43m \u001b[49m\u001b[43mconfig\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 97\u001b[0m \u001b[43m \u001b[49m\u001b[43mrun_type\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[38;5;124;43mprompt\u001b[39;49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[43m,\u001b[49m\n\u001b[1;32m 98\u001b[0m \u001b[43m \u001b[49m\u001b[43m)\u001b[49m\n", + "File \u001b[0;32m~/.pyenv/versions/3.11.2/lib/python3.11/site-packages/langchain_core/runnables/base.py:975\u001b[0m, in \u001b[0;36mRunnable._call_with_config\u001b[0;34m(self, func, input, config, run_type, **kwargs)\u001b[0m\n\u001b[1;32m 971\u001b[0m context \u001b[38;5;241m=\u001b[39m copy_context()\n\u001b[1;32m 972\u001b[0m context\u001b[38;5;241m.\u001b[39mrun(var_child_runnable_config\u001b[38;5;241m.\u001b[39mset, child_config)\n\u001b[1;32m 973\u001b[0m output \u001b[38;5;241m=\u001b[39m cast(\n\u001b[1;32m 974\u001b[0m Output,\n\u001b[0;32m--> 975\u001b[0m \u001b[43mcontext\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mrun\u001b[49m\u001b[43m(\u001b[49m\n\u001b[1;32m 976\u001b[0m \u001b[43m \u001b[49m\u001b[43mcall_func_with_variable_args\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 977\u001b[0m \u001b[43m \u001b[49m\u001b[43mfunc\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;66;43;03m# type: ignore[arg-type]\u001b[39;49;00m\n\u001b[1;32m 978\u001b[0m \u001b[43m \u001b[49m\u001b[38;5;28;43minput\u001b[39;49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;66;43;03m# type: ignore[arg-type]\u001b[39;49;00m\n\u001b[1;32m 979\u001b[0m \u001b[43m \u001b[49m\u001b[43mconfig\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 980\u001b[0m \u001b[43m \u001b[49m\u001b[43mrun_manager\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 981\u001b[0m \u001b[43m \u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43mkwargs\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 982\u001b[0m \u001b[43m \u001b[49m\u001b[43m)\u001b[49m,\n\u001b[1;32m 983\u001b[0m )\n\u001b[1;32m 984\u001b[0m \u001b[38;5;28;01mexcept\u001b[39;00m \u001b[38;5;167;01mBaseException\u001b[39;00m \u001b[38;5;28;01mas\u001b[39;00m e:\n\u001b[1;32m 985\u001b[0m run_manager\u001b[38;5;241m.\u001b[39mon_chain_error(e)\n", + "File \u001b[0;32m~/.pyenv/versions/3.11.2/lib/python3.11/site-packages/langchain_core/runnables/config.py:323\u001b[0m, in \u001b[0;36mcall_func_with_variable_args\u001b[0;34m(func, input, config, run_manager, **kwargs)\u001b[0m\n\u001b[1;32m 321\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m run_manager \u001b[38;5;129;01mis\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m \u001b[38;5;28;01mNone\u001b[39;00m \u001b[38;5;129;01mand\u001b[39;00m accepts_run_manager(func):\n\u001b[1;32m 322\u001b[0m kwargs[\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mrun_manager\u001b[39m\u001b[38;5;124m\"\u001b[39m] \u001b[38;5;241m=\u001b[39m run_manager\n\u001b[0;32m--> 323\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[43mfunc\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;28;43minput\u001b[39;49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43mkwargs\u001b[49m\u001b[43m)\u001b[49m\n", + "File \u001b[0;32m~/.pyenv/versions/3.11.2/lib/python3.11/site-packages/langchain_core/prompts/base.py:83\u001b[0m, in \u001b[0;36mBasePromptTemplate._format_prompt_with_error_handling\u001b[0;34m(self, inner_input)\u001b[0m\n\u001b[1;32m 81\u001b[0m missing \u001b[38;5;241m=\u001b[39m \u001b[38;5;28mset\u001b[39m(\u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39minput_variables)\u001b[38;5;241m.\u001b[39mdifference(inner_input)\n\u001b[1;32m 82\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m missing:\n\u001b[0;32m---> 83\u001b[0m \u001b[38;5;28;01mraise\u001b[39;00m \u001b[38;5;167;01mKeyError\u001b[39;00m(\n\u001b[1;32m 84\u001b[0m \u001b[38;5;124mf\u001b[39m\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mInput to \u001b[39m\u001b[38;5;132;01m{\u001b[39;00m\u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m\u001b[38;5;18m__class__\u001b[39m\u001b[38;5;241m.\u001b[39m\u001b[38;5;18m__name__\u001b[39m\u001b[38;5;132;01m}\u001b[39;00m\u001b[38;5;124m is missing variables \u001b[39m\u001b[38;5;132;01m{\u001b[39;00mmissing\u001b[38;5;132;01m}\u001b[39;00m\u001b[38;5;124m. \u001b[39m\u001b[38;5;124m\"\u001b[39m\n\u001b[1;32m 85\u001b[0m \u001b[38;5;124mf\u001b[39m\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124m Expected: \u001b[39m\u001b[38;5;132;01m{\u001b[39;00m\u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39minput_variables\u001b[38;5;132;01m}\u001b[39;00m\u001b[38;5;124m\"\u001b[39m\n\u001b[1;32m 86\u001b[0m \u001b[38;5;124mf\u001b[39m\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124m Received: \u001b[39m\u001b[38;5;132;01m{\u001b[39;00m\u001b[38;5;28mlist\u001b[39m(inner_input\u001b[38;5;241m.\u001b[39mkeys())\u001b[38;5;132;01m}\u001b[39;00m\u001b[38;5;124m\"\u001b[39m\n\u001b[1;32m 87\u001b[0m )\n\u001b[1;32m 88\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mformat_prompt(\u001b[38;5;241m*\u001b[39m\u001b[38;5;241m*\u001b[39minner_input)\n", + "\u001b[0;31mKeyError\u001b[0m: \"Input to ChatPromptTemplate is missing variables {'input'}. Expected: ['input'] Received: ['thought', 'context']\"" + ] + } + ], + "source": [ + "# Try something to trigger replanning\n", + "chain.invoke(\n", + " {\n", + " \"input\": \"Did the sum of Aliya and Roger's grades in Calc map out to less than\"\n", + " \" the total grade for the class?\"\n", + " }\n", + ")" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "201f3dc0-74ee-4ef0-908d-b71d0e11b080", + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.11.2" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} From cf3630c3590adf0c933f149ce61cc27bf1153a87 Mon Sep 17 00:00:00 2001 From: William Fu-Hinthorn <13333726+hinthornw@users.noreply.github.com> Date: Mon, 15 Jan 2024 20:31:43 -0800 Subject: [PATCH 02/18] Add llm compiler example --- examples/LLMCompiler.ipynb | 957 ------------------------------------- 1 file changed, 957 deletions(-) delete mode 100644 examples/LLMCompiler.ipynb diff --git a/examples/LLMCompiler.ipynb b/examples/LLMCompiler.ipynb deleted file mode 100644 index ca73266b2..000000000 --- a/examples/LLMCompiler.ipynb +++ /dev/null @@ -1,957 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "id": "0c8b472b-f3fb-46c2-841f-930a4692697b", - "metadata": {}, - "source": [ - "# Implementing LLMCompiler using LangGraph\n", - "By Kim, et. al [đŸ”—](https://arxiv.org/abs/2312.04511)\n", - "\n", - "LLMCompiler is an agent architecture intented on speeding up the latency of agentic tasks via fast, parallel tool execution.\n", - "\n", - "It has 3 main components:\n", - "\n", - "1. Planner: generate a DAG of tasks.\n", - "2. Task Fetching Unit: schedules and executes the tasks\n", - "3. Joiner: Responds to the user or triggers a second plan." - ] - }, - { - "cell_type": "markdown", - "id": "1abdedbd-d81b-4ee9-b46f-f29439ed1350", - "metadata": {}, - "source": [ - "# Part 1: Planner" - ] - }, - { - "cell_type": "markdown", - "id": "278f76b0-a2e1-42dc-bd3e-6f624984e3dd", - "metadata": {}, - "source": [ - "#### Output Parser\n", - "\n", - "Parses task lists in the following form:\n", - "```plaintext\n", - "1. tool_1(\"arg1\", 3.5, ...)\n", - "Thought: I then want to find out Y by using tool_2\n", - "2. tool_2(\"\", ${1})'\n", - "3. join()\"\n", - "```\n", - "\n", - "The \"Thought\" lines are optional. The `${#}` placeholders are variables. These are used to route tool (task) outputs to other tools." - ] - }, - { - "cell_type": "code", - "execution_count": 1, - "id": "cc71b6c4-d701-4217-9701-95ac0857e4e1", - "metadata": {}, - "outputs": [], - "source": [ - "import ast\n", - "import json\n", - "import re\n", - "from typing import Any, Optional, Sequence, Union\n", - "\n", - "from langchain.agents.agent import AgentOutputParser\n", - "from langchain.schema import OutputParserException\n", - "from langchain_core.tools import BaseTool\n", - "\n", - "THOUGHT_PATTERN = r\"Thought: ([^\\n]*)\"\n", - "# ACTION_PATTERN = r\"\\n*(\\d+)\\. (.*?})(\\s*#\\w+\\n)?\"\n", - "# $1 or ${1} -> 1\n", - "ID_PATTERN = r\"\\$\\{?(\\d+)\\}?\"\n", - "END_OF_PLAN = \"\"\n", - "\n", - "\n", - "class ActionParserFSM:\n", - " def __init__(self):\n", - " self.reset()\n", - "\n", - " def reset(self):\n", - " self.state = \"START\"\n", - " self.task_index = \"\"\n", - " self.action = \"\"\n", - " self.comment = \"\"\n", - " self.bracket_count = 0\n", - " self.actions = []\n", - "\n", - " def parse(self, text: str):\n", - " for char in text:\n", - " action = self.process_char(char)\n", - " if action:\n", - " yield action\n", - " action = self.save_action()\n", - " if action:\n", - " yield action\n", - "\n", - " def process_char(self, char: str) -> Optional[dict]:\n", - " action = None\n", - " if self.state == \"START\":\n", - " if char.isdigit():\n", - " self.state = \"NUMBER\"\n", - " self.task_index += char\n", - " elif char == \"\\n\":\n", - " self.reset()\n", - " elif self.state == \"NUMBER\":\n", - " if char == \".\":\n", - " self.state = \"ACTION\"\n", - " elif char.isdigit():\n", - " self.task_index += char\n", - " else:\n", - " self.reset()\n", - " elif self.state == \"ACTION\":\n", - " if char == \"{\":\n", - " self.bracket_count += 1\n", - " elif char == \"}\":\n", - " self.bracket_count -= 1\n", - " if self.bracket_count == 0:\n", - " self.state = \"COMMENT\"\n", - " self.action += char\n", - " elif self.state == \"COMMENT\":\n", - " if char == \"\\n\":\n", - " action = self.save_action()\n", - " self.reset()\n", - " else:\n", - " self.comment += char\n", - " return action\n", - "\n", - " def save_action(self):\n", - " if self.task_index and self.action:\n", - " parsed_action = json.loads(self.action.strip())\n", - " tool_name, args = next(iter(parsed_action.items()))\n", - " return {\n", - " \"task_index\": int(self.task_index),\n", - " \"tool_name\": tool_name,\n", - " \"args\": args,\n", - " }\n", - "\n", - "\n", - "class LLMCompilerPlanParser(AgentOutputParser, extra=\"allow\"):\n", - " \"\"\"Planning output parser.\"\"\"\n", - "\n", - " def __init__(self, tools: Sequence[BaseTool], **kwargs):\n", - " super().__init__(**kwargs)\n", - " self.tools = tools\n", - "\n", - " def parse(self, text: str) -> list[str]:\n", - " parser = ActionParserFSM()\n", - " graph_dict = {}\n", - " for task in parser.parse(text):\n", - " idx = int(task[\"task_index\"])\n", - "\n", - " task = instantiate_task(\n", - " tools=self.tools,\n", - " idx=idx,\n", - " tool_name=task[\"tool_name\"],\n", - " args=task[\"args\"],\n", - " )\n", - "\n", - " graph_dict[idx] = task\n", - " if task[\"tool\"] == \"join\":\n", - " break\n", - "\n", - " return graph_dict\n", - "\n", - "\n", - "### Helper functions\n", - "\n", - "\n", - "def default_dependency_rule(idx, args: str):\n", - " matches = re.findall(ID_PATTERN, args)\n", - " numbers = [int(match) for match in matches]\n", - " return idx in numbers\n", - "\n", - "\n", - "def _get_dependencies_from_graph(\n", - " idx: int, tool_name: str, args: Sequence[Any]\n", - ") -> dict[str, list[str]]:\n", - " \"\"\"Get dependencies from a graph.\"\"\"\n", - " if tool_name == \"join\":\n", - " return list(range(1, idx))\n", - " return [i for i in range(1, idx) if default_dependency_rule(i, str(args))]\n", - "\n", - "\n", - "def instantiate_task(\n", - " tools: Sequence[BaseTool],\n", - " idx: int,\n", - " tool_name: str,\n", - " args: Union[dict, str, bool, None],\n", - ") -> dict:\n", - " dependencies = _get_dependencies_from_graph(idx, tool_name, args)\n", - " if tool_name == \"join\":\n", - " tool = \"join\"\n", - " else:\n", - " try:\n", - " tool = tools[[tool.name for tool in tools].index(tool_name)]\n", - " except ValueError as e:\n", - " raise OutputParserException(f\"Tool {tool_name} not found.\")\n", - " return dict(\n", - " tool=tool,\n", - " args=args,\n", - " dependencies=dependencies,\n", - " )" - ] - }, - { - "cell_type": "markdown", - "id": "228a2f75-68b1-4dbf-95dc-4bfc738c3b3b", - "metadata": {}, - "source": [ - "#### Planner Code\n", - "\n", - "This takes the input and outputs a plan." - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "id": "58af9746-1011-41e9-a77a-be9cef202aea", - "metadata": {}, - "outputs": [], - "source": [ - "import asyncio\n", - "import json\n", - "import re\n", - "from typing import Any, Optional, Sequence, Union\n", - "from uuid import UUID\n", - "\n", - "from langchain.callbacks.base import AsyncCallbackHandler, Callbacks\n", - "from langchain.chat_models.base import BaseChatModel\n", - "from langchain.schema import LLMResult\n", - "from langchain.schema.messages import HumanMessage, SystemMessage\n", - "from langchain_core.prompts import ChatPromptTemplate\n", - "from langchain_core.pydantic_v1 import BaseModel\n", - "from langchain_core.runnables import RunnableBranch\n", - "from langchain_core.tools import BaseTool\n", - "\n", - "END_OF_PLAN = \"\"\n", - "\n", - "JOINER_FINISH = \"Finish\"\n", - "JOINER_REPLAN = \"Replan\"\n", - "\n", - "\n", - "JOIN_DESCRIPTION = (\n", - " \"join():\\n\"\n", - " \" - Collects and combines results from prior actions.\\n\"\n", - " \" - A LLM agent is called upon invoking join to either finalize the user query or wait until the plans are executed.\\n\"\n", - " \" - join should always be the last action in the plan, and will be called in two scenarios:\\n\"\n", - " \" (a) if the answer can be determined by gathering the outputs from tasks to generate the final response.\\n\"\n", - " \" (b) if the answer cannot be determined in the planning phase before you execute the plans. \"\n", - ")\n", - "\n", - "planner_prompt_tmpl_str = (\n", - " \"Given a user query, create a plan to solve it with the utmost parallelizability. \"\n", - " \"Each plan should comprise an action from the following {num_tools} types:\\n\"\n", - " \"{tool_descriptions}\"\n", - " f\"\\n{{num_toolsp1}}. {JOIN_DESCRIPTION}\"\n", - " \"Guidelines:\\n\"\n", - " \" - Each action described above contains input/output types and description.\\n\"\n", - " \" - You must strictly adhere to the input and output types for each action.\\n\"\n", - " \" - The action descriptions contain the guidelines. You MUST strictly follow those guidelines when you use the actions.\\n\"\n", - " \" - Each action in the plan should strictly be one of the above types. Follow the Python conventions for each action.\\n\"\n", - " \" - Pass arguments by keyword ONLY\\n\"\n", - " \" - Each action MUST have a unique ID, which is strictly increasing.\\n\"\n", - " \" - Inputs for actions can either be constants or outputs from preceding actions. \"\n", - " \"In the latter case, use the format $id to denote the ID of the previous action whose output will be the input.\\n\"\n", - " f\" - Always call join as the last action in the plan. Say '{END_OF_PLAN}' after you call join\\n\"\n", - " \" - Ensure the plan maximizes parallelizability.\\n\"\n", - " \" - Only use the provided action types. If a query cannot be addressed using these, invoke the join action for the next steps.\\n\"\n", - " \" - Never explain the plan with comments (e.g. #).\\n\"\n", - " \" - Never introduce new actions other than the ones provided.\\n\\n\"\n", - " \"{replan}\"\n", - " \"{examples}\"\n", - ")\n", - "\n", - "\n", - "def _generate_planner_prompt(\n", - " tools: Sequence[BaseTool],\n", - " example_prompt=str,\n", - "):\n", - " tool_descriptions = \"\\n\".join(\n", - " f\"{i+1}. {tool.description}\" for i, tool in enumerate(tools)\n", - " )\n", - " planner_prompt_template = ChatPromptTemplate.from_messages(\n", - " [(\"system\", planner_prompt_tmpl_str), (\"user\", \"Question: {input}{context}\")]\n", - " ).partial(\n", - " tool_descriptions=tool_descriptions,\n", - " examples=\"Here are some examples:\\n\\n\" + example_prompt\n", - " if example_prompt\n", - " else \"\",\n", - " num_tools=len(tools),\n", - " num_toolsp1=len(tools) + 1,\n", - " )\n", - "\n", - " return planner_prompt_template\n", - "\n", - "\n", - "def create_planner(\n", - " llm: BaseChatModel,\n", - " example_prompt: str,\n", - " example_prompt_replan: str,\n", - " tools: Sequence[Union[BaseTool]],\n", - " stop: Optional[list[str]] = None,\n", - "):\n", - " og_planner_prompt = _generate_planner_prompt(tools, example_prompt).partial(\n", - " replan=\"\",\n", - " context=\"\",\n", - " )\n", - " replanner_prompt = _generate_planner_prompt(tools, example_prompt).partial(\n", - " replan=' - You are given \"Previous Plan\" which is the plan that the previous agent created along with the execution results '\n", - " \"(given as Observation) of each plan and a general thought (given as Thought) about the executed results.\"\n", - " 'You MUST use these information to create the next plan under \"Current Plan\".\\n'\n", - " ' - When starting the Current Plan, you should start with \"Thought\" that outlines the strategy for the next plan.\\n'\n", - " \" - In the Current Plan, you should NEVER repeat the actions that are already executed in the Previous Plan.\\n\"\n", - " )\n", - " bound_llm = llm.bind(stop=stop)\n", - " return (\n", - " RunnableBranch(\n", - " ((lambda x: x.get(\"replan\")), replanner_prompt),\n", - " og_planner_prompt,\n", - " )\n", - " | bound_llm\n", - " | LLMCompilerPlanParser(tools=tools)\n", - " )" - ] - }, - { - "cell_type": "markdown", - "id": "7feb5c82-b1a9-40ae-863a-0362fe3ce5ea", - "metadata": {}, - "source": [ - "#### Example usage\n", - "\n", - "Here's an example usage of the planner module" - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "id": "3fe074ea-7314-47a7-9a9f-a8e6191ea1f3", - "metadata": {}, - "outputs": [], - "source": [ - "from langchain.tools import tool\n", - "from langchain_openai import ChatOpenAI\n", - "\n", - "\n", - "@tool\n", - "def get_user_id(first_name: str, last_name: Optional[str] = None):\n", - " \"\"\"Query the user IDs of everyone with the provided name.\"\"\"\n", - " return 4\n", - "\n", - "\n", - "@tool\n", - "def get_scores(class_name: str, user_id: int):\n", - " \"\"\"Query the class registry for grades of the provided user ID.\"\"\"\n", - " return \"A+\"\n", - "\n", - "\n", - "examples = (\n", - " \"Question: What's the user ID for Johnny Drop Tables?\\n\"\n", - " '1. {\"get_user_id\": {\"first_name\": \"Johnny\", \"last_name\":\"Drop Tables\"}}\\n'\n", - " f'2. {{\"join\": null}}{END_OF_PLAN}\\n'\n", - " \"###\\n\"\n", - " \"\\n\"\n", - " \"Question: What was Eric Zhang's score in Calc?\\n\"\n", - " '1. {\"get_user_id\": {\"first_name\": \"Eric\", \"last_name\":\"Zhang\"}}\\n'\n", - " '2. {\"get_scores\": {\"class_name\": \"calc\", \"user_id\": \"$1\"}}\\n'\n", - " f'3. {{\"join\": null}}{END_OF_PLAN}\\n'\n", - " \"###\\n\"\n", - " \"\\n\"\n", - ")\n", - "\n", - "planner = create_planner(\n", - " ChatOpenAI(model=\"gpt-3.5-turbo\"),\n", - " example_prompt=examples,\n", - " example_prompt_replan=\"\",\n", - " tools=[get_user_id, get_scores],\n", - ")" - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "id": "55fb0f99-4e59-4e5a-b687-a90bb4d06d39", - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "{1: {'tool': StructuredTool(name='get_user_id', description='get_user_id(first_name: str, last_name: Optional[str] = None) - Query the user IDs of everyone with the provided name.', args_schema=, func=),\n", - " 'args': {'first_name': 'Sam', 'last_name': 'Van Damm'},\n", - " 'dependencies': []},\n", - " 2: {'tool': StructuredTool(name='get_user_id', description='get_user_id(first_name: str, last_name: Optional[str] = None) - Query the user IDs of everyone with the provided name.', args_schema=, func=),\n", - " 'args': {'first_name': 'Will', 'last_name': 'Van Damm'},\n", - " 'dependencies': []},\n", - " 3: {'tool': StructuredTool(name='get_scores', description='get_scores(class_name: str, user_id: int) - Query the class registry for grades of the provided user ID.', args_schema=, func=),\n", - " 'args': {'class_name': 'Calc BC', 'user_id': '$1'},\n", - " 'dependencies': [1]},\n", - " 4: {'tool': StructuredTool(name='get_scores', description='get_scores(class_name: str, user_id: int) - Query the class registry for grades of the provided user ID.', args_schema=, func=),\n", - " 'args': {'class_name': 'Calc BC', 'user_id': '$2'},\n", - " 'dependencies': [2]},\n", - " 5: {'tool': 'join', 'args': None, 'dependencies': [1, 2, 3, 4]}}" - ] - }, - "execution_count": 4, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "tasks = planner.invoke(\n", - " {\"input\": \"What are the Calc BC grades for Sam and Will Van Damm?\"}\n", - ")\n", - "tasks" - ] - }, - { - "cell_type": "markdown", - "id": "5d0e795f-61ff-4553-9823-23e7624ca180", - "metadata": {}, - "source": [ - "## 2. Task Fetching Unit\n", - "\n", - "This component scheudles the tasks. In the paper, it's kept separate from the \"executor\", but here we execute the tasks within the same DAG.\n", - "\n", - "Basic idea is that, given a list of dicts of the form:\n", - "\n", - "```typescript\n", - "{\n", - " tool: BaseTool,\n", - " dependencies: number[],\n", - "}\n", - "```\n", - "\n", - "1. Create a topological sort of the tasks\n", - "2. Execute them on the previous step's output, ensuring to perform variable substitution where appropriate" - ] - }, - { - "cell_type": "code", - "execution_count": 5, - "id": "c70a0e28-43db-4ea2-af48-8a2f310dce83", - "metadata": {}, - "outputs": [], - "source": [ - "import logging\n", - "\n", - "from langchain_core.agents import AgentFinish\n", - "from langchain_core.runnables import (\n", - " RunnableLambda,\n", - " RunnableParallel,\n", - " RunnablePassthrough,\n", - ")\n", - "from langgraph.graph import END, Graph\n", - "\n", - "logging.basicConfig(level=logging.INFO)\n", - "logger = logging.getLogger()\n", - "\n", - "\n", - "def _sort_tasks(data):\n", - " sorted_tasks = []\n", - " while data:\n", - " no_deps = {k: v for k, v in data.items() if not v[\"dependencies\"]}\n", - " if not no_deps:\n", - " raise ValueError(\"We seem to have run into a circular dependency.\")\n", - "\n", - " sorted_tasks.append(no_deps)\n", - " data = {\n", - " k: {\n", - " **v,\n", - " \"dependencies\": [d for d in v[\"dependencies\"] if d not in no_deps],\n", - " }\n", - " for k, v in data.items()\n", - " if k not in no_deps\n", - " }\n", - " return sorted_tasks\n", - "\n", - "\n", - "def _resolve_arg(x: dict, arg):\n", - " return x[f\"task_{arg[1:]}\"] if isinstance(arg, str) and arg.startswith(\"$\") else arg\n", - "\n", - "\n", - "def _execute_task(task, x, config):\n", - " tool_to_use = task[\"tool\"]\n", - " args = task[\"args\"]\n", - " if isinstance(args, str):\n", - " resolved_args = _resolve_arg(x, args)\n", - " elif isinstance(args, dict):\n", - " resolved_args = {key: _resolve_arg(x, val) for key, val in args.items()}\n", - " else:\n", - " logger.warning(f\"Unsupported arg type: {args}\")\n", - " return tool_to_use.invoke(resolved_args, config)\n", - "\n", - "\n", - "def construct_dag(tasks):\n", - " sorted_tasks = _sort_tasks(tasks)\n", - " chain = None\n", - " for idx, task_group in enumerate(sorted_tasks):\n", - " if len(task_group) == 1 and next(iter(task_group.values()))[\"tool\"] == \"join\":\n", - " # TODO: actually join the values\n", - " step = lambda x: {\"join\": x}\n", - " else:\n", - " # Cascade all results forward\n", - " constructor = (\n", - " RunnableParallel if chain is None else RunnablePassthrough.assign\n", - " )\n", - " step = constructor(\n", - " **{\n", - " f\"task_{idx}\": RunnableLambda(\n", - " lambda x, config: _execute_task(task, x, config)\n", - " ).with_config(run_name=f\"task_{idx}\")\n", - " for idx, task in task_group.items()\n", - " }\n", - " ).with_config(run_name=f\"TaskGroup{idx}\")\n", - " if chain is None:\n", - " chain = step\n", - " else:\n", - " chain |= step\n", - "\n", - " if chain is not None:\n", - " return chain | RunnablePassthrough.assign(tasks=lambda _: tasks)\n", - " return chain" - ] - }, - { - "cell_type": "code", - "execution_count": 6, - "id": "6fecaefc-d904-4409-af63-53c5b7a3785f", - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - " +------------------------------+ \n", - " | ParallelInput | \n", - " +------------------------------+ \n", - " ***** ***** \n", - " **** **** \n", - " *** *** \n", - " +---------------------------------------+ +---------------------------------------+ \n", - " | Lambda(lambda x, config: _execute_... | | Lambda(lambda x, config: _execute_... | \n", - " +---------------------------------------+ +---------------------------------------+ \n", - " ***** ***** \n", - " **** **** \n", - " *** *** \n", - " +-------------------------------+ \n", - " | ParallelOutput | \n", - " +-------------------------------+ \n", - " * \n", - " * \n", - " * \n", - " +------------------------------+ \n", - " | ParallelInput | \n", - " ****+------------------------------+***** \n", - " ******** * ********* \n", - " ******** * ******** \n", - " ***** * ***** \n", - "+---------------------------------------+ +---------------------------------------+ +-------------+ \n", - "| Lambda(lambda x, config: _execute_... | | Lambda(lambda x, config: _execute_... | ****| Passthrough | \n", - "+---------------------------------------+* +---------------------------------------+ ******** +-------------+ \n", - " ******** * ********* \n", - " ******** * ******** \n", - " ***** * ***** \n", - " +-------------------------------+ \n", - " | ParallelOutput | \n", - " +-------------------------------+ \n", - " * \n", - " * \n", - " * \n", - " +-------------------------------+ \n", - " | Lambda(lambda x: {'join': x}) | \n", - " +-------------------------------+ \n", - " * \n", - " * \n", - " * \n", - " +----------------------+ \n", - " | ParallelInput | \n", - " +----------------------+ \n", - " *** *** \n", - " *** *** \n", - " ** ** \n", - " +-------------------------+ +-------------+ \n", - " | Lambda(lambda _: tasks) | | Passthrough | \n", - " +-------------------------+ +-------------+ \n", - " *** *** \n", - " *** *** \n", - " ** ** \n", - " +-----------------------+ \n", - " | ParallelOutput | \n", - " +-----------------------+ \n" - ] - } - ], - "source": [ - "graph = construct_dag(tasks)\n", - "graph.get_graph().print_ascii()" - ] - }, - { - "cell_type": "markdown", - "id": "9efa15ae-817a-48c6-86ed-16bc112fedc5", - "metadata": {}, - "source": [ - "### Example\n", - "\n", - "We still haven't introduced any cycles in our computation graph, so this is all easily expressed in LCEL." - ] - }, - { - "cell_type": "code", - "execution_count": 7, - "id": "133d124a-0d41-4c6d-a86a-34fa4cb1430f", - "metadata": {}, - "outputs": [], - "source": [ - "chain = planner | construct_dag" - ] - }, - { - "cell_type": "code", - "execution_count": 15, - "id": "55142257-2674-4a47-988e-0d2810917329", - "metadata": {}, - "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "INFO:httpx:HTTP Request: POST https://api.openai.com/v1/chat/completions \"HTTP/1.1 200 OK\"\n" - ] - }, - { - "ename": "KeyError", - "evalue": "\"Input to ChatPromptTemplate is missing variables {'input'}. Expected: ['input', 'scratchpad'] Received: ['join', 'tasks', 'scratchpad']\"", - "output_type": "error", - "traceback": [ - "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", - "\u001b[0;31mKeyError\u001b[0m Traceback (most recent call last)", - "Cell \u001b[0;32mIn[15], line 2\u001b[0m\n\u001b[1;32m 1\u001b[0m example_question \u001b[38;5;241m=\u001b[39m \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mDid Aliya get a better score than Roger in Geology?\u001b[39m\u001b[38;5;124m\"\u001b[39m\n\u001b[0;32m----> 2\u001b[0m task_results \u001b[38;5;241m=\u001b[39m \u001b[43mchain\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43minvoke\u001b[49m\u001b[43m(\u001b[49m\u001b[43m{\u001b[49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[38;5;124;43minput\u001b[39;49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[43m:\u001b[49m\u001b[43m \u001b[49m\u001b[43mexample_question\u001b[49m\u001b[43m}\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 3\u001b[0m task_results[\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mjoin\u001b[39m\u001b[38;5;124m\"\u001b[39m]\n", - "File \u001b[0;32m~/code/lc/langgraph/langgraph/pregel/__init__.py:456\u001b[0m, in \u001b[0;36mPregel.invoke\u001b[0;34m(self, input, config, output, **kwargs)\u001b[0m\n\u001b[1;32m 447\u001b[0m \u001b[38;5;28;01mdef\u001b[39;00m \u001b[38;5;21minvoke\u001b[39m(\n\u001b[1;32m 448\u001b[0m \u001b[38;5;28mself\u001b[39m,\n\u001b[1;32m 449\u001b[0m \u001b[38;5;28minput\u001b[39m: Union[\u001b[38;5;28mdict\u001b[39m[\u001b[38;5;28mstr\u001b[39m, Any], Any],\n\u001b[0;32m (...)\u001b[0m\n\u001b[1;32m 453\u001b[0m \u001b[38;5;241m*\u001b[39m\u001b[38;5;241m*\u001b[39mkwargs: Any,\n\u001b[1;32m 454\u001b[0m ) \u001b[38;5;241m-\u001b[39m\u001b[38;5;241m>\u001b[39m Union[\u001b[38;5;28mdict\u001b[39m[\u001b[38;5;28mstr\u001b[39m, Any], Any]:\n\u001b[1;32m 455\u001b[0m latest: Union[\u001b[38;5;28mdict\u001b[39m[\u001b[38;5;28mstr\u001b[39m, Any], Any] \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;01mNone\u001b[39;00m\n\u001b[0;32m--> 456\u001b[0m \u001b[43m \u001b[49m\u001b[38;5;28;43;01mfor\u001b[39;49;00m\u001b[43m \u001b[49m\u001b[43mchunk\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;129;43;01min\u001b[39;49;00m\u001b[43m \u001b[49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mstream\u001b[49m\u001b[43m(\u001b[49m\n\u001b[1;32m 457\u001b[0m \u001b[43m \u001b[49m\u001b[38;5;28;43minput\u001b[39;49m\u001b[43m,\u001b[49m\n\u001b[1;32m 458\u001b[0m \u001b[43m \u001b[49m\u001b[43mconfig\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 459\u001b[0m \u001b[43m \u001b[49m\u001b[43moutput\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43moutput\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;28;43;01mif\u001b[39;49;00m\u001b[43m \u001b[49m\u001b[43moutput\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;129;43;01mis\u001b[39;49;00m\u001b[43m \u001b[49m\u001b[38;5;129;43;01mnot\u001b[39;49;00m\u001b[43m \u001b[49m\u001b[38;5;28;43;01mNone\u001b[39;49;00m\u001b[43m \u001b[49m\u001b[38;5;28;43;01melse\u001b[39;49;00m\u001b[43m \u001b[49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43moutput\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 460\u001b[0m \u001b[43m \u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43mkwargs\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 461\u001b[0m \u001b[43m \u001b[49m\u001b[43m)\u001b[49m\u001b[43m:\u001b[49m\n\u001b[1;32m 462\u001b[0m \u001b[43m \u001b[49m\u001b[43mlatest\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43m \u001b[49m\u001b[43mchunk\u001b[49m\n\u001b[1;32m 463\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m latest\n", - "File \u001b[0;32m~/code/lc/langgraph/langgraph/pregel/__init__.py:483\u001b[0m, in \u001b[0;36mPregel.transform\u001b[0;34m(self, input, config, output, **kwargs)\u001b[0m\n\u001b[1;32m 475\u001b[0m \u001b[38;5;28;01mdef\u001b[39;00m \u001b[38;5;21mtransform\u001b[39m(\n\u001b[1;32m 476\u001b[0m \u001b[38;5;28mself\u001b[39m,\n\u001b[1;32m 477\u001b[0m \u001b[38;5;28minput\u001b[39m: Iterator[Union[\u001b[38;5;28mdict\u001b[39m[\u001b[38;5;28mstr\u001b[39m, Any], Any]],\n\u001b[0;32m (...)\u001b[0m\n\u001b[1;32m 481\u001b[0m \u001b[38;5;241m*\u001b[39m\u001b[38;5;241m*\u001b[39mkwargs: Any,\n\u001b[1;32m 482\u001b[0m ) \u001b[38;5;241m-\u001b[39m\u001b[38;5;241m>\u001b[39m Iterator[Union[\u001b[38;5;28mdict\u001b[39m[\u001b[38;5;28mstr\u001b[39m, Any], Any]]:\n\u001b[0;32m--> 483\u001b[0m \u001b[43m \u001b[49m\u001b[38;5;28;43;01mfor\u001b[39;49;00m\u001b[43m \u001b[49m\u001b[43mchunk\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;129;43;01min\u001b[39;49;00m\u001b[43m \u001b[49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43m_transform_stream_with_config\u001b[49m\u001b[43m(\u001b[49m\n\u001b[1;32m 484\u001b[0m \u001b[43m \u001b[49m\u001b[38;5;28;43minput\u001b[39;49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43m_transform\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mconfig\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43moutput\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43moutput\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43mkwargs\u001b[49m\n\u001b[1;32m 485\u001b[0m \u001b[43m \u001b[49m\u001b[43m)\u001b[49m\u001b[43m:\u001b[49m\n\u001b[1;32m 486\u001b[0m \u001b[43m \u001b[49m\u001b[38;5;28;43;01myield\u001b[39;49;00m\u001b[43m \u001b[49m\u001b[43mchunk\u001b[49m\n", - "File \u001b[0;32m~/.pyenv/versions/3.11.2/lib/python3.11/site-packages/langchain_core/runnables/base.py:1226\u001b[0m, in \u001b[0;36mRunnable._transform_stream_with_config\u001b[0;34m(self, input, transformer, config, run_type, **kwargs)\u001b[0m\n\u001b[1;32m 1224\u001b[0m \u001b[38;5;28;01mtry\u001b[39;00m:\n\u001b[1;32m 1225\u001b[0m \u001b[38;5;28;01mwhile\u001b[39;00m \u001b[38;5;28;01mTrue\u001b[39;00m:\n\u001b[0;32m-> 1226\u001b[0m chunk: Output \u001b[38;5;241m=\u001b[39m \u001b[43mcontext\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mrun\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;28;43mnext\u001b[39;49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43miterator\u001b[49m\u001b[43m)\u001b[49m \u001b[38;5;66;03m# type: ignore\u001b[39;00m\n\u001b[1;32m 1227\u001b[0m \u001b[38;5;28;01myield\u001b[39;00m chunk\n\u001b[1;32m 1228\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m final_output_supported:\n", - "File \u001b[0;32m~/code/lc/langgraph/langgraph/pregel/__init__.py:301\u001b[0m, in \u001b[0;36mPregel._transform\u001b[0;34m(self, input, run_manager, config, output)\u001b[0m\n\u001b[1;32m 291\u001b[0m done, inflight \u001b[38;5;241m=\u001b[39m concurrent\u001b[38;5;241m.\u001b[39mfutures\u001b[38;5;241m.\u001b[39mwait(\n\u001b[1;32m 292\u001b[0m [\n\u001b[1;32m 293\u001b[0m executor\u001b[38;5;241m.\u001b[39msubmit(proc\u001b[38;5;241m.\u001b[39minvoke, \u001b[38;5;28minput\u001b[39m, config)\n\u001b[0;32m (...)\u001b[0m\n\u001b[1;32m 297\u001b[0m timeout\u001b[38;5;241m=\u001b[39m\u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mstep_timeout,\n\u001b[1;32m 298\u001b[0m )\n\u001b[1;32m 300\u001b[0m \u001b[38;5;66;03m# interrupt on failure or timeout\u001b[39;00m\n\u001b[0;32m--> 301\u001b[0m \u001b[43m_interrupt_or_proceed\u001b[49m\u001b[43m(\u001b[49m\u001b[43mdone\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43minflight\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mstep\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 303\u001b[0m \u001b[38;5;66;03m# apply writes to channels\u001b[39;00m\n\u001b[1;32m 304\u001b[0m _apply_writes(checkpoint, channels, pending_writes, config, step \u001b[38;5;241m+\u001b[39m \u001b[38;5;241m1\u001b[39m)\n", - "File \u001b[0;32m~/code/lc/langgraph/langgraph/pregel/__init__.py:548\u001b[0m, in \u001b[0;36m_interrupt_or_proceed\u001b[0;34m(done, inflight, step)\u001b[0m\n\u001b[1;32m 546\u001b[0m inflight\u001b[38;5;241m.\u001b[39mpop()\u001b[38;5;241m.\u001b[39mcancel()\n\u001b[1;32m 547\u001b[0m \u001b[38;5;66;03m# raise the exception\u001b[39;00m\n\u001b[0;32m--> 548\u001b[0m \u001b[38;5;28;01mraise\u001b[39;00m exc\n\u001b[1;32m 549\u001b[0m \u001b[38;5;66;03m# TODO this is where retry of an entire step would happen\u001b[39;00m\n\u001b[1;32m 551\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m inflight:\n\u001b[1;32m 552\u001b[0m \u001b[38;5;66;03m# if we got here means we timed out\u001b[39;00m\n", - "File \u001b[0;32m~/.pyenv/versions/3.11.2/lib/python3.11/concurrent/futures/thread.py:58\u001b[0m, in \u001b[0;36m_WorkItem.run\u001b[0;34m(self)\u001b[0m\n\u001b[1;32m 55\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m\n\u001b[1;32m 57\u001b[0m \u001b[38;5;28;01mtry\u001b[39;00m:\n\u001b[0;32m---> 58\u001b[0m result \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mfn\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43margs\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mkwargs\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 59\u001b[0m \u001b[38;5;28;01mexcept\u001b[39;00m \u001b[38;5;167;01mBaseException\u001b[39;00m \u001b[38;5;28;01mas\u001b[39;00m exc:\n\u001b[1;32m 60\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mfuture\u001b[38;5;241m.\u001b[39mset_exception(exc)\n", - "File \u001b[0;32m~/.pyenv/versions/3.11.2/lib/python3.11/site-packages/langchain_core/runnables/base.py:3596\u001b[0m, in \u001b[0;36mRunnableBindingBase.invoke\u001b[0;34m(self, input, config, **kwargs)\u001b[0m\n\u001b[1;32m 3590\u001b[0m \u001b[38;5;28;01mdef\u001b[39;00m \u001b[38;5;21minvoke\u001b[39m(\n\u001b[1;32m 3591\u001b[0m \u001b[38;5;28mself\u001b[39m,\n\u001b[1;32m 3592\u001b[0m \u001b[38;5;28minput\u001b[39m: Input,\n\u001b[1;32m 3593\u001b[0m config: Optional[RunnableConfig] \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;01mNone\u001b[39;00m,\n\u001b[1;32m 3594\u001b[0m \u001b[38;5;241m*\u001b[39m\u001b[38;5;241m*\u001b[39mkwargs: Optional[Any],\n\u001b[1;32m 3595\u001b[0m ) \u001b[38;5;241m-\u001b[39m\u001b[38;5;241m>\u001b[39m Output:\n\u001b[0;32m-> 3596\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mbound\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43minvoke\u001b[49m\u001b[43m(\u001b[49m\n\u001b[1;32m 3597\u001b[0m \u001b[43m \u001b[49m\u001b[38;5;28;43minput\u001b[39;49m\u001b[43m,\u001b[49m\n\u001b[1;32m 3598\u001b[0m \u001b[43m \u001b[49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43m_merge_configs\u001b[49m\u001b[43m(\u001b[49m\u001b[43mconfig\u001b[49m\u001b[43m)\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 3599\u001b[0m \u001b[43m \u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43m{\u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mkwargs\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43mkwargs\u001b[49m\u001b[43m}\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 3600\u001b[0m \u001b[43m \u001b[49m\u001b[43m)\u001b[49m\n", - "File \u001b[0;32m~/.pyenv/versions/3.11.2/lib/python3.11/site-packages/langchain_core/runnables/base.py:1774\u001b[0m, in \u001b[0;36mRunnableSequence.invoke\u001b[0;34m(self, input, config)\u001b[0m\n\u001b[1;32m 1772\u001b[0m \u001b[38;5;28;01mtry\u001b[39;00m:\n\u001b[1;32m 1773\u001b[0m \u001b[38;5;28;01mfor\u001b[39;00m i, step \u001b[38;5;129;01min\u001b[39;00m \u001b[38;5;28menumerate\u001b[39m(\u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39msteps):\n\u001b[0;32m-> 1774\u001b[0m \u001b[38;5;28minput\u001b[39m \u001b[38;5;241m=\u001b[39m \u001b[43mstep\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43minvoke\u001b[49m\u001b[43m(\u001b[49m\n\u001b[1;32m 1775\u001b[0m \u001b[43m \u001b[49m\u001b[38;5;28;43minput\u001b[39;49m\u001b[43m,\u001b[49m\n\u001b[1;32m 1776\u001b[0m \u001b[43m \u001b[49m\u001b[38;5;66;43;03m# mark each step as a child run\u001b[39;49;00m\n\u001b[1;32m 1777\u001b[0m \u001b[43m \u001b[49m\u001b[43mpatch_config\u001b[49m\u001b[43m(\u001b[49m\n\u001b[1;32m 1778\u001b[0m \u001b[43m \u001b[49m\u001b[43mconfig\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mcallbacks\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mrun_manager\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mget_child\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;124;43mf\u001b[39;49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[38;5;124;43mseq:step:\u001b[39;49m\u001b[38;5;132;43;01m{\u001b[39;49;00m\u001b[43mi\u001b[49m\u001b[38;5;241;43m+\u001b[39;49m\u001b[38;5;241;43m1\u001b[39;49m\u001b[38;5;132;43;01m}\u001b[39;49;00m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[43m)\u001b[49m\n\u001b[1;32m 1779\u001b[0m \u001b[43m \u001b[49m\u001b[43m)\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 1780\u001b[0m \u001b[43m \u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 1781\u001b[0m \u001b[38;5;66;03m# finish the root run\u001b[39;00m\n\u001b[1;32m 1782\u001b[0m \u001b[38;5;28;01mexcept\u001b[39;00m \u001b[38;5;167;01mBaseException\u001b[39;00m \u001b[38;5;28;01mas\u001b[39;00m e:\n", - "File \u001b[0;32m~/.pyenv/versions/3.11.2/lib/python3.11/site-packages/langchain_core/prompts/base.py:93\u001b[0m, in \u001b[0;36mBasePromptTemplate.invoke\u001b[0;34m(self, input, config)\u001b[0m\n\u001b[1;32m 90\u001b[0m \u001b[38;5;28;01mdef\u001b[39;00m \u001b[38;5;21minvoke\u001b[39m(\n\u001b[1;32m 91\u001b[0m \u001b[38;5;28mself\u001b[39m, \u001b[38;5;28minput\u001b[39m: Dict, config: Optional[RunnableConfig] \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;01mNone\u001b[39;00m\n\u001b[1;32m 92\u001b[0m ) \u001b[38;5;241m-\u001b[39m\u001b[38;5;241m>\u001b[39m PromptValue:\n\u001b[0;32m---> 93\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43m_call_with_config\u001b[49m\u001b[43m(\u001b[49m\n\u001b[1;32m 94\u001b[0m \u001b[43m \u001b[49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43m_format_prompt_with_error_handling\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 95\u001b[0m \u001b[43m \u001b[49m\u001b[38;5;28;43minput\u001b[39;49m\u001b[43m,\u001b[49m\n\u001b[1;32m 96\u001b[0m \u001b[43m \u001b[49m\u001b[43mconfig\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 97\u001b[0m \u001b[43m \u001b[49m\u001b[43mrun_type\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[38;5;124;43mprompt\u001b[39;49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[43m,\u001b[49m\n\u001b[1;32m 98\u001b[0m \u001b[43m \u001b[49m\u001b[43m)\u001b[49m\n", - "File \u001b[0;32m~/.pyenv/versions/3.11.2/lib/python3.11/site-packages/langchain_core/runnables/base.py:975\u001b[0m, in \u001b[0;36mRunnable._call_with_config\u001b[0;34m(self, func, input, config, run_type, **kwargs)\u001b[0m\n\u001b[1;32m 971\u001b[0m context \u001b[38;5;241m=\u001b[39m copy_context()\n\u001b[1;32m 972\u001b[0m context\u001b[38;5;241m.\u001b[39mrun(var_child_runnable_config\u001b[38;5;241m.\u001b[39mset, child_config)\n\u001b[1;32m 973\u001b[0m output \u001b[38;5;241m=\u001b[39m cast(\n\u001b[1;32m 974\u001b[0m Output,\n\u001b[0;32m--> 975\u001b[0m \u001b[43mcontext\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mrun\u001b[49m\u001b[43m(\u001b[49m\n\u001b[1;32m 976\u001b[0m \u001b[43m \u001b[49m\u001b[43mcall_func_with_variable_args\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 977\u001b[0m \u001b[43m \u001b[49m\u001b[43mfunc\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;66;43;03m# type: ignore[arg-type]\u001b[39;49;00m\n\u001b[1;32m 978\u001b[0m \u001b[43m \u001b[49m\u001b[38;5;28;43minput\u001b[39;49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;66;43;03m# type: ignore[arg-type]\u001b[39;49;00m\n\u001b[1;32m 979\u001b[0m \u001b[43m \u001b[49m\u001b[43mconfig\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 980\u001b[0m \u001b[43m \u001b[49m\u001b[43mrun_manager\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 981\u001b[0m \u001b[43m \u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43mkwargs\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 982\u001b[0m \u001b[43m \u001b[49m\u001b[43m)\u001b[49m,\n\u001b[1;32m 983\u001b[0m )\n\u001b[1;32m 984\u001b[0m \u001b[38;5;28;01mexcept\u001b[39;00m \u001b[38;5;167;01mBaseException\u001b[39;00m \u001b[38;5;28;01mas\u001b[39;00m e:\n\u001b[1;32m 985\u001b[0m run_manager\u001b[38;5;241m.\u001b[39mon_chain_error(e)\n", - "File \u001b[0;32m~/.pyenv/versions/3.11.2/lib/python3.11/site-packages/langchain_core/runnables/config.py:323\u001b[0m, in \u001b[0;36mcall_func_with_variable_args\u001b[0;34m(func, input, config, run_manager, **kwargs)\u001b[0m\n\u001b[1;32m 321\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m run_manager \u001b[38;5;129;01mis\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m \u001b[38;5;28;01mNone\u001b[39;00m \u001b[38;5;129;01mand\u001b[39;00m accepts_run_manager(func):\n\u001b[1;32m 322\u001b[0m kwargs[\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mrun_manager\u001b[39m\u001b[38;5;124m\"\u001b[39m] \u001b[38;5;241m=\u001b[39m run_manager\n\u001b[0;32m--> 323\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[43mfunc\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;28;43minput\u001b[39;49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43mkwargs\u001b[49m\u001b[43m)\u001b[49m\n", - "File \u001b[0;32m~/.pyenv/versions/3.11.2/lib/python3.11/site-packages/langchain_core/prompts/base.py:83\u001b[0m, in \u001b[0;36mBasePromptTemplate._format_prompt_with_error_handling\u001b[0;34m(self, inner_input)\u001b[0m\n\u001b[1;32m 81\u001b[0m missing \u001b[38;5;241m=\u001b[39m \u001b[38;5;28mset\u001b[39m(\u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39minput_variables)\u001b[38;5;241m.\u001b[39mdifference(inner_input)\n\u001b[1;32m 82\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m missing:\n\u001b[0;32m---> 83\u001b[0m \u001b[38;5;28;01mraise\u001b[39;00m \u001b[38;5;167;01mKeyError\u001b[39;00m(\n\u001b[1;32m 84\u001b[0m \u001b[38;5;124mf\u001b[39m\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mInput to \u001b[39m\u001b[38;5;132;01m{\u001b[39;00m\u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m\u001b[38;5;18m__class__\u001b[39m\u001b[38;5;241m.\u001b[39m\u001b[38;5;18m__name__\u001b[39m\u001b[38;5;132;01m}\u001b[39;00m\u001b[38;5;124m is missing variables \u001b[39m\u001b[38;5;132;01m{\u001b[39;00mmissing\u001b[38;5;132;01m}\u001b[39;00m\u001b[38;5;124m. \u001b[39m\u001b[38;5;124m\"\u001b[39m\n\u001b[1;32m 85\u001b[0m \u001b[38;5;124mf\u001b[39m\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124m Expected: \u001b[39m\u001b[38;5;132;01m{\u001b[39;00m\u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39minput_variables\u001b[38;5;132;01m}\u001b[39;00m\u001b[38;5;124m\"\u001b[39m\n\u001b[1;32m 86\u001b[0m \u001b[38;5;124mf\u001b[39m\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124m Received: \u001b[39m\u001b[38;5;132;01m{\u001b[39;00m\u001b[38;5;28mlist\u001b[39m(inner_input\u001b[38;5;241m.\u001b[39mkeys())\u001b[38;5;132;01m}\u001b[39;00m\u001b[38;5;124m\"\u001b[39m\n\u001b[1;32m 87\u001b[0m )\n\u001b[1;32m 88\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mformat_prompt(\u001b[38;5;241m*\u001b[39m\u001b[38;5;241m*\u001b[39minner_input)\n", - "\u001b[0;31mKeyError\u001b[0m: \"Input to ChatPromptTemplate is missing variables {'input'}. Expected: ['input', 'scratchpad'] Received: ['join', 'tasks', 'scratchpad']\"" - ] - } - ], - "source": [ - "example_question = \"Did Aliya get a better score than Roger in Geology?\"\n", - "task_results = chain.invoke({\"input\": example_question})\n", - "task_results[\"join\"]" - ] - }, - { - "cell_type": "markdown", - "id": "563d5311-55f0-4ca1-afbd-01fd970cf3e3", - "metadata": {}, - "source": [ - "## Agent Logic\n", - "\n", - "So now we have the planning and initial execution done. We need a component to process these outputs and either:\n", - "1. Respond with the correct answer.\n", - "2. Loop with a new plan.\n", - "\n", - "The paper calls this the \"joiner\"." - ] - }, - { - "cell_type": "code", - "execution_count": 9, - "id": "2978991e-45a4-44e6-9deb-f941f44fe93a", - "metadata": {}, - "outputs": [], - "source": [ - "from langchain_core.output_parsers import StrOutputParser\n", - "from typing_extensions import TypedDict\n", - "\n", - "\n", - "def format_task(task, idx):\n", - " thought = \"\" # TODO: Pass through CoT\n", - " tool = task[\"tool\"]\n", - " tool_name = tool if isinstance(tool, str) else tool.name # Handle join()\n", - " return f\"{thought}{idx}. {{{tool_name}: {task['args']}}}\"\n", - "\n", - "\n", - "def format_tasks(executor_output: dict):\n", - " tasks = executor_output[\"tasks\"]\n", - " formatted_plan = \"\\n\".join(format_task(task, idx) for idx, task in tasks.items())\n", - " observations = \"\\n\".join(f\"{k}: {v}\" for k, v in executor_output[\"join\"].items())\n", - " return f\"Original Plan:\\n{formatted_plan}\\nExecuted plan results:\\n{observations}\"\n", - "\n", - "\n", - "def _parse_joiner_output(raw_answer: str) -> str:\n", - " thought, answer, is_replan = \"\", \"\", False # default values\n", - " raw_answers = raw_answer.split(\"\\n\")\n", - " for ans in raw_answers:\n", - " if ans.startswith(\"Action:\"):\n", - " answer = ans[ans.find(\"(\") + 1 : ans.find(\")\")]\n", - " is_replan = JOINER_REPLAN in ans\n", - " elif ans.startswith(\"Thought:\"):\n", - " thought = ans.split(\"Thought:\")[1].strip()\n", - " if is_replan:\n", - " return {\"thought\": thought, \"context\": answer}\n", - " else:\n", - " return {\"thought\": thought, \"answer\": answer}" - ] - }, - { - "cell_type": "code", - "execution_count": 17, - "id": "b2feea5a-e0e4-4cff-8cb5-fdbfec95ba57", - "metadata": {}, - "outputs": [], - "source": [ - "def create_joiner(prompt, llm):\n", - " return (\n", - " (lambda x: {**x[\"plan\"], \"input\": x[\"input\"]})\n", - " | RunnablePassthrough.assign(scratchpad=format_tasks)\n", - " | ChatPromptTemplate.from_messages([(\"system\", prompt), (\"user\", \"{input}\")])\n", - " | llm\n", - " | StrOutputParser()\n", - " | _parse_joiner_output\n", - " )" - ] - }, - { - "cell_type": "code", - "execution_count": 18, - "id": "942dab42-ad42-4ba2-90d5-49edbe4fae68", - "metadata": {}, - "outputs": [], - "source": [ - "system_prompt = (\n", - " \"Solve a question answering task with interleaving Observation, Thought, and Action steps. Here are some guidelines:\\n\"\n", - " \" - In the Assistant Scratchpad, you will be given results of a plan you have executed to answer the user's question.\\n\"\n", - " \" - Thought needs to reason about the question based on the Observations in 1-2 sentences.\\n\"\n", - " \" - There are cases where the Observations are unclear or irrelevant (in the case the task execution was unsuccessful or subpar). Only heed the relevant ones\\n\"\n", - " \" Respond in the following format:\\n\\n\"\n", - " \"Thought: \\n\"\n", - " \"Action: \\n\"\n", - " \"Available actions:\\n\"\n", - " f\" (1) {JOINER_FINISH}(the final answer to return to the user): returns the answer and finishes the task.\\n\"\n", - " f\" (2) {JOINER_REPLAN}(the reasoning and information to provide to make a better next plan): instructs why we must replan\\n\\n\"\n", - " \" Examples:\\n\"\n", - " \"Question: How many users are currently using the new product?\\n\"\n", - " \"...task returns the number 32,000\\n\"\n", - " \"Thought: I find no issue with the original plan, and the results satisfy everything in the user question.\\n\"\n", - " f\"Action: {JOINER_FINISH}(32,000 users currently use the new product)\\n###\\n\"\n", - " \"Question: Are the gophers beating the rabbits??\\n\"\n", - " \"...task returns the a score of 7 for rabbits but no other value...\\n\"\n", - " \"Thought: I need the gophers' score to make a final decision.\\n\"\n", - " f\"Action: {JOINER_REPLAN}(The rabbits have a score of 7, but I need the gophers' score.)\"\n", - " \"Assistant Scratchpad:\\n{scratchpad}\"\n", - ")" - ] - }, - { - "cell_type": "code", - "execution_count": 19, - "id": "a07d0804-2ce5-4462-98eb-4473f36ef704", - "metadata": {}, - "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "INFO:httpx:HTTP Request: POST https://api.openai.com/v1/chat/completions \"HTTP/1.1 200 OK\"\n" - ] - }, - { - "data": { - "text/plain": [ - "{'thought': 'Based on the executed plan, both Aliya and Roger received an A+ score in Geology. Therefore, Aliya did not get a better score than Roger in Geology.',\n", - " 'answer': 'No, Aliya did not get a better score than Roger in Geology. They both received an A+.'}" - ] - }, - "execution_count": 19, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "joiner = create_joiner(system_prompt, ChatOpenAI(model=\"gpt-3.5-turbo\"))\n", - "joiner.invoke({\"plan\": task_results, \"input\": example_question})" - ] - }, - { - "cell_type": "markdown", - "id": "b099e5ee-2c23-47d9-9387-0f64e02627d3", - "metadata": {}, - "source": [ - "### Construct Agent\n", - "\n", - "Now we have all the required pieces!" - ] - }, - { - "cell_type": "code", - "execution_count": 25, - "id": "768b5f11-e3d2-47be-8143-a7dcd8765243", - "metadata": {}, - "outputs": [], - "source": [ - "from langgraph.graph import END, Graph\n", - "\n", - "workflow = Graph()\n", - "\n", - "# 1. Define vertices\n", - "\n", - "planner = create_planner(\n", - " llm=ChatOpenAI(model=\"gpt-3.5-turbo\"),\n", - " example_prompt=examples,\n", - " # TODO: You can update and optimize the replanner prompt to\n", - " # better critique the original plan\n", - " example_prompt_replan=examples,\n", - " tools=[get_user_id, get_scores],\n", - ")\n", - "plan_and_execute = RunnablePassthrough.assign(plan=planner | construct_dag)\n", - "joiner = create_joiner(system_prompt, ChatOpenAI(model=\"gpt-3.5-turbo\"))\n", - "joiner_node = RunnablePassthrough.assign(joined_output=joiner)\n", - "\n", - "\n", - "workflow.add_node(\"plan_and_execute\", plan_and_execute)\n", - "workflow.add_node(\"join\", joiner_node)\n", - "workflow.add_node(\"end\", lambda x: x[\"joined_output\"].get(\"answer\", x))\n", - "\n", - "## Define edges\n", - "\n", - "workflow.add_edge(\"plan_and_execute\", \"join\")\n", - "\n", - "### This condition determines looping logic\n", - "\n", - "\n", - "def should_continue(joiner_output):\n", - " if joiner_output[\"joined_output\"].get(\"context\"):\n", - " return \"continue\"\n", - " return \"end\"\n", - "\n", - "\n", - "workflow.add_conditional_edges(\n", - " start_key=\"join\",\n", - " # Next, we pass in the function that will determine which node is called next.\n", - " condition=should_continue,\n", - " conditional_edge_mapping={\n", - " # If it generates context, we must replan\n", - " \"continue\": \"plan_and_execute\",\n", - " # Otherwise we finish.\n", - " \"end\": \"end\",\n", - " },\n", - ")\n", - "workflow.set_entry_point(\"plan_and_execute\")\n", - "workflow.set_finish_point(\"end\")\n", - "chain = workflow.compile()" - ] - }, - { - "cell_type": "code", - "execution_count": 28, - "id": "0b3a0916-d8ca-4092-b91c-d9e2b05259d8", - "metadata": {}, - "outputs": [], - "source": [ - "# chain.invoke({\"input\": \"Did Aliya get a better score than Roger in Geology?\"})" - ] - }, - { - "cell_type": "code", - "execution_count": 29, - "id": "e3f3e409-11e7-4171-b2bc-7b0e82dfd10d", - "metadata": {}, - "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "INFO:httpx:HTTP Request: POST https://api.openai.com/v1/chat/completions \"HTTP/1.1 200 OK\"\n", - "INFO:httpx:HTTP Request: POST https://api.openai.com/v1/chat/completions \"HTTP/1.1 200 OK\"\n" - ] - }, - { - "ename": "KeyError", - "evalue": "\"Input to ChatPromptTemplate is missing variables {'input'}. Expected: ['input'] Received: ['thought', 'context']\"", - "output_type": "error", - "traceback": [ - "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", - "\u001b[0;31mKeyError\u001b[0m Traceback (most recent call last)", - "Cell \u001b[0;32mIn[29], line 2\u001b[0m\n\u001b[1;32m 1\u001b[0m \u001b[38;5;66;03m# Try something to trigger replanning\u001b[39;00m\n\u001b[0;32m----> 2\u001b[0m \u001b[43mchain\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43minvoke\u001b[49m\u001b[43m(\u001b[49m\n\u001b[1;32m 3\u001b[0m \u001b[43m \u001b[49m\u001b[43m{\u001b[49m\n\u001b[1;32m 4\u001b[0m \u001b[43m \u001b[49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[38;5;124;43minput\u001b[39;49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[43m:\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[38;5;124;43mDid the sum of Aliya and Roger\u001b[39;49m\u001b[38;5;124;43m'\u001b[39;49m\u001b[38;5;124;43ms grades in Calc map out to less than\u001b[39;49m\u001b[38;5;124;43m\"\u001b[39;49m\n\u001b[1;32m 5\u001b[0m \u001b[43m \u001b[49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[38;5;124;43m the total grade for the class?\u001b[39;49m\u001b[38;5;124;43m\"\u001b[39;49m\n\u001b[1;32m 6\u001b[0m \u001b[43m \u001b[49m\u001b[43m}\u001b[49m\n\u001b[1;32m 7\u001b[0m \u001b[43m)\u001b[49m\n", - "File \u001b[0;32m~/code/lc/langgraph/langgraph/pregel/__init__.py:456\u001b[0m, in \u001b[0;36mPregel.invoke\u001b[0;34m(self, input, config, output, **kwargs)\u001b[0m\n\u001b[1;32m 447\u001b[0m \u001b[38;5;28;01mdef\u001b[39;00m \u001b[38;5;21minvoke\u001b[39m(\n\u001b[1;32m 448\u001b[0m \u001b[38;5;28mself\u001b[39m,\n\u001b[1;32m 449\u001b[0m \u001b[38;5;28minput\u001b[39m: Union[\u001b[38;5;28mdict\u001b[39m[\u001b[38;5;28mstr\u001b[39m, Any], Any],\n\u001b[0;32m (...)\u001b[0m\n\u001b[1;32m 453\u001b[0m \u001b[38;5;241m*\u001b[39m\u001b[38;5;241m*\u001b[39mkwargs: Any,\n\u001b[1;32m 454\u001b[0m ) \u001b[38;5;241m-\u001b[39m\u001b[38;5;241m>\u001b[39m Union[\u001b[38;5;28mdict\u001b[39m[\u001b[38;5;28mstr\u001b[39m, Any], Any]:\n\u001b[1;32m 455\u001b[0m latest: Union[\u001b[38;5;28mdict\u001b[39m[\u001b[38;5;28mstr\u001b[39m, Any], Any] \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;01mNone\u001b[39;00m\n\u001b[0;32m--> 456\u001b[0m \u001b[43m \u001b[49m\u001b[38;5;28;43;01mfor\u001b[39;49;00m\u001b[43m \u001b[49m\u001b[43mchunk\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;129;43;01min\u001b[39;49;00m\u001b[43m \u001b[49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mstream\u001b[49m\u001b[43m(\u001b[49m\n\u001b[1;32m 457\u001b[0m \u001b[43m \u001b[49m\u001b[38;5;28;43minput\u001b[39;49m\u001b[43m,\u001b[49m\n\u001b[1;32m 458\u001b[0m \u001b[43m \u001b[49m\u001b[43mconfig\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 459\u001b[0m \u001b[43m \u001b[49m\u001b[43moutput\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43moutput\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;28;43;01mif\u001b[39;49;00m\u001b[43m \u001b[49m\u001b[43moutput\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;129;43;01mis\u001b[39;49;00m\u001b[43m \u001b[49m\u001b[38;5;129;43;01mnot\u001b[39;49;00m\u001b[43m \u001b[49m\u001b[38;5;28;43;01mNone\u001b[39;49;00m\u001b[43m \u001b[49m\u001b[38;5;28;43;01melse\u001b[39;49;00m\u001b[43m \u001b[49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43moutput\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 460\u001b[0m \u001b[43m \u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43mkwargs\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 461\u001b[0m \u001b[43m \u001b[49m\u001b[43m)\u001b[49m\u001b[43m:\u001b[49m\n\u001b[1;32m 462\u001b[0m \u001b[43m \u001b[49m\u001b[43mlatest\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43m \u001b[49m\u001b[43mchunk\u001b[49m\n\u001b[1;32m 463\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m latest\n", - "File \u001b[0;32m~/code/lc/langgraph/langgraph/pregel/__init__.py:483\u001b[0m, in \u001b[0;36mPregel.transform\u001b[0;34m(self, input, config, output, **kwargs)\u001b[0m\n\u001b[1;32m 475\u001b[0m \u001b[38;5;28;01mdef\u001b[39;00m \u001b[38;5;21mtransform\u001b[39m(\n\u001b[1;32m 476\u001b[0m \u001b[38;5;28mself\u001b[39m,\n\u001b[1;32m 477\u001b[0m \u001b[38;5;28minput\u001b[39m: Iterator[Union[\u001b[38;5;28mdict\u001b[39m[\u001b[38;5;28mstr\u001b[39m, Any], Any]],\n\u001b[0;32m (...)\u001b[0m\n\u001b[1;32m 481\u001b[0m \u001b[38;5;241m*\u001b[39m\u001b[38;5;241m*\u001b[39mkwargs: Any,\n\u001b[1;32m 482\u001b[0m ) \u001b[38;5;241m-\u001b[39m\u001b[38;5;241m>\u001b[39m Iterator[Union[\u001b[38;5;28mdict\u001b[39m[\u001b[38;5;28mstr\u001b[39m, Any], Any]]:\n\u001b[0;32m--> 483\u001b[0m \u001b[43m \u001b[49m\u001b[38;5;28;43;01mfor\u001b[39;49;00m\u001b[43m \u001b[49m\u001b[43mchunk\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;129;43;01min\u001b[39;49;00m\u001b[43m \u001b[49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43m_transform_stream_with_config\u001b[49m\u001b[43m(\u001b[49m\n\u001b[1;32m 484\u001b[0m \u001b[43m \u001b[49m\u001b[38;5;28;43minput\u001b[39;49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43m_transform\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mconfig\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43moutput\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43moutput\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43mkwargs\u001b[49m\n\u001b[1;32m 485\u001b[0m \u001b[43m \u001b[49m\u001b[43m)\u001b[49m\u001b[43m:\u001b[49m\n\u001b[1;32m 486\u001b[0m \u001b[43m \u001b[49m\u001b[38;5;28;43;01myield\u001b[39;49;00m\u001b[43m \u001b[49m\u001b[43mchunk\u001b[49m\n", - "File \u001b[0;32m~/.pyenv/versions/3.11.2/lib/python3.11/site-packages/langchain_core/runnables/base.py:1226\u001b[0m, in \u001b[0;36mRunnable._transform_stream_with_config\u001b[0;34m(self, input, transformer, config, run_type, **kwargs)\u001b[0m\n\u001b[1;32m 1224\u001b[0m \u001b[38;5;28;01mtry\u001b[39;00m:\n\u001b[1;32m 1225\u001b[0m \u001b[38;5;28;01mwhile\u001b[39;00m \u001b[38;5;28;01mTrue\u001b[39;00m:\n\u001b[0;32m-> 1226\u001b[0m chunk: Output \u001b[38;5;241m=\u001b[39m context\u001b[38;5;241m.\u001b[39mrun(\u001b[38;5;28mnext\u001b[39m, iterator) \u001b[38;5;66;03m# type: ignore\u001b[39;00m\n\u001b[1;32m 1227\u001b[0m \u001b[38;5;28;01myield\u001b[39;00m chunk\n\u001b[1;32m 1228\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m final_output_supported:\n", - "File \u001b[0;32m~/code/lc/langgraph/langgraph/pregel/__init__.py:301\u001b[0m, in \u001b[0;36mPregel._transform\u001b[0;34m(self, input, run_manager, config, output)\u001b[0m\n\u001b[1;32m 291\u001b[0m done, inflight \u001b[38;5;241m=\u001b[39m concurrent\u001b[38;5;241m.\u001b[39mfutures\u001b[38;5;241m.\u001b[39mwait(\n\u001b[1;32m 292\u001b[0m [\n\u001b[1;32m 293\u001b[0m executor\u001b[38;5;241m.\u001b[39msubmit(proc\u001b[38;5;241m.\u001b[39minvoke, \u001b[38;5;28minput\u001b[39m, config)\n\u001b[0;32m (...)\u001b[0m\n\u001b[1;32m 297\u001b[0m timeout\u001b[38;5;241m=\u001b[39m\u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mstep_timeout,\n\u001b[1;32m 298\u001b[0m )\n\u001b[1;32m 300\u001b[0m \u001b[38;5;66;03m# interrupt on failure or timeout\u001b[39;00m\n\u001b[0;32m--> 301\u001b[0m \u001b[43m_interrupt_or_proceed\u001b[49m\u001b[43m(\u001b[49m\u001b[43mdone\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43minflight\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mstep\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 303\u001b[0m \u001b[38;5;66;03m# apply writes to channels\u001b[39;00m\n\u001b[1;32m 304\u001b[0m _apply_writes(checkpoint, channels, pending_writes, config, step \u001b[38;5;241m+\u001b[39m \u001b[38;5;241m1\u001b[39m)\n", - "File \u001b[0;32m~/code/lc/langgraph/langgraph/pregel/__init__.py:548\u001b[0m, in \u001b[0;36m_interrupt_or_proceed\u001b[0;34m(done, inflight, step)\u001b[0m\n\u001b[1;32m 546\u001b[0m inflight\u001b[38;5;241m.\u001b[39mpop()\u001b[38;5;241m.\u001b[39mcancel()\n\u001b[1;32m 547\u001b[0m \u001b[38;5;66;03m# raise the exception\u001b[39;00m\n\u001b[0;32m--> 548\u001b[0m \u001b[38;5;28;01mraise\u001b[39;00m exc\n\u001b[1;32m 549\u001b[0m \u001b[38;5;66;03m# TODO this is where retry of an entire step would happen\u001b[39;00m\n\u001b[1;32m 551\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m inflight:\n\u001b[1;32m 552\u001b[0m \u001b[38;5;66;03m# if we got here means we timed out\u001b[39;00m\n", - "File \u001b[0;32m~/.pyenv/versions/3.11.2/lib/python3.11/concurrent/futures/thread.py:58\u001b[0m, in \u001b[0;36m_WorkItem.run\u001b[0;34m(self)\u001b[0m\n\u001b[1;32m 55\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m\n\u001b[1;32m 57\u001b[0m \u001b[38;5;28;01mtry\u001b[39;00m:\n\u001b[0;32m---> 58\u001b[0m result \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mfn\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43margs\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mkwargs\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 59\u001b[0m \u001b[38;5;28;01mexcept\u001b[39;00m \u001b[38;5;167;01mBaseException\u001b[39;00m \u001b[38;5;28;01mas\u001b[39;00m exc:\n\u001b[1;32m 60\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mfuture\u001b[38;5;241m.\u001b[39mset_exception(exc)\n", - "File \u001b[0;32m~/.pyenv/versions/3.11.2/lib/python3.11/site-packages/langchain_core/runnables/base.py:3596\u001b[0m, in \u001b[0;36mRunnableBindingBase.invoke\u001b[0;34m(self, input, config, **kwargs)\u001b[0m\n\u001b[1;32m 3590\u001b[0m \u001b[38;5;28;01mdef\u001b[39;00m \u001b[38;5;21minvoke\u001b[39m(\n\u001b[1;32m 3591\u001b[0m \u001b[38;5;28mself\u001b[39m,\n\u001b[1;32m 3592\u001b[0m \u001b[38;5;28minput\u001b[39m: Input,\n\u001b[1;32m 3593\u001b[0m config: Optional[RunnableConfig] \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;01mNone\u001b[39;00m,\n\u001b[1;32m 3594\u001b[0m \u001b[38;5;241m*\u001b[39m\u001b[38;5;241m*\u001b[39mkwargs: Optional[Any],\n\u001b[1;32m 3595\u001b[0m ) \u001b[38;5;241m-\u001b[39m\u001b[38;5;241m>\u001b[39m Output:\n\u001b[0;32m-> 3596\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mbound\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43minvoke\u001b[49m\u001b[43m(\u001b[49m\n\u001b[1;32m 3597\u001b[0m \u001b[43m \u001b[49m\u001b[38;5;28;43minput\u001b[39;49m\u001b[43m,\u001b[49m\n\u001b[1;32m 3598\u001b[0m \u001b[43m \u001b[49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43m_merge_configs\u001b[49m\u001b[43m(\u001b[49m\u001b[43mconfig\u001b[49m\u001b[43m)\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 3599\u001b[0m \u001b[43m \u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43m{\u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mkwargs\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43mkwargs\u001b[49m\u001b[43m}\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 3600\u001b[0m \u001b[43m \u001b[49m\u001b[43m)\u001b[49m\n", - "File \u001b[0;32m~/.pyenv/versions/3.11.2/lib/python3.11/site-packages/langchain_core/runnables/base.py:1774\u001b[0m, in \u001b[0;36mRunnableSequence.invoke\u001b[0;34m(self, input, config)\u001b[0m\n\u001b[1;32m 1772\u001b[0m \u001b[38;5;28;01mtry\u001b[39;00m:\n\u001b[1;32m 1773\u001b[0m \u001b[38;5;28;01mfor\u001b[39;00m i, step \u001b[38;5;129;01min\u001b[39;00m \u001b[38;5;28menumerate\u001b[39m(\u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39msteps):\n\u001b[0;32m-> 1774\u001b[0m \u001b[38;5;28minput\u001b[39m \u001b[38;5;241m=\u001b[39m \u001b[43mstep\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43minvoke\u001b[49m\u001b[43m(\u001b[49m\n\u001b[1;32m 1775\u001b[0m \u001b[43m \u001b[49m\u001b[38;5;28;43minput\u001b[39;49m\u001b[43m,\u001b[49m\n\u001b[1;32m 1776\u001b[0m \u001b[43m \u001b[49m\u001b[38;5;66;43;03m# mark each step as a child run\u001b[39;49;00m\n\u001b[1;32m 1777\u001b[0m \u001b[43m \u001b[49m\u001b[43mpatch_config\u001b[49m\u001b[43m(\u001b[49m\n\u001b[1;32m 1778\u001b[0m \u001b[43m \u001b[49m\u001b[43mconfig\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mcallbacks\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mrun_manager\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mget_child\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;124;43mf\u001b[39;49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[38;5;124;43mseq:step:\u001b[39;49m\u001b[38;5;132;43;01m{\u001b[39;49;00m\u001b[43mi\u001b[49m\u001b[38;5;241;43m+\u001b[39;49m\u001b[38;5;241;43m1\u001b[39;49m\u001b[38;5;132;43;01m}\u001b[39;49;00m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[43m)\u001b[49m\n\u001b[1;32m 1779\u001b[0m \u001b[43m \u001b[49m\u001b[43m)\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 1780\u001b[0m \u001b[43m \u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 1781\u001b[0m \u001b[38;5;66;03m# finish the root run\u001b[39;00m\n\u001b[1;32m 1782\u001b[0m \u001b[38;5;28;01mexcept\u001b[39;00m \u001b[38;5;167;01mBaseException\u001b[39;00m \u001b[38;5;28;01mas\u001b[39;00m e:\n", - "File \u001b[0;32m~/.pyenv/versions/3.11.2/lib/python3.11/site-packages/langchain_core/runnables/passthrough.py:415\u001b[0m, in \u001b[0;36mRunnableAssign.invoke\u001b[0;34m(self, input, config, **kwargs)\u001b[0m\n\u001b[1;32m 409\u001b[0m \u001b[38;5;28;01mdef\u001b[39;00m \u001b[38;5;21minvoke\u001b[39m(\n\u001b[1;32m 410\u001b[0m \u001b[38;5;28mself\u001b[39m,\n\u001b[1;32m 411\u001b[0m \u001b[38;5;28minput\u001b[39m: Dict[\u001b[38;5;28mstr\u001b[39m, Any],\n\u001b[1;32m 412\u001b[0m config: Optional[RunnableConfig] \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;01mNone\u001b[39;00m,\n\u001b[1;32m 413\u001b[0m \u001b[38;5;241m*\u001b[39m\u001b[38;5;241m*\u001b[39mkwargs: Any,\n\u001b[1;32m 414\u001b[0m ) \u001b[38;5;241m-\u001b[39m\u001b[38;5;241m>\u001b[39m Dict[\u001b[38;5;28mstr\u001b[39m, Any]:\n\u001b[0;32m--> 415\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43m_call_with_config\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43m_invoke\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;28;43minput\u001b[39;49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mconfig\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43mkwargs\u001b[49m\u001b[43m)\u001b[49m\n", - "File \u001b[0;32m~/.pyenv/versions/3.11.2/lib/python3.11/site-packages/langchain_core/runnables/base.py:975\u001b[0m, in \u001b[0;36mRunnable._call_with_config\u001b[0;34m(self, func, input, config, run_type, **kwargs)\u001b[0m\n\u001b[1;32m 971\u001b[0m context \u001b[38;5;241m=\u001b[39m copy_context()\n\u001b[1;32m 972\u001b[0m context\u001b[38;5;241m.\u001b[39mrun(var_child_runnable_config\u001b[38;5;241m.\u001b[39mset, child_config)\n\u001b[1;32m 973\u001b[0m output \u001b[38;5;241m=\u001b[39m cast(\n\u001b[1;32m 974\u001b[0m Output,\n\u001b[0;32m--> 975\u001b[0m \u001b[43mcontext\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mrun\u001b[49m\u001b[43m(\u001b[49m\n\u001b[1;32m 976\u001b[0m \u001b[43m \u001b[49m\u001b[43mcall_func_with_variable_args\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 977\u001b[0m \u001b[43m \u001b[49m\u001b[43mfunc\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;66;43;03m# type: ignore[arg-type]\u001b[39;49;00m\n\u001b[1;32m 978\u001b[0m \u001b[43m \u001b[49m\u001b[38;5;28;43minput\u001b[39;49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;66;43;03m# type: ignore[arg-type]\u001b[39;49;00m\n\u001b[1;32m 979\u001b[0m \u001b[43m \u001b[49m\u001b[43mconfig\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 980\u001b[0m \u001b[43m \u001b[49m\u001b[43mrun_manager\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 981\u001b[0m \u001b[43m \u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43mkwargs\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 982\u001b[0m \u001b[43m \u001b[49m\u001b[43m)\u001b[49m,\n\u001b[1;32m 983\u001b[0m )\n\u001b[1;32m 984\u001b[0m \u001b[38;5;28;01mexcept\u001b[39;00m \u001b[38;5;167;01mBaseException\u001b[39;00m \u001b[38;5;28;01mas\u001b[39;00m e:\n\u001b[1;32m 985\u001b[0m run_manager\u001b[38;5;241m.\u001b[39mon_chain_error(e)\n", - "File \u001b[0;32m~/.pyenv/versions/3.11.2/lib/python3.11/site-packages/langchain_core/runnables/config.py:323\u001b[0m, in \u001b[0;36mcall_func_with_variable_args\u001b[0;34m(func, input, config, run_manager, **kwargs)\u001b[0m\n\u001b[1;32m 321\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m run_manager \u001b[38;5;129;01mis\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m \u001b[38;5;28;01mNone\u001b[39;00m \u001b[38;5;129;01mand\u001b[39;00m accepts_run_manager(func):\n\u001b[1;32m 322\u001b[0m kwargs[\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mrun_manager\u001b[39m\u001b[38;5;124m\"\u001b[39m] \u001b[38;5;241m=\u001b[39m run_manager\n\u001b[0;32m--> 323\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[43mfunc\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;28;43minput\u001b[39;49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43mkwargs\u001b[49m\u001b[43m)\u001b[49m\n", - "File \u001b[0;32m~/.pyenv/versions/3.11.2/lib/python3.11/site-packages/langchain_core/runnables/passthrough.py:402\u001b[0m, in \u001b[0;36mRunnableAssign._invoke\u001b[0;34m(self, input, run_manager, config, **kwargs)\u001b[0m\n\u001b[1;32m 389\u001b[0m \u001b[38;5;28;01mdef\u001b[39;00m \u001b[38;5;21m_invoke\u001b[39m(\n\u001b[1;32m 390\u001b[0m \u001b[38;5;28mself\u001b[39m,\n\u001b[1;32m 391\u001b[0m \u001b[38;5;28minput\u001b[39m: Dict[\u001b[38;5;28mstr\u001b[39m, Any],\n\u001b[0;32m (...)\u001b[0m\n\u001b[1;32m 394\u001b[0m \u001b[38;5;241m*\u001b[39m\u001b[38;5;241m*\u001b[39mkwargs: Any,\n\u001b[1;32m 395\u001b[0m ) \u001b[38;5;241m-\u001b[39m\u001b[38;5;241m>\u001b[39m Dict[\u001b[38;5;28mstr\u001b[39m, Any]:\n\u001b[1;32m 396\u001b[0m \u001b[38;5;28;01massert\u001b[39;00m \u001b[38;5;28misinstance\u001b[39m(\n\u001b[1;32m 397\u001b[0m \u001b[38;5;28minput\u001b[39m, \u001b[38;5;28mdict\u001b[39m\n\u001b[1;32m 398\u001b[0m ), \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mThe input to RunnablePassthrough.assign() must be a dict.\u001b[39m\u001b[38;5;124m\"\u001b[39m\n\u001b[1;32m 400\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m {\n\u001b[1;32m 401\u001b[0m \u001b[38;5;241m*\u001b[39m\u001b[38;5;241m*\u001b[39m\u001b[38;5;28minput\u001b[39m,\n\u001b[0;32m--> 402\u001b[0m \u001b[38;5;241m*\u001b[39m\u001b[38;5;241m*\u001b[39m\u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mmapper\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43minvoke\u001b[49m\u001b[43m(\u001b[49m\n\u001b[1;32m 403\u001b[0m \u001b[43m \u001b[49m\u001b[38;5;28;43minput\u001b[39;49m\u001b[43m,\u001b[49m\n\u001b[1;32m 404\u001b[0m \u001b[43m \u001b[49m\u001b[43mpatch_config\u001b[49m\u001b[43m(\u001b[49m\u001b[43mconfig\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mcallbacks\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mrun_manager\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mget_child\u001b[49m\u001b[43m(\u001b[49m\u001b[43m)\u001b[49m\u001b[43m)\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 405\u001b[0m \u001b[43m \u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43mkwargs\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 406\u001b[0m \u001b[43m \u001b[49m\u001b[43m)\u001b[49m,\n\u001b[1;32m 407\u001b[0m }\n", - "File \u001b[0;32m~/.pyenv/versions/3.11.2/lib/python3.11/site-packages/langchain_core/runnables/base.py:2339\u001b[0m, in \u001b[0;36mRunnableParallel.invoke\u001b[0;34m(self, input, config)\u001b[0m\n\u001b[1;32m 2326\u001b[0m \u001b[38;5;28;01mwith\u001b[39;00m get_executor_for_config(config) \u001b[38;5;28;01mas\u001b[39;00m executor:\n\u001b[1;32m 2327\u001b[0m futures \u001b[38;5;241m=\u001b[39m [\n\u001b[1;32m 2328\u001b[0m executor\u001b[38;5;241m.\u001b[39msubmit(\n\u001b[1;32m 2329\u001b[0m step\u001b[38;5;241m.\u001b[39minvoke,\n\u001b[0;32m (...)\u001b[0m\n\u001b[1;32m 2337\u001b[0m \u001b[38;5;28;01mfor\u001b[39;00m key, step \u001b[38;5;129;01min\u001b[39;00m steps\u001b[38;5;241m.\u001b[39mitems()\n\u001b[1;32m 2338\u001b[0m ]\n\u001b[0;32m-> 2339\u001b[0m output \u001b[38;5;241m=\u001b[39m \u001b[43m{\u001b[49m\u001b[43mkey\u001b[49m\u001b[43m:\u001b[49m\u001b[43m \u001b[49m\u001b[43mfuture\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mresult\u001b[49m\u001b[43m(\u001b[49m\u001b[43m)\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;28;43;01mfor\u001b[39;49;00m\u001b[43m \u001b[49m\u001b[43mkey\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mfuture\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;129;43;01min\u001b[39;49;00m\u001b[43m \u001b[49m\u001b[38;5;28;43mzip\u001b[39;49m\u001b[43m(\u001b[49m\u001b[43msteps\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mfutures\u001b[49m\u001b[43m)\u001b[49m\u001b[43m}\u001b[49m\n\u001b[1;32m 2340\u001b[0m \u001b[38;5;66;03m# finish the root run\u001b[39;00m\n\u001b[1;32m 2341\u001b[0m \u001b[38;5;28;01mexcept\u001b[39;00m \u001b[38;5;167;01mBaseException\u001b[39;00m \u001b[38;5;28;01mas\u001b[39;00m e:\n", - "File \u001b[0;32m~/.pyenv/versions/3.11.2/lib/python3.11/site-packages/langchain_core/runnables/base.py:2339\u001b[0m, in \u001b[0;36m\u001b[0;34m(.0)\u001b[0m\n\u001b[1;32m 2326\u001b[0m \u001b[38;5;28;01mwith\u001b[39;00m get_executor_for_config(config) \u001b[38;5;28;01mas\u001b[39;00m executor:\n\u001b[1;32m 2327\u001b[0m futures \u001b[38;5;241m=\u001b[39m [\n\u001b[1;32m 2328\u001b[0m executor\u001b[38;5;241m.\u001b[39msubmit(\n\u001b[1;32m 2329\u001b[0m step\u001b[38;5;241m.\u001b[39minvoke,\n\u001b[0;32m (...)\u001b[0m\n\u001b[1;32m 2337\u001b[0m \u001b[38;5;28;01mfor\u001b[39;00m key, step \u001b[38;5;129;01min\u001b[39;00m steps\u001b[38;5;241m.\u001b[39mitems()\n\u001b[1;32m 2338\u001b[0m ]\n\u001b[0;32m-> 2339\u001b[0m output \u001b[38;5;241m=\u001b[39m {key: \u001b[43mfuture\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mresult\u001b[49m\u001b[43m(\u001b[49m\u001b[43m)\u001b[49m \u001b[38;5;28;01mfor\u001b[39;00m key, future \u001b[38;5;129;01min\u001b[39;00m \u001b[38;5;28mzip\u001b[39m(steps, futures)}\n\u001b[1;32m 2340\u001b[0m \u001b[38;5;66;03m# finish the root run\u001b[39;00m\n\u001b[1;32m 2341\u001b[0m \u001b[38;5;28;01mexcept\u001b[39;00m \u001b[38;5;167;01mBaseException\u001b[39;00m \u001b[38;5;28;01mas\u001b[39;00m e:\n", - "File \u001b[0;32m~/.pyenv/versions/3.11.2/lib/python3.11/concurrent/futures/_base.py:456\u001b[0m, in \u001b[0;36mFuture.result\u001b[0;34m(self, timeout)\u001b[0m\n\u001b[1;32m 454\u001b[0m \u001b[38;5;28;01mraise\u001b[39;00m CancelledError()\n\u001b[1;32m 455\u001b[0m \u001b[38;5;28;01melif\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_state \u001b[38;5;241m==\u001b[39m FINISHED:\n\u001b[0;32m--> 456\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43m__get_result\u001b[49m\u001b[43m(\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 457\u001b[0m \u001b[38;5;28;01melse\u001b[39;00m:\n\u001b[1;32m 458\u001b[0m \u001b[38;5;28;01mraise\u001b[39;00m \u001b[38;5;167;01mTimeoutError\u001b[39;00m()\n", - "File \u001b[0;32m~/.pyenv/versions/3.11.2/lib/python3.11/concurrent/futures/_base.py:401\u001b[0m, in \u001b[0;36mFuture.__get_result\u001b[0;34m(self)\u001b[0m\n\u001b[1;32m 399\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_exception:\n\u001b[1;32m 400\u001b[0m \u001b[38;5;28;01mtry\u001b[39;00m:\n\u001b[0;32m--> 401\u001b[0m \u001b[38;5;28;01mraise\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_exception\n\u001b[1;32m 402\u001b[0m \u001b[38;5;28;01mfinally\u001b[39;00m:\n\u001b[1;32m 403\u001b[0m \u001b[38;5;66;03m# Break a reference cycle with the exception in self._exception\u001b[39;00m\n\u001b[1;32m 404\u001b[0m \u001b[38;5;28mself\u001b[39m \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;01mNone\u001b[39;00m\n", - "File \u001b[0;32m~/.pyenv/versions/3.11.2/lib/python3.11/concurrent/futures/thread.py:58\u001b[0m, in \u001b[0;36m_WorkItem.run\u001b[0;34m(self)\u001b[0m\n\u001b[1;32m 55\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m\n\u001b[1;32m 57\u001b[0m \u001b[38;5;28;01mtry\u001b[39;00m:\n\u001b[0;32m---> 58\u001b[0m result \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mfn\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43margs\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mkwargs\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 59\u001b[0m \u001b[38;5;28;01mexcept\u001b[39;00m \u001b[38;5;167;01mBaseException\u001b[39;00m \u001b[38;5;28;01mas\u001b[39;00m exc:\n\u001b[1;32m 60\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mfuture\u001b[38;5;241m.\u001b[39mset_exception(exc)\n", - "File \u001b[0;32m~/.pyenv/versions/3.11.2/lib/python3.11/site-packages/langchain_core/runnables/base.py:1774\u001b[0m, in \u001b[0;36mRunnableSequence.invoke\u001b[0;34m(self, input, config)\u001b[0m\n\u001b[1;32m 1772\u001b[0m \u001b[38;5;28;01mtry\u001b[39;00m:\n\u001b[1;32m 1773\u001b[0m \u001b[38;5;28;01mfor\u001b[39;00m i, step \u001b[38;5;129;01min\u001b[39;00m \u001b[38;5;28menumerate\u001b[39m(\u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39msteps):\n\u001b[0;32m-> 1774\u001b[0m \u001b[38;5;28minput\u001b[39m \u001b[38;5;241m=\u001b[39m \u001b[43mstep\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43minvoke\u001b[49m\u001b[43m(\u001b[49m\n\u001b[1;32m 1775\u001b[0m \u001b[43m \u001b[49m\u001b[38;5;28;43minput\u001b[39;49m\u001b[43m,\u001b[49m\n\u001b[1;32m 1776\u001b[0m \u001b[43m \u001b[49m\u001b[38;5;66;43;03m# mark each step as a child run\u001b[39;49;00m\n\u001b[1;32m 1777\u001b[0m \u001b[43m \u001b[49m\u001b[43mpatch_config\u001b[49m\u001b[43m(\u001b[49m\n\u001b[1;32m 1778\u001b[0m \u001b[43m \u001b[49m\u001b[43mconfig\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mcallbacks\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mrun_manager\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mget_child\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;124;43mf\u001b[39;49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[38;5;124;43mseq:step:\u001b[39;49m\u001b[38;5;132;43;01m{\u001b[39;49;00m\u001b[43mi\u001b[49m\u001b[38;5;241;43m+\u001b[39;49m\u001b[38;5;241;43m1\u001b[39;49m\u001b[38;5;132;43;01m}\u001b[39;49;00m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[43m)\u001b[49m\n\u001b[1;32m 1779\u001b[0m \u001b[43m \u001b[49m\u001b[43m)\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 1780\u001b[0m \u001b[43m \u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 1781\u001b[0m \u001b[38;5;66;03m# finish the root run\u001b[39;00m\n\u001b[1;32m 1782\u001b[0m \u001b[38;5;28;01mexcept\u001b[39;00m \u001b[38;5;167;01mBaseException\u001b[39;00m \u001b[38;5;28;01mas\u001b[39;00m e:\n", - "File \u001b[0;32m~/.pyenv/versions/3.11.2/lib/python3.11/site-packages/langchain_core/runnables/branch.py:211\u001b[0m, in \u001b[0;36mRunnableBranch.invoke\u001b[0;34m(self, input, config, **kwargs)\u001b[0m\n\u001b[1;32m 209\u001b[0m \u001b[38;5;28;01mbreak\u001b[39;00m\n\u001b[1;32m 210\u001b[0m \u001b[38;5;28;01melse\u001b[39;00m:\n\u001b[0;32m--> 211\u001b[0m output \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mdefault\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43minvoke\u001b[49m\u001b[43m(\u001b[49m\n\u001b[1;32m 212\u001b[0m \u001b[43m \u001b[49m\u001b[38;5;28;43minput\u001b[39;49m\u001b[43m,\u001b[49m\n\u001b[1;32m 213\u001b[0m \u001b[43m \u001b[49m\u001b[43mconfig\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mpatch_config\u001b[49m\u001b[43m(\u001b[49m\n\u001b[1;32m 214\u001b[0m \u001b[43m \u001b[49m\u001b[43mconfig\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mcallbacks\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mrun_manager\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mget_child\u001b[49m\u001b[43m(\u001b[49m\u001b[43mtag\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[38;5;124;43mbranch:default\u001b[39;49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[43m)\u001b[49m\n\u001b[1;32m 215\u001b[0m \u001b[43m \u001b[49m\u001b[43m)\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 216\u001b[0m \u001b[43m \u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43mkwargs\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 217\u001b[0m \u001b[43m \u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 218\u001b[0m \u001b[38;5;28;01mexcept\u001b[39;00m \u001b[38;5;167;01mBaseException\u001b[39;00m \u001b[38;5;28;01mas\u001b[39;00m e:\n\u001b[1;32m 219\u001b[0m run_manager\u001b[38;5;241m.\u001b[39mon_chain_error(e)\n", - "File \u001b[0;32m~/.pyenv/versions/3.11.2/lib/python3.11/site-packages/langchain_core/prompts/base.py:93\u001b[0m, in \u001b[0;36mBasePromptTemplate.invoke\u001b[0;34m(self, input, config)\u001b[0m\n\u001b[1;32m 90\u001b[0m \u001b[38;5;28;01mdef\u001b[39;00m \u001b[38;5;21minvoke\u001b[39m(\n\u001b[1;32m 91\u001b[0m \u001b[38;5;28mself\u001b[39m, \u001b[38;5;28minput\u001b[39m: Dict, config: Optional[RunnableConfig] \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;01mNone\u001b[39;00m\n\u001b[1;32m 92\u001b[0m ) \u001b[38;5;241m-\u001b[39m\u001b[38;5;241m>\u001b[39m PromptValue:\n\u001b[0;32m---> 93\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43m_call_with_config\u001b[49m\u001b[43m(\u001b[49m\n\u001b[1;32m 94\u001b[0m \u001b[43m \u001b[49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43m_format_prompt_with_error_handling\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 95\u001b[0m \u001b[43m \u001b[49m\u001b[38;5;28;43minput\u001b[39;49m\u001b[43m,\u001b[49m\n\u001b[1;32m 96\u001b[0m \u001b[43m \u001b[49m\u001b[43mconfig\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 97\u001b[0m \u001b[43m \u001b[49m\u001b[43mrun_type\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[38;5;124;43mprompt\u001b[39;49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[43m,\u001b[49m\n\u001b[1;32m 98\u001b[0m \u001b[43m \u001b[49m\u001b[43m)\u001b[49m\n", - "File \u001b[0;32m~/.pyenv/versions/3.11.2/lib/python3.11/site-packages/langchain_core/runnables/base.py:975\u001b[0m, in \u001b[0;36mRunnable._call_with_config\u001b[0;34m(self, func, input, config, run_type, **kwargs)\u001b[0m\n\u001b[1;32m 971\u001b[0m context \u001b[38;5;241m=\u001b[39m copy_context()\n\u001b[1;32m 972\u001b[0m context\u001b[38;5;241m.\u001b[39mrun(var_child_runnable_config\u001b[38;5;241m.\u001b[39mset, child_config)\n\u001b[1;32m 973\u001b[0m output \u001b[38;5;241m=\u001b[39m cast(\n\u001b[1;32m 974\u001b[0m Output,\n\u001b[0;32m--> 975\u001b[0m \u001b[43mcontext\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mrun\u001b[49m\u001b[43m(\u001b[49m\n\u001b[1;32m 976\u001b[0m \u001b[43m \u001b[49m\u001b[43mcall_func_with_variable_args\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 977\u001b[0m \u001b[43m \u001b[49m\u001b[43mfunc\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;66;43;03m# type: ignore[arg-type]\u001b[39;49;00m\n\u001b[1;32m 978\u001b[0m \u001b[43m \u001b[49m\u001b[38;5;28;43minput\u001b[39;49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;66;43;03m# type: ignore[arg-type]\u001b[39;49;00m\n\u001b[1;32m 979\u001b[0m \u001b[43m \u001b[49m\u001b[43mconfig\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 980\u001b[0m \u001b[43m \u001b[49m\u001b[43mrun_manager\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 981\u001b[0m \u001b[43m \u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43mkwargs\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 982\u001b[0m \u001b[43m \u001b[49m\u001b[43m)\u001b[49m,\n\u001b[1;32m 983\u001b[0m )\n\u001b[1;32m 984\u001b[0m \u001b[38;5;28;01mexcept\u001b[39;00m \u001b[38;5;167;01mBaseException\u001b[39;00m \u001b[38;5;28;01mas\u001b[39;00m e:\n\u001b[1;32m 985\u001b[0m run_manager\u001b[38;5;241m.\u001b[39mon_chain_error(e)\n", - "File \u001b[0;32m~/.pyenv/versions/3.11.2/lib/python3.11/site-packages/langchain_core/runnables/config.py:323\u001b[0m, in \u001b[0;36mcall_func_with_variable_args\u001b[0;34m(func, input, config, run_manager, **kwargs)\u001b[0m\n\u001b[1;32m 321\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m run_manager \u001b[38;5;129;01mis\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m \u001b[38;5;28;01mNone\u001b[39;00m \u001b[38;5;129;01mand\u001b[39;00m accepts_run_manager(func):\n\u001b[1;32m 322\u001b[0m kwargs[\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mrun_manager\u001b[39m\u001b[38;5;124m\"\u001b[39m] \u001b[38;5;241m=\u001b[39m run_manager\n\u001b[0;32m--> 323\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[43mfunc\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;28;43minput\u001b[39;49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43mkwargs\u001b[49m\u001b[43m)\u001b[49m\n", - "File \u001b[0;32m~/.pyenv/versions/3.11.2/lib/python3.11/site-packages/langchain_core/prompts/base.py:83\u001b[0m, in \u001b[0;36mBasePromptTemplate._format_prompt_with_error_handling\u001b[0;34m(self, inner_input)\u001b[0m\n\u001b[1;32m 81\u001b[0m missing \u001b[38;5;241m=\u001b[39m \u001b[38;5;28mset\u001b[39m(\u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39minput_variables)\u001b[38;5;241m.\u001b[39mdifference(inner_input)\n\u001b[1;32m 82\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m missing:\n\u001b[0;32m---> 83\u001b[0m \u001b[38;5;28;01mraise\u001b[39;00m \u001b[38;5;167;01mKeyError\u001b[39;00m(\n\u001b[1;32m 84\u001b[0m \u001b[38;5;124mf\u001b[39m\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mInput to \u001b[39m\u001b[38;5;132;01m{\u001b[39;00m\u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m\u001b[38;5;18m__class__\u001b[39m\u001b[38;5;241m.\u001b[39m\u001b[38;5;18m__name__\u001b[39m\u001b[38;5;132;01m}\u001b[39;00m\u001b[38;5;124m is missing variables \u001b[39m\u001b[38;5;132;01m{\u001b[39;00mmissing\u001b[38;5;132;01m}\u001b[39;00m\u001b[38;5;124m. \u001b[39m\u001b[38;5;124m\"\u001b[39m\n\u001b[1;32m 85\u001b[0m \u001b[38;5;124mf\u001b[39m\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124m Expected: \u001b[39m\u001b[38;5;132;01m{\u001b[39;00m\u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39minput_variables\u001b[38;5;132;01m}\u001b[39;00m\u001b[38;5;124m\"\u001b[39m\n\u001b[1;32m 86\u001b[0m \u001b[38;5;124mf\u001b[39m\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124m Received: \u001b[39m\u001b[38;5;132;01m{\u001b[39;00m\u001b[38;5;28mlist\u001b[39m(inner_input\u001b[38;5;241m.\u001b[39mkeys())\u001b[38;5;132;01m}\u001b[39;00m\u001b[38;5;124m\"\u001b[39m\n\u001b[1;32m 87\u001b[0m )\n\u001b[1;32m 88\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mformat_prompt(\u001b[38;5;241m*\u001b[39m\u001b[38;5;241m*\u001b[39minner_input)\n", - "\u001b[0;31mKeyError\u001b[0m: \"Input to ChatPromptTemplate is missing variables {'input'}. Expected: ['input'] Received: ['thought', 'context']\"" - ] - } - ], - "source": [ - "# Try something to trigger replanning\n", - "chain.invoke(\n", - " {\n", - " \"input\": \"Did the sum of Aliya and Roger's grades in Calc map out to less than\"\n", - " \" the total grade for the class?\"\n", - " }\n", - ")" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "201f3dc0-74ee-4ef0-908d-b71d0e11b080", - "metadata": {}, - "outputs": [], - "source": [] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 3 (ipykernel)", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.11.2" - } - }, - "nbformat": 4, - "nbformat_minor": 5 -} From 66ae0ae813f46bf53a1b59b655ee2f218b20f491 Mon Sep 17 00:00:00 2001 From: William Fu-Hinthorn <13333726+hinthornw@users.noreply.github.com> Date: Tue, 16 Jan 2024 09:03:27 -0800 Subject: [PATCH 03/18] oops add notebook --- examples/advanced_agents/LLMCompiler.ipynb | 1090 ++++++++++++++++++++ 1 file changed, 1090 insertions(+) create mode 100644 examples/advanced_agents/LLMCompiler.ipynb diff --git a/examples/advanced_agents/LLMCompiler.ipynb b/examples/advanced_agents/LLMCompiler.ipynb new file mode 100644 index 000000000..35acbe368 --- /dev/null +++ b/examples/advanced_agents/LLMCompiler.ipynb @@ -0,0 +1,1090 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "0c8b472b-f3fb-46c2-841f-930a4692697b", + "metadata": {}, + "source": [ + "# Implementing LLMCompiler using LangGraph\n", + "By Kim, et. al [đŸ”—](https://arxiv.org/abs/2312.04511)\n", + "\n", + "LLMCompiler is an agent architecture intented on speeding up the latency of agentic tasks via fast, parallel tool execution. It has 3 main components:\n", + "\n", + "1. Planner: generate a DAG of tasks.\n", + "2. Task Fetching Unit: schedules and executes the tasks\n", + "3. Joiner: Responds to the user or triggers a second plan\n", + "\n", + "\n", + "This notebook walks through each component and shows how to wire them together using LangGraph." + ] + }, + { + "cell_type": "markdown", + "id": "1abdedbd-d81b-4ee9-b46f-f29439ed1350", + "metadata": {}, + "source": [ + "# Part 1: Planner\n", + "\n", + "\n", + "Largely adapted from [the original source code](https://github.com/SqueezeAILab/LLMCompiler/blob/main/src/llm_compiler/output_parser.py)." + ] + }, + { + "cell_type": "markdown", + "id": "278f76b0-a2e1-42dc-bd3e-6f624984e3dd", + "metadata": {}, + "source": [ + "#### Output Parser\n", + "\n", + "Parses task lists in the following form:\n", + "\n", + "```plaintext\n", + "1. tool_1(\"arg1\", 3.5, ...)\n", + "Thought: I then want to find out Y by using tool_2\n", + "2. tool_2(\"\", ${1})'\n", + "3. join()\"\n", + "```\n", + "\n", + "The \"Thought\" lines are optional. The `${#}` placeholders are variables. These are used to route tool (task) outputs to other tools." + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "id": "cc71b6c4-d701-4217-9701-95ac0857e4e1", + "metadata": {}, + "outputs": [], + "source": [ + "import json\n", + "import re\n", + "from typing import Any, Dict, List, Optional, Sequence, Union\n", + "\n", + "from langchain.agents.agent import AgentOutputParser\n", + "from langchain.schema import OutputParserException\n", + "from langchain_core.tools import BaseTool\n", + "\n", + "THOUGHT_PATTERN = r\"Thought: ([^\\n]*)\"\n", + "# $1 or ${1} -> 1\n", + "ID_PATTERN = r\"\\$\\{?(\\d+)\\}?\"\n", + "END_OF_PLAN = \"\"\n", + "\n", + "\n", + "class ActionParserFSM:\n", + " def __init__(self):\n", + " self.reset()\n", + "\n", + " def reset(self):\n", + " self.state = \"START\"\n", + " self.task_index = \"\"\n", + " self.action = \"\"\n", + " self.comment = \"\"\n", + " self.bracket_count = 0\n", + " self.actions = []\n", + "\n", + " def parse(self, text: str):\n", + " for char in text:\n", + " action = self.process_char(char)\n", + " if action:\n", + " yield action\n", + " action = self.save_action()\n", + " if action:\n", + " yield action\n", + "\n", + " def process_char(self, char: str) -> Optional[dict]:\n", + " action = None\n", + " if self.state == \"START\":\n", + " if char.isdigit():\n", + " self.state = \"NUMBER\"\n", + " self.task_index += char\n", + " elif char == \"\\n\":\n", + " self.reset()\n", + " elif self.state == \"NUMBER\":\n", + " if char == \".\":\n", + " self.state = \"ACTION\"\n", + " elif char.isdigit():\n", + " self.task_index += char\n", + " else:\n", + " self.reset()\n", + " elif self.state == \"ACTION\":\n", + " if char == \"{\":\n", + " self.bracket_count += 1\n", + " elif char == \"}\":\n", + " self.bracket_count -= 1\n", + " if self.bracket_count == 0:\n", + " self.state = \"COMMENT\"\n", + " self.action += char\n", + " elif self.state == \"COMMENT\":\n", + " if char == \"\\n\":\n", + " action = self.save_action()\n", + " self.reset()\n", + " else:\n", + " self.comment += char\n", + " return action\n", + "\n", + " def save_action(self):\n", + " if self.task_index and self.action:\n", + " parsed_action = json.loads(self.action.strip())\n", + " tool_name, args = next(iter(parsed_action.items()))\n", + " return {\n", + " \"task_index\": int(self.task_index),\n", + " \"tool_name\": tool_name,\n", + " \"args\": args,\n", + " }\n", + "\n", + "\n", + "class LLMCompilerPlanParser(AgentOutputParser, extra=\"allow\"):\n", + " \"\"\"Planning output parser.\"\"\"\n", + "\n", + " def __init__(self, tools: Sequence[BaseTool], **kwargs):\n", + " super().__init__(**kwargs)\n", + " self.tools = tools\n", + "\n", + " def parse(self, text: str) -> list[str]:\n", + " parser = ActionParserFSM()\n", + " graph_dict = {}\n", + " for task in parser.parse(text):\n", + " idx = int(task[\"task_index\"])\n", + "\n", + " task = instantiate_task(\n", + " tools=self.tools,\n", + " idx=idx,\n", + " tool_name=task[\"tool_name\"],\n", + " args=task[\"args\"],\n", + " )\n", + "\n", + " graph_dict[idx] = task\n", + " if task[\"tool\"] == \"join\":\n", + " break\n", + "\n", + " return graph_dict\n", + "\n", + "\n", + "### Helper functions\n", + "\n", + "\n", + "def default_dependency_rule(idx, args: str):\n", + " matches = re.findall(ID_PATTERN, args)\n", + " numbers = [int(match) for match in matches]\n", + " return idx in numbers\n", + "\n", + "\n", + "def _get_dependencies_from_graph(\n", + " idx: int, tool_name: str, args: Sequence[Any]\n", + ") -> dict[str, list[str]]:\n", + " \"\"\"Get dependencies from a graph.\"\"\"\n", + " if tool_name == \"join\":\n", + " return list(range(1, idx))\n", + " return [i for i in range(1, idx) if default_dependency_rule(i, str(args))]\n", + "\n", + "\n", + "def instantiate_task(\n", + " tools: Sequence[BaseTool],\n", + " idx: int,\n", + " tool_name: str,\n", + " args: Union[dict, str, bool, None],\n", + ") -> dict:\n", + " dependencies = _get_dependencies_from_graph(idx, tool_name, args)\n", + " if tool_name == \"join\":\n", + " tool = \"join\"\n", + " else:\n", + " try:\n", + " tool = tools[[tool.name for tool in tools].index(tool_name)]\n", + " except ValueError as e:\n", + " raise OutputParserException(f\"Tool {tool_name} not found.\")\n", + " return dict(\n", + " tool=tool,\n", + " args=args,\n", + " dependencies=dependencies,\n", + " )" + ] + }, + { + "cell_type": "markdown", + "id": "228a2f75-68b1-4dbf-95dc-4bfc738c3b3b", + "metadata": {}, + "source": [ + "#### Planner Code\n", + "\n", + "This takes the input and outputs a plan." + ] + }, + { + "cell_type": "code", + "execution_count": 141, + "id": "58af9746-1011-41e9-a77a-be9cef202aea", + "metadata": {}, + "outputs": [], + "source": [ + "from langchain.chat_models.base import BaseChatModel\n", + "from langchain_core.prompts import ChatPromptTemplate\n", + "from langchain_core.runnables import RunnableBranch\n", + "from langchain_core.tools import BaseTool\n", + "\n", + "END_OF_PLAN = \"\"\n", + "\n", + "JOINER_FINISH = \"Finish\"\n", + "JOINER_REPLAN = \"Replan\"\n", + "\n", + "\n", + "JOIN_DESCRIPTION = (\n", + " \"join():\\n\"\n", + " \" - Collects and combines results from prior actions.\\n\"\n", + " \" - A LLM agent is called upon invoking join to either finalize the user query or wait until the plans are executed.\\n\"\n", + " \" - join should always be the last action in the plan, and will be called in two scenarios:\\n\"\n", + " \" (a) if the answer can be determined by gathering the outputs from tasks to generate the final response.\\n\"\n", + " \" (b) if the answer cannot be determined in the planning phase before you execute the plans. \"\n", + ")\n", + "\n", + "planner_prompt_tmpl_str = (\n", + " \"Given a user query, create a plan to solve it with the utmost parallelizability. \"\n", + " \"Each plan should comprise an action from the following {num_tools} types:\\n\"\n", + " \"{tool_descriptions}\"\n", + " f\"\\n{{num_toolsp1}}. {JOIN_DESCRIPTION}\"\n", + " \"Guidelines:\\n\"\n", + " \" - Each action described above contains input/output types and description.\\n\"\n", + " \" - You must strictly adhere to the input and output types for each action.\\n\"\n", + " \" - The action descriptions contain the guidelines. You MUST strictly follow those guidelines when you use the actions.\\n\"\n", + " \" - Each action in the plan should strictly be one of the above types.\\n\"\n", + " \" - Provide actions ONLY in json form, with the single key being the action name and the value being its arguments. Do not write python code. \\n\"\n", + " \" - Each action line must start with a unique ID, which is strictly increasing.\\n\"\n", + " \" - Inputs for actions can either be constants or outputs from preceding actions. \"\n", + " \"In the latter case, use the format $id to denote the ID of the previous action whose output will be the input.\\n\"\n", + " f\" - Always call join as the last action in the plan. Say '{END_OF_PLAN}' after you call join\\n\"\n", + " \" - Ensure the plan maximizes parallelizability.\\n\"\n", + " \" - Only use the provided action types. If a query cannot be addressed using these, invoke the join action for the next steps.\\n\"\n", + " \" - Never introduce new actions other than the ones provided.\\n\\n\"\n", + " \"{replan}\"\n", + " \"{examples}\"\n", + ")\n", + "\n", + "\n", + "def _generate_planner_prompt(\n", + " tools: Sequence[BaseTool],\n", + " example_prompt=str,\n", + "):\n", + " tool_descriptions = \"\\n\".join(\n", + " f\"{i+1}. {tool.name}: {tool.description}\\n\\tInput schema: {tool.args}\"\n", + " for i, tool in enumerate(tools)\n", + " )\n", + " planner_prompt_template = ChatPromptTemplate.from_messages(\n", + " [(\"system\", planner_prompt_tmpl_str), (\"user\", \"Question: {input}{context}\")]\n", + " ).partial(\n", + " tool_descriptions=tool_descriptions,\n", + " examples=\"Here are some examples:\\n\\n\" + example_prompt\n", + " if example_prompt\n", + " else \"\",\n", + " num_tools=len(tools),\n", + " num_toolsp1=len(tools) + 1,\n", + " )\n", + "\n", + " return planner_prompt_template\n", + "\n", + "\n", + "def create_planner(\n", + " llm: BaseChatModel,\n", + " example_prompt: str,\n", + " tools: Sequence[BaseTool],\n", + " stop: Optional[list[str]] = None,\n", + "):\n", + " og_planner_prompt = _generate_planner_prompt(tools, example_prompt).partial(\n", + " replan=\"\",\n", + " context=\"\",\n", + " )\n", + " replanner_prompt = _generate_planner_prompt(tools, example_prompt).partial(\n", + " replan=' - You are given \"Previous Plan\" which is the plan that the previous agent created along with the execution results '\n", + " \"(given as Observation) of each plan and a general thought (given as Thought) about the executed results.\"\n", + " 'You MUST use these information to create the next plan under \"Current Plan\".\\n'\n", + " ' - When starting the Current Plan, you should start with \"Thought\" that outlines the strategy for the next plan.\\n'\n", + " \" - In the Current Plan, you should NEVER repeat the actions that are already executed in the Previous Plan.\\n\"\n", + " \" - You must continue the task index from the end of the previous one. Do not repeat task indices.\"\n", + " )\n", + " bound_llm = llm.bind(stop=stop)\n", + " return (\n", + " RunnableBranch(\n", + " ((lambda x: x.get(\"context\") is not None), replanner_prompt),\n", + " og_planner_prompt,\n", + " )\n", + " | bound_llm\n", + " | LLMCompilerPlanParser(tools=tools)\n", + " )" + ] + }, + { + "cell_type": "markdown", + "id": "7feb5c82-b1a9-40ae-863a-0362fe3ce5ea", + "metadata": {}, + "source": [ + "#### Example usage\n", + "\n", + "Here's an example usage of the planner module" + ] + }, + { + "cell_type": "code", + "execution_count": 131, + "id": "3fe074ea-7314-47a7-9a9f-a8e6191ea1f3", + "metadata": {}, + "outputs": [], + "source": [ + "from langchain.tools import tool\n", + "from langchain_openai import ChatOpenAI\n", + "\n", + "\n", + "@tool\n", + "def get_user_id(first_name: str, last_name: Optional[str] = None):\n", + " \"\"\"Query the user IDs of everyone with the provided name.\"\"\"\n", + " return 4\n", + "\n", + "\n", + "@tool\n", + "def get_scores(class_name: str, user_id: int):\n", + " \"\"\"Query the class registry for grades of the provided user ID.\"\"\"\n", + " return \"A+\"\n", + "\n", + "\n", + "examples = (\n", + " \"Question: What's the user ID for Johnny Drop Tables?\\n\"\n", + " '1. {\"get_user_id\": {\"first_name\": \"Johnny\", \"last_name\":\"Drop Tables\"}}\\n'\n", + " f'2. {{\"join\": null}}{END_OF_PLAN}\\n'\n", + " \"###\\n\"\n", + " \"\\n\"\n", + " \"Question: What was Eric Zhang's score in Calc?\\n\"\n", + " '1. {\"get_user_id\": {\"first_name\": \"Eric\", \"last_name\":\"Zhang\"}}\\n'\n", + " '2. {\"get_scores\": {\"class_name\": \"calc\", \"user_id\": \"$1\"}}\\n'\n", + " f'3. {{\"join\": null}}{END_OF_PLAN}\\n'\n", + " \"###\\n\"\n", + " \"\\n\"\n", + ")\n", + "\n", + "planner = create_planner(\n", + " ChatOpenAI(model=\"gpt-3.5-turbo\"),\n", + " example_prompt=examples,\n", + " tools=[get_user_id, get_scores],\n", + ")" + ] + }, + { + "cell_type": "code", + "execution_count": 132, + "id": "55fb0f99-4e59-4e5a-b687-a90bb4d06d39", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "{1: {'tool': StructuredTool(name='get_user_id', description='get_user_id(first_name: str, last_name: Optional[str] = None) - Query the user IDs of everyone with the provided name.', args_schema=, func=),\n", + " 'args': {'first_name': 'Sam', 'last_name': 'Van Damm'},\n", + " 'dependencies': []},\n", + " 2: {'tool': StructuredTool(name='get_user_id', description='get_user_id(first_name: str, last_name: Optional[str] = None) - Query the user IDs of everyone with the provided name.', args_schema=, func=),\n", + " 'args': {'first_name': 'Will', 'last_name': 'Van Damm'},\n", + " 'dependencies': []},\n", + " 3: {'tool': StructuredTool(name='get_scores', description='get_scores(class_name: str, user_id: int) - Query the class registry for grades of the provided user ID.', args_schema=, func=),\n", + " 'args': {'class_name': 'Calc BC', 'user_id': '$1'},\n", + " 'dependencies': [1]},\n", + " 4: {'tool': StructuredTool(name='get_scores', description='get_scores(class_name: str, user_id: int) - Query the class registry for grades of the provided user ID.', args_schema=, func=),\n", + " 'args': {'class_name': 'Calc BC', 'user_id': '$2'},\n", + " 'dependencies': [2]},\n", + " 5: {'tool': 'join', 'args': None, 'dependencies': [1, 2, 3, 4]}}" + ] + }, + "execution_count": 132, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "tasks = planner.invoke(\n", + " {\"input\": \"What are the Calc BC grades for Sam and Will Van Damm?\"}\n", + ")\n", + "tasks" + ] + }, + { + "cell_type": "markdown", + "id": "5d0e795f-61ff-4553-9823-23e7624ca180", + "metadata": {}, + "source": [ + "## 2. Task Fetching Unit\n", + "\n", + "This component schedules the tasks. In the paper, it's kept separate from the \"executor\", but here we create a single DAG to be executed by LangGraph.\n", + "\n", + "Basic idea is that, given a list of dicts of the form:\n", + "\n", + "```typescript\n", + "{\n", + " tool: BaseTool,\n", + " dependencies: number[],\n", + "}\n", + "```\n", + "\n", + "1. Create a topological sort of the tasks\n", + "2. Execute them on the previous step's output, ensuring to perform variable substitution where appropriate" + ] + }, + { + "cell_type": "code", + "execution_count": 184, + "id": "c70a0e28-43db-4ea2-af48-8a2f310dce83", + "metadata": {}, + "outputs": [], + "source": [ + "import functools\n", + "\n", + "from langchain_core.runnables import (\n", + " RunnableLambda,\n", + " RunnableParallel,\n", + " RunnablePassthrough,\n", + ")\n", + "\n", + "\n", + "def _sort_tasks(data):\n", + " if not data:\n", + " return []\n", + " sorted_tasks = []\n", + " # Remove tasks already completed\n", + " min_idx = min([int(k) for k in data])\n", + " data = {\n", + " int(k): {\n", + " **v,\n", + " \"dependencies\": [dep for dep in v[\"dependencies\"] if dep >= min_idx],\n", + " }\n", + " for k, v in data.items()\n", + " }\n", + " while data:\n", + " no_deps = {k: v for k, v in data.items() if not v[\"dependencies\"]}\n", + " if not no_deps:\n", + " raise ValueError(\"We seem to have run into a circular dependency.\")\n", + "\n", + " sorted_tasks.append(no_deps)\n", + " data = {\n", + " k: {\n", + " **v,\n", + " \"dependencies\": [d for d in v[\"dependencies\"] if d not in no_deps],\n", + " }\n", + " for k, v in data.items()\n", + " if k not in no_deps\n", + " }\n", + " return sorted_tasks\n", + "\n", + "\n", + "def _resolve_arg(x: dict, arg: Union[str, Any]):\n", + " if isinstance(arg, str) and arg.startswith(\"$\"):\n", + " try:\n", + " return x[f\"task_{arg[1:]}\"]\n", + " except:\n", + " if arg.endswith(\".output\"):\n", + " return x[f\"task_{arg[1:-7]}\"]\n", + " raise\n", + "\n", + " else:\n", + " return arg\n", + "\n", + "\n", + "def _execute_task(x, task):\n", + " tool_to_use = task[\"tool\"]\n", + " args = task[\"args\"]\n", + " if isinstance(args, str):\n", + " resolved_args = _resolve_arg(x, args)\n", + " elif isinstance(args, dict):\n", + " resolved_args = {key: _resolve_arg(x, val) for key, val in args.items()}\n", + " else:\n", + " # This will likely fail\n", + " resolved_args = args\n", + " try:\n", + " return tool_to_use.invoke(resolved_args)\n", + " except Exception as e:\n", + " return (\n", + " f\"ERROR(Failed to call tool {tool_to_use} with args {tool_to_use}.\"\n", + " + f\" Args resolved to {resolved_args}. Error: {repr(e)})\"\n", + " )\n", + "\n", + "\n", + "def construct_dag(tasks):\n", + " sorted_tasks = _sort_tasks(tasks)\n", + " chain = None\n", + " for idx, task_group in enumerate(sorted_tasks):\n", + " if len(task_group) == 1 and next(iter(task_group.values()))[\"tool\"] == \"join\":\n", + " # TODO: actually join the values\n", + " step = lambda x: {\"join\": x}\n", + " else:\n", + " # Cascade all results forward\n", + " constructor = (\n", + " RunnableParallel if chain is None else RunnablePassthrough.assign\n", + " )\n", + " task_dict = {}\n", + " for idx, task in task_group.items():\n", + " task_dict[f\"task_{idx}\"] = RunnableLambda(\n", + " functools.partial(_execute_task, task=task)\n", + " ).with_config(run_name=f\"task_{idx}\")\n", + "\n", + " step = constructor(**task_dict).with_config(run_name=f\"TaskGroup{idx}\")\n", + " if chain is None:\n", + " chain = step\n", + " else:\n", + " chain |= step\n", + "\n", + " if chain is not None:\n", + " return chain | RunnablePassthrough.assign(tasks=lambda _: tasks)\n", + " return chain" + ] + }, + { + "cell_type": "code", + "execution_count": 185, + "id": "87f11cea-3a8d-479c-8a9e-81223dbbc1f5", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + " +------------------------------+ \n", + " | ParallelInput | \n", + " +------------------------------+ \n", + " *** *** \n", + " ** ** \n", + " ** ** \n", + " +-------------+ +-------------+ \n", + " | Lambda(...) | | Lambda(...) | \n", + " +-------------+ +-------------+ \n", + " *** *** \n", + " ** ** \n", + " ** ** \n", + " +-------------------------------+ \n", + " | ParallelOutput | \n", + " +-------------------------------+ \n", + " * \n", + " * \n", + " * \n", + " +------------------------------+ \n", + " | ParallelInput | \n", + " +------------------------------+ \n", + " ***** * ***** \n", + " ***** * ***** \n", + " *** * *** \n", + "+-------------+ +-------------+ +-------------+ \n", + "| Lambda(...) | | Lambda(...) | | Passthrough | \n", + "+-------------+***** +-------------+ *****+-------------+ \n", + " ***** * ***** \n", + " ***** * ***** \n", + " *** * *** \n", + " +-------------------------------+ \n", + " | ParallelOutput | \n", + " +-------------------------------+ \n", + " * \n", + " * \n", + " * \n", + " +-------------------------------+ \n", + " | Lambda(lambda x: {'join': x}) | \n", + " +-------------------------------+ \n", + " * \n", + " * \n", + " * \n", + " +----------------------+ \n", + " | ParallelInput | \n", + " +----------------------+ \n", + " *** *** \n", + " *** *** \n", + " ** ** \n", + " +-------------------------+ +-------------+ \n", + " | Lambda(lambda _: tasks) | | Passthrough | \n", + " +-------------------------+ +-------------+ \n", + " *** *** \n", + " *** *** \n", + " ** ** \n", + " +-----------------------+ \n", + " | ParallelOutput | \n", + " +-----------------------+ \n" + ] + } + ], + "source": [ + "graph = construct_dag(tasks)\n", + "graph.get_graph().print_ascii()" + ] + }, + { + "cell_type": "markdown", + "id": "9efa15ae-817a-48c6-86ed-16bc112fedc5", + "metadata": {}, + "source": [ + "#### Example Plan\n", + "\n", + "We still haven't introduced any cycles in our computation graph, so this is all easily expressed in LCEL." + ] + }, + { + "cell_type": "code", + "execution_count": 135, + "id": "133d124a-0d41-4c6d-a86a-34fa4cb1430f", + "metadata": {}, + "outputs": [], + "source": [ + "chain = planner | construct_dag" + ] + }, + { + "cell_type": "code", + "execution_count": 136, + "id": "55142257-2674-4a47-988e-0d2810917329", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "{'task_1': 4, 'task_2': 4, 'task_3': 'A+', 'task_4': 'A+'}" + ] + }, + "execution_count": 136, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "example_question = \"Did Aliya get a better score than Roger in Geology?\"\n", + "task_results = chain.invoke({\"input\": example_question})\n", + "task_results[\"join\"]" + ] + }, + { + "cell_type": "markdown", + "id": "563d5311-55f0-4ca1-afbd-01fd970cf3e3", + "metadata": {}, + "source": [ + "## Agent Logic\n", + "\n", + "So now we have the planning and initial execution done. We need a component to process these outputs and either:\n", + "1. Respond with the correct answer.\n", + "2. Loop with a new plan.\n", + "\n", + "The paper calls this the \"joiner\"." + ] + }, + { + "cell_type": "code", + "execution_count": 216, + "id": "2978991e-45a4-44e6-9deb-f941f44fe93a", + "metadata": {}, + "outputs": [], + "source": [ + "from langchain_core.output_parsers import StrOutputParser\n", + "from typing_extensions import TypedDict\n", + "\n", + "\n", + "def format_task(task, idx):\n", + " tool = task[\"tool\"]\n", + " tool_name = tool if isinstance(tool, str) else tool.name # Handle join()\n", + " return f\"{idx}. {{{tool_name}: {task['args']}}}\"\n", + "\n", + "\n", + "def format_tasks(executor_output: dict):\n", + " tasks = executor_output[\"tasks\"]\n", + " prior_observations = executor_output.get(\"observations\")\n", + " formatted_plan = \"\\n\".join(format_task(task, idx) for idx, task in tasks.items())\n", + " observations = \"\\n\".join(f\"{k}: {v}\" for k, v in executor_output[\"join\"].items())\n", + " result = f\"Original Plan:\\n{formatted_plan}\\nExecuted plan results:\\n{observations}\"\n", + " if prior_observations:\n", + " result += f\"\\nPrevious Results:\\n{prior_observations}\"\n", + " return result\n", + "\n", + "\n", + "def _parse_joiner_output(raw_answer: str) -> str:\n", + " thought, answer, is_replan = \"\", \"\", False # default values\n", + " raw_answers = raw_answer.split(\"\\n\")\n", + " for ans in raw_answers:\n", + " if ans.startswith(\"Action:\"):\n", + " answer = ans[ans.find(\"(\") + 1 : ans.find(\")\")]\n", + " is_replan = JOINER_REPLAN in ans\n", + " elif ans.startswith(\"Thought:\"):\n", + " thought = ans.split(\"Thought:\")[1].strip()\n", + " if is_replan:\n", + " return {\"thought\": thought, \"context\": answer}\n", + " else:\n", + " return {\"thought\": thought, \"answer\": answer}" + ] + }, + { + "cell_type": "code", + "execution_count": 217, + "id": "b2feea5a-e0e4-4cff-8cb5-fdbfec95ba57", + "metadata": {}, + "outputs": [], + "source": [ + "def create_joiner(prompt, llm):\n", + " return (\n", + " (\n", + " lambda x: {\n", + " **x[\"plan\"],\n", + " \"input\": x[\"input\"],\n", + " \"context\": x.get(\"context\"),\n", + " \"observations\": x.get(\"observations\"),\n", + " }\n", + " )\n", + " | RunnablePassthrough.assign(scratchpad=format_tasks)\n", + " | ChatPromptTemplate.from_messages([(\"system\", prompt), (\"user\", \"{input}\")])\n", + " | llm\n", + " | StrOutputParser()\n", + " | _parse_joiner_output\n", + " )" + ] + }, + { + "cell_type": "code", + "execution_count": 218, + "id": "942dab42-ad42-4ba2-90d5-49edbe4fae68", + "metadata": {}, + "outputs": [], + "source": [ + "system_prompt = (\n", + " \"Solve a question answering task. Here are some guidelines:\\n\"\n", + " \" - In the Assistant Scratchpad, you will be given results of a plan you have executed to answer the user's question.\\n\"\n", + " \" - Thought needs to reason about the question based on the Observations in 1-2 sentences.\\n\"\n", + " \" - Ignore irrelevant action results.\\n\"\n", + " \" - If the required information is present, give a concise but complete and helpful answer to the user's question.\\n\"\n", + " \" - If you are unable to give a satisfactory finishing answer, replan to get the required information.\"\n", + " \" Respond in the following format:\\n\\n\"\n", + " \"Thought: \\n\"\n", + " \"Action: \\n\"\n", + " \"Available actions:\\n\"\n", + " f\" (1) {JOINER_FINISH}(the final answer to return to the user): returns the answer and finishes the task.\\n\"\n", + " f\" (2) {JOINER_REPLAN}(the reasoning and other information that will help you plan again. Can be a line of any length): instructs why we must replan\\n\\n\"\n", + " \" Examples:\\n\"\n", + " \"Question: How many users are currently using the new product?\\n\"\n", + " \"...task returns the number 32,000\\n\"\n", + " \"Thought: I find no issue with the original plan, and the results satisfy everything in the user question.\\n\"\n", + " f\"Action: {JOINER_FINISH}(32,000 users currently use the new product)\\n###\\n\"\n", + " \"Question: How much cooler is it in NY than SF?\\n\"\n", + " \"...task results show SF is 57 degrees fahrenheit today, and they show in NY it has a high of 32 degrees fahrenheit \\n\"\n", + " \"Thought: I can answer by synthesizing the results.\\n\"\n", + " f\"Action: {JOINER_FINISH}(NY is 25 degrees cooler than SF today, as it has a high of 32 degrees Fahrenheit today, whereas in SF, it is 57 degrees Fahrenheit.)\\n###\\n\"\n", + " \"Question: Are the gophers beating the rabbits??\\n\"\n", + " \"...task returns the a score of 7 for rabbits but no other value...\\n\"\n", + " \"Thought: I need the gophers' score to make a final decision.\\n\"\n", + " f\"Action: {JOINER_REPLAN}(The rabbits have a score of 7, but I need the gophers' score.)\"\n", + " \"\\nAssistant Scratchpad:\\n{scratchpad}\"\n", + ")" + ] + }, + { + "cell_type": "code", + "execution_count": 219, + "id": "a07d0804-2ce5-4462-98eb-4473f36ef704", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "{'thought': 'The plan has been executed successfully and returned the scores for both Aliya and Roger in Geology. We can compare their scores to determine if Aliya got a better score than Roger.',\n", + " 'answer': 'Aliya got an A+ in Geology, while Roger also got an A+. Therefore, they both got the same score in Geology.'}" + ] + }, + "execution_count": 219, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "joiner = create_joiner(system_prompt, ChatOpenAI(model=\"gpt-3.5-turbo\"))\n", + "joiner.invoke({\"plan\": task_results, \"input\": example_question})" + ] + }, + { + "cell_type": "markdown", + "id": "b099e5ee-2c23-47d9-9387-0f64e02627d3", + "metadata": {}, + "source": [ + "### Construct Agent\n", + "\n", + "Now we have all the required pieces! Let's construct our agent with its tools." + ] + }, + { + "cell_type": "code", + "execution_count": 220, + "id": "565b08d2-d19c-4125-97f7-996fc01bc631", + "metadata": {}, + "outputs": [], + "source": [ + "import getpass\n", + "import os\n", + "\n", + "os.environ[\"TAVILY_API_KEY\"] = (\n", + " os.environ.get(\"TAVILY_API_KEY\")\n", + " if \"TAVILY_API_KEY\" in os.environ\n", + " else getpass.getpass(\"Tavily API Key:\")\n", + ")\n", + "# Then fetch a credentials.json file\n", + "# https://developers.google.com/gmail/api/quickstart/python#authorize_credentials_for_a_desktop_application" + ] + }, + { + "cell_type": "code", + "execution_count": 221, + "id": "bd84ca4b-eacb-471d-9975-5449047b5bed", + "metadata": {}, + "outputs": [], + "source": [ + "from operator import add, mul, sub, truediv\n", + "from typing import Literal\n", + "\n", + "from langchain_community.agent_toolkits import GmailToolkit\n", + "from langchain_community.tools.tavily_search import TavilySearchResults\n", + "from langchain_core.tools import tool\n", + "\n", + "\n", + "@tool\n", + "def calculate(\n", + " arg1: float,\n", + " arg2: float,\n", + " op: Union[Literal[\"+\"], Literal[\"-\"], Literal[\"*\"], Literal[\"/\"]],\n", + "):\n", + " \"\"\"Calculate a mathematical operation on two arguments.\"\"\"\n", + " resolved_op = {\"+\": add, \"-\": sub, \"*\": mul, \"/\": truediv}\n", + " return resolved_op[op](arg1, arg2)\n", + "\n", + "\n", + "tools = [TavilySearchResults(max_results=1), calculate]" + ] + }, + { + "cell_type": "code", + "execution_count": 224, + "id": "768b5f11-e3d2-47be-8143-a7dcd8765243", + "metadata": {}, + "outputs": [], + "source": [ + "from langgraph.graph import END, StateGraph\n", + "\n", + "\n", + "class GraphState(TypedDict):\n", + " input: str\n", + " plan: Dict\n", + " agent_output: Dict\n", + " observations: Dict\n", + " num_iterations: int\n", + " context: str\n", + " stop_reason: str\n", + "\n", + "\n", + "MAX_ITERATIONS = 5\n", + "workflow = StateGraph(GraphState)\n", + "\n", + "# 1. Define vertices\n", + "\n", + "planner = create_planner(\n", + " llm=ChatOpenAI(model=\"gpt-4-1106-preview\"),\n", + " # Add more examples to improve reliability\n", + " example_prompt=(\n", + " \"Question: What's the capital of Myanmar?\\n\"\n", + " '1. {\"tavily_search_results_json\": {\"query\": \"Capital of Myanmar\"}}\\n'\n", + " f'2. {{\"join\": null}}{END_OF_PLAN}\\n'\n", + " \"###\\n\"\n", + " \"\\n\"\n", + " ),\n", + " tools=tools,\n", + ")\n", + "\n", + "plan_and_execute = planner | construct_dag\n", + "joiner = create_joiner(system_prompt, ChatOpenAI(model=\"gpt-4-1106-preview\"))\n", + "\n", + "\n", + "def _reformat_task(idx, task: Union[BaseTool, str]):\n", + " tool = task[\"tool\"]\n", + " tool_name = tool if isinstance(tool, str) else tool.name\n", + " called = {tool_name: task[\"args\"]}\n", + " return f\"{idx}. {json.dumps(called)}\"\n", + "\n", + "\n", + "def provide_context(state):\n", + " # Insert a context string for the re-planner.\n", + " # This could alternatively call an LLM to provide additional logic\n", + " context = state[\"agent_output\"][\"context\"]\n", + " num_iterations = int(state.get(\"num_iterations\") or 1) + 1\n", + " previous_plan = \"\\n\".join(\n", + " [\n", + " _reformat_task(idx, task)\n", + " for idx, task in sorted(state[\"plan\"][\"tasks\"].items())\n", + " ]\n", + " )\n", + " context_str = (\n", + " f\"\\n\\nPrevious Plan:\\n{previous_plan}\\n\"\n", + " f\"{context}\\nYou have made {num_iterations}/{MAX_ITERATIONS} attempts thus far.\"\n", + " )\n", + " observations = state[\"observations\"] or {}\n", + " for task, observation in state[\"plan\"][\"join\"].items():\n", + " observations[task] = observation\n", + " return {\n", + " \"context\": context_str,\n", + " \"num_iterations\": num_iterations,\n", + " \"observations\": observations,\n", + " }\n", + "\n", + "\n", + "def add_stop_reason(state):\n", + " num_iterations = int(state.get(\"num_iterations\") or 0)\n", + " if num_iterations >= MAX_ITERATIONS:\n", + " return {\"stop_reason\": \"end_max_iter\"}\n", + " if state[\"agent_output\"].get(\"answer\"):\n", + " return {\"stop_reason\": \"answer\"}\n", + " return {\"stop_reason\": None}\n", + "\n", + "\n", + "# Assign each node to a state variable to update\n", + "workflow.add_node(\"plan_and_execute\", RunnablePassthrough.assign(plan=plan_and_execute))\n", + "workflow.add_node(\"join\", RunnablePassthrough.assign(agent_output=joiner))\n", + "workflow.add_node(\"provide_context\", provide_context)\n", + "workflow.add_node(\"provide_stop_reason\", add_stop_reason)\n", + "\n", + "\n", + "## Define edges\n", + "\n", + "workflow.add_edge(\"plan_and_execute\", \"join\")\n", + "workflow.add_edge(\"provide_context\", \"plan_and_execute\")\n", + "workflow.add_edge(\"join\", \"provide_stop_reason\")\n", + "\n", + "### This condition determines looping logic\n", + "\n", + "\n", + "def should_continue(state):\n", + " if state[\"stop_reason\"] is None:\n", + " return \"continue\"\n", + " return \"end\"\n", + "\n", + "\n", + "workflow.add_conditional_edges(\n", + " start_key=\"provide_stop_reason\",\n", + " # Next, we pass in the function that will determine which node is called next.\n", + " condition=should_continue,\n", + " conditional_edge_mapping={\n", + " # If it generates context, we must replan\n", + " \"continue\": \"provide_context\",\n", + " # Otherwise we finish.\n", + " \"end\": END,\n", + " },\n", + ")\n", + "workflow.set_entry_point(\"plan_and_execute\")\n", + "chain = workflow.compile()" + ] + }, + { + "cell_type": "markdown", + "id": "9f8c9849-8531-463d-a0ef-dcc3d9888b2d", + "metadata": {}, + "source": [ + "## Simple question\n", + "\n", + "Let's ask a simple question of the agent." + ] + }, + { + "cell_type": "code", + "execution_count": 225, + "id": "5bc4584a-e31c-4065-805e-76a6db30676a", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "The GDP of New York in 2022 was about 1.56 trillion U.S. dollars.\n" + ] + } + ], + "source": [ + "result = chain.invoke({\"input\": \"What's the GDP of New York?\"})\n", + "print(result[\"agent_output\"][\"answer\"])" + ] + }, + { + "cell_type": "markdown", + "id": "33c65ef5-b4b2-4ab2-8c78-a551da7819b9", + "metadata": {}, + "source": [ + "## Multi-hop question" + ] + }, + { + "cell_type": "code", + "execution_count": 227, + "id": "0b3a0916-d8ca-4092-b91c-d9e2b05259d8", + "metadata": {}, + "outputs": [ + { + "ename": "JSONDecodeError", + "evalue": "Expecting value: line 1 column 1 (char 0)", + "output_type": "error", + "traceback": [ + "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", + "\u001b[0;31mJSONDecodeError\u001b[0m Traceback (most recent call last)", + "Cell \u001b[0;32mIn[227], line 1\u001b[0m\n\u001b[0;32m----> 1\u001b[0m result \u001b[38;5;241m=\u001b[39m \u001b[43mchain\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43minvoke\u001b[49m\u001b[43m(\u001b[49m\n\u001b[1;32m 2\u001b[0m \u001b[43m \u001b[49m\u001b[43m{\u001b[49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[38;5;124;43minput\u001b[39;49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[43m:\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[38;5;124;43mHow much larger is the GDP of the UK than that of New York?\u001b[39;49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[43m}\u001b[49m\n\u001b[1;32m 3\u001b[0m \u001b[43m)\u001b[49m\n", + "File \u001b[0;32m~/code/lc/langgraph/langgraph/pregel/__init__.py:492\u001b[0m, in \u001b[0;36mPregel.invoke\u001b[0;34m(self, input, config, output_keys, input_keys, **kwargs)\u001b[0m\n\u001b[1;32m 482\u001b[0m \u001b[38;5;28;01mdef\u001b[39;00m \u001b[38;5;21minvoke\u001b[39m(\n\u001b[1;32m 483\u001b[0m \u001b[38;5;28mself\u001b[39m,\n\u001b[1;32m 484\u001b[0m \u001b[38;5;28minput\u001b[39m: Union[\u001b[38;5;28mdict\u001b[39m[\u001b[38;5;28mstr\u001b[39m, Any], Any],\n\u001b[0;32m (...)\u001b[0m\n\u001b[1;32m 489\u001b[0m \u001b[38;5;241m*\u001b[39m\u001b[38;5;241m*\u001b[39mkwargs: Any,\n\u001b[1;32m 490\u001b[0m ) \u001b[38;5;241m-\u001b[39m\u001b[38;5;241m>\u001b[39m Union[\u001b[38;5;28mdict\u001b[39m[\u001b[38;5;28mstr\u001b[39m, Any], Any]:\n\u001b[1;32m 491\u001b[0m latest: Union[\u001b[38;5;28mdict\u001b[39m[\u001b[38;5;28mstr\u001b[39m, Any], Any] \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;01mNone\u001b[39;00m\n\u001b[0;32m--> 492\u001b[0m \u001b[43m \u001b[49m\u001b[38;5;28;43;01mfor\u001b[39;49;00m\u001b[43m \u001b[49m\u001b[43mchunk\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;129;43;01min\u001b[39;49;00m\u001b[43m \u001b[49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mstream\u001b[49m\u001b[43m(\u001b[49m\n\u001b[1;32m 493\u001b[0m \u001b[43m \u001b[49m\u001b[38;5;28;43minput\u001b[39;49m\u001b[43m,\u001b[49m\n\u001b[1;32m 494\u001b[0m \u001b[43m \u001b[49m\u001b[43mconfig\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 495\u001b[0m \u001b[43m \u001b[49m\u001b[43moutput_keys\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43moutput_keys\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;28;43;01mif\u001b[39;49;00m\u001b[43m \u001b[49m\u001b[43moutput_keys\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;129;43;01mis\u001b[39;49;00m\u001b[43m \u001b[49m\u001b[38;5;129;43;01mnot\u001b[39;49;00m\u001b[43m \u001b[49m\u001b[38;5;28;43;01mNone\u001b[39;49;00m\u001b[43m \u001b[49m\u001b[38;5;28;43;01melse\u001b[39;49;00m\u001b[43m \u001b[49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43moutput\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 496\u001b[0m \u001b[43m \u001b[49m\u001b[43minput_keys\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43minput_keys\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 497\u001b[0m \u001b[43m \u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43mkwargs\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 498\u001b[0m \u001b[43m \u001b[49m\u001b[43m)\u001b[49m\u001b[43m:\u001b[49m\n\u001b[1;32m 499\u001b[0m \u001b[43m \u001b[49m\u001b[43mlatest\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43m \u001b[49m\u001b[43mchunk\u001b[49m\n\u001b[1;32m 500\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m latest\n", + "File \u001b[0;32m~/code/lc/langgraph/langgraph/pregel/__init__.py:528\u001b[0m, in \u001b[0;36mPregel.transform\u001b[0;34m(self, input, config, output_keys, input_keys, **kwargs)\u001b[0m\n\u001b[1;32m 519\u001b[0m \u001b[38;5;28;01mdef\u001b[39;00m \u001b[38;5;21mtransform\u001b[39m(\n\u001b[1;32m 520\u001b[0m \u001b[38;5;28mself\u001b[39m,\n\u001b[1;32m 521\u001b[0m \u001b[38;5;28minput\u001b[39m: Iterator[Union[\u001b[38;5;28mdict\u001b[39m[\u001b[38;5;28mstr\u001b[39m, Any], Any]],\n\u001b[0;32m (...)\u001b[0m\n\u001b[1;32m 526\u001b[0m \u001b[38;5;241m*\u001b[39m\u001b[38;5;241m*\u001b[39mkwargs: Any,\n\u001b[1;32m 527\u001b[0m ) \u001b[38;5;241m-\u001b[39m\u001b[38;5;241m>\u001b[39m Iterator[Union[\u001b[38;5;28mdict\u001b[39m[\u001b[38;5;28mstr\u001b[39m, Any], Any]]:\n\u001b[0;32m--> 528\u001b[0m \u001b[43m \u001b[49m\u001b[38;5;28;43;01mfor\u001b[39;49;00m\u001b[43m \u001b[49m\u001b[43mchunk\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;129;43;01min\u001b[39;49;00m\u001b[43m \u001b[49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43m_transform_stream_with_config\u001b[49m\u001b[43m(\u001b[49m\n\u001b[1;32m 529\u001b[0m \u001b[43m \u001b[49m\u001b[38;5;28;43minput\u001b[39;49m\u001b[43m,\u001b[49m\n\u001b[1;32m 530\u001b[0m \u001b[43m \u001b[49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43m_transform\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 531\u001b[0m \u001b[43m \u001b[49m\u001b[43mconfig\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 532\u001b[0m \u001b[43m \u001b[49m\u001b[43moutput_keys\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43moutput_keys\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 533\u001b[0m \u001b[43m \u001b[49m\u001b[43minput_keys\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43minput_keys\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 534\u001b[0m \u001b[43m \u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43mkwargs\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 535\u001b[0m \u001b[43m \u001b[49m\u001b[43m)\u001b[49m\u001b[43m:\u001b[49m\n\u001b[1;32m 536\u001b[0m \u001b[43m \u001b[49m\u001b[38;5;28;43;01myield\u001b[39;49;00m\u001b[43m \u001b[49m\u001b[43mchunk\u001b[49m\n", + "File \u001b[0;32m~/.pyenv/versions/3.11.2/lib/python3.11/site-packages/langchain_core/runnables/base.py:1226\u001b[0m, in \u001b[0;36mRunnable._transform_stream_with_config\u001b[0;34m(self, input, transformer, config, run_type, **kwargs)\u001b[0m\n\u001b[1;32m 1224\u001b[0m \u001b[38;5;28;01mtry\u001b[39;00m:\n\u001b[1;32m 1225\u001b[0m \u001b[38;5;28;01mwhile\u001b[39;00m \u001b[38;5;28;01mTrue\u001b[39;00m:\n\u001b[0;32m-> 1226\u001b[0m chunk: Output \u001b[38;5;241m=\u001b[39m context\u001b[38;5;241m.\u001b[39mrun(\u001b[38;5;28mnext\u001b[39m, iterator) \u001b[38;5;66;03m# type: ignore\u001b[39;00m\n\u001b[1;32m 1227\u001b[0m \u001b[38;5;28;01myield\u001b[39;00m chunk\n\u001b[1;32m 1228\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m final_output_supported:\n", + "File \u001b[0;32m~/code/lc/langgraph/langgraph/pregel/__init__.py:313\u001b[0m, in \u001b[0;36mPregel._transform\u001b[0;34m(self, input, run_manager, config, input_keys, output_keys)\u001b[0m\n\u001b[1;32m 303\u001b[0m done, inflight \u001b[38;5;241m=\u001b[39m concurrent\u001b[38;5;241m.\u001b[39mfutures\u001b[38;5;241m.\u001b[39mwait(\n\u001b[1;32m 304\u001b[0m [\n\u001b[1;32m 305\u001b[0m executor\u001b[38;5;241m.\u001b[39msubmit(proc\u001b[38;5;241m.\u001b[39minvoke, \u001b[38;5;28minput\u001b[39m, config)\n\u001b[0;32m (...)\u001b[0m\n\u001b[1;32m 309\u001b[0m timeout\u001b[38;5;241m=\u001b[39m\u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mstep_timeout,\n\u001b[1;32m 310\u001b[0m )\n\u001b[1;32m 312\u001b[0m \u001b[38;5;66;03m# interrupt on failure or timeout\u001b[39;00m\n\u001b[0;32m--> 313\u001b[0m \u001b[43m_interrupt_or_proceed\u001b[49m\u001b[43m(\u001b[49m\u001b[43mdone\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43minflight\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mstep\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 315\u001b[0m \u001b[38;5;66;03m# apply writes to channels\u001b[39;00m\n\u001b[1;32m 316\u001b[0m _apply_writes(checkpoint, channels, pending_writes, config, step \u001b[38;5;241m+\u001b[39m \u001b[38;5;241m1\u001b[39m)\n", + "File \u001b[0;32m~/code/lc/langgraph/langgraph/pregel/__init__.py:611\u001b[0m, in \u001b[0;36m_interrupt_or_proceed\u001b[0;34m(done, inflight, step)\u001b[0m\n\u001b[1;32m 609\u001b[0m inflight\u001b[38;5;241m.\u001b[39mpop()\u001b[38;5;241m.\u001b[39mcancel()\n\u001b[1;32m 610\u001b[0m \u001b[38;5;66;03m# raise the exception\u001b[39;00m\n\u001b[0;32m--> 611\u001b[0m \u001b[38;5;28;01mraise\u001b[39;00m exc\n\u001b[1;32m 612\u001b[0m \u001b[38;5;66;03m# TODO this is where retry of an entire step would happen\u001b[39;00m\n\u001b[1;32m 614\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m inflight:\n\u001b[1;32m 615\u001b[0m \u001b[38;5;66;03m# if we got here means we timed out\u001b[39;00m\n", + "File \u001b[0;32m~/.pyenv/versions/3.11.2/lib/python3.11/concurrent/futures/thread.py:58\u001b[0m, in \u001b[0;36m_WorkItem.run\u001b[0;34m(self)\u001b[0m\n\u001b[1;32m 55\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m\n\u001b[1;32m 57\u001b[0m \u001b[38;5;28;01mtry\u001b[39;00m:\n\u001b[0;32m---> 58\u001b[0m result \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mfn\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43margs\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mkwargs\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 59\u001b[0m \u001b[38;5;28;01mexcept\u001b[39;00m \u001b[38;5;167;01mBaseException\u001b[39;00m \u001b[38;5;28;01mas\u001b[39;00m exc:\n\u001b[1;32m 60\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mfuture\u001b[38;5;241m.\u001b[39mset_exception(exc)\n", + "File \u001b[0;32m~/.pyenv/versions/3.11.2/lib/python3.11/site-packages/langchain_core/runnables/base.py:3596\u001b[0m, in \u001b[0;36mRunnableBindingBase.invoke\u001b[0;34m(self, input, config, **kwargs)\u001b[0m\n\u001b[1;32m 3590\u001b[0m \u001b[38;5;28;01mdef\u001b[39;00m \u001b[38;5;21minvoke\u001b[39m(\n\u001b[1;32m 3591\u001b[0m \u001b[38;5;28mself\u001b[39m,\n\u001b[1;32m 3592\u001b[0m \u001b[38;5;28minput\u001b[39m: Input,\n\u001b[1;32m 3593\u001b[0m config: Optional[RunnableConfig] \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;01mNone\u001b[39;00m,\n\u001b[1;32m 3594\u001b[0m \u001b[38;5;241m*\u001b[39m\u001b[38;5;241m*\u001b[39mkwargs: Optional[Any],\n\u001b[1;32m 3595\u001b[0m ) \u001b[38;5;241m-\u001b[39m\u001b[38;5;241m>\u001b[39m Output:\n\u001b[0;32m-> 3596\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mbound\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43minvoke\u001b[49m\u001b[43m(\u001b[49m\n\u001b[1;32m 3597\u001b[0m \u001b[43m \u001b[49m\u001b[38;5;28;43minput\u001b[39;49m\u001b[43m,\u001b[49m\n\u001b[1;32m 3598\u001b[0m \u001b[43m \u001b[49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43m_merge_configs\u001b[49m\u001b[43m(\u001b[49m\u001b[43mconfig\u001b[49m\u001b[43m)\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 3599\u001b[0m \u001b[43m \u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43m{\u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mkwargs\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43mkwargs\u001b[49m\u001b[43m}\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 3600\u001b[0m \u001b[43m \u001b[49m\u001b[43m)\u001b[49m\n", + "File \u001b[0;32m~/.pyenv/versions/3.11.2/lib/python3.11/site-packages/langchain_core/runnables/base.py:1774\u001b[0m, in \u001b[0;36mRunnableSequence.invoke\u001b[0;34m(self, input, config)\u001b[0m\n\u001b[1;32m 1772\u001b[0m \u001b[38;5;28;01mtry\u001b[39;00m:\n\u001b[1;32m 1773\u001b[0m \u001b[38;5;28;01mfor\u001b[39;00m i, step \u001b[38;5;129;01min\u001b[39;00m \u001b[38;5;28menumerate\u001b[39m(\u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39msteps):\n\u001b[0;32m-> 1774\u001b[0m \u001b[38;5;28minput\u001b[39m \u001b[38;5;241m=\u001b[39m \u001b[43mstep\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43minvoke\u001b[49m\u001b[43m(\u001b[49m\n\u001b[1;32m 1775\u001b[0m \u001b[43m \u001b[49m\u001b[38;5;28;43minput\u001b[39;49m\u001b[43m,\u001b[49m\n\u001b[1;32m 1776\u001b[0m \u001b[43m \u001b[49m\u001b[38;5;66;43;03m# mark each step as a child run\u001b[39;49;00m\n\u001b[1;32m 1777\u001b[0m \u001b[43m \u001b[49m\u001b[43mpatch_config\u001b[49m\u001b[43m(\u001b[49m\n\u001b[1;32m 1778\u001b[0m \u001b[43m \u001b[49m\u001b[43mconfig\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mcallbacks\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mrun_manager\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mget_child\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;124;43mf\u001b[39;49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[38;5;124;43mseq:step:\u001b[39;49m\u001b[38;5;132;43;01m{\u001b[39;49;00m\u001b[43mi\u001b[49m\u001b[38;5;241;43m+\u001b[39;49m\u001b[38;5;241;43m1\u001b[39;49m\u001b[38;5;132;43;01m}\u001b[39;49;00m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[43m)\u001b[49m\n\u001b[1;32m 1779\u001b[0m \u001b[43m \u001b[49m\u001b[43m)\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 1780\u001b[0m \u001b[43m \u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 1781\u001b[0m \u001b[38;5;66;03m# finish the root run\u001b[39;00m\n\u001b[1;32m 1782\u001b[0m \u001b[38;5;28;01mexcept\u001b[39;00m \u001b[38;5;167;01mBaseException\u001b[39;00m \u001b[38;5;28;01mas\u001b[39;00m e:\n", + "File \u001b[0;32m~/.pyenv/versions/3.11.2/lib/python3.11/site-packages/langchain_core/runnables/passthrough.py:415\u001b[0m, in \u001b[0;36mRunnableAssign.invoke\u001b[0;34m(self, input, config, **kwargs)\u001b[0m\n\u001b[1;32m 409\u001b[0m \u001b[38;5;28;01mdef\u001b[39;00m \u001b[38;5;21minvoke\u001b[39m(\n\u001b[1;32m 410\u001b[0m \u001b[38;5;28mself\u001b[39m,\n\u001b[1;32m 411\u001b[0m \u001b[38;5;28minput\u001b[39m: Dict[\u001b[38;5;28mstr\u001b[39m, Any],\n\u001b[1;32m 412\u001b[0m config: Optional[RunnableConfig] \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;01mNone\u001b[39;00m,\n\u001b[1;32m 413\u001b[0m \u001b[38;5;241m*\u001b[39m\u001b[38;5;241m*\u001b[39mkwargs: Any,\n\u001b[1;32m 414\u001b[0m ) \u001b[38;5;241m-\u001b[39m\u001b[38;5;241m>\u001b[39m Dict[\u001b[38;5;28mstr\u001b[39m, Any]:\n\u001b[0;32m--> 415\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43m_call_with_config\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43m_invoke\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;28;43minput\u001b[39;49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mconfig\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43mkwargs\u001b[49m\u001b[43m)\u001b[49m\n", + "File \u001b[0;32m~/.pyenv/versions/3.11.2/lib/python3.11/site-packages/langchain_core/runnables/base.py:975\u001b[0m, in \u001b[0;36mRunnable._call_with_config\u001b[0;34m(self, func, input, config, run_type, **kwargs)\u001b[0m\n\u001b[1;32m 971\u001b[0m context \u001b[38;5;241m=\u001b[39m copy_context()\n\u001b[1;32m 972\u001b[0m context\u001b[38;5;241m.\u001b[39mrun(var_child_runnable_config\u001b[38;5;241m.\u001b[39mset, child_config)\n\u001b[1;32m 973\u001b[0m output \u001b[38;5;241m=\u001b[39m cast(\n\u001b[1;32m 974\u001b[0m Output,\n\u001b[0;32m--> 975\u001b[0m \u001b[43mcontext\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mrun\u001b[49m\u001b[43m(\u001b[49m\n\u001b[1;32m 976\u001b[0m \u001b[43m \u001b[49m\u001b[43mcall_func_with_variable_args\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 977\u001b[0m \u001b[43m \u001b[49m\u001b[43mfunc\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;66;43;03m# type: ignore[arg-type]\u001b[39;49;00m\n\u001b[1;32m 978\u001b[0m \u001b[43m \u001b[49m\u001b[38;5;28;43minput\u001b[39;49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;66;43;03m# type: ignore[arg-type]\u001b[39;49;00m\n\u001b[1;32m 979\u001b[0m \u001b[43m \u001b[49m\u001b[43mconfig\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 980\u001b[0m \u001b[43m \u001b[49m\u001b[43mrun_manager\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 981\u001b[0m \u001b[43m \u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43mkwargs\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 982\u001b[0m \u001b[43m \u001b[49m\u001b[43m)\u001b[49m,\n\u001b[1;32m 983\u001b[0m )\n\u001b[1;32m 984\u001b[0m \u001b[38;5;28;01mexcept\u001b[39;00m \u001b[38;5;167;01mBaseException\u001b[39;00m \u001b[38;5;28;01mas\u001b[39;00m e:\n\u001b[1;32m 985\u001b[0m run_manager\u001b[38;5;241m.\u001b[39mon_chain_error(e)\n", + "File \u001b[0;32m~/.pyenv/versions/3.11.2/lib/python3.11/site-packages/langchain_core/runnables/config.py:323\u001b[0m, in \u001b[0;36mcall_func_with_variable_args\u001b[0;34m(func, input, config, run_manager, **kwargs)\u001b[0m\n\u001b[1;32m 321\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m run_manager \u001b[38;5;129;01mis\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m \u001b[38;5;28;01mNone\u001b[39;00m \u001b[38;5;129;01mand\u001b[39;00m accepts_run_manager(func):\n\u001b[1;32m 322\u001b[0m kwargs[\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mrun_manager\u001b[39m\u001b[38;5;124m\"\u001b[39m] \u001b[38;5;241m=\u001b[39m run_manager\n\u001b[0;32m--> 323\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[43mfunc\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;28;43minput\u001b[39;49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43mkwargs\u001b[49m\u001b[43m)\u001b[49m\n", + "File \u001b[0;32m~/.pyenv/versions/3.11.2/lib/python3.11/site-packages/langchain_core/runnables/passthrough.py:402\u001b[0m, in \u001b[0;36mRunnableAssign._invoke\u001b[0;34m(self, input, run_manager, config, **kwargs)\u001b[0m\n\u001b[1;32m 389\u001b[0m \u001b[38;5;28;01mdef\u001b[39;00m \u001b[38;5;21m_invoke\u001b[39m(\n\u001b[1;32m 390\u001b[0m \u001b[38;5;28mself\u001b[39m,\n\u001b[1;32m 391\u001b[0m \u001b[38;5;28minput\u001b[39m: Dict[\u001b[38;5;28mstr\u001b[39m, Any],\n\u001b[0;32m (...)\u001b[0m\n\u001b[1;32m 394\u001b[0m \u001b[38;5;241m*\u001b[39m\u001b[38;5;241m*\u001b[39mkwargs: Any,\n\u001b[1;32m 395\u001b[0m ) \u001b[38;5;241m-\u001b[39m\u001b[38;5;241m>\u001b[39m Dict[\u001b[38;5;28mstr\u001b[39m, Any]:\n\u001b[1;32m 396\u001b[0m \u001b[38;5;28;01massert\u001b[39;00m \u001b[38;5;28misinstance\u001b[39m(\n\u001b[1;32m 397\u001b[0m \u001b[38;5;28minput\u001b[39m, \u001b[38;5;28mdict\u001b[39m\n\u001b[1;32m 398\u001b[0m ), \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mThe input to RunnablePassthrough.assign() must be a dict.\u001b[39m\u001b[38;5;124m\"\u001b[39m\n\u001b[1;32m 400\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m {\n\u001b[1;32m 401\u001b[0m \u001b[38;5;241m*\u001b[39m\u001b[38;5;241m*\u001b[39m\u001b[38;5;28minput\u001b[39m,\n\u001b[0;32m--> 402\u001b[0m \u001b[38;5;241m*\u001b[39m\u001b[38;5;241m*\u001b[39m\u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mmapper\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43minvoke\u001b[49m\u001b[43m(\u001b[49m\n\u001b[1;32m 403\u001b[0m \u001b[43m \u001b[49m\u001b[38;5;28;43minput\u001b[39;49m\u001b[43m,\u001b[49m\n\u001b[1;32m 404\u001b[0m \u001b[43m \u001b[49m\u001b[43mpatch_config\u001b[49m\u001b[43m(\u001b[49m\u001b[43mconfig\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mcallbacks\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mrun_manager\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mget_child\u001b[49m\u001b[43m(\u001b[49m\u001b[43m)\u001b[49m\u001b[43m)\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 405\u001b[0m \u001b[43m \u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43mkwargs\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 406\u001b[0m \u001b[43m \u001b[49m\u001b[43m)\u001b[49m,\n\u001b[1;32m 407\u001b[0m }\n", + "File \u001b[0;32m~/.pyenv/versions/3.11.2/lib/python3.11/site-packages/langchain_core/runnables/base.py:2339\u001b[0m, in \u001b[0;36mRunnableParallel.invoke\u001b[0;34m(self, input, config)\u001b[0m\n\u001b[1;32m 2326\u001b[0m \u001b[38;5;28;01mwith\u001b[39;00m get_executor_for_config(config) \u001b[38;5;28;01mas\u001b[39;00m executor:\n\u001b[1;32m 2327\u001b[0m futures \u001b[38;5;241m=\u001b[39m [\n\u001b[1;32m 2328\u001b[0m executor\u001b[38;5;241m.\u001b[39msubmit(\n\u001b[1;32m 2329\u001b[0m step\u001b[38;5;241m.\u001b[39minvoke,\n\u001b[0;32m (...)\u001b[0m\n\u001b[1;32m 2337\u001b[0m \u001b[38;5;28;01mfor\u001b[39;00m key, step \u001b[38;5;129;01min\u001b[39;00m steps\u001b[38;5;241m.\u001b[39mitems()\n\u001b[1;32m 2338\u001b[0m ]\n\u001b[0;32m-> 2339\u001b[0m output \u001b[38;5;241m=\u001b[39m \u001b[43m{\u001b[49m\u001b[43mkey\u001b[49m\u001b[43m:\u001b[49m\u001b[43m \u001b[49m\u001b[43mfuture\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mresult\u001b[49m\u001b[43m(\u001b[49m\u001b[43m)\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;28;43;01mfor\u001b[39;49;00m\u001b[43m \u001b[49m\u001b[43mkey\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mfuture\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;129;43;01min\u001b[39;49;00m\u001b[43m \u001b[49m\u001b[38;5;28;43mzip\u001b[39;49m\u001b[43m(\u001b[49m\u001b[43msteps\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mfutures\u001b[49m\u001b[43m)\u001b[49m\u001b[43m}\u001b[49m\n\u001b[1;32m 2340\u001b[0m \u001b[38;5;66;03m# finish the root run\u001b[39;00m\n\u001b[1;32m 2341\u001b[0m \u001b[38;5;28;01mexcept\u001b[39;00m \u001b[38;5;167;01mBaseException\u001b[39;00m \u001b[38;5;28;01mas\u001b[39;00m e:\n", + "File \u001b[0;32m~/.pyenv/versions/3.11.2/lib/python3.11/site-packages/langchain_core/runnables/base.py:2339\u001b[0m, in \u001b[0;36m\u001b[0;34m(.0)\u001b[0m\n\u001b[1;32m 2326\u001b[0m \u001b[38;5;28;01mwith\u001b[39;00m get_executor_for_config(config) \u001b[38;5;28;01mas\u001b[39;00m executor:\n\u001b[1;32m 2327\u001b[0m futures \u001b[38;5;241m=\u001b[39m [\n\u001b[1;32m 2328\u001b[0m executor\u001b[38;5;241m.\u001b[39msubmit(\n\u001b[1;32m 2329\u001b[0m step\u001b[38;5;241m.\u001b[39minvoke,\n\u001b[0;32m (...)\u001b[0m\n\u001b[1;32m 2337\u001b[0m \u001b[38;5;28;01mfor\u001b[39;00m key, step \u001b[38;5;129;01min\u001b[39;00m steps\u001b[38;5;241m.\u001b[39mitems()\n\u001b[1;32m 2338\u001b[0m ]\n\u001b[0;32m-> 2339\u001b[0m output \u001b[38;5;241m=\u001b[39m {key: \u001b[43mfuture\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mresult\u001b[49m\u001b[43m(\u001b[49m\u001b[43m)\u001b[49m \u001b[38;5;28;01mfor\u001b[39;00m key, future \u001b[38;5;129;01min\u001b[39;00m \u001b[38;5;28mzip\u001b[39m(steps, futures)}\n\u001b[1;32m 2340\u001b[0m \u001b[38;5;66;03m# finish the root run\u001b[39;00m\n\u001b[1;32m 2341\u001b[0m \u001b[38;5;28;01mexcept\u001b[39;00m \u001b[38;5;167;01mBaseException\u001b[39;00m \u001b[38;5;28;01mas\u001b[39;00m e:\n", + "File \u001b[0;32m~/.pyenv/versions/3.11.2/lib/python3.11/concurrent/futures/_base.py:456\u001b[0m, in \u001b[0;36mFuture.result\u001b[0;34m(self, timeout)\u001b[0m\n\u001b[1;32m 454\u001b[0m \u001b[38;5;28;01mraise\u001b[39;00m CancelledError()\n\u001b[1;32m 455\u001b[0m \u001b[38;5;28;01melif\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_state \u001b[38;5;241m==\u001b[39m FINISHED:\n\u001b[0;32m--> 456\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43m__get_result\u001b[49m\u001b[43m(\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 457\u001b[0m \u001b[38;5;28;01melse\u001b[39;00m:\n\u001b[1;32m 458\u001b[0m \u001b[38;5;28;01mraise\u001b[39;00m \u001b[38;5;167;01mTimeoutError\u001b[39;00m()\n", + "File \u001b[0;32m~/.pyenv/versions/3.11.2/lib/python3.11/concurrent/futures/_base.py:401\u001b[0m, in \u001b[0;36mFuture.__get_result\u001b[0;34m(self)\u001b[0m\n\u001b[1;32m 399\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_exception:\n\u001b[1;32m 400\u001b[0m \u001b[38;5;28;01mtry\u001b[39;00m:\n\u001b[0;32m--> 401\u001b[0m \u001b[38;5;28;01mraise\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_exception\n\u001b[1;32m 402\u001b[0m \u001b[38;5;28;01mfinally\u001b[39;00m:\n\u001b[1;32m 403\u001b[0m \u001b[38;5;66;03m# Break a reference cycle with the exception in self._exception\u001b[39;00m\n\u001b[1;32m 404\u001b[0m \u001b[38;5;28mself\u001b[39m \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;01mNone\u001b[39;00m\n", + "File \u001b[0;32m~/.pyenv/versions/3.11.2/lib/python3.11/concurrent/futures/thread.py:58\u001b[0m, in \u001b[0;36m_WorkItem.run\u001b[0;34m(self)\u001b[0m\n\u001b[1;32m 55\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m\n\u001b[1;32m 57\u001b[0m \u001b[38;5;28;01mtry\u001b[39;00m:\n\u001b[0;32m---> 58\u001b[0m result \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mfn\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43margs\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mkwargs\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 59\u001b[0m \u001b[38;5;28;01mexcept\u001b[39;00m \u001b[38;5;167;01mBaseException\u001b[39;00m \u001b[38;5;28;01mas\u001b[39;00m exc:\n\u001b[1;32m 60\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mfuture\u001b[38;5;241m.\u001b[39mset_exception(exc)\n", + "File \u001b[0;32m~/.pyenv/versions/3.11.2/lib/python3.11/site-packages/langchain_core/runnables/base.py:1774\u001b[0m, in \u001b[0;36mRunnableSequence.invoke\u001b[0;34m(self, input, config)\u001b[0m\n\u001b[1;32m 1772\u001b[0m \u001b[38;5;28;01mtry\u001b[39;00m:\n\u001b[1;32m 1773\u001b[0m \u001b[38;5;28;01mfor\u001b[39;00m i, step \u001b[38;5;129;01min\u001b[39;00m \u001b[38;5;28menumerate\u001b[39m(\u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39msteps):\n\u001b[0;32m-> 1774\u001b[0m \u001b[38;5;28minput\u001b[39m \u001b[38;5;241m=\u001b[39m \u001b[43mstep\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43minvoke\u001b[49m\u001b[43m(\u001b[49m\n\u001b[1;32m 1775\u001b[0m \u001b[43m \u001b[49m\u001b[38;5;28;43minput\u001b[39;49m\u001b[43m,\u001b[49m\n\u001b[1;32m 1776\u001b[0m \u001b[43m \u001b[49m\u001b[38;5;66;43;03m# mark each step as a child run\u001b[39;49;00m\n\u001b[1;32m 1777\u001b[0m \u001b[43m \u001b[49m\u001b[43mpatch_config\u001b[49m\u001b[43m(\u001b[49m\n\u001b[1;32m 1778\u001b[0m \u001b[43m \u001b[49m\u001b[43mconfig\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mcallbacks\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mrun_manager\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mget_child\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;124;43mf\u001b[39;49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[38;5;124;43mseq:step:\u001b[39;49m\u001b[38;5;132;43;01m{\u001b[39;49;00m\u001b[43mi\u001b[49m\u001b[38;5;241;43m+\u001b[39;49m\u001b[38;5;241;43m1\u001b[39;49m\u001b[38;5;132;43;01m}\u001b[39;49;00m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[43m)\u001b[49m\n\u001b[1;32m 1779\u001b[0m \u001b[43m \u001b[49m\u001b[43m)\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 1780\u001b[0m \u001b[43m \u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 1781\u001b[0m \u001b[38;5;66;03m# finish the root run\u001b[39;00m\n\u001b[1;32m 1782\u001b[0m \u001b[38;5;28;01mexcept\u001b[39;00m \u001b[38;5;167;01mBaseException\u001b[39;00m \u001b[38;5;28;01mas\u001b[39;00m e:\n", + "File \u001b[0;32m~/.pyenv/versions/3.11.2/lib/python3.11/site-packages/langchain_core/output_parsers/base.py:167\u001b[0m, in \u001b[0;36mBaseOutputParser.invoke\u001b[0;34m(self, input, config)\u001b[0m\n\u001b[1;32m 163\u001b[0m \u001b[38;5;28;01mdef\u001b[39;00m \u001b[38;5;21minvoke\u001b[39m(\n\u001b[1;32m 164\u001b[0m \u001b[38;5;28mself\u001b[39m, \u001b[38;5;28minput\u001b[39m: Union[\u001b[38;5;28mstr\u001b[39m, BaseMessage], config: Optional[RunnableConfig] \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;01mNone\u001b[39;00m\n\u001b[1;32m 165\u001b[0m ) \u001b[38;5;241m-\u001b[39m\u001b[38;5;241m>\u001b[39m T:\n\u001b[1;32m 166\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;28misinstance\u001b[39m(\u001b[38;5;28minput\u001b[39m, BaseMessage):\n\u001b[0;32m--> 167\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43m_call_with_config\u001b[49m\u001b[43m(\u001b[49m\n\u001b[1;32m 168\u001b[0m \u001b[43m \u001b[49m\u001b[38;5;28;43;01mlambda\u001b[39;49;00m\u001b[43m \u001b[49m\u001b[43minner_input\u001b[49m\u001b[43m:\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mparse_result\u001b[49m\u001b[43m(\u001b[49m\n\u001b[1;32m 169\u001b[0m \u001b[43m \u001b[49m\u001b[43m[\u001b[49m\u001b[43mChatGeneration\u001b[49m\u001b[43m(\u001b[49m\u001b[43mmessage\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43minner_input\u001b[49m\u001b[43m)\u001b[49m\u001b[43m]\u001b[49m\n\u001b[1;32m 170\u001b[0m \u001b[43m \u001b[49m\u001b[43m)\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 171\u001b[0m \u001b[43m \u001b[49m\u001b[38;5;28;43minput\u001b[39;49m\u001b[43m,\u001b[49m\n\u001b[1;32m 172\u001b[0m \u001b[43m \u001b[49m\u001b[43mconfig\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 173\u001b[0m \u001b[43m \u001b[49m\u001b[43mrun_type\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[38;5;124;43mparser\u001b[39;49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[43m,\u001b[49m\n\u001b[1;32m 174\u001b[0m \u001b[43m \u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 175\u001b[0m \u001b[38;5;28;01melse\u001b[39;00m:\n\u001b[1;32m 176\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_call_with_config(\n\u001b[1;32m 177\u001b[0m \u001b[38;5;28;01mlambda\u001b[39;00m inner_input: \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mparse_result([Generation(text\u001b[38;5;241m=\u001b[39minner_input)]),\n\u001b[1;32m 178\u001b[0m \u001b[38;5;28minput\u001b[39m,\n\u001b[1;32m 179\u001b[0m config,\n\u001b[1;32m 180\u001b[0m run_type\u001b[38;5;241m=\u001b[39m\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mparser\u001b[39m\u001b[38;5;124m\"\u001b[39m,\n\u001b[1;32m 181\u001b[0m )\n", + "File \u001b[0;32m~/.pyenv/versions/3.11.2/lib/python3.11/site-packages/langchain_core/runnables/base.py:975\u001b[0m, in \u001b[0;36mRunnable._call_with_config\u001b[0;34m(self, func, input, config, run_type, **kwargs)\u001b[0m\n\u001b[1;32m 971\u001b[0m context \u001b[38;5;241m=\u001b[39m copy_context()\n\u001b[1;32m 972\u001b[0m context\u001b[38;5;241m.\u001b[39mrun(var_child_runnable_config\u001b[38;5;241m.\u001b[39mset, child_config)\n\u001b[1;32m 973\u001b[0m output \u001b[38;5;241m=\u001b[39m cast(\n\u001b[1;32m 974\u001b[0m Output,\n\u001b[0;32m--> 975\u001b[0m \u001b[43mcontext\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mrun\u001b[49m\u001b[43m(\u001b[49m\n\u001b[1;32m 976\u001b[0m \u001b[43m \u001b[49m\u001b[43mcall_func_with_variable_args\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 977\u001b[0m \u001b[43m \u001b[49m\u001b[43mfunc\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;66;43;03m# type: ignore[arg-type]\u001b[39;49;00m\n\u001b[1;32m 978\u001b[0m \u001b[43m \u001b[49m\u001b[38;5;28;43minput\u001b[39;49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;66;43;03m# type: ignore[arg-type]\u001b[39;49;00m\n\u001b[1;32m 979\u001b[0m \u001b[43m \u001b[49m\u001b[43mconfig\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 980\u001b[0m \u001b[43m \u001b[49m\u001b[43mrun_manager\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 981\u001b[0m \u001b[43m \u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43mkwargs\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 982\u001b[0m \u001b[43m \u001b[49m\u001b[43m)\u001b[49m,\n\u001b[1;32m 983\u001b[0m )\n\u001b[1;32m 984\u001b[0m \u001b[38;5;28;01mexcept\u001b[39;00m \u001b[38;5;167;01mBaseException\u001b[39;00m \u001b[38;5;28;01mas\u001b[39;00m e:\n\u001b[1;32m 985\u001b[0m run_manager\u001b[38;5;241m.\u001b[39mon_chain_error(e)\n", + "File \u001b[0;32m~/.pyenv/versions/3.11.2/lib/python3.11/site-packages/langchain_core/runnables/config.py:323\u001b[0m, in \u001b[0;36mcall_func_with_variable_args\u001b[0;34m(func, input, config, run_manager, **kwargs)\u001b[0m\n\u001b[1;32m 321\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m run_manager \u001b[38;5;129;01mis\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m \u001b[38;5;28;01mNone\u001b[39;00m \u001b[38;5;129;01mand\u001b[39;00m accepts_run_manager(func):\n\u001b[1;32m 322\u001b[0m kwargs[\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mrun_manager\u001b[39m\u001b[38;5;124m\"\u001b[39m] \u001b[38;5;241m=\u001b[39m run_manager\n\u001b[0;32m--> 323\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[43mfunc\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;28;43minput\u001b[39;49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43mkwargs\u001b[49m\u001b[43m)\u001b[49m\n", + "File \u001b[0;32m~/.pyenv/versions/3.11.2/lib/python3.11/site-packages/langchain_core/output_parsers/base.py:168\u001b[0m, in \u001b[0;36mBaseOutputParser.invoke..\u001b[0;34m(inner_input)\u001b[0m\n\u001b[1;32m 163\u001b[0m \u001b[38;5;28;01mdef\u001b[39;00m \u001b[38;5;21minvoke\u001b[39m(\n\u001b[1;32m 164\u001b[0m \u001b[38;5;28mself\u001b[39m, \u001b[38;5;28minput\u001b[39m: Union[\u001b[38;5;28mstr\u001b[39m, BaseMessage], config: Optional[RunnableConfig] \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;01mNone\u001b[39;00m\n\u001b[1;32m 165\u001b[0m ) \u001b[38;5;241m-\u001b[39m\u001b[38;5;241m>\u001b[39m T:\n\u001b[1;32m 166\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;28misinstance\u001b[39m(\u001b[38;5;28minput\u001b[39m, BaseMessage):\n\u001b[1;32m 167\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_call_with_config(\n\u001b[0;32m--> 168\u001b[0m \u001b[38;5;28;01mlambda\u001b[39;00m inner_input: \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mparse_result\u001b[49m\u001b[43m(\u001b[49m\n\u001b[1;32m 169\u001b[0m \u001b[43m \u001b[49m\u001b[43m[\u001b[49m\u001b[43mChatGeneration\u001b[49m\u001b[43m(\u001b[49m\u001b[43mmessage\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43minner_input\u001b[49m\u001b[43m)\u001b[49m\u001b[43m]\u001b[49m\n\u001b[1;32m 170\u001b[0m \u001b[43m \u001b[49m\u001b[43m)\u001b[49m,\n\u001b[1;32m 171\u001b[0m \u001b[38;5;28minput\u001b[39m,\n\u001b[1;32m 172\u001b[0m config,\n\u001b[1;32m 173\u001b[0m run_type\u001b[38;5;241m=\u001b[39m\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mparser\u001b[39m\u001b[38;5;124m\"\u001b[39m,\n\u001b[1;32m 174\u001b[0m )\n\u001b[1;32m 175\u001b[0m \u001b[38;5;28;01melse\u001b[39;00m:\n\u001b[1;32m 176\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_call_with_config(\n\u001b[1;32m 177\u001b[0m \u001b[38;5;28;01mlambda\u001b[39;00m inner_input: \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mparse_result([Generation(text\u001b[38;5;241m=\u001b[39minner_input)]),\n\u001b[1;32m 178\u001b[0m \u001b[38;5;28minput\u001b[39m,\n\u001b[1;32m 179\u001b[0m config,\n\u001b[1;32m 180\u001b[0m run_type\u001b[38;5;241m=\u001b[39m\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mparser\u001b[39m\u001b[38;5;124m\"\u001b[39m,\n\u001b[1;32m 181\u001b[0m )\n", + "File \u001b[0;32m~/.pyenv/versions/3.11.2/lib/python3.11/site-packages/langchain_core/output_parsers/base.py:219\u001b[0m, in \u001b[0;36mBaseOutputParser.parse_result\u001b[0;34m(self, result, partial)\u001b[0m\n\u001b[1;32m 206\u001b[0m \u001b[38;5;28;01mdef\u001b[39;00m \u001b[38;5;21mparse_result\u001b[39m(\u001b[38;5;28mself\u001b[39m, result: List[Generation], \u001b[38;5;241m*\u001b[39m, partial: \u001b[38;5;28mbool\u001b[39m \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;01mFalse\u001b[39;00m) \u001b[38;5;241m-\u001b[39m\u001b[38;5;241m>\u001b[39m T:\n\u001b[1;32m 207\u001b[0m \u001b[38;5;250m \u001b[39m\u001b[38;5;124;03m\"\"\"Parse a list of candidate model Generations into a specific format.\u001b[39;00m\n\u001b[1;32m 208\u001b[0m \n\u001b[1;32m 209\u001b[0m \u001b[38;5;124;03m The return value is parsed from only the first Generation in the result, which\u001b[39;00m\n\u001b[0;32m (...)\u001b[0m\n\u001b[1;32m 217\u001b[0m \u001b[38;5;124;03m Structured output.\u001b[39;00m\n\u001b[1;32m 218\u001b[0m \u001b[38;5;124;03m \"\"\"\u001b[39;00m\n\u001b[0;32m--> 219\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mparse\u001b[49m\u001b[43m(\u001b[49m\u001b[43mresult\u001b[49m\u001b[43m[\u001b[49m\u001b[38;5;241;43m0\u001b[39;49m\u001b[43m]\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mtext\u001b[49m\u001b[43m)\u001b[49m\n", + "Cell \u001b[0;32mIn[1], line 88\u001b[0m, in \u001b[0;36mLLMCompilerPlanParser.parse\u001b[0;34m(self, text)\u001b[0m\n\u001b[1;32m 86\u001b[0m parser \u001b[38;5;241m=\u001b[39m ActionParserFSM()\n\u001b[1;32m 87\u001b[0m graph_dict \u001b[38;5;241m=\u001b[39m {}\n\u001b[0;32m---> 88\u001b[0m \u001b[43m\u001b[49m\u001b[38;5;28;43;01mfor\u001b[39;49;00m\u001b[43m \u001b[49m\u001b[43mtask\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;129;43;01min\u001b[39;49;00m\u001b[43m \u001b[49m\u001b[43mparser\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mparse\u001b[49m\u001b[43m(\u001b[49m\u001b[43mtext\u001b[49m\u001b[43m)\u001b[49m\u001b[43m:\u001b[49m\n\u001b[1;32m 89\u001b[0m \u001b[43m \u001b[49m\u001b[43midx\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43m \u001b[49m\u001b[38;5;28;43mint\u001b[39;49m\u001b[43m(\u001b[49m\u001b[43mtask\u001b[49m\u001b[43m[\u001b[49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[38;5;124;43mtask_index\u001b[39;49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[43m]\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 91\u001b[0m \u001b[43m \u001b[49m\u001b[43mtask\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43m \u001b[49m\u001b[43minstantiate_task\u001b[49m\u001b[43m(\u001b[49m\n\u001b[1;32m 92\u001b[0m \u001b[43m \u001b[49m\u001b[43mtools\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mtools\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 93\u001b[0m \u001b[43m \u001b[49m\u001b[43midx\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43midx\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 94\u001b[0m \u001b[43m \u001b[49m\u001b[43mtool_name\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mtask\u001b[49m\u001b[43m[\u001b[49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[38;5;124;43mtool_name\u001b[39;49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[43m]\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 95\u001b[0m \u001b[43m \u001b[49m\u001b[43margs\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mtask\u001b[49m\u001b[43m[\u001b[49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[38;5;124;43margs\u001b[39;49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[43m]\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 96\u001b[0m \u001b[43m \u001b[49m\u001b[43m)\u001b[49m\n", + "Cell \u001b[0;32mIn[1], line 29\u001b[0m, in \u001b[0;36mActionParserFSM.parse\u001b[0;34m(self, text)\u001b[0m\n\u001b[1;32m 27\u001b[0m \u001b[38;5;28;01mdef\u001b[39;00m \u001b[38;5;21mparse\u001b[39m(\u001b[38;5;28mself\u001b[39m, text: \u001b[38;5;28mstr\u001b[39m):\n\u001b[1;32m 28\u001b[0m \u001b[38;5;28;01mfor\u001b[39;00m char \u001b[38;5;129;01min\u001b[39;00m text:\n\u001b[0;32m---> 29\u001b[0m action \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mprocess_char\u001b[49m\u001b[43m(\u001b[49m\u001b[43mchar\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 30\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m action:\n\u001b[1;32m 31\u001b[0m \u001b[38;5;28;01myield\u001b[39;00m action\n", + "Cell \u001b[0;32mIn[1], line 61\u001b[0m, in \u001b[0;36mActionParserFSM.process_char\u001b[0;34m(self, char)\u001b[0m\n\u001b[1;32m 59\u001b[0m \u001b[38;5;28;01melif\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mstate \u001b[38;5;241m==\u001b[39m \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mCOMMENT\u001b[39m\u001b[38;5;124m\"\u001b[39m:\n\u001b[1;32m 60\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m char \u001b[38;5;241m==\u001b[39m \u001b[38;5;124m\"\u001b[39m\u001b[38;5;130;01m\\n\u001b[39;00m\u001b[38;5;124m\"\u001b[39m:\n\u001b[0;32m---> 61\u001b[0m action \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43msave_action\u001b[49m\u001b[43m(\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 62\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mreset()\n\u001b[1;32m 63\u001b[0m \u001b[38;5;28;01melse\u001b[39;00m:\n", + "Cell \u001b[0;32mIn[1], line 69\u001b[0m, in \u001b[0;36mActionParserFSM.save_action\u001b[0;34m(self)\u001b[0m\n\u001b[1;32m 67\u001b[0m \u001b[38;5;28;01mdef\u001b[39;00m \u001b[38;5;21msave_action\u001b[39m(\u001b[38;5;28mself\u001b[39m):\n\u001b[1;32m 68\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mtask_index \u001b[38;5;129;01mand\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39maction:\n\u001b[0;32m---> 69\u001b[0m parsed_action \u001b[38;5;241m=\u001b[39m \u001b[43mjson\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mloads\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43maction\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mstrip\u001b[49m\u001b[43m(\u001b[49m\u001b[43m)\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 70\u001b[0m tool_name, args \u001b[38;5;241m=\u001b[39m \u001b[38;5;28mnext\u001b[39m(\u001b[38;5;28miter\u001b[39m(parsed_action\u001b[38;5;241m.\u001b[39mitems()))\n\u001b[1;32m 71\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m {\n\u001b[1;32m 72\u001b[0m \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mtask_index\u001b[39m\u001b[38;5;124m\"\u001b[39m: \u001b[38;5;28mint\u001b[39m(\u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mtask_index),\n\u001b[1;32m 73\u001b[0m \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mtool_name\u001b[39m\u001b[38;5;124m\"\u001b[39m: tool_name,\n\u001b[1;32m 74\u001b[0m \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124margs\u001b[39m\u001b[38;5;124m\"\u001b[39m: args,\n\u001b[1;32m 75\u001b[0m }\n", + "File \u001b[0;32m~/.pyenv/versions/3.11.2/lib/python3.11/json/__init__.py:346\u001b[0m, in \u001b[0;36mloads\u001b[0;34m(s, cls, object_hook, parse_float, parse_int, parse_constant, object_pairs_hook, **kw)\u001b[0m\n\u001b[1;32m 341\u001b[0m s \u001b[38;5;241m=\u001b[39m s\u001b[38;5;241m.\u001b[39mdecode(detect_encoding(s), \u001b[38;5;124m'\u001b[39m\u001b[38;5;124msurrogatepass\u001b[39m\u001b[38;5;124m'\u001b[39m)\n\u001b[1;32m 343\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m (\u001b[38;5;28mcls\u001b[39m \u001b[38;5;129;01mis\u001b[39;00m \u001b[38;5;28;01mNone\u001b[39;00m \u001b[38;5;129;01mand\u001b[39;00m object_hook \u001b[38;5;129;01mis\u001b[39;00m \u001b[38;5;28;01mNone\u001b[39;00m \u001b[38;5;129;01mand\u001b[39;00m\n\u001b[1;32m 344\u001b[0m parse_int \u001b[38;5;129;01mis\u001b[39;00m \u001b[38;5;28;01mNone\u001b[39;00m \u001b[38;5;129;01mand\u001b[39;00m parse_float \u001b[38;5;129;01mis\u001b[39;00m \u001b[38;5;28;01mNone\u001b[39;00m \u001b[38;5;129;01mand\u001b[39;00m\n\u001b[1;32m 345\u001b[0m parse_constant \u001b[38;5;129;01mis\u001b[39;00m \u001b[38;5;28;01mNone\u001b[39;00m \u001b[38;5;129;01mand\u001b[39;00m object_pairs_hook \u001b[38;5;129;01mis\u001b[39;00m \u001b[38;5;28;01mNone\u001b[39;00m \u001b[38;5;129;01mand\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m kw):\n\u001b[0;32m--> 346\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[43m_default_decoder\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mdecode\u001b[49m\u001b[43m(\u001b[49m\u001b[43ms\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 347\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;28mcls\u001b[39m \u001b[38;5;129;01mis\u001b[39;00m \u001b[38;5;28;01mNone\u001b[39;00m:\n\u001b[1;32m 348\u001b[0m \u001b[38;5;28mcls\u001b[39m \u001b[38;5;241m=\u001b[39m JSONDecoder\n", + "File \u001b[0;32m~/.pyenv/versions/3.11.2/lib/python3.11/json/decoder.py:337\u001b[0m, in \u001b[0;36mJSONDecoder.decode\u001b[0;34m(self, s, _w)\u001b[0m\n\u001b[1;32m 332\u001b[0m \u001b[38;5;28;01mdef\u001b[39;00m \u001b[38;5;21mdecode\u001b[39m(\u001b[38;5;28mself\u001b[39m, s, _w\u001b[38;5;241m=\u001b[39mWHITESPACE\u001b[38;5;241m.\u001b[39mmatch):\n\u001b[1;32m 333\u001b[0m \u001b[38;5;250m \u001b[39m\u001b[38;5;124;03m\"\"\"Return the Python representation of ``s`` (a ``str`` instance\u001b[39;00m\n\u001b[1;32m 334\u001b[0m \u001b[38;5;124;03m containing a JSON document).\u001b[39;00m\n\u001b[1;32m 335\u001b[0m \n\u001b[1;32m 336\u001b[0m \u001b[38;5;124;03m \"\"\"\u001b[39;00m\n\u001b[0;32m--> 337\u001b[0m obj, end \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mraw_decode\u001b[49m\u001b[43m(\u001b[49m\u001b[43ms\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43midx\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43m_w\u001b[49m\u001b[43m(\u001b[49m\u001b[43ms\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;241;43m0\u001b[39;49m\u001b[43m)\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mend\u001b[49m\u001b[43m(\u001b[49m\u001b[43m)\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 338\u001b[0m end \u001b[38;5;241m=\u001b[39m _w(s, end)\u001b[38;5;241m.\u001b[39mend()\n\u001b[1;32m 339\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m end \u001b[38;5;241m!=\u001b[39m \u001b[38;5;28mlen\u001b[39m(s):\n", + "File \u001b[0;32m~/.pyenv/versions/3.11.2/lib/python3.11/json/decoder.py:355\u001b[0m, in \u001b[0;36mJSONDecoder.raw_decode\u001b[0;34m(self, s, idx)\u001b[0m\n\u001b[1;32m 353\u001b[0m obj, end \u001b[38;5;241m=\u001b[39m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mscan_once(s, idx)\n\u001b[1;32m 354\u001b[0m \u001b[38;5;28;01mexcept\u001b[39;00m \u001b[38;5;167;01mStopIteration\u001b[39;00m \u001b[38;5;28;01mas\u001b[39;00m err:\n\u001b[0;32m--> 355\u001b[0m \u001b[38;5;28;01mraise\u001b[39;00m JSONDecodeError(\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mExpecting value\u001b[39m\u001b[38;5;124m\"\u001b[39m, s, err\u001b[38;5;241m.\u001b[39mvalue) \u001b[38;5;28;01mfrom\u001b[39;00m \u001b[38;5;28;01mNone\u001b[39;00m\n\u001b[1;32m 356\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m obj, end\n", + "\u001b[0;31mJSONDecodeError\u001b[0m: Expecting value: line 1 column 1 (char 0)" + ] + } + ], + "source": [ + "result = chain.invoke(\n", + " {\"input\": \"How much larger is the GDP of the UK than that of New York?\"}\n", + ")" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "a157cd88-2e54-4525-8126-6d22affa31d7", + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.11.2" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} From 6174fd78134795a7c707d2a9172a51a5d0ef780a Mon Sep 17 00:00:00 2001 From: William Fu-Hinthorn <13333726+hinthornw@users.noreply.github.com> Date: Tue, 16 Jan 2024 17:08:33 -0800 Subject: [PATCH 04/18] update --- examples/advanced_agents/LLMCompiler.ipynb | 1090 ----------------- .../llm_compiler/LLMCompiler.ipynb | 1036 ++++++++++++++++ .../llm_compiler/output_parser.py | 154 +++ 3 files changed, 1190 insertions(+), 1090 deletions(-) delete mode 100644 examples/advanced_agents/LLMCompiler.ipynb create mode 100644 examples/advanced_agents/llm_compiler/LLMCompiler.ipynb create mode 100644 examples/advanced_agents/llm_compiler/output_parser.py diff --git a/examples/advanced_agents/LLMCompiler.ipynb b/examples/advanced_agents/LLMCompiler.ipynb deleted file mode 100644 index 35acbe368..000000000 --- a/examples/advanced_agents/LLMCompiler.ipynb +++ /dev/null @@ -1,1090 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "id": "0c8b472b-f3fb-46c2-841f-930a4692697b", - "metadata": {}, - "source": [ - "# Implementing LLMCompiler using LangGraph\n", - "By Kim, et. al [đŸ”—](https://arxiv.org/abs/2312.04511)\n", - "\n", - "LLMCompiler is an agent architecture intented on speeding up the latency of agentic tasks via fast, parallel tool execution. It has 3 main components:\n", - "\n", - "1. Planner: generate a DAG of tasks.\n", - "2. Task Fetching Unit: schedules and executes the tasks\n", - "3. Joiner: Responds to the user or triggers a second plan\n", - "\n", - "\n", - "This notebook walks through each component and shows how to wire them together using LangGraph." - ] - }, - { - "cell_type": "markdown", - "id": "1abdedbd-d81b-4ee9-b46f-f29439ed1350", - "metadata": {}, - "source": [ - "# Part 1: Planner\n", - "\n", - "\n", - "Largely adapted from [the original source code](https://github.com/SqueezeAILab/LLMCompiler/blob/main/src/llm_compiler/output_parser.py)." - ] - }, - { - "cell_type": "markdown", - "id": "278f76b0-a2e1-42dc-bd3e-6f624984e3dd", - "metadata": {}, - "source": [ - "#### Output Parser\n", - "\n", - "Parses task lists in the following form:\n", - "\n", - "```plaintext\n", - "1. tool_1(\"arg1\", 3.5, ...)\n", - "Thought: I then want to find out Y by using tool_2\n", - "2. tool_2(\"\", ${1})'\n", - "3. join()\"\n", - "```\n", - "\n", - "The \"Thought\" lines are optional. The `${#}` placeholders are variables. These are used to route tool (task) outputs to other tools." - ] - }, - { - "cell_type": "code", - "execution_count": 1, - "id": "cc71b6c4-d701-4217-9701-95ac0857e4e1", - "metadata": {}, - "outputs": [], - "source": [ - "import json\n", - "import re\n", - "from typing import Any, Dict, List, Optional, Sequence, Union\n", - "\n", - "from langchain.agents.agent import AgentOutputParser\n", - "from langchain.schema import OutputParserException\n", - "from langchain_core.tools import BaseTool\n", - "\n", - "THOUGHT_PATTERN = r\"Thought: ([^\\n]*)\"\n", - "# $1 or ${1} -> 1\n", - "ID_PATTERN = r\"\\$\\{?(\\d+)\\}?\"\n", - "END_OF_PLAN = \"\"\n", - "\n", - "\n", - "class ActionParserFSM:\n", - " def __init__(self):\n", - " self.reset()\n", - "\n", - " def reset(self):\n", - " self.state = \"START\"\n", - " self.task_index = \"\"\n", - " self.action = \"\"\n", - " self.comment = \"\"\n", - " self.bracket_count = 0\n", - " self.actions = []\n", - "\n", - " def parse(self, text: str):\n", - " for char in text:\n", - " action = self.process_char(char)\n", - " if action:\n", - " yield action\n", - " action = self.save_action()\n", - " if action:\n", - " yield action\n", - "\n", - " def process_char(self, char: str) -> Optional[dict]:\n", - " action = None\n", - " if self.state == \"START\":\n", - " if char.isdigit():\n", - " self.state = \"NUMBER\"\n", - " self.task_index += char\n", - " elif char == \"\\n\":\n", - " self.reset()\n", - " elif self.state == \"NUMBER\":\n", - " if char == \".\":\n", - " self.state = \"ACTION\"\n", - " elif char.isdigit():\n", - " self.task_index += char\n", - " else:\n", - " self.reset()\n", - " elif self.state == \"ACTION\":\n", - " if char == \"{\":\n", - " self.bracket_count += 1\n", - " elif char == \"}\":\n", - " self.bracket_count -= 1\n", - " if self.bracket_count == 0:\n", - " self.state = \"COMMENT\"\n", - " self.action += char\n", - " elif self.state == \"COMMENT\":\n", - " if char == \"\\n\":\n", - " action = self.save_action()\n", - " self.reset()\n", - " else:\n", - " self.comment += char\n", - " return action\n", - "\n", - " def save_action(self):\n", - " if self.task_index and self.action:\n", - " parsed_action = json.loads(self.action.strip())\n", - " tool_name, args = next(iter(parsed_action.items()))\n", - " return {\n", - " \"task_index\": int(self.task_index),\n", - " \"tool_name\": tool_name,\n", - " \"args\": args,\n", - " }\n", - "\n", - "\n", - "class LLMCompilerPlanParser(AgentOutputParser, extra=\"allow\"):\n", - " \"\"\"Planning output parser.\"\"\"\n", - "\n", - " def __init__(self, tools: Sequence[BaseTool], **kwargs):\n", - " super().__init__(**kwargs)\n", - " self.tools = tools\n", - "\n", - " def parse(self, text: str) -> list[str]:\n", - " parser = ActionParserFSM()\n", - " graph_dict = {}\n", - " for task in parser.parse(text):\n", - " idx = int(task[\"task_index\"])\n", - "\n", - " task = instantiate_task(\n", - " tools=self.tools,\n", - " idx=idx,\n", - " tool_name=task[\"tool_name\"],\n", - " args=task[\"args\"],\n", - " )\n", - "\n", - " graph_dict[idx] = task\n", - " if task[\"tool\"] == \"join\":\n", - " break\n", - "\n", - " return graph_dict\n", - "\n", - "\n", - "### Helper functions\n", - "\n", - "\n", - "def default_dependency_rule(idx, args: str):\n", - " matches = re.findall(ID_PATTERN, args)\n", - " numbers = [int(match) for match in matches]\n", - " return idx in numbers\n", - "\n", - "\n", - "def _get_dependencies_from_graph(\n", - " idx: int, tool_name: str, args: Sequence[Any]\n", - ") -> dict[str, list[str]]:\n", - " \"\"\"Get dependencies from a graph.\"\"\"\n", - " if tool_name == \"join\":\n", - " return list(range(1, idx))\n", - " return [i for i in range(1, idx) if default_dependency_rule(i, str(args))]\n", - "\n", - "\n", - "def instantiate_task(\n", - " tools: Sequence[BaseTool],\n", - " idx: int,\n", - " tool_name: str,\n", - " args: Union[dict, str, bool, None],\n", - ") -> dict:\n", - " dependencies = _get_dependencies_from_graph(idx, tool_name, args)\n", - " if tool_name == \"join\":\n", - " tool = \"join\"\n", - " else:\n", - " try:\n", - " tool = tools[[tool.name for tool in tools].index(tool_name)]\n", - " except ValueError as e:\n", - " raise OutputParserException(f\"Tool {tool_name} not found.\")\n", - " return dict(\n", - " tool=tool,\n", - " args=args,\n", - " dependencies=dependencies,\n", - " )" - ] - }, - { - "cell_type": "markdown", - "id": "228a2f75-68b1-4dbf-95dc-4bfc738c3b3b", - "metadata": {}, - "source": [ - "#### Planner Code\n", - "\n", - "This takes the input and outputs a plan." - ] - }, - { - "cell_type": "code", - "execution_count": 141, - "id": "58af9746-1011-41e9-a77a-be9cef202aea", - "metadata": {}, - "outputs": [], - "source": [ - "from langchain.chat_models.base import BaseChatModel\n", - "from langchain_core.prompts import ChatPromptTemplate\n", - "from langchain_core.runnables import RunnableBranch\n", - "from langchain_core.tools import BaseTool\n", - "\n", - "END_OF_PLAN = \"\"\n", - "\n", - "JOINER_FINISH = \"Finish\"\n", - "JOINER_REPLAN = \"Replan\"\n", - "\n", - "\n", - "JOIN_DESCRIPTION = (\n", - " \"join():\\n\"\n", - " \" - Collects and combines results from prior actions.\\n\"\n", - " \" - A LLM agent is called upon invoking join to either finalize the user query or wait until the plans are executed.\\n\"\n", - " \" - join should always be the last action in the plan, and will be called in two scenarios:\\n\"\n", - " \" (a) if the answer can be determined by gathering the outputs from tasks to generate the final response.\\n\"\n", - " \" (b) if the answer cannot be determined in the planning phase before you execute the plans. \"\n", - ")\n", - "\n", - "planner_prompt_tmpl_str = (\n", - " \"Given a user query, create a plan to solve it with the utmost parallelizability. \"\n", - " \"Each plan should comprise an action from the following {num_tools} types:\\n\"\n", - " \"{tool_descriptions}\"\n", - " f\"\\n{{num_toolsp1}}. {JOIN_DESCRIPTION}\"\n", - " \"Guidelines:\\n\"\n", - " \" - Each action described above contains input/output types and description.\\n\"\n", - " \" - You must strictly adhere to the input and output types for each action.\\n\"\n", - " \" - The action descriptions contain the guidelines. You MUST strictly follow those guidelines when you use the actions.\\n\"\n", - " \" - Each action in the plan should strictly be one of the above types.\\n\"\n", - " \" - Provide actions ONLY in json form, with the single key being the action name and the value being its arguments. Do not write python code. \\n\"\n", - " \" - Each action line must start with a unique ID, which is strictly increasing.\\n\"\n", - " \" - Inputs for actions can either be constants or outputs from preceding actions. \"\n", - " \"In the latter case, use the format $id to denote the ID of the previous action whose output will be the input.\\n\"\n", - " f\" - Always call join as the last action in the plan. Say '{END_OF_PLAN}' after you call join\\n\"\n", - " \" - Ensure the plan maximizes parallelizability.\\n\"\n", - " \" - Only use the provided action types. If a query cannot be addressed using these, invoke the join action for the next steps.\\n\"\n", - " \" - Never introduce new actions other than the ones provided.\\n\\n\"\n", - " \"{replan}\"\n", - " \"{examples}\"\n", - ")\n", - "\n", - "\n", - "def _generate_planner_prompt(\n", - " tools: Sequence[BaseTool],\n", - " example_prompt=str,\n", - "):\n", - " tool_descriptions = \"\\n\".join(\n", - " f\"{i+1}. {tool.name}: {tool.description}\\n\\tInput schema: {tool.args}\"\n", - " for i, tool in enumerate(tools)\n", - " )\n", - " planner_prompt_template = ChatPromptTemplate.from_messages(\n", - " [(\"system\", planner_prompt_tmpl_str), (\"user\", \"Question: {input}{context}\")]\n", - " ).partial(\n", - " tool_descriptions=tool_descriptions,\n", - " examples=\"Here are some examples:\\n\\n\" + example_prompt\n", - " if example_prompt\n", - " else \"\",\n", - " num_tools=len(tools),\n", - " num_toolsp1=len(tools) + 1,\n", - " )\n", - "\n", - " return planner_prompt_template\n", - "\n", - "\n", - "def create_planner(\n", - " llm: BaseChatModel,\n", - " example_prompt: str,\n", - " tools: Sequence[BaseTool],\n", - " stop: Optional[list[str]] = None,\n", - "):\n", - " og_planner_prompt = _generate_planner_prompt(tools, example_prompt).partial(\n", - " replan=\"\",\n", - " context=\"\",\n", - " )\n", - " replanner_prompt = _generate_planner_prompt(tools, example_prompt).partial(\n", - " replan=' - You are given \"Previous Plan\" which is the plan that the previous agent created along with the execution results '\n", - " \"(given as Observation) of each plan and a general thought (given as Thought) about the executed results.\"\n", - " 'You MUST use these information to create the next plan under \"Current Plan\".\\n'\n", - " ' - When starting the Current Plan, you should start with \"Thought\" that outlines the strategy for the next plan.\\n'\n", - " \" - In the Current Plan, you should NEVER repeat the actions that are already executed in the Previous Plan.\\n\"\n", - " \" - You must continue the task index from the end of the previous one. Do not repeat task indices.\"\n", - " )\n", - " bound_llm = llm.bind(stop=stop)\n", - " return (\n", - " RunnableBranch(\n", - " ((lambda x: x.get(\"context\") is not None), replanner_prompt),\n", - " og_planner_prompt,\n", - " )\n", - " | bound_llm\n", - " | LLMCompilerPlanParser(tools=tools)\n", - " )" - ] - }, - { - "cell_type": "markdown", - "id": "7feb5c82-b1a9-40ae-863a-0362fe3ce5ea", - "metadata": {}, - "source": [ - "#### Example usage\n", - "\n", - "Here's an example usage of the planner module" - ] - }, - { - "cell_type": "code", - "execution_count": 131, - "id": "3fe074ea-7314-47a7-9a9f-a8e6191ea1f3", - "metadata": {}, - "outputs": [], - "source": [ - "from langchain.tools import tool\n", - "from langchain_openai import ChatOpenAI\n", - "\n", - "\n", - "@tool\n", - "def get_user_id(first_name: str, last_name: Optional[str] = None):\n", - " \"\"\"Query the user IDs of everyone with the provided name.\"\"\"\n", - " return 4\n", - "\n", - "\n", - "@tool\n", - "def get_scores(class_name: str, user_id: int):\n", - " \"\"\"Query the class registry for grades of the provided user ID.\"\"\"\n", - " return \"A+\"\n", - "\n", - "\n", - "examples = (\n", - " \"Question: What's the user ID for Johnny Drop Tables?\\n\"\n", - " '1. {\"get_user_id\": {\"first_name\": \"Johnny\", \"last_name\":\"Drop Tables\"}}\\n'\n", - " f'2. {{\"join\": null}}{END_OF_PLAN}\\n'\n", - " \"###\\n\"\n", - " \"\\n\"\n", - " \"Question: What was Eric Zhang's score in Calc?\\n\"\n", - " '1. {\"get_user_id\": {\"first_name\": \"Eric\", \"last_name\":\"Zhang\"}}\\n'\n", - " '2. {\"get_scores\": {\"class_name\": \"calc\", \"user_id\": \"$1\"}}\\n'\n", - " f'3. {{\"join\": null}}{END_OF_PLAN}\\n'\n", - " \"###\\n\"\n", - " \"\\n\"\n", - ")\n", - "\n", - "planner = create_planner(\n", - " ChatOpenAI(model=\"gpt-3.5-turbo\"),\n", - " example_prompt=examples,\n", - " tools=[get_user_id, get_scores],\n", - ")" - ] - }, - { - "cell_type": "code", - "execution_count": 132, - "id": "55fb0f99-4e59-4e5a-b687-a90bb4d06d39", - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "{1: {'tool': StructuredTool(name='get_user_id', description='get_user_id(first_name: str, last_name: Optional[str] = None) - Query the user IDs of everyone with the provided name.', args_schema=, func=),\n", - " 'args': {'first_name': 'Sam', 'last_name': 'Van Damm'},\n", - " 'dependencies': []},\n", - " 2: {'tool': StructuredTool(name='get_user_id', description='get_user_id(first_name: str, last_name: Optional[str] = None) - Query the user IDs of everyone with the provided name.', args_schema=, func=),\n", - " 'args': {'first_name': 'Will', 'last_name': 'Van Damm'},\n", - " 'dependencies': []},\n", - " 3: {'tool': StructuredTool(name='get_scores', description='get_scores(class_name: str, user_id: int) - Query the class registry for grades of the provided user ID.', args_schema=, func=),\n", - " 'args': {'class_name': 'Calc BC', 'user_id': '$1'},\n", - " 'dependencies': [1]},\n", - " 4: {'tool': StructuredTool(name='get_scores', description='get_scores(class_name: str, user_id: int) - Query the class registry for grades of the provided user ID.', args_schema=, func=),\n", - " 'args': {'class_name': 'Calc BC', 'user_id': '$2'},\n", - " 'dependencies': [2]},\n", - " 5: {'tool': 'join', 'args': None, 'dependencies': [1, 2, 3, 4]}}" - ] - }, - "execution_count": 132, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "tasks = planner.invoke(\n", - " {\"input\": \"What are the Calc BC grades for Sam and Will Van Damm?\"}\n", - ")\n", - "tasks" - ] - }, - { - "cell_type": "markdown", - "id": "5d0e795f-61ff-4553-9823-23e7624ca180", - "metadata": {}, - "source": [ - "## 2. Task Fetching Unit\n", - "\n", - "This component schedules the tasks. In the paper, it's kept separate from the \"executor\", but here we create a single DAG to be executed by LangGraph.\n", - "\n", - "Basic idea is that, given a list of dicts of the form:\n", - "\n", - "```typescript\n", - "{\n", - " tool: BaseTool,\n", - " dependencies: number[],\n", - "}\n", - "```\n", - "\n", - "1. Create a topological sort of the tasks\n", - "2. Execute them on the previous step's output, ensuring to perform variable substitution where appropriate" - ] - }, - { - "cell_type": "code", - "execution_count": 184, - "id": "c70a0e28-43db-4ea2-af48-8a2f310dce83", - "metadata": {}, - "outputs": [], - "source": [ - "import functools\n", - "\n", - "from langchain_core.runnables import (\n", - " RunnableLambda,\n", - " RunnableParallel,\n", - " RunnablePassthrough,\n", - ")\n", - "\n", - "\n", - "def _sort_tasks(data):\n", - " if not data:\n", - " return []\n", - " sorted_tasks = []\n", - " # Remove tasks already completed\n", - " min_idx = min([int(k) for k in data])\n", - " data = {\n", - " int(k): {\n", - " **v,\n", - " \"dependencies\": [dep for dep in v[\"dependencies\"] if dep >= min_idx],\n", - " }\n", - " for k, v in data.items()\n", - " }\n", - " while data:\n", - " no_deps = {k: v for k, v in data.items() if not v[\"dependencies\"]}\n", - " if not no_deps:\n", - " raise ValueError(\"We seem to have run into a circular dependency.\")\n", - "\n", - " sorted_tasks.append(no_deps)\n", - " data = {\n", - " k: {\n", - " **v,\n", - " \"dependencies\": [d for d in v[\"dependencies\"] if d not in no_deps],\n", - " }\n", - " for k, v in data.items()\n", - " if k not in no_deps\n", - " }\n", - " return sorted_tasks\n", - "\n", - "\n", - "def _resolve_arg(x: dict, arg: Union[str, Any]):\n", - " if isinstance(arg, str) and arg.startswith(\"$\"):\n", - " try:\n", - " return x[f\"task_{arg[1:]}\"]\n", - " except:\n", - " if arg.endswith(\".output\"):\n", - " return x[f\"task_{arg[1:-7]}\"]\n", - " raise\n", - "\n", - " else:\n", - " return arg\n", - "\n", - "\n", - "def _execute_task(x, task):\n", - " tool_to_use = task[\"tool\"]\n", - " args = task[\"args\"]\n", - " if isinstance(args, str):\n", - " resolved_args = _resolve_arg(x, args)\n", - " elif isinstance(args, dict):\n", - " resolved_args = {key: _resolve_arg(x, val) for key, val in args.items()}\n", - " else:\n", - " # This will likely fail\n", - " resolved_args = args\n", - " try:\n", - " return tool_to_use.invoke(resolved_args)\n", - " except Exception as e:\n", - " return (\n", - " f\"ERROR(Failed to call tool {tool_to_use} with args {tool_to_use}.\"\n", - " + f\" Args resolved to {resolved_args}. Error: {repr(e)})\"\n", - " )\n", - "\n", - "\n", - "def construct_dag(tasks):\n", - " sorted_tasks = _sort_tasks(tasks)\n", - " chain = None\n", - " for idx, task_group in enumerate(sorted_tasks):\n", - " if len(task_group) == 1 and next(iter(task_group.values()))[\"tool\"] == \"join\":\n", - " # TODO: actually join the values\n", - " step = lambda x: {\"join\": x}\n", - " else:\n", - " # Cascade all results forward\n", - " constructor = (\n", - " RunnableParallel if chain is None else RunnablePassthrough.assign\n", - " )\n", - " task_dict = {}\n", - " for idx, task in task_group.items():\n", - " task_dict[f\"task_{idx}\"] = RunnableLambda(\n", - " functools.partial(_execute_task, task=task)\n", - " ).with_config(run_name=f\"task_{idx}\")\n", - "\n", - " step = constructor(**task_dict).with_config(run_name=f\"TaskGroup{idx}\")\n", - " if chain is None:\n", - " chain = step\n", - " else:\n", - " chain |= step\n", - "\n", - " if chain is not None:\n", - " return chain | RunnablePassthrough.assign(tasks=lambda _: tasks)\n", - " return chain" - ] - }, - { - "cell_type": "code", - "execution_count": 185, - "id": "87f11cea-3a8d-479c-8a9e-81223dbbc1f5", - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - " +------------------------------+ \n", - " | ParallelInput | \n", - " +------------------------------+ \n", - " *** *** \n", - " ** ** \n", - " ** ** \n", - " +-------------+ +-------------+ \n", - " | Lambda(...) | | Lambda(...) | \n", - " +-------------+ +-------------+ \n", - " *** *** \n", - " ** ** \n", - " ** ** \n", - " +-------------------------------+ \n", - " | ParallelOutput | \n", - " +-------------------------------+ \n", - " * \n", - " * \n", - " * \n", - " +------------------------------+ \n", - " | ParallelInput | \n", - " +------------------------------+ \n", - " ***** * ***** \n", - " ***** * ***** \n", - " *** * *** \n", - "+-------------+ +-------------+ +-------------+ \n", - "| Lambda(...) | | Lambda(...) | | Passthrough | \n", - "+-------------+***** +-------------+ *****+-------------+ \n", - " ***** * ***** \n", - " ***** * ***** \n", - " *** * *** \n", - " +-------------------------------+ \n", - " | ParallelOutput | \n", - " +-------------------------------+ \n", - " * \n", - " * \n", - " * \n", - " +-------------------------------+ \n", - " | Lambda(lambda x: {'join': x}) | \n", - " +-------------------------------+ \n", - " * \n", - " * \n", - " * \n", - " +----------------------+ \n", - " | ParallelInput | \n", - " +----------------------+ \n", - " *** *** \n", - " *** *** \n", - " ** ** \n", - " +-------------------------+ +-------------+ \n", - " | Lambda(lambda _: tasks) | | Passthrough | \n", - " +-------------------------+ +-------------+ \n", - " *** *** \n", - " *** *** \n", - " ** ** \n", - " +-----------------------+ \n", - " | ParallelOutput | \n", - " +-----------------------+ \n" - ] - } - ], - "source": [ - "graph = construct_dag(tasks)\n", - "graph.get_graph().print_ascii()" - ] - }, - { - "cell_type": "markdown", - "id": "9efa15ae-817a-48c6-86ed-16bc112fedc5", - "metadata": {}, - "source": [ - "#### Example Plan\n", - "\n", - "We still haven't introduced any cycles in our computation graph, so this is all easily expressed in LCEL." - ] - }, - { - "cell_type": "code", - "execution_count": 135, - "id": "133d124a-0d41-4c6d-a86a-34fa4cb1430f", - "metadata": {}, - "outputs": [], - "source": [ - "chain = planner | construct_dag" - ] - }, - { - "cell_type": "code", - "execution_count": 136, - "id": "55142257-2674-4a47-988e-0d2810917329", - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "{'task_1': 4, 'task_2': 4, 'task_3': 'A+', 'task_4': 'A+'}" - ] - }, - "execution_count": 136, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "example_question = \"Did Aliya get a better score than Roger in Geology?\"\n", - "task_results = chain.invoke({\"input\": example_question})\n", - "task_results[\"join\"]" - ] - }, - { - "cell_type": "markdown", - "id": "563d5311-55f0-4ca1-afbd-01fd970cf3e3", - "metadata": {}, - "source": [ - "## Agent Logic\n", - "\n", - "So now we have the planning and initial execution done. We need a component to process these outputs and either:\n", - "1. Respond with the correct answer.\n", - "2. Loop with a new plan.\n", - "\n", - "The paper calls this the \"joiner\"." - ] - }, - { - "cell_type": "code", - "execution_count": 216, - "id": "2978991e-45a4-44e6-9deb-f941f44fe93a", - "metadata": {}, - "outputs": [], - "source": [ - "from langchain_core.output_parsers import StrOutputParser\n", - "from typing_extensions import TypedDict\n", - "\n", - "\n", - "def format_task(task, idx):\n", - " tool = task[\"tool\"]\n", - " tool_name = tool if isinstance(tool, str) else tool.name # Handle join()\n", - " return f\"{idx}. {{{tool_name}: {task['args']}}}\"\n", - "\n", - "\n", - "def format_tasks(executor_output: dict):\n", - " tasks = executor_output[\"tasks\"]\n", - " prior_observations = executor_output.get(\"observations\")\n", - " formatted_plan = \"\\n\".join(format_task(task, idx) for idx, task in tasks.items())\n", - " observations = \"\\n\".join(f\"{k}: {v}\" for k, v in executor_output[\"join\"].items())\n", - " result = f\"Original Plan:\\n{formatted_plan}\\nExecuted plan results:\\n{observations}\"\n", - " if prior_observations:\n", - " result += f\"\\nPrevious Results:\\n{prior_observations}\"\n", - " return result\n", - "\n", - "\n", - "def _parse_joiner_output(raw_answer: str) -> str:\n", - " thought, answer, is_replan = \"\", \"\", False # default values\n", - " raw_answers = raw_answer.split(\"\\n\")\n", - " for ans in raw_answers:\n", - " if ans.startswith(\"Action:\"):\n", - " answer = ans[ans.find(\"(\") + 1 : ans.find(\")\")]\n", - " is_replan = JOINER_REPLAN in ans\n", - " elif ans.startswith(\"Thought:\"):\n", - " thought = ans.split(\"Thought:\")[1].strip()\n", - " if is_replan:\n", - " return {\"thought\": thought, \"context\": answer}\n", - " else:\n", - " return {\"thought\": thought, \"answer\": answer}" - ] - }, - { - "cell_type": "code", - "execution_count": 217, - "id": "b2feea5a-e0e4-4cff-8cb5-fdbfec95ba57", - "metadata": {}, - "outputs": [], - "source": [ - "def create_joiner(prompt, llm):\n", - " return (\n", - " (\n", - " lambda x: {\n", - " **x[\"plan\"],\n", - " \"input\": x[\"input\"],\n", - " \"context\": x.get(\"context\"),\n", - " \"observations\": x.get(\"observations\"),\n", - " }\n", - " )\n", - " | RunnablePassthrough.assign(scratchpad=format_tasks)\n", - " | ChatPromptTemplate.from_messages([(\"system\", prompt), (\"user\", \"{input}\")])\n", - " | llm\n", - " | StrOutputParser()\n", - " | _parse_joiner_output\n", - " )" - ] - }, - { - "cell_type": "code", - "execution_count": 218, - "id": "942dab42-ad42-4ba2-90d5-49edbe4fae68", - "metadata": {}, - "outputs": [], - "source": [ - "system_prompt = (\n", - " \"Solve a question answering task. Here are some guidelines:\\n\"\n", - " \" - In the Assistant Scratchpad, you will be given results of a plan you have executed to answer the user's question.\\n\"\n", - " \" - Thought needs to reason about the question based on the Observations in 1-2 sentences.\\n\"\n", - " \" - Ignore irrelevant action results.\\n\"\n", - " \" - If the required information is present, give a concise but complete and helpful answer to the user's question.\\n\"\n", - " \" - If you are unable to give a satisfactory finishing answer, replan to get the required information.\"\n", - " \" Respond in the following format:\\n\\n\"\n", - " \"Thought: \\n\"\n", - " \"Action: \\n\"\n", - " \"Available actions:\\n\"\n", - " f\" (1) {JOINER_FINISH}(the final answer to return to the user): returns the answer and finishes the task.\\n\"\n", - " f\" (2) {JOINER_REPLAN}(the reasoning and other information that will help you plan again. Can be a line of any length): instructs why we must replan\\n\\n\"\n", - " \" Examples:\\n\"\n", - " \"Question: How many users are currently using the new product?\\n\"\n", - " \"...task returns the number 32,000\\n\"\n", - " \"Thought: I find no issue with the original plan, and the results satisfy everything in the user question.\\n\"\n", - " f\"Action: {JOINER_FINISH}(32,000 users currently use the new product)\\n###\\n\"\n", - " \"Question: How much cooler is it in NY than SF?\\n\"\n", - " \"...task results show SF is 57 degrees fahrenheit today, and they show in NY it has a high of 32 degrees fahrenheit \\n\"\n", - " \"Thought: I can answer by synthesizing the results.\\n\"\n", - " f\"Action: {JOINER_FINISH}(NY is 25 degrees cooler than SF today, as it has a high of 32 degrees Fahrenheit today, whereas in SF, it is 57 degrees Fahrenheit.)\\n###\\n\"\n", - " \"Question: Are the gophers beating the rabbits??\\n\"\n", - " \"...task returns the a score of 7 for rabbits but no other value...\\n\"\n", - " \"Thought: I need the gophers' score to make a final decision.\\n\"\n", - " f\"Action: {JOINER_REPLAN}(The rabbits have a score of 7, but I need the gophers' score.)\"\n", - " \"\\nAssistant Scratchpad:\\n{scratchpad}\"\n", - ")" - ] - }, - { - "cell_type": "code", - "execution_count": 219, - "id": "a07d0804-2ce5-4462-98eb-4473f36ef704", - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "{'thought': 'The plan has been executed successfully and returned the scores for both Aliya and Roger in Geology. We can compare their scores to determine if Aliya got a better score than Roger.',\n", - " 'answer': 'Aliya got an A+ in Geology, while Roger also got an A+. Therefore, they both got the same score in Geology.'}" - ] - }, - "execution_count": 219, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "joiner = create_joiner(system_prompt, ChatOpenAI(model=\"gpt-3.5-turbo\"))\n", - "joiner.invoke({\"plan\": task_results, \"input\": example_question})" - ] - }, - { - "cell_type": "markdown", - "id": "b099e5ee-2c23-47d9-9387-0f64e02627d3", - "metadata": {}, - "source": [ - "### Construct Agent\n", - "\n", - "Now we have all the required pieces! Let's construct our agent with its tools." - ] - }, - { - "cell_type": "code", - "execution_count": 220, - "id": "565b08d2-d19c-4125-97f7-996fc01bc631", - "metadata": {}, - "outputs": [], - "source": [ - "import getpass\n", - "import os\n", - "\n", - "os.environ[\"TAVILY_API_KEY\"] = (\n", - " os.environ.get(\"TAVILY_API_KEY\")\n", - " if \"TAVILY_API_KEY\" in os.environ\n", - " else getpass.getpass(\"Tavily API Key:\")\n", - ")\n", - "# Then fetch a credentials.json file\n", - "# https://developers.google.com/gmail/api/quickstart/python#authorize_credentials_for_a_desktop_application" - ] - }, - { - "cell_type": "code", - "execution_count": 221, - "id": "bd84ca4b-eacb-471d-9975-5449047b5bed", - "metadata": {}, - "outputs": [], - "source": [ - "from operator import add, mul, sub, truediv\n", - "from typing import Literal\n", - "\n", - "from langchain_community.agent_toolkits import GmailToolkit\n", - "from langchain_community.tools.tavily_search import TavilySearchResults\n", - "from langchain_core.tools import tool\n", - "\n", - "\n", - "@tool\n", - "def calculate(\n", - " arg1: float,\n", - " arg2: float,\n", - " op: Union[Literal[\"+\"], Literal[\"-\"], Literal[\"*\"], Literal[\"/\"]],\n", - "):\n", - " \"\"\"Calculate a mathematical operation on two arguments.\"\"\"\n", - " resolved_op = {\"+\": add, \"-\": sub, \"*\": mul, \"/\": truediv}\n", - " return resolved_op[op](arg1, arg2)\n", - "\n", - "\n", - "tools = [TavilySearchResults(max_results=1), calculate]" - ] - }, - { - "cell_type": "code", - "execution_count": 224, - "id": "768b5f11-e3d2-47be-8143-a7dcd8765243", - "metadata": {}, - "outputs": [], - "source": [ - "from langgraph.graph import END, StateGraph\n", - "\n", - "\n", - "class GraphState(TypedDict):\n", - " input: str\n", - " plan: Dict\n", - " agent_output: Dict\n", - " observations: Dict\n", - " num_iterations: int\n", - " context: str\n", - " stop_reason: str\n", - "\n", - "\n", - "MAX_ITERATIONS = 5\n", - "workflow = StateGraph(GraphState)\n", - "\n", - "# 1. Define vertices\n", - "\n", - "planner = create_planner(\n", - " llm=ChatOpenAI(model=\"gpt-4-1106-preview\"),\n", - " # Add more examples to improve reliability\n", - " example_prompt=(\n", - " \"Question: What's the capital of Myanmar?\\n\"\n", - " '1. {\"tavily_search_results_json\": {\"query\": \"Capital of Myanmar\"}}\\n'\n", - " f'2. {{\"join\": null}}{END_OF_PLAN}\\n'\n", - " \"###\\n\"\n", - " \"\\n\"\n", - " ),\n", - " tools=tools,\n", - ")\n", - "\n", - "plan_and_execute = planner | construct_dag\n", - "joiner = create_joiner(system_prompt, ChatOpenAI(model=\"gpt-4-1106-preview\"))\n", - "\n", - "\n", - "def _reformat_task(idx, task: Union[BaseTool, str]):\n", - " tool = task[\"tool\"]\n", - " tool_name = tool if isinstance(tool, str) else tool.name\n", - " called = {tool_name: task[\"args\"]}\n", - " return f\"{idx}. {json.dumps(called)}\"\n", - "\n", - "\n", - "def provide_context(state):\n", - " # Insert a context string for the re-planner.\n", - " # This could alternatively call an LLM to provide additional logic\n", - " context = state[\"agent_output\"][\"context\"]\n", - " num_iterations = int(state.get(\"num_iterations\") or 1) + 1\n", - " previous_plan = \"\\n\".join(\n", - " [\n", - " _reformat_task(idx, task)\n", - " for idx, task in sorted(state[\"plan\"][\"tasks\"].items())\n", - " ]\n", - " )\n", - " context_str = (\n", - " f\"\\n\\nPrevious Plan:\\n{previous_plan}\\n\"\n", - " f\"{context}\\nYou have made {num_iterations}/{MAX_ITERATIONS} attempts thus far.\"\n", - " )\n", - " observations = state[\"observations\"] or {}\n", - " for task, observation in state[\"plan\"][\"join\"].items():\n", - " observations[task] = observation\n", - " return {\n", - " \"context\": context_str,\n", - " \"num_iterations\": num_iterations,\n", - " \"observations\": observations,\n", - " }\n", - "\n", - "\n", - "def add_stop_reason(state):\n", - " num_iterations = int(state.get(\"num_iterations\") or 0)\n", - " if num_iterations >= MAX_ITERATIONS:\n", - " return {\"stop_reason\": \"end_max_iter\"}\n", - " if state[\"agent_output\"].get(\"answer\"):\n", - " return {\"stop_reason\": \"answer\"}\n", - " return {\"stop_reason\": None}\n", - "\n", - "\n", - "# Assign each node to a state variable to update\n", - "workflow.add_node(\"plan_and_execute\", RunnablePassthrough.assign(plan=plan_and_execute))\n", - "workflow.add_node(\"join\", RunnablePassthrough.assign(agent_output=joiner))\n", - "workflow.add_node(\"provide_context\", provide_context)\n", - "workflow.add_node(\"provide_stop_reason\", add_stop_reason)\n", - "\n", - "\n", - "## Define edges\n", - "\n", - "workflow.add_edge(\"plan_and_execute\", \"join\")\n", - "workflow.add_edge(\"provide_context\", \"plan_and_execute\")\n", - "workflow.add_edge(\"join\", \"provide_stop_reason\")\n", - "\n", - "### This condition determines looping logic\n", - "\n", - "\n", - "def should_continue(state):\n", - " if state[\"stop_reason\"] is None:\n", - " return \"continue\"\n", - " return \"end\"\n", - "\n", - "\n", - "workflow.add_conditional_edges(\n", - " start_key=\"provide_stop_reason\",\n", - " # Next, we pass in the function that will determine which node is called next.\n", - " condition=should_continue,\n", - " conditional_edge_mapping={\n", - " # If it generates context, we must replan\n", - " \"continue\": \"provide_context\",\n", - " # Otherwise we finish.\n", - " \"end\": END,\n", - " },\n", - ")\n", - "workflow.set_entry_point(\"plan_and_execute\")\n", - "chain = workflow.compile()" - ] - }, - { - "cell_type": "markdown", - "id": "9f8c9849-8531-463d-a0ef-dcc3d9888b2d", - "metadata": {}, - "source": [ - "## Simple question\n", - "\n", - "Let's ask a simple question of the agent." - ] - }, - { - "cell_type": "code", - "execution_count": 225, - "id": "5bc4584a-e31c-4065-805e-76a6db30676a", - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "The GDP of New York in 2022 was about 1.56 trillion U.S. dollars.\n" - ] - } - ], - "source": [ - "result = chain.invoke({\"input\": \"What's the GDP of New York?\"})\n", - "print(result[\"agent_output\"][\"answer\"])" - ] - }, - { - "cell_type": "markdown", - "id": "33c65ef5-b4b2-4ab2-8c78-a551da7819b9", - "metadata": {}, - "source": [ - "## Multi-hop question" - ] - }, - { - "cell_type": "code", - "execution_count": 227, - "id": "0b3a0916-d8ca-4092-b91c-d9e2b05259d8", - "metadata": {}, - "outputs": [ - { - "ename": "JSONDecodeError", - "evalue": "Expecting value: line 1 column 1 (char 0)", - "output_type": "error", - "traceback": [ - "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", - "\u001b[0;31mJSONDecodeError\u001b[0m Traceback (most recent call last)", - "Cell \u001b[0;32mIn[227], line 1\u001b[0m\n\u001b[0;32m----> 1\u001b[0m result \u001b[38;5;241m=\u001b[39m \u001b[43mchain\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43minvoke\u001b[49m\u001b[43m(\u001b[49m\n\u001b[1;32m 2\u001b[0m \u001b[43m \u001b[49m\u001b[43m{\u001b[49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[38;5;124;43minput\u001b[39;49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[43m:\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[38;5;124;43mHow much larger is the GDP of the UK than that of New York?\u001b[39;49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[43m}\u001b[49m\n\u001b[1;32m 3\u001b[0m \u001b[43m)\u001b[49m\n", - "File \u001b[0;32m~/code/lc/langgraph/langgraph/pregel/__init__.py:492\u001b[0m, in \u001b[0;36mPregel.invoke\u001b[0;34m(self, input, config, output_keys, input_keys, **kwargs)\u001b[0m\n\u001b[1;32m 482\u001b[0m \u001b[38;5;28;01mdef\u001b[39;00m \u001b[38;5;21minvoke\u001b[39m(\n\u001b[1;32m 483\u001b[0m \u001b[38;5;28mself\u001b[39m,\n\u001b[1;32m 484\u001b[0m \u001b[38;5;28minput\u001b[39m: Union[\u001b[38;5;28mdict\u001b[39m[\u001b[38;5;28mstr\u001b[39m, Any], Any],\n\u001b[0;32m (...)\u001b[0m\n\u001b[1;32m 489\u001b[0m \u001b[38;5;241m*\u001b[39m\u001b[38;5;241m*\u001b[39mkwargs: Any,\n\u001b[1;32m 490\u001b[0m ) \u001b[38;5;241m-\u001b[39m\u001b[38;5;241m>\u001b[39m Union[\u001b[38;5;28mdict\u001b[39m[\u001b[38;5;28mstr\u001b[39m, Any], Any]:\n\u001b[1;32m 491\u001b[0m latest: Union[\u001b[38;5;28mdict\u001b[39m[\u001b[38;5;28mstr\u001b[39m, Any], Any] \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;01mNone\u001b[39;00m\n\u001b[0;32m--> 492\u001b[0m \u001b[43m \u001b[49m\u001b[38;5;28;43;01mfor\u001b[39;49;00m\u001b[43m \u001b[49m\u001b[43mchunk\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;129;43;01min\u001b[39;49;00m\u001b[43m \u001b[49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mstream\u001b[49m\u001b[43m(\u001b[49m\n\u001b[1;32m 493\u001b[0m \u001b[43m \u001b[49m\u001b[38;5;28;43minput\u001b[39;49m\u001b[43m,\u001b[49m\n\u001b[1;32m 494\u001b[0m \u001b[43m \u001b[49m\u001b[43mconfig\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 495\u001b[0m \u001b[43m \u001b[49m\u001b[43moutput_keys\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43moutput_keys\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;28;43;01mif\u001b[39;49;00m\u001b[43m \u001b[49m\u001b[43moutput_keys\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;129;43;01mis\u001b[39;49;00m\u001b[43m \u001b[49m\u001b[38;5;129;43;01mnot\u001b[39;49;00m\u001b[43m \u001b[49m\u001b[38;5;28;43;01mNone\u001b[39;49;00m\u001b[43m \u001b[49m\u001b[38;5;28;43;01melse\u001b[39;49;00m\u001b[43m \u001b[49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43moutput\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 496\u001b[0m \u001b[43m \u001b[49m\u001b[43minput_keys\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43minput_keys\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 497\u001b[0m \u001b[43m \u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43mkwargs\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 498\u001b[0m \u001b[43m \u001b[49m\u001b[43m)\u001b[49m\u001b[43m:\u001b[49m\n\u001b[1;32m 499\u001b[0m \u001b[43m \u001b[49m\u001b[43mlatest\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43m \u001b[49m\u001b[43mchunk\u001b[49m\n\u001b[1;32m 500\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m latest\n", - "File \u001b[0;32m~/code/lc/langgraph/langgraph/pregel/__init__.py:528\u001b[0m, in \u001b[0;36mPregel.transform\u001b[0;34m(self, input, config, output_keys, input_keys, **kwargs)\u001b[0m\n\u001b[1;32m 519\u001b[0m \u001b[38;5;28;01mdef\u001b[39;00m \u001b[38;5;21mtransform\u001b[39m(\n\u001b[1;32m 520\u001b[0m \u001b[38;5;28mself\u001b[39m,\n\u001b[1;32m 521\u001b[0m \u001b[38;5;28minput\u001b[39m: Iterator[Union[\u001b[38;5;28mdict\u001b[39m[\u001b[38;5;28mstr\u001b[39m, Any], Any]],\n\u001b[0;32m (...)\u001b[0m\n\u001b[1;32m 526\u001b[0m \u001b[38;5;241m*\u001b[39m\u001b[38;5;241m*\u001b[39mkwargs: Any,\n\u001b[1;32m 527\u001b[0m ) \u001b[38;5;241m-\u001b[39m\u001b[38;5;241m>\u001b[39m Iterator[Union[\u001b[38;5;28mdict\u001b[39m[\u001b[38;5;28mstr\u001b[39m, Any], Any]]:\n\u001b[0;32m--> 528\u001b[0m \u001b[43m \u001b[49m\u001b[38;5;28;43;01mfor\u001b[39;49;00m\u001b[43m \u001b[49m\u001b[43mchunk\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;129;43;01min\u001b[39;49;00m\u001b[43m \u001b[49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43m_transform_stream_with_config\u001b[49m\u001b[43m(\u001b[49m\n\u001b[1;32m 529\u001b[0m \u001b[43m \u001b[49m\u001b[38;5;28;43minput\u001b[39;49m\u001b[43m,\u001b[49m\n\u001b[1;32m 530\u001b[0m \u001b[43m \u001b[49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43m_transform\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 531\u001b[0m \u001b[43m \u001b[49m\u001b[43mconfig\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 532\u001b[0m \u001b[43m \u001b[49m\u001b[43moutput_keys\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43moutput_keys\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 533\u001b[0m \u001b[43m \u001b[49m\u001b[43minput_keys\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43minput_keys\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 534\u001b[0m \u001b[43m \u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43mkwargs\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 535\u001b[0m \u001b[43m \u001b[49m\u001b[43m)\u001b[49m\u001b[43m:\u001b[49m\n\u001b[1;32m 536\u001b[0m \u001b[43m \u001b[49m\u001b[38;5;28;43;01myield\u001b[39;49;00m\u001b[43m \u001b[49m\u001b[43mchunk\u001b[49m\n", - "File \u001b[0;32m~/.pyenv/versions/3.11.2/lib/python3.11/site-packages/langchain_core/runnables/base.py:1226\u001b[0m, in \u001b[0;36mRunnable._transform_stream_with_config\u001b[0;34m(self, input, transformer, config, run_type, **kwargs)\u001b[0m\n\u001b[1;32m 1224\u001b[0m \u001b[38;5;28;01mtry\u001b[39;00m:\n\u001b[1;32m 1225\u001b[0m \u001b[38;5;28;01mwhile\u001b[39;00m \u001b[38;5;28;01mTrue\u001b[39;00m:\n\u001b[0;32m-> 1226\u001b[0m chunk: Output \u001b[38;5;241m=\u001b[39m context\u001b[38;5;241m.\u001b[39mrun(\u001b[38;5;28mnext\u001b[39m, iterator) \u001b[38;5;66;03m# type: ignore\u001b[39;00m\n\u001b[1;32m 1227\u001b[0m \u001b[38;5;28;01myield\u001b[39;00m chunk\n\u001b[1;32m 1228\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m final_output_supported:\n", - "File \u001b[0;32m~/code/lc/langgraph/langgraph/pregel/__init__.py:313\u001b[0m, in \u001b[0;36mPregel._transform\u001b[0;34m(self, input, run_manager, config, input_keys, output_keys)\u001b[0m\n\u001b[1;32m 303\u001b[0m done, inflight \u001b[38;5;241m=\u001b[39m concurrent\u001b[38;5;241m.\u001b[39mfutures\u001b[38;5;241m.\u001b[39mwait(\n\u001b[1;32m 304\u001b[0m [\n\u001b[1;32m 305\u001b[0m executor\u001b[38;5;241m.\u001b[39msubmit(proc\u001b[38;5;241m.\u001b[39minvoke, \u001b[38;5;28minput\u001b[39m, config)\n\u001b[0;32m (...)\u001b[0m\n\u001b[1;32m 309\u001b[0m timeout\u001b[38;5;241m=\u001b[39m\u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mstep_timeout,\n\u001b[1;32m 310\u001b[0m )\n\u001b[1;32m 312\u001b[0m \u001b[38;5;66;03m# interrupt on failure or timeout\u001b[39;00m\n\u001b[0;32m--> 313\u001b[0m \u001b[43m_interrupt_or_proceed\u001b[49m\u001b[43m(\u001b[49m\u001b[43mdone\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43minflight\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mstep\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 315\u001b[0m \u001b[38;5;66;03m# apply writes to channels\u001b[39;00m\n\u001b[1;32m 316\u001b[0m _apply_writes(checkpoint, channels, pending_writes, config, step \u001b[38;5;241m+\u001b[39m \u001b[38;5;241m1\u001b[39m)\n", - "File \u001b[0;32m~/code/lc/langgraph/langgraph/pregel/__init__.py:611\u001b[0m, in \u001b[0;36m_interrupt_or_proceed\u001b[0;34m(done, inflight, step)\u001b[0m\n\u001b[1;32m 609\u001b[0m inflight\u001b[38;5;241m.\u001b[39mpop()\u001b[38;5;241m.\u001b[39mcancel()\n\u001b[1;32m 610\u001b[0m \u001b[38;5;66;03m# raise the exception\u001b[39;00m\n\u001b[0;32m--> 611\u001b[0m \u001b[38;5;28;01mraise\u001b[39;00m exc\n\u001b[1;32m 612\u001b[0m \u001b[38;5;66;03m# TODO this is where retry of an entire step would happen\u001b[39;00m\n\u001b[1;32m 614\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m inflight:\n\u001b[1;32m 615\u001b[0m \u001b[38;5;66;03m# if we got here means we timed out\u001b[39;00m\n", - "File \u001b[0;32m~/.pyenv/versions/3.11.2/lib/python3.11/concurrent/futures/thread.py:58\u001b[0m, in \u001b[0;36m_WorkItem.run\u001b[0;34m(self)\u001b[0m\n\u001b[1;32m 55\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m\n\u001b[1;32m 57\u001b[0m \u001b[38;5;28;01mtry\u001b[39;00m:\n\u001b[0;32m---> 58\u001b[0m result \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mfn\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43margs\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mkwargs\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 59\u001b[0m \u001b[38;5;28;01mexcept\u001b[39;00m \u001b[38;5;167;01mBaseException\u001b[39;00m \u001b[38;5;28;01mas\u001b[39;00m exc:\n\u001b[1;32m 60\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mfuture\u001b[38;5;241m.\u001b[39mset_exception(exc)\n", - "File \u001b[0;32m~/.pyenv/versions/3.11.2/lib/python3.11/site-packages/langchain_core/runnables/base.py:3596\u001b[0m, in \u001b[0;36mRunnableBindingBase.invoke\u001b[0;34m(self, input, config, **kwargs)\u001b[0m\n\u001b[1;32m 3590\u001b[0m \u001b[38;5;28;01mdef\u001b[39;00m \u001b[38;5;21minvoke\u001b[39m(\n\u001b[1;32m 3591\u001b[0m \u001b[38;5;28mself\u001b[39m,\n\u001b[1;32m 3592\u001b[0m \u001b[38;5;28minput\u001b[39m: Input,\n\u001b[1;32m 3593\u001b[0m config: Optional[RunnableConfig] \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;01mNone\u001b[39;00m,\n\u001b[1;32m 3594\u001b[0m \u001b[38;5;241m*\u001b[39m\u001b[38;5;241m*\u001b[39mkwargs: Optional[Any],\n\u001b[1;32m 3595\u001b[0m ) \u001b[38;5;241m-\u001b[39m\u001b[38;5;241m>\u001b[39m Output:\n\u001b[0;32m-> 3596\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mbound\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43minvoke\u001b[49m\u001b[43m(\u001b[49m\n\u001b[1;32m 3597\u001b[0m \u001b[43m \u001b[49m\u001b[38;5;28;43minput\u001b[39;49m\u001b[43m,\u001b[49m\n\u001b[1;32m 3598\u001b[0m \u001b[43m \u001b[49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43m_merge_configs\u001b[49m\u001b[43m(\u001b[49m\u001b[43mconfig\u001b[49m\u001b[43m)\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 3599\u001b[0m \u001b[43m \u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43m{\u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mkwargs\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43mkwargs\u001b[49m\u001b[43m}\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 3600\u001b[0m \u001b[43m \u001b[49m\u001b[43m)\u001b[49m\n", - "File \u001b[0;32m~/.pyenv/versions/3.11.2/lib/python3.11/site-packages/langchain_core/runnables/base.py:1774\u001b[0m, in \u001b[0;36mRunnableSequence.invoke\u001b[0;34m(self, input, config)\u001b[0m\n\u001b[1;32m 1772\u001b[0m \u001b[38;5;28;01mtry\u001b[39;00m:\n\u001b[1;32m 1773\u001b[0m \u001b[38;5;28;01mfor\u001b[39;00m i, step \u001b[38;5;129;01min\u001b[39;00m \u001b[38;5;28menumerate\u001b[39m(\u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39msteps):\n\u001b[0;32m-> 1774\u001b[0m \u001b[38;5;28minput\u001b[39m \u001b[38;5;241m=\u001b[39m \u001b[43mstep\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43minvoke\u001b[49m\u001b[43m(\u001b[49m\n\u001b[1;32m 1775\u001b[0m \u001b[43m \u001b[49m\u001b[38;5;28;43minput\u001b[39;49m\u001b[43m,\u001b[49m\n\u001b[1;32m 1776\u001b[0m \u001b[43m \u001b[49m\u001b[38;5;66;43;03m# mark each step as a child run\u001b[39;49;00m\n\u001b[1;32m 1777\u001b[0m \u001b[43m \u001b[49m\u001b[43mpatch_config\u001b[49m\u001b[43m(\u001b[49m\n\u001b[1;32m 1778\u001b[0m \u001b[43m \u001b[49m\u001b[43mconfig\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mcallbacks\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mrun_manager\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mget_child\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;124;43mf\u001b[39;49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[38;5;124;43mseq:step:\u001b[39;49m\u001b[38;5;132;43;01m{\u001b[39;49;00m\u001b[43mi\u001b[49m\u001b[38;5;241;43m+\u001b[39;49m\u001b[38;5;241;43m1\u001b[39;49m\u001b[38;5;132;43;01m}\u001b[39;49;00m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[43m)\u001b[49m\n\u001b[1;32m 1779\u001b[0m \u001b[43m \u001b[49m\u001b[43m)\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 1780\u001b[0m \u001b[43m \u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 1781\u001b[0m \u001b[38;5;66;03m# finish the root run\u001b[39;00m\n\u001b[1;32m 1782\u001b[0m \u001b[38;5;28;01mexcept\u001b[39;00m \u001b[38;5;167;01mBaseException\u001b[39;00m \u001b[38;5;28;01mas\u001b[39;00m e:\n", - "File \u001b[0;32m~/.pyenv/versions/3.11.2/lib/python3.11/site-packages/langchain_core/runnables/passthrough.py:415\u001b[0m, in \u001b[0;36mRunnableAssign.invoke\u001b[0;34m(self, input, config, **kwargs)\u001b[0m\n\u001b[1;32m 409\u001b[0m \u001b[38;5;28;01mdef\u001b[39;00m \u001b[38;5;21minvoke\u001b[39m(\n\u001b[1;32m 410\u001b[0m \u001b[38;5;28mself\u001b[39m,\n\u001b[1;32m 411\u001b[0m \u001b[38;5;28minput\u001b[39m: Dict[\u001b[38;5;28mstr\u001b[39m, Any],\n\u001b[1;32m 412\u001b[0m config: Optional[RunnableConfig] \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;01mNone\u001b[39;00m,\n\u001b[1;32m 413\u001b[0m \u001b[38;5;241m*\u001b[39m\u001b[38;5;241m*\u001b[39mkwargs: Any,\n\u001b[1;32m 414\u001b[0m ) \u001b[38;5;241m-\u001b[39m\u001b[38;5;241m>\u001b[39m Dict[\u001b[38;5;28mstr\u001b[39m, Any]:\n\u001b[0;32m--> 415\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43m_call_with_config\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43m_invoke\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;28;43minput\u001b[39;49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mconfig\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43mkwargs\u001b[49m\u001b[43m)\u001b[49m\n", - "File \u001b[0;32m~/.pyenv/versions/3.11.2/lib/python3.11/site-packages/langchain_core/runnables/base.py:975\u001b[0m, in \u001b[0;36mRunnable._call_with_config\u001b[0;34m(self, func, input, config, run_type, **kwargs)\u001b[0m\n\u001b[1;32m 971\u001b[0m context \u001b[38;5;241m=\u001b[39m copy_context()\n\u001b[1;32m 972\u001b[0m context\u001b[38;5;241m.\u001b[39mrun(var_child_runnable_config\u001b[38;5;241m.\u001b[39mset, child_config)\n\u001b[1;32m 973\u001b[0m output \u001b[38;5;241m=\u001b[39m cast(\n\u001b[1;32m 974\u001b[0m Output,\n\u001b[0;32m--> 975\u001b[0m \u001b[43mcontext\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mrun\u001b[49m\u001b[43m(\u001b[49m\n\u001b[1;32m 976\u001b[0m \u001b[43m \u001b[49m\u001b[43mcall_func_with_variable_args\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 977\u001b[0m \u001b[43m \u001b[49m\u001b[43mfunc\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;66;43;03m# type: ignore[arg-type]\u001b[39;49;00m\n\u001b[1;32m 978\u001b[0m \u001b[43m \u001b[49m\u001b[38;5;28;43minput\u001b[39;49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;66;43;03m# type: ignore[arg-type]\u001b[39;49;00m\n\u001b[1;32m 979\u001b[0m \u001b[43m \u001b[49m\u001b[43mconfig\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 980\u001b[0m \u001b[43m \u001b[49m\u001b[43mrun_manager\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 981\u001b[0m \u001b[43m \u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43mkwargs\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 982\u001b[0m \u001b[43m \u001b[49m\u001b[43m)\u001b[49m,\n\u001b[1;32m 983\u001b[0m )\n\u001b[1;32m 984\u001b[0m \u001b[38;5;28;01mexcept\u001b[39;00m \u001b[38;5;167;01mBaseException\u001b[39;00m \u001b[38;5;28;01mas\u001b[39;00m e:\n\u001b[1;32m 985\u001b[0m run_manager\u001b[38;5;241m.\u001b[39mon_chain_error(e)\n", - "File \u001b[0;32m~/.pyenv/versions/3.11.2/lib/python3.11/site-packages/langchain_core/runnables/config.py:323\u001b[0m, in \u001b[0;36mcall_func_with_variable_args\u001b[0;34m(func, input, config, run_manager, **kwargs)\u001b[0m\n\u001b[1;32m 321\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m run_manager \u001b[38;5;129;01mis\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m \u001b[38;5;28;01mNone\u001b[39;00m \u001b[38;5;129;01mand\u001b[39;00m accepts_run_manager(func):\n\u001b[1;32m 322\u001b[0m kwargs[\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mrun_manager\u001b[39m\u001b[38;5;124m\"\u001b[39m] \u001b[38;5;241m=\u001b[39m run_manager\n\u001b[0;32m--> 323\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[43mfunc\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;28;43minput\u001b[39;49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43mkwargs\u001b[49m\u001b[43m)\u001b[49m\n", - "File \u001b[0;32m~/.pyenv/versions/3.11.2/lib/python3.11/site-packages/langchain_core/runnables/passthrough.py:402\u001b[0m, in \u001b[0;36mRunnableAssign._invoke\u001b[0;34m(self, input, run_manager, config, **kwargs)\u001b[0m\n\u001b[1;32m 389\u001b[0m \u001b[38;5;28;01mdef\u001b[39;00m \u001b[38;5;21m_invoke\u001b[39m(\n\u001b[1;32m 390\u001b[0m \u001b[38;5;28mself\u001b[39m,\n\u001b[1;32m 391\u001b[0m \u001b[38;5;28minput\u001b[39m: Dict[\u001b[38;5;28mstr\u001b[39m, Any],\n\u001b[0;32m (...)\u001b[0m\n\u001b[1;32m 394\u001b[0m \u001b[38;5;241m*\u001b[39m\u001b[38;5;241m*\u001b[39mkwargs: Any,\n\u001b[1;32m 395\u001b[0m ) \u001b[38;5;241m-\u001b[39m\u001b[38;5;241m>\u001b[39m Dict[\u001b[38;5;28mstr\u001b[39m, Any]:\n\u001b[1;32m 396\u001b[0m \u001b[38;5;28;01massert\u001b[39;00m \u001b[38;5;28misinstance\u001b[39m(\n\u001b[1;32m 397\u001b[0m \u001b[38;5;28minput\u001b[39m, \u001b[38;5;28mdict\u001b[39m\n\u001b[1;32m 398\u001b[0m ), \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mThe input to RunnablePassthrough.assign() must be a dict.\u001b[39m\u001b[38;5;124m\"\u001b[39m\n\u001b[1;32m 400\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m {\n\u001b[1;32m 401\u001b[0m \u001b[38;5;241m*\u001b[39m\u001b[38;5;241m*\u001b[39m\u001b[38;5;28minput\u001b[39m,\n\u001b[0;32m--> 402\u001b[0m \u001b[38;5;241m*\u001b[39m\u001b[38;5;241m*\u001b[39m\u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mmapper\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43minvoke\u001b[49m\u001b[43m(\u001b[49m\n\u001b[1;32m 403\u001b[0m \u001b[43m \u001b[49m\u001b[38;5;28;43minput\u001b[39;49m\u001b[43m,\u001b[49m\n\u001b[1;32m 404\u001b[0m \u001b[43m \u001b[49m\u001b[43mpatch_config\u001b[49m\u001b[43m(\u001b[49m\u001b[43mconfig\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mcallbacks\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mrun_manager\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mget_child\u001b[49m\u001b[43m(\u001b[49m\u001b[43m)\u001b[49m\u001b[43m)\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 405\u001b[0m \u001b[43m \u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43mkwargs\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 406\u001b[0m \u001b[43m \u001b[49m\u001b[43m)\u001b[49m,\n\u001b[1;32m 407\u001b[0m }\n", - "File \u001b[0;32m~/.pyenv/versions/3.11.2/lib/python3.11/site-packages/langchain_core/runnables/base.py:2339\u001b[0m, in \u001b[0;36mRunnableParallel.invoke\u001b[0;34m(self, input, config)\u001b[0m\n\u001b[1;32m 2326\u001b[0m \u001b[38;5;28;01mwith\u001b[39;00m get_executor_for_config(config) \u001b[38;5;28;01mas\u001b[39;00m executor:\n\u001b[1;32m 2327\u001b[0m futures \u001b[38;5;241m=\u001b[39m [\n\u001b[1;32m 2328\u001b[0m executor\u001b[38;5;241m.\u001b[39msubmit(\n\u001b[1;32m 2329\u001b[0m step\u001b[38;5;241m.\u001b[39minvoke,\n\u001b[0;32m (...)\u001b[0m\n\u001b[1;32m 2337\u001b[0m \u001b[38;5;28;01mfor\u001b[39;00m key, step \u001b[38;5;129;01min\u001b[39;00m steps\u001b[38;5;241m.\u001b[39mitems()\n\u001b[1;32m 2338\u001b[0m ]\n\u001b[0;32m-> 2339\u001b[0m output \u001b[38;5;241m=\u001b[39m \u001b[43m{\u001b[49m\u001b[43mkey\u001b[49m\u001b[43m:\u001b[49m\u001b[43m \u001b[49m\u001b[43mfuture\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mresult\u001b[49m\u001b[43m(\u001b[49m\u001b[43m)\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;28;43;01mfor\u001b[39;49;00m\u001b[43m \u001b[49m\u001b[43mkey\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mfuture\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;129;43;01min\u001b[39;49;00m\u001b[43m \u001b[49m\u001b[38;5;28;43mzip\u001b[39;49m\u001b[43m(\u001b[49m\u001b[43msteps\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mfutures\u001b[49m\u001b[43m)\u001b[49m\u001b[43m}\u001b[49m\n\u001b[1;32m 2340\u001b[0m \u001b[38;5;66;03m# finish the root run\u001b[39;00m\n\u001b[1;32m 2341\u001b[0m \u001b[38;5;28;01mexcept\u001b[39;00m \u001b[38;5;167;01mBaseException\u001b[39;00m \u001b[38;5;28;01mas\u001b[39;00m e:\n", - "File \u001b[0;32m~/.pyenv/versions/3.11.2/lib/python3.11/site-packages/langchain_core/runnables/base.py:2339\u001b[0m, in \u001b[0;36m\u001b[0;34m(.0)\u001b[0m\n\u001b[1;32m 2326\u001b[0m \u001b[38;5;28;01mwith\u001b[39;00m get_executor_for_config(config) \u001b[38;5;28;01mas\u001b[39;00m executor:\n\u001b[1;32m 2327\u001b[0m futures \u001b[38;5;241m=\u001b[39m [\n\u001b[1;32m 2328\u001b[0m executor\u001b[38;5;241m.\u001b[39msubmit(\n\u001b[1;32m 2329\u001b[0m step\u001b[38;5;241m.\u001b[39minvoke,\n\u001b[0;32m (...)\u001b[0m\n\u001b[1;32m 2337\u001b[0m \u001b[38;5;28;01mfor\u001b[39;00m key, step \u001b[38;5;129;01min\u001b[39;00m steps\u001b[38;5;241m.\u001b[39mitems()\n\u001b[1;32m 2338\u001b[0m ]\n\u001b[0;32m-> 2339\u001b[0m output \u001b[38;5;241m=\u001b[39m {key: \u001b[43mfuture\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mresult\u001b[49m\u001b[43m(\u001b[49m\u001b[43m)\u001b[49m \u001b[38;5;28;01mfor\u001b[39;00m key, future \u001b[38;5;129;01min\u001b[39;00m \u001b[38;5;28mzip\u001b[39m(steps, futures)}\n\u001b[1;32m 2340\u001b[0m \u001b[38;5;66;03m# finish the root run\u001b[39;00m\n\u001b[1;32m 2341\u001b[0m \u001b[38;5;28;01mexcept\u001b[39;00m \u001b[38;5;167;01mBaseException\u001b[39;00m \u001b[38;5;28;01mas\u001b[39;00m e:\n", - "File \u001b[0;32m~/.pyenv/versions/3.11.2/lib/python3.11/concurrent/futures/_base.py:456\u001b[0m, in \u001b[0;36mFuture.result\u001b[0;34m(self, timeout)\u001b[0m\n\u001b[1;32m 454\u001b[0m \u001b[38;5;28;01mraise\u001b[39;00m CancelledError()\n\u001b[1;32m 455\u001b[0m \u001b[38;5;28;01melif\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_state \u001b[38;5;241m==\u001b[39m FINISHED:\n\u001b[0;32m--> 456\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43m__get_result\u001b[49m\u001b[43m(\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 457\u001b[0m \u001b[38;5;28;01melse\u001b[39;00m:\n\u001b[1;32m 458\u001b[0m \u001b[38;5;28;01mraise\u001b[39;00m \u001b[38;5;167;01mTimeoutError\u001b[39;00m()\n", - "File \u001b[0;32m~/.pyenv/versions/3.11.2/lib/python3.11/concurrent/futures/_base.py:401\u001b[0m, in \u001b[0;36mFuture.__get_result\u001b[0;34m(self)\u001b[0m\n\u001b[1;32m 399\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_exception:\n\u001b[1;32m 400\u001b[0m \u001b[38;5;28;01mtry\u001b[39;00m:\n\u001b[0;32m--> 401\u001b[0m \u001b[38;5;28;01mraise\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_exception\n\u001b[1;32m 402\u001b[0m \u001b[38;5;28;01mfinally\u001b[39;00m:\n\u001b[1;32m 403\u001b[0m \u001b[38;5;66;03m# Break a reference cycle with the exception in self._exception\u001b[39;00m\n\u001b[1;32m 404\u001b[0m \u001b[38;5;28mself\u001b[39m \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;01mNone\u001b[39;00m\n", - "File \u001b[0;32m~/.pyenv/versions/3.11.2/lib/python3.11/concurrent/futures/thread.py:58\u001b[0m, in \u001b[0;36m_WorkItem.run\u001b[0;34m(self)\u001b[0m\n\u001b[1;32m 55\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m\n\u001b[1;32m 57\u001b[0m \u001b[38;5;28;01mtry\u001b[39;00m:\n\u001b[0;32m---> 58\u001b[0m result \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mfn\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43margs\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mkwargs\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 59\u001b[0m \u001b[38;5;28;01mexcept\u001b[39;00m \u001b[38;5;167;01mBaseException\u001b[39;00m \u001b[38;5;28;01mas\u001b[39;00m exc:\n\u001b[1;32m 60\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mfuture\u001b[38;5;241m.\u001b[39mset_exception(exc)\n", - "File \u001b[0;32m~/.pyenv/versions/3.11.2/lib/python3.11/site-packages/langchain_core/runnables/base.py:1774\u001b[0m, in \u001b[0;36mRunnableSequence.invoke\u001b[0;34m(self, input, config)\u001b[0m\n\u001b[1;32m 1772\u001b[0m \u001b[38;5;28;01mtry\u001b[39;00m:\n\u001b[1;32m 1773\u001b[0m \u001b[38;5;28;01mfor\u001b[39;00m i, step \u001b[38;5;129;01min\u001b[39;00m \u001b[38;5;28menumerate\u001b[39m(\u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39msteps):\n\u001b[0;32m-> 1774\u001b[0m \u001b[38;5;28minput\u001b[39m \u001b[38;5;241m=\u001b[39m \u001b[43mstep\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43minvoke\u001b[49m\u001b[43m(\u001b[49m\n\u001b[1;32m 1775\u001b[0m \u001b[43m \u001b[49m\u001b[38;5;28;43minput\u001b[39;49m\u001b[43m,\u001b[49m\n\u001b[1;32m 1776\u001b[0m \u001b[43m \u001b[49m\u001b[38;5;66;43;03m# mark each step as a child run\u001b[39;49;00m\n\u001b[1;32m 1777\u001b[0m \u001b[43m \u001b[49m\u001b[43mpatch_config\u001b[49m\u001b[43m(\u001b[49m\n\u001b[1;32m 1778\u001b[0m \u001b[43m \u001b[49m\u001b[43mconfig\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mcallbacks\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mrun_manager\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mget_child\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;124;43mf\u001b[39;49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[38;5;124;43mseq:step:\u001b[39;49m\u001b[38;5;132;43;01m{\u001b[39;49;00m\u001b[43mi\u001b[49m\u001b[38;5;241;43m+\u001b[39;49m\u001b[38;5;241;43m1\u001b[39;49m\u001b[38;5;132;43;01m}\u001b[39;49;00m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[43m)\u001b[49m\n\u001b[1;32m 1779\u001b[0m \u001b[43m \u001b[49m\u001b[43m)\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 1780\u001b[0m \u001b[43m \u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 1781\u001b[0m \u001b[38;5;66;03m# finish the root run\u001b[39;00m\n\u001b[1;32m 1782\u001b[0m \u001b[38;5;28;01mexcept\u001b[39;00m \u001b[38;5;167;01mBaseException\u001b[39;00m \u001b[38;5;28;01mas\u001b[39;00m e:\n", - "File \u001b[0;32m~/.pyenv/versions/3.11.2/lib/python3.11/site-packages/langchain_core/output_parsers/base.py:167\u001b[0m, in \u001b[0;36mBaseOutputParser.invoke\u001b[0;34m(self, input, config)\u001b[0m\n\u001b[1;32m 163\u001b[0m \u001b[38;5;28;01mdef\u001b[39;00m \u001b[38;5;21minvoke\u001b[39m(\n\u001b[1;32m 164\u001b[0m \u001b[38;5;28mself\u001b[39m, \u001b[38;5;28minput\u001b[39m: Union[\u001b[38;5;28mstr\u001b[39m, BaseMessage], config: Optional[RunnableConfig] \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;01mNone\u001b[39;00m\n\u001b[1;32m 165\u001b[0m ) \u001b[38;5;241m-\u001b[39m\u001b[38;5;241m>\u001b[39m T:\n\u001b[1;32m 166\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;28misinstance\u001b[39m(\u001b[38;5;28minput\u001b[39m, BaseMessage):\n\u001b[0;32m--> 167\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43m_call_with_config\u001b[49m\u001b[43m(\u001b[49m\n\u001b[1;32m 168\u001b[0m \u001b[43m \u001b[49m\u001b[38;5;28;43;01mlambda\u001b[39;49;00m\u001b[43m \u001b[49m\u001b[43minner_input\u001b[49m\u001b[43m:\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mparse_result\u001b[49m\u001b[43m(\u001b[49m\n\u001b[1;32m 169\u001b[0m \u001b[43m \u001b[49m\u001b[43m[\u001b[49m\u001b[43mChatGeneration\u001b[49m\u001b[43m(\u001b[49m\u001b[43mmessage\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43minner_input\u001b[49m\u001b[43m)\u001b[49m\u001b[43m]\u001b[49m\n\u001b[1;32m 170\u001b[0m \u001b[43m \u001b[49m\u001b[43m)\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 171\u001b[0m \u001b[43m \u001b[49m\u001b[38;5;28;43minput\u001b[39;49m\u001b[43m,\u001b[49m\n\u001b[1;32m 172\u001b[0m \u001b[43m \u001b[49m\u001b[43mconfig\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 173\u001b[0m \u001b[43m \u001b[49m\u001b[43mrun_type\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[38;5;124;43mparser\u001b[39;49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[43m,\u001b[49m\n\u001b[1;32m 174\u001b[0m \u001b[43m \u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 175\u001b[0m \u001b[38;5;28;01melse\u001b[39;00m:\n\u001b[1;32m 176\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_call_with_config(\n\u001b[1;32m 177\u001b[0m \u001b[38;5;28;01mlambda\u001b[39;00m inner_input: \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mparse_result([Generation(text\u001b[38;5;241m=\u001b[39minner_input)]),\n\u001b[1;32m 178\u001b[0m \u001b[38;5;28minput\u001b[39m,\n\u001b[1;32m 179\u001b[0m config,\n\u001b[1;32m 180\u001b[0m run_type\u001b[38;5;241m=\u001b[39m\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mparser\u001b[39m\u001b[38;5;124m\"\u001b[39m,\n\u001b[1;32m 181\u001b[0m )\n", - "File \u001b[0;32m~/.pyenv/versions/3.11.2/lib/python3.11/site-packages/langchain_core/runnables/base.py:975\u001b[0m, in \u001b[0;36mRunnable._call_with_config\u001b[0;34m(self, func, input, config, run_type, **kwargs)\u001b[0m\n\u001b[1;32m 971\u001b[0m context \u001b[38;5;241m=\u001b[39m copy_context()\n\u001b[1;32m 972\u001b[0m context\u001b[38;5;241m.\u001b[39mrun(var_child_runnable_config\u001b[38;5;241m.\u001b[39mset, child_config)\n\u001b[1;32m 973\u001b[0m output \u001b[38;5;241m=\u001b[39m cast(\n\u001b[1;32m 974\u001b[0m Output,\n\u001b[0;32m--> 975\u001b[0m \u001b[43mcontext\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mrun\u001b[49m\u001b[43m(\u001b[49m\n\u001b[1;32m 976\u001b[0m \u001b[43m \u001b[49m\u001b[43mcall_func_with_variable_args\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 977\u001b[0m \u001b[43m \u001b[49m\u001b[43mfunc\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;66;43;03m# type: ignore[arg-type]\u001b[39;49;00m\n\u001b[1;32m 978\u001b[0m \u001b[43m \u001b[49m\u001b[38;5;28;43minput\u001b[39;49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;66;43;03m# type: ignore[arg-type]\u001b[39;49;00m\n\u001b[1;32m 979\u001b[0m \u001b[43m \u001b[49m\u001b[43mconfig\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 980\u001b[0m \u001b[43m \u001b[49m\u001b[43mrun_manager\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 981\u001b[0m \u001b[43m \u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43mkwargs\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 982\u001b[0m \u001b[43m \u001b[49m\u001b[43m)\u001b[49m,\n\u001b[1;32m 983\u001b[0m )\n\u001b[1;32m 984\u001b[0m \u001b[38;5;28;01mexcept\u001b[39;00m \u001b[38;5;167;01mBaseException\u001b[39;00m \u001b[38;5;28;01mas\u001b[39;00m e:\n\u001b[1;32m 985\u001b[0m run_manager\u001b[38;5;241m.\u001b[39mon_chain_error(e)\n", - "File \u001b[0;32m~/.pyenv/versions/3.11.2/lib/python3.11/site-packages/langchain_core/runnables/config.py:323\u001b[0m, in \u001b[0;36mcall_func_with_variable_args\u001b[0;34m(func, input, config, run_manager, **kwargs)\u001b[0m\n\u001b[1;32m 321\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m run_manager \u001b[38;5;129;01mis\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m \u001b[38;5;28;01mNone\u001b[39;00m \u001b[38;5;129;01mand\u001b[39;00m accepts_run_manager(func):\n\u001b[1;32m 322\u001b[0m kwargs[\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mrun_manager\u001b[39m\u001b[38;5;124m\"\u001b[39m] \u001b[38;5;241m=\u001b[39m run_manager\n\u001b[0;32m--> 323\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[43mfunc\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;28;43minput\u001b[39;49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43mkwargs\u001b[49m\u001b[43m)\u001b[49m\n", - "File \u001b[0;32m~/.pyenv/versions/3.11.2/lib/python3.11/site-packages/langchain_core/output_parsers/base.py:168\u001b[0m, in \u001b[0;36mBaseOutputParser.invoke..\u001b[0;34m(inner_input)\u001b[0m\n\u001b[1;32m 163\u001b[0m \u001b[38;5;28;01mdef\u001b[39;00m \u001b[38;5;21minvoke\u001b[39m(\n\u001b[1;32m 164\u001b[0m \u001b[38;5;28mself\u001b[39m, \u001b[38;5;28minput\u001b[39m: Union[\u001b[38;5;28mstr\u001b[39m, BaseMessage], config: Optional[RunnableConfig] \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;01mNone\u001b[39;00m\n\u001b[1;32m 165\u001b[0m ) \u001b[38;5;241m-\u001b[39m\u001b[38;5;241m>\u001b[39m T:\n\u001b[1;32m 166\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;28misinstance\u001b[39m(\u001b[38;5;28minput\u001b[39m, BaseMessage):\n\u001b[1;32m 167\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_call_with_config(\n\u001b[0;32m--> 168\u001b[0m \u001b[38;5;28;01mlambda\u001b[39;00m inner_input: \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mparse_result\u001b[49m\u001b[43m(\u001b[49m\n\u001b[1;32m 169\u001b[0m \u001b[43m \u001b[49m\u001b[43m[\u001b[49m\u001b[43mChatGeneration\u001b[49m\u001b[43m(\u001b[49m\u001b[43mmessage\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43minner_input\u001b[49m\u001b[43m)\u001b[49m\u001b[43m]\u001b[49m\n\u001b[1;32m 170\u001b[0m \u001b[43m \u001b[49m\u001b[43m)\u001b[49m,\n\u001b[1;32m 171\u001b[0m \u001b[38;5;28minput\u001b[39m,\n\u001b[1;32m 172\u001b[0m config,\n\u001b[1;32m 173\u001b[0m run_type\u001b[38;5;241m=\u001b[39m\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mparser\u001b[39m\u001b[38;5;124m\"\u001b[39m,\n\u001b[1;32m 174\u001b[0m )\n\u001b[1;32m 175\u001b[0m \u001b[38;5;28;01melse\u001b[39;00m:\n\u001b[1;32m 176\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_call_with_config(\n\u001b[1;32m 177\u001b[0m \u001b[38;5;28;01mlambda\u001b[39;00m inner_input: \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mparse_result([Generation(text\u001b[38;5;241m=\u001b[39minner_input)]),\n\u001b[1;32m 178\u001b[0m \u001b[38;5;28minput\u001b[39m,\n\u001b[1;32m 179\u001b[0m config,\n\u001b[1;32m 180\u001b[0m run_type\u001b[38;5;241m=\u001b[39m\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mparser\u001b[39m\u001b[38;5;124m\"\u001b[39m,\n\u001b[1;32m 181\u001b[0m )\n", - "File \u001b[0;32m~/.pyenv/versions/3.11.2/lib/python3.11/site-packages/langchain_core/output_parsers/base.py:219\u001b[0m, in \u001b[0;36mBaseOutputParser.parse_result\u001b[0;34m(self, result, partial)\u001b[0m\n\u001b[1;32m 206\u001b[0m \u001b[38;5;28;01mdef\u001b[39;00m \u001b[38;5;21mparse_result\u001b[39m(\u001b[38;5;28mself\u001b[39m, result: List[Generation], \u001b[38;5;241m*\u001b[39m, partial: \u001b[38;5;28mbool\u001b[39m \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;01mFalse\u001b[39;00m) \u001b[38;5;241m-\u001b[39m\u001b[38;5;241m>\u001b[39m T:\n\u001b[1;32m 207\u001b[0m \u001b[38;5;250m \u001b[39m\u001b[38;5;124;03m\"\"\"Parse a list of candidate model Generations into a specific format.\u001b[39;00m\n\u001b[1;32m 208\u001b[0m \n\u001b[1;32m 209\u001b[0m \u001b[38;5;124;03m The return value is parsed from only the first Generation in the result, which\u001b[39;00m\n\u001b[0;32m (...)\u001b[0m\n\u001b[1;32m 217\u001b[0m \u001b[38;5;124;03m Structured output.\u001b[39;00m\n\u001b[1;32m 218\u001b[0m \u001b[38;5;124;03m \"\"\"\u001b[39;00m\n\u001b[0;32m--> 219\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mparse\u001b[49m\u001b[43m(\u001b[49m\u001b[43mresult\u001b[49m\u001b[43m[\u001b[49m\u001b[38;5;241;43m0\u001b[39;49m\u001b[43m]\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mtext\u001b[49m\u001b[43m)\u001b[49m\n", - "Cell \u001b[0;32mIn[1], line 88\u001b[0m, in \u001b[0;36mLLMCompilerPlanParser.parse\u001b[0;34m(self, text)\u001b[0m\n\u001b[1;32m 86\u001b[0m parser \u001b[38;5;241m=\u001b[39m ActionParserFSM()\n\u001b[1;32m 87\u001b[0m graph_dict \u001b[38;5;241m=\u001b[39m {}\n\u001b[0;32m---> 88\u001b[0m \u001b[43m\u001b[49m\u001b[38;5;28;43;01mfor\u001b[39;49;00m\u001b[43m \u001b[49m\u001b[43mtask\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;129;43;01min\u001b[39;49;00m\u001b[43m \u001b[49m\u001b[43mparser\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mparse\u001b[49m\u001b[43m(\u001b[49m\u001b[43mtext\u001b[49m\u001b[43m)\u001b[49m\u001b[43m:\u001b[49m\n\u001b[1;32m 89\u001b[0m \u001b[43m \u001b[49m\u001b[43midx\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43m \u001b[49m\u001b[38;5;28;43mint\u001b[39;49m\u001b[43m(\u001b[49m\u001b[43mtask\u001b[49m\u001b[43m[\u001b[49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[38;5;124;43mtask_index\u001b[39;49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[43m]\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 91\u001b[0m \u001b[43m \u001b[49m\u001b[43mtask\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43m \u001b[49m\u001b[43minstantiate_task\u001b[49m\u001b[43m(\u001b[49m\n\u001b[1;32m 92\u001b[0m \u001b[43m \u001b[49m\u001b[43mtools\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mtools\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 93\u001b[0m \u001b[43m \u001b[49m\u001b[43midx\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43midx\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 94\u001b[0m \u001b[43m \u001b[49m\u001b[43mtool_name\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mtask\u001b[49m\u001b[43m[\u001b[49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[38;5;124;43mtool_name\u001b[39;49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[43m]\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 95\u001b[0m \u001b[43m \u001b[49m\u001b[43margs\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mtask\u001b[49m\u001b[43m[\u001b[49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[38;5;124;43margs\u001b[39;49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[43m]\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 96\u001b[0m \u001b[43m \u001b[49m\u001b[43m)\u001b[49m\n", - "Cell \u001b[0;32mIn[1], line 29\u001b[0m, in \u001b[0;36mActionParserFSM.parse\u001b[0;34m(self, text)\u001b[0m\n\u001b[1;32m 27\u001b[0m \u001b[38;5;28;01mdef\u001b[39;00m \u001b[38;5;21mparse\u001b[39m(\u001b[38;5;28mself\u001b[39m, text: \u001b[38;5;28mstr\u001b[39m):\n\u001b[1;32m 28\u001b[0m \u001b[38;5;28;01mfor\u001b[39;00m char \u001b[38;5;129;01min\u001b[39;00m text:\n\u001b[0;32m---> 29\u001b[0m action \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mprocess_char\u001b[49m\u001b[43m(\u001b[49m\u001b[43mchar\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 30\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m action:\n\u001b[1;32m 31\u001b[0m \u001b[38;5;28;01myield\u001b[39;00m action\n", - "Cell \u001b[0;32mIn[1], line 61\u001b[0m, in \u001b[0;36mActionParserFSM.process_char\u001b[0;34m(self, char)\u001b[0m\n\u001b[1;32m 59\u001b[0m \u001b[38;5;28;01melif\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mstate \u001b[38;5;241m==\u001b[39m \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mCOMMENT\u001b[39m\u001b[38;5;124m\"\u001b[39m:\n\u001b[1;32m 60\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m char \u001b[38;5;241m==\u001b[39m \u001b[38;5;124m\"\u001b[39m\u001b[38;5;130;01m\\n\u001b[39;00m\u001b[38;5;124m\"\u001b[39m:\n\u001b[0;32m---> 61\u001b[0m action \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43msave_action\u001b[49m\u001b[43m(\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 62\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mreset()\n\u001b[1;32m 63\u001b[0m \u001b[38;5;28;01melse\u001b[39;00m:\n", - "Cell \u001b[0;32mIn[1], line 69\u001b[0m, in \u001b[0;36mActionParserFSM.save_action\u001b[0;34m(self)\u001b[0m\n\u001b[1;32m 67\u001b[0m \u001b[38;5;28;01mdef\u001b[39;00m \u001b[38;5;21msave_action\u001b[39m(\u001b[38;5;28mself\u001b[39m):\n\u001b[1;32m 68\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mtask_index \u001b[38;5;129;01mand\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39maction:\n\u001b[0;32m---> 69\u001b[0m parsed_action \u001b[38;5;241m=\u001b[39m \u001b[43mjson\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mloads\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43maction\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mstrip\u001b[49m\u001b[43m(\u001b[49m\u001b[43m)\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 70\u001b[0m tool_name, args \u001b[38;5;241m=\u001b[39m \u001b[38;5;28mnext\u001b[39m(\u001b[38;5;28miter\u001b[39m(parsed_action\u001b[38;5;241m.\u001b[39mitems()))\n\u001b[1;32m 71\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m {\n\u001b[1;32m 72\u001b[0m \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mtask_index\u001b[39m\u001b[38;5;124m\"\u001b[39m: \u001b[38;5;28mint\u001b[39m(\u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mtask_index),\n\u001b[1;32m 73\u001b[0m \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mtool_name\u001b[39m\u001b[38;5;124m\"\u001b[39m: tool_name,\n\u001b[1;32m 74\u001b[0m \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124margs\u001b[39m\u001b[38;5;124m\"\u001b[39m: args,\n\u001b[1;32m 75\u001b[0m }\n", - "File \u001b[0;32m~/.pyenv/versions/3.11.2/lib/python3.11/json/__init__.py:346\u001b[0m, in \u001b[0;36mloads\u001b[0;34m(s, cls, object_hook, parse_float, parse_int, parse_constant, object_pairs_hook, **kw)\u001b[0m\n\u001b[1;32m 341\u001b[0m s \u001b[38;5;241m=\u001b[39m s\u001b[38;5;241m.\u001b[39mdecode(detect_encoding(s), \u001b[38;5;124m'\u001b[39m\u001b[38;5;124msurrogatepass\u001b[39m\u001b[38;5;124m'\u001b[39m)\n\u001b[1;32m 343\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m (\u001b[38;5;28mcls\u001b[39m \u001b[38;5;129;01mis\u001b[39;00m \u001b[38;5;28;01mNone\u001b[39;00m \u001b[38;5;129;01mand\u001b[39;00m object_hook \u001b[38;5;129;01mis\u001b[39;00m \u001b[38;5;28;01mNone\u001b[39;00m \u001b[38;5;129;01mand\u001b[39;00m\n\u001b[1;32m 344\u001b[0m parse_int \u001b[38;5;129;01mis\u001b[39;00m \u001b[38;5;28;01mNone\u001b[39;00m \u001b[38;5;129;01mand\u001b[39;00m parse_float \u001b[38;5;129;01mis\u001b[39;00m \u001b[38;5;28;01mNone\u001b[39;00m \u001b[38;5;129;01mand\u001b[39;00m\n\u001b[1;32m 345\u001b[0m parse_constant \u001b[38;5;129;01mis\u001b[39;00m \u001b[38;5;28;01mNone\u001b[39;00m \u001b[38;5;129;01mand\u001b[39;00m object_pairs_hook \u001b[38;5;129;01mis\u001b[39;00m \u001b[38;5;28;01mNone\u001b[39;00m \u001b[38;5;129;01mand\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m kw):\n\u001b[0;32m--> 346\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[43m_default_decoder\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mdecode\u001b[49m\u001b[43m(\u001b[49m\u001b[43ms\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 347\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;28mcls\u001b[39m \u001b[38;5;129;01mis\u001b[39;00m \u001b[38;5;28;01mNone\u001b[39;00m:\n\u001b[1;32m 348\u001b[0m \u001b[38;5;28mcls\u001b[39m \u001b[38;5;241m=\u001b[39m JSONDecoder\n", - "File \u001b[0;32m~/.pyenv/versions/3.11.2/lib/python3.11/json/decoder.py:337\u001b[0m, in \u001b[0;36mJSONDecoder.decode\u001b[0;34m(self, s, _w)\u001b[0m\n\u001b[1;32m 332\u001b[0m \u001b[38;5;28;01mdef\u001b[39;00m \u001b[38;5;21mdecode\u001b[39m(\u001b[38;5;28mself\u001b[39m, s, _w\u001b[38;5;241m=\u001b[39mWHITESPACE\u001b[38;5;241m.\u001b[39mmatch):\n\u001b[1;32m 333\u001b[0m \u001b[38;5;250m \u001b[39m\u001b[38;5;124;03m\"\"\"Return the Python representation of ``s`` (a ``str`` instance\u001b[39;00m\n\u001b[1;32m 334\u001b[0m \u001b[38;5;124;03m containing a JSON document).\u001b[39;00m\n\u001b[1;32m 335\u001b[0m \n\u001b[1;32m 336\u001b[0m \u001b[38;5;124;03m \"\"\"\u001b[39;00m\n\u001b[0;32m--> 337\u001b[0m obj, end \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mraw_decode\u001b[49m\u001b[43m(\u001b[49m\u001b[43ms\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43midx\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43m_w\u001b[49m\u001b[43m(\u001b[49m\u001b[43ms\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;241;43m0\u001b[39;49m\u001b[43m)\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mend\u001b[49m\u001b[43m(\u001b[49m\u001b[43m)\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 338\u001b[0m end \u001b[38;5;241m=\u001b[39m _w(s, end)\u001b[38;5;241m.\u001b[39mend()\n\u001b[1;32m 339\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m end \u001b[38;5;241m!=\u001b[39m \u001b[38;5;28mlen\u001b[39m(s):\n", - "File \u001b[0;32m~/.pyenv/versions/3.11.2/lib/python3.11/json/decoder.py:355\u001b[0m, in \u001b[0;36mJSONDecoder.raw_decode\u001b[0;34m(self, s, idx)\u001b[0m\n\u001b[1;32m 353\u001b[0m obj, end \u001b[38;5;241m=\u001b[39m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mscan_once(s, idx)\n\u001b[1;32m 354\u001b[0m \u001b[38;5;28;01mexcept\u001b[39;00m \u001b[38;5;167;01mStopIteration\u001b[39;00m \u001b[38;5;28;01mas\u001b[39;00m err:\n\u001b[0;32m--> 355\u001b[0m \u001b[38;5;28;01mraise\u001b[39;00m JSONDecodeError(\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mExpecting value\u001b[39m\u001b[38;5;124m\"\u001b[39m, s, err\u001b[38;5;241m.\u001b[39mvalue) \u001b[38;5;28;01mfrom\u001b[39;00m \u001b[38;5;28;01mNone\u001b[39;00m\n\u001b[1;32m 356\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m obj, end\n", - "\u001b[0;31mJSONDecodeError\u001b[0m: Expecting value: line 1 column 1 (char 0)" - ] - } - ], - "source": [ - "result = chain.invoke(\n", - " {\"input\": \"How much larger is the GDP of the UK than that of New York?\"}\n", - ")" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "a157cd88-2e54-4525-8126-6d22affa31d7", - "metadata": {}, - "outputs": [], - "source": [] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 3 (ipykernel)", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.11.2" - } - }, - "nbformat": 4, - "nbformat_minor": 5 -} diff --git a/examples/advanced_agents/llm_compiler/LLMCompiler.ipynb b/examples/advanced_agents/llm_compiler/LLMCompiler.ipynb new file mode 100644 index 000000000..20e0097fd --- /dev/null +++ b/examples/advanced_agents/llm_compiler/LLMCompiler.ipynb @@ -0,0 +1,1036 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "0c8b472b-f3fb-46c2-841f-930a4692697b", + "metadata": {}, + "source": [ + "# Implementing LLMCompiler using LangGraph\n", + "By Kim, et. al [đŸ”—](https://arxiv.org/abs/2312.04511)\n", + "\n", + "LLMCompiler is an agent architecture intented on speeding up the latency of agentic tasks via fast, parallel tool execution. It has 3 main components:\n", + "\n", + "1. Planner: generate a DAG of tasks.\n", + "2. Task Fetching Unit: schedules and executes the tasks\n", + "3. Joiner: Responds to the user or triggers a second plan\n", + "\n", + "\n", + "This notebook walks through each component and shows how to wire them together using LangGraph." + ] + }, + { + "cell_type": "markdown", + "id": "1abdedbd-d81b-4ee9-b46f-f29439ed1350", + "metadata": {}, + "source": [ + "# Part 1: Planner\n", + "\n", + "\n", + "Largely adapted from [the original source code](https://github.com/SqueezeAILab/LLMCompiler/blob/main/src/llm_compiler/output_parser.py), the planner accepts the input question and generates a task list to execute.\n", + "\n", + "If it is provided with a previous plan, it is instructed to re-plan, which is useful if, upon completion of the first batch of tasks, the agent must take more actions.\n", + "\n", + "The code below composes constructs the prompt template for the planner and composes it with LLM and output parser, defined in [output_parser.py](./output_parser.py). The output parser processes a task list in the following form:\n", + "\n", + "```plaintext\n", + "1. tool_1(arg1=\"arg1\", arg2=3.5, ...)\n", + "Thought: I then want to find out Y by using tool_2\n", + "2. tool_2(arg1=\"\", arg2=\"${1}\")'\n", + "3. join()\"\n", + "```\n", + "\n", + "The \"Thought\" lines are optional. The `${#}` placeholders are variables. These are used to route tool (task) outputs to other tools." + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "id": "15dd9639-691f-4906-9012-83fd6e9ac126", + "metadata": {}, + "outputs": [], + "source": [ + "from typing import Optional, Sequence\n", + "\n", + "from langchain.chat_models.base import BaseChatModel\n", + "from langchain_core.prompts import ChatPromptTemplate\n", + "from langchain_core.runnables import RunnableBranch\n", + "from langchain_core.tools import BaseTool\n", + "from llm_compiler.output_parser import LLMCompilerPlanParser\n", + "\n", + "END_OF_PLAN = \"\"\n", + "\n", + "\n", + "# The required extra \"tool\"\n", + "JOIN_DESCRIPTION = (\n", + " \"join():\\n\"\n", + " \" - Collects and combines results from prior actions.\\n\"\n", + " \" - A LLM agent is called upon invoking join to either finalize the user query or wait until the plans are executed.\\n\"\n", + " \" - join should always be the last action in the plan, and will be called in two scenarios:\\n\"\n", + " \" (a) if the answer can be determined by gathering the outputs from tasks to generate the final response.\\n\"\n", + " \" (b) if the answer cannot be determined in the planning phase before you execute the plans. \"\n", + ")\n", + "\n", + "planner_prompt_tmpl_str = (\n", + " \"Given a user query, create a plan to solve it with the utmost parallelizability. \"\n", + " \"Each plan should comprise an action from the following {num_tools} types:\\n\"\n", + " \"{tool_descriptions}\"\n", + " f\"\\n{{num_toolsp1}}. {JOIN_DESCRIPTION}\"\n", + " \"Guidelines:\\n\"\n", + " \" - Each action described above contains input/output types and description.\\n\"\n", + " \" - You must strictly adhere to the input and output types for each action.\\n\"\n", + " \" - The action descriptions contain the guidelines. You MUST strictly follow those guidelines when you use the actions.\\n\"\n", + " \" - Each action in the plan should strictly be one of the above types. Follow the Python conventions for each action.\\n\"\n", + " \" - Each action MUST have a unique ID, which is strictly increasing.\\n\"\n", + " \" - Inputs for actions can either be constants or outputs from preceding actions. \"\n", + " \"In the latter case, use the format $id to denote the ID of the previous action whose output will be the input.\\n\"\n", + " f\" - Always call join as the last action in the plan. Say '{END_OF_PLAN}' after you call join\\n\"\n", + " \" - Ensure the plan maximizes parallelizability.\\n\"\n", + " \" - Only use the provided action types. If a query cannot be addressed using these, invoke the join action for the next steps.\\n\"\n", + " \" - Never introduce new actions other than the ones provided.\\n\\n\"\n", + " \"{replan}\"\n", + " \"{examples}\"\n", + ")\n", + "\n", + "\n", + "def _generate_planner_prompt(\n", + " tools: Sequence[BaseTool],\n", + " example_prompt=str,\n", + "):\n", + " tool_descriptions = \"\\n\".join(\n", + " f\"{i+1}. {tool.name}: {tool.description}\" for i, tool in enumerate(tools)\n", + " )\n", + " planner_prompt_template = ChatPromptTemplate.from_messages(\n", + " [(\"system\", planner_prompt_tmpl_str), (\"user\", \"Question: {input}{context}\")]\n", + " ).partial(\n", + " tool_descriptions=tool_descriptions,\n", + " examples=\"Here are some examples:\\n\\n\" + example_prompt\n", + " if example_prompt\n", + " else \"\",\n", + " num_tools=len(tools),\n", + " num_toolsp1=len(tools) + 1,\n", + " )\n", + "\n", + " return planner_prompt_template\n", + "\n", + "\n", + "def create_planner(\n", + " llm: BaseChatModel,\n", + " example_prompt: str,\n", + " tools: Sequence[BaseTool],\n", + " stop: Optional[list[str]] = None,\n", + "):\n", + " og_planner_prompt = _generate_planner_prompt(tools, example_prompt).partial(\n", + " replan=\"\",\n", + " context=\"\",\n", + " )\n", + " replanner_prompt = _generate_planner_prompt(tools, example_prompt).partial(\n", + " replan=' - You are given \"Previous Plan\" which is the plan that the previous agent created along with the execution results '\n", + " \"(given as Observation) of each plan and a general thought (given as Thought) about the executed results.\"\n", + " 'You MUST use these information to create the next plan under \"Current Plan\".\\n'\n", + " ' - When starting the Current Plan, you should start with \"Thought\" that outlines the strategy for the next plan.\\n'\n", + " \" - In the Current Plan, you should NEVER repeat the actions that are already executed in the Previous Plan.\\n\"\n", + " \" - You must continue the task index from the end of the previous one. Do not repeat task indices.\"\n", + " )\n", + " bound_llm = llm.bind(stop=stop)\n", + " return (\n", + " RunnableBranch(\n", + " ((lambda x: x.get(\"context\") is not None), replanner_prompt),\n", + " og_planner_prompt,\n", + " )\n", + " | bound_llm\n", + " | LLMCompilerPlanParser(tools=tools)\n", + " )" + ] + }, + { + "cell_type": "markdown", + "id": "7feb5c82-b1a9-40ae-863a-0362fe3ce5ea", + "metadata": {}, + "source": [ + "#### Example usage\n", + "\n", + "Here's an example usage of the planner module." + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "id": "3fe074ea-7314-47a7-9a9f-a8e6191ea1f3", + "metadata": {}, + "outputs": [], + "source": [ + "from typing import Optional\n", + "\n", + "from langchain.tools import tool\n", + "from langchain_openai import ChatOpenAI\n", + "\n", + "\n", + "@tool\n", + "def get_user_id(first_name: str, last_name: str) -> Optional[int]:\n", + " \"\"\"Query the user IDs of everyone with the provided name.\"\"\"\n", + " student_ids = {\n", + " (\"Eric\", \"Zhang\"): 1432,\n", + " (\"Sam\", \"Van Damm\"): 8523,\n", + " (\"Will\", \"Van Damm\"): 2341,\n", + " }\n", + " return student_ids.get((first_name, last_name))\n", + "\n", + "\n", + "@tool\n", + "def get_scores(class_name: str, user_id: int) -> Optional[str]:\n", + " \"\"\"Query the class registry for grades of the provided user ID.\"\"\"\n", + " return {\n", + " (\"Geology\", 1432): \"A+\",\n", + " (\"Geology\", 8523): \"A\",\n", + " (\"Geology\", 2341): \"B\",\n", + " }.get((class_name, user_id))\n", + "\n", + "\n", + "examples = (\n", + " \"Question: What's the user ID for Johnny Drop Tables?\\n\"\n", + " '1. get_user_id(first_name=\"Johnny\", \"ast_name=\"Drop Tables\")\\n'\n", + " f\"2. join(){END_OF_PLAN}\\n\"\n", + " \"###\\n\"\n", + " \"\\n\"\n", + " \"Question: What was Eric Zhang's score in Calc?\\n\"\n", + " '1. get_user_id(\"Eric\")\\n'\n", + " '2. get_scores(\"calc\", \"$1\")\\n'\n", + " f\"3. join(){END_OF_PLAN}\\n\"\n", + " \"###\\n\"\n", + " \"\\n\"\n", + ")\n", + "\n", + "planner = create_planner(\n", + " ChatOpenAI(model=\"gpt-3.5-turbo\"),\n", + " example_prompt=examples,\n", + " tools=[get_user_id, get_scores],\n", + ")" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "id": "55fb0f99-4e59-4e5a-b687-a90bb4d06d39", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "{1: {'idx': 1,\n", + " 'tool': StructuredTool(name='get_user_id', description='get_user_id(first_name: str, last_name: str) -> Optional[int] - Query the user IDs of everyone with the provided name.', args_schema=, func=),\n", + " 'args': {'first_name': 'Sam', 'last_name': 'Van Damm'},\n", + " 'dependencies': [],\n", + " 'thought': None},\n", + " 2: {'idx': 2,\n", + " 'tool': StructuredTool(name='get_user_id', description='get_user_id(first_name: str, last_name: str) -> Optional[int] - Query the user IDs of everyone with the provided name.', args_schema=, func=),\n", + " 'args': {'first_name': 'Will', 'last_name': 'Van Damm'},\n", + " 'dependencies': [],\n", + " 'thought': None},\n", + " 3: {'idx': 3,\n", + " 'tool': StructuredTool(name='get_scores', description='get_scores(class_name: str, user_id: int) -> Optional[str] - Query the class registry for grades of the provided user ID.', args_schema=, func=),\n", + " 'args': {'class_name': 'Calc BC', 'user_id': '$1'},\n", + " 'dependencies': [1],\n", + " 'thought': None},\n", + " 4: {'idx': 4,\n", + " 'tool': StructuredTool(name='get_scores', description='get_scores(class_name: str, user_id: int) -> Optional[str] - Query the class registry for grades of the provided user ID.', args_schema=, func=),\n", + " 'args': {'class_name': 'Calc BC', 'user_id': '$2'},\n", + " 'dependencies': [2],\n", + " 'thought': None},\n", + " 5: {'idx': 5,\n", + " 'tool': 'join',\n", + " 'args': (),\n", + " 'dependencies': [1, 2, 3, 4],\n", + " 'thought': None}}" + ] + }, + "execution_count": 3, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "tasks = planner.invoke(\n", + " {\"input\": \"What are the Calc BC grades for Sam and Will Van Damm?\"}\n", + ")\n", + "tasks" + ] + }, + { + "cell_type": "markdown", + "id": "5d0e795f-61ff-4553-9823-23e7624ca180", + "metadata": {}, + "source": [ + "## 2. Task Fetching Unit\n", + "\n", + "This component schedules the tasks. In the paper, it's kept separate from the \"executor\", but here we create a single DAG defined in LangChain expression language.\n", + "\n", + "The basic idea is that, given a list of dicts of the form:\n", + "\n", + "```typescript\n", + "{\n", + " tool: BaseTool,\n", + " dependencies: number[],\n", + "}\n", + "```\n", + "\n", + "1. Create a topological sort of the tasks\n", + "2. Execute them on the previous step's output, ensuring to perform variable substitution where appropriate\n", + "\n", + "If we make the assumption that the tasks generated by the LLM are already sorted, we could adapt this to execute in a purely streaming fashion." + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "id": "c70a0e28-43db-4ea2-af48-8a2f310dce83", + "metadata": {}, + "outputs": [], + "source": [ + "import functools\n", + "from typing import Any, Union\n", + "\n", + "from langchain_core.runnables import (\n", + " RunnableLambda,\n", + " RunnableParallel,\n", + " RunnablePassthrough,\n", + ")\n", + "\n", + "\n", + "def _sort_tasks(data):\n", + " if not data:\n", + " return []\n", + " sorted_tasks = []\n", + " # Remove tasks already completed\n", + " min_idx = min([int(k) for k in data])\n", + " data = {\n", + " int(k): {\n", + " **v,\n", + " \"dependencies\": [dep for dep in v[\"dependencies\"] if dep >= min_idx],\n", + " }\n", + " for k, v in data.items()\n", + " }\n", + " while data:\n", + " no_deps = {k: v for k, v in data.items() if not v[\"dependencies\"]}\n", + " if not no_deps:\n", + " raise ValueError(\"We seem to have run into a circular dependency.\")\n", + "\n", + " sorted_tasks.append(no_deps)\n", + " data = {\n", + " k: {\n", + " **v,\n", + " \"dependencies\": [d for d in v[\"dependencies\"] if d not in no_deps],\n", + " }\n", + " for k, v in data.items()\n", + " if k not in no_deps\n", + " }\n", + " return sorted_tasks\n", + "\n", + "\n", + "def _resolve_arg(x: dict, arg: Union[str, Any]):\n", + " if isinstance(arg, str) and arg.startswith(\"$\"):\n", + " try:\n", + " return x[f\"task_{arg[1:]}\"]\n", + " except:\n", + " if arg.endswith(\".output\"):\n", + " return x[f\"task_{arg[1:-7]}\"]\n", + " raise\n", + " else:\n", + " return arg\n", + "\n", + "\n", + "def _execute_task(x, task):\n", + " tool_to_use = task[\"tool\"]\n", + " args = task[\"args\"]\n", + " if isinstance(args, str):\n", + " resolved_args = _resolve_arg(x, args)\n", + " elif isinstance(args, dict):\n", + " resolved_args = {key: _resolve_arg(x, val) for key, val in args.items()}\n", + " else:\n", + " # This will likely fail\n", + " resolved_args = args\n", + " try:\n", + " return tool_to_use.invoke(resolved_args)\n", + " except Exception as e:\n", + " return (\n", + " f\"ERROR(Failed to call tool {tool_to_use} with args {tool_to_use}.\"\n", + " + f\" Args resolved to {resolved_args}. Error: {repr(e)})\"\n", + " )\n", + "\n", + "\n", + "def construct_dag(tasks):\n", + " sorted_tasks = _sort_tasks(tasks)\n", + " chain = None\n", + " for idx, task_group in enumerate(sorted_tasks):\n", + " if len(task_group) == 1 and next(iter(task_group.values()))[\"tool\"] == \"join\":\n", + " step = lambda x: {\"join\": x}\n", + " else:\n", + " # Cascade all results forward\n", + " constructor = (\n", + " RunnableParallel if chain is None else RunnablePassthrough.assign\n", + " )\n", + " task_dict = {}\n", + " for idx, task in task_group.items():\n", + " task_dict[f\"task_{idx}\"] = RunnableLambda(\n", + " functools.partial(_execute_task, task=task)\n", + " ).with_config(run_name=f\"task_{idx}\")\n", + "\n", + " step = constructor(**task_dict).with_config(run_name=f\"TaskGroup{idx}\")\n", + " if chain is None:\n", + " chain = step\n", + " else:\n", + " chain |= step\n", + "\n", + " if chain is not None:\n", + " return chain | RunnablePassthrough.assign(tasks=lambda _: tasks)\n", + " return chain" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "id": "87f11cea-3a8d-479c-8a9e-81223dbbc1f5", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + " +------------------------------+ \n", + " | ParallelInput | \n", + " +------------------------------+ \n", + " *** *** \n", + " ** ** \n", + " ** ** \n", + " +-------------+ +-------------+ \n", + " | Lambda(...) | | Lambda(...) | \n", + " +-------------+ +-------------+ \n", + " *** *** \n", + " ** ** \n", + " ** ** \n", + " +-------------------------------+ \n", + " | ParallelOutput | \n", + " +-------------------------------+ \n", + " * \n", + " * \n", + " * \n", + " +------------------------------+ \n", + " | ParallelInput | \n", + " +------------------------------+ \n", + " ***** * ***** \n", + " ***** * ***** \n", + " *** * *** \n", + "+-------------+ +-------------+ +-------------+ \n", + "| Lambda(...) | | Lambda(...) | | Passthrough | \n", + "+-------------+***** +-------------+ *****+-------------+ \n", + " ***** * ***** \n", + " ***** * ***** \n", + " *** * *** \n", + " +-------------------------------+ \n", + " | ParallelOutput | \n", + " +-------------------------------+ \n", + " * \n", + " * \n", + " * \n", + " +-------------------------------+ \n", + " | Lambda(lambda x: {'join': x}) | \n", + " +-------------------------------+ \n", + " * \n", + " * \n", + " * \n", + " +----------------------+ \n", + " | ParallelInput | \n", + " +----------------------+ \n", + " *** *** \n", + " *** *** \n", + " ** ** \n", + " +-------------------------+ +-------------+ \n", + " | Lambda(lambda _: tasks) | | Passthrough | \n", + " +-------------------------+ +-------------+ \n", + " *** *** \n", + " *** *** \n", + " ** ** \n", + " +-----------------------+ \n", + " | ParallelOutput | \n", + " +-----------------------+ \n" + ] + } + ], + "source": [ + "graph = construct_dag(tasks)\n", + "graph.get_graph().print_ascii()" + ] + }, + { + "cell_type": "markdown", + "id": "9efa15ae-817a-48c6-86ed-16bc112fedc5", + "metadata": {}, + "source": [ + "#### Example Plan\n", + "\n", + "We still haven't introduced any cycles in our computation graph, so this is all easily expressed in LCEL." + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "id": "133d124a-0d41-4c6d-a86a-34fa4cb1430f", + "metadata": {}, + "outputs": [], + "source": [ + "chain = planner | construct_dag" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "id": "55142257-2674-4a47-988e-0d2810917329", + "metadata": {}, + "outputs": [], + "source": [ + "example_question = \"Did Sam Van Damm score higher than Eric Zhang in Geology?\"\n", + "task_results = chain.invoke({\"input\": example_question})\n", + "# task_results[\"join\"]" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "id": "9996d98f-0e73-471f-baa8-d8b72d10c7cf", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "{'join': {'task_1': 8523,\n", + " 'task_2': 1432,\n", + " 'task_3': \"ERROR(Failed to call tool name='get_scores' description='get_scores(class_name: str, user_id: int) -> Optional[str] - Query the class registry for grades of the provided user ID.' args_schema= func= with args name='get_scores' description='get_scores(class_name: str, user_id: int) -> Optional[str] - Query the class registry for grades of the provided user ID.' args_schema= func=. Args resolved to {}. Error: ValidationError(model='get_scoresSchemaSchema', errors=[{'loc': ('class_name',), 'msg': 'field required', 'type': 'value_error.missing'}, {'loc': ('user_id',), 'msg': 'field required', 'type': 'value_error.missing'}]))\",\n", + " 'task_4': \"ERROR(Failed to call tool name='get_scores' description='get_scores(class_name: str, user_id: int) -> Optional[str] - Query the class registry for grades of the provided user ID.' args_schema= func= with args name='get_scores' description='get_scores(class_name: str, user_id: int) -> Optional[str] - Query the class registry for grades of the provided user ID.' args_schema= func=. Args resolved to {}. Error: ValidationError(model='get_scoresSchemaSchema', errors=[{'loc': ('class_name',), 'msg': 'field required', 'type': 'value_error.missing'}, {'loc': ('user_id',), 'msg': 'field required', 'type': 'value_error.missing'}]))\"},\n", + " 'tasks': {1: {'idx': 1,\n", + " 'tool': StructuredTool(name='get_user_id', description='get_user_id(first_name: str, last_name: str) -> Optional[int] - Query the user IDs of everyone with the provided name.', args_schema=, func=),\n", + " 'args': {'first_name': 'Sam', 'last_name': 'Van Damm'},\n", + " 'dependencies': [],\n", + " 'thought': None},\n", + " 2: {'idx': 2,\n", + " 'tool': StructuredTool(name='get_user_id', description='get_user_id(first_name: str, last_name: str) -> Optional[int] - Query the user IDs of everyone with the provided name.', args_schema=, func=),\n", + " 'args': {'first_name': 'Eric', 'last_name': 'Zhang'},\n", + " 'dependencies': [],\n", + " 'thought': None},\n", + " 3: {'idx': 3,\n", + " 'tool': StructuredTool(name='get_scores', description='get_scores(class_name: str, user_id: int) -> Optional[str] - Query the class registry for grades of the provided user ID.', args_schema=, func=),\n", + " 'args': {},\n", + " 'dependencies': [],\n", + " 'thought': None},\n", + " 4: {'idx': 4,\n", + " 'tool': StructuredTool(name='get_scores', description='get_scores(class_name: str, user_id: int) -> Optional[str] - Query the class registry for grades of the provided user ID.', args_schema=, func=),\n", + " 'args': {},\n", + " 'dependencies': [],\n", + " 'thought': None},\n", + " 5: {'idx': 5,\n", + " 'tool': 'join',\n", + " 'args': (),\n", + " 'dependencies': [1, 2, 3, 4],\n", + " 'thought': None}}}" + ] + }, + "execution_count": 8, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "task_results" + ] + }, + { + "cell_type": "markdown", + "id": "563d5311-55f0-4ca1-afbd-01fd970cf3e3", + "metadata": {}, + "source": [ + "## 3. \"Joiner\" \n", + "\n", + "So now we have the planning and initial execution done. We need a component to process these outputs and either:\n", + "\n", + "1. Respond with the correct answer.\n", + "2. Loop with a new plan.\n", + "\n", + "The paper refers to this as the \"joiner\". It's another LLM call, defined below:" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "id": "2978991e-45a4-44e6-9deb-f941f44fe93a", + "metadata": {}, + "outputs": [], + "source": [ + "from langchain_core.output_parsers import StrOutputParser\n", + "from typing_extensions import TypedDict\n", + "\n", + "\n", + "def format_task(task, idx):\n", + " tool = task[\"tool\"]\n", + " tool_name = tool if isinstance(tool, str) else tool.name # Handle join()\n", + " args = \", \".join([f\"{k}={v}\" for k, v in task[\"args\"].items()])\n", + " return f\"{idx}. {tool_name}({args})\"\n", + "\n", + "\n", + "def format_tasks(executor_output: dict):\n", + " tasks = executor_output[\"tasks\"]\n", + " prior_observations = executor_output.get(\"observations\")\n", + " joined_output = executor_output[\"join\"]\n", + " execution_results = []\n", + " for idx, task in tasks.items():\n", + " observation_idx = f\"task_{idx}\"\n", + " if observation_idx in joined_output:\n", + " observation = joined_output[observation_idx]\n", + " execution_results.append(f\"{format_task(task, idx)}\\n\\t=> {observation}\")\n", + " joined_results = \"\\n\".join(execution_results)\n", + " result = f\"Executed plan results:\\n{joined_results}\"\n", + " if prior_observations:\n", + " result += f\"\\nPrevious Results:\\n{prior_observations}\"\n", + " return result\n", + "\n", + "\n", + "def _parse_joiner_output(raw_answer: str) -> str:\n", + " thought, answer, is_replan = \"\", \"\", False # default values\n", + " raw_answers = raw_answer.split(\"\\n\")\n", + " for ans in raw_answers:\n", + " if ans.startswith(\"Action:\"):\n", + " answer = ans[ans.find(\"(\") + 1 : ans.find(\")\")]\n", + " is_replan = JOINER_REPLAN in ans\n", + " elif ans.startswith(\"Thought:\"):\n", + " thought = ans.split(\"Thought:\")[1].strip()\n", + " if is_replan:\n", + " return {\"thought\": thought, \"context\": answer}\n", + " else:\n", + " return {\"thought\": thought, \"answer\": answer}" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "id": "b2feea5a-e0e4-4cff-8cb5-fdbfec95ba57", + "metadata": {}, + "outputs": [], + "source": [ + "from langchain_core.prompts import ChatPromptTemplate\n", + "\n", + "\n", + "def create_joiner(prompt, llm):\n", + " return (\n", + " (\n", + " lambda x: {\n", + " **x[\"plan\"],\n", + " \"input\": x[\"input\"],\n", + " \"context\": x.get(\"context\"),\n", + " \"observations\": x.get(\"observations\"),\n", + " }\n", + " )\n", + " | RunnablePassthrough.assign(scratchpad=format_tasks)\n", + " | ChatPromptTemplate.from_messages([(\"system\", prompt), (\"user\", \"{input}\")])\n", + " | llm\n", + " | StrOutputParser()\n", + " | _parse_joiner_output\n", + " )" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "id": "942dab42-ad42-4ba2-90d5-49edbe4fae68", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "{'thought': 'The initial plan failed to get the scores for Sam Van Damm and Eric Zhang in Geology. In order to provide a final answer, I need these scores.',\n", + " 'context': \"We need to execute get_scores with class_name set to 'Geology' and user_id set to the respective IDs for Sam Van Damm (8523\"}" + ] + }, + "execution_count": 11, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "JOINER_FINISH = \"Finish\"\n", + "JOINER_REPLAN = \"Replan\"\n", + "\n", + "system_prompt = (\n", + " \"Solve a question answering task. Here are some guidelines:\\n\"\n", + " \" - In the Assistant Scratchpad, you will be given results of a plan you have executed to answer the user's question.\\n\"\n", + " \" - Thought needs to reason about the question based on the Observations in 1-2 sentences.\\n\"\n", + " \" - Ignore irrelevant action results.\\n\"\n", + " \" - If the required information is present, give a concise but complete and helpful answer to the user's question.\\n\"\n", + " \" - If you are unable to give a satisfactory finishing answer, replan to get the required information.\"\n", + " \" Respond in the following format:\\n\\n\"\n", + " \"Thought: \\n\"\n", + " \"Action: \\n\"\n", + " \"Available actions:\\n\"\n", + " f\" (1) {JOINER_FINISH}(the final answer to return to the user): returns the answer and finishes the task.\\n\"\n", + " f\" (2) {JOINER_REPLAN}(the reasoning and other information that will help you plan again. Can be a line of any length): instructs why we must replan\\n\\n\"\n", + " \" Examples:\\n\"\n", + " \"Question: How many users are currently using the new product?\\n\"\n", + " \"...task returns the number 32,000\\n\"\n", + " \"Thought: I find no issue with the original plan, and the results satisfy everything in the user question.\\n\"\n", + " f\"Action: {JOINER_FINISH}(32,000 users currently use the new product)\\n###\\n\"\n", + " \"Question: How much cooler is it in NY than SF?\\n\"\n", + " \"...task results show SF is 57 degrees fahrenheit today, and they show in NY it has a high of 32 degrees fahrenheit \\n\"\n", + " \"Thought: I can answer by synthesizing the results.\\n\"\n", + " f\"Action: {JOINER_FINISH}(NY is 25 degrees cooler than SF today, as it has a high of 32 degrees Fahrenheit today, whereas in SF, it is 57 degrees Fahrenheit.)\\n###\\n\"\n", + " \"Question: Are the gophers beating the rabbits??\\n\"\n", + " \"...task returns the a score of 7 for rabbits but no other value...\\n\"\n", + " \"Thought: I need the gophers' score to make a final decision.\\n\"\n", + " f\"Action: {JOINER_REPLAN}(The rabbits have a score of 7, but I need the gophers' score.)\"\n", + " \"\\n\\nAssistant Scratchpad:\\n{scratchpad}\"\n", + ")\n", + "\n", + "\n", + "joiner = create_joiner(system_prompt, ChatOpenAI(model=\"gpt-4\"))\n", + "joiner.invoke({\"plan\": task_results, \"input\": example_question})" + ] + }, + { + "cell_type": "markdown", + "id": "b099e5ee-2c23-47d9-9387-0f64e02627d3", + "metadata": {}, + "source": [ + "## Compose using LangGraph\n", + "\n", + "Now we have all the required pieces! Let's construct an LLMCompiler agent. We'll give it a search engine (Tavily) and a simple \"calculate\" function." + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "id": "565b08d2-d19c-4125-97f7-996fc01bc631", + "metadata": {}, + "outputs": [], + "source": [ + "import getpass\n", + "import os\n", + "\n", + "os.environ[\"TAVILY_API_KEY\"] = (\n", + " os.environ.get(\"TAVILY_API_KEY\")\n", + " if \"TAVILY_API_KEY\" in os.environ\n", + " else getpass.getpass(\"Tavily API Key:\")\n", + ")" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "id": "bd84ca4b-eacb-471d-9975-5449047b5bed", + "metadata": {}, + "outputs": [], + "source": [ + "from operator import add, mul, sub, truediv\n", + "from typing import Literal\n", + "\n", + "from langchain_community.agent_toolkits import GmailToolkit\n", + "from langchain_community.tools.tavily_search import TavilySearchResults\n", + "from langchain_core.tools import tool\n", + "\n", + "\n", + "@tool\n", + "def calculate(\n", + " arg1: float,\n", + " arg2: float,\n", + " op: Union[Literal[\"+\"], Literal[\"-\"], Literal[\"*\"], Literal[\"/\"]],\n", + "):\n", + " \"\"\"Calculate a mathematical operation on two arguments.\"\"\"\n", + " resolved_op = {\"+\": add, \"-\": sub, \"*\": mul, \"/\": truediv}\n", + " return resolved_op[op](arg1, arg2)\n", + "\n", + "\n", + "tools = [TavilySearchResults(max_results=1), calculate]" + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "id": "70566dff-d66e-4c8c-aed3-980522d175c2", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "4.0" + ] + }, + "execution_count": 14, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "calculate.invoke(dict(arg1=1, arg2=3, op=\"+\"))" + ] + }, + { + "cell_type": "markdown", + "id": "0ad5d62b-5898-4b9f-808f-c03620c2fe7a", + "metadata": {}, + "source": [ + "#### Defining the stateful graph\n", + "\n", + "We'll define the agent as a stateful graph, with the main nodes being:\n", + "\n", + "1. Plan and execute (the DAG from the first step above)\n", + "2. Join: determine if we should finish or replan\n", + "3. Recontextualize: update the graph state based on the output from the joiner\n" + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "id": "c5869ec6-b07f-4fb0-92a7-e6521f0c0bdd", + "metadata": {}, + "outputs": [], + "source": [ + "from typing import Dict\n", + "\n", + "MAX_ITERATIONS = 5\n", + "\n", + "\n", + "class GraphState(TypedDict):\n", + " input: str\n", + " plan: Dict\n", + " agent_output: Dict\n", + " observations: Dict\n", + " num_iterations: int # Maximum\n", + " context: str # Exra commentary for the joiner\n", + " stop_reason: str\n", + "\n", + "\n", + "def recontextualize(state):\n", + " # Insert a context string for the re-planner.\n", + " # This could alternatively call an LLM to provide additional logic\n", + " context = state[\"agent_output\"][\"context\"]\n", + " num_iterations = int(state.get(\"num_iterations\") or 1) + 1\n", + " formatted_tasks = format_tasks(state[\"plan\"])\n", + " context_str = f\"\\n\\nPrevious Plan:\\n{formatted_tasks}\\n\" f\"{context}\"\n", + " observations = state[\"observations\"] or {}\n", + " for task, observation in state[\"plan\"][\"join\"].items():\n", + " observations[task] = observation\n", + " return {\n", + " \"context\": context_str,\n", + " \"num_iterations\": num_iterations,\n", + " \"observations\": observations,\n", + " }\n", + "\n", + "\n", + "def add_stop_reason(state: GraphState):\n", + " # Helpful for letting the user know why the agent responded the way it did\n", + " num_iterations = int(state.get(\"num_iterations\") or 0)\n", + " if num_iterations >= MAX_ITERATIONS:\n", + " return {\"stop_reason\": \"end_max_iter\"}\n", + " if state[\"agent_output\"].get(\"answer\"):\n", + " return {\"stop_reason\": \"answer\"}\n", + " return {\"stop_reason\": None}" + ] + }, + { + "cell_type": "code", + "execution_count": 17, + "id": "768b5f11-e3d2-47be-8143-a7dcd8765243", + "metadata": {}, + "outputs": [], + "source": [ + "import json\n", + "\n", + "from langchain_core.tools import BaseTool\n", + "from langgraph.graph import END, StateGraph\n", + "\n", + "workflow = StateGraph(GraphState)\n", + "\n", + "# 1. Define vertices\n", + "\n", + "planner = create_planner(\n", + " llm=ChatOpenAI(model=\"gpt-4-1106-preview\"),\n", + " # Add more examples to improve reliability\n", + " example_prompt=(\n", + " \"Question: What's the capital of Myanmar?\\n\"\n", + " '1. tavily_search_results_json(query=\"Capital of Myanmar)\\n'\n", + " f\"2. join(){END_OF_PLAN}\\n\"\n", + " \"###\\n\"\n", + " \"\\n\"\n", + " ),\n", + " tools=tools,\n", + ")\n", + "\n", + "plan_and_execute = planner | construct_dag\n", + "joiner = create_joiner(system_prompt, ChatOpenAI(model=\"gpt-4-1106-preview\"))\n", + "\n", + "\n", + "# Assign each node to a state variable to update\n", + "workflow.add_node(\"plan_and_execute\", RunnablePassthrough.assign(plan=plan_and_execute))\n", + "workflow.add_node(\"join\", RunnablePassthrough.assign(agent_output=joiner))\n", + "workflow.add_node(\"recontextualize\", recontextualize)\n", + "workflow.add_node(\"provide_stop_reason\", add_stop_reason)\n", + "\n", + "\n", + "## Define edges\n", + "\n", + "workflow.add_edge(\"plan_and_execute\", \"join\")\n", + "workflow.add_edge(\"recontextualize\", \"plan_and_execute\")\n", + "workflow.add_edge(\"join\", \"provide_stop_reason\")\n", + "\n", + "### This condition determines looping logic\n", + "\n", + "\n", + "def should_continue(state):\n", + " if state[\"stop_reason\"] is None:\n", + " return \"continue\"\n", + " return \"end\"\n", + "\n", + "\n", + "workflow.add_conditional_edges(\n", + " start_key=\"provide_stop_reason\",\n", + " # Next, we pass in the function that will determine which node is called next.\n", + " condition=should_continue,\n", + " conditional_edge_mapping={\n", + " # If it generates context, we must replan\n", + " \"continue\": \"recontextualize\",\n", + " # Otherwise we finish.\n", + " \"end\": END,\n", + " },\n", + ")\n", + "workflow.set_entry_point(\"plan_and_execute\")\n", + "chain = workflow.compile()" + ] + }, + { + "cell_type": "markdown", + "id": "9f8c9849-8531-463d-a0ef-dcc3d9888b2d", + "metadata": {}, + "source": [ + "## Simple question\n", + "\n", + "Let's ask a simple question of the agent." + ] + }, + { + "cell_type": "code", + "execution_count": 18, + "id": "5bc4584a-e31c-4065-805e-76a6db30676a", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "In 2022, the real GDP of New York was about 1.56 trillion U.S. dollars.\n" + ] + } + ], + "source": [ + "result = chain.invoke({\"input\": \"What's the GDP of New York?\"})\n", + "print(result[\"agent_output\"][\"answer\"])" + ] + }, + { + "cell_type": "markdown", + "id": "33c65ef5-b4b2-4ab2-8c78-a551da7819b9", + "metadata": {}, + "source": [ + "## Multi-hop question" + ] + }, + { + "cell_type": "code", + "execution_count": 21, + "id": "0b3a0916-d8ca-4092-b91c-d9e2b05259d8", + "metadata": {}, + "outputs": [], + "source": [ + "result = chain.invoke(\n", + " {\n", + " \"input\": \"What's the oldest parrot alive, and how much longer is that than the average?\"\n", + " },\n", + " {\n", + " \"recursion_limit\": 100,\n", + " },\n", + ")" + ] + }, + { + "cell_type": "code", + "execution_count": 22, + "id": "6c65c414-7668-4fdf-ba97-f42f659b1317", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Cookie, a cockatoo, was the oldest parrot alive, having reached the age of 83, which is 23 years longer than the maximum average lifespan of a cockatoo in captivity, which is 60 years.\n" + ] + } + ], + "source": [ + "print(result[\"agent_output\"][\"answer\"])" + ] + }, + { + "cell_type": "markdown", + "id": "1b859bc7-1a85-4d35-b57b-f67c87282403", + "metadata": {}, + "source": [ + "## Streaming" + ] + }, + { + "cell_type": "code", + "execution_count": 25, + "id": "38d3ea91-59ba-4267-8060-ed75bbc840c6", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Step: {'plan_and...\n", + "Step: {'join': {...\n", + "Step: {'provide_...\n", + "Step: {'recontex...\n", + "Step: {'plan_and...\n", + "Step: {'join': {...\n", + "Step: {'provide_...\n", + "Step: {'__end__'...\n", + "3307.0\n" + ] + } + ], + "source": [ + "last_step = None\n", + "for step in chain.stream({\"input\": \"What's ((3*(4+5)/0.5)+3245) + 8?\"}):\n", + " print(\"Step: \", str(step)[:10] + \"...\")\n", + " last_step = step\n", + "print(\"***\")\n", + "print(last_step[\"__end__\"][\"agent_output\"][\"answer\"])" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.11.2" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/examples/advanced_agents/llm_compiler/output_parser.py b/examples/advanced_agents/llm_compiler/output_parser.py new file mode 100644 index 000000000..e8590bb17 --- /dev/null +++ b/examples/advanced_agents/llm_compiler/output_parser.py @@ -0,0 +1,154 @@ +import re +from typing import Any, Dict, Iterator, List, Optional, Sequence, Tuple, Union +import ast + +from langchain_core.exceptions import OutputParserException +from langchain_core.messages import BaseMessage +from langchain_core.output_parsers import BaseOutputParser +from langchain_core.tools import BaseTool + +THOUGHT_PATTERN = r"Thought: ([^\n]*)" +ACTION_PATTERN = r"\n*(\d+)\. (\w+)\((.*)\)(\s*#\w+\n)?" +# $1 or ${1} -> 1 +ID_PATTERN = r"\$\{?(\d+)\}?" +END_OF_PLAN = "" + + +### Helper functions + + +def _ast_parse(arg: str) -> Any: + try: + return ast.literal_eval(arg) + except: # noqa + return arg + + +def _parse_llm_compiler_action_args(args: str, tool: Union[str, BaseTool]) -> list[Any]: + """Parse arguments from a string.""" + if args == "": + return () + if isinstance(tool, str): + return () + extracted_args = {} + tool_key = None + prev_idx = None + for key in tool.args.keys(): + # Split if present + if f"{key}=" in args: + idx = args.index(f"{key}=") + if prev_idx is not None: + # print(tool_key, flush=True) + # breakpoint() + extracted_args[tool_key] = _ast_parse( + args[prev_idx:idx].strip().rstrip(",") + ) + args = args.split(f"{key}=", 1)[1] + tool_key = key + prev_idx = 0 + if prev_idx is not None: + extracted_args[tool_key] = _ast_parse( + args[prev_idx:].strip().rstrip(",").rstrip(")") + ) + return extracted_args + + +def default_dependency_rule(idx, args: str): + matches = re.findall(ID_PATTERN, args) + numbers = [int(match) for match in matches] + return idx in numbers + + +def _get_dependencies_from_graph( + idx: int, tool_name: str, args: Dict[str, Any] +) -> dict[str, list[str]]: + """Get dependencies from a graph.""" + if tool_name == "join": + return list(range(1, idx)) + return [i for i in range(1, idx) if default_dependency_rule(i, str(args))] + + +def instantiate_task( + tools: Sequence[BaseTool], + idx: int, + tool_name: str, + args: Union[str, Any], + thought: Optional[str] = None, +) -> dict: + if tool_name == "join": + tool = "join" + else: + try: + tool = tools[[tool.name for tool in tools].index(tool_name)] + except ValueError as e: + raise OutputParserException(f"Tool {tool_name} not found.") from e + tool_args = _parse_llm_compiler_action_args(args, tool) + dependencies = _get_dependencies_from_graph(idx, tool_name, tool_args) + + return dict( + idx=idx, + tool=tool, + args=tool_args, + dependencies=dependencies, + thought=thought, + ) + + +class LLMCompilerPlanParser(BaseOutputParser[dict], extra="allow"): + """Planning output parser.""" + + tools: List[BaseTool] + + def _transform(self, input: Iterator[Union[str, BaseMessage]]) -> Iterator[dict]: + texts = [] + thought = None + for chunk in input: + # Assume input is str. TODO: support vision/other formats + text = chunk if isinstance(chunk, str) else str(chunk.content) + for task, thought in self.ingest_token(text, texts, thought): + yield {task["idx"]: task} + # Final possible task + if texts: + task, _ = self._parse_task("".join(texts), thought) + if task: + yield {task["idx"]: task} + + def parse(self, text: str): + task_dict = {} + for task in self._transform([text]): + task_dict.update(task) + return task_dict + + def ingest_token( + self, token: str, buffer: List[str], thought: Optional[str] + ) -> Iterator[Tuple[Optional[dict], str]]: + buffer.append(token) + if "\n" in token: + buffer_ = "".join(buffer).split("\n") + suffix = buffer_[-1] + for line in buffer_[:-1]: + task, thought = self._parse_task(line, thought) + if task: + yield task, thought + buffer.clear() + buffer.append(suffix) + + def _parse_task(self, line: str, thought: Optional[str] = None): + task = None + if match := re.match(THOUGHT_PATTERN, line): + # Optionally, action can be preceded by a thought + thought = match.group(1) + elif match := re.match(ACTION_PATTERN, line): + # if action is parsed, return the task, and clear the buffer + idx, tool_name, args, _ = match.groups() + idx = int(idx) + task = instantiate_task( + tools=self.tools, + idx=idx, + tool_name=tool_name, + args=args, + thought=thought, + ) + thought = None + # Else it is just dropped + return task, thought From 85aa4fb4f74772513b8341668445aa494bf1c178 Mon Sep 17 00:00:00 2001 From: William Fu-Hinthorn <13333726+hinthornw@users.noreply.github.com> Date: Tue, 16 Jan 2024 20:40:33 -0800 Subject: [PATCH 05/18] Add img --- .../llm_compiler/LLMCompiler.ipynb | 41 +++++++++++++++--- .../llm_compiler/img/diagram.png | Bin 0 -> 253693 bytes 2 files changed, 35 insertions(+), 6 deletions(-) create mode 100644 examples/advanced_agents/llm_compiler/img/diagram.png diff --git a/examples/advanced_agents/llm_compiler/LLMCompiler.ipynb b/examples/advanced_agents/llm_compiler/LLMCompiler.ipynb index 20e0097fd..d42edc13f 100644 --- a/examples/advanced_agents/llm_compiler/LLMCompiler.ipynb +++ b/examples/advanced_agents/llm_compiler/LLMCompiler.ipynb @@ -15,7 +15,26 @@ "3. Joiner: Responds to the user or triggers a second plan\n", "\n", "\n", - "This notebook walks through each component and shows how to wire them together using LangGraph." + "![diagram](./img/diagram.png)\n", + "\n", + "\n", + "This notebook walks through each component and shows how to wire them together using LangGraph. First, we will set up LangSmith for tracing, and configure our environment variables." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "abbd6948-e9a3-47ca-89c7-7ac2fc5eca8b", + "metadata": {}, + "outputs": [], + "source": [ + "import os\n", + "import getpass\n", + "\n", + "os.environ[\"LANGCHAIN_TRACING_V2\"] = \"true\"\n", + "os.environ[\"LANGCHAIN_PROJECT\"] = \"LLMCompiler\"\n", + "os.environ[\"LANGCHAIN_API_KEY\"] = getpass.getpass(\"LangSmith API Key: \")\n", + "os.environ[\"OPENAI_API_KEY\"] = getpass.getpass(\"OpenAI API Key: \")" ] }, { @@ -47,7 +66,19 @@ "execution_count": 1, "id": "15dd9639-691f-4906-9012-83fd6e9ac126", "metadata": {}, - "outputs": [], + "outputs": [ + { + "ename": "ModuleNotFoundError", + "evalue": "No module named 'llm_compiler'", + "output_type": "error", + "traceback": [ + "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", + "\u001b[0;31mModuleNotFoundError\u001b[0m Traceback (most recent call last)", + "Cell \u001b[0;32mIn[1], line 7\u001b[0m\n\u001b[1;32m 5\u001b[0m \u001b[38;5;28;01mfrom\u001b[39;00m \u001b[38;5;21;01mlangchain_core\u001b[39;00m\u001b[38;5;21;01m.\u001b[39;00m\u001b[38;5;21;01mrunnables\u001b[39;00m \u001b[38;5;28;01mimport\u001b[39;00m RunnableBranch\n\u001b[1;32m 6\u001b[0m \u001b[38;5;28;01mfrom\u001b[39;00m \u001b[38;5;21;01mlangchain_core\u001b[39;00m\u001b[38;5;21;01m.\u001b[39;00m\u001b[38;5;21;01mtools\u001b[39;00m \u001b[38;5;28;01mimport\u001b[39;00m BaseTool\n\u001b[0;32m----> 7\u001b[0m \u001b[38;5;28;01mfrom\u001b[39;00m \u001b[38;5;21;01mllm_compiler\u001b[39;00m\u001b[38;5;21;01m.\u001b[39;00m\u001b[38;5;21;01moutput_parser\u001b[39;00m \u001b[38;5;28;01mimport\u001b[39;00m LLMCompilerPlanParser\n\u001b[1;32m 9\u001b[0m END_OF_PLAN \u001b[38;5;241m=\u001b[39m \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124m\u001b[39m\u001b[38;5;124m\"\u001b[39m\n\u001b[1;32m 12\u001b[0m \u001b[38;5;66;03m# The required extra \"tool\"\u001b[39;00m\n", + "\u001b[0;31mModuleNotFoundError\u001b[0m: No module named 'llm_compiler'" + ] + } + ], "source": [ "from typing import Optional, Sequence\n", "\n", @@ -55,7 +86,8 @@ "from langchain_core.prompts import ChatPromptTemplate\n", "from langchain_core.runnables import RunnableBranch\n", "from langchain_core.tools import BaseTool\n", - "from llm_compiler.output_parser import LLMCompilerPlanParser\n", + "\n", + "from output_parser import LLMCompilerPlanParser\n", "\n", "END_OF_PLAN = \"\"\n", "\n", @@ -707,9 +739,6 @@ "metadata": {}, "outputs": [], "source": [ - "import getpass\n", - "import os\n", - "\n", "os.environ[\"TAVILY_API_KEY\"] = (\n", " os.environ.get(\"TAVILY_API_KEY\")\n", " if \"TAVILY_API_KEY\" in os.environ\n", diff --git a/examples/advanced_agents/llm_compiler/img/diagram.png b/examples/advanced_agents/llm_compiler/img/diagram.png new file mode 100644 index 0000000000000000000000000000000000000000..01655a5ec4d11637ee426679e46d68773d6e2832 GIT binary patch literal 253693 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 Cb+mZ^ literal 0 HcmV?d00001 From 37bad4e30a978bc65f2f1273a892ffb6df6f4008 Mon Sep 17 00:00:00 2001 From: Nuno Campos Date: Wed, 7 Feb 2024 20:05:05 -0800 Subject: [PATCH 06/18] Add human in the loop notebook --- README.md | 11 +- examples/human-in-the-loop.ipynb | 495 +++++++++++++++++++++++++++++++ langgraph/graph/graph.py | 20 +- langgraph/graph/state.py | 13 +- 4 files changed, 529 insertions(+), 10 deletions(-) create mode 100644 examples/human-in-the-loop.ipynb diff --git a/README.md b/README.md index 173831445..96f70c7db 100644 --- a/README.md +++ b/README.md @@ -135,7 +135,7 @@ The path that is taken is not known until that node is run (the LLM decides). 1. Conditional Edge: after the agent is called, we should either: a. If the agent said to take an action, then the function to invoke tools should be called - + b. If the agent said that it was finished, then it should finish 2. Normal Edge: after the tools are invoked, it should always go back to the agent to decide what to do next @@ -469,7 +469,7 @@ It can often be tough to evaluation chat bots in multi-turn situations. One way ### Async If you are running LangGraph in async workflows, you may want to create the nodes to be async by default. -In order for a walkthrough on how to do that, see [this documentation](https://github.com/langchain-ai/langgraph/blob/main/examples/async.ipynb) +For a walkthrough on how to do that, see [this documentation](https://github.com/langchain-ai/langgraph/blob/main/examples/async.ipynb) ### Streaming Tokens @@ -479,7 +479,12 @@ For a guide on how to do this, see [this documentation](https://github.com/langc ### Persistence LangGraph comes with built-in persistence, allowing you to save the state of the graph at point and resume from there. -In order for a walkthrough on how to do that, see [this documentation](https://github.com/langchain-ai/langgraph/blob/main/examples/persistence.ipynb) +For a walkthrough on how to do that, see [this documentation](https://github.com/langchain-ai/langgraph/blob/main/examples/persistence.ipynb) + +### Human-in-the-loop + +LangGraph comes with built-in support for human-in-the-loop workflows. This is useful when you want to have a human review the current state before proceeding to a particular node. +For a walkthrough on how to do that, see [this documentation](https://github.com/langchain-ai/langgraph/blob/main/examples/human-in-the-loop.ipynb) ## Documentation diff --git a/examples/human-in-the-loop.ipynb b/examples/human-in-the-loop.ipynb new file mode 100644 index 000000000..694ad2f2e --- /dev/null +++ b/examples/human-in-the-loop.ipynb @@ -0,0 +1,495 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "51466c8d-8ce4-4b3d-be4e-18fdbeda5f53", + "metadata": {}, + "source": [ + "# Persistence\n", + "\n", + "When creating LangGraph agents, you can also set them up so that they persist their state. This allows you to do things like interact with an agent multiple times and have it remember previous interactions." + ] + }, + { + "cell_type": "markdown", + "id": "7cbd446a-808f-4394-be92-d45ab818953c", + "metadata": {}, + "source": [ + "## Setup\n", + "\n", + "First we need to install the packages required" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "id": "af4ce0ba-7596-4e5f-8bf8-0b0bd6e62833", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + "\u001b[1m[\u001b[0m\u001b[34;49mnotice\u001b[0m\u001b[1;39;49m]\u001b[0m\u001b[39;49m A new release of pip is available: \u001b[0m\u001b[31;49m23.3.1\u001b[0m\u001b[39;49m -> \u001b[0m\u001b[32;49m24.0\u001b[0m\n", + "\u001b[1m[\u001b[0m\u001b[34;49mnotice\u001b[0m\u001b[1;39;49m]\u001b[0m\u001b[39;49m To update, run: \u001b[0m\u001b[32;49mpip install --upgrade pip\u001b[0m\n" + ] + } + ], + "source": [ + "!pip install --quiet -U langchain langchain_openai tavily-python" + ] + }, + { + "cell_type": "markdown", + "id": "0abe11f4-62ed-4dc4-8875-3db21e260d1d", + "metadata": {}, + "source": [ + "Next, we need to set API keys for OpenAI (the LLM we will use) and Tavily (the search tool we will use)" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "id": "c903a1cf-2977-4e2d-ad7d-8b3946821d89", + "metadata": {}, + "outputs": [ + { + "name": "stdin", + "output_type": "stream", + "text": [ + "OpenAI API Key: ········\n", + "Tavily API Key: ········\n" + ] + } + ], + "source": [ + "import os\n", + "import getpass\n", + "\n", + "os.environ[\"OPENAI_API_KEY\"] = getpass.getpass(\"OpenAI API Key:\")\n", + "os.environ[\"TAVILY_API_KEY\"] = getpass.getpass(\"Tavily API Key:\")" + ] + }, + { + "cell_type": "markdown", + "id": "f0ed46a8-effe-4596-b0e1-a6a29ee16f5c", + "metadata": {}, + "source": [ + "Optionally, we can set API key for [LangSmith tracing](https://smith.langchain.com/), which will give us best-in-class observability." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "95e25aec-7c9f-4a63-b143-225d0e9a79c3", + "metadata": {}, + "outputs": [], + "source": [ + "os.environ[\"LANGCHAIN_TRACING_V2\"] = \"true\"\n", + "os.environ[\"LANGCHAIN_API_KEY\"] = getpass.getpass(\"LangSmith API Key:\")" + ] + }, + { + "cell_type": "markdown", + "id": "21ac643b-cb06-4724-a80c-2862ba4773f1", + "metadata": {}, + "source": [ + "## Set up the tools\n", + "\n", + "We will first define the tools we want to use.\n", + "For this simple example, we will use a built-in search tool via Tavily.\n", + "However, it is really easy to create your own tools - see documentation [here](https://python.langchain.com/docs/modules/agents/tools/custom_tools) on how to do that.\n" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "id": "d7ef57dd-5d6e-4ad3-9377-a92201c1310e", + "metadata": {}, + "outputs": [], + "source": [ + "from langchain_community.tools.tavily_search import TavilySearchResults\n", + "\n", + "tools = [TavilySearchResults(max_results=1)]" + ] + }, + { + "cell_type": "markdown", + "id": "01885785-b71a-44d1-b1d6-7b5b14d53b58", + "metadata": {}, + "source": [ + "We can now wrap these tools in a simple ToolExecutor.\n", + "This is a real simple class that takes in a ToolInvocation and calls that tool, returning the output.\n", + "A ToolInvocation is any class with `tool` and `tool_input` attribute.\n" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "id": "5cf3331e-ccb3-41c8-aeb9-a840a94d41e7", + "metadata": {}, + "outputs": [], + "source": [ + "from langgraph.prebuilt import ToolExecutor\n", + "\n", + "tool_executor = ToolExecutor(tools)" + ] + }, + { + "cell_type": "markdown", + "id": "5497ed70-fce3-47f1-9cad-46f912bad6a5", + "metadata": {}, + "source": [ + "## Set up the model\n", + "\n", + "Now we need to load the chat model we want to use.\n", + "Importantly, this should satisfy two criteria:\n", + "\n", + "1. It should work with messages. We will represent all agent state in the form of messages, so it needs to be able to work well with them.\n", + "2. It should work with OpenAI function calling. This means it should either be an OpenAI model or a model that exposes a similar interface.\n", + "\n", + "Note: these model requirements are not requirements for using LangGraph - they are just requirements for this one example." + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "id": "892b54b9-75f0-4804-9ed0-88b5e5532989", + "metadata": {}, + "outputs": [], + "source": [ + "from langchain_openai import ChatOpenAI\n", + "\n", + "# We will set streaming=True so that we can stream tokens\n", + "# See the streaming section for more information on this.\n", + "model = ChatOpenAI(temperature=0, streaming=True)" + ] + }, + { + "cell_type": "markdown", + "id": "a77995c0-bae2-4cee-a036-8688a90f05b9", + "metadata": {}, + "source": [ + "\n", + "After we've done this, we should make sure the model knows that it has these tools available to call.\n", + "We can do this by converting the LangChain tools into the format for OpenAI function calling, and then bind them to the model class.\n" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "id": "cd3cbae5-d92c-4559-a4aa-44721b80d107", + "metadata": {}, + "outputs": [], + "source": [ + "from langchain_core.utils.function_calling import convert_to_openai_function\n", + "\n", + "functions = [convert_to_openai_function(t) for t in tools]\n", + "model = model.bind_functions(functions)" + ] + }, + { + "cell_type": "markdown", + "id": "e03c5094-9297-4d19-a04e-3eedc75cefb4", + "metadata": {}, + "source": [ + "## Define the nodes\n", + "\n", + "We now need to define a few different nodes in our graph.\n", + "In `langgraph`, a node can be either a function or a [runnable](https://python.langchain.com/docs/expression_language/).\n", + "There are two main nodes we need for this:\n", + "\n", + "1. The agent: responsible for deciding what (if any) actions to take.\n", + "2. A function to invoke tools: if the agent decides to take an action, this node will then execute that action.\n", + "\n", + "We will also need to define some edges.\n", + "Some of these edges may be conditional.\n", + "The reason they are conditional is that based on the output of a node, one of several paths may be taken.\n", + "The path that is taken is not known until that node is run (the LLM decides).\n", + "\n", + "1. Conditional Edge: after the agent is called, we should either:\n", + " a. If the agent said to take an action, then the function to invoke tools should be called\n", + " b. If the agent said that it was finished, then it should finish\n", + "2. Normal Edge: after the tools are invoked, it should always go back to the agent to decide what to do next\n", + "\n", + "Let's define the nodes, as well as a function to decide how what conditional edge to take." + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "id": "3b541bb9-900c-40d0-964d-7b5dfee30667", + "metadata": {}, + "outputs": [], + "source": [ + "from langgraph.prebuilt import ToolInvocation\n", + "import json\n", + "from langchain_core.messages import FunctionMessage\n", + "\n", + "# Define the function that determines whether to continue or not\n", + "def should_continue(messages):\n", + " last_message = messages[-1]\n", + " # If there is no function call, then we finish\n", + " if \"function_call\" not in last_message.additional_kwargs:\n", + " return \"end\"\n", + " # Otherwise if there is, we continue\n", + " else:\n", + " return \"continue\"\n", + "\n", + "# Define the function that calls the model\n", + "def call_model(messages):\n", + " response = model.invoke(messages)\n", + " # We return a list, because this will get added to the existing list\n", + " return response\n", + "\n", + "# Define the function to execute tools\n", + "def call_tool(messages):\n", + " # Based on the continue condition\n", + " # we know the last message involves a function call\n", + " last_message = messages[-1]\n", + " # We construct an ToolInvocation from the function_call\n", + " action = ToolInvocation(\n", + " tool=last_message.additional_kwargs[\"function_call\"][\"name\"],\n", + " tool_input=json.loads(last_message.additional_kwargs[\"function_call\"][\"arguments\"]),\n", + " )\n", + " # We call the tool_executor and get back a response\n", + " response = tool_executor.invoke(action)\n", + " # We use the response to create a FunctionMessage\n", + " function_message = FunctionMessage(content=str(response), name=action.tool)\n", + " # We return a list, because this will get added to the existing list\n", + " return function_message" + ] + }, + { + "cell_type": "markdown", + "id": "ffd6e892-946c-4899-8cc0-7c9291c1f73b", + "metadata": {}, + "source": [ + "## Define the graph\n", + "\n", + "We can now put it all together and define the graph!" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "id": "812b4e70-4956-4415-8880-db48b3dcbad2", + "metadata": {}, + "outputs": [], + "source": [ + "from langgraph.graph import MessageGraph, END\n", + "# Define a new graph\n", + "workflow = MessageGraph()\n", + "\n", + "# Define the two nodes we will cycle between\n", + "workflow.add_node(\"agent\", call_model)\n", + "workflow.add_node(\"action\", call_tool)\n", + "\n", + "# Set the entrypoint as `agent`\n", + "# This means that this node is the first one called\n", + "workflow.set_entry_point(\"agent\")\n", + "\n", + "# We now add a conditional edge\n", + "workflow.add_conditional_edges(\n", + " # First, we define the start node. We use `agent`.\n", + " # This means these are the edges taken after the `agent` node is called.\n", + " \"agent\",\n", + " # Next, we pass in the function that will determine which node is called next.\n", + " should_continue,\n", + " # Finally we pass in a mapping.\n", + " # The keys are strings, and the values are other nodes.\n", + " # END is a special node marking that the graph should finish.\n", + " # What will happen is we will call `should_continue`, and then the output of that\n", + " # will be matched against the keys in this mapping.\n", + " # Based on which one it matches, that node will then be called.\n", + " {\n", + " # If `tools`, then we call the tool node.\n", + " \"continue\": \"action\",\n", + " # Otherwise we finish.\n", + " \"end\": END\n", + " }\n", + ")\n", + "\n", + "# We now add a normal edge from `tools` to `agent`.\n", + "# This means that after `tools` is called, `agent` node is called next.\n", + "workflow.add_edge('action', 'agent')" + ] + }, + { + "cell_type": "markdown", + "id": "bc9c8536-f90b-44fa-958d-5df016c66d8f", + "metadata": {}, + "source": [ + "**Persistence**\n", + "\n", + "To add in persistence, we pass in a checkpoint when compiling the graph" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "id": "6845ed6a-d155-4105-9160-28849877248b", + "metadata": {}, + "outputs": [], + "source": [ + "from langgraph.checkpoint.sqlite import SqliteSaver\n", + "\n", + "memory = SqliteSaver.from_conn_string(\":memory:\")" + ] + }, + { + "cell_type": "markdown", + "id": "cc7fa795-b3f8-4731-b37e-db7a802558ac", + "metadata": {}, + "source": [ + "**Interrupt**\n", + "\n", + "To always interrupt before a particular node, pass the name of the node to compile." + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "id": "79d29875-8aa8-434c-9f20-1c58346a6249", + "metadata": {}, + "outputs": [], + "source": [ + "# Finally, we compile it!\n", + "# This compiles it into a LangChain Runnable,\n", + "# meaning you can use it as you would any other runnable\n", + "app = workflow.compile(checkpointer=memory, interrupt_before=['action'])" + ] + }, + { + "cell_type": "markdown", + "id": "2a1b56c5-bd61-4192-8bdb-458a1e9f0159", + "metadata": {}, + "source": [ + "## Interacting with the Agent\n", + "\n", + "We can now interact with the agent and see that it stops before calling a tool.\n" + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "id": "cfd140f0-a5a6-4697-8115-322242f197b5", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "content='Hello Bob! How can I assist you today?'\n" + ] + } + ], + "source": [ + "from langchain_core.messages import HumanMessage\n", + "inputs = [HumanMessage(content=\"hi! I'm bob\")]\n", + "for event in app.stream(inputs, {\"configurable\": {\"thread_id\": \"2\"}}):\n", + " for k, v in event.items():\n", + " if k != \"__end__\":\n", + " print(v)" + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "id": "08ae8246-11d5-40e1-8567-361e5bef8917", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "content='Your name is Bob.'\n" + ] + } + ], + "source": [ + "inputs = [HumanMessage(content=\"what is my name?\")]\n", + "for event in app.stream(inputs, {\"configurable\": {\"thread_id\": \"2\"}}):\n", + " for k, v in event.items():\n", + " if k != \"__end__\":\n", + " print(v)" + ] + }, + { + "cell_type": "code", + "execution_count": 17, + "id": "273d56a8-f40f-4a51-a27f-7c6bb2bda0ba", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "content='' additional_kwargs={'function_call': {'arguments': '{\\n \"query\": \"weather in San Francisco now\"\\n}', 'name': 'tavily_search_results_json'}}\n" + ] + } + ], + "source": [ + "inputs = [HumanMessage(content=\"what's the weather in sf now?\")]\n", + "for event in app.stream(inputs, {\"configurable\": {\"thread_id\": \"2\"}}):\n", + " for k, v in event.items():\n", + " if k != \"__end__\":\n", + " print(v)" + ] + }, + { + "cell_type": "markdown", + "id": "1bca3814-db08-4b0b-8c0c-95b6c5440c81", + "metadata": {}, + "source": [ + "**Resume**\n", + "\n", + "We can now call the agent again with no inputs to continue, ie. run the tool as requested." + ] + }, + { + "cell_type": "code", + "execution_count": 18, + "id": "51923913-20f7-4ee1-b9ba-d01f5fb2869b", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "content='[{\\'url\\': \\'https://www.sfexaminer.com/news/climate/san-francisco-weather-forecast-calls-for-strongest-2024-rain/article_75347810-bfc3-11ee-abf6-e74c528e0583.html\\', \\'content\\': \"San Francisco is projected to receive 2.5 and 3 inches of rain, Clouser said, as well as gusts of wind up to 45 mph. Bay Area starting Wednesday at 4 a.m. and a 24-hour wind advisory in San Francisco starting at the same time. One of winter\\'s \\'stronger\\' storms to douse San Francisco On the heels of record-breaking heat to open the week, heavy rain is slated to pound the Bay Area on Wednesday.A series of historic storms last winter led to one of the wettest water years (Oct. 1 to Sept. 30) in The City\\'s history, highlighted by a 10-day stretch last January in which San Francisco...\"}]' name='tavily_search_results_json'\n", + "content=\"Currently, I couldn't retrieve the exact weather information for San Francisco. However, there is a forecast of heavy rain and gusts of wind up to 45 mph in San Francisco starting Wednesday at 4 a.m. You may want to check a reliable weather website or app for the most up-to-date weather conditions.\"\n" + ] + } + ], + "source": [ + "for event in app.stream(None, {\"configurable\": {\"thread_id\": \"2\"}}):\n", + " for k, v in event.items():\n", + " if k != \"__end__\":\n", + " print(v)" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.11.6" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/langgraph/graph/graph.py b/langgraph/graph/graph.py index a0ac4a172..f3fa36085 100644 --- a/langgraph/graph/graph.py +++ b/langgraph/graph/graph.py @@ -1,6 +1,6 @@ from asyncio import iscoroutinefunction from collections import defaultdict -from typing import Any, Callable, Dict, NamedTuple, Optional +from typing import Any, Callable, Dict, NamedTuple, Optional, Sequence from langchain_core.runnables import Runnable from langchain_core.runnables.base import ( @@ -88,7 +88,7 @@ class Graph: def set_finish_point(self, key: str) -> None: return self.add_edge(key, END) - def validate(self) -> None: + def validate(self, interrupt: Optional[Sequence[str]] = None) -> None: all_starts = {src for src, _ in self.edges} | {src for src in self.branches} for node in self.nodes: if node not in all_starts: @@ -114,8 +114,17 @@ class Graph: if node not in all_ends: raise ValueError(f"Node `{node}` is not reachable") - def compile(self, checkpointer: Optional[BaseCheckpointSaver] = None) -> Pregel: - self.validate() + if interrupt: + for node in interrupt: + if node not in self.nodes: + raise ValueError(f"Node `{node}` is not present") + + def compile( + self, + checkpointer: Optional[BaseCheckpointSaver] = None, + interrupt_before: Optional[Sequence[str]] = None, + ) -> Pregel: + self.validate(interrupt=interrupt_before) outgoing_edges = defaultdict(list) for start, end in self.edges: @@ -145,4 +154,7 @@ class Graph: output=END, hidden=[f"{node}:inbox" for node in self.nodes], checkpointer=checkpointer, + interrupt=[f"{node}:inbox" for node in interrupt_before] + if interrupt_before + else [], ) diff --git a/langgraph/graph/state.py b/langgraph/graph/state.py index 88c526e2f..1bcef05cb 100644 --- a/langgraph/graph/state.py +++ b/langgraph/graph/state.py @@ -1,7 +1,7 @@ from collections import defaultdict from functools import partial from inspect import signature -from typing import Any, Optional, Type +from typing import Any, Optional, Sequence, Type from langchain_core.runnables import RunnableLambda, RunnablePassthrough from langchain_core.runnables.base import RunnableLike @@ -34,8 +34,12 @@ class StateGraph(Graph): ) return super().add_node(key, action) - def compile(self, checkpointer: Optional[BaseCheckpointSaver] = None) -> Pregel: - self.validate() + def compile( + self, + checkpointer: Optional[BaseCheckpointSaver] = None, + interrupt_before: Optional[Sequence[str]] = None, + ) -> Pregel: + self.validate(interrupt=interrupt_before) state_keys = list(self.channels) state_keys_read = state_keys[0] if state_keys == ["__root__"] else state_keys @@ -98,6 +102,9 @@ class StateGraph(Graph): output=END, hidden=[f"{node}:inbox" for node in self.nodes] + [START] + state_keys, checkpointer=checkpointer, + interrupt=[f"{node}:inbox" for node in interrupt_before] + if interrupt_before + else [], ) From 1af7615ff979e6590cedf5126b2c2306817adeb7 Mon Sep 17 00:00:00 2001 From: Harrison Chase Date: Wed, 7 Feb 2024 22:22:43 -0800 Subject: [PATCH 07/18] cr --- examples/human-in-the-loop.ipynb | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/examples/human-in-the-loop.ipynb b/examples/human-in-the-loop.ipynb index 694ad2f2e..8d97da44e 100644 --- a/examples/human-in-the-loop.ipynb +++ b/examples/human-in-the-loop.ipynb @@ -5,9 +5,15 @@ "id": "51466c8d-8ce4-4b3d-be4e-18fdbeda5f53", "metadata": {}, "source": [ - "# Persistence\n", + "# Human-in-the-loop\n", "\n", - "When creating LangGraph agents, you can also set them up so that they persist their state. This allows you to do things like interact with an agent multiple times and have it remember previous interactions." + "When creating LangGraph agents, it is often nice to add a human in the loop component.\n", + "This can be helpful when giving them access to tools.\n", + "Often in these situations you may want to manually approve an action before taking.\n", + "\n", + "This can be in several ways, but the primary supported way is to add an \"interupt\" before a node is executed.\n", + "This interupts execution at that node.\n", + "You can then resume from that spot to continue." ] }, { @@ -487,7 +493,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.11.6" + "version": "3.11.1" } }, "nbformat": 4, From c5290163468efe608090f56cf43974da9cc48c4e Mon Sep 17 00:00:00 2001 From: Nuno Campos Date: Thu, 8 Feb 2024 10:30:05 -0800 Subject: [PATCH 08/18] 0.0.24 --- pyproject.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pyproject.toml b/pyproject.toml index 7d19d2096..8df024914 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "langgraph" -version = "0.0.23" +version = "0.0.24" description = "langgraph" authors = [] license = "LangGraph License" From bdd8a084ccad9bbe900af11981d04dbc8c7b2e85 Mon Sep 17 00:00:00 2001 From: Lance Martin Date: Thu, 8 Feb 2024 14:42:13 -0800 Subject: [PATCH 09/18] Updates to support running locally --- examples/rag/langgraph_crag_mistral.ipynb | 184 +++++++++++++++------- 1 file changed, 127 insertions(+), 57 deletions(-) diff --git a/examples/rag/langgraph_crag_mistral.ipynb b/examples/rag/langgraph_crag_mistral.ipynb index c1289061e..3026b79a0 100644 --- a/examples/rag/langgraph_crag_mistral.ipynb +++ b/examples/rag/langgraph_crag_mistral.ipynb @@ -2,26 +2,17 @@ "cells": [ { "cell_type": "code", - "execution_count": 2, + "execution_count": 5, "id": "19969669-b47f-47f3-b6d4-f7b155434840", "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "\u001b[33mWARNING: There was an error checking the latest version of pip.\u001b[0m\u001b[33m\n", - "\u001b[0m" - ] - } - ], + "outputs": [], "source": [ - "! pip install --quiet langchain_community tiktoken langchain-openai langchainhub chromadb langchain langgraph tavily-python langchain-mistralai" + "! pip install --quiet langchain_community tiktoken langchain-openai langchainhub chromadb langchain langgraph tavily-python langchain-mistralai gpt4all" ] }, { "attachments": { - "9db7f9db-55aa-48cb-95d5-bcde3f937589.png": { + "a65940f9-5c51-4d7c-9ca1-ae576e4bb51a.png": { "image/png": "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9WPuJCABCUhAAn1NAAXeaqutVv41U0r2ohAogb///e8XF198cbHmmmtWXoI4Sy21VIHf8JGWZorqNC9vv/12sdtuuw2UwYMy5lxHpWXP7U855ZS54K6HhZkbuYTTBafjkfZDLVdseGC9k1ia5SWOl26naz2kx0d7v2qGRqt8BUMA8VJWrc5Nj4+F/iLNc6v9SSaZpBYlHT1fO/DuBn1LLPF5cXi6PVQldppOP+wPpQ2mTNP9TsoV9x2dnJebOdHq/NiI0CpuN4/HC653km6/91+dlMW4EpCABCQgAQn0DwFnevRPXZgTCUhAAhKQgASGQIAZJvx95zvfKV2G3HHHHeWCsbj9iAV/53fffXeli5w47nCUW3E6U001VbzbdPvaa6+tc9fFotb4bGctA9JBMcTIYxZzTsvWNOHk4EgrmHDLFAsjnOeee+44KLudnpeN1OPA2CUNMyjitSHmnXfegsWJEdy3pAuQV2UtdsWUjs5nBHh8vCqNNBy3Z0FGaoZMuF4vf1kHhDUokGYj3jvJQy/6i06u38243COBT+wiKL1Guth4M5du8bm4bRvPkt6fL7300pBxpH0eC5m3YySI13BKL447wB122CENLk455ZRyHSDWAhoLMqj911hgbx4lIAEJSEACg0xAo8cg165lk4AEJCABCYwjAiiQWDScv+2226549tlnCxaLvf/++0sKKIMxGuTWNUhH0zZTIPYK6X333VdLGmXvOeec06AUQwmXrhFRO6liI50xgT//kZRYocV1MR5sv/32I5mFIV0LheIVV1xROzf15x8vzM2MhC996UvFNNNMU4vfzkbqioqF6auMHulo/Tj9OB3aOG64cqP0hztbIr7mSGyzTkJQ6j/wwAOVl+z0niCh4fQXlRkZ4QPxOhL0b6ztgJE0lXSWW65tpOe4XzTcQxg511lnnSyaN998MxseAlMj7ic/+cly7alwfCi/hx9+eHY9D9Laeeedi1/84hd1i6IP5Rojcc6g9l8jwc5rSEACEpCABCRQTUD3VtVsPCIBCUhAAhKQwBgmgD96ZkvEUjVSFwVorCxEWTQURWp8rU63H3vssdopKM9zo4BZ4PzWW2+txWtnI13IHcX6SApuXRZaaKHaJU844YTilltuqe3368ZZZ51VW0yYPLKQdizpouPM9Gil+IzPZzsdcY8rtpwwO+fee+/NHSrD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kD8WK//Upz5VzD///MW8885bMBukXaVpQ2IGSEACo06g6v5dZJFFio997GPlfb7CCisUH/nIR0Y9r2ZAAhKQgAQkIIGxQWCi/7wrYyOr5lICEpCABCQgAQlIQAISGE8EXnjhheKdd94ppphiimKyySbTj/94qnzLOm4IsJ4H6/Zwj08++eTlr7M5xk31W1AJSEACEpBATwho9OgJVhOVgAQkIAEJSEACEpCABCQgAQlIQAISkIAEJCABCUhgpAlMPNIX9HoSkIAEJCABCUhAAhKQgAQkIAEJSEACEpCABCQgAQlIoBcENHr0gqppSkACEpCABCQgAQlIQAISkIAEJCABCUhAAhKQgAQkMOIENHqMOHIvKAEJSEACEpCABCQgAQlIQAISkIAEJCABCUhAAhKQQC8IaPToBVXTlMAYIPDmm2+OgVyaRQlIQAISkED3CAzis+/tt98u/v3vf3cPkimNGwK2nXFT1QNf0LfeequvyjiIz5q+AmxmxiUBn1njstottASGReA9wzrbkyUggTFH4Nlnny0OPfTQ4sorryyWW2654uCDDy7mmmuuMVeOfsjwYYcdVjzzzDOVWdltt92K+eabr/J4Px/42te+VrzwwgtlFldZZZVi3XXX7efs9k3eXnrppeL8888vHnnkkeKxxx4rfvvb3xbve9/7iplmmqmYeeaZi+OOO67c7psMD3BG7r333uK0006rLOG8885b7L777pXH2z1gnTcndcsttxTXXntt8fjjjxcPP/xw8fe//734wAc+UMw666zFmmuuWWy77bbFK6+8Uuyzzz7FO++8k01s4oknLo4//vjiPe8Z+mvr3XffXdBn0y422mij8tnHvTnW5cILLyyOOeaY4uWXXy6++tWvFttvv/1YL5L575DA6aefXtC+kbnnnrvYc88920rBttMWJiP1OQGUoEceeWRxxhlnFPPMM0+x3377FSuuuOKo5drvrFFD74UHnIDPrAGvYIsngR4RmOg/70qP0jZZCUhgCAT4cL3tttvqzvzc5z5XLLDAArUwRnSizItv32mmmabYbLPNanGqNiZMmFCcdNJJtcPrrLNOqYitBbjRNoEVVlihePLJJyvjo/xeZpllKo+PxAEUsijeUcA/+uijpTIe5TvtKfzNMsssDVlZcMEFi3/+859l+DbbbFMccMABDXEMqCdw/fXXl8omlLpV8uCDDxZTTz111WHDu0gAw+4OO+xQmeJiiy1WXHLJJZXH2zlgnVdTou/ByHDRRRdVRkJBv++++xYoiRZffPHKeBzAkPje9763aZxmB9dee+3i/vvvr0XhWYjxYyzLP/7xj2KRRRapK8INN9xQfPSjH60Lc2ewCWA4vPrqq8tC0h4uu+yylgW27bREZIQxQuDGG28stthii1puMarfeeedwzKS1xIbwobfWUOA5ikSaEHAZ1YLQB6WgAQqCQx9yFxlkh6QgASGQ+DWW28tjj766Loknn/++eKQQw6phaHE5qU6Fl7y2zF6hNGA4dx0P4T38nfLLbesKZ/WWGONUjHWy+uN17QvvfTSYtddd80W/4orrqiFb7rppuXIuLEw6rlf2w4f3eStmcBXg0czQmPrmHVeXV8Y5HkexUaGXOycwTUXb7hhr7/+ekNeHnjggRE1erz22mt1RvADDzywYNDBcOR3v/tdw+kPPfSQRo8GKgakBGw7KRH3xyoBBpPEwsCTv/3tb0U7z5eTTz65nCHC+dNPP305KzFOayjb6XdVuj+UND1HAmOJgO87Y6m2zKsEBp+ARo/Br2NLOAAErrvuujqjRzoTpJMirr/++sXtt99eO2WDDTaobY/UBh8jYTQ8IzfGqpx66qkFL3ZBmE2x9957h91R+2WENTMzfvrTn7aVh+9///vFX//61wIXGbiR6Wfpx7bDzKvDDz+8DtsnP/nJUumLq5HJJpusoE7eeOONujju9JbAZz/72YYRz7j2w73RcMU6b07wZz/7WYORYccddyyYXfOhD32ovBeee+652gzGGWaYoaGuMNqee+65zS/U5lFmiPDsu/jii2tnrLXWWrXtkdjABUt47nG9MJNuONdedNFFS55/+ctfasmMpluXWibc6HsCtp2+ryIz2CYB+vJ4sNiSSy7ZlsGD5HELGPrlbr2j9cN3VpvojCaBnhDwfacnWE1UAhIYIgGNHkME52kSGEkCf/zjH4s///nPtZf4m2++eciXZ2TptNNOWzBKGXciq6666pDTGu8nput1oNzuB9luu+0KZgzFgrKR+mYdg6effrqgDTH9Xxk+ARS88ahZZi+xdke/tIfhl3BspsCsmtT1z4wzztiVwljnzTF+85vfrIuAu520LuIIk0wyScPxVrNE4vPb2cbgRR4wTq+++urFEkss0c5pfR2H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mzx8X2t72gQ7v28fG/74XwNr7ljyoP7A8MdtwCX9bOcr77DHLuxjYz+fZSPHPG8PPfSQ9e7dOxCfEQQQQAABBBBAoJgC6hvCDyrIeOqpp6xv377+5MjD1Uqa9FTBxeTJk5PzDB482Jo2bZocL+ZARabP78si6jaPGTMmEPWOO+6wE088MTDNjahT8I8++siNlvkZ7rRe+1oFKLVq1SpzXj9Cu3btAgUz6sj+qKOO8qMwjAACCOQsUNJeAgEBBBBAAAEEEECgUALHH3+83VtS4NFx200SBR5az+u37mjffzvdHrp/WKnVttl6a7vrnj/b8lVr7JwH/mpjXn7F9ABLgUcpKiYggAACCCCAQJEFVNPj5JNPDqRi2LBhNmvWrMC0bEa23377QPS7777bwh2WByJU8Eic06eCDD/07NnTHw0M//3vfw+MRxlRgYUfvv76a3800vB2XvOumuHee++1pUuXRpqXSAgggEBUAQo9okoRDwEEEEAAAQQQyFJg33272gsvPG/dOtW3d+7pkpy7XasG1r9nI3vy8eH2yMMPJKdr4JOJE6zv2WeUdFxZw2qVVPV/6aWX7OCDDw7EYQQBBBBAAAEEEIiLwEUXXRRIijqbVpNUb731VmB61JFevXoFoqrJrBtvvNFWrFgRmF6skTinL9xfxi+//JKS6bHHHrMZM/6//7iUMVJPbN++feCLW2+91dauXRuYVtbIgQceGGj+bOrUqYk+7+bNm1fWrHyPAAIIRBaocW1JiBybiAgggAACCCCAAAKRBHbcob19WtI0w2mHbG6PDdyt1Dx77dDEJkydY8+++J59M/0bO+Sww+3xR4fbbTffYNWrVzO9OammHbbZZptS8zIBAQQQQAABBBCIi0CjRo1syZIlNmnSpGSS1qxZY2PHjrWvvvrKfvzxx8T36mRbNUAmTJhQ8lLIC8m4HTt2TBSSuAmtW7e22bNn2xdffOEm2SeffGKPPvpoojmlX3/9NVEzQIUr3377bWJ5L7/8csn9U3ULd6yuBahGg7+sE044wbSOVOG5555LpNd997//+78W7lsjX+lT01Affvhhon+LH374IWHl175Qvye6D9R3+lOhQLgPFZdO96nt9JsG07B8t9hii0ShkcaHDx9ud911l5sl+al99vPPP5tcFT9VPxval++9915yHnVcr30pe82nP9X+ULNZb775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Y61Pnz6Bzb/xxhvtsMMOs6233jownREEEECgGALVi7FS1okAAggggAACCBRTQG+pNWrUwNasXmGTH94rcoHH+E8XWPdLJ9uCX9cl3vqjwKOYe5F1I4AAAggggMDGLqDaBY8++mhgM1W747HHHotU4BGY0RvhHs7DKMfgIYccYqNGjSrVTJgKPggIIIBAHAQo9IjDXiANCCCAAAIIIFBhAur8cs8997DqG9bYrNH7W/PN60Ra9+C/fm0nXz/Vlq9ab9dcc40NGTIk0nxEQgABBBBAAAEEECifwMiRIwMzqkmre++912rXrh2Ynu2ImmeaP39+trMR3xPYa6+97Pbbb/emmL3++uv2008/BaYxggACCBRDgEKPYqizTgQQQAABBBAoisDQoUPtoIO625aNzGaOPiByGu4cNcPuGjXb1m+oZvfff79deeWVkeclIgIIIIAAAggggED2AqtWrbLRo0cHZjznnHOsZs38tNQ+ZsyYwLIZyV5AzVmpLw8/vPTSS/4owwgggEBRBCj0KAo7K0UAAQQQQACBiha4+OKL7eKLL7Ltmte0KY/vF3n1f3zwS7vlqZlWt179RKeNetgmIIAAAggggAACCBRWYMKECYEOyLW24447Lm8rfeSRR2zdunV5Wd6KFSvs888/T9wrjh8/3mbNmmUbNmwo17KXLl2a6HNEhTJaVrg/k/IsVH2VfP311/bqq6/aK6+8Yl999ZWtXr26PIsKzKO+Ps4666zAtHHjxgXGGUEAAQSKIZCf4vFipJx1IoAAAggggAACEQV69uxpL7zwgu21Yx177bbSnVamW8yRf/zIPvl6jW266eb2xhtvJDpwTBeX6QgggAACCCCAAAL5E5gyZUpgYepAu3HjxoFp2Y60a9cukfmv+WbPnm3vv/++HXBA9Nq/4fVNmjTJrrjiClPfI+FQv359O+mkk2zgwIFWp07Zzal+9tlndumllybT5y9PNSruvPNOf1KkYRV0DBo0KFGIkmqGAw880AYPHmytWrVK9XWkadrGO+64IxlXhT9r1qwxFYgQEEAAgWIJUNOjWPKsFwEEEEAAAQQqRGC77bYreevuBTu6S6OsCjx6XfOpTZq+1pq3aJl4G26XXXapkPSyEgQQQAABBBBAAAFL1JzwHfbZZx9/tFzDWkaHDh2S8/71r39NDmczsH79envggQcSNU9SFXhoWcuWLUt0wn700Ufb9OnTMy7+xRdftGOOOSZlgYdmVF8ZAwYMyLgM/0vVMlFn7epw/KOPPvK/Cgyrr7t999038XJQ4IssRpo2bWoqTPJDWdvrx2UYAQQQKIQAhR6FUGWZCCCAAAIIIBALgR122MG+/XaGHdu1iT05qFPkNHW79BP74IsV1mbrbey7774rqemxaeR5iYgAAggggAACCCCQu8C0adMCC9lqq60C4+UZqVatmp155pnJWV977bVEU1TJCREH1NeIakhECaptodoQK1euTBn9iy++sAsvvDDld/7EbDoJVxNTquERNagZ2G+//TZq9FLxWrZsGZj2/fffB8YZQQABBCpagEKPihZnfQgggAACCCBQIQItWzQveVtumt1+Xlt7bOCukdY5b9Eq63TuBPvyh1V24IHdLPywHWkhREIAAQQQQAABBBDIWWDRokWBZWy55ZaB8fKO9OjRw9T0lAujRo1yg5E+VXhxyy23lIqrZq6eeeYZGzZsmHXr1i3w/YIFC+ypp54KTHMj9913nxtMft5666324Ycf2sSJExPzudopUfr3UF8dt912W3JZGlBn45qmwhD9adg3UByts7yhefPmgVmXLFkSGGcEAQQQqGgBCj0qWpz1IYAAAggggEDBBTZt0th+/nmuvXJzR+tzVJtI6/v4q8W2T79JNmvBWuvZs5fpzT8CAggggAACCCCAQHEEfv3118CK81HTQwtUZv8pp5ySXPbjjz9u6ug7alDhhQox/KC+48477zxT81lHHXWUDR8+3Hr16uVHSfR7oSav/KDaFeGOv9UsldLXokULU0GPmp8aO3asde3a1Z817fDTTz8d6PxcTU+99dZbdvLJJ1vHjh0TfxpW01YqDHFBnZyrVkp5QrjQI7yd5Vkm8yCAAAK5CFDokYse8yKAAAIIIIBArATmzZtn9erVsZUrltiUx/exvXeK1izVix/MtWOv/NyWLF9v5557ro0cOTJW20ViEEAAAQQQQACBqiSgPinCGef16tXLG4Ey/V1QAYYKBaKG8ePHB6KquaxOnYLNqNasWTPRwbkfUdvz73//259k7733XmBcBRv77bdfYJpGtDx1iB4lvPnmm4FoqsHRpEmTwDSNqEBFtVP8UN6+OMK1cKjp4asyjAACxRCg0KMY6qwTAQQQQAABBPIuMGnSJGvZsoVV27DGZj93gG3ZuFakdTz40vd29m3TbNWaDXbVVVfZ0KFDI81HJAQQQAABBBBAAIHCCKjvjUKG7bff3vbYY4/kKrLp0Dzc/Kn660gVVDNFTWn5YebMmf6ozZ49OzCeblmKtOuu0ZprnTFjRnKZ2267rXXu3Dk5Hh7o3r17YNKPP/4YGI86Eq4pU6NGjaizEg8BBBAoiEDNgiyVhSKAAAIIIIAAAhUo8Oijj1rfc86xzRtVs6+e3D/ymq9/fJoNfWGu1ahR0wYMGJAo9Ig8MxERQAABBBBAAAEECiagZqj82h6LFy+2xo0b5219qqGhPjMU1NTTd999Zw0bNsy4fGXuhwsq2rZtm3ae9u3b28svv5z8Plyo8NNPPyW/04AKKTKFHXfc0aZOnZo2itLn9/uxYsUKe+mll9LGV40aP/jz+tPLGp4zZ04gSoMGDQLjjCCAAAIVLUChR0WLsz4EEEAAAQQQyKuAqvqrM8a2zWrYxw/uG3nZF977uT07frHVrVs/0UHk0UcfHXleIiKAAAIIIIAAAggUVkD9TfiFHj///HNeCz0OP/zwRP8ebh3qhPyckpdoMoVw5r7ihjsE9+cPN/sULvQI1/zYYost/NlLDW+6aeamW8PpUwFNv379Si0n3YSFCxem+yrj9Llz5wa+p9AjwMEIAggUQYDmrYqAzioRQAABBBBAID8C6uRR7RR3alcrqwKP026abKPf/dWabLqZvfvuu0aBR372B0tBAAEEEEAAAQTyJRDO4FffbfkMtWvXNtX2cEEdmq9cudKNpvysXj27bLRwTYpws13h9YW/T5mIDBM32WSTDN+W/VXdunXLjpQixqxZswJTU/UhEojACAIIIFBgAWp6FBiYxSOAAAIIIIBAYQQOPPDARIHF4Xs2sqevDnYemWmNRw2aZJO+XmWtWm9t//rXv2yzzTbLFJ3vEEAAAQQQQAABBIogsPPOO9vkyZOTaw7XJkh+kcOAOjS/7777EktQjY9XX30149LUT0c4qNPudM1ihdPcpk2bwOytW7e2zz//PDlNTXi1aNEiOZ7tQKr0HXLIIZEXE7XfkPACs22mKzw/4wgggEC+BSj0yLcoy0MAAQQQQACBggt06NDBpkz5ws46Yku76/c7RVrf6rXrrfuln9q3s1fbLrvsmijwiDQjkRBAAAEEEEAAAQQqXED9V/jh73//u/Xs2dOflPPwNttsY3qRRn16KKi2R6ZQs2ZNU8GF3/fF9OnTrVOn1C/gTJkyJbA4FXL4oVWrVv6oqbmr8HYHIpQxopoiKrjwC4sGDx5sTZs2LWPO8n/9zTffBDy0pHDhTvmXzpwIIIBA+QSyq5dXvnUwFwIIIIAAAgggkDeB5s2bl3TgOMWuP3vryAUe02cus059J9qM2Wtsv/0PoMAjb3uDBSGAAAIIIIAAAoUR6NixY2DB6hA83GdFIEI5R04//fTknH5hhiaGm6fStHBn4yNGjNDkUkEFGG+88UZgeriQIzw+ZsyYQPzwyLfffhueVGp8++23D0y7++67U25HIFIOI0899VRg7q5du1q2zYAFFsAIAgggkAcBCj3ygMgiEEAAAQQQQKBiBLbYfDObP2+uPXhpO+t33DaRVjp+0nw7eMBnNv/Xdfbb3/7WXn/99UjzEQkBBBBAAAEEEECgeAKqsaDOzP2gzsbzHQ466KBS68m0jiOPPDLw9ahRo2z8+PGBaeqr4+qrrw5M07aEC3L22GOPQBwV7Hz66aeBaW7kvffeM3VMXlbo1atXIMrIkSPtxhtvtBUrVgSm52NETYJp+X445phj/FGGEUAAgaIIUOhRFHZWigACCCCAAALZCtStW8eWLl1k00d0seMPbB5p9ptHTLf/ufFLW7F6gx133HH29NNPR5qPSAgggAACCCCAAALFFVBtgVNPPTWQCDU/le/MezVZ5XdoHlhhipETTjihVPNNml8FC6qp8eSTT9opp5xSqpbHH//4R6tTp05giWqyVYUuftBLOk888URJzeapieauJk2aZLfccouddtppfrS0w126dDH1VeKHhx9+2Dp37myq9fHaa68lCla++OKLRO3n559/3u644w775z//6c8SafiFF14wFXz44YgjjvBHGUYAAQSKIlCtpKrehqKsmZUigAACCCCAAAIRBNRO8E477Wi1aqy3H5/dL8Ic/4ly16gZNnjEzJKRanbllVfatddeG3leIiKAAAIIIIAAAggUX0BNRKm5JD8ce+yxdu+995r6r4gStt5662S0M844w2644YbkuBuYNWuWqbAgHAYOHGjnn39+eLKpRsYFF1xQanq6Cerj4u233zYVsITDxx9/bOHaGeE4bly1RRYsWOBGEzVM2rZtmxx3A4sWLUq4hQsk3PepPvv162eXXXZZqq9STlOhTLiAQ4VUN998c8r4TEQAAQQqUoCaHhWpzboQQAABBBBAICsBNRew/fbtrVHddVkVeAx88Eu7ZeSskgfLTezPf/4zBR5ZqRMZAQQQQAABBBCIh0DLli3tD3/4QyAxL774ol188cX266+/BqbnMtKiRQs7/PDDIy+iR48edtddd0WKv9dee5nuaVMVeGgBrgZGWQvr1q1b5MKRJk2a2JtvvmkqIIoaovQX4pb17rvv2vHHH+9GE5/169cvta8CERhBAAEEKlCAQo8KxGZVCCCAAAIIIBBd4MILL0xUzW+1RXX7+q/7R57xnNs/s8de/6Wk+YB6pnafzzvvvMjzEhEBBBBAAAEEEEAgXgJ9+/Y19e/hh7Fjx5oKAe68805T80+qqbF27Vo/SsrhunXrppyuiX6H5i5SvXr13GCpT2X6v/XWW4l0KMM/HFS7QwU26vOiWbNm4a8D46rp8corr1i4jw9F0nJUg+Ivf/mLqXAmamjevLkNHTo0sf7999/fUqXRX9bSpUv90cDwkiVLbPr06YkaLn369LHevXuXatZKTXCF+2AJLIQRBBBAoAIFaN6qArFZFQIIIIAAAghEE1C7yE+WtGXcpmkN+/Th6E1a9brmU/vn1JXWqFGTxEOZ3pwjIIAAAggggAACCFRuATXXpL40vv7667Qb8uijj5bqHyNt5Dx/oZbjVfCiv0022cTatWtXZiFDuiSo8EYFDIsXL7ZtttnGmjZtmoyqwgfVcFFhjP5q166d/C7KgOb94YcfEsvQetTHiAoqVJiSqUBINUYmT56cdhVqMkxNhxEQQACBuAhQ6BGXPUE6EEAAAQQQQCAhcOihhyY6fuzeqYGNuT56ocXBl02yL79fbS1btbb333/fttxyS0QRQAABBBBAAAEENhIBFQLcdNNNiZq8qTZp8ODBkTv7TjU/09IL7L777oG+RFxMFZiohsdhhx3mJvGJAAIIxEKgdA9KsUgWiUAAAQQQQACBqiiw22672Wclb5GdevDm9pdLOkQimLd4tfW44nObuWCt7bRzB5swYUKk+YiEAAIIIIAAAgggUHkEGjdubLfddlui+VM1YTpu3LhAE0tz5sypPBtTiVK6evXqUgUeHTp0sOOOOy6xLxo1alSJtoakIoBAVRGgpkdV2dNsJwIIIIAAAjEXaNu2rf3w/ff2x1Nb2uWnbBcptR9PW2z/c9OXtmxldevSpUuihkikGYmEAAIIIIAAAgggUKkF1DyTmpNasGCBLV++3NTpuZqDIuRfQH2X1KpVK9EU1lZbbUXfHfknZokIIJBnAQo98gzK4hBAAAEEEEAge4GtttrSfvllgT1y+fZ2bNf/tlucaUkvfjDXfj/kG1u7voYdc8wx9uyzz2aKzncIIIAAAggggAACCCCAAAIIIFAFBGjeqgrsZDYRAQQQQACBOAvUq1vX1q1bbZ88uKe12apupKQ+OO4Hu2r4D2bVa9jZZ/+vDRs2LNJ8REIAAQQQQAABBBBAAAEEEEAAgY1boPrGvXlsHQIIIIAAAgjEVWDevHlWu3Ytq2ZrbO6Y/SMXeNzw+DS75rEfbX3JnAMHDqTAI647mHQhgAACCCCAAAIIIIAAAgggUAQBCj2KgM4qEUAAAQQQqOoCr7zyirVo0dwa1FlvM0ftF5njonu/sL+8ON9q1KxtQ4YMseuuuy7yvEREAAEEEEAAAQQQQAABBBBAAIGNX4BCj41/H7OFCCCAAAIIxEpg0KBBJX1wHG3Nmph9MyJ6gcfpN022Z95ZZLVq17Enn3zSLrjgglhtF4lBAAEEEEAAAQQQQAABBBBAAIHiC9CRefH3ASlAAAEEEECgygj87ne/s4ceetBab1nDJg+PXuDRY9AkmzxjjTVo0MiGDx9uPXr0qDJmbCgCCCCAAAIIIIAAAggggAACCEQXoCPz6FbERAABBBBAAIEcBFRQoWat9u1Yz8YN3jPSklavXW97XzDR5v9azVq2bG3vvvuuNW3aNNK8REIAAQQQQAABBBBAAAEEEEAAgaonQKFH1dvnbDECCCCAAAIVLrDnnnvaxIkT7fgDNrWHL9sl0vq/mbnMTrh+qs1fUt2232GHxPyRZiQSAggggAACCCCAAAIIIIAAAghUWQEKParsrmfDEUAAAQQQqBiBli1b2uzZs6z/Cc3t6jPbR1rp+E8XWJ87vrZVa2va3nvvbW+++Wak+YiEAAIIIIAAAggggAACCCCAAAJVW4COzKv2/mfrEUAAAQQQKKhAs2bNbO6c2XbNmW0iF3iMeHOmnXrTl7ZyTQ074ogjKPAo6B5i4QgggAACCCCAAAIIIIAAAghsXALU9Ni49idbgwACCCCAQGwEGjdubCuWL7HxQzpZh20aRkrXgGFT7InXFljNTWrZGb172/333x9pPiIhgAACCCCAAAIIIIAAAggggAACEqCmB8cBAggggAACCORVYM6cOVa3bh1bs2qpfTOia+QCj4EPfmkj3lhoVq26/eEPf6DAI697hYUhgAACCCCAAAIIIIAAAgggUDUEKPSoGvuZrUQAAQQQQKBCBEaPHm2tW7eyOjVW26zR+1vDetEqlZ5z+2f2xN8X2oaS9zHuvvtuu+GGGyokvawEAQQQQAABBBBAAAEEEEAAAQQ2LoFqG0rCxrVJbA0CCCCAAAIIFEug1iY1bf36dTZ/7IGRk9Drmk9twlerrXqNTeyRRx6x448/PvK8REQAAQQQQAABBBBAAAEEEEAAAQR8AWp6+BoMI4AAAggggEC5BX7++eeSlqmqWb26tazn1RMjLefgyybZxK/XWsNGTey1116jwCOSGpEQQAABBBBAAAEEEEAAAQQQQCCdAIUe6WSYjgACCCCAAAJZCZx37lm2605tbMjNZ9nn36238+76d9r55y1ebXv//hObPmuDNWvWwiZMmGD77LNP2vh8gQACCCCAAAIIIIAAAggggAACCEQRoNAjihJxEEAAAQQQQCCjwLx58+xvr79pp/bqaod128X++sDFNv7zVaa+OsLhk68XW7f+k23OIrPf/KadTZs2zVq2bBmOxjgCCCCAAAIIIIAAAggggAACCCCQtQCFHlmTMQMCCCCAAAIIhAUuvvA827bNlnbicV0SX3XYobU9/VB/e/ffq+zUGyclo7/4wVzredUUW7KyhnXuvId9/PHHye8YQAABBBBAAAEEEEAAAQQQQAABBHIVoCPzXAWZHwEEEEAAgSousHTpUtu6TUu77epT7IiDdw1ofPbF99bn4vus83Y1bf9dNrWrH/nBataqY4cffrg999xzgbiMIIAAAggggAACCCCAAAIIIIAAArkKUOiRqyDzI4AAAgggUMUFDjm4m82f+529PPLylBKz5iy0I08ebL8sWmG1a9e23r1724MPPpgyLhMRQAABBBBAAAEEEEAAAQQQQACBXARo3ioXPeZFAAEEEECgigts2LChpBPyidarx55pJKrZ8Gc+s9p1m9imm25qu+++OwUeaaSYjAACCCCAAAIIIIAAAggggAACuQvUzH0RLAEBBBBAAAEEqqpA375nW9OtGluf07uXIrj8xnH25jsfW4MGDe2oo46yhx56qFQcJiCAAAIIIIAAAggggAACCCCAAAL5FKB5q3xqsiwEEEAAAQSqmECTJg2t3fa72G1X9rD22zSxxb8ut5uHvmkvv/5P22yzze3444+3W2+9tYqpsLkIIIAAAggggAACCCCAAAIIIFAsAWp6FEue9SKAAAIIIFDJBU499VSrVbOGbdWild3x8Ee2Zuls+3zq99aqVRu7//4H7KSTTqrkW0jyEUAAAQQQQAABBBBAAAEEEECgsglQ06Oy7THSiwACCCCAQEwENtussbX7zba2bu0q+2LqDNt7733s3HPPNRWGEBBAAAEEEEAAAQQQQAABBBBAAIFiCFDToxjqrBMBBBBAAIFKLtCzZ09btbKksOOLr+zAbt3t4Ueest12262SbxXJRwABBBBAAAEEEEAAAQQQQACByi5AoUdl34OkHwEEEEAAgSIIdO60s82cOdOee+45a926dRFSwCoRQAABBBBAAAEEEEAAAQQQQACB0gI0b1XahCkIIIAAAggggAACCCCAAAIIIIAAAggggAACCCBQCQWqV8I0k2QEEEAAAQQQQAABBBBAAAEEEEAAAQQQQAABBBBAoJQAhR6lSJiAAAIIIIAAAggggAACCCCAAAIIIIAAAggggAAClVGAQo/KuNdIMwIIIIAAAggggAACCCCAAAIIIIAAAggggAACCJQSoCPzUiRMQAABBBBAAAEEEEAAAQQQQAABBBBAIHeBJYvW2oR3F9rPs1bbsiXrbdniNbZunVmzNrWtWava1rTlfz4326pW7itjCQgggAACCQE6MudAQAABBBBAAAEEEEAAAQQQQAABBBBAIE8CKuh4Y8wv9u20pfb5xKWRllqvfg3bsVN967RvI+uwRyNrtCnvKUeCIxICCCCQQoBCjxQoTEIAAQQQQOD/2DsP+CiKL44/SkIJvffeewdBBAERpVuxUFSwIBbEBlZUFEHEiv7tDQVBmhRBujRBlI703kMPvf3zmzjL7ObucpfcJVd+7/NZdnZ2Znbmuxtud96890iABEiABEiABEiABEiABEiABHwhcDrukvz40T5Z/scxOXfussRki1dk1MopJcpml+jo9BKdKUP8ll6i4rdTJy5K3MkL8dYfF+O3C7Lg94O2S5Uqn1Uq1oyRGg1zKGWI7SQPSIAESIAEPBKg0sMjHp4kARIgARIgARIgARIgARIgARIgARIgARIgAc8EZk88Kr9+v1+O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CZAACZAACZAACZBAahCg0iM1KPMaJEACJEACJEACJEACJEACbgmUKVNGLl26pM5v3rxZoqKi3JblCRIgARIgARIgARIgARIgARLwRIBKD090eI4ESIAESIAESIAESIAESCBgBK5cuSKlS5cW7CFbtmyRjBn5iRIw4GyYBEiABEiABEiABEiABCKAAL8oIuAmc4gkQAIkQAIkQAIkQAIkEGwELl++LOXKlbMUHtu3b5d06dIFWzfZHxIgARIgARIgARIgARIggRAjkD7E+svukgAJkAAJkAAJkAAJkAAJhDiBixcvCmJ4wKVV+vTpZdu2bVR4hPg9ZfdJgARIgARIgARIgARIIFgIUOkRLHeC/SABEiABEiABEiABEiCBCCAAhUflypUF+wwZMsimTZuU4iMChs4hkgAJkAAJkAAJkAAJkAAJpAIBKj1SATIvQQIkQAIkQAIkQAIkQAIkIHLhwgWpWrWqnD9/XsXu2LBhA2N48MEgARIgARIgARIgARIgARLwKwEqPfyKk42RAAmQAAmQAAmQAAmQAAm4InDu3DmpUaOGnD17VqKiomTdunVq76os80iABEiABEiABEiABEiABEgguQSo9EguOdYjARIgARIgARIgARIgARLwigAUHXXq1JHTp09LdHS0rF69WjJlyuRVXRYiARIgARIgARIgARIgARIgAV8IUOnhCy2WJQESIAESIAESIAESIAES8InAmTNnpF69ehIXFyeZM2eWFStWSJYsWXxqg4VJgARIgARIgARIgARIgARIwFsCVHp4S4rlSIAESIAESIAESIAESIAEfCJw6tQpadiwoZw8eVIpOpYvXy4xMTE+tcHCJEACJEACJEACJEACJEACJOALASo9fKHFsiRAAiRAAiRAAiRAAiRAAl4RgMKjSZMmcvz4ccmaNassXbpUsmXL5lVdFiIBEiABEiABEiABEiABEiCB5BKg0iO55FiPBEiABEiABEiABEiABEjAJQG4smratKkcPXpUWXYsXrxYcuTI4bIsM0mABEiABEiABEiABEiABEjAnwSo9PAnTbZFAiRAAiRAAiRAAiRAAhFO4MSJE9KsWTM5fPiwsuxYsGCB5MqVK8KpcPgkQAIkQAKRRgCK/5IlS0rFihUjbegcLwmQAAmkOQEqPdL8FrADJEACJEACJEACJEACJBAeBODKqmXLlhIb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gNUGrDngvqpXr15K6EAlP/74o7Lw0FYgoRY8dMfnz58v1atX16dC4cNGwQMSIAESIAESSJYARY9k8fAmCZAACYSMAEWPkKFlxSRAAiRAAiRAAiRAAiSQOgIQPsaOHSs9evRQBSF01KtXT4kdEEAghiBo+SeffCIIfB6uNGnSpESBWCl8hIs82yEBEiABEnAjgfPnz6tu072VG58e+0wCJOAFAhQ9vPAUOQYSIAESIAESIAESIAFPEXj55ZeV+KGDiWvrjhYtWsiMGTOkZcuWYR/v6NGjpWPHjna7FD5sFDwgARIgARIggUQELly4oM5p6ZEIC09IgARIIGwEMoetJTZEAiRAAiRAAiRAAiRAAiQQMAG4uYLAgTgesABB0vuAKwlyxiFDhsjll18un3/+uaoZwgfSE088ofb8QwIkQAIkQAIkIELRg68CEiABEogsAYoekeXP1kmABEiABEiABEiABEggWQIlSpRI9n64b7766quSL18+GTRokGqawke4nwDbIwESIAESiHYCFD2i/QmxfyRAAl4nQPdWXn/CHB8JkAAJkAAJkAAJkAAJBJlAnz59ZMCAAXatdHVlo+ABCZAACZAACdiWHozpwRcDCZAACUSGAEWPyHBnqyRAAiRAAiRAAiRAAiTgagL33HOPvPfee/YYKHzYKHhAAiRAAiQQ4wRo6RHjLwAOnwRIIOIEKHpE/BGwAyRAAiRAAiRAAiRAAiTgTgIdOnQQBDjXicKHJsE9CZAACZBALBOg6BHLT59jJwESiAYCFD2i4SmwDyRAAiRAAiRAAiRAAiTgUgKNGjWSyZMn272n8GGj4AEJkAAJkECMEjh//rwaOd1bxegLgMMmARKIOAGKHhF/BOwACZAACZAACZAACZAACbibQLVq1eSXX36xB0Hhw0bBAxIgARIggRgkQEuPGHzoHDIJkEBUEaDoEVWPg50hARIgARIgARIgARIgAXcSKFWqlKxZs8buPIUPGwUPSIAESIAEYowARY8Ye+AcLgmQQNQRoOgRdY+EHSIBEiABEiABEiABEiABdxLInTu3bNu2TS677DI1AAof7nyO7DUJkAAJkED6CGjRg+6t0seRpUmABEggrQQoeqSVHMuRAAmQAAmQAAmQAAmQAAn4JLBu3TopXry4ukfhwyciXiQBEiABEvAwAcb08PDD5dBIgARcQYCihyseEztJAiRAAiRAAiRAAiRAAu4isHDhQqlatarqNIUPdz079pYESIAESCB9BLSlR3x8fPoqYmkSIAESIIE0EaDokSZsLEQCJEACJEACJEACJEACJJASgalTp0r9+vVVNgofKdHifRIgARIgAa8Q0G6t9N4r4+I4SIAESMAtBCh6uOVJsZ8kQAIkQAIkQAIkQAIk4EICX331ldx8882q5xQ+XPgA2WUSIAESIIFUE6B7q1QjYwESIAESCCoBih5BxcnKSIAESIAESIAESIAESIAEnATef/996datm7pM4cNJh+ckQAIkQAJeI0D3Vl57ohwPCZCA2whQ9HDbE2N/SYAESIAESIAESIAESMCFBF577TXp3bu36jmFDxc+QHaZBEiABEggYAJa9KB7q4CRMSMJkAAJBJUARY+g4mRlJEACJEACJEACJEACJEAC/gg89dRT8uKLL6rbFD78UeJ1EiABEiABtxPQokdcXJzbh8L+kwAJkIArCVD0cOVjY6dJgARIgARIgARIgARIwJ0EevbsKQMHDlSdp/DhzmfIXpMACZAACSRPQMf0oOiRPCfeJQESIG9pDswAAEAASURBVIFQEaDoESqyrJcESIAESIAESIAESIAESMAngc6dO8tnn32m7lH48ImIF0mABEiABFxMQFt60L2Vix8iu04CJOBqAhQ9XP342HkSIAESIAESIAESIAEScCeBpk2bypQpU1TnKXy48xmy1yRAAiRAAr4JaNGDlh6++fAqCZAACYSaAEWPUBNm/SRAAiRAAiRAAiRAAiRAAj4JXHPNNbJgwQJ1j8KHT0S8SAIkQAIk4EICFD1c+NDYZRIgAU8RoOjhqcfJwZAACZAACZAACZAACZCAuwiUKFFCli5dKqVKlRIIH6+//rq7BsDekgAJkAAJkICDgBY96N7KAYanJEACJBAmAhQ9wgSazZAACZAACZAACZAACZAACfgmUKhQIeXqqn79+vLJJ5/IM8884zsjr5IACZAACZCACwho0YPurVzwsNhFEiABTxKg6OHJx8pBkQAJkAAJkAAJkAAJkIC7COTNm1dGjBghLVq0kDFjxsjDDz8s586dc9cg2FsSIAESIAESsAhQ9ODLgARIgAQiS4CiR2T5s3USIAESIAESIAESIAESIIFLBLJnzy4ff/yxtGnTRqZOnSo9e/aUw4cPkw8JkAAJkAAJuIrA+fPnVX/p3spVj42dJQES8BABih4eepgcCgmQAAmQAAmQAAmQAAm4nUDGjBll2LBh0rJlS5k3b54SPrZv3x7QsCCU3H777QHlZSYSIAESIAESCBUBWnqEiizrJQESIIHACFD0CIwTc5EACZAACZAACZAACZAACYSRAGJ7wNXV8uXLlfCxbt26FFvfsGGD/Pbbb/Ldd9+lmJcZSIAESIAESCBUBLToQUuPUBFmvSRAAiSQPAGKHsnz4V0SIAESIAESIAESIAESIIEIEfj000+lWbNm8tdffynhY8mSJcn25O6771b3v//++2Tz8SYJkAAJkAAJhJKAFj0YyDyUlFk3CZAACfgnQNHDPxveIQESIAESIAESIAESIAESiDCBkSNHSuPGjWXXrl1K+Pjpp5/89uiKK64QCB/z58+XuXPn+s3HGyRAAiRAAiQQSgI6pgdFj1BSZt0kQAIk4J8ARQ//bHiHBEiABEiABEiABEiABEggCgiMGjVKGjZsKMeOHVPCx+TJk/32qlOnTurehAkT/ObhDRIgARIgARIIJQFt6UH3VqGkzLpJgARIwD8Bih7+2fAOCZAACZAACZAACZAACZBAlBD44osvpF69eoIJpN69e8vXX3/ts2c1atSQ9u3bC4SRFStW+MzDiyRAAiRAAiQQSgJa7IiPjw9lM6ybBEiABEjADwGKHn7A8DIJkAAJkAAJkAAJkAAJkEB0EYDQceONN6pOPffcc4Jg575S586d1eVx48b5us1rJEACJEACJBBSAtq9lRY/QtoYKycBEiABEkhCgKJHEiS8QAIkQAIkQAIkQAIkQAIkEK0ExowZI7Vr11bde/3112XgwIFJuooYIPXr1/drDZKkAC+QAAmQAAmQQBAJ0L1VEGGyKhIgARJIAwGKHmmAxiIkQAIkQAIkQAIkQAIkQAKRIwALjuuvv151YMiQITJgwIAknenYsaO6NmjQoCT3eIEESIAESIAEQklAix50bxVKyqybBEiABPwToOjhnw3vkAAJkAAJkAAJkAAJkAAJRCkBBCpH/A6kESNGSL9+/RL1FKJHuXLllLXHvn37Et3jCQmQAAmQAAmEkoAWPejeKpSUWTcJkAAJ+CdA0cM/G94hARIgARIgARIgARIgARKIYgITJ06UatWqqR6OHTtWHn74Ybu3WbJkEQgf+/fvp5srmwoPSIAESIAEwkGAMT3CQZltkAAJkIB/AhQ9/LPhHRIgARIgARIgARIgARIggSgnMHnyZLn22mtVL6dOnSp333233WOIHjlz5qS1h02EByRAAiRAAuEgoC096N4qHLTZBgmQAAkkJUDRIykTXiEBEiABEiABEiABEiABEogCAhAx5s+fn2JPfvjhB9vV1bx586RTp06qTKlSpWjtkSI9ZiABEiABEgg2AS160L1VsMmyPhIgARIIjABFj8A4MRcJkAAJkAAJkAAJkAAJkECYCYwePVq6desmXbp0SdFFFVxd1apVS/Vw+fLl0qJFC3WsA5p//fXXsnfv3jCPgM2RAAmQAAnEIgGKHrH41DlmEiCBaCKQ6RUrRVOH2BcSIAESIAESIAESIAESIAESAAHE6zh79qzMmjVL5syZozZcv/rqqyVDhgw4TJRuvfVWWbx4sezcuVMOHTok48ePlxdeeEFWr14ta9eulezZs0u9evUSleEJCZAACZAACQSbQOHChVVMqaxZsyrhPtj1sz4SIAESIIHkCWSw/AvGJ5+Fd0mABEiABEiABEiABEiABEggcgQWLVoko0aNkmnTpqlOVKlSRW677Ta1IWaHM91///0yc+ZMdTlv3rzSr18/JX7kzp1bEAPkyiuvdBbhOQmQAAmQAAkEncCJEyckV65cQa+XFZIACZAACSRPgJYeyfPhXRIgARIgARIgARIgARIggQgTKFGihLRr104FLD958qQsWbJE5s6dK9OnT5fTp09LuXLlJEeOHHYv27dvL9u3b5f169crSxHE+ahcubLs2rVLMmbMKI0bN7bz8oAESIAESIAEQkUAlh5MJEACJEAC4SdAS4/wM2eLJEACJEACJEACJEACJEAC6SAAV1eI0TF79mxVS7FixQSurTp37iwIXq7Tiy++KIgLYqZMmTIpa4+qVaual3lMAiRAAiRAAiRAAiRAAiTgEQK09PDIg+QwSIAESIAESIAESIAESCBWCMA9VYcOHWzLj5UrVwpcYI0bN04FK8+XL58ULVpUmjZtKufPn5elS5faaODdFwFmdaBz+wYPSIAESIAESIAESIAESIAEPEGAlh6eeIwcBAmQAAmQAAmQAAmQAAnELoHly5eroOUTJ05U7q5AAu6wYPkB4ePNN9+Ujz76KBGgb775RurWrZvoGk9IgARIgARIgARIgARIgATcT4Cih/ufIUdAAiRAAiRAAiRAAiRAAiRwiQBcX40dO1Z+/PFHdaVmzZrKKuT3338XiCI6wb3V1KlT9Sn3JEACJEACJEACJEACJEACHiFA0cMjD5LDIAESIAESIAESIAESIAES+JfA4sWL5fvvv1dCB4KdFypUSHLmzClbt261M3Xv3l1effVV+5wHJEACJEACJEACJEACJEAC7idA0cP9z5AjIAESIAESIAESIAESIAES8EPgyJEj8vnnnyvxwxQ8dPY+ffrIE088oU+5JwESIAESIAESIAESIAEScDmBjC7vP7tPAiRAAiRAAiRAAiRAAiRAAn4JIKg5RI158+bJiBEjpEGDBony+hJCEmXgCQmQAAmQAAmQAAmQAAmQgKsI0NLDVY+LnSUBEiABEiABEiABEiABEkgvgd27d8t//vMfOXDggPz999/prY7lSYAESIAESIAESIAESIAEoogARY8oehjsCgmQAAmQAAmQAAmQAAmQAAmQAAmQAAmQAAmQAAmQAAmQQNoJ0L1V2tmxJAmQAAmQAAmQAAmQAAmQAAmQAAmQAAmQAAmQAAmQAAmQQBQRoOgRRQ+DXSEBEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEkg7AYoeaWfHkiRAAiRAAiRAAiRAAiRAAiRAAiRAAiRAAiRAAiRAAiRAAlFEgKJHFD0MdoUESIAESIAESIAESIAESIAESIAESIAESIAESIAESIAESCDtBCh6pJ0dS5IACZAACZAACZAACZAACZAACZAACZAACZAACZAACZAACUQRAYoeUfQw2BUSIAESIAESIAESIAESIAESIAESIAESIAESIAESIAESIIG0E6DokXZ2LEkCJEACJEACJEACJEACJEACJEACJEACJEACJEACJEACJBBFBDJHUV/YFRIgARIgARIgARIgARIgARJwNYELFy7Ixo0b1RiyZs0q5cqV8zueixcvyoYNG9T9XLlyScmSJf3m5Q0SIAESIAESIAESIAESIIHACGSIt1JgWZmLBEiABEiABEiABEiABEiABEggOQIQPZo3by5///23yjZv3jwpU6aMzyIzZsyQBx54QN3r1KmTDBo0yGc+XiQBEiABEiABEiABEiABEgicAN1bBc6KOUmABEiABEiABEiABEiABEggWQKZM2eWfv362Xk+/PBD+9g8iIuLk8GDB9uXHnvsMfuYByRAAiRAAiRAAiRAAiRAAmknQNEj7exYkgRIgARIgARIgARIgARIgASSEGjZsqVUqVJFXR87dqzs3LkzSZ6ff/5Z1q9fr6537dpVypYtmyQPL5AACZAACZAACZAACZAACaSeAEWP1DNjCRIgARIgARIgARIgARIgARLwSyBjxoyJrD0++eSTRHnhYXjIkCH2td69e9vHvg7OnDkje/fuFViHpDadPn1ald2zZ4+cPHkytcWZnwRIgARIgARIgARIgARcR4Cih+seGTtMAiRAAiRAAiRAAiRAAiQQ7QSaNGkiNWrUUN0cNWqUEh50n3/55RdZuXKlOr333nulePHi+pa9R2yQoUOHCuqpVKmS1K5dW1mDdO7cWVasWGHncx4cOXJERowYIe3bt5fSpUtL5cqVVdk6derIVVddpa599dVXzmI8JwESIAESIAESIAESIAHPEKDo4ZlHyYGQAAmQAAmQAAmQAAmQAAlEC4EMGTIksvb49NNP7a6ZVh4PPfSQfV0fnDhxQm677TZ599137YDo+t6yZcukY8eOMm7cOH3J3qMcXGUNGDDAFlXsm8ZBvnz5jDMekgAJkAAJkAAJkAAJkIC3CGT21nA4GhIgARIgARIgARIgARIgARKIDgJ169YVbAsXLpThw4fLgw8+KJs3bxYIF0gQPAoXLpyksxBIdJ7LLrtMlcufP7/88ccfMn78eJX/lVdekRYtWsjll19ul0dgdB0nBBdvueUWZemRO3dugcstuMmCJUjVqlXtMjwgARIgARIgARIgARIgAa8RyGD5k4332qA4HhIgARIgARIgARIgARIgARKIBgLLly+XTp06qa48/PDDSriACIIEN1UQM8wEUaJ69er2pSVLliQSRkaPHi0vvviiuo99z5497bxwfaXFEgRQh0srJhIgARIgARIgARIgARKINQJ0bxVrT5zjJQESIAESIAESIAESIAESCBuBmjVrStOmTVV7H374obL6wEnfvn2TCB64vnHjRuxU6tKlSyLBAxfvuOMOgfUH0pYtW9Re/8maNas+lO+++y7JffsmD0iABEiABEiABEiABEjAwwTo3srDD5dDIwESiE0CMOCDH/FoTtrIMNr7Gc0M2TcSIAESIAH3EHjqqafkp59+sjsM0QIBzH2lHTt22JfxOandWdkXrYPs2bPLyZMnk8T7aN26tS2qwNIDW9GiRaVBgwbSuHFjadSokeTKlcusisckQAIkQAIkQAIkQAIk4DkCFD0890g5IBIggVgngAkSLSqYLPwJDOkRSQJpx1ce9Ev3R9/X52afU3Os6zHr9lU+0Hy+yvIaCZAACZAACaSFwNVXXy1t27aVqVOnquKPP/645MmTx2dV+/fvt69D8PAleugMED7MdNddd0mWLFnknXfekUOHDqlbe/bsUUHPdeDz559/Xnr16mV/DpvleUwCJEACJEACJEACJEACXiBA0cMLT5FjIAESIIFkCKRXTEim6jRPmOg+aQFC73Vb+r4+D+Y+0Lp1nwLNH8w+si4SIAESIAHvEahfv74teiQXawOWGTrhuFChQvo0yd6M/YGbCFbetWtXQWyPpUuXyoIFC+TXX3+VlStX2mXfeOMNyZcvn9x66632NR6QAAmQAAmQAAmQAAmQgJcIUPTw0tPkWEiABEjAIoDJ+kAm6vWkPvb6GOWcZfU9wHXeCwQ4yut6dV1676wzpfp1OZ1Pnzv7ges6j/Neas+DWVdq22Z+EiABEiCB2CNQtmxZe9Bt2rSRl156yT4P9ACxPerVq6e2fv36ydGjR2Xo0KEyfPhwVcX06dMpegQKk/lIgARIgARIgARIgARcR4Cih+seGTtMAiRAAskTSMtkf1xcnC1MmLX7ExXMPCkd++uPeR3HgbRllkkpP8WKlJ4M75MACZAACUQjgfLly6tA5XBdNWLECKlbt67cdNNN6erq5ZdfLjfffLMtehw5ciRd9YW68NlT8bJ0+SIZ+v5ggWuwypUry5VXXqm2/Pnzh7p51k8CJEACKRLYt2+frF69Wm2IlZQzZ0713q33BQsWlCJFivh1ZZhiA8xAAiRAAiSQLgIUPdKFj4VJgARIwD0E/IkEcIWBBEHBn/hgig3JjRhtYNN1mnn9iRD++mWWNY9Tm98sm5rjQMecmjqZlwRIgARIgARSIoAg57DueOaZZ1TW++67T4keLVu2lLx580q2bNkEcT/27t0rjz32WKLqhgwZIufOnZPixYvbeU+dOiWbNm2SL7/80s4LISGa0oXzIufPxsuFCyJxFxOsVjdt3CGLFi1Sm9nXJg1bSpt2reTm9q0lR44c5i0ekwAJkEBICfz5558yadIkmTNnjvz1118BtQURBOKH3uC2EMfY586dW9WRnMvDgBphJhIgARIggSQEMliTR/FJrvICCZAACZCAZwgk9zavJ/b95dH3A4Gh68DeFD30dV2HWad5z7yu82Jv5jGvp3Tsrz6znFl3IPnNsjwmARIgARIggdQQ+Prrr+W5555TRSZPnizVqlXzWxwWmE8++aR89913fvPgBibgzIl/TJwhcHly6YorrpCZM2dKgQIFkssWknvWsOSfI/Hyz9E4OXksXs6dtcSOc/GycfNK+X3VPPnnxFE5cfKotT8mp06fkD83Lvfbj8IFi0uTxi2lrSWANGxc228+3iABEiCB9BL46aefZOLEiUrwSG9d/spv27bN3y1eJwESIAESSAMBWnqkARqLkAAJkIBbCJiT+s4+m5P8ODbzmvec5VI691XW1zWzvZTqNO+bfXUem/lSc6z74qufqamHeUmABEiABEggGASweGDQoEEqIPnbb7+dKBC5WT/cq5QpU0Zdunjxohw/fty8negYFiRdunSR7t27h13wOLQ3To4egNgRL3Fx8bJv/05Zs36RrF630BI75ss/ltDhTLkvu1wqXFlNzl84J//8c1iOHT8sFy5aJiGX0r4Du2TM+JFqu65aHalbr47kL5BHucPiqmlNiXsSIIH0EIDQASu5pUuXpqeaFMv26dNHWbUhplPhwoVTzM8MJEACJEACKROgpUfKjJiDBEiABFxLQE/mYwC+JvT1fb1HHl/5ggVAt+OvP77aMcvgPs51P817aem3v1gmvvrBayRAAt4loN9XvDtCjsztBPB5BXdWiMUBQQRurgoVKiSZMyddw3bw4EE5fPiwnD9/XiCE5MmTR/Lly6fcqJiWmOFgcu5MvOzZGifLl6yTRctnyo7dG2XLtnWyZ1/CiuZclrBRpHApKV6kjBQtXEaKFCojxYqUtq6Vkdy58ibp4pGjB2TfgR2WaGJtB3bKfhxb25o/FyfKO3bsWKHwkQgJT0iABFJJ4L333pP//e9/iUrBdWD16tWlVKlSUqJECbVlz549UR59AlEa79vYO4/hhtBf+vDDD6Vt27b+bvM6CZAACZBAgAQoegQIitlIgARIwC0ETCHA7LNTFND5sNcTflpMMMsF61i3p+vT/dHX9Tnu62s6r7lHPud9s6yZ19exWTY15XzVxWskQALeIID3Bb4feONZchTRQ2DTnwdl4oQZsnDxLFm+cq7dsRrXNJSrKtWS6lXrSfkr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8bnXbj1XYZvN2FWuxtnIKHQbNQChH4yzlMeaCQvcR33pvHKZW9h7wX2vKD93jG452ut4NF/H5bZx3ai5+blea58qR1kgX6+1LCzOpJ6295nF6SdOHZXPmARIoLQIXHvttfL1118HBtWvXz/BE8NLL710ID8s4SrnUY7Dz99++23ZbLPN6lWvrq4O5HHtSOAABxiL8Bo0aJAceuihMmTIEPnuu++SvF555RV55plnZI899kjm8YIESECEa1jDvwu4hjX8PeAISIAE8k+gRf5FUiIJkAAJkAAJJM4piKPYh1LXr9fU+S1evDjpfqgpKYz0XiJGwNxymV9YW5XtvkfcPPca7f10rmNy+83mGuPBK2xurjyt5+ZFXbt108mNksF8EiCBxkng448/lrvuuisweOzugCulOAaPQEMncf/99zspXmZKAMaPp556StZcc81A0wsvvDCwqyZQyAQJNEMCXMNK86ZzDSvN+8JRkQAJZEaARo/MeLE2CZAACZBADAKqhEWMEKWIhbFD66aqZ4U0kX90RwGexlcFfBSfxjRl915jPjq/TOeQion2obEr230fab6+v5AOkxvWRtvmGuciW9siThVQrgZDnV+q+iwjARJoegQefPDBwKTg0ur666+X1q1bB/IzTUBh//PPP2fajPUdAnAndu+99zo5Yl2QvfTSS4E8JkigORPgGla6d59rWOneG46MBEggHgEaPeJxYi0SIAESIIEYBFQJixhK2PLy8noGD5RpPYgMq6d1EDeFoPPVHR5qEMDcm0Jw7xPmpvPL19yUH2Lty2Xn5vt9ho3Flaf1w+ppWSZx2FgwVv+lMrW+G6NM62s9N3bHr+N2ebh1eU0CJNB0CSxcuFAeffTRwAQPP/xwqajIjwfjxx9/PCCbicwJ4HDg3XbbLdDwiSeeCKSZIIHmSoBrWOnfea5hpX+POEISIIFoAvn5izhaPktIgARIgASaAQFfYQtFrBtQrkHrplLqhtVFXmNS7OIJfHDQ3QYYuyqodX5NJc7kvuh7IU4brav3Hmlt55ehjuZpnVTvQ62jshE3VHDnpWNwx4c8nZvW9eem7RiTAAk0HwLvvPNOPVdJOEw7X+HOO++Uww47zD7AkKtMnAWCc0c+/fRTu56ttdZasvrqq2dloFm0aJH897//tbLatWsnq666qqy77rrJ74dsxoq19dtvv7Vy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buYMET9A0QjDCuJ0AU9au66krrrqKtl3333rNcNP4OHDhyfPKqlXISQDBqGnn346pCQ8CwYp3ItZs2YlK8DYgbNXcG4AAwmQgJTsGgZD6jHHHBP7FsE134QJE0I/2++99574uzOiBPtrGHaYVFZW1qv+v//9T7D2x1kXtfFxxx0np59+uibTxlzD0iJiBRIggRInQPdWJX6DODwSIAESIAESIAESIAESIAESCCOw6qqr2h0ObhkU8yeeeKJ92tfNz+UaZ2vsuOOOsUXgaeKnnnpK/IPIwwSgDvzchxk8UB+uqPBkdDpZKI+r0INB6JZbbpGTTz45bEihedjpETd8+eWXMnTo0IDBA21hUKLBIy5F1msOBEp1Ddt1113lmmuuiXULNt10U4ELrKjPdp8+fQTnbqQLAwYMiG0cWXbZZeXVV1+1htV0crXc3W2ieVEx17AoMswnARJoTARo9GhMd4tjJQESIAESIAESIAESIAESIAGHwBFHHCHYheAGGBygQBs1apRMnTrVupuqrq52q4Ret23bNjQfme6B5loJrqKiAty84IyNAw44IPRMEDzRvM8++wjcTEEpmCr06tXLumfZbbfdAudxoA2MIvDBjwPTM3E/hbmedNJJdrfHnnvumdaogr6inqpeuHChfPXVVwKf/P/85z8F54bALZYb4LoL7sAYSIAEggRKdQ3be++9BYd4Yy11zwHS0WN3B9zq4UyNlVdeWbNDY+z0eP7558U/4wOVIWfIkCGCc45gYI4bYOjFeUnof6uttgodoysLLq+iAtewKDLMJwESaMwE6N6qMd89jp0ESIAESIAESIAESIAESKDZE4Crk7///e/23IwoGDhDwz+vI6puIfJ//fXXpF977OqA0SObANdU33zzjfVp36lTJ3s+hrrygmEHrrigoIRBpk2bNrHdfGEsOLsErrngtx/XaL/MMstYRSTiqAA3WjfccENUsX0aG096Rz0JHtmQBSTQTAiU+hqGdQdrC144a2jNNddMa2SIunVYp7BzDGeGYC1caaWVklXhUgpncmD9wqt169bJsjgXaIuziBCjH6xhWGthTEll1OYaFocu65AACTQ2AnQm2tjuGMdLAiRAAiRAAiRAAiRAAiRAAg4BuDp57LHH7KHZDz/8sFNSd4mDbxsy4IBzvHINMHDgyWi8/ACjQli+Xy8qDQVhjx497CuqTlg+FKFRAeee4El2GjyiCDGfBERKfQ3DugNXXHjlGrAW4LD0sNC+fXvBK9vQoUMHWX/99TNuzjUsY2RsQAIk0AgI0L1VI7hJHCIJkAAJkAAJkAAJkAAJkAAJpCKAnQhXXnmlPR9jv/32q/cU8vfff5+qOctyIIDdIW6A2xkc8I7D2RHT4OHS4TUJhBPgGhbOpRi5XMOKQZl9kAAJFJsA3VsVmzj7IwESIAESIAESIAESIAESIIECE1BXT7/88ovMnz/fPqEMVyoM+SeAc1PgqgY7WeByC0YPdbmV/94okQSaBwGuYcW7z1zDiseaPZEACRSPAI0exWPNnkiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABApIgO6tCgiXokmABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABIpHgEaP4rFmTyRAAiRAAiRAAiRAAiRAAiRAAiRAAiRAAiRAAiRAAiRAAgUkQKNHAeFSNAmQAAmQAAmQAAmQAAmQAAmQAAmQAAmQAAmQAAmQAAmQQPEI0OhRPNbsiQRIgARIgARIgARIgARIgARIgARIgARIgARIgARIgARIoIAEaPQoIFyKJgESIAESIAESIAESIAESIAESIAESIAESIAESIAESIAESKB4BGj2Kx5o9kQAJkAAJkAAJkAAJkAAJkAAJkAAJkAAJkAAJkAAJkAAJFJAAjR4FhEvRJEACJEACJEACJEACJEACJEACJEACJEACJEACJEACJEACxSNAo0fxWLMnEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiCBAhKg0aOAcCmaBEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEigeARo9Cgea/ZEAiRAAiRAAiRAAiRAAiRAAiRAAiRAAiRAAiRAAiRAAiRQQAI0ehQQLkWTAAmQAAmQAAmQAAmQAAmQAAmQAAmQAAmQAAmQAAmQAAkUjwCNHsVjzZ5IgARIgARIgARIgARIgARIgARIgARIgARIgARIgARIgAQKSIBGjwLCpWgSIAESIAESIAESIAESIAESIAESIAESIAESIAESIAESIIHiEaDRo3is2RMJkAAJkAAJkAAJkAAJkAAJkAAJkAAJkAAJkAAJkAAJkEABCdDoUUC4FE0CJEACJEACJEACJEACJEACJEACJEACJEACJEACJEACJFA8AjR6FI81eyIBEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiggARo9CgiXokmABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABIpHgEaP4rFmTyRAAiRAAiRAAiRAAiRAAiRAAiRAAiRAAiRAAiRAAiRAAgUkQKNHAeFSNAmQAAmQAAmQAAmQAAmQAAmQAAmQAAmQAAmQAAmQAAmQQPEI0OhRPNbsiQRIgARIgARIgARIgARIgARIgARIgARIgARIgARIgARIoIAEaPQoIFyKJgESIAESIAESIAESIAESIAESIAESIAESIAESIAESIAESKB4BGj2Kx5o9kQAJkAAJkAAJkAAJkAAJkAAJkAAJkAAJkAAJkAAJkAAJFJAAjR4FhEvRJEACJEACJEACJEACJEACJEACJEACJEACJEACJEACJEACxSNAo0fxWLMnEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiCBAhKg0aOAcCmaBEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEigeARo9Cgea/ZEAiRAAiRAAiRAAiRAAiRAAiRAAiRAAiRAAiRAAiRAAiRQQAI0ehQQLkWTAAmQAAmQAAmQAAmQAAmQAAmQAAmQAAmQAAmQAAmQAAkUjwCNHsVjzZ5IgARIgARIgARIgARIgARIgARIgARIgARIgARIgARIgAQKSIBGjwLCpWgSIAESIAESIAESIAESIAESIAESIAESIAESIAESIAESIIHiEaDRo3is2RMJkAAJkAAJkAAJkAAJkAAJkAAJkAAJkAAJkAAJkAAJkEABCdDoUUC4FE0CJEACJEACJEACJEACJEACJEACJEACJEACJEACJEACJFA8AjR6FI81eyIBEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiggARo9CgiXokmABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABIpHgEaP4rFmTyRAAiRAAiRAAiRAAiRAAiRAAiRAAiRAAiRAAiRAAiRAAgUkQKNHAeFSNAmQAAmQAAmQAAmQAAmQAAmQAAmQAAmQAAmQAAmQAAmQQPEI0OhRPNbsiQRIgARIgARIgARIgARIgARIgARIgARIgARIgARIgARIoIAEaPQoIFyKJgESIAESIAESIAESIAESIAESIAESIAESIAESIAESIAESKB4BGj2Kx5o9kQAJkAAJkAAJkAAJkAAJkAAJkAAJkAAJkAAJkAAJkAAJFJAAjR4FhEvRJEACJEACJEACJEACJEACJEACJEACJEACJEACJEACJEACxSNAo0fxWLMnEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiCBAhKg0aOAcCmaBEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEigeARo9Cgea/ZEAiRAAiRAAiRAAiRAAiRAAiRAAiRAAiRAAiRAAiRAAiRQQAI0ehQQLkWTAAmQAAmQAAmQAAmQAAmQAAmQAAmQAAmQAAmQAAmQAAkUjwCNHsVjzZ5IgARIgARIgARIgARIgARIgARIgARIgARIgARIgARIgAQKSIBGjwLCpWgSIAESIAESIAESIAESIAESIAESIAESIAESIAESIAESIIHiEaDRo3is2RMJkAAJkAAJkAAJkAAJkAAJkAAJkAAJkAAJkAAJkAAJkEABCdDoUUC4FE0CJEACJEACJEACJEACJEACJEACJEACJEACJEACJEACJFA8AjR6FI81eyIBEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiggARo9CgiXokmABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABIpHgEaP4rFmTyRAAiRAAiRAAiRAAiRAAiRAAiRAAiRAAiRAAiRAAiRAAgUkQKNHAeFSNAmQAAmQAAmQAAmQAAmQAAmQAAmQAAmQAAmQAAmQAAmQQPEI0OhRPNbsiQRIgARIgARIgARIgARIgARIgARIgARIgARIgARIgARIoIAEaPQoIFyKJgESIAESIAESIAESIAESIAESIAESIAESIAESIAESIAESKB4BGj2Kx5o9kQAJkAAJkAAJkAAJkAAJkAAJkAAJkAAJkAAJkAAJkAAJFJAAjR4FhEvRJEACJEACJEACJEACJEACJEACJEACJEACJEACJEACJEACxSNAo0fxWLMnEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiCBAhKg0aOAcCmaBEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEigeARo9Cgea/ZEAiRAAiRAAiRAAiRAAiRAAiRAAiRAAiRAAiRAAiRAAiRQQAL/D2QsXoszqvK7AAAAAElFTkSuQmCC" } }, @@ -39,35 +30,71 @@ "\n", "We'll focus on ideas from one paper, `Corrective RAG (CRAG)` [here](https://arxiv.org/pdf/2401.15884.pdf).\n", "\n", - "![Screenshot 2024-02-07 at 1.21.51 PM.png](attachment:9db7f9db-55aa-48cb-95d5-bcde3f937589.png)\n", + "![Screenshot 2024-02-07 at 1.21.51 PM.png](attachment:a65940f9-5c51-4d7c-9ca1-ae576e4bb51a.png)\n", "\n", - "## Dependencies\n", + "## Setup\n", "\n", - "Set `MISTRAL_API_KEY` and set up Subscription to activate it.\n", + "### Using APIs \n", "\n", - "Set `TAVILY_API_KEY` to enable web search [here](https://app.tavily.com/sign-in).\n", + "* Set `MISTRAL_API_KEY` and set up Subscription to activate it.\n", + "* Set `TAVILY_API_KEY` to enable web search [here](https://app.tavily.com/sign-in).\n", "\n", - "If you want to run this locally, use [Ollama](https://ollama.ai/library/mistral/tags):\n", + "### Using CoLab \n", "\n", - "* Download [Ollama app](https://ollama.ai/)\n", - "* Download Mistral e.g., `ollama pull mistral:7b-instruct`\n", + "* [Here](https://colab.research.google.com/drive/1U5OcwWjoXZSud30q4XOk1UlIJNjaD3kX?usp=sharing) is a link to a CoLab for this notebook. \n", "\n", - "Optionally, use [LangSmith](https://docs.smith.langchain.com/) for tracing (shown at bottom)." + "### Running Locally \n", + "\n", + "If you want to run this locally (e.g., on your laptop), use [Ollama](https://ollama.ai/library/mistral/tags):\n", + "\n", + "* Download [Ollama app](https://ollama.ai/).\n", + "* Download a `Mistral` model e.g., `ollama pull mistral:7b-instruct`, from various Mistral versions [here](https://ollama.ai/library/mistral) and Mixtral versions [here](https://ollama.ai/library/mixtral) available.\n", + "* Download LLaMA2 `ollama pull llama2:latest` to use Ollama embeddings.\n", + "* Set flags indicating we will run locally and the Mistral model downloaded:\n", + " \n", + "```\n", + "run_local = \"Yes\"\n", + "local_llm = \"mistral:7b-instruct\"\n", + "```\n", + "\n", + "### Tracing \n", + "\n", + "* Optionally, use [LangSmith](https://docs.smith.langchain.com/) for tracing (shown at bottom) by setting: \n", + "\n", + "```\n", + "export LANGCHAIN_TRACING_V2=true\n", + "export LANGCHAIN_ENDPOINT=https://api.smith.langchain.com\n", + "export LANGCHAIN_API_KEY=\n", + "```" ] }, { "cell_type": "code", - "execution_count": 2, + "execution_count": 6, "id": "abc064ab-7de1-4d03-a987-cd3078438d61", "metadata": {}, "outputs": [], "source": [ + "# Check API keys\n", "import os\n", "\n", "mistral_api_key = os.environ.get(\"MISTRAL_API_KEY\")\n", "tavily_api_key = os.environ.get(\"TAVILY_API_KEY\")" ] }, + { + "cell_type": "code", + "execution_count": 7, + "id": "9f644869-436e-4bf6-a267-b2465c7b5aef", + "metadata": {}, + "outputs": [], + "source": [ + "# Flags for running locally\n", + "\n", + "run_local = \"Yes\"\n", + "local_llm = \"mistral:instruct\"" + ] + }, { "cell_type": "markdown", "id": "6e2b6eed-3b3f-44b5-a34a-4ade1e94caf0", @@ -75,22 +102,41 @@ "source": [ "## Indexing\n", "\n", - "First, let's index a popular blog post on agents using [Mistral embeddings](https://python.langchain.com/docs/integrations/text_embedding/mistralai).\n", + "First, let's index a popular blog post on agents. \n", + "\n", + "We can use [Mistral embeddings](https://python.langchain.com/docs/integrations/text_embedding/mistralai).\n", + "\n", + "For local, we can use [GPT4All](https://python.langchain.com/docs/integrations/text_embedding/gpt4all), which is a CPU optimized SBERT model [here](https://docs.gpt4all.io/gpt4all_python_embedding.html).\n", "\n", "We'll use a local vectorstore, [Chroma](https://python.langchain.com/docs/integrations/vectorstores/chroma)." ] }, { "cell_type": "code", - "execution_count": 3, + "execution_count": 8, "id": "254ae533-79e0-42f4-b200-1ec9160e1d3d", "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "bert_load_from_file: gguf version = 2\n", + "bert_load_from_file: gguf alignment = 32\n", + "bert_load_from_file: gguf data offset = 695552\n", + "bert_load_from_file: model name = BERT\n", + "bert_load_from_file: model architecture = bert\n", + "bert_load_from_file: model file type = 1\n", + "bert_load_from_file: bert tokenizer vocab = 30522\n" + ] + } + ], "source": [ "from langchain.text_splitter import RecursiveCharacterTextSplitter\n", "from langchain_community.document_loaders import WebBaseLoader\n", "from langchain_community.vectorstores import Chroma\n", "from langchain_mistralai import MistralAIEmbeddings\n", + "from langchain_community.embeddings import GPT4AllEmbeddings\n", "\n", "# Load\n", "url = \"https://lilianweng.github.io/posts/2023-06-23-agent/\"\n", @@ -104,7 +150,12 @@ "all_splits = text_splitter.split_documents(docs)\n", "\n", "# Embed and index\n", - "embedding = MistralAIEmbeddings(mistral_api_key=mistral_api_key)\n", + "if run_local == \"Yes\":\n", + " embedding = GPT4AllEmbeddings()\n", + "else:\n", + " embedding = MistralAIEmbeddings(mistral_api_key=mistral_api_key)\n", + "\n", + "# Index\n", "vectorstore = Chroma.from_documents(\n", " documents=all_splits,\n", " collection_name=\"rag-chroma\",\n", @@ -150,7 +201,7 @@ }, { "cell_type": "code", - "execution_count": 4, + "execution_count": 9, "id": "10028794-2fbc-43f9-aa4c-7fe3abd69c1e", "metadata": {}, "outputs": [], @@ -187,7 +238,7 @@ }, { "cell_type": "code", - "execution_count": 5, + "execution_count": 10, "id": "447d1333-082d-479a-a6fa-0ac0df78bb9d", "metadata": {}, "outputs": [], @@ -250,7 +301,7 @@ "\n", " # LLM\n", " if local == \"Yes\":\n", - " llm = ChatOllama(model=\"mistral:7b-instruct\", temperature=0)\n", + " llm = ChatOllama(model=local_llm, temperature=0)\n", " else:\n", " llm = ChatMistralAI(\n", " model=\"mistral-medium\", temperature=0, mistral_api_key=mistral_api_key\n", @@ -289,7 +340,7 @@ "\n", " # LLM\n", " if local == \"Yes\":\n", - " llm = ChatOllama(model=\"mistral:7b-instruct\", format=\"json\", temperature=0)\n", + " llm = ChatOllama(model=local_llm, format=\"json\", temperature=0)\n", " else:\n", " llm = ChatMistralAI(\n", " mistral_api_key=mistral_api_key, temperature=0, model=\"mistral-medium\"\n", @@ -315,7 +366,7 @@ " If the document contains keywords related to the user question, grade it as relevant. \\n\n", " It does not need to be a stringent test. The goal is to filter out erroneous retrievals. \\n\n", " Give a binary score 'yes' or 'no' score to indicate whether the document is relevant to the question. \\n\n", - " Provide the binary scor as a JSON with no premable or explaination and use these instructons to format the output: {format_instructions}\"\"\",\n", + " Provide the binary score as a JSON with no premable or explaination and use these instructons to format the output: {format_instructions}\"\"\",\n", " input_variables=[\"query\"],\n", " partial_variables={\"format_instructions\": parser.get_format_instructions()},\n", " )\n", @@ -377,14 +428,14 @@ " \\n ------- \\n\n", " {question} \n", " \\n ------- \\n\n", - " Formulate an improved question: \"\"\",\n", + " Provide an improved question without any premable, only respond with the updated question: \"\"\",\n", " input_variables=[\"question\"],\n", " )\n", "\n", " # Grader\n", " # LLM\n", " if local == \"Yes\":\n", - " llm = ChatOllama(model=\"mistral:7b-instruct\", temperature=0)\n", + " llm = ChatOllama(model=local_llm, temperature=0)\n", " else:\n", " llm = ChatMistralAI(\n", " mistral_api_key=mistral_api_key, temperature=0, model=\"mistral-medium\"\n", @@ -468,7 +519,7 @@ }, { "cell_type": "code", - "execution_count": 6, + "execution_count": 11, "id": "0a63776c-f9cd-46ce-b8cf-95c066dc5b06", "metadata": {}, "outputs": [], @@ -564,7 +615,7 @@ "inputs = {\n", " \"keys\": {\n", " \"question\": \"Explain how the different types of agent memory work?\",\n", - " \"local\": \"No\",\n", + " \"local\": run_local,\n", " }\n", "}\n", "for output in app.stream(inputs):\n", @@ -589,7 +640,7 @@ }, { "cell_type": "code", - "execution_count": 14, + "execution_count": 13, "id": "16ea2032-59c7-433d-aca4-2828a1239074", "metadata": {}, "outputs": [ @@ -601,34 +652,45 @@ "\"Node 'retrieve':\"\n", "'\\n---\\n'\n", "---CHECK RELEVANCE---\n", - "---GRADE: DOCUMENT NOT RELEVANT---\n", - "---GRADE: DOCUMENT NOT RELEVANT---\n", + "---GRADE: DOCUMENT RELEVANT---\n", + "---GRADE: DOCUMENT RELEVANT---\n", "---GRADE: DOCUMENT RELEVANT---\n", "---GRADE: DOCUMENT RELEVANT---\n", "\"Node 'grade_documents':\"\n", "'\\n---\\n'\n", "---DECIDE TO GENERATE---\n", - "---DECISION: TRANSFORM QUERY and RUN WEB SEARCH---\n", - "---TRANSFORM QUERY---\n", - "\"Node 'transform_query':\"\n", - "'\\n---\\n'\n", - "---WEB SEARCH---\n", - "\"Node 'web_search':\"\n", - "'\\n---\\n'\n", + "---DECISION: GENERATE---\n", "---GENERATE---\n", "\"Node 'generate':\"\n", "'\\n---\\n'\n", "\"Node '__end__':\"\n", "'\\n---\\n'\n", - "('There are three types of agent memory in artificial intelligence systems: '\n", - " 'sensory memory, short-term memory, and long-term memory. Sensory memory is '\n", - " 'the learning embedding representations for raw inputs such as text, image or '\n", - " 'other modalities. Short-term memory is in-context learning that is short and '\n", - " 'finite, restricted by the finite context window length of Transformer. '\n", - " 'Long-term memory is an external vector store that the agent can attend to at '\n", - " 'query time, accessible via fast retrieval. The external memory can alleviate '\n", - " 'the restriction of finite attention span by using approximate nearest '\n", - " 'neighbors (ANN) algorithms such as maximum inner product search (MIPS).')\n" + "(' In an LLM (large language model)-powered autonomous agent system, LLM '\n", + " 'functions as the agent’s brain, complemented by several key components: '\n", + " 'planning and memory.\\n'\n", + " '\\n'\n", + " 'Planning involves breaking down large tasks into smaller subgoals for '\n", + " 'efficient handling of complex tasks and self-criticism and refinement to '\n", + " 'improve results.\\n'\n", + " '\\n'\n", + " 'Memory includes short-term memory, which utilizes in-context learning, and '\n", + " 'long-term memory, providing the agent with the capability to retain and '\n", + " 'recall information over extended periods using an external vector store and '\n", + " 'fast retrieval. The agent also learns to call external APIs for missing '\n", + " 'information.\\n'\n", + " '\\n'\n", + " 'Types of Memory:\\n'\n", + " '1. Sensory Memory: retains impressions of sensory information for a few '\n", + " 'seconds.\\n'\n", + " '2. Short-Term Memory (STM) or Working Memory: stores information needed for '\n", + " 'complex cognitive tasks and lasts for 20-30 seconds.\\n'\n", + " '3. Long-Term Memory (LTM): stores information for a remarkably long time, '\n", + " 'with two subtypes: explicit/declarative memory and implicit/procedural '\n", + " 'memory.\\n'\n", + " '\\n'\n", + " 'The agent uses LLM as its core controller, which can be extended beyond '\n", + " 'generating well-written copies, stories, essays, and programs to a powerful '\n", + " 'general problem solver.')\n" ] } ], @@ -637,7 +699,7 @@ "inputs = {\n", " \"keys\": {\n", " \"question\": \"Explain how the different types of agent memory work?\",\n", - " \"local\": \"Yes\",\n", + " \"local\": run_local,\n", " }\n", "}\n", "for output in app.stream(inputs):\n", @@ -665,8 +727,16 @@ "\n", "`Locall (Ollama) -` \n", "\n", - "https://smith.langchain.com/public/6b626f5e-248d-4d52-b36b-5cc3bf0b95d3/r" + "https://smith.langchain.com/public/fd650c43-b0e9-48f4-8cb7-ca77c736d10d/r" ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "deb28175-27a1-4afc-9747-2983e87fc881", + "metadata": {}, + "outputs": [], + "source": [] } ], "metadata": { @@ -685,7 +755,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.9.16" + "version": "3.11.7" } }, "nbformat": 4, From ce5144fccd2947e1f71ece065eef2b7d1fdfcbee Mon Sep 17 00:00:00 2001 From: Harrison Chase Date: Fri, 9 Feb 2024 12:29:04 -0800 Subject: [PATCH 10/18] add plan-and-execute example --- .../plan-and-execute/plan-and-execute.ipynb | 494 ++++++++++++++++++ 1 file changed, 494 insertions(+) create mode 100644 examples/plan-and-execute/plan-and-execute.ipynb diff --git a/examples/plan-and-execute/plan-and-execute.ipynb b/examples/plan-and-execute/plan-and-execute.ipynb new file mode 100644 index 000000000..d191a20c5 --- /dev/null +++ b/examples/plan-and-execute/plan-and-execute.ipynb @@ -0,0 +1,494 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "79b5811c-1074-495f-9722-8325b5e717d3", + "metadata": {}, + "source": [ + "# Plan-and-Execute\n", + "\n", + "This notebook shows how to create a \"plan-and-execute\" style agent. This is heavily inspired by the [Plan-and-Solve](https://arxiv.org/abs/2305.04091) paper as well as the [Baby-AGI](https://github.com/yoheinakajima/babyagi) project.\n", + "\n", + "The core idea is to first come up with a multi-step plan, and then go through that plan one item at a time.\n", + "After accomplishing a particular task, you can then revisit the plan and modify as appropriate.\n", + "\n", + "This compares to a typical [ReAct](https://arxiv.org/abs/2210.03629) style agent where you think one step at a time.\n", + "The advantages of this \"plan-and-execute\" style agent are:\n", + "\n", + "1. Explicit long term planning (which even really strong LLMs can struggle with)\n", + "2. Ability to use smaller/weaker models for the execution step, only using larger/better models for the planning step" + ] + }, + { + "cell_type": "markdown", + "id": "a44a72d6-7e0c-4478-9d20-4c09000420a8", + "metadata": {}, + "source": [ + "## Setup\n", + "\n", + "First, we need to install the packages required." + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "id": "b451b58a-89bd-424f-8c06-0d9fe325e01b", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + "\u001b[1m[\u001b[0m\u001b[34;49mnotice\u001b[0m\u001b[1;39;49m]\u001b[0m\u001b[39;49m A new release of pip is available: \u001b[0m\u001b[31;49m23.3.2\u001b[0m\u001b[39;49m -> \u001b[0m\u001b[32;49m24.0\u001b[0m\n", + "\u001b[1m[\u001b[0m\u001b[34;49mnotice\u001b[0m\u001b[1;39;49m]\u001b[0m\u001b[39;49m To update, run: \u001b[0m\u001b[32;49mpython3.11 -m pip install --upgrade pip\u001b[0m\n" + ] + } + ], + "source": [ + "!pip install --quiet -U langchain langchain_openai tavily-python" + ] + }, + { + "cell_type": "markdown", + "id": "35f267b0-98db-4a59-8b2c-a23f795576ff", + "metadata": {}, + "source": [ + "Next, we need to set API keys for OpenAI (the LLM we will use) and Tavily (the search tool we will use)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "ce438281-08d5-4804-afe7-e4089f7b016b", + "metadata": {}, + "outputs": [], + "source": [ + "import os\n", + "import getpass\n", + "\n", + "os.environ[\"OPENAI_API_KEY\"] = getpass.getpass(\"OpenAI API Key:\")\n", + "os.environ[\"TAVILY_API_KEY\"] = getpass.getpass(\"Tavily API Key:\")" + ] + }, + { + "cell_type": "markdown", + "id": "be2d7981-3737-4134-8bef-d00d18d4e91d", + "metadata": {}, + "source": [ + "Optionally, we can set API key for LangSmith tracing, which will give us best-in-class observability." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "01f460d1-f26f-47d1-ae76-de74d5d851de", + "metadata": {}, + "outputs": [], + "source": [ + "os.environ[\"LANGCHAIN_TRACING_V2\"] = \"true\"\n", + "os.environ[\"LANGCHAIN_API_KEY\"] = getpass.getpass(\"LangSmith API Key:\")" + ] + }, + { + "cell_type": "code", + "execution_count": 37, + "id": "e475c7f9-4c46-4f21-8ba6-2e4d67b09cae", + "metadata": {}, + "outputs": [], + "source": [ + "import os\n", + "os.environ[\"LANGCHAIN_PROJECT\"] = \"brex\"" + ] + }, + { + "cell_type": "markdown", + "id": "6c5fb09a-0311-44c2-b243-d0e80de78902", + "metadata": {}, + "source": [ + "## Define Tools\n", + "\n", + "We will first define the tools we want to use. For this simple example, we will use a built-in search tool via Tavily. However, it is really easy to create your own tools - see documentation [here](https://python.langchain.com/docs/modules/agents/tools/custom_tools) on how to do that." + ] + }, + { + "cell_type": "code", + "execution_count": 38, + "id": "25b9ec62-0675-4715-811c-9b32c635b22f", + "metadata": {}, + "outputs": [], + "source": [ + "from langchain_community.tools.tavily_search import TavilySearchResults\n", + "\n", + "tools = [TavilySearchResults(max_results=3)]" + ] + }, + { + "cell_type": "markdown", + "id": "3dcda478-fa80-4e3e-bb35-0f622fe73a31", + "metadata": {}, + "source": [ + "## Define our Execution Agent\n", + "\n", + "Now we will create the execution agent we want to use to execute tasks. \n", + "Note that for this example, we will be using the same execution agent for each task, but this doesn't HAVE to be the case." + ] + }, + { + "cell_type": "code", + "execution_count": 39, + "id": "72d233ca-1dbf-4b43-b680-b3bf39e3691f", + "metadata": {}, + "outputs": [], + "source": [ + "from langchain import hub\n", + "from langchain.agents import create_openai_functions_agent\n", + "from langchain_openai import ChatOpenAI\n", + "# Get the prompt to use - you can modify this!\n", + "prompt = hub.pull(\"hwchase17/openai-functions-agent\")\n", + "# Choose the LLM that will drive the agent\n", + "llm = ChatOpenAI(model=\"gpt-4-turbo-preview\")\n", + "# Construct the OpenAI Functions agent\n", + "agent_runnable = create_openai_functions_agent(llm, tools, prompt)" + ] + }, + { + "cell_type": "code", + "execution_count": 40, + "id": "a3ea9bd3-87d9-4a78-aec6-8ab4bf34479b", + "metadata": {}, + "outputs": [], + "source": [ + "from langgraph.prebuilt import create_agent_executor" + ] + }, + { + "cell_type": "code", + "execution_count": 41, + "id": "998aebde-c204-494f-930c-14747ed34861", + "metadata": {}, + "outputs": [], + "source": [ + "agent_executor = create_agent_executor(agent_runnable, tools)" + ] + }, + { + "cell_type": "code", + "execution_count": 42, + "id": "746e697a-dec4-4342-a814-9b3456828169", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "{'input': 'who is the winnner of the us open',\n", + " 'chat_history': [],\n", + " 'agent_outcome': AgentFinish(return_values={'output': 'The winners of the US Open in 2023 are:\\n\\n- For tennis, Coco Gauff won her first Grand Slam title at the US Open 2023 with a comeback victory against Aryna Sabalenka. [Source](https://sports.yahoo.com/us-open-2023-coco-gauff-wins-1st-grand-slam-title-with-wild-comeback-vs-aryna-sabalenka-222431287.html)\\n\\n- In golf, Wyndham Clark won the 2023 US Open, marking his first major championship victory. The tournament took place at the Los Angeles Country Club. [Source](https://www.nbclosangeles.com/news/sports/golf/wyndham-clark-wins-2023-us-open-for-first-major-championship/3172672/)'}, log='The winners of the US Open in 2023 are:\\n\\n- For tennis, Coco Gauff won her first Grand Slam title at the US Open 2023 with a comeback victory against Aryna Sabalenka. [Source](https://sports.yahoo.com/us-open-2023-coco-gauff-wins-1st-grand-slam-title-with-wild-comeback-vs-aryna-sabalenka-222431287.html)\\n\\n- In golf, Wyndham Clark won the 2023 US Open, marking his first major championship victory. The tournament took place at the Los Angeles Country Club. [Source](https://www.nbclosangeles.com/news/sports/golf/wyndham-clark-wins-2023-us-open-for-first-major-championship/3172672/)'),\n", + " 'intermediate_steps': [(AgentActionMessageLog(tool='tavily_search_results_json', tool_input={'query': 'US Open winner 2023'}, log=\"\\nInvoking: `tavily_search_results_json` with `{'query': 'US Open winner 2023'}`\\n\\n\\n\", message_log=[AIMessage(content='', additional_kwargs={'function_call': {'arguments': '{\"query\":\"US Open winner 2023\"}', 'name': 'tavily_search_results_json'}})]),\n", + " '[{\\'url\\': \\'https://sports.yahoo.com/us-open-2023-coco-gauff-wins-1st-grand-slam-title-with-wild-comeback-vs-aryna-sabalenka-222431287.html\\', \\'content\\': \\'— US Open Tennis (@usopen) September 9, 2023 — US Open Tennis (@usopen) September 9, 2023 US Open 2023: Coco Gauff wins 1st Grand Slam title with wild comeback vs. Aryna Sabalenka What a backhand winner from Coco Gauff! pic.twitter.com/JhDcFpsJ4E — US Open Tennis (@usopen) September 9, 2023— US Open Tennis (@usopen) September 9, 2023 Gauff got the momentum change the crowd was looking for early in the second set, breaking Sabalenka to go up 3-1 and holding serve from there to take ...\\'}, {\\'url\\': \\'https://www.nbclosangeles.com/news/sports/golf/wyndham-clark-wins-2023-us-open-for-first-major-championship/3172672/\\', \\'content\\': \"Wyndham Clark wins 2023 US Open for first major championship 2023 US Open features a record purse. Here\\'s how much the winning golfer will make Clark on Sunday claimed the 2023 US Open title at the Los Angeles Country Club, making it his first major championship US Open champion in 2011 and a four-time total major winner -- who recorded a nine-under.Clark on Sunday claimed the 2023 US Open title at the Los Angeles Country Club, making it his first major championship triumph. The 29-year-old finished the tournament going 10-under, just edging ...\"}, {\\'url\\': \\'https://www.sportingnews.com/us/golf/news/us-open-2023-live-scores-results-leaderboard/jbmxrpro5jc37drgq8e2lehn\\', \\'content\\': \\'MORE: Watch the 2023 U.S. Open live with Fubo (free trial) U.S. Open leaderboard 2023 Edition Who won the U.S. Open in 2023? Complete scores, results, highlights from Los Angeles Country Club The golf world headed to the City of Angels — Los Angeles — for the 2023 U.S. Open. MORE:\\\\xa0How much prize money does the U.S. Open winner make?Nick Brinkerhoff 06-19-2023 • 23 min read (Getty Images) The golf world headed to the City of Angels — Los Angeles — for the 2023 U.S. Open. And the tournament got its Hollywood ending....\\'}]')]}" + ] + }, + "execution_count": 42, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "agent_executor.invoke({\"input\": \"who is the winnner of the us open\", \"chat_history\": []})" + ] + }, + { + "cell_type": "markdown", + "id": "5cf66804-44b2-4904-b1a7-17ad70b551f5", + "metadata": {}, + "source": [ + "## Define the State\n", + "\n", + "Let's now start by defining the state the track for this agent.\n", + "\n", + "First, we will need to track the current plan. Let's represent that as a list of strings.\n", + "\n", + "Next, we should track previously executed steps. Let's represent that as a list of tuples (these tuples will contain the step and then the result)\n", + "\n", + "Finally, we need to have some state to represent the final response as well as the original input." + ] + }, + { + "cell_type": "code", + "execution_count": 43, + "id": "8eeeaeea-8f10-4fbe-8e24-4e1a2381a009", + "metadata": {}, + "outputs": [], + "source": [ + "from langchain_core.pydantic_v1 import BaseModel, Field\n", + "from typing import List, Tuple, Annotated, TypedDict\n", + "import operator\n", + "\n", + "\n", + "class PlanExecute(TypedDict):\n", + "\n", + " input: str \n", + " plan: List[str]\n", + " past_steps: Annotated[List[Tuple], operator.add]\n", + " response: str" + ] + }, + { + "cell_type": "markdown", + "id": "1dbd770a-9941-40a9-977e-4d55359eee21", + "metadata": {}, + "source": [ + "## Planning Step\n", + "\n", + "Let's now think about creating the planning step. This will use function calling to create a plan." + ] + }, + { + "cell_type": "code", + "execution_count": 44, + "id": "4a88626d-6dfd-4488-87f0-a9a0dd6da44c", + "metadata": {}, + "outputs": [], + "source": [ + "from langchain_core.pydantic_v1 import BaseModel\n", + "\n", + "\n", + "class Plan(BaseModel):\n", + " \"\"\"Plan to follow in future\"\"\"\n", + " steps: List[str] = Field(description=\"different steps to follow, should be in sorted order\")\n" + ] + }, + { + "cell_type": "code", + "execution_count": 45, + "id": "ec7b1867-1ea3-4df3-9a98-992a1c32ec49", + "metadata": {}, + "outputs": [], + "source": [ + "from langchain.chains.openai_functions import create_structured_output_runnable\n", + "from langchain_core.prompts import ChatPromptTemplate\n", + "\n", + "planner_prompt = ChatPromptTemplate.from_template(\"\"\"For the given objective, come up with a simple step by step plan. \\\n", + "This plan should involve individual tasks, that if executed correctly will yield the correct answer. Do not add any superfluous steps. \\\n", + "The result of the final step should be the final answer. Make sure that each step has all the information needed - do not skip steps.\n", + "\n", + "{objective}\"\"\")\n", + "planner = create_structured_output_runnable(Plan, ChatOpenAI(model=\"gpt-4-turbo-preview\", temperature=0), planner_prompt)" + ] + }, + { + "cell_type": "code", + "execution_count": 46, + "id": "67ce37b7-e089-479b-bcb8-c3f5d9874613", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "Plan(steps=['Identify the current year.', 'Search for the Australia Open winner of the current year.', 'Find the hometown of the identified winner.'])" + ] + }, + "execution_count": 46, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "planner.invoke({'objective': 'what is the hometown of the current Australia open winner?'})" + ] + }, + { + "cell_type": "markdown", + "id": "6e09ad9d-6f90-4bdc-bb43-b1ce94517c29", + "metadata": {}, + "source": [ + "## Re-Plan Step\n", + "\n", + "Now, let's create a step that re-does the plan based on the result of the previous step." + ] + }, + { + "cell_type": "code", + "execution_count": 47, + "id": "ec2d12cc-016a-44d1-aa08-4c5ce1e8fe2a", + "metadata": {}, + "outputs": [], + "source": [ + "from langchain.chains.openai_functions import create_openai_fn_runnable\n", + "class Response(BaseModel):\n", + " \"\"\"Response to user.\"\"\"\n", + " response: str\n", + "\n", + "replanner_prompt = ChatPromptTemplate.from_template(\"\"\"For the given objective, come up with a simple step by step plan. \\\n", + "This plan should involve individual tasks, that if executed correctly will yield the correct answer. Do not add any superfluous steps. \\\n", + "The result of the final step should be the final answer. Make sure that each step has all the information needed - do not skip steps.\n", + "\n", + "Your objective was this:\n", + "{input}\n", + "\n", + "Your original plan was this:\n", + "{plan}\n", + "\n", + "You have currently done the follow steps:\n", + "{past_steps}\n", + "\n", + "Update your plan accordingly. If no more steps are needed and you can return to the user, then respond with that. Otherwise, fill out the plan. Only add steps to the plan that still NEED to be done. Do not return previously done steps as part of the plan.\"\"\")\n", + "\n", + "\n", + "replanner = create_openai_fn_runnable([Plan, Response], ChatOpenAI(model=\"gpt-4-turbo-preview\", temperature=0), replanner_prompt)\n" + ] + }, + { + "cell_type": "markdown", + "id": "859abd13-6ba0-45ad-b341-e652dd5f755b", + "metadata": {}, + "source": [ + "## Create the Graph\n", + "\n", + "We can now create the graph!" + ] + }, + { + "cell_type": "code", + "execution_count": 48, + "id": "6c8e0dad-bcea-4c9a-8922-0d820892e2d0", + "metadata": {}, + "outputs": [], + "source": [ + "async def execute_step(state: PlanExecute):\n", + " task = state['plan'][0]\n", + " agent_response = await agent_executor.ainvoke({\"input\": task, \"chat_history\": []})\n", + " return {\"past_steps\": (task, agent_response['agent_outcome'].return_values['output'])}\n", + "\n", + "async def plan_step(state: PlanExecute):\n", + " plan = await planner.ainvoke({\"objective\": state[\"input\"]})\n", + " return {\"plan\": plan.steps}\n", + "\n", + "async def replan_step(state: PlanExecute):\n", + " output = await replanner.ainvoke(state)\n", + " if isinstance(output, Response):\n", + " return {\"response\": output.response}\n", + " else:\n", + " return {\"plan\": output.steps}\n", + "\n", + "def should_end(state: PlanExecute):\n", + " if state['response']:\n", + " return True\n", + " else:\n", + " return False" + ] + }, + { + "cell_type": "code", + "execution_count": 49, + "id": "e954cea0-5ccc-46c2-a27b-f5b7185b597d", + "metadata": {}, + "outputs": [], + "source": [ + "from langgraph.graph import StateGraph, END\n", + "\n", + "workflow = StateGraph(PlanExecute)\n", + "\n", + "# Add the plan node\n", + "workflow.add_node(\"planner\", plan_step)\n", + "\n", + "# Add the execution step\n", + "workflow.add_node(\"agent\", execute_step)\n", + "\n", + "# Add a replan node\n", + "workflow.add_node(\"replan\", replan_step)\n", + "\n", + "workflow.set_entry_point(\"planner\")\n", + "\n", + "# From plan we go to agent\n", + "workflow.add_edge('planner', 'agent')\n", + "\n", + "# From agent, we replan\n", + "workflow.add_edge(\"agent\", \"replan\")\n", + "\n", + "workflow.add_conditional_edges(\n", + " \"replan\",\n", + " # Next, we pass in the function that will determine which node is called next.\n", + " should_end,\n", + " {\n", + " # If `tools`, then we call the tool node.\n", + " True: END,\n", + " False: \"agent\",\n", + " }\n", + ")\n", + "\n", + "# Finally, we compile it!\n", + "# This compiles it into a LangChain Runnable,\n", + "# meaning you can use it as you would any other runnable\n", + "app = workflow.compile()" + ] + }, + { + "cell_type": "code", + "execution_count": 50, + "id": "b8ac1f67-e87a-427c-b4f7-44351295b788", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "{'plan': ['Identify the winner of the 2024 Australia Open.', \"Research the winner's biography to find their place of birth or hometown.\", 'Confirm the hometown of the 2024 Australia Open winner.']}\n", + "{'past_steps': ('Identify the winner of the 2024 Australia Open.', \"The winners of the 2024 Australian Open were Jannik Sinner in the men's singles category and Aryna Sabalenka in the women's singles category.\")}\n", + "{'plan': [\"Research Jannik Sinner's biography to find his place of birth or hometown.\", \"Research Aryna Sabalenka's biography to find her place of birth or hometown.\", 'Confirm the hometown of Jannik Sinner.', 'Confirm the hometown of Aryna Sabalenka.']}\n", + "{'past_steps': (\"Research Jannik Sinner's biography to find his place of birth or hometown.\", 'Jannik Sinner was born in Innichen, Italy. This town is also known as San Candido, which is mentioned as his hometown.')}\n", + "{'plan': [\"Research Aryna Sabalenka's biography to find her place of birth or hometown.\", 'Confirm the hometown of Aryna Sabalenka.']}\n", + "{'past_steps': (\"Research Aryna Sabalenka's biography to find her place of birth or hometown.\", 'Aryna Sabalenka was born in Minsk, the capital of Belarus.')}\n", + "{'response': 'The hometown of the 2024 Australia Open winners are Innichen (San Candido), Italy for Jannik Sinner and Minsk, Belarus for Aryna Sabalenka. No further steps are needed.'}\n" + ] + } + ], + "source": [ + "from langchain_core.messages import HumanMessage\n", + "config = {\"recursion_limit\": 50}\n", + "inputs = {\"input\": \"what is the hometown of the 2024 Australia open winner?\"}\n", + "async for event in app.astream(inputs, config=config):\n", + " for k, v in event.items():\n", + " if k != \"__end__\":\n", + " print(v)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "8c20341e-267d-4ba0-9a0b-dad055a76b1d", + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "ad8f7955-2cc9-4ebb-8c41-13abb3351a24", + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.11.1" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} From c7f3ecb9d9ad27dd1a02016bfe651a6b901650de Mon Sep 17 00:00:00 2001 From: William Fu-Hinthorn <13333726+hinthornw@users.noreply.github.com> Date: Fri, 9 Feb 2024 16:04:05 -0800 Subject: [PATCH 11/18] Add LLM Compiler --- .../llm_compiler/LLMCompiler.ipynb | 884 ++++++++++++++++++ .../plan-and-execute/llm_compiler/__init__.py | 0 .../llm_compiler/ast_parser.py | 37 + .../llm_compiler/img/diagram.png | Bin 0 -> 253693 bytes .../llm_compiler/math_tools.py | 143 +++ .../llm_compiler/output_parser.py | 177 ++++ 6 files changed, 1241 insertions(+) create mode 100644 examples/plan-and-execute/llm_compiler/LLMCompiler.ipynb create mode 100644 examples/plan-and-execute/llm_compiler/__init__.py create mode 100644 examples/plan-and-execute/llm_compiler/ast_parser.py create mode 100644 examples/plan-and-execute/llm_compiler/img/diagram.png create mode 100644 examples/plan-and-execute/llm_compiler/math_tools.py create mode 100644 examples/plan-and-execute/llm_compiler/output_parser.py diff --git a/examples/plan-and-execute/llm_compiler/LLMCompiler.ipynb b/examples/plan-and-execute/llm_compiler/LLMCompiler.ipynb new file mode 100644 index 000000000..ba4fb12a2 --- /dev/null +++ b/examples/plan-and-execute/llm_compiler/LLMCompiler.ipynb @@ -0,0 +1,884 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "0c8b472b-f3fb-46c2-841f-930a4692697b", + "metadata": {}, + "source": [ + "# LLMCompiler\n", + "\n", + "This notebook shows how to implement [LLMCompiler, by Kim, et. al](https://arxiv.org/abs/2312.04511) in LangGraph.\n", + "\n", + "LLMCompiler is an agent architecture intented on speeding up the latency of agentic tasks via fast, parallel tool execution. It has 3 main components:\n", + "\n", + "1. Planner: generate a DAG of tasks.\n", + "2. Task Fetching Unit: schedules and executes the tasks\n", + "3. Joiner: Responds to the user or triggers a second plan\n", + "\n", + "![diagram](./img/diagram.png)\n", + "\n", + "This notebook walks through each component and shows how to wire them together using LangGraph. \n", + "\n", + "\n", + "**First,** install the dependencies, and set up LangSmith for tracing to more easily debug and observe the agent." + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "id": "16bd5497-35ad-44f2-94d9-19ff39a5ffed", + "metadata": {}, + "outputs": [], + "source": [ + "# %pip install -U --quiet langchain_openai langsmith langgraph langchain numexpr" + ] + }, + { + "cell_type": "code", + "execution_count": 41, + "id": "abbd6948-e9a3-47ca-89c7-7ac2fc5eca8b", + "metadata": {}, + "outputs": [], + "source": [ + "import os\n", + "import getpass\n", + "\n", + "def _get_pass(var: str):\n", + " if var not in os.environ:\n", + " os.environ[var] = getpass.getpass(f\"{var}: \")\n", + "# Optional: Debug + trace calls using LangSmith\n", + "os.environ[\"LANGCHAIN_TRACING_V2\"] = \"True\"\n", + "os.environ[\"LANGCHAIN_PROJECT\"] = \"LLMCompiler\"\n", + "_get_pass(\"LANGCHAIN_API_KEY\")\n", + "_get_pass(\"OPENAI_API_KEY\")" + ] + }, + { + "cell_type": "markdown", + "id": "a61b48ee-8c6f-4863-913a-676f659287de", + "metadata": {}, + "source": [ + "## Part 1: Tools\n", + "\n", + "We'll first define the tools for the agent to use in our demo. We'll give it the class search engine + calculator combo.\n", + "\n", + "If you don't want to sign up for tavily, you can replace it with the free [DuckDuckGo](https://python.langchain.com/docs/integrations/tools/ddg)." + ] + }, + { + "cell_type": "code", + "execution_count": 42, + "id": "e7476bb2-1a51-42f6-b7ae-82a0300bbf84", + "metadata": {}, + "outputs": [], + "source": [ + "from langchain_openai import ChatOpenAI\n", + "from langchain_community.tools.tavily_search import TavilySearchResults\n", + "# Imported from the https://github.com/langchain-ai/langgraph/tree/main/examples/plan-and-execute repo\n", + "from math_tools import get_math_tool\n", + "\n", + "_get_pass(\"TAVILY_API_KEY\")\n", + "\n", + "calculate = get_math_tool(ChatOpenAI(model=\"gpt-4-turbo-preview\"))\n", + "search = TavilySearchResults(max_results=1, description='tavily_search_results_json(query=\"the search query\") - a search engine.')\n", + "\n", + "tools = [search, calculate]" + ] + }, + { + "cell_type": "code", + "execution_count": 43, + "id": "152eecf3-6bef-4718-af71-a0b3c5a3b009", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "'37'" + ] + }, + "execution_count": 43, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "calculate.invoke({\"problem\": \"What's the temp of sf + 5?\", \"context\": [\"Thet empreature of sf is 32 degrees\"]})" + ] + }, + { + "cell_type": "markdown", + "id": "1abdedbd-d81b-4ee9-b46f-f29439ed1350", + "metadata": {}, + "source": [ + "# Part 2: Planner\n", + "\n", + "\n", + "Largely adapted from [the original source code](https://github.com/SqueezeAILab/LLMCompiler/blob/main/src/llm_compiler/output_parser.py), the planner accepts the input question and generates a task list to execute.\n", + "\n", + "If it is provided with a previous plan, it is instructed to re-plan, which is useful if, upon completion of the first batch of tasks, the agent must take more actions.\n", + "\n", + "The code below composes constructs the prompt template for the planner and composes it with LLM and output parser, defined in [output_parser.py](./output_parser.py). The output parser processes a task list in the following form:\n", + "\n", + "```plaintext\n", + "1. tool_1(arg1=\"arg1\", arg2=3.5, ...)\n", + "Thought: I then want to find out Y by using tool_2\n", + "2. tool_2(arg1=\"\", arg2=\"${1}\")'\n", + "3. join()\"\n", + "```\n", + "\n", + "The \"Thought\" lines are optional. The `${#}` placeholders are variables. These are used to route tool (task) outputs to other tools." + ] + }, + { + "cell_type": "code", + "execution_count": 44, + "id": "15dd9639-691f-4906-9012-83fd6e9ac126", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "================================\u001b[1m System Message \u001b[0m================================\n", + "\n", + "Given a user query, create a plan to solve it with the utmost parallelizability. Each plan should comprise an action from the following \u001b[33;1m\u001b[1;3m{num_tools}\u001b[0m types:\n", + "\u001b[33;1m\u001b[1;3m{tool_descriptions}\u001b[0m\n", + "\u001b[33;1m\u001b[1;3m{num_tools}\u001b[0m. join(): Collects and combines results from prior actions.\n", + "\n", + " - An LLM agent is called upon invoking join() to either finalize the user query or wait until the plans are executed.\n", + " - join should always be the last action in the plan, and will be called in two scenarios:\n", + " (a) if the answer can be determined by gathering the outputs from tasks to generate the final response.\n", + " (b) if the answer cannot be determined in the planning phase before you execute the plans. Guidelines:\n", + " - Each action described above contains input/output types and description.\n", + " - You must strictly adhere to the input and output types for each action.\n", + " - The action descriptions contain the guidelines. You MUST strictly follow those guidelines when you use the actions.\n", + " - Each action in the plan should strictly be one of the above types. Follow the Python conventions for each action.\n", + " - Each action MUST have a unique ID, which is strictly increasing.\n", + " - Inputs for actions can either be constants or outputs from preceding actions. In the latter case, use the format $id to denote the ID of the previous action whose output will be the input.\n", + " - Always call join as the last action in the plan. Say '' after you call join\n", + " - Ensure the plan maximizes parallelizability.\n", + " - Only use the provided action types. If a query cannot be addressed using these, invoke the join action for the next steps.\n", + " - Never introduce new actions other than the ones provided.\n", + "\n", + "=============================\u001b[1m Messages Placeholder \u001b[0m=============================\n", + "\n", + "\u001b[33;1m\u001b[1;3m{messages}\u001b[0m\n", + "\n", + "================================\u001b[1m System Message \u001b[0m================================\n", + "\n", + "Remember, ONLY respond with the task list in the correct format! E.g.:\n", + "idx. tool(arg_name=args)\n", + "None\n" + ] + } + ], + "source": [ + "from typing import Sequence\n", + "\n", + "from langchain_core.language_models import BaseChatModel\n", + "from langchain_core.prompts import ChatPromptTemplate\n", + "from langchain_core.runnables import RunnableBranch\n", + "from langchain_core.tools import BaseTool\n", + "from langchain_core.messages import BaseMessage, FunctionMessage, HumanMessage, SystemMessage\n", + "\n", + "from output_parser import LLMCompilerPlanParser, Task\n", + "from langchain import hub\n", + "from langchain_openai import ChatOpenAI\n", + "\n", + "\n", + "prompt = hub.pull(\"wfh/llm-compiler\")\n", + "print(prompt.pretty_print())" + ] + }, + { + "cell_type": "code", + "execution_count": 45, + "id": "45689d40-d8df-4316-a121-6ea9c87d2efe", + "metadata": {}, + "outputs": [], + "source": [ + "def create_planner(llm: BaseChatModel, tools: Sequence[BaseTool], base_prompt: ChatPromptTemplate):\n", + " tool_descriptions = \"\\n\".join(\n", + " f\"{i}. {tool.description}\\n\" for i, tool in enumerate(tools)\n", + " )\n", + " planner_prompt = base_prompt.partial(\n", + " replan=\"\",\n", + " num_tools=len(tools),\n", + " tool_descriptions=tool_descriptions,\n", + " )\n", + " replanner_prompt = base_prompt.partial(\n", + " replan=' - You are given \"Previous Plan\" which is the plan that the previous agent created along with the execution results '\n", + " \"(given as Observation) of each plan and a general thought (given as Thought) about the executed results.\"\n", + " 'You MUST use these information to create the next plan under \"Current Plan\".\\n'\n", + " ' - When starting the Current Plan, you should start with \"Thought\" that outlines the strategy for the next plan.\\n'\n", + " \" - In the Current Plan, you should NEVER repeat the actions that are already executed in the Previous Plan.\\n\"\n", + " \" - You must continue the task index from the end of the previous one. Do not repeat task indices.\",\n", + " num_tools=len(tools),\n", + " tool_descriptions=tool_descriptions,\n", + " )\n", + " \n", + " def should_replan(state: list):\n", + " # Context is passed as a system message\n", + " return isinstance(state[-1], SystemMessage)\n", + "\n", + " def wrap_messages(state: list):\n", + " return {\"messages\": state}\n", + "\n", + " def wrap_and_get_last_index(state: list):\n", + " next_task = 0\n", + " for message in state[::-1]:\n", + " if isinstance(message, FunctionMessage):\n", + " next_task = message.additional_kwargs[\"idx\"] + 1\n", + " break\n", + " state[-1].content = state[-1].content + f\" - Begin counting at : {next_task}\"\n", + " return {\"messages\": state}\n", + " \n", + " return (\n", + " RunnableBranch(\n", + " (should_replan, wrap_and_get_last_index | replanner_prompt),\n", + " wrap_messages | planner_prompt,\n", + " )\n", + " | llm\n", + " | LLMCompilerPlanParser(tools=tools)\n", + " )" + ] + }, + { + "cell_type": "code", + "execution_count": 46, + "id": "bbdcb57b-5362-4b9e-88db-fb3fae443fb0", + "metadata": {}, + "outputs": [], + "source": [ + "llm = ChatOpenAI(model=\"gpt-4-turbo-preview\")\n", + "# This is the primary \"agent\" in our application\n", + "planner = create_planner(llm, tools, prompt)" + ] + }, + { + "cell_type": "code", + "execution_count": 47, + "id": "730490c6-6e3a-4173-82a1-9eb9d5eeff20", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "description='tavily_search_results_json(query=\"the search query\") - a search engine.' max_results=1 {'query': 'current temperature in San Francisco'}\n", + "---\n", + "name='math' description='math(problem: str, context: Optional[List[str]] = None, config: Optional[langchain_core.runnables.config.RunnableConfig] = None) - math(problem: str, context: Optional[list[str]]) -> float:\\n - Solves the provided math problem.\\n - `problem` can be either a simple math problem (e.g. \"1 + 3\") or a word problem (e.g. \"how many apples are there if there are 3 apples and 2 apples\").\\n - You cannot calculate multiple expressions in one call. For instance, `math(\\'1 + 3, 2 + 4\\')` does not work. If you need to calculate multiple expressions, you need to call them separately like `math(\\'1 + 3\\')` and then `math(\\'2 + 4\\')`\\n - Minimize the number of `math` actions as much as possible. For instance, instead of calling 2. math(\"what is the 10% of $1\") and then call 3. math(\"$1 + $2\"), you MUST call 2. math(\"what is the 110% of $1\") instead, which will reduce the number of math actions.\\n - You can optionally provide a list of strings as `context` to help the agent solve the problem. If there are multiple contexts you need to answer the question, you can provide them as a list of strings.\\n - `math` action will not see the output of the previous actions unless you provide it as `context`. You MUST provide the output of the previous actions as `context` if you need to do math on it.\\n - You MUST NEVER provide `search` type action\\'s outputs as a variable in the `problem` argument. This is because `search` returns a text blob that contains the information about the entity, not a number or value. Therefore, when you need to provide an output of `search` action, you MUST provide it as a `context` argument to `math` action. For example, 1. search(\"Barack Obama\") and then 2. math(\"age of $1\") is NEVER allowed. Use 2. math(\"age of Barack Obama\", context=[\"$1\"]) instead.\\n - When you ask a question about `context`, specify the units. For instance, \"what is xx in height?\" or \"what is xx in millions?\" instead of \"what is xx?\"' args_schema= func=.calculate_expression at 0x119a318a0> {'problem': 'pow($0, 3)', 'context': ['$0']}\n", + "---\n", + "join ()\n", + "---\n" + ] + } + ], + "source": [ + "example_question = \"What's the temperature in SF raised to the 3rd power?\"\n", + "\n", + "for task in planner.stream([HumanMessage(content=example_question)]):\n", + " print(task['tool'], task['args'])\n", + " print('---')" + ] + }, + { + "cell_type": "markdown", + "id": "5d0e795f-61ff-4553-9823-23e7624ca180", + "metadata": {}, + "source": [ + "## 3. Task Fetching Unit\n", + "\n", + "This component schedules the tasks. It receives a stream of tools of the following format:\n", + "\n", + "```typescript\n", + "{\n", + " tool: BaseTool,\n", + " dependencies: number[],\n", + "}\n", + "```\n", + "\n", + "The basic idea is to begin executing tools as soon as their dependencies are met. This is done through multi-threading." + ] + }, + { + "cell_type": "code", + "execution_count": 48, + "id": "c1fbafdd-42d4-4575-8466-e5951cee71f4", + "metadata": { + "jp-MarkdownHeadingCollapsed": true + }, + "outputs": [], + "source": [ + "from typing import Any, Union, Iterable, List, Tuple, Dict\n", + "from typing_extensions import TypedDict\n", + "\n", + "from langchain_core.runnables import (\n", + " chain as as_runnable,\n", + ")\n", + "\n", + "from concurrent.futures import ThreadPoolExecutor, wait\n", + "import time\n", + "\n", + "\n", + "def _get_observations(messages: List[BaseMessage]) -> Dict[int, Any]:\n", + " # Get all previous tool responses\n", + " results = {}\n", + " for message in messages[::-1]:\n", + " if isinstance(message, FunctionMessage):\n", + " results[int(message.additional_kwargs[\"idx\"])] = message.content\n", + " return results\n", + "\n", + "class SchedulerInput(TypedDict):\n", + " messages: List[BaseMessage]\n", + " tasks: Iterable[Task]\n", + "\n", + "\n", + "def _execute_task(task, observations, config):\n", + " tool_to_use = task[\"tool\"]\n", + " if isinstance(tool_to_use, str):\n", + " return tool_to_use\n", + " args = task[\"args\"]\n", + " try:\n", + " if isinstance(args, str):\n", + " resolved_args = _resolve_arg(args, observations)\n", + " elif isinstance(args, dict):\n", + " resolved_args = {key: _resolve_arg(val, observations) for key, val in args.items()}\n", + " else:\n", + " # This will likely fail\n", + " resolved_args = args\n", + " except Exception as e:\n", + " return (\n", + " f\"ERROR(Failed to call {tool_to_use.name} with args {args}.)\"\n", + " f\" Args could not be resolved. Error: {repr(e)}\"\n", + " )\n", + " try:\n", + " return tool_to_use.invoke(resolved_args, config)\n", + " except Exception as e:\n", + " return (\n", + " f\"ERROR(Failed to call {tool_to_use.name} with args {args}.\"\n", + " + f\" Args resolved to {resolved_args}. Error: {repr(e)})\"\n", + " )\n", + "\n", + "\n", + "def _resolve_arg(arg: Union[str, Any], observations: Dict[int, Any]):\n", + " if isinstance(arg, str) and arg.startswith(\"$\"):\n", + " try:\n", + " stripped = arg[1:].replace(\".output\", \"\").strip(\"{}\")\n", + " idx = int(stripped)\n", + " except Exception:\n", + " return str(arg)\n", + " return str(observations[idx])\n", + " elif isinstance(arg, list):\n", + " return [_resolve_arg(a, observations) for a in arg]\n", + " else:\n", + " return str(arg)\n", + "\n", + "\n", + "@as_runnable\n", + "def schedule_task(task_inputs, config):\n", + " task: Task = task_inputs['task']\n", + " observations: Dict[int, Any] = task_inputs['observations']\n", + " try:\n", + " observation = _execute_task(task, observations, config)\n", + " except Exception:\n", + " import traceback\n", + " observation = traceback.format_exception() #repr(e) + \n", + " observations[task['idx']] = observation\n", + "\n", + "def schedule_pending_task(task: Task, observations: Dict[int, Any], retry_after: float = 0.2):\n", + " while True:\n", + " deps = task[\"dependencies\"]\n", + " if (\n", + " deps\n", + " and (\n", + " any([dep not in observations for dep in deps])\n", + " )\n", + " ):\n", + " # Dependencies not yet satisfied\n", + " time.sleep(retry_after)\n", + " continue\n", + " schedule_task.invoke({\"task\": task, \"observations\": observations})\n", + " break\n", + "\n", + "@as_runnable\n", + "def schedule_tasks(scheduler_input: SchedulerInput) -> List[FunctionMessage]:\n", + " \"\"\"Group the tasks into a DAG schedule.\"\"\"\n", + " # For streaming, we are making a few simplifying assumption:\n", + " # 1. The LLM does not create cyclic dependencies\n", + " # 2. That the LLM will not generate tasks with future deps\n", + " # If this ceases to be a good assumption, you can either\n", + " # adjust to do a proper topological sort (not-stream)\n", + " # or use a more complicated data structure\n", + " tasks = scheduler_input[\"tasks\"]\n", + " messages = scheduler_input[\"messages\"]\n", + " # If we are re-planning, we may have calls that depend on previous\n", + " # plans. Start with those.\n", + " observations = _get_observations(messages)\n", + " task_names = {}\n", + " originals = set(observations)\n", + " # ^^ We assume each task inserts a different key above to\n", + " # avoid race conditions...\n", + " futures = []\n", + " retry_after = 0.25 # Retry every quarter second\n", + " with ThreadPoolExecutor() as executor:\n", + " for task in tasks:\n", + " deps = task[\"dependencies\"]\n", + " task_names[task[\"idx\"]] = task[\"tool\"] if isinstance(task[\"tool\"], str) else task[\"tool\"].name\n", + " if (\n", + " # Depends on other tasks\n", + " deps\n", + " and (\n", + " any([dep not in observations for dep in deps])\n", + " )\n", + " ):\n", + " futures.append(executor.submit(schedule_pending_task, task, observations, retry_after))\n", + " else:\n", + " # No deps or all deps satisfied\n", + " # can schedule now\n", + " schedule_task.invoke(dict(task=task, observations=observations))\n", + " # futures.append(executor.submit(schedule_task.invoke dict(task=task, observations=observations)))\n", + "\n", + " # All tasks have been submitted or enqueued\n", + " # Wait for them to complete\n", + " wait(futures)\n", + " # Convert observations to new tool messages to add to the state\n", + " new_observations = {k: (task_names[k], observations[k]) for k in sorted(observations.keys() - originals)}\n", + " tool_messages = [\n", + " FunctionMessage(\n", + " name=name,\n", + " content=str(obs),\n", + " additional_kwargs={\"idx\": k}\n", + " ) for k, (name, obs) in new_observations.items()]\n", + " return tool_messages" + ] + }, + { + "cell_type": "code", + "execution_count": 49, + "id": "052f6b16-103a-40e9-94dd-8fcc37e77ba4", + "metadata": {}, + "outputs": [], + "source": [ + "import itertools\n", + "\n", + "@as_runnable\n", + "def plan_and_schedule(messages: List[BaseMessage], config):\n", + " tasks = planner.stream(messages, config)\n", + " # Begin executing the planner immediately\n", + " tasks = itertools.chain([next(tasks)], tasks)\n", + " scheduled_tasks = schedule_tasks.invoke({\n", + " \"messages\": messages,\n", + " \"tasks\": tasks,\n", + " }, config)\n", + " return scheduled_tasks" + ] + }, + { + "cell_type": "markdown", + "id": "9efa15ae-817a-48c6-86ed-16bc112fedc5", + "metadata": {}, + "source": [ + "#### Example Plan\n", + "\n", + "We still haven't introduced any cycles in our computation graph, so this is all easily expressed in LCEL." + ] + }, + { + "cell_type": "code", + "execution_count": 50, + "id": "55142257-2674-4a47-988e-0d2810917329", + "metadata": {}, + "outputs": [], + "source": [ + "tool_messages = plan_and_schedule.invoke([HumanMessage(content=example_question)])" + ] + }, + { + "cell_type": "code", + "execution_count": 51, + "id": "a98e0525-2fcf-4fa1-baf6-79858bb8a6bd", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "[FunctionMessage(content=\"[{'url': 'https://en.climate-data.org/north-america/united-states-of-america/california/san-francisco-385/t/september-9/', 'content': 'San Francisco Weather in September San Francisco weather in September San Francisco weather by month // weather averages 9.6 (49.2) 6.2 (43.2) 14 (57.3) Data: 1999 - 2019: avg. Sun hours San Francisco weather and climate for further months San Francisco weather in September // weather averages Airport close to San FranciscoJanuary February March April May June July August September October November December; Avg. Temperature °C (°F) 9.6 °C (49.2) °F. 10.5 °C (50.8) °F. 11.6 °C'}]\", additional_kwargs={'idx': 1}, name='tavily_search_results_json'),\n", + " FunctionMessage(content='1', additional_kwargs={'idx': 2}, name='math'),\n", + " FunctionMessage(content='join', additional_kwargs={'idx': 3}, name='join')]" + ] + }, + "execution_count": 51, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "tool_messages" + ] + }, + { + "cell_type": "markdown", + "id": "563d5311-55f0-4ca1-afbd-01fd970cf3e3", + "metadata": {}, + "source": [ + "## 4. \"Joiner\" \n", + "\n", + "So now we have the planning and initial execution done. We need a component to process these outputs and either:\n", + "\n", + "1. Respond with the correct answer.\n", + "2. Loop with a new plan.\n", + "\n", + "The paper refers to this as the \"joiner\". It's another LLM call. We are using function calling to improve parsing reliability." + ] + }, + { + "cell_type": "code", + "execution_count": 52, + "id": "942dab42-ad42-4ba2-90d5-49edbe4fae68", + "metadata": {}, + "outputs": [], + "source": [ + "from langchain_core.pydantic_v1 import BaseModel, Field\n", + "from langchain.chains.openai_functions import create_structured_output_runnable\n", + "from langchain_core.messages import AIMessage\n", + "\n", + "class FinalResponse(BaseModel):\n", + " \"\"\"The final response/answer.\"\"\"\n", + " response: str\n", + "\n", + "class Replan(BaseModel):\n", + " feedback: str = Field(description=\"Analysis of the previous attempts and recommendations on what needs to be fixed.\")\n", + "\n", + "class JoinOutputs(BaseModel):\n", + " \"\"\"Decide whether to replan or whether you can return the final response.\"\"\"\n", + " thought: str = Field(description=\"The chain of thought reasoning for the selected action\")\n", + " action: Union[FinalResponse, Replan]\n", + "\n", + "\n", + "joiner_prompt = hub.pull(\"wfh/llm-compiler-joiner\").partial(examples=\"\") # You can optionally add examples\n", + "llm = ChatOpenAI(model=\"gpt-4-turbo-preview\")\n", + "\n", + "runnable = create_structured_output_runnable(JoinOutputs, llm, joiner_prompt)" + ] + }, + { + "cell_type": "markdown", + "id": "fb50c4cd-947c-4a5d-a9f7-f0d92a10600f", + "metadata": {}, + "source": [ + "We will select only the most recent messages in the state, and format the output to be more useful for\n", + "the planner, should the agent need to loop." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "951a33cf-2a05-4a33-899a-0ab1d97122fa", + "metadata": {}, + "outputs": [], + "source": [ + "def _parse_joiner_output(decision: JoinOutputs) -> List[BaseMessage]:\n", + " response = [AIMessage(content=f\"Thought: {decision.thought}\")]\n", + " if isinstance(decision.action, Replan):\n", + " return response + [SystemMessage(content=f\"Context from last attempt: {decision.action.feedback}\")]\n", + " else:\n", + " return response + [AIMessage(content=decision.action.response)]\n", + "\n", + "\n", + "def select_recent_messages(messages: list) -> dict:\n", + " selected = []\n", + " for msg in messages[::-1]:\n", + " selected.append(msg)\n", + " if isinstance(msg, HumanMessage):\n", + " break\n", + " return {\"messages\": selected[::-1]}\n", + "\n", + "joiner = (\n", + " select_recent_messages\n", + " | runnable\n", + " | _parse_joiner_output\n", + ")" + ] + }, + { + "cell_type": "code", + "execution_count": 53, + "id": "1e49d4b1-8266-4520-a566-1448b1c31c8f", + "metadata": {}, + "outputs": [], + "source": [ + "input_messages = [HumanMessage(content=example_question)] + tool_messages" + ] + }, + { + "cell_type": "code", + "execution_count": 54, + "id": "31854dfd-b82f-4c24-9b58-6bae66777909", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "[AIMessage(content=\"Thought: The information provided gives an average temperature for San Francisco in different months, but it doesn't specify the current temperature or any specific temperature to be raised to the 3rd power. Without the current temperature or a specific temperature value, it's impossible to calculate its value raised to the 3rd power.\"),\n", + " SystemMessage(content='Context from last attempt: The information provided is not sufficient to answer the question as it lacks the current temperature of San Francisco or any specific temperature value to be raised to the 3rd power. Need to find the current or a specific temperature to perform the calculation.')]" + ] + }, + "execution_count": 54, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "joiner.invoke(input_messages)" + ] + }, + { + "cell_type": "markdown", + "id": "b099e5ee-2c23-47d9-9387-0f64e02627d3", + "metadata": {}, + "source": [ + "## 5. Compose using LangGraph\n", + "\n", + "We'll define the agent as a stateful graph, with the main nodes being:\n", + "\n", + "1. Plan and execute (the DAG from the first step above)\n", + "2. Join: determine if we should finish or replan\n", + "3. Recontextualize: update the graph state based on the output from the joiner" + ] + }, + { + "cell_type": "code", + "execution_count": 55, + "id": "768b5f11-e3d2-47be-8143-a7dcd8765243", + "metadata": {}, + "outputs": [], + "source": [ + "from langgraph.graph import MessageGraph, END\n", + "from typing import Dict\n", + "\n", + "graph_builder = MessageGraph()\n", + "\n", + "# 1. Define vertices\n", + "# We defined plan_and_schedule above already\n", + "# Assign each node to a state variable to update\n", + "graph_builder.add_node(\"plan_and_schedule\", plan_and_schedule)\n", + "graph_builder.add_node(\"join\", joiner)\n", + "\n", + "\n", + "## Define edges\n", + "graph_builder.add_edge(\"plan_and_schedule\", \"join\")\n", + "\n", + "### This condition determines looping logic\n", + "\n", + "\n", + "def should_continue(state: List[BaseMessage]):\n", + " if isinstance(state[-1], AIMessage):\n", + " return END\n", + " return \"plan_and_schedule\"\n", + "\n", + "graph_builder.add_conditional_edges(\n", + " start_key=\"join\",\n", + " # Next, we pass in the function that will determine which node is called next.\n", + " condition=should_continue,\n", + ")\n", + "graph_builder.set_entry_point(\"plan_and_schedule\")\n", + "chain = graph_builder.compile()" + ] + }, + { + "cell_type": "markdown", + "id": "9f8c9849-8531-463d-a0ef-dcc3d9888b2d", + "metadata": {}, + "source": [ + "#### Simple question\n", + "\n", + "Let's ask a simple question of the agent." + ] + }, + { + "cell_type": "code", + "execution_count": 56, + "id": "5bc4584a-e31c-4065-805e-76a6db30676a", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "{'plan_and_schedule': [FunctionMessage(content='[{\\'url\\': \\'https://www.statista.com/statistics/188087/gdp-of-the-us-federal-state-of-new-york-since-1997/\\', \\'content\\': \"Strategy and business building for the data-driven economy: U.S. real GDP of New York 2000-2022 Real gross domestic product of New York in the United States from 2000 to 2022 (in billion U.S. dollars) Economy U.S. New York metro area GDP 2001-2022 You only have access to basic statistics. U.S. state and local government outstanding debt 2021, by state Demographics Resident population in New York 1960-2022In 2022, the real gross domestic product (GDP) of New York was about 1.56 trillion U.S. dollars. This is an increase from the previous year, when the state\\'s GDP stood at 1.51 trillion...\"}]', additional_kwargs={'idx': 0}, name='tavily_search_results_json')]}\n", + "---\n", + "{'join': [AIMessage(content='Thought: The search result provides the information that in 2022, the real gross domestic product (GDP) of New York was about 1.56 trillion U.S. dollars.'), AIMessage(content='The GDP of New York in 2022 was about 1.56 trillion U.S. dollars.')]}\n", + "---\n", + "{'__end__': [HumanMessage(content=\"What's the GDP of New York?\"), FunctionMessage(content='[{\\'url\\': \\'https://www.statista.com/statistics/188087/gdp-of-the-us-federal-state-of-new-york-since-1997/\\', \\'content\\': \"Strategy and business building for the data-driven economy: U.S. real GDP of New York 2000-2022 Real gross domestic product of New York in the United States from 2000 to 2022 (in billion U.S. dollars) Economy U.S. New York metro area GDP 2001-2022 You only have access to basic statistics. U.S. state and local government outstanding debt 2021, by state Demographics Resident population in New York 1960-2022In 2022, the real gross domestic product (GDP) of New York was about 1.56 trillion U.S. dollars. This is an increase from the previous year, when the state\\'s GDP stood at 1.51 trillion...\"}]', additional_kwargs={'idx': 0}, name='tavily_search_results_json'), AIMessage(content='Thought: The search result provides the information that in 2022, the real gross domestic product (GDP) of New York was about 1.56 trillion U.S. dollars.'), AIMessage(content='The GDP of New York in 2022 was about 1.56 trillion U.S. dollars.')]}\n", + "---\n" + ] + } + ], + "source": [ + "for step in chain.stream([HumanMessage(content=\"What's the GDP of New York?\")]):\n", + " print(step)\n", + " print('---')\n" + ] + }, + { + "cell_type": "code", + "execution_count": 57, + "id": "b96efd08-5314-44f0-a694-3073b638adad", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "The GDP of New York in 2022 was about 1.56 trillion U.S. dollars.\n" + ] + } + ], + "source": [ + "# Final answer\n", + "print(step[END][-1].content)" + ] + }, + { + "cell_type": "markdown", + "id": "33c65ef5-b4b2-4ab2-8c78-a551da7819b9", + "metadata": {}, + "source": [ + "#### Multi-hop question\n", + "\n", + "This question requires that the agent perform multiple searches." + ] + }, + { + "cell_type": "code", + "execution_count": 58, + "id": "0b3a0916-d8ca-4092-b91c-d9e2b05259d8", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "{'plan_and_schedule': [FunctionMessage(content='[{\\'url\\': \\'https://savetheeaglesinternational.org/old-parrot/\\', \\'content\\': \"What Is The World\\'s Oldest Parrot? Living Long and Healthy Lives: A Look at the World’s Oldest Parrots certain parrot species are considered older: your parrot enters its senior years?One remarkable parrot that defied the odds and lived a long life is Cookie, a cockatoo who reached the impressive age of 83. Cookie spent his entire life at the Brookfield Zoo, serving as a testament to the exceptional care and environment provided by the zookeepers.\"}]', additional_kwargs={'idx': 1}, name='tavily_search_results_json'), FunctionMessage(content=\"[{'url': 'https://www.animalwised.com/how-long-does-a-parrot-live-3974.html', 'content': 'How Long Does a Parrot Live? How long does a parrot live in captivity? How long does a parrot live in the wild? Why do parrots live so long?Below is the average life expectancy of parrots in captivity, based on their species. Lovebirds. Lovebirds are members of the genus Agapornis, a small group of parrots in the parrot family Psittaculidae. The average life expectancy of a lovebird is between 12 and 15 years. Depending on care and circumstances, the bird can live up to 20 years ...'}]\", additional_kwargs={'idx': 2}, name='tavily_search_results_json'), FunctionMessage(content='join', additional_kwargs={'idx': 3}, name='join')]}\n", + "---\n", + "{'join': [AIMessage(content=\"Thought: The oldest parrot ever recorded is Cookie, a cockatoo, who lived to be 83 years old. However, the average lifespan provided is specifically for lovebirds, which is between 12 and 15 years. This information doesn't accurately reflect the average lifespan of all parrot species, which would be necessary to compare with Cookie's age accurately. Since parrots encompass a wide variety of species with different lifespans, the information on lovebirds' lifespan alone is insufficient for a comprehensive comparison.\"), SystemMessage(content=\"Context from last attempt: We need information on the average lifespan of parrots in general, not just lovebirds, to accurately compare with Cookie's age.\")]}\n", + "---\n", + "{'plan_and_schedule': [FunctionMessage(content='[{\\'url\\': \\'https://www.petmd.com/bird/how-long-do-parrots-live\\', \\'content\\': \"Average Parrot Lifespan and Aging How Long Do Parrots Live? How to Improve Your Parrot\\'s Lifespan Mcleod DVM, Lianne. The Spruce Pets. How Long do Pet Parrots and Other Birds Live?. 2023.Some pets, such as tortoises and parrots, may live for over 50 years. Because they are a lifelong commitment, lawyers often urge pet parents to provide documented plans for their pet parrots in their wills. Average Parrot Lifespan and Aging. Parrots are an incredibly diverse group of birds known by their scientific name: psittacines.\"}]', additional_kwargs={'idx': 4}, name='tavily_search_results_json')]}\n", + "---\n", + "{'join': [AIMessage(content=\"Thought: The information provided does not give a specific average lifespan for parrots in general, which is necessary for accurately comparing Cookie's age to the average lifespan of parrots. The search result mentions that parrots can live over 50 years but does not provide a detailed average lifespan applicable to all or most parrot species.\"), SystemMessage(content=\"Context from last attempt: We need information on the average lifespan of parrots in general to accurately compare with Cookie's age of 83 years. The provided information doesn't specify an average lifespan for parrots as a whole.\")]}\n", + "---\n", + "{'plan_and_schedule': [FunctionMessage(content='join', additional_kwargs={'idx': 5}, name='join')]}\n", + "---\n", + "{'join': [AIMessage(content=\"Thought: Despite multiple attempts, the specific average lifespan of parrots as a whole has not been provided. The information obtained mentions that parrots can live over 50 years, but a more precise average is necessary for a detailed comparison with Cookie's age of 83 years. However, it's clear that Cookie lived significantly longer than the average lifespan of many parrot species, including lovebirds which have an average lifespan of 12 to 15 years.\"), AIMessage(content=\"The oldest parrot on record is Cookie, a cockatoo, who lived to be 83 years old. While specific average lifespan information for all parrot species has not been provided, it's mentioned that some parrots can live over 50 years. This suggests that Cookie lived significantly longer than the average lifespan for many parrot species. For instance, lovebirds, a type of parrot, have an average lifespan of 12 to 15 years, indicating that Cookie's lifespan was exceptional among parrots.\")]}\n", + "---\n", + "{'__end__': [HumanMessage(content=\"What's the oldest parrot alive, and how much longer is that than the average?\"), FunctionMessage(content='[{\\'url\\': \\'https://savetheeaglesinternational.org/old-parrot/\\', \\'content\\': \"What Is The World\\'s Oldest Parrot? Living Long and Healthy Lives: A Look at the World’s Oldest Parrots certain parrot species are considered older: your parrot enters its senior years?One remarkable parrot that defied the odds and lived a long life is Cookie, a cockatoo who reached the impressive age of 83. Cookie spent his entire life at the Brookfield Zoo, serving as a testament to the exceptional care and environment provided by the zookeepers.\"}]', additional_kwargs={'idx': 1}, name='tavily_search_results_json'), FunctionMessage(content=\"[{'url': 'https://www.animalwised.com/how-long-does-a-parrot-live-3974.html', 'content': 'How Long Does a Parrot Live? How long does a parrot live in captivity? How long does a parrot live in the wild? Why do parrots live so long?Below is the average life expectancy of parrots in captivity, based on their species. Lovebirds. Lovebirds are members of the genus Agapornis, a small group of parrots in the parrot family Psittaculidae. The average life expectancy of a lovebird is between 12 and 15 years. Depending on care and circumstances, the bird can live up to 20 years ...'}]\", additional_kwargs={'idx': 2}, name='tavily_search_results_json'), FunctionMessage(content='join', additional_kwargs={'idx': 3}, name='join'), AIMessage(content=\"Thought: The oldest parrot ever recorded is Cookie, a cockatoo, who lived to be 83 years old. However, the average lifespan provided is specifically for lovebirds, which is between 12 and 15 years. This information doesn't accurately reflect the average lifespan of all parrot species, which would be necessary to compare with Cookie's age accurately. Since parrots encompass a wide variety of species with different lifespans, the information on lovebirds' lifespan alone is insufficient for a comprehensive comparison.\"), SystemMessage(content=\"Context from last attempt: We need information on the average lifespan of parrots in general, not just lovebirds, to accurately compare with Cookie's age. - Begin counting at : 4\"), FunctionMessage(content='[{\\'url\\': \\'https://www.petmd.com/bird/how-long-do-parrots-live\\', \\'content\\': \"Average Parrot Lifespan and Aging How Long Do Parrots Live? How to Improve Your Parrot\\'s Lifespan Mcleod DVM, Lianne. The Spruce Pets. How Long do Pet Parrots and Other Birds Live?. 2023.Some pets, such as tortoises and parrots, may live for over 50 years. Because they are a lifelong commitment, lawyers often urge pet parents to provide documented plans for their pet parrots in their wills. Average Parrot Lifespan and Aging. Parrots are an incredibly diverse group of birds known by their scientific name: psittacines.\"}]', additional_kwargs={'idx': 4}, name='tavily_search_results_json'), AIMessage(content=\"Thought: The information provided does not give a specific average lifespan for parrots in general, which is necessary for accurately comparing Cookie's age to the average lifespan of parrots. The search result mentions that parrots can live over 50 years but does not provide a detailed average lifespan applicable to all or most parrot species.\"), SystemMessage(content=\"Context from last attempt: We need information on the average lifespan of parrots in general to accurately compare with Cookie's age of 83 years. The provided information doesn't specify an average lifespan for parrots as a whole. - Begin counting at : 5\"), FunctionMessage(content='join', additional_kwargs={'idx': 5}, name='join'), AIMessage(content=\"Thought: Despite multiple attempts, the specific average lifespan of parrots as a whole has not been provided. The information obtained mentions that parrots can live over 50 years, but a more precise average is necessary for a detailed comparison with Cookie's age of 83 years. However, it's clear that Cookie lived significantly longer than the average lifespan of many parrot species, including lovebirds which have an average lifespan of 12 to 15 years.\"), AIMessage(content=\"The oldest parrot on record is Cookie, a cockatoo, who lived to be 83 years old. While specific average lifespan information for all parrot species has not been provided, it's mentioned that some parrots can live over 50 years. This suggests that Cookie lived significantly longer than the average lifespan for many parrot species. For instance, lovebirds, a type of parrot, have an average lifespan of 12 to 15 years, indicating that Cookie's lifespan was exceptional among parrots.\")]}\n", + "---\n" + ] + } + ], + "source": [ + "steps = chain.stream(\n", + " [HumanMessage(content=\"What's the oldest parrot alive, and how much longer is that than the average?\")],\n", + " {\n", + " \"recursion_limit\": 100,\n", + " },\n", + ")\n", + "for step in steps:\n", + " print(step)\n", + " print('---')" + ] + }, + { + "cell_type": "code", + "execution_count": 59, + "id": "6c65c414-7668-4fdf-ba97-f42f659b1317", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "The oldest parrot on record is Cookie, a cockatoo, who lived to be 83 years old. While specific average lifespan information for all parrot species has not been provided, it's mentioned that some parrots can live over 50 years. This suggests that Cookie lived significantly longer than the average lifespan for many parrot species. For instance, lovebirds, a type of parrot, have an average lifespan of 12 to 15 years, indicating that Cookie's lifespan was exceptional among parrots.\n" + ] + } + ], + "source": [ + "# Final answer\n", + "print(step[END][-1].content)" + ] + }, + { + "cell_type": "markdown", + "id": "1b859bc7-1a85-4d35-b57b-f67c87282403", + "metadata": {}, + "source": [ + "#### Multi-step math" + ] + }, + { + "cell_type": "code", + "execution_count": 60, + "id": "38d3ea91-59ba-4267-8060-ed75bbc840c6", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "{'plan_and_schedule': [FunctionMessage(content='3307.0', additional_kwargs={'idx': 0}, name='math'), FunctionMessage(content='7.565011820330969', additional_kwargs={'idx': 1}, name='math'), FunctionMessage(content='join', additional_kwargs={'idx': 2}, name='join')]}\n", + "{'join': [AIMessage(content='Thought: The first calculation resulted in 3307.0, and the second calculation gave 7.565011820330969. To find the sum of these two values, I will simply add them together.'), AIMessage(content='The sum of ((3*(4+5)/0.5)+3245) + 8 and 32/4.23 is approximately 3314.565.')]}\n", + "{'__end__': [HumanMessage(content=\"What's ((3*(4+5)/0.5)+3245) + 8? What's 32/4.23? What's the sum of those two values?\"), FunctionMessage(content='3307.0', additional_kwargs={'idx': 0}, name='math'), FunctionMessage(content='7.565011820330969', additional_kwargs={'idx': 1}, name='math'), FunctionMessage(content='join', additional_kwargs={'idx': 2}, name='join'), AIMessage(content='Thought: The first calculation resulted in 3307.0, and the second calculation gave 7.565011820330969. To find the sum of these two values, I will simply add them together.'), AIMessage(content='The sum of ((3*(4+5)/0.5)+3245) + 8 and 32/4.23 is approximately 3314.565.')]}\n" + ] + } + ], + "source": [ + "for step in chain.stream([HumanMessage(content=\"What's ((3*(4+5)/0.5)+3245) + 8? What's 32/4.23? What's the sum of those two values?\")]):\n", + " print(step)" + ] + }, + { + "cell_type": "code", + "execution_count": 61, + "id": "a6cf5fe0-f178-4197-950f-257711bff8d2", + "metadata": { + "scrolled": true + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "The sum of ((3*(4+5)/0.5)+3245) + 8 and 32/4.23 is approximately 3314.565.\n" + ] + } + ], + "source": [ + "# Final answer\n", + "print(step[END][-1].content)" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.11.2" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/examples/plan-and-execute/llm_compiler/__init__.py b/examples/plan-and-execute/llm_compiler/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/examples/plan-and-execute/llm_compiler/ast_parser.py b/examples/plan-and-execute/llm_compiler/ast_parser.py new file mode 100644 index 000000000..1f7f0c9ae --- /dev/null +++ b/examples/plan-and-execute/llm_compiler/ast_parser.py @@ -0,0 +1,37 @@ +import ast +import re +from typing import Dict, Union + + +def get_args(s: str) -> Dict[str, Union[str, bool, int, list, dict, None]]: + # Extract the argument string + args_str = re.search(r"\((.*?)\)", s).group(1) + + # Split the arguments on comma, considering nested structures + args = re.split(r",(?![^[]*\]|[^(]*\))", args_str) + + # Create a dictionary from the split arguments + args_dict = {} + for arg in args: + key, value = arg.split("=", 1) + key = key.strip() + value = ast.literal_eval(value.strip()) + args_dict[key] = value + + return args_dict + + +if __name__ == "__main__": + # Should work on all these cases: + signatures = [ + 'func(a="foo", b=1, c=None, d=[1, 2, 3], e={"a": 1, "b": 2})', + 'another_func(idk={"nesting": {\'is\': ["fun", "right?"]}})', + 'once_more(a="How do you know that a = b?")', + ] + expected = [ + {"a": "foo", "b": 1, "c": None, "d": [1, 2, 3], "e": {"a": 1, "b": 2}}, + {"idk": {"nesting": {"is": ["fun", "right?"]}}}, + {"a": "How do you know that a = b?"}, + ] + for i, s in enumerate(signatures): + assert get_args(s) == expected[i] diff --git a/examples/plan-and-execute/llm_compiler/img/diagram.png b/examples/plan-and-execute/llm_compiler/img/diagram.png new file mode 100644 index 0000000000000000000000000000000000000000..01655a5ec4d11637ee426679e46d68773d6e2832 GIT binary patch literal 253693 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 Cb+mZ^ literal 0 HcmV?d00001 diff --git a/examples/plan-and-execute/llm_compiler/math_tools.py b/examples/plan-and-execute/llm_compiler/math_tools.py new file mode 100644 index 000000000..31b3cf65c --- /dev/null +++ b/examples/plan-and-execute/llm_compiler/math_tools.py @@ -0,0 +1,143 @@ +import math +import re +from typing import List, Optional + +import numexpr +from langchain.chains.openai_functions import create_structured_output_runnable +from langchain_community.chat_models import ChatOpenAI +from langchain_core.messages import SystemMessage +from langchain_core.prompts import ChatPromptTemplate, MessagesPlaceholder +from langchain_core.pydantic_v1 import BaseModel, Field +from langchain_core.runnables import RunnableConfig +from langchain_core.tools import StructuredTool + +_MATH_DESCRIPTION = ( + "math(problem: str, context: Optional[list[str]]) -> float:\n" + " - Solves the provided math problem.\n" + ' - `problem` can be either a simple math problem (e.g. "1 + 3") or a word problem (e.g. "how many apples are there if there are 3 apples and 2 apples").\n' + " - You cannot calculate multiple expressions in one call. For instance, `math('1 + 3, 2 + 4')` does not work. " + "If you need to calculate multiple expressions, you need to call them separately like `math('1 + 3')` and then `math('2 + 4')`\n" + " - Minimize the number of `math` actions as much as possible. For instance, instead of calling " + '2. math("what is the 10% of $1") and then call 3. math("$1 + $2"), ' + 'you MUST call 2. math("what is the 110% of $1") instead, which will reduce the number of math actions.\n' + # Context specific rules below + " - You can optionally provide a list of strings as `context` to help the agent solve the problem. " + "If there are multiple contexts you need to answer the question, you can provide them as a list of strings.\n" + " - `math` action will not see the output of the previous actions unless you provide it as `context`. " + "You MUST provide the output of the previous actions as `context` if you need to do math on it.\n" + " - You MUST NEVER provide `search` type action's outputs as a variable in the `problem` argument. " + "This is because `search` returns a text blob that contains the information about the entity, not a number or value. " + "Therefore, when you need to provide an output of `search` action, you MUST provide it as a `context` argument to `math` action. " + 'For example, 1. search("Barack Obama") and then 2. math("age of $1") is NEVER allowed. ' + 'Use 2. math("age of Barack Obama", context=["$1"]) instead.\n' + " - When you ask a question about `context`, specify the units. " + 'For instance, "what is xx in height?" or "what is xx in millions?" instead of "what is xx?"\n' +) + + +_SYSTEM_PROMPT = """Translate a math problem into a expression that can be executed using Python's numexpr library. Use the output of running this code to answer the question. + +Question: ${{Question with math problem.}} +```text +${{single line mathematical expression that solves the problem}} +``` +...numexpr.evaluate(text)... +```output +${{Output of running the code}} +``` +Answer: ${{Answer}} + +Begin. + +Question: What is 37593 * 67? +ExecuteCode({{code: "37593 * 67"}}) +...numexpr.evaluate("37593 * 67")... +```output +2518731 +``` +Answer: 2518731 + +Question: 37593^(1/5) +ExecuteCode({{code: "37593**(1/5)"}}) +...numexpr.evaluate("37593**(1/5)")... +```output +8.222831614237718 +``` +Answer: 8.222831614237718 +""" + +_ADDITIONAL_CONTEXT_PROMPT = """The following additional context is provided from other functions.\ + Use it to substitute into any ${{#}} variables or other words in the problem.\ + \n\n${context}\n\nNote that context varibles are not defined in code yet.\ +You must extract the relevant numbers and directly put them in code.""" + + +class ExecuteCode(BaseModel): + """The input to the numexpr.evaluate() function.""" + + reasoning: str = Field( + ..., + description="The reasoning behind the code expression, including how context is included, if applicable.", + ) + + code: str = Field( + ..., + description="The simple code expresssion to execute by numexpr.evaluate().", + ) + + +def _evaluate_expression(expression: str) -> str: + try: + local_dict = {"pi": math.pi, "e": math.e} + output = str( + numexpr.evaluate( + expression.strip(), + global_dict={}, # restrict access to globals + local_dict=local_dict, # add common mathematical functions + ) + ) + except Exception as e: + raise ValueError( + f'Failed to evaluate "{expression}". Raised error: {repr(e)}.' + " Please try again with a valid numerical expression" + ) + + # Remove any leading and trailing brackets from the output + return re.sub(r"^\[|\]$", "", output) + + +def get_math_tool(llm: ChatOpenAI): + + prompt = ChatPromptTemplate.from_messages( + [ + ("system", _SYSTEM_PROMPT), + ("user", "{problem}"), + MessagesPlaceholder(variable_name="context", optional=True), + ] + ) + extractor = create_structured_output_runnable(ExecuteCode, llm, prompt) + + def calculate_expression( + problem: str, + context: Optional[List[str]] = None, + config: Optional[RunnableConfig] = None, + ): + chain_input = {"problem": problem} + if context: + context_str = "\n".join(context) + if context_str.strip(): + context_str = _ADDITIONAL_CONTEXT_PROMPT.format( + context=context_str.strip() + ) + chain_input["context"] = [SystemMessage(content=context_str)] + code_model = extractor.invoke(chain_input, config) + try: + return _evaluate_expression(code_model.code) + except Exception as e: + return repr(e) + + return StructuredTool.from_function( + name="math", + func=calculate_expression, + description=_MATH_DESCRIPTION, + ) diff --git a/examples/plan-and-execute/llm_compiler/output_parser.py b/examples/plan-and-execute/llm_compiler/output_parser.py new file mode 100644 index 000000000..daba5bb06 --- /dev/null +++ b/examples/plan-and-execute/llm_compiler/output_parser.py @@ -0,0 +1,177 @@ +import ast +import re +from typing import ( + Any, + Dict, + Iterator, + List, + Optional, + Sequence, + Tuple, + Union, +) + +from langchain_core.exceptions import OutputParserException +from langchain_core.messages import BaseMessage +from langchain_core.output_parsers.transform import BaseTransformOutputParser +from langchain_core.tools import BaseTool +from langchain_core.runnables import RunnableConfig +from typing_extensions import TypedDict + +THOUGHT_PATTERN = r"Thought: ([^\n]*)" +ACTION_PATTERN = r"\n*(\d+)\. (\w+)\((.*)\)(\s*#\w+\n)?" +# $1 or ${1} -> 1 +ID_PATTERN = r"\$\{?(\d+)\}?" +END_OF_PLAN = "" + + +### Helper functions + + +def _ast_parse(arg: str) -> Any: + try: + return ast.literal_eval(arg) + except: # noqa + return arg + + +def _parse_llm_compiler_action_args(args: str, tool: Union[str, BaseTool]) -> list[Any]: + """Parse arguments from a string.""" + if args == "": + return () + if isinstance(tool, str): + return () + extracted_args = {} + tool_key = None + prev_idx = None + for key in tool.args.keys(): + # Split if present + if f"{key}=" in args: + idx = args.index(f"{key}=") + if prev_idx is not None: + extracted_args[tool_key] = _ast_parse( + args[prev_idx:idx].strip().rstrip(",") + ) + args = args.split(f"{key}=", 1)[1] + tool_key = key + prev_idx = 0 + if prev_idx is not None: + extracted_args[tool_key] = _ast_parse( + args[prev_idx:].strip().rstrip(",").rstrip(")") + ) + return extracted_args + + +def default_dependency_rule(idx, args: str): + matches = re.findall(ID_PATTERN, args) + numbers = [int(match) for match in matches] + return idx in numbers + + +def _get_dependencies_from_graph( + idx: int, tool_name: str, args: Dict[str, Any] +) -> dict[str, list[str]]: + """Get dependencies from a graph.""" + if tool_name == "join": + return list(range(1, idx)) + return [i for i in range(1, idx) if default_dependency_rule(i, str(args))] + + +class Task(TypedDict): + idx: int + tool: BaseTool + args: list + dependencies: Dict[str, list] + thought: Optional[str] + + +def instantiate_task( + tools: Sequence[BaseTool], + idx: int, + tool_name: str, + args: Union[str, Any], + thought: Optional[str] = None, +) -> Task: + if tool_name == "join": + tool = "join" + else: + try: + tool = tools[[tool.name for tool in tools].index(tool_name)] + except ValueError as e: + raise OutputParserException(f"Tool {tool_name} not found.") from e + tool_args = _parse_llm_compiler_action_args(args, tool) + dependencies = _get_dependencies_from_graph(idx, tool_name, tool_args) + + return Task( + idx=idx, + tool=tool, + args=tool_args, + dependencies=dependencies, + thought=thought, + ) + + +class LLMCompilerPlanParser(BaseTransformOutputParser[dict], extra="allow"): + """Planning output parser.""" + + tools: List[BaseTool] + + def _transform(self, input: Iterator[Union[str, BaseMessage]]) -> Iterator[Task]: + texts = [] + # TODO: Cleanup tuple state tracking here. + thought = None + for chunk in input: + # Assume input is str. TODO: support vision/other formats + text = chunk if isinstance(chunk, str) else str(chunk.content) + for task, thought in self.ingest_token(text, texts, thought): + yield task + # Final possible task + if texts: + task, _ = self._parse_task("".join(texts), thought) + if task: + yield task + + def parse(self, text: str) -> List[Task]: + return list(self._transform([text])) + + def stream( + self, + input: str | BaseMessage, + config: RunnableConfig | None = None, + **kwargs: Any | None, + ) -> Iterator[Task]: + yield from self.transform([input], config, **kwargs) + + def ingest_token( + self, token: str, buffer: List[str], thought: Optional[str] + ) -> Iterator[Tuple[Optional[Task], str]]: + buffer.append(token) + if "\n" in token: + buffer_ = "".join(buffer).split("\n") + suffix = buffer_[-1] + for line in buffer_[:-1]: + task, thought = self._parse_task(line, thought) + if task: + yield task, thought + buffer.clear() + buffer.append(suffix) + + def _parse_task(self, line: str, thought: Optional[str] = None): + task = None + if match := re.match(THOUGHT_PATTERN, line): + # Optionally, action can be preceded by a thought + thought = match.group(1) + elif match := re.match(ACTION_PATTERN, line): + # if action is parsed, return the task, and clear the buffer + idx, tool_name, args, _ = match.groups() + idx = int(idx) + task = instantiate_task( + tools=self.tools, + idx=idx, + tool_name=tool_name, + args=args, + thought=thought, + ) + thought = None + # Else it is just dropped + return task, thought From ed3bf3c5ec605733f17a0eeee9176e300820b1cf Mon Sep 17 00:00:00 2001 From: William Fu-Hinthorn <13333726+hinthornw@users.noreply.github.com> Date: Fri, 9 Feb 2024 16:04:36 -0800 Subject: [PATCH 12/18] del --- .../llm_compiler/LLMCompiler.ipynb | 1065 ----------------- .../llm_compiler/img/diagram.png | Bin 253693 -> 0 bytes .../llm_compiler/output_parser.py | 154 --- 3 files changed, 1219 deletions(-) delete mode 100644 examples/advanced_agents/llm_compiler/LLMCompiler.ipynb delete mode 100644 examples/advanced_agents/llm_compiler/img/diagram.png delete mode 100644 examples/advanced_agents/llm_compiler/output_parser.py diff --git a/examples/advanced_agents/llm_compiler/LLMCompiler.ipynb b/examples/advanced_agents/llm_compiler/LLMCompiler.ipynb deleted file mode 100644 index d42edc13f..000000000 --- a/examples/advanced_agents/llm_compiler/LLMCompiler.ipynb +++ /dev/null @@ -1,1065 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "id": "0c8b472b-f3fb-46c2-841f-930a4692697b", - "metadata": {}, - "source": [ - "# Implementing LLMCompiler using LangGraph\n", - "By Kim, et. al [đŸ”—](https://arxiv.org/abs/2312.04511)\n", - "\n", - "LLMCompiler is an agent architecture intented on speeding up the latency of agentic tasks via fast, parallel tool execution. It has 3 main components:\n", - "\n", - "1. Planner: generate a DAG of tasks.\n", - "2. Task Fetching Unit: schedules and executes the tasks\n", - "3. Joiner: Responds to the user or triggers a second plan\n", - "\n", - "\n", - "![diagram](./img/diagram.png)\n", - "\n", - "\n", - "This notebook walks through each component and shows how to wire them together using LangGraph. First, we will set up LangSmith for tracing, and configure our environment variables." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "abbd6948-e9a3-47ca-89c7-7ac2fc5eca8b", - "metadata": {}, - "outputs": [], - "source": [ - "import os\n", - "import getpass\n", - "\n", - "os.environ[\"LANGCHAIN_TRACING_V2\"] = \"true\"\n", - "os.environ[\"LANGCHAIN_PROJECT\"] = \"LLMCompiler\"\n", - "os.environ[\"LANGCHAIN_API_KEY\"] = getpass.getpass(\"LangSmith API Key: \")\n", - "os.environ[\"OPENAI_API_KEY\"] = getpass.getpass(\"OpenAI API Key: \")" - ] - }, - { - "cell_type": "markdown", - "id": "1abdedbd-d81b-4ee9-b46f-f29439ed1350", - "metadata": {}, - "source": [ - "# Part 1: Planner\n", - "\n", - "\n", - "Largely adapted from [the original source code](https://github.com/SqueezeAILab/LLMCompiler/blob/main/src/llm_compiler/output_parser.py), the planner accepts the input question and generates a task list to execute.\n", - "\n", - "If it is provided with a previous plan, it is instructed to re-plan, which is useful if, upon completion of the first batch of tasks, the agent must take more actions.\n", - "\n", - "The code below composes constructs the prompt template for the planner and composes it with LLM and output parser, defined in [output_parser.py](./output_parser.py). The output parser processes a task list in the following form:\n", - "\n", - "```plaintext\n", - "1. tool_1(arg1=\"arg1\", arg2=3.5, ...)\n", - "Thought: I then want to find out Y by using tool_2\n", - "2. tool_2(arg1=\"\", arg2=\"${1}\")'\n", - "3. join()\"\n", - "```\n", - "\n", - "The \"Thought\" lines are optional. The `${#}` placeholders are variables. These are used to route tool (task) outputs to other tools." - ] - }, - { - "cell_type": "code", - "execution_count": 1, - "id": "15dd9639-691f-4906-9012-83fd6e9ac126", - "metadata": {}, - "outputs": [ - { - "ename": "ModuleNotFoundError", - "evalue": "No module named 'llm_compiler'", - "output_type": "error", - "traceback": [ - "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", - "\u001b[0;31mModuleNotFoundError\u001b[0m Traceback (most recent call last)", - "Cell \u001b[0;32mIn[1], line 7\u001b[0m\n\u001b[1;32m 5\u001b[0m \u001b[38;5;28;01mfrom\u001b[39;00m \u001b[38;5;21;01mlangchain_core\u001b[39;00m\u001b[38;5;21;01m.\u001b[39;00m\u001b[38;5;21;01mrunnables\u001b[39;00m \u001b[38;5;28;01mimport\u001b[39;00m RunnableBranch\n\u001b[1;32m 6\u001b[0m \u001b[38;5;28;01mfrom\u001b[39;00m \u001b[38;5;21;01mlangchain_core\u001b[39;00m\u001b[38;5;21;01m.\u001b[39;00m\u001b[38;5;21;01mtools\u001b[39;00m \u001b[38;5;28;01mimport\u001b[39;00m BaseTool\n\u001b[0;32m----> 7\u001b[0m \u001b[38;5;28;01mfrom\u001b[39;00m \u001b[38;5;21;01mllm_compiler\u001b[39;00m\u001b[38;5;21;01m.\u001b[39;00m\u001b[38;5;21;01moutput_parser\u001b[39;00m \u001b[38;5;28;01mimport\u001b[39;00m LLMCompilerPlanParser\n\u001b[1;32m 9\u001b[0m END_OF_PLAN \u001b[38;5;241m=\u001b[39m \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124m\u001b[39m\u001b[38;5;124m\"\u001b[39m\n\u001b[1;32m 12\u001b[0m \u001b[38;5;66;03m# The required extra \"tool\"\u001b[39;00m\n", - "\u001b[0;31mModuleNotFoundError\u001b[0m: No module named 'llm_compiler'" - ] - } - ], - "source": [ - "from typing import Optional, Sequence\n", - "\n", - "from langchain.chat_models.base import BaseChatModel\n", - "from langchain_core.prompts import ChatPromptTemplate\n", - "from langchain_core.runnables import RunnableBranch\n", - "from langchain_core.tools import BaseTool\n", - "\n", - "from output_parser import LLMCompilerPlanParser\n", - "\n", - "END_OF_PLAN = \"\"\n", - "\n", - "\n", - "# The required extra \"tool\"\n", - "JOIN_DESCRIPTION = (\n", - " \"join():\\n\"\n", - " \" - Collects and combines results from prior actions.\\n\"\n", - " \" - A LLM agent is called upon invoking join to either finalize the user query or wait until the plans are executed.\\n\"\n", - " \" - join should always be the last action in the plan, and will be called in two scenarios:\\n\"\n", - " \" (a) if the answer can be determined by gathering the outputs from tasks to generate the final response.\\n\"\n", - " \" (b) if the answer cannot be determined in the planning phase before you execute the plans. \"\n", - ")\n", - "\n", - "planner_prompt_tmpl_str = (\n", - " \"Given a user query, create a plan to solve it with the utmost parallelizability. \"\n", - " \"Each plan should comprise an action from the following {num_tools} types:\\n\"\n", - " \"{tool_descriptions}\"\n", - " f\"\\n{{num_toolsp1}}. {JOIN_DESCRIPTION}\"\n", - " \"Guidelines:\\n\"\n", - " \" - Each action described above contains input/output types and description.\\n\"\n", - " \" - You must strictly adhere to the input and output types for each action.\\n\"\n", - " \" - The action descriptions contain the guidelines. You MUST strictly follow those guidelines when you use the actions.\\n\"\n", - " \" - Each action in the plan should strictly be one of the above types. Follow the Python conventions for each action.\\n\"\n", - " \" - Each action MUST have a unique ID, which is strictly increasing.\\n\"\n", - " \" - Inputs for actions can either be constants or outputs from preceding actions. \"\n", - " \"In the latter case, use the format $id to denote the ID of the previous action whose output will be the input.\\n\"\n", - " f\" - Always call join as the last action in the plan. Say '{END_OF_PLAN}' after you call join\\n\"\n", - " \" - Ensure the plan maximizes parallelizability.\\n\"\n", - " \" - Only use the provided action types. If a query cannot be addressed using these, invoke the join action for the next steps.\\n\"\n", - " \" - Never introduce new actions other than the ones provided.\\n\\n\"\n", - " \"{replan}\"\n", - " \"{examples}\"\n", - ")\n", - "\n", - "\n", - "def _generate_planner_prompt(\n", - " tools: Sequence[BaseTool],\n", - " example_prompt=str,\n", - "):\n", - " tool_descriptions = \"\\n\".join(\n", - " f\"{i+1}. {tool.name}: {tool.description}\" for i, tool in enumerate(tools)\n", - " )\n", - " planner_prompt_template = ChatPromptTemplate.from_messages(\n", - " [(\"system\", planner_prompt_tmpl_str), (\"user\", \"Question: {input}{context}\")]\n", - " ).partial(\n", - " tool_descriptions=tool_descriptions,\n", - " examples=\"Here are some examples:\\n\\n\" + example_prompt\n", - " if example_prompt\n", - " else \"\",\n", - " num_tools=len(tools),\n", - " num_toolsp1=len(tools) + 1,\n", - " )\n", - "\n", - " return planner_prompt_template\n", - "\n", - "\n", - "def create_planner(\n", - " llm: BaseChatModel,\n", - " example_prompt: str,\n", - " tools: Sequence[BaseTool],\n", - " stop: Optional[list[str]] = None,\n", - "):\n", - " og_planner_prompt = _generate_planner_prompt(tools, example_prompt).partial(\n", - " replan=\"\",\n", - " context=\"\",\n", - " )\n", - " replanner_prompt = _generate_planner_prompt(tools, example_prompt).partial(\n", - " replan=' - You are given \"Previous Plan\" which is the plan that the previous agent created along with the execution results '\n", - " \"(given as Observation) of each plan and a general thought (given as Thought) about the executed results.\"\n", - " 'You MUST use these information to create the next plan under \"Current Plan\".\\n'\n", - " ' - When starting the Current Plan, you should start with \"Thought\" that outlines the strategy for the next plan.\\n'\n", - " \" - In the Current Plan, you should NEVER repeat the actions that are already executed in the Previous Plan.\\n\"\n", - " \" - You must continue the task index from the end of the previous one. Do not repeat task indices.\"\n", - " )\n", - " bound_llm = llm.bind(stop=stop)\n", - " return (\n", - " RunnableBranch(\n", - " ((lambda x: x.get(\"context\") is not None), replanner_prompt),\n", - " og_planner_prompt,\n", - " )\n", - " | bound_llm\n", - " | LLMCompilerPlanParser(tools=tools)\n", - " )" - ] - }, - { - "cell_type": "markdown", - "id": "7feb5c82-b1a9-40ae-863a-0362fe3ce5ea", - "metadata": {}, - "source": [ - "#### Example usage\n", - "\n", - "Here's an example usage of the planner module." - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "id": "3fe074ea-7314-47a7-9a9f-a8e6191ea1f3", - "metadata": {}, - "outputs": [], - "source": [ - "from typing import Optional\n", - "\n", - "from langchain.tools import tool\n", - "from langchain_openai import ChatOpenAI\n", - "\n", - "\n", - "@tool\n", - "def get_user_id(first_name: str, last_name: str) -> Optional[int]:\n", - " \"\"\"Query the user IDs of everyone with the provided name.\"\"\"\n", - " student_ids = {\n", - " (\"Eric\", \"Zhang\"): 1432,\n", - " (\"Sam\", \"Van Damm\"): 8523,\n", - " (\"Will\", \"Van Damm\"): 2341,\n", - " }\n", - " return student_ids.get((first_name, last_name))\n", - "\n", - "\n", - "@tool\n", - "def get_scores(class_name: str, user_id: int) -> Optional[str]:\n", - " \"\"\"Query the class registry for grades of the provided user ID.\"\"\"\n", - " return {\n", - " (\"Geology\", 1432): \"A+\",\n", - " (\"Geology\", 8523): \"A\",\n", - " (\"Geology\", 2341): \"B\",\n", - " }.get((class_name, user_id))\n", - "\n", - "\n", - "examples = (\n", - " \"Question: What's the user ID for Johnny Drop Tables?\\n\"\n", - " '1. get_user_id(first_name=\"Johnny\", \"ast_name=\"Drop Tables\")\\n'\n", - " f\"2. join(){END_OF_PLAN}\\n\"\n", - " \"###\\n\"\n", - " \"\\n\"\n", - " \"Question: What was Eric Zhang's score in Calc?\\n\"\n", - " '1. get_user_id(\"Eric\")\\n'\n", - " '2. get_scores(\"calc\", \"$1\")\\n'\n", - " f\"3. join(){END_OF_PLAN}\\n\"\n", - " \"###\\n\"\n", - " \"\\n\"\n", - ")\n", - "\n", - "planner = create_planner(\n", - " ChatOpenAI(model=\"gpt-3.5-turbo\"),\n", - " example_prompt=examples,\n", - " tools=[get_user_id, get_scores],\n", - ")" - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "id": "55fb0f99-4e59-4e5a-b687-a90bb4d06d39", - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "{1: {'idx': 1,\n", - " 'tool': StructuredTool(name='get_user_id', description='get_user_id(first_name: str, last_name: str) -> Optional[int] - Query the user IDs of everyone with the provided name.', args_schema=, func=),\n", - " 'args': {'first_name': 'Sam', 'last_name': 'Van Damm'},\n", - " 'dependencies': [],\n", - " 'thought': None},\n", - " 2: {'idx': 2,\n", - " 'tool': StructuredTool(name='get_user_id', description='get_user_id(first_name: str, last_name: str) -> Optional[int] - Query the user IDs of everyone with the provided name.', args_schema=, func=),\n", - " 'args': {'first_name': 'Will', 'last_name': 'Van Damm'},\n", - " 'dependencies': [],\n", - " 'thought': None},\n", - " 3: {'idx': 3,\n", - " 'tool': StructuredTool(name='get_scores', description='get_scores(class_name: str, user_id: int) -> Optional[str] - Query the class registry for grades of the provided user ID.', args_schema=, func=),\n", - " 'args': {'class_name': 'Calc BC', 'user_id': '$1'},\n", - " 'dependencies': [1],\n", - " 'thought': None},\n", - " 4: {'idx': 4,\n", - " 'tool': StructuredTool(name='get_scores', description='get_scores(class_name: str, user_id: int) -> Optional[str] - Query the class registry for grades of the provided user ID.', args_schema=, func=),\n", - " 'args': {'class_name': 'Calc BC', 'user_id': '$2'},\n", - " 'dependencies': [2],\n", - " 'thought': None},\n", - " 5: {'idx': 5,\n", - " 'tool': 'join',\n", - " 'args': (),\n", - " 'dependencies': [1, 2, 3, 4],\n", - " 'thought': None}}" - ] - }, - "execution_count": 3, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "tasks = planner.invoke(\n", - " {\"input\": \"What are the Calc BC grades for Sam and Will Van Damm?\"}\n", - ")\n", - "tasks" - ] - }, - { - "cell_type": "markdown", - "id": "5d0e795f-61ff-4553-9823-23e7624ca180", - "metadata": {}, - "source": [ - "## 2. Task Fetching Unit\n", - "\n", - "This component schedules the tasks. In the paper, it's kept separate from the \"executor\", but here we create a single DAG defined in LangChain expression language.\n", - "\n", - "The basic idea is that, given a list of dicts of the form:\n", - "\n", - "```typescript\n", - "{\n", - " tool: BaseTool,\n", - " dependencies: number[],\n", - "}\n", - "```\n", - "\n", - "1. Create a topological sort of the tasks\n", - "2. Execute them on the previous step's output, ensuring to perform variable substitution where appropriate\n", - "\n", - "If we make the assumption that the tasks generated by the LLM are already sorted, we could adapt this to execute in a purely streaming fashion." - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "id": "c70a0e28-43db-4ea2-af48-8a2f310dce83", - "metadata": {}, - "outputs": [], - "source": [ - "import functools\n", - "from typing import Any, Union\n", - "\n", - "from langchain_core.runnables import (\n", - " RunnableLambda,\n", - " RunnableParallel,\n", - " RunnablePassthrough,\n", - ")\n", - "\n", - "\n", - "def _sort_tasks(data):\n", - " if not data:\n", - " return []\n", - " sorted_tasks = []\n", - " # Remove tasks already completed\n", - " min_idx = min([int(k) for k in data])\n", - " data = {\n", - " int(k): {\n", - " **v,\n", - " \"dependencies\": [dep for dep in v[\"dependencies\"] if dep >= min_idx],\n", - " }\n", - " for k, v in data.items()\n", - " }\n", - " while data:\n", - " no_deps = {k: v for k, v in data.items() if not v[\"dependencies\"]}\n", - " if not no_deps:\n", - " raise ValueError(\"We seem to have run into a circular dependency.\")\n", - "\n", - " sorted_tasks.append(no_deps)\n", - " data = {\n", - " k: {\n", - " **v,\n", - " \"dependencies\": [d for d in v[\"dependencies\"] if d not in no_deps],\n", - " }\n", - " for k, v in data.items()\n", - " if k not in no_deps\n", - " }\n", - " return sorted_tasks\n", - "\n", - "\n", - "def _resolve_arg(x: dict, arg: Union[str, Any]):\n", - " if isinstance(arg, str) and arg.startswith(\"$\"):\n", - " try:\n", - " return x[f\"task_{arg[1:]}\"]\n", - " except:\n", - " if arg.endswith(\".output\"):\n", - " return x[f\"task_{arg[1:-7]}\"]\n", - " raise\n", - " else:\n", - " return arg\n", - "\n", - "\n", - "def _execute_task(x, task):\n", - " tool_to_use = task[\"tool\"]\n", - " args = task[\"args\"]\n", - " if isinstance(args, str):\n", - " resolved_args = _resolve_arg(x, args)\n", - " elif isinstance(args, dict):\n", - " resolved_args = {key: _resolve_arg(x, val) for key, val in args.items()}\n", - " else:\n", - " # This will likely fail\n", - " resolved_args = args\n", - " try:\n", - " return tool_to_use.invoke(resolved_args)\n", - " except Exception as e:\n", - " return (\n", - " f\"ERROR(Failed to call tool {tool_to_use} with args {tool_to_use}.\"\n", - " + f\" Args resolved to {resolved_args}. Error: {repr(e)})\"\n", - " )\n", - "\n", - "\n", - "def construct_dag(tasks):\n", - " sorted_tasks = _sort_tasks(tasks)\n", - " chain = None\n", - " for idx, task_group in enumerate(sorted_tasks):\n", - " if len(task_group) == 1 and next(iter(task_group.values()))[\"tool\"] == \"join\":\n", - " step = lambda x: {\"join\": x}\n", - " else:\n", - " # Cascade all results forward\n", - " constructor = (\n", - " RunnableParallel if chain is None else RunnablePassthrough.assign\n", - " )\n", - " task_dict = {}\n", - " for idx, task in task_group.items():\n", - " task_dict[f\"task_{idx}\"] = RunnableLambda(\n", - " functools.partial(_execute_task, task=task)\n", - " ).with_config(run_name=f\"task_{idx}\")\n", - "\n", - " step = constructor(**task_dict).with_config(run_name=f\"TaskGroup{idx}\")\n", - " if chain is None:\n", - " chain = step\n", - " else:\n", - " chain |= step\n", - "\n", - " if chain is not None:\n", - " return chain | RunnablePassthrough.assign(tasks=lambda _: tasks)\n", - " return chain" - ] - }, - { - "cell_type": "code", - "execution_count": 5, - "id": "87f11cea-3a8d-479c-8a9e-81223dbbc1f5", - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - " +------------------------------+ \n", - " | ParallelInput | \n", - " +------------------------------+ \n", - " *** *** \n", - " ** ** \n", - " ** ** \n", - " +-------------+ +-------------+ \n", - " | Lambda(...) | | Lambda(...) | \n", - " +-------------+ +-------------+ \n", - " *** *** \n", - " ** ** \n", - " ** ** \n", - " +-------------------------------+ \n", - " | ParallelOutput | \n", - " +-------------------------------+ \n", - " * \n", - " * \n", - " * \n", - " +------------------------------+ \n", - " | ParallelInput | \n", - " +------------------------------+ \n", - " ***** * ***** \n", - " ***** * ***** \n", - " *** * *** \n", - "+-------------+ +-------------+ +-------------+ \n", - "| Lambda(...) | | Lambda(...) | | Passthrough | \n", - "+-------------+***** +-------------+ *****+-------------+ \n", - " ***** * ***** \n", - " ***** * ***** \n", - " *** * *** \n", - " +-------------------------------+ \n", - " | ParallelOutput | \n", - " +-------------------------------+ \n", - " * \n", - " * \n", - " * \n", - " +-------------------------------+ \n", - " | Lambda(lambda x: {'join': x}) | \n", - " +-------------------------------+ \n", - " * \n", - " * \n", - " * \n", - " +----------------------+ \n", - " | ParallelInput | \n", - " +----------------------+ \n", - " *** *** \n", - " *** *** \n", - " ** ** \n", - " +-------------------------+ +-------------+ \n", - " | Lambda(lambda _: tasks) | | Passthrough | \n", - " +-------------------------+ +-------------+ \n", - " *** *** \n", - " *** *** \n", - " ** ** \n", - " +-----------------------+ \n", - " | ParallelOutput | \n", - " +-----------------------+ \n" - ] - } - ], - "source": [ - "graph = construct_dag(tasks)\n", - "graph.get_graph().print_ascii()" - ] - }, - { - "cell_type": "markdown", - "id": "9efa15ae-817a-48c6-86ed-16bc112fedc5", - "metadata": {}, - "source": [ - "#### Example Plan\n", - "\n", - "We still haven't introduced any cycles in our computation graph, so this is all easily expressed in LCEL." - ] - }, - { - "cell_type": "code", - "execution_count": 6, - "id": "133d124a-0d41-4c6d-a86a-34fa4cb1430f", - "metadata": {}, - "outputs": [], - "source": [ - "chain = planner | construct_dag" - ] - }, - { - "cell_type": "code", - "execution_count": 7, - "id": "55142257-2674-4a47-988e-0d2810917329", - "metadata": {}, - "outputs": [], - "source": [ - "example_question = \"Did Sam Van Damm score higher than Eric Zhang in Geology?\"\n", - "task_results = chain.invoke({\"input\": example_question})\n", - "# task_results[\"join\"]" - ] - }, - { - "cell_type": "code", - "execution_count": 8, - "id": "9996d98f-0e73-471f-baa8-d8b72d10c7cf", - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "{'join': {'task_1': 8523,\n", - " 'task_2': 1432,\n", - " 'task_3': \"ERROR(Failed to call tool name='get_scores' description='get_scores(class_name: str, user_id: int) -> Optional[str] - Query the class registry for grades of the provided user ID.' args_schema= func= with args name='get_scores' description='get_scores(class_name: str, user_id: int) -> Optional[str] - Query the class registry for grades of the provided user ID.' args_schema= func=. Args resolved to {}. Error: ValidationError(model='get_scoresSchemaSchema', errors=[{'loc': ('class_name',), 'msg': 'field required', 'type': 'value_error.missing'}, {'loc': ('user_id',), 'msg': 'field required', 'type': 'value_error.missing'}]))\",\n", - " 'task_4': \"ERROR(Failed to call tool name='get_scores' description='get_scores(class_name: str, user_id: int) -> Optional[str] - Query the class registry for grades of the provided user ID.' args_schema= func= with args name='get_scores' description='get_scores(class_name: str, user_id: int) -> Optional[str] - Query the class registry for grades of the provided user ID.' args_schema= func=. Args resolved to {}. Error: ValidationError(model='get_scoresSchemaSchema', errors=[{'loc': ('class_name',), 'msg': 'field required', 'type': 'value_error.missing'}, {'loc': ('user_id',), 'msg': 'field required', 'type': 'value_error.missing'}]))\"},\n", - " 'tasks': {1: {'idx': 1,\n", - " 'tool': StructuredTool(name='get_user_id', description='get_user_id(first_name: str, last_name: str) -> Optional[int] - Query the user IDs of everyone with the provided name.', args_schema=, func=),\n", - " 'args': {'first_name': 'Sam', 'last_name': 'Van Damm'},\n", - " 'dependencies': [],\n", - " 'thought': None},\n", - " 2: {'idx': 2,\n", - " 'tool': StructuredTool(name='get_user_id', description='get_user_id(first_name: str, last_name: str) -> Optional[int] - Query the user IDs of everyone with the provided name.', args_schema=, func=),\n", - " 'args': {'first_name': 'Eric', 'last_name': 'Zhang'},\n", - " 'dependencies': [],\n", - " 'thought': None},\n", - " 3: {'idx': 3,\n", - " 'tool': StructuredTool(name='get_scores', description='get_scores(class_name: str, user_id: int) -> Optional[str] - Query the class registry for grades of the provided user ID.', args_schema=, func=),\n", - " 'args': {},\n", - " 'dependencies': [],\n", - " 'thought': None},\n", - " 4: {'idx': 4,\n", - " 'tool': StructuredTool(name='get_scores', description='get_scores(class_name: str, user_id: int) -> Optional[str] - Query the class registry for grades of the provided user ID.', args_schema=, func=),\n", - " 'args': {},\n", - " 'dependencies': [],\n", - " 'thought': None},\n", - " 5: {'idx': 5,\n", - " 'tool': 'join',\n", - " 'args': (),\n", - " 'dependencies': [1, 2, 3, 4],\n", - " 'thought': None}}}" - ] - }, - "execution_count": 8, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "task_results" - ] - }, - { - "cell_type": "markdown", - "id": "563d5311-55f0-4ca1-afbd-01fd970cf3e3", - "metadata": {}, - "source": [ - "## 3. \"Joiner\" \n", - "\n", - "So now we have the planning and initial execution done. We need a component to process these outputs and either:\n", - "\n", - "1. Respond with the correct answer.\n", - "2. Loop with a new plan.\n", - "\n", - "The paper refers to this as the \"joiner\". It's another LLM call, defined below:" - ] - }, - { - "cell_type": "code", - "execution_count": 9, - "id": "2978991e-45a4-44e6-9deb-f941f44fe93a", - "metadata": {}, - "outputs": [], - "source": [ - "from langchain_core.output_parsers import StrOutputParser\n", - "from typing_extensions import TypedDict\n", - "\n", - "\n", - "def format_task(task, idx):\n", - " tool = task[\"tool\"]\n", - " tool_name = tool if isinstance(tool, str) else tool.name # Handle join()\n", - " args = \", \".join([f\"{k}={v}\" for k, v in task[\"args\"].items()])\n", - " return f\"{idx}. {tool_name}({args})\"\n", - "\n", - "\n", - "def format_tasks(executor_output: dict):\n", - " tasks = executor_output[\"tasks\"]\n", - " prior_observations = executor_output.get(\"observations\")\n", - " joined_output = executor_output[\"join\"]\n", - " execution_results = []\n", - " for idx, task in tasks.items():\n", - " observation_idx = f\"task_{idx}\"\n", - " if observation_idx in joined_output:\n", - " observation = joined_output[observation_idx]\n", - " execution_results.append(f\"{format_task(task, idx)}\\n\\t=> {observation}\")\n", - " joined_results = \"\\n\".join(execution_results)\n", - " result = f\"Executed plan results:\\n{joined_results}\"\n", - " if prior_observations:\n", - " result += f\"\\nPrevious Results:\\n{prior_observations}\"\n", - " return result\n", - "\n", - "\n", - "def _parse_joiner_output(raw_answer: str) -> str:\n", - " thought, answer, is_replan = \"\", \"\", False # default values\n", - " raw_answers = raw_answer.split(\"\\n\")\n", - " for ans in raw_answers:\n", - " if ans.startswith(\"Action:\"):\n", - " answer = ans[ans.find(\"(\") + 1 : ans.find(\")\")]\n", - " is_replan = JOINER_REPLAN in ans\n", - " elif ans.startswith(\"Thought:\"):\n", - " thought = ans.split(\"Thought:\")[1].strip()\n", - " if is_replan:\n", - " return {\"thought\": thought, \"context\": answer}\n", - " else:\n", - " return {\"thought\": thought, \"answer\": answer}" - ] - }, - { - "cell_type": "code", - "execution_count": 10, - "id": "b2feea5a-e0e4-4cff-8cb5-fdbfec95ba57", - "metadata": {}, - "outputs": [], - "source": [ - "from langchain_core.prompts import ChatPromptTemplate\n", - "\n", - "\n", - "def create_joiner(prompt, llm):\n", - " return (\n", - " (\n", - " lambda x: {\n", - " **x[\"plan\"],\n", - " \"input\": x[\"input\"],\n", - " \"context\": x.get(\"context\"),\n", - " \"observations\": x.get(\"observations\"),\n", - " }\n", - " )\n", - " | RunnablePassthrough.assign(scratchpad=format_tasks)\n", - " | ChatPromptTemplate.from_messages([(\"system\", prompt), (\"user\", \"{input}\")])\n", - " | llm\n", - " | StrOutputParser()\n", - " | _parse_joiner_output\n", - " )" - ] - }, - { - "cell_type": "code", - "execution_count": 11, - "id": "942dab42-ad42-4ba2-90d5-49edbe4fae68", - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "{'thought': 'The initial plan failed to get the scores for Sam Van Damm and Eric Zhang in Geology. In order to provide a final answer, I need these scores.',\n", - " 'context': \"We need to execute get_scores with class_name set to 'Geology' and user_id set to the respective IDs for Sam Van Damm (8523\"}" - ] - }, - "execution_count": 11, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "JOINER_FINISH = \"Finish\"\n", - "JOINER_REPLAN = \"Replan\"\n", - "\n", - "system_prompt = (\n", - " \"Solve a question answering task. Here are some guidelines:\\n\"\n", - " \" - In the Assistant Scratchpad, you will be given results of a plan you have executed to answer the user's question.\\n\"\n", - " \" - Thought needs to reason about the question based on the Observations in 1-2 sentences.\\n\"\n", - " \" - Ignore irrelevant action results.\\n\"\n", - " \" - If the required information is present, give a concise but complete and helpful answer to the user's question.\\n\"\n", - " \" - If you are unable to give a satisfactory finishing answer, replan to get the required information.\"\n", - " \" Respond in the following format:\\n\\n\"\n", - " \"Thought: \\n\"\n", - " \"Action: \\n\"\n", - " \"Available actions:\\n\"\n", - " f\" (1) {JOINER_FINISH}(the final answer to return to the user): returns the answer and finishes the task.\\n\"\n", - " f\" (2) {JOINER_REPLAN}(the reasoning and other information that will help you plan again. Can be a line of any length): instructs why we must replan\\n\\n\"\n", - " \" Examples:\\n\"\n", - " \"Question: How many users are currently using the new product?\\n\"\n", - " \"...task returns the number 32,000\\n\"\n", - " \"Thought: I find no issue with the original plan, and the results satisfy everything in the user question.\\n\"\n", - " f\"Action: {JOINER_FINISH}(32,000 users currently use the new product)\\n###\\n\"\n", - " \"Question: How much cooler is it in NY than SF?\\n\"\n", - " \"...task results show SF is 57 degrees fahrenheit today, and they show in NY it has a high of 32 degrees fahrenheit \\n\"\n", - " \"Thought: I can answer by synthesizing the results.\\n\"\n", - " f\"Action: {JOINER_FINISH}(NY is 25 degrees cooler than SF today, as it has a high of 32 degrees Fahrenheit today, whereas in SF, it is 57 degrees Fahrenheit.)\\n###\\n\"\n", - " \"Question: Are the gophers beating the rabbits??\\n\"\n", - " \"...task returns the a score of 7 for rabbits but no other value...\\n\"\n", - " \"Thought: I need the gophers' score to make a final decision.\\n\"\n", - " f\"Action: {JOINER_REPLAN}(The rabbits have a score of 7, but I need the gophers' score.)\"\n", - " \"\\n\\nAssistant Scratchpad:\\n{scratchpad}\"\n", - ")\n", - "\n", - "\n", - "joiner = create_joiner(system_prompt, ChatOpenAI(model=\"gpt-4\"))\n", - "joiner.invoke({\"plan\": task_results, \"input\": example_question})" - ] - }, - { - "cell_type": "markdown", - "id": "b099e5ee-2c23-47d9-9387-0f64e02627d3", - "metadata": {}, - "source": [ - "## Compose using LangGraph\n", - "\n", - "Now we have all the required pieces! Let's construct an LLMCompiler agent. We'll give it a search engine (Tavily) and a simple \"calculate\" function." - ] - }, - { - "cell_type": "code", - "execution_count": 12, - "id": "565b08d2-d19c-4125-97f7-996fc01bc631", - "metadata": {}, - "outputs": [], - "source": [ - "os.environ[\"TAVILY_API_KEY\"] = (\n", - " os.environ.get(\"TAVILY_API_KEY\")\n", - " if \"TAVILY_API_KEY\" in os.environ\n", - " else getpass.getpass(\"Tavily API Key:\")\n", - ")" - ] - }, - { - "cell_type": "code", - "execution_count": 13, - "id": "bd84ca4b-eacb-471d-9975-5449047b5bed", - "metadata": {}, - "outputs": [], - "source": [ - "from operator import add, mul, sub, truediv\n", - "from typing import Literal\n", - "\n", - "from langchain_community.agent_toolkits import GmailToolkit\n", - "from langchain_community.tools.tavily_search import TavilySearchResults\n", - "from langchain_core.tools import tool\n", - "\n", - "\n", - "@tool\n", - "def calculate(\n", - " arg1: float,\n", - " arg2: float,\n", - " op: Union[Literal[\"+\"], Literal[\"-\"], Literal[\"*\"], Literal[\"/\"]],\n", - "):\n", - " \"\"\"Calculate a mathematical operation on two arguments.\"\"\"\n", - " resolved_op = {\"+\": add, \"-\": sub, \"*\": mul, \"/\": truediv}\n", - " return resolved_op[op](arg1, arg2)\n", - "\n", - "\n", - "tools = [TavilySearchResults(max_results=1), calculate]" - ] - }, - { - "cell_type": "code", - "execution_count": 14, - "id": "70566dff-d66e-4c8c-aed3-980522d175c2", - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "4.0" - ] - }, - "execution_count": 14, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "calculate.invoke(dict(arg1=1, arg2=3, op=\"+\"))" - ] - }, - { - "cell_type": "markdown", - "id": "0ad5d62b-5898-4b9f-808f-c03620c2fe7a", - "metadata": {}, - "source": [ - "#### Defining the stateful graph\n", - "\n", - "We'll define the agent as a stateful graph, with the main nodes being:\n", - "\n", - "1. Plan and execute (the DAG from the first step above)\n", - "2. Join: determine if we should finish or replan\n", - "3. Recontextualize: update the graph state based on the output from the joiner\n" - ] - }, - { - "cell_type": "code", - "execution_count": 16, - "id": "c5869ec6-b07f-4fb0-92a7-e6521f0c0bdd", - "metadata": {}, - "outputs": [], - "source": [ - "from typing import Dict\n", - "\n", - "MAX_ITERATIONS = 5\n", - "\n", - "\n", - "class GraphState(TypedDict):\n", - " input: str\n", - " plan: Dict\n", - " agent_output: Dict\n", - " observations: Dict\n", - " num_iterations: int # Maximum\n", - " context: str # Exra commentary for the joiner\n", - " stop_reason: str\n", - "\n", - "\n", - "def recontextualize(state):\n", - " # Insert a context string for the re-planner.\n", - " # This could alternatively call an LLM to provide additional logic\n", - " context = state[\"agent_output\"][\"context\"]\n", - " num_iterations = int(state.get(\"num_iterations\") or 1) + 1\n", - " formatted_tasks = format_tasks(state[\"plan\"])\n", - " context_str = f\"\\n\\nPrevious Plan:\\n{formatted_tasks}\\n\" f\"{context}\"\n", - " observations = state[\"observations\"] or {}\n", - " for task, observation in state[\"plan\"][\"join\"].items():\n", - " observations[task] = observation\n", - " return {\n", - " \"context\": context_str,\n", - " \"num_iterations\": num_iterations,\n", - " \"observations\": observations,\n", - " }\n", - "\n", - "\n", - "def add_stop_reason(state: GraphState):\n", - " # Helpful for letting the user know why the agent responded the way it did\n", - " num_iterations = int(state.get(\"num_iterations\") or 0)\n", - " if num_iterations >= MAX_ITERATIONS:\n", - " return {\"stop_reason\": \"end_max_iter\"}\n", - " if state[\"agent_output\"].get(\"answer\"):\n", - " return {\"stop_reason\": \"answer\"}\n", - " return {\"stop_reason\": None}" - ] - }, - { - "cell_type": "code", - "execution_count": 17, - "id": "768b5f11-e3d2-47be-8143-a7dcd8765243", - "metadata": {}, - "outputs": [], - "source": [ - "import json\n", - "\n", - "from langchain_core.tools import BaseTool\n", - "from langgraph.graph import END, StateGraph\n", - "\n", - "workflow = StateGraph(GraphState)\n", - "\n", - "# 1. Define vertices\n", - "\n", - "planner = create_planner(\n", - " llm=ChatOpenAI(model=\"gpt-4-1106-preview\"),\n", - " # Add more examples to improve reliability\n", - " example_prompt=(\n", - " \"Question: What's the capital of Myanmar?\\n\"\n", - " '1. tavily_search_results_json(query=\"Capital of Myanmar)\\n'\n", - " f\"2. join(){END_OF_PLAN}\\n\"\n", - " \"###\\n\"\n", - " \"\\n\"\n", - " ),\n", - " tools=tools,\n", - ")\n", - "\n", - "plan_and_execute = planner | construct_dag\n", - "joiner = create_joiner(system_prompt, ChatOpenAI(model=\"gpt-4-1106-preview\"))\n", - "\n", - "\n", - "# Assign each node to a state variable to update\n", - "workflow.add_node(\"plan_and_execute\", RunnablePassthrough.assign(plan=plan_and_execute))\n", - "workflow.add_node(\"join\", RunnablePassthrough.assign(agent_output=joiner))\n", - "workflow.add_node(\"recontextualize\", recontextualize)\n", - "workflow.add_node(\"provide_stop_reason\", add_stop_reason)\n", - "\n", - "\n", - "## Define edges\n", - "\n", - "workflow.add_edge(\"plan_and_execute\", \"join\")\n", - "workflow.add_edge(\"recontextualize\", \"plan_and_execute\")\n", - "workflow.add_edge(\"join\", \"provide_stop_reason\")\n", - "\n", - "### This condition determines looping logic\n", - "\n", - "\n", - "def should_continue(state):\n", - " if state[\"stop_reason\"] is None:\n", - " return \"continue\"\n", - " return \"end\"\n", - "\n", - "\n", - "workflow.add_conditional_edges(\n", - " start_key=\"provide_stop_reason\",\n", - " # Next, we pass in the function that will determine which node is called next.\n", - " condition=should_continue,\n", - " conditional_edge_mapping={\n", - " # If it generates context, we must replan\n", - " \"continue\": \"recontextualize\",\n", - " # Otherwise we finish.\n", - " \"end\": END,\n", - " },\n", - ")\n", - "workflow.set_entry_point(\"plan_and_execute\")\n", - "chain = workflow.compile()" - ] - }, - { - "cell_type": "markdown", - "id": "9f8c9849-8531-463d-a0ef-dcc3d9888b2d", - "metadata": {}, - "source": [ - "## Simple question\n", - "\n", - "Let's ask a simple question of the agent." - ] - }, - { - "cell_type": "code", - "execution_count": 18, - "id": "5bc4584a-e31c-4065-805e-76a6db30676a", - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "In 2022, the real GDP of New York was about 1.56 trillion U.S. dollars.\n" - ] - } - ], - "source": [ - "result = chain.invoke({\"input\": \"What's the GDP of New York?\"})\n", - "print(result[\"agent_output\"][\"answer\"])" - ] - }, - { - "cell_type": "markdown", - "id": "33c65ef5-b4b2-4ab2-8c78-a551da7819b9", - "metadata": {}, - "source": [ - "## Multi-hop question" - ] - }, - { - "cell_type": "code", - "execution_count": 21, - "id": "0b3a0916-d8ca-4092-b91c-d9e2b05259d8", - "metadata": {}, - "outputs": [], - "source": [ - "result = chain.invoke(\n", - " {\n", - " \"input\": \"What's the oldest parrot alive, and how much longer is that than the average?\"\n", - " },\n", - " {\n", - " \"recursion_limit\": 100,\n", - " },\n", - ")" - ] - }, - { - "cell_type": "code", - "execution_count": 22, - "id": "6c65c414-7668-4fdf-ba97-f42f659b1317", - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Cookie, a cockatoo, was the oldest parrot alive, having reached the age of 83, which is 23 years longer than the maximum average lifespan of a cockatoo in captivity, which is 60 years.\n" - ] - } - ], - "source": [ - "print(result[\"agent_output\"][\"answer\"])" - ] - }, - { - "cell_type": "markdown", - "id": "1b859bc7-1a85-4d35-b57b-f67c87282403", - "metadata": {}, - "source": [ - "## Streaming" - ] - }, - { - "cell_type": "code", - "execution_count": 25, - "id": "38d3ea91-59ba-4267-8060-ed75bbc840c6", - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Step: {'plan_and...\n", - "Step: {'join': {...\n", - "Step: {'provide_...\n", - "Step: {'recontex...\n", - "Step: {'plan_and...\n", - "Step: {'join': {...\n", - "Step: {'provide_...\n", - "Step: {'__end__'...\n", - "3307.0\n" - ] - } - ], - "source": [ - "last_step = None\n", - "for step in chain.stream({\"input\": \"What's ((3*(4+5)/0.5)+3245) + 8?\"}):\n", - " print(\"Step: \", str(step)[:10] + \"...\")\n", - " last_step = step\n", - "print(\"***\")\n", - "print(last_step[\"__end__\"][\"agent_output\"][\"answer\"])" - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 3 (ipykernel)", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.11.2" - } - }, - "nbformat": 4, - "nbformat_minor": 5 -} diff --git a/examples/advanced_agents/llm_compiler/img/diagram.png b/examples/advanced_agents/llm_compiler/img/diagram.png deleted file mode 100644 index 01655a5ec4d11637ee426679e46d68773d6e2832..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 253693 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 Cb+mZ^ diff --git a/examples/advanced_agents/llm_compiler/output_parser.py b/examples/advanced_agents/llm_compiler/output_parser.py deleted file mode 100644 index e8590bb17..000000000 --- a/examples/advanced_agents/llm_compiler/output_parser.py +++ /dev/null @@ -1,154 +0,0 @@ -import re -from typing import Any, Dict, Iterator, List, Optional, Sequence, Tuple, Union -import ast - -from langchain_core.exceptions import OutputParserException -from langchain_core.messages import BaseMessage -from langchain_core.output_parsers import BaseOutputParser -from langchain_core.tools import BaseTool - -THOUGHT_PATTERN = r"Thought: ([^\n]*)" -ACTION_PATTERN = r"\n*(\d+)\. (\w+)\((.*)\)(\s*#\w+\n)?" -# $1 or ${1} -> 1 -ID_PATTERN = r"\$\{?(\d+)\}?" -END_OF_PLAN = "" - - -### Helper functions - - -def _ast_parse(arg: str) -> Any: - try: - return ast.literal_eval(arg) - except: # noqa - return arg - - -def _parse_llm_compiler_action_args(args: str, tool: Union[str, BaseTool]) -> list[Any]: - """Parse arguments from a string.""" - if args == "": - return () - if isinstance(tool, str): - return () - extracted_args = {} - tool_key = None - prev_idx = None - for key in tool.args.keys(): - # Split if present - if f"{key}=" in args: - idx = args.index(f"{key}=") - if prev_idx is not None: - # print(tool_key, flush=True) - # breakpoint() - extracted_args[tool_key] = _ast_parse( - args[prev_idx:idx].strip().rstrip(",") - ) - args = args.split(f"{key}=", 1)[1] - tool_key = key - prev_idx = 0 - if prev_idx is not None: - extracted_args[tool_key] = _ast_parse( - args[prev_idx:].strip().rstrip(",").rstrip(")") - ) - return extracted_args - - -def default_dependency_rule(idx, args: str): - matches = re.findall(ID_PATTERN, args) - numbers = [int(match) for match in matches] - return idx in numbers - - -def _get_dependencies_from_graph( - idx: int, tool_name: str, args: Dict[str, Any] -) -> dict[str, list[str]]: - """Get dependencies from a graph.""" - if tool_name == "join": - return list(range(1, idx)) - return [i for i in range(1, idx) if default_dependency_rule(i, str(args))] - - -def instantiate_task( - tools: Sequence[BaseTool], - idx: int, - tool_name: str, - args: Union[str, Any], - thought: Optional[str] = None, -) -> dict: - if tool_name == "join": - tool = "join" - else: - try: - tool = tools[[tool.name for tool in tools].index(tool_name)] - except ValueError as e: - raise OutputParserException(f"Tool {tool_name} not found.") from e - tool_args = _parse_llm_compiler_action_args(args, tool) - dependencies = _get_dependencies_from_graph(idx, tool_name, tool_args) - - return dict( - idx=idx, - tool=tool, - args=tool_args, - dependencies=dependencies, - thought=thought, - ) - - -class LLMCompilerPlanParser(BaseOutputParser[dict], extra="allow"): - """Planning output parser.""" - - tools: List[BaseTool] - - def _transform(self, input: Iterator[Union[str, BaseMessage]]) -> Iterator[dict]: - texts = [] - thought = None - for chunk in input: - # Assume input is str. TODO: support vision/other formats - text = chunk if isinstance(chunk, str) else str(chunk.content) - for task, thought in self.ingest_token(text, texts, thought): - yield {task["idx"]: task} - # Final possible task - if texts: - task, _ = self._parse_task("".join(texts), thought) - if task: - yield {task["idx"]: task} - - def parse(self, text: str): - task_dict = {} - for task in self._transform([text]): - task_dict.update(task) - return task_dict - - def ingest_token( - self, token: str, buffer: List[str], thought: Optional[str] - ) -> Iterator[Tuple[Optional[dict], str]]: - buffer.append(token) - if "\n" in token: - buffer_ = "".join(buffer).split("\n") - suffix = buffer_[-1] - for line in buffer_[:-1]: - task, thought = self._parse_task(line, thought) - if task: - yield task, thought - buffer.clear() - buffer.append(suffix) - - def _parse_task(self, line: str, thought: Optional[str] = None): - task = None - if match := re.match(THOUGHT_PATTERN, line): - # Optionally, action can be preceded by a thought - thought = match.group(1) - elif match := re.match(ACTION_PATTERN, line): - # if action is parsed, return the task, and clear the buffer - idx, tool_name, args, _ = match.groups() - idx = int(idx) - task = instantiate_task( - tools=self.tools, - idx=idx, - tool_name=tool_name, - args=args, - thought=thought, - ) - thought = None - # Else it is just dropped - return task, thought From c26a8675c39ad537c5edfb202fdf73ecc412bd26 Mon Sep 17 00:00:00 2001 From: William Fu-Hinthorn <13333726+hinthornw@users.noreply.github.com> Date: Fri, 9 Feb 2024 16:05:51 -0800 Subject: [PATCH 13/18] rename --- .../llm_compiler => llm-compiler}/LLMCompiler.ipynb | 0 .../llm_compiler => llm-compiler}/__init__.py | 0 .../llm_compiler => llm-compiler}/ast_parser.py | 0 .../llm_compiler => llm-compiler}/img/diagram.png | Bin .../llm_compiler => llm-compiler}/math_tools.py | 0 .../llm_compiler => llm-compiler}/output_parser.py | 0 6 files changed, 0 insertions(+), 0 deletions(-) rename examples/{plan-and-execute/llm_compiler => llm-compiler}/LLMCompiler.ipynb (100%) rename examples/{plan-and-execute/llm_compiler => llm-compiler}/__init__.py (100%) rename examples/{plan-and-execute/llm_compiler => llm-compiler}/ast_parser.py (100%) rename examples/{plan-and-execute/llm_compiler => llm-compiler}/img/diagram.png (100%) rename examples/{plan-and-execute/llm_compiler => llm-compiler}/math_tools.py (100%) rename examples/{plan-and-execute/llm_compiler => llm-compiler}/output_parser.py (100%) diff --git a/examples/plan-and-execute/llm_compiler/LLMCompiler.ipynb b/examples/llm-compiler/LLMCompiler.ipynb similarity index 100% rename from examples/plan-and-execute/llm_compiler/LLMCompiler.ipynb rename to examples/llm-compiler/LLMCompiler.ipynb diff --git a/examples/plan-and-execute/llm_compiler/__init__.py b/examples/llm-compiler/__init__.py similarity index 100% rename from examples/plan-and-execute/llm_compiler/__init__.py rename to examples/llm-compiler/__init__.py diff --git a/examples/plan-and-execute/llm_compiler/ast_parser.py b/examples/llm-compiler/ast_parser.py similarity index 100% rename from examples/plan-and-execute/llm_compiler/ast_parser.py rename to examples/llm-compiler/ast_parser.py diff --git a/examples/plan-and-execute/llm_compiler/img/diagram.png b/examples/llm-compiler/img/diagram.png similarity index 100% rename from examples/plan-and-execute/llm_compiler/img/diagram.png rename to examples/llm-compiler/img/diagram.png diff --git a/examples/plan-and-execute/llm_compiler/math_tools.py b/examples/llm-compiler/math_tools.py similarity index 100% rename from examples/plan-and-execute/llm_compiler/math_tools.py rename to examples/llm-compiler/math_tools.py diff --git a/examples/plan-and-execute/llm_compiler/output_parser.py b/examples/llm-compiler/output_parser.py similarity index 100% rename from examples/plan-and-execute/llm_compiler/output_parser.py rename to examples/llm-compiler/output_parser.py From 61a854aabc12fa1af9161eaacbbd59d926da26f7 Mon Sep 17 00:00:00 2001 From: William Fu-Hinthorn <13333726+hinthornw@users.noreply.github.com> Date: Fri, 9 Feb 2024 16:07:23 -0800 Subject: [PATCH 14/18] format --- examples/llm-compiler/math_tools.py | 1 - examples/llm-compiler/output_parser.py | 2 +- 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/examples/llm-compiler/math_tools.py b/examples/llm-compiler/math_tools.py index 31b3cf65c..74e7a0736 100644 --- a/examples/llm-compiler/math_tools.py +++ b/examples/llm-compiler/math_tools.py @@ -107,7 +107,6 @@ def _evaluate_expression(expression: str) -> str: def get_math_tool(llm: ChatOpenAI): - prompt = ChatPromptTemplate.from_messages( [ ("system", _SYSTEM_PROMPT), diff --git a/examples/llm-compiler/output_parser.py b/examples/llm-compiler/output_parser.py index daba5bb06..02ea60284 100644 --- a/examples/llm-compiler/output_parser.py +++ b/examples/llm-compiler/output_parser.py @@ -14,8 +14,8 @@ from typing import ( from langchain_core.exceptions import OutputParserException from langchain_core.messages import BaseMessage from langchain_core.output_parsers.transform import BaseTransformOutputParser -from langchain_core.tools import BaseTool from langchain_core.runnables import RunnableConfig +from langchain_core.tools import BaseTool from typing_extensions import TypedDict THOUGHT_PATTERN = r"Thought: ([^\n]*)" From a319cbf521fff440773b212fba26897707b883ae Mon Sep 17 00:00:00 2001 From: William Fu-Hinthorn <13333726+hinthornw@users.noreply.github.com> Date: Fri, 9 Feb 2024 16:08:18 -0800 Subject: [PATCH 15/18] rm file --- examples/llm-compiler/ast_parser.py | 37 ----------------------------- 1 file changed, 37 deletions(-) delete mode 100644 examples/llm-compiler/ast_parser.py diff --git a/examples/llm-compiler/ast_parser.py b/examples/llm-compiler/ast_parser.py deleted file mode 100644 index 1f7f0c9ae..000000000 --- a/examples/llm-compiler/ast_parser.py +++ /dev/null @@ -1,37 +0,0 @@ -import ast -import re -from typing import Dict, Union - - -def get_args(s: str) -> Dict[str, Union[str, bool, int, list, dict, None]]: - # Extract the argument string - args_str = re.search(r"\((.*?)\)", s).group(1) - - # Split the arguments on comma, considering nested structures - args = re.split(r",(?![^[]*\]|[^(]*\))", args_str) - - # Create a dictionary from the split arguments - args_dict = {} - for arg in args: - key, value = arg.split("=", 1) - key = key.strip() - value = ast.literal_eval(value.strip()) - args_dict[key] = value - - return args_dict - - -if __name__ == "__main__": - # Should work on all these cases: - signatures = [ - 'func(a="foo", b=1, c=None, d=[1, 2, 3], e={"a": 1, "b": 2})', - 'another_func(idk={"nesting": {\'is\': ["fun", "right?"]}})', - 'once_more(a="How do you know that a = b?")', - ] - expected = [ - {"a": "foo", "b": 1, "c": None, "d": [1, 2, 3], "e": {"a": 1, "b": 2}}, - {"idk": {"nesting": {"is": ["fun", "right?"]}}}, - {"a": "How do you know that a = b?"}, - ] - for i, s in enumerate(signatures): - assert get_args(s) == expected[i] From f1523f3e8dc35bed5128187456379cee6524afe4 Mon Sep 17 00:00:00 2001 From: Nuno Campos Date: Sat, 10 Feb 2024 11:39:38 -0800 Subject: [PATCH 16/18] Add interrupt_after arg to .compile() --- langgraph/graph/graph.py | 12 ++++++++---- langgraph/graph/state.py | 12 ++++++++---- 2 files changed, 16 insertions(+), 8 deletions(-) diff --git a/langgraph/graph/graph.py b/langgraph/graph/graph.py index f3fa36085..cfc1401f8 100644 --- a/langgraph/graph/graph.py +++ b/langgraph/graph/graph.py @@ -123,8 +123,11 @@ class Graph: self, checkpointer: Optional[BaseCheckpointSaver] = None, interrupt_before: Optional[Sequence[str]] = None, + interrupt_after: Optional[Sequence[str]] = None, ) -> Pregel: - self.validate(interrupt=interrupt_before) + interrupt_before = interrupt_before or [] + interrupt_after = interrupt_after or [] + self.validate(interrupt=interrupt_before + interrupt_after) outgoing_edges = defaultdict(list) for start, end in self.edges: @@ -154,7 +157,8 @@ class Graph: output=END, hidden=[f"{node}:inbox" for node in self.nodes], checkpointer=checkpointer, - interrupt=[f"{node}:inbox" for node in interrupt_before] - if interrupt_before - else [], + interrupt=( + [f"{node}:inbox" for node in interrupt_before] + + [node for node in interrupt_after] + ), ) diff --git a/langgraph/graph/state.py b/langgraph/graph/state.py index fcfab0425..f011652d6 100644 --- a/langgraph/graph/state.py +++ b/langgraph/graph/state.py @@ -38,8 +38,11 @@ class StateGraph(Graph): self, checkpointer: Optional[BaseCheckpointSaver] = None, interrupt_before: Optional[Sequence[str]] = None, + interrupt_after: Optional[Sequence[str]] = None, ) -> Pregel: - self.validate(interrupt=interrupt_before) + interrupt_before = interrupt_before or [] + interrupt_after = interrupt_after or [] + self.validate(interrupt=interrupt_before + interrupt_after) state_keys = list(self.channels) state_keys_read = state_keys[0] if state_keys == ["__root__"] else state_keys @@ -102,9 +105,10 @@ class StateGraph(Graph): output=END, hidden=[f"{node}:inbox" for node in self.nodes] + [START] + state_keys, checkpointer=checkpointer, - interrupt=[f"{node}:inbox" for node in interrupt_before] - if interrupt_before - else [], + interrupt=( + [f"{node}:inbox" for node in interrupt_before] + + [node for node in interrupt_after] + ), ) From 29edaaead8401f8a48e7d4d3a892c9e67ada3f38 Mon Sep 17 00:00:00 2001 From: Nuno Campos Date: Sat, 10 Feb 2024 13:39:46 -0800 Subject: [PATCH 17/18] Warn if graph is mutated after being compiled --- langgraph/graph/graph.py | 26 ++++++++++++++++++++++++++ 1 file changed, 26 insertions(+) diff --git a/langgraph/graph/graph.py b/langgraph/graph/graph.py index cfc1401f8..22e075575 100644 --- a/langgraph/graph/graph.py +++ b/langgraph/graph/graph.py @@ -1,3 +1,4 @@ +import logging from asyncio import iscoroutinefunction from collections import defaultdict from typing import Any, Callable, Dict, NamedTuple, Optional, Sequence @@ -12,6 +13,8 @@ from langchain_core.runnables.base import ( from langgraph.checkpoint import BaseCheckpointSaver from langgraph.pregel import Channel, Pregel +logger = logging.getLogger(__name__) + END = "__end__" @@ -34,8 +37,14 @@ class Graph: self.edges = set[tuple[str, str]]() self.branches: defaultdict[str, list[Branch]] = defaultdict(list) self.support_multiple_edges = False + self.compiled = False def add_node(self, key: str, action: RunnableLike) -> None: + if self.compiled: + logger.warning( + "Adding a node to a graph that has already been compiled. This will " + "not be reflected in the compiled graph." + ) if key in self.nodes: raise ValueError(f"Node `{key}` already present.") if key == END: @@ -44,6 +53,11 @@ class Graph: self.nodes[key] = coerce_to_runnable(action) def add_edge(self, start_key: str, end_key: str) -> None: + if self.compiled: + logger.warning( + "Adding an edge to a graph that has already been compiled. This will " + "not be reflected in the compiled graph." + ) if start_key == END: raise ValueError("END cannot be a start node") if start_key not in self.nodes: @@ -64,6 +78,11 @@ class Graph: condition: Callable[..., str], conditional_edge_mapping: Optional[Dict[str, str]] = None, ) -> None: + if self.compiled: + logger.warning( + "Adding an edge to a graph that has already been compiled. This will " + "not be reflected in the compiled graph." + ) if start_key not in self.nodes: raise ValueError(f"Need to add_node `{start_key}` first") if iscoroutinefunction(condition): @@ -81,6 +100,11 @@ class Graph: self.branches[start_key].append(Branch(condition, conditional_edge_mapping)) def set_entry_point(self, key: str) -> None: + if self.compiled: + logger.warning( + "Setting the entry point of a graph that has already been compiled. " + "This will not be reflected in the compiled graph." + ) if key not in self.nodes: raise ValueError(f"Need to add_node `{key}` first") self.entry_point = key @@ -119,6 +143,8 @@ class Graph: if node not in self.nodes: raise ValueError(f"Node `{node}` is not present") + self.compiled = True + def compile( self, checkpointer: Optional[BaseCheckpointSaver] = None, From e97cd22a186eefa4defff2924c3c67da56c97e8e Mon Sep 17 00:00:00 2001 From: Harrison Chase Date: Sun, 11 Feb 2024 21:14:07 -0800 Subject: [PATCH 18/18] add self discover notebook --- examples/self-discover/self-discover.ipynb | 479 +++++++++++++++++++++ 1 file changed, 479 insertions(+) create mode 100644 examples/self-discover/self-discover.ipynb diff --git a/examples/self-discover/self-discover.ipynb b/examples/self-discover/self-discover.ipynb new file mode 100644 index 000000000..fa337d58a --- /dev/null +++ b/examples/self-discover/self-discover.ipynb @@ -0,0 +1,479 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "a38e5d2d-7587-4192-90f2-b58e6c62f08c", + "metadata": {}, + "source": [ + "# Self Discover\n", + "\n", + "An implementation of the [Self-Discover paper](https://arxiv.org/pdf/2402.03620.pdf).\n", + "\n", + "Based on [this implementation from @catid](https://github.com/catid/self-discover/tree/main?tab=readme-ov-file)" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "id": "a18d8f24-5d9a-45c5-9739-6f3c4ed6c9c9", + "metadata": {}, + "outputs": [], + "source": [ + "from langchain_openai import ChatOpenAI" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "id": "9f554045-6e79-42d3-be4b-835bbbd0b78c", + "metadata": {}, + "outputs": [], + "source": [ + "model = ChatOpenAI(temperature=0, model=\"gpt-4-turbo-preview\")" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "id": "9e9925aa-638a-4862-823e-9803402b8f82", + "metadata": {}, + "outputs": [], + "source": [ + "from langchain import hub\n", + "from langchain_core.prompts import PromptTemplate" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "id": "c4cc5c8c-f6a5-42c7-9ed5-780d79b3b29a", + "metadata": {}, + "outputs": [], + "source": [ + "select_prompt = hub.pull(\"hwchase17/self-discovery-select\")" + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "id": "a5b53d29-f5b6-4f39-af97-bb6b133e1d18", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Select several reasoning modules that are crucial to utilize in order to solve the given task:\n", + "\n", + "All reasoning module descriptions:\n", + "\u001b[33;1m\u001b[1;3m{reasoning_modules}\u001b[0m\n", + "\n", + "Task: \u001b[33;1m\u001b[1;3m{task_description}\u001b[0m\n", + "\n", + "Select several modules are crucial for solving the task above:\n", + "\n" + ] + } + ], + "source": [ + "select_prompt.pretty_print()" + ] + }, + { + "cell_type": "code", + "execution_count": 40, + "id": "26eaa6bc-5202-4b22-9522-33f227c8eb55", + "metadata": {}, + "outputs": [], + "source": [ + "adapt_prompt = hub.pull(\"hwchase17/self-discovery-adapt\")" + ] + }, + { + "cell_type": "code", + "execution_count": 41, + "id": "dc30afb9-180d-417b-9935-f7ef166710b8", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Rephrase and specify each reasoning module so that it better helps solving the task:\n", + "\n", + "SELECTED module descriptions:\n", + "\u001b[33;1m\u001b[1;3m{selected_modules}\u001b[0m\n", + "\n", + "Task: \u001b[33;1m\u001b[1;3m{task_description}\u001b[0m\n", + "\n", + "Adapt each reasoning module description to better solve the task:\n", + "\n" + ] + } + ], + "source": [ + "adapt_prompt.pretty_print()" + ] + }, + { + "cell_type": "code", + "execution_count": 28, + "id": "a93253a9-8f50-49dd-8815-c3927bae1905", + "metadata": {}, + "outputs": [], + "source": [ + "structured_prompt = hub.pull(\"hwchase17/self-discovery-structure\")" + ] + }, + { + "cell_type": "code", + "execution_count": 36, + "id": "8ea8dd78-4285-400b-83d2-c4a241903a79", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Operationalize the reasoning modules into a step-by-step reasoning plan in JSON format:\n", + "\n", + "Here's an example:\n", + "\n", + "Example task:\n", + "\n", + "If you follow these instructions, do you return to the starting point? Always face forward. Take 1 step backward. Take 9 steps left. Take 2 steps backward. Take 6 steps forward. Take 4 steps forward. Take 4 steps backward. Take 3 steps right.\n", + "\n", + "Example reasoning structure:\n", + "\n", + "{\n", + " \"Position after instruction 1\":\n", + " \"Position after instruction 2\":\n", + " \"Position after instruction n\":\n", + " \"Is final position the same as starting position\":\n", + "}\n", + "\n", + "Adapted module description:\n", + "\u001b[33;1m\u001b[1;3m{adapted_modules}\u001b[0m\n", + "\n", + "Task: \u001b[33;1m\u001b[1;3m{task_description}\u001b[0m\n", + "\n", + "Implement a reasoning structure for solvers to follow step-by-step and arrive at correct answer.\n", + "\n", + "Note: do NOT actually arrive at a conclusion in this pass. Your job is to generate a PLAN so that in the future you can fill it out and arrive at the correct conclusion for tasks like this\n" + ] + } + ], + "source": [ + "structured_prompt.pretty_print()" + ] + }, + { + "cell_type": "code", + "execution_count": 45, + "id": "f3d4d79d-f414-4588-b476-4a35b3ba6fbf", + "metadata": {}, + "outputs": [], + "source": [ + "reasoning_prompt = hub.pull(\"hwchase17/self-discovery-reasoning\")" + ] + }, + { + "cell_type": "code", + "execution_count": 46, + "id": "23d1e32e-d12e-454a-8484-c08e250e3262", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Follow the step-by-step reasoning plan in JSON to correctly solve the task. Fill in the values following the keys by reasoning specifically about the task given. Do not simply rephrase the keys.\n", + " \n", + "Reasoning Structure:\n", + "\u001b[33;1m\u001b[1;3m{reasoning_structure}\u001b[0m\n", + "\n", + "Task: \u001b[33;1m\u001b[1;3m{task_description}\u001b[0m\n" + ] + } + ], + "source": [ + "reasoning_prompt.pretty_print()" + ] + }, + { + "cell_type": "code", + "execution_count": 42, + "id": "7b9af01d-da28-4785-b069-efea61905cfa", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "PromptTemplate(input_variables=['reasoning_structure', 'task_instance'], template='Follow the step-by-step reasoning plan in JSON to correctly solve the task. Fill in the values following the keys by reasoning specifically about the task given. Do not simply rephrase the keys.\\n \\nReasoning Structure:\\n{reasoning_structure}\\n\\nTask: {task_instance}')" + ] + }, + "execution_count": 42, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "reasoning_prompt" + ] + }, + { + "cell_type": "code", + "execution_count": 43, + "id": "399bf160-e257-429f-b27e-66d4063f195f", + "metadata": {}, + "outputs": [], + "source": [ + "_prompt = \"\"\"Follow the step-by-step reasoning plan in JSON to correctly solve the task. Fill in the values following the keys by reasoning specifically about the task given. Do not simply rephrase the keys.\\n \\nReasoning Structure:\\n{reasoning_structure}\\n\\nTask: {task_description}\"\"\"\n", + "_prompt = PromptTemplate.from_template(_prompt)" + ] + }, + { + "cell_type": "code", + "execution_count": 44, + "id": "6e047e3a-b1c2-4a3b-abc7-eb84de6874e4", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "'https://smith.langchain.com/hub/hwchase17/self-discovery-reasoning/48340707'" + ] + }, + "execution_count": 44, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "hub.push(\"hwchase17/self-discovery-reasoning\", _prompt)" + ] + }, + { + "cell_type": "code", + "execution_count": 72, + "id": "7f66d61e-6dcd-4462-b67b-29c5de56e238", + "metadata": {}, + "outputs": [], + "source": [ + "class SelfDiscoverState(TypedDict):\n", + " reasoning_modules: str\n", + " task_description: str\n", + " selected_modules: Optional[str]\n", + " adapted_modules: Optional[str]\n", + " reasoning_structure: Optional[str]\n", + " answer: Optional[str]" + ] + }, + { + "cell_type": "code", + "execution_count": 73, + "id": "5c3bd203-7dc1-457e-813f-283aaf059ec0", + "metadata": {}, + "outputs": [], + "source": [ + "def select(inputs):\n", + " select_chain = select_prompt | model | StrOutputParser()\n", + " return {\"selected_modules\": select_chain.invoke(inputs)}\n" + ] + }, + { + "cell_type": "code", + "execution_count": 74, + "id": "86420da0-7cc2-4659-853e-9c3ef808e47c", + "metadata": {}, + "outputs": [], + "source": [ + "def adapt(inputs):\n", + " adapt_chain = adapt_prompt | model | StrOutputParser()\n", + " return {\"adapted_modules\": adapt_chain.invoke(inputs)}" + ] + }, + { + "cell_type": "code", + "execution_count": 75, + "id": "270a3905-58a3-4650-96ca-e8254040285f", + "metadata": {}, + "outputs": [], + "source": [ + "def structure(inputs):\n", + " structure_chain = structured_prompt | model | StrOutputParser()\n", + " return {\"reasoning_structure\": structure_chain.invoke(inputs)}" + ] + }, + { + "cell_type": "code", + "execution_count": 76, + "id": "55b486cc-36be-497e-9eba-9c8dc228f2d1", + "metadata": {}, + "outputs": [], + "source": [ + "def reason(inputs):\n", + " reasoning_chain = reasoning_prompt | model | StrOutputParser()\n", + " return {\"answer\": reasoning_chain.invoke(inputs)}" + ] + }, + { + "cell_type": "code", + "execution_count": 77, + "id": "d9e2e4ce-dc9d-45a5-a218-34ab4fb62bc4", + "metadata": {}, + "outputs": [], + "source": [ + "from langgraph.graph import StateGraph, END\n", + "from typing import TypedDict, Optional" + ] + }, + { + "cell_type": "code", + "execution_count": 79, + "id": "26276404-0134-40a0-a796-cc9927c153ee", + "metadata": {}, + "outputs": [], + "source": [ + "graph = StateGraph(SelfDiscoverState)\n", + "graph.add_node(\"select\", select)\n", + "graph.add_node(\"adapt\", adapt)\n", + "graph.add_node(\"structure\", structure)\n", + "graph.add_node(\"reason\", reason)\n", + "graph.add_edge(\"select\", \"adapt\")\n", + "graph.add_edge(\"adapt\", \"structure\")\n", + "graph.add_edge(\"structure\", \"reason\")\n", + "graph.add_edge(\"reason\", END)\n", + "graph.set_entry_point(\"select\")\n", + "app = graph.compile()" + ] + }, + { + "cell_type": "code", + "execution_count": 80, + "id": "29fe385b-cf5d-4581-80e7-55462f5628bb", + "metadata": {}, + "outputs": [], + "source": [ + "reasoning_modules = [\n", + " \"1. How could I devise an experiment to help solve that problem?\",\n", + " \"2. Make a list of ideas for solving this problem, and apply them one by one to the problem to see if any progress can be made.\",\n", + " #\"3. How could I measure progress on this problem?\",\n", + " \"4. How can I simplify the problem so that it is easier to solve?\",\n", + " \"5. What are the key assumptions underlying this problem?\",\n", + " \"6. What are the potential risks and drawbacks of each solution?\",\n", + " \"7. What are the alternative perspectives or viewpoints on this problem?\",\n", + " \"8. What are the long-term implications of this problem and its solutions?\",\n", + " \"9. How can I break down this problem into smaller, more manageable parts?\",\n", + " \"10. Critical Thinking: This style involves analyzing the problem from different perspectives, questioning assumptions, and evaluating the evidence or information available. It focuses on logical reasoning, evidence-based decision-making, and identifying potential biases or flaws in thinking.\",\n", + " \"11. Try creative thinking, generate innovative and out-of-the-box ideas to solve the problem. Explore unconventional solutions, thinking beyond traditional boundaries, and encouraging imagination and originality.\",\n", + " #\"12. Seek input and collaboration from others to solve the problem. Emphasize teamwork, open communication, and leveraging the diverse perspectives and expertise of a group to come up with effective solutions.\",\n", + " \"13. Use systems thinking: Consider the problem as part of a larger system and understanding the interconnectedness of various elements. Focuses on identifying the underlying causes, feedback loops, and interdependencies that influence the problem, and developing holistic solutions that address the system as a whole.\",\n", + " \"14. Use Risk Analysis: Evaluate potential risks, uncertainties, and tradeoffs associated with different solutions or approaches to a problem. Emphasize assessing the potential consequences and likelihood of success or failure, and making informed decisions based on a balanced analysis of risks and benefits.\",\n", + " #\"15. Use Reflective Thinking: Step back from the problem, take the time for introspection and self-reflection. Examine personal biases, assumptions, and mental models that may influence problem-solving, and being open to learning from past experiences to improve future approaches.\",\n", + " \"16. What is the core issue or problem that needs to be addressed?\",\n", + " \"17. What are the underlying causes or factors contributing to the problem?\",\n", + " \"18. Are there any potential solutions or strategies that have been tried before? If yes, what were the outcomes and lessons learned?\",\n", + " \"19. What are the potential obstacles or challenges that might arise in solving this problem?\",\n", + " \"20. Are there any relevant data or information that can provide insights into the problem? If yes, what data sources are available, and how can they be analyzed?\",\n", + " \"21. Are there any stakeholders or individuals who are directly affected by the problem? What are their perspectives and needs?\",\n", + " \"22. What resources (financial, human, technological, etc.) are needed to tackle the problem effectively?\",\n", + " \"23. How can progress or success in solving the problem be measured or evaluated?\",\n", + " \"24. What indicators or metrics can be used?\",\n", + " \"25. Is the problem a technical or practical one that requires a specific expertise or skill set? Or is it more of a conceptual or theoretical problem?\",\n", + " \"26. Does the problem involve a physical constraint, such as limited resources, infrastructure, or space?\",\n", + " \"27. Is the problem related to human behavior, such as a social, cultural, or psychological issue?\",\n", + " \"28. Does the problem involve decision-making or planning, where choices need to be made under uncertainty or with competing objectives?\",\n", + " \"29. Is the problem an analytical one that requires data analysis, modeling, or optimization techniques?\",\n", + " \"30. Is the problem a design challenge that requires creative solutions and innovation?\",\n", + " \"31. Does the problem require addressing systemic or structural issues rather than just individual instances?\",\n", + " \"32. Is the problem time-sensitive or urgent, requiring immediate attention and action?\",\n", + " \"33. What kinds of solution typically are produced for this kind of problem specification?\",\n", + " \"34. Given the problem specification and the current best solution, have a guess about other possible solutions.\"\n", + " \"35. Let’s imagine the current best solution is totally wrong, what other ways are there to think about the problem specification?\"\n", + " \"36. What is the best way to modify this current best solution, given what you know about these kinds of problem specification?\"\n", + " \"37. Ignoring the current best solution, create an entirely new solution to the problem.\"\n", + " #\"38. Let’s think step by step.\"\n", + " \"39. Let’s make a step by step plan and implement it with good notation and explanation.\"\n", + "]\n", + "\n", + "\n", + "task_example = \"Lisa has 10 apples. She gives 3 apples to her friend and then buys 5 more apples from the store. How many apples does Lisa have now?\"\n", + "\n", + "task_example = \"\"\"This SVG path element draws a:\n", + "(A) circle (B) heptagon (C) hexagon (D) kite (E) line (F) octagon (G) pentagon(H) rectangle (I) sector (J) triangle\"\"\"" + ] + }, + { + "cell_type": "code", + "execution_count": 81, + "id": "6cbfbe81-f751-42da-843a-f9003ace663d", + "metadata": {}, + "outputs": [], + "source": [ + "reasoning_modules_str = \"\\n\".join(reasoning_modules)" + ] + }, + { + "cell_type": "code", + "execution_count": 82, + "id": "d411c7aa-7017-4d67-88b5-43b5d161c34c", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "{'select': {'selected_modules': \"To solve the task of identifying the shape drawn by the given SVG path element, the following reasoning modules are crucial:\\n\\n1. **Critical Thinking (10)**: This involves analyzing the SVG path commands and coordinates logically to understand the shape they form. It requires questioning assumptions (e.g., not assuming the shape based on a quick glance at the coordinates but rather analyzing the path commands) and evaluating the information given in the SVG path data.\\n\\n2. **Simplification (4)**: Simplifying the problem by breaking down the SVG path commands can make it easier to visualize and understand the shape being drawn. This might involve sketching the path based on the commands and coordinates or using a tool to render the SVG path.\\n\\n3. **Systems Thinking (13)**: Understanding the SVG path as part of a larger system (in this case, the SVG coordinate system and how path commands work) helps in comprehending how the individual commands come together to form a complete shape.\\n\\n4. **Analytical Problem Solving (29)**: This task requires data analysis skills to interpret the SVG path commands and coordinates. Understanding how 'M' (moveto), 'L' (lineto), and other commands work is essential for determining the shape.\\n\\n5. **Creative Thinking (11)**: While not as directly applicable as the other modules, creative thinking can aid in visualizing the shape that the path commands are intended to draw, especially if the shape is complex or if the path commands are not immediately clear.\\n\\n6. **Visualization (30)**: Although not explicitly listed, a module focused on visualization would be highly relevant here. Visualizing the path that the 'M' and 'L' commands create from the given coordinates can directly lead to identifying the shape.\\n\\nGiven the task's nature, modules focused on experimentation, risk analysis, stakeholder perspectives, and long-term implications (e.g., 1, 14, 21, 8) are less relevant. The task is primarily analytical and technical, requiring an understanding of SVG path syntax and geometry rather than broader problem-solving or decision-making strategies.\"}}\n", + "{'adapt': {'adapted_modules': \"1. **Detailed Path Analysis (10)**: This module focuses on a thorough examination of the SVG path commands and their corresponding coordinates to accurately deduce the shape they outline. It involves a critical approach where assumptions are set aside in favor of a detailed analysis of each command (e.g., 'M' for moveto, 'L' for lineto) and how these commands connect points in the SVG coordinate system to form a specific shape.\\n\\n2. **Path Decomposition (4)**: This involves breaking down the SVG path into more manageable segments or components to facilitate a clearer understanding of the overall shape. Techniques might include manually sketching the path as described by the commands and coordinates or utilizing digital tools to render the SVG path, thereby making the shape more apparent and easier to identify.\\n\\n3. **SVG System Analysis (13)**: Emphasizes the importance of understanding the SVG coordinate system and the functionality of path commands within this framework. This module is about seeing the SVG path not just as a series of commands but as part of the broader system of SVG graphics, where each command plays a specific role in shaping the final image.\\n\\n4. **Command Interpretation and Geometry (29)**: This module requires a deep dive into the syntax and semantics of SVG path commands, coupled with geometric reasoning to interpret the shape formed by these commands. Knowledge of how different commands like 'M' (moveto) and 'L' (lineto) contribute to the construction of geometric shapes is crucial for accurately identifying the shape in question.\\n\\n5. **Imaginative Visualization (11)**: While analytical skills are paramount, this module recognizes the role of creative thinking in visualizing the potential shapes that complex or ambiguous path commands might represent. It encourages thinking beyond the obvious and considering multiple geometric possibilities that fit the given path data.\\n\\n6. **Explicit Visualization (30)**: Directly focuses on the ability to visualize the trajectory formed by executing the SVG path commands, particularly 'M' and 'L'. This module is about using visualization techniques, whether mental or through software tools, to trace the path and see the resulting shape, thereby facilitating its identification.\\n\\nBy refining these modules to more directly address the task of interpreting SVG path elements, the process of identifying the drawn shape becomes more structured and focused on the specific skills and knowledge areas that are most relevant to the task.\"}}\n", + "{'structure': {'reasoning_structure': '```json\\n{\\n \"Step 1: Detailed Path Analysis\": {\\n \"Description\": \"Examine each SVG path command and its coordinates to understand the shape outline.\",\\n \"Actions\": [\\n {\\n \"Command\": \"M\",\\n \"Coordinate\": \"55.57,80.69\",\\n \"Purpose\": \"Move to starting point without drawing.\"\\n },\\n {\\n \"Command\": \"L\",\\n \"Coordinate\": \"57.38,65.80\",\\n \"Purpose\": \"Draw line to this point.\"\\n },\\n {\\n \"Command\": \"M\",\\n \"Coordinate\": \"57.38,65.80\",\\n \"Purpose\": \"Move to this point without drawing.\"\\n },\\n {\\n \"Command\": \"L\",\\n \"Coordinate\": \"48.90,57.46\",\\n \"Purpose\": \"Draw line to this point.\"\\n },\\n {\\n \"Command\": \"M\",\\n \"Coordinate\": \"48.90,57.46\",\\n \"Purpose\": \"Move to this point without drawing.\"\\n },\\n {\\n \"Command\": \"L\",\\n \"Coordinate\": \"45.58,47.78\",\\n \"Purpose\": \"Draw line to this point.\"\\n },\\n {\\n \"Command\": \"M\",\\n \"Coordinate\": \"45.58,47.78\",\\n \"Purpose\": \"Move to this point without drawing.\"\\n },\\n {\\n \"Command\": \"L\",\\n \"Coordinate\": \"53.25,36.07\",\\n \"Purpose\": \"Draw line to this point.\"\\n },\\n {\\n \"Command\": \"L\",\\n \"Coordinate\": \"66.29,48.90\",\\n \"Purpose\": \"Draw line to this point.\"\\n },\\n {\\n \"Command\": \"L\",\\n \"Coordinate\": \"78.69,61.09\",\\n \"Purpose\": \"Draw line to this point.\"\\n },\\n {\\n \"Command\": \"L\",\\n \"Coordinate\": \"55.57,80.69\",\\n \"Purpose\": \"Draw line to this point to close the shape.\"\\n }\\n ]\\n },\\n \"Step 2: Path Decomposition\": {\\n \"Description\": \"Break down the path into segments to simplify analysis.\",\\n \"Segments\": [\\n \"Segment 1: Move from (55.57,80.69) to (57.38,65.80)\",\\n \"Segment 2: Move from (57.38,65.80) to (48.90,57.46)\",\\n \"Segment 3: Move from (48.90,57.46) to (45.58,47.78)\",\\n \"Segment 4: Move from (45.58,47.78) to (53.25,36.07)\",\\n \"Segment 5: Move from (53.25,36.07) to (66.29,48.90)\",\\n \"Segment 6: Move from (66.29,48.90) to (78.69,61.09)\",\\n \"Segment 7: Move from (78.69,61.09) to (55.57,80.69)\"\\n ]\\n },\\n \"Step 3: SVG System Analysis\": {\\n \"Description\": \"Understand the role of each command within the SVG coordinate system.\",\\n \"Analysis\": [\\n {\\n \"Command\": \"M\",\\n \"Role\": \"Defines starting points for new sub-paths.\"\\n },\\n {\\n \"Command\": \"L\",\\n \"Role\": \"Creates straight lines between points.\"\\n }\\n ]\\n },\\n \"Step 4: Command Interpretation and Geometry\": {\\n \"Description\": \"Interpret the geometric shape formed by the path commands.\",\\n \"Geometric Principles\": [\\n \"Identify angles and lines created by \\'L\\' commands.\",\\n \"Determine the number of sides from the number of \\'L\\' commands.\"\\n ]\\n },\\n \"Step 5: Imaginative Visualization\": {\\n \"Description\": \"Visualize potential shapes that the path commands might represent.\",\\n \"Visualization Techniques\": [\\n \"Sketching the path based on command coordinates.\",\\n \"Mentally visualizing the path progression.\"\\n ]\\n },\\n \"Step 6: Explicit Visualization\": {\\n \"Description\": \"Use visualization tools to trace the path and see the resulting shape.\",\\n \"Tools\": [\\n \"Digital drawing software\",\\n \"SVG rendering tools\"\\n ]\\n },\\n \"Conclusion\": {\\n \"Description\": \"Based on the analysis and visualization, identify the shape.\",\\n \"Options\": [\\n \"Circle\",\\n \"Heptagon\",\\n \"Hexagon\",\\n \"Kite\",\\n \"Line\",\\n \"Octagon\",\\n \"Pentagon\",\\n \"Rectangle\",\\n \"Sector\",\\n \"Triangle\"\\n ],\\n \"Selected Option\": \"\"\\n }\\n}\\n```'}}\n", + "{'reason': {'answer': '```json\\n{\\n \"Step 1: Detailed Path Analysis\": {\\n \"Description\": \"Examine each SVG path command and its coordinates to understand the shape outline.\",\\n \"Actions\": [\\n {\\n \"Command\": \"M\",\\n \"Coordinate\": \"55.57,80.69\",\\n \"Purpose\": \"Move to starting point without drawing.\"\\n },\\n {\\n \"Command\": \"L\",\\n \"Coordinate\": \"57.38,65.80\",\\n \"Purpose\": \"Draw line to this point.\"\\n },\\n {\\n \"Command\": \"M\",\\n \"Coordinate\": \"57.38,65.80\",\\n \"Purpose\": \"Move to this point without drawing.\"\\n },\\n {\\n \"Command\": \"L\",\\n \"Coordinate\": \"48.90,57.46\",\\n \"Purpose\": \"Draw line to this point.\"\\n },\\n {\\n \"Command\": \"M\",\\n \"Coordinate\": \"48.90,57.46\",\\n \"Purpose\": \"Move to this point without drawing.\"\\n },\\n {\\n \"Command\": \"L\",\\n \"Coordinate\": \"45.58,47.78\",\\n \"Purpose\": \"Draw line to this point.\"\\n },\\n {\\n \"Command\": \"M\",\\n \"Coordinate\": \"45.58,47.78\",\\n \"Purpose\": \"Move to this point without drawing.\"\\n },\\n {\\n \"Command\": \"L\",\\n \"Coordinate\": \"53.25,36.07\",\\n \"Purpose\": \"Draw line to this point.\"\\n },\\n {\\n \"Command\": \"L\",\\n \"Coordinate\": \"66.29,48.90\",\\n \"Purpose\": \"Draw line to this point.\"\\n },\\n {\\n \"Command\": \"L\",\\n \"Coordinate\": \"78.69,61.09\",\\n \"Purpose\": \"Draw line to this point.\"\\n },\\n {\\n \"Command\": \"L\",\\n \"Coordinate\": \"55.57,80.69\",\\n \"Purpose\": \"Draw line to this point to close the shape.\"\\n }\\n ]\\n },\\n \"Step 2: Path Decomposition\": {\\n \"Description\": \"Break down the path into segments to simplify analysis.\",\\n \"Segments\": [\\n \"Segment 1: Move from (55.57,80.69) to (57.38,65.80)\",\\n \"Segment 2: Move from (57.38,65.80) to (48.90,57.46)\",\\n \"Segment 3: Move from (48.90,57.46) to (45.58,47.78)\",\\n \"Segment 4: Move from (45.58,47.78) to (53.25,36.07)\",\\n \"Segment 5: Move from (53.25,36.07) to (66.29,48.90)\",\\n \"Segment 6: Move from (66.29,48.90) to (78.69,61.09)\",\\n \"Segment 7: Move from (78.69,61.09) to (55.57,80.69)\"\\n ]\\n },\\n \"Step 3: SVG System Analysis\": {\\n \"Description\": \"Understand the role of each command within the SVG coordinate system.\",\\n \"Analysis\": [\\n {\\n \"Command\": \"M\",\\n \"Role\": \"Defines starting points for new sub-paths.\"\\n },\\n {\\n \"Command\": \"L\",\\n \"Role\": \"Creates straight lines between points.\"\\n }\\n ]\\n },\\n \"Step 4: Command Interpretation and Geometry\": {\\n \"Description\": \"Interpret the geometric shape formed by the path commands.\",\\n \"Geometric Principles\": [\\n \"Identify angles and lines created by \\'L\\' commands.\",\\n \"Determine the number of sides from the number of \\'L\\' commands.\"\\n ]\\n },\\n \"Step 5: Imaginative Visualization\": {\\n \"Description\": \"Visualize potential shapes that the path commands might represent.\",\\n \"Visualization Techniques\": [\\n \"Sketching the path based on command coordinates.\",\\n \"Mentally visualizing the path progression.\"\\n ]\\n },\\n \"Step 6: Explicit Visualization\": {\\n \"Description\": \"Use visualization tools to trace the path and see the resulting shape.\",\\n \"Tools\": [\\n \"Digital drawing software\",\\n \"SVG rendering tools\"\\n ]\\n },\\n \"Conclusion\": {\\n \"Description\": \"Based on the analysis and visualization, identify the shape.\",\\n \"Options\": [\\n \"Circle\",\\n \"Heptagon\",\\n \"Hexagon\",\\n \"Kite\",\\n \"Line\",\\n \"Octagon\",\\n \"Pentagon\",\\n \"Rectangle\",\\n \"Sector\",\\n \"Triangle\"\\n ],\\n \"Selected Option\": \"Pentagon\"\\n }\\n}\\n```'}}\n", + "{'__end__': {'reasoning_modules': '1. How could I devise an experiment to help solve that problem?\\n2. Make a list of ideas for solving this problem, and apply them one by one to the problem to see if any progress can be made.\\n4. How can I simplify the problem so that it is easier to solve?\\n5. What are the key assumptions underlying this problem?\\n6. What are the potential risks and drawbacks of each solution?\\n7. What are the alternative perspectives or viewpoints on this problem?\\n8. What are the long-term implications of this problem and its solutions?\\n9. How can I break down this problem into smaller, more manageable parts?\\n10. Critical Thinking: This style involves analyzing the problem from different perspectives, questioning assumptions, and evaluating the evidence or information available. It focuses on logical reasoning, evidence-based decision-making, and identifying potential biases or flaws in thinking.\\n11. Try creative thinking, generate innovative and out-of-the-box ideas to solve the problem. Explore unconventional solutions, thinking beyond traditional boundaries, and encouraging imagination and originality.\\n13. Use systems thinking: Consider the problem as part of a larger system and understanding the interconnectedness of various elements. Focuses on identifying the underlying causes, feedback loops, and interdependencies that influence the problem, and developing holistic solutions that address the system as a whole.\\n14. Use Risk Analysis: Evaluate potential risks, uncertainties, and tradeoffs associated with different solutions or approaches to a problem. Emphasize assessing the potential consequences and likelihood of success or failure, and making informed decisions based on a balanced analysis of risks and benefits.\\n16. What is the core issue or problem that needs to be addressed?\\n17. What are the underlying causes or factors contributing to the problem?\\n18. Are there any potential solutions or strategies that have been tried before? If yes, what were the outcomes and lessons learned?\\n19. What are the potential obstacles or challenges that might arise in solving this problem?\\n20. Are there any relevant data or information that can provide insights into the problem? If yes, what data sources are available, and how can they be analyzed?\\n21. Are there any stakeholders or individuals who are directly affected by the problem? What are their perspectives and needs?\\n22. What resources (financial, human, technological, etc.) are needed to tackle the problem effectively?\\n23. How can progress or success in solving the problem be measured or evaluated?\\n24. What indicators or metrics can be used?\\n25. Is the problem a technical or practical one that requires a specific expertise or skill set? Or is it more of a conceptual or theoretical problem?\\n26. Does the problem involve a physical constraint, such as limited resources, infrastructure, or space?\\n27. Is the problem related to human behavior, such as a social, cultural, or psychological issue?\\n28. Does the problem involve decision-making or planning, where choices need to be made under uncertainty or with competing objectives?\\n29. Is the problem an analytical one that requires data analysis, modeling, or optimization techniques?\\n30. Is the problem a design challenge that requires creative solutions and innovation?\\n31. Does the problem require addressing systemic or structural issues rather than just individual instances?\\n32. Is the problem time-sensitive or urgent, requiring immediate attention and action?\\n33. What kinds of solution typically are produced for this kind of problem specification?\\n34. Given the problem specification and the current best solution, have a guess about other possible solutions.35. Let’s imagine the current best solution is totally wrong, what other ways are there to think about the problem specification?36. What is the best way to modify this current best solution, given what you know about these kinds of problem specification?37. Ignoring the current best solution, create an entirely new solution to the problem.39. Let’s make a step by step plan and implement it with good notation and explanation.', 'task_description': 'This SVG path element draws a:\\n(A) circle (B) heptagon (C) hexagon (D) kite (E) line (F) octagon (G) pentagon(H) rectangle (I) sector (J) triangle', 'selected_modules': \"To solve the task of identifying the shape drawn by the given SVG path element, the following reasoning modules are crucial:\\n\\n1. **Critical Thinking (10)**: This involves analyzing the SVG path commands and coordinates logically to understand the shape they form. It requires questioning assumptions (e.g., not assuming the shape based on a quick glance at the coordinates but rather analyzing the path commands) and evaluating the information given in the SVG path data.\\n\\n2. **Simplification (4)**: Simplifying the problem by breaking down the SVG path commands can make it easier to visualize and understand the shape being drawn. This might involve sketching the path based on the commands and coordinates or using a tool to render the SVG path.\\n\\n3. **Systems Thinking (13)**: Understanding the SVG path as part of a larger system (in this case, the SVG coordinate system and how path commands work) helps in comprehending how the individual commands come together to form a complete shape.\\n\\n4. **Analytical Problem Solving (29)**: This task requires data analysis skills to interpret the SVG path commands and coordinates. Understanding how 'M' (moveto), 'L' (lineto), and other commands work is essential for determining the shape.\\n\\n5. **Creative Thinking (11)**: While not as directly applicable as the other modules, creative thinking can aid in visualizing the shape that the path commands are intended to draw, especially if the shape is complex or if the path commands are not immediately clear.\\n\\n6. **Visualization (30)**: Although not explicitly listed, a module focused on visualization would be highly relevant here. Visualizing the path that the 'M' and 'L' commands create from the given coordinates can directly lead to identifying the shape.\\n\\nGiven the task's nature, modules focused on experimentation, risk analysis, stakeholder perspectives, and long-term implications (e.g., 1, 14, 21, 8) are less relevant. The task is primarily analytical and technical, requiring an understanding of SVG path syntax and geometry rather than broader problem-solving or decision-making strategies.\", 'adapted_modules': \"1. **Detailed Path Analysis (10)**: This module focuses on a thorough examination of the SVG path commands and their corresponding coordinates to accurately deduce the shape they outline. It involves a critical approach where assumptions are set aside in favor of a detailed analysis of each command (e.g., 'M' for moveto, 'L' for lineto) and how these commands connect points in the SVG coordinate system to form a specific shape.\\n\\n2. **Path Decomposition (4)**: This involves breaking down the SVG path into more manageable segments or components to facilitate a clearer understanding of the overall shape. Techniques might include manually sketching the path as described by the commands and coordinates or utilizing digital tools to render the SVG path, thereby making the shape more apparent and easier to identify.\\n\\n3. **SVG System Analysis (13)**: Emphasizes the importance of understanding the SVG coordinate system and the functionality of path commands within this framework. This module is about seeing the SVG path not just as a series of commands but as part of the broader system of SVG graphics, where each command plays a specific role in shaping the final image.\\n\\n4. **Command Interpretation and Geometry (29)**: This module requires a deep dive into the syntax and semantics of SVG path commands, coupled with geometric reasoning to interpret the shape formed by these commands. Knowledge of how different commands like 'M' (moveto) and 'L' (lineto) contribute to the construction of geometric shapes is crucial for accurately identifying the shape in question.\\n\\n5. **Imaginative Visualization (11)**: While analytical skills are paramount, this module recognizes the role of creative thinking in visualizing the potential shapes that complex or ambiguous path commands might represent. It encourages thinking beyond the obvious and considering multiple geometric possibilities that fit the given path data.\\n\\n6. **Explicit Visualization (30)**: Directly focuses on the ability to visualize the trajectory formed by executing the SVG path commands, particularly 'M' and 'L'. This module is about using visualization techniques, whether mental or through software tools, to trace the path and see the resulting shape, thereby facilitating its identification.\\n\\nBy refining these modules to more directly address the task of interpreting SVG path elements, the process of identifying the drawn shape becomes more structured and focused on the specific skills and knowledge areas that are most relevant to the task.\", 'reasoning_structure': '```json\\n{\\n \"Step 1: Detailed Path Analysis\": {\\n \"Description\": \"Examine each SVG path command and its coordinates to understand the shape outline.\",\\n \"Actions\": [\\n {\\n \"Command\": \"M\",\\n \"Coordinate\": \"55.57,80.69\",\\n \"Purpose\": \"Move to starting point without drawing.\"\\n },\\n {\\n \"Command\": \"L\",\\n \"Coordinate\": \"57.38,65.80\",\\n \"Purpose\": \"Draw line to this point.\"\\n },\\n {\\n \"Command\": \"M\",\\n \"Coordinate\": \"57.38,65.80\",\\n \"Purpose\": \"Move to this point without drawing.\"\\n },\\n {\\n \"Command\": \"L\",\\n \"Coordinate\": \"48.90,57.46\",\\n \"Purpose\": \"Draw line to this point.\"\\n },\\n {\\n \"Command\": \"M\",\\n \"Coordinate\": \"48.90,57.46\",\\n \"Purpose\": \"Move to this point without drawing.\"\\n },\\n {\\n \"Command\": \"L\",\\n \"Coordinate\": \"45.58,47.78\",\\n \"Purpose\": \"Draw line to this point.\"\\n },\\n {\\n \"Command\": \"M\",\\n \"Coordinate\": \"45.58,47.78\",\\n \"Purpose\": \"Move to this point without drawing.\"\\n },\\n {\\n \"Command\": \"L\",\\n \"Coordinate\": \"53.25,36.07\",\\n \"Purpose\": \"Draw line to this point.\"\\n },\\n {\\n \"Command\": \"L\",\\n \"Coordinate\": \"66.29,48.90\",\\n \"Purpose\": \"Draw line to this point.\"\\n },\\n {\\n \"Command\": \"L\",\\n \"Coordinate\": \"78.69,61.09\",\\n \"Purpose\": \"Draw line to this point.\"\\n },\\n {\\n \"Command\": \"L\",\\n \"Coordinate\": \"55.57,80.69\",\\n \"Purpose\": \"Draw line to this point to close the shape.\"\\n }\\n ]\\n },\\n \"Step 2: Path Decomposition\": {\\n \"Description\": \"Break down the path into segments to simplify analysis.\",\\n \"Segments\": [\\n \"Segment 1: Move from (55.57,80.69) to (57.38,65.80)\",\\n \"Segment 2: Move from (57.38,65.80) to (48.90,57.46)\",\\n \"Segment 3: Move from (48.90,57.46) to (45.58,47.78)\",\\n \"Segment 4: Move from (45.58,47.78) to (53.25,36.07)\",\\n \"Segment 5: Move from (53.25,36.07) to (66.29,48.90)\",\\n \"Segment 6: Move from (66.29,48.90) to (78.69,61.09)\",\\n \"Segment 7: Move from (78.69,61.09) to (55.57,80.69)\"\\n ]\\n },\\n \"Step 3: SVG System Analysis\": {\\n \"Description\": \"Understand the role of each command within the SVG coordinate system.\",\\n \"Analysis\": [\\n {\\n \"Command\": \"M\",\\n \"Role\": \"Defines starting points for new sub-paths.\"\\n },\\n {\\n \"Command\": \"L\",\\n \"Role\": \"Creates straight lines between points.\"\\n }\\n ]\\n },\\n \"Step 4: Command Interpretation and Geometry\": {\\n \"Description\": \"Interpret the geometric shape formed by the path commands.\",\\n \"Geometric Principles\": [\\n \"Identify angles and lines created by \\'L\\' commands.\",\\n \"Determine the number of sides from the number of \\'L\\' commands.\"\\n ]\\n },\\n \"Step 5: Imaginative Visualization\": {\\n \"Description\": \"Visualize potential shapes that the path commands might represent.\",\\n \"Visualization Techniques\": [\\n \"Sketching the path based on command coordinates.\",\\n \"Mentally visualizing the path progression.\"\\n ]\\n },\\n \"Step 6: Explicit Visualization\": {\\n \"Description\": \"Use visualization tools to trace the path and see the resulting shape.\",\\n \"Tools\": [\\n \"Digital drawing software\",\\n \"SVG rendering tools\"\\n ]\\n },\\n \"Conclusion\": {\\n \"Description\": \"Based on the analysis and visualization, identify the shape.\",\\n \"Options\": [\\n \"Circle\",\\n \"Heptagon\",\\n \"Hexagon\",\\n \"Kite\",\\n \"Line\",\\n \"Octagon\",\\n \"Pentagon\",\\n \"Rectangle\",\\n \"Sector\",\\n \"Triangle\"\\n ],\\n \"Selected Option\": \"\"\\n }\\n}\\n```', 'answer': '```json\\n{\\n \"Step 1: Detailed Path Analysis\": {\\n \"Description\": \"Examine each SVG path command and its coordinates to understand the shape outline.\",\\n \"Actions\": [\\n {\\n \"Command\": \"M\",\\n \"Coordinate\": \"55.57,80.69\",\\n \"Purpose\": \"Move to starting point without drawing.\"\\n },\\n {\\n \"Command\": \"L\",\\n \"Coordinate\": \"57.38,65.80\",\\n \"Purpose\": \"Draw line to this point.\"\\n },\\n {\\n \"Command\": \"M\",\\n \"Coordinate\": \"57.38,65.80\",\\n \"Purpose\": \"Move to this point without drawing.\"\\n },\\n {\\n \"Command\": \"L\",\\n \"Coordinate\": \"48.90,57.46\",\\n \"Purpose\": \"Draw line to this point.\"\\n },\\n {\\n \"Command\": \"M\",\\n \"Coordinate\": \"48.90,57.46\",\\n \"Purpose\": \"Move to this point without drawing.\"\\n },\\n {\\n \"Command\": \"L\",\\n \"Coordinate\": \"45.58,47.78\",\\n \"Purpose\": \"Draw line to this point.\"\\n },\\n {\\n \"Command\": \"M\",\\n \"Coordinate\": \"45.58,47.78\",\\n \"Purpose\": \"Move to this point without drawing.\"\\n },\\n {\\n \"Command\": \"L\",\\n \"Coordinate\": \"53.25,36.07\",\\n \"Purpose\": \"Draw line to this point.\"\\n },\\n {\\n \"Command\": \"L\",\\n \"Coordinate\": \"66.29,48.90\",\\n \"Purpose\": \"Draw line to this point.\"\\n },\\n {\\n \"Command\": \"L\",\\n \"Coordinate\": \"78.69,61.09\",\\n \"Purpose\": \"Draw line to this point.\"\\n },\\n {\\n \"Command\": \"L\",\\n \"Coordinate\": \"55.57,80.69\",\\n \"Purpose\": \"Draw line to this point to close the shape.\"\\n }\\n ]\\n },\\n \"Step 2: Path Decomposition\": {\\n \"Description\": \"Break down the path into segments to simplify analysis.\",\\n \"Segments\": [\\n \"Segment 1: Move from (55.57,80.69) to (57.38,65.80)\",\\n \"Segment 2: Move from (57.38,65.80) to (48.90,57.46)\",\\n \"Segment 3: Move from (48.90,57.46) to (45.58,47.78)\",\\n \"Segment 4: Move from (45.58,47.78) to (53.25,36.07)\",\\n \"Segment 5: Move from (53.25,36.07) to (66.29,48.90)\",\\n \"Segment 6: Move from (66.29,48.90) to (78.69,61.09)\",\\n \"Segment 7: Move from (78.69,61.09) to (55.57,80.69)\"\\n ]\\n },\\n \"Step 3: SVG System Analysis\": {\\n \"Description\": \"Understand the role of each command within the SVG coordinate system.\",\\n \"Analysis\": [\\n {\\n \"Command\": \"M\",\\n \"Role\": \"Defines starting points for new sub-paths.\"\\n },\\n {\\n \"Command\": \"L\",\\n \"Role\": \"Creates straight lines between points.\"\\n }\\n ]\\n },\\n \"Step 4: Command Interpretation and Geometry\": {\\n \"Description\": \"Interpret the geometric shape formed by the path commands.\",\\n \"Geometric Principles\": [\\n \"Identify angles and lines created by \\'L\\' commands.\",\\n \"Determine the number of sides from the number of \\'L\\' commands.\"\\n ]\\n },\\n \"Step 5: Imaginative Visualization\": {\\n \"Description\": \"Visualize potential shapes that the path commands might represent.\",\\n \"Visualization Techniques\": [\\n \"Sketching the path based on command coordinates.\",\\n \"Mentally visualizing the path progression.\"\\n ]\\n },\\n \"Step 6: Explicit Visualization\": {\\n \"Description\": \"Use visualization tools to trace the path and see the resulting shape.\",\\n \"Tools\": [\\n \"Digital drawing software\",\\n \"SVG rendering tools\"\\n ]\\n },\\n \"Conclusion\": {\\n \"Description\": \"Based on the analysis and visualization, identify the shape.\",\\n \"Options\": [\\n \"Circle\",\\n \"Heptagon\",\\n \"Hexagon\",\\n \"Kite\",\\n \"Line\",\\n \"Octagon\",\\n \"Pentagon\",\\n \"Rectangle\",\\n \"Sector\",\\n \"Triangle\"\\n ],\\n \"Selected Option\": \"Pentagon\"\\n }\\n}\\n```'}}\n" + ] + } + ], + "source": [ + "for s in app.stream({\"task_description\": task_example, \"reasoning_modules\": reasoning_modules_str}):\n", + " print(s)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "ea8568d5-bdb6-45cd-8d04-1ab305786caa", + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "c14a291c-7c1b-43bc-807e-11180290985e", + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.11.1" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +}