diff --git a/examples/subgraph.ipynb b/examples/subgraph.ipynb index 1bfb7b6a0..cd6ae9252 100644 --- a/examples/subgraph.ipynb +++ b/examples/subgraph.ipynb @@ -46,7 +46,7 @@ }, { "cell_type": "code", - "execution_count": 42, + "execution_count": 1, "metadata": {}, "outputs": [], "source": [ @@ -88,7 +88,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 2, "metadata": {}, "outputs": [], "source": [ @@ -116,17 +116,17 @@ }, { "cell_type": "code", - "execution_count": 43, + "execution_count": 3, "metadata": {}, "outputs": [ { "data": { - "image/png": "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F8OHO+nXz7jNWtwvLc0IO9Onm1m71k6DBiHceutd3H777URFRbm7PBEpfwo4IueTl5fHp59+yjvvvMHBg0fo2NHM2LF2Ro70rLubPNHBg/DVVzB5sg8HDliJi7uap556jhtuuEHjdUSqDgUckdMdOnSI9957j8mT/43LVczdd9t58EHj1m2pXJxOWLoU3nnHmx9+cNC6dQsee+wpbr31Vnx8fNxdnoiULQUcETDmqnn77bd5883XCApyMm6cnYcegtq13V2ZlIbt2+GDD7z44gsToaFhvPzya9x2223q0RHxXAo4UrXZ7XYmT57MhAnP43Dk8cILdu6/H/QHvmc6eBCee86L6dNddOkSyz//OYkuXbq4uywRKX1rq/gUY1KVJScn07t3HI888lduvDGLpCQ7jzyicOPJGjWC//7Xyfr1Lnx8EunWrRv33XcfhYWF7i5NREqZAo5USZMnT6Zt29acOJHItm1O/vMf3eZdlXTsCAkJdqZOdTFjxqd06dKRbdu2ubssESlFCjhSpdhsNsaMuZX77x/HQw+d4OefbbRq5e6qxF3GjIGtW+3UqLGfq6+OZfbs2e4uSURKiQKOVBlFRUUMHTqYb76ZweLFLv7xDyivxatzcuCxx2Dhwis/xyOPgMlkPLZvv/jrl+POO0vOcfDgldc4YkTJeTIzr/w85SkiApYvtzN2rI2RI0cwZcoUd5ckIqXA7O4CRMqD1Wrl+uv7sWPHOn76yUHnzuXX9sqVMGwYZGQYSzhIxePtDe+9B3XqOLnvvvuwWq088MAD7i5LRP4EBRypEp588m9s3ryOn3+2Ex1dvm0nJhrhBoyejYro+efhvvuM7bp13VuLO/3972A2u3j00Ydp37493bp1c3dJInKFFHDE482dO5dJk97nq69c5R5uli2D9etLnickGJerBg48c46dbdtg+XJISYFWraBnT8p1bNDRo7B/v7Hdtu25d5I5HEZQW7kS0tOhTRvo0wcaNLi088+dC3l5xvZVV0FMTMl77v7sZ3vmGVi/3sWIEUNJTNxBcHCw+4oRkSvnEvFg+fn5rnr1gl1jx5pcLhfl/hg4EBec+0hMNN53OHA99xwuL68z3zebcb32Gi6ns+RcDz9c8v62bRd//XIed9xRco7U1DPf27cPV8OG536GgABcH3545r4331zyfkaG8dprr5W81qEDrpyc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gvHjx7N7927atWvH1q1by7DaMzVr1oyPPvqIvn37llubIiKlQD04ImUpKSmJYcOGceTIEb755huGDBlyycceOnSIxx9/nFmzZuHt7Q3A2LFjy6rU8zp27Bi33noru3fv1qrbIlKpaDVxkTIyY8YMOnXqRGBgIImJiZccbmw2G++99x4tW7bkm2++AYzLS2azmZEjR5ZlyWdwOp3k5+eTnp7OuHHjyq1dEZHSoIAjUsrsdjtPP/00o0aNYvTo0axYsYJGjRpd0rE//fQTrVu35vHHH6ewsBCbzQaA2WzmxhtvpE45TpSTk5PDySvYs2bN4quvviq3tkVE/iwFHJFSlJaWRs+ePfnwww/56quv+M9//nNJdxH9+uuv3HTTTfTt25cDBw7gcDjOeN9ut3P33XeXVdnnlZWVdWrbZDIxduxYDh48WK41iIhcKQUckVKybNkyYmNjycrK4ueff76ky0mFhYVMmDCB1q1b8+233wLGpaGzhYaGlvtA35N3XwG4XC6Ki4sZM2YMui9BRCoDBRyRP8npdPLCCy/Qr18/+vfvz6ZNm4iOjr7ocV9//TXNmjXj1VdfxWq1nrocdTaLxcK99957aqBxeTm9BweMsUGrVq1i0qRJ5VqHiMiVUMAR+ROys7MZOHAgb731Fh999BGff/75Jd8CbrVayczMvGiPiN1u54477iiFai/P2QEHjDD3t7/9je3bt5d7PSIil0MBR+QK7d27l27durFlyxaWL1/Ovffee1nH33LLLaxcuZKaNWtisVjOu4+XlxddunShWbNmpVHyZcnKyjrvmlAul4vRo0djtVrLvSYRkUulgCNyBRYuXEjnzp2pXbs2GzdupEuXLld0ni5durBlyxZatmx5wQUmy3vum5Oys7PPe1nMbreTlJTExIkT3VCViMilUcARuQwul4s33niDwYMHM2LECJYtW0a9evX+1DkbNmzIgAEDcDqdeHmd+S3p6+vLsGHD/tT5r9T5LlGdZLfbee2111ixYkU5ViQicukUcEQuUV5eHkOHDuXFF1/ko48+uuRbwC9m1qxZvPXWW3zwwQc8+OCDp163WCyMHDmSgICAP93GlcjOzj7vHV0neXl5cdttt5Gfn3/BfURE3EVLNYhcgr179zJo0CByc3NJSEiga9eupXLetWvXMmbMGB5//HHGjx8PQKtWrXjwwQex2Wzc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EaIeWL9+vaLRaJRvvvnG7OcqLy9XBg8erDRr1kxJTU2tXD98+HBl6NChiqIoSl5enuLh4aFMnDix2veOGjVKCQkJqXzv4OCgfPrpp1d9fyPc3NyUDz74QFEURUlNTVXs7e2Vd999t9o+DzzwgNKkSROlvLxcURRF8fT0VObMmaP88MMPiq2trTJ//vzKfW80u6mdOXNGAZQdO3aY7RxCCHGDdksLjlBdVlYWkydPZuTIkTz44INmP9+zzz7L7t27+d///oe/v/8V90lISCA/P5/u3buzb9++yqV9+/YcP36c7Oxss2RLSEhAp9Px0EMPVVs/YcIEMjIyOHnyZOW67du3M378eMaMGcOTTz6penZ/f3+0Wq3cphJC1AvSyVioSlEUJk+ejLOzs0U623788cd8+eWXrF69mu7du191v5SUFACefvrpq2738fExeb7k5GQ0Gg3NmjWrtv5iIZaenk5oaCgAGzduJDQ0lB9//JHTp08TGBioanaNRkPbtm05evSoyY8thBA1JS04QlWffvopGzdu5Ntvv8XDw8Os59q4cSPTp09nzpw5DB8+/Jr7XhxYcOfOnRQXF1+2XOzrYmre3t4oikJeXl619Tk5OQDVxgSaMGECe/fuxd3dvVoLjlrZQToaCyHqDylwhGoSExN55ZVXeO211+jdu7dZz3X48GHGjh3LQw89xPTp06+4j0ajwWAwAMYOswBr167FxcWlcomKimLKlCnodDqz5Lw4IvD27durrd++fTtubm60bNmy2r7u7u7MmzePDRs28N1336maHYwFjoyFI4SoD6TAEaooKSlhzJgxdOvWjZkzZ5r1XNnZ2URGRtK5c2f++9//XnU/Nzc3kpKS2LlzJ/7+/owaNYrFixczf/58cnNz2bx5M9OmTcPf399s82KFhYVx11138a9//Yu4uDjKyspYu3YtH374IVOmTLniZKOjR4/mzjvv5LnnnuP8+fOEhISokh2MxdXp06e5cOGC2c4hhBA3RO1uzsI6vfDCC4qHh4eSkpJi1vOUlJQoERERSlBQkHLu3Llr7rt582bF3d1dAZTt27crubm5yoQJExQ7OzsFUJo2bao89thjyoULFyq/x9RPUSmKomRlZSkjR45UbGxsFI1Go/j6+iovv/xyte+5+BTVRSdOnFCcnJyUhx9+WFEU5Yaym0NiYqICKPHx8WY9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", + "image/png": "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", "text/plain": [ "" ] }, - "execution_count": 43, + "execution_count": 3, "metadata": {}, "output_type": "execute_result" } @@ -139,7 +139,7 @@ }, { "cell_type": "code", - "execution_count": 22, + "execution_count": 4, "metadata": {}, "outputs": [ { @@ -169,7 +169,7 @@ }, { "cell_type": "code", - "execution_count": 38, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ @@ -226,7 +226,7 @@ }, { "cell_type": "code", - "execution_count": 39, + "execution_count": null, "metadata": {}, "outputs": [ { @@ -247,7 +247,7 @@ }, { "cell_type": "code", - "execution_count": 40, + "execution_count": null, "metadata": {}, "outputs": [ { @@ -307,7 +307,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.11.2" + "version": "3.11.8" } }, "nbformat": 4, diff --git a/examples/time-travel.ipynb b/examples/time-travel.ipynb index c34f49cf9..c10c2cd5b 100644 --- a/examples/time-travel.ipynb +++ b/examples/time-travel.ipynb @@ -57,7 +57,7 @@ "metadata": {}, "outputs": [ { - "name": "stdin", + "name": "stdout", "output_type": "stream", "text": [ "OpenAI API Key: ········\n", @@ -239,13 +239,6 @@ " return \"continue\"\n", "\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", - "\n", "# Define the function to execute tools\n", "def call_tool(messages):\n", " # Based on the continue condition\n", @@ -289,7 +282,7 @@ "workflow = MessageGraph()\n", "\n", "# Define the two nodes we will cycle between\n", - "workflow.add_node(\"agent\", call_model)\n", + "workflow.add_node(\"agent\", model)\n", "workflow.add_node(\"action\", call_tool)\n", "\n", "# Set the entrypoint as `agent`\n", @@ -377,7 +370,7 @@ "name": "stdout", "output_type": "stream", "text": [ - "content='Hello Bob! How can I assist you today?' id='019fe7a8-f43d-4f83-8bbd-b1c553f32aa0'\n" + "content='Hello Bob! How can I assist you today?' id='87e8b88a-b28e-4517-a62f-7b9baebd3329'\n" ] } ], @@ -408,7 +401,7 @@ { "data": { "text/plain": [ - "StateSnapshot(values=[HumanMessage(content=\"hi! I'm bob\", id='774c03a0-4f61-49f1-8447-6fa5cbc3e56e'), AIMessage(content='Hello Bob! How can I assist you today?', id='019fe7a8-f43d-4f83-8bbd-b1c553f32aa0')], next=(), config={'configurable': {'thread_id': '3', 'thread_ts': '2024-04-02T00:09:43.801248+00:00'}}, parent_config=None)" + "StateSnapshot(values=[HumanMessage(content=\"hi! I'm bob\", id='5a84a602-37d9-4903-9c3c-d0f892238580'), AIMessage(content='Hello Bob! How can I assist you today?', id='87e8b88a-b28e-4517-a62f-7b9baebd3329')], next=(), config={'configurable': {'thread_id': '3', 'thread_ts': '2024-04-02T17:13:46.250299+00:00'}}, parent_config=None)" ] }, "execution_count": 10, @@ -438,7 +431,7 @@ "name": "stdout", "output_type": "stream", "text": [ - "content='' additional_kwargs={'function_call': {'arguments': '{\"query\":\"current weather in San Francisco\"}', 'name': 'tavily_search_results_json'}} id='79bcb08c-0cb4-4b37-aa68-4df08b3a290f'\n" + "content='' additional_kwargs={'function_call': {'arguments': '{\"query\":\"current weather in San Francisco\"}', 'name': 'tavily_search_results_json'}} id='8e6ae8d5-a258-47aa-9e2c-1ca3e78add90'\n" ] } ], @@ -509,7 +502,7 @@ "data": { "text/plain": [ "{'configurable': {'thread_id': '3',\n", - " 'thread_ts': '2024-04-02T00:09:44.323782+00:00'}}" + " 'thread_ts': '2024-04-02T16:58:19.692203+00:00'}}" ] }, "execution_count": 14, @@ -538,7 +531,7 @@ { "data": { "text/plain": [ - "StateSnapshot(values=[HumanMessage(content=\"hi! I'm bob\", id='774c03a0-4f61-49f1-8447-6fa5cbc3e56e'), AIMessage(content='Hello Bob! How can I assist you today?', id='019fe7a8-f43d-4f83-8bbd-b1c553f32aa0'), HumanMessage(content='what is the weather in sf currently', id='4138a1b0-3053-4b12-ad15-6198be969947'), AIMessage(content='', additional_kwargs={'function_call': {'arguments': '{\"query\":\"weather in San Francisco today\"}', 'name': 'tavily_search_results_json'}}, id='79bcb08c-0cb4-4b37-aa68-4df08b3a290f')], next=('action',), config={'configurable': {'thread_id': '3', 'thread_ts': '2024-04-02T00:09:44.323782+00:00'}}, parent_config=None)" + "StateSnapshot(values=[HumanMessage(content=\"hi! I'm bob\", id='1493cdf4-b7b5-46c9-a3e7-ad3b661fcb92'), AIMessage(content='Hello Bob! How can I assist you today?', id='028e0185-2ca4-4c1d-8660-93c17b839275'), HumanMessage(content='what is the weather in sf currently', id='76d6a5ff-d400-4edb-a264-b584107e2231'), AIMessage(content='', additional_kwargs={'function_call': {'arguments': '{\"query\":\"weather in San Francisco today\"}', 'name': 'tavily_search_results_json'}}, id='b143d5f6-5216-4a48-b76a-68b2f3eb6ff2')], next=('action',), config={'configurable': {'thread_id': '3', 'thread_ts': '2024-04-02T16:58:19.692203+00:00'}}, parent_config=None)" ] }, "execution_count": 15, @@ -568,8 +561,8 @@ "name": "stdout", "output_type": "stream", "text": [ - "content=\"[{'url': 'https://forecast.weather.gov/zipcity.php?inputstring=San francisco,CA', 'content': 'Detailed Forecast. Today. Mostly sunny, with a high near 62. Light and variable wind becoming west southwest 5 to 8 mph in the afternoon. Tonight. Mostly clear, with a low around 49. West wind 5 to 8 mph becoming north northwest after midnight. Monday. Sunny, with a high near 67.'}]\" name='tavily_search_results_json' id='388a34ca-6b79-4eb2-84e7-34849ce7c4cf'\n", - "content='The weather in San Francisco today is mostly sunny with a high near 62 degrees Fahrenheit. The wind is light and variable, becoming west-southwest at 5 to 8 mph in the afternoon. Tonight will be mostly clear with a low around 49 degrees Fahrenheit. Tomorrow is expected to be sunny with a high near 67 degrees Fahrenheit.' id='5d5ac23c-0e64-462d-b9ef-c499a417e906'\n" + "content=\"[{'url': 'https://forecast.weather.gov/zipcity.php?inputstring=San francisco,CA', 'content': 'Detailed Forecast. Today. Mostly sunny, with a high near 62. Light and variable wind becoming west southwest 5 to 8 mph in the afternoon. Tonight. Mostly clear, with a low around 49. West wind 5 to 8 mph becoming north northwest after midnight. Monday. Sunny, with a high near 67.'}]\" name='tavily_search_results_json' id='9b33eb74-b079-4615-9c8a-9f41b4e176ba'\n", + "content='The weather in San Francisco today is mostly sunny with a high near 62 degrees Fahrenheit. The wind is light and variable, becoming west-southwest at 5 to 8 mph in the afternoon. Tonight, it will be mostly clear with a low around 49 degrees Fahrenheit. Tomorrow is expected to be sunny with a high near 67 degrees Fahrenheit.' id='18ff870d-5d5d-40d9-9eca-72e345749b51'\n" ] } ], @@ -591,7 +584,7 @@ }, { "cell_type": "code", - "execution_count": 19, + "execution_count": 17, "id": "8578a66d-6489-4e03-8c23-fd0530278455", "metadata": {}, "outputs": [ @@ -599,13 +592,13 @@ "name": "stdout", "output_type": "stream", "text": [ - "StateSnapshot(values=[HumanMessage(content=\"hi! I'm bob\", id='774c03a0-4f61-49f1-8447-6fa5cbc3e56e'), AIMessage(content='Hello Bob! How can I assist you today?', id='019fe7a8-f43d-4f83-8bbd-b1c553f32aa0'), HumanMessage(content='what is the weather in sf currently', id='4138a1b0-3053-4b12-ad15-6198be969947'), AIMessage(content='', additional_kwargs={'function_call': {'arguments': '{\"query\":\"weather in San Francisco today\"}', 'name': 'tavily_search_results_json'}}, id='79bcb08c-0cb4-4b37-aa68-4df08b3a290f'), FunctionMessage(content=\"[{'url': 'https://forecast.weather.gov/zipcity.php?inputstring=San francisco,CA', 'content': 'Detailed Forecast. Today. Mostly sunny, with a high near 62. Light and variable wind becoming west southwest 5 to 8 mph in the afternoon. Tonight. Mostly clear, with a low around 49. West wind 5 to 8 mph becoming north northwest after midnight. Monday. Sunny, with a high near 67.'}]\", name='tavily_search_results_json', id='388a34ca-6b79-4eb2-84e7-34849ce7c4cf'), AIMessage(content='The weather in San Francisco today is mostly sunny with a high near 62 degrees Fahrenheit. The wind is light and variable, becoming west-southwest at 5 to 8 mph in the afternoon. Tonight will be mostly clear with a low around 49 degrees Fahrenheit. Tomorrow is expected to be sunny with a high near 67 degrees Fahrenheit.', id='5d5ac23c-0e64-462d-b9ef-c499a417e906')], next=(), config={'configurable': {'thread_id': '3', 'thread_ts': '2024-04-02T00:09:48.961894+00:00'}}, parent_config=None)\n", + "StateSnapshot(values=[HumanMessage(content=\"hi! I'm bob\", id='1493cdf4-b7b5-46c9-a3e7-ad3b661fcb92'), AIMessage(content='Hello Bob! How can I assist you today?', id='028e0185-2ca4-4c1d-8660-93c17b839275'), HumanMessage(content='what is the weather in sf currently', id='76d6a5ff-d400-4edb-a264-b584107e2231'), AIMessage(content='', additional_kwargs={'function_call': {'arguments': '{\"query\":\"weather in San Francisco today\"}', 'name': 'tavily_search_results_json'}}, id='b143d5f6-5216-4a48-b76a-68b2f3eb6ff2'), FunctionMessage(content=\"[{'url': 'https://forecast.weather.gov/zipcity.php?inputstring=San francisco,CA', 'content': 'Detailed Forecast. Today. Mostly sunny, with a high near 62. Light and variable wind becoming west southwest 5 to 8 mph in the afternoon. Tonight. Mostly clear, with a low around 49. West wind 5 to 8 mph becoming north northwest after midnight. Monday. Sunny, with a high near 67.'}]\", name='tavily_search_results_json', id='9b33eb74-b079-4615-9c8a-9f41b4e176ba'), AIMessage(content='The weather in San Francisco today is mostly sunny with a high near 62 degrees Fahrenheit. The wind is light and variable, becoming west-southwest at 5 to 8 mph in the afternoon. Tonight, it will be mostly clear with a low around 49 degrees Fahrenheit. Tomorrow is expected to be sunny with a high near 67 degrees Fahrenheit.', id='18ff870d-5d5d-40d9-9eca-72e345749b51')], next=(), config={'configurable': {'thread_id': '3', 'thread_ts': '2024-04-02T16:58:23.633015+00:00'}}, parent_config=None)\n", "--\n", - "StateSnapshot(values=[HumanMessage(content=\"hi! I'm bob\", id='774c03a0-4f61-49f1-8447-6fa5cbc3e56e'), AIMessage(content='Hello Bob! How can I assist you today?', id='019fe7a8-f43d-4f83-8bbd-b1c553f32aa0'), HumanMessage(content='what is the weather in sf currently', id='4138a1b0-3053-4b12-ad15-6198be969947'), AIMessage(content='', additional_kwargs={'function_call': {'arguments': '{\"query\":\"weather in San Francisco today\"}', 'name': 'tavily_search_results_json'}}, id='79bcb08c-0cb4-4b37-aa68-4df08b3a290f')], next=('action',), config={'configurable': {'thread_id': '3', 'thread_ts': '2024-04-02T00:09:44.323782+00:00'}}, parent_config=None)\n", + "StateSnapshot(values=[HumanMessage(content=\"hi! I'm bob\", id='1493cdf4-b7b5-46c9-a3e7-ad3b661fcb92'), AIMessage(content='Hello Bob! How can I assist you today?', id='028e0185-2ca4-4c1d-8660-93c17b839275'), HumanMessage(content='what is the weather in sf currently', id='76d6a5ff-d400-4edb-a264-b584107e2231'), AIMessage(content='', additional_kwargs={'function_call': {'arguments': '{\"query\":\"weather in San Francisco today\"}', 'name': 'tavily_search_results_json'}}, id='b143d5f6-5216-4a48-b76a-68b2f3eb6ff2')], next=('action',), config={'configurable': {'thread_id': '3', 'thread_ts': '2024-04-02T16:58:19.692203+00:00'}}, parent_config=None)\n", "--\n", - "StateSnapshot(values=[HumanMessage(content=\"hi! I'm bob\", id='774c03a0-4f61-49f1-8447-6fa5cbc3e56e'), AIMessage(content='Hello Bob! How can I assist you today?', id='019fe7a8-f43d-4f83-8bbd-b1c553f32aa0'), HumanMessage(content='what is the weather in sf currently', id='4138a1b0-3053-4b12-ad15-6198be969947'), AIMessage(content='', additional_kwargs={'function_call': {'arguments': '{\"query\":\"current weather in San Francisco\"}', 'name': 'tavily_search_results_json'}}, id='79bcb08c-0cb4-4b37-aa68-4df08b3a290f')], next=('action',), config={'configurable': {'thread_id': '3', 'thread_ts': '2024-04-02T00:09:44.242352+00:00'}}, parent_config=None)\n", + "StateSnapshot(values=[HumanMessage(content=\"hi! I'm bob\", id='1493cdf4-b7b5-46c9-a3e7-ad3b661fcb92'), AIMessage(content='Hello Bob! How can I assist you today?', id='028e0185-2ca4-4c1d-8660-93c17b839275'), HumanMessage(content='what is the weather in sf currently', id='76d6a5ff-d400-4edb-a264-b584107e2231'), AIMessage(content='', additional_kwargs={'function_call': {'arguments': '{\"query\":\"current weather in San Francisco\"}', 'name': 'tavily_search_results_json'}}, id='b143d5f6-5216-4a48-b76a-68b2f3eb6ff2')], next=('action',), config={'configurable': {'thread_id': '3', 'thread_ts': '2024-04-02T16:58:18.058645+00:00'}}, parent_config=None)\n", "--\n", - "StateSnapshot(values=[HumanMessage(content=\"hi! I'm bob\", id='774c03a0-4f61-49f1-8447-6fa5cbc3e56e'), AIMessage(content='Hello Bob! How can I assist you today?', id='019fe7a8-f43d-4f83-8bbd-b1c553f32aa0')], next=(), config={'configurable': {'thread_id': '3', 'thread_ts': '2024-04-02T00:09:43.801248+00:00'}}, parent_config=None)\n", + "StateSnapshot(values=[HumanMessage(content=\"hi! I'm bob\", id='1493cdf4-b7b5-46c9-a3e7-ad3b661fcb92'), AIMessage(content='Hello Bob! How can I assist you today?', id='028e0185-2ca4-4c1d-8660-93c17b839275')], next=(), config={'configurable': {'thread_id': '3', 'thread_ts': '2024-04-02T16:58:16.834223+00:00'}}, parent_config=None)\n", "--\n" ] } @@ -628,17 +621,17 @@ }, { "cell_type": "code", - "execution_count": 20, + "execution_count": 18, "id": "21e7fc18-6fd9-4e11-a84b-e0325c9640c8", "metadata": {}, "outputs": [ { "data": { "text/plain": [ - "StateSnapshot(values=[HumanMessage(content=\"hi! I'm bob\", id='774c03a0-4f61-49f1-8447-6fa5cbc3e56e'), AIMessage(content='Hello Bob! How can I assist you today?', id='019fe7a8-f43d-4f83-8bbd-b1c553f32aa0'), HumanMessage(content='what is the weather in sf currently', id='4138a1b0-3053-4b12-ad15-6198be969947'), AIMessage(content='', additional_kwargs={'function_call': {'arguments': '{\"query\":\"current weather in San Francisco\"}', 'name': 'tavily_search_results_json'}}, id='79bcb08c-0cb4-4b37-aa68-4df08b3a290f')], next=('action',), config={'configurable': {'thread_id': '3', 'thread_ts': '2024-04-02T00:09:44.242352+00:00'}}, parent_config=None)" + "StateSnapshot(values=[HumanMessage(content=\"hi! I'm bob\", id='1493cdf4-b7b5-46c9-a3e7-ad3b661fcb92'), AIMessage(content='Hello Bob! How can I assist you today?', id='028e0185-2ca4-4c1d-8660-93c17b839275'), HumanMessage(content='what is the weather in sf currently', id='76d6a5ff-d400-4edb-a264-b584107e2231'), AIMessage(content='', additional_kwargs={'function_call': {'arguments': '{\"query\":\"current weather in San Francisco\"}', 'name': 'tavily_search_results_json'}}, id='b143d5f6-5216-4a48-b76a-68b2f3eb6ff2')], next=('action',), config={'configurable': {'thread_id': '3', 'thread_ts': '2024-04-02T16:58:18.058645+00:00'}}, parent_config=None)" ] }, - "execution_count": 20, + "execution_count": 18, "metadata": {}, "output_type": "execute_result" } @@ -657,7 +650,7 @@ }, { "cell_type": "code", - "execution_count": 21, + "execution_count": 19, "id": "e986f94f-706f-4b6f-b3c4-f95483b9e9b8", "metadata": {}, "outputs": [ @@ -665,16 +658,15 @@ "name": "stdout", "output_type": "stream", "text": [ - "content=\"[{'url': 'https://www.accuweather.com/en/us/san-francisco/94103/current-weather/347629', 'content': 'Current weather in San Francisco, CA. Check current conditions in San Francisco, CA with radar, hourly, and more.'}]\" name='tavily_search_results_json' id='6ce0ce23-4fb7-4d3a-acbf-f882f8d52054'\n", - "content='You can check the current weather in San Francisco by visiting [AccuWeather](https://www.accuweather.com/en/us/san-francisco/94103/current-weather/347629).' id='0f071adc-a949-4242-ac3e-7ccd2132653d'\n" + "content=\"[{'url': 'https://www.accuweather.com/en/us/san-francisco/94103/current-weather/347629', 'content': 'Get the latest weather conditions and forecast for San Francisco, CA. See the temperature, humidity, wind, pressure, cloud cover, and alerts for the current hour and the next few days.'}]\" name='tavily_search_results_json' id='73ab98d6-d7cf-4812-9572-f58698394c9f'\n", + "content='You can check the current weather conditions and forecast for San Francisco, CA on [AccuWeather](https://www.accuweather.com/en/us/san-francisco/94103/current-weather/347629). This will provide you with information on temperature, humidity, wind, pressure, cloud cover, and alerts for the current hour and the next few days.' id='a54c0531-1683-4d61-87b6-ee7f66971c25'\n" ] } ], "source": [ "for event in app.stream(None, to_replay.config):\n", - " for k, v in event.items():\n", - " if k != \"__end__\":\n", - " print(v)" + " for v in event.values():\n", + " print(v)" ] }, { diff --git a/langgraph/constants.py b/langgraph/constants.py index 4bf8b1335..e75e97452 100644 --- a/langgraph/constants.py +++ b/langgraph/constants.py @@ -1,3 +1,6 @@ CONFIG_KEY_SEND = "__pregel_send" CONFIG_KEY_READ = "__pregel_read" + INTERRUPT = "__interrupt__" + +TAG_HIDDEN = "langsmith:hidden" diff --git a/langgraph/graph/graph.py b/langgraph/graph/graph.py index 50c633f4d..9fdc3d8af 100644 --- a/langgraph/graph/graph.py +++ b/langgraph/graph/graph.py @@ -1,16 +1,15 @@ -import asyncio import logging from collections import defaultdict from typing import ( Any, Awaitable, Callable, - Coroutine, Dict, NamedTuple, Optional, Sequence, Union, + cast, ) from langchain_core.runnables import Runnable @@ -25,9 +24,11 @@ from langchain_core.runnables.graph import ( from langgraph.channels.ephemeral_value import EphemeralValue from langgraph.checkpoint import BaseCheckpointSaver +from langgraph.constants import TAG_HIDDEN from langgraph.pregel import Channel, Pregel from langgraph.pregel.read import PregelNode from langgraph.pregel.write import ChannelWrite +from langgraph.utils import RunnableCallable logger = logging.getLogger(__name__) @@ -35,36 +36,8 @@ START = "__start__" END = "__end__" -class RunnableCallable(Runnable): - def __init__( - self, - func: Callable[..., Optional[Runnable]], - afunc: Callable[..., Awaitable[Optional[Runnable]]], - name: str, - writer: Callable[[str], Optional[Runnable]], - ) -> None: - self.name = name - self.func = func - self.afunc = afunc - self.writer = writer - - def invoke(self, input: Any, config: Optional[RunnableConfig] = None) -> Any: - ret = self._call_with_config(self.func, input, config, writer=self.writer) - if isinstance(ret, Runnable): - return ret.invoke(input, config) - return ret - - async def ainvoke(self, input: Any, config: Optional[RunnableConfig] = None) -> Any: - ret = await self._acall_with_config( - self.afunc, input, config, writer=self.writer - ) - if isinstance(ret, Runnable): - return await ret.ainvoke(input, config) - return ret - - class Branch(NamedTuple): - condition: Union[Runnable[Any, str], Callable[..., str], Coroutine[Any, Any, str]] + condition: Runnable[Any, str] ends: Optional[dict[str, str]] def run(self, writer: Callable[[str], Optional[Runnable]]) -> None: @@ -73,19 +46,19 @@ class Branch(NamedTuple): func=self._route, afunc=self._aroute, writer=writer, - name=self.condition.name - if isinstance(self.condition, Runnable) - else self.condition.__name__, + name=None, + trace=False, ) ) def _route( - self, input: Any, *, writer: Callable[[str], Optional[Runnable]] + self, + input: Any, + config: RunnableConfig, + *, + writer: Callable[[str], Optional[Runnable]], ) -> Runnable: - if isinstance(self.condition, Runnable): - result = self.condition.invoke(input, {"run_name": "condition"}) - else: - result = self.condition(input) + result = self.condition.invoke(input, config) if self.ends: destination = self.ends[result] else: @@ -93,14 +66,13 @@ class Branch(NamedTuple): return writer(destination) async def _aroute( - self, input: Any, *, writer: Callable[[str], Optional[Runnable]] + self, + input: Any, + config: RunnableConfig, + *, + writer: Callable[[str], Optional[Runnable]], ) -> Runnable: - if isinstance(self.condition, Runnable): - result = await self.condition.ainvoke(input, {"run_name": "condition"}) - elif asyncio.iscoroutinefunction(self.condition): - result = await self.condition(input) - else: - result = self.condition(input) + result = await self.condition.ainvoke(input, config) if self.ends: destination = self.ends[result] else: @@ -172,12 +144,8 @@ class Graph: "not be reflected in the compiled graph." ) # find a name for the condition - try: - name = ( - condition.__name__ if condition.__name__ != "" else "condition" - ) - except AttributeError: - name = "condition" + condition = coerce_to_runnable(condition) + name = condition.name or "condition" # validate the condition if start_key not in self.nodes and start_key != START: raise ValueError(f"Need to add_node `{start_key}` first") @@ -293,14 +261,16 @@ class CompiledGraph(Pregel): def attach_node(self, key: str, node: Runnable) -> None: self.channels[key] = EphemeralValue(Any) self.nodes[key] = ( - PregelNode(channels=[], triggers=[]) | node | Channel.write_to(key) + PregelNode(channels=[], triggers=[]) + | node + | Channel.write_to(key, tags=[TAG_HIDDEN]) ) - self.stream_channels.append(key) + cast(list[str], self.stream_channels).append(key) def attach_edge(self, start: str, end: str) -> None: if end == END: # publish to end channel - self.nodes[start].writers.append(Channel.write_to(END)) + self.nodes[start].writers.append(Channel.write_to(END, tags=[TAG_HIDDEN])) else: # subscribe to start channel self.nodes[end].triggers.append(start) @@ -309,12 +279,13 @@ class CompiledGraph(Pregel): def attach_branch(self, start: str, name: str, branch: Branch) -> None: def branch_writer(end: str) -> Optional[ChannelWrite]: return Channel.write_to( - f"branch:{start}:{name}:{end}" if end != END else END + f"branch:{start}:{name}:{end}" if end != END else END, + tags=[TAG_HIDDEN], ) # add hidden start node if start == START and start not in self.nodes: - self.nodes[start] = Channel.subscribe_to(START, tags=["langsmith:hidden"]) + self.nodes[start] = Channel.subscribe_to(START, tags=[TAG_HIDDEN]) # attach branch writer self.nodes[start] |= branch.run(branch_writer) diff --git a/langgraph/graph/state.py b/langgraph/graph/state.py index cc064783f..e1e026ecf 100644 --- a/langgraph/graph/state.py +++ b/langgraph/graph/state.py @@ -12,8 +12,8 @@ from langgraph.channels.ephemeral_value import EphemeralValue from langgraph.channels.last_value import LastValue from langgraph.channels.named_barrier_value import NamedBarrierValue from langgraph.checkpoint import BaseCheckpointSaver +from langgraph.constants import TAG_HIDDEN from langgraph.graph.graph import END, START, Branch, CompiledGraph, Graph -from langgraph.pregel import Channel from langgraph.pregel.read import ChannelRead, PregelNode from langgraph.pregel.write import SKIP_WRITE, ChannelWrite, ChannelWriteEntry @@ -139,12 +139,31 @@ class CompiledStateGraph(CompiledGraph): else ChannelWriteEntry(key, RunnableLambda(partial(_get_state_key, key))) for key in state_keys ] + # node that reads current state with (this node's) updates applied + state_reader = ChannelRead( + state_keys[0] if state_keys == ["__root__"] else state_keys, + tags=[TAG_HIDDEN], + fresh=True, + # coerce state dict to schema class (eg. pydantic model) + mapper=( + None + if state_keys == ["__root__"] + else partial(_coerce_state, self.graph.schema) + ), + ) # add node and output channel if key == START: - self.nodes[key] = Channel.subscribe_to( - START, tags=["langsmith:hidden"] - ).pipe(ChannelWrite(state_write_entries)) + self.nodes[key] = PregelNode( + tags=[TAG_HIDDEN], + triggers=[START], + channels=[START], + writers=[ + ChannelWrite(state_write_entries, tags=[TAG_HIDDEN]), + # read back state with updates applied + state_reader, + ], + ) else: self.channels[key] = EphemeralValue(Any) self.nodes[key] = PregelNode( @@ -156,24 +175,15 @@ class CompiledStateGraph(CompiledGraph): else {chan: chan for chan in state_keys} ), # coerce state dict to schema class (eg. pydantic model) - mapper=( - None - if state_keys == ["__root__"] - else partial(_coerce_state, self.graph.schema) - ), - # publish to this channel and state keys + mapper=state_reader.mapper, writers=[ - ChannelWrite([ChannelWriteEntry(key)] + state_write_entries), - # read back state with updates applied - ChannelRead( - state_keys[0] if state_keys == ["__root__"] else state_keys, - fresh=True, - mapper=( - None - if state_keys == ["__root__"] - else partial(_coerce_state, self.graph.schema) - ), + # publish to this channel and state keys + ChannelWrite( + [ChannelWriteEntry(key)] + state_write_entries, + tags=[TAG_HIDDEN], ), + # read back state with updates applied + state_reader, ], ).pipe(node) @@ -187,7 +197,7 @@ class CompiledStateGraph(CompiledGraph): self.nodes[end].triggers.append(channel_name) # publish to channel self.nodes[START] |= ChannelWrite( - [ChannelWriteEntry(channel_name, START)] + [ChannelWriteEntry(channel_name, START)], tags=[TAG_HIDDEN] ) elif end != END: # subscribe to start channel @@ -201,14 +211,15 @@ class CompiledStateGraph(CompiledGraph): # publish to channel for start in starts: self.nodes[start] |= ChannelWrite( - [ChannelWriteEntry(channel_name, start)] + [ChannelWriteEntry(channel_name, start)], tags=[TAG_HIDDEN] ) def attach_branch(self, start: str, name: str, branch: Branch) -> None: def branch_writer(end: str) -> Optional[ChannelWrite]: if end != END: return ChannelWrite( - [ChannelWriteEntry(f"branch:{start}:{name}:{end}", start)] + [ChannelWriteEntry(f"branch:{start}:{name}:{end}", start)], + tags=[TAG_HIDDEN], ) # attach branch publisher diff --git a/langgraph/pregel/__init__.py b/langgraph/pregel/__init__.py index 5bda279b2..89ef5085e 100644 --- a/langgraph/pregel/__init__.py +++ b/langgraph/pregel/__init__.py @@ -430,6 +430,7 @@ class Pregel( task.input, patch_config( config, + run_name=self.name + "UpdateState", configurable={ # deque.extend is thread-safe CONFIG_KEY_SEND: task.writes.extend, @@ -489,6 +490,7 @@ class Pregel( task.input, patch_config( config, + run_name=self.name + "UpdateState", configurable={ # deque.extend is thread-safe CONFIG_KEY_SEND: task.writes.extend, diff --git a/langgraph/pregel/io.py b/langgraph/pregel/io.py index a34b28f95..a59089384 100644 --- a/langgraph/pregel/io.py +++ b/langgraph/pregel/io.py @@ -1,6 +1,7 @@ from typing import Any, Iterator, Mapping, Optional, Sequence, Union from langgraph.channels.base import BaseChannel, EmptyChannelError +from langgraph.constants import TAG_HIDDEN from langgraph.pregel.log import logger from langgraph.pregel.types import PregelExecutableTask @@ -81,9 +82,7 @@ def map_output_updates( ) -> Optional[dict[str, Union[Any, dict[str, Any]]]]: """Map pending writes (a sequence of tuples (channel, value)) to output chunk.""" output_tasks = [ - t - for t in tasks - if not t.config or "langsmith:hidden" not in t.config.get("tags") + t for t in tasks if not t.config or TAG_HIDDEN not in t.config.get("tags") ] if isinstance(output_channels, str): if updated := { diff --git a/langgraph/pregel/read.py b/langgraph/pregel/read.py index f1afd30f0..6e6049e24 100644 --- a/langgraph/pregel/read.py +++ b/langgraph/pregel/read.py @@ -6,7 +6,6 @@ from langchain_core.pydantic_v1 import Field from langchain_core.runnables import ( Runnable, RunnableConfig, - RunnableLambda, RunnablePassthrough, RunnableSequence, RunnableSerializable, @@ -17,11 +16,12 @@ from langchain_core.runnables.utils import ConfigurableFieldSpec from langgraph.constants import CONFIG_KEY_READ from langgraph.pregel.write import ChannelWrite +from langgraph.utils import RunnableCallable READ_TYPE = Callable[[str, bool], Union[Any, dict[str, Any]]] -class ChannelRead(RunnableLambda): +class ChannelRead(RunnableCallable): channel: Union[str, list[str]] fresh: bool = False @@ -46,12 +46,23 @@ class ChannelRead(RunnableLambda): *, fresh: bool = False, mapper: Optional[Callable[[Any], Any]] = None, + tags: Optional[list[str]] = None, ) -> None: - super().__init__(func=self._read, afunc=self._aread) + super().__init__(func=self._read, afunc=self._aread, tags=tags, name=None) self.fresh = fresh self.mapper = mapper self.channel = channel - self.name = f"ChannelRead<{channel}>" + + def get_name( + self, suffix: Optional[str] = None, *, name: Optional[str] = None + ) -> str: + if name: + pass + elif isinstance(self.channel, str): + name = f"ChannelRead<{self.channel}>" + else: + name = f"ChannelRead<{','.join(self.channel)}>" + return super().get_name(suffix, name=name) def _read(self, _: Any, config: RunnableConfig) -> Any: try: @@ -80,7 +91,7 @@ class ChannelRead(RunnableLambda): return read(self.channel, self.fresh) -default_bound: RunnablePassthrough = RunnablePassthrough() +DEFAULT_BOUND: RunnablePassthrough = RunnablePassthrough() class PregelNode(RunnableBindingBase): @@ -92,7 +103,7 @@ class PregelNode(RunnableBindingBase): writers: list[Runnable] = Field(default_factory=list) - bound: Runnable[Any, Any] = Field(default=default_bound) + bound: Runnable[Any, Any] = Field(default=DEFAULT_BOUND) kwargs: Mapping[str, Any] = Field(default_factory=dict) @@ -125,11 +136,11 @@ class PregelNode(RunnableBindingBase): def get_node(self) -> Optional[Runnable[Any, Any]]: writers = self.get_writers() - if self.bound is default_bound and not writers: + if self.bound is DEFAULT_BOUND and not writers: return None - elif self.bound is default_bound and len(writers) == 1: + elif self.bound is DEFAULT_BOUND and len(writers) == 1: return writers[0] - elif self.bound is default_bound: + elif self.bound is DEFAULT_BOUND: return RunnableSequence(*writers) elif writers: return RunnableSequence(self.bound, *writers) @@ -154,7 +165,7 @@ class PregelNode(RunnableBindingBase): triggers=triggers, mapper=mapper, writers=writers or [], - bound=bound or default_bound, + bound=bound or DEFAULT_BOUND, kwargs=kwargs or {}, config=merge_configs(config, {"tags": tags or []}), **other_kwargs, @@ -201,7 +212,7 @@ class PregelNode(RunnableBindingBase): kwargs=self.kwargs, config=self.config, ) - elif self.bound is default_bound: + elif self.bound is DEFAULT_BOUND: return PregelNode( channels=self.channels, triggers=self.triggers, diff --git a/langgraph/pregel/write.py b/langgraph/pregel/write.py index 85fc46cfd..96b3b4b2c 100644 --- a/langgraph/pregel/write.py +++ b/langgraph/pregel/write.py @@ -3,14 +3,11 @@ from __future__ import annotations import asyncio from typing import Any, Callable, NamedTuple, Optional, Sequence, TypeVar, Union -from langchain_core.runnables import ( - Runnable, - RunnableConfig, - RunnablePassthrough, -) +from langchain_core.runnables import Runnable, RunnableConfig from langchain_core.runnables.utils import ConfigurableFieldSpec from langgraph.constants import CONFIG_KEY_SEND +from langgraph.utils import RunnableCallable TYPE_SEND = Callable[[Sequence[tuple[str, Any]]], None] R = TypeVar("R", bound=Runnable) @@ -25,7 +22,7 @@ class ChannelWriteEntry(NamedTuple): skip_none: bool = False -class ChannelWrite(RunnablePassthrough): +class ChannelWrite(RunnableCallable): writes: Sequence[ChannelWriteEntry] """ Sequence of write entries, each of which is a tuple of: @@ -34,11 +31,11 @@ class ChannelWrite(RunnablePassthrough): - whether to skip writing if the mapped value is None """ - class Config: - arbitrary_types_allowed = True - - def __init__(self, writes: Sequence[ChannelWriteEntry]): - super().__init__(func=self._write, afunc=self._awrite, writes=writes) + def __init__( + self, writes: Sequence[ChannelWriteEntry], *, tags: Optional[list[str]] = None + ): + super().__init__(func=self._write, afunc=self._awrite, name=None, tags=tags) + self.writes = writes def __repr_args__(self) -> Any: return [("writes", self.writes)] @@ -46,15 +43,9 @@ class ChannelWrite(RunnablePassthrough): def get_name( self, suffix: Optional[str] = None, *, name: Optional[str] = None ) -> str: - return super().get_name( - suffix, - name=name - or f"ChannelWrite<{','.join(chan for chan, _, _ in self.writes)}>", - ) - - @property - def is_channel_writer(self) -> bool: - return True + if not name: + name = f"ChannelWrite<{','.join(chan for chan, _, _ in self.writes)}>" + return super().get_name(suffix, name=name) @property def config_specs(self) -> list[ConfigurableFieldSpec]: @@ -85,8 +76,8 @@ class ChannelWrite(RunnablePassthrough): for write, (_, _, skip_none) in zip(values, self.writes) if not skip_none or write[1] is not None ] - self.do_write(config, **dict(values)) + return input async def _awrite(self, input: Any, config: RunnableConfig) -> None: values = await asyncio.gather( @@ -104,8 +95,8 @@ class ChannelWrite(RunnablePassthrough): for val, (chan, _, skip_none) in zip(values, self.writes) if not skip_none or val is not None ] - self.do_write(config, **dict(values)) + return input @staticmethod def do_write(config: RunnableConfig, **values: Any) -> None: @@ -121,6 +112,8 @@ class ChannelWrite(RunnablePassthrough): @staticmethod def register_writer(runnable: R) -> R: + # using object.__setattr__ to work around objects that override __setattr__ + # eg. pydantic models and dataclasses object.__setattr__(runnable, "_is_channel_writer", True) return runnable diff --git a/langgraph/utils.py b/langgraph/utils.py index ef5e2c13d..ee9b78339 100644 --- a/langgraph/utils.py +++ b/langgraph/utils.py @@ -1,4 +1,8 @@ import enum +from typing import Any, Awaitable, Callable, Optional + +from langchain_core.runnables import Runnable, RunnableConfig +from langchain_core.runnables.config import merge_configs # Before Python 3.11 native StrEnum is not available @@ -6,3 +10,47 @@ class StrEnum(str, enum.Enum): """A string enum.""" pass + + +class RunnableCallable(Runnable): + """A much simpler version of RunnableLambda that requires sync and async functions.""" + + def __init__( + self, + func: Callable[..., Optional[Runnable]], + afunc: Callable[..., Awaitable[Optional[Runnable]]], + name: str, + tags: Optional[list[str]] = None, + trace: bool = True, + **kwargs: Any, + ) -> None: + self.name = name + self.func = func + self.afunc = afunc + self.config = {"tags": tags} if tags else None + self.kwargs = kwargs + self.trace = trace + + def invoke(self, input: Any, config: Optional[RunnableConfig] = None) -> Any: + if self.trace: + ret = self._call_with_config( + self.func, input, merge_configs(self.config, config), **self.kwargs + ) + else: + ret = self.func(input, merge_configs(self.config, config), **self.kwargs) + if isinstance(ret, Runnable): + return ret.invoke(input, config) + return ret + + async def ainvoke(self, input: Any, config: Optional[RunnableConfig] = None) -> Any: + if self.trace: + ret = await self._acall_with_config( + self.afunc, input, merge_configs(self.config, config), **self.kwargs + ) + else: + ret = await self.afunc( + input, merge_configs(self.config, config), **self.kwargs + ) + if isinstance(ret, Runnable): + return await ret.ainvoke(input, config) + return ret diff --git a/poetry.lock b/poetry.lock index fc5046c18..7e209a01b 100644 --- a/poetry.lock +++ b/poetry.lock @@ -1587,17 +1587,16 @@ extended-testing = ["aiosqlite (>=0.19.0,<0.20.0)", "aleph-alpha-client (>=2.15. [[package]] name = "langchain-core" -version = "0.1.30" +version = "0.1.38" description = "Building applications with LLMs through composability" optional = false -python-versions = ">=3.8.1,<4.0" +python-versions = "<4.0,>=3.8.1" files = [ - {file = "langchain_core-0.1.30-py3-none-any.whl", hash = "sha256:c9643505e41d25ba8f20a2e8bf083d0f0d50b9a098d901511fff8df79f831ada"}, - {file = "langchain_core-0.1.30.tar.gz", hash = "sha256:e13a016e55e7f082ff3eeeda2d0cb505b89a8830e3a23c1d134d0a89d7871894"}, + {file = "langchain_core-0.1.38-py3-none-any.whl", hash = "sha256:d881b2754254cb4bdb0d5bb56e5c138d032b6e75e5cb21f151b01224b322e02b"}, + {file = "langchain_core-0.1.38.tar.gz", hash = "sha256:ee8da6d061c06cce7dc22fec224b6ecbc3a8de106d6dd9f409c7fe448ea41861"}, ] [package.dependencies] -anyio = ">=3,<5" jsonpatch = ">=1.33,<2.0" langsmith = ">=0.1.0,<0.2.0" packaging = ">=23.2,<24.0" @@ -3860,4 +3859,4 @@ testing = ["big-O", "jaraco.functools", "jaraco.itertools", "more-itertools", "p [metadata] lock-version = "2.0" python-versions = ">=3.9.0,<4.0" -content-hash = "2d35e923bf3902e0e11a305f58d17b0efc3fbb444dff8d6cb92e070a993115c9" +content-hash = "3f31fdccb53a66dc294a53d63bcef0233f38c9909170113c44b8dc215fc77d7c" diff --git a/pyproject.toml b/pyproject.toml index 9a6ced472..f8f137a8d 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -9,7 +9,7 @@ repository = "https://www.github.com/langchain-ai/langgraph" [tool.poetry.dependencies] python = ">=3.9.0,<4.0" -langchain-core = "^0.1.25" +langchain-core = "^0.1.38" [tool.poetry.group.test.dependencies] diff --git a/tests/__snapshots__/test_pregel.ambr b/tests/__snapshots__/test_pregel.ambr index 7159161b2..aec89a615 100644 --- a/tests/__snapshots__/test_pregel.ambr +++ b/tests/__snapshots__/test_pregel.ambr @@ -12,16 +12,12 @@ { "id": "__start__", "type": "schema", - "data": { - "title": "LangGraphInput" - } + "data": "__start__" }, { "id": "__end__", "type": "schema", - "data": { - "title": "LangGraphOutput" - } + "data": "__end__" }, { "id": "left", @@ -51,13 +47,29 @@ }, { "id": "__start___should_start", - "type": "unknown", - "data": "__start___should_start" + "type": "runnable", + "data": { + "id": [ + "langchain_core", + "runnables", + "base", + "RunnableLambda" + ], + "name": "should_start" + } }, { "id": "left_condition", - "type": "unknown", - "data": "left_condition" + "type": "runnable", + "data": { + "id": [ + "langchain_core", + "runnables", + "base", + "RunnableLambda" + ], + "name": "RunnableLambda" + } } ], "edges": [ @@ -140,10 +152,10 @@ ''' # --- # name: test_conditional_entrypoint_graph_state - '{"title": "LangGraphInput", "$ref": "#/definitions/AgentState", "definitions": {"AgentState": {"title": "AgentState", "type": "object", "properties": {"input": {"title": "Input", "type": "string"}, "output": {"title": "Output", "type": "string"}}}}}' + '{"title": "LangGraphInput", "$ref": "#/definitions/AgentState", "definitions": {"AgentState": {"title": "AgentState", "type": "object", "properties": {"input": {"title": "Input", "type": "string"}, "output": {"title": "Output", "type": "string"}, "steps": {"title": "Steps", "type": "array", "items": {"type": "string"}}}}}}' # --- # name: test_conditional_entrypoint_graph_state.1 - '{"title": "LangGraphOutput", "type": "object", "properties": {"input": {"title": "Input", "type": "string"}, "output": {"title": "Output", "type": "string"}}}' + '{"title": "LangGraphOutput", "type": "object", "properties": {"input": {"title": "Input", "type": "string"}, "output": {"title": "Output", "type": "string"}, "steps": {"title": "Steps", "type": "array", "items": {"type": "string"}}}}' # --- # name: test_conditional_entrypoint_graph_state.2 ''' @@ -152,44 +164,12 @@ { "id": "__start__", "type": "schema", - "data": { - "title": "LangGraphInput", - "$ref": "#/definitions/AgentState", - "definitions": { - "AgentState": { - "title": "AgentState", - "type": "object", - "properties": { - "input": { - "title": "Input", - "type": "string" - }, - "output": { - "title": "Output", - "type": "string" - } - } - } - } - } + "data": "__start__" }, { "id": "__end__", "type": "schema", - "data": { - "title": "LangGraphOutput", - "type": "object", - "properties": { - "input": { - "title": "Input", - "type": "string" - }, - "output": { - "title": "Output", - "type": "string" - } - } - } + "data": "__end__" }, { "id": "left", @@ -219,13 +199,29 @@ }, { "id": "__start___should_start", - "type": "unknown", - "data": "__start___should_start" + "type": "runnable", + "data": { + "id": [ + "langchain_core", + "runnables", + "base", + "RunnableLambda" + ], + "name": "should_start" + } }, { "id": "left_condition", - "type": "unknown", - "data": "left_condition" + "type": "runnable", + "data": { + "id": [ + "langchain_core", + "runnables", + "base", + "RunnableLambda" + ], + "name": "RunnableLambda" + } } ], "edges": [ @@ -314,16 +310,12 @@ { "id": "__start__", "type": "schema", - "data": { - "title": "LangGraphInput" - } + "data": "__start__" }, { "id": "__end__", "type": "schema", - "data": { - "title": "LangGraphOutput" - } + "data": "__end__" }, { "id": "agent", @@ -353,8 +345,16 @@ }, { "id": "agent_should_continue", - "type": "unknown", - "data": "agent_should_continue" + "type": "runnable", + "data": { + "id": [ + "langchain_core", + "runnables", + "base", + "RunnableLambda" + ], + "name": "should_continue" + } } ], "edges": [ @@ -416,114 +416,22 @@ { "id": "__start__", "type": "schema", - "data": { - "title": "LangGraphInput" - } + "data": "__start__" }, { "id": "__end__", "type": "schema", - "data": { - "title": "LangGraphOutput" - } + "data": "__end__" }, { "id": 2, "type": "schema", - "data": { - "title": "RunnableParallelInput", - "type": "object", - "properties": {} - } + "data": "ParallelInput" }, { "id": 3, "type": "schema", - "data": { - "title": "RunnableParallelOutput", - "type": "object", - "properties": { - "agent_outcome": { - "title": "Agent Outcome", - "anyOf": [ - { - "$ref": "#/definitions/AgentAction" - }, - { - "$ref": "#/definitions/AgentFinish" - } - ] - } - }, - "definitions": { - "AgentAction": { - "title": "AgentAction", - "description": "A full description of an action for an ActionAgent to execute.", - "type": "object", - "properties": { - "tool": { - "title": "Tool", - "type": "string" - }, - "tool_input": { - "title": "Tool Input", - "anyOf": [ - { - "type": "string" - }, - { - "type": "object" - } - ] - }, - "log": { - "title": "Log", - "type": "string" - }, - "type": { - "title": "Type", - "default": "AgentAction", - "enum": [ - "AgentAction" - ], - "type": "string" - } - }, - "required": [ - "tool", - "tool_input", - "log" - ] - }, - "AgentFinish": { - "title": "AgentFinish", - "description": "The final return value of an ActionAgent.", - "type": "object", - "properties": { - "return_values": { - "title": "Return Values", - "type": "object" - }, - "log": { - "title": "Log", - "type": "string" - }, - "type": { - "title": "Type", - "default": "AgentFinish", - "enum": [ - "AgentFinish" - ], - "type": "string" - } - }, - "required": [ - "return_values", - "log" - ] - } - } - } + "data": "ParallelOutput" }, { "id": 4, @@ -592,8 +500,16 @@ }, { "id": "agent_should_continue", - "type": "unknown", - "data": "agent_should_continue" + "type": "runnable", + "data": { + "id": [ + "langchain_core", + "runnables", + "base", + "RunnableLambda" + ], + "name": "should_continue" + } } ], "edges": [ @@ -703,16 +619,12 @@ { "id": "__start__", "type": "schema", - "data": { - "title": "LangGraphInput" - } + "data": "__start__" }, { "id": "__end__", "type": "schema", - "data": { - "title": "LangGraphOutput" - } + "data": "__end__" }, { "id": "agent", @@ -742,8 +654,16 @@ }, { "id": "agent_should_continue", - "type": "unknown", - "data": "agent_should_continue" + "type": "runnable", + "data": { + "id": [ + "langchain_core", + "runnables", + "base", + "RunnableLambda" + ], + "name": "should_continue" + } } ], "edges": [ @@ -805,114 +725,22 @@ { "id": "__start__", "type": "schema", - "data": { - "title": "LangGraphInput" - } + "data": "__start__" }, { "id": "__end__", "type": "schema", - "data": { - "title": "LangGraphOutput" - } + "data": "__end__" }, { "id": 2, "type": "schema", - "data": { - "title": "RunnableParallelInput", - "type": "object", - "properties": {} - } + "data": "ParallelInput" }, { "id": 3, "type": "schema", - "data": { - "title": "RunnableParallelOutput", - "type": "object", - "properties": { - "agent_outcome": { - "title": "Agent Outcome", - "anyOf": [ - { - "$ref": "#/definitions/AgentAction" - }, - { - "$ref": "#/definitions/AgentFinish" - } - ] - } - }, - "definitions": { - "AgentAction": { - "title": "AgentAction", - "description": "A full description of an action for an ActionAgent to execute.", - "type": "object", - "properties": { - "tool": { - "title": "Tool", - "type": "string" - }, - "tool_input": { - "title": "Tool Input", - "anyOf": [ - { - "type": "string" - }, - { - "type": "object" - } - ] - }, - "log": { - "title": "Log", - "type": "string" - }, - "type": { - "title": "Type", - "default": "AgentAction", - "enum": [ - "AgentAction" - ], - "type": "string" - } - }, - "required": [ - "tool", - "tool_input", - "log" - ] - }, - "AgentFinish": { - "title": "AgentFinish", - "description": "The final return value of an ActionAgent.", - "type": "object", - "properties": { - "return_values": { - "title": "Return Values", - "type": "object" - }, - "log": { - "title": "Log", - "type": "string" - }, - "type": { - "title": "Type", - "default": "AgentFinish", - "enum": [ - "AgentFinish" - ], - "type": "string" - } - }, - "required": [ - "return_values", - "log" - ] - } - } - } + "data": "ParallelOutput" }, { "id": 4, @@ -981,8 +809,16 @@ }, { "id": "agent_should_continue", - "type": "unknown", - "data": "agent_should_continue" + "type": "runnable", + "data": { + "id": [ + "langchain_core", + "runnables", + "base", + "RunnableLambda" + ], + "name": "should_continue" + } } ], "edges": [ @@ -1098,226 +934,12 @@ { "id": "__start__", "type": "schema", - "data": { - "title": "LangGraphInput", - "$ref": "#/definitions/AgentState", - "definitions": { - "AgentAction": { - "title": "AgentAction", - "description": "A full description of an action for an ActionAgent to execute.", - "type": "object", - "properties": { - "tool": { - "title": "Tool", - "type": "string" - }, - "tool_input": { - "title": "Tool Input", - "anyOf": [ - { - "type": "string" - }, - { - "type": "object" - } - ] - }, - "log": { - "title": "Log", - "type": "string" - }, - "type": { - "title": "Type", - "default": "AgentAction", - "enum": [ - "AgentAction" - ], - "type": "string" - } - }, - "required": [ - "tool", - "tool_input", - "log" - ] - }, - "AgentFinish": { - "title": "AgentFinish", - "description": "The final return value of an ActionAgent.", - "type": "object", - "properties": { - "return_values": { - "title": "Return Values", - "type": "object" - }, - "log": { - "title": "Log", - "type": "string" - }, - "type": { - "title": "Type", - "default": "AgentFinish", - "enum": [ - "AgentFinish" - ], - "type": "string" - } - }, - "required": [ - "return_values", - "log" - ] - }, - "AgentState": { - "title": "AgentState", - "type": "object", - "properties": { - "input": { - "title": "Input", - "type": "string" - }, - "agent_outcome": { - "title": "Agent Outcome", - "anyOf": [ - { - "$ref": "#/definitions/AgentAction" - }, - { - "$ref": "#/definitions/AgentFinish" - } - ] - }, - "intermediate_steps": { - "title": "Intermediate Steps", - "type": "array", - "items": { - "type": "array", - "minItems": 2, - "maxItems": 2, - "items": [ - { - "$ref": "#/definitions/AgentAction" - }, - { - "type": "string" - } - ] - } - } - } - } - } - } + "data": "__start__" }, { "id": "__end__", "type": "schema", - "data": { - "title": "LangGraphOutput", - "type": "object", - "properties": { - "input": { - "title": "Input", - "type": "string" - }, - "agent_outcome": { - "title": "Agent Outcome", - "anyOf": [ - { - "$ref": "#/definitions/AgentAction" - }, - { - "$ref": "#/definitions/AgentFinish" - } - ] - }, - "intermediate_steps": { - "title": "Intermediate Steps", - "type": "array", - "items": { - "type": "array", - "minItems": 2, - "maxItems": 2, - "items": [ - { - "$ref": "#/definitions/AgentAction" - }, - { - "type": "string" - } - ] - } - } - }, - "definitions": { - "AgentAction": { - "title": "AgentAction", - "description": "A full description of an action for an ActionAgent to execute.", - "type": "object", - "properties": { - "tool": { - "title": "Tool", - "type": "string" - }, - "tool_input": { - "title": "Tool Input", - "anyOf": [ - { - "type": "string" - }, - { - "type": "object" - } - ] - }, - "log": { - "title": "Log", - "type": "string" - }, - "type": { - "title": "Type", - "default": "AgentAction", - "enum": [ - "AgentAction" - ], - "type": "string" - } - }, - "required": [ - "tool", - "tool_input", - "log" - ] - }, - "AgentFinish": { - "title": "AgentFinish", - "description": "The final return value of an ActionAgent.", - "type": "object", - "properties": { - "return_values": { - "title": "Return Values", - "type": "object" - }, - "log": { - "title": "Log", - "type": "string" - }, - "type": { - "title": "Type", - "default": "AgentFinish", - "enum": [ - "AgentFinish" - ], - "type": "string" - } - }, - "required": [ - "return_values", - "log" - ] - } - } - } + "data": "__end__" }, { "id": "agent", @@ -1347,8 +969,16 @@ }, { "id": "agent_should_continue", - "type": "unknown", - "data": "agent_should_continue" + "type": "runnable", + "data": { + "id": [ + "langchain_core", + "runnables", + "base", + "RunnableLambda" + ], + "name": "should_continue" + } } ], "edges": [ @@ -1416,226 +1046,12 @@ { "id": "__start__", "type": "schema", - "data": { - "title": "LangGraphInput", - "$ref": "#/definitions/AgentState", - "definitions": { - "AgentAction": { - "title": "AgentAction", - "description": "A full description of an action for an ActionAgent to execute.", - "type": "object", - "properties": { - "tool": { - "title": "Tool", - "type": "string" - }, - "tool_input": { - "title": "Tool Input", - "anyOf": [ - { - "type": "string" - }, - { - "type": "object" - } - ] - }, - "log": { - "title": "Log", - "type": "string" - }, - "type": { - "title": "Type", - "default": "AgentAction", - "enum": [ - "AgentAction" - ], - "type": "string" - } - }, - "required": [ - "tool", - "tool_input", - "log" - ] - }, - "AgentFinish": { - "title": "AgentFinish", - "description": "The final return value of an ActionAgent.", - "type": "object", - "properties": { - "return_values": { - "title": "Return Values", - "type": "object" - }, - "log": { - "title": "Log", - "type": "string" - }, - "type": { - "title": "Type", - "default": "AgentFinish", - "enum": [ - "AgentFinish" - ], - "type": "string" - } - }, - "required": [ - "return_values", - "log" - ] - }, - "AgentState": { - "title": "AgentState", - "type": "object", - "properties": { - "input": { - "title": "Input", - "type": "string" - }, - "agent_outcome": { - "title": "Agent Outcome", - "anyOf": [ - { - "$ref": "#/definitions/AgentAction" - }, - { - "$ref": "#/definitions/AgentFinish" - } - ] - }, - "intermediate_steps": { - "title": "Intermediate Steps", - "type": "array", - "items": { - "type": "array", - "minItems": 2, - "maxItems": 2, - "items": [ - { - "$ref": "#/definitions/AgentAction" - }, - { - "type": "string" - } - ] - } - } - } - } - } - } + "data": "__start__" }, { "id": "__end__", "type": "schema", - "data": { - "title": "LangGraphOutput", - "type": "object", - "properties": { - "input": { - "title": "Input", - "type": "string" - }, - "agent_outcome": { - "title": "Agent Outcome", - "anyOf": [ - { - "$ref": "#/definitions/AgentAction" - }, - { - "$ref": "#/definitions/AgentFinish" - } - ] - }, - "intermediate_steps": { - "title": "Intermediate Steps", - "type": "array", - "items": { - "type": "array", - "minItems": 2, - "maxItems": 2, - "items": [ - { - "$ref": "#/definitions/AgentAction" - }, - { - "type": "string" - } - ] - } - } - }, - "definitions": { - "AgentAction": { - "title": "AgentAction", - "description": "A full description of an action for an ActionAgent to execute.", - "type": "object", - "properties": { - "tool": { - "title": "Tool", - "type": "string" - }, - "tool_input": { - "title": "Tool Input", - "anyOf": [ - { - "type": "string" - }, - { - "type": "object" - } - ] - }, - "log": { - "title": "Log", - "type": "string" - }, - "type": { - "title": "Type", - "default": "AgentAction", - "enum": [ - "AgentAction" - ], - "type": "string" - } - }, - "required": [ - "tool", - "tool_input", - "log" - ] - }, - "AgentFinish": { - "title": "AgentFinish", - "description": "The final return value of an ActionAgent.", - "type": "object", - "properties": { - "return_values": { - "title": "Return Values", - "type": "object" - }, - "log": { - "title": "Log", - "type": "string" - }, - "type": { - "title": "Type", - "default": "AgentFinish", - "enum": [ - "AgentFinish" - ], - "type": "string" - } - }, - "required": [ - "return_values", - "log" - ] - } - } - } + "data": "__end__" }, { "id": "agent", @@ -1665,8 +1081,16 @@ }, { "id": "agent_should_continue", - "type": "unknown", - "data": "agent_should_continue" + "type": "runnable", + "data": { + "id": [ + "langchain_core", + "runnables", + "base", + "RunnableLambda" + ], + "name": "should_continue" + } } ], "edges": [ @@ -1722,10 +1146,10 @@ ''' # --- # name: test_message_graph[end_of_run] - '{"title": "LangGraphInput", "type": "array", "items": {"anyOf": [{"$ref": "#/definitions/AIMessage"}, {"$ref": "#/definitions/HumanMessage"}, {"$ref": "#/definitions/ChatMessage"}, {"$ref": "#/definitions/SystemMessage"}, {"$ref": "#/definitions/FunctionMessage"}, {"$ref": "#/definitions/ToolMessage"}]}, "definitions": {"AIMessage": {"title": "AIMessage", "description": "Message from an AI.", "type": "object", "properties": {"content": {"title": "Content", "anyOf": [{"type": "string"}, {"type": "array", "items": {"anyOf": [{"type": "string"}, {"type": "object"}]}}]}, "additional_kwargs": {"title": "Additional Kwargs", "type": "object"}, "type": {"title": "Type", "default": "ai", "enum": ["ai"], "type": "string"}, "name": {"title": "Name", "type": "string"}, "id": {"title": "Id", "type": "string"}, "example": {"title": "Example", "default": false, "type": "boolean"}}, "required": ["content"]}, "HumanMessage": {"title": "HumanMessage", "description": "Message from a human.", "type": "object", "properties": {"content": {"title": "Content", "anyOf": [{"type": "string"}, {"type": "array", "items": {"anyOf": [{"type": "string"}, {"type": "object"}]}}]}, "additional_kwargs": {"title": "Additional Kwargs", "type": "object"}, "type": {"title": "Type", "default": "human", "enum": ["human"], "type": "string"}, "name": {"title": "Name", "type": "string"}, "id": {"title": "Id", "type": "string"}, "example": {"title": "Example", "default": false, "type": "boolean"}}, "required": ["content"]}, "ChatMessage": {"title": "ChatMessage", "description": "Message that can be assigned an arbitrary speaker (i.e. role).", "type": "object", "properties": {"content": {"title": "Content", "anyOf": [{"type": "string"}, {"type": "array", "items": {"anyOf": [{"type": "string"}, {"type": "object"}]}}]}, "additional_kwargs": {"title": "Additional Kwargs", "type": "object"}, "type": {"title": "Type", "default": "chat", "enum": ["chat"], "type": "string"}, "name": {"title": "Name", "type": "string"}, "id": {"title": "Id", "type": "string"}, "role": {"title": "Role", "type": "string"}}, "required": ["content", "role"]}, "SystemMessage": {"title": "SystemMessage", "description": "Message for priming AI behavior, usually passed in as the first of a sequence\\nof input messages.", "type": "object", "properties": {"content": {"title": "Content", "anyOf": [{"type": "string"}, {"type": "array", "items": {"anyOf": [{"type": "string"}, {"type": "object"}]}}]}, "additional_kwargs": {"title": "Additional Kwargs", "type": "object"}, "type": {"title": "Type", "default": "system", "enum": ["system"], "type": "string"}, "name": {"title": "Name", "type": "string"}, "id": {"title": "Id", "type": "string"}}, "required": ["content"]}, "FunctionMessage": {"title": "FunctionMessage", "description": "Message for passing the result of executing a function back to a model.", "type": "object", "properties": {"content": {"title": "Content", "anyOf": [{"type": "string"}, {"type": "array", "items": {"anyOf": [{"type": "string"}, {"type": "object"}]}}]}, "additional_kwargs": {"title": "Additional Kwargs", "type": "object"}, "type": {"title": "Type", "default": "function", "enum": ["function"], "type": "string"}, "name": {"title": "Name", "type": "string"}, "id": {"title": "Id", "type": "string"}}, "required": ["content", "name"]}, "ToolMessage": {"title": "ToolMessage", "description": "Message for passing the result of executing a tool back to a model.", "type": "object", "properties": {"content": {"title": "Content", "anyOf": [{"type": "string"}, {"type": "array", "items": {"anyOf": [{"type": "string"}, {"type": "object"}]}}]}, "additional_kwargs": {"title": "Additional Kwargs", "type": "object"}, "type": {"title": "Type", "default": "tool", "enum": ["tool"], "type": "string"}, "name": {"title": "Name", "type": "string"}, "id": {"title": "Id", "type": "string"}, "tool_call_id": {"title": "Tool Call Id", "type": "string"}}, "required": ["content", "tool_call_id"]}}}' + '{"title": "LangGraphInput", "type": "array", "items": {"anyOf": [{"$ref": "#/definitions/AIMessage"}, {"$ref": "#/definitions/HumanMessage"}, {"$ref": "#/definitions/ChatMessage"}, {"$ref": "#/definitions/SystemMessage"}, {"$ref": "#/definitions/FunctionMessage"}, {"$ref": "#/definitions/ToolMessage"}]}, "definitions": {"AIMessage": {"title": "AIMessage", "description": "Message from an AI.", "type": "object", "properties": {"content": {"title": "Content", "anyOf": [{"type": "string"}, {"type": "array", "items": {"anyOf": [{"type": "string"}, {"type": "object"}]}}]}, "additional_kwargs": {"title": "Additional Kwargs", "type": "object"}, "response_metadata": {"title": "Response Metadata", "type": "object"}, "type": {"title": "Type", "default": "ai", "enum": ["ai"], "type": "string"}, "name": {"title": "Name", "type": "string"}, "id": {"title": "Id", "type": "string"}, "example": {"title": "Example", "default": false, "type": "boolean"}}, "required": ["content"]}, "HumanMessage": {"title": "HumanMessage", "description": "Message from a human.", "type": "object", "properties": {"content": {"title": "Content", "anyOf": [{"type": "string"}, {"type": "array", "items": {"anyOf": [{"type": "string"}, {"type": "object"}]}}]}, "additional_kwargs": {"title": "Additional Kwargs", "type": "object"}, "response_metadata": {"title": "Response Metadata", "type": "object"}, "type": {"title": "Type", "default": "human", "enum": ["human"], "type": "string"}, "name": {"title": "Name", "type": "string"}, "id": {"title": "Id", "type": "string"}, "example": {"title": "Example", "default": false, "type": "boolean"}}, "required": ["content"]}, "ChatMessage": {"title": "ChatMessage", "description": "Message that can be assigned an arbitrary speaker (i.e. role).", "type": "object", "properties": {"content": {"title": "Content", "anyOf": [{"type": "string"}, {"type": "array", "items": {"anyOf": [{"type": "string"}, {"type": "object"}]}}]}, "additional_kwargs": {"title": "Additional Kwargs", "type": "object"}, "response_metadata": {"title": "Response Metadata", "type": "object"}, "type": {"title": "Type", "default": "chat", "enum": ["chat"], "type": "string"}, "name": {"title": "Name", "type": "string"}, "id": {"title": "Id", "type": "string"}, "role": {"title": "Role", "type": "string"}}, "required": ["content", "role"]}, "SystemMessage": {"title": "SystemMessage", "description": "Message for priming AI behavior, usually passed in as the first of a sequence\\nof input messages.", "type": "object", "properties": {"content": {"title": "Content", "anyOf": [{"type": "string"}, {"type": "array", "items": {"anyOf": [{"type": "string"}, {"type": "object"}]}}]}, "additional_kwargs": {"title": "Additional Kwargs", "type": "object"}, "response_metadata": {"title": "Response Metadata", "type": "object"}, "type": {"title": "Type", "default": "system", "enum": ["system"], "type": "string"}, "name": {"title": "Name", "type": "string"}, "id": {"title": "Id", "type": "string"}}, "required": ["content"]}, "FunctionMessage": {"title": "FunctionMessage", "description": "Message for passing the result of executing a function back to a model.", "type": "object", "properties": {"content": {"title": "Content", "anyOf": [{"type": "string"}, {"type": "array", "items": {"anyOf": [{"type": "string"}, {"type": "object"}]}}]}, "additional_kwargs": {"title": "Additional Kwargs", "type": "object"}, "response_metadata": {"title": "Response Metadata", "type": "object"}, "type": {"title": "Type", "default": "function", "enum": ["function"], "type": "string"}, "name": {"title": "Name", "type": "string"}, "id": {"title": "Id", "type": "string"}}, "required": ["content", "name"]}, "ToolMessage": {"title": "ToolMessage", "description": "Message for passing the result of executing a tool back to a model.", "type": "object", "properties": {"content": {"title": "Content", "anyOf": [{"type": "string"}, {"type": "array", "items": {"anyOf": [{"type": "string"}, {"type": "object"}]}}]}, "additional_kwargs": {"title": "Additional Kwargs", "type": "object"}, "response_metadata": {"title": "Response Metadata", "type": "object"}, "type": {"title": "Type", "default": "tool", "enum": ["tool"], "type": "string"}, "name": {"title": "Name", "type": "string"}, "id": {"title": "Id", "type": "string"}, "tool_call_id": {"title": "Tool Call Id", "type": "string"}}, "required": ["content", "tool_call_id"]}}}' # --- # name: test_message_graph[end_of_run].1 - '{"title": "LangGraphOutput", "type": "array", "items": {"anyOf": [{"$ref": "#/definitions/AIMessage"}, {"$ref": "#/definitions/HumanMessage"}, {"$ref": "#/definitions/ChatMessage"}, {"$ref": "#/definitions/SystemMessage"}, {"$ref": "#/definitions/FunctionMessage"}, {"$ref": "#/definitions/ToolMessage"}]}, "definitions": {"AIMessage": {"title": "AIMessage", "description": "Message from an AI.", "type": "object", "properties": {"content": {"title": "Content", "anyOf": [{"type": "string"}, {"type": "array", "items": {"anyOf": [{"type": "string"}, {"type": "object"}]}}]}, "additional_kwargs": {"title": "Additional Kwargs", "type": "object"}, "type": {"title": "Type", "default": "ai", "enum": ["ai"], "type": "string"}, "name": {"title": "Name", "type": "string"}, "id": {"title": "Id", "type": "string"}, "example": {"title": "Example", "default": false, "type": "boolean"}}, "required": ["content"]}, "HumanMessage": {"title": "HumanMessage", "description": "Message from a human.", "type": "object", "properties": {"content": {"title": "Content", "anyOf": [{"type": "string"}, {"type": "array", "items": {"anyOf": [{"type": "string"}, {"type": "object"}]}}]}, "additional_kwargs": {"title": "Additional Kwargs", "type": "object"}, "type": {"title": "Type", "default": "human", "enum": ["human"], "type": "string"}, "name": {"title": "Name", "type": "string"}, "id": {"title": "Id", "type": "string"}, "example": {"title": "Example", "default": false, "type": "boolean"}}, "required": ["content"]}, "ChatMessage": {"title": "ChatMessage", "description": "Message that can be assigned an arbitrary speaker (i.e. role).", "type": "object", "properties": {"content": {"title": "Content", "anyOf": [{"type": "string"}, {"type": "array", "items": {"anyOf": [{"type": "string"}, {"type": "object"}]}}]}, "additional_kwargs": {"title": "Additional Kwargs", "type": "object"}, "type": {"title": "Type", "default": "chat", "enum": ["chat"], "type": "string"}, "name": {"title": "Name", "type": "string"}, "id": {"title": "Id", "type": "string"}, "role": {"title": "Role", "type": "string"}}, "required": ["content", "role"]}, "SystemMessage": {"title": "SystemMessage", "description": "Message for priming AI behavior, usually passed in as the first of a sequence\\nof input messages.", "type": "object", "properties": {"content": {"title": "Content", "anyOf": [{"type": "string"}, {"type": "array", "items": {"anyOf": [{"type": "string"}, {"type": "object"}]}}]}, "additional_kwargs": {"title": "Additional Kwargs", "type": "object"}, "type": {"title": "Type", "default": "system", "enum": ["system"], "type": "string"}, "name": {"title": "Name", "type": "string"}, "id": {"title": "Id", "type": "string"}}, "required": ["content"]}, "FunctionMessage": {"title": "FunctionMessage", "description": "Message for passing the result of executing a function back to a model.", "type": "object", "properties": {"content": {"title": "Content", "anyOf": [{"type": "string"}, {"type": "array", "items": {"anyOf": [{"type": "string"}, {"type": "object"}]}}]}, "additional_kwargs": {"title": "Additional Kwargs", "type": "object"}, "type": {"title": "Type", "default": "function", "enum": ["function"], "type": "string"}, "name": {"title": "Name", "type": "string"}, "id": {"title": "Id", "type": "string"}}, "required": ["content", "name"]}, "ToolMessage": {"title": "ToolMessage", "description": "Message for passing the result of executing a tool back to a model.", "type": "object", "properties": {"content": {"title": "Content", "anyOf": [{"type": "string"}, {"type": "array", "items": {"anyOf": [{"type": "string"}, {"type": "object"}]}}]}, "additional_kwargs": {"title": "Additional Kwargs", "type": "object"}, "type": {"title": "Type", "default": "tool", "enum": ["tool"], "type": "string"}, "name": {"title": "Name", "type": "string"}, "id": {"title": "Id", "type": "string"}, "tool_call_id": {"title": "Tool Call Id", "type": "string"}}, "required": ["content", "tool_call_id"]}}}' + '{"title": "LangGraphOutput", "type": "array", "items": {"anyOf": [{"$ref": "#/definitions/AIMessage"}, {"$ref": "#/definitions/HumanMessage"}, {"$ref": "#/definitions/ChatMessage"}, {"$ref": "#/definitions/SystemMessage"}, {"$ref": "#/definitions/FunctionMessage"}, {"$ref": "#/definitions/ToolMessage"}]}, "definitions": {"AIMessage": {"title": "AIMessage", "description": "Message from an AI.", "type": "object", "properties": {"content": {"title": "Content", "anyOf": [{"type": "string"}, {"type": "array", "items": {"anyOf": [{"type": "string"}, {"type": "object"}]}}]}, "additional_kwargs": {"title": "Additional Kwargs", "type": "object"}, "response_metadata": {"title": "Response Metadata", "type": "object"}, "type": {"title": "Type", "default": "ai", "enum": ["ai"], "type": "string"}, "name": {"title": "Name", "type": "string"}, "id": {"title": "Id", "type": "string"}, "example": {"title": "Example", "default": false, "type": "boolean"}}, "required": ["content"]}, "HumanMessage": {"title": "HumanMessage", "description": "Message from a human.", "type": "object", "properties": {"content": {"title": "Content", "anyOf": [{"type": "string"}, {"type": "array", "items": {"anyOf": [{"type": "string"}, {"type": "object"}]}}]}, "additional_kwargs": {"title": "Additional Kwargs", "type": "object"}, "response_metadata": {"title": "Response Metadata", "type": "object"}, "type": {"title": "Type", "default": "human", "enum": ["human"], "type": "string"}, "name": {"title": "Name", "type": "string"}, "id": {"title": "Id", "type": "string"}, "example": {"title": "Example", "default": false, "type": "boolean"}}, "required": ["content"]}, "ChatMessage": {"title": "ChatMessage", "description": "Message that can be assigned an arbitrary speaker (i.e. role).", "type": "object", "properties": {"content": {"title": "Content", "anyOf": [{"type": "string"}, {"type": "array", "items": {"anyOf": [{"type": "string"}, {"type": "object"}]}}]}, "additional_kwargs": {"title": "Additional Kwargs", "type": "object"}, "response_metadata": {"title": "Response Metadata", "type": "object"}, "type": {"title": "Type", "default": "chat", "enum": ["chat"], "type": "string"}, "name": {"title": "Name", "type": "string"}, "id": {"title": "Id", "type": "string"}, "role": {"title": "Role", "type": "string"}}, "required": ["content", "role"]}, "SystemMessage": {"title": "SystemMessage", "description": "Message for priming AI behavior, usually passed in as the first of a sequence\\nof input messages.", "type": "object", "properties": {"content": {"title": "Content", "anyOf": [{"type": "string"}, {"type": "array", "items": {"anyOf": [{"type": "string"}, {"type": "object"}]}}]}, "additional_kwargs": {"title": "Additional Kwargs", "type": "object"}, "response_metadata": {"title": "Response Metadata", "type": "object"}, "type": {"title": "Type", "default": "system", "enum": ["system"], "type": "string"}, "name": {"title": "Name", "type": "string"}, "id": {"title": "Id", "type": "string"}}, "required": ["content"]}, "FunctionMessage": {"title": "FunctionMessage", "description": "Message for passing the result of executing a function back to a model.", "type": "object", "properties": {"content": {"title": "Content", "anyOf": [{"type": "string"}, {"type": "array", "items": {"anyOf": [{"type": "string"}, {"type": "object"}]}}]}, "additional_kwargs": {"title": "Additional Kwargs", "type": "object"}, "response_metadata": {"title": "Response Metadata", "type": "object"}, "type": {"title": "Type", "default": "function", "enum": ["function"], "type": "string"}, "name": {"title": "Name", "type": "string"}, "id": {"title": "Id", "type": "string"}}, "required": ["content", "name"]}, "ToolMessage": {"title": "ToolMessage", "description": "Message for passing the result of executing a tool back to a model.", "type": "object", "properties": {"content": {"title": "Content", "anyOf": [{"type": "string"}, {"type": "array", "items": {"anyOf": [{"type": "string"}, {"type": "object"}]}}]}, "additional_kwargs": {"title": "Additional Kwargs", "type": "object"}, "response_metadata": {"title": "Response Metadata", "type": "object"}, "type": {"title": "Type", "default": "tool", "enum": ["tool"], "type": "string"}, "name": {"title": "Name", "type": "string"}, "id": {"title": "Id", "type": "string"}, "tool_call_id": {"title": "Tool Call Id", "type": "string"}}, "required": ["content", "tool_call_id"]}}}' # --- # name: test_message_graph[end_of_run].2 ''' @@ -1734,720 +1158,12 @@ { "id": "__start__", "type": "schema", - "data": { - "title": "LangGraphInput", - "type": "array", - "items": { - "anyOf": [ - { - "$ref": "#/definitions/AIMessage" - }, - { - "$ref": "#/definitions/HumanMessage" - }, - { - "$ref": "#/definitions/ChatMessage" - }, - { - "$ref": "#/definitions/SystemMessage" - }, - { - "$ref": "#/definitions/FunctionMessage" - }, - { - "$ref": "#/definitions/ToolMessage" - } - ] - }, - "definitions": { - "AIMessage": { - "title": "AIMessage", - "description": "Message from an AI.", - "type": "object", - "properties": { - "content": { - "title": "Content", - "anyOf": [ - { - "type": "string" - }, - { - "type": "array", - "items": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "object" - } - ] - } - } - ] - }, - "additional_kwargs": { - "title": "Additional Kwargs", - "type": "object" - }, - "type": { - "title": "Type", - "default": "ai", - "enum": [ - "ai" - ], - "type": "string" - }, - "name": { - "title": "Name", - "type": "string" - }, - "id": { - "title": "Id", - "type": "string" - }, - "example": { - "title": "Example", - "default": false, - "type": "boolean" - } - }, - "required": [ - "content" - ] - }, - "HumanMessage": { - "title": "HumanMessage", - "description": "Message from a human.", - "type": "object", - "properties": { - "content": { - "title": "Content", - "anyOf": [ - { - "type": "string" - }, - { - "type": "array", - "items": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "object" - } - ] - } - } - ] - }, - "additional_kwargs": { - "title": "Additional Kwargs", - "type": "object" - }, - "type": { - "title": "Type", - "default": "human", - "enum": [ - "human" - ], - "type": "string" - }, - "name": { - "title": "Name", - "type": "string" - }, - "id": { - "title": "Id", - "type": "string" - }, - "example": { - "title": "Example", - "default": false, - "type": "boolean" - } - }, - "required": [ - "content" - ] - }, - "ChatMessage": { - "title": "ChatMessage", - "description": "Message that can be assigned an arbitrary speaker (i.e. role).", - "type": "object", - "properties": { - "content": { - "title": "Content", - "anyOf": [ - { - "type": "string" - }, - { - "type": "array", - "items": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "object" - } - ] - } - } - ] - }, - "additional_kwargs": { - "title": "Additional Kwargs", - "type": "object" - }, - "type": { - "title": "Type", - "default": "chat", - "enum": [ - "chat" - ], - "type": "string" - }, - "name": { - "title": "Name", - "type": "string" - }, - "id": { - "title": "Id", - "type": "string" - }, - "role": { - "title": "Role", - "type": "string" - } - }, - "required": [ - "content", - "role" - ] - }, - "SystemMessage": { - "title": "SystemMessage", - "description": "Message for priming AI behavior, usually passed in as the first of a sequence\nof input messages.", - "type": "object", - "properties": { - "content": { - "title": "Content", - "anyOf": [ - { - "type": "string" - }, - { - "type": "array", - "items": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "object" - } - ] - } - } - ] - }, - "additional_kwargs": { - "title": "Additional Kwargs", - "type": "object" - }, - "type": { - "title": "Type", - "default": "system", - "enum": [ - "system" - ], - "type": "string" - }, - "name": { - "title": "Name", - "type": "string" - }, - "id": { - "title": "Id", - "type": "string" - } - }, - "required": [ - "content" - ] - }, - "FunctionMessage": { - "title": "FunctionMessage", - "description": "Message for passing the result of executing a function back to a model.", - "type": "object", - "properties": { - "content": { - "title": "Content", - "anyOf": [ - { - "type": "string" - }, - { - "type": "array", - "items": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "object" - } - ] - } - } - ] - }, - "additional_kwargs": { - "title": "Additional Kwargs", - "type": "object" - }, - "type": { - "title": "Type", - "default": "function", - "enum": [ - "function" - ], - "type": "string" - }, - "name": { - "title": "Name", - "type": "string" - }, - "id": { - "title": "Id", - "type": "string" - } - }, - "required": [ - "content", - "name" - ] - }, - "ToolMessage": { - "title": "ToolMessage", - "description": "Message for passing the result of executing a tool back to a model.", - "type": "object", - "properties": { - "content": { - "title": "Content", - "anyOf": [ - { - "type": "string" - }, - { - "type": "array", - "items": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "object" - } - ] - } - } - ] - }, - "additional_kwargs": { - "title": "Additional Kwargs", - "type": "object" - }, - "type": { - "title": "Type", - "default": "tool", - "enum": [ - "tool" - ], - "type": "string" - }, - "name": { - "title": "Name", - "type": "string" - }, - "id": { - "title": "Id", - "type": "string" - }, - "tool_call_id": { - "title": "Tool Call Id", - "type": "string" - } - }, - "required": [ - "content", - "tool_call_id" - ] - } - } - } + "data": "__start__" }, { "id": "__end__", "type": "schema", - "data": { - "title": "LangGraphOutput", - "type": "array", - "items": { - "anyOf": [ - { - "$ref": "#/definitions/AIMessage" - }, - { - "$ref": "#/definitions/HumanMessage" - }, - { - "$ref": "#/definitions/ChatMessage" - }, - { - "$ref": "#/definitions/SystemMessage" - }, - { - "$ref": "#/definitions/FunctionMessage" - }, - { - "$ref": "#/definitions/ToolMessage" - } - ] - }, - "definitions": { - "AIMessage": { - "title": "AIMessage", - "description": "Message from an AI.", - "type": "object", - "properties": { - "content": { - "title": "Content", - "anyOf": [ - { - "type": "string" - }, - { - "type": "array", - "items": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "object" - } - ] - } - } - ] - }, - "additional_kwargs": { - "title": "Additional Kwargs", - "type": "object" - }, - "type": { - "title": "Type", - "default": "ai", - "enum": [ - "ai" - ], - "type": "string" - }, - "name": { - "title": "Name", - "type": "string" - }, - "id": { - "title": "Id", - "type": "string" - }, - "example": { - "title": "Example", - "default": false, - "type": "boolean" - } - }, - "required": [ - "content" - ] - }, - "HumanMessage": { - "title": "HumanMessage", - "description": "Message from a human.", - "type": "object", - "properties": { - "content": { - "title": "Content", - "anyOf": [ - { - "type": "string" - }, - { - "type": "array", - "items": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "object" - } - ] - } - } - ] - }, - "additional_kwargs": { - "title": "Additional Kwargs", - "type": "object" - }, - "type": { - "title": "Type", - "default": "human", - "enum": [ - "human" - ], - "type": "string" - }, - "name": { - "title": "Name", - "type": "string" - }, - "id": { - "title": "Id", - "type": "string" - }, - "example": { - "title": "Example", - "default": false, - "type": "boolean" - } - }, - "required": [ - "content" - ] - }, - "ChatMessage": { - "title": "ChatMessage", - "description": "Message that can be assigned an arbitrary speaker (i.e. role).", - "type": "object", - "properties": { - "content": { - "title": "Content", - "anyOf": [ - { - "type": "string" - }, - { - "type": "array", - "items": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "object" - } - ] - } - } - ] - }, - "additional_kwargs": { - "title": "Additional Kwargs", - "type": "object" - }, - "type": { - "title": "Type", - "default": "chat", - "enum": [ - "chat" - ], - "type": "string" - }, - "name": { - "title": "Name", - "type": "string" - }, - "id": { - "title": "Id", - "type": "string" - }, - "role": { - "title": "Role", - "type": "string" - } - }, - "required": [ - "content", - "role" - ] - }, - "SystemMessage": { - "title": "SystemMessage", - "description": "Message for priming AI behavior, usually passed in as the first of a sequence\nof input messages.", - "type": "object", - "properties": { - "content": { - "title": "Content", - "anyOf": [ - { - "type": "string" - }, - { - "type": "array", - "items": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "object" - } - ] - } - } - ] - }, - "additional_kwargs": { - "title": "Additional Kwargs", - "type": "object" - }, - "type": { - "title": "Type", - "default": "system", - "enum": [ - "system" - ], - "type": "string" - }, - "name": { - "title": "Name", - "type": "string" - }, - "id": { - "title": "Id", - "type": "string" - } - }, - "required": [ - "content" - ] - }, - "FunctionMessage": { - "title": "FunctionMessage", - "description": "Message for passing the result of executing a function back to a model.", - "type": "object", - "properties": { - "content": { - "title": "Content", - "anyOf": [ - { - "type": "string" - }, - { - "type": "array", - "items": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "object" - } - ] - } - } - ] - }, - "additional_kwargs": { - "title": "Additional Kwargs", - "type": "object" - }, - "type": { - "title": "Type", - "default": "function", - "enum": [ - "function" - ], - "type": "string" - }, - "name": { - "title": "Name", - "type": "string" - }, - "id": { - "title": "Id", - "type": "string" - } - }, - "required": [ - "content", - "name" - ] - }, - "ToolMessage": { - "title": "ToolMessage", - "description": "Message for passing the result of executing a tool back to a model.", - "type": "object", - "properties": { - "content": { - "title": "Content", - "anyOf": [ - { - "type": "string" - }, - { - "type": "array", - "items": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "object" - } - ] - } - } - ] - }, - "additional_kwargs": { - "title": "Additional Kwargs", - "type": "object" - }, - "type": { - "title": "Type", - "default": "tool", - "enum": [ - "tool" - ], - "type": "string" - }, - "name": { - "title": "Name", - "type": "string" - }, - "id": { - "title": "Id", - "type": "string" - }, - "tool_call_id": { - "title": "Tool Call Id", - "type": "string" - } - }, - "required": [ - "content", - "tool_call_id" - ] - } - } - } + "data": "__end__" }, { "id": "agent", @@ -2476,8 +1192,16 @@ }, { "id": "agent_should_continue", - "type": "unknown", - "data": "agent_should_continue" + "type": "runnable", + "data": { + "id": [ + "langchain_core", + "runnables", + "base", + "RunnableLambda" + ], + "name": "should_continue" + } } ], "edges": [ @@ -2533,10 +1257,10 @@ ''' # --- # name: test_message_graph[end_of_step] - '{"title": "LangGraphInput", "type": "array", "items": {"anyOf": [{"$ref": "#/definitions/AIMessage"}, {"$ref": "#/definitions/HumanMessage"}, {"$ref": "#/definitions/ChatMessage"}, {"$ref": "#/definitions/SystemMessage"}, {"$ref": "#/definitions/FunctionMessage"}, {"$ref": "#/definitions/ToolMessage"}]}, "definitions": {"AIMessage": {"title": "AIMessage", "description": "Message from an AI.", "type": "object", "properties": {"content": {"title": "Content", "anyOf": [{"type": "string"}, {"type": "array", "items": {"anyOf": [{"type": "string"}, {"type": "object"}]}}]}, "additional_kwargs": {"title": "Additional Kwargs", "type": "object"}, "type": {"title": "Type", "default": "ai", "enum": ["ai"], "type": "string"}, "name": {"title": "Name", "type": "string"}, "id": {"title": "Id", "type": "string"}, "example": {"title": "Example", "default": false, "type": "boolean"}}, "required": ["content"]}, "HumanMessage": {"title": "HumanMessage", "description": "Message from a human.", "type": "object", "properties": {"content": {"title": "Content", "anyOf": [{"type": "string"}, {"type": "array", "items": {"anyOf": [{"type": "string"}, {"type": "object"}]}}]}, "additional_kwargs": {"title": "Additional Kwargs", "type": "object"}, "type": {"title": "Type", "default": "human", "enum": ["human"], "type": "string"}, "name": {"title": "Name", "type": "string"}, "id": {"title": "Id", "type": "string"}, "example": {"title": "Example", "default": false, "type": "boolean"}}, "required": ["content"]}, "ChatMessage": {"title": "ChatMessage", "description": "Message that can be assigned an arbitrary speaker (i.e. role).", "type": "object", "properties": {"content": {"title": "Content", "anyOf": [{"type": "string"}, {"type": "array", "items": {"anyOf": [{"type": "string"}, {"type": "object"}]}}]}, "additional_kwargs": {"title": "Additional Kwargs", "type": "object"}, "type": {"title": "Type", "default": "chat", "enum": ["chat"], "type": "string"}, "name": {"title": "Name", "type": "string"}, "id": {"title": "Id", "type": "string"}, "role": {"title": "Role", "type": "string"}}, "required": ["content", "role"]}, "SystemMessage": {"title": "SystemMessage", "description": "Message for priming AI behavior, usually passed in as the first of a sequence\\nof input messages.", "type": "object", "properties": {"content": {"title": "Content", "anyOf": [{"type": "string"}, {"type": "array", "items": {"anyOf": [{"type": "string"}, {"type": "object"}]}}]}, "additional_kwargs": {"title": "Additional Kwargs", "type": "object"}, "type": {"title": "Type", "default": "system", "enum": ["system"], "type": "string"}, "name": {"title": "Name", "type": "string"}, "id": {"title": "Id", "type": "string"}}, "required": ["content"]}, "FunctionMessage": {"title": "FunctionMessage", "description": "Message for passing the result of executing a function back to a model.", "type": "object", "properties": {"content": {"title": "Content", "anyOf": [{"type": "string"}, {"type": "array", "items": {"anyOf": [{"type": "string"}, {"type": "object"}]}}]}, "additional_kwargs": {"title": "Additional Kwargs", "type": "object"}, "type": {"title": "Type", "default": "function", "enum": ["function"], "type": "string"}, "name": {"title": "Name", "type": "string"}, "id": {"title": "Id", "type": "string"}}, "required": ["content", "name"]}, "ToolMessage": {"title": "ToolMessage", "description": "Message for passing the result of executing a tool back to a model.", "type": "object", "properties": {"content": {"title": "Content", "anyOf": [{"type": "string"}, {"type": "array", "items": {"anyOf": [{"type": "string"}, {"type": "object"}]}}]}, "additional_kwargs": {"title": "Additional Kwargs", "type": "object"}, "type": {"title": "Type", "default": "tool", "enum": ["tool"], "type": "string"}, "name": {"title": "Name", "type": "string"}, "id": {"title": "Id", "type": "string"}, "tool_call_id": {"title": "Tool Call Id", "type": "string"}}, "required": ["content", "tool_call_id"]}}}' + '{"title": "LangGraphInput", "type": "array", "items": {"anyOf": [{"$ref": "#/definitions/AIMessage"}, {"$ref": "#/definitions/HumanMessage"}, {"$ref": "#/definitions/ChatMessage"}, {"$ref": "#/definitions/SystemMessage"}, {"$ref": "#/definitions/FunctionMessage"}, {"$ref": "#/definitions/ToolMessage"}]}, "definitions": {"AIMessage": {"title": "AIMessage", "description": "Message from an AI.", "type": "object", "properties": {"content": {"title": "Content", "anyOf": [{"type": "string"}, {"type": "array", "items": {"anyOf": [{"type": "string"}, {"type": "object"}]}}]}, "additional_kwargs": {"title": "Additional Kwargs", "type": "object"}, "response_metadata": {"title": "Response Metadata", "type": "object"}, "type": {"title": "Type", "default": "ai", "enum": ["ai"], "type": "string"}, "name": {"title": "Name", "type": "string"}, "id": {"title": "Id", "type": "string"}, "example": {"title": "Example", "default": false, "type": "boolean"}}, "required": ["content"]}, "HumanMessage": {"title": "HumanMessage", "description": "Message from a human.", "type": "object", "properties": {"content": {"title": "Content", "anyOf": [{"type": "string"}, {"type": "array", "items": {"anyOf": [{"type": "string"}, {"type": "object"}]}}]}, "additional_kwargs": {"title": "Additional Kwargs", "type": "object"}, "response_metadata": {"title": "Response Metadata", "type": "object"}, "type": {"title": "Type", "default": "human", "enum": ["human"], "type": "string"}, "name": {"title": "Name", "type": "string"}, "id": {"title": "Id", "type": "string"}, "example": {"title": "Example", "default": false, "type": "boolean"}}, "required": ["content"]}, "ChatMessage": {"title": "ChatMessage", "description": "Message that can be assigned an arbitrary speaker (i.e. role).", "type": "object", "properties": {"content": {"title": "Content", "anyOf": [{"type": "string"}, {"type": "array", "items": {"anyOf": [{"type": "string"}, {"type": "object"}]}}]}, "additional_kwargs": {"title": "Additional Kwargs", "type": "object"}, "response_metadata": {"title": "Response Metadata", "type": "object"}, "type": {"title": "Type", "default": "chat", "enum": ["chat"], "type": "string"}, "name": {"title": "Name", "type": "string"}, "id": {"title": "Id", "type": "string"}, "role": {"title": "Role", "type": "string"}}, "required": ["content", "role"]}, "SystemMessage": {"title": "SystemMessage", "description": "Message for priming AI behavior, usually passed in as the first of a sequence\\nof input messages.", "type": "object", "properties": {"content": {"title": "Content", "anyOf": [{"type": "string"}, {"type": "array", "items": {"anyOf": [{"type": "string"}, {"type": "object"}]}}]}, "additional_kwargs": {"title": "Additional Kwargs", "type": "object"}, "response_metadata": {"title": "Response Metadata", "type": "object"}, "type": {"title": "Type", "default": "system", "enum": ["system"], "type": "string"}, "name": {"title": "Name", "type": "string"}, "id": {"title": "Id", "type": "string"}}, "required": ["content"]}, "FunctionMessage": {"title": "FunctionMessage", "description": "Message for passing the result of executing a function back to a model.", "type": "object", "properties": {"content": {"title": "Content", "anyOf": [{"type": "string"}, {"type": "array", "items": {"anyOf": [{"type": "string"}, {"type": "object"}]}}]}, "additional_kwargs": {"title": "Additional Kwargs", "type": "object"}, "response_metadata": {"title": "Response Metadata", "type": "object"}, "type": {"title": "Type", "default": "function", "enum": ["function"], "type": "string"}, "name": {"title": "Name", "type": "string"}, "id": {"title": "Id", "type": "string"}}, "required": ["content", "name"]}, "ToolMessage": {"title": "ToolMessage", "description": "Message for passing the result of executing a tool back to a model.", "type": "object", "properties": {"content": {"title": "Content", "anyOf": [{"type": "string"}, {"type": "array", "items": {"anyOf": [{"type": "string"}, {"type": "object"}]}}]}, "additional_kwargs": {"title": "Additional Kwargs", "type": "object"}, "response_metadata": {"title": "Response Metadata", "type": "object"}, "type": {"title": "Type", "default": "tool", "enum": ["tool"], "type": "string"}, "name": {"title": "Name", "type": "string"}, "id": {"title": "Id", "type": "string"}, "tool_call_id": {"title": "Tool Call Id", "type": "string"}}, "required": ["content", "tool_call_id"]}}}' # --- # name: test_message_graph[end_of_step].1 - '{"title": "LangGraphOutput", "type": "array", "items": {"anyOf": [{"$ref": "#/definitions/AIMessage"}, {"$ref": "#/definitions/HumanMessage"}, {"$ref": "#/definitions/ChatMessage"}, {"$ref": "#/definitions/SystemMessage"}, {"$ref": "#/definitions/FunctionMessage"}, {"$ref": "#/definitions/ToolMessage"}]}, "definitions": {"AIMessage": {"title": "AIMessage", "description": "Message from an AI.", "type": "object", "properties": {"content": {"title": "Content", "anyOf": [{"type": "string"}, {"type": "array", "items": {"anyOf": [{"type": "string"}, {"type": "object"}]}}]}, "additional_kwargs": {"title": "Additional Kwargs", "type": "object"}, "type": {"title": "Type", "default": "ai", "enum": ["ai"], "type": "string"}, "name": {"title": "Name", "type": "string"}, "id": {"title": "Id", "type": "string"}, "example": {"title": "Example", "default": false, "type": "boolean"}}, "required": ["content"]}, "HumanMessage": {"title": "HumanMessage", "description": "Message from a human.", "type": "object", "properties": {"content": {"title": "Content", "anyOf": [{"type": "string"}, {"type": "array", "items": {"anyOf": [{"type": "string"}, {"type": "object"}]}}]}, "additional_kwargs": {"title": "Additional Kwargs", "type": "object"}, "type": {"title": "Type", "default": "human", "enum": ["human"], "type": "string"}, "name": {"title": "Name", "type": "string"}, "id": {"title": "Id", "type": "string"}, "example": {"title": "Example", "default": false, "type": "boolean"}}, "required": ["content"]}, "ChatMessage": {"title": "ChatMessage", "description": "Message that can be assigned an arbitrary speaker (i.e. role).", "type": "object", "properties": {"content": {"title": "Content", "anyOf": [{"type": "string"}, {"type": "array", "items": {"anyOf": [{"type": "string"}, {"type": "object"}]}}]}, "additional_kwargs": {"title": "Additional Kwargs", "type": "object"}, "type": {"title": "Type", "default": "chat", "enum": ["chat"], "type": "string"}, "name": {"title": "Name", "type": "string"}, "id": {"title": "Id", "type": "string"}, "role": {"title": "Role", "type": "string"}}, "required": ["content", "role"]}, "SystemMessage": {"title": "SystemMessage", "description": "Message for priming AI behavior, usually passed in as the first of a sequence\\nof input messages.", "type": "object", "properties": {"content": {"title": "Content", "anyOf": [{"type": "string"}, {"type": "array", "items": {"anyOf": [{"type": "string"}, {"type": "object"}]}}]}, "additional_kwargs": {"title": "Additional Kwargs", "type": "object"}, "type": {"title": "Type", "default": "system", "enum": ["system"], "type": "string"}, "name": {"title": "Name", "type": "string"}, "id": {"title": "Id", "type": "string"}}, "required": ["content"]}, "FunctionMessage": {"title": "FunctionMessage", "description": "Message for passing the result of executing a function back to a model.", "type": "object", "properties": {"content": {"title": "Content", "anyOf": [{"type": "string"}, {"type": "array", "items": {"anyOf": [{"type": "string"}, {"type": "object"}]}}]}, "additional_kwargs": {"title": "Additional Kwargs", "type": "object"}, "type": {"title": "Type", "default": "function", "enum": ["function"], "type": "string"}, "name": {"title": "Name", "type": "string"}, "id": {"title": "Id", "type": "string"}}, "required": ["content", "name"]}, "ToolMessage": {"title": "ToolMessage", "description": "Message for passing the result of executing a tool back to a model.", "type": "object", "properties": {"content": {"title": "Content", "anyOf": [{"type": "string"}, {"type": "array", "items": {"anyOf": [{"type": "string"}, {"type": "object"}]}}]}, "additional_kwargs": {"title": "Additional Kwargs", "type": "object"}, "type": {"title": "Type", "default": "tool", "enum": ["tool"], "type": "string"}, "name": {"title": "Name", "type": "string"}, "id": {"title": "Id", "type": "string"}, "tool_call_id": {"title": "Tool Call Id", "type": "string"}}, "required": ["content", "tool_call_id"]}}}' + '{"title": "LangGraphOutput", "type": "array", "items": {"anyOf": [{"$ref": "#/definitions/AIMessage"}, {"$ref": "#/definitions/HumanMessage"}, {"$ref": "#/definitions/ChatMessage"}, {"$ref": "#/definitions/SystemMessage"}, {"$ref": "#/definitions/FunctionMessage"}, {"$ref": "#/definitions/ToolMessage"}]}, "definitions": {"AIMessage": {"title": "AIMessage", "description": "Message from an AI.", "type": "object", "properties": {"content": {"title": "Content", "anyOf": [{"type": "string"}, {"type": "array", "items": {"anyOf": [{"type": "string"}, {"type": "object"}]}}]}, "additional_kwargs": {"title": "Additional Kwargs", "type": "object"}, "response_metadata": {"title": "Response Metadata", "type": "object"}, "type": {"title": "Type", "default": "ai", "enum": ["ai"], "type": "string"}, "name": {"title": "Name", "type": "string"}, "id": {"title": "Id", "type": "string"}, "example": {"title": "Example", "default": false, "type": "boolean"}}, "required": ["content"]}, "HumanMessage": {"title": "HumanMessage", "description": "Message from a human.", "type": "object", "properties": {"content": {"title": "Content", "anyOf": [{"type": "string"}, {"type": "array", "items": {"anyOf": [{"type": "string"}, {"type": "object"}]}}]}, "additional_kwargs": {"title": "Additional Kwargs", "type": "object"}, "response_metadata": {"title": "Response Metadata", "type": "object"}, "type": {"title": "Type", "default": "human", "enum": ["human"], "type": "string"}, "name": {"title": "Name", "type": "string"}, "id": {"title": "Id", "type": "string"}, "example": {"title": "Example", "default": false, "type": "boolean"}}, "required": ["content"]}, "ChatMessage": {"title": "ChatMessage", "description": "Message that can be assigned an arbitrary speaker (i.e. role).", "type": "object", "properties": {"content": {"title": "Content", "anyOf": [{"type": "string"}, {"type": "array", "items": {"anyOf": [{"type": "string"}, {"type": "object"}]}}]}, "additional_kwargs": {"title": "Additional Kwargs", "type": "object"}, "response_metadata": {"title": "Response Metadata", "type": "object"}, "type": {"title": "Type", "default": "chat", "enum": ["chat"], "type": "string"}, "name": {"title": "Name", "type": "string"}, "id": {"title": "Id", "type": "string"}, "role": {"title": "Role", "type": "string"}}, "required": ["content", "role"]}, "SystemMessage": {"title": "SystemMessage", "description": "Message for priming AI behavior, usually passed in as the first of a sequence\\nof input messages.", "type": "object", "properties": {"content": {"title": "Content", "anyOf": [{"type": "string"}, {"type": "array", "items": {"anyOf": [{"type": "string"}, {"type": "object"}]}}]}, "additional_kwargs": {"title": "Additional Kwargs", "type": "object"}, "response_metadata": {"title": "Response Metadata", "type": "object"}, "type": {"title": "Type", "default": "system", "enum": ["system"], "type": "string"}, "name": {"title": "Name", "type": "string"}, "id": {"title": "Id", "type": "string"}}, "required": ["content"]}, "FunctionMessage": {"title": "FunctionMessage", "description": "Message for passing the result of executing a function back to a model.", "type": "object", "properties": {"content": {"title": "Content", "anyOf": [{"type": "string"}, {"type": "array", "items": {"anyOf": [{"type": "string"}, {"type": "object"}]}}]}, "additional_kwargs": {"title": "Additional Kwargs", "type": "object"}, "response_metadata": {"title": "Response Metadata", "type": "object"}, "type": {"title": "Type", "default": "function", "enum": ["function"], "type": "string"}, "name": {"title": "Name", "type": "string"}, "id": {"title": "Id", "type": "string"}}, "required": ["content", "name"]}, "ToolMessage": {"title": "ToolMessage", "description": "Message for passing the result of executing a tool back to a model.", "type": "object", "properties": {"content": {"title": "Content", "anyOf": [{"type": "string"}, {"type": "array", "items": {"anyOf": [{"type": "string"}, {"type": "object"}]}}]}, "additional_kwargs": {"title": "Additional Kwargs", "type": "object"}, "response_metadata": {"title": "Response Metadata", "type": "object"}, "type": {"title": "Type", "default": "tool", "enum": ["tool"], "type": "string"}, "name": {"title": "Name", "type": "string"}, "id": {"title": "Id", "type": "string"}, "tool_call_id": {"title": "Tool Call Id", "type": "string"}}, "required": ["content", "tool_call_id"]}}}' # --- # name: test_message_graph[end_of_step].2 ''' @@ -2545,720 +1269,12 @@ { "id": "__start__", "type": "schema", - "data": { - "title": "LangGraphInput", - "type": "array", - "items": { - "anyOf": [ - { - "$ref": "#/definitions/AIMessage" - }, - { - "$ref": "#/definitions/HumanMessage" - }, - { - "$ref": "#/definitions/ChatMessage" - }, - { - "$ref": "#/definitions/SystemMessage" - }, - { - "$ref": "#/definitions/FunctionMessage" - }, - { - "$ref": "#/definitions/ToolMessage" - } - ] - }, - "definitions": { - "AIMessage": { - "title": "AIMessage", - "description": "Message from an AI.", - "type": "object", - "properties": { - "content": { - "title": "Content", - "anyOf": [ - { - "type": "string" - }, - { - "type": "array", - "items": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "object" - } - ] - } - } - ] - }, - "additional_kwargs": { - "title": "Additional Kwargs", - "type": "object" - }, - "type": { - "title": "Type", - "default": "ai", - "enum": [ - "ai" - ], - "type": "string" - }, - "name": { - "title": "Name", - "type": "string" - }, - "id": { - "title": "Id", - "type": "string" - }, - "example": { - "title": "Example", - "default": false, - "type": "boolean" - } - }, - "required": [ - "content" - ] - }, - "HumanMessage": { - "title": "HumanMessage", - "description": "Message from a human.", - "type": "object", - "properties": { - "content": { - "title": "Content", - "anyOf": [ - { - "type": "string" - }, - { - "type": "array", - "items": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "object" - } - ] - } - } - ] - }, - "additional_kwargs": { - "title": "Additional Kwargs", - "type": "object" - }, - "type": { - "title": "Type", - "default": "human", - "enum": [ - "human" - ], - "type": "string" - }, - "name": { - "title": "Name", - "type": "string" - }, - "id": { - "title": "Id", - "type": "string" - }, - "example": { - "title": "Example", - "default": false, - "type": "boolean" - } - }, - "required": [ - "content" - ] - }, - "ChatMessage": { - "title": "ChatMessage", - "description": "Message that can be assigned an arbitrary speaker (i.e. role).", - "type": "object", - "properties": { - "content": { - "title": "Content", - "anyOf": [ - { - "type": "string" - }, - { - "type": "array", - "items": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "object" - } - ] - } - } - ] - }, - "additional_kwargs": { - "title": "Additional Kwargs", - "type": "object" - }, - "type": { - "title": "Type", - "default": "chat", - "enum": [ - "chat" - ], - "type": "string" - }, - "name": { - "title": "Name", - "type": "string" - }, - "id": { - "title": "Id", - "type": "string" - }, - "role": { - "title": "Role", - "type": "string" - } - }, - "required": [ - "content", - "role" - ] - }, - "SystemMessage": { - "title": "SystemMessage", - "description": "Message for priming AI behavior, usually passed in as the first of a sequence\nof input messages.", - "type": "object", - "properties": { - "content": { - "title": "Content", - "anyOf": [ - { - "type": "string" - }, - { - "type": "array", - "items": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "object" - } - ] - } - } - ] - }, - "additional_kwargs": { - "title": "Additional Kwargs", - "type": "object" - }, - "type": { - "title": "Type", - "default": "system", - "enum": [ - "system" - ], - "type": "string" - }, - "name": { - "title": "Name", - "type": "string" - }, - "id": { - "title": "Id", - "type": "string" - } - }, - "required": [ - "content" - ] - }, - "FunctionMessage": { - "title": "FunctionMessage", - "description": "Message for passing the result of executing a function back to a model.", - "type": "object", - "properties": { - "content": { - "title": "Content", - "anyOf": [ - { - "type": "string" - }, - { - "type": "array", - "items": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "object" - } - ] - } - } - ] - }, - "additional_kwargs": { - "title": "Additional Kwargs", - "type": "object" - }, - "type": { - "title": "Type", - "default": "function", - "enum": [ - "function" - ], - "type": "string" - }, - "name": { - "title": "Name", - "type": "string" - }, - "id": { - "title": "Id", - "type": "string" - } - }, - "required": [ - "content", - "name" - ] - }, - "ToolMessage": { - "title": "ToolMessage", - "description": "Message for passing the result of executing a tool back to a model.", - "type": "object", - "properties": { - "content": { - "title": "Content", - "anyOf": [ - { - "type": "string" - }, - { - "type": "array", - "items": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "object" - } - ] - } - } - ] - }, - "additional_kwargs": { - "title": "Additional Kwargs", - "type": "object" - }, - "type": { - "title": "Type", - "default": "tool", - "enum": [ - "tool" - ], - "type": "string" - }, - "name": { - "title": "Name", - "type": "string" - }, - "id": { - "title": "Id", - "type": "string" - }, - "tool_call_id": { - "title": "Tool Call Id", - "type": "string" - } - }, - "required": [ - "content", - "tool_call_id" - ] - } - } - } + "data": "__start__" }, { "id": "__end__", "type": "schema", - "data": { - "title": "LangGraphOutput", - "type": "array", - "items": { - "anyOf": [ - { - "$ref": "#/definitions/AIMessage" - }, - { - "$ref": "#/definitions/HumanMessage" - }, - { - "$ref": "#/definitions/ChatMessage" - }, - { - "$ref": "#/definitions/SystemMessage" - }, - { - "$ref": "#/definitions/FunctionMessage" - }, - { - "$ref": "#/definitions/ToolMessage" - } - ] - }, - "definitions": { - "AIMessage": { - "title": "AIMessage", - "description": "Message from an AI.", - "type": "object", - "properties": { - "content": { - "title": "Content", - "anyOf": [ - { - "type": "string" - }, - { - "type": "array", - "items": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "object" - } - ] - } - } - ] - }, - "additional_kwargs": { - "title": "Additional Kwargs", - "type": "object" - }, - "type": { - "title": "Type", - "default": "ai", - "enum": [ - "ai" - ], - "type": "string" - }, - "name": { - "title": "Name", - "type": "string" - }, - "id": { - "title": "Id", - "type": "string" - }, - "example": { - "title": "Example", - "default": false, - "type": "boolean" - } - }, - "required": [ - "content" - ] - }, - "HumanMessage": { - "title": "HumanMessage", - "description": "Message from a human.", - "type": "object", - "properties": { - "content": { - "title": "Content", - "anyOf": [ - { - "type": "string" - }, - { - "type": "array", - "items": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "object" - } - ] - } - } - ] - }, - "additional_kwargs": { - "title": "Additional Kwargs", - "type": "object" - }, - "type": { - "title": "Type", - "default": "human", - "enum": [ - "human" - ], - "type": "string" - }, - "name": { - "title": "Name", - "type": "string" - }, - "id": { - "title": "Id", - "type": "string" - }, - "example": { - "title": "Example", - "default": false, - "type": "boolean" - } - }, - "required": [ - "content" - ] - }, - "ChatMessage": { - "title": "ChatMessage", - "description": "Message that can be assigned an arbitrary speaker (i.e. role).", - "type": "object", - "properties": { - "content": { - "title": "Content", - "anyOf": [ - { - "type": "string" - }, - { - "type": "array", - "items": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "object" - } - ] - } - } - ] - }, - "additional_kwargs": { - "title": "Additional Kwargs", - "type": "object" - }, - "type": { - "title": "Type", - "default": "chat", - "enum": [ - "chat" - ], - "type": "string" - }, - "name": { - "title": "Name", - "type": "string" - }, - "id": { - "title": "Id", - "type": "string" - }, - "role": { - "title": "Role", - "type": "string" - } - }, - "required": [ - "content", - "role" - ] - }, - "SystemMessage": { - "title": "SystemMessage", - "description": "Message for priming AI behavior, usually passed in as the first of a sequence\nof input messages.", - "type": "object", - "properties": { - "content": { - "title": "Content", - "anyOf": [ - { - "type": "string" - }, - { - "type": "array", - "items": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "object" - } - ] - } - } - ] - }, - "additional_kwargs": { - "title": "Additional Kwargs", - "type": "object" - }, - "type": { - "title": "Type", - "default": "system", - "enum": [ - "system" - ], - "type": "string" - }, - "name": { - "title": "Name", - "type": "string" - }, - "id": { - "title": "Id", - "type": "string" - } - }, - "required": [ - "content" - ] - }, - "FunctionMessage": { - "title": "FunctionMessage", - "description": "Message for passing the result of executing a function back to a model.", - "type": "object", - "properties": { - "content": { - "title": "Content", - "anyOf": [ - { - "type": "string" - }, - { - "type": "array", - "items": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "object" - } - ] - } - } - ] - }, - "additional_kwargs": { - "title": "Additional Kwargs", - "type": "object" - }, - "type": { - "title": "Type", - "default": "function", - "enum": [ - "function" - ], - "type": "string" - }, - "name": { - "title": "Name", - "type": "string" - }, - "id": { - "title": "Id", - "type": "string" - } - }, - "required": [ - "content", - "name" - ] - }, - "ToolMessage": { - "title": "ToolMessage", - "description": "Message for passing the result of executing a tool back to a model.", - "type": "object", - "properties": { - "content": { - "title": "Content", - "anyOf": [ - { - "type": "string" - }, - { - "type": "array", - "items": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "object" - } - ] - } - } - ] - }, - "additional_kwargs": { - "title": "Additional Kwargs", - "type": "object" - }, - "type": { - "title": "Type", - "default": "tool", - "enum": [ - "tool" - ], - "type": "string" - }, - "name": { - "title": "Name", - "type": "string" - }, - "id": { - "title": "Id", - "type": "string" - }, - "tool_call_id": { - "title": "Tool Call Id", - "type": "string" - } - }, - "required": [ - "content", - "tool_call_id" - ] - } - } - } + "data": "__end__" }, { "id": "agent", @@ -3287,8 +1303,16 @@ }, { "id": "agent_should_continue", - "type": "unknown", - "data": "agent_should_continue" + "type": "runnable", + "data": { + "id": [ + "langchain_core", + "runnables", + "base", + "RunnableLambda" + ], + "name": "should_continue" + } } ], "edges": [ @@ -3344,10 +1368,10 @@ ''' # --- # name: test_prebuilt_chat - '{"title": "LangGraphInput", "$ref": "#/definitions/AgentState", "definitions": {"BaseMessage": {"title": "BaseMessage", "description": "Base abstract Message class.\\n\\nMessages are the inputs and outputs of ChatModels.", "type": "object", "properties": {"content": {"title": "Content", "anyOf": [{"type": "string"}, {"type": "array", "items": {"anyOf": [{"type": "string"}, {"type": "object"}]}}]}, "additional_kwargs": {"title": "Additional Kwargs", "type": "object"}, "type": {"title": "Type", "type": "string"}, "name": {"title": "Name", "type": "string"}, "id": {"title": "Id", "type": "string"}}, "required": ["content", "type"]}, "AgentState": {"title": "AgentState", "type": "object", "properties": {"messages": {"title": "Messages", "type": "array", "items": {"$ref": "#/definitions/BaseMessage"}}}, "required": ["messages"]}}}' + '{"title": "LangGraphInput", "$ref": "#/definitions/AgentState", "definitions": {"BaseMessage": {"title": "BaseMessage", "description": "Base abstract Message class.\\n\\nMessages are the inputs and outputs of ChatModels.", "type": "object", "properties": {"content": {"title": "Content", "anyOf": [{"type": "string"}, {"type": "array", "items": {"anyOf": [{"type": "string"}, {"type": "object"}]}}]}, "additional_kwargs": {"title": "Additional Kwargs", "type": "object"}, "response_metadata": {"title": "Response Metadata", "type": "object"}, "type": {"title": "Type", "type": "string"}, "name": {"title": "Name", "type": "string"}, "id": {"title": "Id", "type": "string"}}, "required": ["content", "type"]}, "AgentState": {"title": "AgentState", "type": "object", "properties": {"messages": {"title": "Messages", "type": "array", "items": {"$ref": "#/definitions/BaseMessage"}}}, "required": ["messages"]}}}' # --- # name: test_prebuilt_chat.1 - '{"title": "LangGraphOutput", "type": "object", "properties": {"messages": {"title": "Messages", "type": "array", "items": {"$ref": "#/definitions/BaseMessage"}}}, "definitions": {"BaseMessage": {"title": "BaseMessage", "description": "Base abstract Message class.\\n\\nMessages are the inputs and outputs of ChatModels.", "type": "object", "properties": {"content": {"title": "Content", "anyOf": [{"type": "string"}, {"type": "array", "items": {"anyOf": [{"type": "string"}, {"type": "object"}]}}]}, "additional_kwargs": {"title": "Additional Kwargs", "type": "object"}, "type": {"title": "Type", "type": "string"}, "name": {"title": "Name", "type": "string"}, "id": {"title": "Id", "type": "string"}}, "required": ["content", "type"]}}}' + '{"title": "LangGraphOutput", "type": "object", "properties": {"messages": {"title": "Messages", "type": "array", "items": {"$ref": "#/definitions/BaseMessage"}}}, "definitions": {"BaseMessage": {"title": "BaseMessage", "description": "Base abstract Message class.\\n\\nMessages are the inputs and outputs of ChatModels.", "type": "object", "properties": {"content": {"title": "Content", "anyOf": [{"type": "string"}, {"type": "array", "items": {"anyOf": [{"type": "string"}, {"type": "object"}]}}]}, "additional_kwargs": {"title": "Additional Kwargs", "type": "object"}, "response_metadata": {"title": "Response Metadata", "type": "object"}, "type": {"title": "Type", "type": "string"}, "name": {"title": "Name", "type": "string"}, "id": {"title": "Id", "type": "string"}}, "required": ["content", "type"]}}}' # --- # name: test_prebuilt_chat.2 ''' @@ -3356,143 +1380,12 @@ { "id": "__start__", "type": "schema", - "data": { - "title": "LangGraphInput", - "$ref": "#/definitions/AgentState", - "definitions": { - "BaseMessage": { - "title": "BaseMessage", - "description": "Base abstract Message class.\n\nMessages are the inputs and outputs of ChatModels.", - "type": "object", - "properties": { - "content": { - "title": "Content", - "anyOf": [ - { - "type": "string" - }, - { - "type": "array", - "items": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "object" - } - ] - } - } - ] - }, - "additional_kwargs": { - "title": "Additional Kwargs", - "type": "object" - }, - "type": { - "title": "Type", - "type": "string" - }, - "name": { - "title": "Name", - "type": "string" - }, - "id": { - "title": "Id", - "type": "string" - } - }, - "required": [ - "content", - "type" - ] - }, - "AgentState": { - "title": "AgentState", - "type": "object", - "properties": { - "messages": { - "title": "Messages", - "type": "array", - "items": { - "$ref": "#/definitions/BaseMessage" - } - } - }, - "required": [ - "messages" - ] - } - } - } + "data": "__start__" }, { "id": "__end__", "type": "schema", - "data": { - "title": "LangGraphOutput", - "type": "object", - "properties": { - "messages": { - "title": "Messages", - "type": "array", - "items": { - "$ref": "#/definitions/BaseMessage" - } - } - }, - "definitions": { - "BaseMessage": { - "title": "BaseMessage", - "description": "Base abstract Message class.\n\nMessages are the inputs and outputs of ChatModels.", - "type": "object", - "properties": { - "content": { - "title": "Content", - "anyOf": [ - { - "type": "string" - }, - { - "type": "array", - "items": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "object" - } - ] - } - } - ] - }, - "additional_kwargs": { - "title": "Additional Kwargs", - "type": "object" - }, - "type": { - "title": "Type", - "type": "string" - }, - "name": { - "title": "Name", - "type": "string" - }, - "id": { - "title": "Id", - "type": "string" - } - }, - "required": [ - "content", - "type" - ] - } - } - } + "data": "__end__" }, { "id": "agent", @@ -3522,8 +1415,16 @@ }, { "id": "agent_should_continue", - "type": "unknown", - "data": "agent_should_continue" + "type": "runnable", + "data": { + "id": [ + "langchain_core", + "runnables", + "base", + "RunnableLambda" + ], + "name": "should_continue" + } } ], "edges": [ @@ -3579,10 +1480,10 @@ ''' # --- # name: test_prebuilt_tool_chat - '{"title": "LangGraphInput", "$ref": "#/definitions/AgentState", "definitions": {"BaseMessage": {"title": "BaseMessage", "description": "Base abstract Message class.\\n\\nMessages are the inputs and outputs of ChatModels.", "type": "object", "properties": {"content": {"title": "Content", "anyOf": [{"type": "string"}, {"type": "array", "items": {"anyOf": [{"type": "string"}, {"type": "object"}]}}]}, "additional_kwargs": {"title": "Additional Kwargs", "type": "object"}, "type": {"title": "Type", "type": "string"}, "name": {"title": "Name", "type": "string"}, "id": {"title": "Id", "type": "string"}}, "required": ["content", "type"]}, "AgentState": {"title": "AgentState", "type": "object", "properties": {"messages": {"title": "Messages", "type": "array", "items": {"$ref": "#/definitions/BaseMessage"}}}, "required": ["messages"]}}}' + '{"title": "LangGraphInput", "$ref": "#/definitions/AgentState", "definitions": {"BaseMessage": {"title": "BaseMessage", "description": "Base abstract Message class.\\n\\nMessages are the inputs and outputs of ChatModels.", "type": "object", "properties": {"content": {"title": "Content", "anyOf": [{"type": "string"}, {"type": "array", "items": {"anyOf": [{"type": "string"}, {"type": "object"}]}}]}, "additional_kwargs": {"title": "Additional Kwargs", "type": "object"}, "response_metadata": {"title": "Response Metadata", "type": "object"}, "type": {"title": "Type", "type": "string"}, "name": {"title": "Name", "type": "string"}, "id": {"title": "Id", "type": "string"}}, "required": ["content", "type"]}, "AgentState": {"title": "AgentState", "type": "object", "properties": {"messages": {"title": "Messages", "type": "array", "items": {"$ref": "#/definitions/BaseMessage"}}}, "required": ["messages"]}}}' # --- # name: test_prebuilt_tool_chat.1 - '{"title": "LangGraphOutput", "type": "object", "properties": {"messages": {"title": "Messages", "type": "array", "items": {"$ref": "#/definitions/BaseMessage"}}}, "definitions": {"BaseMessage": {"title": "BaseMessage", "description": "Base abstract Message class.\\n\\nMessages are the inputs and outputs of ChatModels.", "type": "object", "properties": {"content": {"title": "Content", "anyOf": [{"type": "string"}, {"type": "array", "items": {"anyOf": [{"type": "string"}, {"type": "object"}]}}]}, "additional_kwargs": {"title": "Additional Kwargs", "type": "object"}, "type": {"title": "Type", "type": "string"}, "name": {"title": "Name", "type": "string"}, "id": {"title": "Id", "type": "string"}}, "required": ["content", "type"]}}}' + '{"title": "LangGraphOutput", "type": "object", "properties": {"messages": {"title": "Messages", "type": "array", "items": {"$ref": "#/definitions/BaseMessage"}}}, "definitions": {"BaseMessage": {"title": "BaseMessage", "description": "Base abstract Message class.\\n\\nMessages are the inputs and outputs of ChatModels.", "type": "object", "properties": {"content": {"title": "Content", "anyOf": [{"type": "string"}, {"type": "array", "items": {"anyOf": [{"type": "string"}, {"type": "object"}]}}]}, "additional_kwargs": {"title": "Additional Kwargs", "type": "object"}, "response_metadata": {"title": "Response Metadata", "type": "object"}, "type": {"title": "Type", "type": "string"}, "name": {"title": "Name", "type": "string"}, "id": {"title": "Id", "type": "string"}}, "required": ["content", "type"]}}}' # --- # name: test_prebuilt_tool_chat.2 ''' @@ -3591,143 +1492,12 @@ { "id": "__start__", "type": "schema", - "data": { - "title": "LangGraphInput", - "$ref": "#/definitions/AgentState", - "definitions": { - "BaseMessage": { - "title": "BaseMessage", - "description": "Base abstract Message class.\n\nMessages are the inputs and outputs of ChatModels.", - "type": "object", - "properties": { - "content": { - "title": "Content", - "anyOf": [ - { - "type": "string" - }, - { - "type": "array", - "items": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "object" - } - ] - } - } - ] - }, - "additional_kwargs": { - "title": "Additional Kwargs", - "type": "object" - }, - "type": { - "title": "Type", - "type": "string" - }, - "name": { - "title": "Name", - "type": "string" - }, - "id": { - "title": "Id", - "type": "string" - } - }, - "required": [ - "content", - "type" - ] - }, - "AgentState": { - "title": "AgentState", - "type": "object", - "properties": { - "messages": { - "title": "Messages", - "type": "array", - "items": { - "$ref": "#/definitions/BaseMessage" - } - } - }, - "required": [ - "messages" - ] - } - } - } + "data": "__start__" }, { "id": "__end__", "type": "schema", - "data": { - "title": "LangGraphOutput", - "type": "object", - "properties": { - "messages": { - "title": "Messages", - "type": "array", - "items": { - "$ref": "#/definitions/BaseMessage" - } - } - }, - "definitions": { - "BaseMessage": { - "title": "BaseMessage", - "description": "Base abstract Message class.\n\nMessages are the inputs and outputs of ChatModels.", - "type": "object", - "properties": { - "content": { - "title": "Content", - "anyOf": [ - { - "type": "string" - }, - { - "type": "array", - "items": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "object" - } - ] - } - } - ] - }, - "additional_kwargs": { - "title": "Additional Kwargs", - "type": "object" - }, - "type": { - "title": "Type", - "type": "string" - }, - "name": { - "title": "Name", - "type": "string" - }, - "id": { - "title": "Id", - "type": "string" - } - }, - "required": [ - "content", - "type" - ] - } - } - } + "data": "__end__" }, { "id": "agent", @@ -3757,8 +1527,16 @@ }, { "id": "agent_should_continue", - "type": "unknown", - "data": "agent_should_continue" + "type": "runnable", + "data": { + "id": [ + "langchain_core", + "runnables", + "base", + "RunnableLambda" + ], + "name": "should_continue" + } } ], "edges": [ diff --git a/tests/test_pregel.py b/tests/test_pregel.py index e3cc6c203..1f4703b7e 100644 --- a/tests/test_pregel.py +++ b/tests/test_pregel.py @@ -1773,6 +1773,7 @@ def test_conditional_entrypoint_graph_state(snapshot: SnapshotAssertion) -> None class AgentState(TypedDict, total=False): input: str output: str + steps: Annotated[list[str], operator.add] def left(data: AgentState) -> AgentState: return {"output": data["input"] + "->left"} @@ -1781,6 +1782,7 @@ def test_conditional_entrypoint_graph_state(snapshot: SnapshotAssertion) -> None return {"output": data["input"] + "->right"} def should_start(data: AgentState) -> str: + assert data["steps"] == [], "Expected input to be read from the state" # Logic to decide where to start if len(data["input"]) > 10: return "go-right" @@ -1891,6 +1893,7 @@ def test_prebuilt_tool_chat(snapshot: SnapshotAssertion) -> None: "messages": [ HumanMessage(content="what is weather in sf"), AIMessage( + id=AnyStr(), content="", additional_kwargs={ "tool_calls": [ @@ -1907,6 +1910,7 @@ def test_prebuilt_tool_chat(snapshot: SnapshotAssertion) -> None: ), ToolMessage(content="result for query", tool_call_id="tool_call123"), AIMessage( + id=AnyStr(), content="", additional_kwargs={ "tool_calls": [ @@ -1931,7 +1935,7 @@ def test_prebuilt_tool_chat(snapshot: SnapshotAssertion) -> None: ), ToolMessage(content="result for another", tool_call_id="tool_call234"), ToolMessage(content="result for a third one", tool_call_id="tool_call567"), - AIMessage(content="answer"), + AIMessage(content="answer", id=AnyStr()), ] } @@ -1942,6 +1946,7 @@ def test_prebuilt_tool_chat(snapshot: SnapshotAssertion) -> None: "agent": { "messages": [ AIMessage( + id=AnyStr(), content="", additional_kwargs={ "tool_calls": [ @@ -1970,6 +1975,7 @@ def test_prebuilt_tool_chat(snapshot: SnapshotAssertion) -> None: "agent": { "messages": [ AIMessage( + id=AnyStr(), content="", additional_kwargs={ "tool_calls": [ @@ -2007,7 +2013,7 @@ def test_prebuilt_tool_chat(snapshot: SnapshotAssertion) -> None: ] } }, - {"agent": {"messages": [AIMessage(content="answer")]}}, + {"agent": {"messages": [AIMessage(content="answer", id=AnyStr())]}}, ] @@ -2065,6 +2071,7 @@ def test_prebuilt_chat(snapshot: SnapshotAssertion) -> None: "messages": [ HumanMessage(content="what is weather in sf"), AIMessage( + id=AnyStr(), content="", additional_kwargs={ "function_call": {"name": "search_api", "arguments": '"query"'} @@ -2072,13 +2079,14 @@ def test_prebuilt_chat(snapshot: SnapshotAssertion) -> None: ), FunctionMessage(content="result for query", name="search_api"), AIMessage( + id=AnyStr(), content="", additional_kwargs={ "function_call": {"name": "search_api", "arguments": '"another"'} }, ), FunctionMessage(content="result for another", name="search_api"), - AIMessage(content="answer"), + AIMessage(content="answer", id=AnyStr()), ] } @@ -2089,6 +2097,7 @@ def test_prebuilt_chat(snapshot: SnapshotAssertion) -> None: "agent": { "messages": [ AIMessage( + id=AnyStr(), content="", additional_kwargs={ "function_call": { @@ -2111,6 +2120,7 @@ def test_prebuilt_chat(snapshot: SnapshotAssertion) -> None: "agent": { "messages": [ AIMessage( + id=AnyStr(), content="", additional_kwargs={ "function_call": { @@ -2129,7 +2139,7 @@ def test_prebuilt_chat(snapshot: SnapshotAssertion) -> None: ] } }, - {"agent": {"messages": [AIMessage(content="answer")]}}, + {"agent": {"messages": [AIMessage(content="answer", id=AnyStr())]}}, ] diff --git a/tests/test_pregel_async.py b/tests/test_pregel_async.py index e258dc6d6..6f591767a 100644 --- a/tests/test_pregel_async.py +++ b/tests/test_pregel_async.py @@ -1814,6 +1814,7 @@ async def test_conditional_entrypoint_graph_state() -> None: class AgentState(TypedDict, total=False): input: str output: str + steps: Annotated[list[str], operator.add] async def left(data: AgentState) -> AgentState: return {"output": data["input"] + "->left"} @@ -1822,6 +1823,7 @@ async def test_conditional_entrypoint_graph_state() -> None: return {"output": data["input"] + "->right"} def should_start(data: AgentState) -> str: + assert data["steps"] == [], "Expected input to be read from the state" # Logic to decide where to start if len(data["input"]) > 10: return "go-right" @@ -1922,6 +1924,7 @@ async def test_prebuilt_tool_chat() -> None: "messages": [ HumanMessage(content="what is weather in sf"), AIMessage( + id=AnyStr(), content="", additional_kwargs={ "tool_calls": [ @@ -1938,6 +1941,7 @@ async def test_prebuilt_tool_chat() -> None: ), ToolMessage(content="result for query", tool_call_id="tool_call123"), AIMessage( + id=AnyStr(), content="", additional_kwargs={ "tool_calls": [ @@ -1962,7 +1966,7 @@ async def test_prebuilt_tool_chat() -> None: ), ToolMessage(content="result for another", tool_call_id="tool_call234"), ToolMessage(content="result for a third one", tool_call_id="tool_call567"), - AIMessage(content="answer"), + AIMessage(content="answer", id=AnyStr()), ] } @@ -1976,6 +1980,7 @@ async def test_prebuilt_tool_chat() -> None: "agent": { "messages": [ AIMessage( + id=AnyStr(), content="", additional_kwargs={ "tool_calls": [ @@ -2004,6 +2009,7 @@ async def test_prebuilt_tool_chat() -> None: "agent": { "messages": [ AIMessage( + id=AnyStr(), content="", additional_kwargs={ "tool_calls": [ @@ -2041,7 +2047,7 @@ async def test_prebuilt_tool_chat() -> None: ] } }, - {"agent": {"messages": [AIMessage(content="answer")]}}, + {"agent": {"messages": [AIMessage(content="answer", id=AnyStr())]}}, ] @@ -2094,6 +2100,7 @@ async def test_prebuilt_chat() -> None: "messages": [ HumanMessage(content="what is weather in sf"), AIMessage( + id=AnyStr(), content="", additional_kwargs={ "function_call": {"name": "search_api", "arguments": '"query"'} @@ -2101,13 +2108,14 @@ async def test_prebuilt_chat() -> None: ), FunctionMessage(content="result for query", name="search_api"), AIMessage( + id=AnyStr(), content="", additional_kwargs={ "function_call": {"name": "search_api", "arguments": '"another"'} }, ), FunctionMessage(content="result for another", name="search_api"), - AIMessage(content="answer"), + AIMessage(content="answer", id=AnyStr()), ] } @@ -2121,6 +2129,7 @@ async def test_prebuilt_chat() -> None: "agent": { "messages": [ AIMessage( + id=AnyStr(), content="", additional_kwargs={ "function_call": { @@ -2143,6 +2152,7 @@ async def test_prebuilt_chat() -> None: "agent": { "messages": [ AIMessage( + id=AnyStr(), content="", additional_kwargs={ "function_call": { @@ -2161,7 +2171,7 @@ async def test_prebuilt_chat() -> None: ] } }, - {"agent": {"messages": [AIMessage(content="answer")]}}, + {"agent": {"messages": [AIMessage(content="answer", id=AnyStr())]}}, ]