langroid 0.58.2__py3-none-any.whl → 0.59.0b1__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 (106) hide show
  1. langroid/agent/base.py +39 -17
  2. langroid/agent/base.py-e +2216 -0
  3. langroid/agent/callbacks/chainlit.py +2 -1
  4. langroid/agent/chat_agent.py +73 -55
  5. langroid/agent/chat_agent.py-e +2086 -0
  6. langroid/agent/chat_document.py +7 -7
  7. langroid/agent/chat_document.py-e +513 -0
  8. langroid/agent/openai_assistant.py +9 -9
  9. langroid/agent/openai_assistant.py-e +882 -0
  10. langroid/agent/special/arangodb/arangodb_agent.py +10 -18
  11. langroid/agent/special/arangodb/arangodb_agent.py-e +648 -0
  12. langroid/agent/special/arangodb/tools.py +3 -3
  13. langroid/agent/special/doc_chat_agent.py +16 -14
  14. langroid/agent/special/lance_rag/critic_agent.py +2 -2
  15. langroid/agent/special/lance_rag/query_planner_agent.py +4 -4
  16. langroid/agent/special/lance_tools.py +6 -5
  17. langroid/agent/special/lance_tools.py-e +61 -0
  18. langroid/agent/special/neo4j/neo4j_chat_agent.py +3 -7
  19. langroid/agent/special/neo4j/neo4j_chat_agent.py-e +430 -0
  20. langroid/agent/special/relevance_extractor_agent.py +1 -1
  21. langroid/agent/special/sql/sql_chat_agent.py +11 -3
  22. langroid/agent/task.py +9 -87
  23. langroid/agent/task.py-e +2418 -0
  24. langroid/agent/tool_message.py +33 -17
  25. langroid/agent/tool_message.py-e +400 -0
  26. langroid/agent/tools/file_tools.py +4 -2
  27. langroid/agent/tools/file_tools.py-e +234 -0
  28. langroid/agent/tools/mcp/fastmcp_client.py +19 -6
  29. langroid/agent/tools/mcp/fastmcp_client.py-e +584 -0
  30. langroid/agent/tools/orchestration.py +22 -17
  31. langroid/agent/tools/orchestration.py-e +301 -0
  32. langroid/agent/tools/recipient_tool.py +3 -3
  33. langroid/agent/tools/task_tool.py +22 -16
  34. langroid/agent/tools/task_tool.py-e +249 -0
  35. langroid/agent/xml_tool_message.py +90 -35
  36. langroid/agent/xml_tool_message.py-e +392 -0
  37. langroid/cachedb/base.py +1 -1
  38. langroid/embedding_models/base.py +2 -2
  39. langroid/embedding_models/models.py +3 -7
  40. langroid/embedding_models/models.py-e +563 -0
  41. langroid/exceptions.py +4 -1
  42. langroid/language_models/azure_openai.py +2 -2
  43. langroid/language_models/azure_openai.py-e +134 -0
  44. langroid/language_models/base.py +6 -4
  45. langroid/language_models/base.py-e +812 -0
  46. langroid/language_models/client_cache.py +64 -0
  47. langroid/language_models/config.py +2 -4
  48. langroid/language_models/config.py-e +18 -0
  49. langroid/language_models/model_info.py +9 -1
  50. langroid/language_models/model_info.py-e +483 -0
  51. langroid/language_models/openai_gpt.py +119 -20
  52. langroid/language_models/openai_gpt.py-e +2280 -0
  53. langroid/language_models/provider_params.py +3 -22
  54. langroid/language_models/provider_params.py-e +153 -0
  55. langroid/mytypes.py +11 -4
  56. langroid/mytypes.py-e +132 -0
  57. langroid/parsing/code_parser.py +1 -1
  58. langroid/parsing/file_attachment.py +1 -1
  59. langroid/parsing/file_attachment.py-e +246 -0
  60. langroid/parsing/md_parser.py +14 -4
  61. langroid/parsing/md_parser.py-e +574 -0
  62. langroid/parsing/parser.py +22 -7
  63. langroid/parsing/parser.py-e +410 -0
  64. langroid/parsing/repo_loader.py +3 -1
  65. langroid/parsing/repo_loader.py-e +812 -0
  66. langroid/parsing/search.py +1 -1
  67. langroid/parsing/url_loader.py +17 -51
  68. langroid/parsing/url_loader.py-e +683 -0
  69. langroid/parsing/urls.py +5 -4
  70. langroid/parsing/urls.py-e +279 -0
  71. langroid/prompts/prompts_config.py +1 -1
  72. langroid/pydantic_v1/__init__.py +45 -6
  73. langroid/pydantic_v1/__init__.py-e +36 -0
  74. langroid/pydantic_v1/main.py +11 -4
  75. langroid/pydantic_v1/main.py-e +11 -0
  76. langroid/utils/configuration.py +13 -11
  77. langroid/utils/configuration.py-e +141 -0
  78. langroid/utils/constants.py +1 -1
  79. langroid/utils/constants.py-e +32 -0
  80. langroid/utils/globals.py +21 -5
  81. langroid/utils/globals.py-e +49 -0
  82. langroid/utils/html_logger.py +2 -1
  83. langroid/utils/html_logger.py-e +825 -0
  84. langroid/utils/object_registry.py +1 -1
  85. langroid/utils/object_registry.py-e +66 -0
  86. langroid/utils/pydantic_utils.py +55 -28
  87. langroid/utils/pydantic_utils.py-e +602 -0
  88. langroid/utils/types.py +2 -2
  89. langroid/utils/types.py-e +113 -0
  90. langroid/vector_store/base.py +3 -3
  91. langroid/vector_store/lancedb.py +5 -5
  92. langroid/vector_store/lancedb.py-e +404 -0
  93. langroid/vector_store/meilisearch.py +2 -2
  94. langroid/vector_store/pineconedb.py +4 -4
  95. langroid/vector_store/pineconedb.py-e +427 -0
  96. langroid/vector_store/postgres.py +1 -1
  97. langroid/vector_store/qdrantdb.py +3 -3
  98. langroid/vector_store/weaviatedb.py +1 -1
  99. {langroid-0.58.2.dist-info → langroid-0.59.0b1.dist-info}/METADATA +3 -2
  100. langroid-0.59.0b1.dist-info/RECORD +181 -0
  101. langroid/agent/special/doc_chat_task.py +0 -0
  102. langroid/mcp/__init__.py +0 -1
  103. langroid/mcp/server/__init__.py +0 -1
  104. langroid-0.58.2.dist-info/RECORD +0 -145
  105. {langroid-0.58.2.dist-info → langroid-0.59.0b1.dist-info}/WHEEL +0 -0
  106. {langroid-0.58.2.dist-info → langroid-0.59.0b1.dist-info}/licenses/LICENSE +0 -0
@@ -64,7 +64,7 @@ def find_fuzzy_matches_in_docs(
64
64
  return orig_doc_matches
65
65
  if len(orig_doc_matches) == 0:
66
66
  return []
67
- if set(orig_doc_matches[0][0].__fields__) != {"content", "metadata"}:
67
+ if set(orig_doc_matches[0][0].model_fields) != {"content", "metadata"}:
68
68
  # If there are fields beyond just content and metadata,
69
69
  # we do NOT want to create new document objects with content fields
70
70
  # based on words_before and words_after, since we don't know how to
@@ -7,12 +7,12 @@ from typing import TYPE_CHECKING, Any, Dict, List, Literal, Optional
7
7
 
8
8
  import markdownify as md
9
9
  from dotenv import load_dotenv
10
+ from pydantic_settings import BaseSettings, SettingsConfigDict
10
11
 
11
12
  from langroid.exceptions import LangroidImportError
12
13
  from langroid.mytypes import DocMetaData, Document
13
14
  from langroid.parsing.document_parser import DocumentParser, ImagePdfParser
14
15
  from langroid.parsing.parser import Parser, ParsingConfig
15
- from langroid.pydantic_v1 import BaseSettings
16
16
 
17
17
  if TYPE_CHECKING:
18
18
  from firecrawl import FirecrawlApp
@@ -54,20 +54,13 @@ class FirecrawlConfig(BaseCrawlerConfig):
54
54
  params: Dict[str, Any] = {}
55
55
  timeout: Optional[int] = None
56
56
 
57
- class Config:
58
- # Leverage Pydantic's BaseSettings to
59
- # allow setting of fields via env vars,
60
- # e.g. FIRECRAWL_MODE=scrape and FIRECRAWL_API_KEY=...
61
- env_prefix = "FIRECRAWL_"
57
+ model_config = SettingsConfigDict(env_prefix="FIRECRAWL_")
62
58
 
63
59
 
64
60
  class ExaCrawlerConfig(BaseCrawlerConfig):
65
61
  api_key: str = ""
66
62
 
67
- class Config:
68
- # Allow setting of fields via env vars with prefix EXA_
69
- # e.g., EXA_API_KEY=your_api_key
70
- env_prefix = "EXA_"
63
+ model_config = SettingsConfigDict(env_prefix="EXA_")
71
64
 
72
65
 
73
66
  class Crawl4aiConfig(BaseCrawlerConfig):
@@ -81,49 +74,22 @@ class Crawl4aiConfig(BaseCrawlerConfig):
81
74
  browser_config: Optional["BrowserConfig"] = None
82
75
  run_config: Optional["CrawlerRunConfig"] = None
83
76
 
84
- _refs_resolved: bool = False
77
+ model_config = SettingsConfigDict(arbitrary_types_allowed=True)
85
78
 
86
- def __init_subclass__(cls, **kwargs: Any) -> None:
87
- """Resolve forward references when class is first subclassed or instantiated."""
88
- super().__init_subclass__(**kwargs)
89
- cls._resolve_forward_refs()
90
79
 
91
- @classmethod
92
- def _resolve_forward_refs(cls) -> None:
93
- """Resolve forward references only when needed."""
94
- if not cls._refs_resolved:
95
- try:
96
- from crawl4ai.async_configs import BrowserConfig, CrawlerRunConfig
97
- from crawl4ai.content_scraping_strategy import ContentScrapingStrategy
98
- from crawl4ai.deep_crawling import DeepCrawlStrategy
99
- from crawl4ai.extraction_strategy import ExtractionStrategy
100
- from crawl4ai.markdown_generation_strategy import (
101
- MarkdownGenerationStrategy,
102
- )
103
-
104
- # Create namespace for update_forward_refs
105
- namespace = {
106
- "BrowserConfig": BrowserConfig,
107
- "CrawlerRunConfig": CrawlerRunConfig,
108
- "ContentScrapingStrategy": ContentScrapingStrategy,
109
- "DeepCrawlStrategy": DeepCrawlStrategy,
110
- "ExtractionStrategy": ExtractionStrategy,
111
- "MarkdownGenerationStrategy": MarkdownGenerationStrategy,
112
- }
113
-
114
- cls.update_forward_refs(**namespace)
115
- cls._refs_resolved = True
116
- except ImportError:
117
- # If crawl4ai is not installed, leave forward refs as strings
118
- pass
119
-
120
- def __init__(self, **kwargs: Any) -> None:
121
- """Initialize and ensure forward refs are resolved."""
122
- self._resolve_forward_refs()
123
- super().__init__(**kwargs)
80
+ # Resolve forward references for Crawl4aiConfig after the class is defined
81
+ try:
82
+ from crawl4ai.async_configs import BrowserConfig, CrawlerRunConfig
83
+ from crawl4ai.content_scraping_strategy import ContentScrapingStrategy
84
+ from crawl4ai.deep_crawling import DeepCrawlStrategy
85
+ from crawl4ai.extraction_strategy import ExtractionStrategy
86
+ from crawl4ai.markdown_generation_strategy import MarkdownGenerationStrategy
124
87
 
125
- class Config:
126
- arbitrary_types_allowed = True
88
+ # Rebuild the model with resolved references
89
+ Crawl4aiConfig.model_rebuild()
90
+ except ImportError:
91
+ # If crawl4ai is not installed, leave forward refs as strings
92
+ pass
127
93
 
128
94
 
129
95
  class BaseCrawler(ABC):
@@ -347,7 +313,7 @@ class FirecrawlCrawler(BaseCrawler):
347
313
  )
348
314
  processed_urls.add(url)
349
315
  new_pages += 1
350
- pbar.update(new_pages) # Update progress bar with new pages
316
+ pbar.model_copy(update=new_pages) # Update progress bar with new pages
351
317
 
352
318
  # Break if crawl is complete
353
319
  if status["status"] == "completed":