langgraph-api 0.2.126__tar.gz → 0.2.128__tar.gz

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.

Files changed (114) hide show
  1. {langgraph_api-0.2.126 → langgraph_api-0.2.128}/Makefile +3 -3
  2. {langgraph_api-0.2.126 → langgraph_api-0.2.128}/PKG-INFO +1 -1
  3. langgraph_api-0.2.128/langgraph_api/__init__.py +1 -0
  4. {langgraph_api-0.2.126 → langgraph_api-0.2.128}/langgraph_api/models/run.py +13 -0
  5. {langgraph_api-0.2.126 → langgraph_api-0.2.128}/langgraph_api/stream.py +12 -3
  6. {langgraph_api-0.2.126 → langgraph_api-0.2.128}/langgraph_api/worker.py +10 -4
  7. langgraph_api-0.2.126/langgraph_api/__init__.py +0 -1
  8. {langgraph_api-0.2.126 → langgraph_api-0.2.128}/.gitignore +0 -0
  9. {langgraph_api-0.2.126 → langgraph_api-0.2.128}/LICENSE +0 -0
  10. {langgraph_api-0.2.126 → langgraph_api-0.2.128}/README.md +0 -0
  11. {langgraph_api-0.2.126 → langgraph_api-0.2.128}/benchmark/.gitignore +0 -0
  12. {langgraph_api-0.2.126 → langgraph_api-0.2.128}/benchmark/Makefile +0 -0
  13. {langgraph_api-0.2.126 → langgraph_api-0.2.128}/benchmark/README.md +0 -0
  14. {langgraph_api-0.2.126 → langgraph_api-0.2.128}/benchmark/burst.js +0 -0
  15. {langgraph_api-0.2.126 → langgraph_api-0.2.128}/benchmark/ramp.js +0 -0
  16. {langgraph_api-0.2.126 → langgraph_api-0.2.128}/benchmark/weather.js +0 -0
  17. {langgraph_api-0.2.126 → langgraph_api-0.2.128}/constraints.txt +0 -0
  18. {langgraph_api-0.2.126 → langgraph_api-0.2.128}/forbidden.txt +0 -0
  19. {langgraph_api-0.2.126 → langgraph_api-0.2.128}/healthcheck.py +0 -0
  20. {langgraph_api-0.2.126 → langgraph_api-0.2.128}/langgraph_api/api/__init__.py +0 -0
  21. {langgraph_api-0.2.126 → langgraph_api-0.2.128}/langgraph_api/api/assistants.py +0 -0
  22. {langgraph_api-0.2.126 → langgraph_api-0.2.128}/langgraph_api/api/mcp.py +0 -0
  23. {langgraph_api-0.2.126 → langgraph_api-0.2.128}/langgraph_api/api/meta.py +0 -0
  24. {langgraph_api-0.2.126 → langgraph_api-0.2.128}/langgraph_api/api/openapi.py +0 -0
  25. {langgraph_api-0.2.126 → langgraph_api-0.2.128}/langgraph_api/api/runs.py +0 -0
  26. {langgraph_api-0.2.126 → langgraph_api-0.2.128}/langgraph_api/api/store.py +0 -0
  27. {langgraph_api-0.2.126 → langgraph_api-0.2.128}/langgraph_api/api/threads.py +0 -0
  28. {langgraph_api-0.2.126 → langgraph_api-0.2.128}/langgraph_api/api/ui.py +0 -0
  29. {langgraph_api-0.2.126 → langgraph_api-0.2.128}/langgraph_api/asgi_transport.py +0 -0
  30. {langgraph_api-0.2.126 → langgraph_api-0.2.128}/langgraph_api/asyncio.py +0 -0
  31. {langgraph_api-0.2.126 → langgraph_api-0.2.128}/langgraph_api/auth/__init__.py +0 -0
  32. {langgraph_api-0.2.126 → langgraph_api-0.2.128}/langgraph_api/auth/custom.py +0 -0
  33. {langgraph_api-0.2.126 → langgraph_api-0.2.128}/langgraph_api/auth/langsmith/__init__.py +0 -0
  34. {langgraph_api-0.2.126 → langgraph_api-0.2.128}/langgraph_api/auth/langsmith/backend.py +0 -0
  35. {langgraph_api-0.2.126 → langgraph_api-0.2.128}/langgraph_api/auth/langsmith/client.py +0 -0
  36. {langgraph_api-0.2.126 → langgraph_api-0.2.128}/langgraph_api/auth/middleware.py +0 -0
  37. {langgraph_api-0.2.126 → langgraph_api-0.2.128}/langgraph_api/auth/noop.py +0 -0
  38. {langgraph_api-0.2.126 → langgraph_api-0.2.128}/langgraph_api/auth/studio_user.py +0 -0
  39. {langgraph_api-0.2.126 → langgraph_api-0.2.128}/langgraph_api/cli.py +0 -0
  40. {langgraph_api-0.2.126 → langgraph_api-0.2.128}/langgraph_api/command.py +0 -0
  41. {langgraph_api-0.2.126 → langgraph_api-0.2.128}/langgraph_api/config.py +0 -0
  42. {langgraph_api-0.2.126 → langgraph_api-0.2.128}/langgraph_api/cron_scheduler.py +0 -0
  43. {langgraph_api-0.2.126 → langgraph_api-0.2.128}/langgraph_api/errors.py +0 -0
  44. {langgraph_api-0.2.126 → langgraph_api-0.2.128}/langgraph_api/feature_flags.py +0 -0
  45. {langgraph_api-0.2.126 → langgraph_api-0.2.128}/langgraph_api/graph.py +0 -0
  46. {langgraph_api-0.2.126 → langgraph_api-0.2.128}/langgraph_api/http.py +0 -0
  47. {langgraph_api-0.2.126 → langgraph_api-0.2.128}/langgraph_api/http_metrics.py +0 -0
  48. {langgraph_api-0.2.126 → langgraph_api-0.2.128}/langgraph_api/js/.gitignore +0 -0
  49. {langgraph_api-0.2.126 → langgraph_api-0.2.128}/langgraph_api/js/.prettierrc +0 -0
  50. {langgraph_api-0.2.126 → langgraph_api-0.2.128}/langgraph_api/js/__init__.py +0 -0
  51. {langgraph_api-0.2.126 → langgraph_api-0.2.128}/langgraph_api/js/base.py +0 -0
  52. {langgraph_api-0.2.126 → langgraph_api-0.2.128}/langgraph_api/js/build.mts +0 -0
  53. {langgraph_api-0.2.126 → langgraph_api-0.2.128}/langgraph_api/js/client.http.mts +0 -0
  54. {langgraph_api-0.2.126 → langgraph_api-0.2.128}/langgraph_api/js/client.mts +0 -0
  55. {langgraph_api-0.2.126 → langgraph_api-0.2.128}/langgraph_api/js/errors.py +0 -0
  56. {langgraph_api-0.2.126 → langgraph_api-0.2.128}/langgraph_api/js/global.d.ts +0 -0
  57. {langgraph_api-0.2.126 → langgraph_api-0.2.128}/langgraph_api/js/package.json +0 -0
  58. {langgraph_api-0.2.126 → langgraph_api-0.2.128}/langgraph_api/js/remote.py +0 -0
  59. {langgraph_api-0.2.126 → langgraph_api-0.2.128}/langgraph_api/js/schema.py +0 -0
  60. {langgraph_api-0.2.126 → langgraph_api-0.2.128}/langgraph_api/js/src/graph.mts +0 -0
  61. {langgraph_api-0.2.126 → langgraph_api-0.2.128}/langgraph_api/js/src/load.hooks.mjs +0 -0
  62. {langgraph_api-0.2.126 → langgraph_api-0.2.128}/langgraph_api/js/src/preload.mjs +0 -0
  63. {langgraph_api-0.2.126 → langgraph_api-0.2.128}/langgraph_api/js/src/utils/files.mts +0 -0
  64. {langgraph_api-0.2.126 → langgraph_api-0.2.128}/langgraph_api/js/src/utils/importMap.mts +0 -0
  65. {langgraph_api-0.2.126 → langgraph_api-0.2.128}/langgraph_api/js/src/utils/pythonSchemas.mts +0 -0
  66. {langgraph_api-0.2.126 → langgraph_api-0.2.128}/langgraph_api/js/src/utils/serde.mts +0 -0
  67. {langgraph_api-0.2.126 → langgraph_api-0.2.128}/langgraph_api/js/sse.py +0 -0
  68. {langgraph_api-0.2.126 → langgraph_api-0.2.128}/langgraph_api/js/traceblock.mts +0 -0
  69. {langgraph_api-0.2.126 → langgraph_api-0.2.128}/langgraph_api/js/tsconfig.json +0 -0
  70. {langgraph_api-0.2.126 → langgraph_api-0.2.128}/langgraph_api/js/ui.py +0 -0
  71. {langgraph_api-0.2.126 → langgraph_api-0.2.128}/langgraph_api/js/yarn.lock +0 -0
  72. {langgraph_api-0.2.126 → langgraph_api-0.2.128}/langgraph_api/logging.py +0 -0
  73. {langgraph_api-0.2.126 → langgraph_api-0.2.128}/langgraph_api/metadata.py +0 -0
  74. {langgraph_api-0.2.126 → langgraph_api-0.2.128}/langgraph_api/middleware/__init__.py +0 -0
  75. {langgraph_api-0.2.126 → langgraph_api-0.2.128}/langgraph_api/middleware/http_logger.py +0 -0
  76. {langgraph_api-0.2.126 → langgraph_api-0.2.128}/langgraph_api/middleware/private_network.py +0 -0
  77. {langgraph_api-0.2.126 → langgraph_api-0.2.128}/langgraph_api/middleware/request_id.py +0 -0
  78. {langgraph_api-0.2.126 → langgraph_api-0.2.128}/langgraph_api/models/__init__.py +0 -0
  79. {langgraph_api-0.2.126 → langgraph_api-0.2.128}/langgraph_api/patch.py +0 -0
  80. {langgraph_api-0.2.126 → langgraph_api-0.2.128}/langgraph_api/queue_entrypoint.py +0 -0
  81. {langgraph_api-0.2.126 → langgraph_api-0.2.128}/langgraph_api/route.py +0 -0
  82. {langgraph_api-0.2.126 → langgraph_api-0.2.128}/langgraph_api/schema.py +0 -0
  83. {langgraph_api-0.2.126 → langgraph_api-0.2.128}/langgraph_api/serde.py +0 -0
  84. {langgraph_api-0.2.126 → langgraph_api-0.2.128}/langgraph_api/server.py +0 -0
  85. {langgraph_api-0.2.126 → langgraph_api-0.2.128}/langgraph_api/sse.py +0 -0
  86. {langgraph_api-0.2.126 → langgraph_api-0.2.128}/langgraph_api/state.py +0 -0
  87. {langgraph_api-0.2.126 → langgraph_api-0.2.128}/langgraph_api/store.py +0 -0
  88. {langgraph_api-0.2.126 → langgraph_api-0.2.128}/langgraph_api/thread_ttl.py +0 -0
  89. {langgraph_api-0.2.126 → langgraph_api-0.2.128}/langgraph_api/traceblock.py +0 -0
  90. {langgraph_api-0.2.126 → langgraph_api-0.2.128}/langgraph_api/tunneling/cloudflare.py +0 -0
  91. {langgraph_api-0.2.126 → langgraph_api-0.2.128}/langgraph_api/utils/__init__.py +0 -0
  92. {langgraph_api-0.2.126 → langgraph_api-0.2.128}/langgraph_api/utils/cache.py +0 -0
  93. {langgraph_api-0.2.126 → langgraph_api-0.2.128}/langgraph_api/utils/config.py +0 -0
  94. {langgraph_api-0.2.126 → langgraph_api-0.2.128}/langgraph_api/utils/future.py +0 -0
  95. {langgraph_api-0.2.126 → langgraph_api-0.2.128}/langgraph_api/utils/headers.py +0 -0
  96. {langgraph_api-0.2.126 → langgraph_api-0.2.128}/langgraph_api/utils.py +0 -0
  97. {langgraph_api-0.2.126 → langgraph_api-0.2.128}/langgraph_api/validation.py +0 -0
  98. {langgraph_api-0.2.126 → langgraph_api-0.2.128}/langgraph_api/webhook.py +0 -0
  99. {langgraph_api-0.2.126 → langgraph_api-0.2.128}/langgraph_license/__init__.py +0 -0
  100. {langgraph_api-0.2.126 → langgraph_api-0.2.128}/langgraph_license/validation.py +0 -0
  101. {langgraph_api-0.2.126 → langgraph_api-0.2.128}/langgraph_runtime/__init__.py +0 -0
  102. {langgraph_api-0.2.126 → langgraph_api-0.2.128}/langgraph_runtime/checkpoint.py +0 -0
  103. {langgraph_api-0.2.126 → langgraph_api-0.2.128}/langgraph_runtime/database.py +0 -0
  104. {langgraph_api-0.2.126 → langgraph_api-0.2.128}/langgraph_runtime/lifespan.py +0 -0
  105. {langgraph_api-0.2.126 → langgraph_api-0.2.128}/langgraph_runtime/metrics.py +0 -0
  106. {langgraph_api-0.2.126 → langgraph_api-0.2.128}/langgraph_runtime/ops.py +0 -0
  107. {langgraph_api-0.2.126 → langgraph_api-0.2.128}/langgraph_runtime/queue.py +0 -0
  108. {langgraph_api-0.2.126 → langgraph_api-0.2.128}/langgraph_runtime/retry.py +0 -0
  109. {langgraph_api-0.2.126 → langgraph_api-0.2.128}/langgraph_runtime/store.py +0 -0
  110. {langgraph_api-0.2.126 → langgraph_api-0.2.128}/logging.json +0 -0
  111. {langgraph_api-0.2.126 → langgraph_api-0.2.128}/openapi.json +0 -0
  112. {langgraph_api-0.2.126 → langgraph_api-0.2.128}/pyproject.toml +0 -0
  113. {langgraph_api-0.2.126 → langgraph_api-0.2.128}/scripts/create_license.py +0 -0
  114. {langgraph_api-0.2.126 → langgraph_api-0.2.128}/uv.lock +0 -0
@@ -54,7 +54,7 @@ start:
54
54
  LANGGRAPH_RUNTIME_EDITION=inmem \
55
55
  LANGGRAPH_AES_KEY='$(LANGGRAPH_AES_KEY)' \
56
56
  N_JOBS_PER_WORKER=2 \
57
- LANGSERVE_GRAPHS='{"agent": "./tests/graphs/agent.py:graph", "custom_lifespan": "./tests/graphs/my_router.py:graph", "single_node": "./tests/graphs/single_node.py:graph", "benchmark": "./tests/graphs/benchmark.py:graph", "other": "./tests/graphs/other.py:make_graph", "weather": "./tests/graphs/weather.py:mk_weather_graph", "searchy": "./tests/graphs/searchy.py:graph", "agent_simple": "./tests/graphs/agent_simple.py:graph", "simple_runtime": "./tests/graphs/simple_runtime.py:graph"}' \
57
+ LANGSERVE_GRAPHS='{"agent": "./tests/graphs/agent.py:graph", "custom_lifespan": "./tests/graphs/my_router.py:graph", "single_node": "./tests/graphs/single_node.py:graph", "benchmark": "./tests/graphs/benchmark.py:graph", "config_graph": "./tests/graphs/config_graph.py:graph", "other": "./tests/graphs/other.py:make_graph", "weather": "./tests/graphs/weather.py:mk_weather_graph", "searchy": "./tests/graphs/searchy.py:graph", "agent_simple": "./tests/graphs/agent_simple.py:graph", "simple_runtime": "./tests/graphs/simple_runtime.py:graph"}' \
58
58
  LANGGRAPH_STORE='$(STORE_CONFIG)' \
59
59
  LANGGRAPH_CONFIG='{"agent": {"configurable": {"model_name": "openai"}}}' \
60
60
  LANGSMITH_LANGGRAPH_API_VARIANT=test \
@@ -77,7 +77,7 @@ start-auth-jwt:
77
77
  LANGGRAPH_RUNTIME_EDITION=inmem LANGGRAPH_HTTP='$(HTTP_CONFIG)' \
78
78
  LANGGRAPH_AES_KEY='$(LANGGRAPH_AES_KEY)' \
79
79
  N_JOBS_PER_WORKER=2 \
80
- LANGSERVE_GRAPHS='{"agent": "./tests/graphs/agent.py:graph", "other": "./tests/graphs/other.py:make_graph", "weather": "./tests/graphs/weather.py:mk_weather_graph", "searchy": "./tests/graphs/searchy.py:graph", "agent_simple": "./tests/graphs/agent_simple.py:graph", "simple_runtime": "./tests/graphs/simple_runtime.py:graph"}' \
80
+ LANGSERVE_GRAPHS='{"agent": "./tests/graphs/agent.py:graph", "config_graph": "./tests/graphs/config_graph.py:graph", "other": "./tests/graphs/other.py:make_graph", "weather": "./tests/graphs/weather.py:mk_weather_graph", "searchy": "./tests/graphs/searchy.py:graph", "agent_simple": "./tests/graphs/agent_simple.py:graph", "simple_runtime": "./tests/graphs/simple_runtime.py:graph"}' \
81
81
  LANGGRAPH_STORE='$(STORE_CONFIG)' \
82
82
  LANGGRAPH_AUTH='{"path": "tests/graphs/jwt_auth.py:auth"}' \
83
83
  LANGSMITH_LANGGRAPH_API_VARIANT=test \
@@ -95,7 +95,7 @@ start-auth-jwt:
95
95
  start-auth-fastapi-jwt:
96
96
  LANGGRAPH_RUNTIME_EDITION=inmem LANGGRAPH_HTTP='$(HTTP_CONFIG)' \
97
97
  N_JOBS_PER_WORKER=2 \
98
- LANGSERVE_GRAPHS='{"agent": "./tests/graphs/agent.py:graph", "other": "./tests/graphs/other.py:make_graph", "weather": "./tests/graphs/weather.py:mk_weather_graph", "searchy": "./tests/graphs/searchy.py:graph", "agent_simple": "./tests/graphs/agent_simple.py:graph", "simple_runtime": "./tests/graphs/simple_runtime.py:graph"}' \
98
+ LANGSERVE_GRAPHS='{"agent": "./tests/graphs/agent.py:graph", "config_graph": "./tests/graphs/config_graph.py:graph", "other": "./tests/graphs/other.py:make_graph", "weather": "./tests/graphs/weather.py:mk_weather_graph", "searchy": "./tests/graphs/searchy.py:graph", "agent_simple": "./tests/graphs/agent_simple.py:graph", "simple_runtime": "./tests/graphs/simple_runtime.py:graph"}' \
99
99
  LANGGRAPH_STORE='$(STORE_CONFIG)' \
100
100
  LANGGRAPH_AUTH='{"path": "./tests/graphs/fastapi_jwt_auth.py:auth"}' \
101
101
  LANGSMITH_LANGGRAPH_API_VARIANT=test \
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: langgraph-api
3
- Version: 0.2.126
3
+ Version: 0.2.128
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
@@ -0,0 +1 @@
1
+ __version__ = "0.2.128"
@@ -275,6 +275,13 @@ async def create_valid_run(
275
275
  config = payload.get("config") or {}
276
276
  context = payload.get("context") or {}
277
277
  configurable = config.setdefault("configurable", {})
278
+
279
+ if configurable and context:
280
+ raise HTTPException(
281
+ status_code=400,
282
+ detail="Cannot specify both configurable and context. Prefer setting context alone. Context was introduced in LangGraph 0.6.0 and is the long term planned replacement for configurable.",
283
+ )
284
+
278
285
  if checkpoint_id:
279
286
  configurable["checkpoint_id"] = str(checkpoint_id)
280
287
  if checkpoint := payload.get("checkpoint"):
@@ -300,6 +307,12 @@ async def create_valid_run(
300
307
  configurable["__after_seconds__"] = after_seconds
301
308
  put_time_start = time.time()
302
309
  if_not_exists = payload.get("if_not_exists", "reject")
310
+
311
+ # Keep config and context in sync
312
+ # Configurable is either A) just internal config or B) internal config + user config (and context is empty). Either way, configurable is the default.
313
+ context = {**context, **configurable}
314
+ config["configurable"] = context
315
+
303
316
  run_coro = Runs.put(
304
317
  conn,
305
318
  assistant_id,
@@ -348,7 +348,17 @@ async def astream_state(
348
348
  yield "feedback", feedback_urls
349
349
 
350
350
 
351
- async def consume(stream: AnyStream, run_id: str, resumable: bool = False) -> None:
351
+ async def consume(
352
+ stream: AnyStream,
353
+ run_id: str,
354
+ resumable: bool = False,
355
+ stream_modes: set[StreamMode] | None = None,
356
+ ) -> None:
357
+ stream_modes = stream_modes or set()
358
+ if "messages-tuple" in stream_modes:
359
+ stream_modes.add("messages")
360
+ stream_modes.add("metadata")
361
+
352
362
  async with aclosing(stream):
353
363
  try:
354
364
  async for mode, payload in stream:
@@ -356,7 +366,7 @@ async def consume(stream: AnyStream, run_id: str, resumable: bool = False) -> No
356
366
  run_id,
357
367
  mode,
358
368
  await run_in_executor(None, json_dumpb, payload),
359
- resumable=resumable,
369
+ resumable=resumable and mode.split("|")[0] in stream_modes,
360
370
  )
361
371
  except Exception as e:
362
372
  if isinstance(e, ExceptionGroup):
@@ -365,7 +375,6 @@ async def consume(stream: AnyStream, run_id: str, resumable: bool = False) -> No
365
375
  run_id,
366
376
  "error",
367
377
  await run_in_executor(None, json_dumpb, e),
368
- resumable=resumable,
369
378
  )
370
379
  raise e
371
380
 
@@ -20,7 +20,7 @@ from langgraph_api.config import (
20
20
  from langgraph_api.errors import UserInterrupt, UserRollback, UserTimeout
21
21
  from langgraph_api.js.errors import RemoteException
22
22
  from langgraph_api.metadata import incr_runs
23
- from langgraph_api.schema import Run
23
+ from langgraph_api.schema import Run, StreamMode
24
24
  from langgraph_api.state import state_snapshot_to_thread_state
25
25
  from langgraph_api.stream import AnyStream, astream_state, consume
26
26
  from langgraph_api.utils import with_user
@@ -54,6 +54,7 @@ async def set_auth_ctx_for_run(
54
54
  user = normalize_user(user)
55
55
  # Reapply normalization to the kwargs
56
56
  run_kwargs["config"]["configurable"]["langgraph_auth_user"] = user
57
+ run_kwargs["context"]["langgraph_auth_user"] = user
57
58
  except Exception:
58
59
  user = SimpleUser(user_id) if user_id is not None else None
59
60
  permissions = None
@@ -130,9 +131,11 @@ async def worker(
130
131
  break
131
132
 
132
133
  # Wrap the graph execution to separate user errors from server errors
133
- async def wrap_user_errors(stream: AnyStream, run_id: str, resumable: bool):
134
+ async def wrap_user_errors(
135
+ stream: AnyStream, run_id: str, resumable: bool, stream_modes: set[StreamMode]
136
+ ):
134
137
  try:
135
- await consume(stream, run_id, resumable)
138
+ await consume(stream, run_id, resumable, stream_modes)
136
139
  except Exception as e:
137
140
  if not isinstance(e, UserRollback | UserInterrupt):
138
141
  logger.error(
@@ -184,8 +187,11 @@ async def worker(
184
187
  on_checkpoint=on_checkpoint,
185
188
  on_task_result=on_task_result,
186
189
  )
190
+ stream_modes: set[StreamMode] = set(
191
+ run["kwargs"].get("stream_mode", [])
192
+ )
187
193
  await asyncio.wait_for(
188
- wrap_user_errors(stream, run_id, resumable),
194
+ wrap_user_errors(stream, run_id, resumable, stream_modes),
189
195
  BG_JOB_TIMEOUT_SECS,
190
196
  )
191
197
  except (Exception, asyncio.CancelledError) as ee:
@@ -1 +0,0 @@
1
- __version__ = "0.2.126"
File without changes
File without changes