langroid 0.38.0__tar.gz → 0.39.0__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 (130) hide show
  1. {langroid-0.38.0 → langroid-0.39.0}/PKG-INFO +1 -1
  2. {langroid-0.38.0 → langroid-0.39.0}/langroid/agent/base.py +5 -0
  3. {langroid-0.38.0 → langroid-0.39.0}/langroid/agent/chat_agent.py +29 -1
  4. {langroid-0.38.0 → langroid-0.39.0}/langroid/mytypes.py +9 -0
  5. {langroid-0.38.0 → langroid-0.39.0}/pyproject.toml +1 -1
  6. {langroid-0.38.0 → langroid-0.39.0}/.gitignore +0 -0
  7. {langroid-0.38.0 → langroid-0.39.0}/LICENSE +0 -0
  8. {langroid-0.38.0 → langroid-0.39.0}/README.md +0 -0
  9. {langroid-0.38.0 → langroid-0.39.0}/langroid/__init__.py +0 -0
  10. {langroid-0.38.0 → langroid-0.39.0}/langroid/agent/__init__.py +0 -0
  11. {langroid-0.38.0 → langroid-0.39.0}/langroid/agent/batch.py +0 -0
  12. {langroid-0.38.0 → langroid-0.39.0}/langroid/agent/callbacks/__init__.py +0 -0
  13. {langroid-0.38.0 → langroid-0.39.0}/langroid/agent/callbacks/chainlit.py +0 -0
  14. {langroid-0.38.0 → langroid-0.39.0}/langroid/agent/chat_document.py +0 -0
  15. {langroid-0.38.0 → langroid-0.39.0}/langroid/agent/openai_assistant.py +0 -0
  16. {langroid-0.38.0 → langroid-0.39.0}/langroid/agent/special/__init__.py +0 -0
  17. {langroid-0.38.0 → langroid-0.39.0}/langroid/agent/special/arangodb/__init__.py +0 -0
  18. {langroid-0.38.0 → langroid-0.39.0}/langroid/agent/special/arangodb/arangodb_agent.py +0 -0
  19. {langroid-0.38.0 → langroid-0.39.0}/langroid/agent/special/arangodb/system_messages.py +0 -0
  20. {langroid-0.38.0 → langroid-0.39.0}/langroid/agent/special/arangodb/tools.py +0 -0
  21. {langroid-0.38.0 → langroid-0.39.0}/langroid/agent/special/arangodb/utils.py +0 -0
  22. {langroid-0.38.0 → langroid-0.39.0}/langroid/agent/special/doc_chat_agent.py +0 -0
  23. {langroid-0.38.0 → langroid-0.39.0}/langroid/agent/special/lance_doc_chat_agent.py +0 -0
  24. {langroid-0.38.0 → langroid-0.39.0}/langroid/agent/special/lance_rag/__init__.py +0 -0
  25. {langroid-0.38.0 → langroid-0.39.0}/langroid/agent/special/lance_rag/critic_agent.py +0 -0
  26. {langroid-0.38.0 → langroid-0.39.0}/langroid/agent/special/lance_rag/lance_rag_task.py +0 -0
  27. {langroid-0.38.0 → langroid-0.39.0}/langroid/agent/special/lance_rag/query_planner_agent.py +0 -0
  28. {langroid-0.38.0 → langroid-0.39.0}/langroid/agent/special/lance_tools.py +0 -0
  29. {langroid-0.38.0 → langroid-0.39.0}/langroid/agent/special/neo4j/__init__.py +0 -0
  30. {langroid-0.38.0 → langroid-0.39.0}/langroid/agent/special/neo4j/csv_kg_chat.py +0 -0
  31. {langroid-0.38.0 → langroid-0.39.0}/langroid/agent/special/neo4j/neo4j_chat_agent.py +0 -0
  32. {langroid-0.38.0 → langroid-0.39.0}/langroid/agent/special/neo4j/system_messages.py +0 -0
  33. {langroid-0.38.0 → langroid-0.39.0}/langroid/agent/special/neo4j/tools.py +0 -0
  34. {langroid-0.38.0 → langroid-0.39.0}/langroid/agent/special/relevance_extractor_agent.py +0 -0
  35. {langroid-0.38.0 → langroid-0.39.0}/langroid/agent/special/retriever_agent.py +0 -0
  36. {langroid-0.38.0 → langroid-0.39.0}/langroid/agent/special/sql/__init__.py +0 -0
  37. {langroid-0.38.0 → langroid-0.39.0}/langroid/agent/special/sql/sql_chat_agent.py +0 -0
  38. {langroid-0.38.0 → langroid-0.39.0}/langroid/agent/special/sql/utils/__init__.py +0 -0
  39. {langroid-0.38.0 → langroid-0.39.0}/langroid/agent/special/sql/utils/description_extractors.py +0 -0
  40. {langroid-0.38.0 → langroid-0.39.0}/langroid/agent/special/sql/utils/populate_metadata.py +0 -0
  41. {langroid-0.38.0 → langroid-0.39.0}/langroid/agent/special/sql/utils/system_message.py +0 -0
  42. {langroid-0.38.0 → langroid-0.39.0}/langroid/agent/special/sql/utils/tools.py +0 -0
  43. {langroid-0.38.0 → langroid-0.39.0}/langroid/agent/special/table_chat_agent.py +0 -0
  44. {langroid-0.38.0 → langroid-0.39.0}/langroid/agent/task.py +0 -0
  45. {langroid-0.38.0 → langroid-0.39.0}/langroid/agent/tool_message.py +0 -0
  46. {langroid-0.38.0 → langroid-0.39.0}/langroid/agent/tools/__init__.py +0 -0
  47. {langroid-0.38.0 → langroid-0.39.0}/langroid/agent/tools/duckduckgo_search_tool.py +0 -0
  48. {langroid-0.38.0 → langroid-0.39.0}/langroid/agent/tools/file_tools.py +0 -0
  49. {langroid-0.38.0 → langroid-0.39.0}/langroid/agent/tools/google_search_tool.py +0 -0
  50. {langroid-0.38.0 → langroid-0.39.0}/langroid/agent/tools/metaphor_search_tool.py +0 -0
  51. {langroid-0.38.0 → langroid-0.39.0}/langroid/agent/tools/orchestration.py +0 -0
  52. {langroid-0.38.0 → langroid-0.39.0}/langroid/agent/tools/recipient_tool.py +0 -0
  53. {langroid-0.38.0 → langroid-0.39.0}/langroid/agent/tools/retrieval_tool.py +0 -0
  54. {langroid-0.38.0 → langroid-0.39.0}/langroid/agent/tools/rewind_tool.py +0 -0
  55. {langroid-0.38.0 → langroid-0.39.0}/langroid/agent/tools/segment_extract_tool.py +0 -0
  56. {langroid-0.38.0 → langroid-0.39.0}/langroid/agent/xml_tool_message.py +0 -0
  57. {langroid-0.38.0 → langroid-0.39.0}/langroid/cachedb/__init__.py +0 -0
  58. {langroid-0.38.0 → langroid-0.39.0}/langroid/cachedb/base.py +0 -0
  59. {langroid-0.38.0 → langroid-0.39.0}/langroid/cachedb/momento_cachedb.py +0 -0
  60. {langroid-0.38.0 → langroid-0.39.0}/langroid/cachedb/redis_cachedb.py +0 -0
  61. {langroid-0.38.0 → langroid-0.39.0}/langroid/embedding_models/__init__.py +0 -0
  62. {langroid-0.38.0 → langroid-0.39.0}/langroid/embedding_models/base.py +0 -0
  63. {langroid-0.38.0 → langroid-0.39.0}/langroid/embedding_models/models.py +0 -0
  64. {langroid-0.38.0 → langroid-0.39.0}/langroid/embedding_models/protoc/__init__.py +0 -0
  65. {langroid-0.38.0 → langroid-0.39.0}/langroid/embedding_models/protoc/embeddings.proto +0 -0
  66. {langroid-0.38.0 → langroid-0.39.0}/langroid/embedding_models/protoc/embeddings_pb2.py +0 -0
  67. {langroid-0.38.0 → langroid-0.39.0}/langroid/embedding_models/protoc/embeddings_pb2.pyi +0 -0
  68. {langroid-0.38.0 → langroid-0.39.0}/langroid/embedding_models/protoc/embeddings_pb2_grpc.py +0 -0
  69. {langroid-0.38.0 → langroid-0.39.0}/langroid/embedding_models/remote_embeds.py +0 -0
  70. {langroid-0.38.0 → langroid-0.39.0}/langroid/exceptions.py +0 -0
  71. {langroid-0.38.0 → langroid-0.39.0}/langroid/language_models/__init__.py +0 -0
  72. {langroid-0.38.0 → langroid-0.39.0}/langroid/language_models/azure_openai.py +0 -0
  73. {langroid-0.38.0 → langroid-0.39.0}/langroid/language_models/base.py +0 -0
  74. {langroid-0.38.0 → langroid-0.39.0}/langroid/language_models/config.py +0 -0
  75. {langroid-0.38.0 → langroid-0.39.0}/langroid/language_models/mock_lm.py +0 -0
  76. {langroid-0.38.0 → langroid-0.39.0}/langroid/language_models/openai_gpt.py +0 -0
  77. {langroid-0.38.0 → langroid-0.39.0}/langroid/language_models/prompt_formatter/__init__.py +0 -0
  78. {langroid-0.38.0 → langroid-0.39.0}/langroid/language_models/prompt_formatter/base.py +0 -0
  79. {langroid-0.38.0 → langroid-0.39.0}/langroid/language_models/prompt_formatter/hf_formatter.py +0 -0
  80. {langroid-0.38.0 → langroid-0.39.0}/langroid/language_models/prompt_formatter/llama2_formatter.py +0 -0
  81. {langroid-0.38.0 → langroid-0.39.0}/langroid/language_models/utils.py +0 -0
  82. {langroid-0.38.0 → langroid-0.39.0}/langroid/parsing/__init__.py +0 -0
  83. {langroid-0.38.0 → langroid-0.39.0}/langroid/parsing/agent_chats.py +0 -0
  84. {langroid-0.38.0 → langroid-0.39.0}/langroid/parsing/code_parser.py +0 -0
  85. {langroid-0.38.0 → langroid-0.39.0}/langroid/parsing/document_parser.py +0 -0
  86. {langroid-0.38.0 → langroid-0.39.0}/langroid/parsing/para_sentence_split.py +0 -0
  87. {langroid-0.38.0 → langroid-0.39.0}/langroid/parsing/parse_json.py +0 -0
  88. {langroid-0.38.0 → langroid-0.39.0}/langroid/parsing/parser.py +0 -0
  89. {langroid-0.38.0 → langroid-0.39.0}/langroid/parsing/pdf_utils.py +0 -0
  90. {langroid-0.38.0 → langroid-0.39.0}/langroid/parsing/repo_loader.py +0 -0
  91. {langroid-0.38.0 → langroid-0.39.0}/langroid/parsing/routing.py +0 -0
  92. {langroid-0.38.0 → langroid-0.39.0}/langroid/parsing/search.py +0 -0
  93. {langroid-0.38.0 → langroid-0.39.0}/langroid/parsing/spider.py +0 -0
  94. {langroid-0.38.0 → langroid-0.39.0}/langroid/parsing/table_loader.py +0 -0
  95. {langroid-0.38.0 → langroid-0.39.0}/langroid/parsing/url_loader.py +0 -0
  96. {langroid-0.38.0 → langroid-0.39.0}/langroid/parsing/urls.py +0 -0
  97. {langroid-0.38.0 → langroid-0.39.0}/langroid/parsing/utils.py +0 -0
  98. {langroid-0.38.0 → langroid-0.39.0}/langroid/parsing/web_search.py +0 -0
  99. {langroid-0.38.0 → langroid-0.39.0}/langroid/prompts/__init__.py +0 -0
  100. {langroid-0.38.0 → langroid-0.39.0}/langroid/prompts/dialog.py +0 -0
  101. {langroid-0.38.0 → langroid-0.39.0}/langroid/prompts/prompts_config.py +0 -0
  102. {langroid-0.38.0 → langroid-0.39.0}/langroid/prompts/templates.py +0 -0
  103. {langroid-0.38.0 → langroid-0.39.0}/langroid/py.typed +0 -0
  104. {langroid-0.38.0 → langroid-0.39.0}/langroid/pydantic_v1/__init__.py +0 -0
  105. {langroid-0.38.0 → langroid-0.39.0}/langroid/pydantic_v1/main.py +0 -0
  106. {langroid-0.38.0 → langroid-0.39.0}/langroid/utils/__init__.py +0 -0
  107. {langroid-0.38.0 → langroid-0.39.0}/langroid/utils/algorithms/__init__.py +0 -0
  108. {langroid-0.38.0 → langroid-0.39.0}/langroid/utils/algorithms/graph.py +0 -0
  109. {langroid-0.38.0 → langroid-0.39.0}/langroid/utils/configuration.py +0 -0
  110. {langroid-0.38.0 → langroid-0.39.0}/langroid/utils/constants.py +0 -0
  111. {langroid-0.38.0 → langroid-0.39.0}/langroid/utils/git_utils.py +0 -0
  112. {langroid-0.38.0 → langroid-0.39.0}/langroid/utils/globals.py +0 -0
  113. {langroid-0.38.0 → langroid-0.39.0}/langroid/utils/logging.py +0 -0
  114. {langroid-0.38.0 → langroid-0.39.0}/langroid/utils/object_registry.py +0 -0
  115. {langroid-0.38.0 → langroid-0.39.0}/langroid/utils/output/__init__.py +0 -0
  116. {langroid-0.38.0 → langroid-0.39.0}/langroid/utils/output/citations.py +0 -0
  117. {langroid-0.38.0 → langroid-0.39.0}/langroid/utils/output/printing.py +0 -0
  118. {langroid-0.38.0 → langroid-0.39.0}/langroid/utils/output/status.py +0 -0
  119. {langroid-0.38.0 → langroid-0.39.0}/langroid/utils/pandas_utils.py +0 -0
  120. {langroid-0.38.0 → langroid-0.39.0}/langroid/utils/pydantic_utils.py +0 -0
  121. {langroid-0.38.0 → langroid-0.39.0}/langroid/utils/system.py +0 -0
  122. {langroid-0.38.0 → langroid-0.39.0}/langroid/utils/types.py +0 -0
  123. {langroid-0.38.0 → langroid-0.39.0}/langroid/vector_store/__init__.py +0 -0
  124. {langroid-0.38.0 → langroid-0.39.0}/langroid/vector_store/base.py +0 -0
  125. {langroid-0.38.0 → langroid-0.39.0}/langroid/vector_store/chromadb.py +0 -0
  126. {langroid-0.38.0 → langroid-0.39.0}/langroid/vector_store/lancedb.py +0 -0
  127. {langroid-0.38.0 → langroid-0.39.0}/langroid/vector_store/meilisearch.py +0 -0
  128. {langroid-0.38.0 → langroid-0.39.0}/langroid/vector_store/momento.py +0 -0
  129. {langroid-0.38.0 → langroid-0.39.0}/langroid/vector_store/qdrantdb.py +0 -0
  130. {langroid-0.38.0 → langroid-0.39.0}/langroid/vector_store/weaviatedb.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: langroid
3
- Version: 0.38.0
3
+ Version: 0.39.0
4
4
  Summary: Harness LLMs with Multi-Agent Programming
5
5
  Author-email: Prasad Chalasani <pchalasani@gmail.com>
6
6
  License: MIT
@@ -333,6 +333,11 @@ class Agent(ABC):
333
333
  if hasattr(message_class, "handle_message_fallback") and (
334
334
  inspect.isfunction(message_class.handle_message_fallback)
335
335
  ):
336
+ # When a ToolMessage has a `handle_message_fallback` method,
337
+ # we inject it into the agent as a method, overriding the default
338
+ # `handle_message_fallback` method (which does nothing).
339
+ # It's possible multiple tool messages have a `handle_message_fallback`,
340
+ # in which case, the last one inserted will be used.
336
341
  setattr(
337
342
  self,
338
343
  "handle_message_fallback",
@@ -5,7 +5,7 @@ import logging
5
5
  import textwrap
6
6
  from contextlib import ExitStack
7
7
  from inspect import isclass
8
- from typing import Dict, List, Optional, Self, Set, Tuple, Type, Union, cast
8
+ from typing import Any, Dict, List, Optional, Self, Set, Tuple, Type, Union, cast
9
9
 
10
10
  import openai
11
11
  from rich import print
@@ -31,6 +31,7 @@ from langroid.language_models.base import (
31
31
  ToolChoiceTypes,
32
32
  )
33
33
  from langroid.language_models.openai_gpt import OpenAIGPT
34
+ from langroid.mytypes import Entity, Routing
34
35
  from langroid.pydantic_v1 import BaseModel, ValidationError
35
36
  from langroid.utils.configuration import settings
36
37
  from langroid.utils.object_registry import ObjectRegistry
@@ -52,6 +53,7 @@ class ChatAgentConfig(AgentConfig):
52
53
  user_message: user message to include in message sequence.
53
54
  Used only if `task` is not specified in the constructor.
54
55
  use_tools: whether to use our own ToolMessages mechanism
56
+ non_tool_routing (Routing|str): routing when LLM generates non-tool msg.
55
57
  use_functions_api: whether to use functions/tools native to the LLM API
56
58
  (e.g. OpenAI's `function_call` or `tool_call` mechanism)
57
59
  use_tools_api: When `use_functions_api` is True, if this is also True,
@@ -84,6 +86,7 @@ class ChatAgentConfig(AgentConfig):
84
86
 
85
87
  system_message: str = "You are a helpful assistant."
86
88
  user_message: Optional[str] = None
89
+ non_tool_routing: Routing | None = None
87
90
  use_tools: bool = False
88
91
  use_functions_api: bool = True
89
92
  use_tools_api: bool = False
@@ -579,6 +582,31 @@ class ChatAgent(Agent):
579
582
  # remove leading and trailing newlines and other whitespace
580
583
  return LLMMessage(role=Role.SYSTEM, content=content.strip())
581
584
 
585
+ def handle_message_fallback(self, msg: str | ChatDocument) -> Any:
586
+ """
587
+ Fallback method for the "no-tools" scenario.
588
+ Users the self.config.non_tool_routing to determine the action to take.
589
+
590
+ This method can be overridden by subclasses, e.g.,
591
+ to create a "reminder" message when a tool is expected but the LLM "forgot"
592
+ to generate one.
593
+
594
+ Args:
595
+ msg (str | ChatDocument): The input msg to handle
596
+ Returns:
597
+ Any: The result of the handler method
598
+ """
599
+ if self.config.non_tool_routing is None:
600
+ return None
601
+ if isinstance(msg, ChatDocument) and msg.metadata.sender == Entity.LLM:
602
+ from langroid.agent.tools.orchestration import AgentDoneTool, ForwardTool
603
+
604
+ match self.config.non_tool_routing:
605
+ case Routing.FORWARD_USER:
606
+ return ForwardTool(agent="User")
607
+ case Routing.DONE:
608
+ return AgentDoneTool(content=msg.content, tools=msg.tool_messages)
609
+
582
610
  def unhandled_tools(self) -> set[str]:
583
611
  """The set of tools that are known but not handled.
584
612
  Useful in task flow: an agent can refuse to accept an incoming msg
@@ -93,3 +93,12 @@ class Document(BaseModel):
93
93
  SOURCE:{self.metadata.source}
94
94
  """
95
95
  )
96
+
97
+
98
+ class Routing(str, Enum):
99
+ """
100
+ Possible Routing options. Mainly used to handle non-tool msgs from LLM.
101
+ """
102
+
103
+ FORWARD_USER = "user" # forward msg to user
104
+ DONE = "done" # task done
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "langroid"
3
- version = "0.38.0"
3
+ version = "0.39.0"
4
4
  authors = [
5
5
  {name = "Prasad Chalasani", email = "pchalasani@gmail.com"},
6
6
  ]
File without changes
File without changes
File without changes
File without changes