camel-ai 0.2.62__tar.gz → 0.2.65__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.
- {camel_ai-0.2.62 → camel_ai-0.2.65}/PKG-INFO +9 -12
- {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/__init__.py +1 -1
- {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/agents/chat_agent.py +95 -24
- {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/agents/mcp_agent.py +5 -1
- camel_ai-0.2.65/camel/benchmarks/mock_website/README.md +96 -0
- camel_ai-0.2.65/camel/benchmarks/mock_website/mock_web.py +299 -0
- camel_ai-0.2.65/camel/benchmarks/mock_website/requirements.txt +3 -0
- camel_ai-0.2.65/camel/benchmarks/mock_website/shopping_mall/app.py +465 -0
- camel_ai-0.2.65/camel/benchmarks/mock_website/task.json +104 -0
- {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/configs/__init__.py +3 -0
- camel_ai-0.2.65/camel/configs/crynux_config.py +94 -0
- {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/datasets/models.py +1 -1
- {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/datasets/static_dataset.py +6 -0
- {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/interpreters/base.py +14 -1
- camel_ai-0.2.65/camel/interpreters/docker/Dockerfile +68 -0
- {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/interpreters/docker_interpreter.py +65 -7
- {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/interpreters/e2b_interpreter.py +23 -8
- {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/interpreters/internal_python_interpreter.py +30 -2
- {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/interpreters/ipython_interpreter.py +21 -3
- {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/interpreters/subprocess_interpreter.py +34 -2
- {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/memories/records.py +5 -3
- {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/models/__init__.py +2 -0
- {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/models/azure_openai_model.py +101 -25
- {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/models/cohere_model.py +65 -0
- camel_ai-0.2.65/camel/models/crynux_model.py +94 -0
- {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/models/deepseek_model.py +43 -1
- {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/models/gemini_model.py +50 -4
- {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/models/litellm_model.py +38 -0
- {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/models/mistral_model.py +66 -0
- {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/models/model_factory.py +10 -1
- {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/models/openai_compatible_model.py +81 -17
- {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/models/openai_model.py +87 -16
- {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/models/reka_model.py +69 -0
- {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/models/samba_model.py +69 -2
- {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/models/sglang_model.py +74 -2
- {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/models/watsonx_model.py +62 -0
- {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/societies/workforce/role_playing_worker.py +11 -3
- {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/societies/workforce/single_agent_worker.py +31 -1
- {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/societies/workforce/utils.py +51 -0
- {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/societies/workforce/workforce.py +409 -7
- {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/storages/__init__.py +2 -0
- {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/storages/vectordb_storages/__init__.py +2 -0
- camel_ai-0.2.65/camel/storages/vectordb_storages/weaviate.py +714 -0
- {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/tasks/task.py +27 -10
- {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/toolkits/async_browser_toolkit.py +97 -54
- {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/toolkits/browser_toolkit.py +65 -18
- {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/toolkits/code_execution.py +37 -8
- {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/toolkits/function_tool.py +2 -2
- {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/toolkits/mcp_toolkit.py +13 -2
- {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/toolkits/playwright_mcp_toolkit.py +16 -3
- camel_ai-0.2.65/camel/toolkits/task_planning_toolkit.py +134 -0
- {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/types/enums.py +61 -2
- {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/types/unified_model_type.py +5 -0
- {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/utils/__init__.py +16 -0
- camel_ai-0.2.65/camel/utils/langfuse.py +258 -0
- {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/utils/mcp_client.py +84 -17
- {camel_ai-0.2.62 → camel_ai-0.2.65}/pyproject.toml +16 -14
- camel_ai-0.2.62/camel/interpreters/docker/Dockerfile +0 -12
- {camel_ai-0.2.62 → camel_ai-0.2.65}/.gitignore +0 -0
- {camel_ai-0.2.62 → camel_ai-0.2.65}/LICENSE +0 -0
- {camel_ai-0.2.62 → camel_ai-0.2.65}/README.md +0 -0
- {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/agents/__init__.py +0 -0
- {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/agents/_types.py +0 -0
- {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/agents/_utils.py +0 -0
- {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/agents/base.py +0 -0
- {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/agents/critic_agent.py +0 -0
- {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/agents/deductive_reasoner_agent.py +0 -0
- {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/agents/embodied_agent.py +0 -0
- {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/agents/knowledge_graph_agent.py +0 -0
- {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/agents/multi_hop_generator_agent.py +0 -0
- {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/agents/programmed_agent_instruction.py +0 -0
- {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/agents/repo_agent.py +0 -0
- {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/agents/role_assignment_agent.py +0 -0
- {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/agents/search_agent.py +0 -0
- {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/agents/task_agent.py +0 -0
- {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/agents/tool_agents/__init__.py +0 -0
- {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/agents/tool_agents/base.py +0 -0
- {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/agents/tool_agents/hugging_face_tool_agent.py +0 -0
- {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/benchmarks/__init__.py +0 -0
- {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/benchmarks/apibank.py +0 -0
- {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/benchmarks/apibench.py +0 -0
- {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/benchmarks/base.py +0 -0
- {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/benchmarks/browsecomp.py +0 -0
- {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/benchmarks/gaia.py +0 -0
- {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/benchmarks/nexus.py +0 -0
- {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/benchmarks/ragbench.py +0 -0
- {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/bots/__init__.py +0 -0
- {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/bots/discord/__init__.py +0 -0
- {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/bots/discord/discord_app.py +0 -0
- {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/bots/discord/discord_installation.py +0 -0
- {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/bots/discord/discord_store.py +0 -0
- {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/bots/slack/__init__.py +0 -0
- {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/bots/slack/models.py +0 -0
- {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/bots/slack/slack_app.py +0 -0
- {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/bots/telegram_bot.py +0 -0
- {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/configs/aiml_config.py +0 -0
- {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/configs/anthropic_config.py +0 -0
- {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/configs/base_config.py +0 -0
- {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/configs/bedrock_config.py +0 -0
- {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/configs/cohere_config.py +0 -0
- {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/configs/deepseek_config.py +0 -0
- {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/configs/gemini_config.py +0 -0
- {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/configs/groq_config.py +0 -0
- {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/configs/internlm_config.py +0 -0
- {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/configs/litellm_config.py +0 -0
- {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/configs/lmstudio_config.py +0 -0
- {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/configs/mistral_config.py +0 -0
- {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/configs/modelscope_config.py +0 -0
- {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/configs/moonshot_config.py +0 -0
- {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/configs/netmind_config.py +0 -0
- {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/configs/novita_config.py +0 -0
- {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/configs/nvidia_config.py +0 -0
- {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/configs/ollama_config.py +0 -0
- {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/configs/openai_config.py +0 -0
- {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/configs/openrouter_config.py +0 -0
- {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/configs/ppio_config.py +0 -0
- {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/configs/qwen_config.py +0 -0
- {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/configs/reka_config.py +0 -0
- {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/configs/samba_config.py +0 -0
- {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/configs/sglang_config.py +0 -0
- {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/configs/siliconflow_config.py +0 -0
- {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/configs/togetherai_config.py +0 -0
- {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/configs/vllm_config.py +0 -0
- {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/configs/watsonx_config.py +0 -0
- {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/configs/yi_config.py +0 -0
- {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/configs/zhipuai_config.py +0 -0
- {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/data_collectors/__init__.py +0 -0
- {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/data_collectors/alpaca_collector.py +0 -0
- {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/data_collectors/base.py +0 -0
- {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/data_collectors/sharegpt_collector.py +0 -0
- {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/datagen/__init__.py +0 -0
- {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/datagen/cot_datagen.py +0 -0
- {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/datagen/evol_instruct/__init__.py +0 -0
- {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/datagen/evol_instruct/evol_instruct.py +0 -0
- {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/datagen/evol_instruct/scorer.py +0 -0
- {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/datagen/evol_instruct/templates.py +0 -0
- {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/datagen/self_improving_cot.py +0 -0
- {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/datagen/self_instruct/__init__.py +0 -0
- {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/datagen/self_instruct/filter/__init__.py +0 -0
- {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/datagen/self_instruct/filter/filter_function.py +0 -0
- {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/datagen/self_instruct/filter/filter_registry.py +0 -0
- {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/datagen/self_instruct/filter/instruction_filter.py +0 -0
- {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/datagen/self_instruct/self_instruct.py +0 -0
- {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/datagen/self_instruct/templates.py +0 -0
- {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/datagen/source2synth/__init__.py +0 -0
- {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/datagen/source2synth/data_processor.py +0 -0
- {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/datagen/source2synth/models.py +0 -0
- {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/datagen/source2synth/user_data_processor_config.py +0 -0
- {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/datahubs/__init__.py +0 -0
- {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/datahubs/base.py +0 -0
- {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/datahubs/huggingface.py +0 -0
- {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/datahubs/models.py +0 -0
- {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/datasets/__init__.py +0 -0
- {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/datasets/base_generator.py +0 -0
- {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/datasets/few_shot_generator.py +0 -0
- {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/datasets/self_instruct_generator.py +0 -0
- {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/embeddings/__init__.py +0 -0
- {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/embeddings/azure_embedding.py +0 -0
- {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/embeddings/base.py +0 -0
- {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/embeddings/gemini_embedding.py +0 -0
- {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/embeddings/jina_embedding.py +0 -0
- {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/embeddings/mistral_embedding.py +0 -0
- {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/embeddings/openai_compatible_embedding.py +0 -0
- {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/embeddings/openai_embedding.py +0 -0
- {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/embeddings/sentence_transformers_embeddings.py +0 -0
- {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/embeddings/together_embedding.py +0 -0
- {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/embeddings/vlm_embedding.py +0 -0
- {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/environments/__init__.py +0 -0
- {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/environments/models.py +0 -0
- {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/environments/multi_step.py +0 -0
- {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/environments/single_step.py +0 -0
- {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/environments/tic_tac_toe.py +0 -0
- {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/extractors/__init__.py +0 -0
- {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/extractors/base.py +0 -0
- {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/extractors/python_strategies.py +0 -0
- {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/generators.py +0 -0
- {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/human.py +0 -0
- {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/interpreters/__init__.py +0 -0
- {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/interpreters/interpreter_error.py +0 -0
- {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/loaders/__init__.py +0 -0
- {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/loaders/apify_reader.py +0 -0
- {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/loaders/base_io.py +0 -0
- {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/loaders/chunkr_reader.py +0 -0
- {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/loaders/crawl4ai_reader.py +0 -0
- {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/loaders/firecrawl_reader.py +0 -0
- {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/loaders/jina_url_reader.py +0 -0
- {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/loaders/markitdown.py +0 -0
- {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/loaders/mineru_extractor.py +0 -0
- {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/loaders/mistral_reader.py +0 -0
- {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/loaders/pandas_reader.py +0 -0
- {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/loaders/scrapegraph_reader.py +0 -0
- {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/loaders/unstructured_io.py +0 -0
- {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/logger.py +0 -0
- {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/memories/__init__.py +0 -0
- {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/memories/agent_memories.py +0 -0
- {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/memories/base.py +0 -0
- {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/memories/blocks/__init__.py +0 -0
- {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/memories/blocks/chat_history_block.py +0 -0
- {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/memories/blocks/vectordb_block.py +0 -0
- {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/memories/context_creators/__init__.py +0 -0
- {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/memories/context_creators/score_based.py +0 -0
- {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/messages/__init__.py +0 -0
- {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/messages/base.py +0 -0
- {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/messages/conversion/__init__.py +0 -0
- {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/messages/conversion/alpaca.py +0 -0
- {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/messages/conversion/conversation_models.py +0 -0
- {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/messages/conversion/sharegpt/__init__.py +0 -0
- {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/messages/conversion/sharegpt/function_call_formatter.py +0 -0
- {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/messages/conversion/sharegpt/hermes/__init__.py +0 -0
- {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/messages/conversion/sharegpt/hermes/hermes_function_formatter.py +0 -0
- {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/messages/func_message.py +0 -0
- {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/models/_utils.py +0 -0
- {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/models/aiml_model.py +0 -0
- {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/models/anthropic_model.py +0 -0
- {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/models/aws_bedrock_model.py +0 -0
- {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/models/base_audio_model.py +0 -0
- {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/models/base_model.py +0 -0
- {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/models/fish_audio_model.py +0 -0
- {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/models/groq_model.py +0 -0
- {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/models/internlm_model.py +0 -0
- {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/models/lmstudio_model.py +0 -0
- {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/models/model_manager.py +0 -0
- {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/models/modelscope_model.py +0 -0
- {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/models/moonshot_model.py +0 -0
- {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/models/nemotron_model.py +0 -0
- {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/models/netmind_model.py +0 -0
- {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/models/novita_model.py +0 -0
- {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/models/nvidia_model.py +0 -0
- {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/models/ollama_model.py +0 -0
- {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/models/openai_audio_models.py +0 -0
- {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/models/openrouter_model.py +0 -0
- {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/models/ppio_model.py +0 -0
- {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/models/qwen_model.py +0 -0
- {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/models/reward/__init__.py +0 -0
- {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/models/reward/base_reward_model.py +0 -0
- {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/models/reward/evaluator.py +0 -0
- {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/models/reward/nemotron_model.py +0 -0
- {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/models/reward/skywork_model.py +0 -0
- {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/models/siliconflow_model.py +0 -0
- {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/models/stub_model.py +0 -0
- {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/models/togetherai_model.py +0 -0
- {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/models/vllm_model.py +0 -0
- {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/models/volcano_model.py +0 -0
- {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/models/yi_model.py +0 -0
- {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/models/zhipuai_model.py +0 -0
- {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/personas/__init__.py +0 -0
- {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/personas/persona.py +0 -0
- {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/personas/persona_hub.py +0 -0
- {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/prompts/__init__.py +0 -0
- {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/prompts/ai_society.py +0 -0
- {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/prompts/base.py +0 -0
- {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/prompts/code.py +0 -0
- {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/prompts/evaluation.py +0 -0
- {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/prompts/generate_text_embedding_data.py +0 -0
- {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/prompts/image_craft.py +0 -0
- {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/prompts/misalignment.py +0 -0
- {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/prompts/multi_condition_image_craft.py +0 -0
- {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/prompts/object_recognition.py +0 -0
- {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/prompts/persona_hub.py +0 -0
- {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/prompts/prompt_templates.py +0 -0
- {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/prompts/role_description_prompt_template.py +0 -0
- {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/prompts/solution_extraction.py +0 -0
- {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/prompts/task_prompt_template.py +0 -0
- {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/prompts/translation.py +0 -0
- {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/prompts/video_description_prompt.py +0 -0
- {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/py.typed +0 -0
- {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/responses/__init__.py +0 -0
- {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/responses/agent_responses.py +0 -0
- {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/retrievers/__init__.py +0 -0
- {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/retrievers/auto_retriever.py +0 -0
- {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/retrievers/base.py +0 -0
- {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/retrievers/bm25_retriever.py +0 -0
- {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/retrievers/cohere_rerank_retriever.py +0 -0
- {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/retrievers/hybrid_retrival.py +0 -0
- {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/retrievers/vector_retriever.py +0 -0
- {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/runtimes/__init__.py +0 -0
- {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/runtimes/api.py +0 -0
- {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/runtimes/base.py +0 -0
- {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/runtimes/configs.py +0 -0
- {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/runtimes/daytona_runtime.py +0 -0
- {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/runtimes/docker_runtime.py +0 -0
- {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/runtimes/llm_guard_runtime.py +0 -0
- {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/runtimes/remote_http_runtime.py +0 -0
- {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/runtimes/ubuntu_docker_runtime.py +0 -0
- {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/runtimes/utils/__init__.py +0 -0
- {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/runtimes/utils/function_risk_toolkit.py +0 -0
- {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/runtimes/utils/ignore_risk_toolkit.py +0 -0
- {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/schemas/__init__.py +0 -0
- {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/schemas/base.py +0 -0
- {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/schemas/openai_converter.py +0 -0
- {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/schemas/outlines_converter.py +0 -0
- {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/societies/__init__.py +0 -0
- {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/societies/babyagi_playing.py +0 -0
- {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/societies/role_playing.py +0 -0
- {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/societies/workforce/__init__.py +0 -0
- {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/societies/workforce/base.py +0 -0
- {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/societies/workforce/prompts.py +0 -0
- {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/societies/workforce/task_channel.py +0 -0
- {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/societies/workforce/worker.py +0 -0
- {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/storages/graph_storages/__init__.py +0 -0
- {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/storages/graph_storages/base.py +0 -0
- {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/storages/graph_storages/graph_element.py +0 -0
- {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/storages/graph_storages/nebula_graph.py +0 -0
- {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/storages/graph_storages/neo4j_graph.py +0 -0
- {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/storages/key_value_storages/__init__.py +0 -0
- {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/storages/key_value_storages/base.py +0 -0
- {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/storages/key_value_storages/in_memory.py +0 -0
- {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/storages/key_value_storages/json.py +0 -0
- {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/storages/key_value_storages/mem0_cloud.py +0 -0
- {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/storages/key_value_storages/redis.py +0 -0
- {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/storages/object_storages/__init__.py +0 -0
- {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/storages/object_storages/amazon_s3.py +0 -0
- {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/storages/object_storages/azure_blob.py +0 -0
- {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/storages/object_storages/base.py +0 -0
- {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/storages/object_storages/google_cloud.py +0 -0
- {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/storages/vectordb_storages/base.py +0 -0
- {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/storages/vectordb_storages/faiss.py +0 -0
- {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/storages/vectordb_storages/milvus.py +0 -0
- {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/storages/vectordb_storages/oceanbase.py +0 -0
- {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/storages/vectordb_storages/qdrant.py +0 -0
- {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/storages/vectordb_storages/tidb.py +0 -0
- {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/tasks/__init__.py +0 -0
- {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/tasks/task_prompt.py +0 -0
- {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/terminators/__init__.py +0 -0
- {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/terminators/base.py +0 -0
- {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/terminators/response_terminator.py +0 -0
- {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/terminators/token_limit_terminator.py +0 -0
- {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/toolkits/__init__.py +0 -0
- {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/toolkits/aci_toolkit.py +0 -0
- {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/toolkits/arxiv_toolkit.py +0 -0
- {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/toolkits/ask_news_toolkit.py +0 -0
- {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/toolkits/audio_analysis_toolkit.py +0 -0
- {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/toolkits/base.py +0 -0
- {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/toolkits/bohrium_toolkit.py +0 -0
- {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/toolkits/browser_toolkit_commons.py +0 -0
- {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/toolkits/dalle_toolkit.py +0 -0
- {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/toolkits/dappier_toolkit.py +0 -0
- {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/toolkits/data_commons_toolkit.py +0 -0
- {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/toolkits/excel_toolkit.py +0 -0
- {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/toolkits/file_write_toolkit.py +0 -0
- {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/toolkits/github_toolkit.py +0 -0
- {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/toolkits/google_calendar_toolkit.py +0 -0
- {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/toolkits/google_maps_toolkit.py +0 -0
- {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/toolkits/google_scholar_toolkit.py +0 -0
- {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/toolkits/human_toolkit.py +0 -0
- {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/toolkits/image_analysis_toolkit.py +0 -0
- {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/toolkits/jina_reranker_toolkit.py +0 -0
- {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/toolkits/klavis_toolkit.py +0 -0
- {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/toolkits/linkedin_toolkit.py +0 -0
- {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/toolkits/math_toolkit.py +0 -0
- {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/toolkits/memory_toolkit.py +0 -0
- {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/toolkits/meshy_toolkit.py +0 -0
- {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/toolkits/mineru_toolkit.py +0 -0
- {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/toolkits/networkx_toolkit.py +0 -0
- {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/toolkits/notion_toolkit.py +0 -0
- {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/toolkits/open_api_specs/biztoc/__init__.py +0 -0
- {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/toolkits/open_api_specs/biztoc/ai-plugin.json +0 -0
- {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/toolkits/open_api_specs/biztoc/openapi.yaml +0 -0
- {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/toolkits/open_api_specs/coursera/__init__.py +0 -0
- {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/toolkits/open_api_specs/coursera/openapi.yaml +0 -0
- {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/toolkits/open_api_specs/create_qr_code/__init__.py +0 -0
- {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/toolkits/open_api_specs/create_qr_code/openapi.yaml +0 -0
- {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/toolkits/open_api_specs/klarna/__init__.py +0 -0
- {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/toolkits/open_api_specs/klarna/openapi.yaml +0 -0
- {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/toolkits/open_api_specs/nasa_apod/__init__.py +0 -0
- {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/toolkits/open_api_specs/nasa_apod/openapi.yaml +0 -0
- {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/toolkits/open_api_specs/outschool/__init__.py +0 -0
- {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/toolkits/open_api_specs/outschool/ai-plugin.json +0 -0
- {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/toolkits/open_api_specs/outschool/openapi.yaml +0 -0
- {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/toolkits/open_api_specs/outschool/paths/__init__.py +0 -0
- {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/toolkits/open_api_specs/outschool/paths/get_classes.py +0 -0
- {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/toolkits/open_api_specs/outschool/paths/search_teachers.py +0 -0
- {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/toolkits/open_api_specs/security_config.py +0 -0
- {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/toolkits/open_api_specs/speak/__init__.py +0 -0
- {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/toolkits/open_api_specs/speak/openapi.yaml +0 -0
- {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/toolkits/open_api_specs/web_scraper/__init__.py +0 -0
- {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/toolkits/open_api_specs/web_scraper/ai-plugin.json +0 -0
- {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/toolkits/open_api_specs/web_scraper/openapi.yaml +0 -0
- {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/toolkits/open_api_specs/web_scraper/paths/__init__.py +0 -0
- {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/toolkits/open_api_specs/web_scraper/paths/scraper.py +0 -0
- {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/toolkits/open_api_toolkit.py +0 -0
- {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/toolkits/openai_agent_toolkit.py +0 -0
- {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/toolkits/openbb_toolkit.py +0 -0
- {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/toolkits/page_script.js +0 -0
- {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/toolkits/pptx_toolkit.py +0 -0
- {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/toolkits/pubmed_toolkit.py +0 -0
- {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/toolkits/pulse_mcp_search_toolkit.py +0 -0
- {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/toolkits/pyautogui_toolkit.py +0 -0
- {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/toolkits/reddit_toolkit.py +0 -0
- {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/toolkits/retrieval_toolkit.py +0 -0
- {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/toolkits/search_toolkit.py +0 -0
- {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/toolkits/searxng_toolkit.py +0 -0
- {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/toolkits/semantic_scholar_toolkit.py +0 -0
- {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/toolkits/slack_toolkit.py +0 -0
- {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/toolkits/stripe_toolkit.py +0 -0
- {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/toolkits/sympy_toolkit.py +0 -0
- {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/toolkits/terminal_toolkit.py +0 -0
- {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/toolkits/thinking_toolkit.py +0 -0
- {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/toolkits/twitter_toolkit.py +0 -0
- {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/toolkits/video_analysis_toolkit.py +0 -0
- {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/toolkits/video_download_toolkit.py +0 -0
- {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/toolkits/weather_toolkit.py +0 -0
- {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/toolkits/whatsapp_toolkit.py +0 -0
- {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/toolkits/wolfram_alpha_toolkit.py +0 -0
- {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/toolkits/zapier_toolkit.py +0 -0
- {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/types/__init__.py +0 -0
- {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/types/agents/__init__.py +0 -0
- {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/types/agents/tool_calling_record.py +0 -0
- {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/types/mcp_registries.py +0 -0
- {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/types/openai_types.py +0 -0
- {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/utils/async_func.py +0 -0
- {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/utils/chunker/__init__.py +0 -0
- {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/utils/chunker/base.py +0 -0
- {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/utils/chunker/code_chunker.py +0 -0
- {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/utils/chunker/uio_chunker.py +0 -0
- {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/utils/commons.py +0 -0
- {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/utils/constants.py +0 -0
- {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/utils/deduplication.py +0 -0
- {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/utils/filename.py +0 -0
- {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/utils/mcp.py +0 -0
- {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/utils/response_format.py +0 -0
- {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/utils/token_counting.py +0 -0
- {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/verifiers/__init__.py +0 -0
- {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/verifiers/base.py +0 -0
- {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/verifiers/math_verifier.py +0 -0
- {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/verifiers/models.py +0 -0
- {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/verifiers/physics_verifier.py +0 -0
- {camel_ai-0.2.62 → camel_ai-0.2.65}/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.
|
|
3
|
+
Version: 0.2.65
|
|
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
|
|
@@ -21,7 +21,6 @@ Requires-Dist: psutil<6,>=5.9.8
|
|
|
21
21
|
Requires-Dist: pydantic>=2.10.6
|
|
22
22
|
Requires-Dist: tiktoken<0.8,>=0.7.0
|
|
23
23
|
Provides-Extra: all
|
|
24
|
-
Requires-Dist: accelerate<0.27,>=0.26.0; extra == 'all'
|
|
25
24
|
Requires-Dist: aci-sdk>=1.0.0b1; extra == 'all'
|
|
26
25
|
Requires-Dist: agentops<0.4,>=0.3.21; extra == 'all'
|
|
27
26
|
Requires-Dist: aiosqlite<0.21,>=0.20.0; extra == 'all'
|
|
@@ -53,6 +52,7 @@ Requires-Dist: fastapi>=0.115.11; extra == 'all'
|
|
|
53
52
|
Requires-Dist: ffmpeg-python<0.3,>=0.2.0; extra == 'all'
|
|
54
53
|
Requires-Dist: firecrawl-py<2,>=1.0.0; extra == 'all'
|
|
55
54
|
Requires-Dist: fish-audio-sdk<2025,>=2024.12.5; extra == 'all'
|
|
55
|
+
Requires-Dist: flask>=2.0; extra == 'all'
|
|
56
56
|
Requires-Dist: fpdf>=1.7.2; extra == 'all'
|
|
57
57
|
Requires-Dist: google-api-python-client==2.166.0; extra == 'all'
|
|
58
58
|
Requires-Dist: google-auth-httplib2==0.2.0; extra == 'all'
|
|
@@ -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'
|
|
@@ -82,9 +83,7 @@ Requires-Dist: newspaper3k<0.3,>=0.2.8; extra == 'all'
|
|
|
82
83
|
Requires-Dist: notion-client<3,>=2.2.1; extra == 'all'
|
|
83
84
|
Requires-Dist: numpy<=2.2,>=1.2; extra == 'all'
|
|
84
85
|
Requires-Dist: openapi-spec-validator<0.8,>=0.7.1; extra == 'all'
|
|
85
|
-
Requires-Dist: opencv-python<5,>=4; extra == 'all'
|
|
86
86
|
Requires-Dist: openpyxl>=3.1.5; extra == 'all'
|
|
87
|
-
Requires-Dist: outlines<0.2,>=0.1.7; extra == 'all'
|
|
88
87
|
Requires-Dist: pandas<2,>=1.5.3; extra == 'all'
|
|
89
88
|
Requires-Dist: pandasai<3,>=2.3.0; extra == 'all'
|
|
90
89
|
Requires-Dist: playwright>=1.50.0; extra == 'all'
|
|
@@ -114,7 +113,6 @@ Requires-Dist: rouge<2,>=1.0.1; extra == 'all'
|
|
|
114
113
|
Requires-Dist: scenedetect>=0.6.5.2; extra == 'all'
|
|
115
114
|
Requires-Dist: scholarly[tor]==1.7.11; extra == 'all'
|
|
116
115
|
Requires-Dist: scrapegraph-py<2,>=1.12.0; extra == 'all'
|
|
117
|
-
Requires-Dist: sentence-transformers<4,>=3.0.1; extra == 'all'
|
|
118
116
|
Requires-Dist: sentencepiece<0.3,>=0.2; extra == 'all'
|
|
119
117
|
Requires-Dist: slack-bolt<2,>=1.20.1; extra == 'all'
|
|
120
118
|
Requires-Dist: slack-sdk<4,>=3.27.2; extra == 'all'
|
|
@@ -124,7 +122,6 @@ Requires-Dist: sympy<2,>=1.13.3; extra == 'all'
|
|
|
124
122
|
Requires-Dist: tabulate>=0.9.0; extra == 'all'
|
|
125
123
|
Requires-Dist: tavily-python<0.6,>=0.5.0; extra == 'all'
|
|
126
124
|
Requires-Dist: textblob<0.18,>=0.17.1; extra == 'all'
|
|
127
|
-
Requires-Dist: torch; extra == 'all'
|
|
128
125
|
Requires-Dist: transformers<5,>=4; extra == 'all'
|
|
129
126
|
Requires-Dist: tree-sitter-python<0.24,>=0.23.6; extra == 'all'
|
|
130
127
|
Requires-Dist: tree-sitter<0.24,>=0.23.2; extra == 'all'
|
|
@@ -136,6 +133,7 @@ Requires-Dist: types-requests<3,>=2.31.0; extra == 'all'
|
|
|
136
133
|
Requires-Dist: types-setuptools<70,>=69.2.0; extra == 'all'
|
|
137
134
|
Requires-Dist: types-tqdm<5,>=4.66.0; extra == 'all'
|
|
138
135
|
Requires-Dist: unstructured==0.16.20; extra == 'all'
|
|
136
|
+
Requires-Dist: weaviate-client>=4.15.0; extra == 'all'
|
|
139
137
|
Requires-Dist: wikipedia<2,>=1; extra == 'all'
|
|
140
138
|
Requires-Dist: wolframalpha<6,>=5.0.0; extra == 'all'
|
|
141
139
|
Requires-Dist: xls2xlsx>=0.2.0; extra == 'all'
|
|
@@ -160,6 +158,7 @@ Requires-Dist: rouge<2,>=1.0.1; extra == 'data-tools'
|
|
|
160
158
|
Requires-Dist: stripe<12,>=11.3.0; extra == 'data-tools'
|
|
161
159
|
Requires-Dist: textblob<0.18,>=0.17.1; extra == 'data-tools'
|
|
162
160
|
Provides-Extra: dev
|
|
161
|
+
Requires-Dist: flask>=2.0; extra == 'dev'
|
|
163
162
|
Requires-Dist: gradio<4,>=3; extra == 'dev'
|
|
164
163
|
Requires-Dist: mock<6,>=5; extra == 'dev'
|
|
165
164
|
Requires-Dist: mypy<2,>=1.5.1; extra == 'dev'
|
|
@@ -184,6 +183,7 @@ Requires-Dist: docker<8,>=7.1.0; extra == 'dev-tools'
|
|
|
184
183
|
Requires-Dist: e2b-code-interpreter<2,>=1.0.3; extra == 'dev-tools'
|
|
185
184
|
Requires-Dist: ipykernel<7,>=6.0.0; extra == 'dev-tools'
|
|
186
185
|
Requires-Dist: jupyter-client<9,>=8.6.2; extra == 'dev-tools'
|
|
186
|
+
Requires-Dist: langfuse>=2.60.5; extra == 'dev-tools'
|
|
187
187
|
Requires-Dist: mcp>=1.3.0; extra == 'dev-tools'
|
|
188
188
|
Requires-Dist: tree-sitter-python<0.24,>=0.23.6; extra == 'dev-tools'
|
|
189
189
|
Requires-Dist: tree-sitter<0.24,>=0.23.2; extra == 'dev-tools'
|
|
@@ -215,13 +215,11 @@ Requires-Dist: tabulate>=0.9.0; extra == 'document-tools'
|
|
|
215
215
|
Requires-Dist: unstructured==0.16.20; extra == 'document-tools'
|
|
216
216
|
Requires-Dist: xls2xlsx>=0.2.0; extra == 'document-tools'
|
|
217
217
|
Provides-Extra: huggingface
|
|
218
|
-
Requires-Dist: accelerate<0.27,>=0.26.0; extra == 'huggingface'
|
|
219
218
|
Requires-Dist: datasets<4,>=3; extra == 'huggingface'
|
|
220
219
|
Requires-Dist: diffusers<0.26,>=0.25.0; extra == 'huggingface'
|
|
221
|
-
Requires-Dist:
|
|
220
|
+
Requires-Dist: huggingface-hub; extra == 'huggingface'
|
|
222
221
|
Requires-Dist: sentencepiece<0.3,>=0.2; extra == 'huggingface'
|
|
223
222
|
Requires-Dist: soundfile<0.14,>=0.13; extra == 'huggingface'
|
|
224
|
-
Requires-Dist: torch; extra == 'huggingface'
|
|
225
223
|
Requires-Dist: transformers<5,>=4; extra == 'huggingface'
|
|
226
224
|
Provides-Extra: media-tools
|
|
227
225
|
Requires-Dist: ffmpeg-python<0.3,>=0.2.0; extra == 'media-tools'
|
|
@@ -258,9 +256,7 @@ Requires-Dist: mcp-simple-arxiv==0.2.2; extra == 'owl'
|
|
|
258
256
|
Requires-Dist: newspaper3k<0.3,>=0.2.8; extra == 'owl'
|
|
259
257
|
Requires-Dist: numpy<=2.2,>=1.2; extra == 'owl'
|
|
260
258
|
Requires-Dist: openapi-spec-validator<0.8,>=0.7.1; extra == 'owl'
|
|
261
|
-
Requires-Dist: opencv-python<5,>=4; extra == 'owl'
|
|
262
259
|
Requires-Dist: openpyxl>=3.1.5; extra == 'owl'
|
|
263
|
-
Requires-Dist: outlines<0.2,>=0.1.7; extra == 'owl'
|
|
264
260
|
Requires-Dist: pandas<2,>=1.5.3; extra == 'owl'
|
|
265
261
|
Requires-Dist: pandasai<3,>=2.3.0; extra == 'owl'
|
|
266
262
|
Requires-Dist: playwright>=1.50.0; extra == 'owl'
|
|
@@ -301,8 +297,8 @@ Requires-Dist: pyobvector>=0.1.18; extra == 'rag'
|
|
|
301
297
|
Requires-Dist: pytidb-experimental==0.0.1.dev4; extra == 'rag'
|
|
302
298
|
Requires-Dist: qdrant-client<2,>=1.9.0; extra == 'rag'
|
|
303
299
|
Requires-Dist: rank-bm25<0.3,>=0.2.2; extra == 'rag'
|
|
304
|
-
Requires-Dist: sentence-transformers<4,>=3.0.1; extra == 'rag'
|
|
305
300
|
Requires-Dist: unstructured==0.16.20; extra == 'rag'
|
|
301
|
+
Requires-Dist: weaviate-client>=4.15.0; extra == 'rag'
|
|
306
302
|
Provides-Extra: research-tools
|
|
307
303
|
Requires-Dist: arxiv2text<0.2,>=0.1.14; extra == 'research-tools'
|
|
308
304
|
Requires-Dist: arxiv<3,>=2.1.3; extra == 'research-tools'
|
|
@@ -320,6 +316,7 @@ Requires-Dist: pyobvector>=0.1.18; extra == 'storage'
|
|
|
320
316
|
Requires-Dist: pytidb-experimental==0.0.1.dev4; extra == 'storage'
|
|
321
317
|
Requires-Dist: qdrant-client<2,>=1.9.0; extra == 'storage'
|
|
322
318
|
Requires-Dist: redis<6,>=5.0.6; extra == 'storage'
|
|
319
|
+
Requires-Dist: weaviate-client>=4.15.0; extra == 'storage'
|
|
323
320
|
Provides-Extra: test
|
|
324
321
|
Requires-Dist: mock<6,>=5; extra == 'test'
|
|
325
322
|
Requires-Dist: pytest-asyncio<0.24,>=0.23.0; extra == 'test'
|
|
@@ -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(
|
|
@@ -151,8 +160,10 @@ class ChatAgent(BaseAgent):
|
|
|
151
160
|
(default: :obj:`None`)
|
|
152
161
|
scheduling_strategy (str): name of function that defines how to select
|
|
153
162
|
the next model in ModelManager. (default: :str:`round_robin`)
|
|
154
|
-
|
|
155
|
-
|
|
163
|
+
max_iteration (Optional[int], optional): Maximum number of model
|
|
164
|
+
calling iterations allowed per step. If `None` (default), there's
|
|
165
|
+
no explicit limit. If `1`, it performs a single model call. If `N
|
|
166
|
+
> 1`, it allows up to N model calls. (default: :obj:`None`)
|
|
156
167
|
agent_id (str, optional): The ID of the agent. If not provided, a
|
|
157
168
|
random UUID will be generated. (default: :obj:`None`)
|
|
158
169
|
stop_event (Optional[threading.Event], optional): Event to signal
|
|
@@ -188,7 +199,7 @@ class ChatAgent(BaseAgent):
|
|
|
188
199
|
] = None,
|
|
189
200
|
response_terminators: Optional[List[ResponseTerminator]] = None,
|
|
190
201
|
scheduling_strategy: str = "round_robin",
|
|
191
|
-
|
|
202
|
+
max_iteration: Optional[int] = None,
|
|
192
203
|
agent_id: Optional[str] = None,
|
|
193
204
|
stop_event: Optional[threading.Event] = None,
|
|
194
205
|
) -> None:
|
|
@@ -204,7 +215,7 @@ class ChatAgent(BaseAgent):
|
|
|
204
215
|
self.model_type = self.model_backend.model_type
|
|
205
216
|
|
|
206
217
|
# Assign unique ID
|
|
207
|
-
self.agent_id = agent_id if agent_id else str(uuid.uuid4())
|
|
218
|
+
self.agent_id = agent_id if agent_id else str(uuid.uuid4())
|
|
208
219
|
|
|
209
220
|
# Set up memory
|
|
210
221
|
context_creator = ScoreBasedContextCreator(
|
|
@@ -263,7 +274,7 @@ class ChatAgent(BaseAgent):
|
|
|
263
274
|
# Set up other properties
|
|
264
275
|
self.terminated = False
|
|
265
276
|
self.response_terminators = response_terminators or []
|
|
266
|
-
self.
|
|
277
|
+
self.max_iteration = max_iteration
|
|
267
278
|
self.stop_event = stop_event
|
|
268
279
|
|
|
269
280
|
def reset(self):
|
|
@@ -509,7 +520,7 @@ class ChatAgent(BaseAgent):
|
|
|
509
520
|
memory record. If None, current timestamp will be used.
|
|
510
521
|
(default: :obj:`None`)
|
|
511
522
|
"""
|
|
512
|
-
|
|
523
|
+
import time
|
|
513
524
|
|
|
514
525
|
self.memory.write_record(
|
|
515
526
|
MemoryRecord(
|
|
@@ -517,7 +528,7 @@ class ChatAgent(BaseAgent):
|
|
|
517
528
|
role_at_backend=role,
|
|
518
529
|
timestamp=timestamp
|
|
519
530
|
if timestamp is not None
|
|
520
|
-
else
|
|
531
|
+
else time.time_ns() / 1_000_000_000, # Nanosecond precision
|
|
521
532
|
agent_id=self.agent_id,
|
|
522
533
|
)
|
|
523
534
|
)
|
|
@@ -731,6 +742,7 @@ class ChatAgent(BaseAgent):
|
|
|
731
742
|
message.content = response.output_messages[0].content
|
|
732
743
|
self._try_format_message(message, response_format)
|
|
733
744
|
|
|
745
|
+
@observe()
|
|
734
746
|
def step(
|
|
735
747
|
self,
|
|
736
748
|
input_message: Union[BaseMessage, str],
|
|
@@ -753,6 +765,14 @@ class ChatAgent(BaseAgent):
|
|
|
753
765
|
flag, and session information.
|
|
754
766
|
"""
|
|
755
767
|
|
|
768
|
+
# Set Langfuse session_id using agent_id for trace grouping
|
|
769
|
+
try:
|
|
770
|
+
from camel.utils.langfuse import set_current_agent_session_id
|
|
771
|
+
|
|
772
|
+
set_current_agent_session_id(self.agent_id)
|
|
773
|
+
except ImportError:
|
|
774
|
+
pass # Langfuse not available
|
|
775
|
+
|
|
756
776
|
# Convert input message to BaseMessage if necessary
|
|
757
777
|
if isinstance(input_message, str):
|
|
758
778
|
input_message = BaseMessage.make_user_message(
|
|
@@ -771,6 +791,7 @@ class ChatAgent(BaseAgent):
|
|
|
771
791
|
|
|
772
792
|
# Initialize token usage tracker
|
|
773
793
|
step_token_usage = self._create_token_usage_tracker()
|
|
794
|
+
iteration_count = 0
|
|
774
795
|
|
|
775
796
|
while True:
|
|
776
797
|
try:
|
|
@@ -787,6 +808,7 @@ class ChatAgent(BaseAgent):
|
|
|
787
808
|
response_format,
|
|
788
809
|
self._get_full_tool_schemas(),
|
|
789
810
|
)
|
|
811
|
+
iteration_count += 1
|
|
790
812
|
|
|
791
813
|
# Accumulate API token usage
|
|
792
814
|
self._update_token_usage_tracker(
|
|
@@ -821,7 +843,10 @@ class ChatAgent(BaseAgent):
|
|
|
821
843
|
if external_tool_call_requests:
|
|
822
844
|
break
|
|
823
845
|
|
|
824
|
-
if
|
|
846
|
+
if (
|
|
847
|
+
self.max_iteration is not None
|
|
848
|
+
and iteration_count >= self.max_iteration
|
|
849
|
+
):
|
|
825
850
|
break
|
|
826
851
|
|
|
827
852
|
# If we're still here, continue the loop
|
|
@@ -847,6 +872,7 @@ class ChatAgent(BaseAgent):
|
|
|
847
872
|
openai_messages, _ = self.memory.get_context()
|
|
848
873
|
return openai_messages
|
|
849
874
|
|
|
875
|
+
@observe()
|
|
850
876
|
async def astep(
|
|
851
877
|
self,
|
|
852
878
|
input_message: Union[BaseMessage, str],
|
|
@@ -873,6 +899,13 @@ class ChatAgent(BaseAgent):
|
|
|
873
899
|
a boolean indicating whether the chat session has terminated,
|
|
874
900
|
and information about the chat session.
|
|
875
901
|
"""
|
|
902
|
+
try:
|
|
903
|
+
from camel.utils.langfuse import set_current_agent_session_id
|
|
904
|
+
|
|
905
|
+
set_current_agent_session_id(self.agent_id)
|
|
906
|
+
except ImportError:
|
|
907
|
+
pass # Langfuse not available
|
|
908
|
+
|
|
876
909
|
if isinstance(input_message, str):
|
|
877
910
|
input_message = BaseMessage.make_user_message(
|
|
878
911
|
role_name="User", content=input_message
|
|
@@ -888,6 +921,7 @@ class ChatAgent(BaseAgent):
|
|
|
888
921
|
|
|
889
922
|
# Initialize token usage tracker
|
|
890
923
|
step_token_usage = self._create_token_usage_tracker()
|
|
924
|
+
iteration_count = 0
|
|
891
925
|
while True:
|
|
892
926
|
try:
|
|
893
927
|
openai_messages, num_tokens = self.memory.get_context()
|
|
@@ -903,6 +937,7 @@ class ChatAgent(BaseAgent):
|
|
|
903
937
|
response_format,
|
|
904
938
|
self._get_full_tool_schemas(),
|
|
905
939
|
)
|
|
940
|
+
iteration_count += 1
|
|
906
941
|
|
|
907
942
|
# Terminate Agent if stop_event is set
|
|
908
943
|
if self.stop_event and self.stop_event.is_set():
|
|
@@ -933,7 +968,10 @@ class ChatAgent(BaseAgent):
|
|
|
933
968
|
if external_tool_call_requests:
|
|
934
969
|
break
|
|
935
970
|
|
|
936
|
-
if
|
|
971
|
+
if (
|
|
972
|
+
self.max_iteration is not None
|
|
973
|
+
and iteration_count >= self.max_iteration
|
|
974
|
+
):
|
|
937
975
|
break
|
|
938
976
|
|
|
939
977
|
# If we're still here, continue the loop
|
|
@@ -1331,6 +1369,13 @@ class ChatAgent(BaseAgent):
|
|
|
1331
1369
|
"""
|
|
1332
1370
|
output_messages: List[BaseMessage] = []
|
|
1333
1371
|
for choice in response.choices:
|
|
1372
|
+
# Skip messages with no meaningful content
|
|
1373
|
+
if (
|
|
1374
|
+
choice.message.content is None
|
|
1375
|
+
or choice.message.content.strip() == ""
|
|
1376
|
+
) and not choice.message.tool_calls:
|
|
1377
|
+
continue
|
|
1378
|
+
|
|
1334
1379
|
meta_dict = {}
|
|
1335
1380
|
if logprobs_info := handle_logprobs(choice):
|
|
1336
1381
|
meta_dict["logprobs_info"] = logprobs_info
|
|
@@ -1560,8 +1605,32 @@ class ChatAgent(BaseAgent):
|
|
|
1560
1605
|
args = tool_call_request.args
|
|
1561
1606
|
tool_call_id = tool_call_request.tool_call_id
|
|
1562
1607
|
tool = self._internal_tools[func_name]
|
|
1608
|
+
import asyncio
|
|
1609
|
+
|
|
1563
1610
|
try:
|
|
1564
|
-
|
|
1611
|
+
# Try different invocation paths in order of preference
|
|
1612
|
+
if hasattr(tool, 'func') and hasattr(tool.func, 'async_call'):
|
|
1613
|
+
# Case: FunctionTool wrapping an MCP tool
|
|
1614
|
+
result = await tool.func.async_call(**args)
|
|
1615
|
+
|
|
1616
|
+
elif hasattr(tool, 'async_call') and callable(tool.async_call):
|
|
1617
|
+
# Case: tool itself has async_call
|
|
1618
|
+
result = await tool.async_call(**args)
|
|
1619
|
+
|
|
1620
|
+
elif hasattr(tool, 'func') and asyncio.iscoroutinefunction(
|
|
1621
|
+
tool.func
|
|
1622
|
+
):
|
|
1623
|
+
# Case: tool wraps a direct async function
|
|
1624
|
+
result = await tool.func(**args)
|
|
1625
|
+
|
|
1626
|
+
elif asyncio.iscoroutinefunction(tool):
|
|
1627
|
+
# Case: tool is itself a coroutine function
|
|
1628
|
+
result = await tool(**args)
|
|
1629
|
+
|
|
1630
|
+
else:
|
|
1631
|
+
# Fallback: synchronous call
|
|
1632
|
+
result = tool(**args)
|
|
1633
|
+
|
|
1565
1634
|
except Exception as e:
|
|
1566
1635
|
# Capture the error message to prevent framework crash
|
|
1567
1636
|
error_msg = f"Error executing async tool '{func_name}': {e!s}"
|
|
@@ -1599,17 +1668,24 @@ class ChatAgent(BaseAgent):
|
|
|
1599
1668
|
tool_call_id=tool_call_id,
|
|
1600
1669
|
)
|
|
1601
1670
|
|
|
1602
|
-
# Use
|
|
1671
|
+
# Use precise timestamps to ensure correct ordering
|
|
1603
1672
|
# This ensures the assistant message (tool call) always appears before
|
|
1604
1673
|
# the function message (tool result) in the conversation context
|
|
1605
|
-
|
|
1674
|
+
# Use time.time_ns() for nanosecond precision to avoid collisions
|
|
1675
|
+
import time
|
|
1676
|
+
|
|
1677
|
+
current_time_ns = time.time_ns()
|
|
1678
|
+
base_timestamp = current_time_ns / 1_000_000_000 # Convert to seconds
|
|
1679
|
+
|
|
1606
1680
|
self.update_memory(
|
|
1607
|
-
assist_msg, OpenAIBackendRole.ASSISTANT, timestamp=
|
|
1681
|
+
assist_msg, OpenAIBackendRole.ASSISTANT, timestamp=base_timestamp
|
|
1608
1682
|
)
|
|
1683
|
+
|
|
1684
|
+
# Add minimal increment to ensure function message comes after
|
|
1609
1685
|
self.update_memory(
|
|
1610
1686
|
func_msg,
|
|
1611
1687
|
OpenAIBackendRole.FUNCTION,
|
|
1612
|
-
timestamp=
|
|
1688
|
+
timestamp=base_timestamp + 1e-6,
|
|
1613
1689
|
)
|
|
1614
1690
|
|
|
1615
1691
|
# Record information about this tool call
|
|
@@ -1690,7 +1766,7 @@ class ChatAgent(BaseAgent):
|
|
|
1690
1766
|
],
|
|
1691
1767
|
response_terminators=self.response_terminators,
|
|
1692
1768
|
scheduling_strategy=self.model_backend.scheduling_strategy.__name__,
|
|
1693
|
-
|
|
1769
|
+
max_iteration=self.max_iteration,
|
|
1694
1770
|
stop_event=self.stop_event,
|
|
1695
1771
|
)
|
|
1696
1772
|
|
|
@@ -1714,6 +1790,7 @@ class ChatAgent(BaseAgent):
|
|
|
1714
1790
|
f"ChatAgent({self.role_name}, {self.role_type}, {self.model_type})"
|
|
1715
1791
|
)
|
|
1716
1792
|
|
|
1793
|
+
@dependencies_required("mcp")
|
|
1717
1794
|
def to_mcp(
|
|
1718
1795
|
self,
|
|
1719
1796
|
name: str = "CAMEL-ChatAgent",
|
|
@@ -1740,13 +1817,7 @@ class ChatAgent(BaseAgent):
|
|
|
1740
1817
|
Returns:
|
|
1741
1818
|
FastMCP: An MCP server instance that can be run.
|
|
1742
1819
|
"""
|
|
1743
|
-
|
|
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
|
-
)
|
|
1820
|
+
from mcp.server.fastmcp import FastMCP
|
|
1750
1821
|
|
|
1751
1822
|
# Combine dependencies
|
|
1752
1823
|
all_dependencies = ["camel-ai[all]"]
|
|
@@ -1837,7 +1908,7 @@ class ChatAgent(BaseAgent):
|
|
|
1837
1908
|
"description": tool.get_function_description() or "",
|
|
1838
1909
|
"parameters": [
|
|
1839
1910
|
{"name": param_name, "type": str(param_type)}
|
|
1840
|
-
for param_name, param_type in tool.
|
|
1911
|
+
for param_name, param_type in tool.parameters.items()
|
|
1841
1912
|
],
|
|
1842
1913
|
}
|
|
1843
1914
|
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
|
|
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
# Mock Website Benchmarks for Web Agent Testing
|
|
2
|
+
|
|
3
|
+
This project provides a framework for testing web agents against various mock websites. It features a central dispatcher (`mock_web.py`) that manages different test environments, each simulating a specific type of website (e.g., an e-commerce site). The initial example project is an Amazon-like shopping website.
|
|
4
|
+
|
|
5
|
+
## Core Concepts
|
|
6
|
+
|
|
7
|
+
* **Dispatcher (`mock_web.py`):** The single entry point for running any benchmark. It handles:
|
|
8
|
+
* Downloading necessary web assets (HTML templates, CSS, JS) for a specific project from Hugging Face (https://huggingface.co/datasets/camel-ai/mock_websites).
|
|
9
|
+
* Reading the task configuration from `task.json`.
|
|
10
|
+
* Launching the project's dedicated Flask web server as a background process.
|
|
11
|
+
* Monitoring the server for task completion via API polling.
|
|
12
|
+
* Reporting the final results (success status, number of operations) and shutting down the server.
|
|
13
|
+
* **Projects (e.g., `shopping_mall/`):** Each project is a self-contained Flask application representing a unique website.
|
|
14
|
+
* **Task Configuration (`task.json`):** A central JSON file that defines the environment and the goal for the agent.
|
|
15
|
+
|
|
16
|
+
## Example Project: `shopping_mall`
|
|
17
|
+
|
|
18
|
+
The included `shopping_mall` project simulates an e-commerce website with the following features:
|
|
19
|
+
* **Product Display:** View a list of products with images, descriptions, ratings, and prices.
|
|
20
|
+
* **Product Detail Pages:** Click on a product to see its dedicated detail page.
|
|
21
|
+
* **Shopping Cart:** Add products, view the cart, and manage its contents.
|
|
22
|
+
* **API-Driven:** The backend provides API endpoints for all state-changing actions.
|
|
23
|
+
|
|
24
|
+
## Setup and Usage
|
|
25
|
+
|
|
26
|
+
1. **Install Dependencies:**
|
|
27
|
+
```bash
|
|
28
|
+
pip install -r requirements.txt
|
|
29
|
+
```
|
|
30
|
+
This will install `Flask`, `huggingface-hub`, `requests`, and other necessary packages.
|
|
31
|
+
|
|
32
|
+
2. **Configure the Task:**
|
|
33
|
+
Edit the `task.json` file to define the products available on the website and the agent's goal. The structure is as follows:
|
|
34
|
+
```json
|
|
35
|
+
{
|
|
36
|
+
"products": [
|
|
37
|
+
{
|
|
38
|
+
"id": 1,
|
|
39
|
+
"name": "Gaming Laptop",
|
|
40
|
+
"price": 1200,
|
|
41
|
+
"image": "assets/img/products/laptop.jpg",
|
|
42
|
+
"category": "Electronics",
|
|
43
|
+
"rating": 4.5,
|
|
44
|
+
"description": "High-performance gaming laptop with latest specs."
|
|
45
|
+
}
|
|
46
|
+
],
|
|
47
|
+
"ground_truth_cart": [
|
|
48
|
+
{
|
|
49
|
+
"id": 1,
|
|
50
|
+
"quantity": 1
|
|
51
|
+
}
|
|
52
|
+
]
|
|
53
|
+
}
|
|
54
|
+
```
|
|
55
|
+
* `products`: A list of all product objects available in the environment.
|
|
56
|
+
* `ground_truth_cart`: A list of items that defines the target state of the shopping cart for the task to be considered complete.
|
|
57
|
+
|
|
58
|
+
3. **Running the Benchmark:**
|
|
59
|
+
Use the `mock_web.py` dispatcher to run a project.
|
|
60
|
+
```bash
|
|
61
|
+
python mock_web.py --project shopping_mall
|
|
62
|
+
```
|
|
63
|
+
* `--project`: Specifies which mock website project to run (default: `shopping_mall`).
|
|
64
|
+
* `--port`: Specifies the port to run the server on (default: `5001`).
|
|
65
|
+
|
|
66
|
+
The dispatcher will start the server and begin polling for task completion. You or your agent can then interact with the website at `http://127.0.0.1:5001/`. Once the conditions defined in `ground_truth_cart` are met, the dispatcher will automatically detect it, report the results, and shut down. You can also stop it early by pressing `Ctrl+C`.
|
|
67
|
+
|
|
68
|
+
## Logging
|
|
69
|
+
|
|
70
|
+
* `dispatcher.log`: High-level log from the dispatcher, showing setup, status, and final results.
|
|
71
|
+
* `shopping_mall/app.log`: Detailed internal log from the Flask application for the `shopping_mall` project.
|
|
72
|
+
|
|
73
|
+
## Project Structure
|
|
74
|
+
|
|
75
|
+
```
|
|
76
|
+
.
|
|
77
|
+
├── mock_web.py # Main dispatcher for running benchmarks
|
|
78
|
+
├── task.json # Task configuration file
|
|
79
|
+
├── requirements.txt # Python dependencies
|
|
80
|
+
├── shopping_mall/ # Example project: shopping_mall
|
|
81
|
+
│ └── app.py # Flask application for this project
|
|
82
|
+
├── dispatcher.log # (Generated at runtime)
|
|
83
|
+
└── README.md # This file
|
|
84
|
+
```
|
|
85
|
+
The dispatcher will automatically download project-specific `templates` and `static` folders from Hugging Face Hub and place them inside the corresponding project directory at runtime.
|
|
86
|
+
|
|
87
|
+
## TODO: Automated Question Generation Module
|
|
88
|
+
|
|
89
|
+
A planned future module for this project is the development of an automated question generation system. This system would analyze the current state of the web application environment (e.g., visible elements, available products, cart status) and generate relevant questions or tasks for a web agent to solve.
|
|
90
|
+
|
|
91
|
+
This could involve:
|
|
92
|
+
* Identifying interactable elements and their states.
|
|
93
|
+
* Understanding the current context (e.g., on product page, in cart).
|
|
94
|
+
* Formulating natural language questions or goal descriptions based on this context (e.g., "Find a product under $50 in the Electronics category and add it to the cart," or "What is the current subtotal of the cart after adding two units of item X?").
|
|
95
|
+
|
|
96
|
+
|