camel-ai 0.2.59__py3-none-any.whl → 0.2.82__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 (506) hide show
  1. camel/__init__.py +3 -3
  2. camel/agents/__init__.py +2 -2
  3. camel/agents/_types.py +9 -4
  4. camel/agents/_utils.py +40 -2
  5. camel/agents/base.py +2 -2
  6. camel/agents/chat_agent.py +5012 -902
  7. camel/agents/critic_agent.py +2 -2
  8. camel/agents/deductive_reasoner_agent.py +56 -56
  9. camel/agents/embodied_agent.py +2 -2
  10. camel/agents/knowledge_graph_agent.py +20 -20
  11. camel/agents/mcp_agent.py +39 -36
  12. camel/agents/multi_hop_generator_agent.py +3 -3
  13. camel/agents/programmed_agent_instruction.py +2 -2
  14. camel/agents/repo_agent.py +4 -3
  15. camel/agents/role_assignment_agent.py +2 -2
  16. camel/agents/search_agent.py +2 -2
  17. camel/agents/task_agent.py +2 -2
  18. camel/agents/tool_agents/__init__.py +2 -2
  19. camel/agents/tool_agents/base.py +2 -2
  20. camel/agents/tool_agents/hugging_face_tool_agent.py +3 -3
  21. camel/benchmarks/__init__.py +2 -2
  22. camel/benchmarks/apibank.py +5 -5
  23. camel/benchmarks/apibench.py +2 -2
  24. camel/benchmarks/base.py +2 -2
  25. camel/benchmarks/browsecomp.py +44 -33
  26. camel/benchmarks/gaia.py +17 -13
  27. camel/benchmarks/mock_website/README.md +94 -0
  28. camel/benchmarks/mock_website/mock_web.py +299 -0
  29. camel/benchmarks/mock_website/requirements.txt +3 -0
  30. camel/benchmarks/mock_website/shopping_mall/app.py +465 -0
  31. camel/benchmarks/mock_website/task.json +104 -0
  32. camel/benchmarks/nexus.py +3 -3
  33. camel/benchmarks/ragbench.py +2 -2
  34. camel/bots/__init__.py +2 -2
  35. camel/bots/discord/__init__.py +2 -2
  36. camel/bots/discord/discord_app.py +2 -2
  37. camel/bots/discord/discord_installation.py +2 -2
  38. camel/bots/discord/discord_store.py +3 -3
  39. camel/bots/slack/__init__.py +2 -2
  40. camel/bots/slack/models.py +4 -4
  41. camel/bots/slack/slack_app.py +2 -2
  42. camel/bots/telegram_bot.py +2 -2
  43. camel/configs/__init__.py +26 -2
  44. camel/configs/aihubmix_config.py +90 -0
  45. camel/configs/aiml_config.py +2 -2
  46. camel/configs/amd_config.py +70 -0
  47. camel/configs/anthropic_config.py +8 -7
  48. camel/configs/base_config.py +2 -2
  49. camel/configs/bedrock_config.py +5 -3
  50. camel/configs/cerebras_config.py +98 -0
  51. camel/configs/cohere_config.py +3 -3
  52. camel/configs/cometapi_config.py +106 -0
  53. camel/configs/crynux_config.py +94 -0
  54. camel/configs/deepseek_config.py +9 -8
  55. camel/configs/gemini_config.py +6 -4
  56. camel/configs/groq_config.py +6 -4
  57. camel/configs/internlm_config.py +6 -4
  58. camel/configs/litellm_config.py +2 -2
  59. camel/configs/lmstudio_config.py +6 -4
  60. camel/configs/minimax_config.py +95 -0
  61. camel/configs/mistral_config.py +3 -3
  62. camel/configs/modelscope_config.py +5 -3
  63. camel/configs/moonshot_config.py +2 -2
  64. camel/configs/nebius_config.py +105 -0
  65. camel/configs/netmind_config.py +2 -2
  66. camel/configs/novita_config.py +2 -2
  67. camel/configs/nvidia_config.py +2 -2
  68. camel/configs/ollama_config.py +2 -2
  69. camel/configs/openai_config.py +8 -3
  70. camel/configs/openrouter_config.py +6 -4
  71. camel/configs/ppio_config.py +2 -2
  72. camel/configs/qianfan_config.py +85 -0
  73. camel/configs/qwen_config.py +2 -2
  74. camel/configs/reka_config.py +3 -3
  75. camel/configs/samba_config.py +8 -6
  76. camel/configs/sglang_config.py +2 -2
  77. camel/configs/siliconflow_config.py +2 -2
  78. camel/configs/togetherai_config.py +2 -2
  79. camel/configs/vllm_config.py +4 -2
  80. camel/configs/watsonx_config.py +2 -2
  81. camel/configs/yi_config.py +6 -4
  82. camel/configs/zhipuai_config.py +6 -4
  83. camel/{data_collector → data_collectors}/__init__.py +2 -2
  84. camel/{data_collector → data_collectors}/alpaca_collector.py +19 -10
  85. camel/{data_collector → data_collectors}/base.py +2 -2
  86. camel/{data_collector → data_collectors}/sharegpt_collector.py +3 -3
  87. camel/datagen/__init__.py +2 -2
  88. camel/datagen/cot_datagen.py +32 -37
  89. camel/datagen/evol_instruct/__init__.py +2 -2
  90. camel/datagen/evol_instruct/evol_instruct.py +2 -2
  91. camel/datagen/evol_instruct/scorer.py +24 -25
  92. camel/datagen/evol_instruct/templates.py +48 -48
  93. camel/datagen/self_improving_cot.py +5 -5
  94. camel/datagen/self_instruct/__init__.py +2 -2
  95. camel/datagen/self_instruct/filter/__init__.py +2 -2
  96. camel/datagen/self_instruct/filter/filter_function.py +2 -2
  97. camel/datagen/self_instruct/filter/filter_registry.py +2 -2
  98. camel/datagen/self_instruct/filter/instruction_filter.py +2 -2
  99. camel/datagen/self_instruct/self_instruct.py +2 -2
  100. camel/datagen/self_instruct/templates.py +47 -47
  101. camel/datagen/source2synth/__init__.py +2 -2
  102. camel/datagen/source2synth/data_processor.py +2 -2
  103. camel/datagen/source2synth/models.py +2 -2
  104. camel/datagen/source2synth/user_data_processor_config.py +2 -2
  105. camel/datahubs/__init__.py +2 -2
  106. camel/datahubs/base.py +2 -2
  107. camel/datahubs/huggingface.py +2 -2
  108. camel/datahubs/models.py +2 -2
  109. camel/datasets/__init__.py +2 -2
  110. camel/datasets/base_generator.py +41 -12
  111. camel/datasets/few_shot_generator.py +18 -18
  112. camel/datasets/models.py +3 -3
  113. camel/datasets/self_instruct_generator.py +2 -2
  114. camel/datasets/static_dataset.py +152 -2
  115. camel/embeddings/__init__.py +2 -2
  116. camel/embeddings/azure_embedding.py +2 -2
  117. camel/embeddings/base.py +2 -2
  118. camel/embeddings/gemini_embedding.py +2 -2
  119. camel/embeddings/jina_embedding.py +10 -3
  120. camel/embeddings/mistral_embedding.py +2 -2
  121. camel/embeddings/openai_compatible_embedding.py +2 -2
  122. camel/embeddings/openai_embedding.py +2 -2
  123. camel/embeddings/sentence_transformers_embeddings.py +4 -4
  124. camel/embeddings/together_embedding.py +2 -2
  125. camel/embeddings/vlm_embedding.py +11 -4
  126. camel/environments/__init__.py +14 -2
  127. camel/environments/models.py +2 -2
  128. camel/environments/multi_step.py +2 -2
  129. camel/environments/rlcards_env.py +860 -0
  130. camel/environments/single_step.py +30 -5
  131. camel/environments/tic_tac_toe.py +3 -3
  132. camel/extractors/__init__.py +2 -2
  133. camel/extractors/base.py +2 -2
  134. camel/extractors/python_strategies.py +2 -2
  135. camel/generators.py +2 -2
  136. camel/human.py +2 -2
  137. camel/interpreters/__init__.py +4 -2
  138. camel/interpreters/base.py +16 -3
  139. camel/interpreters/docker/Dockerfile +53 -7
  140. camel/interpreters/docker_interpreter.py +70 -11
  141. camel/interpreters/e2b_interpreter.py +59 -11
  142. camel/interpreters/internal_python_interpreter.py +81 -4
  143. camel/interpreters/interpreter_error.py +2 -2
  144. camel/interpreters/ipython_interpreter.py +23 -5
  145. camel/interpreters/microsandbox_interpreter.py +395 -0
  146. camel/interpreters/subprocess_interpreter.py +36 -4
  147. camel/loaders/__init__.py +17 -5
  148. camel/loaders/apify_reader.py +2 -2
  149. camel/loaders/base_io.py +2 -2
  150. camel/loaders/base_loader.py +85 -0
  151. camel/loaders/chunkr_reader.py +128 -93
  152. camel/loaders/crawl4ai_reader.py +2 -2
  153. camel/loaders/firecrawl_reader.py +6 -6
  154. camel/loaders/jina_url_reader.py +2 -2
  155. camel/loaders/markitdown.py +2 -2
  156. camel/loaders/mineru_extractor.py +2 -2
  157. camel/loaders/mistral_reader.py +148 -0
  158. camel/loaders/scrapegraph_reader.py +2 -2
  159. camel/loaders/unstructured_io.py +2 -2
  160. camel/logger.py +5 -5
  161. camel/memories/__init__.py +2 -2
  162. camel/memories/agent_memories.py +86 -3
  163. camel/memories/base.py +36 -2
  164. camel/memories/blocks/__init__.py +2 -2
  165. camel/memories/blocks/chat_history_block.py +126 -9
  166. camel/memories/blocks/vectordb_block.py +10 -3
  167. camel/memories/context_creators/__init__.py +2 -2
  168. camel/memories/context_creators/score_based.py +31 -239
  169. camel/memories/records.py +98 -13
  170. camel/messages/__init__.py +2 -2
  171. camel/messages/base.py +193 -46
  172. camel/messages/conversion/__init__.py +2 -2
  173. camel/messages/conversion/alpaca.py +2 -2
  174. camel/messages/conversion/conversation_models.py +2 -2
  175. camel/messages/conversion/sharegpt/__init__.py +2 -2
  176. camel/messages/conversion/sharegpt/function_call_formatter.py +2 -2
  177. camel/messages/conversion/sharegpt/hermes/__init__.py +2 -2
  178. camel/messages/conversion/sharegpt/hermes/hermes_function_formatter.py +2 -2
  179. camel/messages/func_message.py +54 -17
  180. camel/models/__init__.py +18 -2
  181. camel/models/_utils.py +3 -3
  182. camel/models/aihubmix_model.py +83 -0
  183. camel/models/aiml_model.py +11 -18
  184. camel/models/amd_model.py +101 -0
  185. camel/models/anthropic_model.py +127 -20
  186. camel/models/aws_bedrock_model.py +12 -35
  187. camel/models/azure_openai_model.py +263 -63
  188. camel/models/base_audio_model.py +5 -3
  189. camel/models/base_model.py +195 -26
  190. camel/models/cerebras_model.py +83 -0
  191. camel/models/cohere_model.py +81 -21
  192. camel/models/cometapi_model.py +83 -0
  193. camel/models/crynux_model.py +87 -0
  194. camel/models/deepseek_model.py +61 -59
  195. camel/models/fish_audio_model.py +8 -2
  196. camel/models/gemini_model.py +439 -30
  197. camel/models/groq_model.py +11 -19
  198. camel/models/internlm_model.py +11 -18
  199. camel/models/litellm_model.py +94 -34
  200. camel/models/lmstudio_model.py +17 -20
  201. camel/models/minimax_model.py +83 -0
  202. camel/models/mistral_model.py +84 -19
  203. camel/models/model_factory.py +49 -6
  204. camel/models/model_manager.py +33 -11
  205. camel/models/modelscope_model.py +13 -193
  206. camel/models/moonshot_model.py +195 -21
  207. camel/models/nebius_model.py +83 -0
  208. camel/models/nemotron_model.py +19 -9
  209. camel/models/netmind_model.py +11 -18
  210. camel/models/novita_model.py +11 -18
  211. camel/models/nvidia_model.py +11 -18
  212. camel/models/ollama_model.py +14 -21
  213. camel/models/openai_audio_models.py +2 -2
  214. camel/models/openai_compatible_model.py +234 -27
  215. camel/models/openai_model.py +255 -39
  216. camel/models/openrouter_model.py +11 -19
  217. camel/models/ppio_model.py +11 -18
  218. camel/models/qianfan_model.py +89 -0
  219. camel/models/qwen_model.py +13 -193
  220. camel/models/reka_model.py +90 -21
  221. camel/models/reward/__init__.py +2 -2
  222. camel/models/reward/base_reward_model.py +2 -2
  223. camel/models/reward/evaluator.py +2 -2
  224. camel/models/reward/nemotron_model.py +2 -2
  225. camel/models/reward/skywork_model.py +2 -2
  226. camel/models/samba_model.py +117 -49
  227. camel/models/sglang_model.py +162 -42
  228. camel/models/siliconflow_model.py +12 -35
  229. camel/models/stub_model.py +10 -7
  230. camel/models/togetherai_model.py +11 -18
  231. camel/models/vllm_model.py +10 -18
  232. camel/models/volcano_model.py +16 -20
  233. camel/models/watsonx_model.py +69 -19
  234. camel/models/yi_model.py +11 -18
  235. camel/models/zhipuai_model.py +70 -18
  236. camel/parsers/__init__.py +18 -0
  237. camel/parsers/mcp_tool_call_parser.py +176 -0
  238. camel/personas/__init__.py +2 -2
  239. camel/personas/persona.py +2 -2
  240. camel/personas/persona_hub.py +2 -2
  241. camel/prompts/__init__.py +2 -2
  242. camel/prompts/ai_society.py +2 -2
  243. camel/prompts/base.py +2 -2
  244. camel/prompts/code.py +2 -2
  245. camel/prompts/evaluation.py +2 -2
  246. camel/prompts/generate_text_embedding_data.py +2 -2
  247. camel/prompts/image_craft.py +2 -2
  248. camel/prompts/misalignment.py +2 -2
  249. camel/prompts/multi_condition_image_craft.py +2 -2
  250. camel/prompts/object_recognition.py +2 -2
  251. camel/prompts/persona_hub.py +3 -3
  252. camel/prompts/prompt_templates.py +2 -2
  253. camel/prompts/role_description_prompt_template.py +2 -2
  254. camel/prompts/solution_extraction.py +8 -8
  255. camel/prompts/task_prompt_template.py +2 -2
  256. camel/prompts/translation.py +2 -2
  257. camel/prompts/video_description_prompt.py +3 -3
  258. camel/responses/__init__.py +2 -2
  259. camel/responses/agent_responses.py +2 -2
  260. camel/retrievers/__init__.py +2 -2
  261. camel/retrievers/auto_retriever.py +23 -3
  262. camel/retrievers/base.py +2 -2
  263. camel/retrievers/bm25_retriever.py +3 -4
  264. camel/retrievers/cohere_rerank_retriever.py +2 -2
  265. camel/retrievers/hybrid_retrival.py +4 -4
  266. camel/retrievers/vector_retriever.py +2 -2
  267. camel/runtimes/Dockerfile.multi-toolkit +90 -0
  268. camel/{runtime → runtimes}/__init__.py +2 -2
  269. camel/runtimes/api.py +153 -0
  270. camel/{runtime → runtimes}/base.py +2 -2
  271. camel/{runtime → runtimes}/configs.py +13 -13
  272. camel/{runtime → runtimes}/daytona_runtime.py +18 -19
  273. camel/{runtime → runtimes}/docker_runtime.py +13 -13
  274. camel/{runtime → runtimes}/llm_guard_runtime.py +28 -28
  275. camel/{runtime → runtimes}/remote_http_runtime.py +12 -12
  276. camel/{runtime → runtimes}/ubuntu_docker_runtime.py +3 -3
  277. camel/{runtime → runtimes}/utils/__init__.py +2 -2
  278. camel/{runtime → runtimes}/utils/function_risk_toolkit.py +2 -2
  279. camel/{runtime → runtimes}/utils/ignore_risk_toolkit.py +2 -2
  280. camel/schemas/__init__.py +2 -2
  281. camel/schemas/base.py +2 -2
  282. camel/schemas/openai_converter.py +3 -3
  283. camel/schemas/outlines_converter.py +2 -2
  284. camel/services/agent_openapi_server.py +380 -0
  285. camel/societies/__init__.py +4 -2
  286. camel/societies/babyagi_playing.py +2 -2
  287. camel/societies/role_playing.py +201 -80
  288. camel/societies/workforce/__init__.py +10 -3
  289. camel/societies/workforce/base.py +9 -5
  290. camel/societies/workforce/events.py +143 -0
  291. camel/societies/workforce/prompts.py +258 -33
  292. camel/societies/workforce/role_playing_worker.py +95 -30
  293. camel/societies/workforce/single_agent_worker.py +659 -30
  294. camel/societies/workforce/structured_output_handler.py +512 -0
  295. camel/societies/workforce/task_channel.py +182 -38
  296. camel/societies/workforce/utils.py +784 -18
  297. camel/societies/workforce/worker.py +96 -28
  298. camel/societies/workforce/workflow_memory_manager.py +1746 -0
  299. camel/societies/workforce/workforce.py +5730 -366
  300. camel/societies/workforce/workforce_callback.py +103 -0
  301. camel/societies/workforce/workforce_logger.py +647 -0
  302. camel/societies/workforce/workforce_metrics.py +33 -0
  303. camel/storages/__init__.py +10 -2
  304. camel/storages/graph_storages/__init__.py +2 -2
  305. camel/storages/graph_storages/base.py +2 -2
  306. camel/storages/graph_storages/graph_element.py +2 -2
  307. camel/storages/graph_storages/nebula_graph.py +4 -4
  308. camel/storages/graph_storages/neo4j_graph.py +7 -7
  309. camel/storages/key_value_storages/__init__.py +2 -2
  310. camel/storages/key_value_storages/base.py +2 -2
  311. camel/storages/key_value_storages/in_memory.py +2 -2
  312. camel/storages/key_value_storages/json.py +17 -4
  313. camel/storages/key_value_storages/mem0_cloud.py +50 -49
  314. camel/storages/key_value_storages/redis.py +2 -2
  315. camel/storages/object_storages/__init__.py +2 -2
  316. camel/storages/object_storages/amazon_s3.py +2 -2
  317. camel/storages/object_storages/azure_blob.py +2 -2
  318. camel/storages/object_storages/base.py +2 -2
  319. camel/storages/object_storages/google_cloud.py +3 -3
  320. camel/storages/vectordb_storages/__init__.py +12 -2
  321. camel/storages/vectordb_storages/base.py +2 -2
  322. camel/storages/vectordb_storages/chroma.py +731 -0
  323. camel/storages/vectordb_storages/faiss.py +712 -0
  324. camel/storages/vectordb_storages/milvus.py +2 -2
  325. camel/storages/vectordb_storages/oceanbase.py +16 -17
  326. camel/storages/vectordb_storages/pgvector.py +349 -0
  327. camel/storages/vectordb_storages/qdrant.py +6 -6
  328. camel/storages/vectordb_storages/surreal.py +372 -0
  329. camel/storages/vectordb_storages/tidb.py +11 -8
  330. camel/storages/vectordb_storages/weaviate.py +714 -0
  331. camel/tasks/__init__.py +2 -2
  332. camel/tasks/task.py +366 -27
  333. camel/tasks/task_prompt.py +3 -3
  334. camel/terminators/__init__.py +2 -2
  335. camel/terminators/base.py +2 -2
  336. camel/terminators/response_terminator.py +2 -2
  337. camel/terminators/token_limit_terminator.py +2 -2
  338. camel/toolkits/__init__.py +58 -10
  339. camel/toolkits/aci_toolkit.py +66 -21
  340. camel/toolkits/arxiv_toolkit.py +8 -8
  341. camel/toolkits/ask_news_toolkit.py +2 -2
  342. camel/toolkits/async_browser_toolkit.py +174 -575
  343. camel/toolkits/audio_analysis_toolkit.py +3 -3
  344. camel/toolkits/base.py +65 -7
  345. camel/toolkits/bohrium_toolkit.py +318 -0
  346. camel/toolkits/browser_toolkit.py +306 -566
  347. camel/toolkits/browser_toolkit_commons.py +568 -0
  348. camel/toolkits/code_execution.py +67 -11
  349. camel/toolkits/context_summarizer_toolkit.py +684 -0
  350. camel/toolkits/craw4ai_toolkit.py +93 -0
  351. camel/toolkits/dappier_toolkit.py +12 -8
  352. camel/toolkits/data_commons_toolkit.py +2 -2
  353. camel/toolkits/dingtalk.py +1135 -0
  354. camel/toolkits/earth_science_toolkit.py +5367 -0
  355. camel/toolkits/edgeone_pages_mcp_toolkit.py +49 -0
  356. camel/toolkits/excel_toolkit.py +910 -70
  357. camel/toolkits/file_toolkit.py +1402 -0
  358. camel/toolkits/function_tool.py +128 -20
  359. camel/toolkits/github_toolkit.py +148 -43
  360. camel/toolkits/gmail_toolkit.py +1839 -0
  361. camel/toolkits/google_calendar_toolkit.py +40 -6
  362. camel/toolkits/google_drive_mcp_toolkit.py +54 -0
  363. camel/toolkits/google_maps_toolkit.py +2 -2
  364. camel/toolkits/google_scholar_toolkit.py +2 -2
  365. camel/toolkits/human_toolkit.py +36 -12
  366. camel/toolkits/hybrid_browser_toolkit/__init__.py +18 -0
  367. camel/toolkits/hybrid_browser_toolkit/config_loader.py +185 -0
  368. camel/toolkits/hybrid_browser_toolkit/hybrid_browser_toolkit.py +246 -0
  369. camel/toolkits/hybrid_browser_toolkit/hybrid_browser_toolkit_ts.py +1973 -0
  370. camel/toolkits/hybrid_browser_toolkit/installer.py +203 -0
  371. camel/toolkits/hybrid_browser_toolkit/ts/package-lock.json +4589 -0
  372. camel/toolkits/hybrid_browser_toolkit/ts/package.json +33 -0
  373. camel/toolkits/hybrid_browser_toolkit/ts/src/browser-scripts.js +125 -0
  374. camel/toolkits/hybrid_browser_toolkit/ts/src/browser-session.ts +1929 -0
  375. camel/toolkits/hybrid_browser_toolkit/ts/src/config-loader.ts +233 -0
  376. camel/toolkits/hybrid_browser_toolkit/ts/src/hybrid-browser-toolkit.ts +589 -0
  377. camel/toolkits/hybrid_browser_toolkit/ts/src/index.ts +7 -0
  378. camel/toolkits/hybrid_browser_toolkit/ts/src/parent-child-filter.ts +226 -0
  379. camel/toolkits/hybrid_browser_toolkit/ts/src/snapshot-parser.ts +219 -0
  380. camel/toolkits/hybrid_browser_toolkit/ts/src/som-screenshot-injected.ts +543 -0
  381. camel/toolkits/hybrid_browser_toolkit/ts/src/types.ts +129 -0
  382. camel/toolkits/hybrid_browser_toolkit/ts/tsconfig.json +27 -0
  383. camel/toolkits/hybrid_browser_toolkit/ts/websocket-server.js +319 -0
  384. camel/toolkits/hybrid_browser_toolkit/ws_wrapper.py +1037 -0
  385. camel/toolkits/hybrid_browser_toolkit_py/__init__.py +17 -0
  386. camel/toolkits/hybrid_browser_toolkit_py/actions.py +575 -0
  387. camel/toolkits/hybrid_browser_toolkit_py/agent.py +311 -0
  388. camel/toolkits/hybrid_browser_toolkit_py/browser_session.py +787 -0
  389. camel/toolkits/hybrid_browser_toolkit_py/config_loader.py +490 -0
  390. camel/toolkits/hybrid_browser_toolkit_py/hybrid_browser_toolkit.py +2390 -0
  391. camel/toolkits/hybrid_browser_toolkit_py/snapshot.py +233 -0
  392. camel/toolkits/hybrid_browser_toolkit_py/stealth_script.js +0 -0
  393. camel/toolkits/hybrid_browser_toolkit_py/unified_analyzer.js +1043 -0
  394. camel/toolkits/image_analysis_toolkit.py +3 -3
  395. camel/toolkits/image_generation_toolkit.py +390 -0
  396. camel/toolkits/jina_reranker_toolkit.py +195 -79
  397. camel/toolkits/klavis_toolkit.py +7 -3
  398. camel/toolkits/linkedin_toolkit.py +2 -2
  399. camel/toolkits/markitdown_toolkit.py +104 -0
  400. camel/toolkits/math_toolkit.py +66 -12
  401. camel/toolkits/mcp_toolkit.py +841 -600
  402. camel/toolkits/memory_toolkit.py +7 -3
  403. camel/toolkits/meshy_toolkit.py +2 -2
  404. camel/toolkits/message_agent_toolkit.py +608 -0
  405. camel/toolkits/message_integration.py +724 -0
  406. camel/toolkits/mineru_toolkit.py +2 -2
  407. camel/toolkits/minimax_mcp_toolkit.py +195 -0
  408. camel/toolkits/networkx_toolkit.py +2 -2
  409. camel/toolkits/note_taking_toolkit.py +277 -0
  410. camel/toolkits/notion_mcp_toolkit.py +224 -0
  411. camel/toolkits/notion_toolkit.py +2 -2
  412. camel/toolkits/open_api_specs/biztoc/__init__.py +2 -2
  413. camel/toolkits/open_api_specs/biztoc/ai-plugin.json +1 -1
  414. camel/toolkits/open_api_specs/coursera/__init__.py +2 -2
  415. camel/toolkits/open_api_specs/create_qr_code/__init__.py +2 -2
  416. camel/toolkits/open_api_specs/klarna/__init__.py +2 -2
  417. camel/toolkits/open_api_specs/nasa_apod/__init__.py +2 -2
  418. camel/toolkits/open_api_specs/outschool/__init__.py +2 -2
  419. camel/toolkits/open_api_specs/outschool/ai-plugin.json +1 -1
  420. camel/toolkits/open_api_specs/outschool/openapi.yaml +1 -1
  421. camel/toolkits/open_api_specs/outschool/paths/__init__.py +2 -2
  422. camel/toolkits/open_api_specs/outschool/paths/get_classes.py +2 -2
  423. camel/toolkits/open_api_specs/outschool/paths/search_teachers.py +2 -2
  424. camel/toolkits/open_api_specs/security_config.py +2 -2
  425. camel/toolkits/open_api_specs/speak/__init__.py +2 -2
  426. camel/toolkits/open_api_specs/web_scraper/__init__.py +2 -2
  427. camel/toolkits/open_api_specs/web_scraper/ai-plugin.json +1 -1
  428. camel/toolkits/open_api_specs/web_scraper/paths/__init__.py +2 -2
  429. camel/toolkits/open_api_specs/web_scraper/paths/scraper.py +2 -2
  430. camel/toolkits/open_api_toolkit.py +2 -2
  431. camel/toolkits/openbb_toolkit.py +7 -3
  432. camel/toolkits/origene_mcp_toolkit.py +56 -0
  433. camel/toolkits/page_script.js +86 -74
  434. camel/toolkits/playwright_mcp_toolkit.py +27 -32
  435. camel/toolkits/pptx_toolkit.py +790 -0
  436. camel/toolkits/pubmed_toolkit.py +2 -2
  437. camel/toolkits/pulse_mcp_search_toolkit.py +2 -2
  438. camel/toolkits/pyautogui_toolkit.py +2 -2
  439. camel/toolkits/reddit_toolkit.py +2 -2
  440. camel/toolkits/resend_toolkit.py +168 -0
  441. camel/toolkits/retrieval_toolkit.py +2 -2
  442. camel/toolkits/screenshot_toolkit.py +213 -0
  443. camel/toolkits/search_toolkit.py +539 -146
  444. camel/toolkits/searxng_toolkit.py +2 -2
  445. camel/toolkits/semantic_scholar_toolkit.py +2 -2
  446. camel/toolkits/slack_toolkit.py +108 -58
  447. camel/toolkits/sql_toolkit.py +712 -0
  448. camel/toolkits/stripe_toolkit.py +2 -2
  449. camel/toolkits/sympy_toolkit.py +3 -3
  450. camel/toolkits/task_planning_toolkit.py +134 -0
  451. camel/toolkits/terminal_toolkit/__init__.py +18 -0
  452. camel/toolkits/terminal_toolkit/terminal_toolkit.py +1070 -0
  453. camel/toolkits/terminal_toolkit/utils.py +532 -0
  454. camel/toolkits/thinking_toolkit.py +3 -3
  455. camel/toolkits/twitter_toolkit.py +8 -3
  456. camel/toolkits/vertex_ai_veo_toolkit.py +590 -0
  457. camel/toolkits/video_analysis_toolkit.py +112 -29
  458. camel/toolkits/video_download_toolkit.py +22 -16
  459. camel/toolkits/weather_toolkit.py +2 -2
  460. camel/toolkits/web_deploy_toolkit.py +1219 -0
  461. camel/toolkits/wechat_official_toolkit.py +483 -0
  462. camel/toolkits/whatsapp_toolkit.py +2 -2
  463. camel/toolkits/wolfram_alpha_toolkit.py +53 -25
  464. camel/toolkits/zapier_toolkit.py +7 -3
  465. camel/types/__init__.py +4 -4
  466. camel/types/agents/__init__.py +2 -2
  467. camel/types/agents/tool_calling_record.py +6 -3
  468. camel/types/enums.py +454 -35
  469. camel/types/mcp_registries.py +2 -2
  470. camel/types/openai_types.py +4 -4
  471. camel/types/unified_model_type.py +43 -6
  472. camel/utils/__init__.py +20 -2
  473. camel/utils/async_func.py +2 -2
  474. camel/utils/chunker/__init__.py +2 -2
  475. camel/utils/chunker/base.py +2 -2
  476. camel/utils/chunker/code_chunker.py +2 -2
  477. camel/utils/chunker/uio_chunker.py +2 -2
  478. camel/utils/commons.py +65 -7
  479. camel/utils/constants.py +5 -2
  480. camel/utils/context_utils.py +1134 -0
  481. camel/utils/deduplication.py +2 -2
  482. camel/utils/filename.py +2 -2
  483. camel/utils/langfuse.py +258 -0
  484. camel/utils/mcp.py +140 -6
  485. camel/utils/mcp_client.py +1056 -0
  486. camel/utils/message_summarizer.py +148 -0
  487. camel/utils/response_format.py +2 -2
  488. camel/utils/token_counting.py +45 -22
  489. camel/utils/tool_result.py +44 -0
  490. camel/verifiers/__init__.py +2 -2
  491. camel/verifiers/base.py +2 -2
  492. camel/verifiers/math_verifier.py +2 -2
  493. camel/verifiers/models.py +2 -2
  494. camel/verifiers/physics_verifier.py +2 -2
  495. camel/verifiers/python_verifier.py +2 -2
  496. {camel_ai-0.2.59.dist-info → camel_ai-0.2.82.dist-info}/METADATA +349 -108
  497. camel_ai-0.2.82.dist-info/RECORD +507 -0
  498. {camel_ai-0.2.59.dist-info → camel_ai-0.2.82.dist-info}/WHEEL +1 -1
  499. {camel_ai-0.2.59.dist-info → camel_ai-0.2.82.dist-info}/licenses/LICENSE +1 -1
  500. camel/loaders/pandas_reader.py +0 -368
  501. camel/runtime/api.py +0 -97
  502. camel/toolkits/dalle_toolkit.py +0 -171
  503. camel/toolkits/file_write_toolkit.py +0 -395
  504. camel/toolkits/openai_agent_toolkit.py +0 -135
  505. camel/toolkits/terminal_toolkit.py +0 -1037
  506. camel_ai-0.2.59.dist-info/RECORD +0 -410
@@ -1,395 +0,0 @@
1
- # ========= Copyright 2023-2024 @ CAMEL-AI.org. All Rights Reserved. =========
2
- # Licensed under the Apache License, Version 2.0 (the "License");
3
- # you may not use this file except in compliance with the License.
4
- # You may obtain a copy of the License at
5
- #
6
- # http://www.apache.org/licenses/LICENSE-2.0
7
- #
8
- # Unless required by applicable law or agreed to in writing, software
9
- # distributed under the License is distributed on an "AS IS" BASIS,
10
- # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
11
- # See the License for the specific language governing permissions and
12
- # limitations under the License.
13
- # ========= Copyright 2023-2024 @ CAMEL-AI.org. All Rights Reserved. =========
14
-
15
-
16
- import re
17
- from datetime import datetime
18
- from pathlib import Path
19
- from typing import List, Optional, Union
20
-
21
- from camel.logger import get_logger
22
- from camel.toolkits.base import BaseToolkit
23
- from camel.toolkits.function_tool import FunctionTool
24
- from camel.utils import MCPServer
25
-
26
- logger = get_logger(__name__)
27
-
28
- # Default format when no extension is provided
29
- DEFAULT_FORMAT = '.md'
30
-
31
-
32
- @MCPServer()
33
- class FileWriteToolkit(BaseToolkit):
34
- r"""A toolkit for creating, writing, and modifying text in files.
35
-
36
- This class provides cross-platform (macOS, Linux, Windows) support for
37
- writing to various file formats (Markdown, DOCX, PDF, and plaintext),
38
- replacing text in existing files, automatic backups, custom encoding,
39
- and enhanced formatting options for specialized formats.
40
- """
41
-
42
- def __init__(
43
- self,
44
- output_dir: str = "./",
45
- timeout: Optional[float] = None,
46
- default_encoding: str = "utf-8",
47
- backup_enabled: bool = True,
48
- ) -> None:
49
- r"""Initialize the FileWriteToolkit.
50
-
51
- Args:
52
- output_dir (str): The default directory for output files.
53
- Defaults to the current working directory.
54
- timeout (Optional[float]): The timeout for the toolkit.
55
- (default: :obj: `None`)
56
- default_encoding (str): Default character encoding for text
57
- operations. (default: :obj: `utf-8`)
58
- backup_enabled (bool): Whether to create backups of existing files
59
- before overwriting. (default: :obj: `True`)
60
- """
61
- super().__init__(timeout=timeout)
62
- self.output_dir = Path(output_dir).resolve()
63
- self.output_dir.mkdir(parents=True, exist_ok=True)
64
- self.default_encoding = default_encoding
65
- self.backup_enabled = backup_enabled
66
- logger.info(
67
- f"FileWriteToolkit initialized with output directory"
68
- f": {self.output_dir}, encoding: {default_encoding}"
69
- )
70
-
71
- def _resolve_filepath(self, file_path: str) -> Path:
72
- r"""Convert the given string path to a Path object.
73
-
74
- If the provided path is not absolute, it is made relative to the
75
- default output directory. The filename part is sanitized to replace
76
- spaces and special characters with underscores, ensuring safe usage
77
- in downstream processing.
78
-
79
- Args:
80
- file_path (str): The file path to resolve.
81
-
82
- Returns:
83
- Path: A fully resolved (absolute) and sanitized Path object.
84
- """
85
- path_obj = Path(file_path)
86
- if not path_obj.is_absolute():
87
- path_obj = self.output_dir / path_obj
88
-
89
- sanitized_filename = self._sanitize_filename(path_obj.name)
90
- path_obj = path_obj.parent / sanitized_filename
91
- return path_obj.resolve()
92
-
93
- def _write_text_file(
94
- self, file_path: Path, content: str, encoding: str = "utf-8"
95
- ) -> None:
96
- r"""Write text content to a plaintext file.
97
-
98
- Args:
99
- file_path (Path): The target file path.
100
- content (str): The text content to write.
101
- encoding (str): Character encoding to use. (default: :obj: `utf-8`)
102
- """
103
- with file_path.open("w", encoding=encoding) as f:
104
- f.write(content)
105
- logger.debug(f"Wrote text to {file_path} with {encoding} encoding")
106
-
107
- def _create_backup(self, file_path: Path) -> None:
108
- r"""Create a backup of the file if it exists and backup is enabled.
109
-
110
- Args:
111
- file_path (Path): Path to the file to backup.
112
- """
113
- import shutil
114
-
115
- if not self.backup_enabled or not file_path.exists():
116
- return
117
-
118
- timestamp = datetime.now().strftime("%Y%m%d_%H%M%S")
119
- backup_path = file_path.parent / f"{file_path.name}.{timestamp}.bak"
120
- shutil.copy2(file_path, backup_path)
121
- logger.info(f"Created backup at {backup_path}")
122
-
123
- def _write_docx_file(self, file_path: Path, content: str) -> None:
124
- r"""Write text content to a DOCX file with default formatting.
125
-
126
- Args:
127
- file_path (Path): The target file path.
128
- content (str): The text content to write.
129
- """
130
- import docx
131
-
132
- # Use default formatting values
133
- font_name = 'Calibri'
134
- font_size = 11
135
- line_spacing = 1.0
136
-
137
- document = docx.Document()
138
- style = document.styles['Normal']
139
- style.font.name = font_name
140
- style.font.size = docx.shared.Pt(font_size)
141
- style.paragraph_format.line_spacing = line_spacing
142
-
143
- # Split content into paragraphs and add them
144
- for para_text in content.split('\n'):
145
- para = document.add_paragraph(para_text)
146
- para.style = style
147
-
148
- document.save(str(file_path))
149
- logger.debug(f"Wrote DOCX to {file_path} with default formatting")
150
-
151
- def _write_pdf_file(self, file_path: Path, content: str, **kwargs) -> None:
152
- r"""Write text content to a PDF file with default formatting.
153
-
154
- Args:
155
- file_path (Path): The target file path.
156
- content (str): The text content to write.
157
-
158
- Raises:
159
- RuntimeError: If the 'fpdf' library is not installed.
160
- """
161
- from fpdf import FPDF
162
-
163
- # Use default formatting values
164
- font_family = 'Arial'
165
- font_size = 12
166
- font_style = ''
167
- line_height = 10
168
- margin = 10
169
-
170
- pdf = FPDF()
171
- pdf.set_margins(margin, margin, margin)
172
-
173
- pdf.add_page()
174
- pdf.set_font(font_family, style=font_style, size=font_size)
175
-
176
- # Split content into paragraphs and add them
177
- for para in content.split('\n'):
178
- if para.strip(): # Skip empty paragraphs
179
- pdf.multi_cell(0, line_height, para)
180
- else:
181
- pdf.ln(line_height) # Add empty line
182
-
183
- pdf.output(str(file_path))
184
- logger.debug(f"Wrote PDF to {file_path} with custom formatting")
185
-
186
- def _write_csv_file(
187
- self,
188
- file_path: Path,
189
- content: Union[str, List[List]],
190
- encoding: str = "utf-8",
191
- ) -> None:
192
- r"""Write CSV content to a file.
193
-
194
- Args:
195
- file_path (Path): The target file path.
196
- content (Union[str, List[List]]): The CSV content as a string or
197
- list of lists.
198
- encoding (str): Character encoding to use. (default: :obj: `utf-8`)
199
- """
200
- import csv
201
-
202
- with file_path.open("w", encoding=encoding, newline='') as f:
203
- if isinstance(content, str):
204
- f.write(content)
205
- else:
206
- writer = csv.writer(f)
207
- writer.writerows(content)
208
- logger.debug(f"Wrote CSV to {file_path} with {encoding} encoding")
209
-
210
- def _write_json_file(
211
- self,
212
- file_path: Path,
213
- content: str,
214
- encoding: str = "utf-8",
215
- ) -> None:
216
- r"""Write JSON content to a file.
217
-
218
- Args:
219
- file_path (Path): The target file path.
220
- content (str): The JSON content as a string.
221
- encoding (str): Character encoding to use. (default: :obj: `utf-8`)
222
- """
223
- import json
224
-
225
- with file_path.open("w", encoding=encoding) as f:
226
- if isinstance(content, str):
227
- try:
228
- # Try parsing as JSON string first
229
- data = json.loads(content)
230
- json.dump(data, f, ensure_ascii=False)
231
- except json.JSONDecodeError:
232
- # If not valid JSON string, write as is
233
- f.write(content)
234
- else:
235
- # If not string, dump as JSON
236
- json.dump(content, f, ensure_ascii=False)
237
- logger.debug(f"Wrote JSON to {file_path} with {encoding} encoding")
238
-
239
- def _write_yaml_file(
240
- self,
241
- file_path: Path,
242
- content: str,
243
- encoding: str = "utf-8",
244
- ) -> None:
245
- r"""Write YAML content to a file.
246
-
247
- Args:
248
- file_path (Path): The target file path.
249
- content (str): The YAML content as a string.
250
- encoding (str): Character encoding to use. (default: :obj: `utf-8`)
251
- """
252
- with file_path.open("w", encoding=encoding) as f:
253
- f.write(content)
254
- logger.debug(f"Wrote YAML to {file_path} with {encoding} encoding")
255
-
256
- def _write_html_file(
257
- self, file_path: Path, content: str, encoding: str = "utf-8"
258
- ) -> None:
259
- r"""Write text content to an HTML file.
260
-
261
- Args:
262
- file_path (Path): The target file path.
263
- content (str): The HTML content to write.
264
- encoding (str): Character encoding to use. (default: :obj: `utf-8`)
265
- """
266
- with file_path.open("w", encoding=encoding) as f:
267
- f.write(content)
268
- logger.debug(f"Wrote HTML to {file_path} with {encoding} encoding")
269
-
270
- def _write_markdown_file(
271
- self, file_path: Path, content: str, encoding: str = "utf-8"
272
- ) -> None:
273
- r"""Write text content to a Markdown file.
274
-
275
- Args:
276
- file_path (Path): The target file path.
277
- content (str): The Markdown content to write.
278
- encoding (str): Character encoding to use. (default: :obj: `utf-8`)
279
- """
280
- with file_path.open("w", encoding=encoding) as f:
281
- f.write(content)
282
- logger.debug(f"Wrote Markdown to {file_path} with {encoding} encoding")
283
-
284
- def write_to_file(
285
- self,
286
- content: Union[str, List[List[str]]],
287
- filename: str,
288
- encoding: Optional[str] = None,
289
- ) -> str:
290
- r"""Write the given content to a file.
291
-
292
- If the file exists, it will be overwritten. Supports multiple formats:
293
- Markdown (.md, .markdown, default), Plaintext (.txt), CSV (.csv),
294
- DOC/DOCX (.doc, .docx), PDF (.pdf), JSON (.json), YAML (.yml, .yaml),
295
- and HTML (.html, .htm).
296
-
297
- Args:
298
- content (Union[str, List[List[str]]]): The content to write to the
299
- file. For all formats, content must be a string or list in the
300
- appropriate format.
301
- filename (str): The name or path of the file. If a relative path is
302
- supplied, it is resolved to self.output_dir.
303
- encoding (Optional[str]): The character encoding to use. (default:
304
- :obj: `None`)
305
-
306
- Returns:
307
- str: A message indicating success or error details.
308
- """
309
- file_path = self._resolve_filepath(filename)
310
- file_path.parent.mkdir(parents=True, exist_ok=True)
311
-
312
- # Create backup if file exists
313
- self._create_backup(file_path)
314
-
315
- extension = file_path.suffix.lower()
316
-
317
- # If no extension is provided, use the default format
318
- if extension == "":
319
- file_path = file_path.with_suffix(DEFAULT_FORMAT)
320
- extension = DEFAULT_FORMAT
321
-
322
- try:
323
- # Get encoding or use default
324
- file_encoding = encoding or self.default_encoding
325
-
326
- if extension in [".doc", ".docx"]:
327
- self._write_docx_file(file_path, str(content))
328
- elif extension == ".pdf":
329
- self._write_pdf_file(file_path, str(content))
330
- elif extension == ".csv":
331
- self._write_csv_file(
332
- file_path, content, encoding=file_encoding
333
- )
334
- elif extension == ".json":
335
- self._write_json_file(
336
- file_path,
337
- content, # type: ignore[arg-type]
338
- encoding=file_encoding,
339
- )
340
- elif extension in [".yml", ".yaml"]:
341
- self._write_yaml_file(
342
- file_path, str(content), encoding=file_encoding
343
- )
344
- elif extension in [".html", ".htm"]:
345
- self._write_html_file(
346
- file_path, str(content), encoding=file_encoding
347
- )
348
- elif extension in [".md", ".markdown"]:
349
- self._write_markdown_file(
350
- file_path, str(content), encoding=file_encoding
351
- )
352
- else:
353
- # Fallback to simple text writing for unknown or .txt
354
- # extensions
355
- self._write_text_file(
356
- file_path, str(content), encoding=file_encoding
357
- )
358
-
359
- msg = f"Content successfully written to file: {file_path}"
360
- logger.info(msg)
361
- return msg
362
- except Exception as e:
363
- error_msg = (
364
- f"Error occurred while writing to file {file_path}: {e}"
365
- )
366
- logger.error(error_msg)
367
- return error_msg
368
-
369
- def get_tools(self) -> List[FunctionTool]:
370
- r"""Return a list of FunctionTool objects representing the functions
371
- in the toolkit.
372
-
373
- Returns:
374
- List[FunctionTool]: A list of FunctionTool objects representing
375
- the available functions in this toolkit.
376
- """
377
- return [
378
- FunctionTool(self.write_to_file),
379
- ]
380
-
381
- def _sanitize_filename(self, filename: str) -> str:
382
- r"""Sanitize a filename by replacing any character that is not
383
- alphanumeric, a dot (.), hyphen (-), or underscore (_) with an
384
- underscore (_).
385
-
386
- Args:
387
- filename (str): The original filename which may contain spaces or
388
- special characters.
389
-
390
- Returns:
391
- str: The sanitized filename with disallowed characters replaced by
392
- underscores.
393
- """
394
- safe = re.sub(r'[^\w\-.]', '_', filename)
395
- return safe
@@ -1,135 +0,0 @@
1
- # ========= Copyright 2023-2024 @ CAMEL-AI.org. All Rights Reserved. =========
2
- # Licensed under the Apache License, Version 2.0 (the "License");
3
- # you may not use this file except in compliance with the License.
4
- # You may obtain a copy of the License at
5
- #
6
- # http://www.apache.org/licenses/LICENSE-2.0
7
- #
8
- # Unless required by applicable law or agreed to in writing, software
9
- # distributed under the License is distributed on an "AS IS" BASIS,
10
- # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
11
- # See the License for the specific language governing permissions and
12
- # limitations under the License.
13
- # ========= Copyright 2023-2024 @ CAMEL-AI.org. All Rights Reserved. =========
14
-
15
- import os
16
- from typing import List, Optional
17
-
18
- from openai import OpenAI
19
-
20
- from camel.logger import get_logger
21
- from camel.models import BaseModelBackend, ModelFactory
22
- from camel.toolkits.base import BaseToolkit
23
- from camel.toolkits.function_tool import FunctionTool
24
- from camel.types import ModelPlatformType, ModelType
25
- from camel.utils import api_keys_required
26
-
27
- logger = get_logger(__name__)
28
-
29
-
30
- class OpenAIAgentToolkit(BaseToolkit):
31
- r"""Toolkit for accessing OpenAI's agent tools including web search and
32
- file search.
33
-
34
- Provides access to OpenAI's web search and file search capabilities
35
- through the Responses API, allowing agents to retrieve information from
36
- the web and search through uploaded files.
37
- """
38
-
39
- @api_keys_required(
40
- [
41
- (None, "OPENAI_API_KEY"),
42
- ]
43
- )
44
- def __init__(
45
- self,
46
- model: Optional[BaseModelBackend] = None,
47
- api_key: Optional[str] = None,
48
- timeout: Optional[float] = None,
49
- ) -> None:
50
- r"""Initialize the OpenAI agent toolkit.
51
-
52
- Args:
53
- model (BaseModelBackend): The OpenAI model to use for responses.
54
- If None, defaults to gpt-4o-mini. (default: :obj:`None`)
55
- api_key (str): OpenAI API key. If not provided, will attempt to
56
- use OPENAI_API_KEY environment variable. (default: :obj:`None`)
57
- timeout (Optional[float]): The timeout value for API requests
58
- in seconds. If None, no timeout is applied.
59
- (default: :obj:`None`)
60
- """
61
- super().__init__(timeout=timeout)
62
- self.api_key = api_key or os.getenv("OPENAI_API_KEY")
63
- self.client = OpenAI(api_key=self.api_key)
64
- self.model = model or ModelFactory.create(
65
- model_platform=ModelPlatformType.OPENAI,
66
- model_type=ModelType.GPT_4O_MINI,
67
- )
68
-
69
- def web_search(self, query: str) -> str:
70
- r"""Perform a web search using OpenAI's web search tool.
71
-
72
- Args:
73
- query (str): The search query.
74
-
75
- Returns:
76
- str: The search result or error message.
77
- """
78
- try:
79
- response = self.client.responses.create(
80
- model=str(self.model.model_type),
81
- tools=[{"type": "web_search_preview"}],
82
- input=query,
83
- )
84
- return response.output_text
85
-
86
- except Exception as e:
87
- logger.error(f"Web search failed: {e!s}")
88
- return f"Web search failed: {e!s}"
89
-
90
- def file_search(
91
- self,
92
- query: str,
93
- vector_store_id: str,
94
- ) -> str:
95
- r"""Search through files using OpenAI's file search tool.
96
-
97
- Args:
98
- query (str): The search query.
99
- vector_store_id (str): The vector store ID to search in.
100
-
101
- Returns:
102
- str: The search result or error message.
103
- """
104
- if not vector_store_id.strip():
105
- logger.error("Empty vector store ID provided.")
106
- return "Empty vector store ID provided, it cannot be empty."
107
-
108
- try:
109
- response = self.client.responses.create(
110
- model=str(self.model.model_type),
111
- tools=[
112
- {
113
- "type": "file_search",
114
- "vector_store_ids": [vector_store_id],
115
- }
116
- ],
117
- input=query,
118
- )
119
- return response.output_text
120
-
121
- except Exception as e:
122
- logger.error(f"File search failed: {e!s}")
123
- return f"File search failed: {e!s}"
124
-
125
- def get_tools(self) -> List[FunctionTool]:
126
- r"""Retrieve available toolkit functions as FunctionTool objects.
127
-
128
- Returns:
129
- List[FunctionTool]: Collection of FunctionTool objects representing
130
- the available search functions in this toolkit.
131
- """
132
- return [
133
- FunctionTool(self.web_search),
134
- FunctionTool(self.file_search),
135
- ]