camel-ai 0.2.74a4__py3-none-any.whl → 0.2.75a0__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.

Potentially problematic release.


This version of camel-ai might be problematic. Click here for more details.

Files changed (63) hide show
  1. camel/__init__.py +1 -1
  2. camel/interpreters/e2b_interpreter.py +34 -1
  3. camel/models/aiml_model.py +1 -16
  4. camel/models/anthropic_model.py +6 -19
  5. camel/models/aws_bedrock_model.py +1 -16
  6. camel/models/azure_openai_model.py +1 -16
  7. camel/models/base_model.py +0 -12
  8. camel/models/cohere_model.py +1 -16
  9. camel/models/crynux_model.py +1 -16
  10. camel/models/deepseek_model.py +1 -16
  11. camel/models/gemini_model.py +1 -16
  12. camel/models/groq_model.py +1 -17
  13. camel/models/internlm_model.py +1 -16
  14. camel/models/litellm_model.py +1 -16
  15. camel/models/lmstudio_model.py +1 -17
  16. camel/models/mistral_model.py +1 -16
  17. camel/models/modelscope_model.py +1 -16
  18. camel/models/moonshot_model.py +1 -16
  19. camel/models/nemotron_model.py +0 -5
  20. camel/models/netmind_model.py +1 -16
  21. camel/models/novita_model.py +1 -16
  22. camel/models/nvidia_model.py +1 -16
  23. camel/models/ollama_model.py +1 -16
  24. camel/models/openai_compatible_model.py +0 -3
  25. camel/models/openai_model.py +1 -16
  26. camel/models/openrouter_model.py +1 -17
  27. camel/models/ppio_model.py +1 -16
  28. camel/models/qianfan_model.py +1 -16
  29. camel/models/qwen_model.py +1 -16
  30. camel/models/reka_model.py +1 -16
  31. camel/models/samba_model.py +0 -32
  32. camel/models/sglang_model.py +1 -16
  33. camel/models/siliconflow_model.py +1 -16
  34. camel/models/stub_model.py +0 -4
  35. camel/models/togetherai_model.py +1 -16
  36. camel/models/vllm_model.py +1 -16
  37. camel/models/volcano_model.py +0 -17
  38. camel/models/watsonx_model.py +1 -16
  39. camel/models/yi_model.py +1 -16
  40. camel/models/zhipuai_model.py +1 -16
  41. camel/toolkits/hybrid_browser_toolkit/config_loader.py +3 -0
  42. camel/toolkits/hybrid_browser_toolkit/hybrid_browser_toolkit_ts.py +225 -0
  43. camel/toolkits/hybrid_browser_toolkit/ts/src/browser-session.ts +164 -8
  44. camel/toolkits/hybrid_browser_toolkit/ts/src/config-loader.ts +2 -0
  45. camel/toolkits/hybrid_browser_toolkit/ts/src/hybrid-browser-toolkit.ts +106 -1
  46. camel/toolkits/hybrid_browser_toolkit/ts/src/types.ts +19 -1
  47. camel/toolkits/hybrid_browser_toolkit/ts/websocket-server.js +20 -0
  48. camel/toolkits/hybrid_browser_toolkit/ws_wrapper.py +41 -0
  49. camel/toolkits/hybrid_browser_toolkit_py/actions.py +158 -0
  50. camel/toolkits/hybrid_browser_toolkit_py/browser_session.py +55 -8
  51. camel/toolkits/hybrid_browser_toolkit_py/config_loader.py +43 -0
  52. camel/toolkits/hybrid_browser_toolkit_py/hybrid_browser_toolkit.py +312 -3
  53. camel/toolkits/hybrid_browser_toolkit_py/snapshot.py +10 -4
  54. camel/toolkits/hybrid_browser_toolkit_py/unified_analyzer.js +45 -4
  55. camel/toolkits/note_taking_toolkit.py +3 -4
  56. camel/toolkits/search_toolkit.py +182 -30
  57. camel/types/enums.py +9 -0
  58. camel/utils/mcp.py +2 -2
  59. camel/utils/token_counting.py +13 -2
  60. {camel_ai-0.2.74a4.dist-info → camel_ai-0.2.75a0.dist-info}/METADATA +6 -6
  61. {camel_ai-0.2.74a4.dist-info → camel_ai-0.2.75a0.dist-info}/RECORD +63 -63
  62. {camel_ai-0.2.74a4.dist-info → camel_ai-0.2.75a0.dist-info}/WHEEL +0 -0
  63. {camel_ai-0.2.74a4.dist-info → camel_ai-0.2.75a0.dist-info}/licenses/LICENSE +0 -0
@@ -13,6 +13,7 @@
13
13
  # ========= Copyright 2023-2024 @ CAMEL-AI.org. All Rights Reserved. =========
14
14
  import os
15
15
  from typing import Any, Dict, List, Literal, Optional, TypeAlias, Union, cast
16
+ from urllib.parse import quote
16
17
 
17
18
  import requests
18
19
 
@@ -516,6 +517,29 @@ class SearchToolkit(BaseToolkit):
516
517
  """
517
518
  import requests
518
519
 
520
+ # Validate input parameters
521
+ if not isinstance(start_page, int) or start_page < 1:
522
+ raise ValueError("start_page must be a positive integer")
523
+
524
+ if (
525
+ not isinstance(number_of_result_pages, int)
526
+ or number_of_result_pages < 1
527
+ ):
528
+ raise ValueError(
529
+ "number_of_result_pages must be a positive integer"
530
+ )
531
+
532
+ # Google Custom Search API has a limit of 10 results per request
533
+ if number_of_result_pages > 10:
534
+ logger.warning(
535
+ f"Google API limits results to 10 per request. "
536
+ f"Requested {number_of_result_pages}, using 10 instead."
537
+ )
538
+ number_of_result_pages = 10
539
+
540
+ if search_type not in ["web", "image"]:
541
+ raise ValueError("search_type must be either 'web' or 'image'")
542
+
519
543
  # https://developers.google.com/custom-search/v1/overview
520
544
  GOOGLE_API_KEY = os.getenv("GOOGLE_API_KEY")
521
545
  # https://cse.google.com/cse/all
@@ -535,11 +559,13 @@ class SearchToolkit(BaseToolkit):
535
559
  modified_query = f"{query} {exclusion_terms}"
536
560
  logger.debug(f"Excluded domains, modified query: {modified_query}")
537
561
 
562
+ encoded_query = quote(modified_query)
563
+
538
564
  # Constructing the URL
539
565
  # Doc: https://developers.google.com/custom-search/v1/using_rest
540
566
  base_url = (
541
567
  f"https://www.googleapis.com/customsearch/v1?"
542
- f"key={GOOGLE_API_KEY}&cx={SEARCH_ENGINE_ID}&q={modified_query}&start="
568
+ f"key={GOOGLE_API_KEY}&cx={SEARCH_ENGINE_ID}&q={encoded_query}&start="
543
569
  f"{start_page_idx}&lr={search_language}&num={number_of_result_pages}"
544
570
  )
545
571
 
@@ -552,8 +578,8 @@ class SearchToolkit(BaseToolkit):
552
578
  responses = []
553
579
  # Fetch the results given the URL
554
580
  try:
555
- # Make the get
556
- result = requests.get(url)
581
+ result = requests.get(url, timeout=30)
582
+ result.raise_for_status() # Raise exception for bad status codes
557
583
  data = result.json()
558
584
 
559
585
  # Get the result items
@@ -592,28 +618,31 @@ class SearchToolkit(BaseToolkit):
592
618
 
593
619
  responses.append(response)
594
620
  else:
595
- # Process web search results (existing logic)
596
- # Check metatags are present
597
- if "pagemap" not in search_item:
598
- continue
599
- if "metatags" not in search_item["pagemap"]:
600
- continue
621
+ title = search_item.get("title", "")
622
+ snippet = search_item.get("snippet", "")
623
+ link = search_item.get("link", "")
624
+
625
+ long_description = "N/A"
601
626
  if (
602
- "og:description"
603
- in search_item["pagemap"]["metatags"][0]
627
+ "pagemap" in search_item
628
+ and "metatags" in search_item["pagemap"]
604
629
  ):
605
- long_description = search_item["pagemap"][
606
- "metatags"
607
- ][0]["og:description"]
608
- else:
609
- long_description = "N/A"
610
- # Get the page title
611
- title = search_item.get("title")
612
- # Page snippet
613
- snippet = search_item.get("snippet")
630
+ metatags = search_item["pagemap"]["metatags"]
631
+ if metatags and len(metatags) > 0:
632
+ meta = metatags[0]
633
+ long_description = (
634
+ meta.get("og:description")
635
+ or meta.get("description")
636
+ or meta.get("twitter:description")
637
+ or "N/A"
638
+ )
639
+
640
+ if not title and not snippet and not link:
641
+ logger.debug(
642
+ f"Skipping result {i} due to missing essential fields"
643
+ )
644
+ continue
614
645
 
615
- # Extract the page url
616
- link = search_item.get("link")
617
646
  response = {
618
647
  "result_id": i,
619
648
  "title": title,
@@ -623,19 +652,74 @@ class SearchToolkit(BaseToolkit):
623
652
  }
624
653
  responses.append(response)
625
654
  else:
655
+ logger.debug(f"Google API response without items: {data}")
626
656
  error_info = data.get("error", {})
627
- logger.error(
628
- f"Google search failed - API response: {error_info}"
629
- )
657
+ if error_info:
658
+ error_code = error_info.get("code", "Unknown")
659
+ error_message = error_info.get("message", "Unknown error")
660
+ error_details = f"Error {error_code}: {error_message}"
661
+ else:
662
+ error_details = (
663
+ "No results found or API returned empty response"
664
+ )
665
+
666
+ logger.error(f"Google search failed - {error_details}")
630
667
  responses.append(
631
- {
632
- "error": f"Google search failed - "
633
- f"API response: {error_info}"
634
- }
668
+ {"error": f"Google search failed - {error_details}"}
635
669
  )
636
670
 
671
+ except requests.exceptions.Timeout:
672
+ logger.error("Google search request timed out")
673
+ responses.append(
674
+ {"error": "Google search request timed out after 30 seconds"}
675
+ )
676
+ except requests.exceptions.HTTPError as e:
677
+ error_message = f"Google API HTTP error: {e}"
678
+ try:
679
+ error_data = e.response.json()
680
+ if "error" in error_data and "message" in error_data["error"]:
681
+ api_error_message = error_data["error"]["message"]
682
+ error_code = error_data["error"].get(
683
+ "code", e.response.status_code
684
+ )
685
+ error_message = (
686
+ f"Google API error {error_code}: {api_error_message}"
687
+ )
688
+
689
+ if e.response.status_code == 429:
690
+ error_message = f"Google API rate limit exceeded: {api_error_message}"
691
+ elif e.response.status_code == 400:
692
+ if "API key" in api_error_message:
693
+ error_message = (
694
+ f"Invalid Google API key: {api_error_message}"
695
+ )
696
+ else:
697
+ error_message = f"Bad request to Google API: {api_error_message}"
698
+ except (ValueError, KeyError):
699
+ if e.response.status_code == 429:
700
+ error_message = "Google API rate limit exceeded. Please try again later."
701
+ elif e.response.status_code == 400:
702
+ error_message = "Google API bad request. Please check your API key and search engine ID."
703
+ elif e.response.status_code == 403:
704
+ error_message = "Google API access forbidden. Please check your API key permissions."
705
+
706
+ logger.error(error_message)
707
+ responses.append({"error": error_message})
708
+ except requests.exceptions.RequestException as e:
709
+ logger.error(f"Google search network error: {e}")
710
+ responses.append(
711
+ {"error": f"Network error during Google search: {e!s}"}
712
+ )
713
+ except ValueError as e:
714
+ logger.error(f"Google search response parsing error: {e}")
715
+ responses.append(
716
+ {"error": f"Failed to parse Google search response: {e!s}"}
717
+ )
637
718
  except Exception as e:
638
- responses.append({"error": f"google search failed: {e!s}"})
719
+ logger.error(f"Unexpected error during Google search: {e}")
720
+ responses.append(
721
+ {"error": f"Unexpected error during Google search: {e!s}"}
722
+ )
639
723
  return responses
640
724
 
641
725
  def tavily_search(
@@ -1233,6 +1317,73 @@ class SearchToolkit(BaseToolkit):
1233
1317
  f"search: {e!s}"
1234
1318
  }
1235
1319
 
1320
+ @api_keys_required([(None, 'METASO_API_KEY')])
1321
+ def search_metaso(
1322
+ self,
1323
+ query: str,
1324
+ page: int = 1,
1325
+ include_summary: bool = False,
1326
+ include_raw_content: bool = False,
1327
+ concise_snippet: bool = False,
1328
+ scope: Literal[
1329
+ "webpage", "document", "scholar", "image", "video", "podcast"
1330
+ ] = "webpage",
1331
+ ) -> Dict[str, Any]:
1332
+ r"""Perform a web search using the metaso.cn API.
1333
+
1334
+ Args:
1335
+ query (str): The search query string.
1336
+ page (int): Page number. (default: :obj:`1`)
1337
+ include_summary (bool): Whether to include summary in the result.
1338
+ (default: :obj:`False`)
1339
+ include_raw_content (bool): Whether to include raw content in the
1340
+ result. (default: :obj:`False`)
1341
+ concise_snippet (bool): Whether to return concise snippet.
1342
+ (default: :obj:`False`)
1343
+ scope (Literal["webpage", "document", "scholar", "image", "video",
1344
+ "podcast"]): Search scope. (default: :obj:`"webpage"`)
1345
+
1346
+ Returns:
1347
+ Dict[str, Any]: Search results or error information.
1348
+ """
1349
+ import http.client
1350
+ import json
1351
+
1352
+ # It is recommended to put the token in environment variable for
1353
+ # security
1354
+
1355
+ METASO_API_KEY = os.getenv("METASO_API_KEY")
1356
+
1357
+ conn = http.client.HTTPSConnection("metaso.cn")
1358
+ payload = json.dumps(
1359
+ {
1360
+ "q": query,
1361
+ "scope": scope,
1362
+ "includeSummary": include_summary,
1363
+ "page": str(page),
1364
+ "includeRawContent": include_raw_content,
1365
+ "conciseSnippet": concise_snippet,
1366
+ }
1367
+ )
1368
+ headers = {
1369
+ 'Authorization': f'Bearer {METASO_API_KEY}',
1370
+ 'Accept': 'application/json',
1371
+ 'Content-Type': 'application/json',
1372
+ }
1373
+ try:
1374
+ conn.request("POST", "/api/v1/search", payload, headers)
1375
+ res = conn.getresponse()
1376
+ data = res.read()
1377
+ result = data.decode("utf-8")
1378
+ try:
1379
+ return json.loads(result)
1380
+ except Exception:
1381
+ return {
1382
+ "error": f"Metaso returned content could not be parsed: {result}"
1383
+ }
1384
+ except Exception as e:
1385
+ return {"error": f"Metaso search failed: {e}"}
1386
+
1236
1387
  def get_tools(self) -> List[FunctionTool]:
1237
1388
  r"""Returns a list of FunctionTool objects representing the
1238
1389
  functions in the toolkit.
@@ -1253,4 +1404,5 @@ class SearchToolkit(BaseToolkit):
1253
1404
  FunctionTool(self.search_bing),
1254
1405
  FunctionTool(self.search_exa),
1255
1406
  FunctionTool(self.search_alibaba_tongxiao),
1407
+ FunctionTool(self.search_metaso),
1256
1408
  ]
camel/types/enums.py CHANGED
@@ -59,6 +59,7 @@ class ModelType(UnifiedModelType, Enum):
59
59
  AWS_LLAMA_3_2_11B_INSTRUCT = "us.meta.llama3-2-11b-instruct-v1:0"
60
60
  AWS_CLAUDE_SONNET_4 = "anthropic.claude-sonnet-4-20250514-v1:0"
61
61
  AWS_CLAUDE_OPUS_4 = "anthropic.claude-opus-4-20250514-v1:0"
62
+ AWS_CLAUDE_OPUS_4_1 = "anthropic.claude-opus-4-1-20250805-v1:0"
62
63
 
63
64
  GLM_4 = "glm-4"
64
65
  GLM_4V = "glm-4v"
@@ -91,6 +92,7 @@ class ModelType(UnifiedModelType, Enum):
91
92
  OPENROUTER_LLAMA_4_SCOUT = "meta-llama/llama-4-scout"
92
93
  OPENROUTER_LLAMA_4_SCOUT_FREE = "meta-llama/llama-4-scout:free"
93
94
  OPENROUTER_OLYMPICODER_7B = "open-r1/olympiccoder-7b:free"
95
+ OPENROUTER_HORIZON_ALPHA = "openrouter/horizon-alpha"
94
96
 
95
97
  # LMStudio models
96
98
  LMSTUDIO_GEMMA_3_1B = "gemma-3-1b"
@@ -157,6 +159,7 @@ class ModelType(UnifiedModelType, Enum):
157
159
  CLAUDE_3_7_SONNET = "claude-3-7-sonnet-latest"
158
160
  CLAUDE_SONNET_4 = "claude-sonnet-4-20250514"
159
161
  CLAUDE_OPUS_4 = "claude-opus-4-20250514"
162
+ CLAUDE_OPUS_4_1 = "claude-opus-4-1-20250805"
160
163
 
161
164
  # Netmind models
162
165
  NETMIND_LLAMA_4_MAVERICK_17B_128E_INSTRUCT = (
@@ -513,6 +516,7 @@ class ModelType(UnifiedModelType, Enum):
513
516
  ModelType.AWS_LLAMA_3_2_11B_INSTRUCT,
514
517
  ModelType.AWS_CLAUDE_SONNET_4,
515
518
  ModelType.AWS_CLAUDE_OPUS_4,
519
+ ModelType.AWS_CLAUDE_OPUS_4_1,
516
520
  }
517
521
 
518
522
  @property
@@ -577,6 +581,7 @@ class ModelType(UnifiedModelType, Enum):
577
581
  ModelType.CLAUDE_3_7_SONNET,
578
582
  ModelType.CLAUDE_SONNET_4,
579
583
  ModelType.CLAUDE_OPUS_4,
584
+ ModelType.CLAUDE_OPUS_4_1,
580
585
  }
581
586
 
582
587
  @property
@@ -603,6 +608,7 @@ class ModelType(UnifiedModelType, Enum):
603
608
  ModelType.OPENROUTER_LLAMA_4_SCOUT,
604
609
  ModelType.OPENROUTER_LLAMA_4_SCOUT_FREE,
605
610
  ModelType.OPENROUTER_OLYMPICODER_7B,
611
+ ModelType.OPENROUTER_HORIZON_ALPHA,
606
612
  }
607
613
 
608
614
  @property
@@ -1262,6 +1268,7 @@ class ModelType(UnifiedModelType, Enum):
1262
1268
  ModelType.CLAUDE_3_7_SONNET,
1263
1269
  ModelType.CLAUDE_SONNET_4,
1264
1270
  ModelType.CLAUDE_OPUS_4,
1271
+ ModelType.CLAUDE_OPUS_4_1,
1265
1272
  ModelType.YI_MEDIUM_200K,
1266
1273
  ModelType.AWS_CLAUDE_3_5_SONNET,
1267
1274
  ModelType.AWS_CLAUDE_3_HAIKU,
@@ -1269,6 +1276,7 @@ class ModelType(UnifiedModelType, Enum):
1269
1276
  ModelType.AWS_CLAUDE_3_7_SONNET,
1270
1277
  ModelType.AWS_CLAUDE_SONNET_4,
1271
1278
  ModelType.AWS_CLAUDE_OPUS_4,
1279
+ ModelType.AWS_CLAUDE_OPUS_4_1,
1272
1280
  ModelType.O4_MINI,
1273
1281
  ModelType.O3,
1274
1282
  }:
@@ -1276,6 +1284,7 @@ class ModelType(UnifiedModelType, Enum):
1276
1284
  elif self in {
1277
1285
  ModelType.MISTRAL_CODESTRAL_MAMBA,
1278
1286
  ModelType.OPENROUTER_LLAMA_4_MAVERICK_FREE,
1287
+ ModelType.OPENROUTER_HORIZON_ALPHA,
1279
1288
  }:
1280
1289
  return 256_000
1281
1290
 
camel/utils/mcp.py CHANGED
@@ -106,11 +106,11 @@ class MCPServer:
106
106
  """
107
107
  from mcp.server.fastmcp import FastMCP
108
108
 
109
- from camel.toolkits.base import BaseToolkit
110
-
111
109
  original_init = cls.__init__
112
110
 
113
111
  def new_init(instance, *args, **kwargs):
112
+ from camel.toolkits.base import BaseToolkit
113
+
114
114
  original_init(instance, *args, **kwargs)
115
115
  self.server_name = self.server_name or cls.__name__
116
116
  instance.mcp = FastMCP(self.server_name)
@@ -280,15 +280,26 @@ class OpenAITokenCounter(BaseTokenCounter):
280
280
 
281
281
  class AnthropicTokenCounter(BaseTokenCounter):
282
282
  @dependencies_required('anthropic')
283
- def __init__(self, model: str):
283
+ def __init__(
284
+ self,
285
+ model: str,
286
+ api_key: Optional[str] = None,
287
+ base_url: Optional[str] = None,
288
+ ):
284
289
  r"""Constructor for the token counter for Anthropic models.
285
290
 
286
291
  Args:
287
292
  model (str): The name of the Anthropic model being used.
293
+ api_key (Optional[str], optional): The API key for authenticating
294
+ with the Anthropic service. If not provided, it will use the
295
+ ANTHROPIC_API_KEY environment variable. (default: :obj:`None`)
296
+ base_url (Optional[str], optional): The URL of the Anthropic
297
+ service. If not provided, it will use the default Anthropic
298
+ URL. (default: :obj:`None`)
288
299
  """
289
300
  from anthropic import Anthropic
290
301
 
291
- self.client = Anthropic()
302
+ self.client = Anthropic(api_key=api_key, base_url=base_url)
292
303
  self.model = model
293
304
 
294
305
  @dependencies_required('anthropic')
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: camel-ai
3
- Version: 0.2.74a4
3
+ Version: 0.2.75a0
4
4
  Summary: Communicative Agents for AI Society Study
5
5
  Project-URL: Homepage, https://www.camel-ai.org/
6
6
  Project-URL: Repository, https://github.com/camel-ai/camel
@@ -32,7 +32,7 @@ Requires-Dist: azure-storage-blob<13,>=12.21.0; extra == 'all'
32
32
  Requires-Dist: beautifulsoup4<5,>=4; extra == 'all'
33
33
  Requires-Dist: botocore<2,>=1.35.3; extra == 'all'
34
34
  Requires-Dist: chromadb<1.0.0,>=0.6.0; extra == 'all'
35
- Requires-Dist: chunkr-ai>=0.0.50; extra == 'all'
35
+ Requires-Dist: chunkr-ai<0.1.0,>=0.0.50; extra == 'all'
36
36
  Requires-Dist: cohere<6,>=5.11.0; extra == 'all'
37
37
  Requires-Dist: crawl4ai>=0.4.0; extra == 'all'
38
38
  Requires-Dist: dappier<0.4,>=0.3.3; extra == 'all'
@@ -206,7 +206,7 @@ Requires-Dist: sphinx<8,>=7; extra == 'docs'
206
206
  Requires-Dist: sphinxext-rediraffe<0.3,>=0.2.7; extra == 'docs'
207
207
  Provides-Extra: document-tools
208
208
  Requires-Dist: beautifulsoup4<5,>=4; extra == 'document-tools'
209
- Requires-Dist: chunkr-ai>=0.0.50; extra == 'document-tools'
209
+ Requires-Dist: chunkr-ai<0.1.0,>=0.0.50; extra == 'document-tools'
210
210
  Requires-Dist: crawl4ai>=0.3.745; extra == 'document-tools'
211
211
  Requires-Dist: docx2txt<0.9,>=0.8; extra == 'document-tools'
212
212
  Requires-Dist: docx>=0.2.4; extra == 'document-tools'
@@ -227,8 +227,8 @@ Requires-Dist: xls2xlsx>=0.2.0; extra == 'document-tools'
227
227
  Provides-Extra: eigent
228
228
  Requires-Dist: aci-sdk>=1.0.0b1; extra == 'eigent'
229
229
  Requires-Dist: anthropic<0.50.0,>=0.47.0; extra == 'eigent'
230
+ Requires-Dist: chunkr-ai<0.1.0,>=0.0.50; extra == 'eigent'
230
231
  Requires-Dist: chunkr-ai>=0.0.41; extra == 'eigent'
231
- Requires-Dist: chunkr-ai>=0.0.50; extra == 'eigent'
232
232
  Requires-Dist: crawl4ai>=0.3.745; extra == 'eigent'
233
233
  Requires-Dist: datasets<4,>=3; extra == 'eigent'
234
234
  Requires-Dist: docx>=0.2.4; extra == 'eigent'
@@ -286,8 +286,8 @@ Provides-Extra: owl
286
286
  Requires-Dist: aci-sdk>=1.0.0b1; extra == 'owl'
287
287
  Requires-Dist: anthropic<0.50.0,>=0.47.0; extra == 'owl'
288
288
  Requires-Dist: beautifulsoup4<5,>=4; extra == 'owl'
289
+ Requires-Dist: chunkr-ai<0.1.0,>=0.0.50; extra == 'owl'
289
290
  Requires-Dist: chunkr-ai>=0.0.41; extra == 'owl'
290
- Requires-Dist: chunkr-ai>=0.0.50; extra == 'owl'
291
291
  Requires-Dist: crawl4ai>=0.3.745; extra == 'owl'
292
292
  Requires-Dist: datasets<4,>=3; extra == 'owl'
293
293
  Requires-Dist: docx2txt<0.9,>=0.8; extra == 'owl'
@@ -335,7 +335,7 @@ Requires-Dist: xls2xlsx>=0.2.0; extra == 'owl'
335
335
  Requires-Dist: yt-dlp<2025,>=2024.11.4; extra == 'owl'
336
336
  Provides-Extra: rag
337
337
  Requires-Dist: chromadb<1.0.0,>=0.6.0; extra == 'rag'
338
- Requires-Dist: chunkr-ai>=0.0.50; extra == 'rag'
338
+ Requires-Dist: chunkr-ai<0.1.0,>=0.0.50; extra == 'rag'
339
339
  Requires-Dist: cohere<6,>=5.11.0; extra == 'rag'
340
340
  Requires-Dist: crawl4ai>=0.3.745; extra == 'rag'
341
341
  Requires-Dist: faiss-cpu<2,>=1.7.2; extra == 'rag'