langroid 0.58.0__tar.gz → 0.58.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 (146) hide show
  1. {langroid-0.58.0 → langroid-0.58.2}/PKG-INFO +5 -3
  2. {langroid-0.58.0 → langroid-0.58.2}/README.md +2 -0
  3. {langroid-0.58.0 → langroid-0.58.2}/langroid/parsing/url_loader.py +43 -33
  4. {langroid-0.58.0 → langroid-0.58.2}/pyproject.toml +2 -2
  5. {langroid-0.58.0 → langroid-0.58.2}/.gitignore +0 -0
  6. {langroid-0.58.0 → langroid-0.58.2}/LICENSE +0 -0
  7. {langroid-0.58.0 → langroid-0.58.2}/langroid/__init__.py +0 -0
  8. {langroid-0.58.0 → langroid-0.58.2}/langroid/agent/__init__.py +0 -0
  9. {langroid-0.58.0 → langroid-0.58.2}/langroid/agent/base.py +0 -0
  10. {langroid-0.58.0 → langroid-0.58.2}/langroid/agent/batch.py +0 -0
  11. {langroid-0.58.0 → langroid-0.58.2}/langroid/agent/callbacks/__init__.py +0 -0
  12. {langroid-0.58.0 → langroid-0.58.2}/langroid/agent/callbacks/chainlit.py +0 -0
  13. {langroid-0.58.0 → langroid-0.58.2}/langroid/agent/chat_agent.py +0 -0
  14. {langroid-0.58.0 → langroid-0.58.2}/langroid/agent/chat_document.py +0 -0
  15. {langroid-0.58.0 → langroid-0.58.2}/langroid/agent/done_sequence_parser.py +0 -0
  16. {langroid-0.58.0 → langroid-0.58.2}/langroid/agent/openai_assistant.py +0 -0
  17. {langroid-0.58.0 → langroid-0.58.2}/langroid/agent/special/__init__.py +0 -0
  18. {langroid-0.58.0 → langroid-0.58.2}/langroid/agent/special/arangodb/__init__.py +0 -0
  19. {langroid-0.58.0 → langroid-0.58.2}/langroid/agent/special/arangodb/arangodb_agent.py +0 -0
  20. {langroid-0.58.0 → langroid-0.58.2}/langroid/agent/special/arangodb/system_messages.py +0 -0
  21. {langroid-0.58.0 → langroid-0.58.2}/langroid/agent/special/arangodb/tools.py +0 -0
  22. {langroid-0.58.0 → langroid-0.58.2}/langroid/agent/special/arangodb/utils.py +0 -0
  23. {langroid-0.58.0 → langroid-0.58.2}/langroid/agent/special/doc_chat_agent.py +0 -0
  24. {langroid-0.58.0 → langroid-0.58.2}/langroid/agent/special/doc_chat_task.py +0 -0
  25. {langroid-0.58.0 → langroid-0.58.2}/langroid/agent/special/lance_doc_chat_agent.py +0 -0
  26. {langroid-0.58.0 → langroid-0.58.2}/langroid/agent/special/lance_rag/__init__.py +0 -0
  27. {langroid-0.58.0 → langroid-0.58.2}/langroid/agent/special/lance_rag/critic_agent.py +0 -0
  28. {langroid-0.58.0 → langroid-0.58.2}/langroid/agent/special/lance_rag/lance_rag_task.py +0 -0
  29. {langroid-0.58.0 → langroid-0.58.2}/langroid/agent/special/lance_rag/query_planner_agent.py +0 -0
  30. {langroid-0.58.0 → langroid-0.58.2}/langroid/agent/special/lance_tools.py +0 -0
  31. {langroid-0.58.0 → langroid-0.58.2}/langroid/agent/special/neo4j/__init__.py +0 -0
  32. {langroid-0.58.0 → langroid-0.58.2}/langroid/agent/special/neo4j/csv_kg_chat.py +0 -0
  33. {langroid-0.58.0 → langroid-0.58.2}/langroid/agent/special/neo4j/neo4j_chat_agent.py +0 -0
  34. {langroid-0.58.0 → langroid-0.58.2}/langroid/agent/special/neo4j/system_messages.py +0 -0
  35. {langroid-0.58.0 → langroid-0.58.2}/langroid/agent/special/neo4j/tools.py +0 -0
  36. {langroid-0.58.0 → langroid-0.58.2}/langroid/agent/special/relevance_extractor_agent.py +0 -0
  37. {langroid-0.58.0 → langroid-0.58.2}/langroid/agent/special/retriever_agent.py +0 -0
  38. {langroid-0.58.0 → langroid-0.58.2}/langroid/agent/special/sql/__init__.py +0 -0
  39. {langroid-0.58.0 → langroid-0.58.2}/langroid/agent/special/sql/sql_chat_agent.py +0 -0
  40. {langroid-0.58.0 → langroid-0.58.2}/langroid/agent/special/sql/utils/__init__.py +0 -0
  41. {langroid-0.58.0 → langroid-0.58.2}/langroid/agent/special/sql/utils/description_extractors.py +0 -0
  42. {langroid-0.58.0 → langroid-0.58.2}/langroid/agent/special/sql/utils/populate_metadata.py +0 -0
  43. {langroid-0.58.0 → langroid-0.58.2}/langroid/agent/special/sql/utils/system_message.py +0 -0
  44. {langroid-0.58.0 → langroid-0.58.2}/langroid/agent/special/sql/utils/tools.py +0 -0
  45. {langroid-0.58.0 → langroid-0.58.2}/langroid/agent/special/table_chat_agent.py +0 -0
  46. {langroid-0.58.0 → langroid-0.58.2}/langroid/agent/task.py +0 -0
  47. {langroid-0.58.0 → langroid-0.58.2}/langroid/agent/tool_message.py +0 -0
  48. {langroid-0.58.0 → langroid-0.58.2}/langroid/agent/tools/__init__.py +0 -0
  49. {langroid-0.58.0 → langroid-0.58.2}/langroid/agent/tools/duckduckgo_search_tool.py +0 -0
  50. {langroid-0.58.0 → langroid-0.58.2}/langroid/agent/tools/exa_search_tool.py +0 -0
  51. {langroid-0.58.0 → langroid-0.58.2}/langroid/agent/tools/file_tools.py +0 -0
  52. {langroid-0.58.0 → langroid-0.58.2}/langroid/agent/tools/google_search_tool.py +0 -0
  53. {langroid-0.58.0 → langroid-0.58.2}/langroid/agent/tools/mcp/__init__.py +0 -0
  54. {langroid-0.58.0 → langroid-0.58.2}/langroid/agent/tools/mcp/decorators.py +0 -0
  55. {langroid-0.58.0 → langroid-0.58.2}/langroid/agent/tools/mcp/fastmcp_client.py +0 -0
  56. {langroid-0.58.0 → langroid-0.58.2}/langroid/agent/tools/metaphor_search_tool.py +0 -0
  57. {langroid-0.58.0 → langroid-0.58.2}/langroid/agent/tools/orchestration.py +0 -0
  58. {langroid-0.58.0 → langroid-0.58.2}/langroid/agent/tools/recipient_tool.py +0 -0
  59. {langroid-0.58.0 → langroid-0.58.2}/langroid/agent/tools/retrieval_tool.py +0 -0
  60. {langroid-0.58.0 → langroid-0.58.2}/langroid/agent/tools/rewind_tool.py +0 -0
  61. {langroid-0.58.0 → langroid-0.58.2}/langroid/agent/tools/segment_extract_tool.py +0 -0
  62. {langroid-0.58.0 → langroid-0.58.2}/langroid/agent/tools/task_tool.py +0 -0
  63. {langroid-0.58.0 → langroid-0.58.2}/langroid/agent/tools/tavily_search_tool.py +0 -0
  64. {langroid-0.58.0 → langroid-0.58.2}/langroid/agent/xml_tool_message.py +0 -0
  65. {langroid-0.58.0 → langroid-0.58.2}/langroid/cachedb/__init__.py +0 -0
  66. {langroid-0.58.0 → langroid-0.58.2}/langroid/cachedb/base.py +0 -0
  67. {langroid-0.58.0 → langroid-0.58.2}/langroid/cachedb/redis_cachedb.py +0 -0
  68. {langroid-0.58.0 → langroid-0.58.2}/langroid/embedding_models/__init__.py +0 -0
  69. {langroid-0.58.0 → langroid-0.58.2}/langroid/embedding_models/base.py +0 -0
  70. {langroid-0.58.0 → langroid-0.58.2}/langroid/embedding_models/models.py +0 -0
  71. {langroid-0.58.0 → langroid-0.58.2}/langroid/embedding_models/protoc/__init__.py +0 -0
  72. {langroid-0.58.0 → langroid-0.58.2}/langroid/embedding_models/protoc/embeddings.proto +0 -0
  73. {langroid-0.58.0 → langroid-0.58.2}/langroid/embedding_models/protoc/embeddings_pb2.py +0 -0
  74. {langroid-0.58.0 → langroid-0.58.2}/langroid/embedding_models/protoc/embeddings_pb2.pyi +0 -0
  75. {langroid-0.58.0 → langroid-0.58.2}/langroid/embedding_models/protoc/embeddings_pb2_grpc.py +0 -0
  76. {langroid-0.58.0 → langroid-0.58.2}/langroid/embedding_models/remote_embeds.py +0 -0
  77. {langroid-0.58.0 → langroid-0.58.2}/langroid/exceptions.py +0 -0
  78. {langroid-0.58.0 → langroid-0.58.2}/langroid/language_models/__init__.py +0 -0
  79. {langroid-0.58.0 → langroid-0.58.2}/langroid/language_models/azure_openai.py +0 -0
  80. {langroid-0.58.0 → langroid-0.58.2}/langroid/language_models/base.py +0 -0
  81. {langroid-0.58.0 → langroid-0.58.2}/langroid/language_models/client_cache.py +0 -0
  82. {langroid-0.58.0 → langroid-0.58.2}/langroid/language_models/config.py +0 -0
  83. {langroid-0.58.0 → langroid-0.58.2}/langroid/language_models/mock_lm.py +0 -0
  84. {langroid-0.58.0 → langroid-0.58.2}/langroid/language_models/model_info.py +0 -0
  85. {langroid-0.58.0 → langroid-0.58.2}/langroid/language_models/openai_gpt.py +0 -0
  86. {langroid-0.58.0 → langroid-0.58.2}/langroid/language_models/prompt_formatter/__init__.py +0 -0
  87. {langroid-0.58.0 → langroid-0.58.2}/langroid/language_models/prompt_formatter/base.py +0 -0
  88. {langroid-0.58.0 → langroid-0.58.2}/langroid/language_models/prompt_formatter/hf_formatter.py +0 -0
  89. {langroid-0.58.0 → langroid-0.58.2}/langroid/language_models/prompt_formatter/llama2_formatter.py +0 -0
  90. {langroid-0.58.0 → langroid-0.58.2}/langroid/language_models/provider_params.py +0 -0
  91. {langroid-0.58.0 → langroid-0.58.2}/langroid/language_models/utils.py +0 -0
  92. {langroid-0.58.0 → langroid-0.58.2}/langroid/mcp/__init__.py +0 -0
  93. {langroid-0.58.0 → langroid-0.58.2}/langroid/mcp/server/__init__.py +0 -0
  94. {langroid-0.58.0 → langroid-0.58.2}/langroid/mytypes.py +0 -0
  95. {langroid-0.58.0 → langroid-0.58.2}/langroid/parsing/__init__.py +0 -0
  96. {langroid-0.58.0 → langroid-0.58.2}/langroid/parsing/agent_chats.py +0 -0
  97. {langroid-0.58.0 → langroid-0.58.2}/langroid/parsing/code_parser.py +0 -0
  98. {langroid-0.58.0 → langroid-0.58.2}/langroid/parsing/document_parser.py +0 -0
  99. {langroid-0.58.0 → langroid-0.58.2}/langroid/parsing/file_attachment.py +0 -0
  100. {langroid-0.58.0 → langroid-0.58.2}/langroid/parsing/md_parser.py +0 -0
  101. {langroid-0.58.0 → langroid-0.58.2}/langroid/parsing/para_sentence_split.py +0 -0
  102. {langroid-0.58.0 → langroid-0.58.2}/langroid/parsing/parse_json.py +0 -0
  103. {langroid-0.58.0 → langroid-0.58.2}/langroid/parsing/parser.py +0 -0
  104. {langroid-0.58.0 → langroid-0.58.2}/langroid/parsing/pdf_utils.py +0 -0
  105. {langroid-0.58.0 → langroid-0.58.2}/langroid/parsing/repo_loader.py +0 -0
  106. {langroid-0.58.0 → langroid-0.58.2}/langroid/parsing/routing.py +0 -0
  107. {langroid-0.58.0 → langroid-0.58.2}/langroid/parsing/search.py +0 -0
  108. {langroid-0.58.0 → langroid-0.58.2}/langroid/parsing/spider.py +0 -0
  109. {langroid-0.58.0 → langroid-0.58.2}/langroid/parsing/table_loader.py +0 -0
  110. {langroid-0.58.0 → langroid-0.58.2}/langroid/parsing/urls.py +0 -0
  111. {langroid-0.58.0 → langroid-0.58.2}/langroid/parsing/utils.py +0 -0
  112. {langroid-0.58.0 → langroid-0.58.2}/langroid/parsing/web_search.py +0 -0
  113. {langroid-0.58.0 → langroid-0.58.2}/langroid/prompts/__init__.py +0 -0
  114. {langroid-0.58.0 → langroid-0.58.2}/langroid/prompts/dialog.py +0 -0
  115. {langroid-0.58.0 → langroid-0.58.2}/langroid/prompts/prompts_config.py +0 -0
  116. {langroid-0.58.0 → langroid-0.58.2}/langroid/prompts/templates.py +0 -0
  117. {langroid-0.58.0 → langroid-0.58.2}/langroid/py.typed +0 -0
  118. {langroid-0.58.0 → langroid-0.58.2}/langroid/pydantic_v1/__init__.py +0 -0
  119. {langroid-0.58.0 → langroid-0.58.2}/langroid/pydantic_v1/main.py +0 -0
  120. {langroid-0.58.0 → langroid-0.58.2}/langroid/utils/__init__.py +0 -0
  121. {langroid-0.58.0 → langroid-0.58.2}/langroid/utils/algorithms/__init__.py +0 -0
  122. {langroid-0.58.0 → langroid-0.58.2}/langroid/utils/algorithms/graph.py +0 -0
  123. {langroid-0.58.0 → langroid-0.58.2}/langroid/utils/configuration.py +0 -0
  124. {langroid-0.58.0 → langroid-0.58.2}/langroid/utils/constants.py +0 -0
  125. {langroid-0.58.0 → langroid-0.58.2}/langroid/utils/git_utils.py +0 -0
  126. {langroid-0.58.0 → langroid-0.58.2}/langroid/utils/globals.py +0 -0
  127. {langroid-0.58.0 → langroid-0.58.2}/langroid/utils/html_logger.py +0 -0
  128. {langroid-0.58.0 → langroid-0.58.2}/langroid/utils/logging.py +0 -0
  129. {langroid-0.58.0 → langroid-0.58.2}/langroid/utils/object_registry.py +0 -0
  130. {langroid-0.58.0 → langroid-0.58.2}/langroid/utils/output/__init__.py +0 -0
  131. {langroid-0.58.0 → langroid-0.58.2}/langroid/utils/output/citations.py +0 -0
  132. {langroid-0.58.0 → langroid-0.58.2}/langroid/utils/output/printing.py +0 -0
  133. {langroid-0.58.0 → langroid-0.58.2}/langroid/utils/output/status.py +0 -0
  134. {langroid-0.58.0 → langroid-0.58.2}/langroid/utils/pandas_utils.py +0 -0
  135. {langroid-0.58.0 → langroid-0.58.2}/langroid/utils/pydantic_utils.py +0 -0
  136. {langroid-0.58.0 → langroid-0.58.2}/langroid/utils/system.py +0 -0
  137. {langroid-0.58.0 → langroid-0.58.2}/langroid/utils/types.py +0 -0
  138. {langroid-0.58.0 → langroid-0.58.2}/langroid/vector_store/__init__.py +0 -0
  139. {langroid-0.58.0 → langroid-0.58.2}/langroid/vector_store/base.py +0 -0
  140. {langroid-0.58.0 → langroid-0.58.2}/langroid/vector_store/chromadb.py +0 -0
  141. {langroid-0.58.0 → langroid-0.58.2}/langroid/vector_store/lancedb.py +0 -0
  142. {langroid-0.58.0 → langroid-0.58.2}/langroid/vector_store/meilisearch.py +0 -0
  143. {langroid-0.58.0 → langroid-0.58.2}/langroid/vector_store/pineconedb.py +0 -0
  144. {langroid-0.58.0 → langroid-0.58.2}/langroid/vector_store/postgres.py +0 -0
  145. {langroid-0.58.0 → langroid-0.58.2}/langroid/vector_store/qdrantdb.py +0 -0
  146. {langroid-0.58.0 → langroid-0.58.2}/langroid/vector_store/weaviatedb.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: langroid
3
- Version: 0.58.0
3
+ Version: 0.58.2
4
4
  Summary: Harness LLMs with Multi-Agent Programming
5
5
  Author-email: Prasad Chalasani <pchalasani@gmail.com>
6
6
  License: MIT
@@ -94,8 +94,8 @@ Requires-Dist: chainlit<3.0.0,>=2.0.1; extra == 'chainlit'
94
94
  Requires-Dist: python-socketio<6.0.0,>=5.11.0; extra == 'chainlit'
95
95
  Provides-Extra: chromadb
96
96
  Requires-Dist: chromadb<=0.4.23,>=0.4.21; extra == 'chromadb'
97
- Provides-Extra: crawl-4-ai
98
- Requires-Dist: crawl4ai>=0.6.3; extra == 'crawl-4-ai'
97
+ Provides-Extra: crawl4ai
98
+ Requires-Dist: crawl4ai>=0.6.3; extra == 'crawl4ai'
99
99
  Provides-Extra: db
100
100
  Requires-Dist: psycopg2-binary>=2.9.10; extra == 'db'
101
101
  Requires-Dist: psycopg2<3.0.0,>=2.9.7; extra == 'db'
@@ -347,6 +347,8 @@ teacher_task.run()
347
347
  <summary> <b>Click to expand</b></summary>
348
348
 
349
349
  - **Jul 2025:**
350
+ - [0.58.0](https://github.com/langroid/langroid/releases/tag/0.58.0) Crawl4AI integration -
351
+ browser-based web crawling with Playwright for JavaScript-heavy sites, no API key required (thank you @abab-dev!).
350
352
  - [0.57.0](https://github.com/langroid/langroid/releases/tag/0.57.0) HTML Logger for interactive task visualization -
351
353
  self-contained HTML logs with collapsible entries, auto-refresh, and persistent UI state.
352
354
  - **Jun 2025:**
@@ -144,6 +144,8 @@ teacher_task.run()
144
144
  <summary> <b>Click to expand</b></summary>
145
145
 
146
146
  - **Jul 2025:**
147
+ - [0.58.0](https://github.com/langroid/langroid/releases/tag/0.58.0) Crawl4AI integration -
148
+ browser-based web crawling with Playwright for JavaScript-heavy sites, no API key required (thank you @abab-dev!).
147
149
  - [0.57.0](https://github.com/langroid/langroid/releases/tag/0.57.0) HTML Logger for interactive task visualization -
148
150
  self-contained HTML logs with collapsible entries, auto-refresh, and persistent UI state.
149
151
  - **Jun 2025:**
@@ -25,7 +25,7 @@ if TYPE_CHECKING:
25
25
  from crawl4ai.extraction_strategy import ExtractionStrategy
26
26
  from crawl4ai.markdown_generation_strategy import MarkdownGenerationStrategy
27
27
  except ImportError:
28
- raise LangroidImportError("crawl4ai", "crawl-4-ai")
28
+ raise LangroidImportError("crawl4ai", "crawl4ai")
29
29
 
30
30
  load_dotenv()
31
31
 
@@ -70,48 +70,58 @@ class ExaCrawlerConfig(BaseCrawlerConfig):
70
70
  env_prefix = "EXA_"
71
71
 
72
72
 
73
- def _resolve_crawl4ai_forward_refs(cls: Any) -> Any:
74
- """
75
- A class decorator that resolves forward references for fields in a Pydantic
76
- model that depend on the optional 'crawl4ai' library.
77
- """
78
- try:
79
- from crawl4ai.async_configs import BrowserConfig, CrawlerRunConfig # noqa: F401
80
- from crawl4ai.content_scraping_strategy import ( # noqa: F401
81
- ContentScrapingStrategy,
82
- )
83
- from crawl4ai.deep_crawling import DeepCrawlStrategy # noqa: F401
84
- from crawl4ai.extraction_strategy import ExtractionStrategy # noqa: F401
85
- from crawl4ai.markdown_generation_strategy import ( # noqa: F401
86
- MarkdownGenerationStrategy,
87
- )
88
-
89
- # Create a namespace dictionary from locals() but exclude 'cls'.
90
- # This prevents the TypeError.
91
- namespace = {name: value for name, value in locals().items() if name != "cls"}
92
- cls.update_forward_refs(**namespace)
93
-
94
- except ImportError:
95
- # If crawl4ai is not installed, do nothing.
96
- pass
97
- return cls
98
-
99
-
100
- @_resolve_crawl4ai_forward_refs
101
73
  class Crawl4aiConfig(BaseCrawlerConfig):
102
- """
103
- Configuration for the Crawl4aiCrawler.
104
- """
74
+ """Configuration for the Crawl4aiCrawler."""
105
75
 
106
76
  crawl_mode: Literal["simple", "deep"] = "simple"
107
77
  extraction_strategy: Optional["ExtractionStrategy"] = None
108
78
  markdown_strategy: Optional["MarkdownGenerationStrategy"] = None
109
79
  deep_crawl_strategy: Optional["DeepCrawlStrategy"] = None
110
80
  scraping_strategy: Optional["ContentScrapingStrategy"] = None
111
-
112
81
  browser_config: Optional["BrowserConfig"] = None
113
82
  run_config: Optional["CrawlerRunConfig"] = None
114
83
 
84
+ _refs_resolved: bool = False
85
+
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
+
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)
124
+
115
125
  class Config:
116
126
  arbitrary_types_allowed = True
117
127
 
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "langroid"
3
- version = "0.58.0"
3
+ version = "0.58.2"
4
4
  authors = [
5
5
  {name = "Prasad Chalasani", email = "pchalasani@gmail.com"},
6
6
  ]
@@ -270,7 +270,7 @@ asyncio = [
270
270
  firecrawl = [
271
271
  "firecrawl-py>=1.13.5",
272
272
  ]
273
- crawl-4-ai = [
273
+ crawl4ai = [
274
274
  "crawl4ai>=0.6.3",
275
275
  ]
276
276
 
File without changes
File without changes
File without changes
File without changes