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

@@ -1,4 +1,6 @@
1
1
  import asyncio
2
+ import functools
3
+ import re
2
4
  import urllib.parse
3
5
  import uuid
4
6
  from collections.abc import Mapping, Sequence
@@ -159,6 +161,81 @@ LANGSMITH_TAGS = "langsmith-tags"
159
161
  LANGSMITH_PROJECT = "langsmith-project"
160
162
 
161
163
 
164
+ def translate_pattern(pat: str) -> re.Pattern[str]:
165
+ """Translate a pattern to regex, supporting only literals and * wildcards to avoid RE DoS."""
166
+ res = []
167
+ i = 0
168
+ n = len(pat)
169
+
170
+ while i < n:
171
+ c = pat[i]
172
+ i += 1
173
+
174
+ if c == "*":
175
+ res.append(".*")
176
+ else:
177
+ res.append(re.escape(c))
178
+
179
+ pattern = "".join(res)
180
+ return re.compile(rf"(?s:{pattern})\Z")
181
+
182
+
183
+ @functools.lru_cache(maxsize=1)
184
+ def get_header_patterns() -> (
185
+ tuple[list[re.Pattern[str] | None], list[re.Pattern[str] | None]]
186
+ ):
187
+ from langgraph_api import config
188
+
189
+ if not config.HTTP_CONFIG:
190
+ return None, None
191
+ configurable = config.HTTP_CONFIG.get("configurable_headers")
192
+ if not configurable:
193
+ return None, None
194
+ header_includes = configurable.get("includes") or []
195
+ include_patterns = []
196
+ for include in header_includes:
197
+ include_patterns.append(translate_pattern(include))
198
+ header_excludes = configurable.get("excludes") or []
199
+ exclude_patterns = []
200
+ for exclude in header_excludes:
201
+ exclude_patterns.append(translate_pattern(exclude))
202
+ return include_patterns, exclude_patterns
203
+
204
+
205
+ def get_configurable_headers(headers: dict[str, str]) -> dict[str, str]:
206
+ configurable = {}
207
+ include_patterns, exclude_patterns = get_header_patterns()
208
+ for key, value in headers.items():
209
+ if include_patterns and not any(
210
+ pattern.match(key) for pattern in include_patterns
211
+ ):
212
+ continue
213
+ if exclude_patterns and any(pattern.match(key) for pattern in exclude_patterns):
214
+ continue
215
+ if key.startswith("x-"):
216
+ if key in (
217
+ "x-api-key",
218
+ "x-tenant-id",
219
+ "x-service-key",
220
+ ):
221
+ continue
222
+ configurable[key] = value
223
+ elif key == "langsmith-trace":
224
+ configurable[key] = value
225
+ if baggage := headers.get("baggage"):
226
+ for item in baggage.split(","):
227
+ key, value = item.split("=")
228
+ if key == LANGSMITH_METADATA and key not in configurable:
229
+ configurable[key] = orjson.loads(urllib.parse.unquote(value))
230
+ elif key == LANGSMITH_TAGS:
231
+ configurable[key] = urllib.parse.unquote(value).split(",")
232
+ elif key == LANGSMITH_PROJECT:
233
+ configurable[key] = urllib.parse.unquote(value)
234
+ elif key == "user-agent":
235
+ configurable[key] = value
236
+ return configurable
237
+
238
+
162
239
  async def create_valid_run(
163
240
  conn: AsyncConnectionProto,
164
241
  thread_id: str | None,
@@ -197,28 +274,7 @@ async def create_valid_run(
197
274
  configurable["checkpoint_id"] = str(checkpoint_id)
198
275
  if checkpoint := payload.get("checkpoint"):
199
276
  configurable.update(checkpoint)
200
- for key, value in headers.items():
201
- if key.startswith("x-"):
202
- if key in (
203
- "x-api-key",
204
- "x-tenant-id",
205
- "x-service-key",
206
- ):
207
- continue
208
- configurable[key] = value
209
- elif key == "langsmith-trace":
210
- configurable[key] = value
211
- if baggage := headers.get("baggage"):
212
- for item in baggage.split(","):
213
- key, value = item.split("=")
214
- if key == LANGSMITH_METADATA and key not in configurable:
215
- configurable[key] = orjson.loads(urllib.parse.unquote(value))
216
- elif key == LANGSMITH_TAGS:
217
- configurable[key] = urllib.parse.unquote(value).split(",")
218
- elif key == LANGSMITH_PROJECT:
219
- configurable[key] = urllib.parse.unquote(value)
220
- elif key == "user-agent":
221
- configurable[key] = value
277
+ configurable.update(get_configurable_headers(headers))
222
278
  ctx = get_auth_ctx()
223
279
  if ctx:
224
280
  user = ctx.user
langgraph_api/server.py CHANGED
@@ -60,6 +60,7 @@ middleware.extend(
60
60
  allow_credentials=True,
61
61
  allow_methods=["*"],
62
62
  allow_headers=["*"],
63
+ expose_headers=["x-pagination-total"],
63
64
  )
64
65
  if config.CORS_CONFIG is None
65
66
  else Middleware(
@@ -184,7 +185,7 @@ if config.MOUNT_PREFIX:
184
185
  # The SDK initialized with None is trying to connect via
185
186
  # ASGITransport. Ensure that it has the correct subpath prefixes
186
187
  # so the regular router can handle it.
187
- scope["path"] = f'/noauth{prefix}{scope["path"]}'
188
+ scope["path"] = f"/noauth{prefix}{scope['path']}"
188
189
  scope["raw_path"] = scope["path"].encode("utf-8")
189
190
 
190
191
  return await self.app(scope, receive, send)
langgraph_api/sse.py CHANGED
@@ -77,7 +77,7 @@ class EventSourceResponse(sse_starlette.EventSourceResponse):
77
77
  {
78
78
  "type": "http.response.body",
79
79
  "body": json_to_sse(b"error", exc),
80
- "more_body": False,
80
+ "more_body": True,
81
81
  }
82
82
  )
83
83
 
langgraph_api/stream.py CHANGED
@@ -116,7 +116,8 @@ async def astream_state(
116
116
  config["metadata"]["langgraph_host"] = HOST
117
117
  config["metadata"]["langgraph_api_url"] = USER_API_URL
118
118
  # attach node counter
119
- if not isinstance(graph, BaseRemotePregel):
119
+ is_remote_pregel = isinstance(graph, BaseRemotePregel)
120
+ if not is_remote_pregel:
120
121
  config["configurable"]["__pregel_node_finished"] = incr_nodes
121
122
  # TODO add node tracking for JS graphs
122
123
  # attach run_id to config
@@ -244,6 +245,14 @@ async def astream_state(
244
245
  else:
245
246
  yield mode, chunk
246
247
  # --- end shared logic with astream_events ---
248
+ if is_remote_pregel:
249
+ # increament the remote runs
250
+ try:
251
+ nodes_executed = await graph.fetch_nodes_executed()
252
+ incr_nodes(None, incr=nodes_executed)
253
+ except Exception as e:
254
+ logger.warning(f"Failed to fetch nodes executed for {graph.graph_id}: {e}")
255
+
247
256
  # Get feedback URLs
248
257
  if feedback_keys:
249
258
  feedback_urls = await run_in_executor(
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.3
2
2
  Name: langgraph-api
3
- Version: 0.1.15
3
+ Version: 0.1.17
4
4
  Summary:
5
5
  License: Elastic-2.0
6
6
  Author: Nuno Campos
@@ -15,12 +15,12 @@ Requires-Dist: cloudpickle (>=3.0.0,<4.0.0)
15
15
  Requires-Dist: cryptography (>=42.0.0,<45.0)
16
16
  Requires-Dist: httpx (>=0.25.0)
17
17
  Requires-Dist: jsonschema-rs (>=0.20.0,<0.30)
18
- Requires-Dist: langchain-core (>=0.2.38,<0.4.0)
19
- Requires-Dist: langgraph (>=0.2.56,<0.4.0)
20
- Requires-Dist: langgraph-checkpoint (>=2.0.23,<3.0)
18
+ Requires-Dist: langchain-core (>=0.2.38)
19
+ Requires-Dist: langgraph (>=0.2.56)
20
+ Requires-Dist: langgraph-checkpoint (>=2.0.23)
21
21
  Requires-Dist: langgraph-runtime-inmem (>=0.0.6)
22
22
  Requires-Dist: langgraph-sdk (>=0.1.63,<0.2.0)
23
- Requires-Dist: langsmith (>=0.1.63,<0.4.0)
23
+ Requires-Dist: langsmith (>=0.1.63)
24
24
  Requires-Dist: orjson (>=3.9.7)
25
25
  Requires-Dist: pyjwt (>=2.9.0,<3.0.0)
26
26
  Requires-Dist: sse-starlette (>=2.1.0,<2.2.0)
@@ -1,5 +1,5 @@
1
1
  LICENSE,sha256=ZPwVR73Biwm3sK6vR54djCrhaRiM4cAD2zvOQZV8Xis,3859
2
- langgraph_api/__init__.py,sha256=qb0TalpSt1CbprnFyeLUKqgrqNtmnk9IoQQ7umAoXVY,23
2
+ langgraph_api/__init__.py,sha256=BzIjnki8Bz3evNWo6bjGxxpLhy_tN9MRYhtM0MnDiWs,23
3
3
  langgraph_api/api/__init__.py,sha256=IKKMrC5gCHTzjprbg8jgZDrAJRuqJfSUgEkZAgh3l-M,5771
4
4
  langgraph_api/api/assistants.py,sha256=6oYFRKlvqheJQGbWjFhQOUnnSbvsbrdMYLRJP7WtSRo,14481
5
5
  langgraph_api/api/mcp.py,sha256=KbR19dtFCpJEiKYj3IfepAuJij8YZVELuVp7JY_yu_o,13754
@@ -20,36 +20,37 @@ langgraph_api/auth/noop.py,sha256=Bk6Nf3p8D_iMVy_OyfPlyiJp_aEwzL-sHrbxoXpCbac,58
20
20
  langgraph_api/auth/studio_user.py,sha256=FzFQRROKDlA9JjtBuwyZvk6Mbwno5M9RVYjDO6FU3F8,186
21
21
  langgraph_api/cli.py,sha256=9Ou3tGDDY_VVLt5DFle8UviJdpI4ZigC5hElYvq2-To,14519
22
22
  langgraph_api/command.py,sha256=3O9v3i0OPa96ARyJ_oJbLXkfO8rPgDhLCswgO9koTFA,768
23
- langgraph_api/config.py,sha256=GWXgIDVPtpY7MBiAQMg7iluDzl7z6VYUsX_I1payq4k,10618
23
+ langgraph_api/config.py,sha256=KXQ3W0LzGuEqc0kfB2B37tvqFBwl66rW7vXtw1gIZGc,10773
24
24
  langgraph_api/cron_scheduler.py,sha256=i87j4pJrcsmsqMKeKUs69gaAjrGaSM3pM3jnXdN5JDQ,2630
25
25
  langgraph_api/errors.py,sha256=Bu_i5drgNTyJcLiyrwVE_6-XrSU50BHf9TDpttki9wQ,1690
26
- langgraph_api/graph.py,sha256=OMvYH6xO5KXwPxTSZ3e_yQZXDmT8nVsa0iqOWqKqYaw,21477
26
+ langgraph_api/graph.py,sha256=YyWCPtoI9VDV0knjCMUFoH4r9OFVsAiv5K8FzbziMqs,21488
27
27
  langgraph_api/http.py,sha256=gYbxxjY8aLnsXeJymcJ7G7Nj_yToOGpPYQqmZ1_ggfA,5240
28
28
  langgraph_api/js/.gitignore,sha256=l5yI6G_V6F1600I1IjiUKn87f4uYIrBAYU1MOyBBhg4,59
29
29
  langgraph_api/js/.prettierrc,sha256=r08GtR4CPFQkArPYy10eMUbrpTvGDVNeoZRvaeZu0Kc,18
30
30
  langgraph_api/js/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
31
- langgraph_api/js/base.py,sha256=udYS5_OmmJI_d7kEUv0H4FINprZOW6tdXRkKDEdzNvc,469
32
- langgraph_api/js/build.mts,sha256=4xcjo9rufSPUnnihdYp1EnDPSoaDQDV6aN8_UMjKp-g,1916
31
+ langgraph_api/js/base.py,sha256=gjY6K8avI03OrI-Hy6a311fQ_EG5r_x8hUYlc7uqxdE,534
32
+ langgraph_api/js/build.mts,sha256=ceHRr_Io_9otkDOSgHuKbGnOUu4AX2jPj8APTTa9UjM,2741
33
33
  langgraph_api/js/client.http.mts,sha256=AGA-p8J85IcNh2oXZjDxHQ4PnQdJmt-LPcpZp6j0Cws,4687
34
- langgraph_api/js/client.mts,sha256=7v5BcWsR5w6wGCsxhm6xryBgI-5vfu2Or1YmT-GdKyY,28766
34
+ langgraph_api/js/client.mts,sha256=YUna7um53zSiZHt0Dfmd7fBTTEPAZ2-hLNZ7m9nDsT8,30090
35
35
  langgraph_api/js/errors.py,sha256=Cm1TKWlUCwZReDC5AQ6SgNIVGD27Qov2xcgHyf8-GXo,361
36
36
  langgraph_api/js/global.d.ts,sha256=j4GhgtQSZ5_cHzjSPcHgMJ8tfBThxrH-pUOrrJGteOU,196
37
- langgraph_api/js/package.json,sha256=2TAUHkfqY3VV5NUnkYaCVgN3Z9EvUAD32eOLUyASUFk,1289
38
- langgraph_api/js/remote.py,sha256=pnyq3oGtMX3kGaBLU-lhMf_kKvc1a1324Z3e_KIKAD0,35117
37
+ langgraph_api/js/package.json,sha256=5gtQpj0mXh069X5fWJFWp-jt7Sb3RQUPVpe4m8Q0KHE,1289
38
+ langgraph_api/js/remote.py,sha256=7n9JN6rLO3BcvLF76jSX6BHPM3vSrARqBeZGmsPANAI,35628
39
39
  langgraph_api/js/schema.py,sha256=7idnv7URlYUdSNMBXQcw7E4SxaPxCq_Oxwnlml8q5ik,408
40
- langgraph_api/js/src/graph.mts,sha256=g86jOvbHj1B0o1jatBc2X5_JEZW2DSNwgUJ_kw1k8Cw,3569
41
- langgraph_api/js/src/hooks.mjs,sha256=XtktgmIHlls_DsknAuwib-z7TqCm0haRoTXvnkgzMuo,601
42
- langgraph_api/js/src/parser/parser.mts,sha256=c7WLEtMMwtVzir9O8VpJFVHKuLjtI86rde-In2lvaM0,13217
40
+ langgraph_api/js/src/graph.mts,sha256=QVy2sUcwcG9WkPF6AXy9mh0dvaXccVIZNtv5rkUtUYc,3479
41
+ langgraph_api/js/src/load.hooks.mjs,sha256=xNVHq75W0Lk6MUKl1pQYrx-wtQ8_neiUyI6SO-k0ecM,2235
42
+ langgraph_api/js/src/parser/parser.mts,sha256=iW5G-YIVIuwuFsfn_GS3_CZsjpa00SxypICfPf2SN9Q,14156
43
43
  langgraph_api/js/src/parser/parser.worker.mjs,sha256=2K6D0GlUmkk7LE39I8mryB8VZVE3-N9Cblji-ArPhFo,386
44
- langgraph_api/js/src/schema/types.mts,sha256=SRCYZTWjxyc7528DaapR_DCm3G5bfDSh4vf-JsYpk0w,62633
45
- langgraph_api/js/src/schema/types.template.mts,sha256=Dbjj_8d-OubqH4QY_OaxSu8ocZ4dVjI94oncL20fqtk,2235
44
+ langgraph_api/js/src/parser/schema/types.mts,sha256=SRCYZTWjxyc7528DaapR_DCm3G5bfDSh4vf-JsYpk0w,62633
45
+ langgraph_api/js/src/parser/schema/types.template.mts,sha256=Dbjj_8d-OubqH4QY_OaxSu8ocZ4dVjI94oncL20fqtk,2235
46
+ langgraph_api/js/src/preload.mjs,sha256=ORV7xwMuZcXWL6jQxNAcCYp8GZVYIvVJbUhmle8jbno,759
46
47
  langgraph_api/js/src/utils/files.mts,sha256=MXC-3gy0pkS82AjPBoUN83jY_qg37WSAPHOA7DwfB4M,141
47
48
  langgraph_api/js/src/utils/importMap.mts,sha256=pX4TGOyUpuuWF82kXcxcv3-8mgusRezOGe6Uklm2O5A,1644
48
49
  langgraph_api/js/src/utils/pythonSchemas.mts,sha256=98IW7Z_VP7L_CHNRMb3_MsiV3BgLE2JsWQY_PQcRR3o,685
49
50
  langgraph_api/js/src/utils/serde.mts,sha256=OuyyO9btvwWd55rU_H4x91dFEJiaPxL-lL9O6Zgo908,742
50
51
  langgraph_api/js/sse.py,sha256=lsfp4nyJyA1COmlKG9e2gJnTttf_HGCB5wyH8OZBER8,4105
51
- langgraph_api/js/tests/api.test.mts,sha256=yn1pH7F5_cgVQAdIjflJsdxaSIPxYe2y74-7fEFr3C4,68064
52
- langgraph_api/js/tests/auth.test.mts,sha256=A8JXfEep6S4jzduoSZeRQkqq9WsFbVE8Bvi3Hj_zx2w,21600
52
+ langgraph_api/js/tests/api.test.mts,sha256=mQxM4Dbdnv_nIYpMg6VIkpmpU012I3D4dwRko3Cw-zI,68115
53
+ langgraph_api/js/tests/auth.test.mts,sha256=Aink9N0y3VCxp-Q0sLapAmdiUBYGzcwU8_3RXkRYN4c,21614
53
54
  langgraph_api/js/tests/compose-postgres.auth.yml,sha256=iPfJbCeYZdV6GiRLiDn_f7qgpG4TyyGaQ4lV-ZXr6Qk,1768
54
55
  langgraph_api/js/tests/compose-postgres.yml,sha256=w4B3YRS0QEnTcZH2-MY0DYvR_c5GcER0uDa1Ga_knf8,1960
55
56
  langgraph_api/js/tests/graphs/.gitignore,sha256=26J8MarZNXh7snXD5eTpV3CPFTht5Znv8dtHYCLNfkw,12
@@ -65,29 +66,30 @@ langgraph_api/js/tests/graphs/error.mts,sha256=l4tk89449dj1BnEF_0ZcfPt0Ikk1gl8L1
65
66
  langgraph_api/js/tests/graphs/http.mts,sha256=64xbMlLA58323zOX68Zh57zIB5Zl8ZCqEWRPNdJ-oJs,2171
66
67
  langgraph_api/js/tests/graphs/langgraph.json,sha256=h6hV1wkNEUIpLBX9JOUKqtIBvbhvzyLEuWtBIHteseg,265
67
68
  langgraph_api/js/tests/graphs/nested.mts,sha256=4G7jSOSaFVQAza-_ARbK-Iai1biLlF2DIPDZXf7PLIY,1245
68
- langgraph_api/js/tests/graphs/package.json,sha256=jaLxs1_Qfb4cRNWxZLZOBwS29ftbea-x8LgenXeYFAA,263
69
+ langgraph_api/js/tests/graphs/package.json,sha256=8kgqWdZJCwekCqjsSrhbLrAPZ2vEy1DmcC8EQnwJMDU,262
69
70
  langgraph_api/js/tests/graphs/weather.mts,sha256=A7mLK3xW8h5B-ZyJNAyX2M2fJJwzPJzXs4DYesJwreQ,1655
70
- langgraph_api/js/tests/graphs/yarn.lock,sha256=GwbaZr7inRbWzuuvrQKLHT72zYDKwtengxdb4eYRbI0,11202
71
- langgraph_api/js/tests/parser.test.mts,sha256=dEC8KTqKygeb1u39ZvpPqCT4HtfPD947nLmITt2buxA,27883
71
+ langgraph_api/js/tests/graphs/yarn.lock,sha256=HDLJKx47Y-csPzA5eYUMVHWE8fMKrZgrc4SEkQAYYCE,11201
72
+ langgraph_api/js/tests/parser.test.mts,sha256=BBKUTveZnf-RI6B9XfTBLqy6tp84ddyu1tN3z041IAs,27900
72
73
  langgraph_api/js/tests/utils.mts,sha256=q1V9gvT63v95onlfK9W4iv3n9ZJO3h-0RD9TdDYuRyY,439
74
+ langgraph_api/js/tsconfig.json,sha256=imCYqVnqFpaBoZPx8k1nO4slHIWBFsSlmCYhO73cpBs,341
73
75
  langgraph_api/js/ui.py,sha256=XNT8iBcyT8XmbIqSQUWd-j_00HsaWB2vRTVabwFBkik,2439
74
- langgraph_api/js/yarn.lock,sha256=9QYAsy6t__oFZ0dZFexfyxC9iZwORT6AIZwtt8Qm4mM,83748
76
+ langgraph_api/js/yarn.lock,sha256=OEj5JbffHe8opUAki0eH_0XJbVmgasv9zcHhGeI0g0w,84019
75
77
  langgraph_api/logging.py,sha256=JJIzbNIgLCN6ClQ3tA-Mm5ffuBGvpRDSZsEvnIlsuu4,3693
76
78
  langgraph_api/metadata.py,sha256=ptaxwmzdx2bUBSc1KRhqgF-Xnm-Zh2gqwSiHpl8LD9c,4482
77
79
  langgraph_api/middleware/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
78
80
  langgraph_api/middleware/http_logger.py,sha256=aj4mdisRobFePkD3Iy6-w_Mujwx4TQRaEhPvSd6HgLk,3284
79
81
  langgraph_api/middleware/private_network.py,sha256=eYgdyU8AzU2XJu362i1L8aSFoQRiV7_aLBPw7_EgeqI,2111
80
82
  langgraph_api/models/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
81
- langgraph_api/models/run.py,sha256=6zl3t1_LAr5v2AIcrFSWDG5rLvqREeswXJymuGx6AT8,11258
83
+ langgraph_api/models/run.py,sha256=ZgIaE7fUYAllqeC7MbfXuKEzmkFnvo3O44DdXTMCTNY,12946
82
84
  langgraph_api/patch.py,sha256=Dgs0PXHytekX4SUL6KsjjN0hHcOtGLvv1GRGbh6PswU,1408
83
85
  langgraph_api/queue_entrypoint.py,sha256=gjtajZfnDXhsi7JElfmkY-p0ENBiKBDJ4Ugiw-exapw,1839
84
86
  langgraph_api/route.py,sha256=fM4qYCGbmH0a3_cV8uKocb1sLklehxO6HhdRXqLK6OM,4421
85
87
  langgraph_api/schema.py,sha256=Frh_YOC3S1cDAMPUVanNi78ooSXK2WFpu9YkIVz5h14,5433
86
88
  langgraph_api/serde.py,sha256=TVsx2QQtepf8Wsgsabcku1NV4Vbugu4Oujmdnq4qMS0,3964
87
- langgraph_api/server.py,sha256=gluUa9L822atoMuAOxnlgSkHuuluT5vjW_u0EV5XL2o,6544
88
- langgraph_api/sse.py,sha256=2wNodCOP2eg7a9mpSu0S3FQ0CHk2BBV_vv0UtIgJIcc,4034
89
+ langgraph_api/server.py,sha256=lCv_ZHLbMnhKRhdaSJi1edk-O9We-MnQafkGzdWlngw,6599
90
+ langgraph_api/sse.py,sha256=3jG_FZj8FI9r7xGWTqaAyDkmqf6P1NOu0EzGrcSOGYc,4033
89
91
  langgraph_api/state.py,sha256=8jx4IoTCOjTJuwzuXJKKFwo1VseHjNnw_CCq4x1SW14,2284
90
- langgraph_api/stream.py,sha256=SN96CLJ5QnSQ2YWRrkQb4K8XkdoSbloyFRj8N1vKcs8,11369
92
+ langgraph_api/stream.py,sha256=a4sjBm3XhHK6NC4OD1dHey53t6czKodvrlxh9rfjfSA,11718
91
93
  langgraph_api/thread_ttl.py,sha256=4vch4nu1UOiYcqYRd7bTHsfs0Ei_lXuy9nBQ0uVJLyo,1765
92
94
  langgraph_api/tunneling/cloudflare.py,sha256=iKb6tj-VWPlDchHFjuQyep2Dpb-w2NGfJKt-WJG9LH0,3650
93
95
  langgraph_api/utils.py,sha256=92mSti9GfGdMRRWyESKQW5yV-75Z9icGHnIrBYvdypU,3619
@@ -99,8 +101,8 @@ langgraph_license/validation.py,sha256=ZKraAVJArAABKqrmHN-EN18ncoNUmRm500Yt1Sc7t
99
101
  langgraph_runtime/__init__.py,sha256=O4GgSmu33c-Pr8Xzxj_brcK5vkm70iNTcyxEjICFZxA,1075
100
102
  logging.json,sha256=3RNjSADZmDq38eHePMm1CbP6qZ71AmpBtLwCmKU9Zgo,379
101
103
  openapi.json,sha256=cjlQFtrH7TwXQ9GNe1jy2iBRhae_F6inFZhsaCQidBc,132770
102
- langgraph_api-0.1.15.dist-info/LICENSE,sha256=ZPwVR73Biwm3sK6vR54djCrhaRiM4cAD2zvOQZV8Xis,3859
103
- langgraph_api-0.1.15.dist-info/METADATA,sha256=mEDzGC3joGCpnT3n5ovhzI-pMPm826SVPld3NHvFp8Y,4169
104
- langgraph_api-0.1.15.dist-info/WHEEL,sha256=fGIA9gx4Qxk2KDKeNJCbOEwSrmLtjWCwzBz351GyrPQ,88
105
- langgraph_api-0.1.15.dist-info/entry_points.txt,sha256=3EYLgj89DfzqJHHYGxPH4A_fEtClvlRbWRUHaXO7hj4,77
106
- langgraph_api-0.1.15.dist-info/RECORD,,
104
+ langgraph_api-0.1.17.dist-info/LICENSE,sha256=ZPwVR73Biwm3sK6vR54djCrhaRiM4cAD2zvOQZV8Xis,3859
105
+ langgraph_api-0.1.17.dist-info/METADATA,sha256=nXIzxwaN2vJqV-HZvcSn4M-lwjJFSgRvqM01CScbib4,4143
106
+ langgraph_api-0.1.17.dist-info/WHEEL,sha256=fGIA9gx4Qxk2KDKeNJCbOEwSrmLtjWCwzBz351GyrPQ,88
107
+ langgraph_api-0.1.17.dist-info/entry_points.txt,sha256=3EYLgj89DfzqJHHYGxPH4A_fEtClvlRbWRUHaXO7hj4,77
108
+ langgraph_api-0.1.17.dist-info/RECORD,,
@@ -1,17 +0,0 @@
1
- // This hook is to ensure that @langchain/langgraph package
2
- // found in /api folder has precendence compared to user-provided package
3
- // found in /deps. Does not attempt to semver check for too old packages.
4
- const OVERRIDE_RESOLVE = [
5
- "@langchain/langgraph",
6
- "@langchain/langgraph-checkpoint",
7
- ];
8
-
9
- export const resolve = async (specifier, context, nextResolve) => {
10
- const parentURL = new URL("./graph.mts", import.meta.url).toString();
11
-
12
- if (OVERRIDE_RESOLVE.includes(specifier)) {
13
- return nextResolve(specifier, { ...context, parentURL });
14
- }
15
-
16
- return nextResolve(specifier, context);
17
- };