langgraph-api 0.7.91__tar.gz → 0.7.94__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.
Files changed (292) hide show
  1. {langgraph_api-0.7.91 → langgraph_api-0.7.94}/PKG-INFO +1 -1
  2. langgraph_api-0.7.94/langgraph_api/__init__.py +1 -0
  3. {langgraph_api-0.7.91 → langgraph_api-0.7.94}/langgraph_api/_checkpointer/_adapter.py +3 -9
  4. {langgraph_api-0.7.91 → langgraph_api-0.7.94}/langgraph_api/asyncio.py +20 -1
  5. {langgraph_api-0.7.91 → langgraph_api-0.7.94}/langgraph_api/graph.py +100 -15
  6. {langgraph_api-0.7.91 → langgraph_api-0.7.94}/langgraph_api/js/remote.py +61 -6
  7. {langgraph_api-0.7.91 → langgraph_api-0.7.94}/langgraph_api/metrics_datadog.py +8 -0
  8. {langgraph_api-0.7.91 → langgraph_api-0.7.94}/langgraph_api/store.py +7 -7
  9. langgraph_api-0.7.91/langgraph_api/__init__.py +0 -1
  10. {langgraph_api-0.7.91 → langgraph_api-0.7.94}/.gitignore +0 -0
  11. {langgraph_api-0.7.91 → langgraph_api-0.7.94}/LICENSE +0 -0
  12. {langgraph_api-0.7.91 → langgraph_api-0.7.94}/Makefile +0 -0
  13. {langgraph_api-0.7.91 → langgraph_api-0.7.94}/README.md +0 -0
  14. {langgraph_api-0.7.91 → langgraph_api-0.7.94}/benchmark/.gitignore +0 -0
  15. {langgraph_api-0.7.91 → langgraph_api-0.7.94}/benchmark/Makefile +0 -0
  16. {langgraph_api-0.7.91 → langgraph_api-0.7.94}/benchmark/README.md +0 -0
  17. {langgraph_api-0.7.91 → langgraph_api-0.7.94}/benchmark/benchmark-runners/assistant.ts +0 -0
  18. {langgraph_api-0.7.91 → langgraph_api-0.7.94}/benchmark/benchmark-runners/benchmark-runner.ts +0 -0
  19. {langgraph_api-0.7.91 → langgraph_api-0.7.94}/benchmark/benchmark-runners/benchmarks.ts +0 -0
  20. {langgraph_api-0.7.91 → langgraph_api-0.7.94}/benchmark/benchmark-runners/cancel_first_second_completes.ts +0 -0
  21. {langgraph_api-0.7.91 → langgraph_api-0.7.94}/benchmark/benchmark-runners/enqueued_runs_order.ts +0 -0
  22. {langgraph_api-0.7.91 → langgraph_api-0.7.94}/benchmark/benchmark-runners/log-failure.ts +0 -0
  23. {langgraph_api-0.7.91 → langgraph_api-0.7.94}/benchmark/benchmark-runners/meta_workload.ts +0 -0
  24. {langgraph_api-0.7.91 → langgraph_api-0.7.94}/benchmark/benchmark-runners/random_stream.ts +0 -0
  25. {langgraph_api-0.7.91 → langgraph_api-0.7.94}/benchmark/benchmark-runners/stream_write.ts +0 -0
  26. {langgraph_api-0.7.91 → langgraph_api-0.7.94}/benchmark/benchmark-runners/thread.ts +0 -0
  27. {langgraph_api-0.7.91 → langgraph_api-0.7.94}/benchmark/benchmark-runners/thread_runs_metadata_search.ts +0 -0
  28. {langgraph_api-0.7.91 → langgraph_api-0.7.94}/benchmark/benchmark-runners/threads_search_metadata.ts +0 -0
  29. {langgraph_api-0.7.91 → langgraph_api-0.7.94}/benchmark/benchmark-runners/types.ts +0 -0
  30. {langgraph_api-0.7.91 → langgraph_api-0.7.94}/benchmark/benchmark-runners/wait_write.ts +0 -0
  31. {langgraph_api-0.7.91 → langgraph_api-0.7.94}/benchmark/capacity_dd_report.py +0 -0
  32. {langgraph_api-0.7.91 → langgraph_api-0.7.94}/benchmark/capacity_k6.js +0 -0
  33. {langgraph_api-0.7.91 → langgraph_api-0.7.94}/benchmark/capacity_runner.mjs +0 -0
  34. {langgraph_api-0.7.91 → langgraph_api-0.7.94}/benchmark/capacity_slack_report.py +0 -0
  35. {langgraph_api-0.7.91 → langgraph_api-0.7.94}/benchmark/capacity_urls.mjs +0 -0
  36. {langgraph_api-0.7.91 → langgraph_api-0.7.94}/benchmark/clean-cli.js +0 -0
  37. {langgraph_api-0.7.91 → langgraph_api-0.7.94}/benchmark/clean.js +0 -0
  38. {langgraph_api-0.7.91 → langgraph_api-0.7.94}/benchmark/continuous/README.md +0 -0
  39. {langgraph_api-0.7.91 → langgraph_api-0.7.94}/benchmark/continuous/pyproject.toml +0 -0
  40. {langgraph_api-0.7.91 → langgraph_api-0.7.94}/benchmark/continuous/runner.py +0 -0
  41. {langgraph_api-0.7.91 → langgraph_api-0.7.94}/benchmark/continuous/uv.lock +0 -0
  42. {langgraph_api-0.7.91 → langgraph_api-0.7.94}/benchmark/graphs.js +0 -0
  43. {langgraph_api-0.7.91 → langgraph_api-0.7.94}/benchmark/mixed_workload_k6.js +0 -0
  44. {langgraph_api-0.7.91 → langgraph_api-0.7.94}/benchmark/mixed_workload_runner.mjs +0 -0
  45. {langgraph_api-0.7.91 → langgraph_api-0.7.94}/benchmark/package.json +0 -0
  46. {langgraph_api-0.7.91 → langgraph_api-0.7.94}/benchmark/ramp.js +0 -0
  47. {langgraph_api-0.7.91 → langgraph_api-0.7.94}/benchmark/reporting/dd_reporting.py +0 -0
  48. {langgraph_api-0.7.91 → langgraph_api-0.7.94}/benchmark/reporting/slack_slowest_runs.py +0 -0
  49. {langgraph_api-0.7.91 → langgraph_api-0.7.94}/benchmark/reporting/slack_summary.py +0 -0
  50. {langgraph_api-0.7.91 → langgraph_api-0.7.94}/benchmark/run_local.sh +0 -0
  51. {langgraph_api-0.7.91 → langgraph_api-0.7.94}/benchmark/staircase.py +0 -0
  52. {langgraph_api-0.7.91 → langgraph_api-0.7.94}/benchmark/staircase_step_k6.js +0 -0
  53. {langgraph_api-0.7.91 → langgraph_api-0.7.94}/benchmark/tsconfig.json +0 -0
  54. {langgraph_api-0.7.91 → langgraph_api-0.7.94}/benchmark/update-revision.js +0 -0
  55. {langgraph_api-0.7.91 → langgraph_api-0.7.94}/benchmark/weather.js +0 -0
  56. {langgraph_api-0.7.91 → langgraph_api-0.7.94}/constraints.txt +0 -0
  57. {langgraph_api-0.7.91 → langgraph_api-0.7.94}/custom_store.sql +0 -0
  58. {langgraph_api-0.7.91 → langgraph_api-0.7.94}/forbidden.txt +0 -0
  59. {langgraph_api-0.7.91 → langgraph_api-0.7.94}/hatch_build.py +0 -0
  60. {langgraph_api-0.7.91 → langgraph_api-0.7.94}/healthcheck.py +0 -0
  61. {langgraph_api-0.7.91 → langgraph_api-0.7.94}/langgraph-cloud-debugging-20260210132856.zip +0 -0
  62. {langgraph_api-0.7.91 → langgraph_api-0.7.94}/langgraph_api/_checkpointer/__init__.py +0 -0
  63. {langgraph_api-0.7.91 → langgraph_api-0.7.94}/langgraph_api/_checkpointer/protocol.py +0 -0
  64. {langgraph_api-0.7.91 → langgraph_api-0.7.94}/langgraph_api/_factory_utils.py +0 -0
  65. {langgraph_api-0.7.91 → langgraph_api-0.7.94}/langgraph_api/api/__init__.py +0 -0
  66. {langgraph_api-0.7.91 → langgraph_api-0.7.94}/langgraph_api/api/a2a.py +0 -0
  67. {langgraph_api-0.7.91 → langgraph_api-0.7.94}/langgraph_api/api/assistants.py +0 -0
  68. {langgraph_api-0.7.91 → langgraph_api-0.7.94}/langgraph_api/api/mcp/__init__.py +0 -0
  69. {langgraph_api-0.7.91 → langgraph_api-0.7.94}/langgraph_api/api/mcp/_constants.py +0 -0
  70. {langgraph_api-0.7.91 → langgraph_api-0.7.94}/langgraph_api/api/mcp/_handlers.py +0 -0
  71. {langgraph_api-0.7.91 → langgraph_api-0.7.94}/langgraph_api/api/mcp/_models.py +0 -0
  72. {langgraph_api-0.7.91 → langgraph_api-0.7.94}/langgraph_api/api/mcp/_routes.py +0 -0
  73. {langgraph_api-0.7.91 → langgraph_api-0.7.94}/langgraph_api/api/mcp/_sanitizers.py +0 -0
  74. {langgraph_api-0.7.91 → langgraph_api-0.7.94}/langgraph_api/api/meta.py +0 -0
  75. {langgraph_api-0.7.91 → langgraph_api-0.7.94}/langgraph_api/api/openapi.py +0 -0
  76. {langgraph_api-0.7.91 → langgraph_api-0.7.94}/langgraph_api/api/profile.py +0 -0
  77. {langgraph_api-0.7.91 → langgraph_api-0.7.94}/langgraph_api/api/runs.py +0 -0
  78. {langgraph_api-0.7.91 → langgraph_api-0.7.94}/langgraph_api/api/store.py +0 -0
  79. {langgraph_api-0.7.91 → langgraph_api-0.7.94}/langgraph_api/api/threads.py +0 -0
  80. {langgraph_api-0.7.91 → langgraph_api-0.7.94}/langgraph_api/api/ui.py +0 -0
  81. {langgraph_api-0.7.91 → langgraph_api-0.7.94}/langgraph_api/asgi_transport.py +0 -0
  82. {langgraph_api-0.7.91 → langgraph_api-0.7.94}/langgraph_api/auth/__init__.py +0 -0
  83. {langgraph_api-0.7.91 → langgraph_api-0.7.94}/langgraph_api/auth/custom.py +0 -0
  84. {langgraph_api-0.7.91 → langgraph_api-0.7.94}/langgraph_api/auth/errors.py +0 -0
  85. {langgraph_api-0.7.91 → langgraph_api-0.7.94}/langgraph_api/auth/langsmith/__init__.py +0 -0
  86. {langgraph_api-0.7.91 → langgraph_api-0.7.94}/langgraph_api/auth/langsmith/backend.py +0 -0
  87. {langgraph_api-0.7.91 → langgraph_api-0.7.94}/langgraph_api/auth/langsmith/client.py +0 -0
  88. {langgraph_api-0.7.91 → langgraph_api-0.7.94}/langgraph_api/auth/middleware.py +0 -0
  89. {langgraph_api-0.7.91 → langgraph_api-0.7.94}/langgraph_api/auth/noop.py +0 -0
  90. {langgraph_api-0.7.91 → langgraph_api-0.7.94}/langgraph_api/auth/studio_user.py +0 -0
  91. {langgraph_api-0.7.91 → langgraph_api-0.7.94}/langgraph_api/cache.py +0 -0
  92. {langgraph_api-0.7.91 → langgraph_api-0.7.94}/langgraph_api/cli.py +0 -0
  93. {langgraph_api-0.7.91 → langgraph_api-0.7.94}/langgraph_api/command.py +0 -0
  94. {langgraph_api-0.7.91 → langgraph_api-0.7.94}/langgraph_api/config/__init__.py +0 -0
  95. {langgraph_api-0.7.91 → langgraph_api-0.7.94}/langgraph_api/config/_parse.py +0 -0
  96. {langgraph_api-0.7.91 → langgraph_api-0.7.94}/langgraph_api/config/schemas.py +0 -0
  97. {langgraph_api-0.7.91 → langgraph_api-0.7.94}/langgraph_api/cron_scheduler.py +0 -0
  98. {langgraph_api-0.7.91 → langgraph_api-0.7.94}/langgraph_api/encryption/__init__.py +0 -0
  99. {langgraph_api-0.7.91 → langgraph_api-0.7.94}/langgraph_api/encryption/aes_json.py +0 -0
  100. {langgraph_api-0.7.91 → langgraph_api-0.7.94}/langgraph_api/encryption/context.py +0 -0
  101. {langgraph_api-0.7.91 → langgraph_api-0.7.94}/langgraph_api/encryption/custom.py +0 -0
  102. {langgraph_api-0.7.91 → langgraph_api-0.7.94}/langgraph_api/encryption/middleware.py +0 -0
  103. {langgraph_api-0.7.91 → langgraph_api-0.7.94}/langgraph_api/encryption/shared.py +0 -0
  104. {langgraph_api-0.7.91 → langgraph_api-0.7.94}/langgraph_api/errors.py +0 -0
  105. {langgraph_api-0.7.91 → langgraph_api-0.7.94}/langgraph_api/executor_entrypoint.py +0 -0
  106. {langgraph_api-0.7.91 → langgraph_api-0.7.94}/langgraph_api/feature_flags.py +0 -0
  107. {langgraph_api-0.7.91 → langgraph_api-0.7.94}/langgraph_api/grpc/__init__.py +0 -0
  108. {langgraph_api-0.7.91 → langgraph_api-0.7.94}/langgraph_api/grpc/client.py +0 -0
  109. {langgraph_api-0.7.91 → langgraph_api-0.7.94}/langgraph_api/grpc/generated/core_api_pb2.pyi +0 -0
  110. {langgraph_api-0.7.91 → langgraph_api-0.7.94}/langgraph_api/grpc/ops/__init__.py +0 -0
  111. {langgraph_api-0.7.91 → langgraph_api-0.7.94}/langgraph_api/grpc/ops/assistants.py +0 -0
  112. {langgraph_api-0.7.91 → langgraph_api-0.7.94}/langgraph_api/grpc/ops/cache.py +0 -0
  113. {langgraph_api-0.7.91 → langgraph_api-0.7.94}/langgraph_api/grpc/ops/crons.py +0 -0
  114. {langgraph_api-0.7.91 → langgraph_api-0.7.94}/langgraph_api/grpc/ops/runs.py +0 -0
  115. {langgraph_api-0.7.91 → langgraph_api-0.7.94}/langgraph_api/grpc/ops/threads.py +0 -0
  116. {langgraph_api-0.7.91 → langgraph_api-0.7.94}/langgraph_api/grpc/server.py +0 -0
  117. {langgraph_api-0.7.91 → langgraph_api-0.7.94}/langgraph_api/grpc/servicers/__init__.py +0 -0
  118. {langgraph_api-0.7.91 → langgraph_api-0.7.94}/langgraph_api/grpc/servicers/checkpointer.py +0 -0
  119. {langgraph_api-0.7.91 → langgraph_api-0.7.94}/langgraph_api/grpc/servicers/encryption.py +0 -0
  120. {langgraph_api-0.7.91 → langgraph_api-0.7.94}/langgraph_api/http.py +0 -0
  121. {langgraph_api-0.7.91 → langgraph_api-0.7.94}/langgraph_api/http_metrics.py +0 -0
  122. {langgraph_api-0.7.91 → langgraph_api-0.7.94}/langgraph_api/http_metrics_utils.py +0 -0
  123. {langgraph_api-0.7.91 → langgraph_api-0.7.94}/langgraph_api/js/.gitignore +0 -0
  124. {langgraph_api-0.7.91 → langgraph_api-0.7.94}/langgraph_api/js/.prettierrc +0 -0
  125. {langgraph_api-0.7.91 → langgraph_api-0.7.94}/langgraph_api/js/__init__.py +0 -0
  126. {langgraph_api-0.7.91 → langgraph_api-0.7.94}/langgraph_api/js/base.py +0 -0
  127. {langgraph_api-0.7.91 → langgraph_api-0.7.94}/langgraph_api/js/build.mts +0 -0
  128. {langgraph_api-0.7.91 → langgraph_api-0.7.94}/langgraph_api/js/client.http.mts +0 -0
  129. {langgraph_api-0.7.91 → langgraph_api-0.7.94}/langgraph_api/js/client.mts +0 -0
  130. {langgraph_api-0.7.91 → langgraph_api-0.7.94}/langgraph_api/js/errors.py +0 -0
  131. {langgraph_api-0.7.91 → langgraph_api-0.7.94}/langgraph_api/js/global.d.ts +0 -0
  132. {langgraph_api-0.7.91 → langgraph_api-0.7.94}/langgraph_api/js/package.json +0 -0
  133. {langgraph_api-0.7.91 → langgraph_api-0.7.94}/langgraph_api/js/schema.py +0 -0
  134. {langgraph_api-0.7.91 → langgraph_api-0.7.94}/langgraph_api/js/src/graph.mts +0 -0
  135. {langgraph_api-0.7.91 → langgraph_api-0.7.94}/langgraph_api/js/src/load.hooks.mjs +0 -0
  136. {langgraph_api-0.7.91 → langgraph_api-0.7.94}/langgraph_api/js/src/preload.mjs +0 -0
  137. {langgraph_api-0.7.91 → langgraph_api-0.7.94}/langgraph_api/js/src/utils/files.mts +0 -0
  138. {langgraph_api-0.7.91 → langgraph_api-0.7.94}/langgraph_api/js/src/utils/importMap.mts +0 -0
  139. {langgraph_api-0.7.91 → langgraph_api-0.7.94}/langgraph_api/js/src/utils/pythonSchemas.mts +0 -0
  140. {langgraph_api-0.7.91 → langgraph_api-0.7.94}/langgraph_api/js/src/utils/serde.mts +0 -0
  141. {langgraph_api-0.7.91 → langgraph_api-0.7.94}/langgraph_api/js/sse.py +0 -0
  142. {langgraph_api-0.7.91 → langgraph_api-0.7.94}/langgraph_api/js/traceblock.mts +0 -0
  143. {langgraph_api-0.7.91 → langgraph_api-0.7.94}/langgraph_api/js/tsconfig.json +0 -0
  144. {langgraph_api-0.7.91 → langgraph_api-0.7.94}/langgraph_api/js/ui.py +0 -0
  145. {langgraph_api-0.7.91 → langgraph_api-0.7.94}/langgraph_api/js/yarn.lock +0 -0
  146. {langgraph_api-0.7.91 → langgraph_api-0.7.94}/langgraph_api/logging.py +0 -0
  147. {langgraph_api-0.7.91 → langgraph_api-0.7.94}/langgraph_api/metadata.py +0 -0
  148. {langgraph_api-0.7.91 → langgraph_api-0.7.94}/langgraph_api/middleware/__init__.py +0 -0
  149. {langgraph_api-0.7.91 → langgraph_api-0.7.94}/langgraph_api/middleware/ensure_store.py +0 -0
  150. {langgraph_api-0.7.91 → langgraph_api-0.7.94}/langgraph_api/middleware/http_logger.py +0 -0
  151. {langgraph_api-0.7.91 → langgraph_api-0.7.94}/langgraph_api/middleware/private_network.py +0 -0
  152. {langgraph_api-0.7.91 → langgraph_api-0.7.94}/langgraph_api/middleware/request_id.py +0 -0
  153. {langgraph_api-0.7.91 → langgraph_api-0.7.94}/langgraph_api/models/__init__.py +0 -0
  154. {langgraph_api-0.7.91 → langgraph_api-0.7.94}/langgraph_api/models/run.py +0 -0
  155. {langgraph_api-0.7.91 → langgraph_api-0.7.94}/langgraph_api/otel_context.py +0 -0
  156. {langgraph_api-0.7.91 → langgraph_api-0.7.94}/langgraph_api/patch.py +0 -0
  157. {langgraph_api-0.7.91 → langgraph_api-0.7.94}/langgraph_api/queue_entrypoint.py +0 -0
  158. {langgraph_api-0.7.91 → langgraph_api-0.7.94}/langgraph_api/route.py +0 -0
  159. {langgraph_api-0.7.91 → langgraph_api-0.7.94}/langgraph_api/schema.py +0 -0
  160. {langgraph_api-0.7.91 → langgraph_api-0.7.94}/langgraph_api/self_hosted_logs.py +0 -0
  161. {langgraph_api-0.7.91 → langgraph_api-0.7.94}/langgraph_api/self_hosted_metrics.py +0 -0
  162. {langgraph_api-0.7.91 → langgraph_api-0.7.94}/langgraph_api/serde.py +0 -0
  163. {langgraph_api-0.7.91 → langgraph_api-0.7.94}/langgraph_api/server.py +0 -0
  164. {langgraph_api-0.7.91 → langgraph_api-0.7.94}/langgraph_api/sse.py +0 -0
  165. {langgraph_api-0.7.91 → langgraph_api-0.7.94}/langgraph_api/state.py +0 -0
  166. {langgraph_api-0.7.91 → langgraph_api-0.7.94}/langgraph_api/stream.py +0 -0
  167. {langgraph_api-0.7.91 → langgraph_api-0.7.94}/langgraph_api/timing/__init__.py +0 -0
  168. {langgraph_api-0.7.91 → langgraph_api-0.7.94}/langgraph_api/timing/profiler.py +0 -0
  169. {langgraph_api-0.7.91 → langgraph_api-0.7.94}/langgraph_api/timing/timer.py +0 -0
  170. {langgraph_api-0.7.91 → langgraph_api-0.7.94}/langgraph_api/traceblock.py +0 -0
  171. {langgraph_api-0.7.91 → langgraph_api-0.7.94}/langgraph_api/tunneling/cloudflare.py +0 -0
  172. {langgraph_api-0.7.91 → langgraph_api-0.7.94}/langgraph_api/utils/__init__.py +0 -0
  173. {langgraph_api-0.7.91 → langgraph_api-0.7.94}/langgraph_api/utils/cache.py +0 -0
  174. {langgraph_api-0.7.91 → langgraph_api-0.7.94}/langgraph_api/utils/config.py +0 -0
  175. {langgraph_api-0.7.91 → langgraph_api-0.7.94}/langgraph_api/utils/errors.py +0 -0
  176. {langgraph_api-0.7.91 → langgraph_api-0.7.94}/langgraph_api/utils/extract.py +0 -0
  177. {langgraph_api-0.7.91 → langgraph_api-0.7.94}/langgraph_api/utils/future.py +0 -0
  178. {langgraph_api-0.7.91 → langgraph_api-0.7.94}/langgraph_api/utils/headers.py +0 -0
  179. {langgraph_api-0.7.91 → langgraph_api-0.7.94}/langgraph_api/utils/retriable_client.py +0 -0
  180. {langgraph_api-0.7.91 → langgraph_api-0.7.94}/langgraph_api/utils/stream_codec.py +0 -0
  181. {langgraph_api-0.7.91 → langgraph_api-0.7.94}/langgraph_api/utils/uuids.py +0 -0
  182. {langgraph_api-0.7.91 → langgraph_api-0.7.94}/langgraph_api/validation.py +0 -0
  183. {langgraph_api-0.7.91 → langgraph_api-0.7.94}/langgraph_api/webhook.py +0 -0
  184. {langgraph_api-0.7.91 → langgraph_api-0.7.94}/langgraph_api/worker.py +0 -0
  185. {langgraph_api-0.7.91 → langgraph_api-0.7.94}/langgraph_grpc_common/__init__.py +0 -0
  186. {langgraph_api-0.7.91 → langgraph_api-0.7.94}/langgraph_grpc_common/checkpointer.py +0 -0
  187. {langgraph_api-0.7.91 → langgraph_api-0.7.94}/langgraph_grpc_common/conversion/__init__.py +0 -0
  188. {langgraph_api-0.7.91 → langgraph_api-0.7.94}/langgraph_grpc_common/conversion/_compat.py +0 -0
  189. {langgraph_api-0.7.91 → langgraph_api-0.7.94}/langgraph_grpc_common/conversion/channel.py +0 -0
  190. {langgraph_api-0.7.91 → langgraph_api-0.7.94}/langgraph_grpc_common/conversion/checkpoint.py +0 -0
  191. {langgraph_api-0.7.91 → langgraph_api-0.7.94}/langgraph_grpc_common/conversion/config.py +0 -0
  192. {langgraph_api-0.7.91 → langgraph_api-0.7.94}/langgraph_grpc_common/conversion/durability.py +0 -0
  193. {langgraph_api-0.7.91 → langgraph_api-0.7.94}/langgraph_grpc_common/conversion/exception.py +0 -0
  194. {langgraph_api-0.7.91 → langgraph_api-0.7.94}/langgraph_grpc_common/conversion/graph.py +0 -0
  195. {langgraph_api-0.7.91 → langgraph_api-0.7.94}/langgraph_grpc_common/conversion/interrupt.py +0 -0
  196. {langgraph_api-0.7.91 → langgraph_api-0.7.94}/langgraph_grpc_common/conversion/messages.py +0 -0
  197. {langgraph_api-0.7.91 → langgraph_api-0.7.94}/langgraph_grpc_common/conversion/orchestrator_response.py +0 -0
  198. {langgraph_api-0.7.91 → langgraph_api-0.7.94}/langgraph_grpc_common/conversion/runopts.py +0 -0
  199. {langgraph_api-0.7.91 → langgraph_api-0.7.94}/langgraph_grpc_common/conversion/stream_mode.py +0 -0
  200. {langgraph_api-0.7.91 → langgraph_api-0.7.94}/langgraph_grpc_common/conversion/struct.py +0 -0
  201. {langgraph_api-0.7.91 → langgraph_api-0.7.94}/langgraph_grpc_common/conversion/task.py +0 -0
  202. {langgraph_api-0.7.91 → langgraph_api-0.7.94}/langgraph_grpc_common/conversion/value.py +0 -0
  203. {langgraph_api-0.7.91 → langgraph_api-0.7.94}/langgraph_grpc_common/proto/__init__.py +0 -0
  204. {langgraph_api-0.7.91 → langgraph_api-0.7.94}/langgraph_grpc_common/proto/checkpointer_pb2.py +0 -0
  205. {langgraph_api-0.7.91 → langgraph_api-0.7.94}/langgraph_grpc_common/proto/checkpointer_pb2.pyi +0 -0
  206. {langgraph_api-0.7.91 → langgraph_api-0.7.94}/langgraph_grpc_common/proto/checkpointer_pb2_grpc.py +0 -0
  207. {langgraph_api-0.7.91 → langgraph_api-0.7.94}/langgraph_grpc_common/proto/checkpointer_pb2_grpc.pyi +0 -0
  208. {langgraph_api-0.7.91 → langgraph_api-0.7.94}/langgraph_grpc_common/proto/core_api_pb2.py +0 -0
  209. {langgraph_api-0.7.91 → langgraph_api-0.7.94}/langgraph_grpc_common/proto/core_api_pb2.pyi +0 -0
  210. {langgraph_api-0.7.91 → langgraph_api-0.7.94}/langgraph_grpc_common/proto/core_api_pb2_grpc.py +0 -0
  211. {langgraph_api-0.7.91 → langgraph_api-0.7.94}/langgraph_grpc_common/proto/core_api_pb2_grpc.pyi +0 -0
  212. {langgraph_api-0.7.91 → langgraph_api-0.7.94}/langgraph_grpc_common/proto/encryption_pb2.py +0 -0
  213. {langgraph_api-0.7.91 → langgraph_api-0.7.94}/langgraph_grpc_common/proto/encryption_pb2.pyi +0 -0
  214. {langgraph_api-0.7.91 → langgraph_api-0.7.94}/langgraph_grpc_common/proto/encryption_pb2_grpc.py +0 -0
  215. {langgraph_api-0.7.91 → langgraph_api-0.7.94}/langgraph_grpc_common/proto/encryption_pb2_grpc.pyi +0 -0
  216. {langgraph_api-0.7.91 → langgraph_api-0.7.94}/langgraph_grpc_common/proto/engine_api_pb2.py +0 -0
  217. {langgraph_api-0.7.91 → langgraph_api-0.7.94}/langgraph_grpc_common/proto/engine_api_pb2.pyi +0 -0
  218. {langgraph_api-0.7.91 → langgraph_api-0.7.94}/langgraph_grpc_common/proto/engine_api_pb2_grpc.py +0 -0
  219. {langgraph_api-0.7.91 → langgraph_api-0.7.94}/langgraph_grpc_common/proto/engine_api_pb2_grpc.pyi +0 -0
  220. {langgraph_api-0.7.91 → langgraph_api-0.7.94}/langgraph_grpc_common/proto/engine_common_pb2.py +0 -0
  221. {langgraph_api-0.7.91 → langgraph_api-0.7.94}/langgraph_grpc_common/proto/engine_common_pb2.pyi +0 -0
  222. {langgraph_api-0.7.91 → langgraph_api-0.7.94}/langgraph_grpc_common/proto/engine_common_pb2_grpc.py +0 -0
  223. {langgraph_api-0.7.91 → langgraph_api-0.7.94}/langgraph_grpc_common/proto/engine_common_pb2_grpc.pyi +0 -0
  224. {langgraph_api-0.7.91 → langgraph_api-0.7.94}/langgraph_grpc_common/proto/enum_cancel_run_action_pb2.py +0 -0
  225. {langgraph_api-0.7.91 → langgraph_api-0.7.94}/langgraph_grpc_common/proto/enum_cancel_run_action_pb2.pyi +0 -0
  226. {langgraph_api-0.7.91 → langgraph_api-0.7.94}/langgraph_grpc_common/proto/enum_cancel_run_action_pb2_grpc.py +0 -0
  227. {langgraph_api-0.7.91 → langgraph_api-0.7.94}/langgraph_grpc_common/proto/enum_cancel_run_action_pb2_grpc.pyi +0 -0
  228. {langgraph_api-0.7.91 → langgraph_api-0.7.94}/langgraph_grpc_common/proto/enum_control_signal_pb2.py +0 -0
  229. {langgraph_api-0.7.91 → langgraph_api-0.7.94}/langgraph_grpc_common/proto/enum_control_signal_pb2.pyi +0 -0
  230. {langgraph_api-0.7.91 → langgraph_api-0.7.94}/langgraph_grpc_common/proto/enum_control_signal_pb2_grpc.py +0 -0
  231. {langgraph_api-0.7.91 → langgraph_api-0.7.94}/langgraph_grpc_common/proto/enum_control_signal_pb2_grpc.pyi +0 -0
  232. {langgraph_api-0.7.91 → langgraph_api-0.7.94}/langgraph_grpc_common/proto/enum_cron_on_run_completed_pb2.py +0 -0
  233. {langgraph_api-0.7.91 → langgraph_api-0.7.94}/langgraph_grpc_common/proto/enum_cron_on_run_completed_pb2.pyi +0 -0
  234. {langgraph_api-0.7.91 → langgraph_api-0.7.94}/langgraph_grpc_common/proto/enum_cron_on_run_completed_pb2_grpc.py +0 -0
  235. {langgraph_api-0.7.91 → langgraph_api-0.7.94}/langgraph_grpc_common/proto/enum_cron_on_run_completed_pb2_grpc.pyi +0 -0
  236. {langgraph_api-0.7.91 → langgraph_api-0.7.94}/langgraph_grpc_common/proto/enum_durability_pb2.py +0 -0
  237. {langgraph_api-0.7.91 → langgraph_api-0.7.94}/langgraph_grpc_common/proto/enum_durability_pb2.pyi +0 -0
  238. {langgraph_api-0.7.91 → langgraph_api-0.7.94}/langgraph_grpc_common/proto/enum_durability_pb2_grpc.py +0 -0
  239. {langgraph_api-0.7.91 → langgraph_api-0.7.94}/langgraph_grpc_common/proto/enum_durability_pb2_grpc.pyi +0 -0
  240. {langgraph_api-0.7.91 → langgraph_api-0.7.94}/langgraph_grpc_common/proto/enum_multitask_strategy_pb2.py +0 -0
  241. {langgraph_api-0.7.91 → langgraph_api-0.7.94}/langgraph_grpc_common/proto/enum_multitask_strategy_pb2.pyi +0 -0
  242. {langgraph_api-0.7.91 → langgraph_api-0.7.94}/langgraph_grpc_common/proto/enum_multitask_strategy_pb2_grpc.py +0 -0
  243. {langgraph_api-0.7.91 → langgraph_api-0.7.94}/langgraph_grpc_common/proto/enum_multitask_strategy_pb2_grpc.pyi +0 -0
  244. {langgraph_api-0.7.91 → langgraph_api-0.7.94}/langgraph_grpc_common/proto/enum_run_status_pb2.py +0 -0
  245. {langgraph_api-0.7.91 → langgraph_api-0.7.94}/langgraph_grpc_common/proto/enum_run_status_pb2.pyi +0 -0
  246. {langgraph_api-0.7.91 → langgraph_api-0.7.94}/langgraph_grpc_common/proto/enum_run_status_pb2_grpc.py +0 -0
  247. {langgraph_api-0.7.91 → langgraph_api-0.7.94}/langgraph_grpc_common/proto/enum_run_status_pb2_grpc.pyi +0 -0
  248. {langgraph_api-0.7.91 → langgraph_api-0.7.94}/langgraph_grpc_common/proto/enum_store_operation_entry_type_pb2.py +0 -0
  249. {langgraph_api-0.7.91 → langgraph_api-0.7.94}/langgraph_grpc_common/proto/enum_store_operation_entry_type_pb2.pyi +0 -0
  250. {langgraph_api-0.7.91 → langgraph_api-0.7.94}/langgraph_grpc_common/proto/enum_store_operation_entry_type_pb2_grpc.py +0 -0
  251. {langgraph_api-0.7.91 → langgraph_api-0.7.94}/langgraph_grpc_common/proto/enum_store_operation_entry_type_pb2_grpc.pyi +0 -0
  252. {langgraph_api-0.7.91 → langgraph_api-0.7.94}/langgraph_grpc_common/proto/enum_stream_mode_pb2.py +0 -0
  253. {langgraph_api-0.7.91 → langgraph_api-0.7.94}/langgraph_grpc_common/proto/enum_stream_mode_pb2.pyi +0 -0
  254. {langgraph_api-0.7.91 → langgraph_api-0.7.94}/langgraph_grpc_common/proto/enum_stream_mode_pb2_grpc.py +0 -0
  255. {langgraph_api-0.7.91 → langgraph_api-0.7.94}/langgraph_grpc_common/proto/enum_stream_mode_pb2_grpc.pyi +0 -0
  256. {langgraph_api-0.7.91 → langgraph_api-0.7.94}/langgraph_grpc_common/proto/enum_thread_status_pb2.py +0 -0
  257. {langgraph_api-0.7.91 → langgraph_api-0.7.94}/langgraph_grpc_common/proto/enum_thread_status_pb2.pyi +0 -0
  258. {langgraph_api-0.7.91 → langgraph_api-0.7.94}/langgraph_grpc_common/proto/enum_thread_status_pb2_grpc.py +0 -0
  259. {langgraph_api-0.7.91 → langgraph_api-0.7.94}/langgraph_grpc_common/proto/enum_thread_status_pb2_grpc.pyi +0 -0
  260. {langgraph_api-0.7.91 → langgraph_api-0.7.94}/langgraph_grpc_common/proto/enum_thread_stream_mode_pb2.py +0 -0
  261. {langgraph_api-0.7.91 → langgraph_api-0.7.94}/langgraph_grpc_common/proto/enum_thread_stream_mode_pb2.pyi +0 -0
  262. {langgraph_api-0.7.91 → langgraph_api-0.7.94}/langgraph_grpc_common/proto/enum_thread_stream_mode_pb2_grpc.py +0 -0
  263. {langgraph_api-0.7.91 → langgraph_api-0.7.94}/langgraph_grpc_common/proto/enum_thread_stream_mode_pb2_grpc.pyi +0 -0
  264. {langgraph_api-0.7.91 → langgraph_api-0.7.94}/langgraph_grpc_common/proto/errors_pb2.py +0 -0
  265. {langgraph_api-0.7.91 → langgraph_api-0.7.94}/langgraph_grpc_common/proto/errors_pb2.pyi +0 -0
  266. {langgraph_api-0.7.91 → langgraph_api-0.7.94}/langgraph_grpc_common/proto/errors_pb2_grpc.py +0 -0
  267. {langgraph_api-0.7.91 → langgraph_api-0.7.94}/langgraph_grpc_common/proto/errors_pb2_grpc.pyi +0 -0
  268. {langgraph_api-0.7.91 → langgraph_api-0.7.94}/langgraph_grpc_common/proto/executor_api_pb2.py +0 -0
  269. {langgraph_api-0.7.91 → langgraph_api-0.7.94}/langgraph_grpc_common/proto/executor_api_pb2.pyi +0 -0
  270. {langgraph_api-0.7.91 → langgraph_api-0.7.94}/langgraph_grpc_common/proto/executor_api_pb2_grpc.py +0 -0
  271. {langgraph_api-0.7.91 → langgraph_api-0.7.94}/langgraph_grpc_common/proto/executor_api_pb2_grpc.pyi +0 -0
  272. {langgraph_api-0.7.91 → langgraph_api-0.7.94}/langgraph_grpc_common/sanitize.py +0 -0
  273. {langgraph_api-0.7.91 → langgraph_api-0.7.94}/langgraph_grpc_common/serde.py +0 -0
  274. {langgraph_api-0.7.91 → langgraph_api-0.7.94}/langgraph_license/__init__.py +0 -0
  275. {langgraph_api-0.7.91 → langgraph_api-0.7.94}/langgraph_license/validation.py +0 -0
  276. {langgraph_api-0.7.91 → langgraph_api-0.7.94}/langgraph_runtime/__init__.py +0 -0
  277. {langgraph_api-0.7.91 → langgraph_api-0.7.94}/langgraph_runtime/checkpoint.py +0 -0
  278. {langgraph_api-0.7.91 → langgraph_api-0.7.94}/langgraph_runtime/database.py +0 -0
  279. {langgraph_api-0.7.91 → langgraph_api-0.7.94}/langgraph_runtime/lifespan.py +0 -0
  280. {langgraph_api-0.7.91 → langgraph_api-0.7.94}/langgraph_runtime/metrics.py +0 -0
  281. {langgraph_api-0.7.91 → langgraph_api-0.7.94}/langgraph_runtime/ops.py +0 -0
  282. {langgraph_api-0.7.91 → langgraph_api-0.7.94}/langgraph_runtime/queue.py +0 -0
  283. {langgraph_api-0.7.91 → langgraph_api-0.7.94}/langgraph_runtime/retry.py +0 -0
  284. {langgraph_api-0.7.91 → langgraph_api-0.7.94}/langgraph_runtime/routes.py +0 -0
  285. {langgraph_api-0.7.91 → langgraph_api-0.7.94}/langgraph_runtime/store.py +0 -0
  286. {langgraph_api-0.7.91 → langgraph_api-0.7.94}/logging.json +0 -0
  287. {langgraph_api-0.7.91 → langgraph_api-0.7.94}/openapi.json +0 -0
  288. {langgraph_api-0.7.91 → langgraph_api-0.7.94}/pyproject.toml +0 -0
  289. {langgraph_api-0.7.91 → langgraph_api-0.7.94}/scripts/build_wheel.py +0 -0
  290. {langgraph_api-0.7.91 → langgraph_api-0.7.94}/scripts/create_license.py +0 -0
  291. {langgraph_api-0.7.91 → langgraph_api-0.7.94}/scripts/run_a2a_tck.py +0 -0
  292. {langgraph_api-0.7.91 → langgraph_api-0.7.94}/uv.lock +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: langgraph-api
3
- Version: 0.7.91
3
+ Version: 0.7.94
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
@@ -0,0 +1 @@
1
+ __version__ = "0.7.94"
@@ -22,6 +22,7 @@ from langgraph.pregel import Pregel
22
22
  from langgraph_grpc_common.checkpointer import GrpcCheckpointer
23
23
 
24
24
  from langgraph_api import config, timing
25
+ from langgraph_api.asyncio import as_asynccontextmanager
25
26
  from langgraph_api.grpc.client import get_shared_client
26
27
  from langgraph_api.timing import profiled_import
27
28
  from langgraph_api.utils.config import run_in_executor
@@ -375,15 +376,9 @@ async def collect_checkpointer_from_env() -> None:
375
376
  async def _yield_checkpointer(value: Any):
376
377
  if isinstance(value, BaseCheckpointSaver):
377
378
  yield value
378
- # Async context manager
379
- elif hasattr(value, "__aenter__") and hasattr(value, "__aexit__"):
380
- async with value as ctx_value:
379
+ elif hasattr(value, "__aenter__") or hasattr(value, "__enter__"):
380
+ async with as_asynccontextmanager(value) as ctx_value:
381
381
  yield ctx_value
382
- # Sync context manager
383
- elif hasattr(value, "__enter__") and hasattr(value, "__exit__"):
384
- with value as ctx_value:
385
- yield ctx_value
386
- # async factory
387
382
  elif asyncio.iscoroutine(value):
388
383
  result = await value
389
384
  if not isinstance(result, BaseCheckpointSaver):
@@ -391,7 +386,6 @@ async def _yield_checkpointer(value: Any):
391
386
  "Custom checkpointer must resolve to a BaseCheckpointSaver instance."
392
387
  )
393
388
  yield result
394
- # factory
395
389
  elif callable(value):
396
390
  async with _yield_checkpointer(value()) as ctx_value:
397
391
  yield ctx_value
@@ -1,7 +1,7 @@
1
1
  import asyncio
2
2
  import concurrent.futures
3
3
  from collections.abc import AsyncIterator, Coroutine
4
- from contextlib import AbstractAsyncContextManager, suppress
4
+ from contextlib import AbstractAsyncContextManager, asynccontextmanager, suppress
5
5
  from functools import partial
6
6
  from typing import Any, Generic, TypeVar
7
7
 
@@ -14,6 +14,25 @@ logger = structlog.stdlib.get_logger(__name__)
14
14
  _MAIN_LOOP: asyncio.AbstractEventLoop | None = None
15
15
 
16
16
 
17
+ @asynccontextmanager
18
+ async def as_asynccontextmanager(value: Any) -> AsyncIterator[Any]:
19
+ """Normalize an async CM, sync CM, or coroutine into a single async context manager.
20
+
21
+ Handles the three factory return styles used across graph, store, and checkpointer
22
+ loading without duplicating the dispatch logic.
23
+ """
24
+ if hasattr(value, "__aenter__") and hasattr(value, "__aexit__"):
25
+ async with value as result:
26
+ yield result
27
+ elif hasattr(value, "__enter__") and hasattr(value, "__exit__"):
28
+ with value as result:
29
+ yield result
30
+ elif asyncio.iscoroutine(value):
31
+ yield await value
32
+ else:
33
+ yield value
34
+
35
+
17
36
  def set_event_loop(loop: asyncio.AbstractEventLoop) -> None:
18
37
  global _MAIN_LOOP
19
38
  _MAIN_LOOP = loop
@@ -34,6 +34,7 @@ from langgraph_api._factory_utils import (
34
34
  is_factory,
35
35
  is_for_execution,
36
36
  )
37
+ from langgraph_api.asyncio import as_asynccontextmanager
37
38
  from langgraph_api.feature_flags import (
38
39
  IS_POSTGRES_OR_GRPC_BACKEND,
39
40
  USE_RUNTIME_CONTEXT_API,
@@ -169,9 +170,59 @@ def _log_slow_graph_generation(
169
170
  )
170
171
 
171
172
 
173
+ _ddtracer: Any = None
174
+
175
+
176
+ def _get_ddtracer() -> Any:
177
+ """Return the ddtrace tracer singleton, or None if ddtrace is not installed."""
178
+ global _ddtracer
179
+ if not hasattr(_get_ddtracer, "_checked"):
180
+ _get_ddtracer._checked = True
181
+ try:
182
+ from ddtrace import tracer # type: ignore[unresolved-import] # noqa: PLC0415, I001
183
+
184
+ _ddtracer = tracer
185
+ except ImportError:
186
+ # ddtrace is an optional dependency; tracing is silently disabled when absent.
187
+ pass
188
+ return _ddtracer
189
+
190
+
191
+ def _start_graph_load_span(graph_id: str, access_context: str | None) -> Any:
192
+ """Start a ddtrace span covering graph factory __aenter__ time.
193
+
194
+ Starting before __aenter__ means HTTP calls made by the factory appear as
195
+ children of this span. Returns the span, or None if ddtrace is unavailable.
196
+ """
197
+ ddtracer = _get_ddtracer()
198
+ if ddtracer is None:
199
+ return None
200
+ try:
201
+ span = ddtracer.start_span("langgraph.graph_load")
202
+ span.set_tag("graph_id", graph_id)
203
+ if access_context:
204
+ span.set_tag("access_context", access_context)
205
+ return span
206
+ except Exception:
207
+ return None
208
+
209
+
210
+ def _finish_graph_load_span(span: Any, value_type: str) -> None:
211
+ if span is None:
212
+ return
213
+ try:
214
+ span.set_tag("value_type", value_type)
215
+ span.finish()
216
+ except Exception:
217
+ pass # Tracing must never interfere with application logic
218
+
219
+
172
220
  @asynccontextmanager
173
221
  async def _generate_graph(
174
- value: Any, graph_id: str, run_id: str | None = None
222
+ value: Any,
223
+ graph_id: str,
224
+ run_id: str | None = None,
225
+ access_context: str | None = None,
175
226
  ) -> AsyncIterator[Any]:
176
227
  """Yield a graph object regardless of its type.
177
228
 
@@ -183,20 +234,15 @@ async def _generate_graph(
183
234
  value_type = type(value).__name__
184
235
  if isinstance(value, Pregel | BaseRemotePregel):
185
236
  yield value
186
- elif hasattr(value, "__aenter__") and hasattr(value, "__aexit__"):
187
- async with value as ctx_value:
188
- _log_slow_graph_generation(start, value_type, graph_id, run_id=run_id)
189
- yield ctx_value
190
- elif hasattr(value, "__enter__") and hasattr(value, "__exit__"):
191
- with value as ctx_value:
237
+ return
238
+ span = _start_graph_load_span(graph_id, access_context)
239
+ try:
240
+ async with as_asynccontextmanager(value) as ctx_value:
192
241
  _log_slow_graph_generation(start, value_type, graph_id, run_id=run_id)
242
+ _finish_graph_load_span(span, value_type)
193
243
  yield ctx_value
194
- elif asyncio.iscoroutine(value):
195
- result = await value
196
- _log_slow_graph_generation(start, value_type, graph_id, run_id=run_id)
197
- yield result
198
- else:
199
- yield value
244
+ finally:
245
+ _finish_graph_load_span(span, value_type)
200
246
 
201
247
 
202
248
  def is_js_graph(graph_id: str) -> TypeGuard[BaseRemotePregel]:
@@ -246,7 +292,9 @@ async def get_graph(
246
292
 
247
293
  value = invoke_factory(value, graph_id, config, server_runtime)
248
294
  try:
249
- async with _generate_graph(value, graph_id, run_id=run_id) as graph_obj:
295
+ async with _generate_graph(
296
+ value, graph_id, run_id=run_id, access_context=access_context
297
+ ) as graph_obj:
250
298
  if isinstance(graph_obj, StateGraph):
251
299
  graph_obj = graph_obj.compile()
252
300
  if not isinstance(graph_obj, Pregel | BaseRemotePregel):
@@ -480,7 +528,7 @@ async def collect_graphs_from_env(register: bool = False) -> None:
480
528
  for task in js_bg_tasks:
481
529
  task.add_done_callback(_handle_exception)
482
530
 
483
- await wait_until_js_ready()
531
+ await wait_until_js_ready(js_bg_tasks)
484
532
 
485
533
  for spec in js_specs:
486
534
  graph = RemotePregel(graph_id=spec.id)
@@ -526,6 +574,43 @@ def _metadata_fn(spec: GraphSpec) -> dict[str, Any]:
526
574
  return {"graph_id": spec.id, "module": spec.module, "path": spec.path}
527
575
 
528
576
 
577
+ def patch_packages_distributions() -> None:
578
+ """Cache importlib.metadata.packages_distributions() to avoid repeated full scans.
579
+
580
+ google-api-core >=2.28.0 calls packages_distributions() — an uncached O(N)
581
+ scan of every installed package's RECORD file — 13+ times at import time
582
+ (once per google.cloud.* sub-package). With ddtrace's import hooks each
583
+ call takes ~13 s in production, totalling ~170 s.
584
+
585
+ The installed-package set never changes during a process lifetime, so a
586
+ single cached result is safe and reduces 13 scans to 1.
587
+
588
+ Controlled by LSD_CACHE_PACKAGES_DISTRIBUTIONS (default "false").
589
+ Set to "true" to enable.
590
+ """
591
+ if os.environ.get("LSD_CACHE_PACKAGES_DISTRIBUTIONS", "false").lower() != "true":
592
+ return
593
+
594
+ import importlib.metadata # noqa: PLC0415
595
+
596
+ if getattr(importlib.metadata.packages_distributions, "_cached", False):
597
+ return
598
+
599
+ logger.info("Caching importlib.metadata.packages_distributions()")
600
+
601
+ original = importlib.metadata.packages_distributions
602
+ cache: dict | None = None
603
+
604
+ def _cached():
605
+ nonlocal cache
606
+ if cache is None:
607
+ cache = original()
608
+ return cache
609
+
610
+ _cached._cached = True
611
+ importlib.metadata.packages_distributions = _cached
612
+
613
+
529
614
  @timing.timer(
530
615
  message="Importing graph with id {graph_id}",
531
616
  metadata_fn=_metadata_fn,
@@ -414,8 +414,19 @@ async def run_js_process(paths_str: str | None, watch: bool = False):
414
414
  **os.environ,
415
415
  },
416
416
  )
417
- logger.info("Started JS graphs process [%d]", process.pid)
417
+ logger.info(
418
+ "Started JS graphs process",
419
+ pid=process.pid,
420
+ attempt=attempt,
421
+ args=args,
422
+ )
418
423
  code = await process.wait()
424
+ logger.error(
425
+ "JS graphs process exited unexpectedly",
426
+ pid=process.pid,
427
+ exit_code=code,
428
+ attempt=attempt,
429
+ )
419
430
  raise Exception(f"JS process exited with code {code}")
420
431
  except asyncio.CancelledError:
421
432
  logger.info("Terminating JS graphs process")
@@ -462,9 +473,20 @@ async def run_js_http_process(
462
473
  )
463
474
 
464
475
  pid = process.pid
465
- logger.info("Started JS HTTP process [%d]", pid)
476
+ logger.info(
477
+ "Started JS HTTP process",
478
+ pid=pid,
479
+ attempt=attempt,
480
+ args=args,
481
+ )
466
482
 
467
483
  code = await process.wait()
484
+ logger.error(
485
+ "JS HTTP process exited unexpectedly",
486
+ pid=pid,
487
+ exit_code=code,
488
+ attempt=attempt,
489
+ )
468
490
  raise Exception(f"JS HTTP process exited with code {code}")
469
491
 
470
492
  except asyncio.CancelledError:
@@ -806,7 +828,9 @@ class DisableHttpxLoggingContextManager(contextlib.AbstractContextManager):
806
828
  logging.getLogger("httpx").removeFilter(self.filter)
807
829
 
808
830
 
809
- async def wait_until_js_ready():
831
+ async def wait_until_js_ready(
832
+ bg_tasks: set[asyncio.Task] | None = None,
833
+ ):
810
834
  with DisableHttpxLoggingContextManager():
811
835
  async with (
812
836
  httpx.AsyncClient(
@@ -821,19 +845,50 @@ async def wait_until_js_ready():
821
845
  ) as checkpointer_client,
822
846
  ):
823
847
  attempt = 0
848
+ graph_ready = False
824
849
  while (
825
850
  current_task := asyncio.current_task()
826
851
  ) and not current_task.cancelled():
852
+ if bg_tasks:
853
+ for task in bg_tasks:
854
+ if task.done():
855
+ exc = task.exception() if not task.cancelled() else None
856
+ logger.error(
857
+ "JS background task finished while waiting for"
858
+ " JS ready",
859
+ task_name=task.get_name(),
860
+ task_cancelled=task.cancelled(),
861
+ task_exception=repr(exc) if exc else None,
862
+ )
863
+ raise RuntimeError(
864
+ f"JS background task '{task.get_name()}' died"
865
+ " during startup"
866
+ ) from exc
827
867
  try:
828
- res = await graph_client.get("/ok")
829
- res.raise_for_status()
868
+ if not graph_ready:
869
+ res = await graph_client.get("/ok")
870
+ res.raise_for_status()
871
+ graph_ready = True
830
872
  res = await checkpointer_client.get("/ok")
831
873
  res.raise_for_status()
832
874
  return
833
- except httpx.HTTPError:
875
+ except httpx.HTTPError as exc:
834
876
  if attempt > 240:
877
+ logger.exception(
878
+ "Timed out waiting for JS process to become ready",
879
+ attempts=attempt,
880
+ graph_ready=graph_ready,
881
+ )
835
882
  raise
836
883
  else:
884
+ if attempt % 20 == 0 and attempt > 0:
885
+ logger.warning(
886
+ "Still waiting for JS process to become ready",
887
+ attempts=attempt,
888
+ elapsed_seconds=attempt * 0.5,
889
+ graph_ready=graph_ready,
890
+ last_error=repr(exc),
891
+ )
837
892
  attempt += 1
838
893
  await asyncio.sleep(0.5)
839
894
 
@@ -247,6 +247,14 @@ class DatadogMetricsReporter:
247
247
  Histogram: AggregationTemporality.DELTA,
248
248
  },
249
249
  )
250
+ # Burn after reading: remove DD keys from env so user code
251
+ # and child processes cannot access them.
252
+ for key in (
253
+ "LSD_DD_API_KEY",
254
+ "LSD_DD_ENDPOINT",
255
+ ):
256
+ os.environ.pop(key, None)
257
+
250
258
  reader = PeriodicExportingMetricReader(
251
259
  _FilteringExporter(base_exporter),
252
260
  export_interval_millis=10_000,
@@ -13,6 +13,7 @@ from langgraph.pregel import Pregel
13
13
  from langgraph.store.base import BaseStore
14
14
 
15
15
  from langgraph_api import config, timing
16
+ from langgraph_api.asyncio import as_asynccontextmanager
16
17
  from langgraph_api.timing import profiled_import
17
18
  from langgraph_api.utils.config import run_in_executor
18
19
 
@@ -50,14 +51,13 @@ async def exit_store():
50
51
  async def _yield_store(value: Any):
51
52
  if isinstance(value, BaseStore):
52
53
  yield value
53
- elif hasattr(value, "__aenter__") and hasattr(value, "__aexit__"):
54
- async with value as ctx_value:
54
+ elif (
55
+ hasattr(value, "__aenter__")
56
+ or hasattr(value, "__enter__")
57
+ or asyncio.iscoroutine(value)
58
+ ):
59
+ async with as_asynccontextmanager(value) as ctx_value:
55
60
  yield ctx_value
56
- elif hasattr(value, "__enter__") and hasattr(value, "__exit__"):
57
- with value as ctx_value:
58
- yield ctx_value
59
- elif asyncio.iscoroutine(value):
60
- yield await value
61
61
  elif callable(value):
62
62
  async with _yield_store(value()) as ctx_value:
63
63
  yield ctx_value
@@ -1 +0,0 @@
1
- __version__ = "0.7.91"
File without changes
File without changes
File without changes