camel-ai 0.2.72a10__py3-none-any.whl → 0.2.73__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 (52) hide show
  1. camel/__init__.py +1 -1
  2. camel/agents/chat_agent.py +140 -345
  3. camel/memories/agent_memories.py +18 -17
  4. camel/societies/__init__.py +2 -0
  5. camel/societies/workforce/prompts.py +36 -10
  6. camel/societies/workforce/single_agent_worker.py +7 -5
  7. camel/societies/workforce/workforce.py +6 -4
  8. camel/storages/key_value_storages/mem0_cloud.py +48 -47
  9. camel/storages/vectordb_storages/__init__.py +1 -0
  10. camel/storages/vectordb_storages/surreal.py +100 -150
  11. camel/toolkits/__init__.py +6 -1
  12. camel/toolkits/base.py +60 -2
  13. camel/toolkits/excel_toolkit.py +153 -64
  14. camel/toolkits/file_write_toolkit.py +67 -0
  15. camel/toolkits/hybrid_browser_toolkit/config_loader.py +136 -413
  16. camel/toolkits/hybrid_browser_toolkit/hybrid_browser_toolkit.py +131 -1966
  17. camel/toolkits/hybrid_browser_toolkit/hybrid_browser_toolkit_ts.py +1177 -0
  18. camel/toolkits/hybrid_browser_toolkit/ts/package-lock.json +4356 -0
  19. camel/toolkits/hybrid_browser_toolkit/ts/package.json +33 -0
  20. camel/toolkits/hybrid_browser_toolkit/ts/src/browser-scripts.js +125 -0
  21. camel/toolkits/hybrid_browser_toolkit/ts/src/browser-session.ts +945 -0
  22. camel/toolkits/hybrid_browser_toolkit/ts/src/config-loader.ts +226 -0
  23. camel/toolkits/hybrid_browser_toolkit/ts/src/hybrid-browser-toolkit.ts +522 -0
  24. camel/toolkits/hybrid_browser_toolkit/ts/src/index.ts +7 -0
  25. camel/toolkits/hybrid_browser_toolkit/ts/src/types.ts +110 -0
  26. camel/toolkits/hybrid_browser_toolkit/ts/tsconfig.json +26 -0
  27. camel/toolkits/hybrid_browser_toolkit/ts/websocket-server.js +254 -0
  28. camel/toolkits/hybrid_browser_toolkit/ws_wrapper.py +582 -0
  29. camel/toolkits/hybrid_browser_toolkit_py/__init__.py +17 -0
  30. camel/toolkits/hybrid_browser_toolkit_py/config_loader.py +447 -0
  31. camel/toolkits/hybrid_browser_toolkit_py/hybrid_browser_toolkit.py +2077 -0
  32. camel/toolkits/mcp_toolkit.py +341 -46
  33. camel/toolkits/message_integration.py +719 -0
  34. camel/toolkits/notion_mcp_toolkit.py +234 -0
  35. camel/toolkits/screenshot_toolkit.py +116 -31
  36. camel/toolkits/search_toolkit.py +20 -2
  37. camel/toolkits/slack_toolkit.py +43 -48
  38. camel/toolkits/terminal_toolkit.py +288 -46
  39. camel/toolkits/video_analysis_toolkit.py +13 -13
  40. camel/toolkits/video_download_toolkit.py +11 -11
  41. camel/toolkits/web_deploy_toolkit.py +207 -12
  42. camel/types/enums.py +6 -0
  43. {camel_ai-0.2.72a10.dist-info → camel_ai-0.2.73.dist-info}/METADATA +49 -9
  44. {camel_ai-0.2.72a10.dist-info → camel_ai-0.2.73.dist-info}/RECORD +52 -35
  45. /camel/toolkits/{hybrid_browser_toolkit → hybrid_browser_toolkit_py}/actions.py +0 -0
  46. /camel/toolkits/{hybrid_browser_toolkit → hybrid_browser_toolkit_py}/agent.py +0 -0
  47. /camel/toolkits/{hybrid_browser_toolkit → hybrid_browser_toolkit_py}/browser_session.py +0 -0
  48. /camel/toolkits/{hybrid_browser_toolkit → hybrid_browser_toolkit_py}/snapshot.py +0 -0
  49. /camel/toolkits/{hybrid_browser_toolkit → hybrid_browser_toolkit_py}/stealth_script.js +0 -0
  50. /camel/toolkits/{hybrid_browser_toolkit → hybrid_browser_toolkit_py}/unified_analyzer.js +0 -0
  51. {camel_ai-0.2.72a10.dist-info → camel_ai-0.2.73.dist-info}/WHEEL +0 -0
  52. {camel_ai-0.2.72a10.dist-info → camel_ai-0.2.73.dist-info}/licenses/LICENSE +0 -0
@@ -79,7 +79,9 @@ class WebDeployToolkit(BaseToolkit):
79
79
  self.tag_text = self._sanitize_text(tag_text)
80
80
  self.tag_url = self._validate_url(tag_url)
81
81
  self.remote_server_ip = (
82
- self._validate_ip(remote_server_ip) if remote_server_ip else None
82
+ self._validate_ip_or_domain(remote_server_ip)
83
+ if remote_server_ip
84
+ else None
83
85
  )
84
86
  self.remote_server_port = self._validate_port(remote_server_port)
85
87
  self.server_registry_file = os.path.join(
@@ -87,24 +89,36 @@ class WebDeployToolkit(BaseToolkit):
87
89
  )
88
90
  self._load_server_registry()
89
91
 
90
- def _validate_ip(self, ip: str) -> str:
91
- """Validate IP address format."""
92
+ def _validate_ip_or_domain(self, address: str) -> str:
93
+ r"""Validate IP address or domain name format."""
92
94
  import ipaddress
95
+ import re
93
96
 
94
97
  try:
95
- ipaddress.ip_address(ip)
96
- return ip
98
+ # Try to validate as IP address first
99
+ ipaddress.ip_address(address)
100
+ return address
97
101
  except ValueError:
98
- raise ValueError(f"Invalid IP address: {ip}")
102
+ # If not a valid IP, check if it's a valid domain name
103
+ domain_pattern = re.compile(
104
+ r'^[a-zA-Z0-9]([a-zA-Z0-9\-]{0,61}[a-zA-Z0-9])?'
105
+ r'(\.[a-zA-Z0-9]([a-zA-Z0-9\-]{0,61}[a-zA-Z0-9])?)*$'
106
+ )
107
+ if domain_pattern.match(address) and len(address) <= 253:
108
+ return address
109
+ else:
110
+ raise ValueError(
111
+ f"Invalid IP address or domain name: {address}"
112
+ )
99
113
 
100
114
  def _validate_port(self, port: int) -> int:
101
- """Validate port number."""
115
+ r"""Validate port number."""
102
116
  if not isinstance(port, int) or port < 1 or port > 65535:
103
117
  raise ValueError(f"Invalid port number: {port}")
104
118
  return port
105
119
 
106
120
  def _sanitize_text(self, text: str) -> str:
107
- """Sanitize text to prevent XSS."""
121
+ r"""Sanitize text to prevent XSS."""
108
122
  if not isinstance(text, str):
109
123
  return ""
110
124
  # Remove any HTML/script tags
@@ -119,7 +133,7 @@ class WebDeployToolkit(BaseToolkit):
119
133
  return text[:100] # Limit length
120
134
 
121
135
  def _validate_url(self, url: str) -> str:
122
- """Validate URL format."""
136
+ r"""Validate URL format."""
123
137
  if not isinstance(url, str):
124
138
  raise ValueError("URL must be a string")
125
139
  # Basic URL validation
@@ -139,7 +153,7 @@ class WebDeployToolkit(BaseToolkit):
139
153
  def _validate_subdirectory(
140
154
  self, subdirectory: Optional[str]
141
155
  ) -> Optional[str]:
142
- """Validate subdirectory to prevent path traversal."""
156
+ r"""Validate subdirectory to prevent path traversal."""
143
157
  if subdirectory is None:
144
158
  return None
145
159
 
@@ -157,7 +171,7 @@ class WebDeployToolkit(BaseToolkit):
157
171
  return subdirectory
158
172
 
159
173
  def _is_port_available(self, port: int) -> bool:
160
- """Check if a port is available for binding."""
174
+ r"""Check if a port is available for binding."""
161
175
  with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as sock:
162
176
  try:
163
177
  sock.bind(('127.0.0.1', port))
@@ -604,7 +618,7 @@ class WebDeployToolkit(BaseToolkit):
604
618
  return {
605
619
  'success': False,
606
620
  'error': (
607
- f'Port {port} is already in use by ' f'another process'
621
+ f'Port {port} is already in use by another process'
608
622
  ),
609
623
  }
610
624
 
@@ -702,6 +716,44 @@ class WebDeployToolkit(BaseToolkit):
702
716
  # Validate subdirectory
703
717
  subdirectory = self._validate_subdirectory(subdirectory)
704
718
 
719
+ # Check if remote deployment is configured
720
+ if self.remote_server_ip:
721
+ return self._deploy_folder_to_remote_server(
722
+ folder_path,
723
+ subdirectory,
724
+ domain,
725
+ )
726
+ else:
727
+ return self._deploy_folder_to_local_server(
728
+ folder_path,
729
+ port,
730
+ domain,
731
+ subdirectory,
732
+ )
733
+
734
+ except Exception as e:
735
+ logger.error(f"Error deploying folder: {e}")
736
+ return {'success': False, 'error': str(e)}
737
+
738
+ def _deploy_folder_to_local_server(
739
+ self,
740
+ folder_path: str,
741
+ port: int,
742
+ domain: Optional[str],
743
+ subdirectory: Optional[str],
744
+ ) -> Dict[str, Any]:
745
+ r"""Deploy folder to local server (original functionality).
746
+
747
+ Args:
748
+ folder_path (str): Path to the folder to deploy
749
+ port (int): Port to serve on
750
+ domain (Optional[str]): Custom domain
751
+ subdirectory (Optional[str]): Subdirectory path
752
+
753
+ Returns:
754
+ Dict[str, Any]: Deployment result
755
+ """
756
+ try:
705
757
  temp_dir = None
706
758
  if self.add_branding_tag:
707
759
  # Create temporary directory and copy all files
@@ -877,6 +929,149 @@ class WebDeployToolkit(BaseToolkit):
877
929
  logger.error(f"Error deploying folder: {e}")
878
930
  return {'success': False, 'error': str(e)}
879
931
 
932
+ def _deploy_folder_to_remote_server(
933
+ self,
934
+ folder_path: str,
935
+ subdirectory: Optional[str] = None,
936
+ domain: Optional[str] = None,
937
+ ) -> Dict[str, Any]:
938
+ r"""Deploy folder to remote server via API.
939
+
940
+ Args:
941
+ folder_path (str): Path to the folder to deploy
942
+ subdirectory (Optional[str]): Subdirectory path for deployment
943
+ domain (Optional[str]): Custom domain
944
+
945
+ Returns:
946
+ Dict[str, Any]: Deployment result
947
+ """
948
+ try:
949
+ import tempfile
950
+ import zipfile
951
+
952
+ import requests
953
+
954
+ # Validate subdirectory
955
+ subdirectory = self._validate_subdirectory(subdirectory)
956
+
957
+ # Create a temporary zip file of the folder
958
+ with tempfile.NamedTemporaryFile(
959
+ suffix='.zip', delete=False
960
+ ) as temp_zip:
961
+ zip_path = temp_zip.name
962
+
963
+ try:
964
+ # Create zip archive
965
+ with zipfile.ZipFile(
966
+ zip_path, 'w', zipfile.ZIP_DEFLATED
967
+ ) as zipf:
968
+ for root, _, files in os.walk(folder_path):
969
+ for file in files:
970
+ file_path = os.path.join(root, file)
971
+ # Calculate relative path within the archive
972
+ arcname = os.path.relpath(file_path, folder_path)
973
+ zipf.write(file_path, arcname)
974
+
975
+ # Read zip file as base64
976
+ with open(zip_path, 'rb') as f:
977
+ zip_data = base64.b64encode(f.read()).decode('utf-8')
978
+
979
+ # Prepare deployment data
980
+ deploy_data = {
981
+ "deployment_type": "folder",
982
+ "folder_data": zip_data,
983
+ "subdirectory": subdirectory,
984
+ "domain": domain,
985
+ "timestamp": time.time(),
986
+ }
987
+
988
+ # Add logo data if custom logo is specified
989
+ if self.logo_path and os.path.exists(self.logo_path):
990
+ try:
991
+ logo_ext = os.path.splitext(self.logo_path)[1]
992
+ logo_filename = f"custom_logo{logo_ext}"
993
+
994
+ with open(self.logo_path, 'rb') as logo_file:
995
+ logo_data = base64.b64encode(
996
+ logo_file.read()
997
+ ).decode('utf-8')
998
+
999
+ deploy_data.update(
1000
+ {
1001
+ "logo_data": logo_data,
1002
+ "logo_ext": logo_ext,
1003
+ "logo_filename": logo_filename,
1004
+ }
1005
+ )
1006
+ except Exception as logo_error:
1007
+ logger.warning(
1008
+ f"Failed to process custom logo: {logo_error}"
1009
+ )
1010
+
1011
+ # Send to remote server API
1012
+ api_url = f"http://{self.remote_server_ip}:{self.remote_server_port}/api/deploy"
1013
+
1014
+ response = requests.post(
1015
+ api_url,
1016
+ json=deploy_data,
1017
+ timeout=self.timeout
1018
+ or 60, # Extended timeout for folder uploads
1019
+ allow_redirects=False,
1020
+ headers={'Content-Type': 'application/json'},
1021
+ )
1022
+
1023
+ if response.status_code == 200:
1024
+ result = response.json()
1025
+
1026
+ # Build URLs
1027
+ base_url = f"http://{self.remote_server_ip}:{self.remote_server_port}"
1028
+ deployed_url = (
1029
+ f"{base_url}/{subdirectory}/"
1030
+ if subdirectory
1031
+ else base_url
1032
+ )
1033
+
1034
+ return {
1035
+ 'success': True,
1036
+ 'remote_url': deployed_url,
1037
+ 'server_ip': self.remote_server_ip,
1038
+ 'subdirectory': subdirectory,
1039
+ 'domain': domain,
1040
+ 'message': (
1041
+ f'Successfully deployed folder to remote server!\n'
1042
+ f' • Access URL: {deployed_url}\n'
1043
+ f' • Server: '
1044
+ f'{self.remote_server_ip}:{self.remote_server_port}'
1045
+ ),
1046
+ 'branding_tag_added': self.add_branding_tag,
1047
+ 'logo_processed': result.get('logo_processed', False),
1048
+ }
1049
+ else:
1050
+ return {
1051
+ 'success': False,
1052
+ 'error': (
1053
+ f'Remote folder deployment failed: '
1054
+ f'HTTP {response.status_code}'
1055
+ ),
1056
+ }
1057
+
1058
+ finally:
1059
+ # Clean up temporary zip file
1060
+ if os.path.exists(zip_path):
1061
+ os.unlink(zip_path)
1062
+
1063
+ except ImportError:
1064
+ return {
1065
+ 'success': False,
1066
+ 'error': 'Remote deployment requires requests library. '
1067
+ 'Install with: pip install requests',
1068
+ }
1069
+ except Exception as e:
1070
+ return {
1071
+ 'success': False,
1072
+ 'error': f'Remote folder deployment error: {e!s}',
1073
+ }
1074
+
880
1075
  def stop_server(self, port: int) -> Dict[str, Any]:
881
1076
  r"""Stop a running server on the specified port.
882
1077
 
camel/types/enums.py CHANGED
@@ -245,6 +245,7 @@ class ModelType(UnifiedModelType, Enum):
245
245
  QWEN_QWQ_32B = "qwq-32b-preview"
246
246
  QWEN_QVQ_72B = "qvq-72b-preview"
247
247
  QWEN_QWQ_PLUS = "qwq-plus"
248
+ QWEN_3_CODER_PLUS = "qwen3-coder-plus"
248
249
 
249
250
  # Yi models (01-ai)
250
251
  YI_LIGHTNING = "yi-lightning"
@@ -763,6 +764,7 @@ class ModelType(UnifiedModelType, Enum):
763
764
  ModelType.QWEN_PLUS_2025_04_28,
764
765
  ModelType.QWEN_TURBO_LATEST,
765
766
  ModelType.QWEN_TURBO_2025_04_28,
767
+ ModelType.QWEN_3_CODER_PLUS,
766
768
  }
767
769
 
768
770
  @property
@@ -1306,6 +1308,10 @@ class ModelType(UnifiedModelType, Enum):
1306
1308
  ModelType.NOVITA_LLAMA_4_MAVERICK_17B,
1307
1309
  }:
1308
1310
  return 1_048_576
1311
+ elif self in {
1312
+ ModelType.QWEN_3_CODER_PLUS,
1313
+ }:
1314
+ return 1_000_000
1309
1315
  elif self in {
1310
1316
  ModelType.QWEN_LONG,
1311
1317
  ModelType.TOGETHER_LLAMA_4_SCOUT,
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: camel-ai
3
- Version: 0.2.72a10
3
+ Version: 0.2.73
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
@@ -69,7 +69,7 @@ Requires-Dist: jupyter-client<9,>=8.6.2; extra == 'all'
69
69
  Requires-Dist: langfuse>=2.60.5; extra == 'all'
70
70
  Requires-Dist: linkup-sdk<0.3,>=0.2.1; extra == 'all'
71
71
  Requires-Dist: litellm<2,>=1.38.1; extra == 'all'
72
- Requires-Dist: markitdown==0.1.1; extra == 'all'
72
+ Requires-Dist: markitdown>=0.1.1; extra == 'all'
73
73
  Requires-Dist: math-verify<0.8,>=0.7.0; extra == 'all'
74
74
  Requires-Dist: mcp>=1.3.0; extra == 'all'
75
75
  Requires-Dist: mem0ai>=0.1.67; extra == 'all'
@@ -79,9 +79,9 @@ Requires-Dist: mypy<2,>=1.5.1; extra == 'all'
79
79
  Requires-Dist: nebula3-python==3.8.2; extra == 'all'
80
80
  Requires-Dist: neo4j<6,>=5.18.0; extra == 'all'
81
81
  Requires-Dist: networkx<4,>=3.4.2; extra == 'all'
82
- Requires-Dist: newspaper3k<0.3,>=0.2.8; extra == 'all'
83
82
  Requires-Dist: notion-client<3,>=2.2.1; extra == 'all'
84
83
  Requires-Dist: numpy<=2.2,>=1.2; extra == 'all'
84
+ Requires-Dist: onnxruntime<=1.19.2; extra == 'all'
85
85
  Requires-Dist: openapi-spec-validator<0.8,>=0.7.1; extra == 'all'
86
86
  Requires-Dist: openpyxl>=3.1.5; extra == 'all'
87
87
  Requires-Dist: pandas<2,>=1.5.3; extra == 'all'
@@ -123,11 +123,12 @@ Requires-Dist: slack-bolt<2,>=1.20.1; extra == 'all'
123
123
  Requires-Dist: slack-sdk<4,>=3.27.2; extra == 'all'
124
124
  Requires-Dist: soundfile<0.14,>=0.13; extra == 'all'
125
125
  Requires-Dist: stripe<12,>=11.3.0; extra == 'all'
126
+ Requires-Dist: surrealdb>=1.0.6; extra == 'all'
126
127
  Requires-Dist: sympy<2,>=1.13.3; extra == 'all'
127
128
  Requires-Dist: tabulate>=0.9.0; extra == 'all'
128
129
  Requires-Dist: tavily-python<0.6,>=0.5.0; extra == 'all'
129
130
  Requires-Dist: textblob<0.18,>=0.17.1; extra == 'all'
130
- Requires-Dist: traceroot==0.0.4a4; extra == 'all'
131
+ Requires-Dist: traceroot==0.0.4a5; extra == 'all'
131
132
  Requires-Dist: transformers<5,>=4; extra == 'all'
132
133
  Requires-Dist: tree-sitter-python<0.24,>=0.23.6; extra == 'all'
133
134
  Requires-Dist: tree-sitter<0.24,>=0.23.2; extra == 'all'
@@ -140,6 +141,7 @@ Requires-Dist: types-setuptools<70,>=69.2.0; extra == 'all'
140
141
  Requires-Dist: types-tqdm<5,>=4.66.0; extra == 'all'
141
142
  Requires-Dist: unstructured==0.16.20; extra == 'all'
142
143
  Requires-Dist: weaviate-client>=4.15.0; extra == 'all'
144
+ Requires-Dist: websockets<15.1,>=13.0; extra == 'all'
143
145
  Requires-Dist: wikipedia<2,>=1; extra == 'all'
144
146
  Requires-Dist: wolframalpha<6,>=5.0.0; extra == 'all'
145
147
  Requires-Dist: xls2xlsx>=0.2.0; extra == 'all'
@@ -191,7 +193,7 @@ Requires-Dist: ipykernel<7,>=6.0.0; extra == 'dev-tools'
191
193
  Requires-Dist: jupyter-client<9,>=8.6.2; extra == 'dev-tools'
192
194
  Requires-Dist: langfuse>=2.60.5; extra == 'dev-tools'
193
195
  Requires-Dist: mcp>=1.3.0; extra == 'dev-tools'
194
- Requires-Dist: traceroot==0.0.4a4; extra == 'dev-tools'
196
+ Requires-Dist: traceroot==0.0.4a5; extra == 'dev-tools'
195
197
  Requires-Dist: tree-sitter-python<0.24,>=0.23.6; extra == 'dev-tools'
196
198
  Requires-Dist: tree-sitter<0.24,>=0.23.2; extra == 'dev-tools'
197
199
  Requires-Dist: typer>=0.15.2; extra == 'dev-tools'
@@ -208,8 +210,9 @@ Requires-Dist: chunkr-ai>=0.0.50; extra == 'document-tools'
208
210
  Requires-Dist: crawl4ai>=0.3.745; extra == 'document-tools'
209
211
  Requires-Dist: docx2txt<0.9,>=0.8; extra == 'document-tools'
210
212
  Requires-Dist: docx>=0.2.4; extra == 'document-tools'
211
- Requires-Dist: markitdown==0.1.1; extra == 'document-tools'
213
+ Requires-Dist: markitdown>=0.1.1; extra == 'document-tools'
212
214
  Requires-Dist: numpy<=2.2,>=1.2; extra == 'document-tools'
215
+ Requires-Dist: onnxruntime<=1.19.2; extra == 'document-tools'
213
216
  Requires-Dist: openapi-spec-validator<0.8,>=0.7.1; extra == 'document-tools'
214
217
  Requires-Dist: openpyxl>=3.1.5; extra == 'document-tools'
215
218
  Requires-Dist: pandasai<3,>=2.3.0; extra == 'document-tools'
@@ -221,6 +224,41 @@ Requires-Dist: reportlab>=4.4.2; extra == 'document-tools'
221
224
  Requires-Dist: tabulate>=0.9.0; extra == 'document-tools'
222
225
  Requires-Dist: unstructured==0.16.20; extra == 'document-tools'
223
226
  Requires-Dist: xls2xlsx>=0.2.0; extra == 'document-tools'
227
+ Provides-Extra: eigent
228
+ Requires-Dist: aci-sdk>=1.0.0b1; extra == 'eigent'
229
+ Requires-Dist: anthropic<0.50.0,>=0.47.0; extra == 'eigent'
230
+ Requires-Dist: chunkr-ai>=0.0.41; extra == 'eigent'
231
+ Requires-Dist: chunkr-ai>=0.0.50; extra == 'eigent'
232
+ Requires-Dist: crawl4ai>=0.3.745; extra == 'eigent'
233
+ Requires-Dist: datasets<4,>=3; extra == 'eigent'
234
+ Requires-Dist: docx>=0.2.4; extra == 'eigent'
235
+ Requires-Dist: duckduckgo-search<7,>=6.3.5; extra == 'eigent'
236
+ Requires-Dist: exa-py<2,>=1.10.0; extra == 'eigent'
237
+ Requires-Dist: ffmpeg-python<0.3,>=0.2.0; extra == 'eigent'
238
+ Requires-Dist: html2text>=2024.2.26; extra == 'eigent'
239
+ Requires-Dist: imageio[pyav]<3,>=2.34.2; extra == 'eigent'
240
+ Requires-Dist: markitdown>=0.1.1; extra == 'eigent'
241
+ Requires-Dist: mcp-server-fetch==2025.1.17; extra == 'eigent'
242
+ Requires-Dist: mcp-simple-arxiv==0.2.2; extra == 'eigent'
243
+ Requires-Dist: numpy<=2.2,>=1.2; extra == 'eigent'
244
+ Requires-Dist: onnxruntime<=1.19.2; extra == 'eigent'
245
+ Requires-Dist: openpyxl>=3.1.5; extra == 'eigent'
246
+ Requires-Dist: pandas<2,>=1.5.3; extra == 'eigent'
247
+ Requires-Dist: playwright>=1.50.0; extra == 'eigent'
248
+ Requires-Dist: pyautogui<0.10,>=0.9.54; extra == 'eigent'
249
+ Requires-Dist: pydub<0.26,>=0.25.1; extra == 'eigent'
250
+ Requires-Dist: pylatex>=1.4.2; extra == 'eigent'
251
+ Requires-Dist: pytesseract>=0.3.13; extra == 'eigent'
252
+ Requires-Dist: python-dotenv<2,>=1.0.0; extra == 'eigent'
253
+ Requires-Dist: python-pptx>=1.0.2; extra == 'eigent'
254
+ Requires-Dist: reportlab>=4.4.2; extra == 'eigent'
255
+ Requires-Dist: requests-oauthlib<2,>=1.3.1; extra == 'eigent'
256
+ Requires-Dist: scenedetect>=0.6.5.2; extra == 'eigent'
257
+ Requires-Dist: tabulate>=0.9.0; extra == 'eigent'
258
+ Requires-Dist: websockets<15.1,>=13.0; extra == 'eigent'
259
+ Requires-Dist: wikipedia<2,>=1; extra == 'eigent'
260
+ Requires-Dist: xls2xlsx>=0.2.0; extra == 'eigent'
261
+ Requires-Dist: yt-dlp<2025,>=2024.11.4; extra == 'eigent'
224
262
  Provides-Extra: huggingface
225
263
  Requires-Dist: datasets<4,>=3; extra == 'huggingface'
226
264
  Requires-Dist: diffusers<0.26,>=0.25.0; extra == 'huggingface'
@@ -259,11 +297,11 @@ Requires-Dist: exa-py<2,>=1.10.0; extra == 'owl'
259
297
  Requires-Dist: ffmpeg-python<0.3,>=0.2.0; extra == 'owl'
260
298
  Requires-Dist: html2text>=2024.2.26; extra == 'owl'
261
299
  Requires-Dist: imageio[pyav]<3,>=2.34.2; extra == 'owl'
262
- Requires-Dist: markitdown==0.1.1; extra == 'owl'
300
+ Requires-Dist: markitdown>=0.1.1; extra == 'owl'
263
301
  Requires-Dist: mcp-server-fetch==2025.1.17; extra == 'owl'
264
302
  Requires-Dist: mcp-simple-arxiv==0.2.2; extra == 'owl'
265
- Requires-Dist: newspaper3k<0.3,>=0.2.8; extra == 'owl'
266
303
  Requires-Dist: numpy<=2.2,>=1.2; extra == 'owl'
304
+ Requires-Dist: onnxruntime<=1.19.2; extra == 'owl'
267
305
  Requires-Dist: openapi-spec-validator<0.8,>=0.7.1; extra == 'owl'
268
306
  Requires-Dist: openpyxl>=3.1.5; extra == 'owl'
269
307
  Requires-Dist: pandas<2,>=1.5.3; extra == 'owl'
@@ -290,6 +328,7 @@ Requires-Dist: tree-sitter-python<0.24,>=0.23.6; extra == 'owl'
290
328
  Requires-Dist: tree-sitter<0.24,>=0.23.2; extra == 'owl'
291
329
  Requires-Dist: typer>=0.15.2; extra == 'owl'
292
330
  Requires-Dist: unstructured==0.16.20; extra == 'owl'
331
+ Requires-Dist: websockets<15.1,>=13.0; extra == 'owl'
293
332
  Requires-Dist: wikipedia<2,>=1; extra == 'owl'
294
333
  Requires-Dist: xls2xlsx>=0.2.0; extra == 'owl'
295
334
  Requires-Dist: yt-dlp<2025,>=2024.11.4; extra == 'owl'
@@ -331,6 +370,7 @@ Requires-Dist: pyobvector>=0.1.18; extra == 'storage'
331
370
  Requires-Dist: pytidb-experimental==0.0.1.dev4; extra == 'storage'
332
371
  Requires-Dist: qdrant-client<2,>=1.9.0; extra == 'storage'
333
372
  Requires-Dist: redis<6,>=5.0.6; extra == 'storage'
373
+ Requires-Dist: surrealdb>=1.0.6; extra == 'storage'
334
374
  Requires-Dist: weaviate-client>=4.15.0; extra == 'storage'
335
375
  Provides-Extra: web-tools
336
376
  Requires-Dist: apify-client<2,>=1.8.1; extra == 'web-tools'
@@ -346,13 +386,13 @@ Requires-Dist: google-auth-oauthlib==1.2.1; extra == 'web-tools'
346
386
  Requires-Dist: googlemaps<5,>=4.10.0; extra == 'web-tools'
347
387
  Requires-Dist: html2text>=2024.2.26; extra == 'web-tools'
348
388
  Requires-Dist: linkup-sdk<0.3,>=0.2.1; extra == 'web-tools'
349
- Requires-Dist: newspaper3k<0.3,>=0.2.8; extra == 'web-tools'
350
389
  Requires-Dist: playwright>=1.50.0; extra == 'web-tools'
351
390
  Requires-Dist: pyowm<4,>=3.3.0; extra == 'web-tools'
352
391
  Requires-Dist: requests-oauthlib<2,>=1.3.1; extra == 'web-tools'
353
392
  Requires-Dist: scrapegraph-py<2,>=1.12.0; extra == 'web-tools'
354
393
  Requires-Dist: sympy<2,>=1.13.3; extra == 'web-tools'
355
394
  Requires-Dist: tavily-python<0.6,>=0.5.0; extra == 'web-tools'
395
+ Requires-Dist: websockets<15.1,>=13.0; extra == 'web-tools'
356
396
  Requires-Dist: wikipedia<2,>=1; extra == 'web-tools'
357
397
  Requires-Dist: wolframalpha<6,>=5.0.0; extra == 'web-tools'
358
398
  Description-Content-Type: text/markdown