langgraph-api 0.2.56__py3-none-any.whl → 0.2.61__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/__init__.py CHANGED
@@ -1 +1 @@
1
- __version__ = "0.2.56"
1
+ __version__ = "0.2.61"
langgraph_api/api/meta.py CHANGED
@@ -35,9 +35,9 @@ async def meta_info(request: ApiRequest):
35
35
 
36
36
  async def meta_metrics(request: ApiRequest):
37
37
  # determine output format
38
- format = request.query_params.get("format", "prometheus")
39
- if format not in METRICS_FORMATS:
40
- format = "prometheus"
38
+ metrics_format = request.query_params.get("format", "prometheus")
39
+ if metrics_format not in METRICS_FORMATS:
40
+ metrics_format = "prometheus"
41
41
 
42
42
  # collect stats
43
43
  metrics = get_metrics()
@@ -46,7 +46,7 @@ async def meta_metrics(request: ApiRequest):
46
46
  workers_active = worker_metrics["active"]
47
47
  workers_available = worker_metrics["available"]
48
48
 
49
- if format == "json":
49
+ if metrics_format == "json":
50
50
  async with connect() as conn:
51
51
  return JSONResponse(
52
52
  {
@@ -55,7 +55,7 @@ async def meta_metrics(request: ApiRequest):
55
55
  "queue": await Runs.stats(conn),
56
56
  }
57
57
  )
58
- elif format == "prometheus":
58
+ elif metrics_format == "prometheus":
59
59
  # LANGSMITH_HOST_PROJECT_ID and LANGSMITH_HOST_REVISION_ID are injected
60
60
  # into the deployed image by host-backend.
61
61
  project_id = os.getenv("LANGSMITH_HOST_PROJECT_ID")
langgraph_api/config.py CHANGED
@@ -173,6 +173,7 @@ REDIS_URI = env("REDIS_URI", cast=str)
173
173
  REDIS_CLUSTER = env("REDIS_CLUSTER", cast=bool, default=False)
174
174
  REDIS_MAX_CONNECTIONS = env("REDIS_MAX_CONNECTIONS", cast=int, default=500)
175
175
  REDIS_CONNECT_TIMEOUT = env("REDIS_CONNECT_TIMEOUT", cast=float, default=10.0)
176
+ REDIS_MAX_IDLE_TIME = env("REDIS_MAX_IDLE_TIME", cast=float, default=120.0)
176
177
  REDIS_KEY_PREFIX = env("REDIS_KEY_PREFIX", cast=str, default="")
177
178
 
178
179
  # server
@@ -361,6 +362,7 @@ API_VARIANT = env("LANGSMITH_LANGGRAPH_API_VARIANT", cast=str, default="")
361
362
 
362
363
  # UI
363
364
  UI_USE_BUNDLER = env("LANGGRAPH_UI_BUNDLER", cast=bool, default=False)
365
+ IS_QUEUE_ENTRYPOINT = False
364
366
 
365
367
  if not os.getenv("LANGCHAIN_REVISION_ID") and (
366
368
  ref_sha := os.getenv("LANGSMITH_LANGGRAPH_GIT_REF_SHA")
langgraph_api/graph.py CHANGED
@@ -9,7 +9,6 @@ import warnings
9
9
  from collections.abc import AsyncIterator, Callable
10
10
  from contextlib import asynccontextmanager
11
11
  from itertools import filterfalse
12
- from random import choice
13
12
  from typing import TYPE_CHECKING, Any, NamedTuple
14
13
  from uuid import UUID, uuid5
15
14
 
@@ -59,23 +58,32 @@ async def register_graph(
59
58
  GRAPHS[graph_id] = graph
60
59
  if callable(graph):
61
60
  FACTORY_ACCEPTS_CONFIG[graph_id] = len(inspect.signature(graph).parameters) > 0
62
- async with connect() as conn:
63
- graph_name = getattr(graph, "name", None) if isinstance(graph, Pregel) else None
64
- assistant_name = (
65
- graph_name
66
- if graph_name is not None and graph_name != "LangGraph"
67
- else graph_id
68
- )
69
- await Assistants.put(
70
- conn,
71
- str(uuid5(NAMESPACE_GRAPH, graph_id)),
72
- graph_id=graph_id,
73
- metadata={"created_by": "system"},
74
- config=config or {},
75
- if_exists="do_nothing",
76
- name=assistant_name,
77
- description=description,
78
- )
61
+
62
+ from langgraph_runtime.retry import retry_db
63
+
64
+ @retry_db
65
+ async def register_graph_db():
66
+ async with connect() as conn:
67
+ graph_name = (
68
+ getattr(graph, "name", None) if isinstance(graph, Pregel) else None
69
+ )
70
+ assistant_name = (
71
+ graph_name
72
+ if graph_name is not None and graph_name != "LangGraph"
73
+ else graph_id
74
+ )
75
+ await Assistants.put(
76
+ conn,
77
+ str(uuid5(NAMESPACE_GRAPH, graph_id)),
78
+ graph_id=graph_id,
79
+ metadata={"created_by": "system"},
80
+ config=config or {},
81
+ if_exists="do_nothing",
82
+ name=assistant_name,
83
+ description=description,
84
+ )
85
+
86
+ await register_graph_db()
79
87
 
80
88
 
81
89
  def register_graph_sync(
@@ -408,7 +416,12 @@ def _graph_from_spec(spec: GraphSpec) -> GraphValue:
408
416
  module = importlib.import_module(spec.module)
409
417
  elif spec.path:
410
418
  try:
411
- modname = "".join(choice("abcdefghijklmnopqrstuvwxyz") for _ in range(24))
419
+ modname = (
420
+ spec.path.replace("/", "__")
421
+ .replace(".py", "")
422
+ .replace(" ", "_")
423
+ .lstrip(".")
424
+ )
412
425
  modspec = importlib.util.spec_from_file_location(modname, spec.path)
413
426
  if modspec is None:
414
427
  raise ValueError(f"Could not find python file for graph: {spec}")
@@ -561,8 +574,8 @@ def resolve_embeddings(index_config: dict) -> "Embeddings":
561
574
  try:
562
575
  if "/" in module_name:
563
576
  # Load from file path
564
- modname = "".join(
565
- choice("abcdefghijklmnopqrstuvwxyz") for _ in range(24)
577
+ modname = (
578
+ module_name.replace("/", "__").replace(".py", "").replace(" ", "_")
566
579
  )
567
580
  modspec = importlib.util.spec_from_file_location(modname, module_name)
568
581
  if modspec is None:
@@ -34,7 +34,7 @@
34
34
  "vite": "^6.1.6"
35
35
  },
36
36
  "devDependencies": {
37
- "@langchain/langgraph-sdk": "^0.0.77",
37
+ "@langchain/langgraph-sdk": "^0.0.84",
38
38
  "@types/node": "^22.2.0",
39
39
  "@types/react": "^19.0.8",
40
40
  "@types/react-dom": "^19.0.3",
@@ -236,10 +236,10 @@
236
236
  dependencies:
237
237
  uuid "^10.0.0"
238
238
 
239
- "@langchain/langgraph-sdk@^0.0.77":
240
- version "0.0.77"
241
- resolved "https://registry.yarnpkg.com/@langchain/langgraph-sdk/-/langgraph-sdk-0.0.77.tgz#adcd978843e61bbf09b9625d519dda16d27cec09"
242
- integrity sha512-DMCONENhhaMS+Buw8s2UkKjAa9I6cT1aVJEDOmTO2lpon4Dqz/jiYUVJK7pTlNVSNvSx0E8aOmtT7NgGBcWflg==
239
+ "@langchain/langgraph-sdk@^0.0.84":
240
+ version "0.0.84"
241
+ resolved "https://registry.yarnpkg.com/@langchain/langgraph-sdk/-/langgraph-sdk-0.0.84.tgz#91f1bb431838c0f945326755681dcf3465ca4962"
242
+ integrity sha512-l0PFQyJ+6m6aclORNPPWlcRwgKcXVXsPaJCbCUYFABR3yf4cOpsjhUNR0cJ7+2cS400oieHjGRdGGyO/hbSjhg==
243
243
  dependencies:
244
244
  "@types/json-schema" "^7.0.15"
245
245
  p-queue "^6.6.2"
langgraph_api/logging.py CHANGED
@@ -15,6 +15,7 @@ log_env = Config()
15
15
  LOG_JSON = log_env("LOG_JSON", cast=bool, default=False)
16
16
  LOG_COLOR = log_env("LOG_COLOR", cast=bool, default=True)
17
17
  LOG_LEVEL = log_env("LOG_LEVEL", cast=str, default="INFO")
18
+ LOG_DICT_TRACEBACKS = log_env("LOG_DICT_TRACEBACKS", cast=bool, default=True)
18
19
 
19
20
  logging.getLogger().setLevel(LOG_LEVEL.upper())
20
21
  logging.getLogger("psycopg").setLevel(logging.WARNING)
@@ -105,7 +106,7 @@ shared_processors = [
105
106
  structlog.processors.StackInfoRenderer(),
106
107
  (
107
108
  structlog.processors.dict_tracebacks
108
- if LOG_JSON
109
+ if LOG_JSON and LOG_DICT_TRACEBACKS
109
110
  else structlog.processors.format_exc_info
110
111
  ),
111
112
  structlog.processors.UnicodeDecoder(),
@@ -22,19 +22,20 @@ import structlog
22
22
  import uvloop
23
23
 
24
24
  from langgraph_runtime.lifespan import lifespan
25
+ from langgraph_runtime.metrics import get_metrics
25
26
 
26
27
  logger = structlog.stdlib.get_logger(__name__)
27
28
 
28
29
 
29
- async def healthcheck_server():
30
+ async def health_and_metrics_server():
30
31
  port = int(os.getenv("PORT", "8080"))
31
32
  ok = json.dumps({"status": "ok"}).encode()
32
33
  ok_len = str(len(ok))
33
34
 
34
- class HealthHandler(http.server.SimpleHTTPRequestHandler):
35
+ class HealthAndMetricsHandler(http.server.SimpleHTTPRequestHandler):
35
36
  def log_message(self, format, *args):
36
- # Skip logging for /ok endpoint
37
- if self.path == "/ok":
37
+ # Skip logging for /ok and /metrics endpoints
38
+ if self.path in ["/ok", "/metrics"]:
38
39
  return
39
40
  # Log other requests normally
40
41
  super().log_message(format, *args)
@@ -46,11 +47,45 @@ async def healthcheck_server():
46
47
  self.send_header("Content-Length", ok_len)
47
48
  self.end_headers()
48
49
  self.wfile.write(ok)
50
+ elif self.path == "/metrics":
51
+ metrics = get_metrics()
52
+ worker_metrics = metrics["workers"]
53
+ workers_max = worker_metrics["max"]
54
+ workers_active = worker_metrics["active"]
55
+ workers_available = worker_metrics["available"]
56
+
57
+ project_id = os.getenv("LANGSMITH_HOST_PROJECT_ID")
58
+ revision_id = os.getenv("LANGSMITH_HOST_REVISION_ID")
59
+
60
+ metrics = [
61
+ "# HELP lg_api_workers_max The maximum number of workers available.",
62
+ "# TYPE lg_api_workers_max gauge",
63
+ f'lg_api_workers_max{{project_id="{project_id}", revision_id="{revision_id}"}} {workers_max}',
64
+ "# HELP lg_api_workers_active The number of currently active workers.",
65
+ "# TYPE lg_api_workers_active gauge",
66
+ f'lg_api_workers_active{{project_id="{project_id}", revision_id="{revision_id}"}} {workers_active}',
67
+ "# HELP lg_api_workers_available The number of available (idle) workers.",
68
+ "# TYPE lg_api_workers_available gauge",
69
+ f'lg_api_workers_available{{project_id="{project_id}", revision_id="{revision_id}"}} {workers_available}',
70
+ ]
71
+
72
+ metrics_response = "\n".join(metrics).encode()
73
+ metrics_len = str(len(metrics_response))
74
+
75
+ self.send_response(200)
76
+ self.send_header(
77
+ "Content-Type", "text/plain; version=0.0.4; charset=utf-8"
78
+ )
79
+ self.send_header("Content-Length", metrics_len)
80
+ self.end_headers()
81
+ self.wfile.write(metrics_response)
49
82
  else:
50
83
  self.send_error(http.HTTPStatus.NOT_FOUND)
51
84
 
52
- with http.server.ThreadingHTTPServer(("0.0.0.0", port), HealthHandler) as httpd:
53
- logger.info(f"Health server started at http://0.0.0.0:{port}")
85
+ with http.server.ThreadingHTTPServer(
86
+ ("0.0.0.0", port), HealthAndMetricsHandler
87
+ ) as httpd:
88
+ logger.info(f"Health and metrics server started at http://0.0.0.0:{port}")
54
89
  try:
55
90
  await asyncio.to_thread(httpd.serve_forever)
56
91
  finally:
@@ -62,7 +97,7 @@ async def entrypoint():
62
97
 
63
98
  lg_logging.set_logging_context({"entrypoint": "python-queue"})
64
99
  tasks: set[asyncio.Task] = set()
65
- tasks.add(asyncio.create_task(healthcheck_server()))
100
+ tasks.add(asyncio.create_task(health_and_metrics_server()))
66
101
  async with lifespan(None, with_cron_scheduler=False, taskset=tasks):
67
102
  await asyncio.gather(*tasks)
68
103
 
@@ -81,6 +116,10 @@ async def main():
81
116
  except (NotImplementedError, RuntimeError):
82
117
  signal.signal(signal.SIGTERM, lambda *_: _handle_signal())
83
118
 
119
+ from langgraph_api import config
120
+
121
+ config.IS_QUEUE_ENTRYPOINT = True
122
+
84
123
  entry_task = asyncio.create_task(entrypoint())
85
124
  await stop_event.wait()
86
125
 
langgraph_api/worker.py CHANGED
@@ -29,6 +29,8 @@ from langgraph_runtime.retry import RETRIABLE_EXCEPTIONS
29
29
 
30
30
  logger = structlog.stdlib.get_logger(__name__)
31
31
 
32
+ ALL_RETRIABLE_EXCEPTIONS = (asyncio.CancelledError, *RETRIABLE_EXCEPTIONS)
33
+
32
34
 
33
35
  class WorkerResult(TypedDict):
34
36
  checkpoint: CheckpointPayload | None
@@ -294,7 +296,7 @@ async def worker(
294
296
  await Threads.set_joint_status(
295
297
  conn, run["thread_id"], run_id, status, checkpoint, exception
296
298
  )
297
- elif isinstance(exception, RETRIABLE_EXCEPTIONS):
299
+ elif isinstance(exception, ALL_RETRIABLE_EXCEPTIONS):
298
300
  status = "retry"
299
301
  run_ended_at_dt = datetime.now(UTC)
300
302
  run_ended_at = run_ended_at_dt.isoformat()
@@ -329,7 +331,7 @@ async def worker(
329
331
  )
330
332
 
331
333
  # delete or set status of thread
332
- if not isinstance(exception, RETRIABLE_EXCEPTIONS):
334
+ if not isinstance(exception, ALL_RETRIABLE_EXCEPTIONS):
333
335
  if temporary:
334
336
  await Threads.delete(conn, run["thread_id"])
335
337
  else:
@@ -346,7 +348,7 @@ async def worker(
346
348
  else:
347
349
  raise
348
350
 
349
- if isinstance(exception, RETRIABLE_EXCEPTIONS):
351
+ if isinstance(exception, ALL_RETRIABLE_EXCEPTIONS):
350
352
  await logger.awarning("RETRYING", exc_info=exception)
351
353
  # re-raise so Runs.enter knows not to mark as done
352
354
  # Runs.enter will catch the exception, but what triggers the retry
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: langgraph-api
3
- Version: 0.2.56
3
+ Version: 0.2.61
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
@@ -1,17 +1,17 @@
1
- langgraph_api/__init__.py,sha256=yuhEwVPZG_uwEXVduMxOuyth-d2aFtmKNM7h6XPNHtM,23
1
+ langgraph_api/__init__.py,sha256=kZgWAIergNf5V9AKR_m5_2OkmHm70EJlB00_haCLeZY,23
2
2
  langgraph_api/asgi_transport.py,sha256=eqifhHxNnxvI7jJqrY1_8RjL4Fp9NdN4prEub2FWBt8,5091
3
3
  langgraph_api/asyncio.py,sha256=Odnc6mAJIGF3eFWT8Xcrg2Zam7FwzXkfCWEHaXfrzQQ,9371
4
4
  langgraph_api/cli.py,sha256=9Ou3tGDDY_VVLt5DFle8UviJdpI4ZigC5hElYvq2-To,14519
5
5
  langgraph_api/command.py,sha256=3O9v3i0OPa96ARyJ_oJbLXkfO8rPgDhLCswgO9koTFA,768
6
- langgraph_api/config.py,sha256=do03SoO93rfL7PKuxviLZbYuVlzlZJayXnodkO-nxv0,11623
6
+ langgraph_api/config.py,sha256=jmtO5LXubet2Hl7S2tF2BRyB_q2yqCzFqCwN7n6za4Y,11727
7
7
  langgraph_api/cron_scheduler.py,sha256=i87j4pJrcsmsqMKeKUs69gaAjrGaSM3pM3jnXdN5JDQ,2630
8
8
  langgraph_api/errors.py,sha256=Bu_i5drgNTyJcLiyrwVE_6-XrSU50BHf9TDpttki9wQ,1690
9
- langgraph_api/graph.py,sha256=JUJgmYF4Bfj3zKH9DZ2c4fgCOaZZ4QA3rbeC5Gtp4Bg,23255
9
+ langgraph_api/graph.py,sha256=t18rq0NHHRILUI5cONhKPzKhbqLGn6_BRytiEh0gdcg,23561
10
10
  langgraph_api/http.py,sha256=gYbxxjY8aLnsXeJymcJ7G7Nj_yToOGpPYQqmZ1_ggfA,5240
11
- langgraph_api/logging.py,sha256=1BXELwUBY8gZeOWCYElbBu_GyHLM2jjlDVJznlekqvQ,4268
11
+ langgraph_api/logging.py,sha256=Do62kNJtY7Ns7q7XrP2VIxho3c85jt8_l3yfRtqM7xM,4370
12
12
  langgraph_api/metadata.py,sha256=Gx0b6YszLRjdWLDVN8OcVgC_YYQG_nQitPfUfgQx1w8,4648
13
13
  langgraph_api/patch.py,sha256=Dgs0PXHytekX4SUL6KsjjN0hHcOtGLvv1GRGbh6PswU,1408
14
- langgraph_api/queue_entrypoint.py,sha256=rW4-OEsWwBsLLp6U0P-de-I0tR3gPZaeBKWB3LRrTr0,2923
14
+ langgraph_api/queue_entrypoint.py,sha256=hC8j-A4cUxibusiiPJBlK0mkmChNZxNcXn5GVwL0yic,4889
15
15
  langgraph_api/route.py,sha256=4VBkJMeusfiZtLzyUaKm1HwLHTq0g15y2CRiRhM6xyA,4773
16
16
  langgraph_api/schema.py,sha256=2711t4PIBk5dky4gmMndrTRC9CVvAgH47C9FKDxhkBo,5444
17
17
  langgraph_api/serde.py,sha256=8fQXg7T7RVUqj_jgOoSOJrWVpQDW0qJKjAjSsEhPHo4,4803
@@ -24,11 +24,11 @@ langgraph_api/thread_ttl.py,sha256=-Ox8NFHqUH3wGNdEKMIfAXUubY5WGifIgCaJ7npqLgw,1
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=FgTYpOA4Unt3xcqWpOKPqSZpFqND5GcqLk6O0fi4MHU,15812
27
+ langgraph_api/worker.py,sha256=uQg_YEmr0zDTX3BR3bcI2L6SWu4YRWbgELk0gvlnymc,15900
28
28
  langgraph_api/api/__init__.py,sha256=YVzpbn5IQotvuuLG9fhS9QMrxXfP4s4EpEMG0n4q3Nw,5625
29
29
  langgraph_api/api/assistants.py,sha256=6IPVKQBlI95-Z4nYdqBY9st9oynGJAocL67cwnDaZCk,15744
30
30
  langgraph_api/api/mcp.py,sha256=RvRYgANqRzNQzSmgjNkq4RlKTtoEJYil04ot9lsmEtE,14352
31
- langgraph_api/api/meta.py,sha256=rKEBIlEQ_GugW8_wk0kjHVsv9CeqhEaz2nPvKCvz9Pk,3047
31
+ langgraph_api/api/meta.py,sha256=Yvb6yAqmZy4Nmk8JaNLUcUXA9irlankqS6XhXtXLWG0,3087
32
32
  langgraph_api/api/openapi.py,sha256=362m6Ny8wOwZ6HrDK9JAVUzPkyLYWKeV1E71hPOaA0U,11278
33
33
  langgraph_api/api/runs.py,sha256=9jU9C4myBhgZXyvR9MzNn9KrpNo7DvWbg8uNeWzSmKE,19524
34
34
  langgraph_api/api/store.py,sha256=TSeMiuMfrifmEnEbL0aObC2DPeseLlmZvAMaMzPgG3Y,5535
@@ -51,13 +51,13 @@ langgraph_api/js/client.http.mts,sha256=AGA-p8J85IcNh2oXZjDxHQ4PnQdJmt-LPcpZp6j0
51
51
  langgraph_api/js/client.mts,sha256=N9CTH7mbXGSD-gpv-XyruYsHI-rgrObL8cQoAp5s3_U,30986
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
- langgraph_api/js/package.json,sha256=7_qkj-b0_bpHFFyBDgGaZl3BeuSqkbCD7wNn-ZvQeGA,1333
54
+ langgraph_api/js/package.json,sha256=BpNAO88mbE-Gv4WzQfj1TLktCWGqm6XBqI892ObuOUw,1333
55
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
59
59
  langgraph_api/js/ui.py,sha256=XNT8iBcyT8XmbIqSQUWd-j_00HsaWB2vRTVabwFBkik,2439
60
- langgraph_api/js/yarn.lock,sha256=WpYx-AghC1sV4Jbx9ltuc56nkZ2H5zgJ6n7GyICLvl0,85562
60
+ langgraph_api/js/yarn.lock,sha256=hrU_DP2qU9772d2W-FiuA5N7z2eAp6qmkw7dDCAEYhw,85562
61
61
  langgraph_api/js/src/graph.mts,sha256=9zTQNdtanI_CFnOwNRoamoCVHHQHGbNlbm91aRxDeOc,2675
62
62
  langgraph_api/js/src/load.hooks.mjs,sha256=xNVHq75W0Lk6MUKl1pQYrx-wtQ8_neiUyI6SO-k0ecM,2235
63
63
  langgraph_api/js/src/preload.mjs,sha256=ORV7xwMuZcXWL6jQxNAcCYp8GZVYIvVJbUhmle8jbno,759
@@ -86,8 +86,8 @@ langgraph_runtime/store.py,sha256=7mowndlsIroGHv3NpTSOZDJR0lCuaYMBoTnTrewjslw,11
86
86
  LICENSE,sha256=ZPwVR73Biwm3sK6vR54djCrhaRiM4cAD2zvOQZV8Xis,3859
87
87
  logging.json,sha256=3RNjSADZmDq38eHePMm1CbP6qZ71AmpBtLwCmKU9Zgo,379
88
88
  openapi.json,sha256=wrJup7sCRlZXTRagjzGZ7474U1wma4ZzYTkkninrT6M,141875
89
- langgraph_api-0.2.56.dist-info/METADATA,sha256=wfCknYuOUBNVrO4AM6m33ekJis6bPutLf-EWFDWpPTw,3891
90
- langgraph_api-0.2.56.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
91
- langgraph_api-0.2.56.dist-info/entry_points.txt,sha256=hGedv8n7cgi41PypMfinwS_HfCwA7xJIfS0jAp8htV8,78
92
- langgraph_api-0.2.56.dist-info/licenses/LICENSE,sha256=ZPwVR73Biwm3sK6vR54djCrhaRiM4cAD2zvOQZV8Xis,3859
93
- langgraph_api-0.2.56.dist-info/RECORD,,
89
+ langgraph_api-0.2.61.dist-info/METADATA,sha256=XdQqNTkMVvTLc8e34erKFgs0GU97seInvZNgWDAxxZU,3891
90
+ langgraph_api-0.2.61.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
91
+ langgraph_api-0.2.61.dist-info/entry_points.txt,sha256=hGedv8n7cgi41PypMfinwS_HfCwA7xJIfS0jAp8htV8,78
92
+ langgraph_api-0.2.61.dist-info/licenses/LICENSE,sha256=ZPwVR73Biwm3sK6vR54djCrhaRiM4cAD2zvOQZV8Xis,3859
93
+ langgraph_api-0.2.61.dist-info/RECORD,,