camel-ai 0.2.64__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.64 → camel_ai-0.2.65}/PKG-INFO +4 -12
- {camel_ai-0.2.64 → camel_ai-0.2.65}/camel/__init__.py +1 -1
- {camel_ai-0.2.64 → camel_ai-0.2.65}/camel/agents/chat_agent.py +19 -7
- 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.64 → camel_ai-0.2.65}/camel/datasets/models.py +1 -1
- {camel_ai-0.2.64 → camel_ai-0.2.65}/camel/datasets/static_dataset.py +6 -0
- {camel_ai-0.2.64 → camel_ai-0.2.65}/camel/models/openai_model.py +1 -0
- {camel_ai-0.2.64 → camel_ai-0.2.65}/camel/societies/workforce/role_playing_worker.py +9 -1
- {camel_ai-0.2.64 → camel_ai-0.2.65}/camel/societies/workforce/single_agent_worker.py +8 -1
- {camel_ai-0.2.64 → camel_ai-0.2.65}/camel/societies/workforce/utils.py +51 -0
- {camel_ai-0.2.64 → camel_ai-0.2.65}/camel/societies/workforce/workforce.py +3 -3
- {camel_ai-0.2.64 → camel_ai-0.2.65}/camel/tasks/task.py +8 -0
- {camel_ai-0.2.64 → camel_ai-0.2.65}/camel/toolkits/async_browser_toolkit.py +97 -54
- {camel_ai-0.2.64 → camel_ai-0.2.65}/camel/toolkits/browser_toolkit.py +65 -18
- {camel_ai-0.2.64 → camel_ai-0.2.65}/camel/toolkits/function_tool.py +2 -2
- {camel_ai-0.2.64 → 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.64 → camel_ai-0.2.65}/camel/types/enums.py +5 -1
- {camel_ai-0.2.64 → camel_ai-0.2.65}/pyproject.toml +10 -15
- {camel_ai-0.2.64 → camel_ai-0.2.65}/.gitignore +0 -0
- {camel_ai-0.2.64 → camel_ai-0.2.65}/LICENSE +0 -0
- {camel_ai-0.2.64 → camel_ai-0.2.65}/README.md +0 -0
- {camel_ai-0.2.64 → camel_ai-0.2.65}/camel/agents/__init__.py +0 -0
- {camel_ai-0.2.64 → camel_ai-0.2.65}/camel/agents/_types.py +0 -0
- {camel_ai-0.2.64 → camel_ai-0.2.65}/camel/agents/_utils.py +0 -0
- {camel_ai-0.2.64 → camel_ai-0.2.65}/camel/agents/base.py +0 -0
- {camel_ai-0.2.64 → camel_ai-0.2.65}/camel/agents/critic_agent.py +0 -0
- {camel_ai-0.2.64 → camel_ai-0.2.65}/camel/agents/deductive_reasoner_agent.py +0 -0
- {camel_ai-0.2.64 → camel_ai-0.2.65}/camel/agents/embodied_agent.py +0 -0
- {camel_ai-0.2.64 → camel_ai-0.2.65}/camel/agents/knowledge_graph_agent.py +0 -0
- {camel_ai-0.2.64 → camel_ai-0.2.65}/camel/agents/mcp_agent.py +0 -0
- {camel_ai-0.2.64 → camel_ai-0.2.65}/camel/agents/multi_hop_generator_agent.py +0 -0
- {camel_ai-0.2.64 → camel_ai-0.2.65}/camel/agents/programmed_agent_instruction.py +0 -0
- {camel_ai-0.2.64 → camel_ai-0.2.65}/camel/agents/repo_agent.py +0 -0
- {camel_ai-0.2.64 → camel_ai-0.2.65}/camel/agents/role_assignment_agent.py +0 -0
- {camel_ai-0.2.64 → camel_ai-0.2.65}/camel/agents/search_agent.py +0 -0
- {camel_ai-0.2.64 → camel_ai-0.2.65}/camel/agents/task_agent.py +0 -0
- {camel_ai-0.2.64 → camel_ai-0.2.65}/camel/agents/tool_agents/__init__.py +0 -0
- {camel_ai-0.2.64 → camel_ai-0.2.65}/camel/agents/tool_agents/base.py +0 -0
- {camel_ai-0.2.64 → camel_ai-0.2.65}/camel/agents/tool_agents/hugging_face_tool_agent.py +0 -0
- {camel_ai-0.2.64 → camel_ai-0.2.65}/camel/benchmarks/__init__.py +0 -0
- {camel_ai-0.2.64 → camel_ai-0.2.65}/camel/benchmarks/apibank.py +0 -0
- {camel_ai-0.2.64 → camel_ai-0.2.65}/camel/benchmarks/apibench.py +0 -0
- {camel_ai-0.2.64 → camel_ai-0.2.65}/camel/benchmarks/base.py +0 -0
- {camel_ai-0.2.64 → camel_ai-0.2.65}/camel/benchmarks/browsecomp.py +0 -0
- {camel_ai-0.2.64 → camel_ai-0.2.65}/camel/benchmarks/gaia.py +0 -0
- {camel_ai-0.2.64 → camel_ai-0.2.65}/camel/benchmarks/nexus.py +0 -0
- {camel_ai-0.2.64 → camel_ai-0.2.65}/camel/benchmarks/ragbench.py +0 -0
- {camel_ai-0.2.64 → camel_ai-0.2.65}/camel/bots/__init__.py +0 -0
- {camel_ai-0.2.64 → camel_ai-0.2.65}/camel/bots/discord/__init__.py +0 -0
- {camel_ai-0.2.64 → camel_ai-0.2.65}/camel/bots/discord/discord_app.py +0 -0
- {camel_ai-0.2.64 → camel_ai-0.2.65}/camel/bots/discord/discord_installation.py +0 -0
- {camel_ai-0.2.64 → camel_ai-0.2.65}/camel/bots/discord/discord_store.py +0 -0
- {camel_ai-0.2.64 → camel_ai-0.2.65}/camel/bots/slack/__init__.py +0 -0
- {camel_ai-0.2.64 → camel_ai-0.2.65}/camel/bots/slack/models.py +0 -0
- {camel_ai-0.2.64 → camel_ai-0.2.65}/camel/bots/slack/slack_app.py +0 -0
- {camel_ai-0.2.64 → camel_ai-0.2.65}/camel/bots/telegram_bot.py +0 -0
- {camel_ai-0.2.64 → camel_ai-0.2.65}/camel/configs/__init__.py +0 -0
- {camel_ai-0.2.64 → camel_ai-0.2.65}/camel/configs/aiml_config.py +0 -0
- {camel_ai-0.2.64 → camel_ai-0.2.65}/camel/configs/anthropic_config.py +0 -0
- {camel_ai-0.2.64 → camel_ai-0.2.65}/camel/configs/base_config.py +0 -0
- {camel_ai-0.2.64 → camel_ai-0.2.65}/camel/configs/bedrock_config.py +0 -0
- {camel_ai-0.2.64 → camel_ai-0.2.65}/camel/configs/cohere_config.py +0 -0
- {camel_ai-0.2.64 → camel_ai-0.2.65}/camel/configs/crynux_config.py +0 -0
- {camel_ai-0.2.64 → camel_ai-0.2.65}/camel/configs/deepseek_config.py +0 -0
- {camel_ai-0.2.64 → camel_ai-0.2.65}/camel/configs/gemini_config.py +0 -0
- {camel_ai-0.2.64 → camel_ai-0.2.65}/camel/configs/groq_config.py +0 -0
- {camel_ai-0.2.64 → camel_ai-0.2.65}/camel/configs/internlm_config.py +0 -0
- {camel_ai-0.2.64 → camel_ai-0.2.65}/camel/configs/litellm_config.py +0 -0
- {camel_ai-0.2.64 → camel_ai-0.2.65}/camel/configs/lmstudio_config.py +0 -0
- {camel_ai-0.2.64 → camel_ai-0.2.65}/camel/configs/mistral_config.py +0 -0
- {camel_ai-0.2.64 → camel_ai-0.2.65}/camel/configs/modelscope_config.py +0 -0
- {camel_ai-0.2.64 → camel_ai-0.2.65}/camel/configs/moonshot_config.py +0 -0
- {camel_ai-0.2.64 → camel_ai-0.2.65}/camel/configs/netmind_config.py +0 -0
- {camel_ai-0.2.64 → camel_ai-0.2.65}/camel/configs/novita_config.py +0 -0
- {camel_ai-0.2.64 → camel_ai-0.2.65}/camel/configs/nvidia_config.py +0 -0
- {camel_ai-0.2.64 → camel_ai-0.2.65}/camel/configs/ollama_config.py +0 -0
- {camel_ai-0.2.64 → camel_ai-0.2.65}/camel/configs/openai_config.py +0 -0
- {camel_ai-0.2.64 → camel_ai-0.2.65}/camel/configs/openrouter_config.py +0 -0
- {camel_ai-0.2.64 → camel_ai-0.2.65}/camel/configs/ppio_config.py +0 -0
- {camel_ai-0.2.64 → camel_ai-0.2.65}/camel/configs/qwen_config.py +0 -0
- {camel_ai-0.2.64 → camel_ai-0.2.65}/camel/configs/reka_config.py +0 -0
- {camel_ai-0.2.64 → camel_ai-0.2.65}/camel/configs/samba_config.py +0 -0
- {camel_ai-0.2.64 → camel_ai-0.2.65}/camel/configs/sglang_config.py +0 -0
- {camel_ai-0.2.64 → camel_ai-0.2.65}/camel/configs/siliconflow_config.py +0 -0
- {camel_ai-0.2.64 → camel_ai-0.2.65}/camel/configs/togetherai_config.py +0 -0
- {camel_ai-0.2.64 → camel_ai-0.2.65}/camel/configs/vllm_config.py +0 -0
- {camel_ai-0.2.64 → camel_ai-0.2.65}/camel/configs/watsonx_config.py +0 -0
- {camel_ai-0.2.64 → camel_ai-0.2.65}/camel/configs/yi_config.py +0 -0
- {camel_ai-0.2.64 → camel_ai-0.2.65}/camel/configs/zhipuai_config.py +0 -0
- {camel_ai-0.2.64 → camel_ai-0.2.65}/camel/data_collectors/__init__.py +0 -0
- {camel_ai-0.2.64 → camel_ai-0.2.65}/camel/data_collectors/alpaca_collector.py +0 -0
- {camel_ai-0.2.64 → camel_ai-0.2.65}/camel/data_collectors/base.py +0 -0
- {camel_ai-0.2.64 → camel_ai-0.2.65}/camel/data_collectors/sharegpt_collector.py +0 -0
- {camel_ai-0.2.64 → camel_ai-0.2.65}/camel/datagen/__init__.py +0 -0
- {camel_ai-0.2.64 → camel_ai-0.2.65}/camel/datagen/cot_datagen.py +0 -0
- {camel_ai-0.2.64 → camel_ai-0.2.65}/camel/datagen/evol_instruct/__init__.py +0 -0
- {camel_ai-0.2.64 → camel_ai-0.2.65}/camel/datagen/evol_instruct/evol_instruct.py +0 -0
- {camel_ai-0.2.64 → camel_ai-0.2.65}/camel/datagen/evol_instruct/scorer.py +0 -0
- {camel_ai-0.2.64 → camel_ai-0.2.65}/camel/datagen/evol_instruct/templates.py +0 -0
- {camel_ai-0.2.64 → camel_ai-0.2.65}/camel/datagen/self_improving_cot.py +0 -0
- {camel_ai-0.2.64 → camel_ai-0.2.65}/camel/datagen/self_instruct/__init__.py +0 -0
- {camel_ai-0.2.64 → camel_ai-0.2.65}/camel/datagen/self_instruct/filter/__init__.py +0 -0
- {camel_ai-0.2.64 → camel_ai-0.2.65}/camel/datagen/self_instruct/filter/filter_function.py +0 -0
- {camel_ai-0.2.64 → camel_ai-0.2.65}/camel/datagen/self_instruct/filter/filter_registry.py +0 -0
- {camel_ai-0.2.64 → camel_ai-0.2.65}/camel/datagen/self_instruct/filter/instruction_filter.py +0 -0
- {camel_ai-0.2.64 → camel_ai-0.2.65}/camel/datagen/self_instruct/self_instruct.py +0 -0
- {camel_ai-0.2.64 → camel_ai-0.2.65}/camel/datagen/self_instruct/templates.py +0 -0
- {camel_ai-0.2.64 → camel_ai-0.2.65}/camel/datagen/source2synth/__init__.py +0 -0
- {camel_ai-0.2.64 → camel_ai-0.2.65}/camel/datagen/source2synth/data_processor.py +0 -0
- {camel_ai-0.2.64 → camel_ai-0.2.65}/camel/datagen/source2synth/models.py +0 -0
- {camel_ai-0.2.64 → camel_ai-0.2.65}/camel/datagen/source2synth/user_data_processor_config.py +0 -0
- {camel_ai-0.2.64 → camel_ai-0.2.65}/camel/datahubs/__init__.py +0 -0
- {camel_ai-0.2.64 → camel_ai-0.2.65}/camel/datahubs/base.py +0 -0
- {camel_ai-0.2.64 → camel_ai-0.2.65}/camel/datahubs/huggingface.py +0 -0
- {camel_ai-0.2.64 → camel_ai-0.2.65}/camel/datahubs/models.py +0 -0
- {camel_ai-0.2.64 → camel_ai-0.2.65}/camel/datasets/__init__.py +0 -0
- {camel_ai-0.2.64 → camel_ai-0.2.65}/camel/datasets/base_generator.py +0 -0
- {camel_ai-0.2.64 → camel_ai-0.2.65}/camel/datasets/few_shot_generator.py +0 -0
- {camel_ai-0.2.64 → camel_ai-0.2.65}/camel/datasets/self_instruct_generator.py +0 -0
- {camel_ai-0.2.64 → camel_ai-0.2.65}/camel/embeddings/__init__.py +0 -0
- {camel_ai-0.2.64 → camel_ai-0.2.65}/camel/embeddings/azure_embedding.py +0 -0
- {camel_ai-0.2.64 → camel_ai-0.2.65}/camel/embeddings/base.py +0 -0
- {camel_ai-0.2.64 → camel_ai-0.2.65}/camel/embeddings/gemini_embedding.py +0 -0
- {camel_ai-0.2.64 → camel_ai-0.2.65}/camel/embeddings/jina_embedding.py +0 -0
- {camel_ai-0.2.64 → camel_ai-0.2.65}/camel/embeddings/mistral_embedding.py +0 -0
- {camel_ai-0.2.64 → camel_ai-0.2.65}/camel/embeddings/openai_compatible_embedding.py +0 -0
- {camel_ai-0.2.64 → camel_ai-0.2.65}/camel/embeddings/openai_embedding.py +0 -0
- {camel_ai-0.2.64 → camel_ai-0.2.65}/camel/embeddings/sentence_transformers_embeddings.py +0 -0
- {camel_ai-0.2.64 → camel_ai-0.2.65}/camel/embeddings/together_embedding.py +0 -0
- {camel_ai-0.2.64 → camel_ai-0.2.65}/camel/embeddings/vlm_embedding.py +0 -0
- {camel_ai-0.2.64 → camel_ai-0.2.65}/camel/environments/__init__.py +0 -0
- {camel_ai-0.2.64 → camel_ai-0.2.65}/camel/environments/models.py +0 -0
- {camel_ai-0.2.64 → camel_ai-0.2.65}/camel/environments/multi_step.py +0 -0
- {camel_ai-0.2.64 → camel_ai-0.2.65}/camel/environments/single_step.py +0 -0
- {camel_ai-0.2.64 → camel_ai-0.2.65}/camel/environments/tic_tac_toe.py +0 -0
- {camel_ai-0.2.64 → camel_ai-0.2.65}/camel/extractors/__init__.py +0 -0
- {camel_ai-0.2.64 → camel_ai-0.2.65}/camel/extractors/base.py +0 -0
- {camel_ai-0.2.64 → camel_ai-0.2.65}/camel/extractors/python_strategies.py +0 -0
- {camel_ai-0.2.64 → camel_ai-0.2.65}/camel/generators.py +0 -0
- {camel_ai-0.2.64 → camel_ai-0.2.65}/camel/human.py +0 -0
- {camel_ai-0.2.64 → camel_ai-0.2.65}/camel/interpreters/__init__.py +0 -0
- {camel_ai-0.2.64 → camel_ai-0.2.65}/camel/interpreters/base.py +0 -0
- {camel_ai-0.2.64 → camel_ai-0.2.65}/camel/interpreters/docker/Dockerfile +0 -0
- {camel_ai-0.2.64 → camel_ai-0.2.65}/camel/interpreters/docker_interpreter.py +0 -0
- {camel_ai-0.2.64 → camel_ai-0.2.65}/camel/interpreters/e2b_interpreter.py +0 -0
- {camel_ai-0.2.64 → camel_ai-0.2.65}/camel/interpreters/internal_python_interpreter.py +0 -0
- {camel_ai-0.2.64 → camel_ai-0.2.65}/camel/interpreters/interpreter_error.py +0 -0
- {camel_ai-0.2.64 → camel_ai-0.2.65}/camel/interpreters/ipython_interpreter.py +0 -0
- {camel_ai-0.2.64 → camel_ai-0.2.65}/camel/interpreters/subprocess_interpreter.py +0 -0
- {camel_ai-0.2.64 → camel_ai-0.2.65}/camel/loaders/__init__.py +0 -0
- {camel_ai-0.2.64 → camel_ai-0.2.65}/camel/loaders/apify_reader.py +0 -0
- {camel_ai-0.2.64 → camel_ai-0.2.65}/camel/loaders/base_io.py +0 -0
- {camel_ai-0.2.64 → camel_ai-0.2.65}/camel/loaders/chunkr_reader.py +0 -0
- {camel_ai-0.2.64 → camel_ai-0.2.65}/camel/loaders/crawl4ai_reader.py +0 -0
- {camel_ai-0.2.64 → camel_ai-0.2.65}/camel/loaders/firecrawl_reader.py +0 -0
- {camel_ai-0.2.64 → camel_ai-0.2.65}/camel/loaders/jina_url_reader.py +0 -0
- {camel_ai-0.2.64 → camel_ai-0.2.65}/camel/loaders/markitdown.py +0 -0
- {camel_ai-0.2.64 → camel_ai-0.2.65}/camel/loaders/mineru_extractor.py +0 -0
- {camel_ai-0.2.64 → camel_ai-0.2.65}/camel/loaders/mistral_reader.py +0 -0
- {camel_ai-0.2.64 → camel_ai-0.2.65}/camel/loaders/pandas_reader.py +0 -0
- {camel_ai-0.2.64 → camel_ai-0.2.65}/camel/loaders/scrapegraph_reader.py +0 -0
- {camel_ai-0.2.64 → camel_ai-0.2.65}/camel/loaders/unstructured_io.py +0 -0
- {camel_ai-0.2.64 → camel_ai-0.2.65}/camel/logger.py +0 -0
- {camel_ai-0.2.64 → camel_ai-0.2.65}/camel/memories/__init__.py +0 -0
- {camel_ai-0.2.64 → camel_ai-0.2.65}/camel/memories/agent_memories.py +0 -0
- {camel_ai-0.2.64 → camel_ai-0.2.65}/camel/memories/base.py +0 -0
- {camel_ai-0.2.64 → camel_ai-0.2.65}/camel/memories/blocks/__init__.py +0 -0
- {camel_ai-0.2.64 → camel_ai-0.2.65}/camel/memories/blocks/chat_history_block.py +0 -0
- {camel_ai-0.2.64 → camel_ai-0.2.65}/camel/memories/blocks/vectordb_block.py +0 -0
- {camel_ai-0.2.64 → camel_ai-0.2.65}/camel/memories/context_creators/__init__.py +0 -0
- {camel_ai-0.2.64 → camel_ai-0.2.65}/camel/memories/context_creators/score_based.py +0 -0
- {camel_ai-0.2.64 → camel_ai-0.2.65}/camel/memories/records.py +0 -0
- {camel_ai-0.2.64 → camel_ai-0.2.65}/camel/messages/__init__.py +0 -0
- {camel_ai-0.2.64 → camel_ai-0.2.65}/camel/messages/base.py +0 -0
- {camel_ai-0.2.64 → camel_ai-0.2.65}/camel/messages/conversion/__init__.py +0 -0
- {camel_ai-0.2.64 → camel_ai-0.2.65}/camel/messages/conversion/alpaca.py +0 -0
- {camel_ai-0.2.64 → camel_ai-0.2.65}/camel/messages/conversion/conversation_models.py +0 -0
- {camel_ai-0.2.64 → camel_ai-0.2.65}/camel/messages/conversion/sharegpt/__init__.py +0 -0
- {camel_ai-0.2.64 → camel_ai-0.2.65}/camel/messages/conversion/sharegpt/function_call_formatter.py +0 -0
- {camel_ai-0.2.64 → camel_ai-0.2.65}/camel/messages/conversion/sharegpt/hermes/__init__.py +0 -0
- {camel_ai-0.2.64 → camel_ai-0.2.65}/camel/messages/conversion/sharegpt/hermes/hermes_function_formatter.py +0 -0
- {camel_ai-0.2.64 → camel_ai-0.2.65}/camel/messages/func_message.py +0 -0
- {camel_ai-0.2.64 → camel_ai-0.2.65}/camel/models/__init__.py +0 -0
- {camel_ai-0.2.64 → camel_ai-0.2.65}/camel/models/_utils.py +0 -0
- {camel_ai-0.2.64 → camel_ai-0.2.65}/camel/models/aiml_model.py +0 -0
- {camel_ai-0.2.64 → camel_ai-0.2.65}/camel/models/anthropic_model.py +0 -0
- {camel_ai-0.2.64 → camel_ai-0.2.65}/camel/models/aws_bedrock_model.py +0 -0
- {camel_ai-0.2.64 → camel_ai-0.2.65}/camel/models/azure_openai_model.py +0 -0
- {camel_ai-0.2.64 → camel_ai-0.2.65}/camel/models/base_audio_model.py +0 -0
- {camel_ai-0.2.64 → camel_ai-0.2.65}/camel/models/base_model.py +0 -0
- {camel_ai-0.2.64 → camel_ai-0.2.65}/camel/models/cohere_model.py +0 -0
- {camel_ai-0.2.64 → camel_ai-0.2.65}/camel/models/crynux_model.py +0 -0
- {camel_ai-0.2.64 → camel_ai-0.2.65}/camel/models/deepseek_model.py +0 -0
- {camel_ai-0.2.64 → camel_ai-0.2.65}/camel/models/fish_audio_model.py +0 -0
- {camel_ai-0.2.64 → camel_ai-0.2.65}/camel/models/gemini_model.py +0 -0
- {camel_ai-0.2.64 → camel_ai-0.2.65}/camel/models/groq_model.py +0 -0
- {camel_ai-0.2.64 → camel_ai-0.2.65}/camel/models/internlm_model.py +0 -0
- {camel_ai-0.2.64 → camel_ai-0.2.65}/camel/models/litellm_model.py +0 -0
- {camel_ai-0.2.64 → camel_ai-0.2.65}/camel/models/lmstudio_model.py +0 -0
- {camel_ai-0.2.64 → camel_ai-0.2.65}/camel/models/mistral_model.py +0 -0
- {camel_ai-0.2.64 → camel_ai-0.2.65}/camel/models/model_factory.py +0 -0
- {camel_ai-0.2.64 → camel_ai-0.2.65}/camel/models/model_manager.py +0 -0
- {camel_ai-0.2.64 → camel_ai-0.2.65}/camel/models/modelscope_model.py +0 -0
- {camel_ai-0.2.64 → camel_ai-0.2.65}/camel/models/moonshot_model.py +0 -0
- {camel_ai-0.2.64 → camel_ai-0.2.65}/camel/models/nemotron_model.py +0 -0
- {camel_ai-0.2.64 → camel_ai-0.2.65}/camel/models/netmind_model.py +0 -0
- {camel_ai-0.2.64 → camel_ai-0.2.65}/camel/models/novita_model.py +0 -0
- {camel_ai-0.2.64 → camel_ai-0.2.65}/camel/models/nvidia_model.py +0 -0
- {camel_ai-0.2.64 → camel_ai-0.2.65}/camel/models/ollama_model.py +0 -0
- {camel_ai-0.2.64 → camel_ai-0.2.65}/camel/models/openai_audio_models.py +0 -0
- {camel_ai-0.2.64 → camel_ai-0.2.65}/camel/models/openai_compatible_model.py +0 -0
- {camel_ai-0.2.64 → camel_ai-0.2.65}/camel/models/openrouter_model.py +0 -0
- {camel_ai-0.2.64 → camel_ai-0.2.65}/camel/models/ppio_model.py +0 -0
- {camel_ai-0.2.64 → camel_ai-0.2.65}/camel/models/qwen_model.py +0 -0
- {camel_ai-0.2.64 → camel_ai-0.2.65}/camel/models/reka_model.py +0 -0
- {camel_ai-0.2.64 → camel_ai-0.2.65}/camel/models/reward/__init__.py +0 -0
- {camel_ai-0.2.64 → camel_ai-0.2.65}/camel/models/reward/base_reward_model.py +0 -0
- {camel_ai-0.2.64 → camel_ai-0.2.65}/camel/models/reward/evaluator.py +0 -0
- {camel_ai-0.2.64 → camel_ai-0.2.65}/camel/models/reward/nemotron_model.py +0 -0
- {camel_ai-0.2.64 → camel_ai-0.2.65}/camel/models/reward/skywork_model.py +0 -0
- {camel_ai-0.2.64 → camel_ai-0.2.65}/camel/models/samba_model.py +0 -0
- {camel_ai-0.2.64 → camel_ai-0.2.65}/camel/models/sglang_model.py +0 -0
- {camel_ai-0.2.64 → camel_ai-0.2.65}/camel/models/siliconflow_model.py +0 -0
- {camel_ai-0.2.64 → camel_ai-0.2.65}/camel/models/stub_model.py +0 -0
- {camel_ai-0.2.64 → camel_ai-0.2.65}/camel/models/togetherai_model.py +0 -0
- {camel_ai-0.2.64 → camel_ai-0.2.65}/camel/models/vllm_model.py +0 -0
- {camel_ai-0.2.64 → camel_ai-0.2.65}/camel/models/volcano_model.py +0 -0
- {camel_ai-0.2.64 → camel_ai-0.2.65}/camel/models/watsonx_model.py +0 -0
- {camel_ai-0.2.64 → camel_ai-0.2.65}/camel/models/yi_model.py +0 -0
- {camel_ai-0.2.64 → camel_ai-0.2.65}/camel/models/zhipuai_model.py +0 -0
- {camel_ai-0.2.64 → camel_ai-0.2.65}/camel/personas/__init__.py +0 -0
- {camel_ai-0.2.64 → camel_ai-0.2.65}/camel/personas/persona.py +0 -0
- {camel_ai-0.2.64 → camel_ai-0.2.65}/camel/personas/persona_hub.py +0 -0
- {camel_ai-0.2.64 → camel_ai-0.2.65}/camel/prompts/__init__.py +0 -0
- {camel_ai-0.2.64 → camel_ai-0.2.65}/camel/prompts/ai_society.py +0 -0
- {camel_ai-0.2.64 → camel_ai-0.2.65}/camel/prompts/base.py +0 -0
- {camel_ai-0.2.64 → camel_ai-0.2.65}/camel/prompts/code.py +0 -0
- {camel_ai-0.2.64 → camel_ai-0.2.65}/camel/prompts/evaluation.py +0 -0
- {camel_ai-0.2.64 → camel_ai-0.2.65}/camel/prompts/generate_text_embedding_data.py +0 -0
- {camel_ai-0.2.64 → camel_ai-0.2.65}/camel/prompts/image_craft.py +0 -0
- {camel_ai-0.2.64 → camel_ai-0.2.65}/camel/prompts/misalignment.py +0 -0
- {camel_ai-0.2.64 → camel_ai-0.2.65}/camel/prompts/multi_condition_image_craft.py +0 -0
- {camel_ai-0.2.64 → camel_ai-0.2.65}/camel/prompts/object_recognition.py +0 -0
- {camel_ai-0.2.64 → camel_ai-0.2.65}/camel/prompts/persona_hub.py +0 -0
- {camel_ai-0.2.64 → camel_ai-0.2.65}/camel/prompts/prompt_templates.py +0 -0
- {camel_ai-0.2.64 → camel_ai-0.2.65}/camel/prompts/role_description_prompt_template.py +0 -0
- {camel_ai-0.2.64 → camel_ai-0.2.65}/camel/prompts/solution_extraction.py +0 -0
- {camel_ai-0.2.64 → camel_ai-0.2.65}/camel/prompts/task_prompt_template.py +0 -0
- {camel_ai-0.2.64 → camel_ai-0.2.65}/camel/prompts/translation.py +0 -0
- {camel_ai-0.2.64 → camel_ai-0.2.65}/camel/prompts/video_description_prompt.py +0 -0
- {camel_ai-0.2.64 → camel_ai-0.2.65}/camel/py.typed +0 -0
- {camel_ai-0.2.64 → camel_ai-0.2.65}/camel/responses/__init__.py +0 -0
- {camel_ai-0.2.64 → camel_ai-0.2.65}/camel/responses/agent_responses.py +0 -0
- {camel_ai-0.2.64 → camel_ai-0.2.65}/camel/retrievers/__init__.py +0 -0
- {camel_ai-0.2.64 → camel_ai-0.2.65}/camel/retrievers/auto_retriever.py +0 -0
- {camel_ai-0.2.64 → camel_ai-0.2.65}/camel/retrievers/base.py +0 -0
- {camel_ai-0.2.64 → camel_ai-0.2.65}/camel/retrievers/bm25_retriever.py +0 -0
- {camel_ai-0.2.64 → camel_ai-0.2.65}/camel/retrievers/cohere_rerank_retriever.py +0 -0
- {camel_ai-0.2.64 → camel_ai-0.2.65}/camel/retrievers/hybrid_retrival.py +0 -0
- {camel_ai-0.2.64 → camel_ai-0.2.65}/camel/retrievers/vector_retriever.py +0 -0
- {camel_ai-0.2.64 → camel_ai-0.2.65}/camel/runtimes/__init__.py +0 -0
- {camel_ai-0.2.64 → camel_ai-0.2.65}/camel/runtimes/api.py +0 -0
- {camel_ai-0.2.64 → camel_ai-0.2.65}/camel/runtimes/base.py +0 -0
- {camel_ai-0.2.64 → camel_ai-0.2.65}/camel/runtimes/configs.py +0 -0
- {camel_ai-0.2.64 → camel_ai-0.2.65}/camel/runtimes/daytona_runtime.py +0 -0
- {camel_ai-0.2.64 → camel_ai-0.2.65}/camel/runtimes/docker_runtime.py +0 -0
- {camel_ai-0.2.64 → camel_ai-0.2.65}/camel/runtimes/llm_guard_runtime.py +0 -0
- {camel_ai-0.2.64 → camel_ai-0.2.65}/camel/runtimes/remote_http_runtime.py +0 -0
- {camel_ai-0.2.64 → camel_ai-0.2.65}/camel/runtimes/ubuntu_docker_runtime.py +0 -0
- {camel_ai-0.2.64 → camel_ai-0.2.65}/camel/runtimes/utils/__init__.py +0 -0
- {camel_ai-0.2.64 → camel_ai-0.2.65}/camel/runtimes/utils/function_risk_toolkit.py +0 -0
- {camel_ai-0.2.64 → camel_ai-0.2.65}/camel/runtimes/utils/ignore_risk_toolkit.py +0 -0
- {camel_ai-0.2.64 → camel_ai-0.2.65}/camel/schemas/__init__.py +0 -0
- {camel_ai-0.2.64 → camel_ai-0.2.65}/camel/schemas/base.py +0 -0
- {camel_ai-0.2.64 → camel_ai-0.2.65}/camel/schemas/openai_converter.py +0 -0
- {camel_ai-0.2.64 → camel_ai-0.2.65}/camel/schemas/outlines_converter.py +0 -0
- {camel_ai-0.2.64 → camel_ai-0.2.65}/camel/societies/__init__.py +0 -0
- {camel_ai-0.2.64 → camel_ai-0.2.65}/camel/societies/babyagi_playing.py +0 -0
- {camel_ai-0.2.64 → camel_ai-0.2.65}/camel/societies/role_playing.py +0 -0
- {camel_ai-0.2.64 → camel_ai-0.2.65}/camel/societies/workforce/__init__.py +0 -0
- {camel_ai-0.2.64 → camel_ai-0.2.65}/camel/societies/workforce/base.py +0 -0
- {camel_ai-0.2.64 → camel_ai-0.2.65}/camel/societies/workforce/prompts.py +0 -0
- {camel_ai-0.2.64 → camel_ai-0.2.65}/camel/societies/workforce/task_channel.py +0 -0
- {camel_ai-0.2.64 → camel_ai-0.2.65}/camel/societies/workforce/worker.py +0 -0
- {camel_ai-0.2.64 → camel_ai-0.2.65}/camel/storages/__init__.py +0 -0
- {camel_ai-0.2.64 → camel_ai-0.2.65}/camel/storages/graph_storages/__init__.py +0 -0
- {camel_ai-0.2.64 → camel_ai-0.2.65}/camel/storages/graph_storages/base.py +0 -0
- {camel_ai-0.2.64 → camel_ai-0.2.65}/camel/storages/graph_storages/graph_element.py +0 -0
- {camel_ai-0.2.64 → camel_ai-0.2.65}/camel/storages/graph_storages/nebula_graph.py +0 -0
- {camel_ai-0.2.64 → camel_ai-0.2.65}/camel/storages/graph_storages/neo4j_graph.py +0 -0
- {camel_ai-0.2.64 → camel_ai-0.2.65}/camel/storages/key_value_storages/__init__.py +0 -0
- {camel_ai-0.2.64 → camel_ai-0.2.65}/camel/storages/key_value_storages/base.py +0 -0
- {camel_ai-0.2.64 → camel_ai-0.2.65}/camel/storages/key_value_storages/in_memory.py +0 -0
- {camel_ai-0.2.64 → camel_ai-0.2.65}/camel/storages/key_value_storages/json.py +0 -0
- {camel_ai-0.2.64 → camel_ai-0.2.65}/camel/storages/key_value_storages/mem0_cloud.py +0 -0
- {camel_ai-0.2.64 → camel_ai-0.2.65}/camel/storages/key_value_storages/redis.py +0 -0
- {camel_ai-0.2.64 → camel_ai-0.2.65}/camel/storages/object_storages/__init__.py +0 -0
- {camel_ai-0.2.64 → camel_ai-0.2.65}/camel/storages/object_storages/amazon_s3.py +0 -0
- {camel_ai-0.2.64 → camel_ai-0.2.65}/camel/storages/object_storages/azure_blob.py +0 -0
- {camel_ai-0.2.64 → camel_ai-0.2.65}/camel/storages/object_storages/base.py +0 -0
- {camel_ai-0.2.64 → camel_ai-0.2.65}/camel/storages/object_storages/google_cloud.py +0 -0
- {camel_ai-0.2.64 → camel_ai-0.2.65}/camel/storages/vectordb_storages/__init__.py +0 -0
- {camel_ai-0.2.64 → camel_ai-0.2.65}/camel/storages/vectordb_storages/base.py +0 -0
- {camel_ai-0.2.64 → camel_ai-0.2.65}/camel/storages/vectordb_storages/faiss.py +0 -0
- {camel_ai-0.2.64 → camel_ai-0.2.65}/camel/storages/vectordb_storages/milvus.py +0 -0
- {camel_ai-0.2.64 → camel_ai-0.2.65}/camel/storages/vectordb_storages/oceanbase.py +0 -0
- {camel_ai-0.2.64 → camel_ai-0.2.65}/camel/storages/vectordb_storages/qdrant.py +0 -0
- {camel_ai-0.2.64 → camel_ai-0.2.65}/camel/storages/vectordb_storages/tidb.py +0 -0
- {camel_ai-0.2.64 → camel_ai-0.2.65}/camel/storages/vectordb_storages/weaviate.py +0 -0
- {camel_ai-0.2.64 → camel_ai-0.2.65}/camel/tasks/__init__.py +0 -0
- {camel_ai-0.2.64 → camel_ai-0.2.65}/camel/tasks/task_prompt.py +0 -0
- {camel_ai-0.2.64 → camel_ai-0.2.65}/camel/terminators/__init__.py +0 -0
- {camel_ai-0.2.64 → camel_ai-0.2.65}/camel/terminators/base.py +0 -0
- {camel_ai-0.2.64 → camel_ai-0.2.65}/camel/terminators/response_terminator.py +0 -0
- {camel_ai-0.2.64 → camel_ai-0.2.65}/camel/terminators/token_limit_terminator.py +0 -0
- {camel_ai-0.2.64 → camel_ai-0.2.65}/camel/toolkits/__init__.py +0 -0
- {camel_ai-0.2.64 → camel_ai-0.2.65}/camel/toolkits/aci_toolkit.py +0 -0
- {camel_ai-0.2.64 → camel_ai-0.2.65}/camel/toolkits/arxiv_toolkit.py +0 -0
- {camel_ai-0.2.64 → camel_ai-0.2.65}/camel/toolkits/ask_news_toolkit.py +0 -0
- {camel_ai-0.2.64 → camel_ai-0.2.65}/camel/toolkits/audio_analysis_toolkit.py +0 -0
- {camel_ai-0.2.64 → camel_ai-0.2.65}/camel/toolkits/base.py +0 -0
- {camel_ai-0.2.64 → camel_ai-0.2.65}/camel/toolkits/bohrium_toolkit.py +0 -0
- {camel_ai-0.2.64 → camel_ai-0.2.65}/camel/toolkits/browser_toolkit_commons.py +0 -0
- {camel_ai-0.2.64 → camel_ai-0.2.65}/camel/toolkits/code_execution.py +0 -0
- {camel_ai-0.2.64 → camel_ai-0.2.65}/camel/toolkits/dalle_toolkit.py +0 -0
- {camel_ai-0.2.64 → camel_ai-0.2.65}/camel/toolkits/dappier_toolkit.py +0 -0
- {camel_ai-0.2.64 → camel_ai-0.2.65}/camel/toolkits/data_commons_toolkit.py +0 -0
- {camel_ai-0.2.64 → camel_ai-0.2.65}/camel/toolkits/excel_toolkit.py +0 -0
- {camel_ai-0.2.64 → camel_ai-0.2.65}/camel/toolkits/file_write_toolkit.py +0 -0
- {camel_ai-0.2.64 → camel_ai-0.2.65}/camel/toolkits/github_toolkit.py +0 -0
- {camel_ai-0.2.64 → camel_ai-0.2.65}/camel/toolkits/google_calendar_toolkit.py +0 -0
- {camel_ai-0.2.64 → camel_ai-0.2.65}/camel/toolkits/google_maps_toolkit.py +0 -0
- {camel_ai-0.2.64 → camel_ai-0.2.65}/camel/toolkits/google_scholar_toolkit.py +0 -0
- {camel_ai-0.2.64 → camel_ai-0.2.65}/camel/toolkits/human_toolkit.py +0 -0
- {camel_ai-0.2.64 → camel_ai-0.2.65}/camel/toolkits/image_analysis_toolkit.py +0 -0
- {camel_ai-0.2.64 → camel_ai-0.2.65}/camel/toolkits/jina_reranker_toolkit.py +0 -0
- {camel_ai-0.2.64 → camel_ai-0.2.65}/camel/toolkits/klavis_toolkit.py +0 -0
- {camel_ai-0.2.64 → camel_ai-0.2.65}/camel/toolkits/linkedin_toolkit.py +0 -0
- {camel_ai-0.2.64 → camel_ai-0.2.65}/camel/toolkits/math_toolkit.py +0 -0
- {camel_ai-0.2.64 → camel_ai-0.2.65}/camel/toolkits/mcp_toolkit.py +0 -0
- {camel_ai-0.2.64 → camel_ai-0.2.65}/camel/toolkits/memory_toolkit.py +0 -0
- {camel_ai-0.2.64 → camel_ai-0.2.65}/camel/toolkits/meshy_toolkit.py +0 -0
- {camel_ai-0.2.64 → camel_ai-0.2.65}/camel/toolkits/mineru_toolkit.py +0 -0
- {camel_ai-0.2.64 → camel_ai-0.2.65}/camel/toolkits/networkx_toolkit.py +0 -0
- {camel_ai-0.2.64 → camel_ai-0.2.65}/camel/toolkits/notion_toolkit.py +0 -0
- {camel_ai-0.2.64 → camel_ai-0.2.65}/camel/toolkits/open_api_specs/biztoc/__init__.py +0 -0
- {camel_ai-0.2.64 → camel_ai-0.2.65}/camel/toolkits/open_api_specs/biztoc/ai-plugin.json +0 -0
- {camel_ai-0.2.64 → camel_ai-0.2.65}/camel/toolkits/open_api_specs/biztoc/openapi.yaml +0 -0
- {camel_ai-0.2.64 → camel_ai-0.2.65}/camel/toolkits/open_api_specs/coursera/__init__.py +0 -0
- {camel_ai-0.2.64 → camel_ai-0.2.65}/camel/toolkits/open_api_specs/coursera/openapi.yaml +0 -0
- {camel_ai-0.2.64 → camel_ai-0.2.65}/camel/toolkits/open_api_specs/create_qr_code/__init__.py +0 -0
- {camel_ai-0.2.64 → camel_ai-0.2.65}/camel/toolkits/open_api_specs/create_qr_code/openapi.yaml +0 -0
- {camel_ai-0.2.64 → camel_ai-0.2.65}/camel/toolkits/open_api_specs/klarna/__init__.py +0 -0
- {camel_ai-0.2.64 → camel_ai-0.2.65}/camel/toolkits/open_api_specs/klarna/openapi.yaml +0 -0
- {camel_ai-0.2.64 → camel_ai-0.2.65}/camel/toolkits/open_api_specs/nasa_apod/__init__.py +0 -0
- {camel_ai-0.2.64 → camel_ai-0.2.65}/camel/toolkits/open_api_specs/nasa_apod/openapi.yaml +0 -0
- {camel_ai-0.2.64 → camel_ai-0.2.65}/camel/toolkits/open_api_specs/outschool/__init__.py +0 -0
- {camel_ai-0.2.64 → camel_ai-0.2.65}/camel/toolkits/open_api_specs/outschool/ai-plugin.json +0 -0
- {camel_ai-0.2.64 → camel_ai-0.2.65}/camel/toolkits/open_api_specs/outschool/openapi.yaml +0 -0
- {camel_ai-0.2.64 → camel_ai-0.2.65}/camel/toolkits/open_api_specs/outschool/paths/__init__.py +0 -0
- {camel_ai-0.2.64 → camel_ai-0.2.65}/camel/toolkits/open_api_specs/outschool/paths/get_classes.py +0 -0
- {camel_ai-0.2.64 → camel_ai-0.2.65}/camel/toolkits/open_api_specs/outschool/paths/search_teachers.py +0 -0
- {camel_ai-0.2.64 → camel_ai-0.2.65}/camel/toolkits/open_api_specs/security_config.py +0 -0
- {camel_ai-0.2.64 → camel_ai-0.2.65}/camel/toolkits/open_api_specs/speak/__init__.py +0 -0
- {camel_ai-0.2.64 → camel_ai-0.2.65}/camel/toolkits/open_api_specs/speak/openapi.yaml +0 -0
- {camel_ai-0.2.64 → camel_ai-0.2.65}/camel/toolkits/open_api_specs/web_scraper/__init__.py +0 -0
- {camel_ai-0.2.64 → camel_ai-0.2.65}/camel/toolkits/open_api_specs/web_scraper/ai-plugin.json +0 -0
- {camel_ai-0.2.64 → camel_ai-0.2.65}/camel/toolkits/open_api_specs/web_scraper/openapi.yaml +0 -0
- {camel_ai-0.2.64 → camel_ai-0.2.65}/camel/toolkits/open_api_specs/web_scraper/paths/__init__.py +0 -0
- {camel_ai-0.2.64 → camel_ai-0.2.65}/camel/toolkits/open_api_specs/web_scraper/paths/scraper.py +0 -0
- {camel_ai-0.2.64 → camel_ai-0.2.65}/camel/toolkits/open_api_toolkit.py +0 -0
- {camel_ai-0.2.64 → camel_ai-0.2.65}/camel/toolkits/openai_agent_toolkit.py +0 -0
- {camel_ai-0.2.64 → camel_ai-0.2.65}/camel/toolkits/openbb_toolkit.py +0 -0
- {camel_ai-0.2.64 → camel_ai-0.2.65}/camel/toolkits/page_script.js +0 -0
- {camel_ai-0.2.64 → camel_ai-0.2.65}/camel/toolkits/pptx_toolkit.py +0 -0
- {camel_ai-0.2.64 → camel_ai-0.2.65}/camel/toolkits/pubmed_toolkit.py +0 -0
- {camel_ai-0.2.64 → camel_ai-0.2.65}/camel/toolkits/pulse_mcp_search_toolkit.py +0 -0
- {camel_ai-0.2.64 → camel_ai-0.2.65}/camel/toolkits/pyautogui_toolkit.py +0 -0
- {camel_ai-0.2.64 → camel_ai-0.2.65}/camel/toolkits/reddit_toolkit.py +0 -0
- {camel_ai-0.2.64 → camel_ai-0.2.65}/camel/toolkits/retrieval_toolkit.py +0 -0
- {camel_ai-0.2.64 → camel_ai-0.2.65}/camel/toolkits/search_toolkit.py +0 -0
- {camel_ai-0.2.64 → camel_ai-0.2.65}/camel/toolkits/searxng_toolkit.py +0 -0
- {camel_ai-0.2.64 → camel_ai-0.2.65}/camel/toolkits/semantic_scholar_toolkit.py +0 -0
- {camel_ai-0.2.64 → camel_ai-0.2.65}/camel/toolkits/slack_toolkit.py +0 -0
- {camel_ai-0.2.64 → camel_ai-0.2.65}/camel/toolkits/stripe_toolkit.py +0 -0
- {camel_ai-0.2.64 → camel_ai-0.2.65}/camel/toolkits/sympy_toolkit.py +0 -0
- {camel_ai-0.2.64 → camel_ai-0.2.65}/camel/toolkits/terminal_toolkit.py +0 -0
- {camel_ai-0.2.64 → camel_ai-0.2.65}/camel/toolkits/thinking_toolkit.py +0 -0
- {camel_ai-0.2.64 → camel_ai-0.2.65}/camel/toolkits/twitter_toolkit.py +0 -0
- {camel_ai-0.2.64 → camel_ai-0.2.65}/camel/toolkits/video_analysis_toolkit.py +0 -0
- {camel_ai-0.2.64 → camel_ai-0.2.65}/camel/toolkits/video_download_toolkit.py +0 -0
- {camel_ai-0.2.64 → camel_ai-0.2.65}/camel/toolkits/weather_toolkit.py +0 -0
- {camel_ai-0.2.64 → camel_ai-0.2.65}/camel/toolkits/whatsapp_toolkit.py +0 -0
- {camel_ai-0.2.64 → camel_ai-0.2.65}/camel/toolkits/wolfram_alpha_toolkit.py +0 -0
- {camel_ai-0.2.64 → camel_ai-0.2.65}/camel/toolkits/zapier_toolkit.py +0 -0
- {camel_ai-0.2.64 → camel_ai-0.2.65}/camel/types/__init__.py +0 -0
- {camel_ai-0.2.64 → camel_ai-0.2.65}/camel/types/agents/__init__.py +0 -0
- {camel_ai-0.2.64 → camel_ai-0.2.65}/camel/types/agents/tool_calling_record.py +0 -0
- {camel_ai-0.2.64 → camel_ai-0.2.65}/camel/types/mcp_registries.py +0 -0
- {camel_ai-0.2.64 → camel_ai-0.2.65}/camel/types/openai_types.py +0 -0
- {camel_ai-0.2.64 → camel_ai-0.2.65}/camel/types/unified_model_type.py +0 -0
- {camel_ai-0.2.64 → camel_ai-0.2.65}/camel/utils/__init__.py +0 -0
- {camel_ai-0.2.64 → camel_ai-0.2.65}/camel/utils/async_func.py +0 -0
- {camel_ai-0.2.64 → camel_ai-0.2.65}/camel/utils/chunker/__init__.py +0 -0
- {camel_ai-0.2.64 → camel_ai-0.2.65}/camel/utils/chunker/base.py +0 -0
- {camel_ai-0.2.64 → camel_ai-0.2.65}/camel/utils/chunker/code_chunker.py +0 -0
- {camel_ai-0.2.64 → camel_ai-0.2.65}/camel/utils/chunker/uio_chunker.py +0 -0
- {camel_ai-0.2.64 → camel_ai-0.2.65}/camel/utils/commons.py +0 -0
- {camel_ai-0.2.64 → camel_ai-0.2.65}/camel/utils/constants.py +0 -0
- {camel_ai-0.2.64 → camel_ai-0.2.65}/camel/utils/deduplication.py +0 -0
- {camel_ai-0.2.64 → camel_ai-0.2.65}/camel/utils/filename.py +0 -0
- {camel_ai-0.2.64 → camel_ai-0.2.65}/camel/utils/langfuse.py +0 -0
- {camel_ai-0.2.64 → camel_ai-0.2.65}/camel/utils/mcp.py +0 -0
- {camel_ai-0.2.64 → camel_ai-0.2.65}/camel/utils/mcp_client.py +0 -0
- {camel_ai-0.2.64 → camel_ai-0.2.65}/camel/utils/response_format.py +0 -0
- {camel_ai-0.2.64 → camel_ai-0.2.65}/camel/utils/token_counting.py +0 -0
- {camel_ai-0.2.64 → camel_ai-0.2.65}/camel/verifiers/__init__.py +0 -0
- {camel_ai-0.2.64 → camel_ai-0.2.65}/camel/verifiers/base.py +0 -0
- {camel_ai-0.2.64 → camel_ai-0.2.65}/camel/verifiers/math_verifier.py +0 -0
- {camel_ai-0.2.64 → camel_ai-0.2.65}/camel/verifiers/models.py +0 -0
- {camel_ai-0.2.64 → camel_ai-0.2.65}/camel/verifiers/physics_verifier.py +0 -0
- {camel_ai-0.2.64 → 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'
|
|
@@ -83,9 +83,7 @@ Requires-Dist: newspaper3k<0.3,>=0.2.8; extra == 'all'
|
|
|
83
83
|
Requires-Dist: notion-client<3,>=2.2.1; extra == 'all'
|
|
84
84
|
Requires-Dist: numpy<=2.2,>=1.2; extra == 'all'
|
|
85
85
|
Requires-Dist: openapi-spec-validator<0.8,>=0.7.1; extra == 'all'
|
|
86
|
-
Requires-Dist: opencv-python<5,>=4; extra == 'all'
|
|
87
86
|
Requires-Dist: openpyxl>=3.1.5; extra == 'all'
|
|
88
|
-
Requires-Dist: outlines<0.2,>=0.1.7; extra == 'all'
|
|
89
87
|
Requires-Dist: pandas<2,>=1.5.3; extra == 'all'
|
|
90
88
|
Requires-Dist: pandasai<3,>=2.3.0; extra == 'all'
|
|
91
89
|
Requires-Dist: playwright>=1.50.0; extra == 'all'
|
|
@@ -115,7 +113,6 @@ Requires-Dist: rouge<2,>=1.0.1; extra == 'all'
|
|
|
115
113
|
Requires-Dist: scenedetect>=0.6.5.2; extra == 'all'
|
|
116
114
|
Requires-Dist: scholarly[tor]==1.7.11; extra == 'all'
|
|
117
115
|
Requires-Dist: scrapegraph-py<2,>=1.12.0; extra == 'all'
|
|
118
|
-
Requires-Dist: sentence-transformers<4,>=3.0.1; extra == 'all'
|
|
119
116
|
Requires-Dist: sentencepiece<0.3,>=0.2; extra == 'all'
|
|
120
117
|
Requires-Dist: slack-bolt<2,>=1.20.1; extra == 'all'
|
|
121
118
|
Requires-Dist: slack-sdk<4,>=3.27.2; extra == 'all'
|
|
@@ -125,7 +122,6 @@ Requires-Dist: sympy<2,>=1.13.3; extra == 'all'
|
|
|
125
122
|
Requires-Dist: tabulate>=0.9.0; extra == 'all'
|
|
126
123
|
Requires-Dist: tavily-python<0.6,>=0.5.0; extra == 'all'
|
|
127
124
|
Requires-Dist: textblob<0.18,>=0.17.1; extra == 'all'
|
|
128
|
-
Requires-Dist: torch; extra == 'all'
|
|
129
125
|
Requires-Dist: transformers<5,>=4; extra == 'all'
|
|
130
126
|
Requires-Dist: tree-sitter-python<0.24,>=0.23.6; extra == 'all'
|
|
131
127
|
Requires-Dist: tree-sitter<0.24,>=0.23.2; extra == 'all'
|
|
@@ -162,6 +158,7 @@ Requires-Dist: rouge<2,>=1.0.1; extra == 'data-tools'
|
|
|
162
158
|
Requires-Dist: stripe<12,>=11.3.0; extra == 'data-tools'
|
|
163
159
|
Requires-Dist: textblob<0.18,>=0.17.1; extra == 'data-tools'
|
|
164
160
|
Provides-Extra: dev
|
|
161
|
+
Requires-Dist: flask>=2.0; extra == 'dev'
|
|
165
162
|
Requires-Dist: gradio<4,>=3; extra == 'dev'
|
|
166
163
|
Requires-Dist: mock<6,>=5; extra == 'dev'
|
|
167
164
|
Requires-Dist: mypy<2,>=1.5.1; extra == 'dev'
|
|
@@ -218,13 +215,11 @@ Requires-Dist: tabulate>=0.9.0; extra == 'document-tools'
|
|
|
218
215
|
Requires-Dist: unstructured==0.16.20; extra == 'document-tools'
|
|
219
216
|
Requires-Dist: xls2xlsx>=0.2.0; extra == 'document-tools'
|
|
220
217
|
Provides-Extra: huggingface
|
|
221
|
-
Requires-Dist: accelerate<0.27,>=0.26.0; extra == 'huggingface'
|
|
222
218
|
Requires-Dist: datasets<4,>=3; extra == 'huggingface'
|
|
223
219
|
Requires-Dist: diffusers<0.26,>=0.25.0; extra == 'huggingface'
|
|
224
|
-
Requires-Dist:
|
|
220
|
+
Requires-Dist: huggingface-hub; extra == 'huggingface'
|
|
225
221
|
Requires-Dist: sentencepiece<0.3,>=0.2; extra == 'huggingface'
|
|
226
222
|
Requires-Dist: soundfile<0.14,>=0.13; extra == 'huggingface'
|
|
227
|
-
Requires-Dist: torch; extra == 'huggingface'
|
|
228
223
|
Requires-Dist: transformers<5,>=4; extra == 'huggingface'
|
|
229
224
|
Provides-Extra: media-tools
|
|
230
225
|
Requires-Dist: ffmpeg-python<0.3,>=0.2.0; extra == 'media-tools'
|
|
@@ -261,9 +256,7 @@ Requires-Dist: mcp-simple-arxiv==0.2.2; extra == 'owl'
|
|
|
261
256
|
Requires-Dist: newspaper3k<0.3,>=0.2.8; extra == 'owl'
|
|
262
257
|
Requires-Dist: numpy<=2.2,>=1.2; extra == 'owl'
|
|
263
258
|
Requires-Dist: openapi-spec-validator<0.8,>=0.7.1; extra == 'owl'
|
|
264
|
-
Requires-Dist: opencv-python<5,>=4; extra == 'owl'
|
|
265
259
|
Requires-Dist: openpyxl>=3.1.5; extra == 'owl'
|
|
266
|
-
Requires-Dist: outlines<0.2,>=0.1.7; extra == 'owl'
|
|
267
260
|
Requires-Dist: pandas<2,>=1.5.3; extra == 'owl'
|
|
268
261
|
Requires-Dist: pandasai<3,>=2.3.0; extra == 'owl'
|
|
269
262
|
Requires-Dist: playwright>=1.50.0; extra == 'owl'
|
|
@@ -304,7 +297,6 @@ Requires-Dist: pyobvector>=0.1.18; extra == 'rag'
|
|
|
304
297
|
Requires-Dist: pytidb-experimental==0.0.1.dev4; extra == 'rag'
|
|
305
298
|
Requires-Dist: qdrant-client<2,>=1.9.0; extra == 'rag'
|
|
306
299
|
Requires-Dist: rank-bm25<0.3,>=0.2.2; extra == 'rag'
|
|
307
|
-
Requires-Dist: sentence-transformers<4,>=3.0.1; extra == 'rag'
|
|
308
300
|
Requires-Dist: unstructured==0.16.20; extra == 'rag'
|
|
309
301
|
Requires-Dist: weaviate-client>=4.15.0; extra == 'rag'
|
|
310
302
|
Provides-Extra: research-tools
|
|
@@ -160,8 +160,10 @@ class ChatAgent(BaseAgent):
|
|
|
160
160
|
(default: :obj:`None`)
|
|
161
161
|
scheduling_strategy (str): name of function that defines how to select
|
|
162
162
|
the next model in ModelManager. (default: :str:`round_robin`)
|
|
163
|
-
|
|
164
|
-
|
|
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`)
|
|
165
167
|
agent_id (str, optional): The ID of the agent. If not provided, a
|
|
166
168
|
random UUID will be generated. (default: :obj:`None`)
|
|
167
169
|
stop_event (Optional[threading.Event], optional): Event to signal
|
|
@@ -197,7 +199,7 @@ class ChatAgent(BaseAgent):
|
|
|
197
199
|
] = None,
|
|
198
200
|
response_terminators: Optional[List[ResponseTerminator]] = None,
|
|
199
201
|
scheduling_strategy: str = "round_robin",
|
|
200
|
-
|
|
202
|
+
max_iteration: Optional[int] = None,
|
|
201
203
|
agent_id: Optional[str] = None,
|
|
202
204
|
stop_event: Optional[threading.Event] = None,
|
|
203
205
|
) -> None:
|
|
@@ -272,7 +274,7 @@ class ChatAgent(BaseAgent):
|
|
|
272
274
|
# Set up other properties
|
|
273
275
|
self.terminated = False
|
|
274
276
|
self.response_terminators = response_terminators or []
|
|
275
|
-
self.
|
|
277
|
+
self.max_iteration = max_iteration
|
|
276
278
|
self.stop_event = stop_event
|
|
277
279
|
|
|
278
280
|
def reset(self):
|
|
@@ -789,6 +791,7 @@ class ChatAgent(BaseAgent):
|
|
|
789
791
|
|
|
790
792
|
# Initialize token usage tracker
|
|
791
793
|
step_token_usage = self._create_token_usage_tracker()
|
|
794
|
+
iteration_count = 0
|
|
792
795
|
|
|
793
796
|
while True:
|
|
794
797
|
try:
|
|
@@ -805,6 +808,7 @@ class ChatAgent(BaseAgent):
|
|
|
805
808
|
response_format,
|
|
806
809
|
self._get_full_tool_schemas(),
|
|
807
810
|
)
|
|
811
|
+
iteration_count += 1
|
|
808
812
|
|
|
809
813
|
# Accumulate API token usage
|
|
810
814
|
self._update_token_usage_tracker(
|
|
@@ -839,7 +843,10 @@ class ChatAgent(BaseAgent):
|
|
|
839
843
|
if external_tool_call_requests:
|
|
840
844
|
break
|
|
841
845
|
|
|
842
|
-
if
|
|
846
|
+
if (
|
|
847
|
+
self.max_iteration is not None
|
|
848
|
+
and iteration_count >= self.max_iteration
|
|
849
|
+
):
|
|
843
850
|
break
|
|
844
851
|
|
|
845
852
|
# If we're still here, continue the loop
|
|
@@ -914,6 +921,7 @@ class ChatAgent(BaseAgent):
|
|
|
914
921
|
|
|
915
922
|
# Initialize token usage tracker
|
|
916
923
|
step_token_usage = self._create_token_usage_tracker()
|
|
924
|
+
iteration_count = 0
|
|
917
925
|
while True:
|
|
918
926
|
try:
|
|
919
927
|
openai_messages, num_tokens = self.memory.get_context()
|
|
@@ -929,6 +937,7 @@ class ChatAgent(BaseAgent):
|
|
|
929
937
|
response_format,
|
|
930
938
|
self._get_full_tool_schemas(),
|
|
931
939
|
)
|
|
940
|
+
iteration_count += 1
|
|
932
941
|
|
|
933
942
|
# Terminate Agent if stop_event is set
|
|
934
943
|
if self.stop_event and self.stop_event.is_set():
|
|
@@ -959,7 +968,10 @@ class ChatAgent(BaseAgent):
|
|
|
959
968
|
if external_tool_call_requests:
|
|
960
969
|
break
|
|
961
970
|
|
|
962
|
-
if
|
|
971
|
+
if (
|
|
972
|
+
self.max_iteration is not None
|
|
973
|
+
and iteration_count >= self.max_iteration
|
|
974
|
+
):
|
|
963
975
|
break
|
|
964
976
|
|
|
965
977
|
# If we're still here, continue the loop
|
|
@@ -1754,7 +1766,7 @@ class ChatAgent(BaseAgent):
|
|
|
1754
1766
|
],
|
|
1755
1767
|
response_terminators=self.response_terminators,
|
|
1756
1768
|
scheduling_strategy=self.model_backend.scheduling_strategy.__name__,
|
|
1757
|
-
|
|
1769
|
+
max_iteration=self.max_iteration,
|
|
1758
1770
|
stop_event=self.stop_event,
|
|
1759
1771
|
)
|
|
1760
1772
|
|
|
@@ -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
|
+
|
|
@@ -0,0 +1,299 @@
|
|
|
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
|
+
import argparse
|
|
15
|
+
import json
|
|
16
|
+
import logging
|
|
17
|
+
import os
|
|
18
|
+
import shutil
|
|
19
|
+
import subprocess
|
|
20
|
+
import sys
|
|
21
|
+
import time
|
|
22
|
+
from logging.handlers import RotatingFileHandler
|
|
23
|
+
from queue import Empty, Queue
|
|
24
|
+
from threading import Thread
|
|
25
|
+
|
|
26
|
+
import requests
|
|
27
|
+
|
|
28
|
+
|
|
29
|
+
def setup_dispatcher_logging():
|
|
30
|
+
log_formatter = logging.Formatter('%(asctime)s %(levelname)s: %(message)s')
|
|
31
|
+
log_file = 'dispatcher.log'
|
|
32
|
+
|
|
33
|
+
logger = logging.getLogger('dispatcher')
|
|
34
|
+
logger.setLevel(logging.INFO)
|
|
35
|
+
|
|
36
|
+
# File Handler
|
|
37
|
+
file_handler = RotatingFileHandler(
|
|
38
|
+
log_file, maxBytes=1024 * 1024 * 5, backupCount=2
|
|
39
|
+
)
|
|
40
|
+
file_handler.setFormatter(log_formatter)
|
|
41
|
+
logger.addHandler(file_handler)
|
|
42
|
+
|
|
43
|
+
# Stream Handler (for console output)
|
|
44
|
+
stream_handler = logging.StreamHandler(sys.stdout)
|
|
45
|
+
stream_handler.setFormatter(log_formatter)
|
|
46
|
+
logger.addHandler(stream_handler)
|
|
47
|
+
|
|
48
|
+
return logger
|
|
49
|
+
|
|
50
|
+
|
|
51
|
+
log = setup_dispatcher_logging()
|
|
52
|
+
|
|
53
|
+
|
|
54
|
+
def download_website_assets(project_name: str):
|
|
55
|
+
log.info(f"Checking for assets for project: {project_name}")
|
|
56
|
+
|
|
57
|
+
# Check if assets already exist
|
|
58
|
+
project_dir = project_name
|
|
59
|
+
templates_path = os.path.join(project_dir, 'templates')
|
|
60
|
+
static_path = os.path.join(project_dir, 'static')
|
|
61
|
+
if os.path.exists(templates_path) and os.path.exists(static_path):
|
|
62
|
+
log.info(
|
|
63
|
+
"Templates and static folders already exist. Skipping download."
|
|
64
|
+
)
|
|
65
|
+
return True
|
|
66
|
+
|
|
67
|
+
log.info(f"Attempting to download assets for project: {project_name}")
|
|
68
|
+
try:
|
|
69
|
+
from huggingface_hub import snapshot_download
|
|
70
|
+
except ImportError:
|
|
71
|
+
log.error(
|
|
72
|
+
"huggingface_hub not installed. "
|
|
73
|
+
"Please install it with `pip install huggingface-hub`"
|
|
74
|
+
)
|
|
75
|
+
return False
|
|
76
|
+
|
|
77
|
+
repo_id = "camel-ai/mock_websites"
|
|
78
|
+
local_dir_root = "hf_mock_website"
|
|
79
|
+
project_pattern = f"{project_name}/*"
|
|
80
|
+
|
|
81
|
+
try:
|
|
82
|
+
# Download only the project's folder
|
|
83
|
+
snapshot_path = snapshot_download(
|
|
84
|
+
repo_id=repo_id,
|
|
85
|
+
repo_type="dataset",
|
|
86
|
+
allow_patterns=project_pattern,
|
|
87
|
+
local_dir=local_dir_root,
|
|
88
|
+
local_dir_use_symlinks=False,
|
|
89
|
+
# Use False for Windows compatibility
|
|
90
|
+
)
|
|
91
|
+
log.info(f"Snapshot downloaded to: {snapshot_path}")
|
|
92
|
+
|
|
93
|
+
# The downloaded content for the project is in a subdirectory
|
|
94
|
+
project_assets_path = os.path.join(snapshot_path, project_name)
|
|
95
|
+
|
|
96
|
+
if not os.path.isdir(project_assets_path):
|
|
97
|
+
log.error(
|
|
98
|
+
f"Project folder '{project_name}' not found in downloaded "
|
|
99
|
+
f"assets at '{project_assets_path}'"
|
|
100
|
+
)
|
|
101
|
+
return False
|
|
102
|
+
|
|
103
|
+
# Copy templates and static folders into project root
|
|
104
|
+
for folder in ['templates', 'static']:
|
|
105
|
+
src = os.path.join(project_assets_path, folder)
|
|
106
|
+
# Destination is now inside the project folder
|
|
107
|
+
dst = os.path.join(".", project_name, folder)
|
|
108
|
+
if not os.path.exists(src):
|
|
109
|
+
log.warning(f"'{src}' not found in downloaded assets.")
|
|
110
|
+
continue
|
|
111
|
+
|
|
112
|
+
if os.path.exists(dst):
|
|
113
|
+
log.info(f"Removing existing '{dst}' directory.")
|
|
114
|
+
shutil.rmtree(dst)
|
|
115
|
+
log.info(f"Copying '{src}' to '{dst}'.")
|
|
116
|
+
shutil.copytree(src, dst)
|
|
117
|
+
log.info(f"Assets for '{project_name}' are set up.")
|
|
118
|
+
return True
|
|
119
|
+
except Exception as e:
|
|
120
|
+
log.error(f"Failed to download or set up assets: {e}")
|
|
121
|
+
return False
|
|
122
|
+
|
|
123
|
+
|
|
124
|
+
def enqueue_output(stream, queue):
|
|
125
|
+
# If `stream` is from a subprocess opened with `text=True`,
|
|
126
|
+
# then `readline()` returns strings, and `''` is the sentinel for EOF.
|
|
127
|
+
for line in iter(stream.readline, ''):
|
|
128
|
+
queue.put(line)
|
|
129
|
+
stream.close()
|
|
130
|
+
|
|
131
|
+
|
|
132
|
+
def run_project(project_name: str, port: int):
|
|
133
|
+
# 1. Prepare environment
|
|
134
|
+
log.info(f"Setting up project: {project_name}")
|
|
135
|
+
if not download_website_assets(project_name):
|
|
136
|
+
log.error("Failed to download assets. Aborting.")
|
|
137
|
+
return
|
|
138
|
+
|
|
139
|
+
# Load task configuration
|
|
140
|
+
task_file = 'task.json'
|
|
141
|
+
if not os.path.exists(task_file):
|
|
142
|
+
log.error(f"'{task_file}' not found. Aborting.")
|
|
143
|
+
return
|
|
144
|
+
with open(task_file, 'r') as f:
|
|
145
|
+
task_data = json.load(f)
|
|
146
|
+
products = task_data.get("products", [])
|
|
147
|
+
ground_truth = task_data.get("ground_truth_cart", [])
|
|
148
|
+
|
|
149
|
+
# Prepare project-specific files
|
|
150
|
+
project_dir = project_name
|
|
151
|
+
app_path = os.path.join(project_dir, 'app.py')
|
|
152
|
+
if not os.path.exists(app_path):
|
|
153
|
+
log.error(f"Application file not found: {app_path}. Aborting.")
|
|
154
|
+
return
|
|
155
|
+
|
|
156
|
+
# Write the products to a file inside the project directory
|
|
157
|
+
with open(os.path.join(project_dir, 'products.json'), 'w') as f:
|
|
158
|
+
json.dump(products, f)
|
|
159
|
+
log.info(f"Wrote products.json to '{project_dir}'.")
|
|
160
|
+
|
|
161
|
+
# Start the web server app
|
|
162
|
+
# Use sys.executable to ensure we use the same python interpreter
|
|
163
|
+
cmd = [sys.executable, app_path, '--port', str(port)]
|
|
164
|
+
process = subprocess.Popen(
|
|
165
|
+
cmd,
|
|
166
|
+
stdout=subprocess.PIPE,
|
|
167
|
+
stderr=subprocess.PIPE,
|
|
168
|
+
text=True,
|
|
169
|
+
bufsize=1,
|
|
170
|
+
universal_newlines=True,
|
|
171
|
+
)
|
|
172
|
+
log.info(f"Started {app_path} on port {port} with PID: {process.pid}")
|
|
173
|
+
|
|
174
|
+
# Non-blocking stream reading for both stdout and stderr
|
|
175
|
+
q_out: Queue[str] = Queue()
|
|
176
|
+
t_out = Thread(target=enqueue_output, args=(process.stdout, q_out))
|
|
177
|
+
t_out.daemon = True
|
|
178
|
+
t_out.start()
|
|
179
|
+
|
|
180
|
+
q_err: Queue[str] = Queue()
|
|
181
|
+
t_err = Thread(target=enqueue_output, args=(process.stderr, q_err))
|
|
182
|
+
t_err.daemon = True
|
|
183
|
+
t_err.start()
|
|
184
|
+
|
|
185
|
+
time.sleep(5) # Wait for server to start
|
|
186
|
+
|
|
187
|
+
# 5. Start the task and then wait for user to terminate
|
|
188
|
+
base_url = f"http://127.0.0.1:{port}"
|
|
189
|
+
try:
|
|
190
|
+
# Start task
|
|
191
|
+
log.info(f"Starting task with ground truth: {ground_truth}")
|
|
192
|
+
r = requests.post(
|
|
193
|
+
f"{base_url}/task/start", json={"ground_truth_cart": ground_truth}
|
|
194
|
+
)
|
|
195
|
+
r.raise_for_status()
|
|
196
|
+
log.info(f"Task started on server: {r.json()['message']}")
|
|
197
|
+
print(
|
|
198
|
+
"Server is running. Interact with the website at "
|
|
199
|
+
f"http://127.0.0.1:{port}"
|
|
200
|
+
)
|
|
201
|
+
print("Dispatcher is now polling for task completion...")
|
|
202
|
+
print("Press Ctrl+C to stop the dispatcher early and get results.")
|
|
203
|
+
|
|
204
|
+
# Poll for task completion
|
|
205
|
+
while True:
|
|
206
|
+
# Check if the subprocess has terminated unexpectedly
|
|
207
|
+
if process.poll() is not None:
|
|
208
|
+
log.error("App process terminated unexpectedly.")
|
|
209
|
+
break
|
|
210
|
+
|
|
211
|
+
# Check for completion via API
|
|
212
|
+
try:
|
|
213
|
+
r_check = requests.get(f"{base_url}/task/check")
|
|
214
|
+
r_check.raise_for_status()
|
|
215
|
+
status = r_check.json()
|
|
216
|
+
if status.get('completed', False):
|
|
217
|
+
log.info(
|
|
218
|
+
"Task completion reported by API. "
|
|
219
|
+
"Proceeding to final report and shutdown."
|
|
220
|
+
)
|
|
221
|
+
break # Exit the loop on completion
|
|
222
|
+
except requests.exceptions.RequestException as e:
|
|
223
|
+
log.error(f"Could not poll task status: {e}")
|
|
224
|
+
break # Exit if the server becomes unresponsive
|
|
225
|
+
|
|
226
|
+
# Log any error output from the app
|
|
227
|
+
try:
|
|
228
|
+
err_line = q_err.get_nowait()
|
|
229
|
+
log.error(f"APP STDERR: {err_line.strip()}")
|
|
230
|
+
except Empty:
|
|
231
|
+
pass # No new error output
|
|
232
|
+
time.sleep(2) # Wait for 2 seconds before polling again
|
|
233
|
+
|
|
234
|
+
except KeyboardInterrupt:
|
|
235
|
+
log.info(
|
|
236
|
+
"\nCtrl+C detected. Shutting down and checking final task status."
|
|
237
|
+
)
|
|
238
|
+
|
|
239
|
+
except requests.exceptions.RequestException as e:
|
|
240
|
+
log.error(f"Failed to communicate with the web app: {e}")
|
|
241
|
+
finally:
|
|
242
|
+
# 6. Check task completion
|
|
243
|
+
log.info("Checking final task completion status.")
|
|
244
|
+
op_steps = 0
|
|
245
|
+
try:
|
|
246
|
+
r = requests.get(f"{base_url}/task/check")
|
|
247
|
+
r.raise_for_status()
|
|
248
|
+
result = r.json()
|
|
249
|
+
log.info(f"Final task check result: {result}")
|
|
250
|
+
success = result.get('completed', False)
|
|
251
|
+
op_steps = result.get('steps', 0)
|
|
252
|
+
except requests.exceptions.RequestException as e:
|
|
253
|
+
log.error(f"Could not get final task status: {e}")
|
|
254
|
+
success = False
|
|
255
|
+
|
|
256
|
+
log.info("--- FINAL FEEDBACK ---")
|
|
257
|
+
log.info(f"Project: {project_name}")
|
|
258
|
+
log.info(f"Success: {success}")
|
|
259
|
+
log.info(f"Total Operation Steps: {op_steps}")
|
|
260
|
+
log.info("----------------------")
|
|
261
|
+
|
|
262
|
+
# 7. Shutdown server
|
|
263
|
+
log.info("Shutting down web server.")
|
|
264
|
+
process.terminate()
|
|
265
|
+
try:
|
|
266
|
+
process.wait(timeout=5)
|
|
267
|
+
except subprocess.TimeoutExpired:
|
|
268
|
+
log.warning("Server did not terminate gracefully. Killing.")
|
|
269
|
+
process.kill()
|
|
270
|
+
log.info("Web server process stopped.")
|
|
271
|
+
# Log any remaining stderr for debugging
|
|
272
|
+
# Drain the queue first
|
|
273
|
+
while not q_err.empty():
|
|
274
|
+
log.error(f"APP STDERR: {q_err.get_nowait().strip()}")
|
|
275
|
+
|
|
276
|
+
|
|
277
|
+
def main():
|
|
278
|
+
parser = argparse.ArgumentParser(
|
|
279
|
+
description="Dispatcher for running mock website benchmarks."
|
|
280
|
+
)
|
|
281
|
+
parser.add_argument(
|
|
282
|
+
'--project',
|
|
283
|
+
type=str,
|
|
284
|
+
default='shopping_mall',
|
|
285
|
+
help='The name of the project to run (e.g., shopping_mall).',
|
|
286
|
+
)
|
|
287
|
+
parser.add_argument(
|
|
288
|
+
'--port',
|
|
289
|
+
type=int,
|
|
290
|
+
default=5001,
|
|
291
|
+
help='Port to run the project web server on.',
|
|
292
|
+
)
|
|
293
|
+
args = parser.parse_args()
|
|
294
|
+
|
|
295
|
+
run_project(args.project, args.port)
|
|
296
|
+
|
|
297
|
+
|
|
298
|
+
if __name__ == "__main__":
|
|
299
|
+
main()
|