langchain-postgres 0.0.18__tar.gz → 0.0.19__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 (62) hide show
  1. {langchain_postgres-0.0.18 → langchain_postgres-0.0.19}/PKG-INFO +12 -14
  2. {langchain_postgres-0.0.18 → langchain_postgres-0.0.19}/README.md +11 -13
  3. {langchain_postgres-0.0.18 → langchain_postgres-0.0.19}/langchain_postgres/v2/async_vectorstore.py +13 -15
  4. {langchain_postgres-0.0.18 → langchain_postgres-0.0.19}/pyproject.toml +1 -1
  5. {langchain_postgres-0.0.18 → langchain_postgres-0.0.19}/tests/unit_tests/v2/test_async_pg_vectorstore.py +12 -58
  6. {langchain_postgres-0.0.18 → langchain_postgres-0.0.19}/uv.lock +4 -14
  7. {langchain_postgres-0.0.18 → langchain_postgres-0.0.19}/.github/actions/uv_setup/action.yml +0 -0
  8. {langchain_postgres-0.0.18 → langchain_postgres-0.0.19}/.github/workflows/_lint.yml +0 -0
  9. {langchain_postgres-0.0.18 → langchain_postgres-0.0.19}/.github/workflows/_release.yml +0 -0
  10. {langchain_postgres-0.0.18 → langchain_postgres-0.0.19}/.github/workflows/_test.yml +0 -0
  11. {langchain_postgres-0.0.18 → langchain_postgres-0.0.19}/.github/workflows/ci.yml +0 -0
  12. {langchain_postgres-0.0.18 → langchain_postgres-0.0.19}/.gitignore +0 -0
  13. {langchain_postgres-0.0.18 → langchain_postgres-0.0.19}/CONTRIBUTING.md +0 -0
  14. {langchain_postgres-0.0.18 → langchain_postgres-0.0.19}/DEVELOPMENT.md +0 -0
  15. {langchain_postgres-0.0.18 → langchain_postgres-0.0.19}/LICENSE +0 -0
  16. {langchain_postgres-0.0.18 → langchain_postgres-0.0.19}/Makefile +0 -0
  17. {langchain_postgres-0.0.18 → langchain_postgres-0.0.19}/docker-compose.yml +0 -0
  18. {langchain_postgres-0.0.18 → langchain_postgres-0.0.19}/docs/v2_design_overview.md +0 -0
  19. {langchain_postgres-0.0.18 → langchain_postgres-0.0.19}/examples/migrate_pgvector_to_pgvectorstore.ipynb +0 -0
  20. {langchain_postgres-0.0.18 → langchain_postgres-0.0.19}/examples/migrate_pgvector_to_pgvectorstore.md +0 -0
  21. {langchain_postgres-0.0.18 → langchain_postgres-0.0.19}/examples/pg_vectorstore.ipynb +0 -0
  22. {langchain_postgres-0.0.18 → langchain_postgres-0.0.19}/examples/pg_vectorstore_how_to.ipynb +0 -0
  23. {langchain_postgres-0.0.18 → langchain_postgres-0.0.19}/examples/vectorstore.ipynb +0 -0
  24. {langchain_postgres-0.0.18 → langchain_postgres-0.0.19}/langchain_postgres/__init__.py +0 -0
  25. {langchain_postgres-0.0.18 → langchain_postgres-0.0.19}/langchain_postgres/_utils.py +0 -0
  26. {langchain_postgres-0.0.18 → langchain_postgres-0.0.19}/langchain_postgres/chat_message_histories.py +0 -0
  27. {langchain_postgres-0.0.18 → langchain_postgres-0.0.19}/langchain_postgres/py.typed +0 -0
  28. {langchain_postgres-0.0.18 → langchain_postgres-0.0.19}/langchain_postgres/translator.py +0 -0
  29. {langchain_postgres-0.0.18 → langchain_postgres-0.0.19}/langchain_postgres/utils/pgvector_migrator.py +0 -0
  30. {langchain_postgres-0.0.18 → langchain_postgres-0.0.19}/langchain_postgres/v2/__init__.py +0 -0
  31. {langchain_postgres-0.0.18 → langchain_postgres-0.0.19}/langchain_postgres/v2/engine.py +0 -0
  32. {langchain_postgres-0.0.18 → langchain_postgres-0.0.19}/langchain_postgres/v2/hybrid_search_config.py +0 -0
  33. {langchain_postgres-0.0.18 → langchain_postgres-0.0.19}/langchain_postgres/v2/indexes.py +0 -0
  34. {langchain_postgres-0.0.18 → langchain_postgres-0.0.19}/langchain_postgres/v2/vectorstores.py +0 -0
  35. {langchain_postgres-0.0.18 → langchain_postgres-0.0.19}/langchain_postgres/vectorstores.py +0 -0
  36. {langchain_postgres-0.0.18 → langchain_postgres-0.0.19}/security.md +0 -0
  37. {langchain_postgres-0.0.18 → langchain_postgres-0.0.19}/tests/__init__.py +0 -0
  38. {langchain_postgres-0.0.18 → langchain_postgres-0.0.19}/tests/unit_tests/__init__.py +0 -0
  39. {langchain_postgres-0.0.18 → langchain_postgres-0.0.19}/tests/unit_tests/fake_embeddings.py +0 -0
  40. {langchain_postgres-0.0.18 → langchain_postgres-0.0.19}/tests/unit_tests/fixtures/__init__.py +0 -0
  41. {langchain_postgres-0.0.18 → langchain_postgres-0.0.19}/tests/unit_tests/fixtures/filtering_test_cases.py +0 -0
  42. {langchain_postgres-0.0.18 → langchain_postgres-0.0.19}/tests/unit_tests/fixtures/metadata_filtering_data.py +0 -0
  43. {langchain_postgres-0.0.18 → langchain_postgres-0.0.19}/tests/unit_tests/query_constructors/__init__.py +0 -0
  44. {langchain_postgres-0.0.18 → langchain_postgres-0.0.19}/tests/unit_tests/query_constructors/test_pgvector.py +0 -0
  45. {langchain_postgres-0.0.18 → langchain_postgres-0.0.19}/tests/unit_tests/test_imports.py +0 -0
  46. {langchain_postgres-0.0.18 → langchain_postgres-0.0.19}/tests/unit_tests/v1/__init__.py +0 -0
  47. {langchain_postgres-0.0.18 → langchain_postgres-0.0.19}/tests/unit_tests/v1/test_chat_histories.py +0 -0
  48. {langchain_postgres-0.0.18 → langchain_postgres-0.0.19}/tests/unit_tests/v1/test_vectorstore.py +0 -0
  49. {langchain_postgres-0.0.18 → langchain_postgres-0.0.19}/tests/unit_tests/v1/test_vectorstore_standard_tests.py +0 -0
  50. {langchain_postgres-0.0.18 → langchain_postgres-0.0.19}/tests/unit_tests/v2/__init__.py +0 -0
  51. {langchain_postgres-0.0.18 → langchain_postgres-0.0.19}/tests/unit_tests/v2/test_async_pg_vectorstore_from_methods.py +0 -0
  52. {langchain_postgres-0.0.18 → langchain_postgres-0.0.19}/tests/unit_tests/v2/test_async_pg_vectorstore_index.py +0 -0
  53. {langchain_postgres-0.0.18 → langchain_postgres-0.0.19}/tests/unit_tests/v2/test_async_pg_vectorstore_search.py +0 -0
  54. {langchain_postgres-0.0.18 → langchain_postgres-0.0.19}/tests/unit_tests/v2/test_engine.py +0 -0
  55. {langchain_postgres-0.0.18 → langchain_postgres-0.0.19}/tests/unit_tests/v2/test_hybrid_search_config.py +0 -0
  56. {langchain_postgres-0.0.18 → langchain_postgres-0.0.19}/tests/unit_tests/v2/test_indexes.py +0 -0
  57. {langchain_postgres-0.0.18 → langchain_postgres-0.0.19}/tests/unit_tests/v2/test_pg_vectorstore.py +0 -0
  58. {langchain_postgres-0.0.18 → langchain_postgres-0.0.19}/tests/unit_tests/v2/test_pg_vectorstore_from_methods.py +0 -0
  59. {langchain_postgres-0.0.18 → langchain_postgres-0.0.19}/tests/unit_tests/v2/test_pg_vectorstore_index.py +0 -0
  60. {langchain_postgres-0.0.18 → langchain_postgres-0.0.19}/tests/unit_tests/v2/test_pg_vectorstore_search.py +0 -0
  61. {langchain_postgres-0.0.18 → langchain_postgres-0.0.19}/tests/unit_tests/v2/test_pg_vectorstore_standard_suite.py +0 -0
  62. {langchain_postgres-0.0.18 → langchain_postgres-0.0.19}/tests/utils.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.5
2
2
  Name: langchain-postgres
3
- Version: 0.0.18
3
+ Version: 0.0.19
4
4
  Summary: An integration package connecting Postgres and LangChain
5
5
  License-Expression: MIT
6
6
  License-File: LICENSE
@@ -85,7 +85,7 @@ store = PGVectorStore.create_sync(
85
85
  docs = [
86
86
  Document(page_content="Apples and oranges"),
87
87
  Document(page_content="Cars and airplanes"),
88
- Document(page_content="Train")
88
+ Document(page_content="Train"),
89
89
  ]
90
90
 
91
91
  store.add_documents(docs)
@@ -107,9 +107,7 @@ vs = PGVectorStore.create_sync(
107
107
  engine=engine,
108
108
  table_name=TABLE_NAME,
109
109
  embedding_service=embedding,
110
- hybrid_search_config=HybridSearchConfig(
111
- fusion_function=reciprocal_rank_fusion
112
- ),
110
+ hybrid_search_config=HybridSearchConfig(fusion_function=reciprocal_rank_fusion),
113
111
  )
114
112
  hybrid_docs = vector_store.similarity_search("products", k=5)
115
113
  ```
@@ -138,7 +136,7 @@ import psycopg
138
136
 
139
137
  # Establish a synchronous connection to the database
140
138
  # (or use psycopg.AsyncConnection for async)
141
- conn_info = ... # Fill in with your connection info
139
+ conn_info = ... # Fill in with your connection info
142
140
  sync_connection = psycopg.connect(conn_info)
143
141
 
144
142
  # Create the table schema (only needs to be done once)
@@ -149,17 +147,17 @@ session_id = str(uuid.uuid4())
149
147
 
150
148
  # Initialize the chat history manager
151
149
  chat_history = PostgresChatMessageHistory(
152
- table_name,
153
- session_id,
154
- sync_connection=sync_connection
150
+ table_name, session_id, sync_connection=sync_connection
155
151
  )
156
152
 
157
153
  # Add messages to the chat history
158
- chat_history.add_messages([
159
- SystemMessage(content="Meow"),
160
- AIMessage(content="woof"),
161
- HumanMessage(content="bark"),
162
- ])
154
+ chat_history.add_messages(
155
+ [
156
+ SystemMessage(content="Meow"),
157
+ AIMessage(content="woof"),
158
+ HumanMessage(content="bark"),
159
+ ]
160
+ )
163
161
 
164
162
  print(chat_history.messages)
165
163
  ```
@@ -69,7 +69,7 @@ store = PGVectorStore.create_sync(
69
69
  docs = [
70
70
  Document(page_content="Apples and oranges"),
71
71
  Document(page_content="Cars and airplanes"),
72
- Document(page_content="Train")
72
+ Document(page_content="Train"),
73
73
  ]
74
74
 
75
75
  store.add_documents(docs)
@@ -91,9 +91,7 @@ vs = PGVectorStore.create_sync(
91
91
  engine=engine,
92
92
  table_name=TABLE_NAME,
93
93
  embedding_service=embedding,
94
- hybrid_search_config=HybridSearchConfig(
95
- fusion_function=reciprocal_rank_fusion
96
- ),
94
+ hybrid_search_config=HybridSearchConfig(fusion_function=reciprocal_rank_fusion),
97
95
  )
98
96
  hybrid_docs = vector_store.similarity_search("products", k=5)
99
97
  ```
@@ -122,7 +120,7 @@ import psycopg
122
120
 
123
121
  # Establish a synchronous connection to the database
124
122
  # (or use psycopg.AsyncConnection for async)
125
- conn_info = ... # Fill in with your connection info
123
+ conn_info = ... # Fill in with your connection info
126
124
  sync_connection = psycopg.connect(conn_info)
127
125
 
128
126
  # Create the table schema (only needs to be done once)
@@ -133,17 +131,17 @@ session_id = str(uuid.uuid4())
133
131
 
134
132
  # Initialize the chat history manager
135
133
  chat_history = PostgresChatMessageHistory(
136
- table_name,
137
- session_id,
138
- sync_connection=sync_connection
134
+ table_name, session_id, sync_connection=sync_connection
139
135
  )
140
136
 
141
137
  # Add messages to the chat history
142
- chat_history.add_messages([
143
- SystemMessage(content="Meow"),
144
- AIMessage(content="woof"),
145
- HumanMessage(content="bark"),
146
- ])
138
+ chat_history.add_messages(
139
+ [
140
+ SystemMessage(content="Meow"),
141
+ AIMessage(content="woof"),
142
+ HumanMessage(content="bark"),
143
+ ]
144
+ )
147
145
 
148
146
  print(chat_history.messages)
149
147
  ```
@@ -119,6 +119,15 @@ class AsyncPGVectorStore(VectorStore):
119
119
  "Only create class through 'create' or 'create_sync' methods!"
120
120
  )
121
121
 
122
+ if hasattr(embedding_service, "embed_query_inline") and not hasattr(
123
+ embedding_service, "embed_query_inline_template"
124
+ ):
125
+ raise ValueError(
126
+ "The provided embedding_service is using an outdated inline embedding implementation "
127
+ "that is susceptible to SQL injection. Please update your package "
128
+ "to a version that supports 'embed_query_inline_template'."
129
+ )
130
+
122
131
  self.engine = engine
123
132
  self.embedding_service = embedding_service
124
133
  self.table_name = table_name
@@ -295,8 +304,7 @@ class AsyncPGVectorStore(VectorStore):
295
304
  self.embedding_service, "embed_query_inline_template", None
296
305
  )
297
306
  can_inline_embed_template = callable(inline_template_func)
298
- inline_embed_func = getattr(self.embedding_service, "embed_query_inline", None)
299
- can_inline_embed = callable(inline_embed_func)
307
+
300
308
  # Insert embeddings
301
309
  for id, content, embedding, metadata in zip(ids, texts, embeddings, metadatas):
302
310
  metadata_col_names = (
@@ -319,8 +327,6 @@ class AsyncPGVectorStore(VectorStore):
319
327
 
320
328
  if not embedding and can_inline_embed_template:
321
329
  values_stmt = f"VALUES (:langchain_id, :content, {inline_template_func(':content')}" # type: ignore
322
- elif not embedding and can_inline_embed:
323
- values_stmt = f"VALUES (:langchain_id, :content, {self.embedding_service.embed_query_inline(content)}" # type: ignore
324
330
 
325
331
  if self.hybrid_search_config and self.hybrid_search_config.tsv_column:
326
332
  lang = (
@@ -392,8 +398,7 @@ class AsyncPGVectorStore(VectorStore):
392
398
  inline_template_func = getattr(
393
399
  self.embedding_service, "embed_query_inline_template", None
394
400
  )
395
- inline_embed_func = getattr(self.embedding_service, "embed_query_inline", None)
396
- if callable(inline_template_func) or callable(inline_embed_func):
401
+ if callable(inline_template_func):
397
402
  embeddings: list[list[float]] = [[] for _ in list(texts)]
398
403
  else:
399
404
  embeddings = await self.embedding_service.aembed_documents(list(texts))
@@ -676,15 +681,10 @@ class AsyncPGVectorStore(VectorStore):
676
681
  inline_template_func = getattr(
677
682
  self.embedding_service, "embed_query_inline_template", None
678
683
  )
679
- inline_embed_func = getattr(self.embedding_service, "embed_query_inline", None)
680
684
  param_dict: dict[str, Any] = {"dense_limit": dense_limit}
681
685
  if not embedding and callable(inline_template_func) and "query" in kwargs:
682
686
  embedding_data_string = inline_template_func(":query_text")
683
687
  param_dict["query_text"] = kwargs["query"]
684
- elif not embedding and callable(inline_embed_func) and "query" in kwargs:
685
- query_embedding = self.embedding_service.embed_query_inline(kwargs["query"]) # type: ignore
686
- embedding_data_string = f"{query_embedding}"
687
- param_dict["query_embedding"] = query_embedding
688
688
  else:
689
689
  query_embedding = f"{[float(dimension) for dimension in embedding]}"
690
690
  embedding_data_string = ":query_embedding"
@@ -789,10 +789,9 @@ class AsyncPGVectorStore(VectorStore):
789
789
  inline_template_func = getattr(
790
790
  self.embedding_service, "embed_query_inline_template", None
791
791
  )
792
- inline_embed_func = getattr(self.embedding_service, "embed_query_inline", None)
793
792
  embedding = (
794
793
  []
795
- if callable(inline_template_func) or callable(inline_embed_func)
794
+ if callable(inline_template_func)
796
795
  else await self.embedding_service.aembed_query(text=query)
797
796
  )
798
797
  kwargs["query"] = query
@@ -831,10 +830,9 @@ class AsyncPGVectorStore(VectorStore):
831
830
  inline_template_func = getattr(
832
831
  self.embedding_service, "embed_query_inline_template", None
833
832
  )
834
- inline_embed_func = getattr(self.embedding_service, "embed_query_inline", None)
835
833
  embedding = (
836
834
  []
837
- if callable(inline_template_func) or callable(inline_embed_func)
835
+ if callable(inline_template_func)
838
836
  else await self.embedding_service.aembed_query(text=query)
839
837
  )
840
838
  kwargs["query"] = query
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "langchain-postgres"
3
- version = "0.0.18"
3
+ version = "0.0.19"
4
4
  description = "An integration package connecting Postgres and LangChain"
5
5
  authors = []
6
6
  readme = "README.md"
@@ -572,36 +572,6 @@ class TestVectorStore:
572
572
  assert ":content, embedding('model_id', :content)::vector" in sql_text
573
573
  assert params["content"] == "hello world"
574
574
 
575
- async def test_aadd_embeddings_with_legacy_inline(self) -> None:
576
- class LegacyEmbeddings(Embeddings):
577
- def embed_documents(self, texts: list[str]) -> list[list[float]]:
578
- return []
579
-
580
- def embed_query(self, text: str) -> list[float]:
581
- return []
582
-
583
- def embed_query_inline(self, query: str) -> str:
584
- return f"embedding('model_id', '{query}')::vector"
585
-
586
- mock_conn = AsyncMock()
587
- mock_engine = MagicMock()
588
- mock_engine.connect.return_value.__aenter__.return_value = mock_conn
589
- mock_engine.connect.return_value.__aexit__.return_value = None
590
-
591
- create_key = getattr(AsyncPGVectorStore, "_AsyncPGVectorStore__create_key")
592
- vs = AsyncPGVectorStore(
593
- create_key,
594
- engine=mock_engine,
595
- embedding_service=LegacyEmbeddings(),
596
- table_name="test_table",
597
- )
598
- await vs.aadd_embeddings(texts=["hello world"], embeddings=[[]])
599
- call_args = mock_conn.execute.call_args
600
- sql_text = str(call_args[0][0])
601
- params = call_args[0][1]
602
- assert "embedding('model_id', 'hello world')::vector" in sql_text
603
- assert params["content"] == "hello world"
604
-
605
575
  async def test_asimilarity_search_with_inline_template(self) -> None:
606
576
  class TemplateEmbeddings(Embeddings):
607
577
  def embed_documents(self, texts: list[str]) -> list[list[float]]:
@@ -638,8 +608,8 @@ class TestVectorStore:
638
608
  assert "embedding('model_id', :query_text)::vector" in sql_text
639
609
  assert params["query_text"] == "search query"
640
610
 
641
- async def test_asimilarity_search_with_legacy_inline(self) -> None:
642
- class LegacyEmbeddings(Embeddings):
611
+ async def test_init_raises_for_outdated_inline_embedding(self) -> None:
612
+ class OutdatedAlloyDBEmbeddings(Embeddings):
643
613
  def embed_documents(self, texts: list[str]) -> list[list[float]]:
644
614
  return []
645
615
 
@@ -649,30 +619,14 @@ class TestVectorStore:
649
619
  def embed_query_inline(self, query: str) -> str:
650
620
  return f"embedding('model_id', '{query}')::vector"
651
621
 
652
- mock_conn = AsyncMock()
653
- mock_result = MagicMock()
654
- mock_result.mappings.return_value.fetchall.return_value = []
655
- mock_conn.execute.return_value = mock_result
656
-
657
- mock_engine = MagicMock()
658
- mock_engine.connect.return_value.__aenter__.return_value = mock_conn
659
- mock_engine.connect.return_value.__aexit__.return_value = None
660
-
661
622
  create_key = getattr(AsyncPGVectorStore, "_AsyncPGVectorStore__create_key")
662
- vs = AsyncPGVectorStore(
663
- create_key,
664
- engine=mock_engine,
665
- embedding_service=LegacyEmbeddings(),
666
- table_name="test_table",
667
- )
668
- await vs.asimilarity_search_with_score_by_vector(
669
- embedding=[], query="legacy search"
670
- )
671
- call_args = mock_conn.execute.call_args
672
- sql_text = str(call_args[0][0])
673
- params = call_args[0][1]
674
- assert "embedding('model_id', 'legacy search')::vector" in sql_text
675
- assert (
676
- params["query_embedding"]
677
- == "embedding('model_id', 'legacy search')::vector"
678
- )
623
+
624
+ with pytest.raises(
625
+ ValueError, match="outdated inline embedding implementation"
626
+ ):
627
+ AsyncPGVectorStore(
628
+ create_key,
629
+ engine=None, # type: ignore
630
+ embedding_service=OutdatedAlloyDBEmbeddings(),
631
+ table_name="test_table",
632
+ )
@@ -21,17 +21,16 @@ wheels = [
21
21
 
22
22
  [[package]]
23
23
  name = "anyio"
24
- version = "4.11.0"
24
+ version = "4.14.2"
25
25
  source = { registry = "https://pypi.org/simple" }
26
26
  dependencies = [
27
27
  { name = "exceptiongroup", marker = "python_full_version < '3.11'" },
28
28
  { name = "idna" },
29
- { name = "sniffio" },
30
29
  { name = "typing-extensions", marker = "python_full_version < '3.13'" },
31
30
  ]
32
- sdist = { url = "https://files.pythonhosted.org/packages/c6/78/7d432127c41b50bccba979505f272c16cbcadcc33645d5fa3a738110ae75/anyio-4.11.0.tar.gz", hash = "sha256:82a8d0b81e318cc5ce71a5f1f8b5c4e63619620b63141ef8c995fa0db95a57c4", size = 219094, upload-time = "2025-09-23T09:19:12.58Z" }
31
+ sdist = { url = "https://files.pythonhosted.org/packages/61/cc/a381afa6efea9f496eff839d4a6a1aed3bfafc7b3ab4b0d1b243a12573dd/anyio-4.14.2.tar.gz", hash = "sha256:cfa139f3ed1a23ee8f88a145ddb5ac7605b8bbfd8592baacd7ce3d8bb4313c7f", size = 260176, upload-time = "2026-07-12T20:29:07.082Z" }
33
32
  wheels = [
34
- { url = "https://files.pythonhosted.org/packages/15/b3/9b1a8074496371342ec1e796a96f99c82c945a339cd81a8e73de28b4cf9e/anyio-4.11.0-py3-none-any.whl", hash = "sha256:0287e96f4d26d4149305414d4e3bc32f0dcd0862365a4bddea19d7a1ec38c4fc", size = 109097, upload-time = "2025-09-23T09:19:10.601Z" },
33
+ { url = "https://files.pythonhosted.org/packages/da/35/f2287558c17e29fafc8ef3daf819bb9834061cfa43bff8014f7df7f63bdc/anyio-4.14.2-py3-none-any.whl", hash = "sha256:9f505dda5ac9f0c8309b5e8bd445a8c2bf7246f3ce950121e45ea15bc41d1494", size = 125813, upload-time = "2026-07-12T20:29:05.763Z" },
35
34
  ]
36
35
 
37
36
  [[package]]
@@ -568,7 +567,7 @@ wheels = [
568
567
 
569
568
  [[package]]
570
569
  name = "langchain-postgres"
571
- version = "0.0.17"
570
+ version = "0.0.19"
572
571
  source = { editable = "." }
573
572
  dependencies = [
574
573
  { name = "asyncpg" },
@@ -1511,15 +1510,6 @@ wheels = [
1511
1510
  { url = "https://files.pythonhosted.org/packages/b8/81/4b6387be7014858d924b843530e1b2a8e531846807516e9bea2ee0936bf7/ruff-0.14.1-py3-none-win_arm64.whl", hash = "sha256:e3b443c4c9f16ae850906b8d0a707b2a4c16f8d2f0a7fe65c475c5886665ce44", size = 12436636, upload-time = "2025-10-16T18:05:38.995Z" },
1512
1511
  ]
1513
1512
 
1514
- [[package]]
1515
- name = "sniffio"
1516
- version = "1.3.1"
1517
- source = { registry = "https://pypi.org/simple" }
1518
- sdist = { url = "https://files.pythonhosted.org/packages/a2/87/a6771e1546d97e7e041b6ae58d80074f81b7d5121207425c964ddf5cfdbd/sniffio-1.3.1.tar.gz", hash = "sha256:f4324edc670a0f49750a81b895f35c3adb843cca46f0530f79fc1babb23789dc", size = 20372, upload-time = "2024-02-25T23:20:04.057Z" }
1519
- wheels = [
1520
- { url = "https://files.pythonhosted.org/packages/e9/44/75a9c9421471a6c4805dbf2356f7c181a29c1879239abab1ea2cc8f38b40/sniffio-1.3.1-py3-none-any.whl", hash = "sha256:2f6da418d1f1e0fddd844478f41680e794e6051915791a034ff65e5f100525a2", size = 10235, upload-time = "2024-02-25T23:20:01.196Z" },
1521
- ]
1522
-
1523
1513
  [[package]]
1524
1514
  name = "sqlalchemy"
1525
1515
  version = "2.0.44"