langgraph-runtime-inmem 0.30.2__tar.gz → 0.31.0__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 (18) hide show
  1. {langgraph_runtime_inmem-0.30.2 → langgraph_runtime_inmem-0.31.0}/PKG-INFO +2 -2
  2. {langgraph_runtime_inmem-0.30.2 → langgraph_runtime_inmem-0.31.0}/langgraph_runtime_inmem/__init__.py +1 -1
  3. {langgraph_runtime_inmem-0.30.2 → langgraph_runtime_inmem-0.31.0}/langgraph_runtime_inmem/lifespan.py +35 -0
  4. {langgraph_runtime_inmem-0.30.2 → langgraph_runtime_inmem-0.31.0}/langgraph_runtime_inmem/ops.py +21 -22
  5. {langgraph_runtime_inmem-0.30.2 → langgraph_runtime_inmem-0.31.0}/pyproject.toml +1 -1
  6. {langgraph_runtime_inmem-0.30.2 → langgraph_runtime_inmem-0.31.0}/uv.lock +26 -26
  7. {langgraph_runtime_inmem-0.30.2 → langgraph_runtime_inmem-0.31.0}/.gitignore +0 -0
  8. {langgraph_runtime_inmem-0.30.2 → langgraph_runtime_inmem-0.31.0}/Makefile +0 -0
  9. {langgraph_runtime_inmem-0.30.2 → langgraph_runtime_inmem-0.31.0}/README.md +0 -0
  10. {langgraph_runtime_inmem-0.30.2 → langgraph_runtime_inmem-0.31.0}/langgraph_runtime_inmem/_persistence.py +0 -0
  11. {langgraph_runtime_inmem-0.30.2 → langgraph_runtime_inmem-0.31.0}/langgraph_runtime_inmem/checkpoint.py +0 -0
  12. {langgraph_runtime_inmem-0.30.2 → langgraph_runtime_inmem-0.31.0}/langgraph_runtime_inmem/database.py +0 -0
  13. {langgraph_runtime_inmem-0.30.2 → langgraph_runtime_inmem-0.31.0}/langgraph_runtime_inmem/inmem_stream.py +0 -0
  14. {langgraph_runtime_inmem-0.30.2 → langgraph_runtime_inmem-0.31.0}/langgraph_runtime_inmem/metrics.py +0 -0
  15. {langgraph_runtime_inmem-0.30.2 → langgraph_runtime_inmem-0.31.0}/langgraph_runtime_inmem/queue.py +0 -0
  16. {langgraph_runtime_inmem-0.30.2 → langgraph_runtime_inmem-0.31.0}/langgraph_runtime_inmem/retry.py +0 -0
  17. {langgraph_runtime_inmem-0.30.2 → langgraph_runtime_inmem-0.31.0}/langgraph_runtime_inmem/routes.py +0 -0
  18. {langgraph_runtime_inmem-0.30.2 → langgraph_runtime_inmem-0.31.0}/langgraph_runtime_inmem/store.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: langgraph-runtime-inmem
3
- Version: 0.30.2
3
+ Version: 0.31.0
4
4
  Summary: Inmem implementation for the LangGraph API server.
5
5
  Author-email: Will Fu-Hinthorn <will@langchain.dev>
6
6
  License: Elastic-2.0
@@ -10,7 +10,7 @@ Requires-Dist: croniter>=1.0.1
10
10
  Requires-Dist: langgraph-checkpoint<5,>=3
11
11
  Requires-Dist: langgraph<2,>=0.4.10
12
12
  Requires-Dist: sse-starlette>=2
13
- Requires-Dist: starlette>=0.37
13
+ Requires-Dist: starlette>=1.3.1
14
14
  Requires-Dist: structlog>23
15
15
  Description-Content-Type: text/markdown
16
16
 
@@ -10,7 +10,7 @@ from langgraph_runtime_inmem import (
10
10
  store,
11
11
  )
12
12
 
13
- __version__ = "0.30.2"
13
+ __version__ = "0.31.0"
14
14
  __all__ = [
15
15
  "ops",
16
16
  "database",
@@ -66,6 +66,17 @@ async def lifespan(
66
66
  await api_checkpointer.start_checkpointer()
67
67
  await start_ui_bundler()
68
68
 
69
+ # OTLP metrics are always exported (Prometheus via /metrics; Datadog when a
70
+ # DD API key is set). The reporter no-ops if OTel deps are unavailable.
71
+ from langgraph_api.metrics_otlp import ( # noqa: PLC0415
72
+ COUNTER_SERVER_STARTED,
73
+ get_otlp_metrics_reporter,
74
+ )
75
+
76
+ reporter = get_otlp_metrics_reporter()
77
+ reporter.initialize()
78
+ reporter.inc_counter(COUNTER_SERVER_STARTED)
79
+
69
80
  async def _log_graph_load_failure(err: graph.GraphLoadError) -> None:
70
81
  cause = err.__cause__ or err.cause
71
82
  log_fields = err.log_fields()
@@ -87,6 +98,11 @@ async def lifespan(
87
98
  taskgroup_name="Lifespan",
88
99
  ) as tg:
89
100
  tg.create_task(metadata_loop())
101
+ from langgraph_api.metrics_collector import ( # noqa: PLC0415
102
+ collector_loop,
103
+ )
104
+
105
+ tg.create_task(collector_loop())
90
106
  await api_store.collect_store_from_env()
91
107
  store_instance = await api_store.get_store()
92
108
  if not api_store.CUSTOM_STORE:
@@ -134,6 +150,15 @@ async def lifespan(
134
150
  except asyncio.CancelledError:
135
151
  pass
136
152
  finally:
153
+ from langgraph_api.metrics_otlp import ( # noqa: PLC0415
154
+ COUNTER_SERVER_REQUESTED_TO_STOP,
155
+ get_otlp_metrics_reporter,
156
+ )
157
+
158
+ # Shutdown has been requested; teardown is starting.
159
+ otlp_reporter = get_otlp_metrics_reporter()
160
+ otlp_reporter.inc_counter(COUNTER_SERVER_REQUESTED_TO_STOP)
161
+
137
162
  await api_store.exit_store()
138
163
  await api_checkpointer.exit_checkpointer()
139
164
  await stop_ui_bundler()
@@ -142,6 +167,16 @@ async def lifespan(
142
167
  await stop_webhook_http_client()
143
168
  await stop_pool()
144
169
 
170
+ if otlp_reporter is not None:
171
+ from langgraph_api.metrics_otlp import ( # noqa: PLC0415
172
+ COUNTER_SERVER_STOPPED,
173
+ )
174
+
175
+ # Teardown completed successfully. Emit before shutting down the
176
+ # reporter so the final OTLP export includes this counter.
177
+ otlp_reporter.inc_counter(COUNTER_SERVER_STOPPED)
178
+ otlp_reporter.shutdown()
179
+
145
180
 
146
181
  async def queue_with_signal():
147
182
  try:
@@ -75,6 +75,23 @@ LANGGRAPH_PY_MINOR = tuple(map(int, __version__.split(".")[:2]))
75
75
  USE_NEW_INTERRUPTS = LANGGRAPH_PY_MINOR >= (0, 6)
76
76
 
77
77
 
78
+ def _run_stream_mode_matches(event_mode: str, stream_mode: list[str] | None) -> bool:
79
+ """Return True if a published run-stream event matches the join filter."""
80
+ if not stream_mode:
81
+ return True
82
+ if event_mode in stream_mode:
83
+ return True
84
+ if (
85
+ "messages" in stream_mode or "messages-tuple" in stream_mode
86
+ ) and event_mode.startswith("messages"):
87
+ return True
88
+ if "|" in event_mode:
89
+ base_mode, _, _ = event_mode.partition("|")
90
+ if base_mode in stream_mode:
91
+ return True
92
+ return False
93
+
94
+
78
95
  def _ensure_uuid(id_: str | uuid.UUID | None) -> uuid.UUID:
79
96
  if isinstance(id_, str):
80
97
  return uuid.UUID(id_)
@@ -2447,6 +2464,7 @@ class Runs(Authenticated):
2447
2464
  if_not_exists: IfNotExists = "reject",
2448
2465
  after_seconds: int = 0,
2449
2466
  ctx: Auth.types.BaseAuthContext | None = None,
2467
+ langsmith_session_name: str | None = None,
2450
2468
  ) -> AsyncIterator[Run]:
2451
2469
  """Create a run."""
2452
2470
  from langgraph_api.schema import Run, Thread # noqa: PLC0415
@@ -2642,6 +2660,7 @@ class Runs(Authenticated):
2642
2660
  multitask_strategy=multitask_strategy,
2643
2661
  created_at=datetime.now(UTC) + timedelta(seconds=after_seconds),
2644
2662
  updated_at=datetime.now(UTC),
2663
+ langsmith_session_name=langsmith_session_name,
2645
2664
  )
2646
2665
  conn.store["runs"].append(new_run)
2647
2666
 
@@ -3036,17 +3055,7 @@ class Runs(Authenticated):
3036
3055
  if mode == "control":
3037
3056
  if payload == b"done":
3038
3057
  return
3039
- elif (
3040
- not stream_mode
3041
- or mode in stream_mode
3042
- or (
3043
- (
3044
- "messages" in stream_mode
3045
- or "messages-tuple" in stream_mode
3046
- )
3047
- and mode.startswith("messages")
3048
- )
3049
- ):
3058
+ elif _run_stream_mode_matches(mode, stream_mode):
3050
3059
  yield mode.encode(), payload, id
3051
3060
  logger.debug(
3052
3061
  "Replayed run event",
@@ -3068,17 +3077,7 @@ class Runs(Authenticated):
3068
3077
  if mode == "control":
3069
3078
  if payload == b"done":
3070
3079
  break
3071
- elif (
3072
- not stream_mode
3073
- or mode in stream_mode
3074
- or (
3075
- (
3076
- "messages" in stream_mode
3077
- or "messages-tuple" in stream_mode
3078
- )
3079
- and mode.startswith("messages")
3080
- )
3081
- ):
3080
+ elif _run_stream_mode_matches(mode, stream_mode):
3082
3081
  # We only return a stream ID if the run is resumable
3083
3082
  stream_id = (
3084
3083
  id
@@ -17,7 +17,7 @@ dependencies = [
17
17
  "langgraph>=0.4.10,<2",
18
18
  "structlog>23",
19
19
  "sse-starlette>=2",
20
- "starlette>=0.37",
20
+ "starlette>=1.3.1",
21
21
  "langgraph-checkpoint>=3,<5",
22
22
  "croniter>=1.0.1",
23
23
  ]
@@ -283,7 +283,7 @@ wheels = [
283
283
 
284
284
  [[package]]
285
285
  name = "langgraph"
286
- version = "1.2.0"
286
+ version = "1.2.1"
287
287
  source = { registry = "https://pypi.org/simple" }
288
288
  dependencies = [
289
289
  { name = "langchain-core" },
@@ -293,22 +293,22 @@ dependencies = [
293
293
  { name = "pydantic" },
294
294
  { name = "xxhash" },
295
295
  ]
296
- sdist = { url = "https://files.pythonhosted.org/packages/58/61/d5d25e783035aa307d289b37e082258a6061c0fb4caa4a284f3bf1e87169/langgraph-1.2.0.tar.gz", hash = "sha256:4a9baaf62afc5d5f63144a50095140a34b9aa9b7cea695d25326d564775348e7", size = 690248, upload-time = "2026-05-12T03:46:39.164Z" }
296
+ sdist = { url = "https://files.pythonhosted.org/packages/1c/8e/34a57e338a319e3b32c1bd183c2a9a04f7f35d683d3f3d8f597f6eacbc4e/langgraph-1.2.1.tar.gz", hash = "sha256:28314f844678d9d307cbd63e7b48b0145bf17177d84b40ee2921061e07b6f966", size = 693750, upload-time = "2026-05-21T18:33:07.478Z" }
297
297
  wheels = [
298
- { url = "https://files.pythonhosted.org/packages/f6/e8/e3304ac0015c2bdb04ad9785e4ed65c788855ce7857ce6104dd2f5d322db/langgraph-1.2.0-py3-none-any.whl", hash = "sha256:03fd5895a8d4b70db1ff63ebc3bacead29dd20cd794a8b1a483e7ec9018f7a65", size = 234262, upload-time = "2026-05-12T03:46:37.971Z" },
298
+ { url = "https://files.pythonhosted.org/packages/73/8c/313912e26866893bd15be9b4ea3442dc86f69270b0ad01a4961d1eba7118/langgraph-1.2.1-py3-none-any.whl", hash = "sha256:5cc4020de8f1e2a048d773f6e9128646a2af8c68a8067ab9cab177a2fcc8d221", size = 235317, upload-time = "2026-05-21T18:33:05.687Z" },
299
299
  ]
300
300
 
301
301
  [[package]]
302
302
  name = "langgraph-checkpoint"
303
- version = "4.1.0"
303
+ version = "4.1.1"
304
304
  source = { registry = "https://pypi.org/simple" }
305
305
  dependencies = [
306
306
  { name = "langchain-core" },
307
307
  { name = "ormsgpack" },
308
308
  ]
309
- sdist = { url = "https://files.pythonhosted.org/packages/02/b4/6005c5dd88ad484fe6235d4c43a0d2cee7e91b08ad85a180985c2662df87/langgraph_checkpoint-4.1.0.tar.gz", hash = "sha256:e5bb304e30fc1363ac8fcb5f7dee5ca2185d77fe475b0d01de2c5f91324c2c21", size = 181942, upload-time = "2026-05-12T03:33:49.888Z" }
309
+ sdist = { url = "https://files.pythonhosted.org/packages/83/47/886af6f886f0bff2273164a45f008694e48a96ff3cd25ff0228f2aa9480e/langgraph_checkpoint-4.1.1.tar.gz", hash = "sha256:6c2bdb530c91f91d7d9c1bd100925d0fc4f498d418c17f3587d1526279482a25", size = 184020, upload-time = "2026-05-22T16:57:38.503Z" }
310
310
  wheels = [
311
- { url = "https://files.pythonhosted.org/packages/93/74/d3be2b41955e20ccd624dba5f6fe9d38dcee385ba470a6e13ed86732fc86/langgraph_checkpoint-4.1.0-py3-none-any.whl", hash = "sha256:8bc2a0466a20c38b865ce6671b42093fd5c041133f32351cae4222e0eeaf7fb5", size = 56047, upload-time = "2026-05-12T03:33:48.548Z" },
311
+ { url = "https://files.pythonhosted.org/packages/bd/b4/71425e3e38be92611300b9cc5e46a5bf98ab23f5ea8a75b73d02a2f1413c/langgraph_checkpoint-4.1.1-py3-none-any.whl", hash = "sha256:25d29144b082827218e7bc3f1e9b0566a4bb007895cd6cc26f66a8428739f56e", size = 56212, upload-time = "2026-05-22T16:57:37.203Z" },
312
312
  ]
313
313
 
314
314
  [[package]]
@@ -371,7 +371,7 @@ requires-dist = [
371
371
  { name = "langgraph", specifier = ">=0.4.10,<2" },
372
372
  { name = "langgraph-checkpoint", specifier = ">=3,<5" },
373
373
  { name = "sse-starlette", specifier = ">=2" },
374
- { name = "starlette", specifier = ">=0.37" },
374
+ { name = "starlette", specifier = ">=1.3.1" },
375
375
  { name = "structlog", specifier = ">23" },
376
376
  ]
377
377
 
@@ -931,27 +931,27 @@ wheels = [
931
931
 
932
932
  [[package]]
933
933
  name = "ruff"
934
- version = "0.15.13"
934
+ version = "0.15.14"
935
935
  source = { registry = "https://pypi.org/simple" }
936
- sdist = { url = "https://files.pythonhosted.org/packages/24/21/a7d5c126d5b557715ef81098f3db2fe20f622a039ff2e626af28d674ab80/ruff-0.15.13.tar.gz", hash = "sha256:f9d89f17f7ba7fb2ed42921f0df75da797a9a5d71bc39049e2c687cf2baf44b7", size = 4678180, upload-time = "2026-05-14T13:44:37.869Z" }
936
+ sdist = { url = "https://files.pythonhosted.org/packages/dc/8a/8bce2894573e9dae6ff4d77fe34ad727d79b9e6238ad288c5638990d90f6/ruff-0.15.14.tar.gz", hash = "sha256:48e866b165be4a9bdbf310f7d3c9a07edef2fe8cd63ffeb4e00bb590506ebf9f", size = 4700910, upload-time = "2026-05-21T14:34:55.177Z" }
937
937
  wheels = [
938
- { url = "https://files.pythonhosted.org/packages/c6/61/11d458dc6ac22504fd8e237b29dfd40504c7fbbcc8930402cfe51a8e63ed/ruff-0.15.13-py3-none-linux_armv6l.whl", hash = "sha256:444b580fc72fd6887e650acd3e575e18cdc79dbcf42fb4030b491057921f61f8", size = 10738279, upload-time = "2026-05-14T13:44:18.7Z" },
939
- { url = "https://files.pythonhosted.org/packages/86/ca/caa871ee7be718c45256fada4e16a218ee3e33f0c4a46b729a60a24912e6/ruff-0.15.13-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:6590d009e7cb7ebf36f83dbdd44a3fa48a0994ff6f1cdc1b08006abe58f98dc7", size = 11124798, upload-time = "2026-05-14T13:44:06.427Z" },
940
- { url = "https://files.pythonhosted.org/packages/d3/19/43f5f2e568dddde567fc41f8471f9432c09563e19d3e617a48cfa52f8f0a/ruff-0.15.13-py3-none-macosx_11_0_arm64.whl", hash = "sha256:1c26d2f66163deeb6e08d8b39fbbe983ce3c71cea06a6d7591cfd1421793c629", size = 10460761, upload-time = "2026-05-14T13:44:04.375Z" },
941
- { url = "https://files.pythonhosted.org/packages/99/df/cf938cd6de3003178f03ad7c1ea2a6c099468c03a35037985070b37e76be/ruff-0.15.13-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9dbd6f94b434f896308e4d57fb7bfde0d02b99f7a64b3bdab0fdfa6a864203a5", size = 10804451, upload-time = "2026-05-14T13:44:25.221Z" },
942
- { url = "https://files.pythonhosted.org/packages/c7/7d/5d0973129b154ded2225729169d7068f26b467760b146493fde138415f23/ruff-0.15.13-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:bf3259f3be4d181bda591da5db2571aed6853c6a048157756448020bc6c5cd22", size = 10534285, upload-time = "2026-05-14T13:44:08.888Z" },
943
- { url = "https://files.pythonhosted.org/packages/1f/e3/6b999bbc66cd51e5f073842bc2a3995e99c5e0e72e16b15e7261f7abf57a/ruff-0.15.13-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ae9c17e5eb4430c154e76abc25d79a318190f5a997f38fb6b114416c5319ffc9", size = 11312063, upload-time = "2026-05-14T13:44:11.274Z" },
944
- { url = "https://files.pythonhosted.org/packages/af/5a/642639e9f5db04f1e97fbd6e091c6fd20725bdf072fb114d00eefb9e6eb8/ruff-0.15.13-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:2e2e39bff6c341f4b577a21b801326fab0b11847f48fcaa83f00a113c9b3cb55", size = 12183079, upload-time = "2026-05-14T13:44:01.634Z" },
945
- { url = "https://files.pythonhosted.org/packages/19/4c/7585735f6b53b0f12de13618b2f7d250a844f018822efc899df2e7b8295f/ruff-0.15.13-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e8d9a8e08013542e94d3220bc5b62cc3e5ef87c5f74bff367d3fac14fab013e6", size = 11440833, upload-time = "2026-05-14T13:43:59.043Z" },
946
- { url = "https://files.pythonhosted.org/packages/e8/31/bf1a0803d077e679cfeee5f2f67290a0fa79c7385b5d9a8c17b9db2c48f0/ruff-0.15.13-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cc411dfebe5eebe55ce041c6ae080eb7668955e866daa2fbb16692a784f1c4ca", size = 11434486, upload-time = "2026-05-14T13:44:27.761Z" },
947
- { url = "https://files.pythonhosted.org/packages/e1/4e/62c9b999875d4f14db80f277c030578f5e249c9852d65b7ac7ad0b43c041/ruff-0.15.13-py3-none-manylinux_2_31_riscv64.whl", hash = "sha256:768494eb08b9cee54e2fd27969966f74db5a57f6eaa7a90fcb3306af34dfc4bd", size = 11385189, upload-time = "2026-05-14T13:44:13.704Z" },
948
- { url = "https://files.pythonhosted.org/packages/fc/89/7e959047a104df3eb12863447c110140191fc5b6c4f379ea2e803fcdb0e4/ruff-0.15.13-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:fb75f9a3a7e42ffe117d734494e6c5e5cb3565d66e12612cb63d0e572a41a5b6", size = 10781380, upload-time = "2026-05-14T13:43:56.734Z" },
949
- { url = "https://files.pythonhosted.org/packages/ff/52/5fd18f3b88cab63e88aa11516b3b4e1e5f720e5c330f8dbe5c26210f41f8/ruff-0.15.13-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:8cb74dd33bb2f6613faf7fc03b660053b5ac4f80e706d5788c6335e2a8048d51", size = 10540605, upload-time = "2026-05-14T13:44:20.748Z" },
950
- { url = "https://files.pythonhosted.org/packages/e8/e0/9e35f338990d3e41a82875ff7053ffe97541dae81c9d02143177f381d572/ruff-0.15.13-py3-none-musllinux_1_2_i686.whl", hash = "sha256:7ef823f817fcd191dc934e984be9cf4094f808effa16f2542ad8e821ba02bbf2", size = 11036554, upload-time = "2026-05-14T13:44:16.256Z" },
951
- { url = "https://files.pythonhosted.org/packages/c2/13/070fb048c24080fba188f66371e2a92785be257ad02242066dc7255ac6e9/ruff-0.15.13-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:f345a13937bd7f09f6f5d19fa0721b0c103e00e7f62bc67089a8e5e037719e0b", size = 11528133, upload-time = "2026-05-14T13:44:22.808Z" },
952
- { url = "https://files.pythonhosted.org/packages/6b/8c/b1e1666aef7fc6555094d73ae6cd981701781ae85b97ceefc0eebd0b4668/ruff-0.15.13-py3-none-win32.whl", hash = "sha256:4044f94208b3b05ba0fc4a4abd0558cf4d6459bd18325eead7fd8cc66f909b41", size = 10721455, upload-time = "2026-05-14T13:44:35.697Z" },
953
- { url = "https://files.pythonhosted.org/packages/ab/a6/870a3e8a50590bb92be184ad928c2922f088b00d9dc5c5ec7b924ee08c22/ruff-0.15.13-py3-none-win_amd64.whl", hash = "sha256:7064884d442b7d477b4e7473d12da7f08851d2b1982763c5d3f388a19468a1a4", size = 11900409, upload-time = "2026-05-14T13:44:30.389Z" },
954
- { url = "https://files.pythonhosted.org/packages/9b/36/9c015cd052fca743dae8cb2aeb16b551444787467db42ceab0fc968865af/ruff-0.15.13-py3-none-win_arm64.whl", hash = "sha256:2471da9bd1068c8c064b5fd9c0c4b6dddffd6369cb1cd68b29993b1709ff1b21", size = 11179336, upload-time = "2026-05-14T13:44:33.026Z" },
938
+ { url = "https://files.pythonhosted.org/packages/b9/c8/74a92c6ff9fcfb4f1f947126d3ebee8389276e161ecc85de5bda7cda51bd/ruff-0.15.14-py3-none-linux_armv6l.whl", hash = "sha256:8dd2db9416e487c8d4b01fa7056bb02c4d05969d4f8d17a08c229c2f4ff3c108", size = 10739177, upload-time = "2026-05-21T14:34:37.332Z" },
939
+ { url = "https://files.pythonhosted.org/packages/45/91/254a35c20acc38a7223c9d2d594af12e794432464f2cdeb52af1dc4a892d/ruff-0.15.14-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:be4ff55af755bd71a00ab3dc6bd7ffc467bd76e0df6881e286c2e3d23e8fb43b", size = 11144969, upload-time = "2026-05-21T14:34:43.978Z" },
940
+ { url = "https://files.pythonhosted.org/packages/56/9e/d13e40f83b8d0a94430e6778ce1d94a43b38cf2efe63278bdd2b4c65abbf/ruff-0.15.14-py3-none-macosx_11_0_arm64.whl", hash = "sha256:48d5909d7d06276ce7dde6d32bfa4b0d4cb2651145cd8ee4b440722cbc77832f", size = 10478207, upload-time = "2026-05-21T14:34:48.378Z" },
941
+ { url = "https://files.pythonhosted.org/packages/8d/f1/b15a7839fa4f332f8acec78e20564f26bb2d866e3d21710b877fd0263000/ruff-0.15.14-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ca8cbfa94c4f90984a67561978602746d4cd27103568f745fa90eee3f0d4107d", size = 10818459, upload-time = "2026-05-21T14:34:22.318Z" },
942
+ { url = "https://files.pythonhosted.org/packages/45/33/53d651177f84f94b400a0e27f8824eeada3dddc9d5ee8aeb048f4352a520/ruff-0.15.14-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:9a6bbc0333f1ab053423bcbf6226477d266ca7cec7738c4c8e3f55647803f3c4", size = 10541800, upload-time = "2026-05-21T14:34:20.209Z" },
943
+ { url = "https://files.pythonhosted.org/packages/b8/a6/868f87e0bf9786ed24b5d0d0ad8676b8a94fd1912f42cddf9cfc7857818a/ruff-0.15.14-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8a24a4f7605d7003a6674d4387651effd939dead3fddd0f36561eb77a9a2e542", size = 11342149, upload-time = "2026-05-21T14:34:46.365Z" },
944
+ { url = "https://files.pythonhosted.org/packages/a7/8b/38cd5c19faffdcc05a408d2b78edccc69492ab9720eadb49ea15ef80d768/ruff-0.15.14-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:049b5326e53ed80978f2fc041a280603f69dd6b0c95464342a2bb4572d9d9e2f", size = 12212563, upload-time = "2026-05-21T14:34:28.579Z" },
945
+ { url = "https://files.pythonhosted.org/packages/3e/4d/a3c5b874a556d5731e3e657aaf04311bb76f0a5c3ec220ed43051be6b64b/ruff-0.15.14-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d4ed42e6696c8dfa5f06728e6441993901f548eb92d73bc472cb5a38d1395fbf", size = 11493299, upload-time = "2026-05-21T14:34:41.836Z" },
946
+ { url = "https://files.pythonhosted.org/packages/1e/c0/56472c251d09858a53e51efbd485b09e1995d8731668b76d52e5dd6ee0f1/ruff-0.15.14-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:715c543cf450c4888251f91c52f1942a800541d9bddd7ac060aa4e6b77ae7cba", size = 11455931, upload-time = "2026-05-21T14:34:57.276Z" },
947
+ { url = "https://files.pythonhosted.org/packages/2c/4a/e2e7b4d8dbf233d4eace59c75bc3435fa6d8bd3bae82d351d4e4300c0fd1/ruff-0.15.14-py3-none-manylinux_2_31_riscv64.whl", hash = "sha256:72ebab6013ec887d439d8b7593737a0a4ffb06d45d209d4e4bf2e92813082d3f", size = 11400794, upload-time = "2026-05-21T14:34:39.773Z" },
948
+ { url = "https://files.pythonhosted.org/packages/97/c7/83c0539fe34c3e09136204d1e75d6052492364e0b3cb05e9465423f567d7/ruff-0.15.14-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:49072d36abdbe97a8dd7f480afe9c675699c0c495d4c84076e2c1203c4550581", size = 10804759, upload-time = "2026-05-21T14:34:31.045Z" },
949
+ { url = "https://files.pythonhosted.org/packages/86/a6/18f2bfc095a2ab4a78745644e428205532ce6653a5d0fa8501572891534d/ruff-0.15.14-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:958522aee105068640c2c2ceae08f413ae44d922f52a1374ac13d6a96032fc93", size = 10539517, upload-time = "2026-05-21T14:34:53.064Z" },
950
+ { url = "https://files.pythonhosted.org/packages/54/3a/5a8b3b69c654d4e4bf1d246ac5b49cbcdac6eaab6905925f8915f31e3b80/ruff-0.15.14-py3-none-musllinux_1_2_i686.whl", hash = "sha256:f3707da619a143a2e8830e2abab8224478d69ace2d28cb6c20543ae97c36bf61", size = 11065169, upload-time = "2026-05-21T14:34:24.484Z" },
951
+ { url = "https://files.pythonhosted.org/packages/ed/c5/8864e4e7925b836ea354b31d57641ec03830564e281a8b6f061f8c3e0ec1/ruff-0.15.14-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:bb01d645694e3ec0102105d07ef2d53703970407d59c04e59d3ba0b7a1d53553", size = 11560214, upload-time = "2026-05-21T14:34:50.975Z" },
952
+ { url = "https://files.pythonhosted.org/packages/36/38/012bf76752e1f89ed50b77b99532d90f3a3e287bc7918e1fc0948ac866ac/ruff-0.15.14-py3-none-win32.whl", hash = "sha256:6d0c1ad2a0ab718d39b6d8fd2217981ce4d625cd96a720095f798fb47d8b13e6", size = 10805548, upload-time = "2026-05-21T14:34:33.453Z" },
953
+ { url = "https://files.pythonhosted.org/packages/d1/b7/4ea2c170f10ad760fff2a5250beb18897719dc8b52b53a24cddbb9dd3f19/ruff-0.15.14-py3-none-win_amd64.whl", hash = "sha256:802342981e056db3851a7836e5b070f8f15f67d4a685ae2a6160939d364b2902", size = 11939523, upload-time = "2026-05-21T14:34:18.077Z" },
954
+ { url = "https://files.pythonhosted.org/packages/62/d5/bc97ff895ec35cf3925d4bd60f3b39d822f377a446906ec9bcc87405e59b/ruff-0.15.14-py3-none-win_arm64.whl", hash = "sha256:ff47b90a9ef6a40c9e2f3b479c1fb78531adf055b94c1eba0a7ba04b31951826", size = 11208607, upload-time = "2026-05-21T14:34:26.525Z" },
955
955
  ]
956
956
 
957
957
  [[package]]