langgraph-api 0.2.96__tar.gz → 0.2.98__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 (113) hide show
  1. {langgraph_api-0.2.96 → langgraph_api-0.2.98}/PKG-INFO +1 -1
  2. langgraph_api-0.2.98/langgraph_api/__init__.py +1 -0
  3. {langgraph_api-0.2.96 → langgraph_api-0.2.98}/langgraph_api/api/threads.py +9 -5
  4. {langgraph_api-0.2.96 → langgraph_api-0.2.98}/langgraph_api/asyncio.py +7 -0
  5. {langgraph_api-0.2.96 → langgraph_api-0.2.98}/langgraph_api/logging.py +21 -1
  6. {langgraph_api-0.2.96 → langgraph_api-0.2.98}/langgraph_api/state.py +21 -2
  7. langgraph_api-0.2.96/langgraph_api/__init__.py +0 -1
  8. {langgraph_api-0.2.96 → langgraph_api-0.2.98}/.gitignore +0 -0
  9. {langgraph_api-0.2.96 → langgraph_api-0.2.98}/LICENSE +0 -0
  10. {langgraph_api-0.2.96 → langgraph_api-0.2.98}/Makefile +0 -0
  11. {langgraph_api-0.2.96 → langgraph_api-0.2.98}/README.md +0 -0
  12. {langgraph_api-0.2.96 → langgraph_api-0.2.98}/benchmark/.gitignore +0 -0
  13. {langgraph_api-0.2.96 → langgraph_api-0.2.98}/benchmark/Makefile +0 -0
  14. {langgraph_api-0.2.96 → langgraph_api-0.2.98}/benchmark/README.md +0 -0
  15. {langgraph_api-0.2.96 → langgraph_api-0.2.98}/benchmark/burst.js +0 -0
  16. {langgraph_api-0.2.96 → langgraph_api-0.2.98}/benchmark/ramp.js +0 -0
  17. {langgraph_api-0.2.96 → langgraph_api-0.2.98}/benchmark/weather.js +0 -0
  18. {langgraph_api-0.2.96 → langgraph_api-0.2.98}/constraints.txt +0 -0
  19. {langgraph_api-0.2.96 → langgraph_api-0.2.98}/forbidden.txt +0 -0
  20. {langgraph_api-0.2.96 → langgraph_api-0.2.98}/healthcheck.py +0 -0
  21. {langgraph_api-0.2.96 → langgraph_api-0.2.98}/langgraph_api/api/__init__.py +0 -0
  22. {langgraph_api-0.2.96 → langgraph_api-0.2.98}/langgraph_api/api/assistants.py +0 -0
  23. {langgraph_api-0.2.96 → langgraph_api-0.2.98}/langgraph_api/api/mcp.py +0 -0
  24. {langgraph_api-0.2.96 → langgraph_api-0.2.98}/langgraph_api/api/meta.py +0 -0
  25. {langgraph_api-0.2.96 → langgraph_api-0.2.98}/langgraph_api/api/openapi.py +0 -0
  26. {langgraph_api-0.2.96 → langgraph_api-0.2.98}/langgraph_api/api/runs.py +0 -0
  27. {langgraph_api-0.2.96 → langgraph_api-0.2.98}/langgraph_api/api/store.py +0 -0
  28. {langgraph_api-0.2.96 → langgraph_api-0.2.98}/langgraph_api/api/ui.py +0 -0
  29. {langgraph_api-0.2.96 → langgraph_api-0.2.98}/langgraph_api/asgi_transport.py +0 -0
  30. {langgraph_api-0.2.96 → langgraph_api-0.2.98}/langgraph_api/auth/__init__.py +0 -0
  31. {langgraph_api-0.2.96 → langgraph_api-0.2.98}/langgraph_api/auth/custom.py +0 -0
  32. {langgraph_api-0.2.96 → langgraph_api-0.2.98}/langgraph_api/auth/langsmith/__init__.py +0 -0
  33. {langgraph_api-0.2.96 → langgraph_api-0.2.98}/langgraph_api/auth/langsmith/backend.py +0 -0
  34. {langgraph_api-0.2.96 → langgraph_api-0.2.98}/langgraph_api/auth/langsmith/client.py +0 -0
  35. {langgraph_api-0.2.96 → langgraph_api-0.2.98}/langgraph_api/auth/middleware.py +0 -0
  36. {langgraph_api-0.2.96 → langgraph_api-0.2.98}/langgraph_api/auth/noop.py +0 -0
  37. {langgraph_api-0.2.96 → langgraph_api-0.2.98}/langgraph_api/auth/studio_user.py +0 -0
  38. {langgraph_api-0.2.96 → langgraph_api-0.2.98}/langgraph_api/cli.py +0 -0
  39. {langgraph_api-0.2.96 → langgraph_api-0.2.98}/langgraph_api/command.py +0 -0
  40. {langgraph_api-0.2.96 → langgraph_api-0.2.98}/langgraph_api/config.py +0 -0
  41. {langgraph_api-0.2.96 → langgraph_api-0.2.98}/langgraph_api/cron_scheduler.py +0 -0
  42. {langgraph_api-0.2.96 → langgraph_api-0.2.98}/langgraph_api/errors.py +0 -0
  43. {langgraph_api-0.2.96 → langgraph_api-0.2.98}/langgraph_api/feature_flags.py +0 -0
  44. {langgraph_api-0.2.96 → langgraph_api-0.2.98}/langgraph_api/graph.py +0 -0
  45. {langgraph_api-0.2.96 → langgraph_api-0.2.98}/langgraph_api/http.py +0 -0
  46. {langgraph_api-0.2.96 → langgraph_api-0.2.98}/langgraph_api/http_metrics.py +0 -0
  47. {langgraph_api-0.2.96 → langgraph_api-0.2.98}/langgraph_api/js/.gitignore +0 -0
  48. {langgraph_api-0.2.96 → langgraph_api-0.2.98}/langgraph_api/js/.prettierrc +0 -0
  49. {langgraph_api-0.2.96 → langgraph_api-0.2.98}/langgraph_api/js/__init__.py +0 -0
  50. {langgraph_api-0.2.96 → langgraph_api-0.2.98}/langgraph_api/js/base.py +0 -0
  51. {langgraph_api-0.2.96 → langgraph_api-0.2.98}/langgraph_api/js/build.mts +0 -0
  52. {langgraph_api-0.2.96 → langgraph_api-0.2.98}/langgraph_api/js/client.http.mts +0 -0
  53. {langgraph_api-0.2.96 → langgraph_api-0.2.98}/langgraph_api/js/client.mts +0 -0
  54. {langgraph_api-0.2.96 → langgraph_api-0.2.98}/langgraph_api/js/errors.py +0 -0
  55. {langgraph_api-0.2.96 → langgraph_api-0.2.98}/langgraph_api/js/global.d.ts +0 -0
  56. {langgraph_api-0.2.96 → langgraph_api-0.2.98}/langgraph_api/js/package.json +0 -0
  57. {langgraph_api-0.2.96 → langgraph_api-0.2.98}/langgraph_api/js/remote.py +0 -0
  58. {langgraph_api-0.2.96 → langgraph_api-0.2.98}/langgraph_api/js/schema.py +0 -0
  59. {langgraph_api-0.2.96 → langgraph_api-0.2.98}/langgraph_api/js/src/graph.mts +0 -0
  60. {langgraph_api-0.2.96 → langgraph_api-0.2.98}/langgraph_api/js/src/load.hooks.mjs +0 -0
  61. {langgraph_api-0.2.96 → langgraph_api-0.2.98}/langgraph_api/js/src/preload.mjs +0 -0
  62. {langgraph_api-0.2.96 → langgraph_api-0.2.98}/langgraph_api/js/src/utils/files.mts +0 -0
  63. {langgraph_api-0.2.96 → langgraph_api-0.2.98}/langgraph_api/js/src/utils/importMap.mts +0 -0
  64. {langgraph_api-0.2.96 → langgraph_api-0.2.98}/langgraph_api/js/src/utils/pythonSchemas.mts +0 -0
  65. {langgraph_api-0.2.96 → langgraph_api-0.2.98}/langgraph_api/js/src/utils/serde.mts +0 -0
  66. {langgraph_api-0.2.96 → langgraph_api-0.2.98}/langgraph_api/js/sse.py +0 -0
  67. {langgraph_api-0.2.96 → langgraph_api-0.2.98}/langgraph_api/js/traceblock.mts +0 -0
  68. {langgraph_api-0.2.96 → langgraph_api-0.2.98}/langgraph_api/js/tsconfig.json +0 -0
  69. {langgraph_api-0.2.96 → langgraph_api-0.2.98}/langgraph_api/js/ui.py +0 -0
  70. {langgraph_api-0.2.96 → langgraph_api-0.2.98}/langgraph_api/js/yarn.lock +0 -0
  71. {langgraph_api-0.2.96 → langgraph_api-0.2.98}/langgraph_api/metadata.py +0 -0
  72. {langgraph_api-0.2.96 → langgraph_api-0.2.98}/langgraph_api/middleware/__init__.py +0 -0
  73. {langgraph_api-0.2.96 → langgraph_api-0.2.98}/langgraph_api/middleware/http_logger.py +0 -0
  74. {langgraph_api-0.2.96 → langgraph_api-0.2.98}/langgraph_api/middleware/private_network.py +0 -0
  75. {langgraph_api-0.2.96 → langgraph_api-0.2.98}/langgraph_api/middleware/request_id.py +0 -0
  76. {langgraph_api-0.2.96 → langgraph_api-0.2.98}/langgraph_api/models/__init__.py +0 -0
  77. {langgraph_api-0.2.96 → langgraph_api-0.2.98}/langgraph_api/models/run.py +0 -0
  78. {langgraph_api-0.2.96 → langgraph_api-0.2.98}/langgraph_api/patch.py +0 -0
  79. {langgraph_api-0.2.96 → langgraph_api-0.2.98}/langgraph_api/queue_entrypoint.py +0 -0
  80. {langgraph_api-0.2.96 → langgraph_api-0.2.98}/langgraph_api/route.py +0 -0
  81. {langgraph_api-0.2.96 → langgraph_api-0.2.98}/langgraph_api/schema.py +0 -0
  82. {langgraph_api-0.2.96 → langgraph_api-0.2.98}/langgraph_api/serde.py +0 -0
  83. {langgraph_api-0.2.96 → langgraph_api-0.2.98}/langgraph_api/server.py +0 -0
  84. {langgraph_api-0.2.96 → langgraph_api-0.2.98}/langgraph_api/sse.py +0 -0
  85. {langgraph_api-0.2.96 → langgraph_api-0.2.98}/langgraph_api/store.py +0 -0
  86. {langgraph_api-0.2.96 → langgraph_api-0.2.98}/langgraph_api/stream.py +0 -0
  87. {langgraph_api-0.2.96 → langgraph_api-0.2.98}/langgraph_api/thread_ttl.py +0 -0
  88. {langgraph_api-0.2.96 → langgraph_api-0.2.98}/langgraph_api/traceblock.py +0 -0
  89. {langgraph_api-0.2.96 → langgraph_api-0.2.98}/langgraph_api/tunneling/cloudflare.py +0 -0
  90. {langgraph_api-0.2.96 → langgraph_api-0.2.98}/langgraph_api/utils/__init__.py +0 -0
  91. {langgraph_api-0.2.96 → langgraph_api-0.2.98}/langgraph_api/utils/cache.py +0 -0
  92. {langgraph_api-0.2.96 → langgraph_api-0.2.98}/langgraph_api/utils/config.py +0 -0
  93. {langgraph_api-0.2.96 → langgraph_api-0.2.98}/langgraph_api/utils/future.py +0 -0
  94. {langgraph_api-0.2.96 → langgraph_api-0.2.98}/langgraph_api/utils.py +0 -0
  95. {langgraph_api-0.2.96 → langgraph_api-0.2.98}/langgraph_api/validation.py +0 -0
  96. {langgraph_api-0.2.96 → langgraph_api-0.2.98}/langgraph_api/webhook.py +0 -0
  97. {langgraph_api-0.2.96 → langgraph_api-0.2.98}/langgraph_api/worker.py +0 -0
  98. {langgraph_api-0.2.96 → langgraph_api-0.2.98}/langgraph_license/__init__.py +0 -0
  99. {langgraph_api-0.2.96 → langgraph_api-0.2.98}/langgraph_license/validation.py +0 -0
  100. {langgraph_api-0.2.96 → langgraph_api-0.2.98}/langgraph_runtime/__init__.py +0 -0
  101. {langgraph_api-0.2.96 → langgraph_api-0.2.98}/langgraph_runtime/checkpoint.py +0 -0
  102. {langgraph_api-0.2.96 → langgraph_api-0.2.98}/langgraph_runtime/database.py +0 -0
  103. {langgraph_api-0.2.96 → langgraph_api-0.2.98}/langgraph_runtime/lifespan.py +0 -0
  104. {langgraph_api-0.2.96 → langgraph_api-0.2.98}/langgraph_runtime/metrics.py +0 -0
  105. {langgraph_api-0.2.96 → langgraph_api-0.2.98}/langgraph_runtime/ops.py +0 -0
  106. {langgraph_api-0.2.96 → langgraph_api-0.2.98}/langgraph_runtime/queue.py +0 -0
  107. {langgraph_api-0.2.96 → langgraph_api-0.2.98}/langgraph_runtime/retry.py +0 -0
  108. {langgraph_api-0.2.96 → langgraph_api-0.2.98}/langgraph_runtime/store.py +0 -0
  109. {langgraph_api-0.2.96 → langgraph_api-0.2.98}/logging.json +0 -0
  110. {langgraph_api-0.2.96 → langgraph_api-0.2.98}/openapi.json +0 -0
  111. {langgraph_api-0.2.96 → langgraph_api-0.2.98}/pyproject.toml +0 -0
  112. {langgraph_api-0.2.96 → langgraph_api-0.2.98}/scripts/create_license.py +0 -0
  113. {langgraph_api-0.2.96 → langgraph_api-0.2.98}/uv.lock +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: langgraph-api
3
- Version: 0.2.96
3
+ Version: 0.2.98
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.98"
@@ -39,11 +39,15 @@ async def create_thread(
39
39
  )
40
40
 
41
41
  if supersteps := payload.get("supersteps"):
42
- await Threads.State.bulk(
43
- conn,
44
- config={"configurable": {"thread_id": thread_id}},
45
- supersteps=supersteps,
46
- )
42
+ try:
43
+ await Threads.State.bulk(
44
+ conn,
45
+ config={"configurable": {"thread_id": thread_id}},
46
+ supersteps=supersteps,
47
+ )
48
+ except HTTPException as e:
49
+ detail = f"Thread {thread_id} was created, but there were problems updating the state: {e.detail}"
50
+ raise HTTPException(status_code=201, detail=detail) from e
47
51
 
48
52
  return ApiResponse(await fetchone(iter, not_found_code=409))
49
53
 
@@ -141,6 +141,13 @@ def call_soon_in_main_loop(coro: Coroutine[Any, Any, T]) -> asyncio.Future[T]:
141
141
  return this_loop_fut
142
142
 
143
143
 
144
+ def call_soon_threadsafe(callback, *args) -> asyncio.Handle:
145
+ """Run a coroutine in the main event loop."""
146
+ if _MAIN_LOOP is None:
147
+ raise RuntimeError("No event loop set")
148
+ return _MAIN_LOOP.call_soon_threadsafe(callback, *args)
149
+
150
+
144
151
  class SimpleTaskGroup(AbstractAsyncContextManager["SimpleTaskGroup"]):
145
152
  """An async task group that can be configured to wait and/or cancel tasks on exit.
146
153
 
@@ -68,11 +68,31 @@ class AddApiVersion:
68
68
 
69
69
 
70
70
  class AddLoggingContext:
71
+ def __init__(self):
72
+ try:
73
+ from langchain_core.runnables.config import (
74
+ RunnableConfig,
75
+ var_child_runnable_config,
76
+ )
77
+
78
+ self.cvar: contextvars.ContextVar[RunnableConfig | None] = (
79
+ var_child_runnable_config
80
+ )
81
+ except Exception:
82
+ self.cvar = False
83
+
71
84
  def __call__(
72
85
  self, logger: logging.Logger, method_name: str, event_dict: EventDict
73
86
  ) -> EventDict:
74
87
  if (ctx := worker_config.get()) is not None:
75
88
  event_dict.update(ctx)
89
+ if (
90
+ self.cvar is not None
91
+ and (conf := self.cvar.get())
92
+ and (metadata := conf.get("metadata"))
93
+ and (lgnode := metadata.get("langgraph_node"))
94
+ ):
95
+ event_dict["langgraph_node"] = lgnode
76
96
  return event_dict
77
97
 
78
98
 
@@ -128,6 +148,7 @@ class Formatter(structlog.stdlib.ProcessorFormatter):
128
148
  super().__init__(
129
149
  processors=[
130
150
  structlog.stdlib.ProcessorFormatter.remove_processors_meta,
151
+ AddLoggingContext(),
131
152
  renderer,
132
153
  ],
133
154
  foreign_pre_chain=shared_processors,
@@ -136,7 +157,6 @@ class Formatter(structlog.stdlib.ProcessorFormatter):
136
157
 
137
158
 
138
159
  # configure structlog
139
-
140
160
  if not structlog.is_configured():
141
161
  structlog.configure(
142
162
  processors=[
@@ -2,7 +2,7 @@ from __future__ import annotations
2
2
 
3
3
  import typing
4
4
 
5
- from langgraph.types import StateSnapshot
5
+ from langgraph.types import Interrupt, StateSnapshot
6
6
 
7
7
  from langgraph_api.schema import Checkpoint, ThreadState
8
8
 
@@ -38,6 +38,23 @@ def runnable_config_to_checkpoint(
38
38
  return checkpoint
39
39
 
40
40
 
41
+ def state_interrupt_to_thread_interrupt(interrupt: Interrupt | dict) -> dict:
42
+ # Sometimes the interrupt received in StateSnapshot is a dict.
43
+ # Let's convert it toan Interrupt object to gain access to dynamic `interrupt_id`.
44
+ if isinstance(interrupt, dict):
45
+ interrupt = Interrupt(**interrupt)
46
+
47
+ return {
48
+ "interrupt_id": interrupt.interrupt_id
49
+ if hasattr(interrupt, "interrupt_id")
50
+ else None,
51
+ "value": interrupt.value,
52
+ "resumable": interrupt.resumable,
53
+ "ns": interrupt.ns,
54
+ "when": interrupt.when,
55
+ }
56
+
57
+
41
58
  def state_snapshot_to_thread_state(state: StateSnapshot) -> ThreadState:
42
59
  return {
43
60
  "values": state.values,
@@ -48,7 +65,9 @@ def state_snapshot_to_thread_state(state: StateSnapshot) -> ThreadState:
48
65
  "name": t.name,
49
66
  "path": t.path,
50
67
  "error": t.error,
51
- "interrupts": t.interrupts,
68
+ "interrupts": [
69
+ state_interrupt_to_thread_interrupt(i) for i in t.interrupts
70
+ ],
52
71
  "checkpoint": t.state["configurable"]
53
72
  if t.state is not None and not isinstance(t.state, StateSnapshot)
54
73
  else None,
@@ -1 +0,0 @@
1
- __version__ = "0.2.96"
File without changes
File without changes
File without changes
File without changes