langgraph-api 0.16.0.dev6__tar.gz → 0.16.0.dev8__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 (326) hide show
  1. {langgraph_api-0.16.0.dev6 → langgraph_api-0.16.0.dev8}/PKG-INFO +2 -1
  2. {langgraph_api-0.16.0.dev6 → langgraph_api-0.16.0.dev8}/benchmark/README.md +38 -8
  3. {langgraph_api-0.16.0.dev6 → langgraph_api-0.16.0.dev8}/benchmark/benchmark-runners/benchmark_profiles.ts +67 -0
  4. {langgraph_api-0.16.0.dev6 → langgraph_api-0.16.0.dev8}/benchmark/benchmark-runners/benchmarks.ts +3 -0
  5. {langgraph_api-0.16.0.dev6 → langgraph_api-0.16.0.dev8}/benchmark/benchmark-runners/delta-turns-lib.test.js +13 -0
  6. {langgraph_api-0.16.0.dev6 → langgraph_api-0.16.0.dev8}/benchmark/benchmark-runners/delta-turns-lib.ts +10 -0
  7. {langgraph_api-0.16.0.dev6 → langgraph_api-0.16.0.dev8}/benchmark/benchmark-runners/delta_turns.ts +42 -4
  8. langgraph_api-0.16.0.dev8/benchmark/benchmark-runners/interrupt_resume.ts +119 -0
  9. {langgraph_api-0.16.0.dev6 → langgraph_api-0.16.0.dev8}/benchmark/benchmark-runners/types.ts +3 -0
  10. langgraph_api-0.16.0.dev8/benchmark/capacity-ci.js +1025 -0
  11. langgraph_api-0.16.0.dev8/benchmark/capacity-ci.test.js +404 -0
  12. {langgraph_api-0.16.0.dev6 → langgraph_api-0.16.0.dev8}/benchmark/continuous/uv.lock +3 -3
  13. langgraph_api-0.16.0.dev8/benchmark/daily-report.js +503 -0
  14. langgraph_api-0.16.0.dev8/benchmark/daily-report.test.js +463 -0
  15. langgraph_api-0.16.0.dev8/benchmark/history.js +204 -0
  16. langgraph_api-0.16.0.dev8/benchmark/history.test.js +123 -0
  17. {langgraph_api-0.16.0.dev6 → langgraph_api-0.16.0.dev8}/benchmark/host-v2.js +23 -0
  18. {langgraph_api-0.16.0.dev6 → langgraph_api-0.16.0.dev8}/benchmark/ramp.js +23 -27
  19. langgraph_api-0.16.0.dev8/benchmark/runner-descriptions.js +58 -0
  20. langgraph_api-0.16.0.dev8/benchmark/server-metrics.js +95 -0
  21. langgraph_api-0.16.0.dev8/benchmark/server-metrics.test.js +63 -0
  22. langgraph_api-0.16.0.dev8/benchmark/slack.js +49 -0
  23. {langgraph_api-0.16.0.dev6 → langgraph_api-0.16.0.dev8}/benchmark/staircase.py +59 -2
  24. {langgraph_api-0.16.0.dev6 → langgraph_api-0.16.0.dev8}/benchmark/staircase_step_k6.js +28 -3
  25. langgraph_api-0.16.0.dev8/langgraph_api/__init__.py +1 -0
  26. {langgraph_api-0.16.0.dev6 → langgraph_api-0.16.0.dev8}/langgraph_api/api/a2a.py +8 -11
  27. {langgraph_api-0.16.0.dev6 → langgraph_api-0.16.0.dev8}/langgraph_api/api/threads.py +24 -0
  28. {langgraph_api-0.16.0.dev6 → langgraph_api-0.16.0.dev8}/langgraph_api/grpc/ops/threads.py +2 -0
  29. {langgraph_api-0.16.0.dev6 → langgraph_api-0.16.0.dev8}/langgraph_api/grpc/servicers/checkpointer.py +2 -2
  30. {langgraph_api-0.16.0.dev6 → langgraph_api-0.16.0.dev8}/langgraph_api/schema.py +2 -0
  31. {langgraph_api-0.16.0.dev6 → langgraph_api-0.16.0.dev8}/langgraph_api/state.py +11 -5
  32. {langgraph_api-0.16.0.dev6 → langgraph_api-0.16.0.dev8}/langgraph_grpc_common/checkpointer.py +7 -6
  33. {langgraph_api-0.16.0.dev6 → langgraph_api-0.16.0.dev8}/langgraph_grpc_common/conversion/checkpoint.py +11 -2
  34. {langgraph_api-0.16.0.dev6 → langgraph_api-0.16.0.dev8}/langgraph_grpc_common/conversion/config.py +31 -20
  35. langgraph_api-0.16.0.dev8/langgraph_grpc_common/proto/core_api_pb2.py +274 -0
  36. {langgraph_api-0.16.0.dev6 → langgraph_api-0.16.0.dev8}/langgraph_grpc_common/proto/core_api_pb2.pyi +10 -2
  37. {langgraph_api-0.16.0.dev6 → langgraph_api-0.16.0.dev8}/openapi.json +124 -0
  38. {langgraph_api-0.16.0.dev6 → langgraph_api-0.16.0.dev8}/pyproject.toml +1 -0
  39. {langgraph_api-0.16.0.dev6 → langgraph_api-0.16.0.dev8}/uv.lock +5 -3
  40. langgraph_api-0.16.0.dev6/benchmark/capacity-ci.js +0 -658
  41. langgraph_api-0.16.0.dev6/benchmark/capacity-ci.test.js +0 -138
  42. langgraph_api-0.16.0.dev6/benchmark/daily-report.js +0 -263
  43. langgraph_api-0.16.0.dev6/benchmark/daily-report.test.js +0 -242
  44. langgraph_api-0.16.0.dev6/langgraph_api/__init__.py +0 -1
  45. langgraph_api-0.16.0.dev6/langgraph_grpc_common/proto/core_api_pb2.py +0 -274
  46. {langgraph_api-0.16.0.dev6 → langgraph_api-0.16.0.dev8}/.gitignore +0 -0
  47. {langgraph_api-0.16.0.dev6 → langgraph_api-0.16.0.dev8}/LICENSE +0 -0
  48. {langgraph_api-0.16.0.dev6 → langgraph_api-0.16.0.dev8}/Makefile +0 -0
  49. {langgraph_api-0.16.0.dev6 → langgraph_api-0.16.0.dev8}/README.md +0 -0
  50. {langgraph_api-0.16.0.dev6 → langgraph_api-0.16.0.dev8}/benchmark/.gitignore +0 -0
  51. {langgraph_api-0.16.0.dev6 → langgraph_api-0.16.0.dev8}/benchmark/Makefile +0 -0
  52. {langgraph_api-0.16.0.dev6 → langgraph_api-0.16.0.dev8}/benchmark/benchmark-runners/assistant.ts +0 -0
  53. {langgraph_api-0.16.0.dev6 → langgraph_api-0.16.0.dev8}/benchmark/benchmark-runners/benchmark-runner.ts +0 -0
  54. {langgraph_api-0.16.0.dev6 → langgraph_api-0.16.0.dev8}/benchmark/benchmark-runners/cancel_first_second_completes.ts +0 -0
  55. {langgraph_api-0.16.0.dev6 → langgraph_api-0.16.0.dev8}/benchmark/benchmark-runners/classify-error.test.js +0 -0
  56. {langgraph_api-0.16.0.dev6 → langgraph_api-0.16.0.dev8}/benchmark/benchmark-runners/classify-error.ts +0 -0
  57. {langgraph_api-0.16.0.dev6 → langgraph_api-0.16.0.dev8}/benchmark/benchmark-runners/enqueued_runs_order.ts +0 -0
  58. {langgraph_api-0.16.0.dev6 → langgraph_api-0.16.0.dev8}/benchmark/benchmark-runners/log-failure.ts +0 -0
  59. {langgraph_api-0.16.0.dev6 → langgraph_api-0.16.0.dev8}/benchmark/benchmark-runners/meta_workload.ts +0 -0
  60. {langgraph_api-0.16.0.dev6 → langgraph_api-0.16.0.dev8}/benchmark/benchmark-runners/store.ts +0 -0
  61. {langgraph_api-0.16.0.dev6 → langgraph_api-0.16.0.dev8}/benchmark/benchmark-runners/stream_write.ts +0 -0
  62. {langgraph_api-0.16.0.dev6 → langgraph_api-0.16.0.dev8}/benchmark/benchmark-runners/thread.ts +0 -0
  63. {langgraph_api-0.16.0.dev6 → langgraph_api-0.16.0.dev8}/benchmark/benchmark-runners/thread_runs_metadata_search.ts +0 -0
  64. {langgraph_api-0.16.0.dev6 → langgraph_api-0.16.0.dev8}/benchmark/benchmark-runners/threads_search_metadata.ts +0 -0
  65. {langgraph_api-0.16.0.dev6 → langgraph_api-0.16.0.dev8}/benchmark/benchmark-runners/wait_write.ts +0 -0
  66. {langgraph_api-0.16.0.dev6 → langgraph_api-0.16.0.dev8}/benchmark/clean-cli.js +0 -0
  67. {langgraph_api-0.16.0.dev6 → langgraph_api-0.16.0.dev8}/benchmark/clean.js +0 -0
  68. {langgraph_api-0.16.0.dev6 → langgraph_api-0.16.0.dev8}/benchmark/continuous/README.md +0 -0
  69. {langgraph_api-0.16.0.dev6 → langgraph_api-0.16.0.dev8}/benchmark/continuous/pyproject.toml +0 -0
  70. {langgraph_api-0.16.0.dev6 → langgraph_api-0.16.0.dev8}/benchmark/continuous/runner.py +0 -0
  71. {langgraph_api-0.16.0.dev6 → langgraph_api-0.16.0.dev8}/benchmark/graphs.js +0 -0
  72. {langgraph_api-0.16.0.dev6 → langgraph_api-0.16.0.dev8}/benchmark/host-v2.test.js +0 -0
  73. {langgraph_api-0.16.0.dev6 → langgraph_api-0.16.0.dev8}/benchmark/multer.test.js +0 -0
  74. {langgraph_api-0.16.0.dev6 → langgraph_api-0.16.0.dev8}/benchmark/package.json +0 -0
  75. {langgraph_api-0.16.0.dev6 → langgraph_api-0.16.0.dev8}/benchmark/reporting/dd_reporting.py +0 -0
  76. {langgraph_api-0.16.0.dev6 → langgraph_api-0.16.0.dev8}/benchmark/tsconfig.json +0 -0
  77. {langgraph_api-0.16.0.dev6 → langgraph_api-0.16.0.dev8}/benchmark/update-revision.js +0 -0
  78. {langgraph_api-0.16.0.dev6 → langgraph_api-0.16.0.dev8}/benchmark/weather.js +0 -0
  79. {langgraph_api-0.16.0.dev6 → langgraph_api-0.16.0.dev8}/benchmark/yarn.lock +0 -0
  80. {langgraph_api-0.16.0.dev6 → langgraph_api-0.16.0.dev8}/constraints.txt +0 -0
  81. {langgraph_api-0.16.0.dev6 → langgraph_api-0.16.0.dev8}/custom_store.sql +0 -0
  82. {langgraph_api-0.16.0.dev6 → langgraph_api-0.16.0.dev8}/forbidden.txt +0 -0
  83. {langgraph_api-0.16.0.dev6 → langgraph_api-0.16.0.dev8}/hatch_build.py +0 -0
  84. {langgraph_api-0.16.0.dev6 → langgraph_api-0.16.0.dev8}/healthcheck.py +0 -0
  85. {langgraph_api-0.16.0.dev6 → langgraph_api-0.16.0.dev8}/langgraph-cloud-debugging-20260210132856.zip +0 -0
  86. {langgraph_api-0.16.0.dev6 → langgraph_api-0.16.0.dev8}/langgraph_api/_checkpointer/__init__.py +0 -0
  87. {langgraph_api-0.16.0.dev6 → langgraph_api-0.16.0.dev8}/langgraph_api/_checkpointer/_adapter.py +0 -0
  88. {langgraph_api-0.16.0.dev6 → langgraph_api-0.16.0.dev8}/langgraph_api/_checkpointer/protocol.py +0 -0
  89. {langgraph_api-0.16.0.dev6 → langgraph_api-0.16.0.dev8}/langgraph_api/_factory_utils.py +0 -0
  90. {langgraph_api-0.16.0.dev6 → langgraph_api-0.16.0.dev8}/langgraph_api/api/__init__.py +0 -0
  91. {langgraph_api-0.16.0.dev6 → langgraph_api-0.16.0.dev8}/langgraph_api/api/a2ui.py +0 -0
  92. {langgraph_api-0.16.0.dev6 → langgraph_api-0.16.0.dev8}/langgraph_api/api/a2ui_schemas/README.md +0 -0
  93. {langgraph_api-0.16.0.dev6 → langgraph_api-0.16.0.dev8}/langgraph_api/api/a2ui_schemas/client_capabilities.json +0 -0
  94. {langgraph_api-0.16.0.dev6 → langgraph_api-0.16.0.dev8}/langgraph_api/api/a2ui_schemas/client_data_model.json +0 -0
  95. {langgraph_api-0.16.0.dev6 → langgraph_api-0.16.0.dev8}/langgraph_api/api/a2ui_schemas/client_to_server.json +0 -0
  96. {langgraph_api-0.16.0.dev6 → langgraph_api-0.16.0.dev8}/langgraph_api/api/a2ui_schemas/server_to_client.json +0 -0
  97. {langgraph_api-0.16.0.dev6 → langgraph_api-0.16.0.dev8}/langgraph_api/api/assistants.py +0 -0
  98. {langgraph_api-0.16.0.dev6 → langgraph_api-0.16.0.dev8}/langgraph_api/api/event_streaming.py +0 -0
  99. {langgraph_api-0.16.0.dev6 → langgraph_api-0.16.0.dev8}/langgraph_api/api/mcp/__init__.py +0 -0
  100. {langgraph_api-0.16.0.dev6 → langgraph_api-0.16.0.dev8}/langgraph_api/api/mcp/_constants.py +0 -0
  101. {langgraph_api-0.16.0.dev6 → langgraph_api-0.16.0.dev8}/langgraph_api/api/mcp/_handlers.py +0 -0
  102. {langgraph_api-0.16.0.dev6 → langgraph_api-0.16.0.dev8}/langgraph_api/api/mcp/_models.py +0 -0
  103. {langgraph_api-0.16.0.dev6 → langgraph_api-0.16.0.dev8}/langgraph_api/api/mcp/_routes.py +0 -0
  104. {langgraph_api-0.16.0.dev6 → langgraph_api-0.16.0.dev8}/langgraph_api/api/mcp/_sanitizers.py +0 -0
  105. {langgraph_api-0.16.0.dev6 → langgraph_api-0.16.0.dev8}/langgraph_api/api/meta.py +0 -0
  106. {langgraph_api-0.16.0.dev6 → langgraph_api-0.16.0.dev8}/langgraph_api/api/openapi.py +0 -0
  107. {langgraph_api-0.16.0.dev6 → langgraph_api-0.16.0.dev8}/langgraph_api/api/profile.py +0 -0
  108. {langgraph_api-0.16.0.dev6 → langgraph_api-0.16.0.dev8}/langgraph_api/api/runs.py +0 -0
  109. {langgraph_api-0.16.0.dev6 → langgraph_api-0.16.0.dev8}/langgraph_api/api/store.py +0 -0
  110. {langgraph_api-0.16.0.dev6 → langgraph_api-0.16.0.dev8}/langgraph_api/api/ui.py +0 -0
  111. {langgraph_api-0.16.0.dev6 → langgraph_api-0.16.0.dev8}/langgraph_api/asgi_transport.py +0 -0
  112. {langgraph_api-0.16.0.dev6 → langgraph_api-0.16.0.dev8}/langgraph_api/asyncio.py +0 -0
  113. {langgraph_api-0.16.0.dev6 → langgraph_api-0.16.0.dev8}/langgraph_api/auth/__init__.py +0 -0
  114. {langgraph_api-0.16.0.dev6 → langgraph_api-0.16.0.dev8}/langgraph_api/auth/custom.py +0 -0
  115. {langgraph_api-0.16.0.dev6 → langgraph_api-0.16.0.dev8}/langgraph_api/auth/errors.py +0 -0
  116. {langgraph_api-0.16.0.dev6 → langgraph_api-0.16.0.dev8}/langgraph_api/auth/langsmith/__init__.py +0 -0
  117. {langgraph_api-0.16.0.dev6 → langgraph_api-0.16.0.dev8}/langgraph_api/auth/langsmith/backend.py +0 -0
  118. {langgraph_api-0.16.0.dev6 → langgraph_api-0.16.0.dev8}/langgraph_api/auth/langsmith/client.py +0 -0
  119. {langgraph_api-0.16.0.dev6 → langgraph_api-0.16.0.dev8}/langgraph_api/auth/middleware.py +0 -0
  120. {langgraph_api-0.16.0.dev6 → langgraph_api-0.16.0.dev8}/langgraph_api/auth/noop.py +0 -0
  121. {langgraph_api-0.16.0.dev6 → langgraph_api-0.16.0.dev8}/langgraph_api/auth/studio_user.py +0 -0
  122. {langgraph_api-0.16.0.dev6 → langgraph_api-0.16.0.dev8}/langgraph_api/beacon_data_plane_jwt_auth.py +0 -0
  123. {langgraph_api-0.16.0.dev6 → langgraph_api-0.16.0.dev8}/langgraph_api/cache.py +0 -0
  124. {langgraph_api-0.16.0.dev6 → langgraph_api-0.16.0.dev8}/langgraph_api/cli.py +0 -0
  125. {langgraph_api-0.16.0.dev6 → langgraph_api-0.16.0.dev8}/langgraph_api/command.py +0 -0
  126. {langgraph_api-0.16.0.dev6 → langgraph_api-0.16.0.dev8}/langgraph_api/config/__init__.py +0 -0
  127. {langgraph_api-0.16.0.dev6 → langgraph_api-0.16.0.dev8}/langgraph_api/config/_parse.py +0 -0
  128. {langgraph_api-0.16.0.dev6 → langgraph_api-0.16.0.dev8}/langgraph_api/config/schemas.py +0 -0
  129. {langgraph_api-0.16.0.dev6 → langgraph_api-0.16.0.dev8}/langgraph_api/cron_scheduler.py +0 -0
  130. {langgraph_api-0.16.0.dev6 → langgraph_api-0.16.0.dev8}/langgraph_api/encryption/__init__.py +0 -0
  131. {langgraph_api-0.16.0.dev6 → langgraph_api-0.16.0.dev8}/langgraph_api/encryption/aes_json.py +0 -0
  132. {langgraph_api-0.16.0.dev6 → langgraph_api-0.16.0.dev8}/langgraph_api/encryption/context.py +0 -0
  133. {langgraph_api-0.16.0.dev6 → langgraph_api-0.16.0.dev8}/langgraph_api/encryption/custom.py +0 -0
  134. {langgraph_api-0.16.0.dev6 → langgraph_api-0.16.0.dev8}/langgraph_api/encryption/middleware.py +0 -0
  135. {langgraph_api-0.16.0.dev6 → langgraph_api-0.16.0.dev8}/langgraph_api/encryption/shared.py +0 -0
  136. {langgraph_api-0.16.0.dev6 → langgraph_api-0.16.0.dev8}/langgraph_api/errors.py +0 -0
  137. {langgraph_api-0.16.0.dev6 → langgraph_api-0.16.0.dev8}/langgraph_api/event_streaming/__init__.py +0 -0
  138. {langgraph_api-0.16.0.dev6 → langgraph_api-0.16.0.dev8}/langgraph_api/event_streaming/capabilities.py +0 -0
  139. {langgraph_api-0.16.0.dev6 → langgraph_api-0.16.0.dev8}/langgraph_api/event_streaming/constants.py +0 -0
  140. {langgraph_api-0.16.0.dev6 → langgraph_api-0.16.0.dev8}/langgraph_api/event_streaming/event_normalizers.py +0 -0
  141. {langgraph_api-0.16.0.dev6 → langgraph_api-0.16.0.dev8}/langgraph_api/event_streaming/namespace.py +0 -0
  142. {langgraph_api-0.16.0.dev6 → langgraph_api-0.16.0.dev8}/langgraph_api/event_streaming/service.py +0 -0
  143. {langgraph_api-0.16.0.dev6 → langgraph_api-0.16.0.dev8}/langgraph_api/event_streaming/session.py +0 -0
  144. {langgraph_api-0.16.0.dev6 → langgraph_api-0.16.0.dev8}/langgraph_api/event_streaming/state_normalizers.py +0 -0
  145. {langgraph_api-0.16.0.dev6 → langgraph_api-0.16.0.dev8}/langgraph_api/event_streaming/types.py +0 -0
  146. {langgraph_api-0.16.0.dev6 → langgraph_api-0.16.0.dev8}/langgraph_api/feature_flags.py +0 -0
  147. {langgraph_api-0.16.0.dev6 → langgraph_api-0.16.0.dev8}/langgraph_api/graph.py +0 -0
  148. {langgraph_api-0.16.0.dev6 → langgraph_api-0.16.0.dev8}/langgraph_api/grpc/__init__.py +0 -0
  149. {langgraph_api-0.16.0.dev6 → langgraph_api-0.16.0.dev8}/langgraph_api/grpc/client.py +0 -0
  150. {langgraph_api-0.16.0.dev6 → langgraph_api-0.16.0.dev8}/langgraph_api/grpc/generated/core_api_pb2.pyi +0 -0
  151. {langgraph_api-0.16.0.dev6 → langgraph_api-0.16.0.dev8}/langgraph_api/grpc/ops/__init__.py +0 -0
  152. {langgraph_api-0.16.0.dev6 → langgraph_api-0.16.0.dev8}/langgraph_api/grpc/ops/assistants.py +0 -0
  153. {langgraph_api-0.16.0.dev6 → langgraph_api-0.16.0.dev8}/langgraph_api/grpc/ops/cache.py +0 -0
  154. {langgraph_api-0.16.0.dev6 → langgraph_api-0.16.0.dev8}/langgraph_api/grpc/ops/crons.py +0 -0
  155. {langgraph_api-0.16.0.dev6 → langgraph_api-0.16.0.dev8}/langgraph_api/grpc/ops/runs.py +0 -0
  156. {langgraph_api-0.16.0.dev6 → langgraph_api-0.16.0.dev8}/langgraph_api/grpc/server.py +0 -0
  157. {langgraph_api-0.16.0.dev6 → langgraph_api-0.16.0.dev8}/langgraph_api/grpc/servicers/__init__.py +0 -0
  158. {langgraph_api-0.16.0.dev6 → langgraph_api-0.16.0.dev8}/langgraph_api/grpc/servicers/encryption.py +0 -0
  159. {langgraph_api-0.16.0.dev6 → langgraph_api-0.16.0.dev8}/langgraph_api/http.py +0 -0
  160. {langgraph_api-0.16.0.dev6 → langgraph_api-0.16.0.dev8}/langgraph_api/http_metrics.py +0 -0
  161. {langgraph_api-0.16.0.dev6 → langgraph_api-0.16.0.dev8}/langgraph_api/http_metrics_utils.py +0 -0
  162. {langgraph_api-0.16.0.dev6 → langgraph_api-0.16.0.dev8}/langgraph_api/js/.gitignore +0 -0
  163. {langgraph_api-0.16.0.dev6 → langgraph_api-0.16.0.dev8}/langgraph_api/js/.prettierrc +0 -0
  164. {langgraph_api-0.16.0.dev6 → langgraph_api-0.16.0.dev8}/langgraph_api/js/.yarnclean +0 -0
  165. {langgraph_api-0.16.0.dev6 → langgraph_api-0.16.0.dev8}/langgraph_api/js/__init__.py +0 -0
  166. {langgraph_api-0.16.0.dev6 → langgraph_api-0.16.0.dev8}/langgraph_api/js/base.py +0 -0
  167. {langgraph_api-0.16.0.dev6 → langgraph_api-0.16.0.dev8}/langgraph_api/js/build.mts +0 -0
  168. {langgraph_api-0.16.0.dev6 → langgraph_api-0.16.0.dev8}/langgraph_api/js/client.http.mts +0 -0
  169. {langgraph_api-0.16.0.dev6 → langgraph_api-0.16.0.dev8}/langgraph_api/js/client.mts +0 -0
  170. {langgraph_api-0.16.0.dev6 → langgraph_api-0.16.0.dev8}/langgraph_api/js/errors.py +0 -0
  171. {langgraph_api-0.16.0.dev6 → langgraph_api-0.16.0.dev8}/langgraph_api/js/global.d.ts +0 -0
  172. {langgraph_api-0.16.0.dev6 → langgraph_api-0.16.0.dev8}/langgraph_api/js/package.json +0 -0
  173. {langgraph_api-0.16.0.dev6 → langgraph_api-0.16.0.dev8}/langgraph_api/js/remote.py +0 -0
  174. {langgraph_api-0.16.0.dev6 → langgraph_api-0.16.0.dev8}/langgraph_api/js/schema.py +0 -0
  175. {langgraph_api-0.16.0.dev6 → langgraph_api-0.16.0.dev8}/langgraph_api/js/src/graph.mts +0 -0
  176. {langgraph_api-0.16.0.dev6 → langgraph_api-0.16.0.dev8}/langgraph_api/js/src/load.hooks.mjs +0 -0
  177. {langgraph_api-0.16.0.dev6 → langgraph_api-0.16.0.dev8}/langgraph_api/js/src/preload.mjs +0 -0
  178. {langgraph_api-0.16.0.dev6 → langgraph_api-0.16.0.dev8}/langgraph_api/js/src/utils/experiment-tracing.mts +0 -0
  179. {langgraph_api-0.16.0.dev6 → langgraph_api-0.16.0.dev8}/langgraph_api/js/src/utils/files.mts +0 -0
  180. {langgraph_api-0.16.0.dev6 → langgraph_api-0.16.0.dev8}/langgraph_api/js/src/utils/importMap.mts +0 -0
  181. {langgraph_api-0.16.0.dev6 → langgraph_api-0.16.0.dev8}/langgraph_api/js/src/utils/pythonSchemas.mts +0 -0
  182. {langgraph_api-0.16.0.dev6 → langgraph_api-0.16.0.dev8}/langgraph_api/js/src/utils/serde.mts +0 -0
  183. {langgraph_api-0.16.0.dev6 → langgraph_api-0.16.0.dev8}/langgraph_api/js/sse.py +0 -0
  184. {langgraph_api-0.16.0.dev6 → langgraph_api-0.16.0.dev8}/langgraph_api/js/traceblock.mts +0 -0
  185. {langgraph_api-0.16.0.dev6 → langgraph_api-0.16.0.dev8}/langgraph_api/js/tsconfig.json +0 -0
  186. {langgraph_api-0.16.0.dev6 → langgraph_api-0.16.0.dev8}/langgraph_api/js/ui.py +0 -0
  187. {langgraph_api-0.16.0.dev6 → langgraph_api-0.16.0.dev8}/langgraph_api/js/yarn.lock +0 -0
  188. {langgraph_api-0.16.0.dev6 → langgraph_api-0.16.0.dev8}/langgraph_api/lc_security/__init__.py +0 -0
  189. {langgraph_api-0.16.0.dev6 → langgraph_api-0.16.0.dev8}/langgraph_api/lc_security/exceptions.py +0 -0
  190. {langgraph_api-0.16.0.dev6 → langgraph_api-0.16.0.dev8}/langgraph_api/lc_security/policy.py +0 -0
  191. {langgraph_api-0.16.0.dev6 → langgraph_api-0.16.0.dev8}/langgraph_api/lc_security/transport.py +0 -0
  192. {langgraph_api-0.16.0.dev6 → langgraph_api-0.16.0.dev8}/langgraph_api/logging.py +0 -0
  193. {langgraph_api-0.16.0.dev6 → langgraph_api-0.16.0.dev8}/langgraph_api/metadata.py +0 -0
  194. {langgraph_api-0.16.0.dev6 → langgraph_api-0.16.0.dev8}/langgraph_api/metrics_collector.py +0 -0
  195. {langgraph_api-0.16.0.dev6 → langgraph_api-0.16.0.dev8}/langgraph_api/metrics_otlp.py +0 -0
  196. {langgraph_api-0.16.0.dev6 → langgraph_api-0.16.0.dev8}/langgraph_api/middleware/__init__.py +0 -0
  197. {langgraph_api-0.16.0.dev6 → langgraph_api-0.16.0.dev8}/langgraph_api/middleware/ensure_store.py +0 -0
  198. {langgraph_api-0.16.0.dev6 → langgraph_api-0.16.0.dev8}/langgraph_api/middleware/http_logger.py +0 -0
  199. {langgraph_api-0.16.0.dev6 → langgraph_api-0.16.0.dev8}/langgraph_api/middleware/private_network.py +0 -0
  200. {langgraph_api-0.16.0.dev6 → langgraph_api-0.16.0.dev8}/langgraph_api/middleware/request_id.py +0 -0
  201. {langgraph_api-0.16.0.dev6 → langgraph_api-0.16.0.dev8}/langgraph_api/models/__init__.py +0 -0
  202. {langgraph_api-0.16.0.dev6 → langgraph_api-0.16.0.dev8}/langgraph_api/models/run.py +0 -0
  203. {langgraph_api-0.16.0.dev6 → langgraph_api-0.16.0.dev8}/langgraph_api/otel_context.py +0 -0
  204. {langgraph_api-0.16.0.dev6 → langgraph_api-0.16.0.dev8}/langgraph_api/patch.py +0 -0
  205. {langgraph_api-0.16.0.dev6 → langgraph_api-0.16.0.dev8}/langgraph_api/queue_entrypoint.py +0 -0
  206. {langgraph_api-0.16.0.dev6 → langgraph_api-0.16.0.dev8}/langgraph_api/release_tags.py +0 -0
  207. {langgraph_api-0.16.0.dev6 → langgraph_api-0.16.0.dev8}/langgraph_api/route.py +0 -0
  208. {langgraph_api-0.16.0.dev6 → langgraph_api-0.16.0.dev8}/langgraph_api/runner/__init__.py +0 -0
  209. {langgraph_api-0.16.0.dev6 → langgraph_api-0.16.0.dev8}/langgraph_api/runner/__main__.py +0 -0
  210. {langgraph_api-0.16.0.dev6 → langgraph_api-0.16.0.dev8}/langgraph_api/self_hosted_logs.py +0 -0
  211. {langgraph_api-0.16.0.dev6 → langgraph_api-0.16.0.dev8}/langgraph_api/self_hosted_metrics.py +0 -0
  212. {langgraph_api-0.16.0.dev6 → langgraph_api-0.16.0.dev8}/langgraph_api/serde.py +0 -0
  213. {langgraph_api-0.16.0.dev6 → langgraph_api-0.16.0.dev8}/langgraph_api/server.py +0 -0
  214. {langgraph_api-0.16.0.dev6 → langgraph_api-0.16.0.dev8}/langgraph_api/sse.py +0 -0
  215. {langgraph_api-0.16.0.dev6 → langgraph_api-0.16.0.dev8}/langgraph_api/store.py +0 -0
  216. {langgraph_api-0.16.0.dev6 → langgraph_api-0.16.0.dev8}/langgraph_api/stream.py +0 -0
  217. {langgraph_api-0.16.0.dev6 → langgraph_api-0.16.0.dev8}/langgraph_api/stream_v2.py +0 -0
  218. {langgraph_api-0.16.0.dev6 → langgraph_api-0.16.0.dev8}/langgraph_api/timing/__init__.py +0 -0
  219. {langgraph_api-0.16.0.dev6 → langgraph_api-0.16.0.dev8}/langgraph_api/timing/profiler.py +0 -0
  220. {langgraph_api-0.16.0.dev6 → langgraph_api-0.16.0.dev8}/langgraph_api/timing/timer.py +0 -0
  221. {langgraph_api-0.16.0.dev6 → langgraph_api-0.16.0.dev8}/langgraph_api/traceblock.py +0 -0
  222. {langgraph_api-0.16.0.dev6 → langgraph_api-0.16.0.dev8}/langgraph_api/tracing_session.py +0 -0
  223. {langgraph_api-0.16.0.dev6 → langgraph_api-0.16.0.dev8}/langgraph_api/tunneling/cloudflare.py +0 -0
  224. {langgraph_api-0.16.0.dev6 → langgraph_api-0.16.0.dev8}/langgraph_api/utils/__init__.py +0 -0
  225. {langgraph_api-0.16.0.dev6 → langgraph_api-0.16.0.dev8}/langgraph_api/utils/cache.py +0 -0
  226. {langgraph_api-0.16.0.dev6 → langgraph_api-0.16.0.dev8}/langgraph_api/utils/config.py +0 -0
  227. {langgraph_api-0.16.0.dev6 → langgraph_api-0.16.0.dev8}/langgraph_api/utils/errors.py +0 -0
  228. {langgraph_api-0.16.0.dev6 → langgraph_api-0.16.0.dev8}/langgraph_api/utils/extract.py +0 -0
  229. {langgraph_api-0.16.0.dev6 → langgraph_api-0.16.0.dev8}/langgraph_api/utils/future.py +0 -0
  230. {langgraph_api-0.16.0.dev6 → langgraph_api-0.16.0.dev8}/langgraph_api/utils/headers.py +0 -0
  231. {langgraph_api-0.16.0.dev6 → langgraph_api-0.16.0.dev8}/langgraph_api/utils/network.py +0 -0
  232. {langgraph_api-0.16.0.dev6 → langgraph_api-0.16.0.dev8}/langgraph_api/utils/retriable_client.py +0 -0
  233. {langgraph_api-0.16.0.dev6 → langgraph_api-0.16.0.dev8}/langgraph_api/utils/stream_codec.py +0 -0
  234. {langgraph_api-0.16.0.dev6 → langgraph_api-0.16.0.dev8}/langgraph_api/utils/uuids.py +0 -0
  235. {langgraph_api-0.16.0.dev6 → langgraph_api-0.16.0.dev8}/langgraph_api/validation.py +0 -0
  236. {langgraph_api-0.16.0.dev6 → langgraph_api-0.16.0.dev8}/langgraph_api/webhook.py +0 -0
  237. {langgraph_api-0.16.0.dev6 → langgraph_api-0.16.0.dev8}/langgraph_api/worker.py +0 -0
  238. {langgraph_api-0.16.0.dev6 → langgraph_api-0.16.0.dev8}/langgraph_api/worker_runtime.py +0 -0
  239. {langgraph_api-0.16.0.dev6 → langgraph_api-0.16.0.dev8}/langgraph_grpc_common/__init__.py +0 -0
  240. {langgraph_api-0.16.0.dev6 → langgraph_api-0.16.0.dev8}/langgraph_grpc_common/conversion/__init__.py +0 -0
  241. {langgraph_api-0.16.0.dev6 → langgraph_api-0.16.0.dev8}/langgraph_grpc_common/conversion/_compat.py +0 -0
  242. {langgraph_api-0.16.0.dev6 → langgraph_api-0.16.0.dev8}/langgraph_grpc_common/conversion/durability.py +0 -0
  243. {langgraph_api-0.16.0.dev6 → langgraph_api-0.16.0.dev8}/langgraph_grpc_common/conversion/store.py +0 -0
  244. {langgraph_api-0.16.0.dev6 → langgraph_api-0.16.0.dev8}/langgraph_grpc_common/conversion/struct.py +0 -0
  245. {langgraph_api-0.16.0.dev6 → langgraph_api-0.16.0.dev8}/langgraph_grpc_common/conversion/value.py +0 -0
  246. {langgraph_api-0.16.0.dev6 → langgraph_api-0.16.0.dev8}/langgraph_grpc_common/proto/__init__.py +0 -0
  247. {langgraph_api-0.16.0.dev6 → langgraph_api-0.16.0.dev8}/langgraph_grpc_common/proto/checkpointer_pb2.py +0 -0
  248. {langgraph_api-0.16.0.dev6 → langgraph_api-0.16.0.dev8}/langgraph_grpc_common/proto/checkpointer_pb2.pyi +0 -0
  249. {langgraph_api-0.16.0.dev6 → langgraph_api-0.16.0.dev8}/langgraph_grpc_common/proto/checkpointer_pb2_grpc.py +0 -0
  250. {langgraph_api-0.16.0.dev6 → langgraph_api-0.16.0.dev8}/langgraph_grpc_common/proto/checkpointer_pb2_grpc.pyi +0 -0
  251. {langgraph_api-0.16.0.dev6 → langgraph_api-0.16.0.dev8}/langgraph_grpc_common/proto/core_api_pb2_grpc.py +0 -0
  252. {langgraph_api-0.16.0.dev6 → langgraph_api-0.16.0.dev8}/langgraph_grpc_common/proto/core_api_pb2_grpc.pyi +0 -0
  253. {langgraph_api-0.16.0.dev6 → langgraph_api-0.16.0.dev8}/langgraph_grpc_common/proto/encryption_pb2.py +0 -0
  254. {langgraph_api-0.16.0.dev6 → langgraph_api-0.16.0.dev8}/langgraph_grpc_common/proto/encryption_pb2.pyi +0 -0
  255. {langgraph_api-0.16.0.dev6 → langgraph_api-0.16.0.dev8}/langgraph_grpc_common/proto/encryption_pb2_grpc.py +0 -0
  256. {langgraph_api-0.16.0.dev6 → langgraph_api-0.16.0.dev8}/langgraph_grpc_common/proto/encryption_pb2_grpc.pyi +0 -0
  257. {langgraph_api-0.16.0.dev6 → langgraph_api-0.16.0.dev8}/langgraph_grpc_common/proto/engine_common_pb2.py +0 -0
  258. {langgraph_api-0.16.0.dev6 → langgraph_api-0.16.0.dev8}/langgraph_grpc_common/proto/engine_common_pb2.pyi +0 -0
  259. {langgraph_api-0.16.0.dev6 → langgraph_api-0.16.0.dev8}/langgraph_grpc_common/proto/engine_common_pb2_grpc.py +0 -0
  260. {langgraph_api-0.16.0.dev6 → langgraph_api-0.16.0.dev8}/langgraph_grpc_common/proto/engine_common_pb2_grpc.pyi +0 -0
  261. {langgraph_api-0.16.0.dev6 → langgraph_api-0.16.0.dev8}/langgraph_grpc_common/proto/enum_cancel_run_action_pb2.py +0 -0
  262. {langgraph_api-0.16.0.dev6 → langgraph_api-0.16.0.dev8}/langgraph_grpc_common/proto/enum_cancel_run_action_pb2.pyi +0 -0
  263. {langgraph_api-0.16.0.dev6 → langgraph_api-0.16.0.dev8}/langgraph_grpc_common/proto/enum_cancel_run_action_pb2_grpc.py +0 -0
  264. {langgraph_api-0.16.0.dev6 → langgraph_api-0.16.0.dev8}/langgraph_grpc_common/proto/enum_cancel_run_action_pb2_grpc.pyi +0 -0
  265. {langgraph_api-0.16.0.dev6 → langgraph_api-0.16.0.dev8}/langgraph_grpc_common/proto/enum_control_signal_pb2.py +0 -0
  266. {langgraph_api-0.16.0.dev6 → langgraph_api-0.16.0.dev8}/langgraph_grpc_common/proto/enum_control_signal_pb2.pyi +0 -0
  267. {langgraph_api-0.16.0.dev6 → langgraph_api-0.16.0.dev8}/langgraph_grpc_common/proto/enum_control_signal_pb2_grpc.py +0 -0
  268. {langgraph_api-0.16.0.dev6 → langgraph_api-0.16.0.dev8}/langgraph_grpc_common/proto/enum_control_signal_pb2_grpc.pyi +0 -0
  269. {langgraph_api-0.16.0.dev6 → langgraph_api-0.16.0.dev8}/langgraph_grpc_common/proto/enum_cron_on_run_completed_pb2.py +0 -0
  270. {langgraph_api-0.16.0.dev6 → langgraph_api-0.16.0.dev8}/langgraph_grpc_common/proto/enum_cron_on_run_completed_pb2.pyi +0 -0
  271. {langgraph_api-0.16.0.dev6 → langgraph_api-0.16.0.dev8}/langgraph_grpc_common/proto/enum_cron_on_run_completed_pb2_grpc.py +0 -0
  272. {langgraph_api-0.16.0.dev6 → langgraph_api-0.16.0.dev8}/langgraph_grpc_common/proto/enum_cron_on_run_completed_pb2_grpc.pyi +0 -0
  273. {langgraph_api-0.16.0.dev6 → langgraph_api-0.16.0.dev8}/langgraph_grpc_common/proto/enum_durability_pb2.py +0 -0
  274. {langgraph_api-0.16.0.dev6 → langgraph_api-0.16.0.dev8}/langgraph_grpc_common/proto/enum_durability_pb2.pyi +0 -0
  275. {langgraph_api-0.16.0.dev6 → langgraph_api-0.16.0.dev8}/langgraph_grpc_common/proto/enum_durability_pb2_grpc.py +0 -0
  276. {langgraph_api-0.16.0.dev6 → langgraph_api-0.16.0.dev8}/langgraph_grpc_common/proto/enum_durability_pb2_grpc.pyi +0 -0
  277. {langgraph_api-0.16.0.dev6 → langgraph_api-0.16.0.dev8}/langgraph_grpc_common/proto/enum_multitask_strategy_pb2.py +0 -0
  278. {langgraph_api-0.16.0.dev6 → langgraph_api-0.16.0.dev8}/langgraph_grpc_common/proto/enum_multitask_strategy_pb2.pyi +0 -0
  279. {langgraph_api-0.16.0.dev6 → langgraph_api-0.16.0.dev8}/langgraph_grpc_common/proto/enum_multitask_strategy_pb2_grpc.py +0 -0
  280. {langgraph_api-0.16.0.dev6 → langgraph_api-0.16.0.dev8}/langgraph_grpc_common/proto/enum_multitask_strategy_pb2_grpc.pyi +0 -0
  281. {langgraph_api-0.16.0.dev6 → langgraph_api-0.16.0.dev8}/langgraph_grpc_common/proto/enum_run_status_pb2.py +0 -0
  282. {langgraph_api-0.16.0.dev6 → langgraph_api-0.16.0.dev8}/langgraph_grpc_common/proto/enum_run_status_pb2.pyi +0 -0
  283. {langgraph_api-0.16.0.dev6 → langgraph_api-0.16.0.dev8}/langgraph_grpc_common/proto/enum_run_status_pb2_grpc.py +0 -0
  284. {langgraph_api-0.16.0.dev6 → langgraph_api-0.16.0.dev8}/langgraph_grpc_common/proto/enum_run_status_pb2_grpc.pyi +0 -0
  285. {langgraph_api-0.16.0.dev6 → langgraph_api-0.16.0.dev8}/langgraph_grpc_common/proto/enum_stream_mode_pb2.py +0 -0
  286. {langgraph_api-0.16.0.dev6 → langgraph_api-0.16.0.dev8}/langgraph_grpc_common/proto/enum_stream_mode_pb2.pyi +0 -0
  287. {langgraph_api-0.16.0.dev6 → langgraph_api-0.16.0.dev8}/langgraph_grpc_common/proto/enum_stream_mode_pb2_grpc.py +0 -0
  288. {langgraph_api-0.16.0.dev6 → langgraph_api-0.16.0.dev8}/langgraph_grpc_common/proto/enum_stream_mode_pb2_grpc.pyi +0 -0
  289. {langgraph_api-0.16.0.dev6 → langgraph_api-0.16.0.dev8}/langgraph_grpc_common/proto/enum_thread_status_pb2.py +0 -0
  290. {langgraph_api-0.16.0.dev6 → langgraph_api-0.16.0.dev8}/langgraph_grpc_common/proto/enum_thread_status_pb2.pyi +0 -0
  291. {langgraph_api-0.16.0.dev6 → langgraph_api-0.16.0.dev8}/langgraph_grpc_common/proto/enum_thread_status_pb2_grpc.py +0 -0
  292. {langgraph_api-0.16.0.dev6 → langgraph_api-0.16.0.dev8}/langgraph_grpc_common/proto/enum_thread_status_pb2_grpc.pyi +0 -0
  293. {langgraph_api-0.16.0.dev6 → langgraph_api-0.16.0.dev8}/langgraph_grpc_common/proto/enum_thread_stream_mode_pb2.py +0 -0
  294. {langgraph_api-0.16.0.dev6 → langgraph_api-0.16.0.dev8}/langgraph_grpc_common/proto/enum_thread_stream_mode_pb2.pyi +0 -0
  295. {langgraph_api-0.16.0.dev6 → langgraph_api-0.16.0.dev8}/langgraph_grpc_common/proto/enum_thread_stream_mode_pb2_grpc.py +0 -0
  296. {langgraph_api-0.16.0.dev6 → langgraph_api-0.16.0.dev8}/langgraph_grpc_common/proto/enum_thread_stream_mode_pb2_grpc.pyi +0 -0
  297. {langgraph_api-0.16.0.dev6 → langgraph_api-0.16.0.dev8}/langgraph_grpc_common/proto/errors_pb2.py +0 -0
  298. {langgraph_api-0.16.0.dev6 → langgraph_api-0.16.0.dev8}/langgraph_grpc_common/proto/errors_pb2.pyi +0 -0
  299. {langgraph_api-0.16.0.dev6 → langgraph_api-0.16.0.dev8}/langgraph_grpc_common/proto/errors_pb2_grpc.py +0 -0
  300. {langgraph_api-0.16.0.dev6 → langgraph_api-0.16.0.dev8}/langgraph_grpc_common/proto/errors_pb2_grpc.pyi +0 -0
  301. {langgraph_api-0.16.0.dev6 → langgraph_api-0.16.0.dev8}/langgraph_grpc_common/proto/runner_pb2.py +0 -0
  302. {langgraph_api-0.16.0.dev6 → langgraph_api-0.16.0.dev8}/langgraph_grpc_common/proto/runner_pb2.pyi +0 -0
  303. {langgraph_api-0.16.0.dev6 → langgraph_api-0.16.0.dev8}/langgraph_grpc_common/proto/runner_pb2_grpc.py +0 -0
  304. {langgraph_api-0.16.0.dev6 → langgraph_api-0.16.0.dev8}/langgraph_grpc_common/proto/runner_pb2_grpc.pyi +0 -0
  305. {langgraph_api-0.16.0.dev6 → langgraph_api-0.16.0.dev8}/langgraph_grpc_common/proto/store_pb2.py +0 -0
  306. {langgraph_api-0.16.0.dev6 → langgraph_api-0.16.0.dev8}/langgraph_grpc_common/proto/store_pb2.pyi +0 -0
  307. {langgraph_api-0.16.0.dev6 → langgraph_api-0.16.0.dev8}/langgraph_grpc_common/proto/store_pb2_grpc.py +0 -0
  308. {langgraph_api-0.16.0.dev6 → langgraph_api-0.16.0.dev8}/langgraph_grpc_common/proto/store_pb2_grpc.pyi +0 -0
  309. {langgraph_api-0.16.0.dev6 → langgraph_api-0.16.0.dev8}/langgraph_grpc_common/serde.py +0 -0
  310. {langgraph_api-0.16.0.dev6 → langgraph_api-0.16.0.dev8}/langgraph_grpc_common/store.py +0 -0
  311. {langgraph_api-0.16.0.dev6 → langgraph_api-0.16.0.dev8}/langgraph_license/__init__.py +0 -0
  312. {langgraph_api-0.16.0.dev6 → langgraph_api-0.16.0.dev8}/langgraph_license/validation.py +0 -0
  313. {langgraph_api-0.16.0.dev6 → langgraph_api-0.16.0.dev8}/langgraph_runtime/__init__.py +0 -0
  314. {langgraph_api-0.16.0.dev6 → langgraph_api-0.16.0.dev8}/langgraph_runtime/checkpoint.py +0 -0
  315. {langgraph_api-0.16.0.dev6 → langgraph_api-0.16.0.dev8}/langgraph_runtime/database.py +0 -0
  316. {langgraph_api-0.16.0.dev6 → langgraph_api-0.16.0.dev8}/langgraph_runtime/lifespan.py +0 -0
  317. {langgraph_api-0.16.0.dev6 → langgraph_api-0.16.0.dev8}/langgraph_runtime/metrics.py +0 -0
  318. {langgraph_api-0.16.0.dev6 → langgraph_api-0.16.0.dev8}/langgraph_runtime/ops.py +0 -0
  319. {langgraph_api-0.16.0.dev6 → langgraph_api-0.16.0.dev8}/langgraph_runtime/queue.py +0 -0
  320. {langgraph_api-0.16.0.dev6 → langgraph_api-0.16.0.dev8}/langgraph_runtime/retry.py +0 -0
  321. {langgraph_api-0.16.0.dev6 → langgraph_api-0.16.0.dev8}/langgraph_runtime/routes.py +0 -0
  322. {langgraph_api-0.16.0.dev6 → langgraph_api-0.16.0.dev8}/langgraph_runtime/store.py +0 -0
  323. {langgraph_api-0.16.0.dev6 → langgraph_api-0.16.0.dev8}/logging.json +0 -0
  324. {langgraph_api-0.16.0.dev6 → langgraph_api-0.16.0.dev8}/scripts/build_wheel.py +0 -0
  325. {langgraph_api-0.16.0.dev6 → langgraph_api-0.16.0.dev8}/scripts/create_license.py +0 -0
  326. {langgraph_api-0.16.0.dev6 → langgraph_api-0.16.0.dev8}/scripts/run_a2a_tck.py +0 -0
@@ -1,10 +1,11 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: langgraph-api
3
- Version: 0.16.0.dev6
3
+ Version: 0.16.0.dev8
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
+ Requires-Dist: anyio>=4.14.2
8
9
  Requires-Dist: cloudpickle>=3.0.0
9
10
  Requires-Dist: cryptography>=50.0.0
10
11
  Requires-Dist: grpcio-health-checking<1.82.0,>=1.81.0
@@ -7,7 +7,7 @@ This directory contains k6 + Python/Node benchmark tooling for LangGraph API.
7
7
  - `make benchmark-ramp` - Ramps up to a set number of concurrent virtual users, holds plateau load, then ramps down.
8
8
  - **Environment variables:**
9
9
  - `LOAD_SIZE`, `LEVELS`, `PLATEAU_DURATION`
10
- - `P95_RUN_DURATION`, `AVERAGE_RUN_DURATION`
10
+ - `P95_RUN_DURATION`
11
11
  - **Example:**
12
12
  - `BENCHMARK_PROFILE=streaming-long BENCHMARK_TYPE=stream_write LOAD_SIZE=300 LEVELS=3 make benchmark-ramp`
13
13
 
@@ -25,7 +25,7 @@ This directory contains k6 + Python/Node benchmark tooling for LangGraph API.
25
25
  - `make benchmark-reset` - Cleans benchmark server state via `clean-cli.js`.
26
26
  - `make benchmark-new-revision` - Triggers a new benchmark deployment revision.
27
27
 
28
- - `make benchmark-capacity-ci` - Runs the daily capacity matrix for one deployment (`DEPLOYMENT` env). Uses `staircase.py` per cell (default 200–2000 VUs, step 100). Config lives in `capacity-ci.js`.
28
+ - `make benchmark-capacity-ci` - Runs the daily capacity matrix for one deployment (`DEPLOYMENT` env). Uses `staircase.py` per cell with k6's `constant-arrival-rate` executor (open model: a fixed request rate per step, so capacity reads as the service rate; requests k6 has to drop count as failures). Geometry is per deployment in `capacity-ci.js` (dedicated 50 to 600 req/s in steps of 50, serverless 10 to 70 in steps of 5). `K6_EXECUTOR=constant-vus` restores the closed model. A cell that never meets SLO still reports `throughputCeiling`, the best runs/sec any step served.
29
29
  - **Example:**
30
30
  - `DEPLOYMENT=daily-cap-benchmark-dedicated make benchmark-capacity-ci`
31
31
 
@@ -48,6 +48,7 @@ The runner contains the actual logic each virtual user will execute during the b
48
48
  - `store` - Writes, reads, validates, and deletes a Store item with a configurable payload size.
49
49
  - `meta_workload` (randomly delegates to one of the others)
50
50
  - `delta_turns` - Keeps one thread per VU and adds a turn to it every iteration, so latency can be read against thread depth. Built for the delta-channel cells; see below.
51
+ - `interrupt_resume` - Starts a run that pauses on an `interrupt()` before step `interrupt_at`, then resumes it at once. Measures the paused checkpoint write and the full state read on resume. Use with the `interrupt` profile.
51
52
 
52
53
  ## Profiles (`BENCHMARK_PROFILE`)
53
54
 
@@ -60,6 +61,9 @@ Profiles are quick ways to configure the benchmark graph for any run depending o
60
61
  - `parallel-small` - Stateful high-fanout profile with small checkpoint payloads.
61
62
  - `parallel-medium` - Stateful high-fanout profile with medium checkpoint payloads.
62
63
  - `delta-turns` - Cheap turns for the delta-channel cells, so a VU reaches the depth where a `snapshot_frequency` of 1000 fires.
64
+ - `wide-deep` - 50 parallel branches held for 20 supersteps: concurrent checkpoint writes and worker spread at the same time.
65
+ - `messages` - State grows as a chat message list (2 KB per step, 10 steps), so each checkpoint serializes structured objects rather than appending bytes.
66
+ - `interrupt` - 5 steps, pauses before step 3. For the `interrupt_resume` runner.
63
67
 
64
68
  Each profile defines:
65
69
 
@@ -85,6 +89,9 @@ Context overrides (merged on top of profile):
85
89
  - `EXPAND` - Fanout width (number of parallel branches at start).
86
90
  - `STEPS` - Number of graph turns/iterations to execute.
87
91
  - `CHECKPOINT_SIZE` - Bytes written per checkpoint operation.
92
+ - `PAYLOAD` - `text` (default; compresses like real state), `random` (incompressible worst case) or `messages` (a chat message of `CHECKPOINT_SIZE` chars per step).
93
+ - `CHANNELS` - Spread the bytes payload across this many channels (1 to 8). Postgres stores one row per changed channel per version, so this costs rows, not only bytes.
94
+ - `INTERRUPT_AT` - Pause the run before this step (1-based) until resumed. 0 never pauses.
88
95
  - `STORE_VALUE_SIZE` - Store runner payload size in bytes (defaults to 1 MiB).
89
96
  - `LLM_ENABLED` - Enables fake LLM streaming inside the benchmark graph.
90
97
  - `STREAM_SIZE` - Normal total streamed payload size (bytes).
@@ -131,12 +138,13 @@ replaying more writes, so the deliverable is which curve is worse and where they
131
138
  | control | `GRAPH_ID=benchmark EXPECT_DELTA=false` |
132
139
  | delta, snapshot every 1000 | `GRAPH_ID=benchmark_delta` |
133
140
  | delta, snapshot every 50 | `GRAPH_ID=benchmark_delta_freq` |
141
+ | delta on a message list | `GRAPH_ID=benchmark_delta_messages PAYLOAD=messages` |
134
142
  | migration | `GRAPH_ID=benchmark_delta MIGRATE_FROM_GRAPH_ID=benchmark MIGRATE_AFTER=200` |
135
143
 
136
144
  ```bash
137
145
  BASE_URL=... BENCHMARK_TYPE=delta_turns BENCHMARK_PROFILE=delta-turns \
138
146
  GRAPH_ID=benchmark_delta LOAD_SIZE=25 LEVELS=1 PLATEAU_DURATION=300 \
139
- P95_RUN_DURATION=... AVERAGE_RUN_DURATION=... k6 run --system-tags='[]' ramp.js
147
+ P95_RUN_DURATION=... k6 run --system-tags='[]' ramp.js
140
148
  ```
141
149
 
142
150
  Knobs beyond the common ones:
@@ -153,14 +161,14 @@ Two things to know before reading any result:
153
161
  - **Run at low `LOAD_SIZE`.** Depth and load fight each other: saturate the deployment and
154
162
  turn time measures queueing, not reconstruction. Verify the control curve is flat before
155
163
  trusting the delta one.
156
- - **`successful_runs` will fail its threshold.** The count is derived from a duration table
157
- that assumes the existing workload. Pass `P95_RUN_DURATION` and `AVERAGE_RUN_DURATION`,
158
- and treat these cells as report-only until the numbers settle.
164
+ - **The ramp gates on p95 and error rate only.** Pass a `P95_RUN_DURATION` that fits the
165
+ cell, and treat these cells as report-only until the numbers settle.
159
166
 
160
167
  The runner fails a turn rather than reporting a false pass when delta is not actually on:
161
168
  the `DeltaChannel` import is version-guarded, and its stub degrades to a plain channel.
162
- Storage savings, the reason the feature exists, are not measured here; that needs a query
163
- against the deployment database, which CI cannot reach.
169
+ At every `VERIFY_EVERY` turn it also reads `GET /threads/{thread_id}/storage` and records
170
+ `thread_storage_bytes` tagged by depth bucket and graph, so the control and delta cells can
171
+ be compared on the bytes they occupy, which is what the feature exists to reduce.
164
172
 
165
173
  ## Outputs
166
174
 
@@ -184,6 +192,19 @@ against the deployment database, which CI cannot reach.
184
192
  2. Fill in `deploymentId` and `baseUrl` in `CAPACITY_DEPLOYMENTS` at the top of [`capacity-ci.js`](capacity-ci.js).
185
193
  3. Scheduled run: two parallel CI jobs (one per deployment), aggregate job posts Slack summary.
186
194
 
195
+ Each cell also records the deployment's own view of its window (queue and API pod counts, CPU peaks) from the control plane's deployment metrics route. The posted message names any component at or over 95% of its CPU request as that tier's bottleneck, and the full per-cell table goes to the message's thread. Every tier starts at one queue pod and autoscales during a cell, so a capacity number is partly a pod-count number; pinning pods at the tier maximum would need the benchmark deployments recreated as `external_docker` sources, the only kind whose `resource_spec` the API accepts.
196
+
197
+ ### Slack reports
198
+
199
+ Every report follows one shape so the channel reads the same way each morning, on a phone as well as a desktop:
200
+
201
+ - The first line is the verdict: a dot (green quiet, yellow something regressed or a bottleneck or errors, red something failed), the report name and date, `manual run` when dispatched by hand, the API version, and a clause saying what needs attention. The second line says what the benchmark is, for a reader outside the team.
202
+ - Then `Failed`, `Regressed`, `Improved` and `Bottlenecks` or `Errors` lines, worst first. `Regressed` prints `none` rather than going quiet.
203
+ - One table per deployment, about 40 characters wide so it fits a phone, with `▲ better` / `▼ worse` markers on cells that left their usual range.
204
+ - One legend line (pass rule, arrows, dot colors), then a link to the thread, which holds the per-cell or per-run numbers and the longer *How to read*, and to the run's artifacts.
205
+
206
+ Both reports compare tonight with the previous scheduled nights (`history.js`, artifacts fetched with `gh`). A figure is flagged only when it leaves that cell's own observed range, and only once five same-kind nights exist; before that the table says how many nights it has. The daily benchmark posts one digest per workflow once its last runner finishes (`daily-report.js`, fed by each runner's artifact), not one message per runner.
207
+
187
208
  Local commands:
188
209
 
189
210
  ```bash
@@ -201,3 +222,12 @@ node capacity-ci.js --aggregate --summaries-dir ./artifacts --slack
201
222
 
202
223
  - [k6 docs](https://k6.io/docs/)
203
224
  - [k6 JavaScript API](https://k6.io/docs/javascript-api/)
225
+
226
+ ## What a run returns
227
+
228
+ The graph's output schema is `counter`, `start_time`, `end_time`, `payload_bytes` and
229
+ `payload_sha256`. The payload channels themselves stay out of `/runs/wait` bodies and
230
+ `values` events, so `CHECKPOINT_SIZE` drives database writes only; before this, every
231
+ response carried the whole payload base64-encoded and write cost could not be told from
232
+ egress. `GET /threads/{thread_id}/state` still returns every channel. The delta cells
233
+ verify a cold re-read by hashing it and comparing with `payload_sha256`.
@@ -13,6 +13,9 @@ export interface BenchmarkContext {
13
13
  burst_mode: boolean;
14
14
  burst_probability: number;
15
15
  burst_size: number;
16
+ payload?: 'text' | 'random' | 'messages';
17
+ channels?: number;
18
+ interrupt_at?: number;
16
19
  }
17
20
 
18
21
  export interface BenchmarkProfileEnv {
@@ -32,6 +35,9 @@ export interface BenchmarkProfileEnv {
32
35
  BURST_MODE?: string;
33
36
  BURST_PROBABILITY?: string;
34
37
  BURST_SIZE?: string;
38
+ PAYLOAD?: string;
39
+ CHANNELS?: string;
40
+ INTERRUPT_AT?: string;
35
41
  }
36
42
 
37
43
  export interface BenchmarkProfile {
@@ -173,6 +179,64 @@ export const BENCHMARK_PROFILES: Record<string, BenchmarkProfile> = {
173
179
  burst_size: 0,
174
180
  },
175
181
  },
182
+ // Width held for many supersteps: concurrent checkpoint writes and worker
183
+ // spread at the same time, which the wide-but-one-step profiles never do.
184
+ 'wide-deep': {
185
+ resumable: false,
186
+ runMode: 'stateless',
187
+ context: {
188
+ delay: 0,
189
+ delay_jitter_ratio: 0.2,
190
+ expand: 50,
191
+ steps: 20,
192
+ checkpoint_size: 1_000,
193
+ llm_enabled: false,
194
+ stream_size: 0,
195
+ chunk_size: 1,
196
+ burst_mode: false,
197
+ burst_probability: 0,
198
+ burst_size: 0,
199
+ },
200
+ },
201
+ // State grows as a message list, so each checkpoint serializes structured
202
+ // objects rather than appending bytes.
203
+ messages: {
204
+ resumable: false,
205
+ runMode: 'stateful',
206
+ context: {
207
+ delay: 0,
208
+ delay_jitter_ratio: 0.2,
209
+ expand: 1,
210
+ steps: 10,
211
+ checkpoint_size: 2_000,
212
+ payload: 'messages',
213
+ llm_enabled: false,
214
+ stream_size: 0,
215
+ chunk_size: 1,
216
+ burst_mode: false,
217
+ burst_probability: 0,
218
+ burst_size: 0,
219
+ },
220
+ },
221
+ // For the interrupt_resume runner.
222
+ interrupt: {
223
+ resumable: false,
224
+ runMode: 'stateful',
225
+ context: {
226
+ delay: 0,
227
+ delay_jitter_ratio: 0.2,
228
+ expand: 1,
229
+ steps: 5,
230
+ checkpoint_size: 1_000,
231
+ interrupt_at: 3,
232
+ llm_enabled: false,
233
+ stream_size: 0,
234
+ chunk_size: 1,
235
+ burst_mode: false,
236
+ burst_probability: 0,
237
+ burst_size: 0,
238
+ },
239
+ },
176
240
  };
177
241
 
178
242
  export function getBenchmarkProfile(profileName?: string): { name: string; profile: BenchmarkProfile } {
@@ -241,6 +305,9 @@ export function get_profile(env: BenchmarkProfileEnv): ParsedBenchmarkProfile {
241
305
  ? { burst_probability: parseOptionalFloat(env.BURST_PROBABILITY)! }
242
306
  : {}),
243
307
  ...(parseOptionalInt(env.BURST_SIZE) !== undefined ? { burst_size: parseOptionalInt(env.BURST_SIZE)! } : {}),
308
+ ...(env.PAYLOAD ? { payload: env.PAYLOAD as 'text' | 'random' | 'messages' } : {}),
309
+ ...(parseOptionalInt(env.CHANNELS) !== undefined ? { channels: parseOptionalInt(env.CHANNELS)! } : {}),
310
+ ...(parseOptionalInt(env.INTERRUPT_AT) !== undefined ? { interrupt_at: parseOptionalInt(env.INTERRUPT_AT)! } : {}),
244
311
  });
245
312
 
246
313
  return {
@@ -9,6 +9,7 @@ import { ThreadsSearchMetadata } from './threads_search_metadata.js';
9
9
  import { Store } from './store.js';
10
10
  import { MetaWorkload } from './meta_workload.js';
11
11
  import { DeltaTurns } from './delta_turns.js';
12
+ import { InterruptResume } from './interrupt_resume.js';
12
13
  import type { BenchmarkRunner } from './benchmark-runner.js';
13
14
 
14
15
  export class Benchmarks {
@@ -36,6 +37,8 @@ export class Benchmarks {
36
37
  return MetaWorkload;
37
38
  case DeltaTurns.toString():
38
39
  return DeltaTurns;
40
+ case InterruptResume.toString():
41
+ return InterruptResume;
39
42
  default:
40
43
  throw new Error(`Unknown benchmark type: ${type}`);
41
44
  }
@@ -3,6 +3,7 @@ import assert from 'node:assert/strict';
3
3
  import {
4
4
  planTurn,
5
5
  deltaGuardFailure,
6
+ digestDrift,
6
7
  stateDrift,
7
8
  unusableCheckpointSize,
8
9
  } from './dist/delta-turns-lib.js';
@@ -167,3 +168,15 @@ test('the delta-turns profile is wired and writes a growing channel', () => {
167
168
  assert.equal(profile.context.delay, 0);
168
169
  assert.equal(profile.context.steps, 1);
169
170
  });
171
+
172
+ test('matching digests are no drift, and a changed byte anywhere is', () => {
173
+ const live = 'a'.repeat(64);
174
+ assert.equal(digestDrift(live, live), null);
175
+ assert.equal(digestDrift(live, 'b'.repeat(64)), `digest_drift:${'a'.repeat(12)}!=${'b'.repeat(12)}`);
176
+ });
177
+
178
+ test('a missing digest on either side is reported, not passed', () => {
179
+ assert.equal(digestDrift(undefined, 'a'.repeat(64)), 'run_digest_missing');
180
+ assert.equal(digestDrift('', 'a'.repeat(64)), 'run_digest_missing');
181
+ assert.equal(digestDrift('a'.repeat(64), null), 'cold_digest_missing');
182
+ });
@@ -100,3 +100,13 @@ function encodeChannel(value: unknown): string {
100
100
  if (value == null) return '';
101
101
  return typeof value === 'string' ? value : JSON.stringify(value);
102
102
  }
103
+
104
+ /**
105
+ * The run reports the SHA-256 of its stored payload; the cold read is hashed
106
+ * the same way. A rebuild that loses or corrupts a write changes the hash.
107
+ */
108
+ export function digestDrift(liveDigest: unknown, coldDigest: unknown): string | null {
109
+ if (typeof liveDigest !== 'string' || liveDigest === '') return 'run_digest_missing';
110
+ if (typeof coldDigest !== 'string' || coldDigest === '') return 'cold_digest_missing';
111
+ return liveDigest === coldDigest ? null : `digest_drift:${liveDigest.slice(0, 12)}!=${coldDigest.slice(0, 12)}`;
112
+ }
@@ -1,6 +1,8 @@
1
1
  import { BenchmarkRunner } from './benchmark-runner.js';
2
2
  import type { ErrorMetrics } from './benchmark-runner.js';
3
3
  import { check } from 'k6';
4
+ import crypto from 'k6/crypto';
5
+ import encoding from 'k6/encoding';
4
6
  import http from 'k6/http';
5
7
  import { Trend } from 'k6/metrics';
6
8
  import type { BenchmarkResult, BenchmarkGraphOptions, HttpResponse } from './types.js';
@@ -10,15 +12,25 @@ import { logFailure } from './log-failure.js';
10
12
  import {
11
13
  planTurn,
12
14
  deltaGuardFailure,
13
- stateDrift,
15
+ digestDrift,
14
16
  unusableCheckpointSize,
15
17
  } from './delta-turns-lib.js';
16
18
  import type { DeltaTurnsOptions, TurnPlan } from './delta-turns-lib.js';
17
19
 
18
- const CHANNEL = 'cumulative_checkpoint';
20
+ const PAYLOAD_CHANNELS = [
21
+ 'cumulative_checkpoint',
22
+ 'payload_2',
23
+ 'payload_3',
24
+ 'payload_4',
25
+ 'payload_5',
26
+ 'payload_6',
27
+ 'payload_7',
28
+ 'payload_8',
29
+ ] as const;
19
30
 
20
31
  /** Tagged by depth: VUs ramp in, so clock time is not thread length. */
21
32
  const turnDuration = new Trend('turn_duration', true);
33
+ const threadStorageBytes = new Trend('thread_storage_bytes', false);
22
34
 
23
35
  const TURN_CONFIG: Omit<DeltaTurnsOptions, 'graphId'> = {
24
36
  migrateFromGraphId: __ENV.MIGRATE_FROM_GRAPH_ID || '',
@@ -95,8 +107,15 @@ export class DeltaTurns extends BenchmarkRunner {
95
107
  guardFailure = deltaGuardFailure(body.metadata, plan.expectDelta);
96
108
  }
97
109
  if (plan.verify) {
98
- // `/runs/wait` returns the state values themselves; `/state` nests them.
99
- drift = stateDrift(safeJson(response.body), body.values, CHANNEL);
110
+ drift = digestDrift(safeJson(response.body)?.payload_sha256, coldDigest(body.values));
111
+ }
112
+ }
113
+ if (plan.verify) {
114
+ const storage = http.get(`${baseUrl}/threads/${threadId}/storage`, requestParams);
115
+ addResponse(responses, 'storage', storage);
116
+ const total = storage.status === 200 ? safeJson(storage.body)?.total_bytes : null;
117
+ if (typeof total === 'number') {
118
+ threadStorageBytes.add(total, { depth: plan.depthBucket, graph: plan.graphId });
100
119
  }
101
120
  }
102
121
  }
@@ -167,3 +186,22 @@ function safeJson(body: string | null | ArrayBuffer): Record<string, any> | null
167
186
  return null;
168
187
  }
169
188
  }
189
+
190
+ function coldDigest(values: Record<string, unknown> | undefined): string | null {
191
+ if (values == null || typeof values !== 'object') return null;
192
+ // Reproduce the graph's payload_digest: every bytes channel in order, then
193
+ // the concatenated message contents. Absent channels default to empty, so
194
+ // they add nothing, exactly as the unwritten bytes channels do server-side.
195
+ const hasher = crypto.createHash('sha256');
196
+ for (const name of PAYLOAD_CHANNELS) {
197
+ const stored = values[name];
198
+ if (typeof stored === 'string' && stored.length > 0) {
199
+ hasher.update(encoding.b64decode(stored));
200
+ }
201
+ }
202
+ const messages = values.messages;
203
+ if (Array.isArray(messages) && messages.length > 0) {
204
+ hasher.update(messages.map((m) => String((m as { content?: unknown })?.content ?? '')).join(''));
205
+ }
206
+ return hasher.digest('hex');
207
+ }
@@ -0,0 +1,119 @@
1
+ import { BenchmarkRunner } from './benchmark-runner.js';
2
+ import type { ErrorMetrics } from './benchmark-runner.js';
3
+ import { check } from 'k6';
4
+ import http from 'k6/http';
5
+ import type { BenchmarkResult, BenchmarkGraphOptions, HttpResponse } from './types.js';
6
+ import { addResponse, okResult, failResult } from './types.js';
7
+ import { classifyError, recordError } from './classify-error.js';
8
+ import { logFailure } from './log-failure.js';
9
+
10
+ interface InterruptResumeData {
11
+ paused: ReturnType<typeof http.post>;
12
+ resumed: ReturnType<typeof http.post>;
13
+ expectedSteps: number;
14
+ }
15
+
16
+ /**
17
+ * Pause a run mid-way and resume it. The virtual user is the human: it answers
18
+ * at once. What is measured is the server's work around the pause: writing the
19
+ * paused checkpoint, and on resume reading the whole thread state back before
20
+ * continuing, which is the most expensive read a delta channel can face.
21
+ */
22
+ export class InterruptResume extends BenchmarkRunner {
23
+ static run(
24
+ baseUrl: string,
25
+ requestParams: Record<string, unknown>,
26
+ benchmarkGraphOptions: BenchmarkGraphOptions
27
+ ): BenchmarkResult<InterruptResumeData> {
28
+ const base = benchmarkGraphOptions.context;
29
+ const context = {
30
+ ...base,
31
+ interrupt_at: base.interrupt_at || Math.max(1, Math.ceil(base.steps / 2)),
32
+ };
33
+ const config = { recursion_limit: Math.max(context.expand, context.steps) + 4 };
34
+ const responses: Record<string, HttpResponse> = {};
35
+
36
+ const thread = http.post(`${baseUrl}/threads`, '{}', requestParams);
37
+ addResponse(responses, 'create_thread', thread);
38
+ if (thread.status !== 200) {
39
+ return failResult('create_thread', responses) as BenchmarkResult<InterruptResumeData>;
40
+ }
41
+ const threadId = (thread.json() as { thread_id: string }).thread_id;
42
+ const url = `${baseUrl}/threads/${threadId}/runs/wait`;
43
+
44
+ const paused = http.post(
45
+ url,
46
+ JSON.stringify({ assistant_id: benchmarkGraphOptions.graph_id, input: {}, context, config }),
47
+ requestParams
48
+ );
49
+ addResponse(responses, 'pause', paused);
50
+ if (paused.status !== 200) {
51
+ return failResult('pause', responses) as BenchmarkResult<InterruptResumeData>;
52
+ }
53
+
54
+ const resumed = http.post(
55
+ url,
56
+ JSON.stringify({
57
+ assistant_id: benchmarkGraphOptions.graph_id,
58
+ command: { resume: true },
59
+ context,
60
+ config,
61
+ }),
62
+ requestParams
63
+ );
64
+ addResponse(responses, 'resume', resumed);
65
+ return okResult(responses, { paused, resumed, expectedSteps: context.steps });
66
+ }
67
+
68
+ static validate(
69
+ result: BenchmarkResult<InterruptResumeData>,
70
+ errorMetrics: ErrorMetrics
71
+ ): boolean {
72
+ const data = result.data;
73
+ const pausedJson = safeJson(data?.paused?.body);
74
+ const resumedJson = safeJson(data?.resumed?.body);
75
+ let success = false;
76
+ try {
77
+ success = check(result, {
78
+ 'Pause request succeeded': () => (data?.paused?.status ?? 0) === 200,
79
+ 'Run paused on an interrupt': () => Array.isArray(pausedJson?.__interrupt__) && pausedJson.__interrupt__.length > 0,
80
+ 'Resume request succeeded': () => (data?.resumed?.status ?? 0) === 200,
81
+ 'Resumed run finished every step': () =>
82
+ resumedJson != null &&
83
+ resumedJson.__interrupt__ === undefined &&
84
+ resumedJson.__error__ === undefined &&
85
+ resumedJson.counter === data?.expectedSteps,
86
+ });
87
+ } catch (error) {
88
+ console.log(`Unknown error checking result: ${(error as Error).message}`);
89
+ }
90
+ if (!success) {
91
+ logFailure(InterruptResume.toString(), result, {
92
+ extra: `pause=${data?.paused?.status} resume=${data?.resumed?.status} counter=${resumedJson?.counter} expected=${data?.expectedSteps}`,
93
+ });
94
+ recordError(
95
+ classifyError({
96
+ response: data?.resumed ?? data?.paused ?? result.responses?.create_thread ?? null,
97
+ hasApiError: resumedJson?.__error__ !== undefined || pausedJson?.__error__ !== undefined,
98
+ missingMessage: resumedJson != null && resumedJson.counter !== data?.expectedSteps,
99
+ }),
100
+ errorMetrics
101
+ );
102
+ }
103
+ return success;
104
+ }
105
+
106
+ static toString(): string {
107
+ return 'interrupt_resume';
108
+ }
109
+ }
110
+
111
+ function safeJson(body: unknown): Record<string, any> | null {
112
+ if (typeof body !== 'string') return null;
113
+ try {
114
+ const parsed = JSON.parse(body);
115
+ return parsed != null && typeof parsed === 'object' ? parsed : null;
116
+ } catch {
117
+ return null;
118
+ }
119
+ }
@@ -44,6 +44,9 @@ export interface BenchmarkContext {
44
44
  burst_mode: boolean;
45
45
  burst_probability: number;
46
46
  burst_size: number;
47
+ payload?: 'text' | 'random' | 'messages';
48
+ channels?: number;
49
+ interrupt_at?: number;
47
50
  }
48
51
 
49
52
  /**