camel-ai 0.2.72a1__tar.gz → 0.2.72a4__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.72a1 → camel_ai-0.2.72a4}/PKG-INFO +1 -1
- {camel_ai-0.2.72a1 → camel_ai-0.2.72a4}/camel/__init__.py +1 -1
- {camel_ai-0.2.72a1 → camel_ai-0.2.72a4}/camel/societies/workforce/prompts.py +15 -11
- {camel_ai-0.2.72a1 → camel_ai-0.2.72a4}/camel/toolkits/terminal_toolkit.py +329 -131
- {camel_ai-0.2.72a1 → camel_ai-0.2.72a4}/pyproject.toml +1 -1
- {camel_ai-0.2.72a1 → camel_ai-0.2.72a4}/.gitignore +0 -0
- {camel_ai-0.2.72a1 → camel_ai-0.2.72a4}/LICENSE +0 -0
- {camel_ai-0.2.72a1 → camel_ai-0.2.72a4}/README.md +0 -0
- {camel_ai-0.2.72a1 → camel_ai-0.2.72a4}/camel/agents/__init__.py +0 -0
- {camel_ai-0.2.72a1 → camel_ai-0.2.72a4}/camel/agents/_types.py +0 -0
- {camel_ai-0.2.72a1 → camel_ai-0.2.72a4}/camel/agents/_utils.py +0 -0
- {camel_ai-0.2.72a1 → camel_ai-0.2.72a4}/camel/agents/base.py +0 -0
- {camel_ai-0.2.72a1 → camel_ai-0.2.72a4}/camel/agents/chat_agent.py +0 -0
- {camel_ai-0.2.72a1 → camel_ai-0.2.72a4}/camel/agents/critic_agent.py +0 -0
- {camel_ai-0.2.72a1 → camel_ai-0.2.72a4}/camel/agents/deductive_reasoner_agent.py +0 -0
- {camel_ai-0.2.72a1 → camel_ai-0.2.72a4}/camel/agents/embodied_agent.py +0 -0
- {camel_ai-0.2.72a1 → camel_ai-0.2.72a4}/camel/agents/knowledge_graph_agent.py +0 -0
- {camel_ai-0.2.72a1 → camel_ai-0.2.72a4}/camel/agents/mcp_agent.py +0 -0
- {camel_ai-0.2.72a1 → camel_ai-0.2.72a4}/camel/agents/multi_hop_generator_agent.py +0 -0
- {camel_ai-0.2.72a1 → camel_ai-0.2.72a4}/camel/agents/programmed_agent_instruction.py +0 -0
- {camel_ai-0.2.72a1 → camel_ai-0.2.72a4}/camel/agents/repo_agent.py +0 -0
- {camel_ai-0.2.72a1 → camel_ai-0.2.72a4}/camel/agents/role_assignment_agent.py +0 -0
- {camel_ai-0.2.72a1 → camel_ai-0.2.72a4}/camel/agents/search_agent.py +0 -0
- {camel_ai-0.2.72a1 → camel_ai-0.2.72a4}/camel/agents/task_agent.py +0 -0
- {camel_ai-0.2.72a1 → camel_ai-0.2.72a4}/camel/agents/tool_agents/__init__.py +0 -0
- {camel_ai-0.2.72a1 → camel_ai-0.2.72a4}/camel/agents/tool_agents/base.py +0 -0
- {camel_ai-0.2.72a1 → camel_ai-0.2.72a4}/camel/agents/tool_agents/hugging_face_tool_agent.py +0 -0
- {camel_ai-0.2.72a1 → camel_ai-0.2.72a4}/camel/benchmarks/__init__.py +0 -0
- {camel_ai-0.2.72a1 → camel_ai-0.2.72a4}/camel/benchmarks/apibank.py +0 -0
- {camel_ai-0.2.72a1 → camel_ai-0.2.72a4}/camel/benchmarks/apibench.py +0 -0
- {camel_ai-0.2.72a1 → camel_ai-0.2.72a4}/camel/benchmarks/base.py +0 -0
- {camel_ai-0.2.72a1 → camel_ai-0.2.72a4}/camel/benchmarks/browsecomp.py +0 -0
- {camel_ai-0.2.72a1 → camel_ai-0.2.72a4}/camel/benchmarks/gaia.py +0 -0
- {camel_ai-0.2.72a1 → camel_ai-0.2.72a4}/camel/benchmarks/mock_website/README.md +0 -0
- {camel_ai-0.2.72a1 → camel_ai-0.2.72a4}/camel/benchmarks/mock_website/mock_web.py +0 -0
- {camel_ai-0.2.72a1 → camel_ai-0.2.72a4}/camel/benchmarks/mock_website/requirements.txt +0 -0
- {camel_ai-0.2.72a1 → camel_ai-0.2.72a4}/camel/benchmarks/mock_website/shopping_mall/app.py +0 -0
- {camel_ai-0.2.72a1 → camel_ai-0.2.72a4}/camel/benchmarks/mock_website/task.json +0 -0
- {camel_ai-0.2.72a1 → camel_ai-0.2.72a4}/camel/benchmarks/nexus.py +0 -0
- {camel_ai-0.2.72a1 → camel_ai-0.2.72a4}/camel/benchmarks/ragbench.py +0 -0
- {camel_ai-0.2.72a1 → camel_ai-0.2.72a4}/camel/bots/__init__.py +0 -0
- {camel_ai-0.2.72a1 → camel_ai-0.2.72a4}/camel/bots/discord/__init__.py +0 -0
- {camel_ai-0.2.72a1 → camel_ai-0.2.72a4}/camel/bots/discord/discord_app.py +0 -0
- {camel_ai-0.2.72a1 → camel_ai-0.2.72a4}/camel/bots/discord/discord_installation.py +0 -0
- {camel_ai-0.2.72a1 → camel_ai-0.2.72a4}/camel/bots/discord/discord_store.py +0 -0
- {camel_ai-0.2.72a1 → camel_ai-0.2.72a4}/camel/bots/slack/__init__.py +0 -0
- {camel_ai-0.2.72a1 → camel_ai-0.2.72a4}/camel/bots/slack/models.py +0 -0
- {camel_ai-0.2.72a1 → camel_ai-0.2.72a4}/camel/bots/slack/slack_app.py +0 -0
- {camel_ai-0.2.72a1 → camel_ai-0.2.72a4}/camel/bots/telegram_bot.py +0 -0
- {camel_ai-0.2.72a1 → camel_ai-0.2.72a4}/camel/configs/__init__.py +0 -0
- {camel_ai-0.2.72a1 → camel_ai-0.2.72a4}/camel/configs/aiml_config.py +0 -0
- {camel_ai-0.2.72a1 → camel_ai-0.2.72a4}/camel/configs/anthropic_config.py +0 -0
- {camel_ai-0.2.72a1 → camel_ai-0.2.72a4}/camel/configs/base_config.py +0 -0
- {camel_ai-0.2.72a1 → camel_ai-0.2.72a4}/camel/configs/bedrock_config.py +0 -0
- {camel_ai-0.2.72a1 → camel_ai-0.2.72a4}/camel/configs/cohere_config.py +0 -0
- {camel_ai-0.2.72a1 → camel_ai-0.2.72a4}/camel/configs/crynux_config.py +0 -0
- {camel_ai-0.2.72a1 → camel_ai-0.2.72a4}/camel/configs/deepseek_config.py +0 -0
- {camel_ai-0.2.72a1 → camel_ai-0.2.72a4}/camel/configs/gemini_config.py +0 -0
- {camel_ai-0.2.72a1 → camel_ai-0.2.72a4}/camel/configs/groq_config.py +0 -0
- {camel_ai-0.2.72a1 → camel_ai-0.2.72a4}/camel/configs/internlm_config.py +0 -0
- {camel_ai-0.2.72a1 → camel_ai-0.2.72a4}/camel/configs/litellm_config.py +0 -0
- {camel_ai-0.2.72a1 → camel_ai-0.2.72a4}/camel/configs/lmstudio_config.py +0 -0
- {camel_ai-0.2.72a1 → camel_ai-0.2.72a4}/camel/configs/mistral_config.py +0 -0
- {camel_ai-0.2.72a1 → camel_ai-0.2.72a4}/camel/configs/modelscope_config.py +0 -0
- {camel_ai-0.2.72a1 → camel_ai-0.2.72a4}/camel/configs/moonshot_config.py +0 -0
- {camel_ai-0.2.72a1 → camel_ai-0.2.72a4}/camel/configs/netmind_config.py +0 -0
- {camel_ai-0.2.72a1 → camel_ai-0.2.72a4}/camel/configs/novita_config.py +0 -0
- {camel_ai-0.2.72a1 → camel_ai-0.2.72a4}/camel/configs/nvidia_config.py +0 -0
- {camel_ai-0.2.72a1 → camel_ai-0.2.72a4}/camel/configs/ollama_config.py +0 -0
- {camel_ai-0.2.72a1 → camel_ai-0.2.72a4}/camel/configs/openai_config.py +0 -0
- {camel_ai-0.2.72a1 → camel_ai-0.2.72a4}/camel/configs/openrouter_config.py +0 -0
- {camel_ai-0.2.72a1 → camel_ai-0.2.72a4}/camel/configs/ppio_config.py +0 -0
- {camel_ai-0.2.72a1 → camel_ai-0.2.72a4}/camel/configs/qianfan_config.py +0 -0
- {camel_ai-0.2.72a1 → camel_ai-0.2.72a4}/camel/configs/qwen_config.py +0 -0
- {camel_ai-0.2.72a1 → camel_ai-0.2.72a4}/camel/configs/reka_config.py +0 -0
- {camel_ai-0.2.72a1 → camel_ai-0.2.72a4}/camel/configs/samba_config.py +0 -0
- {camel_ai-0.2.72a1 → camel_ai-0.2.72a4}/camel/configs/sglang_config.py +0 -0
- {camel_ai-0.2.72a1 → camel_ai-0.2.72a4}/camel/configs/siliconflow_config.py +0 -0
- {camel_ai-0.2.72a1 → camel_ai-0.2.72a4}/camel/configs/togetherai_config.py +0 -0
- {camel_ai-0.2.72a1 → camel_ai-0.2.72a4}/camel/configs/vllm_config.py +0 -0
- {camel_ai-0.2.72a1 → camel_ai-0.2.72a4}/camel/configs/watsonx_config.py +0 -0
- {camel_ai-0.2.72a1 → camel_ai-0.2.72a4}/camel/configs/yi_config.py +0 -0
- {camel_ai-0.2.72a1 → camel_ai-0.2.72a4}/camel/configs/zhipuai_config.py +0 -0
- {camel_ai-0.2.72a1 → camel_ai-0.2.72a4}/camel/data_collectors/__init__.py +0 -0
- {camel_ai-0.2.72a1 → camel_ai-0.2.72a4}/camel/data_collectors/alpaca_collector.py +0 -0
- {camel_ai-0.2.72a1 → camel_ai-0.2.72a4}/camel/data_collectors/base.py +0 -0
- {camel_ai-0.2.72a1 → camel_ai-0.2.72a4}/camel/data_collectors/sharegpt_collector.py +0 -0
- {camel_ai-0.2.72a1 → camel_ai-0.2.72a4}/camel/datagen/__init__.py +0 -0
- {camel_ai-0.2.72a1 → camel_ai-0.2.72a4}/camel/datagen/cot_datagen.py +0 -0
- {camel_ai-0.2.72a1 → camel_ai-0.2.72a4}/camel/datagen/evol_instruct/__init__.py +0 -0
- {camel_ai-0.2.72a1 → camel_ai-0.2.72a4}/camel/datagen/evol_instruct/evol_instruct.py +0 -0
- {camel_ai-0.2.72a1 → camel_ai-0.2.72a4}/camel/datagen/evol_instruct/scorer.py +0 -0
- {camel_ai-0.2.72a1 → camel_ai-0.2.72a4}/camel/datagen/evol_instruct/templates.py +0 -0
- {camel_ai-0.2.72a1 → camel_ai-0.2.72a4}/camel/datagen/self_improving_cot.py +0 -0
- {camel_ai-0.2.72a1 → camel_ai-0.2.72a4}/camel/datagen/self_instruct/__init__.py +0 -0
- {camel_ai-0.2.72a1 → camel_ai-0.2.72a4}/camel/datagen/self_instruct/filter/__init__.py +0 -0
- {camel_ai-0.2.72a1 → camel_ai-0.2.72a4}/camel/datagen/self_instruct/filter/filter_function.py +0 -0
- {camel_ai-0.2.72a1 → camel_ai-0.2.72a4}/camel/datagen/self_instruct/filter/filter_registry.py +0 -0
- {camel_ai-0.2.72a1 → camel_ai-0.2.72a4}/camel/datagen/self_instruct/filter/instruction_filter.py +0 -0
- {camel_ai-0.2.72a1 → camel_ai-0.2.72a4}/camel/datagen/self_instruct/self_instruct.py +0 -0
- {camel_ai-0.2.72a1 → camel_ai-0.2.72a4}/camel/datagen/self_instruct/templates.py +0 -0
- {camel_ai-0.2.72a1 → camel_ai-0.2.72a4}/camel/datagen/source2synth/__init__.py +0 -0
- {camel_ai-0.2.72a1 → camel_ai-0.2.72a4}/camel/datagen/source2synth/data_processor.py +0 -0
- {camel_ai-0.2.72a1 → camel_ai-0.2.72a4}/camel/datagen/source2synth/models.py +0 -0
- {camel_ai-0.2.72a1 → camel_ai-0.2.72a4}/camel/datagen/source2synth/user_data_processor_config.py +0 -0
- {camel_ai-0.2.72a1 → camel_ai-0.2.72a4}/camel/datahubs/__init__.py +0 -0
- {camel_ai-0.2.72a1 → camel_ai-0.2.72a4}/camel/datahubs/base.py +0 -0
- {camel_ai-0.2.72a1 → camel_ai-0.2.72a4}/camel/datahubs/huggingface.py +0 -0
- {camel_ai-0.2.72a1 → camel_ai-0.2.72a4}/camel/datahubs/models.py +0 -0
- {camel_ai-0.2.72a1 → camel_ai-0.2.72a4}/camel/datasets/__init__.py +0 -0
- {camel_ai-0.2.72a1 → camel_ai-0.2.72a4}/camel/datasets/base_generator.py +0 -0
- {camel_ai-0.2.72a1 → camel_ai-0.2.72a4}/camel/datasets/few_shot_generator.py +0 -0
- {camel_ai-0.2.72a1 → camel_ai-0.2.72a4}/camel/datasets/models.py +0 -0
- {camel_ai-0.2.72a1 → camel_ai-0.2.72a4}/camel/datasets/self_instruct_generator.py +0 -0
- {camel_ai-0.2.72a1 → camel_ai-0.2.72a4}/camel/datasets/static_dataset.py +0 -0
- {camel_ai-0.2.72a1 → camel_ai-0.2.72a4}/camel/embeddings/__init__.py +0 -0
- {camel_ai-0.2.72a1 → camel_ai-0.2.72a4}/camel/embeddings/azure_embedding.py +0 -0
- {camel_ai-0.2.72a1 → camel_ai-0.2.72a4}/camel/embeddings/base.py +0 -0
- {camel_ai-0.2.72a1 → camel_ai-0.2.72a4}/camel/embeddings/gemini_embedding.py +0 -0
- {camel_ai-0.2.72a1 → camel_ai-0.2.72a4}/camel/embeddings/jina_embedding.py +0 -0
- {camel_ai-0.2.72a1 → camel_ai-0.2.72a4}/camel/embeddings/mistral_embedding.py +0 -0
- {camel_ai-0.2.72a1 → camel_ai-0.2.72a4}/camel/embeddings/openai_compatible_embedding.py +0 -0
- {camel_ai-0.2.72a1 → camel_ai-0.2.72a4}/camel/embeddings/openai_embedding.py +0 -0
- {camel_ai-0.2.72a1 → camel_ai-0.2.72a4}/camel/embeddings/sentence_transformers_embeddings.py +0 -0
- {camel_ai-0.2.72a1 → camel_ai-0.2.72a4}/camel/embeddings/together_embedding.py +0 -0
- {camel_ai-0.2.72a1 → camel_ai-0.2.72a4}/camel/embeddings/vlm_embedding.py +0 -0
- {camel_ai-0.2.72a1 → camel_ai-0.2.72a4}/camel/environments/__init__.py +0 -0
- {camel_ai-0.2.72a1 → camel_ai-0.2.72a4}/camel/environments/models.py +0 -0
- {camel_ai-0.2.72a1 → camel_ai-0.2.72a4}/camel/environments/multi_step.py +0 -0
- {camel_ai-0.2.72a1 → camel_ai-0.2.72a4}/camel/environments/rlcards_env.py +0 -0
- {camel_ai-0.2.72a1 → camel_ai-0.2.72a4}/camel/environments/single_step.py +0 -0
- {camel_ai-0.2.72a1 → camel_ai-0.2.72a4}/camel/environments/tic_tac_toe.py +0 -0
- {camel_ai-0.2.72a1 → camel_ai-0.2.72a4}/camel/extractors/__init__.py +0 -0
- {camel_ai-0.2.72a1 → camel_ai-0.2.72a4}/camel/extractors/base.py +0 -0
- {camel_ai-0.2.72a1 → camel_ai-0.2.72a4}/camel/extractors/python_strategies.py +0 -0
- {camel_ai-0.2.72a1 → camel_ai-0.2.72a4}/camel/generators.py +0 -0
- {camel_ai-0.2.72a1 → camel_ai-0.2.72a4}/camel/human.py +0 -0
- {camel_ai-0.2.72a1 → camel_ai-0.2.72a4}/camel/interpreters/__init__.py +0 -0
- {camel_ai-0.2.72a1 → camel_ai-0.2.72a4}/camel/interpreters/base.py +0 -0
- {camel_ai-0.2.72a1 → camel_ai-0.2.72a4}/camel/interpreters/docker/Dockerfile +0 -0
- {camel_ai-0.2.72a1 → camel_ai-0.2.72a4}/camel/interpreters/docker_interpreter.py +0 -0
- {camel_ai-0.2.72a1 → camel_ai-0.2.72a4}/camel/interpreters/e2b_interpreter.py +0 -0
- {camel_ai-0.2.72a1 → camel_ai-0.2.72a4}/camel/interpreters/internal_python_interpreter.py +0 -0
- {camel_ai-0.2.72a1 → camel_ai-0.2.72a4}/camel/interpreters/interpreter_error.py +0 -0
- {camel_ai-0.2.72a1 → camel_ai-0.2.72a4}/camel/interpreters/ipython_interpreter.py +0 -0
- {camel_ai-0.2.72a1 → camel_ai-0.2.72a4}/camel/interpreters/subprocess_interpreter.py +0 -0
- {camel_ai-0.2.72a1 → camel_ai-0.2.72a4}/camel/loaders/__init__.py +0 -0
- {camel_ai-0.2.72a1 → camel_ai-0.2.72a4}/camel/loaders/apify_reader.py +0 -0
- {camel_ai-0.2.72a1 → camel_ai-0.2.72a4}/camel/loaders/base_io.py +0 -0
- {camel_ai-0.2.72a1 → camel_ai-0.2.72a4}/camel/loaders/base_loader.py +0 -0
- {camel_ai-0.2.72a1 → camel_ai-0.2.72a4}/camel/loaders/chunkr_reader.py +0 -0
- {camel_ai-0.2.72a1 → camel_ai-0.2.72a4}/camel/loaders/crawl4ai_reader.py +0 -0
- {camel_ai-0.2.72a1 → camel_ai-0.2.72a4}/camel/loaders/firecrawl_reader.py +0 -0
- {camel_ai-0.2.72a1 → camel_ai-0.2.72a4}/camel/loaders/jina_url_reader.py +0 -0
- {camel_ai-0.2.72a1 → camel_ai-0.2.72a4}/camel/loaders/markitdown.py +0 -0
- {camel_ai-0.2.72a1 → camel_ai-0.2.72a4}/camel/loaders/mineru_extractor.py +0 -0
- {camel_ai-0.2.72a1 → camel_ai-0.2.72a4}/camel/loaders/mistral_reader.py +0 -0
- {camel_ai-0.2.72a1 → camel_ai-0.2.72a4}/camel/loaders/pandas_reader.py +0 -0
- {camel_ai-0.2.72a1 → camel_ai-0.2.72a4}/camel/loaders/scrapegraph_reader.py +0 -0
- {camel_ai-0.2.72a1 → camel_ai-0.2.72a4}/camel/loaders/unstructured_io.py +0 -0
- {camel_ai-0.2.72a1 → camel_ai-0.2.72a4}/camel/logger.py +0 -0
- {camel_ai-0.2.72a1 → camel_ai-0.2.72a4}/camel/memories/__init__.py +0 -0
- {camel_ai-0.2.72a1 → camel_ai-0.2.72a4}/camel/memories/agent_memories.py +0 -0
- {camel_ai-0.2.72a1 → camel_ai-0.2.72a4}/camel/memories/base.py +0 -0
- {camel_ai-0.2.72a1 → camel_ai-0.2.72a4}/camel/memories/blocks/__init__.py +0 -0
- {camel_ai-0.2.72a1 → camel_ai-0.2.72a4}/camel/memories/blocks/chat_history_block.py +0 -0
- {camel_ai-0.2.72a1 → camel_ai-0.2.72a4}/camel/memories/blocks/vectordb_block.py +0 -0
- {camel_ai-0.2.72a1 → camel_ai-0.2.72a4}/camel/memories/context_creators/__init__.py +0 -0
- {camel_ai-0.2.72a1 → camel_ai-0.2.72a4}/camel/memories/context_creators/score_based.py +0 -0
- {camel_ai-0.2.72a1 → camel_ai-0.2.72a4}/camel/memories/records.py +0 -0
- {camel_ai-0.2.72a1 → camel_ai-0.2.72a4}/camel/messages/__init__.py +0 -0
- {camel_ai-0.2.72a1 → camel_ai-0.2.72a4}/camel/messages/base.py +0 -0
- {camel_ai-0.2.72a1 → camel_ai-0.2.72a4}/camel/messages/conversion/__init__.py +0 -0
- {camel_ai-0.2.72a1 → camel_ai-0.2.72a4}/camel/messages/conversion/alpaca.py +0 -0
- {camel_ai-0.2.72a1 → camel_ai-0.2.72a4}/camel/messages/conversion/conversation_models.py +0 -0
- {camel_ai-0.2.72a1 → camel_ai-0.2.72a4}/camel/messages/conversion/sharegpt/__init__.py +0 -0
- {camel_ai-0.2.72a1 → camel_ai-0.2.72a4}/camel/messages/conversion/sharegpt/function_call_formatter.py +0 -0
- {camel_ai-0.2.72a1 → camel_ai-0.2.72a4}/camel/messages/conversion/sharegpt/hermes/__init__.py +0 -0
- {camel_ai-0.2.72a1 → camel_ai-0.2.72a4}/camel/messages/conversion/sharegpt/hermes/hermes_function_formatter.py +0 -0
- {camel_ai-0.2.72a1 → camel_ai-0.2.72a4}/camel/messages/func_message.py +0 -0
- {camel_ai-0.2.72a1 → camel_ai-0.2.72a4}/camel/models/__init__.py +0 -0
- {camel_ai-0.2.72a1 → camel_ai-0.2.72a4}/camel/models/_utils.py +0 -0
- {camel_ai-0.2.72a1 → camel_ai-0.2.72a4}/camel/models/aiml_model.py +0 -0
- {camel_ai-0.2.72a1 → camel_ai-0.2.72a4}/camel/models/anthropic_model.py +0 -0
- {camel_ai-0.2.72a1 → camel_ai-0.2.72a4}/camel/models/aws_bedrock_model.py +0 -0
- {camel_ai-0.2.72a1 → camel_ai-0.2.72a4}/camel/models/azure_openai_model.py +0 -0
- {camel_ai-0.2.72a1 → camel_ai-0.2.72a4}/camel/models/base_audio_model.py +0 -0
- {camel_ai-0.2.72a1 → camel_ai-0.2.72a4}/camel/models/base_model.py +0 -0
- {camel_ai-0.2.72a1 → camel_ai-0.2.72a4}/camel/models/cohere_model.py +0 -0
- {camel_ai-0.2.72a1 → camel_ai-0.2.72a4}/camel/models/crynux_model.py +0 -0
- {camel_ai-0.2.72a1 → camel_ai-0.2.72a4}/camel/models/deepseek_model.py +0 -0
- {camel_ai-0.2.72a1 → camel_ai-0.2.72a4}/camel/models/fish_audio_model.py +0 -0
- {camel_ai-0.2.72a1 → camel_ai-0.2.72a4}/camel/models/gemini_model.py +0 -0
- {camel_ai-0.2.72a1 → camel_ai-0.2.72a4}/camel/models/groq_model.py +0 -0
- {camel_ai-0.2.72a1 → camel_ai-0.2.72a4}/camel/models/internlm_model.py +0 -0
- {camel_ai-0.2.72a1 → camel_ai-0.2.72a4}/camel/models/litellm_model.py +0 -0
- {camel_ai-0.2.72a1 → camel_ai-0.2.72a4}/camel/models/lmstudio_model.py +0 -0
- {camel_ai-0.2.72a1 → camel_ai-0.2.72a4}/camel/models/mistral_model.py +0 -0
- {camel_ai-0.2.72a1 → camel_ai-0.2.72a4}/camel/models/model_factory.py +0 -0
- {camel_ai-0.2.72a1 → camel_ai-0.2.72a4}/camel/models/model_manager.py +0 -0
- {camel_ai-0.2.72a1 → camel_ai-0.2.72a4}/camel/models/modelscope_model.py +0 -0
- {camel_ai-0.2.72a1 → camel_ai-0.2.72a4}/camel/models/moonshot_model.py +0 -0
- {camel_ai-0.2.72a1 → camel_ai-0.2.72a4}/camel/models/nemotron_model.py +0 -0
- {camel_ai-0.2.72a1 → camel_ai-0.2.72a4}/camel/models/netmind_model.py +0 -0
- {camel_ai-0.2.72a1 → camel_ai-0.2.72a4}/camel/models/novita_model.py +0 -0
- {camel_ai-0.2.72a1 → camel_ai-0.2.72a4}/camel/models/nvidia_model.py +0 -0
- {camel_ai-0.2.72a1 → camel_ai-0.2.72a4}/camel/models/ollama_model.py +0 -0
- {camel_ai-0.2.72a1 → camel_ai-0.2.72a4}/camel/models/openai_audio_models.py +0 -0
- {camel_ai-0.2.72a1 → camel_ai-0.2.72a4}/camel/models/openai_compatible_model.py +0 -0
- {camel_ai-0.2.72a1 → camel_ai-0.2.72a4}/camel/models/openai_model.py +0 -0
- {camel_ai-0.2.72a1 → camel_ai-0.2.72a4}/camel/models/openrouter_model.py +0 -0
- {camel_ai-0.2.72a1 → camel_ai-0.2.72a4}/camel/models/ppio_model.py +0 -0
- {camel_ai-0.2.72a1 → camel_ai-0.2.72a4}/camel/models/qianfan_model.py +0 -0
- {camel_ai-0.2.72a1 → camel_ai-0.2.72a4}/camel/models/qwen_model.py +0 -0
- {camel_ai-0.2.72a1 → camel_ai-0.2.72a4}/camel/models/reka_model.py +0 -0
- {camel_ai-0.2.72a1 → camel_ai-0.2.72a4}/camel/models/reward/__init__.py +0 -0
- {camel_ai-0.2.72a1 → camel_ai-0.2.72a4}/camel/models/reward/base_reward_model.py +0 -0
- {camel_ai-0.2.72a1 → camel_ai-0.2.72a4}/camel/models/reward/evaluator.py +0 -0
- {camel_ai-0.2.72a1 → camel_ai-0.2.72a4}/camel/models/reward/nemotron_model.py +0 -0
- {camel_ai-0.2.72a1 → camel_ai-0.2.72a4}/camel/models/reward/skywork_model.py +0 -0
- {camel_ai-0.2.72a1 → camel_ai-0.2.72a4}/camel/models/samba_model.py +0 -0
- {camel_ai-0.2.72a1 → camel_ai-0.2.72a4}/camel/models/sglang_model.py +0 -0
- {camel_ai-0.2.72a1 → camel_ai-0.2.72a4}/camel/models/siliconflow_model.py +0 -0
- {camel_ai-0.2.72a1 → camel_ai-0.2.72a4}/camel/models/stub_model.py +0 -0
- {camel_ai-0.2.72a1 → camel_ai-0.2.72a4}/camel/models/togetherai_model.py +0 -0
- {camel_ai-0.2.72a1 → camel_ai-0.2.72a4}/camel/models/vllm_model.py +0 -0
- {camel_ai-0.2.72a1 → camel_ai-0.2.72a4}/camel/models/volcano_model.py +0 -0
- {camel_ai-0.2.72a1 → camel_ai-0.2.72a4}/camel/models/watsonx_model.py +0 -0
- {camel_ai-0.2.72a1 → camel_ai-0.2.72a4}/camel/models/yi_model.py +0 -0
- {camel_ai-0.2.72a1 → camel_ai-0.2.72a4}/camel/models/zhipuai_model.py +0 -0
- {camel_ai-0.2.72a1 → camel_ai-0.2.72a4}/camel/personas/__init__.py +0 -0
- {camel_ai-0.2.72a1 → camel_ai-0.2.72a4}/camel/personas/persona.py +0 -0
- {camel_ai-0.2.72a1 → camel_ai-0.2.72a4}/camel/personas/persona_hub.py +0 -0
- {camel_ai-0.2.72a1 → camel_ai-0.2.72a4}/camel/prompts/__init__.py +0 -0
- {camel_ai-0.2.72a1 → camel_ai-0.2.72a4}/camel/prompts/ai_society.py +0 -0
- {camel_ai-0.2.72a1 → camel_ai-0.2.72a4}/camel/prompts/base.py +0 -0
- {camel_ai-0.2.72a1 → camel_ai-0.2.72a4}/camel/prompts/code.py +0 -0
- {camel_ai-0.2.72a1 → camel_ai-0.2.72a4}/camel/prompts/evaluation.py +0 -0
- {camel_ai-0.2.72a1 → camel_ai-0.2.72a4}/camel/prompts/generate_text_embedding_data.py +0 -0
- {camel_ai-0.2.72a1 → camel_ai-0.2.72a4}/camel/prompts/image_craft.py +0 -0
- {camel_ai-0.2.72a1 → camel_ai-0.2.72a4}/camel/prompts/misalignment.py +0 -0
- {camel_ai-0.2.72a1 → camel_ai-0.2.72a4}/camel/prompts/multi_condition_image_craft.py +0 -0
- {camel_ai-0.2.72a1 → camel_ai-0.2.72a4}/camel/prompts/object_recognition.py +0 -0
- {camel_ai-0.2.72a1 → camel_ai-0.2.72a4}/camel/prompts/persona_hub.py +0 -0
- {camel_ai-0.2.72a1 → camel_ai-0.2.72a4}/camel/prompts/prompt_templates.py +0 -0
- {camel_ai-0.2.72a1 → camel_ai-0.2.72a4}/camel/prompts/role_description_prompt_template.py +0 -0
- {camel_ai-0.2.72a1 → camel_ai-0.2.72a4}/camel/prompts/solution_extraction.py +0 -0
- {camel_ai-0.2.72a1 → camel_ai-0.2.72a4}/camel/prompts/task_prompt_template.py +0 -0
- {camel_ai-0.2.72a1 → camel_ai-0.2.72a4}/camel/prompts/translation.py +0 -0
- {camel_ai-0.2.72a1 → camel_ai-0.2.72a4}/camel/prompts/video_description_prompt.py +0 -0
- {camel_ai-0.2.72a1 → camel_ai-0.2.72a4}/camel/py.typed +0 -0
- {camel_ai-0.2.72a1 → camel_ai-0.2.72a4}/camel/responses/__init__.py +0 -0
- {camel_ai-0.2.72a1 → camel_ai-0.2.72a4}/camel/responses/agent_responses.py +0 -0
- {camel_ai-0.2.72a1 → camel_ai-0.2.72a4}/camel/retrievers/__init__.py +0 -0
- {camel_ai-0.2.72a1 → camel_ai-0.2.72a4}/camel/retrievers/auto_retriever.py +0 -0
- {camel_ai-0.2.72a1 → camel_ai-0.2.72a4}/camel/retrievers/base.py +0 -0
- {camel_ai-0.2.72a1 → camel_ai-0.2.72a4}/camel/retrievers/bm25_retriever.py +0 -0
- {camel_ai-0.2.72a1 → camel_ai-0.2.72a4}/camel/retrievers/cohere_rerank_retriever.py +0 -0
- {camel_ai-0.2.72a1 → camel_ai-0.2.72a4}/camel/retrievers/hybrid_retrival.py +0 -0
- {camel_ai-0.2.72a1 → camel_ai-0.2.72a4}/camel/retrievers/vector_retriever.py +0 -0
- {camel_ai-0.2.72a1 → camel_ai-0.2.72a4}/camel/runtimes/__init__.py +0 -0
- {camel_ai-0.2.72a1 → camel_ai-0.2.72a4}/camel/runtimes/api.py +0 -0
- {camel_ai-0.2.72a1 → camel_ai-0.2.72a4}/camel/runtimes/base.py +0 -0
- {camel_ai-0.2.72a1 → camel_ai-0.2.72a4}/camel/runtimes/configs.py +0 -0
- {camel_ai-0.2.72a1 → camel_ai-0.2.72a4}/camel/runtimes/daytona_runtime.py +0 -0
- {camel_ai-0.2.72a1 → camel_ai-0.2.72a4}/camel/runtimes/docker_runtime.py +0 -0
- {camel_ai-0.2.72a1 → camel_ai-0.2.72a4}/camel/runtimes/llm_guard_runtime.py +0 -0
- {camel_ai-0.2.72a1 → camel_ai-0.2.72a4}/camel/runtimes/remote_http_runtime.py +0 -0
- {camel_ai-0.2.72a1 → camel_ai-0.2.72a4}/camel/runtimes/ubuntu_docker_runtime.py +0 -0
- {camel_ai-0.2.72a1 → camel_ai-0.2.72a4}/camel/runtimes/utils/__init__.py +0 -0
- {camel_ai-0.2.72a1 → camel_ai-0.2.72a4}/camel/runtimes/utils/function_risk_toolkit.py +0 -0
- {camel_ai-0.2.72a1 → camel_ai-0.2.72a4}/camel/runtimes/utils/ignore_risk_toolkit.py +0 -0
- {camel_ai-0.2.72a1 → camel_ai-0.2.72a4}/camel/schemas/__init__.py +0 -0
- {camel_ai-0.2.72a1 → camel_ai-0.2.72a4}/camel/schemas/base.py +0 -0
- {camel_ai-0.2.72a1 → camel_ai-0.2.72a4}/camel/schemas/openai_converter.py +0 -0
- {camel_ai-0.2.72a1 → camel_ai-0.2.72a4}/camel/schemas/outlines_converter.py +0 -0
- {camel_ai-0.2.72a1 → camel_ai-0.2.72a4}/camel/services/agent_openapi_server.py +0 -0
- {camel_ai-0.2.72a1 → camel_ai-0.2.72a4}/camel/societies/__init__.py +0 -0
- {camel_ai-0.2.72a1 → camel_ai-0.2.72a4}/camel/societies/babyagi_playing.py +0 -0
- {camel_ai-0.2.72a1 → camel_ai-0.2.72a4}/camel/societies/role_playing.py +0 -0
- {camel_ai-0.2.72a1 → camel_ai-0.2.72a4}/camel/societies/workforce/__init__.py +0 -0
- {camel_ai-0.2.72a1 → camel_ai-0.2.72a4}/camel/societies/workforce/base.py +0 -0
- {camel_ai-0.2.72a1 → camel_ai-0.2.72a4}/camel/societies/workforce/role_playing_worker.py +0 -0
- {camel_ai-0.2.72a1 → camel_ai-0.2.72a4}/camel/societies/workforce/single_agent_worker.py +0 -0
- {camel_ai-0.2.72a1 → camel_ai-0.2.72a4}/camel/societies/workforce/structured_output_handler.py +0 -0
- {camel_ai-0.2.72a1 → camel_ai-0.2.72a4}/camel/societies/workforce/task_channel.py +0 -0
- {camel_ai-0.2.72a1 → camel_ai-0.2.72a4}/camel/societies/workforce/utils.py +0 -0
- {camel_ai-0.2.72a1 → camel_ai-0.2.72a4}/camel/societies/workforce/worker.py +0 -0
- {camel_ai-0.2.72a1 → camel_ai-0.2.72a4}/camel/societies/workforce/workforce.py +0 -0
- {camel_ai-0.2.72a1 → camel_ai-0.2.72a4}/camel/societies/workforce/workforce_logger.py +0 -0
- {camel_ai-0.2.72a1 → camel_ai-0.2.72a4}/camel/storages/__init__.py +0 -0
- {camel_ai-0.2.72a1 → camel_ai-0.2.72a4}/camel/storages/graph_storages/__init__.py +0 -0
- {camel_ai-0.2.72a1 → camel_ai-0.2.72a4}/camel/storages/graph_storages/base.py +0 -0
- {camel_ai-0.2.72a1 → camel_ai-0.2.72a4}/camel/storages/graph_storages/graph_element.py +0 -0
- {camel_ai-0.2.72a1 → camel_ai-0.2.72a4}/camel/storages/graph_storages/nebula_graph.py +0 -0
- {camel_ai-0.2.72a1 → camel_ai-0.2.72a4}/camel/storages/graph_storages/neo4j_graph.py +0 -0
- {camel_ai-0.2.72a1 → camel_ai-0.2.72a4}/camel/storages/key_value_storages/__init__.py +0 -0
- {camel_ai-0.2.72a1 → camel_ai-0.2.72a4}/camel/storages/key_value_storages/base.py +0 -0
- {camel_ai-0.2.72a1 → camel_ai-0.2.72a4}/camel/storages/key_value_storages/in_memory.py +0 -0
- {camel_ai-0.2.72a1 → camel_ai-0.2.72a4}/camel/storages/key_value_storages/json.py +0 -0
- {camel_ai-0.2.72a1 → camel_ai-0.2.72a4}/camel/storages/key_value_storages/mem0_cloud.py +0 -0
- {camel_ai-0.2.72a1 → camel_ai-0.2.72a4}/camel/storages/key_value_storages/redis.py +0 -0
- {camel_ai-0.2.72a1 → camel_ai-0.2.72a4}/camel/storages/object_storages/__init__.py +0 -0
- {camel_ai-0.2.72a1 → camel_ai-0.2.72a4}/camel/storages/object_storages/amazon_s3.py +0 -0
- {camel_ai-0.2.72a1 → camel_ai-0.2.72a4}/camel/storages/object_storages/azure_blob.py +0 -0
- {camel_ai-0.2.72a1 → camel_ai-0.2.72a4}/camel/storages/object_storages/base.py +0 -0
- {camel_ai-0.2.72a1 → camel_ai-0.2.72a4}/camel/storages/object_storages/google_cloud.py +0 -0
- {camel_ai-0.2.72a1 → camel_ai-0.2.72a4}/camel/storages/vectordb_storages/__init__.py +0 -0
- {camel_ai-0.2.72a1 → camel_ai-0.2.72a4}/camel/storages/vectordb_storages/base.py +0 -0
- {camel_ai-0.2.72a1 → camel_ai-0.2.72a4}/camel/storages/vectordb_storages/chroma.py +0 -0
- {camel_ai-0.2.72a1 → camel_ai-0.2.72a4}/camel/storages/vectordb_storages/faiss.py +0 -0
- {camel_ai-0.2.72a1 → camel_ai-0.2.72a4}/camel/storages/vectordb_storages/milvus.py +0 -0
- {camel_ai-0.2.72a1 → camel_ai-0.2.72a4}/camel/storages/vectordb_storages/oceanbase.py +0 -0
- {camel_ai-0.2.72a1 → camel_ai-0.2.72a4}/camel/storages/vectordb_storages/pgvector.py +0 -0
- {camel_ai-0.2.72a1 → camel_ai-0.2.72a4}/camel/storages/vectordb_storages/qdrant.py +0 -0
- {camel_ai-0.2.72a1 → camel_ai-0.2.72a4}/camel/storages/vectordb_storages/tidb.py +0 -0
- {camel_ai-0.2.72a1 → camel_ai-0.2.72a4}/camel/storages/vectordb_storages/weaviate.py +0 -0
- {camel_ai-0.2.72a1 → camel_ai-0.2.72a4}/camel/tasks/__init__.py +0 -0
- {camel_ai-0.2.72a1 → camel_ai-0.2.72a4}/camel/tasks/task.py +0 -0
- {camel_ai-0.2.72a1 → camel_ai-0.2.72a4}/camel/tasks/task_prompt.py +0 -0
- {camel_ai-0.2.72a1 → camel_ai-0.2.72a4}/camel/terminators/__init__.py +0 -0
- {camel_ai-0.2.72a1 → camel_ai-0.2.72a4}/camel/terminators/base.py +0 -0
- {camel_ai-0.2.72a1 → camel_ai-0.2.72a4}/camel/terminators/response_terminator.py +0 -0
- {camel_ai-0.2.72a1 → camel_ai-0.2.72a4}/camel/terminators/token_limit_terminator.py +0 -0
- {camel_ai-0.2.72a1 → camel_ai-0.2.72a4}/camel/toolkits/__init__.py +0 -0
- {camel_ai-0.2.72a1 → camel_ai-0.2.72a4}/camel/toolkits/aci_toolkit.py +0 -0
- {camel_ai-0.2.72a1 → camel_ai-0.2.72a4}/camel/toolkits/arxiv_toolkit.py +0 -0
- {camel_ai-0.2.72a1 → camel_ai-0.2.72a4}/camel/toolkits/ask_news_toolkit.py +0 -0
- {camel_ai-0.2.72a1 → camel_ai-0.2.72a4}/camel/toolkits/async_browser_toolkit.py +0 -0
- {camel_ai-0.2.72a1 → camel_ai-0.2.72a4}/camel/toolkits/audio_analysis_toolkit.py +0 -0
- {camel_ai-0.2.72a1 → camel_ai-0.2.72a4}/camel/toolkits/base.py +0 -0
- {camel_ai-0.2.72a1 → camel_ai-0.2.72a4}/camel/toolkits/bohrium_toolkit.py +0 -0
- {camel_ai-0.2.72a1 → camel_ai-0.2.72a4}/camel/toolkits/browser_toolkit.py +0 -0
- {camel_ai-0.2.72a1 → camel_ai-0.2.72a4}/camel/toolkits/browser_toolkit_commons.py +0 -0
- {camel_ai-0.2.72a1 → camel_ai-0.2.72a4}/camel/toolkits/code_execution.py +0 -0
- {camel_ai-0.2.72a1 → camel_ai-0.2.72a4}/camel/toolkits/craw4ai_toolkit.py +0 -0
- {camel_ai-0.2.72a1 → camel_ai-0.2.72a4}/camel/toolkits/dappier_toolkit.py +0 -0
- {camel_ai-0.2.72a1 → camel_ai-0.2.72a4}/camel/toolkits/data_commons_toolkit.py +0 -0
- {camel_ai-0.2.72a1 → camel_ai-0.2.72a4}/camel/toolkits/edgeone_pages_mcp_toolkit.py +0 -0
- {camel_ai-0.2.72a1 → camel_ai-0.2.72a4}/camel/toolkits/excel_toolkit.py +0 -0
- {camel_ai-0.2.72a1 → camel_ai-0.2.72a4}/camel/toolkits/file_write_toolkit.py +0 -0
- {camel_ai-0.2.72a1 → camel_ai-0.2.72a4}/camel/toolkits/function_tool.py +0 -0
- {camel_ai-0.2.72a1 → camel_ai-0.2.72a4}/camel/toolkits/github_toolkit.py +0 -0
- {camel_ai-0.2.72a1 → camel_ai-0.2.72a4}/camel/toolkits/google_calendar_toolkit.py +0 -0
- {camel_ai-0.2.72a1 → camel_ai-0.2.72a4}/camel/toolkits/google_drive_mcp_toolkit.py +0 -0
- {camel_ai-0.2.72a1 → camel_ai-0.2.72a4}/camel/toolkits/google_maps_toolkit.py +0 -0
- {camel_ai-0.2.72a1 → camel_ai-0.2.72a4}/camel/toolkits/google_scholar_toolkit.py +0 -0
- {camel_ai-0.2.72a1 → camel_ai-0.2.72a4}/camel/toolkits/human_toolkit.py +0 -0
- {camel_ai-0.2.72a1 → camel_ai-0.2.72a4}/camel/toolkits/hybrid_browser_toolkit/__init__.py +0 -0
- {camel_ai-0.2.72a1 → camel_ai-0.2.72a4}/camel/toolkits/hybrid_browser_toolkit/actions.py +0 -0
- {camel_ai-0.2.72a1 → camel_ai-0.2.72a4}/camel/toolkits/hybrid_browser_toolkit/agent.py +0 -0
- {camel_ai-0.2.72a1 → camel_ai-0.2.72a4}/camel/toolkits/hybrid_browser_toolkit/browser_session.py +0 -0
- {camel_ai-0.2.72a1 → camel_ai-0.2.72a4}/camel/toolkits/hybrid_browser_toolkit/config_loader.py +0 -0
- {camel_ai-0.2.72a1 → camel_ai-0.2.72a4}/camel/toolkits/hybrid_browser_toolkit/hybrid_browser_toolkit.py +0 -0
- {camel_ai-0.2.72a1 → camel_ai-0.2.72a4}/camel/toolkits/hybrid_browser_toolkit/snapshot.py +0 -0
- {camel_ai-0.2.72a1 → camel_ai-0.2.72a4}/camel/toolkits/hybrid_browser_toolkit/stealth_script.js +0 -0
- {camel_ai-0.2.72a1 → camel_ai-0.2.72a4}/camel/toolkits/hybrid_browser_toolkit/unified_analyzer.js +0 -0
- {camel_ai-0.2.72a1 → camel_ai-0.2.72a4}/camel/toolkits/image_analysis_toolkit.py +0 -0
- {camel_ai-0.2.72a1 → camel_ai-0.2.72a4}/camel/toolkits/jina_reranker_toolkit.py +0 -0
- {camel_ai-0.2.72a1 → camel_ai-0.2.72a4}/camel/toolkits/klavis_toolkit.py +0 -0
- {camel_ai-0.2.72a1 → camel_ai-0.2.72a4}/camel/toolkits/linkedin_toolkit.py +0 -0
- {camel_ai-0.2.72a1 → camel_ai-0.2.72a4}/camel/toolkits/markitdown_toolkit.py +0 -0
- {camel_ai-0.2.72a1 → camel_ai-0.2.72a4}/camel/toolkits/math_toolkit.py +0 -0
- {camel_ai-0.2.72a1 → camel_ai-0.2.72a4}/camel/toolkits/mcp_toolkit.py +0 -0
- {camel_ai-0.2.72a1 → camel_ai-0.2.72a4}/camel/toolkits/memory_toolkit.py +0 -0
- {camel_ai-0.2.72a1 → camel_ai-0.2.72a4}/camel/toolkits/meshy_toolkit.py +0 -0
- {camel_ai-0.2.72a1 → camel_ai-0.2.72a4}/camel/toolkits/message_agent_toolkit.py +0 -0
- {camel_ai-0.2.72a1 → camel_ai-0.2.72a4}/camel/toolkits/mineru_toolkit.py +0 -0
- {camel_ai-0.2.72a1 → camel_ai-0.2.72a4}/camel/toolkits/networkx_toolkit.py +0 -0
- {camel_ai-0.2.72a1 → camel_ai-0.2.72a4}/camel/toolkits/note_taking_toolkit.py +0 -0
- {camel_ai-0.2.72a1 → camel_ai-0.2.72a4}/camel/toolkits/notion_toolkit.py +0 -0
- {camel_ai-0.2.72a1 → camel_ai-0.2.72a4}/camel/toolkits/open_api_specs/biztoc/__init__.py +0 -0
- {camel_ai-0.2.72a1 → camel_ai-0.2.72a4}/camel/toolkits/open_api_specs/biztoc/ai-plugin.json +0 -0
- {camel_ai-0.2.72a1 → camel_ai-0.2.72a4}/camel/toolkits/open_api_specs/biztoc/openapi.yaml +0 -0
- {camel_ai-0.2.72a1 → camel_ai-0.2.72a4}/camel/toolkits/open_api_specs/coursera/__init__.py +0 -0
- {camel_ai-0.2.72a1 → camel_ai-0.2.72a4}/camel/toolkits/open_api_specs/coursera/openapi.yaml +0 -0
- {camel_ai-0.2.72a1 → camel_ai-0.2.72a4}/camel/toolkits/open_api_specs/create_qr_code/__init__.py +0 -0
- {camel_ai-0.2.72a1 → camel_ai-0.2.72a4}/camel/toolkits/open_api_specs/create_qr_code/openapi.yaml +0 -0
- {camel_ai-0.2.72a1 → camel_ai-0.2.72a4}/camel/toolkits/open_api_specs/klarna/__init__.py +0 -0
- {camel_ai-0.2.72a1 → camel_ai-0.2.72a4}/camel/toolkits/open_api_specs/klarna/openapi.yaml +0 -0
- {camel_ai-0.2.72a1 → camel_ai-0.2.72a4}/camel/toolkits/open_api_specs/nasa_apod/__init__.py +0 -0
- {camel_ai-0.2.72a1 → camel_ai-0.2.72a4}/camel/toolkits/open_api_specs/nasa_apod/openapi.yaml +0 -0
- {camel_ai-0.2.72a1 → camel_ai-0.2.72a4}/camel/toolkits/open_api_specs/outschool/__init__.py +0 -0
- {camel_ai-0.2.72a1 → camel_ai-0.2.72a4}/camel/toolkits/open_api_specs/outschool/ai-plugin.json +0 -0
- {camel_ai-0.2.72a1 → camel_ai-0.2.72a4}/camel/toolkits/open_api_specs/outschool/openapi.yaml +0 -0
- {camel_ai-0.2.72a1 → camel_ai-0.2.72a4}/camel/toolkits/open_api_specs/outschool/paths/__init__.py +0 -0
- {camel_ai-0.2.72a1 → camel_ai-0.2.72a4}/camel/toolkits/open_api_specs/outschool/paths/get_classes.py +0 -0
- {camel_ai-0.2.72a1 → camel_ai-0.2.72a4}/camel/toolkits/open_api_specs/outschool/paths/search_teachers.py +0 -0
- {camel_ai-0.2.72a1 → camel_ai-0.2.72a4}/camel/toolkits/open_api_specs/security_config.py +0 -0
- {camel_ai-0.2.72a1 → camel_ai-0.2.72a4}/camel/toolkits/open_api_specs/speak/__init__.py +0 -0
- {camel_ai-0.2.72a1 → camel_ai-0.2.72a4}/camel/toolkits/open_api_specs/speak/openapi.yaml +0 -0
- {camel_ai-0.2.72a1 → camel_ai-0.2.72a4}/camel/toolkits/open_api_specs/web_scraper/__init__.py +0 -0
- {camel_ai-0.2.72a1 → camel_ai-0.2.72a4}/camel/toolkits/open_api_specs/web_scraper/ai-plugin.json +0 -0
- {camel_ai-0.2.72a1 → camel_ai-0.2.72a4}/camel/toolkits/open_api_specs/web_scraper/openapi.yaml +0 -0
- {camel_ai-0.2.72a1 → camel_ai-0.2.72a4}/camel/toolkits/open_api_specs/web_scraper/paths/__init__.py +0 -0
- {camel_ai-0.2.72a1 → camel_ai-0.2.72a4}/camel/toolkits/open_api_specs/web_scraper/paths/scraper.py +0 -0
- {camel_ai-0.2.72a1 → camel_ai-0.2.72a4}/camel/toolkits/open_api_toolkit.py +0 -0
- {camel_ai-0.2.72a1 → camel_ai-0.2.72a4}/camel/toolkits/openai_agent_toolkit.py +0 -0
- {camel_ai-0.2.72a1 → camel_ai-0.2.72a4}/camel/toolkits/openai_image_toolkit.py +0 -0
- {camel_ai-0.2.72a1 → camel_ai-0.2.72a4}/camel/toolkits/openbb_toolkit.py +0 -0
- {camel_ai-0.2.72a1 → camel_ai-0.2.72a4}/camel/toolkits/page_script.js +0 -0
- {camel_ai-0.2.72a1 → camel_ai-0.2.72a4}/camel/toolkits/playwright_mcp_toolkit.py +0 -0
- {camel_ai-0.2.72a1 → camel_ai-0.2.72a4}/camel/toolkits/pptx_toolkit.py +0 -0
- {camel_ai-0.2.72a1 → camel_ai-0.2.72a4}/camel/toolkits/pubmed_toolkit.py +0 -0
- {camel_ai-0.2.72a1 → camel_ai-0.2.72a4}/camel/toolkits/pulse_mcp_search_toolkit.py +0 -0
- {camel_ai-0.2.72a1 → camel_ai-0.2.72a4}/camel/toolkits/pyautogui_toolkit.py +0 -0
- {camel_ai-0.2.72a1 → camel_ai-0.2.72a4}/camel/toolkits/reddit_toolkit.py +0 -0
- {camel_ai-0.2.72a1 → camel_ai-0.2.72a4}/camel/toolkits/retrieval_toolkit.py +0 -0
- {camel_ai-0.2.72a1 → camel_ai-0.2.72a4}/camel/toolkits/search_toolkit.py +0 -0
- {camel_ai-0.2.72a1 → camel_ai-0.2.72a4}/camel/toolkits/searxng_toolkit.py +0 -0
- {camel_ai-0.2.72a1 → camel_ai-0.2.72a4}/camel/toolkits/semantic_scholar_toolkit.py +0 -0
- {camel_ai-0.2.72a1 → camel_ai-0.2.72a4}/camel/toolkits/slack_toolkit.py +0 -0
- {camel_ai-0.2.72a1 → camel_ai-0.2.72a4}/camel/toolkits/stripe_toolkit.py +0 -0
- {camel_ai-0.2.72a1 → camel_ai-0.2.72a4}/camel/toolkits/sympy_toolkit.py +0 -0
- {camel_ai-0.2.72a1 → camel_ai-0.2.72a4}/camel/toolkits/task_planning_toolkit.py +0 -0
- {camel_ai-0.2.72a1 → camel_ai-0.2.72a4}/camel/toolkits/thinking_toolkit.py +0 -0
- {camel_ai-0.2.72a1 → camel_ai-0.2.72a4}/camel/toolkits/twitter_toolkit.py +0 -0
- {camel_ai-0.2.72a1 → camel_ai-0.2.72a4}/camel/toolkits/video_analysis_toolkit.py +0 -0
- {camel_ai-0.2.72a1 → camel_ai-0.2.72a4}/camel/toolkits/video_download_toolkit.py +0 -0
- {camel_ai-0.2.72a1 → camel_ai-0.2.72a4}/camel/toolkits/weather_toolkit.py +0 -0
- {camel_ai-0.2.72a1 → camel_ai-0.2.72a4}/camel/toolkits/whatsapp_toolkit.py +0 -0
- {camel_ai-0.2.72a1 → camel_ai-0.2.72a4}/camel/toolkits/wolfram_alpha_toolkit.py +0 -0
- {camel_ai-0.2.72a1 → camel_ai-0.2.72a4}/camel/toolkits/zapier_toolkit.py +0 -0
- {camel_ai-0.2.72a1 → camel_ai-0.2.72a4}/camel/types/__init__.py +0 -0
- {camel_ai-0.2.72a1 → camel_ai-0.2.72a4}/camel/types/agents/__init__.py +0 -0
- {camel_ai-0.2.72a1 → camel_ai-0.2.72a4}/camel/types/agents/tool_calling_record.py +0 -0
- {camel_ai-0.2.72a1 → camel_ai-0.2.72a4}/camel/types/enums.py +0 -0
- {camel_ai-0.2.72a1 → camel_ai-0.2.72a4}/camel/types/mcp_registries.py +0 -0
- {camel_ai-0.2.72a1 → camel_ai-0.2.72a4}/camel/types/openai_types.py +0 -0
- {camel_ai-0.2.72a1 → camel_ai-0.2.72a4}/camel/types/unified_model_type.py +0 -0
- {camel_ai-0.2.72a1 → camel_ai-0.2.72a4}/camel/utils/__init__.py +0 -0
- {camel_ai-0.2.72a1 → camel_ai-0.2.72a4}/camel/utils/async_func.py +0 -0
- {camel_ai-0.2.72a1 → camel_ai-0.2.72a4}/camel/utils/chunker/__init__.py +0 -0
- {camel_ai-0.2.72a1 → camel_ai-0.2.72a4}/camel/utils/chunker/base.py +0 -0
- {camel_ai-0.2.72a1 → camel_ai-0.2.72a4}/camel/utils/chunker/code_chunker.py +0 -0
- {camel_ai-0.2.72a1 → camel_ai-0.2.72a4}/camel/utils/chunker/uio_chunker.py +0 -0
- {camel_ai-0.2.72a1 → camel_ai-0.2.72a4}/camel/utils/commons.py +0 -0
- {camel_ai-0.2.72a1 → camel_ai-0.2.72a4}/camel/utils/constants.py +0 -0
- {camel_ai-0.2.72a1 → camel_ai-0.2.72a4}/camel/utils/deduplication.py +0 -0
- {camel_ai-0.2.72a1 → camel_ai-0.2.72a4}/camel/utils/filename.py +0 -0
- {camel_ai-0.2.72a1 → camel_ai-0.2.72a4}/camel/utils/langfuse.py +0 -0
- {camel_ai-0.2.72a1 → camel_ai-0.2.72a4}/camel/utils/mcp.py +0 -0
- {camel_ai-0.2.72a1 → camel_ai-0.2.72a4}/camel/utils/mcp_client.py +0 -0
- {camel_ai-0.2.72a1 → camel_ai-0.2.72a4}/camel/utils/message_summarizer.py +0 -0
- {camel_ai-0.2.72a1 → camel_ai-0.2.72a4}/camel/utils/response_format.py +0 -0
- {camel_ai-0.2.72a1 → camel_ai-0.2.72a4}/camel/utils/token_counting.py +0 -0
- {camel_ai-0.2.72a1 → camel_ai-0.2.72a4}/camel/utils/tool_result.py +0 -0
- {camel_ai-0.2.72a1 → camel_ai-0.2.72a4}/camel/verifiers/__init__.py +0 -0
- {camel_ai-0.2.72a1 → camel_ai-0.2.72a4}/camel/verifiers/base.py +0 -0
- {camel_ai-0.2.72a1 → camel_ai-0.2.72a4}/camel/verifiers/math_verifier.py +0 -0
- {camel_ai-0.2.72a1 → camel_ai-0.2.72a4}/camel/verifiers/models.py +0 -0
- {camel_ai-0.2.72a1 → camel_ai-0.2.72a4}/camel/verifiers/physics_verifier.py +0 -0
- {camel_ai-0.2.72a1 → camel_ai-0.2.72a4}/camel/verifiers/python_verifier.py +0 -0
|
@@ -202,16 +202,20 @@ TASK_DECOMPOSE_PROMPT = r"""You need to decompose the given task into subtasks a
|
|
|
202
202
|
* **DO NOT** use relative references like "the first task," "the paper mentioned above," or "the result from the previous step."
|
|
203
203
|
* **DO** write explicit instructions. For example, instead of "Analyze the document," write "Analyze the document titled 'The Future of AI'." The system will automatically provide the necessary inputs (like the document itself) from previous steps.
|
|
204
204
|
|
|
205
|
-
|
|
205
|
+
2. **Define Clear Deliverables**: Each subtask must specify a clear, concrete deliverable. This tells the agent exactly what to produce and provides a clear "definition of done."
|
|
206
|
+
* **DO NOT** use vague verbs like "analyze," "look into," or "research" without defining the output.
|
|
207
|
+
* **DO** specify the format and content of the output. For example, instead of "Analyze the attached report," write "Summarize the key findings of the attached report in a 3-bullet-point list." Instead of "Find contacts," write "Extract all names and email addresses from the document and return them as a JSON list of objects, where each object has a 'name' and 'email' key."
|
|
208
|
+
|
|
209
|
+
3. **Strategic Grouping for Sequential Work**:
|
|
206
210
|
* If a series of steps must be done in order *and* can be handled by the same worker type, group them into a single subtask to maintain flow and minimize handoffs.
|
|
207
211
|
|
|
208
|
-
|
|
212
|
+
4. **Aggressive Parallelization**:
|
|
209
213
|
* **Across Different Worker Specializations**: If distinct phases of the overall task require different types of workers (e.g., research by a 'SearchAgent', then content creation by a 'DocumentAgent'), define these as separate subtasks.
|
|
210
214
|
* **Within a Single Phase (Data/Task Parallelism)**: If a phase involves repetitive operations on multiple items (e.g., processing 10 documents, fetching 5 web pages, analyzing 3 datasets):
|
|
211
215
|
* Decompose this into parallel subtasks, one for each item or a small batch of items.
|
|
212
216
|
* This applies even if the same type of worker handles these parallel subtasks. The goal is to leverage multiple available workers or allow concurrent processing.
|
|
213
217
|
|
|
214
|
-
|
|
218
|
+
5. **Subtask Design for Efficiency**:
|
|
215
219
|
* **Actionable and Well-Defined**: Each subtask should have a clear, achievable goal.
|
|
216
220
|
* **Balanced Granularity**: Make subtasks large enough to be meaningful but small enough to enable parallelism and quick feedback. Avoid overly large subtasks that hide parallel opportunities.
|
|
217
221
|
* **Consider Dependencies**: While you list tasks sequentially, think about the true dependencies. The workforce manager will handle execution based on these implied dependencies and worker availability.
|
|
@@ -229,10 +233,10 @@ These principles aim to reduce overall completion time by maximizing concurrent
|
|
|
229
233
|
* **Correct Decomposition**:
|
|
230
234
|
```xml
|
|
231
235
|
<tasks>
|
|
232
|
-
<task>Create a short blog post about the benefits of Python by researching key benefits, writing a 300-word article, and finding a suitable image.</task>
|
|
236
|
+
<task>Create a short blog post about the benefits of Python by researching key benefits, writing a 300-word article, and finding a suitable image. The final output should be a single string containing the 300-word article followed by the image URL.</task>
|
|
233
237
|
</tasks>
|
|
234
238
|
```
|
|
235
|
-
* **Reasoning**: All steps are sequential and can be handled by the same worker type (`Document Agent`). Grouping them into one subtask is efficient and maintains the workflow, following the "Strategic Grouping" principle.
|
|
239
|
+
* **Reasoning**: All steps are sequential and can be handled by the same worker type (`Document Agent`). Grouping them into one subtask is efficient and maintains the workflow, following the "Strategic Grouping" principle. **The deliverable is clearly defined as a single string.**
|
|
236
240
|
|
|
237
241
|
***
|
|
238
242
|
**Example 2: Parallel Task Across Different Workers**
|
|
@@ -245,14 +249,14 @@ These principles aim to reduce overall completion time by maximizing concurrent
|
|
|
245
249
|
* **Correct Decomposition**:
|
|
246
250
|
```xml
|
|
247
251
|
<tasks>
|
|
248
|
-
<task>Create a financial summary for Apple (AAPL) for Q2.</task>
|
|
249
|
-
<task>Create a financial summary for Google (GOOGL) for Q2.</task>
|
|
250
|
-
<task>Perform market sentiment analysis for Apple (AAPL) for Q2.</task>
|
|
251
|
-
<task>Perform market sentiment analysis for Google (GOOGL) for Q2.</task>
|
|
252
|
-
<task>Compile the provided financial summaries and market sentiment
|
|
252
|
+
<task>Create a 1-paragraph financial summary for Apple (AAPL) for Q2, covering revenue, net income, and EPS. The output must be a plain text paragraph.</task>
|
|
253
|
+
<task>Create a 1-paragraph financial summary for Google (GOOGL) for Q2, covering revenue, net income, and EPS. The output must be a plain text paragraph.</task>
|
|
254
|
+
<task>Perform a market sentiment analysis for Apple (AAPL) for Q2, returning a single sentiment score from -1 (very negative) to 1 (very positive). The output must be a single floating-point number.</task>
|
|
255
|
+
<task>Perform a market sentiment analysis for Google (GOOGL) for Q2, returning a single sentiment score from -1 (very negative) to 1 (very positive). The output must be a single floating-point number.</task>
|
|
256
|
+
<task>Compile the provided financial summaries and market sentiment scores for Apple (AAPL) and Google (GOOGL) into a single Q2 performance report. The report should be a markdown-formatted document.</task>
|
|
253
257
|
</tasks>
|
|
254
258
|
```
|
|
255
|
-
* **Reasoning**: The financial analysis and market research can be done in parallel for both companies. The final report depends on all previous steps. This decomposition leverages worker specialization and parallelism, following the "Aggressive Parallelization" principle.
|
|
259
|
+
* **Reasoning**: The financial analysis and market research can be done in parallel for both companies. The final report depends on all previous steps. This decomposition leverages worker specialization and parallelism, following the "Aggressive Parallelization" principle. **Each subtask has a clearly defined deliverable.**
|
|
256
260
|
***
|
|
257
261
|
|
|
258
262
|
**END OF EXAMPLES** - Now, apply these principles and examples to decompose the following task.
|
|
@@ -16,6 +16,7 @@ import atexit
|
|
|
16
16
|
import os
|
|
17
17
|
import platform
|
|
18
18
|
import queue
|
|
19
|
+
import shutil
|
|
19
20
|
import subprocess
|
|
20
21
|
import sys
|
|
21
22
|
import threading
|
|
@@ -41,21 +42,25 @@ class TerminalToolkit(BaseToolkit):
|
|
|
41
42
|
|
|
42
43
|
Args:
|
|
43
44
|
timeout (Optional[float]): The timeout for terminal operations.
|
|
45
|
+
(default: :obj:`None`)
|
|
44
46
|
shell_sessions (Optional[Dict[str, Any]]): A dictionary to store
|
|
45
|
-
shell session information. If None
|
|
46
|
-
used. (default: :obj:`
|
|
47
|
-
|
|
48
|
-
If
|
|
49
|
-
|
|
50
|
-
|
|
47
|
+
shell session information. If :obj:`None`, an empty dictionary
|
|
48
|
+
will be used. (default: :obj:`None`)
|
|
49
|
+
working_directory (Optional[str]): The working directory for
|
|
50
|
+
operations. If not provided, it will be determined by the
|
|
51
|
+
`CAMEL_WORKDIR` environment variable (if set). If the
|
|
52
|
+
environment variable is not set, it defaults to `./workspace`. All
|
|
53
|
+
execution and write operations will be restricted to this
|
|
54
|
+
directory. Read operations can access paths outside this
|
|
55
|
+
directory. (default: :obj:`None`)
|
|
51
56
|
need_terminal (bool): Whether to create a terminal interface.
|
|
52
57
|
(default: :obj:`True`)
|
|
53
|
-
use_shell_mode (bool): Whether to use shell mode for command
|
|
54
|
-
(default: :obj:`True`)
|
|
58
|
+
use_shell_mode (bool): Whether to use shell mode for command
|
|
59
|
+
execution. (default: :obj:`True`)
|
|
55
60
|
clone_current_env (bool): Whether to clone the current Python
|
|
56
|
-
environment.(default: :obj:`False`)
|
|
57
|
-
safe_mode (bool): Whether to enable safe mode to restrict
|
|
58
|
-
(default: :obj:`True`)
|
|
61
|
+
environment. (default: :obj:`False`)
|
|
62
|
+
safe_mode (bool): Whether to enable safe mode to restrict
|
|
63
|
+
operations. (default: :obj:`True`)
|
|
59
64
|
|
|
60
65
|
Note:
|
|
61
66
|
Most functions are compatible with Unix-based systems (macOS, Linux).
|
|
@@ -67,7 +72,7 @@ class TerminalToolkit(BaseToolkit):
|
|
|
67
72
|
self,
|
|
68
73
|
timeout: Optional[float] = None,
|
|
69
74
|
shell_sessions: Optional[Dict[str, Any]] = None,
|
|
70
|
-
|
|
75
|
+
working_directory: Optional[str] = None,
|
|
71
76
|
need_terminal: bool = True,
|
|
72
77
|
use_shell_mode: bool = True,
|
|
73
78
|
clone_current_env: bool = False,
|
|
@@ -88,12 +93,22 @@ class TerminalToolkit(BaseToolkit):
|
|
|
88
93
|
|
|
89
94
|
self.python_executable = sys.executable
|
|
90
95
|
self.is_macos = platform.system() == 'Darwin'
|
|
96
|
+
self.initial_env_path: Optional[str] = None
|
|
97
|
+
self.initial_env_prepared = False
|
|
91
98
|
|
|
92
99
|
atexit.register(self.__del__)
|
|
93
100
|
|
|
94
|
-
if
|
|
95
|
-
|
|
96
|
-
|
|
101
|
+
if working_directory:
|
|
102
|
+
self.working_dir = os.path.abspath(working_directory)
|
|
103
|
+
else:
|
|
104
|
+
camel_workdir = os.environ.get("CAMEL_WORKDIR")
|
|
105
|
+
if camel_workdir:
|
|
106
|
+
self.working_dir = os.path.abspath(camel_workdir)
|
|
107
|
+
else:
|
|
108
|
+
self.working_dir = os.path.abspath("./workspace")
|
|
109
|
+
|
|
110
|
+
if not os.path.exists(self.working_dir):
|
|
111
|
+
os.makedirs(self.working_dir, exist_ok=True)
|
|
97
112
|
self._update_terminal_output(
|
|
98
113
|
f"Working directory set to: {self.working_dir}\n"
|
|
99
114
|
)
|
|
@@ -108,6 +123,7 @@ class TerminalToolkit(BaseToolkit):
|
|
|
108
123
|
self._clone_current_environment()
|
|
109
124
|
else:
|
|
110
125
|
self.cloned_env_path = None
|
|
126
|
+
self._prepare_initial_environment()
|
|
111
127
|
|
|
112
128
|
if need_terminal:
|
|
113
129
|
if self.is_macos:
|
|
@@ -178,20 +194,243 @@ class TerminalToolkit(BaseToolkit):
|
|
|
178
194
|
return
|
|
179
195
|
|
|
180
196
|
self._update_terminal_output(
|
|
181
|
-
f"Creating new Python environment at:{self.cloned_env_path}\n"
|
|
197
|
+
f"Creating new Python environment at: {self.cloned_env_path}\n"
|
|
182
198
|
)
|
|
183
199
|
|
|
200
|
+
# Create virtual environment with pip
|
|
184
201
|
venv.create(self.cloned_env_path, with_pip=True)
|
|
202
|
+
|
|
203
|
+
# Ensure pip is properly available by upgrading it
|
|
204
|
+
if self.os_type == 'Windows':
|
|
205
|
+
python_path = os.path.join(
|
|
206
|
+
self.cloned_env_path, "Scripts", "python.exe"
|
|
207
|
+
)
|
|
208
|
+
else:
|
|
209
|
+
python_path = os.path.join(
|
|
210
|
+
self.cloned_env_path, "bin", "python"
|
|
211
|
+
)
|
|
212
|
+
|
|
213
|
+
# Verify python executable exists
|
|
214
|
+
if os.path.exists(python_path):
|
|
215
|
+
# Use python -m pip to ensure pip is available
|
|
216
|
+
subprocess.run(
|
|
217
|
+
[python_path, "-m", "pip", "install", "--upgrade", "pip"],
|
|
218
|
+
check=True,
|
|
219
|
+
capture_output=True,
|
|
220
|
+
cwd=self.working_dir,
|
|
221
|
+
timeout=60,
|
|
222
|
+
)
|
|
223
|
+
self._update_terminal_output(
|
|
224
|
+
"New Python environment created successfully with pip!\n"
|
|
225
|
+
)
|
|
226
|
+
else:
|
|
227
|
+
self._update_terminal_output(
|
|
228
|
+
f"Warning: Python executable not found at {python_path}\n"
|
|
229
|
+
)
|
|
230
|
+
|
|
231
|
+
except subprocess.CalledProcessError as e:
|
|
232
|
+
error_msg = e.stderr.decode() if e.stderr else str(e)
|
|
185
233
|
self._update_terminal_output(
|
|
186
|
-
"
|
|
234
|
+
f"Failed to upgrade pip in cloned environment: {error_msg}\n"
|
|
235
|
+
)
|
|
236
|
+
logger.error(f"Failed to upgrade pip: {error_msg}")
|
|
237
|
+
except subprocess.TimeoutExpired:
|
|
238
|
+
self._update_terminal_output(
|
|
239
|
+
"Pip upgrade timed out, but environment may still be usable\n"
|
|
187
240
|
)
|
|
188
|
-
|
|
189
241
|
except Exception as e:
|
|
190
242
|
self._update_terminal_output(
|
|
191
243
|
f"Failed to create environment: {e!s}\n"
|
|
192
244
|
)
|
|
193
245
|
logger.error(f"Failed to create environment: {e}")
|
|
194
246
|
|
|
247
|
+
def _is_uv_environment(self) -> bool:
|
|
248
|
+
r"""Detect whether the current Python runtime is managed by uv."""
|
|
249
|
+
return (
|
|
250
|
+
"UV_CACHE_DIR" in os.environ
|
|
251
|
+
or "uv" in sys.executable
|
|
252
|
+
or shutil.which("uv") is not None
|
|
253
|
+
)
|
|
254
|
+
|
|
255
|
+
def _prepare_initial_environment(self):
|
|
256
|
+
r"""Prepare initial environment with Python 3.10, pip, and other
|
|
257
|
+
essential tools.
|
|
258
|
+
"""
|
|
259
|
+
try:
|
|
260
|
+
self.initial_env_path = os.path.join(
|
|
261
|
+
self.working_dir, ".initial_env"
|
|
262
|
+
)
|
|
263
|
+
|
|
264
|
+
if os.path.exists(self.initial_env_path):
|
|
265
|
+
self._update_terminal_output(
|
|
266
|
+
f"Using existing initial environment"
|
|
267
|
+
f": {self.initial_env_path}\n"
|
|
268
|
+
)
|
|
269
|
+
self.initial_env_prepared = True
|
|
270
|
+
return
|
|
271
|
+
|
|
272
|
+
self._update_terminal_output(
|
|
273
|
+
f"Preparing initial environment at: {self.initial_env_path}\n"
|
|
274
|
+
)
|
|
275
|
+
|
|
276
|
+
# Create the initial environment directory
|
|
277
|
+
os.makedirs(self.initial_env_path, exist_ok=True)
|
|
278
|
+
|
|
279
|
+
# Check if we should use uv
|
|
280
|
+
if self._is_uv_environment():
|
|
281
|
+
self._setup_initial_env_with_uv()
|
|
282
|
+
else:
|
|
283
|
+
self._setup_initial_env_with_venv()
|
|
284
|
+
|
|
285
|
+
self.initial_env_prepared = True
|
|
286
|
+
self._update_terminal_output(
|
|
287
|
+
"Initial environment prepared successfully!\n"
|
|
288
|
+
)
|
|
289
|
+
|
|
290
|
+
except Exception as e:
|
|
291
|
+
self._update_terminal_output(
|
|
292
|
+
f"Failed to prepare initial environment: {e!s}\n"
|
|
293
|
+
)
|
|
294
|
+
logger.error(f"Failed to prepare initial environment: {e}")
|
|
295
|
+
|
|
296
|
+
def _setup_initial_env_with_uv(self):
|
|
297
|
+
r"""Set up initial environment using uv."""
|
|
298
|
+
if self.initial_env_path is None:
|
|
299
|
+
raise Exception("Initial environment path not set")
|
|
300
|
+
|
|
301
|
+
try:
|
|
302
|
+
# Create virtual environment with Python 3.10 using uv
|
|
303
|
+
subprocess.run(
|
|
304
|
+
["uv", "venv", "--python", "3.10", self.initial_env_path],
|
|
305
|
+
check=True,
|
|
306
|
+
capture_output=True,
|
|
307
|
+
cwd=self.working_dir,
|
|
308
|
+
timeout=300,
|
|
309
|
+
)
|
|
310
|
+
|
|
311
|
+
# Get the python path from the new environment
|
|
312
|
+
if self.os_type == 'Windows':
|
|
313
|
+
python_path = os.path.join(
|
|
314
|
+
self.initial_env_path, "Scripts", "python.exe"
|
|
315
|
+
)
|
|
316
|
+
else:
|
|
317
|
+
python_path = os.path.join(
|
|
318
|
+
self.initial_env_path, "bin", "python"
|
|
319
|
+
)
|
|
320
|
+
|
|
321
|
+
# Install essential packages using uv
|
|
322
|
+
essential_packages = ["pip", "setuptools", "wheel"]
|
|
323
|
+
subprocess.run(
|
|
324
|
+
[
|
|
325
|
+
"uv",
|
|
326
|
+
"pip",
|
|
327
|
+
"install",
|
|
328
|
+
"--python",
|
|
329
|
+
python_path,
|
|
330
|
+
*essential_packages,
|
|
331
|
+
],
|
|
332
|
+
check=True,
|
|
333
|
+
capture_output=True,
|
|
334
|
+
cwd=self.working_dir,
|
|
335
|
+
timeout=300,
|
|
336
|
+
)
|
|
337
|
+
|
|
338
|
+
# Check if Node.js is available (but don't install it)
|
|
339
|
+
self._check_nodejs_availability()
|
|
340
|
+
|
|
341
|
+
self._update_terminal_output(
|
|
342
|
+
"[UV] Initial environment created with Python 3.10 "
|
|
343
|
+
"and essential packages\n"
|
|
344
|
+
)
|
|
345
|
+
|
|
346
|
+
except subprocess.CalledProcessError as e:
|
|
347
|
+
error_msg = e.stderr.decode() if e.stderr else str(e)
|
|
348
|
+
raise Exception(f"UV setup failed: {error_msg}")
|
|
349
|
+
except subprocess.TimeoutExpired:
|
|
350
|
+
raise Exception("UV setup timed out after 5 minutes")
|
|
351
|
+
|
|
352
|
+
def _setup_initial_env_with_venv(self):
|
|
353
|
+
r"""Set up initial environment using standard venv."""
|
|
354
|
+
if self.initial_env_path is None:
|
|
355
|
+
raise Exception("Initial environment path not set")
|
|
356
|
+
|
|
357
|
+
try:
|
|
358
|
+
# Create virtual environment with system Python
|
|
359
|
+
venv.create(
|
|
360
|
+
self.initial_env_path,
|
|
361
|
+
with_pip=True,
|
|
362
|
+
system_site_packages=False,
|
|
363
|
+
)
|
|
364
|
+
|
|
365
|
+
# Get pip path
|
|
366
|
+
if self.os_type == 'Windows':
|
|
367
|
+
pip_path = os.path.join(
|
|
368
|
+
self.initial_env_path, "Scripts", "pip.exe"
|
|
369
|
+
)
|
|
370
|
+
else:
|
|
371
|
+
pip_path = os.path.join(self.initial_env_path, "bin", "pip")
|
|
372
|
+
|
|
373
|
+
# Upgrade pip and install essential packages
|
|
374
|
+
essential_packages = ["pip", "setuptools", "wheel"]
|
|
375
|
+
subprocess.run(
|
|
376
|
+
[pip_path, "install", "--upgrade", *essential_packages],
|
|
377
|
+
check=True,
|
|
378
|
+
capture_output=True,
|
|
379
|
+
cwd=self.working_dir,
|
|
380
|
+
timeout=300,
|
|
381
|
+
)
|
|
382
|
+
|
|
383
|
+
# Check if Node.js is available (but don't install it)
|
|
384
|
+
self._check_nodejs_availability()
|
|
385
|
+
|
|
386
|
+
self._update_terminal_output(
|
|
387
|
+
"Initial environment created with system Python and "
|
|
388
|
+
"essential packages\n"
|
|
389
|
+
)
|
|
390
|
+
|
|
391
|
+
except subprocess.CalledProcessError as e:
|
|
392
|
+
error_msg = e.stderr.decode() if e.stderr else str(e)
|
|
393
|
+
raise Exception(f"Venv setup failed: {error_msg}")
|
|
394
|
+
except subprocess.TimeoutExpired:
|
|
395
|
+
raise Exception("Venv setup timed out after 5 minutes")
|
|
396
|
+
|
|
397
|
+
def _check_nodejs_availability(self):
|
|
398
|
+
r"""Check if Node.js is available without modifying the system."""
|
|
399
|
+
try:
|
|
400
|
+
# Check if Node.js is already available in the system
|
|
401
|
+
node_result = subprocess.run(
|
|
402
|
+
["node", "--version"],
|
|
403
|
+
check=False,
|
|
404
|
+
capture_output=True,
|
|
405
|
+
timeout=10,
|
|
406
|
+
)
|
|
407
|
+
|
|
408
|
+
npm_result = subprocess.run(
|
|
409
|
+
["npm", "--version"],
|
|
410
|
+
check=False,
|
|
411
|
+
capture_output=True,
|
|
412
|
+
timeout=10,
|
|
413
|
+
)
|
|
414
|
+
|
|
415
|
+
if node_result.returncode == 0 and npm_result.returncode == 0:
|
|
416
|
+
node_version = node_result.stdout.decode().strip()
|
|
417
|
+
npm_version = npm_result.stdout.decode().strip()
|
|
418
|
+
self._update_terminal_output(
|
|
419
|
+
f"Node.js {node_version} and npm {npm_version} "
|
|
420
|
+
"are available\n"
|
|
421
|
+
)
|
|
422
|
+
else:
|
|
423
|
+
self._update_terminal_output(
|
|
424
|
+
"Note: Node.js not found. If needed, please install it "
|
|
425
|
+
"manually.\n"
|
|
426
|
+
)
|
|
427
|
+
|
|
428
|
+
except Exception as e:
|
|
429
|
+
self._update_terminal_output(
|
|
430
|
+
f"Note: Could not check Node.js availability - {e}.\n"
|
|
431
|
+
)
|
|
432
|
+
logger.warning(f"Failed to check Node.js: {e}")
|
|
433
|
+
|
|
195
434
|
def _create_terminal(self):
|
|
196
435
|
r"""Create a terminal GUI. If GUI creation fails, fallback
|
|
197
436
|
to file output."""
|
|
@@ -335,108 +574,6 @@ class TerminalToolkit(BaseToolkit):
|
|
|
335
574
|
logger.error(f"Failed to copy file: {e}")
|
|
336
575
|
return None
|
|
337
576
|
|
|
338
|
-
def file_find_in_content(
|
|
339
|
-
self, file: str, regex: str, sudo: bool = False
|
|
340
|
-
) -> str:
|
|
341
|
-
r"""Search for text within a file's content using a regular expression.
|
|
342
|
-
|
|
343
|
-
This function is useful for finding specific patterns or lines of text
|
|
344
|
-
within a given file. It uses `grep` on Unix-like systems and `findstr`
|
|
345
|
-
on Windows.
|
|
346
|
-
|
|
347
|
-
Args:
|
|
348
|
-
file (str): The absolute path of the file to search within.
|
|
349
|
-
regex (str): The regular expression pattern to match.
|
|
350
|
-
sudo (bool, optional): Whether to use sudo privileges for the
|
|
351
|
-
search. Defaults to False. Note: Using sudo requires the
|
|
352
|
-
process to have appropriate permissions.
|
|
353
|
-
(default: :obj:`False`)
|
|
354
|
-
|
|
355
|
-
Returns:
|
|
356
|
-
str: The matching content found in the file. If no matches are
|
|
357
|
-
found, an empty string is returned. Returns an error message
|
|
358
|
-
if the file does not exist or another error occurs.
|
|
359
|
-
"""
|
|
360
|
-
|
|
361
|
-
if not os.path.exists(file):
|
|
362
|
-
return f"File not found: {file}"
|
|
363
|
-
|
|
364
|
-
if not os.path.isfile(file):
|
|
365
|
-
return f"The path provided is not a file: {file}"
|
|
366
|
-
|
|
367
|
-
command = []
|
|
368
|
-
if sudo:
|
|
369
|
-
error_msg = self._enforce_working_dir_for_execution(file)
|
|
370
|
-
if error_msg:
|
|
371
|
-
return error_msg
|
|
372
|
-
command.extend(["sudo"])
|
|
373
|
-
|
|
374
|
-
if self.os_type in ['Darwin', 'Linux']: # macOS or Linux
|
|
375
|
-
command.extend(["grep", "-E", regex, file])
|
|
376
|
-
else: # Windows
|
|
377
|
-
# For Windows, we could use PowerShell or findstr
|
|
378
|
-
command.extend(["findstr", "/R", regex, file])
|
|
379
|
-
|
|
380
|
-
try:
|
|
381
|
-
result = subprocess.run(
|
|
382
|
-
command, check=False, capture_output=True, text=True
|
|
383
|
-
)
|
|
384
|
-
return result.stdout.strip()
|
|
385
|
-
except subprocess.SubprocessError as e:
|
|
386
|
-
logger.error(f"Error searching in file content: {e}")
|
|
387
|
-
return f"Error: {e!s}"
|
|
388
|
-
|
|
389
|
-
def file_find_by_name(self, path: str, glob: str) -> str:
|
|
390
|
-
r"""Find files by name in a specified directory using a glob pattern.
|
|
391
|
-
|
|
392
|
-
This function recursively searches for files matching a given name or
|
|
393
|
-
pattern within a directory. It uses `find` on Unix-like systems and
|
|
394
|
-
`dir` on Windows.
|
|
395
|
-
|
|
396
|
-
Args:
|
|
397
|
-
path (str): The absolute path of the directory to search in.
|
|
398
|
-
glob (str): The filename pattern to search for, using glob syntax
|
|
399
|
-
(e.g., "*.py", "data*").
|
|
400
|
-
|
|
401
|
-
Returns:
|
|
402
|
-
str: A newline-separated string containing the paths of the files
|
|
403
|
-
that match the pattern. Returns an error message if the
|
|
404
|
-
directory does not exist or another error occurs.
|
|
405
|
-
"""
|
|
406
|
-
if not os.path.exists(path):
|
|
407
|
-
return f"Directory not found: {path}"
|
|
408
|
-
|
|
409
|
-
if not os.path.isdir(path):
|
|
410
|
-
return f"The path provided is not a directory: {path}"
|
|
411
|
-
|
|
412
|
-
command = []
|
|
413
|
-
if self.os_type in ['Darwin', 'Linux']: # macOS or Linux
|
|
414
|
-
command.extend(["find", path, "-name", glob])
|
|
415
|
-
else: # Windows
|
|
416
|
-
# For Windows, we use dir command with /s for recursive search
|
|
417
|
-
# and /b for bare format
|
|
418
|
-
|
|
419
|
-
pattern = glob
|
|
420
|
-
file_path = os.path.join(path, pattern).replace('/', '\\')
|
|
421
|
-
command.extend(["cmd", "/c", "dir", "/s", "/b", file_path])
|
|
422
|
-
|
|
423
|
-
try:
|
|
424
|
-
result = subprocess.run(
|
|
425
|
-
command,
|
|
426
|
-
check=False,
|
|
427
|
-
capture_output=True,
|
|
428
|
-
text=True,
|
|
429
|
-
shell=False,
|
|
430
|
-
)
|
|
431
|
-
|
|
432
|
-
output = result.stdout.strip()
|
|
433
|
-
if self.os_type == 'Windows':
|
|
434
|
-
output = output.replace('\\', '/')
|
|
435
|
-
return output
|
|
436
|
-
except subprocess.SubprocessError as e:
|
|
437
|
-
logger.error(f"Error finding files by name: {e}")
|
|
438
|
-
return f"Error: {e!s}"
|
|
439
|
-
|
|
440
577
|
def _sanitize_command(self, command: str, exec_dir: str) -> Tuple:
|
|
441
578
|
r"""Check and modify command to ensure safety.
|
|
442
579
|
|
|
@@ -721,24 +858,75 @@ class TerminalToolkit(BaseToolkit):
|
|
|
721
858
|
self._update_terminal_output(f"\n$ {command}\n")
|
|
722
859
|
|
|
723
860
|
if command.startswith('python') or command.startswith('pip'):
|
|
724
|
-
|
|
861
|
+
python_path = None
|
|
862
|
+
pip_path = None
|
|
863
|
+
|
|
864
|
+
# Try cloned environment first
|
|
865
|
+
if self.cloned_env_path and os.path.exists(
|
|
866
|
+
self.cloned_env_path
|
|
867
|
+
):
|
|
725
868
|
if self.os_type == 'Windows':
|
|
726
869
|
base_path = os.path.join(
|
|
727
870
|
self.cloned_env_path, "Scripts"
|
|
728
871
|
)
|
|
729
|
-
|
|
730
|
-
|
|
872
|
+
python_candidate = os.path.join(
|
|
873
|
+
base_path, "python.exe"
|
|
874
|
+
)
|
|
875
|
+
pip_candidate = os.path.join(base_path, "pip.exe")
|
|
731
876
|
else:
|
|
732
877
|
base_path = os.path.join(self.cloned_env_path, "bin")
|
|
733
|
-
|
|
734
|
-
|
|
735
|
-
|
|
878
|
+
python_candidate = os.path.join(base_path, "python")
|
|
879
|
+
pip_candidate = os.path.join(base_path, "pip")
|
|
880
|
+
|
|
881
|
+
# Verify the executables exist
|
|
882
|
+
if os.path.exists(python_candidate):
|
|
883
|
+
python_path = python_candidate
|
|
884
|
+
# For pip, use python -m pip if pip executable doesn't
|
|
885
|
+
# exist
|
|
886
|
+
if os.path.exists(pip_candidate):
|
|
887
|
+
pip_path = pip_candidate
|
|
888
|
+
else:
|
|
889
|
+
pip_path = f'"{python_path}" -m pip'
|
|
890
|
+
|
|
891
|
+
# Try initial environment if cloned environment failed
|
|
892
|
+
if (
|
|
893
|
+
python_path is None
|
|
894
|
+
and self.initial_env_prepared
|
|
895
|
+
and self.initial_env_path
|
|
896
|
+
and os.path.exists(self.initial_env_path)
|
|
897
|
+
):
|
|
898
|
+
if self.os_type == 'Windows':
|
|
899
|
+
base_path = os.path.join(
|
|
900
|
+
self.initial_env_path, "Scripts"
|
|
901
|
+
)
|
|
902
|
+
python_candidate = os.path.join(
|
|
903
|
+
base_path, "python.exe"
|
|
904
|
+
)
|
|
905
|
+
pip_candidate = os.path.join(base_path, "pip.exe")
|
|
906
|
+
else:
|
|
907
|
+
base_path = os.path.join(self.initial_env_path, "bin")
|
|
908
|
+
python_candidate = os.path.join(base_path, "python")
|
|
909
|
+
pip_candidate = os.path.join(base_path, "pip")
|
|
910
|
+
|
|
911
|
+
# Verify the executables exist
|
|
912
|
+
if os.path.exists(python_candidate):
|
|
913
|
+
python_path = python_candidate
|
|
914
|
+
# For pip, use python -m pip if pip executable doesn't
|
|
915
|
+
# exist
|
|
916
|
+
if os.path.exists(pip_candidate):
|
|
917
|
+
pip_path = pip_candidate
|
|
918
|
+
else:
|
|
919
|
+
pip_path = f'"{python_path}" -m pip'
|
|
920
|
+
|
|
921
|
+
# Fall back to system Python
|
|
922
|
+
if python_path is None:
|
|
736
923
|
python_path = self.python_executable
|
|
737
924
|
pip_path = f'"{python_path}" -m pip'
|
|
738
925
|
|
|
739
|
-
|
|
926
|
+
# Ensure we have valid paths before replacement
|
|
927
|
+
if python_path and command.startswith('python'):
|
|
740
928
|
command = command.replace('python', f'"{python_path}"', 1)
|
|
741
|
-
elif command.startswith('pip'):
|
|
929
|
+
elif pip_path and command.startswith('pip'):
|
|
742
930
|
command = command.replace('pip', pip_path, 1)
|
|
743
931
|
|
|
744
932
|
if not interactive:
|
|
@@ -1298,13 +1486,25 @@ class TerminalToolkit(BaseToolkit):
|
|
|
1298
1486
|
f"'{session_id}': {e}"
|
|
1299
1487
|
)
|
|
1300
1488
|
|
|
1301
|
-
#
|
|
1489
|
+
# Clean up file output if it exists
|
|
1302
1490
|
if hasattr(self, 'log_file') and self.is_macos:
|
|
1303
1491
|
try:
|
|
1304
1492
|
logger.info(f"Final terminal log saved to: {self.log_file}")
|
|
1305
1493
|
except Exception as e:
|
|
1306
1494
|
logger.error(f"Error logging file information: {e}")
|
|
1307
1495
|
|
|
1496
|
+
# Clean up initial environment if it exists
|
|
1497
|
+
if hasattr(self, 'initial_env_path') and self.initial_env_path:
|
|
1498
|
+
try:
|
|
1499
|
+
if os.path.exists(self.initial_env_path):
|
|
1500
|
+
shutil.rmtree(self.initial_env_path)
|
|
1501
|
+
logger.info(
|
|
1502
|
+
f"Cleaned up initial environment: "
|
|
1503
|
+
f"{self.initial_env_path}"
|
|
1504
|
+
)
|
|
1505
|
+
except Exception as e:
|
|
1506
|
+
logger.error(f"Error cleaning up initial environment: {e}")
|
|
1507
|
+
|
|
1308
1508
|
# Clean up GUI resources if they exist
|
|
1309
1509
|
if hasattr(self, 'root') and self.root:
|
|
1310
1510
|
try:
|
|
@@ -1325,8 +1525,6 @@ class TerminalToolkit(BaseToolkit):
|
|
|
1325
1525
|
functions in the toolkit.
|
|
1326
1526
|
"""
|
|
1327
1527
|
return [
|
|
1328
|
-
FunctionTool(self.file_find_in_content),
|
|
1329
|
-
FunctionTool(self.file_find_by_name),
|
|
1330
1528
|
FunctionTool(self.shell_exec),
|
|
1331
1529
|
FunctionTool(self.shell_view),
|
|
1332
1530
|
FunctionTool(self.shell_wait),
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|