diff --git a/examples/time-travel.ipynb b/examples/time-travel.ipynb index f0ba7170c..337428bcb 100644 --- a/examples/time-travel.ipynb +++ b/examples/time-travel.ipynb @@ -121,9 +121,8 @@ "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" + "We can now wrap these tools in a simple ToolNode.\n", + "This is a prebuilt node that extracts tool calls from the most recent AIMessage, executes them, and returns a ToolMessage with the results.\n" ] }, { @@ -133,9 +132,9 @@ "metadata": {}, "outputs": [], "source": [ - "from langgraph.prebuilt import ToolExecutor\n", + "from langgraph.prebuilt import ToolNode\n", "\n", - "tool_executor = ToolExecutor(tools)" + "tool_node = ToolNode(tools)" ] }, { @@ -173,7 +172,7 @@ "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" + "We can do this using the `.bind_tools()` method, common to many of LangChain's chat models.\n" ] }, { @@ -183,10 +182,7 @@ "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)" + "model = model.bind_tools(tools)" ] }, { @@ -223,40 +219,15 @@ "metadata": {}, "outputs": [], "source": [ - "from langgraph.prebuilt import ToolInvocation\n", - "import json\n", - "from langchain_core.messages import FunctionMessage, AIMessage\n", - "\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", + " if not last_message.tool_calls:\n", " return \"end\"\n", " # Otherwise if there is, we continue\n", " else:\n", - " return \"continue\"\n", - "\n", - "\n", - "# Define the function to execute tools\n", - "def call_tool(messages, config):\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(\n", - " last_message.additional_kwargs[\"function_call\"][\"arguments\"]\n", - " ),\n", - " )\n", - " # We call the tool_executor and get back a response\n", - " response = tool_executor.invoke(action, config)\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" + " return \"continue\"" ] }, { @@ -283,7 +254,7 @@ "\n", "# Define the two nodes we will cycle between\n", "workflow.add_node(\"agent\", model)\n", - "workflow.add_node(\"action\", call_tool)\n", + "workflow.add_node(\"action\", tool_node)\n", "\n", "# Set the entrypoint as `agent`\n", "# This means that this node is the first one called\n", @@ -366,7 +337,7 @@ "outputs": [ { "data": { - "image/png": "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", + "image/png": "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", "text/plain": [ "" ] @@ -402,7 +373,7 @@ "name": "stdout", "output_type": "stream", "text": [ - "content='Hello Bob! How can I assist you today?' response_metadata={'token_usage': {'completion_tokens': 11, 'prompt_tokens': 86, 'total_tokens': 97}, 'model_name': 'gpt-3.5-turbo', 'system_fingerprint': 'fp_b28b39ffa8', 'finish_reason': 'stop', 'logprobs': None} id='run-b5f3758d-1e41-4c18-9ea4-628a5dc9304a-0'\n" + "content='Hello Bob! How can I assist you today?' response_metadata={'token_usage': {'completion_tokens': 11, 'prompt_tokens': 86, 'total_tokens': 97}, 'model_name': 'gpt-3.5-turbo', 'system_fingerprint': 'fp_c2295e73ad', 'finish_reason': 'stop', 'logprobs': None} id='run-f36a6fff-7732-43ed-b2a1-4d6cde4c073d-0'\n" ] } ], @@ -420,7 +391,7 @@ "id": "9230c0a7-bab8-4327-a9b4-f21e7a28d32a", "metadata": {}, "source": [ - "See LangSmith example run here https://smith.langchain.com/public/48931f97-3a33-453a-9150-e9cef6ec8cef/r\n", + "See LangSmith example run here https://smith.langchain.com/public/01c1d61c-6943-4db1-8afe-5366f083caf3/r\n", "\n", "Here you can see the \"agent\" node ran, and then \"should_continue\" returned \"end\" so the graph stopped execution there." ] @@ -442,8 +413,8 @@ { "data": { "text/plain": [ - "[HumanMessage(content=\"hi! I'm bob\", id='9d441d6c-8e75-4fb1-b8d7-142d97f445f7'),\n", - " AIMessage(content='Hello Bob! How can I assist you today?', response_metadata={'token_usage': {'completion_tokens': 11, 'prompt_tokens': 86, 'total_tokens': 97}, 'model_name': 'gpt-3.5-turbo', 'system_fingerprint': 'fp_b28b39ffa8', 'finish_reason': 'stop', 'logprobs': None}, id='run-b5f3758d-1e41-4c18-9ea4-628a5dc9304a-0')]" + "[HumanMessage(content=\"hi! I'm bob\", id='8b86e367-6571-4333-86db-ed089288fd4f'),\n", + " AIMessage(content='Hello Bob! How can I assist you today?', response_metadata={'token_usage': {'completion_tokens': 11, 'prompt_tokens': 86, 'total_tokens': 97}, 'model_name': 'gpt-3.5-turbo', 'system_fingerprint': 'fp_c2295e73ad', 'finish_reason': 'stop', 'logprobs': None}, id='run-f36a6fff-7732-43ed-b2a1-4d6cde4c073d-0')]" ] }, "execution_count": 11, @@ -455,6 +426,43 @@ "app.get_state(thread).values" ] }, + { + "cell_type": "markdown", + "id": "b894d739-d8b1-485b-841a-5cd997c111f9", + "metadata": {}, + "source": [ + "The current state is the two messages we've seen above, 1. the HumanMessage we sent in, 2. the AIMessage we got back from the model." + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "id": "e2c2531f-6dda-444b-b2f5-bbd607251776", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "()" + ] + }, + "execution_count": 12, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "app.get_state(thread).next" + ] + }, + { + "cell_type": "markdown", + "id": "98a953a5-7c04-4210-a6ea-bd42e8abd81c", + "metadata": {}, + "source": [ + "The graph got to the end without interruptions, so the list of next nodes is empty." + ] + }, { "cell_type": "markdown", "id": "7f117f21-cabc-4c6a-b89a-e673085bc067", @@ -465,7 +473,7 @@ }, { "cell_type": "code", - "execution_count": 12, + "execution_count": 13, "id": "73eb35a7-b705-4d7b-9e4b-28f7e2130358", "metadata": {}, "outputs": [ @@ -473,9 +481,9 @@ "name": "stdout", "output_type": "stream", "text": [ - "content='' additional_kwargs={'function_call': {'arguments': '{\"query\":\"current weather in San Francisco\"}', 'name': 'tavily_search_results_json'}} response_metadata={'token_usage': {'completion_tokens': 22, 'prompt_tokens': 111, 'total_tokens': 133}, 'model_name': 'gpt-3.5-turbo', 'system_fingerprint': 'fp_b28b39ffa8', 'finish_reason': 'function_call', 'logprobs': None} id='run-86030ee6-69eb-4399-9ffb-cf31103ed095-0'\n", - "content='[{\\'url\\': \\'https://weather.com/weather/hourbyhour/l/USCA0987:1:US\\', \\'content\\': \"recents\\\\nSpecialty Forecasts\\\\nHourly Weather-San Francisco, CA\\\\nBeach Hazard Statement\\\\nSaturday, November 25\\\\n5 pm\\\\nClear\\\\n6 pm\\\\nClear\\\\n7 pm\\\\nClear\\\\n8 pm\\\\nMostly Clear\\\\n9 pm\\\\nPartly Cloudy\\\\n10 pm\\\\nPartly Cloudy\\\\n11 pm\\\\nPartly Cloudy\\\\nSunday, November 26\\\\n12 am\\\\nPartly Cloudy\\\\n1 am\\\\nMostly Cloudy\\\\n2 am\\\\nMostly Cloudy\\\\n3 am\\\\nMostly Cloudy\\\\n4 am\\\\nCloudy\\\\n5 am\\\\nCloudy\\\\n6 am\\\\nMostly Cloudy\\\\n7 am\\\\nMostly Cloudy\\\\n8 am\\\\nMostly Cloudy\\\\n9 am\\\\nMostly Cloudy\\\\n10 am\\\\nPartly Cloudy\\\\n11 am\\\\nPartly Cloudy\\\\n12 pm\\\\nPartly Cloudy\\\\n1 pm\\\\nPartly Cloudy\\\\n2 pm\\\\nPartly Cloudy\\\\n3 pm\\\\nPartly Cloudy\\\\n4 pm\\\\nPartly Cloudy\\\\n5 pm\\\\nPartly Cloudy\\\\n6 pm\\\\nPartly Cloudy\\\\n7 pm\\\\nPartly Cloudy\\\\n8 pm\\\\nPartly Cloudy\\\\n9 pm\\\\nMostly Clear\\\\n10 pm\\\\nMostly Clear\\\\n11 pm\\\\nMostly Clear\\\\nMonday, November 27\\\\n12 am\\\\nClear\\\\n1 am\\\\nMostly Clear\\\\n2 am\\\\nMostly Clear\\\\n3 am\\\\nPartly Cloudy\\\\n4 am\\\\nMostly Clear\\\\n5 am\\\\nMostly Clear\\\\n6 am\\\\nClear\\\\n7 am\\\\nClear\\\\n8 am\\\\nSunny\\\\n9 am\\\\nSunny\\\\n10 am\\\\nSunny\\\\n11 am\\\\nSunny\\\\n12 pm\\\\nMostly Sunny\\\\n1 pm\\\\nPartly Cloudy\\\\n2 pm\\\\nMostly Sunny\\\\n3 pm\\\\nMostly Sunny\\\\n4 pm\\\\nPartly Cloudy\\\\nRadar\\\\nSafety First!\\\\n Don\\'t Miss\\\\nIrresistible\\\\nWeather Wonders\\\\nOur Amazing World\\\\nCelestial Symphony\\\\nFried Turkey Fail\\\\nLook At That!\\\\n Health & Activities\\\\nSeasonal Allergies and Pollen Count Forecast\\\\nNo pollen detected in your area\\\\nCold & Flu Forecast\\\\nFlu risk is low in your area\\\\nWe recognize our responsibility to use data and technology for good. Changes For Critters\\\\nHurricane Tracker\\\\nStay Safe\\\\nAir Quality Index\\\\nAir quality is considered satisfactory, and air pollution poses little or no risk.\\\\n Take control of your data.\\\\n\"}]' name='tavily_search_results_json' id='89c58552-0092-4169-bff6-e1cb6c8fe321'\n", - "content='The current weather in San Francisco is as follows:\\n- 5 pm: Clear\\n- 6 pm: Clear\\n- 7 pm: Clear\\n- 8 pm: Mostly Clear\\n- 9 pm: Partly Cloudy\\n- 10 pm: Partly Cloudy\\n\\nFor more detailed weather information, you can visit [this link](https://weather.com/weather/hourbyhour/l/USCA0987:1:US).' response_metadata={'token_usage': {'completion_tokens': 93, 'prompt_tokens': 684, 'total_tokens': 777}, 'model_name': 'gpt-3.5-turbo', 'system_fingerprint': 'fp_b28b39ffa8', 'finish_reason': 'stop', 'logprobs': None} id='run-11318f28-a516-4b5c-85f6-8d9775205db9-0'\n" + "content='' additional_kwargs={'tool_calls': [{'id': 'call_S1BSXnmEYRcs1Aed2obUsi4J', 'function': {'arguments': '{\"query\":\"current weather in San Francisco\"}', 'name': 'tavily_search_results_json'}, 'type': 'function'}]} response_metadata={'token_usage': {'completion_tokens': 22, 'prompt_tokens': 111, 'total_tokens': 133}, 'model_name': 'gpt-3.5-turbo', 'system_fingerprint': 'fp_b28b39ffa8', 'finish_reason': 'tool_calls', 'logprobs': None} id='run-3d0caf20-5c92-4dd4-bd55-551d29fe6eb4-0' tool_calls=[{'name': 'tavily_search_results_json', 'args': {'query': 'current weather in San Francisco'}, 'id': 'call_S1BSXnmEYRcs1Aed2obUsi4J'}]\n", + "[ToolMessage(content='[{\"url\": \"https://www.weatherapi.com/\", \"content\": \"{\\'location\\': {\\'name\\': \\'San Francisco\\', \\'region\\': \\'California\\', \\'country\\': \\'United States of America\\', \\'lat\\': 37.78, \\'lon\\': -122.42, \\'tz_id\\': \\'America/Los_Angeles\\', \\'localtime_epoch\\': 1712938752, \\'localtime\\': \\'2024-04-12 9:19\\'}, \\'current\\': {\\'last_updated_epoch\\': 1712938500, \\'last_updated\\': \\'2024-04-12 09:15\\', \\'temp_c\\': 12.2, \\'temp_f\\': 54.0, \\'is_day\\': 1, \\'condition\\': {\\'text\\': \\'Partly cloudy\\', \\'icon\\': \\'//cdn.weatherapi.com/weather/64x64/day/116.png\\', \\'code\\': 1003}, \\'wind_mph\\': 11.9, \\'wind_kph\\': 19.1, \\'wind_degree\\': 260, \\'wind_dir\\': \\'W\\', \\'pressure_mb\\': 1008.0, \\'pressure_in\\': 29.76, \\'precip_mm\\': 0.0, \\'precip_in\\': 0.0, \\'humidity\\': 77, \\'cloud\\': 75, \\'feelslike_c\\': 10.5, \\'feelslike_f\\': 51.0, \\'vis_km\\': 16.0, \\'vis_miles\\': 9.0, \\'uv\\': 4.0, \\'gust_mph\\': 12.8, \\'gust_kph\\': 20.5}}\"}]', name='tavily_search_results_json', id='1ab04e35-8850-4a78-a66c-071c83c37e55', tool_call_id='call_S1BSXnmEYRcs1Aed2obUsi4J')]\n", + "content='The current weather in San Francisco is as follows:\\n- Temperature: 12.2°C (54.0°F)\\n- Condition: Partly cloudy\\n- Wind: 11.9 mph from the west\\n- Humidity: 77%\\n- Visibility: 16.0 km (9.0 miles)\\n- UV Index: 4.0\\n\\nIf you need more detailed information or have any other questions, feel free to ask!' response_metadata={'token_usage': {'completion_tokens': 91, 'prompt_tokens': 490, 'total_tokens': 581}, 'model_name': 'gpt-3.5-turbo', 'system_fingerprint': 'fp_b28b39ffa8', 'finish_reason': 'stop', 'logprobs': None} id='run-0ac4ccf0-e8a9-4e71-9349-0020baa3e266-0'\n" ] } ], @@ -490,7 +498,7 @@ "id": "c0ebc4b8-b2cc-4394-bb5a-8964bafa8d2d", "metadata": {}, "source": [ - "See LangSmith example run here https://smith.langchain.com/public/12ac5112-f550-4dc2-ae7c-4b813b9f65dd/r" + "See LangSmith example run here https://smith.langchain.com/public/c33c04c5-f1f2-4977-9d7d-c48f28be7be2/r" ] }, { @@ -519,7 +527,7 @@ }, { "cell_type": "code", - "execution_count": 16, + "execution_count": 14, "id": "5a68afc0-606f-4294-a872-b2b563be0d69", "metadata": {}, "outputs": [], @@ -529,7 +537,7 @@ }, { "cell_type": "code", - "execution_count": 14, + "execution_count": 15, "id": "08ae8246-11d5-40e1-8567-361e5bef8917", "metadata": {}, "outputs": [ @@ -537,7 +545,7 @@ "name": "stdout", "output_type": "stream", "text": [ - "content='' additional_kwargs={'function_call': {'arguments': '{\"query\":\"current weather in San Francisco\"}', 'name': 'tavily_search_results_json'}} response_metadata={'token_usage': {'completion_tokens': 22, 'prompt_tokens': 88, 'total_tokens': 110}, 'model_name': 'gpt-3.5-turbo', 'system_fingerprint': 'fp_b28b39ffa8', 'finish_reason': 'function_call', 'logprobs': None} id='run-966f6180-3c8f-42d5-af89-906650c46ab5-0'\n" + "content='' additional_kwargs={'tool_calls': [{'id': 'call_ZzRMxOoMFp5ydcbpAQptdHbL', 'function': {'arguments': '{\"query\":\"weather in San Francisco\"}', 'name': 'tavily_search_results_json'}, 'type': 'function'}]} response_metadata={'token_usage': {'completion_tokens': 21, 'prompt_tokens': 88, 'total_tokens': 109}, 'model_name': 'gpt-3.5-turbo', 'system_fingerprint': 'fp_b28b39ffa8', 'finish_reason': 'tool_calls', 'logprobs': None} id='run-1b01c302-8e24-43fe-9324-572d67bc529e-0' tool_calls=[{'name': 'tavily_search_results_json', 'args': {'query': 'weather in San Francisco'}, 'id': 'call_ZzRMxOoMFp5ydcbpAQptdHbL'}]\n" ] } ], @@ -553,7 +561,7 @@ "id": "c53352c8-dcf7-48b5-940c-f75a279cb42c", "metadata": {}, "source": [ - "See LangSmith example run here https://smith.langchain.com/public/54d37892-9ff4-48a8-8be9-bb9ff537de68/r\n", + "See LangSmith example run here https://smith.langchain.com/public/22402055-a50e-4d82-8b3e-733c9d752bc5/r\n", "This time it executed the \"agent\" node same as before, and you can see in the LangSmith trace that \"should_continue\" returned \"continue\", but it paused execution per our setting above." ] }, @@ -567,15 +575,46 @@ }, { "cell_type": "code", - "execution_count": 17, + "execution_count": 16, "id": "5a53df78-6c25-4176-b049-02a02a713771", "metadata": {}, "outputs": [ { "data": { "text/plain": [ - "{'function_call': {'arguments': '{\"query\":\"current weather in San Francisco\"}',\n", - " 'name': 'tavily_search_results_json'}}" + "('action',)" + ] + }, + "execution_count": 16, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "current_values = app_w_interrupt.get_state(thread)\n", + "current_values.next" + ] + }, + { + "cell_type": "markdown", + "id": "a901e2d1-dcf4-470c-88c0-2e4c91307f69", + "metadata": {}, + "source": [ + "Because we asked to interrupt the graph before getting to the action node, the next node to execute, if we were to resume, would be the \"action\" node." + ] + }, + { + "cell_type": "code", + "execution_count": 17, + "id": "9bad3f92-a3b9-4370-a1f5-0b78d1b67602", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "[{'name': 'tavily_search_results_json',\n", + " 'args': {'query': 'weather in San Francisco'},\n", + " 'id': 'call_ZzRMxOoMFp5ydcbpAQptdHbL'}]" ] }, "execution_count": 17, @@ -584,8 +623,7 @@ } ], "source": [ - "current_values = app_w_interrupt.get_state(thread)\n", - "current_values.values[-1].additional_kwargs" + "current_values.values[-1].tool_calls" ] }, { @@ -603,8 +641,7 @@ "metadata": {}, "outputs": [], "source": [ - "current_values.values[-1].additional_kwargs = {'function_call': {'arguments': '{\"query\":\"weather in San Francisco today\"}',\n", - " 'name': 'tavily_search_results_json'}}" + "current_values.values[-1].tool_calls[0]['args']['query'] = \"weather in San Francisco today\"" ] }, { @@ -617,7 +654,7 @@ "data": { "text/plain": [ "{'configurable': {'thread_id': '4',\n", - " 'thread_ts': '2024-04-02T23:05:41.595778+00:00'}}" + " 'thread_ts': '2024-04-12T16:19:26.369199+00:00'}}" ] }, "execution_count": 19, @@ -634,7 +671,7 @@ "id": "0a21b87a-319c-4a93-9ac1-a3c6ad3f5400", "metadata": {}, "source": [ - "This actually produces a LangSmith run too! See it here https://smith.langchain.com/public/0f3ed712-35a3-4a34-8353-85780dc1bd05/r\n", + "This actually produces a LangSmith run too! See it here https://smith.langchain.com/public/9d86718b-333e-4175-bec0-9a64cdd01dc3/r\n", "\n", "This is a shorter run that allows you to inspect the edges that reacted to the state update, you can see \"should_continue\" returned \"continue\" as before, given this is still a function call." ] @@ -649,18 +686,18 @@ }, { "cell_type": "code", - "execution_count": 22, + "execution_count": 20, "id": "4a7dfaab-bfa7-47c7-8b93-2b06b3560809", "metadata": {}, "outputs": [ { "data": { "text/plain": [ - "[HumanMessage(content='what is the weather in sf currently', id='06076c4e-40fe-4f44-978a-612fed60849c'),\n", - " AIMessage(content='', additional_kwargs={'function_call': {'arguments': '{\"query\":\"weather in San Francisco today\"}', 'name': 'tavily_search_results_json'}}, response_metadata={'token_usage': {'completion_tokens': 22, 'prompt_tokens': 88, 'total_tokens': 110}, 'model_name': 'gpt-3.5-turbo', 'system_fingerprint': 'fp_b28b39ffa8', 'finish_reason': 'function_call', 'logprobs': None}, id='run-966f6180-3c8f-42d5-af89-906650c46ab5-0')]" + "[HumanMessage(content='what is the weather in sf currently', id='27b8dc9e-0e43-4c20-bb9f-53ee27c791f1'),\n", + " AIMessage(content='', additional_kwargs={'tool_calls': [{'id': 'call_ZzRMxOoMFp5ydcbpAQptdHbL', 'function': {'arguments': '{\"query\":\"weather in San Francisco\"}', 'name': 'tavily_search_results_json'}, 'type': 'function'}]}, response_metadata={'token_usage': {'completion_tokens': 21, 'prompt_tokens': 88, 'total_tokens': 109}, 'model_name': 'gpt-3.5-turbo', 'system_fingerprint': 'fp_b28b39ffa8', 'finish_reason': 'tool_calls', 'logprobs': None}, id='run-1b01c302-8e24-43fe-9324-572d67bc529e-0', tool_calls=[{'name': 'tavily_search_results_json', 'args': {'query': 'weather in San Francisco today'}, 'id': 'call_ZzRMxOoMFp5ydcbpAQptdHbL'}])]" ] }, - "execution_count": 22, + "execution_count": 20, "metadata": {}, "output_type": "execute_result" } @@ -671,7 +708,7 @@ }, { "cell_type": "code", - "execution_count": 23, + "execution_count": 21, "id": "77d73f33-93cb-41db-b6bb-81697569fdb0", "metadata": {}, "outputs": [ @@ -681,7 +718,7 @@ "('action',)" ] }, - "execution_count": 23, + "execution_count": 21, "metadata": {}, "output_type": "execute_result" } @@ -700,7 +737,7 @@ }, { "cell_type": "code", - "execution_count": 24, + "execution_count": 22, "id": "273d56a8-f40f-4a51-a27f-7c6bb2bda0ba", "metadata": {}, "outputs": [ @@ -708,8 +745,8 @@ "name": "stdout", "output_type": "stream", "text": [ - "content='[{\\'url\\': \\'https://weather.com/weather/hourbyhour/l/USCA0987:1:US\\', \\'content\\': \"recents\\\\nSpecialty Forecasts\\\\nHourly Weather-San Francisco, CA\\\\nBeach Hazard Statement\\\\nSaturday, November 25\\\\n5 pm\\\\nClear\\\\n6 pm\\\\nClear\\\\n7 pm\\\\nClear\\\\n8 pm\\\\nMostly Clear\\\\n9 pm\\\\nPartly Cloudy\\\\n10 pm\\\\nPartly Cloudy\\\\n11 pm\\\\nPartly Cloudy\\\\nSunday, November 26\\\\n12 am\\\\nPartly Cloudy\\\\n1 am\\\\nMostly Cloudy\\\\n2 am\\\\nMostly Cloudy\\\\n3 am\\\\nMostly Cloudy\\\\n4 am\\\\nCloudy\\\\n5 am\\\\nCloudy\\\\n6 am\\\\nMostly Cloudy\\\\n7 am\\\\nMostly Cloudy\\\\n8 am\\\\nMostly Cloudy\\\\n9 am\\\\nMostly Cloudy\\\\n10 am\\\\nPartly Cloudy\\\\n11 am\\\\nPartly Cloudy\\\\n12 pm\\\\nPartly Cloudy\\\\n1 pm\\\\nPartly Cloudy\\\\n2 pm\\\\nPartly Cloudy\\\\n3 pm\\\\nPartly Cloudy\\\\n4 pm\\\\nPartly Cloudy\\\\n5 pm\\\\nPartly Cloudy\\\\n6 pm\\\\nPartly Cloudy\\\\n7 pm\\\\nPartly Cloudy\\\\n8 pm\\\\nPartly Cloudy\\\\n9 pm\\\\nMostly Clear\\\\n10 pm\\\\nMostly Clear\\\\n11 pm\\\\nMostly Clear\\\\nMonday, November 27\\\\n12 am\\\\nClear\\\\n1 am\\\\nMostly Clear\\\\n2 am\\\\nMostly Clear\\\\n3 am\\\\nPartly Cloudy\\\\n4 am\\\\nMostly Clear\\\\n5 am\\\\nMostly Clear\\\\n6 am\\\\nClear\\\\n7 am\\\\nClear\\\\n8 am\\\\nSunny\\\\n9 am\\\\nSunny\\\\n10 am\\\\nSunny\\\\n11 am\\\\nSunny\\\\n12 pm\\\\nMostly Sunny\\\\n1 pm\\\\nPartly Cloudy\\\\n2 pm\\\\nMostly Sunny\\\\n3 pm\\\\nMostly Sunny\\\\n4 pm\\\\nPartly Cloudy\\\\nRadar\\\\nSafety First!\\\\n Don\\'t Miss\\\\nIrresistible\\\\nWeather Wonders\\\\nOur Amazing World\\\\nCelestial Symphony\\\\nFried Turkey Fail\\\\nLook At That!\\\\n Health & Activities\\\\nSeasonal Allergies and Pollen Count Forecast\\\\nNo pollen detected in your area\\\\nCold & Flu Forecast\\\\nFlu risk is low in your area\\\\nWe recognize our responsibility to use data and technology for good. Changes For Critters\\\\nHurricane Tracker\\\\nStay Safe\\\\nAir Quality Index\\\\nAir quality is considered satisfactory, and air pollution poses little or no risk.\\\\n Take control of your data.\\\\n\"}]' name='tavily_search_results_json' id='97fa7a07-399e-4c5d-8175-624be906c574'\n", - "content='The current weather in San Francisco is partly cloudy. The temperature is expected to remain consistent with partly cloudy conditions throughout the day.' response_metadata={'token_usage': {'completion_tokens': 26, 'prompt_tokens': 661, 'total_tokens': 687}, 'model_name': 'gpt-3.5-turbo', 'system_fingerprint': 'fp_b28b39ffa8', 'finish_reason': 'stop', 'logprobs': None} id='run-b99e4fd0-7688-4db7-a677-bf8ba9b8698e-0'\n" + "[ToolMessage(content='[{\"url\": \"https://www.weatherapi.com/\", \"content\": \"{\\'location\\': {\\'name\\': \\'San Francisco\\', \\'region\\': \\'California\\', \\'country\\': \\'United States of America\\', \\'lat\\': 37.78, \\'lon\\': -122.42, \\'tz_id\\': \\'America/Los_Angeles\\', \\'localtime_epoch\\': 1712938752, \\'localtime\\': \\'2024-04-12 9:19\\'}, \\'current\\': {\\'last_updated_epoch\\': 1712938500, \\'last_updated\\': \\'2024-04-12 09:15\\', \\'temp_c\\': 12.2, \\'temp_f\\': 54.0, \\'is_day\\': 1, \\'condition\\': {\\'text\\': \\'Partly cloudy\\', \\'icon\\': \\'//cdn.weatherapi.com/weather/64x64/day/116.png\\', \\'code\\': 1003}, \\'wind_mph\\': 11.9, \\'wind_kph\\': 19.1, \\'wind_degree\\': 260, \\'wind_dir\\': \\'W\\', \\'pressure_mb\\': 1008.0, \\'pressure_in\\': 29.76, \\'precip_mm\\': 0.0, \\'precip_in\\': 0.0, \\'humidity\\': 77, \\'cloud\\': 75, \\'feelslike_c\\': 10.5, \\'feelslike_f\\': 51.0, \\'vis_km\\': 16.0, \\'vis_miles\\': 9.0, \\'uv\\': 4.0, \\'gust_mph\\': 12.8, \\'gust_kph\\': 20.5}}\"}]', name='tavily_search_results_json', id='578c3d3b-f905-412e-992a-4e08c4324f8b', tool_call_id='call_ZzRMxOoMFp5ydcbpAQptdHbL')]\n", + "content='The current weather in San Francisco is partly cloudy with a temperature of 12.2°C (54.0°F). The wind speed is 11.9 mph coming from the west. The humidity is at 77%, and the visibility is 16.0 km.' response_metadata={'token_usage': {'completion_tokens': 56, 'prompt_tokens': 466, 'total_tokens': 522}, 'model_name': 'gpt-3.5-turbo', 'system_fingerprint': 'fp_b28b39ffa8', 'finish_reason': 'stop', 'logprobs': None} id='run-e28b3232-f2a0-4b22-bedd-0738788c9449-0'\n" ] } ], @@ -724,7 +761,7 @@ "id": "14d288a5-1027-4a12-898c-1c6bfcc19bb6", "metadata": {}, "source": [ - "See this run in LangSmith here https://smith.langchain.com/public/51c7843b-039a-4efc-bcbd-3f93ad3cbd13/r\n", + "See this run in LangSmith here https://smith.langchain.com/public/8262c0f9-0701-4d73-95f6-2a32f6d3f96a/r\n", "\n", "This continues where we left off, with \"action\" node, followed by \"agent\" node, which terminates the execution." ] diff --git a/langgraph/graph/graph.py b/langgraph/graph/graph.py index dbed8a527..5830e3a9c 100644 --- a/langgraph/graph/graph.py +++ b/langgraph/graph/graph.py @@ -355,7 +355,6 @@ class CompiledGraph(Pregel): graph.add_edge(start_nodes[start], end_nodes[end]) for start, branches in self.graph.branches.items(): for name, branch in branches.items(): - name = f"{start}_{name}" cond = graph.add_node(branch.condition, name) graph.add_edge(start_nodes[start], cond) ends = branch.ends or { diff --git a/tests/__snapshots__/test_pregel.ambr b/tests/__snapshots__/test_pregel.ambr index 79d9337f2..129044fcb 100644 --- a/tests/__snapshots__/test_pregel.ambr +++ b/tests/__snapshots__/test_pregel.ambr @@ -46,7 +46,7 @@ } }, { - "id": "__start___should_start", + "id": "should_start", "type": "runnable", "data": { "id": [ @@ -59,7 +59,7 @@ } }, { - "id": "left_condition", + "id": "condition", "type": "runnable", "data": { "id": [ @@ -79,34 +79,34 @@ }, { "source": "__start__", - "target": "__start___should_start" + "target": "should_start" }, { - "source": "__start___should_start", + "source": "should_start", "target": "left", "data": "go-left" }, { - "source": "__start___should_start", + "source": "should_start", "target": "right", "data": "go-right" }, { "source": "left", - "target": "left_condition" + "target": "condition" }, { - "source": "left_condition", + "source": "condition", "target": "left", "data": "left" }, { - "source": "left_condition", + "source": "condition", "target": "right", "data": "right" }, { - "source": "left_condition", + "source": "condition", "target": "__end__", "data": "__end__" } @@ -116,39 +116,39 @@ # --- # name: test_conditional_entrypoint_graph.3 ''' - +-----------+ - | __start__ | - +-----------+ - * - * - * - +------------------------+ - | __start___should_start | - +------------------------+ - *** ** - * ** - ** ** - +------+ * - | left | * - +------+ * - * * - * * - * * - +----------------+ * - | left_condition | * - +----------------+* * - * ***** * - * *** * - * *** * - ** +-------+ - * | right | - *** +-------+ - * *** - *** * - * ** - +---------+ - | __end__ | - +---------+ + +-----------+ + | __start__ | + +-----------+ + * + * + * + +--------------+ + | should_start | + +--------------+ + ** ** + ** ** + * ** + +------+ * + | left | * + +------+ * + * * + * * + * * + +-----------+ * + | condition | * + +-----------+*** * + * *** * + * **** * + * ** * + * +-------+ + ** | right | + ** +-------+ + ** ** + ** ** + * * + +---------+ + | __end__ | + +---------+ ''' # --- # name: test_conditional_entrypoint_graph_state @@ -198,7 +198,7 @@ } }, { - "id": "__start___should_start", + "id": "should_start", "type": "runnable", "data": { "id": [ @@ -211,7 +211,7 @@ } }, { - "id": "left_condition", + "id": "condition", "type": "runnable", "data": { "id": [ @@ -231,34 +231,34 @@ }, { "source": "__start__", - "target": "__start___should_start" + "target": "should_start" }, { - "source": "__start___should_start", + "source": "should_start", "target": "left", "data": "go-left" }, { - "source": "__start___should_start", + "source": "should_start", "target": "right", "data": "go-right" }, { "source": "left", - "target": "left_condition" + "target": "condition" }, { - "source": "left_condition", + "source": "condition", "target": "left", "data": "left" }, { - "source": "left_condition", + "source": "condition", "target": "right", "data": "right" }, { - "source": "left_condition", + "source": "condition", "target": "__end__", "data": "__end__" } @@ -268,39 +268,39 @@ # --- # name: test_conditional_entrypoint_graph_state.3 ''' - +-----------+ - | __start__ | - +-----------+ - * - * - * - +------------------------+ - | __start___should_start | - +------------------------+ - *** ** - * ** - ** ** - +------+ * - | left | * - +------+ * - * * - * * - * * - +----------------+ * - | left_condition | * - +----------------+* * - * ***** * - * *** * - * *** * - ** +-------+ - * | right | - *** +-------+ - * *** - *** * - * ** - +---------+ - | __end__ | - +---------+ + +-----------+ + | __start__ | + +-----------+ + * + * + * + +--------------+ + | should_start | + +--------------+ + ** ** + ** ** + * ** + +------+ * + | left | * + +------+ * + * * + * * + * * + +-----------+ * + | condition | * + +-----------+*** * + * *** * + * **** * + * ** * + * +-------+ + ** | right | + ** +-------+ + ** ** + ** ** + * * + +---------+ + | __end__ | + +---------+ ''' # --- # name: test_conditional_graph[end_of_run] @@ -344,7 +344,7 @@ } }, { - "id": "agent_should_continue", + "id": "should_continue", "type": "runnable", "data": { "id": [ @@ -368,15 +368,15 @@ }, { "source": "agent", - "target": "agent_should_continue" + "target": "should_continue" }, { - "source": "agent_should_continue", + "source": "should_continue", "target": "tools", "data": "continue" }, { - "source": "agent_should_continue", + "source": "should_continue", "target": "__end__", "data": "exit" } @@ -386,27 +386,27 @@ # --- # name: test_conditional_graph[end_of_run].1 ''' - +-----------+ - | __start__ | - +-----------+ - * - * - * - +-------+ - | agent | - *+-------+* - ** *** - ** ** - ** ** - +-----------------------+ ** - | agent_should_continue | * - +-----------------------+ * - * **** * - * ***** * - * *** * - +---------+ +-------+ - | __end__ | | tools | - +---------+ +-------+ + +-----------+ + | __start__ | + +-----------+ + * + * + * + +-------+ + | agent | + +-------+* + *** *** + * * + ** *** + +-----------------+ * + | should_continue | * + +-----------------+* * + * ***** * + * *** * + * *** * + +---------+ +-------+ + | __end__ | | tools | + +---------+ +-------+ ''' # --- # name: test_conditional_graph[end_of_run].2 @@ -499,7 +499,7 @@ } }, { - "id": "agent_should_continue", + "id": "should_continue", "type": "runnable", "data": { "id": [ @@ -547,15 +547,15 @@ }, { "source": 3, - "target": "agent_should_continue" + "target": "should_continue" }, { - "source": "agent_should_continue", + "source": "should_continue", "target": "tools", "data": "continue" }, { - "source": "agent_should_continue", + "source": "should_continue", "target": "__end__", "data": "exit" } @@ -565,51 +565,51 @@ # --- # name: test_conditional_graph[end_of_run].3 ''' - +-----------+ - | __start__ | - +-----------+ - * - * - * - +------------------------------+ - | ParallelInput | - +------------------------------+ - ****** * ***** - ****** * ***** - *** * ****** - +----------------+ * *** - | PromptTemplate | * * - +----------------+ * * - * * * - * * * - * * * - +----------------------+ * * - | FakeStreamingListLLM | * * - +----------------------+ * * - * * * - * * * - * * * - +----------------------+ +-------------+ * - | Lambda(agent_parser) | | Passthrough | * - +----------------------+ +-------------+ * - ** ** * - *** *** * - ** ** * - +-------------------------------+ * - | ParallelOutput | * - +-------------------------------+ * - * * - * * - * * - +-----------------------+ * - | agent_should_continue | * - +-----------------------+******** * - * ******** * - * ******** * - * ******** * - +---------+ ***+-------+ - | __end__ | | tools | - +---------+ +-------+ + +-----------+ + | __start__ | + +-----------+ + * + * + * + +------------------------------+ + | ParallelInput | + +------------------------------+ + ***** * ***** + ****** * **** + *** * ***** + +----------------+ * *** + | PromptTemplate | * * + +----------------+ * * + * * * + * * * + * * * + +----------------------+ * * + | FakeStreamingListLLM | * * + +----------------------+ * * + * * * + * * * + * * * + +----------------------+ +-------------+ * + | Lambda(agent_parser) | | Passthrough | * + +----------------------+ +-------------+ * + *** *** * + ** ** * + ** ** * + +-------------------------------+ * + | ParallelOutput | * + +-------------------------------+ * + * * + * * + * * + +-----------------+ * + | should_continue |*** * + +-----------------+ ********* * + * ******** * + * ********* * + * ***** * + +---------+ +-------+ + | __end__ | | tools | + +---------+ +-------+ ''' # --- # name: test_conditional_graph[end_of_step] @@ -653,7 +653,7 @@ } }, { - "id": "agent_should_continue", + "id": "should_continue", "type": "runnable", "data": { "id": [ @@ -677,15 +677,15 @@ }, { "source": "agent", - "target": "agent_should_continue" + "target": "should_continue" }, { - "source": "agent_should_continue", + "source": "should_continue", "target": "tools", "data": "continue" }, { - "source": "agent_should_continue", + "source": "should_continue", "target": "__end__", "data": "exit" } @@ -695,27 +695,27 @@ # --- # name: test_conditional_graph[end_of_step].1 ''' - +-----------+ - | __start__ | - +-----------+ - * - * - * - +-------+ - | agent | - *+-------+* - ** *** - ** ** - ** ** - +-----------------------+ ** - | agent_should_continue | * - +-----------------------+ * - * **** * - * ***** * - * *** * - +---------+ +-------+ - | __end__ | | tools | - +---------+ +-------+ + +-----------+ + | __start__ | + +-----------+ + * + * + * + +-------+ + | agent | + +-------+* + *** *** + * * + ** *** + +-----------------+ * + | should_continue | * + +-----------------+* * + * ***** * + * *** * + * *** * + +---------+ +-------+ + | __end__ | | tools | + +---------+ +-------+ ''' # --- # name: test_conditional_graph[end_of_step].2 @@ -808,7 +808,7 @@ } }, { - "id": "agent_should_continue", + "id": "should_continue", "type": "runnable", "data": { "id": [ @@ -856,15 +856,15 @@ }, { "source": 3, - "target": "agent_should_continue" + "target": "should_continue" }, { - "source": "agent_should_continue", + "source": "should_continue", "target": "tools", "data": "continue" }, { - "source": "agent_should_continue", + "source": "should_continue", "target": "__end__", "data": "exit" } @@ -874,51 +874,51 @@ # --- # name: test_conditional_graph[end_of_step].3 ''' - +-----------+ - | __start__ | - +-----------+ - * - * - * - +------------------------------+ - | ParallelInput | - +------------------------------+ - ****** * ***** - ****** * ***** - *** * ****** - +----------------+ * *** - | PromptTemplate | * * - +----------------+ * * - * * * - * * * - * * * - +----------------------+ * * - | FakeStreamingListLLM | * * - +----------------------+ * * - * * * - * * * - * * * - +----------------------+ +-------------+ * - | Lambda(agent_parser) | | Passthrough | * - +----------------------+ +-------------+ * - ** ** * - *** *** * - ** ** * - +-------------------------------+ * - | ParallelOutput | * - +-------------------------------+ * - * * - * * - * * - +-----------------------+ * - | agent_should_continue | * - +-----------------------+******** * - * ******** * - * ******** * - * ******** * - +---------+ ***+-------+ - | __end__ | | tools | - +---------+ +-------+ + +-----------+ + | __start__ | + +-----------+ + * + * + * + +------------------------------+ + | ParallelInput | + +------------------------------+ + ***** * ***** + ****** * **** + *** * ***** + +----------------+ * *** + | PromptTemplate | * * + +----------------+ * * + * * * + * * * + * * * + +----------------------+ * * + | FakeStreamingListLLM | * * + +----------------------+ * * + * * * + * * * + * * * + +----------------------+ +-------------+ * + | Lambda(agent_parser) | | Passthrough | * + +----------------------+ +-------------+ * + *** *** * + ** ** * + ** ** * + +-------------------------------+ * + | ParallelOutput | * + +-------------------------------+ * + * * + * * + * * + +-----------------+ * + | should_continue |*** * + +-----------------+ ********* * + * ******** * + * ********* * + * ***** * + +---------+ +-------+ + | __end__ | | tools | + +---------+ +-------+ ''' # --- # name: test_conditional_graph_state[end_of_run] @@ -968,7 +968,7 @@ } }, { - "id": "agent_should_continue", + "id": "should_continue", "type": "runnable", "data": { "id": [ @@ -992,15 +992,15 @@ }, { "source": "agent", - "target": "agent_should_continue" + "target": "should_continue" }, { - "source": "agent_should_continue", + "source": "should_continue", "target": "tools", "data": "continue" }, { - "source": "agent_should_continue", + "source": "should_continue", "target": "__end__", "data": "exit" } @@ -1010,27 +1010,27 @@ # --- # name: test_conditional_graph_state[end_of_run].3 ''' - +-----------+ - | __start__ | - +-----------+ - * - * - * - +-------+ - | agent | - *+-------+* - ** *** - ** ** - ** ** - +-----------------------+ ** - | agent_should_continue | * - +-----------------------+ * - * **** * - * ***** * - * *** * - +---------+ +-------+ - | __end__ | | tools | - +---------+ +-------+ + +-----------+ + | __start__ | + +-----------+ + * + * + * + +-------+ + | agent | + +-------+* + *** *** + * * + ** *** + +-----------------+ * + | should_continue | * + +-----------------+* * + * ***** * + * *** * + * *** * + +---------+ +-------+ + | __end__ | | tools | + +---------+ +-------+ ''' # --- # name: test_conditional_graph_state[end_of_step] @@ -1080,7 +1080,7 @@ } }, { - "id": "agent_should_continue", + "id": "should_continue", "type": "runnable", "data": { "id": [ @@ -1104,15 +1104,15 @@ }, { "source": "agent", - "target": "agent_should_continue" + "target": "should_continue" }, { - "source": "agent_should_continue", + "source": "should_continue", "target": "tools", "data": "continue" }, { - "source": "agent_should_continue", + "source": "should_continue", "target": "__end__", "data": "exit" } @@ -1122,27 +1122,27 @@ # --- # name: test_conditional_graph_state[end_of_step].3 ''' - +-----------+ - | __start__ | - +-----------+ - * - * - * - +-------+ - | agent | - *+-------+* - ** *** - ** ** - ** ** - +-----------------------+ ** - | agent_should_continue | * - +-----------------------+ * - * **** * - * ***** * - * *** * - +---------+ +-------+ - | __end__ | | tools | - +---------+ +-------+ + +-----------+ + | __start__ | + +-----------+ + * + * + * + +-------+ + | agent | + +-------+* + *** *** + * * + ** *** + +-----------------+ * + | should_continue | * + +-----------------+* * + * ***** * + * *** * + * *** * + +---------+ +-------+ + | __end__ | | tools | + +---------+ +-------+ ''' # --- # name: test_message_graph[end_of_run] @@ -1191,7 +1191,7 @@ } }, { - "id": "agent_should_continue", + "id": "should_continue", "type": "runnable", "data": { "id": [ @@ -1215,15 +1215,15 @@ }, { "source": "agent", - "target": "agent_should_continue" + "target": "should_continue" }, { - "source": "agent_should_continue", + "source": "should_continue", "target": "action", "data": "continue" }, { - "source": "agent_should_continue", + "source": "should_continue", "target": "__end__", "data": "end" } @@ -1233,27 +1233,27 @@ # --- # name: test_message_graph[end_of_run].3 ''' - +-----------+ - | __start__ | - +-----------+ - * - * - * - +-------+ - | agent | - *+-------+* - ** *** - ** ** - ** ** - +-----------------------+ ** - | agent_should_continue | * - +-----------------------+ * - * ***** * - * **** * - * *** * - +---------+ +--------+ - | __end__ | | action | - +---------+ +--------+ + +-----------+ + | __start__ | + +-----------+ + * + * + * + +-------+ + | agent | + +-------+* + *** *** + * * + ** *** + +-----------------+ * + | should_continue | * + +-----------------+* * + * ***** * + * *** * + * *** * + +---------+ +--------+ + | __end__ | | action | + +---------+ +--------+ ''' # --- # name: test_message_graph[end_of_step] @@ -1302,7 +1302,7 @@ } }, { - "id": "agent_should_continue", + "id": "should_continue", "type": "runnable", "data": { "id": [ @@ -1326,15 +1326,15 @@ }, { "source": "agent", - "target": "agent_should_continue" + "target": "should_continue" }, { - "source": "agent_should_continue", + "source": "should_continue", "target": "action", "data": "continue" }, { - "source": "agent_should_continue", + "source": "should_continue", "target": "__end__", "data": "end" } @@ -1344,27 +1344,27 @@ # --- # name: test_message_graph[end_of_step].3 ''' - +-----------+ - | __start__ | - +-----------+ - * - * - * - +-------+ - | agent | - *+-------+* - ** *** - ** ** - ** ** - +-----------------------+ ** - | agent_should_continue | * - +-----------------------+ * - * ***** * - * **** * - * *** * - +---------+ +--------+ - | __end__ | | action | - +---------+ +--------+ + +-----------+ + | __start__ | + +-----------+ + * + * + * + +-------+ + | agent | + +-------+* + *** *** + * * + ** *** + +-----------------+ * + | should_continue | * + +-----------------+* * + * ***** * + * *** * + * *** * + +---------+ +--------+ + | __end__ | | action | + +---------+ +--------+ ''' # --- # name: test_prebuilt_chat @@ -1414,7 +1414,7 @@ } }, { - "id": "agent_should_continue", + "id": "should_continue", "type": "runnable", "data": { "id": [ @@ -1438,15 +1438,15 @@ }, { "source": "agent", - "target": "agent_should_continue" + "target": "should_continue" }, { - "source": "agent_should_continue", + "source": "should_continue", "target": "action", "data": "continue" }, { - "source": "agent_should_continue", + "source": "should_continue", "target": "__end__", "data": "end" } @@ -1456,27 +1456,27 @@ # --- # name: test_prebuilt_chat.3 ''' - +-----------+ - | __start__ | - +-----------+ - * - * - * - +-------+ - | agent | - *+-------+* - ** *** - ** ** - ** ** - +-----------------------+ ** - | agent_should_continue | * - +-----------------------+ * - * ***** * - * **** * - * *** * - +---------+ +--------+ - | __end__ | | action | - +---------+ +--------+ + +-----------+ + | __start__ | + +-----------+ + * + * + * + +-------+ + | agent | + +-------+* + *** *** + * * + ** *** + +-----------------+ * + | should_continue | * + +-----------------+* * + * ***** * + * *** * + * *** * + +---------+ +--------+ + | __end__ | | action | + +---------+ +--------+ ''' # --- # name: test_prebuilt_tool_chat @@ -1526,7 +1526,7 @@ } }, { - "id": "agent_should_continue", + "id": "should_continue", "type": "runnable", "data": { "id": [ @@ -1550,15 +1550,15 @@ }, { "source": "agent", - "target": "agent_should_continue" + "target": "should_continue" }, { - "source": "agent_should_continue", + "source": "should_continue", "target": "action", "data": "continue" }, { - "source": "agent_should_continue", + "source": "should_continue", "target": "__end__", "data": "end" } @@ -1568,26 +1568,26 @@ # --- # name: test_prebuilt_tool_chat.3 ''' - +-----------+ - | __start__ | - +-----------+ - * - * - * - +-------+ - | agent | - *+-------+* - ** *** - ** ** - ** ** - +-----------------------+ ** - | agent_should_continue | * - +-----------------------+ * - * ***** * - * **** * - * *** * - +---------+ +--------+ - | __end__ | | action | - +---------+ +--------+ + +-----------+ + | __start__ | + +-----------+ + * + * + * + +-------+ + | agent | + +-------+* + *** *** + * * + ** *** + +-----------------+ * + | should_continue | * + +-----------------+* * + * ***** * + * *** * + * *** * + +---------+ +--------+ + | __end__ | | action | + +---------+ +--------+ ''' # --- diff --git a/tests/test_pregel.py b/tests/test_pregel.py index 4f901d25c..d234ca4a9 100644 --- a/tests/test_pregel.py +++ b/tests/test_pregel.py @@ -3086,39 +3086,39 @@ def test_in_one_fan_out_state_graph_waiting_edge_via_branch( app = workflow.compile() assert app.get_graph().draw_ascii() == ( - """ +-----------+ - | __start__ | - +-----------+ - * - * - * - +---------------+ - | rewrite_query | - +---------------+ - ** ** - ** ** - ** ** -+--------------+ +-------------------------+ -| analyzer_one | | rewrite_query_condition | -+--------------+ +-------------------------+ - * * - * * - * * -+---------------+ +---------------+ -| retriever_one | | retriever_two | -+---------------+ +---------------+ - ** ** - ** ** - ** ** - +----+ - | qa | - +----+ - * - * - * - +---------+ - | __end__ | - +---------+ """ + """ +-----------+ + | __start__ | + +-----------+ + * + * + * + +---------------+ + | rewrite_query | + +---------------+ + *** *** + * * + ** ** ++--------------+ +-----------+ +| analyzer_one | | condition | ++--------------+ +-----------+ + * * + * * + * * ++---------------+ +---------------+ +| retriever_one | | retriever_two | ++---------------+ +---------------+ + *** *** + * * + ** ** + +----+ + | qa | + +----+ + * + * + * + +---------+ + | __end__ | + +---------+ """ ) assert app.invoke({"query": "what is weather in sf"}, debug=True) == { @@ -3220,39 +3220,39 @@ def test_in_one_fan_out_state_graph_waiting_edge_custom_state_class( app = workflow.compile() assert app.get_graph().draw_ascii() == ( - """ +-----------+ - | __start__ | - +-----------+ - * - * - * - +---------------+ - | rewrite_query | - +---------------+ - ** ** - ** ** - ** ** -+--------------+ +-----------------------+ -| analyzer_one | | rewrite_query_decider | -+--------------+ +-----------------------+ - * * - * * - * * -+---------------+ +---------------+ -| retriever_one | | retriever_two | -+---------------+ +---------------+ - ** ** - ** ** - ** ** - +----+ - | qa | - +----+ - * - * - * - +---------+ - | __end__ | - +---------+ """ + """ +-----------+ + | __start__ | + +-----------+ + * + * + * + +---------------+ + | rewrite_query | + +---------------+ + *** *** + * * + ** ** ++--------------+ +---------+ +| analyzer_one | | decider | ++--------------+ +---------+ + * * + * * + * * ++---------------+ +---------------+ +| retriever_one | | retriever_two | ++---------------+ +---------------+ + *** *** + * * + ** ** + +----+ + | qa | + +----+ + * + * + * + +---------+ + | __end__ | + +---------+ """ ) with pytest.raises(ValidationError): diff --git a/tests/test_pregel_async.py b/tests/test_pregel_async.py index eee44f555..e91455bf0 100644 --- a/tests/test_pregel_async.py +++ b/tests/test_pregel_async.py @@ -2825,39 +2825,39 @@ async def test_in_one_fan_out_state_graph_waiting_edge_via_branch( app = workflow.compile() assert app.get_graph().draw_ascii() == ( - """ +-----------+ - | __start__ | - +-----------+ - * - * - * - +---------------+ - | rewrite_query | - +---------------+ - ** ** - ** ** - ** ** -+--------------+ +-------------------------+ -| analyzer_one | | rewrite_query_condition | -+--------------+ +-------------------------+ - * * - * * - * * -+---------------+ +---------------+ -| retriever_one | | retriever_two | -+---------------+ +---------------+ - ** ** - ** ** - ** ** - +----+ - | qa | - +----+ - * - * - * - +---------+ - | __end__ | - +---------+ """ + """ +-----------+ + | __start__ | + +-----------+ + * + * + * + +---------------+ + | rewrite_query | + +---------------+ + *** *** + * * + ** ** ++--------------+ +-----------+ +| analyzer_one | | condition | ++--------------+ +-----------+ + * * + * * + * * ++---------------+ +---------------+ +| retriever_one | | retriever_two | ++---------------+ +---------------+ + *** *** + * * + ** ** + +----+ + | qa | + +----+ + * + * + * + +---------+ + | __end__ | + +---------+ """ ) assert await app.ainvoke({"query": "what is weather in sf"}, debug=True) == { @@ -2962,39 +2962,39 @@ async def test_in_one_fan_out_state_graph_waiting_edge_custom_state_class( app = workflow.compile() assert app.get_graph().draw_ascii() == ( - """ +-----------+ - | __start__ | - +-----------+ - * - * - * - +---------------+ - | rewrite_query | - +---------------+ - ** ** - ** ** - ** ** -+--------------+ +-----------------------+ -| analyzer_one | | rewrite_query_decider | -+--------------+ +-----------------------+ - * * - * * - * * -+---------------+ +---------------+ -| retriever_one | | retriever_two | -+---------------+ +---------------+ - ** ** - ** ** - ** ** - +----+ - | qa | - +----+ - * - * - * - +---------+ - | __end__ | - +---------+ """ + """ +-----------+ + | __start__ | + +-----------+ + * + * + * + +---------------+ + | rewrite_query | + +---------------+ + *** *** + * * + ** ** ++--------------+ +---------+ +| analyzer_one | | decider | ++--------------+ +---------+ + * * + * * + * * ++---------------+ +---------------+ +| retriever_one | | retriever_two | ++---------------+ +---------------+ + *** *** + * * + ** ** + +----+ + | qa | + +----+ + * + * + * + +---------+ + | __end__ | + +---------+ """ ) with pytest.raises(ValidationError):