langgraph-api 0.12.0.dev20__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.dev20 → 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.dev20 → langgraph_api-0.12.0.dev21}/langgraph_api/api/assistants.py +8 -4
- {langgraph_api-0.12.0.dev20 → langgraph_api-0.12.0.dev21}/langgraph_api/api/event_streaming.py +27 -23
- {langgraph_api-0.12.0.dev20 → langgraph_api-0.12.0.dev21}/langgraph_api/api/store.py +10 -4
- {langgraph_api-0.12.0.dev20 → langgraph_api-0.12.0.dev21}/langgraph_api/api/ui.py +21 -14
- {langgraph_api-0.12.0.dev20 → langgraph_api-0.12.0.dev21}/langgraph_api/event_streaming/service.py +6 -0
- {langgraph_api-0.12.0.dev20 → langgraph_api-0.12.0.dev21}/langgraph_api/js/client.http.mts +2 -1
- {langgraph_api-0.12.0.dev20 → langgraph_api-0.12.0.dev21}/langgraph_api/js/client.mts +3 -2
- {langgraph_api-0.12.0.dev20 → langgraph_api-0.12.0.dev21}/langgraph_api/js/remote.py +43 -3
- {langgraph_api-0.12.0.dev20 → langgraph_api-0.12.0.dev21}/langgraph_api/metrics_otlp.py +20 -1
- {langgraph_api-0.12.0.dev20 → langgraph_api-0.12.0.dev21}/langgraph_api/release_tags.py +10 -0
- langgraph_api-0.12.0.dev20/langgraph_api/__init__.py +0 -1
- {langgraph_api-0.12.0.dev20 → langgraph_api-0.12.0.dev21}/.gitignore +0 -0
- {langgraph_api-0.12.0.dev20 → langgraph_api-0.12.0.dev21}/LICENSE +0 -0
- {langgraph_api-0.12.0.dev20 → langgraph_api-0.12.0.dev21}/Makefile +0 -0
- {langgraph_api-0.12.0.dev20 → langgraph_api-0.12.0.dev21}/README.md +0 -0
- {langgraph_api-0.12.0.dev20 → langgraph_api-0.12.0.dev21}/benchmark/.gitignore +0 -0
- {langgraph_api-0.12.0.dev20 → langgraph_api-0.12.0.dev21}/benchmark/Makefile +0 -0
- {langgraph_api-0.12.0.dev20 → langgraph_api-0.12.0.dev21}/benchmark/README.md +0 -0
- {langgraph_api-0.12.0.dev20 → langgraph_api-0.12.0.dev21}/benchmark/benchmark-runners/assistant.ts +0 -0
- {langgraph_api-0.12.0.dev20 → langgraph_api-0.12.0.dev21}/benchmark/benchmark-runners/benchmark-runner.ts +0 -0
- {langgraph_api-0.12.0.dev20 → langgraph_api-0.12.0.dev21}/benchmark/benchmark-runners/benchmark_profiles.ts +0 -0
- {langgraph_api-0.12.0.dev20 → langgraph_api-0.12.0.dev21}/benchmark/benchmark-runners/benchmarks.ts +0 -0
- {langgraph_api-0.12.0.dev20 → langgraph_api-0.12.0.dev21}/benchmark/benchmark-runners/cancel_first_second_completes.ts +0 -0
- {langgraph_api-0.12.0.dev20 → langgraph_api-0.12.0.dev21}/benchmark/benchmark-runners/enqueued_runs_order.ts +0 -0
- {langgraph_api-0.12.0.dev20 → langgraph_api-0.12.0.dev21}/benchmark/benchmark-runners/log-failure.ts +0 -0
- {langgraph_api-0.12.0.dev20 → langgraph_api-0.12.0.dev21}/benchmark/benchmark-runners/meta_workload.ts +0 -0
- {langgraph_api-0.12.0.dev20 → langgraph_api-0.12.0.dev21}/benchmark/benchmark-runners/stream_write.ts +0 -0
- {langgraph_api-0.12.0.dev20 → langgraph_api-0.12.0.dev21}/benchmark/benchmark-runners/thread.ts +0 -0
- {langgraph_api-0.12.0.dev20 → langgraph_api-0.12.0.dev21}/benchmark/benchmark-runners/thread_runs_metadata_search.ts +0 -0
- {langgraph_api-0.12.0.dev20 → langgraph_api-0.12.0.dev21}/benchmark/benchmark-runners/threads_search_metadata.ts +0 -0
- {langgraph_api-0.12.0.dev20 → langgraph_api-0.12.0.dev21}/benchmark/benchmark-runners/types.ts +0 -0
- {langgraph_api-0.12.0.dev20 → langgraph_api-0.12.0.dev21}/benchmark/benchmark-runners/wait_write.ts +0 -0
- {langgraph_api-0.12.0.dev20 → langgraph_api-0.12.0.dev21}/benchmark/clean-cli.js +0 -0
- {langgraph_api-0.12.0.dev20 → langgraph_api-0.12.0.dev21}/benchmark/clean.js +0 -0
- {langgraph_api-0.12.0.dev20 → langgraph_api-0.12.0.dev21}/benchmark/continuous/README.md +0 -0
- {langgraph_api-0.12.0.dev20 → langgraph_api-0.12.0.dev21}/benchmark/continuous/pyproject.toml +0 -0
- {langgraph_api-0.12.0.dev20 → langgraph_api-0.12.0.dev21}/benchmark/continuous/runner.py +0 -0
- {langgraph_api-0.12.0.dev20 → langgraph_api-0.12.0.dev21}/benchmark/continuous/uv.lock +0 -0
- {langgraph_api-0.12.0.dev20 → langgraph_api-0.12.0.dev21}/benchmark/graphs.js +0 -0
- {langgraph_api-0.12.0.dev20 → langgraph_api-0.12.0.dev21}/benchmark/package.json +0 -0
- {langgraph_api-0.12.0.dev20 → langgraph_api-0.12.0.dev21}/benchmark/ramp.js +0 -0
- {langgraph_api-0.12.0.dev20 → langgraph_api-0.12.0.dev21}/benchmark/reporting/dd_reporting.py +0 -0
- {langgraph_api-0.12.0.dev20 → langgraph_api-0.12.0.dev21}/benchmark/staircase.py +0 -0
- {langgraph_api-0.12.0.dev20 → langgraph_api-0.12.0.dev21}/benchmark/staircase_step_k6.js +0 -0
- {langgraph_api-0.12.0.dev20 → langgraph_api-0.12.0.dev21}/benchmark/tsconfig.json +0 -0
- {langgraph_api-0.12.0.dev20 → langgraph_api-0.12.0.dev21}/benchmark/update-revision.js +0 -0
- {langgraph_api-0.12.0.dev20 → langgraph_api-0.12.0.dev21}/benchmark/weather.js +0 -0
- {langgraph_api-0.12.0.dev20 → langgraph_api-0.12.0.dev21}/constraints.txt +0 -0
- {langgraph_api-0.12.0.dev20 → langgraph_api-0.12.0.dev21}/custom_store.sql +0 -0
- {langgraph_api-0.12.0.dev20 → langgraph_api-0.12.0.dev21}/forbidden.txt +0 -0
- {langgraph_api-0.12.0.dev20 → langgraph_api-0.12.0.dev21}/hatch_build.py +0 -0
- {langgraph_api-0.12.0.dev20 → langgraph_api-0.12.0.dev21}/healthcheck.py +0 -0
- {langgraph_api-0.12.0.dev20 → langgraph_api-0.12.0.dev21}/langgraph-cloud-debugging-20260210132856.zip +0 -0
- {langgraph_api-0.12.0.dev20 → langgraph_api-0.12.0.dev21}/langgraph_api/_checkpointer/__init__.py +0 -0
- {langgraph_api-0.12.0.dev20 → langgraph_api-0.12.0.dev21}/langgraph_api/_checkpointer/_adapter.py +0 -0
- {langgraph_api-0.12.0.dev20 → langgraph_api-0.12.0.dev21}/langgraph_api/_checkpointer/protocol.py +0 -0
- {langgraph_api-0.12.0.dev20 → langgraph_api-0.12.0.dev21}/langgraph_api/_factory_utils.py +0 -0
- {langgraph_api-0.12.0.dev20 → langgraph_api-0.12.0.dev21}/langgraph_api/api/__init__.py +0 -0
- {langgraph_api-0.12.0.dev20 → langgraph_api-0.12.0.dev21}/langgraph_api/api/a2a.py +0 -0
- {langgraph_api-0.12.0.dev20 → langgraph_api-0.12.0.dev21}/langgraph_api/api/mcp/__init__.py +0 -0
- {langgraph_api-0.12.0.dev20 → langgraph_api-0.12.0.dev21}/langgraph_api/api/mcp/_constants.py +0 -0
- {langgraph_api-0.12.0.dev20 → langgraph_api-0.12.0.dev21}/langgraph_api/api/mcp/_handlers.py +0 -0
- {langgraph_api-0.12.0.dev20 → langgraph_api-0.12.0.dev21}/langgraph_api/api/mcp/_models.py +0 -0
- {langgraph_api-0.12.0.dev20 → langgraph_api-0.12.0.dev21}/langgraph_api/api/mcp/_routes.py +0 -0
- {langgraph_api-0.12.0.dev20 → langgraph_api-0.12.0.dev21}/langgraph_api/api/mcp/_sanitizers.py +0 -0
- {langgraph_api-0.12.0.dev20 → langgraph_api-0.12.0.dev21}/langgraph_api/api/meta.py +0 -0
- {langgraph_api-0.12.0.dev20 → langgraph_api-0.12.0.dev21}/langgraph_api/api/openapi.py +0 -0
- {langgraph_api-0.12.0.dev20 → langgraph_api-0.12.0.dev21}/langgraph_api/api/profile.py +0 -0
- {langgraph_api-0.12.0.dev20 → langgraph_api-0.12.0.dev21}/langgraph_api/api/runs.py +0 -0
- {langgraph_api-0.12.0.dev20 → langgraph_api-0.12.0.dev21}/langgraph_api/api/threads.py +0 -0
- {langgraph_api-0.12.0.dev20 → langgraph_api-0.12.0.dev21}/langgraph_api/asgi_transport.py +0 -0
- {langgraph_api-0.12.0.dev20 → langgraph_api-0.12.0.dev21}/langgraph_api/asyncio.py +0 -0
- {langgraph_api-0.12.0.dev20 → langgraph_api-0.12.0.dev21}/langgraph_api/auth/__init__.py +0 -0
- {langgraph_api-0.12.0.dev20 → langgraph_api-0.12.0.dev21}/langgraph_api/auth/custom.py +0 -0
- {langgraph_api-0.12.0.dev20 → langgraph_api-0.12.0.dev21}/langgraph_api/auth/errors.py +0 -0
- {langgraph_api-0.12.0.dev20 → langgraph_api-0.12.0.dev21}/langgraph_api/auth/langsmith/__init__.py +0 -0
- {langgraph_api-0.12.0.dev20 → langgraph_api-0.12.0.dev21}/langgraph_api/auth/langsmith/backend.py +0 -0
- {langgraph_api-0.12.0.dev20 → langgraph_api-0.12.0.dev21}/langgraph_api/auth/langsmith/client.py +0 -0
- {langgraph_api-0.12.0.dev20 → langgraph_api-0.12.0.dev21}/langgraph_api/auth/middleware.py +0 -0
- {langgraph_api-0.12.0.dev20 → langgraph_api-0.12.0.dev21}/langgraph_api/auth/noop.py +0 -0
- {langgraph_api-0.12.0.dev20 → langgraph_api-0.12.0.dev21}/langgraph_api/auth/studio_user.py +0 -0
- {langgraph_api-0.12.0.dev20 → langgraph_api-0.12.0.dev21}/langgraph_api/cache.py +0 -0
- {langgraph_api-0.12.0.dev20 → langgraph_api-0.12.0.dev21}/langgraph_api/cli.py +0 -0
- {langgraph_api-0.12.0.dev20 → langgraph_api-0.12.0.dev21}/langgraph_api/command.py +0 -0
- {langgraph_api-0.12.0.dev20 → langgraph_api-0.12.0.dev21}/langgraph_api/config/__init__.py +0 -0
- {langgraph_api-0.12.0.dev20 → langgraph_api-0.12.0.dev21}/langgraph_api/config/_parse.py +0 -0
- {langgraph_api-0.12.0.dev20 → langgraph_api-0.12.0.dev21}/langgraph_api/config/schemas.py +0 -0
- {langgraph_api-0.12.0.dev20 → langgraph_api-0.12.0.dev21}/langgraph_api/cron_scheduler.py +0 -0
- {langgraph_api-0.12.0.dev20 → langgraph_api-0.12.0.dev21}/langgraph_api/encryption/__init__.py +0 -0
- {langgraph_api-0.12.0.dev20 → langgraph_api-0.12.0.dev21}/langgraph_api/encryption/aes_json.py +0 -0
- {langgraph_api-0.12.0.dev20 → langgraph_api-0.12.0.dev21}/langgraph_api/encryption/context.py +0 -0
- {langgraph_api-0.12.0.dev20 → langgraph_api-0.12.0.dev21}/langgraph_api/encryption/custom.py +0 -0
- {langgraph_api-0.12.0.dev20 → langgraph_api-0.12.0.dev21}/langgraph_api/encryption/middleware.py +0 -0
- {langgraph_api-0.12.0.dev20 → langgraph_api-0.12.0.dev21}/langgraph_api/encryption/shared.py +0 -0
- {langgraph_api-0.12.0.dev20 → langgraph_api-0.12.0.dev21}/langgraph_api/errors.py +0 -0
- {langgraph_api-0.12.0.dev20 → langgraph_api-0.12.0.dev21}/langgraph_api/event_streaming/__init__.py +0 -0
- {langgraph_api-0.12.0.dev20 → langgraph_api-0.12.0.dev21}/langgraph_api/event_streaming/capabilities.py +0 -0
- {langgraph_api-0.12.0.dev20 → langgraph_api-0.12.0.dev21}/langgraph_api/event_streaming/constants.py +0 -0
- {langgraph_api-0.12.0.dev20 → langgraph_api-0.12.0.dev21}/langgraph_api/event_streaming/event_normalizers.py +0 -0
- {langgraph_api-0.12.0.dev20 → langgraph_api-0.12.0.dev21}/langgraph_api/event_streaming/namespace.py +0 -0
- {langgraph_api-0.12.0.dev20 → langgraph_api-0.12.0.dev21}/langgraph_api/event_streaming/session.py +0 -0
- {langgraph_api-0.12.0.dev20 → langgraph_api-0.12.0.dev21}/langgraph_api/event_streaming/state_normalizers.py +0 -0
- {langgraph_api-0.12.0.dev20 → langgraph_api-0.12.0.dev21}/langgraph_api/event_streaming/types.py +0 -0
- {langgraph_api-0.12.0.dev20 → langgraph_api-0.12.0.dev21}/langgraph_api/feature_flags.py +0 -0
- {langgraph_api-0.12.0.dev20 → langgraph_api-0.12.0.dev21}/langgraph_api/graph.py +0 -0
- {langgraph_api-0.12.0.dev20 → langgraph_api-0.12.0.dev21}/langgraph_api/grpc/__init__.py +0 -0
- {langgraph_api-0.12.0.dev20 → langgraph_api-0.12.0.dev21}/langgraph_api/grpc/client.py +0 -0
- {langgraph_api-0.12.0.dev20 → langgraph_api-0.12.0.dev21}/langgraph_api/grpc/generated/core_api_pb2.pyi +0 -0
- {langgraph_api-0.12.0.dev20 → langgraph_api-0.12.0.dev21}/langgraph_api/grpc/ops/__init__.py +0 -0
- {langgraph_api-0.12.0.dev20 → langgraph_api-0.12.0.dev21}/langgraph_api/grpc/ops/assistants.py +0 -0
- {langgraph_api-0.12.0.dev20 → langgraph_api-0.12.0.dev21}/langgraph_api/grpc/ops/cache.py +0 -0
- {langgraph_api-0.12.0.dev20 → langgraph_api-0.12.0.dev21}/langgraph_api/grpc/ops/crons.py +0 -0
- {langgraph_api-0.12.0.dev20 → langgraph_api-0.12.0.dev21}/langgraph_api/grpc/ops/runs.py +0 -0
- {langgraph_api-0.12.0.dev20 → langgraph_api-0.12.0.dev21}/langgraph_api/grpc/ops/threads.py +0 -0
- {langgraph_api-0.12.0.dev20 → langgraph_api-0.12.0.dev21}/langgraph_api/grpc/server.py +0 -0
- {langgraph_api-0.12.0.dev20 → langgraph_api-0.12.0.dev21}/langgraph_api/grpc/servicers/__init__.py +0 -0
- {langgraph_api-0.12.0.dev20 → langgraph_api-0.12.0.dev21}/langgraph_api/grpc/servicers/checkpointer.py +0 -0
- {langgraph_api-0.12.0.dev20 → langgraph_api-0.12.0.dev21}/langgraph_api/grpc/servicers/encryption.py +0 -0
- {langgraph_api-0.12.0.dev20 → langgraph_api-0.12.0.dev21}/langgraph_api/http.py +0 -0
- {langgraph_api-0.12.0.dev20 → langgraph_api-0.12.0.dev21}/langgraph_api/http_metrics.py +0 -0
- {langgraph_api-0.12.0.dev20 → langgraph_api-0.12.0.dev21}/langgraph_api/http_metrics_utils.py +0 -0
- {langgraph_api-0.12.0.dev20 → langgraph_api-0.12.0.dev21}/langgraph_api/js/.gitignore +0 -0
- {langgraph_api-0.12.0.dev20 → langgraph_api-0.12.0.dev21}/langgraph_api/js/.prettierrc +0 -0
- {langgraph_api-0.12.0.dev20 → langgraph_api-0.12.0.dev21}/langgraph_api/js/__init__.py +0 -0
- {langgraph_api-0.12.0.dev20 → langgraph_api-0.12.0.dev21}/langgraph_api/js/base.py +0 -0
- {langgraph_api-0.12.0.dev20 → langgraph_api-0.12.0.dev21}/langgraph_api/js/build.mts +0 -0
- {langgraph_api-0.12.0.dev20 → langgraph_api-0.12.0.dev21}/langgraph_api/js/errors.py +0 -0
- {langgraph_api-0.12.0.dev20 → langgraph_api-0.12.0.dev21}/langgraph_api/js/global.d.ts +0 -0
- {langgraph_api-0.12.0.dev20 → langgraph_api-0.12.0.dev21}/langgraph_api/js/package.json +0 -0
- {langgraph_api-0.12.0.dev20 → langgraph_api-0.12.0.dev21}/langgraph_api/js/schema.py +0 -0
- {langgraph_api-0.12.0.dev20 → langgraph_api-0.12.0.dev21}/langgraph_api/js/src/graph.mts +0 -0
- {langgraph_api-0.12.0.dev20 → langgraph_api-0.12.0.dev21}/langgraph_api/js/src/load.hooks.mjs +0 -0
- {langgraph_api-0.12.0.dev20 → langgraph_api-0.12.0.dev21}/langgraph_api/js/src/preload.mjs +0 -0
- {langgraph_api-0.12.0.dev20 → langgraph_api-0.12.0.dev21}/langgraph_api/js/src/utils/experiment-tracing.mts +0 -0
- {langgraph_api-0.12.0.dev20 → langgraph_api-0.12.0.dev21}/langgraph_api/js/src/utils/files.mts +0 -0
- {langgraph_api-0.12.0.dev20 → langgraph_api-0.12.0.dev21}/langgraph_api/js/src/utils/importMap.mts +0 -0
- {langgraph_api-0.12.0.dev20 → langgraph_api-0.12.0.dev21}/langgraph_api/js/src/utils/pythonSchemas.mts +0 -0
- {langgraph_api-0.12.0.dev20 → langgraph_api-0.12.0.dev21}/langgraph_api/js/src/utils/serde.mts +0 -0
- {langgraph_api-0.12.0.dev20 → langgraph_api-0.12.0.dev21}/langgraph_api/js/sse.py +0 -0
- {langgraph_api-0.12.0.dev20 → langgraph_api-0.12.0.dev21}/langgraph_api/js/traceblock.mts +0 -0
- {langgraph_api-0.12.0.dev20 → langgraph_api-0.12.0.dev21}/langgraph_api/js/tsconfig.json +0 -0
- {langgraph_api-0.12.0.dev20 → langgraph_api-0.12.0.dev21}/langgraph_api/js/ui.py +0 -0
- {langgraph_api-0.12.0.dev20 → langgraph_api-0.12.0.dev21}/langgraph_api/js/yarn.lock +0 -0
- {langgraph_api-0.12.0.dev20 → langgraph_api-0.12.0.dev21}/langgraph_api/lc_security/__init__.py +0 -0
- {langgraph_api-0.12.0.dev20 → langgraph_api-0.12.0.dev21}/langgraph_api/lc_security/exceptions.py +0 -0
- {langgraph_api-0.12.0.dev20 → langgraph_api-0.12.0.dev21}/langgraph_api/lc_security/policy.py +0 -0
- {langgraph_api-0.12.0.dev20 → langgraph_api-0.12.0.dev21}/langgraph_api/lc_security/transport.py +0 -0
- {langgraph_api-0.12.0.dev20 → langgraph_api-0.12.0.dev21}/langgraph_api/logging.py +0 -0
- {langgraph_api-0.12.0.dev20 → langgraph_api-0.12.0.dev21}/langgraph_api/metadata.py +0 -0
- {langgraph_api-0.12.0.dev20 → langgraph_api-0.12.0.dev21}/langgraph_api/metrics_collector.py +0 -0
- {langgraph_api-0.12.0.dev20 → langgraph_api-0.12.0.dev21}/langgraph_api/middleware/__init__.py +0 -0
- {langgraph_api-0.12.0.dev20 → langgraph_api-0.12.0.dev21}/langgraph_api/middleware/ensure_store.py +0 -0
- {langgraph_api-0.12.0.dev20 → langgraph_api-0.12.0.dev21}/langgraph_api/middleware/http_logger.py +0 -0
- {langgraph_api-0.12.0.dev20 → langgraph_api-0.12.0.dev21}/langgraph_api/middleware/private_network.py +0 -0
- {langgraph_api-0.12.0.dev20 → langgraph_api-0.12.0.dev21}/langgraph_api/middleware/request_id.py +0 -0
- {langgraph_api-0.12.0.dev20 → langgraph_api-0.12.0.dev21}/langgraph_api/models/__init__.py +0 -0
- {langgraph_api-0.12.0.dev20 → langgraph_api-0.12.0.dev21}/langgraph_api/models/run.py +0 -0
- {langgraph_api-0.12.0.dev20 → langgraph_api-0.12.0.dev21}/langgraph_api/otel_context.py +0 -0
- {langgraph_api-0.12.0.dev20 → langgraph_api-0.12.0.dev21}/langgraph_api/patch.py +0 -0
- {langgraph_api-0.12.0.dev20 → langgraph_api-0.12.0.dev21}/langgraph_api/queue_entrypoint.py +0 -0
- {langgraph_api-0.12.0.dev20 → langgraph_api-0.12.0.dev21}/langgraph_api/route.py +0 -0
- {langgraph_api-0.12.0.dev20 → langgraph_api-0.12.0.dev21}/langgraph_api/schema.py +0 -0
- {langgraph_api-0.12.0.dev20 → langgraph_api-0.12.0.dev21}/langgraph_api/self_hosted_logs.py +0 -0
- {langgraph_api-0.12.0.dev20 → langgraph_api-0.12.0.dev21}/langgraph_api/self_hosted_metrics.py +0 -0
- {langgraph_api-0.12.0.dev20 → langgraph_api-0.12.0.dev21}/langgraph_api/serde.py +0 -0
- {langgraph_api-0.12.0.dev20 → langgraph_api-0.12.0.dev21}/langgraph_api/server.py +0 -0
- {langgraph_api-0.12.0.dev20 → langgraph_api-0.12.0.dev21}/langgraph_api/sse.py +0 -0
- {langgraph_api-0.12.0.dev20 → langgraph_api-0.12.0.dev21}/langgraph_api/state.py +0 -0
- {langgraph_api-0.12.0.dev20 → langgraph_api-0.12.0.dev21}/langgraph_api/store.py +0 -0
- {langgraph_api-0.12.0.dev20 → langgraph_api-0.12.0.dev21}/langgraph_api/stream.py +0 -0
- {langgraph_api-0.12.0.dev20 → langgraph_api-0.12.0.dev21}/langgraph_api/stream_v2.py +0 -0
- {langgraph_api-0.12.0.dev20 → langgraph_api-0.12.0.dev21}/langgraph_api/timing/__init__.py +0 -0
- {langgraph_api-0.12.0.dev20 → langgraph_api-0.12.0.dev21}/langgraph_api/timing/profiler.py +0 -0
- {langgraph_api-0.12.0.dev20 → langgraph_api-0.12.0.dev21}/langgraph_api/timing/timer.py +0 -0
- {langgraph_api-0.12.0.dev20 → langgraph_api-0.12.0.dev21}/langgraph_api/traceblock.py +0 -0
- {langgraph_api-0.12.0.dev20 → langgraph_api-0.12.0.dev21}/langgraph_api/tracing_session.py +0 -0
- {langgraph_api-0.12.0.dev20 → langgraph_api-0.12.0.dev21}/langgraph_api/tunneling/cloudflare.py +0 -0
- {langgraph_api-0.12.0.dev20 → langgraph_api-0.12.0.dev21}/langgraph_api/utils/__init__.py +0 -0
- {langgraph_api-0.12.0.dev20 → langgraph_api-0.12.0.dev21}/langgraph_api/utils/cache.py +0 -0
- {langgraph_api-0.12.0.dev20 → langgraph_api-0.12.0.dev21}/langgraph_api/utils/config.py +0 -0
- {langgraph_api-0.12.0.dev20 → langgraph_api-0.12.0.dev21}/langgraph_api/utils/errors.py +0 -0
- {langgraph_api-0.12.0.dev20 → langgraph_api-0.12.0.dev21}/langgraph_api/utils/extract.py +0 -0
- {langgraph_api-0.12.0.dev20 → langgraph_api-0.12.0.dev21}/langgraph_api/utils/future.py +0 -0
- {langgraph_api-0.12.0.dev20 → langgraph_api-0.12.0.dev21}/langgraph_api/utils/headers.py +0 -0
- {langgraph_api-0.12.0.dev20 → langgraph_api-0.12.0.dev21}/langgraph_api/utils/network.py +0 -0
- {langgraph_api-0.12.0.dev20 → langgraph_api-0.12.0.dev21}/langgraph_api/utils/retriable_client.py +0 -0
- {langgraph_api-0.12.0.dev20 → langgraph_api-0.12.0.dev21}/langgraph_api/utils/stream_codec.py +0 -0
- {langgraph_api-0.12.0.dev20 → langgraph_api-0.12.0.dev21}/langgraph_api/utils/uuids.py +0 -0
- {langgraph_api-0.12.0.dev20 → langgraph_api-0.12.0.dev21}/langgraph_api/validation.py +0 -0
- {langgraph_api-0.12.0.dev20 → langgraph_api-0.12.0.dev21}/langgraph_api/webhook.py +0 -0
- {langgraph_api-0.12.0.dev20 → langgraph_api-0.12.0.dev21}/langgraph_api/worker.py +0 -0
- {langgraph_api-0.12.0.dev20 → langgraph_api-0.12.0.dev21}/langgraph_grpc_common/__init__.py +0 -0
- {langgraph_api-0.12.0.dev20 → langgraph_api-0.12.0.dev21}/langgraph_grpc_common/checkpointer.py +0 -0
- {langgraph_api-0.12.0.dev20 → langgraph_api-0.12.0.dev21}/langgraph_grpc_common/conversion/__init__.py +0 -0
- {langgraph_api-0.12.0.dev20 → langgraph_api-0.12.0.dev21}/langgraph_grpc_common/conversion/_compat.py +0 -0
- {langgraph_api-0.12.0.dev20 → langgraph_api-0.12.0.dev21}/langgraph_grpc_common/conversion/checkpoint.py +0 -0
- {langgraph_api-0.12.0.dev20 → langgraph_api-0.12.0.dev21}/langgraph_grpc_common/conversion/config.py +0 -0
- {langgraph_api-0.12.0.dev20 → langgraph_api-0.12.0.dev21}/langgraph_grpc_common/conversion/durability.py +0 -0
- {langgraph_api-0.12.0.dev20 → langgraph_api-0.12.0.dev21}/langgraph_grpc_common/conversion/store.py +0 -0
- {langgraph_api-0.12.0.dev20 → langgraph_api-0.12.0.dev21}/langgraph_grpc_common/conversion/struct.py +0 -0
- {langgraph_api-0.12.0.dev20 → langgraph_api-0.12.0.dev21}/langgraph_grpc_common/conversion/value.py +0 -0
- {langgraph_api-0.12.0.dev20 → langgraph_api-0.12.0.dev21}/langgraph_grpc_common/proto/__init__.py +0 -0
- {langgraph_api-0.12.0.dev20 → langgraph_api-0.12.0.dev21}/langgraph_grpc_common/proto/checkpointer_pb2.py +0 -0
- {langgraph_api-0.12.0.dev20 → langgraph_api-0.12.0.dev21}/langgraph_grpc_common/proto/checkpointer_pb2.pyi +0 -0
- {langgraph_api-0.12.0.dev20 → langgraph_api-0.12.0.dev21}/langgraph_grpc_common/proto/checkpointer_pb2_grpc.py +0 -0
- {langgraph_api-0.12.0.dev20 → langgraph_api-0.12.0.dev21}/langgraph_grpc_common/proto/checkpointer_pb2_grpc.pyi +0 -0
- {langgraph_api-0.12.0.dev20 → langgraph_api-0.12.0.dev21}/langgraph_grpc_common/proto/core_api_pb2.py +0 -0
- {langgraph_api-0.12.0.dev20 → langgraph_api-0.12.0.dev21}/langgraph_grpc_common/proto/core_api_pb2.pyi +0 -0
- {langgraph_api-0.12.0.dev20 → langgraph_api-0.12.0.dev21}/langgraph_grpc_common/proto/core_api_pb2_grpc.py +0 -0
- {langgraph_api-0.12.0.dev20 → langgraph_api-0.12.0.dev21}/langgraph_grpc_common/proto/core_api_pb2_grpc.pyi +0 -0
- {langgraph_api-0.12.0.dev20 → langgraph_api-0.12.0.dev21}/langgraph_grpc_common/proto/encryption_pb2.py +0 -0
- {langgraph_api-0.12.0.dev20 → langgraph_api-0.12.0.dev21}/langgraph_grpc_common/proto/encryption_pb2.pyi +0 -0
- {langgraph_api-0.12.0.dev20 → langgraph_api-0.12.0.dev21}/langgraph_grpc_common/proto/encryption_pb2_grpc.py +0 -0
- {langgraph_api-0.12.0.dev20 → langgraph_api-0.12.0.dev21}/langgraph_grpc_common/proto/encryption_pb2_grpc.pyi +0 -0
- {langgraph_api-0.12.0.dev20 → langgraph_api-0.12.0.dev21}/langgraph_grpc_common/proto/engine_common_pb2.py +0 -0
- {langgraph_api-0.12.0.dev20 → langgraph_api-0.12.0.dev21}/langgraph_grpc_common/proto/engine_common_pb2.pyi +0 -0
- {langgraph_api-0.12.0.dev20 → langgraph_api-0.12.0.dev21}/langgraph_grpc_common/proto/engine_common_pb2_grpc.py +0 -0
- {langgraph_api-0.12.0.dev20 → langgraph_api-0.12.0.dev21}/langgraph_grpc_common/proto/engine_common_pb2_grpc.pyi +0 -0
- {langgraph_api-0.12.0.dev20 → langgraph_api-0.12.0.dev21}/langgraph_grpc_common/proto/enum_cancel_run_action_pb2.py +0 -0
- {langgraph_api-0.12.0.dev20 → langgraph_api-0.12.0.dev21}/langgraph_grpc_common/proto/enum_cancel_run_action_pb2.pyi +0 -0
- {langgraph_api-0.12.0.dev20 → langgraph_api-0.12.0.dev21}/langgraph_grpc_common/proto/enum_cancel_run_action_pb2_grpc.py +0 -0
- {langgraph_api-0.12.0.dev20 → langgraph_api-0.12.0.dev21}/langgraph_grpc_common/proto/enum_cancel_run_action_pb2_grpc.pyi +0 -0
- {langgraph_api-0.12.0.dev20 → langgraph_api-0.12.0.dev21}/langgraph_grpc_common/proto/enum_control_signal_pb2.py +0 -0
- {langgraph_api-0.12.0.dev20 → langgraph_api-0.12.0.dev21}/langgraph_grpc_common/proto/enum_control_signal_pb2.pyi +0 -0
- {langgraph_api-0.12.0.dev20 → langgraph_api-0.12.0.dev21}/langgraph_grpc_common/proto/enum_control_signal_pb2_grpc.py +0 -0
- {langgraph_api-0.12.0.dev20 → langgraph_api-0.12.0.dev21}/langgraph_grpc_common/proto/enum_control_signal_pb2_grpc.pyi +0 -0
- {langgraph_api-0.12.0.dev20 → langgraph_api-0.12.0.dev21}/langgraph_grpc_common/proto/enum_cron_on_run_completed_pb2.py +0 -0
- {langgraph_api-0.12.0.dev20 → langgraph_api-0.12.0.dev21}/langgraph_grpc_common/proto/enum_cron_on_run_completed_pb2.pyi +0 -0
- {langgraph_api-0.12.0.dev20 → 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.dev20 → 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.dev20 → langgraph_api-0.12.0.dev21}/langgraph_grpc_common/proto/enum_durability_pb2.py +0 -0
- {langgraph_api-0.12.0.dev20 → langgraph_api-0.12.0.dev21}/langgraph_grpc_common/proto/enum_durability_pb2.pyi +0 -0
- {langgraph_api-0.12.0.dev20 → langgraph_api-0.12.0.dev21}/langgraph_grpc_common/proto/enum_durability_pb2_grpc.py +0 -0
- {langgraph_api-0.12.0.dev20 → langgraph_api-0.12.0.dev21}/langgraph_grpc_common/proto/enum_durability_pb2_grpc.pyi +0 -0
- {langgraph_api-0.12.0.dev20 → langgraph_api-0.12.0.dev21}/langgraph_grpc_common/proto/enum_multitask_strategy_pb2.py +0 -0
- {langgraph_api-0.12.0.dev20 → langgraph_api-0.12.0.dev21}/langgraph_grpc_common/proto/enum_multitask_strategy_pb2.pyi +0 -0
- {langgraph_api-0.12.0.dev20 → langgraph_api-0.12.0.dev21}/langgraph_grpc_common/proto/enum_multitask_strategy_pb2_grpc.py +0 -0
- {langgraph_api-0.12.0.dev20 → langgraph_api-0.12.0.dev21}/langgraph_grpc_common/proto/enum_multitask_strategy_pb2_grpc.pyi +0 -0
- {langgraph_api-0.12.0.dev20 → langgraph_api-0.12.0.dev21}/langgraph_grpc_common/proto/enum_run_status_pb2.py +0 -0
- {langgraph_api-0.12.0.dev20 → langgraph_api-0.12.0.dev21}/langgraph_grpc_common/proto/enum_run_status_pb2.pyi +0 -0
- {langgraph_api-0.12.0.dev20 → langgraph_api-0.12.0.dev21}/langgraph_grpc_common/proto/enum_run_status_pb2_grpc.py +0 -0
- {langgraph_api-0.12.0.dev20 → langgraph_api-0.12.0.dev21}/langgraph_grpc_common/proto/enum_run_status_pb2_grpc.pyi +0 -0
- {langgraph_api-0.12.0.dev20 → langgraph_api-0.12.0.dev21}/langgraph_grpc_common/proto/enum_stream_mode_pb2.py +0 -0
- {langgraph_api-0.12.0.dev20 → langgraph_api-0.12.0.dev21}/langgraph_grpc_common/proto/enum_stream_mode_pb2.pyi +0 -0
- {langgraph_api-0.12.0.dev20 → langgraph_api-0.12.0.dev21}/langgraph_grpc_common/proto/enum_stream_mode_pb2_grpc.py +0 -0
- {langgraph_api-0.12.0.dev20 → langgraph_api-0.12.0.dev21}/langgraph_grpc_common/proto/enum_stream_mode_pb2_grpc.pyi +0 -0
- {langgraph_api-0.12.0.dev20 → langgraph_api-0.12.0.dev21}/langgraph_grpc_common/proto/enum_thread_status_pb2.py +0 -0
- {langgraph_api-0.12.0.dev20 → langgraph_api-0.12.0.dev21}/langgraph_grpc_common/proto/enum_thread_status_pb2.pyi +0 -0
- {langgraph_api-0.12.0.dev20 → langgraph_api-0.12.0.dev21}/langgraph_grpc_common/proto/enum_thread_status_pb2_grpc.py +0 -0
- {langgraph_api-0.12.0.dev20 → langgraph_api-0.12.0.dev21}/langgraph_grpc_common/proto/enum_thread_status_pb2_grpc.pyi +0 -0
- {langgraph_api-0.12.0.dev20 → langgraph_api-0.12.0.dev21}/langgraph_grpc_common/proto/enum_thread_stream_mode_pb2.py +0 -0
- {langgraph_api-0.12.0.dev20 → langgraph_api-0.12.0.dev21}/langgraph_grpc_common/proto/enum_thread_stream_mode_pb2.pyi +0 -0
- {langgraph_api-0.12.0.dev20 → langgraph_api-0.12.0.dev21}/langgraph_grpc_common/proto/enum_thread_stream_mode_pb2_grpc.py +0 -0
- {langgraph_api-0.12.0.dev20 → langgraph_api-0.12.0.dev21}/langgraph_grpc_common/proto/enum_thread_stream_mode_pb2_grpc.pyi +0 -0
- {langgraph_api-0.12.0.dev20 → langgraph_api-0.12.0.dev21}/langgraph_grpc_common/proto/errors_pb2.py +0 -0
- {langgraph_api-0.12.0.dev20 → langgraph_api-0.12.0.dev21}/langgraph_grpc_common/proto/errors_pb2.pyi +0 -0
- {langgraph_api-0.12.0.dev20 → langgraph_api-0.12.0.dev21}/langgraph_grpc_common/proto/errors_pb2_grpc.py +0 -0
- {langgraph_api-0.12.0.dev20 → langgraph_api-0.12.0.dev21}/langgraph_grpc_common/proto/errors_pb2_grpc.pyi +0 -0
- {langgraph_api-0.12.0.dev20 → langgraph_api-0.12.0.dev21}/langgraph_grpc_common/proto/store_pb2.py +0 -0
- {langgraph_api-0.12.0.dev20 → langgraph_api-0.12.0.dev21}/langgraph_grpc_common/proto/store_pb2.pyi +0 -0
- {langgraph_api-0.12.0.dev20 → langgraph_api-0.12.0.dev21}/langgraph_grpc_common/proto/store_pb2_grpc.py +0 -0
- {langgraph_api-0.12.0.dev20 → langgraph_api-0.12.0.dev21}/langgraph_grpc_common/proto/store_pb2_grpc.pyi +0 -0
- {langgraph_api-0.12.0.dev20 → langgraph_api-0.12.0.dev21}/langgraph_grpc_common/serde.py +0 -0
- {langgraph_api-0.12.0.dev20 → langgraph_api-0.12.0.dev21}/langgraph_grpc_common/store.py +0 -0
- {langgraph_api-0.12.0.dev20 → langgraph_api-0.12.0.dev21}/langgraph_license/__init__.py +0 -0
- {langgraph_api-0.12.0.dev20 → langgraph_api-0.12.0.dev21}/langgraph_license/validation.py +0 -0
- {langgraph_api-0.12.0.dev20 → langgraph_api-0.12.0.dev21}/langgraph_runtime/__init__.py +0 -0
- {langgraph_api-0.12.0.dev20 → langgraph_api-0.12.0.dev21}/langgraph_runtime/checkpoint.py +0 -0
- {langgraph_api-0.12.0.dev20 → langgraph_api-0.12.0.dev21}/langgraph_runtime/database.py +0 -0
- {langgraph_api-0.12.0.dev20 → langgraph_api-0.12.0.dev21}/langgraph_runtime/lifespan.py +0 -0
- {langgraph_api-0.12.0.dev20 → langgraph_api-0.12.0.dev21}/langgraph_runtime/metrics.py +0 -0
- {langgraph_api-0.12.0.dev20 → langgraph_api-0.12.0.dev21}/langgraph_runtime/ops.py +0 -0
- {langgraph_api-0.12.0.dev20 → langgraph_api-0.12.0.dev21}/langgraph_runtime/queue.py +0 -0
- {langgraph_api-0.12.0.dev20 → langgraph_api-0.12.0.dev21}/langgraph_runtime/retry.py +0 -0
- {langgraph_api-0.12.0.dev20 → langgraph_api-0.12.0.dev21}/langgraph_runtime/routes.py +0 -0
- {langgraph_api-0.12.0.dev20 → langgraph_api-0.12.0.dev21}/langgraph_runtime/store.py +0 -0
- {langgraph_api-0.12.0.dev20 → langgraph_api-0.12.0.dev21}/logging.json +0 -0
- {langgraph_api-0.12.0.dev20 → langgraph_api-0.12.0.dev21}/openapi.json +0 -0
- {langgraph_api-0.12.0.dev20 → langgraph_api-0.12.0.dev21}/pyproject.toml +0 -0
- {langgraph_api-0.12.0.dev20 → langgraph_api-0.12.0.dev21}/scripts/build_wheel.py +0 -0
- {langgraph_api-0.12.0.dev20 → langgraph_api-0.12.0.dev21}/scripts/create_license.py +0 -0
- {langgraph_api-0.12.0.dev20 → langgraph_api-0.12.0.dev21}/scripts/run_a2a_tck.py +0 -0
- {langgraph_api-0.12.0.dev20 → langgraph_api-0.12.0.dev21}/uv.lock +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.dev20 → 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:
|
|
@@ -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"],
|
|
@@ -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
|
|
{langgraph_api-0.12.0.dev20 → langgraph_api-0.12.0.dev21}/langgraph_api/event_streaming/service.py
RENAMED
|
@@ -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
|
|
@@ -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}"
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
__version__ = "0.12.0.dev20"
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{langgraph_api-0.12.0.dev20 → langgraph_api-0.12.0.dev21}/benchmark/benchmark-runners/assistant.ts
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{langgraph_api-0.12.0.dev20 → langgraph_api-0.12.0.dev21}/benchmark/benchmark-runners/benchmarks.ts
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{langgraph_api-0.12.0.dev20 → langgraph_api-0.12.0.dev21}/benchmark/benchmark-runners/log-failure.ts
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{langgraph_api-0.12.0.dev20 → langgraph_api-0.12.0.dev21}/benchmark/benchmark-runners/thread.ts
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{langgraph_api-0.12.0.dev20 → langgraph_api-0.12.0.dev21}/benchmark/benchmark-runners/types.ts
RENAMED
|
File without changes
|
{langgraph_api-0.12.0.dev20 → langgraph_api-0.12.0.dev21}/benchmark/benchmark-runners/wait_write.ts
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{langgraph_api-0.12.0.dev20 → langgraph_api-0.12.0.dev21}/benchmark/continuous/pyproject.toml
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{langgraph_api-0.12.0.dev20 → langgraph_api-0.12.0.dev21}/benchmark/reporting/dd_reporting.py
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
|
{langgraph_api-0.12.0.dev20 → langgraph_api-0.12.0.dev21}/langgraph_api/_checkpointer/__init__.py
RENAMED
|
File without changes
|
{langgraph_api-0.12.0.dev20 → langgraph_api-0.12.0.dev21}/langgraph_api/_checkpointer/_adapter.py
RENAMED
|
File without changes
|
{langgraph_api-0.12.0.dev20 → langgraph_api-0.12.0.dev21}/langgraph_api/_checkpointer/protocol.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{langgraph_api-0.12.0.dev20 → langgraph_api-0.12.0.dev21}/langgraph_api/api/mcp/_constants.py
RENAMED
|
File without changes
|
{langgraph_api-0.12.0.dev20 → langgraph_api-0.12.0.dev21}/langgraph_api/api/mcp/_handlers.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{langgraph_api-0.12.0.dev20 → langgraph_api-0.12.0.dev21}/langgraph_api/api/mcp/_sanitizers.py
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
|
{langgraph_api-0.12.0.dev20 → langgraph_api-0.12.0.dev21}/langgraph_api/auth/langsmith/__init__.py
RENAMED
|
File without changes
|
{langgraph_api-0.12.0.dev20 → langgraph_api-0.12.0.dev21}/langgraph_api/auth/langsmith/backend.py
RENAMED
|
File without changes
|
{langgraph_api-0.12.0.dev20 → langgraph_api-0.12.0.dev21}/langgraph_api/auth/langsmith/client.py
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
|
{langgraph_api-0.12.0.dev20 → langgraph_api-0.12.0.dev21}/langgraph_api/encryption/__init__.py
RENAMED
|
File without changes
|
{langgraph_api-0.12.0.dev20 → langgraph_api-0.12.0.dev21}/langgraph_api/encryption/aes_json.py
RENAMED
|
File without changes
|
{langgraph_api-0.12.0.dev20 → langgraph_api-0.12.0.dev21}/langgraph_api/encryption/context.py
RENAMED
|
File without changes
|
{langgraph_api-0.12.0.dev20 → langgraph_api-0.12.0.dev21}/langgraph_api/encryption/custom.py
RENAMED
|
File without changes
|
{langgraph_api-0.12.0.dev20 → langgraph_api-0.12.0.dev21}/langgraph_api/encryption/middleware.py
RENAMED
|
File without changes
|
{langgraph_api-0.12.0.dev20 → langgraph_api-0.12.0.dev21}/langgraph_api/encryption/shared.py
RENAMED
|
File without changes
|
|
File without changes
|
{langgraph_api-0.12.0.dev20 → langgraph_api-0.12.0.dev21}/langgraph_api/event_streaming/__init__.py
RENAMED
|
File without changes
|
|
File without changes
|