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