langroid 0.33.6__py3-none-any.whl → 0.33.7__py3-none-any.whl

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 (129) hide show
  1. langroid/__init__.py +106 -0
  2. langroid/agent/__init__.py +41 -0
  3. langroid/agent/base.py +1983 -0
  4. langroid/agent/batch.py +398 -0
  5. langroid/agent/callbacks/__init__.py +0 -0
  6. langroid/agent/callbacks/chainlit.py +598 -0
  7. langroid/agent/chat_agent.py +1899 -0
  8. langroid/agent/chat_document.py +454 -0
  9. langroid/agent/openai_assistant.py +882 -0
  10. langroid/agent/special/__init__.py +59 -0
  11. langroid/agent/special/arangodb/__init__.py +0 -0
  12. langroid/agent/special/arangodb/arangodb_agent.py +656 -0
  13. langroid/agent/special/arangodb/system_messages.py +186 -0
  14. langroid/agent/special/arangodb/tools.py +107 -0
  15. langroid/agent/special/arangodb/utils.py +36 -0
  16. langroid/agent/special/doc_chat_agent.py +1466 -0
  17. langroid/agent/special/lance_doc_chat_agent.py +262 -0
  18. langroid/agent/special/lance_rag/__init__.py +9 -0
  19. langroid/agent/special/lance_rag/critic_agent.py +198 -0
  20. langroid/agent/special/lance_rag/lance_rag_task.py +82 -0
  21. langroid/agent/special/lance_rag/query_planner_agent.py +260 -0
  22. langroid/agent/special/lance_tools.py +61 -0
  23. langroid/agent/special/neo4j/__init__.py +0 -0
  24. langroid/agent/special/neo4j/csv_kg_chat.py +174 -0
  25. langroid/agent/special/neo4j/neo4j_chat_agent.py +433 -0
  26. langroid/agent/special/neo4j/system_messages.py +120 -0
  27. langroid/agent/special/neo4j/tools.py +32 -0
  28. langroid/agent/special/relevance_extractor_agent.py +127 -0
  29. langroid/agent/special/retriever_agent.py +56 -0
  30. langroid/agent/special/sql/__init__.py +17 -0
  31. langroid/agent/special/sql/sql_chat_agent.py +654 -0
  32. langroid/agent/special/sql/utils/__init__.py +21 -0
  33. langroid/agent/special/sql/utils/description_extractors.py +190 -0
  34. langroid/agent/special/sql/utils/populate_metadata.py +85 -0
  35. langroid/agent/special/sql/utils/system_message.py +35 -0
  36. langroid/agent/special/sql/utils/tools.py +64 -0
  37. langroid/agent/special/table_chat_agent.py +263 -0
  38. langroid/agent/task.py +2095 -0
  39. langroid/agent/tool_message.py +393 -0
  40. langroid/agent/tools/__init__.py +38 -0
  41. langroid/agent/tools/duckduckgo_search_tool.py +50 -0
  42. langroid/agent/tools/file_tools.py +234 -0
  43. langroid/agent/tools/google_search_tool.py +39 -0
  44. langroid/agent/tools/metaphor_search_tool.py +68 -0
  45. langroid/agent/tools/orchestration.py +303 -0
  46. langroid/agent/tools/recipient_tool.py +235 -0
  47. langroid/agent/tools/retrieval_tool.py +32 -0
  48. langroid/agent/tools/rewind_tool.py +137 -0
  49. langroid/agent/tools/segment_extract_tool.py +41 -0
  50. langroid/agent/xml_tool_message.py +382 -0
  51. langroid/cachedb/__init__.py +17 -0
  52. langroid/cachedb/base.py +58 -0
  53. langroid/cachedb/momento_cachedb.py +108 -0
  54. langroid/cachedb/redis_cachedb.py +153 -0
  55. langroid/embedding_models/__init__.py +39 -0
  56. langroid/embedding_models/base.py +74 -0
  57. langroid/embedding_models/models.py +461 -0
  58. langroid/embedding_models/protoc/__init__.py +0 -0
  59. langroid/embedding_models/protoc/embeddings.proto +19 -0
  60. langroid/embedding_models/protoc/embeddings_pb2.py +33 -0
  61. langroid/embedding_models/protoc/embeddings_pb2.pyi +50 -0
  62. langroid/embedding_models/protoc/embeddings_pb2_grpc.py +79 -0
  63. langroid/embedding_models/remote_embeds.py +153 -0
  64. langroid/exceptions.py +71 -0
  65. langroid/language_models/__init__.py +53 -0
  66. langroid/language_models/azure_openai.py +153 -0
  67. langroid/language_models/base.py +678 -0
  68. langroid/language_models/config.py +18 -0
  69. langroid/language_models/mock_lm.py +124 -0
  70. langroid/language_models/openai_gpt.py +1964 -0
  71. langroid/language_models/prompt_formatter/__init__.py +16 -0
  72. langroid/language_models/prompt_formatter/base.py +40 -0
  73. langroid/language_models/prompt_formatter/hf_formatter.py +132 -0
  74. langroid/language_models/prompt_formatter/llama2_formatter.py +75 -0
  75. langroid/language_models/utils.py +151 -0
  76. langroid/mytypes.py +84 -0
  77. langroid/parsing/__init__.py +52 -0
  78. langroid/parsing/agent_chats.py +38 -0
  79. langroid/parsing/code_parser.py +121 -0
  80. langroid/parsing/document_parser.py +718 -0
  81. langroid/parsing/para_sentence_split.py +62 -0
  82. langroid/parsing/parse_json.py +155 -0
  83. langroid/parsing/parser.py +313 -0
  84. langroid/parsing/repo_loader.py +790 -0
  85. langroid/parsing/routing.py +36 -0
  86. langroid/parsing/search.py +275 -0
  87. langroid/parsing/spider.py +102 -0
  88. langroid/parsing/table_loader.py +94 -0
  89. langroid/parsing/url_loader.py +111 -0
  90. langroid/parsing/urls.py +273 -0
  91. langroid/parsing/utils.py +373 -0
  92. langroid/parsing/web_search.py +156 -0
  93. langroid/prompts/__init__.py +9 -0
  94. langroid/prompts/dialog.py +17 -0
  95. langroid/prompts/prompts_config.py +5 -0
  96. langroid/prompts/templates.py +141 -0
  97. langroid/pydantic_v1/__init__.py +10 -0
  98. langroid/pydantic_v1/main.py +4 -0
  99. langroid/utils/__init__.py +19 -0
  100. langroid/utils/algorithms/__init__.py +3 -0
  101. langroid/utils/algorithms/graph.py +103 -0
  102. langroid/utils/configuration.py +98 -0
  103. langroid/utils/constants.py +30 -0
  104. langroid/utils/git_utils.py +252 -0
  105. langroid/utils/globals.py +49 -0
  106. langroid/utils/logging.py +135 -0
  107. langroid/utils/object_registry.py +66 -0
  108. langroid/utils/output/__init__.py +20 -0
  109. langroid/utils/output/citations.py +41 -0
  110. langroid/utils/output/printing.py +99 -0
  111. langroid/utils/output/status.py +40 -0
  112. langroid/utils/pandas_utils.py +30 -0
  113. langroid/utils/pydantic_utils.py +602 -0
  114. langroid/utils/system.py +286 -0
  115. langroid/utils/types.py +93 -0
  116. langroid/vector_store/__init__.py +50 -0
  117. langroid/vector_store/base.py +359 -0
  118. langroid/vector_store/chromadb.py +214 -0
  119. langroid/vector_store/lancedb.py +406 -0
  120. langroid/vector_store/meilisearch.py +299 -0
  121. langroid/vector_store/momento.py +278 -0
  122. langroid/vector_store/qdrantdb.py +468 -0
  123. {langroid-0.33.6.dist-info → langroid-0.33.7.dist-info}/METADATA +95 -94
  124. langroid-0.33.7.dist-info/RECORD +127 -0
  125. {langroid-0.33.6.dist-info → langroid-0.33.7.dist-info}/WHEEL +1 -1
  126. langroid-0.33.6.dist-info/RECORD +0 -7
  127. langroid-0.33.6.dist-info/entry_points.txt +0 -4
  128. pyproject.toml +0 -356
  129. {langroid-0.33.6.dist-info → langroid-0.33.7.dist-info}/licenses/LICENSE +0 -0
@@ -0,0 +1,127 @@
1
+ """
2
+ Agent to retrieve relevant segments from a body of text,
3
+ that are relevant to a query.
4
+
5
+ """
6
+
7
+ import logging
8
+ from typing import Optional, no_type_check
9
+
10
+ from rich.console import Console
11
+
12
+ from langroid.agent.chat_agent import ChatAgent, ChatAgentConfig
13
+ from langroid.agent.chat_document import ChatDocument
14
+ from langroid.agent.tools.segment_extract_tool import SegmentExtractTool
15
+ from langroid.language_models.base import LLMConfig
16
+ from langroid.language_models.openai_gpt import OpenAIGPTConfig
17
+ from langroid.mytypes import Entity
18
+ from langroid.parsing.utils import extract_numbered_segments, number_segments
19
+ from langroid.utils.constants import DONE, NO_ANSWER
20
+
21
+ console = Console()
22
+ logger = logging.getLogger(__name__)
23
+
24
+
25
+ class RelevanceExtractorAgentConfig(ChatAgentConfig):
26
+ llm: LLMConfig | None = OpenAIGPTConfig()
27
+ segment_length: int = 1 # number of sentences per segment
28
+ query: str = "" # query for relevance extraction
29
+ system_message = """
30
+ The user will give you a PASSAGE containing segments numbered as
31
+ <#1#>, <#2#>, <#3#>, etc.,
32
+ followed by a QUERY. Extract ONLY the segment-numbers from
33
+ the PASSAGE that are RELEVANT to the QUERY.
34
+ Present the extracted segment-numbers using the `extract_segments` tool/function.
35
+ """
36
+
37
+
38
+ class RelevanceExtractorAgent(ChatAgent):
39
+ """
40
+ Agent for extracting segments from text, that are relevant to a given query.
41
+ """
42
+
43
+ def __init__(self, config: RelevanceExtractorAgentConfig):
44
+ super().__init__(config)
45
+ self.config: RelevanceExtractorAgentConfig = config
46
+ self.enable_message(SegmentExtractTool)
47
+ self.numbered_passage: Optional[str] = None
48
+
49
+ @no_type_check
50
+ def llm_response(
51
+ self, message: Optional[str | ChatDocument] = None
52
+ ) -> Optional[ChatDocument]:
53
+ """Compose a prompt asking to extract relevant segments from a passage.
54
+ Steps:
55
+ - number the segments in the passage
56
+ - compose prompt
57
+ - send to LLM
58
+ """
59
+ assert self.config.query is not None, "No query specified"
60
+ assert message is not None, "No message specified"
61
+ message_str = message.content if isinstance(message, ChatDocument) else message
62
+ # number the segments in the passage
63
+ self.numbered_passage = number_segments(message_str, self.config.segment_length)
64
+ # compose prompt
65
+ prompt = f"""
66
+ PASSAGE:
67
+ {self.numbered_passage}
68
+
69
+ QUERY: {self.config.query}
70
+ """
71
+ # send to LLM
72
+ return super().llm_response(prompt)
73
+
74
+ @no_type_check
75
+ async def llm_response_async(
76
+ self, message: Optional[str | ChatDocument] = None
77
+ ) -> Optional[ChatDocument]:
78
+ """
79
+ Compose a prompt asking to extract relevant segments from a passage.
80
+ Steps:
81
+ - number the segments in the passage
82
+ - compose prompt
83
+ - send to LLM
84
+ The LLM is expected to generate a structured msg according to the
85
+ SegmentExtractTool schema, i.e. it should contain a `segment_list` field
86
+ whose value is a list of segment numbers or ranges, like "10,12,14-17".
87
+ """
88
+
89
+ assert self.config.query is not None, "No query specified"
90
+ assert message is not None, "No message specified"
91
+ message_str = message.content if isinstance(message, ChatDocument) else message
92
+ # number the segments in the passage
93
+ self.numbered_passage = number_segments(message_str, self.config.segment_length)
94
+ # compose prompt
95
+ prompt = f"""
96
+ PASSAGE:
97
+ {self.numbered_passage}
98
+
99
+ QUERY: {self.config.query}
100
+ """
101
+ # send to LLM
102
+ return await super().llm_response_async(prompt)
103
+
104
+ def extract_segments(self, msg: SegmentExtractTool) -> str:
105
+ """Method to handle a segmentExtractTool message from LLM"""
106
+ spec = msg.segment_list
107
+ if len(self.message_history) == 0:
108
+ return DONE + " " + NO_ANSWER
109
+ if spec is None or spec.strip() in ["", NO_ANSWER]:
110
+ return DONE + " " + NO_ANSWER
111
+ assert self.numbered_passage is not None, "No numbered passage"
112
+ # assume this has numbered segments
113
+ try:
114
+ extracts = extract_numbered_segments(self.numbered_passage, spec)
115
+ except Exception:
116
+ return DONE + " " + NO_ANSWER
117
+ # this response ends the task by saying DONE
118
+ return DONE + " " + extracts
119
+
120
+ def handle_message_fallback(
121
+ self, msg: str | ChatDocument
122
+ ) -> str | ChatDocument | None:
123
+ """Handle case where LLM forgets to use SegmentExtractTool"""
124
+ if isinstance(msg, ChatDocument) and msg.metadata.sender == Entity.LLM:
125
+ return DONE + " " + NO_ANSWER
126
+ else:
127
+ return None
@@ -0,0 +1,56 @@
1
+ """
2
+ Deprecated: use DocChatAgent instead, with DocChatAgentConfig.retrieve_only=True,
3
+ and if you want to retrieve FULL relevant doc-contents rather than just extracts,
4
+ then set DocChatAgentConfig.extraction_granularity=-1
5
+
6
+ This is an agent to retrieve relevant extracts from a vector store,
7
+ where the LLM is used to filter for "true" relevance after retrieval from the
8
+ vector store.
9
+ This is essentially the same as DocChatAgent, except that instead of
10
+ generating final summary answer based on relevant extracts, it just returns
11
+ those extracts.
12
+ See test_retriever_agent.py for example usage.
13
+ """
14
+
15
+ import logging
16
+ from typing import Sequence
17
+
18
+ from rich.console import Console
19
+
20
+ from langroid.agent.special.doc_chat_agent import DocChatAgent, DocChatAgentConfig
21
+ from langroid.mytypes import DocMetaData, Document
22
+
23
+ console = Console()
24
+ logger = logging.getLogger(__name__)
25
+
26
+ # for backwards compatibility:
27
+ RecordMetadata = DocMetaData
28
+ RecordDoc = Document
29
+ RetrieverAgentConfig = DocChatAgentConfig
30
+
31
+
32
+ class RetrieverAgent(DocChatAgent):
33
+ """
34
+ Agent for just retrieving chunks/docs/extracts matching a query
35
+ """
36
+
37
+ def __init__(self, config: DocChatAgentConfig):
38
+ super().__init__(config)
39
+ self.config: DocChatAgentConfig = config
40
+ logger.warning(
41
+ """
42
+ `RetrieverAgent` is deprecated. Use `DocChatAgent` instead, with
43
+ `DocChatAgentConfig.retrieve_only=True`, and if you want to retrieve
44
+ FULL relevant doc-contents rather than just extracts, then set
45
+ `DocChatAgentConfig.extraction_granularity=-1`
46
+ """
47
+ )
48
+
49
+ def get_records(self) -> Sequence[Document]:
50
+ raise NotImplementedError
51
+
52
+ def ingest(self) -> None:
53
+ records = self.get_records()
54
+ if self.vecdb is None:
55
+ raise ValueError("No vector store specified")
56
+ self.vecdb.add_documents(records)
@@ -0,0 +1,17 @@
1
+ from . import utils
2
+
3
+
4
+ __all__ = [
5
+ "utils",
6
+ ]
7
+
8
+ try:
9
+ from . import sql_chat_agent
10
+ from .sql_chat_agent import SQLChatAgentConfig, SQLChatAgent
11
+
12
+ sql_chat_agent
13
+ SQLChatAgent
14
+ SQLChatAgentConfig
15
+ __all__.extend(["SQLChatAgentConfig", "SQLChatAgent", "sql_chat_agent"])
16
+ except ImportError:
17
+ pass