langgraph-api 0.5.4__py3-none-any.whl → 0.7.3__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.
Files changed (122) hide show
  1. langgraph_api/__init__.py +1 -1
  2. langgraph_api/api/__init__.py +93 -27
  3. langgraph_api/api/a2a.py +36 -32
  4. langgraph_api/api/assistants.py +114 -26
  5. langgraph_api/api/mcp.py +3 -3
  6. langgraph_api/api/meta.py +15 -2
  7. langgraph_api/api/openapi.py +27 -17
  8. langgraph_api/api/profile.py +108 -0
  9. langgraph_api/api/runs.py +114 -57
  10. langgraph_api/api/store.py +19 -2
  11. langgraph_api/api/threads.py +133 -10
  12. langgraph_api/asgi_transport.py +14 -9
  13. langgraph_api/auth/custom.py +23 -13
  14. langgraph_api/cli.py +86 -41
  15. langgraph_api/command.py +2 -2
  16. langgraph_api/config/__init__.py +532 -0
  17. langgraph_api/config/_parse.py +58 -0
  18. langgraph_api/config/schemas.py +431 -0
  19. langgraph_api/cron_scheduler.py +17 -1
  20. langgraph_api/encryption/__init__.py +15 -0
  21. langgraph_api/encryption/aes_json.py +158 -0
  22. langgraph_api/encryption/context.py +35 -0
  23. langgraph_api/encryption/custom.py +280 -0
  24. langgraph_api/encryption/middleware.py +632 -0
  25. langgraph_api/encryption/shared.py +63 -0
  26. langgraph_api/errors.py +12 -1
  27. langgraph_api/executor_entrypoint.py +11 -6
  28. langgraph_api/feature_flags.py +19 -0
  29. langgraph_api/graph.py +163 -64
  30. langgraph_api/{grpc_ops → grpc}/client.py +142 -12
  31. langgraph_api/{grpc_ops → grpc}/config_conversion.py +16 -10
  32. langgraph_api/grpc/generated/__init__.py +29 -0
  33. langgraph_api/grpc/generated/checkpointer_pb2.py +63 -0
  34. langgraph_api/grpc/generated/checkpointer_pb2.pyi +99 -0
  35. langgraph_api/grpc/generated/checkpointer_pb2_grpc.py +329 -0
  36. langgraph_api/grpc/generated/core_api_pb2.py +216 -0
  37. langgraph_api/{grpc_ops → grpc}/generated/core_api_pb2.pyi +292 -372
  38. langgraph_api/{grpc_ops → grpc}/generated/core_api_pb2_grpc.py +252 -31
  39. langgraph_api/grpc/generated/engine_common_pb2.py +219 -0
  40. langgraph_api/{grpc_ops → grpc}/generated/engine_common_pb2.pyi +178 -104
  41. langgraph_api/grpc/generated/enum_cancel_run_action_pb2.py +37 -0
  42. langgraph_api/grpc/generated/enum_cancel_run_action_pb2.pyi +12 -0
  43. langgraph_api/grpc/generated/enum_cancel_run_action_pb2_grpc.py +24 -0
  44. langgraph_api/grpc/generated/enum_control_signal_pb2.py +37 -0
  45. langgraph_api/grpc/generated/enum_control_signal_pb2.pyi +16 -0
  46. langgraph_api/grpc/generated/enum_control_signal_pb2_grpc.py +24 -0
  47. langgraph_api/grpc/generated/enum_durability_pb2.py +37 -0
  48. langgraph_api/grpc/generated/enum_durability_pb2.pyi +16 -0
  49. langgraph_api/grpc/generated/enum_durability_pb2_grpc.py +24 -0
  50. langgraph_api/grpc/generated/enum_multitask_strategy_pb2.py +37 -0
  51. langgraph_api/grpc/generated/enum_multitask_strategy_pb2.pyi +16 -0
  52. langgraph_api/grpc/generated/enum_multitask_strategy_pb2_grpc.py +24 -0
  53. langgraph_api/grpc/generated/enum_run_status_pb2.py +37 -0
  54. langgraph_api/grpc/generated/enum_run_status_pb2.pyi +22 -0
  55. langgraph_api/grpc/generated/enum_run_status_pb2_grpc.py +24 -0
  56. langgraph_api/grpc/generated/enum_stream_mode_pb2.py +37 -0
  57. langgraph_api/grpc/generated/enum_stream_mode_pb2.pyi +28 -0
  58. langgraph_api/grpc/generated/enum_stream_mode_pb2_grpc.py +24 -0
  59. langgraph_api/grpc/generated/enum_thread_status_pb2.py +37 -0
  60. langgraph_api/grpc/generated/enum_thread_status_pb2.pyi +16 -0
  61. langgraph_api/grpc/generated/enum_thread_status_pb2_grpc.py +24 -0
  62. langgraph_api/grpc/generated/enum_thread_stream_mode_pb2.py +37 -0
  63. langgraph_api/grpc/generated/enum_thread_stream_mode_pb2.pyi +16 -0
  64. langgraph_api/grpc/generated/enum_thread_stream_mode_pb2_grpc.py +24 -0
  65. langgraph_api/grpc/generated/errors_pb2.py +39 -0
  66. langgraph_api/grpc/generated/errors_pb2.pyi +21 -0
  67. langgraph_api/grpc/generated/errors_pb2_grpc.py +24 -0
  68. langgraph_api/grpc/ops/__init__.py +370 -0
  69. langgraph_api/grpc/ops/assistants.py +424 -0
  70. langgraph_api/grpc/ops/runs.py +792 -0
  71. langgraph_api/grpc/ops/threads.py +1013 -0
  72. langgraph_api/http.py +16 -5
  73. langgraph_api/js/client.mts +1 -4
  74. langgraph_api/js/package.json +28 -27
  75. langgraph_api/js/remote.py +39 -17
  76. langgraph_api/js/sse.py +2 -2
  77. langgraph_api/js/ui.py +1 -1
  78. langgraph_api/js/yarn.lock +1139 -869
  79. langgraph_api/metadata.py +29 -3
  80. langgraph_api/middleware/http_logger.py +1 -1
  81. langgraph_api/middleware/private_network.py +7 -7
  82. langgraph_api/models/run.py +44 -26
  83. langgraph_api/otel_context.py +205 -0
  84. langgraph_api/patch.py +2 -2
  85. langgraph_api/queue_entrypoint.py +34 -35
  86. langgraph_api/route.py +33 -1
  87. langgraph_api/schema.py +84 -9
  88. langgraph_api/self_hosted_logs.py +2 -2
  89. langgraph_api/self_hosted_metrics.py +73 -3
  90. langgraph_api/serde.py +16 -4
  91. langgraph_api/server.py +33 -31
  92. langgraph_api/state.py +3 -2
  93. langgraph_api/store.py +25 -16
  94. langgraph_api/stream.py +20 -16
  95. langgraph_api/thread_ttl.py +28 -13
  96. langgraph_api/timing/__init__.py +25 -0
  97. langgraph_api/timing/profiler.py +200 -0
  98. langgraph_api/timing/timer.py +318 -0
  99. langgraph_api/utils/__init__.py +53 -8
  100. langgraph_api/utils/config.py +2 -1
  101. langgraph_api/utils/future.py +10 -6
  102. langgraph_api/utils/uuids.py +29 -62
  103. langgraph_api/validation.py +6 -0
  104. langgraph_api/webhook.py +120 -6
  105. langgraph_api/worker.py +54 -24
  106. {langgraph_api-0.5.4.dist-info → langgraph_api-0.7.3.dist-info}/METADATA +8 -6
  107. langgraph_api-0.7.3.dist-info/RECORD +168 -0
  108. {langgraph_api-0.5.4.dist-info → langgraph_api-0.7.3.dist-info}/WHEEL +1 -1
  109. langgraph_runtime/__init__.py +1 -0
  110. langgraph_runtime/routes.py +11 -0
  111. logging.json +1 -3
  112. openapi.json +635 -537
  113. langgraph_api/config.py +0 -523
  114. langgraph_api/grpc_ops/generated/__init__.py +0 -5
  115. langgraph_api/grpc_ops/generated/core_api_pb2.py +0 -275
  116. langgraph_api/grpc_ops/generated/engine_common_pb2.py +0 -194
  117. langgraph_api/grpc_ops/ops.py +0 -1045
  118. langgraph_api-0.5.4.dist-info/RECORD +0 -121
  119. /langgraph_api/{grpc_ops → grpc}/__init__.py +0 -0
  120. /langgraph_api/{grpc_ops → grpc}/generated/engine_common_pb2_grpc.py +0 -0
  121. {langgraph_api-0.5.4.dist-info → langgraph_api-0.7.3.dist-info}/entry_points.txt +0 -0
  122. {langgraph_api-0.5.4.dist-info → langgraph_api-0.7.3.dist-info}/licenses/LICENSE +0 -0
langgraph_api/webhook.py CHANGED
@@ -1,14 +1,117 @@
1
+ import asyncio
2
+ import ipaddress
3
+ import socket
1
4
  from datetime import UTC, datetime
5
+ from typing import TYPE_CHECKING
6
+ from urllib.parse import urlparse
2
7
 
3
8
  import structlog
9
+ from starlette.exceptions import HTTPException
4
10
 
5
- from langgraph_api.config import HTTP_CONFIG
6
- from langgraph_api.http import get_http_client, get_loopback_client, http_request
7
- from langgraph_api.worker import WorkerResult
11
+ from langgraph_api.config import HTTP_CONFIG, WEBHOOKS_CONFIG
12
+ from langgraph_api.config.schemas import WebhookUrlPolicy
13
+ from langgraph_api.http import ensure_http_client, get_loopback_client, http_request
14
+
15
+ if TYPE_CHECKING:
16
+ from langgraph_api.worker import WorkerResult
8
17
 
9
18
  logger = structlog.stdlib.get_logger(__name__)
10
19
 
11
20
 
21
+ async def validate_webhook_url_or_raise(url: str) -> None:
22
+ """Validate a user-provided webhook URL against configured policy.
23
+
24
+ No-ops when WEBHOOKS_CONFIG is not set (preserves legacy behavior).
25
+ """
26
+ cfg = WEBHOOKS_CONFIG
27
+ if not cfg:
28
+ return
29
+
30
+ policy = WebhookUrlPolicy(cfg.get("url") or {})
31
+ allowed_domains = policy.get("allowed_domains") or []
32
+ allowed_ports = policy.get("allowed_ports")
33
+ max_url_length = int(policy.get("max_url_length", 4096))
34
+ # TODO: We should flip this in the next minor release
35
+ require_https = bool(policy.get("require_https", False))
36
+ disable_loopback = bool(policy.get("disable_loopback", False))
37
+
38
+ if len(url) > max_url_length:
39
+ raise HTTPException(status_code=422, detail="Webhook URL too long")
40
+
41
+ # Relative loopback URL (internal route)
42
+ if url.startswith("/"):
43
+ if disable_loopback:
44
+ raise HTTPException(
45
+ status_code=422, detail="Loopback webhooks are disabled"
46
+ )
47
+ # The other checks would fail here, so we can just return
48
+ return
49
+
50
+ parsed = urlparse(url)
51
+ if require_https and parsed.scheme.lower() != "https":
52
+ raise HTTPException(status_code=422, detail="Webhook must use https")
53
+
54
+ # Port policy: only enforce if configured; omit default enforcement otherwise
55
+ if allowed_ports:
56
+ if parsed.port is not None:
57
+ port = parsed.port
58
+ else:
59
+ port = 443 if parsed.scheme == "https" else 80
60
+ if port not in allowed_ports:
61
+ raise HTTPException(
62
+ status_code=422, detail=f"Webhook port {port} not allowed"
63
+ )
64
+
65
+ host = parsed.hostname or ""
66
+ if not host:
67
+ raise HTTPException(
68
+ status_code=422, detail=f"Invalid webhook hostname '{host}'"
69
+ )
70
+
71
+ # Domain allowlist
72
+ if allowed_domains:
73
+ host_allowed = False
74
+ for pattern in allowed_domains:
75
+ pattern = pattern.strip().lower()
76
+ if pattern.startswith("*."):
77
+ base = pattern[2:]
78
+ if host.lower().endswith("." + base):
79
+ host_allowed = True
80
+ break
81
+ else:
82
+ if host.lower() == pattern:
83
+ host_allowed = True
84
+ break
85
+ if not host_allowed:
86
+ raise HTTPException(status_code=422, detail="Webhook domain not allowed")
87
+
88
+ # Note we don't do default SSRF protections mainly because it would require a minor bump since it could break valid use cases.
89
+ try:
90
+ infos = await asyncio.to_thread(socket.getaddrinfo, host, None)
91
+ except Exception as e:
92
+ raise HTTPException(
93
+ status_code=422, detail="Failed to resolve webhook host"
94
+ ) from e
95
+
96
+ for info in infos:
97
+ ip_str = info[4][0]
98
+ try:
99
+ ip = ipaddress.ip_address(ip_str)
100
+ except ValueError:
101
+ # Skip non-IP entries just in case
102
+ continue
103
+ if (
104
+ ip.is_private
105
+ or ip.is_loopback
106
+ or ip.is_link_local
107
+ or ip.is_multicast
108
+ or ip.is_reserved
109
+ ):
110
+ raise HTTPException(
111
+ status_code=422, detail="Webhook host resolves to a disallowed IP"
112
+ )
113
+
114
+
12
115
  async def call_webhook(result: "WorkerResult") -> None:
13
116
  if HTTP_CONFIG and HTTP_CONFIG.get("disable_webhooks"):
14
117
  logger.info(
@@ -30,16 +133,27 @@ async def call_webhook(result: "WorkerResult") -> None:
30
133
  webhook = result.get("webhook")
31
134
  if webhook:
32
135
  try:
136
+ # We've already validated on ingestion, but you could technically have an issue if you re-deployed with a different environment
137
+ await validate_webhook_url_or_raise(webhook)
138
+ # Note: header templates should have already been evaluated against the env at load time.
139
+ headers = WEBHOOKS_CONFIG.get("headers") if WEBHOOKS_CONFIG else None
140
+
33
141
  if webhook.startswith("/"):
34
142
  # Call into this own app
35
143
  webhook_client = get_loopback_client()
36
144
  else:
37
- webhook_client = get_http_client()
38
- await http_request("POST", webhook, json=payload, client=webhook_client)
145
+ webhook_client = await ensure_http_client()
146
+ await http_request(
147
+ "POST",
148
+ webhook,
149
+ json=payload,
150
+ headers=headers,
151
+ client=webhook_client,
152
+ )
39
153
  await logger.ainfo(
40
154
  "Background worker called webhook",
41
155
  webhook=result["webhook"],
42
- run_id=result["run"]["run_id"],
156
+ run_id=str(result["run"]["run_id"]),
43
157
  )
44
158
  except Exception as exc:
45
159
  logger.exception(
langgraph_api/worker.py CHANGED
@@ -17,10 +17,18 @@ from langgraph_api.config import (
17
17
  BG_JOB_MAX_RETRIES,
18
18
  BG_JOB_TIMEOUT_SECS,
19
19
  )
20
+ from langgraph_api.encryption.context import set_encryption_context
21
+ from langgraph_api.encryption.middleware import (
22
+ decrypt_response,
23
+ extract_blob_encryption_context,
24
+ )
20
25
  from langgraph_api.errors import UserInterrupt, UserRollback, UserTimeout
26
+ from langgraph_api.feature_flags import FF_USE_CORE_API
27
+ from langgraph_api.grpc.ops import Runs as GrpcRuns
21
28
  from langgraph_api.js.errors import RemoteException
22
29
  from langgraph_api.metadata import incr_runs
23
- from langgraph_api.schema import Run, StreamMode
30
+ from langgraph_api.otel_context import restore_otel_trace_context
31
+ from langgraph_api.schema import RUN_KWARGS_ENCRYPTION_SUBFIELDS, Run, StreamMode
24
32
  from langgraph_api.state import state_snapshot_to_thread_state
25
33
  from langgraph_api.stream import AnyStream, astream_state, consume
26
34
  from langgraph_api.utils import with_user
@@ -28,6 +36,8 @@ from langgraph_runtime.database import connect
28
36
  from langgraph_runtime.ops import Runs, Threads
29
37
  from langgraph_runtime.retry import RETRIABLE_EXCEPTIONS
30
38
 
39
+ CrudRuns = GrpcRuns if FF_USE_CORE_API else Runs
40
+
31
41
  logger = structlog.stdlib.get_logger(__name__)
32
42
 
33
43
  ALL_RETRIABLE_EXCEPTIONS = (asyncio.CancelledError, *RETRIABLE_EXCEPTIONS)
@@ -72,6 +82,17 @@ async def worker(
72
82
  run_id = run["run_id"]
73
83
  if attempt == 1:
74
84
  incr_runs()
85
+
86
+ # Extract and set encryption context BEFORE decryption (decrypt_response strips this key)
87
+ encryption_context = extract_blob_encryption_context(run["kwargs"].get("config"))
88
+ if encryption_context:
89
+ set_encryption_context(encryption_context)
90
+
91
+ # Decrypt kwargs fields FIRST, before any access to run["kwargs"]
92
+ run["kwargs"] = await decrypt_response(
93
+ run["kwargs"], "run", RUN_KWARGS_ENCRYPTION_SUBFIELDS
94
+ )
95
+
75
96
  checkpoint: CheckpointPayload | None = None
76
97
  exception: Exception | asyncio.CancelledError | None = None
77
98
  status: str | None = None
@@ -96,15 +117,17 @@ async def worker(
96
117
  )
97
118
  temporary = run["kwargs"].get("temporary", False)
98
119
  resumable = run["kwargs"].get("resumable", False)
120
+ run_created_at_dt = run["created_at"]
99
121
  run_created_at = run["created_at"].isoformat()
122
+ thread_id = str(run.get("thread_id"))
100
123
  lg_logging.set_logging_context(
101
124
  {
102
125
  "run_id": str(run_id),
103
126
  "run_attempt": attempt,
104
- "thread_id": str(run.get("thread_id")),
127
+ "thread_id": thread_id,
105
128
  "assistant_id": str(run.get("assistant_id")),
106
- "graph_id": _get_graph_id(run),
107
- "request_id": _get_request_id(run),
129
+ "graph_id": str(_get_graph_id(run)),
130
+ "request_id": str(_get_request_id(run)),
108
131
  }
109
132
  )
110
133
  run_stream_started_at_dt = datetime.now(UTC)
@@ -146,6 +169,8 @@ async def worker(
146
169
  if not isinstance(e, UserRollback | UserInterrupt):
147
170
  logger.exception(
148
171
  f"Run encountered an error in graph: {type(e)}({e})",
172
+ run_id=str(run_id),
173
+ thread_id=thread_id,
149
174
  )
150
175
  # TimeoutError is a special case where we rely on asyncio.wait_for to timeout runs
151
176
  # Convert user TimeoutErrors to a custom class so we can distinguish and later convert back
@@ -153,13 +178,13 @@ async def worker(
153
178
  raise UserTimeout(e) from e
154
179
  raise
155
180
 
156
- async with Runs.enter(run_id, run["thread_id"], main_loop, resumable) as done:
181
+ async with CrudRuns.enter(run_id, run["thread_id"], main_loop, resumable) as done:
157
182
  # attempt the run
158
183
  try:
159
184
  if attempt > BG_JOB_MAX_RETRIES:
160
185
  await logger.aerror(
161
186
  "Run exceeded max attempts",
162
- run_id=run["run_id"],
187
+ run_id=str(run["run_id"]),
163
188
  run_completed_in_ms=(
164
189
  int((time.time() * 1_000) - request_created_at)
165
190
  if request_created_at is not None
@@ -181,24 +206,28 @@ async def worker(
181
206
  )
182
207
 
183
208
  raise RuntimeError(error_message)
209
+ configurable = run["kwargs"].get("config", {}).get("configurable", {})
184
210
  async with set_auth_ctx_for_run(run["kwargs"]):
185
- if temporary:
186
- stream = astream_state(run, attempt, done)
187
- else:
188
- stream = astream_state(
189
- run,
190
- attempt,
191
- done,
192
- on_checkpoint=on_checkpoint,
193
- on_task_result=on_task_result,
211
+ with restore_otel_trace_context(
212
+ configurable, run_id=str(run_id), thread_id=str(thread_id)
213
+ ):
214
+ if temporary:
215
+ stream = astream_state(run, attempt, done)
216
+ else:
217
+ stream = astream_state(
218
+ run,
219
+ attempt,
220
+ done,
221
+ on_checkpoint=on_checkpoint,
222
+ on_task_result=on_task_result,
223
+ )
224
+ stream_modes: set[StreamMode] = set(
225
+ run["kwargs"].get("stream_mode", [])
226
+ )
227
+ await asyncio.wait_for(
228
+ wrap_user_errors(stream, run_id, resumable, stream_modes),
229
+ BG_JOB_TIMEOUT_SECS,
194
230
  )
195
- stream_modes: set[StreamMode] = set(
196
- run["kwargs"].get("stream_mode", [])
197
- )
198
- await asyncio.wait_for(
199
- wrap_user_errors(stream, run_id, resumable, stream_modes),
200
- BG_JOB_TIMEOUT_SECS,
201
- )
202
231
  except (Exception, asyncio.CancelledError) as ee:
203
232
  exception = ee
204
233
  except BaseException as eee:
@@ -228,6 +257,7 @@ async def worker(
228
257
  if request_created_at is not None
229
258
  else None
230
259
  ),
260
+ "run_wait_time_ms": ms(run_started_at_dt, run_created_at_dt),
231
261
  }
232
262
 
233
263
  if exception is None:
@@ -269,7 +299,7 @@ async def worker(
269
299
  elif isinstance(exception, TimeoutError):
270
300
  status = "timeout"
271
301
  await logger.awarning(
272
- "Background run timed out",
302
+ "Background run timed out. To increase the timeout, set the BG_JOB_TIMEOUT_SECS environment variable (integer, defaults to 3600).",
273
303
  **log_info,
274
304
  )
275
305
  if not temporary:
@@ -332,7 +362,7 @@ async def worker(
332
362
  )
333
363
  # Don't update thread status yet.
334
364
  # Apply this even for temporary runs, so we retry
335
- await Runs.set_status(conn, run_id, "pending")
365
+ await CrudRuns.set_status(conn, run_id, "pending")
336
366
  else:
337
367
  status = "error"
338
368
 
@@ -1,22 +1,23 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: langgraph-api
3
- Version: 0.5.4
3
+ Version: 0.7.3
4
4
  Author-email: Will Fu-Hinthorn <will@langchain.dev>, Josh Rogers <josh@langchain.dev>, Parker Rule <parker@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
- Requires-Dist: cryptography<45.0,>=42.0.0
9
+ Requires-Dist: cryptography<47.0,>=42.0.0
10
+ Requires-Dist: grpcio-health-checking<2.0.0,>=1.75.0
10
11
  Requires-Dist: grpcio-tools==1.75.1
11
12
  Requires-Dist: grpcio<2.0.0,>=1.75.0
12
13
  Requires-Dist: httpx>=0.25.0
13
14
  Requires-Dist: jsonschema-rs<0.30,>=0.20.0
14
15
  Requires-Dist: langchain-core>=0.3.64
15
- Requires-Dist: langgraph-checkpoint<4,>=3.0.1
16
- Requires-Dist: langgraph-runtime-inmem<0.17.0,>=0.16.0
17
- Requires-Dist: langgraph-sdk>=0.2.0
16
+ Requires-Dist: langgraph-checkpoint<5,>=3.0.1
17
+ Requires-Dist: langgraph-runtime-inmem<0.23.0,>=0.22.0
18
+ Requires-Dist: langgraph-sdk>=0.3.0
18
19
  Requires-Dist: langgraph<2,>=0.4.10
19
- Requires-Dist: langsmith>=0.3.45
20
+ Requires-Dist: langsmith[otel]>=0.6.3
20
21
  Requires-Dist: opentelemetry-api>=1.37.0
21
22
  Requires-Dist: opentelemetry-exporter-otlp-proto-http>=1.37.0
22
23
  Requires-Dist: opentelemetry-sdk>=1.37.0
@@ -28,6 +29,7 @@ Requires-Dist: starlette>=0.38.6
28
29
  Requires-Dist: structlog<26,>=24.1.0
29
30
  Requires-Dist: tenacity>=8.0.0
30
31
  Requires-Dist: truststore>=0.1
32
+ Requires-Dist: uuid-utils>=0.12.0
31
33
  Requires-Dist: uvicorn>=0.26.0
32
34
  Requires-Dist: watchfiles>=0.13
33
35
  Description-Content-Type: text/markdown
@@ -0,0 +1,168 @@
1
+ langgraph_api/__init__.py,sha256=G0rwkDLSytonr7idr8ma7KaTUnRCn3-Ripum70RSeh0,22
2
+ langgraph_api/asgi_transport.py,sha256=PC3Fkqd8ajZOHyIGgl6GK8xrMo72vB7hcE-27epgPP0,5530
3
+ langgraph_api/asyncio.py,sha256=FEEkLm_N-15cbElo4vQ309MkDKBZuRqAYV8VJ1DocNw,9860
4
+ langgraph_api/cli.py,sha256=sUL1M4rfZ1zjDc04DRRqPpAdFEvIbvkhdSd8J5TZuec,20084
5
+ langgraph_api/command.py,sha256=DCAlZNZ4m3-IVcxXFB2coZ09pUEehOsrKNBR0TJltEU,856
6
+ langgraph_api/cron_scheduler.py,sha256=2MSP2UbRmkos82wBDzd62ml7aeqvB-eZ4sV5pxJDt6I,3332
7
+ langgraph_api/errors.py,sha256=rI_eZZYmvrj1N09JrjJJ862iCFfsrwQ8SWb9BE8_bU0,2219
8
+ langgraph_api/executor_entrypoint.py,sha256=GzjiMuQF752Er2HYyb-PTf4f0IrjNsiGXb7CwBW0fW4,849
9
+ langgraph_api/feature_flags.py,sha256=nATkWAn_YqwbKTMp9JMFmc3XFpC33MzWTExTyKAl8ss,1473
10
+ langgraph_api/graph.py,sha256=faoIXx8lpC3i_6zhKTZNjUsku1F_BtlpaOXzByUhJYM,29006
11
+ langgraph_api/http.py,sha256=N2YGalN6ytPnPnFBiyu0CgWni9j68Np8CAoeEqMXtk4,5966
12
+ langgraph_api/http_metrics.py,sha256=vw3UT9uj9qgxQ_DwJq77HGZqh6LHSjyxylWhqkf2jAw,5095
13
+ langgraph_api/http_metrics_utils.py,sha256=sjxF7SYGTzY0Wz_G0dzatsYNnWr31S6ujej4JmBG2yo,866
14
+ langgraph_api/logging.py,sha256=o5iVARqtFYKIcRrK2nk1ymcKEiVYKd_dHmhXLF2khFI,6090
15
+ langgraph_api/metadata.py,sha256=CA60_y0vXZ7emxIdDfRgMBrwidBih7aGtiYvOnvz-aU,9682
16
+ langgraph_api/otel_context.py,sha256=vKL49rlEKo7t0IhC-M7HXf19IYGiDuowa2yS5dyASws,6175
17
+ langgraph_api/patch.py,sha256=rbDd-RY-fGF8s3huN_FWfxYy9j1DzktxpS61PmY8_Zk,1536
18
+ langgraph_api/queue_entrypoint.py,sha256=pDfqekyhuLaI1YH-hxGmqwH6YDKMTCV8MeX6RfnAkps,8596
19
+ langgraph_api/route.py,sha256=2hx2lGVhuYb-Bej5xRddzx8aQwP1p-2Y_iPFCfAVH6A,6815
20
+ langgraph_api/schema.py,sha256=6I-d56l80-lmIo-la8cjCOy40y3076jzZSThpIpdw-Y,11739
21
+ langgraph_api/self_hosted_logs.py,sha256=MnXRLnUyv32-c0X9uv4yOy6Sz0meaxC1WuM1RBZTwU4,4425
22
+ langgraph_api/self_hosted_metrics.py,sha256=MMTgsbMpt2-vHJXZpbyI21dBoFsTaMVGWQxITdybX-Q,16884
23
+ langgraph_api/serde.py,sha256=4e-Q47hDKaSCde860Sv-Onl4_LxmcFeTT01p6KPWRnM,7876
24
+ langgraph_api/server.py,sha256=zXKZS6dr6iwMuVIoHY5cXb7sxKz7P_3MhZcpdG3ob7M,10287
25
+ langgraph_api/sse.py,sha256=SLdtZmTdh5D8fbWrQjuY9HYLd2dg8Rmi6ZMmFMVc2iE,4204
26
+ langgraph_api/state.py,sha256=0j4bMSqaUZdPx9dhTH_0u6fEnFzHOsBowmr2th-v0NY,4725
27
+ langgraph_api/store.py,sha256=dOuNc64dpg6_rhyIMSCGbQzZ1SPvq_KnJUmf8Sqyubw,5105
28
+ langgraph_api/stream.py,sha256=2SoMduZWDLBY6AeCNoWrg44RIytSqdtlYcyvf1vfFLE,20971
29
+ langgraph_api/thread_ttl.py,sha256=zsQ1sKuqZygG7DE65ZpDmMnWiicDz4bCLDG4p8TjivI,2438
30
+ langgraph_api/traceblock.py,sha256=Qq5CUdefnMDaRDnyvBSWGBClEj-f3oO7NbH6fedxOSE,630
31
+ langgraph_api/validation.py,sha256=VquRrx6j_84htRDi5m9NfqsRksCBwdJmnwlMn9X-cpk,5599
32
+ langgraph_api/webhook.py,sha256=6m815Zqqff2b1YJu5ES46s2Sdfdn309ZjXebbntgHL8,5782
33
+ langgraph_api/worker.py,sha256=l40a8WXfgj6AJNfAhsCb6RCt3lJWBnkW2CgeQwtVyLY,16930
34
+ langgraph_api/api/__init__.py,sha256=ewFqztuYFTpoLseaSZkc_gbDKduHcdb1ILMePr3zZeM,8286
35
+ langgraph_api/api/a2a.py,sha256=vX2k_71L1UA6OUklpsON2jRRwpXGvHqBZblep7xnecQ,54301
36
+ langgraph_api/api/assistants.py,sha256=VaavnwnamcB0ZlmgG4LTxNYTDNpqDLJ1MUJMBhbTRsQ,20289
37
+ langgraph_api/api/mcp.py,sha256=Nl6UoBXyxuSA6Zb9K7f69FHDsuhFou_UMubcAWZQoCw,14424
38
+ langgraph_api/api/meta.py,sha256=4P7mez8IF3orapfCgf1CjALrl5DARnkMqwVmB6Refx0,6269
39
+ langgraph_api/api/openapi.py,sha256=LfiRhoLWywe0dkQYECPHulTjyTjdprw82ARMV71PL20,12397
40
+ langgraph_api/api/profile.py,sha256=CA1ZkHALOuP8orYTICnEhcG_JnnA2wnyjbWyeb117jA,3455
41
+ langgraph_api/api/runs.py,sha256=wwbZEK7Tam1VXRlHP33IiOWYnHEs8A5FQrcXBfdXuT0,27839
42
+ langgraph_api/api/store.py,sha256=Qi9yp-3GTmCdUJtHuNFuCS7uZ0VVomMJFr3nNPDvFbg,6025
43
+ langgraph_api/api/threads.py,sha256=dpopnoXiYrxDJ2h6yshVMDtBRNXtQxgJj9OGCRhz6pk,16663
44
+ langgraph_api/api/ui.py,sha256=_genglTUy5BMHlL0lkQypX524yFv6Z5fraIvnrxp7yE,2639
45
+ langgraph_api/auth/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
46
+ langgraph_api/auth/custom.py,sha256=-bCRMxXbGnWh4d0wZVxQicZVup-tutvkXpFpIKSXhfE,23272
47
+ langgraph_api/auth/middleware.py,sha256=jDA4t41DUoAArEY_PNoXesIUBJ0nGhh85QzRdn5EPD0,1916
48
+ langgraph_api/auth/noop.py,sha256=Bk6Nf3p8D_iMVy_OyfPlyiJp_aEwzL-sHrbxoXpCbac,586
49
+ langgraph_api/auth/studio_user.py,sha256=fojJpexdIZYI1w3awiqOLSwMUiK_M_3p4mlfQI0o-BE,454
50
+ langgraph_api/auth/langsmith/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
51
+ langgraph_api/auth/langsmith/backend.py,sha256=JVf8-q1IvB5EeiLJge3cOtPvDg6qHzK_4cR-R8hPXXQ,3753
52
+ langgraph_api/auth/langsmith/client.py,sha256=79kwCVeHU64nsHsxWipfZhf44lM6vfs2nlfTxlJF6LU,4142
53
+ langgraph_api/config/__init__.py,sha256=yBvJggB1b9YAdW2CcNeerWSiFFHtHLV446VNN4uCrsc,17322
54
+ langgraph_api/config/_parse.py,sha256=5P-tYGe4BCspeynlO9oWc9pzkfKZjNq9HQXfuEI-hLw,1859
55
+ langgraph_api/config/schemas.py,sha256=kD-74ACMJw88wKKuoKYoW8s8pZLateeDJCZ3u1wfjuI,16020
56
+ langgraph_api/encryption/__init__.py,sha256=gaCZ00CocSbqSqrDn6XJHaSp2CZCnC8qnrD9G4fbzyI,363
57
+ langgraph_api/encryption/aes_json.py,sha256=f2SoNEdwmzQBwRazNH8ZGCll31Zr_ZrJosv2b-GDy9U,6097
58
+ langgraph_api/encryption/context.py,sha256=_6qyeDa9K6HLzR0dRikbx1PWgJXrY2f7vu1g2_CvV3c,1149
59
+ langgraph_api/encryption/custom.py,sha256=ChFzox94vcAj3ZqSkxWNEJ4vyrszc9DxvZl8Y5S2gf8,10742
60
+ langgraph_api/encryption/middleware.py,sha256=xo4I9b2vDMpsegj6xallCdnELbigEh1jLxEk8yiRrCg,23755
61
+ langgraph_api/encryption/shared.py,sha256=bsyyi0njbUsi9sLN5Qwr4fJfKi_7BbkX8ngbkgpgBAM,2101
62
+ langgraph_api/grpc/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
63
+ langgraph_api/grpc/client.py,sha256=cZIowtE05zcNQEsYecDnQuCAK3oi_P2JXa1WVfywC6s,10494
64
+ langgraph_api/grpc/config_conversion.py,sha256=1lfLrprTp0J83DCUE3Op6e1u2afFI1Z2mcFUzCyHEco,7706
65
+ langgraph_api/grpc/generated/__init__.py,sha256=bMom8AZdwLEtOLeK2f6rrFE3-6e8gLhCnom9p-UzxM0,868
66
+ langgraph_api/grpc/generated/checkpointer_pb2.py,sha256=c2kqUY79VD5PnODN6XX6czOHI7fwjFz3HGKFtWy-dKI,5314
67
+ langgraph_api/grpc/generated/checkpointer_pb2.pyi,sha256=wWIPTrNZCCQb0mwNc5qkGXva-TJ4z0wSvqakbFb8BPQ,5323
68
+ langgraph_api/grpc/generated/checkpointer_pb2_grpc.py,sha256=jRDArLKMeZrEVzqJuxU9yxrVaVy015WYqlexF6710MU,12676
69
+ langgraph_api/grpc/generated/core_api_pb2.py,sha256=ybIP5OH83aukNk27O1y0EEq51OiYa_mq-Z2rPP8tnV0,35963
70
+ langgraph_api/grpc/generated/core_api_pb2.pyi,sha256=M6Ch39aISRiupWBIS6EjZbQ_4ilR-e2Ug2eri1uAQFs,47597
71
+ langgraph_api/grpc/generated/core_api_pb2_grpc.py,sha256=SA1-SDOAg03oRWqthg_COOvbgHREFGtGsb2VX6MF_Tw,60835
72
+ langgraph_api/grpc/generated/engine_common_pb2.py,sha256=SdLNv2GFwg4XtxEX3JAtJ_lNHZ16SSVcw23sozX_jTM,28311
73
+ langgraph_api/grpc/generated/engine_common_pb2.pyi,sha256=tFn1pCA65ccBD9_WQawFNFIwBU9EPt0FWeJrRTWcoBs,37220
74
+ langgraph_api/grpc/generated/engine_common_pb2_grpc.py,sha256=ChVXQ2OvT6i5OsWWvS-Cn2ldyXDbaPP1LwWmZfU3ya8,894
75
+ langgraph_api/grpc/generated/enum_cancel_run_action_pb2.py,sha256=lUUgb_1EHrh_j0J5j3V1Kw_SUH0ite2kRlv_fA0_qv4,1567
76
+ langgraph_api/grpc/generated/enum_cancel_run_action_pb2.pyi,sha256=iWDJVfBjmfmfzTpIF3GPQjZT7xbfSqIDBmAEMe1LqEM,442
77
+ langgraph_api/grpc/generated/enum_cancel_run_action_pb2_grpc.py,sha256=ldktwMSbuyvLtF8MBrxFUn5ujuyvCImuzRzjkC1DaEI,903
78
+ langgraph_api/grpc/generated/enum_control_signal_pb2.py,sha256=Ex43DoJnCekyqIHjGiZbzxv18to3m_01-_xRIkz7VA8,1598
79
+ langgraph_api/grpc/generated/enum_control_signal_pb2.pyi,sha256=TzMXy8IRnSF5O6OMh8hVmwjoGdhHZHrP4tR-Ch2AU0o,548
80
+ langgraph_api/grpc/generated/enum_control_signal_pb2_grpc.py,sha256=sFP0bCGyO_bp0-7Z1zwX0IvPSRWr3fBE8d9YziA1ydc,900
81
+ langgraph_api/grpc/generated/enum_durability_pb2.py,sha256=bPsGgqmYBGXZHU5fXO_DKpKvNfdPM1Yy3Roxlq9HjWw,1574
82
+ langgraph_api/grpc/generated/enum_durability_pb2.pyi,sha256=DmZxqhLW1n5MIPxaNxDudvGJBKXwooaHmH5EFNPXyLE,505
83
+ langgraph_api/grpc/generated/enum_durability_pb2_grpc.py,sha256=BQsfqAYZZvZM8HmvYyn7RbFH51WB0BJdflQ9DABu4pc,896
84
+ langgraph_api/grpc/generated/enum_multitask_strategy_pb2.py,sha256=F7zxI3TxTHck7oQ5vTlVplRbFUr92d9lvSXKzHf14cU,1640
85
+ langgraph_api/grpc/generated/enum_multitask_strategy_pb2.pyi,sha256=sOcVD6V5eLR8gTjOootxgMeVNMDUrOkKSaHBJMwC3V4,588
86
+ langgraph_api/grpc/generated/enum_multitask_strategy_pb2_grpc.py,sha256=9ZI2qrAC0WWHEn7phtyHp9PSAm6-Cm8L8aixQbJS5H0,904
87
+ langgraph_api/grpc/generated/enum_run_status_pb2.py,sha256=r31G5SG43wC9cZ63cf7I4bDDzUj_yN6iohZHCSsJUJ0,1661
88
+ langgraph_api/grpc/generated/enum_run_status_pb2.pyi,sha256=eCzHWo1y7bwy40Yu0eyeymf9kfD76p9QlhBGydkdSuY,677
89
+ langgraph_api/grpc/generated/enum_run_status_pb2_grpc.py,sha256=K1PtbVYTOOxZFSfmhU6GwTvfM3K25QV1x0NYbGQ4-78,896
90
+ langgraph_api/grpc/generated/enum_stream_mode_pb2.py,sha256=JrC12tCPapY2EnRUUmqrPxzNWam26ZqBF3Y2Xn4Ie7M,1764
91
+ langgraph_api/grpc/generated/enum_stream_mode_pb2.pyi,sha256=qu_fiSOiUHo6S9qLcvpOomJCz-kK4p21iXqaSaVBqpk,861
92
+ langgraph_api/grpc/generated/enum_stream_mode_pb2_grpc.py,sha256=UJoVhZT9HG-iw6I01j83x0T4zpTSMixjf9zmdvhqt2w,897
93
+ langgraph_api/grpc/generated/enum_thread_status_pb2.py,sha256=WCL5geuQUJLHNI9R-blHD1b06yyBm5VsjZNlKBXUP1s,1593
94
+ langgraph_api/grpc/generated/enum_thread_status_pb2.pyi,sha256=6Jz-TGMJn6HQYbGoF8Vuau08ijV2eqHeAYNTucDBjMU,531
95
+ langgraph_api/grpc/generated/enum_thread_status_pb2_grpc.py,sha256=vezfoGmllADB5UGeDKns3wATSOQ6L1NJhwRopo_NSs0,899
96
+ langgraph_api/grpc/generated/enum_thread_stream_mode_pb2.py,sha256=DXbe4vf2RotNj0t0N_MdyJRuiAm11KGQESR13y29JZE,1630
97
+ langgraph_api/grpc/generated/enum_thread_stream_mode_pb2.pyi,sha256=vS5KdSEeUJS1YxFakMZ2F6Ft-Imu2fMbZTgzbG8K56s,593
98
+ langgraph_api/grpc/generated/enum_thread_stream_mode_pb2_grpc.py,sha256=SbOmBSBSFEqKhfwA5OUQbufcRxzug-rqVf8yK2R0vrM,904
99
+ langgraph_api/grpc/generated/errors_pb2.py,sha256=JI6x-vBK1AE7DHZ5DQwN1mZWF6C4xTRxCaCkxpaDGEM,1758
100
+ langgraph_api/grpc/generated/errors_pb2.pyi,sha256=U6bVim23Mhnwclum7xE1a9h9okES0Fp5KGrQoB-qiqA,849
101
+ langgraph_api/grpc/generated/errors_pb2_grpc.py,sha256=isRazKCSYfy2FT97Gtck3feSkD54htDhtkMX4dFtp2s,887
102
+ langgraph_api/grpc/ops/__init__.py,sha256=EqYni0xn0mHlFAFUfzQpzYIHHf1-p6QhqHQC7ekxkiY,13974
103
+ langgraph_api/grpc/ops/assistants.py,sha256=WmJuYHn7kYkSzFsul6HyfJptratHEbL_mcQqvRhUPEY,13682
104
+ langgraph_api/grpc/ops/runs.py,sha256=J2MC_OSUfG6kpK145nh0nSL393K6e3a_e6sa5cLj4EM,27211
105
+ langgraph_api/grpc/ops/threads.py,sha256=HBfc-I--av2N_yshfJgeo8uibAJpIuo7rvX7uL1ik-U,35854
106
+ langgraph_api/js/.gitignore,sha256=l5yI6G_V6F1600I1IjiUKn87f4uYIrBAYU1MOyBBhg4,59
107
+ langgraph_api/js/.prettierrc,sha256=0es3ovvyNIqIw81rPQsdt1zCQcOdBqyR_DMbFE4Ifms,19
108
+ langgraph_api/js/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
109
+ langgraph_api/js/base.py,sha256=CJihwc51MwOVkis80f8zudRa1fQz_5jrom4rY8trww8,1133
110
+ langgraph_api/js/build.mts,sha256=-LVN4xxh5tY0JvJFZKT8vE6uT-O4oXjQlgCp9NwmVnQ,3380
111
+ langgraph_api/js/client.http.mts,sha256=FeVM53vduTPCyMPaYs__kmB3iWcz0k0om811DG0JvH0,4883
112
+ langgraph_api/js/client.mts,sha256=6lG_lDJkQVeWMURb2TaXR0Zvp8pMZk_N3id1zJsbIuA,32295
113
+ langgraph_api/js/errors.py,sha256=Cm1TKWlUCwZReDC5AQ6SgNIVGD27Qov2xcgHyf8-GXo,361
114
+ langgraph_api/js/global.d.ts,sha256=j4GhgtQSZ5_cHzjSPcHgMJ8tfBThxrH-pUOrrJGteOU,196
115
+ langgraph_api/js/package.json,sha256=RBs9OT4A0LeFOsu4d4EhsuO7XJUzgXN7nCRuOxRj-n0,1354
116
+ langgraph_api/js/remote.py,sha256=anYcBH4vH3RWc8DxrkcHdisuaCLz-fqPnqWlaEoI64E,39716
117
+ langgraph_api/js/schema.py,sha256=M4fLtr50O1jck8H1hm_0W4cZOGYGdkrB7riLyCes4oY,438
118
+ langgraph_api/js/sse.py,sha256=BB2YfVP6KKFKns34lTApXOSmK5CxiIUO29n62mS7jYc,4127
119
+ langgraph_api/js/traceblock.mts,sha256=QtGSN5VpzmGqDfbArrGXkMiONY94pMQ5CgzetT_bKYg,761
120
+ langgraph_api/js/tsconfig.json,sha256=imCYqVnqFpaBoZPx8k1nO4slHIWBFsSlmCYhO73cpBs,341
121
+ langgraph_api/js/ui.py,sha256=LG_HnQicmAAwvb6OJ50_ScjlnpPjpls4zS8ZkfH-SxQ,2494
122
+ langgraph_api/js/yarn.lock,sha256=p-hwSXUvL-P_e3uOJXIWbAqBieAl-yMPesBsSvw8x4s,96379
123
+ langgraph_api/js/src/graph.mts,sha256=etZd27NaoVevyitJ-LAUue0HeR7V3F2YNeSGwWHm13s,3417
124
+ langgraph_api/js/src/load.hooks.mjs,sha256=xNVHq75W0Lk6MUKl1pQYrx-wtQ8_neiUyI6SO-k0ecM,2235
125
+ langgraph_api/js/src/preload.mjs,sha256=8m3bYkf9iZLCQzKAYAdU8snxUwAG3dVLwGvAjfGfgIc,959
126
+ langgraph_api/js/src/utils/files.mts,sha256=nU09Y8lN8SYsg0x2ffmbIW8LEDBl-SWkmxsoXunFU0M,219
127
+ langgraph_api/js/src/utils/importMap.mts,sha256=pX4TGOyUpuuWF82kXcxcv3-8mgusRezOGe6Uklm2O5A,1644
128
+ langgraph_api/js/src/utils/pythonSchemas.mts,sha256=98IW7Z_VP7L_CHNRMb3_MsiV3BgLE2JsWQY_PQcRR3o,685
129
+ langgraph_api/js/src/utils/serde.mts,sha256=D9o6MwTgwPezC_DEmsWS5NnLPnjPMVWIb1I1D4QPEPo,743
130
+ langgraph_api/middleware/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
131
+ langgraph_api/middleware/http_logger.py,sha256=G54oWYsdoFmK0hKbHCBAiSLQt5CGh0rs1gUhDCLRJB8,4066
132
+ langgraph_api/middleware/private_network.py,sha256=eQEzWI8epBNUCiNsMu9O27ofHBQ45M0p2OZy5YdUYos,2097
133
+ langgraph_api/middleware/request_id.py,sha256=SDj3Yi3WvTbFQ2ewrPQBjAV8sYReOJGeIiuoHeZpR9g,1242
134
+ langgraph_api/models/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
135
+ langgraph_api/models/run.py,sha256=Ibfo6wWa2xEoSIYvL5PVQ5Xl2o5bbW9vOikaPiznNtQ,14316
136
+ langgraph_api/timing/__init__.py,sha256=lWXHCGh71I8ouF0wUznYRMKHAQ-8VQHF9gf9jkeV5dg,526
137
+ langgraph_api/timing/profiler.py,sha256=xGKP3qDD5yZU5Lh2o7LGFkCXWZErFKXWTZX3oIjZZ34,6199
138
+ langgraph_api/timing/timer.py,sha256=djg6JQLE_zwpOagqosguTh7nbRUYrersaYOdoqeREe0,9515
139
+ langgraph_api/tunneling/cloudflare.py,sha256=iKb6tj-VWPlDchHFjuQyep2Dpb-w2NGfJKt-WJG9LH0,3650
140
+ langgraph_api/utils/__init__.py,sha256=ljIYqTAmOjhfol0cI3K7OvYxSy2XkSLKzQdwov9-r1I,7097
141
+ langgraph_api/utils/cache.py,sha256=F23s-4BPJjuYh_PRL5pmIsSjqYWsY_b3PB7xmRwKwKw,3452
142
+ langgraph_api/utils/config.py,sha256=oY6OHgrRZ_ylGAycQmnaH_hCqjrvgA6duCQ9bag_KJ8,4167
143
+ langgraph_api/utils/errors.py,sha256=51WNBkbk1JHlTvA-J2lgkA3PDj3BEGcnhIECwAihWgU,2728
144
+ langgraph_api/utils/future.py,sha256=nyzRTVmXwGq1dwJCS39iOVLAsfk-cpZ9HKNje1G5J5g,7429
145
+ langgraph_api/utils/headers.py,sha256=NDBmKSSVOOYeYN0HfK1a3xbYtAg35M_JO1G9yklpZsA,5682
146
+ langgraph_api/utils/retriable_client.py,sha256=a50ZxfXV48C97rOCiVWAEmfOPJELwPnvUyEqo3vEixI,2379
147
+ langgraph_api/utils/stream_codec.py,sha256=bwxCm9bIsfSQ742oPKmZs__O0qVR4ylahEKtFMF4ygM,9941
148
+ langgraph_api/utils/uuids.py,sha256=8tY4ZjvtIfBM0CvBW--P2sGITdj6DBMBr0ZzO0L41RU,1786
149
+ langgraph_license/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
150
+ langgraph_license/validation.py,sha256=CU38RUZ5xhP1S8F_y8TNeV6OmtO-tIGjCXbXTwJjJO4,612
151
+ langgraph_runtime/__init__.py,sha256=ObQnjWp8QN3cbrEYz3mWpzhnJuWF_P7C85KILVN-C_M,1089
152
+ langgraph_runtime/checkpoint.py,sha256=J2ePryEyKJWGgxjs27qEHrjj87uPMX3Rqm3hLvG63uk,119
153
+ langgraph_runtime/database.py,sha256=ANEtfm4psr19FtpVcNs5CFWHw-JhfHvIMnkaORa4QSM,117
154
+ langgraph_runtime/lifespan.py,sha256=-YIHyEEaP_F2tSdTP0tNjfAJXs7KfxaIsWdmQAUi2KM,117
155
+ langgraph_runtime/metrics.py,sha256=CIBw3tjTg1c-o3_2InA-qV34028fQcYWBYkpN6zdEoI,116
156
+ langgraph_runtime/ops.py,sha256=ht_U9LPbHWy0l95b_Q0Vvtd7kYxeZsaSKSf0WpwHUoo,112
157
+ langgraph_runtime/queue.py,sha256=m7req6Ca9NOw1yp-zo30zGhldRWDFk4QVL_tgrVrhQg,114
158
+ langgraph_runtime/retry.py,sha256=V0duD01fO7GUQ_btQkp1aoXcEOFhXooGVP6q4yMfuyY,114
159
+ langgraph_runtime/routes.py,sha256=9sovbiIFUKNptpQ8E1RuHJN6CQZOgvO9ygC3E_z7BZk,343
160
+ langgraph_runtime/store.py,sha256=7mowndlsIroGHv3NpTSOZDJR0lCuaYMBoTnTrewjslw,114
161
+ LICENSE,sha256=ZPwVR73Biwm3sK6vR54djCrhaRiM4cAD2zvOQZV8Xis,3859
162
+ logging.json,sha256=sBy8HDDPuucpLbLUD6e8t5fsiQjJoklZsbVHi2qQ7aQ,367
163
+ openapi.json,sha256=G8W7uKabysvFhoF-UDppwKewleDbmdiGYvd74n8EnkM,184397
164
+ langgraph_api-0.7.3.dist-info/METADATA,sha256=BIEsyl43WDrLUZucXYJDocGp5M1eEWEBawC-kO_BuL0,4282
165
+ langgraph_api-0.7.3.dist-info/WHEEL,sha256=WLgqFyCfm_KASv4WHyYy0P3pM_m7J5L9k2skdKLirC8,87
166
+ langgraph_api-0.7.3.dist-info/entry_points.txt,sha256=hGedv8n7cgi41PypMfinwS_HfCwA7xJIfS0jAp8htV8,78
167
+ langgraph_api-0.7.3.dist-info/licenses/LICENSE,sha256=ZPwVR73Biwm3sK6vR54djCrhaRiM4cAD2zvOQZV8Xis,3859
168
+ langgraph_api-0.7.3.dist-info/RECORD,,
@@ -1,4 +1,4 @@
1
1
  Wheel-Version: 1.0
2
- Generator: hatchling 1.27.0
2
+ Generator: hatchling 1.28.0
3
3
  Root-Is-Purelib: true
4
4
  Tag: py3-none-any
@@ -35,5 +35,6 @@ for module_name in (
35
35
  "retry",
36
36
  "store",
37
37
  "metrics",
38
+ "routes",
38
39
  ):
39
40
  sys.modules["langgraph_runtime." + module_name] = getattr(backend, module_name)
@@ -0,0 +1,11 @@
1
+ """Route discovery facade for runtime packages.
2
+
3
+ This module discovers and exposes internal routes from the active runtime.
4
+ Routes are loaded based on MIGRATIONS_PATH which determines the runtime type.
5
+ """
6
+
7
+ from collections.abc import Callable
8
+
9
+ from starlette.routing import Route
10
+
11
+ get_internal_routes: Callable[[], list[Route]] | None = None
logging.json CHANGED
@@ -15,8 +15,6 @@
15
15
  }
16
16
  },
17
17
  "root": {
18
- "handlers": [
19
- "console"
20
- ]
18
+ "handlers": ["console"]
21
19
  }
22
20
  }