camel-ai 0.2.71a3__tar.gz → 0.2.71a4__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.71a3 → camel_ai-0.2.71a4}/PKG-INFO +43 -4
- {camel_ai-0.2.71a3 → camel_ai-0.2.71a4}/README.md +39 -0
- {camel_ai-0.2.71a3 → camel_ai-0.2.71a4}/camel/__init__.py +1 -1
- {camel_ai-0.2.71a3 → camel_ai-0.2.71a4}/camel/interpreters/docker_interpreter.py +3 -2
- camel_ai-0.2.71a4/camel/loaders/base_loader.py +85 -0
- {camel_ai-0.2.71a3 → camel_ai-0.2.71a4}/camel/societies/workforce/workforce.py +144 -33
- {camel_ai-0.2.71a3 → camel_ai-0.2.71a4}/camel/toolkits/__init__.py +5 -2
- {camel_ai-0.2.71a3 → camel_ai-0.2.71a4}/camel/toolkits/craw4ai_toolkit.py +2 -2
- {camel_ai-0.2.71a3 → camel_ai-0.2.71a4}/camel/toolkits/file_write_toolkit.py +6 -6
- {camel_ai-0.2.71a3 → camel_ai-0.2.71a4}/camel/toolkits/hybrid_browser_toolkit/hybrid_browser_toolkit.py +9 -3
- {camel_ai-0.2.71a3 → camel_ai-0.2.71a4}/camel/toolkits/hybrid_browser_toolkit/unified_analyzer.js +31 -8
- camel_ai-0.2.71a4/camel/toolkits/note_taking_toolkit.py +90 -0
- camel_ai-0.2.71a4/camel/toolkits/openai_image_toolkit.py +292 -0
- {camel_ai-0.2.71a3 → camel_ai-0.2.71a4}/camel/toolkits/slack_toolkit.py +4 -4
- {camel_ai-0.2.71a3 → camel_ai-0.2.71a4}/camel/toolkits/terminal_toolkit.py +223 -73
- {camel_ai-0.2.71a3 → camel_ai-0.2.71a4}/camel/utils/mcp_client.py +37 -1
- {camel_ai-0.2.71a3 → camel_ai-0.2.71a4}/pyproject.toml +5 -5
- camel_ai-0.2.71a3/camel/toolkits/dalle_toolkit.py +0 -175
- {camel_ai-0.2.71a3 → camel_ai-0.2.71a4}/.gitignore +0 -0
- {camel_ai-0.2.71a3 → camel_ai-0.2.71a4}/LICENSE +0 -0
- {camel_ai-0.2.71a3 → camel_ai-0.2.71a4}/camel/agents/__init__.py +0 -0
- {camel_ai-0.2.71a3 → camel_ai-0.2.71a4}/camel/agents/_types.py +0 -0
- {camel_ai-0.2.71a3 → camel_ai-0.2.71a4}/camel/agents/_utils.py +0 -0
- {camel_ai-0.2.71a3 → camel_ai-0.2.71a4}/camel/agents/base.py +0 -0
- {camel_ai-0.2.71a3 → camel_ai-0.2.71a4}/camel/agents/chat_agent.py +0 -0
- {camel_ai-0.2.71a3 → camel_ai-0.2.71a4}/camel/agents/critic_agent.py +0 -0
- {camel_ai-0.2.71a3 → camel_ai-0.2.71a4}/camel/agents/deductive_reasoner_agent.py +0 -0
- {camel_ai-0.2.71a3 → camel_ai-0.2.71a4}/camel/agents/embodied_agent.py +0 -0
- {camel_ai-0.2.71a3 → camel_ai-0.2.71a4}/camel/agents/knowledge_graph_agent.py +0 -0
- {camel_ai-0.2.71a3 → camel_ai-0.2.71a4}/camel/agents/mcp_agent.py +0 -0
- {camel_ai-0.2.71a3 → camel_ai-0.2.71a4}/camel/agents/multi_hop_generator_agent.py +0 -0
- {camel_ai-0.2.71a3 → camel_ai-0.2.71a4}/camel/agents/programmed_agent_instruction.py +0 -0
- {camel_ai-0.2.71a3 → camel_ai-0.2.71a4}/camel/agents/repo_agent.py +0 -0
- {camel_ai-0.2.71a3 → camel_ai-0.2.71a4}/camel/agents/role_assignment_agent.py +0 -0
- {camel_ai-0.2.71a3 → camel_ai-0.2.71a4}/camel/agents/search_agent.py +0 -0
- {camel_ai-0.2.71a3 → camel_ai-0.2.71a4}/camel/agents/task_agent.py +0 -0
- {camel_ai-0.2.71a3 → camel_ai-0.2.71a4}/camel/agents/tool_agents/__init__.py +0 -0
- {camel_ai-0.2.71a3 → camel_ai-0.2.71a4}/camel/agents/tool_agents/base.py +0 -0
- {camel_ai-0.2.71a3 → camel_ai-0.2.71a4}/camel/agents/tool_agents/hugging_face_tool_agent.py +0 -0
- {camel_ai-0.2.71a3 → camel_ai-0.2.71a4}/camel/benchmarks/__init__.py +0 -0
- {camel_ai-0.2.71a3 → camel_ai-0.2.71a4}/camel/benchmarks/apibank.py +0 -0
- {camel_ai-0.2.71a3 → camel_ai-0.2.71a4}/camel/benchmarks/apibench.py +0 -0
- {camel_ai-0.2.71a3 → camel_ai-0.2.71a4}/camel/benchmarks/base.py +0 -0
- {camel_ai-0.2.71a3 → camel_ai-0.2.71a4}/camel/benchmarks/browsecomp.py +0 -0
- {camel_ai-0.2.71a3 → camel_ai-0.2.71a4}/camel/benchmarks/gaia.py +0 -0
- {camel_ai-0.2.71a3 → camel_ai-0.2.71a4}/camel/benchmarks/mock_website/README.md +0 -0
- {camel_ai-0.2.71a3 → camel_ai-0.2.71a4}/camel/benchmarks/mock_website/mock_web.py +0 -0
- {camel_ai-0.2.71a3 → camel_ai-0.2.71a4}/camel/benchmarks/mock_website/requirements.txt +0 -0
- {camel_ai-0.2.71a3 → camel_ai-0.2.71a4}/camel/benchmarks/mock_website/shopping_mall/app.py +0 -0
- {camel_ai-0.2.71a3 → camel_ai-0.2.71a4}/camel/benchmarks/mock_website/task.json +0 -0
- {camel_ai-0.2.71a3 → camel_ai-0.2.71a4}/camel/benchmarks/nexus.py +0 -0
- {camel_ai-0.2.71a3 → camel_ai-0.2.71a4}/camel/benchmarks/ragbench.py +0 -0
- {camel_ai-0.2.71a3 → camel_ai-0.2.71a4}/camel/bots/__init__.py +0 -0
- {camel_ai-0.2.71a3 → camel_ai-0.2.71a4}/camel/bots/discord/__init__.py +0 -0
- {camel_ai-0.2.71a3 → camel_ai-0.2.71a4}/camel/bots/discord/discord_app.py +0 -0
- {camel_ai-0.2.71a3 → camel_ai-0.2.71a4}/camel/bots/discord/discord_installation.py +0 -0
- {camel_ai-0.2.71a3 → camel_ai-0.2.71a4}/camel/bots/discord/discord_store.py +0 -0
- {camel_ai-0.2.71a3 → camel_ai-0.2.71a4}/camel/bots/slack/__init__.py +0 -0
- {camel_ai-0.2.71a3 → camel_ai-0.2.71a4}/camel/bots/slack/models.py +0 -0
- {camel_ai-0.2.71a3 → camel_ai-0.2.71a4}/camel/bots/slack/slack_app.py +0 -0
- {camel_ai-0.2.71a3 → camel_ai-0.2.71a4}/camel/bots/telegram_bot.py +0 -0
- {camel_ai-0.2.71a3 → camel_ai-0.2.71a4}/camel/configs/__init__.py +0 -0
- {camel_ai-0.2.71a3 → camel_ai-0.2.71a4}/camel/configs/aiml_config.py +0 -0
- {camel_ai-0.2.71a3 → camel_ai-0.2.71a4}/camel/configs/anthropic_config.py +0 -0
- {camel_ai-0.2.71a3 → camel_ai-0.2.71a4}/camel/configs/base_config.py +0 -0
- {camel_ai-0.2.71a3 → camel_ai-0.2.71a4}/camel/configs/bedrock_config.py +0 -0
- {camel_ai-0.2.71a3 → camel_ai-0.2.71a4}/camel/configs/cohere_config.py +0 -0
- {camel_ai-0.2.71a3 → camel_ai-0.2.71a4}/camel/configs/crynux_config.py +0 -0
- {camel_ai-0.2.71a3 → camel_ai-0.2.71a4}/camel/configs/deepseek_config.py +0 -0
- {camel_ai-0.2.71a3 → camel_ai-0.2.71a4}/camel/configs/gemini_config.py +0 -0
- {camel_ai-0.2.71a3 → camel_ai-0.2.71a4}/camel/configs/groq_config.py +0 -0
- {camel_ai-0.2.71a3 → camel_ai-0.2.71a4}/camel/configs/internlm_config.py +0 -0
- {camel_ai-0.2.71a3 → camel_ai-0.2.71a4}/camel/configs/litellm_config.py +0 -0
- {camel_ai-0.2.71a3 → camel_ai-0.2.71a4}/camel/configs/lmstudio_config.py +0 -0
- {camel_ai-0.2.71a3 → camel_ai-0.2.71a4}/camel/configs/mistral_config.py +0 -0
- {camel_ai-0.2.71a3 → camel_ai-0.2.71a4}/camel/configs/modelscope_config.py +0 -0
- {camel_ai-0.2.71a3 → camel_ai-0.2.71a4}/camel/configs/moonshot_config.py +0 -0
- {camel_ai-0.2.71a3 → camel_ai-0.2.71a4}/camel/configs/netmind_config.py +0 -0
- {camel_ai-0.2.71a3 → camel_ai-0.2.71a4}/camel/configs/novita_config.py +0 -0
- {camel_ai-0.2.71a3 → camel_ai-0.2.71a4}/camel/configs/nvidia_config.py +0 -0
- {camel_ai-0.2.71a3 → camel_ai-0.2.71a4}/camel/configs/ollama_config.py +0 -0
- {camel_ai-0.2.71a3 → camel_ai-0.2.71a4}/camel/configs/openai_config.py +0 -0
- {camel_ai-0.2.71a3 → camel_ai-0.2.71a4}/camel/configs/openrouter_config.py +0 -0
- {camel_ai-0.2.71a3 → camel_ai-0.2.71a4}/camel/configs/ppio_config.py +0 -0
- {camel_ai-0.2.71a3 → camel_ai-0.2.71a4}/camel/configs/qianfan_config.py +0 -0
- {camel_ai-0.2.71a3 → camel_ai-0.2.71a4}/camel/configs/qwen_config.py +0 -0
- {camel_ai-0.2.71a3 → camel_ai-0.2.71a4}/camel/configs/reka_config.py +0 -0
- {camel_ai-0.2.71a3 → camel_ai-0.2.71a4}/camel/configs/samba_config.py +0 -0
- {camel_ai-0.2.71a3 → camel_ai-0.2.71a4}/camel/configs/sglang_config.py +0 -0
- {camel_ai-0.2.71a3 → camel_ai-0.2.71a4}/camel/configs/siliconflow_config.py +0 -0
- {camel_ai-0.2.71a3 → camel_ai-0.2.71a4}/camel/configs/togetherai_config.py +0 -0
- {camel_ai-0.2.71a3 → camel_ai-0.2.71a4}/camel/configs/vllm_config.py +0 -0
- {camel_ai-0.2.71a3 → camel_ai-0.2.71a4}/camel/configs/watsonx_config.py +0 -0
- {camel_ai-0.2.71a3 → camel_ai-0.2.71a4}/camel/configs/yi_config.py +0 -0
- {camel_ai-0.2.71a3 → camel_ai-0.2.71a4}/camel/configs/zhipuai_config.py +0 -0
- {camel_ai-0.2.71a3 → camel_ai-0.2.71a4}/camel/data_collectors/__init__.py +0 -0
- {camel_ai-0.2.71a3 → camel_ai-0.2.71a4}/camel/data_collectors/alpaca_collector.py +0 -0
- {camel_ai-0.2.71a3 → camel_ai-0.2.71a4}/camel/data_collectors/base.py +0 -0
- {camel_ai-0.2.71a3 → camel_ai-0.2.71a4}/camel/data_collectors/sharegpt_collector.py +0 -0
- {camel_ai-0.2.71a3 → camel_ai-0.2.71a4}/camel/datagen/__init__.py +0 -0
- {camel_ai-0.2.71a3 → camel_ai-0.2.71a4}/camel/datagen/cot_datagen.py +0 -0
- {camel_ai-0.2.71a3 → camel_ai-0.2.71a4}/camel/datagen/evol_instruct/__init__.py +0 -0
- {camel_ai-0.2.71a3 → camel_ai-0.2.71a4}/camel/datagen/evol_instruct/evol_instruct.py +0 -0
- {camel_ai-0.2.71a3 → camel_ai-0.2.71a4}/camel/datagen/evol_instruct/scorer.py +0 -0
- {camel_ai-0.2.71a3 → camel_ai-0.2.71a4}/camel/datagen/evol_instruct/templates.py +0 -0
- {camel_ai-0.2.71a3 → camel_ai-0.2.71a4}/camel/datagen/self_improving_cot.py +0 -0
- {camel_ai-0.2.71a3 → camel_ai-0.2.71a4}/camel/datagen/self_instruct/__init__.py +0 -0
- {camel_ai-0.2.71a3 → camel_ai-0.2.71a4}/camel/datagen/self_instruct/filter/__init__.py +0 -0
- {camel_ai-0.2.71a3 → camel_ai-0.2.71a4}/camel/datagen/self_instruct/filter/filter_function.py +0 -0
- {camel_ai-0.2.71a3 → camel_ai-0.2.71a4}/camel/datagen/self_instruct/filter/filter_registry.py +0 -0
- {camel_ai-0.2.71a3 → camel_ai-0.2.71a4}/camel/datagen/self_instruct/filter/instruction_filter.py +0 -0
- {camel_ai-0.2.71a3 → camel_ai-0.2.71a4}/camel/datagen/self_instruct/self_instruct.py +0 -0
- {camel_ai-0.2.71a3 → camel_ai-0.2.71a4}/camel/datagen/self_instruct/templates.py +0 -0
- {camel_ai-0.2.71a3 → camel_ai-0.2.71a4}/camel/datagen/source2synth/__init__.py +0 -0
- {camel_ai-0.2.71a3 → camel_ai-0.2.71a4}/camel/datagen/source2synth/data_processor.py +0 -0
- {camel_ai-0.2.71a3 → camel_ai-0.2.71a4}/camel/datagen/source2synth/models.py +0 -0
- {camel_ai-0.2.71a3 → camel_ai-0.2.71a4}/camel/datagen/source2synth/user_data_processor_config.py +0 -0
- {camel_ai-0.2.71a3 → camel_ai-0.2.71a4}/camel/datahubs/__init__.py +0 -0
- {camel_ai-0.2.71a3 → camel_ai-0.2.71a4}/camel/datahubs/base.py +0 -0
- {camel_ai-0.2.71a3 → camel_ai-0.2.71a4}/camel/datahubs/huggingface.py +0 -0
- {camel_ai-0.2.71a3 → camel_ai-0.2.71a4}/camel/datahubs/models.py +0 -0
- {camel_ai-0.2.71a3 → camel_ai-0.2.71a4}/camel/datasets/__init__.py +0 -0
- {camel_ai-0.2.71a3 → camel_ai-0.2.71a4}/camel/datasets/base_generator.py +0 -0
- {camel_ai-0.2.71a3 → camel_ai-0.2.71a4}/camel/datasets/few_shot_generator.py +0 -0
- {camel_ai-0.2.71a3 → camel_ai-0.2.71a4}/camel/datasets/models.py +0 -0
- {camel_ai-0.2.71a3 → camel_ai-0.2.71a4}/camel/datasets/self_instruct_generator.py +0 -0
- {camel_ai-0.2.71a3 → camel_ai-0.2.71a4}/camel/datasets/static_dataset.py +0 -0
- {camel_ai-0.2.71a3 → camel_ai-0.2.71a4}/camel/embeddings/__init__.py +0 -0
- {camel_ai-0.2.71a3 → camel_ai-0.2.71a4}/camel/embeddings/azure_embedding.py +0 -0
- {camel_ai-0.2.71a3 → camel_ai-0.2.71a4}/camel/embeddings/base.py +0 -0
- {camel_ai-0.2.71a3 → camel_ai-0.2.71a4}/camel/embeddings/gemini_embedding.py +0 -0
- {camel_ai-0.2.71a3 → camel_ai-0.2.71a4}/camel/embeddings/jina_embedding.py +0 -0
- {camel_ai-0.2.71a3 → camel_ai-0.2.71a4}/camel/embeddings/mistral_embedding.py +0 -0
- {camel_ai-0.2.71a3 → camel_ai-0.2.71a4}/camel/embeddings/openai_compatible_embedding.py +0 -0
- {camel_ai-0.2.71a3 → camel_ai-0.2.71a4}/camel/embeddings/openai_embedding.py +0 -0
- {camel_ai-0.2.71a3 → camel_ai-0.2.71a4}/camel/embeddings/sentence_transformers_embeddings.py +0 -0
- {camel_ai-0.2.71a3 → camel_ai-0.2.71a4}/camel/embeddings/together_embedding.py +0 -0
- {camel_ai-0.2.71a3 → camel_ai-0.2.71a4}/camel/embeddings/vlm_embedding.py +0 -0
- {camel_ai-0.2.71a3 → camel_ai-0.2.71a4}/camel/environments/__init__.py +0 -0
- {camel_ai-0.2.71a3 → camel_ai-0.2.71a4}/camel/environments/models.py +0 -0
- {camel_ai-0.2.71a3 → camel_ai-0.2.71a4}/camel/environments/multi_step.py +0 -0
- {camel_ai-0.2.71a3 → camel_ai-0.2.71a4}/camel/environments/rlcards_env.py +0 -0
- {camel_ai-0.2.71a3 → camel_ai-0.2.71a4}/camel/environments/single_step.py +0 -0
- {camel_ai-0.2.71a3 → camel_ai-0.2.71a4}/camel/environments/tic_tac_toe.py +0 -0
- {camel_ai-0.2.71a3 → camel_ai-0.2.71a4}/camel/extractors/__init__.py +0 -0
- {camel_ai-0.2.71a3 → camel_ai-0.2.71a4}/camel/extractors/base.py +0 -0
- {camel_ai-0.2.71a3 → camel_ai-0.2.71a4}/camel/extractors/python_strategies.py +0 -0
- {camel_ai-0.2.71a3 → camel_ai-0.2.71a4}/camel/generators.py +0 -0
- {camel_ai-0.2.71a3 → camel_ai-0.2.71a4}/camel/human.py +0 -0
- {camel_ai-0.2.71a3 → camel_ai-0.2.71a4}/camel/interpreters/__init__.py +0 -0
- {camel_ai-0.2.71a3 → camel_ai-0.2.71a4}/camel/interpreters/base.py +0 -0
- {camel_ai-0.2.71a3 → camel_ai-0.2.71a4}/camel/interpreters/docker/Dockerfile +0 -0
- {camel_ai-0.2.71a3 → camel_ai-0.2.71a4}/camel/interpreters/e2b_interpreter.py +0 -0
- {camel_ai-0.2.71a3 → camel_ai-0.2.71a4}/camel/interpreters/internal_python_interpreter.py +0 -0
- {camel_ai-0.2.71a3 → camel_ai-0.2.71a4}/camel/interpreters/interpreter_error.py +0 -0
- {camel_ai-0.2.71a3 → camel_ai-0.2.71a4}/camel/interpreters/ipython_interpreter.py +0 -0
- {camel_ai-0.2.71a3 → camel_ai-0.2.71a4}/camel/interpreters/subprocess_interpreter.py +0 -0
- {camel_ai-0.2.71a3 → camel_ai-0.2.71a4}/camel/loaders/__init__.py +0 -0
- {camel_ai-0.2.71a3 → camel_ai-0.2.71a4}/camel/loaders/apify_reader.py +0 -0
- {camel_ai-0.2.71a3 → camel_ai-0.2.71a4}/camel/loaders/base_io.py +0 -0
- {camel_ai-0.2.71a3 → camel_ai-0.2.71a4}/camel/loaders/chunkr_reader.py +0 -0
- {camel_ai-0.2.71a3 → camel_ai-0.2.71a4}/camel/loaders/crawl4ai_reader.py +0 -0
- {camel_ai-0.2.71a3 → camel_ai-0.2.71a4}/camel/loaders/firecrawl_reader.py +0 -0
- {camel_ai-0.2.71a3 → camel_ai-0.2.71a4}/camel/loaders/jina_url_reader.py +0 -0
- {camel_ai-0.2.71a3 → camel_ai-0.2.71a4}/camel/loaders/markitdown.py +0 -0
- {camel_ai-0.2.71a3 → camel_ai-0.2.71a4}/camel/loaders/mineru_extractor.py +0 -0
- {camel_ai-0.2.71a3 → camel_ai-0.2.71a4}/camel/loaders/mistral_reader.py +0 -0
- {camel_ai-0.2.71a3 → camel_ai-0.2.71a4}/camel/loaders/pandas_reader.py +0 -0
- {camel_ai-0.2.71a3 → camel_ai-0.2.71a4}/camel/loaders/scrapegraph_reader.py +0 -0
- {camel_ai-0.2.71a3 → camel_ai-0.2.71a4}/camel/loaders/unstructured_io.py +0 -0
- {camel_ai-0.2.71a3 → camel_ai-0.2.71a4}/camel/logger.py +0 -0
- {camel_ai-0.2.71a3 → camel_ai-0.2.71a4}/camel/memories/__init__.py +0 -0
- {camel_ai-0.2.71a3 → camel_ai-0.2.71a4}/camel/memories/agent_memories.py +0 -0
- {camel_ai-0.2.71a3 → camel_ai-0.2.71a4}/camel/memories/base.py +0 -0
- {camel_ai-0.2.71a3 → camel_ai-0.2.71a4}/camel/memories/blocks/__init__.py +0 -0
- {camel_ai-0.2.71a3 → camel_ai-0.2.71a4}/camel/memories/blocks/chat_history_block.py +0 -0
- {camel_ai-0.2.71a3 → camel_ai-0.2.71a4}/camel/memories/blocks/vectordb_block.py +0 -0
- {camel_ai-0.2.71a3 → camel_ai-0.2.71a4}/camel/memories/context_creators/__init__.py +0 -0
- {camel_ai-0.2.71a3 → camel_ai-0.2.71a4}/camel/memories/context_creators/score_based.py +0 -0
- {camel_ai-0.2.71a3 → camel_ai-0.2.71a4}/camel/memories/records.py +0 -0
- {camel_ai-0.2.71a3 → camel_ai-0.2.71a4}/camel/messages/__init__.py +0 -0
- {camel_ai-0.2.71a3 → camel_ai-0.2.71a4}/camel/messages/base.py +0 -0
- {camel_ai-0.2.71a3 → camel_ai-0.2.71a4}/camel/messages/conversion/__init__.py +0 -0
- {camel_ai-0.2.71a3 → camel_ai-0.2.71a4}/camel/messages/conversion/alpaca.py +0 -0
- {camel_ai-0.2.71a3 → camel_ai-0.2.71a4}/camel/messages/conversion/conversation_models.py +0 -0
- {camel_ai-0.2.71a3 → camel_ai-0.2.71a4}/camel/messages/conversion/sharegpt/__init__.py +0 -0
- {camel_ai-0.2.71a3 → camel_ai-0.2.71a4}/camel/messages/conversion/sharegpt/function_call_formatter.py +0 -0
- {camel_ai-0.2.71a3 → camel_ai-0.2.71a4}/camel/messages/conversion/sharegpt/hermes/__init__.py +0 -0
- {camel_ai-0.2.71a3 → camel_ai-0.2.71a4}/camel/messages/conversion/sharegpt/hermes/hermes_function_formatter.py +0 -0
- {camel_ai-0.2.71a3 → camel_ai-0.2.71a4}/camel/messages/func_message.py +0 -0
- {camel_ai-0.2.71a3 → camel_ai-0.2.71a4}/camel/models/__init__.py +0 -0
- {camel_ai-0.2.71a3 → camel_ai-0.2.71a4}/camel/models/_utils.py +0 -0
- {camel_ai-0.2.71a3 → camel_ai-0.2.71a4}/camel/models/aiml_model.py +0 -0
- {camel_ai-0.2.71a3 → camel_ai-0.2.71a4}/camel/models/anthropic_model.py +0 -0
- {camel_ai-0.2.71a3 → camel_ai-0.2.71a4}/camel/models/aws_bedrock_model.py +0 -0
- {camel_ai-0.2.71a3 → camel_ai-0.2.71a4}/camel/models/azure_openai_model.py +0 -0
- {camel_ai-0.2.71a3 → camel_ai-0.2.71a4}/camel/models/base_audio_model.py +0 -0
- {camel_ai-0.2.71a3 → camel_ai-0.2.71a4}/camel/models/base_model.py +0 -0
- {camel_ai-0.2.71a3 → camel_ai-0.2.71a4}/camel/models/cohere_model.py +0 -0
- {camel_ai-0.2.71a3 → camel_ai-0.2.71a4}/camel/models/crynux_model.py +0 -0
- {camel_ai-0.2.71a3 → camel_ai-0.2.71a4}/camel/models/deepseek_model.py +0 -0
- {camel_ai-0.2.71a3 → camel_ai-0.2.71a4}/camel/models/fish_audio_model.py +0 -0
- {camel_ai-0.2.71a3 → camel_ai-0.2.71a4}/camel/models/gemini_model.py +0 -0
- {camel_ai-0.2.71a3 → camel_ai-0.2.71a4}/camel/models/groq_model.py +0 -0
- {camel_ai-0.2.71a3 → camel_ai-0.2.71a4}/camel/models/internlm_model.py +0 -0
- {camel_ai-0.2.71a3 → camel_ai-0.2.71a4}/camel/models/litellm_model.py +0 -0
- {camel_ai-0.2.71a3 → camel_ai-0.2.71a4}/camel/models/lmstudio_model.py +0 -0
- {camel_ai-0.2.71a3 → camel_ai-0.2.71a4}/camel/models/mistral_model.py +0 -0
- {camel_ai-0.2.71a3 → camel_ai-0.2.71a4}/camel/models/model_factory.py +0 -0
- {camel_ai-0.2.71a3 → camel_ai-0.2.71a4}/camel/models/model_manager.py +0 -0
- {camel_ai-0.2.71a3 → camel_ai-0.2.71a4}/camel/models/modelscope_model.py +0 -0
- {camel_ai-0.2.71a3 → camel_ai-0.2.71a4}/camel/models/moonshot_model.py +0 -0
- {camel_ai-0.2.71a3 → camel_ai-0.2.71a4}/camel/models/nemotron_model.py +0 -0
- {camel_ai-0.2.71a3 → camel_ai-0.2.71a4}/camel/models/netmind_model.py +0 -0
- {camel_ai-0.2.71a3 → camel_ai-0.2.71a4}/camel/models/novita_model.py +0 -0
- {camel_ai-0.2.71a3 → camel_ai-0.2.71a4}/camel/models/nvidia_model.py +0 -0
- {camel_ai-0.2.71a3 → camel_ai-0.2.71a4}/camel/models/ollama_model.py +0 -0
- {camel_ai-0.2.71a3 → camel_ai-0.2.71a4}/camel/models/openai_audio_models.py +0 -0
- {camel_ai-0.2.71a3 → camel_ai-0.2.71a4}/camel/models/openai_compatible_model.py +0 -0
- {camel_ai-0.2.71a3 → camel_ai-0.2.71a4}/camel/models/openai_model.py +0 -0
- {camel_ai-0.2.71a3 → camel_ai-0.2.71a4}/camel/models/openrouter_model.py +0 -0
- {camel_ai-0.2.71a3 → camel_ai-0.2.71a4}/camel/models/ppio_model.py +0 -0
- {camel_ai-0.2.71a3 → camel_ai-0.2.71a4}/camel/models/qianfan_model.py +0 -0
- {camel_ai-0.2.71a3 → camel_ai-0.2.71a4}/camel/models/qwen_model.py +0 -0
- {camel_ai-0.2.71a3 → camel_ai-0.2.71a4}/camel/models/reka_model.py +0 -0
- {camel_ai-0.2.71a3 → camel_ai-0.2.71a4}/camel/models/reward/__init__.py +0 -0
- {camel_ai-0.2.71a3 → camel_ai-0.2.71a4}/camel/models/reward/base_reward_model.py +0 -0
- {camel_ai-0.2.71a3 → camel_ai-0.2.71a4}/camel/models/reward/evaluator.py +0 -0
- {camel_ai-0.2.71a3 → camel_ai-0.2.71a4}/camel/models/reward/nemotron_model.py +0 -0
- {camel_ai-0.2.71a3 → camel_ai-0.2.71a4}/camel/models/reward/skywork_model.py +0 -0
- {camel_ai-0.2.71a3 → camel_ai-0.2.71a4}/camel/models/samba_model.py +0 -0
- {camel_ai-0.2.71a3 → camel_ai-0.2.71a4}/camel/models/sglang_model.py +0 -0
- {camel_ai-0.2.71a3 → camel_ai-0.2.71a4}/camel/models/siliconflow_model.py +0 -0
- {camel_ai-0.2.71a3 → camel_ai-0.2.71a4}/camel/models/stub_model.py +0 -0
- {camel_ai-0.2.71a3 → camel_ai-0.2.71a4}/camel/models/togetherai_model.py +0 -0
- {camel_ai-0.2.71a3 → camel_ai-0.2.71a4}/camel/models/vllm_model.py +0 -0
- {camel_ai-0.2.71a3 → camel_ai-0.2.71a4}/camel/models/volcano_model.py +0 -0
- {camel_ai-0.2.71a3 → camel_ai-0.2.71a4}/camel/models/watsonx_model.py +0 -0
- {camel_ai-0.2.71a3 → camel_ai-0.2.71a4}/camel/models/yi_model.py +0 -0
- {camel_ai-0.2.71a3 → camel_ai-0.2.71a4}/camel/models/zhipuai_model.py +0 -0
- {camel_ai-0.2.71a3 → camel_ai-0.2.71a4}/camel/personas/__init__.py +0 -0
- {camel_ai-0.2.71a3 → camel_ai-0.2.71a4}/camel/personas/persona.py +0 -0
- {camel_ai-0.2.71a3 → camel_ai-0.2.71a4}/camel/personas/persona_hub.py +0 -0
- {camel_ai-0.2.71a3 → camel_ai-0.2.71a4}/camel/prompts/__init__.py +0 -0
- {camel_ai-0.2.71a3 → camel_ai-0.2.71a4}/camel/prompts/ai_society.py +0 -0
- {camel_ai-0.2.71a3 → camel_ai-0.2.71a4}/camel/prompts/base.py +0 -0
- {camel_ai-0.2.71a3 → camel_ai-0.2.71a4}/camel/prompts/code.py +0 -0
- {camel_ai-0.2.71a3 → camel_ai-0.2.71a4}/camel/prompts/evaluation.py +0 -0
- {camel_ai-0.2.71a3 → camel_ai-0.2.71a4}/camel/prompts/generate_text_embedding_data.py +0 -0
- {camel_ai-0.2.71a3 → camel_ai-0.2.71a4}/camel/prompts/image_craft.py +0 -0
- {camel_ai-0.2.71a3 → camel_ai-0.2.71a4}/camel/prompts/misalignment.py +0 -0
- {camel_ai-0.2.71a3 → camel_ai-0.2.71a4}/camel/prompts/multi_condition_image_craft.py +0 -0
- {camel_ai-0.2.71a3 → camel_ai-0.2.71a4}/camel/prompts/object_recognition.py +0 -0
- {camel_ai-0.2.71a3 → camel_ai-0.2.71a4}/camel/prompts/persona_hub.py +0 -0
- {camel_ai-0.2.71a3 → camel_ai-0.2.71a4}/camel/prompts/prompt_templates.py +0 -0
- {camel_ai-0.2.71a3 → camel_ai-0.2.71a4}/camel/prompts/role_description_prompt_template.py +0 -0
- {camel_ai-0.2.71a3 → camel_ai-0.2.71a4}/camel/prompts/solution_extraction.py +0 -0
- {camel_ai-0.2.71a3 → camel_ai-0.2.71a4}/camel/prompts/task_prompt_template.py +0 -0
- {camel_ai-0.2.71a3 → camel_ai-0.2.71a4}/camel/prompts/translation.py +0 -0
- {camel_ai-0.2.71a3 → camel_ai-0.2.71a4}/camel/prompts/video_description_prompt.py +0 -0
- {camel_ai-0.2.71a3 → camel_ai-0.2.71a4}/camel/py.typed +0 -0
- {camel_ai-0.2.71a3 → camel_ai-0.2.71a4}/camel/responses/__init__.py +0 -0
- {camel_ai-0.2.71a3 → camel_ai-0.2.71a4}/camel/responses/agent_responses.py +0 -0
- {camel_ai-0.2.71a3 → camel_ai-0.2.71a4}/camel/retrievers/__init__.py +0 -0
- {camel_ai-0.2.71a3 → camel_ai-0.2.71a4}/camel/retrievers/auto_retriever.py +0 -0
- {camel_ai-0.2.71a3 → camel_ai-0.2.71a4}/camel/retrievers/base.py +0 -0
- {camel_ai-0.2.71a3 → camel_ai-0.2.71a4}/camel/retrievers/bm25_retriever.py +0 -0
- {camel_ai-0.2.71a3 → camel_ai-0.2.71a4}/camel/retrievers/cohere_rerank_retriever.py +0 -0
- {camel_ai-0.2.71a3 → camel_ai-0.2.71a4}/camel/retrievers/hybrid_retrival.py +0 -0
- {camel_ai-0.2.71a3 → camel_ai-0.2.71a4}/camel/retrievers/vector_retriever.py +0 -0
- {camel_ai-0.2.71a3 → camel_ai-0.2.71a4}/camel/runtimes/__init__.py +0 -0
- {camel_ai-0.2.71a3 → camel_ai-0.2.71a4}/camel/runtimes/api.py +0 -0
- {camel_ai-0.2.71a3 → camel_ai-0.2.71a4}/camel/runtimes/base.py +0 -0
- {camel_ai-0.2.71a3 → camel_ai-0.2.71a4}/camel/runtimes/configs.py +0 -0
- {camel_ai-0.2.71a3 → camel_ai-0.2.71a4}/camel/runtimes/daytona_runtime.py +0 -0
- {camel_ai-0.2.71a3 → camel_ai-0.2.71a4}/camel/runtimes/docker_runtime.py +0 -0
- {camel_ai-0.2.71a3 → camel_ai-0.2.71a4}/camel/runtimes/llm_guard_runtime.py +0 -0
- {camel_ai-0.2.71a3 → camel_ai-0.2.71a4}/camel/runtimes/remote_http_runtime.py +0 -0
- {camel_ai-0.2.71a3 → camel_ai-0.2.71a4}/camel/runtimes/ubuntu_docker_runtime.py +0 -0
- {camel_ai-0.2.71a3 → camel_ai-0.2.71a4}/camel/runtimes/utils/__init__.py +0 -0
- {camel_ai-0.2.71a3 → camel_ai-0.2.71a4}/camel/runtimes/utils/function_risk_toolkit.py +0 -0
- {camel_ai-0.2.71a3 → camel_ai-0.2.71a4}/camel/runtimes/utils/ignore_risk_toolkit.py +0 -0
- {camel_ai-0.2.71a3 → camel_ai-0.2.71a4}/camel/schemas/__init__.py +0 -0
- {camel_ai-0.2.71a3 → camel_ai-0.2.71a4}/camel/schemas/base.py +0 -0
- {camel_ai-0.2.71a3 → camel_ai-0.2.71a4}/camel/schemas/openai_converter.py +0 -0
- {camel_ai-0.2.71a3 → camel_ai-0.2.71a4}/camel/schemas/outlines_converter.py +0 -0
- {camel_ai-0.2.71a3 → camel_ai-0.2.71a4}/camel/services/agent_openapi_server.py +0 -0
- {camel_ai-0.2.71a3 → camel_ai-0.2.71a4}/camel/societies/__init__.py +0 -0
- {camel_ai-0.2.71a3 → camel_ai-0.2.71a4}/camel/societies/babyagi_playing.py +0 -0
- {camel_ai-0.2.71a3 → camel_ai-0.2.71a4}/camel/societies/role_playing.py +0 -0
- {camel_ai-0.2.71a3 → camel_ai-0.2.71a4}/camel/societies/workforce/__init__.py +0 -0
- {camel_ai-0.2.71a3 → camel_ai-0.2.71a4}/camel/societies/workforce/base.py +0 -0
- {camel_ai-0.2.71a3 → camel_ai-0.2.71a4}/camel/societies/workforce/prompts.py +0 -0
- {camel_ai-0.2.71a3 → camel_ai-0.2.71a4}/camel/societies/workforce/role_playing_worker.py +0 -0
- {camel_ai-0.2.71a3 → camel_ai-0.2.71a4}/camel/societies/workforce/single_agent_worker.py +0 -0
- {camel_ai-0.2.71a3 → camel_ai-0.2.71a4}/camel/societies/workforce/task_channel.py +0 -0
- {camel_ai-0.2.71a3 → camel_ai-0.2.71a4}/camel/societies/workforce/utils.py +0 -0
- {camel_ai-0.2.71a3 → camel_ai-0.2.71a4}/camel/societies/workforce/worker.py +0 -0
- {camel_ai-0.2.71a3 → camel_ai-0.2.71a4}/camel/societies/workforce/workforce_logger.py +0 -0
- {camel_ai-0.2.71a3 → camel_ai-0.2.71a4}/camel/storages/__init__.py +0 -0
- {camel_ai-0.2.71a3 → camel_ai-0.2.71a4}/camel/storages/graph_storages/__init__.py +0 -0
- {camel_ai-0.2.71a3 → camel_ai-0.2.71a4}/camel/storages/graph_storages/base.py +0 -0
- {camel_ai-0.2.71a3 → camel_ai-0.2.71a4}/camel/storages/graph_storages/graph_element.py +0 -0
- {camel_ai-0.2.71a3 → camel_ai-0.2.71a4}/camel/storages/graph_storages/nebula_graph.py +0 -0
- {camel_ai-0.2.71a3 → camel_ai-0.2.71a4}/camel/storages/graph_storages/neo4j_graph.py +0 -0
- {camel_ai-0.2.71a3 → camel_ai-0.2.71a4}/camel/storages/key_value_storages/__init__.py +0 -0
- {camel_ai-0.2.71a3 → camel_ai-0.2.71a4}/camel/storages/key_value_storages/base.py +0 -0
- {camel_ai-0.2.71a3 → camel_ai-0.2.71a4}/camel/storages/key_value_storages/in_memory.py +0 -0
- {camel_ai-0.2.71a3 → camel_ai-0.2.71a4}/camel/storages/key_value_storages/json.py +0 -0
- {camel_ai-0.2.71a3 → camel_ai-0.2.71a4}/camel/storages/key_value_storages/mem0_cloud.py +0 -0
- {camel_ai-0.2.71a3 → camel_ai-0.2.71a4}/camel/storages/key_value_storages/redis.py +0 -0
- {camel_ai-0.2.71a3 → camel_ai-0.2.71a4}/camel/storages/object_storages/__init__.py +0 -0
- {camel_ai-0.2.71a3 → camel_ai-0.2.71a4}/camel/storages/object_storages/amazon_s3.py +0 -0
- {camel_ai-0.2.71a3 → camel_ai-0.2.71a4}/camel/storages/object_storages/azure_blob.py +0 -0
- {camel_ai-0.2.71a3 → camel_ai-0.2.71a4}/camel/storages/object_storages/base.py +0 -0
- {camel_ai-0.2.71a3 → camel_ai-0.2.71a4}/camel/storages/object_storages/google_cloud.py +0 -0
- {camel_ai-0.2.71a3 → camel_ai-0.2.71a4}/camel/storages/vectordb_storages/__init__.py +0 -0
- {camel_ai-0.2.71a3 → camel_ai-0.2.71a4}/camel/storages/vectordb_storages/base.py +0 -0
- {camel_ai-0.2.71a3 → camel_ai-0.2.71a4}/camel/storages/vectordb_storages/chroma.py +0 -0
- {camel_ai-0.2.71a3 → camel_ai-0.2.71a4}/camel/storages/vectordb_storages/faiss.py +0 -0
- {camel_ai-0.2.71a3 → camel_ai-0.2.71a4}/camel/storages/vectordb_storages/milvus.py +0 -0
- {camel_ai-0.2.71a3 → camel_ai-0.2.71a4}/camel/storages/vectordb_storages/oceanbase.py +0 -0
- {camel_ai-0.2.71a3 → camel_ai-0.2.71a4}/camel/storages/vectordb_storages/pgvector.py +0 -0
- {camel_ai-0.2.71a3 → camel_ai-0.2.71a4}/camel/storages/vectordb_storages/qdrant.py +0 -0
- {camel_ai-0.2.71a3 → camel_ai-0.2.71a4}/camel/storages/vectordb_storages/tidb.py +0 -0
- {camel_ai-0.2.71a3 → camel_ai-0.2.71a4}/camel/storages/vectordb_storages/weaviate.py +0 -0
- {camel_ai-0.2.71a3 → camel_ai-0.2.71a4}/camel/tasks/__init__.py +0 -0
- {camel_ai-0.2.71a3 → camel_ai-0.2.71a4}/camel/tasks/task.py +0 -0
- {camel_ai-0.2.71a3 → camel_ai-0.2.71a4}/camel/tasks/task_prompt.py +0 -0
- {camel_ai-0.2.71a3 → camel_ai-0.2.71a4}/camel/terminators/__init__.py +0 -0
- {camel_ai-0.2.71a3 → camel_ai-0.2.71a4}/camel/terminators/base.py +0 -0
- {camel_ai-0.2.71a3 → camel_ai-0.2.71a4}/camel/terminators/response_terminator.py +0 -0
- {camel_ai-0.2.71a3 → camel_ai-0.2.71a4}/camel/terminators/token_limit_terminator.py +0 -0
- {camel_ai-0.2.71a3 → camel_ai-0.2.71a4}/camel/toolkits/aci_toolkit.py +0 -0
- {camel_ai-0.2.71a3 → camel_ai-0.2.71a4}/camel/toolkits/arxiv_toolkit.py +0 -0
- {camel_ai-0.2.71a3 → camel_ai-0.2.71a4}/camel/toolkits/ask_news_toolkit.py +0 -0
- {camel_ai-0.2.71a3 → camel_ai-0.2.71a4}/camel/toolkits/async_browser_toolkit.py +0 -0
- {camel_ai-0.2.71a3 → camel_ai-0.2.71a4}/camel/toolkits/audio_analysis_toolkit.py +0 -0
- {camel_ai-0.2.71a3 → camel_ai-0.2.71a4}/camel/toolkits/base.py +0 -0
- {camel_ai-0.2.71a3 → camel_ai-0.2.71a4}/camel/toolkits/bohrium_toolkit.py +0 -0
- {camel_ai-0.2.71a3 → camel_ai-0.2.71a4}/camel/toolkits/browser_toolkit.py +0 -0
- {camel_ai-0.2.71a3 → camel_ai-0.2.71a4}/camel/toolkits/browser_toolkit_commons.py +0 -0
- {camel_ai-0.2.71a3 → camel_ai-0.2.71a4}/camel/toolkits/code_execution.py +0 -0
- {camel_ai-0.2.71a3 → camel_ai-0.2.71a4}/camel/toolkits/dappier_toolkit.py +0 -0
- {camel_ai-0.2.71a3 → camel_ai-0.2.71a4}/camel/toolkits/data_commons_toolkit.py +0 -0
- {camel_ai-0.2.71a3 → camel_ai-0.2.71a4}/camel/toolkits/edgeone_pages_mcp_toolkit.py +0 -0
- {camel_ai-0.2.71a3 → camel_ai-0.2.71a4}/camel/toolkits/excel_toolkit.py +0 -0
- {camel_ai-0.2.71a3 → camel_ai-0.2.71a4}/camel/toolkits/function_tool.py +0 -0
- {camel_ai-0.2.71a3 → camel_ai-0.2.71a4}/camel/toolkits/github_toolkit.py +0 -0
- {camel_ai-0.2.71a3 → camel_ai-0.2.71a4}/camel/toolkits/google_calendar_toolkit.py +0 -0
- {camel_ai-0.2.71a3 → camel_ai-0.2.71a4}/camel/toolkits/google_drive_mcp_toolkit.py +0 -0
- {camel_ai-0.2.71a3 → camel_ai-0.2.71a4}/camel/toolkits/google_maps_toolkit.py +0 -0
- {camel_ai-0.2.71a3 → camel_ai-0.2.71a4}/camel/toolkits/google_scholar_toolkit.py +0 -0
- {camel_ai-0.2.71a3 → camel_ai-0.2.71a4}/camel/toolkits/human_toolkit.py +0 -0
- {camel_ai-0.2.71a3 → camel_ai-0.2.71a4}/camel/toolkits/hybrid_browser_toolkit/__init__.py +0 -0
- {camel_ai-0.2.71a3 → camel_ai-0.2.71a4}/camel/toolkits/hybrid_browser_toolkit/actions.py +0 -0
- {camel_ai-0.2.71a3 → camel_ai-0.2.71a4}/camel/toolkits/hybrid_browser_toolkit/agent.py +0 -0
- {camel_ai-0.2.71a3 → camel_ai-0.2.71a4}/camel/toolkits/hybrid_browser_toolkit/browser_session.py +0 -0
- {camel_ai-0.2.71a3 → camel_ai-0.2.71a4}/camel/toolkits/hybrid_browser_toolkit/snapshot.py +0 -0
- {camel_ai-0.2.71a3 → camel_ai-0.2.71a4}/camel/toolkits/image_analysis_toolkit.py +0 -0
- {camel_ai-0.2.71a3 → camel_ai-0.2.71a4}/camel/toolkits/jina_reranker_toolkit.py +0 -0
- {camel_ai-0.2.71a3 → camel_ai-0.2.71a4}/camel/toolkits/klavis_toolkit.py +0 -0
- {camel_ai-0.2.71a3 → camel_ai-0.2.71a4}/camel/toolkits/linkedin_toolkit.py +0 -0
- {camel_ai-0.2.71a3 → camel_ai-0.2.71a4}/camel/toolkits/markitdown_toolkit.py +0 -0
- {camel_ai-0.2.71a3 → camel_ai-0.2.71a4}/camel/toolkits/math_toolkit.py +0 -0
- {camel_ai-0.2.71a3 → camel_ai-0.2.71a4}/camel/toolkits/mcp_toolkit.py +0 -0
- {camel_ai-0.2.71a3 → camel_ai-0.2.71a4}/camel/toolkits/memory_toolkit.py +0 -0
- {camel_ai-0.2.71a3 → camel_ai-0.2.71a4}/camel/toolkits/meshy_toolkit.py +0 -0
- {camel_ai-0.2.71a3 → camel_ai-0.2.71a4}/camel/toolkits/mineru_toolkit.py +0 -0
- {camel_ai-0.2.71a3 → camel_ai-0.2.71a4}/camel/toolkits/networkx_toolkit.py +0 -0
- {camel_ai-0.2.71a3 → camel_ai-0.2.71a4}/camel/toolkits/notion_toolkit.py +0 -0
- {camel_ai-0.2.71a3 → camel_ai-0.2.71a4}/camel/toolkits/open_api_specs/biztoc/__init__.py +0 -0
- {camel_ai-0.2.71a3 → camel_ai-0.2.71a4}/camel/toolkits/open_api_specs/biztoc/ai-plugin.json +0 -0
- {camel_ai-0.2.71a3 → camel_ai-0.2.71a4}/camel/toolkits/open_api_specs/biztoc/openapi.yaml +0 -0
- {camel_ai-0.2.71a3 → camel_ai-0.2.71a4}/camel/toolkits/open_api_specs/coursera/__init__.py +0 -0
- {camel_ai-0.2.71a3 → camel_ai-0.2.71a4}/camel/toolkits/open_api_specs/coursera/openapi.yaml +0 -0
- {camel_ai-0.2.71a3 → camel_ai-0.2.71a4}/camel/toolkits/open_api_specs/create_qr_code/__init__.py +0 -0
- {camel_ai-0.2.71a3 → camel_ai-0.2.71a4}/camel/toolkits/open_api_specs/create_qr_code/openapi.yaml +0 -0
- {camel_ai-0.2.71a3 → camel_ai-0.2.71a4}/camel/toolkits/open_api_specs/klarna/__init__.py +0 -0
- {camel_ai-0.2.71a3 → camel_ai-0.2.71a4}/camel/toolkits/open_api_specs/klarna/openapi.yaml +0 -0
- {camel_ai-0.2.71a3 → camel_ai-0.2.71a4}/camel/toolkits/open_api_specs/nasa_apod/__init__.py +0 -0
- {camel_ai-0.2.71a3 → camel_ai-0.2.71a4}/camel/toolkits/open_api_specs/nasa_apod/openapi.yaml +0 -0
- {camel_ai-0.2.71a3 → camel_ai-0.2.71a4}/camel/toolkits/open_api_specs/outschool/__init__.py +0 -0
- {camel_ai-0.2.71a3 → camel_ai-0.2.71a4}/camel/toolkits/open_api_specs/outschool/ai-plugin.json +0 -0
- {camel_ai-0.2.71a3 → camel_ai-0.2.71a4}/camel/toolkits/open_api_specs/outschool/openapi.yaml +0 -0
- {camel_ai-0.2.71a3 → camel_ai-0.2.71a4}/camel/toolkits/open_api_specs/outschool/paths/__init__.py +0 -0
- {camel_ai-0.2.71a3 → camel_ai-0.2.71a4}/camel/toolkits/open_api_specs/outschool/paths/get_classes.py +0 -0
- {camel_ai-0.2.71a3 → camel_ai-0.2.71a4}/camel/toolkits/open_api_specs/outschool/paths/search_teachers.py +0 -0
- {camel_ai-0.2.71a3 → camel_ai-0.2.71a4}/camel/toolkits/open_api_specs/security_config.py +0 -0
- {camel_ai-0.2.71a3 → camel_ai-0.2.71a4}/camel/toolkits/open_api_specs/speak/__init__.py +0 -0
- {camel_ai-0.2.71a3 → camel_ai-0.2.71a4}/camel/toolkits/open_api_specs/speak/openapi.yaml +0 -0
- {camel_ai-0.2.71a3 → camel_ai-0.2.71a4}/camel/toolkits/open_api_specs/web_scraper/__init__.py +0 -0
- {camel_ai-0.2.71a3 → camel_ai-0.2.71a4}/camel/toolkits/open_api_specs/web_scraper/ai-plugin.json +0 -0
- {camel_ai-0.2.71a3 → camel_ai-0.2.71a4}/camel/toolkits/open_api_specs/web_scraper/openapi.yaml +0 -0
- {camel_ai-0.2.71a3 → camel_ai-0.2.71a4}/camel/toolkits/open_api_specs/web_scraper/paths/__init__.py +0 -0
- {camel_ai-0.2.71a3 → camel_ai-0.2.71a4}/camel/toolkits/open_api_specs/web_scraper/paths/scraper.py +0 -0
- {camel_ai-0.2.71a3 → camel_ai-0.2.71a4}/camel/toolkits/open_api_toolkit.py +0 -0
- {camel_ai-0.2.71a3 → camel_ai-0.2.71a4}/camel/toolkits/openai_agent_toolkit.py +0 -0
- {camel_ai-0.2.71a3 → camel_ai-0.2.71a4}/camel/toolkits/openbb_toolkit.py +0 -0
- {camel_ai-0.2.71a3 → camel_ai-0.2.71a4}/camel/toolkits/page_script.js +0 -0
- {camel_ai-0.2.71a3 → camel_ai-0.2.71a4}/camel/toolkits/playwright_mcp_toolkit.py +0 -0
- {camel_ai-0.2.71a3 → camel_ai-0.2.71a4}/camel/toolkits/pptx_toolkit.py +0 -0
- {camel_ai-0.2.71a3 → camel_ai-0.2.71a4}/camel/toolkits/pubmed_toolkit.py +0 -0
- {camel_ai-0.2.71a3 → camel_ai-0.2.71a4}/camel/toolkits/pulse_mcp_search_toolkit.py +0 -0
- {camel_ai-0.2.71a3 → camel_ai-0.2.71a4}/camel/toolkits/pyautogui_toolkit.py +0 -0
- {camel_ai-0.2.71a3 → camel_ai-0.2.71a4}/camel/toolkits/reddit_toolkit.py +0 -0
- {camel_ai-0.2.71a3 → camel_ai-0.2.71a4}/camel/toolkits/retrieval_toolkit.py +0 -0
- {camel_ai-0.2.71a3 → camel_ai-0.2.71a4}/camel/toolkits/search_toolkit.py +0 -0
- {camel_ai-0.2.71a3 → camel_ai-0.2.71a4}/camel/toolkits/searxng_toolkit.py +0 -0
- {camel_ai-0.2.71a3 → camel_ai-0.2.71a4}/camel/toolkits/semantic_scholar_toolkit.py +0 -0
- {camel_ai-0.2.71a3 → camel_ai-0.2.71a4}/camel/toolkits/stripe_toolkit.py +0 -0
- {camel_ai-0.2.71a3 → camel_ai-0.2.71a4}/camel/toolkits/sympy_toolkit.py +0 -0
- {camel_ai-0.2.71a3 → camel_ai-0.2.71a4}/camel/toolkits/task_planning_toolkit.py +0 -0
- {camel_ai-0.2.71a3 → camel_ai-0.2.71a4}/camel/toolkits/thinking_toolkit.py +0 -0
- {camel_ai-0.2.71a3 → camel_ai-0.2.71a4}/camel/toolkits/twitter_toolkit.py +0 -0
- {camel_ai-0.2.71a3 → camel_ai-0.2.71a4}/camel/toolkits/video_analysis_toolkit.py +0 -0
- {camel_ai-0.2.71a3 → camel_ai-0.2.71a4}/camel/toolkits/video_download_toolkit.py +0 -0
- {camel_ai-0.2.71a3 → camel_ai-0.2.71a4}/camel/toolkits/weather_toolkit.py +0 -0
- {camel_ai-0.2.71a3 → camel_ai-0.2.71a4}/camel/toolkits/whatsapp_toolkit.py +0 -0
- {camel_ai-0.2.71a3 → camel_ai-0.2.71a4}/camel/toolkits/wolfram_alpha_toolkit.py +0 -0
- {camel_ai-0.2.71a3 → camel_ai-0.2.71a4}/camel/toolkits/zapier_toolkit.py +0 -0
- {camel_ai-0.2.71a3 → camel_ai-0.2.71a4}/camel/types/__init__.py +0 -0
- {camel_ai-0.2.71a3 → camel_ai-0.2.71a4}/camel/types/agents/__init__.py +0 -0
- {camel_ai-0.2.71a3 → camel_ai-0.2.71a4}/camel/types/agents/tool_calling_record.py +0 -0
- {camel_ai-0.2.71a3 → camel_ai-0.2.71a4}/camel/types/enums.py +0 -0
- {camel_ai-0.2.71a3 → camel_ai-0.2.71a4}/camel/types/mcp_registries.py +0 -0
- {camel_ai-0.2.71a3 → camel_ai-0.2.71a4}/camel/types/openai_types.py +0 -0
- {camel_ai-0.2.71a3 → camel_ai-0.2.71a4}/camel/types/unified_model_type.py +0 -0
- {camel_ai-0.2.71a3 → camel_ai-0.2.71a4}/camel/utils/__init__.py +0 -0
- {camel_ai-0.2.71a3 → camel_ai-0.2.71a4}/camel/utils/async_func.py +0 -0
- {camel_ai-0.2.71a3 → camel_ai-0.2.71a4}/camel/utils/chunker/__init__.py +0 -0
- {camel_ai-0.2.71a3 → camel_ai-0.2.71a4}/camel/utils/chunker/base.py +0 -0
- {camel_ai-0.2.71a3 → camel_ai-0.2.71a4}/camel/utils/chunker/code_chunker.py +0 -0
- {camel_ai-0.2.71a3 → camel_ai-0.2.71a4}/camel/utils/chunker/uio_chunker.py +0 -0
- {camel_ai-0.2.71a3 → camel_ai-0.2.71a4}/camel/utils/commons.py +0 -0
- {camel_ai-0.2.71a3 → camel_ai-0.2.71a4}/camel/utils/constants.py +0 -0
- {camel_ai-0.2.71a3 → camel_ai-0.2.71a4}/camel/utils/deduplication.py +0 -0
- {camel_ai-0.2.71a3 → camel_ai-0.2.71a4}/camel/utils/filename.py +0 -0
- {camel_ai-0.2.71a3 → camel_ai-0.2.71a4}/camel/utils/langfuse.py +0 -0
- {camel_ai-0.2.71a3 → camel_ai-0.2.71a4}/camel/utils/mcp.py +0 -0
- {camel_ai-0.2.71a3 → camel_ai-0.2.71a4}/camel/utils/message_summarizer.py +0 -0
- {camel_ai-0.2.71a3 → camel_ai-0.2.71a4}/camel/utils/response_format.py +0 -0
- {camel_ai-0.2.71a3 → camel_ai-0.2.71a4}/camel/utils/token_counting.py +0 -0
- {camel_ai-0.2.71a3 → camel_ai-0.2.71a4}/camel/utils/tool_result.py +0 -0
- {camel_ai-0.2.71a3 → camel_ai-0.2.71a4}/camel/verifiers/__init__.py +0 -0
- {camel_ai-0.2.71a3 → camel_ai-0.2.71a4}/camel/verifiers/base.py +0 -0
- {camel_ai-0.2.71a3 → camel_ai-0.2.71a4}/camel/verifiers/math_verifier.py +0 -0
- {camel_ai-0.2.71a3 → camel_ai-0.2.71a4}/camel/verifiers/models.py +0 -0
- {camel_ai-0.2.71a3 → camel_ai-0.2.71a4}/camel/verifiers/physics_verifier.py +0 -0
- {camel_ai-0.2.71a3 → camel_ai-0.2.71a4}/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.71a4
|
|
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
|
|
@@ -15,7 +15,7 @@ Requires-Dist: docstring-parser<0.16,>=0.15
|
|
|
15
15
|
Requires-Dist: httpx<1.0.0dev,>=0.28.0
|
|
16
16
|
Requires-Dist: jsonschema<5,>=4
|
|
17
17
|
Requires-Dist: mcp>=1.3.0
|
|
18
|
-
Requires-Dist: openai<2,>=1.
|
|
18
|
+
Requires-Dist: openai<2,>=1.86.0
|
|
19
19
|
Requires-Dist: pillow<11.0.0,>=10.1.0
|
|
20
20
|
Requires-Dist: psutil<6,>=5.9.8
|
|
21
21
|
Requires-Dist: pydantic>=2.10.6
|
|
@@ -39,7 +39,7 @@ Requires-Dist: dappier<0.4,>=0.3.3; extra == 'all'
|
|
|
39
39
|
Requires-Dist: datacommons-pandas<0.0.4,>=0.0.3; extra == 'all'
|
|
40
40
|
Requires-Dist: datacommons<2,>=1.4.3; extra == 'all'
|
|
41
41
|
Requires-Dist: datasets<4,>=3; extra == 'all'
|
|
42
|
-
Requires-Dist: daytona-sdk
|
|
42
|
+
Requires-Dist: daytona-sdk==0.20.0; extra == 'all'
|
|
43
43
|
Requires-Dist: diffusers<0.26,>=0.25.0; extra == 'all'
|
|
44
44
|
Requires-Dist: discord-py<3,>=2.3.2; extra == 'all'
|
|
45
45
|
Requires-Dist: docker<8,>=7.1.0; extra == 'all'
|
|
@@ -183,7 +183,7 @@ Requires-Dist: uv<0.8,>=0.7.0; extra == 'dev'
|
|
|
183
183
|
Provides-Extra: dev-tools
|
|
184
184
|
Requires-Dist: aci-sdk>=1.0.0b1; extra == 'dev-tools'
|
|
185
185
|
Requires-Dist: agentops<0.4,>=0.3.21; extra == 'dev-tools'
|
|
186
|
-
Requires-Dist: daytona-sdk
|
|
186
|
+
Requires-Dist: daytona-sdk==0.20.0; extra == 'dev-tools'
|
|
187
187
|
Requires-Dist: docker<8,>=7.1.0; extra == 'dev-tools'
|
|
188
188
|
Requires-Dist: e2b-code-interpreter<2,>=1.0.3; extra == 'dev-tools'
|
|
189
189
|
Requires-Dist: ipykernel<7,>=6.0.0; extra == 'dev-tools'
|
|
@@ -753,6 +753,45 @@ Practical guides and tutorials for implementing specific functionalities in CAME
|
|
|
753
753
|
| **[3 Ways to Ingest Data from Websites with Firecrawl](https://docs.camel-ai.org/cookbooks/data_processing/ingest_data_from_websites_with_Firecrawl.html)** | Explore three methods for extracting and processing data from websites using Firecrawl. |
|
|
754
754
|
| **[Create AI Agents that work with your PDFs](https://docs.camel-ai.org/cookbooks/data_processing/agent_with_chunkr_for_pdf_parsing.html)** | Learn how to create AI agents that work with your PDFs using Chunkr and Mistral AI. |
|
|
755
755
|
|
|
756
|
+
<br>
|
|
757
|
+
|
|
758
|
+
## Real-World Usecases
|
|
759
|
+
|
|
760
|
+
Real-world usecases demonstrating how CAMEL’s multi-agent framework enables real business value across infrastructure automation, productivity workflows, retrieval-augmented conversations, intelligent document/video analysis, and collaborative research.
|
|
761
|
+
|
|
762
|
+
### 1 Infrastructure Automation
|
|
763
|
+
|
|
764
|
+
| Usecase | Description |
|
|
765
|
+
| :----------------------------------------------------------- | :----------------------------------------------------------- |
|
|
766
|
+
| **[ACI MCP](https://github.com/camel-ai/camel/tree/master/examples/usecases/aci_mcp)** | Real-world usecases demonstrating how CAMEL’s multi-agent framework enables real business value across infrastructure automation, productivity workflows, retrieval-augmented conversations, intelligent document/video analysis, and collaborative research. |
|
|
767
|
+
| **[Cloudflare MCP CAMEL](https://github.com/camel-ai/camel/tree/master/examples/usecases/cloudfare_mcp_camel)** | Intelligent agents manage Cloudflare resources dynamically, enabling scalable and efficient cloud security and performance tuning. |
|
|
768
|
+
|
|
769
|
+
### 2 Productivity & Business Workflows
|
|
770
|
+
|
|
771
|
+
| Usecase | Description |
|
|
772
|
+
| :----------------------------------------------------------- | :----------------------------------------------------------- |
|
|
773
|
+
| **[Airbnb MCP](https://github.com/camel-ai/camel/tree/master/examples/usecases/airbnb_mcp)** | Coordinate agents to optimize and manage Airbnb listings and host operations. |
|
|
774
|
+
| **[PPTX Toolkit Usecase](https://github.com/camel-ai/camel/tree/master/examples/usecases/pptx_toolkit_usecase)** | Analyze PowerPoint documents and extract structured insights through multi-agent collaboration. |
|
|
775
|
+
|
|
776
|
+
### 3 Retrieval-Augmented Multi-Agent Chat
|
|
777
|
+
|
|
778
|
+
| Usecase | Description |
|
|
779
|
+
| :----------------------------------------------------------- | :----------------------------------------------------------- |
|
|
780
|
+
| **[Chat with GitHub](https://github.com/camel-ai/camel/tree/master/examples/usecases/chat_with_github)** | Query and understand GitHub codebases through CAMEL agents leveraging RAG-style workflows, accelerating developer onboarding and codebase navigation. |
|
|
781
|
+
| **[Chat with YouTube](https://github.com/camel-ai/camel/tree/master/examples/usecases/chat_with_youtube)** | Conversational agents extract and summarize video transcripts, enabling faster content understanding and repurposing. |
|
|
782
|
+
|
|
783
|
+
### 4 Video & Document Intelligence
|
|
784
|
+
|
|
785
|
+
| Usecase | Description |
|
|
786
|
+
| :----------------------------------------------------------- | :----------------------------------------------------------- |
|
|
787
|
+
| **[YouTube OCR](https://github.com/camel-ai/camel/tree/master/examples/usecases/youtube_ocr)** | Agents perform OCR on video screenshots to summarize visual content, supporting media monitoring and compliance. |
|
|
788
|
+
| **[Mistral OCR](https://github.com/camel-ai/camel/tree/master/examples/usecases/mistral_OCR)** | CAMEL agents use OCR with Mistral to analyze documents, reducing manual effort in document understanding workflows. |
|
|
789
|
+
|
|
790
|
+
### 5 Research & Collaboration
|
|
791
|
+
|
|
792
|
+
| Usecase | Description |
|
|
793
|
+
| :----------------------------------------------------------- | :----------------------------------------------------------- |
|
|
794
|
+
| **[Multi-Agent Research Assistant](https://github.com/camel-ai/camel/tree/master/examples/usecases/multi_agent_research_assistant)** | Simulates a team of research agents collaborating on literature review, improving efficiency in exploratory analysis and reporting. |
|
|
756
795
|
|
|
757
796
|
<br>
|
|
758
797
|
|
|
@@ -396,6 +396,45 @@ Practical guides and tutorials for implementing specific functionalities in CAME
|
|
|
396
396
|
| **[3 Ways to Ingest Data from Websites with Firecrawl](https://docs.camel-ai.org/cookbooks/data_processing/ingest_data_from_websites_with_Firecrawl.html)** | Explore three methods for extracting and processing data from websites using Firecrawl. |
|
|
397
397
|
| **[Create AI Agents that work with your PDFs](https://docs.camel-ai.org/cookbooks/data_processing/agent_with_chunkr_for_pdf_parsing.html)** | Learn how to create AI agents that work with your PDFs using Chunkr and Mistral AI. |
|
|
398
398
|
|
|
399
|
+
<br>
|
|
400
|
+
|
|
401
|
+
## Real-World Usecases
|
|
402
|
+
|
|
403
|
+
Real-world usecases demonstrating how CAMEL’s multi-agent framework enables real business value across infrastructure automation, productivity workflows, retrieval-augmented conversations, intelligent document/video analysis, and collaborative research.
|
|
404
|
+
|
|
405
|
+
### 1 Infrastructure Automation
|
|
406
|
+
|
|
407
|
+
| Usecase | Description |
|
|
408
|
+
| :----------------------------------------------------------- | :----------------------------------------------------------- |
|
|
409
|
+
| **[ACI MCP](https://github.com/camel-ai/camel/tree/master/examples/usecases/aci_mcp)** | Real-world usecases demonstrating how CAMEL’s multi-agent framework enables real business value across infrastructure automation, productivity workflows, retrieval-augmented conversations, intelligent document/video analysis, and collaborative research. |
|
|
410
|
+
| **[Cloudflare MCP CAMEL](https://github.com/camel-ai/camel/tree/master/examples/usecases/cloudfare_mcp_camel)** | Intelligent agents manage Cloudflare resources dynamically, enabling scalable and efficient cloud security and performance tuning. |
|
|
411
|
+
|
|
412
|
+
### 2 Productivity & Business Workflows
|
|
413
|
+
|
|
414
|
+
| Usecase | Description |
|
|
415
|
+
| :----------------------------------------------------------- | :----------------------------------------------------------- |
|
|
416
|
+
| **[Airbnb MCP](https://github.com/camel-ai/camel/tree/master/examples/usecases/airbnb_mcp)** | Coordinate agents to optimize and manage Airbnb listings and host operations. |
|
|
417
|
+
| **[PPTX Toolkit Usecase](https://github.com/camel-ai/camel/tree/master/examples/usecases/pptx_toolkit_usecase)** | Analyze PowerPoint documents and extract structured insights through multi-agent collaboration. |
|
|
418
|
+
|
|
419
|
+
### 3 Retrieval-Augmented Multi-Agent Chat
|
|
420
|
+
|
|
421
|
+
| Usecase | Description |
|
|
422
|
+
| :----------------------------------------------------------- | :----------------------------------------------------------- |
|
|
423
|
+
| **[Chat with GitHub](https://github.com/camel-ai/camel/tree/master/examples/usecases/chat_with_github)** | Query and understand GitHub codebases through CAMEL agents leveraging RAG-style workflows, accelerating developer onboarding and codebase navigation. |
|
|
424
|
+
| **[Chat with YouTube](https://github.com/camel-ai/camel/tree/master/examples/usecases/chat_with_youtube)** | Conversational agents extract and summarize video transcripts, enabling faster content understanding and repurposing. |
|
|
425
|
+
|
|
426
|
+
### 4 Video & Document Intelligence
|
|
427
|
+
|
|
428
|
+
| Usecase | Description |
|
|
429
|
+
| :----------------------------------------------------------- | :----------------------------------------------------------- |
|
|
430
|
+
| **[YouTube OCR](https://github.com/camel-ai/camel/tree/master/examples/usecases/youtube_ocr)** | Agents perform OCR on video screenshots to summarize visual content, supporting media monitoring and compliance. |
|
|
431
|
+
| **[Mistral OCR](https://github.com/camel-ai/camel/tree/master/examples/usecases/mistral_OCR)** | CAMEL agents use OCR with Mistral to analyze documents, reducing manual effort in document understanding workflows. |
|
|
432
|
+
|
|
433
|
+
### 5 Research & Collaboration
|
|
434
|
+
|
|
435
|
+
| Usecase | Description |
|
|
436
|
+
| :----------------------------------------------------------- | :----------------------------------------------------------- |
|
|
437
|
+
| **[Multi-Agent Research Assistant](https://github.com/camel-ai/camel/tree/master/examples/usecases/multi_agent_research_assistant)** | Simulates a team of research agents collaborating on literature review, improving efficiency in exploratory analysis and reporting. |
|
|
399
438
|
|
|
400
439
|
<br>
|
|
401
440
|
|
|
@@ -146,8 +146,9 @@ class DockerInterpreter(BaseInterpreter):
|
|
|
146
146
|
tar_stream = io.BytesIO()
|
|
147
147
|
with tarfile.open(fileobj=tar_stream, mode='w') as tar:
|
|
148
148
|
tarinfo = tarfile.TarInfo(name=filename)
|
|
149
|
-
|
|
150
|
-
|
|
149
|
+
encoded_content = content.encode('utf-8')
|
|
150
|
+
tarinfo.size = len(encoded_content)
|
|
151
|
+
tar.addfile(tarinfo, io.BytesIO(encoded_content))
|
|
151
152
|
tar_stream.seek(0)
|
|
152
153
|
|
|
153
154
|
# copy the tar into the container
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
# ========= Copyright 2023-2024 @ CAMEL-AI.org. All Rights Reserved. =========
|
|
2
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
3
|
+
# you may not use this file except in compliance with the License.
|
|
4
|
+
# You may obtain a copy of the License at
|
|
5
|
+
#
|
|
6
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
|
7
|
+
#
|
|
8
|
+
# Unless required by applicable law or agreed to in writing, software
|
|
9
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
|
10
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
11
|
+
# See the License for the specific language governing permissions and
|
|
12
|
+
# limitations under the License.
|
|
13
|
+
# ========= Copyright 2023-2024 @ CAMEL-AI.org. All Rights Reserved. =========
|
|
14
|
+
from abc import ABC, abstractmethod
|
|
15
|
+
from pathlib import Path
|
|
16
|
+
from typing import Any, Dict, List, Union
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
class BaseLoader(ABC):
|
|
20
|
+
r"""Abstract base class for all data loaders in CAMEL."""
|
|
21
|
+
|
|
22
|
+
@abstractmethod
|
|
23
|
+
def _load_single(self, source: Union[str, Path]) -> Dict[str, Any]:
|
|
24
|
+
r"""Load data from a single source.
|
|
25
|
+
|
|
26
|
+
Args:
|
|
27
|
+
source (Union[str, Path]): The data source to load from.
|
|
28
|
+
|
|
29
|
+
Returns:
|
|
30
|
+
Dict[str, Any]: A dictionary containing the loaded data. It is
|
|
31
|
+
recommended that the dictionary includes a "content" key with
|
|
32
|
+
the primary data and optional metadata keys.
|
|
33
|
+
"""
|
|
34
|
+
pass
|
|
35
|
+
|
|
36
|
+
def load(
|
|
37
|
+
self,
|
|
38
|
+
source: Union[str, Path, List[Union[str, Path]]],
|
|
39
|
+
) -> Dict[str, List[Dict[str, Any]]]:
|
|
40
|
+
r"""Load data from one or multiple sources.
|
|
41
|
+
|
|
42
|
+
Args:
|
|
43
|
+
source (Union[str, Path, List[Union[str, Path]]]): The data source
|
|
44
|
+
(s) to load from. Can be:
|
|
45
|
+
- A single path/URL (str or Path)
|
|
46
|
+
- A list of paths/URLs
|
|
47
|
+
|
|
48
|
+
Returns:
|
|
49
|
+
Dict[str, List[Dict[str, Any]]]: A dictionary with a single key
|
|
50
|
+
"contents" containing a list of loaded data. If a single source
|
|
51
|
+
is provided, the list will contain a single item.
|
|
52
|
+
|
|
53
|
+
Raises:
|
|
54
|
+
ValueError: If no sources are provided
|
|
55
|
+
Exception: If loading fails for any source
|
|
56
|
+
"""
|
|
57
|
+
if not source:
|
|
58
|
+
raise ValueError("At least one source must be provided")
|
|
59
|
+
|
|
60
|
+
# Convert single source to list for uniform processing
|
|
61
|
+
sources = [source] if isinstance(source, (str, Path)) else list(source)
|
|
62
|
+
|
|
63
|
+
# Process all sources
|
|
64
|
+
results = []
|
|
65
|
+
for i, src in enumerate(sources, 1):
|
|
66
|
+
try:
|
|
67
|
+
content = self._load_single(src)
|
|
68
|
+
results.append(content)
|
|
69
|
+
except Exception as e:
|
|
70
|
+
raise RuntimeError(
|
|
71
|
+
f"Error loading source {i}/{len(sources)}: {src}"
|
|
72
|
+
) from e
|
|
73
|
+
|
|
74
|
+
return {"contents": results}
|
|
75
|
+
|
|
76
|
+
@property
|
|
77
|
+
@abstractmethod
|
|
78
|
+
def supported_formats(self) -> set[str]:
|
|
79
|
+
r"""Get the set of supported file formats or data sources.
|
|
80
|
+
|
|
81
|
+
Returns:
|
|
82
|
+
set[str]: A set of strings representing the supported formats/
|
|
83
|
+
sources.
|
|
84
|
+
"""
|
|
85
|
+
pass
|
|
@@ -19,7 +19,16 @@ import time
|
|
|
19
19
|
import uuid
|
|
20
20
|
from collections import deque
|
|
21
21
|
from enum import Enum
|
|
22
|
-
from typing import
|
|
22
|
+
from typing import (
|
|
23
|
+
Any,
|
|
24
|
+
Coroutine,
|
|
25
|
+
Deque,
|
|
26
|
+
Dict,
|
|
27
|
+
List,
|
|
28
|
+
Optional,
|
|
29
|
+
Set,
|
|
30
|
+
Tuple,
|
|
31
|
+
)
|
|
23
32
|
|
|
24
33
|
from colorama import Fore
|
|
25
34
|
|
|
@@ -200,7 +209,7 @@ class Workforce(BaseNode):
|
|
|
200
209
|
children: Optional[List[BaseNode]] = None,
|
|
201
210
|
coordinator_agent: Optional[ChatAgent] = None,
|
|
202
211
|
task_agent: Optional[ChatAgent] = None,
|
|
203
|
-
new_worker_agent: Optional[ChatAgent] = None,
|
|
212
|
+
new_worker_agent: Optional[ChatAgent] = None,
|
|
204
213
|
graceful_shutdown_timeout: float = 15.0,
|
|
205
214
|
share_memory: bool = False,
|
|
206
215
|
) -> None:
|
|
@@ -325,9 +334,10 @@ class Workforce(BaseNode):
|
|
|
325
334
|
"settings (ModelPlatformType.DEFAULT, ModelType.DEFAULT) "
|
|
326
335
|
"with default system message and TaskPlanningToolkit."
|
|
327
336
|
)
|
|
337
|
+
task_tools = TaskPlanningToolkit().get_tools()
|
|
328
338
|
self.task_agent = ChatAgent(
|
|
329
339
|
task_sys_msg,
|
|
330
|
-
tools=
|
|
340
|
+
tools=task_tools, # type: ignore[arg-type]
|
|
331
341
|
)
|
|
332
342
|
else:
|
|
333
343
|
logger.info(
|
|
@@ -563,6 +573,44 @@ class Workforce(BaseNode):
|
|
|
563
573
|
except Exception as e:
|
|
564
574
|
logger.warning(f"Error synchronizing shared memory: {e}")
|
|
565
575
|
|
|
576
|
+
def _update_dependencies_for_decomposition(
|
|
577
|
+
self, original_task: Task, subtasks: List[Task]
|
|
578
|
+
) -> None:
|
|
579
|
+
r"""Update dependency tracking when a task is decomposed into subtasks.
|
|
580
|
+
Tasks that depended on the original task should now depend on all
|
|
581
|
+
subtasks. The last subtask inherits the original task's dependencies.
|
|
582
|
+
"""
|
|
583
|
+
if not subtasks:
|
|
584
|
+
return
|
|
585
|
+
|
|
586
|
+
original_task_id = original_task.id
|
|
587
|
+
subtask_ids = [subtask.id for subtask in subtasks]
|
|
588
|
+
|
|
589
|
+
# Find tasks that depend on the original task
|
|
590
|
+
dependent_task_ids = [
|
|
591
|
+
task_id
|
|
592
|
+
for task_id, deps in self._task_dependencies.items()
|
|
593
|
+
if original_task_id in deps
|
|
594
|
+
]
|
|
595
|
+
|
|
596
|
+
# Update dependent tasks to depend on all subtasks
|
|
597
|
+
for task_id in dependent_task_ids:
|
|
598
|
+
dependencies = self._task_dependencies[task_id]
|
|
599
|
+
dependencies.remove(original_task_id)
|
|
600
|
+
dependencies.extend(subtask_ids)
|
|
601
|
+
|
|
602
|
+
# The last subtask inherits original task's dependencies (if any)
|
|
603
|
+
if original_task_id in self._task_dependencies:
|
|
604
|
+
original_dependencies = self._task_dependencies[original_task_id]
|
|
605
|
+
if original_dependencies:
|
|
606
|
+
# Set dependencies for the last subtask to maintain execution
|
|
607
|
+
# order
|
|
608
|
+
self._task_dependencies[subtask_ids[-1]] = (
|
|
609
|
+
original_dependencies.copy()
|
|
610
|
+
)
|
|
611
|
+
# Remove original task dependencies as it's now decomposed
|
|
612
|
+
del self._task_dependencies[original_task_id]
|
|
613
|
+
|
|
566
614
|
def _cleanup_task_tracking(self, task_id: str) -> None:
|
|
567
615
|
r"""Clean up tracking data for a task to prevent memory leaks.
|
|
568
616
|
|
|
@@ -590,6 +638,10 @@ class Workforce(BaseNode):
|
|
|
590
638
|
for subtask in subtasks:
|
|
591
639
|
subtask.parent = task
|
|
592
640
|
|
|
641
|
+
# Update dependency tracking for decomposed task
|
|
642
|
+
if subtasks:
|
|
643
|
+
self._update_dependencies_for_decomposition(task, subtasks)
|
|
644
|
+
|
|
593
645
|
return subtasks
|
|
594
646
|
|
|
595
647
|
# Human intervention methods
|
|
@@ -1436,7 +1488,9 @@ class Workforce(BaseNode):
|
|
|
1436
1488
|
|
|
1437
1489
|
return valid_assignments, invalid_assignments
|
|
1438
1490
|
|
|
1439
|
-
def _handle_task_assignment_fallbacks(
|
|
1491
|
+
async def _handle_task_assignment_fallbacks(
|
|
1492
|
+
self, tasks: List[Task]
|
|
1493
|
+
) -> List:
|
|
1440
1494
|
r"""Create new workers for unassigned tasks as fallback.
|
|
1441
1495
|
|
|
1442
1496
|
Args:
|
|
@@ -1449,7 +1503,7 @@ class Workforce(BaseNode):
|
|
|
1449
1503
|
|
|
1450
1504
|
for task in tasks:
|
|
1451
1505
|
logger.info(f"Creating new worker for unassigned task {task.id}")
|
|
1452
|
-
new_worker = self._create_worker_node_for_task(task)
|
|
1506
|
+
new_worker = await self._create_worker_node_for_task(task)
|
|
1453
1507
|
|
|
1454
1508
|
assignment = TaskAssignment(
|
|
1455
1509
|
task_id=task.id,
|
|
@@ -1460,7 +1514,7 @@ class Workforce(BaseNode):
|
|
|
1460
1514
|
|
|
1461
1515
|
return fallback_assignments
|
|
1462
1516
|
|
|
1463
|
-
def _handle_assignment_retry_and_fallback(
|
|
1517
|
+
async def _handle_assignment_retry_and_fallback(
|
|
1464
1518
|
self,
|
|
1465
1519
|
invalid_assignments: List[TaskAssignment],
|
|
1466
1520
|
tasks: List[Task],
|
|
@@ -1531,14 +1585,14 @@ class Workforce(BaseNode):
|
|
|
1531
1585
|
f"Creating fallback workers for {len(unassigned_tasks)} "
|
|
1532
1586
|
f"unassigned tasks"
|
|
1533
1587
|
)
|
|
1534
|
-
fallback_assignments =
|
|
1535
|
-
unassigned_tasks
|
|
1588
|
+
fallback_assignments = (
|
|
1589
|
+
await self._handle_task_assignment_fallbacks(unassigned_tasks)
|
|
1536
1590
|
)
|
|
1537
1591
|
final_assignments.extend(fallback_assignments)
|
|
1538
1592
|
|
|
1539
1593
|
return final_assignments
|
|
1540
1594
|
|
|
1541
|
-
def _find_assignee(
|
|
1595
|
+
async def _find_assignee(
|
|
1542
1596
|
self,
|
|
1543
1597
|
tasks: List[Task],
|
|
1544
1598
|
) -> TaskAssignResult:
|
|
@@ -1580,7 +1634,7 @@ class Workforce(BaseNode):
|
|
|
1580
1634
|
# invalid assignments and unassigned tasks
|
|
1581
1635
|
all_problem_assignments = invalid_assignments
|
|
1582
1636
|
retry_and_fallback_assignments = (
|
|
1583
|
-
self._handle_assignment_retry_and_fallback(
|
|
1637
|
+
await self._handle_assignment_retry_and_fallback(
|
|
1584
1638
|
all_problem_assignments, tasks, valid_worker_ids
|
|
1585
1639
|
)
|
|
1586
1640
|
)
|
|
@@ -1616,7 +1670,7 @@ class Workforce(BaseNode):
|
|
|
1616
1670
|
async def _post_dependency(self, dependency: Task) -> None:
|
|
1617
1671
|
await self._channel.post_dependency(dependency, self.node_id)
|
|
1618
1672
|
|
|
1619
|
-
def _create_worker_node_for_task(self, task: Task) -> Worker:
|
|
1673
|
+
async def _create_worker_node_for_task(self, task: Task) -> Worker:
|
|
1620
1674
|
r"""Creates a new worker node for a given task and add it to the
|
|
1621
1675
|
children list of this node. This is one of the actions that
|
|
1622
1676
|
the coordinator can take when a task has failed.
|
|
@@ -1662,7 +1716,7 @@ class Workforce(BaseNode):
|
|
|
1662
1716
|
f"Coordinator agent returned malformed JSON response. "
|
|
1663
1717
|
)
|
|
1664
1718
|
|
|
1665
|
-
new_agent = self._create_new_agent(
|
|
1719
|
+
new_agent = await self._create_new_agent(
|
|
1666
1720
|
new_node_conf.role,
|
|
1667
1721
|
new_node_conf.sys_msg,
|
|
1668
1722
|
)
|
|
@@ -1689,14 +1743,19 @@ class Workforce(BaseNode):
|
|
|
1689
1743
|
)
|
|
1690
1744
|
return new_node
|
|
1691
1745
|
|
|
1692
|
-
def _create_new_agent(self, role: str, sys_msg: str) -> ChatAgent:
|
|
1746
|
+
async def _create_new_agent(self, role: str, sys_msg: str) -> ChatAgent:
|
|
1693
1747
|
worker_sys_msg = BaseMessage.make_assistant_message(
|
|
1694
1748
|
role_name=role,
|
|
1695
1749
|
content=sys_msg,
|
|
1696
1750
|
)
|
|
1697
1751
|
|
|
1698
1752
|
if self.new_worker_agent is not None:
|
|
1699
|
-
|
|
1753
|
+
# Clone the template agent to create an independent instance
|
|
1754
|
+
cloned_agent = self.new_worker_agent.clone(with_memory=False)
|
|
1755
|
+
# Update the system message for the specific role
|
|
1756
|
+
cloned_agent._system_message = worker_sys_msg
|
|
1757
|
+
cloned_agent.init_messages() # Initialize with new system message
|
|
1758
|
+
return cloned_agent
|
|
1700
1759
|
else:
|
|
1701
1760
|
# Default tools for a new agent
|
|
1702
1761
|
function_list = [
|
|
@@ -1712,7 +1771,7 @@ class Workforce(BaseNode):
|
|
|
1712
1771
|
)
|
|
1713
1772
|
|
|
1714
1773
|
return ChatAgent(
|
|
1715
|
-
worker_sys_msg,
|
|
1774
|
+
system_message=worker_sys_msg,
|
|
1716
1775
|
model=model,
|
|
1717
1776
|
tools=function_list, # type: ignore[arg-type]
|
|
1718
1777
|
pause_event=self._pause_event,
|
|
@@ -1765,7 +1824,7 @@ class Workforce(BaseNode):
|
|
|
1765
1824
|
f"Found {len(tasks_to_assign)} new tasks. "
|
|
1766
1825
|
f"Requesting assignment..."
|
|
1767
1826
|
)
|
|
1768
|
-
batch_result = self._find_assignee(tasks_to_assign)
|
|
1827
|
+
batch_result = await self._find_assignee(tasks_to_assign)
|
|
1769
1828
|
logger.debug(
|
|
1770
1829
|
f"Coordinator returned assignments:\n"
|
|
1771
1830
|
f"{json.dumps(batch_result.dict(), indent=2)}"
|
|
@@ -1788,17 +1847,19 @@ class Workforce(BaseNode):
|
|
|
1788
1847
|
# Step 2: Iterate through all pending tasks and post those that are
|
|
1789
1848
|
# ready
|
|
1790
1849
|
posted_tasks = []
|
|
1791
|
-
# Pre-compute completed task IDs
|
|
1792
|
-
|
|
1850
|
+
# Pre-compute completed task IDs and their states for O(1) lookups
|
|
1851
|
+
completed_tasks_info = {t.id: t.state for t in self._completed_tasks}
|
|
1793
1852
|
|
|
1794
1853
|
for task in self._pending_tasks:
|
|
1795
1854
|
# A task must be assigned to be considered for posting
|
|
1796
1855
|
if task.id in self._task_dependencies:
|
|
1797
1856
|
dependencies = self._task_dependencies[task.id]
|
|
1798
1857
|
# Check if all dependencies for this task are in the completed
|
|
1799
|
-
# set
|
|
1858
|
+
# set and their state is DONE
|
|
1800
1859
|
if all(
|
|
1801
|
-
dep_id in
|
|
1860
|
+
dep_id in completed_tasks_info
|
|
1861
|
+
and completed_tasks_info[dep_id] == TaskState.DONE
|
|
1862
|
+
for dep_id in dependencies
|
|
1802
1863
|
):
|
|
1803
1864
|
assignee_id = self._assignees[task.id]
|
|
1804
1865
|
logger.debug(
|
|
@@ -1885,7 +1946,7 @@ class Workforce(BaseNode):
|
|
|
1885
1946
|
|
|
1886
1947
|
if task.get_depth() > 3:
|
|
1887
1948
|
# Create a new worker node and reassign
|
|
1888
|
-
assignee = self._create_worker_node_for_task(task)
|
|
1949
|
+
assignee = await self._create_worker_node_for_task(task)
|
|
1889
1950
|
|
|
1890
1951
|
# Sync shared memory after creating new worker to provide context
|
|
1891
1952
|
if self.share_memory:
|
|
@@ -1915,19 +1976,35 @@ class Workforce(BaseNode):
|
|
|
1915
1976
|
# Insert packets at the head of the queue
|
|
1916
1977
|
self._pending_tasks.extendleft(reversed(subtasks))
|
|
1917
1978
|
|
|
1979
|
+
await self._post_ready_tasks()
|
|
1980
|
+
action_taken = f"decomposed into {len(subtasks)} subtasks"
|
|
1981
|
+
|
|
1982
|
+
# Handle task completion differently for decomposed tasks
|
|
1983
|
+
if task.id in self._assignees:
|
|
1984
|
+
await self._channel.archive_task(task.id)
|
|
1985
|
+
|
|
1986
|
+
self._cleanup_task_tracking(task.id)
|
|
1987
|
+
logger.debug(
|
|
1988
|
+
f"Task {task.id} failed and was {action_taken}. "
|
|
1989
|
+
f"Dependencies updated for subtasks."
|
|
1990
|
+
)
|
|
1991
|
+
|
|
1918
1992
|
# Sync shared memory after task decomposition
|
|
1919
1993
|
if self.share_memory:
|
|
1920
1994
|
logger.info(
|
|
1921
|
-
f"Syncing shared memory after
|
|
1922
|
-
f"task {task.id}"
|
|
1995
|
+
f"Syncing shared memory after task {task.id} decomposition"
|
|
1923
1996
|
)
|
|
1924
1997
|
self._sync_shared_memory()
|
|
1925
1998
|
|
|
1999
|
+
# Check if any pending tasks are now ready to execute
|
|
1926
2000
|
await self._post_ready_tasks()
|
|
1927
|
-
|
|
2001
|
+
return False
|
|
2002
|
+
|
|
2003
|
+
# For reassigned tasks (depth > 3), handle normally
|
|
1928
2004
|
if task.id in self._assignees:
|
|
1929
2005
|
await self._channel.archive_task(task.id)
|
|
1930
2006
|
|
|
2007
|
+
self._cleanup_task_tracking(task.id)
|
|
1931
2008
|
logger.debug(
|
|
1932
2009
|
f"Task {task.id} failed and was {action_taken}. "
|
|
1933
2010
|
f"Updating dependency state."
|
|
@@ -2020,31 +2097,65 @@ class Workforce(BaseNode):
|
|
|
2020
2097
|
break
|
|
2021
2098
|
|
|
2022
2099
|
if not found_and_removed:
|
|
2023
|
-
# Task was already removed from pending queue (
|
|
2024
|
-
# it
|
|
2025
|
-
# draw user attention with a warning; record at debug level.
|
|
2100
|
+
# Task was already removed from pending queue (common case when
|
|
2101
|
+
# it was posted and removed immediately).
|
|
2026
2102
|
logger.debug(
|
|
2027
2103
|
f"Completed task {task.id} was already removed from pending "
|
|
2028
|
-
"queue."
|
|
2104
|
+
"queue (normal for posted tasks)."
|
|
2029
2105
|
)
|
|
2030
2106
|
|
|
2031
2107
|
# Archive the task and update dependency tracking
|
|
2032
2108
|
if task.id in self._assignees:
|
|
2033
2109
|
await self._channel.archive_task(task.id)
|
|
2034
2110
|
|
|
2035
|
-
# Ensure it's in completed tasks set
|
|
2036
|
-
|
|
2111
|
+
# Ensure it's in completed tasks set by updating if it exists or
|
|
2112
|
+
# appending if it's new.
|
|
2113
|
+
task_found_in_completed = False
|
|
2114
|
+
for i, t in enumerate(self._completed_tasks):
|
|
2115
|
+
if t.id == task.id:
|
|
2116
|
+
self._completed_tasks[i] = task
|
|
2117
|
+
task_found_in_completed = True
|
|
2118
|
+
break
|
|
2119
|
+
if not task_found_in_completed:
|
|
2120
|
+
self._completed_tasks.append(task)
|
|
2037
2121
|
|
|
2038
2122
|
# Handle parent task completion logic
|
|
2039
2123
|
parent = task.parent
|
|
2040
|
-
if parent
|
|
2124
|
+
if parent:
|
|
2125
|
+
# Check if all subtasks are completed and successful
|
|
2041
2126
|
all_subtasks_done = all(
|
|
2042
|
-
|
|
2127
|
+
any(
|
|
2128
|
+
t.id == sub.id and t.state == TaskState.DONE
|
|
2129
|
+
for t in self._completed_tasks
|
|
2130
|
+
)
|
|
2043
2131
|
for sub in parent.subtasks
|
|
2044
2132
|
)
|
|
2045
2133
|
if all_subtasks_done:
|
|
2046
|
-
#
|
|
2134
|
+
# Collect results from successful subtasks only
|
|
2135
|
+
successful_results = []
|
|
2136
|
+
for sub in parent.subtasks:
|
|
2137
|
+
completed_subtask = next(
|
|
2138
|
+
(
|
|
2139
|
+
t
|
|
2140
|
+
for t in self._completed_tasks
|
|
2141
|
+
if t.id == sub.id and t.state == TaskState.DONE
|
|
2142
|
+
),
|
|
2143
|
+
None,
|
|
2144
|
+
)
|
|
2145
|
+
if completed_subtask and completed_subtask.result:
|
|
2146
|
+
successful_results.append(
|
|
2147
|
+
f"--- Subtask {sub.id} Result ---\n"
|
|
2148
|
+
f"{completed_subtask.result}"
|
|
2149
|
+
)
|
|
2150
|
+
|
|
2151
|
+
# Set parent task state and result
|
|
2047
2152
|
parent.state = TaskState.DONE
|
|
2153
|
+
parent.result = (
|
|
2154
|
+
"\n\n".join(successful_results)
|
|
2155
|
+
if successful_results
|
|
2156
|
+
else "All subtasks completed"
|
|
2157
|
+
)
|
|
2158
|
+
|
|
2048
2159
|
logger.debug(
|
|
2049
2160
|
f"All subtasks of {parent.id} are done. "
|
|
2050
2161
|
f"Marking parent as complete."
|
|
@@ -23,7 +23,7 @@ from .open_api_specs.security_config import openapi_security_config
|
|
|
23
23
|
from .math_toolkit import MathToolkit
|
|
24
24
|
from .search_toolkit import SearchToolkit
|
|
25
25
|
from .weather_toolkit import WeatherToolkit
|
|
26
|
-
from .
|
|
26
|
+
from .openai_image_toolkit import OpenAIImageToolkit
|
|
27
27
|
from .ask_news_toolkit import AskNewsToolkit, AsyncAskNewsToolkit
|
|
28
28
|
from .linkedin_toolkit import LinkedInToolkit
|
|
29
29
|
from .reddit_toolkit import RedditToolkit
|
|
@@ -82,6 +82,7 @@ from .edgeone_pages_mcp_toolkit import EdgeOnePagesMCPToolkit
|
|
|
82
82
|
from .google_drive_mcp_toolkit import GoogleDriveMCPToolkit
|
|
83
83
|
from .craw4ai_toolkit import Crawl4AIToolkit
|
|
84
84
|
from .markitdown_toolkit import MarkItDownToolkit
|
|
85
|
+
from .note_taking_toolkit import NoteTakingToolkit
|
|
85
86
|
|
|
86
87
|
__all__ = [
|
|
87
88
|
'BaseToolkit',
|
|
@@ -96,7 +97,7 @@ __all__ = [
|
|
|
96
97
|
'SearchToolkit',
|
|
97
98
|
'SlackToolkit',
|
|
98
99
|
'WhatsAppToolkit',
|
|
99
|
-
'
|
|
100
|
+
'OpenAIImageToolkit',
|
|
100
101
|
'TwitterToolkit',
|
|
101
102
|
'WeatherToolkit',
|
|
102
103
|
'RetrievalToolkit',
|
|
@@ -145,10 +146,12 @@ __all__ = [
|
|
|
145
146
|
'PlaywrightMCPToolkit',
|
|
146
147
|
'WolframAlphaToolkit',
|
|
147
148
|
'BohriumToolkit',
|
|
149
|
+
'OpenAIImageToolkit',
|
|
148
150
|
'TaskPlanningToolkit',
|
|
149
151
|
'HybridBrowserToolkit',
|
|
150
152
|
'EdgeOnePagesMCPToolkit',
|
|
151
153
|
'GoogleDriveMCPToolkit',
|
|
152
154
|
'Crawl4AIToolkit',
|
|
153
155
|
'MarkItDownToolkit',
|
|
156
|
+
'NoteTakingToolkit',
|
|
154
157
|
]
|
|
@@ -71,11 +71,11 @@ class Crawl4AIToolkit(BaseToolkit):
|
|
|
71
71
|
return f"Error scraping {url}: {e}"
|
|
72
72
|
|
|
73
73
|
async def __aenter__(self):
|
|
74
|
-
"""Async context manager entry."""
|
|
74
|
+
r"""Async context manager entry."""
|
|
75
75
|
return self
|
|
76
76
|
|
|
77
77
|
async def __aexit__(self, exc_type, exc_val, exc_tb):
|
|
78
|
-
"""Async context manager exit - cleanup the client."""
|
|
78
|
+
r"""Async context manager exit - cleanup the client."""
|
|
79
79
|
if self._client is not None:
|
|
80
80
|
await self._client.__aexit__(exc_type, exc_val, exc_tb)
|
|
81
81
|
self._client = None
|