langroid 0.23.3__tar.gz → 0.24.1__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 (148) hide show
  1. {langroid-0.23.3 → langroid-0.24.1}/PKG-INFO +3 -1
  2. {langroid-0.23.3 → langroid-0.24.1}/README.md +2 -0
  3. {langroid-0.23.3 → langroid-0.24.1}/langroid/agent/base.py +40 -5
  4. {langroid-0.23.3 → langroid-0.24.1}/langroid/agent/chat_agent.py +667 -16
  5. {langroid-0.23.3 → langroid-0.24.1}/langroid/agent/chat_document.py +8 -3
  6. {langroid-0.23.3 → langroid-0.24.1}/langroid/agent/openai_assistant.py +1 -1
  7. {langroid-0.23.3 → langroid-0.24.1}/langroid/agent/special/sql/sql_chat_agent.py +20 -6
  8. {langroid-0.23.3 → langroid-0.24.1}/langroid/agent/task.py +62 -3
  9. {langroid-0.23.3 → langroid-0.24.1}/langroid/agent/tool_message.py +82 -2
  10. {langroid-0.23.3 → langroid-0.24.1}/langroid/agent/tools/orchestration.py +2 -2
  11. {langroid-0.23.3 → langroid-0.24.1}/langroid/agent/xml_tool_message.py +43 -28
  12. {langroid-0.23.3 → langroid-0.24.1}/langroid/language_models/azure_openai.py +18 -5
  13. {langroid-0.23.3 → langroid-0.24.1}/langroid/language_models/base.py +22 -0
  14. {langroid-0.23.3 → langroid-0.24.1}/langroid/language_models/mock_lm.py +3 -0
  15. {langroid-0.23.3 → langroid-0.24.1}/langroid/language_models/openai_gpt.py +81 -4
  16. {langroid-0.23.3 → langroid-0.24.1}/langroid/utils/pydantic_utils.py +11 -0
  17. {langroid-0.23.3 → langroid-0.24.1}/pyproject.toml +2 -2
  18. {langroid-0.23.3 → langroid-0.24.1}/LICENSE +0 -0
  19. {langroid-0.23.3 → langroid-0.24.1}/langroid/__init__.py +0 -0
  20. {langroid-0.23.3 → langroid-0.24.1}/langroid/agent/__init__.py +0 -0
  21. {langroid-0.23.3 → langroid-0.24.1}/langroid/agent/batch.py +0 -0
  22. {langroid-0.23.3 → langroid-0.24.1}/langroid/agent/callbacks/__init__.py +0 -0
  23. {langroid-0.23.3 → langroid-0.24.1}/langroid/agent/callbacks/chainlit.py +0 -0
  24. {langroid-0.23.3 → langroid-0.24.1}/langroid/agent/helpers.py +0 -0
  25. {langroid-0.23.3 → langroid-0.24.1}/langroid/agent/junk +0 -0
  26. {langroid-0.23.3 → langroid-0.24.1}/langroid/agent/special/__init__.py +0 -0
  27. {langroid-0.23.3 → langroid-0.24.1}/langroid/agent/special/arangodb/__init__.py +0 -0
  28. {langroid-0.23.3 → langroid-0.24.1}/langroid/agent/special/arangodb/arangodb_agent.py +0 -0
  29. {langroid-0.23.3 → langroid-0.24.1}/langroid/agent/special/arangodb/system_messages.py +0 -0
  30. {langroid-0.23.3 → langroid-0.24.1}/langroid/agent/special/arangodb/tools.py +0 -0
  31. {langroid-0.23.3 → langroid-0.24.1}/langroid/agent/special/arangodb/utils.py +0 -0
  32. {langroid-0.23.3 → langroid-0.24.1}/langroid/agent/special/doc_chat_agent.py +0 -0
  33. {langroid-0.23.3 → langroid-0.24.1}/langroid/agent/special/lance_doc_chat_agent.py +0 -0
  34. {langroid-0.23.3 → langroid-0.24.1}/langroid/agent/special/lance_rag/__init__.py +0 -0
  35. {langroid-0.23.3 → langroid-0.24.1}/langroid/agent/special/lance_rag/critic_agent.py +0 -0
  36. {langroid-0.23.3 → langroid-0.24.1}/langroid/agent/special/lance_rag/lance_rag_task.py +0 -0
  37. {langroid-0.23.3 → langroid-0.24.1}/langroid/agent/special/lance_rag/query_planner_agent.py +0 -0
  38. {langroid-0.23.3 → langroid-0.24.1}/langroid/agent/special/lance_tools.py +0 -0
  39. {langroid-0.23.3 → langroid-0.24.1}/langroid/agent/special/neo4j/__init__.py +0 -0
  40. {langroid-0.23.3 → langroid-0.24.1}/langroid/agent/special/neo4j/csv_kg_chat.py +0 -0
  41. {langroid-0.23.3 → langroid-0.24.1}/langroid/agent/special/neo4j/neo4j_chat_agent.py +0 -0
  42. {langroid-0.23.3 → langroid-0.24.1}/langroid/agent/special/neo4j/system_messages.py +0 -0
  43. {langroid-0.23.3 → langroid-0.24.1}/langroid/agent/special/neo4j/tools.py +0 -0
  44. {langroid-0.23.3 → langroid-0.24.1}/langroid/agent/special/relevance_extractor_agent.py +0 -0
  45. {langroid-0.23.3 → langroid-0.24.1}/langroid/agent/special/retriever_agent.py +0 -0
  46. {langroid-0.23.3 → langroid-0.24.1}/langroid/agent/special/sql/__init__.py +0 -0
  47. {langroid-0.23.3 → langroid-0.24.1}/langroid/agent/special/sql/utils/__init__.py +0 -0
  48. {langroid-0.23.3 → langroid-0.24.1}/langroid/agent/special/sql/utils/description_extractors.py +0 -0
  49. {langroid-0.23.3 → langroid-0.24.1}/langroid/agent/special/sql/utils/populate_metadata.py +0 -0
  50. {langroid-0.23.3 → langroid-0.24.1}/langroid/agent/special/sql/utils/system_message.py +0 -0
  51. {langroid-0.23.3 → langroid-0.24.1}/langroid/agent/special/sql/utils/tools.py +0 -0
  52. {langroid-0.23.3 → langroid-0.24.1}/langroid/agent/special/table_chat_agent.py +0 -0
  53. {langroid-0.23.3 → langroid-0.24.1}/langroid/agent/structured_message.py +0 -0
  54. {langroid-0.23.3 → langroid-0.24.1}/langroid/agent/tools/__init__.py +0 -0
  55. {langroid-0.23.3 → langroid-0.24.1}/langroid/agent/tools/duckduckgo_search_tool.py +0 -0
  56. {langroid-0.23.3 → langroid-0.24.1}/langroid/agent/tools/file_tools.py +0 -0
  57. {langroid-0.23.3 → langroid-0.24.1}/langroid/agent/tools/google_search_tool.py +0 -0
  58. {langroid-0.23.3 → langroid-0.24.1}/langroid/agent/tools/metaphor_search_tool.py +0 -0
  59. {langroid-0.23.3 → langroid-0.24.1}/langroid/agent/tools/recipient_tool.py +0 -0
  60. {langroid-0.23.3 → langroid-0.24.1}/langroid/agent/tools/retrieval_tool.py +0 -0
  61. {langroid-0.23.3 → langroid-0.24.1}/langroid/agent/tools/rewind_tool.py +0 -0
  62. {langroid-0.23.3 → langroid-0.24.1}/langroid/agent/tools/segment_extract_tool.py +0 -0
  63. {langroid-0.23.3 → langroid-0.24.1}/langroid/agent/typed_task.py +0 -0
  64. {langroid-0.23.3 → langroid-0.24.1}/langroid/agent_config.py +0 -0
  65. {langroid-0.23.3 → langroid-0.24.1}/langroid/cachedb/__init__.py +0 -0
  66. {langroid-0.23.3 → langroid-0.24.1}/langroid/cachedb/base.py +0 -0
  67. {langroid-0.23.3 → langroid-0.24.1}/langroid/cachedb/momento_cachedb.py +0 -0
  68. {langroid-0.23.3 → langroid-0.24.1}/langroid/cachedb/redis_cachedb.py +0 -0
  69. {langroid-0.23.3 → langroid-0.24.1}/langroid/embedding_models/__init__.py +0 -0
  70. {langroid-0.23.3 → langroid-0.24.1}/langroid/embedding_models/base.py +0 -0
  71. {langroid-0.23.3 → langroid-0.24.1}/langroid/embedding_models/clustering.py +0 -0
  72. {langroid-0.23.3 → langroid-0.24.1}/langroid/embedding_models/models.py +0 -0
  73. {langroid-0.23.3 → langroid-0.24.1}/langroid/embedding_models/protoc/__init__.py +0 -0
  74. {langroid-0.23.3 → langroid-0.24.1}/langroid/embedding_models/protoc/embeddings.proto +0 -0
  75. {langroid-0.23.3 → langroid-0.24.1}/langroid/embedding_models/protoc/embeddings_pb2.py +0 -0
  76. {langroid-0.23.3 → langroid-0.24.1}/langroid/embedding_models/protoc/embeddings_pb2.pyi +0 -0
  77. {langroid-0.23.3 → langroid-0.24.1}/langroid/embedding_models/protoc/embeddings_pb2_grpc.py +0 -0
  78. {langroid-0.23.3 → langroid-0.24.1}/langroid/embedding_models/remote_embeds.py +0 -0
  79. {langroid-0.23.3 → langroid-0.24.1}/langroid/exceptions.py +0 -0
  80. {langroid-0.23.3 → langroid-0.24.1}/langroid/language_models/.chainlit/config.toml +0 -0
  81. {langroid-0.23.3 → langroid-0.24.1}/langroid/language_models/.chainlit/translations/en-US.json +0 -0
  82. {langroid-0.23.3 → langroid-0.24.1}/langroid/language_models/__init__.py +0 -0
  83. {langroid-0.23.3 → langroid-0.24.1}/langroid/language_models/config.py +0 -0
  84. {langroid-0.23.3 → langroid-0.24.1}/langroid/language_models/prompt_formatter/__init__.py +0 -0
  85. {langroid-0.23.3 → langroid-0.24.1}/langroid/language_models/prompt_formatter/base.py +0 -0
  86. {langroid-0.23.3 → langroid-0.24.1}/langroid/language_models/prompt_formatter/hf_formatter.py +0 -0
  87. {langroid-0.23.3 → langroid-0.24.1}/langroid/language_models/prompt_formatter/llama2_formatter.py +0 -0
  88. {langroid-0.23.3 → langroid-0.24.1}/langroid/language_models/utils.py +0 -0
  89. {langroid-0.23.3 → langroid-0.24.1}/langroid/mytypes.py +0 -0
  90. {langroid-0.23.3 → langroid-0.24.1}/langroid/parsing/__init__.py +0 -0
  91. {langroid-0.23.3 → langroid-0.24.1}/langroid/parsing/agent_chats.py +0 -0
  92. {langroid-0.23.3 → langroid-0.24.1}/langroid/parsing/code-parsing.md +0 -0
  93. {langroid-0.23.3 → langroid-0.24.1}/langroid/parsing/code_parser.py +0 -0
  94. {langroid-0.23.3 → langroid-0.24.1}/langroid/parsing/config.py +0 -0
  95. {langroid-0.23.3 → langroid-0.24.1}/langroid/parsing/document_parser.py +0 -0
  96. {langroid-0.23.3 → langroid-0.24.1}/langroid/parsing/image_text.py +0 -0
  97. {langroid-0.23.3 → langroid-0.24.1}/langroid/parsing/para_sentence_split.py +0 -0
  98. {langroid-0.23.3 → langroid-0.24.1}/langroid/parsing/parse_json.py +0 -0
  99. {langroid-0.23.3 → langroid-0.24.1}/langroid/parsing/parser.py +0 -0
  100. {langroid-0.23.3 → langroid-0.24.1}/langroid/parsing/repo_loader.py +0 -0
  101. {langroid-0.23.3 → langroid-0.24.1}/langroid/parsing/routing.py +0 -0
  102. {langroid-0.23.3 → langroid-0.24.1}/langroid/parsing/search.py +0 -0
  103. {langroid-0.23.3 → langroid-0.24.1}/langroid/parsing/spider.py +0 -0
  104. {langroid-0.23.3 → langroid-0.24.1}/langroid/parsing/table_loader.py +0 -0
  105. {langroid-0.23.3 → langroid-0.24.1}/langroid/parsing/url_loader.py +0 -0
  106. {langroid-0.23.3 → langroid-0.24.1}/langroid/parsing/url_loader_cookies.py +0 -0
  107. {langroid-0.23.3 → langroid-0.24.1}/langroid/parsing/urls.py +0 -0
  108. {langroid-0.23.3 → langroid-0.24.1}/langroid/parsing/utils.py +0 -0
  109. {langroid-0.23.3 → langroid-0.24.1}/langroid/parsing/web_search.py +0 -0
  110. {langroid-0.23.3 → langroid-0.24.1}/langroid/prompts/__init__.py +0 -0
  111. {langroid-0.23.3 → langroid-0.24.1}/langroid/prompts/chat-gpt4-system-prompt.md +0 -0
  112. {langroid-0.23.3 → langroid-0.24.1}/langroid/prompts/dialog.py +0 -0
  113. {langroid-0.23.3 → langroid-0.24.1}/langroid/prompts/prompts_config.py +0 -0
  114. {langroid-0.23.3 → langroid-0.24.1}/langroid/prompts/templates.py +0 -0
  115. {langroid-0.23.3 → langroid-0.24.1}/langroid/py.typed +0 -0
  116. {langroid-0.23.3 → langroid-0.24.1}/langroid/pydantic_v1/__init__.py +0 -0
  117. {langroid-0.23.3 → langroid-0.24.1}/langroid/pydantic_v1/main.py +0 -0
  118. {langroid-0.23.3 → langroid-0.24.1}/langroid/utils/.chainlit/config.toml +0 -0
  119. {langroid-0.23.3 → langroid-0.24.1}/langroid/utils/.chainlit/translations/en-US.json +0 -0
  120. {langroid-0.23.3 → langroid-0.24.1}/langroid/utils/__init__.py +0 -0
  121. {langroid-0.23.3 → langroid-0.24.1}/langroid/utils/algorithms/__init__.py +0 -0
  122. {langroid-0.23.3 → langroid-0.24.1}/langroid/utils/algorithms/graph.py +0 -0
  123. {langroid-0.23.3 → langroid-0.24.1}/langroid/utils/configuration.py +0 -0
  124. {langroid-0.23.3 → langroid-0.24.1}/langroid/utils/constants.py +0 -0
  125. {langroid-0.23.3 → langroid-0.24.1}/langroid/utils/docker.py +0 -0
  126. {langroid-0.23.3 → langroid-0.24.1}/langroid/utils/git_utils.py +0 -0
  127. {langroid-0.23.3 → langroid-0.24.1}/langroid/utils/globals.py +0 -0
  128. {langroid-0.23.3 → langroid-0.24.1}/langroid/utils/llms/__init__.py +0 -0
  129. {langroid-0.23.3 → langroid-0.24.1}/langroid/utils/llms/strings.py +0 -0
  130. {langroid-0.23.3 → langroid-0.24.1}/langroid/utils/logging.py +0 -0
  131. {langroid-0.23.3 → langroid-0.24.1}/langroid/utils/object_registry.py +0 -0
  132. {langroid-0.23.3 → langroid-0.24.1}/langroid/utils/output/__init__.py +0 -0
  133. {langroid-0.23.3 → langroid-0.24.1}/langroid/utils/output/citations.py +0 -0
  134. {langroid-0.23.3 → langroid-0.24.1}/langroid/utils/output/printing.py +0 -0
  135. {langroid-0.23.3 → langroid-0.24.1}/langroid/utils/output/status.py +0 -0
  136. {langroid-0.23.3 → langroid-0.24.1}/langroid/utils/pandas_utils.py +0 -0
  137. {langroid-0.23.3 → langroid-0.24.1}/langroid/utils/system.py +0 -0
  138. {langroid-0.23.3 → langroid-0.24.1}/langroid/utils/types.py +0 -0
  139. {langroid-0.23.3 → langroid-0.24.1}/langroid/utils/web/__init__.py +0 -0
  140. {langroid-0.23.3 → langroid-0.24.1}/langroid/utils/web/login.py +0 -0
  141. {langroid-0.23.3 → langroid-0.24.1}/langroid/vector_store/__init__.py +0 -0
  142. {langroid-0.23.3 → langroid-0.24.1}/langroid/vector_store/base.py +0 -0
  143. {langroid-0.23.3 → langroid-0.24.1}/langroid/vector_store/chromadb.py +0 -0
  144. {langroid-0.23.3 → langroid-0.24.1}/langroid/vector_store/lancedb.py +0 -0
  145. {langroid-0.23.3 → langroid-0.24.1}/langroid/vector_store/meilisearch.py +0 -0
  146. {langroid-0.23.3 → langroid-0.24.1}/langroid/vector_store/momento.py +0 -0
  147. {langroid-0.23.3 → langroid-0.24.1}/langroid/vector_store/qdrant_cloud.py +0 -0
  148. {langroid-0.23.3 → langroid-0.24.1}/langroid/vector_store/qdrantdb.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: langroid
3
- Version: 0.23.3
3
+ Version: 0.24.1
4
4
  Summary: Harness LLMs with Multi-Agent Programming
5
5
  License: MIT
6
6
  Author: Prasad Chalasani
@@ -249,6 +249,8 @@ teacher_task.run()
249
249
  <summary> <b>Click to expand</b></summary>
250
250
 
251
251
  - **Nov 2024:**
252
+ - **[0.24.0](https://langroid.github.io/langroid/notes/structured-output/)**:
253
+ Enables support for `Agent`s with strict JSON schema output format on compatible LLMs and strict mode for the OpenAI tools API.
252
254
  - **[0.23.0](https://langroid.github.io/langroid/tutorials/local-llm-setup/#local-llms-hosted-on-glhfchat)**:
253
255
  support for LLMs (e.g. `Qwen2.5-Coder-32b-Instruct`) hosted on glhf.chat
254
256
  - **[0.22.0](https://langroid.github.io/langroid/notes/large-tool-results/)**:
@@ -136,6 +136,8 @@ teacher_task.run()
136
136
  <summary> <b>Click to expand</b></summary>
137
137
 
138
138
  - **Nov 2024:**
139
+ - **[0.24.0](https://langroid.github.io/langroid/notes/structured-output/)**:
140
+ Enables support for `Agent`s with strict JSON schema output format on compatible LLMs and strict mode for the OpenAI tools API.
139
141
  - **[0.23.0](https://langroid.github.io/langroid/tutorials/local-llm-setup/#local-llms-hosted-on-glhfchat)**:
140
142
  support for LLMs (e.g. `Qwen2.5-Coder-32b-Instruct`) hosted on glhf.chat
141
143
  - **[0.22.0](https://langroid.github.io/langroid/notes/large-tool-results/)**:
@@ -142,12 +142,19 @@ class Agent(ABC):
142
142
  self.llm_tools_handled: Set[str] = set()
143
143
  self.llm_tools_usable: Set[str] = set()
144
144
  self.llm_tools_known: Set[str] = set() # all known tools, handled/used or not
145
+ # Indicates which tool-names are allowed to be inferred when
146
+ # the LLM "forgets" to include the request field in its
147
+ # tool-call.
148
+ self.enabled_requests_for_inference: Optional[Set[str]] = (
149
+ None # If None, we allow all
150
+ )
145
151
  self.interactive: bool = True # may be modified by Task wrapper
146
152
  self.token_stats_str = ""
147
153
  self.default_human_response: Optional[str] = None
148
154
  self._indent = ""
149
155
  self.llm = LanguageModel.create(config.llm)
150
156
  self.vecdb = VectorStore.create(config.vecdb) if config.vecdb else None
157
+ self.tool_error = False
151
158
  if config.parsing is not None and self.config.llm is not None:
152
159
  # token_encoding_model is used to obtain the tokenizer,
153
160
  # so in case it's an OpenAI model, we ensure that the tokenizer
@@ -1040,6 +1047,7 @@ class Agent(ABC):
1040
1047
  Returns:
1041
1048
  List[ToolMessage]: list of ToolMessage objects
1042
1049
  """
1050
+ self.tool_error = False
1043
1051
  substrings = XMLToolMessage.find_candidates(input_str)
1044
1052
  is_json = False
1045
1053
  if len(substrings) == 0:
@@ -1049,7 +1057,11 @@ class Agent(ABC):
1049
1057
  return []
1050
1058
 
1051
1059
  results = [self._get_one_tool_message(j, is_json) for j in substrings]
1052
- return [r for r in results if r is not None]
1060
+ valid_results = [r for r in results if r is not None]
1061
+ # If any tool is correctly formed we do not set the flag
1062
+ if len(valid_results) > 0:
1063
+ self.tool_error = False
1064
+ return valid_results
1053
1065
 
1054
1066
  def get_function_call_class(self, msg: ChatDocument) -> Optional[ToolMessage]:
1055
1067
  """
@@ -1071,7 +1083,10 @@ class Agent(ABC):
1071
1083
  or you need to enable this agent to handle this fn-call.
1072
1084
  """
1073
1085
  )
1086
+ if tool_name not in self.all_llm_tools_known:
1087
+ self.tool_error = True
1074
1088
  return None
1089
+ self.tool_error = False
1075
1090
  tool_class = self.llm_tools_map[tool_name]
1076
1091
  tool_msg.update(dict(request=tool_name))
1077
1092
  tool = tool_class.parse_obj(tool_msg)
@@ -1086,6 +1101,7 @@ class Agent(ABC):
1086
1101
  if msg.oai_tool_calls is None:
1087
1102
  return []
1088
1103
  tools = []
1104
+ all_errors = True
1089
1105
  for tc in msg.oai_tool_calls:
1090
1106
  if tc.function is None:
1091
1107
  continue
@@ -1103,11 +1119,14 @@ class Agent(ABC):
1103
1119
  """
1104
1120
  )
1105
1121
  continue
1122
+ all_errors = False
1106
1123
  tool_class = self.llm_tools_map[tool_name]
1107
1124
  tool_msg.update(dict(request=tool_name))
1108
1125
  tool = tool_class.parse_obj(tool_msg)
1109
1126
  tool.id = tc.id or ""
1110
1127
  tools.append(tool)
1128
+ # When no tool is valid, set the recovery flag
1129
+ self.tool_error = all_errors
1111
1130
  return tools
1112
1131
 
1113
1132
  def tool_validation_error(self, ve: ValidationError) -> str:
@@ -1259,6 +1278,11 @@ class Agent(ABC):
1259
1278
  final = "\n\n".join(str_results)
1260
1279
  return final
1261
1280
 
1281
+ @property
1282
+ def all_llm_tools_known(self) -> set[str]:
1283
+ """All known tools; this may extend self.llm_tools_known."""
1284
+ return self.llm_tools_known
1285
+
1262
1286
  def handle_message_fallback(self, msg: str | ChatDocument) -> Any:
1263
1287
  """
1264
1288
  Fallback method for the "no-tools" scenario.
@@ -1278,7 +1302,7 @@ class Agent(ABC):
1278
1302
  ) -> Optional[ToolMessage]:
1279
1303
  """
1280
1304
  Parse the tool_candidate_str into ANY ToolMessage KNOWN to agent --
1281
- This includes non-used/handled tools, i.e. any tool in self.llm_tools_known.
1305
+ This includes non-used/handled tools, i.e. any tool in self.all_llm_tools_known.
1282
1306
  The exception to this is below where we try our best to infer the tool
1283
1307
  when the LLM has "forgotten" to include the "request" field in the tool str ---
1284
1308
  in this case we ONLY look at the possible set of HANDLED tools, i.e.
@@ -1311,6 +1335,7 @@ class Agent(ABC):
1311
1335
  # }
1312
1336
 
1313
1337
  if not isinstance(maybe_tool_dict, dict):
1338
+ self.tool_error = True
1314
1339
  return None
1315
1340
 
1316
1341
  properties = maybe_tool_dict.get("properties")
@@ -1318,7 +1343,14 @@ class Agent(ABC):
1318
1343
  maybe_tool_dict = properties
1319
1344
  request = maybe_tool_dict.get("request")
1320
1345
  if request is None:
1321
- possible = [self.llm_tools_map[r] for r in self.llm_tools_handled]
1346
+ if self.enabled_requests_for_inference is None:
1347
+ possible = [self.llm_tools_map[r] for r in self.llm_tools_handled]
1348
+ else:
1349
+ allowable = self.enabled_requests_for_inference.intersection(
1350
+ self.llm_tools_handled
1351
+ )
1352
+ possible = [self.llm_tools_map[r] for r in allowable]
1353
+
1322
1354
  default_keys = set(ToolMessage.__fields__.keys())
1323
1355
  request_keys = set(maybe_tool_dict.keys())
1324
1356
 
@@ -1351,19 +1383,23 @@ class Agent(ABC):
1351
1383
  if len(candidate_tools) == 1:
1352
1384
  return candidate_tools[0]
1353
1385
  else:
1386
+ self.tool_error = True
1354
1387
  return None
1355
1388
 
1356
- if not isinstance(request, str) or request not in self.llm_tools_known:
1389
+ if not isinstance(request, str) or request not in self.all_llm_tools_known:
1390
+ self.tool_error = True
1357
1391
  return None
1358
1392
 
1359
1393
  message_class = self.llm_tools_map.get(request)
1360
1394
  if message_class is None:
1361
1395
  logger.warning(f"No message class found for request '{request}'")
1396
+ self.tool_error = True
1362
1397
  return None
1363
1398
 
1364
1399
  try:
1365
1400
  message = message_class.parse_obj(maybe_tool_dict)
1366
1401
  except ValidationError as ve:
1402
+ self.tool_error = True
1367
1403
  raise ve
1368
1404
  return message
1369
1405
 
@@ -1474,7 +1510,6 @@ class Agent(ABC):
1474
1510
  value = tool.get_value_of_type(output_type)
1475
1511
  if value is not None:
1476
1512
  return cast(T, value)
1477
-
1478
1513
  return None
1479
1514
 
1480
1515
  def _maybe_truncate_result(