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.
Files changed (337) hide show
  1. {langgraph_api-0.18.0.dev2 → langgraph_api-0.18.0.dev4}/Makefile +26 -20
  2. {langgraph_api-0.18.0.dev2 → langgraph_api-0.18.0.dev4}/PKG-INFO +1 -1
  3. {langgraph_api-0.18.0.dev2 → langgraph_api-0.18.0.dev4}/benchmark/REPORTS.md +2 -2
  4. langgraph_api-0.18.0.dev4/langgraph_api/__init__.py +1 -0
  5. {langgraph_api-0.18.0.dev2 → langgraph_api-0.18.0.dev4}/langgraph_api/api/a2a.py +93 -10
  6. {langgraph_api-0.18.0.dev2 → langgraph_api-0.18.0.dev4}/langgraph_api/api/event_streaming.py +81 -9
  7. langgraph_api-0.18.0.dev4/langgraph_api/api/mcp/_calls.py +29 -0
  8. langgraph_api-0.18.0.dev4/langgraph_api/api/mcp/_constants.py +28 -0
  9. {langgraph_api-0.18.0.dev2 → langgraph_api-0.18.0.dev4}/langgraph_api/api/mcp/_handlers.py +146 -196
  10. langgraph_api-0.18.0.dev4/langgraph_api/api/mcp/_outcome.py +43 -0
  11. langgraph_api-0.18.0.dev4/langgraph_api/api/mcp/_protocol.py +224 -0
  12. {langgraph_api-0.18.0.dev2 → langgraph_api-0.18.0.dev4}/langgraph_api/config/__init__.py +38 -4
  13. {langgraph_api-0.18.0.dev2 → langgraph_api-0.18.0.dev4}/langgraph_api/cron_scheduler.py +2 -2
  14. langgraph_api-0.18.0.dev4/langgraph_api/drain.py +164 -0
  15. {langgraph_api-0.18.0.dev2 → langgraph_api-0.18.0.dev4}/langgraph_api/event_streaming/service.py +130 -133
  16. {langgraph_api-0.18.0.dev2 → langgraph_api-0.18.0.dev4}/langgraph_api/event_streaming/session.py +11 -6
  17. langgraph_api-0.18.0.dev4/langgraph_api/executor/__init__.py +9 -0
  18. langgraph_api-0.18.0.dev4/langgraph_api/executor/__main__.py +343 -0
  19. {langgraph_api-0.18.0.dev2 → langgraph_api-0.18.0.dev4}/langgraph_api/feature_flags.py +6 -0
  20. {langgraph_api-0.18.0.dev2 → langgraph_api-0.18.0.dev4}/langgraph_api/graph.py +12 -2
  21. {langgraph_api-0.18.0.dev2 → langgraph_api-0.18.0.dev4}/langgraph_api/grpc/ops/runs.py +41 -5
  22. {langgraph_api-0.18.0.dev2 → langgraph_api-0.18.0.dev4}/langgraph_api/grpc/ops/threads.py +54 -6
  23. {langgraph_api-0.18.0.dev2 → langgraph_api-0.18.0.dev4}/langgraph_api/metrics_otlp.py +8 -0
  24. {langgraph_api-0.18.0.dev2 → langgraph_api-0.18.0.dev4}/langgraph_api/models/run.py +11 -3
  25. {langgraph_api-0.18.0.dev2 → langgraph_api-0.18.0.dev4}/langgraph_api/queue_entrypoint.py +13 -1
  26. {langgraph_api-0.18.0.dev2 → langgraph_api-0.18.0.dev4}/langgraph_api/self_hosted_logs.py +3 -1
  27. {langgraph_api-0.18.0.dev2 → langgraph_api-0.18.0.dev4}/langgraph_api/self_hosted_metrics.py +1 -1
  28. {langgraph_api-0.18.0.dev2 → langgraph_api-0.18.0.dev4}/langgraph_api/stream.py +49 -3
  29. {langgraph_api-0.18.0.dev2 → langgraph_api-0.18.0.dev4}/langgraph_api/timing/__init__.py +16 -0
  30. langgraph_api-0.18.0.dev4/langgraph_api/timing/startup.py +184 -0
  31. {langgraph_api-0.18.0.dev2 → langgraph_api-0.18.0.dev4}/langgraph_api/timing/timer.py +16 -2
  32. {langgraph_api-0.18.0.dev2 → langgraph_api-0.18.0.dev4}/langgraph_api/utils/headers.py +20 -3
  33. {langgraph_api-0.18.0.dev2 → langgraph_api-0.18.0.dev4}/langgraph_api/validation.py +11 -5
  34. {langgraph_api-0.18.0.dev2 → langgraph_api-0.18.0.dev4}/langgraph_api/worker.py +146 -13
  35. {langgraph_api-0.18.0.dev2 → langgraph_api-0.18.0.dev4}/langgraph_api/worker_runtime.py +124 -4
  36. {langgraph_api-0.18.0.dev2 → langgraph_api-0.18.0.dev4}/langgraph_grpc_common/proto/__init__.py +4 -4
  37. langgraph_api-0.18.0.dev4/langgraph_grpc_common/proto/orchestrator_pb2.py +50 -0
  38. 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
  39. langgraph_api-0.18.0.dev4/langgraph_grpc_common/proto/orchestrator_pb2_grpc.py +108 -0
  40. langgraph_api-0.18.0.dev4/langgraph_grpc_common/proto/orchestrator_pb2_grpc.pyi +82 -0
  41. {langgraph_api-0.18.0.dev2 → langgraph_api-0.18.0.dev4}/openapi.json +20 -0
  42. langgraph_api-0.18.0.dev2/langgraph_api/__init__.py +0 -1
  43. langgraph_api-0.18.0.dev2/langgraph_api/api/mcp/_constants.py +0 -19
  44. langgraph_api-0.18.0.dev2/langgraph_api/runner/__init__.py +0 -10
  45. langgraph_api-0.18.0.dev2/langgraph_api/runner/__main__.py +0 -275
  46. langgraph_api-0.18.0.dev2/langgraph_grpc_common/proto/runner_pb2.py +0 -50
  47. langgraph_api-0.18.0.dev2/langgraph_grpc_common/proto/runner_pb2_grpc.py +0 -108
  48. langgraph_api-0.18.0.dev2/langgraph_grpc_common/proto/runner_pb2_grpc.pyi +0 -73
  49. {langgraph_api-0.18.0.dev2 → langgraph_api-0.18.0.dev4}/.gitignore +0 -0
  50. {langgraph_api-0.18.0.dev2 → langgraph_api-0.18.0.dev4}/LICENSE +0 -0
  51. {langgraph_api-0.18.0.dev2 → langgraph_api-0.18.0.dev4}/README.md +0 -0
  52. {langgraph_api-0.18.0.dev2 → langgraph_api-0.18.0.dev4}/benchmark/.gitignore +0 -0
  53. {langgraph_api-0.18.0.dev2 → langgraph_api-0.18.0.dev4}/benchmark/Makefile +0 -0
  54. {langgraph_api-0.18.0.dev2 → langgraph_api-0.18.0.dev4}/benchmark/README.md +0 -0
  55. {langgraph_api-0.18.0.dev2 → langgraph_api-0.18.0.dev4}/benchmark/benchmark-runners/assistant.ts +0 -0
  56. {langgraph_api-0.18.0.dev2 → langgraph_api-0.18.0.dev4}/benchmark/benchmark-runners/benchmark-runner.ts +0 -0
  57. {langgraph_api-0.18.0.dev2 → langgraph_api-0.18.0.dev4}/benchmark/benchmark-runners/benchmark_profiles.ts +0 -0
  58. {langgraph_api-0.18.0.dev2 → langgraph_api-0.18.0.dev4}/benchmark/benchmark-runners/benchmarks.ts +0 -0
  59. {langgraph_api-0.18.0.dev2 → langgraph_api-0.18.0.dev4}/benchmark/benchmark-runners/cancel_first_second_completes.ts +0 -0
  60. {langgraph_api-0.18.0.dev2 → langgraph_api-0.18.0.dev4}/benchmark/benchmark-runners/classify-error.test.js +0 -0
  61. {langgraph_api-0.18.0.dev2 → langgraph_api-0.18.0.dev4}/benchmark/benchmark-runners/classify-error.ts +0 -0
  62. {langgraph_api-0.18.0.dev2 → langgraph_api-0.18.0.dev4}/benchmark/benchmark-runners/delta-turns-lib.test.js +0 -0
  63. {langgraph_api-0.18.0.dev2 → langgraph_api-0.18.0.dev4}/benchmark/benchmark-runners/delta-turns-lib.ts +0 -0
  64. {langgraph_api-0.18.0.dev2 → langgraph_api-0.18.0.dev4}/benchmark/benchmark-runners/delta_turns.ts +0 -0
  65. {langgraph_api-0.18.0.dev2 → langgraph_api-0.18.0.dev4}/benchmark/benchmark-runners/enqueued_runs_order.ts +0 -0
  66. {langgraph_api-0.18.0.dev2 → langgraph_api-0.18.0.dev4}/benchmark/benchmark-runners/interrupt_resume.ts +0 -0
  67. {langgraph_api-0.18.0.dev2 → langgraph_api-0.18.0.dev4}/benchmark/benchmark-runners/log-failure.ts +0 -0
  68. {langgraph_api-0.18.0.dev2 → langgraph_api-0.18.0.dev4}/benchmark/benchmark-runners/meta_workload.ts +0 -0
  69. {langgraph_api-0.18.0.dev2 → langgraph_api-0.18.0.dev4}/benchmark/benchmark-runners/store.ts +0 -0
  70. {langgraph_api-0.18.0.dev2 → langgraph_api-0.18.0.dev4}/benchmark/benchmark-runners/stream_write.ts +0 -0
  71. {langgraph_api-0.18.0.dev2 → langgraph_api-0.18.0.dev4}/benchmark/benchmark-runners/thread.ts +0 -0
  72. {langgraph_api-0.18.0.dev2 → langgraph_api-0.18.0.dev4}/benchmark/benchmark-runners/thread_runs_metadata_search.ts +0 -0
  73. {langgraph_api-0.18.0.dev2 → langgraph_api-0.18.0.dev4}/benchmark/benchmark-runners/threads_search_metadata.ts +0 -0
  74. {langgraph_api-0.18.0.dev2 → langgraph_api-0.18.0.dev4}/benchmark/benchmark-runners/types.ts +0 -0
  75. {langgraph_api-0.18.0.dev2 → langgraph_api-0.18.0.dev4}/benchmark/benchmark-runners/wait_write.ts +0 -0
  76. {langgraph_api-0.18.0.dev2 → langgraph_api-0.18.0.dev4}/benchmark/capacity-ci.js +0 -0
  77. {langgraph_api-0.18.0.dev2 → langgraph_api-0.18.0.dev4}/benchmark/capacity-ci.test.js +0 -0
  78. {langgraph_api-0.18.0.dev2 → langgraph_api-0.18.0.dev4}/benchmark/clean-cli.js +0 -0
  79. {langgraph_api-0.18.0.dev2 → langgraph_api-0.18.0.dev4}/benchmark/clean.js +0 -0
  80. {langgraph_api-0.18.0.dev2 → langgraph_api-0.18.0.dev4}/benchmark/continuous/README.md +0 -0
  81. {langgraph_api-0.18.0.dev2 → langgraph_api-0.18.0.dev4}/benchmark/continuous/pyproject.toml +0 -0
  82. {langgraph_api-0.18.0.dev2 → langgraph_api-0.18.0.dev4}/benchmark/continuous/runner.py +0 -0
  83. {langgraph_api-0.18.0.dev2 → langgraph_api-0.18.0.dev4}/benchmark/continuous/uv.lock +0 -0
  84. {langgraph_api-0.18.0.dev2 → langgraph_api-0.18.0.dev4}/benchmark/daily-report.js +0 -0
  85. {langgraph_api-0.18.0.dev2 → langgraph_api-0.18.0.dev4}/benchmark/daily-report.test.js +0 -0
  86. {langgraph_api-0.18.0.dev2 → langgraph_api-0.18.0.dev4}/benchmark/delta-report.js +0 -0
  87. {langgraph_api-0.18.0.dev2 → langgraph_api-0.18.0.dev4}/benchmark/delta-report.test.js +0 -0
  88. {langgraph_api-0.18.0.dev2 → langgraph_api-0.18.0.dev4}/benchmark/graphs.js +0 -0
  89. {langgraph_api-0.18.0.dev2 → langgraph_api-0.18.0.dev4}/benchmark/history.js +0 -0
  90. {langgraph_api-0.18.0.dev2 → langgraph_api-0.18.0.dev4}/benchmark/history.test.js +0 -0
  91. {langgraph_api-0.18.0.dev2 → langgraph_api-0.18.0.dev4}/benchmark/host-v2.js +0 -0
  92. {langgraph_api-0.18.0.dev2 → langgraph_api-0.18.0.dev4}/benchmark/host-v2.test.js +0 -0
  93. {langgraph_api-0.18.0.dev2 → langgraph_api-0.18.0.dev4}/benchmark/multer.test.js +0 -0
  94. {langgraph_api-0.18.0.dev2 → langgraph_api-0.18.0.dev4}/benchmark/package.json +0 -0
  95. {langgraph_api-0.18.0.dev2 → langgraph_api-0.18.0.dev4}/benchmark/ramp.js +0 -0
  96. {langgraph_api-0.18.0.dev2 → langgraph_api-0.18.0.dev4}/benchmark/reporting/dd_reporting.py +0 -0
  97. {langgraph_api-0.18.0.dev2 → langgraph_api-0.18.0.dev4}/benchmark/runner-descriptions.js +0 -0
  98. {langgraph_api-0.18.0.dev2 → langgraph_api-0.18.0.dev4}/benchmark/server-metrics.js +0 -0
  99. {langgraph_api-0.18.0.dev2 → langgraph_api-0.18.0.dev4}/benchmark/server-metrics.test.js +0 -0
  100. {langgraph_api-0.18.0.dev2 → langgraph_api-0.18.0.dev4}/benchmark/slack.js +0 -0
  101. {langgraph_api-0.18.0.dev2 → langgraph_api-0.18.0.dev4}/benchmark/staircase.py +0 -0
  102. {langgraph_api-0.18.0.dev2 → langgraph_api-0.18.0.dev4}/benchmark/staircase_step_k6.js +0 -0
  103. {langgraph_api-0.18.0.dev2 → langgraph_api-0.18.0.dev4}/benchmark/tsconfig.json +0 -0
  104. {langgraph_api-0.18.0.dev2 → langgraph_api-0.18.0.dev4}/benchmark/update-revision.js +0 -0
  105. {langgraph_api-0.18.0.dev2 → langgraph_api-0.18.0.dev4}/benchmark/weather.js +0 -0
  106. {langgraph_api-0.18.0.dev2 → langgraph_api-0.18.0.dev4}/benchmark/yarn.lock +0 -0
  107. {langgraph_api-0.18.0.dev2 → langgraph_api-0.18.0.dev4}/constraints.txt +0 -0
  108. {langgraph_api-0.18.0.dev2 → langgraph_api-0.18.0.dev4}/custom_store.sql +0 -0
  109. {langgraph_api-0.18.0.dev2 → langgraph_api-0.18.0.dev4}/forbidden.txt +0 -0
  110. {langgraph_api-0.18.0.dev2 → langgraph_api-0.18.0.dev4}/hatch_build.py +0 -0
  111. {langgraph_api-0.18.0.dev2 → langgraph_api-0.18.0.dev4}/healthcheck.py +0 -0
  112. {langgraph_api-0.18.0.dev2 → langgraph_api-0.18.0.dev4}/langgraph-cloud-debugging-20260210132856.zip +0 -0
  113. {langgraph_api-0.18.0.dev2 → langgraph_api-0.18.0.dev4}/langgraph_api/_checkpointer/__init__.py +0 -0
  114. {langgraph_api-0.18.0.dev2 → langgraph_api-0.18.0.dev4}/langgraph_api/_checkpointer/_adapter.py +0 -0
  115. {langgraph_api-0.18.0.dev2 → langgraph_api-0.18.0.dev4}/langgraph_api/_checkpointer/protocol.py +0 -0
  116. {langgraph_api-0.18.0.dev2 → langgraph_api-0.18.0.dev4}/langgraph_api/_factory_utils.py +0 -0
  117. {langgraph_api-0.18.0.dev2 → langgraph_api-0.18.0.dev4}/langgraph_api/api/__init__.py +0 -0
  118. {langgraph_api-0.18.0.dev2 → langgraph_api-0.18.0.dev4}/langgraph_api/api/a2ui.py +0 -0
  119. {langgraph_api-0.18.0.dev2 → langgraph_api-0.18.0.dev4}/langgraph_api/api/a2ui_schemas/README.md +0 -0
  120. {langgraph_api-0.18.0.dev2 → langgraph_api-0.18.0.dev4}/langgraph_api/api/a2ui_schemas/client_capabilities.json +0 -0
  121. {langgraph_api-0.18.0.dev2 → langgraph_api-0.18.0.dev4}/langgraph_api/api/a2ui_schemas/client_data_model.json +0 -0
  122. {langgraph_api-0.18.0.dev2 → langgraph_api-0.18.0.dev4}/langgraph_api/api/a2ui_schemas/client_to_server.json +0 -0
  123. {langgraph_api-0.18.0.dev2 → langgraph_api-0.18.0.dev4}/langgraph_api/api/a2ui_schemas/server_to_client.json +0 -0
  124. {langgraph_api-0.18.0.dev2 → langgraph_api-0.18.0.dev4}/langgraph_api/api/assistants.py +0 -0
  125. {langgraph_api-0.18.0.dev2 → langgraph_api-0.18.0.dev4}/langgraph_api/api/mcp/__init__.py +0 -0
  126. {langgraph_api-0.18.0.dev2 → langgraph_api-0.18.0.dev4}/langgraph_api/api/mcp/_models.py +0 -0
  127. {langgraph_api-0.18.0.dev2 → langgraph_api-0.18.0.dev4}/langgraph_api/api/mcp/_routes.py +0 -0
  128. {langgraph_api-0.18.0.dev2 → langgraph_api-0.18.0.dev4}/langgraph_api/api/mcp/_sanitizers.py +0 -0
  129. {langgraph_api-0.18.0.dev2 → langgraph_api-0.18.0.dev4}/langgraph_api/api/meta.py +0 -0
  130. {langgraph_api-0.18.0.dev2 → langgraph_api-0.18.0.dev4}/langgraph_api/api/openapi.py +0 -0
  131. {langgraph_api-0.18.0.dev2 → langgraph_api-0.18.0.dev4}/langgraph_api/api/profile.py +0 -0
  132. {langgraph_api-0.18.0.dev2 → langgraph_api-0.18.0.dev4}/langgraph_api/api/runs.py +0 -0
  133. {langgraph_api-0.18.0.dev2 → langgraph_api-0.18.0.dev4}/langgraph_api/api/store.py +0 -0
  134. {langgraph_api-0.18.0.dev2 → langgraph_api-0.18.0.dev4}/langgraph_api/api/threads.py +0 -0
  135. {langgraph_api-0.18.0.dev2 → langgraph_api-0.18.0.dev4}/langgraph_api/api/ui.py +0 -0
  136. {langgraph_api-0.18.0.dev2 → langgraph_api-0.18.0.dev4}/langgraph_api/asgi_transport.py +0 -0
  137. {langgraph_api-0.18.0.dev2 → langgraph_api-0.18.0.dev4}/langgraph_api/asyncio.py +0 -0
  138. {langgraph_api-0.18.0.dev2 → langgraph_api-0.18.0.dev4}/langgraph_api/auth/__init__.py +0 -0
  139. {langgraph_api-0.18.0.dev2 → langgraph_api-0.18.0.dev4}/langgraph_api/auth/custom.py +0 -0
  140. {langgraph_api-0.18.0.dev2 → langgraph_api-0.18.0.dev4}/langgraph_api/auth/errors.py +0 -0
  141. {langgraph_api-0.18.0.dev2 → langgraph_api-0.18.0.dev4}/langgraph_api/auth/langsmith/__init__.py +0 -0
  142. {langgraph_api-0.18.0.dev2 → langgraph_api-0.18.0.dev4}/langgraph_api/auth/langsmith/backend.py +0 -0
  143. {langgraph_api-0.18.0.dev2 → langgraph_api-0.18.0.dev4}/langgraph_api/auth/langsmith/client.py +0 -0
  144. {langgraph_api-0.18.0.dev2 → langgraph_api-0.18.0.dev4}/langgraph_api/auth/middleware.py +0 -0
  145. {langgraph_api-0.18.0.dev2 → langgraph_api-0.18.0.dev4}/langgraph_api/auth/noop.py +0 -0
  146. {langgraph_api-0.18.0.dev2 → langgraph_api-0.18.0.dev4}/langgraph_api/auth/studio_user.py +0 -0
  147. {langgraph_api-0.18.0.dev2 → langgraph_api-0.18.0.dev4}/langgraph_api/beacon_data_plane_jwt_auth.py +0 -0
  148. {langgraph_api-0.18.0.dev2 → langgraph_api-0.18.0.dev4}/langgraph_api/cache.py +0 -0
  149. {langgraph_api-0.18.0.dev2 → langgraph_api-0.18.0.dev4}/langgraph_api/cli.py +0 -0
  150. {langgraph_api-0.18.0.dev2 → langgraph_api-0.18.0.dev4}/langgraph_api/command.py +0 -0
  151. {langgraph_api-0.18.0.dev2 → langgraph_api-0.18.0.dev4}/langgraph_api/config/_parse.py +0 -0
  152. {langgraph_api-0.18.0.dev2 → langgraph_api-0.18.0.dev4}/langgraph_api/config/schemas.py +0 -0
  153. {langgraph_api-0.18.0.dev2 → langgraph_api-0.18.0.dev4}/langgraph_api/encryption/__init__.py +0 -0
  154. {langgraph_api-0.18.0.dev2 → langgraph_api-0.18.0.dev4}/langgraph_api/encryption/aes_json.py +0 -0
  155. {langgraph_api-0.18.0.dev2 → langgraph_api-0.18.0.dev4}/langgraph_api/encryption/context.py +0 -0
  156. {langgraph_api-0.18.0.dev2 → langgraph_api-0.18.0.dev4}/langgraph_api/encryption/custom.py +0 -0
  157. {langgraph_api-0.18.0.dev2 → langgraph_api-0.18.0.dev4}/langgraph_api/encryption/middleware.py +0 -0
  158. {langgraph_api-0.18.0.dev2 → langgraph_api-0.18.0.dev4}/langgraph_api/encryption/shared.py +0 -0
  159. {langgraph_api-0.18.0.dev2 → langgraph_api-0.18.0.dev4}/langgraph_api/errors.py +0 -0
  160. {langgraph_api-0.18.0.dev2 → langgraph_api-0.18.0.dev4}/langgraph_api/event_streaming/__init__.py +0 -0
  161. {langgraph_api-0.18.0.dev2 → langgraph_api-0.18.0.dev4}/langgraph_api/event_streaming/capabilities.py +0 -0
  162. {langgraph_api-0.18.0.dev2 → langgraph_api-0.18.0.dev4}/langgraph_api/event_streaming/constants.py +0 -0
  163. {langgraph_api-0.18.0.dev2 → langgraph_api-0.18.0.dev4}/langgraph_api/event_streaming/event_normalizers.py +0 -0
  164. {langgraph_api-0.18.0.dev2 → langgraph_api-0.18.0.dev4}/langgraph_api/event_streaming/namespace.py +0 -0
  165. {langgraph_api-0.18.0.dev2 → langgraph_api-0.18.0.dev4}/langgraph_api/event_streaming/state_normalizers.py +0 -0
  166. {langgraph_api-0.18.0.dev2 → langgraph_api-0.18.0.dev4}/langgraph_api/event_streaming/types.py +0 -0
  167. {langgraph_api-0.18.0.dev2 → langgraph_api-0.18.0.dev4}/langgraph_api/grpc/__init__.py +0 -0
  168. {langgraph_api-0.18.0.dev2 → langgraph_api-0.18.0.dev4}/langgraph_api/grpc/client.py +0 -0
  169. {langgraph_api-0.18.0.dev2 → langgraph_api-0.18.0.dev4}/langgraph_api/grpc/generated/core_api_pb2.pyi +0 -0
  170. {langgraph_api-0.18.0.dev2 → langgraph_api-0.18.0.dev4}/langgraph_api/grpc/ops/__init__.py +0 -0
  171. {langgraph_api-0.18.0.dev2 → langgraph_api-0.18.0.dev4}/langgraph_api/grpc/ops/assistants.py +0 -0
  172. {langgraph_api-0.18.0.dev2 → langgraph_api-0.18.0.dev4}/langgraph_api/grpc/ops/cache.py +0 -0
  173. {langgraph_api-0.18.0.dev2 → langgraph_api-0.18.0.dev4}/langgraph_api/grpc/ops/crons.py +0 -0
  174. {langgraph_api-0.18.0.dev2 → langgraph_api-0.18.0.dev4}/langgraph_api/grpc/server.py +0 -0
  175. {langgraph_api-0.18.0.dev2 → langgraph_api-0.18.0.dev4}/langgraph_api/grpc/servicers/__init__.py +0 -0
  176. {langgraph_api-0.18.0.dev2 → langgraph_api-0.18.0.dev4}/langgraph_api/grpc/servicers/checkpointer.py +0 -0
  177. {langgraph_api-0.18.0.dev2 → langgraph_api-0.18.0.dev4}/langgraph_api/grpc/servicers/encryption.py +0 -0
  178. {langgraph_api-0.18.0.dev2 → langgraph_api-0.18.0.dev4}/langgraph_api/http.py +0 -0
  179. {langgraph_api-0.18.0.dev2 → langgraph_api-0.18.0.dev4}/langgraph_api/http_metrics.py +0 -0
  180. {langgraph_api-0.18.0.dev2 → langgraph_api-0.18.0.dev4}/langgraph_api/http_metrics_utils.py +0 -0
  181. {langgraph_api-0.18.0.dev2 → langgraph_api-0.18.0.dev4}/langgraph_api/js/.gitignore +0 -0
  182. {langgraph_api-0.18.0.dev2 → langgraph_api-0.18.0.dev4}/langgraph_api/js/.prettierrc +0 -0
  183. {langgraph_api-0.18.0.dev2 → langgraph_api-0.18.0.dev4}/langgraph_api/js/.yarnclean +0 -0
  184. {langgraph_api-0.18.0.dev2 → langgraph_api-0.18.0.dev4}/langgraph_api/js/__init__.py +0 -0
  185. {langgraph_api-0.18.0.dev2 → langgraph_api-0.18.0.dev4}/langgraph_api/js/base.py +0 -0
  186. {langgraph_api-0.18.0.dev2 → langgraph_api-0.18.0.dev4}/langgraph_api/js/build.mts +0 -0
  187. {langgraph_api-0.18.0.dev2 → langgraph_api-0.18.0.dev4}/langgraph_api/js/client.http.mts +0 -0
  188. {langgraph_api-0.18.0.dev2 → langgraph_api-0.18.0.dev4}/langgraph_api/js/client.mts +0 -0
  189. {langgraph_api-0.18.0.dev2 → langgraph_api-0.18.0.dev4}/langgraph_api/js/errors.py +0 -0
  190. {langgraph_api-0.18.0.dev2 → langgraph_api-0.18.0.dev4}/langgraph_api/js/global.d.ts +0 -0
  191. {langgraph_api-0.18.0.dev2 → langgraph_api-0.18.0.dev4}/langgraph_api/js/package.json +0 -0
  192. {langgraph_api-0.18.0.dev2 → langgraph_api-0.18.0.dev4}/langgraph_api/js/remote.py +0 -0
  193. {langgraph_api-0.18.0.dev2 → langgraph_api-0.18.0.dev4}/langgraph_api/js/schema.py +0 -0
  194. {langgraph_api-0.18.0.dev2 → langgraph_api-0.18.0.dev4}/langgraph_api/js/src/auth-mutations.mts +0 -0
  195. {langgraph_api-0.18.0.dev2 → langgraph_api-0.18.0.dev4}/langgraph_api/js/src/graph.mts +0 -0
  196. {langgraph_api-0.18.0.dev2 → langgraph_api-0.18.0.dev4}/langgraph_api/js/src/load.hooks.mjs +0 -0
  197. {langgraph_api-0.18.0.dev2 → langgraph_api-0.18.0.dev4}/langgraph_api/js/src/preload.mjs +0 -0
  198. {langgraph_api-0.18.0.dev2 → langgraph_api-0.18.0.dev4}/langgraph_api/js/src/utils/experiment-tracing.mts +0 -0
  199. {langgraph_api-0.18.0.dev2 → langgraph_api-0.18.0.dev4}/langgraph_api/js/src/utils/files.mts +0 -0
  200. {langgraph_api-0.18.0.dev2 → langgraph_api-0.18.0.dev4}/langgraph_api/js/src/utils/importMap.mts +0 -0
  201. {langgraph_api-0.18.0.dev2 → langgraph_api-0.18.0.dev4}/langgraph_api/js/src/utils/pythonSchemas.mts +0 -0
  202. {langgraph_api-0.18.0.dev2 → langgraph_api-0.18.0.dev4}/langgraph_api/js/src/utils/serde.mts +0 -0
  203. {langgraph_api-0.18.0.dev2 → langgraph_api-0.18.0.dev4}/langgraph_api/js/sse.py +0 -0
  204. {langgraph_api-0.18.0.dev2 → langgraph_api-0.18.0.dev4}/langgraph_api/js/traceblock.mts +0 -0
  205. {langgraph_api-0.18.0.dev2 → langgraph_api-0.18.0.dev4}/langgraph_api/js/tsconfig.json +0 -0
  206. {langgraph_api-0.18.0.dev2 → langgraph_api-0.18.0.dev4}/langgraph_api/js/ui.py +0 -0
  207. {langgraph_api-0.18.0.dev2 → langgraph_api-0.18.0.dev4}/langgraph_api/js/yarn.lock +0 -0
  208. {langgraph_api-0.18.0.dev2 → langgraph_api-0.18.0.dev4}/langgraph_api/lc_security/__init__.py +0 -0
  209. {langgraph_api-0.18.0.dev2 → langgraph_api-0.18.0.dev4}/langgraph_api/lc_security/exceptions.py +0 -0
  210. {langgraph_api-0.18.0.dev2 → langgraph_api-0.18.0.dev4}/langgraph_api/lc_security/policy.py +0 -0
  211. {langgraph_api-0.18.0.dev2 → langgraph_api-0.18.0.dev4}/langgraph_api/lc_security/transport.py +0 -0
  212. {langgraph_api-0.18.0.dev2 → langgraph_api-0.18.0.dev4}/langgraph_api/logging.py +0 -0
  213. {langgraph_api-0.18.0.dev2 → langgraph_api-0.18.0.dev4}/langgraph_api/metadata.py +0 -0
  214. {langgraph_api-0.18.0.dev2 → langgraph_api-0.18.0.dev4}/langgraph_api/metrics_collector.py +0 -0
  215. {langgraph_api-0.18.0.dev2 → langgraph_api-0.18.0.dev4}/langgraph_api/middleware/__init__.py +0 -0
  216. {langgraph_api-0.18.0.dev2 → langgraph_api-0.18.0.dev4}/langgraph_api/middleware/ensure_store.py +0 -0
  217. {langgraph_api-0.18.0.dev2 → langgraph_api-0.18.0.dev4}/langgraph_api/middleware/http_logger.py +0 -0
  218. {langgraph_api-0.18.0.dev2 → langgraph_api-0.18.0.dev4}/langgraph_api/middleware/private_network.py +0 -0
  219. {langgraph_api-0.18.0.dev2 → langgraph_api-0.18.0.dev4}/langgraph_api/middleware/request_id.py +0 -0
  220. {langgraph_api-0.18.0.dev2 → langgraph_api-0.18.0.dev4}/langgraph_api/models/__init__.py +0 -0
  221. {langgraph_api-0.18.0.dev2 → langgraph_api-0.18.0.dev4}/langgraph_api/otel_context.py +0 -0
  222. {langgraph_api-0.18.0.dev2 → langgraph_api-0.18.0.dev4}/langgraph_api/patch.py +0 -0
  223. {langgraph_api-0.18.0.dev2 → langgraph_api-0.18.0.dev4}/langgraph_api/release_tags.py +0 -0
  224. {langgraph_api-0.18.0.dev2 → langgraph_api-0.18.0.dev4}/langgraph_api/route.py +0 -0
  225. {langgraph_api-0.18.0.dev2 → langgraph_api-0.18.0.dev4}/langgraph_api/schema.py +0 -0
  226. {langgraph_api-0.18.0.dev2 → langgraph_api-0.18.0.dev4}/langgraph_api/serde.py +0 -0
  227. {langgraph_api-0.18.0.dev2 → langgraph_api-0.18.0.dev4}/langgraph_api/server.py +0 -0
  228. {langgraph_api-0.18.0.dev2 → langgraph_api-0.18.0.dev4}/langgraph_api/sse.py +0 -0
  229. {langgraph_api-0.18.0.dev2 → langgraph_api-0.18.0.dev4}/langgraph_api/state.py +0 -0
  230. {langgraph_api-0.18.0.dev2 → langgraph_api-0.18.0.dev4}/langgraph_api/store.py +0 -0
  231. {langgraph_api-0.18.0.dev2 → langgraph_api-0.18.0.dev4}/langgraph_api/stream_v2.py +0 -0
  232. {langgraph_api-0.18.0.dev2 → langgraph_api-0.18.0.dev4}/langgraph_api/timing/profiler.py +0 -0
  233. {langgraph_api-0.18.0.dev2 → langgraph_api-0.18.0.dev4}/langgraph_api/traceblock.py +0 -0
  234. {langgraph_api-0.18.0.dev2 → langgraph_api-0.18.0.dev4}/langgraph_api/tracing_session.py +0 -0
  235. {langgraph_api-0.18.0.dev2 → langgraph_api-0.18.0.dev4}/langgraph_api/tunneling/cloudflare.py +0 -0
  236. {langgraph_api-0.18.0.dev2 → langgraph_api-0.18.0.dev4}/langgraph_api/utils/__init__.py +0 -0
  237. {langgraph_api-0.18.0.dev2 → langgraph_api-0.18.0.dev4}/langgraph_api/utils/cache.py +0 -0
  238. {langgraph_api-0.18.0.dev2 → langgraph_api-0.18.0.dev4}/langgraph_api/utils/config.py +0 -0
  239. {langgraph_api-0.18.0.dev2 → langgraph_api-0.18.0.dev4}/langgraph_api/utils/errors.py +0 -0
  240. {langgraph_api-0.18.0.dev2 → langgraph_api-0.18.0.dev4}/langgraph_api/utils/extract.py +0 -0
  241. {langgraph_api-0.18.0.dev2 → langgraph_api-0.18.0.dev4}/langgraph_api/utils/future.py +0 -0
  242. {langgraph_api-0.18.0.dev2 → langgraph_api-0.18.0.dev4}/langgraph_api/utils/network.py +0 -0
  243. {langgraph_api-0.18.0.dev2 → langgraph_api-0.18.0.dev4}/langgraph_api/utils/retriable_client.py +0 -0
  244. {langgraph_api-0.18.0.dev2 → langgraph_api-0.18.0.dev4}/langgraph_api/utils/stream_codec.py +0 -0
  245. {langgraph_api-0.18.0.dev2 → langgraph_api-0.18.0.dev4}/langgraph_api/utils/uuids.py +0 -0
  246. {langgraph_api-0.18.0.dev2 → langgraph_api-0.18.0.dev4}/langgraph_api/webhook.py +0 -0
  247. {langgraph_api-0.18.0.dev2 → langgraph_api-0.18.0.dev4}/langgraph_grpc_common/__init__.py +0 -0
  248. {langgraph_api-0.18.0.dev2 → langgraph_api-0.18.0.dev4}/langgraph_grpc_common/checkpointer.py +0 -0
  249. {langgraph_api-0.18.0.dev2 → langgraph_api-0.18.0.dev4}/langgraph_grpc_common/conversion/__init__.py +0 -0
  250. {langgraph_api-0.18.0.dev2 → langgraph_api-0.18.0.dev4}/langgraph_grpc_common/conversion/_compat.py +0 -0
  251. {langgraph_api-0.18.0.dev2 → langgraph_api-0.18.0.dev4}/langgraph_grpc_common/conversion/checkpoint.py +0 -0
  252. {langgraph_api-0.18.0.dev2 → langgraph_api-0.18.0.dev4}/langgraph_grpc_common/conversion/config.py +0 -0
  253. {langgraph_api-0.18.0.dev2 → langgraph_api-0.18.0.dev4}/langgraph_grpc_common/conversion/durability.py +0 -0
  254. {langgraph_api-0.18.0.dev2 → langgraph_api-0.18.0.dev4}/langgraph_grpc_common/conversion/store.py +0 -0
  255. {langgraph_api-0.18.0.dev2 → langgraph_api-0.18.0.dev4}/langgraph_grpc_common/conversion/struct.py +0 -0
  256. {langgraph_api-0.18.0.dev2 → langgraph_api-0.18.0.dev4}/langgraph_grpc_common/conversion/value.py +0 -0
  257. {langgraph_api-0.18.0.dev2 → langgraph_api-0.18.0.dev4}/langgraph_grpc_common/proto/checkpointer_pb2.py +0 -0
  258. {langgraph_api-0.18.0.dev2 → langgraph_api-0.18.0.dev4}/langgraph_grpc_common/proto/checkpointer_pb2.pyi +0 -0
  259. {langgraph_api-0.18.0.dev2 → langgraph_api-0.18.0.dev4}/langgraph_grpc_common/proto/checkpointer_pb2_grpc.py +0 -0
  260. {langgraph_api-0.18.0.dev2 → langgraph_api-0.18.0.dev4}/langgraph_grpc_common/proto/checkpointer_pb2_grpc.pyi +0 -0
  261. {langgraph_api-0.18.0.dev2 → langgraph_api-0.18.0.dev4}/langgraph_grpc_common/proto/core_api_pb2.py +0 -0
  262. {langgraph_api-0.18.0.dev2 → langgraph_api-0.18.0.dev4}/langgraph_grpc_common/proto/core_api_pb2.pyi +0 -0
  263. {langgraph_api-0.18.0.dev2 → langgraph_api-0.18.0.dev4}/langgraph_grpc_common/proto/core_api_pb2_grpc.py +0 -0
  264. {langgraph_api-0.18.0.dev2 → langgraph_api-0.18.0.dev4}/langgraph_grpc_common/proto/core_api_pb2_grpc.pyi +0 -0
  265. {langgraph_api-0.18.0.dev2 → langgraph_api-0.18.0.dev4}/langgraph_grpc_common/proto/encryption_pb2.py +0 -0
  266. {langgraph_api-0.18.0.dev2 → langgraph_api-0.18.0.dev4}/langgraph_grpc_common/proto/encryption_pb2.pyi +0 -0
  267. {langgraph_api-0.18.0.dev2 → langgraph_api-0.18.0.dev4}/langgraph_grpc_common/proto/encryption_pb2_grpc.py +0 -0
  268. {langgraph_api-0.18.0.dev2 → langgraph_api-0.18.0.dev4}/langgraph_grpc_common/proto/encryption_pb2_grpc.pyi +0 -0
  269. {langgraph_api-0.18.0.dev2 → langgraph_api-0.18.0.dev4}/langgraph_grpc_common/proto/engine_common_pb2.py +0 -0
  270. {langgraph_api-0.18.0.dev2 → langgraph_api-0.18.0.dev4}/langgraph_grpc_common/proto/engine_common_pb2.pyi +0 -0
  271. {langgraph_api-0.18.0.dev2 → langgraph_api-0.18.0.dev4}/langgraph_grpc_common/proto/engine_common_pb2_grpc.py +0 -0
  272. {langgraph_api-0.18.0.dev2 → langgraph_api-0.18.0.dev4}/langgraph_grpc_common/proto/engine_common_pb2_grpc.pyi +0 -0
  273. {langgraph_api-0.18.0.dev2 → langgraph_api-0.18.0.dev4}/langgraph_grpc_common/proto/enum_cancel_run_action_pb2.py +0 -0
  274. {langgraph_api-0.18.0.dev2 → langgraph_api-0.18.0.dev4}/langgraph_grpc_common/proto/enum_cancel_run_action_pb2.pyi +0 -0
  275. {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
  276. {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
  277. {langgraph_api-0.18.0.dev2 → langgraph_api-0.18.0.dev4}/langgraph_grpc_common/proto/enum_control_signal_pb2.py +0 -0
  278. {langgraph_api-0.18.0.dev2 → langgraph_api-0.18.0.dev4}/langgraph_grpc_common/proto/enum_control_signal_pb2.pyi +0 -0
  279. {langgraph_api-0.18.0.dev2 → langgraph_api-0.18.0.dev4}/langgraph_grpc_common/proto/enum_control_signal_pb2_grpc.py +0 -0
  280. {langgraph_api-0.18.0.dev2 → langgraph_api-0.18.0.dev4}/langgraph_grpc_common/proto/enum_control_signal_pb2_grpc.pyi +0 -0
  281. {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
  282. {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
  283. {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
  284. {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
  285. {langgraph_api-0.18.0.dev2 → langgraph_api-0.18.0.dev4}/langgraph_grpc_common/proto/enum_durability_pb2.py +0 -0
  286. {langgraph_api-0.18.0.dev2 → langgraph_api-0.18.0.dev4}/langgraph_grpc_common/proto/enum_durability_pb2.pyi +0 -0
  287. {langgraph_api-0.18.0.dev2 → langgraph_api-0.18.0.dev4}/langgraph_grpc_common/proto/enum_durability_pb2_grpc.py +0 -0
  288. {langgraph_api-0.18.0.dev2 → langgraph_api-0.18.0.dev4}/langgraph_grpc_common/proto/enum_durability_pb2_grpc.pyi +0 -0
  289. {langgraph_api-0.18.0.dev2 → langgraph_api-0.18.0.dev4}/langgraph_grpc_common/proto/enum_multitask_strategy_pb2.py +0 -0
  290. {langgraph_api-0.18.0.dev2 → langgraph_api-0.18.0.dev4}/langgraph_grpc_common/proto/enum_multitask_strategy_pb2.pyi +0 -0
  291. {langgraph_api-0.18.0.dev2 → langgraph_api-0.18.0.dev4}/langgraph_grpc_common/proto/enum_multitask_strategy_pb2_grpc.py +0 -0
  292. {langgraph_api-0.18.0.dev2 → langgraph_api-0.18.0.dev4}/langgraph_grpc_common/proto/enum_multitask_strategy_pb2_grpc.pyi +0 -0
  293. {langgraph_api-0.18.0.dev2 → langgraph_api-0.18.0.dev4}/langgraph_grpc_common/proto/enum_run_status_pb2.py +0 -0
  294. {langgraph_api-0.18.0.dev2 → langgraph_api-0.18.0.dev4}/langgraph_grpc_common/proto/enum_run_status_pb2.pyi +0 -0
  295. {langgraph_api-0.18.0.dev2 → langgraph_api-0.18.0.dev4}/langgraph_grpc_common/proto/enum_run_status_pb2_grpc.py +0 -0
  296. {langgraph_api-0.18.0.dev2 → langgraph_api-0.18.0.dev4}/langgraph_grpc_common/proto/enum_run_status_pb2_grpc.pyi +0 -0
  297. {langgraph_api-0.18.0.dev2 → langgraph_api-0.18.0.dev4}/langgraph_grpc_common/proto/enum_stream_mode_pb2.py +0 -0
  298. {langgraph_api-0.18.0.dev2 → langgraph_api-0.18.0.dev4}/langgraph_grpc_common/proto/enum_stream_mode_pb2.pyi +0 -0
  299. {langgraph_api-0.18.0.dev2 → langgraph_api-0.18.0.dev4}/langgraph_grpc_common/proto/enum_stream_mode_pb2_grpc.py +0 -0
  300. {langgraph_api-0.18.0.dev2 → langgraph_api-0.18.0.dev4}/langgraph_grpc_common/proto/enum_stream_mode_pb2_grpc.pyi +0 -0
  301. {langgraph_api-0.18.0.dev2 → langgraph_api-0.18.0.dev4}/langgraph_grpc_common/proto/enum_thread_status_pb2.py +0 -0
  302. {langgraph_api-0.18.0.dev2 → langgraph_api-0.18.0.dev4}/langgraph_grpc_common/proto/enum_thread_status_pb2.pyi +0 -0
  303. {langgraph_api-0.18.0.dev2 → langgraph_api-0.18.0.dev4}/langgraph_grpc_common/proto/enum_thread_status_pb2_grpc.py +0 -0
  304. {langgraph_api-0.18.0.dev2 → langgraph_api-0.18.0.dev4}/langgraph_grpc_common/proto/enum_thread_status_pb2_grpc.pyi +0 -0
  305. {langgraph_api-0.18.0.dev2 → langgraph_api-0.18.0.dev4}/langgraph_grpc_common/proto/enum_thread_stream_mode_pb2.py +0 -0
  306. {langgraph_api-0.18.0.dev2 → langgraph_api-0.18.0.dev4}/langgraph_grpc_common/proto/enum_thread_stream_mode_pb2.pyi +0 -0
  307. {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
  308. {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
  309. {langgraph_api-0.18.0.dev2 → langgraph_api-0.18.0.dev4}/langgraph_grpc_common/proto/errors_pb2.py +0 -0
  310. {langgraph_api-0.18.0.dev2 → langgraph_api-0.18.0.dev4}/langgraph_grpc_common/proto/errors_pb2.pyi +0 -0
  311. {langgraph_api-0.18.0.dev2 → langgraph_api-0.18.0.dev4}/langgraph_grpc_common/proto/errors_pb2_grpc.py +0 -0
  312. {langgraph_api-0.18.0.dev2 → langgraph_api-0.18.0.dev4}/langgraph_grpc_common/proto/errors_pb2_grpc.pyi +0 -0
  313. {langgraph_api-0.18.0.dev2 → langgraph_api-0.18.0.dev4}/langgraph_grpc_common/proto/store_pb2.py +0 -0
  314. {langgraph_api-0.18.0.dev2 → langgraph_api-0.18.0.dev4}/langgraph_grpc_common/proto/store_pb2.pyi +0 -0
  315. {langgraph_api-0.18.0.dev2 → langgraph_api-0.18.0.dev4}/langgraph_grpc_common/proto/store_pb2_grpc.py +0 -0
  316. {langgraph_api-0.18.0.dev2 → langgraph_api-0.18.0.dev4}/langgraph_grpc_common/proto/store_pb2_grpc.pyi +0 -0
  317. {langgraph_api-0.18.0.dev2 → langgraph_api-0.18.0.dev4}/langgraph_grpc_common/serde.py +0 -0
  318. {langgraph_api-0.18.0.dev2 → langgraph_api-0.18.0.dev4}/langgraph_grpc_common/store.py +0 -0
  319. {langgraph_api-0.18.0.dev2 → langgraph_api-0.18.0.dev4}/langgraph_license/__init__.py +0 -0
  320. {langgraph_api-0.18.0.dev2 → langgraph_api-0.18.0.dev4}/langgraph_license/validation.py +0 -0
  321. {langgraph_api-0.18.0.dev2 → langgraph_api-0.18.0.dev4}/langgraph_runtime/__init__.py +0 -0
  322. {langgraph_api-0.18.0.dev2 → langgraph_api-0.18.0.dev4}/langgraph_runtime/checkpoint.py +0 -0
  323. {langgraph_api-0.18.0.dev2 → langgraph_api-0.18.0.dev4}/langgraph_runtime/database.py +0 -0
  324. {langgraph_api-0.18.0.dev2 → langgraph_api-0.18.0.dev4}/langgraph_runtime/encryption.py +0 -0
  325. {langgraph_api-0.18.0.dev2 → langgraph_api-0.18.0.dev4}/langgraph_runtime/lifespan.py +0 -0
  326. {langgraph_api-0.18.0.dev2 → langgraph_api-0.18.0.dev4}/langgraph_runtime/metrics.py +0 -0
  327. {langgraph_api-0.18.0.dev2 → langgraph_api-0.18.0.dev4}/langgraph_runtime/ops.py +0 -0
  328. {langgraph_api-0.18.0.dev2 → langgraph_api-0.18.0.dev4}/langgraph_runtime/queue.py +0 -0
  329. {langgraph_api-0.18.0.dev2 → langgraph_api-0.18.0.dev4}/langgraph_runtime/retry.py +0 -0
  330. {langgraph_api-0.18.0.dev2 → langgraph_api-0.18.0.dev4}/langgraph_runtime/routes.py +0 -0
  331. {langgraph_api-0.18.0.dev2 → langgraph_api-0.18.0.dev4}/langgraph_runtime/store.py +0 -0
  332. {langgraph_api-0.18.0.dev2 → langgraph_api-0.18.0.dev4}/logging.json +0 -0
  333. {langgraph_api-0.18.0.dev2 → langgraph_api-0.18.0.dev4}/pyproject.toml +0 -0
  334. {langgraph_api-0.18.0.dev2 → langgraph_api-0.18.0.dev4}/scripts/build_wheel.py +0 -0
  335. {langgraph_api-0.18.0.dev2 → langgraph_api-0.18.0.dev4}/scripts/create_license.py +0 -0
  336. {langgraph_api-0.18.0.dev2 → langgraph_api-0.18.0.dev4}/scripts/run_a2a_tck.py +0 -0
  337. {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 '$(MAKE) $(START_TARGET) LANGGRAPH_HTTP='\''$(LANGGRAPH_HTTP)'\'' & \
130
- pid=$$!; \
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/$$pid/winpid ]; then \
133
- taskkill //F //T //PID "$$(cat /proc/$$pid/winpid)" >/dev/null 2>&1 || true; \
134
- else \
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
- # MCP Conformance Test targets
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
- MCP_CONFORMANCE_SUITE ?= active
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
- npx @modelcontextprotocol/conformance@0.1.13 server \
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
- --suite $(MCP_CONFORMANCE_SUITE) \
389
- --expected-failures $(MCP_CONFORMANCE_BASELINE) \
396
+ --requirements $* \
397
+ --expected-failures ../mcp-conformance-baseline-$*.yml \
390
398
  --verbose
391
399
 
392
400
  start-test-mcp-conformance:
393
- npx concurrently -k -s first \
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
- npx @modelcontextprotocol/conformance list --server
404
+ $(MCP_CONFORMANCE) list --server
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: langgraph-api
3
- Version: 0.18.0.dev2
3
+ Version: 0.18.0.dev4
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
@@ -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` | `threads_search` | create two threads, set their metadata, then search for them by it: database and metadata search | 300 |
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
- `threads_search` does not delete the threads it creates; the deployment's
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
- # Add result message if completed
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
@@ -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(thread_id: str, send_event: Any = None) -> ThreadRunManager:
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
- manager = _make_manager(thread_id, send_event=on_event)
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
- watchdog = asyncio.create_task(_stream_watchdog())
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.cancel()
441
- with contextlib.suppress(asyncio.CancelledError, Exception):
442
- await watchdog
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"