camel-ai 0.2.71a1__tar.gz → 0.2.71a3__tar.gz

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 (449) hide show
  1. {camel_ai-0.2.71a1 → camel_ai-0.2.71a3}/PKG-INFO +19 -5
  2. {camel_ai-0.2.71a1 → camel_ai-0.2.71a3}/README.md +13 -0
  3. {camel_ai-0.2.71a1 → camel_ai-0.2.71a3}/camel/__init__.py +1 -1
  4. {camel_ai-0.2.71a1 → camel_ai-0.2.71a3}/camel/agents/_types.py +6 -2
  5. {camel_ai-0.2.71a1 → camel_ai-0.2.71a3}/camel/agents/chat_agent.py +357 -18
  6. {camel_ai-0.2.71a1 → camel_ai-0.2.71a3}/camel/messages/base.py +2 -6
  7. {camel_ai-0.2.71a1 → camel_ai-0.2.71a3}/camel/messages/func_message.py +32 -5
  8. camel_ai-0.2.71a3/camel/services/agent_openapi_server.py +380 -0
  9. {camel_ai-0.2.71a1 → camel_ai-0.2.71a3}/camel/societies/workforce/single_agent_worker.py +1 -5
  10. {camel_ai-0.2.71a1 → camel_ai-0.2.71a3}/camel/societies/workforce/workforce.py +68 -8
  11. {camel_ai-0.2.71a1 → camel_ai-0.2.71a3}/camel/tasks/task.py +2 -2
  12. {camel_ai-0.2.71a1 → camel_ai-0.2.71a3}/camel/toolkits/__init__.py +2 -2
  13. {camel_ai-0.2.71a1 → camel_ai-0.2.71a3}/camel/toolkits/craw4ai_toolkit.py +27 -7
  14. {camel_ai-0.2.71a1 → camel_ai-0.2.71a3}/camel/toolkits/file_write_toolkit.py +110 -31
  15. {camel_ai-0.2.71a1 → camel_ai-0.2.71a3}/camel/toolkits/human_toolkit.py +19 -14
  16. camel_ai-0.2.71a3/camel/toolkits/hybrid_browser_toolkit/__init__.py +18 -0
  17. {camel_ai-0.2.71a1/camel/toolkits/non_visual_browser_toolkit → camel_ai-0.2.71a3/camel/toolkits/hybrid_browser_toolkit}/actions.py +47 -11
  18. {camel_ai-0.2.71a1/camel/toolkits/non_visual_browser_toolkit → camel_ai-0.2.71a3/camel/toolkits/hybrid_browser_toolkit}/agent.py +21 -11
  19. camel_ai-0.2.71a1/camel/toolkits/non_visual_browser_toolkit/nv_browser_session.py → camel_ai-0.2.71a3/camel/toolkits/hybrid_browser_toolkit/browser_session.py +64 -10
  20. camel_ai-0.2.71a3/camel/toolkits/hybrid_browser_toolkit/hybrid_browser_toolkit.py +1002 -0
  21. {camel_ai-0.2.71a1/camel/toolkits/non_visual_browser_toolkit → camel_ai-0.2.71a3/camel/toolkits/hybrid_browser_toolkit}/snapshot.py +16 -4
  22. camel_ai-0.2.71a1/camel/toolkits/non_visual_browser_toolkit/snapshot.js → camel_ai-0.2.71a3/camel/toolkits/hybrid_browser_toolkit/unified_analyzer.js +171 -15
  23. {camel_ai-0.2.71a1 → camel_ai-0.2.71a3}/camel/toolkits/jina_reranker_toolkit.py +3 -4
  24. {camel_ai-0.2.71a1 → camel_ai-0.2.71a3}/camel/toolkits/terminal_toolkit.py +189 -48
  25. {camel_ai-0.2.71a1 → camel_ai-0.2.71a3}/camel/toolkits/video_download_toolkit.py +1 -2
  26. {camel_ai-0.2.71a1 → camel_ai-0.2.71a3}/camel/types/agents/tool_calling_record.py +4 -1
  27. {camel_ai-0.2.71a1 → camel_ai-0.2.71a3}/camel/types/enums.py +24 -24
  28. camel_ai-0.2.71a3/camel/utils/message_summarizer.py +148 -0
  29. camel_ai-0.2.71a3/camel/utils/tool_result.py +44 -0
  30. {camel_ai-0.2.71a1 → camel_ai-0.2.71a3}/pyproject.toml +9 -7
  31. camel_ai-0.2.71a1/camel/toolkits/non_visual_browser_toolkit/__init__.py +0 -18
  32. camel_ai-0.2.71a1/camel/toolkits/non_visual_browser_toolkit/browser_non_visual_toolkit.py +0 -446
  33. {camel_ai-0.2.71a1 → camel_ai-0.2.71a3}/.gitignore +0 -0
  34. {camel_ai-0.2.71a1 → camel_ai-0.2.71a3}/LICENSE +0 -0
  35. {camel_ai-0.2.71a1 → camel_ai-0.2.71a3}/camel/agents/__init__.py +0 -0
  36. {camel_ai-0.2.71a1 → camel_ai-0.2.71a3}/camel/agents/_utils.py +0 -0
  37. {camel_ai-0.2.71a1 → camel_ai-0.2.71a3}/camel/agents/base.py +0 -0
  38. {camel_ai-0.2.71a1 → camel_ai-0.2.71a3}/camel/agents/critic_agent.py +0 -0
  39. {camel_ai-0.2.71a1 → camel_ai-0.2.71a3}/camel/agents/deductive_reasoner_agent.py +0 -0
  40. {camel_ai-0.2.71a1 → camel_ai-0.2.71a3}/camel/agents/embodied_agent.py +0 -0
  41. {camel_ai-0.2.71a1 → camel_ai-0.2.71a3}/camel/agents/knowledge_graph_agent.py +0 -0
  42. {camel_ai-0.2.71a1 → camel_ai-0.2.71a3}/camel/agents/mcp_agent.py +0 -0
  43. {camel_ai-0.2.71a1 → camel_ai-0.2.71a3}/camel/agents/multi_hop_generator_agent.py +0 -0
  44. {camel_ai-0.2.71a1 → camel_ai-0.2.71a3}/camel/agents/programmed_agent_instruction.py +0 -0
  45. {camel_ai-0.2.71a1 → camel_ai-0.2.71a3}/camel/agents/repo_agent.py +0 -0
  46. {camel_ai-0.2.71a1 → camel_ai-0.2.71a3}/camel/agents/role_assignment_agent.py +0 -0
  47. {camel_ai-0.2.71a1 → camel_ai-0.2.71a3}/camel/agents/search_agent.py +0 -0
  48. {camel_ai-0.2.71a1 → camel_ai-0.2.71a3}/camel/agents/task_agent.py +0 -0
  49. {camel_ai-0.2.71a1 → camel_ai-0.2.71a3}/camel/agents/tool_agents/__init__.py +0 -0
  50. {camel_ai-0.2.71a1 → camel_ai-0.2.71a3}/camel/agents/tool_agents/base.py +0 -0
  51. {camel_ai-0.2.71a1 → camel_ai-0.2.71a3}/camel/agents/tool_agents/hugging_face_tool_agent.py +0 -0
  52. {camel_ai-0.2.71a1 → camel_ai-0.2.71a3}/camel/benchmarks/__init__.py +0 -0
  53. {camel_ai-0.2.71a1 → camel_ai-0.2.71a3}/camel/benchmarks/apibank.py +0 -0
  54. {camel_ai-0.2.71a1 → camel_ai-0.2.71a3}/camel/benchmarks/apibench.py +0 -0
  55. {camel_ai-0.2.71a1 → camel_ai-0.2.71a3}/camel/benchmarks/base.py +0 -0
  56. {camel_ai-0.2.71a1 → camel_ai-0.2.71a3}/camel/benchmarks/browsecomp.py +0 -0
  57. {camel_ai-0.2.71a1 → camel_ai-0.2.71a3}/camel/benchmarks/gaia.py +0 -0
  58. {camel_ai-0.2.71a1 → camel_ai-0.2.71a3}/camel/benchmarks/mock_website/README.md +0 -0
  59. {camel_ai-0.2.71a1 → camel_ai-0.2.71a3}/camel/benchmarks/mock_website/mock_web.py +0 -0
  60. {camel_ai-0.2.71a1 → camel_ai-0.2.71a3}/camel/benchmarks/mock_website/requirements.txt +0 -0
  61. {camel_ai-0.2.71a1 → camel_ai-0.2.71a3}/camel/benchmarks/mock_website/shopping_mall/app.py +0 -0
  62. {camel_ai-0.2.71a1 → camel_ai-0.2.71a3}/camel/benchmarks/mock_website/task.json +0 -0
  63. {camel_ai-0.2.71a1 → camel_ai-0.2.71a3}/camel/benchmarks/nexus.py +0 -0
  64. {camel_ai-0.2.71a1 → camel_ai-0.2.71a3}/camel/benchmarks/ragbench.py +0 -0
  65. {camel_ai-0.2.71a1 → camel_ai-0.2.71a3}/camel/bots/__init__.py +0 -0
  66. {camel_ai-0.2.71a1 → camel_ai-0.2.71a3}/camel/bots/discord/__init__.py +0 -0
  67. {camel_ai-0.2.71a1 → camel_ai-0.2.71a3}/camel/bots/discord/discord_app.py +0 -0
  68. {camel_ai-0.2.71a1 → camel_ai-0.2.71a3}/camel/bots/discord/discord_installation.py +0 -0
  69. {camel_ai-0.2.71a1 → camel_ai-0.2.71a3}/camel/bots/discord/discord_store.py +0 -0
  70. {camel_ai-0.2.71a1 → camel_ai-0.2.71a3}/camel/bots/slack/__init__.py +0 -0
  71. {camel_ai-0.2.71a1 → camel_ai-0.2.71a3}/camel/bots/slack/models.py +0 -0
  72. {camel_ai-0.2.71a1 → camel_ai-0.2.71a3}/camel/bots/slack/slack_app.py +0 -0
  73. {camel_ai-0.2.71a1 → camel_ai-0.2.71a3}/camel/bots/telegram_bot.py +0 -0
  74. {camel_ai-0.2.71a1 → camel_ai-0.2.71a3}/camel/configs/__init__.py +0 -0
  75. {camel_ai-0.2.71a1 → camel_ai-0.2.71a3}/camel/configs/aiml_config.py +0 -0
  76. {camel_ai-0.2.71a1 → camel_ai-0.2.71a3}/camel/configs/anthropic_config.py +0 -0
  77. {camel_ai-0.2.71a1 → camel_ai-0.2.71a3}/camel/configs/base_config.py +0 -0
  78. {camel_ai-0.2.71a1 → camel_ai-0.2.71a3}/camel/configs/bedrock_config.py +0 -0
  79. {camel_ai-0.2.71a1 → camel_ai-0.2.71a3}/camel/configs/cohere_config.py +0 -0
  80. {camel_ai-0.2.71a1 → camel_ai-0.2.71a3}/camel/configs/crynux_config.py +0 -0
  81. {camel_ai-0.2.71a1 → camel_ai-0.2.71a3}/camel/configs/deepseek_config.py +0 -0
  82. {camel_ai-0.2.71a1 → camel_ai-0.2.71a3}/camel/configs/gemini_config.py +0 -0
  83. {camel_ai-0.2.71a1 → camel_ai-0.2.71a3}/camel/configs/groq_config.py +0 -0
  84. {camel_ai-0.2.71a1 → camel_ai-0.2.71a3}/camel/configs/internlm_config.py +0 -0
  85. {camel_ai-0.2.71a1 → camel_ai-0.2.71a3}/camel/configs/litellm_config.py +0 -0
  86. {camel_ai-0.2.71a1 → camel_ai-0.2.71a3}/camel/configs/lmstudio_config.py +0 -0
  87. {camel_ai-0.2.71a1 → camel_ai-0.2.71a3}/camel/configs/mistral_config.py +0 -0
  88. {camel_ai-0.2.71a1 → camel_ai-0.2.71a3}/camel/configs/modelscope_config.py +0 -0
  89. {camel_ai-0.2.71a1 → camel_ai-0.2.71a3}/camel/configs/moonshot_config.py +0 -0
  90. {camel_ai-0.2.71a1 → camel_ai-0.2.71a3}/camel/configs/netmind_config.py +0 -0
  91. {camel_ai-0.2.71a1 → camel_ai-0.2.71a3}/camel/configs/novita_config.py +0 -0
  92. {camel_ai-0.2.71a1 → camel_ai-0.2.71a3}/camel/configs/nvidia_config.py +0 -0
  93. {camel_ai-0.2.71a1 → camel_ai-0.2.71a3}/camel/configs/ollama_config.py +0 -0
  94. {camel_ai-0.2.71a1 → camel_ai-0.2.71a3}/camel/configs/openai_config.py +0 -0
  95. {camel_ai-0.2.71a1 → camel_ai-0.2.71a3}/camel/configs/openrouter_config.py +0 -0
  96. {camel_ai-0.2.71a1 → camel_ai-0.2.71a3}/camel/configs/ppio_config.py +0 -0
  97. {camel_ai-0.2.71a1 → camel_ai-0.2.71a3}/camel/configs/qianfan_config.py +0 -0
  98. {camel_ai-0.2.71a1 → camel_ai-0.2.71a3}/camel/configs/qwen_config.py +0 -0
  99. {camel_ai-0.2.71a1 → camel_ai-0.2.71a3}/camel/configs/reka_config.py +0 -0
  100. {camel_ai-0.2.71a1 → camel_ai-0.2.71a3}/camel/configs/samba_config.py +0 -0
  101. {camel_ai-0.2.71a1 → camel_ai-0.2.71a3}/camel/configs/sglang_config.py +0 -0
  102. {camel_ai-0.2.71a1 → camel_ai-0.2.71a3}/camel/configs/siliconflow_config.py +0 -0
  103. {camel_ai-0.2.71a1 → camel_ai-0.2.71a3}/camel/configs/togetherai_config.py +0 -0
  104. {camel_ai-0.2.71a1 → camel_ai-0.2.71a3}/camel/configs/vllm_config.py +0 -0
  105. {camel_ai-0.2.71a1 → camel_ai-0.2.71a3}/camel/configs/watsonx_config.py +0 -0
  106. {camel_ai-0.2.71a1 → camel_ai-0.2.71a3}/camel/configs/yi_config.py +0 -0
  107. {camel_ai-0.2.71a1 → camel_ai-0.2.71a3}/camel/configs/zhipuai_config.py +0 -0
  108. {camel_ai-0.2.71a1 → camel_ai-0.2.71a3}/camel/data_collectors/__init__.py +0 -0
  109. {camel_ai-0.2.71a1 → camel_ai-0.2.71a3}/camel/data_collectors/alpaca_collector.py +0 -0
  110. {camel_ai-0.2.71a1 → camel_ai-0.2.71a3}/camel/data_collectors/base.py +0 -0
  111. {camel_ai-0.2.71a1 → camel_ai-0.2.71a3}/camel/data_collectors/sharegpt_collector.py +0 -0
  112. {camel_ai-0.2.71a1 → camel_ai-0.2.71a3}/camel/datagen/__init__.py +0 -0
  113. {camel_ai-0.2.71a1 → camel_ai-0.2.71a3}/camel/datagen/cot_datagen.py +0 -0
  114. {camel_ai-0.2.71a1 → camel_ai-0.2.71a3}/camel/datagen/evol_instruct/__init__.py +0 -0
  115. {camel_ai-0.2.71a1 → camel_ai-0.2.71a3}/camel/datagen/evol_instruct/evol_instruct.py +0 -0
  116. {camel_ai-0.2.71a1 → camel_ai-0.2.71a3}/camel/datagen/evol_instruct/scorer.py +0 -0
  117. {camel_ai-0.2.71a1 → camel_ai-0.2.71a3}/camel/datagen/evol_instruct/templates.py +0 -0
  118. {camel_ai-0.2.71a1 → camel_ai-0.2.71a3}/camel/datagen/self_improving_cot.py +0 -0
  119. {camel_ai-0.2.71a1 → camel_ai-0.2.71a3}/camel/datagen/self_instruct/__init__.py +0 -0
  120. {camel_ai-0.2.71a1 → camel_ai-0.2.71a3}/camel/datagen/self_instruct/filter/__init__.py +0 -0
  121. {camel_ai-0.2.71a1 → camel_ai-0.2.71a3}/camel/datagen/self_instruct/filter/filter_function.py +0 -0
  122. {camel_ai-0.2.71a1 → camel_ai-0.2.71a3}/camel/datagen/self_instruct/filter/filter_registry.py +0 -0
  123. {camel_ai-0.2.71a1 → camel_ai-0.2.71a3}/camel/datagen/self_instruct/filter/instruction_filter.py +0 -0
  124. {camel_ai-0.2.71a1 → camel_ai-0.2.71a3}/camel/datagen/self_instruct/self_instruct.py +0 -0
  125. {camel_ai-0.2.71a1 → camel_ai-0.2.71a3}/camel/datagen/self_instruct/templates.py +0 -0
  126. {camel_ai-0.2.71a1 → camel_ai-0.2.71a3}/camel/datagen/source2synth/__init__.py +0 -0
  127. {camel_ai-0.2.71a1 → camel_ai-0.2.71a3}/camel/datagen/source2synth/data_processor.py +0 -0
  128. {camel_ai-0.2.71a1 → camel_ai-0.2.71a3}/camel/datagen/source2synth/models.py +0 -0
  129. {camel_ai-0.2.71a1 → camel_ai-0.2.71a3}/camel/datagen/source2synth/user_data_processor_config.py +0 -0
  130. {camel_ai-0.2.71a1 → camel_ai-0.2.71a3}/camel/datahubs/__init__.py +0 -0
  131. {camel_ai-0.2.71a1 → camel_ai-0.2.71a3}/camel/datahubs/base.py +0 -0
  132. {camel_ai-0.2.71a1 → camel_ai-0.2.71a3}/camel/datahubs/huggingface.py +0 -0
  133. {camel_ai-0.2.71a1 → camel_ai-0.2.71a3}/camel/datahubs/models.py +0 -0
  134. {camel_ai-0.2.71a1 → camel_ai-0.2.71a3}/camel/datasets/__init__.py +0 -0
  135. {camel_ai-0.2.71a1 → camel_ai-0.2.71a3}/camel/datasets/base_generator.py +0 -0
  136. {camel_ai-0.2.71a1 → camel_ai-0.2.71a3}/camel/datasets/few_shot_generator.py +0 -0
  137. {camel_ai-0.2.71a1 → camel_ai-0.2.71a3}/camel/datasets/models.py +0 -0
  138. {camel_ai-0.2.71a1 → camel_ai-0.2.71a3}/camel/datasets/self_instruct_generator.py +0 -0
  139. {camel_ai-0.2.71a1 → camel_ai-0.2.71a3}/camel/datasets/static_dataset.py +0 -0
  140. {camel_ai-0.2.71a1 → camel_ai-0.2.71a3}/camel/embeddings/__init__.py +0 -0
  141. {camel_ai-0.2.71a1 → camel_ai-0.2.71a3}/camel/embeddings/azure_embedding.py +0 -0
  142. {camel_ai-0.2.71a1 → camel_ai-0.2.71a3}/camel/embeddings/base.py +0 -0
  143. {camel_ai-0.2.71a1 → camel_ai-0.2.71a3}/camel/embeddings/gemini_embedding.py +0 -0
  144. {camel_ai-0.2.71a1 → camel_ai-0.2.71a3}/camel/embeddings/jina_embedding.py +0 -0
  145. {camel_ai-0.2.71a1 → camel_ai-0.2.71a3}/camel/embeddings/mistral_embedding.py +0 -0
  146. {camel_ai-0.2.71a1 → camel_ai-0.2.71a3}/camel/embeddings/openai_compatible_embedding.py +0 -0
  147. {camel_ai-0.2.71a1 → camel_ai-0.2.71a3}/camel/embeddings/openai_embedding.py +0 -0
  148. {camel_ai-0.2.71a1 → camel_ai-0.2.71a3}/camel/embeddings/sentence_transformers_embeddings.py +0 -0
  149. {camel_ai-0.2.71a1 → camel_ai-0.2.71a3}/camel/embeddings/together_embedding.py +0 -0
  150. {camel_ai-0.2.71a1 → camel_ai-0.2.71a3}/camel/embeddings/vlm_embedding.py +0 -0
  151. {camel_ai-0.2.71a1 → camel_ai-0.2.71a3}/camel/environments/__init__.py +0 -0
  152. {camel_ai-0.2.71a1 → camel_ai-0.2.71a3}/camel/environments/models.py +0 -0
  153. {camel_ai-0.2.71a1 → camel_ai-0.2.71a3}/camel/environments/multi_step.py +0 -0
  154. {camel_ai-0.2.71a1 → camel_ai-0.2.71a3}/camel/environments/rlcards_env.py +0 -0
  155. {camel_ai-0.2.71a1 → camel_ai-0.2.71a3}/camel/environments/single_step.py +0 -0
  156. {camel_ai-0.2.71a1 → camel_ai-0.2.71a3}/camel/environments/tic_tac_toe.py +0 -0
  157. {camel_ai-0.2.71a1 → camel_ai-0.2.71a3}/camel/extractors/__init__.py +0 -0
  158. {camel_ai-0.2.71a1 → camel_ai-0.2.71a3}/camel/extractors/base.py +0 -0
  159. {camel_ai-0.2.71a1 → camel_ai-0.2.71a3}/camel/extractors/python_strategies.py +0 -0
  160. {camel_ai-0.2.71a1 → camel_ai-0.2.71a3}/camel/generators.py +0 -0
  161. {camel_ai-0.2.71a1 → camel_ai-0.2.71a3}/camel/human.py +0 -0
  162. {camel_ai-0.2.71a1 → camel_ai-0.2.71a3}/camel/interpreters/__init__.py +0 -0
  163. {camel_ai-0.2.71a1 → camel_ai-0.2.71a3}/camel/interpreters/base.py +0 -0
  164. {camel_ai-0.2.71a1 → camel_ai-0.2.71a3}/camel/interpreters/docker/Dockerfile +0 -0
  165. {camel_ai-0.2.71a1 → camel_ai-0.2.71a3}/camel/interpreters/docker_interpreter.py +0 -0
  166. {camel_ai-0.2.71a1 → camel_ai-0.2.71a3}/camel/interpreters/e2b_interpreter.py +0 -0
  167. {camel_ai-0.2.71a1 → camel_ai-0.2.71a3}/camel/interpreters/internal_python_interpreter.py +0 -0
  168. {camel_ai-0.2.71a1 → camel_ai-0.2.71a3}/camel/interpreters/interpreter_error.py +0 -0
  169. {camel_ai-0.2.71a1 → camel_ai-0.2.71a3}/camel/interpreters/ipython_interpreter.py +0 -0
  170. {camel_ai-0.2.71a1 → camel_ai-0.2.71a3}/camel/interpreters/subprocess_interpreter.py +0 -0
  171. {camel_ai-0.2.71a1 → camel_ai-0.2.71a3}/camel/loaders/__init__.py +0 -0
  172. {camel_ai-0.2.71a1 → camel_ai-0.2.71a3}/camel/loaders/apify_reader.py +0 -0
  173. {camel_ai-0.2.71a1 → camel_ai-0.2.71a3}/camel/loaders/base_io.py +0 -0
  174. {camel_ai-0.2.71a1 → camel_ai-0.2.71a3}/camel/loaders/chunkr_reader.py +0 -0
  175. {camel_ai-0.2.71a1 → camel_ai-0.2.71a3}/camel/loaders/crawl4ai_reader.py +0 -0
  176. {camel_ai-0.2.71a1 → camel_ai-0.2.71a3}/camel/loaders/firecrawl_reader.py +0 -0
  177. {camel_ai-0.2.71a1 → camel_ai-0.2.71a3}/camel/loaders/jina_url_reader.py +0 -0
  178. {camel_ai-0.2.71a1 → camel_ai-0.2.71a3}/camel/loaders/markitdown.py +0 -0
  179. {camel_ai-0.2.71a1 → camel_ai-0.2.71a3}/camel/loaders/mineru_extractor.py +0 -0
  180. {camel_ai-0.2.71a1 → camel_ai-0.2.71a3}/camel/loaders/mistral_reader.py +0 -0
  181. {camel_ai-0.2.71a1 → camel_ai-0.2.71a3}/camel/loaders/pandas_reader.py +0 -0
  182. {camel_ai-0.2.71a1 → camel_ai-0.2.71a3}/camel/loaders/scrapegraph_reader.py +0 -0
  183. {camel_ai-0.2.71a1 → camel_ai-0.2.71a3}/camel/loaders/unstructured_io.py +0 -0
  184. {camel_ai-0.2.71a1 → camel_ai-0.2.71a3}/camel/logger.py +0 -0
  185. {camel_ai-0.2.71a1 → camel_ai-0.2.71a3}/camel/memories/__init__.py +0 -0
  186. {camel_ai-0.2.71a1 → camel_ai-0.2.71a3}/camel/memories/agent_memories.py +0 -0
  187. {camel_ai-0.2.71a1 → camel_ai-0.2.71a3}/camel/memories/base.py +0 -0
  188. {camel_ai-0.2.71a1 → camel_ai-0.2.71a3}/camel/memories/blocks/__init__.py +0 -0
  189. {camel_ai-0.2.71a1 → camel_ai-0.2.71a3}/camel/memories/blocks/chat_history_block.py +0 -0
  190. {camel_ai-0.2.71a1 → camel_ai-0.2.71a3}/camel/memories/blocks/vectordb_block.py +0 -0
  191. {camel_ai-0.2.71a1 → camel_ai-0.2.71a3}/camel/memories/context_creators/__init__.py +0 -0
  192. {camel_ai-0.2.71a1 → camel_ai-0.2.71a3}/camel/memories/context_creators/score_based.py +0 -0
  193. {camel_ai-0.2.71a1 → camel_ai-0.2.71a3}/camel/memories/records.py +0 -0
  194. {camel_ai-0.2.71a1 → camel_ai-0.2.71a3}/camel/messages/__init__.py +0 -0
  195. {camel_ai-0.2.71a1 → camel_ai-0.2.71a3}/camel/messages/conversion/__init__.py +0 -0
  196. {camel_ai-0.2.71a1 → camel_ai-0.2.71a3}/camel/messages/conversion/alpaca.py +0 -0
  197. {camel_ai-0.2.71a1 → camel_ai-0.2.71a3}/camel/messages/conversion/conversation_models.py +0 -0
  198. {camel_ai-0.2.71a1 → camel_ai-0.2.71a3}/camel/messages/conversion/sharegpt/__init__.py +0 -0
  199. {camel_ai-0.2.71a1 → camel_ai-0.2.71a3}/camel/messages/conversion/sharegpt/function_call_formatter.py +0 -0
  200. {camel_ai-0.2.71a1 → camel_ai-0.2.71a3}/camel/messages/conversion/sharegpt/hermes/__init__.py +0 -0
  201. {camel_ai-0.2.71a1 → camel_ai-0.2.71a3}/camel/messages/conversion/sharegpt/hermes/hermes_function_formatter.py +0 -0
  202. {camel_ai-0.2.71a1 → camel_ai-0.2.71a3}/camel/models/__init__.py +0 -0
  203. {camel_ai-0.2.71a1 → camel_ai-0.2.71a3}/camel/models/_utils.py +0 -0
  204. {camel_ai-0.2.71a1 → camel_ai-0.2.71a3}/camel/models/aiml_model.py +0 -0
  205. {camel_ai-0.2.71a1 → camel_ai-0.2.71a3}/camel/models/anthropic_model.py +0 -0
  206. {camel_ai-0.2.71a1 → camel_ai-0.2.71a3}/camel/models/aws_bedrock_model.py +0 -0
  207. {camel_ai-0.2.71a1 → camel_ai-0.2.71a3}/camel/models/azure_openai_model.py +0 -0
  208. {camel_ai-0.2.71a1 → camel_ai-0.2.71a3}/camel/models/base_audio_model.py +0 -0
  209. {camel_ai-0.2.71a1 → camel_ai-0.2.71a3}/camel/models/base_model.py +0 -0
  210. {camel_ai-0.2.71a1 → camel_ai-0.2.71a3}/camel/models/cohere_model.py +0 -0
  211. {camel_ai-0.2.71a1 → camel_ai-0.2.71a3}/camel/models/crynux_model.py +0 -0
  212. {camel_ai-0.2.71a1 → camel_ai-0.2.71a3}/camel/models/deepseek_model.py +0 -0
  213. {camel_ai-0.2.71a1 → camel_ai-0.2.71a3}/camel/models/fish_audio_model.py +0 -0
  214. {camel_ai-0.2.71a1 → camel_ai-0.2.71a3}/camel/models/gemini_model.py +0 -0
  215. {camel_ai-0.2.71a1 → camel_ai-0.2.71a3}/camel/models/groq_model.py +0 -0
  216. {camel_ai-0.2.71a1 → camel_ai-0.2.71a3}/camel/models/internlm_model.py +0 -0
  217. {camel_ai-0.2.71a1 → camel_ai-0.2.71a3}/camel/models/litellm_model.py +0 -0
  218. {camel_ai-0.2.71a1 → camel_ai-0.2.71a3}/camel/models/lmstudio_model.py +0 -0
  219. {camel_ai-0.2.71a1 → camel_ai-0.2.71a3}/camel/models/mistral_model.py +0 -0
  220. {camel_ai-0.2.71a1 → camel_ai-0.2.71a3}/camel/models/model_factory.py +0 -0
  221. {camel_ai-0.2.71a1 → camel_ai-0.2.71a3}/camel/models/model_manager.py +0 -0
  222. {camel_ai-0.2.71a1 → camel_ai-0.2.71a3}/camel/models/modelscope_model.py +0 -0
  223. {camel_ai-0.2.71a1 → camel_ai-0.2.71a3}/camel/models/moonshot_model.py +0 -0
  224. {camel_ai-0.2.71a1 → camel_ai-0.2.71a3}/camel/models/nemotron_model.py +0 -0
  225. {camel_ai-0.2.71a1 → camel_ai-0.2.71a3}/camel/models/netmind_model.py +0 -0
  226. {camel_ai-0.2.71a1 → camel_ai-0.2.71a3}/camel/models/novita_model.py +0 -0
  227. {camel_ai-0.2.71a1 → camel_ai-0.2.71a3}/camel/models/nvidia_model.py +0 -0
  228. {camel_ai-0.2.71a1 → camel_ai-0.2.71a3}/camel/models/ollama_model.py +0 -0
  229. {camel_ai-0.2.71a1 → camel_ai-0.2.71a3}/camel/models/openai_audio_models.py +0 -0
  230. {camel_ai-0.2.71a1 → camel_ai-0.2.71a3}/camel/models/openai_compatible_model.py +0 -0
  231. {camel_ai-0.2.71a1 → camel_ai-0.2.71a3}/camel/models/openai_model.py +0 -0
  232. {camel_ai-0.2.71a1 → camel_ai-0.2.71a3}/camel/models/openrouter_model.py +0 -0
  233. {camel_ai-0.2.71a1 → camel_ai-0.2.71a3}/camel/models/ppio_model.py +0 -0
  234. {camel_ai-0.2.71a1 → camel_ai-0.2.71a3}/camel/models/qianfan_model.py +0 -0
  235. {camel_ai-0.2.71a1 → camel_ai-0.2.71a3}/camel/models/qwen_model.py +0 -0
  236. {camel_ai-0.2.71a1 → camel_ai-0.2.71a3}/camel/models/reka_model.py +0 -0
  237. {camel_ai-0.2.71a1 → camel_ai-0.2.71a3}/camel/models/reward/__init__.py +0 -0
  238. {camel_ai-0.2.71a1 → camel_ai-0.2.71a3}/camel/models/reward/base_reward_model.py +0 -0
  239. {camel_ai-0.2.71a1 → camel_ai-0.2.71a3}/camel/models/reward/evaluator.py +0 -0
  240. {camel_ai-0.2.71a1 → camel_ai-0.2.71a3}/camel/models/reward/nemotron_model.py +0 -0
  241. {camel_ai-0.2.71a1 → camel_ai-0.2.71a3}/camel/models/reward/skywork_model.py +0 -0
  242. {camel_ai-0.2.71a1 → camel_ai-0.2.71a3}/camel/models/samba_model.py +0 -0
  243. {camel_ai-0.2.71a1 → camel_ai-0.2.71a3}/camel/models/sglang_model.py +0 -0
  244. {camel_ai-0.2.71a1 → camel_ai-0.2.71a3}/camel/models/siliconflow_model.py +0 -0
  245. {camel_ai-0.2.71a1 → camel_ai-0.2.71a3}/camel/models/stub_model.py +0 -0
  246. {camel_ai-0.2.71a1 → camel_ai-0.2.71a3}/camel/models/togetherai_model.py +0 -0
  247. {camel_ai-0.2.71a1 → camel_ai-0.2.71a3}/camel/models/vllm_model.py +0 -0
  248. {camel_ai-0.2.71a1 → camel_ai-0.2.71a3}/camel/models/volcano_model.py +0 -0
  249. {camel_ai-0.2.71a1 → camel_ai-0.2.71a3}/camel/models/watsonx_model.py +0 -0
  250. {camel_ai-0.2.71a1 → camel_ai-0.2.71a3}/camel/models/yi_model.py +0 -0
  251. {camel_ai-0.2.71a1 → camel_ai-0.2.71a3}/camel/models/zhipuai_model.py +0 -0
  252. {camel_ai-0.2.71a1 → camel_ai-0.2.71a3}/camel/personas/__init__.py +0 -0
  253. {camel_ai-0.2.71a1 → camel_ai-0.2.71a3}/camel/personas/persona.py +0 -0
  254. {camel_ai-0.2.71a1 → camel_ai-0.2.71a3}/camel/personas/persona_hub.py +0 -0
  255. {camel_ai-0.2.71a1 → camel_ai-0.2.71a3}/camel/prompts/__init__.py +0 -0
  256. {camel_ai-0.2.71a1 → camel_ai-0.2.71a3}/camel/prompts/ai_society.py +0 -0
  257. {camel_ai-0.2.71a1 → camel_ai-0.2.71a3}/camel/prompts/base.py +0 -0
  258. {camel_ai-0.2.71a1 → camel_ai-0.2.71a3}/camel/prompts/code.py +0 -0
  259. {camel_ai-0.2.71a1 → camel_ai-0.2.71a3}/camel/prompts/evaluation.py +0 -0
  260. {camel_ai-0.2.71a1 → camel_ai-0.2.71a3}/camel/prompts/generate_text_embedding_data.py +0 -0
  261. {camel_ai-0.2.71a1 → camel_ai-0.2.71a3}/camel/prompts/image_craft.py +0 -0
  262. {camel_ai-0.2.71a1 → camel_ai-0.2.71a3}/camel/prompts/misalignment.py +0 -0
  263. {camel_ai-0.2.71a1 → camel_ai-0.2.71a3}/camel/prompts/multi_condition_image_craft.py +0 -0
  264. {camel_ai-0.2.71a1 → camel_ai-0.2.71a3}/camel/prompts/object_recognition.py +0 -0
  265. {camel_ai-0.2.71a1 → camel_ai-0.2.71a3}/camel/prompts/persona_hub.py +0 -0
  266. {camel_ai-0.2.71a1 → camel_ai-0.2.71a3}/camel/prompts/prompt_templates.py +0 -0
  267. {camel_ai-0.2.71a1 → camel_ai-0.2.71a3}/camel/prompts/role_description_prompt_template.py +0 -0
  268. {camel_ai-0.2.71a1 → camel_ai-0.2.71a3}/camel/prompts/solution_extraction.py +0 -0
  269. {camel_ai-0.2.71a1 → camel_ai-0.2.71a3}/camel/prompts/task_prompt_template.py +0 -0
  270. {camel_ai-0.2.71a1 → camel_ai-0.2.71a3}/camel/prompts/translation.py +0 -0
  271. {camel_ai-0.2.71a1 → camel_ai-0.2.71a3}/camel/prompts/video_description_prompt.py +0 -0
  272. {camel_ai-0.2.71a1 → camel_ai-0.2.71a3}/camel/py.typed +0 -0
  273. {camel_ai-0.2.71a1 → camel_ai-0.2.71a3}/camel/responses/__init__.py +0 -0
  274. {camel_ai-0.2.71a1 → camel_ai-0.2.71a3}/camel/responses/agent_responses.py +0 -0
  275. {camel_ai-0.2.71a1 → camel_ai-0.2.71a3}/camel/retrievers/__init__.py +0 -0
  276. {camel_ai-0.2.71a1 → camel_ai-0.2.71a3}/camel/retrievers/auto_retriever.py +0 -0
  277. {camel_ai-0.2.71a1 → camel_ai-0.2.71a3}/camel/retrievers/base.py +0 -0
  278. {camel_ai-0.2.71a1 → camel_ai-0.2.71a3}/camel/retrievers/bm25_retriever.py +0 -0
  279. {camel_ai-0.2.71a1 → camel_ai-0.2.71a3}/camel/retrievers/cohere_rerank_retriever.py +0 -0
  280. {camel_ai-0.2.71a1 → camel_ai-0.2.71a3}/camel/retrievers/hybrid_retrival.py +0 -0
  281. {camel_ai-0.2.71a1 → camel_ai-0.2.71a3}/camel/retrievers/vector_retriever.py +0 -0
  282. {camel_ai-0.2.71a1 → camel_ai-0.2.71a3}/camel/runtimes/__init__.py +0 -0
  283. {camel_ai-0.2.71a1 → camel_ai-0.2.71a3}/camel/runtimes/api.py +0 -0
  284. {camel_ai-0.2.71a1 → camel_ai-0.2.71a3}/camel/runtimes/base.py +0 -0
  285. {camel_ai-0.2.71a1 → camel_ai-0.2.71a3}/camel/runtimes/configs.py +0 -0
  286. {camel_ai-0.2.71a1 → camel_ai-0.2.71a3}/camel/runtimes/daytona_runtime.py +0 -0
  287. {camel_ai-0.2.71a1 → camel_ai-0.2.71a3}/camel/runtimes/docker_runtime.py +0 -0
  288. {camel_ai-0.2.71a1 → camel_ai-0.2.71a3}/camel/runtimes/llm_guard_runtime.py +0 -0
  289. {camel_ai-0.2.71a1 → camel_ai-0.2.71a3}/camel/runtimes/remote_http_runtime.py +0 -0
  290. {camel_ai-0.2.71a1 → camel_ai-0.2.71a3}/camel/runtimes/ubuntu_docker_runtime.py +0 -0
  291. {camel_ai-0.2.71a1 → camel_ai-0.2.71a3}/camel/runtimes/utils/__init__.py +0 -0
  292. {camel_ai-0.2.71a1 → camel_ai-0.2.71a3}/camel/runtimes/utils/function_risk_toolkit.py +0 -0
  293. {camel_ai-0.2.71a1 → camel_ai-0.2.71a3}/camel/runtimes/utils/ignore_risk_toolkit.py +0 -0
  294. {camel_ai-0.2.71a1 → camel_ai-0.2.71a3}/camel/schemas/__init__.py +0 -0
  295. {camel_ai-0.2.71a1 → camel_ai-0.2.71a3}/camel/schemas/base.py +0 -0
  296. {camel_ai-0.2.71a1 → camel_ai-0.2.71a3}/camel/schemas/openai_converter.py +0 -0
  297. {camel_ai-0.2.71a1 → camel_ai-0.2.71a3}/camel/schemas/outlines_converter.py +0 -0
  298. {camel_ai-0.2.71a1 → camel_ai-0.2.71a3}/camel/societies/__init__.py +0 -0
  299. {camel_ai-0.2.71a1 → camel_ai-0.2.71a3}/camel/societies/babyagi_playing.py +0 -0
  300. {camel_ai-0.2.71a1 → camel_ai-0.2.71a3}/camel/societies/role_playing.py +0 -0
  301. {camel_ai-0.2.71a1 → camel_ai-0.2.71a3}/camel/societies/workforce/__init__.py +0 -0
  302. {camel_ai-0.2.71a1 → camel_ai-0.2.71a3}/camel/societies/workforce/base.py +0 -0
  303. {camel_ai-0.2.71a1 → camel_ai-0.2.71a3}/camel/societies/workforce/prompts.py +0 -0
  304. {camel_ai-0.2.71a1 → camel_ai-0.2.71a3}/camel/societies/workforce/role_playing_worker.py +0 -0
  305. {camel_ai-0.2.71a1 → camel_ai-0.2.71a3}/camel/societies/workforce/task_channel.py +0 -0
  306. {camel_ai-0.2.71a1 → camel_ai-0.2.71a3}/camel/societies/workforce/utils.py +0 -0
  307. {camel_ai-0.2.71a1 → camel_ai-0.2.71a3}/camel/societies/workforce/worker.py +0 -0
  308. {camel_ai-0.2.71a1 → camel_ai-0.2.71a3}/camel/societies/workforce/workforce_logger.py +0 -0
  309. {camel_ai-0.2.71a1 → camel_ai-0.2.71a3}/camel/storages/__init__.py +0 -0
  310. {camel_ai-0.2.71a1 → camel_ai-0.2.71a3}/camel/storages/graph_storages/__init__.py +0 -0
  311. {camel_ai-0.2.71a1 → camel_ai-0.2.71a3}/camel/storages/graph_storages/base.py +0 -0
  312. {camel_ai-0.2.71a1 → camel_ai-0.2.71a3}/camel/storages/graph_storages/graph_element.py +0 -0
  313. {camel_ai-0.2.71a1 → camel_ai-0.2.71a3}/camel/storages/graph_storages/nebula_graph.py +0 -0
  314. {camel_ai-0.2.71a1 → camel_ai-0.2.71a3}/camel/storages/graph_storages/neo4j_graph.py +0 -0
  315. {camel_ai-0.2.71a1 → camel_ai-0.2.71a3}/camel/storages/key_value_storages/__init__.py +0 -0
  316. {camel_ai-0.2.71a1 → camel_ai-0.2.71a3}/camel/storages/key_value_storages/base.py +0 -0
  317. {camel_ai-0.2.71a1 → camel_ai-0.2.71a3}/camel/storages/key_value_storages/in_memory.py +0 -0
  318. {camel_ai-0.2.71a1 → camel_ai-0.2.71a3}/camel/storages/key_value_storages/json.py +0 -0
  319. {camel_ai-0.2.71a1 → camel_ai-0.2.71a3}/camel/storages/key_value_storages/mem0_cloud.py +0 -0
  320. {camel_ai-0.2.71a1 → camel_ai-0.2.71a3}/camel/storages/key_value_storages/redis.py +0 -0
  321. {camel_ai-0.2.71a1 → camel_ai-0.2.71a3}/camel/storages/object_storages/__init__.py +0 -0
  322. {camel_ai-0.2.71a1 → camel_ai-0.2.71a3}/camel/storages/object_storages/amazon_s3.py +0 -0
  323. {camel_ai-0.2.71a1 → camel_ai-0.2.71a3}/camel/storages/object_storages/azure_blob.py +0 -0
  324. {camel_ai-0.2.71a1 → camel_ai-0.2.71a3}/camel/storages/object_storages/base.py +0 -0
  325. {camel_ai-0.2.71a1 → camel_ai-0.2.71a3}/camel/storages/object_storages/google_cloud.py +0 -0
  326. {camel_ai-0.2.71a1 → camel_ai-0.2.71a3}/camel/storages/vectordb_storages/__init__.py +0 -0
  327. {camel_ai-0.2.71a1 → camel_ai-0.2.71a3}/camel/storages/vectordb_storages/base.py +0 -0
  328. {camel_ai-0.2.71a1 → camel_ai-0.2.71a3}/camel/storages/vectordb_storages/chroma.py +0 -0
  329. {camel_ai-0.2.71a1 → camel_ai-0.2.71a3}/camel/storages/vectordb_storages/faiss.py +0 -0
  330. {camel_ai-0.2.71a1 → camel_ai-0.2.71a3}/camel/storages/vectordb_storages/milvus.py +0 -0
  331. {camel_ai-0.2.71a1 → camel_ai-0.2.71a3}/camel/storages/vectordb_storages/oceanbase.py +0 -0
  332. {camel_ai-0.2.71a1 → camel_ai-0.2.71a3}/camel/storages/vectordb_storages/pgvector.py +0 -0
  333. {camel_ai-0.2.71a1 → camel_ai-0.2.71a3}/camel/storages/vectordb_storages/qdrant.py +0 -0
  334. {camel_ai-0.2.71a1 → camel_ai-0.2.71a3}/camel/storages/vectordb_storages/tidb.py +0 -0
  335. {camel_ai-0.2.71a1 → camel_ai-0.2.71a3}/camel/storages/vectordb_storages/weaviate.py +0 -0
  336. {camel_ai-0.2.71a1 → camel_ai-0.2.71a3}/camel/tasks/__init__.py +0 -0
  337. {camel_ai-0.2.71a1 → camel_ai-0.2.71a3}/camel/tasks/task_prompt.py +0 -0
  338. {camel_ai-0.2.71a1 → camel_ai-0.2.71a3}/camel/terminators/__init__.py +0 -0
  339. {camel_ai-0.2.71a1 → camel_ai-0.2.71a3}/camel/terminators/base.py +0 -0
  340. {camel_ai-0.2.71a1 → camel_ai-0.2.71a3}/camel/terminators/response_terminator.py +0 -0
  341. {camel_ai-0.2.71a1 → camel_ai-0.2.71a3}/camel/terminators/token_limit_terminator.py +0 -0
  342. {camel_ai-0.2.71a1 → camel_ai-0.2.71a3}/camel/toolkits/aci_toolkit.py +0 -0
  343. {camel_ai-0.2.71a1 → camel_ai-0.2.71a3}/camel/toolkits/arxiv_toolkit.py +0 -0
  344. {camel_ai-0.2.71a1 → camel_ai-0.2.71a3}/camel/toolkits/ask_news_toolkit.py +0 -0
  345. {camel_ai-0.2.71a1 → camel_ai-0.2.71a3}/camel/toolkits/async_browser_toolkit.py +0 -0
  346. {camel_ai-0.2.71a1 → camel_ai-0.2.71a3}/camel/toolkits/audio_analysis_toolkit.py +0 -0
  347. {camel_ai-0.2.71a1 → camel_ai-0.2.71a3}/camel/toolkits/base.py +0 -0
  348. {camel_ai-0.2.71a1 → camel_ai-0.2.71a3}/camel/toolkits/bohrium_toolkit.py +0 -0
  349. {camel_ai-0.2.71a1 → camel_ai-0.2.71a3}/camel/toolkits/browser_toolkit.py +0 -0
  350. {camel_ai-0.2.71a1 → camel_ai-0.2.71a3}/camel/toolkits/browser_toolkit_commons.py +0 -0
  351. {camel_ai-0.2.71a1 → camel_ai-0.2.71a3}/camel/toolkits/code_execution.py +0 -0
  352. {camel_ai-0.2.71a1 → camel_ai-0.2.71a3}/camel/toolkits/dalle_toolkit.py +0 -0
  353. {camel_ai-0.2.71a1 → camel_ai-0.2.71a3}/camel/toolkits/dappier_toolkit.py +0 -0
  354. {camel_ai-0.2.71a1 → camel_ai-0.2.71a3}/camel/toolkits/data_commons_toolkit.py +0 -0
  355. {camel_ai-0.2.71a1 → camel_ai-0.2.71a3}/camel/toolkits/edgeone_pages_mcp_toolkit.py +0 -0
  356. {camel_ai-0.2.71a1 → camel_ai-0.2.71a3}/camel/toolkits/excel_toolkit.py +0 -0
  357. {camel_ai-0.2.71a1 → camel_ai-0.2.71a3}/camel/toolkits/function_tool.py +0 -0
  358. {camel_ai-0.2.71a1 → camel_ai-0.2.71a3}/camel/toolkits/github_toolkit.py +0 -0
  359. {camel_ai-0.2.71a1 → camel_ai-0.2.71a3}/camel/toolkits/google_calendar_toolkit.py +0 -0
  360. {camel_ai-0.2.71a1 → camel_ai-0.2.71a3}/camel/toolkits/google_drive_mcp_toolkit.py +0 -0
  361. {camel_ai-0.2.71a1 → camel_ai-0.2.71a3}/camel/toolkits/google_maps_toolkit.py +0 -0
  362. {camel_ai-0.2.71a1 → camel_ai-0.2.71a3}/camel/toolkits/google_scholar_toolkit.py +0 -0
  363. {camel_ai-0.2.71a1 → camel_ai-0.2.71a3}/camel/toolkits/image_analysis_toolkit.py +0 -0
  364. {camel_ai-0.2.71a1 → camel_ai-0.2.71a3}/camel/toolkits/klavis_toolkit.py +0 -0
  365. {camel_ai-0.2.71a1 → camel_ai-0.2.71a3}/camel/toolkits/linkedin_toolkit.py +0 -0
  366. {camel_ai-0.2.71a1 → camel_ai-0.2.71a3}/camel/toolkits/markitdown_toolkit.py +0 -0
  367. {camel_ai-0.2.71a1 → camel_ai-0.2.71a3}/camel/toolkits/math_toolkit.py +0 -0
  368. {camel_ai-0.2.71a1 → camel_ai-0.2.71a3}/camel/toolkits/mcp_toolkit.py +0 -0
  369. {camel_ai-0.2.71a1 → camel_ai-0.2.71a3}/camel/toolkits/memory_toolkit.py +0 -0
  370. {camel_ai-0.2.71a1 → camel_ai-0.2.71a3}/camel/toolkits/meshy_toolkit.py +0 -0
  371. {camel_ai-0.2.71a1 → camel_ai-0.2.71a3}/camel/toolkits/mineru_toolkit.py +0 -0
  372. {camel_ai-0.2.71a1 → camel_ai-0.2.71a3}/camel/toolkits/networkx_toolkit.py +0 -0
  373. {camel_ai-0.2.71a1 → camel_ai-0.2.71a3}/camel/toolkits/notion_toolkit.py +0 -0
  374. {camel_ai-0.2.71a1 → camel_ai-0.2.71a3}/camel/toolkits/open_api_specs/biztoc/__init__.py +0 -0
  375. {camel_ai-0.2.71a1 → camel_ai-0.2.71a3}/camel/toolkits/open_api_specs/biztoc/ai-plugin.json +0 -0
  376. {camel_ai-0.2.71a1 → camel_ai-0.2.71a3}/camel/toolkits/open_api_specs/biztoc/openapi.yaml +0 -0
  377. {camel_ai-0.2.71a1 → camel_ai-0.2.71a3}/camel/toolkits/open_api_specs/coursera/__init__.py +0 -0
  378. {camel_ai-0.2.71a1 → camel_ai-0.2.71a3}/camel/toolkits/open_api_specs/coursera/openapi.yaml +0 -0
  379. {camel_ai-0.2.71a1 → camel_ai-0.2.71a3}/camel/toolkits/open_api_specs/create_qr_code/__init__.py +0 -0
  380. {camel_ai-0.2.71a1 → camel_ai-0.2.71a3}/camel/toolkits/open_api_specs/create_qr_code/openapi.yaml +0 -0
  381. {camel_ai-0.2.71a1 → camel_ai-0.2.71a3}/camel/toolkits/open_api_specs/klarna/__init__.py +0 -0
  382. {camel_ai-0.2.71a1 → camel_ai-0.2.71a3}/camel/toolkits/open_api_specs/klarna/openapi.yaml +0 -0
  383. {camel_ai-0.2.71a1 → camel_ai-0.2.71a3}/camel/toolkits/open_api_specs/nasa_apod/__init__.py +0 -0
  384. {camel_ai-0.2.71a1 → camel_ai-0.2.71a3}/camel/toolkits/open_api_specs/nasa_apod/openapi.yaml +0 -0
  385. {camel_ai-0.2.71a1 → camel_ai-0.2.71a3}/camel/toolkits/open_api_specs/outschool/__init__.py +0 -0
  386. {camel_ai-0.2.71a1 → camel_ai-0.2.71a3}/camel/toolkits/open_api_specs/outschool/ai-plugin.json +0 -0
  387. {camel_ai-0.2.71a1 → camel_ai-0.2.71a3}/camel/toolkits/open_api_specs/outschool/openapi.yaml +0 -0
  388. {camel_ai-0.2.71a1 → camel_ai-0.2.71a3}/camel/toolkits/open_api_specs/outschool/paths/__init__.py +0 -0
  389. {camel_ai-0.2.71a1 → camel_ai-0.2.71a3}/camel/toolkits/open_api_specs/outschool/paths/get_classes.py +0 -0
  390. {camel_ai-0.2.71a1 → camel_ai-0.2.71a3}/camel/toolkits/open_api_specs/outschool/paths/search_teachers.py +0 -0
  391. {camel_ai-0.2.71a1 → camel_ai-0.2.71a3}/camel/toolkits/open_api_specs/security_config.py +0 -0
  392. {camel_ai-0.2.71a1 → camel_ai-0.2.71a3}/camel/toolkits/open_api_specs/speak/__init__.py +0 -0
  393. {camel_ai-0.2.71a1 → camel_ai-0.2.71a3}/camel/toolkits/open_api_specs/speak/openapi.yaml +0 -0
  394. {camel_ai-0.2.71a1 → camel_ai-0.2.71a3}/camel/toolkits/open_api_specs/web_scraper/__init__.py +0 -0
  395. {camel_ai-0.2.71a1 → camel_ai-0.2.71a3}/camel/toolkits/open_api_specs/web_scraper/ai-plugin.json +0 -0
  396. {camel_ai-0.2.71a1 → camel_ai-0.2.71a3}/camel/toolkits/open_api_specs/web_scraper/openapi.yaml +0 -0
  397. {camel_ai-0.2.71a1 → camel_ai-0.2.71a3}/camel/toolkits/open_api_specs/web_scraper/paths/__init__.py +0 -0
  398. {camel_ai-0.2.71a1 → camel_ai-0.2.71a3}/camel/toolkits/open_api_specs/web_scraper/paths/scraper.py +0 -0
  399. {camel_ai-0.2.71a1 → camel_ai-0.2.71a3}/camel/toolkits/open_api_toolkit.py +0 -0
  400. {camel_ai-0.2.71a1 → camel_ai-0.2.71a3}/camel/toolkits/openai_agent_toolkit.py +0 -0
  401. {camel_ai-0.2.71a1 → camel_ai-0.2.71a3}/camel/toolkits/openbb_toolkit.py +0 -0
  402. {camel_ai-0.2.71a1 → camel_ai-0.2.71a3}/camel/toolkits/page_script.js +0 -0
  403. {camel_ai-0.2.71a1 → camel_ai-0.2.71a3}/camel/toolkits/playwright_mcp_toolkit.py +0 -0
  404. {camel_ai-0.2.71a1 → camel_ai-0.2.71a3}/camel/toolkits/pptx_toolkit.py +0 -0
  405. {camel_ai-0.2.71a1 → camel_ai-0.2.71a3}/camel/toolkits/pubmed_toolkit.py +0 -0
  406. {camel_ai-0.2.71a1 → camel_ai-0.2.71a3}/camel/toolkits/pulse_mcp_search_toolkit.py +0 -0
  407. {camel_ai-0.2.71a1 → camel_ai-0.2.71a3}/camel/toolkits/pyautogui_toolkit.py +0 -0
  408. {camel_ai-0.2.71a1 → camel_ai-0.2.71a3}/camel/toolkits/reddit_toolkit.py +0 -0
  409. {camel_ai-0.2.71a1 → camel_ai-0.2.71a3}/camel/toolkits/retrieval_toolkit.py +0 -0
  410. {camel_ai-0.2.71a1 → camel_ai-0.2.71a3}/camel/toolkits/search_toolkit.py +0 -0
  411. {camel_ai-0.2.71a1 → camel_ai-0.2.71a3}/camel/toolkits/searxng_toolkit.py +0 -0
  412. {camel_ai-0.2.71a1 → camel_ai-0.2.71a3}/camel/toolkits/semantic_scholar_toolkit.py +0 -0
  413. {camel_ai-0.2.71a1 → camel_ai-0.2.71a3}/camel/toolkits/slack_toolkit.py +0 -0
  414. {camel_ai-0.2.71a1 → camel_ai-0.2.71a3}/camel/toolkits/stripe_toolkit.py +0 -0
  415. {camel_ai-0.2.71a1 → camel_ai-0.2.71a3}/camel/toolkits/sympy_toolkit.py +0 -0
  416. {camel_ai-0.2.71a1 → camel_ai-0.2.71a3}/camel/toolkits/task_planning_toolkit.py +0 -0
  417. {camel_ai-0.2.71a1 → camel_ai-0.2.71a3}/camel/toolkits/thinking_toolkit.py +0 -0
  418. {camel_ai-0.2.71a1 → camel_ai-0.2.71a3}/camel/toolkits/twitter_toolkit.py +0 -0
  419. {camel_ai-0.2.71a1 → camel_ai-0.2.71a3}/camel/toolkits/video_analysis_toolkit.py +0 -0
  420. {camel_ai-0.2.71a1 → camel_ai-0.2.71a3}/camel/toolkits/weather_toolkit.py +0 -0
  421. {camel_ai-0.2.71a1 → camel_ai-0.2.71a3}/camel/toolkits/whatsapp_toolkit.py +0 -0
  422. {camel_ai-0.2.71a1 → camel_ai-0.2.71a3}/camel/toolkits/wolfram_alpha_toolkit.py +0 -0
  423. {camel_ai-0.2.71a1 → camel_ai-0.2.71a3}/camel/toolkits/zapier_toolkit.py +0 -0
  424. {camel_ai-0.2.71a1 → camel_ai-0.2.71a3}/camel/types/__init__.py +0 -0
  425. {camel_ai-0.2.71a1 → camel_ai-0.2.71a3}/camel/types/agents/__init__.py +0 -0
  426. {camel_ai-0.2.71a1 → camel_ai-0.2.71a3}/camel/types/mcp_registries.py +0 -0
  427. {camel_ai-0.2.71a1 → camel_ai-0.2.71a3}/camel/types/openai_types.py +0 -0
  428. {camel_ai-0.2.71a1 → camel_ai-0.2.71a3}/camel/types/unified_model_type.py +0 -0
  429. {camel_ai-0.2.71a1 → camel_ai-0.2.71a3}/camel/utils/__init__.py +0 -0
  430. {camel_ai-0.2.71a1 → camel_ai-0.2.71a3}/camel/utils/async_func.py +0 -0
  431. {camel_ai-0.2.71a1 → camel_ai-0.2.71a3}/camel/utils/chunker/__init__.py +0 -0
  432. {camel_ai-0.2.71a1 → camel_ai-0.2.71a3}/camel/utils/chunker/base.py +0 -0
  433. {camel_ai-0.2.71a1 → camel_ai-0.2.71a3}/camel/utils/chunker/code_chunker.py +0 -0
  434. {camel_ai-0.2.71a1 → camel_ai-0.2.71a3}/camel/utils/chunker/uio_chunker.py +0 -0
  435. {camel_ai-0.2.71a1 → camel_ai-0.2.71a3}/camel/utils/commons.py +0 -0
  436. {camel_ai-0.2.71a1 → camel_ai-0.2.71a3}/camel/utils/constants.py +0 -0
  437. {camel_ai-0.2.71a1 → camel_ai-0.2.71a3}/camel/utils/deduplication.py +0 -0
  438. {camel_ai-0.2.71a1 → camel_ai-0.2.71a3}/camel/utils/filename.py +0 -0
  439. {camel_ai-0.2.71a1 → camel_ai-0.2.71a3}/camel/utils/langfuse.py +0 -0
  440. {camel_ai-0.2.71a1 → camel_ai-0.2.71a3}/camel/utils/mcp.py +0 -0
  441. {camel_ai-0.2.71a1 → camel_ai-0.2.71a3}/camel/utils/mcp_client.py +0 -0
  442. {camel_ai-0.2.71a1 → camel_ai-0.2.71a3}/camel/utils/response_format.py +0 -0
  443. {camel_ai-0.2.71a1 → camel_ai-0.2.71a3}/camel/utils/token_counting.py +0 -0
  444. {camel_ai-0.2.71a1 → camel_ai-0.2.71a3}/camel/verifiers/__init__.py +0 -0
  445. {camel_ai-0.2.71a1 → camel_ai-0.2.71a3}/camel/verifiers/base.py +0 -0
  446. {camel_ai-0.2.71a1 → camel_ai-0.2.71a3}/camel/verifiers/math_verifier.py +0 -0
  447. {camel_ai-0.2.71a1 → camel_ai-0.2.71a3}/camel/verifiers/models.py +0 -0
  448. {camel_ai-0.2.71a1 → camel_ai-0.2.71a3}/camel/verifiers/physics_verifier.py +0 -0
  449. {camel_ai-0.2.71a1 → camel_ai-0.2.71a3}/camel/verifiers/python_verifier.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: camel-ai
3
- Version: 0.2.71a1
3
+ Version: 0.2.71a3
4
4
  Summary: Communicative Agents for AI Society Study
5
5
  Project-URL: Homepage, https://www.camel-ai.org/
6
6
  Project-URL: Repository, https://github.com/camel-ai/camel
@@ -34,7 +34,7 @@ Requires-Dist: botocore<2,>=1.35.3; extra == 'all'
34
34
  Requires-Dist: chromadb<1.0.0,>=0.6.0; extra == 'all'
35
35
  Requires-Dist: chunkr-ai>=0.0.50; extra == 'all'
36
36
  Requires-Dist: cohere<6,>=5.11.0; extra == 'all'
37
- Requires-Dist: crawl4ai>=0.3.745; extra == 'all'
37
+ Requires-Dist: crawl4ai>=0.4.0; extra == 'all'
38
38
  Requires-Dist: dappier<0.4,>=0.3.3; extra == 'all'
39
39
  Requires-Dist: datacommons-pandas<0.0.4,>=0.0.3; extra == 'all'
40
40
  Requires-Dist: datacommons<2,>=1.4.3; extra == 'all'
@@ -54,7 +54,6 @@ Requires-Dist: ffmpeg-python<0.3,>=0.2.0; extra == 'all'
54
54
  Requires-Dist: firecrawl-py<2,>=1.0.0; extra == 'all'
55
55
  Requires-Dist: fish-audio-sdk<2025,>=2024.12.5; extra == 'all'
56
56
  Requires-Dist: flask>=2.0; extra == 'all'
57
- Requires-Dist: fpdf>=1.7.2; extra == 'all'
58
57
  Requires-Dist: google-api-python-client==2.166.0; extra == 'all'
59
58
  Requires-Dist: google-auth-httplib2==0.2.0; extra == 'all'
60
59
  Requires-Dist: google-auth-oauthlib==1.2.1; extra == 'all'
@@ -99,6 +98,7 @@ Requires-Dist: pygithub<3,>=2.6.0; extra == 'all'
99
98
  Requires-Dist: pylatex>=1.4.2; extra == 'all'
100
99
  Requires-Dist: pymilvus<3,>=2.4.0; extra == 'all'
101
100
  Requires-Dist: pymupdf<2,>=1.22.5; extra == 'all'
101
+ Requires-Dist: pymupdf>=1.26.1; extra == 'all'
102
102
  Requires-Dist: pyobvector>=0.1.18; extra == 'all'
103
103
  Requires-Dist: pyowm<4,>=3.3.0; extra == 'all'
104
104
  Requires-Dist: pytelegrambotapi<5,>=4.18.0; extra == 'all'
@@ -206,7 +206,6 @@ Requires-Dist: chunkr-ai>=0.0.50; extra == 'document-tools'
206
206
  Requires-Dist: crawl4ai>=0.3.745; extra == 'document-tools'
207
207
  Requires-Dist: docx2txt<0.9,>=0.8; extra == 'document-tools'
208
208
  Requires-Dist: docx>=0.2.4; extra == 'document-tools'
209
- Requires-Dist: fpdf>=1.7.2; extra == 'document-tools'
210
209
  Requires-Dist: markitdown==0.1.1; extra == 'document-tools'
211
210
  Requires-Dist: numpy<=2.2,>=1.2; extra == 'document-tools'
212
211
  Requires-Dist: openapi-spec-validator<0.8,>=0.7.1; extra == 'document-tools'
@@ -215,6 +214,7 @@ Requires-Dist: pandasai<3,>=2.3.0; extra == 'document-tools'
215
214
  Requires-Dist: prance<24,>=23.6.21.0; extra == 'document-tools'
216
215
  Requires-Dist: pylatex>=1.4.2; extra == 'document-tools'
217
216
  Requires-Dist: pymupdf<2,>=1.22.5; extra == 'document-tools'
217
+ Requires-Dist: pymupdf>=1.26.1; extra == 'document-tools'
218
218
  Requires-Dist: python-pptx>=1.0.2; extra == 'document-tools'
219
219
  Requires-Dist: tabulate>=0.9.0; extra == 'document-tools'
220
220
  Requires-Dist: unstructured==0.16.20; extra == 'document-tools'
@@ -253,8 +253,8 @@ Requires-Dist: docx2txt<0.9,>=0.8; extra == 'owl'
253
253
  Requires-Dist: docx>=0.2.4; extra == 'owl'
254
254
  Requires-Dist: duckduckgo-search<7,>=6.3.5; extra == 'owl'
255
255
  Requires-Dist: e2b-code-interpreter<2,>=1.0.3; extra == 'owl'
256
+ Requires-Dist: exa-py<2,>=1.10.0; extra == 'owl'
256
257
  Requires-Dist: ffmpeg-python<0.3,>=0.2.0; extra == 'owl'
257
- Requires-Dist: fpdf>=1.7.2; extra == 'owl'
258
258
  Requires-Dist: html2text>=2024.2.26; extra == 'owl'
259
259
  Requires-Dist: imageio[pyav]<3,>=2.34.2; extra == 'owl'
260
260
  Requires-Dist: markitdown==0.1.1; extra == 'owl'
@@ -272,6 +272,7 @@ Requires-Dist: pyautogui<0.10,>=0.9.54; extra == 'owl'
272
272
  Requires-Dist: pydub<0.26,>=0.25.1; extra == 'owl'
273
273
  Requires-Dist: pylatex>=1.4.2; extra == 'owl'
274
274
  Requires-Dist: pymupdf<2,>=1.22.5; extra == 'owl'
275
+ Requires-Dist: pymupdf>=1.26.1; extra == 'owl'
275
276
  Requires-Dist: pytesseract>=0.3.13; extra == 'owl'
276
277
  Requires-Dist: python-dotenv<2,>=1.0.0; extra == 'owl'
277
278
  Requires-Dist: python-pptx>=1.0.2; extra == 'owl'
@@ -756,6 +757,19 @@ Practical guides and tutorials for implementing specific functionalities in CAME
756
757
  <br>
757
758
 
758
759
 
760
+ ## 🗓️ Events
761
+
762
+ We are actively involved in community events including:
763
+
764
+ - 🎙️ **Community Meetings** — Weekly virtual syncs with the CAMEL team
765
+ - 🏆 **Competitions** — Hackathons, Bounty Tasks and coding challenges hosted by CAMEL
766
+ - 🤝 **Volunteer Activities** — Contributions, documentation drives, and mentorship
767
+ - 🌍 **Ambassador Programs** — Represent CAMEL in your university or local tech groups
768
+
769
+ > Want to host or participate in a CAMEL event? Join our [Discord](https://discord.com/invite/CNcNpquyDc) or want to be part of [Ambassador Program](https://www.camel-ai.org/ambassador).
770
+
771
+
772
+
759
773
  ## Contributing to CAMEL
760
774
 
761
775
  > For those who'd like to contribute code, we appreciate your interest in contributing to our open-source initiative. Please take a moment to review our [contributing guidelines](https://github.com/camel-ai/camel/blob/master/CONTRIBUTING.md) to get started on a smooth collaboration journey.🚀
@@ -400,6 +400,19 @@ Practical guides and tutorials for implementing specific functionalities in CAME
400
400
  <br>
401
401
 
402
402
 
403
+ ## 🗓️ Events
404
+
405
+ We are actively involved in community events including:
406
+
407
+ - 🎙️ **Community Meetings** — Weekly virtual syncs with the CAMEL team
408
+ - 🏆 **Competitions** — Hackathons, Bounty Tasks and coding challenges hosted by CAMEL
409
+ - 🤝 **Volunteer Activities** — Contributions, documentation drives, and mentorship
410
+ - 🌍 **Ambassador Programs** — Represent CAMEL in your university or local tech groups
411
+
412
+ > Want to host or participate in a CAMEL event? Join our [Discord](https://discord.com/invite/CNcNpquyDc) or want to be part of [Ambassador Program](https://www.camel-ai.org/ambassador).
413
+
414
+
415
+
403
416
  ## Contributing to CAMEL
404
417
 
405
418
  > For those who'd like to contribute code, we appreciate your interest in contributing to our open-source initiative. Please take a moment to review our [contributing guidelines](https://github.com/camel-ai/camel/blob/master/CONTRIBUTING.md) to get started on a smooth collaboration journey.🚀
@@ -14,7 +14,7 @@
14
14
 
15
15
  from camel.logger import disable_logging, enable_logging, set_log_level
16
16
 
17
- __version__ = '0.2.71a1'
17
+ __version__ = '0.2.71a3'
18
18
 
19
19
  __all__ = [
20
20
  '__version__',
@@ -14,6 +14,7 @@
14
14
  from typing import Any, Dict, List, Optional, Union
15
15
 
16
16
  from openai import AsyncStream, Stream
17
+ from openai.types.chat import ChatCompletionChunk
17
18
  from pydantic import BaseModel, ConfigDict
18
19
 
19
20
  from camel.messages import BaseMessage
@@ -32,8 +33,11 @@ class ModelResponse(BaseModel):
32
33
  r"""The response from the model."""
33
34
 
34
35
  model_config = ConfigDict(arbitrary_types_allowed=True)
35
-
36
- response: Union[ChatCompletion, Stream, AsyncStream]
36
+ response: Union[
37
+ ChatCompletion,
38
+ Stream[ChatCompletionChunk],
39
+ AsyncStream[ChatCompletionChunk],
40
+ ]
37
41
  tool_call_requests: Optional[List[ToolCallRequest]]
38
42
  output_messages: List[BaseMessage]
39
43
  finish_reasons: List[str]
@@ -13,10 +13,12 @@
13
13
  # ========= Copyright 2023-2024 @ CAMEL-AI.org. All Rights Reserved. =========
14
14
  from __future__ import annotations
15
15
 
16
+ import asyncio
16
17
  import json
17
18
  import logging
18
19
  import textwrap
19
20
  import threading
21
+ import time
20
22
  import uuid
21
23
  from collections import defaultdict
22
24
  from pathlib import Path
@@ -83,6 +85,7 @@ from camel.utils import (
83
85
  model_from_json_schema,
84
86
  )
85
87
  from camel.utils.commons import dependencies_required
88
+ from camel.utils.tool_result import ToolResult
86
89
 
87
90
  if TYPE_CHECKING:
88
91
  from camel.terminators import ResponseTerminator
@@ -173,6 +176,11 @@ class ChatAgent(BaseAgent):
173
176
  stop_event (Optional[threading.Event], optional): Event to signal
174
177
  termination of the agent's operation. When set, the agent will
175
178
  terminate its execution. (default: :obj:`None`)
179
+ mask_tool_output (Optional[bool]): Whether to return a sanitized
180
+ placeholder instead of the raw tool output. (default: :obj:`False`)
181
+ pause_event (Optional[asyncio.Event]): Event to signal pause of the
182
+ agent's operation. When clear, the agent will pause its execution.
183
+ (default: :obj:`None`)
176
184
  """
177
185
 
178
186
  def __init__(
@@ -206,6 +214,8 @@ class ChatAgent(BaseAgent):
206
214
  max_iteration: Optional[int] = None,
207
215
  agent_id: Optional[str] = None,
208
216
  stop_event: Optional[threading.Event] = None,
217
+ mask_tool_output: bool = False,
218
+ pause_event: Optional[asyncio.Event] = None,
209
219
  ) -> None:
210
220
  if isinstance(model, ModelManager):
211
221
  self.model_backend = model
@@ -280,11 +290,19 @@ class ChatAgent(BaseAgent):
280
290
  self.response_terminators = response_terminators or []
281
291
  self.max_iteration = max_iteration
282
292
  self.stop_event = stop_event
293
+ self.mask_tool_output = mask_tool_output
294
+ self._secure_result_store: Dict[str, Any] = {}
295
+ self._pending_images: List[str] = []
296
+ self._image_retry_count: Dict[str, int] = {}
297
+ # Store images to attach to next user message
298
+ self.pause_event = pause_event
283
299
 
284
300
  def reset(self):
285
301
  r"""Resets the :obj:`ChatAgent` to its initial state."""
286
302
  self.terminated = False
287
303
  self.init_messages()
304
+ self._pending_images = []
305
+ self._image_retry_count = {}
288
306
  for terminator in self.response_terminators:
289
307
  terminator.reset()
290
308
 
@@ -1128,6 +1146,16 @@ class ChatAgent(BaseAgent):
1128
1146
  role_name="User", content=input_message
1129
1147
  )
1130
1148
 
1149
+ # Attach any pending images from previous tool calls
1150
+ image_list = self._process_pending_images()
1151
+ if image_list:
1152
+ # Create new message with images attached
1153
+ input_message = BaseMessage.make_user_message(
1154
+ role_name="User",
1155
+ content=input_message.content,
1156
+ image_list=image_list,
1157
+ )
1158
+
1131
1159
  # Add user input to memory
1132
1160
  self.update_memory(input_message, OpenAIBackendRole.USER)
1133
1161
 
@@ -1143,6 +1171,10 @@ class ChatAgent(BaseAgent):
1143
1171
  iteration_count = 0
1144
1172
 
1145
1173
  while True:
1174
+ if self.pause_event is not None and not self.pause_event.is_set():
1175
+ while not self.pause_event.is_set():
1176
+ time.sleep(0.001)
1177
+
1146
1178
  try:
1147
1179
  openai_messages, num_tokens = self.memory.get_context()
1148
1180
  accumulated_context_tokens += num_tokens
@@ -1184,6 +1216,12 @@ class ChatAgent(BaseAgent):
1184
1216
  external_tool_call_requests = []
1185
1217
  external_tool_call_requests.append(tool_call_request)
1186
1218
  else:
1219
+ if (
1220
+ self.pause_event is not None
1221
+ and not self.pause_event.is_set()
1222
+ ):
1223
+ while not self.pause_event.is_set():
1224
+ time.sleep(0.001)
1187
1225
  tool_call_records.append(
1188
1226
  self._execute_tool(tool_call_request)
1189
1227
  )
@@ -1275,6 +1313,16 @@ class ChatAgent(BaseAgent):
1275
1313
  role_name="User", content=input_message
1276
1314
  )
1277
1315
 
1316
+ # Attach any pending images from previous tool calls
1317
+ image_list = self._process_pending_images()
1318
+ if image_list:
1319
+ # Create new message with images attached
1320
+ input_message = BaseMessage.make_user_message(
1321
+ role_name="User",
1322
+ content=input_message.content,
1323
+ image_list=image_list,
1324
+ )
1325
+
1278
1326
  self.update_memory(input_message, OpenAIBackendRole.USER)
1279
1327
 
1280
1328
  tool_call_records: List[ToolCallingRecord] = []
@@ -1287,6 +1335,8 @@ class ChatAgent(BaseAgent):
1287
1335
  step_token_usage = self._create_token_usage_tracker()
1288
1336
  iteration_count = 0
1289
1337
  while True:
1338
+ if self.pause_event is not None and not self.pause_event.is_set():
1339
+ await self.pause_event.wait()
1290
1340
  try:
1291
1341
  openai_messages, num_tokens = self.memory.get_context()
1292
1342
  accumulated_context_tokens += num_tokens
@@ -1319,6 +1369,7 @@ class ChatAgent(BaseAgent):
1319
1369
 
1320
1370
  if tool_call_requests := response.tool_call_requests:
1321
1371
  # Process all tool calls
1372
+ new_images_from_tools = []
1322
1373
  for tool_call_request in tool_call_requests:
1323
1374
  if (
1324
1375
  tool_call_request.tool_name
@@ -1328,15 +1379,82 @@ class ChatAgent(BaseAgent):
1328
1379
  external_tool_call_requests = []
1329
1380
  external_tool_call_requests.append(tool_call_request)
1330
1381
  else:
1382
+ if (
1383
+ self.pause_event is not None
1384
+ and not self.pause_event.is_set()
1385
+ ):
1386
+ await self.pause_event.wait()
1331
1387
  tool_call_record = await self._aexecute_tool(
1332
1388
  tool_call_request
1333
1389
  )
1334
1390
  tool_call_records.append(tool_call_record)
1335
1391
 
1392
+ # Check if this tool call produced images
1393
+ if (
1394
+ hasattr(tool_call_record, 'images')
1395
+ and tool_call_record.images
1396
+ ):
1397
+ new_images_from_tools.extend(
1398
+ tool_call_record.images
1399
+ )
1400
+
1336
1401
  # If we found an external tool call, break the loop
1337
1402
  if external_tool_call_requests:
1338
1403
  break
1339
1404
 
1405
+ # If tools produced images
1406
+ # send them to the model as a user message
1407
+ if new_images_from_tools:
1408
+ # Convert base64 images to PIL Images
1409
+ image_list = []
1410
+ for img_data in new_images_from_tools:
1411
+ try:
1412
+ import base64
1413
+ import io
1414
+
1415
+ from PIL import Image
1416
+
1417
+ # Extract base64 data from data URL format
1418
+ if img_data.startswith("data:image"):
1419
+ # Format:
1420
+ # "data:image/png;base64,iVBORw0KGgo..."
1421
+ base64_data = img_data.split(',', 1)[1]
1422
+ else:
1423
+ # Raw base64 data
1424
+ base64_data = img_data
1425
+
1426
+ # Decode and create PIL Image
1427
+ image_bytes = base64.b64decode(base64_data)
1428
+ pil_image = Image.open(io.BytesIO(image_bytes))
1429
+ # Convert to ensure proper
1430
+ # Image.Image type for compatibility
1431
+ pil_image_tool_result: Image.Image = (
1432
+ pil_image.convert('RGB')
1433
+ )
1434
+ image_list.append(pil_image_tool_result)
1435
+
1436
+ except Exception as e:
1437
+ logger.warning(
1438
+ f"Failed to convert "
1439
+ f"base64 image to PIL for immediate use: {e}"
1440
+ )
1441
+ continue
1442
+
1443
+ # If we have valid images
1444
+ # create a user message with images
1445
+ if image_list:
1446
+ # Create a user message with images
1447
+ # to provide visual context immediately
1448
+ image_message = BaseMessage.make_user_message(
1449
+ role_name="User",
1450
+ content="[Visual content from tool execution - please analyze and continue]", # noqa: E501
1451
+ image_list=image_list,
1452
+ )
1453
+
1454
+ self.update_memory(
1455
+ image_message, OpenAIBackendRole.USER
1456
+ )
1457
+
1340
1458
  if (
1341
1459
  self.max_iteration is not None
1342
1460
  and iteration_count >= self.max_iteration
@@ -1423,6 +1541,69 @@ class ChatAgent(BaseAgent):
1423
1541
  info=info,
1424
1542
  )
1425
1543
 
1544
+ def _process_pending_images(self) -> List:
1545
+ r"""Process pending images with retry logic and return PIL Image list.
1546
+
1547
+ Returns:
1548
+ List: List of successfully converted PIL Images.
1549
+ """
1550
+ if not self._pending_images:
1551
+ return []
1552
+
1553
+ image_list = []
1554
+ successfully_processed = []
1555
+ failed_images = []
1556
+
1557
+ for img_data in self._pending_images:
1558
+ # Track retry count
1559
+ retry_count = self._image_retry_count.get(img_data, 0)
1560
+
1561
+ # Remove images that have failed too many times (max 3 attempts)
1562
+ if retry_count >= 3:
1563
+ failed_images.append(img_data)
1564
+ logger.warning(
1565
+ f"Removing image after {retry_count} failed attempts"
1566
+ )
1567
+ continue
1568
+
1569
+ try:
1570
+ import base64
1571
+ import io
1572
+
1573
+ from PIL import Image
1574
+
1575
+ # Extract base64 data from data URL format
1576
+ if img_data.startswith("data:image"):
1577
+ # Format: "data:image/png;base64,iVBORw0KGgo..."
1578
+ base64_data = img_data.split(',', 1)[1]
1579
+ else:
1580
+ # Raw base64 data
1581
+ base64_data = img_data
1582
+
1583
+ # Decode and create PIL Image
1584
+ image_bytes = base64.b64decode(base64_data)
1585
+ pil_image = Image.open(io.BytesIO(image_bytes))
1586
+ pil_image_converted: Image.Image = pil_image.convert('RGB')
1587
+ image_list.append(pil_image_converted)
1588
+ successfully_processed.append(img_data)
1589
+
1590
+ except Exception as e:
1591
+ # Increment retry count for failed conversion
1592
+ self._image_retry_count[img_data] = retry_count + 1
1593
+ logger.warning(
1594
+ f"Failed to convert base64 image to PIL "
1595
+ f"(attempt {retry_count + 1}/3): {e}"
1596
+ )
1597
+ continue
1598
+
1599
+ # Clean up processed and failed images
1600
+ for img in successfully_processed + failed_images:
1601
+ self._pending_images.remove(img)
1602
+ # Clean up retry count for processed/removed images
1603
+ self._image_retry_count.pop(img, None)
1604
+
1605
+ return image_list
1606
+
1426
1607
  def _record_final_output(self, output_messages: List[BaseMessage]) -> None:
1427
1608
  r"""Log final messages or warnings about multiple responses."""
1428
1609
  if len(output_messages) == 1:
@@ -1433,6 +1614,61 @@ class ChatAgent(BaseAgent):
1433
1614
  "selected message manually using `record_message()`."
1434
1615
  )
1435
1616
 
1617
+ def _is_vision_error(self, exc: Exception) -> bool:
1618
+ r"""Check if the exception is likely related to vision/image is not
1619
+ supported by the model."""
1620
+ # TODO: more robust vision error detection
1621
+ error_msg = str(exc).lower()
1622
+ vision_keywords = [
1623
+ 'vision',
1624
+ 'image',
1625
+ 'multimodal',
1626
+ 'unsupported',
1627
+ 'invalid content type',
1628
+ 'image_url',
1629
+ 'visual',
1630
+ ]
1631
+ return any(keyword in error_msg for keyword in vision_keywords)
1632
+
1633
+ def _has_images(self, messages: List[OpenAIMessage]) -> bool:
1634
+ r"""Check if any message contains images."""
1635
+ for msg in messages:
1636
+ content = msg.get('content')
1637
+ if isinstance(content, list):
1638
+ for item in content:
1639
+ if (
1640
+ isinstance(item, dict)
1641
+ and item.get('type') == 'image_url'
1642
+ ):
1643
+ return True
1644
+ return False
1645
+
1646
+ def _strip_images_from_messages(
1647
+ self, messages: List[OpenAIMessage]
1648
+ ) -> List[OpenAIMessage]:
1649
+ r"""Remove images from messages, keeping only text content."""
1650
+ stripped_messages = []
1651
+ for msg in messages:
1652
+ content = msg.get('content')
1653
+ if isinstance(content, list):
1654
+ # Extract only text content from multimodal messages
1655
+ text_content = ""
1656
+ for item in content:
1657
+ if isinstance(item, dict) and item.get('type') == 'text':
1658
+ text_content += item.get('text', '')
1659
+
1660
+ # Create new message with only text content
1661
+ new_msg = msg.copy()
1662
+ new_msg['content'] = (
1663
+ text_content
1664
+ or "[Image content removed - model doesn't support vision]"
1665
+ )
1666
+ stripped_messages.append(new_msg)
1667
+ else:
1668
+ # Regular text message, keep as is
1669
+ stripped_messages.append(msg)
1670
+ return stripped_messages
1671
+
1436
1672
  def _get_model_response(
1437
1673
  self,
1438
1674
  openai_messages: List[OpenAIMessage],
@@ -1448,13 +1684,33 @@ class ChatAgent(BaseAgent):
1448
1684
  openai_messages, response_format, tool_schemas or None
1449
1685
  )
1450
1686
  except Exception as exc:
1451
- logger.error(
1452
- f"An error occurred while running model "
1453
- f"{self.model_backend.model_type}, "
1454
- f"index: {self.model_backend.current_model_index}",
1455
- exc_info=exc,
1456
- )
1457
- error_info = str(exc)
1687
+ # Try again without images if the error might be vision-related
1688
+ if self._is_vision_error(exc) and self._has_images(
1689
+ openai_messages
1690
+ ):
1691
+ logger.warning(
1692
+ "Model appears to not support vision. Retrying without images." # noqa: E501
1693
+ )
1694
+ try:
1695
+ stripped_messages = self._strip_images_from_messages(
1696
+ openai_messages
1697
+ )
1698
+ response = self.model_backend.run(
1699
+ stripped_messages,
1700
+ response_format,
1701
+ tool_schemas or None,
1702
+ )
1703
+ except Exception:
1704
+ pass # Fall through to original error handling
1705
+
1706
+ if not response:
1707
+ logger.error(
1708
+ f"An error occurred while running model "
1709
+ f"{self.model_backend.model_type}, "
1710
+ f"index: {self.model_backend.current_model_index}",
1711
+ exc_info=exc,
1712
+ )
1713
+ error_info = str(exc)
1458
1714
 
1459
1715
  if not response and self.model_backend.num_models > 1:
1460
1716
  raise ModelProcessingError(
@@ -1496,13 +1752,33 @@ class ChatAgent(BaseAgent):
1496
1752
  openai_messages, response_format, tool_schemas or None
1497
1753
  )
1498
1754
  except Exception as exc:
1499
- logger.error(
1500
- f"An error occurred while running model "
1501
- f"{self.model_backend.model_type}, "
1502
- f"index: {self.model_backend.current_model_index}",
1503
- exc_info=exc,
1504
- )
1505
- error_info = str(exc)
1755
+ # Try again without images if the error might be vision-related
1756
+ if self._is_vision_error(exc) and self._has_images(
1757
+ openai_messages
1758
+ ):
1759
+ logger.warning(
1760
+ "Model appears to not support vision. Retrying without images." # noqa: E501
1761
+ )
1762
+ try:
1763
+ stripped_messages = self._strip_images_from_messages(
1764
+ openai_messages
1765
+ )
1766
+ response = await self.model_backend.arun(
1767
+ stripped_messages,
1768
+ response_format,
1769
+ tool_schemas or None,
1770
+ )
1771
+ except Exception:
1772
+ pass # Fall through to original error handling
1773
+
1774
+ if not response:
1775
+ logger.error(
1776
+ f"An error occurred while running model "
1777
+ f"{self.model_backend.model_type}, "
1778
+ f"index: {self.model_backend.current_model_index}",
1779
+ exc_info=exc,
1780
+ )
1781
+ error_info = str(exc)
1506
1782
 
1507
1783
  if not response and self.model_backend.num_models > 1:
1508
1784
  raise ModelProcessingError(
@@ -1958,14 +2234,43 @@ class ChatAgent(BaseAgent):
1958
2234
  tool_call_id = tool_call_request.tool_call_id
1959
2235
  tool = self._internal_tools[func_name]
1960
2236
  try:
1961
- result = tool(**args)
2237
+ raw_result = tool(**args)
2238
+ if self.mask_tool_output:
2239
+ self._secure_result_store[tool_call_id] = raw_result
2240
+ result = (
2241
+ "[The tool has been executed successfully, but the output"
2242
+ " from the tool is masked. You can move forward]"
2243
+ )
2244
+ mask_flag = True
2245
+ else:
2246
+ result = raw_result
2247
+ mask_flag = False
1962
2248
  except Exception as e:
1963
2249
  # Capture the error message to prevent framework crash
1964
2250
  error_msg = f"Error executing tool '{func_name}': {e!s}"
1965
- result = {"error": error_msg}
2251
+ result = f"Tool execution failed: {error_msg}"
2252
+ mask_flag = False
1966
2253
  logging.warning(error_msg)
1967
2254
 
1968
- return self._record_tool_calling(func_name, args, result, tool_call_id)
2255
+ # Check if result is a ToolResult with images
2256
+ images_to_attach = None
2257
+ if isinstance(result, ToolResult):
2258
+ images_to_attach = result.images
2259
+ result = str(result) # Use string representation for storage
2260
+
2261
+ tool_record = self._record_tool_calling(
2262
+ func_name, args, result, tool_call_id, mask_output=mask_flag
2263
+ )
2264
+
2265
+ # Store images for later attachment to next user message
2266
+ if images_to_attach:
2267
+ tool_record.images = images_to_attach
2268
+ # Add images with duplicate prevention
2269
+ for img in images_to_attach:
2270
+ if img not in self._pending_images:
2271
+ self._pending_images.append(img)
2272
+
2273
+ return tool_record
1969
2274
 
1970
2275
  async def _aexecute_tool(
1971
2276
  self,
@@ -2007,7 +2312,25 @@ class ChatAgent(BaseAgent):
2007
2312
  result = {"error": error_msg}
2008
2313
  logging.warning(error_msg)
2009
2314
 
2010
- return self._record_tool_calling(func_name, args, result, tool_call_id)
2315
+ # Check if result is a ToolResult with images
2316
+ images_to_attach = None
2317
+ if isinstance(result, ToolResult):
2318
+ images_to_attach = result.images
2319
+ result = str(result) # Use string representation for storage
2320
+
2321
+ tool_record = self._record_tool_calling(
2322
+ func_name, args, result, tool_call_id
2323
+ )
2324
+
2325
+ # Store images for later attachment to next user message
2326
+ if images_to_attach:
2327
+ tool_record.images = images_to_attach
2328
+ # Add images with duplicate prevention
2329
+ for img in images_to_attach:
2330
+ if img not in self._pending_images:
2331
+ self._pending_images.append(img)
2332
+
2333
+ return tool_record
2011
2334
 
2012
2335
  def _record_tool_calling(
2013
2336
  self,
@@ -2015,9 +2338,23 @@ class ChatAgent(BaseAgent):
2015
2338
  args: Dict[str, Any],
2016
2339
  result: Any,
2017
2340
  tool_call_id: str,
2341
+ mask_output: bool = False,
2018
2342
  ):
2019
2343
  r"""Record the tool calling information in the memory, and return the
2020
2344
  tool calling record.
2345
+
2346
+ Args:
2347
+ func_name (str): The name of the tool function called.
2348
+ args (Dict[str, Any]): The arguments passed to the tool.
2349
+ result (Any): The result returned by the tool execution.
2350
+ tool_call_id (str): A unique identifier for the tool call.
2351
+ mask_output (bool, optional): Whether to return a sanitized
2352
+ placeholder instead of the raw tool output.
2353
+ (default: :obj:`False`)
2354
+
2355
+ Returns:
2356
+ ToolCallingRecord: A struct containing information about
2357
+ this tool call.
2021
2358
  """
2022
2359
  assist_msg = FunctionCallingMessage(
2023
2360
  role_name=self.role_name,
@@ -2036,6 +2373,7 @@ class ChatAgent(BaseAgent):
2036
2373
  func_name=func_name,
2037
2374
  result=result,
2038
2375
  tool_call_id=tool_call_id,
2376
+ mask_output=mask_output,
2039
2377
  )
2040
2378
 
2041
2379
  # Use precise timestamps to ensure correct ordering
@@ -2140,6 +2478,7 @@ class ChatAgent(BaseAgent):
2140
2478
  ),
2141
2479
  max_iteration=self.max_iteration,
2142
2480
  stop_event=self.stop_event,
2481
+ pause_event=self.pause_event,
2143
2482
  )
2144
2483
 
2145
2484
  # Copy memory if requested