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,368 +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
- from functools import wraps
15
- from pathlib import Path
16
- from typing import TYPE_CHECKING, Any, Callable, Dict, List, Optional, Union
17
-
18
- if TYPE_CHECKING:
19
- from pandas import DataFrame
20
- from pandasai import SmartDataframe
21
-
22
-
23
- def check_suffix(valid_suffixs: List[str]) -> Callable:
24
- r"""A decorator to check the file suffix of a given file path.
25
-
26
- Args:
27
- valid_suffix (str): The required file suffix.
28
-
29
- Returns:
30
- Callable: The decorator function.
31
- """
32
-
33
- def decorator(func: Callable):
34
- @wraps(func)
35
- def wrapper(
36
- self, file_path: str, *args: Any, **kwargs: Dict[str, Any]
37
- ) -> "DataFrame":
38
- suffix = Path(file_path).suffix
39
- if suffix not in valid_suffixs:
40
- raise ValueError(
41
- f"Only {', '.join(valid_suffixs)} files are supported"
42
- )
43
- return func(self, file_path, *args, **kwargs)
44
-
45
- return wrapper
46
-
47
- return decorator
48
-
49
-
50
- class PandasReader:
51
- def __init__(self, config: Optional[Dict[str, Any]] = None) -> None:
52
- r"""Initializes the PandasReader class.
53
-
54
- Args:
55
- config (Optional[Dict[str, Any]], optional): The configuration
56
- dictionary that can include LLM API settings for LLM-based
57
- processing. If not provided, no LLM will be configured by
58
- default. You can customize the LLM configuration by providing
59
- a 'llm' key in the config dictionary. (default: :obj:`None`)
60
- """
61
- self.config = config or {}
62
-
63
- self.__LOADER = {
64
- ".csv": self.read_csv,
65
- ".xlsx": self.read_excel,
66
- ".xls": self.read_excel,
67
- ".json": self.read_json,
68
- ".parquet": self.read_parquet,
69
- ".sql": self.read_sql,
70
- ".html": self.read_html,
71
- ".feather": self.read_feather,
72
- ".dta": self.read_stata,
73
- ".sas": self.read_sas,
74
- ".pkl": self.read_pickle,
75
- ".h5": self.read_hdf,
76
- ".orc": self.read_orc,
77
- }
78
-
79
- def load(
80
- self,
81
- data: Union["DataFrame", str],
82
- *args: Any,
83
- **kwargs: Dict[str, Any],
84
- ) -> Union["DataFrame", "SmartDataframe"]:
85
- r"""Loads a file or DataFrame and returns a DataFrame or
86
- SmartDataframe object.
87
-
88
- If an LLM is configured in the config dictionary, a SmartDataframe
89
- will be returned, otherwise a regular pandas DataFrame will be
90
- returned.
91
-
92
- args:
93
- data (Union[DataFrame, str]): The data to load.
94
- *args (Any): Additional positional arguments.
95
- **kwargs (Dict[str, Any]): Additional keyword arguments.
96
-
97
- Returns:
98
- Union[DataFrame, SmartDataframe]: The DataFrame or SmartDataframe
99
- object.
100
- """
101
- from pandas import DataFrame
102
-
103
- # Load the data into a pandas DataFrame
104
- if isinstance(data, DataFrame):
105
- df = data
106
- else:
107
- file_path = str(data)
108
- path = Path(file_path)
109
- if not file_path.startswith("http") and not path.exists():
110
- raise FileNotFoundError(f"File {file_path} not found")
111
- if path.suffix in self.__LOADER:
112
- df = self.__LOADER[path.suffix](file_path, *args, **kwargs) # type: ignore[operator]
113
- else:
114
- raise ValueError(f"Unsupported file format: {path.suffix}")
115
-
116
- # If an LLM is configured, return a SmartDataframe, otherwise return a
117
- # regular DataFrame
118
- if "llm" in self.config:
119
- from pandasai import SmartDataframe
120
-
121
- return SmartDataframe(df, config=self.config)
122
- else:
123
- return df
124
-
125
- @check_suffix([".csv"])
126
- def read_csv(
127
- self, file_path: str, *args: Any, **kwargs: Dict[str, Any]
128
- ) -> "DataFrame":
129
- r"""Reads a CSV file and returns a DataFrame.
130
-
131
- Args:
132
- file_path (str): The path to the CSV file.
133
- *args (Any): Additional positional arguments.
134
- **kwargs (Dict[str, Any]): Additional keyword arguments.
135
-
136
- Returns:
137
- DataFrame: The DataFrame object.
138
- """
139
- import pandas as pd
140
-
141
- return pd.read_csv(file_path, *args, **kwargs)
142
-
143
- @check_suffix([".xlsx", ".xls"])
144
- def read_excel(
145
- self, file_path: str, *args: Any, **kwargs: Dict[str, Any]
146
- ) -> "DataFrame":
147
- r"""Reads an Excel file and returns a DataFrame.
148
-
149
- Args:
150
- file_path (str): The path to the Excel file.
151
- *args (Any): Additional positional arguments.
152
- **kwargs (Dict[str, Any]): Additional keyword arguments.
153
-
154
- Returns:
155
- DataFrame: The DataFrame object.
156
- """
157
- import pandas as pd
158
-
159
- return pd.read_excel(file_path, *args, **kwargs)
160
-
161
- @check_suffix([".json"])
162
- def read_json(
163
- self, file_path: str, *args: Any, **kwargs: Dict[str, Any]
164
- ) -> "DataFrame":
165
- r"""Reads a JSON file and returns a DataFrame.
166
-
167
- Args:
168
- file_path (str): The path to the JSON file.
169
- *args (Any): Additional positional arguments.
170
- **kwargs (Dict[str, Any]): Additional keyword arguments.
171
-
172
- Returns:
173
- DataFrame: The DataFrame object.
174
- """
175
- import pandas as pd
176
-
177
- return pd.read_json(file_path, *args, **kwargs)
178
-
179
- @check_suffix([".parquet"])
180
- def read_parquet(
181
- self, file_path: str, *args: Any, **kwargs: Dict[str, Any]
182
- ) -> "DataFrame":
183
- r"""Reads a Parquet file and returns a DataFrame.
184
-
185
- Args:
186
- file_path (str): The path to the Parquet file.
187
- *args (Any): Additional positional arguments.
188
- **kwargs (Dict[str, Any]): Additional keyword arguments.
189
-
190
- Returns:
191
- DataFrame: The DataFrame object.
192
- """
193
- import pandas as pd
194
-
195
- return pd.read_parquet(file_path, *args, **kwargs)
196
-
197
- def read_sql(self, *args: Any, **kwargs: Dict[str, Any]) -> "DataFrame":
198
- r"""Reads a SQL file and returns a DataFrame.
199
-
200
- Args:
201
- *args (Any): Additional positional arguments.
202
- **kwargs (Dict[str, Any]): Additional keyword arguments.
203
-
204
- Returns:
205
- DataFrame: The DataFrame object.
206
- """
207
- import pandas as pd
208
-
209
- return pd.read_sql(*args, **kwargs)
210
-
211
- def read_table(
212
- self, file_path: str, *args: Any, **kwargs: Dict[str, Any]
213
- ) -> "DataFrame":
214
- r"""Reads a table and returns a DataFrame.
215
-
216
- Args:
217
- file_path (str): The path to the table.
218
- *args (Any): Additional positional arguments.
219
- **kwargs (Dict[str, Any]): Additional keyword arguments.
220
-
221
- Returns:
222
- DataFrame: The DataFrame object.
223
- """
224
- import pandas as pd
225
-
226
- return pd.read_table(file_path, *args, **kwargs)
227
-
228
- def read_clipboard(
229
- self, *args: Any, **kwargs: Dict[str, Any]
230
- ) -> "DataFrame":
231
- r"""Reads a clipboard and returns a DataFrame.
232
-
233
- Args:
234
- *args (Any): Additional positional arguments.
235
- **kwargs (Dict[str, Any]): Additional keyword arguments.
236
-
237
- Returns:
238
- DataFrame: The DataFrame object.
239
- """
240
- import pandas as pd
241
-
242
- return pd.read_clipboard(*args, **kwargs)
243
-
244
- @check_suffix([".html"])
245
- def read_html(
246
- self, file_path: str, *args: Any, **kwargs: Dict[str, Any]
247
- ) -> "DataFrame":
248
- r"""Reads an HTML file and returns a DataFrame.
249
-
250
- Args:
251
- file_path (str): The path to the HTML file.
252
- *args (Any): Additional positional arguments.
253
- **kwargs (Dict[str, Any]): Additional keyword arguments.
254
-
255
- Returns:
256
- DataFrame: The DataFrame object.
257
- """
258
- import pandas as pd
259
-
260
- return pd.read_html(file_path, *args, **kwargs)
261
-
262
- @check_suffix([".feather"])
263
- def read_feather(
264
- self, file_path: str, *args: Any, **kwargs: Dict[str, Any]
265
- ) -> "DataFrame":
266
- r"""Reads a Feather file and returns a DataFrame.
267
-
268
- Args:
269
- file_path (str): The path to the Feather file.
270
- *args (Any): Additional positional arguments.
271
- **kwargs (Dict[str, Any]): Additional keyword arguments.
272
-
273
- Returns:
274
- DataFrame: The DataFrame object.
275
- """
276
- import pandas as pd
277
-
278
- return pd.read_feather(file_path, *args, **kwargs)
279
-
280
- @check_suffix([".dta"])
281
- def read_stata(
282
- self, file_path: str, *args: Any, **kwargs: Dict[str, Any]
283
- ) -> "DataFrame":
284
- r"""Reads a Stata file and returns a DataFrame.
285
-
286
- Args:
287
- file_path (str): The path to the Stata file.
288
- *args (Any): Additional positional arguments.
289
- **kwargs (Dict[str, Any]): Additional keyword arguments.
290
-
291
- Returns:
292
- DataFrame: The DataFrame object.
293
- """
294
- import pandas as pd
295
-
296
- return pd.read_stata(file_path, *args, **kwargs)
297
-
298
- @check_suffix([".sas"])
299
- def read_sas(
300
- self, file_path: str, *args: Any, **kwargs: Dict[str, Any]
301
- ) -> "DataFrame":
302
- r"""Reads a SAS file and returns a DataFrame.
303
-
304
- Args:
305
- file_path (str): The path to the SAS file.
306
- *args (Any): Additional positional arguments.
307
- **kwargs (Dict[str, Any]): Additional keyword arguments.
308
-
309
- Returns:
310
- DataFrame: The DataFrame object.
311
- """
312
- import pandas as pd
313
-
314
- return pd.read_sas(file_path, *args, **kwargs)
315
-
316
- @check_suffix([".pkl"])
317
- def read_pickle(
318
- self, file_path: str, *args: Any, **kwargs: Dict[str, Any]
319
- ) -> "DataFrame":
320
- r"""Reads a Pickle file and returns a DataFrame.
321
-
322
- Args:
323
- file_path (str): The path to the Pickle file.
324
- *args (Any): Additional positional arguments.
325
- **kwargs (Dict[str, Any]): Additional keyword arguments.
326
-
327
- Returns:
328
- DataFrame: The DataFrame object.
329
- """
330
- import pandas as pd
331
-
332
- return pd.read_pickle(file_path, *args, **kwargs)
333
-
334
- @check_suffix([".h5"])
335
- def read_hdf(
336
- self, file_path: str, *args: Any, **kwargs: Dict[str, Any]
337
- ) -> "DataFrame":
338
- r"""Reads an HDF file and returns a DataFrame.
339
-
340
- Args:
341
- file_path (str): The path to the HDF file.
342
- *args (Any): Additional positional arguments.
343
- **kwargs (Dict[str, Any]): Additional keyword arguments.
344
-
345
- Returns:
346
- DataFrame: The DataFrame object.
347
- """
348
- import pandas as pd
349
-
350
- return pd.read_hdf(file_path, *args, **kwargs)
351
-
352
- @check_suffix([".orc"])
353
- def read_orc(
354
- self, file_path: str, *args: Any, **kwargs: Dict[str, Any]
355
- ) -> "DataFrame":
356
- r"""Reads an ORC file and returns a DataFrame.
357
-
358
- Args:
359
- file_path (str): The path to the ORC file.
360
- *args (Any): Additional positional arguments.
361
- **kwargs (Dict[str, Any]): Additional keyword arguments.
362
-
363
- Returns:
364
- DataFrame: The DataFrame object.
365
- """
366
- import pandas as pd
367
-
368
- return pd.read_orc(file_path, *args, **kwargs)
camel/runtime/api.py DELETED
@@ -1,97 +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
- import importlib
15
- import io
16
- import json
17
- import logging
18
- import os
19
- import sys
20
- from typing import Dict
21
-
22
- import uvicorn
23
- from fastapi import FastAPI, Request
24
- from fastapi.responses import JSONResponse
25
-
26
- from camel.toolkits import BaseToolkit
27
-
28
- logger = logging.getLogger(__name__)
29
-
30
- sys.path.append(os.getcwd())
31
-
32
- modules_functions = sys.argv[1:]
33
-
34
- logger.info(f"Modules and functions: {modules_functions}")
35
-
36
- app = FastAPI()
37
-
38
-
39
- @app.exception_handler(Exception)
40
- async def general_exception_handler(request: Request, exc: Exception):
41
- return JSONResponse(
42
- status_code=500,
43
- content={
44
- "detail": "Internal Server Error",
45
- "error_message": str(exc),
46
- },
47
- )
48
-
49
-
50
- for module_function in modules_functions:
51
- try:
52
- init_params = dict()
53
- if "{" in module_function:
54
- module_function, params = module_function.split("{")
55
- params = "{" + params
56
- init_params = json.loads(params)
57
-
58
- module_name, function_name = module_function.rsplit(".", 1)
59
-
60
- logger.info(f"Importing {module_name} and function {function_name}")
61
-
62
- module = importlib.import_module(module_name)
63
- function = getattr(module, function_name)
64
- if isinstance(function, type) and issubclass(function, BaseToolkit):
65
- function = function(**init_params).get_tools()
66
-
67
- if not isinstance(function, list):
68
- function = [function]
69
-
70
- for func in function:
71
-
72
- @app.post(f"/{func.get_function_name()}")
73
- async def dynamic_function(data: Dict, func=func):
74
- redirect_stdout = data.get('redirect_stdout', False)
75
- if redirect_stdout:
76
- sys.stdout = io.StringIO()
77
- response_data = func.func(*data['args'], **data['kwargs'])
78
- if redirect_stdout:
79
- sys.stdout.seek(0)
80
- output = sys.stdout.read()
81
- sys.stdout = sys.__stdout__
82
- return {
83
- "output": json.dumps(
84
- response_data, ensure_ascii=False
85
- ),
86
- "stdout": output,
87
- }
88
- return {
89
- "output": json.dumps(response_data, ensure_ascii=False)
90
- }
91
-
92
- except (ImportError, AttributeError) as e:
93
- logger.error(f"Error importing {module_function}: {e}")
94
-
95
-
96
- if __name__ == "__main__":
97
- uvicorn.run("__main__:app", host="0.0.0.0", port=8000, reload=True)
@@ -1,171 +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
- import base64
15
- import os
16
- import uuid
17
- from io import BytesIO
18
- from typing import List, Optional
19
-
20
- from openai import OpenAI
21
- from PIL import Image
22
-
23
- from camel.logger import get_logger
24
- from camel.toolkits import FunctionTool
25
- from camel.toolkits.base import BaseToolkit
26
- from camel.utils import MCPServer
27
-
28
- logger = get_logger(__name__)
29
-
30
-
31
- @MCPServer()
32
- class DalleToolkit(BaseToolkit):
33
- r"""A class representing a toolkit for image generation using OpenAI's
34
- DALL-E model.
35
- """
36
-
37
- def __init__(
38
- self,
39
- timeout: Optional[float] = None,
40
- ):
41
- r"""Initializes a new instance of the DalleToolkit class.
42
-
43
- Args:
44
- timeout (Optional[float]): The timeout value for API requests
45
- in seconds. If None, no timeout is applied.
46
- (default: :obj:`None`)
47
- """
48
- super().__init__(timeout=timeout)
49
-
50
- def base64_to_image(self, base64_string: str) -> Optional[Image.Image]:
51
- r"""Converts a base64 encoded string into a PIL Image object.
52
-
53
- Args:
54
- base64_string (str): The base64 encoded string of the image.
55
-
56
- Returns:
57
- Optional[Image.Image]: The PIL Image object or None if conversion
58
- fails.
59
- """
60
- try:
61
- # Decode the base64 string to get the image data
62
- image_data = base64.b64decode(base64_string)
63
- # Create a memory buffer for the image data
64
- image_buffer = BytesIO(image_data)
65
- # Open the image using the PIL library
66
- image = Image.open(image_buffer)
67
- return image
68
- except Exception as e:
69
- error_msg = (
70
- f"An error occurred while converting base64 to image: {e}"
71
- )
72
- logger.error(error_msg)
73
- return None
74
-
75
- def image_path_to_base64(self, image_path: str) -> str:
76
- r"""Converts the file path of an image to a Base64 encoded string.
77
-
78
- Args:
79
- image_path (str): The path to the image file.
80
-
81
- Returns:
82
- str: A Base64 encoded string representing the content of the image
83
- file.
84
- """
85
- try:
86
- with open(image_path, "rb") as image_file:
87
- return base64.b64encode(image_file.read()).decode('utf-8')
88
- except Exception as e:
89
- error_msg = (
90
- f"An error occurred while converting image path to base64: {e}"
91
- )
92
- logger.error(error_msg)
93
- return error_msg
94
-
95
- def image_to_base64(self, image: Image.Image) -> str:
96
- r"""Converts an image into a base64-encoded string.
97
-
98
- This function takes an image object as input, encodes the image into a
99
- PNG format base64 string, and returns it.
100
- If the encoding process encounters an error, it prints the error
101
- message and returns None.
102
-
103
- Args:
104
- image: The image object to be encoded, supports any image format
105
- that can be saved in PNG format.
106
-
107
- Returns:
108
- str: A base64-encoded string of the image.
109
- """
110
- try:
111
- with BytesIO() as buffered_image:
112
- image.save(buffered_image, format="PNG")
113
- buffered_image.seek(0)
114
- image_bytes = buffered_image.read()
115
- base64_str = base64.b64encode(image_bytes).decode('utf-8')
116
- return base64_str
117
- except Exception as e:
118
- error_msg = f"An error occurred: {e}"
119
- logger.error(error_msg)
120
- return error_msg
121
-
122
- def get_dalle_img(self, prompt: str, image_dir: str = "img") -> str:
123
- r"""Generate an image using OpenAI's DALL-E model.
124
- The generated image is saved to the specified directory.
125
-
126
- Args:
127
- prompt (str): The text prompt based on which the image is
128
- generated.
129
- image_dir (str): The directory to save the generated image.
130
- Defaults to 'img'.
131
-
132
- Returns:
133
- str: The path to the saved image.
134
- """
135
-
136
- dalle_client = OpenAI()
137
- response = dalle_client.images.generate(
138
- model="dall-e-3",
139
- prompt=prompt,
140
- size="1024x1792",
141
- quality="standard",
142
- n=1, # NOTE: now dall-e-3 only supports n=1
143
- response_format="b64_json",
144
- )
145
- if response.data is None or len(response.data) == 0:
146
- error_msg = "No image data returned from DALL-E API."
147
- logger.error(error_msg)
148
- return error_msg
149
- image_b64 = response.data[0].b64_json
150
- image = self.base64_to_image(image_b64) # type: ignore[arg-type]
151
-
152
- if image is None:
153
- error_msg = "Failed to convert base64 string to image."
154
- logger.error(error_msg)
155
- return error_msg
156
-
157
- os.makedirs(image_dir, exist_ok=True)
158
- image_path = os.path.join(image_dir, f"{uuid.uuid4()}.png")
159
- image.save(image_path)
160
-
161
- return image_path
162
-
163
- def get_tools(self) -> List[FunctionTool]:
164
- r"""Returns a list of FunctionTool objects representing the
165
- functions in the toolkit.
166
-
167
- Returns:
168
- List[FunctionTool]: A list of FunctionTool objects
169
- representing the functions in the toolkit.
170
- """
171
- return [FunctionTool(self.get_dalle_img)]