langgraph-api 0.12.0.dev19__tar.gz → 0.12.0.dev21__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.12.0.dev19 → langgraph_api-0.12.0.dev21}/PKG-INFO +1 -1
- langgraph_api-0.12.0.dev21/langgraph_api/__init__.py +1 -0
- {langgraph_api-0.12.0.dev19 → langgraph_api-0.12.0.dev21}/langgraph_api/api/assistants.py +8 -4
- {langgraph_api-0.12.0.dev19 → langgraph_api-0.12.0.dev21}/langgraph_api/api/event_streaming.py +27 -23
- {langgraph_api-0.12.0.dev19 → langgraph_api-0.12.0.dev21}/langgraph_api/api/runs.py +8 -6
- {langgraph_api-0.12.0.dev19 → langgraph_api-0.12.0.dev21}/langgraph_api/api/store.py +10 -4
- {langgraph_api-0.12.0.dev19 → langgraph_api-0.12.0.dev21}/langgraph_api/api/threads.py +11 -8
- {langgraph_api-0.12.0.dev19 → langgraph_api-0.12.0.dev21}/langgraph_api/api/ui.py +21 -14
- {langgraph_api-0.12.0.dev19 → langgraph_api-0.12.0.dev21}/langgraph_api/config/__init__.py +14 -2
- {langgraph_api-0.12.0.dev19 → langgraph_api-0.12.0.dev21}/langgraph_api/event_streaming/service.py +11 -5
- {langgraph_api-0.12.0.dev19 → langgraph_api-0.12.0.dev21}/langgraph_api/js/client.http.mts +2 -1
- {langgraph_api-0.12.0.dev19 → langgraph_api-0.12.0.dev21}/langgraph_api/js/client.mts +3 -2
- {langgraph_api-0.12.0.dev19 → langgraph_api-0.12.0.dev21}/langgraph_api/js/remote.py +43 -3
- {langgraph_api-0.12.0.dev19 → langgraph_api-0.12.0.dev21}/langgraph_api/metrics_otlp.py +20 -1
- {langgraph_api-0.12.0.dev19 → langgraph_api-0.12.0.dev21}/langgraph_api/release_tags.py +10 -0
- {langgraph_api-0.12.0.dev19 → langgraph_api-0.12.0.dev21}/langgraph_api/worker.py +9 -4
- {langgraph_api-0.12.0.dev19 → langgraph_api-0.12.0.dev21}/uv.lock +1 -1
- langgraph_api-0.12.0.dev19/langgraph_api/__init__.py +0 -1
- {langgraph_api-0.12.0.dev19 → langgraph_api-0.12.0.dev21}/.gitignore +0 -0
- {langgraph_api-0.12.0.dev19 → langgraph_api-0.12.0.dev21}/LICENSE +0 -0
- {langgraph_api-0.12.0.dev19 → langgraph_api-0.12.0.dev21}/Makefile +0 -0
- {langgraph_api-0.12.0.dev19 → langgraph_api-0.12.0.dev21}/README.md +0 -0
- {langgraph_api-0.12.0.dev19 → langgraph_api-0.12.0.dev21}/benchmark/.gitignore +0 -0
- {langgraph_api-0.12.0.dev19 → langgraph_api-0.12.0.dev21}/benchmark/Makefile +0 -0
- {langgraph_api-0.12.0.dev19 → langgraph_api-0.12.0.dev21}/benchmark/README.md +0 -0
- {langgraph_api-0.12.0.dev19 → langgraph_api-0.12.0.dev21}/benchmark/benchmark-runners/assistant.ts +0 -0
- {langgraph_api-0.12.0.dev19 → langgraph_api-0.12.0.dev21}/benchmark/benchmark-runners/benchmark-runner.ts +0 -0
- {langgraph_api-0.12.0.dev19 → langgraph_api-0.12.0.dev21}/benchmark/benchmark-runners/benchmark_profiles.ts +0 -0
- {langgraph_api-0.12.0.dev19 → langgraph_api-0.12.0.dev21}/benchmark/benchmark-runners/benchmarks.ts +0 -0
- {langgraph_api-0.12.0.dev19 → langgraph_api-0.12.0.dev21}/benchmark/benchmark-runners/cancel_first_second_completes.ts +0 -0
- {langgraph_api-0.12.0.dev19 → langgraph_api-0.12.0.dev21}/benchmark/benchmark-runners/enqueued_runs_order.ts +0 -0
- {langgraph_api-0.12.0.dev19 → langgraph_api-0.12.0.dev21}/benchmark/benchmark-runners/log-failure.ts +0 -0
- {langgraph_api-0.12.0.dev19 → langgraph_api-0.12.0.dev21}/benchmark/benchmark-runners/meta_workload.ts +0 -0
- {langgraph_api-0.12.0.dev19 → langgraph_api-0.12.0.dev21}/benchmark/benchmark-runners/stream_write.ts +0 -0
- {langgraph_api-0.12.0.dev19 → langgraph_api-0.12.0.dev21}/benchmark/benchmark-runners/thread.ts +0 -0
- {langgraph_api-0.12.0.dev19 → langgraph_api-0.12.0.dev21}/benchmark/benchmark-runners/thread_runs_metadata_search.ts +0 -0
- {langgraph_api-0.12.0.dev19 → langgraph_api-0.12.0.dev21}/benchmark/benchmark-runners/threads_search_metadata.ts +0 -0
- {langgraph_api-0.12.0.dev19 → langgraph_api-0.12.0.dev21}/benchmark/benchmark-runners/types.ts +0 -0
- {langgraph_api-0.12.0.dev19 → langgraph_api-0.12.0.dev21}/benchmark/benchmark-runners/wait_write.ts +0 -0
- {langgraph_api-0.12.0.dev19 → langgraph_api-0.12.0.dev21}/benchmark/clean-cli.js +0 -0
- {langgraph_api-0.12.0.dev19 → langgraph_api-0.12.0.dev21}/benchmark/clean.js +0 -0
- {langgraph_api-0.12.0.dev19 → langgraph_api-0.12.0.dev21}/benchmark/continuous/README.md +0 -0
- {langgraph_api-0.12.0.dev19 → langgraph_api-0.12.0.dev21}/benchmark/continuous/pyproject.toml +0 -0
- {langgraph_api-0.12.0.dev19 → langgraph_api-0.12.0.dev21}/benchmark/continuous/runner.py +0 -0
- {langgraph_api-0.12.0.dev19 → langgraph_api-0.12.0.dev21}/benchmark/continuous/uv.lock +0 -0
- {langgraph_api-0.12.0.dev19 → langgraph_api-0.12.0.dev21}/benchmark/graphs.js +0 -0
- {langgraph_api-0.12.0.dev19 → langgraph_api-0.12.0.dev21}/benchmark/package.json +0 -0
- {langgraph_api-0.12.0.dev19 → langgraph_api-0.12.0.dev21}/benchmark/ramp.js +0 -0
- {langgraph_api-0.12.0.dev19 → langgraph_api-0.12.0.dev21}/benchmark/reporting/dd_reporting.py +0 -0
- {langgraph_api-0.12.0.dev19 → langgraph_api-0.12.0.dev21}/benchmark/staircase.py +0 -0
- {langgraph_api-0.12.0.dev19 → langgraph_api-0.12.0.dev21}/benchmark/staircase_step_k6.js +0 -0
- {langgraph_api-0.12.0.dev19 → langgraph_api-0.12.0.dev21}/benchmark/tsconfig.json +0 -0
- {langgraph_api-0.12.0.dev19 → langgraph_api-0.12.0.dev21}/benchmark/update-revision.js +0 -0
- {langgraph_api-0.12.0.dev19 → langgraph_api-0.12.0.dev21}/benchmark/weather.js +0 -0
- {langgraph_api-0.12.0.dev19 → langgraph_api-0.12.0.dev21}/constraints.txt +0 -0
- {langgraph_api-0.12.0.dev19 → langgraph_api-0.12.0.dev21}/custom_store.sql +0 -0
- {langgraph_api-0.12.0.dev19 → langgraph_api-0.12.0.dev21}/forbidden.txt +0 -0
- {langgraph_api-0.12.0.dev19 → langgraph_api-0.12.0.dev21}/hatch_build.py +0 -0
- {langgraph_api-0.12.0.dev19 → langgraph_api-0.12.0.dev21}/healthcheck.py +0 -0
- {langgraph_api-0.12.0.dev19 → langgraph_api-0.12.0.dev21}/langgraph-cloud-debugging-20260210132856.zip +0 -0
- {langgraph_api-0.12.0.dev19 → langgraph_api-0.12.0.dev21}/langgraph_api/_checkpointer/__init__.py +0 -0
- {langgraph_api-0.12.0.dev19 → langgraph_api-0.12.0.dev21}/langgraph_api/_checkpointer/_adapter.py +0 -0
- {langgraph_api-0.12.0.dev19 → langgraph_api-0.12.0.dev21}/langgraph_api/_checkpointer/protocol.py +0 -0
- {langgraph_api-0.12.0.dev19 → langgraph_api-0.12.0.dev21}/langgraph_api/_factory_utils.py +0 -0
- {langgraph_api-0.12.0.dev19 → langgraph_api-0.12.0.dev21}/langgraph_api/api/__init__.py +0 -0
- {langgraph_api-0.12.0.dev19 → langgraph_api-0.12.0.dev21}/langgraph_api/api/a2a.py +0 -0
- {langgraph_api-0.12.0.dev19 → langgraph_api-0.12.0.dev21}/langgraph_api/api/mcp/__init__.py +0 -0
- {langgraph_api-0.12.0.dev19 → langgraph_api-0.12.0.dev21}/langgraph_api/api/mcp/_constants.py +0 -0
- {langgraph_api-0.12.0.dev19 → langgraph_api-0.12.0.dev21}/langgraph_api/api/mcp/_handlers.py +0 -0
- {langgraph_api-0.12.0.dev19 → langgraph_api-0.12.0.dev21}/langgraph_api/api/mcp/_models.py +0 -0
- {langgraph_api-0.12.0.dev19 → langgraph_api-0.12.0.dev21}/langgraph_api/api/mcp/_routes.py +0 -0
- {langgraph_api-0.12.0.dev19 → langgraph_api-0.12.0.dev21}/langgraph_api/api/mcp/_sanitizers.py +0 -0
- {langgraph_api-0.12.0.dev19 → langgraph_api-0.12.0.dev21}/langgraph_api/api/meta.py +0 -0
- {langgraph_api-0.12.0.dev19 → langgraph_api-0.12.0.dev21}/langgraph_api/api/openapi.py +0 -0
- {langgraph_api-0.12.0.dev19 → langgraph_api-0.12.0.dev21}/langgraph_api/api/profile.py +0 -0
- {langgraph_api-0.12.0.dev19 → langgraph_api-0.12.0.dev21}/langgraph_api/asgi_transport.py +0 -0
- {langgraph_api-0.12.0.dev19 → langgraph_api-0.12.0.dev21}/langgraph_api/asyncio.py +0 -0
- {langgraph_api-0.12.0.dev19 → langgraph_api-0.12.0.dev21}/langgraph_api/auth/__init__.py +0 -0
- {langgraph_api-0.12.0.dev19 → langgraph_api-0.12.0.dev21}/langgraph_api/auth/custom.py +0 -0
- {langgraph_api-0.12.0.dev19 → langgraph_api-0.12.0.dev21}/langgraph_api/auth/errors.py +0 -0
- {langgraph_api-0.12.0.dev19 → langgraph_api-0.12.0.dev21}/langgraph_api/auth/langsmith/__init__.py +0 -0
- {langgraph_api-0.12.0.dev19 → langgraph_api-0.12.0.dev21}/langgraph_api/auth/langsmith/backend.py +0 -0
- {langgraph_api-0.12.0.dev19 → langgraph_api-0.12.0.dev21}/langgraph_api/auth/langsmith/client.py +0 -0
- {langgraph_api-0.12.0.dev19 → langgraph_api-0.12.0.dev21}/langgraph_api/auth/middleware.py +0 -0
- {langgraph_api-0.12.0.dev19 → langgraph_api-0.12.0.dev21}/langgraph_api/auth/noop.py +0 -0
- {langgraph_api-0.12.0.dev19 → langgraph_api-0.12.0.dev21}/langgraph_api/auth/studio_user.py +0 -0
- {langgraph_api-0.12.0.dev19 → langgraph_api-0.12.0.dev21}/langgraph_api/cache.py +0 -0
- {langgraph_api-0.12.0.dev19 → langgraph_api-0.12.0.dev21}/langgraph_api/cli.py +0 -0
- {langgraph_api-0.12.0.dev19 → langgraph_api-0.12.0.dev21}/langgraph_api/command.py +0 -0
- {langgraph_api-0.12.0.dev19 → langgraph_api-0.12.0.dev21}/langgraph_api/config/_parse.py +0 -0
- {langgraph_api-0.12.0.dev19 → langgraph_api-0.12.0.dev21}/langgraph_api/config/schemas.py +0 -0
- {langgraph_api-0.12.0.dev19 → langgraph_api-0.12.0.dev21}/langgraph_api/cron_scheduler.py +0 -0
- {langgraph_api-0.12.0.dev19 → langgraph_api-0.12.0.dev21}/langgraph_api/encryption/__init__.py +0 -0
- {langgraph_api-0.12.0.dev19 → langgraph_api-0.12.0.dev21}/langgraph_api/encryption/aes_json.py +0 -0
- {langgraph_api-0.12.0.dev19 → langgraph_api-0.12.0.dev21}/langgraph_api/encryption/context.py +0 -0
- {langgraph_api-0.12.0.dev19 → langgraph_api-0.12.0.dev21}/langgraph_api/encryption/custom.py +0 -0
- {langgraph_api-0.12.0.dev19 → langgraph_api-0.12.0.dev21}/langgraph_api/encryption/middleware.py +0 -0
- {langgraph_api-0.12.0.dev19 → langgraph_api-0.12.0.dev21}/langgraph_api/encryption/shared.py +0 -0
- {langgraph_api-0.12.0.dev19 → langgraph_api-0.12.0.dev21}/langgraph_api/errors.py +0 -0
- {langgraph_api-0.12.0.dev19 → langgraph_api-0.12.0.dev21}/langgraph_api/event_streaming/__init__.py +0 -0
- {langgraph_api-0.12.0.dev19 → langgraph_api-0.12.0.dev21}/langgraph_api/event_streaming/capabilities.py +0 -0
- {langgraph_api-0.12.0.dev19 → langgraph_api-0.12.0.dev21}/langgraph_api/event_streaming/constants.py +0 -0
- {langgraph_api-0.12.0.dev19 → langgraph_api-0.12.0.dev21}/langgraph_api/event_streaming/event_normalizers.py +0 -0
- {langgraph_api-0.12.0.dev19 → langgraph_api-0.12.0.dev21}/langgraph_api/event_streaming/namespace.py +0 -0
- {langgraph_api-0.12.0.dev19 → langgraph_api-0.12.0.dev21}/langgraph_api/event_streaming/session.py +0 -0
- {langgraph_api-0.12.0.dev19 → langgraph_api-0.12.0.dev21}/langgraph_api/event_streaming/state_normalizers.py +0 -0
- {langgraph_api-0.12.0.dev19 → langgraph_api-0.12.0.dev21}/langgraph_api/event_streaming/types.py +0 -0
- {langgraph_api-0.12.0.dev19 → langgraph_api-0.12.0.dev21}/langgraph_api/feature_flags.py +0 -0
- {langgraph_api-0.12.0.dev19 → langgraph_api-0.12.0.dev21}/langgraph_api/graph.py +0 -0
- {langgraph_api-0.12.0.dev19 → langgraph_api-0.12.0.dev21}/langgraph_api/grpc/__init__.py +0 -0
- {langgraph_api-0.12.0.dev19 → langgraph_api-0.12.0.dev21}/langgraph_api/grpc/client.py +0 -0
- {langgraph_api-0.12.0.dev19 → langgraph_api-0.12.0.dev21}/langgraph_api/grpc/generated/core_api_pb2.pyi +0 -0
- {langgraph_api-0.12.0.dev19 → langgraph_api-0.12.0.dev21}/langgraph_api/grpc/ops/__init__.py +0 -0
- {langgraph_api-0.12.0.dev19 → langgraph_api-0.12.0.dev21}/langgraph_api/grpc/ops/assistants.py +0 -0
- {langgraph_api-0.12.0.dev19 → langgraph_api-0.12.0.dev21}/langgraph_api/grpc/ops/cache.py +0 -0
- {langgraph_api-0.12.0.dev19 → langgraph_api-0.12.0.dev21}/langgraph_api/grpc/ops/crons.py +0 -0
- {langgraph_api-0.12.0.dev19 → langgraph_api-0.12.0.dev21}/langgraph_api/grpc/ops/runs.py +0 -0
- {langgraph_api-0.12.0.dev19 → langgraph_api-0.12.0.dev21}/langgraph_api/grpc/ops/threads.py +0 -0
- {langgraph_api-0.12.0.dev19 → langgraph_api-0.12.0.dev21}/langgraph_api/grpc/server.py +0 -0
- {langgraph_api-0.12.0.dev19 → langgraph_api-0.12.0.dev21}/langgraph_api/grpc/servicers/__init__.py +0 -0
- {langgraph_api-0.12.0.dev19 → langgraph_api-0.12.0.dev21}/langgraph_api/grpc/servicers/checkpointer.py +0 -0
- {langgraph_api-0.12.0.dev19 → langgraph_api-0.12.0.dev21}/langgraph_api/grpc/servicers/encryption.py +0 -0
- {langgraph_api-0.12.0.dev19 → langgraph_api-0.12.0.dev21}/langgraph_api/http.py +0 -0
- {langgraph_api-0.12.0.dev19 → langgraph_api-0.12.0.dev21}/langgraph_api/http_metrics.py +0 -0
- {langgraph_api-0.12.0.dev19 → langgraph_api-0.12.0.dev21}/langgraph_api/http_metrics_utils.py +0 -0
- {langgraph_api-0.12.0.dev19 → langgraph_api-0.12.0.dev21}/langgraph_api/js/.gitignore +0 -0
- {langgraph_api-0.12.0.dev19 → langgraph_api-0.12.0.dev21}/langgraph_api/js/.prettierrc +0 -0
- {langgraph_api-0.12.0.dev19 → langgraph_api-0.12.0.dev21}/langgraph_api/js/__init__.py +0 -0
- {langgraph_api-0.12.0.dev19 → langgraph_api-0.12.0.dev21}/langgraph_api/js/base.py +0 -0
- {langgraph_api-0.12.0.dev19 → langgraph_api-0.12.0.dev21}/langgraph_api/js/build.mts +0 -0
- {langgraph_api-0.12.0.dev19 → langgraph_api-0.12.0.dev21}/langgraph_api/js/errors.py +0 -0
- {langgraph_api-0.12.0.dev19 → langgraph_api-0.12.0.dev21}/langgraph_api/js/global.d.ts +0 -0
- {langgraph_api-0.12.0.dev19 → langgraph_api-0.12.0.dev21}/langgraph_api/js/package.json +0 -0
- {langgraph_api-0.12.0.dev19 → langgraph_api-0.12.0.dev21}/langgraph_api/js/schema.py +0 -0
- {langgraph_api-0.12.0.dev19 → langgraph_api-0.12.0.dev21}/langgraph_api/js/src/graph.mts +0 -0
- {langgraph_api-0.12.0.dev19 → langgraph_api-0.12.0.dev21}/langgraph_api/js/src/load.hooks.mjs +0 -0
- {langgraph_api-0.12.0.dev19 → langgraph_api-0.12.0.dev21}/langgraph_api/js/src/preload.mjs +0 -0
- {langgraph_api-0.12.0.dev19 → langgraph_api-0.12.0.dev21}/langgraph_api/js/src/utils/experiment-tracing.mts +0 -0
- {langgraph_api-0.12.0.dev19 → langgraph_api-0.12.0.dev21}/langgraph_api/js/src/utils/files.mts +0 -0
- {langgraph_api-0.12.0.dev19 → langgraph_api-0.12.0.dev21}/langgraph_api/js/src/utils/importMap.mts +0 -0
- {langgraph_api-0.12.0.dev19 → langgraph_api-0.12.0.dev21}/langgraph_api/js/src/utils/pythonSchemas.mts +0 -0
- {langgraph_api-0.12.0.dev19 → langgraph_api-0.12.0.dev21}/langgraph_api/js/src/utils/serde.mts +0 -0
- {langgraph_api-0.12.0.dev19 → langgraph_api-0.12.0.dev21}/langgraph_api/js/sse.py +0 -0
- {langgraph_api-0.12.0.dev19 → langgraph_api-0.12.0.dev21}/langgraph_api/js/traceblock.mts +0 -0
- {langgraph_api-0.12.0.dev19 → langgraph_api-0.12.0.dev21}/langgraph_api/js/tsconfig.json +0 -0
- {langgraph_api-0.12.0.dev19 → langgraph_api-0.12.0.dev21}/langgraph_api/js/ui.py +0 -0
- {langgraph_api-0.12.0.dev19 → langgraph_api-0.12.0.dev21}/langgraph_api/js/yarn.lock +0 -0
- {langgraph_api-0.12.0.dev19 → langgraph_api-0.12.0.dev21}/langgraph_api/lc_security/__init__.py +0 -0
- {langgraph_api-0.12.0.dev19 → langgraph_api-0.12.0.dev21}/langgraph_api/lc_security/exceptions.py +0 -0
- {langgraph_api-0.12.0.dev19 → langgraph_api-0.12.0.dev21}/langgraph_api/lc_security/policy.py +0 -0
- {langgraph_api-0.12.0.dev19 → langgraph_api-0.12.0.dev21}/langgraph_api/lc_security/transport.py +0 -0
- {langgraph_api-0.12.0.dev19 → langgraph_api-0.12.0.dev21}/langgraph_api/logging.py +0 -0
- {langgraph_api-0.12.0.dev19 → langgraph_api-0.12.0.dev21}/langgraph_api/metadata.py +0 -0
- {langgraph_api-0.12.0.dev19 → langgraph_api-0.12.0.dev21}/langgraph_api/metrics_collector.py +0 -0
- {langgraph_api-0.12.0.dev19 → langgraph_api-0.12.0.dev21}/langgraph_api/middleware/__init__.py +0 -0
- {langgraph_api-0.12.0.dev19 → langgraph_api-0.12.0.dev21}/langgraph_api/middleware/ensure_store.py +0 -0
- {langgraph_api-0.12.0.dev19 → langgraph_api-0.12.0.dev21}/langgraph_api/middleware/http_logger.py +0 -0
- {langgraph_api-0.12.0.dev19 → langgraph_api-0.12.0.dev21}/langgraph_api/middleware/private_network.py +0 -0
- {langgraph_api-0.12.0.dev19 → langgraph_api-0.12.0.dev21}/langgraph_api/middleware/request_id.py +0 -0
- {langgraph_api-0.12.0.dev19 → langgraph_api-0.12.0.dev21}/langgraph_api/models/__init__.py +0 -0
- {langgraph_api-0.12.0.dev19 → langgraph_api-0.12.0.dev21}/langgraph_api/models/run.py +0 -0
- {langgraph_api-0.12.0.dev19 → langgraph_api-0.12.0.dev21}/langgraph_api/otel_context.py +0 -0
- {langgraph_api-0.12.0.dev19 → langgraph_api-0.12.0.dev21}/langgraph_api/patch.py +0 -0
- {langgraph_api-0.12.0.dev19 → langgraph_api-0.12.0.dev21}/langgraph_api/queue_entrypoint.py +0 -0
- {langgraph_api-0.12.0.dev19 → langgraph_api-0.12.0.dev21}/langgraph_api/route.py +0 -0
- {langgraph_api-0.12.0.dev19 → langgraph_api-0.12.0.dev21}/langgraph_api/schema.py +0 -0
- {langgraph_api-0.12.0.dev19 → langgraph_api-0.12.0.dev21}/langgraph_api/self_hosted_logs.py +0 -0
- {langgraph_api-0.12.0.dev19 → langgraph_api-0.12.0.dev21}/langgraph_api/self_hosted_metrics.py +0 -0
- {langgraph_api-0.12.0.dev19 → langgraph_api-0.12.0.dev21}/langgraph_api/serde.py +0 -0
- {langgraph_api-0.12.0.dev19 → langgraph_api-0.12.0.dev21}/langgraph_api/server.py +0 -0
- {langgraph_api-0.12.0.dev19 → langgraph_api-0.12.0.dev21}/langgraph_api/sse.py +0 -0
- {langgraph_api-0.12.0.dev19 → langgraph_api-0.12.0.dev21}/langgraph_api/state.py +0 -0
- {langgraph_api-0.12.0.dev19 → langgraph_api-0.12.0.dev21}/langgraph_api/store.py +0 -0
- {langgraph_api-0.12.0.dev19 → langgraph_api-0.12.0.dev21}/langgraph_api/stream.py +0 -0
- {langgraph_api-0.12.0.dev19 → langgraph_api-0.12.0.dev21}/langgraph_api/stream_v2.py +0 -0
- {langgraph_api-0.12.0.dev19 → langgraph_api-0.12.0.dev21}/langgraph_api/timing/__init__.py +0 -0
- {langgraph_api-0.12.0.dev19 → langgraph_api-0.12.0.dev21}/langgraph_api/timing/profiler.py +0 -0
- {langgraph_api-0.12.0.dev19 → langgraph_api-0.12.0.dev21}/langgraph_api/timing/timer.py +0 -0
- {langgraph_api-0.12.0.dev19 → langgraph_api-0.12.0.dev21}/langgraph_api/traceblock.py +0 -0
- {langgraph_api-0.12.0.dev19 → langgraph_api-0.12.0.dev21}/langgraph_api/tracing_session.py +0 -0
- {langgraph_api-0.12.0.dev19 → langgraph_api-0.12.0.dev21}/langgraph_api/tunneling/cloudflare.py +0 -0
- {langgraph_api-0.12.0.dev19 → langgraph_api-0.12.0.dev21}/langgraph_api/utils/__init__.py +0 -0
- {langgraph_api-0.12.0.dev19 → langgraph_api-0.12.0.dev21}/langgraph_api/utils/cache.py +0 -0
- {langgraph_api-0.12.0.dev19 → langgraph_api-0.12.0.dev21}/langgraph_api/utils/config.py +0 -0
- {langgraph_api-0.12.0.dev19 → langgraph_api-0.12.0.dev21}/langgraph_api/utils/errors.py +0 -0
- {langgraph_api-0.12.0.dev19 → langgraph_api-0.12.0.dev21}/langgraph_api/utils/extract.py +0 -0
- {langgraph_api-0.12.0.dev19 → langgraph_api-0.12.0.dev21}/langgraph_api/utils/future.py +0 -0
- {langgraph_api-0.12.0.dev19 → langgraph_api-0.12.0.dev21}/langgraph_api/utils/headers.py +0 -0
- {langgraph_api-0.12.0.dev19 → langgraph_api-0.12.0.dev21}/langgraph_api/utils/network.py +0 -0
- {langgraph_api-0.12.0.dev19 → langgraph_api-0.12.0.dev21}/langgraph_api/utils/retriable_client.py +0 -0
- {langgraph_api-0.12.0.dev19 → langgraph_api-0.12.0.dev21}/langgraph_api/utils/stream_codec.py +0 -0
- {langgraph_api-0.12.0.dev19 → langgraph_api-0.12.0.dev21}/langgraph_api/utils/uuids.py +0 -0
- {langgraph_api-0.12.0.dev19 → langgraph_api-0.12.0.dev21}/langgraph_api/validation.py +0 -0
- {langgraph_api-0.12.0.dev19 → langgraph_api-0.12.0.dev21}/langgraph_api/webhook.py +0 -0
- {langgraph_api-0.12.0.dev19 → langgraph_api-0.12.0.dev21}/langgraph_grpc_common/__init__.py +0 -0
- {langgraph_api-0.12.0.dev19 → langgraph_api-0.12.0.dev21}/langgraph_grpc_common/checkpointer.py +0 -0
- {langgraph_api-0.12.0.dev19 → langgraph_api-0.12.0.dev21}/langgraph_grpc_common/conversion/__init__.py +0 -0
- {langgraph_api-0.12.0.dev19 → langgraph_api-0.12.0.dev21}/langgraph_grpc_common/conversion/_compat.py +0 -0
- {langgraph_api-0.12.0.dev19 → langgraph_api-0.12.0.dev21}/langgraph_grpc_common/conversion/checkpoint.py +0 -0
- {langgraph_api-0.12.0.dev19 → langgraph_api-0.12.0.dev21}/langgraph_grpc_common/conversion/config.py +0 -0
- {langgraph_api-0.12.0.dev19 → langgraph_api-0.12.0.dev21}/langgraph_grpc_common/conversion/durability.py +0 -0
- {langgraph_api-0.12.0.dev19 → langgraph_api-0.12.0.dev21}/langgraph_grpc_common/conversion/store.py +0 -0
- {langgraph_api-0.12.0.dev19 → langgraph_api-0.12.0.dev21}/langgraph_grpc_common/conversion/struct.py +0 -0
- {langgraph_api-0.12.0.dev19 → langgraph_api-0.12.0.dev21}/langgraph_grpc_common/conversion/value.py +0 -0
- {langgraph_api-0.12.0.dev19 → langgraph_api-0.12.0.dev21}/langgraph_grpc_common/proto/__init__.py +0 -0
- {langgraph_api-0.12.0.dev19 → langgraph_api-0.12.0.dev21}/langgraph_grpc_common/proto/checkpointer_pb2.py +0 -0
- {langgraph_api-0.12.0.dev19 → langgraph_api-0.12.0.dev21}/langgraph_grpc_common/proto/checkpointer_pb2.pyi +0 -0
- {langgraph_api-0.12.0.dev19 → langgraph_api-0.12.0.dev21}/langgraph_grpc_common/proto/checkpointer_pb2_grpc.py +0 -0
- {langgraph_api-0.12.0.dev19 → langgraph_api-0.12.0.dev21}/langgraph_grpc_common/proto/checkpointer_pb2_grpc.pyi +0 -0
- {langgraph_api-0.12.0.dev19 → langgraph_api-0.12.0.dev21}/langgraph_grpc_common/proto/core_api_pb2.py +0 -0
- {langgraph_api-0.12.0.dev19 → langgraph_api-0.12.0.dev21}/langgraph_grpc_common/proto/core_api_pb2.pyi +0 -0
- {langgraph_api-0.12.0.dev19 → langgraph_api-0.12.0.dev21}/langgraph_grpc_common/proto/core_api_pb2_grpc.py +0 -0
- {langgraph_api-0.12.0.dev19 → langgraph_api-0.12.0.dev21}/langgraph_grpc_common/proto/core_api_pb2_grpc.pyi +0 -0
- {langgraph_api-0.12.0.dev19 → langgraph_api-0.12.0.dev21}/langgraph_grpc_common/proto/encryption_pb2.py +0 -0
- {langgraph_api-0.12.0.dev19 → langgraph_api-0.12.0.dev21}/langgraph_grpc_common/proto/encryption_pb2.pyi +0 -0
- {langgraph_api-0.12.0.dev19 → langgraph_api-0.12.0.dev21}/langgraph_grpc_common/proto/encryption_pb2_grpc.py +0 -0
- {langgraph_api-0.12.0.dev19 → langgraph_api-0.12.0.dev21}/langgraph_grpc_common/proto/encryption_pb2_grpc.pyi +0 -0
- {langgraph_api-0.12.0.dev19 → langgraph_api-0.12.0.dev21}/langgraph_grpc_common/proto/engine_common_pb2.py +0 -0
- {langgraph_api-0.12.0.dev19 → langgraph_api-0.12.0.dev21}/langgraph_grpc_common/proto/engine_common_pb2.pyi +0 -0
- {langgraph_api-0.12.0.dev19 → langgraph_api-0.12.0.dev21}/langgraph_grpc_common/proto/engine_common_pb2_grpc.py +0 -0
- {langgraph_api-0.12.0.dev19 → langgraph_api-0.12.0.dev21}/langgraph_grpc_common/proto/engine_common_pb2_grpc.pyi +0 -0
- {langgraph_api-0.12.0.dev19 → langgraph_api-0.12.0.dev21}/langgraph_grpc_common/proto/enum_cancel_run_action_pb2.py +0 -0
- {langgraph_api-0.12.0.dev19 → langgraph_api-0.12.0.dev21}/langgraph_grpc_common/proto/enum_cancel_run_action_pb2.pyi +0 -0
- {langgraph_api-0.12.0.dev19 → langgraph_api-0.12.0.dev21}/langgraph_grpc_common/proto/enum_cancel_run_action_pb2_grpc.py +0 -0
- {langgraph_api-0.12.0.dev19 → langgraph_api-0.12.0.dev21}/langgraph_grpc_common/proto/enum_cancel_run_action_pb2_grpc.pyi +0 -0
- {langgraph_api-0.12.0.dev19 → langgraph_api-0.12.0.dev21}/langgraph_grpc_common/proto/enum_control_signal_pb2.py +0 -0
- {langgraph_api-0.12.0.dev19 → langgraph_api-0.12.0.dev21}/langgraph_grpc_common/proto/enum_control_signal_pb2.pyi +0 -0
- {langgraph_api-0.12.0.dev19 → langgraph_api-0.12.0.dev21}/langgraph_grpc_common/proto/enum_control_signal_pb2_grpc.py +0 -0
- {langgraph_api-0.12.0.dev19 → langgraph_api-0.12.0.dev21}/langgraph_grpc_common/proto/enum_control_signal_pb2_grpc.pyi +0 -0
- {langgraph_api-0.12.0.dev19 → langgraph_api-0.12.0.dev21}/langgraph_grpc_common/proto/enum_cron_on_run_completed_pb2.py +0 -0
- {langgraph_api-0.12.0.dev19 → langgraph_api-0.12.0.dev21}/langgraph_grpc_common/proto/enum_cron_on_run_completed_pb2.pyi +0 -0
- {langgraph_api-0.12.0.dev19 → langgraph_api-0.12.0.dev21}/langgraph_grpc_common/proto/enum_cron_on_run_completed_pb2_grpc.py +0 -0
- {langgraph_api-0.12.0.dev19 → langgraph_api-0.12.0.dev21}/langgraph_grpc_common/proto/enum_cron_on_run_completed_pb2_grpc.pyi +0 -0
- {langgraph_api-0.12.0.dev19 → langgraph_api-0.12.0.dev21}/langgraph_grpc_common/proto/enum_durability_pb2.py +0 -0
- {langgraph_api-0.12.0.dev19 → langgraph_api-0.12.0.dev21}/langgraph_grpc_common/proto/enum_durability_pb2.pyi +0 -0
- {langgraph_api-0.12.0.dev19 → langgraph_api-0.12.0.dev21}/langgraph_grpc_common/proto/enum_durability_pb2_grpc.py +0 -0
- {langgraph_api-0.12.0.dev19 → langgraph_api-0.12.0.dev21}/langgraph_grpc_common/proto/enum_durability_pb2_grpc.pyi +0 -0
- {langgraph_api-0.12.0.dev19 → langgraph_api-0.12.0.dev21}/langgraph_grpc_common/proto/enum_multitask_strategy_pb2.py +0 -0
- {langgraph_api-0.12.0.dev19 → langgraph_api-0.12.0.dev21}/langgraph_grpc_common/proto/enum_multitask_strategy_pb2.pyi +0 -0
- {langgraph_api-0.12.0.dev19 → langgraph_api-0.12.0.dev21}/langgraph_grpc_common/proto/enum_multitask_strategy_pb2_grpc.py +0 -0
- {langgraph_api-0.12.0.dev19 → langgraph_api-0.12.0.dev21}/langgraph_grpc_common/proto/enum_multitask_strategy_pb2_grpc.pyi +0 -0
- {langgraph_api-0.12.0.dev19 → langgraph_api-0.12.0.dev21}/langgraph_grpc_common/proto/enum_run_status_pb2.py +0 -0
- {langgraph_api-0.12.0.dev19 → langgraph_api-0.12.0.dev21}/langgraph_grpc_common/proto/enum_run_status_pb2.pyi +0 -0
- {langgraph_api-0.12.0.dev19 → langgraph_api-0.12.0.dev21}/langgraph_grpc_common/proto/enum_run_status_pb2_grpc.py +0 -0
- {langgraph_api-0.12.0.dev19 → langgraph_api-0.12.0.dev21}/langgraph_grpc_common/proto/enum_run_status_pb2_grpc.pyi +0 -0
- {langgraph_api-0.12.0.dev19 → langgraph_api-0.12.0.dev21}/langgraph_grpc_common/proto/enum_stream_mode_pb2.py +0 -0
- {langgraph_api-0.12.0.dev19 → langgraph_api-0.12.0.dev21}/langgraph_grpc_common/proto/enum_stream_mode_pb2.pyi +0 -0
- {langgraph_api-0.12.0.dev19 → langgraph_api-0.12.0.dev21}/langgraph_grpc_common/proto/enum_stream_mode_pb2_grpc.py +0 -0
- {langgraph_api-0.12.0.dev19 → langgraph_api-0.12.0.dev21}/langgraph_grpc_common/proto/enum_stream_mode_pb2_grpc.pyi +0 -0
- {langgraph_api-0.12.0.dev19 → langgraph_api-0.12.0.dev21}/langgraph_grpc_common/proto/enum_thread_status_pb2.py +0 -0
- {langgraph_api-0.12.0.dev19 → langgraph_api-0.12.0.dev21}/langgraph_grpc_common/proto/enum_thread_status_pb2.pyi +0 -0
- {langgraph_api-0.12.0.dev19 → langgraph_api-0.12.0.dev21}/langgraph_grpc_common/proto/enum_thread_status_pb2_grpc.py +0 -0
- {langgraph_api-0.12.0.dev19 → langgraph_api-0.12.0.dev21}/langgraph_grpc_common/proto/enum_thread_status_pb2_grpc.pyi +0 -0
- {langgraph_api-0.12.0.dev19 → langgraph_api-0.12.0.dev21}/langgraph_grpc_common/proto/enum_thread_stream_mode_pb2.py +0 -0
- {langgraph_api-0.12.0.dev19 → langgraph_api-0.12.0.dev21}/langgraph_grpc_common/proto/enum_thread_stream_mode_pb2.pyi +0 -0
- {langgraph_api-0.12.0.dev19 → langgraph_api-0.12.0.dev21}/langgraph_grpc_common/proto/enum_thread_stream_mode_pb2_grpc.py +0 -0
- {langgraph_api-0.12.0.dev19 → langgraph_api-0.12.0.dev21}/langgraph_grpc_common/proto/enum_thread_stream_mode_pb2_grpc.pyi +0 -0
- {langgraph_api-0.12.0.dev19 → langgraph_api-0.12.0.dev21}/langgraph_grpc_common/proto/errors_pb2.py +0 -0
- {langgraph_api-0.12.0.dev19 → langgraph_api-0.12.0.dev21}/langgraph_grpc_common/proto/errors_pb2.pyi +0 -0
- {langgraph_api-0.12.0.dev19 → langgraph_api-0.12.0.dev21}/langgraph_grpc_common/proto/errors_pb2_grpc.py +0 -0
- {langgraph_api-0.12.0.dev19 → langgraph_api-0.12.0.dev21}/langgraph_grpc_common/proto/errors_pb2_grpc.pyi +0 -0
- {langgraph_api-0.12.0.dev19 → langgraph_api-0.12.0.dev21}/langgraph_grpc_common/proto/store_pb2.py +0 -0
- {langgraph_api-0.12.0.dev19 → langgraph_api-0.12.0.dev21}/langgraph_grpc_common/proto/store_pb2.pyi +0 -0
- {langgraph_api-0.12.0.dev19 → langgraph_api-0.12.0.dev21}/langgraph_grpc_common/proto/store_pb2_grpc.py +0 -0
- {langgraph_api-0.12.0.dev19 → langgraph_api-0.12.0.dev21}/langgraph_grpc_common/proto/store_pb2_grpc.pyi +0 -0
- {langgraph_api-0.12.0.dev19 → langgraph_api-0.12.0.dev21}/langgraph_grpc_common/serde.py +0 -0
- {langgraph_api-0.12.0.dev19 → langgraph_api-0.12.0.dev21}/langgraph_grpc_common/store.py +0 -0
- {langgraph_api-0.12.0.dev19 → langgraph_api-0.12.0.dev21}/langgraph_license/__init__.py +0 -0
- {langgraph_api-0.12.0.dev19 → langgraph_api-0.12.0.dev21}/langgraph_license/validation.py +0 -0
- {langgraph_api-0.12.0.dev19 → langgraph_api-0.12.0.dev21}/langgraph_runtime/__init__.py +0 -0
- {langgraph_api-0.12.0.dev19 → langgraph_api-0.12.0.dev21}/langgraph_runtime/checkpoint.py +0 -0
- {langgraph_api-0.12.0.dev19 → langgraph_api-0.12.0.dev21}/langgraph_runtime/database.py +0 -0
- {langgraph_api-0.12.0.dev19 → langgraph_api-0.12.0.dev21}/langgraph_runtime/lifespan.py +0 -0
- {langgraph_api-0.12.0.dev19 → langgraph_api-0.12.0.dev21}/langgraph_runtime/metrics.py +0 -0
- {langgraph_api-0.12.0.dev19 → langgraph_api-0.12.0.dev21}/langgraph_runtime/ops.py +0 -0
- {langgraph_api-0.12.0.dev19 → langgraph_api-0.12.0.dev21}/langgraph_runtime/queue.py +0 -0
- {langgraph_api-0.12.0.dev19 → langgraph_api-0.12.0.dev21}/langgraph_runtime/retry.py +0 -0
- {langgraph_api-0.12.0.dev19 → langgraph_api-0.12.0.dev21}/langgraph_runtime/routes.py +0 -0
- {langgraph_api-0.12.0.dev19 → langgraph_api-0.12.0.dev21}/langgraph_runtime/store.py +0 -0
- {langgraph_api-0.12.0.dev19 → langgraph_api-0.12.0.dev21}/logging.json +0 -0
- {langgraph_api-0.12.0.dev19 → langgraph_api-0.12.0.dev21}/openapi.json +0 -0
- {langgraph_api-0.12.0.dev19 → langgraph_api-0.12.0.dev21}/pyproject.toml +0 -0
- {langgraph_api-0.12.0.dev19 → langgraph_api-0.12.0.dev21}/scripts/build_wheel.py +0 -0
- {langgraph_api-0.12.0.dev19 → langgraph_api-0.12.0.dev21}/scripts/create_license.py +0 -0
- {langgraph_api-0.12.0.dev19 → langgraph_api-0.12.0.dev21}/scripts/run_a2a_tck.py +0 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
__version__ = "0.12.0.dev21"
|
|
@@ -497,10 +497,14 @@ async def patch_assistant(
|
|
|
497
497
|
@retry_db
|
|
498
498
|
async def delete_assistant(request: ApiRequest) -> Response:
|
|
499
499
|
"""Delete an assistant by ID.
|
|
500
|
-
|
|
501
|
-
|
|
502
|
-
|
|
503
|
-
|
|
500
|
+
---
|
|
501
|
+
summary: Delete an assistant by ID.
|
|
502
|
+
description: |
|
|
503
|
+
Delete an assistant by ID.
|
|
504
|
+
|
|
505
|
+
Query params:
|
|
506
|
+
delete_threads: If "true", delete all threads where
|
|
507
|
+
metadata.assistant_id matches this assistant.
|
|
504
508
|
"""
|
|
505
509
|
assistant_id = request.path_params["assistant_id"]
|
|
506
510
|
validate_uuid(assistant_id, "Invalid assistant ID: must be a UUID")
|
{langgraph_api-0.12.0.dev19 → langgraph_api-0.12.0.dev21}/langgraph_api/api/event_streaming.py
RENAMED
|
@@ -97,25 +97,27 @@ def _make_manager(thread_id: str, send_event: Any = None) -> ThreadRunManager:
|
|
|
97
97
|
|
|
98
98
|
async def _thread_events(request: Request) -> Response:
|
|
99
99
|
"""SSE stream scoped to a thread.
|
|
100
|
+
---
|
|
101
|
+
summary: SSE stream scoped to a thread.
|
|
102
|
+
description: |
|
|
103
|
+
Body is an ``EventStreamRequest``:
|
|
100
104
|
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
connection unsubscribes. No state is persisted server-side beyond the
|
|
118
|
-
connection.
|
|
105
|
+
{
|
|
106
|
+
"channels": ["values", "messages", ...],
|
|
107
|
+
"namespaces": [["ns1"], ["ns2", "child"]], // optional
|
|
108
|
+
"depth": 2, // optional
|
|
109
|
+
"since": 42 // optional seq
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
On reconnect, clients pass the last ``seq`` they received as
|
|
113
|
+
``since`` in the body. Buffered events with ``seq > since`` are
|
|
114
|
+
replayed before the stream goes live. The endpoint is POST-only, so
|
|
115
|
+
browser-native ``EventSource`` auto-resume (``Last-Event-ID``)
|
|
116
|
+
doesn't apply — clients drive resume explicitly via the body.
|
|
117
|
+
|
|
118
|
+
The filter applies for the lifetime of the connection; closing the
|
|
119
|
+
connection unsubscribes. No state is persisted server-side beyond the
|
|
120
|
+
connection.
|
|
119
121
|
"""
|
|
120
122
|
thread_id = request.path_params["thread_id"]
|
|
121
123
|
try:
|
|
@@ -297,11 +299,13 @@ async def _thread_events(request: Request) -> Response:
|
|
|
297
299
|
|
|
298
300
|
async def _thread_command(request: Request) -> Response:
|
|
299
301
|
"""Handle a single protocol command scoped to a thread.
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
|
|
304
|
-
|
|
302
|
+
---
|
|
303
|
+
summary: Handle a single protocol command scoped to a thread.
|
|
304
|
+
description: |
|
|
305
|
+
Commands are stateless in the HTTP transport: a fresh manager is
|
|
306
|
+
created, the command is dispatched, and results are returned. For
|
|
307
|
+
``run.start`` this creates/resumes a run; subsequent event streaming
|
|
308
|
+
happens over a separate ``POST .../stream`` connection.
|
|
305
309
|
"""
|
|
306
310
|
thread_id = request.path_params["thread_id"]
|
|
307
311
|
try:
|
|
@@ -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,
|
|
@@ -35,11 +35,11 @@ def _validate_namespace(namespace: tuple[str, ...]) -> Response | None:
|
|
|
35
35
|
async def handle_event(
|
|
36
36
|
action: str,
|
|
37
37
|
value: Any,
|
|
38
|
-
) -> None:
|
|
38
|
+
) -> Auth.types.FilterType | None:
|
|
39
39
|
ctx = get_auth_ctx()
|
|
40
40
|
if not ctx:
|
|
41
|
-
return
|
|
42
|
-
await _handle_event(
|
|
41
|
+
return None
|
|
42
|
+
return await _handle_event(
|
|
43
43
|
Auth.types.AuthContext(
|
|
44
44
|
user=ctx.user,
|
|
45
45
|
permissions=ctx.permissions,
|
|
@@ -143,7 +143,13 @@ async def search_items(request: ApiRequest):
|
|
|
143
143
|
"query": query,
|
|
144
144
|
"refresh_ttl": payload.get("refresh_ttl"),
|
|
145
145
|
}
|
|
146
|
-
await handle_event("search", handler_payload)
|
|
146
|
+
auth_filter = await handle_event("search", handler_payload)
|
|
147
|
+
if auth_filter:
|
|
148
|
+
existing = handler_payload.get("filter")
|
|
149
|
+
if existing:
|
|
150
|
+
handler_payload["filter"] = {"$and": [existing, auth_filter]}
|
|
151
|
+
else:
|
|
152
|
+
handler_payload["filter"] = auth_filter
|
|
147
153
|
items = await (await get_store()).asearch(
|
|
148
154
|
handler_payload["namespace"],
|
|
149
155
|
filter=handler_payload["filter"],
|
|
@@ -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(
|
|
@@ -1,6 +1,8 @@
|
|
|
1
|
+
import html
|
|
1
2
|
import json
|
|
2
3
|
import os
|
|
3
4
|
import re
|
|
5
|
+
from urllib.parse import quote
|
|
4
6
|
|
|
5
7
|
from anyio import open_file
|
|
6
8
|
from orjson import loads
|
|
@@ -21,6 +23,16 @@ class UiSchema(TypedDict):
|
|
|
21
23
|
_UI_SCHEMAS_CACHE: dict[str, UiSchema] | None = None
|
|
22
24
|
|
|
23
25
|
|
|
26
|
+
def _quote_path_segment(value: str) -> str:
|
|
27
|
+
"""Encode a dynamic URL path segment for safe HTML attribute use."""
|
|
28
|
+
return quote(value, safe="")
|
|
29
|
+
|
|
30
|
+
|
|
31
|
+
def _html_safe_json_arg(value: object) -> str:
|
|
32
|
+
"""Serialize a value for a JavaScript argument inside an HTML attribute."""
|
|
33
|
+
return html.escape(json.dumps(value), quote=True)
|
|
34
|
+
|
|
35
|
+
|
|
24
36
|
async def load_ui_schemas() -> dict[str, UiSchema]:
|
|
25
37
|
"""Load and cache UI schema mappings from JSON file."""
|
|
26
38
|
global _UI_SCHEMAS_CACHE
|
|
@@ -40,7 +52,6 @@ async def load_ui_schemas() -> dict[str, UiSchema]:
|
|
|
40
52
|
async def handle_ui(request: ApiRequest) -> Response:
|
|
41
53
|
"""Serve UI HTML with appropriate script/style tags."""
|
|
42
54
|
graph_id = request.path_params["graph_id"]
|
|
43
|
-
host = request.headers.get("host")
|
|
44
55
|
message = await request.json(schema=None)
|
|
45
56
|
|
|
46
57
|
# Load UI file paths from schema
|
|
@@ -54,24 +65,20 @@ async def handle_ui(request: ApiRequest) -> Response:
|
|
|
54
65
|
basename = os.path.basename(filepath)
|
|
55
66
|
ext = os.path.splitext(basename)[1]
|
|
56
67
|
|
|
57
|
-
# Use http:// protocol if accessing a localhost service
|
|
58
|
-
def is_host(needle: str) -> bool:
|
|
59
|
-
if not isinstance(host, str):
|
|
60
|
-
return False
|
|
61
|
-
return host.startswith(needle + ":") or host == needle
|
|
62
|
-
|
|
63
|
-
protocol = "http:" if is_host("localhost") or is_host("127.0.0.1") else ""
|
|
64
68
|
valid_js_name = re.sub(r"[^a-zA-Z0-9]", "_", graph_id)
|
|
69
|
+
asset_url = (
|
|
70
|
+
f"/ui/{_quote_path_segment(graph_id)}/{_quote_path_segment(basename)}"
|
|
71
|
+
)
|
|
72
|
+
safe_asset_url = html.escape(asset_url, quote=True)
|
|
65
73
|
|
|
66
74
|
if ext == ".css":
|
|
67
|
-
result.append(
|
|
68
|
-
f'<link rel="stylesheet" href="{protocol}//{host}/ui/{graph_id}/{basename}" />'
|
|
69
|
-
)
|
|
75
|
+
result.append(f'<link rel="stylesheet" href="{safe_asset_url}" />')
|
|
70
76
|
elif ext == ".js":
|
|
71
|
-
safe_name =
|
|
77
|
+
safe_name = _html_safe_json_arg(message["name"])
|
|
72
78
|
result.append(
|
|
73
|
-
f'<script src="{
|
|
74
|
-
f"onload='__LGUI_{valid_js_name}.render(
|
|
79
|
+
f'<script src="{safe_asset_url}" '
|
|
80
|
+
f"onload='__LGUI_{valid_js_name}.render("
|
|
81
|
+
f'{safe_name}, "{{{{shadowRootId}}}}")\'>'
|
|
75
82
|
"</script>"
|
|
76
83
|
)
|
|
77
84
|
|
|
@@ -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)
|
|
@@ -246,6 +253,10 @@ STORE_CONFIG = env(
|
|
|
246
253
|
LANGGRAPH_STORE_BACKEND = env("LANGGRAPH_STORE_BACKEND", cast=str, default="python")
|
|
247
254
|
USE_GRPC_STORE = LANGGRAPH_STORE_BACKEND == "grpc"
|
|
248
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)
|
|
259
|
+
|
|
249
260
|
|
|
250
261
|
def _validate_mount_prefix(mount_prefix: str | None) -> str | None:
|
|
251
262
|
if not mount_prefix:
|
|
@@ -642,6 +653,7 @@ __all__ = [
|
|
|
642
653
|
"CRON_SCHEDULER_SLEEP_TIME",
|
|
643
654
|
"DATABASE_URI",
|
|
644
655
|
"DATADOG_METRICS_ENABLED",
|
|
656
|
+
"DB_MIGRATION_BY_CORE_API",
|
|
645
657
|
"EXPOSE_INTERNAL_METRICS_PROMETHEUS",
|
|
646
658
|
"FF_CRONS_ENABLED",
|
|
647
659
|
"FF_LOG_DROPPED_EVENTS",
|
{langgraph_api-0.12.0.dev19 → langgraph_api-0.12.0.dev21}/langgraph_api/event_streaming/service.py
RENAMED
|
@@ -43,7 +43,7 @@ from langgraph_api.event_streaming.session import (
|
|
|
43
43
|
_is_supported_channel,
|
|
44
44
|
)
|
|
45
45
|
from langgraph_api.event_streaming.types import Subscription
|
|
46
|
-
from langgraph_api.feature_flags import FF_V2_EVENT_STREAMING
|
|
46
|
+
from langgraph_api.feature_flags import FF_V2_EVENT_STREAMING, PREFER_GRPC_CHECKPOINTER
|
|
47
47
|
from langgraph_api.schema import MultitaskStrategy
|
|
48
48
|
|
|
49
49
|
logger = structlog.stdlib.get_logger(__name__)
|
|
@@ -623,6 +623,12 @@ class ThreadRunManager:
|
|
|
623
623
|
"no_such_interrupt",
|
|
624
624
|
"Interrupt namespace does not match the pending interrupt.",
|
|
625
625
|
)
|
|
626
|
+
# WS can surface ``input.requested`` before postgres/gRPC
|
|
627
|
+
# persists the thread-row interrupt. Reuse the HTTP settle
|
|
628
|
+
# barrier before enqueueing the resume run.
|
|
629
|
+
if not thread_state_fetched:
|
|
630
|
+
thread_state_ids = await self._collect_settled_interrupt_ids()
|
|
631
|
+
thread_state_fetched = True
|
|
626
632
|
continue
|
|
627
633
|
# HTTP fallback: the persisted lookup surfaces interrupts by id
|
|
628
634
|
# only, so trust the client-claimed namespace and validate by
|
|
@@ -962,11 +968,11 @@ class ThreadRunManager:
|
|
|
962
968
|
async def get_thread_state() -> dict[str, Any] | None:
|
|
963
969
|
from langgraph_runtime.database import connect # noqa: PLC0415
|
|
964
970
|
|
|
965
|
-
# ``
|
|
966
|
-
# real connection
|
|
967
|
-
#
|
|
971
|
+
# When ``PREFER_GRPC_CHECKPOINTER`` is false the postgres backend
|
|
972
|
+
# yields a real connection for the Python checkpointer; when true
|
|
973
|
+
# it yields a no-op stand-in and checkpoint I/O goes through gRPC.
|
|
968
974
|
try:
|
|
969
|
-
async with connect(supports_core_api=
|
|
975
|
+
async with connect(supports_core_api=PREFER_GRPC_CHECKPOINTER) as conn:
|
|
970
976
|
return await self._threads.State.get(
|
|
971
977
|
conn,
|
|
972
978
|
{"configurable": {"thread_id": thread_id}},
|
|
@@ -40,7 +40,8 @@ const logger = createLogger({
|
|
|
40
40
|
],
|
|
41
41
|
});
|
|
42
42
|
|
|
43
|
-
|
|
43
|
+
// Pinned by the Python parent (see remote.py); base port is the fallback.
|
|
44
|
+
const HTTP_PORT = Number(process.env.LANGGRAPH_JS_GRAPH_HTTP_PORT) || 5557;
|
|
44
45
|
|
|
45
46
|
const wrapHonoApp = (app: Hono) => {
|
|
46
47
|
// We do this to avoid importing Hono from server dependencies
|
|
@@ -221,8 +221,9 @@ async function getOrExtractSchema(graphId: string) {
|
|
|
221
221
|
return GRAPH_SCHEMA[graphId];
|
|
222
222
|
}
|
|
223
223
|
|
|
224
|
-
|
|
225
|
-
const
|
|
224
|
+
// Pinned by the Python parent (see remote.py); base ports are the fallback.
|
|
225
|
+
const GRAPH_PORT = Number(process.env.LANGGRAPH_JS_GRAPH_PORT) || 5556;
|
|
226
|
+
const REMOTE_PORT = Number(process.env.LANGGRAPH_JS_REMOTE_PORT) || 5555;
|
|
226
227
|
|
|
227
228
|
const RunnableConfigSchema = z.object({
|
|
228
229
|
tags: z.array(z.string()).optional(),
|
|
@@ -40,6 +40,7 @@ from starlette.exceptions import HTTPException
|
|
|
40
40
|
from starlette.requests import HTTPConnection, Request
|
|
41
41
|
from starlette.routing import Route
|
|
42
42
|
|
|
43
|
+
from langgraph_api import config as lg_config
|
|
43
44
|
from langgraph_api import store as api_store
|
|
44
45
|
from langgraph_api.auth.custom import DotDict, ProxyUser
|
|
45
46
|
from langgraph_api.config import LANGGRAPH_AUTH, LANGGRAPH_AUTH_TYPE
|
|
@@ -53,9 +54,40 @@ from langgraph_api.utils import get_auth_ctx, get_user_id
|
|
|
53
54
|
|
|
54
55
|
logger = structlog.stdlib.get_logger(__name__)
|
|
55
56
|
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
57
|
+
# Loopback ports between the Python parent and its JS subprocess. Containers
|
|
58
|
+
# colocated in one pod share a network namespace, so each entrypoint gets its
|
|
59
|
+
# own range (via the offset below); LANGGRAPH_JS_*_PORT overrides any port.
|
|
60
|
+
_BASE_REMOTE_PORT = 5555
|
|
61
|
+
_BASE_GRAPH_PORT = 5556
|
|
62
|
+
_BASE_GRAPH_HTTP_PORT = 5557
|
|
63
|
+
|
|
64
|
+
|
|
65
|
+
def _js_port_offset(*, is_queue: bool) -> int:
|
|
66
|
+
"""Port offset per entrypoint so colocated containers don't collide.
|
|
67
|
+
|
|
68
|
+
The queue worker and API server can run as separate containers in a single
|
|
69
|
+
pod (shared network namespace), so the queue worker gets its own range.
|
|
70
|
+
"""
|
|
71
|
+
return 10 if is_queue else 0
|
|
72
|
+
|
|
73
|
+
|
|
74
|
+
def _resolve_js_port(base: int, offset: int, override: str | None) -> int:
|
|
75
|
+
"""Explicit env override wins; otherwise base port plus entrypoint offset."""
|
|
76
|
+
if override:
|
|
77
|
+
return int(override)
|
|
78
|
+
return base + offset
|
|
79
|
+
|
|
80
|
+
|
|
81
|
+
_JS_PORT_OFFSET = _js_port_offset(is_queue=lg_config.IS_QUEUE_ENTRYPOINT)
|
|
82
|
+
REMOTE_PORT = _resolve_js_port(
|
|
83
|
+
_BASE_REMOTE_PORT, _JS_PORT_OFFSET, os.getenv("LANGGRAPH_JS_REMOTE_PORT")
|
|
84
|
+
)
|
|
85
|
+
GRAPH_PORT = _resolve_js_port(
|
|
86
|
+
_BASE_GRAPH_PORT, _JS_PORT_OFFSET, os.getenv("LANGGRAPH_JS_GRAPH_PORT")
|
|
87
|
+
)
|
|
88
|
+
GRAPH_HTTP_PORT = _resolve_js_port(
|
|
89
|
+
_BASE_GRAPH_HTTP_PORT, _JS_PORT_OFFSET, os.getenv("LANGGRAPH_JS_GRAPH_HTTP_PORT")
|
|
90
|
+
)
|
|
59
91
|
SSL = ssl.create_default_context(cafile=certifi.where())
|
|
60
92
|
|
|
61
93
|
if (port := int(os.getenv("PORT", "8080"))) and port in (GRAPH_PORT, REMOTE_PORT):
|
|
@@ -510,6 +542,10 @@ async def run_js_process(paths_str: str | None, watch: bool = False):
|
|
|
510
542
|
"NODE_ENV": "development" if watch else "production",
|
|
511
543
|
"CHOKIDAR_USEPOLLING": "true",
|
|
512
544
|
**os.environ,
|
|
545
|
+
# Pin the child to the parent's resolved ports.
|
|
546
|
+
"LANGGRAPH_JS_REMOTE_PORT": str(REMOTE_PORT),
|
|
547
|
+
"LANGGRAPH_JS_GRAPH_PORT": str(GRAPH_PORT),
|
|
548
|
+
"LANGGRAPH_JS_GRAPH_HTTP_PORT": str(GRAPH_HTTP_PORT),
|
|
513
549
|
},
|
|
514
550
|
)
|
|
515
551
|
logger.info(
|
|
@@ -567,6 +603,10 @@ async def run_js_http_process(
|
|
|
567
603
|
"NODE_ENV": "development" if watch else "production",
|
|
568
604
|
"CHOKIDAR_USEPOLLING": "true",
|
|
569
605
|
**os.environ,
|
|
606
|
+
# Pin the child to the parent's resolved ports.
|
|
607
|
+
"LANGGRAPH_JS_REMOTE_PORT": str(REMOTE_PORT),
|
|
608
|
+
"LANGGRAPH_JS_GRAPH_PORT": str(GRAPH_PORT),
|
|
609
|
+
"LANGGRAPH_JS_GRAPH_HTTP_PORT": str(GRAPH_HTTP_PORT),
|
|
570
610
|
},
|
|
571
611
|
)
|
|
572
612
|
|
|
@@ -11,6 +11,7 @@ from typing import TYPE_CHECKING, Any, Literal
|
|
|
11
11
|
import structlog
|
|
12
12
|
|
|
13
13
|
from langgraph_api import __version__, config, metadata
|
|
14
|
+
from langgraph_api.http_metrics_utils import HTTP_LATENCY_BUCKETS
|
|
14
15
|
|
|
15
16
|
if TYPE_CHECKING:
|
|
16
17
|
from opentelemetry.exporter.otlp.proto.http.metric_exporter import (
|
|
@@ -74,6 +75,15 @@ METRIC_TIER_INFO = 2
|
|
|
74
75
|
METRIC_TIER_DEBUG = 3
|
|
75
76
|
METRIC_TIER_DEEP_DEBUG = 4
|
|
76
77
|
|
|
78
|
+
# Legacy /metrics used HTTP_LATENCY_BUCKETS in seconds. OTLP record_latency()
|
|
79
|
+
# stores milliseconds, so convert (drop +Inf — OTel adds the overflow bucket).
|
|
80
|
+
# Apply to every latency metric: OTel defaults max out at 10000ms (~10s), which
|
|
81
|
+
# caps p95/p99 for long HTTP polls (/join), run queue waits (300s alerts), and
|
|
82
|
+
# run execution (30m alerts).
|
|
83
|
+
HTTP_LATENCY_BUCKETS_MS: tuple[float, ...] = tuple(
|
|
84
|
+
b * 1000 for b in HTTP_LATENCY_BUCKETS if b != float("inf")
|
|
85
|
+
)
|
|
86
|
+
|
|
77
87
|
MetricType = Literal["counter", "histogram", "latency", "gauge"]
|
|
78
88
|
|
|
79
89
|
|
|
@@ -614,8 +624,17 @@ class OTelMetricsReporter:
|
|
|
614
624
|
name=name, description=metric.description
|
|
615
625
|
)
|
|
616
626
|
elif metric.metric_type in {"histogram", "latency"}:
|
|
627
|
+
# All latency metrics use legacy second-scale buckets (as ms).
|
|
628
|
+
# Non-latency histograms (bytes, counts) keep OTel defaults.
|
|
629
|
+
advisory = (
|
|
630
|
+
list(HTTP_LATENCY_BUCKETS_MS)
|
|
631
|
+
if metric.metric_type == "latency"
|
|
632
|
+
else None
|
|
633
|
+
)
|
|
617
634
|
instrument = self._meter.create_histogram(
|
|
618
|
-
name=name,
|
|
635
|
+
name=name,
|
|
636
|
+
description=metric.description,
|
|
637
|
+
explicit_bucket_boundaries_advisory=advisory,
|
|
619
638
|
)
|
|
620
639
|
else:
|
|
621
640
|
# Gauges are handled via observable instruments (see _set_gauge).
|
|
@@ -73,10 +73,13 @@ def compute_python_publish_tags(
|
|
|
73
73
|
ecr_prefix: str,
|
|
74
74
|
img_api_dh: str,
|
|
75
75
|
img_svr_dh: str,
|
|
76
|
+
fips: bool = False,
|
|
76
77
|
) -> list[str]:
|
|
77
78
|
"""Compute Python publish tags with workflow-compatible behavior."""
|
|
78
79
|
py_version = _require_non_empty("py_version", py_version)
|
|
79
80
|
distro = _require_non_empty("distro", distro)
|
|
81
|
+
if fips and distro != "wolfi":
|
|
82
|
+
raise ValueError("fips is only supported for wolfi images")
|
|
80
83
|
sha = _require_non_empty("sha", sha)
|
|
81
84
|
ver_patch = _require_non_empty("ver_patch", ver_patch)
|
|
82
85
|
ver_major = _require_non_empty("ver_major", ver_major)
|
|
@@ -92,6 +95,8 @@ def compute_python_publish_tags(
|
|
|
92
95
|
raise ValueError("gcr_projects must include at least one project")
|
|
93
96
|
|
|
94
97
|
suf = _python_suffix(distro)
|
|
98
|
+
if fips:
|
|
99
|
+
suf = f"{suf}-fips"
|
|
95
100
|
pyfrag = f"py{py_version}"
|
|
96
101
|
runtime_alias = (
|
|
97
102
|
f"{py_version}{suf}" if channel == "stable" else f"{channel}-{pyfrag}{suf}"
|
|
@@ -184,9 +189,12 @@ def compute_js_publish_tags(
|
|
|
184
189
|
ar_project: str,
|
|
185
190
|
ecr_prefix: str,
|
|
186
191
|
img_js_dh: str,
|
|
192
|
+
fips: bool = False,
|
|
187
193
|
) -> list[str]:
|
|
188
194
|
"""Compute JS publish tags with workflow-compatible behavior."""
|
|
189
195
|
node_version = _require_non_empty("node_version", node_version)
|
|
196
|
+
if fips and tag_suffix != "wolfi":
|
|
197
|
+
raise ValueError("fips is only supported for wolfi images")
|
|
190
198
|
sha = _require_non_empty("sha", sha)
|
|
191
199
|
ver_patch = _require_non_empty("ver_patch", ver_patch)
|
|
192
200
|
ar_project = _require_non_empty("ar_project", ar_project)
|
|
@@ -199,6 +207,8 @@ def compute_js_publish_tags(
|
|
|
199
207
|
raise ValueError("gcr_projects must include at least one project")
|
|
200
208
|
|
|
201
209
|
suffix = f"-{tag_suffix}" if tag_suffix else ""
|
|
210
|
+
if fips:
|
|
211
|
+
suffix = f"{suffix}-fips"
|
|
202
212
|
repo_base = "langgraphjs-api" if licensed else "langgraphjs-api-unlicensed"
|
|
203
213
|
runtime_alias = (
|
|
204
214
|
f"{node_version}{suffix}"
|
|
@@ -25,7 +25,10 @@ from langgraph_api.encryption.middleware import (
|
|
|
25
25
|
extract_blob_encryption_context,
|
|
26
26
|
)
|
|
27
27
|
from langgraph_api.errors import UserInterrupt, UserRollback, UserTimeout
|
|
28
|
-
from langgraph_api.feature_flags import
|
|
28
|
+
from langgraph_api.feature_flags import (
|
|
29
|
+
IS_POSTGRES_OR_GRPC_BACKEND,
|
|
30
|
+
PREFER_GRPC_CHECKPOINTER,
|
|
31
|
+
)
|
|
29
32
|
from langgraph_api.graph import restore_dd_trace_context
|
|
30
33
|
from langgraph_api.js.errors import RemoteException
|
|
31
34
|
from langgraph_api.metadata import incr_runs
|
|
@@ -319,9 +322,11 @@ async def worker(
|
|
|
319
322
|
run_attempt=attempt,
|
|
320
323
|
)
|
|
321
324
|
try:
|
|
322
|
-
#
|
|
323
|
-
# This only doubles up connections for inmem
|
|
324
|
-
async with connect(
|
|
325
|
+
# Python checkpointer needs a real PG conn; gRPC checkpointer
|
|
326
|
+
# does not. This only doubles up connections for inmem.
|
|
327
|
+
async with connect(
|
|
328
|
+
supports_core_api=PREFER_GRPC_CHECKPOINTER
|
|
329
|
+
) as conn:
|
|
325
330
|
state_snapshot = await Threads.State.get(
|
|
326
331
|
conn, run["kwargs"]["config"], subgraphs=False
|
|
327
332
|
)
|
|
@@ -901,7 +901,7 @@ requires-dist = [
|
|
|
901
901
|
[package.metadata.requires-dev]
|
|
902
902
|
dev = [
|
|
903
903
|
{ name = "grpcio-health-checking", specifier = ">=1.80.0,<1.82.0" },
|
|
904
|
-
{ name = "grpcio-tools", specifier = "==1.
|
|
904
|
+
{ name = "grpcio-tools", specifier = "==1.81.1" },
|
|
905
905
|
{ name = "langchain", specifier = ">=0.3" },
|
|
906
906
|
{ name = "langchain-core", specifier = ">=0.3" },
|
|
907
907
|
{ name = "mypy-protobuf", specifier = ">=5.0.0,<6" },
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
__version__ = "0.12.0.dev19"
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|