langgraph-api 0.7.91__tar.gz → 0.7.94__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {langgraph_api-0.7.91 → langgraph_api-0.7.94}/PKG-INFO +1 -1
- langgraph_api-0.7.94/langgraph_api/__init__.py +1 -0
- {langgraph_api-0.7.91 → langgraph_api-0.7.94}/langgraph_api/_checkpointer/_adapter.py +3 -9
- {langgraph_api-0.7.91 → langgraph_api-0.7.94}/langgraph_api/asyncio.py +20 -1
- {langgraph_api-0.7.91 → langgraph_api-0.7.94}/langgraph_api/graph.py +100 -15
- {langgraph_api-0.7.91 → langgraph_api-0.7.94}/langgraph_api/js/remote.py +61 -6
- {langgraph_api-0.7.91 → langgraph_api-0.7.94}/langgraph_api/metrics_datadog.py +8 -0
- {langgraph_api-0.7.91 → langgraph_api-0.7.94}/langgraph_api/store.py +7 -7
- langgraph_api-0.7.91/langgraph_api/__init__.py +0 -1
- {langgraph_api-0.7.91 → langgraph_api-0.7.94}/.gitignore +0 -0
- {langgraph_api-0.7.91 → langgraph_api-0.7.94}/LICENSE +0 -0
- {langgraph_api-0.7.91 → langgraph_api-0.7.94}/Makefile +0 -0
- {langgraph_api-0.7.91 → langgraph_api-0.7.94}/README.md +0 -0
- {langgraph_api-0.7.91 → langgraph_api-0.7.94}/benchmark/.gitignore +0 -0
- {langgraph_api-0.7.91 → langgraph_api-0.7.94}/benchmark/Makefile +0 -0
- {langgraph_api-0.7.91 → langgraph_api-0.7.94}/benchmark/README.md +0 -0
- {langgraph_api-0.7.91 → langgraph_api-0.7.94}/benchmark/benchmark-runners/assistant.ts +0 -0
- {langgraph_api-0.7.91 → langgraph_api-0.7.94}/benchmark/benchmark-runners/benchmark-runner.ts +0 -0
- {langgraph_api-0.7.91 → langgraph_api-0.7.94}/benchmark/benchmark-runners/benchmarks.ts +0 -0
- {langgraph_api-0.7.91 → langgraph_api-0.7.94}/benchmark/benchmark-runners/cancel_first_second_completes.ts +0 -0
- {langgraph_api-0.7.91 → langgraph_api-0.7.94}/benchmark/benchmark-runners/enqueued_runs_order.ts +0 -0
- {langgraph_api-0.7.91 → langgraph_api-0.7.94}/benchmark/benchmark-runners/log-failure.ts +0 -0
- {langgraph_api-0.7.91 → langgraph_api-0.7.94}/benchmark/benchmark-runners/meta_workload.ts +0 -0
- {langgraph_api-0.7.91 → langgraph_api-0.7.94}/benchmark/benchmark-runners/random_stream.ts +0 -0
- {langgraph_api-0.7.91 → langgraph_api-0.7.94}/benchmark/benchmark-runners/stream_write.ts +0 -0
- {langgraph_api-0.7.91 → langgraph_api-0.7.94}/benchmark/benchmark-runners/thread.ts +0 -0
- {langgraph_api-0.7.91 → langgraph_api-0.7.94}/benchmark/benchmark-runners/thread_runs_metadata_search.ts +0 -0
- {langgraph_api-0.7.91 → langgraph_api-0.7.94}/benchmark/benchmark-runners/threads_search_metadata.ts +0 -0
- {langgraph_api-0.7.91 → langgraph_api-0.7.94}/benchmark/benchmark-runners/types.ts +0 -0
- {langgraph_api-0.7.91 → langgraph_api-0.7.94}/benchmark/benchmark-runners/wait_write.ts +0 -0
- {langgraph_api-0.7.91 → langgraph_api-0.7.94}/benchmark/capacity_dd_report.py +0 -0
- {langgraph_api-0.7.91 → langgraph_api-0.7.94}/benchmark/capacity_k6.js +0 -0
- {langgraph_api-0.7.91 → langgraph_api-0.7.94}/benchmark/capacity_runner.mjs +0 -0
- {langgraph_api-0.7.91 → langgraph_api-0.7.94}/benchmark/capacity_slack_report.py +0 -0
- {langgraph_api-0.7.91 → langgraph_api-0.7.94}/benchmark/capacity_urls.mjs +0 -0
- {langgraph_api-0.7.91 → langgraph_api-0.7.94}/benchmark/clean-cli.js +0 -0
- {langgraph_api-0.7.91 → langgraph_api-0.7.94}/benchmark/clean.js +0 -0
- {langgraph_api-0.7.91 → langgraph_api-0.7.94}/benchmark/continuous/README.md +0 -0
- {langgraph_api-0.7.91 → langgraph_api-0.7.94}/benchmark/continuous/pyproject.toml +0 -0
- {langgraph_api-0.7.91 → langgraph_api-0.7.94}/benchmark/continuous/runner.py +0 -0
- {langgraph_api-0.7.91 → langgraph_api-0.7.94}/benchmark/continuous/uv.lock +0 -0
- {langgraph_api-0.7.91 → langgraph_api-0.7.94}/benchmark/graphs.js +0 -0
- {langgraph_api-0.7.91 → langgraph_api-0.7.94}/benchmark/mixed_workload_k6.js +0 -0
- {langgraph_api-0.7.91 → langgraph_api-0.7.94}/benchmark/mixed_workload_runner.mjs +0 -0
- {langgraph_api-0.7.91 → langgraph_api-0.7.94}/benchmark/package.json +0 -0
- {langgraph_api-0.7.91 → langgraph_api-0.7.94}/benchmark/ramp.js +0 -0
- {langgraph_api-0.7.91 → langgraph_api-0.7.94}/benchmark/reporting/dd_reporting.py +0 -0
- {langgraph_api-0.7.91 → langgraph_api-0.7.94}/benchmark/reporting/slack_slowest_runs.py +0 -0
- {langgraph_api-0.7.91 → langgraph_api-0.7.94}/benchmark/reporting/slack_summary.py +0 -0
- {langgraph_api-0.7.91 → langgraph_api-0.7.94}/benchmark/run_local.sh +0 -0
- {langgraph_api-0.7.91 → langgraph_api-0.7.94}/benchmark/staircase.py +0 -0
- {langgraph_api-0.7.91 → langgraph_api-0.7.94}/benchmark/staircase_step_k6.js +0 -0
- {langgraph_api-0.7.91 → langgraph_api-0.7.94}/benchmark/tsconfig.json +0 -0
- {langgraph_api-0.7.91 → langgraph_api-0.7.94}/benchmark/update-revision.js +0 -0
- {langgraph_api-0.7.91 → langgraph_api-0.7.94}/benchmark/weather.js +0 -0
- {langgraph_api-0.7.91 → langgraph_api-0.7.94}/constraints.txt +0 -0
- {langgraph_api-0.7.91 → langgraph_api-0.7.94}/custom_store.sql +0 -0
- {langgraph_api-0.7.91 → langgraph_api-0.7.94}/forbidden.txt +0 -0
- {langgraph_api-0.7.91 → langgraph_api-0.7.94}/hatch_build.py +0 -0
- {langgraph_api-0.7.91 → langgraph_api-0.7.94}/healthcheck.py +0 -0
- {langgraph_api-0.7.91 → langgraph_api-0.7.94}/langgraph-cloud-debugging-20260210132856.zip +0 -0
- {langgraph_api-0.7.91 → langgraph_api-0.7.94}/langgraph_api/_checkpointer/__init__.py +0 -0
- {langgraph_api-0.7.91 → langgraph_api-0.7.94}/langgraph_api/_checkpointer/protocol.py +0 -0
- {langgraph_api-0.7.91 → langgraph_api-0.7.94}/langgraph_api/_factory_utils.py +0 -0
- {langgraph_api-0.7.91 → langgraph_api-0.7.94}/langgraph_api/api/__init__.py +0 -0
- {langgraph_api-0.7.91 → langgraph_api-0.7.94}/langgraph_api/api/a2a.py +0 -0
- {langgraph_api-0.7.91 → langgraph_api-0.7.94}/langgraph_api/api/assistants.py +0 -0
- {langgraph_api-0.7.91 → langgraph_api-0.7.94}/langgraph_api/api/mcp/__init__.py +0 -0
- {langgraph_api-0.7.91 → langgraph_api-0.7.94}/langgraph_api/api/mcp/_constants.py +0 -0
- {langgraph_api-0.7.91 → langgraph_api-0.7.94}/langgraph_api/api/mcp/_handlers.py +0 -0
- {langgraph_api-0.7.91 → langgraph_api-0.7.94}/langgraph_api/api/mcp/_models.py +0 -0
- {langgraph_api-0.7.91 → langgraph_api-0.7.94}/langgraph_api/api/mcp/_routes.py +0 -0
- {langgraph_api-0.7.91 → langgraph_api-0.7.94}/langgraph_api/api/mcp/_sanitizers.py +0 -0
- {langgraph_api-0.7.91 → langgraph_api-0.7.94}/langgraph_api/api/meta.py +0 -0
- {langgraph_api-0.7.91 → langgraph_api-0.7.94}/langgraph_api/api/openapi.py +0 -0
- {langgraph_api-0.7.91 → langgraph_api-0.7.94}/langgraph_api/api/profile.py +0 -0
- {langgraph_api-0.7.91 → langgraph_api-0.7.94}/langgraph_api/api/runs.py +0 -0
- {langgraph_api-0.7.91 → langgraph_api-0.7.94}/langgraph_api/api/store.py +0 -0
- {langgraph_api-0.7.91 → langgraph_api-0.7.94}/langgraph_api/api/threads.py +0 -0
- {langgraph_api-0.7.91 → langgraph_api-0.7.94}/langgraph_api/api/ui.py +0 -0
- {langgraph_api-0.7.91 → langgraph_api-0.7.94}/langgraph_api/asgi_transport.py +0 -0
- {langgraph_api-0.7.91 → langgraph_api-0.7.94}/langgraph_api/auth/__init__.py +0 -0
- {langgraph_api-0.7.91 → langgraph_api-0.7.94}/langgraph_api/auth/custom.py +0 -0
- {langgraph_api-0.7.91 → langgraph_api-0.7.94}/langgraph_api/auth/errors.py +0 -0
- {langgraph_api-0.7.91 → langgraph_api-0.7.94}/langgraph_api/auth/langsmith/__init__.py +0 -0
- {langgraph_api-0.7.91 → langgraph_api-0.7.94}/langgraph_api/auth/langsmith/backend.py +0 -0
- {langgraph_api-0.7.91 → langgraph_api-0.7.94}/langgraph_api/auth/langsmith/client.py +0 -0
- {langgraph_api-0.7.91 → langgraph_api-0.7.94}/langgraph_api/auth/middleware.py +0 -0
- {langgraph_api-0.7.91 → langgraph_api-0.7.94}/langgraph_api/auth/noop.py +0 -0
- {langgraph_api-0.7.91 → langgraph_api-0.7.94}/langgraph_api/auth/studio_user.py +0 -0
- {langgraph_api-0.7.91 → langgraph_api-0.7.94}/langgraph_api/cache.py +0 -0
- {langgraph_api-0.7.91 → langgraph_api-0.7.94}/langgraph_api/cli.py +0 -0
- {langgraph_api-0.7.91 → langgraph_api-0.7.94}/langgraph_api/command.py +0 -0
- {langgraph_api-0.7.91 → langgraph_api-0.7.94}/langgraph_api/config/__init__.py +0 -0
- {langgraph_api-0.7.91 → langgraph_api-0.7.94}/langgraph_api/config/_parse.py +0 -0
- {langgraph_api-0.7.91 → langgraph_api-0.7.94}/langgraph_api/config/schemas.py +0 -0
- {langgraph_api-0.7.91 → langgraph_api-0.7.94}/langgraph_api/cron_scheduler.py +0 -0
- {langgraph_api-0.7.91 → langgraph_api-0.7.94}/langgraph_api/encryption/__init__.py +0 -0
- {langgraph_api-0.7.91 → langgraph_api-0.7.94}/langgraph_api/encryption/aes_json.py +0 -0
- {langgraph_api-0.7.91 → langgraph_api-0.7.94}/langgraph_api/encryption/context.py +0 -0
- {langgraph_api-0.7.91 → langgraph_api-0.7.94}/langgraph_api/encryption/custom.py +0 -0
- {langgraph_api-0.7.91 → langgraph_api-0.7.94}/langgraph_api/encryption/middleware.py +0 -0
- {langgraph_api-0.7.91 → langgraph_api-0.7.94}/langgraph_api/encryption/shared.py +0 -0
- {langgraph_api-0.7.91 → langgraph_api-0.7.94}/langgraph_api/errors.py +0 -0
- {langgraph_api-0.7.91 → langgraph_api-0.7.94}/langgraph_api/executor_entrypoint.py +0 -0
- {langgraph_api-0.7.91 → langgraph_api-0.7.94}/langgraph_api/feature_flags.py +0 -0
- {langgraph_api-0.7.91 → langgraph_api-0.7.94}/langgraph_api/grpc/__init__.py +0 -0
- {langgraph_api-0.7.91 → langgraph_api-0.7.94}/langgraph_api/grpc/client.py +0 -0
- {langgraph_api-0.7.91 → langgraph_api-0.7.94}/langgraph_api/grpc/generated/core_api_pb2.pyi +0 -0
- {langgraph_api-0.7.91 → langgraph_api-0.7.94}/langgraph_api/grpc/ops/__init__.py +0 -0
- {langgraph_api-0.7.91 → langgraph_api-0.7.94}/langgraph_api/grpc/ops/assistants.py +0 -0
- {langgraph_api-0.7.91 → langgraph_api-0.7.94}/langgraph_api/grpc/ops/cache.py +0 -0
- {langgraph_api-0.7.91 → langgraph_api-0.7.94}/langgraph_api/grpc/ops/crons.py +0 -0
- {langgraph_api-0.7.91 → langgraph_api-0.7.94}/langgraph_api/grpc/ops/runs.py +0 -0
- {langgraph_api-0.7.91 → langgraph_api-0.7.94}/langgraph_api/grpc/ops/threads.py +0 -0
- {langgraph_api-0.7.91 → langgraph_api-0.7.94}/langgraph_api/grpc/server.py +0 -0
- {langgraph_api-0.7.91 → langgraph_api-0.7.94}/langgraph_api/grpc/servicers/__init__.py +0 -0
- {langgraph_api-0.7.91 → langgraph_api-0.7.94}/langgraph_api/grpc/servicers/checkpointer.py +0 -0
- {langgraph_api-0.7.91 → langgraph_api-0.7.94}/langgraph_api/grpc/servicers/encryption.py +0 -0
- {langgraph_api-0.7.91 → langgraph_api-0.7.94}/langgraph_api/http.py +0 -0
- {langgraph_api-0.7.91 → langgraph_api-0.7.94}/langgraph_api/http_metrics.py +0 -0
- {langgraph_api-0.7.91 → langgraph_api-0.7.94}/langgraph_api/http_metrics_utils.py +0 -0
- {langgraph_api-0.7.91 → langgraph_api-0.7.94}/langgraph_api/js/.gitignore +0 -0
- {langgraph_api-0.7.91 → langgraph_api-0.7.94}/langgraph_api/js/.prettierrc +0 -0
- {langgraph_api-0.7.91 → langgraph_api-0.7.94}/langgraph_api/js/__init__.py +0 -0
- {langgraph_api-0.7.91 → langgraph_api-0.7.94}/langgraph_api/js/base.py +0 -0
- {langgraph_api-0.7.91 → langgraph_api-0.7.94}/langgraph_api/js/build.mts +0 -0
- {langgraph_api-0.7.91 → langgraph_api-0.7.94}/langgraph_api/js/client.http.mts +0 -0
- {langgraph_api-0.7.91 → langgraph_api-0.7.94}/langgraph_api/js/client.mts +0 -0
- {langgraph_api-0.7.91 → langgraph_api-0.7.94}/langgraph_api/js/errors.py +0 -0
- {langgraph_api-0.7.91 → langgraph_api-0.7.94}/langgraph_api/js/global.d.ts +0 -0
- {langgraph_api-0.7.91 → langgraph_api-0.7.94}/langgraph_api/js/package.json +0 -0
- {langgraph_api-0.7.91 → langgraph_api-0.7.94}/langgraph_api/js/schema.py +0 -0
- {langgraph_api-0.7.91 → langgraph_api-0.7.94}/langgraph_api/js/src/graph.mts +0 -0
- {langgraph_api-0.7.91 → langgraph_api-0.7.94}/langgraph_api/js/src/load.hooks.mjs +0 -0
- {langgraph_api-0.7.91 → langgraph_api-0.7.94}/langgraph_api/js/src/preload.mjs +0 -0
- {langgraph_api-0.7.91 → langgraph_api-0.7.94}/langgraph_api/js/src/utils/files.mts +0 -0
- {langgraph_api-0.7.91 → langgraph_api-0.7.94}/langgraph_api/js/src/utils/importMap.mts +0 -0
- {langgraph_api-0.7.91 → langgraph_api-0.7.94}/langgraph_api/js/src/utils/pythonSchemas.mts +0 -0
- {langgraph_api-0.7.91 → langgraph_api-0.7.94}/langgraph_api/js/src/utils/serde.mts +0 -0
- {langgraph_api-0.7.91 → langgraph_api-0.7.94}/langgraph_api/js/sse.py +0 -0
- {langgraph_api-0.7.91 → langgraph_api-0.7.94}/langgraph_api/js/traceblock.mts +0 -0
- {langgraph_api-0.7.91 → langgraph_api-0.7.94}/langgraph_api/js/tsconfig.json +0 -0
- {langgraph_api-0.7.91 → langgraph_api-0.7.94}/langgraph_api/js/ui.py +0 -0
- {langgraph_api-0.7.91 → langgraph_api-0.7.94}/langgraph_api/js/yarn.lock +0 -0
- {langgraph_api-0.7.91 → langgraph_api-0.7.94}/langgraph_api/logging.py +0 -0
- {langgraph_api-0.7.91 → langgraph_api-0.7.94}/langgraph_api/metadata.py +0 -0
- {langgraph_api-0.7.91 → langgraph_api-0.7.94}/langgraph_api/middleware/__init__.py +0 -0
- {langgraph_api-0.7.91 → langgraph_api-0.7.94}/langgraph_api/middleware/ensure_store.py +0 -0
- {langgraph_api-0.7.91 → langgraph_api-0.7.94}/langgraph_api/middleware/http_logger.py +0 -0
- {langgraph_api-0.7.91 → langgraph_api-0.7.94}/langgraph_api/middleware/private_network.py +0 -0
- {langgraph_api-0.7.91 → langgraph_api-0.7.94}/langgraph_api/middleware/request_id.py +0 -0
- {langgraph_api-0.7.91 → langgraph_api-0.7.94}/langgraph_api/models/__init__.py +0 -0
- {langgraph_api-0.7.91 → langgraph_api-0.7.94}/langgraph_api/models/run.py +0 -0
- {langgraph_api-0.7.91 → langgraph_api-0.7.94}/langgraph_api/otel_context.py +0 -0
- {langgraph_api-0.7.91 → langgraph_api-0.7.94}/langgraph_api/patch.py +0 -0
- {langgraph_api-0.7.91 → langgraph_api-0.7.94}/langgraph_api/queue_entrypoint.py +0 -0
- {langgraph_api-0.7.91 → langgraph_api-0.7.94}/langgraph_api/route.py +0 -0
- {langgraph_api-0.7.91 → langgraph_api-0.7.94}/langgraph_api/schema.py +0 -0
- {langgraph_api-0.7.91 → langgraph_api-0.7.94}/langgraph_api/self_hosted_logs.py +0 -0
- {langgraph_api-0.7.91 → langgraph_api-0.7.94}/langgraph_api/self_hosted_metrics.py +0 -0
- {langgraph_api-0.7.91 → langgraph_api-0.7.94}/langgraph_api/serde.py +0 -0
- {langgraph_api-0.7.91 → langgraph_api-0.7.94}/langgraph_api/server.py +0 -0
- {langgraph_api-0.7.91 → langgraph_api-0.7.94}/langgraph_api/sse.py +0 -0
- {langgraph_api-0.7.91 → langgraph_api-0.7.94}/langgraph_api/state.py +0 -0
- {langgraph_api-0.7.91 → langgraph_api-0.7.94}/langgraph_api/stream.py +0 -0
- {langgraph_api-0.7.91 → langgraph_api-0.7.94}/langgraph_api/timing/__init__.py +0 -0
- {langgraph_api-0.7.91 → langgraph_api-0.7.94}/langgraph_api/timing/profiler.py +0 -0
- {langgraph_api-0.7.91 → langgraph_api-0.7.94}/langgraph_api/timing/timer.py +0 -0
- {langgraph_api-0.7.91 → langgraph_api-0.7.94}/langgraph_api/traceblock.py +0 -0
- {langgraph_api-0.7.91 → langgraph_api-0.7.94}/langgraph_api/tunneling/cloudflare.py +0 -0
- {langgraph_api-0.7.91 → langgraph_api-0.7.94}/langgraph_api/utils/__init__.py +0 -0
- {langgraph_api-0.7.91 → langgraph_api-0.7.94}/langgraph_api/utils/cache.py +0 -0
- {langgraph_api-0.7.91 → langgraph_api-0.7.94}/langgraph_api/utils/config.py +0 -0
- {langgraph_api-0.7.91 → langgraph_api-0.7.94}/langgraph_api/utils/errors.py +0 -0
- {langgraph_api-0.7.91 → langgraph_api-0.7.94}/langgraph_api/utils/extract.py +0 -0
- {langgraph_api-0.7.91 → langgraph_api-0.7.94}/langgraph_api/utils/future.py +0 -0
- {langgraph_api-0.7.91 → langgraph_api-0.7.94}/langgraph_api/utils/headers.py +0 -0
- {langgraph_api-0.7.91 → langgraph_api-0.7.94}/langgraph_api/utils/retriable_client.py +0 -0
- {langgraph_api-0.7.91 → langgraph_api-0.7.94}/langgraph_api/utils/stream_codec.py +0 -0
- {langgraph_api-0.7.91 → langgraph_api-0.7.94}/langgraph_api/utils/uuids.py +0 -0
- {langgraph_api-0.7.91 → langgraph_api-0.7.94}/langgraph_api/validation.py +0 -0
- {langgraph_api-0.7.91 → langgraph_api-0.7.94}/langgraph_api/webhook.py +0 -0
- {langgraph_api-0.7.91 → langgraph_api-0.7.94}/langgraph_api/worker.py +0 -0
- {langgraph_api-0.7.91 → langgraph_api-0.7.94}/langgraph_grpc_common/__init__.py +0 -0
- {langgraph_api-0.7.91 → langgraph_api-0.7.94}/langgraph_grpc_common/checkpointer.py +0 -0
- {langgraph_api-0.7.91 → langgraph_api-0.7.94}/langgraph_grpc_common/conversion/__init__.py +0 -0
- {langgraph_api-0.7.91 → langgraph_api-0.7.94}/langgraph_grpc_common/conversion/_compat.py +0 -0
- {langgraph_api-0.7.91 → langgraph_api-0.7.94}/langgraph_grpc_common/conversion/channel.py +0 -0
- {langgraph_api-0.7.91 → langgraph_api-0.7.94}/langgraph_grpc_common/conversion/checkpoint.py +0 -0
- {langgraph_api-0.7.91 → langgraph_api-0.7.94}/langgraph_grpc_common/conversion/config.py +0 -0
- {langgraph_api-0.7.91 → langgraph_api-0.7.94}/langgraph_grpc_common/conversion/durability.py +0 -0
- {langgraph_api-0.7.91 → langgraph_api-0.7.94}/langgraph_grpc_common/conversion/exception.py +0 -0
- {langgraph_api-0.7.91 → langgraph_api-0.7.94}/langgraph_grpc_common/conversion/graph.py +0 -0
- {langgraph_api-0.7.91 → langgraph_api-0.7.94}/langgraph_grpc_common/conversion/interrupt.py +0 -0
- {langgraph_api-0.7.91 → langgraph_api-0.7.94}/langgraph_grpc_common/conversion/messages.py +0 -0
- {langgraph_api-0.7.91 → langgraph_api-0.7.94}/langgraph_grpc_common/conversion/orchestrator_response.py +0 -0
- {langgraph_api-0.7.91 → langgraph_api-0.7.94}/langgraph_grpc_common/conversion/runopts.py +0 -0
- {langgraph_api-0.7.91 → langgraph_api-0.7.94}/langgraph_grpc_common/conversion/stream_mode.py +0 -0
- {langgraph_api-0.7.91 → langgraph_api-0.7.94}/langgraph_grpc_common/conversion/struct.py +0 -0
- {langgraph_api-0.7.91 → langgraph_api-0.7.94}/langgraph_grpc_common/conversion/task.py +0 -0
- {langgraph_api-0.7.91 → langgraph_api-0.7.94}/langgraph_grpc_common/conversion/value.py +0 -0
- {langgraph_api-0.7.91 → langgraph_api-0.7.94}/langgraph_grpc_common/proto/__init__.py +0 -0
- {langgraph_api-0.7.91 → langgraph_api-0.7.94}/langgraph_grpc_common/proto/checkpointer_pb2.py +0 -0
- {langgraph_api-0.7.91 → langgraph_api-0.7.94}/langgraph_grpc_common/proto/checkpointer_pb2.pyi +0 -0
- {langgraph_api-0.7.91 → langgraph_api-0.7.94}/langgraph_grpc_common/proto/checkpointer_pb2_grpc.py +0 -0
- {langgraph_api-0.7.91 → langgraph_api-0.7.94}/langgraph_grpc_common/proto/checkpointer_pb2_grpc.pyi +0 -0
- {langgraph_api-0.7.91 → langgraph_api-0.7.94}/langgraph_grpc_common/proto/core_api_pb2.py +0 -0
- {langgraph_api-0.7.91 → langgraph_api-0.7.94}/langgraph_grpc_common/proto/core_api_pb2.pyi +0 -0
- {langgraph_api-0.7.91 → langgraph_api-0.7.94}/langgraph_grpc_common/proto/core_api_pb2_grpc.py +0 -0
- {langgraph_api-0.7.91 → langgraph_api-0.7.94}/langgraph_grpc_common/proto/core_api_pb2_grpc.pyi +0 -0
- {langgraph_api-0.7.91 → langgraph_api-0.7.94}/langgraph_grpc_common/proto/encryption_pb2.py +0 -0
- {langgraph_api-0.7.91 → langgraph_api-0.7.94}/langgraph_grpc_common/proto/encryption_pb2.pyi +0 -0
- {langgraph_api-0.7.91 → langgraph_api-0.7.94}/langgraph_grpc_common/proto/encryption_pb2_grpc.py +0 -0
- {langgraph_api-0.7.91 → langgraph_api-0.7.94}/langgraph_grpc_common/proto/encryption_pb2_grpc.pyi +0 -0
- {langgraph_api-0.7.91 → langgraph_api-0.7.94}/langgraph_grpc_common/proto/engine_api_pb2.py +0 -0
- {langgraph_api-0.7.91 → langgraph_api-0.7.94}/langgraph_grpc_common/proto/engine_api_pb2.pyi +0 -0
- {langgraph_api-0.7.91 → langgraph_api-0.7.94}/langgraph_grpc_common/proto/engine_api_pb2_grpc.py +0 -0
- {langgraph_api-0.7.91 → langgraph_api-0.7.94}/langgraph_grpc_common/proto/engine_api_pb2_grpc.pyi +0 -0
- {langgraph_api-0.7.91 → langgraph_api-0.7.94}/langgraph_grpc_common/proto/engine_common_pb2.py +0 -0
- {langgraph_api-0.7.91 → langgraph_api-0.7.94}/langgraph_grpc_common/proto/engine_common_pb2.pyi +0 -0
- {langgraph_api-0.7.91 → langgraph_api-0.7.94}/langgraph_grpc_common/proto/engine_common_pb2_grpc.py +0 -0
- {langgraph_api-0.7.91 → langgraph_api-0.7.94}/langgraph_grpc_common/proto/engine_common_pb2_grpc.pyi +0 -0
- {langgraph_api-0.7.91 → langgraph_api-0.7.94}/langgraph_grpc_common/proto/enum_cancel_run_action_pb2.py +0 -0
- {langgraph_api-0.7.91 → langgraph_api-0.7.94}/langgraph_grpc_common/proto/enum_cancel_run_action_pb2.pyi +0 -0
- {langgraph_api-0.7.91 → langgraph_api-0.7.94}/langgraph_grpc_common/proto/enum_cancel_run_action_pb2_grpc.py +0 -0
- {langgraph_api-0.7.91 → langgraph_api-0.7.94}/langgraph_grpc_common/proto/enum_cancel_run_action_pb2_grpc.pyi +0 -0
- {langgraph_api-0.7.91 → langgraph_api-0.7.94}/langgraph_grpc_common/proto/enum_control_signal_pb2.py +0 -0
- {langgraph_api-0.7.91 → langgraph_api-0.7.94}/langgraph_grpc_common/proto/enum_control_signal_pb2.pyi +0 -0
- {langgraph_api-0.7.91 → langgraph_api-0.7.94}/langgraph_grpc_common/proto/enum_control_signal_pb2_grpc.py +0 -0
- {langgraph_api-0.7.91 → langgraph_api-0.7.94}/langgraph_grpc_common/proto/enum_control_signal_pb2_grpc.pyi +0 -0
- {langgraph_api-0.7.91 → langgraph_api-0.7.94}/langgraph_grpc_common/proto/enum_cron_on_run_completed_pb2.py +0 -0
- {langgraph_api-0.7.91 → langgraph_api-0.7.94}/langgraph_grpc_common/proto/enum_cron_on_run_completed_pb2.pyi +0 -0
- {langgraph_api-0.7.91 → langgraph_api-0.7.94}/langgraph_grpc_common/proto/enum_cron_on_run_completed_pb2_grpc.py +0 -0
- {langgraph_api-0.7.91 → langgraph_api-0.7.94}/langgraph_grpc_common/proto/enum_cron_on_run_completed_pb2_grpc.pyi +0 -0
- {langgraph_api-0.7.91 → langgraph_api-0.7.94}/langgraph_grpc_common/proto/enum_durability_pb2.py +0 -0
- {langgraph_api-0.7.91 → langgraph_api-0.7.94}/langgraph_grpc_common/proto/enum_durability_pb2.pyi +0 -0
- {langgraph_api-0.7.91 → langgraph_api-0.7.94}/langgraph_grpc_common/proto/enum_durability_pb2_grpc.py +0 -0
- {langgraph_api-0.7.91 → langgraph_api-0.7.94}/langgraph_grpc_common/proto/enum_durability_pb2_grpc.pyi +0 -0
- {langgraph_api-0.7.91 → langgraph_api-0.7.94}/langgraph_grpc_common/proto/enum_multitask_strategy_pb2.py +0 -0
- {langgraph_api-0.7.91 → langgraph_api-0.7.94}/langgraph_grpc_common/proto/enum_multitask_strategy_pb2.pyi +0 -0
- {langgraph_api-0.7.91 → langgraph_api-0.7.94}/langgraph_grpc_common/proto/enum_multitask_strategy_pb2_grpc.py +0 -0
- {langgraph_api-0.7.91 → langgraph_api-0.7.94}/langgraph_grpc_common/proto/enum_multitask_strategy_pb2_grpc.pyi +0 -0
- {langgraph_api-0.7.91 → langgraph_api-0.7.94}/langgraph_grpc_common/proto/enum_run_status_pb2.py +0 -0
- {langgraph_api-0.7.91 → langgraph_api-0.7.94}/langgraph_grpc_common/proto/enum_run_status_pb2.pyi +0 -0
- {langgraph_api-0.7.91 → langgraph_api-0.7.94}/langgraph_grpc_common/proto/enum_run_status_pb2_grpc.py +0 -0
- {langgraph_api-0.7.91 → langgraph_api-0.7.94}/langgraph_grpc_common/proto/enum_run_status_pb2_grpc.pyi +0 -0
- {langgraph_api-0.7.91 → langgraph_api-0.7.94}/langgraph_grpc_common/proto/enum_store_operation_entry_type_pb2.py +0 -0
- {langgraph_api-0.7.91 → langgraph_api-0.7.94}/langgraph_grpc_common/proto/enum_store_operation_entry_type_pb2.pyi +0 -0
- {langgraph_api-0.7.91 → langgraph_api-0.7.94}/langgraph_grpc_common/proto/enum_store_operation_entry_type_pb2_grpc.py +0 -0
- {langgraph_api-0.7.91 → langgraph_api-0.7.94}/langgraph_grpc_common/proto/enum_store_operation_entry_type_pb2_grpc.pyi +0 -0
- {langgraph_api-0.7.91 → langgraph_api-0.7.94}/langgraph_grpc_common/proto/enum_stream_mode_pb2.py +0 -0
- {langgraph_api-0.7.91 → langgraph_api-0.7.94}/langgraph_grpc_common/proto/enum_stream_mode_pb2.pyi +0 -0
- {langgraph_api-0.7.91 → langgraph_api-0.7.94}/langgraph_grpc_common/proto/enum_stream_mode_pb2_grpc.py +0 -0
- {langgraph_api-0.7.91 → langgraph_api-0.7.94}/langgraph_grpc_common/proto/enum_stream_mode_pb2_grpc.pyi +0 -0
- {langgraph_api-0.7.91 → langgraph_api-0.7.94}/langgraph_grpc_common/proto/enum_thread_status_pb2.py +0 -0
- {langgraph_api-0.7.91 → langgraph_api-0.7.94}/langgraph_grpc_common/proto/enum_thread_status_pb2.pyi +0 -0
- {langgraph_api-0.7.91 → langgraph_api-0.7.94}/langgraph_grpc_common/proto/enum_thread_status_pb2_grpc.py +0 -0
- {langgraph_api-0.7.91 → langgraph_api-0.7.94}/langgraph_grpc_common/proto/enum_thread_status_pb2_grpc.pyi +0 -0
- {langgraph_api-0.7.91 → langgraph_api-0.7.94}/langgraph_grpc_common/proto/enum_thread_stream_mode_pb2.py +0 -0
- {langgraph_api-0.7.91 → langgraph_api-0.7.94}/langgraph_grpc_common/proto/enum_thread_stream_mode_pb2.pyi +0 -0
- {langgraph_api-0.7.91 → langgraph_api-0.7.94}/langgraph_grpc_common/proto/enum_thread_stream_mode_pb2_grpc.py +0 -0
- {langgraph_api-0.7.91 → langgraph_api-0.7.94}/langgraph_grpc_common/proto/enum_thread_stream_mode_pb2_grpc.pyi +0 -0
- {langgraph_api-0.7.91 → langgraph_api-0.7.94}/langgraph_grpc_common/proto/errors_pb2.py +0 -0
- {langgraph_api-0.7.91 → langgraph_api-0.7.94}/langgraph_grpc_common/proto/errors_pb2.pyi +0 -0
- {langgraph_api-0.7.91 → langgraph_api-0.7.94}/langgraph_grpc_common/proto/errors_pb2_grpc.py +0 -0
- {langgraph_api-0.7.91 → langgraph_api-0.7.94}/langgraph_grpc_common/proto/errors_pb2_grpc.pyi +0 -0
- {langgraph_api-0.7.91 → langgraph_api-0.7.94}/langgraph_grpc_common/proto/executor_api_pb2.py +0 -0
- {langgraph_api-0.7.91 → langgraph_api-0.7.94}/langgraph_grpc_common/proto/executor_api_pb2.pyi +0 -0
- {langgraph_api-0.7.91 → langgraph_api-0.7.94}/langgraph_grpc_common/proto/executor_api_pb2_grpc.py +0 -0
- {langgraph_api-0.7.91 → langgraph_api-0.7.94}/langgraph_grpc_common/proto/executor_api_pb2_grpc.pyi +0 -0
- {langgraph_api-0.7.91 → langgraph_api-0.7.94}/langgraph_grpc_common/sanitize.py +0 -0
- {langgraph_api-0.7.91 → langgraph_api-0.7.94}/langgraph_grpc_common/serde.py +0 -0
- {langgraph_api-0.7.91 → langgraph_api-0.7.94}/langgraph_license/__init__.py +0 -0
- {langgraph_api-0.7.91 → langgraph_api-0.7.94}/langgraph_license/validation.py +0 -0
- {langgraph_api-0.7.91 → langgraph_api-0.7.94}/langgraph_runtime/__init__.py +0 -0
- {langgraph_api-0.7.91 → langgraph_api-0.7.94}/langgraph_runtime/checkpoint.py +0 -0
- {langgraph_api-0.7.91 → langgraph_api-0.7.94}/langgraph_runtime/database.py +0 -0
- {langgraph_api-0.7.91 → langgraph_api-0.7.94}/langgraph_runtime/lifespan.py +0 -0
- {langgraph_api-0.7.91 → langgraph_api-0.7.94}/langgraph_runtime/metrics.py +0 -0
- {langgraph_api-0.7.91 → langgraph_api-0.7.94}/langgraph_runtime/ops.py +0 -0
- {langgraph_api-0.7.91 → langgraph_api-0.7.94}/langgraph_runtime/queue.py +0 -0
- {langgraph_api-0.7.91 → langgraph_api-0.7.94}/langgraph_runtime/retry.py +0 -0
- {langgraph_api-0.7.91 → langgraph_api-0.7.94}/langgraph_runtime/routes.py +0 -0
- {langgraph_api-0.7.91 → langgraph_api-0.7.94}/langgraph_runtime/store.py +0 -0
- {langgraph_api-0.7.91 → langgraph_api-0.7.94}/logging.json +0 -0
- {langgraph_api-0.7.91 → langgraph_api-0.7.94}/openapi.json +0 -0
- {langgraph_api-0.7.91 → langgraph_api-0.7.94}/pyproject.toml +0 -0
- {langgraph_api-0.7.91 → langgraph_api-0.7.94}/scripts/build_wheel.py +0 -0
- {langgraph_api-0.7.91 → langgraph_api-0.7.94}/scripts/create_license.py +0 -0
- {langgraph_api-0.7.91 → langgraph_api-0.7.94}/scripts/run_a2a_tck.py +0 -0
- {langgraph_api-0.7.91 → langgraph_api-0.7.94}/uv.lock +0 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
__version__ = "0.7.94"
|
|
@@ -22,6 +22,7 @@ from langgraph.pregel import Pregel
|
|
|
22
22
|
from langgraph_grpc_common.checkpointer import GrpcCheckpointer
|
|
23
23
|
|
|
24
24
|
from langgraph_api import config, timing
|
|
25
|
+
from langgraph_api.asyncio import as_asynccontextmanager
|
|
25
26
|
from langgraph_api.grpc.client import get_shared_client
|
|
26
27
|
from langgraph_api.timing import profiled_import
|
|
27
28
|
from langgraph_api.utils.config import run_in_executor
|
|
@@ -375,15 +376,9 @@ async def collect_checkpointer_from_env() -> None:
|
|
|
375
376
|
async def _yield_checkpointer(value: Any):
|
|
376
377
|
if isinstance(value, BaseCheckpointSaver):
|
|
377
378
|
yield value
|
|
378
|
-
|
|
379
|
-
|
|
380
|
-
async with value as ctx_value:
|
|
379
|
+
elif hasattr(value, "__aenter__") or hasattr(value, "__enter__"):
|
|
380
|
+
async with as_asynccontextmanager(value) as ctx_value:
|
|
381
381
|
yield ctx_value
|
|
382
|
-
# Sync context manager
|
|
383
|
-
elif hasattr(value, "__enter__") and hasattr(value, "__exit__"):
|
|
384
|
-
with value as ctx_value:
|
|
385
|
-
yield ctx_value
|
|
386
|
-
# async factory
|
|
387
382
|
elif asyncio.iscoroutine(value):
|
|
388
383
|
result = await value
|
|
389
384
|
if not isinstance(result, BaseCheckpointSaver):
|
|
@@ -391,7 +386,6 @@ async def _yield_checkpointer(value: Any):
|
|
|
391
386
|
"Custom checkpointer must resolve to a BaseCheckpointSaver instance."
|
|
392
387
|
)
|
|
393
388
|
yield result
|
|
394
|
-
# factory
|
|
395
389
|
elif callable(value):
|
|
396
390
|
async with _yield_checkpointer(value()) as ctx_value:
|
|
397
391
|
yield ctx_value
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import asyncio
|
|
2
2
|
import concurrent.futures
|
|
3
3
|
from collections.abc import AsyncIterator, Coroutine
|
|
4
|
-
from contextlib import AbstractAsyncContextManager, suppress
|
|
4
|
+
from contextlib import AbstractAsyncContextManager, asynccontextmanager, suppress
|
|
5
5
|
from functools import partial
|
|
6
6
|
from typing import Any, Generic, TypeVar
|
|
7
7
|
|
|
@@ -14,6 +14,25 @@ logger = structlog.stdlib.get_logger(__name__)
|
|
|
14
14
|
_MAIN_LOOP: asyncio.AbstractEventLoop | None = None
|
|
15
15
|
|
|
16
16
|
|
|
17
|
+
@asynccontextmanager
|
|
18
|
+
async def as_asynccontextmanager(value: Any) -> AsyncIterator[Any]:
|
|
19
|
+
"""Normalize an async CM, sync CM, or coroutine into a single async context manager.
|
|
20
|
+
|
|
21
|
+
Handles the three factory return styles used across graph, store, and checkpointer
|
|
22
|
+
loading without duplicating the dispatch logic.
|
|
23
|
+
"""
|
|
24
|
+
if hasattr(value, "__aenter__") and hasattr(value, "__aexit__"):
|
|
25
|
+
async with value as result:
|
|
26
|
+
yield result
|
|
27
|
+
elif hasattr(value, "__enter__") and hasattr(value, "__exit__"):
|
|
28
|
+
with value as result:
|
|
29
|
+
yield result
|
|
30
|
+
elif asyncio.iscoroutine(value):
|
|
31
|
+
yield await value
|
|
32
|
+
else:
|
|
33
|
+
yield value
|
|
34
|
+
|
|
35
|
+
|
|
17
36
|
def set_event_loop(loop: asyncio.AbstractEventLoop) -> None:
|
|
18
37
|
global _MAIN_LOOP
|
|
19
38
|
_MAIN_LOOP = loop
|
|
@@ -34,6 +34,7 @@ from langgraph_api._factory_utils import (
|
|
|
34
34
|
is_factory,
|
|
35
35
|
is_for_execution,
|
|
36
36
|
)
|
|
37
|
+
from langgraph_api.asyncio import as_asynccontextmanager
|
|
37
38
|
from langgraph_api.feature_flags import (
|
|
38
39
|
IS_POSTGRES_OR_GRPC_BACKEND,
|
|
39
40
|
USE_RUNTIME_CONTEXT_API,
|
|
@@ -169,9 +170,59 @@ def _log_slow_graph_generation(
|
|
|
169
170
|
)
|
|
170
171
|
|
|
171
172
|
|
|
173
|
+
_ddtracer: Any = None
|
|
174
|
+
|
|
175
|
+
|
|
176
|
+
def _get_ddtracer() -> Any:
|
|
177
|
+
"""Return the ddtrace tracer singleton, or None if ddtrace is not installed."""
|
|
178
|
+
global _ddtracer
|
|
179
|
+
if not hasattr(_get_ddtracer, "_checked"):
|
|
180
|
+
_get_ddtracer._checked = True
|
|
181
|
+
try:
|
|
182
|
+
from ddtrace import tracer # type: ignore[unresolved-import] # noqa: PLC0415, I001
|
|
183
|
+
|
|
184
|
+
_ddtracer = tracer
|
|
185
|
+
except ImportError:
|
|
186
|
+
# ddtrace is an optional dependency; tracing is silently disabled when absent.
|
|
187
|
+
pass
|
|
188
|
+
return _ddtracer
|
|
189
|
+
|
|
190
|
+
|
|
191
|
+
def _start_graph_load_span(graph_id: str, access_context: str | None) -> Any:
|
|
192
|
+
"""Start a ddtrace span covering graph factory __aenter__ time.
|
|
193
|
+
|
|
194
|
+
Starting before __aenter__ means HTTP calls made by the factory appear as
|
|
195
|
+
children of this span. Returns the span, or None if ddtrace is unavailable.
|
|
196
|
+
"""
|
|
197
|
+
ddtracer = _get_ddtracer()
|
|
198
|
+
if ddtracer is None:
|
|
199
|
+
return None
|
|
200
|
+
try:
|
|
201
|
+
span = ddtracer.start_span("langgraph.graph_load")
|
|
202
|
+
span.set_tag("graph_id", graph_id)
|
|
203
|
+
if access_context:
|
|
204
|
+
span.set_tag("access_context", access_context)
|
|
205
|
+
return span
|
|
206
|
+
except Exception:
|
|
207
|
+
return None
|
|
208
|
+
|
|
209
|
+
|
|
210
|
+
def _finish_graph_load_span(span: Any, value_type: str) -> None:
|
|
211
|
+
if span is None:
|
|
212
|
+
return
|
|
213
|
+
try:
|
|
214
|
+
span.set_tag("value_type", value_type)
|
|
215
|
+
span.finish()
|
|
216
|
+
except Exception:
|
|
217
|
+
pass # Tracing must never interfere with application logic
|
|
218
|
+
|
|
219
|
+
|
|
172
220
|
@asynccontextmanager
|
|
173
221
|
async def _generate_graph(
|
|
174
|
-
value: Any,
|
|
222
|
+
value: Any,
|
|
223
|
+
graph_id: str,
|
|
224
|
+
run_id: str | None = None,
|
|
225
|
+
access_context: str | None = None,
|
|
175
226
|
) -> AsyncIterator[Any]:
|
|
176
227
|
"""Yield a graph object regardless of its type.
|
|
177
228
|
|
|
@@ -183,20 +234,15 @@ async def _generate_graph(
|
|
|
183
234
|
value_type = type(value).__name__
|
|
184
235
|
if isinstance(value, Pregel | BaseRemotePregel):
|
|
185
236
|
yield value
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
elif hasattr(value, "__enter__") and hasattr(value, "__exit__"):
|
|
191
|
-
with value as ctx_value:
|
|
237
|
+
return
|
|
238
|
+
span = _start_graph_load_span(graph_id, access_context)
|
|
239
|
+
try:
|
|
240
|
+
async with as_asynccontextmanager(value) as ctx_value:
|
|
192
241
|
_log_slow_graph_generation(start, value_type, graph_id, run_id=run_id)
|
|
242
|
+
_finish_graph_load_span(span, value_type)
|
|
193
243
|
yield ctx_value
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
_log_slow_graph_generation(start, value_type, graph_id, run_id=run_id)
|
|
197
|
-
yield result
|
|
198
|
-
else:
|
|
199
|
-
yield value
|
|
244
|
+
finally:
|
|
245
|
+
_finish_graph_load_span(span, value_type)
|
|
200
246
|
|
|
201
247
|
|
|
202
248
|
def is_js_graph(graph_id: str) -> TypeGuard[BaseRemotePregel]:
|
|
@@ -246,7 +292,9 @@ async def get_graph(
|
|
|
246
292
|
|
|
247
293
|
value = invoke_factory(value, graph_id, config, server_runtime)
|
|
248
294
|
try:
|
|
249
|
-
async with _generate_graph(
|
|
295
|
+
async with _generate_graph(
|
|
296
|
+
value, graph_id, run_id=run_id, access_context=access_context
|
|
297
|
+
) as graph_obj:
|
|
250
298
|
if isinstance(graph_obj, StateGraph):
|
|
251
299
|
graph_obj = graph_obj.compile()
|
|
252
300
|
if not isinstance(graph_obj, Pregel | BaseRemotePregel):
|
|
@@ -480,7 +528,7 @@ async def collect_graphs_from_env(register: bool = False) -> None:
|
|
|
480
528
|
for task in js_bg_tasks:
|
|
481
529
|
task.add_done_callback(_handle_exception)
|
|
482
530
|
|
|
483
|
-
await wait_until_js_ready()
|
|
531
|
+
await wait_until_js_ready(js_bg_tasks)
|
|
484
532
|
|
|
485
533
|
for spec in js_specs:
|
|
486
534
|
graph = RemotePregel(graph_id=spec.id)
|
|
@@ -526,6 +574,43 @@ def _metadata_fn(spec: GraphSpec) -> dict[str, Any]:
|
|
|
526
574
|
return {"graph_id": spec.id, "module": spec.module, "path": spec.path}
|
|
527
575
|
|
|
528
576
|
|
|
577
|
+
def patch_packages_distributions() -> None:
|
|
578
|
+
"""Cache importlib.metadata.packages_distributions() to avoid repeated full scans.
|
|
579
|
+
|
|
580
|
+
google-api-core >=2.28.0 calls packages_distributions() — an uncached O(N)
|
|
581
|
+
scan of every installed package's RECORD file — 13+ times at import time
|
|
582
|
+
(once per google.cloud.* sub-package). With ddtrace's import hooks each
|
|
583
|
+
call takes ~13 s in production, totalling ~170 s.
|
|
584
|
+
|
|
585
|
+
The installed-package set never changes during a process lifetime, so a
|
|
586
|
+
single cached result is safe and reduces 13 scans to 1.
|
|
587
|
+
|
|
588
|
+
Controlled by LSD_CACHE_PACKAGES_DISTRIBUTIONS (default "false").
|
|
589
|
+
Set to "true" to enable.
|
|
590
|
+
"""
|
|
591
|
+
if os.environ.get("LSD_CACHE_PACKAGES_DISTRIBUTIONS", "false").lower() != "true":
|
|
592
|
+
return
|
|
593
|
+
|
|
594
|
+
import importlib.metadata # noqa: PLC0415
|
|
595
|
+
|
|
596
|
+
if getattr(importlib.metadata.packages_distributions, "_cached", False):
|
|
597
|
+
return
|
|
598
|
+
|
|
599
|
+
logger.info("Caching importlib.metadata.packages_distributions()")
|
|
600
|
+
|
|
601
|
+
original = importlib.metadata.packages_distributions
|
|
602
|
+
cache: dict | None = None
|
|
603
|
+
|
|
604
|
+
def _cached():
|
|
605
|
+
nonlocal cache
|
|
606
|
+
if cache is None:
|
|
607
|
+
cache = original()
|
|
608
|
+
return cache
|
|
609
|
+
|
|
610
|
+
_cached._cached = True
|
|
611
|
+
importlib.metadata.packages_distributions = _cached
|
|
612
|
+
|
|
613
|
+
|
|
529
614
|
@timing.timer(
|
|
530
615
|
message="Importing graph with id {graph_id}",
|
|
531
616
|
metadata_fn=_metadata_fn,
|
|
@@ -414,8 +414,19 @@ async def run_js_process(paths_str: str | None, watch: bool = False):
|
|
|
414
414
|
**os.environ,
|
|
415
415
|
},
|
|
416
416
|
)
|
|
417
|
-
logger.info(
|
|
417
|
+
logger.info(
|
|
418
|
+
"Started JS graphs process",
|
|
419
|
+
pid=process.pid,
|
|
420
|
+
attempt=attempt,
|
|
421
|
+
args=args,
|
|
422
|
+
)
|
|
418
423
|
code = await process.wait()
|
|
424
|
+
logger.error(
|
|
425
|
+
"JS graphs process exited unexpectedly",
|
|
426
|
+
pid=process.pid,
|
|
427
|
+
exit_code=code,
|
|
428
|
+
attempt=attempt,
|
|
429
|
+
)
|
|
419
430
|
raise Exception(f"JS process exited with code {code}")
|
|
420
431
|
except asyncio.CancelledError:
|
|
421
432
|
logger.info("Terminating JS graphs process")
|
|
@@ -462,9 +473,20 @@ async def run_js_http_process(
|
|
|
462
473
|
)
|
|
463
474
|
|
|
464
475
|
pid = process.pid
|
|
465
|
-
logger.info(
|
|
476
|
+
logger.info(
|
|
477
|
+
"Started JS HTTP process",
|
|
478
|
+
pid=pid,
|
|
479
|
+
attempt=attempt,
|
|
480
|
+
args=args,
|
|
481
|
+
)
|
|
466
482
|
|
|
467
483
|
code = await process.wait()
|
|
484
|
+
logger.error(
|
|
485
|
+
"JS HTTP process exited unexpectedly",
|
|
486
|
+
pid=pid,
|
|
487
|
+
exit_code=code,
|
|
488
|
+
attempt=attempt,
|
|
489
|
+
)
|
|
468
490
|
raise Exception(f"JS HTTP process exited with code {code}")
|
|
469
491
|
|
|
470
492
|
except asyncio.CancelledError:
|
|
@@ -806,7 +828,9 @@ class DisableHttpxLoggingContextManager(contextlib.AbstractContextManager):
|
|
|
806
828
|
logging.getLogger("httpx").removeFilter(self.filter)
|
|
807
829
|
|
|
808
830
|
|
|
809
|
-
async def wait_until_js_ready(
|
|
831
|
+
async def wait_until_js_ready(
|
|
832
|
+
bg_tasks: set[asyncio.Task] | None = None,
|
|
833
|
+
):
|
|
810
834
|
with DisableHttpxLoggingContextManager():
|
|
811
835
|
async with (
|
|
812
836
|
httpx.AsyncClient(
|
|
@@ -821,19 +845,50 @@ async def wait_until_js_ready():
|
|
|
821
845
|
) as checkpointer_client,
|
|
822
846
|
):
|
|
823
847
|
attempt = 0
|
|
848
|
+
graph_ready = False
|
|
824
849
|
while (
|
|
825
850
|
current_task := asyncio.current_task()
|
|
826
851
|
) and not current_task.cancelled():
|
|
852
|
+
if bg_tasks:
|
|
853
|
+
for task in bg_tasks:
|
|
854
|
+
if task.done():
|
|
855
|
+
exc = task.exception() if not task.cancelled() else None
|
|
856
|
+
logger.error(
|
|
857
|
+
"JS background task finished while waiting for"
|
|
858
|
+
" JS ready",
|
|
859
|
+
task_name=task.get_name(),
|
|
860
|
+
task_cancelled=task.cancelled(),
|
|
861
|
+
task_exception=repr(exc) if exc else None,
|
|
862
|
+
)
|
|
863
|
+
raise RuntimeError(
|
|
864
|
+
f"JS background task '{task.get_name()}' died"
|
|
865
|
+
" during startup"
|
|
866
|
+
) from exc
|
|
827
867
|
try:
|
|
828
|
-
|
|
829
|
-
|
|
868
|
+
if not graph_ready:
|
|
869
|
+
res = await graph_client.get("/ok")
|
|
870
|
+
res.raise_for_status()
|
|
871
|
+
graph_ready = True
|
|
830
872
|
res = await checkpointer_client.get("/ok")
|
|
831
873
|
res.raise_for_status()
|
|
832
874
|
return
|
|
833
|
-
except httpx.HTTPError:
|
|
875
|
+
except httpx.HTTPError as exc:
|
|
834
876
|
if attempt > 240:
|
|
877
|
+
logger.exception(
|
|
878
|
+
"Timed out waiting for JS process to become ready",
|
|
879
|
+
attempts=attempt,
|
|
880
|
+
graph_ready=graph_ready,
|
|
881
|
+
)
|
|
835
882
|
raise
|
|
836
883
|
else:
|
|
884
|
+
if attempt % 20 == 0 and attempt > 0:
|
|
885
|
+
logger.warning(
|
|
886
|
+
"Still waiting for JS process to become ready",
|
|
887
|
+
attempts=attempt,
|
|
888
|
+
elapsed_seconds=attempt * 0.5,
|
|
889
|
+
graph_ready=graph_ready,
|
|
890
|
+
last_error=repr(exc),
|
|
891
|
+
)
|
|
837
892
|
attempt += 1
|
|
838
893
|
await asyncio.sleep(0.5)
|
|
839
894
|
|
|
@@ -247,6 +247,14 @@ class DatadogMetricsReporter:
|
|
|
247
247
|
Histogram: AggregationTemporality.DELTA,
|
|
248
248
|
},
|
|
249
249
|
)
|
|
250
|
+
# Burn after reading: remove DD keys from env so user code
|
|
251
|
+
# and child processes cannot access them.
|
|
252
|
+
for key in (
|
|
253
|
+
"LSD_DD_API_KEY",
|
|
254
|
+
"LSD_DD_ENDPOINT",
|
|
255
|
+
):
|
|
256
|
+
os.environ.pop(key, None)
|
|
257
|
+
|
|
250
258
|
reader = PeriodicExportingMetricReader(
|
|
251
259
|
_FilteringExporter(base_exporter),
|
|
252
260
|
export_interval_millis=10_000,
|
|
@@ -13,6 +13,7 @@ from langgraph.pregel import Pregel
|
|
|
13
13
|
from langgraph.store.base import BaseStore
|
|
14
14
|
|
|
15
15
|
from langgraph_api import config, timing
|
|
16
|
+
from langgraph_api.asyncio import as_asynccontextmanager
|
|
16
17
|
from langgraph_api.timing import profiled_import
|
|
17
18
|
from langgraph_api.utils.config import run_in_executor
|
|
18
19
|
|
|
@@ -50,14 +51,13 @@ async def exit_store():
|
|
|
50
51
|
async def _yield_store(value: Any):
|
|
51
52
|
if isinstance(value, BaseStore):
|
|
52
53
|
yield value
|
|
53
|
-
elif
|
|
54
|
-
|
|
54
|
+
elif (
|
|
55
|
+
hasattr(value, "__aenter__")
|
|
56
|
+
or hasattr(value, "__enter__")
|
|
57
|
+
or asyncio.iscoroutine(value)
|
|
58
|
+
):
|
|
59
|
+
async with as_asynccontextmanager(value) as ctx_value:
|
|
55
60
|
yield ctx_value
|
|
56
|
-
elif hasattr(value, "__enter__") and hasattr(value, "__exit__"):
|
|
57
|
-
with value as ctx_value:
|
|
58
|
-
yield ctx_value
|
|
59
|
-
elif asyncio.iscoroutine(value):
|
|
60
|
-
yield await value
|
|
61
61
|
elif callable(value):
|
|
62
62
|
async with _yield_store(value()) as ctx_value:
|
|
63
63
|
yield ctx_value
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
__version__ = "0.7.91"
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{langgraph_api-0.7.91 → langgraph_api-0.7.94}/benchmark/benchmark-runners/benchmark-runner.ts
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{langgraph_api-0.7.91 → langgraph_api-0.7.94}/benchmark/benchmark-runners/enqueued_runs_order.ts
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{langgraph_api-0.7.91 → langgraph_api-0.7.94}/benchmark/benchmark-runners/threads_search_metadata.ts
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|