langgraph-api 0.4.19__py3-none-any.whl → 0.4.21__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.

Potentially problematic release.


This version of langgraph-api might be problematic. Click here for more details.

langgraph_api/serde.py CHANGED
@@ -152,6 +152,7 @@ def json_loads(content: bytes | Fragment | dict) -> Any:
152
152
  return orjson.loads(cast(bytes, content))
153
153
 
154
154
 
155
+ # Do not use. orjson holds the GIL the entire time it's running anyway.
155
156
  async def ajson_loads(content: bytes | Fragment) -> Any:
156
157
  return await asyncio.to_thread(json_loads, content)
157
158
 
langgraph_api/server.py CHANGED
@@ -53,11 +53,13 @@ middleware = []
53
53
  if config.ALLOW_PRIVATE_NETWORK:
54
54
  middleware.append(Middleware(PrivateNetworkMiddleware))
55
55
 
56
- if (
56
+ JS_PROXY_MIDDLEWARE_ENABLED = (
57
57
  config.HTTP_CONFIG
58
58
  and (app := config.HTTP_CONFIG.get("app"))
59
59
  and is_js_path(app.split(":")[0])
60
- ):
60
+ )
61
+
62
+ if JS_PROXY_MIDDLEWARE_ENABLED:
61
63
  from langgraph_api.js.remote import JSCustomHTTPProxyMiddleware
62
64
 
63
65
  middleware.append(Middleware(JSCustomHTTPProxyMiddleware))
langgraph_api/stream.py CHANGED
@@ -8,9 +8,11 @@ import langgraph.version
8
8
  import langsmith
9
9
  import structlog
10
10
  from langchain_core.messages import (
11
+ AIMessageChunk,
11
12
  # TODO: Remove explicit dependency
12
13
  BaseMessage,
13
14
  BaseMessageChunk,
15
+ ToolMessageChunk,
14
16
  convert_to_messages,
15
17
  message_chunk_to_message,
16
18
  )
@@ -286,11 +288,23 @@ async def astream_state(
286
288
  msg_, meta = cast(
287
289
  tuple[BaseMessage | dict, dict[str, Any]], chunk
288
290
  )
289
- msg = (
290
- convert_to_messages([msg_])[0]
291
- if isinstance(msg_, dict)
292
- else cast(BaseMessage, msg_)
293
- )
291
+ is_chunk = False
292
+ if isinstance(msg_, dict):
293
+ if (
294
+ "chunk" in msg_.get("type", "").lower()
295
+ or "chunk" in msg_.get("role", "").lower()
296
+ ):
297
+ if "ai" in msg_.get("role", "").lower():
298
+ msg = AIMessageChunk(**msg_) # type: ignore[arg-type]
299
+ elif "tool" in msg_.get("role", "").lower():
300
+ msg = ToolMessageChunk(**msg_) # type: ignore[arg-type]
301
+ else:
302
+ msg = BaseMessageChunk(**msg_) # type: ignore[arg-type]
303
+ is_chunk = True
304
+ else:
305
+ msg = convert_to_messages([msg_])[0]
306
+ else:
307
+ msg = cast(BaseMessage, msg_)
294
308
  if msg.id in messages:
295
309
  messages[msg.id] += msg
296
310
  else:
@@ -302,7 +316,11 @@ async def astream_state(
302
316
  if isinstance(msg, BaseMessageChunk)
303
317
  else "messages/complete"
304
318
  ),
305
- [message_chunk_to_message(messages[msg.id])],
319
+ [
320
+ message_chunk_to_message(messages[msg.id])
321
+ if not is_chunk
322
+ else messages[msg.id]
323
+ ],
306
324
  )
307
325
  elif mode in stream_mode:
308
326
  if subgraphs and ns:
@@ -370,12 +388,23 @@ async def astream_state(
370
388
  msg_, meta = cast(
371
389
  tuple[BaseMessage | dict, dict[str, Any]], chunk
372
390
  )
373
- msg = (
374
- convert_to_messages([msg_])[0]
375
- if isinstance(msg_, dict)
376
- else cast(BaseMessage, msg_)
377
- )
378
-
391
+ is_chunk = False
392
+ if isinstance(msg_, dict):
393
+ if (
394
+ "chunk" in msg_.get("type", "").lower()
395
+ or "chunk" in msg_.get("role", "").lower()
396
+ ):
397
+ if "ai" in msg_.get("role", "").lower():
398
+ msg = AIMessageChunk(**msg_) # type: ignore[arg-type]
399
+ elif "tool" in msg_.get("role", "").lower():
400
+ msg = ToolMessageChunk(**msg_) # type: ignore[arg-type]
401
+ else:
402
+ msg = BaseMessageChunk(**msg_) # type: ignore[arg-type]
403
+ is_chunk = True
404
+ else:
405
+ msg = convert_to_messages([msg_])[0]
406
+ else:
407
+ msg = cast(BaseMessage, msg_)
379
408
  if msg.id in messages:
380
409
  messages[msg.id] += msg
381
410
  else:
@@ -387,7 +416,11 @@ async def astream_state(
387
416
  if isinstance(msg, BaseMessageChunk)
388
417
  else "messages/complete"
389
418
  ),
390
- [message_chunk_to_message(messages[msg.id])],
419
+ [
420
+ message_chunk_to_message(messages[msg.id])
421
+ if not is_chunk
422
+ else messages[msg.id]
423
+ ],
391
424
  )
392
425
  elif mode in stream_mode:
393
426
  if subgraphs and ns:
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: langgraph-api
3
- Version: 0.4.19
3
+ Version: 0.4.21
4
4
  Author-email: Nuno Campos <nuno@langchain.dev>, Will Fu-Hinthorn <will@langchain.dev>
5
5
  License: Elastic-2.0
6
6
  License-File: LICENSE
@@ -11,7 +11,7 @@ Requires-Dist: httpx>=0.25.0
11
11
  Requires-Dist: jsonschema-rs<0.30,>=0.20.0
12
12
  Requires-Dist: langchain-core>=0.3.64
13
13
  Requires-Dist: langgraph-checkpoint>=2.0.23
14
- Requires-Dist: langgraph-runtime-inmem<0.13.0,>=0.12.0
14
+ Requires-Dist: langgraph-runtime-inmem<0.13.0,>=0.12.1
15
15
  Requires-Dist: langgraph-sdk>=0.2.0
16
16
  Requires-Dist: langgraph>=0.4.0
17
17
  Requires-Dist: langsmith>=0.3.45
@@ -1,7 +1,7 @@
1
- langgraph_api/__init__.py,sha256=mfToEOXd_f_mFG0ts1iWNTvKhsjPQqwRFaAmcx61xJo,23
1
+ langgraph_api/__init__.py,sha256=HRnyuWvhHjVmMtjn-Iir0_ZbxVK3sjpTYkAqLIRVMIE,23
2
2
  langgraph_api/asgi_transport.py,sha256=XtiLOu4WWsd-xizagBLzT5xUkxc9ZG9YqwvETBPjBFE,5161
3
3
  langgraph_api/asyncio.py,sha256=FEEkLm_N-15cbElo4vQ309MkDKBZuRqAYV8VJ1DocNw,9860
4
- langgraph_api/cli.py,sha256=-ruIeKi1imvS6GriOfRDZY-waV4SbWiJ0BEFAciPVYI,16330
4
+ langgraph_api/cli.py,sha256=mUSY41UBsPbJ3mGB01VH8UCAba1YCpA7h4P9tvhKAEw,19540
5
5
  langgraph_api/command.py,sha256=Q9XDRhnkCX7jyqW52_Rf2PPYKxjr-Z9BUHazI1HcmB8,817
6
6
  langgraph_api/config.py,sha256=r9mmbyZlhBuJLpnTkaOLcNH6ufFNqm_2eCiuOmhqRl0,12241
7
7
  langgraph_api/cron_scheduler.py,sha256=25wYzEQrhPEivZrAPYOmzLPDOQa-aFogU37mTXc9TJk,2566
@@ -12,29 +12,29 @@ langgraph_api/graph.py,sha256=h1m6rsLiCocvMO283LLU03A5cBycxAIxixXu9mwzqsQ,25056
12
12
  langgraph_api/http.py,sha256=fyK-H-0UfNy_BzuVW3aWWGvhRavmGAVMkDwDArryJ_4,5659
13
13
  langgraph_api/http_metrics.py,sha256=MU9ccXt7aBb0AJ2SWEjwtbtbJEWmeqSdx7-CI51e32o,5594
14
14
  langgraph_api/logging.py,sha256=qB6q_cUba31edE4_D6dBGhdiUTpW7sXAOepUjYb_R50,5216
15
- langgraph_api/metadata.py,sha256=fVsbwxVitAj4LGVYpCcadYeIFANEaNtcx6LBxQLcTqg,6949
15
+ langgraph_api/metadata.py,sha256=0eGYhXOW6UIVDj2Y5mOdSJz_RadgJG8xmUsC9WqwsiE,8342
16
16
  langgraph_api/patch.py,sha256=iLwSd9ZWoVj6MxozMyGyMvWWbE9RIP5eZX1dpCBSlSU,1480
17
17
  langgraph_api/queue_entrypoint.py,sha256=Y0Hu4QXNV7HPZWlBwuNCm8ehqD_n79AMk7ZWDZfBc4U,5631
18
18
  langgraph_api/route.py,sha256=EBhELuJ1He-ZYcAnR5YTImcIeDtWthDae5CHELBxPkM,5056
19
19
  langgraph_api/schema.py,sha256=AsgF0dIjBvDd_PDy20mGqB_IkBLgVvSj8qRKG_lPlec,8440
20
- langgraph_api/serde.py,sha256=Ovs37vfnXP9FHbQqIlA8J3ZdFMuFu-3vnS6EqEuaQ54,5440
21
- langgraph_api/server.py,sha256=uCAqPgCLJ6ckslLs0i_dacSR8mzuR0Y6PkkJYk0O3bE,7196
20
+ langgraph_api/serde.py,sha256=CLAwuiCRJY2-8GCd7gc3IVzJ8GiyBPmrrlLJjh1B0bw,5512
21
+ langgraph_api/server.py,sha256=C9TO7N0mzyrLulT_2FtaJfgfFbm2B4yyYTdAGPxgIeE,7255
22
22
  langgraph_api/sse.py,sha256=SLdtZmTdh5D8fbWrQjuY9HYLd2dg8Rmi6ZMmFMVc2iE,4204
23
23
  langgraph_api/state.py,sha256=AjkLbUQakIwK7oGzJ8oqubazRsXxG3vDMnRa0s0mzDM,4716
24
24
  langgraph_api/store.py,sha256=NIoNZojs6NbtG3VLBPQEFNttvp7XPkHAfjbQ3gY7aLY,4701
25
- langgraph_api/stream.py,sha256=V8jWwA3wBRenMk3WIFkt0OLXm_LhPwg_Yj_tP4Dc6iI,18970
25
+ langgraph_api/stream.py,sha256=TQbrMc1CeT5cMjS0NB-AUEyL7x6TgOfYdNp7c0-X-mY,20961
26
26
  langgraph_api/thread_ttl.py,sha256=KyHnvD0e1p1cV4Z_ZvKNVzDztuI2RBCUsUO2V7GlOSw,1951
27
27
  langgraph_api/traceblock.py,sha256=Qq5CUdefnMDaRDnyvBSWGBClEj-f3oO7NbH6fedxOSE,630
28
28
  langgraph_api/validation.py,sha256=86jftgOsMa7tkeshBw6imYe7zyUXPoVuf5Voh6dFiR8,5285
29
29
  langgraph_api/webhook.py,sha256=SvSM1rdnNtiH4q3JQYmAqJUk2Sable5xAcwOLuRhtlo,1723
30
30
  langgraph_api/worker.py,sha256=FQRw3kL9ynDv_LNgY_OjjPZQBuAvSQpsW6nECnABvDg,15354
31
31
  langgraph_api/api/__init__.py,sha256=raFkYH50tsO-KjRmDbGVoHCuxuH58u1lrZbr-MlITIY,6262
32
- langgraph_api/api/a2a.py,sha256=ChqlhgTq5fzWt0jbbEl8ec9rf-cvAP19Yge7OFv8-6E,34629
33
- langgraph_api/api/assistants.py,sha256=JFaBYp9BAXGaJ0yfy1SG_Mr-3xjeWSkdCHtmXpiAqP4,17290
32
+ langgraph_api/api/a2a.py,sha256=QEx-g0bTOREL-YaFsrcwA7oaix4VsaOr8hoQ7PF4Zwk,49382
33
+ langgraph_api/api/assistants.py,sha256=OX83GCWwGR8MuEJKIzAPEC4LC3Aghs5vD3NGLNnijaU,17268
34
34
  langgraph_api/api/mcp.py,sha256=qe10ZRMN3f-Hli-9TI8nbQyWvMeBb72YB1PZVbyqBQw,14418
35
35
  langgraph_api/api/meta.py,sha256=Qyj6r5czkVJ81tpD6liFY7tlrmFDsiSfBr-4X8HJpRc,4834
36
36
  langgraph_api/api/openapi.py,sha256=If-z1ckXt-Yu5bwQytK1LWyX_T7G46UtLfixgEP8hwc,11959
37
- langgraph_api/api/runs.py,sha256=Dzqg3Klnp_7QVHl26J51DpSlMvBhgUdwcKeeMQdqa4Y,22127
37
+ langgraph_api/api/runs.py,sha256=oODIhM4WQxTS2aNziS0dcHxP8V5TyEsymMFO0kW5KpA,23155
38
38
  langgraph_api/api/store.py,sha256=xGcPFx4v-VxlK6HRU9uCjzCQ0v66cvc3o_PB5_g7n0Q,5550
39
39
  langgraph_api/api/threads.py,sha256=5-ZEcs48bL3vot_yCt3ImuA9hzg93LxuAd_DXd2xj4Y,12915
40
40
  langgraph_api/api/ui.py,sha256=_genglTUy5BMHlL0lkQypX524yFv6Z5fraIvnrxp7yE,2639
@@ -55,14 +55,14 @@ langgraph_api/js/client.http.mts,sha256=cvn8JV9go4pUMWkcug8FfSYWsp1wTaT8SgJaskqE
55
55
  langgraph_api/js/client.mts,sha256=gDvYiW7Qfl4re2YhZ5oNqtuvffnW_Sf7DK5aUbKB3vw,32330
56
56
  langgraph_api/js/errors.py,sha256=Cm1TKWlUCwZReDC5AQ6SgNIVGD27Qov2xcgHyf8-GXo,361
57
57
  langgraph_api/js/global.d.ts,sha256=j4GhgtQSZ5_cHzjSPcHgMJ8tfBThxrH-pUOrrJGteOU,196
58
- langgraph_api/js/package.json,sha256=9NJqixH8l_Vqvr2OeyhtXyuURFO1xcYabD8JOf315dQ,1335
58
+ langgraph_api/js/package.json,sha256=TLyPB9pZyZ1KQXC08NvbBbf8X5dKAF8WXc5cyjFtWZE,1335
59
59
  langgraph_api/js/remote.py,sha256=VmQ4Ie1V5z5gWEChXdY1m1kxzL3HE6AwKzfyIEfdE2k,38650
60
60
  langgraph_api/js/schema.py,sha256=M4fLtr50O1jck8H1hm_0W4cZOGYGdkrB7riLyCes4oY,438
61
61
  langgraph_api/js/sse.py,sha256=hHkbncnYnXNIbHhAWneGWYkHp4UhhhGB7-MYtDrY264,4141
62
62
  langgraph_api/js/traceblock.mts,sha256=QtGSN5VpzmGqDfbArrGXkMiONY94pMQ5CgzetT_bKYg,761
63
63
  langgraph_api/js/tsconfig.json,sha256=imCYqVnqFpaBoZPx8k1nO4slHIWBFsSlmCYhO73cpBs,341
64
64
  langgraph_api/js/ui.py,sha256=l9regrvKIxLOjH5SIYE2nhr8QCKLK1Q_1pZgxdL71X4,2488
65
- langgraph_api/js/yarn.lock,sha256=_aWrwb3UoBi5YXB0spkJjkQbGQfsofMk8ngxemN8ajw,84341
65
+ langgraph_api/js/yarn.lock,sha256=FCizZGxfI4SVoeAZWbezvonYBXsuvlWMUHX-1yACFz8,84352
66
66
  langgraph_api/js/src/graph.mts,sha256=9zTQNdtanI_CFnOwNRoamoCVHHQHGbNlbm91aRxDeOc,2675
67
67
  langgraph_api/js/src/load.hooks.mjs,sha256=xNVHq75W0Lk6MUKl1pQYrx-wtQ8_neiUyI6SO-k0ecM,2235
68
68
  langgraph_api/js/src/preload.mjs,sha256=8m3bYkf9iZLCQzKAYAdU8snxUwAG3dVLwGvAjfGfgIc,959
@@ -98,8 +98,8 @@ langgraph_runtime/store.py,sha256=7mowndlsIroGHv3NpTSOZDJR0lCuaYMBoTnTrewjslw,11
98
98
  LICENSE,sha256=ZPwVR73Biwm3sK6vR54djCrhaRiM4cAD2zvOQZV8Xis,3859
99
99
  logging.json,sha256=3RNjSADZmDq38eHePMm1CbP6qZ71AmpBtLwCmKU9Zgo,379
100
100
  openapi.json,sha256=21wu-NxdxyTQwZctNcEfRkLMnSBi0QhGAfwq5kg8XNU,172618
101
- langgraph_api-0.4.19.dist-info/METADATA,sha256=NCI4WlUX63Gkf7KaXGZS_jOSleda6KtrbrKPemAr0Yg,3893
102
- langgraph_api-0.4.19.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
103
- langgraph_api-0.4.19.dist-info/entry_points.txt,sha256=hGedv8n7cgi41PypMfinwS_HfCwA7xJIfS0jAp8htV8,78
104
- langgraph_api-0.4.19.dist-info/licenses/LICENSE,sha256=ZPwVR73Biwm3sK6vR54djCrhaRiM4cAD2zvOQZV8Xis,3859
105
- langgraph_api-0.4.19.dist-info/RECORD,,
101
+ langgraph_api-0.4.21.dist-info/METADATA,sha256=u0MQ-7iSelB0Sytf4gzdD7n_V94Sefh_NVRzz1znYCg,3893
102
+ langgraph_api-0.4.21.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
103
+ langgraph_api-0.4.21.dist-info/entry_points.txt,sha256=hGedv8n7cgi41PypMfinwS_HfCwA7xJIfS0jAp8htV8,78
104
+ langgraph_api-0.4.21.dist-info/licenses/LICENSE,sha256=ZPwVR73Biwm3sK6vR54djCrhaRiM4cAD2zvOQZV8Xis,3859
105
+ langgraph_api-0.4.21.dist-info/RECORD,,