diff --git a/README.md b/README.md
index a05b4ce97..a6d4bcddb 100644
--- a/README.md
+++ b/README.md
@@ -8,7 +8,7 @@
⚡ Building language agents as graphs ⚡
> [!NOTE]
-> Looking for the JS version? Click [here](https://github.com/langchain-ai/langgraphjs) ([JS docs](https://langchain-ai.github.io/langgraphjs/)).
+> Looking for the JS version? See the [JS repo](https://github.com/langchain-ai/langgraphjs) and the [JS docs](https://langchain-ai.github.io/langgraphjs/).
## Overview
diff --git a/docs/_scripts/_patch.py b/docs/_scripts/_patch.py
new file mode 100644
index 000000000..4b8dd3a8c
--- /dev/null
+++ b/docs/_scripts/_patch.py
@@ -0,0 +1,93 @@
+import functools
+
+from urllib3 import __version__ as urllib3version # type: ignore[import-untyped]
+from urllib3 import connection # type: ignore[import-untyped]
+
+
+def _ensure_str(s, encoding="utf-8", errors="strict") -> str:
+ if isinstance(s, str):
+ return s
+
+ if isinstance(s, bytes):
+ return s.decode(encoding, errors)
+ return str(s)
+
+
+# Copied from https://github.com/urllib3/urllib3/blob/1c994dfc8c5d5ecaee8ed3eb585d4785f5febf6e/src/urllib3/connection.py#L231
+def request(self, method, url, body=None, headers=None):
+ """Make the request.
+
+ This function is based on the urllib3 request method, with modifications
+ to handle potential issues when using vcrpy in concurrent workloads.
+
+ Args:
+ self: The HTTPConnection instance.
+ method (str): The HTTP method (e.g., 'GET', 'POST').
+ url (str): The URL for the request.
+ body (Optional[Any]): The body of the request.
+ headers (Optional[dict]): Headers to send with the request.
+
+ Returns:
+ The result of calling the parent request method.
+ """
+ # Update the inner socket's timeout value to send the request.
+ # This only triggers if the connection is re-used.
+ if getattr(self, "sock", None) is not None:
+ self.sock.settimeout(self.timeout)
+
+ if headers is None:
+ headers = {}
+ else:
+ # Avoid modifying the headers passed into .request()
+ headers = headers.copy()
+ if "user-agent" not in (_ensure_str(k.lower()) for k in headers):
+ headers["User-Agent"] = connection._get_default_user_agent()
+ # The above is all the same ^^^
+ # The following is different:
+ return self._parent_request(method, url, body=body, headers=headers)
+
+
+_PATCHED = False
+
+
+def patch_urllib3():
+ """Patch the request method of urllib3 to avoid type errors when using vcrpy.
+
+ In concurrent workloads (such as the tracing background queue), the
+ connection pool can get in a state where an HTTPConnection is created
+ before vcrpy patches the HTTPConnection class. In urllib3 >= 2.0 this isn't
+ a problem since they use the proper super().request(...) syntax, but in older
+ versions, super(HTTPConnection, self).request is used, resulting in a TypeError
+ since self is no longer a subclass of "HTTPConnection" (which at this point
+ is vcr.stubs.VCRConnection).
+
+ This method patches the class to fix the super() syntax to avoid mixed inheritance.
+ In the case of the LangSmith tracing logic, it doesn't really matter since we always
+ exclude cache checks for calls to LangSmith.
+
+ The patch is only applied for urllib3 versions older than 2.0.
+ """
+ global _PATCHED
+ if _PATCHED:
+ return
+ from packaging import version
+
+ if version.parse(urllib3version) >= version.parse("2.0"):
+ _PATCHED = True
+ return
+
+ # Lookup the parent class and its request method
+ parent_class = connection.HTTPConnection.__bases__[0]
+ parent_request = parent_class.request
+
+ def new_request(self, *args, **kwargs):
+ """Handle parent request.
+
+ This method binds the parent's request method to self and then
+ calls our modified request function.
+ """
+ self._parent_request = functools.partial(parent_request, self)
+ return request(self, *args, **kwargs)
+
+ connection.HTTPConnection.request = new_request
+ _PATCHED = True
\ No newline at end of file
diff --git a/docs/_scripts/prepare_notebooks_for_ci.py b/docs/_scripts/prepare_notebooks_for_ci.py
index dfa1e1c70..697176c8c 100644
--- a/docs/_scripts/prepare_notebooks_for_ci.py
+++ b/docs/_scripts/prepare_notebooks_for_ci.py
@@ -43,7 +43,9 @@ NOTEBOOKS_NO_EXECUTION = [
"docs/docs/tutorials/lats/lats.ipynb", # issues only when running with VCR
"docs/docs/tutorials/rag/langgraph_crag.ipynb", # flakiness from tavily
"docs/docs/tutorials/rag/langgraph_adaptive_rag.ipynb", # Cannot create a consistent method resolution error from VCR
- "docs/docs/how-tos/map-reduce.ipynb" # flakiness from structured output, only when running with VCR
+ "docs/docs/how-tos/map-reduce.ipynb", # flakiness from structured output, only when running with VCR
+ "docs/docs/tutorials/tot/tot.ipynb",
+ "docs/docs/how-tos/visualization.ipynb"
]
@@ -86,6 +88,7 @@ def add_vcr_to_notebook(
) -> nbformat.NotebookNode:
"""Inject `with vcr.cassette` into each code cell of the notebook."""
+ uses_langsmith = False
# Inject VCR context manager into each code cell
for idx, cell in enumerate(notebook.cells):
if cell.cell_type != "code":
@@ -120,6 +123,9 @@ def add_vcr_to_notebook(
f" {line}" for line in lines
)
+ if any("hub.pull" in line or "from langsmith import" in line for line in lines):
+ uses_langsmith = True
+
# Add import statement
vcr_import_lines = [
"import nest_asyncio",
@@ -152,6 +158,15 @@ def add_vcr_to_notebook(
"custom_vcr.register_serializer('advanced_compressed', AdvancedCompressedSerializer())",
"custom_vcr.serializer = 'advanced_compressed'",
]
+ if uses_langsmith:
+ vcr_import_lines.extend(
+ # patch urllib3 to handle vcr errors, see more here:
+ # https://github.com/langchain-ai/langsmith-sdk/blob/main/python/langsmith/_internal/_patch.py
+ "import sys",
+ f"sys.path.insert(0, '{os.path.join(DOCS_PATH, '_scripts')}')",
+ "import _patch as patch_urllib3",
+ "patch_urllib3.patch_urllib3()",
+ )
import_cell = nbformat.v4.new_code_cell(source="\n".join(vcr_import_lines))
import_cell.pop("id", None)
notebook.cells.insert(0, import_cell)
diff --git a/docs/docs/cloud/deployment/cloud.md b/docs/docs/cloud/deployment/cloud.md
index 754104702..ddf8e63a5 100644
--- a/docs/docs/cloud/deployment/cloud.md
+++ b/docs/docs/cloud/deployment/cloud.md
@@ -11,7 +11,7 @@ LangGraph Cloud is available within LangSmith UI...
-1. In the left-hand navigation panel, select `LangGraph Cloud`. The `LangGraph Cloud` view contains a list of existing LangGraph Cloud deployments.
+1. In the left-hand navigation panel, select `LangGraph Platform`. The `LangGraph Platform` view contains a list of existing LangGraph Cloud deployments.
1. In the top-right corner, select `+ New Deployment` to create a new deployment.
1. In the `Create New Deployment` panel, fill out the required fields.
1. `Deployment details`
@@ -38,7 +38,7 @@ When [creating a new deployment](#create-new-deployment), a new revision is crea
Starting from the LangSmith UI...
-1. In the left-hand navigation panel, select `LangGraph Cloud`. The `LangGraph Cloud` view contains a list of existing LangGraph Cloud deployments.
+1. In the left-hand navigation panel, select `LangGraph Platform`. The `LangGraph Platform` view contains a list of existing LangGraph Cloud deployments.
1. Select an existing deployment to create a new revision for.
1. In the `Deployment` view, in the top-right corner, select `+ New Revision`.
1. In the `New Revision` modal, fill out the required fields.
@@ -52,15 +52,15 @@ Starting from the LangSmi
1. Update the value of existing secrets or environment variables.
1. Select `Submit`. After a few seconds, the `New Revision` modal will close and the new revision will be queued for deployment.
-## View Build and Deployment Logs
+## View Build and Server Logs
-Build and deployment logs are available for each revision.
+Build and server logs are available for each revision.
-Starting from the `LangGraph Cloud` view...
+Starting from the `LangGraph Platform` view...
1. Select the desired revision from the `Revisions` table. A panel slides open from the right-hand side and the `Build` tab is selected by default, which displays build logs for the revision.
-1. In the panel, select the `Deploy` tab to view deployment logs for the revision.
-1. Within the `Deploy` tab, adjust the date/time range picker as needed. By default, the date/time range picker is set to the `Last 15 minutes`.
+1. In the panel, select the `Server` tab to view server logs for the revision. Server logs are only available after a revision has been deployed.
+1. Within the `Server` tab, adjust the date/time range picker as needed. By default, the date/time range picker is set to the `Last 7 days`.
## Interrupt Revision
@@ -69,7 +69,7 @@ Interrupting a revision will stop deployment of the revision.
!!! warning "Undefined Behavior"
Interrupted revisions have undefined behavior. This is only useful if you need to deploy a new revision and you already have a revision "stuck" in progress. In the future, this feature may be removed.
-Starting from the `LangGraph Cloud` view...
+Starting from the `LangGraph Platform` view...
1. Select the menu icon (three dots) on the right-hand side of the row for the desired revision from the `Revisions` table.
1. Select `Interrupt` from the menu.
@@ -79,13 +79,13 @@ Starting from the `LangGraph Cloud` view...
Starting from the LangSmith UI...
-1. In the left-hand navigation panel, select `LangGraph Cloud`. The `LangGraph Cloud` view contains a list of existing LangGraph Cloud deployments.
+1. In the left-hand navigation panel, select `LangGraph Platform`. The `LangGraph Platform` view contains a list of existing LangGraph Cloud deployments.
1. Select the menu icon (three dots) on the right-hand side of the row for the desired deployment and select `Delete`.
1. A `Confirmation` modal will appear. Select `Delete`.
## Deployment Settings
-Starting from the `LangGraph Cloud` view...
+Starting from the `LangGraph Platform` view...
1. In the top-right corner, select the gear icon (`Deployment Settings`).
1. Update the `Git Branch` to the desired branch.
diff --git a/docs/docs/cloud/reference/env_var.md b/docs/docs/cloud/reference/env_var.md
index 4d6be34e3..8f0c4c641 100644
--- a/docs/docs/cloud/reference/env_var.md
+++ b/docs/docs/cloud/reference/env_var.md
@@ -1,6 +1,6 @@
# Environment Variables
-The LangGraph Cloud API supports specific environment variables for configuring a deployment.
+The LangGraph Cloud Server supports specific environment variables for configuring a deployment.
## `LANGCHAIN_TRACING_SAMPLING_RATE`
@@ -10,10 +10,34 @@ See [!NOTE]
-> Looking for the JS version? Click [here](https://github.com/langchain-ai/langgraphjs) ([JS docs](https://langchain-ai.github.io/langgraphjs/)).
+> Looking for the JS version? See the [JS repo](https://github.com/langchain-ai/langgraphjs) and the [JS docs](https://langchain-ai.github.io/langgraphjs/).
## Overview
diff --git a/libs/langgraph/langgraph/graph/state.py b/libs/langgraph/langgraph/graph/state.py
index e412db2d5..d5e4a5480 100644
--- a/libs/langgraph/langgraph/graph/state.py
+++ b/libs/langgraph/langgraph/graph/state.py
@@ -398,9 +398,11 @@ class StateGraph(Graph):
return self
def add_edge(self, start_key: Union[str, list[str]], end_key: str) -> Self:
- """Adds a directed edge from the start node to the end node.
+ """Adds a directed edge from the start node (or list of start nodes) to the end node.
- If the graph transitions to the start_key node, it will always transition to the end_key node next.
+ When a single start node is provided, the graph will wait for that node to complete
+ before executing the end node. When multiple start nodes are provided,
+ the graph will wait for ALL of the start nodes to complete before executing the end node.
Args:
start_key (Union[str, list[str]]): The key(s) of the start node(s) of the edge.
diff --git a/libs/langgraph/langgraph/prebuilt/chat_agent_executor.py b/libs/langgraph/langgraph/prebuilt/chat_agent_executor.py
index da70f9e87..1b4797b80 100644
--- a/libs/langgraph/langgraph/prebuilt/chat_agent_executor.py
+++ b/libs/langgraph/langgraph/prebuilt/chat_agent_executor.py
@@ -554,6 +554,10 @@ def create_react_agent(
)
model_runnable = preprocessor | model
+ # If any of the tools are configured to return_directly after running,
+ # our graph needs to check if these were called
+ should_return_direct = {t.name for t in tool_classes if t.return_direct}
+
# Define the function that calls the model
def call_model(state: AgentState, config: RunnableConfig) -> AgentState:
_validate_chat_history(state["messages"])
@@ -673,10 +677,6 @@ def create_react_agent(
should_continue,
)
- # If any of the tools are configured to return_directly after running,
- # our graph needs to check if these were called
- should_return_direct = {t.name for t in tool_classes if t.return_direct}
-
def route_tool_responses(state: AgentState) -> Literal["agent", "__end__"]:
for m in reversed(state["messages"]):
if not isinstance(m, ToolMessage):
diff --git a/libs/langgraph/poetry.lock b/libs/langgraph/poetry.lock
index 52b500985..09f61d3df 100644
--- a/libs/langgraph/poetry.lock
+++ b/libs/langgraph/poetry.lock
@@ -965,13 +965,13 @@ testing = ["Django", "attrs", "colorama", "docopt", "pytest (<7.0.0)"]
[[package]]
name = "jinja2"
-version = "3.1.4"
+version = "3.1.5"
description = "A very fast and expressive template engine."
optional = false
python-versions = ">=3.7"
files = [
- {file = "jinja2-3.1.4-py3-none-any.whl", hash = "sha256:bc5dd2abb727a5319567b7a813e6a2e7318c39f4f487cfe6c89c6f9c7d25197d"},
- {file = "jinja2-3.1.4.tar.gz", hash = "sha256:4a3aee7acbbe7303aede8e9648d13b8bf88a429282aa6122a993f0ac800cb369"},
+ {file = "jinja2-3.1.5-py3-none-any.whl", hash = "sha256:aba0f4dc9ed8013c424088f68a5c226f7d6097ed89b246d7749c2ec4175c6adb"},
+ {file = "jinja2-3.1.5.tar.gz", hash = "sha256:8fefff8dc3034e27bb80d67c671eb8a9bc424c0ef4c0826edbff304cceff43bb"},
]
[package.dependencies]
diff --git a/libs/langgraph/tests/test_prebuilt.py b/libs/langgraph/tests/test_prebuilt.py
index ea44c4f0e..3186cac9e 100644
--- a/libs/langgraph/tests/test_prebuilt.py
+++ b/libs/langgraph/tests/test_prebuilt.py
@@ -1,4 +1,5 @@
import dataclasses
+import inspect
import json
from functools import partial
from typing import (
@@ -2040,3 +2041,9 @@ def test__get_state_args() -> None:
return 0.0
assert _get_state_args(foo) == {"a": None, "b": "bar"}
+
+
+def test_inspect_react() -> None:
+ model = FakeToolCallingModel(tool_calls=[])
+ agent = create_react_agent(model, [])
+ inspect.getclosurevars(agent.nodes["agent"].bound.func)
diff --git a/libs/sdk-js/package.json b/libs/sdk-js/package.json
index 727faaec0..5d27f6501 100644
--- a/libs/sdk-js/package.json
+++ b/libs/sdk-js/package.json
@@ -1,6 +1,6 @@
{
"name": "@langchain/langgraph-sdk",
- "version": "0.0.33",
+ "version": "0.0.34",
"description": "Client library for interacting with the LangGraph API",
"type": "module",
"packageManager": "yarn@1.22.19",
diff --git a/libs/sdk-js/src/client.ts b/libs/sdk-js/src/client.ts
index 581145229..b340274ca 100644
--- a/libs/sdk-js/src/client.ts
+++ b/libs/sdk-js/src/client.ts
@@ -817,6 +817,8 @@ export class RunsClient extends BaseClient {
command: payload?.command,
config: payload?.config,
metadata: payload?.metadata,
+ stream_mode: payload?.streamMode,
+ stream_subgraphs: payload?.streamSubgraphs,
assistant_id: assistantId,
interrupt_before: payload?.interruptBefore,
interrupt_after: payload?.interruptAfter,
diff --git a/libs/sdk-js/src/types.ts b/libs/sdk-js/src/types.ts
index 116a1d244..27e5c1857 100644
--- a/libs/sdk-js/src/types.ts
+++ b/libs/sdk-js/src/types.ts
@@ -1,5 +1,15 @@
import { Checkpoint, Config, Metadata } from "./schema.js";
+/**
+ * Stream modes
+ * - "values": Stream only the state values.
+ * - "messages": Stream complete messages.
+ * - "messages-tuple": Stream (message chunk, metadata) tuples.
+ * - "updates": Stream updates to the state.
+ * - "events": Stream events occurring during execution.
+ * - "debug": Stream detailed debug information.
+ * - "custom": Stream custom events.
+ */
export type StreamMode =
| "values"
| "messages"
@@ -140,13 +150,7 @@ interface RunsInvokePayload {
export interface RunsStreamPayload extends RunsInvokePayload {
/**
- * One of `"values"`, `"messages"`, `"updates"` or `"events"`.
- * - `"values"`: Stream the thread state any time it changes.
- * - `"messages"`: Stream chat messages from thread state and calls to chat models,
- * token-by-token where possible.
- * - `"updates"`: Stream the state updates returned by each node.
- * - `"events"`: Stream all events produced by the run. You can also access these
- * afterwards using the `client.runs.listEvents()` method.
+ * One of `"values"`, `"messages"`, `"messages-tuple"`, `"updates"`, `"events"`, `"debug"`, `"custom"`.
*/
streamMode?: StreamMode | Array;
@@ -162,7 +166,17 @@ export interface RunsStreamPayload extends RunsInvokePayload {
feedbackKeys?: string[];
}
-export interface RunsCreatePayload extends RunsInvokePayload {}
+export interface RunsCreatePayload extends RunsInvokePayload {
+ /**
+ * One of `"values"`, `"messages"`, `"messages-tuple"`, `"updates"`, `"events"`, `"debug"`, `"custom"`.
+ */
+ streamMode?: StreamMode | Array;
+
+ /**
+ * Stream output from subgraphs. By default, streams only the top graph.
+ */
+ streamSubgraphs?: boolean;
+}
export interface CronsCreatePayload extends RunsCreatePayload {
/**
diff --git a/poetry.lock b/poetry.lock
index 94f2b3db3..74535df36 100644
--- a/poetry.lock
+++ b/poetry.lock
@@ -2251,13 +2251,13 @@ testing = ["Django", "attrs", "colorama", "docopt", "pytest (<7.0.0)"]
[[package]]
name = "jinja2"
-version = "3.1.4"
+version = "3.1.5"
description = "A very fast and expressive template engine."
optional = false
python-versions = ">=3.7"
files = [
- {file = "jinja2-3.1.4-py3-none-any.whl", hash = "sha256:bc5dd2abb727a5319567b7a813e6a2e7318c39f4f487cfe6c89c6f9c7d25197d"},
- {file = "jinja2-3.1.4.tar.gz", hash = "sha256:4a3aee7acbbe7303aede8e9648d13b8bf88a429282aa6122a993f0ac800cb369"},
+ {file = "jinja2-3.1.5-py3-none-any.whl", hash = "sha256:aba0f4dc9ed8013c424088f68a5c226f7d6097ed89b246d7749c2ec4175c6adb"},
+ {file = "jinja2-3.1.5.tar.gz", hash = "sha256:8fefff8dc3034e27bb80d67c671eb8a9bc424c0ef4c0826edbff304cceff43bb"},
]
[package.dependencies]
@@ -2862,21 +2862,21 @@ adal = ["adal (>=1.0.2)"]
[[package]]
name = "langchain"
-version = "0.3.9"
+version = "0.3.14"
description = "Building applications with LLMs through composability"
optional = false
python-versions = "<4.0,>=3.9"
files = [
- {file = "langchain-0.3.9-py3-none-any.whl", hash = "sha256:ade5a1fee2f94f2e976a6c387f97d62cc7f0b9f26cfe0132a41d2bda761e1045"},
- {file = "langchain-0.3.9.tar.gz", hash = "sha256:4950c4ad627d0aa95ce6bda7de453e22059b7e7836b562a8f781fb0b05d7294c"},
+ {file = "langchain-0.3.14-py3-none-any.whl", hash = "sha256:5df9031702f7fe6c956e84256b4639a46d5d03a75be1ca4c1bc9479b358061a2"},
+ {file = "langchain-0.3.14.tar.gz", hash = "sha256:4a5ae817b5832fa0e1fcadc5353fbf74bebd2f8e550294d4dc039f651ddcd3d1"},
]
[package.dependencies]
aiohttp = ">=3.8.3,<4.0.0"
async-timeout = {version = ">=4.0.0,<5.0.0", markers = "python_version < \"3.11\""}
-langchain-core = ">=0.3.21,<0.4.0"
-langchain-text-splitters = ">=0.3.0,<0.4.0"
-langsmith = ">=0.1.17,<0.2.0"
+langchain-core = ">=0.3.29,<0.4.0"
+langchain-text-splitters = ">=0.3.3,<0.4.0"
+langsmith = ">=0.1.17,<0.3"
numpy = [
{version = ">=1.22.4,<2", markers = "python_version < \"3.12\""},
{version = ">=1.26.2,<3", markers = "python_version >= \"3.12\""},
@@ -2906,45 +2906,46 @@ pydantic = ">=2.7.4,<3.0.0"
[[package]]
name = "langchain-community"
-version = "0.3.1"
+version = "0.3.14"
description = "Community contributed LangChain integrations."
optional = false
python-versions = "<4.0,>=3.9"
files = [
- {file = "langchain_community-0.3.1-py3-none-any.whl", hash = "sha256:627eb26c16417764762ac47dd0d3005109f750f40242a88bb8f2958b798bcf90"},
- {file = "langchain_community-0.3.1.tar.gz", hash = "sha256:c964a70628f266a61647e58f2f0434db633d4287a729f100a81dd8b0654aec93"},
+ {file = "langchain_community-0.3.14-py3-none-any.whl", hash = "sha256:cc02a0abad0551edef3e565dff643386a5b2ee45b933b6d883d4a935b9649f3c"},
+ {file = "langchain_community-0.3.14.tar.gz", hash = "sha256:d8ba0fe2dbb5795bff707684b712baa5ee379227194610af415ccdfdefda0479"},
]
[package.dependencies]
aiohttp = ">=3.8.3,<4.0.0"
dataclasses-json = ">=0.5.7,<0.7"
-langchain = ">=0.3.1,<0.4.0"
-langchain-core = ">=0.3.6,<0.4.0"
-langsmith = ">=0.1.125,<0.2.0"
+httpx-sse = ">=0.4.0,<0.5.0"
+langchain = ">=0.3.14,<0.4.0"
+langchain-core = ">=0.3.29,<0.4.0"
+langsmith = ">=0.1.125,<0.3"
numpy = [
- {version = ">=1,<2", markers = "python_version < \"3.12\""},
- {version = ">=1.26.0,<2.0.0", markers = "python_version >= \"3.12\""},
+ {version = ">=1.22.4,<2", markers = "python_version < \"3.12\""},
+ {version = ">=1.26.2,<3", markers = "python_version >= \"3.12\""},
]
pydantic-settings = ">=2.4.0,<3.0.0"
PyYAML = ">=5.3"
requests = ">=2,<3"
SQLAlchemy = ">=1.4,<3"
-tenacity = ">=8.1.0,<8.4.0 || >8.4.0,<9.0.0"
+tenacity = ">=8.1.0,<8.4.0 || >8.4.0,<10"
[[package]]
name = "langchain-core"
-version = "0.3.23"
+version = "0.3.29"
description = "Building applications with LLMs through composability"
optional = false
python-versions = "<4.0,>=3.9"
files = [
- {file = "langchain_core-0.3.23-py3-none-any.whl", hash = "sha256:550c0b996990830fa6515a71a1192a8a0343367999afc36d4ede14222941e420"},
- {file = "langchain_core-0.3.23.tar.gz", hash = "sha256:f9e175e3b82063cc3b160c2ca2b155832e1c6f915312e1204828f97d4aabf6e1"},
+ {file = "langchain_core-0.3.29-py3-none-any.whl", hash = "sha256:817db1474871611a81105594a3e4d11704949661008e455a10e38ca9ff601a1a"},
+ {file = "langchain_core-0.3.29.tar.gz", hash = "sha256:773d6aeeb612e7ce3d996c0be403433d8c6a91e77bbb7a7461c13e15cfbe5b06"},
]
[package.dependencies]
jsonpatch = ">=1.33,<2.0"
-langsmith = ">=0.1.125,<0.2.0"
+langsmith = ">=0.1.125,<0.3"
packaging = ">=23.2,<25"
pydantic = [
{version = ">=2.5.2,<3.0.0", markers = "python_full_version < \"3.12.4\""},
@@ -3021,21 +3022,21 @@ tiktoken = ">=0.7,<1"
[[package]]
name = "langchain-text-splitters"
-version = "0.3.0"
+version = "0.3.5"
description = "LangChain text splitting utilities"
optional = false
python-versions = "<4.0,>=3.9"
files = [
- {file = "langchain_text_splitters-0.3.0-py3-none-any.whl", hash = "sha256:e84243e45eaff16e5b776cd9c81b6d07c55c010ebcb1965deb3d1792b7358e83"},
- {file = "langchain_text_splitters-0.3.0.tar.gz", hash = "sha256:f9fe0b4d244db1d6de211e7343d4abc4aa90295aa22e1f0c89e51f33c55cd7ce"},
+ {file = "langchain_text_splitters-0.3.5-py3-none-any.whl", hash = "sha256:8c9b059827438c5fa8f327b4df857e307828a5ec815163c9b5c9569a3e82c8ee"},
+ {file = "langchain_text_splitters-0.3.5.tar.gz", hash = "sha256:11cb7ca3694e5bdd342bc16d3875b7f7381651d4a53cbb91d34f22412ae16443"},
]
[package.dependencies]
-langchain-core = ">=0.3.0,<0.4.0"
+langchain-core = ">=0.3.29,<0.4.0"
[[package]]
name = "langgraph"
-version = "0.2.59"
+version = "0.2.61"
description = "Building stateful, multi-actor applications with LLMs"
optional = false
python-versions = ">=3.9.0,<4.0"
@@ -3053,7 +3054,7 @@ url = "libs/langgraph"
[[package]]
name = "langgraph-checkpoint"
-version = "2.0.8"
+version = "2.0.9"
description = "Library with base interfaces for LangGraph checkpoint savers."
optional = false
python-versions = "^3.9.0,<4.0"
@@ -3087,7 +3088,7 @@ pymongo = ">=4.9.0,<4.10.0"
[[package]]
name = "langgraph-checkpoint-postgres"
-version = "2.0.8"
+version = "2.0.9"
description = "Library with a Postgres implementation of LangGraph checkpoint saver."
optional = false
python-versions = "^3.9.0,<4.0"
@@ -3123,7 +3124,7 @@ url = "libs/checkpoint-sqlite"
[[package]]
name = "langgraph-sdk"
-version = "0.1.43"
+version = "0.1.49"
description = "SDK for interacting with LangGraph API"
optional = false
python-versions = "^3.9.0,<4.0"
@@ -3140,23 +3141,28 @@ url = "libs/sdk-py"
[[package]]
name = "langsmith"
-version = "0.1.129"
+version = "0.2.10"
description = "Client library to connect to the LangSmith LLM Tracing and Evaluation Platform."
optional = false
-python-versions = "<4.0,>=3.8.1"
+python-versions = "<4.0,>=3.9"
files = [
- {file = "langsmith-0.1.129-py3-none-any.whl", hash = "sha256:31393fbbb17d6be5b99b9b22d530450094fab23c6c37281a6a6efb2143d05347"},
- {file = "langsmith-0.1.129.tar.gz", hash = "sha256:6c3ba66471bef41b9f87da247cc0b493268b3f54656f73648a256a205261b6a0"},
+ {file = "langsmith-0.2.10-py3-none-any.whl", hash = "sha256:b02f2f174189ff72e54c88b1aa63343defd6f0f676c396a690c63a4b6495dcc2"},
+ {file = "langsmith-0.2.10.tar.gz", hash = "sha256:153c7b3ccbd823528ff5bec84801e7e50a164e388919fc583252df5b27dd7830"},
]
[package.dependencies]
httpx = ">=0.23.0,<1"
-orjson = ">=3.9.14,<4.0.0"
+orjson = {version = ">=3.9.14,<4.0.0", markers = "platform_python_implementation != \"PyPy\""}
pydantic = [
{version = ">=1,<3", markers = "python_full_version < \"3.12.4\""},
{version = ">=2.7.4,<3.0.0", markers = "python_full_version >= \"3.12.4\""},
]
requests = ">=2,<3"
+requests-toolbelt = ">=1.0.0,<2.0.0"
+
+[package.extras]
+compression = ["zstandard (>=0.23.0,<0.24.0)"]
+langsmith-pyo3 = ["langsmith-pyo3 (>=0.1.0rc2,<0.2.0)"]
[[package]]
name = "loguru"
@@ -5965,6 +5971,20 @@ requests = ">=2.0.0"
[package.extras]
rsa = ["oauthlib[signedtoken] (>=3.0.0)"]
+[[package]]
+name = "requests-toolbelt"
+version = "1.0.0"
+description = "A utility belt for advanced users of python-requests"
+optional = false
+python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*"
+files = [
+ {file = "requests-toolbelt-1.0.0.tar.gz", hash = "sha256:7681a0a3d047012b5bdc0ee37d7f8f07ebe76ab08caeccfc3921ce23c88d5bc6"},
+ {file = "requests_toolbelt-1.0.0-py2.py3-none-any.whl", hash = "sha256:cccfdd665f0a24fcf4726e690f65639d272bb0637b9b92dfd91a5568ccf6bd06"},
+]
+
+[package.dependencies]
+requests = ">=2.0.1,<3.0.0"
+
[[package]]
name = "rfc3339-validator"
version = "0.1.4"
@@ -7485,4 +7505,4 @@ type = ["pytest-mypy"]
[metadata]
lock-version = "2.0"
python-versions = "^3.10"
-content-hash = "367f5fb480a8fa5d8ab1c0964a1e9450dbb28e6998097e7536966e7a5fe30c90"
+content-hash = "981f40de9c31530b17537a089651f9e51901b945fbc01b43ac33a466c8a7d9eb"
diff --git a/pyproject.toml b/pyproject.toml
index ed09fc121..478880726 100644
--- a/pyproject.toml
+++ b/pyproject.toml
@@ -42,7 +42,7 @@ langchain-fireworks = "^0.2.0"
langchain-community = "^0.3.0"
langchain-experimental = "^0.3.2"
langgraph-checkpoint-mongodb = "^0.1.0"
-langsmith = "^0.1.129"
+langsmith = "^0.2.0"
chromadb = "^0.5.5"
gpt4all = "^2.8.2"
scikit-learn = "^1.5.2"