langgraph-api 0.15.0.dev5__tar.gz → 0.16.0.dev1__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 (314) hide show
  1. {langgraph_api-0.15.0.dev5 → langgraph_api-0.16.0.dev1}/.gitignore +1 -0
  2. {langgraph_api-0.15.0.dev5 → langgraph_api-0.16.0.dev1}/Makefile +4 -6
  3. {langgraph_api-0.15.0.dev5 → langgraph_api-0.16.0.dev1}/PKG-INFO +2 -2
  4. langgraph_api-0.16.0.dev1/benchmark/multer.test.js +115 -0
  5. {langgraph_api-0.15.0.dev5 → langgraph_api-0.16.0.dev1}/benchmark/package.json +6 -0
  6. {langgraph_api-0.15.0.dev5 → langgraph_api-0.16.0.dev1}/benchmark/yarn.lock +37 -80
  7. langgraph_api-0.16.0.dev1/langgraph_api/__init__.py +1 -0
  8. {langgraph_api-0.15.0.dev5 → langgraph_api-0.16.0.dev1}/langgraph_api/api/a2a.py +56 -12
  9. {langgraph_api-0.15.0.dev5 → langgraph_api-0.16.0.dev1}/langgraph_api/api/a2ui.py +18 -8
  10. {langgraph_api-0.15.0.dev5 → langgraph_api-0.16.0.dev1}/langgraph_api/api/mcp/_handlers.py +3 -1
  11. {langgraph_api-0.15.0.dev5 → langgraph_api-0.16.0.dev1}/langgraph_api/auth/langsmith/backend.py +2 -0
  12. {langgraph_api-0.15.0.dev5 → langgraph_api-0.16.0.dev1}/langgraph_api/auth/studio_user.py +6 -1
  13. {langgraph_api-0.15.0.dev5 → langgraph_api-0.16.0.dev1}/langgraph_api/config/__init__.py +36 -0
  14. {langgraph_api-0.15.0.dev5 → langgraph_api-0.16.0.dev1}/langgraph_api/cron_scheduler.py +1 -1
  15. {langgraph_api-0.15.0.dev5 → langgraph_api-0.16.0.dev1}/langgraph_api/encryption/middleware.py +4 -0
  16. {langgraph_api-0.15.0.dev5 → langgraph_api-0.16.0.dev1}/langgraph_api/graph.py +14 -2
  17. {langgraph_api-0.15.0.dev5 → langgraph_api-0.16.0.dev1}/langgraph_api/js/client.mts +18 -6
  18. {langgraph_api-0.15.0.dev5 → langgraph_api-0.16.0.dev1}/langgraph_api/js/package.json +3 -3
  19. {langgraph_api-0.15.0.dev5 → langgraph_api-0.16.0.dev1}/langgraph_api/js/yarn.lock +103 -158
  20. {langgraph_api-0.15.0.dev5 → langgraph_api-0.16.0.dev1}/langgraph_api/metrics_collector.py +6 -0
  21. {langgraph_api-0.15.0.dev5 → langgraph_api-0.16.0.dev1}/langgraph_api/release_tags.py +35 -17
  22. langgraph_api-0.16.0.dev1/langgraph_api/runner/__init__.py +10 -0
  23. langgraph_api-0.16.0.dev1/langgraph_api/runner/__main__.py +275 -0
  24. {langgraph_api-0.15.0.dev5 → langgraph_api-0.16.0.dev1}/langgraph_api/self_hosted_logs.py +4 -0
  25. {langgraph_api-0.15.0.dev5 → langgraph_api-0.16.0.dev1}/langgraph_api/worker.py +36 -163
  26. langgraph_api-0.16.0.dev1/langgraph_api/worker_runtime.py +221 -0
  27. {langgraph_api-0.15.0.dev5 → langgraph_api-0.16.0.dev1}/langgraph_grpc_common/proto/__init__.py +4 -0
  28. langgraph_api-0.16.0.dev1/langgraph_grpc_common/proto/runner_pb2.py +50 -0
  29. langgraph_api-0.16.0.dev1/langgraph_grpc_common/proto/runner_pb2.pyi +167 -0
  30. langgraph_api-0.16.0.dev1/langgraph_grpc_common/proto/runner_pb2_grpc.py +108 -0
  31. langgraph_api-0.16.0.dev1/langgraph_grpc_common/proto/runner_pb2_grpc.pyi +73 -0
  32. {langgraph_api-0.15.0.dev5 → langgraph_api-0.16.0.dev1}/pyproject.toml +1 -1
  33. langgraph_api-0.15.0.dev5/langgraph_api/__init__.py +0 -1
  34. {langgraph_api-0.15.0.dev5 → langgraph_api-0.16.0.dev1}/LICENSE +0 -0
  35. {langgraph_api-0.15.0.dev5 → langgraph_api-0.16.0.dev1}/README.md +0 -0
  36. {langgraph_api-0.15.0.dev5 → langgraph_api-0.16.0.dev1}/benchmark/.gitignore +0 -0
  37. {langgraph_api-0.15.0.dev5 → langgraph_api-0.16.0.dev1}/benchmark/Makefile +0 -0
  38. {langgraph_api-0.15.0.dev5 → langgraph_api-0.16.0.dev1}/benchmark/README.md +0 -0
  39. {langgraph_api-0.15.0.dev5 → langgraph_api-0.16.0.dev1}/benchmark/benchmark-runners/assistant.ts +0 -0
  40. {langgraph_api-0.15.0.dev5 → langgraph_api-0.16.0.dev1}/benchmark/benchmark-runners/benchmark-runner.ts +0 -0
  41. {langgraph_api-0.15.0.dev5 → langgraph_api-0.16.0.dev1}/benchmark/benchmark-runners/benchmark_profiles.ts +0 -0
  42. {langgraph_api-0.15.0.dev5 → langgraph_api-0.16.0.dev1}/benchmark/benchmark-runners/benchmarks.ts +0 -0
  43. {langgraph_api-0.15.0.dev5 → langgraph_api-0.16.0.dev1}/benchmark/benchmark-runners/cancel_first_second_completes.ts +0 -0
  44. {langgraph_api-0.15.0.dev5 → langgraph_api-0.16.0.dev1}/benchmark/benchmark-runners/classify-error.test.js +0 -0
  45. {langgraph_api-0.15.0.dev5 → langgraph_api-0.16.0.dev1}/benchmark/benchmark-runners/classify-error.ts +0 -0
  46. {langgraph_api-0.15.0.dev5 → langgraph_api-0.16.0.dev1}/benchmark/benchmark-runners/delta-turns-lib.test.js +0 -0
  47. {langgraph_api-0.15.0.dev5 → langgraph_api-0.16.0.dev1}/benchmark/benchmark-runners/delta-turns-lib.ts +0 -0
  48. {langgraph_api-0.15.0.dev5 → langgraph_api-0.16.0.dev1}/benchmark/benchmark-runners/delta_turns.ts +0 -0
  49. {langgraph_api-0.15.0.dev5 → langgraph_api-0.16.0.dev1}/benchmark/benchmark-runners/enqueued_runs_order.ts +0 -0
  50. {langgraph_api-0.15.0.dev5 → langgraph_api-0.16.0.dev1}/benchmark/benchmark-runners/log-failure.ts +0 -0
  51. {langgraph_api-0.15.0.dev5 → langgraph_api-0.16.0.dev1}/benchmark/benchmark-runners/meta_workload.ts +0 -0
  52. {langgraph_api-0.15.0.dev5 → langgraph_api-0.16.0.dev1}/benchmark/benchmark-runners/store.ts +0 -0
  53. {langgraph_api-0.15.0.dev5 → langgraph_api-0.16.0.dev1}/benchmark/benchmark-runners/stream_write.ts +0 -0
  54. {langgraph_api-0.15.0.dev5 → langgraph_api-0.16.0.dev1}/benchmark/benchmark-runners/thread.ts +0 -0
  55. {langgraph_api-0.15.0.dev5 → langgraph_api-0.16.0.dev1}/benchmark/benchmark-runners/thread_runs_metadata_search.ts +0 -0
  56. {langgraph_api-0.15.0.dev5 → langgraph_api-0.16.0.dev1}/benchmark/benchmark-runners/threads_search_metadata.ts +0 -0
  57. {langgraph_api-0.15.0.dev5 → langgraph_api-0.16.0.dev1}/benchmark/benchmark-runners/types.ts +0 -0
  58. {langgraph_api-0.15.0.dev5 → langgraph_api-0.16.0.dev1}/benchmark/benchmark-runners/wait_write.ts +0 -0
  59. {langgraph_api-0.15.0.dev5 → langgraph_api-0.16.0.dev1}/benchmark/capacity-ci.js +0 -0
  60. {langgraph_api-0.15.0.dev5 → langgraph_api-0.16.0.dev1}/benchmark/capacity-ci.test.js +0 -0
  61. {langgraph_api-0.15.0.dev5 → langgraph_api-0.16.0.dev1}/benchmark/clean-cli.js +0 -0
  62. {langgraph_api-0.15.0.dev5 → langgraph_api-0.16.0.dev1}/benchmark/clean.js +0 -0
  63. {langgraph_api-0.15.0.dev5 → langgraph_api-0.16.0.dev1}/benchmark/continuous/README.md +0 -0
  64. {langgraph_api-0.15.0.dev5 → langgraph_api-0.16.0.dev1}/benchmark/continuous/pyproject.toml +0 -0
  65. {langgraph_api-0.15.0.dev5 → langgraph_api-0.16.0.dev1}/benchmark/continuous/runner.py +0 -0
  66. {langgraph_api-0.15.0.dev5 → langgraph_api-0.16.0.dev1}/benchmark/continuous/uv.lock +0 -0
  67. {langgraph_api-0.15.0.dev5 → langgraph_api-0.16.0.dev1}/benchmark/daily-report.js +0 -0
  68. {langgraph_api-0.15.0.dev5 → langgraph_api-0.16.0.dev1}/benchmark/daily-report.test.js +0 -0
  69. {langgraph_api-0.15.0.dev5 → langgraph_api-0.16.0.dev1}/benchmark/graphs.js +0 -0
  70. {langgraph_api-0.15.0.dev5 → langgraph_api-0.16.0.dev1}/benchmark/host-v2.js +0 -0
  71. {langgraph_api-0.15.0.dev5 → langgraph_api-0.16.0.dev1}/benchmark/host-v2.test.js +0 -0
  72. {langgraph_api-0.15.0.dev5 → langgraph_api-0.16.0.dev1}/benchmark/ramp.js +0 -0
  73. {langgraph_api-0.15.0.dev5 → langgraph_api-0.16.0.dev1}/benchmark/reporting/dd_reporting.py +0 -0
  74. {langgraph_api-0.15.0.dev5 → langgraph_api-0.16.0.dev1}/benchmark/staircase.py +0 -0
  75. {langgraph_api-0.15.0.dev5 → langgraph_api-0.16.0.dev1}/benchmark/staircase_step_k6.js +0 -0
  76. {langgraph_api-0.15.0.dev5 → langgraph_api-0.16.0.dev1}/benchmark/tsconfig.json +0 -0
  77. {langgraph_api-0.15.0.dev5 → langgraph_api-0.16.0.dev1}/benchmark/update-revision.js +0 -0
  78. {langgraph_api-0.15.0.dev5 → langgraph_api-0.16.0.dev1}/benchmark/weather.js +0 -0
  79. {langgraph_api-0.15.0.dev5 → langgraph_api-0.16.0.dev1}/constraints.txt +0 -0
  80. {langgraph_api-0.15.0.dev5 → langgraph_api-0.16.0.dev1}/custom_store.sql +0 -0
  81. {langgraph_api-0.15.0.dev5 → langgraph_api-0.16.0.dev1}/forbidden.txt +0 -0
  82. {langgraph_api-0.15.0.dev5 → langgraph_api-0.16.0.dev1}/hatch_build.py +0 -0
  83. {langgraph_api-0.15.0.dev5 → langgraph_api-0.16.0.dev1}/healthcheck.py +0 -0
  84. {langgraph_api-0.15.0.dev5 → langgraph_api-0.16.0.dev1}/langgraph-cloud-debugging-20260210132856.zip +0 -0
  85. {langgraph_api-0.15.0.dev5 → langgraph_api-0.16.0.dev1}/langgraph_api/_checkpointer/__init__.py +0 -0
  86. {langgraph_api-0.15.0.dev5 → langgraph_api-0.16.0.dev1}/langgraph_api/_checkpointer/_adapter.py +0 -0
  87. {langgraph_api-0.15.0.dev5 → langgraph_api-0.16.0.dev1}/langgraph_api/_checkpointer/protocol.py +0 -0
  88. {langgraph_api-0.15.0.dev5 → langgraph_api-0.16.0.dev1}/langgraph_api/_factory_utils.py +0 -0
  89. {langgraph_api-0.15.0.dev5 → langgraph_api-0.16.0.dev1}/langgraph_api/api/__init__.py +0 -0
  90. {langgraph_api-0.15.0.dev5 → langgraph_api-0.16.0.dev1}/langgraph_api/api/a2ui_schemas/README.md +0 -0
  91. {langgraph_api-0.15.0.dev5 → langgraph_api-0.16.0.dev1}/langgraph_api/api/a2ui_schemas/client_capabilities.json +0 -0
  92. {langgraph_api-0.15.0.dev5 → langgraph_api-0.16.0.dev1}/langgraph_api/api/a2ui_schemas/client_data_model.json +0 -0
  93. {langgraph_api-0.15.0.dev5 → langgraph_api-0.16.0.dev1}/langgraph_api/api/a2ui_schemas/client_to_server.json +0 -0
  94. {langgraph_api-0.15.0.dev5 → langgraph_api-0.16.0.dev1}/langgraph_api/api/a2ui_schemas/server_to_client.json +0 -0
  95. {langgraph_api-0.15.0.dev5 → langgraph_api-0.16.0.dev1}/langgraph_api/api/assistants.py +0 -0
  96. {langgraph_api-0.15.0.dev5 → langgraph_api-0.16.0.dev1}/langgraph_api/api/event_streaming.py +0 -0
  97. {langgraph_api-0.15.0.dev5 → langgraph_api-0.16.0.dev1}/langgraph_api/api/mcp/__init__.py +0 -0
  98. {langgraph_api-0.15.0.dev5 → langgraph_api-0.16.0.dev1}/langgraph_api/api/mcp/_constants.py +0 -0
  99. {langgraph_api-0.15.0.dev5 → langgraph_api-0.16.0.dev1}/langgraph_api/api/mcp/_models.py +0 -0
  100. {langgraph_api-0.15.0.dev5 → langgraph_api-0.16.0.dev1}/langgraph_api/api/mcp/_routes.py +0 -0
  101. {langgraph_api-0.15.0.dev5 → langgraph_api-0.16.0.dev1}/langgraph_api/api/mcp/_sanitizers.py +0 -0
  102. {langgraph_api-0.15.0.dev5 → langgraph_api-0.16.0.dev1}/langgraph_api/api/meta.py +0 -0
  103. {langgraph_api-0.15.0.dev5 → langgraph_api-0.16.0.dev1}/langgraph_api/api/openapi.py +0 -0
  104. {langgraph_api-0.15.0.dev5 → langgraph_api-0.16.0.dev1}/langgraph_api/api/profile.py +0 -0
  105. {langgraph_api-0.15.0.dev5 → langgraph_api-0.16.0.dev1}/langgraph_api/api/runs.py +0 -0
  106. {langgraph_api-0.15.0.dev5 → langgraph_api-0.16.0.dev1}/langgraph_api/api/store.py +0 -0
  107. {langgraph_api-0.15.0.dev5 → langgraph_api-0.16.0.dev1}/langgraph_api/api/threads.py +0 -0
  108. {langgraph_api-0.15.0.dev5 → langgraph_api-0.16.0.dev1}/langgraph_api/api/ui.py +0 -0
  109. {langgraph_api-0.15.0.dev5 → langgraph_api-0.16.0.dev1}/langgraph_api/asgi_transport.py +0 -0
  110. {langgraph_api-0.15.0.dev5 → langgraph_api-0.16.0.dev1}/langgraph_api/asyncio.py +0 -0
  111. {langgraph_api-0.15.0.dev5 → langgraph_api-0.16.0.dev1}/langgraph_api/auth/__init__.py +0 -0
  112. {langgraph_api-0.15.0.dev5 → langgraph_api-0.16.0.dev1}/langgraph_api/auth/custom.py +0 -0
  113. {langgraph_api-0.15.0.dev5 → langgraph_api-0.16.0.dev1}/langgraph_api/auth/errors.py +0 -0
  114. {langgraph_api-0.15.0.dev5 → langgraph_api-0.16.0.dev1}/langgraph_api/auth/langsmith/__init__.py +0 -0
  115. {langgraph_api-0.15.0.dev5 → langgraph_api-0.16.0.dev1}/langgraph_api/auth/langsmith/client.py +0 -0
  116. {langgraph_api-0.15.0.dev5 → langgraph_api-0.16.0.dev1}/langgraph_api/auth/middleware.py +0 -0
  117. {langgraph_api-0.15.0.dev5 → langgraph_api-0.16.0.dev1}/langgraph_api/auth/noop.py +0 -0
  118. {langgraph_api-0.15.0.dev5 → langgraph_api-0.16.0.dev1}/langgraph_api/beacon_data_plane_jwt_auth.py +0 -0
  119. {langgraph_api-0.15.0.dev5 → langgraph_api-0.16.0.dev1}/langgraph_api/cache.py +0 -0
  120. {langgraph_api-0.15.0.dev5 → langgraph_api-0.16.0.dev1}/langgraph_api/cli.py +0 -0
  121. {langgraph_api-0.15.0.dev5 → langgraph_api-0.16.0.dev1}/langgraph_api/command.py +0 -0
  122. {langgraph_api-0.15.0.dev5 → langgraph_api-0.16.0.dev1}/langgraph_api/config/_parse.py +0 -0
  123. {langgraph_api-0.15.0.dev5 → langgraph_api-0.16.0.dev1}/langgraph_api/config/schemas.py +0 -0
  124. {langgraph_api-0.15.0.dev5 → langgraph_api-0.16.0.dev1}/langgraph_api/encryption/__init__.py +0 -0
  125. {langgraph_api-0.15.0.dev5 → langgraph_api-0.16.0.dev1}/langgraph_api/encryption/aes_json.py +0 -0
  126. {langgraph_api-0.15.0.dev5 → langgraph_api-0.16.0.dev1}/langgraph_api/encryption/context.py +0 -0
  127. {langgraph_api-0.15.0.dev5 → langgraph_api-0.16.0.dev1}/langgraph_api/encryption/custom.py +0 -0
  128. {langgraph_api-0.15.0.dev5 → langgraph_api-0.16.0.dev1}/langgraph_api/encryption/shared.py +0 -0
  129. {langgraph_api-0.15.0.dev5 → langgraph_api-0.16.0.dev1}/langgraph_api/errors.py +0 -0
  130. {langgraph_api-0.15.0.dev5 → langgraph_api-0.16.0.dev1}/langgraph_api/event_streaming/__init__.py +0 -0
  131. {langgraph_api-0.15.0.dev5 → langgraph_api-0.16.0.dev1}/langgraph_api/event_streaming/capabilities.py +0 -0
  132. {langgraph_api-0.15.0.dev5 → langgraph_api-0.16.0.dev1}/langgraph_api/event_streaming/constants.py +0 -0
  133. {langgraph_api-0.15.0.dev5 → langgraph_api-0.16.0.dev1}/langgraph_api/event_streaming/event_normalizers.py +0 -0
  134. {langgraph_api-0.15.0.dev5 → langgraph_api-0.16.0.dev1}/langgraph_api/event_streaming/namespace.py +0 -0
  135. {langgraph_api-0.15.0.dev5 → langgraph_api-0.16.0.dev1}/langgraph_api/event_streaming/service.py +0 -0
  136. {langgraph_api-0.15.0.dev5 → langgraph_api-0.16.0.dev1}/langgraph_api/event_streaming/session.py +0 -0
  137. {langgraph_api-0.15.0.dev5 → langgraph_api-0.16.0.dev1}/langgraph_api/event_streaming/state_normalizers.py +0 -0
  138. {langgraph_api-0.15.0.dev5 → langgraph_api-0.16.0.dev1}/langgraph_api/event_streaming/types.py +0 -0
  139. {langgraph_api-0.15.0.dev5 → langgraph_api-0.16.0.dev1}/langgraph_api/feature_flags.py +0 -0
  140. {langgraph_api-0.15.0.dev5 → langgraph_api-0.16.0.dev1}/langgraph_api/grpc/__init__.py +0 -0
  141. {langgraph_api-0.15.0.dev5 → langgraph_api-0.16.0.dev1}/langgraph_api/grpc/client.py +0 -0
  142. {langgraph_api-0.15.0.dev5 → langgraph_api-0.16.0.dev1}/langgraph_api/grpc/generated/core_api_pb2.pyi +0 -0
  143. {langgraph_api-0.15.0.dev5 → langgraph_api-0.16.0.dev1}/langgraph_api/grpc/ops/__init__.py +0 -0
  144. {langgraph_api-0.15.0.dev5 → langgraph_api-0.16.0.dev1}/langgraph_api/grpc/ops/assistants.py +0 -0
  145. {langgraph_api-0.15.0.dev5 → langgraph_api-0.16.0.dev1}/langgraph_api/grpc/ops/cache.py +0 -0
  146. {langgraph_api-0.15.0.dev5 → langgraph_api-0.16.0.dev1}/langgraph_api/grpc/ops/crons.py +0 -0
  147. {langgraph_api-0.15.0.dev5 → langgraph_api-0.16.0.dev1}/langgraph_api/grpc/ops/runs.py +0 -0
  148. {langgraph_api-0.15.0.dev5 → langgraph_api-0.16.0.dev1}/langgraph_api/grpc/ops/threads.py +0 -0
  149. {langgraph_api-0.15.0.dev5 → langgraph_api-0.16.0.dev1}/langgraph_api/grpc/server.py +0 -0
  150. {langgraph_api-0.15.0.dev5 → langgraph_api-0.16.0.dev1}/langgraph_api/grpc/servicers/__init__.py +0 -0
  151. {langgraph_api-0.15.0.dev5 → langgraph_api-0.16.0.dev1}/langgraph_api/grpc/servicers/checkpointer.py +0 -0
  152. {langgraph_api-0.15.0.dev5 → langgraph_api-0.16.0.dev1}/langgraph_api/grpc/servicers/encryption.py +0 -0
  153. {langgraph_api-0.15.0.dev5 → langgraph_api-0.16.0.dev1}/langgraph_api/http.py +0 -0
  154. {langgraph_api-0.15.0.dev5 → langgraph_api-0.16.0.dev1}/langgraph_api/http_metrics.py +0 -0
  155. {langgraph_api-0.15.0.dev5 → langgraph_api-0.16.0.dev1}/langgraph_api/http_metrics_utils.py +0 -0
  156. {langgraph_api-0.15.0.dev5 → langgraph_api-0.16.0.dev1}/langgraph_api/js/.gitignore +0 -0
  157. {langgraph_api-0.15.0.dev5 → langgraph_api-0.16.0.dev1}/langgraph_api/js/.prettierrc +0 -0
  158. {langgraph_api-0.15.0.dev5 → langgraph_api-0.16.0.dev1}/langgraph_api/js/.yarnclean +0 -0
  159. {langgraph_api-0.15.0.dev5 → langgraph_api-0.16.0.dev1}/langgraph_api/js/__init__.py +0 -0
  160. {langgraph_api-0.15.0.dev5 → langgraph_api-0.16.0.dev1}/langgraph_api/js/base.py +0 -0
  161. {langgraph_api-0.15.0.dev5 → langgraph_api-0.16.0.dev1}/langgraph_api/js/build.mts +0 -0
  162. {langgraph_api-0.15.0.dev5 → langgraph_api-0.16.0.dev1}/langgraph_api/js/client.http.mts +0 -0
  163. {langgraph_api-0.15.0.dev5 → langgraph_api-0.16.0.dev1}/langgraph_api/js/errors.py +0 -0
  164. {langgraph_api-0.15.0.dev5 → langgraph_api-0.16.0.dev1}/langgraph_api/js/global.d.ts +0 -0
  165. {langgraph_api-0.15.0.dev5 → langgraph_api-0.16.0.dev1}/langgraph_api/js/remote.py +0 -0
  166. {langgraph_api-0.15.0.dev5 → langgraph_api-0.16.0.dev1}/langgraph_api/js/schema.py +0 -0
  167. {langgraph_api-0.15.0.dev5 → langgraph_api-0.16.0.dev1}/langgraph_api/js/src/graph.mts +0 -0
  168. {langgraph_api-0.15.0.dev5 → langgraph_api-0.16.0.dev1}/langgraph_api/js/src/load.hooks.mjs +0 -0
  169. {langgraph_api-0.15.0.dev5 → langgraph_api-0.16.0.dev1}/langgraph_api/js/src/preload.mjs +0 -0
  170. {langgraph_api-0.15.0.dev5 → langgraph_api-0.16.0.dev1}/langgraph_api/js/src/utils/experiment-tracing.mts +0 -0
  171. {langgraph_api-0.15.0.dev5 → langgraph_api-0.16.0.dev1}/langgraph_api/js/src/utils/files.mts +0 -0
  172. {langgraph_api-0.15.0.dev5 → langgraph_api-0.16.0.dev1}/langgraph_api/js/src/utils/importMap.mts +0 -0
  173. {langgraph_api-0.15.0.dev5 → langgraph_api-0.16.0.dev1}/langgraph_api/js/src/utils/pythonSchemas.mts +0 -0
  174. {langgraph_api-0.15.0.dev5 → langgraph_api-0.16.0.dev1}/langgraph_api/js/src/utils/serde.mts +0 -0
  175. {langgraph_api-0.15.0.dev5 → langgraph_api-0.16.0.dev1}/langgraph_api/js/sse.py +0 -0
  176. {langgraph_api-0.15.0.dev5 → langgraph_api-0.16.0.dev1}/langgraph_api/js/traceblock.mts +0 -0
  177. {langgraph_api-0.15.0.dev5 → langgraph_api-0.16.0.dev1}/langgraph_api/js/tsconfig.json +0 -0
  178. {langgraph_api-0.15.0.dev5 → langgraph_api-0.16.0.dev1}/langgraph_api/js/ui.py +0 -0
  179. {langgraph_api-0.15.0.dev5 → langgraph_api-0.16.0.dev1}/langgraph_api/lc_security/__init__.py +0 -0
  180. {langgraph_api-0.15.0.dev5 → langgraph_api-0.16.0.dev1}/langgraph_api/lc_security/exceptions.py +0 -0
  181. {langgraph_api-0.15.0.dev5 → langgraph_api-0.16.0.dev1}/langgraph_api/lc_security/policy.py +0 -0
  182. {langgraph_api-0.15.0.dev5 → langgraph_api-0.16.0.dev1}/langgraph_api/lc_security/transport.py +0 -0
  183. {langgraph_api-0.15.0.dev5 → langgraph_api-0.16.0.dev1}/langgraph_api/logging.py +0 -0
  184. {langgraph_api-0.15.0.dev5 → langgraph_api-0.16.0.dev1}/langgraph_api/metadata.py +0 -0
  185. {langgraph_api-0.15.0.dev5 → langgraph_api-0.16.0.dev1}/langgraph_api/metrics_otlp.py +0 -0
  186. {langgraph_api-0.15.0.dev5 → langgraph_api-0.16.0.dev1}/langgraph_api/middleware/__init__.py +0 -0
  187. {langgraph_api-0.15.0.dev5 → langgraph_api-0.16.0.dev1}/langgraph_api/middleware/ensure_store.py +0 -0
  188. {langgraph_api-0.15.0.dev5 → langgraph_api-0.16.0.dev1}/langgraph_api/middleware/http_logger.py +0 -0
  189. {langgraph_api-0.15.0.dev5 → langgraph_api-0.16.0.dev1}/langgraph_api/middleware/private_network.py +0 -0
  190. {langgraph_api-0.15.0.dev5 → langgraph_api-0.16.0.dev1}/langgraph_api/middleware/request_id.py +0 -0
  191. {langgraph_api-0.15.0.dev5 → langgraph_api-0.16.0.dev1}/langgraph_api/models/__init__.py +0 -0
  192. {langgraph_api-0.15.0.dev5 → langgraph_api-0.16.0.dev1}/langgraph_api/models/run.py +0 -0
  193. {langgraph_api-0.15.0.dev5 → langgraph_api-0.16.0.dev1}/langgraph_api/otel_context.py +0 -0
  194. {langgraph_api-0.15.0.dev5 → langgraph_api-0.16.0.dev1}/langgraph_api/patch.py +0 -0
  195. {langgraph_api-0.15.0.dev5 → langgraph_api-0.16.0.dev1}/langgraph_api/queue_entrypoint.py +0 -0
  196. {langgraph_api-0.15.0.dev5 → langgraph_api-0.16.0.dev1}/langgraph_api/route.py +0 -0
  197. {langgraph_api-0.15.0.dev5 → langgraph_api-0.16.0.dev1}/langgraph_api/schema.py +0 -0
  198. {langgraph_api-0.15.0.dev5 → langgraph_api-0.16.0.dev1}/langgraph_api/self_hosted_metrics.py +0 -0
  199. {langgraph_api-0.15.0.dev5 → langgraph_api-0.16.0.dev1}/langgraph_api/serde.py +0 -0
  200. {langgraph_api-0.15.0.dev5 → langgraph_api-0.16.0.dev1}/langgraph_api/server.py +0 -0
  201. {langgraph_api-0.15.0.dev5 → langgraph_api-0.16.0.dev1}/langgraph_api/sse.py +0 -0
  202. {langgraph_api-0.15.0.dev5 → langgraph_api-0.16.0.dev1}/langgraph_api/state.py +0 -0
  203. {langgraph_api-0.15.0.dev5 → langgraph_api-0.16.0.dev1}/langgraph_api/store.py +0 -0
  204. {langgraph_api-0.15.0.dev5 → langgraph_api-0.16.0.dev1}/langgraph_api/stream.py +0 -0
  205. {langgraph_api-0.15.0.dev5 → langgraph_api-0.16.0.dev1}/langgraph_api/stream_v2.py +0 -0
  206. {langgraph_api-0.15.0.dev5 → langgraph_api-0.16.0.dev1}/langgraph_api/timing/__init__.py +0 -0
  207. {langgraph_api-0.15.0.dev5 → langgraph_api-0.16.0.dev1}/langgraph_api/timing/profiler.py +0 -0
  208. {langgraph_api-0.15.0.dev5 → langgraph_api-0.16.0.dev1}/langgraph_api/timing/timer.py +0 -0
  209. {langgraph_api-0.15.0.dev5 → langgraph_api-0.16.0.dev1}/langgraph_api/traceblock.py +0 -0
  210. {langgraph_api-0.15.0.dev5 → langgraph_api-0.16.0.dev1}/langgraph_api/tracing_session.py +0 -0
  211. {langgraph_api-0.15.0.dev5 → langgraph_api-0.16.0.dev1}/langgraph_api/tunneling/cloudflare.py +0 -0
  212. {langgraph_api-0.15.0.dev5 → langgraph_api-0.16.0.dev1}/langgraph_api/utils/__init__.py +0 -0
  213. {langgraph_api-0.15.0.dev5 → langgraph_api-0.16.0.dev1}/langgraph_api/utils/cache.py +0 -0
  214. {langgraph_api-0.15.0.dev5 → langgraph_api-0.16.0.dev1}/langgraph_api/utils/config.py +0 -0
  215. {langgraph_api-0.15.0.dev5 → langgraph_api-0.16.0.dev1}/langgraph_api/utils/errors.py +0 -0
  216. {langgraph_api-0.15.0.dev5 → langgraph_api-0.16.0.dev1}/langgraph_api/utils/extract.py +0 -0
  217. {langgraph_api-0.15.0.dev5 → langgraph_api-0.16.0.dev1}/langgraph_api/utils/future.py +0 -0
  218. {langgraph_api-0.15.0.dev5 → langgraph_api-0.16.0.dev1}/langgraph_api/utils/headers.py +0 -0
  219. {langgraph_api-0.15.0.dev5 → langgraph_api-0.16.0.dev1}/langgraph_api/utils/network.py +0 -0
  220. {langgraph_api-0.15.0.dev5 → langgraph_api-0.16.0.dev1}/langgraph_api/utils/retriable_client.py +0 -0
  221. {langgraph_api-0.15.0.dev5 → langgraph_api-0.16.0.dev1}/langgraph_api/utils/stream_codec.py +0 -0
  222. {langgraph_api-0.15.0.dev5 → langgraph_api-0.16.0.dev1}/langgraph_api/utils/uuids.py +0 -0
  223. {langgraph_api-0.15.0.dev5 → langgraph_api-0.16.0.dev1}/langgraph_api/validation.py +0 -0
  224. {langgraph_api-0.15.0.dev5 → langgraph_api-0.16.0.dev1}/langgraph_api/webhook.py +0 -0
  225. {langgraph_api-0.15.0.dev5 → langgraph_api-0.16.0.dev1}/langgraph_grpc_common/__init__.py +0 -0
  226. {langgraph_api-0.15.0.dev5 → langgraph_api-0.16.0.dev1}/langgraph_grpc_common/checkpointer.py +0 -0
  227. {langgraph_api-0.15.0.dev5 → langgraph_api-0.16.0.dev1}/langgraph_grpc_common/conversion/__init__.py +0 -0
  228. {langgraph_api-0.15.0.dev5 → langgraph_api-0.16.0.dev1}/langgraph_grpc_common/conversion/_compat.py +0 -0
  229. {langgraph_api-0.15.0.dev5 → langgraph_api-0.16.0.dev1}/langgraph_grpc_common/conversion/checkpoint.py +0 -0
  230. {langgraph_api-0.15.0.dev5 → langgraph_api-0.16.0.dev1}/langgraph_grpc_common/conversion/config.py +0 -0
  231. {langgraph_api-0.15.0.dev5 → langgraph_api-0.16.0.dev1}/langgraph_grpc_common/conversion/durability.py +0 -0
  232. {langgraph_api-0.15.0.dev5 → langgraph_api-0.16.0.dev1}/langgraph_grpc_common/conversion/store.py +0 -0
  233. {langgraph_api-0.15.0.dev5 → langgraph_api-0.16.0.dev1}/langgraph_grpc_common/conversion/struct.py +0 -0
  234. {langgraph_api-0.15.0.dev5 → langgraph_api-0.16.0.dev1}/langgraph_grpc_common/conversion/value.py +0 -0
  235. {langgraph_api-0.15.0.dev5 → langgraph_api-0.16.0.dev1}/langgraph_grpc_common/proto/checkpointer_pb2.py +0 -0
  236. {langgraph_api-0.15.0.dev5 → langgraph_api-0.16.0.dev1}/langgraph_grpc_common/proto/checkpointer_pb2.pyi +0 -0
  237. {langgraph_api-0.15.0.dev5 → langgraph_api-0.16.0.dev1}/langgraph_grpc_common/proto/checkpointer_pb2_grpc.py +0 -0
  238. {langgraph_api-0.15.0.dev5 → langgraph_api-0.16.0.dev1}/langgraph_grpc_common/proto/checkpointer_pb2_grpc.pyi +0 -0
  239. {langgraph_api-0.15.0.dev5 → langgraph_api-0.16.0.dev1}/langgraph_grpc_common/proto/core_api_pb2.py +0 -0
  240. {langgraph_api-0.15.0.dev5 → langgraph_api-0.16.0.dev1}/langgraph_grpc_common/proto/core_api_pb2.pyi +0 -0
  241. {langgraph_api-0.15.0.dev5 → langgraph_api-0.16.0.dev1}/langgraph_grpc_common/proto/core_api_pb2_grpc.py +0 -0
  242. {langgraph_api-0.15.0.dev5 → langgraph_api-0.16.0.dev1}/langgraph_grpc_common/proto/core_api_pb2_grpc.pyi +0 -0
  243. {langgraph_api-0.15.0.dev5 → langgraph_api-0.16.0.dev1}/langgraph_grpc_common/proto/encryption_pb2.py +0 -0
  244. {langgraph_api-0.15.0.dev5 → langgraph_api-0.16.0.dev1}/langgraph_grpc_common/proto/encryption_pb2.pyi +0 -0
  245. {langgraph_api-0.15.0.dev5 → langgraph_api-0.16.0.dev1}/langgraph_grpc_common/proto/encryption_pb2_grpc.py +0 -0
  246. {langgraph_api-0.15.0.dev5 → langgraph_api-0.16.0.dev1}/langgraph_grpc_common/proto/encryption_pb2_grpc.pyi +0 -0
  247. {langgraph_api-0.15.0.dev5 → langgraph_api-0.16.0.dev1}/langgraph_grpc_common/proto/engine_common_pb2.py +0 -0
  248. {langgraph_api-0.15.0.dev5 → langgraph_api-0.16.0.dev1}/langgraph_grpc_common/proto/engine_common_pb2.pyi +0 -0
  249. {langgraph_api-0.15.0.dev5 → langgraph_api-0.16.0.dev1}/langgraph_grpc_common/proto/engine_common_pb2_grpc.py +0 -0
  250. {langgraph_api-0.15.0.dev5 → langgraph_api-0.16.0.dev1}/langgraph_grpc_common/proto/engine_common_pb2_grpc.pyi +0 -0
  251. {langgraph_api-0.15.0.dev5 → langgraph_api-0.16.0.dev1}/langgraph_grpc_common/proto/enum_cancel_run_action_pb2.py +0 -0
  252. {langgraph_api-0.15.0.dev5 → langgraph_api-0.16.0.dev1}/langgraph_grpc_common/proto/enum_cancel_run_action_pb2.pyi +0 -0
  253. {langgraph_api-0.15.0.dev5 → langgraph_api-0.16.0.dev1}/langgraph_grpc_common/proto/enum_cancel_run_action_pb2_grpc.py +0 -0
  254. {langgraph_api-0.15.0.dev5 → langgraph_api-0.16.0.dev1}/langgraph_grpc_common/proto/enum_cancel_run_action_pb2_grpc.pyi +0 -0
  255. {langgraph_api-0.15.0.dev5 → langgraph_api-0.16.0.dev1}/langgraph_grpc_common/proto/enum_control_signal_pb2.py +0 -0
  256. {langgraph_api-0.15.0.dev5 → langgraph_api-0.16.0.dev1}/langgraph_grpc_common/proto/enum_control_signal_pb2.pyi +0 -0
  257. {langgraph_api-0.15.0.dev5 → langgraph_api-0.16.0.dev1}/langgraph_grpc_common/proto/enum_control_signal_pb2_grpc.py +0 -0
  258. {langgraph_api-0.15.0.dev5 → langgraph_api-0.16.0.dev1}/langgraph_grpc_common/proto/enum_control_signal_pb2_grpc.pyi +0 -0
  259. {langgraph_api-0.15.0.dev5 → langgraph_api-0.16.0.dev1}/langgraph_grpc_common/proto/enum_cron_on_run_completed_pb2.py +0 -0
  260. {langgraph_api-0.15.0.dev5 → langgraph_api-0.16.0.dev1}/langgraph_grpc_common/proto/enum_cron_on_run_completed_pb2.pyi +0 -0
  261. {langgraph_api-0.15.0.dev5 → langgraph_api-0.16.0.dev1}/langgraph_grpc_common/proto/enum_cron_on_run_completed_pb2_grpc.py +0 -0
  262. {langgraph_api-0.15.0.dev5 → langgraph_api-0.16.0.dev1}/langgraph_grpc_common/proto/enum_cron_on_run_completed_pb2_grpc.pyi +0 -0
  263. {langgraph_api-0.15.0.dev5 → langgraph_api-0.16.0.dev1}/langgraph_grpc_common/proto/enum_durability_pb2.py +0 -0
  264. {langgraph_api-0.15.0.dev5 → langgraph_api-0.16.0.dev1}/langgraph_grpc_common/proto/enum_durability_pb2.pyi +0 -0
  265. {langgraph_api-0.15.0.dev5 → langgraph_api-0.16.0.dev1}/langgraph_grpc_common/proto/enum_durability_pb2_grpc.py +0 -0
  266. {langgraph_api-0.15.0.dev5 → langgraph_api-0.16.0.dev1}/langgraph_grpc_common/proto/enum_durability_pb2_grpc.pyi +0 -0
  267. {langgraph_api-0.15.0.dev5 → langgraph_api-0.16.0.dev1}/langgraph_grpc_common/proto/enum_multitask_strategy_pb2.py +0 -0
  268. {langgraph_api-0.15.0.dev5 → langgraph_api-0.16.0.dev1}/langgraph_grpc_common/proto/enum_multitask_strategy_pb2.pyi +0 -0
  269. {langgraph_api-0.15.0.dev5 → langgraph_api-0.16.0.dev1}/langgraph_grpc_common/proto/enum_multitask_strategy_pb2_grpc.py +0 -0
  270. {langgraph_api-0.15.0.dev5 → langgraph_api-0.16.0.dev1}/langgraph_grpc_common/proto/enum_multitask_strategy_pb2_grpc.pyi +0 -0
  271. {langgraph_api-0.15.0.dev5 → langgraph_api-0.16.0.dev1}/langgraph_grpc_common/proto/enum_run_status_pb2.py +0 -0
  272. {langgraph_api-0.15.0.dev5 → langgraph_api-0.16.0.dev1}/langgraph_grpc_common/proto/enum_run_status_pb2.pyi +0 -0
  273. {langgraph_api-0.15.0.dev5 → langgraph_api-0.16.0.dev1}/langgraph_grpc_common/proto/enum_run_status_pb2_grpc.py +0 -0
  274. {langgraph_api-0.15.0.dev5 → langgraph_api-0.16.0.dev1}/langgraph_grpc_common/proto/enum_run_status_pb2_grpc.pyi +0 -0
  275. {langgraph_api-0.15.0.dev5 → langgraph_api-0.16.0.dev1}/langgraph_grpc_common/proto/enum_stream_mode_pb2.py +0 -0
  276. {langgraph_api-0.15.0.dev5 → langgraph_api-0.16.0.dev1}/langgraph_grpc_common/proto/enum_stream_mode_pb2.pyi +0 -0
  277. {langgraph_api-0.15.0.dev5 → langgraph_api-0.16.0.dev1}/langgraph_grpc_common/proto/enum_stream_mode_pb2_grpc.py +0 -0
  278. {langgraph_api-0.15.0.dev5 → langgraph_api-0.16.0.dev1}/langgraph_grpc_common/proto/enum_stream_mode_pb2_grpc.pyi +0 -0
  279. {langgraph_api-0.15.0.dev5 → langgraph_api-0.16.0.dev1}/langgraph_grpc_common/proto/enum_thread_status_pb2.py +0 -0
  280. {langgraph_api-0.15.0.dev5 → langgraph_api-0.16.0.dev1}/langgraph_grpc_common/proto/enum_thread_status_pb2.pyi +0 -0
  281. {langgraph_api-0.15.0.dev5 → langgraph_api-0.16.0.dev1}/langgraph_grpc_common/proto/enum_thread_status_pb2_grpc.py +0 -0
  282. {langgraph_api-0.15.0.dev5 → langgraph_api-0.16.0.dev1}/langgraph_grpc_common/proto/enum_thread_status_pb2_grpc.pyi +0 -0
  283. {langgraph_api-0.15.0.dev5 → langgraph_api-0.16.0.dev1}/langgraph_grpc_common/proto/enum_thread_stream_mode_pb2.py +0 -0
  284. {langgraph_api-0.15.0.dev5 → langgraph_api-0.16.0.dev1}/langgraph_grpc_common/proto/enum_thread_stream_mode_pb2.pyi +0 -0
  285. {langgraph_api-0.15.0.dev5 → langgraph_api-0.16.0.dev1}/langgraph_grpc_common/proto/enum_thread_stream_mode_pb2_grpc.py +0 -0
  286. {langgraph_api-0.15.0.dev5 → langgraph_api-0.16.0.dev1}/langgraph_grpc_common/proto/enum_thread_stream_mode_pb2_grpc.pyi +0 -0
  287. {langgraph_api-0.15.0.dev5 → langgraph_api-0.16.0.dev1}/langgraph_grpc_common/proto/errors_pb2.py +0 -0
  288. {langgraph_api-0.15.0.dev5 → langgraph_api-0.16.0.dev1}/langgraph_grpc_common/proto/errors_pb2.pyi +0 -0
  289. {langgraph_api-0.15.0.dev5 → langgraph_api-0.16.0.dev1}/langgraph_grpc_common/proto/errors_pb2_grpc.py +0 -0
  290. {langgraph_api-0.15.0.dev5 → langgraph_api-0.16.0.dev1}/langgraph_grpc_common/proto/errors_pb2_grpc.pyi +0 -0
  291. {langgraph_api-0.15.0.dev5 → langgraph_api-0.16.0.dev1}/langgraph_grpc_common/proto/store_pb2.py +0 -0
  292. {langgraph_api-0.15.0.dev5 → langgraph_api-0.16.0.dev1}/langgraph_grpc_common/proto/store_pb2.pyi +0 -0
  293. {langgraph_api-0.15.0.dev5 → langgraph_api-0.16.0.dev1}/langgraph_grpc_common/proto/store_pb2_grpc.py +0 -0
  294. {langgraph_api-0.15.0.dev5 → langgraph_api-0.16.0.dev1}/langgraph_grpc_common/proto/store_pb2_grpc.pyi +0 -0
  295. {langgraph_api-0.15.0.dev5 → langgraph_api-0.16.0.dev1}/langgraph_grpc_common/serde.py +0 -0
  296. {langgraph_api-0.15.0.dev5 → langgraph_api-0.16.0.dev1}/langgraph_grpc_common/store.py +0 -0
  297. {langgraph_api-0.15.0.dev5 → langgraph_api-0.16.0.dev1}/langgraph_license/__init__.py +0 -0
  298. {langgraph_api-0.15.0.dev5 → langgraph_api-0.16.0.dev1}/langgraph_license/validation.py +0 -0
  299. {langgraph_api-0.15.0.dev5 → langgraph_api-0.16.0.dev1}/langgraph_runtime/__init__.py +0 -0
  300. {langgraph_api-0.15.0.dev5 → langgraph_api-0.16.0.dev1}/langgraph_runtime/checkpoint.py +0 -0
  301. {langgraph_api-0.15.0.dev5 → langgraph_api-0.16.0.dev1}/langgraph_runtime/database.py +0 -0
  302. {langgraph_api-0.15.0.dev5 → langgraph_api-0.16.0.dev1}/langgraph_runtime/lifespan.py +0 -0
  303. {langgraph_api-0.15.0.dev5 → langgraph_api-0.16.0.dev1}/langgraph_runtime/metrics.py +0 -0
  304. {langgraph_api-0.15.0.dev5 → langgraph_api-0.16.0.dev1}/langgraph_runtime/ops.py +0 -0
  305. {langgraph_api-0.15.0.dev5 → langgraph_api-0.16.0.dev1}/langgraph_runtime/queue.py +0 -0
  306. {langgraph_api-0.15.0.dev5 → langgraph_api-0.16.0.dev1}/langgraph_runtime/retry.py +0 -0
  307. {langgraph_api-0.15.0.dev5 → langgraph_api-0.16.0.dev1}/langgraph_runtime/routes.py +0 -0
  308. {langgraph_api-0.15.0.dev5 → langgraph_api-0.16.0.dev1}/langgraph_runtime/store.py +0 -0
  309. {langgraph_api-0.15.0.dev5 → langgraph_api-0.16.0.dev1}/logging.json +0 -0
  310. {langgraph_api-0.15.0.dev5 → langgraph_api-0.16.0.dev1}/openapi.json +0 -0
  311. {langgraph_api-0.15.0.dev5 → langgraph_api-0.16.0.dev1}/scripts/build_wheel.py +0 -0
  312. {langgraph_api-0.15.0.dev5 → langgraph_api-0.16.0.dev1}/scripts/create_license.py +0 -0
  313. {langgraph_api-0.15.0.dev5 → langgraph_api-0.16.0.dev1}/scripts/run_a2a_tck.py +0 -0
  314. {langgraph_api-0.15.0.dev5 → langgraph_api-0.16.0.dev1}/uv.lock +0 -0
@@ -3,5 +3,6 @@
3
3
  .env
4
4
  .ipynb_checkpoints
5
5
  .langgraph-data
6
+ .langgraph-build.json
6
7
  *.sock
7
8
  langgraph_api.duckdb*
@@ -1,8 +1,6 @@
1
1
  .PHONY: build release lint format test test_watch start start-inmem start-inmem-license-oss start build-go-server start-go-server stop-go-server check-version check-base-imports test-a2a-tck test-a2a-tck-must test-a2a-tck-propose-baseline start-test-a2a-tck start-test-a2a-tck-must start-test-a2a-tck-watch test-mcp-conformance start-test-mcp-conformance list-mcp-scenarios test-auth-read-only-assistant
2
2
 
3
- # Environment variables
4
- LANGSERVE_GRAPHS_ALL = '{"agent": {"path": "./tests/graphs/agent.py:graph", "description": "agent"}, "assistant_id_runtime": "./tests/graphs/assistant_id_runtime.py:graph", "custom_lifespan": "./tests/graphs/my_router.py:graph", "single_node": "./tests/graphs/single_node.py:graph", "benchmark": "./tests/graphs/benchmark.py:graph", "benchmark_delta": "./tests/graphs/benchmark.py:graph_delta", "benchmark_delta_freq": "./tests/graphs/benchmark.py:graph_delta_freq", "config_graph": "./tests/graphs/config_graph.py:graph", "other": "./tests/graphs/other.py:make_graph", "weather": "./tests/graphs/weather.py:mk_weather_graph", "searchy": "./tests/graphs/searchy.py:graph", "agent_simple": "./tests/graphs/agent_simple.py:graph", "simple_runtime": "./tests/graphs/simple_runtime.py:graph", "agent_interrupt": "./tests/graphs/agent_interrupt.py:graph", "agent_parallel_interrupt": "./tests/graphs/agent_parallel_interrupt.py:graph", "message_type_test": "./tests/graphs/message_type_test.py:graph", "remote_subgraph_parent": "./tests/graphs/remote_subgraph_parent.py:graph", "simple_remote": "./tests/graphs/simple_remote.py:graph", "nested_subgraphs": "./tests/graphs/nested_subgraphs.py:graph", "functional_fibonacci": "./tests/graphs/functional_fibonacci.py:fibonacci", "state_graph_fibonacci": "./tests/graphs/state_graph_fibonacci.py:fibonacci", "max_concurrency_graph": "./tests/graphs/max_concurrency_graph.py:graph", "unserializable_subgraph": "./tests/graphs/unserializable_subgraph.py:graph", "agent_interrupt_text": "./tests/graphs/agent_interrupt_text.py:graph", "agent_echo_stream": "./tests/graphs/agent_echo_stream.py:graph", "agent_tool_stream": "./tests/graphs/agent_tool_stream.py:graph", "runtime_graph": "./tests/graphs/runtime_graph.py:graph", "tool_call_chunk_stream": "./tests/graphs/tool_call_chunk_stream.py:graph", "ui_tool_call_stream": "./tests/graphs/ui_tool_call_stream.py:graph", "agent_metrics_stream": "./tests/graphs/agent_metrics_stream.py:graph", "agent_multimodal_stream": "./tests/graphs/agent_multimodal_stream.py:graph", "agent_bedtime_story": "./tests/graphs/agent_bedtime_story.py:graph", "delta_channel": "./tests/graphs/delta_channel.py:graph", "delta_channel_freq": "./tests/graphs/delta_channel_freq.py:graph", "delta_channel_files": "./tests/graphs/delta_channel_files.py:graph", "delta_channel_files_freq": "./tests/graphs/delta_channel_files_freq.py:graph", "delta_channel_legacy": "./tests/graphs/delta_channel_migration.py:graph_legacy", "delta_channel_delta": "./tests/graphs/delta_channel_migration.py:graph_delta", "delta_channel_delta_filter": "./tests/graphs/delta_channel_migration.py:graph_delta_filter", "delta_channel_messages_freq": "./tests/graphs/delta_channel_messages.py:graph_freq", "delta_channel_messages": "./tests/graphs/delta_channel_messages.py:graph", "delta_channel_messages_legacy": "./tests/graphs/delta_channel_messages.py:graph_legacy", "delta_channel_messages_remove": "./tests/graphs/delta_channel_messages.py:graph_remove", "delta_channel_messages_update": "./tests/graphs/delta_channel_messages.py:graph_update", "delta_channel_messages_delta": "./tests/graphs/delta_channel_messages.py:graph_delta", "store_e2e_async": "./tests/graphs/store_e2e.py:graph_async", "store_e2e_sync": "./tests/graphs/store_e2e.py:graph_sync"}'
5
- LANGSERVE_GRAPHS_AUTH = '{"agent": {"path": "./tests/graphs/agent.py:graph", "description": "agent"}, "assistant_id_runtime": "./tests/graphs/assistant_id_runtime.py:graph", "config_graph": "./tests/graphs/config_graph.py:graph", "other": "./tests/graphs/other.py:make_graph", "weather": "./tests/graphs/weather.py:mk_weather_graph", "searchy": "./tests/graphs/searchy.py:graph", "agent_simple": "./tests/graphs/agent_simple.py:graph", "simple_runtime": "./tests/graphs/simple_runtime.py:graph", "agent_parallel_interrupt": "./tests/graphs/agent_parallel_interrupt.py:graph", "functional_fibonacci": "./tests/graphs/functional_fibonacci.py:fibonacci", "state_graph_fibonacci": "./tests/graphs/state_graph_fibonacci.py:fibonacci", "runtime_graph": "./tests/graphs/runtime_graph.py:graph"}'
3
+ LANGSERVE_GRAPHS_ALL := '$(shell uv run python tests/graphs/configure_langgraph.py --path-prefix ./tests/graphs --emit langserve-env)'
6
4
 
7
5
  # Go server management
8
6
  build-go-server:
@@ -238,7 +236,7 @@ start-auth-jwt:
238
236
  LANGGRAPH_RUNTIME_EDITION=inmem LANGGRAPH_HTTP='$(HTTP_CONFIG)' \
239
237
  LANGGRAPH_AES_KEY='$(LANGGRAPH_AES_KEY)' \
240
238
  N_JOBS_PER_WORKER=10 \
241
- LANGSERVE_GRAPHS=$(LANGSERVE_GRAPHS_AUTH) \
239
+ LANGSERVE_GRAPHS=$(LANGSERVE_GRAPHS_ALL) \
242
240
  LANGGRAPH_STORE='$(STORE_CONFIG)' \
243
241
  LANGGRAPH_CHECKPOINTER='$(CHECKPOINTER_CONFIG)' \
244
242
  LANGGRAPH_AUTH='$(LANGGRAPH_AUTH)' \
@@ -255,7 +253,7 @@ start-auth-jwt:
255
253
  start-auth-fastapi-jwt:
256
254
  LANGGRAPH_RUNTIME_EDITION=inmem LANGGRAPH_HTTP='$(HTTP_CONFIG)' \
257
255
  N_JOBS_PER_WORKER=10 \
258
- LANGSERVE_GRAPHS=$(LANGSERVE_GRAPHS_AUTH) \
256
+ LANGSERVE_GRAPHS=$(LANGSERVE_GRAPHS_ALL) \
259
257
  LANGGRAPH_STORE='$(STORE_CONFIG)' \
260
258
  LANGGRAPH_CHECKPOINTER='$(CHECKPOINTER_CONFIG)' \
261
259
  LANGGRAPH_AUTH='{"path": "./tests/graphs/fastapi_jwt_auth.py:auth"}' \
@@ -280,7 +278,7 @@ define RUN_FASTAPI_JWT_MW_ORDERING
280
278
  LANGGRAPH_RUNTIME_EDITION=inmem \
281
279
  LANGGRAPH_HTTP='{"app": "./tests/graphs/fastapi_jwt_middleware_ordering.py:app", "middleware_order": "$(1)", "enable_custom_route_auth": $(2)}' \
282
280
  N_JOBS_PER_WORKER=10 \
283
- LANGSERVE_GRAPHS=$(LANGSERVE_GRAPHS_AUTH) \
281
+ LANGSERVE_GRAPHS=$(LANGSERVE_GRAPHS_ALL) \
284
282
  LANGGRAPH_STORE='$(STORE_CONFIG)' \
285
283
  LANGGRAPH_CHECKPOINTER='$(CHECKPOINTER_CONFIG)' \
286
284
  LANGGRAPH_AUTH='{"path": "./tests/graphs/fastapi_jwt_middleware_ordering.py:auth"}' \
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: langgraph-api
3
- Version: 0.15.0.dev5
3
+ Version: 0.16.0.dev1
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
@@ -16,7 +16,7 @@ Requires-Dist: jsonschema-rs<0.45,>=0.20.0
16
16
  Requires-Dist: langchain-core>=0.3.64
17
17
  Requires-Dist: langchain-protocol<0.1,>=0.0.18
18
18
  Requires-Dist: langgraph-checkpoint<5,>=3.0.1
19
- Requires-Dist: langgraph-runtime-inmem<0.36.0.dev0,>=0.35.0.dev0
19
+ Requires-Dist: langgraph-runtime-inmem<0.37.0.dev0,>=0.36.0.dev0
20
20
  Requires-Dist: langgraph-sdk>=0.4.4
21
21
  Requires-Dist: langgraph<2,>=0.4.10
22
22
  Requires-Dist: langsmith[otel]>=0.6.3
@@ -0,0 +1,115 @@
1
+ import assert from "node:assert/strict";
2
+ import { mkdtemp, readFile, rm } from "node:fs/promises";
3
+ import { createRequire } from "node:module";
4
+ import { tmpdir } from "node:os";
5
+ import path from "node:path";
6
+ import { Readable } from "node:stream";
7
+ import test from "node:test";
8
+
9
+ // Check the copy NestJS actually loads, including nested dependency installs.
10
+ const require = createRequire(import.meta.url);
11
+ const nestRequire = createRequire(
12
+ require.resolve("@nestjs/platform-express/package.json"),
13
+ );
14
+ const multer = nestRequire("multer");
15
+
16
+ function upload(middleware, fields = [{ name: "file", content: "benchmark" }]) {
17
+ const boundary = "benchmark-multer-test";
18
+ const body = Buffer.from(
19
+ fields
20
+ .map(
21
+ ({ name, content }) =>
22
+ `--${boundary}\r\nContent-Disposition: form-data; name="${name}"; filename="result.txt"\r\nContent-Type: text/plain\r\n\r\n${content}\r\n`,
23
+ )
24
+ .join("") + `--${boundary}--\r\n`,
25
+ );
26
+ const req = Readable.from([body]);
27
+ req.headers = {
28
+ "content-type": `multipart/form-data; boundary=${boundary}`,
29
+ "content-length": String(body.length),
30
+ };
31
+ return new Promise((resolve, reject) => {
32
+ middleware(req, {}, (error) => (error ? reject(error) : resolve(req)));
33
+ });
34
+ }
35
+
36
+ test("NestJS resolves patched Multer 2.x", () => {
37
+ const [major, minor] = nestRequire("multer/package.json")
38
+ .version.split(".")
39
+ .map(Number);
40
+ assert.equal(major, 2);
41
+ assert.ok(
42
+ minor >= 3,
43
+ "Multer must be >=2.3.0 to address the benchmark alerts",
44
+ );
45
+ });
46
+
47
+ test("single uploads preserve memory storage and fileFilter callbacks", async () => {
48
+ let filtered = false;
49
+ const req = await upload(
50
+ multer({
51
+ limits: { fileSize: 1024, files: 1, fields: 1 },
52
+ fileFilter: (_req, file, done) => {
53
+ filtered = true;
54
+ assert.equal(file.originalname, "result.txt");
55
+ done(null, true);
56
+ },
57
+ }).single("file"),
58
+ );
59
+ assert.ok(filtered);
60
+ assert.equal(req.file.buffer.toString(), "benchmark");
61
+ });
62
+
63
+ for (const mode of ["array", "fields", "any"]) {
64
+ test(`${mode} uploads preserve the API used by NestJS interceptors`, async () => {
65
+ const parser = multer({ limits: { fileSize: 1024, files: 1 } });
66
+ const middleware =
67
+ mode === "array"
68
+ ? parser.array("file", 1)
69
+ : mode === "fields"
70
+ ? parser.fields([{ name: "file", maxCount: 1 }])
71
+ : parser.any();
72
+ const req = await upload(middleware);
73
+ const files = mode === "fields" ? req.files.file : req.files;
74
+ assert.equal(files.length, 1);
75
+ assert.equal(files[0].buffer.toString(), "benchmark");
76
+ });
77
+ }
78
+
79
+ test("disk storage preserves uploaded file contents", async () => {
80
+ const directory = await mkdtemp(path.join(tmpdir(), "benchmark-multer-"));
81
+ try {
82
+ const req = await upload(
83
+ multer({ dest: directory, limits: { fileSize: 1024 } }).single("file"),
84
+ );
85
+ assert.equal(await readFile(req.file.path, "utf8"), "benchmark");
86
+ } finally {
87
+ await rm(directory, { recursive: true, force: true });
88
+ }
89
+ });
90
+
91
+ test("oversized files still return a MulterError", async () => {
92
+ await assert.rejects(
93
+ upload(multer({ limits: { fileSize: 2 } }).single("file")),
94
+ (error) =>
95
+ error instanceof multer.MulterError && error.code === "LIMIT_FILE_SIZE",
96
+ );
97
+ });
98
+
99
+ test("unexpected fields still return a MulterError", async () => {
100
+ await assert.rejects(
101
+ upload(multer().single("expected")),
102
+ (error) =>
103
+ error instanceof multer.MulterError &&
104
+ error.code === "LIMIT_UNEXPECTED_FILE",
105
+ );
106
+ });
107
+
108
+ test("fileFilter rejection does not retain a file", async () => {
109
+ const req = await upload(
110
+ multer({ fileFilter: (_req, _file, done) => done(null, false) }).single(
111
+ "file",
112
+ ),
113
+ );
114
+ assert.equal(req.file, undefined);
115
+ });
@@ -17,7 +17,13 @@
17
17
  "@types/k6": "^2.0.0",
18
18
  "typescript": "^5.9.3"
19
19
  },
20
+ "overrides": {
21
+ "multer": "^2.3.0",
22
+ "qs": ">=6.16.0"
23
+ },
20
24
  "resolutions": {
25
+ "multer": "^2.3.0",
26
+ "qs": ">=6.16.0",
21
27
  "socket.io-parser": ">=4.2.7"
22
28
  },
23
29
  "engines": {
@@ -108,7 +108,7 @@ buffer-from@^1.0.0:
108
108
  resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.2.tgz#2b146a6fd72e80b4f55d255f35ed59a3a9a41bd5"
109
109
  integrity sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==
110
110
 
111
- busboy@^1.0.0:
111
+ busboy@^1.6.0:
112
112
  version "1.6.0"
113
113
  resolved "https://registry.yarnpkg.com/busboy/-/busboy-1.6.0.tgz#966ea36a9502e43cdb9146962523b92f531f6893"
114
114
  integrity sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA==
@@ -136,14 +136,14 @@ call-bound@^1.0.2:
136
136
  call-bind-apply-helpers "^1.0.2"
137
137
  get-intrinsic "^1.3.0"
138
138
 
139
- concat-stream@^1.5.2:
140
- version "1.6.2"
141
- resolved "https://registry.yarnpkg.com/concat-stream/-/concat-stream-1.6.2.tgz#904bdf194cd3122fc675c77fc4ac3d4ff0fd1a34"
142
- integrity sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==
139
+ concat-stream@^2.0.0:
140
+ version "2.0.0"
141
+ resolved "https://registry.yarnpkg.com/concat-stream/-/concat-stream-2.0.0.tgz#414cf5af790a48c60ab9be4527d56d5e41133cb1"
142
+ integrity sha512-MWufYdFw53ccGjCA+Ol7XJYpAlW6/prSMzuPOTRnJGcGzuhLn4Scrz7qf6o8bROZ514ltazcIFJZevcfbo0x7A==
143
143
  dependencies:
144
144
  buffer-from "^1.0.0"
145
145
  inherits "^2.0.3"
146
- readable-stream "^2.2.2"
146
+ readable-stream "^3.0.2"
147
147
  typedarray "^0.0.6"
148
148
 
149
149
  content-disposition@0.5.4:
@@ -173,11 +173,6 @@ cookie@~0.4.1:
173
173
  resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.4.2.tgz#0e41f24de5ecf317947c82fc789e06a884824432"
174
174
  integrity sha512-aSWTXFzaKWkvHO1Ny/s+ePFpvKsPnjc551iI41v3ny/ow6tBG5Vd+FuqGNhh1LxOmVzOlGUriIlOaokOvhaStA==
175
175
 
176
- core-util-is@~1.0.0:
177
- version "1.0.3"
178
- resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.3.tgz#a6042d3634c2b27e9328f837b965fac83808db85"
179
- integrity sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==
180
-
181
176
  cors@2.8.5:
182
177
  version "2.8.5"
183
178
  resolved "https://registry.yarnpkg.com/cors/-/cors-2.8.5.tgz#eac11da51592dd86b9f06f6e7ac293b3df875d29"
@@ -416,7 +411,7 @@ iconv-lite@0.4.24:
416
411
  dependencies:
417
412
  safer-buffer ">= 2.1.2 < 3"
418
413
 
419
- inherits@2.0.4, inherits@^2.0.3, inherits@~2.0.3:
414
+ inherits@2.0.4, inherits@^2.0.3:
420
415
  version "2.0.4"
421
416
  resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c"
422
417
  integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==
@@ -426,11 +421,6 @@ ipaddr.js@1.9.1:
426
421
  resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-1.9.1.tgz#bff38543eeb8984825079ff3a2a8e6cbd46781b3"
427
422
  integrity sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==
428
423
 
429
- isarray@~1.0.0:
430
- version "1.0.0"
431
- resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11"
432
- integrity sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==
433
-
434
424
  javascript-stringify@^2.1.0:
435
425
  version "2.1.0"
436
426
  resolved "https://registry.yarnpkg.com/javascript-stringify/-/javascript-stringify-2.1.0.tgz#27c76539be14d8bd128219a2d731b09337904e79"
@@ -473,18 +463,6 @@ mime@1.6.0:
473
463
  resolved "https://registry.yarnpkg.com/mime/-/mime-1.6.0.tgz#32cd9e5c64553bd58d19a568af452acff04981b1"
474
464
  integrity sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==
475
465
 
476
- minimist@^1.2.6:
477
- version "1.2.8"
478
- resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.8.tgz#c1a464e7693302e082a075cee0c057741ac4772c"
479
- integrity sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==
480
-
481
- mkdirp@^0.5.4:
482
- version "0.5.6"
483
- resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.6.tgz#7def03d2432dcae4ba1d611445c48396062255f6"
484
- integrity sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==
485
- dependencies:
486
- minimist "^1.2.6"
487
-
488
466
  ms@2.0.0:
489
467
  version "2.0.0"
490
468
  resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8"
@@ -495,18 +473,15 @@ ms@2.1.3, ms@^2.1.3:
495
473
  resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2"
496
474
  integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==
497
475
 
498
- multer@1.4.4-lts.1:
499
- version "1.4.4-lts.1"
500
- resolved "https://registry.yarnpkg.com/multer/-/multer-1.4.4-lts.1.tgz#24100f701a4611211cfae94ae16ea39bb314e04d"
501
- integrity sha512-WeSGziVj6+Z2/MwQo3GvqzgR+9Uc+qt8SwHKh3gvNPiISKfsMfG4SvCOFYlxxgkXt7yIV2i1yczehm0EOKIxIg==
476
+ multer@1.4.4-lts.1, multer@^2.3.0:
477
+ version "2.3.0"
478
+ resolved "https://registry.yarnpkg.com/multer/-/multer-2.3.0.tgz#46f5a98c34e09661ff089fa49ae487846bd5b4fd"
479
+ integrity sha512-cjNbm3sttszgZeGfJR124D+jFEfkXCVAsoPBmFn9X7UxmDSFHWqE2CoEj0vrmSpuAFnqWR1Szcm9QTsiHr60Xw==
502
480
  dependencies:
503
481
  append-field "^1.0.0"
504
- busboy "^1.0.0"
505
- concat-stream "^1.5.2"
506
- mkdirp "^0.5.4"
507
- object-assign "^4.1.1"
508
- type-is "^1.6.4"
509
- xtend "^4.0.0"
482
+ busboy "^1.6.0"
483
+ concat-stream "^2.0.0"
484
+ type-is "^1.6.18"
510
485
 
511
486
  negotiator@0.6.3:
512
487
  version "0.6.3"
@@ -522,7 +497,7 @@ nodeplotlib@^1.0.4:
522
497
  "@nestjs/platform-socket.io" "^8.2.3"
523
498
  "@types/plotly.js" "^1.54.17"
524
499
 
525
- object-assign@^4, object-assign@^4.1.1:
500
+ object-assign@^4:
526
501
  version "4.1.1"
527
502
  resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863"
528
503
  integrity sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==
@@ -549,11 +524,6 @@ path-to-regexp@0.1.7:
549
524
  resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-0.1.7.tgz#df604178005f522f15eb4490e7247a1bfaa67f8c"
550
525
  integrity sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==
551
526
 
552
- process-nextick-args@~2.0.0:
553
- version "2.0.1"
554
- resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.1.tgz#7820d9b16120cc55ca9ae7792680ae7dba6d7fe2"
555
- integrity sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==
556
-
557
527
  proxy-addr@~2.0.7:
558
528
  version "2.0.7"
559
529
  resolved "https://registry.yarnpkg.com/proxy-addr/-/proxy-addr-2.0.7.tgz#f19fe69ceab311eeb94b42e70e8c2070f9ba1025"
@@ -562,12 +532,13 @@ proxy-addr@~2.0.7:
562
532
  forwarded "0.2.0"
563
533
  ipaddr.js "1.9.1"
564
534
 
565
- qs@6.10.3:
566
- version "6.10.3"
567
- resolved "https://registry.yarnpkg.com/qs/-/qs-6.10.3.tgz#d6cde1b2ffca87b5aa57889816c5f81535e22e8e"
568
- integrity sha512-wr7M2E0OFRfIfJZjKGieI8lBKb7fRCH4Fv5KNPEs7gJ8jadvotdsS08PzOKR7opXhZ/Xkjtt3WF9g38drmyRqQ==
535
+ qs@6.10.3, qs@>=6.16.0:
536
+ version "6.16.0"
537
+ resolved "https://registry.yarnpkg.com/qs/-/qs-6.16.0.tgz#c22c723a28a920f3aacdce8289fabd43eccb79fd"
538
+ integrity sha512-h6fhOIaRrID2CbEY2fqs+7t+UXZo+MLAnU5gRIq85uFtdiUPCdsApMlHhXogKVM4HM2DVbIjGNTTYH2OcmP1vA==
569
539
  dependencies:
570
- side-channel "^1.0.4"
540
+ es-define-property "^1.0.1"
541
+ side-channel "^1.1.1"
571
542
 
572
543
  quickchart-js@^4.0.0:
573
544
  version "4.0.0"
@@ -591,29 +562,20 @@ raw-body@2.5.1:
591
562
  iconv-lite "0.4.24"
592
563
  unpipe "1.0.0"
593
564
 
594
- readable-stream@^2.2.2:
595
- version "2.3.8"
596
- resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.8.tgz#91125e8042bba1b9887f49345f6277027ce8be9b"
597
- integrity sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==
565
+ readable-stream@^3.0.2:
566
+ version "3.6.2"
567
+ resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.2.tgz#56a9b36ea965c00c5a93ef31eb111a0f11056967"
568
+ integrity sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==
598
569
  dependencies:
599
- core-util-is "~1.0.0"
600
- inherits "~2.0.3"
601
- isarray "~1.0.0"
602
- process-nextick-args "~2.0.0"
603
- safe-buffer "~5.1.1"
604
- string_decoder "~1.1.1"
605
- util-deprecate "~1.0.1"
570
+ inherits "^2.0.3"
571
+ string_decoder "^1.1.1"
572
+ util-deprecate "^1.0.1"
606
573
 
607
- safe-buffer@5.2.1:
574
+ safe-buffer@5.2.1, safe-buffer@~5.2.0:
608
575
  version "5.2.1"
609
576
  resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6"
610
577
  integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==
611
578
 
612
- safe-buffer@~5.1.0, safe-buffer@~5.1.1:
613
- version "5.1.2"
614
- resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d"
615
- integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==
616
-
617
579
  "safer-buffer@>= 2.1.2 < 3":
618
580
  version "2.1.2"
619
581
  resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a"
@@ -682,7 +644,7 @@ side-channel-weakmap@^1.0.2:
682
644
  object-inspect "^1.13.3"
683
645
  side-channel-map "^1.0.1"
684
646
 
685
- side-channel@^1.0.4:
647
+ side-channel@^1.1.1:
686
648
  version "1.1.1"
687
649
  resolved "https://registry.yarnpkg.com/side-channel/-/side-channel-1.1.1.tgz#ea02c62e05dc4bea67d4442f0fb71ee192f8e0ab"
688
650
  integrity sha512-6x6dK6zJdpTzF4sQeNYxwtvBzf6Eg4GtlesS94HOvTudUeyK2WXAaIfmDgsyslYrRBeFIlsi54AYsFGUuhmvrQ==
@@ -728,12 +690,12 @@ streamsearch@^1.1.0:
728
690
  resolved "https://registry.yarnpkg.com/streamsearch/-/streamsearch-1.1.0.tgz#404dd1e2247ca94af554e841a8ef0eaa238da764"
729
691
  integrity sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg==
730
692
 
731
- string_decoder@~1.1.1:
732
- version "1.1.1"
733
- resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.1.1.tgz#9cf1611ba62685d7030ae9e4ba34149c3af03fc8"
734
- integrity sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==
693
+ string_decoder@^1.1.1:
694
+ version "1.3.0"
695
+ resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.3.0.tgz#42f114594a46cf1a8e30b0a84f56c78c3edac21e"
696
+ integrity sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==
735
697
  dependencies:
736
- safe-buffer "~5.1.0"
698
+ safe-buffer "~5.2.0"
737
699
 
738
700
  toidentifier@1.0.1:
739
701
  version "1.0.1"
@@ -745,7 +707,7 @@ tslib@2.4.0:
745
707
  resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.4.0.tgz#7cecaa7f073ce680a05847aa77be941098f36dc3"
746
708
  integrity sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==
747
709
 
748
- type-is@^1.6.4, type-is@~1.6.18:
710
+ type-is@^1.6.18, type-is@~1.6.18:
749
711
  version "1.6.18"
750
712
  resolved "https://registry.yarnpkg.com/type-is/-/type-is-1.6.18.tgz#4e552cd05df09467dcbc4ef739de89f2cf37c131"
751
713
  integrity sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==
@@ -773,7 +735,7 @@ unpipe@1.0.0, unpipe@~1.0.0:
773
735
  resolved "https://registry.yarnpkg.com/unpipe/-/unpipe-1.0.0.tgz#b2bf4ee8514aae6165b4817829d21b2ef49904ec"
774
736
  integrity sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==
775
737
 
776
- util-deprecate@~1.0.1:
738
+ util-deprecate@^1.0.1:
777
739
  version "1.0.2"
778
740
  resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf"
779
741
  integrity sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==
@@ -792,8 +754,3 @@ ws@~8.2.3:
792
754
  version "8.2.3"
793
755
  resolved "https://registry.yarnpkg.com/ws/-/ws-8.2.3.tgz#63a56456db1b04367d0b721a0b80cae6d8becbba"
794
756
  integrity sha512-wBuoj1BDpC6ZQ1B7DWQBYVLphPWkm8i9Y0/3YdHjHKHiohOJ1ws+3OccDWtH+PoC9DZD5WOTrJvNbWvjS6JWaA==
795
-
796
- xtend@^4.0.0:
797
- version "4.0.2"
798
- resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.2.tgz#bb72779f5fa465186b1f438f674fa347fdb5db54"
799
- integrity sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==
@@ -0,0 +1 @@
1
+ __version__ = "0.16.0.dev1"
@@ -55,6 +55,8 @@ MAX_HISTORY_LENGTH_REQUESTED = 10
55
55
  LANGGRAPH_HISTORY_QUERY_LIMIT = 500
56
56
  HISTORY_SCOPE_EXTENSION_URI = "https://langchain.com/a2a/extensions/history-scope/v1"
57
57
  HISTORY_SCOPE_HEADER = "LangGraph-A2A-History-Scope"
58
+ A2A_EXTENSIONS_HEADER = "A2A-Extensions"
59
+ A2UI_EXTENSIONS_HEADER = "X-A2A-Extensions"
58
60
  HistoryScope = Literal["context", "task"]
59
61
 
60
62
 
@@ -123,6 +125,7 @@ class A2UIContext:
123
125
  metadata: dict[str, Any]
124
126
  extensions: list[str]
125
127
  drop_invalid: bool = False
128
+ mime_type: str = A2UI_MIME_TYPE
126
129
 
127
130
 
128
131
  _A2UI_DISABLED_CONTEXT = A2UIContext(False, False, {}, [])
@@ -170,6 +173,11 @@ def _a2ui_context_for_run(
170
173
  active=a2a_metadata.get("a2ui_active") is True,
171
174
  metadata={},
172
175
  extensions=[],
176
+ mime_type=(
177
+ a2a_metadata["a2ui_mime_type"]
178
+ if is_a2ui_mime_type(a2a_metadata.get("a2ui_mime_type"))
179
+ else A2UI_MIME_TYPE
180
+ ),
173
181
  )
174
182
 
175
183
 
@@ -197,26 +205,46 @@ def _a2a_run_metadata(
197
205
  **({"task_id": task_id} if task_id else {}),
198
206
  **({"task_start_id": task_start_id} if task_start_id else {}),
199
207
  **({"a2ui_active": context.active} if context.enabled else {}),
208
+ **(
209
+ {"a2ui_mime_type": context.mime_type}
210
+ if context.enabled and context.active
211
+ else {}
212
+ ),
200
213
  }
201
214
  }
202
215
 
203
216
 
204
217
  def _a2ui_message_context(
205
- message: dict[str, Any], assistant: dict[str, Any]
218
+ params: dict[str, Any],
219
+ assistant: dict[str, Any],
220
+ headers: Headers,
221
+ *,
222
+ default_mime_type: str = A2UI_MIME_TYPE,
206
223
  ) -> A2UIContext:
224
+ message = params.get("message") or {}
207
225
  metadata = message.get("metadata") or {}
208
- extensions = message.get("extensions") or []
209
- if (
210
- not isinstance(metadata, dict)
211
- or not isinstance(extensions, list)
212
- or not all(isinstance(extension, str) for extension in extensions)
213
- ):
214
- raise A2UIValidationError("Invalid A2A message metadata or extensions")
226
+ if not isinstance(metadata, dict):
227
+ raise A2UIValidationError("Invalid A2A message metadata")
228
+ extensions: list[str] = []
229
+ for header in (A2A_EXTENSIONS_HEADER, A2UI_EXTENSIONS_HEADER):
230
+ for header_value in headers.getlist(header):
231
+ for value in header_value.split(","):
232
+ if (extension := value.strip()) and extension not in extensions:
233
+ extensions.append(extension)
234
+ mime_type = default_mime_type
235
+ for part in message.get("parts") or []:
236
+ part_metadata = part.get("metadata") if isinstance(part, dict) else None
237
+ if isinstance(part_metadata, dict) and is_a2ui_mime_type(
238
+ part_metadata.get("mimeType")
239
+ ):
240
+ mime_type = part_metadata["mimeType"]
241
+ break
215
242
  return A2UIContext(
216
243
  enabled=_a2ui_enabled(assistant),
217
244
  active=A2UI_EXTENSION_URI in extensions,
218
245
  metadata=metadata,
219
246
  extensions=extensions,
247
+ mime_type=mime_type,
220
248
  )
221
249
 
222
250
 
@@ -892,7 +920,9 @@ def _process_a2a_message_parts(
892
920
  {
893
921
  "type": "data",
894
922
  "data": part_data,
895
- "metadata": normalize_metadata(part_metadata),
923
+ "metadata": normalize_metadata(
924
+ part_metadata, mime_type=a2ui.mime_type
925
+ ),
896
926
  }
897
927
  )
898
928
  continue
@@ -1114,7 +1144,7 @@ def _content_to_a2a_parts(
1114
1144
  {
1115
1145
  "kind": "data",
1116
1146
  "data": data,
1117
- "metadata": normalize_metadata(metadata),
1147
+ "metadata": normalize_metadata(metadata, mime_type=a2ui.mime_type),
1118
1148
  }
1119
1149
  )
1120
1150
  elif (
@@ -2095,6 +2125,7 @@ async def handle_message_send(
2095
2125
  task_id = None
2096
2126
  task_start_id = str(uuid7())
2097
2127
  task_ids_by_start_id: dict[str, str] = {}
2128
+ a2ui_mime_type = A2UI_MIME_TYPE
2098
2129
  else:
2099
2130
  task = await _resolve_task(
2100
2131
  client,
@@ -2121,10 +2152,16 @@ async def handle_message_send(
2121
2152
  task_id = task.task_id
2122
2153
  task_start_id = None
2123
2154
  task_ids_by_start_id = task.task_ids_by_start_id
2155
+ a2ui_mime_type = _a2ui_context_for_run(task.run).mime_type
2124
2156
 
2125
2157
  # Process A2A message parts into LangChain messages format
2126
2158
  try:
2127
- a2ui = _a2ui_message_context(message, assistant)
2159
+ a2ui = _a2ui_message_context(
2160
+ params,
2161
+ assistant,
2162
+ request.headers,
2163
+ default_mime_type=a2ui_mime_type,
2164
+ )
2128
2165
  message_role = _normalize_input_role(message.get("role", "ROLE_USER"))
2129
2166
  input_content = _process_a2a_message_parts(
2130
2167
  parts,
@@ -3352,6 +3389,7 @@ async def handle_message_stream(
3352
3389
  context_id = context_id_from_message or str(uuid.uuid4())
3353
3390
  task_id = None
3354
3391
  task_start_id = str(uuid7())
3392
+ a2ui_mime_type = A2UI_MIME_TYPE
3355
3393
  else:
3356
3394
  task = await _resolve_task(
3357
3395
  client,
@@ -3389,10 +3427,16 @@ async def handle_message_stream(
3389
3427
  context_id = task.context_id
3390
3428
  task_id = task.task_id
3391
3429
  task_start_id = None
3430
+ a2ui_mime_type = _a2ui_context_for_run(task.run).mime_type
3392
3431
 
3393
3432
  # Process A2A message parts into LangChain messages format
3394
3433
  try:
3395
- a2ui = _a2ui_message_context(message, assistant)
3434
+ a2ui = _a2ui_message_context(
3435
+ params,
3436
+ assistant,
3437
+ request.headers,
3438
+ default_mime_type=a2ui_mime_type,
3439
+ )
3396
3440
  message_role = _normalize_input_role(message.get("role", "ROLE_USER"))
3397
3441
  input_content = _process_a2a_message_parts(
3398
3442
  parts,
@@ -9,8 +9,8 @@ import jsonschema_rs
9
9
  import orjson
10
10
 
11
11
  A2UI_EXTENSION_URI = "https://a2ui.org/a2a-extension/a2ui/v0.9"
12
- A2UI_MIME_TYPE = "application/a2ui+json"
13
- _COMPAT_A2UI_MIME_TYPE = "application/json+a2ui"
12
+ A2UI_MIME_TYPE = "application/json+a2ui"
13
+ _COMPAT_A2UI_MIME_TYPE = "application/a2ui+json"
14
14
  _SCHEMA_DIR = Path(__file__).with_name("a2ui_schemas")
15
15
 
16
16
 
@@ -52,9 +52,11 @@ def is_a2ui_mime_type(value: Any) -> bool:
52
52
  return value in {A2UI_MIME_TYPE, _COMPAT_A2UI_MIME_TYPE}
53
53
 
54
54
 
55
- def normalize_metadata(metadata: dict[str, Any]) -> dict[str, Any]:
55
+ def normalize_metadata(
56
+ metadata: dict[str, Any], *, mime_type: str = A2UI_MIME_TYPE
57
+ ) -> dict[str, Any]:
56
58
  if is_a2ui_mime_type(metadata.get("mimeType")):
57
- return {**metadata, "mimeType": A2UI_MIME_TYPE}
59
+ return {**metadata, "mimeType": mime_type}
58
60
  return metadata
59
61
 
60
62
 
@@ -70,9 +72,17 @@ def validate_client_metadata(metadata: dict[str, Any]) -> None:
70
72
  raise A2UIValidationError("Invalid A2UI message metadata") from exc
71
73
 
72
74
 
73
- def validate_payload(data: Any, *, direction: Literal["client", "server"]) -> None:
74
- if not isinstance(data, list):
75
- raise A2UIValidationError("A2UI DataPart data must be an array")
75
+ def validate_payload(
76
+ data: Any,
77
+ *,
78
+ direction: Literal["client", "server"],
79
+ ) -> None:
80
+ if isinstance(data, list):
81
+ messages = data
82
+ elif isinstance(data, dict):
83
+ messages = (data,)
84
+ else:
85
+ raise A2UIValidationError("A2UI DataPart data must be an array or object")
76
86
 
77
87
  validator = (
78
88
  _CLIENT_MESSAGE_VALIDATOR
@@ -80,7 +90,7 @@ def validate_payload(data: Any, *, direction: Literal["client", "server"]) -> No
80
90
  else _SERVER_MESSAGE_VALIDATOR
81
91
  )
82
92
  try:
83
- for message in data:
93
+ for message in messages:
84
94
  validator.validate(message)
85
95
  except ValueError as exc:
86
96
  raise A2UIValidationError(f"Invalid A2UI {direction} message") from exc
@@ -287,7 +287,9 @@ async def handle_tools_list(
287
287
  schemas = await client.assistants.get_schemas(
288
288
  assistant["assistant_id"], headers=request.headers
289
289
  )
290
- input_schema = schemas.get("input_schema") or {}
290
+ input_schema = schemas.get("input_schema", {})
291
+ if input_schema is None:
292
+ raise ValueError("Input schema generation failed")
291
293
  if input_schema:
292
294
  _sanitizers.simplify_mcp_schema_inplace(input_schema)
293
295
  # MCP spec requires inputSchema to be a JSON Schema with type "object"