camel-ai 0.2.65__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 (505) 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 +4835 -947
  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 +35 -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 +1 -3
  28. camel/benchmarks/mock_website/mock_web.py +2 -2
  29. camel/benchmarks/mock_website/requirements.txt +1 -1
  30. camel/benchmarks/mock_website/shopping_mall/app.py +2 -2
  31. camel/benchmarks/mock_website/task.json +1 -1
  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 +23 -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 +2 -2
  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 +2 -2
  52. camel/configs/cometapi_config.py +106 -0
  53. camel/configs/crynux_config.py +2 -2
  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 +2 -2
  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 +5 -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 +2 -2
  75. camel/configs/samba_config.py +6 -4
  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_collectors/__init__.py +2 -2
  84. camel/data_collectors/alpaca_collector.py +18 -9
  85. camel/data_collectors/base.py +2 -2
  86. camel/data_collectors/sharegpt_collector.py +2 -2
  87. camel/datagen/__init__.py +2 -2
  88. camel/datagen/cot_datagen.py +3 -3
  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 +12 -12
  92. camel/datagen/evol_instruct/templates.py +16 -16
  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 +2 -2
  113. camel/datasets/self_instruct_generator.py +2 -2
  114. camel/datasets/static_dataset.py +2 -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 +2 -2
  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 +2 -2
  124. camel/embeddings/together_embedding.py +2 -2
  125. camel/embeddings/vlm_embedding.py +2 -2
  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 +2 -2
  139. camel/interpreters/docker/Dockerfile +14 -24
  140. camel/interpreters/docker_interpreter.py +5 -4
  141. camel/interpreters/e2b_interpreter.py +36 -3
  142. camel/interpreters/internal_python_interpreter.py +53 -4
  143. camel/interpreters/interpreter_error.py +2 -2
  144. camel/interpreters/ipython_interpreter.py +2 -2
  145. camel/interpreters/microsandbox_interpreter.py +395 -0
  146. camel/interpreters/subprocess_interpreter.py +2 -2
  147. camel/loaders/__init__.py +13 -4
  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 +11 -2
  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 +2 -2
  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 +125 -7
  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 +90 -10
  170. camel/messages/__init__.py +2 -2
  171. camel/messages/base.py +178 -43
  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 +16 -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 +212 -89
  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 +16 -21
  192. camel/models/cometapi_model.py +83 -0
  193. camel/models/crynux_model.py +11 -18
  194. camel/models/deepseek_model.py +18 -58
  195. camel/models/fish_audio_model.py +8 -2
  196. camel/models/gemini_model.py +389 -26
  197. camel/models/groq_model.py +11 -19
  198. camel/models/internlm_model.py +11 -18
  199. camel/models/litellm_model.py +56 -34
  200. camel/models/lmstudio_model.py +17 -20
  201. camel/models/minimax_model.py +83 -0
  202. camel/models/mistral_model.py +18 -19
  203. camel/models/model_factory.py +37 -3
  204. camel/models/model_manager.py +26 -8
  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 +188 -45
  215. camel/models/openai_model.py +216 -71
  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 +21 -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 +48 -47
  227. camel/models/sglang_model.py +88 -40
  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 +7 -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 +3 -2
  262. camel/retrievers/base.py +2 -2
  263. camel/retrievers/bm25_retriever.py +2 -2
  264. camel/retrievers/cohere_rerank_retriever.py +2 -2
  265. camel/retrievers/hybrid_retrival.py +2 -2
  266. camel/retrievers/vector_retriever.py +2 -2
  267. camel/runtimes/Dockerfile.multi-toolkit +90 -0
  268. camel/runtimes/__init__.py +2 -2
  269. camel/runtimes/api.py +79 -23
  270. camel/runtimes/base.py +2 -2
  271. camel/runtimes/configs.py +13 -13
  272. camel/runtimes/daytona_runtime.py +17 -18
  273. camel/runtimes/docker_runtime.py +12 -12
  274. camel/runtimes/llm_guard_runtime.py +26 -26
  275. camel/runtimes/remote_http_runtime.py +11 -11
  276. camel/runtimes/ubuntu_docker_runtime.py +2 -2
  277. camel/runtimes/utils/__init__.py +2 -2
  278. camel/runtimes/utils/function_risk_toolkit.py +2 -2
  279. camel/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 +2 -2
  290. camel/societies/workforce/events.py +143 -0
  291. camel/societies/workforce/prompts.py +258 -33
  292. camel/societies/workforce/role_playing_worker.py +88 -31
  293. camel/societies/workforce/single_agent_worker.py +638 -40
  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 +780 -65
  297. camel/societies/workforce/worker.py +92 -26
  298. camel/societies/workforce/workflow_memory_manager.py +1746 -0
  299. camel/societies/workforce/workforce.py +5276 -355
  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 +6 -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 +8 -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 +2 -2
  324. camel/storages/vectordb_storages/milvus.py +2 -2
  325. camel/storages/vectordb_storages/oceanbase.py +15 -15
  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 +2 -2
  331. camel/tasks/__init__.py +2 -2
  332. camel/tasks/task.py +348 -26
  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 +54 -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 +4 -4
  343. camel/toolkits/audio_analysis_toolkit.py +3 -3
  344. camel/toolkits/base.py +65 -7
  345. camel/toolkits/bohrium_toolkit.py +2 -2
  346. camel/toolkits/browser_toolkit.py +34 -21
  347. camel/toolkits/browser_toolkit_commons.py +4 -4
  348. camel/toolkits/code_execution.py +31 -4
  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 +905 -71
  357. camel/toolkits/file_toolkit.py +1402 -0
  358. camel/toolkits/function_tool.py +126 -18
  359. camel/toolkits/github_toolkit.py +109 -22
  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 -6
  395. camel/toolkits/image_generation_toolkit.py +390 -0
  396. camel/toolkits/jina_reranker_toolkit.py +5 -6
  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 +412 -36
  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 +53 -53
  434. camel/toolkits/playwright_mcp_toolkit.py +13 -31
  435. camel/toolkits/pptx_toolkit.py +36 -23
  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 +5 -5
  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 +2 -2
  456. camel/toolkits/vertex_ai_veo_toolkit.py +590 -0
  457. camel/toolkits/video_analysis_toolkit.py +109 -29
  458. camel/toolkits/video_download_toolkit.py +19 -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 +2 -2
  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 +378 -39
  469. camel/types/mcp_registries.py +2 -2
  470. camel/types/openai_types.py +4 -4
  471. camel/types/unified_model_type.py +38 -6
  472. camel/utils/__init__.py +2 -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 +38 -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 +2 -2
  484. camel/utils/mcp.py +140 -6
  485. camel/utils/mcp_client.py +48 -38
  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.65.dist-info → camel_ai-0.2.82.dist-info}/METADATA +327 -94
  497. camel_ai-0.2.82.dist-info/RECORD +507 -0
  498. {camel_ai-0.2.65.dist-info → camel_ai-0.2.82.dist-info}/WHEEL +1 -1
  499. {camel_ai-0.2.65.dist-info → camel_ai-0.2.82.dist-info}/licenses/LICENSE +1 -1
  500. camel/loaders/pandas_reader.py +0 -368
  501. camel/toolkits/dalle_toolkit.py +0 -175
  502. camel/toolkits/file_write_toolkit.py +0 -444
  503. camel/toolkits/openai_agent_toolkit.py +0 -135
  504. camel/toolkits/terminal_toolkit.py +0 -1037
  505. camel_ai-0.2.65.dist-info/RECORD +0 -426
camel/tasks/task.py CHANGED
@@ -1,4 +1,4 @@
1
- # ========= Copyright 2023-2024 @ CAMEL-AI.org. All Rights Reserved. =========
1
+ # ========= Copyright 2023-2025 @ CAMEL-AI.org. All Rights Reserved. =========
2
2
  # Licensed under the Apache License, Version 2.0 (the "License");
3
3
  # you may not use this file except in compliance with the License.
4
4
  # You may obtain a copy of the License at
@@ -10,24 +10,164 @@
10
10
  # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
11
11
  # See the License for the specific language governing permissions and
12
12
  # limitations under the License.
13
- # ========= Copyright 2023-2024 @ CAMEL-AI.org. All Rights Reserved. =========
13
+ # ========= Copyright 2023-2025 @ CAMEL-AI.org. All Rights Reserved. =========
14
14
 
15
15
  import re
16
16
  from enum import Enum
17
- from typing import Any, Callable, Dict, List, Literal, Optional, Union
17
+ from types import GeneratorType
18
+ from typing import (
19
+ TYPE_CHECKING,
20
+ Any,
21
+ Callable,
22
+ Dict,
23
+ Generator,
24
+ Iterable,
25
+ List,
26
+ Literal,
27
+ Optional,
28
+ Union,
29
+ )
30
+
31
+ from PIL import Image
32
+ from pydantic import BaseModel, ConfigDict, Field
18
33
 
19
- from pydantic import BaseModel
34
+ if TYPE_CHECKING:
35
+ from camel.agents import ChatAgent
36
+ from camel.responses import ChatAgentResponse
37
+ import uuid
20
38
 
21
- from camel.agents import ChatAgent
39
+ from camel.logger import get_logger
22
40
  from camel.messages import BaseMessage
23
41
  from camel.prompts import TextPrompt
24
42
 
43
+ # Note: validate_task_content moved here to avoid circular imports
25
44
  from .task_prompt import (
26
45
  TASK_COMPOSE_PROMPT,
27
46
  TASK_DECOMPOSE_PROMPT,
28
47
  TASK_EVOLVE_PROMPT,
29
48
  )
30
49
 
50
+ logger = get_logger(__name__)
51
+
52
+
53
+ class TaskValidationMode(Enum):
54
+ r"""Validation modes for different use cases."""
55
+
56
+ INPUT = "input" # For validating task content before processing
57
+ OUTPUT = "output" # For validating task results after completion
58
+
59
+
60
+ def validate_task_content(
61
+ content: str,
62
+ task_id: str = "unknown",
63
+ min_length: int = 1,
64
+ mode: TaskValidationMode = TaskValidationMode.INPUT,
65
+ check_failure_patterns: bool = True,
66
+ ) -> bool:
67
+ r"""Unified validation for task content and results to avoid silent
68
+ failures. Performs comprehensive checks to ensure content meets quality
69
+ standards.
70
+
71
+ Args:
72
+ content (str): The task content or result to validate.
73
+ task_id (str): Task ID for logging purposes.
74
+ (default: :obj:`"unknown"`)
75
+ min_length (int): Minimum content length after stripping whitespace.
76
+ (default: :obj:`1`)
77
+ mode (TaskValidationMode): Validation mode - INPUT for task content,
78
+ OUTPUT for task results. (default: :obj:`TaskValidationMode.INPUT`)
79
+ check_failure_patterns (bool): Whether to check for failure indicators
80
+ in the content. Only effective in OUTPUT mode.
81
+ (default: :obj:`True`)
82
+
83
+ Returns:
84
+ bool: True if content passes validation, False otherwise.
85
+ """
86
+ # 1: Content must not be None
87
+ if content is None:
88
+ logger.warning(f"Task {task_id}: None content rejected")
89
+ return False
90
+
91
+ # 2: Content must not be empty after stripping whitespace
92
+ stripped_content = content.strip()
93
+ if not stripped_content:
94
+ logger.warning(
95
+ f"Task {task_id}: Empty or whitespace-only content rejected."
96
+ )
97
+ return False
98
+
99
+ # 3: Content must meet minimum meaningful length
100
+ if len(stripped_content) < min_length:
101
+ logger.warning(
102
+ f"Task {task_id}: Content too short ({len(stripped_content)} "
103
+ f"chars < {min_length} minimum). Content preview: "
104
+ f"'{stripped_content}'"
105
+ )
106
+ return False
107
+
108
+ # 4: For OUTPUT mode, check for failure patterns if enabled
109
+ if mode == TaskValidationMode.OUTPUT and check_failure_patterns:
110
+ content_lower = stripped_content.lower()
111
+
112
+ # Check for explicit failure indicators
113
+ failure_indicators = [
114
+ "i cannot complete",
115
+ "i cannot do",
116
+ "task failed",
117
+ "unable to complete",
118
+ "cannot be completed",
119
+ "failed to complete",
120
+ "i cannot",
121
+ "not possible",
122
+ "impossible to",
123
+ "cannot perform",
124
+ ]
125
+
126
+ if any(indicator in content_lower for indicator in failure_indicators):
127
+ logger.warning(
128
+ f"Task {task_id}: Failure indicator detected in result. "
129
+ f"Content preview: '{stripped_content}'"
130
+ )
131
+ return False
132
+
133
+ # Check for responses that are just error messages or refusals
134
+ if content_lower.startswith(("error", "failed", "cannot", "unable")):
135
+ logger.warning(
136
+ f"Task {task_id}: Error/refusal pattern detected at start. "
137
+ f"Content preview: '{stripped_content}'"
138
+ )
139
+ return False
140
+
141
+ # All validation checks passed
142
+ logger.debug(
143
+ f"Task {task_id}: {mode.value} validation passed "
144
+ f"({len(stripped_content)} chars)"
145
+ )
146
+ return True
147
+
148
+
149
+ def is_task_result_insufficient(task: "Task") -> bool:
150
+ r"""Check if a task result is insufficient and should be treated as failed.
151
+
152
+ This is a convenience wrapper around validate_task_content for backward
153
+ compatibility and semantic clarity when checking task results.
154
+
155
+ Args:
156
+ task (Task): The task to check.
157
+
158
+ Returns:
159
+ bool: True if the result is insufficient, False otherwise.
160
+ """
161
+ if not hasattr(task, 'result') or task.result is None:
162
+ return True
163
+
164
+ return not validate_task_content(
165
+ content=task.result,
166
+ task_id=task.id,
167
+ mode=TaskValidationMode.OUTPUT,
168
+ check_failure_patterns=True,
169
+ )
170
+
31
171
 
32
172
  def parse_response(
33
173
  response: str, task_id: Optional[str] = None
@@ -48,8 +188,17 @@ def parse_response(
48
188
  tasks = []
49
189
  if task_id is None:
50
190
  task_id = "0"
51
- for i, content in enumerate(tasks_content):
52
- tasks.append(Task(content=content.strip(), id=f"{task_id}.{i}"))
191
+ for i, content in enumerate(tasks_content, 1):
192
+ stripped_content = content.strip()
193
+ # validate subtask content before creating the task
194
+ if validate_task_content(stripped_content, f"{task_id}.{i}"):
195
+ tasks.append(Task(content=stripped_content, id=f"{task_id}.{i}"))
196
+ else:
197
+ logger.warning(
198
+ f"Skipping invalid subtask {task_id}.{i} "
199
+ f"during decomposition: "
200
+ f"Content '{stripped_content}' failed validation"
201
+ )
53
202
  return tasks
54
203
 
55
204
 
@@ -72,27 +221,42 @@ class Task(BaseModel):
72
221
  content (str): string content for task.
73
222
  id (str): An unique string identifier for the task. This should
74
223
  ideally be provided by the provider/model which created the task.
75
- (default: :obj: `""`)
224
+ (default: :obj:`uuid.uuid4()`)
76
225
  state (TaskState): The state which should be OPEN, RUNNING, DONE or
77
- DELETED. (default: :obj: `TaskState.OPEN`)
78
- type (Optional[str]): task type. (default: :obj: `None`)
226
+ DELETED. (default: :obj:`TaskState.FAILED`)
227
+ type (Optional[str]): task type. (default: :obj:`None`)
79
228
  parent (Optional[Task]): The parent task, None for root task.
80
- (default: :obj: `None`)
229
+ (default: :obj:`None`)
81
230
  subtasks (List[Task]): The childrent sub-tasks for the task.
82
- (default: :obj: `[]`)
231
+ (default: :obj:`[]`)
83
232
  result (Optional[str]): The answer for the task.
84
- (default: :obj: `""`)
233
+ (default: :obj:`""`)
85
234
  failure_count (int): The failure count for the task.
86
- (default: :obj: `0`)
235
+ (default: :obj:`0`)
236
+ assigned_worker_id (Optional[str]): The ID of the worker assigned to
237
+ this task. (default: :obj:`None`)
238
+ dependencies (List[Task]): The dependencies for the task.
239
+ (default: :obj:`[]`)
87
240
  additional_info (Optional[Dict[str, Any]]): Additional information for
88
- the task. (default: :obj: `None`)
241
+ the task. (default: :obj:`None`)
242
+ image_list (Optional[List[Union[Image.Image, str]]]): Optional list
243
+ of PIL Image objects or image URLs (strings) associated with the
244
+ task. (default: :obj:`None`)
245
+ image_detail (Literal["auto", "low", "high"]): Detail level of the
246
+ images associated with the task. (default: :obj:`auto`)
247
+ video_bytes (Optional[bytes]): Optional bytes of a video associated
248
+ with the task. (default: :obj:`None`)
249
+ video_detail (Literal["auto", "low", "high"]): Detail level of the
250
+ videos associated with the task. (default: :obj:`auto`)
89
251
  """
90
252
 
91
253
  content: str
92
254
 
93
- id: str = ""
255
+ id: str = Field(default_factory=lambda: str(uuid.uuid4()))
94
256
 
95
- state: TaskState = TaskState.OPEN
257
+ state: TaskState = (
258
+ TaskState.FAILED
259
+ ) # TODO: Add logic for OPEN in workforce.py
96
260
 
97
261
  type: Optional[str] = None
98
262
 
@@ -104,8 +268,22 @@ class Task(BaseModel):
104
268
 
105
269
  failure_count: int = 0
106
270
 
271
+ assigned_worker_id: Optional[str] = None
272
+
273
+ dependencies: List["Task"] = []
274
+
107
275
  additional_info: Optional[Dict[str, Any]] = None
108
276
 
277
+ image_list: Optional[List[Union[Image.Image, str]]] = None
278
+
279
+ image_detail: Literal["auto", "low", "high"] = "auto"
280
+
281
+ video_bytes: Optional[bytes] = None
282
+
283
+ video_detail: Literal["auto", "low", "high"] = "auto"
284
+
285
+ model_config = ConfigDict(arbitrary_types_allowed=True)
286
+
109
287
  def __repr__(self) -> str:
110
288
  r"""Return a string representation of the task."""
111
289
  content_preview = self.content
@@ -134,7 +312,9 @@ class Task(BaseModel):
134
312
 
135
313
  def reset(self):
136
314
  r"""Reset Task to initial state."""
137
- self.state = TaskState.OPEN
315
+ self.state = (
316
+ TaskState.FAILED
317
+ ) # TODO: Add logic for OPEN in workforce.py
138
318
  self.result = ""
139
319
 
140
320
  def update_result(self, result: str):
@@ -228,12 +408,15 @@ class Task(BaseModel):
228
408
 
229
409
  def decompose(
230
410
  self,
231
- agent: ChatAgent,
411
+ agent: "ChatAgent",
232
412
  prompt: Optional[str] = None,
233
413
  task_parser: Callable[[str, str], List["Task"]] = parse_response,
234
- ) -> List["Task"]:
235
- r"""Decompose a task to a list of sub-tasks. It can be used for data
236
- generation and planner of agent.
414
+ stream_callback: Optional[
415
+ Callable[["ChatAgentResponse"], None]
416
+ ] = None,
417
+ ) -> Union[List["Task"], Generator[List["Task"], None, None]]:
418
+ r"""Decompose a task to a list of sub-tasks. Automatically detects
419
+ streaming or non-streaming based on agent configuration.
237
420
 
238
421
  Args:
239
422
  agent (ChatAgent): An agent that used to decompose the task.
@@ -242,9 +425,16 @@ class Task(BaseModel):
242
425
  task_parser (Callable[[str, str], List[Task]], optional): A
243
426
  function to extract Task from response. If not provided,
244
427
  the default parse_response will be used.
428
+ stream_callback (Callable[[ChatAgentResponse], None], optional): A
429
+ callback function that receives each chunk (ChatAgentResponse)
430
+ during streaming. This allows tracking the decomposition
431
+ progress in real-time.
245
432
 
246
433
  Returns:
247
- List[Task]: A list of tasks which are :obj:`Task` instances.
434
+ Union[List[Task], Generator[List[Task], None, None]]: If agent is
435
+ configured for streaming, returns a generator that yields lists
436
+ of new tasks as they are parsed. Otherwise returns a list of
437
+ all tasks.
248
438
  """
249
439
 
250
440
  role_name = agent.role_name
@@ -256,14 +446,136 @@ class Task(BaseModel):
256
446
  role_name=role_name, content=content
257
447
  )
258
448
  response = agent.step(msg)
449
+
450
+ # Auto-detect streaming based on response type
451
+ from camel.agents.chat_agent import StreamingChatAgentResponse
452
+
453
+ is_streaming = isinstance(
454
+ response, StreamingChatAgentResponse
455
+ ) or isinstance(response, GeneratorType)
456
+ if (
457
+ not is_streaming
458
+ and hasattr(response, "__iter__")
459
+ and not hasattr(response, "msg")
460
+ ):
461
+ is_streaming = True
462
+
463
+ if is_streaming:
464
+ return self._decompose_streaming(
465
+ response, task_parser, stream_callback=stream_callback
466
+ )
467
+ return self._decompose_non_streaming(response, task_parser)
468
+
469
+ def _decompose_streaming(
470
+ self,
471
+ response: Iterable,
472
+ task_parser: Callable[[str, str], List["Task"]],
473
+ stream_callback: Optional[
474
+ Callable[["ChatAgentResponse"], None]
475
+ ] = None,
476
+ ) -> Generator[List["Task"], None, None]:
477
+ r"""Handle streaming response for task decomposition.
478
+
479
+ Args:
480
+ response: Streaming response from agent
481
+ task_parser: Function to parse tasks from response
482
+ stream_callback (Callable[[ChatAgentResponse], None], optional): A
483
+ callback function that receives each chunk (ChatAgentResponse)
484
+ during streaming.
485
+
486
+ Yields:
487
+ List[Task]: New tasks as they are parsed from streaming response
488
+ """
489
+ accumulated_content = ""
490
+ yielded_count = 0
491
+
492
+ # Process streaming response
493
+ for chunk in response:
494
+ accumulated_content = chunk.msg.content
495
+ if stream_callback:
496
+ try:
497
+ stream_callback(chunk)
498
+ except Exception:
499
+ logger.warning(
500
+ "stream_callback failed during decomposition",
501
+ exc_info=True,
502
+ )
503
+
504
+ # Try to parse partial tasks from accumulated content
505
+ try:
506
+ current_tasks = self._parse_partial_tasks(accumulated_content)
507
+
508
+ # Yield new tasks if we have more than previously yielded
509
+ if len(current_tasks) > yielded_count:
510
+ new_tasks = current_tasks[yielded_count:]
511
+ for task in new_tasks:
512
+ task.additional_info = self.additional_info
513
+ task.parent = self
514
+ yield new_tasks
515
+ yielded_count = len(current_tasks)
516
+
517
+ except Exception:
518
+ # If parsing fails, continue accumulating
519
+ continue
520
+
521
+ # Final complete parsing
522
+ final_tasks = task_parser(accumulated_content, self.id)
523
+ for task in final_tasks:
524
+ task.additional_info = self.additional_info
525
+ task.parent = self
526
+ self.subtasks = final_tasks
527
+
528
+ def _decompose_non_streaming(
529
+ self, response, task_parser: Callable[[str, str], List["Task"]]
530
+ ) -> List["Task"]:
531
+ r"""Handle non-streaming response for task decomposition.
532
+
533
+ Args:
534
+ response: Regular response from agent
535
+ task_parser: Function to parse tasks from response
536
+
537
+ Returns:
538
+ List[Task]: All parsed tasks
539
+ """
259
540
  tasks = task_parser(response.msg.content, self.id)
260
541
  for task in tasks:
261
542
  task.additional_info = self.additional_info
543
+ task.parent = self
544
+ self.subtasks = tasks
545
+ return tasks
546
+
547
+ def _parse_partial_tasks(self, response: str) -> List["Task"]:
548
+ r"""Parse tasks from potentially incomplete response.
549
+
550
+ Args:
551
+ response: Partial response content
552
+
553
+ Returns:
554
+ List[Task]: Tasks parsed from complete <task></task> blocks
555
+ """
556
+ pattern = r"<task>(.*?)</task>"
557
+ tasks_content = re.findall(pattern, response, re.DOTALL)
558
+
559
+ tasks = []
560
+ task_id = self.id or "0"
561
+
562
+ for i, content in enumerate(tasks_content, 1):
563
+ stripped_content = content.strip()
564
+ if validate_task_content(stripped_content, f"{task_id}.{i}"):
565
+ tasks.append(
566
+ Task(content=stripped_content, id=f"{task_id}.{i}")
567
+ )
568
+ else:
569
+ logger.warning(
570
+ f"Skipping invalid subtask {task_id}.{i} "
571
+ f"during streaming decomposition: "
572
+ f"Content '{stripped_content}' failed validation"
573
+ )
262
574
  return tasks
263
575
 
264
576
  def compose(
265
577
  self,
266
- agent: ChatAgent,
578
+ agent: "ChatAgent",
267
579
  template: TextPrompt = TASK_COMPOSE_PROMPT,
268
580
  result_parser: Optional[Callable[[str], str]] = None,
269
581
  ):
@@ -287,6 +599,10 @@ class Task(BaseModel):
287
599
  role_name=role_name,
288
600
  content=self.content,
289
601
  additional_info=self.additional_info,
602
+ image_list=self.image_list,
603
+ image_detail=self.image_detail,
604
+ video_bytes=self.video_bytes,
605
+ video_detail=self.video_detail,
290
606
  other_results=sub_tasks_result,
291
607
  )
292
608
  msg = BaseMessage.make_user_message(
@@ -412,12 +728,13 @@ class TaskManager:
412
728
  def evolve(
413
729
  self,
414
730
  task: Task,
415
- agent: ChatAgent,
731
+ agent: "ChatAgent",
416
732
  template: Optional[TextPrompt] = None,
417
733
  task_parser: Optional[Callable[[str, str], List[Task]]] = None,
418
734
  ) -> Optional[Task]:
419
735
  r"""Evolve a task to a new task.
420
736
  Evolve is only used for data generation.
737
+
421
738
  Args:
422
739
  task (Task): A given task.
423
740
  agent (ChatAgent): An agent that used to evolve the task.
@@ -436,7 +753,12 @@ class TaskManager:
436
753
  role_name = agent.role_name
437
754
  content = template.format(role_name=role_name, content=task.content)
438
755
  msg = BaseMessage.make_user_message(
439
- role_name=role_name, content=content
756
+ role_name=role_name,
757
+ content=content,
758
+ image_list=task.image_list,
759
+ image_detail=task.image_detail,
760
+ video_bytes=task.video_bytes,
761
+ video_detail=task.video_detail,
440
762
  )
441
763
  response = agent.step(msg)
442
764
  if task_parser is None:
@@ -1,4 +1,4 @@
1
- # ========= Copyright 2023-2024 @ CAMEL-AI.org. All Rights Reserved. =========
1
+ # ========= Copyright 2023-2025 @ CAMEL-AI.org. All Rights Reserved. =========
2
2
  # Licensed under the Apache License, Version 2.0 (the "License");
3
3
  # you may not use this file except in compliance with the License.
4
4
  # You may obtain a copy of the License at
@@ -10,7 +10,7 @@
10
10
  # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
11
11
  # See the License for the specific language governing permissions and
12
12
  # limitations under the License.
13
- # ========= Copyright 2023-2024 @ CAMEL-AI.org. All Rights Reserved. =========
13
+ # ========= Copyright 2023-2025 @ CAMEL-AI.org. All Rights Reserved. =========
14
14
  from camel.prompts import TextPrompt
15
15
 
16
16
  # ruff: noqa: E501
@@ -47,7 +47,7 @@ The related tasks result and status:
47
47
 
48
48
  {other_results}
49
49
 
50
- so, the final answer of the root task is:
50
+ so, the final answer of the root task is:
51
51
  """
52
52
  )
53
53
 
@@ -1,4 +1,4 @@
1
- # ========= Copyright 2023-2024 @ CAMEL-AI.org. All Rights Reserved. =========
1
+ # ========= Copyright 2023-2025 @ CAMEL-AI.org. All Rights Reserved. =========
2
2
  # Licensed under the Apache License, Version 2.0 (the "License");
3
3
  # you may not use this file except in compliance with the License.
4
4
  # You may obtain a copy of the License at
@@ -10,7 +10,7 @@
10
10
  # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
11
11
  # See the License for the specific language governing permissions and
12
12
  # limitations under the License.
13
- # ========= Copyright 2023-2024 @ CAMEL-AI.org. All Rights Reserved. =========
13
+ # ========= Copyright 2023-2025 @ CAMEL-AI.org. All Rights Reserved. =========
14
14
  from .base import BaseTerminator
15
15
  from .response_terminator import ResponseTerminator, ResponseWordsTerminator
16
16
  from .token_limit_terminator import TokenLimitTerminator
camel/terminators/base.py CHANGED
@@ -1,4 +1,4 @@
1
- # ========= Copyright 2023-2024 @ CAMEL-AI.org. All Rights Reserved. =========
1
+ # ========= Copyright 2023-2025 @ CAMEL-AI.org. All Rights Reserved. =========
2
2
  # Licensed under the Apache License, Version 2.0 (the "License");
3
3
  # you may not use this file except in compliance with the License.
4
4
  # You may obtain a copy of the License at
@@ -10,7 +10,7 @@
10
10
  # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
11
11
  # See the License for the specific language governing permissions and
12
12
  # limitations under the License.
13
- # ========= Copyright 2023-2024 @ CAMEL-AI.org. All Rights Reserved. =========
13
+ # ========= Copyright 2023-2025 @ CAMEL-AI.org. All Rights Reserved. =========
14
14
  from abc import ABC, abstractmethod
15
15
  from typing import List, Optional, Tuple
16
16
 
@@ -1,4 +1,4 @@
1
- # ========= Copyright 2023-2024 @ CAMEL-AI.org. All Rights Reserved. =========
1
+ # ========= Copyright 2023-2025 @ CAMEL-AI.org. All Rights Reserved. =========
2
2
  # Licensed under the Apache License, Version 2.0 (the "License");
3
3
  # you may not use this file except in compliance with the License.
4
4
  # You may obtain a copy of the License at
@@ -10,7 +10,7 @@
10
10
  # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
11
11
  # See the License for the specific language governing permissions and
12
12
  # limitations under the License.
13
- # ========= Copyright 2023-2024 @ CAMEL-AI.org. All Rights Reserved. =========
13
+ # ========= Copyright 2023-2025 @ CAMEL-AI.org. All Rights Reserved. =========
14
14
  from collections import defaultdict
15
15
  from typing import Dict, List, Optional, Tuple
16
16
 
@@ -1,4 +1,4 @@
1
- # ========= Copyright 2023-2024 @ CAMEL-AI.org. All Rights Reserved. =========
1
+ # ========= Copyright 2023-2025 @ CAMEL-AI.org. All Rights Reserved. =========
2
2
  # Licensed under the Apache License, Version 2.0 (the "License");
3
3
  # you may not use this file except in compliance with the License.
4
4
  # You may obtain a copy of the License at
@@ -10,7 +10,7 @@
10
10
  # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
11
11
  # See the License for the specific language governing permissions and
12
12
  # limitations under the License.
13
- # ========= Copyright 2023-2024 @ CAMEL-AI.org. All Rights Reserved. =========
13
+ # ========= Copyright 2023-2025 @ CAMEL-AI.org. All Rights Reserved. =========
14
14
  from typing import Optional, Tuple
15
15
 
16
16
  from camel.terminators.base import BaseTerminator