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"