camel-ai 0.2.71a6__tar.gz → 0.2.71a8__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 (455) hide show
  1. {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/PKG-INFO +1 -1
  2. {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/__init__.py +1 -1
  3. {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/societies/workforce/single_agent_worker.py +2 -0
  4. {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/societies/workforce/task_channel.py +4 -1
  5. {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/societies/workforce/worker.py +2 -0
  6. {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/societies/workforce/workforce.py +20 -20
  7. {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/toolkits/file_write_toolkit.py +198 -132
  8. {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/toolkits/hybrid_browser_toolkit/actions.py +28 -18
  9. {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/toolkits/hybrid_browser_toolkit/agent.py +7 -1
  10. {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/toolkits/hybrid_browser_toolkit/browser_session.py +48 -18
  11. camel_ai-0.2.71a8/camel/toolkits/hybrid_browser_toolkit/config_loader.py +447 -0
  12. {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/toolkits/hybrid_browser_toolkit/hybrid_browser_toolkit.py +272 -85
  13. {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/toolkits/hybrid_browser_toolkit/snapshot.py +5 -4
  14. camel_ai-0.2.71a8/camel/toolkits/hybrid_browser_toolkit/unified_analyzer.js +1002 -0
  15. {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/toolkits/note_taking_toolkit.py +24 -9
  16. {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/toolkits/pptx_toolkit.py +21 -8
  17. {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/toolkits/search_toolkit.py +15 -5
  18. {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/pyproject.toml +1 -1
  19. camel_ai-0.2.71a6/camel/toolkits/hybrid_browser_toolkit/stealth_config.py +0 -116
  20. camel_ai-0.2.71a6/camel/toolkits/hybrid_browser_toolkit/unified_analyzer.js +0 -447
  21. {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/.gitignore +0 -0
  22. {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/LICENSE +0 -0
  23. {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/README.md +0 -0
  24. {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/agents/__init__.py +0 -0
  25. {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/agents/_types.py +0 -0
  26. {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/agents/_utils.py +0 -0
  27. {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/agents/base.py +0 -0
  28. {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/agents/chat_agent.py +0 -0
  29. {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/agents/critic_agent.py +0 -0
  30. {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/agents/deductive_reasoner_agent.py +0 -0
  31. {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/agents/embodied_agent.py +0 -0
  32. {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/agents/knowledge_graph_agent.py +0 -0
  33. {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/agents/mcp_agent.py +0 -0
  34. {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/agents/multi_hop_generator_agent.py +0 -0
  35. {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/agents/programmed_agent_instruction.py +0 -0
  36. {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/agents/repo_agent.py +0 -0
  37. {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/agents/role_assignment_agent.py +0 -0
  38. {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/agents/search_agent.py +0 -0
  39. {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/agents/task_agent.py +0 -0
  40. {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/agents/tool_agents/__init__.py +0 -0
  41. {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/agents/tool_agents/base.py +0 -0
  42. {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/agents/tool_agents/hugging_face_tool_agent.py +0 -0
  43. {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/benchmarks/__init__.py +0 -0
  44. {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/benchmarks/apibank.py +0 -0
  45. {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/benchmarks/apibench.py +0 -0
  46. {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/benchmarks/base.py +0 -0
  47. {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/benchmarks/browsecomp.py +0 -0
  48. {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/benchmarks/gaia.py +0 -0
  49. {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/benchmarks/mock_website/README.md +0 -0
  50. {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/benchmarks/mock_website/mock_web.py +0 -0
  51. {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/benchmarks/mock_website/requirements.txt +0 -0
  52. {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/benchmarks/mock_website/shopping_mall/app.py +0 -0
  53. {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/benchmarks/mock_website/task.json +0 -0
  54. {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/benchmarks/nexus.py +0 -0
  55. {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/benchmarks/ragbench.py +0 -0
  56. {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/bots/__init__.py +0 -0
  57. {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/bots/discord/__init__.py +0 -0
  58. {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/bots/discord/discord_app.py +0 -0
  59. {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/bots/discord/discord_installation.py +0 -0
  60. {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/bots/discord/discord_store.py +0 -0
  61. {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/bots/slack/__init__.py +0 -0
  62. {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/bots/slack/models.py +0 -0
  63. {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/bots/slack/slack_app.py +0 -0
  64. {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/bots/telegram_bot.py +0 -0
  65. {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/configs/__init__.py +0 -0
  66. {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/configs/aiml_config.py +0 -0
  67. {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/configs/anthropic_config.py +0 -0
  68. {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/configs/base_config.py +0 -0
  69. {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/configs/bedrock_config.py +0 -0
  70. {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/configs/cohere_config.py +0 -0
  71. {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/configs/crynux_config.py +0 -0
  72. {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/configs/deepseek_config.py +0 -0
  73. {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/configs/gemini_config.py +0 -0
  74. {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/configs/groq_config.py +0 -0
  75. {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/configs/internlm_config.py +0 -0
  76. {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/configs/litellm_config.py +0 -0
  77. {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/configs/lmstudio_config.py +0 -0
  78. {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/configs/mistral_config.py +0 -0
  79. {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/configs/modelscope_config.py +0 -0
  80. {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/configs/moonshot_config.py +0 -0
  81. {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/configs/netmind_config.py +0 -0
  82. {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/configs/novita_config.py +0 -0
  83. {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/configs/nvidia_config.py +0 -0
  84. {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/configs/ollama_config.py +0 -0
  85. {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/configs/openai_config.py +0 -0
  86. {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/configs/openrouter_config.py +0 -0
  87. {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/configs/ppio_config.py +0 -0
  88. {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/configs/qianfan_config.py +0 -0
  89. {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/configs/qwen_config.py +0 -0
  90. {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/configs/reka_config.py +0 -0
  91. {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/configs/samba_config.py +0 -0
  92. {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/configs/sglang_config.py +0 -0
  93. {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/configs/siliconflow_config.py +0 -0
  94. {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/configs/togetherai_config.py +0 -0
  95. {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/configs/vllm_config.py +0 -0
  96. {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/configs/watsonx_config.py +0 -0
  97. {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/configs/yi_config.py +0 -0
  98. {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/configs/zhipuai_config.py +0 -0
  99. {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/data_collectors/__init__.py +0 -0
  100. {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/data_collectors/alpaca_collector.py +0 -0
  101. {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/data_collectors/base.py +0 -0
  102. {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/data_collectors/sharegpt_collector.py +0 -0
  103. {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/datagen/__init__.py +0 -0
  104. {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/datagen/cot_datagen.py +0 -0
  105. {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/datagen/evol_instruct/__init__.py +0 -0
  106. {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/datagen/evol_instruct/evol_instruct.py +0 -0
  107. {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/datagen/evol_instruct/scorer.py +0 -0
  108. {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/datagen/evol_instruct/templates.py +0 -0
  109. {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/datagen/self_improving_cot.py +0 -0
  110. {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/datagen/self_instruct/__init__.py +0 -0
  111. {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/datagen/self_instruct/filter/__init__.py +0 -0
  112. {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/datagen/self_instruct/filter/filter_function.py +0 -0
  113. {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/datagen/self_instruct/filter/filter_registry.py +0 -0
  114. {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/datagen/self_instruct/filter/instruction_filter.py +0 -0
  115. {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/datagen/self_instruct/self_instruct.py +0 -0
  116. {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/datagen/self_instruct/templates.py +0 -0
  117. {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/datagen/source2synth/__init__.py +0 -0
  118. {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/datagen/source2synth/data_processor.py +0 -0
  119. {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/datagen/source2synth/models.py +0 -0
  120. {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/datagen/source2synth/user_data_processor_config.py +0 -0
  121. {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/datahubs/__init__.py +0 -0
  122. {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/datahubs/base.py +0 -0
  123. {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/datahubs/huggingface.py +0 -0
  124. {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/datahubs/models.py +0 -0
  125. {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/datasets/__init__.py +0 -0
  126. {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/datasets/base_generator.py +0 -0
  127. {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/datasets/few_shot_generator.py +0 -0
  128. {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/datasets/models.py +0 -0
  129. {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/datasets/self_instruct_generator.py +0 -0
  130. {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/datasets/static_dataset.py +0 -0
  131. {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/embeddings/__init__.py +0 -0
  132. {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/embeddings/azure_embedding.py +0 -0
  133. {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/embeddings/base.py +0 -0
  134. {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/embeddings/gemini_embedding.py +0 -0
  135. {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/embeddings/jina_embedding.py +0 -0
  136. {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/embeddings/mistral_embedding.py +0 -0
  137. {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/embeddings/openai_compatible_embedding.py +0 -0
  138. {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/embeddings/openai_embedding.py +0 -0
  139. {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/embeddings/sentence_transformers_embeddings.py +0 -0
  140. {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/embeddings/together_embedding.py +0 -0
  141. {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/embeddings/vlm_embedding.py +0 -0
  142. {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/environments/__init__.py +0 -0
  143. {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/environments/models.py +0 -0
  144. {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/environments/multi_step.py +0 -0
  145. {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/environments/rlcards_env.py +0 -0
  146. {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/environments/single_step.py +0 -0
  147. {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/environments/tic_tac_toe.py +0 -0
  148. {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/extractors/__init__.py +0 -0
  149. {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/extractors/base.py +0 -0
  150. {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/extractors/python_strategies.py +0 -0
  151. {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/generators.py +0 -0
  152. {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/human.py +0 -0
  153. {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/interpreters/__init__.py +0 -0
  154. {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/interpreters/base.py +0 -0
  155. {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/interpreters/docker/Dockerfile +0 -0
  156. {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/interpreters/docker_interpreter.py +0 -0
  157. {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/interpreters/e2b_interpreter.py +0 -0
  158. {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/interpreters/internal_python_interpreter.py +0 -0
  159. {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/interpreters/interpreter_error.py +0 -0
  160. {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/interpreters/ipython_interpreter.py +0 -0
  161. {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/interpreters/subprocess_interpreter.py +0 -0
  162. {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/loaders/__init__.py +0 -0
  163. {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/loaders/apify_reader.py +0 -0
  164. {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/loaders/base_io.py +0 -0
  165. {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/loaders/base_loader.py +0 -0
  166. {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/loaders/chunkr_reader.py +0 -0
  167. {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/loaders/crawl4ai_reader.py +0 -0
  168. {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/loaders/firecrawl_reader.py +0 -0
  169. {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/loaders/jina_url_reader.py +0 -0
  170. {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/loaders/markitdown.py +0 -0
  171. {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/loaders/mineru_extractor.py +0 -0
  172. {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/loaders/mistral_reader.py +0 -0
  173. {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/loaders/pandas_reader.py +0 -0
  174. {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/loaders/scrapegraph_reader.py +0 -0
  175. {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/loaders/unstructured_io.py +0 -0
  176. {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/logger.py +0 -0
  177. {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/memories/__init__.py +0 -0
  178. {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/memories/agent_memories.py +0 -0
  179. {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/memories/base.py +0 -0
  180. {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/memories/blocks/__init__.py +0 -0
  181. {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/memories/blocks/chat_history_block.py +0 -0
  182. {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/memories/blocks/vectordb_block.py +0 -0
  183. {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/memories/context_creators/__init__.py +0 -0
  184. {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/memories/context_creators/score_based.py +0 -0
  185. {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/memories/records.py +0 -0
  186. {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/messages/__init__.py +0 -0
  187. {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/messages/base.py +0 -0
  188. {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/messages/conversion/__init__.py +0 -0
  189. {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/messages/conversion/alpaca.py +0 -0
  190. {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/messages/conversion/conversation_models.py +0 -0
  191. {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/messages/conversion/sharegpt/__init__.py +0 -0
  192. {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/messages/conversion/sharegpt/function_call_formatter.py +0 -0
  193. {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/messages/conversion/sharegpt/hermes/__init__.py +0 -0
  194. {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/messages/conversion/sharegpt/hermes/hermes_function_formatter.py +0 -0
  195. {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/messages/func_message.py +0 -0
  196. {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/models/__init__.py +0 -0
  197. {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/models/_utils.py +0 -0
  198. {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/models/aiml_model.py +0 -0
  199. {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/models/anthropic_model.py +0 -0
  200. {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/models/aws_bedrock_model.py +0 -0
  201. {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/models/azure_openai_model.py +0 -0
  202. {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/models/base_audio_model.py +0 -0
  203. {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/models/base_model.py +0 -0
  204. {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/models/cohere_model.py +0 -0
  205. {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/models/crynux_model.py +0 -0
  206. {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/models/deepseek_model.py +0 -0
  207. {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/models/fish_audio_model.py +0 -0
  208. {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/models/gemini_model.py +0 -0
  209. {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/models/groq_model.py +0 -0
  210. {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/models/internlm_model.py +0 -0
  211. {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/models/litellm_model.py +0 -0
  212. {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/models/lmstudio_model.py +0 -0
  213. {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/models/mistral_model.py +0 -0
  214. {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/models/model_factory.py +0 -0
  215. {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/models/model_manager.py +0 -0
  216. {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/models/modelscope_model.py +0 -0
  217. {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/models/moonshot_model.py +0 -0
  218. {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/models/nemotron_model.py +0 -0
  219. {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/models/netmind_model.py +0 -0
  220. {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/models/novita_model.py +0 -0
  221. {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/models/nvidia_model.py +0 -0
  222. {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/models/ollama_model.py +0 -0
  223. {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/models/openai_audio_models.py +0 -0
  224. {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/models/openai_compatible_model.py +0 -0
  225. {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/models/openai_model.py +0 -0
  226. {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/models/openrouter_model.py +0 -0
  227. {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/models/ppio_model.py +0 -0
  228. {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/models/qianfan_model.py +0 -0
  229. {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/models/qwen_model.py +0 -0
  230. {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/models/reka_model.py +0 -0
  231. {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/models/reward/__init__.py +0 -0
  232. {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/models/reward/base_reward_model.py +0 -0
  233. {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/models/reward/evaluator.py +0 -0
  234. {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/models/reward/nemotron_model.py +0 -0
  235. {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/models/reward/skywork_model.py +0 -0
  236. {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/models/samba_model.py +0 -0
  237. {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/models/sglang_model.py +0 -0
  238. {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/models/siliconflow_model.py +0 -0
  239. {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/models/stub_model.py +0 -0
  240. {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/models/togetherai_model.py +0 -0
  241. {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/models/vllm_model.py +0 -0
  242. {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/models/volcano_model.py +0 -0
  243. {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/models/watsonx_model.py +0 -0
  244. {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/models/yi_model.py +0 -0
  245. {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/models/zhipuai_model.py +0 -0
  246. {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/personas/__init__.py +0 -0
  247. {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/personas/persona.py +0 -0
  248. {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/personas/persona_hub.py +0 -0
  249. {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/prompts/__init__.py +0 -0
  250. {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/prompts/ai_society.py +0 -0
  251. {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/prompts/base.py +0 -0
  252. {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/prompts/code.py +0 -0
  253. {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/prompts/evaluation.py +0 -0
  254. {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/prompts/generate_text_embedding_data.py +0 -0
  255. {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/prompts/image_craft.py +0 -0
  256. {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/prompts/misalignment.py +0 -0
  257. {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/prompts/multi_condition_image_craft.py +0 -0
  258. {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/prompts/object_recognition.py +0 -0
  259. {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/prompts/persona_hub.py +0 -0
  260. {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/prompts/prompt_templates.py +0 -0
  261. {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/prompts/role_description_prompt_template.py +0 -0
  262. {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/prompts/solution_extraction.py +0 -0
  263. {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/prompts/task_prompt_template.py +0 -0
  264. {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/prompts/translation.py +0 -0
  265. {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/prompts/video_description_prompt.py +0 -0
  266. {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/py.typed +0 -0
  267. {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/responses/__init__.py +0 -0
  268. {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/responses/agent_responses.py +0 -0
  269. {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/retrievers/__init__.py +0 -0
  270. {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/retrievers/auto_retriever.py +0 -0
  271. {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/retrievers/base.py +0 -0
  272. {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/retrievers/bm25_retriever.py +0 -0
  273. {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/retrievers/cohere_rerank_retriever.py +0 -0
  274. {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/retrievers/hybrid_retrival.py +0 -0
  275. {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/retrievers/vector_retriever.py +0 -0
  276. {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/runtimes/__init__.py +0 -0
  277. {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/runtimes/api.py +0 -0
  278. {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/runtimes/base.py +0 -0
  279. {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/runtimes/configs.py +0 -0
  280. {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/runtimes/daytona_runtime.py +0 -0
  281. {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/runtimes/docker_runtime.py +0 -0
  282. {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/runtimes/llm_guard_runtime.py +0 -0
  283. {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/runtimes/remote_http_runtime.py +0 -0
  284. {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/runtimes/ubuntu_docker_runtime.py +0 -0
  285. {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/runtimes/utils/__init__.py +0 -0
  286. {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/runtimes/utils/function_risk_toolkit.py +0 -0
  287. {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/runtimes/utils/ignore_risk_toolkit.py +0 -0
  288. {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/schemas/__init__.py +0 -0
  289. {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/schemas/base.py +0 -0
  290. {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/schemas/openai_converter.py +0 -0
  291. {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/schemas/outlines_converter.py +0 -0
  292. {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/services/agent_openapi_server.py +0 -0
  293. {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/societies/__init__.py +0 -0
  294. {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/societies/babyagi_playing.py +0 -0
  295. {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/societies/role_playing.py +0 -0
  296. {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/societies/workforce/__init__.py +0 -0
  297. {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/societies/workforce/base.py +0 -0
  298. {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/societies/workforce/prompts.py +0 -0
  299. {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/societies/workforce/role_playing_worker.py +0 -0
  300. {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/societies/workforce/structured_output_handler.py +0 -0
  301. {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/societies/workforce/utils.py +0 -0
  302. {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/societies/workforce/workforce_logger.py +0 -0
  303. {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/storages/__init__.py +0 -0
  304. {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/storages/graph_storages/__init__.py +0 -0
  305. {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/storages/graph_storages/base.py +0 -0
  306. {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/storages/graph_storages/graph_element.py +0 -0
  307. {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/storages/graph_storages/nebula_graph.py +0 -0
  308. {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/storages/graph_storages/neo4j_graph.py +0 -0
  309. {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/storages/key_value_storages/__init__.py +0 -0
  310. {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/storages/key_value_storages/base.py +0 -0
  311. {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/storages/key_value_storages/in_memory.py +0 -0
  312. {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/storages/key_value_storages/json.py +0 -0
  313. {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/storages/key_value_storages/mem0_cloud.py +0 -0
  314. {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/storages/key_value_storages/redis.py +0 -0
  315. {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/storages/object_storages/__init__.py +0 -0
  316. {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/storages/object_storages/amazon_s3.py +0 -0
  317. {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/storages/object_storages/azure_blob.py +0 -0
  318. {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/storages/object_storages/base.py +0 -0
  319. {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/storages/object_storages/google_cloud.py +0 -0
  320. {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/storages/vectordb_storages/__init__.py +0 -0
  321. {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/storages/vectordb_storages/base.py +0 -0
  322. {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/storages/vectordb_storages/chroma.py +0 -0
  323. {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/storages/vectordb_storages/faiss.py +0 -0
  324. {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/storages/vectordb_storages/milvus.py +0 -0
  325. {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/storages/vectordb_storages/oceanbase.py +0 -0
  326. {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/storages/vectordb_storages/pgvector.py +0 -0
  327. {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/storages/vectordb_storages/qdrant.py +0 -0
  328. {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/storages/vectordb_storages/tidb.py +0 -0
  329. {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/storages/vectordb_storages/weaviate.py +0 -0
  330. {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/tasks/__init__.py +0 -0
  331. {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/tasks/task.py +0 -0
  332. {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/tasks/task_prompt.py +0 -0
  333. {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/terminators/__init__.py +0 -0
  334. {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/terminators/base.py +0 -0
  335. {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/terminators/response_terminator.py +0 -0
  336. {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/terminators/token_limit_terminator.py +0 -0
  337. {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/toolkits/__init__.py +0 -0
  338. {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/toolkits/aci_toolkit.py +0 -0
  339. {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/toolkits/arxiv_toolkit.py +0 -0
  340. {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/toolkits/ask_news_toolkit.py +0 -0
  341. {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/toolkits/async_browser_toolkit.py +0 -0
  342. {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/toolkits/audio_analysis_toolkit.py +0 -0
  343. {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/toolkits/base.py +0 -0
  344. {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/toolkits/bohrium_toolkit.py +0 -0
  345. {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/toolkits/browser_toolkit.py +0 -0
  346. {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/toolkits/browser_toolkit_commons.py +0 -0
  347. {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/toolkits/code_execution.py +0 -0
  348. {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/toolkits/craw4ai_toolkit.py +0 -0
  349. {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/toolkits/dappier_toolkit.py +0 -0
  350. {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/toolkits/data_commons_toolkit.py +0 -0
  351. {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/toolkits/edgeone_pages_mcp_toolkit.py +0 -0
  352. {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/toolkits/excel_toolkit.py +0 -0
  353. {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/toolkits/function_tool.py +0 -0
  354. {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/toolkits/github_toolkit.py +0 -0
  355. {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/toolkits/google_calendar_toolkit.py +0 -0
  356. {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/toolkits/google_drive_mcp_toolkit.py +0 -0
  357. {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/toolkits/google_maps_toolkit.py +0 -0
  358. {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/toolkits/google_scholar_toolkit.py +0 -0
  359. {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/toolkits/human_toolkit.py +0 -0
  360. {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/toolkits/hybrid_browser_toolkit/__init__.py +0 -0
  361. {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/toolkits/hybrid_browser_toolkit/stealth_script.js +0 -0
  362. {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/toolkits/image_analysis_toolkit.py +0 -0
  363. {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/toolkits/jina_reranker_toolkit.py +0 -0
  364. {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/toolkits/klavis_toolkit.py +0 -0
  365. {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/toolkits/linkedin_toolkit.py +0 -0
  366. {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/toolkits/markitdown_toolkit.py +0 -0
  367. {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/toolkits/math_toolkit.py +0 -0
  368. {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/toolkits/mcp_toolkit.py +0 -0
  369. {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/toolkits/memory_toolkit.py +0 -0
  370. {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/toolkits/meshy_toolkit.py +0 -0
  371. {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/toolkits/message_agent_toolkit.py +0 -0
  372. {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/toolkits/mineru_toolkit.py +0 -0
  373. {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/toolkits/networkx_toolkit.py +0 -0
  374. {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/toolkits/notion_toolkit.py +0 -0
  375. {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/toolkits/open_api_specs/biztoc/__init__.py +0 -0
  376. {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/toolkits/open_api_specs/biztoc/ai-plugin.json +0 -0
  377. {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/toolkits/open_api_specs/biztoc/openapi.yaml +0 -0
  378. {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/toolkits/open_api_specs/coursera/__init__.py +0 -0
  379. {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/toolkits/open_api_specs/coursera/openapi.yaml +0 -0
  380. {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/toolkits/open_api_specs/create_qr_code/__init__.py +0 -0
  381. {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/toolkits/open_api_specs/create_qr_code/openapi.yaml +0 -0
  382. {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/toolkits/open_api_specs/klarna/__init__.py +0 -0
  383. {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/toolkits/open_api_specs/klarna/openapi.yaml +0 -0
  384. {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/toolkits/open_api_specs/nasa_apod/__init__.py +0 -0
  385. {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/toolkits/open_api_specs/nasa_apod/openapi.yaml +0 -0
  386. {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/toolkits/open_api_specs/outschool/__init__.py +0 -0
  387. {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/toolkits/open_api_specs/outschool/ai-plugin.json +0 -0
  388. {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/toolkits/open_api_specs/outschool/openapi.yaml +0 -0
  389. {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/toolkits/open_api_specs/outschool/paths/__init__.py +0 -0
  390. {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/toolkits/open_api_specs/outschool/paths/get_classes.py +0 -0
  391. {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/toolkits/open_api_specs/outschool/paths/search_teachers.py +0 -0
  392. {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/toolkits/open_api_specs/security_config.py +0 -0
  393. {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/toolkits/open_api_specs/speak/__init__.py +0 -0
  394. {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/toolkits/open_api_specs/speak/openapi.yaml +0 -0
  395. {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/toolkits/open_api_specs/web_scraper/__init__.py +0 -0
  396. {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/toolkits/open_api_specs/web_scraper/ai-plugin.json +0 -0
  397. {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/toolkits/open_api_specs/web_scraper/openapi.yaml +0 -0
  398. {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/toolkits/open_api_specs/web_scraper/paths/__init__.py +0 -0
  399. {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/toolkits/open_api_specs/web_scraper/paths/scraper.py +0 -0
  400. {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/toolkits/open_api_toolkit.py +0 -0
  401. {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/toolkits/openai_agent_toolkit.py +0 -0
  402. {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/toolkits/openai_image_toolkit.py +0 -0
  403. {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/toolkits/openbb_toolkit.py +0 -0
  404. {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/toolkits/page_script.js +0 -0
  405. {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/toolkits/playwright_mcp_toolkit.py +0 -0
  406. {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/toolkits/pubmed_toolkit.py +0 -0
  407. {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/toolkits/pulse_mcp_search_toolkit.py +0 -0
  408. {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/toolkits/pyautogui_toolkit.py +0 -0
  409. {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/toolkits/reddit_toolkit.py +0 -0
  410. {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/toolkits/retrieval_toolkit.py +0 -0
  411. {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/toolkits/searxng_toolkit.py +0 -0
  412. {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/toolkits/semantic_scholar_toolkit.py +0 -0
  413. {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/toolkits/slack_toolkit.py +0 -0
  414. {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/toolkits/stripe_toolkit.py +0 -0
  415. {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/toolkits/sympy_toolkit.py +0 -0
  416. {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/toolkits/task_planning_toolkit.py +0 -0
  417. {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/toolkits/terminal_toolkit.py +0 -0
  418. {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/toolkits/thinking_toolkit.py +0 -0
  419. {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/toolkits/twitter_toolkit.py +0 -0
  420. {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/toolkits/video_analysis_toolkit.py +0 -0
  421. {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/toolkits/video_download_toolkit.py +0 -0
  422. {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/toolkits/weather_toolkit.py +0 -0
  423. {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/toolkits/whatsapp_toolkit.py +0 -0
  424. {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/toolkits/wolfram_alpha_toolkit.py +0 -0
  425. {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/toolkits/zapier_toolkit.py +0 -0
  426. {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/types/__init__.py +0 -0
  427. {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/types/agents/__init__.py +0 -0
  428. {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/types/agents/tool_calling_record.py +0 -0
  429. {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/types/enums.py +0 -0
  430. {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/types/mcp_registries.py +0 -0
  431. {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/types/openai_types.py +0 -0
  432. {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/types/unified_model_type.py +0 -0
  433. {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/utils/__init__.py +0 -0
  434. {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/utils/async_func.py +0 -0
  435. {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/utils/chunker/__init__.py +0 -0
  436. {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/utils/chunker/base.py +0 -0
  437. {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/utils/chunker/code_chunker.py +0 -0
  438. {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/utils/chunker/uio_chunker.py +0 -0
  439. {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/utils/commons.py +0 -0
  440. {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/utils/constants.py +0 -0
  441. {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/utils/deduplication.py +0 -0
  442. {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/utils/filename.py +0 -0
  443. {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/utils/langfuse.py +0 -0
  444. {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/utils/mcp.py +0 -0
  445. {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/utils/mcp_client.py +0 -0
  446. {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/utils/message_summarizer.py +0 -0
  447. {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/utils/response_format.py +0 -0
  448. {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/utils/token_counting.py +0 -0
  449. {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/utils/tool_result.py +0 -0
  450. {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/verifiers/__init__.py +0 -0
  451. {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/verifiers/base.py +0 -0
  452. {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/verifiers/math_verifier.py +0 -0
  453. {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/verifiers/models.py +0 -0
  454. {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/verifiers/physics_verifier.py +0 -0
  455. {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/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.71a6
3
+ Version: 0.2.71a8
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
@@ -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.71a6'
17
+ __version__ = '0.2.71a8'
18
18
 
19
19
  __all__ = [
20
20
  '__version__',
@@ -344,6 +344,8 @@ class SingleAgentWorker(Worker):
344
344
  f"{Fore.RED}Error processing task {task.id}: "
345
345
  f"{type(e).__name__}: {e}{Fore.RESET}"
346
346
  )
347
+ # Store error information in task result
348
+ task.result = f"{type(e).__name__}: {e!s}"
347
349
  return TaskState.FAILED
348
350
  finally:
349
351
  # Return agent to pool or let it be garbage collected
@@ -91,11 +91,14 @@ class TaskChannel:
91
91
  """
92
92
  async with self._condition:
93
93
  while True:
94
- for packet in self._task_dict.values():
94
+ for task_id, packet in list(self._task_dict.items()):
95
95
  if packet.publisher_id != publisher_id:
96
96
  continue
97
97
  if packet.status != PacketStatus.RETURNED:
98
98
  continue
99
+ # Remove the task to prevent returning it again
100
+ del self._task_dict[task_id]
101
+ self._condition.notify_all()
99
102
  return packet.task
100
103
  await self._condition.wait()
101
104
 
@@ -103,6 +103,8 @@ class Worker(BaseNode, ABC):
103
103
  await self._channel.return_task(task.id)
104
104
  except Exception as e:
105
105
  logger.error(f"Error processing task {task.id}: {e}")
106
+ # Store error information in task result
107
+ task.result = f"{type(e).__name__}: {e!s}"
106
108
  task.set_state(TaskState.FAILED)
107
109
  await self._channel.return_task(task.id)
108
110
  finally:
@@ -551,6 +551,10 @@ class Workforce(BaseNode):
551
551
  continue
552
552
 
553
553
  if not memory_records:
554
+ logger.warning(
555
+ "No valid memory records could be reconstructed "
556
+ "for sharing"
557
+ )
554
558
  return
555
559
 
556
560
  # Share with coordinator agent
@@ -668,6 +672,12 @@ class Workforce(BaseNode):
668
672
  if task_id in self._task_start_times:
669
673
  del self._task_start_times[task_id]
670
674
 
675
+ if task_id in self._task_dependencies:
676
+ del self._task_dependencies[task_id]
677
+
678
+ if task_id in self._assignees:
679
+ del self._assignees[task_id]
680
+
671
681
  def _decompose_task(self, task: Task) -> List[Task]:
672
682
  r"""Decompose the task into subtasks. This method will also set the
673
683
  relationship between the task and its subtasks.
@@ -991,8 +1001,13 @@ class Workforce(BaseNode):
991
1001
  tasks_dict = {task.id: task for task in self._pending_tasks}
992
1002
 
993
1003
  # Check if all provided IDs exist
994
- if not all(task_id in tasks_dict for task_id in task_ids):
995
- logger.warning("Some task IDs not found in pending tasks.")
1004
+ invalid_ids = [
1005
+ task_id for task_id in task_ids if task_id not in tasks_dict
1006
+ ]
1007
+ if invalid_ids:
1008
+ logger.warning(
1009
+ f"Task IDs not found in pending tasks: {invalid_ids}"
1010
+ )
996
1011
  return False
997
1012
 
998
1013
  # Check if we have the same number of tasks
@@ -2057,7 +2072,6 @@ class Workforce(BaseNode):
2057
2072
  logger.error(
2058
2073
  f"JSON parsing error in worker creation: Invalid "
2059
2074
  f"response format - {e}. Response content: "
2060
- f"format - {e}. Response content: "
2061
2075
  f"{response.msg.content[:100]}..."
2062
2076
  )
2063
2077
  raise RuntimeError(
@@ -2145,17 +2159,7 @@ class Workforce(BaseNode):
2145
2159
  f"Current pending tasks: {len(self._pending_tasks)}, "
2146
2160
  f"In-flight tasks: {self._in_flight_tasks}"
2147
2161
  )
2148
- logger.warning(error_msg)
2149
-
2150
- if self._pending_tasks and self._assignees:
2151
- for task in self._pending_tasks:
2152
- if task.id in self._assignees:
2153
- # Mark task as failed and decrement counter
2154
- task.set_state(TaskState.FAILED)
2155
- self._decrement_in_flight_tasks(
2156
- task.id, "timeout/error in _get_returned_task"
2157
- )
2158
- return task
2162
+ logger.error(error_msg, exc_info=True)
2159
2163
  return None
2160
2164
 
2161
2165
  async def _post_ready_tasks(self) -> None:
@@ -2231,12 +2235,8 @@ class Workforce(BaseNode):
2231
2235
  task.failure_count += 1
2232
2236
 
2233
2237
  # Determine detailed failure information
2234
- if is_task_result_insufficient(task):
2235
- failure_reason = "Worker returned unhelpful "
2236
- f"response: {task.result[:100] if task.result else ''}..."
2237
- else:
2238
- failure_reason = "Task marked as failed despite "
2239
- f"having result: {(task.result or '')[:100]}..."
2238
+ # Use the actual error/result stored in task.result
2239
+ failure_reason = task.result or "Unknown error"
2240
2240
 
2241
2241
  # Add context about the worker and task
2242
2242
  worker_id = task.assigned_worker_id or "unknown"
@@ -11,13 +11,11 @@
11
11
  # See the License for the specific language governing permissions and
12
12
  # limitations under the License.
13
13
  # ========= Copyright 2023-2024 @ CAMEL-AI.org. All Rights Reserved. =========
14
+ import os
14
15
  import re
15
16
  from datetime import datetime
16
17
  from pathlib import Path
17
- from typing import TYPE_CHECKING, List, Optional, Tuple, Union
18
-
19
- if TYPE_CHECKING:
20
- from reportlab.platypus import Table
18
+ from typing import List, Optional, Tuple, Union
21
19
 
22
20
  from camel.logger import get_logger
23
21
  from camel.toolkits.base import BaseToolkit
@@ -26,9 +24,6 @@ from camel.utils import MCPServer, dependencies_required
26
24
 
27
25
  logger = get_logger(__name__)
28
26
 
29
- # Default format when no extension is provided
30
- DEFAULT_FORMAT = '.md'
31
-
32
27
 
33
28
  @MCPServer()
34
29
  class FileWriteToolkit(BaseToolkit):
@@ -43,7 +38,7 @@ class FileWriteToolkit(BaseToolkit):
43
38
 
44
39
  def __init__(
45
40
  self,
46
- output_dir: str = "./",
41
+ working_directory: Optional[str] = None,
47
42
  timeout: Optional[float] = None,
48
43
  default_encoding: str = "utf-8",
49
44
  backup_enabled: bool = True,
@@ -51,8 +46,11 @@ class FileWriteToolkit(BaseToolkit):
51
46
  r"""Initialize the FileWriteToolkit.
52
47
 
53
48
  Args:
54
- output_dir (str): The default directory for output files.
55
- Defaults to the current working directory.
49
+ working_directory (str, optional): The default directory for
50
+ output files. If not provided, it will be determined by the
51
+ `CAMEL_WORKDIR` environment variable (if set). If the
52
+ environment variable is not set, it defaults to
53
+ `camel_working_dir`.
56
54
  timeout (Optional[float]): The timeout for the toolkit.
57
55
  (default: :obj:`None`)
58
56
  default_encoding (str): Default character encoding for text
@@ -61,13 +59,20 @@ class FileWriteToolkit(BaseToolkit):
61
59
  before overwriting. (default: :obj:`True`)
62
60
  """
63
61
  super().__init__(timeout=timeout)
64
- self.output_dir = Path(output_dir).resolve()
65
- self.output_dir.mkdir(parents=True, exist_ok=True)
62
+ if working_directory:
63
+ self.working_directory = Path(working_directory).resolve()
64
+ else:
65
+ camel_workdir = os.environ.get("CAMEL_WORKDIR")
66
+ if camel_workdir:
67
+ self.working_directory = Path(camel_workdir).resolve()
68
+ else:
69
+ self.working_directory = Path("./camel_working_dir").resolve()
70
+ self.working_directory.mkdir(parents=True, exist_ok=True)
66
71
  self.default_encoding = default_encoding
67
72
  self.backup_enabled = backup_enabled
68
73
  logger.info(
69
74
  f"FileWriteToolkit initialized with output directory"
70
- f": {self.output_dir}, encoding: {default_encoding}"
75
+ f": {self.working_directory}, encoding: {default_encoding}"
71
76
  )
72
77
 
73
78
  def _resolve_filepath(self, file_path: str) -> Path:
@@ -86,12 +91,28 @@ class FileWriteToolkit(BaseToolkit):
86
91
  """
87
92
  path_obj = Path(file_path)
88
93
  if not path_obj.is_absolute():
89
- path_obj = self.output_dir / path_obj
94
+ path_obj = self.working_directory / path_obj
90
95
 
91
96
  sanitized_filename = self._sanitize_filename(path_obj.name)
92
97
  path_obj = path_obj.parent / sanitized_filename
93
98
  return path_obj.resolve()
94
99
 
100
+ def _sanitize_filename(self, filename: str) -> str:
101
+ r"""Sanitize a filename by replacing any character that is not
102
+ alphanumeric, a dot (.), hyphen (-), or underscore (_) with an
103
+ underscore (_).
104
+
105
+ Args:
106
+ filename (str): The original filename which may contain spaces or
107
+ special characters.
108
+
109
+ Returns:
110
+ str: The sanitized filename with disallowed characters replaced by
111
+ underscores.
112
+ """
113
+ safe = re.sub(r'[^\w\-.]', '_', filename)
114
+ return safe
115
+
95
116
  def _write_text_file(
96
117
  self, file_path: Path, content: str, encoding: str = "utf-8"
97
118
  ) -> None:
@@ -104,7 +125,6 @@ class FileWriteToolkit(BaseToolkit):
104
125
  """
105
126
  with file_path.open("w", encoding=encoding) as f:
106
127
  f.write(content)
107
- logger.debug(f"Wrote text to {file_path} with {encoding} encoding")
108
128
 
109
129
  def _generate_unique_filename(self, file_path: Path) -> Path:
110
130
  r"""Generate a unique filename if the target file already exists.
@@ -163,7 +183,6 @@ class FileWriteToolkit(BaseToolkit):
163
183
  para.style = style
164
184
 
165
185
  document.save(str(file_path))
166
- logger.debug(f"Wrote DOCX to {file_path} with default formatting")
167
186
 
168
187
  @dependencies_required('reportlab')
169
188
  def _write_pdf_file(
@@ -331,9 +350,6 @@ class FileWriteToolkit(BaseToolkit):
331
350
  isinstance(row, list) for row in content
332
351
  ):
333
352
  # Content is a table (List[List[str]])
334
- logger.debug(
335
- f"Processing content as table with {len(content)} rows"
336
- )
337
353
  if content:
338
354
  table = self._create_pdf_table(content)
339
355
  story.append(table)
@@ -364,7 +380,6 @@ class FileWriteToolkit(BaseToolkit):
364
380
 
365
381
  # Process content
366
382
  lines = content.split('\n')
367
- logger.debug(f"Processing {len(lines)} lines of content")
368
383
 
369
384
  # Parse all tables from the content first
370
385
  tables = self._parse_markdown_table(lines)
@@ -396,8 +411,6 @@ class FileWriteToolkit(BaseToolkit):
396
411
  )
397
412
 
398
413
  if current_table_idx < len(tables):
399
- table_row_count = len(tables[current_table_idx])
400
- logger.debug(f"Adding table with {table_row_count} rows")
401
414
  try:
402
415
  table = self._create_pdf_table(
403
416
  tables[current_table_idx]
@@ -530,10 +543,8 @@ class FileWriteToolkit(BaseToolkit):
530
543
  addMapping(font_name, 0, 1, font_name) # italic
531
544
  addMapping(font_name, 1, 0, font_name) # bold
532
545
  addMapping(font_name, 1, 1, font_name) # bold italic
533
- logger.debug(f"Registered Chinese font: {font_path}")
534
546
  return font_name
535
- except Exception as e:
536
- logger.debug(f"Failed to register font {font_path}: {e}")
547
+ except Exception:
537
548
  continue
538
549
 
539
550
  # Fallback to Helvetica if no Chinese font found
@@ -559,38 +570,29 @@ class FileWriteToolkit(BaseToolkit):
559
570
 
560
571
  # Check for table (Markdown-style)
561
572
  if self._is_table_row(line):
562
- logger.debug(f"Found table line: {line}")
563
-
564
573
  if not in_table:
565
574
  in_table = True
566
575
  current_table_data = []
567
- logger.debug("Starting new table")
568
576
 
569
577
  # Skip separator lines (e.g., |---|---|)
570
578
  if self._is_table_separator(line):
571
- logger.debug("Skipping separator line")
572
579
  continue
573
580
 
574
581
  # Parse table row
575
582
  cells = self._parse_table_row(line)
576
583
  if cells:
577
584
  current_table_data.append(cells)
578
- logger.debug(f"Added table row: {cells}")
579
585
  continue
580
586
 
581
587
  # If we were in a table and now we're not, finalize the table
582
588
  if in_table:
583
589
  if current_table_data:
584
- row_count = len(current_table_data)
585
- logger.debug(f"Finalizing table with {row_count} rows")
586
590
  tables.append(current_table_data)
587
591
  current_table_data = []
588
592
  in_table = False
589
593
 
590
594
  # Add any remaining table
591
595
  if in_table and current_table_data:
592
- row_count = len(current_table_data)
593
- logger.debug(f"Adding final table with {row_count} rows")
594
596
  tables.append(current_table_data)
595
597
 
596
598
  return tables
@@ -646,7 +648,7 @@ class FileWriteToolkit(BaseToolkit):
646
648
 
647
649
  return cells
648
650
 
649
- def _create_pdf_table(self, table_data: List[List[str]]) -> "Table":
651
+ def _create_pdf_table(self, table_data: List[List[str]]):
650
652
  r"""Create a formatted table for PDF.
651
653
 
652
654
  Args:
@@ -656,40 +658,153 @@ class FileWriteToolkit(BaseToolkit):
656
658
  Table: A formatted reportlab Table object.
657
659
  """
658
660
  from reportlab.lib import colors
659
- from reportlab.platypus import Table, TableStyle
661
+ from reportlab.lib.pagesizes import A4
662
+ from reportlab.lib.styles import ParagraphStyle
663
+ from reportlab.platypus import Paragraph, Table, TableStyle
660
664
 
661
665
  try:
662
666
  # Get Chinese font for table
663
667
  chinese_font = self._register_chinese_font()
664
668
 
665
- # Debug: Log table data
666
- logger.debug(f"Creating table with {len(table_data)} rows")
667
- for i, row in enumerate(table_data):
668
- logger.debug(f"Row {i}: {row}")
669
+ # Calculate available width (A4 width minus margins)
670
+ page_width = A4[0] # A4 width in points
671
+ margins = 144 # left + right margins (72 each)
672
+ available_width = page_width - margins
673
+
674
+ # Calculate column widths and font size based on content
675
+ if table_data:
676
+ num_columns = len(table_data[0])
677
+
678
+ # Calculate max content length for each column
679
+ max_lengths = [0] * num_columns
680
+ max_cell_length = 0
681
+ for row in table_data:
682
+ for i, cell in enumerate(row):
683
+ if i < len(max_lengths):
684
+ cell_length = len(str(cell))
685
+ max_lengths[i] = max(max_lengths[i], cell_length)
686
+ max_cell_length = max(max_cell_length, cell_length)
687
+
688
+ # Dynamic font size calculation based on columns and content
689
+ # Base font sizes
690
+ base_header_font = 9
691
+ base_body_font = 8
692
+
693
+ # Calculate font size factor based on columns and content
694
+ column_factors = {10: 0.6, 8: 0.7, 6: 0.8, 4: 0.9}
695
+ font_size_factor = next(
696
+ (
697
+ factor
698
+ for cols, factor in column_factors.items()
699
+ if num_columns > cols
700
+ ),
701
+ 1.0,
702
+ )
703
+
704
+ # Further adjust if max cell content is very long
705
+ if max_cell_length > 30:
706
+ font_size_factor *= 0.8
707
+ elif max_cell_length > 20:
708
+ font_size_factor *= 0.9
709
+
710
+ header_font_size = max(
711
+ 5, int(base_header_font * font_size_factor)
712
+ )
713
+ body_font_size = max(5, int(base_body_font * font_size_factor))
714
+
715
+ # Calculate minimum column width based on font size
716
+ min_col_width = max(30, 40 * font_size_factor)
717
+
718
+ # Distribute width proportionally with minimum width
719
+ total_length = sum(max_lengths)
720
+ if total_length > 0:
721
+ # Calculate proportional widths
722
+ proportional_widths = [
723
+ (length / total_length) * available_width
724
+ for length in max_lengths
725
+ ]
726
+
727
+ # Ensure minimum width and adjust if necessary
728
+ col_widths = []
729
+ total_width = 0
730
+ for width in proportional_widths:
731
+ adjusted_width = max(min_col_width, width)
732
+ col_widths.append(adjusted_width)
733
+ total_width += adjusted_width
734
+
735
+ # Scale down if total exceeds available width
736
+ if total_width > available_width:
737
+ scale_factor = available_width / total_width
738
+ col_widths = [w * scale_factor for w in col_widths]
739
+ else:
740
+ col_widths = [available_width / num_columns] * num_columns
741
+
742
+ # Adjust padding based on font size
743
+ h_padding = max(2, int(6 * font_size_factor))
744
+ v_padding = max(2, int(4 * font_size_factor))
745
+ else:
746
+ col_widths = None
747
+ header_font_size = 9
748
+ body_font_size = 8
749
+ h_padding = 6
750
+ v_padding = 4
751
+
752
+ # Create paragraph styles for wrapping text
753
+ header_style = ParagraphStyle(
754
+ 'TableHeader',
755
+ fontName=chinese_font,
756
+ fontSize=header_font_size,
757
+ textColor=colors.whitesmoke,
758
+ alignment=0, # LEFT alignment
759
+ leading=header_font_size * 1.2,
760
+ )
761
+
762
+ body_style = ParagraphStyle(
763
+ 'TableBody',
764
+ fontName=chinese_font,
765
+ fontSize=body_font_size,
766
+ textColor=colors.black,
767
+ alignment=0, # LEFT alignment
768
+ leading=body_font_size * 1.2,
769
+ )
770
+
771
+ # Convert table data to Paragraph objects for text wrapping
772
+ wrapped_data = []
773
+ for row_idx, row in enumerate(table_data):
774
+ wrapped_row = []
775
+ for cell in row:
776
+ cell_text = str(cell)
777
+ # Use header style for first row, body style for others
778
+ style = header_style if row_idx == 0 else body_style
779
+ # Escape special characters for XML
780
+ cell_text = (
781
+ cell_text.replace('&', '&amp;')
782
+ .replace('<', '&lt;')
783
+ .replace('>', '&gt;')
784
+ )
785
+ para = Paragraph(cell_text, style)
786
+ wrapped_row.append(para)
787
+ wrapped_data.append(wrapped_row)
669
788
 
670
- # Create table
671
- table = Table(table_data)
789
+ # Create table with wrapped data
790
+ table = Table(wrapped_data, colWidths=col_widths, repeatRows=1)
672
791
 
673
- # Style the table with Chinese font support
792
+ # Style the table with dynamic formatting
674
793
  table.setStyle(
675
794
  TableStyle(
676
795
  [
677
796
  ('BACKGROUND', (0, 0), (-1, 0), colors.grey),
678
- ('TEXTCOLOR', (0, 0), (-1, 0), colors.whitesmoke),
679
- ('ALIGN', (0, 0), (-1, -1), 'CENTER'),
680
- ('FONTNAME', (0, 0), (-1, 0), chinese_font),
681
- ('FONTSIZE', (0, 0), (-1, 0), 10),
682
- ('BOTTOMPADDING', (0, 0), (-1, 0), 12),
683
- ('BACKGROUND', (0, 1), (-1, -1), colors.beige),
684
- ('FONTNAME', (0, 1), (-1, -1), chinese_font),
685
- ('FONTSIZE', (0, 1), (-1, -1), 9),
686
- ('GRID', (0, 0), (-1, -1), 1, colors.black),
687
- ('VALIGN', (0, 0), (-1, -1), 'MIDDLE'),
797
+ ('BACKGROUND', (0, 1), (-1, -1), colors.white),
798
+ ('GRID', (0, 0), (-1, -1), 0.5, colors.black),
799
+ ('VALIGN', (0, 0), (-1, -1), 'TOP'),
800
+ ('LEFTPADDING', (0, 0), (-1, -1), h_padding),
801
+ ('RIGHTPADDING', (0, 0), (-1, -1), h_padding),
802
+ ('TOPPADDING', (0, 0), (-1, -1), v_padding),
803
+ ('BOTTOMPADDING', (0, 0), (-1, -1), v_padding),
688
804
  ]
689
805
  )
690
806
  )
691
807
 
692
- logger.debug("Table created successfully")
693
808
  return table
694
809
 
695
810
  except Exception as e:
@@ -708,18 +823,20 @@ class FileWriteToolkit(BaseToolkit):
708
823
  Returns:
709
824
  str: Text with HTML formatting.
710
825
  """
711
- # Bold text (check double markers first)
712
- text = re.sub(r'\*\*(.*?)\*\*', r'<b>\1</b>', text)
713
- text = re.sub(r'__(.*?)__', r'<b>\1</b>', text)
714
-
715
- # Italic text (single markers after double markers)
716
- text = re.sub(
717
- r'(?<!\*)\*(?!\*)(.*?)(?<!\*)\*(?!\*)', r'<i>\1</i>', text
718
- )
719
- text = re.sub(r'(?<!_)_(?!_)(.*?)(?<!_)_(?!_)', r'<i>\1</i>', text)
826
+ # Define conversion patterns
827
+ conversions = [
828
+ (r'\*\*(.*?)\*\*', r'<b>\1</b>'), # Bold with **
829
+ (r'__(.*?)__', r'<b>\1</b>'), # Bold with __
830
+ (
831
+ r'(?<!\*)\*(?!\*)(.*?)(?<!\*)\*(?!\*)',
832
+ r'<i>\1</i>',
833
+ ), # Italic with *
834
+ (r'(?<!_)_(?!_)(.*?)(?<!_)_(?!_)', r'<i>\1</i>'), # Italic with _
835
+ (r'`(.*?)`', r'<font name="Courier">\1</font>'), # Inline code
836
+ ]
720
837
 
721
- # Code (inline)
722
- text = re.sub(r'`(.*?)`', r'<font name="Courier">\1</font>', text)
838
+ for pattern, replacement in conversions:
839
+ text = re.sub(pattern, replacement, text)
723
840
 
724
841
  return text
725
842
 
@@ -745,7 +862,6 @@ class FileWriteToolkit(BaseToolkit):
745
862
  else:
746
863
  writer = csv.writer(f)
747
864
  writer.writerows(content)
748
- logger.debug(f"Wrote CSV to {file_path} with {encoding} encoding")
749
865
 
750
866
  def _write_json_file(
751
867
  self,
@@ -774,52 +890,19 @@ class FileWriteToolkit(BaseToolkit):
774
890
  else:
775
891
  # If not string, dump as JSON
776
892
  json.dump(content, f, ensure_ascii=False)
777
- logger.debug(f"Wrote JSON to {file_path} with {encoding} encoding")
778
-
779
- def _write_yaml_file(
780
- self,
781
- file_path: Path,
782
- content: str,
783
- encoding: str = "utf-8",
784
- ) -> None:
785
- r"""Write YAML content to a file.
786
-
787
- Args:
788
- file_path (Path): The target file path.
789
- content (str): The YAML content as a string.
790
- encoding (str): Character encoding to use. (default: :obj:`utf-8`)
791
- """
792
- with file_path.open("w", encoding=encoding) as f:
793
- f.write(content)
794
- logger.debug(f"Wrote YAML to {file_path} with {encoding} encoding")
795
-
796
- def _write_html_file(
797
- self, file_path: Path, content: str, encoding: str = "utf-8"
798
- ) -> None:
799
- r"""Write text content to an HTML file.
800
-
801
- Args:
802
- file_path (Path): The target file path.
803
- content (str): The HTML content to write.
804
- encoding (str): Character encoding to use. (default: :obj:`utf-8`)
805
- """
806
- with file_path.open("w", encoding=encoding) as f:
807
- f.write(content)
808
- logger.debug(f"Wrote HTML to {file_path} with {encoding} encoding")
809
893
 
810
- def _write_markdown_file(
894
+ def _write_simple_text_file(
811
895
  self, file_path: Path, content: str, encoding: str = "utf-8"
812
896
  ) -> None:
813
- r"""Write text content to a Markdown file.
897
+ r"""Write text content to a file (used for HTML, Markdown, YAML, etc.).
814
898
 
815
899
  Args:
816
900
  file_path (Path): The target file path.
817
- content (str): The Markdown content to write.
901
+ content (str): The content to write.
818
902
  encoding (str): Character encoding to use. (default: :obj:`utf-8`)
819
903
  """
820
904
  with file_path.open("w", encoding=encoding) as f:
821
905
  f.write(content)
822
- logger.debug(f"Wrote Markdown to {file_path} with {encoding} encoding")
823
906
 
824
907
  def write_to_file(
825
908
  self,
@@ -844,7 +927,7 @@ class FileWriteToolkit(BaseToolkit):
844
927
  - CSV: string or list of lists
845
928
  - JSON: string or serializable object
846
929
  filename (str): The name or path of the file. If a relative path is
847
- supplied, it is resolved to self.output_dir.
930
+ supplied, it is resolved to self.working_directory.
848
931
  encoding (Optional[str]): The character encoding to use. (default:
849
932
  :obj: `None`)
850
933
  use_latex (bool): Whether to use LaTeX for math rendering.
@@ -861,10 +944,10 @@ class FileWriteToolkit(BaseToolkit):
861
944
 
862
945
  extension = file_path.suffix.lower()
863
946
 
864
- # If no extension is provided, use the default format
947
+ # If no extension is provided, use markdown as default
865
948
  if extension == "":
866
- file_path = file_path.with_suffix(DEFAULT_FORMAT)
867
- extension = DEFAULT_FORMAT
949
+ file_path = file_path.with_suffix('.md')
950
+ extension = '.md'
868
951
 
869
952
  try:
870
953
  # Get encoding or use default
@@ -884,16 +967,15 @@ class FileWriteToolkit(BaseToolkit):
884
967
  content, # type: ignore[arg-type]
885
968
  encoding=file_encoding,
886
969
  )
887
- elif extension in [".yml", ".yaml"]:
888
- self._write_yaml_file(
889
- file_path, str(content), encoding=file_encoding
890
- )
891
- elif extension in [".html", ".htm"]:
892
- self._write_html_file(
893
- file_path, str(content), encoding=file_encoding
894
- )
895
- elif extension in [".md", ".markdown"]:
896
- self._write_markdown_file(
970
+ elif extension in [
971
+ ".yml",
972
+ ".yaml",
973
+ ".html",
974
+ ".htm",
975
+ ".md",
976
+ ".markdown",
977
+ ]:
978
+ self._write_simple_text_file(
897
979
  file_path, str(content), encoding=file_encoding
898
980
  )
899
981
  else:
@@ -924,19 +1006,3 @@ class FileWriteToolkit(BaseToolkit):
924
1006
  return [
925
1007
  FunctionTool(self.write_to_file),
926
1008
  ]
927
-
928
- def _sanitize_filename(self, filename: str) -> str:
929
- r"""Sanitize a filename by replacing any character that is not
930
- alphanumeric, a dot (.), hyphen (-), or underscore (_) with an
931
- underscore (_).
932
-
933
- Args:
934
- filename (str): The original filename which may contain spaces or
935
- special characters.
936
-
937
- Returns:
938
- str: The sanitized filename with disallowed characters replaced by
939
- underscores.
940
- """
941
- safe = re.sub(r'[^\w\-.]', '_', filename)
942
- return safe