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.
- langgraph_api/__init__.py +1 -1
- langgraph_api/api/__init__.py +93 -27
- langgraph_api/api/a2a.py +36 -32
- langgraph_api/api/assistants.py +114 -26
- langgraph_api/api/mcp.py +3 -3
- langgraph_api/api/meta.py +15 -2
- langgraph_api/api/openapi.py +27 -17
- langgraph_api/api/profile.py +108 -0
- langgraph_api/api/runs.py +114 -57
- langgraph_api/api/store.py +19 -2
- langgraph_api/api/threads.py +133 -10
- langgraph_api/asgi_transport.py +14 -9
- langgraph_api/auth/custom.py +23 -13
- langgraph_api/cli.py +86 -41
- langgraph_api/command.py +2 -2
- langgraph_api/config/__init__.py +532 -0
- langgraph_api/config/_parse.py +58 -0
- langgraph_api/config/schemas.py +431 -0
- langgraph_api/cron_scheduler.py +17 -1
- langgraph_api/encryption/__init__.py +15 -0
- langgraph_api/encryption/aes_json.py +158 -0
- langgraph_api/encryption/context.py +35 -0
- langgraph_api/encryption/custom.py +280 -0
- langgraph_api/encryption/middleware.py +632 -0
- langgraph_api/encryption/shared.py +63 -0
- langgraph_api/errors.py +12 -1
- langgraph_api/executor_entrypoint.py +11 -6
- langgraph_api/feature_flags.py +19 -0
- langgraph_api/graph.py +163 -64
- langgraph_api/{grpc_ops → grpc}/client.py +142 -12
- langgraph_api/{grpc_ops → grpc}/config_conversion.py +16 -10
- langgraph_api/grpc/generated/__init__.py +29 -0
- langgraph_api/grpc/generated/checkpointer_pb2.py +63 -0
- langgraph_api/grpc/generated/checkpointer_pb2.pyi +99 -0
- langgraph_api/grpc/generated/checkpointer_pb2_grpc.py +329 -0
- langgraph_api/grpc/generated/core_api_pb2.py +216 -0
- langgraph_api/{grpc_ops → grpc}/generated/core_api_pb2.pyi +292 -372
- langgraph_api/{grpc_ops → grpc}/generated/core_api_pb2_grpc.py +252 -31
- langgraph_api/grpc/generated/engine_common_pb2.py +219 -0
- langgraph_api/{grpc_ops → grpc}/generated/engine_common_pb2.pyi +178 -104
- langgraph_api/grpc/generated/enum_cancel_run_action_pb2.py +37 -0
- langgraph_api/grpc/generated/enum_cancel_run_action_pb2.pyi +12 -0
- langgraph_api/grpc/generated/enum_cancel_run_action_pb2_grpc.py +24 -0
- langgraph_api/grpc/generated/enum_control_signal_pb2.py +37 -0
- langgraph_api/grpc/generated/enum_control_signal_pb2.pyi +16 -0
- langgraph_api/grpc/generated/enum_control_signal_pb2_grpc.py +24 -0
- langgraph_api/grpc/generated/enum_durability_pb2.py +37 -0
- langgraph_api/grpc/generated/enum_durability_pb2.pyi +16 -0
- langgraph_api/grpc/generated/enum_durability_pb2_grpc.py +24 -0
- langgraph_api/grpc/generated/enum_multitask_strategy_pb2.py +37 -0
- langgraph_api/grpc/generated/enum_multitask_strategy_pb2.pyi +16 -0
- langgraph_api/grpc/generated/enum_multitask_strategy_pb2_grpc.py +24 -0
- langgraph_api/grpc/generated/enum_run_status_pb2.py +37 -0
- langgraph_api/grpc/generated/enum_run_status_pb2.pyi +22 -0
- langgraph_api/grpc/generated/enum_run_status_pb2_grpc.py +24 -0
- langgraph_api/grpc/generated/enum_stream_mode_pb2.py +37 -0
- langgraph_api/grpc/generated/enum_stream_mode_pb2.pyi +28 -0
- langgraph_api/grpc/generated/enum_stream_mode_pb2_grpc.py +24 -0
- langgraph_api/grpc/generated/enum_thread_status_pb2.py +37 -0
- langgraph_api/grpc/generated/enum_thread_status_pb2.pyi +16 -0
- langgraph_api/grpc/generated/enum_thread_status_pb2_grpc.py +24 -0
- langgraph_api/grpc/generated/enum_thread_stream_mode_pb2.py +37 -0
- langgraph_api/grpc/generated/enum_thread_stream_mode_pb2.pyi +16 -0
- langgraph_api/grpc/generated/enum_thread_stream_mode_pb2_grpc.py +24 -0
- langgraph_api/grpc/generated/errors_pb2.py +39 -0
- langgraph_api/grpc/generated/errors_pb2.pyi +21 -0
- langgraph_api/grpc/generated/errors_pb2_grpc.py +24 -0
- langgraph_api/grpc/ops/__init__.py +370 -0
- langgraph_api/grpc/ops/assistants.py +424 -0
- langgraph_api/grpc/ops/runs.py +792 -0
- langgraph_api/grpc/ops/threads.py +1013 -0
- langgraph_api/http.py +16 -5
- langgraph_api/js/client.mts +1 -4
- langgraph_api/js/package.json +28 -27
- langgraph_api/js/remote.py +39 -17
- langgraph_api/js/sse.py +2 -2
- langgraph_api/js/ui.py +1 -1
- langgraph_api/js/yarn.lock +1139 -869
- langgraph_api/metadata.py +29 -3
- langgraph_api/middleware/http_logger.py +1 -1
- langgraph_api/middleware/private_network.py +7 -7
- langgraph_api/models/run.py +44 -26
- langgraph_api/otel_context.py +205 -0
- langgraph_api/patch.py +2 -2
- langgraph_api/queue_entrypoint.py +34 -35
- langgraph_api/route.py +33 -1
- langgraph_api/schema.py +84 -9
- langgraph_api/self_hosted_logs.py +2 -2
- langgraph_api/self_hosted_metrics.py +73 -3
- langgraph_api/serde.py +16 -4
- langgraph_api/server.py +33 -31
- langgraph_api/state.py +3 -2
- langgraph_api/store.py +25 -16
- langgraph_api/stream.py +20 -16
- langgraph_api/thread_ttl.py +28 -13
- langgraph_api/timing/__init__.py +25 -0
- langgraph_api/timing/profiler.py +200 -0
- langgraph_api/timing/timer.py +318 -0
- langgraph_api/utils/__init__.py +53 -8
- langgraph_api/utils/config.py +2 -1
- langgraph_api/utils/future.py +10 -6
- langgraph_api/utils/uuids.py +29 -62
- langgraph_api/validation.py +6 -0
- langgraph_api/webhook.py +120 -6
- langgraph_api/worker.py +54 -24
- {langgraph_api-0.5.4.dist-info → langgraph_api-0.7.3.dist-info}/METADATA +8 -6
- langgraph_api-0.7.3.dist-info/RECORD +168 -0
- {langgraph_api-0.5.4.dist-info → langgraph_api-0.7.3.dist-info}/WHEEL +1 -1
- langgraph_runtime/__init__.py +1 -0
- langgraph_runtime/routes.py +11 -0
- logging.json +1 -3
- openapi.json +635 -537
- langgraph_api/config.py +0 -523
- langgraph_api/grpc_ops/generated/__init__.py +0 -5
- langgraph_api/grpc_ops/generated/core_api_pb2.py +0 -275
- langgraph_api/grpc_ops/generated/engine_common_pb2.py +0 -194
- langgraph_api/grpc_ops/ops.py +0 -1045
- langgraph_api-0.5.4.dist-info/RECORD +0 -121
- /langgraph_api/{grpc_ops → grpc}/__init__.py +0 -0
- /langgraph_api/{grpc_ops → grpc}/generated/engine_common_pb2_grpc.py +0 -0
- {langgraph_api-0.5.4.dist-info → langgraph_api-0.7.3.dist-info}/entry_points.txt +0 -0
- {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.
|
|
7
|
-
from langgraph_api.
|
|
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 =
|
|
38
|
-
await http_request(
|
|
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.
|
|
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":
|
|
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
|
|
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
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
run,
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
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
|
|
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.
|
|
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<
|
|
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<
|
|
16
|
-
Requires-Dist: langgraph-runtime-inmem<0.
|
|
17
|
-
Requires-Dist: langgraph-sdk>=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
|
|
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,,
|
langgraph_runtime/__init__.py
CHANGED
|
@@ -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
|