langgraph-api 0.16.0.dev11__tar.gz → 0.16.0.dev12__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.dev11 → langgraph_api-0.16.0.dev12}/PKG-INFO +1 -1
- {langgraph_api-0.16.0.dev11 → langgraph_api-0.16.0.dev12}/benchmark/benchmark-runners/delta_turns.ts +11 -0
- {langgraph_api-0.16.0.dev11 → langgraph_api-0.16.0.dev12}/benchmark/delta-report.js +37 -18
- {langgraph_api-0.16.0.dev11 → langgraph_api-0.16.0.dev12}/benchmark/delta-report.test.js +31 -14
- langgraph_api-0.16.0.dev12/langgraph_api/__init__.py +1 -0
- {langgraph_api-0.16.0.dev11 → langgraph_api-0.16.0.dev12}/langgraph_api/api/a2a.py +214 -163
- {langgraph_api-0.16.0.dev11 → langgraph_api-0.16.0.dev12}/langgraph_api/config/__init__.py +6 -2
- langgraph_api-0.16.0.dev11/langgraph_api/__init__.py +0 -1
- {langgraph_api-0.16.0.dev11 → langgraph_api-0.16.0.dev12}/.gitignore +0 -0
- {langgraph_api-0.16.0.dev11 → langgraph_api-0.16.0.dev12}/LICENSE +0 -0
- {langgraph_api-0.16.0.dev11 → langgraph_api-0.16.0.dev12}/Makefile +0 -0
- {langgraph_api-0.16.0.dev11 → langgraph_api-0.16.0.dev12}/README.md +0 -0
- {langgraph_api-0.16.0.dev11 → langgraph_api-0.16.0.dev12}/benchmark/.gitignore +0 -0
- {langgraph_api-0.16.0.dev11 → langgraph_api-0.16.0.dev12}/benchmark/Makefile +0 -0
- {langgraph_api-0.16.0.dev11 → langgraph_api-0.16.0.dev12}/benchmark/README.md +0 -0
- {langgraph_api-0.16.0.dev11 → langgraph_api-0.16.0.dev12}/benchmark/benchmark-runners/assistant.ts +0 -0
- {langgraph_api-0.16.0.dev11 → langgraph_api-0.16.0.dev12}/benchmark/benchmark-runners/benchmark-runner.ts +0 -0
- {langgraph_api-0.16.0.dev11 → langgraph_api-0.16.0.dev12}/benchmark/benchmark-runners/benchmark_profiles.ts +0 -0
- {langgraph_api-0.16.0.dev11 → langgraph_api-0.16.0.dev12}/benchmark/benchmark-runners/benchmarks.ts +0 -0
- {langgraph_api-0.16.0.dev11 → langgraph_api-0.16.0.dev12}/benchmark/benchmark-runners/cancel_first_second_completes.ts +0 -0
- {langgraph_api-0.16.0.dev11 → langgraph_api-0.16.0.dev12}/benchmark/benchmark-runners/classify-error.test.js +0 -0
- {langgraph_api-0.16.0.dev11 → langgraph_api-0.16.0.dev12}/benchmark/benchmark-runners/classify-error.ts +0 -0
- {langgraph_api-0.16.0.dev11 → langgraph_api-0.16.0.dev12}/benchmark/benchmark-runners/delta-turns-lib.test.js +0 -0
- {langgraph_api-0.16.0.dev11 → langgraph_api-0.16.0.dev12}/benchmark/benchmark-runners/delta-turns-lib.ts +0 -0
- {langgraph_api-0.16.0.dev11 → langgraph_api-0.16.0.dev12}/benchmark/benchmark-runners/enqueued_runs_order.ts +0 -0
- {langgraph_api-0.16.0.dev11 → langgraph_api-0.16.0.dev12}/benchmark/benchmark-runners/interrupt_resume.ts +0 -0
- {langgraph_api-0.16.0.dev11 → langgraph_api-0.16.0.dev12}/benchmark/benchmark-runners/log-failure.ts +0 -0
- {langgraph_api-0.16.0.dev11 → langgraph_api-0.16.0.dev12}/benchmark/benchmark-runners/meta_workload.ts +0 -0
- {langgraph_api-0.16.0.dev11 → langgraph_api-0.16.0.dev12}/benchmark/benchmark-runners/store.ts +0 -0
- {langgraph_api-0.16.0.dev11 → langgraph_api-0.16.0.dev12}/benchmark/benchmark-runners/stream_write.ts +0 -0
- {langgraph_api-0.16.0.dev11 → langgraph_api-0.16.0.dev12}/benchmark/benchmark-runners/thread.ts +0 -0
- {langgraph_api-0.16.0.dev11 → langgraph_api-0.16.0.dev12}/benchmark/benchmark-runners/thread_runs_metadata_search.ts +0 -0
- {langgraph_api-0.16.0.dev11 → langgraph_api-0.16.0.dev12}/benchmark/benchmark-runners/threads_search_metadata.ts +0 -0
- {langgraph_api-0.16.0.dev11 → langgraph_api-0.16.0.dev12}/benchmark/benchmark-runners/types.ts +0 -0
- {langgraph_api-0.16.0.dev11 → langgraph_api-0.16.0.dev12}/benchmark/benchmark-runners/wait_write.ts +0 -0
- {langgraph_api-0.16.0.dev11 → langgraph_api-0.16.0.dev12}/benchmark/capacity-ci.js +0 -0
- {langgraph_api-0.16.0.dev11 → langgraph_api-0.16.0.dev12}/benchmark/capacity-ci.test.js +0 -0
- {langgraph_api-0.16.0.dev11 → langgraph_api-0.16.0.dev12}/benchmark/clean-cli.js +0 -0
- {langgraph_api-0.16.0.dev11 → langgraph_api-0.16.0.dev12}/benchmark/clean.js +0 -0
- {langgraph_api-0.16.0.dev11 → langgraph_api-0.16.0.dev12}/benchmark/continuous/README.md +0 -0
- {langgraph_api-0.16.0.dev11 → langgraph_api-0.16.0.dev12}/benchmark/continuous/pyproject.toml +0 -0
- {langgraph_api-0.16.0.dev11 → langgraph_api-0.16.0.dev12}/benchmark/continuous/runner.py +0 -0
- {langgraph_api-0.16.0.dev11 → langgraph_api-0.16.0.dev12}/benchmark/continuous/uv.lock +0 -0
- {langgraph_api-0.16.0.dev11 → langgraph_api-0.16.0.dev12}/benchmark/daily-report.js +0 -0
- {langgraph_api-0.16.0.dev11 → langgraph_api-0.16.0.dev12}/benchmark/daily-report.test.js +0 -0
- {langgraph_api-0.16.0.dev11 → langgraph_api-0.16.0.dev12}/benchmark/graphs.js +0 -0
- {langgraph_api-0.16.0.dev11 → langgraph_api-0.16.0.dev12}/benchmark/history.js +0 -0
- {langgraph_api-0.16.0.dev11 → langgraph_api-0.16.0.dev12}/benchmark/history.test.js +0 -0
- {langgraph_api-0.16.0.dev11 → langgraph_api-0.16.0.dev12}/benchmark/host-v2.js +0 -0
- {langgraph_api-0.16.0.dev11 → langgraph_api-0.16.0.dev12}/benchmark/host-v2.test.js +0 -0
- {langgraph_api-0.16.0.dev11 → langgraph_api-0.16.0.dev12}/benchmark/multer.test.js +0 -0
- {langgraph_api-0.16.0.dev11 → langgraph_api-0.16.0.dev12}/benchmark/package.json +0 -0
- {langgraph_api-0.16.0.dev11 → langgraph_api-0.16.0.dev12}/benchmark/ramp.js +0 -0
- {langgraph_api-0.16.0.dev11 → langgraph_api-0.16.0.dev12}/benchmark/reporting/dd_reporting.py +0 -0
- {langgraph_api-0.16.0.dev11 → langgraph_api-0.16.0.dev12}/benchmark/runner-descriptions.js +0 -0
- {langgraph_api-0.16.0.dev11 → langgraph_api-0.16.0.dev12}/benchmark/server-metrics.js +0 -0
- {langgraph_api-0.16.0.dev11 → langgraph_api-0.16.0.dev12}/benchmark/server-metrics.test.js +0 -0
- {langgraph_api-0.16.0.dev11 → langgraph_api-0.16.0.dev12}/benchmark/slack.js +0 -0
- {langgraph_api-0.16.0.dev11 → langgraph_api-0.16.0.dev12}/benchmark/staircase.py +0 -0
- {langgraph_api-0.16.0.dev11 → langgraph_api-0.16.0.dev12}/benchmark/staircase_step_k6.js +0 -0
- {langgraph_api-0.16.0.dev11 → langgraph_api-0.16.0.dev12}/benchmark/tsconfig.json +0 -0
- {langgraph_api-0.16.0.dev11 → langgraph_api-0.16.0.dev12}/benchmark/update-revision.js +0 -0
- {langgraph_api-0.16.0.dev11 → langgraph_api-0.16.0.dev12}/benchmark/weather.js +0 -0
- {langgraph_api-0.16.0.dev11 → langgraph_api-0.16.0.dev12}/benchmark/yarn.lock +0 -0
- {langgraph_api-0.16.0.dev11 → langgraph_api-0.16.0.dev12}/constraints.txt +0 -0
- {langgraph_api-0.16.0.dev11 → langgraph_api-0.16.0.dev12}/custom_store.sql +0 -0
- {langgraph_api-0.16.0.dev11 → langgraph_api-0.16.0.dev12}/forbidden.txt +0 -0
- {langgraph_api-0.16.0.dev11 → langgraph_api-0.16.0.dev12}/hatch_build.py +0 -0
- {langgraph_api-0.16.0.dev11 → langgraph_api-0.16.0.dev12}/healthcheck.py +0 -0
- {langgraph_api-0.16.0.dev11 → langgraph_api-0.16.0.dev12}/langgraph-cloud-debugging-20260210132856.zip +0 -0
- {langgraph_api-0.16.0.dev11 → langgraph_api-0.16.0.dev12}/langgraph_api/_checkpointer/__init__.py +0 -0
- {langgraph_api-0.16.0.dev11 → langgraph_api-0.16.0.dev12}/langgraph_api/_checkpointer/_adapter.py +0 -0
- {langgraph_api-0.16.0.dev11 → langgraph_api-0.16.0.dev12}/langgraph_api/_checkpointer/protocol.py +0 -0
- {langgraph_api-0.16.0.dev11 → langgraph_api-0.16.0.dev12}/langgraph_api/_factory_utils.py +0 -0
- {langgraph_api-0.16.0.dev11 → langgraph_api-0.16.0.dev12}/langgraph_api/api/__init__.py +0 -0
- {langgraph_api-0.16.0.dev11 → langgraph_api-0.16.0.dev12}/langgraph_api/api/a2ui.py +0 -0
- {langgraph_api-0.16.0.dev11 → langgraph_api-0.16.0.dev12}/langgraph_api/api/a2ui_schemas/README.md +0 -0
- {langgraph_api-0.16.0.dev11 → langgraph_api-0.16.0.dev12}/langgraph_api/api/a2ui_schemas/client_capabilities.json +0 -0
- {langgraph_api-0.16.0.dev11 → langgraph_api-0.16.0.dev12}/langgraph_api/api/a2ui_schemas/client_data_model.json +0 -0
- {langgraph_api-0.16.0.dev11 → langgraph_api-0.16.0.dev12}/langgraph_api/api/a2ui_schemas/client_to_server.json +0 -0
- {langgraph_api-0.16.0.dev11 → langgraph_api-0.16.0.dev12}/langgraph_api/api/a2ui_schemas/server_to_client.json +0 -0
- {langgraph_api-0.16.0.dev11 → langgraph_api-0.16.0.dev12}/langgraph_api/api/assistants.py +0 -0
- {langgraph_api-0.16.0.dev11 → langgraph_api-0.16.0.dev12}/langgraph_api/api/event_streaming.py +0 -0
- {langgraph_api-0.16.0.dev11 → langgraph_api-0.16.0.dev12}/langgraph_api/api/mcp/__init__.py +0 -0
- {langgraph_api-0.16.0.dev11 → langgraph_api-0.16.0.dev12}/langgraph_api/api/mcp/_constants.py +0 -0
- {langgraph_api-0.16.0.dev11 → langgraph_api-0.16.0.dev12}/langgraph_api/api/mcp/_handlers.py +0 -0
- {langgraph_api-0.16.0.dev11 → langgraph_api-0.16.0.dev12}/langgraph_api/api/mcp/_models.py +0 -0
- {langgraph_api-0.16.0.dev11 → langgraph_api-0.16.0.dev12}/langgraph_api/api/mcp/_routes.py +0 -0
- {langgraph_api-0.16.0.dev11 → langgraph_api-0.16.0.dev12}/langgraph_api/api/mcp/_sanitizers.py +0 -0
- {langgraph_api-0.16.0.dev11 → langgraph_api-0.16.0.dev12}/langgraph_api/api/meta.py +0 -0
- {langgraph_api-0.16.0.dev11 → langgraph_api-0.16.0.dev12}/langgraph_api/api/openapi.py +0 -0
- {langgraph_api-0.16.0.dev11 → langgraph_api-0.16.0.dev12}/langgraph_api/api/profile.py +0 -0
- {langgraph_api-0.16.0.dev11 → langgraph_api-0.16.0.dev12}/langgraph_api/api/runs.py +0 -0
- {langgraph_api-0.16.0.dev11 → langgraph_api-0.16.0.dev12}/langgraph_api/api/store.py +0 -0
- {langgraph_api-0.16.0.dev11 → langgraph_api-0.16.0.dev12}/langgraph_api/api/threads.py +0 -0
- {langgraph_api-0.16.0.dev11 → langgraph_api-0.16.0.dev12}/langgraph_api/api/ui.py +0 -0
- {langgraph_api-0.16.0.dev11 → langgraph_api-0.16.0.dev12}/langgraph_api/asgi_transport.py +0 -0
- {langgraph_api-0.16.0.dev11 → langgraph_api-0.16.0.dev12}/langgraph_api/asyncio.py +0 -0
- {langgraph_api-0.16.0.dev11 → langgraph_api-0.16.0.dev12}/langgraph_api/auth/__init__.py +0 -0
- {langgraph_api-0.16.0.dev11 → langgraph_api-0.16.0.dev12}/langgraph_api/auth/custom.py +0 -0
- {langgraph_api-0.16.0.dev11 → langgraph_api-0.16.0.dev12}/langgraph_api/auth/errors.py +0 -0
- {langgraph_api-0.16.0.dev11 → langgraph_api-0.16.0.dev12}/langgraph_api/auth/langsmith/__init__.py +0 -0
- {langgraph_api-0.16.0.dev11 → langgraph_api-0.16.0.dev12}/langgraph_api/auth/langsmith/backend.py +0 -0
- {langgraph_api-0.16.0.dev11 → langgraph_api-0.16.0.dev12}/langgraph_api/auth/langsmith/client.py +0 -0
- {langgraph_api-0.16.0.dev11 → langgraph_api-0.16.0.dev12}/langgraph_api/auth/middleware.py +0 -0
- {langgraph_api-0.16.0.dev11 → langgraph_api-0.16.0.dev12}/langgraph_api/auth/noop.py +0 -0
- {langgraph_api-0.16.0.dev11 → langgraph_api-0.16.0.dev12}/langgraph_api/auth/studio_user.py +0 -0
- {langgraph_api-0.16.0.dev11 → langgraph_api-0.16.0.dev12}/langgraph_api/beacon_data_plane_jwt_auth.py +0 -0
- {langgraph_api-0.16.0.dev11 → langgraph_api-0.16.0.dev12}/langgraph_api/cache.py +0 -0
- {langgraph_api-0.16.0.dev11 → langgraph_api-0.16.0.dev12}/langgraph_api/cli.py +0 -0
- {langgraph_api-0.16.0.dev11 → langgraph_api-0.16.0.dev12}/langgraph_api/command.py +0 -0
- {langgraph_api-0.16.0.dev11 → langgraph_api-0.16.0.dev12}/langgraph_api/config/_parse.py +0 -0
- {langgraph_api-0.16.0.dev11 → langgraph_api-0.16.0.dev12}/langgraph_api/config/schemas.py +0 -0
- {langgraph_api-0.16.0.dev11 → langgraph_api-0.16.0.dev12}/langgraph_api/cron_scheduler.py +0 -0
- {langgraph_api-0.16.0.dev11 → langgraph_api-0.16.0.dev12}/langgraph_api/encryption/__init__.py +0 -0
- {langgraph_api-0.16.0.dev11 → langgraph_api-0.16.0.dev12}/langgraph_api/encryption/aes_json.py +0 -0
- {langgraph_api-0.16.0.dev11 → langgraph_api-0.16.0.dev12}/langgraph_api/encryption/context.py +0 -0
- {langgraph_api-0.16.0.dev11 → langgraph_api-0.16.0.dev12}/langgraph_api/encryption/custom.py +0 -0
- {langgraph_api-0.16.0.dev11 → langgraph_api-0.16.0.dev12}/langgraph_api/encryption/middleware.py +0 -0
- {langgraph_api-0.16.0.dev11 → langgraph_api-0.16.0.dev12}/langgraph_api/encryption/shared.py +0 -0
- {langgraph_api-0.16.0.dev11 → langgraph_api-0.16.0.dev12}/langgraph_api/errors.py +0 -0
- {langgraph_api-0.16.0.dev11 → langgraph_api-0.16.0.dev12}/langgraph_api/event_streaming/__init__.py +0 -0
- {langgraph_api-0.16.0.dev11 → langgraph_api-0.16.0.dev12}/langgraph_api/event_streaming/capabilities.py +0 -0
- {langgraph_api-0.16.0.dev11 → langgraph_api-0.16.0.dev12}/langgraph_api/event_streaming/constants.py +0 -0
- {langgraph_api-0.16.0.dev11 → langgraph_api-0.16.0.dev12}/langgraph_api/event_streaming/event_normalizers.py +0 -0
- {langgraph_api-0.16.0.dev11 → langgraph_api-0.16.0.dev12}/langgraph_api/event_streaming/namespace.py +0 -0
- {langgraph_api-0.16.0.dev11 → langgraph_api-0.16.0.dev12}/langgraph_api/event_streaming/service.py +0 -0
- {langgraph_api-0.16.0.dev11 → langgraph_api-0.16.0.dev12}/langgraph_api/event_streaming/session.py +0 -0
- {langgraph_api-0.16.0.dev11 → langgraph_api-0.16.0.dev12}/langgraph_api/event_streaming/state_normalizers.py +0 -0
- {langgraph_api-0.16.0.dev11 → langgraph_api-0.16.0.dev12}/langgraph_api/event_streaming/types.py +0 -0
- {langgraph_api-0.16.0.dev11 → langgraph_api-0.16.0.dev12}/langgraph_api/feature_flags.py +0 -0
- {langgraph_api-0.16.0.dev11 → langgraph_api-0.16.0.dev12}/langgraph_api/graph.py +0 -0
- {langgraph_api-0.16.0.dev11 → langgraph_api-0.16.0.dev12}/langgraph_api/grpc/__init__.py +0 -0
- {langgraph_api-0.16.0.dev11 → langgraph_api-0.16.0.dev12}/langgraph_api/grpc/client.py +0 -0
- {langgraph_api-0.16.0.dev11 → langgraph_api-0.16.0.dev12}/langgraph_api/grpc/generated/core_api_pb2.pyi +0 -0
- {langgraph_api-0.16.0.dev11 → langgraph_api-0.16.0.dev12}/langgraph_api/grpc/ops/__init__.py +0 -0
- {langgraph_api-0.16.0.dev11 → langgraph_api-0.16.0.dev12}/langgraph_api/grpc/ops/assistants.py +0 -0
- {langgraph_api-0.16.0.dev11 → langgraph_api-0.16.0.dev12}/langgraph_api/grpc/ops/cache.py +0 -0
- {langgraph_api-0.16.0.dev11 → langgraph_api-0.16.0.dev12}/langgraph_api/grpc/ops/crons.py +0 -0
- {langgraph_api-0.16.0.dev11 → langgraph_api-0.16.0.dev12}/langgraph_api/grpc/ops/runs.py +0 -0
- {langgraph_api-0.16.0.dev11 → langgraph_api-0.16.0.dev12}/langgraph_api/grpc/ops/threads.py +0 -0
- {langgraph_api-0.16.0.dev11 → langgraph_api-0.16.0.dev12}/langgraph_api/grpc/server.py +0 -0
- {langgraph_api-0.16.0.dev11 → langgraph_api-0.16.0.dev12}/langgraph_api/grpc/servicers/__init__.py +0 -0
- {langgraph_api-0.16.0.dev11 → langgraph_api-0.16.0.dev12}/langgraph_api/grpc/servicers/checkpointer.py +0 -0
- {langgraph_api-0.16.0.dev11 → langgraph_api-0.16.0.dev12}/langgraph_api/grpc/servicers/encryption.py +0 -0
- {langgraph_api-0.16.0.dev11 → langgraph_api-0.16.0.dev12}/langgraph_api/http.py +0 -0
- {langgraph_api-0.16.0.dev11 → langgraph_api-0.16.0.dev12}/langgraph_api/http_metrics.py +0 -0
- {langgraph_api-0.16.0.dev11 → langgraph_api-0.16.0.dev12}/langgraph_api/http_metrics_utils.py +0 -0
- {langgraph_api-0.16.0.dev11 → langgraph_api-0.16.0.dev12}/langgraph_api/js/.gitignore +0 -0
- {langgraph_api-0.16.0.dev11 → langgraph_api-0.16.0.dev12}/langgraph_api/js/.prettierrc +0 -0
- {langgraph_api-0.16.0.dev11 → langgraph_api-0.16.0.dev12}/langgraph_api/js/.yarnclean +0 -0
- {langgraph_api-0.16.0.dev11 → langgraph_api-0.16.0.dev12}/langgraph_api/js/__init__.py +0 -0
- {langgraph_api-0.16.0.dev11 → langgraph_api-0.16.0.dev12}/langgraph_api/js/base.py +0 -0
- {langgraph_api-0.16.0.dev11 → langgraph_api-0.16.0.dev12}/langgraph_api/js/build.mts +0 -0
- {langgraph_api-0.16.0.dev11 → langgraph_api-0.16.0.dev12}/langgraph_api/js/client.http.mts +0 -0
- {langgraph_api-0.16.0.dev11 → langgraph_api-0.16.0.dev12}/langgraph_api/js/client.mts +0 -0
- {langgraph_api-0.16.0.dev11 → langgraph_api-0.16.0.dev12}/langgraph_api/js/errors.py +0 -0
- {langgraph_api-0.16.0.dev11 → langgraph_api-0.16.0.dev12}/langgraph_api/js/global.d.ts +0 -0
- {langgraph_api-0.16.0.dev11 → langgraph_api-0.16.0.dev12}/langgraph_api/js/package.json +0 -0
- {langgraph_api-0.16.0.dev11 → langgraph_api-0.16.0.dev12}/langgraph_api/js/remote.py +0 -0
- {langgraph_api-0.16.0.dev11 → langgraph_api-0.16.0.dev12}/langgraph_api/js/schema.py +0 -0
- {langgraph_api-0.16.0.dev11 → langgraph_api-0.16.0.dev12}/langgraph_api/js/src/auth-mutations.mts +0 -0
- {langgraph_api-0.16.0.dev11 → langgraph_api-0.16.0.dev12}/langgraph_api/js/src/graph.mts +0 -0
- {langgraph_api-0.16.0.dev11 → langgraph_api-0.16.0.dev12}/langgraph_api/js/src/load.hooks.mjs +0 -0
- {langgraph_api-0.16.0.dev11 → langgraph_api-0.16.0.dev12}/langgraph_api/js/src/preload.mjs +0 -0
- {langgraph_api-0.16.0.dev11 → langgraph_api-0.16.0.dev12}/langgraph_api/js/src/utils/experiment-tracing.mts +0 -0
- {langgraph_api-0.16.0.dev11 → langgraph_api-0.16.0.dev12}/langgraph_api/js/src/utils/files.mts +0 -0
- {langgraph_api-0.16.0.dev11 → langgraph_api-0.16.0.dev12}/langgraph_api/js/src/utils/importMap.mts +0 -0
- {langgraph_api-0.16.0.dev11 → langgraph_api-0.16.0.dev12}/langgraph_api/js/src/utils/pythonSchemas.mts +0 -0
- {langgraph_api-0.16.0.dev11 → langgraph_api-0.16.0.dev12}/langgraph_api/js/src/utils/serde.mts +0 -0
- {langgraph_api-0.16.0.dev11 → langgraph_api-0.16.0.dev12}/langgraph_api/js/sse.py +0 -0
- {langgraph_api-0.16.0.dev11 → langgraph_api-0.16.0.dev12}/langgraph_api/js/traceblock.mts +0 -0
- {langgraph_api-0.16.0.dev11 → langgraph_api-0.16.0.dev12}/langgraph_api/js/tsconfig.json +0 -0
- {langgraph_api-0.16.0.dev11 → langgraph_api-0.16.0.dev12}/langgraph_api/js/ui.py +0 -0
- {langgraph_api-0.16.0.dev11 → langgraph_api-0.16.0.dev12}/langgraph_api/js/yarn.lock +0 -0
- {langgraph_api-0.16.0.dev11 → langgraph_api-0.16.0.dev12}/langgraph_api/lc_security/__init__.py +0 -0
- {langgraph_api-0.16.0.dev11 → langgraph_api-0.16.0.dev12}/langgraph_api/lc_security/exceptions.py +0 -0
- {langgraph_api-0.16.0.dev11 → langgraph_api-0.16.0.dev12}/langgraph_api/lc_security/policy.py +0 -0
- {langgraph_api-0.16.0.dev11 → langgraph_api-0.16.0.dev12}/langgraph_api/lc_security/transport.py +0 -0
- {langgraph_api-0.16.0.dev11 → langgraph_api-0.16.0.dev12}/langgraph_api/logging.py +0 -0
- {langgraph_api-0.16.0.dev11 → langgraph_api-0.16.0.dev12}/langgraph_api/metadata.py +0 -0
- {langgraph_api-0.16.0.dev11 → langgraph_api-0.16.0.dev12}/langgraph_api/metrics_collector.py +0 -0
- {langgraph_api-0.16.0.dev11 → langgraph_api-0.16.0.dev12}/langgraph_api/metrics_otlp.py +0 -0
- {langgraph_api-0.16.0.dev11 → langgraph_api-0.16.0.dev12}/langgraph_api/middleware/__init__.py +0 -0
- {langgraph_api-0.16.0.dev11 → langgraph_api-0.16.0.dev12}/langgraph_api/middleware/ensure_store.py +0 -0
- {langgraph_api-0.16.0.dev11 → langgraph_api-0.16.0.dev12}/langgraph_api/middleware/http_logger.py +0 -0
- {langgraph_api-0.16.0.dev11 → langgraph_api-0.16.0.dev12}/langgraph_api/middleware/private_network.py +0 -0
- {langgraph_api-0.16.0.dev11 → langgraph_api-0.16.0.dev12}/langgraph_api/middleware/request_id.py +0 -0
- {langgraph_api-0.16.0.dev11 → langgraph_api-0.16.0.dev12}/langgraph_api/models/__init__.py +0 -0
- {langgraph_api-0.16.0.dev11 → langgraph_api-0.16.0.dev12}/langgraph_api/models/run.py +0 -0
- {langgraph_api-0.16.0.dev11 → langgraph_api-0.16.0.dev12}/langgraph_api/otel_context.py +0 -0
- {langgraph_api-0.16.0.dev11 → langgraph_api-0.16.0.dev12}/langgraph_api/patch.py +0 -0
- {langgraph_api-0.16.0.dev11 → langgraph_api-0.16.0.dev12}/langgraph_api/queue_entrypoint.py +0 -0
- {langgraph_api-0.16.0.dev11 → langgraph_api-0.16.0.dev12}/langgraph_api/release_tags.py +0 -0
- {langgraph_api-0.16.0.dev11 → langgraph_api-0.16.0.dev12}/langgraph_api/route.py +0 -0
- {langgraph_api-0.16.0.dev11 → langgraph_api-0.16.0.dev12}/langgraph_api/runner/__init__.py +0 -0
- {langgraph_api-0.16.0.dev11 → langgraph_api-0.16.0.dev12}/langgraph_api/runner/__main__.py +0 -0
- {langgraph_api-0.16.0.dev11 → langgraph_api-0.16.0.dev12}/langgraph_api/schema.py +0 -0
- {langgraph_api-0.16.0.dev11 → langgraph_api-0.16.0.dev12}/langgraph_api/self_hosted_logs.py +0 -0
- {langgraph_api-0.16.0.dev11 → langgraph_api-0.16.0.dev12}/langgraph_api/self_hosted_metrics.py +0 -0
- {langgraph_api-0.16.0.dev11 → langgraph_api-0.16.0.dev12}/langgraph_api/serde.py +0 -0
- {langgraph_api-0.16.0.dev11 → langgraph_api-0.16.0.dev12}/langgraph_api/server.py +0 -0
- {langgraph_api-0.16.0.dev11 → langgraph_api-0.16.0.dev12}/langgraph_api/sse.py +0 -0
- {langgraph_api-0.16.0.dev11 → langgraph_api-0.16.0.dev12}/langgraph_api/state.py +0 -0
- {langgraph_api-0.16.0.dev11 → langgraph_api-0.16.0.dev12}/langgraph_api/store.py +0 -0
- {langgraph_api-0.16.0.dev11 → langgraph_api-0.16.0.dev12}/langgraph_api/stream.py +0 -0
- {langgraph_api-0.16.0.dev11 → langgraph_api-0.16.0.dev12}/langgraph_api/stream_v2.py +0 -0
- {langgraph_api-0.16.0.dev11 → langgraph_api-0.16.0.dev12}/langgraph_api/timing/__init__.py +0 -0
- {langgraph_api-0.16.0.dev11 → langgraph_api-0.16.0.dev12}/langgraph_api/timing/profiler.py +0 -0
- {langgraph_api-0.16.0.dev11 → langgraph_api-0.16.0.dev12}/langgraph_api/timing/timer.py +0 -0
- {langgraph_api-0.16.0.dev11 → langgraph_api-0.16.0.dev12}/langgraph_api/traceblock.py +0 -0
- {langgraph_api-0.16.0.dev11 → langgraph_api-0.16.0.dev12}/langgraph_api/tracing_session.py +0 -0
- {langgraph_api-0.16.0.dev11 → langgraph_api-0.16.0.dev12}/langgraph_api/tunneling/cloudflare.py +0 -0
- {langgraph_api-0.16.0.dev11 → langgraph_api-0.16.0.dev12}/langgraph_api/utils/__init__.py +0 -0
- {langgraph_api-0.16.0.dev11 → langgraph_api-0.16.0.dev12}/langgraph_api/utils/cache.py +0 -0
- {langgraph_api-0.16.0.dev11 → langgraph_api-0.16.0.dev12}/langgraph_api/utils/config.py +0 -0
- {langgraph_api-0.16.0.dev11 → langgraph_api-0.16.0.dev12}/langgraph_api/utils/errors.py +0 -0
- {langgraph_api-0.16.0.dev11 → langgraph_api-0.16.0.dev12}/langgraph_api/utils/extract.py +0 -0
- {langgraph_api-0.16.0.dev11 → langgraph_api-0.16.0.dev12}/langgraph_api/utils/future.py +0 -0
- {langgraph_api-0.16.0.dev11 → langgraph_api-0.16.0.dev12}/langgraph_api/utils/headers.py +0 -0
- {langgraph_api-0.16.0.dev11 → langgraph_api-0.16.0.dev12}/langgraph_api/utils/network.py +0 -0
- {langgraph_api-0.16.0.dev11 → langgraph_api-0.16.0.dev12}/langgraph_api/utils/retriable_client.py +0 -0
- {langgraph_api-0.16.0.dev11 → langgraph_api-0.16.0.dev12}/langgraph_api/utils/stream_codec.py +0 -0
- {langgraph_api-0.16.0.dev11 → langgraph_api-0.16.0.dev12}/langgraph_api/utils/uuids.py +0 -0
- {langgraph_api-0.16.0.dev11 → langgraph_api-0.16.0.dev12}/langgraph_api/validation.py +0 -0
- {langgraph_api-0.16.0.dev11 → langgraph_api-0.16.0.dev12}/langgraph_api/webhook.py +0 -0
- {langgraph_api-0.16.0.dev11 → langgraph_api-0.16.0.dev12}/langgraph_api/worker.py +0 -0
- {langgraph_api-0.16.0.dev11 → langgraph_api-0.16.0.dev12}/langgraph_api/worker_runtime.py +0 -0
- {langgraph_api-0.16.0.dev11 → langgraph_api-0.16.0.dev12}/langgraph_grpc_common/__init__.py +0 -0
- {langgraph_api-0.16.0.dev11 → langgraph_api-0.16.0.dev12}/langgraph_grpc_common/checkpointer.py +0 -0
- {langgraph_api-0.16.0.dev11 → langgraph_api-0.16.0.dev12}/langgraph_grpc_common/conversion/__init__.py +0 -0
- {langgraph_api-0.16.0.dev11 → langgraph_api-0.16.0.dev12}/langgraph_grpc_common/conversion/_compat.py +0 -0
- {langgraph_api-0.16.0.dev11 → langgraph_api-0.16.0.dev12}/langgraph_grpc_common/conversion/checkpoint.py +0 -0
- {langgraph_api-0.16.0.dev11 → langgraph_api-0.16.0.dev12}/langgraph_grpc_common/conversion/config.py +0 -0
- {langgraph_api-0.16.0.dev11 → langgraph_api-0.16.0.dev12}/langgraph_grpc_common/conversion/durability.py +0 -0
- {langgraph_api-0.16.0.dev11 → langgraph_api-0.16.0.dev12}/langgraph_grpc_common/conversion/store.py +0 -0
- {langgraph_api-0.16.0.dev11 → langgraph_api-0.16.0.dev12}/langgraph_grpc_common/conversion/struct.py +0 -0
- {langgraph_api-0.16.0.dev11 → langgraph_api-0.16.0.dev12}/langgraph_grpc_common/conversion/value.py +0 -0
- {langgraph_api-0.16.0.dev11 → langgraph_api-0.16.0.dev12}/langgraph_grpc_common/proto/__init__.py +0 -0
- {langgraph_api-0.16.0.dev11 → langgraph_api-0.16.0.dev12}/langgraph_grpc_common/proto/checkpointer_pb2.py +0 -0
- {langgraph_api-0.16.0.dev11 → langgraph_api-0.16.0.dev12}/langgraph_grpc_common/proto/checkpointer_pb2.pyi +0 -0
- {langgraph_api-0.16.0.dev11 → langgraph_api-0.16.0.dev12}/langgraph_grpc_common/proto/checkpointer_pb2_grpc.py +0 -0
- {langgraph_api-0.16.0.dev11 → langgraph_api-0.16.0.dev12}/langgraph_grpc_common/proto/checkpointer_pb2_grpc.pyi +0 -0
- {langgraph_api-0.16.0.dev11 → langgraph_api-0.16.0.dev12}/langgraph_grpc_common/proto/core_api_pb2.py +0 -0
- {langgraph_api-0.16.0.dev11 → langgraph_api-0.16.0.dev12}/langgraph_grpc_common/proto/core_api_pb2.pyi +0 -0
- {langgraph_api-0.16.0.dev11 → langgraph_api-0.16.0.dev12}/langgraph_grpc_common/proto/core_api_pb2_grpc.py +0 -0
- {langgraph_api-0.16.0.dev11 → langgraph_api-0.16.0.dev12}/langgraph_grpc_common/proto/core_api_pb2_grpc.pyi +0 -0
- {langgraph_api-0.16.0.dev11 → langgraph_api-0.16.0.dev12}/langgraph_grpc_common/proto/encryption_pb2.py +0 -0
- {langgraph_api-0.16.0.dev11 → langgraph_api-0.16.0.dev12}/langgraph_grpc_common/proto/encryption_pb2.pyi +0 -0
- {langgraph_api-0.16.0.dev11 → langgraph_api-0.16.0.dev12}/langgraph_grpc_common/proto/encryption_pb2_grpc.py +0 -0
- {langgraph_api-0.16.0.dev11 → langgraph_api-0.16.0.dev12}/langgraph_grpc_common/proto/encryption_pb2_grpc.pyi +0 -0
- {langgraph_api-0.16.0.dev11 → langgraph_api-0.16.0.dev12}/langgraph_grpc_common/proto/engine_common_pb2.py +0 -0
- {langgraph_api-0.16.0.dev11 → langgraph_api-0.16.0.dev12}/langgraph_grpc_common/proto/engine_common_pb2.pyi +0 -0
- {langgraph_api-0.16.0.dev11 → langgraph_api-0.16.0.dev12}/langgraph_grpc_common/proto/engine_common_pb2_grpc.py +0 -0
- {langgraph_api-0.16.0.dev11 → langgraph_api-0.16.0.dev12}/langgraph_grpc_common/proto/engine_common_pb2_grpc.pyi +0 -0
- {langgraph_api-0.16.0.dev11 → langgraph_api-0.16.0.dev12}/langgraph_grpc_common/proto/enum_cancel_run_action_pb2.py +0 -0
- {langgraph_api-0.16.0.dev11 → langgraph_api-0.16.0.dev12}/langgraph_grpc_common/proto/enum_cancel_run_action_pb2.pyi +0 -0
- {langgraph_api-0.16.0.dev11 → langgraph_api-0.16.0.dev12}/langgraph_grpc_common/proto/enum_cancel_run_action_pb2_grpc.py +0 -0
- {langgraph_api-0.16.0.dev11 → langgraph_api-0.16.0.dev12}/langgraph_grpc_common/proto/enum_cancel_run_action_pb2_grpc.pyi +0 -0
- {langgraph_api-0.16.0.dev11 → langgraph_api-0.16.0.dev12}/langgraph_grpc_common/proto/enum_control_signal_pb2.py +0 -0
- {langgraph_api-0.16.0.dev11 → langgraph_api-0.16.0.dev12}/langgraph_grpc_common/proto/enum_control_signal_pb2.pyi +0 -0
- {langgraph_api-0.16.0.dev11 → langgraph_api-0.16.0.dev12}/langgraph_grpc_common/proto/enum_control_signal_pb2_grpc.py +0 -0
- {langgraph_api-0.16.0.dev11 → langgraph_api-0.16.0.dev12}/langgraph_grpc_common/proto/enum_control_signal_pb2_grpc.pyi +0 -0
- {langgraph_api-0.16.0.dev11 → langgraph_api-0.16.0.dev12}/langgraph_grpc_common/proto/enum_cron_on_run_completed_pb2.py +0 -0
- {langgraph_api-0.16.0.dev11 → langgraph_api-0.16.0.dev12}/langgraph_grpc_common/proto/enum_cron_on_run_completed_pb2.pyi +0 -0
- {langgraph_api-0.16.0.dev11 → langgraph_api-0.16.0.dev12}/langgraph_grpc_common/proto/enum_cron_on_run_completed_pb2_grpc.py +0 -0
- {langgraph_api-0.16.0.dev11 → langgraph_api-0.16.0.dev12}/langgraph_grpc_common/proto/enum_cron_on_run_completed_pb2_grpc.pyi +0 -0
- {langgraph_api-0.16.0.dev11 → langgraph_api-0.16.0.dev12}/langgraph_grpc_common/proto/enum_durability_pb2.py +0 -0
- {langgraph_api-0.16.0.dev11 → langgraph_api-0.16.0.dev12}/langgraph_grpc_common/proto/enum_durability_pb2.pyi +0 -0
- {langgraph_api-0.16.0.dev11 → langgraph_api-0.16.0.dev12}/langgraph_grpc_common/proto/enum_durability_pb2_grpc.py +0 -0
- {langgraph_api-0.16.0.dev11 → langgraph_api-0.16.0.dev12}/langgraph_grpc_common/proto/enum_durability_pb2_grpc.pyi +0 -0
- {langgraph_api-0.16.0.dev11 → langgraph_api-0.16.0.dev12}/langgraph_grpc_common/proto/enum_multitask_strategy_pb2.py +0 -0
- {langgraph_api-0.16.0.dev11 → langgraph_api-0.16.0.dev12}/langgraph_grpc_common/proto/enum_multitask_strategy_pb2.pyi +0 -0
- {langgraph_api-0.16.0.dev11 → langgraph_api-0.16.0.dev12}/langgraph_grpc_common/proto/enum_multitask_strategy_pb2_grpc.py +0 -0
- {langgraph_api-0.16.0.dev11 → langgraph_api-0.16.0.dev12}/langgraph_grpc_common/proto/enum_multitask_strategy_pb2_grpc.pyi +0 -0
- {langgraph_api-0.16.0.dev11 → langgraph_api-0.16.0.dev12}/langgraph_grpc_common/proto/enum_run_status_pb2.py +0 -0
- {langgraph_api-0.16.0.dev11 → langgraph_api-0.16.0.dev12}/langgraph_grpc_common/proto/enum_run_status_pb2.pyi +0 -0
- {langgraph_api-0.16.0.dev11 → langgraph_api-0.16.0.dev12}/langgraph_grpc_common/proto/enum_run_status_pb2_grpc.py +0 -0
- {langgraph_api-0.16.0.dev11 → langgraph_api-0.16.0.dev12}/langgraph_grpc_common/proto/enum_run_status_pb2_grpc.pyi +0 -0
- {langgraph_api-0.16.0.dev11 → langgraph_api-0.16.0.dev12}/langgraph_grpc_common/proto/enum_stream_mode_pb2.py +0 -0
- {langgraph_api-0.16.0.dev11 → langgraph_api-0.16.0.dev12}/langgraph_grpc_common/proto/enum_stream_mode_pb2.pyi +0 -0
- {langgraph_api-0.16.0.dev11 → langgraph_api-0.16.0.dev12}/langgraph_grpc_common/proto/enum_stream_mode_pb2_grpc.py +0 -0
- {langgraph_api-0.16.0.dev11 → langgraph_api-0.16.0.dev12}/langgraph_grpc_common/proto/enum_stream_mode_pb2_grpc.pyi +0 -0
- {langgraph_api-0.16.0.dev11 → langgraph_api-0.16.0.dev12}/langgraph_grpc_common/proto/enum_thread_status_pb2.py +0 -0
- {langgraph_api-0.16.0.dev11 → langgraph_api-0.16.0.dev12}/langgraph_grpc_common/proto/enum_thread_status_pb2.pyi +0 -0
- {langgraph_api-0.16.0.dev11 → langgraph_api-0.16.0.dev12}/langgraph_grpc_common/proto/enum_thread_status_pb2_grpc.py +0 -0
- {langgraph_api-0.16.0.dev11 → langgraph_api-0.16.0.dev12}/langgraph_grpc_common/proto/enum_thread_status_pb2_grpc.pyi +0 -0
- {langgraph_api-0.16.0.dev11 → langgraph_api-0.16.0.dev12}/langgraph_grpc_common/proto/enum_thread_stream_mode_pb2.py +0 -0
- {langgraph_api-0.16.0.dev11 → langgraph_api-0.16.0.dev12}/langgraph_grpc_common/proto/enum_thread_stream_mode_pb2.pyi +0 -0
- {langgraph_api-0.16.0.dev11 → langgraph_api-0.16.0.dev12}/langgraph_grpc_common/proto/enum_thread_stream_mode_pb2_grpc.py +0 -0
- {langgraph_api-0.16.0.dev11 → langgraph_api-0.16.0.dev12}/langgraph_grpc_common/proto/enum_thread_stream_mode_pb2_grpc.pyi +0 -0
- {langgraph_api-0.16.0.dev11 → langgraph_api-0.16.0.dev12}/langgraph_grpc_common/proto/errors_pb2.py +0 -0
- {langgraph_api-0.16.0.dev11 → langgraph_api-0.16.0.dev12}/langgraph_grpc_common/proto/errors_pb2.pyi +0 -0
- {langgraph_api-0.16.0.dev11 → langgraph_api-0.16.0.dev12}/langgraph_grpc_common/proto/errors_pb2_grpc.py +0 -0
- {langgraph_api-0.16.0.dev11 → langgraph_api-0.16.0.dev12}/langgraph_grpc_common/proto/errors_pb2_grpc.pyi +0 -0
- {langgraph_api-0.16.0.dev11 → langgraph_api-0.16.0.dev12}/langgraph_grpc_common/proto/runner_pb2.py +0 -0
- {langgraph_api-0.16.0.dev11 → langgraph_api-0.16.0.dev12}/langgraph_grpc_common/proto/runner_pb2.pyi +0 -0
- {langgraph_api-0.16.0.dev11 → langgraph_api-0.16.0.dev12}/langgraph_grpc_common/proto/runner_pb2_grpc.py +0 -0
- {langgraph_api-0.16.0.dev11 → langgraph_api-0.16.0.dev12}/langgraph_grpc_common/proto/runner_pb2_grpc.pyi +0 -0
- {langgraph_api-0.16.0.dev11 → langgraph_api-0.16.0.dev12}/langgraph_grpc_common/proto/store_pb2.py +0 -0
- {langgraph_api-0.16.0.dev11 → langgraph_api-0.16.0.dev12}/langgraph_grpc_common/proto/store_pb2.pyi +0 -0
- {langgraph_api-0.16.0.dev11 → langgraph_api-0.16.0.dev12}/langgraph_grpc_common/proto/store_pb2_grpc.py +0 -0
- {langgraph_api-0.16.0.dev11 → langgraph_api-0.16.0.dev12}/langgraph_grpc_common/proto/store_pb2_grpc.pyi +0 -0
- {langgraph_api-0.16.0.dev11 → langgraph_api-0.16.0.dev12}/langgraph_grpc_common/serde.py +0 -0
- {langgraph_api-0.16.0.dev11 → langgraph_api-0.16.0.dev12}/langgraph_grpc_common/store.py +0 -0
- {langgraph_api-0.16.0.dev11 → langgraph_api-0.16.0.dev12}/langgraph_license/__init__.py +0 -0
- {langgraph_api-0.16.0.dev11 → langgraph_api-0.16.0.dev12}/langgraph_license/validation.py +0 -0
- {langgraph_api-0.16.0.dev11 → langgraph_api-0.16.0.dev12}/langgraph_runtime/__init__.py +0 -0
- {langgraph_api-0.16.0.dev11 → langgraph_api-0.16.0.dev12}/langgraph_runtime/checkpoint.py +0 -0
- {langgraph_api-0.16.0.dev11 → langgraph_api-0.16.0.dev12}/langgraph_runtime/database.py +0 -0
- {langgraph_api-0.16.0.dev11 → langgraph_api-0.16.0.dev12}/langgraph_runtime/lifespan.py +0 -0
- {langgraph_api-0.16.0.dev11 → langgraph_api-0.16.0.dev12}/langgraph_runtime/metrics.py +0 -0
- {langgraph_api-0.16.0.dev11 → langgraph_api-0.16.0.dev12}/langgraph_runtime/ops.py +0 -0
- {langgraph_api-0.16.0.dev11 → langgraph_api-0.16.0.dev12}/langgraph_runtime/queue.py +0 -0
- {langgraph_api-0.16.0.dev11 → langgraph_api-0.16.0.dev12}/langgraph_runtime/retry.py +0 -0
- {langgraph_api-0.16.0.dev11 → langgraph_api-0.16.0.dev12}/langgraph_runtime/routes.py +0 -0
- {langgraph_api-0.16.0.dev11 → langgraph_api-0.16.0.dev12}/langgraph_runtime/store.py +0 -0
- {langgraph_api-0.16.0.dev11 → langgraph_api-0.16.0.dev12}/logging.json +0 -0
- {langgraph_api-0.16.0.dev11 → langgraph_api-0.16.0.dev12}/openapi.json +0 -0
- {langgraph_api-0.16.0.dev11 → langgraph_api-0.16.0.dev12}/pyproject.toml +0 -0
- {langgraph_api-0.16.0.dev11 → langgraph_api-0.16.0.dev12}/scripts/build_wheel.py +0 -0
- {langgraph_api-0.16.0.dev11 → langgraph_api-0.16.0.dev12}/scripts/create_license.py +0 -0
- {langgraph_api-0.16.0.dev11 → langgraph_api-0.16.0.dev12}/scripts/run_a2a_tck.py +0 -0
- {langgraph_api-0.16.0.dev11 → langgraph_api-0.16.0.dev12}/uv.lock +0 -0
{langgraph_api-0.16.0.dev11 → langgraph_api-0.16.0.dev12}/benchmark/benchmark-runners/delta_turns.ts
RENAMED
|
@@ -32,6 +32,7 @@ const PAYLOAD_CHANNELS = [
|
|
|
32
32
|
const turnDuration = new Trend('turn_duration', true);
|
|
33
33
|
/** The read path alone: a cold GET /state replays the channel without writing. */
|
|
34
34
|
const stateReadDuration = new Trend('state_read_duration', true);
|
|
35
|
+
const checkpointSaveDuration = new Trend('checkpoint_save', true);
|
|
35
36
|
const threadStorageBytes = new Trend('thread_storage_bytes', false);
|
|
36
37
|
|
|
37
38
|
const TURN_CONFIG: Omit<DeltaTurnsOptions, 'graphId'> = {
|
|
@@ -85,6 +86,9 @@ export class DeltaTurns extends BenchmarkRunner {
|
|
|
85
86
|
input: {},
|
|
86
87
|
context: { ...benchmarkGraphOptions.context, steps: plan.steps },
|
|
87
88
|
config: { recursion_limit: plan.steps + 2 },
|
|
89
|
+
// The graph times its own checkpoint save as the gap between its two
|
|
90
|
+
// steps; a background save would overlap the second step and hide in it.
|
|
91
|
+
durability: 'sync',
|
|
88
92
|
});
|
|
89
93
|
|
|
90
94
|
const startedAt = Date.now();
|
|
@@ -95,6 +99,13 @@ export class DeltaTurns extends BenchmarkRunner {
|
|
|
95
99
|
);
|
|
96
100
|
turnDuration.add(Date.now() - startedAt, { depth: plan.depthBucket });
|
|
97
101
|
addResponse(responses, 'wait', response);
|
|
102
|
+
const saveMs = response.status === 200 ? safeJson(response.body)?.save_ms : null;
|
|
103
|
+
if (typeof saveMs === 'number' && saveMs > 0) {
|
|
104
|
+
// Snapshots land on multiples of the bucket width, so the bucket's last
|
|
105
|
+
// turn is where a snapshot save shows; a percentile over the bucket hides it.
|
|
106
|
+
const rowTurn = plan.steps % TURN_CONFIG.bucketSize === 0 ? '1' : '0';
|
|
107
|
+
checkpointSaveDuration.add(saveMs, { depth: plan.depthBucket, row_turn: rowTurn });
|
|
108
|
+
}
|
|
98
109
|
|
|
99
110
|
let guardFailure: string | null = null;
|
|
100
111
|
let drift: string | null = null;
|
|
@@ -29,7 +29,7 @@ export const HEADLINE = ['control', 'delta_50'];
|
|
|
29
29
|
/** Metric key, label, printer. All three are lower-is-better. */
|
|
30
30
|
const METRICS = [
|
|
31
31
|
['readP50Ms', 'read', (v) => (isNumber(v) ? (v / 1000).toFixed(2) : '-')],
|
|
32
|
-
['
|
|
32
|
+
['saveMs', 'write', (v) => (isNumber(v) ? (v / 1000).toFixed(2) : '-')],
|
|
33
33
|
['bytes', 'KB', (v) => (isNumber(v) ? String(Math.round(v / 1024)) : '-')],
|
|
34
34
|
];
|
|
35
35
|
|
|
@@ -93,33 +93,30 @@ export function sweepRows(depths, frequencies) {
|
|
|
93
93
|
return sorted.filter((d) => wanted.has(bucketEnd(d)));
|
|
94
94
|
}
|
|
95
95
|
|
|
96
|
-
/**
|
|
97
|
-
* A turn is read + step + save and cannot be split from outside, so the save
|
|
98
|
-
* is what is left after the cold read. It still carries the run's fixed
|
|
99
|
-
* overhead (queue, worker), which is the same in every cell, so it compares
|
|
100
|
-
* across cells and is not an absolute.
|
|
101
|
-
*/
|
|
102
|
-
export function saveEstimate(turnP50Ms, readP50Ms) {
|
|
103
|
-
if (!isNumber(turnP50Ms) || !isNumber(readP50Ms)) return null;
|
|
104
|
-
return Math.max(0, turnP50Ms - readP50Ms);
|
|
105
|
-
}
|
|
106
|
-
|
|
107
96
|
/** Bytes keep the largest reading in the bucket: the thread only grows. */
|
|
108
97
|
export function aggregateSamples(points) {
|
|
109
98
|
const turns = {};
|
|
110
99
|
const reads = {};
|
|
100
|
+
const saves = {};
|
|
101
|
+
const rowSaves = {};
|
|
111
102
|
const bytes = {};
|
|
112
103
|
for (const point of points) {
|
|
113
104
|
const depth = point.tags?.depth;
|
|
114
105
|
if (depth == null || !isNumber(point.value)) continue;
|
|
115
106
|
if (point.metric === 'turn_duration') (turns[depth] ??= []).push(point.value);
|
|
116
107
|
else if (point.metric === 'state_read_duration') (reads[depth] ??= []).push(point.value);
|
|
108
|
+
else if (point.metric === 'checkpoint_save') {
|
|
109
|
+
(saves[depth] ??= []).push(point.value);
|
|
110
|
+
if (point.tags?.row_turn === '1') (rowSaves[depth] ??= []).push(point.value);
|
|
111
|
+
}
|
|
117
112
|
else if (point.metric === 'thread_storage_bytes') bytes[depth] = Math.max(bytes[depth] ?? 0, point.value);
|
|
118
113
|
}
|
|
119
114
|
const buckets = {};
|
|
120
|
-
for (const depth of new Set([...Object.keys(turns), ...Object.keys(reads), ...Object.keys(bytes)])) {
|
|
115
|
+
for (const depth of new Set([...Object.keys(turns), ...Object.keys(reads), ...Object.keys(saves), ...Object.keys(bytes)])) {
|
|
121
116
|
const sorted = (turns[depth] ?? []).sort((a, b) => a - b);
|
|
122
117
|
const sortedReads = (reads[depth] ?? []).sort((a, b) => a - b);
|
|
118
|
+
const sortedSaves = (saves[depth] ?? []).sort((a, b) => a - b);
|
|
119
|
+
const sortedRowSaves = (rowSaves[depth] ?? []).sort((a, b) => a - b);
|
|
123
120
|
const p50Ms = percentile(sorted, 0.5);
|
|
124
121
|
// One cold read per thread per VERIFY_EVERY turns is few samples, so the median only.
|
|
125
122
|
const readP50Ms = percentile(sortedReads, 0.5);
|
|
@@ -128,7 +125,8 @@ export function aggregateSamples(points) {
|
|
|
128
125
|
p50Ms,
|
|
129
126
|
p95Ms: percentile(sorted, 0.95),
|
|
130
127
|
readP50Ms,
|
|
131
|
-
|
|
128
|
+
saveMs: percentile(sortedSaves, 0.5),
|
|
129
|
+
rowSaveMs: percentile(sortedRowSaves, 0.5),
|
|
132
130
|
bytes: bytes[depth] ?? null,
|
|
133
131
|
};
|
|
134
132
|
}
|
|
@@ -146,7 +144,7 @@ async function readSamples(file) {
|
|
|
146
144
|
} catch {
|
|
147
145
|
continue;
|
|
148
146
|
}
|
|
149
|
-
if (!['turn_duration', 'state_read_duration', 'thread_storage_bytes'].includes(entry.metric)) continue;
|
|
147
|
+
if (!['turn_duration', 'state_read_duration', 'checkpoint_save', 'thread_storage_bytes'].includes(entry.metric)) continue;
|
|
150
148
|
points.push({ metric: entry.metric, value: entry.data?.value, tags: entry.data?.tags });
|
|
151
149
|
}
|
|
152
150
|
return points;
|
|
@@ -374,13 +372,18 @@ export function sweepTables(cells) {
|
|
|
374
372
|
const depths = sweepRows(sharedDepths(deltas, new Set(deltas.flatMap((c) => Object.keys(c.buckets ?? {})))), deltas.map((c) => c.snapshot));
|
|
375
373
|
if (depths.length === 0) return [];
|
|
376
374
|
const w = 10;
|
|
377
|
-
const titles = { read: 'read, median seconds', write: 'write, seconds', KB: 'storage, KB at that turn' };
|
|
375
|
+
const titles = { read: 'read, median seconds', write: 'write, median / at the row\'s turn, seconds', KB: 'storage, KB at that turn' };
|
|
376
|
+
const cellText = (b, key, format) => {
|
|
377
|
+
if (!(b?.turns > 0)) return '-';
|
|
378
|
+
if (key === 'saveMs' && isNumber(b.rowSaveMs)) return `${format(b[key])}/${format(b.rowSaveMs)}`;
|
|
379
|
+
return format(b[key]);
|
|
380
|
+
};
|
|
378
381
|
return METRICS.map(([key, label, format]) => {
|
|
379
382
|
const lines = [`*${titles[label]}*`, '```'];
|
|
380
383
|
lines.push(['turn'.padEnd(6), ...deltas.map((c) => `snap ${c.column}`.padStart(w))].join(''));
|
|
381
384
|
for (const depth of depths) {
|
|
382
385
|
lines.push(
|
|
383
|
-
[depthLabel(depth).padEnd(6), ...deltas.map((c) => (c.buckets?.[depth]
|
|
386
|
+
[depthLabel(depth).padEnd(6), ...deltas.map((c) => cellText(c.buckets?.[depth], key, format).padStart(w))].join('')
|
|
384
387
|
);
|
|
385
388
|
}
|
|
386
389
|
lines.push('```');
|
|
@@ -392,6 +395,16 @@ function cellName(cell) {
|
|
|
392
395
|
return cell.cell === 'control' ? 'non-delta' : `delta/${cell.column}`;
|
|
393
396
|
}
|
|
394
397
|
|
|
398
|
+
/**
|
|
399
|
+
* Cells whose successful runs returned no `save_ms`: the deployed graph predates
|
|
400
|
+
* the save timing. A cell with no successful run is already reported as failed.
|
|
401
|
+
*/
|
|
402
|
+
function cellsWithoutSaves(cells) {
|
|
403
|
+
return cells.filter(
|
|
404
|
+
(c) => c.summary?.metrics?.successfulRuns > 0 && !Object.values(c.buckets ?? {}).some((b) => isNumber(b.saveMs))
|
|
405
|
+
);
|
|
406
|
+
}
|
|
407
|
+
|
|
395
408
|
function anyBytes(cells) {
|
|
396
409
|
return cells.some((c) => Object.values(c.buckets ?? {}).some((b) => isNumber(b.bytes)));
|
|
397
410
|
}
|
|
@@ -464,6 +477,12 @@ export function buildReport(cells, context = {}) {
|
|
|
464
477
|
);
|
|
465
478
|
lines.push(...headlineTable(cells, changesByCell));
|
|
466
479
|
lines.push(depthLine(cells, cells.find((c) => c.load?.plateauDuration)?.load.plateauDuration));
|
|
480
|
+
const unsaved = cellsWithoutSaves(cells);
|
|
481
|
+
if (unsaved.length > 0) {
|
|
482
|
+
lines.push(
|
|
483
|
+
`_write reads \`-\` for ${unsaved.map(cellName).join(', ')}: its runs returned no \`save_ms\`, so the deployed benchmark graph predates langgraph-server-benchmarks#22._`
|
|
484
|
+
);
|
|
485
|
+
}
|
|
467
486
|
if (!anyBytes(cells)) {
|
|
468
487
|
lines.push('_KB reads `-`: the deployment runs an API without `GET /threads/{id}/storage` yet._');
|
|
469
488
|
}
|
|
@@ -523,7 +542,7 @@ function howToRead(cells) {
|
|
|
523
542
|
withLoad ? `• *Load:* ${count(Number(withLoad.load.loadSize))} users, one thread each${held ? `, held ${held}` : ''}, one turn per iteration, no ramp.` : null,
|
|
524
543
|
'• *Turn:* one `POST /runs/wait` on the thread, which reads the last checkpoint, runs one step and saves a new one. The row label is the thread depth the cold read was taken at.',
|
|
525
544
|
'• *Read:* a cold `GET /threads/{id}/state` every 50 turns, timed to the server\'s first byte, so sending the state back is not counted. The server rebuilds the value from storage with nothing to write. With delta that is the replay of every diff since the last snapshot.',
|
|
526
|
-
'• *Write:* the
|
|
545
|
+
'• *Write:* the checkpoint save, timed by the worker as the gap between the graph\'s two steps, with saves made synchronous so nothing overlaps it. The sweep also shows the save at the row\'s own turn: snapshots fall on those turns, so at a snapshot row it is the full-value write the median hides.',
|
|
527
546
|
'• *Storage:* `GET /threads/{id}/storage` every 50 turns, the bytes the thread occupies at that turn.',
|
|
528
547
|
`• *Regressed / Improved:* read, write or storage at the deepest turn every night reached, outside its own usual range over the last ${MIN_HISTORY_NIGHTS}+ nights.`,
|
|
529
548
|
`• *Errors:* failed requests by HTTP status. ${ERROR_ATTENTION} or more turn the dot yellow even when the cell passes.`,
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import test from 'node:test';
|
|
2
2
|
import assert from 'node:assert/strict';
|
|
3
|
-
import { CELLS, aggregateSamples, buildReport, cellChanges, headlineRows,
|
|
3
|
+
import { CELLS, aggregateSamples, buildReport, cellChanges, headlineRows, sweepRows, sweepTables } from './delta-report.js';
|
|
4
4
|
|
|
5
5
|
const point = (metric, depth, value) => ({ metric, value, tags: { depth } });
|
|
6
6
|
|
|
@@ -15,13 +15,8 @@ test('aggregates turn latency, cold read, derived write and end-of-bucket bytes
|
|
|
15
15
|
point('state_read_duration', '1-100', 70),
|
|
16
16
|
point('turn_duration', '101-200', 900),
|
|
17
17
|
]);
|
|
18
|
-
assert.deepEqual(buckets['1-100'], { turns: 3, p50Ms: 200, p95Ms: 300, readP50Ms: 50,
|
|
19
|
-
assert.deepEqual(buckets['101-200'], { turns: 1, p50Ms: 900, p95Ms: 900, readP50Ms: null,
|
|
20
|
-
});
|
|
21
|
-
|
|
22
|
-
test('write estimate never goes negative when a cold read is slower than the turn', () => {
|
|
23
|
-
assert.equal(saveEstimate(100, 140), 0);
|
|
24
|
-
assert.equal(saveEstimate(null, 140), null);
|
|
18
|
+
assert.deepEqual(buckets['1-100'], { turns: 3, p50Ms: 200, p95Ms: 300, readP50Ms: 50, saveMs: null, rowSaveMs: null, bytes: 4096 });
|
|
19
|
+
assert.deepEqual(buckets['101-200'], { turns: 1, p50Ms: 900, p95Ms: 900, readP50Ms: null, saveMs: null, rowSaveMs: null, bytes: null });
|
|
25
20
|
});
|
|
26
21
|
|
|
27
22
|
const bucket = (readMs, writeMs, bytes) => ({
|
|
@@ -29,7 +24,7 @@ const bucket = (readMs, writeMs, bytes) => ({
|
|
|
29
24
|
p50Ms: readMs + writeMs,
|
|
30
25
|
p95Ms: (readMs + writeMs) * 1.5,
|
|
31
26
|
readP50Ms: readMs,
|
|
32
|
-
|
|
27
|
+
saveMs: writeMs,
|
|
33
28
|
bytes,
|
|
34
29
|
});
|
|
35
30
|
|
|
@@ -140,7 +135,7 @@ test('the sweep keeps the first row, the deepest, and the turn before and at eac
|
|
|
140
135
|
test('a night that stops mid-bucket compares at the last turn with a cold read, not the partial one', () => {
|
|
141
136
|
const past = Array.from({ length: 5 }, () => asHistory(night()));
|
|
142
137
|
const tonight = night({ delta_50: { readMs: 90 } });
|
|
143
|
-
tonight[1].buckets['101-150'] = { turns: 7, p50Ms: 500, p95Ms: 600, readP50Ms: null,
|
|
138
|
+
tonight[1].buckets['101-150'] = { turns: 7, p50Ms: 500, p95Ms: 600, readP50Ms: null, saveMs: null, bytes: null };
|
|
144
139
|
const { text } = buildReport(tonight, { ...base, history: past });
|
|
145
140
|
assert.match(text, /^\*Regressed:\* delta\/50 read@turn 100 0\.05 → 0\.11 s \(\+125%\)$/m);
|
|
146
141
|
assert.match(text, /^100\s+.*0\.11▼/m);
|
|
@@ -151,11 +146,11 @@ test('tables stop where the slowest cell stopped, and the depth each cell reache
|
|
|
151
146
|
tonight[0].buckets['101-150'] = bucket(50, 400, 122880);
|
|
152
147
|
tonight[0].buckets['151-200'] = bucket(50, 400, 163840);
|
|
153
148
|
// delta/50 got nine turns into the next bucket, with no cold read there yet.
|
|
154
|
-
tonight[1].buckets['101-150'] = { turns: 9, p50Ms: 450, p95Ms: 600, readP50Ms: null,
|
|
149
|
+
tonight[1].buckets['101-150'] = { turns: 9, p50Ms: 450, p95Ms: 600, readP50Ms: null, saveMs: null, bytes: null };
|
|
155
150
|
// delta/500's one thread there had its state read fail; only the storage probe answered.
|
|
156
|
-
tonight[2].buckets['101-150'] = { turns: 1, p50Ms: 450, p95Ms: 450, readP50Ms: null,
|
|
151
|
+
tonight[2].buckets['101-150'] = { turns: 1, p50Ms: 450, p95Ms: 450, readP50Ms: null, saveMs: null, bytes: 1024 };
|
|
157
152
|
// delta/1000's first verify turn had its state read fail, with storage answering: a hole, not the end.
|
|
158
|
-
tonight[3].buckets['1-50'] = { turns: 500, p50Ms: 450, p95Ms: 600, readP50Ms: null,
|
|
153
|
+
tonight[3].buckets['1-50'] = { turns: 500, p50Ms: 450, p95Ms: 600, readP50Ms: null, saveMs: null, bytes: 4096 };
|
|
159
154
|
const { text, thread } = buildReport(tonight, base);
|
|
160
155
|
assert.match(text, /^50\s+/m);
|
|
161
156
|
assert.match(text, /^100\s+/m);
|
|
@@ -167,8 +162,30 @@ test('tables stop where the slowest cell stopped, and the depth each cell reache
|
|
|
167
162
|
|
|
168
163
|
test('a deepest bucket with turns but no cold read yet is not a row of dashes', () => {
|
|
169
164
|
const tonight = night();
|
|
170
|
-
for (const c of tonight) c.buckets['101-150'] = { turns: 9, p50Ms: 450, p95Ms: 600, readP50Ms: null,
|
|
165
|
+
for (const c of tonight) c.buckets['101-150'] = { turns: 9, p50Ms: 450, p95Ms: 600, readP50Ms: null, saveMs: null, bytes: null };
|
|
171
166
|
const { text } = buildReport(tonight, base);
|
|
172
167
|
assert.match(text, /^100\s+/m);
|
|
173
168
|
assert.doesNotMatch(text, /^150\s+/m);
|
|
174
169
|
});
|
|
170
|
+
|
|
171
|
+
test('write is the measured save, and the sweep shows the save at the row turn where snapshots land', () => {
|
|
172
|
+
const save = (value, rowTurn) => ({ metric: 'checkpoint_save', value, tags: { depth: '1-50', row_turn: rowTurn } });
|
|
173
|
+
const buckets = aggregateSamples([save(20, '0'), save(30, '0'), save(25, '0'), save(900, '1'), save(1100, '1')]);
|
|
174
|
+
assert.equal(buckets['1-50'].saveMs, 30);
|
|
175
|
+
assert.equal(buckets['1-50'].rowSaveMs, 900);
|
|
176
|
+
const tonight = night();
|
|
177
|
+
for (const c of tonight) c.buckets['1-50'] = { ...c.buckets['1-50'], saveMs: 30, rowSaveMs: 900 };
|
|
178
|
+
const [, write] = sweepTables(tonight).map((t) => t.split('\n'));
|
|
179
|
+
assert.match(write[0], /^\*write, median \/ at the row's turn, seconds\*/);
|
|
180
|
+
assert.match(write[3], /^50\s+0\.03\/0\.90\s+0\.03\/0\.90\s+0\.03\/0\.90$/);
|
|
181
|
+
});
|
|
182
|
+
|
|
183
|
+
test('a cell whose runs returned no save_ms says why write is blank', () => {
|
|
184
|
+
const tonight = night();
|
|
185
|
+
for (const b of Object.values(tonight[1].buckets)) b.saveMs = null;
|
|
186
|
+
const { text } = buildReport(tonight, base);
|
|
187
|
+
assert.match(text, /^_write reads `-` for delta\/50: its runs returned no `save_ms`/m);
|
|
188
|
+
assert.doesNotMatch(buildReport(night(), base).text, /returned no `save_ms`/);
|
|
189
|
+
tonight[1].summary.metrics.successfulRuns = 0;
|
|
190
|
+
assert.doesNotMatch(buildReport(tonight, base).text, /returned no `save_ms`/);
|
|
191
|
+
});
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
__version__ = "0.16.0.dev12"
|