langroid 0.56.8__tar.gz → 0.56.10__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 (144) hide show
  1. {langroid-0.56.8 → langroid-0.56.10}/.gitignore +3 -0
  2. {langroid-0.56.8 → langroid-0.56.10}/PKG-INFO +1 -1
  3. {langroid-0.56.8 → langroid-0.56.10}/langroid/agent/special/doc_chat_agent.py +24 -25
  4. {langroid-0.56.8 → langroid-0.56.10}/langroid/vector_store/qdrantdb.py +19 -1
  5. {langroid-0.56.8 → langroid-0.56.10}/pyproject.toml +1 -1
  6. {langroid-0.56.8 → langroid-0.56.10}/LICENSE +0 -0
  7. {langroid-0.56.8 → langroid-0.56.10}/README.md +0 -0
  8. {langroid-0.56.8 → langroid-0.56.10}/langroid/__init__.py +0 -0
  9. {langroid-0.56.8 → langroid-0.56.10}/langroid/agent/__init__.py +0 -0
  10. {langroid-0.56.8 → langroid-0.56.10}/langroid/agent/base.py +0 -0
  11. {langroid-0.56.8 → langroid-0.56.10}/langroid/agent/batch.py +0 -0
  12. {langroid-0.56.8 → langroid-0.56.10}/langroid/agent/callbacks/__init__.py +0 -0
  13. {langroid-0.56.8 → langroid-0.56.10}/langroid/agent/callbacks/chainlit.py +0 -0
  14. {langroid-0.56.8 → langroid-0.56.10}/langroid/agent/chat_agent.py +0 -0
  15. {langroid-0.56.8 → langroid-0.56.10}/langroid/agent/chat_document.py +0 -0
  16. {langroid-0.56.8 → langroid-0.56.10}/langroid/agent/done_sequence_parser.py +0 -0
  17. {langroid-0.56.8 → langroid-0.56.10}/langroid/agent/openai_assistant.py +0 -0
  18. {langroid-0.56.8 → langroid-0.56.10}/langroid/agent/special/__init__.py +0 -0
  19. {langroid-0.56.8 → langroid-0.56.10}/langroid/agent/special/arangodb/__init__.py +0 -0
  20. {langroid-0.56.8 → langroid-0.56.10}/langroid/agent/special/arangodb/arangodb_agent.py +0 -0
  21. {langroid-0.56.8 → langroid-0.56.10}/langroid/agent/special/arangodb/system_messages.py +0 -0
  22. {langroid-0.56.8 → langroid-0.56.10}/langroid/agent/special/arangodb/tools.py +0 -0
  23. {langroid-0.56.8 → langroid-0.56.10}/langroid/agent/special/arangodb/utils.py +0 -0
  24. {langroid-0.56.8 → langroid-0.56.10}/langroid/agent/special/doc_chat_task.py +0 -0
  25. {langroid-0.56.8 → langroid-0.56.10}/langroid/agent/special/lance_doc_chat_agent.py +0 -0
  26. {langroid-0.56.8 → langroid-0.56.10}/langroid/agent/special/lance_rag/__init__.py +0 -0
  27. {langroid-0.56.8 → langroid-0.56.10}/langroid/agent/special/lance_rag/critic_agent.py +0 -0
  28. {langroid-0.56.8 → langroid-0.56.10}/langroid/agent/special/lance_rag/lance_rag_task.py +0 -0
  29. {langroid-0.56.8 → langroid-0.56.10}/langroid/agent/special/lance_rag/query_planner_agent.py +0 -0
  30. {langroid-0.56.8 → langroid-0.56.10}/langroid/agent/special/lance_tools.py +0 -0
  31. {langroid-0.56.8 → langroid-0.56.10}/langroid/agent/special/neo4j/__init__.py +0 -0
  32. {langroid-0.56.8 → langroid-0.56.10}/langroid/agent/special/neo4j/csv_kg_chat.py +0 -0
  33. {langroid-0.56.8 → langroid-0.56.10}/langroid/agent/special/neo4j/neo4j_chat_agent.py +0 -0
  34. {langroid-0.56.8 → langroid-0.56.10}/langroid/agent/special/neo4j/system_messages.py +0 -0
  35. {langroid-0.56.8 → langroid-0.56.10}/langroid/agent/special/neo4j/tools.py +0 -0
  36. {langroid-0.56.8 → langroid-0.56.10}/langroid/agent/special/relevance_extractor_agent.py +0 -0
  37. {langroid-0.56.8 → langroid-0.56.10}/langroid/agent/special/retriever_agent.py +0 -0
  38. {langroid-0.56.8 → langroid-0.56.10}/langroid/agent/special/sql/__init__.py +0 -0
  39. {langroid-0.56.8 → langroid-0.56.10}/langroid/agent/special/sql/sql_chat_agent.py +0 -0
  40. {langroid-0.56.8 → langroid-0.56.10}/langroid/agent/special/sql/utils/__init__.py +0 -0
  41. {langroid-0.56.8 → langroid-0.56.10}/langroid/agent/special/sql/utils/description_extractors.py +0 -0
  42. {langroid-0.56.8 → langroid-0.56.10}/langroid/agent/special/sql/utils/populate_metadata.py +0 -0
  43. {langroid-0.56.8 → langroid-0.56.10}/langroid/agent/special/sql/utils/system_message.py +0 -0
  44. {langroid-0.56.8 → langroid-0.56.10}/langroid/agent/special/sql/utils/tools.py +0 -0
  45. {langroid-0.56.8 → langroid-0.56.10}/langroid/agent/special/table_chat_agent.py +0 -0
  46. {langroid-0.56.8 → langroid-0.56.10}/langroid/agent/task.py +0 -0
  47. {langroid-0.56.8 → langroid-0.56.10}/langroid/agent/tool_message.py +0 -0
  48. {langroid-0.56.8 → langroid-0.56.10}/langroid/agent/tools/__init__.py +0 -0
  49. {langroid-0.56.8 → langroid-0.56.10}/langroid/agent/tools/duckduckgo_search_tool.py +0 -0
  50. {langroid-0.56.8 → langroid-0.56.10}/langroid/agent/tools/exa_search_tool.py +0 -0
  51. {langroid-0.56.8 → langroid-0.56.10}/langroid/agent/tools/file_tools.py +0 -0
  52. {langroid-0.56.8 → langroid-0.56.10}/langroid/agent/tools/google_search_tool.py +0 -0
  53. {langroid-0.56.8 → langroid-0.56.10}/langroid/agent/tools/mcp/__init__.py +0 -0
  54. {langroid-0.56.8 → langroid-0.56.10}/langroid/agent/tools/mcp/decorators.py +0 -0
  55. {langroid-0.56.8 → langroid-0.56.10}/langroid/agent/tools/mcp/fastmcp_client.py +0 -0
  56. {langroid-0.56.8 → langroid-0.56.10}/langroid/agent/tools/metaphor_search_tool.py +0 -0
  57. {langroid-0.56.8 → langroid-0.56.10}/langroid/agent/tools/orchestration.py +0 -0
  58. {langroid-0.56.8 → langroid-0.56.10}/langroid/agent/tools/recipient_tool.py +0 -0
  59. {langroid-0.56.8 → langroid-0.56.10}/langroid/agent/tools/retrieval_tool.py +0 -0
  60. {langroid-0.56.8 → langroid-0.56.10}/langroid/agent/tools/rewind_tool.py +0 -0
  61. {langroid-0.56.8 → langroid-0.56.10}/langroid/agent/tools/segment_extract_tool.py +0 -0
  62. {langroid-0.56.8 → langroid-0.56.10}/langroid/agent/tools/task_tool.py +0 -0
  63. {langroid-0.56.8 → langroid-0.56.10}/langroid/agent/tools/tavily_search_tool.py +0 -0
  64. {langroid-0.56.8 → langroid-0.56.10}/langroid/agent/xml_tool_message.py +0 -0
  65. {langroid-0.56.8 → langroid-0.56.10}/langroid/cachedb/__init__.py +0 -0
  66. {langroid-0.56.8 → langroid-0.56.10}/langroid/cachedb/base.py +0 -0
  67. {langroid-0.56.8 → langroid-0.56.10}/langroid/cachedb/redis_cachedb.py +0 -0
  68. {langroid-0.56.8 → langroid-0.56.10}/langroid/embedding_models/__init__.py +0 -0
  69. {langroid-0.56.8 → langroid-0.56.10}/langroid/embedding_models/base.py +0 -0
  70. {langroid-0.56.8 → langroid-0.56.10}/langroid/embedding_models/models.py +0 -0
  71. {langroid-0.56.8 → langroid-0.56.10}/langroid/embedding_models/protoc/__init__.py +0 -0
  72. {langroid-0.56.8 → langroid-0.56.10}/langroid/embedding_models/protoc/embeddings.proto +0 -0
  73. {langroid-0.56.8 → langroid-0.56.10}/langroid/embedding_models/protoc/embeddings_pb2.py +0 -0
  74. {langroid-0.56.8 → langroid-0.56.10}/langroid/embedding_models/protoc/embeddings_pb2.pyi +0 -0
  75. {langroid-0.56.8 → langroid-0.56.10}/langroid/embedding_models/protoc/embeddings_pb2_grpc.py +0 -0
  76. {langroid-0.56.8 → langroid-0.56.10}/langroid/embedding_models/remote_embeds.py +0 -0
  77. {langroid-0.56.8 → langroid-0.56.10}/langroid/exceptions.py +0 -0
  78. {langroid-0.56.8 → langroid-0.56.10}/langroid/language_models/__init__.py +0 -0
  79. {langroid-0.56.8 → langroid-0.56.10}/langroid/language_models/azure_openai.py +0 -0
  80. {langroid-0.56.8 → langroid-0.56.10}/langroid/language_models/base.py +0 -0
  81. {langroid-0.56.8 → langroid-0.56.10}/langroid/language_models/config.py +0 -0
  82. {langroid-0.56.8 → langroid-0.56.10}/langroid/language_models/mock_lm.py +0 -0
  83. {langroid-0.56.8 → langroid-0.56.10}/langroid/language_models/model_info.py +0 -0
  84. {langroid-0.56.8 → langroid-0.56.10}/langroid/language_models/openai_gpt.py +0 -0
  85. {langroid-0.56.8 → langroid-0.56.10}/langroid/language_models/prompt_formatter/__init__.py +0 -0
  86. {langroid-0.56.8 → langroid-0.56.10}/langroid/language_models/prompt_formatter/base.py +0 -0
  87. {langroid-0.56.8 → langroid-0.56.10}/langroid/language_models/prompt_formatter/hf_formatter.py +0 -0
  88. {langroid-0.56.8 → langroid-0.56.10}/langroid/language_models/prompt_formatter/llama2_formatter.py +0 -0
  89. {langroid-0.56.8 → langroid-0.56.10}/langroid/language_models/provider_params.py +0 -0
  90. {langroid-0.56.8 → langroid-0.56.10}/langroid/language_models/utils.py +0 -0
  91. {langroid-0.56.8 → langroid-0.56.10}/langroid/mcp/__init__.py +0 -0
  92. {langroid-0.56.8 → langroid-0.56.10}/langroid/mcp/server/__init__.py +0 -0
  93. {langroid-0.56.8 → langroid-0.56.10}/langroid/mytypes.py +0 -0
  94. {langroid-0.56.8 → langroid-0.56.10}/langroid/parsing/__init__.py +0 -0
  95. {langroid-0.56.8 → langroid-0.56.10}/langroid/parsing/agent_chats.py +0 -0
  96. {langroid-0.56.8 → langroid-0.56.10}/langroid/parsing/code_parser.py +0 -0
  97. {langroid-0.56.8 → langroid-0.56.10}/langroid/parsing/document_parser.py +0 -0
  98. {langroid-0.56.8 → langroid-0.56.10}/langroid/parsing/file_attachment.py +0 -0
  99. {langroid-0.56.8 → langroid-0.56.10}/langroid/parsing/md_parser.py +0 -0
  100. {langroid-0.56.8 → langroid-0.56.10}/langroid/parsing/para_sentence_split.py +0 -0
  101. {langroid-0.56.8 → langroid-0.56.10}/langroid/parsing/parse_json.py +0 -0
  102. {langroid-0.56.8 → langroid-0.56.10}/langroid/parsing/parser.py +0 -0
  103. {langroid-0.56.8 → langroid-0.56.10}/langroid/parsing/pdf_utils.py +0 -0
  104. {langroid-0.56.8 → langroid-0.56.10}/langroid/parsing/repo_loader.py +0 -0
  105. {langroid-0.56.8 → langroid-0.56.10}/langroid/parsing/routing.py +0 -0
  106. {langroid-0.56.8 → langroid-0.56.10}/langroid/parsing/search.py +0 -0
  107. {langroid-0.56.8 → langroid-0.56.10}/langroid/parsing/spider.py +0 -0
  108. {langroid-0.56.8 → langroid-0.56.10}/langroid/parsing/table_loader.py +0 -0
  109. {langroid-0.56.8 → langroid-0.56.10}/langroid/parsing/url_loader.py +0 -0
  110. {langroid-0.56.8 → langroid-0.56.10}/langroid/parsing/urls.py +0 -0
  111. {langroid-0.56.8 → langroid-0.56.10}/langroid/parsing/utils.py +0 -0
  112. {langroid-0.56.8 → langroid-0.56.10}/langroid/parsing/web_search.py +0 -0
  113. {langroid-0.56.8 → langroid-0.56.10}/langroid/prompts/__init__.py +0 -0
  114. {langroid-0.56.8 → langroid-0.56.10}/langroid/prompts/dialog.py +0 -0
  115. {langroid-0.56.8 → langroid-0.56.10}/langroid/prompts/prompts_config.py +0 -0
  116. {langroid-0.56.8 → langroid-0.56.10}/langroid/prompts/templates.py +0 -0
  117. {langroid-0.56.8 → langroid-0.56.10}/langroid/py.typed +0 -0
  118. {langroid-0.56.8 → langroid-0.56.10}/langroid/pydantic_v1/__init__.py +0 -0
  119. {langroid-0.56.8 → langroid-0.56.10}/langroid/pydantic_v1/main.py +0 -0
  120. {langroid-0.56.8 → langroid-0.56.10}/langroid/utils/__init__.py +0 -0
  121. {langroid-0.56.8 → langroid-0.56.10}/langroid/utils/algorithms/__init__.py +0 -0
  122. {langroid-0.56.8 → langroid-0.56.10}/langroid/utils/algorithms/graph.py +0 -0
  123. {langroid-0.56.8 → langroid-0.56.10}/langroid/utils/configuration.py +0 -0
  124. {langroid-0.56.8 → langroid-0.56.10}/langroid/utils/constants.py +0 -0
  125. {langroid-0.56.8 → langroid-0.56.10}/langroid/utils/git_utils.py +0 -0
  126. {langroid-0.56.8 → langroid-0.56.10}/langroid/utils/globals.py +0 -0
  127. {langroid-0.56.8 → langroid-0.56.10}/langroid/utils/logging.py +0 -0
  128. {langroid-0.56.8 → langroid-0.56.10}/langroid/utils/object_registry.py +0 -0
  129. {langroid-0.56.8 → langroid-0.56.10}/langroid/utils/output/__init__.py +0 -0
  130. {langroid-0.56.8 → langroid-0.56.10}/langroid/utils/output/citations.py +0 -0
  131. {langroid-0.56.8 → langroid-0.56.10}/langroid/utils/output/printing.py +0 -0
  132. {langroid-0.56.8 → langroid-0.56.10}/langroid/utils/output/status.py +0 -0
  133. {langroid-0.56.8 → langroid-0.56.10}/langroid/utils/pandas_utils.py +0 -0
  134. {langroid-0.56.8 → langroid-0.56.10}/langroid/utils/pydantic_utils.py +0 -0
  135. {langroid-0.56.8 → langroid-0.56.10}/langroid/utils/system.py +0 -0
  136. {langroid-0.56.8 → langroid-0.56.10}/langroid/utils/types.py +0 -0
  137. {langroid-0.56.8 → langroid-0.56.10}/langroid/vector_store/__init__.py +0 -0
  138. {langroid-0.56.8 → langroid-0.56.10}/langroid/vector_store/base.py +0 -0
  139. {langroid-0.56.8 → langroid-0.56.10}/langroid/vector_store/chromadb.py +0 -0
  140. {langroid-0.56.8 → langroid-0.56.10}/langroid/vector_store/lancedb.py +0 -0
  141. {langroid-0.56.8 → langroid-0.56.10}/langroid/vector_store/meilisearch.py +0 -0
  142. {langroid-0.56.8 → langroid-0.56.10}/langroid/vector_store/pineconedb.py +0 -0
  143. {langroid-0.56.8 → langroid-0.56.10}/langroid/vector_store/postgres.py +0 -0
  144. {langroid-0.56.8 → langroid-0.56.10}/langroid/vector_store/weaviatedb.py +0 -0
@@ -145,3 +145,6 @@ dmypy.json
145
145
  *~
146
146
  \#*\#
147
147
  .\#*
148
+ sessions/
149
+ commands/
150
+ .claude/
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: langroid
3
- Version: 0.56.8
3
+ Version: 0.56.10
4
4
  Summary: Harness LLMs with Multi-Agent Programming
5
5
  Author-email: Prasad Chalasani <pchalasani@gmail.com>
6
6
  License: MIT
@@ -149,8 +149,8 @@ class DocChatAgentConfig(ChatAgentConfig):
149
149
  n_fuzzy_neighbor_words: int = 100 # num neighbor words to retrieve for fuzzy match
150
150
  use_fuzzy_match: bool = True
151
151
  use_bm25_search: bool = True
152
- use_reciprocal_rank_fusion: bool = True # ignored if using cross-encoder reranking
153
- cross_encoder_reranking_model: str = (
152
+ use_reciprocal_rank_fusion: bool = False
153
+ cross_encoder_reranking_model: str = ( # ignored if use_reciprocal_rank_fusion=True
154
154
  "cross-encoder/ms-marco-MiniLM-L-6-v2" if has_sentence_transformers else ""
155
155
  )
156
156
  rerank_diversity: bool = True # rerank to maximize diversity?
@@ -249,11 +249,10 @@ class DocChatAgent(ChatAgent):
249
249
  ):
250
250
  logger.warning(
251
251
  """
252
- You have set `use_reciprocal_rank_fusion` to True,
253
- but it will be ignored since you have also set
254
- `cross_encoder_reranking_model` to a non-empty value.
255
- To use RRF (Reciprocal Rank Fusion), set
256
- `cross_encoder_reranking_model` to an empty string.
252
+ Ignoring `cross_encoder_reranking_model` since you have set
253
+ `use_reciprocal_rank_fusion` to True.
254
+ To use cross-encoder reranking, set
255
+ `use_reciprocal_rank_fusion` to False.
257
256
  """
258
257
  )
259
258
 
@@ -315,6 +314,10 @@ class DocChatAgent(ChatAgent):
315
314
  # Note we may have used a vecdb with a config.collection_name
316
315
  # different from the agent's config.vecdb.collection_name!!
317
316
  self.vecdb.delete_collection(collection_name)
317
+ # Close the old vecdb before creating a new one
318
+ old_vecdb = self.vecdb
319
+ if old_vecdb and hasattr(old_vecdb, "close"):
320
+ old_vecdb.close()
318
321
  self.vecdb = VectorStore.create(self.vecdb.config)
319
322
  except Exception as e:
320
323
  logger.warning(
@@ -1113,7 +1116,7 @@ class DocChatAgent(ChatAgent):
1113
1116
  key=lambda x: x[0],
1114
1117
  reverse=True,
1115
1118
  )
1116
- passages = [d for _, d in sorted_pairs[: self.config.n_similar_chunks]]
1119
+ passages = [d for _, d in sorted_pairs]
1117
1120
  return passages
1118
1121
 
1119
1122
  def rerank_with_diversity(self, passages: List[Document]) -> List[Document]:
@@ -1320,10 +1323,7 @@ class DocChatAgent(ChatAgent):
1320
1323
  # TODO: Add score threshold in config
1321
1324
  docs_scores = self.get_similar_chunks_bm25(query, retrieval_multiple)
1322
1325
  id2doc.update({d.id(): d for d, _ in docs_scores})
1323
- if (
1324
- self.config.cross_encoder_reranking_model == ""
1325
- and self.config.use_reciprocal_rank_fusion
1326
- ):
1326
+ if self.config.use_reciprocal_rank_fusion:
1327
1327
  # if we're not re-ranking with a cross-encoder, and have RRF enabled,
1328
1328
  # instead of accumulating the bm25 results into passages,
1329
1329
  # we collect these ranks for Reciprocal Rank Fusion down below.
@@ -1338,10 +1338,7 @@ class DocChatAgent(ChatAgent):
1338
1338
  if self.config.use_fuzzy_match:
1339
1339
  # TODO: Add score threshold in config
1340
1340
  fuzzy_match_doc_scores = self.get_fuzzy_matches(query, retrieval_multiple)
1341
- if (
1342
- self.config.cross_encoder_reranking_model == ""
1343
- and self.config.use_reciprocal_rank_fusion
1344
- ):
1341
+ if self.config.use_reciprocal_rank_fusion:
1345
1342
  # if we're not re-ranking with a cross-encoder,
1346
1343
  # instead of accumulating the fuzzy match results into passages,
1347
1344
  # we collect these ranks for Reciprocal Rank Fusion down below.
@@ -1357,10 +1354,8 @@ class DocChatAgent(ChatAgent):
1357
1354
  # eliminate duplicate ids
1358
1355
  passages = [id2doc[id] for id in id2doc.keys()]
1359
1356
 
1360
- if (
1361
- self.config.cross_encoder_reranking_model == ""
1362
- and self.config.use_reciprocal_rank_fusion
1363
- and (self.config.use_bm25_search or self.config.use_fuzzy_match)
1357
+ if self.config.use_reciprocal_rank_fusion and (
1358
+ self.config.use_bm25_search or self.config.use_fuzzy_match
1364
1359
  ):
1365
1360
  # Since we're not using cross-enocder re-ranking,
1366
1361
  # we need to re-order the retrieved chunks from potentially three
@@ -1382,9 +1377,9 @@ class DocChatAgent(ChatAgent):
1382
1377
  # Use max_rank instead of infinity to avoid bias against
1383
1378
  # single-method docs
1384
1379
  max_rank = self.config.n_similar_chunks * retrieval_multiple
1385
- rank_semantic = id2_rank_semantic.get(id_, max_rank)
1386
- rank_bm25 = id2_rank_bm25.get(id_, max_rank)
1387
- rank_fuzzy = id2_rank_fuzzy.get(id_, max_rank)
1380
+ rank_semantic = id2_rank_semantic.get(id_, max_rank + 1)
1381
+ rank_bm25 = id2_rank_bm25.get(id_, max_rank + 1)
1382
+ rank_fuzzy = id2_rank_fuzzy.get(id_, max_rank + 1)
1388
1383
  c = self.config.reciprocal_rank_fusion_constant
1389
1384
  reciprocal_fusion_score = (
1390
1385
  1 / (rank_semantic + c) + 1 / (rank_bm25 + c) + 1 / (rank_fuzzy + c)
@@ -1421,10 +1416,14 @@ class DocChatAgent(ChatAgent):
1421
1416
  passages_scores = self.add_context_window(passages_scores)
1422
1417
  passages = [p for p, _ in passages_scores]
1423
1418
  # now passages can potentially have a lot of doc chunks,
1424
- # so we re-rank them using a cross-encoder scoring model,
1419
+ # so we re-rank them using a cross-encoder scoring model
1420
+ # (provided that `reciprocal_rank_fusion` is not enabled),
1425
1421
  # and pick top k where k = config..n_similar_chunks
1426
1422
  # https://www.sbert.net/examples/applications/retrieve_rerank
1427
- if self.config.cross_encoder_reranking_model != "":
1423
+ if (
1424
+ self.config.cross_encoder_reranking_model != ""
1425
+ and not self.config.use_reciprocal_rank_fusion
1426
+ ):
1428
1427
  passages = self.rerank_with_cross_encoder(query, passages)
1429
1428
 
1430
1429
  if self.config.rerank_diversity:
@@ -4,7 +4,7 @@ import logging
4
4
  import os
5
5
  import time
6
6
  import uuid
7
- from typing import TYPE_CHECKING, Dict, List, Optional, Sequence, Tuple, TypeVar
7
+ from typing import TYPE_CHECKING, Any, Dict, List, Optional, Sequence, Tuple, TypeVar
8
8
 
9
9
  from dotenv import load_dotenv
10
10
 
@@ -143,6 +143,24 @@ class QdrantDB(VectorStore):
143
143
  config.collection_name, replace=config.replace_collection
144
144
  )
145
145
 
146
+ def close(self) -> None:
147
+ """
148
+ Close the QdrantDB client and release any resources (e.g., file locks).
149
+ This is especially important for local storage to release the .lock file.
150
+ """
151
+ if hasattr(self.client, "close"):
152
+ # QdrantLocal has a close method that releases the lock
153
+ self.client.close()
154
+ logger.info(f"Closed QdrantDB connection for {self.config.storage_path}")
155
+
156
+ def __enter__(self) -> "QdrantDB":
157
+ """Context manager entry."""
158
+ return self
159
+
160
+ def __exit__(self, exc_type: Any, exc_val: Any, exc_tb: Any) -> None:
161
+ """Context manager exit - ensure cleanup even if an exception occurred."""
162
+ self.close()
163
+
146
164
  def clear_empty_collections(self) -> int:
147
165
  coll_names = self.list_collections()
148
166
  n_deletes = 0
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "langroid"
3
- version = "0.56.8"
3
+ version = "0.56.10"
4
4
  authors = [
5
5
  {name = "Prasad Chalasani", email = "pchalasani@gmail.com"},
6
6
  ]
File without changes
File without changes
File without changes