langgraph-api 0.7.94__tar.gz → 0.7.96__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.
- {langgraph_api-0.7.94 → langgraph_api-0.7.96}/Makefile +1 -1
- {langgraph_api-0.7.94 → langgraph_api-0.7.96}/PKG-INFO +1 -1
- {langgraph_api-0.7.94 → langgraph_api-0.7.96}/benchmark/Makefile +1 -1
- langgraph_api-0.7.96/benchmark/README.md +152 -0
- {langgraph_api-0.7.94 → langgraph_api-0.7.96}/benchmark/benchmark-runners/assistant.ts +2 -2
- {langgraph_api-0.7.94 → langgraph_api-0.7.96}/benchmark/benchmark-runners/benchmark-runner.ts +2 -2
- langgraph_api-0.7.96/benchmark/benchmark-runners/benchmark_profiles.ts +263 -0
- {langgraph_api-0.7.94 → langgraph_api-0.7.96}/benchmark/benchmark-runners/benchmarks.ts +0 -3
- {langgraph_api-0.7.94 → langgraph_api-0.7.96}/benchmark/benchmark-runners/cancel_first_second_completes.ts +9 -6
- {langgraph_api-0.7.94 → langgraph_api-0.7.96}/benchmark/benchmark-runners/enqueued_runs_order.ts +9 -6
- {langgraph_api-0.7.94 → langgraph_api-0.7.96}/benchmark/benchmark-runners/meta_workload.ts +3 -5
- {langgraph_api-0.7.94 → langgraph_api-0.7.96}/benchmark/benchmark-runners/stream_write.ts +25 -18
- {langgraph_api-0.7.94 → langgraph_api-0.7.96}/benchmark/benchmark-runners/thread.ts +2 -2
- {langgraph_api-0.7.94 → langgraph_api-0.7.96}/benchmark/benchmark-runners/thread_runs_metadata_search.ts +9 -6
- {langgraph_api-0.7.94 → langgraph_api-0.7.96}/benchmark/benchmark-runners/threads_search_metadata.ts +2 -2
- {langgraph_api-0.7.94 → langgraph_api-0.7.96}/benchmark/benchmark-runners/types.ts +18 -17
- {langgraph_api-0.7.94 → langgraph_api-0.7.96}/benchmark/benchmark-runners/wait_write.ts +23 -23
- {langgraph_api-0.7.94 → langgraph_api-0.7.96}/benchmark/capacity_k6.js +13 -19
- {langgraph_api-0.7.94 → langgraph_api-0.7.96}/benchmark/capacity_runner.mjs +73 -44
- {langgraph_api-0.7.94 → langgraph_api-0.7.96}/benchmark/continuous/uv.lock +6 -6
- {langgraph_api-0.7.94 → langgraph_api-0.7.96}/benchmark/ramp.js +16 -18
- {langgraph_api-0.7.94 → langgraph_api-0.7.96}/benchmark/staircase.py +1 -0
- {langgraph_api-0.7.94 → langgraph_api-0.7.96}/benchmark/staircase_step_k6.js +9 -12
- {langgraph_api-0.7.94 → langgraph_api-0.7.96}/benchmark/tsconfig.json +1 -1
- {langgraph_api-0.7.94 → langgraph_api-0.7.96}/benchmark/update-revision.js +2 -2
- langgraph_api-0.7.96/langgraph_api/__init__.py +1 -0
- {langgraph_api-0.7.94 → langgraph_api-0.7.96}/langgraph_api/api/__init__.py +1 -1
- {langgraph_api-0.7.94 → langgraph_api-0.7.96}/langgraph_api/api/threads.py +7 -0
- {langgraph_api-0.7.94 → langgraph_api-0.7.96}/langgraph_api/cli.py +44 -2
- {langgraph_api-0.7.94 → langgraph_api-0.7.96}/langgraph_api/config/__init__.py +4 -0
- {langgraph_api-0.7.94 → langgraph_api-0.7.96}/langgraph_api/graph.py +72 -6
- {langgraph_api-0.7.94 → langgraph_api-0.7.96}/langgraph_api/grpc/ops/threads.py +5 -0
- {langgraph_api-0.7.94 → langgraph_api-0.7.96}/langgraph_api/js/client.http.mts +32 -2
- {langgraph_api-0.7.94 → langgraph_api-0.7.96}/langgraph_api/js/client.mts +73 -2
- {langgraph_api-0.7.94 → langgraph_api-0.7.96}/langgraph_api/js/package.json +10 -10
- {langgraph_api-0.7.94 → langgraph_api-0.7.96}/langgraph_api/js/remote.py +10 -3
- {langgraph_api-0.7.94 → langgraph_api-0.7.96}/langgraph_api/js/yarn.lock +255 -248
- {langgraph_api-0.7.94 → langgraph_api-0.7.96}/langgraph_api/models/run.py +6 -1
- {langgraph_api-0.7.94 → langgraph_api-0.7.96}/langgraph_api/stream.py +96 -2
- {langgraph_api-0.7.94 → langgraph_api-0.7.96}/langgraph_api/timing/timer.py +1 -1
- {langgraph_api-0.7.94 → langgraph_api-0.7.96}/langgraph_api/validation.py +1 -0
- {langgraph_api-0.7.94 → langgraph_api-0.7.96}/langgraph_api/worker.py +8 -2
- langgraph_api-0.7.96/langgraph_grpc_common/proto/core_api_pb2.py +272 -0
- {langgraph_api-0.7.94 → langgraph_api-0.7.96}/langgraph_grpc_common/proto/core_api_pb2.pyi +16 -2
- langgraph_api-0.7.94/benchmark/README.md +0 -65
- langgraph_api-0.7.94/benchmark/benchmark-runners/random_stream.ts +0 -114
- langgraph_api-0.7.94/langgraph_api/__init__.py +0 -1
- langgraph_api-0.7.94/langgraph_grpc_common/proto/core_api_pb2.py +0 -271
- {langgraph_api-0.7.94 → langgraph_api-0.7.96}/.gitignore +0 -0
- {langgraph_api-0.7.94 → langgraph_api-0.7.96}/LICENSE +0 -0
- {langgraph_api-0.7.94 → langgraph_api-0.7.96}/README.md +0 -0
- {langgraph_api-0.7.94 → langgraph_api-0.7.96}/benchmark/.gitignore +0 -0
- {langgraph_api-0.7.94 → langgraph_api-0.7.96}/benchmark/benchmark-runners/log-failure.ts +0 -0
- {langgraph_api-0.7.94 → langgraph_api-0.7.96}/benchmark/capacity_dd_report.py +0 -0
- {langgraph_api-0.7.94 → langgraph_api-0.7.96}/benchmark/capacity_slack_report.py +0 -0
- {langgraph_api-0.7.94 → langgraph_api-0.7.96}/benchmark/capacity_urls.mjs +0 -0
- {langgraph_api-0.7.94 → langgraph_api-0.7.96}/benchmark/clean-cli.js +0 -0
- {langgraph_api-0.7.94 → langgraph_api-0.7.96}/benchmark/clean.js +0 -0
- {langgraph_api-0.7.94 → langgraph_api-0.7.96}/benchmark/continuous/README.md +0 -0
- {langgraph_api-0.7.94 → langgraph_api-0.7.96}/benchmark/continuous/pyproject.toml +0 -0
- {langgraph_api-0.7.94 → langgraph_api-0.7.96}/benchmark/continuous/runner.py +0 -0
- {langgraph_api-0.7.94 → langgraph_api-0.7.96}/benchmark/graphs.js +0 -0
- {langgraph_api-0.7.94 → langgraph_api-0.7.96}/benchmark/mixed_workload_k6.js +0 -0
- {langgraph_api-0.7.94 → langgraph_api-0.7.96}/benchmark/mixed_workload_runner.mjs +0 -0
- {langgraph_api-0.7.94 → langgraph_api-0.7.96}/benchmark/package.json +0 -0
- {langgraph_api-0.7.94 → langgraph_api-0.7.96}/benchmark/reporting/dd_reporting.py +0 -0
- {langgraph_api-0.7.94 → langgraph_api-0.7.96}/benchmark/reporting/slack_slowest_runs.py +0 -0
- {langgraph_api-0.7.94 → langgraph_api-0.7.96}/benchmark/reporting/slack_summary.py +0 -0
- {langgraph_api-0.7.94 → langgraph_api-0.7.96}/benchmark/run_local.sh +0 -0
- {langgraph_api-0.7.94 → langgraph_api-0.7.96}/benchmark/weather.js +0 -0
- {langgraph_api-0.7.94 → langgraph_api-0.7.96}/constraints.txt +0 -0
- {langgraph_api-0.7.94 → langgraph_api-0.7.96}/custom_store.sql +0 -0
- {langgraph_api-0.7.94 → langgraph_api-0.7.96}/forbidden.txt +0 -0
- {langgraph_api-0.7.94 → langgraph_api-0.7.96}/hatch_build.py +0 -0
- {langgraph_api-0.7.94 → langgraph_api-0.7.96}/healthcheck.py +0 -0
- {langgraph_api-0.7.94 → langgraph_api-0.7.96}/langgraph-cloud-debugging-20260210132856.zip +0 -0
- {langgraph_api-0.7.94 → langgraph_api-0.7.96}/langgraph_api/_checkpointer/__init__.py +0 -0
- {langgraph_api-0.7.94 → langgraph_api-0.7.96}/langgraph_api/_checkpointer/_adapter.py +0 -0
- {langgraph_api-0.7.94 → langgraph_api-0.7.96}/langgraph_api/_checkpointer/protocol.py +0 -0
- {langgraph_api-0.7.94 → langgraph_api-0.7.96}/langgraph_api/_factory_utils.py +0 -0
- {langgraph_api-0.7.94 → langgraph_api-0.7.96}/langgraph_api/api/a2a.py +0 -0
- {langgraph_api-0.7.94 → langgraph_api-0.7.96}/langgraph_api/api/assistants.py +0 -0
- {langgraph_api-0.7.94 → langgraph_api-0.7.96}/langgraph_api/api/mcp/__init__.py +0 -0
- {langgraph_api-0.7.94 → langgraph_api-0.7.96}/langgraph_api/api/mcp/_constants.py +0 -0
- {langgraph_api-0.7.94 → langgraph_api-0.7.96}/langgraph_api/api/mcp/_handlers.py +0 -0
- {langgraph_api-0.7.94 → langgraph_api-0.7.96}/langgraph_api/api/mcp/_models.py +0 -0
- {langgraph_api-0.7.94 → langgraph_api-0.7.96}/langgraph_api/api/mcp/_routes.py +0 -0
- {langgraph_api-0.7.94 → langgraph_api-0.7.96}/langgraph_api/api/mcp/_sanitizers.py +0 -0
- {langgraph_api-0.7.94 → langgraph_api-0.7.96}/langgraph_api/api/meta.py +0 -0
- {langgraph_api-0.7.94 → langgraph_api-0.7.96}/langgraph_api/api/openapi.py +0 -0
- {langgraph_api-0.7.94 → langgraph_api-0.7.96}/langgraph_api/api/profile.py +0 -0
- {langgraph_api-0.7.94 → langgraph_api-0.7.96}/langgraph_api/api/runs.py +0 -0
- {langgraph_api-0.7.94 → langgraph_api-0.7.96}/langgraph_api/api/store.py +0 -0
- {langgraph_api-0.7.94 → langgraph_api-0.7.96}/langgraph_api/api/ui.py +0 -0
- {langgraph_api-0.7.94 → langgraph_api-0.7.96}/langgraph_api/asgi_transport.py +0 -0
- {langgraph_api-0.7.94 → langgraph_api-0.7.96}/langgraph_api/asyncio.py +0 -0
- {langgraph_api-0.7.94 → langgraph_api-0.7.96}/langgraph_api/auth/__init__.py +0 -0
- {langgraph_api-0.7.94 → langgraph_api-0.7.96}/langgraph_api/auth/custom.py +0 -0
- {langgraph_api-0.7.94 → langgraph_api-0.7.96}/langgraph_api/auth/errors.py +0 -0
- {langgraph_api-0.7.94 → langgraph_api-0.7.96}/langgraph_api/auth/langsmith/__init__.py +0 -0
- {langgraph_api-0.7.94 → langgraph_api-0.7.96}/langgraph_api/auth/langsmith/backend.py +0 -0
- {langgraph_api-0.7.94 → langgraph_api-0.7.96}/langgraph_api/auth/langsmith/client.py +0 -0
- {langgraph_api-0.7.94 → langgraph_api-0.7.96}/langgraph_api/auth/middleware.py +0 -0
- {langgraph_api-0.7.94 → langgraph_api-0.7.96}/langgraph_api/auth/noop.py +0 -0
- {langgraph_api-0.7.94 → langgraph_api-0.7.96}/langgraph_api/auth/studio_user.py +0 -0
- {langgraph_api-0.7.94 → langgraph_api-0.7.96}/langgraph_api/cache.py +0 -0
- {langgraph_api-0.7.94 → langgraph_api-0.7.96}/langgraph_api/command.py +0 -0
- {langgraph_api-0.7.94 → langgraph_api-0.7.96}/langgraph_api/config/_parse.py +0 -0
- {langgraph_api-0.7.94 → langgraph_api-0.7.96}/langgraph_api/config/schemas.py +0 -0
- {langgraph_api-0.7.94 → langgraph_api-0.7.96}/langgraph_api/cron_scheduler.py +0 -0
- {langgraph_api-0.7.94 → langgraph_api-0.7.96}/langgraph_api/encryption/__init__.py +0 -0
- {langgraph_api-0.7.94 → langgraph_api-0.7.96}/langgraph_api/encryption/aes_json.py +0 -0
- {langgraph_api-0.7.94 → langgraph_api-0.7.96}/langgraph_api/encryption/context.py +0 -0
- {langgraph_api-0.7.94 → langgraph_api-0.7.96}/langgraph_api/encryption/custom.py +0 -0
- {langgraph_api-0.7.94 → langgraph_api-0.7.96}/langgraph_api/encryption/middleware.py +0 -0
- {langgraph_api-0.7.94 → langgraph_api-0.7.96}/langgraph_api/encryption/shared.py +0 -0
- {langgraph_api-0.7.94 → langgraph_api-0.7.96}/langgraph_api/errors.py +0 -0
- {langgraph_api-0.7.94 → langgraph_api-0.7.96}/langgraph_api/executor_entrypoint.py +0 -0
- {langgraph_api-0.7.94 → langgraph_api-0.7.96}/langgraph_api/feature_flags.py +0 -0
- {langgraph_api-0.7.94 → langgraph_api-0.7.96}/langgraph_api/grpc/__init__.py +0 -0
- {langgraph_api-0.7.94 → langgraph_api-0.7.96}/langgraph_api/grpc/client.py +0 -0
- {langgraph_api-0.7.94 → langgraph_api-0.7.96}/langgraph_api/grpc/generated/core_api_pb2.pyi +0 -0
- {langgraph_api-0.7.94 → langgraph_api-0.7.96}/langgraph_api/grpc/ops/__init__.py +0 -0
- {langgraph_api-0.7.94 → langgraph_api-0.7.96}/langgraph_api/grpc/ops/assistants.py +0 -0
- {langgraph_api-0.7.94 → langgraph_api-0.7.96}/langgraph_api/grpc/ops/cache.py +0 -0
- {langgraph_api-0.7.94 → langgraph_api-0.7.96}/langgraph_api/grpc/ops/crons.py +0 -0
- {langgraph_api-0.7.94 → langgraph_api-0.7.96}/langgraph_api/grpc/ops/runs.py +0 -0
- {langgraph_api-0.7.94 → langgraph_api-0.7.96}/langgraph_api/grpc/server.py +0 -0
- {langgraph_api-0.7.94 → langgraph_api-0.7.96}/langgraph_api/grpc/servicers/__init__.py +0 -0
- {langgraph_api-0.7.94 → langgraph_api-0.7.96}/langgraph_api/grpc/servicers/checkpointer.py +0 -0
- {langgraph_api-0.7.94 → langgraph_api-0.7.96}/langgraph_api/grpc/servicers/encryption.py +0 -0
- {langgraph_api-0.7.94 → langgraph_api-0.7.96}/langgraph_api/http.py +0 -0
- {langgraph_api-0.7.94 → langgraph_api-0.7.96}/langgraph_api/http_metrics.py +0 -0
- {langgraph_api-0.7.94 → langgraph_api-0.7.96}/langgraph_api/http_metrics_utils.py +0 -0
- {langgraph_api-0.7.94 → langgraph_api-0.7.96}/langgraph_api/js/.gitignore +0 -0
- {langgraph_api-0.7.94 → langgraph_api-0.7.96}/langgraph_api/js/.prettierrc +0 -0
- {langgraph_api-0.7.94 → langgraph_api-0.7.96}/langgraph_api/js/__init__.py +0 -0
- {langgraph_api-0.7.94 → langgraph_api-0.7.96}/langgraph_api/js/base.py +0 -0
- {langgraph_api-0.7.94 → langgraph_api-0.7.96}/langgraph_api/js/build.mts +0 -0
- {langgraph_api-0.7.94 → langgraph_api-0.7.96}/langgraph_api/js/errors.py +0 -0
- {langgraph_api-0.7.94 → langgraph_api-0.7.96}/langgraph_api/js/global.d.ts +0 -0
- {langgraph_api-0.7.94 → langgraph_api-0.7.96}/langgraph_api/js/schema.py +0 -0
- {langgraph_api-0.7.94 → langgraph_api-0.7.96}/langgraph_api/js/src/graph.mts +0 -0
- {langgraph_api-0.7.94 → langgraph_api-0.7.96}/langgraph_api/js/src/load.hooks.mjs +0 -0
- {langgraph_api-0.7.94 → langgraph_api-0.7.96}/langgraph_api/js/src/preload.mjs +0 -0
- {langgraph_api-0.7.94 → langgraph_api-0.7.96}/langgraph_api/js/src/utils/files.mts +0 -0
- {langgraph_api-0.7.94 → langgraph_api-0.7.96}/langgraph_api/js/src/utils/importMap.mts +0 -0
- {langgraph_api-0.7.94 → langgraph_api-0.7.96}/langgraph_api/js/src/utils/pythonSchemas.mts +0 -0
- {langgraph_api-0.7.94 → langgraph_api-0.7.96}/langgraph_api/js/src/utils/serde.mts +0 -0
- {langgraph_api-0.7.94 → langgraph_api-0.7.96}/langgraph_api/js/sse.py +0 -0
- {langgraph_api-0.7.94 → langgraph_api-0.7.96}/langgraph_api/js/traceblock.mts +0 -0
- {langgraph_api-0.7.94 → langgraph_api-0.7.96}/langgraph_api/js/tsconfig.json +0 -0
- {langgraph_api-0.7.94 → langgraph_api-0.7.96}/langgraph_api/js/ui.py +0 -0
- {langgraph_api-0.7.94 → langgraph_api-0.7.96}/langgraph_api/logging.py +0 -0
- {langgraph_api-0.7.94 → langgraph_api-0.7.96}/langgraph_api/metadata.py +0 -0
- {langgraph_api-0.7.94 → langgraph_api-0.7.96}/langgraph_api/metrics_datadog.py +0 -0
- {langgraph_api-0.7.94 → langgraph_api-0.7.96}/langgraph_api/middleware/__init__.py +0 -0
- {langgraph_api-0.7.94 → langgraph_api-0.7.96}/langgraph_api/middleware/ensure_store.py +0 -0
- {langgraph_api-0.7.94 → langgraph_api-0.7.96}/langgraph_api/middleware/http_logger.py +0 -0
- {langgraph_api-0.7.94 → langgraph_api-0.7.96}/langgraph_api/middleware/private_network.py +0 -0
- {langgraph_api-0.7.94 → langgraph_api-0.7.96}/langgraph_api/middleware/request_id.py +0 -0
- {langgraph_api-0.7.94 → langgraph_api-0.7.96}/langgraph_api/models/__init__.py +0 -0
- {langgraph_api-0.7.94 → langgraph_api-0.7.96}/langgraph_api/otel_context.py +0 -0
- {langgraph_api-0.7.94 → langgraph_api-0.7.96}/langgraph_api/patch.py +0 -0
- {langgraph_api-0.7.94 → langgraph_api-0.7.96}/langgraph_api/queue_entrypoint.py +0 -0
- {langgraph_api-0.7.94 → langgraph_api-0.7.96}/langgraph_api/route.py +0 -0
- {langgraph_api-0.7.94 → langgraph_api-0.7.96}/langgraph_api/schema.py +0 -0
- {langgraph_api-0.7.94 → langgraph_api-0.7.96}/langgraph_api/self_hosted_logs.py +0 -0
- {langgraph_api-0.7.94 → langgraph_api-0.7.96}/langgraph_api/self_hosted_metrics.py +0 -0
- {langgraph_api-0.7.94 → langgraph_api-0.7.96}/langgraph_api/serde.py +0 -0
- {langgraph_api-0.7.94 → langgraph_api-0.7.96}/langgraph_api/server.py +0 -0
- {langgraph_api-0.7.94 → langgraph_api-0.7.96}/langgraph_api/sse.py +0 -0
- {langgraph_api-0.7.94 → langgraph_api-0.7.96}/langgraph_api/state.py +0 -0
- {langgraph_api-0.7.94 → langgraph_api-0.7.96}/langgraph_api/store.py +0 -0
- {langgraph_api-0.7.94 → langgraph_api-0.7.96}/langgraph_api/timing/__init__.py +0 -0
- {langgraph_api-0.7.94 → langgraph_api-0.7.96}/langgraph_api/timing/profiler.py +0 -0
- {langgraph_api-0.7.94 → langgraph_api-0.7.96}/langgraph_api/traceblock.py +0 -0
- {langgraph_api-0.7.94 → langgraph_api-0.7.96}/langgraph_api/tunneling/cloudflare.py +0 -0
- {langgraph_api-0.7.94 → langgraph_api-0.7.96}/langgraph_api/utils/__init__.py +0 -0
- {langgraph_api-0.7.94 → langgraph_api-0.7.96}/langgraph_api/utils/cache.py +0 -0
- {langgraph_api-0.7.94 → langgraph_api-0.7.96}/langgraph_api/utils/config.py +0 -0
- {langgraph_api-0.7.94 → langgraph_api-0.7.96}/langgraph_api/utils/errors.py +0 -0
- {langgraph_api-0.7.94 → langgraph_api-0.7.96}/langgraph_api/utils/extract.py +0 -0
- {langgraph_api-0.7.94 → langgraph_api-0.7.96}/langgraph_api/utils/future.py +0 -0
- {langgraph_api-0.7.94 → langgraph_api-0.7.96}/langgraph_api/utils/headers.py +0 -0
- {langgraph_api-0.7.94 → langgraph_api-0.7.96}/langgraph_api/utils/retriable_client.py +0 -0
- {langgraph_api-0.7.94 → langgraph_api-0.7.96}/langgraph_api/utils/stream_codec.py +0 -0
- {langgraph_api-0.7.94 → langgraph_api-0.7.96}/langgraph_api/utils/uuids.py +0 -0
- {langgraph_api-0.7.94 → langgraph_api-0.7.96}/langgraph_api/webhook.py +0 -0
- {langgraph_api-0.7.94 → langgraph_api-0.7.96}/langgraph_grpc_common/__init__.py +0 -0
- {langgraph_api-0.7.94 → langgraph_api-0.7.96}/langgraph_grpc_common/checkpointer.py +0 -0
- {langgraph_api-0.7.94 → langgraph_api-0.7.96}/langgraph_grpc_common/conversion/__init__.py +0 -0
- {langgraph_api-0.7.94 → langgraph_api-0.7.96}/langgraph_grpc_common/conversion/_compat.py +0 -0
- {langgraph_api-0.7.94 → langgraph_api-0.7.96}/langgraph_grpc_common/conversion/channel.py +0 -0
- {langgraph_api-0.7.94 → langgraph_api-0.7.96}/langgraph_grpc_common/conversion/checkpoint.py +0 -0
- {langgraph_api-0.7.94 → langgraph_api-0.7.96}/langgraph_grpc_common/conversion/config.py +0 -0
- {langgraph_api-0.7.94 → langgraph_api-0.7.96}/langgraph_grpc_common/conversion/durability.py +0 -0
- {langgraph_api-0.7.94 → langgraph_api-0.7.96}/langgraph_grpc_common/conversion/exception.py +0 -0
- {langgraph_api-0.7.94 → langgraph_api-0.7.96}/langgraph_grpc_common/conversion/graph.py +0 -0
- {langgraph_api-0.7.94 → langgraph_api-0.7.96}/langgraph_grpc_common/conversion/interrupt.py +0 -0
- {langgraph_api-0.7.94 → langgraph_api-0.7.96}/langgraph_grpc_common/conversion/messages.py +0 -0
- {langgraph_api-0.7.94 → langgraph_api-0.7.96}/langgraph_grpc_common/conversion/orchestrator_response.py +0 -0
- {langgraph_api-0.7.94 → langgraph_api-0.7.96}/langgraph_grpc_common/conversion/runopts.py +0 -0
- {langgraph_api-0.7.94 → langgraph_api-0.7.96}/langgraph_grpc_common/conversion/stream_mode.py +0 -0
- {langgraph_api-0.7.94 → langgraph_api-0.7.96}/langgraph_grpc_common/conversion/struct.py +0 -0
- {langgraph_api-0.7.94 → langgraph_api-0.7.96}/langgraph_grpc_common/conversion/task.py +0 -0
- {langgraph_api-0.7.94 → langgraph_api-0.7.96}/langgraph_grpc_common/conversion/value.py +0 -0
- {langgraph_api-0.7.94 → langgraph_api-0.7.96}/langgraph_grpc_common/proto/__init__.py +0 -0
- {langgraph_api-0.7.94 → langgraph_api-0.7.96}/langgraph_grpc_common/proto/checkpointer_pb2.py +0 -0
- {langgraph_api-0.7.94 → langgraph_api-0.7.96}/langgraph_grpc_common/proto/checkpointer_pb2.pyi +0 -0
- {langgraph_api-0.7.94 → langgraph_api-0.7.96}/langgraph_grpc_common/proto/checkpointer_pb2_grpc.py +0 -0
- {langgraph_api-0.7.94 → langgraph_api-0.7.96}/langgraph_grpc_common/proto/checkpointer_pb2_grpc.pyi +0 -0
- {langgraph_api-0.7.94 → langgraph_api-0.7.96}/langgraph_grpc_common/proto/core_api_pb2_grpc.py +0 -0
- {langgraph_api-0.7.94 → langgraph_api-0.7.96}/langgraph_grpc_common/proto/core_api_pb2_grpc.pyi +0 -0
- {langgraph_api-0.7.94 → langgraph_api-0.7.96}/langgraph_grpc_common/proto/encryption_pb2.py +0 -0
- {langgraph_api-0.7.94 → langgraph_api-0.7.96}/langgraph_grpc_common/proto/encryption_pb2.pyi +0 -0
- {langgraph_api-0.7.94 → langgraph_api-0.7.96}/langgraph_grpc_common/proto/encryption_pb2_grpc.py +0 -0
- {langgraph_api-0.7.94 → langgraph_api-0.7.96}/langgraph_grpc_common/proto/encryption_pb2_grpc.pyi +0 -0
- {langgraph_api-0.7.94 → langgraph_api-0.7.96}/langgraph_grpc_common/proto/engine_api_pb2.py +0 -0
- {langgraph_api-0.7.94 → langgraph_api-0.7.96}/langgraph_grpc_common/proto/engine_api_pb2.pyi +0 -0
- {langgraph_api-0.7.94 → langgraph_api-0.7.96}/langgraph_grpc_common/proto/engine_api_pb2_grpc.py +0 -0
- {langgraph_api-0.7.94 → langgraph_api-0.7.96}/langgraph_grpc_common/proto/engine_api_pb2_grpc.pyi +0 -0
- {langgraph_api-0.7.94 → langgraph_api-0.7.96}/langgraph_grpc_common/proto/engine_common_pb2.py +0 -0
- {langgraph_api-0.7.94 → langgraph_api-0.7.96}/langgraph_grpc_common/proto/engine_common_pb2.pyi +0 -0
- {langgraph_api-0.7.94 → langgraph_api-0.7.96}/langgraph_grpc_common/proto/engine_common_pb2_grpc.py +0 -0
- {langgraph_api-0.7.94 → langgraph_api-0.7.96}/langgraph_grpc_common/proto/engine_common_pb2_grpc.pyi +0 -0
- {langgraph_api-0.7.94 → langgraph_api-0.7.96}/langgraph_grpc_common/proto/enum_cancel_run_action_pb2.py +0 -0
- {langgraph_api-0.7.94 → langgraph_api-0.7.96}/langgraph_grpc_common/proto/enum_cancel_run_action_pb2.pyi +0 -0
- {langgraph_api-0.7.94 → langgraph_api-0.7.96}/langgraph_grpc_common/proto/enum_cancel_run_action_pb2_grpc.py +0 -0
- {langgraph_api-0.7.94 → langgraph_api-0.7.96}/langgraph_grpc_common/proto/enum_cancel_run_action_pb2_grpc.pyi +0 -0
- {langgraph_api-0.7.94 → langgraph_api-0.7.96}/langgraph_grpc_common/proto/enum_control_signal_pb2.py +0 -0
- {langgraph_api-0.7.94 → langgraph_api-0.7.96}/langgraph_grpc_common/proto/enum_control_signal_pb2.pyi +0 -0
- {langgraph_api-0.7.94 → langgraph_api-0.7.96}/langgraph_grpc_common/proto/enum_control_signal_pb2_grpc.py +0 -0
- {langgraph_api-0.7.94 → langgraph_api-0.7.96}/langgraph_grpc_common/proto/enum_control_signal_pb2_grpc.pyi +0 -0
- {langgraph_api-0.7.94 → langgraph_api-0.7.96}/langgraph_grpc_common/proto/enum_cron_on_run_completed_pb2.py +0 -0
- {langgraph_api-0.7.94 → langgraph_api-0.7.96}/langgraph_grpc_common/proto/enum_cron_on_run_completed_pb2.pyi +0 -0
- {langgraph_api-0.7.94 → langgraph_api-0.7.96}/langgraph_grpc_common/proto/enum_cron_on_run_completed_pb2_grpc.py +0 -0
- {langgraph_api-0.7.94 → langgraph_api-0.7.96}/langgraph_grpc_common/proto/enum_cron_on_run_completed_pb2_grpc.pyi +0 -0
- {langgraph_api-0.7.94 → langgraph_api-0.7.96}/langgraph_grpc_common/proto/enum_durability_pb2.py +0 -0
- {langgraph_api-0.7.94 → langgraph_api-0.7.96}/langgraph_grpc_common/proto/enum_durability_pb2.pyi +0 -0
- {langgraph_api-0.7.94 → langgraph_api-0.7.96}/langgraph_grpc_common/proto/enum_durability_pb2_grpc.py +0 -0
- {langgraph_api-0.7.94 → langgraph_api-0.7.96}/langgraph_grpc_common/proto/enum_durability_pb2_grpc.pyi +0 -0
- {langgraph_api-0.7.94 → langgraph_api-0.7.96}/langgraph_grpc_common/proto/enum_multitask_strategy_pb2.py +0 -0
- {langgraph_api-0.7.94 → langgraph_api-0.7.96}/langgraph_grpc_common/proto/enum_multitask_strategy_pb2.pyi +0 -0
- {langgraph_api-0.7.94 → langgraph_api-0.7.96}/langgraph_grpc_common/proto/enum_multitask_strategy_pb2_grpc.py +0 -0
- {langgraph_api-0.7.94 → langgraph_api-0.7.96}/langgraph_grpc_common/proto/enum_multitask_strategy_pb2_grpc.pyi +0 -0
- {langgraph_api-0.7.94 → langgraph_api-0.7.96}/langgraph_grpc_common/proto/enum_run_status_pb2.py +0 -0
- {langgraph_api-0.7.94 → langgraph_api-0.7.96}/langgraph_grpc_common/proto/enum_run_status_pb2.pyi +0 -0
- {langgraph_api-0.7.94 → langgraph_api-0.7.96}/langgraph_grpc_common/proto/enum_run_status_pb2_grpc.py +0 -0
- {langgraph_api-0.7.94 → langgraph_api-0.7.96}/langgraph_grpc_common/proto/enum_run_status_pb2_grpc.pyi +0 -0
- {langgraph_api-0.7.94 → langgraph_api-0.7.96}/langgraph_grpc_common/proto/enum_store_operation_entry_type_pb2.py +0 -0
- {langgraph_api-0.7.94 → langgraph_api-0.7.96}/langgraph_grpc_common/proto/enum_store_operation_entry_type_pb2.pyi +0 -0
- {langgraph_api-0.7.94 → langgraph_api-0.7.96}/langgraph_grpc_common/proto/enum_store_operation_entry_type_pb2_grpc.py +0 -0
- {langgraph_api-0.7.94 → langgraph_api-0.7.96}/langgraph_grpc_common/proto/enum_store_operation_entry_type_pb2_grpc.pyi +0 -0
- {langgraph_api-0.7.94 → langgraph_api-0.7.96}/langgraph_grpc_common/proto/enum_stream_mode_pb2.py +0 -0
- {langgraph_api-0.7.94 → langgraph_api-0.7.96}/langgraph_grpc_common/proto/enum_stream_mode_pb2.pyi +0 -0
- {langgraph_api-0.7.94 → langgraph_api-0.7.96}/langgraph_grpc_common/proto/enum_stream_mode_pb2_grpc.py +0 -0
- {langgraph_api-0.7.94 → langgraph_api-0.7.96}/langgraph_grpc_common/proto/enum_stream_mode_pb2_grpc.pyi +0 -0
- {langgraph_api-0.7.94 → langgraph_api-0.7.96}/langgraph_grpc_common/proto/enum_thread_status_pb2.py +0 -0
- {langgraph_api-0.7.94 → langgraph_api-0.7.96}/langgraph_grpc_common/proto/enum_thread_status_pb2.pyi +0 -0
- {langgraph_api-0.7.94 → langgraph_api-0.7.96}/langgraph_grpc_common/proto/enum_thread_status_pb2_grpc.py +0 -0
- {langgraph_api-0.7.94 → langgraph_api-0.7.96}/langgraph_grpc_common/proto/enum_thread_status_pb2_grpc.pyi +0 -0
- {langgraph_api-0.7.94 → langgraph_api-0.7.96}/langgraph_grpc_common/proto/enum_thread_stream_mode_pb2.py +0 -0
- {langgraph_api-0.7.94 → langgraph_api-0.7.96}/langgraph_grpc_common/proto/enum_thread_stream_mode_pb2.pyi +0 -0
- {langgraph_api-0.7.94 → langgraph_api-0.7.96}/langgraph_grpc_common/proto/enum_thread_stream_mode_pb2_grpc.py +0 -0
- {langgraph_api-0.7.94 → langgraph_api-0.7.96}/langgraph_grpc_common/proto/enum_thread_stream_mode_pb2_grpc.pyi +0 -0
- {langgraph_api-0.7.94 → langgraph_api-0.7.96}/langgraph_grpc_common/proto/errors_pb2.py +0 -0
- {langgraph_api-0.7.94 → langgraph_api-0.7.96}/langgraph_grpc_common/proto/errors_pb2.pyi +0 -0
- {langgraph_api-0.7.94 → langgraph_api-0.7.96}/langgraph_grpc_common/proto/errors_pb2_grpc.py +0 -0
- {langgraph_api-0.7.94 → langgraph_api-0.7.96}/langgraph_grpc_common/proto/errors_pb2_grpc.pyi +0 -0
- {langgraph_api-0.7.94 → langgraph_api-0.7.96}/langgraph_grpc_common/proto/executor_api_pb2.py +0 -0
- {langgraph_api-0.7.94 → langgraph_api-0.7.96}/langgraph_grpc_common/proto/executor_api_pb2.pyi +0 -0
- {langgraph_api-0.7.94 → langgraph_api-0.7.96}/langgraph_grpc_common/proto/executor_api_pb2_grpc.py +0 -0
- {langgraph_api-0.7.94 → langgraph_api-0.7.96}/langgraph_grpc_common/proto/executor_api_pb2_grpc.pyi +0 -0
- {langgraph_api-0.7.94 → langgraph_api-0.7.96}/langgraph_grpc_common/sanitize.py +0 -0
- {langgraph_api-0.7.94 → langgraph_api-0.7.96}/langgraph_grpc_common/serde.py +0 -0
- {langgraph_api-0.7.94 → langgraph_api-0.7.96}/langgraph_license/__init__.py +0 -0
- {langgraph_api-0.7.94 → langgraph_api-0.7.96}/langgraph_license/validation.py +0 -0
- {langgraph_api-0.7.94 → langgraph_api-0.7.96}/langgraph_runtime/__init__.py +0 -0
- {langgraph_api-0.7.94 → langgraph_api-0.7.96}/langgraph_runtime/checkpoint.py +0 -0
- {langgraph_api-0.7.94 → langgraph_api-0.7.96}/langgraph_runtime/database.py +0 -0
- {langgraph_api-0.7.94 → langgraph_api-0.7.96}/langgraph_runtime/lifespan.py +0 -0
- {langgraph_api-0.7.94 → langgraph_api-0.7.96}/langgraph_runtime/metrics.py +0 -0
- {langgraph_api-0.7.94 → langgraph_api-0.7.96}/langgraph_runtime/ops.py +0 -0
- {langgraph_api-0.7.94 → langgraph_api-0.7.96}/langgraph_runtime/queue.py +0 -0
- {langgraph_api-0.7.94 → langgraph_api-0.7.96}/langgraph_runtime/retry.py +0 -0
- {langgraph_api-0.7.94 → langgraph_api-0.7.96}/langgraph_runtime/routes.py +0 -0
- {langgraph_api-0.7.94 → langgraph_api-0.7.96}/langgraph_runtime/store.py +0 -0
- {langgraph_api-0.7.94 → langgraph_api-0.7.96}/logging.json +0 -0
- {langgraph_api-0.7.94 → langgraph_api-0.7.96}/openapi.json +0 -0
- {langgraph_api-0.7.94 → langgraph_api-0.7.96}/pyproject.toml +0 -0
- {langgraph_api-0.7.94 → langgraph_api-0.7.96}/scripts/build_wheel.py +0 -0
- {langgraph_api-0.7.94 → langgraph_api-0.7.96}/scripts/create_license.py +0 -0
- {langgraph_api-0.7.94 → langgraph_api-0.7.96}/scripts/run_a2a_tck.py +0 -0
- {langgraph_api-0.7.94 → langgraph_api-0.7.96}/uv.lock +0 -0
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
.PHONY: build release lint format test test_watch start start-inmem start-inmem-license-oss start start-js-server build-go-server start-go-server stop-go-server check-version check-base-imports test-a2a-tck test-a2a-tck-mandatory start-test-a2a-tck start-test-a2a-tck-mandatory start-test-a2a-tck-watch test-mcp-conformance start-test-mcp-conformance list-mcp-scenarios
|
|
2
2
|
|
|
3
3
|
# Environment variables
|
|
4
|
-
LANGSERVE_GRAPHS_ALL = '{"agent": {"path": "./tests/graphs/agent.py:graph", "description": "agent"}, "assistant_id_runtime": "./tests/graphs/assistant_id_runtime.py:graph", "custom_lifespan": "./tests/graphs/my_router.py:graph", "single_node": "./tests/graphs/single_node.py:graph", "benchmark": "./tests/graphs/benchmark.py:graph", "config_graph": "./tests/graphs/config_graph.py:graph", "other": "./tests/graphs/other.py:make_graph", "weather": "./tests/graphs/weather.py:mk_weather_graph", "searchy": "./tests/graphs/searchy.py:graph", "agent_simple": "./tests/graphs/agent_simple.py:graph", "simple_runtime": "./tests/graphs/simple_runtime.py:graph", "agent_interrupt": "./tests/graphs/agent_interrupt.py:graph", "message_type_test": "./tests/graphs/message_type_test.py:graph", "remote_subgraph_parent": "./tests/graphs/remote_subgraph_parent.py:graph", "simple_remote": "./tests/graphs/simple_remote.py:graph", "nested_subgraphs": "./tests/graphs/nested_subgraphs.py:graph", "functional_fibonacci": "./tests/graphs/functional_fibonacci.py:fibonacci", "state_graph_fibonacci": "./tests/graphs/state_graph_fibonacci.py:fibonacci", "max_concurrency_graph": "./tests/graphs/max_concurrency_graph.py:graph", "unserializable_subgraph": "./tests/graphs/unserializable_subgraph.py:graph", "agent_interrupt_text": "./tests/graphs/agent_interrupt_text.py:graph", "agent_echo_stream": "./tests/graphs/agent_echo_stream.py:graph", "runtime_graph": "./tests/graphs/runtime_graph.py:graph", "tool_call_chunk_stream": "./tests/graphs/tool_call_chunk_stream.py:graph"}'
|
|
4
|
+
LANGSERVE_GRAPHS_ALL = '{"agent": {"path": "./tests/graphs/agent.py:graph", "description": "agent"}, "assistant_id_runtime": "./tests/graphs/assistant_id_runtime.py:graph", "custom_lifespan": "./tests/graphs/my_router.py:graph", "single_node": "./tests/graphs/single_node.py:graph", "benchmark": "./tests/graphs/benchmark.py:graph", "config_graph": "./tests/graphs/config_graph.py:graph", "other": "./tests/graphs/other.py:make_graph", "weather": "./tests/graphs/weather.py:mk_weather_graph", "searchy": "./tests/graphs/searchy.py:graph", "agent_simple": "./tests/graphs/agent_simple.py:graph", "simple_runtime": "./tests/graphs/simple_runtime.py:graph", "agent_interrupt": "./tests/graphs/agent_interrupt.py:graph", "message_type_test": "./tests/graphs/message_type_test.py:graph", "remote_subgraph_parent": "./tests/graphs/remote_subgraph_parent.py:graph", "simple_remote": "./tests/graphs/simple_remote.py:graph", "nested_subgraphs": "./tests/graphs/nested_subgraphs.py:graph", "functional_fibonacci": "./tests/graphs/functional_fibonacci.py:fibonacci", "state_graph_fibonacci": "./tests/graphs/state_graph_fibonacci.py:fibonacci", "max_concurrency_graph": "./tests/graphs/max_concurrency_graph.py:graph", "unserializable_subgraph": "./tests/graphs/unserializable_subgraph.py:graph", "agent_interrupt_text": "./tests/graphs/agent_interrupt_text.py:graph", "agent_echo_stream": "./tests/graphs/agent_echo_stream.py:graph", "runtime_graph": "./tests/graphs/runtime_graph.py:graph", "tool_call_chunk_stream": "./tests/graphs/tool_call_chunk_stream.py:graph", "ui_tool_call_stream": "./tests/graphs/ui_tool_call_stream.py:graph"}'
|
|
5
5
|
LANGSERVE_GRAPHS_AUTH = '{"agent": {"path": "./tests/graphs/agent.py:graph", "description": "agent"}, "assistant_id_runtime": "./tests/graphs/assistant_id_runtime.py:graph", "config_graph": "./tests/graphs/config_graph.py:graph", "other": "./tests/graphs/other.py:make_graph", "weather": "./tests/graphs/weather.py:mk_weather_graph", "searchy": "./tests/graphs/searchy.py:graph", "agent_simple": "./tests/graphs/agent_simple.py:graph", "simple_runtime": "./tests/graphs/simple_runtime.py:graph", "functional_fibonacci": "./tests/graphs/functional_fibonacci.py:fibonacci", "state_graph_fibonacci": "./tests/graphs/state_graph_fibonacci.py:fibonacci", "runtime_graph": "./tests/graphs/runtime_graph.py:graph"}'
|
|
6
6
|
|
|
7
7
|
# Go server management
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
# Benchmark commands
|
|
2
2
|
|
|
3
3
|
# Capacity benchmark
|
|
4
|
-
CLUSTER_NAME ?= dr-
|
|
4
|
+
CLUSTER_NAME ?= dr-1-node
|
|
5
5
|
# WORKLOAD_NAMES supports comma-separated list (e.g., "parallel-small,parallel-tiny")
|
|
6
6
|
# Falls back to WORKLOAD_NAME for backwards compatibility
|
|
7
7
|
WORKLOAD_NAMES ?= $(WORKLOAD_NAME)
|
|
@@ -0,0 +1,152 @@
|
|
|
1
|
+
# Benchmarking
|
|
2
|
+
|
|
3
|
+
This directory contains k6 + Python/Node benchmark tooling for LangGraph API.
|
|
4
|
+
|
|
5
|
+
## Available Commands
|
|
6
|
+
|
|
7
|
+
- `make benchmark-ramp` - Ramps up to a set number of concurrent virtual users, holds plateau load, then ramps down.
|
|
8
|
+
- **Environment variables:**
|
|
9
|
+
- `LOAD_SIZE`, `LEVELS`, `PLATEAU_DURATION`
|
|
10
|
+
- `P95_RUN_DURATION`, `AVERAGE_RUN_DURATION`
|
|
11
|
+
- **Example:**
|
|
12
|
+
- `BENCHMARK_PROFILE=streaming-long BENCHMARK_TYPE=stream_write LOAD_SIZE=300 LEVELS=3 make benchmark-ramp`
|
|
13
|
+
|
|
14
|
+
- `make benchmark-staircase` - Runs stepwise capacity testing with SLO checks and a final staircase summary.
|
|
15
|
+
- **Environment variables:**
|
|
16
|
+
- `K6_EXECUTOR`, `START_LOAD`, `STEP_SIZE`, `NUM_STEPS`, `PLATEAU_DURATION`
|
|
17
|
+
- `MAX_VUS`, `MAX_VUS_MULTIPLIER`, `PRE_ALLOCATED_VUS`
|
|
18
|
+
- `WARMUP_ITERS`, `COOLDOWN_DURATION`
|
|
19
|
+
- `MIN_SUCCESS_RATE`, `MAX_P50_DURATION_MS`, `MAX_P95_DURATION_MS`, `ABORT_ERROR_RATE`
|
|
20
|
+
- **Example:**
|
|
21
|
+
- `BENCHMARK_PROFILE=parallel-small START_LOAD=30 STEP_SIZE=15 NUM_STEPS=10 make benchmark-staircase`
|
|
22
|
+
|
|
23
|
+
- `make benchmark-capacity` - Runs binary-search capacity tests and writes `capacity_summary.json`.
|
|
24
|
+
- **Environment variables:**
|
|
25
|
+
- `CLUSTER_NAME`
|
|
26
|
+
- `WORKLOAD_NAMES` (comma-separated) or `WORKLOAD_NAME`
|
|
27
|
+
- **Support note:** `BENCHMARK_TYPE` is supported but usually determined by profile/workload defaults.
|
|
28
|
+
- **Example:**
|
|
29
|
+
- `CLUSTER_NAME=dr-1-node WORKLOAD_NAMES=parallel-small,parallel-medium make benchmark-capacity`
|
|
30
|
+
|
|
31
|
+
- `make benchmark-mixed` - Runs quick and long workloads concurrently to measure contention/fairness.
|
|
32
|
+
- **Environment variables:**
|
|
33
|
+
- `SLOWEST_N`
|
|
34
|
+
- Quick workload knobs: `QUICK_VUS`, `QUICK_ITERATIONS`, `QUICK_STEPS`, `QUICK_DATA_SIZE`, `QUICK_MAX_WAIT_SECONDS`, `QUICK_POLL_INTERVAL`
|
|
35
|
+
- Long workload knobs: `LONG_VUS`, `LONG_ITERATIONS`, `LONG_STEPS`, `LONG_DELAY`, `LONG_DATA_SIZE`, `LONG_MAX_WAIT_SECONDS`, `LONG_POLL_INTERVAL`
|
|
36
|
+
- **Support note:** Does **not** support benchmark universal/profile/context knobs (`BENCHMARK_TYPE`, `BENCHMARK_PROFILE`, `RUN_MODE`, `STREAM_RESUMABLE`, or context overrides). Only mixed-workload vars + generic `BASE_URL`/`LANGSMITH_API_KEY` apply.
|
|
37
|
+
- **Example:**
|
|
38
|
+
- `BASE_URL=http://localhost:9123 QUICK_VUS=300 LONG_VUS=8 LONG_STEPS=60 make benchmark-mixed`
|
|
39
|
+
|
|
40
|
+
- `make benchmark-charts` - Builds charts from the latest `raw_data_*.json` ramp output. Only works for ramp.
|
|
41
|
+
- `make benchmark-clean` - Deletes local benchmark result/chart artifacts.
|
|
42
|
+
- `make benchmark-reset` - Cleans benchmark server state via `clean-cli.js`.
|
|
43
|
+
- `make benchmark-new-revision` - Triggers a new benchmark deployment revision.
|
|
44
|
+
|
|
45
|
+
## Benchmark runner types (`BENCHMARK_TYPE`)
|
|
46
|
+
|
|
47
|
+
The runner contains the actual logic each virtual user will execute during the benchmark and steps to validate the logic worked correctly. Options are:
|
|
48
|
+
|
|
49
|
+
- `wait_write` - Uses `/runs/wait` and validates completion plus expected counter progression.
|
|
50
|
+
- `stream_write` - Uses `/runs/stream` with `stream_mode=['values','messages']` and validates streamed events.
|
|
51
|
+
- `assistants` - Benchmarks assistant CRUD/list style API behavior.
|
|
52
|
+
- `threads` - Benchmarks thread CRUD/list style API behavior.
|
|
53
|
+
- `enqueued_runs_order` - Enqueues multiple runs and validates completion ordering behavior.
|
|
54
|
+
- `cancel_first_second_completes` - Starts two runs, cancels one, and validates cancellation semantics.
|
|
55
|
+
- `thread_runs_metadata_search` - Creates a run and validates filtering/search by run metadata.
|
|
56
|
+
- `threads_search_metadata` - Validates thread metadata search/filter behavior.
|
|
57
|
+
- `meta_workload` (randomly delegates to one of the others)
|
|
58
|
+
|
|
59
|
+
## Profiles (`BENCHMARK_PROFILE`)
|
|
60
|
+
|
|
61
|
+
Profiles are quick ways to configure the benchmark graph for any run depending on the use case.
|
|
62
|
+
|
|
63
|
+
- `default` - Baseline single-step stateless profile with small checkpoint writes.
|
|
64
|
+
- `streaming-long` - Long-running stateful streaming profile with 2KB regular chunks and occasional 2MB spikes.
|
|
65
|
+
- `stateless-parallel-small` - Stateless high-fanout profile with small checkpoint payloads.
|
|
66
|
+
- `stateless-parallel-medium` - Stateless high-fanout profile with medium checkpoint payloads.
|
|
67
|
+
- `parallel-small` - Stateful high-fanout profile with small checkpoint payloads.
|
|
68
|
+
- `parallel-medium` - Stateful high-fanout profile with medium checkpoint payloads.
|
|
69
|
+
|
|
70
|
+
Each profile defines:
|
|
71
|
+
|
|
72
|
+
- `context` (delay/steps/checkpoint/streaming/burst knobs)
|
|
73
|
+
- `capacity` defaults (`runMode`, `rampEndBase`, `runExecutionTimeoutSeconds`)
|
|
74
|
+
- `resumable` default (can be overridden by `STREAM_RESUMABLE`)
|
|
75
|
+
|
|
76
|
+
## Core environment knobs
|
|
77
|
+
|
|
78
|
+
Common:
|
|
79
|
+
|
|
80
|
+
- `BASE_URL` - Target LangGraph API endpoint for benchmark traffic.
|
|
81
|
+
- `LANGSMITH_API_KEY` - API key used for authenticated benchmark deployments.
|
|
82
|
+
- `BENCHMARK_TYPE` - Selects which runner implementation to execute.
|
|
83
|
+
- `BENCHMARK_PROFILE` - Selects a named profile from `benchmark_profiles.ts`.
|
|
84
|
+
- `RUN_MODE` (`stateless`/`stateful`) - Controls whether runs execute directly or via created threads.
|
|
85
|
+
- `STREAM_RESUMABLE` - Overrides profile default for resumable stream persistence.
|
|
86
|
+
|
|
87
|
+
Context overrides (merged on top of profile):
|
|
88
|
+
|
|
89
|
+
- `DELAY` - Per-node sleep delay in seconds.
|
|
90
|
+
- `DELAY_JITTER_RATIO` - Randomized delay spread ratio around `DELAY` (for desynchronizing requests).
|
|
91
|
+
- `EXPAND` - Fanout width (number of parallel branches at start).
|
|
92
|
+
- `STEPS` - Number of graph turns/iterations to execute.
|
|
93
|
+
- `CHECKPOINT_SIZE` - Bytes written per checkpoint operation.
|
|
94
|
+
- `LLM_ENABLED` - Enables fake LLM streaming inside the benchmark graph.
|
|
95
|
+
- `STREAM_SIZE` - Normal total streamed payload size (bytes).
|
|
96
|
+
- `CHUNK_SIZE` - Stream chunk size (bytes) when emitting payload.
|
|
97
|
+
- `BURST_MODE` - Enables probabilistic burst streaming behavior.
|
|
98
|
+
- `BURST_PROBABILITY` - Probability that a run uses burst payload size.
|
|
99
|
+
- `BURST_SIZE` - Burst payload size (bytes) when burst mode triggers.
|
|
100
|
+
|
|
101
|
+
## Common commands
|
|
102
|
+
|
|
103
|
+
```bash
|
|
104
|
+
# Ramp benchmark (default profile + wait_write unless overridden)
|
|
105
|
+
make benchmark-ramp
|
|
106
|
+
|
|
107
|
+
# Ramp with profile + stream runner
|
|
108
|
+
BENCHMARK_PROFILE=streaming-long BENCHMARK_TYPE=stream_write make benchmark-ramp
|
|
109
|
+
|
|
110
|
+
# Staircase benchmark
|
|
111
|
+
make benchmark-staircase
|
|
112
|
+
|
|
113
|
+
# Capacity benchmark (single workload)
|
|
114
|
+
CLUSTER_NAME=dr-1-node WORKLOAD_NAME=parallel-small make benchmark-capacity
|
|
115
|
+
|
|
116
|
+
# Capacity benchmark (multiple workloads)
|
|
117
|
+
CLUSTER_NAME=dr-1-node WORKLOAD_NAMES=parallel-small,parallel-medium make benchmark-capacity
|
|
118
|
+
|
|
119
|
+
# Mixed workload benchmark
|
|
120
|
+
make benchmark-mixed
|
|
121
|
+
|
|
122
|
+
# Build charts from latest ramp raw_data file
|
|
123
|
+
make benchmark-charts
|
|
124
|
+
|
|
125
|
+
# Remove local benchmark artifacts
|
|
126
|
+
make benchmark-clean
|
|
127
|
+
```
|
|
128
|
+
|
|
129
|
+
## Outputs
|
|
130
|
+
|
|
131
|
+
- Ramp:
|
|
132
|
+
- `raw_data_<timestamp>.json`
|
|
133
|
+
- `results_<timestamp>.json`
|
|
134
|
+
- `summary_<timestamp>.json`
|
|
135
|
+
- `*_chart_*.png` (when chart generation is run)
|
|
136
|
+
- Staircase:
|
|
137
|
+
- `staircase_summary.json`
|
|
138
|
+
- Capacity:
|
|
139
|
+
- `capacity_summary.json`
|
|
140
|
+
- Mixed:
|
|
141
|
+
- `mixed_workload_*.json`
|
|
142
|
+
|
|
143
|
+
## CI workflows
|
|
144
|
+
|
|
145
|
+
- Daily ramp benchmark: `.github/workflows/benchmark.yml`
|
|
146
|
+
- Capacity benchmark matrix: `.github/workflows/benchmark-capacity.yml`
|
|
147
|
+
- Mixed benchmark matrix: `.github/workflows/benchmark-mixed.yml`
|
|
148
|
+
|
|
149
|
+
## References
|
|
150
|
+
|
|
151
|
+
- [k6 docs](https://k6.io/docs/)
|
|
152
|
+
- [k6 JavaScript API](https://k6.io/docs/javascript-api/)
|
|
@@ -23,7 +23,7 @@ export class Assistant extends BenchmarkRunner {
|
|
|
23
23
|
static run(
|
|
24
24
|
baseUrl: string,
|
|
25
25
|
requestParams: Record<string, unknown>,
|
|
26
|
-
_benchmarkGraphOptions
|
|
26
|
+
_benchmarkGraphOptions: BenchmarkGraphOptions
|
|
27
27
|
): BenchmarkResult<AssistantData> {
|
|
28
28
|
const graph_id = DEFAULT_GRAPH_ID;
|
|
29
29
|
let metadata: Record<string, string> = {
|
|
@@ -73,7 +73,7 @@ export class Assistant extends BenchmarkRunner {
|
|
|
73
73
|
static validate(
|
|
74
74
|
result: BenchmarkResult<AssistantData>,
|
|
75
75
|
errorMetrics: ErrorMetrics,
|
|
76
|
-
_benchmarkGraphOptions
|
|
76
|
+
_benchmarkGraphOptions: BenchmarkGraphOptions
|
|
77
77
|
): boolean {
|
|
78
78
|
const d = result.data;
|
|
79
79
|
if (!d) {
|
{langgraph_api-0.7.94 → langgraph_api-0.7.96}/benchmark/benchmark-runners/benchmark-runner.ts
RENAMED
|
@@ -16,7 +16,7 @@ export abstract class BenchmarkRunner {
|
|
|
16
16
|
static run(
|
|
17
17
|
_baseUrl: string,
|
|
18
18
|
_requestParams: Record<string, unknown>,
|
|
19
|
-
_benchmarkGraphOptions
|
|
19
|
+
_benchmarkGraphOptions: BenchmarkGraphOptions
|
|
20
20
|
): BenchmarkResult<unknown> {
|
|
21
21
|
throw new Error('Not implemented');
|
|
22
22
|
}
|
|
@@ -28,7 +28,7 @@ export abstract class BenchmarkRunner {
|
|
|
28
28
|
static validate(
|
|
29
29
|
_result: BenchmarkResult<unknown>,
|
|
30
30
|
_errorMetrics: ErrorMetrics,
|
|
31
|
-
_benchmarkGraphOptions
|
|
31
|
+
_benchmarkGraphOptions: BenchmarkGraphOptions
|
|
32
32
|
): boolean {
|
|
33
33
|
throw new Error('Not implemented');
|
|
34
34
|
}
|
|
@@ -0,0 +1,263 @@
|
|
|
1
|
+
export interface BenchmarkContext {
|
|
2
|
+
delay: number;
|
|
3
|
+
delay_jitter_ratio: number;
|
|
4
|
+
expand: number;
|
|
5
|
+
steps: number;
|
|
6
|
+
checkpoint_size: number;
|
|
7
|
+
llm_enabled: boolean;
|
|
8
|
+
stream_size: number;
|
|
9
|
+
chunk_size: number;
|
|
10
|
+
burst_mode: boolean;
|
|
11
|
+
burst_probability: number;
|
|
12
|
+
burst_size: number;
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
export interface BenchmarkProfileEnv {
|
|
16
|
+
BENCHMARK_PROFILE?: string;
|
|
17
|
+
BENCHMARK_TYPE?: string;
|
|
18
|
+
RUN_MODE?: string;
|
|
19
|
+
STREAM_RESUMABLE?: string;
|
|
20
|
+
DELAY?: string;
|
|
21
|
+
DELAY_JITTER_RATIO?: string;
|
|
22
|
+
EXPAND?: string;
|
|
23
|
+
STEPS?: string;
|
|
24
|
+
CHECKPOINT_SIZE?: string;
|
|
25
|
+
LLM_ENABLED?: string;
|
|
26
|
+
STREAM_SIZE?: string;
|
|
27
|
+
CHUNK_SIZE?: string;
|
|
28
|
+
BURST_MODE?: string;
|
|
29
|
+
BURST_PROBABILITY?: string;
|
|
30
|
+
BURST_SIZE?: string;
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
export interface CapacityProfileSettings {
|
|
34
|
+
runMode: 'stateless' | 'stateful';
|
|
35
|
+
rampEndBase: number;
|
|
36
|
+
runExecutionTimeoutSeconds: number;
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
export interface BenchmarkProfile {
|
|
40
|
+
context: BenchmarkContext;
|
|
41
|
+
resumable: boolean;
|
|
42
|
+
capacity: CapacityProfileSettings;
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
export interface ParsedBenchmarkProfile {
|
|
46
|
+
name: string;
|
|
47
|
+
benchmarkType: string;
|
|
48
|
+
runMode: 'stateless' | 'stateful';
|
|
49
|
+
resumable: boolean;
|
|
50
|
+
context: BenchmarkContext;
|
|
51
|
+
capacity: CapacityProfileSettings;
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
const DEFAULT_PROFILE_NAME = 'default';
|
|
55
|
+
|
|
56
|
+
export const BENCHMARK_PROFILES: Record<string, BenchmarkProfile> = {
|
|
57
|
+
default: {
|
|
58
|
+
resumable: false,
|
|
59
|
+
context: {
|
|
60
|
+
delay: 0,
|
|
61
|
+
delay_jitter_ratio: 0.2,
|
|
62
|
+
expand: 1,
|
|
63
|
+
steps: 1,
|
|
64
|
+
checkpoint_size: 1024,
|
|
65
|
+
llm_enabled: false,
|
|
66
|
+
stream_size: 0,
|
|
67
|
+
chunk_size: 1,
|
|
68
|
+
burst_mode: false,
|
|
69
|
+
burst_probability: 0,
|
|
70
|
+
burst_size: 0,
|
|
71
|
+
},
|
|
72
|
+
capacity: {
|
|
73
|
+
runMode: 'stateless',
|
|
74
|
+
rampEndBase: 200,
|
|
75
|
+
runExecutionTimeoutSeconds: 60,
|
|
76
|
+
},
|
|
77
|
+
},
|
|
78
|
+
'streaming-long': {
|
|
79
|
+
resumable: true,
|
|
80
|
+
context: {
|
|
81
|
+
delay: 0.5,
|
|
82
|
+
delay_jitter_ratio: 0.2,
|
|
83
|
+
expand: 1,
|
|
84
|
+
steps: 300,
|
|
85
|
+
checkpoint_size: 0,
|
|
86
|
+
llm_enabled: true,
|
|
87
|
+
stream_size: 2 * 1024,
|
|
88
|
+
chunk_size: 2 * 1024,
|
|
89
|
+
burst_mode: true,
|
|
90
|
+
burst_probability: 0.05,
|
|
91
|
+
burst_size: 2 * 1024 * 1024,
|
|
92
|
+
},
|
|
93
|
+
capacity: {
|
|
94
|
+
runMode: 'stateful',
|
|
95
|
+
rampEndBase: 20,
|
|
96
|
+
runExecutionTimeoutSeconds: 1000,
|
|
97
|
+
},
|
|
98
|
+
},
|
|
99
|
+
'stateless-parallel-small': {
|
|
100
|
+
resumable: false,
|
|
101
|
+
context: {
|
|
102
|
+
delay: 0,
|
|
103
|
+
delay_jitter_ratio: 0.2,
|
|
104
|
+
expand: 100,
|
|
105
|
+
steps: 1,
|
|
106
|
+
checkpoint_size: 1_000,
|
|
107
|
+
llm_enabled: false,
|
|
108
|
+
stream_size: 0,
|
|
109
|
+
chunk_size: 1,
|
|
110
|
+
burst_mode: false,
|
|
111
|
+
burst_probability: 0,
|
|
112
|
+
burst_size: 0,
|
|
113
|
+
},
|
|
114
|
+
capacity: {
|
|
115
|
+
runMode: 'stateless',
|
|
116
|
+
rampEndBase: 200,
|
|
117
|
+
runExecutionTimeoutSeconds: 60,
|
|
118
|
+
},
|
|
119
|
+
},
|
|
120
|
+
'stateless-parallel-medium': {
|
|
121
|
+
resumable: false,
|
|
122
|
+
context: {
|
|
123
|
+
delay: 0,
|
|
124
|
+
delay_jitter_ratio: 0.2,
|
|
125
|
+
expand: 100,
|
|
126
|
+
steps: 1,
|
|
127
|
+
checkpoint_size: 10_000,
|
|
128
|
+
llm_enabled: false,
|
|
129
|
+
stream_size: 0,
|
|
130
|
+
chunk_size: 1,
|
|
131
|
+
burst_mode: false,
|
|
132
|
+
burst_probability: 0,
|
|
133
|
+
burst_size: 0,
|
|
134
|
+
},
|
|
135
|
+
capacity: {
|
|
136
|
+
runMode: 'stateless',
|
|
137
|
+
rampEndBase: 200,
|
|
138
|
+
runExecutionTimeoutSeconds: 60,
|
|
139
|
+
},
|
|
140
|
+
},
|
|
141
|
+
'parallel-small': {
|
|
142
|
+
resumable: false,
|
|
143
|
+
context: {
|
|
144
|
+
delay: 0,
|
|
145
|
+
delay_jitter_ratio: 0.2,
|
|
146
|
+
expand: 100,
|
|
147
|
+
steps: 1,
|
|
148
|
+
checkpoint_size: 1_000,
|
|
149
|
+
llm_enabled: false,
|
|
150
|
+
stream_size: 0,
|
|
151
|
+
chunk_size: 1,
|
|
152
|
+
burst_mode: false,
|
|
153
|
+
burst_probability: 0,
|
|
154
|
+
burst_size: 0,
|
|
155
|
+
},
|
|
156
|
+
capacity: {
|
|
157
|
+
runMode: 'stateful',
|
|
158
|
+
rampEndBase: 200,
|
|
159
|
+
runExecutionTimeoutSeconds: 60,
|
|
160
|
+
},
|
|
161
|
+
},
|
|
162
|
+
'parallel-medium': {
|
|
163
|
+
resumable: false,
|
|
164
|
+
context: {
|
|
165
|
+
delay: 0,
|
|
166
|
+
delay_jitter_ratio: 0.2,
|
|
167
|
+
expand: 100,
|
|
168
|
+
steps: 1,
|
|
169
|
+
checkpoint_size: 10_000,
|
|
170
|
+
llm_enabled: false,
|
|
171
|
+
stream_size: 0,
|
|
172
|
+
chunk_size: 1,
|
|
173
|
+
burst_mode: false,
|
|
174
|
+
burst_probability: 0,
|
|
175
|
+
burst_size: 0,
|
|
176
|
+
},
|
|
177
|
+
capacity: {
|
|
178
|
+
runMode: 'stateful',
|
|
179
|
+
rampEndBase: 200,
|
|
180
|
+
runExecutionTimeoutSeconds: 60,
|
|
181
|
+
},
|
|
182
|
+
},
|
|
183
|
+
};
|
|
184
|
+
|
|
185
|
+
export function getBenchmarkProfile(profileName?: string): { name: string; profile: BenchmarkProfile } {
|
|
186
|
+
const resolvedName = profileName || DEFAULT_PROFILE_NAME;
|
|
187
|
+
const profile = BENCHMARK_PROFILES[resolvedName];
|
|
188
|
+
if (!profile) {
|
|
189
|
+
throw new Error(
|
|
190
|
+
`Unknown BENCHMARK_PROFILE: "${profileName}". Must be one of: ${Object.keys(BENCHMARK_PROFILES).join(', ')}`
|
|
191
|
+
);
|
|
192
|
+
}
|
|
193
|
+
return { name: resolvedName, profile };
|
|
194
|
+
}
|
|
195
|
+
|
|
196
|
+
export function resolveBenchmarkContext(
|
|
197
|
+
profileName: string | undefined,
|
|
198
|
+
overrides: Partial<BenchmarkContext> = {}
|
|
199
|
+
): BenchmarkContext {
|
|
200
|
+
const { profile } = getBenchmarkProfile(profileName);
|
|
201
|
+
return {
|
|
202
|
+
...profile.context,
|
|
203
|
+
...overrides,
|
|
204
|
+
};
|
|
205
|
+
}
|
|
206
|
+
|
|
207
|
+
/**
|
|
208
|
+
* There are two possible counts for expected events: normal and burst.
|
|
209
|
+
* ratio * (expected_steps * expand) + 2 will be the min, but could be larger if we hit bursts.
|
|
210
|
+
*/
|
|
211
|
+
export function getExpectedEvents(context: BenchmarkContext): number {
|
|
212
|
+
return (3 + context.stream_size / context.chunk_size) * (context.steps * context.expand) + 2;
|
|
213
|
+
}
|
|
214
|
+
|
|
215
|
+
function parseOptionalInt(value?: string): number | undefined {
|
|
216
|
+
if (value == null || value === '') return undefined;
|
|
217
|
+
return parseInt(value, 10);
|
|
218
|
+
}
|
|
219
|
+
|
|
220
|
+
function parseOptionalFloat(value?: string): number | undefined {
|
|
221
|
+
if (value == null || value === '') return undefined;
|
|
222
|
+
return parseFloat(value);
|
|
223
|
+
}
|
|
224
|
+
|
|
225
|
+
function parseOptionalBool(value?: string): boolean | undefined {
|
|
226
|
+
if (value == null || value === '') return undefined;
|
|
227
|
+
return value === 'true';
|
|
228
|
+
}
|
|
229
|
+
|
|
230
|
+
export function get_profile(env: BenchmarkProfileEnv): ParsedBenchmarkProfile {
|
|
231
|
+
const profileName = env.BENCHMARK_PROFILE;
|
|
232
|
+
const { name, profile } = getBenchmarkProfile(profileName);
|
|
233
|
+
const context = resolveBenchmarkContext(name, {
|
|
234
|
+
...(parseOptionalFloat(env.DELAY) !== undefined ? { delay: parseOptionalFloat(env.DELAY)! } : {}),
|
|
235
|
+
...(parseOptionalFloat(env.DELAY_JITTER_RATIO) !== undefined
|
|
236
|
+
? { delay_jitter_ratio: parseOptionalFloat(env.DELAY_JITTER_RATIO)! }
|
|
237
|
+
: {}),
|
|
238
|
+
...(parseOptionalInt(env.EXPAND) !== undefined ? { expand: parseOptionalInt(env.EXPAND)! } : {}),
|
|
239
|
+
...(parseOptionalInt(env.STEPS) !== undefined ? { steps: parseOptionalInt(env.STEPS)! } : {}),
|
|
240
|
+
...(parseOptionalInt(env.CHECKPOINT_SIZE) !== undefined ? { checkpoint_size: parseOptionalInt(env.CHECKPOINT_SIZE)! } : {}),
|
|
241
|
+
...(parseOptionalBool(env.LLM_ENABLED) !== undefined ? { llm_enabled: parseOptionalBool(env.LLM_ENABLED)! } : {}),
|
|
242
|
+
...(parseOptionalInt(env.STREAM_SIZE) !== undefined ? { stream_size: parseOptionalInt(env.STREAM_SIZE)! } : {}),
|
|
243
|
+
...(parseOptionalInt(env.CHUNK_SIZE) !== undefined ? { chunk_size: parseOptionalInt(env.CHUNK_SIZE)! } : {}),
|
|
244
|
+
...(parseOptionalBool(env.BURST_MODE) !== undefined ? { burst_mode: parseOptionalBool(env.BURST_MODE)! } : {}),
|
|
245
|
+
...(parseOptionalFloat(env.BURST_PROBABILITY) !== undefined
|
|
246
|
+
? { burst_probability: parseOptionalFloat(env.BURST_PROBABILITY)! }
|
|
247
|
+
: {}),
|
|
248
|
+
...(parseOptionalInt(env.BURST_SIZE) !== undefined ? { burst_size: parseOptionalInt(env.BURST_SIZE)! } : {}),
|
|
249
|
+
});
|
|
250
|
+
|
|
251
|
+
return {
|
|
252
|
+
name,
|
|
253
|
+
benchmarkType: env.BENCHMARK_TYPE || 'wait_write',
|
|
254
|
+
runMode: env.RUN_MODE ? (env.RUN_MODE === 'stateful' ? 'stateful' : 'stateless') : profile.capacity.runMode,
|
|
255
|
+
resumable: env.STREAM_RESUMABLE != null && env.STREAM_RESUMABLE !== ''
|
|
256
|
+
? parseOptionalBool(env.STREAM_RESUMABLE) ?? profile.resumable
|
|
257
|
+
: profile.resumable,
|
|
258
|
+
context,
|
|
259
|
+
capacity: profile.capacity,
|
|
260
|
+
};
|
|
261
|
+
}
|
|
262
|
+
|
|
263
|
+
|
|
@@ -6,7 +6,6 @@ import { EnqueuedRunsOrder } from './enqueued_runs_order.js';
|
|
|
6
6
|
import { CancelFirstSecondCompletes } from './cancel_first_second_completes.js';
|
|
7
7
|
import { ThreadRunsMetadataSearch } from './thread_runs_metadata_search.js';
|
|
8
8
|
import { ThreadsSearchMetadata } from './threads_search_metadata.js';
|
|
9
|
-
import { RandomStream } from './random_stream.js';
|
|
10
9
|
import { MetaWorkload } from './meta_workload.js';
|
|
11
10
|
import type { BenchmarkRunner } from './benchmark-runner.js';
|
|
12
11
|
|
|
@@ -29,8 +28,6 @@ export class Benchmarks {
|
|
|
29
28
|
return ThreadRunsMetadataSearch;
|
|
30
29
|
case ThreadsSearchMetadata.toString():
|
|
31
30
|
return ThreadsSearchMetadata;
|
|
32
|
-
case RandomStream.toString():
|
|
33
|
-
return RandomStream;
|
|
34
31
|
case MetaWorkload.toString():
|
|
35
32
|
return MetaWorkload;
|
|
36
33
|
default:
|
|
@@ -3,7 +3,7 @@ import type { ErrorMetrics } from './benchmark-runner.js';
|
|
|
3
3
|
import { check } from 'k6';
|
|
4
4
|
import http from 'k6/http';
|
|
5
5
|
import type { BenchmarkResult, BenchmarkGraphOptions } from './types.js';
|
|
6
|
-
import {
|
|
6
|
+
import { JOIN_TIMEOUT } from './types.js';
|
|
7
7
|
import { addResponse, failResult, okResult } from './types.js';
|
|
8
8
|
import { logFailure } from './log-failure.js';
|
|
9
9
|
|
|
@@ -19,12 +19,13 @@ export class CancelFirstSecondCompletes extends BenchmarkRunner {
|
|
|
19
19
|
static run(
|
|
20
20
|
baseUrl: string,
|
|
21
21
|
requestParams: Record<string, unknown>,
|
|
22
|
-
benchmarkGraphOptions
|
|
22
|
+
benchmarkGraphOptions: BenchmarkGraphOptions
|
|
23
23
|
): BenchmarkResult<CancelFirstSecondCompletesData> {
|
|
24
|
-
const graphId = benchmarkGraphOptions
|
|
24
|
+
const graphId = benchmarkGraphOptions.graph_id;
|
|
25
25
|
const longDelaySec = 3;
|
|
26
26
|
const responses: Record<string, import('./types.js').HttpResponse> = {};
|
|
27
27
|
const joinParams = { ...requestParams, timeout: JOIN_TIMEOUT };
|
|
28
|
+
const baseContext = benchmarkGraphOptions.context;
|
|
28
29
|
|
|
29
30
|
const createThreadRes = http.post(`${baseUrl}/threads`, '{}', requestParams);
|
|
30
31
|
addResponse(responses, 'create_thread', createThreadRes);
|
|
@@ -35,7 +36,8 @@ export class CancelFirstSecondCompletes extends BenchmarkRunner {
|
|
|
35
36
|
|
|
36
37
|
const run1Payload = JSON.stringify({
|
|
37
38
|
assistant_id: graphId,
|
|
38
|
-
input: {
|
|
39
|
+
input: {},
|
|
40
|
+
context: { ...baseContext, delay: longDelaySec, expand: 1, steps: 1 },
|
|
39
41
|
config: { recursion_limit: 5 },
|
|
40
42
|
});
|
|
41
43
|
const run1Res = http.post(`${baseUrl}/threads/${threadId}/runs`, run1Payload, requestParams);
|
|
@@ -47,7 +49,8 @@ export class CancelFirstSecondCompletes extends BenchmarkRunner {
|
|
|
47
49
|
|
|
48
50
|
const run2Payload = JSON.stringify({
|
|
49
51
|
assistant_id: graphId,
|
|
50
|
-
input: {
|
|
52
|
+
input: {},
|
|
53
|
+
context: { ...baseContext, delay: 0, expand: 1, steps: 1 },
|
|
51
54
|
config: { recursion_limit: 5 },
|
|
52
55
|
multitask_strategy: 'enqueue',
|
|
53
56
|
});
|
|
@@ -85,7 +88,7 @@ export class CancelFirstSecondCompletes extends BenchmarkRunner {
|
|
|
85
88
|
static validate(
|
|
86
89
|
result: BenchmarkResult<CancelFirstSecondCompletesData>,
|
|
87
90
|
errorMetrics: ErrorMetrics,
|
|
88
|
-
_benchmarkGraphOptions
|
|
91
|
+
_benchmarkGraphOptions: BenchmarkGraphOptions
|
|
89
92
|
): boolean {
|
|
90
93
|
if (!result.ok) {
|
|
91
94
|
logFailure(CancelFirstSecondCompletes.toString(), result);
|
{langgraph_api-0.7.94 → langgraph_api-0.7.96}/benchmark/benchmark-runners/enqueued_runs_order.ts
RENAMED
|
@@ -3,7 +3,7 @@ import type { ErrorMetrics } from './benchmark-runner.js';
|
|
|
3
3
|
import { check } from 'k6';
|
|
4
4
|
import http from 'k6/http';
|
|
5
5
|
import type { BenchmarkResult, BenchmarkGraphOptions } from './types.js';
|
|
6
|
-
import {
|
|
6
|
+
import { JOIN_TIMEOUT, NUM_ENQUEUED_RUNS } from './types.js';
|
|
7
7
|
import { addResponse, failResult, okResult } from './types.js';
|
|
8
8
|
import { logFailure } from './log-failure.js';
|
|
9
9
|
|
|
@@ -17,11 +17,13 @@ export class EnqueuedRunsOrder extends BenchmarkRunner {
|
|
|
17
17
|
static run(
|
|
18
18
|
baseUrl: string,
|
|
19
19
|
requestParams: Record<string, unknown>,
|
|
20
|
-
benchmarkGraphOptions
|
|
20
|
+
benchmarkGraphOptions: BenchmarkGraphOptions
|
|
21
21
|
): BenchmarkResult<EnqueuedRunsOrderData> {
|
|
22
|
-
const graphId = benchmarkGraphOptions
|
|
22
|
+
const graphId = benchmarkGraphOptions.graph_id;
|
|
23
23
|
const responses: Record<string, import('./types.js').HttpResponse> = {};
|
|
24
24
|
const joinParams = { ...requestParams, timeout: JOIN_TIMEOUT } as Record<string, unknown>;
|
|
25
|
+
const context = benchmarkGraphOptions.context;
|
|
26
|
+
const recursion_limit = Math.max(context.expand, context.steps) + 2;
|
|
25
27
|
|
|
26
28
|
const createThreadRes = http.post(`${baseUrl}/threads`, '{}', requestParams);
|
|
27
29
|
addResponse(responses, 'create_thread', createThreadRes);
|
|
@@ -34,8 +36,9 @@ export class EnqueuedRunsOrder extends BenchmarkRunner {
|
|
|
34
36
|
for (let i = 0; i < NUM_ENQUEUED_RUNS; i++) {
|
|
35
37
|
const payload = JSON.stringify({
|
|
36
38
|
assistant_id: graphId,
|
|
37
|
-
input:
|
|
38
|
-
|
|
39
|
+
input: {},
|
|
40
|
+
context,
|
|
41
|
+
config: { recursion_limit },
|
|
39
42
|
multitask_strategy: 'enqueue',
|
|
40
43
|
});
|
|
41
44
|
const createRunRes = http.post(`${baseUrl}/threads/${threadId}/runs`, payload, requestParams);
|
|
@@ -64,7 +67,7 @@ export class EnqueuedRunsOrder extends BenchmarkRunner {
|
|
|
64
67
|
static validate(
|
|
65
68
|
result: BenchmarkResult<EnqueuedRunsOrderData>,
|
|
66
69
|
errorMetrics: ErrorMetrics,
|
|
67
|
-
_benchmarkGraphOptions
|
|
70
|
+
_benchmarkGraphOptions: BenchmarkGraphOptions
|
|
68
71
|
): boolean {
|
|
69
72
|
if (!result.ok) {
|
|
70
73
|
logFailure(EnqueuedRunsOrder.toString(), result);
|
|
@@ -10,7 +10,6 @@ import { EnqueuedRunsOrder } from './enqueued_runs_order.js';
|
|
|
10
10
|
import { CancelFirstSecondCompletes } from './cancel_first_second_completes.js';
|
|
11
11
|
import { ThreadRunsMetadataSearch } from './thread_runs_metadata_search.js';
|
|
12
12
|
import { ThreadsSearchMetadata } from './threads_search_metadata.js';
|
|
13
|
-
import { RandomStream } from './random_stream.js';
|
|
14
13
|
|
|
15
14
|
const OTHER_RUNNERS = [
|
|
16
15
|
WaitWrite,
|
|
@@ -21,7 +20,6 @@ const OTHER_RUNNERS = [
|
|
|
21
20
|
CancelFirstSecondCompletes,
|
|
22
21
|
ThreadRunsMetadataSearch,
|
|
23
22
|
ThreadsSearchMetadata,
|
|
24
|
-
RandomStream,
|
|
25
23
|
];
|
|
26
24
|
|
|
27
25
|
interface MetaWorkloadData {
|
|
@@ -34,14 +32,14 @@ export class MetaWorkload extends BenchmarkRunner {
|
|
|
34
32
|
static run(
|
|
35
33
|
baseUrl: string,
|
|
36
34
|
requestParams: Record<string, unknown>,
|
|
37
|
-
benchmarkGraphOptions
|
|
35
|
+
benchmarkGraphOptions: BenchmarkGraphOptions
|
|
38
36
|
): BenchmarkResult<MetaWorkloadData> {
|
|
39
37
|
const Runner = OTHER_RUNNERS[Math.floor(Math.random() * OTHER_RUNNERS.length)];
|
|
40
38
|
const innerResult = Runner.run(baseUrl, requestParams, benchmarkGraphOptions) as BenchmarkResult;
|
|
41
39
|
return {
|
|
42
40
|
ok: innerResult.ok,
|
|
43
41
|
step: innerResult.step,
|
|
44
|
-
responses: innerResult.responses
|
|
42
|
+
responses: innerResult.responses,
|
|
45
43
|
data: { type: Runner.toString(), result: innerResult, Runner },
|
|
46
44
|
};
|
|
47
45
|
}
|
|
@@ -49,7 +47,7 @@ export class MetaWorkload extends BenchmarkRunner {
|
|
|
49
47
|
static validate(
|
|
50
48
|
result: BenchmarkResult<MetaWorkloadData>,
|
|
51
49
|
errorMetrics: ErrorMetrics,
|
|
52
|
-
benchmarkGraphOptions
|
|
50
|
+
benchmarkGraphOptions: BenchmarkGraphOptions
|
|
53
51
|
): boolean {
|
|
54
52
|
const d = result.data;
|
|
55
53
|
if (!d) {
|