langgraph-api 0.12.0.dev18__tar.gz → 0.12.0.dev22__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 (285) hide show
  1. {langgraph_api-0.12.0.dev18 → langgraph_api-0.12.0.dev22}/PKG-INFO +1 -1
  2. langgraph_api-0.12.0.dev22/langgraph_api/__init__.py +1 -0
  3. {langgraph_api-0.12.0.dev18 → langgraph_api-0.12.0.dev22}/langgraph_api/api/assistants.py +8 -4
  4. {langgraph_api-0.12.0.dev18 → langgraph_api-0.12.0.dev22}/langgraph_api/api/event_streaming.py +27 -23
  5. {langgraph_api-0.12.0.dev18 → langgraph_api-0.12.0.dev22}/langgraph_api/api/runs.py +8 -6
  6. {langgraph_api-0.12.0.dev18 → langgraph_api-0.12.0.dev22}/langgraph_api/api/store.py +10 -4
  7. {langgraph_api-0.12.0.dev18 → langgraph_api-0.12.0.dev22}/langgraph_api/api/threads.py +11 -8
  8. {langgraph_api-0.12.0.dev18 → langgraph_api-0.12.0.dev22}/langgraph_api/api/ui.py +21 -14
  9. {langgraph_api-0.12.0.dev18 → langgraph_api-0.12.0.dev22}/langgraph_api/config/__init__.py +16 -2
  10. {langgraph_api-0.12.0.dev18 → langgraph_api-0.12.0.dev22}/langgraph_api/event_streaming/service.py +11 -5
  11. {langgraph_api-0.12.0.dev18 → langgraph_api-0.12.0.dev22}/langgraph_api/js/client.http.mts +2 -1
  12. {langgraph_api-0.12.0.dev18 → langgraph_api-0.12.0.dev22}/langgraph_api/js/client.mts +3 -2
  13. {langgraph_api-0.12.0.dev18 → langgraph_api-0.12.0.dev22}/langgraph_api/js/remote.py +43 -3
  14. {langgraph_api-0.12.0.dev18 → langgraph_api-0.12.0.dev22}/langgraph_api/metrics_otlp.py +20 -1
  15. {langgraph_api-0.12.0.dev18 → langgraph_api-0.12.0.dev22}/langgraph_api/release_tags.py +10 -0
  16. {langgraph_api-0.12.0.dev18 → langgraph_api-0.12.0.dev22}/langgraph_api/worker.py +9 -4
  17. {langgraph_api-0.12.0.dev18 → langgraph_api-0.12.0.dev22}/uv.lock +1 -1
  18. langgraph_api-0.12.0.dev18/langgraph_api/__init__.py +0 -1
  19. {langgraph_api-0.12.0.dev18 → langgraph_api-0.12.0.dev22}/.gitignore +0 -0
  20. {langgraph_api-0.12.0.dev18 → langgraph_api-0.12.0.dev22}/LICENSE +0 -0
  21. {langgraph_api-0.12.0.dev18 → langgraph_api-0.12.0.dev22}/Makefile +0 -0
  22. {langgraph_api-0.12.0.dev18 → langgraph_api-0.12.0.dev22}/README.md +0 -0
  23. {langgraph_api-0.12.0.dev18 → langgraph_api-0.12.0.dev22}/benchmark/.gitignore +0 -0
  24. {langgraph_api-0.12.0.dev18 → langgraph_api-0.12.0.dev22}/benchmark/Makefile +0 -0
  25. {langgraph_api-0.12.0.dev18 → langgraph_api-0.12.0.dev22}/benchmark/README.md +0 -0
  26. {langgraph_api-0.12.0.dev18 → langgraph_api-0.12.0.dev22}/benchmark/benchmark-runners/assistant.ts +0 -0
  27. {langgraph_api-0.12.0.dev18 → langgraph_api-0.12.0.dev22}/benchmark/benchmark-runners/benchmark-runner.ts +0 -0
  28. {langgraph_api-0.12.0.dev18 → langgraph_api-0.12.0.dev22}/benchmark/benchmark-runners/benchmark_profiles.ts +0 -0
  29. {langgraph_api-0.12.0.dev18 → langgraph_api-0.12.0.dev22}/benchmark/benchmark-runners/benchmarks.ts +0 -0
  30. {langgraph_api-0.12.0.dev18 → langgraph_api-0.12.0.dev22}/benchmark/benchmark-runners/cancel_first_second_completes.ts +0 -0
  31. {langgraph_api-0.12.0.dev18 → langgraph_api-0.12.0.dev22}/benchmark/benchmark-runners/enqueued_runs_order.ts +0 -0
  32. {langgraph_api-0.12.0.dev18 → langgraph_api-0.12.0.dev22}/benchmark/benchmark-runners/log-failure.ts +0 -0
  33. {langgraph_api-0.12.0.dev18 → langgraph_api-0.12.0.dev22}/benchmark/benchmark-runners/meta_workload.ts +0 -0
  34. {langgraph_api-0.12.0.dev18 → langgraph_api-0.12.0.dev22}/benchmark/benchmark-runners/stream_write.ts +0 -0
  35. {langgraph_api-0.12.0.dev18 → langgraph_api-0.12.0.dev22}/benchmark/benchmark-runners/thread.ts +0 -0
  36. {langgraph_api-0.12.0.dev18 → langgraph_api-0.12.0.dev22}/benchmark/benchmark-runners/thread_runs_metadata_search.ts +0 -0
  37. {langgraph_api-0.12.0.dev18 → langgraph_api-0.12.0.dev22}/benchmark/benchmark-runners/threads_search_metadata.ts +0 -0
  38. {langgraph_api-0.12.0.dev18 → langgraph_api-0.12.0.dev22}/benchmark/benchmark-runners/types.ts +0 -0
  39. {langgraph_api-0.12.0.dev18 → langgraph_api-0.12.0.dev22}/benchmark/benchmark-runners/wait_write.ts +0 -0
  40. {langgraph_api-0.12.0.dev18 → langgraph_api-0.12.0.dev22}/benchmark/clean-cli.js +0 -0
  41. {langgraph_api-0.12.0.dev18 → langgraph_api-0.12.0.dev22}/benchmark/clean.js +0 -0
  42. {langgraph_api-0.12.0.dev18 → langgraph_api-0.12.0.dev22}/benchmark/continuous/README.md +0 -0
  43. {langgraph_api-0.12.0.dev18 → langgraph_api-0.12.0.dev22}/benchmark/continuous/pyproject.toml +0 -0
  44. {langgraph_api-0.12.0.dev18 → langgraph_api-0.12.0.dev22}/benchmark/continuous/runner.py +0 -0
  45. {langgraph_api-0.12.0.dev18 → langgraph_api-0.12.0.dev22}/benchmark/continuous/uv.lock +0 -0
  46. {langgraph_api-0.12.0.dev18 → langgraph_api-0.12.0.dev22}/benchmark/graphs.js +0 -0
  47. {langgraph_api-0.12.0.dev18 → langgraph_api-0.12.0.dev22}/benchmark/package.json +0 -0
  48. {langgraph_api-0.12.0.dev18 → langgraph_api-0.12.0.dev22}/benchmark/ramp.js +0 -0
  49. {langgraph_api-0.12.0.dev18 → langgraph_api-0.12.0.dev22}/benchmark/reporting/dd_reporting.py +0 -0
  50. {langgraph_api-0.12.0.dev18 → langgraph_api-0.12.0.dev22}/benchmark/staircase.py +0 -0
  51. {langgraph_api-0.12.0.dev18 → langgraph_api-0.12.0.dev22}/benchmark/staircase_step_k6.js +0 -0
  52. {langgraph_api-0.12.0.dev18 → langgraph_api-0.12.0.dev22}/benchmark/tsconfig.json +0 -0
  53. {langgraph_api-0.12.0.dev18 → langgraph_api-0.12.0.dev22}/benchmark/update-revision.js +0 -0
  54. {langgraph_api-0.12.0.dev18 → langgraph_api-0.12.0.dev22}/benchmark/weather.js +0 -0
  55. {langgraph_api-0.12.0.dev18 → langgraph_api-0.12.0.dev22}/constraints.txt +0 -0
  56. {langgraph_api-0.12.0.dev18 → langgraph_api-0.12.0.dev22}/custom_store.sql +0 -0
  57. {langgraph_api-0.12.0.dev18 → langgraph_api-0.12.0.dev22}/forbidden.txt +0 -0
  58. {langgraph_api-0.12.0.dev18 → langgraph_api-0.12.0.dev22}/hatch_build.py +0 -0
  59. {langgraph_api-0.12.0.dev18 → langgraph_api-0.12.0.dev22}/healthcheck.py +0 -0
  60. {langgraph_api-0.12.0.dev18 → langgraph_api-0.12.0.dev22}/langgraph-cloud-debugging-20260210132856.zip +0 -0
  61. {langgraph_api-0.12.0.dev18 → langgraph_api-0.12.0.dev22}/langgraph_api/_checkpointer/__init__.py +0 -0
  62. {langgraph_api-0.12.0.dev18 → langgraph_api-0.12.0.dev22}/langgraph_api/_checkpointer/_adapter.py +0 -0
  63. {langgraph_api-0.12.0.dev18 → langgraph_api-0.12.0.dev22}/langgraph_api/_checkpointer/protocol.py +0 -0
  64. {langgraph_api-0.12.0.dev18 → langgraph_api-0.12.0.dev22}/langgraph_api/_factory_utils.py +0 -0
  65. {langgraph_api-0.12.0.dev18 → langgraph_api-0.12.0.dev22}/langgraph_api/api/__init__.py +0 -0
  66. {langgraph_api-0.12.0.dev18 → langgraph_api-0.12.0.dev22}/langgraph_api/api/a2a.py +0 -0
  67. {langgraph_api-0.12.0.dev18 → langgraph_api-0.12.0.dev22}/langgraph_api/api/mcp/__init__.py +0 -0
  68. {langgraph_api-0.12.0.dev18 → langgraph_api-0.12.0.dev22}/langgraph_api/api/mcp/_constants.py +0 -0
  69. {langgraph_api-0.12.0.dev18 → langgraph_api-0.12.0.dev22}/langgraph_api/api/mcp/_handlers.py +0 -0
  70. {langgraph_api-0.12.0.dev18 → langgraph_api-0.12.0.dev22}/langgraph_api/api/mcp/_models.py +0 -0
  71. {langgraph_api-0.12.0.dev18 → langgraph_api-0.12.0.dev22}/langgraph_api/api/mcp/_routes.py +0 -0
  72. {langgraph_api-0.12.0.dev18 → langgraph_api-0.12.0.dev22}/langgraph_api/api/mcp/_sanitizers.py +0 -0
  73. {langgraph_api-0.12.0.dev18 → langgraph_api-0.12.0.dev22}/langgraph_api/api/meta.py +0 -0
  74. {langgraph_api-0.12.0.dev18 → langgraph_api-0.12.0.dev22}/langgraph_api/api/openapi.py +0 -0
  75. {langgraph_api-0.12.0.dev18 → langgraph_api-0.12.0.dev22}/langgraph_api/api/profile.py +0 -0
  76. {langgraph_api-0.12.0.dev18 → langgraph_api-0.12.0.dev22}/langgraph_api/asgi_transport.py +0 -0
  77. {langgraph_api-0.12.0.dev18 → langgraph_api-0.12.0.dev22}/langgraph_api/asyncio.py +0 -0
  78. {langgraph_api-0.12.0.dev18 → langgraph_api-0.12.0.dev22}/langgraph_api/auth/__init__.py +0 -0
  79. {langgraph_api-0.12.0.dev18 → langgraph_api-0.12.0.dev22}/langgraph_api/auth/custom.py +0 -0
  80. {langgraph_api-0.12.0.dev18 → langgraph_api-0.12.0.dev22}/langgraph_api/auth/errors.py +0 -0
  81. {langgraph_api-0.12.0.dev18 → langgraph_api-0.12.0.dev22}/langgraph_api/auth/langsmith/__init__.py +0 -0
  82. {langgraph_api-0.12.0.dev18 → langgraph_api-0.12.0.dev22}/langgraph_api/auth/langsmith/backend.py +0 -0
  83. {langgraph_api-0.12.0.dev18 → langgraph_api-0.12.0.dev22}/langgraph_api/auth/langsmith/client.py +0 -0
  84. {langgraph_api-0.12.0.dev18 → langgraph_api-0.12.0.dev22}/langgraph_api/auth/middleware.py +0 -0
  85. {langgraph_api-0.12.0.dev18 → langgraph_api-0.12.0.dev22}/langgraph_api/auth/noop.py +0 -0
  86. {langgraph_api-0.12.0.dev18 → langgraph_api-0.12.0.dev22}/langgraph_api/auth/studio_user.py +0 -0
  87. {langgraph_api-0.12.0.dev18 → langgraph_api-0.12.0.dev22}/langgraph_api/cache.py +0 -0
  88. {langgraph_api-0.12.0.dev18 → langgraph_api-0.12.0.dev22}/langgraph_api/cli.py +0 -0
  89. {langgraph_api-0.12.0.dev18 → langgraph_api-0.12.0.dev22}/langgraph_api/command.py +0 -0
  90. {langgraph_api-0.12.0.dev18 → langgraph_api-0.12.0.dev22}/langgraph_api/config/_parse.py +0 -0
  91. {langgraph_api-0.12.0.dev18 → langgraph_api-0.12.0.dev22}/langgraph_api/config/schemas.py +0 -0
  92. {langgraph_api-0.12.0.dev18 → langgraph_api-0.12.0.dev22}/langgraph_api/cron_scheduler.py +0 -0
  93. {langgraph_api-0.12.0.dev18 → langgraph_api-0.12.0.dev22}/langgraph_api/encryption/__init__.py +0 -0
  94. {langgraph_api-0.12.0.dev18 → langgraph_api-0.12.0.dev22}/langgraph_api/encryption/aes_json.py +0 -0
  95. {langgraph_api-0.12.0.dev18 → langgraph_api-0.12.0.dev22}/langgraph_api/encryption/context.py +0 -0
  96. {langgraph_api-0.12.0.dev18 → langgraph_api-0.12.0.dev22}/langgraph_api/encryption/custom.py +0 -0
  97. {langgraph_api-0.12.0.dev18 → langgraph_api-0.12.0.dev22}/langgraph_api/encryption/middleware.py +0 -0
  98. {langgraph_api-0.12.0.dev18 → langgraph_api-0.12.0.dev22}/langgraph_api/encryption/shared.py +0 -0
  99. {langgraph_api-0.12.0.dev18 → langgraph_api-0.12.0.dev22}/langgraph_api/errors.py +0 -0
  100. {langgraph_api-0.12.0.dev18 → langgraph_api-0.12.0.dev22}/langgraph_api/event_streaming/__init__.py +0 -0
  101. {langgraph_api-0.12.0.dev18 → langgraph_api-0.12.0.dev22}/langgraph_api/event_streaming/capabilities.py +0 -0
  102. {langgraph_api-0.12.0.dev18 → langgraph_api-0.12.0.dev22}/langgraph_api/event_streaming/constants.py +0 -0
  103. {langgraph_api-0.12.0.dev18 → langgraph_api-0.12.0.dev22}/langgraph_api/event_streaming/event_normalizers.py +0 -0
  104. {langgraph_api-0.12.0.dev18 → langgraph_api-0.12.0.dev22}/langgraph_api/event_streaming/namespace.py +0 -0
  105. {langgraph_api-0.12.0.dev18 → langgraph_api-0.12.0.dev22}/langgraph_api/event_streaming/session.py +0 -0
  106. {langgraph_api-0.12.0.dev18 → langgraph_api-0.12.0.dev22}/langgraph_api/event_streaming/state_normalizers.py +0 -0
  107. {langgraph_api-0.12.0.dev18 → langgraph_api-0.12.0.dev22}/langgraph_api/event_streaming/types.py +0 -0
  108. {langgraph_api-0.12.0.dev18 → langgraph_api-0.12.0.dev22}/langgraph_api/feature_flags.py +0 -0
  109. {langgraph_api-0.12.0.dev18 → langgraph_api-0.12.0.dev22}/langgraph_api/graph.py +0 -0
  110. {langgraph_api-0.12.0.dev18 → langgraph_api-0.12.0.dev22}/langgraph_api/grpc/__init__.py +0 -0
  111. {langgraph_api-0.12.0.dev18 → langgraph_api-0.12.0.dev22}/langgraph_api/grpc/client.py +0 -0
  112. {langgraph_api-0.12.0.dev18 → langgraph_api-0.12.0.dev22}/langgraph_api/grpc/generated/core_api_pb2.pyi +0 -0
  113. {langgraph_api-0.12.0.dev18 → langgraph_api-0.12.0.dev22}/langgraph_api/grpc/ops/__init__.py +0 -0
  114. {langgraph_api-0.12.0.dev18 → langgraph_api-0.12.0.dev22}/langgraph_api/grpc/ops/assistants.py +0 -0
  115. {langgraph_api-0.12.0.dev18 → langgraph_api-0.12.0.dev22}/langgraph_api/grpc/ops/cache.py +0 -0
  116. {langgraph_api-0.12.0.dev18 → langgraph_api-0.12.0.dev22}/langgraph_api/grpc/ops/crons.py +0 -0
  117. {langgraph_api-0.12.0.dev18 → langgraph_api-0.12.0.dev22}/langgraph_api/grpc/ops/runs.py +0 -0
  118. {langgraph_api-0.12.0.dev18 → langgraph_api-0.12.0.dev22}/langgraph_api/grpc/ops/threads.py +0 -0
  119. {langgraph_api-0.12.0.dev18 → langgraph_api-0.12.0.dev22}/langgraph_api/grpc/server.py +0 -0
  120. {langgraph_api-0.12.0.dev18 → langgraph_api-0.12.0.dev22}/langgraph_api/grpc/servicers/__init__.py +0 -0
  121. {langgraph_api-0.12.0.dev18 → langgraph_api-0.12.0.dev22}/langgraph_api/grpc/servicers/checkpointer.py +0 -0
  122. {langgraph_api-0.12.0.dev18 → langgraph_api-0.12.0.dev22}/langgraph_api/grpc/servicers/encryption.py +0 -0
  123. {langgraph_api-0.12.0.dev18 → langgraph_api-0.12.0.dev22}/langgraph_api/http.py +0 -0
  124. {langgraph_api-0.12.0.dev18 → langgraph_api-0.12.0.dev22}/langgraph_api/http_metrics.py +0 -0
  125. {langgraph_api-0.12.0.dev18 → langgraph_api-0.12.0.dev22}/langgraph_api/http_metrics_utils.py +0 -0
  126. {langgraph_api-0.12.0.dev18 → langgraph_api-0.12.0.dev22}/langgraph_api/js/.gitignore +0 -0
  127. {langgraph_api-0.12.0.dev18 → langgraph_api-0.12.0.dev22}/langgraph_api/js/.prettierrc +0 -0
  128. {langgraph_api-0.12.0.dev18 → langgraph_api-0.12.0.dev22}/langgraph_api/js/__init__.py +0 -0
  129. {langgraph_api-0.12.0.dev18 → langgraph_api-0.12.0.dev22}/langgraph_api/js/base.py +0 -0
  130. {langgraph_api-0.12.0.dev18 → langgraph_api-0.12.0.dev22}/langgraph_api/js/build.mts +0 -0
  131. {langgraph_api-0.12.0.dev18 → langgraph_api-0.12.0.dev22}/langgraph_api/js/errors.py +0 -0
  132. {langgraph_api-0.12.0.dev18 → langgraph_api-0.12.0.dev22}/langgraph_api/js/global.d.ts +0 -0
  133. {langgraph_api-0.12.0.dev18 → langgraph_api-0.12.0.dev22}/langgraph_api/js/package.json +0 -0
  134. {langgraph_api-0.12.0.dev18 → langgraph_api-0.12.0.dev22}/langgraph_api/js/schema.py +0 -0
  135. {langgraph_api-0.12.0.dev18 → langgraph_api-0.12.0.dev22}/langgraph_api/js/src/graph.mts +0 -0
  136. {langgraph_api-0.12.0.dev18 → langgraph_api-0.12.0.dev22}/langgraph_api/js/src/load.hooks.mjs +0 -0
  137. {langgraph_api-0.12.0.dev18 → langgraph_api-0.12.0.dev22}/langgraph_api/js/src/preload.mjs +0 -0
  138. {langgraph_api-0.12.0.dev18 → langgraph_api-0.12.0.dev22}/langgraph_api/js/src/utils/experiment-tracing.mts +0 -0
  139. {langgraph_api-0.12.0.dev18 → langgraph_api-0.12.0.dev22}/langgraph_api/js/src/utils/files.mts +0 -0
  140. {langgraph_api-0.12.0.dev18 → langgraph_api-0.12.0.dev22}/langgraph_api/js/src/utils/importMap.mts +0 -0
  141. {langgraph_api-0.12.0.dev18 → langgraph_api-0.12.0.dev22}/langgraph_api/js/src/utils/pythonSchemas.mts +0 -0
  142. {langgraph_api-0.12.0.dev18 → langgraph_api-0.12.0.dev22}/langgraph_api/js/src/utils/serde.mts +0 -0
  143. {langgraph_api-0.12.0.dev18 → langgraph_api-0.12.0.dev22}/langgraph_api/js/sse.py +0 -0
  144. {langgraph_api-0.12.0.dev18 → langgraph_api-0.12.0.dev22}/langgraph_api/js/traceblock.mts +0 -0
  145. {langgraph_api-0.12.0.dev18 → langgraph_api-0.12.0.dev22}/langgraph_api/js/tsconfig.json +0 -0
  146. {langgraph_api-0.12.0.dev18 → langgraph_api-0.12.0.dev22}/langgraph_api/js/ui.py +0 -0
  147. {langgraph_api-0.12.0.dev18 → langgraph_api-0.12.0.dev22}/langgraph_api/js/yarn.lock +0 -0
  148. {langgraph_api-0.12.0.dev18 → langgraph_api-0.12.0.dev22}/langgraph_api/lc_security/__init__.py +0 -0
  149. {langgraph_api-0.12.0.dev18 → langgraph_api-0.12.0.dev22}/langgraph_api/lc_security/exceptions.py +0 -0
  150. {langgraph_api-0.12.0.dev18 → langgraph_api-0.12.0.dev22}/langgraph_api/lc_security/policy.py +0 -0
  151. {langgraph_api-0.12.0.dev18 → langgraph_api-0.12.0.dev22}/langgraph_api/lc_security/transport.py +0 -0
  152. {langgraph_api-0.12.0.dev18 → langgraph_api-0.12.0.dev22}/langgraph_api/logging.py +0 -0
  153. {langgraph_api-0.12.0.dev18 → langgraph_api-0.12.0.dev22}/langgraph_api/metadata.py +0 -0
  154. {langgraph_api-0.12.0.dev18 → langgraph_api-0.12.0.dev22}/langgraph_api/metrics_collector.py +0 -0
  155. {langgraph_api-0.12.0.dev18 → langgraph_api-0.12.0.dev22}/langgraph_api/middleware/__init__.py +0 -0
  156. {langgraph_api-0.12.0.dev18 → langgraph_api-0.12.0.dev22}/langgraph_api/middleware/ensure_store.py +0 -0
  157. {langgraph_api-0.12.0.dev18 → langgraph_api-0.12.0.dev22}/langgraph_api/middleware/http_logger.py +0 -0
  158. {langgraph_api-0.12.0.dev18 → langgraph_api-0.12.0.dev22}/langgraph_api/middleware/private_network.py +0 -0
  159. {langgraph_api-0.12.0.dev18 → langgraph_api-0.12.0.dev22}/langgraph_api/middleware/request_id.py +0 -0
  160. {langgraph_api-0.12.0.dev18 → langgraph_api-0.12.0.dev22}/langgraph_api/models/__init__.py +0 -0
  161. {langgraph_api-0.12.0.dev18 → langgraph_api-0.12.0.dev22}/langgraph_api/models/run.py +0 -0
  162. {langgraph_api-0.12.0.dev18 → langgraph_api-0.12.0.dev22}/langgraph_api/otel_context.py +0 -0
  163. {langgraph_api-0.12.0.dev18 → langgraph_api-0.12.0.dev22}/langgraph_api/patch.py +0 -0
  164. {langgraph_api-0.12.0.dev18 → langgraph_api-0.12.0.dev22}/langgraph_api/queue_entrypoint.py +0 -0
  165. {langgraph_api-0.12.0.dev18 → langgraph_api-0.12.0.dev22}/langgraph_api/route.py +0 -0
  166. {langgraph_api-0.12.0.dev18 → langgraph_api-0.12.0.dev22}/langgraph_api/schema.py +0 -0
  167. {langgraph_api-0.12.0.dev18 → langgraph_api-0.12.0.dev22}/langgraph_api/self_hosted_logs.py +0 -0
  168. {langgraph_api-0.12.0.dev18 → langgraph_api-0.12.0.dev22}/langgraph_api/self_hosted_metrics.py +0 -0
  169. {langgraph_api-0.12.0.dev18 → langgraph_api-0.12.0.dev22}/langgraph_api/serde.py +0 -0
  170. {langgraph_api-0.12.0.dev18 → langgraph_api-0.12.0.dev22}/langgraph_api/server.py +0 -0
  171. {langgraph_api-0.12.0.dev18 → langgraph_api-0.12.0.dev22}/langgraph_api/sse.py +0 -0
  172. {langgraph_api-0.12.0.dev18 → langgraph_api-0.12.0.dev22}/langgraph_api/state.py +0 -0
  173. {langgraph_api-0.12.0.dev18 → langgraph_api-0.12.0.dev22}/langgraph_api/store.py +0 -0
  174. {langgraph_api-0.12.0.dev18 → langgraph_api-0.12.0.dev22}/langgraph_api/stream.py +0 -0
  175. {langgraph_api-0.12.0.dev18 → langgraph_api-0.12.0.dev22}/langgraph_api/stream_v2.py +0 -0
  176. {langgraph_api-0.12.0.dev18 → langgraph_api-0.12.0.dev22}/langgraph_api/timing/__init__.py +0 -0
  177. {langgraph_api-0.12.0.dev18 → langgraph_api-0.12.0.dev22}/langgraph_api/timing/profiler.py +0 -0
  178. {langgraph_api-0.12.0.dev18 → langgraph_api-0.12.0.dev22}/langgraph_api/timing/timer.py +0 -0
  179. {langgraph_api-0.12.0.dev18 → langgraph_api-0.12.0.dev22}/langgraph_api/traceblock.py +0 -0
  180. {langgraph_api-0.12.0.dev18 → langgraph_api-0.12.0.dev22}/langgraph_api/tracing_session.py +0 -0
  181. {langgraph_api-0.12.0.dev18 → langgraph_api-0.12.0.dev22}/langgraph_api/tunneling/cloudflare.py +0 -0
  182. {langgraph_api-0.12.0.dev18 → langgraph_api-0.12.0.dev22}/langgraph_api/utils/__init__.py +0 -0
  183. {langgraph_api-0.12.0.dev18 → langgraph_api-0.12.0.dev22}/langgraph_api/utils/cache.py +0 -0
  184. {langgraph_api-0.12.0.dev18 → langgraph_api-0.12.0.dev22}/langgraph_api/utils/config.py +0 -0
  185. {langgraph_api-0.12.0.dev18 → langgraph_api-0.12.0.dev22}/langgraph_api/utils/errors.py +0 -0
  186. {langgraph_api-0.12.0.dev18 → langgraph_api-0.12.0.dev22}/langgraph_api/utils/extract.py +0 -0
  187. {langgraph_api-0.12.0.dev18 → langgraph_api-0.12.0.dev22}/langgraph_api/utils/future.py +0 -0
  188. {langgraph_api-0.12.0.dev18 → langgraph_api-0.12.0.dev22}/langgraph_api/utils/headers.py +0 -0
  189. {langgraph_api-0.12.0.dev18 → langgraph_api-0.12.0.dev22}/langgraph_api/utils/network.py +0 -0
  190. {langgraph_api-0.12.0.dev18 → langgraph_api-0.12.0.dev22}/langgraph_api/utils/retriable_client.py +0 -0
  191. {langgraph_api-0.12.0.dev18 → langgraph_api-0.12.0.dev22}/langgraph_api/utils/stream_codec.py +0 -0
  192. {langgraph_api-0.12.0.dev18 → langgraph_api-0.12.0.dev22}/langgraph_api/utils/uuids.py +0 -0
  193. {langgraph_api-0.12.0.dev18 → langgraph_api-0.12.0.dev22}/langgraph_api/validation.py +0 -0
  194. {langgraph_api-0.12.0.dev18 → langgraph_api-0.12.0.dev22}/langgraph_api/webhook.py +0 -0
  195. {langgraph_api-0.12.0.dev18 → langgraph_api-0.12.0.dev22}/langgraph_grpc_common/__init__.py +0 -0
  196. {langgraph_api-0.12.0.dev18 → langgraph_api-0.12.0.dev22}/langgraph_grpc_common/checkpointer.py +0 -0
  197. {langgraph_api-0.12.0.dev18 → langgraph_api-0.12.0.dev22}/langgraph_grpc_common/conversion/__init__.py +0 -0
  198. {langgraph_api-0.12.0.dev18 → langgraph_api-0.12.0.dev22}/langgraph_grpc_common/conversion/_compat.py +0 -0
  199. {langgraph_api-0.12.0.dev18 → langgraph_api-0.12.0.dev22}/langgraph_grpc_common/conversion/checkpoint.py +0 -0
  200. {langgraph_api-0.12.0.dev18 → langgraph_api-0.12.0.dev22}/langgraph_grpc_common/conversion/config.py +0 -0
  201. {langgraph_api-0.12.0.dev18 → langgraph_api-0.12.0.dev22}/langgraph_grpc_common/conversion/durability.py +0 -0
  202. {langgraph_api-0.12.0.dev18 → langgraph_api-0.12.0.dev22}/langgraph_grpc_common/conversion/store.py +0 -0
  203. {langgraph_api-0.12.0.dev18 → langgraph_api-0.12.0.dev22}/langgraph_grpc_common/conversion/struct.py +0 -0
  204. {langgraph_api-0.12.0.dev18 → langgraph_api-0.12.0.dev22}/langgraph_grpc_common/conversion/value.py +0 -0
  205. {langgraph_api-0.12.0.dev18 → langgraph_api-0.12.0.dev22}/langgraph_grpc_common/proto/__init__.py +0 -0
  206. {langgraph_api-0.12.0.dev18 → langgraph_api-0.12.0.dev22}/langgraph_grpc_common/proto/checkpointer_pb2.py +0 -0
  207. {langgraph_api-0.12.0.dev18 → langgraph_api-0.12.0.dev22}/langgraph_grpc_common/proto/checkpointer_pb2.pyi +0 -0
  208. {langgraph_api-0.12.0.dev18 → langgraph_api-0.12.0.dev22}/langgraph_grpc_common/proto/checkpointer_pb2_grpc.py +0 -0
  209. {langgraph_api-0.12.0.dev18 → langgraph_api-0.12.0.dev22}/langgraph_grpc_common/proto/checkpointer_pb2_grpc.pyi +0 -0
  210. {langgraph_api-0.12.0.dev18 → langgraph_api-0.12.0.dev22}/langgraph_grpc_common/proto/core_api_pb2.py +0 -0
  211. {langgraph_api-0.12.0.dev18 → langgraph_api-0.12.0.dev22}/langgraph_grpc_common/proto/core_api_pb2.pyi +0 -0
  212. {langgraph_api-0.12.0.dev18 → langgraph_api-0.12.0.dev22}/langgraph_grpc_common/proto/core_api_pb2_grpc.py +0 -0
  213. {langgraph_api-0.12.0.dev18 → langgraph_api-0.12.0.dev22}/langgraph_grpc_common/proto/core_api_pb2_grpc.pyi +0 -0
  214. {langgraph_api-0.12.0.dev18 → langgraph_api-0.12.0.dev22}/langgraph_grpc_common/proto/encryption_pb2.py +0 -0
  215. {langgraph_api-0.12.0.dev18 → langgraph_api-0.12.0.dev22}/langgraph_grpc_common/proto/encryption_pb2.pyi +0 -0
  216. {langgraph_api-0.12.0.dev18 → langgraph_api-0.12.0.dev22}/langgraph_grpc_common/proto/encryption_pb2_grpc.py +0 -0
  217. {langgraph_api-0.12.0.dev18 → langgraph_api-0.12.0.dev22}/langgraph_grpc_common/proto/encryption_pb2_grpc.pyi +0 -0
  218. {langgraph_api-0.12.0.dev18 → langgraph_api-0.12.0.dev22}/langgraph_grpc_common/proto/engine_common_pb2.py +0 -0
  219. {langgraph_api-0.12.0.dev18 → langgraph_api-0.12.0.dev22}/langgraph_grpc_common/proto/engine_common_pb2.pyi +0 -0
  220. {langgraph_api-0.12.0.dev18 → langgraph_api-0.12.0.dev22}/langgraph_grpc_common/proto/engine_common_pb2_grpc.py +0 -0
  221. {langgraph_api-0.12.0.dev18 → langgraph_api-0.12.0.dev22}/langgraph_grpc_common/proto/engine_common_pb2_grpc.pyi +0 -0
  222. {langgraph_api-0.12.0.dev18 → langgraph_api-0.12.0.dev22}/langgraph_grpc_common/proto/enum_cancel_run_action_pb2.py +0 -0
  223. {langgraph_api-0.12.0.dev18 → langgraph_api-0.12.0.dev22}/langgraph_grpc_common/proto/enum_cancel_run_action_pb2.pyi +0 -0
  224. {langgraph_api-0.12.0.dev18 → langgraph_api-0.12.0.dev22}/langgraph_grpc_common/proto/enum_cancel_run_action_pb2_grpc.py +0 -0
  225. {langgraph_api-0.12.0.dev18 → langgraph_api-0.12.0.dev22}/langgraph_grpc_common/proto/enum_cancel_run_action_pb2_grpc.pyi +0 -0
  226. {langgraph_api-0.12.0.dev18 → langgraph_api-0.12.0.dev22}/langgraph_grpc_common/proto/enum_control_signal_pb2.py +0 -0
  227. {langgraph_api-0.12.0.dev18 → langgraph_api-0.12.0.dev22}/langgraph_grpc_common/proto/enum_control_signal_pb2.pyi +0 -0
  228. {langgraph_api-0.12.0.dev18 → langgraph_api-0.12.0.dev22}/langgraph_grpc_common/proto/enum_control_signal_pb2_grpc.py +0 -0
  229. {langgraph_api-0.12.0.dev18 → langgraph_api-0.12.0.dev22}/langgraph_grpc_common/proto/enum_control_signal_pb2_grpc.pyi +0 -0
  230. {langgraph_api-0.12.0.dev18 → langgraph_api-0.12.0.dev22}/langgraph_grpc_common/proto/enum_cron_on_run_completed_pb2.py +0 -0
  231. {langgraph_api-0.12.0.dev18 → langgraph_api-0.12.0.dev22}/langgraph_grpc_common/proto/enum_cron_on_run_completed_pb2.pyi +0 -0
  232. {langgraph_api-0.12.0.dev18 → langgraph_api-0.12.0.dev22}/langgraph_grpc_common/proto/enum_cron_on_run_completed_pb2_grpc.py +0 -0
  233. {langgraph_api-0.12.0.dev18 → langgraph_api-0.12.0.dev22}/langgraph_grpc_common/proto/enum_cron_on_run_completed_pb2_grpc.pyi +0 -0
  234. {langgraph_api-0.12.0.dev18 → langgraph_api-0.12.0.dev22}/langgraph_grpc_common/proto/enum_durability_pb2.py +0 -0
  235. {langgraph_api-0.12.0.dev18 → langgraph_api-0.12.0.dev22}/langgraph_grpc_common/proto/enum_durability_pb2.pyi +0 -0
  236. {langgraph_api-0.12.0.dev18 → langgraph_api-0.12.0.dev22}/langgraph_grpc_common/proto/enum_durability_pb2_grpc.py +0 -0
  237. {langgraph_api-0.12.0.dev18 → langgraph_api-0.12.0.dev22}/langgraph_grpc_common/proto/enum_durability_pb2_grpc.pyi +0 -0
  238. {langgraph_api-0.12.0.dev18 → langgraph_api-0.12.0.dev22}/langgraph_grpc_common/proto/enum_multitask_strategy_pb2.py +0 -0
  239. {langgraph_api-0.12.0.dev18 → langgraph_api-0.12.0.dev22}/langgraph_grpc_common/proto/enum_multitask_strategy_pb2.pyi +0 -0
  240. {langgraph_api-0.12.0.dev18 → langgraph_api-0.12.0.dev22}/langgraph_grpc_common/proto/enum_multitask_strategy_pb2_grpc.py +0 -0
  241. {langgraph_api-0.12.0.dev18 → langgraph_api-0.12.0.dev22}/langgraph_grpc_common/proto/enum_multitask_strategy_pb2_grpc.pyi +0 -0
  242. {langgraph_api-0.12.0.dev18 → langgraph_api-0.12.0.dev22}/langgraph_grpc_common/proto/enum_run_status_pb2.py +0 -0
  243. {langgraph_api-0.12.0.dev18 → langgraph_api-0.12.0.dev22}/langgraph_grpc_common/proto/enum_run_status_pb2.pyi +0 -0
  244. {langgraph_api-0.12.0.dev18 → langgraph_api-0.12.0.dev22}/langgraph_grpc_common/proto/enum_run_status_pb2_grpc.py +0 -0
  245. {langgraph_api-0.12.0.dev18 → langgraph_api-0.12.0.dev22}/langgraph_grpc_common/proto/enum_run_status_pb2_grpc.pyi +0 -0
  246. {langgraph_api-0.12.0.dev18 → langgraph_api-0.12.0.dev22}/langgraph_grpc_common/proto/enum_stream_mode_pb2.py +0 -0
  247. {langgraph_api-0.12.0.dev18 → langgraph_api-0.12.0.dev22}/langgraph_grpc_common/proto/enum_stream_mode_pb2.pyi +0 -0
  248. {langgraph_api-0.12.0.dev18 → langgraph_api-0.12.0.dev22}/langgraph_grpc_common/proto/enum_stream_mode_pb2_grpc.py +0 -0
  249. {langgraph_api-0.12.0.dev18 → langgraph_api-0.12.0.dev22}/langgraph_grpc_common/proto/enum_stream_mode_pb2_grpc.pyi +0 -0
  250. {langgraph_api-0.12.0.dev18 → langgraph_api-0.12.0.dev22}/langgraph_grpc_common/proto/enum_thread_status_pb2.py +0 -0
  251. {langgraph_api-0.12.0.dev18 → langgraph_api-0.12.0.dev22}/langgraph_grpc_common/proto/enum_thread_status_pb2.pyi +0 -0
  252. {langgraph_api-0.12.0.dev18 → langgraph_api-0.12.0.dev22}/langgraph_grpc_common/proto/enum_thread_status_pb2_grpc.py +0 -0
  253. {langgraph_api-0.12.0.dev18 → langgraph_api-0.12.0.dev22}/langgraph_grpc_common/proto/enum_thread_status_pb2_grpc.pyi +0 -0
  254. {langgraph_api-0.12.0.dev18 → langgraph_api-0.12.0.dev22}/langgraph_grpc_common/proto/enum_thread_stream_mode_pb2.py +0 -0
  255. {langgraph_api-0.12.0.dev18 → langgraph_api-0.12.0.dev22}/langgraph_grpc_common/proto/enum_thread_stream_mode_pb2.pyi +0 -0
  256. {langgraph_api-0.12.0.dev18 → langgraph_api-0.12.0.dev22}/langgraph_grpc_common/proto/enum_thread_stream_mode_pb2_grpc.py +0 -0
  257. {langgraph_api-0.12.0.dev18 → langgraph_api-0.12.0.dev22}/langgraph_grpc_common/proto/enum_thread_stream_mode_pb2_grpc.pyi +0 -0
  258. {langgraph_api-0.12.0.dev18 → langgraph_api-0.12.0.dev22}/langgraph_grpc_common/proto/errors_pb2.py +0 -0
  259. {langgraph_api-0.12.0.dev18 → langgraph_api-0.12.0.dev22}/langgraph_grpc_common/proto/errors_pb2.pyi +0 -0
  260. {langgraph_api-0.12.0.dev18 → langgraph_api-0.12.0.dev22}/langgraph_grpc_common/proto/errors_pb2_grpc.py +0 -0
  261. {langgraph_api-0.12.0.dev18 → langgraph_api-0.12.0.dev22}/langgraph_grpc_common/proto/errors_pb2_grpc.pyi +0 -0
  262. {langgraph_api-0.12.0.dev18 → langgraph_api-0.12.0.dev22}/langgraph_grpc_common/proto/store_pb2.py +0 -0
  263. {langgraph_api-0.12.0.dev18 → langgraph_api-0.12.0.dev22}/langgraph_grpc_common/proto/store_pb2.pyi +0 -0
  264. {langgraph_api-0.12.0.dev18 → langgraph_api-0.12.0.dev22}/langgraph_grpc_common/proto/store_pb2_grpc.py +0 -0
  265. {langgraph_api-0.12.0.dev18 → langgraph_api-0.12.0.dev22}/langgraph_grpc_common/proto/store_pb2_grpc.pyi +0 -0
  266. {langgraph_api-0.12.0.dev18 → langgraph_api-0.12.0.dev22}/langgraph_grpc_common/serde.py +0 -0
  267. {langgraph_api-0.12.0.dev18 → langgraph_api-0.12.0.dev22}/langgraph_grpc_common/store.py +0 -0
  268. {langgraph_api-0.12.0.dev18 → langgraph_api-0.12.0.dev22}/langgraph_license/__init__.py +0 -0
  269. {langgraph_api-0.12.0.dev18 → langgraph_api-0.12.0.dev22}/langgraph_license/validation.py +0 -0
  270. {langgraph_api-0.12.0.dev18 → langgraph_api-0.12.0.dev22}/langgraph_runtime/__init__.py +0 -0
  271. {langgraph_api-0.12.0.dev18 → langgraph_api-0.12.0.dev22}/langgraph_runtime/checkpoint.py +0 -0
  272. {langgraph_api-0.12.0.dev18 → langgraph_api-0.12.0.dev22}/langgraph_runtime/database.py +0 -0
  273. {langgraph_api-0.12.0.dev18 → langgraph_api-0.12.0.dev22}/langgraph_runtime/lifespan.py +0 -0
  274. {langgraph_api-0.12.0.dev18 → langgraph_api-0.12.0.dev22}/langgraph_runtime/metrics.py +0 -0
  275. {langgraph_api-0.12.0.dev18 → langgraph_api-0.12.0.dev22}/langgraph_runtime/ops.py +0 -0
  276. {langgraph_api-0.12.0.dev18 → langgraph_api-0.12.0.dev22}/langgraph_runtime/queue.py +0 -0
  277. {langgraph_api-0.12.0.dev18 → langgraph_api-0.12.0.dev22}/langgraph_runtime/retry.py +0 -0
  278. {langgraph_api-0.12.0.dev18 → langgraph_api-0.12.0.dev22}/langgraph_runtime/routes.py +0 -0
  279. {langgraph_api-0.12.0.dev18 → langgraph_api-0.12.0.dev22}/langgraph_runtime/store.py +0 -0
  280. {langgraph_api-0.12.0.dev18 → langgraph_api-0.12.0.dev22}/logging.json +0 -0
  281. {langgraph_api-0.12.0.dev18 → langgraph_api-0.12.0.dev22}/openapi.json +0 -0
  282. {langgraph_api-0.12.0.dev18 → langgraph_api-0.12.0.dev22}/pyproject.toml +0 -0
  283. {langgraph_api-0.12.0.dev18 → langgraph_api-0.12.0.dev22}/scripts/build_wheel.py +0 -0
  284. {langgraph_api-0.12.0.dev18 → langgraph_api-0.12.0.dev22}/scripts/create_license.py +0 -0
  285. {langgraph_api-0.12.0.dev18 → langgraph_api-0.12.0.dev22}/scripts/run_a2a_tck.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: langgraph-api
3
- Version: 0.12.0.dev18
3
+ Version: 0.12.0.dev22
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
@@ -0,0 +1 @@
1
+ __version__ = "0.12.0.dev22"
@@ -497,10 +497,14 @@ async def patch_assistant(
497
497
  @retry_db
498
498
  async def delete_assistant(request: ApiRequest) -> Response:
499
499
  """Delete an assistant by ID.
500
-
501
- Query params:
502
- delete_threads: If "true", delete all threads where
503
- metadata.assistant_id matches this assistant.
500
+ ---
501
+ summary: Delete an assistant by ID.
502
+ description: |
503
+ Delete an assistant by ID.
504
+
505
+ Query params:
506
+ delete_threads: If "true", delete all threads where
507
+ metadata.assistant_id matches this assistant.
504
508
  """
505
509
  assistant_id = request.path_params["assistant_id"]
506
510
  validate_uuid(assistant_id, "Invalid assistant ID: must be a UUID")
@@ -97,25 +97,27 @@ def _make_manager(thread_id: str, send_event: Any = None) -> ThreadRunManager:
97
97
 
98
98
  async def _thread_events(request: Request) -> Response:
99
99
  """SSE stream scoped to a thread.
100
+ ---
101
+ summary: SSE stream scoped to a thread.
102
+ description: |
103
+ Body is an ``EventStreamRequest``:
100
104
 
101
- Body is an ``EventStreamRequest``:
102
-
103
- {
104
- "channels": ["values", "messages", ...],
105
- "namespaces": [["ns1"], ["ns2", "child"]], // optional
106
- "depth": 2, // optional
107
- "since": 42 // optional seq
108
- }
109
-
110
- On reconnect, clients pass the last ``seq`` they received as
111
- ``since`` in the body. Buffered events with ``seq > since`` are
112
- replayed before the stream goes live. The endpoint is POST-only, so
113
- browser-native ``EventSource`` auto-resume (``Last-Event-ID``)
114
- doesn't apply clients drive resume explicitly via the body.
115
-
116
- The filter applies for the lifetime of the connection; closing the
117
- connection unsubscribes. No state is persisted server-side beyond the
118
- connection.
105
+ {
106
+ "channels": ["values", "messages", ...],
107
+ "namespaces": [["ns1"], ["ns2", "child"]], // optional
108
+ "depth": 2, // optional
109
+ "since": 42 // optional seq
110
+ }
111
+
112
+ On reconnect, clients pass the last ``seq`` they received as
113
+ ``since`` in the body. Buffered events with ``seq > since`` are
114
+ replayed before the stream goes live. The endpoint is POST-only, so
115
+ browser-native ``EventSource`` auto-resume (``Last-Event-ID``)
116
+ doesn't apply clients drive resume explicitly via the body.
117
+
118
+ The filter applies for the lifetime of the connection; closing the
119
+ connection unsubscribes. No state is persisted server-side beyond the
120
+ connection.
119
121
  """
120
122
  thread_id = request.path_params["thread_id"]
121
123
  try:
@@ -297,11 +299,13 @@ async def _thread_events(request: Request) -> Response:
297
299
 
298
300
  async def _thread_command(request: Request) -> Response:
299
301
  """Handle a single protocol command scoped to a thread.
300
-
301
- Commands are stateless in the HTTP transport: a fresh manager is
302
- created, the command is dispatched, and results are returned. For
303
- ``run.start`` this creates/resumes a run; subsequent event streaming
304
- happens over a separate ``POST .../stream`` connection.
302
+ ---
303
+ summary: Handle a single protocol command scoped to a thread.
304
+ description: |
305
+ Commands are stateless in the HTTP transport: a fresh manager is
306
+ created, the command is dispatched, and results are returned. For
307
+ ``run.start`` this creates/resumes a run; subsequent event streaming
308
+ happens over a separate ``POST .../stream`` connection.
305
309
  """
306
310
  thread_id = request.path_params["thread_id"]
307
311
  try:
@@ -787,7 +787,9 @@ async def create_cron(request: ApiRequest):
787
787
 
788
788
  enabled = payload.get("enabled", True)
789
789
 
790
- async with connect(supports_core_api=False) as conn:
790
+ # gRPC/postgres Crons route through core-api and ignore ``conn`` (the default
791
+ # ``connect()`` yields None there); inmem uses the yielded connection.
792
+ async with connect() as conn:
791
793
  cron = await Crons.put(
792
794
  conn,
793
795
  thread_id=None,
@@ -834,7 +836,7 @@ async def create_thread_cron(request: ApiRequest):
834
836
  CRON_PAYLOAD_ENCRYPTION_SUBFIELDS,
835
837
  )
836
838
 
837
- async with connect(supports_core_api=False) as conn:
839
+ async with connect() as conn:
838
840
  cron = await Crons.put(
839
841
  conn,
840
842
  thread_id=thread_id,
@@ -890,7 +892,7 @@ async def patch_cron(request: ApiRequest):
890
892
  CRON_PAYLOAD_ENCRYPTION_SUBFIELDS,
891
893
  )
892
894
 
893
- async with connect(supports_core_api=False) as conn:
895
+ async with connect() as conn:
894
896
  cron = await Crons.update(
895
897
  conn,
896
898
  cron_id=cron_id,
@@ -917,7 +919,7 @@ async def delete_cron(request: ApiRequest):
917
919
  validate_uuid(cron_id, "Invalid cron ID: must be a UUID")
918
920
 
919
921
  try:
920
- async with connect(supports_core_api=False) as conn:
922
+ async with connect() as conn:
921
923
  cid = await Crons.delete(
922
924
  conn,
923
925
  cron_id=cron_id,
@@ -940,7 +942,7 @@ async def search_crons(request: ApiRequest):
940
942
  validate_uuid(thread_id, "Invalid thread ID: must be a UUID")
941
943
 
942
944
  offset = int(payload.get("offset", 0))
943
- async with connect(supports_core_api=False) as conn:
945
+ async with connect() as conn:
944
946
  crons_iter, next_offset = await Crons.search(
945
947
  conn,
946
948
  assistant_id=assistant_id,
@@ -972,7 +974,7 @@ async def count_crons(request: ApiRequest):
972
974
  if thread_id := payload.get("thread_id"):
973
975
  validate_uuid(thread_id, "Invalid thread ID: must be a UUID")
974
976
 
975
- async with connect(supports_core_api=False) as conn:
977
+ async with connect() as conn:
976
978
  count = await Crons.count(
977
979
  conn,
978
980
  assistant_id=assistant_id,
@@ -35,11 +35,11 @@ def _validate_namespace(namespace: tuple[str, ...]) -> Response | None:
35
35
  async def handle_event(
36
36
  action: str,
37
37
  value: Any,
38
- ) -> None:
38
+ ) -> Auth.types.FilterType | None:
39
39
  ctx = get_auth_ctx()
40
40
  if not ctx:
41
- return
42
- await _handle_event(
41
+ return None
42
+ return await _handle_event(
43
43
  Auth.types.AuthContext(
44
44
  user=ctx.user,
45
45
  permissions=ctx.permissions,
@@ -143,7 +143,13 @@ async def search_items(request: ApiRequest):
143
143
  "query": query,
144
144
  "refresh_ttl": payload.get("refresh_ttl"),
145
145
  }
146
- await handle_event("search", handler_payload)
146
+ auth_filter = await handle_event("search", handler_payload)
147
+ if auth_filter:
148
+ existing = handler_payload.get("filter")
149
+ if existing:
150
+ handler_payload["filter"] = {"$and": [existing, auth_filter]}
151
+ else:
152
+ handler_payload["filter"] = auth_filter
147
153
  items = await (await get_store()).asearch(
148
154
  handler_payload["namespace"],
149
155
  filter=handler_payload["filter"],
@@ -13,7 +13,10 @@ from langgraph_api.encryption.shared import (
13
13
  using_aes_encryption,
14
14
  using_custom_encryption,
15
15
  )
16
- from langgraph_api.feature_flags import IS_POSTGRES_OR_GRPC_BACKEND
16
+ from langgraph_api.feature_flags import (
17
+ IS_POSTGRES_OR_GRPC_BACKEND,
18
+ PREFER_GRPC_CHECKPOINTER,
19
+ )
17
20
  from langgraph_api.route import ApiRequest, ApiResponse, ApiRoute
18
21
  from langgraph_api.schema import (
19
22
  THREAD_ENCRYPTION_FIELDS,
@@ -82,7 +85,7 @@ async def create_thread(
82
85
  )
83
86
  else:
84
87
  # Need connection for inmem put or gRPC State.bulk
85
- async with connect(supports_core_api=False) as conn:
88
+ async with connect(supports_core_api=PREFER_GRPC_CHECKPOINTER) as conn:
86
89
  iter = await Threads.put(
87
90
  conn,
88
91
  thread_id,
@@ -226,7 +229,7 @@ async def get_thread_state(
226
229
  thread_id = request.path_params["thread_id"]
227
230
  validate_uuid(thread_id, "Invalid thread ID: must be a UUID")
228
231
  subgraphs = request.query_params.get("subgraphs") in ("true", "True")
229
- async with connect(supports_core_api=False) as conn:
232
+ async with connect(supports_core_api=PREFER_GRPC_CHECKPOINTER) as conn:
230
233
  config = {
231
234
  "configurable": {
232
235
  **get_configurable_headers(request.headers),
@@ -247,7 +250,7 @@ async def get_thread_state_at_checkpoint(
247
250
  thread_id = request.path_params["thread_id"]
248
251
  validate_uuid(thread_id, "Invalid thread ID: must be a UUID")
249
252
  checkpoint_id = request.path_params["checkpoint_id"]
250
- async with connect(supports_core_api=False) as conn:
253
+ async with connect(supports_core_api=PREFER_GRPC_CHECKPOINTER) as conn:
251
254
  config = {
252
255
  "configurable": {
253
256
  **get_configurable_headers(request.headers),
@@ -273,7 +276,7 @@ async def get_thread_state_at_checkpoint_post(
273
276
  thread_id = request.path_params["thread_id"]
274
277
  validate_uuid(thread_id, "Invalid thread ID: must be a UUID")
275
278
  payload = await request.json(ThreadStateCheckpointRequest)
276
- async with connect(supports_core_api=False) as conn:
279
+ async with connect(supports_core_api=PREFER_GRPC_CHECKPOINTER) as conn:
277
280
  config = {
278
281
  "configurable": {
279
282
  **payload["checkpoint"],
@@ -311,7 +314,7 @@ async def update_thread_state(
311
314
  pass
312
315
  config["configurable"].update(get_configurable_headers(request.headers))
313
316
  config["configurable"]["thread_id"] = thread_id
314
- async with connect(supports_core_api=False) as conn:
317
+ async with connect(supports_core_api=PREFER_GRPC_CHECKPOINTER) as conn:
315
318
  inserted = await Threads.State.post(
316
319
  conn,
317
320
  config,
@@ -341,7 +344,7 @@ async def get_thread_history(
341
344
  **get_configurable_headers(request.headers),
342
345
  }
343
346
  }
344
- async with connect(supports_core_api=False) as conn:
347
+ async with connect(supports_core_api=PREFER_GRPC_CHECKPOINTER) as conn:
345
348
  states = [
346
349
  state_snapshot_to_thread_state(c)
347
350
  for c in await Threads.State.list(
@@ -363,7 +366,7 @@ async def get_thread_history_post(
363
366
  config["configurable"].update(payload.get("checkpoint", {}))
364
367
  config["configurable"].update(get_configurable_headers(request.headers))
365
368
  config["configurable"]["thread_id"] = thread_id
366
- async with connect(supports_core_api=False) as conn:
369
+ async with connect(supports_core_api=PREFER_GRPC_CHECKPOINTER) as conn:
367
370
  states = [
368
371
  state_snapshot_to_thread_state(c)
369
372
  for c in await Threads.State.list(
@@ -1,6 +1,8 @@
1
+ import html
1
2
  import json
2
3
  import os
3
4
  import re
5
+ from urllib.parse import quote
4
6
 
5
7
  from anyio import open_file
6
8
  from orjson import loads
@@ -21,6 +23,16 @@ class UiSchema(TypedDict):
21
23
  _UI_SCHEMAS_CACHE: dict[str, UiSchema] | None = None
22
24
 
23
25
 
26
+ def _quote_path_segment(value: str) -> str:
27
+ """Encode a dynamic URL path segment for safe HTML attribute use."""
28
+ return quote(value, safe="")
29
+
30
+
31
+ def _html_safe_json_arg(value: object) -> str:
32
+ """Serialize a value for a JavaScript argument inside an HTML attribute."""
33
+ return html.escape(json.dumps(value), quote=True)
34
+
35
+
24
36
  async def load_ui_schemas() -> dict[str, UiSchema]:
25
37
  """Load and cache UI schema mappings from JSON file."""
26
38
  global _UI_SCHEMAS_CACHE
@@ -40,7 +52,6 @@ async def load_ui_schemas() -> dict[str, UiSchema]:
40
52
  async def handle_ui(request: ApiRequest) -> Response:
41
53
  """Serve UI HTML with appropriate script/style tags."""
42
54
  graph_id = request.path_params["graph_id"]
43
- host = request.headers.get("host")
44
55
  message = await request.json(schema=None)
45
56
 
46
57
  # Load UI file paths from schema
@@ -54,24 +65,20 @@ async def handle_ui(request: ApiRequest) -> Response:
54
65
  basename = os.path.basename(filepath)
55
66
  ext = os.path.splitext(basename)[1]
56
67
 
57
- # Use http:// protocol if accessing a localhost service
58
- def is_host(needle: str) -> bool:
59
- if not isinstance(host, str):
60
- return False
61
- return host.startswith(needle + ":") or host == needle
62
-
63
- protocol = "http:" if is_host("localhost") or is_host("127.0.0.1") else ""
64
68
  valid_js_name = re.sub(r"[^a-zA-Z0-9]", "_", graph_id)
69
+ asset_url = (
70
+ f"/ui/{_quote_path_segment(graph_id)}/{_quote_path_segment(basename)}"
71
+ )
72
+ safe_asset_url = html.escape(asset_url, quote=True)
65
73
 
66
74
  if ext == ".css":
67
- result.append(
68
- f'<link rel="stylesheet" href="{protocol}//{host}/ui/{graph_id}/{basename}" />'
69
- )
75
+ result.append(f'<link rel="stylesheet" href="{safe_asset_url}" />')
70
76
  elif ext == ".js":
71
- safe_name = json.dumps(message["name"]).replace("'", "&#39;")
77
+ safe_name = _html_safe_json_arg(message["name"])
72
78
  result.append(
73
- f'<script src="{protocol}//{host}/ui/{graph_id}/{basename}" '
74
- f"onload='__LGUI_{valid_js_name}.render({safe_name}, \"{{{{shadowRootId}}}}\")'>"
79
+ f'<script src="{safe_asset_url}" '
80
+ f"onload='__LGUI_{valid_js_name}.render("
81
+ f'{safe_name}, "{{{{shadowRootId}}}}")\'>'
75
82
  "</script>"
76
83
  )
77
84
 
@@ -4,7 +4,7 @@ from typing import TYPE_CHECKING, Annotated, Literal, TypeVar, cast
4
4
 
5
5
  import structlog
6
6
  from pydantic.functional_validators import AfterValidator
7
- from starlette.config import Config, undefined
7
+ from starlette.config import Config
8
8
  from starlette.datastructures import CommaSeparatedStrings
9
9
 
10
10
  from langgraph_api import traceblock
@@ -41,7 +41,15 @@ STATS_INTERVAL_SECS = env("STATS_INTERVAL_SECS", cast=int, default=60)
41
41
  # storage
42
42
 
43
43
  # Not in public docs: infrastructure, set by platform
44
- DATABASE_URI = env("DATABASE_URI", cast=str, default=getenv("POSTGRES_URI", undefined))
44
+ # Optional: persistence can go through the Go core over gRPC, so the Python
45
+ # runtime can start without a direct DB connection string. When unset, the
46
+ # Postgres runtime skips creating a psycopg pool (see database._startup_needs /
47
+ # database.start_pool). Callers that still require a direct connection fail
48
+ # loudly via connect()'s "Postgres pool not initialized" guard.
49
+ DATABASE_URI: str | None = env(
50
+ "DATABASE_URI", cast=str, default=getenv("POSTGRES_URI", None)
51
+ )
52
+ POSTGRES_IAM_AUTH_PROVIDER = env("POSTGRES_IAM_AUTH_PROVIDER", cast=str, default="")
45
53
  # Not in public docs: infrastructure, set by platform
46
54
  MIGRATIONS_PATH = env("MIGRATIONS_PATH", cast=str, default="/storage/migrations")
47
55
  POSTGRES_POOL_MAX_SIZE = env("LANGGRAPH_POSTGRES_POOL_MAX_SIZE", cast=int, default=150)
@@ -148,6 +156,7 @@ LANGGRAPH_AES_JSON_KEYS: frozenset[str] | None = env(
148
156
  # Not in public docs: infrastructure, set by platform
149
157
  REDIS_URI = env("REDIS_URI_CUSTOM", cast=str, default="") or env("REDIS_URI", cast=str)
150
158
  REDIS_CLUSTER = env("REDIS_CLUSTER", cast=bool, default=False)
159
+ REDIS_IAM_AUTH_PROVIDER = env("REDIS_IAM_AUTH_PROVIDER", cast=str, default="")
151
160
  REDIS_MAX_CONNECTIONS = env("REDIS_MAX_CONNECTIONS", cast=int, default=2000)
152
161
  REDIS_CONNECT_TIMEOUT = env("REDIS_CONNECT_TIMEOUT", cast=float, default=10.0)
153
162
  REDIS_HEALTH_CHECK_INTERVAL = env(
@@ -246,6 +255,10 @@ STORE_CONFIG = env(
246
255
  LANGGRAPH_STORE_BACKEND = env("LANGGRAPH_STORE_BACKEND", cast=str, default="python")
247
256
  USE_GRPC_STORE = LANGGRAPH_STORE_BACKEND == "grpc"
248
257
 
258
+ # When true, the Go core-server owns Postgres schema setup (DB migrations +
259
+ # vector index)
260
+ DB_MIGRATION_BY_CORE_API = env("DB_MIGRATION_BY_CORE_API", cast=bool, default=False)
261
+
249
262
 
250
263
  def _validate_mount_prefix(mount_prefix: str | None) -> str | None:
251
264
  if not mount_prefix:
@@ -642,6 +655,7 @@ __all__ = [
642
655
  "CRON_SCHEDULER_SLEEP_TIME",
643
656
  "DATABASE_URI",
644
657
  "DATADOG_METRICS_ENABLED",
658
+ "DB_MIGRATION_BY_CORE_API",
645
659
  "EXPOSE_INTERNAL_METRICS_PROMETHEUS",
646
660
  "FF_CRONS_ENABLED",
647
661
  "FF_LOG_DROPPED_EVENTS",
@@ -43,7 +43,7 @@ from langgraph_api.event_streaming.session import (
43
43
  _is_supported_channel,
44
44
  )
45
45
  from langgraph_api.event_streaming.types import Subscription
46
- from langgraph_api.feature_flags import FF_V2_EVENT_STREAMING
46
+ from langgraph_api.feature_flags import FF_V2_EVENT_STREAMING, PREFER_GRPC_CHECKPOINTER
47
47
  from langgraph_api.schema import MultitaskStrategy
48
48
 
49
49
  logger = structlog.stdlib.get_logger(__name__)
@@ -623,6 +623,12 @@ class ThreadRunManager:
623
623
  "no_such_interrupt",
624
624
  "Interrupt namespace does not match the pending interrupt.",
625
625
  )
626
+ # WS can surface ``input.requested`` before postgres/gRPC
627
+ # persists the thread-row interrupt. Reuse the HTTP settle
628
+ # barrier before enqueueing the resume run.
629
+ if not thread_state_fetched:
630
+ thread_state_ids = await self._collect_settled_interrupt_ids()
631
+ thread_state_fetched = True
626
632
  continue
627
633
  # HTTP fallback: the persisted lookup surfaces interrupts by id
628
634
  # only, so trust the client-claimed namespace and validate by
@@ -962,11 +968,11 @@ class ThreadRunManager:
962
968
  async def get_thread_state() -> dict[str, Any] | None:
963
969
  from langgraph_runtime.database import connect # noqa: PLC0415
964
970
 
965
- # ``supports_core_api=False`` so the postgres backend yields a
966
- # real connection. ``State.get`` uses the local checkpointer
967
- # and needs a usable ``conn`` the default flag yields None.
971
+ # When ``PREFER_GRPC_CHECKPOINTER`` is false the postgres backend
972
+ # yields a real connection for the Python checkpointer; when true
973
+ # it yields a no-op stand-in and checkpoint I/O goes through gRPC.
968
974
  try:
969
- async with connect(supports_core_api=False) as conn:
975
+ async with connect(supports_core_api=PREFER_GRPC_CHECKPOINTER) as conn:
970
976
  return await self._threads.State.get(
971
977
  conn,
972
978
  {"configurable": {"thread_id": thread_id}},
@@ -40,7 +40,8 @@ const logger = createLogger({
40
40
  ],
41
41
  });
42
42
 
43
- const HTTP_PORT = 5557;
43
+ // Pinned by the Python parent (see remote.py); base port is the fallback.
44
+ const HTTP_PORT = Number(process.env.LANGGRAPH_JS_GRAPH_HTTP_PORT) || 5557;
44
45
 
45
46
  const wrapHonoApp = (app: Hono) => {
46
47
  // We do this to avoid importing Hono from server dependencies
@@ -221,8 +221,9 @@ async function getOrExtractSchema(graphId: string) {
221
221
  return GRAPH_SCHEMA[graphId];
222
222
  }
223
223
 
224
- const GRAPH_PORT = 5556;
225
- const REMOTE_PORT = 5555;
224
+ // Pinned by the Python parent (see remote.py); base ports are the fallback.
225
+ const GRAPH_PORT = Number(process.env.LANGGRAPH_JS_GRAPH_PORT) || 5556;
226
+ const REMOTE_PORT = Number(process.env.LANGGRAPH_JS_REMOTE_PORT) || 5555;
226
227
 
227
228
  const RunnableConfigSchema = z.object({
228
229
  tags: z.array(z.string()).optional(),
@@ -40,6 +40,7 @@ from starlette.exceptions import HTTPException
40
40
  from starlette.requests import HTTPConnection, Request
41
41
  from starlette.routing import Route
42
42
 
43
+ from langgraph_api import config as lg_config
43
44
  from langgraph_api import store as api_store
44
45
  from langgraph_api.auth.custom import DotDict, ProxyUser
45
46
  from langgraph_api.config import LANGGRAPH_AUTH, LANGGRAPH_AUTH_TYPE
@@ -53,9 +54,40 @@ from langgraph_api.utils import get_auth_ctx, get_user_id
53
54
 
54
55
  logger = structlog.stdlib.get_logger(__name__)
55
56
 
56
- REMOTE_PORT = 5555
57
- GRAPH_PORT = 5556
58
- GRAPH_HTTP_PORT = 5557
57
+ # Loopback ports between the Python parent and its JS subprocess. Containers
58
+ # colocated in one pod share a network namespace, so each entrypoint gets its
59
+ # own range (via the offset below); LANGGRAPH_JS_*_PORT overrides any port.
60
+ _BASE_REMOTE_PORT = 5555
61
+ _BASE_GRAPH_PORT = 5556
62
+ _BASE_GRAPH_HTTP_PORT = 5557
63
+
64
+
65
+ def _js_port_offset(*, is_queue: bool) -> int:
66
+ """Port offset per entrypoint so colocated containers don't collide.
67
+
68
+ The queue worker and API server can run as separate containers in a single
69
+ pod (shared network namespace), so the queue worker gets its own range.
70
+ """
71
+ return 10 if is_queue else 0
72
+
73
+
74
+ def _resolve_js_port(base: int, offset: int, override: str | None) -> int:
75
+ """Explicit env override wins; otherwise base port plus entrypoint offset."""
76
+ if override:
77
+ return int(override)
78
+ return base + offset
79
+
80
+
81
+ _JS_PORT_OFFSET = _js_port_offset(is_queue=lg_config.IS_QUEUE_ENTRYPOINT)
82
+ REMOTE_PORT = _resolve_js_port(
83
+ _BASE_REMOTE_PORT, _JS_PORT_OFFSET, os.getenv("LANGGRAPH_JS_REMOTE_PORT")
84
+ )
85
+ GRAPH_PORT = _resolve_js_port(
86
+ _BASE_GRAPH_PORT, _JS_PORT_OFFSET, os.getenv("LANGGRAPH_JS_GRAPH_PORT")
87
+ )
88
+ GRAPH_HTTP_PORT = _resolve_js_port(
89
+ _BASE_GRAPH_HTTP_PORT, _JS_PORT_OFFSET, os.getenv("LANGGRAPH_JS_GRAPH_HTTP_PORT")
90
+ )
59
91
  SSL = ssl.create_default_context(cafile=certifi.where())
60
92
 
61
93
  if (port := int(os.getenv("PORT", "8080"))) and port in (GRAPH_PORT, REMOTE_PORT):
@@ -510,6 +542,10 @@ async def run_js_process(paths_str: str | None, watch: bool = False):
510
542
  "NODE_ENV": "development" if watch else "production",
511
543
  "CHOKIDAR_USEPOLLING": "true",
512
544
  **os.environ,
545
+ # Pin the child to the parent's resolved ports.
546
+ "LANGGRAPH_JS_REMOTE_PORT": str(REMOTE_PORT),
547
+ "LANGGRAPH_JS_GRAPH_PORT": str(GRAPH_PORT),
548
+ "LANGGRAPH_JS_GRAPH_HTTP_PORT": str(GRAPH_HTTP_PORT),
513
549
  },
514
550
  )
515
551
  logger.info(
@@ -567,6 +603,10 @@ async def run_js_http_process(
567
603
  "NODE_ENV": "development" if watch else "production",
568
604
  "CHOKIDAR_USEPOLLING": "true",
569
605
  **os.environ,
606
+ # Pin the child to the parent's resolved ports.
607
+ "LANGGRAPH_JS_REMOTE_PORT": str(REMOTE_PORT),
608
+ "LANGGRAPH_JS_GRAPH_PORT": str(GRAPH_PORT),
609
+ "LANGGRAPH_JS_GRAPH_HTTP_PORT": str(GRAPH_HTTP_PORT),
570
610
  },
571
611
  )
572
612
 
@@ -11,6 +11,7 @@ from typing import TYPE_CHECKING, Any, Literal
11
11
  import structlog
12
12
 
13
13
  from langgraph_api import __version__, config, metadata
14
+ from langgraph_api.http_metrics_utils import HTTP_LATENCY_BUCKETS
14
15
 
15
16
  if TYPE_CHECKING:
16
17
  from opentelemetry.exporter.otlp.proto.http.metric_exporter import (
@@ -74,6 +75,15 @@ METRIC_TIER_INFO = 2
74
75
  METRIC_TIER_DEBUG = 3
75
76
  METRIC_TIER_DEEP_DEBUG = 4
76
77
 
78
+ # Legacy /metrics used HTTP_LATENCY_BUCKETS in seconds. OTLP record_latency()
79
+ # stores milliseconds, so convert (drop +Inf — OTel adds the overflow bucket).
80
+ # Apply to every latency metric: OTel defaults max out at 10000ms (~10s), which
81
+ # caps p95/p99 for long HTTP polls (/join), run queue waits (300s alerts), and
82
+ # run execution (30m alerts).
83
+ HTTP_LATENCY_BUCKETS_MS: tuple[float, ...] = tuple(
84
+ b * 1000 for b in HTTP_LATENCY_BUCKETS if b != float("inf")
85
+ )
86
+
77
87
  MetricType = Literal["counter", "histogram", "latency", "gauge"]
78
88
 
79
89
 
@@ -614,8 +624,17 @@ class OTelMetricsReporter:
614
624
  name=name, description=metric.description
615
625
  )
616
626
  elif metric.metric_type in {"histogram", "latency"}:
627
+ # All latency metrics use legacy second-scale buckets (as ms).
628
+ # Non-latency histograms (bytes, counts) keep OTel defaults.
629
+ advisory = (
630
+ list(HTTP_LATENCY_BUCKETS_MS)
631
+ if metric.metric_type == "latency"
632
+ else None
633
+ )
617
634
  instrument = self._meter.create_histogram(
618
- name=name, description=metric.description
635
+ name=name,
636
+ description=metric.description,
637
+ explicit_bucket_boundaries_advisory=advisory,
619
638
  )
620
639
  else:
621
640
  # Gauges are handled via observable instruments (see _set_gauge).
@@ -73,10 +73,13 @@ def compute_python_publish_tags(
73
73
  ecr_prefix: str,
74
74
  img_api_dh: str,
75
75
  img_svr_dh: str,
76
+ fips: bool = False,
76
77
  ) -> list[str]:
77
78
  """Compute Python publish tags with workflow-compatible behavior."""
78
79
  py_version = _require_non_empty("py_version", py_version)
79
80
  distro = _require_non_empty("distro", distro)
81
+ if fips and distro != "wolfi":
82
+ raise ValueError("fips is only supported for wolfi images")
80
83
  sha = _require_non_empty("sha", sha)
81
84
  ver_patch = _require_non_empty("ver_patch", ver_patch)
82
85
  ver_major = _require_non_empty("ver_major", ver_major)
@@ -92,6 +95,8 @@ def compute_python_publish_tags(
92
95
  raise ValueError("gcr_projects must include at least one project")
93
96
 
94
97
  suf = _python_suffix(distro)
98
+ if fips:
99
+ suf = f"{suf}-fips"
95
100
  pyfrag = f"py{py_version}"
96
101
  runtime_alias = (
97
102
  f"{py_version}{suf}" if channel == "stable" else f"{channel}-{pyfrag}{suf}"
@@ -184,9 +189,12 @@ def compute_js_publish_tags(
184
189
  ar_project: str,
185
190
  ecr_prefix: str,
186
191
  img_js_dh: str,
192
+ fips: bool = False,
187
193
  ) -> list[str]:
188
194
  """Compute JS publish tags with workflow-compatible behavior."""
189
195
  node_version = _require_non_empty("node_version", node_version)
196
+ if fips and tag_suffix != "wolfi":
197
+ raise ValueError("fips is only supported for wolfi images")
190
198
  sha = _require_non_empty("sha", sha)
191
199
  ver_patch = _require_non_empty("ver_patch", ver_patch)
192
200
  ar_project = _require_non_empty("ar_project", ar_project)
@@ -199,6 +207,8 @@ def compute_js_publish_tags(
199
207
  raise ValueError("gcr_projects must include at least one project")
200
208
 
201
209
  suffix = f"-{tag_suffix}" if tag_suffix else ""
210
+ if fips:
211
+ suffix = f"{suffix}-fips"
202
212
  repo_base = "langgraphjs-api" if licensed else "langgraphjs-api-unlicensed"
203
213
  runtime_alias = (
204
214
  f"{node_version}{suffix}"
@@ -25,7 +25,10 @@ from langgraph_api.encryption.middleware import (
25
25
  extract_blob_encryption_context,
26
26
  )
27
27
  from langgraph_api.errors import UserInterrupt, UserRollback, UserTimeout
28
- from langgraph_api.feature_flags import IS_POSTGRES_OR_GRPC_BACKEND
28
+ from langgraph_api.feature_flags import (
29
+ IS_POSTGRES_OR_GRPC_BACKEND,
30
+ PREFER_GRPC_CHECKPOINTER,
31
+ )
29
32
  from langgraph_api.graph import restore_dd_trace_context
30
33
  from langgraph_api.js.errors import RemoteException
31
34
  from langgraph_api.metadata import incr_runs
@@ -319,9 +322,11 @@ async def worker(
319
322
  run_attempt=attempt,
320
323
  )
321
324
  try:
322
- # We actually still need a connection for the python checkpointer
323
- # This only doubles up connections for inmem which is fine
324
- async with connect(supports_core_api=False) as conn:
325
+ # Python checkpointer needs a real PG conn; gRPC checkpointer
326
+ # does not. This only doubles up connections for inmem.
327
+ async with connect(
328
+ supports_core_api=PREFER_GRPC_CHECKPOINTER
329
+ ) as conn:
325
330
  state_snapshot = await Threads.State.get(
326
331
  conn, run["kwargs"]["config"], subgraphs=False
327
332
  )
@@ -901,7 +901,7 @@ requires-dist = [
901
901
  [package.metadata.requires-dev]
902
902
  dev = [
903
903
  { name = "grpcio-health-checking", specifier = ">=1.80.0,<1.82.0" },
904
- { name = "grpcio-tools", specifier = "==1.80.0" },
904
+ { name = "grpcio-tools", specifier = "==1.81.1" },
905
905
  { name = "langchain", specifier = ">=0.3" },
906
906
  { name = "langchain-core", specifier = ">=0.3" },
907
907
  { name = "mypy-protobuf", specifier = ">=5.0.0,<6" },
@@ -1 +0,0 @@
1
- __version__ = "0.12.0.dev18"