langroid 0.10.0__tar.gz → 0.10.2__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 (140) hide show
  1. {langroid-0.10.0 → langroid-0.10.2}/PKG-INFO +4 -1
  2. {langroid-0.10.0 → langroid-0.10.2}/README.md +3 -0
  3. {langroid-0.10.0 → langroid-0.10.2}/langroid/agent/base.py +57 -45
  4. {langroid-0.10.0 → langroid-0.10.2}/langroid/agent/chat_agent.py +10 -1
  5. {langroid-0.10.0 → langroid-0.10.2}/langroid/agent/special/lance_rag/critic_agent.py +1 -0
  6. {langroid-0.10.0 → langroid-0.10.2}/langroid/agent/special/lance_rag/lance_rag_task.py +2 -0
  7. {langroid-0.10.0 → langroid-0.10.2}/langroid/agent/special/lance_rag/query_planner_agent.py +1 -0
  8. {langroid-0.10.0 → langroid-0.10.2}/langroid/agent/task.py +1 -4
  9. {langroid-0.10.0 → langroid-0.10.2}/langroid/agent/tool_message.py +11 -0
  10. {langroid-0.10.0 → langroid-0.10.2}/langroid/parsing/code_parser.py +2 -0
  11. {langroid-0.10.0 → langroid-0.10.2}/pyproject.toml +4 -3
  12. {langroid-0.10.0 → langroid-0.10.2}/LICENSE +0 -0
  13. {langroid-0.10.0 → langroid-0.10.2}/langroid/__init__.py +0 -0
  14. {langroid-0.10.0 → langroid-0.10.2}/langroid/agent/__init__.py +0 -0
  15. {langroid-0.10.0 → langroid-0.10.2}/langroid/agent/batch.py +0 -0
  16. {langroid-0.10.0 → langroid-0.10.2}/langroid/agent/callbacks/__init__.py +0 -0
  17. {langroid-0.10.0 → langroid-0.10.2}/langroid/agent/callbacks/chainlit.py +0 -0
  18. {langroid-0.10.0 → langroid-0.10.2}/langroid/agent/chat_document.py +0 -0
  19. {langroid-0.10.0 → langroid-0.10.2}/langroid/agent/helpers.py +0 -0
  20. {langroid-0.10.0 → langroid-0.10.2}/langroid/agent/junk +0 -0
  21. {langroid-0.10.0 → langroid-0.10.2}/langroid/agent/openai_assistant.py +0 -0
  22. {langroid-0.10.0 → langroid-0.10.2}/langroid/agent/special/__init__.py +0 -0
  23. {langroid-0.10.0 → langroid-0.10.2}/langroid/agent/special/doc_chat_agent.py +0 -0
  24. {langroid-0.10.0 → langroid-0.10.2}/langroid/agent/special/lance_doc_chat_agent.py +0 -0
  25. {langroid-0.10.0 → langroid-0.10.2}/langroid/agent/special/lance_rag/__init__.py +0 -0
  26. {langroid-0.10.0 → langroid-0.10.2}/langroid/agent/special/lance_tools.py +0 -0
  27. {langroid-0.10.0 → langroid-0.10.2}/langroid/agent/special/neo4j/__init__.py +0 -0
  28. {langroid-0.10.0 → langroid-0.10.2}/langroid/agent/special/neo4j/csv_kg_chat.py +0 -0
  29. {langroid-0.10.0 → langroid-0.10.2}/langroid/agent/special/neo4j/neo4j_chat_agent.py +0 -0
  30. {langroid-0.10.0 → langroid-0.10.2}/langroid/agent/special/neo4j/utils/__init__.py +0 -0
  31. {langroid-0.10.0 → langroid-0.10.2}/langroid/agent/special/neo4j/utils/system_message.py +0 -0
  32. {langroid-0.10.0 → langroid-0.10.2}/langroid/agent/special/relevance_extractor_agent.py +0 -0
  33. {langroid-0.10.0 → langroid-0.10.2}/langroid/agent/special/retriever_agent.py +0 -0
  34. {langroid-0.10.0 → langroid-0.10.2}/langroid/agent/special/sql/__init__.py +0 -0
  35. {langroid-0.10.0 → langroid-0.10.2}/langroid/agent/special/sql/sql_chat_agent.py +0 -0
  36. {langroid-0.10.0 → langroid-0.10.2}/langroid/agent/special/sql/utils/__init__.py +0 -0
  37. {langroid-0.10.0 → langroid-0.10.2}/langroid/agent/special/sql/utils/description_extractors.py +0 -0
  38. {langroid-0.10.0 → langroid-0.10.2}/langroid/agent/special/sql/utils/populate_metadata.py +0 -0
  39. {langroid-0.10.0 → langroid-0.10.2}/langroid/agent/special/sql/utils/system_message.py +0 -0
  40. {langroid-0.10.0 → langroid-0.10.2}/langroid/agent/special/sql/utils/tools.py +0 -0
  41. {langroid-0.10.0 → langroid-0.10.2}/langroid/agent/special/table_chat_agent.py +0 -0
  42. {langroid-0.10.0 → langroid-0.10.2}/langroid/agent/structured_message.py +0 -0
  43. {langroid-0.10.0 → langroid-0.10.2}/langroid/agent/tools/__init__.py +0 -0
  44. {langroid-0.10.0 → langroid-0.10.2}/langroid/agent/tools/duckduckgo_search_tool.py +0 -0
  45. {langroid-0.10.0 → langroid-0.10.2}/langroid/agent/tools/extract_tool.py +0 -0
  46. {langroid-0.10.0 → langroid-0.10.2}/langroid/agent/tools/generator_tool.py +0 -0
  47. {langroid-0.10.0 → langroid-0.10.2}/langroid/agent/tools/google_search_tool.py +0 -0
  48. {langroid-0.10.0 → langroid-0.10.2}/langroid/agent/tools/metaphor_search_tool.py +0 -0
  49. {langroid-0.10.0 → langroid-0.10.2}/langroid/agent/tools/note_tool.py +0 -0
  50. {langroid-0.10.0 → langroid-0.10.2}/langroid/agent/tools/orchestration.py +0 -0
  51. {langroid-0.10.0 → langroid-0.10.2}/langroid/agent/tools/recipient_tool.py +0 -0
  52. {langroid-0.10.0 → langroid-0.10.2}/langroid/agent/tools/retrieval_tool.py +0 -0
  53. {langroid-0.10.0 → langroid-0.10.2}/langroid/agent/tools/rewind_tool.py +0 -0
  54. {langroid-0.10.0 → langroid-0.10.2}/langroid/agent/tools/run_python_code.py +0 -0
  55. {langroid-0.10.0 → langroid-0.10.2}/langroid/agent/tools/segment_extract_tool.py +0 -0
  56. {langroid-0.10.0 → langroid-0.10.2}/langroid/agent/typed_task.py +0 -0
  57. {langroid-0.10.0 → langroid-0.10.2}/langroid/agent_config.py +0 -0
  58. {langroid-0.10.0 → langroid-0.10.2}/langroid/cachedb/__init__.py +0 -0
  59. {langroid-0.10.0 → langroid-0.10.2}/langroid/cachedb/base.py +0 -0
  60. {langroid-0.10.0 → langroid-0.10.2}/langroid/cachedb/momento_cachedb.py +0 -0
  61. {langroid-0.10.0 → langroid-0.10.2}/langroid/cachedb/redis_cachedb.py +0 -0
  62. {langroid-0.10.0 → langroid-0.10.2}/langroid/embedding_models/__init__.py +0 -0
  63. {langroid-0.10.0 → langroid-0.10.2}/langroid/embedding_models/base.py +0 -0
  64. {langroid-0.10.0 → langroid-0.10.2}/langroid/embedding_models/clustering.py +0 -0
  65. {langroid-0.10.0 → langroid-0.10.2}/langroid/embedding_models/models.py +0 -0
  66. {langroid-0.10.0 → langroid-0.10.2}/langroid/embedding_models/protoc/__init__.py +0 -0
  67. {langroid-0.10.0 → langroid-0.10.2}/langroid/embedding_models/protoc/embeddings.proto +0 -0
  68. {langroid-0.10.0 → langroid-0.10.2}/langroid/embedding_models/protoc/embeddings_pb2.py +0 -0
  69. {langroid-0.10.0 → langroid-0.10.2}/langroid/embedding_models/protoc/embeddings_pb2.pyi +0 -0
  70. {langroid-0.10.0 → langroid-0.10.2}/langroid/embedding_models/protoc/embeddings_pb2_grpc.py +0 -0
  71. {langroid-0.10.0 → langroid-0.10.2}/langroid/embedding_models/remote_embeds.py +0 -0
  72. {langroid-0.10.0 → langroid-0.10.2}/langroid/exceptions.py +0 -0
  73. {langroid-0.10.0 → langroid-0.10.2}/langroid/language_models/.chainlit/config.toml +0 -0
  74. {langroid-0.10.0 → langroid-0.10.2}/langroid/language_models/.chainlit/translations/en-US.json +0 -0
  75. {langroid-0.10.0 → langroid-0.10.2}/langroid/language_models/__init__.py +0 -0
  76. {langroid-0.10.0 → langroid-0.10.2}/langroid/language_models/azure_openai.py +0 -0
  77. {langroid-0.10.0 → langroid-0.10.2}/langroid/language_models/base.py +0 -0
  78. {langroid-0.10.0 → langroid-0.10.2}/langroid/language_models/config.py +0 -0
  79. {langroid-0.10.0 → langroid-0.10.2}/langroid/language_models/mock_lm.py +0 -0
  80. {langroid-0.10.0 → langroid-0.10.2}/langroid/language_models/openai_gpt.py +0 -0
  81. {langroid-0.10.0 → langroid-0.10.2}/langroid/language_models/prompt_formatter/__init__.py +0 -0
  82. {langroid-0.10.0 → langroid-0.10.2}/langroid/language_models/prompt_formatter/base.py +0 -0
  83. {langroid-0.10.0 → langroid-0.10.2}/langroid/language_models/prompt_formatter/hf_formatter.py +0 -0
  84. {langroid-0.10.0 → langroid-0.10.2}/langroid/language_models/prompt_formatter/llama2_formatter.py +0 -0
  85. {langroid-0.10.0 → langroid-0.10.2}/langroid/language_models/utils.py +0 -0
  86. {langroid-0.10.0 → langroid-0.10.2}/langroid/mytypes.py +0 -0
  87. {langroid-0.10.0 → langroid-0.10.2}/langroid/parsing/__init__.py +0 -0
  88. {langroid-0.10.0 → langroid-0.10.2}/langroid/parsing/agent_chats.py +0 -0
  89. {langroid-0.10.0 → langroid-0.10.2}/langroid/parsing/code-parsing.md +0 -0
  90. {langroid-0.10.0 → langroid-0.10.2}/langroid/parsing/config.py +0 -0
  91. {langroid-0.10.0 → langroid-0.10.2}/langroid/parsing/document_parser.py +0 -0
  92. {langroid-0.10.0 → langroid-0.10.2}/langroid/parsing/image_text.py +0 -0
  93. {langroid-0.10.0 → langroid-0.10.2}/langroid/parsing/para_sentence_split.py +0 -0
  94. {langroid-0.10.0 → langroid-0.10.2}/langroid/parsing/parse_json.py +0 -0
  95. {langroid-0.10.0 → langroid-0.10.2}/langroid/parsing/parser.py +0 -0
  96. {langroid-0.10.0 → langroid-0.10.2}/langroid/parsing/repo_loader.py +0 -0
  97. {langroid-0.10.0 → langroid-0.10.2}/langroid/parsing/routing.py +0 -0
  98. {langroid-0.10.0 → langroid-0.10.2}/langroid/parsing/search.py +0 -0
  99. {langroid-0.10.0 → langroid-0.10.2}/langroid/parsing/spider.py +0 -0
  100. {langroid-0.10.0 → langroid-0.10.2}/langroid/parsing/table_loader.py +0 -0
  101. {langroid-0.10.0 → langroid-0.10.2}/langroid/parsing/url_loader.py +0 -0
  102. {langroid-0.10.0 → langroid-0.10.2}/langroid/parsing/url_loader_cookies.py +0 -0
  103. {langroid-0.10.0 → langroid-0.10.2}/langroid/parsing/urls.py +0 -0
  104. {langroid-0.10.0 → langroid-0.10.2}/langroid/parsing/utils.py +0 -0
  105. {langroid-0.10.0 → langroid-0.10.2}/langroid/parsing/web_search.py +0 -0
  106. {langroid-0.10.0 → langroid-0.10.2}/langroid/prompts/__init__.py +0 -0
  107. {langroid-0.10.0 → langroid-0.10.2}/langroid/prompts/chat-gpt4-system-prompt.md +0 -0
  108. {langroid-0.10.0 → langroid-0.10.2}/langroid/prompts/dialog.py +0 -0
  109. {langroid-0.10.0 → langroid-0.10.2}/langroid/prompts/prompts_config.py +0 -0
  110. {langroid-0.10.0 → langroid-0.10.2}/langroid/prompts/templates.py +0 -0
  111. {langroid-0.10.0 → langroid-0.10.2}/langroid/pydantic_v1/__init__.py +0 -0
  112. {langroid-0.10.0 → langroid-0.10.2}/langroid/pydantic_v1/main.py +0 -0
  113. {langroid-0.10.0 → langroid-0.10.2}/langroid/utils/__init__.py +0 -0
  114. {langroid-0.10.0 → langroid-0.10.2}/langroid/utils/algorithms/__init__.py +0 -0
  115. {langroid-0.10.0 → langroid-0.10.2}/langroid/utils/algorithms/graph.py +0 -0
  116. {langroid-0.10.0 → langroid-0.10.2}/langroid/utils/configuration.py +0 -0
  117. {langroid-0.10.0 → langroid-0.10.2}/langroid/utils/constants.py +0 -0
  118. {langroid-0.10.0 → langroid-0.10.2}/langroid/utils/docker.py +0 -0
  119. {langroid-0.10.0 → langroid-0.10.2}/langroid/utils/globals.py +0 -0
  120. {langroid-0.10.0 → langroid-0.10.2}/langroid/utils/llms/__init__.py +0 -0
  121. {langroid-0.10.0 → langroid-0.10.2}/langroid/utils/llms/strings.py +0 -0
  122. {langroid-0.10.0 → langroid-0.10.2}/langroid/utils/logging.py +0 -0
  123. {langroid-0.10.0 → langroid-0.10.2}/langroid/utils/object_registry.py +0 -0
  124. {langroid-0.10.0 → langroid-0.10.2}/langroid/utils/output/__init__.py +0 -0
  125. {langroid-0.10.0 → langroid-0.10.2}/langroid/utils/output/citations.py +0 -0
  126. {langroid-0.10.0 → langroid-0.10.2}/langroid/utils/output/printing.py +0 -0
  127. {langroid-0.10.0 → langroid-0.10.2}/langroid/utils/output/status.py +0 -0
  128. {langroid-0.10.0 → langroid-0.10.2}/langroid/utils/pandas_utils.py +0 -0
  129. {langroid-0.10.0 → langroid-0.10.2}/langroid/utils/pydantic_utils.py +0 -0
  130. {langroid-0.10.0 → langroid-0.10.2}/langroid/utils/system.py +0 -0
  131. {langroid-0.10.0 → langroid-0.10.2}/langroid/utils/web/__init__.py +0 -0
  132. {langroid-0.10.0 → langroid-0.10.2}/langroid/utils/web/login.py +0 -0
  133. {langroid-0.10.0 → langroid-0.10.2}/langroid/vector_store/__init__.py +0 -0
  134. {langroid-0.10.0 → langroid-0.10.2}/langroid/vector_store/base.py +0 -0
  135. {langroid-0.10.0 → langroid-0.10.2}/langroid/vector_store/chromadb.py +0 -0
  136. {langroid-0.10.0 → langroid-0.10.2}/langroid/vector_store/lancedb.py +0 -0
  137. {langroid-0.10.0 → langroid-0.10.2}/langroid/vector_store/meilisearch.py +0 -0
  138. {langroid-0.10.0 → langroid-0.10.2}/langroid/vector_store/momento.py +0 -0
  139. {langroid-0.10.0 → langroid-0.10.2}/langroid/vector_store/qdrant_cloud.py +0 -0
  140. {langroid-0.10.0 → langroid-0.10.2}/langroid/vector_store/qdrantdb.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: langroid
3
- Version: 0.10.0
3
+ Version: 0.10.2
4
4
  Summary: Harness LLMs with Multi-Agent Programming
5
5
  License: MIT
6
6
  Author: Prasad Chalasani
@@ -162,6 +162,9 @@ into simplifying the developer experience; it does not use `Langchain`.
162
162
  :fire: See this [Intro to Langroid](https://lancedb.substack.com/p/langoid-multi-agent-programming-framework)
163
163
  blog post from the LanceDB team
164
164
 
165
+ :fire: Just published in ML for Healthcare (2024): a Langroid-based Multi-Agent RAG system for
166
+ pharmacovigilance, see [blog post](https://langroid.github.io/langroid/blog/2024/08/12/malade-multi-agent-architecture-for-pharmacovigilance/)
167
+
165
168
 
166
169
  We welcome contributions -- See the [contributions](./CONTRIBUTING.md) document
167
170
  for ideas on what to contribute.
@@ -55,6 +55,9 @@ into simplifying the developer experience; it does not use `Langchain`.
55
55
  :fire: See this [Intro to Langroid](https://lancedb.substack.com/p/langoid-multi-agent-programming-framework)
56
56
  blog post from the LanceDB team
57
57
 
58
+ :fire: Just published in ML for Healthcare (2024): a Langroid-based Multi-Agent RAG system for
59
+ pharmacovigilance, see [blog post](https://langroid.github.io/langroid/blog/2024/08/12/malade-multi-agent-architecture-for-pharmacovigilance/)
60
+
58
61
 
59
62
  We welcome contributions -- See the [contributions](./CONTRIBUTING.md) document
60
63
  for ideas on what to contribute.
@@ -150,7 +150,6 @@ class Agent(ABC):
150
150
  show_start_response=noop_fn,
151
151
  )
152
152
  Agent.init_state(self)
153
- self.init_state()
154
153
 
155
154
  def init_state(self) -> None:
156
155
  """Initialize all state vars. Called by Task.run() if restart is True"""
@@ -1069,9 +1068,12 @@ class Agent(ABC):
1069
1068
  return None
1070
1069
  if len(tools) == 0:
1071
1070
  fallback_result = self.handle_message_fallback(msg)
1072
- if fallback_result is not None and isinstance(fallback_result, ToolMessage):
1073
- return self.create_agent_response(tool_messages=[fallback_result])
1074
- return fallback_result
1071
+ if fallback_result is None:
1072
+ return None
1073
+ return self._process_handle_message_result(
1074
+ fallback_result,
1075
+ chat_doc=msg if isinstance(msg, ChatDocument) else None,
1076
+ )
1075
1077
  has_ids = all([t.id != "" for t in tools])
1076
1078
  chat_doc = msg if isinstance(msg, ChatDocument) else None
1077
1079
 
@@ -1162,9 +1164,7 @@ class Agent(ABC):
1162
1164
  final = "\n\n".join(str_results)
1163
1165
  return final
1164
1166
 
1165
- def handle_message_fallback(
1166
- self, msg: str | ChatDocument
1167
- ) -> str | ChatDocument | None:
1167
+ def handle_message_fallback(self, msg: str | ChatDocument) -> Any:
1168
1168
  """
1169
1169
  Fallback method for the "no-tools" scenario.
1170
1170
  This method can be overridden by subclasses, e.g.,
@@ -1174,8 +1174,7 @@ class Agent(ABC):
1174
1174
  Args:
1175
1175
  msg (str | ChatDocument): The input msg to handle
1176
1176
  Returns:
1177
- str: The result of the handler method in string form so it can
1178
- be handled by LLM
1177
+ Any: The result of the handler method
1179
1178
  """
1180
1179
  return None
1181
1180
 
@@ -1261,6 +1260,52 @@ class Agent(ABC):
1261
1260
  raise ve
1262
1261
  return message
1263
1262
 
1263
+ def _process_handle_message_result(
1264
+ self,
1265
+ msg: Any,
1266
+ orig_tool_name: str | None = None,
1267
+ chat_doc: Optional[ChatDocument] = None,
1268
+ ) -> None | str | ChatDocument:
1269
+ """
1270
+ Process result of agent_response or tool handler, or handle_message_fallback.
1271
+ """
1272
+ if isinstance(msg, ToolMessage):
1273
+ # result is a ToolMessage, so...
1274
+ result_tool_name = msg.default_value("request")
1275
+ if result_tool_name in self.llm_tools_handled and (
1276
+ orig_tool_name is None or orig_tool_name != result_tool_name
1277
+ ):
1278
+ # TODO: do we need to remove the tool message from the chat_doc?
1279
+ # if (chat_doc is not None and
1280
+ # msg in chat_doc.tool_messages):
1281
+ # chat_doc.tool_messages.remove(msg)
1282
+ # if we can handle it, do so
1283
+ result = self.handle_tool_message(msg, chat_doc=chat_doc)
1284
+ else:
1285
+ # else wrap it in an agent response and return it so
1286
+ # orchestrator can find a respondent
1287
+ result = self.create_agent_response(tool_messages=[msg])
1288
+ elif isinstance(msg, (ChatDocument, str)):
1289
+ result = msg
1290
+ elif isinstance(msg, BaseModel):
1291
+ result = msg.json()
1292
+ else:
1293
+ # last resort: use json.dumps() or str() to make it a str
1294
+ try:
1295
+ result = json.dumps(msg)
1296
+ except Exception:
1297
+ try:
1298
+ result = str(msg)
1299
+ except Exception as e:
1300
+ logger.error(
1301
+ f"""
1302
+ Error converting msg handler result to str: {e}",
1303
+ """,
1304
+ exc_info=True,
1305
+ )
1306
+ result = None
1307
+ return result
1308
+
1264
1309
  def handle_tool_message(
1265
1310
  self,
1266
1311
  tool: ToolMessage,
@@ -1290,42 +1335,9 @@ class Agent(ABC):
1290
1335
  maybe_result = handler_method(tool, chat_doc=chat_doc)
1291
1336
  else:
1292
1337
  maybe_result = handler_method(tool)
1293
- if isinstance(maybe_result, ToolMessage):
1294
- # result is a ToolMessage, so...
1295
- result_tool_name = maybe_result.default_value("request")
1296
- if (
1297
- result_tool_name in self.llm_tools_handled
1298
- and tool_name != result_tool_name
1299
- ):
1300
- # TODO: do we need to remove the tool message from the chat_doc?
1301
- # if (chat_doc is not None and
1302
- # maybe_result in chat_doc.tool_messages):
1303
- # chat_doc.tool_messages.remove(maybe_result)
1304
- # if we can handle it, do so
1305
- result = self.handle_tool_message(maybe_result, chat_doc=chat_doc)
1306
- else:
1307
- # else wrap it in an agent response and return it so
1308
- # orchestrator can find a respondent
1309
- result = self.create_agent_response(tool_messages=[maybe_result])
1310
- elif isinstance(maybe_result, (ChatDocument, str)):
1311
- result = maybe_result
1312
- elif isinstance(maybe_result, BaseModel):
1313
- result = maybe_result.json()
1314
- else:
1315
- # last resort: use json.dumps() or str() to make it a str
1316
- try:
1317
- result = json.dumps(maybe_result)
1318
- except Exception:
1319
- try:
1320
- result = str(maybe_result)
1321
- except Exception as e:
1322
- logger.error(
1323
- f"""
1324
- Error converting result of {tool_name} to str: {e}",
1325
- """,
1326
- exc_info=True,
1327
- )
1328
- result = None
1338
+ result = self._process_handle_message_result(
1339
+ maybe_result, tool_name, chat_doc
1340
+ )
1329
1341
  except Exception as e:
1330
1342
  # raise the error here since we are sure it's
1331
1343
  # not a pydantic validation error,
@@ -118,7 +118,7 @@ class ChatAgent(Agent):
118
118
  self.config: ChatAgentConfig = config
119
119
  self.config._set_fn_or_tools(self._fn_call_available())
120
120
  self.message_history: List[LLMMessage] = []
121
- self.tool_instructions_added: bool = False
121
+ self.init_state()
122
122
  # An agent's "task" is defined by a system msg and an optional user msg;
123
123
  # These are "priming" messages that kick off the agent's conversation.
124
124
  self.system_message: str = self.config.system_message
@@ -172,6 +172,15 @@ class ChatAgent(Agent):
172
172
  self.enable_message(SendTool, use=False, handle=True)
173
173
  self.enable_message(AgentSendTool, use=False, handle=True)
174
174
 
175
+ def init_state(self) -> None:
176
+ """
177
+ Initialize the state of the agent. Just conversation state here,
178
+ but subclasses can override this to initialize other state.
179
+ """
180
+ super().init_state()
181
+ self.clear_history(0)
182
+ self.clear_dialog()
183
+
175
184
  @staticmethod
176
185
  def from_id(id: str) -> "ChatAgent":
177
186
  """
@@ -169,6 +169,7 @@ class QueryPlanCritic(ChatAgent):
169
169
  self.enable_message(AgentDoneTool, use=False, handle=True)
170
170
 
171
171
  def init_state(self) -> None:
172
+ super().init_state()
172
173
  self.expecting_feedback_tool = False
173
174
 
174
175
  def query_plan_answer(self, msg: QueryPlanAnswerTool) -> str:
@@ -51,11 +51,13 @@ class LanceRAGTaskCreator:
51
51
  critic_name=critic_name,
52
52
  doc_agent_name=doc_agent_name,
53
53
  doc_schema=agent._get_clean_vecdb_schema(),
54
+ llm=agent.config.llm,
54
55
  )
55
56
  query_plan_agent_config.set_system_message()
56
57
 
57
58
  critic_config = QueryPlanCriticConfig(
58
59
  doc_schema=agent._get_clean_vecdb_schema(),
60
+ llm=agent.config.llm,
59
61
  )
60
62
  critic_config.set_system_message()
61
63
 
@@ -144,6 +144,7 @@ class LanceQueryPlanAgent(ChatAgent):
144
144
  self.enable_message(AgentDoneTool, use=False, handle=True)
145
145
 
146
146
  def init_state(self) -> None:
147
+ super().init_state()
147
148
  self.curr_query_plan: QueryPlan | None = None
148
149
  self.expecting_query_plan: bool = False
149
150
  # how many times re-trying query plan in response to feedback:
@@ -259,8 +259,7 @@ class Task:
259
259
  agent = cast(ChatAgent, agent)
260
260
  self.agent: ChatAgent = agent
261
261
  if isinstance(agent, ChatAgent) and len(agent.message_history) == 0 or restart:
262
- self.agent.clear_history(0)
263
- self.agent.clear_dialog()
262
+ self.agent.init_state()
264
263
  # possibly change the system and user messages
265
264
  if system_message:
266
265
  # we always have at least 1 task_message
@@ -579,8 +578,6 @@ class Task:
579
578
  Recursively reset message history & state of own agent and
580
579
  those of all sub-tasks.
581
580
  """
582
- self.agent.clear_history(0)
583
- self.agent.clear_dialog()
584
581
  self.agent.init_state()
585
582
  for t in self.sub_tasks:
586
583
  t.reset_all_sub_tasks()
@@ -296,6 +296,17 @@ class FinalResultTool(ToolMessage):
296
296
 
297
297
  request: str = ""
298
298
  purpose: str = "Ignored; Wrapper for a structured message"
299
+ id: str = "" # placeholder for OpenAI-API tool_call_id
300
+
301
+ _handle_only: bool = False # only allow handling, but not use (LLM-generation)?
299
302
 
300
303
  class Config:
301
304
  extra = Extra.allow
305
+ # only HANDLING allowed, NOT "use" (i.e LLM generation)
306
+ handle_only: bool = False
307
+ arbitrary_types_allowed = False
308
+ validate_all = True
309
+ validate_assignment = True
310
+ # do not include these fields in the generated schema
311
+ # since we don't require the LLM to specify them
312
+ schema_extra = {"exclude": {"purpose", "id"}}
@@ -115,5 +115,7 @@ class CodeParser:
115
115
  for d in docs
116
116
  if d.metadata.language in self.config.extensions # type: ignore
117
117
  ]
118
+ if len(chunked_docs) == 0:
119
+ return []
118
120
  # collapse the list of lists into a single list
119
121
  return reduce(lambda x, y: x + y, chunked_docs)
@@ -1,6 +1,6 @@
1
1
  [tool.poetry]
2
2
  name = "langroid"
3
- version = "0.10.0"
3
+ version = "0.10.2"
4
4
  description = "Harness LLMs with Multi-Agent Programming"
5
5
  authors = ["Prasad Chalasani <pchalasani@gmail.com>"]
6
6
  readme = "README.md"
@@ -90,6 +90,7 @@ async-generator = "^1.10"
90
90
  python-magic = "^0.4.27"
91
91
  json-repair = "^0.27.0"
92
92
 
93
+
93
94
  [tool.poetry.extras]
94
95
  # install these using, e.g.,
95
96
  # `poetry install -E [...]` where [...] is one of the extras below
@@ -169,14 +170,14 @@ optional = true
169
170
 
170
171
  mkdocs = "^1.4.2"
171
172
  mkdocs-material = "^9.1.5"
172
- mkdocstrings = {extras = ["python"], version = "^0.21.2"}
173
+ mkdocstrings = {extras = ["python"], version = "^0.25.2"}
173
174
  mkdocs-awesome-pages-plugin = "^2.8.0"
174
175
  mkdocs-rss-plugin = "^1.8.0"
175
176
  mkdocs-gen-files = "^0.4.0"
176
177
  mkdocs-literate-nav = "^0.6.0"
177
178
  mkdocs-section-index = "^0.3.5"
178
179
  mkdocs-jupyter = "^0.24.1"
179
-
180
+ griffe = "<1.0.0"
180
181
 
181
182
 
182
183
  # ========================================
File without changes
File without changes
File without changes