langgraph-api 0.8.6__tar.gz → 0.9.0__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.8.6 → langgraph_api-0.9.0}/Makefile +1 -1
  2. {langgraph_api-0.8.6 → langgraph_api-0.9.0}/PKG-INFO +3 -3
  3. {langgraph_api-0.8.6 → langgraph_api-0.9.0}/benchmark/continuous/uv.lock +6 -6
  4. {langgraph_api-0.8.6 → langgraph_api-0.9.0}/benchmark/ramp.js +3 -1
  5. langgraph_api-0.9.0/langgraph_api/__init__.py +1 -0
  6. {langgraph_api-0.8.6 → langgraph_api-0.9.0}/langgraph_api/api/__init__.py +21 -5
  7. langgraph_api-0.8.6/langgraph_api/api/protocol.py → langgraph_api-0.9.0/langgraph_api/api/event_streaming.py +115 -53
  8. {langgraph_api-0.8.6 → langgraph_api-0.9.0}/langgraph_api/api/runs.py +2 -0
  9. {langgraph_api-0.8.6 → langgraph_api-0.9.0}/langgraph_api/config/__init__.py +15 -3
  10. {langgraph_api-0.8.6/langgraph_api/protocol → langgraph_api-0.9.0/langgraph_api/event_streaming}/capabilities.py +22 -1
  11. {langgraph_api-0.8.6/langgraph_api/protocol → langgraph_api-0.9.0/langgraph_api/event_streaming}/constants.py +2 -2
  12. {langgraph_api-0.8.6/langgraph_api/protocol → langgraph_api-0.9.0/langgraph_api/event_streaming}/service.py +111 -53
  13. {langgraph_api-0.8.6/langgraph_api/protocol → langgraph_api-0.9.0/langgraph_api/event_streaming}/session.py +144 -122
  14. {langgraph_api-0.8.6/langgraph_api/protocol → langgraph_api-0.9.0/langgraph_api/event_streaming}/state_normalizers.py +13 -13
  15. {langgraph_api-0.8.6/langgraph_api/protocol → langgraph_api-0.9.0/langgraph_api/event_streaming}/types.py +1 -1
  16. {langgraph_api-0.8.6 → langgraph_api-0.9.0}/langgraph_api/feature_flags.py +14 -0
  17. {langgraph_api-0.8.6 → langgraph_api-0.9.0}/langgraph_api/graph.py +1 -1
  18. {langgraph_api-0.8.6 → langgraph_api-0.9.0}/langgraph_api/grpc/ops/crons.py +13 -2
  19. {langgraph_api-0.8.6 → langgraph_api-0.9.0}/langgraph_api/grpc/ops/threads.py +2 -2
  20. {langgraph_api-0.8.6 → langgraph_api-0.9.0}/langgraph_api/js/package.json +1 -1
  21. {langgraph_api-0.8.6 → langgraph_api-0.9.0}/langgraph_api/js/src/load.hooks.mjs +1 -0
  22. langgraph_api-0.9.0/langgraph_api/js/src/preload.mjs +108 -0
  23. {langgraph_api-0.8.6 → langgraph_api-0.9.0}/langgraph_api/js/yarn.lock +639 -59
  24. {langgraph_api-0.8.6 → langgraph_api-0.9.0}/langgraph_api/models/run.py +19 -0
  25. {langgraph_api-0.8.6 → langgraph_api-0.9.0}/langgraph_api/release_tags.py +88 -30
  26. {langgraph_api-0.8.6 → langgraph_api-0.9.0}/langgraph_api/stream.py +40 -188
  27. langgraph_api-0.9.0/langgraph_api/stream_v2.py +224 -0
  28. {langgraph_api-0.8.6 → langgraph_api-0.9.0}/langgraph_grpc_common/conversion/checkpoint.py +4 -1
  29. {langgraph_api-0.8.6 → langgraph_api-0.9.0}/langgraph_grpc_common/proto/__init__.py +0 -2
  30. {langgraph_api-0.8.6 → langgraph_api-0.9.0}/langgraph_grpc_common/proto/checkpointer_pb2.pyi +28 -3
  31. {langgraph_api-0.8.6 → langgraph_api-0.9.0}/langgraph_grpc_common/proto/core_api_pb2.py +50 -50
  32. {langgraph_api-0.8.6 → langgraph_api-0.9.0}/langgraph_grpc_common/proto/core_api_pb2.pyi +18 -4
  33. {langgraph_api-0.8.6 → langgraph_api-0.9.0}/langgraph_grpc_common/proto/errors_pb2.pyi +9 -3
  34. {langgraph_api-0.8.6 → langgraph_api-0.9.0}/openapi.json +12 -11
  35. {langgraph_api-0.8.6 → langgraph_api-0.9.0}/pyproject.toml +2 -2
  36. {langgraph_api-0.8.6 → langgraph_api-0.9.0}/uv.lock +473 -385
  37. langgraph_api-0.8.6/langgraph_api/__init__.py +0 -1
  38. langgraph_api-0.8.6/langgraph_api/js/src/preload.mjs +0 -29
  39. langgraph_api-0.8.6/langgraph_api/utils/messages.py +0 -62
  40. langgraph_api-0.8.6/langgraph_grpc_common/proto/enum_store_operation_entry_type_pb2.py +0 -37
  41. langgraph_api-0.8.6/langgraph_grpc_common/proto/enum_store_operation_entry_type_pb2.pyi +0 -32
  42. langgraph_api-0.8.6/langgraph_grpc_common/proto/enum_store_operation_entry_type_pb2_grpc.py +0 -24
  43. langgraph_api-0.8.6/langgraph_grpc_common/proto/enum_store_operation_entry_type_pb2_grpc.pyi +0 -20
  44. {langgraph_api-0.8.6 → langgraph_api-0.9.0}/.gitignore +0 -0
  45. {langgraph_api-0.8.6 → langgraph_api-0.9.0}/LICENSE +0 -0
  46. {langgraph_api-0.8.6 → langgraph_api-0.9.0}/README.md +0 -0
  47. {langgraph_api-0.8.6 → langgraph_api-0.9.0}/benchmark/.gitignore +0 -0
  48. {langgraph_api-0.8.6 → langgraph_api-0.9.0}/benchmark/Makefile +0 -0
  49. {langgraph_api-0.8.6 → langgraph_api-0.9.0}/benchmark/README.md +0 -0
  50. {langgraph_api-0.8.6 → langgraph_api-0.9.0}/benchmark/benchmark-runners/assistant.ts +0 -0
  51. {langgraph_api-0.8.6 → langgraph_api-0.9.0}/benchmark/benchmark-runners/benchmark-runner.ts +0 -0
  52. {langgraph_api-0.8.6 → langgraph_api-0.9.0}/benchmark/benchmark-runners/benchmark_profiles.ts +0 -0
  53. {langgraph_api-0.8.6 → langgraph_api-0.9.0}/benchmark/benchmark-runners/benchmarks.ts +0 -0
  54. {langgraph_api-0.8.6 → langgraph_api-0.9.0}/benchmark/benchmark-runners/cancel_first_second_completes.ts +0 -0
  55. {langgraph_api-0.8.6 → langgraph_api-0.9.0}/benchmark/benchmark-runners/enqueued_runs_order.ts +0 -0
  56. {langgraph_api-0.8.6 → langgraph_api-0.9.0}/benchmark/benchmark-runners/log-failure.ts +0 -0
  57. {langgraph_api-0.8.6 → langgraph_api-0.9.0}/benchmark/benchmark-runners/meta_workload.ts +0 -0
  58. {langgraph_api-0.8.6 → langgraph_api-0.9.0}/benchmark/benchmark-runners/stream_write.ts +0 -0
  59. {langgraph_api-0.8.6 → langgraph_api-0.9.0}/benchmark/benchmark-runners/thread.ts +0 -0
  60. {langgraph_api-0.8.6 → langgraph_api-0.9.0}/benchmark/benchmark-runners/thread_runs_metadata_search.ts +0 -0
  61. {langgraph_api-0.8.6 → langgraph_api-0.9.0}/benchmark/benchmark-runners/threads_search_metadata.ts +0 -0
  62. {langgraph_api-0.8.6 → langgraph_api-0.9.0}/benchmark/benchmark-runners/types.ts +0 -0
  63. {langgraph_api-0.8.6 → langgraph_api-0.9.0}/benchmark/benchmark-runners/wait_write.ts +0 -0
  64. {langgraph_api-0.8.6 → langgraph_api-0.9.0}/benchmark/capacity_dd_report.py +0 -0
  65. {langgraph_api-0.8.6 → langgraph_api-0.9.0}/benchmark/capacity_k6.js +0 -0
  66. {langgraph_api-0.8.6 → langgraph_api-0.9.0}/benchmark/capacity_runner.mjs +0 -0
  67. {langgraph_api-0.8.6 → langgraph_api-0.9.0}/benchmark/capacity_slack_report.py +0 -0
  68. {langgraph_api-0.8.6 → langgraph_api-0.9.0}/benchmark/capacity_urls.mjs +0 -0
  69. {langgraph_api-0.8.6 → langgraph_api-0.9.0}/benchmark/clean-cli.js +0 -0
  70. {langgraph_api-0.8.6 → langgraph_api-0.9.0}/benchmark/clean.js +0 -0
  71. {langgraph_api-0.8.6 → langgraph_api-0.9.0}/benchmark/continuous/README.md +0 -0
  72. {langgraph_api-0.8.6 → langgraph_api-0.9.0}/benchmark/continuous/pyproject.toml +0 -0
  73. {langgraph_api-0.8.6 → langgraph_api-0.9.0}/benchmark/continuous/runner.py +0 -0
  74. {langgraph_api-0.8.6 → langgraph_api-0.9.0}/benchmark/graphs.js +0 -0
  75. {langgraph_api-0.8.6 → langgraph_api-0.9.0}/benchmark/mixed_workload_k6.js +0 -0
  76. {langgraph_api-0.8.6 → langgraph_api-0.9.0}/benchmark/mixed_workload_runner.mjs +0 -0
  77. {langgraph_api-0.8.6 → langgraph_api-0.9.0}/benchmark/package.json +0 -0
  78. {langgraph_api-0.8.6 → langgraph_api-0.9.0}/benchmark/reporting/dd_reporting.py +0 -0
  79. {langgraph_api-0.8.6 → langgraph_api-0.9.0}/benchmark/reporting/slack_slowest_runs.py +0 -0
  80. {langgraph_api-0.8.6 → langgraph_api-0.9.0}/benchmark/reporting/slack_summary.py +0 -0
  81. {langgraph_api-0.8.6 → langgraph_api-0.9.0}/benchmark/run_local.sh +0 -0
  82. {langgraph_api-0.8.6 → langgraph_api-0.9.0}/benchmark/staircase.py +0 -0
  83. {langgraph_api-0.8.6 → langgraph_api-0.9.0}/benchmark/staircase_step_k6.js +0 -0
  84. {langgraph_api-0.8.6 → langgraph_api-0.9.0}/benchmark/tsconfig.json +0 -0
  85. {langgraph_api-0.8.6 → langgraph_api-0.9.0}/benchmark/update-revision.js +0 -0
  86. {langgraph_api-0.8.6 → langgraph_api-0.9.0}/benchmark/weather.js +0 -0
  87. {langgraph_api-0.8.6 → langgraph_api-0.9.0}/constraints.txt +0 -0
  88. {langgraph_api-0.8.6 → langgraph_api-0.9.0}/custom_store.sql +0 -0
  89. {langgraph_api-0.8.6 → langgraph_api-0.9.0}/forbidden.txt +0 -0
  90. {langgraph_api-0.8.6 → langgraph_api-0.9.0}/hatch_build.py +0 -0
  91. {langgraph_api-0.8.6 → langgraph_api-0.9.0}/healthcheck.py +0 -0
  92. {langgraph_api-0.8.6 → langgraph_api-0.9.0}/langgraph-cloud-debugging-20260210132856.zip +0 -0
  93. {langgraph_api-0.8.6 → langgraph_api-0.9.0}/langgraph_api/_checkpointer/__init__.py +0 -0
  94. {langgraph_api-0.8.6 → langgraph_api-0.9.0}/langgraph_api/_checkpointer/_adapter.py +0 -0
  95. {langgraph_api-0.8.6 → langgraph_api-0.9.0}/langgraph_api/_checkpointer/protocol.py +0 -0
  96. {langgraph_api-0.8.6 → langgraph_api-0.9.0}/langgraph_api/_factory_utils.py +0 -0
  97. {langgraph_api-0.8.6 → langgraph_api-0.9.0}/langgraph_api/api/a2a.py +0 -0
  98. {langgraph_api-0.8.6 → langgraph_api-0.9.0}/langgraph_api/api/assistants.py +0 -0
  99. {langgraph_api-0.8.6 → langgraph_api-0.9.0}/langgraph_api/api/mcp/__init__.py +0 -0
  100. {langgraph_api-0.8.6 → langgraph_api-0.9.0}/langgraph_api/api/mcp/_constants.py +0 -0
  101. {langgraph_api-0.8.6 → langgraph_api-0.9.0}/langgraph_api/api/mcp/_handlers.py +0 -0
  102. {langgraph_api-0.8.6 → langgraph_api-0.9.0}/langgraph_api/api/mcp/_models.py +0 -0
  103. {langgraph_api-0.8.6 → langgraph_api-0.9.0}/langgraph_api/api/mcp/_routes.py +0 -0
  104. {langgraph_api-0.8.6 → langgraph_api-0.9.0}/langgraph_api/api/mcp/_sanitizers.py +0 -0
  105. {langgraph_api-0.8.6 → langgraph_api-0.9.0}/langgraph_api/api/meta.py +0 -0
  106. {langgraph_api-0.8.6 → langgraph_api-0.9.0}/langgraph_api/api/openapi.py +0 -0
  107. {langgraph_api-0.8.6 → langgraph_api-0.9.0}/langgraph_api/api/profile.py +0 -0
  108. {langgraph_api-0.8.6 → langgraph_api-0.9.0}/langgraph_api/api/store.py +0 -0
  109. {langgraph_api-0.8.6 → langgraph_api-0.9.0}/langgraph_api/api/threads.py +0 -0
  110. {langgraph_api-0.8.6 → langgraph_api-0.9.0}/langgraph_api/api/ui.py +0 -0
  111. {langgraph_api-0.8.6 → langgraph_api-0.9.0}/langgraph_api/asgi_transport.py +0 -0
  112. {langgraph_api-0.8.6 → langgraph_api-0.9.0}/langgraph_api/asyncio.py +0 -0
  113. {langgraph_api-0.8.6 → langgraph_api-0.9.0}/langgraph_api/auth/__init__.py +0 -0
  114. {langgraph_api-0.8.6 → langgraph_api-0.9.0}/langgraph_api/auth/custom.py +0 -0
  115. {langgraph_api-0.8.6 → langgraph_api-0.9.0}/langgraph_api/auth/errors.py +0 -0
  116. {langgraph_api-0.8.6 → langgraph_api-0.9.0}/langgraph_api/auth/langsmith/__init__.py +0 -0
  117. {langgraph_api-0.8.6 → langgraph_api-0.9.0}/langgraph_api/auth/langsmith/backend.py +0 -0
  118. {langgraph_api-0.8.6 → langgraph_api-0.9.0}/langgraph_api/auth/langsmith/client.py +0 -0
  119. {langgraph_api-0.8.6 → langgraph_api-0.9.0}/langgraph_api/auth/middleware.py +0 -0
  120. {langgraph_api-0.8.6 → langgraph_api-0.9.0}/langgraph_api/auth/noop.py +0 -0
  121. {langgraph_api-0.8.6 → langgraph_api-0.9.0}/langgraph_api/auth/studio_user.py +0 -0
  122. {langgraph_api-0.8.6 → langgraph_api-0.9.0}/langgraph_api/cache.py +0 -0
  123. {langgraph_api-0.8.6 → langgraph_api-0.9.0}/langgraph_api/cli.py +0 -0
  124. {langgraph_api-0.8.6 → langgraph_api-0.9.0}/langgraph_api/command.py +0 -0
  125. {langgraph_api-0.8.6 → langgraph_api-0.9.0}/langgraph_api/config/_parse.py +0 -0
  126. {langgraph_api-0.8.6 → langgraph_api-0.9.0}/langgraph_api/config/schemas.py +0 -0
  127. {langgraph_api-0.8.6 → langgraph_api-0.9.0}/langgraph_api/cron_scheduler.py +0 -0
  128. {langgraph_api-0.8.6 → langgraph_api-0.9.0}/langgraph_api/encryption/__init__.py +0 -0
  129. {langgraph_api-0.8.6 → langgraph_api-0.9.0}/langgraph_api/encryption/aes_json.py +0 -0
  130. {langgraph_api-0.8.6 → langgraph_api-0.9.0}/langgraph_api/encryption/context.py +0 -0
  131. {langgraph_api-0.8.6 → langgraph_api-0.9.0}/langgraph_api/encryption/custom.py +0 -0
  132. {langgraph_api-0.8.6 → langgraph_api-0.9.0}/langgraph_api/encryption/middleware.py +0 -0
  133. {langgraph_api-0.8.6 → langgraph_api-0.9.0}/langgraph_api/encryption/shared.py +0 -0
  134. {langgraph_api-0.8.6 → langgraph_api-0.9.0}/langgraph_api/errors.py +0 -0
  135. {langgraph_api-0.8.6/langgraph_api/protocol → langgraph_api-0.9.0/langgraph_api/event_streaming}/__init__.py +0 -0
  136. {langgraph_api-0.8.6/langgraph_api/protocol → langgraph_api-0.9.0/langgraph_api/event_streaming}/event_normalizers.py +0 -0
  137. {langgraph_api-0.8.6/langgraph_api/protocol → langgraph_api-0.9.0/langgraph_api/event_streaming}/namespace.py +0 -0
  138. {langgraph_api-0.8.6 → langgraph_api-0.9.0}/langgraph_api/grpc/__init__.py +0 -0
  139. {langgraph_api-0.8.6 → langgraph_api-0.9.0}/langgraph_api/grpc/client.py +0 -0
  140. {langgraph_api-0.8.6 → langgraph_api-0.9.0}/langgraph_api/grpc/generated/core_api_pb2.pyi +0 -0
  141. {langgraph_api-0.8.6 → langgraph_api-0.9.0}/langgraph_api/grpc/ops/__init__.py +0 -0
  142. {langgraph_api-0.8.6 → langgraph_api-0.9.0}/langgraph_api/grpc/ops/assistants.py +0 -0
  143. {langgraph_api-0.8.6 → langgraph_api-0.9.0}/langgraph_api/grpc/ops/cache.py +0 -0
  144. {langgraph_api-0.8.6 → langgraph_api-0.9.0}/langgraph_api/grpc/ops/runs.py +0 -0
  145. {langgraph_api-0.8.6 → langgraph_api-0.9.0}/langgraph_api/grpc/server.py +0 -0
  146. {langgraph_api-0.8.6 → langgraph_api-0.9.0}/langgraph_api/grpc/servicers/__init__.py +0 -0
  147. {langgraph_api-0.8.6 → langgraph_api-0.9.0}/langgraph_api/grpc/servicers/checkpointer.py +0 -0
  148. {langgraph_api-0.8.6 → langgraph_api-0.9.0}/langgraph_api/grpc/servicers/encryption.py +0 -0
  149. {langgraph_api-0.8.6 → langgraph_api-0.9.0}/langgraph_api/http.py +0 -0
  150. {langgraph_api-0.8.6 → langgraph_api-0.9.0}/langgraph_api/http_metrics.py +0 -0
  151. {langgraph_api-0.8.6 → langgraph_api-0.9.0}/langgraph_api/http_metrics_utils.py +0 -0
  152. {langgraph_api-0.8.6 → langgraph_api-0.9.0}/langgraph_api/js/.gitignore +0 -0
  153. {langgraph_api-0.8.6 → langgraph_api-0.9.0}/langgraph_api/js/.prettierrc +0 -0
  154. {langgraph_api-0.8.6 → langgraph_api-0.9.0}/langgraph_api/js/__init__.py +0 -0
  155. {langgraph_api-0.8.6 → langgraph_api-0.9.0}/langgraph_api/js/base.py +0 -0
  156. {langgraph_api-0.8.6 → langgraph_api-0.9.0}/langgraph_api/js/build.mts +0 -0
  157. {langgraph_api-0.8.6 → langgraph_api-0.9.0}/langgraph_api/js/client.http.mts +0 -0
  158. {langgraph_api-0.8.6 → langgraph_api-0.9.0}/langgraph_api/js/client.mts +0 -0
  159. {langgraph_api-0.8.6 → langgraph_api-0.9.0}/langgraph_api/js/errors.py +0 -0
  160. {langgraph_api-0.8.6 → langgraph_api-0.9.0}/langgraph_api/js/global.d.ts +0 -0
  161. {langgraph_api-0.8.6 → langgraph_api-0.9.0}/langgraph_api/js/remote.py +0 -0
  162. {langgraph_api-0.8.6 → langgraph_api-0.9.0}/langgraph_api/js/schema.py +0 -0
  163. {langgraph_api-0.8.6 → langgraph_api-0.9.0}/langgraph_api/js/src/graph.mts +0 -0
  164. {langgraph_api-0.8.6 → langgraph_api-0.9.0}/langgraph_api/js/src/utils/experiment-tracing.mts +0 -0
  165. {langgraph_api-0.8.6 → langgraph_api-0.9.0}/langgraph_api/js/src/utils/files.mts +0 -0
  166. {langgraph_api-0.8.6 → langgraph_api-0.9.0}/langgraph_api/js/src/utils/importMap.mts +0 -0
  167. {langgraph_api-0.8.6 → langgraph_api-0.9.0}/langgraph_api/js/src/utils/pythonSchemas.mts +0 -0
  168. {langgraph_api-0.8.6 → langgraph_api-0.9.0}/langgraph_api/js/src/utils/serde.mts +0 -0
  169. {langgraph_api-0.8.6 → langgraph_api-0.9.0}/langgraph_api/js/sse.py +0 -0
  170. {langgraph_api-0.8.6 → langgraph_api-0.9.0}/langgraph_api/js/traceblock.mts +0 -0
  171. {langgraph_api-0.8.6 → langgraph_api-0.9.0}/langgraph_api/js/tsconfig.json +0 -0
  172. {langgraph_api-0.8.6 → langgraph_api-0.9.0}/langgraph_api/js/ui.py +0 -0
  173. {langgraph_api-0.8.6 → langgraph_api-0.9.0}/langgraph_api/lc_security/__init__.py +0 -0
  174. {langgraph_api-0.8.6 → langgraph_api-0.9.0}/langgraph_api/lc_security/exceptions.py +0 -0
  175. {langgraph_api-0.8.6 → langgraph_api-0.9.0}/langgraph_api/lc_security/policy.py +0 -0
  176. {langgraph_api-0.8.6 → langgraph_api-0.9.0}/langgraph_api/lc_security/transport.py +0 -0
  177. {langgraph_api-0.8.6 → langgraph_api-0.9.0}/langgraph_api/logging.py +0 -0
  178. {langgraph_api-0.8.6 → langgraph_api-0.9.0}/langgraph_api/metadata.py +0 -0
  179. {langgraph_api-0.8.6 → langgraph_api-0.9.0}/langgraph_api/metrics_datadog.py +0 -0
  180. {langgraph_api-0.8.6 → langgraph_api-0.9.0}/langgraph_api/middleware/__init__.py +0 -0
  181. {langgraph_api-0.8.6 → langgraph_api-0.9.0}/langgraph_api/middleware/ensure_store.py +0 -0
  182. {langgraph_api-0.8.6 → langgraph_api-0.9.0}/langgraph_api/middleware/http_logger.py +0 -0
  183. {langgraph_api-0.8.6 → langgraph_api-0.9.0}/langgraph_api/middleware/private_network.py +0 -0
  184. {langgraph_api-0.8.6 → langgraph_api-0.9.0}/langgraph_api/middleware/request_id.py +0 -0
  185. {langgraph_api-0.8.6 → langgraph_api-0.9.0}/langgraph_api/models/__init__.py +0 -0
  186. {langgraph_api-0.8.6 → langgraph_api-0.9.0}/langgraph_api/otel_context.py +0 -0
  187. {langgraph_api-0.8.6 → langgraph_api-0.9.0}/langgraph_api/patch.py +0 -0
  188. {langgraph_api-0.8.6 → langgraph_api-0.9.0}/langgraph_api/queue_entrypoint.py +0 -0
  189. {langgraph_api-0.8.6 → langgraph_api-0.9.0}/langgraph_api/route.py +0 -0
  190. {langgraph_api-0.8.6 → langgraph_api-0.9.0}/langgraph_api/schema.py +0 -0
  191. {langgraph_api-0.8.6 → langgraph_api-0.9.0}/langgraph_api/self_hosted_logs.py +0 -0
  192. {langgraph_api-0.8.6 → langgraph_api-0.9.0}/langgraph_api/self_hosted_metrics.py +0 -0
  193. {langgraph_api-0.8.6 → langgraph_api-0.9.0}/langgraph_api/serde.py +0 -0
  194. {langgraph_api-0.8.6 → langgraph_api-0.9.0}/langgraph_api/server.py +0 -0
  195. {langgraph_api-0.8.6 → langgraph_api-0.9.0}/langgraph_api/sse.py +0 -0
  196. {langgraph_api-0.8.6 → langgraph_api-0.9.0}/langgraph_api/state.py +0 -0
  197. {langgraph_api-0.8.6 → langgraph_api-0.9.0}/langgraph_api/store.py +0 -0
  198. {langgraph_api-0.8.6 → langgraph_api-0.9.0}/langgraph_api/timing/__init__.py +0 -0
  199. {langgraph_api-0.8.6 → langgraph_api-0.9.0}/langgraph_api/timing/profiler.py +0 -0
  200. {langgraph_api-0.8.6 → langgraph_api-0.9.0}/langgraph_api/timing/timer.py +0 -0
  201. {langgraph_api-0.8.6 → langgraph_api-0.9.0}/langgraph_api/traceblock.py +0 -0
  202. {langgraph_api-0.8.6 → langgraph_api-0.9.0}/langgraph_api/tunneling/cloudflare.py +0 -0
  203. {langgraph_api-0.8.6 → langgraph_api-0.9.0}/langgraph_api/utils/__init__.py +0 -0
  204. {langgraph_api-0.8.6 → langgraph_api-0.9.0}/langgraph_api/utils/cache.py +0 -0
  205. {langgraph_api-0.8.6 → langgraph_api-0.9.0}/langgraph_api/utils/config.py +0 -0
  206. {langgraph_api-0.8.6 → langgraph_api-0.9.0}/langgraph_api/utils/errors.py +0 -0
  207. {langgraph_api-0.8.6 → langgraph_api-0.9.0}/langgraph_api/utils/extract.py +0 -0
  208. {langgraph_api-0.8.6 → langgraph_api-0.9.0}/langgraph_api/utils/future.py +0 -0
  209. {langgraph_api-0.8.6 → langgraph_api-0.9.0}/langgraph_api/utils/headers.py +0 -0
  210. {langgraph_api-0.8.6 → langgraph_api-0.9.0}/langgraph_api/utils/network.py +0 -0
  211. {langgraph_api-0.8.6 → langgraph_api-0.9.0}/langgraph_api/utils/retriable_client.py +0 -0
  212. {langgraph_api-0.8.6 → langgraph_api-0.9.0}/langgraph_api/utils/stream_codec.py +0 -0
  213. {langgraph_api-0.8.6 → langgraph_api-0.9.0}/langgraph_api/utils/uuids.py +0 -0
  214. {langgraph_api-0.8.6 → langgraph_api-0.9.0}/langgraph_api/validation.py +0 -0
  215. {langgraph_api-0.8.6 → langgraph_api-0.9.0}/langgraph_api/webhook.py +0 -0
  216. {langgraph_api-0.8.6 → langgraph_api-0.9.0}/langgraph_api/worker.py +0 -0
  217. {langgraph_api-0.8.6 → langgraph_api-0.9.0}/langgraph_grpc_common/__init__.py +0 -0
  218. {langgraph_api-0.8.6 → langgraph_api-0.9.0}/langgraph_grpc_common/checkpointer.py +0 -0
  219. {langgraph_api-0.8.6 → langgraph_api-0.9.0}/langgraph_grpc_common/conversion/__init__.py +0 -0
  220. {langgraph_api-0.8.6 → langgraph_api-0.9.0}/langgraph_grpc_common/conversion/_compat.py +0 -0
  221. {langgraph_api-0.8.6 → langgraph_api-0.9.0}/langgraph_grpc_common/conversion/config.py +0 -0
  222. {langgraph_api-0.8.6 → langgraph_api-0.9.0}/langgraph_grpc_common/conversion/durability.py +0 -0
  223. {langgraph_api-0.8.6 → langgraph_api-0.9.0}/langgraph_grpc_common/conversion/struct.py +0 -0
  224. {langgraph_api-0.8.6 → langgraph_api-0.9.0}/langgraph_grpc_common/conversion/value.py +0 -0
  225. {langgraph_api-0.8.6 → langgraph_api-0.9.0}/langgraph_grpc_common/proto/checkpointer_pb2.py +0 -0
  226. {langgraph_api-0.8.6 → langgraph_api-0.9.0}/langgraph_grpc_common/proto/checkpointer_pb2_grpc.py +0 -0
  227. {langgraph_api-0.8.6 → langgraph_api-0.9.0}/langgraph_grpc_common/proto/checkpointer_pb2_grpc.pyi +0 -0
  228. {langgraph_api-0.8.6 → langgraph_api-0.9.0}/langgraph_grpc_common/proto/core_api_pb2_grpc.py +0 -0
  229. {langgraph_api-0.8.6 → langgraph_api-0.9.0}/langgraph_grpc_common/proto/core_api_pb2_grpc.pyi +0 -0
  230. {langgraph_api-0.8.6 → langgraph_api-0.9.0}/langgraph_grpc_common/proto/encryption_pb2.py +0 -0
  231. {langgraph_api-0.8.6 → langgraph_api-0.9.0}/langgraph_grpc_common/proto/encryption_pb2.pyi +0 -0
  232. {langgraph_api-0.8.6 → langgraph_api-0.9.0}/langgraph_grpc_common/proto/encryption_pb2_grpc.py +0 -0
  233. {langgraph_api-0.8.6 → langgraph_api-0.9.0}/langgraph_grpc_common/proto/encryption_pb2_grpc.pyi +0 -0
  234. {langgraph_api-0.8.6 → langgraph_api-0.9.0}/langgraph_grpc_common/proto/engine_common_pb2.py +0 -0
  235. {langgraph_api-0.8.6 → langgraph_api-0.9.0}/langgraph_grpc_common/proto/engine_common_pb2.pyi +0 -0
  236. {langgraph_api-0.8.6 → langgraph_api-0.9.0}/langgraph_grpc_common/proto/engine_common_pb2_grpc.py +0 -0
  237. {langgraph_api-0.8.6 → langgraph_api-0.9.0}/langgraph_grpc_common/proto/engine_common_pb2_grpc.pyi +0 -0
  238. {langgraph_api-0.8.6 → langgraph_api-0.9.0}/langgraph_grpc_common/proto/enum_cancel_run_action_pb2.py +0 -0
  239. {langgraph_api-0.8.6 → langgraph_api-0.9.0}/langgraph_grpc_common/proto/enum_cancel_run_action_pb2.pyi +0 -0
  240. {langgraph_api-0.8.6 → langgraph_api-0.9.0}/langgraph_grpc_common/proto/enum_cancel_run_action_pb2_grpc.py +0 -0
  241. {langgraph_api-0.8.6 → langgraph_api-0.9.0}/langgraph_grpc_common/proto/enum_cancel_run_action_pb2_grpc.pyi +0 -0
  242. {langgraph_api-0.8.6 → langgraph_api-0.9.0}/langgraph_grpc_common/proto/enum_control_signal_pb2.py +0 -0
  243. {langgraph_api-0.8.6 → langgraph_api-0.9.0}/langgraph_grpc_common/proto/enum_control_signal_pb2.pyi +0 -0
  244. {langgraph_api-0.8.6 → langgraph_api-0.9.0}/langgraph_grpc_common/proto/enum_control_signal_pb2_grpc.py +0 -0
  245. {langgraph_api-0.8.6 → langgraph_api-0.9.0}/langgraph_grpc_common/proto/enum_control_signal_pb2_grpc.pyi +0 -0
  246. {langgraph_api-0.8.6 → langgraph_api-0.9.0}/langgraph_grpc_common/proto/enum_cron_on_run_completed_pb2.py +0 -0
  247. {langgraph_api-0.8.6 → langgraph_api-0.9.0}/langgraph_grpc_common/proto/enum_cron_on_run_completed_pb2.pyi +0 -0
  248. {langgraph_api-0.8.6 → langgraph_api-0.9.0}/langgraph_grpc_common/proto/enum_cron_on_run_completed_pb2_grpc.py +0 -0
  249. {langgraph_api-0.8.6 → langgraph_api-0.9.0}/langgraph_grpc_common/proto/enum_cron_on_run_completed_pb2_grpc.pyi +0 -0
  250. {langgraph_api-0.8.6 → langgraph_api-0.9.0}/langgraph_grpc_common/proto/enum_durability_pb2.py +0 -0
  251. {langgraph_api-0.8.6 → langgraph_api-0.9.0}/langgraph_grpc_common/proto/enum_durability_pb2.pyi +0 -0
  252. {langgraph_api-0.8.6 → langgraph_api-0.9.0}/langgraph_grpc_common/proto/enum_durability_pb2_grpc.py +0 -0
  253. {langgraph_api-0.8.6 → langgraph_api-0.9.0}/langgraph_grpc_common/proto/enum_durability_pb2_grpc.pyi +0 -0
  254. {langgraph_api-0.8.6 → langgraph_api-0.9.0}/langgraph_grpc_common/proto/enum_multitask_strategy_pb2.py +0 -0
  255. {langgraph_api-0.8.6 → langgraph_api-0.9.0}/langgraph_grpc_common/proto/enum_multitask_strategy_pb2.pyi +0 -0
  256. {langgraph_api-0.8.6 → langgraph_api-0.9.0}/langgraph_grpc_common/proto/enum_multitask_strategy_pb2_grpc.py +0 -0
  257. {langgraph_api-0.8.6 → langgraph_api-0.9.0}/langgraph_grpc_common/proto/enum_multitask_strategy_pb2_grpc.pyi +0 -0
  258. {langgraph_api-0.8.6 → langgraph_api-0.9.0}/langgraph_grpc_common/proto/enum_run_status_pb2.py +0 -0
  259. {langgraph_api-0.8.6 → langgraph_api-0.9.0}/langgraph_grpc_common/proto/enum_run_status_pb2.pyi +0 -0
  260. {langgraph_api-0.8.6 → langgraph_api-0.9.0}/langgraph_grpc_common/proto/enum_run_status_pb2_grpc.py +0 -0
  261. {langgraph_api-0.8.6 → langgraph_api-0.9.0}/langgraph_grpc_common/proto/enum_run_status_pb2_grpc.pyi +0 -0
  262. {langgraph_api-0.8.6 → langgraph_api-0.9.0}/langgraph_grpc_common/proto/enum_stream_mode_pb2.py +0 -0
  263. {langgraph_api-0.8.6 → langgraph_api-0.9.0}/langgraph_grpc_common/proto/enum_stream_mode_pb2.pyi +0 -0
  264. {langgraph_api-0.8.6 → langgraph_api-0.9.0}/langgraph_grpc_common/proto/enum_stream_mode_pb2_grpc.py +0 -0
  265. {langgraph_api-0.8.6 → langgraph_api-0.9.0}/langgraph_grpc_common/proto/enum_stream_mode_pb2_grpc.pyi +0 -0
  266. {langgraph_api-0.8.6 → langgraph_api-0.9.0}/langgraph_grpc_common/proto/enum_thread_status_pb2.py +0 -0
  267. {langgraph_api-0.8.6 → langgraph_api-0.9.0}/langgraph_grpc_common/proto/enum_thread_status_pb2.pyi +0 -0
  268. {langgraph_api-0.8.6 → langgraph_api-0.9.0}/langgraph_grpc_common/proto/enum_thread_status_pb2_grpc.py +0 -0
  269. {langgraph_api-0.8.6 → langgraph_api-0.9.0}/langgraph_grpc_common/proto/enum_thread_status_pb2_grpc.pyi +0 -0
  270. {langgraph_api-0.8.6 → langgraph_api-0.9.0}/langgraph_grpc_common/proto/enum_thread_stream_mode_pb2.py +0 -0
  271. {langgraph_api-0.8.6 → langgraph_api-0.9.0}/langgraph_grpc_common/proto/enum_thread_stream_mode_pb2.pyi +0 -0
  272. {langgraph_api-0.8.6 → langgraph_api-0.9.0}/langgraph_grpc_common/proto/enum_thread_stream_mode_pb2_grpc.py +0 -0
  273. {langgraph_api-0.8.6 → langgraph_api-0.9.0}/langgraph_grpc_common/proto/enum_thread_stream_mode_pb2_grpc.pyi +0 -0
  274. {langgraph_api-0.8.6 → langgraph_api-0.9.0}/langgraph_grpc_common/proto/errors_pb2.py +0 -0
  275. {langgraph_api-0.8.6 → langgraph_api-0.9.0}/langgraph_grpc_common/proto/errors_pb2_grpc.py +0 -0
  276. {langgraph_api-0.8.6 → langgraph_api-0.9.0}/langgraph_grpc_common/proto/errors_pb2_grpc.pyi +0 -0
  277. {langgraph_api-0.8.6 → langgraph_api-0.9.0}/langgraph_grpc_common/serde.py +0 -0
  278. {langgraph_api-0.8.6 → langgraph_api-0.9.0}/langgraph_license/__init__.py +0 -0
  279. {langgraph_api-0.8.6 → langgraph_api-0.9.0}/langgraph_license/validation.py +0 -0
  280. {langgraph_api-0.8.6 → langgraph_api-0.9.0}/langgraph_runtime/__init__.py +0 -0
  281. {langgraph_api-0.8.6 → langgraph_api-0.9.0}/langgraph_runtime/checkpoint.py +0 -0
  282. {langgraph_api-0.8.6 → langgraph_api-0.9.0}/langgraph_runtime/database.py +0 -0
  283. {langgraph_api-0.8.6 → langgraph_api-0.9.0}/langgraph_runtime/lifespan.py +0 -0
  284. {langgraph_api-0.8.6 → langgraph_api-0.9.0}/langgraph_runtime/metrics.py +0 -0
  285. {langgraph_api-0.8.6 → langgraph_api-0.9.0}/langgraph_runtime/ops.py +0 -0
  286. {langgraph_api-0.8.6 → langgraph_api-0.9.0}/langgraph_runtime/queue.py +0 -0
  287. {langgraph_api-0.8.6 → langgraph_api-0.9.0}/langgraph_runtime/retry.py +0 -0
  288. {langgraph_api-0.8.6 → langgraph_api-0.9.0}/langgraph_runtime/routes.py +0 -0
  289. {langgraph_api-0.8.6 → langgraph_api-0.9.0}/langgraph_runtime/store.py +0 -0
  290. {langgraph_api-0.8.6 → langgraph_api-0.9.0}/logging.json +0 -0
  291. {langgraph_api-0.8.6 → langgraph_api-0.9.0}/scripts/build_wheel.py +0 -0
  292. {langgraph_api-0.8.6 → langgraph_api-0.9.0}/scripts/create_license.py +0 -0
  293. {langgraph_api-0.8.6 → langgraph_api-0.9.0}/scripts/run_a2a_tck.py +0 -0
@@ -1,7 +1,7 @@
1
1
  .PHONY: build release lint format test test_watch start start-inmem start-inmem-license-oss start start-js-server build-go-server start-go-server stop-go-server check-version check-base-imports test-a2a-tck test-a2a-tck-mandatory start-test-a2a-tck start-test-a2a-tck-mandatory start-test-a2a-tck-watch test-mcp-conformance start-test-mcp-conformance list-mcp-scenarios
2
2
 
3
3
  # Environment variables
4
- LANGSERVE_GRAPHS_ALL = '{"agent": {"path": "./tests/graphs/agent.py:graph", "description": "agent"}, "assistant_id_runtime": "./tests/graphs/assistant_id_runtime.py:graph", "custom_lifespan": "./tests/graphs/my_router.py:graph", "single_node": "./tests/graphs/single_node.py:graph", "benchmark": "./tests/graphs/benchmark.py:graph", "config_graph": "./tests/graphs/config_graph.py:graph", "other": "./tests/graphs/other.py:make_graph", "weather": "./tests/graphs/weather.py:mk_weather_graph", "searchy": "./tests/graphs/searchy.py:graph", "agent_simple": "./tests/graphs/agent_simple.py:graph", "simple_runtime": "./tests/graphs/simple_runtime.py:graph", "agent_interrupt": "./tests/graphs/agent_interrupt.py:graph", "agent_parallel_interrupt": "./tests/graphs/agent_parallel_interrupt.py:graph", "message_type_test": "./tests/graphs/message_type_test.py:graph", "remote_subgraph_parent": "./tests/graphs/remote_subgraph_parent.py:graph", "simple_remote": "./tests/graphs/simple_remote.py:graph", "nested_subgraphs": "./tests/graphs/nested_subgraphs.py:graph", "functional_fibonacci": "./tests/graphs/functional_fibonacci.py:fibonacci", "state_graph_fibonacci": "./tests/graphs/state_graph_fibonacci.py:fibonacci", "max_concurrency_graph": "./tests/graphs/max_concurrency_graph.py:graph", "unserializable_subgraph": "./tests/graphs/unserializable_subgraph.py:graph", "agent_interrupt_text": "./tests/graphs/agent_interrupt_text.py:graph", "agent_echo_stream": "./tests/graphs/agent_echo_stream.py:graph", "agent_tool_stream": "./tests/graphs/agent_tool_stream.py:graph", "runtime_graph": "./tests/graphs/runtime_graph.py:graph", "tool_call_chunk_stream": "./tests/graphs/tool_call_chunk_stream.py:graph", "ui_tool_call_stream": "./tests/graphs/ui_tool_call_stream.py:graph", "agent_metrics_stream": "./tests/graphs/agent_metrics_stream.py:graph", "agent_multimodal_stream": "./tests/graphs/agent_multimodal_stream.py:graph", "agent_bedtime_story": "./tests/graphs/agent_bedtime_story.py:graph"}'
4
+ LANGSERVE_GRAPHS_ALL = '{"agent": {"path": "./tests/graphs/agent.py:graph", "description": "agent"}, "assistant_id_runtime": "./tests/graphs/assistant_id_runtime.py:graph", "custom_lifespan": "./tests/graphs/my_router.py:graph", "single_node": "./tests/graphs/single_node.py:graph", "benchmark": "./tests/graphs/benchmark.py:graph", "config_graph": "./tests/graphs/config_graph.py:graph", "other": "./tests/graphs/other.py:make_graph", "weather": "./tests/graphs/weather.py:mk_weather_graph", "searchy": "./tests/graphs/searchy.py:graph", "agent_simple": "./tests/graphs/agent_simple.py:graph", "simple_runtime": "./tests/graphs/simple_runtime.py:graph", "agent_interrupt": "./tests/graphs/agent_interrupt.py:graph", "agent_parallel_interrupt": "./tests/graphs/agent_parallel_interrupt.py:graph", "message_type_test": "./tests/graphs/message_type_test.py:graph", "remote_subgraph_parent": "./tests/graphs/remote_subgraph_parent.py:graph", "simple_remote": "./tests/graphs/simple_remote.py:graph", "nested_subgraphs": "./tests/graphs/nested_subgraphs.py:graph", "functional_fibonacci": "./tests/graphs/functional_fibonacci.py:fibonacci", "state_graph_fibonacci": "./tests/graphs/state_graph_fibonacci.py:fibonacci", "max_concurrency_graph": "./tests/graphs/max_concurrency_graph.py:graph", "unserializable_subgraph": "./tests/graphs/unserializable_subgraph.py:graph", "agent_interrupt_text": "./tests/graphs/agent_interrupt_text.py:graph", "agent_echo_stream": "./tests/graphs/agent_echo_stream.py:graph", "agent_tool_stream": "./tests/graphs/agent_tool_stream.py:graph", "runtime_graph": "./tests/graphs/runtime_graph.py:graph", "tool_call_chunk_stream": "./tests/graphs/tool_call_chunk_stream.py:graph", "ui_tool_call_stream": "./tests/graphs/ui_tool_call_stream.py:graph", "agent_metrics_stream": "./tests/graphs/agent_metrics_stream.py:graph", "agent_multimodal_stream": "./tests/graphs/agent_multimodal_stream.py:graph", "agent_bedtime_story": "./tests/graphs/agent_bedtime_story.py:graph", "delta_channel": "./tests/graphs/delta_channel.py:graph", "delta_channel_freq": "./tests/graphs/delta_channel_freq.py:graph", "delta_channel_files": "./tests/graphs/delta_channel_files.py:graph", "delta_channel_files_freq": "./tests/graphs/delta_channel_files_freq.py:graph", "delta_channel_legacy": "./tests/graphs/delta_channel_migration.py:graph_legacy", "delta_channel_delta": "./tests/graphs/delta_channel_migration.py:graph_delta", "delta_channel_messages_freq": "./tests/graphs/delta_channel_messages.py:graph_freq", "delta_channel_messages": "./tests/graphs/delta_channel_messages.py:graph", "delta_channel_messages_legacy": "./tests/graphs/delta_channel_messages.py:graph_legacy", "delta_channel_messages_remove": "./tests/graphs/delta_channel_messages.py:graph_remove", "delta_channel_messages_update": "./tests/graphs/delta_channel_messages.py:graph_update", "delta_channel_messages_delta": "./tests/graphs/delta_channel_messages.py:graph_delta"}'
5
5
  LANGSERVE_GRAPHS_AUTH = '{"agent": {"path": "./tests/graphs/agent.py:graph", "description": "agent"}, "assistant_id_runtime": "./tests/graphs/assistant_id_runtime.py:graph", "config_graph": "./tests/graphs/config_graph.py:graph", "other": "./tests/graphs/other.py:make_graph", "weather": "./tests/graphs/weather.py:mk_weather_graph", "searchy": "./tests/graphs/searchy.py:graph", "agent_simple": "./tests/graphs/agent_simple.py:graph", "simple_runtime": "./tests/graphs/simple_runtime.py:graph", "agent_parallel_interrupt": "./tests/graphs/agent_parallel_interrupt.py:graph", "functional_fibonacci": "./tests/graphs/functional_fibonacci.py:fibonacci", "state_graph_fibonacci": "./tests/graphs/state_graph_fibonacci.py:fibonacci", "runtime_graph": "./tests/graphs/runtime_graph.py:graph"}'
6
6
 
7
7
  # Go server management
@@ -1,12 +1,12 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: langgraph-api
3
- Version: 0.8.6
3
+ Version: 0.9.0
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
7
7
  Requires-Python: >=3.11
8
8
  Requires-Dist: cloudpickle>=3.0.0
9
- Requires-Dist: cryptography<47.0,>=42.0.0
9
+ Requires-Dist: cryptography>=42.0.0
10
10
  Requires-Dist: grpcio-health-checking<1.81.0,>=1.80.0
11
11
  Requires-Dist: grpcio-tools==1.80.0
12
12
  Requires-Dist: grpcio<1.81.0,>=1.80.0
@@ -16,7 +16,7 @@ Requires-Dist: jsonschema-rs<0.45,>=0.20.0
16
16
  Requires-Dist: langchain-core>=0.3.64
17
17
  Requires-Dist: langchain-protocol<0.1,>=0.0.15
18
18
  Requires-Dist: langgraph-checkpoint<5,>=3.0.1
19
- Requires-Dist: langgraph-runtime-inmem<0.29.0,>=0.28.0
19
+ Requires-Dist: langgraph-runtime-inmem<0.30.0,>=0.29.0
20
20
  Requires-Dist: langgraph-sdk>=0.3.5
21
21
  Requires-Dist: langgraph<2,>=0.4.10
22
22
  Requires-Dist: langsmith[otel]>=0.6.3
@@ -130,15 +130,15 @@ requires-dist = [
130
130
 
131
131
  [[package]]
132
132
  name = "langgraph-sdk"
133
- version = "0.3.13"
133
+ version = "0.3.14"
134
134
  source = { registry = "https://pypi.org/simple" }
135
135
  dependencies = [
136
136
  { name = "httpx" },
137
137
  { name = "orjson" },
138
138
  ]
139
- sdist = { url = "https://files.pythonhosted.org/packages/0e/db/77a45127dddcfea5e4256ba916182903e4c31dc4cfca305b8c386f0a9e53/langgraph_sdk-0.3.13.tar.gz", hash = "sha256:419ca5663eec3cec192ad194ac0647c0c826866b446073eb40f384f950986cd5", size = 196360, upload-time = "2026-04-07T20:34:18.766Z" }
139
+ sdist = { url = "https://files.pythonhosted.org/packages/02/f1/134046c20bc4a4a15d410d1d21c9e298a3e9923777b4cc867b8669bc636b/langgraph_sdk-0.3.14.tar.gz", hash = "sha256:acd1674c538e97f3cdaa610f6dd7e34bc9bad30167f0ccc482dcd563325e81f5", size = 198162, upload-time = "2026-05-05T18:40:03.524Z" }
140
140
  wheels = [
141
- { url = "https://files.pythonhosted.org/packages/fe/ef/64d64e9f8eea47ce7b939aa6da6863b674c8d418647813c20111645fcc62/langgraph_sdk-0.3.13-py3-none-any.whl", hash = "sha256:aee09e345c90775f6de9d6f4c7b847cfc652e49055c27a2aed0d981af2af3bd0", size = 96668, upload-time = "2026-04-07T20:34:17.866Z" },
141
+ { url = "https://files.pythonhosted.org/packages/34/96/1c9f9fbfe756ddd850a2585e7f1949d8ebb97fdaa7a5eff8f45ed1314670/langgraph_sdk-0.3.14-py3-none-any.whl", hash = "sha256:68935bf6f4924eda92617a9e5dfb4f4281197508c648cb9d62ff083907607f9d", size = 97028, upload-time = "2026-05-05T18:40:02.099Z" },
142
142
  ]
143
143
 
144
144
  [[package]]
@@ -220,9 +220,9 @@ wheels = [
220
220
 
221
221
  [[package]]
222
222
  name = "urllib3"
223
- version = "2.6.3"
223
+ version = "2.7.0"
224
224
  source = { registry = "https://pypi.org/simple" }
225
- sdist = { url = "https://files.pythonhosted.org/packages/c7/24/5f1b3bdffd70275f6661c76461e25f024d5a38a46f04aaca912426a2b1d3/urllib3-2.6.3.tar.gz", hash = "sha256:1b62b6884944a57dbe321509ab94fd4d3b307075e0c2eae991ac71ee15ad38ed", size = 435556, upload-time = "2026-01-07T16:24:43.925Z" }
225
+ sdist = { url = "https://files.pythonhosted.org/packages/53/0c/06f8b233b8fd13b9e5ee11424ef85419ba0d8ba0b3138bf360be2ff56953/urllib3-2.7.0.tar.gz", hash = "sha256:231e0ec3b63ceb14667c67be60f2f2c40a518cb38b03af60abc813da26505f4c", size = 433602, upload-time = "2026-05-07T16:13:18.596Z" }
226
226
  wheels = [
227
- { url = "https://files.pythonhosted.org/packages/39/08/aaaad47bc4e9dc8c725e68f9d04865dbcb2052843ff09c97b08904852d84/urllib3-2.6.3-py3-none-any.whl", hash = "sha256:bf272323e553dfb2e87d9bfd225ca7b0f467b919d7bbd355436d3fd37cb0acd4", size = 131584, upload-time = "2026-01-07T16:24:42.685Z" },
227
+ { url = "https://files.pythonhosted.org/packages/7f/3e/5db95bcf282c52709639744ca2a8b149baccf648e39c8cc87553df9eae0c/urllib3-2.7.0-py3-none-any.whl", hash = "sha256:9fb4c81ebbb1ce9531cce37674bbc6f1360472bc18ca9a553ede278ef7276897", size = 131087, upload-time = "2026-05-07T16:13:17.151Z" },
228
228
  ]
@@ -1,6 +1,8 @@
1
1
  import { sleep } from 'k6';
2
2
  import { Counter, Trend } from 'k6/metrics';
3
- import { randomIntBetween } from 'https://jslib.k6.io/k6-utils/1.2.0/index.js';
3
+ function randomIntBetween(min, max) {
4
+ return Math.floor(Math.random() * (max - min + 1) + min);
5
+ }
4
6
  import { Benchmarks } from './benchmark-runners/dist/benchmarks.js';
5
7
  import { get_profile } from './benchmark-runners/dist/benchmark_profiles.js';
6
8
 
@@ -0,0 +1 @@
1
+ __version__ = "0.9.0"
@@ -15,11 +15,11 @@ from starlette.routing import BaseRoute, Route
15
15
  from langgraph_api import timing
16
16
  from langgraph_api.api.a2a import a2a_routes
17
17
  from langgraph_api.api.assistants import assistants_routes
18
+ from langgraph_api.api.event_streaming import event_streaming_routes
18
19
  from langgraph_api.api.mcp import mcp_routes
19
20
  from langgraph_api.api.meta import meta_info, meta_metrics
20
21
  from langgraph_api.api.openapi import get_openapi_spec
21
22
  from langgraph_api.api.profile import profile_routes
22
- from langgraph_api.api.protocol import protocol_routes
23
23
  from langgraph_api.api.runs import runs_routes
24
24
  from langgraph_api.api.store import store_routes
25
25
  from langgraph_api.api.threads import threads_routes
@@ -31,7 +31,10 @@ from langgraph_api.config import (
31
31
  LANGGRAPH_ENCRYPTION,
32
32
  MIGRATIONS_PATH,
33
33
  )
34
- from langgraph_api.feature_flags import IS_POSTGRES_OR_GRPC_BACKEND
34
+ from langgraph_api.feature_flags import (
35
+ FF_V2_EVENT_STREAMING,
36
+ IS_POSTGRES_OR_GRPC_BACKEND,
37
+ )
35
38
  from langgraph_api.graph import js_bg_tasks
36
39
  from langgraph_api.grpc.client import get_shared_client
37
40
  from langgraph_api.js.base import is_js_path
@@ -132,8 +135,20 @@ if HTTP_CONFIG:
132
135
  protected_routes.extend(mcp_routes)
133
136
  if not HTTP_CONFIG.get("disable_a2a"):
134
137
  protected_routes.extend(a2a_routes)
135
- if not HTTP_CONFIG.get("disable_runs") and not HTTP_CONFIG.get("disable_protocol"):
136
- protected_routes.extend(protocol_routes)
138
+ # ``disable_runs`` also gates event streaming because the v2 transport
139
+ # exposes run-creating commands (``run.start`` / ``run.cancel`` /
140
+ # ``run.attach`` over the WS, plus the ``/runs/{run_id}/protocol``
141
+ # attach route). If an operator hardens a deployment with
142
+ # ``disable_runs=true``, leaving event streaming open would be a
143
+ # backdoor that lets clients create runs anyway. ``disable_event_streaming``
144
+ # is the narrow knob (turn off just v2); ``disable_runs`` is the broad
145
+ # knob (no run-related functionality at all).
146
+ if (
147
+ FF_V2_EVENT_STREAMING
148
+ and not HTTP_CONFIG.get("disable_runs")
149
+ and not HTTP_CONFIG.get("disable_event_streaming")
150
+ ):
151
+ protected_routes.extend(event_streaming_routes)
137
152
  else:
138
153
  protected_routes.extend(assistants_routes)
139
154
  protected_routes.extend(runs_routes)
@@ -144,7 +159,8 @@ else:
144
159
  protected_routes.extend(ui_routes)
145
160
  protected_routes.extend(mcp_routes)
146
161
  protected_routes.extend(a2a_routes)
147
- protected_routes.extend(protocol_routes)
162
+ if FF_V2_EVENT_STREAMING:
163
+ protected_routes.extend(event_streaming_routes)
148
164
 
149
165
 
150
166
  def _metadata_fn(app_import: str) -> dict[str, str]:
@@ -1,7 +1,9 @@
1
- """Protocol v2 transport routes (thread-centric).
1
+ """V2 event streaming transport routes (thread-centric).
2
2
 
3
- The protocol is thread-centric (v0.5.0): every connection is scoped to a
4
- thread via the URL path, and there is no server-side session state.
3
+ These routes implement the v2 event streaming protocol see
4
+ :mod:`langgraph_api.event_streaming` for the session/normalizer layer that
5
+ shapes the wire events. Connections are scoped to a thread via the URL
6
+ path; there is no server-side session state across connections.
5
7
 
6
8
  Endpoints:
7
9
 
@@ -19,6 +21,8 @@ Endpoints:
19
21
  from __future__ import annotations
20
22
 
21
23
  import asyncio
24
+ import contextlib
25
+ from collections import deque
22
26
  from typing import TYPE_CHECKING, Any
23
27
  from uuid import uuid4
24
28
 
@@ -27,10 +31,10 @@ import structlog
27
31
  from starlette.responses import Response
28
32
  from starlette.websockets import WebSocketDisconnect
29
33
 
34
+ from langgraph_api.event_streaming.service import ThreadRunManager
35
+ from langgraph_api.event_streaming.session import _is_supported_channel
36
+ from langgraph_api.event_streaming.types import Subscription
30
37
  from langgraph_api.feature_flags import IS_POSTGRES_OR_GRPC_BACKEND
31
- from langgraph_api.protocol.service import ThreadRunManager
32
- from langgraph_api.protocol.session import _is_supported_channel
33
- from langgraph_api.protocol.types import Subscription
34
38
  from langgraph_api.route import ApiRoute, ApiWebSocketRoute
35
39
  from langgraph_api.serde import json_dumpb
36
40
  from langgraph_api.sse import EventSourceResponse
@@ -47,6 +51,17 @@ else:
47
51
  logger = structlog.stdlib.get_logger(__name__)
48
52
 
49
53
 
54
+ # Maximum number of recently-delivered ``event_id`` values an SSE
55
+ # connection remembers for dedup. The dedup window only needs to cover
56
+ # the brief race where a single event arrives both via the thread
57
+ # source consumer and via the session's send callback (subscription
58
+ # install handoff); after that, events flow through one path
59
+ # consistently. Cap chosen with ample headroom — a pathological
60
+ # replay storm of 2k events still fits in <50 KB of strings per
61
+ # connection, vs. the unbounded set this replaces.
62
+ _DELIVERED_DEDUP_WINDOW = 2048
63
+
64
+
50
65
  def _json_response(content: Any, *, status_code: int = 200) -> Response:
51
66
  """JSON response backed by the repo's orjson helper.
52
67
 
@@ -80,35 +95,6 @@ def _make_manager(thread_id: str, send_event: Any = None) -> ThreadRunManager:
80
95
  # ---------------------------------------------------------------------------
81
96
 
82
97
 
83
- def _parse_since(body: Any, headers: Any) -> int | None:
84
- """Resolve the effective resume cursor from body and headers.
85
-
86
- Precedence: ``since`` in the ``EventStreamRequest`` body wins, falling
87
- back to the ``Last-Event-ID`` header. Both are interpreted as the
88
- last protocol ``seq`` the client received; the server replays events
89
- with ``seq > since``.
90
- """
91
- body_since: int | None = None
92
- if isinstance(body, dict):
93
- raw_since = body.get("since")
94
- if isinstance(raw_since, int) and raw_since >= 0:
95
- body_since = raw_since
96
-
97
- header_since: int | None = None
98
- last_event_id = headers.get("last-event-id") if headers is not None else None
99
- if isinstance(last_event_id, str) and last_event_id.strip():
100
- try:
101
- parsed = int(last_event_id.strip())
102
- except ValueError:
103
- parsed = -1
104
- if parsed >= 0:
105
- header_since = parsed
106
-
107
- if body_since is not None and header_since is not None:
108
- return max(body_since, header_since)
109
- return body_since if body_since is not None else header_since
110
-
111
-
112
98
  async def _thread_events(request: Request) -> Response:
113
99
  """SSE stream scoped to a thread.
114
100
 
@@ -121,12 +107,11 @@ async def _thread_events(request: Request) -> Response:
121
107
  "since": 42 // optional seq
122
108
  }
123
109
 
124
- On reconnect, clients may either set ``since`` in the body or send the
125
- standard ``Last-Event-ID`` header (the value of the ``id:`` field of
126
- the last event they received). Both are interpreted as the last
127
- ``seq`` the client saw; buffered events with ``seq > since`` are
128
- replayed before the stream goes live. If both are provided, the
129
- higher (most recent) value wins.
110
+ On reconnect, clients pass the last ``seq`` they received as
111
+ ``since`` in the body. Buffered events with ``seq > since`` are
112
+ replayed before the stream goes live. The endpoint is POST-only, so
113
+ browser-native ``EventSource`` auto-resume (``Last-Event-ID``)
114
+ doesn't apply clients drive resume explicitly via the body.
130
115
 
131
116
  The filter applies for the lifetime of the connection; closing the
132
117
  connection unsubscribes. No state is persisted server-side beyond the
@@ -186,26 +171,45 @@ async def _thread_events(request: Request) -> Response:
186
171
  namespaces = filtered_ns or None
187
172
 
188
173
  depth = body.get("depth") if isinstance(body, dict) else None
189
- if not isinstance(depth, int) or depth < 0:
174
+ # ``bool`` is a subclass of ``int``, so a JSON ``"depth": false`` would
175
+ # otherwise fall through as ``depth=0`` ("only the exact prefix
176
+ # namespace, no deeper") and silently mute every nested-subgraph
177
+ # event. Treat any non-int (including bool) as "no depth limit".
178
+ if not isinstance(depth, int) or isinstance(depth, bool) or depth < 0:
190
179
  depth = None
191
180
 
192
- since = _parse_since(body, request.headers)
181
+ raw_since = body.get("since") if isinstance(body, dict) else None
182
+ # Reject ``bool`` explicitly — ``isinstance(True, int)`` is ``True``
183
+ # so a JSON ``"since": true`` would otherwise pass as ``since=1``
184
+ # and silently skip the first buffered event on reconnect.
185
+ since: int | None = (
186
+ raw_since
187
+ if isinstance(raw_since, int)
188
+ and not isinstance(raw_since, bool)
189
+ and raw_since >= 0
190
+ else None
191
+ )
193
192
 
193
+ # Bounded LRU dedup: ``recent_eids`` is the eviction order, ``delivered``
194
+ # is the O(1) membership view. When the deque hits its cap, the oldest
195
+ # entry rolls off; we mirror that on ``delivered`` to keep them in sync.
196
+ recent_eids: deque[str] = deque(maxlen=_DELIVERED_DEDUP_WINDOW)
194
197
  delivered: set[str] = set()
195
198
  pending_events: list[dict[str, Any]] = []
196
199
  flush_pending = asyncio.Event()
197
200
 
198
201
  async def on_event(event: dict[str, Any]) -> None:
199
202
  eid = event.get("event_id")
200
- if eid is None:
201
- return
202
- if eid in delivered:
203
+ if eid is None or eid in delivered:
203
204
  return
204
205
  # Guard against events with seq <= since slipping through (e.g.
205
206
  # events delivered via the session's send callback before the
206
207
  # subscription is installed with replay).
207
208
  if since is not None and event.get("seq", 0) <= since:
208
209
  return
210
+ if len(recent_eids) == recent_eids.maxlen:
211
+ delivered.discard(recent_eids[0])
212
+ recent_eids.append(eid)
209
213
  delivered.add(eid)
210
214
  pending_events.append(event)
211
215
  flush_pending.set()
@@ -219,14 +223,47 @@ async def _thread_events(request: Request) -> Response:
219
223
  depth=depth,
220
224
  active=False,
221
225
  )
226
+ await logger.adebug(
227
+ "Installing event streaming subscription",
228
+ thread_id=thread_id,
229
+ subscription_id=filter_sub.id,
230
+ channels=sorted(filter_sub.channels),
231
+ depth=depth,
232
+ since=since,
233
+ )
222
234
 
223
235
  manager.install_subscription(filter_sub)
224
- manager.start_thread_stream(since=since)
236
+ # ``since`` is enforced by ``on_event`` above as a seq filter on
237
+ # outbound events; the thread-level reader always replays from the
238
+ # beginning so namespace-scoped projections see history. See
239
+ # ``ThreadRunManager.start_thread_stream`` for the rationale.
240
+ manager.start_thread_stream()
225
241
 
226
242
  async def body_iter():
227
243
  try:
228
244
  while True:
229
- await flush_pending.wait()
245
+ # Race ``flush_pending`` against the thread-stream consumer
246
+ # ending. If the consumer dies (transient join_event_streaming
247
+ # error, or normal shutdown), we want this loop to exit
248
+ # rather than wedge forever waiting for events that will
249
+ # never arrive.
250
+ flush_task = asyncio.create_task(flush_pending.wait())
251
+ done_task = asyncio.create_task(manager.wait_for_thread_stream_end())
252
+ try:
253
+ done, _pending = await asyncio.wait(
254
+ {flush_task, done_task},
255
+ return_when=asyncio.FIRST_COMPLETED,
256
+ )
257
+ finally:
258
+ for p in (flush_task, done_task):
259
+ if not p.done():
260
+ p.cancel()
261
+ with contextlib.suppress(asyncio.CancelledError, Exception):
262
+ await p
263
+ stream_finished = done_task in done
264
+ # Always drain whatever was buffered before exiting so a
265
+ # final batch that arrived alongside the consumer's exit
266
+ # still reaches the client.
230
267
  flush_pending.clear()
231
268
  events = pending_events[:]
232
269
  pending_events.clear()
@@ -234,10 +271,10 @@ async def _thread_events(request: Request) -> Response:
234
271
  # The wire ``event_id`` (inside the JSON body) carries
235
272
  # the durable upstream Redis stream entry id used by
236
273
  # the client's ``seenEventIds`` for cross-session
237
- # dedup. The SSE ``id:`` field needs a monotonic
238
- # integer so ``Last-Event-ID`` resume stays compatible
239
- # with :func:`_parse_since` (which parses it as an
240
- # ``int`` seq, session-local).
274
+ # dedup. The SSE ``id:`` field carries the protocol
275
+ # ``seq`` (session-local monotonic int) so server
276
+ # logs and traces can correlate against the body
277
+ # ``since`` cursor a reconnecting client sends.
241
278
  sse_id = event.get("seq")
242
279
  method = event.get("method", "event")
243
280
  yield (
@@ -245,6 +282,8 @@ async def _thread_events(request: Request) -> Response:
245
282
  json_dumpb(event),
246
283
  str(sse_id).encode() if isinstance(sse_id, int) else None,
247
284
  )
285
+ if stream_finished:
286
+ break
248
287
  finally:
249
288
  await manager.close()
250
289
 
@@ -275,6 +314,13 @@ async def _thread_command(request: Request) -> Response:
275
314
  or not isinstance(payload.get("id"), int)
276
315
  or not isinstance(payload.get("method"), str)
277
316
  ):
317
+ await logger.awarning(
318
+ "Rejected malformed event streaming command",
319
+ thread_id=thread_id,
320
+ payload_id=payload.get("id") if isinstance(payload, dict) else None,
321
+ payload_method=payload.get("method") if isinstance(payload, dict) else None,
322
+ payload_type=type(payload).__name__,
323
+ )
278
324
  return _json_response(
279
325
  {
280
326
  "type": "error",
@@ -316,6 +362,19 @@ async def _thread_websocket(websocket: WebSocket) -> None:
316
362
  manager = _make_manager(thread_id, send_event=ws_send_event)
317
363
  manager.start_thread_stream()
318
364
 
365
+ # Watchdog: when the thread-stream consumer ends (transient
366
+ # ``join_event_streaming`` failure or normal shutdown), close the socket so
367
+ # the client sees a clean disconnect instead of an open connection
368
+ # that will never deliver another event. ``receive_text`` below
369
+ # raises ``WebSocketDisconnect`` once the close lands, exiting the
370
+ # loop through its existing handler.
371
+ async def _stream_watchdog() -> None:
372
+ await manager.wait_for_thread_stream_end()
373
+ with contextlib.suppress(Exception):
374
+ await websocket.close(code=1011, reason="thread stream ended")
375
+
376
+ watchdog = asyncio.create_task(_stream_watchdog())
377
+
319
378
  try:
320
379
  while True:
321
380
  raw = await websocket.receive_text()
@@ -354,6 +413,9 @@ async def _thread_websocket(websocket: WebSocket) -> None:
354
413
  except Exception:
355
414
  logger.exception("Protocol WebSocket error")
356
415
  finally:
416
+ watchdog.cancel()
417
+ with contextlib.suppress(asyncio.CancelledError, Exception):
418
+ await watchdog
357
419
  await manager.close()
358
420
 
359
421
 
@@ -361,7 +423,7 @@ async def _thread_websocket(websocket: WebSocket) -> None:
361
423
  # Route list
362
424
  # ---------------------------------------------------------------------------
363
425
 
364
- protocol_routes: list[ApiRoute | ApiWebSocketRoute] = [
426
+ event_streaming_routes: list[ApiRoute | ApiWebSocketRoute] = [
365
427
  ApiRoute(
366
428
  "/threads/{thread_id}/stream/events",
367
429
  _thread_events,
@@ -933,6 +933,7 @@ async def search_crons(request: ApiRequest):
933
933
  assistant_id=assistant_id,
934
934
  thread_id=thread_id,
935
935
  enabled=payload.get("enabled", None),
936
+ metadata=payload.get("metadata"),
936
937
  limit=int(payload.get("limit", 10)),
937
938
  offset=offset,
938
939
  sort_by=payload.get("sort_by"),
@@ -963,6 +964,7 @@ async def count_crons(request: ApiRequest):
963
964
  conn,
964
965
  assistant_id=assistant_id,
965
966
  thread_id=thread_id,
967
+ metadata=payload.get("metadata"),
966
968
  )
967
969
  return ApiResponse(count)
968
970
 
@@ -45,6 +45,16 @@ DATABASE_URI = env("DATABASE_URI", cast=str, default=getenv("POSTGRES_URI", unde
45
45
  # Not in public docs: infrastructure, set by platform
46
46
  MIGRATIONS_PATH = env("MIGRATIONS_PATH", cast=str, default="/storage/migrations")
47
47
  POSTGRES_POOL_MAX_SIZE = env("LANGGRAPH_POSTGRES_POOL_MAX_SIZE", cast=int, default=150)
48
+ CHECKPOINTER_POSTGRES_POOL_MIN_SIZE = env(
49
+ "LANGGRAPH_CHECKPOINTER_POSTGRES_POOL_MIN_SIZE",
50
+ cast=int,
51
+ default=1,
52
+ )
53
+ CHECKPOINTER_POSTGRES_POOL_TIMEOUT_SECONDS = env(
54
+ "LANGGRAPH_CHECKPOINTER_POSTGRES_POOL_TIMEOUT_SECONDS",
55
+ cast=float,
56
+ default=15.0,
57
+ )
48
58
 
49
59
  # Checkpoint ingestion batch controls
50
60
  # Go defaults (core/config/config.go): CHECKPOINT_MAX_BATCH_SIZE=1000, CHECKPOINT_BATCH_DELAY=0.005 (5ms)
@@ -182,15 +192,15 @@ LSD_GRPC_SERVER_MAX_SEND_MSG_BYTES = env(
182
192
  "LSD_GRPC_SERVER_MAX_SEND_MSG_BYTES", cast=int, default=300 * 1024 * 1024
183
193
  )
184
194
  LSD_PUBLISH_QUEUE_SIZE = env("LSD_PUBLISH_QUEUE_SIZE", cast=int, default=512)
185
- # Per-run protocol v2 event buffer size. Each ``RunProtocolSession``
195
+ # Per-run protocol v2 event buffer size. Each ``EventStreamingSession``
186
196
  # retains at most this many normalized protocol events for
187
- # reconnecting clients to replay via ``since`` / ``Last-Event-ID``.
197
+ # reconnecting clients to replay via the body ``since`` cursor.
188
198
  # When the limit is exceeded, oldest events are evicted; reconnects
189
199
  # whose cursor falls behind the buffer head receive a ``resume_gap``
190
200
  # error. Operators running graphs that emit >10k events per run can
191
201
  # bump this to avoid gaps on flaky networks, at the cost of memory
192
202
  # (roughly ``size * avg_event_bytes`` per active run). See
193
- # ``langgraph_api.protocol.constants.DEFAULT_MAX_BUFFER_SIZE``.
203
+ # ``langgraph_api.event_streaming.constants.DEFAULT_MAX_BUFFER_SIZE``.
194
204
  _DEFAULT_PROTOCOL_V2_BUFFER_SIZE = 10_000
195
205
  LSD_PROTOCOL_V2_BUFFER_SIZE = env(
196
206
  "LSD_PROTOCOL_V2_BUFFER_SIZE",
@@ -616,6 +626,8 @@ __all__ = [
616
626
  "BG_JOB_SHUTDOWN_GRACE_PERIOD_SECS",
617
627
  "BG_JOB_TIMEOUT_SECS",
618
628
  "CHECKPOINTER_CONFIG",
629
+ "CHECKPOINTER_POSTGRES_POOL_MIN_SIZE",
630
+ "CHECKPOINTER_POSTGRES_POOL_TIMEOUT_SECONDS",
619
631
  "CHECKPOINT_BATCH_DELAY",
620
632
  "CHECKPOINT_MAX_BATCH_SIZE",
621
633
  "CORS_ALLOW_ORIGINS",
@@ -57,12 +57,21 @@ class ProtocolV2Capabilities:
57
57
 
58
58
  ok: bool
59
59
  missing: tuple[str, ...]
60
+ # Replaces the default "missing langgraph symbols" wording when the
61
+ # server has disabled v2 deliberately (e.g. ``FF_V2_EVENT_STREAMING=false``).
62
+ # Library-version mismatches and operator-disabled v2 produce the same
63
+ # ``unsupported`` envelope, but with very different ``"upgrade your
64
+ # deps"`` vs ``"flip the flag"`` remediation paths — keep them
65
+ # distinguishable in the error string.
66
+ reason_override: str | None = None
60
67
 
61
68
  @property
62
69
  def error_message(self) -> str:
63
70
  """Human-readable explanation suitable for a command error envelope."""
64
71
  if self.ok:
65
72
  return ""
73
+ if self.reason_override is not None:
74
+ return self.reason_override
66
75
  return (
67
76
  "Protocol v2 streaming is not supported by the installed "
68
77
  "langgraph/langchain-core version. Missing symbol(s): "
@@ -73,6 +82,18 @@ class ProtocolV2Capabilities:
73
82
  "LifecycleTransformer, and ChatModelStream)."
74
83
  )
75
84
 
85
+ @classmethod
86
+ def disabled_by_flag(cls) -> ProtocolV2Capabilities:
87
+ """Build a capabilities result for ``FF_V2_EVENT_STREAMING=false``."""
88
+ return cls(
89
+ ok=False,
90
+ missing=(),
91
+ reason_override=(
92
+ "Protocol v2 event streaming is disabled on this server "
93
+ "(FF_V2_EVENT_STREAMING=false). Set FF_V2_EVENT_STREAMING=true to enable."
94
+ ),
95
+ )
96
+
76
97
 
77
98
  # Submodule paths are intentional — ``StreamMux`` et al. are not
78
99
  # re-exported from ``langgraph.stream`` / ``langgraph.pregel`` top-level,
@@ -90,7 +111,7 @@ _REQUIRED_SYMBOLS: tuple[tuple[str, str], ...] = (
90
111
 
91
112
 
92
113
  @lru_cache(maxsize=1)
93
- def probe_protocol_v2_capabilities() -> ProtocolV2Capabilities:
114
+ def probe_event_streaming_v2_capabilities() -> ProtocolV2Capabilities:
94
115
  """Check the installed runtime for Protocol v2 streaming support.
95
116
 
96
117
  Result is memoised for the process lifetime — the underlying
@@ -1,8 +1,8 @@
1
1
  from __future__ import annotations
2
2
 
3
- PROTOCOL_MESSAGES_STREAM_CONFIG_KEY = "__protocol_messages_stream"
3
+ EVENT_STREAMING_V2_CONFIG_KEY = "__event_streaming_v2"
4
4
 
5
- # Ring-buffer size for ``RunProtocolSession``. Events beyond this point
5
+ # Ring-buffer size for ``EventStreamingSession``. Events beyond this point
6
6
  # are dropped (oldest-first) from the replay buffer. Internal
7
7
  # memory-safety cap — not tunable over the wire, but operators can
8
8
  # override via the ``LSD_PROTOCOL_V2_BUFFER_SIZE`` env var (see