langgraph-api 0.8.6__tar.gz → 0.9.0__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.8.6 → langgraph_api-0.9.0}/Makefile +1 -1
- {langgraph_api-0.8.6 → langgraph_api-0.9.0}/PKG-INFO +3 -3
- {langgraph_api-0.8.6 → langgraph_api-0.9.0}/benchmark/continuous/uv.lock +6 -6
- {langgraph_api-0.8.6 → langgraph_api-0.9.0}/benchmark/ramp.js +3 -1
- langgraph_api-0.9.0/langgraph_api/__init__.py +1 -0
- {langgraph_api-0.8.6 → langgraph_api-0.9.0}/langgraph_api/api/__init__.py +21 -5
- langgraph_api-0.8.6/langgraph_api/api/protocol.py → langgraph_api-0.9.0/langgraph_api/api/event_streaming.py +115 -53
- {langgraph_api-0.8.6 → langgraph_api-0.9.0}/langgraph_api/api/runs.py +2 -0
- {langgraph_api-0.8.6 → langgraph_api-0.9.0}/langgraph_api/config/__init__.py +15 -3
- {langgraph_api-0.8.6/langgraph_api/protocol → langgraph_api-0.9.0/langgraph_api/event_streaming}/capabilities.py +22 -1
- {langgraph_api-0.8.6/langgraph_api/protocol → langgraph_api-0.9.0/langgraph_api/event_streaming}/constants.py +2 -2
- {langgraph_api-0.8.6/langgraph_api/protocol → langgraph_api-0.9.0/langgraph_api/event_streaming}/service.py +111 -53
- {langgraph_api-0.8.6/langgraph_api/protocol → langgraph_api-0.9.0/langgraph_api/event_streaming}/session.py +144 -122
- {langgraph_api-0.8.6/langgraph_api/protocol → langgraph_api-0.9.0/langgraph_api/event_streaming}/state_normalizers.py +13 -13
- {langgraph_api-0.8.6/langgraph_api/protocol → langgraph_api-0.9.0/langgraph_api/event_streaming}/types.py +1 -1
- {langgraph_api-0.8.6 → langgraph_api-0.9.0}/langgraph_api/feature_flags.py +14 -0
- {langgraph_api-0.8.6 → langgraph_api-0.9.0}/langgraph_api/graph.py +1 -1
- {langgraph_api-0.8.6 → langgraph_api-0.9.0}/langgraph_api/grpc/ops/crons.py +13 -2
- {langgraph_api-0.8.6 → langgraph_api-0.9.0}/langgraph_api/grpc/ops/threads.py +2 -2
- {langgraph_api-0.8.6 → langgraph_api-0.9.0}/langgraph_api/js/package.json +1 -1
- {langgraph_api-0.8.6 → langgraph_api-0.9.0}/langgraph_api/js/src/load.hooks.mjs +1 -0
- langgraph_api-0.9.0/langgraph_api/js/src/preload.mjs +108 -0
- {langgraph_api-0.8.6 → langgraph_api-0.9.0}/langgraph_api/js/yarn.lock +639 -59
- {langgraph_api-0.8.6 → langgraph_api-0.9.0}/langgraph_api/models/run.py +19 -0
- {langgraph_api-0.8.6 → langgraph_api-0.9.0}/langgraph_api/release_tags.py +88 -30
- {langgraph_api-0.8.6 → langgraph_api-0.9.0}/langgraph_api/stream.py +40 -188
- langgraph_api-0.9.0/langgraph_api/stream_v2.py +224 -0
- {langgraph_api-0.8.6 → langgraph_api-0.9.0}/langgraph_grpc_common/conversion/checkpoint.py +4 -1
- {langgraph_api-0.8.6 → langgraph_api-0.9.0}/langgraph_grpc_common/proto/__init__.py +0 -2
- {langgraph_api-0.8.6 → langgraph_api-0.9.0}/langgraph_grpc_common/proto/checkpointer_pb2.pyi +28 -3
- {langgraph_api-0.8.6 → langgraph_api-0.9.0}/langgraph_grpc_common/proto/core_api_pb2.py +50 -50
- {langgraph_api-0.8.6 → langgraph_api-0.9.0}/langgraph_grpc_common/proto/core_api_pb2.pyi +18 -4
- {langgraph_api-0.8.6 → langgraph_api-0.9.0}/langgraph_grpc_common/proto/errors_pb2.pyi +9 -3
- {langgraph_api-0.8.6 → langgraph_api-0.9.0}/openapi.json +12 -11
- {langgraph_api-0.8.6 → langgraph_api-0.9.0}/pyproject.toml +2 -2
- {langgraph_api-0.8.6 → langgraph_api-0.9.0}/uv.lock +473 -385
- langgraph_api-0.8.6/langgraph_api/__init__.py +0 -1
- langgraph_api-0.8.6/langgraph_api/js/src/preload.mjs +0 -29
- langgraph_api-0.8.6/langgraph_api/utils/messages.py +0 -62
- langgraph_api-0.8.6/langgraph_grpc_common/proto/enum_store_operation_entry_type_pb2.py +0 -37
- langgraph_api-0.8.6/langgraph_grpc_common/proto/enum_store_operation_entry_type_pb2.pyi +0 -32
- langgraph_api-0.8.6/langgraph_grpc_common/proto/enum_store_operation_entry_type_pb2_grpc.py +0 -24
- langgraph_api-0.8.6/langgraph_grpc_common/proto/enum_store_operation_entry_type_pb2_grpc.pyi +0 -20
- {langgraph_api-0.8.6 → langgraph_api-0.9.0}/.gitignore +0 -0
- {langgraph_api-0.8.6 → langgraph_api-0.9.0}/LICENSE +0 -0
- {langgraph_api-0.8.6 → langgraph_api-0.9.0}/README.md +0 -0
- {langgraph_api-0.8.6 → langgraph_api-0.9.0}/benchmark/.gitignore +0 -0
- {langgraph_api-0.8.6 → langgraph_api-0.9.0}/benchmark/Makefile +0 -0
- {langgraph_api-0.8.6 → langgraph_api-0.9.0}/benchmark/README.md +0 -0
- {langgraph_api-0.8.6 → langgraph_api-0.9.0}/benchmark/benchmark-runners/assistant.ts +0 -0
- {langgraph_api-0.8.6 → langgraph_api-0.9.0}/benchmark/benchmark-runners/benchmark-runner.ts +0 -0
- {langgraph_api-0.8.6 → langgraph_api-0.9.0}/benchmark/benchmark-runners/benchmark_profiles.ts +0 -0
- {langgraph_api-0.8.6 → langgraph_api-0.9.0}/benchmark/benchmark-runners/benchmarks.ts +0 -0
- {langgraph_api-0.8.6 → langgraph_api-0.9.0}/benchmark/benchmark-runners/cancel_first_second_completes.ts +0 -0
- {langgraph_api-0.8.6 → langgraph_api-0.9.0}/benchmark/benchmark-runners/enqueued_runs_order.ts +0 -0
- {langgraph_api-0.8.6 → langgraph_api-0.9.0}/benchmark/benchmark-runners/log-failure.ts +0 -0
- {langgraph_api-0.8.6 → langgraph_api-0.9.0}/benchmark/benchmark-runners/meta_workload.ts +0 -0
- {langgraph_api-0.8.6 → langgraph_api-0.9.0}/benchmark/benchmark-runners/stream_write.ts +0 -0
- {langgraph_api-0.8.6 → langgraph_api-0.9.0}/benchmark/benchmark-runners/thread.ts +0 -0
- {langgraph_api-0.8.6 → langgraph_api-0.9.0}/benchmark/benchmark-runners/thread_runs_metadata_search.ts +0 -0
- {langgraph_api-0.8.6 → langgraph_api-0.9.0}/benchmark/benchmark-runners/threads_search_metadata.ts +0 -0
- {langgraph_api-0.8.6 → langgraph_api-0.9.0}/benchmark/benchmark-runners/types.ts +0 -0
- {langgraph_api-0.8.6 → langgraph_api-0.9.0}/benchmark/benchmark-runners/wait_write.ts +0 -0
- {langgraph_api-0.8.6 → langgraph_api-0.9.0}/benchmark/capacity_dd_report.py +0 -0
- {langgraph_api-0.8.6 → langgraph_api-0.9.0}/benchmark/capacity_k6.js +0 -0
- {langgraph_api-0.8.6 → langgraph_api-0.9.0}/benchmark/capacity_runner.mjs +0 -0
- {langgraph_api-0.8.6 → langgraph_api-0.9.0}/benchmark/capacity_slack_report.py +0 -0
- {langgraph_api-0.8.6 → langgraph_api-0.9.0}/benchmark/capacity_urls.mjs +0 -0
- {langgraph_api-0.8.6 → langgraph_api-0.9.0}/benchmark/clean-cli.js +0 -0
- {langgraph_api-0.8.6 → langgraph_api-0.9.0}/benchmark/clean.js +0 -0
- {langgraph_api-0.8.6 → langgraph_api-0.9.0}/benchmark/continuous/README.md +0 -0
- {langgraph_api-0.8.6 → langgraph_api-0.9.0}/benchmark/continuous/pyproject.toml +0 -0
- {langgraph_api-0.8.6 → langgraph_api-0.9.0}/benchmark/continuous/runner.py +0 -0
- {langgraph_api-0.8.6 → langgraph_api-0.9.0}/benchmark/graphs.js +0 -0
- {langgraph_api-0.8.6 → langgraph_api-0.9.0}/benchmark/mixed_workload_k6.js +0 -0
- {langgraph_api-0.8.6 → langgraph_api-0.9.0}/benchmark/mixed_workload_runner.mjs +0 -0
- {langgraph_api-0.8.6 → langgraph_api-0.9.0}/benchmark/package.json +0 -0
- {langgraph_api-0.8.6 → langgraph_api-0.9.0}/benchmark/reporting/dd_reporting.py +0 -0
- {langgraph_api-0.8.6 → langgraph_api-0.9.0}/benchmark/reporting/slack_slowest_runs.py +0 -0
- {langgraph_api-0.8.6 → langgraph_api-0.9.0}/benchmark/reporting/slack_summary.py +0 -0
- {langgraph_api-0.8.6 → langgraph_api-0.9.0}/benchmark/run_local.sh +0 -0
- {langgraph_api-0.8.6 → langgraph_api-0.9.0}/benchmark/staircase.py +0 -0
- {langgraph_api-0.8.6 → langgraph_api-0.9.0}/benchmark/staircase_step_k6.js +0 -0
- {langgraph_api-0.8.6 → langgraph_api-0.9.0}/benchmark/tsconfig.json +0 -0
- {langgraph_api-0.8.6 → langgraph_api-0.9.0}/benchmark/update-revision.js +0 -0
- {langgraph_api-0.8.6 → langgraph_api-0.9.0}/benchmark/weather.js +0 -0
- {langgraph_api-0.8.6 → langgraph_api-0.9.0}/constraints.txt +0 -0
- {langgraph_api-0.8.6 → langgraph_api-0.9.0}/custom_store.sql +0 -0
- {langgraph_api-0.8.6 → langgraph_api-0.9.0}/forbidden.txt +0 -0
- {langgraph_api-0.8.6 → langgraph_api-0.9.0}/hatch_build.py +0 -0
- {langgraph_api-0.8.6 → langgraph_api-0.9.0}/healthcheck.py +0 -0
- {langgraph_api-0.8.6 → langgraph_api-0.9.0}/langgraph-cloud-debugging-20260210132856.zip +0 -0
- {langgraph_api-0.8.6 → langgraph_api-0.9.0}/langgraph_api/_checkpointer/__init__.py +0 -0
- {langgraph_api-0.8.6 → langgraph_api-0.9.0}/langgraph_api/_checkpointer/_adapter.py +0 -0
- {langgraph_api-0.8.6 → langgraph_api-0.9.0}/langgraph_api/_checkpointer/protocol.py +0 -0
- {langgraph_api-0.8.6 → langgraph_api-0.9.0}/langgraph_api/_factory_utils.py +0 -0
- {langgraph_api-0.8.6 → langgraph_api-0.9.0}/langgraph_api/api/a2a.py +0 -0
- {langgraph_api-0.8.6 → langgraph_api-0.9.0}/langgraph_api/api/assistants.py +0 -0
- {langgraph_api-0.8.6 → langgraph_api-0.9.0}/langgraph_api/api/mcp/__init__.py +0 -0
- {langgraph_api-0.8.6 → langgraph_api-0.9.0}/langgraph_api/api/mcp/_constants.py +0 -0
- {langgraph_api-0.8.6 → langgraph_api-0.9.0}/langgraph_api/api/mcp/_handlers.py +0 -0
- {langgraph_api-0.8.6 → langgraph_api-0.9.0}/langgraph_api/api/mcp/_models.py +0 -0
- {langgraph_api-0.8.6 → langgraph_api-0.9.0}/langgraph_api/api/mcp/_routes.py +0 -0
- {langgraph_api-0.8.6 → langgraph_api-0.9.0}/langgraph_api/api/mcp/_sanitizers.py +0 -0
- {langgraph_api-0.8.6 → langgraph_api-0.9.0}/langgraph_api/api/meta.py +0 -0
- {langgraph_api-0.8.6 → langgraph_api-0.9.0}/langgraph_api/api/openapi.py +0 -0
- {langgraph_api-0.8.6 → langgraph_api-0.9.0}/langgraph_api/api/profile.py +0 -0
- {langgraph_api-0.8.6 → langgraph_api-0.9.0}/langgraph_api/api/store.py +0 -0
- {langgraph_api-0.8.6 → langgraph_api-0.9.0}/langgraph_api/api/threads.py +0 -0
- {langgraph_api-0.8.6 → langgraph_api-0.9.0}/langgraph_api/api/ui.py +0 -0
- {langgraph_api-0.8.6 → langgraph_api-0.9.0}/langgraph_api/asgi_transport.py +0 -0
- {langgraph_api-0.8.6 → langgraph_api-0.9.0}/langgraph_api/asyncio.py +0 -0
- {langgraph_api-0.8.6 → langgraph_api-0.9.0}/langgraph_api/auth/__init__.py +0 -0
- {langgraph_api-0.8.6 → langgraph_api-0.9.0}/langgraph_api/auth/custom.py +0 -0
- {langgraph_api-0.8.6 → langgraph_api-0.9.0}/langgraph_api/auth/errors.py +0 -0
- {langgraph_api-0.8.6 → langgraph_api-0.9.0}/langgraph_api/auth/langsmith/__init__.py +0 -0
- {langgraph_api-0.8.6 → langgraph_api-0.9.0}/langgraph_api/auth/langsmith/backend.py +0 -0
- {langgraph_api-0.8.6 → langgraph_api-0.9.0}/langgraph_api/auth/langsmith/client.py +0 -0
- {langgraph_api-0.8.6 → langgraph_api-0.9.0}/langgraph_api/auth/middleware.py +0 -0
- {langgraph_api-0.8.6 → langgraph_api-0.9.0}/langgraph_api/auth/noop.py +0 -0
- {langgraph_api-0.8.6 → langgraph_api-0.9.0}/langgraph_api/auth/studio_user.py +0 -0
- {langgraph_api-0.8.6 → langgraph_api-0.9.0}/langgraph_api/cache.py +0 -0
- {langgraph_api-0.8.6 → langgraph_api-0.9.0}/langgraph_api/cli.py +0 -0
- {langgraph_api-0.8.6 → langgraph_api-0.9.0}/langgraph_api/command.py +0 -0
- {langgraph_api-0.8.6 → langgraph_api-0.9.0}/langgraph_api/config/_parse.py +0 -0
- {langgraph_api-0.8.6 → langgraph_api-0.9.0}/langgraph_api/config/schemas.py +0 -0
- {langgraph_api-0.8.6 → langgraph_api-0.9.0}/langgraph_api/cron_scheduler.py +0 -0
- {langgraph_api-0.8.6 → langgraph_api-0.9.0}/langgraph_api/encryption/__init__.py +0 -0
- {langgraph_api-0.8.6 → langgraph_api-0.9.0}/langgraph_api/encryption/aes_json.py +0 -0
- {langgraph_api-0.8.6 → langgraph_api-0.9.0}/langgraph_api/encryption/context.py +0 -0
- {langgraph_api-0.8.6 → langgraph_api-0.9.0}/langgraph_api/encryption/custom.py +0 -0
- {langgraph_api-0.8.6 → langgraph_api-0.9.0}/langgraph_api/encryption/middleware.py +0 -0
- {langgraph_api-0.8.6 → langgraph_api-0.9.0}/langgraph_api/encryption/shared.py +0 -0
- {langgraph_api-0.8.6 → langgraph_api-0.9.0}/langgraph_api/errors.py +0 -0
- {langgraph_api-0.8.6/langgraph_api/protocol → langgraph_api-0.9.0/langgraph_api/event_streaming}/__init__.py +0 -0
- {langgraph_api-0.8.6/langgraph_api/protocol → langgraph_api-0.9.0/langgraph_api/event_streaming}/event_normalizers.py +0 -0
- {langgraph_api-0.8.6/langgraph_api/protocol → langgraph_api-0.9.0/langgraph_api/event_streaming}/namespace.py +0 -0
- {langgraph_api-0.8.6 → langgraph_api-0.9.0}/langgraph_api/grpc/__init__.py +0 -0
- {langgraph_api-0.8.6 → langgraph_api-0.9.0}/langgraph_api/grpc/client.py +0 -0
- {langgraph_api-0.8.6 → langgraph_api-0.9.0}/langgraph_api/grpc/generated/core_api_pb2.pyi +0 -0
- {langgraph_api-0.8.6 → langgraph_api-0.9.0}/langgraph_api/grpc/ops/__init__.py +0 -0
- {langgraph_api-0.8.6 → langgraph_api-0.9.0}/langgraph_api/grpc/ops/assistants.py +0 -0
- {langgraph_api-0.8.6 → langgraph_api-0.9.0}/langgraph_api/grpc/ops/cache.py +0 -0
- {langgraph_api-0.8.6 → langgraph_api-0.9.0}/langgraph_api/grpc/ops/runs.py +0 -0
- {langgraph_api-0.8.6 → langgraph_api-0.9.0}/langgraph_api/grpc/server.py +0 -0
- {langgraph_api-0.8.6 → langgraph_api-0.9.0}/langgraph_api/grpc/servicers/__init__.py +0 -0
- {langgraph_api-0.8.6 → langgraph_api-0.9.0}/langgraph_api/grpc/servicers/checkpointer.py +0 -0
- {langgraph_api-0.8.6 → langgraph_api-0.9.0}/langgraph_api/grpc/servicers/encryption.py +0 -0
- {langgraph_api-0.8.6 → langgraph_api-0.9.0}/langgraph_api/http.py +0 -0
- {langgraph_api-0.8.6 → langgraph_api-0.9.0}/langgraph_api/http_metrics.py +0 -0
- {langgraph_api-0.8.6 → langgraph_api-0.9.0}/langgraph_api/http_metrics_utils.py +0 -0
- {langgraph_api-0.8.6 → langgraph_api-0.9.0}/langgraph_api/js/.gitignore +0 -0
- {langgraph_api-0.8.6 → langgraph_api-0.9.0}/langgraph_api/js/.prettierrc +0 -0
- {langgraph_api-0.8.6 → langgraph_api-0.9.0}/langgraph_api/js/__init__.py +0 -0
- {langgraph_api-0.8.6 → langgraph_api-0.9.0}/langgraph_api/js/base.py +0 -0
- {langgraph_api-0.8.6 → langgraph_api-0.9.0}/langgraph_api/js/build.mts +0 -0
- {langgraph_api-0.8.6 → langgraph_api-0.9.0}/langgraph_api/js/client.http.mts +0 -0
- {langgraph_api-0.8.6 → langgraph_api-0.9.0}/langgraph_api/js/client.mts +0 -0
- {langgraph_api-0.8.6 → langgraph_api-0.9.0}/langgraph_api/js/errors.py +0 -0
- {langgraph_api-0.8.6 → langgraph_api-0.9.0}/langgraph_api/js/global.d.ts +0 -0
- {langgraph_api-0.8.6 → langgraph_api-0.9.0}/langgraph_api/js/remote.py +0 -0
- {langgraph_api-0.8.6 → langgraph_api-0.9.0}/langgraph_api/js/schema.py +0 -0
- {langgraph_api-0.8.6 → langgraph_api-0.9.0}/langgraph_api/js/src/graph.mts +0 -0
- {langgraph_api-0.8.6 → langgraph_api-0.9.0}/langgraph_api/js/src/utils/experiment-tracing.mts +0 -0
- {langgraph_api-0.8.6 → langgraph_api-0.9.0}/langgraph_api/js/src/utils/files.mts +0 -0
- {langgraph_api-0.8.6 → langgraph_api-0.9.0}/langgraph_api/js/src/utils/importMap.mts +0 -0
- {langgraph_api-0.8.6 → langgraph_api-0.9.0}/langgraph_api/js/src/utils/pythonSchemas.mts +0 -0
- {langgraph_api-0.8.6 → langgraph_api-0.9.0}/langgraph_api/js/src/utils/serde.mts +0 -0
- {langgraph_api-0.8.6 → langgraph_api-0.9.0}/langgraph_api/js/sse.py +0 -0
- {langgraph_api-0.8.6 → langgraph_api-0.9.0}/langgraph_api/js/traceblock.mts +0 -0
- {langgraph_api-0.8.6 → langgraph_api-0.9.0}/langgraph_api/js/tsconfig.json +0 -0
- {langgraph_api-0.8.6 → langgraph_api-0.9.0}/langgraph_api/js/ui.py +0 -0
- {langgraph_api-0.8.6 → langgraph_api-0.9.0}/langgraph_api/lc_security/__init__.py +0 -0
- {langgraph_api-0.8.6 → langgraph_api-0.9.0}/langgraph_api/lc_security/exceptions.py +0 -0
- {langgraph_api-0.8.6 → langgraph_api-0.9.0}/langgraph_api/lc_security/policy.py +0 -0
- {langgraph_api-0.8.6 → langgraph_api-0.9.0}/langgraph_api/lc_security/transport.py +0 -0
- {langgraph_api-0.8.6 → langgraph_api-0.9.0}/langgraph_api/logging.py +0 -0
- {langgraph_api-0.8.6 → langgraph_api-0.9.0}/langgraph_api/metadata.py +0 -0
- {langgraph_api-0.8.6 → langgraph_api-0.9.0}/langgraph_api/metrics_datadog.py +0 -0
- {langgraph_api-0.8.6 → langgraph_api-0.9.0}/langgraph_api/middleware/__init__.py +0 -0
- {langgraph_api-0.8.6 → langgraph_api-0.9.0}/langgraph_api/middleware/ensure_store.py +0 -0
- {langgraph_api-0.8.6 → langgraph_api-0.9.0}/langgraph_api/middleware/http_logger.py +0 -0
- {langgraph_api-0.8.6 → langgraph_api-0.9.0}/langgraph_api/middleware/private_network.py +0 -0
- {langgraph_api-0.8.6 → langgraph_api-0.9.0}/langgraph_api/middleware/request_id.py +0 -0
- {langgraph_api-0.8.6 → langgraph_api-0.9.0}/langgraph_api/models/__init__.py +0 -0
- {langgraph_api-0.8.6 → langgraph_api-0.9.0}/langgraph_api/otel_context.py +0 -0
- {langgraph_api-0.8.6 → langgraph_api-0.9.0}/langgraph_api/patch.py +0 -0
- {langgraph_api-0.8.6 → langgraph_api-0.9.0}/langgraph_api/queue_entrypoint.py +0 -0
- {langgraph_api-0.8.6 → langgraph_api-0.9.0}/langgraph_api/route.py +0 -0
- {langgraph_api-0.8.6 → langgraph_api-0.9.0}/langgraph_api/schema.py +0 -0
- {langgraph_api-0.8.6 → langgraph_api-0.9.0}/langgraph_api/self_hosted_logs.py +0 -0
- {langgraph_api-0.8.6 → langgraph_api-0.9.0}/langgraph_api/self_hosted_metrics.py +0 -0
- {langgraph_api-0.8.6 → langgraph_api-0.9.0}/langgraph_api/serde.py +0 -0
- {langgraph_api-0.8.6 → langgraph_api-0.9.0}/langgraph_api/server.py +0 -0
- {langgraph_api-0.8.6 → langgraph_api-0.9.0}/langgraph_api/sse.py +0 -0
- {langgraph_api-0.8.6 → langgraph_api-0.9.0}/langgraph_api/state.py +0 -0
- {langgraph_api-0.8.6 → langgraph_api-0.9.0}/langgraph_api/store.py +0 -0
- {langgraph_api-0.8.6 → langgraph_api-0.9.0}/langgraph_api/timing/__init__.py +0 -0
- {langgraph_api-0.8.6 → langgraph_api-0.9.0}/langgraph_api/timing/profiler.py +0 -0
- {langgraph_api-0.8.6 → langgraph_api-0.9.0}/langgraph_api/timing/timer.py +0 -0
- {langgraph_api-0.8.6 → langgraph_api-0.9.0}/langgraph_api/traceblock.py +0 -0
- {langgraph_api-0.8.6 → langgraph_api-0.9.0}/langgraph_api/tunneling/cloudflare.py +0 -0
- {langgraph_api-0.8.6 → langgraph_api-0.9.0}/langgraph_api/utils/__init__.py +0 -0
- {langgraph_api-0.8.6 → langgraph_api-0.9.0}/langgraph_api/utils/cache.py +0 -0
- {langgraph_api-0.8.6 → langgraph_api-0.9.0}/langgraph_api/utils/config.py +0 -0
- {langgraph_api-0.8.6 → langgraph_api-0.9.0}/langgraph_api/utils/errors.py +0 -0
- {langgraph_api-0.8.6 → langgraph_api-0.9.0}/langgraph_api/utils/extract.py +0 -0
- {langgraph_api-0.8.6 → langgraph_api-0.9.0}/langgraph_api/utils/future.py +0 -0
- {langgraph_api-0.8.6 → langgraph_api-0.9.0}/langgraph_api/utils/headers.py +0 -0
- {langgraph_api-0.8.6 → langgraph_api-0.9.0}/langgraph_api/utils/network.py +0 -0
- {langgraph_api-0.8.6 → langgraph_api-0.9.0}/langgraph_api/utils/retriable_client.py +0 -0
- {langgraph_api-0.8.6 → langgraph_api-0.9.0}/langgraph_api/utils/stream_codec.py +0 -0
- {langgraph_api-0.8.6 → langgraph_api-0.9.0}/langgraph_api/utils/uuids.py +0 -0
- {langgraph_api-0.8.6 → langgraph_api-0.9.0}/langgraph_api/validation.py +0 -0
- {langgraph_api-0.8.6 → langgraph_api-0.9.0}/langgraph_api/webhook.py +0 -0
- {langgraph_api-0.8.6 → langgraph_api-0.9.0}/langgraph_api/worker.py +0 -0
- {langgraph_api-0.8.6 → langgraph_api-0.9.0}/langgraph_grpc_common/__init__.py +0 -0
- {langgraph_api-0.8.6 → langgraph_api-0.9.0}/langgraph_grpc_common/checkpointer.py +0 -0
- {langgraph_api-0.8.6 → langgraph_api-0.9.0}/langgraph_grpc_common/conversion/__init__.py +0 -0
- {langgraph_api-0.8.6 → langgraph_api-0.9.0}/langgraph_grpc_common/conversion/_compat.py +0 -0
- {langgraph_api-0.8.6 → langgraph_api-0.9.0}/langgraph_grpc_common/conversion/config.py +0 -0
- {langgraph_api-0.8.6 → langgraph_api-0.9.0}/langgraph_grpc_common/conversion/durability.py +0 -0
- {langgraph_api-0.8.6 → langgraph_api-0.9.0}/langgraph_grpc_common/conversion/struct.py +0 -0
- {langgraph_api-0.8.6 → langgraph_api-0.9.0}/langgraph_grpc_common/conversion/value.py +0 -0
- {langgraph_api-0.8.6 → langgraph_api-0.9.0}/langgraph_grpc_common/proto/checkpointer_pb2.py +0 -0
- {langgraph_api-0.8.6 → langgraph_api-0.9.0}/langgraph_grpc_common/proto/checkpointer_pb2_grpc.py +0 -0
- {langgraph_api-0.8.6 → langgraph_api-0.9.0}/langgraph_grpc_common/proto/checkpointer_pb2_grpc.pyi +0 -0
- {langgraph_api-0.8.6 → langgraph_api-0.9.0}/langgraph_grpc_common/proto/core_api_pb2_grpc.py +0 -0
- {langgraph_api-0.8.6 → langgraph_api-0.9.0}/langgraph_grpc_common/proto/core_api_pb2_grpc.pyi +0 -0
- {langgraph_api-0.8.6 → langgraph_api-0.9.0}/langgraph_grpc_common/proto/encryption_pb2.py +0 -0
- {langgraph_api-0.8.6 → langgraph_api-0.9.0}/langgraph_grpc_common/proto/encryption_pb2.pyi +0 -0
- {langgraph_api-0.8.6 → langgraph_api-0.9.0}/langgraph_grpc_common/proto/encryption_pb2_grpc.py +0 -0
- {langgraph_api-0.8.6 → langgraph_api-0.9.0}/langgraph_grpc_common/proto/encryption_pb2_grpc.pyi +0 -0
- {langgraph_api-0.8.6 → langgraph_api-0.9.0}/langgraph_grpc_common/proto/engine_common_pb2.py +0 -0
- {langgraph_api-0.8.6 → langgraph_api-0.9.0}/langgraph_grpc_common/proto/engine_common_pb2.pyi +0 -0
- {langgraph_api-0.8.6 → langgraph_api-0.9.0}/langgraph_grpc_common/proto/engine_common_pb2_grpc.py +0 -0
- {langgraph_api-0.8.6 → langgraph_api-0.9.0}/langgraph_grpc_common/proto/engine_common_pb2_grpc.pyi +0 -0
- {langgraph_api-0.8.6 → langgraph_api-0.9.0}/langgraph_grpc_common/proto/enum_cancel_run_action_pb2.py +0 -0
- {langgraph_api-0.8.6 → langgraph_api-0.9.0}/langgraph_grpc_common/proto/enum_cancel_run_action_pb2.pyi +0 -0
- {langgraph_api-0.8.6 → langgraph_api-0.9.0}/langgraph_grpc_common/proto/enum_cancel_run_action_pb2_grpc.py +0 -0
- {langgraph_api-0.8.6 → langgraph_api-0.9.0}/langgraph_grpc_common/proto/enum_cancel_run_action_pb2_grpc.pyi +0 -0
- {langgraph_api-0.8.6 → langgraph_api-0.9.0}/langgraph_grpc_common/proto/enum_control_signal_pb2.py +0 -0
- {langgraph_api-0.8.6 → langgraph_api-0.9.0}/langgraph_grpc_common/proto/enum_control_signal_pb2.pyi +0 -0
- {langgraph_api-0.8.6 → langgraph_api-0.9.0}/langgraph_grpc_common/proto/enum_control_signal_pb2_grpc.py +0 -0
- {langgraph_api-0.8.6 → langgraph_api-0.9.0}/langgraph_grpc_common/proto/enum_control_signal_pb2_grpc.pyi +0 -0
- {langgraph_api-0.8.6 → langgraph_api-0.9.0}/langgraph_grpc_common/proto/enum_cron_on_run_completed_pb2.py +0 -0
- {langgraph_api-0.8.6 → langgraph_api-0.9.0}/langgraph_grpc_common/proto/enum_cron_on_run_completed_pb2.pyi +0 -0
- {langgraph_api-0.8.6 → langgraph_api-0.9.0}/langgraph_grpc_common/proto/enum_cron_on_run_completed_pb2_grpc.py +0 -0
- {langgraph_api-0.8.6 → langgraph_api-0.9.0}/langgraph_grpc_common/proto/enum_cron_on_run_completed_pb2_grpc.pyi +0 -0
- {langgraph_api-0.8.6 → langgraph_api-0.9.0}/langgraph_grpc_common/proto/enum_durability_pb2.py +0 -0
- {langgraph_api-0.8.6 → langgraph_api-0.9.0}/langgraph_grpc_common/proto/enum_durability_pb2.pyi +0 -0
- {langgraph_api-0.8.6 → langgraph_api-0.9.0}/langgraph_grpc_common/proto/enum_durability_pb2_grpc.py +0 -0
- {langgraph_api-0.8.6 → langgraph_api-0.9.0}/langgraph_grpc_common/proto/enum_durability_pb2_grpc.pyi +0 -0
- {langgraph_api-0.8.6 → langgraph_api-0.9.0}/langgraph_grpc_common/proto/enum_multitask_strategy_pb2.py +0 -0
- {langgraph_api-0.8.6 → langgraph_api-0.9.0}/langgraph_grpc_common/proto/enum_multitask_strategy_pb2.pyi +0 -0
- {langgraph_api-0.8.6 → langgraph_api-0.9.0}/langgraph_grpc_common/proto/enum_multitask_strategy_pb2_grpc.py +0 -0
- {langgraph_api-0.8.6 → langgraph_api-0.9.0}/langgraph_grpc_common/proto/enum_multitask_strategy_pb2_grpc.pyi +0 -0
- {langgraph_api-0.8.6 → langgraph_api-0.9.0}/langgraph_grpc_common/proto/enum_run_status_pb2.py +0 -0
- {langgraph_api-0.8.6 → langgraph_api-0.9.0}/langgraph_grpc_common/proto/enum_run_status_pb2.pyi +0 -0
- {langgraph_api-0.8.6 → langgraph_api-0.9.0}/langgraph_grpc_common/proto/enum_run_status_pb2_grpc.py +0 -0
- {langgraph_api-0.8.6 → langgraph_api-0.9.0}/langgraph_grpc_common/proto/enum_run_status_pb2_grpc.pyi +0 -0
- {langgraph_api-0.8.6 → langgraph_api-0.9.0}/langgraph_grpc_common/proto/enum_stream_mode_pb2.py +0 -0
- {langgraph_api-0.8.6 → langgraph_api-0.9.0}/langgraph_grpc_common/proto/enum_stream_mode_pb2.pyi +0 -0
- {langgraph_api-0.8.6 → langgraph_api-0.9.0}/langgraph_grpc_common/proto/enum_stream_mode_pb2_grpc.py +0 -0
- {langgraph_api-0.8.6 → langgraph_api-0.9.0}/langgraph_grpc_common/proto/enum_stream_mode_pb2_grpc.pyi +0 -0
- {langgraph_api-0.8.6 → langgraph_api-0.9.0}/langgraph_grpc_common/proto/enum_thread_status_pb2.py +0 -0
- {langgraph_api-0.8.6 → langgraph_api-0.9.0}/langgraph_grpc_common/proto/enum_thread_status_pb2.pyi +0 -0
- {langgraph_api-0.8.6 → langgraph_api-0.9.0}/langgraph_grpc_common/proto/enum_thread_status_pb2_grpc.py +0 -0
- {langgraph_api-0.8.6 → langgraph_api-0.9.0}/langgraph_grpc_common/proto/enum_thread_status_pb2_grpc.pyi +0 -0
- {langgraph_api-0.8.6 → langgraph_api-0.9.0}/langgraph_grpc_common/proto/enum_thread_stream_mode_pb2.py +0 -0
- {langgraph_api-0.8.6 → langgraph_api-0.9.0}/langgraph_grpc_common/proto/enum_thread_stream_mode_pb2.pyi +0 -0
- {langgraph_api-0.8.6 → langgraph_api-0.9.0}/langgraph_grpc_common/proto/enum_thread_stream_mode_pb2_grpc.py +0 -0
- {langgraph_api-0.8.6 → langgraph_api-0.9.0}/langgraph_grpc_common/proto/enum_thread_stream_mode_pb2_grpc.pyi +0 -0
- {langgraph_api-0.8.6 → langgraph_api-0.9.0}/langgraph_grpc_common/proto/errors_pb2.py +0 -0
- {langgraph_api-0.8.6 → langgraph_api-0.9.0}/langgraph_grpc_common/proto/errors_pb2_grpc.py +0 -0
- {langgraph_api-0.8.6 → langgraph_api-0.9.0}/langgraph_grpc_common/proto/errors_pb2_grpc.pyi +0 -0
- {langgraph_api-0.8.6 → langgraph_api-0.9.0}/langgraph_grpc_common/serde.py +0 -0
- {langgraph_api-0.8.6 → langgraph_api-0.9.0}/langgraph_license/__init__.py +0 -0
- {langgraph_api-0.8.6 → langgraph_api-0.9.0}/langgraph_license/validation.py +0 -0
- {langgraph_api-0.8.6 → langgraph_api-0.9.0}/langgraph_runtime/__init__.py +0 -0
- {langgraph_api-0.8.6 → langgraph_api-0.9.0}/langgraph_runtime/checkpoint.py +0 -0
- {langgraph_api-0.8.6 → langgraph_api-0.9.0}/langgraph_runtime/database.py +0 -0
- {langgraph_api-0.8.6 → langgraph_api-0.9.0}/langgraph_runtime/lifespan.py +0 -0
- {langgraph_api-0.8.6 → langgraph_api-0.9.0}/langgraph_runtime/metrics.py +0 -0
- {langgraph_api-0.8.6 → langgraph_api-0.9.0}/langgraph_runtime/ops.py +0 -0
- {langgraph_api-0.8.6 → langgraph_api-0.9.0}/langgraph_runtime/queue.py +0 -0
- {langgraph_api-0.8.6 → langgraph_api-0.9.0}/langgraph_runtime/retry.py +0 -0
- {langgraph_api-0.8.6 → langgraph_api-0.9.0}/langgraph_runtime/routes.py +0 -0
- {langgraph_api-0.8.6 → langgraph_api-0.9.0}/langgraph_runtime/store.py +0 -0
- {langgraph_api-0.8.6 → langgraph_api-0.9.0}/logging.json +0 -0
- {langgraph_api-0.8.6 → langgraph_api-0.9.0}/scripts/build_wheel.py +0 -0
- {langgraph_api-0.8.6 → langgraph_api-0.9.0}/scripts/create_license.py +0 -0
- {langgraph_api-0.8.6 → langgraph_api-0.9.0}/scripts/run_a2a_tck.py +0 -0
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
.PHONY: build release lint format test test_watch start start-inmem start-inmem-license-oss start start-js-server build-go-server start-go-server stop-go-server check-version check-base-imports test-a2a-tck test-a2a-tck-mandatory start-test-a2a-tck start-test-a2a-tck-mandatory start-test-a2a-tck-watch test-mcp-conformance start-test-mcp-conformance list-mcp-scenarios
|
|
2
2
|
|
|
3
3
|
# Environment variables
|
|
4
|
-
LANGSERVE_GRAPHS_ALL = '{"agent": {"path": "./tests/graphs/agent.py:graph", "description": "agent"}, "assistant_id_runtime": "./tests/graphs/assistant_id_runtime.py:graph", "custom_lifespan": "./tests/graphs/my_router.py:graph", "single_node": "./tests/graphs/single_node.py:graph", "benchmark": "./tests/graphs/benchmark.py:graph", "config_graph": "./tests/graphs/config_graph.py:graph", "other": "./tests/graphs/other.py:make_graph", "weather": "./tests/graphs/weather.py:mk_weather_graph", "searchy": "./tests/graphs/searchy.py:graph", "agent_simple": "./tests/graphs/agent_simple.py:graph", "simple_runtime": "./tests/graphs/simple_runtime.py:graph", "agent_interrupt": "./tests/graphs/agent_interrupt.py:graph", "agent_parallel_interrupt": "./tests/graphs/agent_parallel_interrupt.py:graph", "message_type_test": "./tests/graphs/message_type_test.py:graph", "remote_subgraph_parent": "./tests/graphs/remote_subgraph_parent.py:graph", "simple_remote": "./tests/graphs/simple_remote.py:graph", "nested_subgraphs": "./tests/graphs/nested_subgraphs.py:graph", "functional_fibonacci": "./tests/graphs/functional_fibonacci.py:fibonacci", "state_graph_fibonacci": "./tests/graphs/state_graph_fibonacci.py:fibonacci", "max_concurrency_graph": "./tests/graphs/max_concurrency_graph.py:graph", "unserializable_subgraph": "./tests/graphs/unserializable_subgraph.py:graph", "agent_interrupt_text": "./tests/graphs/agent_interrupt_text.py:graph", "agent_echo_stream": "./tests/graphs/agent_echo_stream.py:graph", "agent_tool_stream": "./tests/graphs/agent_tool_stream.py:graph", "runtime_graph": "./tests/graphs/runtime_graph.py:graph", "tool_call_chunk_stream": "./tests/graphs/tool_call_chunk_stream.py:graph", "ui_tool_call_stream": "./tests/graphs/ui_tool_call_stream.py:graph", "agent_metrics_stream": "./tests/graphs/agent_metrics_stream.py:graph", "agent_multimodal_stream": "./tests/graphs/agent_multimodal_stream.py:graph", "agent_bedtime_story": "./tests/graphs/agent_bedtime_story.py:graph"}'
|
|
4
|
+
LANGSERVE_GRAPHS_ALL = '{"agent": {"path": "./tests/graphs/agent.py:graph", "description": "agent"}, "assistant_id_runtime": "./tests/graphs/assistant_id_runtime.py:graph", "custom_lifespan": "./tests/graphs/my_router.py:graph", "single_node": "./tests/graphs/single_node.py:graph", "benchmark": "./tests/graphs/benchmark.py:graph", "config_graph": "./tests/graphs/config_graph.py:graph", "other": "./tests/graphs/other.py:make_graph", "weather": "./tests/graphs/weather.py:mk_weather_graph", "searchy": "./tests/graphs/searchy.py:graph", "agent_simple": "./tests/graphs/agent_simple.py:graph", "simple_runtime": "./tests/graphs/simple_runtime.py:graph", "agent_interrupt": "./tests/graphs/agent_interrupt.py:graph", "agent_parallel_interrupt": "./tests/graphs/agent_parallel_interrupt.py:graph", "message_type_test": "./tests/graphs/message_type_test.py:graph", "remote_subgraph_parent": "./tests/graphs/remote_subgraph_parent.py:graph", "simple_remote": "./tests/graphs/simple_remote.py:graph", "nested_subgraphs": "./tests/graphs/nested_subgraphs.py:graph", "functional_fibonacci": "./tests/graphs/functional_fibonacci.py:fibonacci", "state_graph_fibonacci": "./tests/graphs/state_graph_fibonacci.py:fibonacci", "max_concurrency_graph": "./tests/graphs/max_concurrency_graph.py:graph", "unserializable_subgraph": "./tests/graphs/unserializable_subgraph.py:graph", "agent_interrupt_text": "./tests/graphs/agent_interrupt_text.py:graph", "agent_echo_stream": "./tests/graphs/agent_echo_stream.py:graph", "agent_tool_stream": "./tests/graphs/agent_tool_stream.py:graph", "runtime_graph": "./tests/graphs/runtime_graph.py:graph", "tool_call_chunk_stream": "./tests/graphs/tool_call_chunk_stream.py:graph", "ui_tool_call_stream": "./tests/graphs/ui_tool_call_stream.py:graph", "agent_metrics_stream": "./tests/graphs/agent_metrics_stream.py:graph", "agent_multimodal_stream": "./tests/graphs/agent_multimodal_stream.py:graph", "agent_bedtime_story": "./tests/graphs/agent_bedtime_story.py:graph", "delta_channel": "./tests/graphs/delta_channel.py:graph", "delta_channel_freq": "./tests/graphs/delta_channel_freq.py:graph", "delta_channel_files": "./tests/graphs/delta_channel_files.py:graph", "delta_channel_files_freq": "./tests/graphs/delta_channel_files_freq.py:graph", "delta_channel_legacy": "./tests/graphs/delta_channel_migration.py:graph_legacy", "delta_channel_delta": "./tests/graphs/delta_channel_migration.py:graph_delta", "delta_channel_messages_freq": "./tests/graphs/delta_channel_messages.py:graph_freq", "delta_channel_messages": "./tests/graphs/delta_channel_messages.py:graph", "delta_channel_messages_legacy": "./tests/graphs/delta_channel_messages.py:graph_legacy", "delta_channel_messages_remove": "./tests/graphs/delta_channel_messages.py:graph_remove", "delta_channel_messages_update": "./tests/graphs/delta_channel_messages.py:graph_update", "delta_channel_messages_delta": "./tests/graphs/delta_channel_messages.py:graph_delta"}'
|
|
5
5
|
LANGSERVE_GRAPHS_AUTH = '{"agent": {"path": "./tests/graphs/agent.py:graph", "description": "agent"}, "assistant_id_runtime": "./tests/graphs/assistant_id_runtime.py:graph", "config_graph": "./tests/graphs/config_graph.py:graph", "other": "./tests/graphs/other.py:make_graph", "weather": "./tests/graphs/weather.py:mk_weather_graph", "searchy": "./tests/graphs/searchy.py:graph", "agent_simple": "./tests/graphs/agent_simple.py:graph", "simple_runtime": "./tests/graphs/simple_runtime.py:graph", "agent_parallel_interrupt": "./tests/graphs/agent_parallel_interrupt.py:graph", "functional_fibonacci": "./tests/graphs/functional_fibonacci.py:fibonacci", "state_graph_fibonacci": "./tests/graphs/state_graph_fibonacci.py:fibonacci", "runtime_graph": "./tests/graphs/runtime_graph.py:graph"}'
|
|
6
6
|
|
|
7
7
|
# Go server management
|
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: langgraph-api
|
|
3
|
-
Version: 0.
|
|
3
|
+
Version: 0.9.0
|
|
4
4
|
Author-email: Will Fu-Hinthorn <will@langchain.dev>, Josh Rogers <josh@langchain.dev>, Parker Rule <parker@langchain.dev>
|
|
5
5
|
License: Elastic-2.0
|
|
6
6
|
License-File: LICENSE
|
|
7
7
|
Requires-Python: >=3.11
|
|
8
8
|
Requires-Dist: cloudpickle>=3.0.0
|
|
9
|
-
Requires-Dist: cryptography
|
|
9
|
+
Requires-Dist: cryptography>=42.0.0
|
|
10
10
|
Requires-Dist: grpcio-health-checking<1.81.0,>=1.80.0
|
|
11
11
|
Requires-Dist: grpcio-tools==1.80.0
|
|
12
12
|
Requires-Dist: grpcio<1.81.0,>=1.80.0
|
|
@@ -16,7 +16,7 @@ Requires-Dist: jsonschema-rs<0.45,>=0.20.0
|
|
|
16
16
|
Requires-Dist: langchain-core>=0.3.64
|
|
17
17
|
Requires-Dist: langchain-protocol<0.1,>=0.0.15
|
|
18
18
|
Requires-Dist: langgraph-checkpoint<5,>=3.0.1
|
|
19
|
-
Requires-Dist: langgraph-runtime-inmem<0.
|
|
19
|
+
Requires-Dist: langgraph-runtime-inmem<0.30.0,>=0.29.0
|
|
20
20
|
Requires-Dist: langgraph-sdk>=0.3.5
|
|
21
21
|
Requires-Dist: langgraph<2,>=0.4.10
|
|
22
22
|
Requires-Dist: langsmith[otel]>=0.6.3
|
|
@@ -130,15 +130,15 @@ requires-dist = [
|
|
|
130
130
|
|
|
131
131
|
[[package]]
|
|
132
132
|
name = "langgraph-sdk"
|
|
133
|
-
version = "0.3.
|
|
133
|
+
version = "0.3.14"
|
|
134
134
|
source = { registry = "https://pypi.org/simple" }
|
|
135
135
|
dependencies = [
|
|
136
136
|
{ name = "httpx" },
|
|
137
137
|
{ name = "orjson" },
|
|
138
138
|
]
|
|
139
|
-
sdist = { url = "https://files.pythonhosted.org/packages/
|
|
139
|
+
sdist = { url = "https://files.pythonhosted.org/packages/02/f1/134046c20bc4a4a15d410d1d21c9e298a3e9923777b4cc867b8669bc636b/langgraph_sdk-0.3.14.tar.gz", hash = "sha256:acd1674c538e97f3cdaa610f6dd7e34bc9bad30167f0ccc482dcd563325e81f5", size = 198162, upload-time = "2026-05-05T18:40:03.524Z" }
|
|
140
140
|
wheels = [
|
|
141
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
141
|
+
{ url = "https://files.pythonhosted.org/packages/34/96/1c9f9fbfe756ddd850a2585e7f1949d8ebb97fdaa7a5eff8f45ed1314670/langgraph_sdk-0.3.14-py3-none-any.whl", hash = "sha256:68935bf6f4924eda92617a9e5dfb4f4281197508c648cb9d62ff083907607f9d", size = 97028, upload-time = "2026-05-05T18:40:02.099Z" },
|
|
142
142
|
]
|
|
143
143
|
|
|
144
144
|
[[package]]
|
|
@@ -220,9 +220,9 @@ wheels = [
|
|
|
220
220
|
|
|
221
221
|
[[package]]
|
|
222
222
|
name = "urllib3"
|
|
223
|
-
version = "2.
|
|
223
|
+
version = "2.7.0"
|
|
224
224
|
source = { registry = "https://pypi.org/simple" }
|
|
225
|
-
sdist = { url = "https://files.pythonhosted.org/packages/
|
|
225
|
+
sdist = { url = "https://files.pythonhosted.org/packages/53/0c/06f8b233b8fd13b9e5ee11424ef85419ba0d8ba0b3138bf360be2ff56953/urllib3-2.7.0.tar.gz", hash = "sha256:231e0ec3b63ceb14667c67be60f2f2c40a518cb38b03af60abc813da26505f4c", size = 433602, upload-time = "2026-05-07T16:13:18.596Z" }
|
|
226
226
|
wheels = [
|
|
227
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
227
|
+
{ url = "https://files.pythonhosted.org/packages/7f/3e/5db95bcf282c52709639744ca2a8b149baccf648e39c8cc87553df9eae0c/urllib3-2.7.0-py3-none-any.whl", hash = "sha256:9fb4c81ebbb1ce9531cce37674bbc6f1360472bc18ca9a553ede278ef7276897", size = 131087, upload-time = "2026-05-07T16:13:17.151Z" },
|
|
228
228
|
]
|
|
@@ -1,6 +1,8 @@
|
|
|
1
1
|
import { sleep } from 'k6';
|
|
2
2
|
import { Counter, Trend } from 'k6/metrics';
|
|
3
|
-
|
|
3
|
+
function randomIntBetween(min, max) {
|
|
4
|
+
return Math.floor(Math.random() * (max - min + 1) + min);
|
|
5
|
+
}
|
|
4
6
|
import { Benchmarks } from './benchmark-runners/dist/benchmarks.js';
|
|
5
7
|
import { get_profile } from './benchmark-runners/dist/benchmark_profiles.js';
|
|
6
8
|
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
__version__ = "0.9.0"
|
|
@@ -15,11 +15,11 @@ from starlette.routing import BaseRoute, Route
|
|
|
15
15
|
from langgraph_api import timing
|
|
16
16
|
from langgraph_api.api.a2a import a2a_routes
|
|
17
17
|
from langgraph_api.api.assistants import assistants_routes
|
|
18
|
+
from langgraph_api.api.event_streaming import event_streaming_routes
|
|
18
19
|
from langgraph_api.api.mcp import mcp_routes
|
|
19
20
|
from langgraph_api.api.meta import meta_info, meta_metrics
|
|
20
21
|
from langgraph_api.api.openapi import get_openapi_spec
|
|
21
22
|
from langgraph_api.api.profile import profile_routes
|
|
22
|
-
from langgraph_api.api.protocol import protocol_routes
|
|
23
23
|
from langgraph_api.api.runs import runs_routes
|
|
24
24
|
from langgraph_api.api.store import store_routes
|
|
25
25
|
from langgraph_api.api.threads import threads_routes
|
|
@@ -31,7 +31,10 @@ from langgraph_api.config import (
|
|
|
31
31
|
LANGGRAPH_ENCRYPTION,
|
|
32
32
|
MIGRATIONS_PATH,
|
|
33
33
|
)
|
|
34
|
-
from langgraph_api.feature_flags import
|
|
34
|
+
from langgraph_api.feature_flags import (
|
|
35
|
+
FF_V2_EVENT_STREAMING,
|
|
36
|
+
IS_POSTGRES_OR_GRPC_BACKEND,
|
|
37
|
+
)
|
|
35
38
|
from langgraph_api.graph import js_bg_tasks
|
|
36
39
|
from langgraph_api.grpc.client import get_shared_client
|
|
37
40
|
from langgraph_api.js.base import is_js_path
|
|
@@ -132,8 +135,20 @@ if HTTP_CONFIG:
|
|
|
132
135
|
protected_routes.extend(mcp_routes)
|
|
133
136
|
if not HTTP_CONFIG.get("disable_a2a"):
|
|
134
137
|
protected_routes.extend(a2a_routes)
|
|
135
|
-
|
|
136
|
-
|
|
138
|
+
# ``disable_runs`` also gates event streaming because the v2 transport
|
|
139
|
+
# exposes run-creating commands (``run.start`` / ``run.cancel`` /
|
|
140
|
+
# ``run.attach`` over the WS, plus the ``/runs/{run_id}/protocol``
|
|
141
|
+
# attach route). If an operator hardens a deployment with
|
|
142
|
+
# ``disable_runs=true``, leaving event streaming open would be a
|
|
143
|
+
# backdoor that lets clients create runs anyway. ``disable_event_streaming``
|
|
144
|
+
# is the narrow knob (turn off just v2); ``disable_runs`` is the broad
|
|
145
|
+
# knob (no run-related functionality at all).
|
|
146
|
+
if (
|
|
147
|
+
FF_V2_EVENT_STREAMING
|
|
148
|
+
and not HTTP_CONFIG.get("disable_runs")
|
|
149
|
+
and not HTTP_CONFIG.get("disable_event_streaming")
|
|
150
|
+
):
|
|
151
|
+
protected_routes.extend(event_streaming_routes)
|
|
137
152
|
else:
|
|
138
153
|
protected_routes.extend(assistants_routes)
|
|
139
154
|
protected_routes.extend(runs_routes)
|
|
@@ -144,7 +159,8 @@ else:
|
|
|
144
159
|
protected_routes.extend(ui_routes)
|
|
145
160
|
protected_routes.extend(mcp_routes)
|
|
146
161
|
protected_routes.extend(a2a_routes)
|
|
147
|
-
|
|
162
|
+
if FF_V2_EVENT_STREAMING:
|
|
163
|
+
protected_routes.extend(event_streaming_routes)
|
|
148
164
|
|
|
149
165
|
|
|
150
166
|
def _metadata_fn(app_import: str) -> dict[str, str]:
|
|
@@ -1,7 +1,9 @@
|
|
|
1
|
-
"""
|
|
1
|
+
"""V2 event streaming transport routes (thread-centric).
|
|
2
2
|
|
|
3
|
-
|
|
4
|
-
|
|
3
|
+
These routes implement the v2 event streaming protocol — see
|
|
4
|
+
:mod:`langgraph_api.event_streaming` for the session/normalizer layer that
|
|
5
|
+
shapes the wire events. Connections are scoped to a thread via the URL
|
|
6
|
+
path; there is no server-side session state across connections.
|
|
5
7
|
|
|
6
8
|
Endpoints:
|
|
7
9
|
|
|
@@ -19,6 +21,8 @@ Endpoints:
|
|
|
19
21
|
from __future__ import annotations
|
|
20
22
|
|
|
21
23
|
import asyncio
|
|
24
|
+
import contextlib
|
|
25
|
+
from collections import deque
|
|
22
26
|
from typing import TYPE_CHECKING, Any
|
|
23
27
|
from uuid import uuid4
|
|
24
28
|
|
|
@@ -27,10 +31,10 @@ import structlog
|
|
|
27
31
|
from starlette.responses import Response
|
|
28
32
|
from starlette.websockets import WebSocketDisconnect
|
|
29
33
|
|
|
34
|
+
from langgraph_api.event_streaming.service import ThreadRunManager
|
|
35
|
+
from langgraph_api.event_streaming.session import _is_supported_channel
|
|
36
|
+
from langgraph_api.event_streaming.types import Subscription
|
|
30
37
|
from langgraph_api.feature_flags import IS_POSTGRES_OR_GRPC_BACKEND
|
|
31
|
-
from langgraph_api.protocol.service import ThreadRunManager
|
|
32
|
-
from langgraph_api.protocol.session import _is_supported_channel
|
|
33
|
-
from langgraph_api.protocol.types import Subscription
|
|
34
38
|
from langgraph_api.route import ApiRoute, ApiWebSocketRoute
|
|
35
39
|
from langgraph_api.serde import json_dumpb
|
|
36
40
|
from langgraph_api.sse import EventSourceResponse
|
|
@@ -47,6 +51,17 @@ else:
|
|
|
47
51
|
logger = structlog.stdlib.get_logger(__name__)
|
|
48
52
|
|
|
49
53
|
|
|
54
|
+
# Maximum number of recently-delivered ``event_id`` values an SSE
|
|
55
|
+
# connection remembers for dedup. The dedup window only needs to cover
|
|
56
|
+
# the brief race where a single event arrives both via the thread
|
|
57
|
+
# source consumer and via the session's send callback (subscription
|
|
58
|
+
# install handoff); after that, events flow through one path
|
|
59
|
+
# consistently. Cap chosen with ample headroom — a pathological
|
|
60
|
+
# replay storm of 2k events still fits in <50 KB of strings per
|
|
61
|
+
# connection, vs. the unbounded set this replaces.
|
|
62
|
+
_DELIVERED_DEDUP_WINDOW = 2048
|
|
63
|
+
|
|
64
|
+
|
|
50
65
|
def _json_response(content: Any, *, status_code: int = 200) -> Response:
|
|
51
66
|
"""JSON response backed by the repo's orjson helper.
|
|
52
67
|
|
|
@@ -80,35 +95,6 @@ def _make_manager(thread_id: str, send_event: Any = None) -> ThreadRunManager:
|
|
|
80
95
|
# ---------------------------------------------------------------------------
|
|
81
96
|
|
|
82
97
|
|
|
83
|
-
def _parse_since(body: Any, headers: Any) -> int | None:
|
|
84
|
-
"""Resolve the effective resume cursor from body and headers.
|
|
85
|
-
|
|
86
|
-
Precedence: ``since`` in the ``EventStreamRequest`` body wins, falling
|
|
87
|
-
back to the ``Last-Event-ID`` header. Both are interpreted as the
|
|
88
|
-
last protocol ``seq`` the client received; the server replays events
|
|
89
|
-
with ``seq > since``.
|
|
90
|
-
"""
|
|
91
|
-
body_since: int | None = None
|
|
92
|
-
if isinstance(body, dict):
|
|
93
|
-
raw_since = body.get("since")
|
|
94
|
-
if isinstance(raw_since, int) and raw_since >= 0:
|
|
95
|
-
body_since = raw_since
|
|
96
|
-
|
|
97
|
-
header_since: int | None = None
|
|
98
|
-
last_event_id = headers.get("last-event-id") if headers is not None else None
|
|
99
|
-
if isinstance(last_event_id, str) and last_event_id.strip():
|
|
100
|
-
try:
|
|
101
|
-
parsed = int(last_event_id.strip())
|
|
102
|
-
except ValueError:
|
|
103
|
-
parsed = -1
|
|
104
|
-
if parsed >= 0:
|
|
105
|
-
header_since = parsed
|
|
106
|
-
|
|
107
|
-
if body_since is not None and header_since is not None:
|
|
108
|
-
return max(body_since, header_since)
|
|
109
|
-
return body_since if body_since is not None else header_since
|
|
110
|
-
|
|
111
|
-
|
|
112
98
|
async def _thread_events(request: Request) -> Response:
|
|
113
99
|
"""SSE stream scoped to a thread.
|
|
114
100
|
|
|
@@ -121,12 +107,11 @@ async def _thread_events(request: Request) -> Response:
|
|
|
121
107
|
"since": 42 // optional seq
|
|
122
108
|
}
|
|
123
109
|
|
|
124
|
-
On reconnect, clients
|
|
125
|
-
|
|
126
|
-
the
|
|
127
|
-
``
|
|
128
|
-
|
|
129
|
-
higher (most recent) value wins.
|
|
110
|
+
On reconnect, clients pass the last ``seq`` they received as
|
|
111
|
+
``since`` in the body. Buffered events with ``seq > since`` are
|
|
112
|
+
replayed before the stream goes live. The endpoint is POST-only, so
|
|
113
|
+
browser-native ``EventSource`` auto-resume (``Last-Event-ID``)
|
|
114
|
+
doesn't apply — clients drive resume explicitly via the body.
|
|
130
115
|
|
|
131
116
|
The filter applies for the lifetime of the connection; closing the
|
|
132
117
|
connection unsubscribes. No state is persisted server-side beyond the
|
|
@@ -186,26 +171,45 @@ async def _thread_events(request: Request) -> Response:
|
|
|
186
171
|
namespaces = filtered_ns or None
|
|
187
172
|
|
|
188
173
|
depth = body.get("depth") if isinstance(body, dict) else None
|
|
189
|
-
|
|
174
|
+
# ``bool`` is a subclass of ``int``, so a JSON ``"depth": false`` would
|
|
175
|
+
# otherwise fall through as ``depth=0`` ("only the exact prefix
|
|
176
|
+
# namespace, no deeper") and silently mute every nested-subgraph
|
|
177
|
+
# event. Treat any non-int (including bool) as "no depth limit".
|
|
178
|
+
if not isinstance(depth, int) or isinstance(depth, bool) or depth < 0:
|
|
190
179
|
depth = None
|
|
191
180
|
|
|
192
|
-
|
|
181
|
+
raw_since = body.get("since") if isinstance(body, dict) else None
|
|
182
|
+
# Reject ``bool`` explicitly — ``isinstance(True, int)`` is ``True``
|
|
183
|
+
# so a JSON ``"since": true`` would otherwise pass as ``since=1``
|
|
184
|
+
# and silently skip the first buffered event on reconnect.
|
|
185
|
+
since: int | None = (
|
|
186
|
+
raw_since
|
|
187
|
+
if isinstance(raw_since, int)
|
|
188
|
+
and not isinstance(raw_since, bool)
|
|
189
|
+
and raw_since >= 0
|
|
190
|
+
else None
|
|
191
|
+
)
|
|
193
192
|
|
|
193
|
+
# Bounded LRU dedup: ``recent_eids`` is the eviction order, ``delivered``
|
|
194
|
+
# is the O(1) membership view. When the deque hits its cap, the oldest
|
|
195
|
+
# entry rolls off; we mirror that on ``delivered`` to keep them in sync.
|
|
196
|
+
recent_eids: deque[str] = deque(maxlen=_DELIVERED_DEDUP_WINDOW)
|
|
194
197
|
delivered: set[str] = set()
|
|
195
198
|
pending_events: list[dict[str, Any]] = []
|
|
196
199
|
flush_pending = asyncio.Event()
|
|
197
200
|
|
|
198
201
|
async def on_event(event: dict[str, Any]) -> None:
|
|
199
202
|
eid = event.get("event_id")
|
|
200
|
-
if eid is None:
|
|
201
|
-
return
|
|
202
|
-
if eid in delivered:
|
|
203
|
+
if eid is None or eid in delivered:
|
|
203
204
|
return
|
|
204
205
|
# Guard against events with seq <= since slipping through (e.g.
|
|
205
206
|
# events delivered via the session's send callback before the
|
|
206
207
|
# subscription is installed with replay).
|
|
207
208
|
if since is not None and event.get("seq", 0) <= since:
|
|
208
209
|
return
|
|
210
|
+
if len(recent_eids) == recent_eids.maxlen:
|
|
211
|
+
delivered.discard(recent_eids[0])
|
|
212
|
+
recent_eids.append(eid)
|
|
209
213
|
delivered.add(eid)
|
|
210
214
|
pending_events.append(event)
|
|
211
215
|
flush_pending.set()
|
|
@@ -219,14 +223,47 @@ async def _thread_events(request: Request) -> Response:
|
|
|
219
223
|
depth=depth,
|
|
220
224
|
active=False,
|
|
221
225
|
)
|
|
226
|
+
await logger.adebug(
|
|
227
|
+
"Installing event streaming subscription",
|
|
228
|
+
thread_id=thread_id,
|
|
229
|
+
subscription_id=filter_sub.id,
|
|
230
|
+
channels=sorted(filter_sub.channels),
|
|
231
|
+
depth=depth,
|
|
232
|
+
since=since,
|
|
233
|
+
)
|
|
222
234
|
|
|
223
235
|
manager.install_subscription(filter_sub)
|
|
224
|
-
|
|
236
|
+
# ``since`` is enforced by ``on_event`` above as a seq filter on
|
|
237
|
+
# outbound events; the thread-level reader always replays from the
|
|
238
|
+
# beginning so namespace-scoped projections see history. See
|
|
239
|
+
# ``ThreadRunManager.start_thread_stream`` for the rationale.
|
|
240
|
+
manager.start_thread_stream()
|
|
225
241
|
|
|
226
242
|
async def body_iter():
|
|
227
243
|
try:
|
|
228
244
|
while True:
|
|
229
|
-
|
|
245
|
+
# Race ``flush_pending`` against the thread-stream consumer
|
|
246
|
+
# ending. If the consumer dies (transient join_event_streaming
|
|
247
|
+
# error, or normal shutdown), we want this loop to exit
|
|
248
|
+
# rather than wedge forever waiting for events that will
|
|
249
|
+
# never arrive.
|
|
250
|
+
flush_task = asyncio.create_task(flush_pending.wait())
|
|
251
|
+
done_task = asyncio.create_task(manager.wait_for_thread_stream_end())
|
|
252
|
+
try:
|
|
253
|
+
done, _pending = await asyncio.wait(
|
|
254
|
+
{flush_task, done_task},
|
|
255
|
+
return_when=asyncio.FIRST_COMPLETED,
|
|
256
|
+
)
|
|
257
|
+
finally:
|
|
258
|
+
for p in (flush_task, done_task):
|
|
259
|
+
if not p.done():
|
|
260
|
+
p.cancel()
|
|
261
|
+
with contextlib.suppress(asyncio.CancelledError, Exception):
|
|
262
|
+
await p
|
|
263
|
+
stream_finished = done_task in done
|
|
264
|
+
# Always drain whatever was buffered before exiting so a
|
|
265
|
+
# final batch that arrived alongside the consumer's exit
|
|
266
|
+
# still reaches the client.
|
|
230
267
|
flush_pending.clear()
|
|
231
268
|
events = pending_events[:]
|
|
232
269
|
pending_events.clear()
|
|
@@ -234,10 +271,10 @@ async def _thread_events(request: Request) -> Response:
|
|
|
234
271
|
# The wire ``event_id`` (inside the JSON body) carries
|
|
235
272
|
# the durable upstream Redis stream entry id used by
|
|
236
273
|
# the client's ``seenEventIds`` for cross-session
|
|
237
|
-
# dedup. The SSE ``id:`` field
|
|
238
|
-
#
|
|
239
|
-
#
|
|
240
|
-
# ``
|
|
274
|
+
# dedup. The SSE ``id:`` field carries the protocol
|
|
275
|
+
# ``seq`` (session-local monotonic int) so server
|
|
276
|
+
# logs and traces can correlate against the body
|
|
277
|
+
# ``since`` cursor a reconnecting client sends.
|
|
241
278
|
sse_id = event.get("seq")
|
|
242
279
|
method = event.get("method", "event")
|
|
243
280
|
yield (
|
|
@@ -245,6 +282,8 @@ async def _thread_events(request: Request) -> Response:
|
|
|
245
282
|
json_dumpb(event),
|
|
246
283
|
str(sse_id).encode() if isinstance(sse_id, int) else None,
|
|
247
284
|
)
|
|
285
|
+
if stream_finished:
|
|
286
|
+
break
|
|
248
287
|
finally:
|
|
249
288
|
await manager.close()
|
|
250
289
|
|
|
@@ -275,6 +314,13 @@ async def _thread_command(request: Request) -> Response:
|
|
|
275
314
|
or not isinstance(payload.get("id"), int)
|
|
276
315
|
or not isinstance(payload.get("method"), str)
|
|
277
316
|
):
|
|
317
|
+
await logger.awarning(
|
|
318
|
+
"Rejected malformed event streaming command",
|
|
319
|
+
thread_id=thread_id,
|
|
320
|
+
payload_id=payload.get("id") if isinstance(payload, dict) else None,
|
|
321
|
+
payload_method=payload.get("method") if isinstance(payload, dict) else None,
|
|
322
|
+
payload_type=type(payload).__name__,
|
|
323
|
+
)
|
|
278
324
|
return _json_response(
|
|
279
325
|
{
|
|
280
326
|
"type": "error",
|
|
@@ -316,6 +362,19 @@ async def _thread_websocket(websocket: WebSocket) -> None:
|
|
|
316
362
|
manager = _make_manager(thread_id, send_event=ws_send_event)
|
|
317
363
|
manager.start_thread_stream()
|
|
318
364
|
|
|
365
|
+
# Watchdog: when the thread-stream consumer ends (transient
|
|
366
|
+
# ``join_event_streaming`` failure or normal shutdown), close the socket so
|
|
367
|
+
# the client sees a clean disconnect instead of an open connection
|
|
368
|
+
# that will never deliver another event. ``receive_text`` below
|
|
369
|
+
# raises ``WebSocketDisconnect`` once the close lands, exiting the
|
|
370
|
+
# loop through its existing handler.
|
|
371
|
+
async def _stream_watchdog() -> None:
|
|
372
|
+
await manager.wait_for_thread_stream_end()
|
|
373
|
+
with contextlib.suppress(Exception):
|
|
374
|
+
await websocket.close(code=1011, reason="thread stream ended")
|
|
375
|
+
|
|
376
|
+
watchdog = asyncio.create_task(_stream_watchdog())
|
|
377
|
+
|
|
319
378
|
try:
|
|
320
379
|
while True:
|
|
321
380
|
raw = await websocket.receive_text()
|
|
@@ -354,6 +413,9 @@ async def _thread_websocket(websocket: WebSocket) -> None:
|
|
|
354
413
|
except Exception:
|
|
355
414
|
logger.exception("Protocol WebSocket error")
|
|
356
415
|
finally:
|
|
416
|
+
watchdog.cancel()
|
|
417
|
+
with contextlib.suppress(asyncio.CancelledError, Exception):
|
|
418
|
+
await watchdog
|
|
357
419
|
await manager.close()
|
|
358
420
|
|
|
359
421
|
|
|
@@ -361,7 +423,7 @@ async def _thread_websocket(websocket: WebSocket) -> None:
|
|
|
361
423
|
# Route list
|
|
362
424
|
# ---------------------------------------------------------------------------
|
|
363
425
|
|
|
364
|
-
|
|
426
|
+
event_streaming_routes: list[ApiRoute | ApiWebSocketRoute] = [
|
|
365
427
|
ApiRoute(
|
|
366
428
|
"/threads/{thread_id}/stream/events",
|
|
367
429
|
_thread_events,
|
|
@@ -933,6 +933,7 @@ async def search_crons(request: ApiRequest):
|
|
|
933
933
|
assistant_id=assistant_id,
|
|
934
934
|
thread_id=thread_id,
|
|
935
935
|
enabled=payload.get("enabled", None),
|
|
936
|
+
metadata=payload.get("metadata"),
|
|
936
937
|
limit=int(payload.get("limit", 10)),
|
|
937
938
|
offset=offset,
|
|
938
939
|
sort_by=payload.get("sort_by"),
|
|
@@ -963,6 +964,7 @@ async def count_crons(request: ApiRequest):
|
|
|
963
964
|
conn,
|
|
964
965
|
assistant_id=assistant_id,
|
|
965
966
|
thread_id=thread_id,
|
|
967
|
+
metadata=payload.get("metadata"),
|
|
966
968
|
)
|
|
967
969
|
return ApiResponse(count)
|
|
968
970
|
|
|
@@ -45,6 +45,16 @@ DATABASE_URI = env("DATABASE_URI", cast=str, default=getenv("POSTGRES_URI", unde
|
|
|
45
45
|
# Not in public docs: infrastructure, set by platform
|
|
46
46
|
MIGRATIONS_PATH = env("MIGRATIONS_PATH", cast=str, default="/storage/migrations")
|
|
47
47
|
POSTGRES_POOL_MAX_SIZE = env("LANGGRAPH_POSTGRES_POOL_MAX_SIZE", cast=int, default=150)
|
|
48
|
+
CHECKPOINTER_POSTGRES_POOL_MIN_SIZE = env(
|
|
49
|
+
"LANGGRAPH_CHECKPOINTER_POSTGRES_POOL_MIN_SIZE",
|
|
50
|
+
cast=int,
|
|
51
|
+
default=1,
|
|
52
|
+
)
|
|
53
|
+
CHECKPOINTER_POSTGRES_POOL_TIMEOUT_SECONDS = env(
|
|
54
|
+
"LANGGRAPH_CHECKPOINTER_POSTGRES_POOL_TIMEOUT_SECONDS",
|
|
55
|
+
cast=float,
|
|
56
|
+
default=15.0,
|
|
57
|
+
)
|
|
48
58
|
|
|
49
59
|
# Checkpoint ingestion batch controls
|
|
50
60
|
# Go defaults (core/config/config.go): CHECKPOINT_MAX_BATCH_SIZE=1000, CHECKPOINT_BATCH_DELAY=0.005 (5ms)
|
|
@@ -182,15 +192,15 @@ LSD_GRPC_SERVER_MAX_SEND_MSG_BYTES = env(
|
|
|
182
192
|
"LSD_GRPC_SERVER_MAX_SEND_MSG_BYTES", cast=int, default=300 * 1024 * 1024
|
|
183
193
|
)
|
|
184
194
|
LSD_PUBLISH_QUEUE_SIZE = env("LSD_PUBLISH_QUEUE_SIZE", cast=int, default=512)
|
|
185
|
-
# Per-run protocol v2 event buffer size. Each ``
|
|
195
|
+
# Per-run protocol v2 event buffer size. Each ``EventStreamingSession``
|
|
186
196
|
# retains at most this many normalized protocol events for
|
|
187
|
-
# reconnecting clients to replay via ``since``
|
|
197
|
+
# reconnecting clients to replay via the body ``since`` cursor.
|
|
188
198
|
# When the limit is exceeded, oldest events are evicted; reconnects
|
|
189
199
|
# whose cursor falls behind the buffer head receive a ``resume_gap``
|
|
190
200
|
# error. Operators running graphs that emit >10k events per run can
|
|
191
201
|
# bump this to avoid gaps on flaky networks, at the cost of memory
|
|
192
202
|
# (roughly ``size * avg_event_bytes`` per active run). See
|
|
193
|
-
# ``langgraph_api.
|
|
203
|
+
# ``langgraph_api.event_streaming.constants.DEFAULT_MAX_BUFFER_SIZE``.
|
|
194
204
|
_DEFAULT_PROTOCOL_V2_BUFFER_SIZE = 10_000
|
|
195
205
|
LSD_PROTOCOL_V2_BUFFER_SIZE = env(
|
|
196
206
|
"LSD_PROTOCOL_V2_BUFFER_SIZE",
|
|
@@ -616,6 +626,8 @@ __all__ = [
|
|
|
616
626
|
"BG_JOB_SHUTDOWN_GRACE_PERIOD_SECS",
|
|
617
627
|
"BG_JOB_TIMEOUT_SECS",
|
|
618
628
|
"CHECKPOINTER_CONFIG",
|
|
629
|
+
"CHECKPOINTER_POSTGRES_POOL_MIN_SIZE",
|
|
630
|
+
"CHECKPOINTER_POSTGRES_POOL_TIMEOUT_SECONDS",
|
|
619
631
|
"CHECKPOINT_BATCH_DELAY",
|
|
620
632
|
"CHECKPOINT_MAX_BATCH_SIZE",
|
|
621
633
|
"CORS_ALLOW_ORIGINS",
|
|
@@ -57,12 +57,21 @@ class ProtocolV2Capabilities:
|
|
|
57
57
|
|
|
58
58
|
ok: bool
|
|
59
59
|
missing: tuple[str, ...]
|
|
60
|
+
# Replaces the default "missing langgraph symbols" wording when the
|
|
61
|
+
# server has disabled v2 deliberately (e.g. ``FF_V2_EVENT_STREAMING=false``).
|
|
62
|
+
# Library-version mismatches and operator-disabled v2 produce the same
|
|
63
|
+
# ``unsupported`` envelope, but with very different ``"upgrade your
|
|
64
|
+
# deps"`` vs ``"flip the flag"`` remediation paths — keep them
|
|
65
|
+
# distinguishable in the error string.
|
|
66
|
+
reason_override: str | None = None
|
|
60
67
|
|
|
61
68
|
@property
|
|
62
69
|
def error_message(self) -> str:
|
|
63
70
|
"""Human-readable explanation suitable for a command error envelope."""
|
|
64
71
|
if self.ok:
|
|
65
72
|
return ""
|
|
73
|
+
if self.reason_override is not None:
|
|
74
|
+
return self.reason_override
|
|
66
75
|
return (
|
|
67
76
|
"Protocol v2 streaming is not supported by the installed "
|
|
68
77
|
"langgraph/langchain-core version. Missing symbol(s): "
|
|
@@ -73,6 +82,18 @@ class ProtocolV2Capabilities:
|
|
|
73
82
|
"LifecycleTransformer, and ChatModelStream)."
|
|
74
83
|
)
|
|
75
84
|
|
|
85
|
+
@classmethod
|
|
86
|
+
def disabled_by_flag(cls) -> ProtocolV2Capabilities:
|
|
87
|
+
"""Build a capabilities result for ``FF_V2_EVENT_STREAMING=false``."""
|
|
88
|
+
return cls(
|
|
89
|
+
ok=False,
|
|
90
|
+
missing=(),
|
|
91
|
+
reason_override=(
|
|
92
|
+
"Protocol v2 event streaming is disabled on this server "
|
|
93
|
+
"(FF_V2_EVENT_STREAMING=false). Set FF_V2_EVENT_STREAMING=true to enable."
|
|
94
|
+
),
|
|
95
|
+
)
|
|
96
|
+
|
|
76
97
|
|
|
77
98
|
# Submodule paths are intentional — ``StreamMux`` et al. are not
|
|
78
99
|
# re-exported from ``langgraph.stream`` / ``langgraph.pregel`` top-level,
|
|
@@ -90,7 +111,7 @@ _REQUIRED_SYMBOLS: tuple[tuple[str, str], ...] = (
|
|
|
90
111
|
|
|
91
112
|
|
|
92
113
|
@lru_cache(maxsize=1)
|
|
93
|
-
def
|
|
114
|
+
def probe_event_streaming_v2_capabilities() -> ProtocolV2Capabilities:
|
|
94
115
|
"""Check the installed runtime for Protocol v2 streaming support.
|
|
95
116
|
|
|
96
117
|
Result is memoised for the process lifetime — the underlying
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
from __future__ import annotations
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
EVENT_STREAMING_V2_CONFIG_KEY = "__event_streaming_v2"
|
|
4
4
|
|
|
5
|
-
# Ring-buffer size for ``
|
|
5
|
+
# Ring-buffer size for ``EventStreamingSession``. Events beyond this point
|
|
6
6
|
# are dropped (oldest-first) from the replay buffer. Internal
|
|
7
7
|
# memory-safety cap — not tunable over the wire, but operators can
|
|
8
8
|
# override via the ``LSD_PROTOCOL_V2_BUFFER_SIZE`` env var (see
|