camel-ai 0.2.73a2__tar.gz → 0.2.73a3__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 (475) hide show
  1. {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/PKG-INFO +1 -1
  2. {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/__init__.py +1 -1
  3. {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/toolkits/excel_toolkit.py +153 -64
  4. {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/toolkits/hybrid_browser_toolkit/ws_wrapper.py +76 -27
  5. {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/toolkits/message_integration.py +174 -47
  6. {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/pyproject.toml +1 -1
  7. {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/.gitignore +0 -0
  8. {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/LICENSE +0 -0
  9. {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/README.md +0 -0
  10. {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/agents/__init__.py +0 -0
  11. {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/agents/_types.py +0 -0
  12. {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/agents/_utils.py +0 -0
  13. {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/agents/base.py +0 -0
  14. {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/agents/chat_agent.py +0 -0
  15. {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/agents/critic_agent.py +0 -0
  16. {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/agents/deductive_reasoner_agent.py +0 -0
  17. {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/agents/embodied_agent.py +0 -0
  18. {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/agents/knowledge_graph_agent.py +0 -0
  19. {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/agents/mcp_agent.py +0 -0
  20. {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/agents/multi_hop_generator_agent.py +0 -0
  21. {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/agents/programmed_agent_instruction.py +0 -0
  22. {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/agents/repo_agent.py +0 -0
  23. {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/agents/role_assignment_agent.py +0 -0
  24. {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/agents/search_agent.py +0 -0
  25. {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/agents/task_agent.py +0 -0
  26. {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/agents/tool_agents/__init__.py +0 -0
  27. {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/agents/tool_agents/base.py +0 -0
  28. {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/agents/tool_agents/hugging_face_tool_agent.py +0 -0
  29. {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/benchmarks/__init__.py +0 -0
  30. {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/benchmarks/apibank.py +0 -0
  31. {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/benchmarks/apibench.py +0 -0
  32. {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/benchmarks/base.py +0 -0
  33. {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/benchmarks/browsecomp.py +0 -0
  34. {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/benchmarks/gaia.py +0 -0
  35. {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/benchmarks/mock_website/README.md +0 -0
  36. {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/benchmarks/mock_website/mock_web.py +0 -0
  37. {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/benchmarks/mock_website/requirements.txt +0 -0
  38. {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/benchmarks/mock_website/shopping_mall/app.py +0 -0
  39. {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/benchmarks/mock_website/task.json +0 -0
  40. {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/benchmarks/nexus.py +0 -0
  41. {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/benchmarks/ragbench.py +0 -0
  42. {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/bots/__init__.py +0 -0
  43. {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/bots/discord/__init__.py +0 -0
  44. {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/bots/discord/discord_app.py +0 -0
  45. {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/bots/discord/discord_installation.py +0 -0
  46. {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/bots/discord/discord_store.py +0 -0
  47. {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/bots/slack/__init__.py +0 -0
  48. {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/bots/slack/models.py +0 -0
  49. {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/bots/slack/slack_app.py +0 -0
  50. {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/bots/telegram_bot.py +0 -0
  51. {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/configs/__init__.py +0 -0
  52. {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/configs/aiml_config.py +0 -0
  53. {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/configs/anthropic_config.py +0 -0
  54. {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/configs/base_config.py +0 -0
  55. {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/configs/bedrock_config.py +0 -0
  56. {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/configs/cohere_config.py +0 -0
  57. {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/configs/crynux_config.py +0 -0
  58. {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/configs/deepseek_config.py +0 -0
  59. {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/configs/gemini_config.py +0 -0
  60. {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/configs/groq_config.py +0 -0
  61. {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/configs/internlm_config.py +0 -0
  62. {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/configs/litellm_config.py +0 -0
  63. {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/configs/lmstudio_config.py +0 -0
  64. {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/configs/mistral_config.py +0 -0
  65. {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/configs/modelscope_config.py +0 -0
  66. {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/configs/moonshot_config.py +0 -0
  67. {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/configs/netmind_config.py +0 -0
  68. {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/configs/novita_config.py +0 -0
  69. {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/configs/nvidia_config.py +0 -0
  70. {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/configs/ollama_config.py +0 -0
  71. {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/configs/openai_config.py +0 -0
  72. {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/configs/openrouter_config.py +0 -0
  73. {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/configs/ppio_config.py +0 -0
  74. {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/configs/qianfan_config.py +0 -0
  75. {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/configs/qwen_config.py +0 -0
  76. {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/configs/reka_config.py +0 -0
  77. {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/configs/samba_config.py +0 -0
  78. {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/configs/sglang_config.py +0 -0
  79. {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/configs/siliconflow_config.py +0 -0
  80. {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/configs/togetherai_config.py +0 -0
  81. {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/configs/vllm_config.py +0 -0
  82. {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/configs/watsonx_config.py +0 -0
  83. {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/configs/yi_config.py +0 -0
  84. {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/configs/zhipuai_config.py +0 -0
  85. {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/data_collectors/__init__.py +0 -0
  86. {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/data_collectors/alpaca_collector.py +0 -0
  87. {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/data_collectors/base.py +0 -0
  88. {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/data_collectors/sharegpt_collector.py +0 -0
  89. {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/datagen/__init__.py +0 -0
  90. {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/datagen/cot_datagen.py +0 -0
  91. {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/datagen/evol_instruct/__init__.py +0 -0
  92. {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/datagen/evol_instruct/evol_instruct.py +0 -0
  93. {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/datagen/evol_instruct/scorer.py +0 -0
  94. {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/datagen/evol_instruct/templates.py +0 -0
  95. {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/datagen/self_improving_cot.py +0 -0
  96. {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/datagen/self_instruct/__init__.py +0 -0
  97. {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/datagen/self_instruct/filter/__init__.py +0 -0
  98. {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/datagen/self_instruct/filter/filter_function.py +0 -0
  99. {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/datagen/self_instruct/filter/filter_registry.py +0 -0
  100. {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/datagen/self_instruct/filter/instruction_filter.py +0 -0
  101. {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/datagen/self_instruct/self_instruct.py +0 -0
  102. {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/datagen/self_instruct/templates.py +0 -0
  103. {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/datagen/source2synth/__init__.py +0 -0
  104. {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/datagen/source2synth/data_processor.py +0 -0
  105. {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/datagen/source2synth/models.py +0 -0
  106. {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/datagen/source2synth/user_data_processor_config.py +0 -0
  107. {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/datahubs/__init__.py +0 -0
  108. {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/datahubs/base.py +0 -0
  109. {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/datahubs/huggingface.py +0 -0
  110. {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/datahubs/models.py +0 -0
  111. {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/datasets/__init__.py +0 -0
  112. {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/datasets/base_generator.py +0 -0
  113. {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/datasets/few_shot_generator.py +0 -0
  114. {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/datasets/models.py +0 -0
  115. {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/datasets/self_instruct_generator.py +0 -0
  116. {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/datasets/static_dataset.py +0 -0
  117. {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/embeddings/__init__.py +0 -0
  118. {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/embeddings/azure_embedding.py +0 -0
  119. {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/embeddings/base.py +0 -0
  120. {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/embeddings/gemini_embedding.py +0 -0
  121. {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/embeddings/jina_embedding.py +0 -0
  122. {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/embeddings/mistral_embedding.py +0 -0
  123. {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/embeddings/openai_compatible_embedding.py +0 -0
  124. {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/embeddings/openai_embedding.py +0 -0
  125. {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/embeddings/sentence_transformers_embeddings.py +0 -0
  126. {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/embeddings/together_embedding.py +0 -0
  127. {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/embeddings/vlm_embedding.py +0 -0
  128. {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/environments/__init__.py +0 -0
  129. {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/environments/models.py +0 -0
  130. {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/environments/multi_step.py +0 -0
  131. {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/environments/rlcards_env.py +0 -0
  132. {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/environments/single_step.py +0 -0
  133. {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/environments/tic_tac_toe.py +0 -0
  134. {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/extractors/__init__.py +0 -0
  135. {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/extractors/base.py +0 -0
  136. {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/extractors/python_strategies.py +0 -0
  137. {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/generators.py +0 -0
  138. {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/human.py +0 -0
  139. {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/interpreters/__init__.py +0 -0
  140. {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/interpreters/base.py +0 -0
  141. {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/interpreters/docker/Dockerfile +0 -0
  142. {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/interpreters/docker_interpreter.py +0 -0
  143. {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/interpreters/e2b_interpreter.py +0 -0
  144. {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/interpreters/internal_python_interpreter.py +0 -0
  145. {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/interpreters/interpreter_error.py +0 -0
  146. {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/interpreters/ipython_interpreter.py +0 -0
  147. {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/interpreters/subprocess_interpreter.py +0 -0
  148. {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/loaders/__init__.py +0 -0
  149. {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/loaders/apify_reader.py +0 -0
  150. {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/loaders/base_io.py +0 -0
  151. {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/loaders/base_loader.py +0 -0
  152. {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/loaders/chunkr_reader.py +0 -0
  153. {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/loaders/crawl4ai_reader.py +0 -0
  154. {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/loaders/firecrawl_reader.py +0 -0
  155. {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/loaders/jina_url_reader.py +0 -0
  156. {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/loaders/markitdown.py +0 -0
  157. {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/loaders/mineru_extractor.py +0 -0
  158. {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/loaders/mistral_reader.py +0 -0
  159. {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/loaders/pandas_reader.py +0 -0
  160. {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/loaders/scrapegraph_reader.py +0 -0
  161. {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/loaders/unstructured_io.py +0 -0
  162. {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/logger.py +0 -0
  163. {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/memories/__init__.py +0 -0
  164. {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/memories/agent_memories.py +0 -0
  165. {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/memories/base.py +0 -0
  166. {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/memories/blocks/__init__.py +0 -0
  167. {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/memories/blocks/chat_history_block.py +0 -0
  168. {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/memories/blocks/vectordb_block.py +0 -0
  169. {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/memories/context_creators/__init__.py +0 -0
  170. {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/memories/context_creators/score_based.py +0 -0
  171. {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/memories/records.py +0 -0
  172. {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/messages/__init__.py +0 -0
  173. {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/messages/base.py +0 -0
  174. {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/messages/conversion/__init__.py +0 -0
  175. {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/messages/conversion/alpaca.py +0 -0
  176. {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/messages/conversion/conversation_models.py +0 -0
  177. {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/messages/conversion/sharegpt/__init__.py +0 -0
  178. {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/messages/conversion/sharegpt/function_call_formatter.py +0 -0
  179. {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/messages/conversion/sharegpt/hermes/__init__.py +0 -0
  180. {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/messages/conversion/sharegpt/hermes/hermes_function_formatter.py +0 -0
  181. {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/messages/func_message.py +0 -0
  182. {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/models/__init__.py +0 -0
  183. {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/models/_utils.py +0 -0
  184. {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/models/aiml_model.py +0 -0
  185. {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/models/anthropic_model.py +0 -0
  186. {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/models/aws_bedrock_model.py +0 -0
  187. {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/models/azure_openai_model.py +0 -0
  188. {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/models/base_audio_model.py +0 -0
  189. {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/models/base_model.py +0 -0
  190. {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/models/cohere_model.py +0 -0
  191. {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/models/crynux_model.py +0 -0
  192. {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/models/deepseek_model.py +0 -0
  193. {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/models/fish_audio_model.py +0 -0
  194. {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/models/gemini_model.py +0 -0
  195. {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/models/groq_model.py +0 -0
  196. {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/models/internlm_model.py +0 -0
  197. {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/models/litellm_model.py +0 -0
  198. {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/models/lmstudio_model.py +0 -0
  199. {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/models/mistral_model.py +0 -0
  200. {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/models/model_factory.py +0 -0
  201. {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/models/model_manager.py +0 -0
  202. {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/models/modelscope_model.py +0 -0
  203. {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/models/moonshot_model.py +0 -0
  204. {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/models/nemotron_model.py +0 -0
  205. {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/models/netmind_model.py +0 -0
  206. {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/models/novita_model.py +0 -0
  207. {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/models/nvidia_model.py +0 -0
  208. {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/models/ollama_model.py +0 -0
  209. {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/models/openai_audio_models.py +0 -0
  210. {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/models/openai_compatible_model.py +0 -0
  211. {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/models/openai_model.py +0 -0
  212. {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/models/openrouter_model.py +0 -0
  213. {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/models/ppio_model.py +0 -0
  214. {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/models/qianfan_model.py +0 -0
  215. {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/models/qwen_model.py +0 -0
  216. {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/models/reka_model.py +0 -0
  217. {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/models/reward/__init__.py +0 -0
  218. {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/models/reward/base_reward_model.py +0 -0
  219. {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/models/reward/evaluator.py +0 -0
  220. {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/models/reward/nemotron_model.py +0 -0
  221. {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/models/reward/skywork_model.py +0 -0
  222. {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/models/samba_model.py +0 -0
  223. {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/models/sglang_model.py +0 -0
  224. {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/models/siliconflow_model.py +0 -0
  225. {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/models/stub_model.py +0 -0
  226. {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/models/togetherai_model.py +0 -0
  227. {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/models/vllm_model.py +0 -0
  228. {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/models/volcano_model.py +0 -0
  229. {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/models/watsonx_model.py +0 -0
  230. {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/models/yi_model.py +0 -0
  231. {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/models/zhipuai_model.py +0 -0
  232. {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/personas/__init__.py +0 -0
  233. {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/personas/persona.py +0 -0
  234. {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/personas/persona_hub.py +0 -0
  235. {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/prompts/__init__.py +0 -0
  236. {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/prompts/ai_society.py +0 -0
  237. {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/prompts/base.py +0 -0
  238. {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/prompts/code.py +0 -0
  239. {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/prompts/evaluation.py +0 -0
  240. {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/prompts/generate_text_embedding_data.py +0 -0
  241. {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/prompts/image_craft.py +0 -0
  242. {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/prompts/misalignment.py +0 -0
  243. {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/prompts/multi_condition_image_craft.py +0 -0
  244. {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/prompts/object_recognition.py +0 -0
  245. {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/prompts/persona_hub.py +0 -0
  246. {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/prompts/prompt_templates.py +0 -0
  247. {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/prompts/role_description_prompt_template.py +0 -0
  248. {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/prompts/solution_extraction.py +0 -0
  249. {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/prompts/task_prompt_template.py +0 -0
  250. {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/prompts/translation.py +0 -0
  251. {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/prompts/video_description_prompt.py +0 -0
  252. {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/py.typed +0 -0
  253. {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/responses/__init__.py +0 -0
  254. {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/responses/agent_responses.py +0 -0
  255. {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/retrievers/__init__.py +0 -0
  256. {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/retrievers/auto_retriever.py +0 -0
  257. {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/retrievers/base.py +0 -0
  258. {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/retrievers/bm25_retriever.py +0 -0
  259. {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/retrievers/cohere_rerank_retriever.py +0 -0
  260. {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/retrievers/hybrid_retrival.py +0 -0
  261. {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/retrievers/vector_retriever.py +0 -0
  262. {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/runtimes/__init__.py +0 -0
  263. {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/runtimes/api.py +0 -0
  264. {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/runtimes/base.py +0 -0
  265. {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/runtimes/configs.py +0 -0
  266. {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/runtimes/daytona_runtime.py +0 -0
  267. {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/runtimes/docker_runtime.py +0 -0
  268. {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/runtimes/llm_guard_runtime.py +0 -0
  269. {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/runtimes/remote_http_runtime.py +0 -0
  270. {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/runtimes/ubuntu_docker_runtime.py +0 -0
  271. {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/runtimes/utils/__init__.py +0 -0
  272. {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/runtimes/utils/function_risk_toolkit.py +0 -0
  273. {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/runtimes/utils/ignore_risk_toolkit.py +0 -0
  274. {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/schemas/__init__.py +0 -0
  275. {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/schemas/base.py +0 -0
  276. {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/schemas/openai_converter.py +0 -0
  277. {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/schemas/outlines_converter.py +0 -0
  278. {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/services/agent_openapi_server.py +0 -0
  279. {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/societies/__init__.py +0 -0
  280. {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/societies/babyagi_playing.py +0 -0
  281. {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/societies/role_playing.py +0 -0
  282. {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/societies/workforce/__init__.py +0 -0
  283. {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/societies/workforce/base.py +0 -0
  284. {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/societies/workforce/prompts.py +0 -0
  285. {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/societies/workforce/role_playing_worker.py +0 -0
  286. {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/societies/workforce/single_agent_worker.py +0 -0
  287. {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/societies/workforce/structured_output_handler.py +0 -0
  288. {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/societies/workforce/task_channel.py +0 -0
  289. {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/societies/workforce/utils.py +0 -0
  290. {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/societies/workforce/worker.py +0 -0
  291. {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/societies/workforce/workforce.py +0 -0
  292. {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/societies/workforce/workforce_logger.py +0 -0
  293. {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/storages/__init__.py +0 -0
  294. {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/storages/graph_storages/__init__.py +0 -0
  295. {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/storages/graph_storages/base.py +0 -0
  296. {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/storages/graph_storages/graph_element.py +0 -0
  297. {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/storages/graph_storages/nebula_graph.py +0 -0
  298. {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/storages/graph_storages/neo4j_graph.py +0 -0
  299. {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/storages/key_value_storages/__init__.py +0 -0
  300. {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/storages/key_value_storages/base.py +0 -0
  301. {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/storages/key_value_storages/in_memory.py +0 -0
  302. {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/storages/key_value_storages/json.py +0 -0
  303. {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/storages/key_value_storages/mem0_cloud.py +0 -0
  304. {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/storages/key_value_storages/redis.py +0 -0
  305. {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/storages/object_storages/__init__.py +0 -0
  306. {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/storages/object_storages/amazon_s3.py +0 -0
  307. {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/storages/object_storages/azure_blob.py +0 -0
  308. {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/storages/object_storages/base.py +0 -0
  309. {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/storages/object_storages/google_cloud.py +0 -0
  310. {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/storages/vectordb_storages/__init__.py +0 -0
  311. {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/storages/vectordb_storages/base.py +0 -0
  312. {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/storages/vectordb_storages/chroma.py +0 -0
  313. {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/storages/vectordb_storages/faiss.py +0 -0
  314. {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/storages/vectordb_storages/milvus.py +0 -0
  315. {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/storages/vectordb_storages/oceanbase.py +0 -0
  316. {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/storages/vectordb_storages/pgvector.py +0 -0
  317. {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/storages/vectordb_storages/qdrant.py +0 -0
  318. {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/storages/vectordb_storages/surreal.py +0 -0
  319. {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/storages/vectordb_storages/tidb.py +0 -0
  320. {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/storages/vectordb_storages/weaviate.py +0 -0
  321. {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/tasks/__init__.py +0 -0
  322. {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/tasks/task.py +0 -0
  323. {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/tasks/task_prompt.py +0 -0
  324. {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/terminators/__init__.py +0 -0
  325. {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/terminators/base.py +0 -0
  326. {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/terminators/response_terminator.py +0 -0
  327. {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/terminators/token_limit_terminator.py +0 -0
  328. {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/toolkits/__init__.py +0 -0
  329. {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/toolkits/aci_toolkit.py +0 -0
  330. {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/toolkits/arxiv_toolkit.py +0 -0
  331. {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/toolkits/ask_news_toolkit.py +0 -0
  332. {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/toolkits/async_browser_toolkit.py +0 -0
  333. {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/toolkits/audio_analysis_toolkit.py +0 -0
  334. {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/toolkits/base.py +0 -0
  335. {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/toolkits/bohrium_toolkit.py +0 -0
  336. {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/toolkits/browser_toolkit.py +0 -0
  337. {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/toolkits/browser_toolkit_commons.py +0 -0
  338. {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/toolkits/code_execution.py +0 -0
  339. {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/toolkits/craw4ai_toolkit.py +0 -0
  340. {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/toolkits/dappier_toolkit.py +0 -0
  341. {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/toolkits/data_commons_toolkit.py +0 -0
  342. {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/toolkits/edgeone_pages_mcp_toolkit.py +0 -0
  343. {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/toolkits/file_write_toolkit.py +0 -0
  344. {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/toolkits/function_tool.py +0 -0
  345. {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/toolkits/github_toolkit.py +0 -0
  346. {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/toolkits/google_calendar_toolkit.py +0 -0
  347. {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/toolkits/google_drive_mcp_toolkit.py +0 -0
  348. {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/toolkits/google_maps_toolkit.py +0 -0
  349. {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/toolkits/google_scholar_toolkit.py +0 -0
  350. {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/toolkits/human_toolkit.py +0 -0
  351. {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/toolkits/hybrid_browser_toolkit/__init__.py +0 -0
  352. {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/toolkits/hybrid_browser_toolkit/config_loader.py +0 -0
  353. {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/toolkits/hybrid_browser_toolkit/hybrid_browser_toolkit.py +0 -0
  354. {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/toolkits/hybrid_browser_toolkit/hybrid_browser_toolkit_ts.py +0 -0
  355. {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/toolkits/hybrid_browser_toolkit/ts/package-lock.json +0 -0
  356. {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/toolkits/hybrid_browser_toolkit/ts/package.json +0 -0
  357. {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/toolkits/hybrid_browser_toolkit/ts/src/browser-scripts.js +0 -0
  358. {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/toolkits/hybrid_browser_toolkit/ts/src/browser-session.ts +0 -0
  359. {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/toolkits/hybrid_browser_toolkit/ts/src/config-loader.ts +0 -0
  360. {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/toolkits/hybrid_browser_toolkit/ts/src/hybrid-browser-toolkit.ts +0 -0
  361. {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/toolkits/hybrid_browser_toolkit/ts/src/index.ts +0 -0
  362. {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/toolkits/hybrid_browser_toolkit/ts/src/types.ts +0 -0
  363. {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/toolkits/hybrid_browser_toolkit/ts/tsconfig.json +0 -0
  364. {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/toolkits/hybrid_browser_toolkit/ts/websocket-server.js +0 -0
  365. {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/toolkits/hybrid_browser_toolkit_py/__init__.py +0 -0
  366. {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/toolkits/hybrid_browser_toolkit_py/actions.py +0 -0
  367. {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/toolkits/hybrid_browser_toolkit_py/agent.py +0 -0
  368. {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/toolkits/hybrid_browser_toolkit_py/browser_session.py +0 -0
  369. {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/toolkits/hybrid_browser_toolkit_py/config_loader.py +0 -0
  370. {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/toolkits/hybrid_browser_toolkit_py/hybrid_browser_toolkit.py +0 -0
  371. {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/toolkits/hybrid_browser_toolkit_py/snapshot.py +0 -0
  372. {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/toolkits/hybrid_browser_toolkit_py/stealth_script.js +0 -0
  373. {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/toolkits/hybrid_browser_toolkit_py/unified_analyzer.js +0 -0
  374. {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/toolkits/image_analysis_toolkit.py +0 -0
  375. {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/toolkits/jina_reranker_toolkit.py +0 -0
  376. {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/toolkits/klavis_toolkit.py +0 -0
  377. {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/toolkits/linkedin_toolkit.py +0 -0
  378. {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/toolkits/markitdown_toolkit.py +0 -0
  379. {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/toolkits/math_toolkit.py +0 -0
  380. {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/toolkits/mcp_toolkit.py +0 -0
  381. {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/toolkits/memory_toolkit.py +0 -0
  382. {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/toolkits/meshy_toolkit.py +0 -0
  383. {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/toolkits/message_agent_toolkit.py +0 -0
  384. {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/toolkits/mineru_toolkit.py +0 -0
  385. {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/toolkits/networkx_toolkit.py +0 -0
  386. {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/toolkits/note_taking_toolkit.py +0 -0
  387. {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/toolkits/notion_mcp_toolkit.py +0 -0
  388. {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/toolkits/notion_toolkit.py +0 -0
  389. {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/toolkits/open_api_specs/biztoc/__init__.py +0 -0
  390. {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/toolkits/open_api_specs/biztoc/ai-plugin.json +0 -0
  391. {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/toolkits/open_api_specs/biztoc/openapi.yaml +0 -0
  392. {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/toolkits/open_api_specs/coursera/__init__.py +0 -0
  393. {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/toolkits/open_api_specs/coursera/openapi.yaml +0 -0
  394. {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/toolkits/open_api_specs/create_qr_code/__init__.py +0 -0
  395. {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/toolkits/open_api_specs/create_qr_code/openapi.yaml +0 -0
  396. {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/toolkits/open_api_specs/klarna/__init__.py +0 -0
  397. {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/toolkits/open_api_specs/klarna/openapi.yaml +0 -0
  398. {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/toolkits/open_api_specs/nasa_apod/__init__.py +0 -0
  399. {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/toolkits/open_api_specs/nasa_apod/openapi.yaml +0 -0
  400. {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/toolkits/open_api_specs/outschool/__init__.py +0 -0
  401. {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/toolkits/open_api_specs/outschool/ai-plugin.json +0 -0
  402. {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/toolkits/open_api_specs/outschool/openapi.yaml +0 -0
  403. {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/toolkits/open_api_specs/outschool/paths/__init__.py +0 -0
  404. {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/toolkits/open_api_specs/outschool/paths/get_classes.py +0 -0
  405. {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/toolkits/open_api_specs/outschool/paths/search_teachers.py +0 -0
  406. {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/toolkits/open_api_specs/security_config.py +0 -0
  407. {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/toolkits/open_api_specs/speak/__init__.py +0 -0
  408. {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/toolkits/open_api_specs/speak/openapi.yaml +0 -0
  409. {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/toolkits/open_api_specs/web_scraper/__init__.py +0 -0
  410. {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/toolkits/open_api_specs/web_scraper/ai-plugin.json +0 -0
  411. {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/toolkits/open_api_specs/web_scraper/openapi.yaml +0 -0
  412. {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/toolkits/open_api_specs/web_scraper/paths/__init__.py +0 -0
  413. {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/toolkits/open_api_specs/web_scraper/paths/scraper.py +0 -0
  414. {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/toolkits/open_api_toolkit.py +0 -0
  415. {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/toolkits/openai_agent_toolkit.py +0 -0
  416. {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/toolkits/openai_image_toolkit.py +0 -0
  417. {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/toolkits/openbb_toolkit.py +0 -0
  418. {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/toolkits/origene_mcp_toolkit.py +0 -0
  419. {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/toolkits/page_script.js +0 -0
  420. {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/toolkits/playwright_mcp_toolkit.py +0 -0
  421. {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/toolkits/pptx_toolkit.py +0 -0
  422. {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/toolkits/pubmed_toolkit.py +0 -0
  423. {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/toolkits/pulse_mcp_search_toolkit.py +0 -0
  424. {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/toolkits/pyautogui_toolkit.py +0 -0
  425. {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/toolkits/reddit_toolkit.py +0 -0
  426. {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/toolkits/retrieval_toolkit.py +0 -0
  427. {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/toolkits/screenshot_toolkit.py +0 -0
  428. {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/toolkits/search_toolkit.py +0 -0
  429. {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/toolkits/searxng_toolkit.py +0 -0
  430. {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/toolkits/semantic_scholar_toolkit.py +0 -0
  431. {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/toolkits/slack_toolkit.py +0 -0
  432. {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/toolkits/stripe_toolkit.py +0 -0
  433. {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/toolkits/sympy_toolkit.py +0 -0
  434. {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/toolkits/task_planning_toolkit.py +0 -0
  435. {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/toolkits/terminal_toolkit.py +0 -0
  436. {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/toolkits/thinking_toolkit.py +0 -0
  437. {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/toolkits/twitter_toolkit.py +0 -0
  438. {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/toolkits/video_analysis_toolkit.py +0 -0
  439. {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/toolkits/video_download_toolkit.py +0 -0
  440. {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/toolkits/weather_toolkit.py +0 -0
  441. {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/toolkits/web_deploy_toolkit.py +0 -0
  442. {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/toolkits/whatsapp_toolkit.py +0 -0
  443. {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/toolkits/wolfram_alpha_toolkit.py +0 -0
  444. {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/toolkits/zapier_toolkit.py +0 -0
  445. {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/types/__init__.py +0 -0
  446. {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/types/agents/__init__.py +0 -0
  447. {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/types/agents/tool_calling_record.py +0 -0
  448. {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/types/enums.py +0 -0
  449. {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/types/mcp_registries.py +0 -0
  450. {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/types/openai_types.py +0 -0
  451. {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/types/unified_model_type.py +0 -0
  452. {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/utils/__init__.py +0 -0
  453. {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/utils/async_func.py +0 -0
  454. {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/utils/chunker/__init__.py +0 -0
  455. {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/utils/chunker/base.py +0 -0
  456. {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/utils/chunker/code_chunker.py +0 -0
  457. {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/utils/chunker/uio_chunker.py +0 -0
  458. {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/utils/commons.py +0 -0
  459. {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/utils/constants.py +0 -0
  460. {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/utils/deduplication.py +0 -0
  461. {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/utils/filename.py +0 -0
  462. {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/utils/langfuse.py +0 -0
  463. {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/utils/mcp.py +0 -0
  464. {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/utils/mcp_client.py +0 -0
  465. {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/utils/message_summarizer.py +0 -0
  466. {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/utils/response_format.py +0 -0
  467. {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/utils/token_counting.py +0 -0
  468. {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/utils/tool_result.py +0 -0
  469. {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/verifiers/__init__.py +0 -0
  470. {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/verifiers/base.py +0 -0
  471. {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/verifiers/math_verifier.py +0 -0
  472. {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/verifiers/models.py +0 -0
  473. {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/verifiers/physics_verifier.py +0 -0
  474. {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/verifiers/python_verifier.py +0 -0
  475. {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/hatch_build_npm.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: camel-ai
3
- Version: 0.2.73a2
3
+ Version: 0.2.73a3
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.73a2'
17
+ __version__ = '0.2.73a3'
18
18
 
19
19
  __all__ = [
20
20
  '__version__',
@@ -14,6 +14,7 @@
14
14
 
15
15
  # Enables postponed evaluation of annotations (for string-based type hints)
16
16
  import os
17
+ from pathlib import Path
17
18
  from typing import TYPE_CHECKING, List, Optional, Union
18
19
 
19
20
  from camel.logger import get_logger
@@ -41,7 +42,7 @@ class ExcelToolkit(BaseToolkit):
41
42
  def __init__(
42
43
  self,
43
44
  timeout: Optional[float] = None,
44
- file_path: Optional[str] = None,
45
+ working_directory: Optional[str] = None,
45
46
  ):
46
47
  r"""Initializes a new instance of the ExcelToolkit class.
47
48
 
@@ -49,16 +50,28 @@ class ExcelToolkit(BaseToolkit):
49
50
  timeout (Optional[float]): The timeout value for API requests
50
51
  in seconds. If None, no timeout is applied.
51
52
  (default: :obj:`None`)
52
- file_path (Optional[str]): Path to an existing Excel file to load.
53
- (default: :obj:`None`)
53
+ working_directory (str, optional): The default directory for
54
+ output files. If not provided, it will be determined by the
55
+ `CAMEL_WORKDIR` environment variable (if set). If the
56
+ environment variable is not set, it defaults to
57
+ `camel_working_dir`.
54
58
  """
55
59
  super().__init__(timeout=timeout)
56
- self.file_path = file_path
57
60
  self.wb = None
58
- if file_path and os.path.exists(file_path):
59
- from openpyxl import load_workbook
61
+ if working_directory:
62
+ self.working_directory = Path(working_directory).resolve()
63
+ else:
64
+ camel_workdir = os.environ.get("CAMEL_WORKDIR")
65
+ if camel_workdir:
66
+ self.working_directory = Path(camel_workdir).resolve()
67
+ else:
68
+ self.working_directory = Path("./camel_working_dir").resolve()
60
69
 
61
- self.wb = load_workbook(file_path)
70
+ self.working_directory.mkdir(parents=True, exist_ok=True)
71
+ logger.info(
72
+ f"ExcelToolkit initialized with output directory: "
73
+ f"{self.working_directory}"
74
+ )
62
75
 
63
76
  def _validate_file_path(self, file_path: str) -> bool:
64
77
  r"""Validate file path for security.
@@ -232,12 +245,11 @@ class ExcelToolkit(BaseToolkit):
232
245
  logger.error(f"Failed to process Excel file {document_path}: {e}")
233
246
  return f"Failed to process Excel file {document_path}: {e}"
234
247
 
235
- def _save_workbook(self, file_path: Optional[str] = None) -> str:
248
+ def _save_workbook(self, file_path: str) -> str:
236
249
  r"""Save the current workbook to file.
237
250
 
238
251
  Args:
239
- file_path (Optional[str]): The path to save the workbook.
240
- If None, uses self.file_path.
252
+ file_path (str): The path to save the workbook.
241
253
 
242
254
  Returns:
243
255
  str: Success or error message.
@@ -245,23 +257,46 @@ class ExcelToolkit(BaseToolkit):
245
257
  if not self.wb:
246
258
  return "Error: No workbook loaded to save."
247
259
 
248
- save_path = file_path or self.file_path
249
- if not save_path:
250
- return "Error: No file path specified for saving."
251
-
252
- if not self._validate_file_path(save_path):
260
+ if not self._validate_file_path(file_path):
253
261
  return "Error: Invalid file path for saving."
254
262
 
255
263
  try:
256
- self.wb.save(save_path)
257
- return f"Workbook saved successfully to {save_path}"
264
+ self.wb.save(file_path)
265
+ return f"Workbook saved successfully to {file_path}"
258
266
  except Exception as e:
259
267
  logger.error(f"Failed to save workbook: {e}")
260
268
  return f"Error: Failed to save workbook: {e}"
261
269
 
270
+ def save_workbook(self, filename: str) -> str:
271
+ r"""Save the current in-memory workbook to a file.
272
+
273
+ Args:
274
+ filename (str): The filename to save the workbook. Must end with
275
+ .xlsx extension. The file will be saved in self.
276
+ working_directory.
277
+
278
+ Returns:
279
+ str: Success message or error details.
280
+ """
281
+ if not self.wb:
282
+ return "Error: No workbook is currently loaded in memory."
283
+
284
+ # Validate filename
285
+ if not filename:
286
+ return "Error: Filename is required."
287
+
288
+ if not filename.endswith('.xlsx'):
289
+ return "Error: Filename must end with .xlsx extension."
290
+
291
+ # Create full path in working directory
292
+ file_path = self.working_directory / filename
293
+ resolved_file_path = str(file_path.resolve())
294
+
295
+ return self._save_workbook(resolved_file_path)
296
+
262
297
  def create_workbook(
263
298
  self,
264
- file_path: str,
299
+ filename: Optional[str] = None,
265
300
  sheet_name: Optional[str] = None,
266
301
  data: Optional[List[List[Union[str, int, float, None]]]] = None,
267
302
  ) -> str:
@@ -271,8 +306,9 @@ class ExcelToolkit(BaseToolkit):
271
306
  toolkit to work with the new file and optionally adds initial data.
272
307
 
273
308
  Args:
274
- file_path (str): Where to save the new Excel file. Must end with .
275
- xlsx.
309
+ filename (Optional[str]): The filename for the workbook. Must end
310
+ with .xlsx extension. The file will be saved in
311
+ self.working_directory. (default: :obj:`None`)
276
312
  sheet_name (Optional[str]): Name for the first sheet. If None,
277
313
  creates "Sheet1". (default: :obj:`None`)
278
314
  data (Optional[List[List[Union[str, int, float, None]]]]): Initial
@@ -284,14 +320,31 @@ class ExcelToolkit(BaseToolkit):
284
320
  """
285
321
  from openpyxl import Workbook
286
322
 
287
- if not self._validate_file_path(file_path):
323
+ # Validate filename
324
+ if filename is None:
325
+ return "Error: Filename is required."
326
+
327
+ if not filename.endswith('.xlsx'):
328
+ return "Error: Filename must end with .xlsx extension."
329
+
330
+ # Create full path in working directory
331
+ file_path = self.working_directory / filename
332
+ resolved_file_path = str(file_path.resolve())
333
+
334
+ if not self._validate_file_path(resolved_file_path):
288
335
  return "Error: Invalid file path."
289
336
 
337
+ # Check if file already exists
338
+ if os.path.exists(resolved_file_path):
339
+ return (
340
+ f"Error: File {filename} already exists in "
341
+ f"{self.working_directory}."
342
+ )
343
+
290
344
  try:
291
345
  # Create a new workbook
292
346
  wb = Workbook()
293
347
  self.wb = wb
294
- self.file_path = file_path
295
348
 
296
349
  # Handle sheet creation safely
297
350
  if sheet_name:
@@ -312,42 +365,55 @@ class ExcelToolkit(BaseToolkit):
312
365
  ws.append(row)
313
366
 
314
367
  # Save the workbook to the specified file path
315
- wb.save(file_path)
368
+ wb.save(resolved_file_path)
316
369
 
317
- return f"Workbook created successfully at {file_path}"
370
+ return f"Workbook created successfully at {resolved_file_path}"
318
371
  except Exception as e:
319
372
  logger.error(f"Failed to create workbook: {e}")
320
373
  return f"Error: Failed to create workbook: {e}"
321
374
 
322
- def delete_workbook(self, file_path: Optional[str] = None) -> str:
323
- r"""Delete a spreadsheet file.
375
+ def delete_workbook(self, filename: str) -> str:
376
+ r"""Delete a spreadsheet file from the working directory.
324
377
 
325
378
  Args:
326
- file_path (Optional[str]): The path of the file to delete.
327
- If None, uses self.file_path.
379
+ filename (str): The filename to delete. Must end with .xlsx
380
+ extension. The file will be deleted from self.
381
+ working_directory.
328
382
 
329
383
  Returns:
330
- str: Success message.
384
+ str: Success message or error details.
331
385
  """
332
- target_path = file_path or self.file_path
333
- if not target_path:
334
- return "Error: No file path specified for deletion."
386
+ # Validate filename
387
+ if not filename:
388
+ return "Error: Filename is required."
389
+
390
+ if not filename.endswith('.xlsx'):
391
+ return "Error: Filename must end with .xlsx extension."
392
+
393
+ # Create full path in working directory
394
+ file_path = self.working_directory / filename
395
+ target_path = str(file_path.resolve())
335
396
 
336
397
  if not self._validate_file_path(target_path):
337
398
  return "Error: Invalid file path."
338
399
 
339
400
  if not os.path.exists(target_path):
340
- return f"File {target_path} does not exist."
401
+ return (
402
+ f"Error: File {filename} does not exist in "
403
+ f"{self.working_directory}."
404
+ )
341
405
 
342
406
  try:
343
407
  os.remove(target_path)
344
- if target_path == self.file_path:
345
- self.wb = None
346
- self.file_path = None
347
- return f"Workbook {target_path} deleted successfully."
408
+ # Clean up workbook if one is loaded
409
+ self.wb = None
410
+ return (
411
+ f"Workbook {filename} deleted successfully from "
412
+ f"{self.working_directory}."
413
+ )
348
414
  except Exception as e:
349
415
  logger.error(f"Failed to delete workbook: {e}")
350
- return f"Failed to delete workbook {target_path}: {e}"
416
+ return f"Error: Failed to delete workbook {filename}: {e}"
351
417
 
352
418
  def create_sheet(
353
419
  self,
@@ -379,9 +445,6 @@ class ExcelToolkit(BaseToolkit):
379
445
  for row in data:
380
446
  ws.append(row)
381
447
 
382
- save_result = self._save_workbook()
383
- if save_result.startswith("Error"):
384
- return save_result
385
448
  return f"Sheet {sheet_name} created successfully."
386
449
  except Exception as e:
387
450
  logger.error(f"Failed to create sheet: {e}")
@@ -408,9 +471,6 @@ class ExcelToolkit(BaseToolkit):
408
471
  try:
409
472
  ws = self.wb[sheet_name]
410
473
  self.wb.remove(ws)
411
- save_result = self._save_workbook()
412
- if save_result.startswith("Error"):
413
- return save_result
414
474
  return f"Sheet {sheet_name} deleted successfully."
415
475
  except Exception as e:
416
476
  logger.error(f"Failed to delete sheet: {e}")
@@ -439,9 +499,6 @@ class ExcelToolkit(BaseToolkit):
439
499
  for cell in row:
440
500
  cell.value = None
441
501
 
442
- save_result = self._save_workbook()
443
- if save_result.startswith("Error"):
444
- return save_result
445
502
  return f"Sheet {sheet_name} cleared successfully."
446
503
  except Exception as e:
447
504
  logger.error(f"Failed to clear sheet: {e}")
@@ -479,7 +536,6 @@ class ExcelToolkit(BaseToolkit):
479
536
  num_rows = end_row - start_row + 1
480
537
  ws.delete_rows(start_row, num_rows)
481
538
 
482
- self._save_workbook()
483
539
  return (
484
540
  f"Deleted rows {start_row} to {end_row} from sheet "
485
541
  f"{sheet_name} successfully."
@@ -518,7 +574,6 @@ class ExcelToolkit(BaseToolkit):
518
574
  num_cols = end_col - start_col + 1
519
575
  ws.delete_cols(start_col, num_cols)
520
576
 
521
- self._save_workbook()
522
577
  return (
523
578
  f"Deleted columns {start_col} to {end_col} from sheet "
524
579
  f"{sheet_name} successfully."
@@ -585,9 +640,6 @@ class ExcelToolkit(BaseToolkit):
585
640
  ws[cell_reference].value = None
586
641
  else:
587
642
  ws[cell_reference] = value
588
- save_result = self._save_workbook()
589
- if save_result.startswith("Error"):
590
- return save_result
591
643
  return (
592
644
  f"Cell {cell_reference} updated successfully in sheet "
593
645
  f"{sheet_name}."
@@ -765,10 +817,9 @@ class ExcelToolkit(BaseToolkit):
765
817
  if col_idx < len(values[row_idx]):
766
818
  cell.value = values[row_idx][col_idx]
767
819
 
768
- self._save_workbook()
769
820
  return f"Values set for range {cell_range} in sheet {sheet_name}."
770
821
 
771
- def export_sheet_to_csv(self, sheet_name: str, csv_path: str) -> str:
822
+ def export_sheet_to_csv(self, sheet_name: str, csv_filename: str) -> str:
772
823
  r"""Export a specific sheet to CSV format.
773
824
 
774
825
  Use this to convert Excel sheets to CSV files for compatibility or
@@ -776,24 +827,63 @@ class ExcelToolkit(BaseToolkit):
776
827
 
777
828
  Args:
778
829
  sheet_name (str): Name of the sheet to export.
779
- csv_path (str): File path where CSV will be saved.
830
+ csv_filename (str): Filename for the CSV file. Must end with .csv
831
+ extension. The file will be saved in self.working_directory.
780
832
 
781
833
  Returns:
782
834
  str: Success confirmation message or error details.
783
835
  """
784
836
  if not self.wb:
785
- return "Error: Workbook not initialized."
837
+ return (
838
+ "Error: No workbook is currently loaded. Use "
839
+ "extract_excel_content to load a workbook first."
840
+ )
786
841
 
787
842
  if sheet_name not in self.wb.sheetnames:
788
- return f"Error: Sheet {sheet_name} does not exist."
843
+ return (
844
+ f"Error: Sheet {sheet_name} does not exist in the current "
845
+ "workbook."
846
+ )
789
847
 
790
- import pandas as pd
848
+ # Validate filename
849
+ if not csv_filename:
850
+ return "Error: CSV filename is required."
791
851
 
792
- # Read the specific sheet
793
- df = pd.read_excel(self.file_path, sheet_name=sheet_name)
794
- df.to_csv(csv_path, index=False)
852
+ if not csv_filename.endswith('.csv'):
853
+ return "Error: CSV filename must end with .csv extension."
795
854
 
796
- return f"Sheet {sheet_name} exported to CSV: {csv_path}"
855
+ # Create full path in working directory
856
+ csv_path = self.working_directory / csv_filename
857
+ resolved_csv_path = str(csv_path.resolve())
858
+
859
+ if not self._validate_file_path(resolved_csv_path):
860
+ return "Error: Invalid file path."
861
+
862
+ try:
863
+ # Get the worksheet
864
+ ws = self.wb[sheet_name]
865
+
866
+ # Convert worksheet to list of lists
867
+ data = []
868
+ for row in ws.iter_rows(values_only=True):
869
+ data.append(list(row))
870
+
871
+ # Write to CSV
872
+ import csv
873
+
874
+ with open(
875
+ resolved_csv_path, 'w', newline='', encoding='utf-8'
876
+ ) as csvfile:
877
+ writer = csv.writer(csvfile)
878
+ writer.writerows(data)
879
+
880
+ return (
881
+ f"Sheet {sheet_name} exported to {csv_filename} "
882
+ f"in {self.working_directory}."
883
+ )
884
+ except Exception as e:
885
+ logger.error(f"Failed to export sheet to CSV: {e}")
886
+ return f"Error: Failed to export sheet {sheet_name} to CSV: {e}"
797
887
 
798
888
  def get_rows(
799
889
  self,
@@ -862,7 +952,6 @@ class ExcelToolkit(BaseToolkit):
862
952
  return f"Error: Sheet {sheet_name} does not exist."
863
953
  ws = self.wb[sheet_name]
864
954
  ws.append(row_data)
865
- self._save_workbook()
866
955
  return f"Row appended to sheet {sheet_name} successfully."
867
956
 
868
957
  def update_row(
@@ -901,7 +990,6 @@ class ExcelToolkit(BaseToolkit):
901
990
  for col_idx, value in enumerate(row_data, 1):
902
991
  ws.cell(row=row_number, column=col_idx).value = value
903
992
 
904
- self._save_workbook()
905
993
  return f"Row {row_number} updated in sheet {sheet_name} successfully."
906
994
 
907
995
  def get_tools(self) -> List[FunctionTool]:
@@ -916,6 +1004,7 @@ class ExcelToolkit(BaseToolkit):
916
1004
  # File operations
917
1005
  FunctionTool(self.extract_excel_content),
918
1006
  FunctionTool(self.create_workbook),
1007
+ FunctionTool(self.save_workbook),
919
1008
  FunctionTool(self.delete_workbook),
920
1009
  FunctionTool(self.export_sheet_to_csv),
921
1010
  # Sheet operations
@@ -110,6 +110,11 @@ class WebSocketBrowserWrapper:
110
110
  self.process: Optional[subprocess.Popen] = None
111
111
  self.websocket = None
112
112
  self.server_port = None
113
+ self._send_lock = asyncio.Lock() # Lock for sending messages
114
+ self._receive_task = None # Background task for receiving messages
115
+ self._pending_responses: Dict[
116
+ str, asyncio.Future[Dict[str, Any]]
117
+ ] = {} # Message ID -> Future
113
118
 
114
119
  # Logging configuration
115
120
  self.browser_log_to_file = (config or {}).get(
@@ -251,11 +256,22 @@ class WebSocketBrowserWrapper:
251
256
  f"Failed to connect to WebSocket server: {e}"
252
257
  ) from e
253
258
 
259
+ # Start the background receiver task
260
+ self._receive_task = asyncio.create_task(self._receive_loop())
261
+
254
262
  # Initialize the browser toolkit
255
263
  await self._send_command('init', self.config)
256
264
 
257
265
  async def stop(self):
258
266
  """Stop the WebSocket connection and server."""
267
+ # Cancel the receiver task
268
+ if self._receive_task and not self._receive_task.done():
269
+ self._receive_task.cancel()
270
+ try:
271
+ await self._receive_task
272
+ except asyncio.CancelledError:
273
+ pass
274
+
259
275
  if self.websocket:
260
276
  try:
261
277
  await self._send_command('shutdown', {})
@@ -327,6 +343,39 @@ class WebSocketBrowserWrapper:
327
343
  except Exception as e:
328
344
  logger.error(f"Failed to write to log file: {e}")
329
345
 
346
+ async def _receive_loop(self):
347
+ r"""Background task to receive messages from WebSocket."""
348
+ try:
349
+ while self.websocket:
350
+ try:
351
+ response_data = await self.websocket.recv()
352
+ response = json.loads(response_data)
353
+
354
+ message_id = response.get('id')
355
+ if message_id and message_id in self._pending_responses:
356
+ # Set the result for the waiting coroutine
357
+ future = self._pending_responses.pop(message_id)
358
+ if not future.done():
359
+ future.set_result(response)
360
+ else:
361
+ # Log unexpected messages
362
+ logger.warning(
363
+ f"Received unexpected message: {response}"
364
+ )
365
+
366
+ except asyncio.CancelledError:
367
+ break
368
+ except Exception as e:
369
+ logger.error(f"Error in receive loop: {e}")
370
+ # Notify all pending futures of the error
371
+ for future in self._pending_responses.values():
372
+ if not future.done():
373
+ future.set_exception(e)
374
+ self._pending_responses.clear()
375
+ break
376
+ finally:
377
+ logger.debug("Receive loop terminated")
378
+
330
379
  async def _ensure_connection(self) -> None:
331
380
  """Ensure WebSocket connection is alive."""
332
381
  if not self.websocket:
@@ -350,39 +399,39 @@ class WebSocketBrowserWrapper:
350
399
  message_id = str(uuid.uuid4())
351
400
  message = {'id': message_id, 'command': command, 'params': params}
352
401
 
353
- try:
354
- # Send command
355
- if self.websocket is None:
356
- raise RuntimeError("WebSocket connection not established")
357
- await self.websocket.send(json.dumps(message))
402
+ # Create a future for this message
403
+ future: asyncio.Future[Dict[str, Any]] = asyncio.Future()
404
+ self._pending_responses[message_id] = future
358
405
 
359
- # Wait for response with matching ID
360
- while True:
361
- try:
362
- if self.websocket is None:
363
- raise RuntimeError("WebSocket connection lost")
364
- response_data = await asyncio.wait_for(
365
- self.websocket.recv(), timeout=60.0
366
- )
367
- response = json.loads(response_data)
368
-
369
- # Check if this is the response we're waiting for
370
- if response.get('id') == message_id:
371
- if not response.get('success'):
372
- raise RuntimeError(
373
- f"Command failed: {response.get('error')}"
374
- )
375
- return response['result']
406
+ try:
407
+ # Use lock only for sending to prevent interleaved messages
408
+ async with self._send_lock:
409
+ if self.websocket is None:
410
+ raise RuntimeError("WebSocket connection not established")
411
+ await self.websocket.send(json.dumps(message))
412
+
413
+ # Wait for response (no lock needed, handled by background
414
+ # receiver)
415
+ try:
416
+ response = await asyncio.wait_for(future, timeout=60.0)
376
417
 
377
- except asyncio.TimeoutError:
418
+ if not response.get('success'):
378
419
  raise RuntimeError(
379
- f"Timeout waiting for response to command: {command}"
420
+ f"Command failed: {response.get('error')}"
380
421
  )
381
- except json.JSONDecodeError as e:
382
- logger.warning(f"Failed to decode WebSocket response: {e}")
383
- continue
422
+ return response['result']
423
+
424
+ except asyncio.TimeoutError:
425
+ # Remove from pending if timeout
426
+ self._pending_responses.pop(message_id, None)
427
+ raise RuntimeError(
428
+ f"Timeout waiting for response to command: {command}"
429
+ )
384
430
 
385
431
  except Exception as e:
432
+ # Clean up the pending response
433
+ self._pending_responses.pop(message_id, None)
434
+
386
435
  # Check if it's a connection closed error
387
436
  if (
388
437
  "close frame" in str(e)