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.
- {langgraph_api-0.7.89 → langgraph_api-0.7.91}/PKG-INFO +3 -2
- {langgraph_api-0.7.89 → langgraph_api-0.7.91}/benchmark/Makefile +3 -3
- {langgraph_api-0.7.89 → langgraph_api-0.7.91}/benchmark/README.md +5 -14
- langgraph_api-0.7.91/benchmark/benchmark-runners/assistant.ts +129 -0
- langgraph_api-0.7.91/benchmark/benchmark-runners/benchmark-runner.ts +35 -0
- langgraph_api-0.7.91/benchmark/benchmark-runners/benchmarks.ts +40 -0
- langgraph_api-0.7.91/benchmark/benchmark-runners/cancel_first_second_completes.ts +116 -0
- langgraph_api-0.7.91/benchmark/benchmark-runners/enqueued_runs_order.ts +100 -0
- langgraph_api-0.7.91/benchmark/benchmark-runners/log-failure.ts +38 -0
- langgraph_api-0.7.91/benchmark/benchmark-runners/meta_workload.ts +70 -0
- langgraph_api-0.7.91/benchmark/benchmark-runners/random_stream.ts +114 -0
- langgraph_api-0.7.91/benchmark/benchmark-runners/stream_write.ts +89 -0
- langgraph_api-0.7.91/benchmark/benchmark-runners/thread.ts +124 -0
- langgraph_api-0.7.91/benchmark/benchmark-runners/thread_runs_metadata_search.ts +108 -0
- langgraph_api-0.7.91/benchmark/benchmark-runners/threads_search_metadata.ts +95 -0
- langgraph_api-0.7.91/benchmark/benchmark-runners/types.ts +143 -0
- langgraph_api-0.7.91/benchmark/benchmark-runners/wait_write.ts +96 -0
- {langgraph_api-0.7.89 → langgraph_api-0.7.91}/benchmark/capacity_k6.js +4 -5
- {langgraph_api-0.7.89 → langgraph_api-0.7.91}/benchmark/graphs.js +11 -9
- {langgraph_api-0.7.89 → langgraph_api-0.7.91}/benchmark/package.json +7 -2
- {langgraph_api-0.7.89 → langgraph_api-0.7.91}/benchmark/ramp.js +1 -1
- {langgraph_api-0.7.89 → langgraph_api-0.7.91}/benchmark/staircase_step_k6.js +1 -1
- langgraph_api-0.7.91/benchmark/tsconfig.json +17 -0
- langgraph_api-0.7.91/langgraph_api/__init__.py +1 -0
- {langgraph_api-0.7.89 → langgraph_api-0.7.91}/langgraph_api/config/__init__.py +1 -0
- {langgraph_api-0.7.89 → langgraph_api-0.7.91}/langgraph_api/js/yarn.lock +3 -3
- {langgraph_api-0.7.89 → langgraph_api-0.7.91}/langgraph_api/metrics_datadog.py +6 -30
- {langgraph_api-0.7.89 → langgraph_api-0.7.91}/langgraph_api/server.py +11 -5
- {langgraph_api-0.7.89 → langgraph_api-0.7.91}/langgraph_api/stream.py +68 -44
- {langgraph_api-0.7.89 → langgraph_api-0.7.91}/langgraph_api/utils/config.py +1 -1
- {langgraph_api-0.7.89 → langgraph_api-0.7.91}/langgraph_api/utils/stream_codec.py +22 -14
- {langgraph_api-0.7.89 → langgraph_api-0.7.91}/pyproject.toml +4 -1
- {langgraph_api-0.7.89 → langgraph_api-0.7.91}/uv.lock +70 -54
- langgraph_api-0.7.89/benchmark/benchmark-runners/assistant.js +0 -88
- langgraph_api-0.7.89/benchmark/benchmark-runners/benchmark-runner.js +0 -34
- langgraph_api-0.7.89/benchmark/benchmark-runners/benchmarks.js +0 -21
- langgraph_api-0.7.89/benchmark/benchmark-runners/stream_write.js +0 -98
- langgraph_api-0.7.89/benchmark/benchmark-runners/thread.js +0 -87
- langgraph_api-0.7.89/benchmark/benchmark-runners/wait_write.js +0 -107
- langgraph_api-0.7.89/benchmark/burst.js +0 -219
- langgraph_api-0.7.89/langgraph_api/__init__.py +0 -1
- {langgraph_api-0.7.89 → langgraph_api-0.7.91}/.gitignore +0 -0
- {langgraph_api-0.7.89 → langgraph_api-0.7.91}/LICENSE +0 -0
- {langgraph_api-0.7.89 → langgraph_api-0.7.91}/Makefile +0 -0
- {langgraph_api-0.7.89 → langgraph_api-0.7.91}/README.md +0 -0
- {langgraph_api-0.7.89 → langgraph_api-0.7.91}/benchmark/.gitignore +0 -0
- {langgraph_api-0.7.89 → langgraph_api-0.7.91}/benchmark/capacity_dd_report.py +0 -0
- {langgraph_api-0.7.89 → langgraph_api-0.7.91}/benchmark/capacity_runner.mjs +0 -0
- {langgraph_api-0.7.89 → langgraph_api-0.7.91}/benchmark/capacity_slack_report.py +0 -0
- {langgraph_api-0.7.89 → langgraph_api-0.7.91}/benchmark/capacity_urls.mjs +0 -0
- {langgraph_api-0.7.89 → langgraph_api-0.7.91}/benchmark/clean-cli.js +0 -0
- {langgraph_api-0.7.89 → langgraph_api-0.7.91}/benchmark/clean.js +0 -0
- {langgraph_api-0.7.89 → langgraph_api-0.7.91}/benchmark/continuous/README.md +0 -0
- {langgraph_api-0.7.89 → langgraph_api-0.7.91}/benchmark/continuous/pyproject.toml +0 -0
- {langgraph_api-0.7.89 → langgraph_api-0.7.91}/benchmark/continuous/runner.py +0 -0
- {langgraph_api-0.7.89 → langgraph_api-0.7.91}/benchmark/continuous/uv.lock +0 -0
- {langgraph_api-0.7.89 → langgraph_api-0.7.91}/benchmark/mixed_workload_k6.js +0 -0
- {langgraph_api-0.7.89 → langgraph_api-0.7.91}/benchmark/mixed_workload_runner.mjs +0 -0
- {langgraph_api-0.7.89 → langgraph_api-0.7.91}/benchmark/reporting/dd_reporting.py +0 -0
- {langgraph_api-0.7.89 → langgraph_api-0.7.91}/benchmark/reporting/slack_slowest_runs.py +0 -0
- {langgraph_api-0.7.89 → langgraph_api-0.7.91}/benchmark/reporting/slack_summary.py +0 -0
- {langgraph_api-0.7.89 → langgraph_api-0.7.91}/benchmark/run_local.sh +0 -0
- {langgraph_api-0.7.89 → langgraph_api-0.7.91}/benchmark/staircase.py +0 -0
- {langgraph_api-0.7.89 → langgraph_api-0.7.91}/benchmark/update-revision.js +0 -0
- {langgraph_api-0.7.89 → langgraph_api-0.7.91}/benchmark/weather.js +0 -0
- {langgraph_api-0.7.89 → langgraph_api-0.7.91}/constraints.txt +0 -0
- {langgraph_api-0.7.89 → langgraph_api-0.7.91}/custom_store.sql +0 -0
- {langgraph_api-0.7.89 → langgraph_api-0.7.91}/forbidden.txt +0 -0
- {langgraph_api-0.7.89 → langgraph_api-0.7.91}/hatch_build.py +0 -0
- {langgraph_api-0.7.89 → langgraph_api-0.7.91}/healthcheck.py +0 -0
- {langgraph_api-0.7.89 → langgraph_api-0.7.91}/langgraph-cloud-debugging-20260210132856.zip +0 -0
- {langgraph_api-0.7.89 → langgraph_api-0.7.91}/langgraph_api/_checkpointer/__init__.py +0 -0
- {langgraph_api-0.7.89 → langgraph_api-0.7.91}/langgraph_api/_checkpointer/_adapter.py +0 -0
- {langgraph_api-0.7.89 → langgraph_api-0.7.91}/langgraph_api/_checkpointer/protocol.py +0 -0
- {langgraph_api-0.7.89 → langgraph_api-0.7.91}/langgraph_api/_factory_utils.py +0 -0
- {langgraph_api-0.7.89 → langgraph_api-0.7.91}/langgraph_api/api/__init__.py +0 -0
- {langgraph_api-0.7.89 → langgraph_api-0.7.91}/langgraph_api/api/a2a.py +0 -0
- {langgraph_api-0.7.89 → langgraph_api-0.7.91}/langgraph_api/api/assistants.py +0 -0
- {langgraph_api-0.7.89 → langgraph_api-0.7.91}/langgraph_api/api/mcp/__init__.py +0 -0
- {langgraph_api-0.7.89 → langgraph_api-0.7.91}/langgraph_api/api/mcp/_constants.py +0 -0
- {langgraph_api-0.7.89 → langgraph_api-0.7.91}/langgraph_api/api/mcp/_handlers.py +0 -0
- {langgraph_api-0.7.89 → langgraph_api-0.7.91}/langgraph_api/api/mcp/_models.py +0 -0
- {langgraph_api-0.7.89 → langgraph_api-0.7.91}/langgraph_api/api/mcp/_routes.py +0 -0
- {langgraph_api-0.7.89 → langgraph_api-0.7.91}/langgraph_api/api/mcp/_sanitizers.py +0 -0
- {langgraph_api-0.7.89 → langgraph_api-0.7.91}/langgraph_api/api/meta.py +0 -0
- {langgraph_api-0.7.89 → langgraph_api-0.7.91}/langgraph_api/api/openapi.py +0 -0
- {langgraph_api-0.7.89 → langgraph_api-0.7.91}/langgraph_api/api/profile.py +0 -0
- {langgraph_api-0.7.89 → langgraph_api-0.7.91}/langgraph_api/api/runs.py +0 -0
- {langgraph_api-0.7.89 → langgraph_api-0.7.91}/langgraph_api/api/store.py +0 -0
- {langgraph_api-0.7.89 → langgraph_api-0.7.91}/langgraph_api/api/threads.py +0 -0
- {langgraph_api-0.7.89 → langgraph_api-0.7.91}/langgraph_api/api/ui.py +0 -0
- {langgraph_api-0.7.89 → langgraph_api-0.7.91}/langgraph_api/asgi_transport.py +0 -0
- {langgraph_api-0.7.89 → langgraph_api-0.7.91}/langgraph_api/asyncio.py +0 -0
- {langgraph_api-0.7.89 → langgraph_api-0.7.91}/langgraph_api/auth/__init__.py +0 -0
- {langgraph_api-0.7.89 → langgraph_api-0.7.91}/langgraph_api/auth/custom.py +0 -0
- {langgraph_api-0.7.89 → langgraph_api-0.7.91}/langgraph_api/auth/errors.py +0 -0
- {langgraph_api-0.7.89 → langgraph_api-0.7.91}/langgraph_api/auth/langsmith/__init__.py +0 -0
- {langgraph_api-0.7.89 → langgraph_api-0.7.91}/langgraph_api/auth/langsmith/backend.py +0 -0
- {langgraph_api-0.7.89 → langgraph_api-0.7.91}/langgraph_api/auth/langsmith/client.py +0 -0
- {langgraph_api-0.7.89 → langgraph_api-0.7.91}/langgraph_api/auth/middleware.py +0 -0
- {langgraph_api-0.7.89 → langgraph_api-0.7.91}/langgraph_api/auth/noop.py +0 -0
- {langgraph_api-0.7.89 → langgraph_api-0.7.91}/langgraph_api/auth/studio_user.py +0 -0
- {langgraph_api-0.7.89 → langgraph_api-0.7.91}/langgraph_api/cache.py +0 -0
- {langgraph_api-0.7.89 → langgraph_api-0.7.91}/langgraph_api/cli.py +0 -0
- {langgraph_api-0.7.89 → langgraph_api-0.7.91}/langgraph_api/command.py +0 -0
- {langgraph_api-0.7.89 → langgraph_api-0.7.91}/langgraph_api/config/_parse.py +0 -0
- {langgraph_api-0.7.89 → langgraph_api-0.7.91}/langgraph_api/config/schemas.py +0 -0
- {langgraph_api-0.7.89 → langgraph_api-0.7.91}/langgraph_api/cron_scheduler.py +0 -0
- {langgraph_api-0.7.89 → langgraph_api-0.7.91}/langgraph_api/encryption/__init__.py +0 -0
- {langgraph_api-0.7.89 → langgraph_api-0.7.91}/langgraph_api/encryption/aes_json.py +0 -0
- {langgraph_api-0.7.89 → langgraph_api-0.7.91}/langgraph_api/encryption/context.py +0 -0
- {langgraph_api-0.7.89 → langgraph_api-0.7.91}/langgraph_api/encryption/custom.py +0 -0
- {langgraph_api-0.7.89 → langgraph_api-0.7.91}/langgraph_api/encryption/middleware.py +0 -0
- {langgraph_api-0.7.89 → langgraph_api-0.7.91}/langgraph_api/encryption/shared.py +0 -0
- {langgraph_api-0.7.89 → langgraph_api-0.7.91}/langgraph_api/errors.py +0 -0
- {langgraph_api-0.7.89 → langgraph_api-0.7.91}/langgraph_api/executor_entrypoint.py +0 -0
- {langgraph_api-0.7.89 → langgraph_api-0.7.91}/langgraph_api/feature_flags.py +0 -0
- {langgraph_api-0.7.89 → langgraph_api-0.7.91}/langgraph_api/graph.py +0 -0
- {langgraph_api-0.7.89 → langgraph_api-0.7.91}/langgraph_api/grpc/__init__.py +0 -0
- {langgraph_api-0.7.89 → langgraph_api-0.7.91}/langgraph_api/grpc/client.py +0 -0
- {langgraph_api-0.7.89 → langgraph_api-0.7.91}/langgraph_api/grpc/generated/core_api_pb2.pyi +0 -0
- {langgraph_api-0.7.89 → langgraph_api-0.7.91}/langgraph_api/grpc/ops/__init__.py +0 -0
- {langgraph_api-0.7.89 → langgraph_api-0.7.91}/langgraph_api/grpc/ops/assistants.py +0 -0
- {langgraph_api-0.7.89 → langgraph_api-0.7.91}/langgraph_api/grpc/ops/cache.py +0 -0
- {langgraph_api-0.7.89 → langgraph_api-0.7.91}/langgraph_api/grpc/ops/crons.py +0 -0
- {langgraph_api-0.7.89 → langgraph_api-0.7.91}/langgraph_api/grpc/ops/runs.py +0 -0
- {langgraph_api-0.7.89 → langgraph_api-0.7.91}/langgraph_api/grpc/ops/threads.py +0 -0
- {langgraph_api-0.7.89 → langgraph_api-0.7.91}/langgraph_api/grpc/server.py +0 -0
- {langgraph_api-0.7.89 → langgraph_api-0.7.91}/langgraph_api/grpc/servicers/__init__.py +0 -0
- {langgraph_api-0.7.89 → langgraph_api-0.7.91}/langgraph_api/grpc/servicers/checkpointer.py +0 -0
- {langgraph_api-0.7.89 → langgraph_api-0.7.91}/langgraph_api/grpc/servicers/encryption.py +0 -0
- {langgraph_api-0.7.89 → langgraph_api-0.7.91}/langgraph_api/http.py +0 -0
- {langgraph_api-0.7.89 → langgraph_api-0.7.91}/langgraph_api/http_metrics.py +0 -0
- {langgraph_api-0.7.89 → langgraph_api-0.7.91}/langgraph_api/http_metrics_utils.py +0 -0
- {langgraph_api-0.7.89 → langgraph_api-0.7.91}/langgraph_api/js/.gitignore +0 -0
- {langgraph_api-0.7.89 → langgraph_api-0.7.91}/langgraph_api/js/.prettierrc +0 -0
- {langgraph_api-0.7.89 → langgraph_api-0.7.91}/langgraph_api/js/__init__.py +0 -0
- {langgraph_api-0.7.89 → langgraph_api-0.7.91}/langgraph_api/js/base.py +0 -0
- {langgraph_api-0.7.89 → langgraph_api-0.7.91}/langgraph_api/js/build.mts +0 -0
- {langgraph_api-0.7.89 → langgraph_api-0.7.91}/langgraph_api/js/client.http.mts +0 -0
- {langgraph_api-0.7.89 → langgraph_api-0.7.91}/langgraph_api/js/client.mts +0 -0
- {langgraph_api-0.7.89 → langgraph_api-0.7.91}/langgraph_api/js/errors.py +0 -0
- {langgraph_api-0.7.89 → langgraph_api-0.7.91}/langgraph_api/js/global.d.ts +0 -0
- {langgraph_api-0.7.89 → langgraph_api-0.7.91}/langgraph_api/js/package.json +0 -0
- {langgraph_api-0.7.89 → langgraph_api-0.7.91}/langgraph_api/js/remote.py +0 -0
- {langgraph_api-0.7.89 → langgraph_api-0.7.91}/langgraph_api/js/schema.py +0 -0
- {langgraph_api-0.7.89 → langgraph_api-0.7.91}/langgraph_api/js/src/graph.mts +0 -0
- {langgraph_api-0.7.89 → langgraph_api-0.7.91}/langgraph_api/js/src/load.hooks.mjs +0 -0
- {langgraph_api-0.7.89 → langgraph_api-0.7.91}/langgraph_api/js/src/preload.mjs +0 -0
- {langgraph_api-0.7.89 → langgraph_api-0.7.91}/langgraph_api/js/src/utils/files.mts +0 -0
- {langgraph_api-0.7.89 → langgraph_api-0.7.91}/langgraph_api/js/src/utils/importMap.mts +0 -0
- {langgraph_api-0.7.89 → langgraph_api-0.7.91}/langgraph_api/js/src/utils/pythonSchemas.mts +0 -0
- {langgraph_api-0.7.89 → langgraph_api-0.7.91}/langgraph_api/js/src/utils/serde.mts +0 -0
- {langgraph_api-0.7.89 → langgraph_api-0.7.91}/langgraph_api/js/sse.py +0 -0
- {langgraph_api-0.7.89 → langgraph_api-0.7.91}/langgraph_api/js/traceblock.mts +0 -0
- {langgraph_api-0.7.89 → langgraph_api-0.7.91}/langgraph_api/js/tsconfig.json +0 -0
- {langgraph_api-0.7.89 → langgraph_api-0.7.91}/langgraph_api/js/ui.py +0 -0
- {langgraph_api-0.7.89 → langgraph_api-0.7.91}/langgraph_api/logging.py +0 -0
- {langgraph_api-0.7.89 → langgraph_api-0.7.91}/langgraph_api/metadata.py +0 -0
- {langgraph_api-0.7.89 → langgraph_api-0.7.91}/langgraph_api/middleware/__init__.py +0 -0
- {langgraph_api-0.7.89 → langgraph_api-0.7.91}/langgraph_api/middleware/ensure_store.py +0 -0
- {langgraph_api-0.7.89 → langgraph_api-0.7.91}/langgraph_api/middleware/http_logger.py +0 -0
- {langgraph_api-0.7.89 → langgraph_api-0.7.91}/langgraph_api/middleware/private_network.py +0 -0
- {langgraph_api-0.7.89 → langgraph_api-0.7.91}/langgraph_api/middleware/request_id.py +0 -0
- {langgraph_api-0.7.89 → langgraph_api-0.7.91}/langgraph_api/models/__init__.py +0 -0
- {langgraph_api-0.7.89 → langgraph_api-0.7.91}/langgraph_api/models/run.py +0 -0
- {langgraph_api-0.7.89 → langgraph_api-0.7.91}/langgraph_api/otel_context.py +0 -0
- {langgraph_api-0.7.89 → langgraph_api-0.7.91}/langgraph_api/patch.py +0 -0
- {langgraph_api-0.7.89 → langgraph_api-0.7.91}/langgraph_api/queue_entrypoint.py +0 -0
- {langgraph_api-0.7.89 → langgraph_api-0.7.91}/langgraph_api/route.py +0 -0
- {langgraph_api-0.7.89 → langgraph_api-0.7.91}/langgraph_api/schema.py +0 -0
- {langgraph_api-0.7.89 → langgraph_api-0.7.91}/langgraph_api/self_hosted_logs.py +0 -0
- {langgraph_api-0.7.89 → langgraph_api-0.7.91}/langgraph_api/self_hosted_metrics.py +0 -0
- {langgraph_api-0.7.89 → langgraph_api-0.7.91}/langgraph_api/serde.py +0 -0
- {langgraph_api-0.7.89 → langgraph_api-0.7.91}/langgraph_api/sse.py +0 -0
- {langgraph_api-0.7.89 → langgraph_api-0.7.91}/langgraph_api/state.py +0 -0
- {langgraph_api-0.7.89 → langgraph_api-0.7.91}/langgraph_api/store.py +0 -0
- {langgraph_api-0.7.89 → langgraph_api-0.7.91}/langgraph_api/timing/__init__.py +0 -0
- {langgraph_api-0.7.89 → langgraph_api-0.7.91}/langgraph_api/timing/profiler.py +0 -0
- {langgraph_api-0.7.89 → langgraph_api-0.7.91}/langgraph_api/timing/timer.py +0 -0
- {langgraph_api-0.7.89 → langgraph_api-0.7.91}/langgraph_api/traceblock.py +0 -0
- {langgraph_api-0.7.89 → langgraph_api-0.7.91}/langgraph_api/tunneling/cloudflare.py +0 -0
- {langgraph_api-0.7.89 → langgraph_api-0.7.91}/langgraph_api/utils/__init__.py +0 -0
- {langgraph_api-0.7.89 → langgraph_api-0.7.91}/langgraph_api/utils/cache.py +0 -0
- {langgraph_api-0.7.89 → langgraph_api-0.7.91}/langgraph_api/utils/errors.py +0 -0
- {langgraph_api-0.7.89 → langgraph_api-0.7.91}/langgraph_api/utils/extract.py +0 -0
- {langgraph_api-0.7.89 → langgraph_api-0.7.91}/langgraph_api/utils/future.py +0 -0
- {langgraph_api-0.7.89 → langgraph_api-0.7.91}/langgraph_api/utils/headers.py +0 -0
- {langgraph_api-0.7.89 → langgraph_api-0.7.91}/langgraph_api/utils/retriable_client.py +0 -0
- {langgraph_api-0.7.89 → langgraph_api-0.7.91}/langgraph_api/utils/uuids.py +0 -0
- {langgraph_api-0.7.89 → langgraph_api-0.7.91}/langgraph_api/validation.py +0 -0
- {langgraph_api-0.7.89 → langgraph_api-0.7.91}/langgraph_api/webhook.py +0 -0
- {langgraph_api-0.7.89 → langgraph_api-0.7.91}/langgraph_api/worker.py +0 -0
- {langgraph_api-0.7.89 → langgraph_api-0.7.91}/langgraph_grpc_common/__init__.py +0 -0
- {langgraph_api-0.7.89 → langgraph_api-0.7.91}/langgraph_grpc_common/checkpointer.py +0 -0
- {langgraph_api-0.7.89 → langgraph_api-0.7.91}/langgraph_grpc_common/conversion/__init__.py +0 -0
- {langgraph_api-0.7.89 → langgraph_api-0.7.91}/langgraph_grpc_common/conversion/_compat.py +0 -0
- {langgraph_api-0.7.89 → langgraph_api-0.7.91}/langgraph_grpc_common/conversion/channel.py +0 -0
- {langgraph_api-0.7.89 → langgraph_api-0.7.91}/langgraph_grpc_common/conversion/checkpoint.py +0 -0
- {langgraph_api-0.7.89 → langgraph_api-0.7.91}/langgraph_grpc_common/conversion/config.py +0 -0
- {langgraph_api-0.7.89 → langgraph_api-0.7.91}/langgraph_grpc_common/conversion/durability.py +0 -0
- {langgraph_api-0.7.89 → langgraph_api-0.7.91}/langgraph_grpc_common/conversion/exception.py +0 -0
- {langgraph_api-0.7.89 → langgraph_api-0.7.91}/langgraph_grpc_common/conversion/graph.py +0 -0
- {langgraph_api-0.7.89 → langgraph_api-0.7.91}/langgraph_grpc_common/conversion/interrupt.py +0 -0
- {langgraph_api-0.7.89 → langgraph_api-0.7.91}/langgraph_grpc_common/conversion/messages.py +0 -0
- {langgraph_api-0.7.89 → langgraph_api-0.7.91}/langgraph_grpc_common/conversion/orchestrator_response.py +0 -0
- {langgraph_api-0.7.89 → langgraph_api-0.7.91}/langgraph_grpc_common/conversion/runopts.py +0 -0
- {langgraph_api-0.7.89 → langgraph_api-0.7.91}/langgraph_grpc_common/conversion/stream_mode.py +0 -0
- {langgraph_api-0.7.89 → langgraph_api-0.7.91}/langgraph_grpc_common/conversion/struct.py +0 -0
- {langgraph_api-0.7.89 → langgraph_api-0.7.91}/langgraph_grpc_common/conversion/task.py +0 -0
- {langgraph_api-0.7.89 → langgraph_api-0.7.91}/langgraph_grpc_common/conversion/value.py +0 -0
- {langgraph_api-0.7.89 → langgraph_api-0.7.91}/langgraph_grpc_common/proto/__init__.py +0 -0
- {langgraph_api-0.7.89 → langgraph_api-0.7.91}/langgraph_grpc_common/proto/checkpointer_pb2.py +0 -0
- {langgraph_api-0.7.89 → langgraph_api-0.7.91}/langgraph_grpc_common/proto/checkpointer_pb2.pyi +0 -0
- {langgraph_api-0.7.89 → langgraph_api-0.7.91}/langgraph_grpc_common/proto/checkpointer_pb2_grpc.py +0 -0
- {langgraph_api-0.7.89 → langgraph_api-0.7.91}/langgraph_grpc_common/proto/checkpointer_pb2_grpc.pyi +0 -0
- {langgraph_api-0.7.89 → langgraph_api-0.7.91}/langgraph_grpc_common/proto/core_api_pb2.py +0 -0
- {langgraph_api-0.7.89 → langgraph_api-0.7.91}/langgraph_grpc_common/proto/core_api_pb2.pyi +0 -0
- {langgraph_api-0.7.89 → langgraph_api-0.7.91}/langgraph_grpc_common/proto/core_api_pb2_grpc.py +0 -0
- {langgraph_api-0.7.89 → langgraph_api-0.7.91}/langgraph_grpc_common/proto/core_api_pb2_grpc.pyi +0 -0
- {langgraph_api-0.7.89 → langgraph_api-0.7.91}/langgraph_grpc_common/proto/encryption_pb2.py +0 -0
- {langgraph_api-0.7.89 → langgraph_api-0.7.91}/langgraph_grpc_common/proto/encryption_pb2.pyi +0 -0
- {langgraph_api-0.7.89 → langgraph_api-0.7.91}/langgraph_grpc_common/proto/encryption_pb2_grpc.py +0 -0
- {langgraph_api-0.7.89 → langgraph_api-0.7.91}/langgraph_grpc_common/proto/encryption_pb2_grpc.pyi +0 -0
- {langgraph_api-0.7.89 → langgraph_api-0.7.91}/langgraph_grpc_common/proto/engine_api_pb2.py +0 -0
- {langgraph_api-0.7.89 → langgraph_api-0.7.91}/langgraph_grpc_common/proto/engine_api_pb2.pyi +0 -0
- {langgraph_api-0.7.89 → langgraph_api-0.7.91}/langgraph_grpc_common/proto/engine_api_pb2_grpc.py +0 -0
- {langgraph_api-0.7.89 → langgraph_api-0.7.91}/langgraph_grpc_common/proto/engine_api_pb2_grpc.pyi +0 -0
- {langgraph_api-0.7.89 → langgraph_api-0.7.91}/langgraph_grpc_common/proto/engine_common_pb2.py +0 -0
- {langgraph_api-0.7.89 → langgraph_api-0.7.91}/langgraph_grpc_common/proto/engine_common_pb2.pyi +0 -0
- {langgraph_api-0.7.89 → langgraph_api-0.7.91}/langgraph_grpc_common/proto/engine_common_pb2_grpc.py +0 -0
- {langgraph_api-0.7.89 → langgraph_api-0.7.91}/langgraph_grpc_common/proto/engine_common_pb2_grpc.pyi +0 -0
- {langgraph_api-0.7.89 → langgraph_api-0.7.91}/langgraph_grpc_common/proto/enum_cancel_run_action_pb2.py +0 -0
- {langgraph_api-0.7.89 → langgraph_api-0.7.91}/langgraph_grpc_common/proto/enum_cancel_run_action_pb2.pyi +0 -0
- {langgraph_api-0.7.89 → langgraph_api-0.7.91}/langgraph_grpc_common/proto/enum_cancel_run_action_pb2_grpc.py +0 -0
- {langgraph_api-0.7.89 → langgraph_api-0.7.91}/langgraph_grpc_common/proto/enum_cancel_run_action_pb2_grpc.pyi +0 -0
- {langgraph_api-0.7.89 → langgraph_api-0.7.91}/langgraph_grpc_common/proto/enum_control_signal_pb2.py +0 -0
- {langgraph_api-0.7.89 → langgraph_api-0.7.91}/langgraph_grpc_common/proto/enum_control_signal_pb2.pyi +0 -0
- {langgraph_api-0.7.89 → langgraph_api-0.7.91}/langgraph_grpc_common/proto/enum_control_signal_pb2_grpc.py +0 -0
- {langgraph_api-0.7.89 → langgraph_api-0.7.91}/langgraph_grpc_common/proto/enum_control_signal_pb2_grpc.pyi +0 -0
- {langgraph_api-0.7.89 → langgraph_api-0.7.91}/langgraph_grpc_common/proto/enum_cron_on_run_completed_pb2.py +0 -0
- {langgraph_api-0.7.89 → langgraph_api-0.7.91}/langgraph_grpc_common/proto/enum_cron_on_run_completed_pb2.pyi +0 -0
- {langgraph_api-0.7.89 → langgraph_api-0.7.91}/langgraph_grpc_common/proto/enum_cron_on_run_completed_pb2_grpc.py +0 -0
- {langgraph_api-0.7.89 → langgraph_api-0.7.91}/langgraph_grpc_common/proto/enum_cron_on_run_completed_pb2_grpc.pyi +0 -0
- {langgraph_api-0.7.89 → langgraph_api-0.7.91}/langgraph_grpc_common/proto/enum_durability_pb2.py +0 -0
- {langgraph_api-0.7.89 → langgraph_api-0.7.91}/langgraph_grpc_common/proto/enum_durability_pb2.pyi +0 -0
- {langgraph_api-0.7.89 → langgraph_api-0.7.91}/langgraph_grpc_common/proto/enum_durability_pb2_grpc.py +0 -0
- {langgraph_api-0.7.89 → langgraph_api-0.7.91}/langgraph_grpc_common/proto/enum_durability_pb2_grpc.pyi +0 -0
- {langgraph_api-0.7.89 → langgraph_api-0.7.91}/langgraph_grpc_common/proto/enum_multitask_strategy_pb2.py +0 -0
- {langgraph_api-0.7.89 → langgraph_api-0.7.91}/langgraph_grpc_common/proto/enum_multitask_strategy_pb2.pyi +0 -0
- {langgraph_api-0.7.89 → langgraph_api-0.7.91}/langgraph_grpc_common/proto/enum_multitask_strategy_pb2_grpc.py +0 -0
- {langgraph_api-0.7.89 → langgraph_api-0.7.91}/langgraph_grpc_common/proto/enum_multitask_strategy_pb2_grpc.pyi +0 -0
- {langgraph_api-0.7.89 → langgraph_api-0.7.91}/langgraph_grpc_common/proto/enum_run_status_pb2.py +0 -0
- {langgraph_api-0.7.89 → langgraph_api-0.7.91}/langgraph_grpc_common/proto/enum_run_status_pb2.pyi +0 -0
- {langgraph_api-0.7.89 → langgraph_api-0.7.91}/langgraph_grpc_common/proto/enum_run_status_pb2_grpc.py +0 -0
- {langgraph_api-0.7.89 → langgraph_api-0.7.91}/langgraph_grpc_common/proto/enum_run_status_pb2_grpc.pyi +0 -0
- {langgraph_api-0.7.89 → langgraph_api-0.7.91}/langgraph_grpc_common/proto/enum_store_operation_entry_type_pb2.py +0 -0
- {langgraph_api-0.7.89 → langgraph_api-0.7.91}/langgraph_grpc_common/proto/enum_store_operation_entry_type_pb2.pyi +0 -0
- {langgraph_api-0.7.89 → langgraph_api-0.7.91}/langgraph_grpc_common/proto/enum_store_operation_entry_type_pb2_grpc.py +0 -0
- {langgraph_api-0.7.89 → langgraph_api-0.7.91}/langgraph_grpc_common/proto/enum_store_operation_entry_type_pb2_grpc.pyi +0 -0
- {langgraph_api-0.7.89 → langgraph_api-0.7.91}/langgraph_grpc_common/proto/enum_stream_mode_pb2.py +0 -0
- {langgraph_api-0.7.89 → langgraph_api-0.7.91}/langgraph_grpc_common/proto/enum_stream_mode_pb2.pyi +0 -0
- {langgraph_api-0.7.89 → langgraph_api-0.7.91}/langgraph_grpc_common/proto/enum_stream_mode_pb2_grpc.py +0 -0
- {langgraph_api-0.7.89 → langgraph_api-0.7.91}/langgraph_grpc_common/proto/enum_stream_mode_pb2_grpc.pyi +0 -0
- {langgraph_api-0.7.89 → langgraph_api-0.7.91}/langgraph_grpc_common/proto/enum_thread_status_pb2.py +0 -0
- {langgraph_api-0.7.89 → langgraph_api-0.7.91}/langgraph_grpc_common/proto/enum_thread_status_pb2.pyi +0 -0
- {langgraph_api-0.7.89 → langgraph_api-0.7.91}/langgraph_grpc_common/proto/enum_thread_status_pb2_grpc.py +0 -0
- {langgraph_api-0.7.89 → langgraph_api-0.7.91}/langgraph_grpc_common/proto/enum_thread_status_pb2_grpc.pyi +0 -0
- {langgraph_api-0.7.89 → langgraph_api-0.7.91}/langgraph_grpc_common/proto/enum_thread_stream_mode_pb2.py +0 -0
- {langgraph_api-0.7.89 → langgraph_api-0.7.91}/langgraph_grpc_common/proto/enum_thread_stream_mode_pb2.pyi +0 -0
- {langgraph_api-0.7.89 → langgraph_api-0.7.91}/langgraph_grpc_common/proto/enum_thread_stream_mode_pb2_grpc.py +0 -0
- {langgraph_api-0.7.89 → langgraph_api-0.7.91}/langgraph_grpc_common/proto/enum_thread_stream_mode_pb2_grpc.pyi +0 -0
- {langgraph_api-0.7.89 → langgraph_api-0.7.91}/langgraph_grpc_common/proto/errors_pb2.py +0 -0
- {langgraph_api-0.7.89 → langgraph_api-0.7.91}/langgraph_grpc_common/proto/errors_pb2.pyi +0 -0
- {langgraph_api-0.7.89 → langgraph_api-0.7.91}/langgraph_grpc_common/proto/errors_pb2_grpc.py +0 -0
- {langgraph_api-0.7.89 → langgraph_api-0.7.91}/langgraph_grpc_common/proto/errors_pb2_grpc.pyi +0 -0
- {langgraph_api-0.7.89 → langgraph_api-0.7.91}/langgraph_grpc_common/proto/executor_api_pb2.py +0 -0
- {langgraph_api-0.7.89 → langgraph_api-0.7.91}/langgraph_grpc_common/proto/executor_api_pb2.pyi +0 -0
- {langgraph_api-0.7.89 → langgraph_api-0.7.91}/langgraph_grpc_common/proto/executor_api_pb2_grpc.py +0 -0
- {langgraph_api-0.7.89 → langgraph_api-0.7.91}/langgraph_grpc_common/proto/executor_api_pb2_grpc.pyi +0 -0
- {langgraph_api-0.7.89 → langgraph_api-0.7.91}/langgraph_grpc_common/sanitize.py +0 -0
- {langgraph_api-0.7.89 → langgraph_api-0.7.91}/langgraph_grpc_common/serde.py +0 -0
- {langgraph_api-0.7.89 → langgraph_api-0.7.91}/langgraph_license/__init__.py +0 -0
- {langgraph_api-0.7.89 → langgraph_api-0.7.91}/langgraph_license/validation.py +0 -0
- {langgraph_api-0.7.89 → langgraph_api-0.7.91}/langgraph_runtime/__init__.py +0 -0
- {langgraph_api-0.7.89 → langgraph_api-0.7.91}/langgraph_runtime/checkpoint.py +0 -0
- {langgraph_api-0.7.89 → langgraph_api-0.7.91}/langgraph_runtime/database.py +0 -0
- {langgraph_api-0.7.89 → langgraph_api-0.7.91}/langgraph_runtime/lifespan.py +0 -0
- {langgraph_api-0.7.89 → langgraph_api-0.7.91}/langgraph_runtime/metrics.py +0 -0
- {langgraph_api-0.7.89 → langgraph_api-0.7.91}/langgraph_runtime/ops.py +0 -0
- {langgraph_api-0.7.89 → langgraph_api-0.7.91}/langgraph_runtime/queue.py +0 -0
- {langgraph_api-0.7.89 → langgraph_api-0.7.91}/langgraph_runtime/retry.py +0 -0
- {langgraph_api-0.7.89 → langgraph_api-0.7.91}/langgraph_runtime/routes.py +0 -0
- {langgraph_api-0.7.89 → langgraph_api-0.7.91}/langgraph_runtime/store.py +0 -0
- {langgraph_api-0.7.89 → langgraph_api-0.7.91}/logging.json +0 -0
- {langgraph_api-0.7.89 → langgraph_api-0.7.91}/openapi.json +0 -0
- {langgraph_api-0.7.89 → langgraph_api-0.7.91}/scripts/build_wheel.py +0 -0
- {langgraph_api-0.7.89 → langgraph_api-0.7.91}/scripts/create_license.py +0 -0
- {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.
|
|
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.
|
|
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
|
-
|
|
10
|
-
1. `
|
|
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
|
|
58
|
-
BASE_URL=https://jdr-benchmark-1cfe27c4cd375e1c999f02f186f617f6.us.langgraph.app make benchmark-
|
|
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
|
|
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
|
+
}
|