langroid 0.39.2__tar.gz → 0.39.4__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 (131) hide show
  1. {langroid-0.39.2 → langroid-0.39.4}/PKG-INFO +2 -2
  2. {langroid-0.39.2 → langroid-0.39.4}/langroid/agent/special/doc_chat_agent.py +4 -12
  3. {langroid-0.39.2 → langroid-0.39.4}/langroid/language_models/model_info.py +18 -0
  4. {langroid-0.39.2 → langroid-0.39.4}/langroid/language_models/openai_gpt.py +31 -3
  5. {langroid-0.39.2 → langroid-0.39.4}/langroid/parsing/urls.py +7 -2
  6. {langroid-0.39.2 → langroid-0.39.4}/langroid/utils/output/citations.py +31 -1
  7. {langroid-0.39.2 → langroid-0.39.4}/langroid/utils/system.py +1 -5
  8. {langroid-0.39.2 → langroid-0.39.4}/langroid/vector_store/weaviatedb.py +25 -12
  9. {langroid-0.39.2 → langroid-0.39.4}/pyproject.toml +2 -2
  10. {langroid-0.39.2 → langroid-0.39.4}/.gitignore +0 -0
  11. {langroid-0.39.2 → langroid-0.39.4}/LICENSE +0 -0
  12. {langroid-0.39.2 → langroid-0.39.4}/README.md +0 -0
  13. {langroid-0.39.2 → langroid-0.39.4}/langroid/__init__.py +0 -0
  14. {langroid-0.39.2 → langroid-0.39.4}/langroid/agent/__init__.py +0 -0
  15. {langroid-0.39.2 → langroid-0.39.4}/langroid/agent/base.py +0 -0
  16. {langroid-0.39.2 → langroid-0.39.4}/langroid/agent/batch.py +0 -0
  17. {langroid-0.39.2 → langroid-0.39.4}/langroid/agent/callbacks/__init__.py +0 -0
  18. {langroid-0.39.2 → langroid-0.39.4}/langroid/agent/callbacks/chainlit.py +0 -0
  19. {langroid-0.39.2 → langroid-0.39.4}/langroid/agent/chat_agent.py +0 -0
  20. {langroid-0.39.2 → langroid-0.39.4}/langroid/agent/chat_document.py +0 -0
  21. {langroid-0.39.2 → langroid-0.39.4}/langroid/agent/openai_assistant.py +0 -0
  22. {langroid-0.39.2 → langroid-0.39.4}/langroid/agent/special/__init__.py +0 -0
  23. {langroid-0.39.2 → langroid-0.39.4}/langroid/agent/special/arangodb/__init__.py +0 -0
  24. {langroid-0.39.2 → langroid-0.39.4}/langroid/agent/special/arangodb/arangodb_agent.py +0 -0
  25. {langroid-0.39.2 → langroid-0.39.4}/langroid/agent/special/arangodb/system_messages.py +0 -0
  26. {langroid-0.39.2 → langroid-0.39.4}/langroid/agent/special/arangodb/tools.py +0 -0
  27. {langroid-0.39.2 → langroid-0.39.4}/langroid/agent/special/arangodb/utils.py +0 -0
  28. {langroid-0.39.2 → langroid-0.39.4}/langroid/agent/special/lance_doc_chat_agent.py +0 -0
  29. {langroid-0.39.2 → langroid-0.39.4}/langroid/agent/special/lance_rag/__init__.py +0 -0
  30. {langroid-0.39.2 → langroid-0.39.4}/langroid/agent/special/lance_rag/critic_agent.py +0 -0
  31. {langroid-0.39.2 → langroid-0.39.4}/langroid/agent/special/lance_rag/lance_rag_task.py +0 -0
  32. {langroid-0.39.2 → langroid-0.39.4}/langroid/agent/special/lance_rag/query_planner_agent.py +0 -0
  33. {langroid-0.39.2 → langroid-0.39.4}/langroid/agent/special/lance_tools.py +0 -0
  34. {langroid-0.39.2 → langroid-0.39.4}/langroid/agent/special/neo4j/__init__.py +0 -0
  35. {langroid-0.39.2 → langroid-0.39.4}/langroid/agent/special/neo4j/csv_kg_chat.py +0 -0
  36. {langroid-0.39.2 → langroid-0.39.4}/langroid/agent/special/neo4j/neo4j_chat_agent.py +0 -0
  37. {langroid-0.39.2 → langroid-0.39.4}/langroid/agent/special/neo4j/system_messages.py +0 -0
  38. {langroid-0.39.2 → langroid-0.39.4}/langroid/agent/special/neo4j/tools.py +0 -0
  39. {langroid-0.39.2 → langroid-0.39.4}/langroid/agent/special/relevance_extractor_agent.py +0 -0
  40. {langroid-0.39.2 → langroid-0.39.4}/langroid/agent/special/retriever_agent.py +0 -0
  41. {langroid-0.39.2 → langroid-0.39.4}/langroid/agent/special/sql/__init__.py +0 -0
  42. {langroid-0.39.2 → langroid-0.39.4}/langroid/agent/special/sql/sql_chat_agent.py +0 -0
  43. {langroid-0.39.2 → langroid-0.39.4}/langroid/agent/special/sql/utils/__init__.py +0 -0
  44. {langroid-0.39.2 → langroid-0.39.4}/langroid/agent/special/sql/utils/description_extractors.py +0 -0
  45. {langroid-0.39.2 → langroid-0.39.4}/langroid/agent/special/sql/utils/populate_metadata.py +0 -0
  46. {langroid-0.39.2 → langroid-0.39.4}/langroid/agent/special/sql/utils/system_message.py +0 -0
  47. {langroid-0.39.2 → langroid-0.39.4}/langroid/agent/special/sql/utils/tools.py +0 -0
  48. {langroid-0.39.2 → langroid-0.39.4}/langroid/agent/special/table_chat_agent.py +0 -0
  49. {langroid-0.39.2 → langroid-0.39.4}/langroid/agent/task.py +0 -0
  50. {langroid-0.39.2 → langroid-0.39.4}/langroid/agent/tool_message.py +0 -0
  51. {langroid-0.39.2 → langroid-0.39.4}/langroid/agent/tools/__init__.py +0 -0
  52. {langroid-0.39.2 → langroid-0.39.4}/langroid/agent/tools/duckduckgo_search_tool.py +0 -0
  53. {langroid-0.39.2 → langroid-0.39.4}/langroid/agent/tools/file_tools.py +0 -0
  54. {langroid-0.39.2 → langroid-0.39.4}/langroid/agent/tools/google_search_tool.py +0 -0
  55. {langroid-0.39.2 → langroid-0.39.4}/langroid/agent/tools/metaphor_search_tool.py +0 -0
  56. {langroid-0.39.2 → langroid-0.39.4}/langroid/agent/tools/orchestration.py +0 -0
  57. {langroid-0.39.2 → langroid-0.39.4}/langroid/agent/tools/recipient_tool.py +0 -0
  58. {langroid-0.39.2 → langroid-0.39.4}/langroid/agent/tools/retrieval_tool.py +0 -0
  59. {langroid-0.39.2 → langroid-0.39.4}/langroid/agent/tools/rewind_tool.py +0 -0
  60. {langroid-0.39.2 → langroid-0.39.4}/langroid/agent/tools/segment_extract_tool.py +0 -0
  61. {langroid-0.39.2 → langroid-0.39.4}/langroid/agent/xml_tool_message.py +0 -0
  62. {langroid-0.39.2 → langroid-0.39.4}/langroid/cachedb/__init__.py +0 -0
  63. {langroid-0.39.2 → langroid-0.39.4}/langroid/cachedb/base.py +0 -0
  64. {langroid-0.39.2 → langroid-0.39.4}/langroid/cachedb/momento_cachedb.py +0 -0
  65. {langroid-0.39.2 → langroid-0.39.4}/langroid/cachedb/redis_cachedb.py +0 -0
  66. {langroid-0.39.2 → langroid-0.39.4}/langroid/embedding_models/__init__.py +0 -0
  67. {langroid-0.39.2 → langroid-0.39.4}/langroid/embedding_models/base.py +0 -0
  68. {langroid-0.39.2 → langroid-0.39.4}/langroid/embedding_models/models.py +0 -0
  69. {langroid-0.39.2 → langroid-0.39.4}/langroid/embedding_models/protoc/__init__.py +0 -0
  70. {langroid-0.39.2 → langroid-0.39.4}/langroid/embedding_models/protoc/embeddings.proto +0 -0
  71. {langroid-0.39.2 → langroid-0.39.4}/langroid/embedding_models/protoc/embeddings_pb2.py +0 -0
  72. {langroid-0.39.2 → langroid-0.39.4}/langroid/embedding_models/protoc/embeddings_pb2.pyi +0 -0
  73. {langroid-0.39.2 → langroid-0.39.4}/langroid/embedding_models/protoc/embeddings_pb2_grpc.py +0 -0
  74. {langroid-0.39.2 → langroid-0.39.4}/langroid/embedding_models/remote_embeds.py +0 -0
  75. {langroid-0.39.2 → langroid-0.39.4}/langroid/exceptions.py +0 -0
  76. {langroid-0.39.2 → langroid-0.39.4}/langroid/language_models/__init__.py +0 -0
  77. {langroid-0.39.2 → langroid-0.39.4}/langroid/language_models/azure_openai.py +0 -0
  78. {langroid-0.39.2 → langroid-0.39.4}/langroid/language_models/base.py +0 -0
  79. {langroid-0.39.2 → langroid-0.39.4}/langroid/language_models/config.py +0 -0
  80. {langroid-0.39.2 → langroid-0.39.4}/langroid/language_models/mock_lm.py +0 -0
  81. {langroid-0.39.2 → langroid-0.39.4}/langroid/language_models/prompt_formatter/__init__.py +0 -0
  82. {langroid-0.39.2 → langroid-0.39.4}/langroid/language_models/prompt_formatter/base.py +0 -0
  83. {langroid-0.39.2 → langroid-0.39.4}/langroid/language_models/prompt_formatter/hf_formatter.py +0 -0
  84. {langroid-0.39.2 → langroid-0.39.4}/langroid/language_models/prompt_formatter/llama2_formatter.py +0 -0
  85. {langroid-0.39.2 → langroid-0.39.4}/langroid/language_models/utils.py +0 -0
  86. {langroid-0.39.2 → langroid-0.39.4}/langroid/mytypes.py +0 -0
  87. {langroid-0.39.2 → langroid-0.39.4}/langroid/parsing/__init__.py +0 -0
  88. {langroid-0.39.2 → langroid-0.39.4}/langroid/parsing/agent_chats.py +0 -0
  89. {langroid-0.39.2 → langroid-0.39.4}/langroid/parsing/code_parser.py +0 -0
  90. {langroid-0.39.2 → langroid-0.39.4}/langroid/parsing/document_parser.py +0 -0
  91. {langroid-0.39.2 → langroid-0.39.4}/langroid/parsing/para_sentence_split.py +0 -0
  92. {langroid-0.39.2 → langroid-0.39.4}/langroid/parsing/parse_json.py +0 -0
  93. {langroid-0.39.2 → langroid-0.39.4}/langroid/parsing/parser.py +0 -0
  94. {langroid-0.39.2 → langroid-0.39.4}/langroid/parsing/pdf_utils.py +0 -0
  95. {langroid-0.39.2 → langroid-0.39.4}/langroid/parsing/repo_loader.py +0 -0
  96. {langroid-0.39.2 → langroid-0.39.4}/langroid/parsing/routing.py +0 -0
  97. {langroid-0.39.2 → langroid-0.39.4}/langroid/parsing/search.py +0 -0
  98. {langroid-0.39.2 → langroid-0.39.4}/langroid/parsing/spider.py +0 -0
  99. {langroid-0.39.2 → langroid-0.39.4}/langroid/parsing/table_loader.py +0 -0
  100. {langroid-0.39.2 → langroid-0.39.4}/langroid/parsing/url_loader.py +0 -0
  101. {langroid-0.39.2 → langroid-0.39.4}/langroid/parsing/utils.py +0 -0
  102. {langroid-0.39.2 → langroid-0.39.4}/langroid/parsing/web_search.py +0 -0
  103. {langroid-0.39.2 → langroid-0.39.4}/langroid/prompts/__init__.py +0 -0
  104. {langroid-0.39.2 → langroid-0.39.4}/langroid/prompts/dialog.py +0 -0
  105. {langroid-0.39.2 → langroid-0.39.4}/langroid/prompts/prompts_config.py +0 -0
  106. {langroid-0.39.2 → langroid-0.39.4}/langroid/prompts/templates.py +0 -0
  107. {langroid-0.39.2 → langroid-0.39.4}/langroid/py.typed +0 -0
  108. {langroid-0.39.2 → langroid-0.39.4}/langroid/pydantic_v1/__init__.py +0 -0
  109. {langroid-0.39.2 → langroid-0.39.4}/langroid/pydantic_v1/main.py +0 -0
  110. {langroid-0.39.2 → langroid-0.39.4}/langroid/utils/__init__.py +0 -0
  111. {langroid-0.39.2 → langroid-0.39.4}/langroid/utils/algorithms/__init__.py +0 -0
  112. {langroid-0.39.2 → langroid-0.39.4}/langroid/utils/algorithms/graph.py +0 -0
  113. {langroid-0.39.2 → langroid-0.39.4}/langroid/utils/configuration.py +0 -0
  114. {langroid-0.39.2 → langroid-0.39.4}/langroid/utils/constants.py +0 -0
  115. {langroid-0.39.2 → langroid-0.39.4}/langroid/utils/git_utils.py +0 -0
  116. {langroid-0.39.2 → langroid-0.39.4}/langroid/utils/globals.py +0 -0
  117. {langroid-0.39.2 → langroid-0.39.4}/langroid/utils/logging.py +0 -0
  118. {langroid-0.39.2 → langroid-0.39.4}/langroid/utils/object_registry.py +0 -0
  119. {langroid-0.39.2 → langroid-0.39.4}/langroid/utils/output/__init__.py +0 -0
  120. {langroid-0.39.2 → langroid-0.39.4}/langroid/utils/output/printing.py +0 -0
  121. {langroid-0.39.2 → langroid-0.39.4}/langroid/utils/output/status.py +0 -0
  122. {langroid-0.39.2 → langroid-0.39.4}/langroid/utils/pandas_utils.py +0 -0
  123. {langroid-0.39.2 → langroid-0.39.4}/langroid/utils/pydantic_utils.py +0 -0
  124. {langroid-0.39.2 → langroid-0.39.4}/langroid/utils/types.py +0 -0
  125. {langroid-0.39.2 → langroid-0.39.4}/langroid/vector_store/__init__.py +0 -0
  126. {langroid-0.39.2 → langroid-0.39.4}/langroid/vector_store/base.py +0 -0
  127. {langroid-0.39.2 → langroid-0.39.4}/langroid/vector_store/chromadb.py +0 -0
  128. {langroid-0.39.2 → langroid-0.39.4}/langroid/vector_store/lancedb.py +0 -0
  129. {langroid-0.39.2 → langroid-0.39.4}/langroid/vector_store/meilisearch.py +0 -0
  130. {langroid-0.39.2 → langroid-0.39.4}/langroid/vector_store/momento.py +0 -0
  131. {langroid-0.39.2 → langroid-0.39.4}/langroid/vector_store/qdrantdb.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: langroid
3
- Version: 0.39.2
3
+ Version: 0.39.4
4
4
  Summary: Harness LLMs with Multi-Agent Programming
5
5
  Author-email: Prasad Chalasani <pchalasani@gmail.com>
6
6
  License: MIT
@@ -30,7 +30,7 @@ Requires-Dist: lxml<5.0.0,>=4.9.3
30
30
  Requires-Dist: nest-asyncio<2.0.0,>=1.6.0
31
31
  Requires-Dist: nltk<4.0.0,>=3.8.2
32
32
  Requires-Dist: onnxruntime<2.0.0,>=1.16.1
33
- Requires-Dist: openai<2.0.0,>=1.45.0
33
+ Requires-Dist: openai<2.0.0,>=1.61.1
34
34
  Requires-Dist: pandas<3.0.0,>=2.0.3
35
35
  Requires-Dist: prettytable<4.0.0,>=3.8.0
36
36
  Requires-Dist: pydantic<3.0.0,>=1
@@ -58,7 +58,7 @@ from langroid.utils.object_registry import ObjectRegistry
58
58
  from langroid.utils.output import show_if_debug, status
59
59
  from langroid.utils.output.citations import (
60
60
  extract_markdown_references,
61
- format_footnote_text,
61
+ format_cited_references,
62
62
  )
63
63
  from langroid.utils.pydantic_utils import dataframe_to_documents, extract_fields
64
64
  from langroid.vector_store.base import VectorStore, VectorStoreConfig
@@ -859,18 +859,10 @@ class DocChatAgent(ChatAgent):
859
859
  final_answer = answer_doc.content.strip()
860
860
  show_if_debug(final_answer, "SUMMARIZE_RESPONSE= ")
861
861
 
862
+ # extract references like [^2], [^3], etc. from the final answer
862
863
  citations = extract_markdown_references(final_answer)
863
-
864
- citations_str = ""
865
- if len(citations) > 0:
866
- # append [i] source, content for each citation
867
- citations_str = "\n".join(
868
- [
869
- f"[^{c}] {passages[c-1].metadata.source}"
870
- f"\n{format_footnote_text(passages[c-1].content)}"
871
- for c in citations
872
- ]
873
- )
864
+ # format the cited references as a string suitable for markdown footnote
865
+ citations_str = format_cited_references(citations, passages)
874
866
 
875
867
  return ChatDocument(
876
868
  content=final_answer, # does not contain citations
@@ -54,6 +54,7 @@ class DeepSeekModel(ModelName):
54
54
 
55
55
  DEEPSEEK = "deepseek/deepseek-chat"
56
56
  DEEPSEEK_R1 = "deepseek/deepseek-reasoner"
57
+ OPENROUTER_DEEPSEEK_R1 = "openrouter/deepseek/deepseek-r1"
57
58
 
58
59
 
59
60
  class GeminiModel(ModelName):
@@ -66,6 +67,23 @@ class GeminiModel(ModelName):
66
67
  GEMINI_2_FLASH_THINKING = "gemini/gemini-2.0-flash-thinking-exp"
67
68
 
68
69
 
70
+ class OpenAI_API_ParamInfo(BaseModel):
71
+ """
72
+ Parameters exclusive to some models, when using OpenAI API
73
+ """
74
+
75
+ params: Dict[str, List[str]] = dict(
76
+ reasoning_effort=[
77
+ OpenAIChatModel.O3_MINI.value,
78
+ ],
79
+ )
80
+ extra_parameters: Dict[str, List[str]] = dict(
81
+ include_reasoning=[
82
+ DeepSeekModel.OPENROUTER_DEEPSEEK_R1.value,
83
+ ]
84
+ )
85
+
86
+
69
87
  class ModelInfo(BaseModel):
70
88
  """
71
89
  Consolidated information about LLM, related to capacity, cost and API
@@ -49,6 +49,7 @@ from langroid.language_models.config import HFPromptFormatterConfig
49
49
  from langroid.language_models.model_info import (
50
50
  DeepSeekModel,
51
51
  GeminiModel,
52
+ OpenAI_API_ParamInfo,
52
53
  get_model_info,
53
54
  )
54
55
  from langroid.language_models.model_info import (
@@ -203,6 +204,7 @@ class OpenAICallParams(BaseModel):
203
204
  stop: str | List[str] | None = None # (list of) stop sequence(s)
204
205
  seed: int | None = 42
205
206
  user: str | None = None # user id for tracking
207
+ extra_body: Dict[str, Any] | None = None # additional params for API request body
206
208
 
207
209
  def to_dict_exclude_none(self) -> Dict[str, Any]:
208
210
  return {k: v for k, v in self.dict().items() if v is not None}
@@ -642,7 +644,15 @@ class OpenAIGPT(LanguageModel):
642
644
  """
643
645
  List of params that are not supported by the current model
644
646
  """
645
- return get_model_info(self.config.chat_model).unsupported_params
647
+ model_info = get_model_info(self.config.chat_model)
648
+ unsupported = set(model_info.unsupported_params)
649
+ for param, model_list in OpenAI_API_ParamInfo().params.items():
650
+ if (
651
+ self.config.chat_model not in model_list
652
+ and self.chat_model_orig not in model_list
653
+ ):
654
+ unsupported.add(param)
655
+ return list(unsupported)
646
656
 
647
657
  def rename_params(self) -> Dict[str, str]:
648
658
  """
@@ -739,7 +749,10 @@ class OpenAIGPT(LanguageModel):
739
749
  delta = choices[0].get("delta", {})
740
750
  # capture both content and reasoning_content
741
751
  event_text = delta.get("content", "")
742
- event_reasoning = delta.get("reasoning_content", "")
752
+ event_reasoning = delta.get(
753
+ "reasoning_content",
754
+ delta.get("reasoning", ""),
755
+ )
743
756
  if "function_call" in delta and delta["function_call"] is not None:
744
757
  if "name" in delta["function_call"]:
745
758
  event_fn_name = delta["function_call"]["name"]
@@ -861,7 +874,10 @@ class OpenAIGPT(LanguageModel):
861
874
  if chat:
862
875
  delta = choices[0].get("delta", {})
863
876
  event_text = delta.get("content", "")
864
- event_reasoning = delta.get("reasoning_content", "")
877
+ event_reasoning = delta.get(
878
+ "reasoning_content",
879
+ delta.get("reasoning", ""),
880
+ )
865
881
  if "function_call" in delta and delta["function_call"] is not None:
866
882
  if "name" in delta["function_call"]:
867
883
  event_fn_name = delta["function_call"]["name"]
@@ -1757,6 +1773,18 @@ class OpenAIGPT(LanguageModel):
1757
1773
  for old_param, new_param in param_rename_map.items():
1758
1774
  if old_param in args:
1759
1775
  args[new_param] = args.pop(old_param)
1776
+
1777
+ # finally, get rid of extra_body params exclusive to certain models
1778
+ extra_params = args.get("extra_body", {})
1779
+ if extra_params:
1780
+ for param, model_list in OpenAI_API_ParamInfo().extra_parameters.items():
1781
+ if (
1782
+ self.config.chat_model not in model_list
1783
+ and self.chat_model_orig not in model_list
1784
+ ):
1785
+ extra_params.pop(param, None)
1786
+ if extra_params:
1787
+ args["extra_body"] = extra_params
1760
1788
  return args
1761
1789
 
1762
1790
  def _process_chat_completion_response(
@@ -221,10 +221,15 @@ def find_urls(
221
221
  response = requests.get(url, timeout=5)
222
222
  response.raise_for_status()
223
223
  soup = BeautifulSoup(response.text, "html.parser")
224
- links = [urljoin(url, a["href"]) for a in soup.find_all("a", href=True)]
224
+ links = [
225
+ urljoin(url, a["href"]) # type: ignore
226
+ for a in soup.find_all("a", href=True)
227
+ ]
225
228
 
226
229
  # Defrag links: discard links that are to portions of same page
227
- defragged_links = list(set(urldefrag(link).url for link in links))
230
+ defragged_links = list(
231
+ set(urldefrag(link).url for link in links) # type: ignore
232
+ )
228
233
 
229
234
  # Filter links based on domain matching requirement
230
235
  domain_matching_links = [
@@ -1,4 +1,9 @@
1
- def extract_markdown_references(md_string: str) -> list[int]:
1
+ from typing import List
2
+
3
+ from langroid.mytypes import Document
4
+
5
+
6
+ def extract_markdown_references(md_string: str) -> List[int]:
2
7
  """
3
8
  Extracts markdown references (e.g., [^1], [^2]) from a string and returns
4
9
  them as a sorted list of integers.
@@ -59,3 +64,28 @@ def format_footnote_text(content: str, width: int = 0) -> str:
59
64
 
60
65
  # Join them with newline so we preserve the paragraph/blank line structure
61
66
  return "\n".join(output_lines)
67
+
68
+
69
+ def format_cited_references(citations: List[int], passages: list[Document]) -> str:
70
+ """
71
+ Given a list of (integer) citations, and a list of passages, return a string
72
+ that can be added as a footer to the main text, to show sources cited.
73
+
74
+ Args:
75
+ citations (list[int]): list of citations, presumably from main text
76
+ passages (list[Document]): list of passages (Document objects)
77
+
78
+ Returns:
79
+ str: formatted string of citations for footnote in markdown
80
+ """
81
+ citations_str = ""
82
+ if len(citations) > 0:
83
+ # append [i] source, content for each citation
84
+ citations_str = "\n".join(
85
+ [
86
+ f"[^{c}] {passages[c-1].metadata.source}"
87
+ f"\n{format_footnote_text(passages[c-1].content)}"
88
+ for c in citations
89
+ ]
90
+ )
91
+ return citations_str
@@ -14,11 +14,7 @@ from typing import Any, Literal
14
14
 
15
15
  logger = logging.getLogger(__name__)
16
16
 
17
- DELETION_ALLOWED_PATHS = [
18
- ".qdrant",
19
- ".chroma",
20
- ".lancedb",
21
- ]
17
+ DELETION_ALLOWED_PATHS = [".qdrant", ".chroma", ".lancedb", ".weaviate"]
22
18
 
23
19
 
24
20
  def pydantic_major_version() -> int:
@@ -32,6 +32,8 @@ class WeaviateDBConfig(VectorStoreConfig):
32
32
  collection_name: str | None = "temp"
33
33
  embedding: EmbeddingModelsConfig = OpenAIEmbeddingsConfig()
34
34
  distance: str = VectorDistances.COSINE
35
+ cloud: bool = False
36
+ storage_path: str = ".weaviate_embedded/data"
35
37
 
36
38
 
37
39
  class WeaviateDB(VectorStore):
@@ -39,19 +41,25 @@ class WeaviateDB(VectorStore):
39
41
  super().__init__(config)
40
42
  self.config: WeaviateDBConfig = config
41
43
  load_dotenv()
42
- key = os.getenv("WEAVIATE_API_KEY")
43
- url = os.getenv("WEAVIATE_API_URL")
44
- if url is None or key is None:
45
- raise ValueError(
46
- """WEAVIATE_API_KEY, WEAVIATE_API_URL env variable must be set to use
47
- WeaviateDB in cloud mode. Please set these values
48
- in your .env file.
49
- """
44
+ if not self.config.cloud:
45
+ self.client = weaviate.connect_to_embedded(
46
+ version="latest", persistence_data_path=self.config.storage_path
50
47
  )
51
- self.client = weaviate.connect_to_weaviate_cloud(
52
- cluster_url=url,
53
- auth_credentials=Auth.api_key(key),
54
- )
48
+ else: # Cloud mode
49
+ key = os.getenv("WEAVIATE_API_KEY")
50
+ url = os.getenv("WEAVIATE_API_URL")
51
+ if url is None or key is None:
52
+ raise ValueError(
53
+ """WEAVIATE_API_KEY, WEAVIATE_API_URL env variables must be set to
54
+ use WeaviateDB in cloud mode. Please set these values
55
+ in your .env file.
56
+ """
57
+ )
58
+ self.client = weaviate.connect_to_weaviate_cloud(
59
+ cluster_url=url,
60
+ auth_credentials=Auth.api_key(key),
61
+ )
62
+
55
63
  if config.collection_name is not None:
56
64
  WeaviateDB.validate_and_format_collection_name(config.collection_name)
57
65
 
@@ -267,3 +275,8 @@ class WeaviateDB(VectorStore):
267
275
  )
268
276
 
269
277
  return formatted_name
278
+
279
+ def __del__(self) -> None:
280
+ # Gracefully close the connection with local client
281
+ if not self.config.cloud:
282
+ self.client.close()
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "langroid"
3
- version = "0.39.2"
3
+ version = "0.39.4"
4
4
  authors = [
5
5
  {name = "Prasad Chalasani", email = "pchalasani@gmail.com"},
6
6
  ]
@@ -33,7 +33,7 @@ dependencies = [
33
33
  "nest-asyncio<2.0.0,>=1.6.0",
34
34
  "nltk<4.0.0,>=3.8.2",
35
35
  "onnxruntime<2.0.0,>=1.16.1",
36
- "openai<2.0.0,>=1.45.0",
36
+ "openai<2.0.0,>=1.61.1",
37
37
  "pandas<3.0.0,>=2.0.3",
38
38
  "prettytable<4.0.0,>=3.8.0",
39
39
  "pydantic<3.0.0,>=1",
File without changes
File without changes
File without changes
File without changes
File without changes