langgraph-api 0.2.44__py3-none-any.whl → 0.2.46__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.

Potentially problematic release.


This version of langgraph-api might be problematic. Click here for more details.

langgraph_api/worker.py CHANGED
@@ -1,7 +1,7 @@
1
1
  import asyncio
2
2
  import time
3
3
  from collections.abc import AsyncGenerator
4
- from contextlib import AsyncExitStack, asynccontextmanager
4
+ from contextlib import asynccontextmanager
5
5
  from datetime import UTC, datetime
6
6
  from typing import TypedDict, cast
7
7
 
@@ -20,17 +20,13 @@ from langgraph_api.errors import UserInterrupt, UserRollback
20
20
  from langgraph_api.js.errors import RemoteException
21
21
  from langgraph_api.metadata import incr_runs
22
22
  from langgraph_api.schema import Run
23
+ from langgraph_api.state import state_snapshot_to_thread_state
23
24
  from langgraph_api.stream import astream_state, consume
24
- from langgraph_api.utils import set_auth_ctx, with_user
25
+ from langgraph_api.utils import with_user
25
26
  from langgraph_runtime.database import connect
26
27
  from langgraph_runtime.ops import Runs, Threads
27
28
  from langgraph_runtime.retry import RETRIABLE_EXCEPTIONS
28
29
 
29
- try:
30
- from psycopg.errors import InFailedSqlTransaction
31
- except ImportError:
32
- InFailedSqlTransaction = ()
33
-
34
30
  logger = structlog.stdlib.get_logger(__name__)
35
31
 
36
32
 
@@ -90,45 +86,41 @@ async def worker(
90
86
  if request_created_at is not None
91
87
  else None
92
88
  )
93
- async with (
94
- connect() as conn,
95
- set_auth_ctx_for_run(run["kwargs"]),
96
- Runs.enter(run_id, main_loop) as done,
97
- AsyncExitStack() as exit_stack,
98
- ):
99
- temporary = run["kwargs"].get("temporary", False)
100
- resumable = run["kwargs"].get("resumable", False)
101
- run_created_at = run["created_at"].isoformat()
102
- lg_logging.set_logging_context(
103
- {
104
- "run_id": str(run_id),
105
- "run_attempt": attempt,
106
- "thread_id": str(run.get("thread_id")),
107
- "assistant_id": str(run.get("assistant_id")),
108
- "graph_id": _get_graph_id(run),
109
- "request_id": _get_request_id(run),
110
- }
111
- )
112
- run_stream_started_at = datetime.now(UTC)
113
- await logger.ainfo(
114
- "Starting background run",
115
- run_started_at=run_started_at.isoformat(),
116
- run_creation_ms=run_creation_ms,
117
- run_queue_ms=ms(run_started_at, run["created_at"]),
118
- run_stream_start_ms=ms(run_stream_started_at, run_started_at),
119
- )
89
+ temporary = run["kwargs"].get("temporary", False)
90
+ resumable = run["kwargs"].get("resumable", False)
91
+ run_created_at = run["created_at"].isoformat()
92
+ lg_logging.set_logging_context(
93
+ {
94
+ "run_id": str(run_id),
95
+ "run_attempt": attempt,
96
+ "thread_id": str(run.get("thread_id")),
97
+ "assistant_id": str(run.get("assistant_id")),
98
+ "graph_id": _get_graph_id(run),
99
+ "request_id": _get_request_id(run),
100
+ }
101
+ )
102
+ run_stream_started_at = datetime.now(UTC)
103
+ await logger.ainfo(
104
+ "Starting background run",
105
+ run_started_at=run_started_at.isoformat(),
106
+ run_creation_ms=run_creation_ms,
107
+ run_queue_ms=ms(run_started_at, run["created_at"]),
108
+ run_stream_start_ms=ms(run_stream_started_at, run_started_at),
109
+ )
120
110
 
121
- def on_checkpoint(checkpoint_arg: CheckpointPayload):
122
- nonlocal checkpoint
123
- checkpoint = checkpoint_arg
111
+ def on_checkpoint(checkpoint_arg: CheckpointPayload):
112
+ nonlocal checkpoint
113
+ checkpoint = checkpoint_arg
124
114
 
125
- def on_task_result(task_result: TaskResultPayload):
126
- if checkpoint is not None:
127
- for task in checkpoint["tasks"]:
128
- if task["id"] == task_result["id"]:
129
- task.update(task_result)
130
- break
115
+ def on_task_result(task_result: TaskResultPayload):
116
+ if checkpoint is not None:
117
+ for task in checkpoint["tasks"]:
118
+ if task["id"] == task_result["id"]:
119
+ task.update(task_result)
120
+ break
131
121
 
122
+ async with Runs.enter(run_id, main_loop) as done:
123
+ # attempt the run
132
124
  try:
133
125
  if attempt > BG_JOB_MAX_RETRIES:
134
126
  await logger.aerror(
@@ -155,70 +147,25 @@ async def worker(
155
147
  )
156
148
 
157
149
  raise RuntimeError(error_message)
158
- if temporary:
159
- stream = astream_state(exit_stack, conn, cast(Run, run), attempt, done)
160
- else:
161
- stream = astream_state(
162
- exit_stack,
163
- conn,
164
- cast(Run, run),
165
- attempt,
166
- done,
167
- on_checkpoint=on_checkpoint,
168
- on_task_result=on_task_result,
150
+ async with set_auth_ctx_for_run(run["kwargs"]):
151
+ if temporary:
152
+ stream = astream_state(cast(Run, run), attempt, done)
153
+ else:
154
+ stream = astream_state(
155
+ cast(Run, run),
156
+ attempt,
157
+ done,
158
+ on_checkpoint=on_checkpoint,
159
+ on_task_result=on_task_result,
160
+ )
161
+ await asyncio.wait_for(
162
+ consume(stream, run_id, resumable),
163
+ BG_JOB_TIMEOUT_SECS,
169
164
  )
170
- await asyncio.wait_for(
171
- consume(stream, run_id, resumable),
172
- BG_JOB_TIMEOUT_SECS,
173
- )
174
- run_ended_at_dt = datetime.now(UTC)
175
- run_ended_at = run_ended_at_dt.isoformat()
176
- await logger.ainfo(
177
- "Background run succeeded",
178
- run_id=str(run_id),
179
- run_attempt=attempt,
180
- run_created_at=run_created_at,
181
- run_started_at=run_started_at.isoformat(),
182
- run_ended_at=run_ended_at,
183
- run_exec_ms=ms(run_ended_at_dt, run_started_at),
184
- run_completed_in_ms=(
185
- int((run_ended_at_dt.timestamp() * 1_000) - request_created_at)
186
- if request_created_at is not None
187
- else None
188
- ),
189
- )
190
- status = "success"
191
- await Runs.set_status(conn, run_id, "success")
192
- except TimeoutError as e:
193
- exception = e
194
- status = "timeout"
195
- run_ended_at = datetime.now(UTC).isoformat()
196
- await logger.awarning(
197
- "Background run timed out",
198
- run_id=str(run_id),
199
- run_attempt=attempt,
200
- run_created_at=run_created_at,
201
- run_started_at=run_started_at.isoformat(),
202
- run_ended_at=run_ended_at,
203
- run_exec_ms=ms(datetime.now(UTC), run_started_at),
204
- run_completed_in_ms=(
205
- int((run_ended_at_dt.timestamp() * 1_000) - request_created_at)
206
- if request_created_at is not None
207
- else None
208
- ),
209
- )
210
- await Runs.set_status(conn, run_id, "timeout")
211
- except UserRollback as e:
212
- exception = e
213
- status = "rollback"
214
- run_ended_at_dt = datetime.now(UTC)
215
- run_ended_at = run_ended_at_dt.isoformat()
216
- try:
217
- # Need to close the pipeline to re-use the connection
218
- await exit_stack.aclose()
219
- await Runs.delete(conn, run_id, thread_id=run["thread_id"])
165
+ run_ended_at_dt = datetime.now(UTC)
166
+ run_ended_at = run_ended_at_dt.isoformat()
220
167
  await logger.ainfo(
221
- "Background run rolled back",
168
+ "Background run succeeded",
222
169
  run_id=str(run_id),
223
170
  run_attempt=attempt,
224
171
  run_created_at=run_created_at,
@@ -231,118 +178,163 @@ async def worker(
231
178
  else None
232
179
  ),
233
180
  )
181
+ except Exception as ee:
182
+ # Note we don't handle asyncio.CancelledError here, as we want to
183
+ # let it bubble up and rollback db transaction, thus marking the run
184
+ # as available to be picked up by another worker
185
+ exception = ee
234
186
 
235
- except InFailedSqlTransaction as e:
236
- await logger.ainfo(
237
- "Ignoring rollback error",
187
+ # handle exceptions and set status
188
+ async with connect() as conn:
189
+ if exception is None:
190
+ status = "success"
191
+ await Runs.set_status(conn, run_id, "success")
192
+ # If a stateful run succeeded but no checkpoint was returned, likely
193
+ # there was a retriable exception that resumed right at the end
194
+ if checkpoint is None and not temporary:
195
+ await logger.ainfo(
196
+ "Fetching missing checkpoint for webhook",
197
+ run_id=str(run_id),
198
+ run_attempt=attempt,
199
+ )
200
+ try:
201
+ state_snapshot = await Threads.State.get(
202
+ conn, run["kwargs"]["config"]
203
+ )
204
+ checkpoint = state_snapshot_to_thread_state(state_snapshot)
205
+ except Exception:
206
+ await logger.aerror(
207
+ "Failed to fetch missing checkpoint for webhook. Continuing...",
208
+ exc_info=True,
209
+ run_id=str(run_id),
210
+ run_attempt=attempt,
211
+ )
212
+ elif isinstance(exception, TimeoutError):
213
+ status = "timeout"
214
+ run_ended_at = datetime.now(UTC).isoformat()
215
+ await logger.awarning(
216
+ "Background run timed out",
238
217
  run_id=str(run_id),
239
218
  run_attempt=attempt,
240
219
  run_created_at=run_created_at,
241
- exc=str(e),
220
+ run_started_at=run_started_at.isoformat(),
221
+ run_ended_at=run_ended_at,
222
+ run_exec_ms=ms(datetime.now(UTC), run_started_at),
223
+ run_completed_in_ms=(
224
+ int((run_ended_at_dt.timestamp() * 1_000) - request_created_at)
225
+ if request_created_at is not None
226
+ else None
227
+ ),
242
228
  )
243
- except HTTPException as e:
244
- if e.status_code == 404:
229
+ await Runs.set_status(conn, run_id, "timeout")
230
+ elif isinstance(exception, UserRollback):
231
+ status = "rollback"
232
+ run_ended_at_dt = datetime.now(UTC)
233
+ run_ended_at = run_ended_at_dt.isoformat()
234
+ try:
235
+ await Runs.delete(conn, run_id, thread_id=run["thread_id"])
245
236
  await logger.ainfo(
246
- "Ignoring rollback error for missing run",
237
+ "Background run rolled back",
247
238
  run_id=str(run_id),
248
239
  run_attempt=attempt,
249
240
  run_created_at=run_created_at,
241
+ run_started_at=run_started_at.isoformat(),
242
+ run_ended_at=run_ended_at,
243
+ run_exec_ms=ms(run_ended_at_dt, run_started_at),
244
+ run_completed_in_ms=(
245
+ int(
246
+ (run_ended_at_dt.timestamp() * 1_000)
247
+ - request_created_at
248
+ )
249
+ if request_created_at is not None
250
+ else None
251
+ ),
250
252
  )
251
- else:
252
- raise
253
+ except HTTPException as e:
254
+ if e.status_code == 404:
255
+ await logger.ainfo(
256
+ "Ignoring rollback error for missing run",
257
+ run_id=str(run_id),
258
+ run_attempt=attempt,
259
+ run_created_at=run_created_at,
260
+ )
261
+ else:
262
+ raise
253
263
 
254
- checkpoint = None # reset the checkpoint
255
- except UserInterrupt as e:
256
- exception = e
257
- status = "interrupted"
258
- run_ended_at_dt = datetime.now(UTC)
259
- run_ended_at = run_ended_at_dt.isoformat()
260
- await logger.ainfo(
261
- "Background run interrupted",
262
- run_id=str(run_id),
263
- run_attempt=attempt,
264
- run_created_at=run_created_at,
265
- run_started_at=run_started_at.isoformat(),
266
- run_ended_at=run_ended_at,
267
- run_exec_ms=ms(run_ended_at_dt, run_started_at),
268
- run_completed_in_ms=(
269
- int((run_ended_at_dt.timestamp() * 1_000) - request_created_at)
270
- if request_created_at is not None
271
- else None
272
- ),
273
- )
274
- await Runs.set_status(conn, run_id, "interrupted")
275
- except RETRIABLE_EXCEPTIONS as e:
276
- exception = e
277
- status = "retry"
278
- run_ended_at_dt = datetime.now(UTC)
279
- run_ended_at = run_ended_at_dt.isoformat()
280
- await logger.awarning(
281
- f"Background run failed, will retry. Exception: {e}",
282
- exc_info=True,
283
- run_id=str(run_id),
284
- run_attempt=attempt,
285
- run_created_at=run_created_at,
286
- run_started_at=run_started_at.isoformat(),
287
- run_ended_at=run_ended_at,
288
- run_exec_ms=ms(run_ended_at_dt, run_started_at),
289
- )
290
- await Runs.set_status(conn, run_id, "pending")
291
- raise
292
- except Exception as exc:
293
- exception = exc
294
- status = "error"
295
- run_ended_at_dt = datetime.now(UTC)
296
- run_ended_at = run_ended_at_dt.isoformat()
297
- await logger.aexception(
298
- f"Background run failed. Exception: {exc}",
299
- exc_info=not isinstance(exc, RemoteException),
300
- run_id=str(run_id),
301
- run_attempt=attempt,
302
- run_created_at=run_created_at,
303
- run_started_at=run_started_at.isoformat(),
304
- run_ended_at=run_ended_at,
305
- run_exec_ms=ms(run_ended_at_dt, run_started_at),
306
- )
307
- await Runs.set_status(conn, run_id, "error")
308
- set_auth_ctx(None, None)
309
- # delete or set status of thread
310
- if temporary:
311
- await Threads.delete(conn, run["thread_id"])
312
- else:
313
- try:
314
- await Threads.set_status(conn, run["thread_id"], checkpoint, exception)
315
- except HTTPException as e:
316
- if e.status_code == 404:
317
- await logger.ainfo(
318
- "Ignoring set_status error for missing thread", exc=str(e)
319
- )
264
+ checkpoint = None # reset the checkpoint
265
+ elif isinstance(exception, UserInterrupt):
266
+ status = "interrupted"
267
+ run_ended_at_dt = datetime.now(UTC)
268
+ run_ended_at = run_ended_at_dt.isoformat()
269
+ await logger.ainfo(
270
+ "Background run interrupted",
271
+ run_id=str(run_id),
272
+ run_attempt=attempt,
273
+ run_created_at=run_created_at,
274
+ run_started_at=run_started_at.isoformat(),
275
+ run_ended_at=run_ended_at,
276
+ run_exec_ms=ms(run_ended_at_dt, run_started_at),
277
+ run_completed_in_ms=(
278
+ int((run_ended_at_dt.timestamp() * 1_000) - request_created_at)
279
+ if request_created_at is not None
280
+ else None
281
+ ),
282
+ )
283
+ await Runs.set_status(conn, run_id, "interrupted")
284
+ elif isinstance(exception, RETRIABLE_EXCEPTIONS):
285
+ status = "retry"
286
+ run_ended_at_dt = datetime.now(UTC)
287
+ run_ended_at = run_ended_at_dt.isoformat()
288
+ await logger.awarning(
289
+ f"Background run failed, will retry. Exception: {exception}",
290
+ exc_info=True,
291
+ run_id=str(run_id),
292
+ run_attempt=attempt,
293
+ run_created_at=run_created_at,
294
+ run_started_at=run_started_at.isoformat(),
295
+ run_ended_at=run_ended_at,
296
+ run_exec_ms=ms(run_ended_at_dt, run_started_at),
297
+ )
298
+ await Runs.set_status(conn, run_id, "pending")
299
+ else:
300
+ status = "error"
301
+ run_ended_at_dt = datetime.now(UTC)
302
+ run_ended_at = run_ended_at_dt.isoformat()
303
+ await logger.aexception(
304
+ f"Background run failed. Exception: {exception}",
305
+ exc_info=not isinstance(exception, RemoteException),
306
+ run_id=str(run_id),
307
+ run_attempt=attempt,
308
+ run_created_at=run_created_at,
309
+ run_started_at=run_started_at.isoformat(),
310
+ run_ended_at=run_ended_at,
311
+ run_exec_ms=ms(run_ended_at_dt, run_started_at),
312
+ )
313
+ await Runs.set_status(conn, run_id, "error")
314
+
315
+ # delete or set status of thread
316
+ if not isinstance(exception, RETRIABLE_EXCEPTIONS):
317
+ if temporary:
318
+ await Threads.delete(conn, run["thread_id"])
320
319
  else:
321
- raise
322
- # Note we don't handle asyncio.CancelledError here, as we want to
323
- # let it bubble up and rollback db transaction, thus marking the run
324
- # as available to be picked up by another worker
320
+ try:
321
+ await Threads.set_status(
322
+ conn, run["thread_id"], checkpoint, exception
323
+ )
324
+ except HTTPException as e:
325
+ if e.status_code == 404:
326
+ await logger.ainfo(
327
+ "Ignoring set_status error for missing thread",
328
+ exc=str(e),
329
+ )
330
+ else:
331
+ raise
325
332
 
326
- # If a stateful run succeeded but no checkoint was returned, it's likely because
327
- # there was a retriable exception that resumed right at the end
328
- if checkpoint is None and (not temporary) and webhook and status == "success":
329
- await logger.ainfo(
330
- "Fetching missing checkpoint for webhook",
331
- run_id=str(run_id),
332
- run_attempt=attempt,
333
- )
334
- try:
335
- state_snapshot = await Threads.State.get(
336
- conn, run["kwargs"]["config"], subgraphs=True
337
- )
338
- checkpoint = {"values": state_snapshot.values}
339
- except Exception:
340
- await logger.aerror(
341
- "Failed to fetch missing checkpoint for webhook. Continuing...",
342
- exc_info=True,
343
- run_id=str(run_id),
344
- run_attempt=attempt,
345
- )
333
+ if isinstance(exception, RETRIABLE_EXCEPTIONS):
334
+ # re-raise so Runs.enter knows not to mark as done
335
+ # Runs.enter will catch the exception, but what triggers the retry
336
+ # is setting the status to "pending"
337
+ raise exception
346
338
 
347
339
  return WorkerResult(
348
340
  checkpoint=checkpoint,
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: langgraph-api
3
- Version: 0.2.44
3
+ Version: 0.2.46
4
4
  Author-email: Nuno Campos <nuno@langchain.dev>, Will Fu-Hinthorn <will@langchain.dev>
5
5
  License: Elastic-2.0
6
6
  License-File: LICENSE
@@ -9,12 +9,12 @@ Requires-Dist: cloudpickle>=3.0.0
9
9
  Requires-Dist: cryptography<45.0,>=42.0.0
10
10
  Requires-Dist: httpx>=0.25.0
11
11
  Requires-Dist: jsonschema-rs<0.30,>=0.20.0
12
- Requires-Dist: langchain-core>=0.2.38
12
+ Requires-Dist: langchain-core>=0.3.64
13
13
  Requires-Dist: langgraph-checkpoint>=2.0.23
14
14
  Requires-Dist: langgraph-runtime-inmem<0.3,>=0.2.0
15
15
  Requires-Dist: langgraph-sdk>=0.1.66
16
16
  Requires-Dist: langgraph>=0.3.27
17
- Requires-Dist: langsmith>=0.1.112
17
+ Requires-Dist: langsmith>=0.3.45
18
18
  Requires-Dist: orjson>=3.9.7
19
19
  Requires-Dist: pyjwt>=2.9.0
20
20
  Requires-Dist: sse-starlette<2.2.0,>=2.1.0
@@ -1,4 +1,4 @@
1
- langgraph_api/__init__.py,sha256=U9IXTG0wwP5qkavLVbDEmAfwEJjO-1-R5e__z2cNpz0,23
1
+ langgraph_api/__init__.py,sha256=UXWRy3OxZgq8UtpnFH0qpST_16fmfqlmJEOi5Y-OrzI,23
2
2
  langgraph_api/asgi_transport.py,sha256=eqifhHxNnxvI7jJqrY1_8RjL4Fp9NdN4prEub2FWBt8,5091
3
3
  langgraph_api/asyncio.py,sha256=nelZwKL7iOjM5GHj1rVjiPE7igUIKLNKtc-3urxmlfo,9250
4
4
  langgraph_api/cli.py,sha256=9Ou3tGDDY_VVLt5DFle8UviJdpI4ZigC5hElYvq2-To,14519
@@ -8,7 +8,7 @@ langgraph_api/cron_scheduler.py,sha256=i87j4pJrcsmsqMKeKUs69gaAjrGaSM3pM3jnXdN5J
8
8
  langgraph_api/errors.py,sha256=Bu_i5drgNTyJcLiyrwVE_6-XrSU50BHf9TDpttki9wQ,1690
9
9
  langgraph_api/graph.py,sha256=MPm8DvInBQsq2em45c2YD5bW6T_G1LlDkAuWq-19gCQ,23240
10
10
  langgraph_api/http.py,sha256=gYbxxjY8aLnsXeJymcJ7G7Nj_yToOGpPYQqmZ1_ggfA,5240
11
- langgraph_api/logging.py,sha256=bx6kxV7O2FUnu0ubrgeJuj5q2EjYC4ve1BkbrVfzy28,3953
11
+ langgraph_api/logging.py,sha256=1BXELwUBY8gZeOWCYElbBu_GyHLM2jjlDVJznlekqvQ,4268
12
12
  langgraph_api/metadata.py,sha256=2sz9ECnbnQtgqN6ptDkRmymaVKfQPgaX-JuDJDJB47c,4254
13
13
  langgraph_api/patch.py,sha256=Dgs0PXHytekX4SUL6KsjjN0hHcOtGLvv1GRGbh6PswU,1408
14
14
  langgraph_api/queue_entrypoint.py,sha256=_41ZveMDdn9bapjA7Ik9FG3r4hyIwXESUM5F1PdlieE,2309
@@ -19,18 +19,18 @@ langgraph_api/server.py,sha256=Z_VL-kIphybTRDWBIqHMfRhgCmAFyTRqAGlgnHQF0Zg,6973
19
19
  langgraph_api/sse.py,sha256=F7swfjKBDrlUmXZ_dWuDVHtp-3o1Cpjq1lwp0bJD-nw,4223
20
20
  langgraph_api/state.py,sha256=8jx4IoTCOjTJuwzuXJKKFwo1VseHjNnw_CCq4x1SW14,2284
21
21
  langgraph_api/store.py,sha256=_xGhdwEIMoY1_hIy_oWwxZp4Y7FH833BNJfgFIhT80E,4640
22
- langgraph_api/stream.py,sha256=0qLblAQ406bGZEM1zRQKVyU407c9PjcBcgPCKN78ywc,12847
22
+ langgraph_api/stream.py,sha256=Rb9mIeG7nnGtKJhImzkNlE3c0g6C0yM6bbYXQs5GOHU,13560
23
23
  langgraph_api/thread_ttl.py,sha256=-Ox8NFHqUH3wGNdEKMIfAXUubY5WGifIgCaJ7npqLgw,1762
24
24
  langgraph_api/utils.py,sha256=92mSti9GfGdMRRWyESKQW5yV-75Z9icGHnIrBYvdypU,3619
25
25
  langgraph_api/validation.py,sha256=zMuKmwUEBjBgFMwAaeLZmatwGVijKv2sOYtYg7gfRtc,4950
26
26
  langgraph_api/webhook.py,sha256=1ncwO0rIZcj-Df9sxSnFEzd1gP1bfS4okeZQS8NSRoE,1382
27
- langgraph_api/worker.py,sha256=YjMadekwt8t7Mn-pxZe8H-SJfetT31bl3MO2WFGVzBg,14510
27
+ langgraph_api/worker.py,sha256=CWXSc4LHQLtNPJgCJC2khw6jb3DNKXnqQ4oB8-UyNSY,15163
28
28
  langgraph_api/api/__init__.py,sha256=YVzpbn5IQotvuuLG9fhS9QMrxXfP4s4EpEMG0n4q3Nw,5625
29
- langgraph_api/api/assistants.py,sha256=x_V1rnSGFYjNZFJkZKFN9yNFOqXhqkOSqMDSv3I8VeE,15880
29
+ langgraph_api/api/assistants.py,sha256=6IPVKQBlI95-Z4nYdqBY9st9oynGJAocL67cwnDaZCk,15744
30
30
  langgraph_api/api/mcp.py,sha256=RvRYgANqRzNQzSmgjNkq4RlKTtoEJYil04ot9lsmEtE,14352
31
31
  langgraph_api/api/meta.py,sha256=S6vj9lvVlZhRYDyefFtJMlqYTPxfYGC5EQKD5hx8Kp8,2946
32
32
  langgraph_api/api/openapi.py,sha256=362m6Ny8wOwZ6HrDK9JAVUzPkyLYWKeV1E71hPOaA0U,11278
33
- langgraph_api/api/runs.py,sha256=wD7Z8c7qdPCtlvzE6GxxaB3ajP0iSfn86-La-jmaWtc,19214
33
+ langgraph_api/api/runs.py,sha256=9jU9C4myBhgZXyvR9MzNn9KrpNo7DvWbg8uNeWzSmKE,19524
34
34
  langgraph_api/api/store.py,sha256=TSeMiuMfrifmEnEbL0aObC2DPeseLlmZvAMaMzPgG3Y,5535
35
35
  langgraph_api/api/threads.py,sha256=ogMKmEoiycuaV3fa5kpupDohJ7fwUOfVczt6-WSK4FE,9322
36
36
  langgraph_api/api/ui.py,sha256=2nlipYV2nUGR4T9pceaAbgN1lS3-T2zPBh7Nv3j9eZQ,2479
@@ -52,7 +52,7 @@ langgraph_api/js/client.mts,sha256=N9CTH7mbXGSD-gpv-XyruYsHI-rgrObL8cQoAp5s3_U,3
52
52
  langgraph_api/js/errors.py,sha256=Cm1TKWlUCwZReDC5AQ6SgNIVGD27Qov2xcgHyf8-GXo,361
53
53
  langgraph_api/js/global.d.ts,sha256=j4GhgtQSZ5_cHzjSPcHgMJ8tfBThxrH-pUOrrJGteOU,196
54
54
  langgraph_api/js/package.json,sha256=7_qkj-b0_bpHFFyBDgGaZl3BeuSqkbCD7wNn-ZvQeGA,1333
55
- langgraph_api/js/remote.py,sha256=utq7tjSFUf0zPLDFgC9lnsGKrtX3EVEX6IcNCc9Q1yM,35934
55
+ langgraph_api/js/remote.py,sha256=TwEpmUm6bTLnH8Ku4zCP3cCHyNrYJMIFs4TRUHQTI8Y,35796
56
56
  langgraph_api/js/schema.py,sha256=7idnv7URlYUdSNMBXQcw7E4SxaPxCq_Oxwnlml8q5ik,408
57
57
  langgraph_api/js/sse.py,sha256=lsfp4nyJyA1COmlKG9e2gJnTttf_HGCB5wyH8OZBER8,4105
58
58
  langgraph_api/js/tsconfig.json,sha256=imCYqVnqFpaBoZPx8k1nO4slHIWBFsSlmCYhO73cpBs,341
@@ -70,16 +70,24 @@ langgraph_api/middleware/http_logger.py,sha256=aj4mdisRobFePkD3Iy6-w_Mujwx4TQRaE
70
70
  langgraph_api/middleware/private_network.py,sha256=eYgdyU8AzU2XJu362i1L8aSFoQRiV7_aLBPw7_EgeqI,2111
71
71
  langgraph_api/middleware/request_id.py,sha256=fmtp0jLqoSqXTD39d9PW7jVlIvGqGurqgteMCeexRvY,1106
72
72
  langgraph_api/models/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
73
- langgraph_api/models/run.py,sha256=orI907khq8SNOJAtGed-jgMThCMzqheIZcuFT9I1_VA,14040
73
+ langgraph_api/models/run.py,sha256=j1s9KRfFXgjKUudB9z7IVJ34Klo85PPeaVFtmWHhEdo,14514
74
74
  langgraph_api/tunneling/cloudflare.py,sha256=iKb6tj-VWPlDchHFjuQyep2Dpb-w2NGfJKt-WJG9LH0,3650
75
75
  langgraph_license/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
76
76
  langgraph_license/validation.py,sha256=ZKraAVJArAABKqrmHN-EN18ncoNUmRm500Yt1Sc7tUA,537
77
77
  langgraph_runtime/__init__.py,sha256=O4GgSmu33c-Pr8Xzxj_brcK5vkm70iNTcyxEjICFZxA,1075
78
+ langgraph_runtime/checkpoint.py,sha256=J2ePryEyKJWGgxjs27qEHrjj87uPMX3Rqm3hLvG63uk,119
79
+ langgraph_runtime/database.py,sha256=ANEtfm4psr19FtpVcNs5CFWHw-JhfHvIMnkaORa4QSM,117
80
+ langgraph_runtime/lifespan.py,sha256=-YIHyEEaP_F2tSdTP0tNjfAJXs7KfxaIsWdmQAUi2KM,117
81
+ langgraph_runtime/metrics.py,sha256=CIBw3tjTg1c-o3_2InA-qV34028fQcYWBYkpN6zdEoI,116
82
+ langgraph_runtime/ops.py,sha256=ht_U9LPbHWy0l95b_Q0Vvtd7kYxeZsaSKSf0WpwHUoo,112
83
+ langgraph_runtime/queue.py,sha256=m7req6Ca9NOw1yp-zo30zGhldRWDFk4QVL_tgrVrhQg,114
84
+ langgraph_runtime/retry.py,sha256=V0duD01fO7GUQ_btQkp1aoXcEOFhXooGVP6q4yMfuyY,114
85
+ langgraph_runtime/store.py,sha256=7mowndlsIroGHv3NpTSOZDJR0lCuaYMBoTnTrewjslw,114
78
86
  LICENSE,sha256=ZPwVR73Biwm3sK6vR54djCrhaRiM4cAD2zvOQZV8Xis,3859
79
87
  logging.json,sha256=3RNjSADZmDq38eHePMm1CbP6qZ71AmpBtLwCmKU9Zgo,379
80
- openapi.json,sha256=_4GFDqbq1X9vD4_FxwahuVODJMOHx-U76gkY4rdy3DA,138189
81
- langgraph_api-0.2.44.dist-info/METADATA,sha256=9OXLai4MqakDiva3wfVGk3vmX4akdCJ1zKuvNpl62t4,3892
82
- langgraph_api-0.2.44.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
83
- langgraph_api-0.2.44.dist-info/entry_points.txt,sha256=hGedv8n7cgi41PypMfinwS_HfCwA7xJIfS0jAp8htV8,78
84
- langgraph_api-0.2.44.dist-info/licenses/LICENSE,sha256=ZPwVR73Biwm3sK6vR54djCrhaRiM4cAD2zvOQZV8Xis,3859
85
- langgraph_api-0.2.44.dist-info/RECORD,,
88
+ openapi.json,sha256=RDaC5RO3ypsQubo6SeNxXys7cLtC0-1WY5LXZ6P-Ak4,141659
89
+ langgraph_api-0.2.46.dist-info/METADATA,sha256=oU8b8_iGeOqDDk2CkTTfL0zaQQ0PJrKWsShXi6xIFfE,3891
90
+ langgraph_api-0.2.46.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
91
+ langgraph_api-0.2.46.dist-info/entry_points.txt,sha256=hGedv8n7cgi41PypMfinwS_HfCwA7xJIfS0jAp8htV8,78
92
+ langgraph_api-0.2.46.dist-info/licenses/LICENSE,sha256=ZPwVR73Biwm3sK6vR54djCrhaRiM4cAD2zvOQZV8Xis,3859
93
+ langgraph_api-0.2.46.dist-info/RECORD,,
@@ -0,0 +1,4 @@
1
+ from typing import TYPE_CHECKING
2
+
3
+ if TYPE_CHECKING:
4
+ from langgraph_runtime_inmem.checkpoint import * # noqa: F403
@@ -0,0 +1,4 @@
1
+ from typing import TYPE_CHECKING
2
+
3
+ if TYPE_CHECKING:
4
+ from langgraph_runtime_inmem.database import * # noqa: F403
@@ -0,0 +1,4 @@
1
+ from typing import TYPE_CHECKING
2
+
3
+ if TYPE_CHECKING:
4
+ from langgraph_runtime_inmem.lifespan import * # noqa: F403
@@ -0,0 +1,4 @@
1
+ from typing import TYPE_CHECKING
2
+
3
+ if TYPE_CHECKING:
4
+ from langgraph_runtime_inmem.metrics import * # noqa: F403
@@ -0,0 +1,4 @@
1
+ from typing import TYPE_CHECKING
2
+
3
+ if TYPE_CHECKING:
4
+ from langgraph_runtime_inmem.ops import * # noqa: F403
@@ -0,0 +1,4 @@
1
+ from typing import TYPE_CHECKING
2
+
3
+ if TYPE_CHECKING:
4
+ from langgraph_runtime_inmem.queue import * # noqa: F403
@@ -0,0 +1,4 @@
1
+ from typing import TYPE_CHECKING
2
+
3
+ if TYPE_CHECKING:
4
+ from langgraph_runtime_inmem.retry import * # noqa: F403
@@ -0,0 +1,4 @@
1
+ from typing import TYPE_CHECKING
2
+
3
+ if TYPE_CHECKING:
4
+ from langgraph_runtime_inmem.store import * # noqa: F403