langgraph-api 0.18.0.dev2__tar.gz → 0.18.0.dev4__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.18.0.dev2 → langgraph_api-0.18.0.dev4}/Makefile +26 -20
- {langgraph_api-0.18.0.dev2 → langgraph_api-0.18.0.dev4}/PKG-INFO +1 -1
- {langgraph_api-0.18.0.dev2 → langgraph_api-0.18.0.dev4}/benchmark/REPORTS.md +2 -2
- langgraph_api-0.18.0.dev4/langgraph_api/__init__.py +1 -0
- {langgraph_api-0.18.0.dev2 → langgraph_api-0.18.0.dev4}/langgraph_api/api/a2a.py +93 -10
- {langgraph_api-0.18.0.dev2 → langgraph_api-0.18.0.dev4}/langgraph_api/api/event_streaming.py +81 -9
- langgraph_api-0.18.0.dev4/langgraph_api/api/mcp/_calls.py +29 -0
- langgraph_api-0.18.0.dev4/langgraph_api/api/mcp/_constants.py +28 -0
- {langgraph_api-0.18.0.dev2 → langgraph_api-0.18.0.dev4}/langgraph_api/api/mcp/_handlers.py +146 -196
- langgraph_api-0.18.0.dev4/langgraph_api/api/mcp/_outcome.py +43 -0
- langgraph_api-0.18.0.dev4/langgraph_api/api/mcp/_protocol.py +224 -0
- {langgraph_api-0.18.0.dev2 → langgraph_api-0.18.0.dev4}/langgraph_api/config/__init__.py +38 -4
- {langgraph_api-0.18.0.dev2 → langgraph_api-0.18.0.dev4}/langgraph_api/cron_scheduler.py +2 -2
- langgraph_api-0.18.0.dev4/langgraph_api/drain.py +164 -0
- {langgraph_api-0.18.0.dev2 → langgraph_api-0.18.0.dev4}/langgraph_api/event_streaming/service.py +130 -133
- {langgraph_api-0.18.0.dev2 → langgraph_api-0.18.0.dev4}/langgraph_api/event_streaming/session.py +11 -6
- langgraph_api-0.18.0.dev4/langgraph_api/executor/__init__.py +9 -0
- langgraph_api-0.18.0.dev4/langgraph_api/executor/__main__.py +343 -0
- {langgraph_api-0.18.0.dev2 → langgraph_api-0.18.0.dev4}/langgraph_api/feature_flags.py +6 -0
- {langgraph_api-0.18.0.dev2 → langgraph_api-0.18.0.dev4}/langgraph_api/graph.py +12 -2
- {langgraph_api-0.18.0.dev2 → langgraph_api-0.18.0.dev4}/langgraph_api/grpc/ops/runs.py +41 -5
- {langgraph_api-0.18.0.dev2 → langgraph_api-0.18.0.dev4}/langgraph_api/grpc/ops/threads.py +54 -6
- {langgraph_api-0.18.0.dev2 → langgraph_api-0.18.0.dev4}/langgraph_api/metrics_otlp.py +8 -0
- {langgraph_api-0.18.0.dev2 → langgraph_api-0.18.0.dev4}/langgraph_api/models/run.py +11 -3
- {langgraph_api-0.18.0.dev2 → langgraph_api-0.18.0.dev4}/langgraph_api/queue_entrypoint.py +13 -1
- {langgraph_api-0.18.0.dev2 → langgraph_api-0.18.0.dev4}/langgraph_api/self_hosted_logs.py +3 -1
- {langgraph_api-0.18.0.dev2 → langgraph_api-0.18.0.dev4}/langgraph_api/self_hosted_metrics.py +1 -1
- {langgraph_api-0.18.0.dev2 → langgraph_api-0.18.0.dev4}/langgraph_api/stream.py +49 -3
- {langgraph_api-0.18.0.dev2 → langgraph_api-0.18.0.dev4}/langgraph_api/timing/__init__.py +16 -0
- langgraph_api-0.18.0.dev4/langgraph_api/timing/startup.py +184 -0
- {langgraph_api-0.18.0.dev2 → langgraph_api-0.18.0.dev4}/langgraph_api/timing/timer.py +16 -2
- {langgraph_api-0.18.0.dev2 → langgraph_api-0.18.0.dev4}/langgraph_api/utils/headers.py +20 -3
- {langgraph_api-0.18.0.dev2 → langgraph_api-0.18.0.dev4}/langgraph_api/validation.py +11 -5
- {langgraph_api-0.18.0.dev2 → langgraph_api-0.18.0.dev4}/langgraph_api/worker.py +146 -13
- {langgraph_api-0.18.0.dev2 → langgraph_api-0.18.0.dev4}/langgraph_api/worker_runtime.py +124 -4
- {langgraph_api-0.18.0.dev2 → langgraph_api-0.18.0.dev4}/langgraph_grpc_common/proto/__init__.py +4 -4
- langgraph_api-0.18.0.dev4/langgraph_grpc_common/proto/orchestrator_pb2.py +50 -0
- langgraph_api-0.18.0.dev2/langgraph_grpc_common/proto/runner_pb2.pyi → langgraph_api-0.18.0.dev4/langgraph_grpc_common/proto/orchestrator_pb2.pyi +4 -4
- langgraph_api-0.18.0.dev4/langgraph_grpc_common/proto/orchestrator_pb2_grpc.py +108 -0
- langgraph_api-0.18.0.dev4/langgraph_grpc_common/proto/orchestrator_pb2_grpc.pyi +82 -0
- {langgraph_api-0.18.0.dev2 → langgraph_api-0.18.0.dev4}/openapi.json +20 -0
- langgraph_api-0.18.0.dev2/langgraph_api/__init__.py +0 -1
- langgraph_api-0.18.0.dev2/langgraph_api/api/mcp/_constants.py +0 -19
- langgraph_api-0.18.0.dev2/langgraph_api/runner/__init__.py +0 -10
- langgraph_api-0.18.0.dev2/langgraph_api/runner/__main__.py +0 -275
- langgraph_api-0.18.0.dev2/langgraph_grpc_common/proto/runner_pb2.py +0 -50
- langgraph_api-0.18.0.dev2/langgraph_grpc_common/proto/runner_pb2_grpc.py +0 -108
- langgraph_api-0.18.0.dev2/langgraph_grpc_common/proto/runner_pb2_grpc.pyi +0 -73
- {langgraph_api-0.18.0.dev2 → langgraph_api-0.18.0.dev4}/.gitignore +0 -0
- {langgraph_api-0.18.0.dev2 → langgraph_api-0.18.0.dev4}/LICENSE +0 -0
- {langgraph_api-0.18.0.dev2 → langgraph_api-0.18.0.dev4}/README.md +0 -0
- {langgraph_api-0.18.0.dev2 → langgraph_api-0.18.0.dev4}/benchmark/.gitignore +0 -0
- {langgraph_api-0.18.0.dev2 → langgraph_api-0.18.0.dev4}/benchmark/Makefile +0 -0
- {langgraph_api-0.18.0.dev2 → langgraph_api-0.18.0.dev4}/benchmark/README.md +0 -0
- {langgraph_api-0.18.0.dev2 → langgraph_api-0.18.0.dev4}/benchmark/benchmark-runners/assistant.ts +0 -0
- {langgraph_api-0.18.0.dev2 → langgraph_api-0.18.0.dev4}/benchmark/benchmark-runners/benchmark-runner.ts +0 -0
- {langgraph_api-0.18.0.dev2 → langgraph_api-0.18.0.dev4}/benchmark/benchmark-runners/benchmark_profiles.ts +0 -0
- {langgraph_api-0.18.0.dev2 → langgraph_api-0.18.0.dev4}/benchmark/benchmark-runners/benchmarks.ts +0 -0
- {langgraph_api-0.18.0.dev2 → langgraph_api-0.18.0.dev4}/benchmark/benchmark-runners/cancel_first_second_completes.ts +0 -0
- {langgraph_api-0.18.0.dev2 → langgraph_api-0.18.0.dev4}/benchmark/benchmark-runners/classify-error.test.js +0 -0
- {langgraph_api-0.18.0.dev2 → langgraph_api-0.18.0.dev4}/benchmark/benchmark-runners/classify-error.ts +0 -0
- {langgraph_api-0.18.0.dev2 → langgraph_api-0.18.0.dev4}/benchmark/benchmark-runners/delta-turns-lib.test.js +0 -0
- {langgraph_api-0.18.0.dev2 → langgraph_api-0.18.0.dev4}/benchmark/benchmark-runners/delta-turns-lib.ts +0 -0
- {langgraph_api-0.18.0.dev2 → langgraph_api-0.18.0.dev4}/benchmark/benchmark-runners/delta_turns.ts +0 -0
- {langgraph_api-0.18.0.dev2 → langgraph_api-0.18.0.dev4}/benchmark/benchmark-runners/enqueued_runs_order.ts +0 -0
- {langgraph_api-0.18.0.dev2 → langgraph_api-0.18.0.dev4}/benchmark/benchmark-runners/interrupt_resume.ts +0 -0
- {langgraph_api-0.18.0.dev2 → langgraph_api-0.18.0.dev4}/benchmark/benchmark-runners/log-failure.ts +0 -0
- {langgraph_api-0.18.0.dev2 → langgraph_api-0.18.0.dev4}/benchmark/benchmark-runners/meta_workload.ts +0 -0
- {langgraph_api-0.18.0.dev2 → langgraph_api-0.18.0.dev4}/benchmark/benchmark-runners/store.ts +0 -0
- {langgraph_api-0.18.0.dev2 → langgraph_api-0.18.0.dev4}/benchmark/benchmark-runners/stream_write.ts +0 -0
- {langgraph_api-0.18.0.dev2 → langgraph_api-0.18.0.dev4}/benchmark/benchmark-runners/thread.ts +0 -0
- {langgraph_api-0.18.0.dev2 → langgraph_api-0.18.0.dev4}/benchmark/benchmark-runners/thread_runs_metadata_search.ts +0 -0
- {langgraph_api-0.18.0.dev2 → langgraph_api-0.18.0.dev4}/benchmark/benchmark-runners/threads_search_metadata.ts +0 -0
- {langgraph_api-0.18.0.dev2 → langgraph_api-0.18.0.dev4}/benchmark/benchmark-runners/types.ts +0 -0
- {langgraph_api-0.18.0.dev2 → langgraph_api-0.18.0.dev4}/benchmark/benchmark-runners/wait_write.ts +0 -0
- {langgraph_api-0.18.0.dev2 → langgraph_api-0.18.0.dev4}/benchmark/capacity-ci.js +0 -0
- {langgraph_api-0.18.0.dev2 → langgraph_api-0.18.0.dev4}/benchmark/capacity-ci.test.js +0 -0
- {langgraph_api-0.18.0.dev2 → langgraph_api-0.18.0.dev4}/benchmark/clean-cli.js +0 -0
- {langgraph_api-0.18.0.dev2 → langgraph_api-0.18.0.dev4}/benchmark/clean.js +0 -0
- {langgraph_api-0.18.0.dev2 → langgraph_api-0.18.0.dev4}/benchmark/continuous/README.md +0 -0
- {langgraph_api-0.18.0.dev2 → langgraph_api-0.18.0.dev4}/benchmark/continuous/pyproject.toml +0 -0
- {langgraph_api-0.18.0.dev2 → langgraph_api-0.18.0.dev4}/benchmark/continuous/runner.py +0 -0
- {langgraph_api-0.18.0.dev2 → langgraph_api-0.18.0.dev4}/benchmark/continuous/uv.lock +0 -0
- {langgraph_api-0.18.0.dev2 → langgraph_api-0.18.0.dev4}/benchmark/daily-report.js +0 -0
- {langgraph_api-0.18.0.dev2 → langgraph_api-0.18.0.dev4}/benchmark/daily-report.test.js +0 -0
- {langgraph_api-0.18.0.dev2 → langgraph_api-0.18.0.dev4}/benchmark/delta-report.js +0 -0
- {langgraph_api-0.18.0.dev2 → langgraph_api-0.18.0.dev4}/benchmark/delta-report.test.js +0 -0
- {langgraph_api-0.18.0.dev2 → langgraph_api-0.18.0.dev4}/benchmark/graphs.js +0 -0
- {langgraph_api-0.18.0.dev2 → langgraph_api-0.18.0.dev4}/benchmark/history.js +0 -0
- {langgraph_api-0.18.0.dev2 → langgraph_api-0.18.0.dev4}/benchmark/history.test.js +0 -0
- {langgraph_api-0.18.0.dev2 → langgraph_api-0.18.0.dev4}/benchmark/host-v2.js +0 -0
- {langgraph_api-0.18.0.dev2 → langgraph_api-0.18.0.dev4}/benchmark/host-v2.test.js +0 -0
- {langgraph_api-0.18.0.dev2 → langgraph_api-0.18.0.dev4}/benchmark/multer.test.js +0 -0
- {langgraph_api-0.18.0.dev2 → langgraph_api-0.18.0.dev4}/benchmark/package.json +0 -0
- {langgraph_api-0.18.0.dev2 → langgraph_api-0.18.0.dev4}/benchmark/ramp.js +0 -0
- {langgraph_api-0.18.0.dev2 → langgraph_api-0.18.0.dev4}/benchmark/reporting/dd_reporting.py +0 -0
- {langgraph_api-0.18.0.dev2 → langgraph_api-0.18.0.dev4}/benchmark/runner-descriptions.js +0 -0
- {langgraph_api-0.18.0.dev2 → langgraph_api-0.18.0.dev4}/benchmark/server-metrics.js +0 -0
- {langgraph_api-0.18.0.dev2 → langgraph_api-0.18.0.dev4}/benchmark/server-metrics.test.js +0 -0
- {langgraph_api-0.18.0.dev2 → langgraph_api-0.18.0.dev4}/benchmark/slack.js +0 -0
- {langgraph_api-0.18.0.dev2 → langgraph_api-0.18.0.dev4}/benchmark/staircase.py +0 -0
- {langgraph_api-0.18.0.dev2 → langgraph_api-0.18.0.dev4}/benchmark/staircase_step_k6.js +0 -0
- {langgraph_api-0.18.0.dev2 → langgraph_api-0.18.0.dev4}/benchmark/tsconfig.json +0 -0
- {langgraph_api-0.18.0.dev2 → langgraph_api-0.18.0.dev4}/benchmark/update-revision.js +0 -0
- {langgraph_api-0.18.0.dev2 → langgraph_api-0.18.0.dev4}/benchmark/weather.js +0 -0
- {langgraph_api-0.18.0.dev2 → langgraph_api-0.18.0.dev4}/benchmark/yarn.lock +0 -0
- {langgraph_api-0.18.0.dev2 → langgraph_api-0.18.0.dev4}/constraints.txt +0 -0
- {langgraph_api-0.18.0.dev2 → langgraph_api-0.18.0.dev4}/custom_store.sql +0 -0
- {langgraph_api-0.18.0.dev2 → langgraph_api-0.18.0.dev4}/forbidden.txt +0 -0
- {langgraph_api-0.18.0.dev2 → langgraph_api-0.18.0.dev4}/hatch_build.py +0 -0
- {langgraph_api-0.18.0.dev2 → langgraph_api-0.18.0.dev4}/healthcheck.py +0 -0
- {langgraph_api-0.18.0.dev2 → langgraph_api-0.18.0.dev4}/langgraph-cloud-debugging-20260210132856.zip +0 -0
- {langgraph_api-0.18.0.dev2 → langgraph_api-0.18.0.dev4}/langgraph_api/_checkpointer/__init__.py +0 -0
- {langgraph_api-0.18.0.dev2 → langgraph_api-0.18.0.dev4}/langgraph_api/_checkpointer/_adapter.py +0 -0
- {langgraph_api-0.18.0.dev2 → langgraph_api-0.18.0.dev4}/langgraph_api/_checkpointer/protocol.py +0 -0
- {langgraph_api-0.18.0.dev2 → langgraph_api-0.18.0.dev4}/langgraph_api/_factory_utils.py +0 -0
- {langgraph_api-0.18.0.dev2 → langgraph_api-0.18.0.dev4}/langgraph_api/api/__init__.py +0 -0
- {langgraph_api-0.18.0.dev2 → langgraph_api-0.18.0.dev4}/langgraph_api/api/a2ui.py +0 -0
- {langgraph_api-0.18.0.dev2 → langgraph_api-0.18.0.dev4}/langgraph_api/api/a2ui_schemas/README.md +0 -0
- {langgraph_api-0.18.0.dev2 → langgraph_api-0.18.0.dev4}/langgraph_api/api/a2ui_schemas/client_capabilities.json +0 -0
- {langgraph_api-0.18.0.dev2 → langgraph_api-0.18.0.dev4}/langgraph_api/api/a2ui_schemas/client_data_model.json +0 -0
- {langgraph_api-0.18.0.dev2 → langgraph_api-0.18.0.dev4}/langgraph_api/api/a2ui_schemas/client_to_server.json +0 -0
- {langgraph_api-0.18.0.dev2 → langgraph_api-0.18.0.dev4}/langgraph_api/api/a2ui_schemas/server_to_client.json +0 -0
- {langgraph_api-0.18.0.dev2 → langgraph_api-0.18.0.dev4}/langgraph_api/api/assistants.py +0 -0
- {langgraph_api-0.18.0.dev2 → langgraph_api-0.18.0.dev4}/langgraph_api/api/mcp/__init__.py +0 -0
- {langgraph_api-0.18.0.dev2 → langgraph_api-0.18.0.dev4}/langgraph_api/api/mcp/_models.py +0 -0
- {langgraph_api-0.18.0.dev2 → langgraph_api-0.18.0.dev4}/langgraph_api/api/mcp/_routes.py +0 -0
- {langgraph_api-0.18.0.dev2 → langgraph_api-0.18.0.dev4}/langgraph_api/api/mcp/_sanitizers.py +0 -0
- {langgraph_api-0.18.0.dev2 → langgraph_api-0.18.0.dev4}/langgraph_api/api/meta.py +0 -0
- {langgraph_api-0.18.0.dev2 → langgraph_api-0.18.0.dev4}/langgraph_api/api/openapi.py +0 -0
- {langgraph_api-0.18.0.dev2 → langgraph_api-0.18.0.dev4}/langgraph_api/api/profile.py +0 -0
- {langgraph_api-0.18.0.dev2 → langgraph_api-0.18.0.dev4}/langgraph_api/api/runs.py +0 -0
- {langgraph_api-0.18.0.dev2 → langgraph_api-0.18.0.dev4}/langgraph_api/api/store.py +0 -0
- {langgraph_api-0.18.0.dev2 → langgraph_api-0.18.0.dev4}/langgraph_api/api/threads.py +0 -0
- {langgraph_api-0.18.0.dev2 → langgraph_api-0.18.0.dev4}/langgraph_api/api/ui.py +0 -0
- {langgraph_api-0.18.0.dev2 → langgraph_api-0.18.0.dev4}/langgraph_api/asgi_transport.py +0 -0
- {langgraph_api-0.18.0.dev2 → langgraph_api-0.18.0.dev4}/langgraph_api/asyncio.py +0 -0
- {langgraph_api-0.18.0.dev2 → langgraph_api-0.18.0.dev4}/langgraph_api/auth/__init__.py +0 -0
- {langgraph_api-0.18.0.dev2 → langgraph_api-0.18.0.dev4}/langgraph_api/auth/custom.py +0 -0
- {langgraph_api-0.18.0.dev2 → langgraph_api-0.18.0.dev4}/langgraph_api/auth/errors.py +0 -0
- {langgraph_api-0.18.0.dev2 → langgraph_api-0.18.0.dev4}/langgraph_api/auth/langsmith/__init__.py +0 -0
- {langgraph_api-0.18.0.dev2 → langgraph_api-0.18.0.dev4}/langgraph_api/auth/langsmith/backend.py +0 -0
- {langgraph_api-0.18.0.dev2 → langgraph_api-0.18.0.dev4}/langgraph_api/auth/langsmith/client.py +0 -0
- {langgraph_api-0.18.0.dev2 → langgraph_api-0.18.0.dev4}/langgraph_api/auth/middleware.py +0 -0
- {langgraph_api-0.18.0.dev2 → langgraph_api-0.18.0.dev4}/langgraph_api/auth/noop.py +0 -0
- {langgraph_api-0.18.0.dev2 → langgraph_api-0.18.0.dev4}/langgraph_api/auth/studio_user.py +0 -0
- {langgraph_api-0.18.0.dev2 → langgraph_api-0.18.0.dev4}/langgraph_api/beacon_data_plane_jwt_auth.py +0 -0
- {langgraph_api-0.18.0.dev2 → langgraph_api-0.18.0.dev4}/langgraph_api/cache.py +0 -0
- {langgraph_api-0.18.0.dev2 → langgraph_api-0.18.0.dev4}/langgraph_api/cli.py +0 -0
- {langgraph_api-0.18.0.dev2 → langgraph_api-0.18.0.dev4}/langgraph_api/command.py +0 -0
- {langgraph_api-0.18.0.dev2 → langgraph_api-0.18.0.dev4}/langgraph_api/config/_parse.py +0 -0
- {langgraph_api-0.18.0.dev2 → langgraph_api-0.18.0.dev4}/langgraph_api/config/schemas.py +0 -0
- {langgraph_api-0.18.0.dev2 → langgraph_api-0.18.0.dev4}/langgraph_api/encryption/__init__.py +0 -0
- {langgraph_api-0.18.0.dev2 → langgraph_api-0.18.0.dev4}/langgraph_api/encryption/aes_json.py +0 -0
- {langgraph_api-0.18.0.dev2 → langgraph_api-0.18.0.dev4}/langgraph_api/encryption/context.py +0 -0
- {langgraph_api-0.18.0.dev2 → langgraph_api-0.18.0.dev4}/langgraph_api/encryption/custom.py +0 -0
- {langgraph_api-0.18.0.dev2 → langgraph_api-0.18.0.dev4}/langgraph_api/encryption/middleware.py +0 -0
- {langgraph_api-0.18.0.dev2 → langgraph_api-0.18.0.dev4}/langgraph_api/encryption/shared.py +0 -0
- {langgraph_api-0.18.0.dev2 → langgraph_api-0.18.0.dev4}/langgraph_api/errors.py +0 -0
- {langgraph_api-0.18.0.dev2 → langgraph_api-0.18.0.dev4}/langgraph_api/event_streaming/__init__.py +0 -0
- {langgraph_api-0.18.0.dev2 → langgraph_api-0.18.0.dev4}/langgraph_api/event_streaming/capabilities.py +0 -0
- {langgraph_api-0.18.0.dev2 → langgraph_api-0.18.0.dev4}/langgraph_api/event_streaming/constants.py +0 -0
- {langgraph_api-0.18.0.dev2 → langgraph_api-0.18.0.dev4}/langgraph_api/event_streaming/event_normalizers.py +0 -0
- {langgraph_api-0.18.0.dev2 → langgraph_api-0.18.0.dev4}/langgraph_api/event_streaming/namespace.py +0 -0
- {langgraph_api-0.18.0.dev2 → langgraph_api-0.18.0.dev4}/langgraph_api/event_streaming/state_normalizers.py +0 -0
- {langgraph_api-0.18.0.dev2 → langgraph_api-0.18.0.dev4}/langgraph_api/event_streaming/types.py +0 -0
- {langgraph_api-0.18.0.dev2 → langgraph_api-0.18.0.dev4}/langgraph_api/grpc/__init__.py +0 -0
- {langgraph_api-0.18.0.dev2 → langgraph_api-0.18.0.dev4}/langgraph_api/grpc/client.py +0 -0
- {langgraph_api-0.18.0.dev2 → langgraph_api-0.18.0.dev4}/langgraph_api/grpc/generated/core_api_pb2.pyi +0 -0
- {langgraph_api-0.18.0.dev2 → langgraph_api-0.18.0.dev4}/langgraph_api/grpc/ops/__init__.py +0 -0
- {langgraph_api-0.18.0.dev2 → langgraph_api-0.18.0.dev4}/langgraph_api/grpc/ops/assistants.py +0 -0
- {langgraph_api-0.18.0.dev2 → langgraph_api-0.18.0.dev4}/langgraph_api/grpc/ops/cache.py +0 -0
- {langgraph_api-0.18.0.dev2 → langgraph_api-0.18.0.dev4}/langgraph_api/grpc/ops/crons.py +0 -0
- {langgraph_api-0.18.0.dev2 → langgraph_api-0.18.0.dev4}/langgraph_api/grpc/server.py +0 -0
- {langgraph_api-0.18.0.dev2 → langgraph_api-0.18.0.dev4}/langgraph_api/grpc/servicers/__init__.py +0 -0
- {langgraph_api-0.18.0.dev2 → langgraph_api-0.18.0.dev4}/langgraph_api/grpc/servicers/checkpointer.py +0 -0
- {langgraph_api-0.18.0.dev2 → langgraph_api-0.18.0.dev4}/langgraph_api/grpc/servicers/encryption.py +0 -0
- {langgraph_api-0.18.0.dev2 → langgraph_api-0.18.0.dev4}/langgraph_api/http.py +0 -0
- {langgraph_api-0.18.0.dev2 → langgraph_api-0.18.0.dev4}/langgraph_api/http_metrics.py +0 -0
- {langgraph_api-0.18.0.dev2 → langgraph_api-0.18.0.dev4}/langgraph_api/http_metrics_utils.py +0 -0
- {langgraph_api-0.18.0.dev2 → langgraph_api-0.18.0.dev4}/langgraph_api/js/.gitignore +0 -0
- {langgraph_api-0.18.0.dev2 → langgraph_api-0.18.0.dev4}/langgraph_api/js/.prettierrc +0 -0
- {langgraph_api-0.18.0.dev2 → langgraph_api-0.18.0.dev4}/langgraph_api/js/.yarnclean +0 -0
- {langgraph_api-0.18.0.dev2 → langgraph_api-0.18.0.dev4}/langgraph_api/js/__init__.py +0 -0
- {langgraph_api-0.18.0.dev2 → langgraph_api-0.18.0.dev4}/langgraph_api/js/base.py +0 -0
- {langgraph_api-0.18.0.dev2 → langgraph_api-0.18.0.dev4}/langgraph_api/js/build.mts +0 -0
- {langgraph_api-0.18.0.dev2 → langgraph_api-0.18.0.dev4}/langgraph_api/js/client.http.mts +0 -0
- {langgraph_api-0.18.0.dev2 → langgraph_api-0.18.0.dev4}/langgraph_api/js/client.mts +0 -0
- {langgraph_api-0.18.0.dev2 → langgraph_api-0.18.0.dev4}/langgraph_api/js/errors.py +0 -0
- {langgraph_api-0.18.0.dev2 → langgraph_api-0.18.0.dev4}/langgraph_api/js/global.d.ts +0 -0
- {langgraph_api-0.18.0.dev2 → langgraph_api-0.18.0.dev4}/langgraph_api/js/package.json +0 -0
- {langgraph_api-0.18.0.dev2 → langgraph_api-0.18.0.dev4}/langgraph_api/js/remote.py +0 -0
- {langgraph_api-0.18.0.dev2 → langgraph_api-0.18.0.dev4}/langgraph_api/js/schema.py +0 -0
- {langgraph_api-0.18.0.dev2 → langgraph_api-0.18.0.dev4}/langgraph_api/js/src/auth-mutations.mts +0 -0
- {langgraph_api-0.18.0.dev2 → langgraph_api-0.18.0.dev4}/langgraph_api/js/src/graph.mts +0 -0
- {langgraph_api-0.18.0.dev2 → langgraph_api-0.18.0.dev4}/langgraph_api/js/src/load.hooks.mjs +0 -0
- {langgraph_api-0.18.0.dev2 → langgraph_api-0.18.0.dev4}/langgraph_api/js/src/preload.mjs +0 -0
- {langgraph_api-0.18.0.dev2 → langgraph_api-0.18.0.dev4}/langgraph_api/js/src/utils/experiment-tracing.mts +0 -0
- {langgraph_api-0.18.0.dev2 → langgraph_api-0.18.0.dev4}/langgraph_api/js/src/utils/files.mts +0 -0
- {langgraph_api-0.18.0.dev2 → langgraph_api-0.18.0.dev4}/langgraph_api/js/src/utils/importMap.mts +0 -0
- {langgraph_api-0.18.0.dev2 → langgraph_api-0.18.0.dev4}/langgraph_api/js/src/utils/pythonSchemas.mts +0 -0
- {langgraph_api-0.18.0.dev2 → langgraph_api-0.18.0.dev4}/langgraph_api/js/src/utils/serde.mts +0 -0
- {langgraph_api-0.18.0.dev2 → langgraph_api-0.18.0.dev4}/langgraph_api/js/sse.py +0 -0
- {langgraph_api-0.18.0.dev2 → langgraph_api-0.18.0.dev4}/langgraph_api/js/traceblock.mts +0 -0
- {langgraph_api-0.18.0.dev2 → langgraph_api-0.18.0.dev4}/langgraph_api/js/tsconfig.json +0 -0
- {langgraph_api-0.18.0.dev2 → langgraph_api-0.18.0.dev4}/langgraph_api/js/ui.py +0 -0
- {langgraph_api-0.18.0.dev2 → langgraph_api-0.18.0.dev4}/langgraph_api/js/yarn.lock +0 -0
- {langgraph_api-0.18.0.dev2 → langgraph_api-0.18.0.dev4}/langgraph_api/lc_security/__init__.py +0 -0
- {langgraph_api-0.18.0.dev2 → langgraph_api-0.18.0.dev4}/langgraph_api/lc_security/exceptions.py +0 -0
- {langgraph_api-0.18.0.dev2 → langgraph_api-0.18.0.dev4}/langgraph_api/lc_security/policy.py +0 -0
- {langgraph_api-0.18.0.dev2 → langgraph_api-0.18.0.dev4}/langgraph_api/lc_security/transport.py +0 -0
- {langgraph_api-0.18.0.dev2 → langgraph_api-0.18.0.dev4}/langgraph_api/logging.py +0 -0
- {langgraph_api-0.18.0.dev2 → langgraph_api-0.18.0.dev4}/langgraph_api/metadata.py +0 -0
- {langgraph_api-0.18.0.dev2 → langgraph_api-0.18.0.dev4}/langgraph_api/metrics_collector.py +0 -0
- {langgraph_api-0.18.0.dev2 → langgraph_api-0.18.0.dev4}/langgraph_api/middleware/__init__.py +0 -0
- {langgraph_api-0.18.0.dev2 → langgraph_api-0.18.0.dev4}/langgraph_api/middleware/ensure_store.py +0 -0
- {langgraph_api-0.18.0.dev2 → langgraph_api-0.18.0.dev4}/langgraph_api/middleware/http_logger.py +0 -0
- {langgraph_api-0.18.0.dev2 → langgraph_api-0.18.0.dev4}/langgraph_api/middleware/private_network.py +0 -0
- {langgraph_api-0.18.0.dev2 → langgraph_api-0.18.0.dev4}/langgraph_api/middleware/request_id.py +0 -0
- {langgraph_api-0.18.0.dev2 → langgraph_api-0.18.0.dev4}/langgraph_api/models/__init__.py +0 -0
- {langgraph_api-0.18.0.dev2 → langgraph_api-0.18.0.dev4}/langgraph_api/otel_context.py +0 -0
- {langgraph_api-0.18.0.dev2 → langgraph_api-0.18.0.dev4}/langgraph_api/patch.py +0 -0
- {langgraph_api-0.18.0.dev2 → langgraph_api-0.18.0.dev4}/langgraph_api/release_tags.py +0 -0
- {langgraph_api-0.18.0.dev2 → langgraph_api-0.18.0.dev4}/langgraph_api/route.py +0 -0
- {langgraph_api-0.18.0.dev2 → langgraph_api-0.18.0.dev4}/langgraph_api/schema.py +0 -0
- {langgraph_api-0.18.0.dev2 → langgraph_api-0.18.0.dev4}/langgraph_api/serde.py +0 -0
- {langgraph_api-0.18.0.dev2 → langgraph_api-0.18.0.dev4}/langgraph_api/server.py +0 -0
- {langgraph_api-0.18.0.dev2 → langgraph_api-0.18.0.dev4}/langgraph_api/sse.py +0 -0
- {langgraph_api-0.18.0.dev2 → langgraph_api-0.18.0.dev4}/langgraph_api/state.py +0 -0
- {langgraph_api-0.18.0.dev2 → langgraph_api-0.18.0.dev4}/langgraph_api/store.py +0 -0
- {langgraph_api-0.18.0.dev2 → langgraph_api-0.18.0.dev4}/langgraph_api/stream_v2.py +0 -0
- {langgraph_api-0.18.0.dev2 → langgraph_api-0.18.0.dev4}/langgraph_api/timing/profiler.py +0 -0
- {langgraph_api-0.18.0.dev2 → langgraph_api-0.18.0.dev4}/langgraph_api/traceblock.py +0 -0
- {langgraph_api-0.18.0.dev2 → langgraph_api-0.18.0.dev4}/langgraph_api/tracing_session.py +0 -0
- {langgraph_api-0.18.0.dev2 → langgraph_api-0.18.0.dev4}/langgraph_api/tunneling/cloudflare.py +0 -0
- {langgraph_api-0.18.0.dev2 → langgraph_api-0.18.0.dev4}/langgraph_api/utils/__init__.py +0 -0
- {langgraph_api-0.18.0.dev2 → langgraph_api-0.18.0.dev4}/langgraph_api/utils/cache.py +0 -0
- {langgraph_api-0.18.0.dev2 → langgraph_api-0.18.0.dev4}/langgraph_api/utils/config.py +0 -0
- {langgraph_api-0.18.0.dev2 → langgraph_api-0.18.0.dev4}/langgraph_api/utils/errors.py +0 -0
- {langgraph_api-0.18.0.dev2 → langgraph_api-0.18.0.dev4}/langgraph_api/utils/extract.py +0 -0
- {langgraph_api-0.18.0.dev2 → langgraph_api-0.18.0.dev4}/langgraph_api/utils/future.py +0 -0
- {langgraph_api-0.18.0.dev2 → langgraph_api-0.18.0.dev4}/langgraph_api/utils/network.py +0 -0
- {langgraph_api-0.18.0.dev2 → langgraph_api-0.18.0.dev4}/langgraph_api/utils/retriable_client.py +0 -0
- {langgraph_api-0.18.0.dev2 → langgraph_api-0.18.0.dev4}/langgraph_api/utils/stream_codec.py +0 -0
- {langgraph_api-0.18.0.dev2 → langgraph_api-0.18.0.dev4}/langgraph_api/utils/uuids.py +0 -0
- {langgraph_api-0.18.0.dev2 → langgraph_api-0.18.0.dev4}/langgraph_api/webhook.py +0 -0
- {langgraph_api-0.18.0.dev2 → langgraph_api-0.18.0.dev4}/langgraph_grpc_common/__init__.py +0 -0
- {langgraph_api-0.18.0.dev2 → langgraph_api-0.18.0.dev4}/langgraph_grpc_common/checkpointer.py +0 -0
- {langgraph_api-0.18.0.dev2 → langgraph_api-0.18.0.dev4}/langgraph_grpc_common/conversion/__init__.py +0 -0
- {langgraph_api-0.18.0.dev2 → langgraph_api-0.18.0.dev4}/langgraph_grpc_common/conversion/_compat.py +0 -0
- {langgraph_api-0.18.0.dev2 → langgraph_api-0.18.0.dev4}/langgraph_grpc_common/conversion/checkpoint.py +0 -0
- {langgraph_api-0.18.0.dev2 → langgraph_api-0.18.0.dev4}/langgraph_grpc_common/conversion/config.py +0 -0
- {langgraph_api-0.18.0.dev2 → langgraph_api-0.18.0.dev4}/langgraph_grpc_common/conversion/durability.py +0 -0
- {langgraph_api-0.18.0.dev2 → langgraph_api-0.18.0.dev4}/langgraph_grpc_common/conversion/store.py +0 -0
- {langgraph_api-0.18.0.dev2 → langgraph_api-0.18.0.dev4}/langgraph_grpc_common/conversion/struct.py +0 -0
- {langgraph_api-0.18.0.dev2 → langgraph_api-0.18.0.dev4}/langgraph_grpc_common/conversion/value.py +0 -0
- {langgraph_api-0.18.0.dev2 → langgraph_api-0.18.0.dev4}/langgraph_grpc_common/proto/checkpointer_pb2.py +0 -0
- {langgraph_api-0.18.0.dev2 → langgraph_api-0.18.0.dev4}/langgraph_grpc_common/proto/checkpointer_pb2.pyi +0 -0
- {langgraph_api-0.18.0.dev2 → langgraph_api-0.18.0.dev4}/langgraph_grpc_common/proto/checkpointer_pb2_grpc.py +0 -0
- {langgraph_api-0.18.0.dev2 → langgraph_api-0.18.0.dev4}/langgraph_grpc_common/proto/checkpointer_pb2_grpc.pyi +0 -0
- {langgraph_api-0.18.0.dev2 → langgraph_api-0.18.0.dev4}/langgraph_grpc_common/proto/core_api_pb2.py +0 -0
- {langgraph_api-0.18.0.dev2 → langgraph_api-0.18.0.dev4}/langgraph_grpc_common/proto/core_api_pb2.pyi +0 -0
- {langgraph_api-0.18.0.dev2 → langgraph_api-0.18.0.dev4}/langgraph_grpc_common/proto/core_api_pb2_grpc.py +0 -0
- {langgraph_api-0.18.0.dev2 → langgraph_api-0.18.0.dev4}/langgraph_grpc_common/proto/core_api_pb2_grpc.pyi +0 -0
- {langgraph_api-0.18.0.dev2 → langgraph_api-0.18.0.dev4}/langgraph_grpc_common/proto/encryption_pb2.py +0 -0
- {langgraph_api-0.18.0.dev2 → langgraph_api-0.18.0.dev4}/langgraph_grpc_common/proto/encryption_pb2.pyi +0 -0
- {langgraph_api-0.18.0.dev2 → langgraph_api-0.18.0.dev4}/langgraph_grpc_common/proto/encryption_pb2_grpc.py +0 -0
- {langgraph_api-0.18.0.dev2 → langgraph_api-0.18.0.dev4}/langgraph_grpc_common/proto/encryption_pb2_grpc.pyi +0 -0
- {langgraph_api-0.18.0.dev2 → langgraph_api-0.18.0.dev4}/langgraph_grpc_common/proto/engine_common_pb2.py +0 -0
- {langgraph_api-0.18.0.dev2 → langgraph_api-0.18.0.dev4}/langgraph_grpc_common/proto/engine_common_pb2.pyi +0 -0
- {langgraph_api-0.18.0.dev2 → langgraph_api-0.18.0.dev4}/langgraph_grpc_common/proto/engine_common_pb2_grpc.py +0 -0
- {langgraph_api-0.18.0.dev2 → langgraph_api-0.18.0.dev4}/langgraph_grpc_common/proto/engine_common_pb2_grpc.pyi +0 -0
- {langgraph_api-0.18.0.dev2 → langgraph_api-0.18.0.dev4}/langgraph_grpc_common/proto/enum_cancel_run_action_pb2.py +0 -0
- {langgraph_api-0.18.0.dev2 → langgraph_api-0.18.0.dev4}/langgraph_grpc_common/proto/enum_cancel_run_action_pb2.pyi +0 -0
- {langgraph_api-0.18.0.dev2 → langgraph_api-0.18.0.dev4}/langgraph_grpc_common/proto/enum_cancel_run_action_pb2_grpc.py +0 -0
- {langgraph_api-0.18.0.dev2 → langgraph_api-0.18.0.dev4}/langgraph_grpc_common/proto/enum_cancel_run_action_pb2_grpc.pyi +0 -0
- {langgraph_api-0.18.0.dev2 → langgraph_api-0.18.0.dev4}/langgraph_grpc_common/proto/enum_control_signal_pb2.py +0 -0
- {langgraph_api-0.18.0.dev2 → langgraph_api-0.18.0.dev4}/langgraph_grpc_common/proto/enum_control_signal_pb2.pyi +0 -0
- {langgraph_api-0.18.0.dev2 → langgraph_api-0.18.0.dev4}/langgraph_grpc_common/proto/enum_control_signal_pb2_grpc.py +0 -0
- {langgraph_api-0.18.0.dev2 → langgraph_api-0.18.0.dev4}/langgraph_grpc_common/proto/enum_control_signal_pb2_grpc.pyi +0 -0
- {langgraph_api-0.18.0.dev2 → langgraph_api-0.18.0.dev4}/langgraph_grpc_common/proto/enum_cron_on_run_completed_pb2.py +0 -0
- {langgraph_api-0.18.0.dev2 → langgraph_api-0.18.0.dev4}/langgraph_grpc_common/proto/enum_cron_on_run_completed_pb2.pyi +0 -0
- {langgraph_api-0.18.0.dev2 → langgraph_api-0.18.0.dev4}/langgraph_grpc_common/proto/enum_cron_on_run_completed_pb2_grpc.py +0 -0
- {langgraph_api-0.18.0.dev2 → langgraph_api-0.18.0.dev4}/langgraph_grpc_common/proto/enum_cron_on_run_completed_pb2_grpc.pyi +0 -0
- {langgraph_api-0.18.0.dev2 → langgraph_api-0.18.0.dev4}/langgraph_grpc_common/proto/enum_durability_pb2.py +0 -0
- {langgraph_api-0.18.0.dev2 → langgraph_api-0.18.0.dev4}/langgraph_grpc_common/proto/enum_durability_pb2.pyi +0 -0
- {langgraph_api-0.18.0.dev2 → langgraph_api-0.18.0.dev4}/langgraph_grpc_common/proto/enum_durability_pb2_grpc.py +0 -0
- {langgraph_api-0.18.0.dev2 → langgraph_api-0.18.0.dev4}/langgraph_grpc_common/proto/enum_durability_pb2_grpc.pyi +0 -0
- {langgraph_api-0.18.0.dev2 → langgraph_api-0.18.0.dev4}/langgraph_grpc_common/proto/enum_multitask_strategy_pb2.py +0 -0
- {langgraph_api-0.18.0.dev2 → langgraph_api-0.18.0.dev4}/langgraph_grpc_common/proto/enum_multitask_strategy_pb2.pyi +0 -0
- {langgraph_api-0.18.0.dev2 → langgraph_api-0.18.0.dev4}/langgraph_grpc_common/proto/enum_multitask_strategy_pb2_grpc.py +0 -0
- {langgraph_api-0.18.0.dev2 → langgraph_api-0.18.0.dev4}/langgraph_grpc_common/proto/enum_multitask_strategy_pb2_grpc.pyi +0 -0
- {langgraph_api-0.18.0.dev2 → langgraph_api-0.18.0.dev4}/langgraph_grpc_common/proto/enum_run_status_pb2.py +0 -0
- {langgraph_api-0.18.0.dev2 → langgraph_api-0.18.0.dev4}/langgraph_grpc_common/proto/enum_run_status_pb2.pyi +0 -0
- {langgraph_api-0.18.0.dev2 → langgraph_api-0.18.0.dev4}/langgraph_grpc_common/proto/enum_run_status_pb2_grpc.py +0 -0
- {langgraph_api-0.18.0.dev2 → langgraph_api-0.18.0.dev4}/langgraph_grpc_common/proto/enum_run_status_pb2_grpc.pyi +0 -0
- {langgraph_api-0.18.0.dev2 → langgraph_api-0.18.0.dev4}/langgraph_grpc_common/proto/enum_stream_mode_pb2.py +0 -0
- {langgraph_api-0.18.0.dev2 → langgraph_api-0.18.0.dev4}/langgraph_grpc_common/proto/enum_stream_mode_pb2.pyi +0 -0
- {langgraph_api-0.18.0.dev2 → langgraph_api-0.18.0.dev4}/langgraph_grpc_common/proto/enum_stream_mode_pb2_grpc.py +0 -0
- {langgraph_api-0.18.0.dev2 → langgraph_api-0.18.0.dev4}/langgraph_grpc_common/proto/enum_stream_mode_pb2_grpc.pyi +0 -0
- {langgraph_api-0.18.0.dev2 → langgraph_api-0.18.0.dev4}/langgraph_grpc_common/proto/enum_thread_status_pb2.py +0 -0
- {langgraph_api-0.18.0.dev2 → langgraph_api-0.18.0.dev4}/langgraph_grpc_common/proto/enum_thread_status_pb2.pyi +0 -0
- {langgraph_api-0.18.0.dev2 → langgraph_api-0.18.0.dev4}/langgraph_grpc_common/proto/enum_thread_status_pb2_grpc.py +0 -0
- {langgraph_api-0.18.0.dev2 → langgraph_api-0.18.0.dev4}/langgraph_grpc_common/proto/enum_thread_status_pb2_grpc.pyi +0 -0
- {langgraph_api-0.18.0.dev2 → langgraph_api-0.18.0.dev4}/langgraph_grpc_common/proto/enum_thread_stream_mode_pb2.py +0 -0
- {langgraph_api-0.18.0.dev2 → langgraph_api-0.18.0.dev4}/langgraph_grpc_common/proto/enum_thread_stream_mode_pb2.pyi +0 -0
- {langgraph_api-0.18.0.dev2 → langgraph_api-0.18.0.dev4}/langgraph_grpc_common/proto/enum_thread_stream_mode_pb2_grpc.py +0 -0
- {langgraph_api-0.18.0.dev2 → langgraph_api-0.18.0.dev4}/langgraph_grpc_common/proto/enum_thread_stream_mode_pb2_grpc.pyi +0 -0
- {langgraph_api-0.18.0.dev2 → langgraph_api-0.18.0.dev4}/langgraph_grpc_common/proto/errors_pb2.py +0 -0
- {langgraph_api-0.18.0.dev2 → langgraph_api-0.18.0.dev4}/langgraph_grpc_common/proto/errors_pb2.pyi +0 -0
- {langgraph_api-0.18.0.dev2 → langgraph_api-0.18.0.dev4}/langgraph_grpc_common/proto/errors_pb2_grpc.py +0 -0
- {langgraph_api-0.18.0.dev2 → langgraph_api-0.18.0.dev4}/langgraph_grpc_common/proto/errors_pb2_grpc.pyi +0 -0
- {langgraph_api-0.18.0.dev2 → langgraph_api-0.18.0.dev4}/langgraph_grpc_common/proto/store_pb2.py +0 -0
- {langgraph_api-0.18.0.dev2 → langgraph_api-0.18.0.dev4}/langgraph_grpc_common/proto/store_pb2.pyi +0 -0
- {langgraph_api-0.18.0.dev2 → langgraph_api-0.18.0.dev4}/langgraph_grpc_common/proto/store_pb2_grpc.py +0 -0
- {langgraph_api-0.18.0.dev2 → langgraph_api-0.18.0.dev4}/langgraph_grpc_common/proto/store_pb2_grpc.pyi +0 -0
- {langgraph_api-0.18.0.dev2 → langgraph_api-0.18.0.dev4}/langgraph_grpc_common/serde.py +0 -0
- {langgraph_api-0.18.0.dev2 → langgraph_api-0.18.0.dev4}/langgraph_grpc_common/store.py +0 -0
- {langgraph_api-0.18.0.dev2 → langgraph_api-0.18.0.dev4}/langgraph_license/__init__.py +0 -0
- {langgraph_api-0.18.0.dev2 → langgraph_api-0.18.0.dev4}/langgraph_license/validation.py +0 -0
- {langgraph_api-0.18.0.dev2 → langgraph_api-0.18.0.dev4}/langgraph_runtime/__init__.py +0 -0
- {langgraph_api-0.18.0.dev2 → langgraph_api-0.18.0.dev4}/langgraph_runtime/checkpoint.py +0 -0
- {langgraph_api-0.18.0.dev2 → langgraph_api-0.18.0.dev4}/langgraph_runtime/database.py +0 -0
- {langgraph_api-0.18.0.dev2 → langgraph_api-0.18.0.dev4}/langgraph_runtime/encryption.py +0 -0
- {langgraph_api-0.18.0.dev2 → langgraph_api-0.18.0.dev4}/langgraph_runtime/lifespan.py +0 -0
- {langgraph_api-0.18.0.dev2 → langgraph_api-0.18.0.dev4}/langgraph_runtime/metrics.py +0 -0
- {langgraph_api-0.18.0.dev2 → langgraph_api-0.18.0.dev4}/langgraph_runtime/ops.py +0 -0
- {langgraph_api-0.18.0.dev2 → langgraph_api-0.18.0.dev4}/langgraph_runtime/queue.py +0 -0
- {langgraph_api-0.18.0.dev2 → langgraph_api-0.18.0.dev4}/langgraph_runtime/retry.py +0 -0
- {langgraph_api-0.18.0.dev2 → langgraph_api-0.18.0.dev4}/langgraph_runtime/routes.py +0 -0
- {langgraph_api-0.18.0.dev2 → langgraph_api-0.18.0.dev4}/langgraph_runtime/store.py +0 -0
- {langgraph_api-0.18.0.dev2 → langgraph_api-0.18.0.dev4}/logging.json +0 -0
- {langgraph_api-0.18.0.dev2 → langgraph_api-0.18.0.dev4}/pyproject.toml +0 -0
- {langgraph_api-0.18.0.dev2 → langgraph_api-0.18.0.dev4}/scripts/build_wheel.py +0 -0
- {langgraph_api-0.18.0.dev2 → langgraph_api-0.18.0.dev4}/scripts/create_license.py +0 -0
- {langgraph_api-0.18.0.dev2 → langgraph_api-0.18.0.dev4}/scripts/run_a2a_tck.py +0 -0
- {langgraph_api-0.18.0.dev2 → langgraph_api-0.18.0.dev4}/uv.lock +0 -0
|
@@ -67,6 +67,7 @@ START_TARGET ?= start-license-oss
|
|
|
67
67
|
TEST_TARGET ?= test-license-oss
|
|
68
68
|
SERVER_HEALTH_URL ?= http://127.0.0.1:9123/ok
|
|
69
69
|
SERVER_START_TIMEOUT_SECS ?= 30
|
|
70
|
+
SERVER_STOP_TIMEOUT_SECS ?= 10
|
|
70
71
|
|
|
71
72
|
ifeq ($(LANGGRAPH_HTTP),fastapi)
|
|
72
73
|
HTTP_CONFIG := {"app": "./tests/graphs/my_router.py:app", "disable_mcp": false, "disable_a2a": false, "mount_prefix": "/my-cool/api"}
|
|
@@ -126,16 +127,25 @@ test-auth:
|
|
|
126
127
|
LANGGRAPH_RUNTIME_EDITION=inmem LANGGRAPH_AUTH='{"path": "./tests/graphs/fastapi_jwt_auth.py:auth"}' REDIS_URI=_FAKE DATABASE_URI=:memory: MIGRATIONS_PATH=__inmem__ uv run pytest -v $(PYTEST_ROOT_ARGS) $(XDIST_ARGS) $(AUTH_TEST)
|
|
127
128
|
|
|
128
129
|
test-with-server:
|
|
129
|
-
@bash -euo pipefail -c '
|
|
130
|
-
|
|
130
|
+
@bash -euo pipefail -c 'set -m; \
|
|
131
|
+
$(MAKE) $(START_TARGET) LANGGRAPH_HTTP='\''$(LANGGRAPH_HTTP)'\'' & \
|
|
132
|
+
server_pgid=$$!; \
|
|
133
|
+
set +m; \
|
|
131
134
|
cleanup() { \
|
|
132
|
-
if [ -r /proc/$$
|
|
133
|
-
taskkill //F //T //PID "$$(cat /proc/$$
|
|
134
|
-
|
|
135
|
-
kill $$pid >/dev/null 2>&1 || true; \
|
|
135
|
+
if [ -r /proc/$$server_pgid/winpid ]; then \
|
|
136
|
+
taskkill //F //T //PID "$$(cat /proc/$$server_pgid/winpid)" >/dev/null 2>&1 || true; \
|
|
137
|
+
return 0; \
|
|
136
138
|
fi; \
|
|
139
|
+
kill -- -$$server_pgid 2>/dev/null || return 0; \
|
|
140
|
+
for i in $$(seq 1 $(SERVER_STOP_TIMEOUT_SECS)); do \
|
|
141
|
+
kill -0 -- -$$server_pgid 2>/dev/null || return 0; \
|
|
142
|
+
sleep 1; \
|
|
143
|
+
done; \
|
|
144
|
+
kill -KILL -- -$$server_pgid 2>/dev/null || true; \
|
|
137
145
|
}; \
|
|
138
146
|
trap cleanup EXIT; \
|
|
147
|
+
trap "exit 130" INT; \
|
|
148
|
+
trap "exit 143" TERM; \
|
|
139
149
|
for i in $$(seq 1 $(SERVER_START_TIMEOUT_SECS)); do \
|
|
140
150
|
if curl -sf "$(SERVER_HEALTH_URL)" >/dev/null; then \
|
|
141
151
|
break; \
|
|
@@ -373,26 +383,22 @@ start-test-a2a-tck-watch:
|
|
|
373
383
|
"$(MAKE) start" \
|
|
374
384
|
"sleep $(TCK_STARTUP_DELAY) && npx nodemon --watch langgraph_api/api/a2a.py --ext py --exec '$(MAKE) test-a2a-tck-must'"
|
|
375
385
|
|
|
376
|
-
|
|
377
|
-
# Uses the official MCP conformance test suite (https://github.com/modelcontextprotocol/conformance)
|
|
378
|
-
# Requires a running server: make start (in another terminal)
|
|
379
|
-
|
|
386
|
+
MCP_CONFORMANCE := npx @modelcontextprotocol/conformance@0.2.0-alpha.12
|
|
380
387
|
MCP_CONFORMANCE_URL ?= http://localhost:9123/mcp
|
|
381
|
-
|
|
382
|
-
MCP_CONFORMANCE_BASELINE ?= ../mcp-conformance-baseline.yml
|
|
383
|
-
MCP_STARTUP_DELAY ?= 10
|
|
388
|
+
MCP_CONFORMANCE_REVISIONS := 2025-11-25 2026-07-28
|
|
384
389
|
|
|
385
390
|
test-mcp-conformance:
|
|
386
|
-
|
|
391
|
+
$(MAKE) -k $(addprefix test-mcp-conformance-,$(MCP_CONFORMANCE_REVISIONS))
|
|
392
|
+
|
|
393
|
+
test-mcp-conformance-%:
|
|
394
|
+
$(MCP_CONFORMANCE) server \
|
|
387
395
|
--url $(MCP_CONFORMANCE_URL) \
|
|
388
|
-
--
|
|
389
|
-
--expected-failures
|
|
396
|
+
--requirements $* \
|
|
397
|
+
--expected-failures ../mcp-conformance-baseline-$*.yml \
|
|
390
398
|
--verbose
|
|
391
399
|
|
|
392
400
|
start-test-mcp-conformance:
|
|
393
|
-
|
|
394
|
-
"$(MAKE) start" \
|
|
395
|
-
"sleep $(MCP_STARTUP_DELAY) && $(MAKE) test-mcp-conformance"
|
|
401
|
+
$(MAKE) test-with-server TEST_TARGET=test-mcp-conformance
|
|
396
402
|
|
|
397
403
|
list-mcp-scenarios:
|
|
398
|
-
|
|
404
|
+
$(MCP_CONFORMANCE) list --server
|
|
@@ -47,12 +47,12 @@ server version staging is on, which is the API version in the first line.
|
|
|
47
47
|
|---|---|---|---|
|
|
48
48
|
| `wait` | `wait_write` | start a run and wait for its result (`POST /runs/wait`): run execution and checkpointing | 1,000 |
|
|
49
49
|
| `stream` | `stream_write` | start a run and read its event stream to the end (`POST /runs/stream`) | 1,000 |
|
|
50
|
-
| `search` | `
|
|
50
|
+
| `search` | `threads_search_metadata` | create two threads, set their metadata, then search for them by it: database and metadata search | 300 |
|
|
51
51
|
|
|
52
52
|
Tables use the one-word row names so they fit a phone; the lines above the
|
|
53
53
|
table use the runner names.
|
|
54
54
|
|
|
55
|
-
`
|
|
55
|
+
`threads_search_metadata` does not delete the threads it creates; the deployment's
|
|
56
56
|
60-minute thread TTL removes them, so each night searches a table of about
|
|
57
57
|
that run's threads, not a growing history.
|
|
58
58
|
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
__version__ = "0.18.0.dev4"
|
|
@@ -2090,6 +2090,19 @@ async def handle_message_send(
|
|
|
2090
2090
|
"message": "Invalid params: 'configuration' must be an object",
|
|
2091
2091
|
}
|
|
2092
2092
|
}
|
|
2093
|
+
for field in ("returnImmediately", "blocking"):
|
|
2094
|
+
if configuration.get(field) is not None and not isinstance(
|
|
2095
|
+
configuration[field], bool
|
|
2096
|
+
):
|
|
2097
|
+
return {
|
|
2098
|
+
"error": {
|
|
2099
|
+
"code": ERROR_CODE_INVALID_PARAMS,
|
|
2100
|
+
"message": f"Invalid params: '{field}' must be a boolean",
|
|
2101
|
+
}
|
|
2102
|
+
}
|
|
2103
|
+
return_immediately = configuration.get("returnImmediately")
|
|
2104
|
+
if return_immediately is None:
|
|
2105
|
+
return_immediately = configuration.get("blocking") is False
|
|
2093
2106
|
history_length = configuration.get("historyLength")
|
|
2094
2107
|
if history_error := _validate_history_length(history_length):
|
|
2095
2108
|
return {
|
|
@@ -2308,6 +2321,36 @@ async def handle_message_send(
|
|
|
2308
2321
|
context_id = str(run["thread_id"])
|
|
2309
2322
|
if task_id is None:
|
|
2310
2323
|
task_id = _make_task_id(context_id, str(run["run_id"]))
|
|
2324
|
+
if return_immediately:
|
|
2325
|
+
immediate_task: dict[str, Any] = {
|
|
2326
|
+
"kind": "task",
|
|
2327
|
+
"id": task_id,
|
|
2328
|
+
"contextId": context_id,
|
|
2329
|
+
"status": {
|
|
2330
|
+
"state": _task_state_for_run(run),
|
|
2331
|
+
"timestamp": _run_timestamp(run),
|
|
2332
|
+
},
|
|
2333
|
+
}
|
|
2334
|
+
if history_length is not None and history_length != 0:
|
|
2335
|
+
run_messages = await _load_run_messages(
|
|
2336
|
+
context_id, str(run["run_id"]), request.headers
|
|
2337
|
+
)
|
|
2338
|
+
if not run_messages.messages:
|
|
2339
|
+
run_messages = RunMessages(input_content.get("messages", []), 0)
|
|
2340
|
+
if task_start_id:
|
|
2341
|
+
task_ids_by_start_id.setdefault(task_start_id, task_id)
|
|
2342
|
+
immediate_task["history"] = _convert_messages_to_a2a_format(
|
|
2343
|
+
run_messages.stamped(task_id),
|
|
2344
|
+
task_id,
|
|
2345
|
+
context_id,
|
|
2346
|
+
history_length=history_length,
|
|
2347
|
+
history_scope=history_scope,
|
|
2348
|
+
a2ui=a2ui,
|
|
2349
|
+
task_ids_by_start_id=task_ids_by_start_id,
|
|
2350
|
+
)
|
|
2351
|
+
return {"result": {"task": immediate_task}}
|
|
2352
|
+
|
|
2353
|
+
if existing_task_id is None:
|
|
2311
2354
|
try:
|
|
2312
2355
|
runs = await _list_context_runs(
|
|
2313
2356
|
client, context_id=context_id, headers=request.headers
|
|
@@ -2489,6 +2532,48 @@ async def handle_tasks_get(
|
|
|
2489
2532
|
lg_status = run_info.get("status", "unknown")
|
|
2490
2533
|
a2a_state = task.state
|
|
2491
2534
|
|
|
2535
|
+
if a2a_state in ("TASK_STATE_COMPLETED", "TASK_STATE_INPUT_REQUIRED"):
|
|
2536
|
+
states, before = await asyncio.gather(
|
|
2537
|
+
get_client().threads.get_history(
|
|
2538
|
+
context_id,
|
|
2539
|
+
limit=1,
|
|
2540
|
+
metadata={"run_id": str(run_info["run_id"])},
|
|
2541
|
+
headers=request.headers,
|
|
2542
|
+
),
|
|
2543
|
+
_latest_messages(
|
|
2544
|
+
context_id,
|
|
2545
|
+
{"run_id": str(run_info["run_id"]), "source": "input"},
|
|
2546
|
+
request.headers,
|
|
2547
|
+
),
|
|
2548
|
+
)
|
|
2549
|
+
result = dict(states[0]["values"]) if states else {}
|
|
2550
|
+
messages = result.get("messages", []) or []
|
|
2551
|
+
run_messages = (
|
|
2552
|
+
RunMessages.between(before, messages)
|
|
2553
|
+
if before is not None
|
|
2554
|
+
else RunMessages(messages, None)
|
|
2555
|
+
)
|
|
2556
|
+
if "messages" in result:
|
|
2557
|
+
result["messages"] = run_messages.stamped(task_id)
|
|
2558
|
+
if a2a_state == "TASK_STATE_INPUT_REQUIRED":
|
|
2559
|
+
result["__interrupt__"] = (
|
|
2560
|
+
states[0].get("interrupts", []) if states else []
|
|
2561
|
+
)
|
|
2562
|
+
response = await _create_task_response(
|
|
2563
|
+
task_id=task_id,
|
|
2564
|
+
context_id=context_id,
|
|
2565
|
+
result=result,
|
|
2566
|
+
assistant_id=assistant_id,
|
|
2567
|
+
a2ui=_a2ui_context_for_run(run_info),
|
|
2568
|
+
history_length=history_length,
|
|
2569
|
+
history_scope=history_scope,
|
|
2570
|
+
task_ids_by_start_id=task.task_ids_by_start_id,
|
|
2571
|
+
turn=run_messages.added,
|
|
2572
|
+
)
|
|
2573
|
+
task_response = response["result"]["task"]
|
|
2574
|
+
task_response["status"]["timestamp"] = task.status_timestamp
|
|
2575
|
+
return {"result": task_response}
|
|
2576
|
+
|
|
2492
2577
|
thread_history = []
|
|
2493
2578
|
if history_length != 0:
|
|
2494
2579
|
try:
|
|
@@ -2532,16 +2617,7 @@ async def handle_tasks_get(
|
|
|
2532
2617
|
if history_length != 0:
|
|
2533
2618
|
task_response["history"] = thread_history
|
|
2534
2619
|
|
|
2535
|
-
|
|
2536
|
-
if a2a_state == "TASK_STATE_COMPLETED":
|
|
2537
|
-
task_response["status"]["message"] = {
|
|
2538
|
-
"kind": "message",
|
|
2539
|
-
"role": "ROLE_AGENT",
|
|
2540
|
-
"parts": [{"kind": "text", "text": "Task completed successfully"}],
|
|
2541
|
-
"messageId": str(uuid.uuid4()),
|
|
2542
|
-
"taskId": task_id,
|
|
2543
|
-
}
|
|
2544
|
-
elif a2a_state == "TASK_STATE_FAILED":
|
|
2620
|
+
if a2a_state == "TASK_STATE_FAILED":
|
|
2545
2621
|
task_response["status"]["message"] = {
|
|
2546
2622
|
"kind": "message",
|
|
2547
2623
|
"role": "ROLE_AGENT",
|
|
@@ -2554,6 +2630,13 @@ async def handle_tasks_get(
|
|
|
2554
2630
|
|
|
2555
2631
|
return {"result": task_response}
|
|
2556
2632
|
|
|
2633
|
+
except InvalidAgentResponseError as e:
|
|
2634
|
+
return {
|
|
2635
|
+
"error": {
|
|
2636
|
+
"code": ERROR_CODE_INVALID_AGENT_RESPONSE,
|
|
2637
|
+
"message": str(e),
|
|
2638
|
+
}
|
|
2639
|
+
}
|
|
2557
2640
|
except Exception as e:
|
|
2558
2641
|
await logger.aexception(
|
|
2559
2642
|
f"Error in tasks/get for task {params.get('id')}: {e!s}", exc_info=True
|
{langgraph_api-0.18.0.dev2 → langgraph_api-0.18.0.dev4}/langgraph_api/api/event_streaming.py
RENAMED
|
@@ -28,6 +28,7 @@ from uuid import uuid4
|
|
|
28
28
|
|
|
29
29
|
import orjson
|
|
30
30
|
import structlog
|
|
31
|
+
from starlette.exceptions import HTTPException
|
|
31
32
|
from starlette.responses import Response
|
|
32
33
|
from starlette.websockets import WebSocketDisconnect
|
|
33
34
|
|
|
@@ -38,8 +39,11 @@ from langgraph_api.feature_flags import IS_POSTGRES_OR_GRPC_BACKEND
|
|
|
38
39
|
from langgraph_api.route import ApiRoute, ApiWebSocketRoute
|
|
39
40
|
from langgraph_api.serde import json_dumpb
|
|
40
41
|
from langgraph_api.sse import EventSourceResponse
|
|
42
|
+
from langgraph_api.utils import validate_uuid
|
|
41
43
|
|
|
42
44
|
if TYPE_CHECKING:
|
|
45
|
+
from collections.abc import Mapping
|
|
46
|
+
|
|
43
47
|
from starlette.requests import Request
|
|
44
48
|
from starlette.websockets import WebSocket
|
|
45
49
|
|
|
@@ -91,7 +95,13 @@ def _json_response(content: Any, *, status_code: int = 200) -> Response:
|
|
|
91
95
|
)
|
|
92
96
|
|
|
93
97
|
|
|
94
|
-
def _make_manager(
|
|
98
|
+
def _make_manager(
|
|
99
|
+
thread_id: str,
|
|
100
|
+
send_event: Any = None,
|
|
101
|
+
*,
|
|
102
|
+
headers: Mapping[str, str] | None = None,
|
|
103
|
+
replay_buffer: bool = True,
|
|
104
|
+
) -> ThreadRunManager:
|
|
95
105
|
# Auth context is propagated via ``ApiRoute``'s ``with_user`` wrapper
|
|
96
106
|
# — ops reads it off the context var, so we don't thread it through
|
|
97
107
|
# the manager explicitly.
|
|
@@ -100,6 +110,8 @@ def _make_manager(thread_id: str, send_event: Any = None) -> ThreadRunManager:
|
|
|
100
110
|
runs=Runs,
|
|
101
111
|
threads=Threads,
|
|
102
112
|
send_event=send_event,
|
|
113
|
+
headers=headers,
|
|
114
|
+
replay_buffer=replay_buffer,
|
|
103
115
|
)
|
|
104
116
|
|
|
105
117
|
|
|
@@ -135,8 +147,12 @@ async def _thread_events(request: Request) -> Response:
|
|
|
135
147
|
If reading the thread's event stream fails, the server ends the
|
|
136
148
|
stream with a final ``event: error`` frame carrying a protocol error
|
|
137
149
|
(``"type": "error"``, ``"id": null``, ``"error": "unknown_error"``).
|
|
150
|
+
|
|
151
|
+
A thread the caller isn't allowed to read returns 403 or 404 before
|
|
152
|
+
the stream starts, and a malformed thread ID returns 422.
|
|
138
153
|
"""
|
|
139
154
|
thread_id = request.path_params["thread_id"]
|
|
155
|
+
thread_uuid = validate_uuid(thread_id, "Invalid thread ID: must be a UUID")
|
|
140
156
|
try:
|
|
141
157
|
body = orjson.loads(await request.body())
|
|
142
158
|
except Exception:
|
|
@@ -209,6 +225,10 @@ async def _thread_events(request: Request) -> Response:
|
|
|
209
225
|
else None
|
|
210
226
|
)
|
|
211
227
|
|
|
228
|
+
# Checked here, before the 200, because clients retry a 200 that ends in
|
|
229
|
+
# an error instead of giving up.
|
|
230
|
+
auth_filters = await Threads.Stream.check_thread_stream_auth(thread_uuid)
|
|
231
|
+
|
|
212
232
|
# Bounded LRU dedup: ``recent_eids`` is the eviction order, ``delivered``
|
|
213
233
|
# is the O(1) membership view. When the deque hits its cap, the oldest
|
|
214
234
|
# entry rolls off; we mirror that on ``delivered`` to keep them in sync.
|
|
@@ -233,7 +253,10 @@ async def _thread_events(request: Request) -> Response:
|
|
|
233
253
|
pending_events.append(event)
|
|
234
254
|
flush_pending.set()
|
|
235
255
|
|
|
236
|
-
|
|
256
|
+
# SSE never replays from the session's buffer: it has no subscribe or
|
|
257
|
+
# reconnect commands, and ``start_thread_stream`` replays from the
|
|
258
|
+
# thread's event stream.
|
|
259
|
+
manager = _make_manager(thread_id, send_event=on_event, replay_buffer=False)
|
|
237
260
|
|
|
238
261
|
filter_sub = Subscription(
|
|
239
262
|
id=str(uuid4()),
|
|
@@ -256,7 +279,7 @@ async def _thread_events(request: Request) -> Response:
|
|
|
256
279
|
# outbound events; the thread-level reader always replays from the
|
|
257
280
|
# beginning so namespace-scoped projections see history. See
|
|
258
281
|
# ``ThreadRunManager.start_thread_stream`` for the rationale.
|
|
259
|
-
manager.start_thread_stream()
|
|
282
|
+
manager.start_thread_stream(auth_filters=auth_filters)
|
|
260
283
|
|
|
261
284
|
async def body_iter():
|
|
262
285
|
try:
|
|
@@ -353,7 +376,7 @@ async def _thread_command(request: Request) -> Response:
|
|
|
353
376
|
status_code=400,
|
|
354
377
|
)
|
|
355
378
|
|
|
356
|
-
manager = _make_manager(thread_id)
|
|
379
|
+
manager = _make_manager(thread_id, headers=request.headers)
|
|
357
380
|
try:
|
|
358
381
|
resp = await manager.handle_command(payload)
|
|
359
382
|
return _json_response(resp)
|
|
@@ -369,20 +392,51 @@ async def _thread_command(request: Request) -> Response:
|
|
|
369
392
|
# ---------------------------------------------------------------------------
|
|
370
393
|
|
|
371
394
|
|
|
395
|
+
async def _close_for_failed_access_check(websocket: WebSocket, exc: Exception) -> None:
|
|
396
|
+
if isinstance(exc, HTTPException) and exc.status_code < 500:
|
|
397
|
+
await websocket.close(code=4000 + exc.status_code)
|
|
398
|
+
return
|
|
399
|
+
logger.exception("Thread stream access check failed")
|
|
400
|
+
await websocket.send_text(_THREAD_STREAM_FAILED_DATA.decode())
|
|
401
|
+
await websocket.close(code=1011, reason="thread stream ended")
|
|
402
|
+
|
|
403
|
+
|
|
372
404
|
async def _thread_websocket(websocket: WebSocket) -> None:
|
|
373
405
|
"""Full-duplex protocol connection scoped to a thread.
|
|
374
406
|
|
|
375
407
|
Supports ``run.start``, ``input.respond``, ``subscription.subscribe``,
|
|
376
408
|
``subscription.unsubscribe``, ``agent.getTree``.
|
|
409
|
+
|
|
410
|
+
A 4xx from the thread's access check closes the socket with 4000 plus the
|
|
411
|
+
status (4403, 4422). A 404 can be a thread the client minted and has yet
|
|
412
|
+
to create, so the socket then waits for a ``run.start``, which checks
|
|
413
|
+
access like any run start, and closes with 4404 if another command comes
|
|
414
|
+
first. Any other failure of the check, a 5xx included, gets the stream
|
|
415
|
+
error frame and a 1011 close, as when the stream fails later.
|
|
377
416
|
"""
|
|
378
417
|
thread_id = websocket.path_params["thread_id"]
|
|
418
|
+
# Browsers report a refused upgrade only as a 1006 close, so accept first
|
|
419
|
+
# to make the close code readable.
|
|
379
420
|
await websocket.accept()
|
|
421
|
+
try:
|
|
422
|
+
thread_uuid = validate_uuid(thread_id, "Invalid thread ID: must be a UUID")
|
|
423
|
+
except HTTPException as exc:
|
|
424
|
+
await _close_for_failed_access_check(websocket, exc)
|
|
425
|
+
return
|
|
426
|
+
awaiting_thread = False
|
|
427
|
+
auth_filters: Any = None
|
|
428
|
+
try:
|
|
429
|
+
auth_filters = await Threads.Stream.check_thread_stream_auth(thread_uuid)
|
|
430
|
+
except Exception as exc:
|
|
431
|
+
if not (isinstance(exc, HTTPException) and exc.status_code == 404):
|
|
432
|
+
await _close_for_failed_access_check(websocket, exc)
|
|
433
|
+
return
|
|
434
|
+
awaiting_thread = True
|
|
380
435
|
|
|
381
436
|
async def ws_send_event(event: dict[str, Any]) -> None:
|
|
382
437
|
await websocket.send_text(orjson.dumps(event).decode("utf-8"))
|
|
383
438
|
|
|
384
439
|
manager = _make_manager(thread_id, send_event=ws_send_event)
|
|
385
|
-
manager.start_thread_stream()
|
|
386
440
|
|
|
387
441
|
# Watchdog: when the thread-stream consumer stops, send the error frame
|
|
388
442
|
# (if it wasn't cancelled) and close the socket, instead of leaving the
|
|
@@ -397,7 +451,11 @@ async def _thread_websocket(websocket: WebSocket) -> None:
|
|
|
397
451
|
with contextlib.suppress(Exception):
|
|
398
452
|
await websocket.close(code=1011, reason="thread stream ended")
|
|
399
453
|
|
|
400
|
-
|
|
454
|
+
def start_stream(filters: Any) -> asyncio.Task[None]:
|
|
455
|
+
manager.start_thread_stream(auth_filters=filters)
|
|
456
|
+
return asyncio.create_task(_stream_watchdog())
|
|
457
|
+
|
|
458
|
+
watchdog = None if awaiting_thread else start_stream(auth_filters)
|
|
401
459
|
|
|
402
460
|
try:
|
|
403
461
|
while True:
|
|
@@ -430,16 +488,30 @@ async def _thread_websocket(websocket: WebSocket) -> None:
|
|
|
430
488
|
)
|
|
431
489
|
continue
|
|
432
490
|
|
|
491
|
+
if awaiting_thread and payload["method"] != "run.start":
|
|
492
|
+
await websocket.close(code=4404)
|
|
493
|
+
return
|
|
433
494
|
response = await manager.handle_command(payload)
|
|
434
495
|
await websocket.send_text(orjson.dumps(response).decode("utf-8"))
|
|
496
|
+
if awaiting_thread and response.get("type") == "success":
|
|
497
|
+
try:
|
|
498
|
+
auth_filters = await Threads.Stream.check_thread_stream_auth(
|
|
499
|
+
thread_uuid
|
|
500
|
+
)
|
|
501
|
+
except Exception as exc:
|
|
502
|
+
await _close_for_failed_access_check(websocket, exc)
|
|
503
|
+
return
|
|
504
|
+
watchdog = start_stream(auth_filters)
|
|
505
|
+
awaiting_thread = False
|
|
435
506
|
except WebSocketDisconnect:
|
|
436
507
|
pass
|
|
437
508
|
except Exception:
|
|
438
509
|
logger.exception("Protocol WebSocket error")
|
|
439
510
|
finally:
|
|
440
|
-
watchdog
|
|
441
|
-
|
|
442
|
-
|
|
511
|
+
if watchdog is not None:
|
|
512
|
+
watchdog.cancel()
|
|
513
|
+
with contextlib.suppress(asyncio.CancelledError, Exception):
|
|
514
|
+
await watchdog
|
|
443
515
|
await manager.close()
|
|
444
516
|
|
|
445
517
|
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
|
|
3
|
+
from dataclasses import dataclass
|
|
4
|
+
from typing import TYPE_CHECKING, Any
|
|
5
|
+
|
|
6
|
+
from langgraph_api.api.mcp._protocol import ProtocolError
|
|
7
|
+
|
|
8
|
+
if TYPE_CHECKING:
|
|
9
|
+
from collections.abc import Mapping
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
@dataclass(frozen=True, slots=True)
|
|
13
|
+
class ToolCall:
|
|
14
|
+
name: str
|
|
15
|
+
arguments: dict[str, Any]
|
|
16
|
+
context: dict[str, Any] | None
|
|
17
|
+
|
|
18
|
+
@classmethod
|
|
19
|
+
def of(cls, params: Mapping[str, Any]) -> ToolCall:
|
|
20
|
+
name = params.get("name")
|
|
21
|
+
arguments = params.get("arguments", {})
|
|
22
|
+
context = params.get("context")
|
|
23
|
+
if not isinstance(name, str) or not name:
|
|
24
|
+
raise ProtocolError(f"Unknown tool: {name}")
|
|
25
|
+
if not isinstance(arguments, dict) or (
|
|
26
|
+
context is not None and not isinstance(context, dict)
|
|
27
|
+
):
|
|
28
|
+
raise ProtocolError("arguments and context must be objects")
|
|
29
|
+
return cls(name, arguments, context)
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
MAX_ASSISTANTS = 1000
|
|
2
|
+
DEFAULT_PAGE_SIZE = 100
|
|
3
|
+
MAX_PAGE_OFFSET = 2**63 - 1
|
|
4
|
+
MAX_CURSOR_LENGTH = len(str(MAX_PAGE_OFFSET))
|
|
5
|
+
|
|
6
|
+
ERROR_CODE_INVALID_REQUEST = -32600
|
|
7
|
+
ERROR_CODE_INVALID_PARAMS = -32602
|
|
8
|
+
ERROR_CODE_METHOD_NOT_FOUND = -32601
|
|
9
|
+
ERROR_CODE_HEADER_MISMATCH = -32020
|
|
10
|
+
ERROR_CODE_UNSUPPORTED_VERSION = -32022
|
|
11
|
+
|
|
12
|
+
LEGACY_PROTOCOL_VERSIONS = frozenset(
|
|
13
|
+
(
|
|
14
|
+
"2024-11-05",
|
|
15
|
+
"2025-03-26",
|
|
16
|
+
"2025-06-18",
|
|
17
|
+
"2025-11-25",
|
|
18
|
+
)
|
|
19
|
+
)
|
|
20
|
+
LATEST_LEGACY_PROTOCOL_VERSION = "2025-11-25"
|
|
21
|
+
PROTOCOL_VERSION = "2026-07-28"
|
|
22
|
+
SUPPORTED_PROTOCOL_VERSIONS = LEGACY_PROTOCOL_VERSIONS | {PROTOCOL_VERSION}
|
|
23
|
+
|
|
24
|
+
PAUSED_TOOL_MESSAGE = (
|
|
25
|
+
"This tool paused to ask for human input, and this client can't answer it."
|
|
26
|
+
)
|
|
27
|
+
RUN_FAILED_MESSAGE = "The tool's run failed."
|
|
28
|
+
INVALID_CURSOR_MESSAGE = "Invalid cursor"
|