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
camel/tasks/__init__.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 .task import Task, TaskManager
15
15
  from .task_prompt import TASK_DECOMPOSE_PROMPT, TASK_EVOLVE_PROMPT
16
16
 
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 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
 
@@ -69,21 +218,45 @@ class Task(BaseModel):
69
218
  r"""Task is specific assignment that can be passed to a agent.
70
219
 
71
220
  Attributes:
72
- content: string content for task.
73
- id: An unique string identifier for the task. This should
74
- ideally be provided by the provider/model which created the task.
75
- state: The state which should be OPEN, RUNNING, DONE or DELETED.
76
- type: task type
77
- parent: The parent task, None for root task.
78
- subtasks: The childrent sub-tasks for the task.
79
- result: The answer for the task.
221
+ content (str): string content for task.
222
+ id (str): An unique string identifier for the task. This should
223
+ ideally be provided by the provider/model which created the task.
224
+ (default: :obj:`uuid.uuid4()`)
225
+ state (TaskState): The state which should be OPEN, RUNNING, DONE or
226
+ DELETED. (default: :obj:`TaskState.FAILED`)
227
+ type (Optional[str]): task type. (default: :obj:`None`)
228
+ parent (Optional[Task]): The parent task, None for root task.
229
+ (default: :obj:`None`)
230
+ subtasks (List[Task]): The childrent sub-tasks for the task.
231
+ (default: :obj:`[]`)
232
+ result (Optional[str]): The answer for the task.
233
+ (default: :obj:`""`)
234
+ failure_count (int): The failure count for the task.
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:`[]`)
240
+ additional_info (Optional[Dict[str, Any]]): Additional information for
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`)
80
251
  """
81
252
 
82
253
  content: str
83
254
 
84
- id: str = ""
255
+ id: str = Field(default_factory=lambda: str(uuid.uuid4()))
85
256
 
86
- state: TaskState = TaskState.OPEN
257
+ state: TaskState = (
258
+ TaskState.FAILED
259
+ ) # TODO: Add logic for OPEN in workforce.py
87
260
 
88
261
  type: Optional[str] = None
89
262
 
@@ -95,7 +268,29 @@ class Task(BaseModel):
95
268
 
96
269
  failure_count: int = 0
97
270
 
98
- additional_info: Optional[str] = None
271
+ assigned_worker_id: Optional[str] = None
272
+
273
+ dependencies: List["Task"] = []
274
+
275
+ additional_info: Optional[Dict[str, Any]] = None
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
+
287
+ def __repr__(self) -> str:
288
+ r"""Return a string representation of the task."""
289
+ content_preview = self.content
290
+ return (
291
+ f"Task(id='{self.id}', content='{content_preview}', "
292
+ f"state='{self.state.value}')"
293
+ )
99
294
 
100
295
  @classmethod
101
296
  def from_message(cls, message: BaseMessage) -> "Task":
@@ -117,7 +312,9 @@ class Task(BaseModel):
117
312
 
118
313
  def reset(self):
119
314
  r"""Reset Task to initial state."""
120
- self.state = TaskState.OPEN
315
+ self.state = (
316
+ TaskState.FAILED
317
+ ) # TODO: Add logic for OPEN in workforce.py
121
318
  self.result = ""
122
319
 
123
320
  def update_result(self, result: str):
@@ -211,12 +408,15 @@ class Task(BaseModel):
211
408
 
212
409
  def decompose(
213
410
  self,
214
- agent: ChatAgent,
411
+ agent: "ChatAgent",
215
412
  prompt: Optional[str] = None,
216
413
  task_parser: Callable[[str, str], List["Task"]] = parse_response,
217
- ) -> List["Task"]:
218
- r"""Decompose a task to a list of sub-tasks. It can be used for data
219
- 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.
220
420
 
221
421
  Args:
222
422
  agent (ChatAgent): An agent that used to decompose the task.
@@ -225,9 +425,16 @@ class Task(BaseModel):
225
425
  task_parser (Callable[[str, str], List[Task]], optional): A
226
426
  function to extract Task from response. If not provided,
227
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.
228
432
 
229
433
  Returns:
230
- 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.
231
438
  """
232
439
 
233
440
  role_name = agent.role_name
@@ -239,14 +446,136 @@ class Task(BaseModel):
239
446
  role_name=role_name, content=content
240
447
  )
241
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
+ """
242
540
  tasks = task_parser(response.msg.content, self.id)
243
541
  for task in tasks:
244
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
+ )
245
574
  return tasks
246
575
 
247
576
  def compose(
248
577
  self,
249
- agent: ChatAgent,
578
+ agent: "ChatAgent",
250
579
  template: TextPrompt = TASK_COMPOSE_PROMPT,
251
580
  result_parser: Optional[Callable[[str], str]] = None,
252
581
  ):
@@ -270,6 +599,10 @@ class Task(BaseModel):
270
599
  role_name=role_name,
271
600
  content=self.content,
272
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,
273
606
  other_results=sub_tasks_result,
274
607
  )
275
608
  msg = BaseMessage.make_user_message(
@@ -395,12 +728,13 @@ class TaskManager:
395
728
  def evolve(
396
729
  self,
397
730
  task: Task,
398
- agent: ChatAgent,
731
+ agent: "ChatAgent",
399
732
  template: Optional[TextPrompt] = None,
400
733
  task_parser: Optional[Callable[[str, str], List[Task]]] = None,
401
734
  ) -> Optional[Task]:
402
735
  r"""Evolve a task to a new task.
403
736
  Evolve is only used for data generation.
737
+
404
738
  Args:
405
739
  task (Task): A given task.
406
740
  agent (ChatAgent): An agent that used to evolve the task.
@@ -419,7 +753,12 @@ class TaskManager:
419
753
  role_name = agent.role_name
420
754
  content = template.format(role_name=role_name, content=task.content)
421
755
  msg = BaseMessage.make_user_message(
422
- 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,
423
762
  )
424
763
  response = agent.step(msg)
425
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