camel-ai 0.2.59__py3-none-any.whl → 0.2.82__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.

Potentially problematic release.


This version of camel-ai might be problematic. Click here for more details.

Files changed (506) hide show
  1. camel/__init__.py +3 -3
  2. camel/agents/__init__.py +2 -2
  3. camel/agents/_types.py +9 -4
  4. camel/agents/_utils.py +40 -2
  5. camel/agents/base.py +2 -2
  6. camel/agents/chat_agent.py +5012 -902
  7. camel/agents/critic_agent.py +2 -2
  8. camel/agents/deductive_reasoner_agent.py +56 -56
  9. camel/agents/embodied_agent.py +2 -2
  10. camel/agents/knowledge_graph_agent.py +20 -20
  11. camel/agents/mcp_agent.py +39 -36
  12. camel/agents/multi_hop_generator_agent.py +3 -3
  13. camel/agents/programmed_agent_instruction.py +2 -2
  14. camel/agents/repo_agent.py +4 -3
  15. camel/agents/role_assignment_agent.py +2 -2
  16. camel/agents/search_agent.py +2 -2
  17. camel/agents/task_agent.py +2 -2
  18. camel/agents/tool_agents/__init__.py +2 -2
  19. camel/agents/tool_agents/base.py +2 -2
  20. camel/agents/tool_agents/hugging_face_tool_agent.py +3 -3
  21. camel/benchmarks/__init__.py +2 -2
  22. camel/benchmarks/apibank.py +5 -5
  23. camel/benchmarks/apibench.py +2 -2
  24. camel/benchmarks/base.py +2 -2
  25. camel/benchmarks/browsecomp.py +44 -33
  26. camel/benchmarks/gaia.py +17 -13
  27. camel/benchmarks/mock_website/README.md +94 -0
  28. camel/benchmarks/mock_website/mock_web.py +299 -0
  29. camel/benchmarks/mock_website/requirements.txt +3 -0
  30. camel/benchmarks/mock_website/shopping_mall/app.py +465 -0
  31. camel/benchmarks/mock_website/task.json +104 -0
  32. camel/benchmarks/nexus.py +3 -3
  33. camel/benchmarks/ragbench.py +2 -2
  34. camel/bots/__init__.py +2 -2
  35. camel/bots/discord/__init__.py +2 -2
  36. camel/bots/discord/discord_app.py +2 -2
  37. camel/bots/discord/discord_installation.py +2 -2
  38. camel/bots/discord/discord_store.py +3 -3
  39. camel/bots/slack/__init__.py +2 -2
  40. camel/bots/slack/models.py +4 -4
  41. camel/bots/slack/slack_app.py +2 -2
  42. camel/bots/telegram_bot.py +2 -2
  43. camel/configs/__init__.py +26 -2
  44. camel/configs/aihubmix_config.py +90 -0
  45. camel/configs/aiml_config.py +2 -2
  46. camel/configs/amd_config.py +70 -0
  47. camel/configs/anthropic_config.py +8 -7
  48. camel/configs/base_config.py +2 -2
  49. camel/configs/bedrock_config.py +5 -3
  50. camel/configs/cerebras_config.py +98 -0
  51. camel/configs/cohere_config.py +3 -3
  52. camel/configs/cometapi_config.py +106 -0
  53. camel/configs/crynux_config.py +94 -0
  54. camel/configs/deepseek_config.py +9 -8
  55. camel/configs/gemini_config.py +6 -4
  56. camel/configs/groq_config.py +6 -4
  57. camel/configs/internlm_config.py +6 -4
  58. camel/configs/litellm_config.py +2 -2
  59. camel/configs/lmstudio_config.py +6 -4
  60. camel/configs/minimax_config.py +95 -0
  61. camel/configs/mistral_config.py +3 -3
  62. camel/configs/modelscope_config.py +5 -3
  63. camel/configs/moonshot_config.py +2 -2
  64. camel/configs/nebius_config.py +105 -0
  65. camel/configs/netmind_config.py +2 -2
  66. camel/configs/novita_config.py +2 -2
  67. camel/configs/nvidia_config.py +2 -2
  68. camel/configs/ollama_config.py +2 -2
  69. camel/configs/openai_config.py +8 -3
  70. camel/configs/openrouter_config.py +6 -4
  71. camel/configs/ppio_config.py +2 -2
  72. camel/configs/qianfan_config.py +85 -0
  73. camel/configs/qwen_config.py +2 -2
  74. camel/configs/reka_config.py +3 -3
  75. camel/configs/samba_config.py +8 -6
  76. camel/configs/sglang_config.py +2 -2
  77. camel/configs/siliconflow_config.py +2 -2
  78. camel/configs/togetherai_config.py +2 -2
  79. camel/configs/vllm_config.py +4 -2
  80. camel/configs/watsonx_config.py +2 -2
  81. camel/configs/yi_config.py +6 -4
  82. camel/configs/zhipuai_config.py +6 -4
  83. camel/{data_collector → data_collectors}/__init__.py +2 -2
  84. camel/{data_collector → data_collectors}/alpaca_collector.py +19 -10
  85. camel/{data_collector → data_collectors}/base.py +2 -2
  86. camel/{data_collector → data_collectors}/sharegpt_collector.py +3 -3
  87. camel/datagen/__init__.py +2 -2
  88. camel/datagen/cot_datagen.py +32 -37
  89. camel/datagen/evol_instruct/__init__.py +2 -2
  90. camel/datagen/evol_instruct/evol_instruct.py +2 -2
  91. camel/datagen/evol_instruct/scorer.py +24 -25
  92. camel/datagen/evol_instruct/templates.py +48 -48
  93. camel/datagen/self_improving_cot.py +5 -5
  94. camel/datagen/self_instruct/__init__.py +2 -2
  95. camel/datagen/self_instruct/filter/__init__.py +2 -2
  96. camel/datagen/self_instruct/filter/filter_function.py +2 -2
  97. camel/datagen/self_instruct/filter/filter_registry.py +2 -2
  98. camel/datagen/self_instruct/filter/instruction_filter.py +2 -2
  99. camel/datagen/self_instruct/self_instruct.py +2 -2
  100. camel/datagen/self_instruct/templates.py +47 -47
  101. camel/datagen/source2synth/__init__.py +2 -2
  102. camel/datagen/source2synth/data_processor.py +2 -2
  103. camel/datagen/source2synth/models.py +2 -2
  104. camel/datagen/source2synth/user_data_processor_config.py +2 -2
  105. camel/datahubs/__init__.py +2 -2
  106. camel/datahubs/base.py +2 -2
  107. camel/datahubs/huggingface.py +2 -2
  108. camel/datahubs/models.py +2 -2
  109. camel/datasets/__init__.py +2 -2
  110. camel/datasets/base_generator.py +41 -12
  111. camel/datasets/few_shot_generator.py +18 -18
  112. camel/datasets/models.py +3 -3
  113. camel/datasets/self_instruct_generator.py +2 -2
  114. camel/datasets/static_dataset.py +152 -2
  115. camel/embeddings/__init__.py +2 -2
  116. camel/embeddings/azure_embedding.py +2 -2
  117. camel/embeddings/base.py +2 -2
  118. camel/embeddings/gemini_embedding.py +2 -2
  119. camel/embeddings/jina_embedding.py +10 -3
  120. camel/embeddings/mistral_embedding.py +2 -2
  121. camel/embeddings/openai_compatible_embedding.py +2 -2
  122. camel/embeddings/openai_embedding.py +2 -2
  123. camel/embeddings/sentence_transformers_embeddings.py +4 -4
  124. camel/embeddings/together_embedding.py +2 -2
  125. camel/embeddings/vlm_embedding.py +11 -4
  126. camel/environments/__init__.py +14 -2
  127. camel/environments/models.py +2 -2
  128. camel/environments/multi_step.py +2 -2
  129. camel/environments/rlcards_env.py +860 -0
  130. camel/environments/single_step.py +30 -5
  131. camel/environments/tic_tac_toe.py +3 -3
  132. camel/extractors/__init__.py +2 -2
  133. camel/extractors/base.py +2 -2
  134. camel/extractors/python_strategies.py +2 -2
  135. camel/generators.py +2 -2
  136. camel/human.py +2 -2
  137. camel/interpreters/__init__.py +4 -2
  138. camel/interpreters/base.py +16 -3
  139. camel/interpreters/docker/Dockerfile +53 -7
  140. camel/interpreters/docker_interpreter.py +70 -11
  141. camel/interpreters/e2b_interpreter.py +59 -11
  142. camel/interpreters/internal_python_interpreter.py +81 -4
  143. camel/interpreters/interpreter_error.py +2 -2
  144. camel/interpreters/ipython_interpreter.py +23 -5
  145. camel/interpreters/microsandbox_interpreter.py +395 -0
  146. camel/interpreters/subprocess_interpreter.py +36 -4
  147. camel/loaders/__init__.py +17 -5
  148. camel/loaders/apify_reader.py +2 -2
  149. camel/loaders/base_io.py +2 -2
  150. camel/loaders/base_loader.py +85 -0
  151. camel/loaders/chunkr_reader.py +128 -93
  152. camel/loaders/crawl4ai_reader.py +2 -2
  153. camel/loaders/firecrawl_reader.py +6 -6
  154. camel/loaders/jina_url_reader.py +2 -2
  155. camel/loaders/markitdown.py +2 -2
  156. camel/loaders/mineru_extractor.py +2 -2
  157. camel/loaders/mistral_reader.py +148 -0
  158. camel/loaders/scrapegraph_reader.py +2 -2
  159. camel/loaders/unstructured_io.py +2 -2
  160. camel/logger.py +5 -5
  161. camel/memories/__init__.py +2 -2
  162. camel/memories/agent_memories.py +86 -3
  163. camel/memories/base.py +36 -2
  164. camel/memories/blocks/__init__.py +2 -2
  165. camel/memories/blocks/chat_history_block.py +126 -9
  166. camel/memories/blocks/vectordb_block.py +10 -3
  167. camel/memories/context_creators/__init__.py +2 -2
  168. camel/memories/context_creators/score_based.py +31 -239
  169. camel/memories/records.py +98 -13
  170. camel/messages/__init__.py +2 -2
  171. camel/messages/base.py +193 -46
  172. camel/messages/conversion/__init__.py +2 -2
  173. camel/messages/conversion/alpaca.py +2 -2
  174. camel/messages/conversion/conversation_models.py +2 -2
  175. camel/messages/conversion/sharegpt/__init__.py +2 -2
  176. camel/messages/conversion/sharegpt/function_call_formatter.py +2 -2
  177. camel/messages/conversion/sharegpt/hermes/__init__.py +2 -2
  178. camel/messages/conversion/sharegpt/hermes/hermes_function_formatter.py +2 -2
  179. camel/messages/func_message.py +54 -17
  180. camel/models/__init__.py +18 -2
  181. camel/models/_utils.py +3 -3
  182. camel/models/aihubmix_model.py +83 -0
  183. camel/models/aiml_model.py +11 -18
  184. camel/models/amd_model.py +101 -0
  185. camel/models/anthropic_model.py +127 -20
  186. camel/models/aws_bedrock_model.py +12 -35
  187. camel/models/azure_openai_model.py +263 -63
  188. camel/models/base_audio_model.py +5 -3
  189. camel/models/base_model.py +195 -26
  190. camel/models/cerebras_model.py +83 -0
  191. camel/models/cohere_model.py +81 -21
  192. camel/models/cometapi_model.py +83 -0
  193. camel/models/crynux_model.py +87 -0
  194. camel/models/deepseek_model.py +61 -59
  195. camel/models/fish_audio_model.py +8 -2
  196. camel/models/gemini_model.py +439 -30
  197. camel/models/groq_model.py +11 -19
  198. camel/models/internlm_model.py +11 -18
  199. camel/models/litellm_model.py +94 -34
  200. camel/models/lmstudio_model.py +17 -20
  201. camel/models/minimax_model.py +83 -0
  202. camel/models/mistral_model.py +84 -19
  203. camel/models/model_factory.py +49 -6
  204. camel/models/model_manager.py +33 -11
  205. camel/models/modelscope_model.py +13 -193
  206. camel/models/moonshot_model.py +195 -21
  207. camel/models/nebius_model.py +83 -0
  208. camel/models/nemotron_model.py +19 -9
  209. camel/models/netmind_model.py +11 -18
  210. camel/models/novita_model.py +11 -18
  211. camel/models/nvidia_model.py +11 -18
  212. camel/models/ollama_model.py +14 -21
  213. camel/models/openai_audio_models.py +2 -2
  214. camel/models/openai_compatible_model.py +234 -27
  215. camel/models/openai_model.py +255 -39
  216. camel/models/openrouter_model.py +11 -19
  217. camel/models/ppio_model.py +11 -18
  218. camel/models/qianfan_model.py +89 -0
  219. camel/models/qwen_model.py +13 -193
  220. camel/models/reka_model.py +90 -21
  221. camel/models/reward/__init__.py +2 -2
  222. camel/models/reward/base_reward_model.py +2 -2
  223. camel/models/reward/evaluator.py +2 -2
  224. camel/models/reward/nemotron_model.py +2 -2
  225. camel/models/reward/skywork_model.py +2 -2
  226. camel/models/samba_model.py +117 -49
  227. camel/models/sglang_model.py +162 -42
  228. camel/models/siliconflow_model.py +12 -35
  229. camel/models/stub_model.py +10 -7
  230. camel/models/togetherai_model.py +11 -18
  231. camel/models/vllm_model.py +10 -18
  232. camel/models/volcano_model.py +16 -20
  233. camel/models/watsonx_model.py +69 -19
  234. camel/models/yi_model.py +11 -18
  235. camel/models/zhipuai_model.py +70 -18
  236. camel/parsers/__init__.py +18 -0
  237. camel/parsers/mcp_tool_call_parser.py +176 -0
  238. camel/personas/__init__.py +2 -2
  239. camel/personas/persona.py +2 -2
  240. camel/personas/persona_hub.py +2 -2
  241. camel/prompts/__init__.py +2 -2
  242. camel/prompts/ai_society.py +2 -2
  243. camel/prompts/base.py +2 -2
  244. camel/prompts/code.py +2 -2
  245. camel/prompts/evaluation.py +2 -2
  246. camel/prompts/generate_text_embedding_data.py +2 -2
  247. camel/prompts/image_craft.py +2 -2
  248. camel/prompts/misalignment.py +2 -2
  249. camel/prompts/multi_condition_image_craft.py +2 -2
  250. camel/prompts/object_recognition.py +2 -2
  251. camel/prompts/persona_hub.py +3 -3
  252. camel/prompts/prompt_templates.py +2 -2
  253. camel/prompts/role_description_prompt_template.py +2 -2
  254. camel/prompts/solution_extraction.py +8 -8
  255. camel/prompts/task_prompt_template.py +2 -2
  256. camel/prompts/translation.py +2 -2
  257. camel/prompts/video_description_prompt.py +3 -3
  258. camel/responses/__init__.py +2 -2
  259. camel/responses/agent_responses.py +2 -2
  260. camel/retrievers/__init__.py +2 -2
  261. camel/retrievers/auto_retriever.py +23 -3
  262. camel/retrievers/base.py +2 -2
  263. camel/retrievers/bm25_retriever.py +3 -4
  264. camel/retrievers/cohere_rerank_retriever.py +2 -2
  265. camel/retrievers/hybrid_retrival.py +4 -4
  266. camel/retrievers/vector_retriever.py +2 -2
  267. camel/runtimes/Dockerfile.multi-toolkit +90 -0
  268. camel/{runtime → runtimes}/__init__.py +2 -2
  269. camel/runtimes/api.py +153 -0
  270. camel/{runtime → runtimes}/base.py +2 -2
  271. camel/{runtime → runtimes}/configs.py +13 -13
  272. camel/{runtime → runtimes}/daytona_runtime.py +18 -19
  273. camel/{runtime → runtimes}/docker_runtime.py +13 -13
  274. camel/{runtime → runtimes}/llm_guard_runtime.py +28 -28
  275. camel/{runtime → runtimes}/remote_http_runtime.py +12 -12
  276. camel/{runtime → runtimes}/ubuntu_docker_runtime.py +3 -3
  277. camel/{runtime → runtimes}/utils/__init__.py +2 -2
  278. camel/{runtime → runtimes}/utils/function_risk_toolkit.py +2 -2
  279. camel/{runtime → runtimes}/utils/ignore_risk_toolkit.py +2 -2
  280. camel/schemas/__init__.py +2 -2
  281. camel/schemas/base.py +2 -2
  282. camel/schemas/openai_converter.py +3 -3
  283. camel/schemas/outlines_converter.py +2 -2
  284. camel/services/agent_openapi_server.py +380 -0
  285. camel/societies/__init__.py +4 -2
  286. camel/societies/babyagi_playing.py +2 -2
  287. camel/societies/role_playing.py +201 -80
  288. camel/societies/workforce/__init__.py +10 -3
  289. camel/societies/workforce/base.py +9 -5
  290. camel/societies/workforce/events.py +143 -0
  291. camel/societies/workforce/prompts.py +258 -33
  292. camel/societies/workforce/role_playing_worker.py +95 -30
  293. camel/societies/workforce/single_agent_worker.py +659 -30
  294. camel/societies/workforce/structured_output_handler.py +512 -0
  295. camel/societies/workforce/task_channel.py +182 -38
  296. camel/societies/workforce/utils.py +784 -18
  297. camel/societies/workforce/worker.py +96 -28
  298. camel/societies/workforce/workflow_memory_manager.py +1746 -0
  299. camel/societies/workforce/workforce.py +5730 -366
  300. camel/societies/workforce/workforce_callback.py +103 -0
  301. camel/societies/workforce/workforce_logger.py +647 -0
  302. camel/societies/workforce/workforce_metrics.py +33 -0
  303. camel/storages/__init__.py +10 -2
  304. camel/storages/graph_storages/__init__.py +2 -2
  305. camel/storages/graph_storages/base.py +2 -2
  306. camel/storages/graph_storages/graph_element.py +2 -2
  307. camel/storages/graph_storages/nebula_graph.py +4 -4
  308. camel/storages/graph_storages/neo4j_graph.py +7 -7
  309. camel/storages/key_value_storages/__init__.py +2 -2
  310. camel/storages/key_value_storages/base.py +2 -2
  311. camel/storages/key_value_storages/in_memory.py +2 -2
  312. camel/storages/key_value_storages/json.py +17 -4
  313. camel/storages/key_value_storages/mem0_cloud.py +50 -49
  314. camel/storages/key_value_storages/redis.py +2 -2
  315. camel/storages/object_storages/__init__.py +2 -2
  316. camel/storages/object_storages/amazon_s3.py +2 -2
  317. camel/storages/object_storages/azure_blob.py +2 -2
  318. camel/storages/object_storages/base.py +2 -2
  319. camel/storages/object_storages/google_cloud.py +3 -3
  320. camel/storages/vectordb_storages/__init__.py +12 -2
  321. camel/storages/vectordb_storages/base.py +2 -2
  322. camel/storages/vectordb_storages/chroma.py +731 -0
  323. camel/storages/vectordb_storages/faiss.py +712 -0
  324. camel/storages/vectordb_storages/milvus.py +2 -2
  325. camel/storages/vectordb_storages/oceanbase.py +16 -17
  326. camel/storages/vectordb_storages/pgvector.py +349 -0
  327. camel/storages/vectordb_storages/qdrant.py +6 -6
  328. camel/storages/vectordb_storages/surreal.py +372 -0
  329. camel/storages/vectordb_storages/tidb.py +11 -8
  330. camel/storages/vectordb_storages/weaviate.py +714 -0
  331. camel/tasks/__init__.py +2 -2
  332. camel/tasks/task.py +366 -27
  333. camel/tasks/task_prompt.py +3 -3
  334. camel/terminators/__init__.py +2 -2
  335. camel/terminators/base.py +2 -2
  336. camel/terminators/response_terminator.py +2 -2
  337. camel/terminators/token_limit_terminator.py +2 -2
  338. camel/toolkits/__init__.py +58 -10
  339. camel/toolkits/aci_toolkit.py +66 -21
  340. camel/toolkits/arxiv_toolkit.py +8 -8
  341. camel/toolkits/ask_news_toolkit.py +2 -2
  342. camel/toolkits/async_browser_toolkit.py +174 -575
  343. camel/toolkits/audio_analysis_toolkit.py +3 -3
  344. camel/toolkits/base.py +65 -7
  345. camel/toolkits/bohrium_toolkit.py +318 -0
  346. camel/toolkits/browser_toolkit.py +306 -566
  347. camel/toolkits/browser_toolkit_commons.py +568 -0
  348. camel/toolkits/code_execution.py +67 -11
  349. camel/toolkits/context_summarizer_toolkit.py +684 -0
  350. camel/toolkits/craw4ai_toolkit.py +93 -0
  351. camel/toolkits/dappier_toolkit.py +12 -8
  352. camel/toolkits/data_commons_toolkit.py +2 -2
  353. camel/toolkits/dingtalk.py +1135 -0
  354. camel/toolkits/earth_science_toolkit.py +5367 -0
  355. camel/toolkits/edgeone_pages_mcp_toolkit.py +49 -0
  356. camel/toolkits/excel_toolkit.py +910 -70
  357. camel/toolkits/file_toolkit.py +1402 -0
  358. camel/toolkits/function_tool.py +128 -20
  359. camel/toolkits/github_toolkit.py +148 -43
  360. camel/toolkits/gmail_toolkit.py +1839 -0
  361. camel/toolkits/google_calendar_toolkit.py +40 -6
  362. camel/toolkits/google_drive_mcp_toolkit.py +54 -0
  363. camel/toolkits/google_maps_toolkit.py +2 -2
  364. camel/toolkits/google_scholar_toolkit.py +2 -2
  365. camel/toolkits/human_toolkit.py +36 -12
  366. camel/toolkits/hybrid_browser_toolkit/__init__.py +18 -0
  367. camel/toolkits/hybrid_browser_toolkit/config_loader.py +185 -0
  368. camel/toolkits/hybrid_browser_toolkit/hybrid_browser_toolkit.py +246 -0
  369. camel/toolkits/hybrid_browser_toolkit/hybrid_browser_toolkit_ts.py +1973 -0
  370. camel/toolkits/hybrid_browser_toolkit/installer.py +203 -0
  371. camel/toolkits/hybrid_browser_toolkit/ts/package-lock.json +4589 -0
  372. camel/toolkits/hybrid_browser_toolkit/ts/package.json +33 -0
  373. camel/toolkits/hybrid_browser_toolkit/ts/src/browser-scripts.js +125 -0
  374. camel/toolkits/hybrid_browser_toolkit/ts/src/browser-session.ts +1929 -0
  375. camel/toolkits/hybrid_browser_toolkit/ts/src/config-loader.ts +233 -0
  376. camel/toolkits/hybrid_browser_toolkit/ts/src/hybrid-browser-toolkit.ts +589 -0
  377. camel/toolkits/hybrid_browser_toolkit/ts/src/index.ts +7 -0
  378. camel/toolkits/hybrid_browser_toolkit/ts/src/parent-child-filter.ts +226 -0
  379. camel/toolkits/hybrid_browser_toolkit/ts/src/snapshot-parser.ts +219 -0
  380. camel/toolkits/hybrid_browser_toolkit/ts/src/som-screenshot-injected.ts +543 -0
  381. camel/toolkits/hybrid_browser_toolkit/ts/src/types.ts +129 -0
  382. camel/toolkits/hybrid_browser_toolkit/ts/tsconfig.json +27 -0
  383. camel/toolkits/hybrid_browser_toolkit/ts/websocket-server.js +319 -0
  384. camel/toolkits/hybrid_browser_toolkit/ws_wrapper.py +1037 -0
  385. camel/toolkits/hybrid_browser_toolkit_py/__init__.py +17 -0
  386. camel/toolkits/hybrid_browser_toolkit_py/actions.py +575 -0
  387. camel/toolkits/hybrid_browser_toolkit_py/agent.py +311 -0
  388. camel/toolkits/hybrid_browser_toolkit_py/browser_session.py +787 -0
  389. camel/toolkits/hybrid_browser_toolkit_py/config_loader.py +490 -0
  390. camel/toolkits/hybrid_browser_toolkit_py/hybrid_browser_toolkit.py +2390 -0
  391. camel/toolkits/hybrid_browser_toolkit_py/snapshot.py +233 -0
  392. camel/toolkits/hybrid_browser_toolkit_py/stealth_script.js +0 -0
  393. camel/toolkits/hybrid_browser_toolkit_py/unified_analyzer.js +1043 -0
  394. camel/toolkits/image_analysis_toolkit.py +3 -3
  395. camel/toolkits/image_generation_toolkit.py +390 -0
  396. camel/toolkits/jina_reranker_toolkit.py +195 -79
  397. camel/toolkits/klavis_toolkit.py +7 -3
  398. camel/toolkits/linkedin_toolkit.py +2 -2
  399. camel/toolkits/markitdown_toolkit.py +104 -0
  400. camel/toolkits/math_toolkit.py +66 -12
  401. camel/toolkits/mcp_toolkit.py +841 -600
  402. camel/toolkits/memory_toolkit.py +7 -3
  403. camel/toolkits/meshy_toolkit.py +2 -2
  404. camel/toolkits/message_agent_toolkit.py +608 -0
  405. camel/toolkits/message_integration.py +724 -0
  406. camel/toolkits/mineru_toolkit.py +2 -2
  407. camel/toolkits/minimax_mcp_toolkit.py +195 -0
  408. camel/toolkits/networkx_toolkit.py +2 -2
  409. camel/toolkits/note_taking_toolkit.py +277 -0
  410. camel/toolkits/notion_mcp_toolkit.py +224 -0
  411. camel/toolkits/notion_toolkit.py +2 -2
  412. camel/toolkits/open_api_specs/biztoc/__init__.py +2 -2
  413. camel/toolkits/open_api_specs/biztoc/ai-plugin.json +1 -1
  414. camel/toolkits/open_api_specs/coursera/__init__.py +2 -2
  415. camel/toolkits/open_api_specs/create_qr_code/__init__.py +2 -2
  416. camel/toolkits/open_api_specs/klarna/__init__.py +2 -2
  417. camel/toolkits/open_api_specs/nasa_apod/__init__.py +2 -2
  418. camel/toolkits/open_api_specs/outschool/__init__.py +2 -2
  419. camel/toolkits/open_api_specs/outschool/ai-plugin.json +1 -1
  420. camel/toolkits/open_api_specs/outschool/openapi.yaml +1 -1
  421. camel/toolkits/open_api_specs/outschool/paths/__init__.py +2 -2
  422. camel/toolkits/open_api_specs/outschool/paths/get_classes.py +2 -2
  423. camel/toolkits/open_api_specs/outschool/paths/search_teachers.py +2 -2
  424. camel/toolkits/open_api_specs/security_config.py +2 -2
  425. camel/toolkits/open_api_specs/speak/__init__.py +2 -2
  426. camel/toolkits/open_api_specs/web_scraper/__init__.py +2 -2
  427. camel/toolkits/open_api_specs/web_scraper/ai-plugin.json +1 -1
  428. camel/toolkits/open_api_specs/web_scraper/paths/__init__.py +2 -2
  429. camel/toolkits/open_api_specs/web_scraper/paths/scraper.py +2 -2
  430. camel/toolkits/open_api_toolkit.py +2 -2
  431. camel/toolkits/openbb_toolkit.py +7 -3
  432. camel/toolkits/origene_mcp_toolkit.py +56 -0
  433. camel/toolkits/page_script.js +86 -74
  434. camel/toolkits/playwright_mcp_toolkit.py +27 -32
  435. camel/toolkits/pptx_toolkit.py +790 -0
  436. camel/toolkits/pubmed_toolkit.py +2 -2
  437. camel/toolkits/pulse_mcp_search_toolkit.py +2 -2
  438. camel/toolkits/pyautogui_toolkit.py +2 -2
  439. camel/toolkits/reddit_toolkit.py +2 -2
  440. camel/toolkits/resend_toolkit.py +168 -0
  441. camel/toolkits/retrieval_toolkit.py +2 -2
  442. camel/toolkits/screenshot_toolkit.py +213 -0
  443. camel/toolkits/search_toolkit.py +539 -146
  444. camel/toolkits/searxng_toolkit.py +2 -2
  445. camel/toolkits/semantic_scholar_toolkit.py +2 -2
  446. camel/toolkits/slack_toolkit.py +108 -58
  447. camel/toolkits/sql_toolkit.py +712 -0
  448. camel/toolkits/stripe_toolkit.py +2 -2
  449. camel/toolkits/sympy_toolkit.py +3 -3
  450. camel/toolkits/task_planning_toolkit.py +134 -0
  451. camel/toolkits/terminal_toolkit/__init__.py +18 -0
  452. camel/toolkits/terminal_toolkit/terminal_toolkit.py +1070 -0
  453. camel/toolkits/terminal_toolkit/utils.py +532 -0
  454. camel/toolkits/thinking_toolkit.py +3 -3
  455. camel/toolkits/twitter_toolkit.py +8 -3
  456. camel/toolkits/vertex_ai_veo_toolkit.py +590 -0
  457. camel/toolkits/video_analysis_toolkit.py +112 -29
  458. camel/toolkits/video_download_toolkit.py +22 -16
  459. camel/toolkits/weather_toolkit.py +2 -2
  460. camel/toolkits/web_deploy_toolkit.py +1219 -0
  461. camel/toolkits/wechat_official_toolkit.py +483 -0
  462. camel/toolkits/whatsapp_toolkit.py +2 -2
  463. camel/toolkits/wolfram_alpha_toolkit.py +53 -25
  464. camel/toolkits/zapier_toolkit.py +7 -3
  465. camel/types/__init__.py +4 -4
  466. camel/types/agents/__init__.py +2 -2
  467. camel/types/agents/tool_calling_record.py +6 -3
  468. camel/types/enums.py +454 -35
  469. camel/types/mcp_registries.py +2 -2
  470. camel/types/openai_types.py +4 -4
  471. camel/types/unified_model_type.py +43 -6
  472. camel/utils/__init__.py +20 -2
  473. camel/utils/async_func.py +2 -2
  474. camel/utils/chunker/__init__.py +2 -2
  475. camel/utils/chunker/base.py +2 -2
  476. camel/utils/chunker/code_chunker.py +2 -2
  477. camel/utils/chunker/uio_chunker.py +2 -2
  478. camel/utils/commons.py +65 -7
  479. camel/utils/constants.py +5 -2
  480. camel/utils/context_utils.py +1134 -0
  481. camel/utils/deduplication.py +2 -2
  482. camel/utils/filename.py +2 -2
  483. camel/utils/langfuse.py +258 -0
  484. camel/utils/mcp.py +140 -6
  485. camel/utils/mcp_client.py +1056 -0
  486. camel/utils/message_summarizer.py +148 -0
  487. camel/utils/response_format.py +2 -2
  488. camel/utils/token_counting.py +45 -22
  489. camel/utils/tool_result.py +44 -0
  490. camel/verifiers/__init__.py +2 -2
  491. camel/verifiers/base.py +2 -2
  492. camel/verifiers/math_verifier.py +2 -2
  493. camel/verifiers/models.py +2 -2
  494. camel/verifiers/physics_verifier.py +2 -2
  495. camel/verifiers/python_verifier.py +2 -2
  496. {camel_ai-0.2.59.dist-info → camel_ai-0.2.82.dist-info}/METADATA +349 -108
  497. camel_ai-0.2.82.dist-info/RECORD +507 -0
  498. {camel_ai-0.2.59.dist-info → camel_ai-0.2.82.dist-info}/WHEEL +1 -1
  499. {camel_ai-0.2.59.dist-info → camel_ai-0.2.82.dist-info}/licenses/LICENSE +1 -1
  500. camel/loaders/pandas_reader.py +0 -368
  501. camel/runtime/api.py +0 -97
  502. camel/toolkits/dalle_toolkit.py +0 -171
  503. camel/toolkits/file_write_toolkit.py +0 -395
  504. camel/toolkits/openai_agent_toolkit.py +0 -135
  505. camel/toolkits/terminal_toolkit.py +0 -1037
  506. camel_ai-0.2.59.dist-info/RECORD +0 -410
@@ -1,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
  import logging
15
15
  import threading
16
16
  from typing import Dict, List, Optional, Sequence, Tuple, Union
@@ -62,8 +62,8 @@ class RolePlaying:
62
62
  (default: :obj:`TaskType.AI_SOCIETY`)
63
63
  assistant_agent_kwargs (Dict, optional): Additional arguments to pass
64
64
  to the assistant agent. (default: :obj:`None`)
65
- user_agent_kwargs (Dict, optional): Additional arguments to pass to
66
- the user agent. (default: :obj:`None`)
65
+ user_agent_kwargs (Dict, optional): Additional arguments to pass to the
66
+ user agent. (default: :obj:`None`)
67
67
  task_specify_agent_kwargs (Dict, optional): Additional arguments to
68
68
  pass to the task specify agent. (default: :obj:`None`)
69
69
  task_planner_agent_kwargs (Dict, optional): Additional arguments to
@@ -81,6 +81,12 @@ class RolePlaying:
81
81
  stop_event (Optional[threading.Event], optional): Event to signal
82
82
  termination of the agent's operation. When set, the agent will
83
83
  terminate its execution. (default: :obj:`None`)
84
+ assistant_agent (ChatAgent, optional): A pre-configured ChatAgent to
85
+ use as the assistant. If provided, this will override the creation
86
+ of a new assistant agent. (default: :obj:`None`)
87
+ user_agent (ChatAgent, optional): A pre-configured ChatAgent to use as
88
+ the user. If provided, this will override the creation of a new
89
+ user agent. (default: :obj:`None`)
84
90
  """
85
91
 
86
92
  def __init__(
@@ -106,6 +112,8 @@ class RolePlaying:
106
112
  extend_task_specify_meta_dict: Optional[Dict] = None,
107
113
  output_language: Optional[str] = None,
108
114
  stop_event: Optional[threading.Event] = None,
115
+ assistant_agent: Optional[ChatAgent] = None,
116
+ user_agent: Optional[ChatAgent] = None,
109
117
  ) -> None:
110
118
  if model is not None:
111
119
  logger.warning(
@@ -143,21 +151,45 @@ class RolePlaying:
143
151
  **(sys_msg_generator_kwargs or {}),
144
152
  )
145
153
 
146
- (
147
- init_assistant_sys_msg,
148
- init_user_sys_msg,
149
- sys_msg_meta_dicts,
150
- ) = self._get_sys_message_info(
151
- assistant_role_name,
152
- user_role_name,
153
- sys_msg_generator,
154
- extend_sys_msg_meta_dicts=extend_sys_msg_meta_dicts,
155
- )
156
-
154
+ # Initialize agent attributes first
157
155
  self.assistant_agent: ChatAgent
158
156
  self.user_agent: ChatAgent
159
- self.assistant_sys_msg: Optional[BaseMessage]
160
- self.user_sys_msg: Optional[BaseMessage]
157
+ self.assistant_sys_msg: Optional[BaseMessage] = None
158
+ self.user_sys_msg: Optional[BaseMessage] = None
159
+
160
+ # Determine if we need to generate system messages
161
+ if assistant_agent is None or user_agent is None:
162
+ # Generate system messages for missing agents
163
+ (
164
+ init_assistant_sys_msg,
165
+ init_user_sys_msg,
166
+ sys_msg_meta_dicts,
167
+ ) = self._get_sys_message_info(
168
+ assistant_role_name,
169
+ user_role_name,
170
+ sys_msg_generator,
171
+ extend_sys_msg_meta_dicts=extend_sys_msg_meta_dicts,
172
+ )
173
+ else:
174
+ # When both agents are provided, use their existing system messages
175
+ assistant_sys_msg = assistant_agent.system_message
176
+ user_sys_msg = user_agent.system_message
177
+
178
+ # Ensure system messages are not None
179
+ if assistant_sys_msg is None:
180
+ raise ValueError(
181
+ "Provided assistant_agent has None system_message"
182
+ )
183
+ if user_sys_msg is None:
184
+ raise ValueError("Provided user_agent has None system_message")
185
+
186
+ init_assistant_sys_msg = assistant_sys_msg
187
+ init_user_sys_msg = user_sys_msg
188
+ # Create a default sys_msg_meta_dicts for critic initialization
189
+ sys_msg_meta_dicts = [
190
+ dict(task=self.task_prompt) for _ in range(2)
191
+ ]
192
+
161
193
  self._init_agents(
162
194
  init_assistant_sys_msg,
163
195
  init_user_sys_msg,
@@ -165,7 +197,10 @@ class RolePlaying:
165
197
  user_agent_kwargs=user_agent_kwargs,
166
198
  output_language=output_language,
167
199
  stop_event=stop_event,
200
+ assistant_agent=assistant_agent,
201
+ user_agent=user_agent,
168
202
  )
203
+
169
204
  self.critic: Optional[Union[CriticAgent, Human]] = None
170
205
  self.critic_sys_msg: Optional[BaseMessage] = None
171
206
  self._init_critic(
@@ -320,20 +355,22 @@ class RolePlaying:
320
355
 
321
356
  def _init_agents(
322
357
  self,
323
- init_assistant_sys_msg: BaseMessage,
324
- init_user_sys_msg: BaseMessage,
358
+ init_assistant_sys_msg: Optional[BaseMessage],
359
+ init_user_sys_msg: Optional[BaseMessage],
325
360
  assistant_agent_kwargs: Optional[Dict] = None,
326
361
  user_agent_kwargs: Optional[Dict] = None,
327
362
  output_language: Optional[str] = None,
328
363
  stop_event: Optional[threading.Event] = None,
364
+ assistant_agent: Optional[ChatAgent] = None,
365
+ user_agent: Optional[ChatAgent] = None,
329
366
  ) -> None:
330
367
  r"""Initialize assistant and user agents with their system messages.
331
368
 
332
369
  Args:
333
- init_assistant_sys_msg (BaseMessage): Assistant agent's initial
370
+ init_assistant_sys_msg (Optional[BaseMessage]): Assistant agent's
371
+ initial system message.
372
+ init_user_sys_msg (Optional[BaseMessage]): User agent's initial
334
373
  system message.
335
- init_user_sys_msg (BaseMessage): User agent's initial system
336
- message.
337
374
  assistant_agent_kwargs (Dict, optional): Additional arguments to
338
375
  pass to the assistant agent. (default: :obj:`None`)
339
376
  user_agent_kwargs (Dict, optional): Additional arguments to
@@ -343,6 +380,12 @@ class RolePlaying:
343
380
  stop_event (Optional[threading.Event], optional): Event to signal
344
381
  termination of the agent's operation. When set, the agent will
345
382
  terminate its execution. (default: :obj:`None`)
383
+ assistant_agent (ChatAgent, optional): A pre-configured ChatAgent
384
+ to use as the assistant. If provided, this will override the
385
+ creation of a new assistant agent. (default: :obj:`None`)
386
+ user_agent (ChatAgent, optional): A pre-configured ChatAgent to use
387
+ as the user. If provided, this will override the creation of a
388
+ new user agent. (default: :obj:`None`)
346
389
  """
347
390
  if self.model is not None:
348
391
  if assistant_agent_kwargs is None:
@@ -354,21 +397,71 @@ class RolePlaying:
354
397
  elif 'model' not in user_agent_kwargs:
355
398
  user_agent_kwargs.update(dict(model=self.model))
356
399
 
357
- self.assistant_agent = ChatAgent(
358
- init_assistant_sys_msg,
359
- output_language=output_language,
360
- stop_event=stop_event,
361
- **(assistant_agent_kwargs or {}),
362
- )
363
- self.assistant_sys_msg = self.assistant_agent.system_message
364
-
365
- self.user_agent = ChatAgent(
366
- init_user_sys_msg,
367
- output_language=output_language,
368
- stop_event=stop_event,
369
- **(user_agent_kwargs or {}),
370
- )
371
- self.user_sys_msg = self.user_agent.system_message
400
+ # Use provided assistant agent if available, otherwise create a new one
401
+ if assistant_agent is not None:
402
+ # Ensure functionality consistent with our configuration
403
+ if (
404
+ hasattr(assistant_agent, 'output_language')
405
+ and output_language is not None
406
+ ):
407
+ assistant_agent.output_language = output_language
408
+ if hasattr(assistant_agent, 'stop_event'):
409
+ assistant_agent.stop_event = stop_event
410
+ self.assistant_agent = assistant_agent
411
+ # Handle potential None system_message - use provided or fallback
412
+ if assistant_agent.system_message is not None:
413
+ self.assistant_sys_msg = assistant_agent.system_message
414
+ elif init_assistant_sys_msg is not None:
415
+ self.assistant_sys_msg = init_assistant_sys_msg
416
+ else:
417
+ raise ValueError("Assistant system message cannot be None")
418
+ else:
419
+ # Create new assistant agent
420
+ if init_assistant_sys_msg is None:
421
+ raise ValueError(
422
+ "Assistant system message cannot be None when creating "
423
+ "new agent"
424
+ )
425
+ self.assistant_agent = ChatAgent(
426
+ init_assistant_sys_msg,
427
+ output_language=output_language,
428
+ stop_event=stop_event,
429
+ **(assistant_agent_kwargs or {}),
430
+ )
431
+ self.assistant_sys_msg = self.assistant_agent.system_message
432
+
433
+ # Use provided user agent if available, otherwise create a new one
434
+ if user_agent is not None:
435
+ # Ensure functionality consistent with our configuration
436
+ if (
437
+ hasattr(user_agent, 'output_language')
438
+ and output_language is not None
439
+ ):
440
+ user_agent.output_language = output_language
441
+ if hasattr(user_agent, 'stop_event'):
442
+ user_agent.stop_event = stop_event
443
+ self.user_agent = user_agent
444
+ # Handle potential None system_message - use provided or fallback
445
+ if user_agent.system_message is not None:
446
+ self.user_sys_msg = user_agent.system_message
447
+ elif init_user_sys_msg is not None:
448
+ self.user_sys_msg = init_user_sys_msg
449
+ else:
450
+ raise ValueError("User system message cannot be None")
451
+ else:
452
+ # Create new user agent
453
+ if init_user_sys_msg is None:
454
+ raise ValueError(
455
+ "User system message cannot be None when creating new "
456
+ "agent"
457
+ )
458
+ self.user_agent = ChatAgent(
459
+ init_user_sys_msg,
460
+ output_language=output_language,
461
+ stop_event=stop_event,
462
+ **(user_agent_kwargs or {}),
463
+ )
464
+ self.user_sys_msg = self.user_agent.system_message
372
465
 
373
466
  def _init_critic(
374
467
  self,
@@ -389,7 +482,7 @@ class RolePlaying:
389
482
  sys_msg_meta_dicts (list): A list of system message meta dicts.
390
483
  critic_role_name (str): The name of the role played by the critic.
391
484
  critic_criteria (str, optional): Critic criteria for the
392
- critic agent. If not specified, set the criteria to
485
+ critic agent. If not specified, set it to
393
486
  improve task performance. (default: :obj:`None`)
394
487
  critic_kwargs (Dict, optional): Additional arguments to
395
488
  pass to the critic. (default: :obj:`None`)
@@ -465,20 +558,28 @@ class RolePlaying:
465
558
  BaseMessage: A single `BaseMessage` representing the initial
466
559
  message.
467
560
  """
468
- self.assistant_agent.reset()
469
- self.user_agent.reset()
561
+ if self.assistant_agent is not None:
562
+ self.assistant_agent.reset()
563
+ if self.user_agent is not None:
564
+ self.user_agent.reset()
470
565
  default_init_msg_content = (
471
566
  "Now start to give me instructions one by one. "
472
567
  "Only reply with Instruction and Input."
473
568
  )
474
- if init_msg_content is None:
475
- init_msg_content = default_init_msg_content
569
+ final_init_msg_content = init_msg_content or default_init_msg_content
476
570
 
477
571
  # Initialize a message sent by the assistant
572
+ assistant_role_name = "assistant"
573
+ if self.assistant_sys_msg is not None and hasattr(
574
+ self.assistant_sys_msg, 'role_name'
575
+ ):
576
+ role_name_attr = getattr(self.assistant_sys_msg, 'role_name', None)
577
+ if role_name_attr is not None:
578
+ assistant_role_name = str(role_name_attr)
579
+
478
580
  init_msg = BaseMessage.make_assistant_message(
479
- role_name=getattr(self.assistant_sys_msg, 'role_name', None)
480
- or "assistant",
481
- content=init_msg_content,
581
+ role_name=assistant_role_name,
582
+ content=final_init_msg_content,
482
583
  )
483
584
 
484
585
  return init_msg
@@ -501,20 +602,28 @@ class RolePlaying:
501
602
  """
502
603
  # Currently, reset() is synchronous, but if it becomes async in the
503
604
  # future, we can await it here
504
- self.assistant_agent.reset()
505
- self.user_agent.reset()
605
+ if self.assistant_agent is not None:
606
+ self.assistant_agent.reset()
607
+ if self.user_agent is not None:
608
+ self.user_agent.reset()
506
609
  default_init_msg_content = (
507
610
  "Now start to give me instructions one by one. "
508
611
  "Only reply with Instruction and Input."
509
612
  )
510
- if init_msg_content is None:
511
- init_msg_content = default_init_msg_content
613
+ final_init_msg_content = init_msg_content or default_init_msg_content
512
614
 
513
615
  # Initialize a message sent by the assistant
616
+ assistant_role_name = "assistant"
617
+ if self.assistant_sys_msg is not None and hasattr(
618
+ self.assistant_sys_msg, 'role_name'
619
+ ):
620
+ role_name_attr = getattr(self.assistant_sys_msg, 'role_name', None)
621
+ if role_name_attr is not None:
622
+ assistant_role_name = str(role_name_attr)
623
+
514
624
  init_msg = BaseMessage.make_assistant_message(
515
- role_name=getattr(self.assistant_sys_msg, 'role_name', None)
516
- or "assistant",
517
- content=init_msg_content,
625
+ role_name=assistant_role_name,
626
+ content=final_init_msg_content,
518
627
  )
519
628
 
520
629
  return init_msg
@@ -544,6 +653,11 @@ class RolePlaying:
544
653
  user agent terminated the conversation, and any additional user
545
654
  information.
546
655
  """
656
+ if self.user_agent is None:
657
+ raise ValueError("User agent is not initialized")
658
+ if self.assistant_agent is None:
659
+ raise ValueError("Assistant agent is not initialized")
660
+
547
661
  user_response = self.user_agent.step(assistant_msg)
548
662
  if user_response.terminated or user_response.msgs is None:
549
663
  return (
@@ -556,13 +670,12 @@ class RolePlaying:
556
670
  )
557
671
  user_msg = self._reduce_message_options(user_response.msgs)
558
672
 
559
- # To prevent recording the same memory more than once (once in chat
560
- # step and once in role play), and the model generates only one
561
- # response when multi-response support is enabled.
562
- if (
563
- 'n' in self.user_agent.model_backend.model_config_dict.keys()
564
- and self.user_agent.model_backend.model_config_dict['n'] > 1
565
- ):
673
+ # To prevent recording missing messages: ChatAgent.step automatically
674
+ # saves the response to memory only when a single message is returned.
675
+ # When multi-response support is enabled (n > 1), it is the caller's
676
+ # responsibility to record the selected message. Therefore, we record
677
+ # it here after choosing one message via `_reduce_message_options()`.
678
+ if self._is_multi_response(self.user_agent):
566
679
  self.user_agent.record_message(user_msg)
567
680
 
568
681
  assistant_response = self.assistant_agent.step(user_msg)
@@ -579,13 +692,7 @@ class RolePlaying:
579
692
  )
580
693
  assistant_msg = self._reduce_message_options(assistant_response.msgs)
581
694
 
582
- # To prevent recording the same memory more than once (once in chat
583
- # step and once in role play), and the model generates only one
584
- # response when multi-response support is enabled.
585
- if (
586
- 'n' in self.assistant_agent.model_backend.model_config_dict.keys()
587
- and self.assistant_agent.model_backend.model_config_dict['n'] > 1
588
- ):
695
+ if self._is_multi_response(self.assistant_agent):
589
696
  self.assistant_agent.record_message(assistant_msg)
590
697
 
591
698
  return (
@@ -627,6 +734,11 @@ class RolePlaying:
627
734
  user agent terminated the conversation, and any additional user
628
735
  information.
629
736
  """
737
+ if self.user_agent is None:
738
+ raise ValueError("User agent is not initialized")
739
+ if self.assistant_agent is None:
740
+ raise ValueError("Assistant agent is not initialized")
741
+
630
742
  user_response = await self.user_agent.astep(assistant_msg)
631
743
  if user_response.terminated or user_response.msgs is None:
632
744
  return (
@@ -639,13 +751,7 @@ class RolePlaying:
639
751
  )
640
752
  user_msg = self._reduce_message_options(user_response.msgs)
641
753
 
642
- # To prevent recording the same memory more than once (once in chat
643
- # step and once in role play), and the model generates only one
644
- # response when multi-response support is enabled.
645
- if (
646
- 'n' in self.user_agent.model_backend.model_config_dict.keys()
647
- and self.user_agent.model_backend.model_config_dict['n'] > 1
648
- ):
754
+ if self._is_multi_response(self.user_agent):
649
755
  self.user_agent.record_message(user_msg)
650
756
 
651
757
  assistant_response = await self.assistant_agent.astep(user_msg)
@@ -662,13 +768,7 @@ class RolePlaying:
662
768
  )
663
769
  assistant_msg = self._reduce_message_options(assistant_response.msgs)
664
770
 
665
- # To prevent recording the same memory more than once (once in chat
666
- # step and once in role play), and the model generates only one
667
- # response when multi-response support is enabled.
668
- if (
669
- 'n' in self.assistant_agent.model_backend.model_config_dict.keys()
670
- and self.assistant_agent.model_backend.model_config_dict['n'] > 1
671
- ):
771
+ if self._is_multi_response(self.assistant_agent):
672
772
  self.assistant_agent.record_message(assistant_msg)
673
773
 
674
774
  return (
@@ -701,6 +801,10 @@ class RolePlaying:
701
801
  RolePlaying: A new instance of RolePlaying with the same
702
802
  configuration.
703
803
  """
804
+ if self.assistant_agent is None or self.user_agent is None:
805
+ raise ValueError(
806
+ "Cannot clone: assistant_agent or user_agent is None"
807
+ )
704
808
 
705
809
  new_instance = RolePlaying(
706
810
  assistant_role_name=self.assistant_agent.role_name,
@@ -730,3 +834,20 @@ class RolePlaying:
730
834
  new_instance.critic = self.critic.clone(with_memory)
731
835
 
732
836
  return new_instance
837
+
838
+ def _is_multi_response(self, agent: ChatAgent) -> bool:
839
+ r"""Checks if the given agent supports multi-response.
840
+
841
+ Args:
842
+ agent (ChatAgent): The agent to check for multi-response support.
843
+
844
+ Returns:
845
+ bool: True if the agent supports multi-response, False otherwise.
846
+ """
847
+ if (
848
+ 'n' in agent.model_backend.model_config_dict.keys()
849
+ and agent.model_backend.model_config_dict['n'] is not None
850
+ and agent.model_backend.model_config_dict['n'] > 1
851
+ ):
852
+ return True
853
+ return False
@@ -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,14 +10,21 @@
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
  from .role_playing_worker import RolePlayingWorker
16
16
  from .single_agent_worker import SingleAgentWorker
17
- from .workforce import Workforce
17
+ from .utils import FailureHandlingConfig, PipelineTaskBuilder, RecoveryStrategy
18
+ from .workflow_memory_manager import WorkflowSelectionMethod
19
+ from .workforce import Workforce, WorkforceMode
18
20
 
19
21
  __all__ = [
20
22
  "Workforce",
23
+ "WorkforceMode",
24
+ "PipelineTaskBuilder",
21
25
  "SingleAgentWorker",
22
26
  "RolePlayingWorker",
27
+ "WorkflowSelectionMethod",
28
+ "FailureHandlingConfig",
29
+ "RecoveryStrategy",
23
30
  ]
@@ -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,9 +10,9 @@
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
- from typing import Any
15
+ from typing import Any, Optional
16
16
 
17
17
  from camel.societies.workforce.task_channel import TaskChannel
18
18
  from camel.societies.workforce.utils import check_if_running
@@ -23,10 +23,14 @@ class BaseNode(ABC):
23
23
 
24
24
  Args:
25
25
  description (str): Description of the node.
26
+ node_id (Optional[str]): ID of the node. If not provided, it will
27
+ be generated automatically. (default: :obj:`None`)
26
28
  """
27
29
 
28
- def __init__(self, description: str) -> None:
29
- self.node_id = str(id(self))
30
+ def __init__(
31
+ self, description: str, node_id: Optional[str] = None
32
+ ) -> None:
33
+ self.node_id = node_id if node_id is not None else str(id(self))
30
34
  self.description = description
31
35
  self._channel: TaskChannel = TaskChannel()
32
36
  self._running = False
@@ -0,0 +1,143 @@
1
+ # ========= Copyright 2023-2025 @ CAMEL-AI.org. All Rights Reserved. =========
2
+ # Licensed under the Apache License, Version 2.0 (the "License");
3
+ # you may not use this file except in compliance with the License.
4
+ # You may obtain a copy of the License at
5
+ #
6
+ # http://www.apache.org/licenses/LICENSE-2.0
7
+ #
8
+ # Unless required by applicable law or agreed to in writing, software
9
+ # distributed under the License is distributed on an "AS IS" BASIS,
10
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
11
+ # See the License for the specific language governing permissions and
12
+ # limitations under the License.
13
+ # ========= Copyright 2023-2025 @ CAMEL-AI.org. All Rights Reserved. =========
14
+ from __future__ import annotations
15
+
16
+ from datetime import datetime, timezone
17
+ from typing import Any, Dict, List, Literal, Optional, Union
18
+
19
+ from pydantic import BaseModel, ConfigDict, Field
20
+
21
+
22
+ class WorkforceEventBase(BaseModel):
23
+ model_config = ConfigDict(frozen=True, extra='forbid')
24
+ event_type: Literal[
25
+ "log",
26
+ "task_decomposed",
27
+ "task_created",
28
+ "task_assigned",
29
+ "task_started",
30
+ "task_completed",
31
+ "task_failed",
32
+ "worker_created",
33
+ "worker_deleted",
34
+ "queue_status",
35
+ "all_tasks_completed",
36
+ ]
37
+ metadata: Optional[Dict[str, Any]] = None
38
+ timestamp: datetime = Field(
39
+ default_factory=lambda: datetime.now(timezone.utc)
40
+ )
41
+
42
+
43
+ class LogEvent(WorkforceEventBase):
44
+ event_type: Literal["log"] = "log"
45
+ message: str
46
+ level: Literal["debug", "info", "warning", "error", "critical"]
47
+ color: (
48
+ Literal[
49
+ "red",
50
+ "green",
51
+ "yellow",
52
+ "blue",
53
+ "cyan",
54
+ "magenta",
55
+ "gray",
56
+ "black",
57
+ ]
58
+ | None
59
+ ) = None
60
+
61
+
62
+ class WorkerCreatedEvent(WorkforceEventBase):
63
+ event_type: Literal["worker_created"] = "worker_created"
64
+ worker_id: str
65
+ worker_type: str
66
+ role: str
67
+
68
+
69
+ class WorkerDeletedEvent(WorkforceEventBase):
70
+ event_type: Literal["worker_deleted"] = "worker_deleted"
71
+ worker_id: str
72
+ reason: Optional[str] = None
73
+
74
+
75
+ class TaskDecomposedEvent(WorkforceEventBase):
76
+ event_type: Literal["task_decomposed"] = "task_decomposed"
77
+ parent_task_id: str
78
+ subtask_ids: List[str]
79
+
80
+
81
+ class TaskCreatedEvent(WorkforceEventBase):
82
+ event_type: Literal["task_created"] = "task_created"
83
+ task_id: str
84
+ description: str
85
+ parent_task_id: Optional[str] = None
86
+ task_type: Optional[str] = None
87
+
88
+
89
+ class TaskAssignedEvent(WorkforceEventBase):
90
+ event_type: Literal["task_assigned"] = "task_assigned"
91
+ task_id: str
92
+ worker_id: str
93
+ queue_time_seconds: Optional[float] = None
94
+ dependencies: Optional[List[str]] = None
95
+
96
+
97
+ class TaskStartedEvent(WorkforceEventBase):
98
+ event_type: Literal["task_started"] = "task_started"
99
+ task_id: str
100
+ worker_id: str
101
+
102
+
103
+ class TaskCompletedEvent(WorkforceEventBase):
104
+ event_type: Literal["task_completed"] = "task_completed"
105
+ task_id: str
106
+ worker_id: str
107
+ result_summary: Optional[str] = None
108
+ processing_time_seconds: Optional[float] = None
109
+ token_usage: Optional[Dict[str, int]] = None
110
+
111
+
112
+ class TaskFailedEvent(WorkforceEventBase):
113
+ event_type: Literal["task_failed"] = "task_failed"
114
+ task_id: str
115
+ error_message: str
116
+ worker_id: Optional[str] = None
117
+
118
+
119
+ class AllTasksCompletedEvent(WorkforceEventBase):
120
+ event_type: Literal["all_tasks_completed"] = "all_tasks_completed"
121
+
122
+
123
+ class QueueStatusEvent(WorkforceEventBase):
124
+ event_type: Literal["queue_status"] = "queue_status"
125
+ queue_name: str
126
+ length: int
127
+ pending_task_ids: Optional[List[str]] = None
128
+ metadata: Optional[Dict[str, Any]] = None
129
+
130
+
131
+ WorkforceEvent = Union[
132
+ LogEvent,
133
+ TaskDecomposedEvent,
134
+ TaskCreatedEvent,
135
+ TaskAssignedEvent,
136
+ TaskStartedEvent,
137
+ TaskCompletedEvent,
138
+ TaskFailedEvent,
139
+ WorkerCreatedEvent,
140
+ WorkerDeletedEvent,
141
+ AllTasksCompletedEvent,
142
+ QueueStatusEvent,
143
+ ]