langgraph-api 0.7.96__tar.gz → 0.7.97__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 (293) hide show
  1. {langgraph_api-0.7.96 → langgraph_api-0.7.97}/PKG-INFO +1 -1
  2. {langgraph_api-0.7.96 → langgraph_api-0.7.97}/benchmark/benchmark-runners/benchmark_profiles.ts +5 -2
  3. {langgraph_api-0.7.96 → langgraph_api-0.7.97}/benchmark/benchmark-runners/stream_write.ts +1 -1
  4. {langgraph_api-0.7.96 → langgraph_api-0.7.97}/healthcheck.py +2 -17
  5. langgraph_api-0.7.97/langgraph_api/__init__.py +1 -0
  6. {langgraph_api-0.7.96 → langgraph_api-0.7.97}/langgraph_api/cli.py +3 -1
  7. {langgraph_api-0.7.96 → langgraph_api-0.7.97}/langgraph_api/config/__init__.py +23 -1
  8. {langgraph_api-0.7.96 → langgraph_api-0.7.97}/langgraph_api/errors.py +10 -0
  9. {langgraph_api-0.7.96 → langgraph_api-0.7.97}/langgraph_api/feature_flags.py +2 -1
  10. {langgraph_api-0.7.96 → langgraph_api-0.7.97}/langgraph_api/graph.py +2 -0
  11. {langgraph_api-0.7.96 → langgraph_api-0.7.97}/langgraph_api/grpc/server.py +4 -4
  12. {langgraph_api-0.7.96 → langgraph_api-0.7.97}/langgraph_api/js/client.mts +17 -5
  13. {langgraph_api-0.7.96 → langgraph_api-0.7.97}/langgraph_api/js/remote.py +23 -1
  14. {langgraph_api-0.7.96 → langgraph_api-0.7.97}/langgraph_api/js/ui.py +1 -0
  15. {langgraph_api-0.7.96 → langgraph_api-0.7.97}/langgraph_api/metadata.py +1 -0
  16. {langgraph_api-0.7.96 → langgraph_api-0.7.97}/langgraph_api/metrics_datadog.py +1 -0
  17. {langgraph_api-0.7.96 → langgraph_api-0.7.97}/langgraph_api/middleware/http_logger.py +1 -0
  18. {langgraph_api-0.7.96 → langgraph_api-0.7.97}/langgraph_api/queue_entrypoint.py +28 -6
  19. {langgraph_api-0.7.96 → langgraph_api-0.7.97}/langgraph_api/server.py +3 -0
  20. {langgraph_api-0.7.96 → langgraph_api-0.7.97}/langgraph_api/traceblock.py +1 -0
  21. {langgraph_api-0.7.96 → langgraph_api-0.7.97}/langgraph_api/tunneling/cloudflare.py +1 -0
  22. langgraph_api-0.7.97/langgraph_api/utils/network.py +49 -0
  23. {langgraph_api-0.7.96 → langgraph_api-0.7.97}/scripts/create_license.py +1 -1
  24. langgraph_api-0.7.96/langgraph_api/__init__.py +0 -1
  25. {langgraph_api-0.7.96 → langgraph_api-0.7.97}/.gitignore +0 -0
  26. {langgraph_api-0.7.96 → langgraph_api-0.7.97}/LICENSE +0 -0
  27. {langgraph_api-0.7.96 → langgraph_api-0.7.97}/Makefile +0 -0
  28. {langgraph_api-0.7.96 → langgraph_api-0.7.97}/README.md +0 -0
  29. {langgraph_api-0.7.96 → langgraph_api-0.7.97}/benchmark/.gitignore +0 -0
  30. {langgraph_api-0.7.96 → langgraph_api-0.7.97}/benchmark/Makefile +0 -0
  31. {langgraph_api-0.7.96 → langgraph_api-0.7.97}/benchmark/README.md +0 -0
  32. {langgraph_api-0.7.96 → langgraph_api-0.7.97}/benchmark/benchmark-runners/assistant.ts +0 -0
  33. {langgraph_api-0.7.96 → langgraph_api-0.7.97}/benchmark/benchmark-runners/benchmark-runner.ts +0 -0
  34. {langgraph_api-0.7.96 → langgraph_api-0.7.97}/benchmark/benchmark-runners/benchmarks.ts +0 -0
  35. {langgraph_api-0.7.96 → langgraph_api-0.7.97}/benchmark/benchmark-runners/cancel_first_second_completes.ts +0 -0
  36. {langgraph_api-0.7.96 → langgraph_api-0.7.97}/benchmark/benchmark-runners/enqueued_runs_order.ts +0 -0
  37. {langgraph_api-0.7.96 → langgraph_api-0.7.97}/benchmark/benchmark-runners/log-failure.ts +0 -0
  38. {langgraph_api-0.7.96 → langgraph_api-0.7.97}/benchmark/benchmark-runners/meta_workload.ts +0 -0
  39. {langgraph_api-0.7.96 → langgraph_api-0.7.97}/benchmark/benchmark-runners/thread.ts +0 -0
  40. {langgraph_api-0.7.96 → langgraph_api-0.7.97}/benchmark/benchmark-runners/thread_runs_metadata_search.ts +0 -0
  41. {langgraph_api-0.7.96 → langgraph_api-0.7.97}/benchmark/benchmark-runners/threads_search_metadata.ts +0 -0
  42. {langgraph_api-0.7.96 → langgraph_api-0.7.97}/benchmark/benchmark-runners/types.ts +0 -0
  43. {langgraph_api-0.7.96 → langgraph_api-0.7.97}/benchmark/benchmark-runners/wait_write.ts +0 -0
  44. {langgraph_api-0.7.96 → langgraph_api-0.7.97}/benchmark/capacity_dd_report.py +0 -0
  45. {langgraph_api-0.7.96 → langgraph_api-0.7.97}/benchmark/capacity_k6.js +0 -0
  46. {langgraph_api-0.7.96 → langgraph_api-0.7.97}/benchmark/capacity_runner.mjs +0 -0
  47. {langgraph_api-0.7.96 → langgraph_api-0.7.97}/benchmark/capacity_slack_report.py +0 -0
  48. {langgraph_api-0.7.96 → langgraph_api-0.7.97}/benchmark/capacity_urls.mjs +0 -0
  49. {langgraph_api-0.7.96 → langgraph_api-0.7.97}/benchmark/clean-cli.js +0 -0
  50. {langgraph_api-0.7.96 → langgraph_api-0.7.97}/benchmark/clean.js +0 -0
  51. {langgraph_api-0.7.96 → langgraph_api-0.7.97}/benchmark/continuous/README.md +0 -0
  52. {langgraph_api-0.7.96 → langgraph_api-0.7.97}/benchmark/continuous/pyproject.toml +0 -0
  53. {langgraph_api-0.7.96 → langgraph_api-0.7.97}/benchmark/continuous/runner.py +0 -0
  54. {langgraph_api-0.7.96 → langgraph_api-0.7.97}/benchmark/continuous/uv.lock +0 -0
  55. {langgraph_api-0.7.96 → langgraph_api-0.7.97}/benchmark/graphs.js +0 -0
  56. {langgraph_api-0.7.96 → langgraph_api-0.7.97}/benchmark/mixed_workload_k6.js +0 -0
  57. {langgraph_api-0.7.96 → langgraph_api-0.7.97}/benchmark/mixed_workload_runner.mjs +0 -0
  58. {langgraph_api-0.7.96 → langgraph_api-0.7.97}/benchmark/package.json +0 -0
  59. {langgraph_api-0.7.96 → langgraph_api-0.7.97}/benchmark/ramp.js +0 -0
  60. {langgraph_api-0.7.96 → langgraph_api-0.7.97}/benchmark/reporting/dd_reporting.py +0 -0
  61. {langgraph_api-0.7.96 → langgraph_api-0.7.97}/benchmark/reporting/slack_slowest_runs.py +0 -0
  62. {langgraph_api-0.7.96 → langgraph_api-0.7.97}/benchmark/reporting/slack_summary.py +0 -0
  63. {langgraph_api-0.7.96 → langgraph_api-0.7.97}/benchmark/run_local.sh +0 -0
  64. {langgraph_api-0.7.96 → langgraph_api-0.7.97}/benchmark/staircase.py +0 -0
  65. {langgraph_api-0.7.96 → langgraph_api-0.7.97}/benchmark/staircase_step_k6.js +0 -0
  66. {langgraph_api-0.7.96 → langgraph_api-0.7.97}/benchmark/tsconfig.json +0 -0
  67. {langgraph_api-0.7.96 → langgraph_api-0.7.97}/benchmark/update-revision.js +0 -0
  68. {langgraph_api-0.7.96 → langgraph_api-0.7.97}/benchmark/weather.js +0 -0
  69. {langgraph_api-0.7.96 → langgraph_api-0.7.97}/constraints.txt +0 -0
  70. {langgraph_api-0.7.96 → langgraph_api-0.7.97}/custom_store.sql +0 -0
  71. {langgraph_api-0.7.96 → langgraph_api-0.7.97}/forbidden.txt +0 -0
  72. {langgraph_api-0.7.96 → langgraph_api-0.7.97}/hatch_build.py +0 -0
  73. {langgraph_api-0.7.96 → langgraph_api-0.7.97}/langgraph-cloud-debugging-20260210132856.zip +0 -0
  74. {langgraph_api-0.7.96 → langgraph_api-0.7.97}/langgraph_api/_checkpointer/__init__.py +0 -0
  75. {langgraph_api-0.7.96 → langgraph_api-0.7.97}/langgraph_api/_checkpointer/_adapter.py +0 -0
  76. {langgraph_api-0.7.96 → langgraph_api-0.7.97}/langgraph_api/_checkpointer/protocol.py +0 -0
  77. {langgraph_api-0.7.96 → langgraph_api-0.7.97}/langgraph_api/_factory_utils.py +0 -0
  78. {langgraph_api-0.7.96 → langgraph_api-0.7.97}/langgraph_api/api/__init__.py +0 -0
  79. {langgraph_api-0.7.96 → langgraph_api-0.7.97}/langgraph_api/api/a2a.py +0 -0
  80. {langgraph_api-0.7.96 → langgraph_api-0.7.97}/langgraph_api/api/assistants.py +0 -0
  81. {langgraph_api-0.7.96 → langgraph_api-0.7.97}/langgraph_api/api/mcp/__init__.py +0 -0
  82. {langgraph_api-0.7.96 → langgraph_api-0.7.97}/langgraph_api/api/mcp/_constants.py +0 -0
  83. {langgraph_api-0.7.96 → langgraph_api-0.7.97}/langgraph_api/api/mcp/_handlers.py +0 -0
  84. {langgraph_api-0.7.96 → langgraph_api-0.7.97}/langgraph_api/api/mcp/_models.py +0 -0
  85. {langgraph_api-0.7.96 → langgraph_api-0.7.97}/langgraph_api/api/mcp/_routes.py +0 -0
  86. {langgraph_api-0.7.96 → langgraph_api-0.7.97}/langgraph_api/api/mcp/_sanitizers.py +0 -0
  87. {langgraph_api-0.7.96 → langgraph_api-0.7.97}/langgraph_api/api/meta.py +0 -0
  88. {langgraph_api-0.7.96 → langgraph_api-0.7.97}/langgraph_api/api/openapi.py +0 -0
  89. {langgraph_api-0.7.96 → langgraph_api-0.7.97}/langgraph_api/api/profile.py +0 -0
  90. {langgraph_api-0.7.96 → langgraph_api-0.7.97}/langgraph_api/api/runs.py +0 -0
  91. {langgraph_api-0.7.96 → langgraph_api-0.7.97}/langgraph_api/api/store.py +0 -0
  92. {langgraph_api-0.7.96 → langgraph_api-0.7.97}/langgraph_api/api/threads.py +0 -0
  93. {langgraph_api-0.7.96 → langgraph_api-0.7.97}/langgraph_api/api/ui.py +0 -0
  94. {langgraph_api-0.7.96 → langgraph_api-0.7.97}/langgraph_api/asgi_transport.py +0 -0
  95. {langgraph_api-0.7.96 → langgraph_api-0.7.97}/langgraph_api/asyncio.py +0 -0
  96. {langgraph_api-0.7.96 → langgraph_api-0.7.97}/langgraph_api/auth/__init__.py +0 -0
  97. {langgraph_api-0.7.96 → langgraph_api-0.7.97}/langgraph_api/auth/custom.py +0 -0
  98. {langgraph_api-0.7.96 → langgraph_api-0.7.97}/langgraph_api/auth/errors.py +0 -0
  99. {langgraph_api-0.7.96 → langgraph_api-0.7.97}/langgraph_api/auth/langsmith/__init__.py +0 -0
  100. {langgraph_api-0.7.96 → langgraph_api-0.7.97}/langgraph_api/auth/langsmith/backend.py +0 -0
  101. {langgraph_api-0.7.96 → langgraph_api-0.7.97}/langgraph_api/auth/langsmith/client.py +0 -0
  102. {langgraph_api-0.7.96 → langgraph_api-0.7.97}/langgraph_api/auth/middleware.py +0 -0
  103. {langgraph_api-0.7.96 → langgraph_api-0.7.97}/langgraph_api/auth/noop.py +0 -0
  104. {langgraph_api-0.7.96 → langgraph_api-0.7.97}/langgraph_api/auth/studio_user.py +0 -0
  105. {langgraph_api-0.7.96 → langgraph_api-0.7.97}/langgraph_api/cache.py +0 -0
  106. {langgraph_api-0.7.96 → langgraph_api-0.7.97}/langgraph_api/command.py +0 -0
  107. {langgraph_api-0.7.96 → langgraph_api-0.7.97}/langgraph_api/config/_parse.py +0 -0
  108. {langgraph_api-0.7.96 → langgraph_api-0.7.97}/langgraph_api/config/schemas.py +0 -0
  109. {langgraph_api-0.7.96 → langgraph_api-0.7.97}/langgraph_api/cron_scheduler.py +0 -0
  110. {langgraph_api-0.7.96 → langgraph_api-0.7.97}/langgraph_api/encryption/__init__.py +0 -0
  111. {langgraph_api-0.7.96 → langgraph_api-0.7.97}/langgraph_api/encryption/aes_json.py +0 -0
  112. {langgraph_api-0.7.96 → langgraph_api-0.7.97}/langgraph_api/encryption/context.py +0 -0
  113. {langgraph_api-0.7.96 → langgraph_api-0.7.97}/langgraph_api/encryption/custom.py +0 -0
  114. {langgraph_api-0.7.96 → langgraph_api-0.7.97}/langgraph_api/encryption/middleware.py +0 -0
  115. {langgraph_api-0.7.96 → langgraph_api-0.7.97}/langgraph_api/encryption/shared.py +0 -0
  116. {langgraph_api-0.7.96 → langgraph_api-0.7.97}/langgraph_api/executor_entrypoint.py +0 -0
  117. {langgraph_api-0.7.96 → langgraph_api-0.7.97}/langgraph_api/grpc/__init__.py +0 -0
  118. {langgraph_api-0.7.96 → langgraph_api-0.7.97}/langgraph_api/grpc/client.py +0 -0
  119. {langgraph_api-0.7.96 → langgraph_api-0.7.97}/langgraph_api/grpc/generated/core_api_pb2.pyi +0 -0
  120. {langgraph_api-0.7.96 → langgraph_api-0.7.97}/langgraph_api/grpc/ops/__init__.py +0 -0
  121. {langgraph_api-0.7.96 → langgraph_api-0.7.97}/langgraph_api/grpc/ops/assistants.py +0 -0
  122. {langgraph_api-0.7.96 → langgraph_api-0.7.97}/langgraph_api/grpc/ops/cache.py +0 -0
  123. {langgraph_api-0.7.96 → langgraph_api-0.7.97}/langgraph_api/grpc/ops/crons.py +0 -0
  124. {langgraph_api-0.7.96 → langgraph_api-0.7.97}/langgraph_api/grpc/ops/runs.py +0 -0
  125. {langgraph_api-0.7.96 → langgraph_api-0.7.97}/langgraph_api/grpc/ops/threads.py +0 -0
  126. {langgraph_api-0.7.96 → langgraph_api-0.7.97}/langgraph_api/grpc/servicers/__init__.py +0 -0
  127. {langgraph_api-0.7.96 → langgraph_api-0.7.97}/langgraph_api/grpc/servicers/checkpointer.py +0 -0
  128. {langgraph_api-0.7.96 → langgraph_api-0.7.97}/langgraph_api/grpc/servicers/encryption.py +0 -0
  129. {langgraph_api-0.7.96 → langgraph_api-0.7.97}/langgraph_api/http.py +0 -0
  130. {langgraph_api-0.7.96 → langgraph_api-0.7.97}/langgraph_api/http_metrics.py +0 -0
  131. {langgraph_api-0.7.96 → langgraph_api-0.7.97}/langgraph_api/http_metrics_utils.py +0 -0
  132. {langgraph_api-0.7.96 → langgraph_api-0.7.97}/langgraph_api/js/.gitignore +0 -0
  133. {langgraph_api-0.7.96 → langgraph_api-0.7.97}/langgraph_api/js/.prettierrc +0 -0
  134. {langgraph_api-0.7.96 → langgraph_api-0.7.97}/langgraph_api/js/__init__.py +0 -0
  135. {langgraph_api-0.7.96 → langgraph_api-0.7.97}/langgraph_api/js/base.py +0 -0
  136. {langgraph_api-0.7.96 → langgraph_api-0.7.97}/langgraph_api/js/build.mts +0 -0
  137. {langgraph_api-0.7.96 → langgraph_api-0.7.97}/langgraph_api/js/client.http.mts +0 -0
  138. {langgraph_api-0.7.96 → langgraph_api-0.7.97}/langgraph_api/js/errors.py +0 -0
  139. {langgraph_api-0.7.96 → langgraph_api-0.7.97}/langgraph_api/js/global.d.ts +0 -0
  140. {langgraph_api-0.7.96 → langgraph_api-0.7.97}/langgraph_api/js/package.json +0 -0
  141. {langgraph_api-0.7.96 → langgraph_api-0.7.97}/langgraph_api/js/schema.py +0 -0
  142. {langgraph_api-0.7.96 → langgraph_api-0.7.97}/langgraph_api/js/src/graph.mts +0 -0
  143. {langgraph_api-0.7.96 → langgraph_api-0.7.97}/langgraph_api/js/src/load.hooks.mjs +0 -0
  144. {langgraph_api-0.7.96 → langgraph_api-0.7.97}/langgraph_api/js/src/preload.mjs +0 -0
  145. {langgraph_api-0.7.96 → langgraph_api-0.7.97}/langgraph_api/js/src/utils/files.mts +0 -0
  146. {langgraph_api-0.7.96 → langgraph_api-0.7.97}/langgraph_api/js/src/utils/importMap.mts +0 -0
  147. {langgraph_api-0.7.96 → langgraph_api-0.7.97}/langgraph_api/js/src/utils/pythonSchemas.mts +0 -0
  148. {langgraph_api-0.7.96 → langgraph_api-0.7.97}/langgraph_api/js/src/utils/serde.mts +0 -0
  149. {langgraph_api-0.7.96 → langgraph_api-0.7.97}/langgraph_api/js/sse.py +0 -0
  150. {langgraph_api-0.7.96 → langgraph_api-0.7.97}/langgraph_api/js/traceblock.mts +0 -0
  151. {langgraph_api-0.7.96 → langgraph_api-0.7.97}/langgraph_api/js/tsconfig.json +0 -0
  152. {langgraph_api-0.7.96 → langgraph_api-0.7.97}/langgraph_api/js/yarn.lock +0 -0
  153. {langgraph_api-0.7.96 → langgraph_api-0.7.97}/langgraph_api/logging.py +0 -0
  154. {langgraph_api-0.7.96 → langgraph_api-0.7.97}/langgraph_api/middleware/__init__.py +0 -0
  155. {langgraph_api-0.7.96 → langgraph_api-0.7.97}/langgraph_api/middleware/ensure_store.py +0 -0
  156. {langgraph_api-0.7.96 → langgraph_api-0.7.97}/langgraph_api/middleware/private_network.py +0 -0
  157. {langgraph_api-0.7.96 → langgraph_api-0.7.97}/langgraph_api/middleware/request_id.py +0 -0
  158. {langgraph_api-0.7.96 → langgraph_api-0.7.97}/langgraph_api/models/__init__.py +0 -0
  159. {langgraph_api-0.7.96 → langgraph_api-0.7.97}/langgraph_api/models/run.py +0 -0
  160. {langgraph_api-0.7.96 → langgraph_api-0.7.97}/langgraph_api/otel_context.py +0 -0
  161. {langgraph_api-0.7.96 → langgraph_api-0.7.97}/langgraph_api/patch.py +0 -0
  162. {langgraph_api-0.7.96 → langgraph_api-0.7.97}/langgraph_api/route.py +0 -0
  163. {langgraph_api-0.7.96 → langgraph_api-0.7.97}/langgraph_api/schema.py +0 -0
  164. {langgraph_api-0.7.96 → langgraph_api-0.7.97}/langgraph_api/self_hosted_logs.py +0 -0
  165. {langgraph_api-0.7.96 → langgraph_api-0.7.97}/langgraph_api/self_hosted_metrics.py +0 -0
  166. {langgraph_api-0.7.96 → langgraph_api-0.7.97}/langgraph_api/serde.py +0 -0
  167. {langgraph_api-0.7.96 → langgraph_api-0.7.97}/langgraph_api/sse.py +0 -0
  168. {langgraph_api-0.7.96 → langgraph_api-0.7.97}/langgraph_api/state.py +0 -0
  169. {langgraph_api-0.7.96 → langgraph_api-0.7.97}/langgraph_api/store.py +0 -0
  170. {langgraph_api-0.7.96 → langgraph_api-0.7.97}/langgraph_api/stream.py +0 -0
  171. {langgraph_api-0.7.96 → langgraph_api-0.7.97}/langgraph_api/timing/__init__.py +0 -0
  172. {langgraph_api-0.7.96 → langgraph_api-0.7.97}/langgraph_api/timing/profiler.py +0 -0
  173. {langgraph_api-0.7.96 → langgraph_api-0.7.97}/langgraph_api/timing/timer.py +0 -0
  174. {langgraph_api-0.7.96 → langgraph_api-0.7.97}/langgraph_api/utils/__init__.py +0 -0
  175. {langgraph_api-0.7.96 → langgraph_api-0.7.97}/langgraph_api/utils/cache.py +0 -0
  176. {langgraph_api-0.7.96 → langgraph_api-0.7.97}/langgraph_api/utils/config.py +0 -0
  177. {langgraph_api-0.7.96 → langgraph_api-0.7.97}/langgraph_api/utils/errors.py +0 -0
  178. {langgraph_api-0.7.96 → langgraph_api-0.7.97}/langgraph_api/utils/extract.py +0 -0
  179. {langgraph_api-0.7.96 → langgraph_api-0.7.97}/langgraph_api/utils/future.py +0 -0
  180. {langgraph_api-0.7.96 → langgraph_api-0.7.97}/langgraph_api/utils/headers.py +0 -0
  181. {langgraph_api-0.7.96 → langgraph_api-0.7.97}/langgraph_api/utils/retriable_client.py +0 -0
  182. {langgraph_api-0.7.96 → langgraph_api-0.7.97}/langgraph_api/utils/stream_codec.py +0 -0
  183. {langgraph_api-0.7.96 → langgraph_api-0.7.97}/langgraph_api/utils/uuids.py +0 -0
  184. {langgraph_api-0.7.96 → langgraph_api-0.7.97}/langgraph_api/validation.py +0 -0
  185. {langgraph_api-0.7.96 → langgraph_api-0.7.97}/langgraph_api/webhook.py +0 -0
  186. {langgraph_api-0.7.96 → langgraph_api-0.7.97}/langgraph_api/worker.py +0 -0
  187. {langgraph_api-0.7.96 → langgraph_api-0.7.97}/langgraph_grpc_common/__init__.py +0 -0
  188. {langgraph_api-0.7.96 → langgraph_api-0.7.97}/langgraph_grpc_common/checkpointer.py +0 -0
  189. {langgraph_api-0.7.96 → langgraph_api-0.7.97}/langgraph_grpc_common/conversion/__init__.py +0 -0
  190. {langgraph_api-0.7.96 → langgraph_api-0.7.97}/langgraph_grpc_common/conversion/_compat.py +0 -0
  191. {langgraph_api-0.7.96 → langgraph_api-0.7.97}/langgraph_grpc_common/conversion/channel.py +0 -0
  192. {langgraph_api-0.7.96 → langgraph_api-0.7.97}/langgraph_grpc_common/conversion/checkpoint.py +0 -0
  193. {langgraph_api-0.7.96 → langgraph_api-0.7.97}/langgraph_grpc_common/conversion/config.py +0 -0
  194. {langgraph_api-0.7.96 → langgraph_api-0.7.97}/langgraph_grpc_common/conversion/durability.py +0 -0
  195. {langgraph_api-0.7.96 → langgraph_api-0.7.97}/langgraph_grpc_common/conversion/exception.py +0 -0
  196. {langgraph_api-0.7.96 → langgraph_api-0.7.97}/langgraph_grpc_common/conversion/graph.py +0 -0
  197. {langgraph_api-0.7.96 → langgraph_api-0.7.97}/langgraph_grpc_common/conversion/interrupt.py +0 -0
  198. {langgraph_api-0.7.96 → langgraph_api-0.7.97}/langgraph_grpc_common/conversion/messages.py +0 -0
  199. {langgraph_api-0.7.96 → langgraph_api-0.7.97}/langgraph_grpc_common/conversion/orchestrator_response.py +0 -0
  200. {langgraph_api-0.7.96 → langgraph_api-0.7.97}/langgraph_grpc_common/conversion/runopts.py +0 -0
  201. {langgraph_api-0.7.96 → langgraph_api-0.7.97}/langgraph_grpc_common/conversion/stream_mode.py +0 -0
  202. {langgraph_api-0.7.96 → langgraph_api-0.7.97}/langgraph_grpc_common/conversion/struct.py +0 -0
  203. {langgraph_api-0.7.96 → langgraph_api-0.7.97}/langgraph_grpc_common/conversion/task.py +0 -0
  204. {langgraph_api-0.7.96 → langgraph_api-0.7.97}/langgraph_grpc_common/conversion/value.py +0 -0
  205. {langgraph_api-0.7.96 → langgraph_api-0.7.97}/langgraph_grpc_common/proto/__init__.py +0 -0
  206. {langgraph_api-0.7.96 → langgraph_api-0.7.97}/langgraph_grpc_common/proto/checkpointer_pb2.py +0 -0
  207. {langgraph_api-0.7.96 → langgraph_api-0.7.97}/langgraph_grpc_common/proto/checkpointer_pb2.pyi +0 -0
  208. {langgraph_api-0.7.96 → langgraph_api-0.7.97}/langgraph_grpc_common/proto/checkpointer_pb2_grpc.py +0 -0
  209. {langgraph_api-0.7.96 → langgraph_api-0.7.97}/langgraph_grpc_common/proto/checkpointer_pb2_grpc.pyi +0 -0
  210. {langgraph_api-0.7.96 → langgraph_api-0.7.97}/langgraph_grpc_common/proto/core_api_pb2.py +0 -0
  211. {langgraph_api-0.7.96 → langgraph_api-0.7.97}/langgraph_grpc_common/proto/core_api_pb2.pyi +0 -0
  212. {langgraph_api-0.7.96 → langgraph_api-0.7.97}/langgraph_grpc_common/proto/core_api_pb2_grpc.py +0 -0
  213. {langgraph_api-0.7.96 → langgraph_api-0.7.97}/langgraph_grpc_common/proto/core_api_pb2_grpc.pyi +0 -0
  214. {langgraph_api-0.7.96 → langgraph_api-0.7.97}/langgraph_grpc_common/proto/encryption_pb2.py +0 -0
  215. {langgraph_api-0.7.96 → langgraph_api-0.7.97}/langgraph_grpc_common/proto/encryption_pb2.pyi +0 -0
  216. {langgraph_api-0.7.96 → langgraph_api-0.7.97}/langgraph_grpc_common/proto/encryption_pb2_grpc.py +0 -0
  217. {langgraph_api-0.7.96 → langgraph_api-0.7.97}/langgraph_grpc_common/proto/encryption_pb2_grpc.pyi +0 -0
  218. {langgraph_api-0.7.96 → langgraph_api-0.7.97}/langgraph_grpc_common/proto/engine_api_pb2.py +0 -0
  219. {langgraph_api-0.7.96 → langgraph_api-0.7.97}/langgraph_grpc_common/proto/engine_api_pb2.pyi +0 -0
  220. {langgraph_api-0.7.96 → langgraph_api-0.7.97}/langgraph_grpc_common/proto/engine_api_pb2_grpc.py +0 -0
  221. {langgraph_api-0.7.96 → langgraph_api-0.7.97}/langgraph_grpc_common/proto/engine_api_pb2_grpc.pyi +0 -0
  222. {langgraph_api-0.7.96 → langgraph_api-0.7.97}/langgraph_grpc_common/proto/engine_common_pb2.py +0 -0
  223. {langgraph_api-0.7.96 → langgraph_api-0.7.97}/langgraph_grpc_common/proto/engine_common_pb2.pyi +0 -0
  224. {langgraph_api-0.7.96 → langgraph_api-0.7.97}/langgraph_grpc_common/proto/engine_common_pb2_grpc.py +0 -0
  225. {langgraph_api-0.7.96 → langgraph_api-0.7.97}/langgraph_grpc_common/proto/engine_common_pb2_grpc.pyi +0 -0
  226. {langgraph_api-0.7.96 → langgraph_api-0.7.97}/langgraph_grpc_common/proto/enum_cancel_run_action_pb2.py +0 -0
  227. {langgraph_api-0.7.96 → langgraph_api-0.7.97}/langgraph_grpc_common/proto/enum_cancel_run_action_pb2.pyi +0 -0
  228. {langgraph_api-0.7.96 → langgraph_api-0.7.97}/langgraph_grpc_common/proto/enum_cancel_run_action_pb2_grpc.py +0 -0
  229. {langgraph_api-0.7.96 → langgraph_api-0.7.97}/langgraph_grpc_common/proto/enum_cancel_run_action_pb2_grpc.pyi +0 -0
  230. {langgraph_api-0.7.96 → langgraph_api-0.7.97}/langgraph_grpc_common/proto/enum_control_signal_pb2.py +0 -0
  231. {langgraph_api-0.7.96 → langgraph_api-0.7.97}/langgraph_grpc_common/proto/enum_control_signal_pb2.pyi +0 -0
  232. {langgraph_api-0.7.96 → langgraph_api-0.7.97}/langgraph_grpc_common/proto/enum_control_signal_pb2_grpc.py +0 -0
  233. {langgraph_api-0.7.96 → langgraph_api-0.7.97}/langgraph_grpc_common/proto/enum_control_signal_pb2_grpc.pyi +0 -0
  234. {langgraph_api-0.7.96 → langgraph_api-0.7.97}/langgraph_grpc_common/proto/enum_cron_on_run_completed_pb2.py +0 -0
  235. {langgraph_api-0.7.96 → langgraph_api-0.7.97}/langgraph_grpc_common/proto/enum_cron_on_run_completed_pb2.pyi +0 -0
  236. {langgraph_api-0.7.96 → langgraph_api-0.7.97}/langgraph_grpc_common/proto/enum_cron_on_run_completed_pb2_grpc.py +0 -0
  237. {langgraph_api-0.7.96 → langgraph_api-0.7.97}/langgraph_grpc_common/proto/enum_cron_on_run_completed_pb2_grpc.pyi +0 -0
  238. {langgraph_api-0.7.96 → langgraph_api-0.7.97}/langgraph_grpc_common/proto/enum_durability_pb2.py +0 -0
  239. {langgraph_api-0.7.96 → langgraph_api-0.7.97}/langgraph_grpc_common/proto/enum_durability_pb2.pyi +0 -0
  240. {langgraph_api-0.7.96 → langgraph_api-0.7.97}/langgraph_grpc_common/proto/enum_durability_pb2_grpc.py +0 -0
  241. {langgraph_api-0.7.96 → langgraph_api-0.7.97}/langgraph_grpc_common/proto/enum_durability_pb2_grpc.pyi +0 -0
  242. {langgraph_api-0.7.96 → langgraph_api-0.7.97}/langgraph_grpc_common/proto/enum_multitask_strategy_pb2.py +0 -0
  243. {langgraph_api-0.7.96 → langgraph_api-0.7.97}/langgraph_grpc_common/proto/enum_multitask_strategy_pb2.pyi +0 -0
  244. {langgraph_api-0.7.96 → langgraph_api-0.7.97}/langgraph_grpc_common/proto/enum_multitask_strategy_pb2_grpc.py +0 -0
  245. {langgraph_api-0.7.96 → langgraph_api-0.7.97}/langgraph_grpc_common/proto/enum_multitask_strategy_pb2_grpc.pyi +0 -0
  246. {langgraph_api-0.7.96 → langgraph_api-0.7.97}/langgraph_grpc_common/proto/enum_run_status_pb2.py +0 -0
  247. {langgraph_api-0.7.96 → langgraph_api-0.7.97}/langgraph_grpc_common/proto/enum_run_status_pb2.pyi +0 -0
  248. {langgraph_api-0.7.96 → langgraph_api-0.7.97}/langgraph_grpc_common/proto/enum_run_status_pb2_grpc.py +0 -0
  249. {langgraph_api-0.7.96 → langgraph_api-0.7.97}/langgraph_grpc_common/proto/enum_run_status_pb2_grpc.pyi +0 -0
  250. {langgraph_api-0.7.96 → langgraph_api-0.7.97}/langgraph_grpc_common/proto/enum_store_operation_entry_type_pb2.py +0 -0
  251. {langgraph_api-0.7.96 → langgraph_api-0.7.97}/langgraph_grpc_common/proto/enum_store_operation_entry_type_pb2.pyi +0 -0
  252. {langgraph_api-0.7.96 → langgraph_api-0.7.97}/langgraph_grpc_common/proto/enum_store_operation_entry_type_pb2_grpc.py +0 -0
  253. {langgraph_api-0.7.96 → langgraph_api-0.7.97}/langgraph_grpc_common/proto/enum_store_operation_entry_type_pb2_grpc.pyi +0 -0
  254. {langgraph_api-0.7.96 → langgraph_api-0.7.97}/langgraph_grpc_common/proto/enum_stream_mode_pb2.py +0 -0
  255. {langgraph_api-0.7.96 → langgraph_api-0.7.97}/langgraph_grpc_common/proto/enum_stream_mode_pb2.pyi +0 -0
  256. {langgraph_api-0.7.96 → langgraph_api-0.7.97}/langgraph_grpc_common/proto/enum_stream_mode_pb2_grpc.py +0 -0
  257. {langgraph_api-0.7.96 → langgraph_api-0.7.97}/langgraph_grpc_common/proto/enum_stream_mode_pb2_grpc.pyi +0 -0
  258. {langgraph_api-0.7.96 → langgraph_api-0.7.97}/langgraph_grpc_common/proto/enum_thread_status_pb2.py +0 -0
  259. {langgraph_api-0.7.96 → langgraph_api-0.7.97}/langgraph_grpc_common/proto/enum_thread_status_pb2.pyi +0 -0
  260. {langgraph_api-0.7.96 → langgraph_api-0.7.97}/langgraph_grpc_common/proto/enum_thread_status_pb2_grpc.py +0 -0
  261. {langgraph_api-0.7.96 → langgraph_api-0.7.97}/langgraph_grpc_common/proto/enum_thread_status_pb2_grpc.pyi +0 -0
  262. {langgraph_api-0.7.96 → langgraph_api-0.7.97}/langgraph_grpc_common/proto/enum_thread_stream_mode_pb2.py +0 -0
  263. {langgraph_api-0.7.96 → langgraph_api-0.7.97}/langgraph_grpc_common/proto/enum_thread_stream_mode_pb2.pyi +0 -0
  264. {langgraph_api-0.7.96 → langgraph_api-0.7.97}/langgraph_grpc_common/proto/enum_thread_stream_mode_pb2_grpc.py +0 -0
  265. {langgraph_api-0.7.96 → langgraph_api-0.7.97}/langgraph_grpc_common/proto/enum_thread_stream_mode_pb2_grpc.pyi +0 -0
  266. {langgraph_api-0.7.96 → langgraph_api-0.7.97}/langgraph_grpc_common/proto/errors_pb2.py +0 -0
  267. {langgraph_api-0.7.96 → langgraph_api-0.7.97}/langgraph_grpc_common/proto/errors_pb2.pyi +0 -0
  268. {langgraph_api-0.7.96 → langgraph_api-0.7.97}/langgraph_grpc_common/proto/errors_pb2_grpc.py +0 -0
  269. {langgraph_api-0.7.96 → langgraph_api-0.7.97}/langgraph_grpc_common/proto/errors_pb2_grpc.pyi +0 -0
  270. {langgraph_api-0.7.96 → langgraph_api-0.7.97}/langgraph_grpc_common/proto/executor_api_pb2.py +0 -0
  271. {langgraph_api-0.7.96 → langgraph_api-0.7.97}/langgraph_grpc_common/proto/executor_api_pb2.pyi +0 -0
  272. {langgraph_api-0.7.96 → langgraph_api-0.7.97}/langgraph_grpc_common/proto/executor_api_pb2_grpc.py +0 -0
  273. {langgraph_api-0.7.96 → langgraph_api-0.7.97}/langgraph_grpc_common/proto/executor_api_pb2_grpc.pyi +0 -0
  274. {langgraph_api-0.7.96 → langgraph_api-0.7.97}/langgraph_grpc_common/sanitize.py +0 -0
  275. {langgraph_api-0.7.96 → langgraph_api-0.7.97}/langgraph_grpc_common/serde.py +0 -0
  276. {langgraph_api-0.7.96 → langgraph_api-0.7.97}/langgraph_license/__init__.py +0 -0
  277. {langgraph_api-0.7.96 → langgraph_api-0.7.97}/langgraph_license/validation.py +0 -0
  278. {langgraph_api-0.7.96 → langgraph_api-0.7.97}/langgraph_runtime/__init__.py +0 -0
  279. {langgraph_api-0.7.96 → langgraph_api-0.7.97}/langgraph_runtime/checkpoint.py +0 -0
  280. {langgraph_api-0.7.96 → langgraph_api-0.7.97}/langgraph_runtime/database.py +0 -0
  281. {langgraph_api-0.7.96 → langgraph_api-0.7.97}/langgraph_runtime/lifespan.py +0 -0
  282. {langgraph_api-0.7.96 → langgraph_api-0.7.97}/langgraph_runtime/metrics.py +0 -0
  283. {langgraph_api-0.7.96 → langgraph_api-0.7.97}/langgraph_runtime/ops.py +0 -0
  284. {langgraph_api-0.7.96 → langgraph_api-0.7.97}/langgraph_runtime/queue.py +0 -0
  285. {langgraph_api-0.7.96 → langgraph_api-0.7.97}/langgraph_runtime/retry.py +0 -0
  286. {langgraph_api-0.7.96 → langgraph_api-0.7.97}/langgraph_runtime/routes.py +0 -0
  287. {langgraph_api-0.7.96 → langgraph_api-0.7.97}/langgraph_runtime/store.py +0 -0
  288. {langgraph_api-0.7.96 → langgraph_api-0.7.97}/logging.json +0 -0
  289. {langgraph_api-0.7.96 → langgraph_api-0.7.97}/openapi.json +0 -0
  290. {langgraph_api-0.7.96 → langgraph_api-0.7.97}/pyproject.toml +0 -0
  291. {langgraph_api-0.7.96 → langgraph_api-0.7.97}/scripts/build_wheel.py +0 -0
  292. {langgraph_api-0.7.96 → langgraph_api-0.7.97}/scripts/run_a2a_tck.py +0 -0
  293. {langgraph_api-0.7.96 → langgraph_api-0.7.97}/uv.lock +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: langgraph-api
3
- Version: 0.7.96
3
+ Version: 0.7.97
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
@@ -1,3 +1,5 @@
1
+ import { BenchmarkGraphOptions } from "./types";
2
+
1
3
  export interface BenchmarkContext {
2
4
  delay: number;
3
5
  delay_jitter_ratio: number;
@@ -208,8 +210,9 @@ export function resolveBenchmarkContext(
208
210
  * There are two possible counts for expected events: normal and burst.
209
211
  * ratio * (expected_steps * expand) + 2 will be the min, but could be larger if we hit bursts.
210
212
  */
211
- export function getExpectedEvents(context: BenchmarkContext): number {
212
- return (3 + context.stream_size / context.chunk_size) * (context.steps * context.expand) + 2;
213
+ export function getExpectedEvents(benchmarkGraphOptions: BenchmarkGraphOptions): number {
214
+ const messages_per_step = benchmarkGraphOptions.resumable ? 3 + benchmarkGraphOptions.context.stream_size / benchmarkGraphOptions.context.chunk_size : 1;
215
+ return messages_per_step * (benchmarkGraphOptions.context.steps * benchmarkGraphOptions.context.expand) + 2;
213
216
  }
214
217
 
215
218
  function parseOptionalInt(value?: string): number | undefined {
@@ -52,7 +52,7 @@ export class StreamWrite extends BenchmarkRunner {
52
52
  benchmarkGraphOptions: BenchmarkGraphOptions
53
53
  ): boolean {
54
54
  const expected_steps = benchmarkGraphOptions.context.steps;
55
- const expected_events = getExpectedEvents(benchmarkGraphOptions.context);
55
+ const expected_events = getExpectedEvents(benchmarkGraphOptions);
56
56
  const events = result.data?.events ?? [];
57
57
  const hasExpectedCounter = events.some((event) => {
58
58
  if (!event?.data || typeof event.data !== 'object') return false;
@@ -1,29 +1,14 @@
1
1
  import json
2
2
  import os
3
3
  import urllib.request
4
- from ipaddress import IPv6Address, ip_address
5
4
 
6
5
  from langgraph_api import config
6
+ from langgraph_api.utils.network import get_healthcheck_url_host
7
7
 
8
8
 
9
9
  def get_healthcheck_host() -> str:
10
10
  server_host = os.environ.get("LANGGRAPH_SERVER_HOST", "0.0.0.0")
11
- if server_host in (
12
- "0.0.0.0", # IPv4 wildcard
13
- "", # IPv4/IPv6 dual-stack
14
- ):
15
- return "localhost"
16
-
17
- try:
18
- server_host_ip = ip_address(server_host)
19
- except ValueError:
20
- return server_host
21
-
22
- return (
23
- f"[{server_host_ip.compressed}]"
24
- if isinstance(server_host_ip, IPv6Address)
25
- else server_host_ip.compressed
26
- )
11
+ return get_healthcheck_url_host(server_host)
27
12
 
28
13
 
29
14
  def healthcheck():
@@ -0,0 +1 @@
1
+ __version__ = "0.7.97"
@@ -21,6 +21,7 @@ if typing.TYPE_CHECKING:
21
21
  from packaging.version import Version
22
22
 
23
23
  from langgraph_api.config import AuthConfig, HttpConfig, StoreConfig
24
+ from langgraph_api.utils.network import format_hostport
24
25
 
25
26
  logging.basicConfig(level=logging.INFO)
26
27
  logger = logging.getLogger(__name__)
@@ -210,7 +211,7 @@ def run_server(
210
211
  logger.info("Debugger attached. Starting server...")
211
212
 
212
213
  # Determine local or tunneled URL
213
- upstream_url = f"http://{host}:{port}"
214
+ upstream_url = f"http://{format_hostport(host, port)}"
214
215
  if mount_prefix:
215
216
  upstream_url += mount_prefix
216
217
  if tunnel:
@@ -330,6 +331,7 @@ For production use, please use LangSmith Deployment.
330
331
  logger.info(welcome)
331
332
  if open_browser:
332
333
  threading.Thread(target=_open_browser, daemon=True).start()
334
+ # Not in public docs: LANGGRAPH_NO_VERSION_CHECK is dev-only
333
335
  nvc = os.getenv("LANGGRAPH_NO_VERSION_CHECK")
334
336
  if nvc is None or nvc.lower() not in ("true", "1"):
335
337
  from langgraph_api import __version__ # noqa: PLC0415
@@ -40,7 +40,9 @@ STATS_INTERVAL_SECS = env("STATS_INTERVAL_SECS", cast=int, default=60)
40
40
 
41
41
  # storage
42
42
 
43
+ # Not in public docs: infrastructure, set by platform
43
44
  DATABASE_URI = env("DATABASE_URI", cast=str, default=getenv("POSTGRES_URI", undefined))
45
+ # Not in public docs: infrastructure, set by platform
44
46
  MIGRATIONS_PATH = env("MIGRATIONS_PATH", cast=str, default="/storage/migrations")
45
47
  POSTGRES_POOL_MAX_SIZE = env("LANGGRAPH_POSTGRES_POOL_MAX_SIZE", cast=int, default=150)
46
48
  RESUMABLE_STREAM_TTL_SECONDS = env(
@@ -122,6 +124,7 @@ LANGGRAPH_AES_JSON_KEYS: frozenset[str] | None = env(
122
124
  )
123
125
 
124
126
  # redis
127
+ # Not in public docs: infrastructure, set by platform
125
128
  REDIS_URI = env("REDIS_URI", cast=str)
126
129
  REDIS_CLUSTER = env("REDIS_CLUSTER", cast=bool, default=False)
127
130
  REDIS_MAX_CONNECTIONS = env("REDIS_MAX_CONNECTIONS", cast=int, default=2000)
@@ -148,16 +151,20 @@ HTTP_MAX_REQUEST_BODY_BYTES = env(
148
151
  )
149
152
 
150
153
  # gRPC message size limits (300MB default)
154
+ # Not in public docs: infrastructure, set by platform
151
155
  LSD_GRPC_SERVER_MAX_RECV_MSG_BYTES = env(
152
156
  "LSD_GRPC_SERVER_MAX_RECV_MSG_BYTES", cast=int, default=300 * 1024 * 1024
153
157
  )
158
+ # Not in public docs: infrastructure, set by platform
154
159
  LSD_GRPC_SERVER_MAX_SEND_MSG_BYTES = env(
155
160
  "LSD_GRPC_SERVER_MAX_SEND_MSG_BYTES", cast=int, default=300 * 1024 * 1024
156
161
  )
157
162
  LSD_PUBLISH_QUEUE_SIZE = env("LSD_PUBLISH_QUEUE_SIZE", cast=int, default=512)
163
+ # Not in public docs: infrastructure, set by platform
158
164
  GRPC_CLIENT_MAX_RECV_MSG_BYTES = env(
159
165
  "GRPC_CLIENT_MAX_RECV_MSG_BYTES", cast=int, default=300 * 1024 * 1024
160
166
  )
167
+ # Not in public docs: infrastructure, set by platform
161
168
  GRPC_CLIENT_MAX_SEND_MSG_BYTES = env(
162
169
  "GRPC_CLIENT_MAX_SEND_MSG_BYTES", cast=int, default=300 * 1024 * 1024
163
170
  )
@@ -167,7 +174,7 @@ GRPC_CLIENT_HTTP2_INITIAL_WINDOW_SIZE = env(
167
174
  LSD_GRPC_SERVER_ADDRESS = env(
168
175
  "LSD_GRPC_SERVER_ADDRESS",
169
176
  cast=str,
170
- default="127.0.0.1:50051",
177
+ default="localhost:50051",
171
178
  )
172
179
 
173
180
  # Python gRPC server settings (for encryption/checkpointer services called by Go)
@@ -180,10 +187,12 @@ PYTHON_GRPC_BIND_HOST = env("PYTHON_GRPC_BIND_HOST", cast=str, default="127.0.0.
180
187
  # (Otherwise, the payload is parsed directly in the event loop.)
181
188
  JSON_THREAD_POOL_MINIMUM_SIZE_BYTES = 100 * 1024 # 100 KB
182
189
 
190
+ # Not in public docs: populated by langgraph.json config, not set as env var directly
183
191
  HTTP_CONFIG = env("LANGGRAPH_HTTP", cast=_parse.parse_schema(HttpConfig), default=None)
184
192
  MCP_ENABLED = HTTP_CONFIG is None or not HTTP_CONFIG.get("disable_mcp")
185
193
  A2A_ENABLED = HTTP_CONFIG is None or not HTTP_CONFIG.get("disable_a2a")
186
194
  WEBHOOKS_ENABLED = HTTP_CONFIG and HTTP_CONFIG.get("disable_webhooks")
195
+ # Not in public docs: populated by langgraph.json config, not set as env var directly
187
196
  STORE_CONFIG = env(
188
197
  "LANGGRAPH_STORE", cast=_parse.parse_schema(StoreConfig), default=None
189
198
  )
@@ -284,6 +293,7 @@ MAX_STREAM_CHUNK_SIZE_BYTES = env(
284
293
  )
285
294
 
286
295
 
296
+ # Not in public docs: populated by langgraph.json config, not set as env var directly
287
297
  CHECKPOINTER_CONFIG: CheckpointerConfig | None = _parse.parse_checkpointer(
288
298
  env("LANGGRAPH_CHECKPOINTER", cast=str, default=None)
289
299
  )
@@ -340,6 +350,7 @@ FF_ASYNC_PUBLISH_QUEUE = env("FF_ASYNC_PUBLISH_QUEUE", cast=bool, default=False)
340
350
  FF_CRONS_ENABLED = env("FF_CRONS_ENABLED", cast=bool, default=True)
341
351
  FF_LOG_DROPPED_EVENTS = env("FF_LOG_DROPPED_EVENTS", cast=bool, default=False)
342
352
  FF_LOG_QUERY_AND_PARAMS = env("FF_LOG_QUERY_AND_PARAMS", cast=bool, default=False)
353
+ # Not in public docs: internal feature flag
343
354
  FF_USE_REDIS_QUEUE = env("FF_USE_REDIS_QUEUE", cast=bool, default=False)
344
355
 
345
356
  # Internal flag intended for testing only
@@ -349,6 +360,7 @@ CRON_SCHEDULER_SLEEP_TIME = env("CRON_SCHEDULER_SLEEP_TIME", cast=int, default=5
349
360
  # auth
350
361
 
351
362
  LANGGRAPH_AUTH_TYPE = env("LANGGRAPH_AUTH_TYPE", cast=str, default="noop")
363
+ # Not in public docs: populated by langgraph.json config, not set as env var directly
352
364
  LANGGRAPH_POSTGRES_EXTENSIONS: Literal["standard", "lite"] = env(
353
365
  "LANGGRAPH_POSTGRES_EXTENSIONS", cast=str, default="standard"
354
366
  )
@@ -356,12 +368,15 @@ if LANGGRAPH_POSTGRES_EXTENSIONS not in ("standard", "lite"):
356
368
  raise ValueError(
357
369
  f"Unknown LANGGRAPH_POSTGRES_EXTENSIONS value: {LANGGRAPH_POSTGRES_EXTENSIONS}"
358
370
  )
371
+ # Not in public docs: populated by langgraph.json config, not set as env var directly
359
372
  LANGGRAPH_AUTH = env(
360
373
  "LANGGRAPH_AUTH", cast=_parse.parse_schema(AuthConfig), default=None
361
374
  )
375
+ # Not in public docs: populated by langgraph.json config, not set as env var directly
362
376
  LANGGRAPH_ENCRYPTION = env(
363
377
  "LANGGRAPH_ENCRYPTION", cast=_parse.parse_schema(EncryptionConfig), default=None
364
378
  )
379
+ # Not in public docs: set by SaaS control plane, not user-configurable
365
380
  LANGSMITH_TENANT_ID = env("LANGSMITH_TENANT_ID", cast=str, default=None)
366
381
  LANGSMITH_AUTH_VERIFY_TENANT_ID = env(
367
382
  "LANGSMITH_AUTH_VERIFY_TENANT_ID",
@@ -412,6 +427,7 @@ LANGSMITH_LICENSE_REQUIRED_CLAIMS = env(
412
427
  "LANGSMITH_LICENSE_REQUIRED_CLAIMS", cast=CommaSeparatedStrings, default=[]
413
428
  )
414
429
 
430
+ # Not in public docs: LANGCHAIN_API_KEY is a legacy alias (prefer LANGSMITH_API_KEY)
415
431
  LANGSMITH_API_KEY = env(
416
432
  "LANGSMITH_API_KEY", cast=str, default=getenv("LANGCHAIN_API_KEY", "")
417
433
  )
@@ -464,6 +480,7 @@ if OTEL_ENABLED is None:
464
480
 
465
481
  # if variant is "licensed", update to "local" if using LANGSMITH_CONTROL_PLANE_API_KEY instead
466
482
 
483
+ # Not in public docs: LANGSMITH_LANGGRAPH_API_VARIANT is set by SaaS control plane
467
484
  if (
468
485
  getenv("LANGSMITH_LANGGRAPH_API_VARIANT") == "licensed"
469
486
  and LANGSMITH_CONTROL_PLANE_API_KEY
@@ -492,16 +509,20 @@ LANGGRAPH_METRICS_ENDPOINT = env("LANGGRAPH_METRICS_ENDPOINT", cast=str, default
492
509
  LANGGRAPH_METRICS_EXPORT_INTERVAL_MS = env(
493
510
  "LANGGRAPH_METRICS_EXPORT_INTERVAL_MS", cast=int, default=60000
494
511
  )
512
+ # Not in public docs: infrastructure, set by platform
495
513
  LSD_DD_API_KEY = _first_non_empty(
496
514
  env("LSD_DD_API_KEY", cast=str, default=None),
497
515
  env("CUSTOM_LSD_DD_API_KEY", cast=str, default=None),
498
516
  )
517
+ # Not in public docs: infrastructure, set by platform
499
518
  LSD_DD_ENDPOINT = _first_non_empty(
500
519
  env("LSD_DD_ENDPOINT", cast=str, default=None),
501
520
  env("CUSTOM_LSD_DD_ENDPOINT", cast=str, default=None),
502
521
  "otlp.us5.datadoghq.com",
503
522
  )
523
+ # Not in public docs: infrastructure, set by platform
504
524
  METRIC_PREFIX = env("METRIC_PREFIX", cast=str, default="lg_api_")
525
+ # Not in public docs: infrastructure, set by platform
505
526
  METRIC_MAX_EMITTING_TIER = env("METRIC_MAX_EMITTING_TIER", cast=int, default=2)
506
527
  DATADOG_METRICS_ENABLED = bool(LSD_DD_API_KEY)
507
528
  LANGGRAPH_LOGS_ENDPOINT = env("LANGGRAPH_LOGS_ENDPOINT", cast=str, default=None)
@@ -530,6 +551,7 @@ IS_EXECUTOR_ENTRYPOINT = False
530
551
  PYTHON_GRPC_SERVER_ENABLED = bool(LANGGRAPH_ENCRYPTION or USE_CUSTOM_CHECKPOINTER)
531
552
 
532
553
 
554
+ # Not in public docs: LANGSMITH_LANGGRAPH_GIT_REF_SHA is set by SaaS control plane
533
555
  ref_sha = None
534
556
  if not os.getenv("LANGCHAIN_REVISION_ID") and (
535
557
  ref_sha := os.getenv("LANGSMITH_LANGGRAPH_GIT_REF_SHA")
@@ -4,6 +4,8 @@ from starlette.exceptions import HTTPException
4
4
  from starlette.requests import Request
5
5
  from starlette.responses import JSONResponse, Response
6
6
 
7
+ from langgraph_api.js.errors import RemoteException
8
+
7
9
  logger = structlog.stdlib.get_logger(__name__)
8
10
 
9
11
 
@@ -34,6 +36,7 @@ async def http_exception_handler(request: Request, exc: HTTPException) -> Respon
34
36
 
35
37
 
36
38
  async def validation_error_handler(request, exc: jsonschema_rs.ValidationError):
39
+ request.scope["error_detail"] = str(exc)
37
40
  return await http_exception_handler(
38
41
  request, HTTPException(status_code=422, detail=str(exc))
39
42
  )
@@ -46,6 +49,13 @@ async def value_error_handler(request, exc: ValueError):
46
49
  )
47
50
 
48
51
 
52
+ async def remote_exception_handler(request, exc: RemoteException):
53
+ logger.exception("Remote Exception", exc_info=exc)
54
+ return await http_exception_handler(
55
+ request, HTTPException(status_code=500, detail=str(exc))
56
+ )
57
+
58
+
49
59
  async def overloaded_error_handler(request, exc: ValueError):
50
60
  logger.exception("Overloaded Error", exc_info=exc)
51
61
  return await http_exception_handler(
@@ -12,10 +12,11 @@ USE_DURABILITY = LANGGRAPH_PY_MINOR >= (0, 6)
12
12
 
13
13
 
14
14
  # Runtime edition detection
15
+ # Not in public docs: LANGGRAPH_RUNTIME_EDITION is internal, set by packaging/entrypoint
15
16
  _RUNTIME_EDITION = os.getenv("LANGGRAPH_RUNTIME_EDITION", "inmem")
16
17
  IS_POSTGRES_BACKEND = _RUNTIME_EDITION == "postgres"
17
18
  IS_POSTGRES_OR_GRPC_BACKEND = IS_POSTGRES_BACKEND
18
- # Feature flag for using the JS native API
19
+ # Not in public docs: internal feature flag
19
20
  FF_USE_JS_API = os.getenv("FF_USE_JS_API", "false").lower() in (
20
21
  "true",
21
22
  "1",
@@ -436,6 +436,7 @@ js_bg_tasks: set[asyncio.Task] = set()
436
436
 
437
437
  def _load_graph_config_from_env() -> dict | None:
438
438
  """Return graph config from env."""
439
+ # Not in public docs: LANGGRAPH_CONFIG is internal, set by CLI from langgraph.json
439
440
  config_str = os.getenv("LANGGRAPH_CONFIG")
440
441
  if not config_str:
441
442
  return None
@@ -459,6 +460,7 @@ def _load_graph_config_from_env() -> dict | None:
459
460
  async def collect_graphs_from_env(register: bool = False) -> None:
460
461
  """Return graphs from env."""
461
462
 
463
+ # Not in public docs: LANGSERVE_GRAPHS is internal, set by CLI from langgraph.json "graphs" field
462
464
  paths_str = os.getenv("LANGSERVE_GRAPHS")
463
465
  config_per_graph = _load_graph_config_from_env() or {}
464
466
 
@@ -24,6 +24,7 @@ from langgraph_grpc_common.proto.encryption_pb2_grpc import (
24
24
  from langgraph_api import config
25
25
  from langgraph_api.grpc.servicers.checkpointer import CheckpointerServicerImpl
26
26
  from langgraph_api.grpc.servicers.encryption import EncryptionServicerImpl
27
+ from langgraph_api.utils.network import format_hostport, get_healthcheck_target_host
27
28
 
28
29
  logger = structlog.stdlib.get_logger(__name__)
29
30
 
@@ -103,8 +104,7 @@ async def start_python_grpc_server(
103
104
  add_EncryptionServicer_to_server(encryption_servicer, server)
104
105
  await logger.ainfo("Registered Encryption service")
105
106
 
106
- # Bind to loopback interface only
107
- bind_address = f"{host}:{port}"
107
+ bind_address = format_hostport(host, port)
108
108
  resolved_port = server.add_insecure_port(bind_address)
109
109
 
110
110
  await server.start()
@@ -167,9 +167,9 @@ async def wait_until_python_grpc_ready(
167
167
  Raises:
168
168
  RuntimeError: If the server is not ready within the timeout period.
169
169
  """
170
- host = "127.0.0.1"
170
+ host = get_healthcheck_target_host(config.PYTHON_GRPC_BIND_HOST)
171
171
  port = config.PYTHON_GRPC_SERVER_PORT
172
- address = f"{host}:{port}"
172
+ address = format_hostport(host, port)
173
173
  max_attempts = int(timeout_seconds / interval_seconds)
174
174
 
175
175
  await logger.ainfo(
@@ -315,12 +315,24 @@ const handleInvoke = <T extends z.ZodType<any>>(
315
315
  // as a heartbeat
316
316
  let interval = setInterval(() => enqueueWrite(" "), HEARTBEAT_MS);
317
317
 
318
- const response = JSON.stringify(
319
- await handler({ graph_id: graphId, ...body }),
320
- );
318
+ try {
319
+ const response = JSON.stringify(
320
+ await handler({ graph_id: graphId, ...body }),
321
+ );
321
322
 
322
- clearInterval(interval);
323
- await enqueueWrite(response);
323
+ clearInterval(interval);
324
+ await enqueueWrite(response);
325
+ } catch (error) {
326
+ // Log the error since the stack trace won't be carried over to Python
327
+ logger.error(error);
328
+ // Return an error object that the Python side can handle
329
+ const errorResponse = JSON.stringify({
330
+ __error__: true,
331
+ ...serializeError(error),
332
+ });
333
+ clearInterval(interval);
334
+ await enqueueWrite(errorResponse);
335
+ }
324
336
  });
325
337
  };
326
338
  };
@@ -117,7 +117,29 @@ async def _client_invoke(method: str, data: dict[str, Any]):
117
117
  headers={"Content-Type": "application/json"},
118
118
  data=orjson.dumps(data, default=default_command),
119
119
  )
120
- return res.json()
120
+ try:
121
+ result = res.json()
122
+ except json.JSONDecodeError as e:
123
+ # Get the raw response for debugging
124
+ raw = res.text.strip()
125
+ if not raw:
126
+ raise RemoteException(
127
+ "EmptyResponse",
128
+ "Graph returned empty response",
129
+ ) from e
130
+ logger.exception(
131
+ "JS graph returned invalid JSON for method call %s: %s... (truncated)",
132
+ method,
133
+ raw[:50],
134
+ )
135
+ raise RemoteException(
136
+ "InvalidJSON",
137
+ "Graph returned invalid JSON",
138
+ ) from e
139
+ # Check if the JS side returned an error
140
+ if isinstance(result, dict) and result.get("__error__"):
141
+ raise RemoteException(result.get("error", "Unknown"), result.get("message", ""))
142
+ return result
121
143
 
122
144
 
123
145
  class RemotePregel(BaseRemotePregel):
@@ -28,6 +28,7 @@ UI_SCHEMAS_FILE = UI_ROOT_DIR / "schemas.json"
28
28
  async def start_ui_bundler() -> None:
29
29
  # LANGGRAPH_UI_ROOT_DIR is only set by in-memory server
30
30
  # @see langgraph_api/cli.py
31
+ # Not in public docs: LANGGRAPH_UI is populated by langgraph.json config
31
32
  if not UI_USE_BUNDLER or not os.getenv("LANGGRAPH_UI"):
32
33
  return
33
34
 
@@ -29,6 +29,7 @@ from langgraph_license.validation import plus_features_enabled
29
29
  logger = structlog.stdlib.get_logger(__name__)
30
30
 
31
31
  INTERVAL = 300
32
+ # Not in public docs: set by SaaS control plane, not user-configurable
32
33
  REVISION = os.getenv("LANGSMITH_LANGGRAPH_API_REVISION")
33
34
  VARIANT = os.getenv("LANGSMITH_LANGGRAPH_API_VARIANT")
34
35
  PROJECT_ID = os.getenv("LANGSMITH_HOST_PROJECT_ID")
@@ -228,6 +228,7 @@ class DatadogMetricsReporter:
228
228
  {
229
229
  "service.name": SERVICE_NAME,
230
230
  "host.id": os.getenv("HOSTNAME", ""),
231
+ # Not in public docs: these LANGSMITH_* vars are set by SaaS control plane
231
232
  "api_version": os.getenv("LANGSMITH_LANGGRAPH_API_VERSION")
232
233
  or __version__,
233
234
  "project_id": os.getenv("LANGSMITH_HOST_PROJECT_ID", ""),
@@ -117,6 +117,7 @@ class AccessLoggerMiddleware:
117
117
  route=str(route),
118
118
  path_params=scope.get("path_params"),
119
119
  query_string=qs.decode() if qs else "",
120
+ error_detail=scope.get("error_detail"),
120
121
  proto=scope.get("http_version"),
121
122
  req_header=_headers_to_dict(scope.get("headers")),
122
123
  res_header=_headers_to_dict(info["response"].get("headers")),
@@ -1,5 +1,4 @@
1
1
  import os
2
- from contextlib import suppress
3
2
 
4
3
  if not (
5
4
  (disable_truststore := os.getenv("DISABLE_TRUSTSTORE"))
@@ -16,11 +15,13 @@ import logging.config
16
15
  import pathlib
17
16
  import signal
18
17
  import socket
18
+ from contextlib import suppress
19
19
 
20
20
  import structlog
21
21
 
22
22
  from langgraph_api.api.meta import meta_pool_stats
23
23
  from langgraph_api.utils.errors import GraphLoadError, HealthServerStartupError
24
+ from langgraph_api.utils.network import format_hostport, normalize_host
24
25
  from langgraph_runtime import lifespan
25
26
  from langgraph_runtime.database import healthcheck
26
27
  from langgraph_runtime.metrics import get_metrics
@@ -32,13 +33,31 @@ shutdown_reason: str | None = None
32
33
 
33
34
 
34
35
  def _ensure_port_available(host: str, port: int) -> None:
36
+ host = normalize_host(host)
37
+ last_error: OSError | None = None
35
38
  try:
36
- with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as sock:
37
- sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
38
- sock.bind((host, port))
39
+ addrinfos = socket.getaddrinfo(
40
+ host,
41
+ port,
42
+ type=socket.SOCK_STREAM,
43
+ flags=socket.AI_PASSIVE,
44
+ )
39
45
  except OSError as exc:
40
46
  raise HealthServerStartupError(host, port, exc) from exc
41
47
 
48
+ for family, socktype, proto, _, sockaddr in addrinfos:
49
+ try:
50
+ with socket.socket(family, socktype, proto) as sock:
51
+ sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
52
+ sock.bind(sockaddr)
53
+ return
54
+ except OSError as exc:
55
+ last_error = exc
56
+
57
+ if last_error is None:
58
+ last_error = OSError(f"Could not resolve bind address for host {host!r}")
59
+ raise HealthServerStartupError(host, port, last_error)
60
+
42
61
 
43
62
  async def health_and_metrics_server():
44
63
  import uvicorn # noqa: PLC0415
@@ -51,7 +70,8 @@ async def health_and_metrics_server():
51
70
  from langgraph_api.api.meta import METRICS_FORMATS # noqa: PLC0415
52
71
 
53
72
  port = int(os.getenv("PORT", "8080"))
54
- host = os.getenv("LANGGRAPH_SERVER_HOST", "0.0.0.0")
73
+ # Not in public docs: LANGGRAPH_SERVER_HOST is internal
74
+ host = normalize_host(os.getenv("LANGGRAPH_SERVER_HOST", "0.0.0.0"))
55
75
 
56
76
  async def health_endpoint(request: Request):
57
77
  check_db = int(request.query_params.get("check_db", "1"))
@@ -137,7 +157,9 @@ async def health_and_metrics_server():
137
157
  # Server will run indefinitely until the process is terminated
138
158
  server = uvicorn.Server(config)
139
159
 
140
- logger.info(f"Health and metrics server started at http://{host}:{port}")
160
+ logger.info(
161
+ f"Health and metrics server started at http://{format_hostport(host, port)}"
162
+ )
141
163
  try:
142
164
  # Use the internal serve to skip capturing signals, otherwise there's a race condition
143
165
  # where uvicorn captures the signal and will exit early before the queue can gracefully shutdown
@@ -40,10 +40,12 @@ from langgraph_api.api.openapi import set_custom_spec
40
40
  from langgraph_api.errors import (
41
41
  http_exception_handler,
42
42
  overloaded_error_handler,
43
+ remote_exception_handler,
43
44
  validation_error_handler,
44
45
  value_error_handler,
45
46
  )
46
47
  from langgraph_api.js.base import is_js_path
48
+ from langgraph_api.js.errors import RemoteException
47
49
  from langgraph_api.middleware.ensure_store import EnsureStoreAccessible
48
50
  from langgraph_api.middleware.http_logger import AccessLoggerMiddleware
49
51
  from langgraph_api.middleware.private_network import PrivateNetworkMiddleware
@@ -102,6 +104,7 @@ exception_handlers = {
102
104
  InvalidUpdateError: value_error_handler,
103
105
  EmptyInputError: value_error_handler,
104
106
  jsonschema_rs.ValidationError: validation_error_handler,
107
+ RemoteException: remote_exception_handler,
105
108
  } | {exc: overloaded_error_handler for exc in OVERLOADED_EXCEPTIONS}
106
109
 
107
110
 
@@ -8,6 +8,7 @@ _PATH_PREFIX = "/runs"
8
8
 
9
9
 
10
10
  def patch_requests():
11
+ # Not in public docs: LANGSMITH_DISABLE_SAAS_RUNS is set by SaaS control plane
11
12
  if os.getenv("LANGSMITH_DISABLE_SAAS_RUNS") != "true":
12
13
  return
13
14
  _orig = Session.request
@@ -15,6 +15,7 @@ from pathlib import Path
15
15
 
16
16
  logger = logging.getLogger(__name__)
17
17
 
18
+ # Not in public docs: internal, controls cloudflared binary version for tunneling
18
19
  CLOUDFLARED_VERSION = os.environ.get("LANGGRAPH_CLOUDFLARED_VERSION", "2025.2.1")
19
20
  CACHE_DIR = (
20
21
  Path(os.path.expanduser("~"))
@@ -0,0 +1,49 @@
1
+ from __future__ import annotations
2
+
3
+ from ipaddress import IPv6Address, ip_address
4
+
5
+
6
+ def normalize_host(host: str) -> str:
7
+ """Normalize host literals from env/config.
8
+
9
+ Brackets are valid in URLs and host:port strings, but socket bind/connect APIs
10
+ expect the raw IPv6 literal.
11
+ """
12
+ if host.startswith("[") and host.endswith("]"):
13
+ return host[1:-1]
14
+ return host
15
+
16
+
17
+ def format_hostport(host: str, port: int) -> str:
18
+ host = normalize_host(host)
19
+ if ":" in host:
20
+ return f"[{host}]:{port}"
21
+ return f"{host}:{port}"
22
+
23
+
24
+ def get_healthcheck_target_host(bind_host: str) -> str:
25
+ bind_host = normalize_host(bind_host)
26
+ if bind_host in {"", "0.0.0.0"}:
27
+ return "127.0.0.1"
28
+ if bind_host == "::":
29
+ return "::1"
30
+ return bind_host
31
+
32
+
33
+ def get_healthcheck_url_host(host: str) -> str:
34
+ host = normalize_host(host)
35
+ if host in {"0.0.0.0", ""}:
36
+ return "localhost"
37
+ if host == "::":
38
+ return "[::1]"
39
+
40
+ try:
41
+ host_ip = ip_address(host)
42
+ except ValueError:
43
+ return host
44
+
45
+ return (
46
+ f"[{host_ip.compressed}]"
47
+ if isinstance(host_ip, IPv6Address)
48
+ else host_ip.compressed
49
+ )
@@ -30,7 +30,7 @@ parser.add_argument(
30
30
  )
31
31
  args = parser.parse_args()
32
32
 
33
- # Load the private key from an environment variable. This is in the Langchain 1password vault.
33
+ # Not in public docs: LANGGRAPH_CLOUD_LICENSE_PRIVATE_KEY is internal (in 1password vault)
34
34
  private_key_str = os.environ.get("LANGGRAPH_CLOUD_LICENSE_PRIVATE_KEY")
35
35
 
36
36
  if private_key_str is None:
@@ -1 +0,0 @@
1
- __version__ = "0.7.96"
File without changes
File without changes
File without changes