camel-ai 0.2.62__tar.gz → 0.2.64__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 (422) hide show
  1. {camel_ai-0.2.62 → camel_ai-0.2.64}/PKG-INFO +6 -1
  2. {camel_ai-0.2.62 → camel_ai-0.2.64}/camel/__init__.py +1 -1
  3. {camel_ai-0.2.62 → camel_ai-0.2.64}/camel/agents/chat_agent.py +76 -17
  4. {camel_ai-0.2.62 → camel_ai-0.2.64}/camel/agents/mcp_agent.py +5 -1
  5. {camel_ai-0.2.62 → camel_ai-0.2.64}/camel/configs/__init__.py +3 -0
  6. camel_ai-0.2.64/camel/configs/crynux_config.py +94 -0
  7. {camel_ai-0.2.62 → camel_ai-0.2.64}/camel/interpreters/base.py +14 -1
  8. camel_ai-0.2.64/camel/interpreters/docker/Dockerfile +68 -0
  9. {camel_ai-0.2.62 → camel_ai-0.2.64}/camel/interpreters/docker_interpreter.py +65 -7
  10. {camel_ai-0.2.62 → camel_ai-0.2.64}/camel/interpreters/e2b_interpreter.py +23 -8
  11. {camel_ai-0.2.62 → camel_ai-0.2.64}/camel/interpreters/internal_python_interpreter.py +30 -2
  12. {camel_ai-0.2.62 → camel_ai-0.2.64}/camel/interpreters/ipython_interpreter.py +21 -3
  13. {camel_ai-0.2.62 → camel_ai-0.2.64}/camel/interpreters/subprocess_interpreter.py +34 -2
  14. {camel_ai-0.2.62 → camel_ai-0.2.64}/camel/memories/records.py +5 -3
  15. {camel_ai-0.2.62 → camel_ai-0.2.64}/camel/models/__init__.py +2 -0
  16. {camel_ai-0.2.62 → camel_ai-0.2.64}/camel/models/azure_openai_model.py +101 -25
  17. {camel_ai-0.2.62 → camel_ai-0.2.64}/camel/models/cohere_model.py +65 -0
  18. camel_ai-0.2.64/camel/models/crynux_model.py +94 -0
  19. {camel_ai-0.2.62 → camel_ai-0.2.64}/camel/models/deepseek_model.py +43 -1
  20. {camel_ai-0.2.62 → camel_ai-0.2.64}/camel/models/gemini_model.py +50 -4
  21. {camel_ai-0.2.62 → camel_ai-0.2.64}/camel/models/litellm_model.py +38 -0
  22. {camel_ai-0.2.62 → camel_ai-0.2.64}/camel/models/mistral_model.py +66 -0
  23. {camel_ai-0.2.62 → camel_ai-0.2.64}/camel/models/model_factory.py +10 -1
  24. {camel_ai-0.2.62 → camel_ai-0.2.64}/camel/models/openai_compatible_model.py +81 -17
  25. {camel_ai-0.2.62 → camel_ai-0.2.64}/camel/models/openai_model.py +86 -16
  26. {camel_ai-0.2.62 → camel_ai-0.2.64}/camel/models/reka_model.py +69 -0
  27. {camel_ai-0.2.62 → camel_ai-0.2.64}/camel/models/samba_model.py +69 -2
  28. {camel_ai-0.2.62 → camel_ai-0.2.64}/camel/models/sglang_model.py +74 -2
  29. {camel_ai-0.2.62 → camel_ai-0.2.64}/camel/models/watsonx_model.py +62 -0
  30. {camel_ai-0.2.62 → camel_ai-0.2.64}/camel/societies/workforce/role_playing_worker.py +2 -2
  31. {camel_ai-0.2.62 → camel_ai-0.2.64}/camel/societies/workforce/single_agent_worker.py +23 -0
  32. {camel_ai-0.2.62 → camel_ai-0.2.64}/camel/societies/workforce/workforce.py +409 -7
  33. {camel_ai-0.2.62 → camel_ai-0.2.64}/camel/storages/__init__.py +2 -0
  34. {camel_ai-0.2.62 → camel_ai-0.2.64}/camel/storages/vectordb_storages/__init__.py +2 -0
  35. camel_ai-0.2.64/camel/storages/vectordb_storages/weaviate.py +714 -0
  36. {camel_ai-0.2.62 → camel_ai-0.2.64}/camel/tasks/task.py +19 -10
  37. {camel_ai-0.2.62 → camel_ai-0.2.64}/camel/toolkits/code_execution.py +37 -8
  38. {camel_ai-0.2.62 → camel_ai-0.2.64}/camel/toolkits/mcp_toolkit.py +13 -2
  39. {camel_ai-0.2.62 → camel_ai-0.2.64}/camel/types/enums.py +56 -1
  40. {camel_ai-0.2.62 → camel_ai-0.2.64}/camel/types/unified_model_type.py +5 -0
  41. {camel_ai-0.2.62 → camel_ai-0.2.64}/camel/utils/__init__.py +16 -0
  42. camel_ai-0.2.64/camel/utils/langfuse.py +258 -0
  43. {camel_ai-0.2.62 → camel_ai-0.2.64}/camel/utils/mcp_client.py +84 -17
  44. {camel_ai-0.2.62 → camel_ai-0.2.64}/pyproject.toml +8 -1
  45. camel_ai-0.2.62/camel/interpreters/docker/Dockerfile +0 -12
  46. {camel_ai-0.2.62 → camel_ai-0.2.64}/.gitignore +0 -0
  47. {camel_ai-0.2.62 → camel_ai-0.2.64}/LICENSE +0 -0
  48. {camel_ai-0.2.62 → camel_ai-0.2.64}/README.md +0 -0
  49. {camel_ai-0.2.62 → camel_ai-0.2.64}/camel/agents/__init__.py +0 -0
  50. {camel_ai-0.2.62 → camel_ai-0.2.64}/camel/agents/_types.py +0 -0
  51. {camel_ai-0.2.62 → camel_ai-0.2.64}/camel/agents/_utils.py +0 -0
  52. {camel_ai-0.2.62 → camel_ai-0.2.64}/camel/agents/base.py +0 -0
  53. {camel_ai-0.2.62 → camel_ai-0.2.64}/camel/agents/critic_agent.py +0 -0
  54. {camel_ai-0.2.62 → camel_ai-0.2.64}/camel/agents/deductive_reasoner_agent.py +0 -0
  55. {camel_ai-0.2.62 → camel_ai-0.2.64}/camel/agents/embodied_agent.py +0 -0
  56. {camel_ai-0.2.62 → camel_ai-0.2.64}/camel/agents/knowledge_graph_agent.py +0 -0
  57. {camel_ai-0.2.62 → camel_ai-0.2.64}/camel/agents/multi_hop_generator_agent.py +0 -0
  58. {camel_ai-0.2.62 → camel_ai-0.2.64}/camel/agents/programmed_agent_instruction.py +0 -0
  59. {camel_ai-0.2.62 → camel_ai-0.2.64}/camel/agents/repo_agent.py +0 -0
  60. {camel_ai-0.2.62 → camel_ai-0.2.64}/camel/agents/role_assignment_agent.py +0 -0
  61. {camel_ai-0.2.62 → camel_ai-0.2.64}/camel/agents/search_agent.py +0 -0
  62. {camel_ai-0.2.62 → camel_ai-0.2.64}/camel/agents/task_agent.py +0 -0
  63. {camel_ai-0.2.62 → camel_ai-0.2.64}/camel/agents/tool_agents/__init__.py +0 -0
  64. {camel_ai-0.2.62 → camel_ai-0.2.64}/camel/agents/tool_agents/base.py +0 -0
  65. {camel_ai-0.2.62 → camel_ai-0.2.64}/camel/agents/tool_agents/hugging_face_tool_agent.py +0 -0
  66. {camel_ai-0.2.62 → camel_ai-0.2.64}/camel/benchmarks/__init__.py +0 -0
  67. {camel_ai-0.2.62 → camel_ai-0.2.64}/camel/benchmarks/apibank.py +0 -0
  68. {camel_ai-0.2.62 → camel_ai-0.2.64}/camel/benchmarks/apibench.py +0 -0
  69. {camel_ai-0.2.62 → camel_ai-0.2.64}/camel/benchmarks/base.py +0 -0
  70. {camel_ai-0.2.62 → camel_ai-0.2.64}/camel/benchmarks/browsecomp.py +0 -0
  71. {camel_ai-0.2.62 → camel_ai-0.2.64}/camel/benchmarks/gaia.py +0 -0
  72. {camel_ai-0.2.62 → camel_ai-0.2.64}/camel/benchmarks/nexus.py +0 -0
  73. {camel_ai-0.2.62 → camel_ai-0.2.64}/camel/benchmarks/ragbench.py +0 -0
  74. {camel_ai-0.2.62 → camel_ai-0.2.64}/camel/bots/__init__.py +0 -0
  75. {camel_ai-0.2.62 → camel_ai-0.2.64}/camel/bots/discord/__init__.py +0 -0
  76. {camel_ai-0.2.62 → camel_ai-0.2.64}/camel/bots/discord/discord_app.py +0 -0
  77. {camel_ai-0.2.62 → camel_ai-0.2.64}/camel/bots/discord/discord_installation.py +0 -0
  78. {camel_ai-0.2.62 → camel_ai-0.2.64}/camel/bots/discord/discord_store.py +0 -0
  79. {camel_ai-0.2.62 → camel_ai-0.2.64}/camel/bots/slack/__init__.py +0 -0
  80. {camel_ai-0.2.62 → camel_ai-0.2.64}/camel/bots/slack/models.py +0 -0
  81. {camel_ai-0.2.62 → camel_ai-0.2.64}/camel/bots/slack/slack_app.py +0 -0
  82. {camel_ai-0.2.62 → camel_ai-0.2.64}/camel/bots/telegram_bot.py +0 -0
  83. {camel_ai-0.2.62 → camel_ai-0.2.64}/camel/configs/aiml_config.py +0 -0
  84. {camel_ai-0.2.62 → camel_ai-0.2.64}/camel/configs/anthropic_config.py +0 -0
  85. {camel_ai-0.2.62 → camel_ai-0.2.64}/camel/configs/base_config.py +0 -0
  86. {camel_ai-0.2.62 → camel_ai-0.2.64}/camel/configs/bedrock_config.py +0 -0
  87. {camel_ai-0.2.62 → camel_ai-0.2.64}/camel/configs/cohere_config.py +0 -0
  88. {camel_ai-0.2.62 → camel_ai-0.2.64}/camel/configs/deepseek_config.py +0 -0
  89. {camel_ai-0.2.62 → camel_ai-0.2.64}/camel/configs/gemini_config.py +0 -0
  90. {camel_ai-0.2.62 → camel_ai-0.2.64}/camel/configs/groq_config.py +0 -0
  91. {camel_ai-0.2.62 → camel_ai-0.2.64}/camel/configs/internlm_config.py +0 -0
  92. {camel_ai-0.2.62 → camel_ai-0.2.64}/camel/configs/litellm_config.py +0 -0
  93. {camel_ai-0.2.62 → camel_ai-0.2.64}/camel/configs/lmstudio_config.py +0 -0
  94. {camel_ai-0.2.62 → camel_ai-0.2.64}/camel/configs/mistral_config.py +0 -0
  95. {camel_ai-0.2.62 → camel_ai-0.2.64}/camel/configs/modelscope_config.py +0 -0
  96. {camel_ai-0.2.62 → camel_ai-0.2.64}/camel/configs/moonshot_config.py +0 -0
  97. {camel_ai-0.2.62 → camel_ai-0.2.64}/camel/configs/netmind_config.py +0 -0
  98. {camel_ai-0.2.62 → camel_ai-0.2.64}/camel/configs/novita_config.py +0 -0
  99. {camel_ai-0.2.62 → camel_ai-0.2.64}/camel/configs/nvidia_config.py +0 -0
  100. {camel_ai-0.2.62 → camel_ai-0.2.64}/camel/configs/ollama_config.py +0 -0
  101. {camel_ai-0.2.62 → camel_ai-0.2.64}/camel/configs/openai_config.py +0 -0
  102. {camel_ai-0.2.62 → camel_ai-0.2.64}/camel/configs/openrouter_config.py +0 -0
  103. {camel_ai-0.2.62 → camel_ai-0.2.64}/camel/configs/ppio_config.py +0 -0
  104. {camel_ai-0.2.62 → camel_ai-0.2.64}/camel/configs/qwen_config.py +0 -0
  105. {camel_ai-0.2.62 → camel_ai-0.2.64}/camel/configs/reka_config.py +0 -0
  106. {camel_ai-0.2.62 → camel_ai-0.2.64}/camel/configs/samba_config.py +0 -0
  107. {camel_ai-0.2.62 → camel_ai-0.2.64}/camel/configs/sglang_config.py +0 -0
  108. {camel_ai-0.2.62 → camel_ai-0.2.64}/camel/configs/siliconflow_config.py +0 -0
  109. {camel_ai-0.2.62 → camel_ai-0.2.64}/camel/configs/togetherai_config.py +0 -0
  110. {camel_ai-0.2.62 → camel_ai-0.2.64}/camel/configs/vllm_config.py +0 -0
  111. {camel_ai-0.2.62 → camel_ai-0.2.64}/camel/configs/watsonx_config.py +0 -0
  112. {camel_ai-0.2.62 → camel_ai-0.2.64}/camel/configs/yi_config.py +0 -0
  113. {camel_ai-0.2.62 → camel_ai-0.2.64}/camel/configs/zhipuai_config.py +0 -0
  114. {camel_ai-0.2.62 → camel_ai-0.2.64}/camel/data_collectors/__init__.py +0 -0
  115. {camel_ai-0.2.62 → camel_ai-0.2.64}/camel/data_collectors/alpaca_collector.py +0 -0
  116. {camel_ai-0.2.62 → camel_ai-0.2.64}/camel/data_collectors/base.py +0 -0
  117. {camel_ai-0.2.62 → camel_ai-0.2.64}/camel/data_collectors/sharegpt_collector.py +0 -0
  118. {camel_ai-0.2.62 → camel_ai-0.2.64}/camel/datagen/__init__.py +0 -0
  119. {camel_ai-0.2.62 → camel_ai-0.2.64}/camel/datagen/cot_datagen.py +0 -0
  120. {camel_ai-0.2.62 → camel_ai-0.2.64}/camel/datagen/evol_instruct/__init__.py +0 -0
  121. {camel_ai-0.2.62 → camel_ai-0.2.64}/camel/datagen/evol_instruct/evol_instruct.py +0 -0
  122. {camel_ai-0.2.62 → camel_ai-0.2.64}/camel/datagen/evol_instruct/scorer.py +0 -0
  123. {camel_ai-0.2.62 → camel_ai-0.2.64}/camel/datagen/evol_instruct/templates.py +0 -0
  124. {camel_ai-0.2.62 → camel_ai-0.2.64}/camel/datagen/self_improving_cot.py +0 -0
  125. {camel_ai-0.2.62 → camel_ai-0.2.64}/camel/datagen/self_instruct/__init__.py +0 -0
  126. {camel_ai-0.2.62 → camel_ai-0.2.64}/camel/datagen/self_instruct/filter/__init__.py +0 -0
  127. {camel_ai-0.2.62 → camel_ai-0.2.64}/camel/datagen/self_instruct/filter/filter_function.py +0 -0
  128. {camel_ai-0.2.62 → camel_ai-0.2.64}/camel/datagen/self_instruct/filter/filter_registry.py +0 -0
  129. {camel_ai-0.2.62 → camel_ai-0.2.64}/camel/datagen/self_instruct/filter/instruction_filter.py +0 -0
  130. {camel_ai-0.2.62 → camel_ai-0.2.64}/camel/datagen/self_instruct/self_instruct.py +0 -0
  131. {camel_ai-0.2.62 → camel_ai-0.2.64}/camel/datagen/self_instruct/templates.py +0 -0
  132. {camel_ai-0.2.62 → camel_ai-0.2.64}/camel/datagen/source2synth/__init__.py +0 -0
  133. {camel_ai-0.2.62 → camel_ai-0.2.64}/camel/datagen/source2synth/data_processor.py +0 -0
  134. {camel_ai-0.2.62 → camel_ai-0.2.64}/camel/datagen/source2synth/models.py +0 -0
  135. {camel_ai-0.2.62 → camel_ai-0.2.64}/camel/datagen/source2synth/user_data_processor_config.py +0 -0
  136. {camel_ai-0.2.62 → camel_ai-0.2.64}/camel/datahubs/__init__.py +0 -0
  137. {camel_ai-0.2.62 → camel_ai-0.2.64}/camel/datahubs/base.py +0 -0
  138. {camel_ai-0.2.62 → camel_ai-0.2.64}/camel/datahubs/huggingface.py +0 -0
  139. {camel_ai-0.2.62 → camel_ai-0.2.64}/camel/datahubs/models.py +0 -0
  140. {camel_ai-0.2.62 → camel_ai-0.2.64}/camel/datasets/__init__.py +0 -0
  141. {camel_ai-0.2.62 → camel_ai-0.2.64}/camel/datasets/base_generator.py +0 -0
  142. {camel_ai-0.2.62 → camel_ai-0.2.64}/camel/datasets/few_shot_generator.py +0 -0
  143. {camel_ai-0.2.62 → camel_ai-0.2.64}/camel/datasets/models.py +0 -0
  144. {camel_ai-0.2.62 → camel_ai-0.2.64}/camel/datasets/self_instruct_generator.py +0 -0
  145. {camel_ai-0.2.62 → camel_ai-0.2.64}/camel/datasets/static_dataset.py +0 -0
  146. {camel_ai-0.2.62 → camel_ai-0.2.64}/camel/embeddings/__init__.py +0 -0
  147. {camel_ai-0.2.62 → camel_ai-0.2.64}/camel/embeddings/azure_embedding.py +0 -0
  148. {camel_ai-0.2.62 → camel_ai-0.2.64}/camel/embeddings/base.py +0 -0
  149. {camel_ai-0.2.62 → camel_ai-0.2.64}/camel/embeddings/gemini_embedding.py +0 -0
  150. {camel_ai-0.2.62 → camel_ai-0.2.64}/camel/embeddings/jina_embedding.py +0 -0
  151. {camel_ai-0.2.62 → camel_ai-0.2.64}/camel/embeddings/mistral_embedding.py +0 -0
  152. {camel_ai-0.2.62 → camel_ai-0.2.64}/camel/embeddings/openai_compatible_embedding.py +0 -0
  153. {camel_ai-0.2.62 → camel_ai-0.2.64}/camel/embeddings/openai_embedding.py +0 -0
  154. {camel_ai-0.2.62 → camel_ai-0.2.64}/camel/embeddings/sentence_transformers_embeddings.py +0 -0
  155. {camel_ai-0.2.62 → camel_ai-0.2.64}/camel/embeddings/together_embedding.py +0 -0
  156. {camel_ai-0.2.62 → camel_ai-0.2.64}/camel/embeddings/vlm_embedding.py +0 -0
  157. {camel_ai-0.2.62 → camel_ai-0.2.64}/camel/environments/__init__.py +0 -0
  158. {camel_ai-0.2.62 → camel_ai-0.2.64}/camel/environments/models.py +0 -0
  159. {camel_ai-0.2.62 → camel_ai-0.2.64}/camel/environments/multi_step.py +0 -0
  160. {camel_ai-0.2.62 → camel_ai-0.2.64}/camel/environments/single_step.py +0 -0
  161. {camel_ai-0.2.62 → camel_ai-0.2.64}/camel/environments/tic_tac_toe.py +0 -0
  162. {camel_ai-0.2.62 → camel_ai-0.2.64}/camel/extractors/__init__.py +0 -0
  163. {camel_ai-0.2.62 → camel_ai-0.2.64}/camel/extractors/base.py +0 -0
  164. {camel_ai-0.2.62 → camel_ai-0.2.64}/camel/extractors/python_strategies.py +0 -0
  165. {camel_ai-0.2.62 → camel_ai-0.2.64}/camel/generators.py +0 -0
  166. {camel_ai-0.2.62 → camel_ai-0.2.64}/camel/human.py +0 -0
  167. {camel_ai-0.2.62 → camel_ai-0.2.64}/camel/interpreters/__init__.py +0 -0
  168. {camel_ai-0.2.62 → camel_ai-0.2.64}/camel/interpreters/interpreter_error.py +0 -0
  169. {camel_ai-0.2.62 → camel_ai-0.2.64}/camel/loaders/__init__.py +0 -0
  170. {camel_ai-0.2.62 → camel_ai-0.2.64}/camel/loaders/apify_reader.py +0 -0
  171. {camel_ai-0.2.62 → camel_ai-0.2.64}/camel/loaders/base_io.py +0 -0
  172. {camel_ai-0.2.62 → camel_ai-0.2.64}/camel/loaders/chunkr_reader.py +0 -0
  173. {camel_ai-0.2.62 → camel_ai-0.2.64}/camel/loaders/crawl4ai_reader.py +0 -0
  174. {camel_ai-0.2.62 → camel_ai-0.2.64}/camel/loaders/firecrawl_reader.py +0 -0
  175. {camel_ai-0.2.62 → camel_ai-0.2.64}/camel/loaders/jina_url_reader.py +0 -0
  176. {camel_ai-0.2.62 → camel_ai-0.2.64}/camel/loaders/markitdown.py +0 -0
  177. {camel_ai-0.2.62 → camel_ai-0.2.64}/camel/loaders/mineru_extractor.py +0 -0
  178. {camel_ai-0.2.62 → camel_ai-0.2.64}/camel/loaders/mistral_reader.py +0 -0
  179. {camel_ai-0.2.62 → camel_ai-0.2.64}/camel/loaders/pandas_reader.py +0 -0
  180. {camel_ai-0.2.62 → camel_ai-0.2.64}/camel/loaders/scrapegraph_reader.py +0 -0
  181. {camel_ai-0.2.62 → camel_ai-0.2.64}/camel/loaders/unstructured_io.py +0 -0
  182. {camel_ai-0.2.62 → camel_ai-0.2.64}/camel/logger.py +0 -0
  183. {camel_ai-0.2.62 → camel_ai-0.2.64}/camel/memories/__init__.py +0 -0
  184. {camel_ai-0.2.62 → camel_ai-0.2.64}/camel/memories/agent_memories.py +0 -0
  185. {camel_ai-0.2.62 → camel_ai-0.2.64}/camel/memories/base.py +0 -0
  186. {camel_ai-0.2.62 → camel_ai-0.2.64}/camel/memories/blocks/__init__.py +0 -0
  187. {camel_ai-0.2.62 → camel_ai-0.2.64}/camel/memories/blocks/chat_history_block.py +0 -0
  188. {camel_ai-0.2.62 → camel_ai-0.2.64}/camel/memories/blocks/vectordb_block.py +0 -0
  189. {camel_ai-0.2.62 → camel_ai-0.2.64}/camel/memories/context_creators/__init__.py +0 -0
  190. {camel_ai-0.2.62 → camel_ai-0.2.64}/camel/memories/context_creators/score_based.py +0 -0
  191. {camel_ai-0.2.62 → camel_ai-0.2.64}/camel/messages/__init__.py +0 -0
  192. {camel_ai-0.2.62 → camel_ai-0.2.64}/camel/messages/base.py +0 -0
  193. {camel_ai-0.2.62 → camel_ai-0.2.64}/camel/messages/conversion/__init__.py +0 -0
  194. {camel_ai-0.2.62 → camel_ai-0.2.64}/camel/messages/conversion/alpaca.py +0 -0
  195. {camel_ai-0.2.62 → camel_ai-0.2.64}/camel/messages/conversion/conversation_models.py +0 -0
  196. {camel_ai-0.2.62 → camel_ai-0.2.64}/camel/messages/conversion/sharegpt/__init__.py +0 -0
  197. {camel_ai-0.2.62 → camel_ai-0.2.64}/camel/messages/conversion/sharegpt/function_call_formatter.py +0 -0
  198. {camel_ai-0.2.62 → camel_ai-0.2.64}/camel/messages/conversion/sharegpt/hermes/__init__.py +0 -0
  199. {camel_ai-0.2.62 → camel_ai-0.2.64}/camel/messages/conversion/sharegpt/hermes/hermes_function_formatter.py +0 -0
  200. {camel_ai-0.2.62 → camel_ai-0.2.64}/camel/messages/func_message.py +0 -0
  201. {camel_ai-0.2.62 → camel_ai-0.2.64}/camel/models/_utils.py +0 -0
  202. {camel_ai-0.2.62 → camel_ai-0.2.64}/camel/models/aiml_model.py +0 -0
  203. {camel_ai-0.2.62 → camel_ai-0.2.64}/camel/models/anthropic_model.py +0 -0
  204. {camel_ai-0.2.62 → camel_ai-0.2.64}/camel/models/aws_bedrock_model.py +0 -0
  205. {camel_ai-0.2.62 → camel_ai-0.2.64}/camel/models/base_audio_model.py +0 -0
  206. {camel_ai-0.2.62 → camel_ai-0.2.64}/camel/models/base_model.py +0 -0
  207. {camel_ai-0.2.62 → camel_ai-0.2.64}/camel/models/fish_audio_model.py +0 -0
  208. {camel_ai-0.2.62 → camel_ai-0.2.64}/camel/models/groq_model.py +0 -0
  209. {camel_ai-0.2.62 → camel_ai-0.2.64}/camel/models/internlm_model.py +0 -0
  210. {camel_ai-0.2.62 → camel_ai-0.2.64}/camel/models/lmstudio_model.py +0 -0
  211. {camel_ai-0.2.62 → camel_ai-0.2.64}/camel/models/model_manager.py +0 -0
  212. {camel_ai-0.2.62 → camel_ai-0.2.64}/camel/models/modelscope_model.py +0 -0
  213. {camel_ai-0.2.62 → camel_ai-0.2.64}/camel/models/moonshot_model.py +0 -0
  214. {camel_ai-0.2.62 → camel_ai-0.2.64}/camel/models/nemotron_model.py +0 -0
  215. {camel_ai-0.2.62 → camel_ai-0.2.64}/camel/models/netmind_model.py +0 -0
  216. {camel_ai-0.2.62 → camel_ai-0.2.64}/camel/models/novita_model.py +0 -0
  217. {camel_ai-0.2.62 → camel_ai-0.2.64}/camel/models/nvidia_model.py +0 -0
  218. {camel_ai-0.2.62 → camel_ai-0.2.64}/camel/models/ollama_model.py +0 -0
  219. {camel_ai-0.2.62 → camel_ai-0.2.64}/camel/models/openai_audio_models.py +0 -0
  220. {camel_ai-0.2.62 → camel_ai-0.2.64}/camel/models/openrouter_model.py +0 -0
  221. {camel_ai-0.2.62 → camel_ai-0.2.64}/camel/models/ppio_model.py +0 -0
  222. {camel_ai-0.2.62 → camel_ai-0.2.64}/camel/models/qwen_model.py +0 -0
  223. {camel_ai-0.2.62 → camel_ai-0.2.64}/camel/models/reward/__init__.py +0 -0
  224. {camel_ai-0.2.62 → camel_ai-0.2.64}/camel/models/reward/base_reward_model.py +0 -0
  225. {camel_ai-0.2.62 → camel_ai-0.2.64}/camel/models/reward/evaluator.py +0 -0
  226. {camel_ai-0.2.62 → camel_ai-0.2.64}/camel/models/reward/nemotron_model.py +0 -0
  227. {camel_ai-0.2.62 → camel_ai-0.2.64}/camel/models/reward/skywork_model.py +0 -0
  228. {camel_ai-0.2.62 → camel_ai-0.2.64}/camel/models/siliconflow_model.py +0 -0
  229. {camel_ai-0.2.62 → camel_ai-0.2.64}/camel/models/stub_model.py +0 -0
  230. {camel_ai-0.2.62 → camel_ai-0.2.64}/camel/models/togetherai_model.py +0 -0
  231. {camel_ai-0.2.62 → camel_ai-0.2.64}/camel/models/vllm_model.py +0 -0
  232. {camel_ai-0.2.62 → camel_ai-0.2.64}/camel/models/volcano_model.py +0 -0
  233. {camel_ai-0.2.62 → camel_ai-0.2.64}/camel/models/yi_model.py +0 -0
  234. {camel_ai-0.2.62 → camel_ai-0.2.64}/camel/models/zhipuai_model.py +0 -0
  235. {camel_ai-0.2.62 → camel_ai-0.2.64}/camel/personas/__init__.py +0 -0
  236. {camel_ai-0.2.62 → camel_ai-0.2.64}/camel/personas/persona.py +0 -0
  237. {camel_ai-0.2.62 → camel_ai-0.2.64}/camel/personas/persona_hub.py +0 -0
  238. {camel_ai-0.2.62 → camel_ai-0.2.64}/camel/prompts/__init__.py +0 -0
  239. {camel_ai-0.2.62 → camel_ai-0.2.64}/camel/prompts/ai_society.py +0 -0
  240. {camel_ai-0.2.62 → camel_ai-0.2.64}/camel/prompts/base.py +0 -0
  241. {camel_ai-0.2.62 → camel_ai-0.2.64}/camel/prompts/code.py +0 -0
  242. {camel_ai-0.2.62 → camel_ai-0.2.64}/camel/prompts/evaluation.py +0 -0
  243. {camel_ai-0.2.62 → camel_ai-0.2.64}/camel/prompts/generate_text_embedding_data.py +0 -0
  244. {camel_ai-0.2.62 → camel_ai-0.2.64}/camel/prompts/image_craft.py +0 -0
  245. {camel_ai-0.2.62 → camel_ai-0.2.64}/camel/prompts/misalignment.py +0 -0
  246. {camel_ai-0.2.62 → camel_ai-0.2.64}/camel/prompts/multi_condition_image_craft.py +0 -0
  247. {camel_ai-0.2.62 → camel_ai-0.2.64}/camel/prompts/object_recognition.py +0 -0
  248. {camel_ai-0.2.62 → camel_ai-0.2.64}/camel/prompts/persona_hub.py +0 -0
  249. {camel_ai-0.2.62 → camel_ai-0.2.64}/camel/prompts/prompt_templates.py +0 -0
  250. {camel_ai-0.2.62 → camel_ai-0.2.64}/camel/prompts/role_description_prompt_template.py +0 -0
  251. {camel_ai-0.2.62 → camel_ai-0.2.64}/camel/prompts/solution_extraction.py +0 -0
  252. {camel_ai-0.2.62 → camel_ai-0.2.64}/camel/prompts/task_prompt_template.py +0 -0
  253. {camel_ai-0.2.62 → camel_ai-0.2.64}/camel/prompts/translation.py +0 -0
  254. {camel_ai-0.2.62 → camel_ai-0.2.64}/camel/prompts/video_description_prompt.py +0 -0
  255. {camel_ai-0.2.62 → camel_ai-0.2.64}/camel/py.typed +0 -0
  256. {camel_ai-0.2.62 → camel_ai-0.2.64}/camel/responses/__init__.py +0 -0
  257. {camel_ai-0.2.62 → camel_ai-0.2.64}/camel/responses/agent_responses.py +0 -0
  258. {camel_ai-0.2.62 → camel_ai-0.2.64}/camel/retrievers/__init__.py +0 -0
  259. {camel_ai-0.2.62 → camel_ai-0.2.64}/camel/retrievers/auto_retriever.py +0 -0
  260. {camel_ai-0.2.62 → camel_ai-0.2.64}/camel/retrievers/base.py +0 -0
  261. {camel_ai-0.2.62 → camel_ai-0.2.64}/camel/retrievers/bm25_retriever.py +0 -0
  262. {camel_ai-0.2.62 → camel_ai-0.2.64}/camel/retrievers/cohere_rerank_retriever.py +0 -0
  263. {camel_ai-0.2.62 → camel_ai-0.2.64}/camel/retrievers/hybrid_retrival.py +0 -0
  264. {camel_ai-0.2.62 → camel_ai-0.2.64}/camel/retrievers/vector_retriever.py +0 -0
  265. {camel_ai-0.2.62 → camel_ai-0.2.64}/camel/runtimes/__init__.py +0 -0
  266. {camel_ai-0.2.62 → camel_ai-0.2.64}/camel/runtimes/api.py +0 -0
  267. {camel_ai-0.2.62 → camel_ai-0.2.64}/camel/runtimes/base.py +0 -0
  268. {camel_ai-0.2.62 → camel_ai-0.2.64}/camel/runtimes/configs.py +0 -0
  269. {camel_ai-0.2.62 → camel_ai-0.2.64}/camel/runtimes/daytona_runtime.py +0 -0
  270. {camel_ai-0.2.62 → camel_ai-0.2.64}/camel/runtimes/docker_runtime.py +0 -0
  271. {camel_ai-0.2.62 → camel_ai-0.2.64}/camel/runtimes/llm_guard_runtime.py +0 -0
  272. {camel_ai-0.2.62 → camel_ai-0.2.64}/camel/runtimes/remote_http_runtime.py +0 -0
  273. {camel_ai-0.2.62 → camel_ai-0.2.64}/camel/runtimes/ubuntu_docker_runtime.py +0 -0
  274. {camel_ai-0.2.62 → camel_ai-0.2.64}/camel/runtimes/utils/__init__.py +0 -0
  275. {camel_ai-0.2.62 → camel_ai-0.2.64}/camel/runtimes/utils/function_risk_toolkit.py +0 -0
  276. {camel_ai-0.2.62 → camel_ai-0.2.64}/camel/runtimes/utils/ignore_risk_toolkit.py +0 -0
  277. {camel_ai-0.2.62 → camel_ai-0.2.64}/camel/schemas/__init__.py +0 -0
  278. {camel_ai-0.2.62 → camel_ai-0.2.64}/camel/schemas/base.py +0 -0
  279. {camel_ai-0.2.62 → camel_ai-0.2.64}/camel/schemas/openai_converter.py +0 -0
  280. {camel_ai-0.2.62 → camel_ai-0.2.64}/camel/schemas/outlines_converter.py +0 -0
  281. {camel_ai-0.2.62 → camel_ai-0.2.64}/camel/societies/__init__.py +0 -0
  282. {camel_ai-0.2.62 → camel_ai-0.2.64}/camel/societies/babyagi_playing.py +0 -0
  283. {camel_ai-0.2.62 → camel_ai-0.2.64}/camel/societies/role_playing.py +0 -0
  284. {camel_ai-0.2.62 → camel_ai-0.2.64}/camel/societies/workforce/__init__.py +0 -0
  285. {camel_ai-0.2.62 → camel_ai-0.2.64}/camel/societies/workforce/base.py +0 -0
  286. {camel_ai-0.2.62 → camel_ai-0.2.64}/camel/societies/workforce/prompts.py +0 -0
  287. {camel_ai-0.2.62 → camel_ai-0.2.64}/camel/societies/workforce/task_channel.py +0 -0
  288. {camel_ai-0.2.62 → camel_ai-0.2.64}/camel/societies/workforce/utils.py +0 -0
  289. {camel_ai-0.2.62 → camel_ai-0.2.64}/camel/societies/workforce/worker.py +0 -0
  290. {camel_ai-0.2.62 → camel_ai-0.2.64}/camel/storages/graph_storages/__init__.py +0 -0
  291. {camel_ai-0.2.62 → camel_ai-0.2.64}/camel/storages/graph_storages/base.py +0 -0
  292. {camel_ai-0.2.62 → camel_ai-0.2.64}/camel/storages/graph_storages/graph_element.py +0 -0
  293. {camel_ai-0.2.62 → camel_ai-0.2.64}/camel/storages/graph_storages/nebula_graph.py +0 -0
  294. {camel_ai-0.2.62 → camel_ai-0.2.64}/camel/storages/graph_storages/neo4j_graph.py +0 -0
  295. {camel_ai-0.2.62 → camel_ai-0.2.64}/camel/storages/key_value_storages/__init__.py +0 -0
  296. {camel_ai-0.2.62 → camel_ai-0.2.64}/camel/storages/key_value_storages/base.py +0 -0
  297. {camel_ai-0.2.62 → camel_ai-0.2.64}/camel/storages/key_value_storages/in_memory.py +0 -0
  298. {camel_ai-0.2.62 → camel_ai-0.2.64}/camel/storages/key_value_storages/json.py +0 -0
  299. {camel_ai-0.2.62 → camel_ai-0.2.64}/camel/storages/key_value_storages/mem0_cloud.py +0 -0
  300. {camel_ai-0.2.62 → camel_ai-0.2.64}/camel/storages/key_value_storages/redis.py +0 -0
  301. {camel_ai-0.2.62 → camel_ai-0.2.64}/camel/storages/object_storages/__init__.py +0 -0
  302. {camel_ai-0.2.62 → camel_ai-0.2.64}/camel/storages/object_storages/amazon_s3.py +0 -0
  303. {camel_ai-0.2.62 → camel_ai-0.2.64}/camel/storages/object_storages/azure_blob.py +0 -0
  304. {camel_ai-0.2.62 → camel_ai-0.2.64}/camel/storages/object_storages/base.py +0 -0
  305. {camel_ai-0.2.62 → camel_ai-0.2.64}/camel/storages/object_storages/google_cloud.py +0 -0
  306. {camel_ai-0.2.62 → camel_ai-0.2.64}/camel/storages/vectordb_storages/base.py +0 -0
  307. {camel_ai-0.2.62 → camel_ai-0.2.64}/camel/storages/vectordb_storages/faiss.py +0 -0
  308. {camel_ai-0.2.62 → camel_ai-0.2.64}/camel/storages/vectordb_storages/milvus.py +0 -0
  309. {camel_ai-0.2.62 → camel_ai-0.2.64}/camel/storages/vectordb_storages/oceanbase.py +0 -0
  310. {camel_ai-0.2.62 → camel_ai-0.2.64}/camel/storages/vectordb_storages/qdrant.py +0 -0
  311. {camel_ai-0.2.62 → camel_ai-0.2.64}/camel/storages/vectordb_storages/tidb.py +0 -0
  312. {camel_ai-0.2.62 → camel_ai-0.2.64}/camel/tasks/__init__.py +0 -0
  313. {camel_ai-0.2.62 → camel_ai-0.2.64}/camel/tasks/task_prompt.py +0 -0
  314. {camel_ai-0.2.62 → camel_ai-0.2.64}/camel/terminators/__init__.py +0 -0
  315. {camel_ai-0.2.62 → camel_ai-0.2.64}/camel/terminators/base.py +0 -0
  316. {camel_ai-0.2.62 → camel_ai-0.2.64}/camel/terminators/response_terminator.py +0 -0
  317. {camel_ai-0.2.62 → camel_ai-0.2.64}/camel/terminators/token_limit_terminator.py +0 -0
  318. {camel_ai-0.2.62 → camel_ai-0.2.64}/camel/toolkits/__init__.py +0 -0
  319. {camel_ai-0.2.62 → camel_ai-0.2.64}/camel/toolkits/aci_toolkit.py +0 -0
  320. {camel_ai-0.2.62 → camel_ai-0.2.64}/camel/toolkits/arxiv_toolkit.py +0 -0
  321. {camel_ai-0.2.62 → camel_ai-0.2.64}/camel/toolkits/ask_news_toolkit.py +0 -0
  322. {camel_ai-0.2.62 → camel_ai-0.2.64}/camel/toolkits/async_browser_toolkit.py +0 -0
  323. {camel_ai-0.2.62 → camel_ai-0.2.64}/camel/toolkits/audio_analysis_toolkit.py +0 -0
  324. {camel_ai-0.2.62 → camel_ai-0.2.64}/camel/toolkits/base.py +0 -0
  325. {camel_ai-0.2.62 → camel_ai-0.2.64}/camel/toolkits/bohrium_toolkit.py +0 -0
  326. {camel_ai-0.2.62 → camel_ai-0.2.64}/camel/toolkits/browser_toolkit.py +0 -0
  327. {camel_ai-0.2.62 → camel_ai-0.2.64}/camel/toolkits/browser_toolkit_commons.py +0 -0
  328. {camel_ai-0.2.62 → camel_ai-0.2.64}/camel/toolkits/dalle_toolkit.py +0 -0
  329. {camel_ai-0.2.62 → camel_ai-0.2.64}/camel/toolkits/dappier_toolkit.py +0 -0
  330. {camel_ai-0.2.62 → camel_ai-0.2.64}/camel/toolkits/data_commons_toolkit.py +0 -0
  331. {camel_ai-0.2.62 → camel_ai-0.2.64}/camel/toolkits/excel_toolkit.py +0 -0
  332. {camel_ai-0.2.62 → camel_ai-0.2.64}/camel/toolkits/file_write_toolkit.py +0 -0
  333. {camel_ai-0.2.62 → camel_ai-0.2.64}/camel/toolkits/function_tool.py +0 -0
  334. {camel_ai-0.2.62 → camel_ai-0.2.64}/camel/toolkits/github_toolkit.py +0 -0
  335. {camel_ai-0.2.62 → camel_ai-0.2.64}/camel/toolkits/google_calendar_toolkit.py +0 -0
  336. {camel_ai-0.2.62 → camel_ai-0.2.64}/camel/toolkits/google_maps_toolkit.py +0 -0
  337. {camel_ai-0.2.62 → camel_ai-0.2.64}/camel/toolkits/google_scholar_toolkit.py +0 -0
  338. {camel_ai-0.2.62 → camel_ai-0.2.64}/camel/toolkits/human_toolkit.py +0 -0
  339. {camel_ai-0.2.62 → camel_ai-0.2.64}/camel/toolkits/image_analysis_toolkit.py +0 -0
  340. {camel_ai-0.2.62 → camel_ai-0.2.64}/camel/toolkits/jina_reranker_toolkit.py +0 -0
  341. {camel_ai-0.2.62 → camel_ai-0.2.64}/camel/toolkits/klavis_toolkit.py +0 -0
  342. {camel_ai-0.2.62 → camel_ai-0.2.64}/camel/toolkits/linkedin_toolkit.py +0 -0
  343. {camel_ai-0.2.62 → camel_ai-0.2.64}/camel/toolkits/math_toolkit.py +0 -0
  344. {camel_ai-0.2.62 → camel_ai-0.2.64}/camel/toolkits/memory_toolkit.py +0 -0
  345. {camel_ai-0.2.62 → camel_ai-0.2.64}/camel/toolkits/meshy_toolkit.py +0 -0
  346. {camel_ai-0.2.62 → camel_ai-0.2.64}/camel/toolkits/mineru_toolkit.py +0 -0
  347. {camel_ai-0.2.62 → camel_ai-0.2.64}/camel/toolkits/networkx_toolkit.py +0 -0
  348. {camel_ai-0.2.62 → camel_ai-0.2.64}/camel/toolkits/notion_toolkit.py +0 -0
  349. {camel_ai-0.2.62 → camel_ai-0.2.64}/camel/toolkits/open_api_specs/biztoc/__init__.py +0 -0
  350. {camel_ai-0.2.62 → camel_ai-0.2.64}/camel/toolkits/open_api_specs/biztoc/ai-plugin.json +0 -0
  351. {camel_ai-0.2.62 → camel_ai-0.2.64}/camel/toolkits/open_api_specs/biztoc/openapi.yaml +0 -0
  352. {camel_ai-0.2.62 → camel_ai-0.2.64}/camel/toolkits/open_api_specs/coursera/__init__.py +0 -0
  353. {camel_ai-0.2.62 → camel_ai-0.2.64}/camel/toolkits/open_api_specs/coursera/openapi.yaml +0 -0
  354. {camel_ai-0.2.62 → camel_ai-0.2.64}/camel/toolkits/open_api_specs/create_qr_code/__init__.py +0 -0
  355. {camel_ai-0.2.62 → camel_ai-0.2.64}/camel/toolkits/open_api_specs/create_qr_code/openapi.yaml +0 -0
  356. {camel_ai-0.2.62 → camel_ai-0.2.64}/camel/toolkits/open_api_specs/klarna/__init__.py +0 -0
  357. {camel_ai-0.2.62 → camel_ai-0.2.64}/camel/toolkits/open_api_specs/klarna/openapi.yaml +0 -0
  358. {camel_ai-0.2.62 → camel_ai-0.2.64}/camel/toolkits/open_api_specs/nasa_apod/__init__.py +0 -0
  359. {camel_ai-0.2.62 → camel_ai-0.2.64}/camel/toolkits/open_api_specs/nasa_apod/openapi.yaml +0 -0
  360. {camel_ai-0.2.62 → camel_ai-0.2.64}/camel/toolkits/open_api_specs/outschool/__init__.py +0 -0
  361. {camel_ai-0.2.62 → camel_ai-0.2.64}/camel/toolkits/open_api_specs/outschool/ai-plugin.json +0 -0
  362. {camel_ai-0.2.62 → camel_ai-0.2.64}/camel/toolkits/open_api_specs/outschool/openapi.yaml +0 -0
  363. {camel_ai-0.2.62 → camel_ai-0.2.64}/camel/toolkits/open_api_specs/outschool/paths/__init__.py +0 -0
  364. {camel_ai-0.2.62 → camel_ai-0.2.64}/camel/toolkits/open_api_specs/outschool/paths/get_classes.py +0 -0
  365. {camel_ai-0.2.62 → camel_ai-0.2.64}/camel/toolkits/open_api_specs/outschool/paths/search_teachers.py +0 -0
  366. {camel_ai-0.2.62 → camel_ai-0.2.64}/camel/toolkits/open_api_specs/security_config.py +0 -0
  367. {camel_ai-0.2.62 → camel_ai-0.2.64}/camel/toolkits/open_api_specs/speak/__init__.py +0 -0
  368. {camel_ai-0.2.62 → camel_ai-0.2.64}/camel/toolkits/open_api_specs/speak/openapi.yaml +0 -0
  369. {camel_ai-0.2.62 → camel_ai-0.2.64}/camel/toolkits/open_api_specs/web_scraper/__init__.py +0 -0
  370. {camel_ai-0.2.62 → camel_ai-0.2.64}/camel/toolkits/open_api_specs/web_scraper/ai-plugin.json +0 -0
  371. {camel_ai-0.2.62 → camel_ai-0.2.64}/camel/toolkits/open_api_specs/web_scraper/openapi.yaml +0 -0
  372. {camel_ai-0.2.62 → camel_ai-0.2.64}/camel/toolkits/open_api_specs/web_scraper/paths/__init__.py +0 -0
  373. {camel_ai-0.2.62 → camel_ai-0.2.64}/camel/toolkits/open_api_specs/web_scraper/paths/scraper.py +0 -0
  374. {camel_ai-0.2.62 → camel_ai-0.2.64}/camel/toolkits/open_api_toolkit.py +0 -0
  375. {camel_ai-0.2.62 → camel_ai-0.2.64}/camel/toolkits/openai_agent_toolkit.py +0 -0
  376. {camel_ai-0.2.62 → camel_ai-0.2.64}/camel/toolkits/openbb_toolkit.py +0 -0
  377. {camel_ai-0.2.62 → camel_ai-0.2.64}/camel/toolkits/page_script.js +0 -0
  378. {camel_ai-0.2.62 → camel_ai-0.2.64}/camel/toolkits/playwright_mcp_toolkit.py +0 -0
  379. {camel_ai-0.2.62 → camel_ai-0.2.64}/camel/toolkits/pptx_toolkit.py +0 -0
  380. {camel_ai-0.2.62 → camel_ai-0.2.64}/camel/toolkits/pubmed_toolkit.py +0 -0
  381. {camel_ai-0.2.62 → camel_ai-0.2.64}/camel/toolkits/pulse_mcp_search_toolkit.py +0 -0
  382. {camel_ai-0.2.62 → camel_ai-0.2.64}/camel/toolkits/pyautogui_toolkit.py +0 -0
  383. {camel_ai-0.2.62 → camel_ai-0.2.64}/camel/toolkits/reddit_toolkit.py +0 -0
  384. {camel_ai-0.2.62 → camel_ai-0.2.64}/camel/toolkits/retrieval_toolkit.py +0 -0
  385. {camel_ai-0.2.62 → camel_ai-0.2.64}/camel/toolkits/search_toolkit.py +0 -0
  386. {camel_ai-0.2.62 → camel_ai-0.2.64}/camel/toolkits/searxng_toolkit.py +0 -0
  387. {camel_ai-0.2.62 → camel_ai-0.2.64}/camel/toolkits/semantic_scholar_toolkit.py +0 -0
  388. {camel_ai-0.2.62 → camel_ai-0.2.64}/camel/toolkits/slack_toolkit.py +0 -0
  389. {camel_ai-0.2.62 → camel_ai-0.2.64}/camel/toolkits/stripe_toolkit.py +0 -0
  390. {camel_ai-0.2.62 → camel_ai-0.2.64}/camel/toolkits/sympy_toolkit.py +0 -0
  391. {camel_ai-0.2.62 → camel_ai-0.2.64}/camel/toolkits/terminal_toolkit.py +0 -0
  392. {camel_ai-0.2.62 → camel_ai-0.2.64}/camel/toolkits/thinking_toolkit.py +0 -0
  393. {camel_ai-0.2.62 → camel_ai-0.2.64}/camel/toolkits/twitter_toolkit.py +0 -0
  394. {camel_ai-0.2.62 → camel_ai-0.2.64}/camel/toolkits/video_analysis_toolkit.py +0 -0
  395. {camel_ai-0.2.62 → camel_ai-0.2.64}/camel/toolkits/video_download_toolkit.py +0 -0
  396. {camel_ai-0.2.62 → camel_ai-0.2.64}/camel/toolkits/weather_toolkit.py +0 -0
  397. {camel_ai-0.2.62 → camel_ai-0.2.64}/camel/toolkits/whatsapp_toolkit.py +0 -0
  398. {camel_ai-0.2.62 → camel_ai-0.2.64}/camel/toolkits/wolfram_alpha_toolkit.py +0 -0
  399. {camel_ai-0.2.62 → camel_ai-0.2.64}/camel/toolkits/zapier_toolkit.py +0 -0
  400. {camel_ai-0.2.62 → camel_ai-0.2.64}/camel/types/__init__.py +0 -0
  401. {camel_ai-0.2.62 → camel_ai-0.2.64}/camel/types/agents/__init__.py +0 -0
  402. {camel_ai-0.2.62 → camel_ai-0.2.64}/camel/types/agents/tool_calling_record.py +0 -0
  403. {camel_ai-0.2.62 → camel_ai-0.2.64}/camel/types/mcp_registries.py +0 -0
  404. {camel_ai-0.2.62 → camel_ai-0.2.64}/camel/types/openai_types.py +0 -0
  405. {camel_ai-0.2.62 → camel_ai-0.2.64}/camel/utils/async_func.py +0 -0
  406. {camel_ai-0.2.62 → camel_ai-0.2.64}/camel/utils/chunker/__init__.py +0 -0
  407. {camel_ai-0.2.62 → camel_ai-0.2.64}/camel/utils/chunker/base.py +0 -0
  408. {camel_ai-0.2.62 → camel_ai-0.2.64}/camel/utils/chunker/code_chunker.py +0 -0
  409. {camel_ai-0.2.62 → camel_ai-0.2.64}/camel/utils/chunker/uio_chunker.py +0 -0
  410. {camel_ai-0.2.62 → camel_ai-0.2.64}/camel/utils/commons.py +0 -0
  411. {camel_ai-0.2.62 → camel_ai-0.2.64}/camel/utils/constants.py +0 -0
  412. {camel_ai-0.2.62 → camel_ai-0.2.64}/camel/utils/deduplication.py +0 -0
  413. {camel_ai-0.2.62 → camel_ai-0.2.64}/camel/utils/filename.py +0 -0
  414. {camel_ai-0.2.62 → camel_ai-0.2.64}/camel/utils/mcp.py +0 -0
  415. {camel_ai-0.2.62 → camel_ai-0.2.64}/camel/utils/response_format.py +0 -0
  416. {camel_ai-0.2.62 → camel_ai-0.2.64}/camel/utils/token_counting.py +0 -0
  417. {camel_ai-0.2.62 → camel_ai-0.2.64}/camel/verifiers/__init__.py +0 -0
  418. {camel_ai-0.2.62 → camel_ai-0.2.64}/camel/verifiers/base.py +0 -0
  419. {camel_ai-0.2.62 → camel_ai-0.2.64}/camel/verifiers/math_verifier.py +0 -0
  420. {camel_ai-0.2.62 → camel_ai-0.2.64}/camel/verifiers/models.py +0 -0
  421. {camel_ai-0.2.62 → camel_ai-0.2.64}/camel/verifiers/physics_verifier.py +0 -0
  422. {camel_ai-0.2.62 → camel_ai-0.2.64}/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.62
3
+ Version: 0.2.64
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
@@ -66,6 +66,7 @@ Requires-Dist: ibm-watsonx-ai>=1.3.11; extra == 'all'
66
66
  Requires-Dist: imageio[pyav]<3,>=2.34.2; extra == 'all'
67
67
  Requires-Dist: ipykernel<7,>=6.0.0; extra == 'all'
68
68
  Requires-Dist: jupyter-client<9,>=8.6.2; extra == 'all'
69
+ Requires-Dist: langfuse>=2.60.5; extra == 'all'
69
70
  Requires-Dist: linkup-sdk<0.3,>=0.2.1; extra == 'all'
70
71
  Requires-Dist: litellm<2,>=1.38.1; extra == 'all'
71
72
  Requires-Dist: markitdown==0.1.1; extra == 'all'
@@ -136,6 +137,7 @@ Requires-Dist: types-requests<3,>=2.31.0; extra == 'all'
136
137
  Requires-Dist: types-setuptools<70,>=69.2.0; extra == 'all'
137
138
  Requires-Dist: types-tqdm<5,>=4.66.0; extra == 'all'
138
139
  Requires-Dist: unstructured==0.16.20; extra == 'all'
140
+ Requires-Dist: weaviate-client>=4.15.0; extra == 'all'
139
141
  Requires-Dist: wikipedia<2,>=1; extra == 'all'
140
142
  Requires-Dist: wolframalpha<6,>=5.0.0; extra == 'all'
141
143
  Requires-Dist: xls2xlsx>=0.2.0; extra == 'all'
@@ -184,6 +186,7 @@ Requires-Dist: docker<8,>=7.1.0; extra == 'dev-tools'
184
186
  Requires-Dist: e2b-code-interpreter<2,>=1.0.3; extra == 'dev-tools'
185
187
  Requires-Dist: ipykernel<7,>=6.0.0; extra == 'dev-tools'
186
188
  Requires-Dist: jupyter-client<9,>=8.6.2; extra == 'dev-tools'
189
+ Requires-Dist: langfuse>=2.60.5; extra == 'dev-tools'
187
190
  Requires-Dist: mcp>=1.3.0; extra == 'dev-tools'
188
191
  Requires-Dist: tree-sitter-python<0.24,>=0.23.6; extra == 'dev-tools'
189
192
  Requires-Dist: tree-sitter<0.24,>=0.23.2; extra == 'dev-tools'
@@ -303,6 +306,7 @@ Requires-Dist: qdrant-client<2,>=1.9.0; extra == 'rag'
303
306
  Requires-Dist: rank-bm25<0.3,>=0.2.2; extra == 'rag'
304
307
  Requires-Dist: sentence-transformers<4,>=3.0.1; extra == 'rag'
305
308
  Requires-Dist: unstructured==0.16.20; extra == 'rag'
309
+ Requires-Dist: weaviate-client>=4.15.0; extra == 'rag'
306
310
  Provides-Extra: research-tools
307
311
  Requires-Dist: arxiv2text<0.2,>=0.1.14; extra == 'research-tools'
308
312
  Requires-Dist: arxiv<3,>=2.1.3; extra == 'research-tools'
@@ -320,6 +324,7 @@ Requires-Dist: pyobvector>=0.1.18; extra == 'storage'
320
324
  Requires-Dist: pytidb-experimental==0.0.1.dev4; extra == 'storage'
321
325
  Requires-Dist: qdrant-client<2,>=1.9.0; extra == 'storage'
322
326
  Requires-Dist: redis<6,>=5.0.6; extra == 'storage'
327
+ Requires-Dist: weaviate-client>=4.15.0; extra == 'storage'
323
328
  Provides-Extra: test
324
329
  Requires-Dist: mock<6,>=5; extra == 'test'
325
330
  Requires-Dist: pytest-asyncio<0.24,>=0.23.0; extra == 'test'
@@ -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.62'
17
+ __version__ = '0.2.64'
18
18
 
19
19
  __all__ = [
20
20
  '__version__',
@@ -19,7 +19,6 @@ import textwrap
19
19
  import threading
20
20
  import uuid
21
21
  from collections import defaultdict
22
- from datetime import datetime
23
22
  from pathlib import Path
24
23
  from typing import (
25
24
  TYPE_CHECKING,
@@ -79,6 +78,7 @@ from camel.utils import (
79
78
  get_model_encoding,
80
79
  model_from_json_schema,
81
80
  )
81
+ from camel.utils.commons import dependencies_required
82
82
 
83
83
  if TYPE_CHECKING:
84
84
  from camel.terminators import ResponseTerminator
@@ -96,6 +96,15 @@ try:
96
96
  except (ImportError, AttributeError):
97
97
  from camel.utils import track_agent
98
98
 
99
+ # Langfuse decorator setting
100
+ if os.environ.get("LANGFUSE_ENABLED", "False").lower() == "true":
101
+ try:
102
+ from langfuse.decorators import observe
103
+ except ImportError:
104
+ from camel.utils import observe
105
+ else:
106
+ from camel.utils import observe
107
+
99
108
 
100
109
  SIMPLE_FORMAT_PROMPT = TextPrompt(
101
110
  textwrap.dedent(
@@ -204,7 +213,7 @@ class ChatAgent(BaseAgent):
204
213
  self.model_type = self.model_backend.model_type
205
214
 
206
215
  # Assign unique ID
207
- self.agent_id = agent_id if agent_id else str(uuid.uuid4())[:6]
216
+ self.agent_id = agent_id if agent_id else str(uuid.uuid4())
208
217
 
209
218
  # Set up memory
210
219
  context_creator = ScoreBasedContextCreator(
@@ -509,7 +518,7 @@ class ChatAgent(BaseAgent):
509
518
  memory record. If None, current timestamp will be used.
510
519
  (default: :obj:`None`)
511
520
  """
512
- from datetime import timezone
521
+ import time
513
522
 
514
523
  self.memory.write_record(
515
524
  MemoryRecord(
@@ -517,7 +526,7 @@ class ChatAgent(BaseAgent):
517
526
  role_at_backend=role,
518
527
  timestamp=timestamp
519
528
  if timestamp is not None
520
- else datetime.now(timezone.utc).timestamp(),
529
+ else time.time_ns() / 1_000_000_000, # Nanosecond precision
521
530
  agent_id=self.agent_id,
522
531
  )
523
532
  )
@@ -731,6 +740,7 @@ class ChatAgent(BaseAgent):
731
740
  message.content = response.output_messages[0].content
732
741
  self._try_format_message(message, response_format)
733
742
 
743
+ @observe()
734
744
  def step(
735
745
  self,
736
746
  input_message: Union[BaseMessage, str],
@@ -753,6 +763,14 @@ class ChatAgent(BaseAgent):
753
763
  flag, and session information.
754
764
  """
755
765
 
766
+ # Set Langfuse session_id using agent_id for trace grouping
767
+ try:
768
+ from camel.utils.langfuse import set_current_agent_session_id
769
+
770
+ set_current_agent_session_id(self.agent_id)
771
+ except ImportError:
772
+ pass # Langfuse not available
773
+
756
774
  # Convert input message to BaseMessage if necessary
757
775
  if isinstance(input_message, str):
758
776
  input_message = BaseMessage.make_user_message(
@@ -847,6 +865,7 @@ class ChatAgent(BaseAgent):
847
865
  openai_messages, _ = self.memory.get_context()
848
866
  return openai_messages
849
867
 
868
+ @observe()
850
869
  async def astep(
851
870
  self,
852
871
  input_message: Union[BaseMessage, str],
@@ -873,6 +892,13 @@ class ChatAgent(BaseAgent):
873
892
  a boolean indicating whether the chat session has terminated,
874
893
  and information about the chat session.
875
894
  """
895
+ try:
896
+ from camel.utils.langfuse import set_current_agent_session_id
897
+
898
+ set_current_agent_session_id(self.agent_id)
899
+ except ImportError:
900
+ pass # Langfuse not available
901
+
876
902
  if isinstance(input_message, str):
877
903
  input_message = BaseMessage.make_user_message(
878
904
  role_name="User", content=input_message
@@ -1331,6 +1357,13 @@ class ChatAgent(BaseAgent):
1331
1357
  """
1332
1358
  output_messages: List[BaseMessage] = []
1333
1359
  for choice in response.choices:
1360
+ # Skip messages with no meaningful content
1361
+ if (
1362
+ choice.message.content is None
1363
+ or choice.message.content.strip() == ""
1364
+ ) and not choice.message.tool_calls:
1365
+ continue
1366
+
1334
1367
  meta_dict = {}
1335
1368
  if logprobs_info := handle_logprobs(choice):
1336
1369
  meta_dict["logprobs_info"] = logprobs_info
@@ -1560,8 +1593,32 @@ class ChatAgent(BaseAgent):
1560
1593
  args = tool_call_request.args
1561
1594
  tool_call_id = tool_call_request.tool_call_id
1562
1595
  tool = self._internal_tools[func_name]
1596
+ import asyncio
1597
+
1563
1598
  try:
1564
- result = await tool.async_call(**args)
1599
+ # Try different invocation paths in order of preference
1600
+ if hasattr(tool, 'func') and hasattr(tool.func, 'async_call'):
1601
+ # Case: FunctionTool wrapping an MCP tool
1602
+ result = await tool.func.async_call(**args)
1603
+
1604
+ elif hasattr(tool, 'async_call') and callable(tool.async_call):
1605
+ # Case: tool itself has async_call
1606
+ result = await tool.async_call(**args)
1607
+
1608
+ elif hasattr(tool, 'func') and asyncio.iscoroutinefunction(
1609
+ tool.func
1610
+ ):
1611
+ # Case: tool wraps a direct async function
1612
+ result = await tool.func(**args)
1613
+
1614
+ elif asyncio.iscoroutinefunction(tool):
1615
+ # Case: tool is itself a coroutine function
1616
+ result = await tool(**args)
1617
+
1618
+ else:
1619
+ # Fallback: synchronous call
1620
+ result = tool(**args)
1621
+
1565
1622
  except Exception as e:
1566
1623
  # Capture the error message to prevent framework crash
1567
1624
  error_msg = f"Error executing async tool '{func_name}': {e!s}"
@@ -1599,17 +1656,24 @@ class ChatAgent(BaseAgent):
1599
1656
  tool_call_id=tool_call_id,
1600
1657
  )
1601
1658
 
1602
- # Use slightly different timestamps to ensure correct ordering
1659
+ # Use precise timestamps to ensure correct ordering
1603
1660
  # This ensures the assistant message (tool call) always appears before
1604
1661
  # the function message (tool result) in the conversation context
1605
- current_time = datetime.now().timestamp()
1662
+ # Use time.time_ns() for nanosecond precision to avoid collisions
1663
+ import time
1664
+
1665
+ current_time_ns = time.time_ns()
1666
+ base_timestamp = current_time_ns / 1_000_000_000 # Convert to seconds
1667
+
1606
1668
  self.update_memory(
1607
- assist_msg, OpenAIBackendRole.ASSISTANT, timestamp=current_time
1669
+ assist_msg, OpenAIBackendRole.ASSISTANT, timestamp=base_timestamp
1608
1670
  )
1671
+
1672
+ # Add minimal increment to ensure function message comes after
1609
1673
  self.update_memory(
1610
1674
  func_msg,
1611
1675
  OpenAIBackendRole.FUNCTION,
1612
- timestamp=current_time + 0.001,
1676
+ timestamp=base_timestamp + 1e-6,
1613
1677
  )
1614
1678
 
1615
1679
  # Record information about this tool call
@@ -1714,6 +1778,7 @@ class ChatAgent(BaseAgent):
1714
1778
  f"ChatAgent({self.role_name}, {self.role_type}, {self.model_type})"
1715
1779
  )
1716
1780
 
1781
+ @dependencies_required("mcp")
1717
1782
  def to_mcp(
1718
1783
  self,
1719
1784
  name: str = "CAMEL-ChatAgent",
@@ -1740,13 +1805,7 @@ class ChatAgent(BaseAgent):
1740
1805
  Returns:
1741
1806
  FastMCP: An MCP server instance that can be run.
1742
1807
  """
1743
- try:
1744
- from mcp.server.fastmcp import FastMCP
1745
- except ImportError:
1746
- raise ImportError(
1747
- "The 'mcp' package is required to use the to_mcp method. "
1748
- "Install it with 'pip install mcp'."
1749
- )
1808
+ from mcp.server.fastmcp import FastMCP
1750
1809
 
1751
1810
  # Combine dependencies
1752
1811
  all_dependencies = ["camel-ai[all]"]
@@ -1837,7 +1896,7 @@ class ChatAgent(BaseAgent):
1837
1896
  "description": tool.get_function_description() or "",
1838
1897
  "parameters": [
1839
1898
  {"name": param_name, "type": str(param_type)}
1840
- for param_name, param_type in tool.get_parameters().items() # noqa: E501
1899
+ for param_name, param_type in tool.parameters.items()
1841
1900
  ],
1842
1901
  }
1843
1902
  return tool_info
@@ -125,6 +125,7 @@ class MCPAgent(ChatAgent):
125
125
  local_config_path: Optional[str] = None,
126
126
  tools: Optional[List[Union[FunctionTool, Callable]]] = None,
127
127
  function_calling_available: bool = True,
128
+ strict: bool = False,
128
129
  **kwargs,
129
130
  ):
130
131
  if model is None:
@@ -144,6 +145,7 @@ class MCPAgent(ChatAgent):
144
145
 
145
146
  self.local_config = local_config
146
147
  self.function_calling_available = function_calling_available
148
+ self.strict = strict
147
149
 
148
150
  if function_calling_available:
149
151
  sys_msg_content = "You are a helpful assistant, and you prefer "
@@ -177,7 +179,7 @@ class MCPAgent(ChatAgent):
177
179
  if self.local_config:
178
180
  config_dict.update(self.local_config)
179
181
 
180
- return MCPToolkit(config_dict=config_dict)
182
+ return MCPToolkit(config_dict=config_dict, strict=self.strict)
181
183
 
182
184
  def add_registry(self, registry_config: BaseMCPRegistryConfig) -> None:
183
185
  r"""Add a new registry configuration to the agent.
@@ -211,6 +213,7 @@ class MCPAgent(ChatAgent):
211
213
  ] = None,
212
214
  model: Optional[BaseModelBackend] = None,
213
215
  function_calling_available: bool = False,
216
+ strict: bool = False,
214
217
  **kwargs,
215
218
  ) -> "MCPAgent":
216
219
  r"""Create and connect an MCPAgent instance.
@@ -276,6 +279,7 @@ class MCPAgent(ChatAgent):
276
279
  registry_configs=final_registry_configs,
277
280
  model=model,
278
281
  function_calling_available=function_calling_available,
282
+ strict=strict,
279
283
  **kwargs,
280
284
  )
281
285
 
@@ -16,6 +16,7 @@ from .anthropic_config import ANTHROPIC_API_PARAMS, AnthropicConfig
16
16
  from .base_config import BaseConfig
17
17
  from .bedrock_config import BEDROCK_API_PARAMS, BedrockConfig
18
18
  from .cohere_config import COHERE_API_PARAMS, CohereConfig
19
+ from .crynux_config import CRYNUX_API_PARAMS, CrynuxConfig
19
20
  from .deepseek_config import DEEPSEEK_API_PARAMS, DeepSeekConfig
20
21
  from .gemini_config import Gemini_API_PARAMS, GeminiConfig
21
22
  from .groq_config import GROQ_API_PARAMS, GroqConfig
@@ -112,4 +113,6 @@ __all__ = [
112
113
  'LMStudioConfig',
113
114
  'WatsonXConfig',
114
115
  'WATSONX_API_PARAMS',
116
+ 'CrynuxConfig',
117
+ 'CRYNUX_API_PARAMS',
115
118
  ]
@@ -0,0 +1,94 @@
1
+ # ========= Copyright 2023-2024 @ CAMEL-AI.org. All Rights Reserved. =========
2
+ # Licensed under the Apache License, Version 2.0 (the "License");
3
+ # you may not use this file except in compliance with the License.
4
+ # You may obtain a copy of the License at
5
+ #
6
+ # http://www.apache.org/licenses/LICENSE-2.0
7
+ #
8
+ # Unless required by applicable law or agreed to in writing, software
9
+ # distributed under the License is distributed on an "AS IS" BASIS,
10
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
11
+ # See the License for the specific language governing permissions and
12
+ # limitations under the License.
13
+ # ========= Copyright 2023-2024 @ CAMEL-AI.org. All Rights Reserved. =========
14
+ from __future__ import annotations
15
+
16
+ from typing import Dict, Optional, Sequence, Type, Union
17
+
18
+ from pydantic import BaseModel
19
+
20
+ from camel.configs.base_config import BaseConfig
21
+
22
+
23
+ class CrynuxConfig(BaseConfig):
24
+ r"""Defines the parameters for generating chat completions using the
25
+ OpenAI API.
26
+
27
+ Args:
28
+ temperature (float, optional): Sampling temperature to use, between
29
+ :obj:`0` and :obj:`2`. Higher values make the output more random,
30
+ while lower values make it more focused and deterministic.
31
+ (default: :obj:`None`)
32
+ top_p (float, optional): An alternative to sampling with temperature,
33
+ called nucleus sampling, where the model considers the results of
34
+ the tokens with top_p probability mass. So :obj:`0.1` means only
35
+ the tokens comprising the top 10% probability mass are considered.
36
+ (default: :obj:`None`)
37
+ n (int, optional): How many chat completion choices to generate for
38
+ each input message. (default: :obj:`None`)
39
+ response_format (object, optional): An object specifying the format
40
+ that the model must output. Compatible with GPT-4 Turbo and all
41
+ GPT-3.5 Turbo models newer than gpt-3.5-turbo-1106. Setting to
42
+ {"type": "json_object"} enables JSON mode, which guarantees the
43
+ message the model generates is valid JSON. Important: when using
44
+ JSON mode, you must also instruct the model to produce JSON
45
+ yourself via a system or user message. Without this, the model
46
+ may generate an unending stream of whitespace until the generation
47
+ reaches the token limit, resulting in a long-running and seemingly
48
+ "stuck" request. Also note that the message content may be
49
+ partially cut off if finish_reason="length", which indicates the
50
+ generation exceeded max_tokens or the conversation exceeded the
51
+ max context length.
52
+ stream (bool, optional): If True, partial message deltas will be sent
53
+ as data-only server-sent events as they become available.
54
+ (default: :obj:`None`)
55
+ stop (str or list, optional): Up to :obj:`4` sequences where the API
56
+ will stop generating further tokens. (default: :obj:`None`)
57
+ max_tokens (int, optional): The maximum number of tokens to generate
58
+ in the chat completion. The total length of input tokens and
59
+ generated tokens is limited by the model's context length.
60
+ (default: :obj:`None`)
61
+ presence_penalty (float, optional): Number between :obj:`-2.0` and
62
+ :obj:`2.0`. Positive values penalize new tokens based on whether
63
+ they appear in the text so far, increasing the model's likelihood
64
+ to talk about new topics. See more information about frequency and
65
+ presence penalties. (default: :obj:`None`)
66
+ frequency_penalty (float, optional): Number between :obj:`-2.0` and
67
+ :obj:`2.0`. Positive values penalize new tokens based on their
68
+ existing frequency in the text so far, decreasing the model's
69
+ likelihood to repeat the same line verbatim. See more information
70
+ about frequency and presence penalties. (default: :obj:`None`)
71
+ logit_bias (dict, optional): Modify the likelihood of specified tokens
72
+ appearing in the completion. Accepts a json object that maps tokens
73
+ (specified by their token ID in the tokenizer) to an associated
74
+ bias value from :obj:`-100` to :obj:`100`. Mathematically, the bias
75
+ is added to the logits generated by the model prior to sampling.
76
+ The exact effect will vary per model, but values between:obj:` -1`
77
+ and :obj:`1` should decrease or increase likelihood of selection;
78
+ values like :obj:`-100` or :obj:`100` should result in a ban or
79
+ exclusive selection of the relevant token. (default: :obj:`None`)
80
+ """
81
+
82
+ temperature: Optional[float] = None
83
+ top_p: Optional[float] = None
84
+ n: Optional[int] = None
85
+ stream: Optional[bool] = None
86
+ stop: Optional[Union[str, Sequence[str]]] = None
87
+ max_tokens: Optional[int] = None
88
+ presence_penalty: Optional[float] = None
89
+ response_format: Optional[Union[Type[BaseModel], Dict]] = None
90
+ frequency_penalty: Optional[float] = None
91
+ logit_bias: Optional[Dict] = None
92
+
93
+
94
+ CRYNUX_API_PARAMS = {param for param in CrynuxConfig.model_fields.keys()}
@@ -12,7 +12,7 @@
12
12
  # limitations under the License.
13
13
  # ========= Copyright 2023-2024 @ CAMEL-AI.org. All Rights Reserved. =========
14
14
  from abc import ABC, abstractmethod
15
- from typing import Any, Dict, List
15
+ from typing import Any, Dict, List, Tuple, Union
16
16
 
17
17
 
18
18
  class BaseInterpreter(ABC):
@@ -47,3 +47,16 @@ class BaseInterpreter(ABC):
47
47
  def update_action_space(self, action_space: Dict[str, Any]) -> None:
48
48
  r"""Updates action space for *python* interpreter"""
49
49
  pass
50
+
51
+ @abstractmethod
52
+ def execute_command(self, command: str) -> Union[str, Tuple[str, str]]:
53
+ r"""Executes a command in the interpreter.
54
+
55
+ Args:
56
+ command (str): The command to execute.
57
+
58
+ Returns:
59
+ Tuple[str, str]: A tuple containing the stdout and stderr of the
60
+ command execution.
61
+ """
62
+ pass
@@ -0,0 +1,68 @@
1
+ # syntax=docker/dockerfile:1
2
+
3
+ FROM ubuntu:22.04
4
+
5
+ # Set environment variable to avoid interactive prompts
6
+ ENV DEBIAN_FRONTEND=noninteractive
7
+
8
+ # Update and install base utilities
9
+ RUN apt-get update && apt-get install -y \
10
+ build-essential \
11
+ software-properties-common \
12
+ curl \
13
+ wget \
14
+ git \
15
+ git-lfs \
16
+ netcat \
17
+ sudo \
18
+ tzdata \
19
+ && rm -rf /var/lib/apt/lists/* \
20
+ && apt-get clean \
21
+ && apt-get autoremove -y
22
+
23
+ # Install Python 3.10 and its dependencies
24
+ RUN add-apt-repository ppa:deadsnakes/ppa && \
25
+ apt-get update && \
26
+ apt-get install -y \
27
+ python3.10 \
28
+ python3.10-venv \
29
+ python3.10-dev \
30
+ python3.10-distutils \
31
+ python3-pip \
32
+ && ln -s /usr/bin/python3.10 /usr/bin/python \
33
+ && rm -rf /var/lib/apt/lists/* \
34
+ && apt-get clean \
35
+ && apt-get autoremove -y
36
+
37
+ # Install R
38
+ RUN apt-get update && \
39
+ apt-get install -y r-base && \
40
+ rm -rf /var/lib/apt/lists/* && \
41
+ apt-get clean && \
42
+ apt-get autoremove -y
43
+
44
+ # Install NodeJS 22.x
45
+ RUN curl -fsSL https://deb.nodesource.com/setup_22.x | bash - && \
46
+ apt-get install -y nodejs && \
47
+ rm -rf /var/lib/apt/lists/* && \
48
+ apt-get clean && \
49
+ apt-get autoremove -y
50
+
51
+ # Install Poetry
52
+ RUN curl -fsSL https://install.python-poetry.org | python3.10 - && \
53
+ ln -s ~/.local/bin/poetry /usr/local/bin/poetry
54
+
55
+ # Upgrade pip and install base Python packages
56
+ RUN python3.10 -m pip install --upgrade pip setuptools wheel
57
+
58
+ # Install uv
59
+ RUN curl -LsSf https://astral.sh/uv/install.sh | sh && \
60
+ mv /root/.local/bin/uv /usr/local/bin/uv && \
61
+ mv /root/.local/bin/uvx /usr/local/bin/uvx && \
62
+ chmod +x /usr/local/bin/uv /usr/local/bin/uvx
63
+
64
+ # Setup working directory
65
+ WORKDIR /workspace
66
+
67
+ # Set default shell
68
+ CMD ["/bin/bash"]
@@ -53,12 +53,14 @@ class DockerInterpreter(BaseInterpreter):
53
53
  "python": "python {file_name}",
54
54
  "bash": "bash {file_name}",
55
55
  "r": "Rscript {file_name}",
56
+ "node": "node {file_name}",
56
57
  }
57
58
 
58
59
  _CODE_EXTENSION_MAPPING: ClassVar[Dict[str, str]] = {
59
60
  "python": "py",
60
61
  "bash": "sh",
61
62
  "r": "R",
63
+ "node": "js",
62
64
  }
63
65
 
64
66
  _CODE_TYPE_MAPPING: ClassVar[Dict[str, str]] = {
@@ -71,6 +73,11 @@ class DockerInterpreter(BaseInterpreter):
71
73
  "sh": "bash",
72
74
  "r": "r",
73
75
  "R": "r",
76
+ "node": "node",
77
+ "js": "node",
78
+ "javascript": "node",
79
+ "typescript": "node",
80
+ "ts": "node",
74
81
  }
75
82
 
76
83
  def __init__(
@@ -92,8 +99,11 @@ class DockerInterpreter(BaseInterpreter):
92
99
  This method ensures that the Docker container is removed when the
93
100
  interpreter is deleted.
94
101
  """
95
- if self._container is not None:
96
- self._container.remove(force=True)
102
+ try:
103
+ if self._container is not None:
104
+ self.cleanup()
105
+ except ImportError as e:
106
+ logger.warning(f"Error during container cleanup: {e}")
97
107
 
98
108
  def _initialize_if_needed(self) -> None:
99
109
  if self._container is not None:
@@ -180,10 +190,24 @@ class DockerInterpreter(BaseInterpreter):
180
190
  exec_result += f"(stderr: {stderr.decode()})" if stderr else ""
181
191
  return exec_result
182
192
 
193
+ def cleanup(self) -> None:
194
+ r"""Explicitly stops and removes the Docker container.
195
+
196
+ This method should be called when you're done with the interpreter
197
+ to ensure proper cleanup of Docker resources.
198
+ """
199
+ try:
200
+ if self._container is not None:
201
+ self._container.stop()
202
+ self._container.remove(force=True)
203
+ self._container = None
204
+ except Exception as e:
205
+ logger.error(f"Error during container cleanup: {e}")
206
+
183
207
  def run(
184
208
  self,
185
209
  code: str,
186
- code_type: str,
210
+ code_type: str = "python",
187
211
  ) -> str:
188
212
  r"""Executes the given code in the container attached to the
189
213
  interpreter, and captures the stdout and stderr streams.
@@ -191,7 +215,7 @@ class DockerInterpreter(BaseInterpreter):
191
215
  Args:
192
216
  code (str): The code string to execute.
193
217
  code_type (str): The type of code to execute (e.g., 'python',
194
- 'bash').
218
+ 'bash'). (default: obj:`python`)
195
219
 
196
220
  Returns:
197
221
  str: A string containing the captured stdout and stderr of the
@@ -229,13 +253,16 @@ class DockerInterpreter(BaseInterpreter):
229
253
  try:
230
254
  temp_file_path = self._create_file_in_container(code)
231
255
  result = self._run_file_in_container(temp_file_path, code_type)
256
+ # Clean up after execution
232
257
  except docker.errors.APIError as e:
258
+ self.cleanup()
233
259
  raise InterpreterError(
234
260
  f"Execution halted due to docker API error: {e.explanation}. "
235
261
  "This choice stops the current operation and any "
236
262
  "further code execution."
237
263
  ) from e
238
264
  except docker.errors.DockerException as e:
265
+ self.cleanup() # Clean up even if there's an error
239
266
  raise InterpreterError(
240
267
  f"Execution halted due to docker exceptoin: {e}. "
241
268
  "This choice stops the current operation and any "
@@ -258,6 +285,37 @@ class DockerInterpreter(BaseInterpreter):
258
285
 
259
286
  def update_action_space(self, action_space: Dict[str, Any]) -> None:
260
287
  r"""Updates action space for *python* interpreter"""
261
- raise RuntimeError(
262
- "SubprocessInterpreter doesn't support " "`action_space`."
263
- )
288
+ raise RuntimeError("DockerInterpreter doesn't support `action_space`.")
289
+
290
+ def execute_command(self, command: str) -> str:
291
+ r"""Executes a command in the Docker container and returns its output.
292
+
293
+ Args:
294
+ command (str): The command to execute in the container.
295
+
296
+ Returns:
297
+ str: A string containing the captured stdout and stderr of the
298
+ executed command.
299
+
300
+ Raises:
301
+ InterpreterError: If the container is not initialized or there is
302
+ an error executing the command.
303
+ """
304
+ self._initialize_if_needed()
305
+
306
+ if self._container is None:
307
+ raise InterpreterError(
308
+ "Container is not initialized. Try running the command again."
309
+ )
310
+
311
+ try:
312
+ stdout, stderr = self._container.exec_run(
313
+ command,
314
+ demux=True,
315
+ ).output
316
+ exec_result = f"{stdout.decode()}" if stdout else ""
317
+ exec_result += f"(stderr: {stderr.decode()})" if stderr else ""
318
+ return exec_result
319
+
320
+ except Exception as e:
321
+ raise InterpreterError(f"Failed to execute command: {e!s}") from e