langgraph-api 0.7.89__tar.gz → 0.7.91__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 (299) hide show
  1. {langgraph_api-0.7.89 → langgraph_api-0.7.91}/PKG-INFO +3 -2
  2. {langgraph_api-0.7.89 → langgraph_api-0.7.91}/benchmark/Makefile +3 -3
  3. {langgraph_api-0.7.89 → langgraph_api-0.7.91}/benchmark/README.md +5 -14
  4. langgraph_api-0.7.91/benchmark/benchmark-runners/assistant.ts +129 -0
  5. langgraph_api-0.7.91/benchmark/benchmark-runners/benchmark-runner.ts +35 -0
  6. langgraph_api-0.7.91/benchmark/benchmark-runners/benchmarks.ts +40 -0
  7. langgraph_api-0.7.91/benchmark/benchmark-runners/cancel_first_second_completes.ts +116 -0
  8. langgraph_api-0.7.91/benchmark/benchmark-runners/enqueued_runs_order.ts +100 -0
  9. langgraph_api-0.7.91/benchmark/benchmark-runners/log-failure.ts +38 -0
  10. langgraph_api-0.7.91/benchmark/benchmark-runners/meta_workload.ts +70 -0
  11. langgraph_api-0.7.91/benchmark/benchmark-runners/random_stream.ts +114 -0
  12. langgraph_api-0.7.91/benchmark/benchmark-runners/stream_write.ts +89 -0
  13. langgraph_api-0.7.91/benchmark/benchmark-runners/thread.ts +124 -0
  14. langgraph_api-0.7.91/benchmark/benchmark-runners/thread_runs_metadata_search.ts +108 -0
  15. langgraph_api-0.7.91/benchmark/benchmark-runners/threads_search_metadata.ts +95 -0
  16. langgraph_api-0.7.91/benchmark/benchmark-runners/types.ts +143 -0
  17. langgraph_api-0.7.91/benchmark/benchmark-runners/wait_write.ts +96 -0
  18. {langgraph_api-0.7.89 → langgraph_api-0.7.91}/benchmark/capacity_k6.js +4 -5
  19. {langgraph_api-0.7.89 → langgraph_api-0.7.91}/benchmark/graphs.js +11 -9
  20. {langgraph_api-0.7.89 → langgraph_api-0.7.91}/benchmark/package.json +7 -2
  21. {langgraph_api-0.7.89 → langgraph_api-0.7.91}/benchmark/ramp.js +1 -1
  22. {langgraph_api-0.7.89 → langgraph_api-0.7.91}/benchmark/staircase_step_k6.js +1 -1
  23. langgraph_api-0.7.91/benchmark/tsconfig.json +17 -0
  24. langgraph_api-0.7.91/langgraph_api/__init__.py +1 -0
  25. {langgraph_api-0.7.89 → langgraph_api-0.7.91}/langgraph_api/config/__init__.py +1 -0
  26. {langgraph_api-0.7.89 → langgraph_api-0.7.91}/langgraph_api/js/yarn.lock +3 -3
  27. {langgraph_api-0.7.89 → langgraph_api-0.7.91}/langgraph_api/metrics_datadog.py +6 -30
  28. {langgraph_api-0.7.89 → langgraph_api-0.7.91}/langgraph_api/server.py +11 -5
  29. {langgraph_api-0.7.89 → langgraph_api-0.7.91}/langgraph_api/stream.py +68 -44
  30. {langgraph_api-0.7.89 → langgraph_api-0.7.91}/langgraph_api/utils/config.py +1 -1
  31. {langgraph_api-0.7.89 → langgraph_api-0.7.91}/langgraph_api/utils/stream_codec.py +22 -14
  32. {langgraph_api-0.7.89 → langgraph_api-0.7.91}/pyproject.toml +4 -1
  33. {langgraph_api-0.7.89 → langgraph_api-0.7.91}/uv.lock +70 -54
  34. langgraph_api-0.7.89/benchmark/benchmark-runners/assistant.js +0 -88
  35. langgraph_api-0.7.89/benchmark/benchmark-runners/benchmark-runner.js +0 -34
  36. langgraph_api-0.7.89/benchmark/benchmark-runners/benchmarks.js +0 -21
  37. langgraph_api-0.7.89/benchmark/benchmark-runners/stream_write.js +0 -98
  38. langgraph_api-0.7.89/benchmark/benchmark-runners/thread.js +0 -87
  39. langgraph_api-0.7.89/benchmark/benchmark-runners/wait_write.js +0 -107
  40. langgraph_api-0.7.89/benchmark/burst.js +0 -219
  41. langgraph_api-0.7.89/langgraph_api/__init__.py +0 -1
  42. {langgraph_api-0.7.89 → langgraph_api-0.7.91}/.gitignore +0 -0
  43. {langgraph_api-0.7.89 → langgraph_api-0.7.91}/LICENSE +0 -0
  44. {langgraph_api-0.7.89 → langgraph_api-0.7.91}/Makefile +0 -0
  45. {langgraph_api-0.7.89 → langgraph_api-0.7.91}/README.md +0 -0
  46. {langgraph_api-0.7.89 → langgraph_api-0.7.91}/benchmark/.gitignore +0 -0
  47. {langgraph_api-0.7.89 → langgraph_api-0.7.91}/benchmark/capacity_dd_report.py +0 -0
  48. {langgraph_api-0.7.89 → langgraph_api-0.7.91}/benchmark/capacity_runner.mjs +0 -0
  49. {langgraph_api-0.7.89 → langgraph_api-0.7.91}/benchmark/capacity_slack_report.py +0 -0
  50. {langgraph_api-0.7.89 → langgraph_api-0.7.91}/benchmark/capacity_urls.mjs +0 -0
  51. {langgraph_api-0.7.89 → langgraph_api-0.7.91}/benchmark/clean-cli.js +0 -0
  52. {langgraph_api-0.7.89 → langgraph_api-0.7.91}/benchmark/clean.js +0 -0
  53. {langgraph_api-0.7.89 → langgraph_api-0.7.91}/benchmark/continuous/README.md +0 -0
  54. {langgraph_api-0.7.89 → langgraph_api-0.7.91}/benchmark/continuous/pyproject.toml +0 -0
  55. {langgraph_api-0.7.89 → langgraph_api-0.7.91}/benchmark/continuous/runner.py +0 -0
  56. {langgraph_api-0.7.89 → langgraph_api-0.7.91}/benchmark/continuous/uv.lock +0 -0
  57. {langgraph_api-0.7.89 → langgraph_api-0.7.91}/benchmark/mixed_workload_k6.js +0 -0
  58. {langgraph_api-0.7.89 → langgraph_api-0.7.91}/benchmark/mixed_workload_runner.mjs +0 -0
  59. {langgraph_api-0.7.89 → langgraph_api-0.7.91}/benchmark/reporting/dd_reporting.py +0 -0
  60. {langgraph_api-0.7.89 → langgraph_api-0.7.91}/benchmark/reporting/slack_slowest_runs.py +0 -0
  61. {langgraph_api-0.7.89 → langgraph_api-0.7.91}/benchmark/reporting/slack_summary.py +0 -0
  62. {langgraph_api-0.7.89 → langgraph_api-0.7.91}/benchmark/run_local.sh +0 -0
  63. {langgraph_api-0.7.89 → langgraph_api-0.7.91}/benchmark/staircase.py +0 -0
  64. {langgraph_api-0.7.89 → langgraph_api-0.7.91}/benchmark/update-revision.js +0 -0
  65. {langgraph_api-0.7.89 → langgraph_api-0.7.91}/benchmark/weather.js +0 -0
  66. {langgraph_api-0.7.89 → langgraph_api-0.7.91}/constraints.txt +0 -0
  67. {langgraph_api-0.7.89 → langgraph_api-0.7.91}/custom_store.sql +0 -0
  68. {langgraph_api-0.7.89 → langgraph_api-0.7.91}/forbidden.txt +0 -0
  69. {langgraph_api-0.7.89 → langgraph_api-0.7.91}/hatch_build.py +0 -0
  70. {langgraph_api-0.7.89 → langgraph_api-0.7.91}/healthcheck.py +0 -0
  71. {langgraph_api-0.7.89 → langgraph_api-0.7.91}/langgraph-cloud-debugging-20260210132856.zip +0 -0
  72. {langgraph_api-0.7.89 → langgraph_api-0.7.91}/langgraph_api/_checkpointer/__init__.py +0 -0
  73. {langgraph_api-0.7.89 → langgraph_api-0.7.91}/langgraph_api/_checkpointer/_adapter.py +0 -0
  74. {langgraph_api-0.7.89 → langgraph_api-0.7.91}/langgraph_api/_checkpointer/protocol.py +0 -0
  75. {langgraph_api-0.7.89 → langgraph_api-0.7.91}/langgraph_api/_factory_utils.py +0 -0
  76. {langgraph_api-0.7.89 → langgraph_api-0.7.91}/langgraph_api/api/__init__.py +0 -0
  77. {langgraph_api-0.7.89 → langgraph_api-0.7.91}/langgraph_api/api/a2a.py +0 -0
  78. {langgraph_api-0.7.89 → langgraph_api-0.7.91}/langgraph_api/api/assistants.py +0 -0
  79. {langgraph_api-0.7.89 → langgraph_api-0.7.91}/langgraph_api/api/mcp/__init__.py +0 -0
  80. {langgraph_api-0.7.89 → langgraph_api-0.7.91}/langgraph_api/api/mcp/_constants.py +0 -0
  81. {langgraph_api-0.7.89 → langgraph_api-0.7.91}/langgraph_api/api/mcp/_handlers.py +0 -0
  82. {langgraph_api-0.7.89 → langgraph_api-0.7.91}/langgraph_api/api/mcp/_models.py +0 -0
  83. {langgraph_api-0.7.89 → langgraph_api-0.7.91}/langgraph_api/api/mcp/_routes.py +0 -0
  84. {langgraph_api-0.7.89 → langgraph_api-0.7.91}/langgraph_api/api/mcp/_sanitizers.py +0 -0
  85. {langgraph_api-0.7.89 → langgraph_api-0.7.91}/langgraph_api/api/meta.py +0 -0
  86. {langgraph_api-0.7.89 → langgraph_api-0.7.91}/langgraph_api/api/openapi.py +0 -0
  87. {langgraph_api-0.7.89 → langgraph_api-0.7.91}/langgraph_api/api/profile.py +0 -0
  88. {langgraph_api-0.7.89 → langgraph_api-0.7.91}/langgraph_api/api/runs.py +0 -0
  89. {langgraph_api-0.7.89 → langgraph_api-0.7.91}/langgraph_api/api/store.py +0 -0
  90. {langgraph_api-0.7.89 → langgraph_api-0.7.91}/langgraph_api/api/threads.py +0 -0
  91. {langgraph_api-0.7.89 → langgraph_api-0.7.91}/langgraph_api/api/ui.py +0 -0
  92. {langgraph_api-0.7.89 → langgraph_api-0.7.91}/langgraph_api/asgi_transport.py +0 -0
  93. {langgraph_api-0.7.89 → langgraph_api-0.7.91}/langgraph_api/asyncio.py +0 -0
  94. {langgraph_api-0.7.89 → langgraph_api-0.7.91}/langgraph_api/auth/__init__.py +0 -0
  95. {langgraph_api-0.7.89 → langgraph_api-0.7.91}/langgraph_api/auth/custom.py +0 -0
  96. {langgraph_api-0.7.89 → langgraph_api-0.7.91}/langgraph_api/auth/errors.py +0 -0
  97. {langgraph_api-0.7.89 → langgraph_api-0.7.91}/langgraph_api/auth/langsmith/__init__.py +0 -0
  98. {langgraph_api-0.7.89 → langgraph_api-0.7.91}/langgraph_api/auth/langsmith/backend.py +0 -0
  99. {langgraph_api-0.7.89 → langgraph_api-0.7.91}/langgraph_api/auth/langsmith/client.py +0 -0
  100. {langgraph_api-0.7.89 → langgraph_api-0.7.91}/langgraph_api/auth/middleware.py +0 -0
  101. {langgraph_api-0.7.89 → langgraph_api-0.7.91}/langgraph_api/auth/noop.py +0 -0
  102. {langgraph_api-0.7.89 → langgraph_api-0.7.91}/langgraph_api/auth/studio_user.py +0 -0
  103. {langgraph_api-0.7.89 → langgraph_api-0.7.91}/langgraph_api/cache.py +0 -0
  104. {langgraph_api-0.7.89 → langgraph_api-0.7.91}/langgraph_api/cli.py +0 -0
  105. {langgraph_api-0.7.89 → langgraph_api-0.7.91}/langgraph_api/command.py +0 -0
  106. {langgraph_api-0.7.89 → langgraph_api-0.7.91}/langgraph_api/config/_parse.py +0 -0
  107. {langgraph_api-0.7.89 → langgraph_api-0.7.91}/langgraph_api/config/schemas.py +0 -0
  108. {langgraph_api-0.7.89 → langgraph_api-0.7.91}/langgraph_api/cron_scheduler.py +0 -0
  109. {langgraph_api-0.7.89 → langgraph_api-0.7.91}/langgraph_api/encryption/__init__.py +0 -0
  110. {langgraph_api-0.7.89 → langgraph_api-0.7.91}/langgraph_api/encryption/aes_json.py +0 -0
  111. {langgraph_api-0.7.89 → langgraph_api-0.7.91}/langgraph_api/encryption/context.py +0 -0
  112. {langgraph_api-0.7.89 → langgraph_api-0.7.91}/langgraph_api/encryption/custom.py +0 -0
  113. {langgraph_api-0.7.89 → langgraph_api-0.7.91}/langgraph_api/encryption/middleware.py +0 -0
  114. {langgraph_api-0.7.89 → langgraph_api-0.7.91}/langgraph_api/encryption/shared.py +0 -0
  115. {langgraph_api-0.7.89 → langgraph_api-0.7.91}/langgraph_api/errors.py +0 -0
  116. {langgraph_api-0.7.89 → langgraph_api-0.7.91}/langgraph_api/executor_entrypoint.py +0 -0
  117. {langgraph_api-0.7.89 → langgraph_api-0.7.91}/langgraph_api/feature_flags.py +0 -0
  118. {langgraph_api-0.7.89 → langgraph_api-0.7.91}/langgraph_api/graph.py +0 -0
  119. {langgraph_api-0.7.89 → langgraph_api-0.7.91}/langgraph_api/grpc/__init__.py +0 -0
  120. {langgraph_api-0.7.89 → langgraph_api-0.7.91}/langgraph_api/grpc/client.py +0 -0
  121. {langgraph_api-0.7.89 → langgraph_api-0.7.91}/langgraph_api/grpc/generated/core_api_pb2.pyi +0 -0
  122. {langgraph_api-0.7.89 → langgraph_api-0.7.91}/langgraph_api/grpc/ops/__init__.py +0 -0
  123. {langgraph_api-0.7.89 → langgraph_api-0.7.91}/langgraph_api/grpc/ops/assistants.py +0 -0
  124. {langgraph_api-0.7.89 → langgraph_api-0.7.91}/langgraph_api/grpc/ops/cache.py +0 -0
  125. {langgraph_api-0.7.89 → langgraph_api-0.7.91}/langgraph_api/grpc/ops/crons.py +0 -0
  126. {langgraph_api-0.7.89 → langgraph_api-0.7.91}/langgraph_api/grpc/ops/runs.py +0 -0
  127. {langgraph_api-0.7.89 → langgraph_api-0.7.91}/langgraph_api/grpc/ops/threads.py +0 -0
  128. {langgraph_api-0.7.89 → langgraph_api-0.7.91}/langgraph_api/grpc/server.py +0 -0
  129. {langgraph_api-0.7.89 → langgraph_api-0.7.91}/langgraph_api/grpc/servicers/__init__.py +0 -0
  130. {langgraph_api-0.7.89 → langgraph_api-0.7.91}/langgraph_api/grpc/servicers/checkpointer.py +0 -0
  131. {langgraph_api-0.7.89 → langgraph_api-0.7.91}/langgraph_api/grpc/servicers/encryption.py +0 -0
  132. {langgraph_api-0.7.89 → langgraph_api-0.7.91}/langgraph_api/http.py +0 -0
  133. {langgraph_api-0.7.89 → langgraph_api-0.7.91}/langgraph_api/http_metrics.py +0 -0
  134. {langgraph_api-0.7.89 → langgraph_api-0.7.91}/langgraph_api/http_metrics_utils.py +0 -0
  135. {langgraph_api-0.7.89 → langgraph_api-0.7.91}/langgraph_api/js/.gitignore +0 -0
  136. {langgraph_api-0.7.89 → langgraph_api-0.7.91}/langgraph_api/js/.prettierrc +0 -0
  137. {langgraph_api-0.7.89 → langgraph_api-0.7.91}/langgraph_api/js/__init__.py +0 -0
  138. {langgraph_api-0.7.89 → langgraph_api-0.7.91}/langgraph_api/js/base.py +0 -0
  139. {langgraph_api-0.7.89 → langgraph_api-0.7.91}/langgraph_api/js/build.mts +0 -0
  140. {langgraph_api-0.7.89 → langgraph_api-0.7.91}/langgraph_api/js/client.http.mts +0 -0
  141. {langgraph_api-0.7.89 → langgraph_api-0.7.91}/langgraph_api/js/client.mts +0 -0
  142. {langgraph_api-0.7.89 → langgraph_api-0.7.91}/langgraph_api/js/errors.py +0 -0
  143. {langgraph_api-0.7.89 → langgraph_api-0.7.91}/langgraph_api/js/global.d.ts +0 -0
  144. {langgraph_api-0.7.89 → langgraph_api-0.7.91}/langgraph_api/js/package.json +0 -0
  145. {langgraph_api-0.7.89 → langgraph_api-0.7.91}/langgraph_api/js/remote.py +0 -0
  146. {langgraph_api-0.7.89 → langgraph_api-0.7.91}/langgraph_api/js/schema.py +0 -0
  147. {langgraph_api-0.7.89 → langgraph_api-0.7.91}/langgraph_api/js/src/graph.mts +0 -0
  148. {langgraph_api-0.7.89 → langgraph_api-0.7.91}/langgraph_api/js/src/load.hooks.mjs +0 -0
  149. {langgraph_api-0.7.89 → langgraph_api-0.7.91}/langgraph_api/js/src/preload.mjs +0 -0
  150. {langgraph_api-0.7.89 → langgraph_api-0.7.91}/langgraph_api/js/src/utils/files.mts +0 -0
  151. {langgraph_api-0.7.89 → langgraph_api-0.7.91}/langgraph_api/js/src/utils/importMap.mts +0 -0
  152. {langgraph_api-0.7.89 → langgraph_api-0.7.91}/langgraph_api/js/src/utils/pythonSchemas.mts +0 -0
  153. {langgraph_api-0.7.89 → langgraph_api-0.7.91}/langgraph_api/js/src/utils/serde.mts +0 -0
  154. {langgraph_api-0.7.89 → langgraph_api-0.7.91}/langgraph_api/js/sse.py +0 -0
  155. {langgraph_api-0.7.89 → langgraph_api-0.7.91}/langgraph_api/js/traceblock.mts +0 -0
  156. {langgraph_api-0.7.89 → langgraph_api-0.7.91}/langgraph_api/js/tsconfig.json +0 -0
  157. {langgraph_api-0.7.89 → langgraph_api-0.7.91}/langgraph_api/js/ui.py +0 -0
  158. {langgraph_api-0.7.89 → langgraph_api-0.7.91}/langgraph_api/logging.py +0 -0
  159. {langgraph_api-0.7.89 → langgraph_api-0.7.91}/langgraph_api/metadata.py +0 -0
  160. {langgraph_api-0.7.89 → langgraph_api-0.7.91}/langgraph_api/middleware/__init__.py +0 -0
  161. {langgraph_api-0.7.89 → langgraph_api-0.7.91}/langgraph_api/middleware/ensure_store.py +0 -0
  162. {langgraph_api-0.7.89 → langgraph_api-0.7.91}/langgraph_api/middleware/http_logger.py +0 -0
  163. {langgraph_api-0.7.89 → langgraph_api-0.7.91}/langgraph_api/middleware/private_network.py +0 -0
  164. {langgraph_api-0.7.89 → langgraph_api-0.7.91}/langgraph_api/middleware/request_id.py +0 -0
  165. {langgraph_api-0.7.89 → langgraph_api-0.7.91}/langgraph_api/models/__init__.py +0 -0
  166. {langgraph_api-0.7.89 → langgraph_api-0.7.91}/langgraph_api/models/run.py +0 -0
  167. {langgraph_api-0.7.89 → langgraph_api-0.7.91}/langgraph_api/otel_context.py +0 -0
  168. {langgraph_api-0.7.89 → langgraph_api-0.7.91}/langgraph_api/patch.py +0 -0
  169. {langgraph_api-0.7.89 → langgraph_api-0.7.91}/langgraph_api/queue_entrypoint.py +0 -0
  170. {langgraph_api-0.7.89 → langgraph_api-0.7.91}/langgraph_api/route.py +0 -0
  171. {langgraph_api-0.7.89 → langgraph_api-0.7.91}/langgraph_api/schema.py +0 -0
  172. {langgraph_api-0.7.89 → langgraph_api-0.7.91}/langgraph_api/self_hosted_logs.py +0 -0
  173. {langgraph_api-0.7.89 → langgraph_api-0.7.91}/langgraph_api/self_hosted_metrics.py +0 -0
  174. {langgraph_api-0.7.89 → langgraph_api-0.7.91}/langgraph_api/serde.py +0 -0
  175. {langgraph_api-0.7.89 → langgraph_api-0.7.91}/langgraph_api/sse.py +0 -0
  176. {langgraph_api-0.7.89 → langgraph_api-0.7.91}/langgraph_api/state.py +0 -0
  177. {langgraph_api-0.7.89 → langgraph_api-0.7.91}/langgraph_api/store.py +0 -0
  178. {langgraph_api-0.7.89 → langgraph_api-0.7.91}/langgraph_api/timing/__init__.py +0 -0
  179. {langgraph_api-0.7.89 → langgraph_api-0.7.91}/langgraph_api/timing/profiler.py +0 -0
  180. {langgraph_api-0.7.89 → langgraph_api-0.7.91}/langgraph_api/timing/timer.py +0 -0
  181. {langgraph_api-0.7.89 → langgraph_api-0.7.91}/langgraph_api/traceblock.py +0 -0
  182. {langgraph_api-0.7.89 → langgraph_api-0.7.91}/langgraph_api/tunneling/cloudflare.py +0 -0
  183. {langgraph_api-0.7.89 → langgraph_api-0.7.91}/langgraph_api/utils/__init__.py +0 -0
  184. {langgraph_api-0.7.89 → langgraph_api-0.7.91}/langgraph_api/utils/cache.py +0 -0
  185. {langgraph_api-0.7.89 → langgraph_api-0.7.91}/langgraph_api/utils/errors.py +0 -0
  186. {langgraph_api-0.7.89 → langgraph_api-0.7.91}/langgraph_api/utils/extract.py +0 -0
  187. {langgraph_api-0.7.89 → langgraph_api-0.7.91}/langgraph_api/utils/future.py +0 -0
  188. {langgraph_api-0.7.89 → langgraph_api-0.7.91}/langgraph_api/utils/headers.py +0 -0
  189. {langgraph_api-0.7.89 → langgraph_api-0.7.91}/langgraph_api/utils/retriable_client.py +0 -0
  190. {langgraph_api-0.7.89 → langgraph_api-0.7.91}/langgraph_api/utils/uuids.py +0 -0
  191. {langgraph_api-0.7.89 → langgraph_api-0.7.91}/langgraph_api/validation.py +0 -0
  192. {langgraph_api-0.7.89 → langgraph_api-0.7.91}/langgraph_api/webhook.py +0 -0
  193. {langgraph_api-0.7.89 → langgraph_api-0.7.91}/langgraph_api/worker.py +0 -0
  194. {langgraph_api-0.7.89 → langgraph_api-0.7.91}/langgraph_grpc_common/__init__.py +0 -0
  195. {langgraph_api-0.7.89 → langgraph_api-0.7.91}/langgraph_grpc_common/checkpointer.py +0 -0
  196. {langgraph_api-0.7.89 → langgraph_api-0.7.91}/langgraph_grpc_common/conversion/__init__.py +0 -0
  197. {langgraph_api-0.7.89 → langgraph_api-0.7.91}/langgraph_grpc_common/conversion/_compat.py +0 -0
  198. {langgraph_api-0.7.89 → langgraph_api-0.7.91}/langgraph_grpc_common/conversion/channel.py +0 -0
  199. {langgraph_api-0.7.89 → langgraph_api-0.7.91}/langgraph_grpc_common/conversion/checkpoint.py +0 -0
  200. {langgraph_api-0.7.89 → langgraph_api-0.7.91}/langgraph_grpc_common/conversion/config.py +0 -0
  201. {langgraph_api-0.7.89 → langgraph_api-0.7.91}/langgraph_grpc_common/conversion/durability.py +0 -0
  202. {langgraph_api-0.7.89 → langgraph_api-0.7.91}/langgraph_grpc_common/conversion/exception.py +0 -0
  203. {langgraph_api-0.7.89 → langgraph_api-0.7.91}/langgraph_grpc_common/conversion/graph.py +0 -0
  204. {langgraph_api-0.7.89 → langgraph_api-0.7.91}/langgraph_grpc_common/conversion/interrupt.py +0 -0
  205. {langgraph_api-0.7.89 → langgraph_api-0.7.91}/langgraph_grpc_common/conversion/messages.py +0 -0
  206. {langgraph_api-0.7.89 → langgraph_api-0.7.91}/langgraph_grpc_common/conversion/orchestrator_response.py +0 -0
  207. {langgraph_api-0.7.89 → langgraph_api-0.7.91}/langgraph_grpc_common/conversion/runopts.py +0 -0
  208. {langgraph_api-0.7.89 → langgraph_api-0.7.91}/langgraph_grpc_common/conversion/stream_mode.py +0 -0
  209. {langgraph_api-0.7.89 → langgraph_api-0.7.91}/langgraph_grpc_common/conversion/struct.py +0 -0
  210. {langgraph_api-0.7.89 → langgraph_api-0.7.91}/langgraph_grpc_common/conversion/task.py +0 -0
  211. {langgraph_api-0.7.89 → langgraph_api-0.7.91}/langgraph_grpc_common/conversion/value.py +0 -0
  212. {langgraph_api-0.7.89 → langgraph_api-0.7.91}/langgraph_grpc_common/proto/__init__.py +0 -0
  213. {langgraph_api-0.7.89 → langgraph_api-0.7.91}/langgraph_grpc_common/proto/checkpointer_pb2.py +0 -0
  214. {langgraph_api-0.7.89 → langgraph_api-0.7.91}/langgraph_grpc_common/proto/checkpointer_pb2.pyi +0 -0
  215. {langgraph_api-0.7.89 → langgraph_api-0.7.91}/langgraph_grpc_common/proto/checkpointer_pb2_grpc.py +0 -0
  216. {langgraph_api-0.7.89 → langgraph_api-0.7.91}/langgraph_grpc_common/proto/checkpointer_pb2_grpc.pyi +0 -0
  217. {langgraph_api-0.7.89 → langgraph_api-0.7.91}/langgraph_grpc_common/proto/core_api_pb2.py +0 -0
  218. {langgraph_api-0.7.89 → langgraph_api-0.7.91}/langgraph_grpc_common/proto/core_api_pb2.pyi +0 -0
  219. {langgraph_api-0.7.89 → langgraph_api-0.7.91}/langgraph_grpc_common/proto/core_api_pb2_grpc.py +0 -0
  220. {langgraph_api-0.7.89 → langgraph_api-0.7.91}/langgraph_grpc_common/proto/core_api_pb2_grpc.pyi +0 -0
  221. {langgraph_api-0.7.89 → langgraph_api-0.7.91}/langgraph_grpc_common/proto/encryption_pb2.py +0 -0
  222. {langgraph_api-0.7.89 → langgraph_api-0.7.91}/langgraph_grpc_common/proto/encryption_pb2.pyi +0 -0
  223. {langgraph_api-0.7.89 → langgraph_api-0.7.91}/langgraph_grpc_common/proto/encryption_pb2_grpc.py +0 -0
  224. {langgraph_api-0.7.89 → langgraph_api-0.7.91}/langgraph_grpc_common/proto/encryption_pb2_grpc.pyi +0 -0
  225. {langgraph_api-0.7.89 → langgraph_api-0.7.91}/langgraph_grpc_common/proto/engine_api_pb2.py +0 -0
  226. {langgraph_api-0.7.89 → langgraph_api-0.7.91}/langgraph_grpc_common/proto/engine_api_pb2.pyi +0 -0
  227. {langgraph_api-0.7.89 → langgraph_api-0.7.91}/langgraph_grpc_common/proto/engine_api_pb2_grpc.py +0 -0
  228. {langgraph_api-0.7.89 → langgraph_api-0.7.91}/langgraph_grpc_common/proto/engine_api_pb2_grpc.pyi +0 -0
  229. {langgraph_api-0.7.89 → langgraph_api-0.7.91}/langgraph_grpc_common/proto/engine_common_pb2.py +0 -0
  230. {langgraph_api-0.7.89 → langgraph_api-0.7.91}/langgraph_grpc_common/proto/engine_common_pb2.pyi +0 -0
  231. {langgraph_api-0.7.89 → langgraph_api-0.7.91}/langgraph_grpc_common/proto/engine_common_pb2_grpc.py +0 -0
  232. {langgraph_api-0.7.89 → langgraph_api-0.7.91}/langgraph_grpc_common/proto/engine_common_pb2_grpc.pyi +0 -0
  233. {langgraph_api-0.7.89 → langgraph_api-0.7.91}/langgraph_grpc_common/proto/enum_cancel_run_action_pb2.py +0 -0
  234. {langgraph_api-0.7.89 → langgraph_api-0.7.91}/langgraph_grpc_common/proto/enum_cancel_run_action_pb2.pyi +0 -0
  235. {langgraph_api-0.7.89 → langgraph_api-0.7.91}/langgraph_grpc_common/proto/enum_cancel_run_action_pb2_grpc.py +0 -0
  236. {langgraph_api-0.7.89 → langgraph_api-0.7.91}/langgraph_grpc_common/proto/enum_cancel_run_action_pb2_grpc.pyi +0 -0
  237. {langgraph_api-0.7.89 → langgraph_api-0.7.91}/langgraph_grpc_common/proto/enum_control_signal_pb2.py +0 -0
  238. {langgraph_api-0.7.89 → langgraph_api-0.7.91}/langgraph_grpc_common/proto/enum_control_signal_pb2.pyi +0 -0
  239. {langgraph_api-0.7.89 → langgraph_api-0.7.91}/langgraph_grpc_common/proto/enum_control_signal_pb2_grpc.py +0 -0
  240. {langgraph_api-0.7.89 → langgraph_api-0.7.91}/langgraph_grpc_common/proto/enum_control_signal_pb2_grpc.pyi +0 -0
  241. {langgraph_api-0.7.89 → langgraph_api-0.7.91}/langgraph_grpc_common/proto/enum_cron_on_run_completed_pb2.py +0 -0
  242. {langgraph_api-0.7.89 → langgraph_api-0.7.91}/langgraph_grpc_common/proto/enum_cron_on_run_completed_pb2.pyi +0 -0
  243. {langgraph_api-0.7.89 → langgraph_api-0.7.91}/langgraph_grpc_common/proto/enum_cron_on_run_completed_pb2_grpc.py +0 -0
  244. {langgraph_api-0.7.89 → langgraph_api-0.7.91}/langgraph_grpc_common/proto/enum_cron_on_run_completed_pb2_grpc.pyi +0 -0
  245. {langgraph_api-0.7.89 → langgraph_api-0.7.91}/langgraph_grpc_common/proto/enum_durability_pb2.py +0 -0
  246. {langgraph_api-0.7.89 → langgraph_api-0.7.91}/langgraph_grpc_common/proto/enum_durability_pb2.pyi +0 -0
  247. {langgraph_api-0.7.89 → langgraph_api-0.7.91}/langgraph_grpc_common/proto/enum_durability_pb2_grpc.py +0 -0
  248. {langgraph_api-0.7.89 → langgraph_api-0.7.91}/langgraph_grpc_common/proto/enum_durability_pb2_grpc.pyi +0 -0
  249. {langgraph_api-0.7.89 → langgraph_api-0.7.91}/langgraph_grpc_common/proto/enum_multitask_strategy_pb2.py +0 -0
  250. {langgraph_api-0.7.89 → langgraph_api-0.7.91}/langgraph_grpc_common/proto/enum_multitask_strategy_pb2.pyi +0 -0
  251. {langgraph_api-0.7.89 → langgraph_api-0.7.91}/langgraph_grpc_common/proto/enum_multitask_strategy_pb2_grpc.py +0 -0
  252. {langgraph_api-0.7.89 → langgraph_api-0.7.91}/langgraph_grpc_common/proto/enum_multitask_strategy_pb2_grpc.pyi +0 -0
  253. {langgraph_api-0.7.89 → langgraph_api-0.7.91}/langgraph_grpc_common/proto/enum_run_status_pb2.py +0 -0
  254. {langgraph_api-0.7.89 → langgraph_api-0.7.91}/langgraph_grpc_common/proto/enum_run_status_pb2.pyi +0 -0
  255. {langgraph_api-0.7.89 → langgraph_api-0.7.91}/langgraph_grpc_common/proto/enum_run_status_pb2_grpc.py +0 -0
  256. {langgraph_api-0.7.89 → langgraph_api-0.7.91}/langgraph_grpc_common/proto/enum_run_status_pb2_grpc.pyi +0 -0
  257. {langgraph_api-0.7.89 → langgraph_api-0.7.91}/langgraph_grpc_common/proto/enum_store_operation_entry_type_pb2.py +0 -0
  258. {langgraph_api-0.7.89 → langgraph_api-0.7.91}/langgraph_grpc_common/proto/enum_store_operation_entry_type_pb2.pyi +0 -0
  259. {langgraph_api-0.7.89 → langgraph_api-0.7.91}/langgraph_grpc_common/proto/enum_store_operation_entry_type_pb2_grpc.py +0 -0
  260. {langgraph_api-0.7.89 → langgraph_api-0.7.91}/langgraph_grpc_common/proto/enum_store_operation_entry_type_pb2_grpc.pyi +0 -0
  261. {langgraph_api-0.7.89 → langgraph_api-0.7.91}/langgraph_grpc_common/proto/enum_stream_mode_pb2.py +0 -0
  262. {langgraph_api-0.7.89 → langgraph_api-0.7.91}/langgraph_grpc_common/proto/enum_stream_mode_pb2.pyi +0 -0
  263. {langgraph_api-0.7.89 → langgraph_api-0.7.91}/langgraph_grpc_common/proto/enum_stream_mode_pb2_grpc.py +0 -0
  264. {langgraph_api-0.7.89 → langgraph_api-0.7.91}/langgraph_grpc_common/proto/enum_stream_mode_pb2_grpc.pyi +0 -0
  265. {langgraph_api-0.7.89 → langgraph_api-0.7.91}/langgraph_grpc_common/proto/enum_thread_status_pb2.py +0 -0
  266. {langgraph_api-0.7.89 → langgraph_api-0.7.91}/langgraph_grpc_common/proto/enum_thread_status_pb2.pyi +0 -0
  267. {langgraph_api-0.7.89 → langgraph_api-0.7.91}/langgraph_grpc_common/proto/enum_thread_status_pb2_grpc.py +0 -0
  268. {langgraph_api-0.7.89 → langgraph_api-0.7.91}/langgraph_grpc_common/proto/enum_thread_status_pb2_grpc.pyi +0 -0
  269. {langgraph_api-0.7.89 → langgraph_api-0.7.91}/langgraph_grpc_common/proto/enum_thread_stream_mode_pb2.py +0 -0
  270. {langgraph_api-0.7.89 → langgraph_api-0.7.91}/langgraph_grpc_common/proto/enum_thread_stream_mode_pb2.pyi +0 -0
  271. {langgraph_api-0.7.89 → langgraph_api-0.7.91}/langgraph_grpc_common/proto/enum_thread_stream_mode_pb2_grpc.py +0 -0
  272. {langgraph_api-0.7.89 → langgraph_api-0.7.91}/langgraph_grpc_common/proto/enum_thread_stream_mode_pb2_grpc.pyi +0 -0
  273. {langgraph_api-0.7.89 → langgraph_api-0.7.91}/langgraph_grpc_common/proto/errors_pb2.py +0 -0
  274. {langgraph_api-0.7.89 → langgraph_api-0.7.91}/langgraph_grpc_common/proto/errors_pb2.pyi +0 -0
  275. {langgraph_api-0.7.89 → langgraph_api-0.7.91}/langgraph_grpc_common/proto/errors_pb2_grpc.py +0 -0
  276. {langgraph_api-0.7.89 → langgraph_api-0.7.91}/langgraph_grpc_common/proto/errors_pb2_grpc.pyi +0 -0
  277. {langgraph_api-0.7.89 → langgraph_api-0.7.91}/langgraph_grpc_common/proto/executor_api_pb2.py +0 -0
  278. {langgraph_api-0.7.89 → langgraph_api-0.7.91}/langgraph_grpc_common/proto/executor_api_pb2.pyi +0 -0
  279. {langgraph_api-0.7.89 → langgraph_api-0.7.91}/langgraph_grpc_common/proto/executor_api_pb2_grpc.py +0 -0
  280. {langgraph_api-0.7.89 → langgraph_api-0.7.91}/langgraph_grpc_common/proto/executor_api_pb2_grpc.pyi +0 -0
  281. {langgraph_api-0.7.89 → langgraph_api-0.7.91}/langgraph_grpc_common/sanitize.py +0 -0
  282. {langgraph_api-0.7.89 → langgraph_api-0.7.91}/langgraph_grpc_common/serde.py +0 -0
  283. {langgraph_api-0.7.89 → langgraph_api-0.7.91}/langgraph_license/__init__.py +0 -0
  284. {langgraph_api-0.7.89 → langgraph_api-0.7.91}/langgraph_license/validation.py +0 -0
  285. {langgraph_api-0.7.89 → langgraph_api-0.7.91}/langgraph_runtime/__init__.py +0 -0
  286. {langgraph_api-0.7.89 → langgraph_api-0.7.91}/langgraph_runtime/checkpoint.py +0 -0
  287. {langgraph_api-0.7.89 → langgraph_api-0.7.91}/langgraph_runtime/database.py +0 -0
  288. {langgraph_api-0.7.89 → langgraph_api-0.7.91}/langgraph_runtime/lifespan.py +0 -0
  289. {langgraph_api-0.7.89 → langgraph_api-0.7.91}/langgraph_runtime/metrics.py +0 -0
  290. {langgraph_api-0.7.89 → langgraph_api-0.7.91}/langgraph_runtime/ops.py +0 -0
  291. {langgraph_api-0.7.89 → langgraph_api-0.7.91}/langgraph_runtime/queue.py +0 -0
  292. {langgraph_api-0.7.89 → langgraph_api-0.7.91}/langgraph_runtime/retry.py +0 -0
  293. {langgraph_api-0.7.89 → langgraph_api-0.7.91}/langgraph_runtime/routes.py +0 -0
  294. {langgraph_api-0.7.89 → langgraph_api-0.7.91}/langgraph_runtime/store.py +0 -0
  295. {langgraph_api-0.7.89 → langgraph_api-0.7.91}/logging.json +0 -0
  296. {langgraph_api-0.7.89 → langgraph_api-0.7.91}/openapi.json +0 -0
  297. {langgraph_api-0.7.89 → langgraph_api-0.7.91}/scripts/build_wheel.py +0 -0
  298. {langgraph_api-0.7.89 → langgraph_api-0.7.91}/scripts/create_license.py +0 -0
  299. {langgraph_api-0.7.89 → langgraph_api-0.7.91}/scripts/run_a2a_tck.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: langgraph-api
3
- Version: 0.7.89
3
+ Version: 0.7.91
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
@@ -14,7 +14,7 @@ Requires-Dist: httpx>=0.25.0
14
14
  Requires-Dist: jsonschema-rs<0.45,>=0.20.0
15
15
  Requires-Dist: langchain-core>=0.3.64
16
16
  Requires-Dist: langgraph-checkpoint<5,>=3.0.1
17
- Requires-Dist: langgraph-runtime-inmem<0.27.0,>=0.26.0
17
+ Requires-Dist: langgraph-runtime-inmem<0.28.0,>=0.27.0
18
18
  Requires-Dist: langgraph-sdk>=0.3.5
19
19
  Requires-Dist: langgraph<2,>=0.4.10
20
20
  Requires-Dist: langsmith[otel]>=0.6.3
@@ -32,6 +32,7 @@ Requires-Dist: truststore>=0.1
32
32
  Requires-Dist: uuid-utils>=0.12.0
33
33
  Requires-Dist: uvicorn>=0.26.0
34
34
  Requires-Dist: watchfiles>=0.13
35
+ Requires-Dist: zstandard>=0.23.0
35
36
  Description-Content-Type: text/markdown
36
37
 
37
38
  # LangGraph API
@@ -18,17 +18,17 @@ DELAY ?= 0
18
18
  EXPAND ?= 1
19
19
  STEPS ?= 100
20
20
 
21
- benchmark-burst:
22
- make benchmark-reset
23
- k6 run burst.js
24
21
 
25
22
  benchmark-ramp:
26
23
  make benchmark-reset
24
+ npm install
25
+ npm run build
27
26
  k6 run --out json=raw_data_$(shell date +%Y-%m-%dT%H-%M-%S).json --system-tags=[] ramp.js
28
27
 
29
28
  benchmark-capacity:
30
29
  rm -f capacity_summary.json
31
30
  npm install
31
+ npm run build
32
32
  LANGSMITH_API_KEY=$(LANGSMITH_API_KEY) \
33
33
  CLUSTER_NAME=$(CLUSTER_NAME) \
34
34
  WORKLOAD_NAMES=$(WORKLOAD_NAMES) \
@@ -6,11 +6,8 @@ K6 is a modern load testing tool that allows you to test the performance and rel
6
6
 
7
7
  ### Available Tests
8
8
 
9
- There are two modes of testing available:
10
- 1. `Burst` - Kick off a burst of /run/wait requests.
11
- Available Params:
12
- BURST_SIZE - How many requests to run. Default: 100
13
- 2. `Ramp` - Scale up the number of /run/wait requests and then plateau.
9
+ Available test:
10
+ 1. `Ramp` - Scale up the number of /run/wait requests and then plateau.
14
11
  Available Params:
15
12
  LOAD_SIZE - How much traffic to ramp up over a 60s period. Default: 500
16
13
  LEVELS - The number of times to ramp up. Default: 2
@@ -45,17 +42,11 @@ Available Params:
45
42
  ### Basic Usage
46
43
 
47
44
  ```bash
48
- # Run burst test with default burst size
49
- make benchmark-burst
50
-
51
- # Run burst test with custom burst size
52
- BURST_SIZE=500 make benchmark-burst
53
-
54
45
  # Run ramp test with a different mode and expand size
55
46
  MODE='parallel' EXPAND=100 make benchmark-ramp
56
47
 
57
- # Run burst test against a deployment
58
- BASE_URL=https://jdr-benchmark-1cfe27c4cd375e1c999f02f186f617f6.us.langgraph.app make benchmark-burst
48
+ # Run ramp test against a deployment
49
+ BASE_URL=https://jdr-benchmark-1cfe27c4cd375e1c999f02f186f617f6.us.langgraph.app make benchmark-ramp
59
50
 
60
51
  # Clean up result files
61
52
  make benchmark-clean
@@ -63,7 +54,7 @@ make benchmark-clean
63
54
 
64
55
  ### Output
65
56
 
66
- Summary results are written to stdout and persisted in a summary_burst file. More detailed results for the same burst are persisted in a results_burst file.
57
+ Summary results are written to stdout and persisted in a summary file. More detailed results for the same run are persisted in a results file.
67
58
 
68
59
  Charts can be created from the run locally using the `make benchmark-charts` command.
69
60
 
@@ -0,0 +1,129 @@
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 } from './types.js';
6
+ import { DEFAULT_GRAPH_ID } from './types.js';
7
+ import { addResponse, okResult } from './types.js';
8
+ import { logFailure } from './log-failure.js';
9
+
10
+ type K6Response = ReturnType<typeof http.post> | ReturnType<typeof http.get> | ReturnType<typeof http.del>;
11
+
12
+ interface AssistantData {
13
+ assistantId: string;
14
+ searchResponse: K6Response;
15
+ getResponse: K6Response;
16
+ patchResponse: K6Response;
17
+ getResponse2: K6Response;
18
+ countResponse: K6Response;
19
+ deleteResponse: K6Response;
20
+ }
21
+
22
+ export class Assistant extends BenchmarkRunner {
23
+ static run(
24
+ baseUrl: string,
25
+ requestParams: Record<string, unknown>,
26
+ _benchmarkGraphOptions?: BenchmarkGraphOptions
27
+ ): BenchmarkResult<AssistantData> {
28
+ const graph_id = DEFAULT_GRAPH_ID;
29
+ let metadata: Record<string, string> = {
30
+ description: `Test benchmark assistant ${crypto.randomUUID()}`,
31
+ created_by: 'benchmark',
32
+ };
33
+ const responses: Record<string, import('./types.js').HttpResponse> = {};
34
+
35
+ const createPayload = JSON.stringify({ graph_id, metadata });
36
+ const createResponse = http.post(`${baseUrl}/assistants`, createPayload, requestParams);
37
+ addResponse(responses, 'create', createResponse);
38
+ const assistantId = (createResponse.json() as { assistant_id: string }).assistant_id;
39
+
40
+ const searchPayload = JSON.stringify({ graph_id, metadata, limit: 1 });
41
+ const searchResponse = http.post(`${baseUrl}/assistants/search`, searchPayload, requestParams);
42
+ addResponse(responses, 'search', searchResponse);
43
+
44
+ const getResponse = http.get(`${baseUrl}/assistants/${assistantId}`, requestParams);
45
+ addResponse(responses, 'get', getResponse);
46
+
47
+ metadata = { description: `Test benchmark assistant ${crypto.randomUUID()}` };
48
+ const patchPayload = JSON.stringify({ metadata });
49
+ const patchResponse = http.patch(`${baseUrl}/assistants/${assistantId}`, patchPayload, requestParams);
50
+ addResponse(responses, 'patch', patchResponse);
51
+
52
+ const getResponse2 = http.get(`${baseUrl}/assistants/${assistantId}`, requestParams);
53
+ addResponse(responses, 'get2', getResponse2);
54
+
55
+ const countPayload = JSON.stringify({ graph_id, metadata });
56
+ const countResponse = http.post(`${baseUrl}/assistants/count`, countPayload, requestParams);
57
+ addResponse(responses, 'count', countResponse);
58
+
59
+ const deleteResponse = http.del(`${baseUrl}/assistants/${assistantId}`, '{}', requestParams);
60
+ addResponse(responses, 'delete', deleteResponse);
61
+
62
+ return okResult(responses, {
63
+ assistantId,
64
+ searchResponse,
65
+ getResponse,
66
+ patchResponse,
67
+ getResponse2,
68
+ countResponse,
69
+ deleteResponse,
70
+ });
71
+ }
72
+
73
+ static validate(
74
+ result: BenchmarkResult<AssistantData>,
75
+ errorMetrics: ErrorMetrics,
76
+ _benchmarkGraphOptions?: BenchmarkGraphOptions
77
+ ): boolean {
78
+ const d = result.data;
79
+ if (!d) {
80
+ logFailure(Assistant.toString(), result);
81
+ errorMetrics.other_errors.add(1);
82
+ return false;
83
+ }
84
+ let success = false;
85
+ try {
86
+ success = check(result, {
87
+ 'Search response contains a single assistant': () => (d.searchResponse.json() as unknown[]).length === 1,
88
+ 'Search response contains the correct assistant': () =>
89
+ (d.searchResponse.json() as { assistant_id: string }[])[0].assistant_id === d.assistantId,
90
+ 'Get response contains the correct assistant': () =>
91
+ (d.getResponse.json() as { assistant_id: string }).assistant_id === d.assistantId,
92
+ 'Patch response contains the correct assistant': () =>
93
+ (d.patchResponse.json() as { assistant_id: string }).assistant_id === d.assistantId,
94
+ 'Get response 2 contains the correct assistant': () =>
95
+ (d.getResponse2.json() as { assistant_id: string }).assistant_id === d.assistantId,
96
+ 'Get response 2 contains the new description': () => {
97
+ const g2 = d.getResponse2.json() as { metadata?: { description?: string } };
98
+ const g1 = d.getResponse.json() as { metadata?: { description?: string } };
99
+ const p = d.patchResponse.json() as { metadata?: { description?: string } };
100
+ return g2.metadata?.description !== g1.metadata?.description && g2.metadata?.description === p.metadata?.description;
101
+ },
102
+ 'Get response 2 contains the correct created_by': () =>
103
+ (d.getResponse2.json() as { metadata?: { created_by?: string } }).metadata?.created_by === 'benchmark',
104
+ 'Count response contains the correct number of assistants': () =>
105
+ parseInt((d.countResponse.json() as unknown) as string, 10) === 1,
106
+ 'Delete response is successful': () => (d.deleteResponse as { status?: number }).status === 204,
107
+ });
108
+ } catch (error) {
109
+ console.log(`Unknown error checking response: ${(error as Error).message}`);
110
+ }
111
+ if (!success) {
112
+ logFailure(Assistant.toString(), result);
113
+ const statuses = [d.searchResponse, d.getResponse, d.patchResponse, d.getResponse2, d.countResponse, d.deleteResponse]
114
+ .map((r) => (r as { status?: number }).status);
115
+ if (statuses.some((s) => s === 502)) {
116
+ errorMetrics.server_errors.add(1);
117
+ } else if (statuses.some((s) => s === 408)) {
118
+ errorMetrics.timeout_errors.add(1);
119
+ } else {
120
+ errorMetrics.other_errors.add(1);
121
+ }
122
+ }
123
+ return success;
124
+ }
125
+
126
+ static toString(): string {
127
+ return 'assistants';
128
+ }
129
+ }
@@ -0,0 +1,35 @@
1
+ import type { BenchmarkResult, BenchmarkGraphOptions } from './types.js';
2
+
3
+ export interface ErrorMetrics {
4
+ server_errors: { add(n: number): void };
5
+ timeout_errors: { add(n: number): void };
6
+ api_errors?: { add(n: number): void };
7
+ missing_message_errors?: { add(n: number): void };
8
+ other_errors: { add(n: number): void };
9
+ }
10
+
11
+ /**
12
+ * Abstract base for benchmark runners. All runners return BenchmarkResult
13
+ * and validate() receives that same shape.
14
+ */
15
+ export abstract class BenchmarkRunner {
16
+ static run(
17
+ _baseUrl: string,
18
+ _requestParams: Record<string, unknown>,
19
+ _benchmarkGraphOptions?: BenchmarkGraphOptions
20
+ ): BenchmarkResult<unknown> {
21
+ throw new Error('Not implemented');
22
+ }
23
+
24
+ static toString(): string {
25
+ throw new Error('Not implemented');
26
+ }
27
+
28
+ static validate(
29
+ _result: BenchmarkResult<unknown>,
30
+ _errorMetrics: ErrorMetrics,
31
+ _benchmarkGraphOptions?: BenchmarkGraphOptions
32
+ ): boolean {
33
+ throw new Error('Not implemented');
34
+ }
35
+ }
@@ -0,0 +1,40 @@
1
+ import { WaitWrite } from './wait_write.js';
2
+ import { StreamWrite } from './stream_write.js';
3
+ import { Assistant } from './assistant.js';
4
+ import { Thread } from './thread.js';
5
+ import { EnqueuedRunsOrder } from './enqueued_runs_order.js';
6
+ import { CancelFirstSecondCompletes } from './cancel_first_second_completes.js';
7
+ import { ThreadRunsMetadataSearch } from './thread_runs_metadata_search.js';
8
+ import { ThreadsSearchMetadata } from './threads_search_metadata.js';
9
+ import { RandomStream } from './random_stream.js';
10
+ import { MetaWorkload } from './meta_workload.js';
11
+ import type { BenchmarkRunner } from './benchmark-runner.js';
12
+
13
+ export class Benchmarks {
14
+ static getRunner(type: string): typeof BenchmarkRunner {
15
+ switch (type) {
16
+ case WaitWrite.toString():
17
+ return WaitWrite;
18
+ case StreamWrite.toString():
19
+ return StreamWrite;
20
+ case Assistant.toString():
21
+ return Assistant;
22
+ case Thread.toString():
23
+ return Thread;
24
+ case EnqueuedRunsOrder.toString():
25
+ return EnqueuedRunsOrder;
26
+ case CancelFirstSecondCompletes.toString():
27
+ return CancelFirstSecondCompletes;
28
+ case ThreadRunsMetadataSearch.toString():
29
+ return ThreadRunsMetadataSearch;
30
+ case ThreadsSearchMetadata.toString():
31
+ return ThreadsSearchMetadata;
32
+ case RandomStream.toString():
33
+ return RandomStream;
34
+ case MetaWorkload.toString():
35
+ return MetaWorkload;
36
+ default:
37
+ throw new Error(`Unknown benchmark type: ${type}`);
38
+ }
39
+ }
40
+ }
@@ -0,0 +1,116 @@
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 } from './types.js';
6
+ import { DEFAULT_GRAPH_ID, JOIN_TIMEOUT } from './types.js';
7
+ import { addResponse, failResult, okResult } from './types.js';
8
+ import { logFailure } from './log-failure.js';
9
+
10
+ interface CancelFirstSecondCompletesData {
11
+ threadId: string;
12
+ run1Id: string;
13
+ run2Id: string;
14
+ run1Final: { status: string } | null;
15
+ run2: { status: string } | null;
16
+ }
17
+
18
+ export class CancelFirstSecondCompletes extends BenchmarkRunner {
19
+ static run(
20
+ baseUrl: string,
21
+ requestParams: Record<string, unknown>,
22
+ benchmarkGraphOptions?: BenchmarkGraphOptions
23
+ ): BenchmarkResult<CancelFirstSecondCompletesData> {
24
+ const graphId = benchmarkGraphOptions?.graph_id ?? DEFAULT_GRAPH_ID;
25
+ const longDelaySec = 3;
26
+ const responses: Record<string, import('./types.js').HttpResponse> = {};
27
+ const joinParams = { ...requestParams, timeout: JOIN_TIMEOUT };
28
+
29
+ const createThreadRes = http.post(`${baseUrl}/threads`, '{}', requestParams);
30
+ addResponse(responses, 'create_thread', createThreadRes);
31
+ if (createThreadRes.status !== 200) {
32
+ return failResult('create_thread', responses) as BenchmarkResult<CancelFirstSecondCompletesData>;
33
+ }
34
+ const threadId = (createThreadRes.json() as { thread_id: string }).thread_id;
35
+
36
+ const run1Payload = JSON.stringify({
37
+ assistant_id: graphId,
38
+ input: { mode: 'single', delay: longDelaySec, expand: 1, steps: 1 },
39
+ config: { recursion_limit: 5 },
40
+ });
41
+ const run1Res = http.post(`${baseUrl}/threads/${threadId}/runs`, run1Payload, requestParams);
42
+ addResponse(responses, 'run1', run1Res);
43
+ if (run1Res.status !== 200) {
44
+ return failResult('create_run1', responses) as BenchmarkResult<CancelFirstSecondCompletesData>;
45
+ }
46
+ const run1Id = (run1Res.json() as { run_id: string }).run_id;
47
+
48
+ const run2Payload = JSON.stringify({
49
+ assistant_id: graphId,
50
+ input: { mode: 'single', delay: 0, expand: 1, steps: 1 },
51
+ config: { recursion_limit: 5 },
52
+ multitask_strategy: 'enqueue',
53
+ });
54
+ const run2Res = http.post(`${baseUrl}/threads/${threadId}/runs`, run2Payload, requestParams);
55
+ addResponse(responses, 'run2', run2Res);
56
+ if (run2Res.status !== 200) {
57
+ return failResult('create_run2', responses) as BenchmarkResult<CancelFirstSecondCompletesData>;
58
+ }
59
+ const run2Id = (run2Res.json() as { run_id: string }).run_id;
60
+
61
+ const cancelRes = http.post(
62
+ `${baseUrl}/threads/${threadId}/runs/${run1Id}/cancel?wait=false`,
63
+ '{}',
64
+ requestParams
65
+ );
66
+ addResponse(responses, 'cancel', cancelRes);
67
+ if (cancelRes.status !== 202 && cancelRes.status !== 200) {
68
+ return failResult('cancel_run1', responses) as BenchmarkResult<CancelFirstSecondCompletesData>;
69
+ }
70
+
71
+ const run1GetRes = http.get(`${baseUrl}/threads/${threadId}/runs/${run1Id}/join`, joinParams);
72
+ addResponse(responses, 'join_run1', run1GetRes);
73
+ const run1Final = run1GetRes.status === 200 ? (run1GetRes.json() as { status: string }) : null;
74
+
75
+ const run2JoinRes = http.get(`${baseUrl}/threads/${threadId}/runs/${run2Id}/join`, joinParams);
76
+ addResponse(responses, 'join_run2', run2JoinRes);
77
+ if (run2JoinRes.status !== 200) {
78
+ return failResult('join_run2', responses) as BenchmarkResult<CancelFirstSecondCompletesData>;
79
+ }
80
+ const run2 = run2JoinRes.json() as { status: string };
81
+
82
+ return okResult(responses, { threadId, run1Id, run2Id, run1Final, run2 });
83
+ }
84
+
85
+ static validate(
86
+ result: BenchmarkResult<CancelFirstSecondCompletesData>,
87
+ errorMetrics: ErrorMetrics,
88
+ _benchmarkGraphOptions?: BenchmarkGraphOptions
89
+ ): boolean {
90
+ if (!result.ok) {
91
+ logFailure(CancelFirstSecondCompletes.toString(), result);
92
+ const statuses = Object.values(result.responses).map((r) => r.status);
93
+ if (statuses.some((s) => s != null && s >= 500)) {
94
+ errorMetrics.server_errors.add(1);
95
+ } else {
96
+ errorMetrics.other_errors.add(1);
97
+ }
98
+ return false;
99
+ }
100
+ const d = result.data!;
101
+ const success = check(result, {
102
+ 'Run 1 was cancelled or interrupted': () =>
103
+ Boolean(d.run1Final && (d.run1Final.status === 'cancelled' || d.run1Final.status === 'interrupted')),
104
+ 'Run 2 completed successfully': () => d.run2?.status === 'success',
105
+ });
106
+ if (!success) {
107
+ logFailure(CancelFirstSecondCompletes.toString(), result);
108
+ errorMetrics.other_errors.add(1);
109
+ }
110
+ return success;
111
+ }
112
+
113
+ static toString(): string {
114
+ return 'cancel_first_second_completes';
115
+ }
116
+ }
@@ -0,0 +1,100 @@
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 } from './types.js';
6
+ import { DEFAULT_GRAPH_ID, DEFAULT_INPUT, JOIN_TIMEOUT, NUM_ENQUEUED_RUNS } from './types.js';
7
+ import { addResponse, failResult, okResult } from './types.js';
8
+ import { logFailure } from './log-failure.js';
9
+
10
+ interface EnqueuedRunsOrderData {
11
+ threadId: string;
12
+ runIds: string[];
13
+ completedAt: Array<{ runId: string; status: string; updated_at: string }>;
14
+ }
15
+
16
+ export class EnqueuedRunsOrder extends BenchmarkRunner {
17
+ static run(
18
+ baseUrl: string,
19
+ requestParams: Record<string, unknown>,
20
+ benchmarkGraphOptions?: BenchmarkGraphOptions
21
+ ): BenchmarkResult<EnqueuedRunsOrderData> {
22
+ const graphId = benchmarkGraphOptions?.graph_id ?? DEFAULT_GRAPH_ID;
23
+ const responses: Record<string, import('./types.js').HttpResponse> = {};
24
+ const joinParams = { ...requestParams, timeout: JOIN_TIMEOUT } as Record<string, unknown>;
25
+
26
+ const createThreadRes = http.post(`${baseUrl}/threads`, '{}', requestParams);
27
+ addResponse(responses, 'create_thread', createThreadRes);
28
+ if (createThreadRes.status !== 200) {
29
+ return failResult(undefined, responses) as BenchmarkResult<EnqueuedRunsOrderData>;
30
+ }
31
+ const threadId = (createThreadRes.json() as { thread_id: string }).thread_id;
32
+
33
+ const runIds: string[] = [];
34
+ for (let i = 0; i < NUM_ENQUEUED_RUNS; i++) {
35
+ const payload = JSON.stringify({
36
+ assistant_id: graphId,
37
+ input: benchmarkGraphOptions?.input ?? DEFAULT_INPUT,
38
+ config: { recursion_limit: 5 },
39
+ multitask_strategy: 'enqueue',
40
+ });
41
+ const createRunRes = http.post(`${baseUrl}/threads/${threadId}/runs`, payload, requestParams);
42
+ addResponse(responses, `create_run_${i}`, createRunRes);
43
+ if (createRunRes.status !== 200) {
44
+ return failResult(`create_run_${i}`, responses) as BenchmarkResult<EnqueuedRunsOrderData>;
45
+ }
46
+ runIds.push((createRunRes.json() as { run_id: string }).run_id);
47
+ }
48
+
49
+ const completedAt: EnqueuedRunsOrderData['completedAt'] = [];
50
+ for (let i = 0; i < NUM_ENQUEUED_RUNS; i++) {
51
+ const runId = runIds[i];
52
+ const joinRes = http.get(`${baseUrl}/threads/${threadId}/runs/${runId}/join`, joinParams);
53
+ addResponse(responses, `join_run_${i}`, joinRes);
54
+ if (joinRes.status !== 200) {
55
+ return failResult(`join_run_${i}`, responses) as BenchmarkResult<EnqueuedRunsOrderData>;
56
+ }
57
+ const run = joinRes.json() as { status: string; updated_at: string };
58
+ completedAt.push({ runId, status: run.status, updated_at: run.updated_at });
59
+ }
60
+
61
+ return okResult(responses, { threadId, runIds, completedAt });
62
+ }
63
+
64
+ static validate(
65
+ result: BenchmarkResult<EnqueuedRunsOrderData>,
66
+ errorMetrics: ErrorMetrics,
67
+ _benchmarkGraphOptions?: BenchmarkGraphOptions
68
+ ): boolean {
69
+ if (!result.ok) {
70
+ logFailure(EnqueuedRunsOrder.toString(), result);
71
+ const statuses = Object.values(result.responses).map((r) => r.status);
72
+ if (statuses.some((s) => s != null && s >= 500)) {
73
+ errorMetrics.server_errors.add(1);
74
+ } else {
75
+ errorMetrics.other_errors.add(1);
76
+ }
77
+ return false;
78
+ }
79
+ const d = result.data!;
80
+ const success = check(result, {
81
+ 'All runs completed': () => d.completedAt.length === NUM_ENQUEUED_RUNS,
82
+ 'All runs succeeded': () => d.completedAt.every((c) => c.status === 'success'),
83
+ 'Runs completed in order': () => {
84
+ const times = d.completedAt.map((c) => new Date(c.updated_at).getTime());
85
+ return times[0] <= times[1] && times[1] <= times[2];
86
+ },
87
+ });
88
+ if (!success) {
89
+ logFailure(EnqueuedRunsOrder.toString(), result, {
90
+ extra: `completedAt=${JSON.stringify(d.completedAt)}`,
91
+ });
92
+ errorMetrics.other_errors.add(1);
93
+ }
94
+ return success;
95
+ }
96
+
97
+ static toString(): string {
98
+ return 'enqueued_runs_order';
99
+ }
100
+ }
@@ -0,0 +1,38 @@
1
+ import type { BenchmarkResult } from './types.js';
2
+
3
+ export interface LogFailureOptions {
4
+ extra?: string;
5
+ }
6
+
7
+ /**
8
+ * Log useful information when a benchmark run or validation fails.
9
+ * Uses the consistent BenchmarkResult shape: ok, step, responses.
10
+ */
11
+ export function logFailure(
12
+ benchmarkType: string,
13
+ result: Partial<BenchmarkResult<unknown>> | null | undefined,
14
+ options: LogFailureOptions = {}
15
+ ): void {
16
+ const parts: string[] = [`[${benchmarkType}] FAIL`];
17
+ if (result?.ok === false) {
18
+ parts.push('result.ok=false');
19
+ }
20
+ if (result?.step != null) {
21
+ parts.push(`step=${result.step}`);
22
+ }
23
+ if (result?.responses && typeof result.responses === 'object') {
24
+ for (const [name, res] of Object.entries(result.responses)) {
25
+ if (res && typeof res === 'object') {
26
+ const status = res.status ?? '?';
27
+ parts.push(`${name}=${status}${res.error ? ` error=${res.error}` : ''}`);
28
+ if (res.body != null && (res.status == null || res.status >= 400)) {
29
+ parts.push(`body=${res.body}`);
30
+ }
31
+ }
32
+ }
33
+ }
34
+ if (options.extra) {
35
+ parts.push(options.extra);
36
+ }
37
+ console.log(parts.join(' '));
38
+ }
@@ -0,0 +1,70 @@
1
+ import { BenchmarkRunner } from './benchmark-runner.js';
2
+ import type { ErrorMetrics } from './benchmark-runner.js';
3
+ import { logFailure } from './log-failure.js';
4
+ import type { BenchmarkResult, BenchmarkGraphOptions } from './types.js';
5
+ import { WaitWrite } from './wait_write.js';
6
+ import { StreamWrite } from './stream_write.js';
7
+ import { Assistant } from './assistant.js';
8
+ import { Thread } from './thread.js';
9
+ import { EnqueuedRunsOrder } from './enqueued_runs_order.js';
10
+ import { CancelFirstSecondCompletes } from './cancel_first_second_completes.js';
11
+ import { ThreadRunsMetadataSearch } from './thread_runs_metadata_search.js';
12
+ import { ThreadsSearchMetadata } from './threads_search_metadata.js';
13
+ import { RandomStream } from './random_stream.js';
14
+
15
+ const OTHER_RUNNERS = [
16
+ WaitWrite,
17
+ StreamWrite,
18
+ Assistant,
19
+ Thread,
20
+ EnqueuedRunsOrder,
21
+ CancelFirstSecondCompletes,
22
+ ThreadRunsMetadataSearch,
23
+ ThreadsSearchMetadata,
24
+ RandomStream,
25
+ ];
26
+
27
+ interface MetaWorkloadData {
28
+ type: string;
29
+ result: BenchmarkResult;
30
+ Runner: typeof BenchmarkRunner;
31
+ }
32
+
33
+ export class MetaWorkload extends BenchmarkRunner {
34
+ static run(
35
+ baseUrl: string,
36
+ requestParams: Record<string, unknown>,
37
+ benchmarkGraphOptions?: BenchmarkGraphOptions
38
+ ): BenchmarkResult<MetaWorkloadData> {
39
+ const Runner = OTHER_RUNNERS[Math.floor(Math.random() * OTHER_RUNNERS.length)];
40
+ const innerResult = Runner.run(baseUrl, requestParams, benchmarkGraphOptions) as BenchmarkResult;
41
+ return {
42
+ ok: innerResult.ok,
43
+ step: innerResult.step,
44
+ responses: innerResult.responses ?? {},
45
+ data: { type: Runner.toString(), result: innerResult, Runner },
46
+ };
47
+ }
48
+
49
+ static validate(
50
+ result: BenchmarkResult<MetaWorkloadData>,
51
+ errorMetrics: ErrorMetrics,
52
+ benchmarkGraphOptions?: BenchmarkGraphOptions
53
+ ): boolean {
54
+ const d = result.data;
55
+ if (!d) {
56
+ logFailure(MetaWorkload.toString(), result);
57
+ errorMetrics.other_errors.add(1);
58
+ return false;
59
+ }
60
+ const success = d.Runner.validate(d.result, errorMetrics, benchmarkGraphOptions);
61
+ if (!success) {
62
+ logFailure(MetaWorkload.toString(), result, { extra: `delegated_runner=${d.type}` });
63
+ }
64
+ return success;
65
+ }
66
+
67
+ static toString(): string {
68
+ return 'meta_workload';
69
+ }
70
+ }