langgraph-api 0.4.28__py3-none-any.whl → 0.4.30__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.

@@ -18,7 +18,6 @@ import logging.config
18
18
  import pathlib
19
19
  import signal
20
20
  from contextlib import asynccontextmanager
21
- from typing import cast
22
21
 
23
22
  import structlog
24
23
 
@@ -50,7 +49,7 @@ async def health_and_metrics_server():
50
49
  metrics_format = "prometheus"
51
50
 
52
51
  metrics = get_metrics()
53
- worker_metrics = cast(dict[str, int], metrics["workers"])
52
+ worker_metrics = metrics["workers"]
54
53
  workers_max = worker_metrics["max"]
55
54
  workers_active = worker_metrics["active"]
56
55
  workers_available = worker_metrics["available"]
langgraph_api/schema.py CHANGED
@@ -62,7 +62,7 @@ class Checkpoint(TypedDict):
62
62
  checkpoint_map: dict[str, Any] | None
63
63
 
64
64
 
65
- class Assistant(TypedDict):
65
+ class Assistant(TypedDict, total=False):
66
66
  """Assistant model."""
67
67
 
68
68
  assistant_id: UUID
@@ -176,6 +176,7 @@ class RunKwargs(TypedDict):
176
176
  subgraphs: bool
177
177
  resumable: bool
178
178
  checkpoint_during: bool
179
+ durability: str | None
179
180
 
180
181
 
181
182
  class Run(TypedDict):
@@ -0,0 +1,380 @@
1
+ import os
2
+
3
+ import structlog
4
+ from opentelemetry import metrics
5
+ from opentelemetry.exporter.otlp.proto.http.metric_exporter import (
6
+ OTLPMetricExporter,
7
+ )
8
+ from opentelemetry.metrics import CallbackOptions, Observation
9
+ from opentelemetry.sdk.metrics import MeterProvider
10
+ from opentelemetry.sdk.metrics.export import PeriodicExportingMetricReader
11
+ from opentelemetry.sdk.resources import Resource
12
+
13
+ from langgraph_api import asyncio as lg_asyncio
14
+ from langgraph_api import config, metadata
15
+ from langgraph_api.http_metrics_utils import HTTP_LATENCY_BUCKETS
16
+ from langgraph_runtime.database import connect, pool_stats
17
+ from langgraph_runtime.metrics import get_metrics
18
+ from langgraph_runtime.ops import Runs
19
+
20
+ logger = structlog.stdlib.get_logger(__name__)
21
+
22
+ _meter_provider = None
23
+ _customer_attributes = {}
24
+
25
+ _http_request_counter = None
26
+ _http_latency_histogram = None
27
+
28
+
29
+ def initialize_self_hosted_metrics():
30
+ global \
31
+ _meter_provider, \
32
+ _http_request_counter, \
33
+ _http_latency_histogram, \
34
+ _customer_attributes
35
+
36
+ if not config.SELF_HOSTED_METRICS_ENABLED:
37
+ return
38
+
39
+ if not config.SELF_HOSTED_METRICS_ENDPOINT:
40
+ raise RuntimeError(
41
+ "SELF_HOSTED_METRICS_ENABLED is true but no SELF_HOSTED_METRICS_ENDPOINT is configured"
42
+ )
43
+
44
+ # for now, this is only enabled for fully self-hosted customers
45
+ # we will need to update the otel collector auth model to support hybrid customers
46
+ if not config.LANGGRAPH_CLOUD_LICENSE_KEY:
47
+ logger.warning(
48
+ "Self-hosted metrics require a license key, and do not work with hybrid deployments yet."
49
+ )
50
+ return
51
+
52
+ try:
53
+ exporter = OTLPMetricExporter(
54
+ endpoint=config.SELF_HOSTED_METRICS_ENDPOINT,
55
+ headers={"X-Langchain-License-Key": config.LANGGRAPH_CLOUD_LICENSE_KEY},
56
+ )
57
+
58
+ # this will periodically export metrics to our beacon lgp otel collector in a separate thread
59
+ metric_reader = PeriodicExportingMetricReader(
60
+ exporter=exporter,
61
+ export_interval_millis=config.SELF_HOSTED_METRICS_EXPORT_INTERVAL_MS,
62
+ )
63
+
64
+ resource_attributes = {
65
+ "service.name": "LGP_Self_Hosted",
66
+ }
67
+
68
+ resource = Resource.create(resource_attributes)
69
+
70
+ if config.LANGGRAPH_CLOUD_LICENSE_KEY:
71
+ try:
72
+ from langgraph_license.validation import (
73
+ CUSTOMER_ID, # type: ignore[unresolved-import]
74
+ CUSTOMER_NAME, # type: ignore[unresolved-import]
75
+ )
76
+
77
+ if CUSTOMER_ID:
78
+ _customer_attributes["customer_id"] = CUSTOMER_ID
79
+ if CUSTOMER_NAME:
80
+ _customer_attributes["customer_name"] = CUSTOMER_NAME
81
+ except ImportError:
82
+ pass
83
+ except Exception as e:
84
+ logger.warning("Failed to get customer info from license", exc_info=e)
85
+
86
+ # resolves to pod name in k8s, or container id in docker
87
+ instance_id = os.environ.get("HOSTNAME")
88
+ if instance_id:
89
+ _customer_attributes["instance_id"] = instance_id
90
+
91
+ _meter_provider = MeterProvider(
92
+ metric_readers=[metric_reader], resource=resource
93
+ )
94
+ metrics.set_meter_provider(_meter_provider)
95
+
96
+ meter = metrics.get_meter("langgraph_api.self_hosted")
97
+
98
+ meter.create_observable_gauge(
99
+ name="lg_api_num_pending_runs",
100
+ description="The number of runs currently pending",
101
+ unit="1",
102
+ callbacks=[_get_pending_runs_callback],
103
+ )
104
+
105
+ meter.create_observable_gauge(
106
+ name="lg_api_num_running_runs",
107
+ description="The number of runs currently running",
108
+ unit="1",
109
+ callbacks=[_get_running_runs_callback],
110
+ )
111
+
112
+ if config.N_JOBS_PER_WORKER > 0:
113
+ meter.create_observable_gauge(
114
+ name="lg_api_workers_max",
115
+ description="The maximum number of workers available",
116
+ unit="1",
117
+ callbacks=[_get_workers_max_callback],
118
+ )
119
+
120
+ meter.create_observable_gauge(
121
+ name="lg_api_workers_active",
122
+ description="The number of currently active workers",
123
+ unit="1",
124
+ callbacks=[_get_workers_active_callback],
125
+ )
126
+
127
+ meter.create_observable_gauge(
128
+ name="lg_api_workers_available",
129
+ description="The number of available (idle) workers",
130
+ unit="1",
131
+ callbacks=[_get_workers_available_callback],
132
+ )
133
+
134
+ if not config.IS_QUEUE_ENTRYPOINT and not config.IS_EXECUTOR_ENTRYPOINT:
135
+ _http_request_counter = meter.create_counter(
136
+ name="lg_api_http_requests_total",
137
+ description="Total number of HTTP requests",
138
+ unit="1",
139
+ )
140
+
141
+ _http_latency_histogram = meter.create_histogram(
142
+ name="lg_api_http_requests_latency_seconds",
143
+ description="HTTP request latency in seconds",
144
+ unit="s",
145
+ explicit_bucket_boundaries_advisory=[
146
+ b for b in HTTP_LATENCY_BUCKETS if b != float("inf")
147
+ ],
148
+ )
149
+
150
+ meter.create_observable_gauge(
151
+ name="lg_api_pg_pool_max",
152
+ description="The maximum size of the postgres connection pool",
153
+ unit="1",
154
+ callbacks=[_get_pg_pool_max_callback],
155
+ )
156
+
157
+ meter.create_observable_gauge(
158
+ name="lg_api_pg_pool_size",
159
+ description="Number of connections currently managed by the postgres connection pool",
160
+ unit="1",
161
+ callbacks=[_get_pg_pool_size_callback],
162
+ )
163
+
164
+ meter.create_observable_gauge(
165
+ name="lg_api_pg_pool_available",
166
+ description="Number of connections currently idle in the postgres connection pool",
167
+ unit="1",
168
+ callbacks=[_get_pg_pool_available_callback],
169
+ )
170
+
171
+ meter.create_observable_gauge(
172
+ name="lg_api_redis_pool_max",
173
+ description="The maximum size of the redis connection pool",
174
+ unit="1",
175
+ callbacks=[_get_redis_pool_max_callback],
176
+ )
177
+
178
+ meter.create_observable_gauge(
179
+ name="lg_api_redis_pool_size",
180
+ description="Number of connections currently in use in the redis connection pool",
181
+ unit="1",
182
+ callbacks=[_get_redis_pool_size_callback],
183
+ )
184
+
185
+ meter.create_observable_gauge(
186
+ name="lg_api_redis_pool_available",
187
+ description="Number of connections currently idle in the redis connection pool",
188
+ unit="1",
189
+ callbacks=[_get_redis_pool_available_callback],
190
+ )
191
+
192
+ logger.info(
193
+ "Self-hosted metrics initialized successfully",
194
+ endpoint=config.SELF_HOSTED_METRICS_ENDPOINT,
195
+ export_interval_ms=config.SELF_HOSTED_METRICS_EXPORT_INTERVAL_MS,
196
+ )
197
+
198
+ except Exception as e:
199
+ logger.exception("Failed to initialize self-hosted metrics", exc_info=e)
200
+
201
+
202
+ def shutdown_self_hosted_metrics():
203
+ global _meter_provider
204
+
205
+ if _meter_provider:
206
+ try:
207
+ logger.info("Shutting down self-hosted metrics")
208
+ _meter_provider.shutdown(timeout_millis=5000)
209
+ _meter_provider = None
210
+ except Exception as e:
211
+ logger.exception("Failed to shutdown self-hosted metrics", exc_info=e)
212
+
213
+
214
+ def record_http_request(
215
+ method: str, route_path: str, status: int, latency_seconds: float
216
+ ):
217
+ if not _meter_provider or not _http_request_counter or not _http_latency_histogram:
218
+ return
219
+
220
+ attributes = {"method": method, "path": route_path, "status": str(status)}
221
+ if _customer_attributes:
222
+ attributes.update(_customer_attributes)
223
+
224
+ _http_request_counter.add(1, attributes)
225
+ _http_latency_histogram.record(latency_seconds, attributes)
226
+
227
+
228
+ def _get_queue_stats():
229
+ async def _fetch_queue_stats():
230
+ try:
231
+ async with connect() as conn:
232
+ return await Runs.stats(conn)
233
+ except Exception as e:
234
+ logger.warning("Failed to get queue stats from database", exc_info=e)
235
+ return {"n_pending": 0, "n_running": 0}
236
+
237
+ try:
238
+ future = lg_asyncio.run_coroutine_threadsafe(_fetch_queue_stats())
239
+ return future.result(timeout=5)
240
+ except Exception as e:
241
+ logger.warning("Failed to get queue stats", exc_info=e)
242
+ return {"n_pending": 0, "n_running": 0}
243
+
244
+
245
+ def _get_pool_stats():
246
+ # _get_pool() inside the pool_stats fn will not work correctly if called from the daemon thread created by PeriodicExportingMetricReader,
247
+ # so we submit this as a coro to run in the main event loop
248
+ async def _fetch_pool_stats():
249
+ try:
250
+ return pool_stats(
251
+ metadata.PROJECT_ID, metadata.HOST_REVISION_ID, format="json"
252
+ )
253
+ except Exception as e:
254
+ logger.warning("Failed to get pool stats", exc_info=e)
255
+ return {"postgres": {}, "redis": {}}
256
+
257
+ try:
258
+ future = lg_asyncio.run_coroutine_threadsafe(_fetch_pool_stats())
259
+ return future.result(timeout=5)
260
+ except Exception as e:
261
+ logger.warning("Failed to get pool stats", exc_info=e)
262
+ return {"postgres": {}, "redis": {}}
263
+
264
+
265
+ def _get_pending_runs_callback(options: CallbackOptions):
266
+ try:
267
+ stats = _get_queue_stats()
268
+ return [Observation(stats.get("n_pending", 0), attributes=_customer_attributes)]
269
+ except Exception as e:
270
+ logger.warning("Failed to get pending runs", exc_info=e)
271
+ return [Observation(0, attributes=_customer_attributes)]
272
+
273
+
274
+ def _get_running_runs_callback(options: CallbackOptions):
275
+ try:
276
+ stats = _get_queue_stats()
277
+ return [Observation(stats.get("n_running", 0), attributes=_customer_attributes)]
278
+ except Exception as e:
279
+ logger.warning("Failed to get running runs", exc_info=e)
280
+ return [Observation(0, attributes=_customer_attributes)]
281
+
282
+
283
+ def _get_workers_max_callback(options: CallbackOptions):
284
+ try:
285
+ metrics_data = get_metrics()
286
+ worker_metrics = metrics_data.get("workers", {})
287
+ return [
288
+ Observation(worker_metrics.get("max", 0), attributes=_customer_attributes)
289
+ ]
290
+ except Exception as e:
291
+ logger.warning("Failed to get max workers", exc_info=e)
292
+ return [Observation(0, attributes=_customer_attributes)]
293
+
294
+
295
+ def _get_workers_active_callback(options: CallbackOptions):
296
+ try:
297
+ metrics_data = get_metrics()
298
+ worker_metrics = metrics_data.get("workers", {})
299
+ return [
300
+ Observation(
301
+ worker_metrics.get("active", 0), attributes=_customer_attributes
302
+ )
303
+ ]
304
+ except Exception as e:
305
+ logger.warning("Failed to get active workers", exc_info=e)
306
+ return [Observation(0, attributes=_customer_attributes)]
307
+
308
+
309
+ def _get_workers_available_callback(options: CallbackOptions):
310
+ try:
311
+ metrics_data = get_metrics()
312
+ worker_metrics = metrics_data.get("workers", {})
313
+ return [
314
+ Observation(
315
+ worker_metrics.get("available", 0), attributes=_customer_attributes
316
+ )
317
+ ]
318
+ except Exception as e:
319
+ logger.warning("Failed to get available workers", exc_info=e)
320
+ return [Observation(0, attributes=_customer_attributes)]
321
+
322
+
323
+ def _get_pg_pool_max_callback(options: CallbackOptions):
324
+ try:
325
+ stats = _get_pool_stats()
326
+ pg_max = stats.get("postgres", {}).get("pool_max", 0)
327
+ return [Observation(pg_max, attributes=_customer_attributes)]
328
+ except Exception as e:
329
+ logger.warning("Failed to get PG pool max", exc_info=e)
330
+ return [Observation(0, attributes=_customer_attributes)]
331
+
332
+
333
+ def _get_pg_pool_size_callback(options: CallbackOptions):
334
+ try:
335
+ stats = _get_pool_stats()
336
+ pg_size = stats.get("postgres", {}).get("pool_size", 0)
337
+ return [Observation(pg_size, attributes=_customer_attributes)]
338
+ except Exception as e:
339
+ logger.warning("Failed to get PG pool size", exc_info=e)
340
+ return [Observation(0, attributes=_customer_attributes)]
341
+
342
+
343
+ def _get_pg_pool_available_callback(options: CallbackOptions):
344
+ try:
345
+ stats = _get_pool_stats()
346
+ pg_available = stats.get("postgres", {}).get("pool_available", 0)
347
+ return [Observation(pg_available, attributes=_customer_attributes)]
348
+ except Exception as e:
349
+ logger.warning("Failed to get PG pool available", exc_info=e)
350
+ return [Observation(0, attributes=_customer_attributes)]
351
+
352
+
353
+ def _get_redis_pool_max_callback(options: CallbackOptions):
354
+ try:
355
+ stats = _get_pool_stats()
356
+ redis_max = stats.get("redis", {}).get("max_connections", 0)
357
+ return [Observation(redis_max, attributes=_customer_attributes)]
358
+ except Exception as e:
359
+ logger.warning("Failed to get Redis pool max", exc_info=e)
360
+ return [Observation(0, attributes=_customer_attributes)]
361
+
362
+
363
+ def _get_redis_pool_size_callback(options: CallbackOptions):
364
+ try:
365
+ stats = _get_pool_stats()
366
+ redis_size = stats.get("redis", {}).get("in_use_connections", 0)
367
+ return [Observation(redis_size, attributes=_customer_attributes)]
368
+ except Exception as e:
369
+ logger.warning("Failed to get Redis pool size", exc_info=e)
370
+ return [Observation(0, attributes=_customer_attributes)]
371
+
372
+
373
+ def _get_redis_pool_available_callback(options: CallbackOptions):
374
+ try:
375
+ stats = _get_pool_stats()
376
+ redis_available = stats.get("redis", {}).get("idle_connections", 0)
377
+ return [Observation(redis_available, attributes=_customer_attributes)]
378
+ except Exception as e:
379
+ logger.warning("Failed to get Redis pool available", exc_info=e)
380
+ return [Observation(0, attributes=_customer_attributes)]
langgraph_api/stream.py CHANGED
@@ -231,6 +231,8 @@ async def astream_state(
231
231
 
232
232
  # stream run
233
233
  if use_astream_events:
234
+ if USE_RUNTIME_CONTEXT_API:
235
+ kwargs["context"] = context
234
236
  async with (
235
237
  stack,
236
238
  aclosing( # type: ignore[invalid-argument-type]
@@ -1,12 +1,14 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: langgraph-api
3
- Version: 0.4.28
3
+ Version: 0.4.30
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
7
7
  Requires-Python: >=3.11
8
8
  Requires-Dist: cloudpickle>=3.0.0
9
9
  Requires-Dist: cryptography<45.0,>=42.0.0
10
+ Requires-Dist: grpcio-tools<2.0.0,>=1.75.0
11
+ Requires-Dist: grpcio<2.0.0,>=1.75.0
10
12
  Requires-Dist: httpx>=0.25.0
11
13
  Requires-Dist: jsonschema-rs<0.30,>=0.20.0
12
14
  Requires-Dist: langchain-core>=0.3.64
@@ -15,7 +17,11 @@ Requires-Dist: langgraph-runtime-inmem<0.15.0,>=0.14.0
15
17
  Requires-Dist: langgraph-sdk>=0.2.0
16
18
  Requires-Dist: langgraph>=0.4.0
17
19
  Requires-Dist: langsmith>=0.3.45
20
+ Requires-Dist: opentelemetry-api>=1.37.0
21
+ Requires-Dist: opentelemetry-exporter-otlp-proto-http>=1.37.0
22
+ Requires-Dist: opentelemetry-sdk>=1.37.0
18
23
  Requires-Dist: orjson>=3.9.7
24
+ Requires-Dist: protobuf<7.0.0,>=6.32.1
19
25
  Requires-Dist: pyjwt>=2.9.0
20
26
  Requires-Dist: sse-starlette<2.2.0,>=2.1.0
21
27
  Requires-Dist: starlette>=0.38.6
@@ -1,28 +1,30 @@
1
- langgraph_api/__init__.py,sha256=QZ0p7EqvqxpClz_YH3XtlxgPmyXKcK-CGg_B_p5Z7w0,23
1
+ langgraph_api/__init__.py,sha256=oJL8XtG8mmnvRfpE8L0X7P-SyENhGR162XgumWN6O4A,23
2
2
  langgraph_api/asgi_transport.py,sha256=XtiLOu4WWsd-xizagBLzT5xUkxc9ZG9YqwvETBPjBFE,5161
3
3
  langgraph_api/asyncio.py,sha256=FEEkLm_N-15cbElo4vQ309MkDKBZuRqAYV8VJ1DocNw,9860
4
4
  langgraph_api/cli.py,sha256=o_zD2vkky06dzW87HQgkIR1_h3ZCSZ8tgNvFCK9rKVo,19669
5
5
  langgraph_api/command.py,sha256=Bh-rvuTLwdHCqFWryCjB1M8oWxPBwRBUjMNj_04KPxM,852
6
- langgraph_api/config.py,sha256=eS0lIOMx-UhqEw9zDXcz3W5aOLX7laqxZUQcasuXoAs,12168
6
+ langgraph_api/config.py,sha256=AMcVZn8_uWjyfFEnYw6o8S7HQhwcWpAgkGu7m-gpdsY,12481
7
7
  langgraph_api/cron_scheduler.py,sha256=25wYzEQrhPEivZrAPYOmzLPDOQa-aFogU37mTXc9TJk,2566
8
8
  langgraph_api/errors.py,sha256=zlnl3xXIwVG0oGNKKpXf1an9Rn_SBDHSyhe53hU6aLw,1858
9
9
  langgraph_api/executor_entrypoint.py,sha256=CaX813ygtf9CpOaBkfkQXJAHjFtmlScCkrOvTDmu4Aw,750
10
- langgraph_api/feature_flags.py,sha256=x28NwFJXdfuGW2uUmon6lBSh0pGBo27bw_Se72TO4sM,409
11
- langgraph_api/graph.py,sha256=h1m6rsLiCocvMO283LLU03A5cBycxAIxixXu9mwzqsQ,25056
10
+ langgraph_api/feature_flags.py,sha256=taZRhukeBV8r62EmEo92rxfBwYhIw56-P_UvSzQLzt8,576
11
+ langgraph_api/graph.py,sha256=u10F9a8dxi7_Shx42xHOPi1Ri0occU6lUhWnTAF8_K4,25081
12
12
  langgraph_api/http.py,sha256=fyK-H-0UfNy_BzuVW3aWWGvhRavmGAVMkDwDArryJ_4,5659
13
- langgraph_api/http_metrics.py,sha256=MU9ccXt7aBb0AJ2SWEjwtbtbJEWmeqSdx7-CI51e32o,5594
13
+ langgraph_api/http_metrics.py,sha256=iOJKQW8VdgkhWp5aBjy1RUghH5noxJTVFPEmmXwgCbE,5097
14
+ langgraph_api/http_metrics_utils.py,sha256=sjxF7SYGTzY0Wz_G0dzatsYNnWr31S6ujej4JmBG2yo,866
14
15
  langgraph_api/logging.py,sha256=qB6q_cUba31edE4_D6dBGhdiUTpW7sXAOepUjYb_R50,5216
15
16
  langgraph_api/metadata.py,sha256=0eGYhXOW6UIVDj2Y5mOdSJz_RadgJG8xmUsC9WqwsiE,8342
16
17
  langgraph_api/patch.py,sha256=J0MmcfpZG15SUVaVcI0Z4x_c0-0rbbT7Pwh9fDAQOpA,1566
17
- langgraph_api/queue_entrypoint.py,sha256=k-Lz-HdaM2ICJacf9yCQw21GlJp00dPoHKuhe1PSrSs,6418
18
+ langgraph_api/queue_entrypoint.py,sha256=zK2V03xHsy7Y9wq_nHuCBc3_GnCuKJNR24BGv8pREnY,6372
18
19
  langgraph_api/route.py,sha256=EBhELuJ1He-ZYcAnR5YTImcIeDtWthDae5CHELBxPkM,5056
19
- langgraph_api/schema.py,sha256=AsgF0dIjBvDd_PDy20mGqB_IkBLgVvSj8qRKG_lPlec,8440
20
+ langgraph_api/schema.py,sha256=spZ_XPT4AMJfw2YatsdnMZZLzgB9Sm3YR8n0SlgGdJ8,8480
21
+ langgraph_api/self_hosted_metrics.py,sha256=JyDGs7lTKndL_vdtGq4rbPtOGdxCkil9_u6d_wTJeds,13980
20
22
  langgraph_api/serde.py,sha256=Jkww6ixP5o2YZmnXtM7ihuAYC6YSuNDNPvE-8ILoqVo,5499
21
23
  langgraph_api/server.py,sha256=C9TO7N0mzyrLulT_2FtaJfgfFbm2B4yyYTdAGPxgIeE,7255
22
24
  langgraph_api/sse.py,sha256=SLdtZmTdh5D8fbWrQjuY9HYLd2dg8Rmi6ZMmFMVc2iE,4204
23
25
  langgraph_api/state.py,sha256=AjkLbUQakIwK7oGzJ8oqubazRsXxG3vDMnRa0s0mzDM,4716
24
26
  langgraph_api/store.py,sha256=NIoNZojs6NbtG3VLBPQEFNttvp7XPkHAfjbQ3gY7aLY,4701
25
- langgraph_api/stream.py,sha256=Dqkj0soBYaZxHpI46OZAqQA4OxpLE1yUxQsHjXSR-Fk,21091
27
+ langgraph_api/stream.py,sha256=VA1CvR3kN6d03KAkSJgTVum4zfkI42cEGRqoGeEufeI,21167
26
28
  langgraph_api/thread_ttl.py,sha256=KyHnvD0e1p1cV4Z_ZvKNVzDztuI2RBCUsUO2V7GlOSw,1951
27
29
  langgraph_api/traceblock.py,sha256=Qq5CUdefnMDaRDnyvBSWGBClEj-f3oO7NbH6fedxOSE,630
28
30
  langgraph_api/validation.py,sha256=86jftgOsMa7tkeshBw6imYe7zyUXPoVuf5Voh6dFiR8,5285
@@ -30,9 +32,9 @@ langgraph_api/webhook.py,sha256=SvSM1rdnNtiH4q3JQYmAqJUk2Sable5xAcwOLuRhtlo,1723
30
32
  langgraph_api/worker.py,sha256=FQRw3kL9ynDv_LNgY_OjjPZQBuAvSQpsW6nECnABvDg,15354
31
33
  langgraph_api/api/__init__.py,sha256=raFkYH50tsO-KjRmDbGVoHCuxuH58u1lrZbr-MlITIY,6262
32
34
  langgraph_api/api/a2a.py,sha256=HIHZkLnIcM1u1FJti-L2NH-h1I9BZ_d-QW9z3gFonn8,53995
33
- langgraph_api/api/assistants.py,sha256=OX83GCWwGR8MuEJKIzAPEC4LC3Aghs5vD3NGLNnijaU,17268
35
+ langgraph_api/api/assistants.py,sha256=87FMcq8T4-7PfrAX1adOtBS_qQdomGOFpcFQw6PxZDA,17453
34
36
  langgraph_api/api/mcp.py,sha256=qe10ZRMN3f-Hli-9TI8nbQyWvMeBb72YB1PZVbyqBQw,14418
35
- langgraph_api/api/meta.py,sha256=Qyj6r5czkVJ81tpD6liFY7tlrmFDsiSfBr-4X8HJpRc,4834
37
+ langgraph_api/api/meta.py,sha256=464nRdZPCPG-T1rouypReI8SPLHZlEec8dIj22H1Vvo,4787
36
38
  langgraph_api/api/openapi.py,sha256=If-z1ckXt-Yu5bwQytK1LWyX_T7G46UtLfixgEP8hwc,11959
37
39
  langgraph_api/api/runs.py,sha256=keHlFu1iy-l1IICJHc6AKrSUoQA-LZi6FYsja7la9Xw,25436
38
40
  langgraph_api/api/store.py,sha256=xGcPFx4v-VxlK6HRU9uCjzCQ0v66cvc3o_PB5_g7n0Q,5550
@@ -46,6 +48,14 @@ langgraph_api/auth/studio_user.py,sha256=fojJpexdIZYI1w3awiqOLSwMUiK_M_3p4mlfQI0
46
48
  langgraph_api/auth/langsmith/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
47
49
  langgraph_api/auth/langsmith/backend.py,sha256=rdkz8IXLHusJqcoacvl2XuMZnQVR7PLpE0SHHcKTqv0,3664
48
50
  langgraph_api/auth/langsmith/client.py,sha256=Kn9503en1tmlNtkbvqRxYSRCOUrWaVpqvxyLLb1cgzY,3908
51
+ langgraph_api/grpc_ops/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
52
+ langgraph_api/grpc_ops/client.py,sha256=VB740C9QMhJJrpAEjsADmasN-uGd0apGYtuv_ho0Rl8,2452
53
+ langgraph_api/grpc_ops/ops.py,sha256=6xCWc5ylMcuTY_FFUJlnqPuRYOr0aOP96pXgx2X4I44,17139
54
+ langgraph_api/grpc_ops/generated/__init__.py,sha256=dRiB_iGscPKdMpuLp9ueLwAmIfRaNjNXC64ABtb4cg8,135
55
+ langgraph_api/grpc_ops/generated/core_api_pb2.py,sha256=5tvJCY00-ud-IO9OKIqRPEpUw12wjxYO3LQklMXB73o,42143
56
+ langgraph_api/grpc_ops/generated/core_api_pb2.pyi,sha256=cpbtS6nf3aaOnbBbAsyCinttxiVELmje7xf0AaRcYUM,49208
57
+ langgraph_api/grpc_ops/generated/core_api_pb2_grpc.py,sha256=Qav2DuCMUSmR8nP4-fVtUBbY0Vc42jqjCs3L4LdIl-0,52467
58
+ langgraph_api/grpc_ops/scripts/generate_protos.sh,sha256=hSf1vgS0MoTlavbaUjiDKOSujuJ1RRN19UL6HS24JY4,1486
49
59
  langgraph_api/js/.gitignore,sha256=l5yI6G_V6F1600I1IjiUKn87f4uYIrBAYU1MOyBBhg4,59
50
60
  langgraph_api/js/.prettierrc,sha256=0es3ovvyNIqIw81rPQsdt1zCQcOdBqyR_DMbFE4Ifms,19
51
61
  langgraph_api/js/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
@@ -99,8 +109,8 @@ langgraph_runtime/store.py,sha256=7mowndlsIroGHv3NpTSOZDJR0lCuaYMBoTnTrewjslw,11
99
109
  LICENSE,sha256=ZPwVR73Biwm3sK6vR54djCrhaRiM4cAD2zvOQZV8Xis,3859
100
110
  logging.json,sha256=3RNjSADZmDq38eHePMm1CbP6qZ71AmpBtLwCmKU9Zgo,379
101
111
  openapi.json,sha256=21wu-NxdxyTQwZctNcEfRkLMnSBi0QhGAfwq5kg8XNU,172618
102
- langgraph_api-0.4.28.dist-info/METADATA,sha256=qTje00tzH8lBtQcOUOFLqvnoB8siS_uFb7bUVdNzzmk,3893
103
- langgraph_api-0.4.28.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
104
- langgraph_api-0.4.28.dist-info/entry_points.txt,sha256=hGedv8n7cgi41PypMfinwS_HfCwA7xJIfS0jAp8htV8,78
105
- langgraph_api-0.4.28.dist-info/licenses/LICENSE,sha256=ZPwVR73Biwm3sK6vR54djCrhaRiM4cAD2zvOQZV8Xis,3859
106
- langgraph_api-0.4.28.dist-info/RECORD,,
112
+ langgraph_api-0.4.30.dist-info/METADATA,sha256=PYv7Rf2AYRdZAi98AFcUtg3w2E0rti6CIhFXkSBroT4,4156
113
+ langgraph_api-0.4.30.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
114
+ langgraph_api-0.4.30.dist-info/entry_points.txt,sha256=hGedv8n7cgi41PypMfinwS_HfCwA7xJIfS0jAp8htV8,78
115
+ langgraph_api-0.4.30.dist-info/licenses/LICENSE,sha256=ZPwVR73Biwm3sK6vR54djCrhaRiM4cAD2zvOQZV8Xis,3859
116
+ langgraph_api-0.4.30.dist-info/RECORD,,