langroid 0.59.0b3__tar.gz → 0.59.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 (185) hide show
  1. {langroid-0.59.0b3 → langroid-0.59.1}/PKG-INFO +4 -1
  2. {langroid-0.59.0b3 → langroid-0.59.1}/README.md +3 -0
  3. {langroid-0.59.0b3 → langroid-0.59.1}/langroid/agent/done_sequence_parser.py +46 -11
  4. {langroid-0.59.0b3 → langroid-0.59.1}/langroid/agent/task.py +44 -7
  5. {langroid-0.59.0b3 → langroid-0.59.1}/langroid/language_models/model_info.py +51 -0
  6. langroid-0.59.1/langroid/mcp/__init__.py +1 -0
  7. langroid-0.59.1/langroid/mcp/server/__init__.py +1 -0
  8. langroid-0.59.1/langroid/py.typed +0 -0
  9. {langroid-0.59.0b3 → langroid-0.59.1}/langroid/pydantic_v1/__init__.py +1 -1
  10. {langroid-0.59.0b3 → langroid-0.59.1}/pyproject.toml +1 -1
  11. langroid-0.59.0b3/langroid/agent/base.py-e +0 -2216
  12. langroid-0.59.0b3/langroid/agent/chat_agent.py-e +0 -2086
  13. langroid-0.59.0b3/langroid/agent/chat_document.py-e +0 -513
  14. langroid-0.59.0b3/langroid/agent/openai_assistant.py-e +0 -882
  15. langroid-0.59.0b3/langroid/agent/special/arangodb/arangodb_agent.py-e +0 -648
  16. langroid-0.59.0b3/langroid/agent/special/lance_tools.py-e +0 -61
  17. langroid-0.59.0b3/langroid/agent/special/neo4j/neo4j_chat_agent.py-e +0 -430
  18. langroid-0.59.0b3/langroid/agent/task.py-e +0 -2418
  19. langroid-0.59.0b3/langroid/agent/tool_message.py-e +0 -400
  20. langroid-0.59.0b3/langroid/agent/tools/file_tools.py-e +0 -234
  21. langroid-0.59.0b3/langroid/agent/tools/mcp/fastmcp_client.py-e +0 -584
  22. langroid-0.59.0b3/langroid/agent/tools/orchestration.py-e +0 -301
  23. langroid-0.59.0b3/langroid/agent/tools/task_tool.py-e +0 -249
  24. langroid-0.59.0b3/langroid/agent/xml_tool_message.py-e +0 -392
  25. langroid-0.59.0b3/langroid/embedding_models/models.py-e +0 -563
  26. langroid-0.59.0b3/langroid/language_models/azure_openai.py-e +0 -134
  27. langroid-0.59.0b3/langroid/language_models/base.py-e +0 -812
  28. langroid-0.59.0b3/langroid/language_models/config.py-e +0 -18
  29. langroid-0.59.0b3/langroid/language_models/model_info.py-e +0 -483
  30. langroid-0.59.0b3/langroid/language_models/openai_gpt.py-e +0 -2280
  31. langroid-0.59.0b3/langroid/language_models/provider_params.py-e +0 -153
  32. langroid-0.59.0b3/langroid/mytypes.py-e +0 -132
  33. langroid-0.59.0b3/langroid/parsing/file_attachment.py-e +0 -246
  34. langroid-0.59.0b3/langroid/parsing/md_parser.py-e +0 -574
  35. langroid-0.59.0b3/langroid/parsing/parser.py-e +0 -410
  36. langroid-0.59.0b3/langroid/parsing/repo_loader.py-e +0 -812
  37. langroid-0.59.0b3/langroid/parsing/url_loader.py-e +0 -683
  38. langroid-0.59.0b3/langroid/parsing/urls.py-e +0 -279
  39. langroid-0.59.0b3/langroid/pydantic_v1/__init__.py-e +0 -36
  40. langroid-0.59.0b3/langroid/pydantic_v1/main.py-e +0 -11
  41. langroid-0.59.0b3/langroid/utils/configuration.py-e +0 -141
  42. langroid-0.59.0b3/langroid/utils/constants.py-e +0 -32
  43. langroid-0.59.0b3/langroid/utils/globals.py-e +0 -49
  44. langroid-0.59.0b3/langroid/utils/html_logger.py-e +0 -825
  45. langroid-0.59.0b3/langroid/utils/object_registry.py-e +0 -66
  46. langroid-0.59.0b3/langroid/utils/pydantic_utils.py-e +0 -602
  47. langroid-0.59.0b3/langroid/utils/types.py-e +0 -113
  48. langroid-0.59.0b3/langroid/vector_store/lancedb.py-e +0 -404
  49. langroid-0.59.0b3/langroid/vector_store/pineconedb.py-e +0 -427
  50. {langroid-0.59.0b3 → langroid-0.59.1}/.gitignore +0 -0
  51. {langroid-0.59.0b3 → langroid-0.59.1}/LICENSE +0 -0
  52. {langroid-0.59.0b3 → langroid-0.59.1}/langroid/__init__.py +0 -0
  53. {langroid-0.59.0b3 → langroid-0.59.1}/langroid/agent/__init__.py +0 -0
  54. {langroid-0.59.0b3 → langroid-0.59.1}/langroid/agent/base.py +0 -0
  55. {langroid-0.59.0b3 → langroid-0.59.1}/langroid/agent/batch.py +0 -0
  56. {langroid-0.59.0b3 → langroid-0.59.1}/langroid/agent/callbacks/__init__.py +0 -0
  57. {langroid-0.59.0b3 → langroid-0.59.1}/langroid/agent/callbacks/chainlit.py +0 -0
  58. {langroid-0.59.0b3 → langroid-0.59.1}/langroid/agent/chat_agent.py +0 -0
  59. {langroid-0.59.0b3 → langroid-0.59.1}/langroid/agent/chat_document.py +0 -0
  60. {langroid-0.59.0b3 → langroid-0.59.1}/langroid/agent/openai_assistant.py +0 -0
  61. {langroid-0.59.0b3 → langroid-0.59.1}/langroid/agent/special/__init__.py +0 -0
  62. {langroid-0.59.0b3 → langroid-0.59.1}/langroid/agent/special/arangodb/__init__.py +0 -0
  63. {langroid-0.59.0b3 → langroid-0.59.1}/langroid/agent/special/arangodb/arangodb_agent.py +0 -0
  64. {langroid-0.59.0b3 → langroid-0.59.1}/langroid/agent/special/arangodb/system_messages.py +0 -0
  65. {langroid-0.59.0b3 → langroid-0.59.1}/langroid/agent/special/arangodb/tools.py +0 -0
  66. {langroid-0.59.0b3 → langroid-0.59.1}/langroid/agent/special/arangodb/utils.py +0 -0
  67. {langroid-0.59.0b3 → langroid-0.59.1}/langroid/agent/special/doc_chat_agent.py +0 -0
  68. /langroid-0.59.0b3/langroid/agent/special/neo4j/__init__.py → /langroid-0.59.1/langroid/agent/special/doc_chat_task.py +0 -0
  69. {langroid-0.59.0b3 → langroid-0.59.1}/langroid/agent/special/lance_doc_chat_agent.py +0 -0
  70. {langroid-0.59.0b3 → langroid-0.59.1}/langroid/agent/special/lance_rag/__init__.py +0 -0
  71. {langroid-0.59.0b3 → langroid-0.59.1}/langroid/agent/special/lance_rag/critic_agent.py +0 -0
  72. {langroid-0.59.0b3 → langroid-0.59.1}/langroid/agent/special/lance_rag/lance_rag_task.py +0 -0
  73. {langroid-0.59.0b3 → langroid-0.59.1}/langroid/agent/special/lance_rag/query_planner_agent.py +0 -0
  74. {langroid-0.59.0b3 → langroid-0.59.1}/langroid/agent/special/lance_tools.py +0 -0
  75. {langroid-0.59.0b3/langroid/embedding_models/protoc → langroid-0.59.1/langroid/agent/special/neo4j}/__init__.py +0 -0
  76. {langroid-0.59.0b3 → langroid-0.59.1}/langroid/agent/special/neo4j/csv_kg_chat.py +0 -0
  77. {langroid-0.59.0b3 → langroid-0.59.1}/langroid/agent/special/neo4j/neo4j_chat_agent.py +0 -0
  78. {langroid-0.59.0b3 → langroid-0.59.1}/langroid/agent/special/neo4j/system_messages.py +0 -0
  79. {langroid-0.59.0b3 → langroid-0.59.1}/langroid/agent/special/neo4j/tools.py +0 -0
  80. {langroid-0.59.0b3 → langroid-0.59.1}/langroid/agent/special/relevance_extractor_agent.py +0 -0
  81. {langroid-0.59.0b3 → langroid-0.59.1}/langroid/agent/special/retriever_agent.py +0 -0
  82. {langroid-0.59.0b3 → langroid-0.59.1}/langroid/agent/special/sql/__init__.py +0 -0
  83. {langroid-0.59.0b3 → langroid-0.59.1}/langroid/agent/special/sql/sql_chat_agent.py +0 -0
  84. {langroid-0.59.0b3 → langroid-0.59.1}/langroid/agent/special/sql/utils/__init__.py +0 -0
  85. {langroid-0.59.0b3 → langroid-0.59.1}/langroid/agent/special/sql/utils/description_extractors.py +0 -0
  86. {langroid-0.59.0b3 → langroid-0.59.1}/langroid/agent/special/sql/utils/populate_metadata.py +0 -0
  87. {langroid-0.59.0b3 → langroid-0.59.1}/langroid/agent/special/sql/utils/system_message.py +0 -0
  88. {langroid-0.59.0b3 → langroid-0.59.1}/langroid/agent/special/sql/utils/tools.py +0 -0
  89. {langroid-0.59.0b3 → langroid-0.59.1}/langroid/agent/special/table_chat_agent.py +0 -0
  90. {langroid-0.59.0b3 → langroid-0.59.1}/langroid/agent/tool_message.py +0 -0
  91. {langroid-0.59.0b3 → langroid-0.59.1}/langroid/agent/tools/__init__.py +0 -0
  92. {langroid-0.59.0b3 → langroid-0.59.1}/langroid/agent/tools/duckduckgo_search_tool.py +0 -0
  93. {langroid-0.59.0b3 → langroid-0.59.1}/langroid/agent/tools/exa_search_tool.py +0 -0
  94. {langroid-0.59.0b3 → langroid-0.59.1}/langroid/agent/tools/file_tools.py +0 -0
  95. {langroid-0.59.0b3 → langroid-0.59.1}/langroid/agent/tools/google_search_tool.py +0 -0
  96. {langroid-0.59.0b3 → langroid-0.59.1}/langroid/agent/tools/mcp/__init__.py +0 -0
  97. {langroid-0.59.0b3 → langroid-0.59.1}/langroid/agent/tools/mcp/decorators.py +0 -0
  98. {langroid-0.59.0b3 → langroid-0.59.1}/langroid/agent/tools/mcp/fastmcp_client.py +0 -0
  99. {langroid-0.59.0b3 → langroid-0.59.1}/langroid/agent/tools/metaphor_search_tool.py +0 -0
  100. {langroid-0.59.0b3 → langroid-0.59.1}/langroid/agent/tools/orchestration.py +0 -0
  101. {langroid-0.59.0b3 → langroid-0.59.1}/langroid/agent/tools/recipient_tool.py +0 -0
  102. {langroid-0.59.0b3 → langroid-0.59.1}/langroid/agent/tools/retrieval_tool.py +0 -0
  103. {langroid-0.59.0b3 → langroid-0.59.1}/langroid/agent/tools/rewind_tool.py +0 -0
  104. {langroid-0.59.0b3 → langroid-0.59.1}/langroid/agent/tools/segment_extract_tool.py +0 -0
  105. {langroid-0.59.0b3 → langroid-0.59.1}/langroid/agent/tools/task_tool.py +0 -0
  106. {langroid-0.59.0b3 → langroid-0.59.1}/langroid/agent/tools/tavily_search_tool.py +0 -0
  107. {langroid-0.59.0b3 → langroid-0.59.1}/langroid/agent/xml_tool_message.py +0 -0
  108. {langroid-0.59.0b3 → langroid-0.59.1}/langroid/cachedb/__init__.py +0 -0
  109. {langroid-0.59.0b3 → langroid-0.59.1}/langroid/cachedb/base.py +0 -0
  110. {langroid-0.59.0b3 → langroid-0.59.1}/langroid/cachedb/redis_cachedb.py +0 -0
  111. {langroid-0.59.0b3 → langroid-0.59.1}/langroid/embedding_models/__init__.py +0 -0
  112. {langroid-0.59.0b3 → langroid-0.59.1}/langroid/embedding_models/base.py +0 -0
  113. {langroid-0.59.0b3 → langroid-0.59.1}/langroid/embedding_models/models.py +0 -0
  114. /langroid-0.59.0b3/langroid/py.typed → /langroid-0.59.1/langroid/embedding_models/protoc/__init__.py +0 -0
  115. {langroid-0.59.0b3 → langroid-0.59.1}/langroid/embedding_models/protoc/embeddings.proto +0 -0
  116. {langroid-0.59.0b3 → langroid-0.59.1}/langroid/embedding_models/protoc/embeddings_pb2.py +0 -0
  117. {langroid-0.59.0b3 → langroid-0.59.1}/langroid/embedding_models/protoc/embeddings_pb2.pyi +0 -0
  118. {langroid-0.59.0b3 → langroid-0.59.1}/langroid/embedding_models/protoc/embeddings_pb2_grpc.py +0 -0
  119. {langroid-0.59.0b3 → langroid-0.59.1}/langroid/embedding_models/remote_embeds.py +0 -0
  120. {langroid-0.59.0b3 → langroid-0.59.1}/langroid/exceptions.py +0 -0
  121. {langroid-0.59.0b3 → langroid-0.59.1}/langroid/language_models/__init__.py +0 -0
  122. {langroid-0.59.0b3 → langroid-0.59.1}/langroid/language_models/azure_openai.py +0 -0
  123. {langroid-0.59.0b3 → langroid-0.59.1}/langroid/language_models/base.py +0 -0
  124. {langroid-0.59.0b3 → langroid-0.59.1}/langroid/language_models/client_cache.py +0 -0
  125. {langroid-0.59.0b3 → langroid-0.59.1}/langroid/language_models/config.py +0 -0
  126. {langroid-0.59.0b3 → langroid-0.59.1}/langroid/language_models/mock_lm.py +0 -0
  127. {langroid-0.59.0b3 → langroid-0.59.1}/langroid/language_models/openai_gpt.py +0 -0
  128. {langroid-0.59.0b3 → langroid-0.59.1}/langroid/language_models/prompt_formatter/__init__.py +0 -0
  129. {langroid-0.59.0b3 → langroid-0.59.1}/langroid/language_models/prompt_formatter/base.py +0 -0
  130. {langroid-0.59.0b3 → langroid-0.59.1}/langroid/language_models/prompt_formatter/hf_formatter.py +0 -0
  131. {langroid-0.59.0b3 → langroid-0.59.1}/langroid/language_models/prompt_formatter/llama2_formatter.py +0 -0
  132. {langroid-0.59.0b3 → langroid-0.59.1}/langroid/language_models/provider_params.py +0 -0
  133. {langroid-0.59.0b3 → langroid-0.59.1}/langroid/language_models/utils.py +0 -0
  134. {langroid-0.59.0b3 → langroid-0.59.1}/langroid/mytypes.py +0 -0
  135. {langroid-0.59.0b3 → langroid-0.59.1}/langroid/parsing/__init__.py +0 -0
  136. {langroid-0.59.0b3 → langroid-0.59.1}/langroid/parsing/agent_chats.py +0 -0
  137. {langroid-0.59.0b3 → langroid-0.59.1}/langroid/parsing/code_parser.py +0 -0
  138. {langroid-0.59.0b3 → langroid-0.59.1}/langroid/parsing/document_parser.py +0 -0
  139. {langroid-0.59.0b3 → langroid-0.59.1}/langroid/parsing/file_attachment.py +0 -0
  140. {langroid-0.59.0b3 → langroid-0.59.1}/langroid/parsing/md_parser.py +0 -0
  141. {langroid-0.59.0b3 → langroid-0.59.1}/langroid/parsing/para_sentence_split.py +0 -0
  142. {langroid-0.59.0b3 → langroid-0.59.1}/langroid/parsing/parse_json.py +0 -0
  143. {langroid-0.59.0b3 → langroid-0.59.1}/langroid/parsing/parser.py +0 -0
  144. {langroid-0.59.0b3 → langroid-0.59.1}/langroid/parsing/pdf_utils.py +0 -0
  145. {langroid-0.59.0b3 → langroid-0.59.1}/langroid/parsing/repo_loader.py +0 -0
  146. {langroid-0.59.0b3 → langroid-0.59.1}/langroid/parsing/routing.py +0 -0
  147. {langroid-0.59.0b3 → langroid-0.59.1}/langroid/parsing/search.py +0 -0
  148. {langroid-0.59.0b3 → langroid-0.59.1}/langroid/parsing/spider.py +0 -0
  149. {langroid-0.59.0b3 → langroid-0.59.1}/langroid/parsing/table_loader.py +0 -0
  150. {langroid-0.59.0b3 → langroid-0.59.1}/langroid/parsing/url_loader.py +0 -0
  151. {langroid-0.59.0b3 → langroid-0.59.1}/langroid/parsing/urls.py +0 -0
  152. {langroid-0.59.0b3 → langroid-0.59.1}/langroid/parsing/utils.py +0 -0
  153. {langroid-0.59.0b3 → langroid-0.59.1}/langroid/parsing/web_search.py +0 -0
  154. {langroid-0.59.0b3 → langroid-0.59.1}/langroid/prompts/__init__.py +0 -0
  155. {langroid-0.59.0b3 → langroid-0.59.1}/langroid/prompts/dialog.py +0 -0
  156. {langroid-0.59.0b3 → langroid-0.59.1}/langroid/prompts/prompts_config.py +0 -0
  157. {langroid-0.59.0b3 → langroid-0.59.1}/langroid/prompts/templates.py +0 -0
  158. {langroid-0.59.0b3 → langroid-0.59.1}/langroid/pydantic_v1/main.py +0 -0
  159. {langroid-0.59.0b3 → langroid-0.59.1}/langroid/utils/__init__.py +0 -0
  160. {langroid-0.59.0b3 → langroid-0.59.1}/langroid/utils/algorithms/__init__.py +0 -0
  161. {langroid-0.59.0b3 → langroid-0.59.1}/langroid/utils/algorithms/graph.py +0 -0
  162. {langroid-0.59.0b3 → langroid-0.59.1}/langroid/utils/configuration.py +0 -0
  163. {langroid-0.59.0b3 → langroid-0.59.1}/langroid/utils/constants.py +0 -0
  164. {langroid-0.59.0b3 → langroid-0.59.1}/langroid/utils/git_utils.py +0 -0
  165. {langroid-0.59.0b3 → langroid-0.59.1}/langroid/utils/globals.py +0 -0
  166. {langroid-0.59.0b3 → langroid-0.59.1}/langroid/utils/html_logger.py +0 -0
  167. {langroid-0.59.0b3 → langroid-0.59.1}/langroid/utils/logging.py +0 -0
  168. {langroid-0.59.0b3 → langroid-0.59.1}/langroid/utils/object_registry.py +0 -0
  169. {langroid-0.59.0b3 → langroid-0.59.1}/langroid/utils/output/__init__.py +0 -0
  170. {langroid-0.59.0b3 → langroid-0.59.1}/langroid/utils/output/citations.py +0 -0
  171. {langroid-0.59.0b3 → langroid-0.59.1}/langroid/utils/output/printing.py +0 -0
  172. {langroid-0.59.0b3 → langroid-0.59.1}/langroid/utils/output/status.py +0 -0
  173. {langroid-0.59.0b3 → langroid-0.59.1}/langroid/utils/pandas_utils.py +0 -0
  174. {langroid-0.59.0b3 → langroid-0.59.1}/langroid/utils/pydantic_utils.py +0 -0
  175. {langroid-0.59.0b3 → langroid-0.59.1}/langroid/utils/system.py +0 -0
  176. {langroid-0.59.0b3 → langroid-0.59.1}/langroid/utils/types.py +0 -0
  177. {langroid-0.59.0b3 → langroid-0.59.1}/langroid/vector_store/__init__.py +0 -0
  178. {langroid-0.59.0b3 → langroid-0.59.1}/langroid/vector_store/base.py +0 -0
  179. {langroid-0.59.0b3 → langroid-0.59.1}/langroid/vector_store/chromadb.py +0 -0
  180. {langroid-0.59.0b3 → langroid-0.59.1}/langroid/vector_store/lancedb.py +0 -0
  181. {langroid-0.59.0b3 → langroid-0.59.1}/langroid/vector_store/meilisearch.py +0 -0
  182. {langroid-0.59.0b3 → langroid-0.59.1}/langroid/vector_store/pineconedb.py +0 -0
  183. {langroid-0.59.0b3 → langroid-0.59.1}/langroid/vector_store/postgres.py +0 -0
  184. {langroid-0.59.0b3 → langroid-0.59.1}/langroid/vector_store/qdrantdb.py +0 -0
  185. {langroid-0.59.0b3 → langroid-0.59.1}/langroid/vector_store/weaviatedb.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: langroid
3
- Version: 0.59.0b3
3
+ Version: 0.59.1
4
4
  Summary: Harness LLMs with Multi-Agent Programming
5
5
  Author-email: Prasad Chalasani <pchalasani@gmail.com>
6
6
  License: MIT
@@ -347,6 +347,9 @@ teacher_task.run()
347
347
  <details>
348
348
  <summary> <b>Click to expand</b></summary>
349
349
 
350
+ - **Aug 2025:**
351
+ - [0.59.0](https://github.com/langroid/langroid/releases/tag/0.59.0) Complete Pydantic V2 Migration -
352
+ 5-50x faster validation, modern Python patterns, 100% backward compatible.
350
353
  - **Jul 2025:**
351
354
  - [0.58.0](https://github.com/langroid/langroid/releases/tag/0.58.0) Crawl4AI integration -
352
355
  browser-based web crawling with Playwright for JavaScript-heavy sites, no API key required (thank you @abab-dev!).
@@ -143,6 +143,9 @@ teacher_task.run()
143
143
  <details>
144
144
  <summary> <b>Click to expand</b></summary>
145
145
 
146
+ - **Aug 2025:**
147
+ - [0.59.0](https://github.com/langroid/langroid/releases/tag/0.59.0) Complete Pydantic V2 Migration -
148
+ 5-50x faster validation, modern Python patterns, 100% backward compatible.
146
149
  - **Jul 2025:**
147
150
  - [0.58.0](https://github.com/langroid/langroid/releases/tag/0.58.0) Crawl4AI integration -
148
151
  browser-based web crawling with Playwright for JavaScript-heavy sites, no API key required (thank you @abab-dev!).
@@ -11,16 +11,20 @@ Examples:
11
11
  """
12
12
 
13
13
  import re
14
- from typing import List, Union
14
+ from typing import Any, Dict, List, Optional, Union
15
15
 
16
16
  from .task import AgentEvent, DoneSequence, EventType
17
17
 
18
18
 
19
- def parse_done_sequence(sequence: Union[str, DoneSequence]) -> DoneSequence:
19
+ def parse_done_sequence(
20
+ sequence: Union[str, DoneSequence], tools_map: Optional[Dict[str, Any]] = None
21
+ ) -> DoneSequence:
20
22
  """Parse a string pattern or return existing DoneSequence unchanged.
21
23
 
22
24
  Args:
23
25
  sequence: Either a DoneSequence object or a string pattern to parse
26
+ tools_map: Optional dict mapping tool names to tool classes
27
+ (e.g., agent.llm_tools_map)
24
28
 
25
29
  Returns:
26
30
  DoneSequence object
@@ -34,21 +38,25 @@ def parse_done_sequence(sequence: Union[str, DoneSequence]) -> DoneSequence:
34
38
  if not isinstance(sequence, str):
35
39
  raise ValueError(f"Expected string or DoneSequence, got {type(sequence)}")
36
40
 
37
- events = _parse_string_pattern(sequence)
41
+ events = _parse_string_pattern(sequence, tools_map)
38
42
  return DoneSequence(events=events)
39
43
 
40
44
 
41
- def _parse_string_pattern(pattern: str) -> List[AgentEvent]:
45
+ def _parse_string_pattern(
46
+ pattern: str, tools_map: Optional[Dict[str, Any]] = None
47
+ ) -> List[AgentEvent]:
42
48
  """Parse a string pattern into a list of AgentEvent objects.
43
49
 
44
50
  Pattern format:
45
51
  - Single letter codes: T, A, L, U, N, C
46
- - Specific tools: T[tool_name]
52
+ - Specific tools: T[tool_name] or T[ToolClass]
47
53
  - Content match: C[regex_pattern]
48
54
  - Separated by commas, spaces allowed
49
55
 
50
56
  Args:
51
57
  pattern: String pattern to parse
58
+ tools_map: Optional dict mapping tool names to tool classes
59
+ (e.g., agent.llm_tools_map)
52
60
 
53
61
  Returns:
54
62
  List of AgentEvent objects
@@ -65,7 +73,7 @@ def _parse_string_pattern(pattern: str) -> List[AgentEvent]:
65
73
  if not part:
66
74
  continue
67
75
 
68
- event = _parse_event_token(part)
76
+ event = _parse_event_token(part, tools_map)
69
77
  events.append(event)
70
78
 
71
79
  if not events:
@@ -74,11 +82,15 @@ def _parse_string_pattern(pattern: str) -> List[AgentEvent]:
74
82
  return events
75
83
 
76
84
 
77
- def _parse_event_token(token: str) -> AgentEvent:
85
+ def _parse_event_token(
86
+ token: str, tools_map: Optional[Dict[str, Any]] = None
87
+ ) -> AgentEvent:
78
88
  """Parse a single event token into an AgentEvent.
79
89
 
80
90
  Args:
81
91
  token: Single event token (e.g., "T", "T[calc]", "C[quit|exit]")
92
+ tools_map: Optional dict mapping tool names to tool classes
93
+ (e.g., agent.llm_tools_map)
82
94
 
83
95
  Returns:
84
96
  AgentEvent object
@@ -94,8 +106,28 @@ def _parse_event_token(token: str) -> AgentEvent:
94
106
  param = bracket_match.group(2)
95
107
 
96
108
  if event_code == "T":
97
- # Specific tool: T[tool_name]
98
- return AgentEvent(event_type=EventType.SPECIFIC_TOOL, tool_name=param)
109
+ # Specific tool: T[tool_name] or T[ToolClass]
110
+ tool_class = None
111
+ tool_name = param
112
+
113
+ # First try direct lookup in tools_map by the param (tool name)
114
+ if tools_map and param in tools_map:
115
+ tool_class = tools_map[param]
116
+ tool_name = param
117
+ elif tools_map:
118
+ # If not found, loop through tools_map to find a tool class
119
+ # whose __name__ matches param
120
+ for name, cls in tools_map.items():
121
+ if hasattr(cls, "__name__") and cls.__name__ == param:
122
+ tool_class = cls
123
+ tool_name = name
124
+ break
125
+
126
+ return AgentEvent(
127
+ event_type=EventType.SPECIFIC_TOOL,
128
+ tool_name=tool_name,
129
+ tool_class=tool_class,
130
+ )
99
131
  elif event_code == "C":
100
132
  # Content match: C[regex_pattern]
101
133
  return AgentEvent(event_type=EventType.CONTENT_MATCH, content_pattern=param)
@@ -136,14 +168,17 @@ def _parse_event_token(token: str) -> AgentEvent:
136
168
 
137
169
 
138
170
  def parse_done_sequences(
139
- sequences: List[Union[str, DoneSequence]]
171
+ sequences: List[Union[str, DoneSequence]],
172
+ tools_map: Optional[Dict[str, Any]] = None,
140
173
  ) -> List[DoneSequence]:
141
174
  """Parse a list of mixed string patterns and DoneSequence objects.
142
175
 
143
176
  Args:
144
177
  sequences: List containing strings and/or DoneSequence objects
178
+ tools_map: Optional dict mapping tool names to tool classes
179
+ (e.g., agent.llm_tools_map)
145
180
 
146
181
  Returns:
147
182
  List of DoneSequence objects
148
183
  """
149
- return [parse_done_sequence(seq) for seq in sequences]
184
+ return [parse_done_sequence(seq, tools_map) for seq in sequences]
@@ -90,6 +90,9 @@ class AgentEvent(BaseModel):
90
90
 
91
91
  event_type: EventType
92
92
  tool_name: Optional[str] = None # For SPECIFIC_TOOL
93
+ tool_class: Optional[Type[Any]] = (
94
+ None # For storing tool class references when using SPECIFIC_TOOL events
95
+ )
93
96
  content_pattern: Optional[str] = None # For CONTENT_MATCH (regex)
94
97
  responder: Optional[str] = None # Specific responder name
95
98
  # Optionally match only if the responder was specific entity/task
@@ -146,6 +149,7 @@ class TaskConfig(BaseModel):
146
149
  done_sequences (List[DoneSequence]): List of event sequences that trigger task
147
150
  completion. Task is done if ANY sequence matches the recent event history.
148
151
  Each sequence is checked against the message parent chain.
152
+ Tool classes can be referenced in sequences like "T[MyToolClass]".
149
153
 
150
154
  """
151
155
 
@@ -298,14 +302,8 @@ class Task:
298
302
  set_parent_agent=noop_fn,
299
303
  )
300
304
  self.config = config
301
- # Store parsed done sequences
305
+ # Store parsed done sequences (will be initialized after agent assignment)
302
306
  self._parsed_done_sequences: Optional[List[DoneSequence]] = None
303
- if self.config.done_sequences:
304
- from .done_sequence_parser import parse_done_sequences
305
-
306
- self._parsed_done_sequences = parse_done_sequences(
307
- self.config.done_sequences
308
- )
309
307
  # how to behave as a sub-task; can be overridden by `add_sub_task()`
310
308
  self.config_sub_task = copy.deepcopy(config)
311
309
  # counts of distinct pending messages in history,
@@ -340,6 +338,21 @@ class Task:
340
338
  self.agent.set_system_message(system_message)
341
339
  if user_message:
342
340
  self.agent.set_user_message(user_message)
341
+
342
+ # Initialize parsed done sequences now that self.agent is available
343
+ if self.config.done_sequences:
344
+ from .done_sequence_parser import parse_done_sequences
345
+
346
+ # Pass agent's llm_tools_map directly
347
+ tools_map = (
348
+ self.agent.llm_tools_map
349
+ if hasattr(self.agent, "llm_tools_map")
350
+ else None
351
+ )
352
+ self._parsed_done_sequences = parse_done_sequences(
353
+ self.config.done_sequences, tools_map
354
+ )
355
+
343
356
  self.max_cost: float = 0
344
357
  self.max_tokens: int = 0
345
358
  self.session_id: str = ""
@@ -2331,8 +2344,32 @@ class Task:
2331
2344
  if expected.event_type == EventType.SPECIFIC_TOOL:
2332
2345
  if actual.event_type != EventType.TOOL:
2333
2346
  return False
2347
+
2348
+ # First try tool_class matching if available
2349
+ if expected.tool_class is not None:
2350
+ # Handle case where actual.tool_class might be a class instance
2351
+ if hasattr(actual, "tool_class") and actual.tool_class is not None:
2352
+ # If actual.tool_class is an instance, get its class
2353
+ if isinstance(actual.tool_class, type):
2354
+ actual_class = actual.tool_class
2355
+ else:
2356
+ actual_class = type(actual.tool_class)
2357
+
2358
+ # Compare the tool classes
2359
+ if actual_class == expected.tool_class:
2360
+ return True
2361
+ # Also check if actual tool is an instance of expected class
2362
+ if not isinstance(actual.tool_class, type) and isinstance(
2363
+ actual.tool_class, expected.tool_class
2364
+ ):
2365
+ return True
2366
+
2367
+ # If tool_class comparison didn't match, continue to tool_name fallback
2368
+
2369
+ # Fall back to tool_name comparison for backwards compatibility
2334
2370
  if expected.tool_name and actual.tool_name != expected.tool_name:
2335
2371
  return False
2372
+
2336
2373
  elif actual.event_type != expected.event_type:
2337
2374
  return False
2338
2375
  if expected.sender and actual.sender != expected.sender:
@@ -36,6 +36,9 @@ class OpenAIChatModel(ModelName):
36
36
  GPT4_1 = "gpt-4.1"
37
37
  GPT4_1_MINI = "gpt-4.1-mini"
38
38
  GPT4_1_NANO = "gpt-4.1-nano"
39
+ GPT5 = "gpt-5"
40
+ GPT5_MINI = "gpt-5-mini"
41
+ GPT5_NANO = "gpt-5-nano"
39
42
 
40
43
 
41
44
  class OpenAICompletionModel(str, Enum):
@@ -305,6 +308,54 @@ MODEL_INFO: Dict[str, ModelInfo] = {
305
308
  has_tools=False,
306
309
  description="O3 Mini Reasoning LM",
307
310
  ),
311
+ OpenAIChatModel.GPT5.value: ModelInfo(
312
+ name=OpenAIChatModel.GPT5.value,
313
+ provider=ModelProvider.OPENAI,
314
+ context_length=400_000,
315
+ max_output_tokens=128_000,
316
+ input_cost_per_million=1.25,
317
+ cached_cost_per_million=0.125,
318
+ output_cost_per_million=10.00,
319
+ allows_streaming=False,
320
+ allows_system_message=False,
321
+ has_structured_output=True,
322
+ unsupported_params=["temperature", "stream"],
323
+ rename_params={"max_tokens": "max_completion_tokens"},
324
+ has_tools=False,
325
+ description="GPT-5",
326
+ ),
327
+ OpenAIChatModel.GPT5_MINI.value: ModelInfo(
328
+ name=OpenAIChatModel.GPT5_MINI.value,
329
+ provider=ModelProvider.OPENAI,
330
+ context_length=400_000,
331
+ max_output_tokens=128_000,
332
+ input_cost_per_million=0.25,
333
+ cached_cost_per_million=0.025,
334
+ output_cost_per_million=2.00,
335
+ allows_streaming=False,
336
+ allows_system_message=False,
337
+ has_structured_output=True,
338
+ unsupported_params=["temperature", "stream"],
339
+ rename_params={"max_tokens": "max_completion_tokens"},
340
+ has_tools=False,
341
+ description="GPT-5 Mini",
342
+ ),
343
+ OpenAIChatModel.GPT5_NANO.value: ModelInfo(
344
+ name=OpenAIChatModel.GPT5_NANO.value,
345
+ provider=ModelProvider.OPENAI,
346
+ context_length=400_000,
347
+ max_output_tokens=128_000,
348
+ input_cost_per_million=0.05,
349
+ cached_cost_per_million=0.005,
350
+ output_cost_per_million=0.40,
351
+ allows_streaming=False,
352
+ allows_system_message=False,
353
+ has_structured_output=True,
354
+ unsupported_params=["temperature", "stream"],
355
+ rename_params={"max_tokens": "max_completion_tokens"},
356
+ has_tools=False,
357
+ description="GPT-5 Nano",
358
+ ),
308
359
  # Anthropic Models
309
360
  AnthropicModel.CLAUDE_3_5_SONNET.value: ModelInfo(
310
361
  name=AnthropicModel.CLAUDE_3_5_SONNET.value,
@@ -0,0 +1 @@
1
+ """MCP (Model Context Protocol) integration for Langroid."""
@@ -0,0 +1 @@
1
+ """MCP server implementation for Langroid."""
File without changes
@@ -45,7 +45,7 @@ try:
45
45
  from pydantic_settings import BaseSettings # noqa: F401
46
46
  except ImportError:
47
47
  # Fallback for older pydantic versions
48
- from pydantic import BaseSettings # noqa: F401
48
+ from pydantic import BaseSettings # type: ignore[no-redef] # noqa: F401
49
49
 
50
50
  # Explicitly export all items for mypy
51
51
  __all__ = [
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "langroid"
3
- version = "0.59.0-b3"
3
+ version = "0.59.1"
4
4
  authors = [
5
5
  {name = "Prasad Chalasani", email = "pchalasani@gmail.com"},
6
6
  ]