langgraph-api 0.10.0rc2__tar.gz → 0.11.0.dev3__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 (287) hide show
  1. {langgraph_api-0.10.0rc2 → langgraph_api-0.11.0.dev3}/PKG-INFO +3 -1
  2. langgraph_api-0.11.0.dev3/langgraph_api/__init__.py +1 -0
  3. {langgraph_api-0.10.0rc2 → langgraph_api-0.11.0.dev3}/langgraph_api/config/__init__.py +4 -0
  4. {langgraph_api-0.10.0rc2 → langgraph_api-0.11.0.dev3}/langgraph_api/event_streaming/session.py +6 -6
  5. langgraph_api-0.10.0rc2/langgraph_api/metrics_datadog.py → langgraph_api-0.11.0.dev3/langgraph_api/metrics_otlp.py +116 -43
  6. {langgraph_api-0.10.0rc2 → langgraph_api-0.11.0.dev3}/langgraph_api/stream.py +3 -3
  7. {langgraph_api-0.10.0rc2 → langgraph_api-0.11.0.dev3}/langgraph_api/worker.py +3 -3
  8. {langgraph_api-0.10.0rc2 → langgraph_api-0.11.0.dev3}/pyproject.toml +2 -0
  9. {langgraph_api-0.10.0rc2 → langgraph_api-0.11.0.dev3}/uv.lock +27 -0
  10. langgraph_api-0.10.0rc2/langgraph_api/__init__.py +0 -1
  11. {langgraph_api-0.10.0rc2 → langgraph_api-0.11.0.dev3}/.gitignore +0 -0
  12. {langgraph_api-0.10.0rc2 → langgraph_api-0.11.0.dev3}/LICENSE +0 -0
  13. {langgraph_api-0.10.0rc2 → langgraph_api-0.11.0.dev3}/Makefile +0 -0
  14. {langgraph_api-0.10.0rc2 → langgraph_api-0.11.0.dev3}/README.md +0 -0
  15. {langgraph_api-0.10.0rc2 → langgraph_api-0.11.0.dev3}/benchmark/.gitignore +0 -0
  16. {langgraph_api-0.10.0rc2 → langgraph_api-0.11.0.dev3}/benchmark/Makefile +0 -0
  17. {langgraph_api-0.10.0rc2 → langgraph_api-0.11.0.dev3}/benchmark/README.md +0 -0
  18. {langgraph_api-0.10.0rc2 → langgraph_api-0.11.0.dev3}/benchmark/benchmark-runners/assistant.ts +0 -0
  19. {langgraph_api-0.10.0rc2 → langgraph_api-0.11.0.dev3}/benchmark/benchmark-runners/benchmark-runner.ts +0 -0
  20. {langgraph_api-0.10.0rc2 → langgraph_api-0.11.0.dev3}/benchmark/benchmark-runners/benchmark_profiles.ts +0 -0
  21. {langgraph_api-0.10.0rc2 → langgraph_api-0.11.0.dev3}/benchmark/benchmark-runners/benchmarks.ts +0 -0
  22. {langgraph_api-0.10.0rc2 → langgraph_api-0.11.0.dev3}/benchmark/benchmark-runners/cancel_first_second_completes.ts +0 -0
  23. {langgraph_api-0.10.0rc2 → langgraph_api-0.11.0.dev3}/benchmark/benchmark-runners/enqueued_runs_order.ts +0 -0
  24. {langgraph_api-0.10.0rc2 → langgraph_api-0.11.0.dev3}/benchmark/benchmark-runners/log-failure.ts +0 -0
  25. {langgraph_api-0.10.0rc2 → langgraph_api-0.11.0.dev3}/benchmark/benchmark-runners/meta_workload.ts +0 -0
  26. {langgraph_api-0.10.0rc2 → langgraph_api-0.11.0.dev3}/benchmark/benchmark-runners/stream_write.ts +0 -0
  27. {langgraph_api-0.10.0rc2 → langgraph_api-0.11.0.dev3}/benchmark/benchmark-runners/thread.ts +0 -0
  28. {langgraph_api-0.10.0rc2 → langgraph_api-0.11.0.dev3}/benchmark/benchmark-runners/thread_runs_metadata_search.ts +0 -0
  29. {langgraph_api-0.10.0rc2 → langgraph_api-0.11.0.dev3}/benchmark/benchmark-runners/threads_search_metadata.ts +0 -0
  30. {langgraph_api-0.10.0rc2 → langgraph_api-0.11.0.dev3}/benchmark/benchmark-runners/types.ts +0 -0
  31. {langgraph_api-0.10.0rc2 → langgraph_api-0.11.0.dev3}/benchmark/benchmark-runners/wait_write.ts +0 -0
  32. {langgraph_api-0.10.0rc2 → langgraph_api-0.11.0.dev3}/benchmark/capacity_dd_report.py +0 -0
  33. {langgraph_api-0.10.0rc2 → langgraph_api-0.11.0.dev3}/benchmark/capacity_k6.js +0 -0
  34. {langgraph_api-0.10.0rc2 → langgraph_api-0.11.0.dev3}/benchmark/capacity_runner.mjs +0 -0
  35. {langgraph_api-0.10.0rc2 → langgraph_api-0.11.0.dev3}/benchmark/capacity_slack_report.py +0 -0
  36. {langgraph_api-0.10.0rc2 → langgraph_api-0.11.0.dev3}/benchmark/capacity_urls.mjs +0 -0
  37. {langgraph_api-0.10.0rc2 → langgraph_api-0.11.0.dev3}/benchmark/clean-cli.js +0 -0
  38. {langgraph_api-0.10.0rc2 → langgraph_api-0.11.0.dev3}/benchmark/clean.js +0 -0
  39. {langgraph_api-0.10.0rc2 → langgraph_api-0.11.0.dev3}/benchmark/continuous/README.md +0 -0
  40. {langgraph_api-0.10.0rc2 → langgraph_api-0.11.0.dev3}/benchmark/continuous/pyproject.toml +0 -0
  41. {langgraph_api-0.10.0rc2 → langgraph_api-0.11.0.dev3}/benchmark/continuous/runner.py +0 -0
  42. {langgraph_api-0.10.0rc2 → langgraph_api-0.11.0.dev3}/benchmark/continuous/uv.lock +0 -0
  43. {langgraph_api-0.10.0rc2 → langgraph_api-0.11.0.dev3}/benchmark/graphs.js +0 -0
  44. {langgraph_api-0.10.0rc2 → langgraph_api-0.11.0.dev3}/benchmark/mixed_workload_k6.js +0 -0
  45. {langgraph_api-0.10.0rc2 → langgraph_api-0.11.0.dev3}/benchmark/mixed_workload_runner.mjs +0 -0
  46. {langgraph_api-0.10.0rc2 → langgraph_api-0.11.0.dev3}/benchmark/package.json +0 -0
  47. {langgraph_api-0.10.0rc2 → langgraph_api-0.11.0.dev3}/benchmark/ramp.js +0 -0
  48. {langgraph_api-0.10.0rc2 → langgraph_api-0.11.0.dev3}/benchmark/reporting/dd_reporting.py +0 -0
  49. {langgraph_api-0.10.0rc2 → langgraph_api-0.11.0.dev3}/benchmark/reporting/slack_slowest_runs.py +0 -0
  50. {langgraph_api-0.10.0rc2 → langgraph_api-0.11.0.dev3}/benchmark/reporting/slack_summary.py +0 -0
  51. {langgraph_api-0.10.0rc2 → langgraph_api-0.11.0.dev3}/benchmark/run_local.sh +0 -0
  52. {langgraph_api-0.10.0rc2 → langgraph_api-0.11.0.dev3}/benchmark/staircase.py +0 -0
  53. {langgraph_api-0.10.0rc2 → langgraph_api-0.11.0.dev3}/benchmark/staircase_step_k6.js +0 -0
  54. {langgraph_api-0.10.0rc2 → langgraph_api-0.11.0.dev3}/benchmark/tsconfig.json +0 -0
  55. {langgraph_api-0.10.0rc2 → langgraph_api-0.11.0.dev3}/benchmark/update-revision.js +0 -0
  56. {langgraph_api-0.10.0rc2 → langgraph_api-0.11.0.dev3}/benchmark/weather.js +0 -0
  57. {langgraph_api-0.10.0rc2 → langgraph_api-0.11.0.dev3}/constraints.txt +0 -0
  58. {langgraph_api-0.10.0rc2 → langgraph_api-0.11.0.dev3}/custom_store.sql +0 -0
  59. {langgraph_api-0.10.0rc2 → langgraph_api-0.11.0.dev3}/forbidden.txt +0 -0
  60. {langgraph_api-0.10.0rc2 → langgraph_api-0.11.0.dev3}/hatch_build.py +0 -0
  61. {langgraph_api-0.10.0rc2 → langgraph_api-0.11.0.dev3}/healthcheck.py +0 -0
  62. {langgraph_api-0.10.0rc2 → langgraph_api-0.11.0.dev3}/langgraph-cloud-debugging-20260210132856.zip +0 -0
  63. {langgraph_api-0.10.0rc2 → langgraph_api-0.11.0.dev3}/langgraph_api/_checkpointer/__init__.py +0 -0
  64. {langgraph_api-0.10.0rc2 → langgraph_api-0.11.0.dev3}/langgraph_api/_checkpointer/_adapter.py +0 -0
  65. {langgraph_api-0.10.0rc2 → langgraph_api-0.11.0.dev3}/langgraph_api/_checkpointer/protocol.py +0 -0
  66. {langgraph_api-0.10.0rc2 → langgraph_api-0.11.0.dev3}/langgraph_api/_factory_utils.py +0 -0
  67. {langgraph_api-0.10.0rc2 → langgraph_api-0.11.0.dev3}/langgraph_api/api/__init__.py +0 -0
  68. {langgraph_api-0.10.0rc2 → langgraph_api-0.11.0.dev3}/langgraph_api/api/a2a.py +0 -0
  69. {langgraph_api-0.10.0rc2 → langgraph_api-0.11.0.dev3}/langgraph_api/api/assistants.py +0 -0
  70. {langgraph_api-0.10.0rc2 → langgraph_api-0.11.0.dev3}/langgraph_api/api/event_streaming.py +0 -0
  71. {langgraph_api-0.10.0rc2 → langgraph_api-0.11.0.dev3}/langgraph_api/api/mcp/__init__.py +0 -0
  72. {langgraph_api-0.10.0rc2 → langgraph_api-0.11.0.dev3}/langgraph_api/api/mcp/_constants.py +0 -0
  73. {langgraph_api-0.10.0rc2 → langgraph_api-0.11.0.dev3}/langgraph_api/api/mcp/_handlers.py +0 -0
  74. {langgraph_api-0.10.0rc2 → langgraph_api-0.11.0.dev3}/langgraph_api/api/mcp/_models.py +0 -0
  75. {langgraph_api-0.10.0rc2 → langgraph_api-0.11.0.dev3}/langgraph_api/api/mcp/_routes.py +0 -0
  76. {langgraph_api-0.10.0rc2 → langgraph_api-0.11.0.dev3}/langgraph_api/api/mcp/_sanitizers.py +0 -0
  77. {langgraph_api-0.10.0rc2 → langgraph_api-0.11.0.dev3}/langgraph_api/api/meta.py +0 -0
  78. {langgraph_api-0.10.0rc2 → langgraph_api-0.11.0.dev3}/langgraph_api/api/openapi.py +0 -0
  79. {langgraph_api-0.10.0rc2 → langgraph_api-0.11.0.dev3}/langgraph_api/api/profile.py +0 -0
  80. {langgraph_api-0.10.0rc2 → langgraph_api-0.11.0.dev3}/langgraph_api/api/runs.py +0 -0
  81. {langgraph_api-0.10.0rc2 → langgraph_api-0.11.0.dev3}/langgraph_api/api/store.py +0 -0
  82. {langgraph_api-0.10.0rc2 → langgraph_api-0.11.0.dev3}/langgraph_api/api/threads.py +0 -0
  83. {langgraph_api-0.10.0rc2 → langgraph_api-0.11.0.dev3}/langgraph_api/api/ui.py +0 -0
  84. {langgraph_api-0.10.0rc2 → langgraph_api-0.11.0.dev3}/langgraph_api/asgi_transport.py +0 -0
  85. {langgraph_api-0.10.0rc2 → langgraph_api-0.11.0.dev3}/langgraph_api/asyncio.py +0 -0
  86. {langgraph_api-0.10.0rc2 → langgraph_api-0.11.0.dev3}/langgraph_api/auth/__init__.py +0 -0
  87. {langgraph_api-0.10.0rc2 → langgraph_api-0.11.0.dev3}/langgraph_api/auth/custom.py +0 -0
  88. {langgraph_api-0.10.0rc2 → langgraph_api-0.11.0.dev3}/langgraph_api/auth/errors.py +0 -0
  89. {langgraph_api-0.10.0rc2 → langgraph_api-0.11.0.dev3}/langgraph_api/auth/langsmith/__init__.py +0 -0
  90. {langgraph_api-0.10.0rc2 → langgraph_api-0.11.0.dev3}/langgraph_api/auth/langsmith/backend.py +0 -0
  91. {langgraph_api-0.10.0rc2 → langgraph_api-0.11.0.dev3}/langgraph_api/auth/langsmith/client.py +0 -0
  92. {langgraph_api-0.10.0rc2 → langgraph_api-0.11.0.dev3}/langgraph_api/auth/middleware.py +0 -0
  93. {langgraph_api-0.10.0rc2 → langgraph_api-0.11.0.dev3}/langgraph_api/auth/noop.py +0 -0
  94. {langgraph_api-0.10.0rc2 → langgraph_api-0.11.0.dev3}/langgraph_api/auth/studio_user.py +0 -0
  95. {langgraph_api-0.10.0rc2 → langgraph_api-0.11.0.dev3}/langgraph_api/cache.py +0 -0
  96. {langgraph_api-0.10.0rc2 → langgraph_api-0.11.0.dev3}/langgraph_api/cli.py +0 -0
  97. {langgraph_api-0.10.0rc2 → langgraph_api-0.11.0.dev3}/langgraph_api/command.py +0 -0
  98. {langgraph_api-0.10.0rc2 → langgraph_api-0.11.0.dev3}/langgraph_api/config/_parse.py +0 -0
  99. {langgraph_api-0.10.0rc2 → langgraph_api-0.11.0.dev3}/langgraph_api/config/schemas.py +0 -0
  100. {langgraph_api-0.10.0rc2 → langgraph_api-0.11.0.dev3}/langgraph_api/cron_scheduler.py +0 -0
  101. {langgraph_api-0.10.0rc2 → langgraph_api-0.11.0.dev3}/langgraph_api/encryption/__init__.py +0 -0
  102. {langgraph_api-0.10.0rc2 → langgraph_api-0.11.0.dev3}/langgraph_api/encryption/aes_json.py +0 -0
  103. {langgraph_api-0.10.0rc2 → langgraph_api-0.11.0.dev3}/langgraph_api/encryption/context.py +0 -0
  104. {langgraph_api-0.10.0rc2 → langgraph_api-0.11.0.dev3}/langgraph_api/encryption/custom.py +0 -0
  105. {langgraph_api-0.10.0rc2 → langgraph_api-0.11.0.dev3}/langgraph_api/encryption/middleware.py +0 -0
  106. {langgraph_api-0.10.0rc2 → langgraph_api-0.11.0.dev3}/langgraph_api/encryption/shared.py +0 -0
  107. {langgraph_api-0.10.0rc2 → langgraph_api-0.11.0.dev3}/langgraph_api/errors.py +0 -0
  108. {langgraph_api-0.10.0rc2 → langgraph_api-0.11.0.dev3}/langgraph_api/event_streaming/__init__.py +0 -0
  109. {langgraph_api-0.10.0rc2 → langgraph_api-0.11.0.dev3}/langgraph_api/event_streaming/capabilities.py +0 -0
  110. {langgraph_api-0.10.0rc2 → langgraph_api-0.11.0.dev3}/langgraph_api/event_streaming/constants.py +0 -0
  111. {langgraph_api-0.10.0rc2 → langgraph_api-0.11.0.dev3}/langgraph_api/event_streaming/event_normalizers.py +0 -0
  112. {langgraph_api-0.10.0rc2 → langgraph_api-0.11.0.dev3}/langgraph_api/event_streaming/namespace.py +0 -0
  113. {langgraph_api-0.10.0rc2 → langgraph_api-0.11.0.dev3}/langgraph_api/event_streaming/service.py +0 -0
  114. {langgraph_api-0.10.0rc2 → langgraph_api-0.11.0.dev3}/langgraph_api/event_streaming/state_normalizers.py +0 -0
  115. {langgraph_api-0.10.0rc2 → langgraph_api-0.11.0.dev3}/langgraph_api/event_streaming/types.py +0 -0
  116. {langgraph_api-0.10.0rc2 → langgraph_api-0.11.0.dev3}/langgraph_api/feature_flags.py +0 -0
  117. {langgraph_api-0.10.0rc2 → langgraph_api-0.11.0.dev3}/langgraph_api/graph.py +0 -0
  118. {langgraph_api-0.10.0rc2 → langgraph_api-0.11.0.dev3}/langgraph_api/grpc/__init__.py +0 -0
  119. {langgraph_api-0.10.0rc2 → langgraph_api-0.11.0.dev3}/langgraph_api/grpc/client.py +0 -0
  120. {langgraph_api-0.10.0rc2 → langgraph_api-0.11.0.dev3}/langgraph_api/grpc/generated/core_api_pb2.pyi +0 -0
  121. {langgraph_api-0.10.0rc2 → langgraph_api-0.11.0.dev3}/langgraph_api/grpc/ops/__init__.py +0 -0
  122. {langgraph_api-0.10.0rc2 → langgraph_api-0.11.0.dev3}/langgraph_api/grpc/ops/assistants.py +0 -0
  123. {langgraph_api-0.10.0rc2 → langgraph_api-0.11.0.dev3}/langgraph_api/grpc/ops/cache.py +0 -0
  124. {langgraph_api-0.10.0rc2 → langgraph_api-0.11.0.dev3}/langgraph_api/grpc/ops/crons.py +0 -0
  125. {langgraph_api-0.10.0rc2 → langgraph_api-0.11.0.dev3}/langgraph_api/grpc/ops/runs.py +0 -0
  126. {langgraph_api-0.10.0rc2 → langgraph_api-0.11.0.dev3}/langgraph_api/grpc/ops/threads.py +0 -0
  127. {langgraph_api-0.10.0rc2 → langgraph_api-0.11.0.dev3}/langgraph_api/grpc/server.py +0 -0
  128. {langgraph_api-0.10.0rc2 → langgraph_api-0.11.0.dev3}/langgraph_api/grpc/servicers/__init__.py +0 -0
  129. {langgraph_api-0.10.0rc2 → langgraph_api-0.11.0.dev3}/langgraph_api/grpc/servicers/checkpointer.py +0 -0
  130. {langgraph_api-0.10.0rc2 → langgraph_api-0.11.0.dev3}/langgraph_api/grpc/servicers/encryption.py +0 -0
  131. {langgraph_api-0.10.0rc2 → langgraph_api-0.11.0.dev3}/langgraph_api/http.py +0 -0
  132. {langgraph_api-0.10.0rc2 → langgraph_api-0.11.0.dev3}/langgraph_api/http_metrics.py +0 -0
  133. {langgraph_api-0.10.0rc2 → langgraph_api-0.11.0.dev3}/langgraph_api/http_metrics_utils.py +0 -0
  134. {langgraph_api-0.10.0rc2 → langgraph_api-0.11.0.dev3}/langgraph_api/js/.gitignore +0 -0
  135. {langgraph_api-0.10.0rc2 → langgraph_api-0.11.0.dev3}/langgraph_api/js/.prettierrc +0 -0
  136. {langgraph_api-0.10.0rc2 → langgraph_api-0.11.0.dev3}/langgraph_api/js/__init__.py +0 -0
  137. {langgraph_api-0.10.0rc2 → langgraph_api-0.11.0.dev3}/langgraph_api/js/base.py +0 -0
  138. {langgraph_api-0.10.0rc2 → langgraph_api-0.11.0.dev3}/langgraph_api/js/build.mts +0 -0
  139. {langgraph_api-0.10.0rc2 → langgraph_api-0.11.0.dev3}/langgraph_api/js/client.http.mts +0 -0
  140. {langgraph_api-0.10.0rc2 → langgraph_api-0.11.0.dev3}/langgraph_api/js/client.mts +0 -0
  141. {langgraph_api-0.10.0rc2 → langgraph_api-0.11.0.dev3}/langgraph_api/js/errors.py +0 -0
  142. {langgraph_api-0.10.0rc2 → langgraph_api-0.11.0.dev3}/langgraph_api/js/global.d.ts +0 -0
  143. {langgraph_api-0.10.0rc2 → langgraph_api-0.11.0.dev3}/langgraph_api/js/package.json +0 -0
  144. {langgraph_api-0.10.0rc2 → langgraph_api-0.11.0.dev3}/langgraph_api/js/remote.py +0 -0
  145. {langgraph_api-0.10.0rc2 → langgraph_api-0.11.0.dev3}/langgraph_api/js/schema.py +0 -0
  146. {langgraph_api-0.10.0rc2 → langgraph_api-0.11.0.dev3}/langgraph_api/js/src/graph.mts +0 -0
  147. {langgraph_api-0.10.0rc2 → langgraph_api-0.11.0.dev3}/langgraph_api/js/src/load.hooks.mjs +0 -0
  148. {langgraph_api-0.10.0rc2 → langgraph_api-0.11.0.dev3}/langgraph_api/js/src/preload.mjs +0 -0
  149. {langgraph_api-0.10.0rc2 → langgraph_api-0.11.0.dev3}/langgraph_api/js/src/utils/experiment-tracing.mts +0 -0
  150. {langgraph_api-0.10.0rc2 → langgraph_api-0.11.0.dev3}/langgraph_api/js/src/utils/files.mts +0 -0
  151. {langgraph_api-0.10.0rc2 → langgraph_api-0.11.0.dev3}/langgraph_api/js/src/utils/importMap.mts +0 -0
  152. {langgraph_api-0.10.0rc2 → langgraph_api-0.11.0.dev3}/langgraph_api/js/src/utils/pythonSchemas.mts +0 -0
  153. {langgraph_api-0.10.0rc2 → langgraph_api-0.11.0.dev3}/langgraph_api/js/src/utils/serde.mts +0 -0
  154. {langgraph_api-0.10.0rc2 → langgraph_api-0.11.0.dev3}/langgraph_api/js/sse.py +0 -0
  155. {langgraph_api-0.10.0rc2 → langgraph_api-0.11.0.dev3}/langgraph_api/js/traceblock.mts +0 -0
  156. {langgraph_api-0.10.0rc2 → langgraph_api-0.11.0.dev3}/langgraph_api/js/tsconfig.json +0 -0
  157. {langgraph_api-0.10.0rc2 → langgraph_api-0.11.0.dev3}/langgraph_api/js/ui.py +0 -0
  158. {langgraph_api-0.10.0rc2 → langgraph_api-0.11.0.dev3}/langgraph_api/js/yarn.lock +0 -0
  159. {langgraph_api-0.10.0rc2 → langgraph_api-0.11.0.dev3}/langgraph_api/lc_security/__init__.py +0 -0
  160. {langgraph_api-0.10.0rc2 → langgraph_api-0.11.0.dev3}/langgraph_api/lc_security/exceptions.py +0 -0
  161. {langgraph_api-0.10.0rc2 → langgraph_api-0.11.0.dev3}/langgraph_api/lc_security/policy.py +0 -0
  162. {langgraph_api-0.10.0rc2 → langgraph_api-0.11.0.dev3}/langgraph_api/lc_security/transport.py +0 -0
  163. {langgraph_api-0.10.0rc2 → langgraph_api-0.11.0.dev3}/langgraph_api/logging.py +0 -0
  164. {langgraph_api-0.10.0rc2 → langgraph_api-0.11.0.dev3}/langgraph_api/metadata.py +0 -0
  165. {langgraph_api-0.10.0rc2 → langgraph_api-0.11.0.dev3}/langgraph_api/middleware/__init__.py +0 -0
  166. {langgraph_api-0.10.0rc2 → langgraph_api-0.11.0.dev3}/langgraph_api/middleware/ensure_store.py +0 -0
  167. {langgraph_api-0.10.0rc2 → langgraph_api-0.11.0.dev3}/langgraph_api/middleware/http_logger.py +0 -0
  168. {langgraph_api-0.10.0rc2 → langgraph_api-0.11.0.dev3}/langgraph_api/middleware/private_network.py +0 -0
  169. {langgraph_api-0.10.0rc2 → langgraph_api-0.11.0.dev3}/langgraph_api/middleware/request_id.py +0 -0
  170. {langgraph_api-0.10.0rc2 → langgraph_api-0.11.0.dev3}/langgraph_api/models/__init__.py +0 -0
  171. {langgraph_api-0.10.0rc2 → langgraph_api-0.11.0.dev3}/langgraph_api/models/run.py +0 -0
  172. {langgraph_api-0.10.0rc2 → langgraph_api-0.11.0.dev3}/langgraph_api/otel_context.py +0 -0
  173. {langgraph_api-0.10.0rc2 → langgraph_api-0.11.0.dev3}/langgraph_api/patch.py +0 -0
  174. {langgraph_api-0.10.0rc2 → langgraph_api-0.11.0.dev3}/langgraph_api/queue_entrypoint.py +0 -0
  175. {langgraph_api-0.10.0rc2 → langgraph_api-0.11.0.dev3}/langgraph_api/release_tags.py +0 -0
  176. {langgraph_api-0.10.0rc2 → langgraph_api-0.11.0.dev3}/langgraph_api/route.py +0 -0
  177. {langgraph_api-0.10.0rc2 → langgraph_api-0.11.0.dev3}/langgraph_api/schema.py +0 -0
  178. {langgraph_api-0.10.0rc2 → langgraph_api-0.11.0.dev3}/langgraph_api/self_hosted_logs.py +0 -0
  179. {langgraph_api-0.10.0rc2 → langgraph_api-0.11.0.dev3}/langgraph_api/self_hosted_metrics.py +0 -0
  180. {langgraph_api-0.10.0rc2 → langgraph_api-0.11.0.dev3}/langgraph_api/serde.py +0 -0
  181. {langgraph_api-0.10.0rc2 → langgraph_api-0.11.0.dev3}/langgraph_api/server.py +0 -0
  182. {langgraph_api-0.10.0rc2 → langgraph_api-0.11.0.dev3}/langgraph_api/sse.py +0 -0
  183. {langgraph_api-0.10.0rc2 → langgraph_api-0.11.0.dev3}/langgraph_api/state.py +0 -0
  184. {langgraph_api-0.10.0rc2 → langgraph_api-0.11.0.dev3}/langgraph_api/store.py +0 -0
  185. {langgraph_api-0.10.0rc2 → langgraph_api-0.11.0.dev3}/langgraph_api/stream_v2.py +0 -0
  186. {langgraph_api-0.10.0rc2 → langgraph_api-0.11.0.dev3}/langgraph_api/timing/__init__.py +0 -0
  187. {langgraph_api-0.10.0rc2 → langgraph_api-0.11.0.dev3}/langgraph_api/timing/profiler.py +0 -0
  188. {langgraph_api-0.10.0rc2 → langgraph_api-0.11.0.dev3}/langgraph_api/timing/timer.py +0 -0
  189. {langgraph_api-0.10.0rc2 → langgraph_api-0.11.0.dev3}/langgraph_api/traceblock.py +0 -0
  190. {langgraph_api-0.10.0rc2 → langgraph_api-0.11.0.dev3}/langgraph_api/tunneling/cloudflare.py +0 -0
  191. {langgraph_api-0.10.0rc2 → langgraph_api-0.11.0.dev3}/langgraph_api/utils/__init__.py +0 -0
  192. {langgraph_api-0.10.0rc2 → langgraph_api-0.11.0.dev3}/langgraph_api/utils/cache.py +0 -0
  193. {langgraph_api-0.10.0rc2 → langgraph_api-0.11.0.dev3}/langgraph_api/utils/config.py +0 -0
  194. {langgraph_api-0.10.0rc2 → langgraph_api-0.11.0.dev3}/langgraph_api/utils/errors.py +0 -0
  195. {langgraph_api-0.10.0rc2 → langgraph_api-0.11.0.dev3}/langgraph_api/utils/extract.py +0 -0
  196. {langgraph_api-0.10.0rc2 → langgraph_api-0.11.0.dev3}/langgraph_api/utils/future.py +0 -0
  197. {langgraph_api-0.10.0rc2 → langgraph_api-0.11.0.dev3}/langgraph_api/utils/headers.py +0 -0
  198. {langgraph_api-0.10.0rc2 → langgraph_api-0.11.0.dev3}/langgraph_api/utils/network.py +0 -0
  199. {langgraph_api-0.10.0rc2 → langgraph_api-0.11.0.dev3}/langgraph_api/utils/retriable_client.py +0 -0
  200. {langgraph_api-0.10.0rc2 → langgraph_api-0.11.0.dev3}/langgraph_api/utils/stream_codec.py +0 -0
  201. {langgraph_api-0.10.0rc2 → langgraph_api-0.11.0.dev3}/langgraph_api/utils/uuids.py +0 -0
  202. {langgraph_api-0.10.0rc2 → langgraph_api-0.11.0.dev3}/langgraph_api/validation.py +0 -0
  203. {langgraph_api-0.10.0rc2 → langgraph_api-0.11.0.dev3}/langgraph_api/webhook.py +0 -0
  204. {langgraph_api-0.10.0rc2 → langgraph_api-0.11.0.dev3}/langgraph_grpc_common/__init__.py +0 -0
  205. {langgraph_api-0.10.0rc2 → langgraph_api-0.11.0.dev3}/langgraph_grpc_common/checkpointer.py +0 -0
  206. {langgraph_api-0.10.0rc2 → langgraph_api-0.11.0.dev3}/langgraph_grpc_common/conversion/__init__.py +0 -0
  207. {langgraph_api-0.10.0rc2 → langgraph_api-0.11.0.dev3}/langgraph_grpc_common/conversion/_compat.py +0 -0
  208. {langgraph_api-0.10.0rc2 → langgraph_api-0.11.0.dev3}/langgraph_grpc_common/conversion/checkpoint.py +0 -0
  209. {langgraph_api-0.10.0rc2 → langgraph_api-0.11.0.dev3}/langgraph_grpc_common/conversion/config.py +0 -0
  210. {langgraph_api-0.10.0rc2 → langgraph_api-0.11.0.dev3}/langgraph_grpc_common/conversion/durability.py +0 -0
  211. {langgraph_api-0.10.0rc2 → langgraph_api-0.11.0.dev3}/langgraph_grpc_common/conversion/struct.py +0 -0
  212. {langgraph_api-0.10.0rc2 → langgraph_api-0.11.0.dev3}/langgraph_grpc_common/conversion/value.py +0 -0
  213. {langgraph_api-0.10.0rc2 → langgraph_api-0.11.0.dev3}/langgraph_grpc_common/proto/__init__.py +0 -0
  214. {langgraph_api-0.10.0rc2 → langgraph_api-0.11.0.dev3}/langgraph_grpc_common/proto/checkpointer_pb2.py +0 -0
  215. {langgraph_api-0.10.0rc2 → langgraph_api-0.11.0.dev3}/langgraph_grpc_common/proto/checkpointer_pb2.pyi +0 -0
  216. {langgraph_api-0.10.0rc2 → langgraph_api-0.11.0.dev3}/langgraph_grpc_common/proto/checkpointer_pb2_grpc.py +0 -0
  217. {langgraph_api-0.10.0rc2 → langgraph_api-0.11.0.dev3}/langgraph_grpc_common/proto/checkpointer_pb2_grpc.pyi +0 -0
  218. {langgraph_api-0.10.0rc2 → langgraph_api-0.11.0.dev3}/langgraph_grpc_common/proto/core_api_pb2.py +0 -0
  219. {langgraph_api-0.10.0rc2 → langgraph_api-0.11.0.dev3}/langgraph_grpc_common/proto/core_api_pb2.pyi +0 -0
  220. {langgraph_api-0.10.0rc2 → langgraph_api-0.11.0.dev3}/langgraph_grpc_common/proto/core_api_pb2_grpc.py +0 -0
  221. {langgraph_api-0.10.0rc2 → langgraph_api-0.11.0.dev3}/langgraph_grpc_common/proto/core_api_pb2_grpc.pyi +0 -0
  222. {langgraph_api-0.10.0rc2 → langgraph_api-0.11.0.dev3}/langgraph_grpc_common/proto/encryption_pb2.py +0 -0
  223. {langgraph_api-0.10.0rc2 → langgraph_api-0.11.0.dev3}/langgraph_grpc_common/proto/encryption_pb2.pyi +0 -0
  224. {langgraph_api-0.10.0rc2 → langgraph_api-0.11.0.dev3}/langgraph_grpc_common/proto/encryption_pb2_grpc.py +0 -0
  225. {langgraph_api-0.10.0rc2 → langgraph_api-0.11.0.dev3}/langgraph_grpc_common/proto/encryption_pb2_grpc.pyi +0 -0
  226. {langgraph_api-0.10.0rc2 → langgraph_api-0.11.0.dev3}/langgraph_grpc_common/proto/engine_common_pb2.py +0 -0
  227. {langgraph_api-0.10.0rc2 → langgraph_api-0.11.0.dev3}/langgraph_grpc_common/proto/engine_common_pb2.pyi +0 -0
  228. {langgraph_api-0.10.0rc2 → langgraph_api-0.11.0.dev3}/langgraph_grpc_common/proto/engine_common_pb2_grpc.py +0 -0
  229. {langgraph_api-0.10.0rc2 → langgraph_api-0.11.0.dev3}/langgraph_grpc_common/proto/engine_common_pb2_grpc.pyi +0 -0
  230. {langgraph_api-0.10.0rc2 → langgraph_api-0.11.0.dev3}/langgraph_grpc_common/proto/enum_cancel_run_action_pb2.py +0 -0
  231. {langgraph_api-0.10.0rc2 → langgraph_api-0.11.0.dev3}/langgraph_grpc_common/proto/enum_cancel_run_action_pb2.pyi +0 -0
  232. {langgraph_api-0.10.0rc2 → langgraph_api-0.11.0.dev3}/langgraph_grpc_common/proto/enum_cancel_run_action_pb2_grpc.py +0 -0
  233. {langgraph_api-0.10.0rc2 → langgraph_api-0.11.0.dev3}/langgraph_grpc_common/proto/enum_cancel_run_action_pb2_grpc.pyi +0 -0
  234. {langgraph_api-0.10.0rc2 → langgraph_api-0.11.0.dev3}/langgraph_grpc_common/proto/enum_control_signal_pb2.py +0 -0
  235. {langgraph_api-0.10.0rc2 → langgraph_api-0.11.0.dev3}/langgraph_grpc_common/proto/enum_control_signal_pb2.pyi +0 -0
  236. {langgraph_api-0.10.0rc2 → langgraph_api-0.11.0.dev3}/langgraph_grpc_common/proto/enum_control_signal_pb2_grpc.py +0 -0
  237. {langgraph_api-0.10.0rc2 → langgraph_api-0.11.0.dev3}/langgraph_grpc_common/proto/enum_control_signal_pb2_grpc.pyi +0 -0
  238. {langgraph_api-0.10.0rc2 → langgraph_api-0.11.0.dev3}/langgraph_grpc_common/proto/enum_cron_on_run_completed_pb2.py +0 -0
  239. {langgraph_api-0.10.0rc2 → langgraph_api-0.11.0.dev3}/langgraph_grpc_common/proto/enum_cron_on_run_completed_pb2.pyi +0 -0
  240. {langgraph_api-0.10.0rc2 → langgraph_api-0.11.0.dev3}/langgraph_grpc_common/proto/enum_cron_on_run_completed_pb2_grpc.py +0 -0
  241. {langgraph_api-0.10.0rc2 → langgraph_api-0.11.0.dev3}/langgraph_grpc_common/proto/enum_cron_on_run_completed_pb2_grpc.pyi +0 -0
  242. {langgraph_api-0.10.0rc2 → langgraph_api-0.11.0.dev3}/langgraph_grpc_common/proto/enum_durability_pb2.py +0 -0
  243. {langgraph_api-0.10.0rc2 → langgraph_api-0.11.0.dev3}/langgraph_grpc_common/proto/enum_durability_pb2.pyi +0 -0
  244. {langgraph_api-0.10.0rc2 → langgraph_api-0.11.0.dev3}/langgraph_grpc_common/proto/enum_durability_pb2_grpc.py +0 -0
  245. {langgraph_api-0.10.0rc2 → langgraph_api-0.11.0.dev3}/langgraph_grpc_common/proto/enum_durability_pb2_grpc.pyi +0 -0
  246. {langgraph_api-0.10.0rc2 → langgraph_api-0.11.0.dev3}/langgraph_grpc_common/proto/enum_multitask_strategy_pb2.py +0 -0
  247. {langgraph_api-0.10.0rc2 → langgraph_api-0.11.0.dev3}/langgraph_grpc_common/proto/enum_multitask_strategy_pb2.pyi +0 -0
  248. {langgraph_api-0.10.0rc2 → langgraph_api-0.11.0.dev3}/langgraph_grpc_common/proto/enum_multitask_strategy_pb2_grpc.py +0 -0
  249. {langgraph_api-0.10.0rc2 → langgraph_api-0.11.0.dev3}/langgraph_grpc_common/proto/enum_multitask_strategy_pb2_grpc.pyi +0 -0
  250. {langgraph_api-0.10.0rc2 → langgraph_api-0.11.0.dev3}/langgraph_grpc_common/proto/enum_run_status_pb2.py +0 -0
  251. {langgraph_api-0.10.0rc2 → langgraph_api-0.11.0.dev3}/langgraph_grpc_common/proto/enum_run_status_pb2.pyi +0 -0
  252. {langgraph_api-0.10.0rc2 → langgraph_api-0.11.0.dev3}/langgraph_grpc_common/proto/enum_run_status_pb2_grpc.py +0 -0
  253. {langgraph_api-0.10.0rc2 → langgraph_api-0.11.0.dev3}/langgraph_grpc_common/proto/enum_run_status_pb2_grpc.pyi +0 -0
  254. {langgraph_api-0.10.0rc2 → langgraph_api-0.11.0.dev3}/langgraph_grpc_common/proto/enum_stream_mode_pb2.py +0 -0
  255. {langgraph_api-0.10.0rc2 → langgraph_api-0.11.0.dev3}/langgraph_grpc_common/proto/enum_stream_mode_pb2.pyi +0 -0
  256. {langgraph_api-0.10.0rc2 → langgraph_api-0.11.0.dev3}/langgraph_grpc_common/proto/enum_stream_mode_pb2_grpc.py +0 -0
  257. {langgraph_api-0.10.0rc2 → langgraph_api-0.11.0.dev3}/langgraph_grpc_common/proto/enum_stream_mode_pb2_grpc.pyi +0 -0
  258. {langgraph_api-0.10.0rc2 → langgraph_api-0.11.0.dev3}/langgraph_grpc_common/proto/enum_thread_status_pb2.py +0 -0
  259. {langgraph_api-0.10.0rc2 → langgraph_api-0.11.0.dev3}/langgraph_grpc_common/proto/enum_thread_status_pb2.pyi +0 -0
  260. {langgraph_api-0.10.0rc2 → langgraph_api-0.11.0.dev3}/langgraph_grpc_common/proto/enum_thread_status_pb2_grpc.py +0 -0
  261. {langgraph_api-0.10.0rc2 → langgraph_api-0.11.0.dev3}/langgraph_grpc_common/proto/enum_thread_status_pb2_grpc.pyi +0 -0
  262. {langgraph_api-0.10.0rc2 → langgraph_api-0.11.0.dev3}/langgraph_grpc_common/proto/enum_thread_stream_mode_pb2.py +0 -0
  263. {langgraph_api-0.10.0rc2 → langgraph_api-0.11.0.dev3}/langgraph_grpc_common/proto/enum_thread_stream_mode_pb2.pyi +0 -0
  264. {langgraph_api-0.10.0rc2 → langgraph_api-0.11.0.dev3}/langgraph_grpc_common/proto/enum_thread_stream_mode_pb2_grpc.py +0 -0
  265. {langgraph_api-0.10.0rc2 → langgraph_api-0.11.0.dev3}/langgraph_grpc_common/proto/enum_thread_stream_mode_pb2_grpc.pyi +0 -0
  266. {langgraph_api-0.10.0rc2 → langgraph_api-0.11.0.dev3}/langgraph_grpc_common/proto/errors_pb2.py +0 -0
  267. {langgraph_api-0.10.0rc2 → langgraph_api-0.11.0.dev3}/langgraph_grpc_common/proto/errors_pb2.pyi +0 -0
  268. {langgraph_api-0.10.0rc2 → langgraph_api-0.11.0.dev3}/langgraph_grpc_common/proto/errors_pb2_grpc.py +0 -0
  269. {langgraph_api-0.10.0rc2 → langgraph_api-0.11.0.dev3}/langgraph_grpc_common/proto/errors_pb2_grpc.pyi +0 -0
  270. {langgraph_api-0.10.0rc2 → langgraph_api-0.11.0.dev3}/langgraph_grpc_common/serde.py +0 -0
  271. {langgraph_api-0.10.0rc2 → langgraph_api-0.11.0.dev3}/langgraph_license/__init__.py +0 -0
  272. {langgraph_api-0.10.0rc2 → langgraph_api-0.11.0.dev3}/langgraph_license/validation.py +0 -0
  273. {langgraph_api-0.10.0rc2 → langgraph_api-0.11.0.dev3}/langgraph_runtime/__init__.py +0 -0
  274. {langgraph_api-0.10.0rc2 → langgraph_api-0.11.0.dev3}/langgraph_runtime/checkpoint.py +0 -0
  275. {langgraph_api-0.10.0rc2 → langgraph_api-0.11.0.dev3}/langgraph_runtime/database.py +0 -0
  276. {langgraph_api-0.10.0rc2 → langgraph_api-0.11.0.dev3}/langgraph_runtime/lifespan.py +0 -0
  277. {langgraph_api-0.10.0rc2 → langgraph_api-0.11.0.dev3}/langgraph_runtime/metrics.py +0 -0
  278. {langgraph_api-0.10.0rc2 → langgraph_api-0.11.0.dev3}/langgraph_runtime/ops.py +0 -0
  279. {langgraph_api-0.10.0rc2 → langgraph_api-0.11.0.dev3}/langgraph_runtime/queue.py +0 -0
  280. {langgraph_api-0.10.0rc2 → langgraph_api-0.11.0.dev3}/langgraph_runtime/retry.py +0 -0
  281. {langgraph_api-0.10.0rc2 → langgraph_api-0.11.0.dev3}/langgraph_runtime/routes.py +0 -0
  282. {langgraph_api-0.10.0rc2 → langgraph_api-0.11.0.dev3}/langgraph_runtime/store.py +0 -0
  283. {langgraph_api-0.10.0rc2 → langgraph_api-0.11.0.dev3}/logging.json +0 -0
  284. {langgraph_api-0.10.0rc2 → langgraph_api-0.11.0.dev3}/openapi.json +0 -0
  285. {langgraph_api-0.10.0rc2 → langgraph_api-0.11.0.dev3}/scripts/build_wheel.py +0 -0
  286. {langgraph_api-0.10.0rc2 → langgraph_api-0.11.0.dev3}/scripts/create_license.py +0 -0
  287. {langgraph_api-0.10.0rc2 → langgraph_api-0.11.0.dev3}/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.10.0rc2
3
+ Version: 0.11.0.dev3
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
@@ -22,8 +22,10 @@ Requires-Dist: langgraph<2,>=0.4.10
22
22
  Requires-Dist: langsmith[otel]>=0.6.3
23
23
  Requires-Dist: opentelemetry-api>=0.0.1
24
24
  Requires-Dist: opentelemetry-exporter-otlp-proto-http>=0.0.1
25
+ Requires-Dist: opentelemetry-exporter-prometheus>=0.62b1
25
26
  Requires-Dist: opentelemetry-sdk>=0.0.1
26
27
  Requires-Dist: orjson>=3.9.7
28
+ Requires-Dist: prometheus-client>=0.0.1
27
29
  Requires-Dist: protobuf<7.0.0,>=6.32.1
28
30
  Requires-Dist: pyjwt>=2.9.0
29
31
  Requires-Dist: sse-starlette<3.4.0,>=2.1.3
@@ -0,0 +1 @@
1
+ __version__ = "0.11.0.dev3"
@@ -578,6 +578,8 @@ METRIC_MAX_EMITTING_TIER = env(
578
578
  "METRIC_MAX_EMITTING_TIER", cast=int, default=_METRIC_MAX_EMITTING_TIER_DEFAULT
579
579
  )
580
580
  DATADOG_METRICS_ENABLED = bool(LSD_DD_API_KEY)
581
+ LSD_PROM_METRICS_ENABLED = env("LSD_PROM_METRICS_ENABLED", cast=bool, default=False)
582
+ LSD_PROM_METRICS_PORT = env("LSD_PROM_METRICS_PORT", cast=int, default=9464)
581
583
  LANGGRAPH_LOGS_ENDPOINT = env("LANGGRAPH_LOGS_ENDPOINT", cast=str, default=None)
582
584
  LANGGRAPH_LOGS_ENABLED = env("LANGGRAPH_LOGS_ENABLED", cast=bool, default=False)
583
585
 
@@ -672,6 +674,8 @@ __all__ = [
672
674
  "LSD_GRPC_SERVER_ADDRESS",
673
675
  "LSD_GRPC_SERVER_MAX_RECV_MSG_BYTES",
674
676
  "LSD_GRPC_SERVER_MAX_SEND_MSG_BYTES",
677
+ "LSD_PROM_METRICS_ENABLED",
678
+ "LSD_PROM_METRICS_PORT",
675
679
  "MAX_STREAM_CHUNK_SIZE_BYTES",
676
680
  "METRIC_MAX_EMITTING_TIER",
677
681
  "METRIC_PREFIX",
@@ -39,7 +39,7 @@ from langgraph_api.event_streaming.types import (
39
39
  NamespaceInfo,
40
40
  Subscription,
41
41
  )
42
- from langgraph_api.metrics_datadog import (
42
+ from langgraph_api.metrics_otlp import (
43
43
  COUNTER_PROTOCOL_V2_BUFFER_EVICTED,
44
44
  COUNTER_PROTOCOL_V2_EVENT_EMITTED,
45
45
  COUNTER_PROTOCOL_V2_RESUME_GAP,
@@ -47,7 +47,7 @@ from langgraph_api.metrics_datadog import (
47
47
  COUNTER_STREAMING_DATA_LOSS,
48
48
  GAUGE_PROTOCOL_V2_BUFFER_SIZE,
49
49
  HISTOGRAM_PROTOCOL_V2_REPLAYED_EVENTS,
50
- get_datadog_metrics_reporter,
50
+ get_otlp_metrics_reporter,
51
51
  )
52
52
 
53
53
  logger = structlog.stdlib.get_logger(__name__)
@@ -937,7 +937,7 @@ class EventStreamingSession:
937
937
 
938
938
  async def _push_event(self, event: dict[str, Any]) -> None:
939
939
  self._buffer.append(event)
940
- reporter = get_datadog_metrics_reporter()
940
+ reporter = get_otlp_metrics_reporter()
941
941
  if len(self._buffer) > self._max_buffer_size:
942
942
  evicted = len(self._buffer) - self._max_buffer_size
943
943
  self._buffer = self._buffer[-self._max_buffer_size :]
@@ -1023,7 +1023,7 @@ class EventStreamingSession:
1023
1023
  min_available_seq = self._buffer[0].get("seq", 0)
1024
1024
  if isinstance(min_available_seq, int) and since + 1 < min_available_seq:
1025
1025
  try:
1026
- get_datadog_metrics_reporter().inc_counter(
1026
+ get_otlp_metrics_reporter().inc_counter(
1027
1027
  COUNTER_PROTOCOL_V2_RESUME_GAP
1028
1028
  )
1029
1029
  except Exception:
@@ -1058,7 +1058,7 @@ class EventStreamingSession:
1058
1058
 
1059
1059
  subscription.active = True
1060
1060
  try:
1061
- get_datadog_metrics_reporter().record_histogram(
1061
+ get_otlp_metrics_reporter().record_histogram(
1062
1062
  HISTOGRAM_PROTOCOL_V2_REPLAYED_EVENTS,
1063
1063
  float(replayed),
1064
1064
  )
@@ -1129,7 +1129,7 @@ class EventStreamingSession:
1129
1129
  # session down shortly after the first failure.
1130
1130
  self._transport_broken = True
1131
1131
  try:
1132
- get_datadog_metrics_reporter().inc_counter(
1132
+ get_otlp_metrics_reporter().inc_counter(
1133
1133
  COUNTER_PROTOCOL_V2_TRANSPORT_SEND_FAILURE,
1134
1134
  attributes={"method": _metric_event_method(message)},
1135
1135
  )
@@ -48,6 +48,16 @@ else:
48
48
  MetricExporter = object
49
49
  OTEL_AVAILABLE = False
50
50
 
51
+ try:
52
+ from opentelemetry.exporter.prometheus import PrometheusMetricReader
53
+ from prometheus_client import start_http_server
54
+
55
+ PROMETHEUS_EXPORTER_AVAILABLE = True
56
+ except ModuleNotFoundError:
57
+ PrometheusMetricReader = None
58
+ start_http_server = None
59
+ PROMETHEUS_EXPORTER_AVAILABLE = False
60
+
51
61
  logger = structlog.stdlib.get_logger(__name__)
52
62
 
53
63
  SERVICE_NAME = "lsd_langgraph_api"
@@ -213,7 +223,7 @@ class _FilteringExporter(MetricExporter):
213
223
  return self._exporter.force_flush(timeout_millis)
214
224
 
215
225
 
216
- class DatadogMetricsReporter:
226
+ class OTelMetricsReporter:
217
227
  def __init__(self) -> None:
218
228
  self._lock = threading.Lock()
219
229
  self._initialized = False
@@ -222,6 +232,8 @@ class DatadogMetricsReporter:
222
232
  self._meter = None
223
233
  self._max_tier = _normalize_emitting_tier(config.METRIC_MAX_EMITTING_TIER)
224
234
  self._instruments: dict[str, Any] = {}
235
+ self._prom_enabled = False
236
+ self._prom_server: Any | None = None
225
237
 
226
238
  @property
227
239
  def enabled(self) -> bool:
@@ -233,12 +245,17 @@ class DatadogMetricsReporter:
233
245
  return
234
246
  self._initialized = True
235
247
 
236
- if not config.DATADOG_METRICS_ENABLED:
237
- logger.info("Datadog metrics disabled (no DD API key configured)")
248
+ if (
249
+ not config.DATADOG_METRICS_ENABLED
250
+ and not config.LSD_PROM_METRICS_ENABLED
251
+ ):
252
+ logger.info(
253
+ "OTel metrics disabled (no DD API key and Prometheus not enabled)"
254
+ )
238
255
  return
239
256
  if not OTEL_AVAILABLE:
240
257
  logger.warning(
241
- "Datadog metrics disabled because OpenTelemetry dependencies are not installed"
258
+ "OTel metrics disabled because OpenTelemetry dependencies are not installed"
242
259
  )
243
260
  return
244
261
 
@@ -247,7 +264,6 @@ class DatadogMetricsReporter:
247
264
  {
248
265
  "service.name": SERVICE_NAME,
249
266
  "host.id": os.getenv("HOSTNAME", ""),
250
- # Not in public docs: these LANGSMITH_* vars are set by SaaS control plane
251
267
  "api_version": os.getenv("LANGSMITH_LANGGRAPH_API_VERSION")
252
268
  or __version__,
253
269
  "project_id": os.getenv("LANGSMITH_HOST_PROJECT_ID", ""),
@@ -260,58 +276,117 @@ class DatadogMetricsReporter:
260
276
  "deployment_type": os.getenv("LSD_DEPLOYMENT_TYPE", ""),
261
277
  }
262
278
  )
263
- base_exporter = OTLPMetricExporter(
264
- endpoint=f"https://{config.LSD_DD_ENDPOINT}/v1/metrics",
265
- headers={
266
- "dd-api-key": config.LSD_DD_API_KEY,
267
- "dd-otel-metric-config": DD_OTEL_METRIC_CONFIG,
268
- },
269
- preferred_temporality={
270
- Counter: AggregationTemporality.DELTA,
271
- Histogram: AggregationTemporality.DELTA,
272
- },
273
- )
274
- # Burn after reading: remove DD keys from env so user code
275
- # and child processes cannot access them.
276
- for key in (
277
- "LSD_DD_API_KEY",
278
- "LSD_DD_ENDPOINT",
279
- ):
280
- os.environ.pop(key, None)
281
-
282
- reader = PeriodicExportingMetricReader(
283
- _FilteringExporter(base_exporter),
284
- export_interval_millis=10_000,
285
- )
279
+
280
+ readers: list[Any] = []
281
+
282
+ if config.DATADOG_METRICS_ENABLED:
283
+ base_exporter = OTLPMetricExporter(
284
+ endpoint=f"https://{config.LSD_DD_ENDPOINT}/v1/metrics",
285
+ headers={
286
+ "dd-api-key": config.LSD_DD_API_KEY,
287
+ "dd-otel-metric-config": DD_OTEL_METRIC_CONFIG,
288
+ },
289
+ preferred_temporality={
290
+ Counter: AggregationTemporality.DELTA,
291
+ Histogram: AggregationTemporality.DELTA,
292
+ },
293
+ )
294
+ # Burn after reading: remove DD keys from env so user code
295
+ # and child processes cannot access them.
296
+ for key in (
297
+ "LSD_DD_API_KEY",
298
+ "LSD_DD_ENDPOINT",
299
+ ):
300
+ os.environ.pop(key, None)
301
+
302
+ readers.append(
303
+ PeriodicExportingMetricReader(
304
+ _FilteringExporter(base_exporter),
305
+ export_interval_millis=10_000,
306
+ )
307
+ )
308
+
309
+ if config.LSD_PROM_METRICS_ENABLED:
310
+ if not PROMETHEUS_EXPORTER_AVAILABLE:
311
+ logger.warning(
312
+ "Prometheus metrics disabled: opentelemetry-exporter-prometheus not installed"
313
+ )
314
+ else:
315
+ # PrometheusMetricReader registers its collector with the
316
+ # global prometheus_client REGISTRY, which start_http_server
317
+ # serves by default. MeterProvider.shutdown() unregisters it.
318
+ readers.append(PrometheusMetricReader())
319
+ self._prom_enabled = True
320
+
321
+ if not readers:
322
+ logger.info(
323
+ "OTel metrics reporter disabled (no backend configured)"
324
+ )
325
+ return
326
+
286
327
  self._meter_provider = MeterProvider(
287
- resource=resource, metric_readers=[reader]
328
+ resource=resource, metric_readers=readers
288
329
  )
289
330
  self._meter = self._meter_provider.get_meter(SERVICE_NAME)
290
331
  self._enabled = True
332
+
333
+ if config.DATADOG_METRICS_ENABLED:
334
+ logger.info(
335
+ "Datadog OTLP metrics reader initialized",
336
+ endpoint=f"https://{config.LSD_DD_ENDPOINT}/v1/metrics",
337
+ )
338
+ if self._prom_enabled:
339
+ self._start_prometheus_server()
340
+
291
341
  logger.info(
292
- "Initialized Datadog metrics reporter",
293
- endpoint=f"https://{config.LSD_DD_ENDPOINT}/v1/metrics",
342
+ "OTel metrics reporter initialized",
294
343
  metric_prefix=METRIC_NAME_PREFIX,
295
344
  max_emitting_tier=self._max_tier,
345
+ backends=[
346
+ b
347
+ for b in (
348
+ "datadog" if config.DATADOG_METRICS_ENABLED else None,
349
+ "prometheus" if self._prom_enabled else None,
350
+ )
351
+ if b
352
+ ],
296
353
  )
297
- logger.info("Datadog metrics reporter initialized")
298
354
  except Exception:
299
355
  self._enabled = False
300
356
  self._meter_provider = None
301
357
  self._meter = None
302
- logger.exception("Failed to initialize Datadog metrics reporter")
358
+ logger.exception("Failed to initialize OTel metrics reporter")
303
359
  raise
304
360
 
361
+ def _start_prometheus_server(self) -> None:
362
+ port = config.LSD_PROM_METRICS_PORT
363
+ # ``start_http_server`` spins up a WSGI server in a daemon thread serving
364
+ # the global prometheus_client REGISTRY, and returns the (server, thread)
365
+ # handle. Keep the server so ``shutdown`` can stop it cleanly (e.g. in
366
+ # tests); in production the daemon thread exits with the process anyway.
367
+ server, _thread = start_http_server(port=port)
368
+ self._prom_server = server
369
+ logger.info("Prometheus metrics scrape server started", port=port)
370
+
305
371
  def shutdown(self) -> None:
306
372
  with self._lock:
307
373
  if self._meter_provider:
308
374
  try:
309
375
  self._meter_provider.shutdown()
310
376
  except Exception:
311
- logger.exception("Failed to shutdown Datadog metrics reporter")
377
+ logger.exception("Failed to shutdown OTel metrics reporter")
312
378
  finally:
313
379
  self._meter_provider = None
314
380
  self._meter = None
381
+ if self._prom_server is not None:
382
+ try:
383
+ self._prom_server.shutdown()
384
+ self._prom_server.server_close()
385
+ except Exception:
386
+ logger.exception("Failed to stop Prometheus scrape server")
387
+ finally:
388
+ self._prom_server = None
389
+ self._prom_enabled = False
315
390
  self._enabled = False
316
391
  self._initialized = False
317
392
  self._instruments.clear()
@@ -352,7 +427,7 @@ class DatadogMetricsReporter:
352
427
  try:
353
428
  instrument.add(value, attributes or {})
354
429
  except Exception:
355
- logger.warning("Failed to add Datadog counter", metric_name=metric.name)
430
+ logger.warning("Failed to add counter", metric_name=metric.name)
356
431
 
357
432
  def record_histogram(
358
433
  self,
@@ -368,9 +443,7 @@ class DatadogMetricsReporter:
368
443
  try:
369
444
  instrument.record(value, attributes or {})
370
445
  except Exception:
371
- logger.warning(
372
- "Failed to record Datadog histogram", metric_name=metric.name
373
- )
446
+ logger.warning("Failed to record histogram", metric_name=metric.name)
374
447
 
375
448
  def record_latency(
376
449
  self,
@@ -391,7 +464,7 @@ class DatadogMetricsReporter:
391
464
  try:
392
465
  instrument.record(value, attributes or {})
393
466
  except Exception:
394
- logger.warning("Failed to record Datadog latency", metric_name=metric.name)
467
+ logger.warning("Failed to record latency", metric_name=metric.name)
395
468
 
396
469
  def record_gauge(
397
470
  self,
@@ -407,7 +480,7 @@ class DatadogMetricsReporter:
407
480
  try:
408
481
  instrument.set(value, attributes or {})
409
482
  except Exception:
410
- logger.warning("Failed to record Datadog gauge", metric_name=metric.name)
483
+ logger.warning("Failed to record gauge", metric_name=metric.name)
411
484
 
412
485
  @contextmanager
413
486
  def track_latency_ms(
@@ -429,11 +502,11 @@ class DatadogMetricsReporter:
429
502
  )
430
503
 
431
504
 
432
- _metrics_reporter: DatadogMetricsReporter | None = None
505
+ _metrics_reporter: OTelMetricsReporter | None = None
433
506
 
434
507
 
435
- def get_datadog_metrics_reporter() -> DatadogMetricsReporter:
508
+ def get_otlp_metrics_reporter() -> OTelMetricsReporter:
436
509
  global _metrics_reporter
437
510
  if _metrics_reporter is None:
438
- _metrics_reporter = DatadogMetricsReporter()
511
+ _metrics_reporter = OTelMetricsReporter()
439
512
  return _metrics_reporter
@@ -44,12 +44,12 @@ from langgraph_api.graph import get_graph
44
44
  from langgraph_api.grpc.ops.runs import StreamPublishException
45
45
  from langgraph_api.js.base import BaseRemotePregel
46
46
  from langgraph_api.metadata import HOST, PLAN, USER_API_URL, incr_nodes
47
- from langgraph_api.metrics_datadog import (
47
+ from langgraph_api.metrics_otlp import (
48
48
  COUNTER_STREAMING_DATA_LOSS,
49
49
  GAUGE_PUBLISH_QUEUE_AVAILABILITY,
50
50
  HISTOGRAM_STREAM_DATA_SIZE,
51
51
  LATENCY_STREAM_PUBLISH,
52
- get_datadog_metrics_reporter,
52
+ get_otlp_metrics_reporter,
53
53
  )
54
54
  from langgraph_api.schema import Run, StreamMode
55
55
  from langgraph_api.serde import json_dumpb
@@ -569,7 +569,7 @@ async def consume(
569
569
  *,
570
570
  thread_id: str | uuid.UUID,
571
571
  ) -> None:
572
- reporter = get_datadog_metrics_reporter()
572
+ reporter = get_otlp_metrics_reporter()
573
573
  stream_modes = stream_modes or set()
574
574
  if "messages-tuple" in stream_modes:
575
575
  stream_modes.add("messages")
@@ -29,7 +29,7 @@ from langgraph_api.feature_flags import IS_POSTGRES_OR_GRPC_BACKEND
29
29
  from langgraph_api.graph import restore_dd_trace_context
30
30
  from langgraph_api.js.errors import RemoteException
31
31
  from langgraph_api.metadata import incr_runs
32
- from langgraph_api.metrics_datadog import (
32
+ from langgraph_api.metrics_otlp import (
33
33
  COUNTER_GRAPH_RECURSION_LIMIT_ERROR,
34
34
  COUNTER_RUN_ATTEMPT_STARTED,
35
35
  COUNTER_RUN_CANCELED_BY_REQUEST,
@@ -39,7 +39,7 @@ from langgraph_api.metrics_datadog import (
39
39
  COUNTER_RUN_SET_STATUS_ERROR,
40
40
  COUNTER_RUN_SUCCESS,
41
41
  LATENCY_RUN_EXECUTION,
42
- get_datadog_metrics_reporter,
42
+ get_otlp_metrics_reporter,
43
43
  )
44
44
  from langgraph_api.otel_context import restore_otel_trace_context
45
45
  from langgraph_api.schema import RUN_KWARGS_ENCRYPTION_SUBFIELDS, Run, StreamMode
@@ -114,7 +114,7 @@ async def worker(
114
114
  *,
115
115
  encryption_context: dict[str, Any] | None = None,
116
116
  ) -> WorkerResult:
117
- reporter = get_datadog_metrics_reporter()
117
+ reporter = get_otlp_metrics_reporter()
118
118
  run_id = run["run_id"]
119
119
  if attempt == 1:
120
120
  incr_runs()
@@ -48,6 +48,8 @@ dependencies = [
48
48
  "opentelemetry-api>=0.0.1",
49
49
  "opentelemetry-sdk>=0.0.1",
50
50
  "opentelemetry-exporter-otlp-proto-http>=0.0.1",
51
+ "opentelemetry-exporter-prometheus>=0.62b1",
52
+ "prometheus-client>=0.0.1",
51
53
  "uuid-utils>=0.12.0",
52
54
  "zstandard>=0.23.0",
53
55
  "langchain-protocol>=0.0.16,<0.1",
@@ -732,8 +732,10 @@ dependencies = [
732
732
  { name = "langsmith", extra = ["otel"] },
733
733
  { name = "opentelemetry-api" },
734
734
  { name = "opentelemetry-exporter-otlp-proto-http" },
735
+ { name = "opentelemetry-exporter-prometheus" },
735
736
  { name = "opentelemetry-sdk" },
736
737
  { name = "orjson" },
738
+ { name = "prometheus-client" },
737
739
  { name = "protobuf" },
738
740
  { name = "pyjwt" },
739
741
  { name = "sse-starlette" },
@@ -793,8 +795,10 @@ requires-dist = [
793
795
  { name = "langsmith", extras = ["otel"], specifier = ">=0.6.3" },
794
796
  { name = "opentelemetry-api", specifier = ">=0.0.1" },
795
797
  { name = "opentelemetry-exporter-otlp-proto-http", specifier = ">=0.0.1" },
798
+ { name = "opentelemetry-exporter-prometheus", specifier = ">=0.62b1" },
796
799
  { name = "opentelemetry-sdk", specifier = ">=0.0.1" },
797
800
  { name = "orjson", specifier = ">=3.9.7" },
801
+ { name = "prometheus-client", specifier = ">=0.0.1" },
798
802
  { name = "protobuf", specifier = ">=6.32.1,<7.0.0" },
799
803
  { name = "pyjwt", specifier = ">=2.9.0" },
800
804
  { name = "sse-starlette", specifier = ">=2.1.3,<3.4.0" },
@@ -1123,6 +1127,20 @@ wheels = [
1123
1127
  { url = "https://files.pythonhosted.org/packages/ba/4d/ef07ff2fc630849f2080ae0ae73a61f67257905b7ac79066640bfa0c5739/opentelemetry_exporter_otlp_proto_http-1.41.1-py3-none-any.whl", hash = "sha256:1a21e8f49c7a946d935551e90947d6c3eb39236723c6624401da0f33d68edcb4", size = 22673, upload-time = "2026-04-24T13:15:21.313Z" },
1124
1128
  ]
1125
1129
 
1130
+ [[package]]
1131
+ name = "opentelemetry-exporter-prometheus"
1132
+ version = "0.62b1"
1133
+ source = { registry = "https://pypi.org/simple" }
1134
+ dependencies = [
1135
+ { name = "opentelemetry-api" },
1136
+ { name = "opentelemetry-sdk" },
1137
+ { name = "prometheus-client" },
1138
+ ]
1139
+ sdist = { url = "https://files.pythonhosted.org/packages/1b/03/e1fbf14386ef171b949b71fba7c18643691a9390ab38c221df582e916569/opentelemetry_exporter_prometheus-0.62b1.tar.gz", hash = "sha256:7ecbac9aa76e7abb44082ab0ff2983e0a573e4091c4653f7db483b02bae03506", size = 15446, upload-time = "2026-04-24T13:15:43.783Z" }
1140
+ wheels = [
1141
+ { url = "https://files.pythonhosted.org/packages/c8/d2/ee4002b88e20c59fae52bed008a63c6f7eff7d498f302032f6b0434a6de7/opentelemetry_exporter_prometheus-0.62b1-py3-none-any.whl", hash = "sha256:7a0b8a6402e107e1f93e38f074a668797e1103936b189561959531a67ffeba55", size = 13278, upload-time = "2026-04-24T13:15:22.485Z" },
1142
+ ]
1143
+
1126
1144
  [[package]]
1127
1145
  name = "opentelemetry-proto"
1128
1146
  version = "1.41.1"
@@ -1314,6 +1332,15 @@ wheels = [
1314
1332
  { url = "https://files.pythonhosted.org/packages/54/20/4d324d65cc6d9205fabedc306948156824eb9f0ee1633355a8f7ec5c66bf/pluggy-1.6.0-py3-none-any.whl", hash = "sha256:e920276dd6813095e9377c0bc5566d94c932c33b27a3e3945d8389c374dd4746", size = 20538, upload-time = "2025-05-15T12:30:06.134Z" },
1315
1333
  ]
1316
1334
 
1335
+ [[package]]
1336
+ name = "prometheus-client"
1337
+ version = "0.25.0"
1338
+ source = { registry = "https://pypi.org/simple" }
1339
+ sdist = { url = "https://files.pythonhosted.org/packages/1b/fb/d9aa83ffe43ce1f19e557c0971d04b90561b0cfd50762aafb01968285553/prometheus_client-0.25.0.tar.gz", hash = "sha256:5e373b75c31afb3c86f1a52fa1ad470c9aace18082d39ec0d2f918d11cc9ba28", size = 86035, upload-time = "2026-04-09T19:53:42.359Z" }
1340
+ wheels = [
1341
+ { url = "https://files.pythonhosted.org/packages/8d/9b/d4b1e644385499c8346fa9b622a3f030dce14cd6ef8a1871c221a17a67e7/prometheus_client-0.25.0-py3-none-any.whl", hash = "sha256:d5aec89e349a6ec230805d0df882f3807f74fd6c1a2fa86864e3c2279059fed1", size = 64154, upload-time = "2026-04-09T19:53:41.324Z" },
1342
+ ]
1343
+
1317
1344
  [[package]]
1318
1345
  name = "protobuf"
1319
1346
  version = "6.33.6"
@@ -1 +0,0 @@
1
- __version__ = "0.10.0rc2"