langgraph-api 0.10.2__tar.gz → 0.11.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.10.2 → langgraph_api-0.11.0}/Makefile +1 -1
- {langgraph_api-0.10.2 → langgraph_api-0.11.0}/PKG-INFO +7 -5
- {langgraph_api-0.10.2 → langgraph_api-0.11.0}/benchmark/continuous/pyproject.toml +3 -3
- {langgraph_api-0.10.2 → langgraph_api-0.11.0}/benchmark/continuous/uv.lock +12 -12
- langgraph_api-0.11.0/langgraph_api/__init__.py +1 -0
- {langgraph_api-0.10.2 → langgraph_api-0.11.0}/langgraph_api/_checkpointer/_adapter.py +26 -1
- langgraph_api-0.11.0/langgraph_api/api/meta.py +123 -0
- {langgraph_api-0.10.2 → langgraph_api-0.11.0}/langgraph_api/api/runs.py +8 -6
- {langgraph_api-0.10.2 → langgraph_api-0.11.0}/langgraph_api/api/threads.py +11 -8
- {langgraph_api-0.10.2 → langgraph_api-0.11.0}/langgraph_api/cli.py +31 -5
- {langgraph_api-0.10.2 → langgraph_api-0.11.0}/langgraph_api/config/__init__.py +26 -4
- {langgraph_api-0.10.2 → langgraph_api-0.11.0}/langgraph_api/event_streaming/service.py +141 -124
- {langgraph_api-0.10.2 → langgraph_api-0.11.0}/langgraph_api/event_streaming/session.py +6 -6
- {langgraph_api-0.10.2 → langgraph_api-0.11.0}/langgraph_api/event_streaming/state_normalizers.py +8 -0
- {langgraph_api-0.10.2 → langgraph_api-0.11.0}/langgraph_api/feature_flags.py +10 -0
- {langgraph_api-0.10.2 → langgraph_api-0.11.0}/langgraph_api/grpc/ops/__init__.py +19 -4
- {langgraph_api-0.10.2 → langgraph_api-0.11.0}/langgraph_api/grpc/ops/runs.py +7 -0
- {langgraph_api-0.10.2 → langgraph_api-0.11.0}/langgraph_api/grpc/servicers/checkpointer.py +14 -0
- {langgraph_api-0.10.2 → langgraph_api-0.11.0}/langgraph_api/js/client.http.mts +2 -1
- {langgraph_api-0.10.2 → langgraph_api-0.11.0}/langgraph_api/js/client.mts +3 -2
- {langgraph_api-0.10.2 → langgraph_api-0.11.0}/langgraph_api/js/package.json +2 -2
- {langgraph_api-0.10.2 → langgraph_api-0.11.0}/langgraph_api/js/remote.py +43 -3
- {langgraph_api-0.10.2 → langgraph_api-0.11.0}/langgraph_api/js/yarn.lock +8 -8
- langgraph_api-0.11.0/langgraph_api/metrics_collector.py +184 -0
- langgraph_api-0.11.0/langgraph_api/metrics_otlp.py +772 -0
- {langgraph_api-0.10.2 → langgraph_api-0.11.0}/langgraph_api/middleware/http_logger.py +24 -0
- {langgraph_api-0.10.2 → langgraph_api-0.11.0}/langgraph_api/models/run.py +7 -0
- {langgraph_api-0.10.2 → langgraph_api-0.11.0}/langgraph_api/queue_entrypoint.py +13 -36
- {langgraph_api-0.10.2 → langgraph_api-0.11.0}/langgraph_api/release_tags.py +10 -0
- {langgraph_api-0.10.2 → langgraph_api-0.11.0}/langgraph_api/schema.py +3 -0
- {langgraph_api-0.10.2 → langgraph_api-0.11.0}/langgraph_api/self_hosted_metrics.py +1 -1
- {langgraph_api-0.10.2 → langgraph_api-0.11.0}/langgraph_api/stream.py +23 -4
- langgraph_api-0.11.0/langgraph_api/tracing_session.py +22 -0
- {langgraph_api-0.10.2 → langgraph_api-0.11.0}/langgraph_api/worker.py +12 -7
- {langgraph_api-0.10.2 → langgraph_api-0.11.0}/langgraph_grpc_common/checkpointer.py +115 -21
- {langgraph_api-0.10.2 → langgraph_api-0.11.0}/langgraph_grpc_common/conversion/checkpoint.py +95 -6
- langgraph_api-0.11.0/langgraph_grpc_common/conversion/store.py +442 -0
- langgraph_api-0.11.0/langgraph_grpc_common/conversion/struct.py +60 -0
- {langgraph_api-0.10.2 → langgraph_api-0.11.0}/langgraph_grpc_common/conversion/value.py +11 -1
- {langgraph_api-0.10.2 → langgraph_api-0.11.0}/langgraph_grpc_common/proto/__init__.py +4 -0
- {langgraph_api-0.10.2 → langgraph_api-0.11.0}/langgraph_grpc_common/proto/checkpointer_pb2.py +13 -3
- {langgraph_api-0.10.2 → langgraph_api-0.11.0}/langgraph_grpc_common/proto/checkpointer_pb2.pyi +113 -0
- {langgraph_api-0.10.2 → langgraph_api-0.11.0}/langgraph_grpc_common/proto/checkpointer_pb2_grpc.py +47 -0
- {langgraph_api-0.10.2 → langgraph_api-0.11.0}/langgraph_grpc_common/proto/checkpointer_pb2_grpc.pyi +24 -0
- langgraph_api-0.11.0/langgraph_grpc_common/proto/core_api_pb2.py +274 -0
- {langgraph_api-0.10.2 → langgraph_api-0.11.0}/langgraph_grpc_common/proto/core_api_pb2.pyi +17 -5
- langgraph_api-0.11.0/langgraph_grpc_common/proto/store_pb2.py +82 -0
- langgraph_api-0.11.0/langgraph_grpc_common/proto/store_pb2.pyi +652 -0
- langgraph_api-0.11.0/langgraph_grpc_common/proto/store_pb2_grpc.py +101 -0
- langgraph_api-0.11.0/langgraph_grpc_common/proto/store_pb2_grpc.pyi +58 -0
- {langgraph_api-0.10.2 → langgraph_api-0.11.0}/langgraph_grpc_common/serde.py +36 -4
- langgraph_api-0.11.0/langgraph_grpc_common/store.py +109 -0
- {langgraph_api-0.10.2 → langgraph_api-0.11.0}/openapi.json +8 -1
- {langgraph_api-0.10.2 → langgraph_api-0.11.0}/pyproject.toml +6 -4
- {langgraph_api-0.10.2 → langgraph_api-0.11.0}/uv.lock +111 -82
- langgraph_api-0.10.2/langgraph_api/__init__.py +0 -1
- langgraph_api-0.10.2/langgraph_api/api/meta.py +0 -233
- langgraph_api-0.10.2/langgraph_api/metrics_datadog.py +0 -439
- langgraph_api-0.10.2/langgraph_grpc_common/conversion/struct.py +0 -27
- langgraph_api-0.10.2/langgraph_grpc_common/proto/core_api_pb2.py +0 -274
- {langgraph_api-0.10.2 → langgraph_api-0.11.0}/.gitignore +0 -0
- {langgraph_api-0.10.2 → langgraph_api-0.11.0}/LICENSE +0 -0
- {langgraph_api-0.10.2 → langgraph_api-0.11.0}/README.md +0 -0
- {langgraph_api-0.10.2 → langgraph_api-0.11.0}/benchmark/.gitignore +0 -0
- {langgraph_api-0.10.2 → langgraph_api-0.11.0}/benchmark/Makefile +0 -0
- {langgraph_api-0.10.2 → langgraph_api-0.11.0}/benchmark/README.md +0 -0
- {langgraph_api-0.10.2 → langgraph_api-0.11.0}/benchmark/benchmark-runners/assistant.ts +0 -0
- {langgraph_api-0.10.2 → langgraph_api-0.11.0}/benchmark/benchmark-runners/benchmark-runner.ts +0 -0
- {langgraph_api-0.10.2 → langgraph_api-0.11.0}/benchmark/benchmark-runners/benchmark_profiles.ts +0 -0
- {langgraph_api-0.10.2 → langgraph_api-0.11.0}/benchmark/benchmark-runners/benchmarks.ts +0 -0
- {langgraph_api-0.10.2 → langgraph_api-0.11.0}/benchmark/benchmark-runners/cancel_first_second_completes.ts +0 -0
- {langgraph_api-0.10.2 → langgraph_api-0.11.0}/benchmark/benchmark-runners/enqueued_runs_order.ts +0 -0
- {langgraph_api-0.10.2 → langgraph_api-0.11.0}/benchmark/benchmark-runners/log-failure.ts +0 -0
- {langgraph_api-0.10.2 → langgraph_api-0.11.0}/benchmark/benchmark-runners/meta_workload.ts +0 -0
- {langgraph_api-0.10.2 → langgraph_api-0.11.0}/benchmark/benchmark-runners/stream_write.ts +0 -0
- {langgraph_api-0.10.2 → langgraph_api-0.11.0}/benchmark/benchmark-runners/thread.ts +0 -0
- {langgraph_api-0.10.2 → langgraph_api-0.11.0}/benchmark/benchmark-runners/thread_runs_metadata_search.ts +0 -0
- {langgraph_api-0.10.2 → langgraph_api-0.11.0}/benchmark/benchmark-runners/threads_search_metadata.ts +0 -0
- {langgraph_api-0.10.2 → langgraph_api-0.11.0}/benchmark/benchmark-runners/types.ts +0 -0
- {langgraph_api-0.10.2 → langgraph_api-0.11.0}/benchmark/benchmark-runners/wait_write.ts +0 -0
- {langgraph_api-0.10.2 → langgraph_api-0.11.0}/benchmark/capacity_dd_report.py +0 -0
- {langgraph_api-0.10.2 → langgraph_api-0.11.0}/benchmark/capacity_k6.js +0 -0
- {langgraph_api-0.10.2 → langgraph_api-0.11.0}/benchmark/capacity_runner.mjs +0 -0
- {langgraph_api-0.10.2 → langgraph_api-0.11.0}/benchmark/capacity_slack_report.py +0 -0
- {langgraph_api-0.10.2 → langgraph_api-0.11.0}/benchmark/capacity_urls.mjs +0 -0
- {langgraph_api-0.10.2 → langgraph_api-0.11.0}/benchmark/clean-cli.js +0 -0
- {langgraph_api-0.10.2 → langgraph_api-0.11.0}/benchmark/clean.js +0 -0
- {langgraph_api-0.10.2 → langgraph_api-0.11.0}/benchmark/continuous/README.md +0 -0
- {langgraph_api-0.10.2 → langgraph_api-0.11.0}/benchmark/continuous/runner.py +0 -0
- {langgraph_api-0.10.2 → langgraph_api-0.11.0}/benchmark/graphs.js +0 -0
- {langgraph_api-0.10.2 → langgraph_api-0.11.0}/benchmark/mixed_workload_k6.js +0 -0
- {langgraph_api-0.10.2 → langgraph_api-0.11.0}/benchmark/mixed_workload_runner.mjs +0 -0
- {langgraph_api-0.10.2 → langgraph_api-0.11.0}/benchmark/package.json +0 -0
- {langgraph_api-0.10.2 → langgraph_api-0.11.0}/benchmark/ramp.js +0 -0
- {langgraph_api-0.10.2 → langgraph_api-0.11.0}/benchmark/reporting/dd_reporting.py +0 -0
- {langgraph_api-0.10.2 → langgraph_api-0.11.0}/benchmark/reporting/slack_slowest_runs.py +0 -0
- {langgraph_api-0.10.2 → langgraph_api-0.11.0}/benchmark/reporting/slack_summary.py +0 -0
- {langgraph_api-0.10.2 → langgraph_api-0.11.0}/benchmark/run_local.sh +0 -0
- {langgraph_api-0.10.2 → langgraph_api-0.11.0}/benchmark/staircase.py +0 -0
- {langgraph_api-0.10.2 → langgraph_api-0.11.0}/benchmark/staircase_step_k6.js +0 -0
- {langgraph_api-0.10.2 → langgraph_api-0.11.0}/benchmark/tsconfig.json +0 -0
- {langgraph_api-0.10.2 → langgraph_api-0.11.0}/benchmark/update-revision.js +0 -0
- {langgraph_api-0.10.2 → langgraph_api-0.11.0}/benchmark/weather.js +0 -0
- {langgraph_api-0.10.2 → langgraph_api-0.11.0}/constraints.txt +0 -0
- {langgraph_api-0.10.2 → langgraph_api-0.11.0}/custom_store.sql +0 -0
- {langgraph_api-0.10.2 → langgraph_api-0.11.0}/forbidden.txt +0 -0
- {langgraph_api-0.10.2 → langgraph_api-0.11.0}/hatch_build.py +0 -0
- {langgraph_api-0.10.2 → langgraph_api-0.11.0}/healthcheck.py +0 -0
- {langgraph_api-0.10.2 → langgraph_api-0.11.0}/langgraph-cloud-debugging-20260210132856.zip +0 -0
- {langgraph_api-0.10.2 → langgraph_api-0.11.0}/langgraph_api/_checkpointer/__init__.py +0 -0
- {langgraph_api-0.10.2 → langgraph_api-0.11.0}/langgraph_api/_checkpointer/protocol.py +0 -0
- {langgraph_api-0.10.2 → langgraph_api-0.11.0}/langgraph_api/_factory_utils.py +0 -0
- {langgraph_api-0.10.2 → langgraph_api-0.11.0}/langgraph_api/api/__init__.py +0 -0
- {langgraph_api-0.10.2 → langgraph_api-0.11.0}/langgraph_api/api/a2a.py +0 -0
- {langgraph_api-0.10.2 → langgraph_api-0.11.0}/langgraph_api/api/assistants.py +0 -0
- {langgraph_api-0.10.2 → langgraph_api-0.11.0}/langgraph_api/api/event_streaming.py +0 -0
- {langgraph_api-0.10.2 → langgraph_api-0.11.0}/langgraph_api/api/mcp/__init__.py +0 -0
- {langgraph_api-0.10.2 → langgraph_api-0.11.0}/langgraph_api/api/mcp/_constants.py +0 -0
- {langgraph_api-0.10.2 → langgraph_api-0.11.0}/langgraph_api/api/mcp/_handlers.py +0 -0
- {langgraph_api-0.10.2 → langgraph_api-0.11.0}/langgraph_api/api/mcp/_models.py +0 -0
- {langgraph_api-0.10.2 → langgraph_api-0.11.0}/langgraph_api/api/mcp/_routes.py +0 -0
- {langgraph_api-0.10.2 → langgraph_api-0.11.0}/langgraph_api/api/mcp/_sanitizers.py +0 -0
- {langgraph_api-0.10.2 → langgraph_api-0.11.0}/langgraph_api/api/openapi.py +0 -0
- {langgraph_api-0.10.2 → langgraph_api-0.11.0}/langgraph_api/api/profile.py +0 -0
- {langgraph_api-0.10.2 → langgraph_api-0.11.0}/langgraph_api/api/store.py +0 -0
- {langgraph_api-0.10.2 → langgraph_api-0.11.0}/langgraph_api/api/ui.py +0 -0
- {langgraph_api-0.10.2 → langgraph_api-0.11.0}/langgraph_api/asgi_transport.py +0 -0
- {langgraph_api-0.10.2 → langgraph_api-0.11.0}/langgraph_api/asyncio.py +0 -0
- {langgraph_api-0.10.2 → langgraph_api-0.11.0}/langgraph_api/auth/__init__.py +0 -0
- {langgraph_api-0.10.2 → langgraph_api-0.11.0}/langgraph_api/auth/custom.py +0 -0
- {langgraph_api-0.10.2 → langgraph_api-0.11.0}/langgraph_api/auth/errors.py +0 -0
- {langgraph_api-0.10.2 → langgraph_api-0.11.0}/langgraph_api/auth/langsmith/__init__.py +0 -0
- {langgraph_api-0.10.2 → langgraph_api-0.11.0}/langgraph_api/auth/langsmith/backend.py +0 -0
- {langgraph_api-0.10.2 → langgraph_api-0.11.0}/langgraph_api/auth/langsmith/client.py +0 -0
- {langgraph_api-0.10.2 → langgraph_api-0.11.0}/langgraph_api/auth/middleware.py +0 -0
- {langgraph_api-0.10.2 → langgraph_api-0.11.0}/langgraph_api/auth/noop.py +0 -0
- {langgraph_api-0.10.2 → langgraph_api-0.11.0}/langgraph_api/auth/studio_user.py +0 -0
- {langgraph_api-0.10.2 → langgraph_api-0.11.0}/langgraph_api/cache.py +0 -0
- {langgraph_api-0.10.2 → langgraph_api-0.11.0}/langgraph_api/command.py +0 -0
- {langgraph_api-0.10.2 → langgraph_api-0.11.0}/langgraph_api/config/_parse.py +0 -0
- {langgraph_api-0.10.2 → langgraph_api-0.11.0}/langgraph_api/config/schemas.py +0 -0
- {langgraph_api-0.10.2 → langgraph_api-0.11.0}/langgraph_api/cron_scheduler.py +0 -0
- {langgraph_api-0.10.2 → langgraph_api-0.11.0}/langgraph_api/encryption/__init__.py +0 -0
- {langgraph_api-0.10.2 → langgraph_api-0.11.0}/langgraph_api/encryption/aes_json.py +0 -0
- {langgraph_api-0.10.2 → langgraph_api-0.11.0}/langgraph_api/encryption/context.py +0 -0
- {langgraph_api-0.10.2 → langgraph_api-0.11.0}/langgraph_api/encryption/custom.py +0 -0
- {langgraph_api-0.10.2 → langgraph_api-0.11.0}/langgraph_api/encryption/middleware.py +0 -0
- {langgraph_api-0.10.2 → langgraph_api-0.11.0}/langgraph_api/encryption/shared.py +0 -0
- {langgraph_api-0.10.2 → langgraph_api-0.11.0}/langgraph_api/errors.py +0 -0
- {langgraph_api-0.10.2 → langgraph_api-0.11.0}/langgraph_api/event_streaming/__init__.py +0 -0
- {langgraph_api-0.10.2 → langgraph_api-0.11.0}/langgraph_api/event_streaming/capabilities.py +0 -0
- {langgraph_api-0.10.2 → langgraph_api-0.11.0}/langgraph_api/event_streaming/constants.py +0 -0
- {langgraph_api-0.10.2 → langgraph_api-0.11.0}/langgraph_api/event_streaming/event_normalizers.py +0 -0
- {langgraph_api-0.10.2 → langgraph_api-0.11.0}/langgraph_api/event_streaming/namespace.py +0 -0
- {langgraph_api-0.10.2 → langgraph_api-0.11.0}/langgraph_api/event_streaming/types.py +0 -0
- {langgraph_api-0.10.2 → langgraph_api-0.11.0}/langgraph_api/graph.py +0 -0
- {langgraph_api-0.10.2 → langgraph_api-0.11.0}/langgraph_api/grpc/__init__.py +0 -0
- {langgraph_api-0.10.2 → langgraph_api-0.11.0}/langgraph_api/grpc/client.py +0 -0
- {langgraph_api-0.10.2 → langgraph_api-0.11.0}/langgraph_api/grpc/generated/core_api_pb2.pyi +0 -0
- {langgraph_api-0.10.2 → langgraph_api-0.11.0}/langgraph_api/grpc/ops/assistants.py +0 -0
- {langgraph_api-0.10.2 → langgraph_api-0.11.0}/langgraph_api/grpc/ops/cache.py +0 -0
- {langgraph_api-0.10.2 → langgraph_api-0.11.0}/langgraph_api/grpc/ops/crons.py +0 -0
- {langgraph_api-0.10.2 → langgraph_api-0.11.0}/langgraph_api/grpc/ops/threads.py +0 -0
- {langgraph_api-0.10.2 → langgraph_api-0.11.0}/langgraph_api/grpc/server.py +0 -0
- {langgraph_api-0.10.2 → langgraph_api-0.11.0}/langgraph_api/grpc/servicers/__init__.py +0 -0
- {langgraph_api-0.10.2 → langgraph_api-0.11.0}/langgraph_api/grpc/servicers/encryption.py +0 -0
- {langgraph_api-0.10.2 → langgraph_api-0.11.0}/langgraph_api/http.py +0 -0
- {langgraph_api-0.10.2 → langgraph_api-0.11.0}/langgraph_api/http_metrics.py +0 -0
- {langgraph_api-0.10.2 → langgraph_api-0.11.0}/langgraph_api/http_metrics_utils.py +0 -0
- {langgraph_api-0.10.2 → langgraph_api-0.11.0}/langgraph_api/js/.gitignore +0 -0
- {langgraph_api-0.10.2 → langgraph_api-0.11.0}/langgraph_api/js/.prettierrc +0 -0
- {langgraph_api-0.10.2 → langgraph_api-0.11.0}/langgraph_api/js/__init__.py +0 -0
- {langgraph_api-0.10.2 → langgraph_api-0.11.0}/langgraph_api/js/base.py +0 -0
- {langgraph_api-0.10.2 → langgraph_api-0.11.0}/langgraph_api/js/build.mts +0 -0
- {langgraph_api-0.10.2 → langgraph_api-0.11.0}/langgraph_api/js/errors.py +0 -0
- {langgraph_api-0.10.2 → langgraph_api-0.11.0}/langgraph_api/js/global.d.ts +0 -0
- {langgraph_api-0.10.2 → langgraph_api-0.11.0}/langgraph_api/js/schema.py +0 -0
- {langgraph_api-0.10.2 → langgraph_api-0.11.0}/langgraph_api/js/src/graph.mts +0 -0
- {langgraph_api-0.10.2 → langgraph_api-0.11.0}/langgraph_api/js/src/load.hooks.mjs +0 -0
- {langgraph_api-0.10.2 → langgraph_api-0.11.0}/langgraph_api/js/src/preload.mjs +0 -0
- {langgraph_api-0.10.2 → langgraph_api-0.11.0}/langgraph_api/js/src/utils/experiment-tracing.mts +0 -0
- {langgraph_api-0.10.2 → langgraph_api-0.11.0}/langgraph_api/js/src/utils/files.mts +0 -0
- {langgraph_api-0.10.2 → langgraph_api-0.11.0}/langgraph_api/js/src/utils/importMap.mts +0 -0
- {langgraph_api-0.10.2 → langgraph_api-0.11.0}/langgraph_api/js/src/utils/pythonSchemas.mts +0 -0
- {langgraph_api-0.10.2 → langgraph_api-0.11.0}/langgraph_api/js/src/utils/serde.mts +0 -0
- {langgraph_api-0.10.2 → langgraph_api-0.11.0}/langgraph_api/js/sse.py +0 -0
- {langgraph_api-0.10.2 → langgraph_api-0.11.0}/langgraph_api/js/traceblock.mts +0 -0
- {langgraph_api-0.10.2 → langgraph_api-0.11.0}/langgraph_api/js/tsconfig.json +0 -0
- {langgraph_api-0.10.2 → langgraph_api-0.11.0}/langgraph_api/js/ui.py +0 -0
- {langgraph_api-0.10.2 → langgraph_api-0.11.0}/langgraph_api/lc_security/__init__.py +0 -0
- {langgraph_api-0.10.2 → langgraph_api-0.11.0}/langgraph_api/lc_security/exceptions.py +0 -0
- {langgraph_api-0.10.2 → langgraph_api-0.11.0}/langgraph_api/lc_security/policy.py +0 -0
- {langgraph_api-0.10.2 → langgraph_api-0.11.0}/langgraph_api/lc_security/transport.py +0 -0
- {langgraph_api-0.10.2 → langgraph_api-0.11.0}/langgraph_api/logging.py +0 -0
- {langgraph_api-0.10.2 → langgraph_api-0.11.0}/langgraph_api/metadata.py +0 -0
- {langgraph_api-0.10.2 → langgraph_api-0.11.0}/langgraph_api/middleware/__init__.py +0 -0
- {langgraph_api-0.10.2 → langgraph_api-0.11.0}/langgraph_api/middleware/ensure_store.py +0 -0
- {langgraph_api-0.10.2 → langgraph_api-0.11.0}/langgraph_api/middleware/private_network.py +0 -0
- {langgraph_api-0.10.2 → langgraph_api-0.11.0}/langgraph_api/middleware/request_id.py +0 -0
- {langgraph_api-0.10.2 → langgraph_api-0.11.0}/langgraph_api/models/__init__.py +0 -0
- {langgraph_api-0.10.2 → langgraph_api-0.11.0}/langgraph_api/otel_context.py +0 -0
- {langgraph_api-0.10.2 → langgraph_api-0.11.0}/langgraph_api/patch.py +0 -0
- {langgraph_api-0.10.2 → langgraph_api-0.11.0}/langgraph_api/route.py +0 -0
- {langgraph_api-0.10.2 → langgraph_api-0.11.0}/langgraph_api/self_hosted_logs.py +0 -0
- {langgraph_api-0.10.2 → langgraph_api-0.11.0}/langgraph_api/serde.py +0 -0
- {langgraph_api-0.10.2 → langgraph_api-0.11.0}/langgraph_api/server.py +0 -0
- {langgraph_api-0.10.2 → langgraph_api-0.11.0}/langgraph_api/sse.py +0 -0
- {langgraph_api-0.10.2 → langgraph_api-0.11.0}/langgraph_api/state.py +0 -0
- {langgraph_api-0.10.2 → langgraph_api-0.11.0}/langgraph_api/store.py +0 -0
- {langgraph_api-0.10.2 → langgraph_api-0.11.0}/langgraph_api/stream_v2.py +0 -0
- {langgraph_api-0.10.2 → langgraph_api-0.11.0}/langgraph_api/timing/__init__.py +0 -0
- {langgraph_api-0.10.2 → langgraph_api-0.11.0}/langgraph_api/timing/profiler.py +0 -0
- {langgraph_api-0.10.2 → langgraph_api-0.11.0}/langgraph_api/timing/timer.py +0 -0
- {langgraph_api-0.10.2 → langgraph_api-0.11.0}/langgraph_api/traceblock.py +0 -0
- {langgraph_api-0.10.2 → langgraph_api-0.11.0}/langgraph_api/tunneling/cloudflare.py +0 -0
- {langgraph_api-0.10.2 → langgraph_api-0.11.0}/langgraph_api/utils/__init__.py +0 -0
- {langgraph_api-0.10.2 → langgraph_api-0.11.0}/langgraph_api/utils/cache.py +0 -0
- {langgraph_api-0.10.2 → langgraph_api-0.11.0}/langgraph_api/utils/config.py +0 -0
- {langgraph_api-0.10.2 → langgraph_api-0.11.0}/langgraph_api/utils/errors.py +0 -0
- {langgraph_api-0.10.2 → langgraph_api-0.11.0}/langgraph_api/utils/extract.py +0 -0
- {langgraph_api-0.10.2 → langgraph_api-0.11.0}/langgraph_api/utils/future.py +0 -0
- {langgraph_api-0.10.2 → langgraph_api-0.11.0}/langgraph_api/utils/headers.py +0 -0
- {langgraph_api-0.10.2 → langgraph_api-0.11.0}/langgraph_api/utils/network.py +0 -0
- {langgraph_api-0.10.2 → langgraph_api-0.11.0}/langgraph_api/utils/retriable_client.py +0 -0
- {langgraph_api-0.10.2 → langgraph_api-0.11.0}/langgraph_api/utils/stream_codec.py +0 -0
- {langgraph_api-0.10.2 → langgraph_api-0.11.0}/langgraph_api/utils/uuids.py +0 -0
- {langgraph_api-0.10.2 → langgraph_api-0.11.0}/langgraph_api/validation.py +0 -0
- {langgraph_api-0.10.2 → langgraph_api-0.11.0}/langgraph_api/webhook.py +0 -0
- {langgraph_api-0.10.2 → langgraph_api-0.11.0}/langgraph_grpc_common/__init__.py +0 -0
- {langgraph_api-0.10.2 → langgraph_api-0.11.0}/langgraph_grpc_common/conversion/__init__.py +0 -0
- {langgraph_api-0.10.2 → langgraph_api-0.11.0}/langgraph_grpc_common/conversion/_compat.py +0 -0
- {langgraph_api-0.10.2 → langgraph_api-0.11.0}/langgraph_grpc_common/conversion/config.py +0 -0
- {langgraph_api-0.10.2 → langgraph_api-0.11.0}/langgraph_grpc_common/conversion/durability.py +0 -0
- {langgraph_api-0.10.2 → langgraph_api-0.11.0}/langgraph_grpc_common/proto/core_api_pb2_grpc.py +0 -0
- {langgraph_api-0.10.2 → langgraph_api-0.11.0}/langgraph_grpc_common/proto/core_api_pb2_grpc.pyi +0 -0
- {langgraph_api-0.10.2 → langgraph_api-0.11.0}/langgraph_grpc_common/proto/encryption_pb2.py +0 -0
- {langgraph_api-0.10.2 → langgraph_api-0.11.0}/langgraph_grpc_common/proto/encryption_pb2.pyi +0 -0
- {langgraph_api-0.10.2 → langgraph_api-0.11.0}/langgraph_grpc_common/proto/encryption_pb2_grpc.py +0 -0
- {langgraph_api-0.10.2 → langgraph_api-0.11.0}/langgraph_grpc_common/proto/encryption_pb2_grpc.pyi +0 -0
- {langgraph_api-0.10.2 → langgraph_api-0.11.0}/langgraph_grpc_common/proto/engine_common_pb2.py +0 -0
- {langgraph_api-0.10.2 → langgraph_api-0.11.0}/langgraph_grpc_common/proto/engine_common_pb2.pyi +0 -0
- {langgraph_api-0.10.2 → langgraph_api-0.11.0}/langgraph_grpc_common/proto/engine_common_pb2_grpc.py +0 -0
- {langgraph_api-0.10.2 → langgraph_api-0.11.0}/langgraph_grpc_common/proto/engine_common_pb2_grpc.pyi +0 -0
- {langgraph_api-0.10.2 → langgraph_api-0.11.0}/langgraph_grpc_common/proto/enum_cancel_run_action_pb2.py +0 -0
- {langgraph_api-0.10.2 → langgraph_api-0.11.0}/langgraph_grpc_common/proto/enum_cancel_run_action_pb2.pyi +0 -0
- {langgraph_api-0.10.2 → langgraph_api-0.11.0}/langgraph_grpc_common/proto/enum_cancel_run_action_pb2_grpc.py +0 -0
- {langgraph_api-0.10.2 → langgraph_api-0.11.0}/langgraph_grpc_common/proto/enum_cancel_run_action_pb2_grpc.pyi +0 -0
- {langgraph_api-0.10.2 → langgraph_api-0.11.0}/langgraph_grpc_common/proto/enum_control_signal_pb2.py +0 -0
- {langgraph_api-0.10.2 → langgraph_api-0.11.0}/langgraph_grpc_common/proto/enum_control_signal_pb2.pyi +0 -0
- {langgraph_api-0.10.2 → langgraph_api-0.11.0}/langgraph_grpc_common/proto/enum_control_signal_pb2_grpc.py +0 -0
- {langgraph_api-0.10.2 → langgraph_api-0.11.0}/langgraph_grpc_common/proto/enum_control_signal_pb2_grpc.pyi +0 -0
- {langgraph_api-0.10.2 → langgraph_api-0.11.0}/langgraph_grpc_common/proto/enum_cron_on_run_completed_pb2.py +0 -0
- {langgraph_api-0.10.2 → langgraph_api-0.11.0}/langgraph_grpc_common/proto/enum_cron_on_run_completed_pb2.pyi +0 -0
- {langgraph_api-0.10.2 → langgraph_api-0.11.0}/langgraph_grpc_common/proto/enum_cron_on_run_completed_pb2_grpc.py +0 -0
- {langgraph_api-0.10.2 → langgraph_api-0.11.0}/langgraph_grpc_common/proto/enum_cron_on_run_completed_pb2_grpc.pyi +0 -0
- {langgraph_api-0.10.2 → langgraph_api-0.11.0}/langgraph_grpc_common/proto/enum_durability_pb2.py +0 -0
- {langgraph_api-0.10.2 → langgraph_api-0.11.0}/langgraph_grpc_common/proto/enum_durability_pb2.pyi +0 -0
- {langgraph_api-0.10.2 → langgraph_api-0.11.0}/langgraph_grpc_common/proto/enum_durability_pb2_grpc.py +0 -0
- {langgraph_api-0.10.2 → langgraph_api-0.11.0}/langgraph_grpc_common/proto/enum_durability_pb2_grpc.pyi +0 -0
- {langgraph_api-0.10.2 → langgraph_api-0.11.0}/langgraph_grpc_common/proto/enum_multitask_strategy_pb2.py +0 -0
- {langgraph_api-0.10.2 → langgraph_api-0.11.0}/langgraph_grpc_common/proto/enum_multitask_strategy_pb2.pyi +0 -0
- {langgraph_api-0.10.2 → langgraph_api-0.11.0}/langgraph_grpc_common/proto/enum_multitask_strategy_pb2_grpc.py +0 -0
- {langgraph_api-0.10.2 → langgraph_api-0.11.0}/langgraph_grpc_common/proto/enum_multitask_strategy_pb2_grpc.pyi +0 -0
- {langgraph_api-0.10.2 → langgraph_api-0.11.0}/langgraph_grpc_common/proto/enum_run_status_pb2.py +0 -0
- {langgraph_api-0.10.2 → langgraph_api-0.11.0}/langgraph_grpc_common/proto/enum_run_status_pb2.pyi +0 -0
- {langgraph_api-0.10.2 → langgraph_api-0.11.0}/langgraph_grpc_common/proto/enum_run_status_pb2_grpc.py +0 -0
- {langgraph_api-0.10.2 → langgraph_api-0.11.0}/langgraph_grpc_common/proto/enum_run_status_pb2_grpc.pyi +0 -0
- {langgraph_api-0.10.2 → langgraph_api-0.11.0}/langgraph_grpc_common/proto/enum_stream_mode_pb2.py +0 -0
- {langgraph_api-0.10.2 → langgraph_api-0.11.0}/langgraph_grpc_common/proto/enum_stream_mode_pb2.pyi +0 -0
- {langgraph_api-0.10.2 → langgraph_api-0.11.0}/langgraph_grpc_common/proto/enum_stream_mode_pb2_grpc.py +0 -0
- {langgraph_api-0.10.2 → langgraph_api-0.11.0}/langgraph_grpc_common/proto/enum_stream_mode_pb2_grpc.pyi +0 -0
- {langgraph_api-0.10.2 → langgraph_api-0.11.0}/langgraph_grpc_common/proto/enum_thread_status_pb2.py +0 -0
- {langgraph_api-0.10.2 → langgraph_api-0.11.0}/langgraph_grpc_common/proto/enum_thread_status_pb2.pyi +0 -0
- {langgraph_api-0.10.2 → langgraph_api-0.11.0}/langgraph_grpc_common/proto/enum_thread_status_pb2_grpc.py +0 -0
- {langgraph_api-0.10.2 → langgraph_api-0.11.0}/langgraph_grpc_common/proto/enum_thread_status_pb2_grpc.pyi +0 -0
- {langgraph_api-0.10.2 → langgraph_api-0.11.0}/langgraph_grpc_common/proto/enum_thread_stream_mode_pb2.py +0 -0
- {langgraph_api-0.10.2 → langgraph_api-0.11.0}/langgraph_grpc_common/proto/enum_thread_stream_mode_pb2.pyi +0 -0
- {langgraph_api-0.10.2 → langgraph_api-0.11.0}/langgraph_grpc_common/proto/enum_thread_stream_mode_pb2_grpc.py +0 -0
- {langgraph_api-0.10.2 → langgraph_api-0.11.0}/langgraph_grpc_common/proto/enum_thread_stream_mode_pb2_grpc.pyi +0 -0
- {langgraph_api-0.10.2 → langgraph_api-0.11.0}/langgraph_grpc_common/proto/errors_pb2.py +0 -0
- {langgraph_api-0.10.2 → langgraph_api-0.11.0}/langgraph_grpc_common/proto/errors_pb2.pyi +0 -0
- {langgraph_api-0.10.2 → langgraph_api-0.11.0}/langgraph_grpc_common/proto/errors_pb2_grpc.py +0 -0
- {langgraph_api-0.10.2 → langgraph_api-0.11.0}/langgraph_grpc_common/proto/errors_pb2_grpc.pyi +0 -0
- {langgraph_api-0.10.2 → langgraph_api-0.11.0}/langgraph_license/__init__.py +0 -0
- {langgraph_api-0.10.2 → langgraph_api-0.11.0}/langgraph_license/validation.py +0 -0
- {langgraph_api-0.10.2 → langgraph_api-0.11.0}/langgraph_runtime/__init__.py +0 -0
- {langgraph_api-0.10.2 → langgraph_api-0.11.0}/langgraph_runtime/checkpoint.py +0 -0
- {langgraph_api-0.10.2 → langgraph_api-0.11.0}/langgraph_runtime/database.py +0 -0
- {langgraph_api-0.10.2 → langgraph_api-0.11.0}/langgraph_runtime/lifespan.py +0 -0
- {langgraph_api-0.10.2 → langgraph_api-0.11.0}/langgraph_runtime/metrics.py +0 -0
- {langgraph_api-0.10.2 → langgraph_api-0.11.0}/langgraph_runtime/ops.py +0 -0
- {langgraph_api-0.10.2 → langgraph_api-0.11.0}/langgraph_runtime/queue.py +0 -0
- {langgraph_api-0.10.2 → langgraph_api-0.11.0}/langgraph_runtime/retry.py +0 -0
- {langgraph_api-0.10.2 → langgraph_api-0.11.0}/langgraph_runtime/routes.py +0 -0
- {langgraph_api-0.10.2 → langgraph_api-0.11.0}/langgraph_runtime/store.py +0 -0
- {langgraph_api-0.10.2 → langgraph_api-0.11.0}/logging.json +0 -0
- {langgraph_api-0.10.2 → langgraph_api-0.11.0}/scripts/build_wheel.py +0 -0
- {langgraph_api-0.10.2 → langgraph_api-0.11.0}/scripts/create_license.py +0 -0
- {langgraph_api-0.10.2 → langgraph_api-0.11.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 test-auth-read-only-assistant
|
|
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", "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"}'
|
|
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_delta_filter": "./tests/graphs/delta_channel_migration.py:graph_delta_filter", "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", "store_e2e_async": "./tests/graphs/store_e2e.py:graph_async", "store_e2e_sync": "./tests/graphs/store_e2e.py:graph_sync"}'
|
|
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,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: langgraph-api
|
|
3
|
-
Version: 0.
|
|
3
|
+
Version: 0.11.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
|
|
@@ -14,20 +14,22 @@ Requires-Dist: httptools>=0.5.0; platform_system != 'Windows'
|
|
|
14
14
|
Requires-Dist: httpx>=0.25.0
|
|
15
15
|
Requires-Dist: jsonschema-rs<0.45,>=0.20.0
|
|
16
16
|
Requires-Dist: langchain-core>=0.3.64
|
|
17
|
-
Requires-Dist: langchain-protocol<0.1,>=0.0.
|
|
17
|
+
Requires-Dist: langchain-protocol<0.1,>=0.0.18
|
|
18
18
|
Requires-Dist: langgraph-checkpoint<5,>=3.0.1
|
|
19
|
-
Requires-Dist: langgraph-runtime-inmem<0.
|
|
19
|
+
Requires-Dist: langgraph-runtime-inmem<0.32.0.dev0,>=0.31.0.dev0
|
|
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
|
|
23
23
|
Requires-Dist: opentelemetry-api>=0.0.1
|
|
24
24
|
Requires-Dist: opentelemetry-exporter-otlp-proto-http>=0.0.1
|
|
25
|
+
Requires-Dist: opentelemetry-exporter-prometheus<0.59,>=0.58b0
|
|
25
26
|
Requires-Dist: opentelemetry-sdk>=0.0.1
|
|
26
27
|
Requires-Dist: orjson>=3.9.7
|
|
28
|
+
Requires-Dist: prometheus-client>=0.0.1
|
|
27
29
|
Requires-Dist: protobuf<7.0.0,>=6.32.1
|
|
28
|
-
Requires-Dist: pyjwt>=2.
|
|
30
|
+
Requires-Dist: pyjwt>=2.13.0
|
|
29
31
|
Requires-Dist: sse-starlette<3.4.0,>=2.1.3
|
|
30
|
-
Requires-Dist: starlette>=1.
|
|
32
|
+
Requires-Dist: starlette>=1.3.1
|
|
31
33
|
Requires-Dist: structlog<26,>=24.1.0
|
|
32
34
|
Requires-Dist: tenacity>=8.0.0
|
|
33
35
|
Requires-Dist: truststore>=0.1
|
|
@@ -4,10 +4,10 @@ version = "0.1.0"
|
|
|
4
4
|
description = "Continuous stress test for Agent Server"
|
|
5
5
|
requires-python = ">=3.13"
|
|
6
6
|
dependencies = [
|
|
7
|
-
"langgraph-sdk>=0.3.
|
|
8
|
-
"click>=8.
|
|
7
|
+
"langgraph-sdk>=0.3.15",
|
|
8
|
+
"click>=8.4.1",
|
|
9
9
|
"structlog>=24.1.0",
|
|
10
|
-
"datadog-api-client>=2.
|
|
10
|
+
"datadog-api-client>=2.55.0",
|
|
11
11
|
"python-dateutil>=2.8.0",
|
|
12
12
|
"httpx>=0.27.0",
|
|
13
13
|
]
|
|
@@ -25,14 +25,14 @@ wheels = [
|
|
|
25
25
|
|
|
26
26
|
[[package]]
|
|
27
27
|
name = "click"
|
|
28
|
-
version = "8.
|
|
28
|
+
version = "8.4.1"
|
|
29
29
|
source = { registry = "https://pypi.org/simple" }
|
|
30
30
|
dependencies = [
|
|
31
31
|
{ name = "colorama", marker = "sys_platform == 'win32'" },
|
|
32
32
|
]
|
|
33
|
-
sdist = { url = "https://files.pythonhosted.org/packages/
|
|
33
|
+
sdist = { url = "https://files.pythonhosted.org/packages/9b/98/518d8e5081007684232226f475082b30087d0f585e8457db087298259f49/click-8.4.1.tar.gz", hash = "sha256:918b5633eddf6b41c32d4f454bf0de810065c74e3f7dbf8ee5452f8be88d3e96", size = 353007, upload-time = "2026-05-22T04:08:37.769Z" }
|
|
34
34
|
wheels = [
|
|
35
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
35
|
+
{ url = "https://files.pythonhosted.org/packages/c7/0d/67e5b4109ea4a837e80daa87c2c696711955e40449a97e8926672534def2/click-8.4.1-py3-none-any.whl", hash = "sha256:482be17c6991b8c19c5429a1e995d9b0efdbb63172824c41f99965dc0ade8ec2", size = 116639, upload-time = "2026-05-22T04:08:35.26Z" },
|
|
36
36
|
]
|
|
37
37
|
|
|
38
38
|
[[package]]
|
|
@@ -46,7 +46,7 @@ wheels = [
|
|
|
46
46
|
|
|
47
47
|
[[package]]
|
|
48
48
|
name = "datadog-api-client"
|
|
49
|
-
version = "2.
|
|
49
|
+
version = "2.55.0"
|
|
50
50
|
source = { registry = "https://pypi.org/simple" }
|
|
51
51
|
dependencies = [
|
|
52
52
|
{ name = "certifi" },
|
|
@@ -54,9 +54,9 @@ dependencies = [
|
|
|
54
54
|
{ name = "typing-extensions" },
|
|
55
55
|
{ name = "urllib3" },
|
|
56
56
|
]
|
|
57
|
-
sdist = { url = "https://files.pythonhosted.org/packages/
|
|
57
|
+
sdist = { url = "https://files.pythonhosted.org/packages/ee/8d/6f7ddd04cc701cc590eab111a45e54c92158eddbff943ad4a1dbb5925b21/datadog_api_client-2.55.0.tar.gz", hash = "sha256:c56767c867a15b928da08d5c6077a7ac466e029a10a5045e80d79d76e92afaa3", size = 4994403, upload-time = "2026-05-15T17:20:06.825Z" }
|
|
58
58
|
wheels = [
|
|
59
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
59
|
+
{ url = "https://files.pythonhosted.org/packages/c7/28/9af04e1cccb57bc9754a5d4cd2fc5a006183e95b234336e9115fe95e5f12/datadog_api_client-2.55.0-py3-none-any.whl", hash = "sha256:fef8dcadbdcd1f7fbe89d97825cfc06c9a1e3577b61f04834b8d250c881d59a7", size = 6644614, upload-time = "2026-05-15T17:20:03.927Z" },
|
|
60
60
|
]
|
|
61
61
|
|
|
62
62
|
[[package]]
|
|
@@ -120,25 +120,25 @@ dependencies = [
|
|
|
120
120
|
|
|
121
121
|
[package.metadata]
|
|
122
122
|
requires-dist = [
|
|
123
|
-
{ name = "click", specifier = ">=8.
|
|
124
|
-
{ name = "datadog-api-client", specifier = ">=2.
|
|
123
|
+
{ name = "click", specifier = ">=8.4.1" },
|
|
124
|
+
{ name = "datadog-api-client", specifier = ">=2.55.0" },
|
|
125
125
|
{ name = "httpx", specifier = ">=0.27.0" },
|
|
126
|
-
{ name = "langgraph-sdk", specifier = ">=0.3.
|
|
126
|
+
{ name = "langgraph-sdk", specifier = ">=0.3.15" },
|
|
127
127
|
{ name = "python-dateutil", specifier = ">=2.8.0" },
|
|
128
128
|
{ name = "structlog", specifier = ">=24.1.0" },
|
|
129
129
|
]
|
|
130
130
|
|
|
131
131
|
[[package]]
|
|
132
132
|
name = "langgraph-sdk"
|
|
133
|
-
version = "0.3.
|
|
133
|
+
version = "0.3.15"
|
|
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/66/af/cdd4d6f3c05b3c1112ed3f12ef830faf15951b21d22cbc622a4becbbe25c/langgraph_sdk-0.3.15.tar.gz", hash = "sha256:29e805003d2c6e296823dd71992610976fd0428cefaa8b3304fd91f2247037de", size = 201924, upload-time = "2026-05-22T16:54:27.678Z" }
|
|
140
140
|
wheels = [
|
|
141
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
141
|
+
{ url = "https://files.pythonhosted.org/packages/be/a5/0196d9c05749c25bc198e4909d68c998bc3120297e14944921baf2f4c384/langgraph_sdk-0.3.15-py3-none-any.whl", hash = "sha256:3838773acf7456d158165385d49f48f1e856f28b56ccd99ea139a8f27004815d", size = 98166, upload-time = "2026-05-22T16:54:26.013Z" },
|
|
142
142
|
]
|
|
143
143
|
|
|
144
144
|
[[package]]
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
__version__ = "0.11.0"
|
|
@@ -24,6 +24,14 @@ from langgraph_grpc_common.checkpointer import GrpcCheckpointer
|
|
|
24
24
|
from langgraph_api import config, timing
|
|
25
25
|
from langgraph_api.asyncio import as_asynccontextmanager
|
|
26
26
|
from langgraph_api.grpc.client import get_shared_client
|
|
27
|
+
|
|
28
|
+
# Used as the per-instance serializer for ``GrpcCheckpointer`` below so
|
|
29
|
+
# checkpoint payloads honour the same ``USE_PICKLE_FALLBACK`` /
|
|
30
|
+
# encryption / ``allowed_json_modules`` policy as the in-process Python
|
|
31
|
+
# ``Checkpointer``. Scoped to checkpointer RPCs only (via the contextvar
|
|
32
|
+
# in ``langgraph_grpc_common.serde``) so non-checkpointer gRPC ops keep
|
|
33
|
+
# using the safer ``JsonPlusSerializer`` default.
|
|
34
|
+
from langgraph_api.serde import Serializer as _ApiSerializer
|
|
27
35
|
from langgraph_api.timing import profiled_import
|
|
28
36
|
from langgraph_api.utils.config import run_in_executor
|
|
29
37
|
|
|
@@ -320,7 +328,24 @@ async def get_checkpointer(
|
|
|
320
328
|
):
|
|
321
329
|
return cast(
|
|
322
330
|
"FullCheckpointerProtocol",
|
|
323
|
-
GrpcCheckpointer(
|
|
331
|
+
GrpcCheckpointer(
|
|
332
|
+
get_stub=_get_shared_checkpointer_stub,
|
|
333
|
+
serializer=_ApiSerializer(),
|
|
334
|
+
),
|
|
335
|
+
)
|
|
336
|
+
|
|
337
|
+
from langgraph_api.feature_flags import ( # noqa: PLC0415
|
|
338
|
+
IS_POSTGRES_BACKEND,
|
|
339
|
+
PREFER_GRPC_CHECKPOINTER,
|
|
340
|
+
)
|
|
341
|
+
|
|
342
|
+
if IS_POSTGRES_BACKEND and PREFER_GRPC_CHECKPOINTER:
|
|
343
|
+
return cast(
|
|
344
|
+
"FullCheckpointerProtocol",
|
|
345
|
+
GrpcCheckpointer(
|
|
346
|
+
get_stub=_get_shared_checkpointer_stub,
|
|
347
|
+
serializer=_ApiSerializer(),
|
|
348
|
+
),
|
|
324
349
|
)
|
|
325
350
|
|
|
326
351
|
from langgraph_runtime.checkpoint import Checkpointer # noqa: PLC0415
|
|
@@ -0,0 +1,123 @@
|
|
|
1
|
+
import langgraph.version
|
|
2
|
+
import structlog
|
|
3
|
+
from prometheus_client import CONTENT_TYPE_LATEST, generate_latest
|
|
4
|
+
from starlette.responses import JSONResponse, PlainTextResponse
|
|
5
|
+
|
|
6
|
+
from langgraph_api import __version__, config, metadata
|
|
7
|
+
from langgraph_api.feature_flags import IS_POSTGRES_OR_GRPC_BACKEND
|
|
8
|
+
from langgraph_api.http_metrics import HTTP_METRICS_COLLECTOR
|
|
9
|
+
from langgraph_api.route import ApiRequest
|
|
10
|
+
from langgraph_api.schema import PoolStats, PostgresPoolStats, RedisPoolStats
|
|
11
|
+
from langgraph_runtime.database import connect, pool_stats
|
|
12
|
+
from langgraph_runtime.metrics import get_metrics
|
|
13
|
+
|
|
14
|
+
if IS_POSTGRES_OR_GRPC_BACKEND:
|
|
15
|
+
from langgraph_api.grpc.ops import Runs
|
|
16
|
+
else:
|
|
17
|
+
from langgraph_runtime.ops import Runs
|
|
18
|
+
|
|
19
|
+
METRICS_FORMATS = {"prometheus", "json"}
|
|
20
|
+
|
|
21
|
+
logger = structlog.stdlib.get_logger(__name__)
|
|
22
|
+
|
|
23
|
+
|
|
24
|
+
def _merge_pool_stats(local: PoolStats, remote: PoolStats) -> PoolStats:
|
|
25
|
+
"""Merge local and remote pool stats by summing numeric values. Used to aggregate Python + Go pool metrics."""
|
|
26
|
+
merged: PoolStats = {}
|
|
27
|
+
if "postgres" in local or "postgres" in remote:
|
|
28
|
+
lp = local.get("postgres") or {}
|
|
29
|
+
rp = remote.get("postgres") or {}
|
|
30
|
+
merged["postgres"] = PostgresPoolStats(
|
|
31
|
+
pool_max=lp.get("pool_max", 0) + rp.get("pool_max", 0),
|
|
32
|
+
pool_size=lp.get("pool_size", 0) + rp.get("pool_size", 0),
|
|
33
|
+
pool_available=lp.get("pool_available", 0) + rp.get("pool_available", 0),
|
|
34
|
+
requests_queued=lp.get("requests_queued", 0) + rp.get("requests_queued", 0),
|
|
35
|
+
requests_errors=lp.get("requests_errors", 0) + rp.get("requests_errors", 0),
|
|
36
|
+
)
|
|
37
|
+
if "redis" in local or "redis" in remote:
|
|
38
|
+
lr = local.get("redis") or {}
|
|
39
|
+
rr = remote.get("redis") or {}
|
|
40
|
+
merged["redis"] = RedisPoolStats(
|
|
41
|
+
idle_connections=lr.get("idle_connections", 0)
|
|
42
|
+
+ rr.get("idle_connections", 0),
|
|
43
|
+
in_use_connections=lr.get("in_use_connections", 0)
|
|
44
|
+
+ rr.get("in_use_connections", 0),
|
|
45
|
+
max_connections=lr.get("max_connections", 0) + rr.get("max_connections", 0),
|
|
46
|
+
)
|
|
47
|
+
return merged
|
|
48
|
+
|
|
49
|
+
|
|
50
|
+
async def _grpc_pool_stats() -> PoolStats:
|
|
51
|
+
"""Fetch connection pool stats from the Core API (Go) via gRPC for metrics aggregation. Returns {} on error."""
|
|
52
|
+
if not IS_POSTGRES_OR_GRPC_BACKEND:
|
|
53
|
+
return {}
|
|
54
|
+
try:
|
|
55
|
+
return await Runs.pool_stats()
|
|
56
|
+
except Exception as e:
|
|
57
|
+
await logger.awarning(
|
|
58
|
+
"Failed to fetch Core API pool stats for aggregation", exc_info=e
|
|
59
|
+
)
|
|
60
|
+
return {}
|
|
61
|
+
|
|
62
|
+
|
|
63
|
+
async def meta_pool_stats() -> PoolStats:
|
|
64
|
+
local_pool_stats: PoolStats = pool_stats()
|
|
65
|
+
|
|
66
|
+
# Aggregate with Core API (Go) pool stats when using gRPC backend
|
|
67
|
+
grpc_pool_stats = await _grpc_pool_stats()
|
|
68
|
+
return _merge_pool_stats(local_pool_stats, grpc_pool_stats)
|
|
69
|
+
|
|
70
|
+
|
|
71
|
+
async def meta_info(request: ApiRequest):
|
|
72
|
+
return JSONResponse(
|
|
73
|
+
{
|
|
74
|
+
"version": __version__,
|
|
75
|
+
"langgraph_py_version": langgraph.version.__version__,
|
|
76
|
+
"flags": {
|
|
77
|
+
"assistants": True,
|
|
78
|
+
"crons": True,
|
|
79
|
+
"langsmith": bool(config.LANGSMITH_CONTROL_PLANE_API_KEY)
|
|
80
|
+
and bool(config.TRACING),
|
|
81
|
+
"langsmith_tracing_replicas": True,
|
|
82
|
+
"langsmith_tracing_session_on_runs": True,
|
|
83
|
+
},
|
|
84
|
+
"host": {
|
|
85
|
+
"kind": metadata.HOST,
|
|
86
|
+
"project_id": metadata.PROJECT_ID,
|
|
87
|
+
"host_revision_id": metadata.HOST_REVISION_ID,
|
|
88
|
+
"revision_id": metadata.REVISION,
|
|
89
|
+
"tenant_id": metadata.TENANT_ID,
|
|
90
|
+
},
|
|
91
|
+
}
|
|
92
|
+
)
|
|
93
|
+
|
|
94
|
+
|
|
95
|
+
async def meta_metrics(request: ApiRequest):
|
|
96
|
+
# determine output format
|
|
97
|
+
metrics_format = request.query_params.get("format", "prometheus")
|
|
98
|
+
if metrics_format not in METRICS_FORMATS:
|
|
99
|
+
metrics_format = "prometheus"
|
|
100
|
+
|
|
101
|
+
if metrics_format == "prometheus":
|
|
102
|
+
# Served straight from the OTLP Prometheus client's registry (see
|
|
103
|
+
# metrics_otlp._LSDPrometheusReader).
|
|
104
|
+
return PlainTextResponse(generate_latest(), media_type=CONTENT_TYPE_LATEST)
|
|
105
|
+
|
|
106
|
+
# JSON: hand-built snapshot of workers, queue depth, HTTP, and pool stats.
|
|
107
|
+
worker_metrics = get_metrics()["workers"]
|
|
108
|
+
http_metrics = HTTP_METRICS_COLLECTOR.get_metrics(
|
|
109
|
+
metadata.PROJECT_ID,
|
|
110
|
+
metadata.HOST_REVISION_ID,
|
|
111
|
+
metrics_format,
|
|
112
|
+
metadata.DEPLOYMENT_TYPE,
|
|
113
|
+
)
|
|
114
|
+
merged_pool_stats = await meta_pool_stats()
|
|
115
|
+
async with connect() as conn:
|
|
116
|
+
resp = {
|
|
117
|
+
**merged_pool_stats,
|
|
118
|
+
"queue": await Runs.stats(conn),
|
|
119
|
+
**http_metrics,
|
|
120
|
+
}
|
|
121
|
+
if config.N_JOBS_PER_WORKER > 0:
|
|
122
|
+
resp["workers"] = worker_metrics
|
|
123
|
+
return JSONResponse(resp)
|
|
@@ -787,7 +787,9 @@ async def create_cron(request: ApiRequest):
|
|
|
787
787
|
|
|
788
788
|
enabled = payload.get("enabled", True)
|
|
789
789
|
|
|
790
|
-
|
|
790
|
+
# gRPC/postgres Crons route through core-api and ignore ``conn`` (the default
|
|
791
|
+
# ``connect()`` yields None there); inmem uses the yielded connection.
|
|
792
|
+
async with connect() as conn:
|
|
791
793
|
cron = await Crons.put(
|
|
792
794
|
conn,
|
|
793
795
|
thread_id=None,
|
|
@@ -834,7 +836,7 @@ async def create_thread_cron(request: ApiRequest):
|
|
|
834
836
|
CRON_PAYLOAD_ENCRYPTION_SUBFIELDS,
|
|
835
837
|
)
|
|
836
838
|
|
|
837
|
-
async with connect(
|
|
839
|
+
async with connect() as conn:
|
|
838
840
|
cron = await Crons.put(
|
|
839
841
|
conn,
|
|
840
842
|
thread_id=thread_id,
|
|
@@ -890,7 +892,7 @@ async def patch_cron(request: ApiRequest):
|
|
|
890
892
|
CRON_PAYLOAD_ENCRYPTION_SUBFIELDS,
|
|
891
893
|
)
|
|
892
894
|
|
|
893
|
-
async with connect(
|
|
895
|
+
async with connect() as conn:
|
|
894
896
|
cron = await Crons.update(
|
|
895
897
|
conn,
|
|
896
898
|
cron_id=cron_id,
|
|
@@ -917,7 +919,7 @@ async def delete_cron(request: ApiRequest):
|
|
|
917
919
|
validate_uuid(cron_id, "Invalid cron ID: must be a UUID")
|
|
918
920
|
|
|
919
921
|
try:
|
|
920
|
-
async with connect(
|
|
922
|
+
async with connect() as conn:
|
|
921
923
|
cid = await Crons.delete(
|
|
922
924
|
conn,
|
|
923
925
|
cron_id=cron_id,
|
|
@@ -940,7 +942,7 @@ async def search_crons(request: ApiRequest):
|
|
|
940
942
|
validate_uuid(thread_id, "Invalid thread ID: must be a UUID")
|
|
941
943
|
|
|
942
944
|
offset = int(payload.get("offset", 0))
|
|
943
|
-
async with connect(
|
|
945
|
+
async with connect() as conn:
|
|
944
946
|
crons_iter, next_offset = await Crons.search(
|
|
945
947
|
conn,
|
|
946
948
|
assistant_id=assistant_id,
|
|
@@ -972,7 +974,7 @@ async def count_crons(request: ApiRequest):
|
|
|
972
974
|
if thread_id := payload.get("thread_id"):
|
|
973
975
|
validate_uuid(thread_id, "Invalid thread ID: must be a UUID")
|
|
974
976
|
|
|
975
|
-
async with connect(
|
|
977
|
+
async with connect() as conn:
|
|
976
978
|
count = await Crons.count(
|
|
977
979
|
conn,
|
|
978
980
|
assistant_id=assistant_id,
|
|
@@ -13,7 +13,10 @@ from langgraph_api.encryption.shared import (
|
|
|
13
13
|
using_aes_encryption,
|
|
14
14
|
using_custom_encryption,
|
|
15
15
|
)
|
|
16
|
-
from langgraph_api.feature_flags import
|
|
16
|
+
from langgraph_api.feature_flags import (
|
|
17
|
+
IS_POSTGRES_OR_GRPC_BACKEND,
|
|
18
|
+
PREFER_GRPC_CHECKPOINTER,
|
|
19
|
+
)
|
|
17
20
|
from langgraph_api.route import ApiRequest, ApiResponse, ApiRoute
|
|
18
21
|
from langgraph_api.schema import (
|
|
19
22
|
THREAD_ENCRYPTION_FIELDS,
|
|
@@ -82,7 +85,7 @@ async def create_thread(
|
|
|
82
85
|
)
|
|
83
86
|
else:
|
|
84
87
|
# Need connection for inmem put or gRPC State.bulk
|
|
85
|
-
async with connect(supports_core_api=
|
|
88
|
+
async with connect(supports_core_api=PREFER_GRPC_CHECKPOINTER) as conn:
|
|
86
89
|
iter = await Threads.put(
|
|
87
90
|
conn,
|
|
88
91
|
thread_id,
|
|
@@ -226,7 +229,7 @@ async def get_thread_state(
|
|
|
226
229
|
thread_id = request.path_params["thread_id"]
|
|
227
230
|
validate_uuid(thread_id, "Invalid thread ID: must be a UUID")
|
|
228
231
|
subgraphs = request.query_params.get("subgraphs") in ("true", "True")
|
|
229
|
-
async with connect(supports_core_api=
|
|
232
|
+
async with connect(supports_core_api=PREFER_GRPC_CHECKPOINTER) as conn:
|
|
230
233
|
config = {
|
|
231
234
|
"configurable": {
|
|
232
235
|
**get_configurable_headers(request.headers),
|
|
@@ -247,7 +250,7 @@ async def get_thread_state_at_checkpoint(
|
|
|
247
250
|
thread_id = request.path_params["thread_id"]
|
|
248
251
|
validate_uuid(thread_id, "Invalid thread ID: must be a UUID")
|
|
249
252
|
checkpoint_id = request.path_params["checkpoint_id"]
|
|
250
|
-
async with connect(supports_core_api=
|
|
253
|
+
async with connect(supports_core_api=PREFER_GRPC_CHECKPOINTER) as conn:
|
|
251
254
|
config = {
|
|
252
255
|
"configurable": {
|
|
253
256
|
**get_configurable_headers(request.headers),
|
|
@@ -273,7 +276,7 @@ async def get_thread_state_at_checkpoint_post(
|
|
|
273
276
|
thread_id = request.path_params["thread_id"]
|
|
274
277
|
validate_uuid(thread_id, "Invalid thread ID: must be a UUID")
|
|
275
278
|
payload = await request.json(ThreadStateCheckpointRequest)
|
|
276
|
-
async with connect(supports_core_api=
|
|
279
|
+
async with connect(supports_core_api=PREFER_GRPC_CHECKPOINTER) as conn:
|
|
277
280
|
config = {
|
|
278
281
|
"configurable": {
|
|
279
282
|
**payload["checkpoint"],
|
|
@@ -311,7 +314,7 @@ async def update_thread_state(
|
|
|
311
314
|
pass
|
|
312
315
|
config["configurable"].update(get_configurable_headers(request.headers))
|
|
313
316
|
config["configurable"]["thread_id"] = thread_id
|
|
314
|
-
async with connect(supports_core_api=
|
|
317
|
+
async with connect(supports_core_api=PREFER_GRPC_CHECKPOINTER) as conn:
|
|
315
318
|
inserted = await Threads.State.post(
|
|
316
319
|
conn,
|
|
317
320
|
config,
|
|
@@ -341,7 +344,7 @@ async def get_thread_history(
|
|
|
341
344
|
**get_configurable_headers(request.headers),
|
|
342
345
|
}
|
|
343
346
|
}
|
|
344
|
-
async with connect(supports_core_api=
|
|
347
|
+
async with connect(supports_core_api=PREFER_GRPC_CHECKPOINTER) as conn:
|
|
345
348
|
states = [
|
|
346
349
|
state_snapshot_to_thread_state(c)
|
|
347
350
|
for c in await Threads.State.list(
|
|
@@ -363,7 +366,7 @@ async def get_thread_history_post(
|
|
|
363
366
|
config["configurable"].update(payload.get("checkpoint", {}))
|
|
364
367
|
config["configurable"].update(get_configurable_headers(request.headers))
|
|
365
368
|
config["configurable"]["thread_id"] = thread_id
|
|
366
|
-
async with connect(supports_core_api=
|
|
369
|
+
async with connect(supports_core_api=PREFER_GRPC_CHECKPOINTER) as conn:
|
|
367
370
|
states = [
|
|
368
371
|
state_snapshot_to_thread_state(c)
|
|
369
372
|
for c in await Threads.State.list(
|
|
@@ -109,7 +109,12 @@ def _find_open_port(host: str) -> int:
|
|
|
109
109
|
|
|
110
110
|
|
|
111
111
|
def _resolve_server_url(
|
|
112
|
-
host: str,
|
|
112
|
+
host: str,
|
|
113
|
+
port: int,
|
|
114
|
+
*,
|
|
115
|
+
mount_prefix: str | None,
|
|
116
|
+
tunnel: bool,
|
|
117
|
+
is_ssl: bool,
|
|
113
118
|
) -> str:
|
|
114
119
|
"""Return the public-facing base URL for the server.
|
|
115
120
|
|
|
@@ -119,11 +124,15 @@ def _resolve_server_url(
|
|
|
119
124
|
"""
|
|
120
125
|
from langgraph_api.utils.network import format_hostport # noqa: PLC0415
|
|
121
126
|
|
|
122
|
-
upstream_url =
|
|
127
|
+
upstream_url = (
|
|
128
|
+
f"http://{format_hostport(host, port)}"
|
|
129
|
+
if not is_ssl
|
|
130
|
+
else f"https://{format_hostport(host, port)}"
|
|
131
|
+
)
|
|
123
132
|
if mount_prefix:
|
|
124
133
|
upstream_url += mount_prefix
|
|
125
134
|
|
|
126
|
-
if not tunnel:
|
|
135
|
+
if not tunnel or is_ssl:
|
|
127
136
|
return upstream_url
|
|
128
137
|
|
|
129
138
|
logger.info("Starting Cloudflare Tunnel...")
|
|
@@ -185,6 +194,8 @@ def run_server(
|
|
|
185
194
|
allow_blocking: bool = False,
|
|
186
195
|
runtime_edition: Literal["inmem", "community", "postgres"] = "inmem",
|
|
187
196
|
server_level: str = "WARNING",
|
|
197
|
+
ssl_certfile: str | pathlib.Path | None = None,
|
|
198
|
+
ssl_keyfile: str | pathlib.Path | None = None,
|
|
188
199
|
__redis_uri__: str | None = "fake",
|
|
189
200
|
__database_uri__: str | None = ":memory:",
|
|
190
201
|
__migrations_path__: str | None = "__inmem",
|
|
@@ -282,8 +293,13 @@ def run_server(
|
|
|
282
293
|
to_patch[k] = v
|
|
283
294
|
|
|
284
295
|
with patch_environment(**to_patch):
|
|
296
|
+
is_ssl = ssl_certfile is not None and ssl_keyfile is not None
|
|
285
297
|
local_url = _resolve_server_url(
|
|
286
|
-
host,
|
|
298
|
+
host,
|
|
299
|
+
port,
|
|
300
|
+
mount_prefix=mount_prefix,
|
|
301
|
+
tunnel=tunnel,
|
|
302
|
+
is_ssl=is_ssl,
|
|
287
303
|
)
|
|
288
304
|
os.environ["LANGGRAPH_API_URL"] = local_url
|
|
289
305
|
|
|
@@ -292,6 +308,7 @@ def run_server(
|
|
|
292
308
|
|
|
293
309
|
def _open_browser():
|
|
294
310
|
nonlocal studio_origin, full_studio_url
|
|
311
|
+
import ssl # noqa: PLC0415
|
|
295
312
|
import webbrowser # noqa: PLC0415
|
|
296
313
|
|
|
297
314
|
thread_logger = logging.getLogger("browser_opener")
|
|
@@ -302,10 +319,17 @@ def run_server(
|
|
|
302
319
|
|
|
303
320
|
with ThreadPoolExecutor(max_workers=1) as executor:
|
|
304
321
|
org_id_future = executor.submit(_get_org_id)
|
|
322
|
+
context = (
|
|
323
|
+
ssl._create_unverified_context()
|
|
324
|
+
if ssl_certfile and ssl_keyfile
|
|
325
|
+
else None
|
|
326
|
+
)
|
|
305
327
|
|
|
306
328
|
while True:
|
|
307
329
|
try:
|
|
308
|
-
with urllib.request.urlopen(
|
|
330
|
+
with urllib.request.urlopen(
|
|
331
|
+
f"{local_url}/ok", context=context
|
|
332
|
+
) as response:
|
|
309
333
|
if response.status == 200:
|
|
310
334
|
try:
|
|
311
335
|
org_id = org_id_future.result(timeout=3.0)
|
|
@@ -373,6 +397,8 @@ For production use, please use LangSmith Deployment.
|
|
|
373
397
|
access_log=False,
|
|
374
398
|
reload_includes=list(reload_includes) if reload_includes else None,
|
|
375
399
|
reload_excludes=list(reload_excludes) if reload_excludes else None,
|
|
400
|
+
ssl_certfile=ssl_certfile,
|
|
401
|
+
ssl_keyfile=ssl_keyfile,
|
|
376
402
|
log_config={
|
|
377
403
|
"version": 1,
|
|
378
404
|
"incremental": False,
|
|
@@ -4,7 +4,7 @@ from typing import TYPE_CHECKING, Annotated, Literal, TypeVar, cast
|
|
|
4
4
|
|
|
5
5
|
import structlog
|
|
6
6
|
from pydantic.functional_validators import AfterValidator
|
|
7
|
-
from starlette.config import Config
|
|
7
|
+
from starlette.config import Config
|
|
8
8
|
from starlette.datastructures import CommaSeparatedStrings
|
|
9
9
|
|
|
10
10
|
from langgraph_api import traceblock
|
|
@@ -41,7 +41,14 @@ STATS_INTERVAL_SECS = env("STATS_INTERVAL_SECS", cast=int, default=60)
|
|
|
41
41
|
# storage
|
|
42
42
|
|
|
43
43
|
# Not in public docs: infrastructure, set by platform
|
|
44
|
-
|
|
44
|
+
# Optional: persistence can go through the Go core over gRPC, so the Python
|
|
45
|
+
# runtime can start without a direct DB connection string. When unset, the
|
|
46
|
+
# Postgres runtime skips creating a psycopg pool (see database._startup_needs /
|
|
47
|
+
# database.start_pool). Callers that still require a direct connection fail
|
|
48
|
+
# loudly via connect()'s "Postgres pool not initialized" guard.
|
|
49
|
+
DATABASE_URI: str | None = env(
|
|
50
|
+
"DATABASE_URI", cast=str, default=getenv("POSTGRES_URI", None)
|
|
51
|
+
)
|
|
45
52
|
# Not in public docs: infrastructure, set by platform
|
|
46
53
|
MIGRATIONS_PATH = env("MIGRATIONS_PATH", cast=str, default="/storage/migrations")
|
|
47
54
|
POSTGRES_POOL_MAX_SIZE = env("LANGGRAPH_POSTGRES_POOL_MAX_SIZE", cast=int, default=150)
|
|
@@ -243,6 +250,12 @@ WEBHOOKS_ENABLED = HTTP_CONFIG and HTTP_CONFIG.get("disable_webhooks")
|
|
|
243
250
|
STORE_CONFIG = env(
|
|
244
251
|
"LANGGRAPH_STORE", cast=_parse.parse_schema(StoreConfig), default=None
|
|
245
252
|
)
|
|
253
|
+
LANGGRAPH_STORE_BACKEND = env("LANGGRAPH_STORE_BACKEND", cast=str, default="python")
|
|
254
|
+
USE_GRPC_STORE = LANGGRAPH_STORE_BACKEND == "grpc"
|
|
255
|
+
|
|
256
|
+
# When true, the Go core-server owns Postgres schema setup (DB migrations +
|
|
257
|
+
# vector index)
|
|
258
|
+
DB_MIGRATION_BY_CORE_API = env("DB_MIGRATION_BY_CORE_API", cast=bool, default=False)
|
|
246
259
|
|
|
247
260
|
|
|
248
261
|
def _validate_mount_prefix(mount_prefix: str | None) -> str | None:
|
|
@@ -320,7 +333,6 @@ if (
|
|
|
320
333
|
# queue
|
|
321
334
|
|
|
322
335
|
BG_JOB_HEARTBEAT = 120 # seconds
|
|
323
|
-
BG_JOB_INTERVAL = 30 # seconds
|
|
324
336
|
BG_JOB_MAX_RETRIES = env("BG_JOB_MAX_RETRIES", cast=int, default=3)
|
|
325
337
|
BG_JOB_ISOLATED_LOOPS = env("BG_JOB_ISOLATED_LOOPS", cast=bool, default=False)
|
|
326
338
|
BG_JOB_SHUTDOWN_GRACE_PERIOD_SECS = env(
|
|
@@ -578,6 +590,13 @@ METRIC_MAX_EMITTING_TIER = env(
|
|
|
578
590
|
"METRIC_MAX_EMITTING_TIER", cast=int, default=_METRIC_MAX_EMITTING_TIER_DEFAULT
|
|
579
591
|
)
|
|
580
592
|
DATADOG_METRICS_ENABLED = bool(LSD_DD_API_KEY)
|
|
593
|
+
# When true, the Prometheus scrape (/metrics) exposes ALL metrics, not just the
|
|
594
|
+
# lsd_web_metric (Deployment-UI) set. Record-time tier filtering
|
|
595
|
+
# (METRIC_MAX_EMITTING_TIER) still applies, so internal metrics must be within the
|
|
596
|
+
# max emitting tier to be recorded at all.
|
|
597
|
+
EXPOSE_INTERNAL_METRICS_PROMETHEUS = env(
|
|
598
|
+
"EXPOSE_INTERNAL_METRICS_PROMETHEUS", cast=bool, default=False
|
|
599
|
+
)
|
|
581
600
|
LANGGRAPH_LOGS_ENDPOINT = env("LANGGRAPH_LOGS_ENDPOINT", cast=str, default=None)
|
|
582
601
|
LANGGRAPH_LOGS_ENABLED = env("LANGGRAPH_LOGS_ENABLED", cast=bool, default=False)
|
|
583
602
|
|
|
@@ -620,7 +639,6 @@ __all__ = [
|
|
|
620
639
|
"ALLOW_PRIVATE_NETWORK",
|
|
621
640
|
"API_VARIANT",
|
|
622
641
|
"BG_JOB_HEARTBEAT",
|
|
623
|
-
"BG_JOB_INTERVAL",
|
|
624
642
|
"BG_JOB_ISOLATED_LOOPS",
|
|
625
643
|
"BG_JOB_MAX_RETRIES",
|
|
626
644
|
"BG_JOB_SHUTDOWN_GRACE_PERIOD_SECS",
|
|
@@ -635,6 +653,8 @@ __all__ = [
|
|
|
635
653
|
"CRON_SCHEDULER_SLEEP_TIME",
|
|
636
654
|
"DATABASE_URI",
|
|
637
655
|
"DATADOG_METRICS_ENABLED",
|
|
656
|
+
"DB_MIGRATION_BY_CORE_API",
|
|
657
|
+
"EXPOSE_INTERNAL_METRICS_PROMETHEUS",
|
|
638
658
|
"FF_CRONS_ENABLED",
|
|
639
659
|
"FF_LOG_DROPPED_EVENTS",
|
|
640
660
|
"FF_LOG_QUERY_AND_PARAMS",
|
|
@@ -662,6 +682,7 @@ __all__ = [
|
|
|
662
682
|
"LANGGRAPH_METRICS_ENDPOINT",
|
|
663
683
|
"LANGGRAPH_METRICS_EXPORT_INTERVAL_MS",
|
|
664
684
|
"LANGGRAPH_POSTGRES_EXTENSIONS",
|
|
685
|
+
"LANGGRAPH_STORE_BACKEND",
|
|
665
686
|
"LANGSMITH_API_KEY",
|
|
666
687
|
"LANGSMITH_AUTH_ENDPOINT",
|
|
667
688
|
"LANGSMITH_AUTH_VERIFY_TENANT_ID",
|
|
@@ -709,6 +730,7 @@ __all__ = [
|
|
|
709
730
|
"USES_STORE_TTL",
|
|
710
731
|
"USES_THREAD_TTL",
|
|
711
732
|
"USE_CUSTOM_CHECKPOINTER",
|
|
733
|
+
"USE_GRPC_STORE",
|
|
712
734
|
"AuthConfig",
|
|
713
735
|
"CheckpointerConfig",
|
|
714
736
|
"CorsConfig",
|