langgraph-api 0.18.0.dev9__tar.gz → 0.18.0.dev10__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.dev9 → langgraph_api-0.18.0.dev10}/PKG-INFO +3 -1
- langgraph_api-0.18.0.dev10/langgraph_api/__init__.py +1 -0
- langgraph_api-0.18.0.dev10/langgraph_api/api/mcp/__init__.py +21 -0
- langgraph_api-0.18.0.dev10/langgraph_api/api/mcp/_calls.py +6 -0
- langgraph_api-0.18.0.dev10/langgraph_api/api/mcp/_constants.py +11 -0
- langgraph_api-0.18.0.dev10/langgraph_api/api/mcp/_routes.py +35 -0
- {langgraph_api-0.18.0.dev9 → langgraph_api-0.18.0.dev10}/langgraph_api/api/mcp/_sanitizers.py +43 -0
- langgraph_api-0.18.0.dev10/langgraph_api/api/mcp/_sdk.py +40 -0
- langgraph_api-0.18.0.dev10/langgraph_api/api/mcp/_server.py +66 -0
- langgraph_api-0.18.0.dev10/langgraph_api/api/mcp/_tools.py +219 -0
- {langgraph_api-0.18.0.dev9 → langgraph_api-0.18.0.dev10}/langgraph_api/api/meta.py +2 -0
- {langgraph_api-0.18.0.dev9 → langgraph_api-0.18.0.dev10}/langgraph_api/api/openapi.py +2 -3
- {langgraph_api-0.18.0.dev9 → langgraph_api-0.18.0.dev10}/langgraph_api/api/threads.py +76 -15
- {langgraph_api-0.18.0.dev9 → langgraph_api-0.18.0.dev10}/langgraph_api/config/__init__.py +3 -1
- {langgraph_api-0.18.0.dev9 → langgraph_api-0.18.0.dev10}/langgraph_api/event_streaming/service.py +10 -4
- {langgraph_api-0.18.0.dev9 → langgraph_api-0.18.0.dev10}/langgraph_api/executor/__main__.py +32 -9
- {langgraph_api-0.18.0.dev9 → langgraph_api-0.18.0.dev10}/langgraph_api/grpc/ops/threads.py +6 -0
- {langgraph_api-0.18.0.dev9 → langgraph_api-0.18.0.dev10}/langgraph_api/logging.py +7 -1
- {langgraph_api-0.18.0.dev9 → langgraph_api-0.18.0.dev10}/langgraph_api/schema.py +13 -0
- {langgraph_api-0.18.0.dev9 → langgraph_api-0.18.0.dev10}/langgraph_api/state.py +52 -2
- {langgraph_api-0.18.0.dev9 → langgraph_api-0.18.0.dev10}/langgraph_api/worker.py +4 -6
- {langgraph_api-0.18.0.dev9 → langgraph_api-0.18.0.dev10}/langgraph_grpc_common/checkpointer.py +20 -0
- {langgraph_api-0.18.0.dev9 → langgraph_api-0.18.0.dev10}/langgraph_grpc_common/proto/checkpointer_pb2.py +30 -30
- {langgraph_api-0.18.0.dev9 → langgraph_api-0.18.0.dev10}/langgraph_grpc_common/proto/checkpointer_pb2.pyi +9 -1
- {langgraph_api-0.18.0.dev9 → langgraph_api-0.18.0.dev10}/langgraph_grpc_common/proto/orchestrator_pb2.py +12 -12
- {langgraph_api-0.18.0.dev9 → langgraph_api-0.18.0.dev10}/langgraph_grpc_common/proto/orchestrator_pb2.pyi +8 -1
- {langgraph_api-0.18.0.dev9 → langgraph_api-0.18.0.dev10}/openapi.json +57 -0
- {langgraph_api-0.18.0.dev9 → langgraph_api-0.18.0.dev10}/pyproject.toml +2 -0
- {langgraph_api-0.18.0.dev9 → langgraph_api-0.18.0.dev10}/uv.lock +310 -3
- langgraph_api-0.18.0.dev9/langgraph_api/__init__.py +0 -1
- langgraph_api-0.18.0.dev9/langgraph_api/api/mcp/__init__.py +0 -14
- langgraph_api-0.18.0.dev9/langgraph_api/api/mcp/_calls.py +0 -29
- langgraph_api-0.18.0.dev9/langgraph_api/api/mcp/_constants.py +0 -28
- langgraph_api-0.18.0.dev9/langgraph_api/api/mcp/_handlers.py +0 -365
- langgraph_api-0.18.0.dev9/langgraph_api/api/mcp/_models.py +0 -29
- langgraph_api-0.18.0.dev9/langgraph_api/api/mcp/_protocol.py +0 -224
- langgraph_api-0.18.0.dev9/langgraph_api/api/mcp/_routes.py +0 -37
- {langgraph_api-0.18.0.dev9 → langgraph_api-0.18.0.dev10}/.gitignore +0 -0
- {langgraph_api-0.18.0.dev9 → langgraph_api-0.18.0.dev10}/LICENSE +0 -0
- {langgraph_api-0.18.0.dev9 → langgraph_api-0.18.0.dev10}/Makefile +0 -0
- {langgraph_api-0.18.0.dev9 → langgraph_api-0.18.0.dev10}/README.md +0 -0
- {langgraph_api-0.18.0.dev9 → langgraph_api-0.18.0.dev10}/benchmark/.gitignore +0 -0
- {langgraph_api-0.18.0.dev9 → langgraph_api-0.18.0.dev10}/benchmark/Makefile +0 -0
- {langgraph_api-0.18.0.dev9 → langgraph_api-0.18.0.dev10}/benchmark/README.md +0 -0
- {langgraph_api-0.18.0.dev9 → langgraph_api-0.18.0.dev10}/benchmark/REPORTS.md +0 -0
- {langgraph_api-0.18.0.dev9 → langgraph_api-0.18.0.dev10}/benchmark/benchmark-runners/assistant.ts +0 -0
- {langgraph_api-0.18.0.dev9 → langgraph_api-0.18.0.dev10}/benchmark/benchmark-runners/benchmark-runner.ts +0 -0
- {langgraph_api-0.18.0.dev9 → langgraph_api-0.18.0.dev10}/benchmark/benchmark-runners/benchmark_profiles.ts +0 -0
- {langgraph_api-0.18.0.dev9 → langgraph_api-0.18.0.dev10}/benchmark/benchmark-runners/benchmarks.ts +0 -0
- {langgraph_api-0.18.0.dev9 → langgraph_api-0.18.0.dev10}/benchmark/benchmark-runners/cancel_first_second_completes.ts +0 -0
- {langgraph_api-0.18.0.dev9 → langgraph_api-0.18.0.dev10}/benchmark/benchmark-runners/classify-error.test.js +0 -0
- {langgraph_api-0.18.0.dev9 → langgraph_api-0.18.0.dev10}/benchmark/benchmark-runners/classify-error.ts +0 -0
- {langgraph_api-0.18.0.dev9 → langgraph_api-0.18.0.dev10}/benchmark/benchmark-runners/delta-turns-lib.test.js +0 -0
- {langgraph_api-0.18.0.dev9 → langgraph_api-0.18.0.dev10}/benchmark/benchmark-runners/delta-turns-lib.ts +0 -0
- {langgraph_api-0.18.0.dev9 → langgraph_api-0.18.0.dev10}/benchmark/benchmark-runners/delta_turns.ts +0 -0
- {langgraph_api-0.18.0.dev9 → langgraph_api-0.18.0.dev10}/benchmark/benchmark-runners/enqueued_runs_order.ts +0 -0
- {langgraph_api-0.18.0.dev9 → langgraph_api-0.18.0.dev10}/benchmark/benchmark-runners/interrupt_resume.ts +0 -0
- {langgraph_api-0.18.0.dev9 → langgraph_api-0.18.0.dev10}/benchmark/benchmark-runners/log-failure.ts +0 -0
- {langgraph_api-0.18.0.dev9 → langgraph_api-0.18.0.dev10}/benchmark/benchmark-runners/meta_workload.ts +0 -0
- {langgraph_api-0.18.0.dev9 → langgraph_api-0.18.0.dev10}/benchmark/benchmark-runners/store.ts +0 -0
- {langgraph_api-0.18.0.dev9 → langgraph_api-0.18.0.dev10}/benchmark/benchmark-runners/stream_write.ts +0 -0
- {langgraph_api-0.18.0.dev9 → langgraph_api-0.18.0.dev10}/benchmark/benchmark-runners/thread.ts +0 -0
- {langgraph_api-0.18.0.dev9 → langgraph_api-0.18.0.dev10}/benchmark/benchmark-runners/thread_runs_metadata_search.ts +0 -0
- {langgraph_api-0.18.0.dev9 → langgraph_api-0.18.0.dev10}/benchmark/benchmark-runners/threads_search_metadata.ts +0 -0
- {langgraph_api-0.18.0.dev9 → langgraph_api-0.18.0.dev10}/benchmark/benchmark-runners/types.ts +0 -0
- {langgraph_api-0.18.0.dev9 → langgraph_api-0.18.0.dev10}/benchmark/benchmark-runners/wait_write.ts +0 -0
- {langgraph_api-0.18.0.dev9 → langgraph_api-0.18.0.dev10}/benchmark/capacity-ci.js +0 -0
- {langgraph_api-0.18.0.dev9 → langgraph_api-0.18.0.dev10}/benchmark/capacity-ci.test.js +0 -0
- {langgraph_api-0.18.0.dev9 → langgraph_api-0.18.0.dev10}/benchmark/clean-cli.js +0 -0
- {langgraph_api-0.18.0.dev9 → langgraph_api-0.18.0.dev10}/benchmark/clean.js +0 -0
- {langgraph_api-0.18.0.dev9 → langgraph_api-0.18.0.dev10}/benchmark/continuous/README.md +0 -0
- {langgraph_api-0.18.0.dev9 → langgraph_api-0.18.0.dev10}/benchmark/continuous/pyproject.toml +0 -0
- {langgraph_api-0.18.0.dev9 → langgraph_api-0.18.0.dev10}/benchmark/continuous/runner.py +0 -0
- {langgraph_api-0.18.0.dev9 → langgraph_api-0.18.0.dev10}/benchmark/continuous/uv.lock +0 -0
- {langgraph_api-0.18.0.dev9 → langgraph_api-0.18.0.dev10}/benchmark/daily-report.js +0 -0
- {langgraph_api-0.18.0.dev9 → langgraph_api-0.18.0.dev10}/benchmark/daily-report.test.js +0 -0
- {langgraph_api-0.18.0.dev9 → langgraph_api-0.18.0.dev10}/benchmark/delta-report.js +0 -0
- {langgraph_api-0.18.0.dev9 → langgraph_api-0.18.0.dev10}/benchmark/delta-report.test.js +0 -0
- {langgraph_api-0.18.0.dev9 → langgraph_api-0.18.0.dev10}/benchmark/graphs.js +0 -0
- {langgraph_api-0.18.0.dev9 → langgraph_api-0.18.0.dev10}/benchmark/history.js +0 -0
- {langgraph_api-0.18.0.dev9 → langgraph_api-0.18.0.dev10}/benchmark/history.test.js +0 -0
- {langgraph_api-0.18.0.dev9 → langgraph_api-0.18.0.dev10}/benchmark/host-v2.js +0 -0
- {langgraph_api-0.18.0.dev9 → langgraph_api-0.18.0.dev10}/benchmark/host-v2.test.js +0 -0
- {langgraph_api-0.18.0.dev9 → langgraph_api-0.18.0.dev10}/benchmark/multer.test.js +0 -0
- {langgraph_api-0.18.0.dev9 → langgraph_api-0.18.0.dev10}/benchmark/package.json +0 -0
- {langgraph_api-0.18.0.dev9 → langgraph_api-0.18.0.dev10}/benchmark/ramp.js +0 -0
- {langgraph_api-0.18.0.dev9 → langgraph_api-0.18.0.dev10}/benchmark/reporting/dd_reporting.py +0 -0
- {langgraph_api-0.18.0.dev9 → langgraph_api-0.18.0.dev10}/benchmark/runner-descriptions.js +0 -0
- {langgraph_api-0.18.0.dev9 → langgraph_api-0.18.0.dev10}/benchmark/server-metrics.js +0 -0
- {langgraph_api-0.18.0.dev9 → langgraph_api-0.18.0.dev10}/benchmark/server-metrics.test.js +0 -0
- {langgraph_api-0.18.0.dev9 → langgraph_api-0.18.0.dev10}/benchmark/slack.js +0 -0
- {langgraph_api-0.18.0.dev9 → langgraph_api-0.18.0.dev10}/benchmark/staircase.py +0 -0
- {langgraph_api-0.18.0.dev9 → langgraph_api-0.18.0.dev10}/benchmark/staircase_step_k6.js +0 -0
- {langgraph_api-0.18.0.dev9 → langgraph_api-0.18.0.dev10}/benchmark/tsconfig.json +0 -0
- {langgraph_api-0.18.0.dev9 → langgraph_api-0.18.0.dev10}/benchmark/update-revision.js +0 -0
- {langgraph_api-0.18.0.dev9 → langgraph_api-0.18.0.dev10}/benchmark/weather.js +0 -0
- {langgraph_api-0.18.0.dev9 → langgraph_api-0.18.0.dev10}/benchmark/yarn.lock +0 -0
- {langgraph_api-0.18.0.dev9 → langgraph_api-0.18.0.dev10}/constraints.txt +0 -0
- {langgraph_api-0.18.0.dev9 → langgraph_api-0.18.0.dev10}/custom_store.sql +0 -0
- {langgraph_api-0.18.0.dev9 → langgraph_api-0.18.0.dev10}/forbidden.txt +0 -0
- {langgraph_api-0.18.0.dev9 → langgraph_api-0.18.0.dev10}/hatch_build.py +0 -0
- {langgraph_api-0.18.0.dev9 → langgraph_api-0.18.0.dev10}/healthcheck.py +0 -0
- {langgraph_api-0.18.0.dev9 → langgraph_api-0.18.0.dev10}/langgraph-cloud-debugging-20260210132856.zip +0 -0
- {langgraph_api-0.18.0.dev9 → langgraph_api-0.18.0.dev10}/langgraph_api/_checkpointer/__init__.py +0 -0
- {langgraph_api-0.18.0.dev9 → langgraph_api-0.18.0.dev10}/langgraph_api/_checkpointer/_adapter.py +0 -0
- {langgraph_api-0.18.0.dev9 → langgraph_api-0.18.0.dev10}/langgraph_api/_checkpointer/protocol.py +0 -0
- {langgraph_api-0.18.0.dev9 → langgraph_api-0.18.0.dev10}/langgraph_api/_factory_utils.py +0 -0
- {langgraph_api-0.18.0.dev9 → langgraph_api-0.18.0.dev10}/langgraph_api/api/__init__.py +0 -0
- {langgraph_api-0.18.0.dev9 → langgraph_api-0.18.0.dev10}/langgraph_api/api/a2a.py +0 -0
- {langgraph_api-0.18.0.dev9 → langgraph_api-0.18.0.dev10}/langgraph_api/api/a2ui.py +0 -0
- {langgraph_api-0.18.0.dev9 → langgraph_api-0.18.0.dev10}/langgraph_api/api/a2ui_schemas/README.md +0 -0
- {langgraph_api-0.18.0.dev9 → langgraph_api-0.18.0.dev10}/langgraph_api/api/a2ui_schemas/client_capabilities.json +0 -0
- {langgraph_api-0.18.0.dev9 → langgraph_api-0.18.0.dev10}/langgraph_api/api/a2ui_schemas/client_data_model.json +0 -0
- {langgraph_api-0.18.0.dev9 → langgraph_api-0.18.0.dev10}/langgraph_api/api/a2ui_schemas/client_to_server.json +0 -0
- {langgraph_api-0.18.0.dev9 → langgraph_api-0.18.0.dev10}/langgraph_api/api/a2ui_schemas/server_to_client.json +0 -0
- {langgraph_api-0.18.0.dev9 → langgraph_api-0.18.0.dev10}/langgraph_api/api/assistants.py +0 -0
- {langgraph_api-0.18.0.dev9 → langgraph_api-0.18.0.dev10}/langgraph_api/api/event_streaming.py +0 -0
- {langgraph_api-0.18.0.dev9 → langgraph_api-0.18.0.dev10}/langgraph_api/api/mcp/_origins.py +0 -0
- {langgraph_api-0.18.0.dev9 → langgraph_api-0.18.0.dev10}/langgraph_api/api/mcp/_outcome.py +0 -0
- {langgraph_api-0.18.0.dev9 → langgraph_api-0.18.0.dev10}/langgraph_api/api/profile.py +0 -0
- {langgraph_api-0.18.0.dev9 → langgraph_api-0.18.0.dev10}/langgraph_api/api/runs.py +0 -0
- {langgraph_api-0.18.0.dev9 → langgraph_api-0.18.0.dev10}/langgraph_api/api/store.py +0 -0
- {langgraph_api-0.18.0.dev9 → langgraph_api-0.18.0.dev10}/langgraph_api/api/ui.py +0 -0
- {langgraph_api-0.18.0.dev9 → langgraph_api-0.18.0.dev10}/langgraph_api/asgi_transport.py +0 -0
- {langgraph_api-0.18.0.dev9 → langgraph_api-0.18.0.dev10}/langgraph_api/asyncio.py +0 -0
- {langgraph_api-0.18.0.dev9 → langgraph_api-0.18.0.dev10}/langgraph_api/auth/__init__.py +0 -0
- {langgraph_api-0.18.0.dev9 → langgraph_api-0.18.0.dev10}/langgraph_api/auth/custom.py +0 -0
- {langgraph_api-0.18.0.dev9 → langgraph_api-0.18.0.dev10}/langgraph_api/auth/errors.py +0 -0
- {langgraph_api-0.18.0.dev9 → langgraph_api-0.18.0.dev10}/langgraph_api/auth/langsmith/__init__.py +0 -0
- {langgraph_api-0.18.0.dev9 → langgraph_api-0.18.0.dev10}/langgraph_api/auth/langsmith/backend.py +0 -0
- {langgraph_api-0.18.0.dev9 → langgraph_api-0.18.0.dev10}/langgraph_api/auth/langsmith/client.py +0 -0
- {langgraph_api-0.18.0.dev9 → langgraph_api-0.18.0.dev10}/langgraph_api/auth/middleware.py +0 -0
- {langgraph_api-0.18.0.dev9 → langgraph_api-0.18.0.dev10}/langgraph_api/auth/noop.py +0 -0
- {langgraph_api-0.18.0.dev9 → langgraph_api-0.18.0.dev10}/langgraph_api/auth/studio_user.py +0 -0
- {langgraph_api-0.18.0.dev9 → langgraph_api-0.18.0.dev10}/langgraph_api/beacon_data_plane_jwt_auth.py +0 -0
- {langgraph_api-0.18.0.dev9 → langgraph_api-0.18.0.dev10}/langgraph_api/cache.py +0 -0
- {langgraph_api-0.18.0.dev9 → langgraph_api-0.18.0.dev10}/langgraph_api/cli.py +0 -0
- {langgraph_api-0.18.0.dev9 → langgraph_api-0.18.0.dev10}/langgraph_api/command.py +0 -0
- {langgraph_api-0.18.0.dev9 → langgraph_api-0.18.0.dev10}/langgraph_api/config/_parse.py +0 -0
- {langgraph_api-0.18.0.dev9 → langgraph_api-0.18.0.dev10}/langgraph_api/config/schemas.py +0 -0
- {langgraph_api-0.18.0.dev9 → langgraph_api-0.18.0.dev10}/langgraph_api/cron_scheduler.py +0 -0
- {langgraph_api-0.18.0.dev9 → langgraph_api-0.18.0.dev10}/langgraph_api/drain.py +0 -0
- {langgraph_api-0.18.0.dev9 → langgraph_api-0.18.0.dev10}/langgraph_api/encryption/__init__.py +0 -0
- {langgraph_api-0.18.0.dev9 → langgraph_api-0.18.0.dev10}/langgraph_api/encryption/aes_json.py +0 -0
- {langgraph_api-0.18.0.dev9 → langgraph_api-0.18.0.dev10}/langgraph_api/encryption/context.py +0 -0
- {langgraph_api-0.18.0.dev9 → langgraph_api-0.18.0.dev10}/langgraph_api/encryption/custom.py +0 -0
- {langgraph_api-0.18.0.dev9 → langgraph_api-0.18.0.dev10}/langgraph_api/encryption/middleware.py +0 -0
- {langgraph_api-0.18.0.dev9 → langgraph_api-0.18.0.dev10}/langgraph_api/encryption/shared.py +0 -0
- {langgraph_api-0.18.0.dev9 → langgraph_api-0.18.0.dev10}/langgraph_api/errors.py +0 -0
- {langgraph_api-0.18.0.dev9 → langgraph_api-0.18.0.dev10}/langgraph_api/event_streaming/__init__.py +0 -0
- {langgraph_api-0.18.0.dev9 → langgraph_api-0.18.0.dev10}/langgraph_api/event_streaming/capabilities.py +0 -0
- {langgraph_api-0.18.0.dev9 → langgraph_api-0.18.0.dev10}/langgraph_api/event_streaming/constants.py +0 -0
- {langgraph_api-0.18.0.dev9 → langgraph_api-0.18.0.dev10}/langgraph_api/event_streaming/event_normalizers.py +0 -0
- {langgraph_api-0.18.0.dev9 → langgraph_api-0.18.0.dev10}/langgraph_api/event_streaming/namespace.py +0 -0
- {langgraph_api-0.18.0.dev9 → langgraph_api-0.18.0.dev10}/langgraph_api/event_streaming/session.py +0 -0
- {langgraph_api-0.18.0.dev9 → langgraph_api-0.18.0.dev10}/langgraph_api/event_streaming/state_normalizers.py +0 -0
- {langgraph_api-0.18.0.dev9 → langgraph_api-0.18.0.dev10}/langgraph_api/event_streaming/types.py +0 -0
- {langgraph_api-0.18.0.dev9 → langgraph_api-0.18.0.dev10}/langgraph_api/executor/__init__.py +0 -0
- {langgraph_api-0.18.0.dev9 → langgraph_api-0.18.0.dev10}/langgraph_api/feature_flags.py +0 -0
- {langgraph_api-0.18.0.dev9 → langgraph_api-0.18.0.dev10}/langgraph_api/graph.py +0 -0
- {langgraph_api-0.18.0.dev9 → langgraph_api-0.18.0.dev10}/langgraph_api/grpc/__init__.py +0 -0
- {langgraph_api-0.18.0.dev9 → langgraph_api-0.18.0.dev10}/langgraph_api/grpc/client.py +0 -0
- {langgraph_api-0.18.0.dev9 → langgraph_api-0.18.0.dev10}/langgraph_api/grpc/generated/core_api_pb2.pyi +0 -0
- {langgraph_api-0.18.0.dev9 → langgraph_api-0.18.0.dev10}/langgraph_api/grpc/ops/__init__.py +0 -0
- {langgraph_api-0.18.0.dev9 → langgraph_api-0.18.0.dev10}/langgraph_api/grpc/ops/assistants.py +0 -0
- {langgraph_api-0.18.0.dev9 → langgraph_api-0.18.0.dev10}/langgraph_api/grpc/ops/cache.py +0 -0
- {langgraph_api-0.18.0.dev9 → langgraph_api-0.18.0.dev10}/langgraph_api/grpc/ops/crons.py +0 -0
- {langgraph_api-0.18.0.dev9 → langgraph_api-0.18.0.dev10}/langgraph_api/grpc/ops/runs.py +0 -0
- {langgraph_api-0.18.0.dev9 → langgraph_api-0.18.0.dev10}/langgraph_api/grpc/server.py +0 -0
- {langgraph_api-0.18.0.dev9 → langgraph_api-0.18.0.dev10}/langgraph_api/grpc/servicers/__init__.py +0 -0
- {langgraph_api-0.18.0.dev9 → langgraph_api-0.18.0.dev10}/langgraph_api/grpc/servicers/checkpointer.py +0 -0
- {langgraph_api-0.18.0.dev9 → langgraph_api-0.18.0.dev10}/langgraph_api/grpc/servicers/encryption.py +0 -0
- {langgraph_api-0.18.0.dev9 → langgraph_api-0.18.0.dev10}/langgraph_api/http.py +0 -0
- {langgraph_api-0.18.0.dev9 → langgraph_api-0.18.0.dev10}/langgraph_api/http_metrics.py +0 -0
- {langgraph_api-0.18.0.dev9 → langgraph_api-0.18.0.dev10}/langgraph_api/http_metrics_utils.py +0 -0
- {langgraph_api-0.18.0.dev9 → langgraph_api-0.18.0.dev10}/langgraph_api/js/.gitignore +0 -0
- {langgraph_api-0.18.0.dev9 → langgraph_api-0.18.0.dev10}/langgraph_api/js/.prettierrc +0 -0
- {langgraph_api-0.18.0.dev9 → langgraph_api-0.18.0.dev10}/langgraph_api/js/.yarnclean +0 -0
- {langgraph_api-0.18.0.dev9 → langgraph_api-0.18.0.dev10}/langgraph_api/js/__init__.py +0 -0
- {langgraph_api-0.18.0.dev9 → langgraph_api-0.18.0.dev10}/langgraph_api/js/base.py +0 -0
- {langgraph_api-0.18.0.dev9 → langgraph_api-0.18.0.dev10}/langgraph_api/js/build.mts +0 -0
- {langgraph_api-0.18.0.dev9 → langgraph_api-0.18.0.dev10}/langgraph_api/js/client.http.mts +0 -0
- {langgraph_api-0.18.0.dev9 → langgraph_api-0.18.0.dev10}/langgraph_api/js/client.mts +0 -0
- {langgraph_api-0.18.0.dev9 → langgraph_api-0.18.0.dev10}/langgraph_api/js/errors.py +0 -0
- {langgraph_api-0.18.0.dev9 → langgraph_api-0.18.0.dev10}/langgraph_api/js/global.d.ts +0 -0
- {langgraph_api-0.18.0.dev9 → langgraph_api-0.18.0.dev10}/langgraph_api/js/package.json +0 -0
- {langgraph_api-0.18.0.dev9 → langgraph_api-0.18.0.dev10}/langgraph_api/js/remote.py +0 -0
- {langgraph_api-0.18.0.dev9 → langgraph_api-0.18.0.dev10}/langgraph_api/js/schema.py +0 -0
- {langgraph_api-0.18.0.dev9 → langgraph_api-0.18.0.dev10}/langgraph_api/js/src/auth-mutations.mts +0 -0
- {langgraph_api-0.18.0.dev9 → langgraph_api-0.18.0.dev10}/langgraph_api/js/src/graph.mts +0 -0
- {langgraph_api-0.18.0.dev9 → langgraph_api-0.18.0.dev10}/langgraph_api/js/src/load.hooks.mjs +0 -0
- {langgraph_api-0.18.0.dev9 → langgraph_api-0.18.0.dev10}/langgraph_api/js/src/preload.mjs +0 -0
- {langgraph_api-0.18.0.dev9 → langgraph_api-0.18.0.dev10}/langgraph_api/js/src/utils/experiment-tracing.mts +0 -0
- {langgraph_api-0.18.0.dev9 → langgraph_api-0.18.0.dev10}/langgraph_api/js/src/utils/files.mts +0 -0
- {langgraph_api-0.18.0.dev9 → langgraph_api-0.18.0.dev10}/langgraph_api/js/src/utils/importMap.mts +0 -0
- {langgraph_api-0.18.0.dev9 → langgraph_api-0.18.0.dev10}/langgraph_api/js/src/utils/pythonSchemas.mts +0 -0
- {langgraph_api-0.18.0.dev9 → langgraph_api-0.18.0.dev10}/langgraph_api/js/src/utils/serde.mts +0 -0
- {langgraph_api-0.18.0.dev9 → langgraph_api-0.18.0.dev10}/langgraph_api/js/sse.py +0 -0
- {langgraph_api-0.18.0.dev9 → langgraph_api-0.18.0.dev10}/langgraph_api/js/traceblock.mts +0 -0
- {langgraph_api-0.18.0.dev9 → langgraph_api-0.18.0.dev10}/langgraph_api/js/tsconfig.json +0 -0
- {langgraph_api-0.18.0.dev9 → langgraph_api-0.18.0.dev10}/langgraph_api/js/ui.py +0 -0
- {langgraph_api-0.18.0.dev9 → langgraph_api-0.18.0.dev10}/langgraph_api/js/yarn.lock +0 -0
- {langgraph_api-0.18.0.dev9 → langgraph_api-0.18.0.dev10}/langgraph_api/lc_security/__init__.py +0 -0
- {langgraph_api-0.18.0.dev9 → langgraph_api-0.18.0.dev10}/langgraph_api/lc_security/exceptions.py +0 -0
- {langgraph_api-0.18.0.dev9 → langgraph_api-0.18.0.dev10}/langgraph_api/lc_security/policy.py +0 -0
- {langgraph_api-0.18.0.dev9 → langgraph_api-0.18.0.dev10}/langgraph_api/lc_security/transport.py +0 -0
- {langgraph_api-0.18.0.dev9 → langgraph_api-0.18.0.dev10}/langgraph_api/metadata.py +0 -0
- {langgraph_api-0.18.0.dev9 → langgraph_api-0.18.0.dev10}/langgraph_api/metrics_collector.py +0 -0
- {langgraph_api-0.18.0.dev9 → langgraph_api-0.18.0.dev10}/langgraph_api/metrics_otlp.py +0 -0
- {langgraph_api-0.18.0.dev9 → langgraph_api-0.18.0.dev10}/langgraph_api/middleware/__init__.py +0 -0
- {langgraph_api-0.18.0.dev9 → langgraph_api-0.18.0.dev10}/langgraph_api/middleware/ensure_store.py +0 -0
- {langgraph_api-0.18.0.dev9 → langgraph_api-0.18.0.dev10}/langgraph_api/middleware/http_logger.py +0 -0
- {langgraph_api-0.18.0.dev9 → langgraph_api-0.18.0.dev10}/langgraph_api/middleware/private_network.py +0 -0
- {langgraph_api-0.18.0.dev9 → langgraph_api-0.18.0.dev10}/langgraph_api/middleware/request_id.py +0 -0
- {langgraph_api-0.18.0.dev9 → langgraph_api-0.18.0.dev10}/langgraph_api/models/__init__.py +0 -0
- {langgraph_api-0.18.0.dev9 → langgraph_api-0.18.0.dev10}/langgraph_api/models/run.py +0 -0
- {langgraph_api-0.18.0.dev9 → langgraph_api-0.18.0.dev10}/langgraph_api/operator_routes.py +0 -0
- {langgraph_api-0.18.0.dev9 → langgraph_api-0.18.0.dev10}/langgraph_api/otel_context.py +0 -0
- {langgraph_api-0.18.0.dev9 → langgraph_api-0.18.0.dev10}/langgraph_api/patch.py +0 -0
- {langgraph_api-0.18.0.dev9 → langgraph_api-0.18.0.dev10}/langgraph_api/queue_entrypoint.py +0 -0
- {langgraph_api-0.18.0.dev9 → langgraph_api-0.18.0.dev10}/langgraph_api/release_tags.py +0 -0
- {langgraph_api-0.18.0.dev9 → langgraph_api-0.18.0.dev10}/langgraph_api/route.py +0 -0
- {langgraph_api-0.18.0.dev9 → langgraph_api-0.18.0.dev10}/langgraph_api/self_hosted_logs.py +0 -0
- {langgraph_api-0.18.0.dev9 → langgraph_api-0.18.0.dev10}/langgraph_api/self_hosted_metrics.py +0 -0
- {langgraph_api-0.18.0.dev9 → langgraph_api-0.18.0.dev10}/langgraph_api/serde.py +0 -0
- {langgraph_api-0.18.0.dev9 → langgraph_api-0.18.0.dev10}/langgraph_api/server.py +0 -0
- {langgraph_api-0.18.0.dev9 → langgraph_api-0.18.0.dev10}/langgraph_api/sse.py +0 -0
- {langgraph_api-0.18.0.dev9 → langgraph_api-0.18.0.dev10}/langgraph_api/store.py +0 -0
- {langgraph_api-0.18.0.dev9 → langgraph_api-0.18.0.dev10}/langgraph_api/stream.py +0 -0
- {langgraph_api-0.18.0.dev9 → langgraph_api-0.18.0.dev10}/langgraph_api/stream_v2.py +0 -0
- {langgraph_api-0.18.0.dev9 → langgraph_api-0.18.0.dev10}/langgraph_api/timing/__init__.py +0 -0
- {langgraph_api-0.18.0.dev9 → langgraph_api-0.18.0.dev10}/langgraph_api/timing/profiler.py +0 -0
- {langgraph_api-0.18.0.dev9 → langgraph_api-0.18.0.dev10}/langgraph_api/timing/startup.py +0 -0
- {langgraph_api-0.18.0.dev9 → langgraph_api-0.18.0.dev10}/langgraph_api/timing/timer.py +0 -0
- {langgraph_api-0.18.0.dev9 → langgraph_api-0.18.0.dev10}/langgraph_api/traceblock.py +0 -0
- {langgraph_api-0.18.0.dev9 → langgraph_api-0.18.0.dev10}/langgraph_api/tracing_session.py +0 -0
- {langgraph_api-0.18.0.dev9 → langgraph_api-0.18.0.dev10}/langgraph_api/tunneling/cloudflare.py +0 -0
- {langgraph_api-0.18.0.dev9 → langgraph_api-0.18.0.dev10}/langgraph_api/utils/__init__.py +0 -0
- {langgraph_api-0.18.0.dev9 → langgraph_api-0.18.0.dev10}/langgraph_api/utils/cache.py +0 -0
- {langgraph_api-0.18.0.dev9 → langgraph_api-0.18.0.dev10}/langgraph_api/utils/config.py +0 -0
- {langgraph_api-0.18.0.dev9 → langgraph_api-0.18.0.dev10}/langgraph_api/utils/errors.py +0 -0
- {langgraph_api-0.18.0.dev9 → langgraph_api-0.18.0.dev10}/langgraph_api/utils/extract.py +0 -0
- {langgraph_api-0.18.0.dev9 → langgraph_api-0.18.0.dev10}/langgraph_api/utils/future.py +0 -0
- {langgraph_api-0.18.0.dev9 → langgraph_api-0.18.0.dev10}/langgraph_api/utils/headers.py +0 -0
- {langgraph_api-0.18.0.dev9 → langgraph_api-0.18.0.dev10}/langgraph_api/utils/network.py +0 -0
- {langgraph_api-0.18.0.dev9 → langgraph_api-0.18.0.dev10}/langgraph_api/utils/retriable_client.py +0 -0
- {langgraph_api-0.18.0.dev9 → langgraph_api-0.18.0.dev10}/langgraph_api/utils/stream_codec.py +0 -0
- {langgraph_api-0.18.0.dev9 → langgraph_api-0.18.0.dev10}/langgraph_api/utils/uuids.py +0 -0
- {langgraph_api-0.18.0.dev9 → langgraph_api-0.18.0.dev10}/langgraph_api/validation.py +0 -0
- {langgraph_api-0.18.0.dev9 → langgraph_api-0.18.0.dev10}/langgraph_api/webhook.py +0 -0
- {langgraph_api-0.18.0.dev9 → langgraph_api-0.18.0.dev10}/langgraph_api/worker_runtime.py +0 -0
- {langgraph_api-0.18.0.dev9 → langgraph_api-0.18.0.dev10}/langgraph_grpc_common/__init__.py +0 -0
- {langgraph_api-0.18.0.dev9 → langgraph_api-0.18.0.dev10}/langgraph_grpc_common/conversion/__init__.py +0 -0
- {langgraph_api-0.18.0.dev9 → langgraph_api-0.18.0.dev10}/langgraph_grpc_common/conversion/_compat.py +0 -0
- {langgraph_api-0.18.0.dev9 → langgraph_api-0.18.0.dev10}/langgraph_grpc_common/conversion/checkpoint.py +0 -0
- {langgraph_api-0.18.0.dev9 → langgraph_api-0.18.0.dev10}/langgraph_grpc_common/conversion/config.py +0 -0
- {langgraph_api-0.18.0.dev9 → langgraph_api-0.18.0.dev10}/langgraph_grpc_common/conversion/durability.py +0 -0
- {langgraph_api-0.18.0.dev9 → langgraph_api-0.18.0.dev10}/langgraph_grpc_common/conversion/store.py +0 -0
- {langgraph_api-0.18.0.dev9 → langgraph_api-0.18.0.dev10}/langgraph_grpc_common/conversion/struct.py +0 -0
- {langgraph_api-0.18.0.dev9 → langgraph_api-0.18.0.dev10}/langgraph_grpc_common/conversion/value.py +0 -0
- {langgraph_api-0.18.0.dev9 → langgraph_api-0.18.0.dev10}/langgraph_grpc_common/proto/__init__.py +0 -0
- {langgraph_api-0.18.0.dev9 → langgraph_api-0.18.0.dev10}/langgraph_grpc_common/proto/checkpointer_pb2_grpc.py +0 -0
- {langgraph_api-0.18.0.dev9 → langgraph_api-0.18.0.dev10}/langgraph_grpc_common/proto/checkpointer_pb2_grpc.pyi +0 -0
- {langgraph_api-0.18.0.dev9 → langgraph_api-0.18.0.dev10}/langgraph_grpc_common/proto/core_api_pb2.py +0 -0
- {langgraph_api-0.18.0.dev9 → langgraph_api-0.18.0.dev10}/langgraph_grpc_common/proto/core_api_pb2.pyi +0 -0
- {langgraph_api-0.18.0.dev9 → langgraph_api-0.18.0.dev10}/langgraph_grpc_common/proto/core_api_pb2_grpc.py +0 -0
- {langgraph_api-0.18.0.dev9 → langgraph_api-0.18.0.dev10}/langgraph_grpc_common/proto/core_api_pb2_grpc.pyi +0 -0
- {langgraph_api-0.18.0.dev9 → langgraph_api-0.18.0.dev10}/langgraph_grpc_common/proto/encryption_pb2.py +0 -0
- {langgraph_api-0.18.0.dev9 → langgraph_api-0.18.0.dev10}/langgraph_grpc_common/proto/encryption_pb2.pyi +0 -0
- {langgraph_api-0.18.0.dev9 → langgraph_api-0.18.0.dev10}/langgraph_grpc_common/proto/encryption_pb2_grpc.py +0 -0
- {langgraph_api-0.18.0.dev9 → langgraph_api-0.18.0.dev10}/langgraph_grpc_common/proto/encryption_pb2_grpc.pyi +0 -0
- {langgraph_api-0.18.0.dev9 → langgraph_api-0.18.0.dev10}/langgraph_grpc_common/proto/engine_common_pb2.py +0 -0
- {langgraph_api-0.18.0.dev9 → langgraph_api-0.18.0.dev10}/langgraph_grpc_common/proto/engine_common_pb2.pyi +0 -0
- {langgraph_api-0.18.0.dev9 → langgraph_api-0.18.0.dev10}/langgraph_grpc_common/proto/engine_common_pb2_grpc.py +0 -0
- {langgraph_api-0.18.0.dev9 → langgraph_api-0.18.0.dev10}/langgraph_grpc_common/proto/engine_common_pb2_grpc.pyi +0 -0
- {langgraph_api-0.18.0.dev9 → langgraph_api-0.18.0.dev10}/langgraph_grpc_common/proto/enum_cancel_run_action_pb2.py +0 -0
- {langgraph_api-0.18.0.dev9 → langgraph_api-0.18.0.dev10}/langgraph_grpc_common/proto/enum_cancel_run_action_pb2.pyi +0 -0
- {langgraph_api-0.18.0.dev9 → langgraph_api-0.18.0.dev10}/langgraph_grpc_common/proto/enum_cancel_run_action_pb2_grpc.py +0 -0
- {langgraph_api-0.18.0.dev9 → langgraph_api-0.18.0.dev10}/langgraph_grpc_common/proto/enum_cancel_run_action_pb2_grpc.pyi +0 -0
- {langgraph_api-0.18.0.dev9 → langgraph_api-0.18.0.dev10}/langgraph_grpc_common/proto/enum_control_signal_pb2.py +0 -0
- {langgraph_api-0.18.0.dev9 → langgraph_api-0.18.0.dev10}/langgraph_grpc_common/proto/enum_control_signal_pb2.pyi +0 -0
- {langgraph_api-0.18.0.dev9 → langgraph_api-0.18.0.dev10}/langgraph_grpc_common/proto/enum_control_signal_pb2_grpc.py +0 -0
- {langgraph_api-0.18.0.dev9 → langgraph_api-0.18.0.dev10}/langgraph_grpc_common/proto/enum_control_signal_pb2_grpc.pyi +0 -0
- {langgraph_api-0.18.0.dev9 → langgraph_api-0.18.0.dev10}/langgraph_grpc_common/proto/enum_cron_on_run_completed_pb2.py +0 -0
- {langgraph_api-0.18.0.dev9 → langgraph_api-0.18.0.dev10}/langgraph_grpc_common/proto/enum_cron_on_run_completed_pb2.pyi +0 -0
- {langgraph_api-0.18.0.dev9 → langgraph_api-0.18.0.dev10}/langgraph_grpc_common/proto/enum_cron_on_run_completed_pb2_grpc.py +0 -0
- {langgraph_api-0.18.0.dev9 → langgraph_api-0.18.0.dev10}/langgraph_grpc_common/proto/enum_cron_on_run_completed_pb2_grpc.pyi +0 -0
- {langgraph_api-0.18.0.dev9 → langgraph_api-0.18.0.dev10}/langgraph_grpc_common/proto/enum_durability_pb2.py +0 -0
- {langgraph_api-0.18.0.dev9 → langgraph_api-0.18.0.dev10}/langgraph_grpc_common/proto/enum_durability_pb2.pyi +0 -0
- {langgraph_api-0.18.0.dev9 → langgraph_api-0.18.0.dev10}/langgraph_grpc_common/proto/enum_durability_pb2_grpc.py +0 -0
- {langgraph_api-0.18.0.dev9 → langgraph_api-0.18.0.dev10}/langgraph_grpc_common/proto/enum_durability_pb2_grpc.pyi +0 -0
- {langgraph_api-0.18.0.dev9 → langgraph_api-0.18.0.dev10}/langgraph_grpc_common/proto/enum_multitask_strategy_pb2.py +0 -0
- {langgraph_api-0.18.0.dev9 → langgraph_api-0.18.0.dev10}/langgraph_grpc_common/proto/enum_multitask_strategy_pb2.pyi +0 -0
- {langgraph_api-0.18.0.dev9 → langgraph_api-0.18.0.dev10}/langgraph_grpc_common/proto/enum_multitask_strategy_pb2_grpc.py +0 -0
- {langgraph_api-0.18.0.dev9 → langgraph_api-0.18.0.dev10}/langgraph_grpc_common/proto/enum_multitask_strategy_pb2_grpc.pyi +0 -0
- {langgraph_api-0.18.0.dev9 → langgraph_api-0.18.0.dev10}/langgraph_grpc_common/proto/enum_run_status_pb2.py +0 -0
- {langgraph_api-0.18.0.dev9 → langgraph_api-0.18.0.dev10}/langgraph_grpc_common/proto/enum_run_status_pb2.pyi +0 -0
- {langgraph_api-0.18.0.dev9 → langgraph_api-0.18.0.dev10}/langgraph_grpc_common/proto/enum_run_status_pb2_grpc.py +0 -0
- {langgraph_api-0.18.0.dev9 → langgraph_api-0.18.0.dev10}/langgraph_grpc_common/proto/enum_run_status_pb2_grpc.pyi +0 -0
- {langgraph_api-0.18.0.dev9 → langgraph_api-0.18.0.dev10}/langgraph_grpc_common/proto/enum_stream_mode_pb2.py +0 -0
- {langgraph_api-0.18.0.dev9 → langgraph_api-0.18.0.dev10}/langgraph_grpc_common/proto/enum_stream_mode_pb2.pyi +0 -0
- {langgraph_api-0.18.0.dev9 → langgraph_api-0.18.0.dev10}/langgraph_grpc_common/proto/enum_stream_mode_pb2_grpc.py +0 -0
- {langgraph_api-0.18.0.dev9 → langgraph_api-0.18.0.dev10}/langgraph_grpc_common/proto/enum_stream_mode_pb2_grpc.pyi +0 -0
- {langgraph_api-0.18.0.dev9 → langgraph_api-0.18.0.dev10}/langgraph_grpc_common/proto/enum_thread_status_pb2.py +0 -0
- {langgraph_api-0.18.0.dev9 → langgraph_api-0.18.0.dev10}/langgraph_grpc_common/proto/enum_thread_status_pb2.pyi +0 -0
- {langgraph_api-0.18.0.dev9 → langgraph_api-0.18.0.dev10}/langgraph_grpc_common/proto/enum_thread_status_pb2_grpc.py +0 -0
- {langgraph_api-0.18.0.dev9 → langgraph_api-0.18.0.dev10}/langgraph_grpc_common/proto/enum_thread_status_pb2_grpc.pyi +0 -0
- {langgraph_api-0.18.0.dev9 → langgraph_api-0.18.0.dev10}/langgraph_grpc_common/proto/enum_thread_stream_mode_pb2.py +0 -0
- {langgraph_api-0.18.0.dev9 → langgraph_api-0.18.0.dev10}/langgraph_grpc_common/proto/enum_thread_stream_mode_pb2.pyi +0 -0
- {langgraph_api-0.18.0.dev9 → langgraph_api-0.18.0.dev10}/langgraph_grpc_common/proto/enum_thread_stream_mode_pb2_grpc.py +0 -0
- {langgraph_api-0.18.0.dev9 → langgraph_api-0.18.0.dev10}/langgraph_grpc_common/proto/enum_thread_stream_mode_pb2_grpc.pyi +0 -0
- {langgraph_api-0.18.0.dev9 → langgraph_api-0.18.0.dev10}/langgraph_grpc_common/proto/errors_pb2.py +0 -0
- {langgraph_api-0.18.0.dev9 → langgraph_api-0.18.0.dev10}/langgraph_grpc_common/proto/errors_pb2.pyi +0 -0
- {langgraph_api-0.18.0.dev9 → langgraph_api-0.18.0.dev10}/langgraph_grpc_common/proto/errors_pb2_grpc.py +0 -0
- {langgraph_api-0.18.0.dev9 → langgraph_api-0.18.0.dev10}/langgraph_grpc_common/proto/errors_pb2_grpc.pyi +0 -0
- {langgraph_api-0.18.0.dev9 → langgraph_api-0.18.0.dev10}/langgraph_grpc_common/proto/orchestrator_pb2_grpc.py +0 -0
- {langgraph_api-0.18.0.dev9 → langgraph_api-0.18.0.dev10}/langgraph_grpc_common/proto/orchestrator_pb2_grpc.pyi +0 -0
- {langgraph_api-0.18.0.dev9 → langgraph_api-0.18.0.dev10}/langgraph_grpc_common/proto/store_pb2.py +0 -0
- {langgraph_api-0.18.0.dev9 → langgraph_api-0.18.0.dev10}/langgraph_grpc_common/proto/store_pb2.pyi +0 -0
- {langgraph_api-0.18.0.dev9 → langgraph_api-0.18.0.dev10}/langgraph_grpc_common/proto/store_pb2_grpc.py +0 -0
- {langgraph_api-0.18.0.dev9 → langgraph_api-0.18.0.dev10}/langgraph_grpc_common/proto/store_pb2_grpc.pyi +0 -0
- {langgraph_api-0.18.0.dev9 → langgraph_api-0.18.0.dev10}/langgraph_grpc_common/serde.py +0 -0
- {langgraph_api-0.18.0.dev9 → langgraph_api-0.18.0.dev10}/langgraph_grpc_common/store.py +0 -0
- {langgraph_api-0.18.0.dev9 → langgraph_api-0.18.0.dev10}/langgraph_license/__init__.py +0 -0
- {langgraph_api-0.18.0.dev9 → langgraph_api-0.18.0.dev10}/langgraph_license/validation.py +0 -0
- {langgraph_api-0.18.0.dev9 → langgraph_api-0.18.0.dev10}/langgraph_runtime/__init__.py +0 -0
- {langgraph_api-0.18.0.dev9 → langgraph_api-0.18.0.dev10}/langgraph_runtime/checkpoint.py +0 -0
- {langgraph_api-0.18.0.dev9 → langgraph_api-0.18.0.dev10}/langgraph_runtime/database.py +0 -0
- {langgraph_api-0.18.0.dev9 → langgraph_api-0.18.0.dev10}/langgraph_runtime/encryption.py +0 -0
- {langgraph_api-0.18.0.dev9 → langgraph_api-0.18.0.dev10}/langgraph_runtime/lifespan.py +0 -0
- {langgraph_api-0.18.0.dev9 → langgraph_api-0.18.0.dev10}/langgraph_runtime/metrics.py +0 -0
- {langgraph_api-0.18.0.dev9 → langgraph_api-0.18.0.dev10}/langgraph_runtime/ops.py +0 -0
- {langgraph_api-0.18.0.dev9 → langgraph_api-0.18.0.dev10}/langgraph_runtime/queue.py +0 -0
- {langgraph_api-0.18.0.dev9 → langgraph_api-0.18.0.dev10}/langgraph_runtime/retry.py +0 -0
- {langgraph_api-0.18.0.dev9 → langgraph_api-0.18.0.dev10}/langgraph_runtime/routes.py +0 -0
- {langgraph_api-0.18.0.dev9 → langgraph_api-0.18.0.dev10}/langgraph_runtime/store.py +0 -0
- {langgraph_api-0.18.0.dev9 → langgraph_api-0.18.0.dev10}/logging.json +0 -0
- {langgraph_api-0.18.0.dev9 → langgraph_api-0.18.0.dev10}/scripts/build_wheel.py +0 -0
- {langgraph_api-0.18.0.dev9 → langgraph_api-0.18.0.dev10}/scripts/create_license.py +0 -0
- {langgraph_api-0.18.0.dev9 → langgraph_api-0.18.0.dev10}/scripts/run_a2a_tck.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: langgraph-api
|
|
3
|
-
Version: 0.18.0.
|
|
3
|
+
Version: 0.18.0.dev10
|
|
4
4
|
Author-email: Will Fu-Hinthorn <will@langchain.dev>, Josh Rogers <josh@langchain.dev>, Parker Rule <parker@langchain.dev>
|
|
5
5
|
License: Elastic-2.0
|
|
6
6
|
License-File: LICENSE
|
|
@@ -21,11 +21,13 @@ Requires-Dist: langgraph-runtime-inmem<0.39.0.dev0,>=0.38.0.dev0
|
|
|
21
21
|
Requires-Dist: langgraph-sdk>=0.4.4
|
|
22
22
|
Requires-Dist: langgraph<2,>=0.4.10
|
|
23
23
|
Requires-Dist: langsmith[otel]>=0.6.3
|
|
24
|
+
Requires-Dist: mcp<3,>=2.3.0
|
|
24
25
|
Requires-Dist: opentelemetry-api>=0.0.1
|
|
25
26
|
Requires-Dist: opentelemetry-exporter-otlp-proto-http>=0.0.1
|
|
26
27
|
Requires-Dist: opentelemetry-exporter-prometheus<0.64,>=0.63b1
|
|
27
28
|
Requires-Dist: opentelemetry-sdk>=0.0.1
|
|
28
29
|
Requires-Dist: orjson>=3.9.7
|
|
30
|
+
Requires-Dist: packaging>=23.2
|
|
29
31
|
Requires-Dist: prometheus-client>=0.0.1
|
|
30
32
|
Requires-Dist: protobuf<7.0.0,>=6.32.1
|
|
31
33
|
Requires-Dist: pyjwt>=2.15.0
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
__version__ = "0.18.0.dev10"
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import structlog
|
|
2
|
+
|
|
3
|
+
from langgraph_api.api.mcp._sdk import InstalledSdk
|
|
4
|
+
from langgraph_api.config import MCP_ENABLED
|
|
5
|
+
|
|
6
|
+
__all__ = ["MCP_SERVED", "mcp_routes"]
|
|
7
|
+
|
|
8
|
+
logger = structlog.stdlib.get_logger(__name__)
|
|
9
|
+
SDK = InstalledSdk.find()
|
|
10
|
+
MCP_SERVED = MCP_ENABLED and SDK.is_supported
|
|
11
|
+
|
|
12
|
+
if SDK.is_supported:
|
|
13
|
+
from langgraph_api.api.mcp._routes import mcp_routes
|
|
14
|
+
else:
|
|
15
|
+
mcp_routes = []
|
|
16
|
+
if MCP_ENABLED:
|
|
17
|
+
logger.error(
|
|
18
|
+
"MCP endpoint disabled: the installed MCP SDK is not supported",
|
|
19
|
+
required=str(SDK.required.specifier),
|
|
20
|
+
installed=SDK.installed,
|
|
21
|
+
)
|
|
@@ -0,0 +1,11 @@
|
|
|
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
|
+
PAUSED_TOOL_MESSAGE = (
|
|
7
|
+
"This tool paused to ask for human input, and this client can't answer it."
|
|
8
|
+
)
|
|
9
|
+
RUN_FAILED_MESSAGE = "The tool's run failed."
|
|
10
|
+
INVALID_CURSOR_MESSAGE = "Invalid cursor"
|
|
11
|
+
INTERNAL_ERROR_MESSAGE = "Internal server error"
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
|
|
3
|
+
from http import HTTPStatus
|
|
4
|
+
from typing import TYPE_CHECKING
|
|
5
|
+
|
|
6
|
+
from starlette.responses import Response
|
|
7
|
+
|
|
8
|
+
from langgraph_api.api.mcp._origins import OriginPolicy
|
|
9
|
+
from langgraph_api.api.mcp._server import serve
|
|
10
|
+
from langgraph_api.config import CORS_SETTINGS
|
|
11
|
+
from langgraph_api.route import ApiRequest, ApiResponse, ApiRoute
|
|
12
|
+
|
|
13
|
+
if TYPE_CHECKING:
|
|
14
|
+
from starlette.types import ASGIApp
|
|
15
|
+
|
|
16
|
+
__all__ = ["mcp_routes"]
|
|
17
|
+
|
|
18
|
+
ORIGIN_POLICY = OriginPolicy.of(CORS_SETTINGS)
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
async def handle_mcp_endpoint(request: ApiRequest) -> ASGIApp:
|
|
22
|
+
if not ORIGIN_POLICY.allows(request.headers.get("origin")):
|
|
23
|
+
return ApiResponse(
|
|
24
|
+
{"error": "Origin is not allowed"}, status_code=HTTPStatus.FORBIDDEN
|
|
25
|
+
)
|
|
26
|
+
if request.method != "POST":
|
|
27
|
+
return Response(
|
|
28
|
+
status_code=HTTPStatus.METHOD_NOT_ALLOWED, headers={"Allow": "POST"}
|
|
29
|
+
)
|
|
30
|
+
return serve
|
|
31
|
+
|
|
32
|
+
|
|
33
|
+
mcp_routes = [
|
|
34
|
+
ApiRoute("/mcp", handle_mcp_endpoint, methods=["GET", "POST", "DELETE"]),
|
|
35
|
+
]
|
{langgraph_api-0.18.0.dev9 → langgraph_api-0.18.0.dev10}/langgraph_api/api/mcp/_sanitizers.py
RENAMED
|
@@ -1,6 +1,9 @@
|
|
|
1
1
|
import re
|
|
2
|
+
from collections.abc import Iterable
|
|
2
3
|
from typing import Any
|
|
3
4
|
|
|
5
|
+
from mcp.shared.inbound import X_MCP_HEADER_KEY
|
|
6
|
+
|
|
4
7
|
# MCP tool name constraints per the 2025-11-25 spec.
|
|
5
8
|
# Valid characters: ASCII letters, digits, underscore, hyphen, dot.
|
|
6
9
|
# Length: 1-128 characters.
|
|
@@ -72,6 +75,46 @@ def simplify_mcp_schema_inplace(schema: dict[str, Any]) -> None:
|
|
|
72
75
|
}
|
|
73
76
|
|
|
74
77
|
|
|
78
|
+
_SUBSCHEMA_KEYWORDS = frozenset(
|
|
79
|
+
{
|
|
80
|
+
"items",
|
|
81
|
+
"contains",
|
|
82
|
+
"unevaluatedItems",
|
|
83
|
+
"additionalProperties",
|
|
84
|
+
"propertyNames",
|
|
85
|
+
"unevaluatedProperties",
|
|
86
|
+
"not",
|
|
87
|
+
"if",
|
|
88
|
+
"then",
|
|
89
|
+
"else",
|
|
90
|
+
"contentSchema",
|
|
91
|
+
}
|
|
92
|
+
)
|
|
93
|
+
_SUBSCHEMA_LIST_KEYWORDS = frozenset({"allOf", "anyOf", "oneOf", "prefixItems"})
|
|
94
|
+
_SUBSCHEMA_MAP_KEYWORDS = frozenset(
|
|
95
|
+
{"properties", "patternProperties", "dependentSchemas", "$defs", "definitions"}
|
|
96
|
+
)
|
|
97
|
+
|
|
98
|
+
|
|
99
|
+
def drop_mcp_param_headers_inplace(schema: object) -> None:
|
|
100
|
+
if not isinstance(schema, dict):
|
|
101
|
+
return
|
|
102
|
+
schema.pop(X_MCP_HEADER_KEY, None)
|
|
103
|
+
for keyword, value in schema.items():
|
|
104
|
+
for subschema in _subschemas(keyword, value):
|
|
105
|
+
drop_mcp_param_headers_inplace(subschema)
|
|
106
|
+
|
|
107
|
+
|
|
108
|
+
def _subschemas(keyword: object, value: object) -> Iterable[object]:
|
|
109
|
+
if keyword in _SUBSCHEMA_KEYWORDS:
|
|
110
|
+
return (value,)
|
|
111
|
+
if keyword in _SUBSCHEMA_LIST_KEYWORDS and isinstance(value, list):
|
|
112
|
+
return value
|
|
113
|
+
if keyword in _SUBSCHEMA_MAP_KEYWORDS and isinstance(value, dict):
|
|
114
|
+
return value.values()
|
|
115
|
+
return ()
|
|
116
|
+
|
|
117
|
+
|
|
75
118
|
def normalize_name(name: str) -> str:
|
|
76
119
|
"""Convert an assistant name to a valid MCP tool name.
|
|
77
120
|
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
|
|
3
|
+
from dataclasses import dataclass
|
|
4
|
+
from importlib.metadata import PackageNotFoundError, requires, version
|
|
5
|
+
|
|
6
|
+
from packaging.requirements import Requirement
|
|
7
|
+
|
|
8
|
+
SERVER_DISTRIBUTION = "langgraph-api"
|
|
9
|
+
SDK_DISTRIBUTION = "mcp"
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
@dataclass(frozen=True, slots=True)
|
|
13
|
+
class InstalledSdk:
|
|
14
|
+
required: Requirement
|
|
15
|
+
installed: str | None
|
|
16
|
+
|
|
17
|
+
@classmethod
|
|
18
|
+
def find(cls) -> InstalledSdk:
|
|
19
|
+
return cls(_declared_requirement(), _installed_version())
|
|
20
|
+
|
|
21
|
+
@property
|
|
22
|
+
def is_supported(self) -> bool:
|
|
23
|
+
return self.installed is not None and self.required.specifier.contains(
|
|
24
|
+
self.installed, prereleases=True
|
|
25
|
+
)
|
|
26
|
+
|
|
27
|
+
|
|
28
|
+
def _declared_requirement() -> Requirement:
|
|
29
|
+
return next(
|
|
30
|
+
requirement
|
|
31
|
+
for requirement in map(Requirement, requires(SERVER_DISTRIBUTION) or ())
|
|
32
|
+
if requirement.name == SDK_DISTRIBUTION
|
|
33
|
+
)
|
|
34
|
+
|
|
35
|
+
|
|
36
|
+
def _installed_version() -> str | None:
|
|
37
|
+
try:
|
|
38
|
+
return version(SDK_DISTRIBUTION)
|
|
39
|
+
except PackageNotFoundError:
|
|
40
|
+
return None
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
|
|
3
|
+
from typing import TYPE_CHECKING
|
|
4
|
+
|
|
5
|
+
from mcp.server.caching import CacheHint
|
|
6
|
+
from mcp.server.lowlevel import Server
|
|
7
|
+
from mcp.server.streamable_http_manager import StreamableHTTPSessionManager
|
|
8
|
+
|
|
9
|
+
from langgraph_api import __version__
|
|
10
|
+
from langgraph_api.api.mcp._calls import ToolCallParams
|
|
11
|
+
from langgraph_api.api.mcp._tools import AssistantTools
|
|
12
|
+
from langgraph_api.config import HTTP_MAX_REQUEST_BODY_BYTES
|
|
13
|
+
|
|
14
|
+
if TYPE_CHECKING:
|
|
15
|
+
import mcp_types as types
|
|
16
|
+
from mcp.server.context import ServerRequestContext
|
|
17
|
+
from starlette.types import Receive, Scope, Send
|
|
18
|
+
|
|
19
|
+
UNCACHED = CacheHint(ttl_ms=0, scope="private")
|
|
20
|
+
HTTP_WHITESPACE = b" \t"
|
|
21
|
+
|
|
22
|
+
|
|
23
|
+
async def _list_tools(
|
|
24
|
+
ctx: ServerRequestContext, params: types.PaginatedRequestParams | None
|
|
25
|
+
) -> types.ListToolsResult:
|
|
26
|
+
return await AssistantTools.of(ctx).list(params.cursor if params else None)
|
|
27
|
+
|
|
28
|
+
|
|
29
|
+
async def _call_tool(
|
|
30
|
+
ctx: ServerRequestContext, params: ToolCallParams
|
|
31
|
+
) -> types.CallToolResult:
|
|
32
|
+
return await AssistantTools.of(ctx).call(params)
|
|
33
|
+
|
|
34
|
+
|
|
35
|
+
def _tools_declare_no_param_headers(_tool_name: str) -> None:
|
|
36
|
+
return None
|
|
37
|
+
|
|
38
|
+
|
|
39
|
+
SERVER = Server(
|
|
40
|
+
"LangGraph",
|
|
41
|
+
version=__version__,
|
|
42
|
+
cache_hints={"server/discover": UNCACHED, "tools/list": UNCACHED},
|
|
43
|
+
get_tool_input_schema=_tools_declare_no_param_headers,
|
|
44
|
+
on_list_tools=_list_tools,
|
|
45
|
+
)
|
|
46
|
+
SERVER.add_request_handler("tools/call", ToolCallParams, _call_tool)
|
|
47
|
+
|
|
48
|
+
|
|
49
|
+
async def serve(scope: Scope, receive: Receive, send: Send) -> None:
|
|
50
|
+
manager = StreamableHTTPSessionManager(
|
|
51
|
+
SERVER,
|
|
52
|
+
stateless=True,
|
|
53
|
+
json_response=True,
|
|
54
|
+
max_request_body_size=HTTP_MAX_REQUEST_BODY_BYTES,
|
|
55
|
+
)
|
|
56
|
+
async with manager.run():
|
|
57
|
+
await manager.handle_request(_with_trimmed_headers(scope), receive, send)
|
|
58
|
+
|
|
59
|
+
|
|
60
|
+
def _with_trimmed_headers(scope: Scope) -> Scope:
|
|
61
|
+
return {
|
|
62
|
+
**scope,
|
|
63
|
+
"headers": [
|
|
64
|
+
(name, value.strip(HTTP_WHITESPACE)) for name, value in scope["headers"]
|
|
65
|
+
],
|
|
66
|
+
}
|
|
@@ -0,0 +1,219 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
|
|
3
|
+
import asyncio
|
|
4
|
+
import contextlib
|
|
5
|
+
import functools
|
|
6
|
+
import re
|
|
7
|
+
from dataclasses import dataclass
|
|
8
|
+
from typing import TYPE_CHECKING, assert_never
|
|
9
|
+
|
|
10
|
+
import httpx
|
|
11
|
+
import mcp_types as types
|
|
12
|
+
import structlog
|
|
13
|
+
from langgraph_sdk.client import LangGraphClient, get_client
|
|
14
|
+
from mcp.shared.exceptions import MCPError
|
|
15
|
+
from starlette.requests import Request
|
|
16
|
+
|
|
17
|
+
from langgraph_api.api.mcp import _sanitizers
|
|
18
|
+
from langgraph_api.api.mcp._constants import (
|
|
19
|
+
DEFAULT_PAGE_SIZE,
|
|
20
|
+
INTERNAL_ERROR_MESSAGE,
|
|
21
|
+
INVALID_CURSOR_MESSAGE,
|
|
22
|
+
MAX_ASSISTANTS,
|
|
23
|
+
MAX_CURSOR_LENGTH,
|
|
24
|
+
MAX_PAGE_OFFSET,
|
|
25
|
+
PAUSED_TOOL_MESSAGE,
|
|
26
|
+
)
|
|
27
|
+
from langgraph_api.api.mcp._outcome import (
|
|
28
|
+
Completed,
|
|
29
|
+
Failed,
|
|
30
|
+
Paused,
|
|
31
|
+
RunOutcome,
|
|
32
|
+
parse_outcome,
|
|
33
|
+
)
|
|
34
|
+
from langgraph_api.serde import json_dumpb
|
|
35
|
+
|
|
36
|
+
if TYPE_CHECKING:
|
|
37
|
+
from collections.abc import AsyncIterator, Iterable, Mapping
|
|
38
|
+
|
|
39
|
+
from langgraph_sdk.schema import Assistant
|
|
40
|
+
from mcp.server.context import ServerRequestContext
|
|
41
|
+
|
|
42
|
+
from langgraph_api.api.mcp._calls import ToolCallParams
|
|
43
|
+
|
|
44
|
+
logger = structlog.stdlib.get_logger(__name__)
|
|
45
|
+
|
|
46
|
+
_CURSOR_DIGITS = re.compile(rf"[0-9]{{1,{MAX_CURSOR_LENGTH}}}")
|
|
47
|
+
_ANNOTATIONS = types.ToolAnnotations(
|
|
48
|
+
read_only_hint=False,
|
|
49
|
+
destructive_hint=False,
|
|
50
|
+
idempotent_hint=False,
|
|
51
|
+
open_world_hint=True,
|
|
52
|
+
)
|
|
53
|
+
|
|
54
|
+
|
|
55
|
+
@functools.lru_cache(maxsize=1)
|
|
56
|
+
def _client() -> LangGraphClient:
|
|
57
|
+
return get_client(url=None)
|
|
58
|
+
|
|
59
|
+
|
|
60
|
+
@contextlib.asynccontextmanager
|
|
61
|
+
async def _failures_as_mcp_errors() -> AsyncIterator[None]:
|
|
62
|
+
try:
|
|
63
|
+
yield
|
|
64
|
+
except MCPError:
|
|
65
|
+
raise
|
|
66
|
+
except Exception as error:
|
|
67
|
+
mcp_error = _mcp_error(error)
|
|
68
|
+
if mcp_error.code == types.INTERNAL_ERROR:
|
|
69
|
+
await logger.aexception("MCP tool request failed")
|
|
70
|
+
raise mcp_error from error
|
|
71
|
+
|
|
72
|
+
|
|
73
|
+
def _mcp_error(error: Exception) -> MCPError:
|
|
74
|
+
match error:
|
|
75
|
+
case httpx.HTTPStatusError(response=response) if response.is_client_error:
|
|
76
|
+
return MCPError(types.INVALID_PARAMS, _detail(response))
|
|
77
|
+
case _:
|
|
78
|
+
return MCPError(types.INTERNAL_ERROR, INTERNAL_ERROR_MESSAGE)
|
|
79
|
+
|
|
80
|
+
|
|
81
|
+
def _detail(response: httpx.Response) -> str:
|
|
82
|
+
with contextlib.suppress(ValueError):
|
|
83
|
+
match response.json():
|
|
84
|
+
case {"detail": str() as detail} if detail:
|
|
85
|
+
return detail
|
|
86
|
+
return response.reason_phrase
|
|
87
|
+
|
|
88
|
+
|
|
89
|
+
@dataclass(frozen=True, slots=True)
|
|
90
|
+
class AssistantTools:
|
|
91
|
+
client: LangGraphClient
|
|
92
|
+
headers: Mapping[str, str]
|
|
93
|
+
|
|
94
|
+
@classmethod
|
|
95
|
+
def of(cls, ctx: ServerRequestContext) -> AssistantTools:
|
|
96
|
+
if not isinstance(ctx.request, Request):
|
|
97
|
+
raise TypeError("Assistant tools are served over HTTP only")
|
|
98
|
+
return cls(_client(), ctx.request.headers)
|
|
99
|
+
|
|
100
|
+
@_failures_as_mcp_errors()
|
|
101
|
+
async def list(self, cursor: str | None) -> types.ListToolsResult:
|
|
102
|
+
offset = _page_offset(cursor)
|
|
103
|
+
assistants = await self.client.assistants.search(
|
|
104
|
+
offset=offset, limit=DEFAULT_PAGE_SIZE, headers=self.headers
|
|
105
|
+
)
|
|
106
|
+
named = await _first_per_name(assistants)
|
|
107
|
+
tools = await asyncio.gather(
|
|
108
|
+
*(self._tool(assistant, name) for name, assistant in named.items())
|
|
109
|
+
)
|
|
110
|
+
return types.ListToolsResult(
|
|
111
|
+
tools=[tool for tool in tools if tool is not None],
|
|
112
|
+
next_cursor=str(offset + DEFAULT_PAGE_SIZE)
|
|
113
|
+
if len(assistants) == DEFAULT_PAGE_SIZE
|
|
114
|
+
else None,
|
|
115
|
+
)
|
|
116
|
+
|
|
117
|
+
@_failures_as_mcp_errors()
|
|
118
|
+
async def call(self, params: ToolCallParams) -> types.CallToolResult:
|
|
119
|
+
value = await self.client.runs.wait(
|
|
120
|
+
thread_id=None,
|
|
121
|
+
assistant_id=await self._assistant_serving(params.name),
|
|
122
|
+
input=params.arguments or {},
|
|
123
|
+
context=params.context,
|
|
124
|
+
headers=self.headers,
|
|
125
|
+
raise_error=False,
|
|
126
|
+
)
|
|
127
|
+
return _tool_result(parse_outcome(value))
|
|
128
|
+
|
|
129
|
+
async def _tool(self, assistant: Assistant, name: str) -> types.Tool | None:
|
|
130
|
+
try:
|
|
131
|
+
schemas = await self.client.assistants.get_schemas(
|
|
132
|
+
assistant["assistant_id"], headers=self.headers
|
|
133
|
+
)
|
|
134
|
+
input_schema = schemas.get("input_schema", {})
|
|
135
|
+
if input_schema is None:
|
|
136
|
+
raise ValueError("Input schema generation failed")
|
|
137
|
+
if input_schema:
|
|
138
|
+
_sanitizers.simplify_mcp_schema_inplace(input_schema)
|
|
139
|
+
_sanitizers.drop_mcp_param_headers_inplace(input_schema)
|
|
140
|
+
input_schema.setdefault("type", "object")
|
|
141
|
+
return types.Tool(
|
|
142
|
+
name=name,
|
|
143
|
+
title=assistant["name"],
|
|
144
|
+
description=assistant.get("description")
|
|
145
|
+
or f"Tool based on the {assistant['name']} assistant",
|
|
146
|
+
input_schema=input_schema,
|
|
147
|
+
annotations=_ANNOTATIONS,
|
|
148
|
+
)
|
|
149
|
+
except Exception as e:
|
|
150
|
+
await logger.awarning(
|
|
151
|
+
"Failed to get schema for assistant, skipping from MCP tools list",
|
|
152
|
+
assistant_id=assistant["assistant_id"],
|
|
153
|
+
assistant_name=assistant["name"],
|
|
154
|
+
error=str(e),
|
|
155
|
+
)
|
|
156
|
+
return None
|
|
157
|
+
|
|
158
|
+
async def _assistant_serving(self, tool_name: str) -> str:
|
|
159
|
+
assistants = await self.client.assistants.search(
|
|
160
|
+
limit=MAX_ASSISTANTS, headers=self.headers
|
|
161
|
+
)
|
|
162
|
+
match [
|
|
163
|
+
assistant["assistant_id"]
|
|
164
|
+
for assistant in assistants
|
|
165
|
+
if _sanitizers.normalize_name(assistant["name"]) == tool_name
|
|
166
|
+
]:
|
|
167
|
+
case [assistant_id]:
|
|
168
|
+
return assistant_id
|
|
169
|
+
case []:
|
|
170
|
+
raise MCPError(types.INVALID_PARAMS, f"Unknown tool: {tool_name}")
|
|
171
|
+
case _:
|
|
172
|
+
raise MCPError(
|
|
173
|
+
types.INVALID_PARAMS, "Multiple tools found with the same name."
|
|
174
|
+
)
|
|
175
|
+
|
|
176
|
+
|
|
177
|
+
async def _first_per_name(assistants: Iterable[Assistant]) -> dict[str, Assistant]:
|
|
178
|
+
named: dict[str, Assistant] = {}
|
|
179
|
+
for assistant in assistants:
|
|
180
|
+
name = _sanitizers.normalize_name(assistant["name"])
|
|
181
|
+
if name in named:
|
|
182
|
+
await logger.awarning(
|
|
183
|
+
f"Duplicate assistant name found {assistant['name']}",
|
|
184
|
+
name=assistant["name"],
|
|
185
|
+
normalized=name,
|
|
186
|
+
)
|
|
187
|
+
else:
|
|
188
|
+
named[name] = assistant
|
|
189
|
+
return named
|
|
190
|
+
|
|
191
|
+
|
|
192
|
+
def _page_offset(cursor: str | None) -> int:
|
|
193
|
+
if cursor is None:
|
|
194
|
+
return 0
|
|
195
|
+
if not _CURSOR_DIGITS.fullmatch(cursor) or int(cursor) > MAX_PAGE_OFFSET:
|
|
196
|
+
raise MCPError(types.INVALID_PARAMS, INVALID_CURSOR_MESSAGE)
|
|
197
|
+
return int(cursor)
|
|
198
|
+
|
|
199
|
+
|
|
200
|
+
def _tool_result(outcome: RunOutcome) -> types.CallToolResult:
|
|
201
|
+
match outcome:
|
|
202
|
+
case Completed(output=output):
|
|
203
|
+
return types.CallToolResult(content=[_text(json_dumpb(output).decode())])
|
|
204
|
+
case Failed(message=message):
|
|
205
|
+
return types.CallToolResult(content=[_text(message)], is_error=True)
|
|
206
|
+
case Paused(interrupts=interrupts):
|
|
207
|
+
return types.CallToolResult(
|
|
208
|
+
content=[
|
|
209
|
+
_text(PAUSED_TOOL_MESSAGE),
|
|
210
|
+
_text(json_dumpb(interrupts).decode()),
|
|
211
|
+
],
|
|
212
|
+
is_error=True,
|
|
213
|
+
)
|
|
214
|
+
case _:
|
|
215
|
+
assert_never(outcome)
|
|
216
|
+
|
|
217
|
+
|
|
218
|
+
def _text(text: str) -> types.TextContent:
|
|
219
|
+
return types.TextContent(type="text", text=text)
|
|
@@ -4,6 +4,7 @@ from prometheus_client import CONTENT_TYPE_LATEST, generate_latest
|
|
|
4
4
|
from starlette.responses import JSONResponse, PlainTextResponse
|
|
5
5
|
|
|
6
6
|
from langgraph_api import __version__, config, metadata
|
|
7
|
+
from langgraph_api.api.mcp import MCP_SERVED
|
|
7
8
|
from langgraph_api.feature_flags import IS_POSTGRES_OR_GRPC_BACKEND
|
|
8
9
|
from langgraph_api.http_metrics import HTTP_METRICS_COLLECTOR
|
|
9
10
|
from langgraph_api.route import ApiRequest
|
|
@@ -80,6 +81,7 @@ async def meta_info(request: ApiRequest):
|
|
|
80
81
|
and bool(config.TRACING),
|
|
81
82
|
"langsmith_tracing_replicas": True,
|
|
82
83
|
"langsmith_tracing_session_on_runs": True,
|
|
84
|
+
"mcp": MCP_SERVED,
|
|
83
85
|
},
|
|
84
86
|
"host": {
|
|
85
87
|
"kind": metadata.HOST,
|
|
@@ -6,6 +6,7 @@ from functools import lru_cache
|
|
|
6
6
|
import orjson
|
|
7
7
|
|
|
8
8
|
from langgraph_api import config
|
|
9
|
+
from langgraph_api.api.mcp import MCP_SERVED
|
|
9
10
|
from langgraph_api.graph import GRAPHS
|
|
10
11
|
from langgraph_api.metadata import USER_API_URL
|
|
11
12
|
from langgraph_api.validation import openapi
|
|
@@ -107,10 +108,8 @@ def get_openapi_spec() -> bytes:
|
|
|
107
108
|
elif config.MOUNT_PREFIX:
|
|
108
109
|
final["servers"] = [{"url": config.MOUNT_PREFIX}]
|
|
109
110
|
|
|
110
|
-
if not
|
|
111
|
-
# Remove the MCP paths from the OpenAPI spec
|
|
111
|
+
if not MCP_SERVED:
|
|
112
112
|
final["paths"].pop("/mcp/", None)
|
|
113
|
-
# Remove the MCP tag definition
|
|
114
113
|
final["tags"] = [t for t in final.get("tags", []) if t.get("name") != "MCP"]
|
|
115
114
|
|
|
116
115
|
if not config.A2A_ENABLED:
|