camel-ai 0.2.57__tar.gz → 0.2.58__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.57 → camel_ai-0.2.58}/.gitignore +4 -1
- {camel_ai-0.2.57 → camel_ai-0.2.58}/PKG-INFO +4 -2
- {camel_ai-0.2.57 → camel_ai-0.2.58}/README.md +1 -1
- {camel_ai-0.2.57 → camel_ai-0.2.58}/camel/__init__.py +1 -2
- {camel_ai-0.2.57 → camel_ai-0.2.58}/camel/agents/chat_agent.py +10 -0
- camel_ai-0.2.58/camel/agents/mcp_agent.py +446 -0
- {camel_ai-0.2.57 → camel_ai-0.2.58}/camel/loaders/__init__.py +2 -0
- camel_ai-0.2.58/camel/loaders/markitdown.py +204 -0
- {camel_ai-0.2.57 → camel_ai-0.2.58}/camel/models/openai_compatible_model.py +3 -3
- {camel_ai-0.2.57 → camel_ai-0.2.58}/camel/societies/workforce/workforce.py +4 -4
- {camel_ai-0.2.57 → camel_ai-0.2.58}/camel/toolkits/__init__.py +4 -0
- camel_ai-0.2.58/camel/toolkits/async_browser_toolkit.py +1800 -0
- {camel_ai-0.2.57 → camel_ai-0.2.58}/camel/toolkits/base.py +10 -1
- {camel_ai-0.2.57 → camel_ai-0.2.58}/camel/toolkits/browser_toolkit.py +19 -3
- {camel_ai-0.2.57 → camel_ai-0.2.58}/camel/toolkits/excel_toolkit.py +1 -2
- {camel_ai-0.2.57 → camel_ai-0.2.58}/camel/toolkits/function_tool.py +1 -1
- {camel_ai-0.2.57 → camel_ai-0.2.58}/camel/toolkits/mcp_toolkit.py +129 -3
- {camel_ai-0.2.57 → camel_ai-0.2.58}/camel/toolkits/search_toolkit.py +0 -169
- camel_ai-0.2.58/camel/toolkits/wolfram_alpha_toolkit.py +237 -0
- {camel_ai-0.2.57 → camel_ai-0.2.58}/camel/types/__init__.py +10 -0
- {camel_ai-0.2.57 → camel_ai-0.2.58}/camel/types/enums.py +3 -3
- camel_ai-0.2.58/camel/types/mcp_registries.py +157 -0
- {camel_ai-0.2.57 → camel_ai-0.2.58}/pyproject.toml +4 -1
- camel_ai-0.2.57/camel/agents/mcp_agent.py +0 -233
- {camel_ai-0.2.57 → camel_ai-0.2.58}/LICENSE +0 -0
- {camel_ai-0.2.57 → camel_ai-0.2.58}/camel/agents/__init__.py +0 -0
- {camel_ai-0.2.57 → camel_ai-0.2.58}/camel/agents/_types.py +0 -0
- {camel_ai-0.2.57 → camel_ai-0.2.58}/camel/agents/_utils.py +0 -0
- {camel_ai-0.2.57 → camel_ai-0.2.58}/camel/agents/base.py +0 -0
- {camel_ai-0.2.57 → camel_ai-0.2.58}/camel/agents/critic_agent.py +0 -0
- {camel_ai-0.2.57 → camel_ai-0.2.58}/camel/agents/deductive_reasoner_agent.py +0 -0
- {camel_ai-0.2.57 → camel_ai-0.2.58}/camel/agents/embodied_agent.py +0 -0
- {camel_ai-0.2.57 → camel_ai-0.2.58}/camel/agents/knowledge_graph_agent.py +0 -0
- {camel_ai-0.2.57 → camel_ai-0.2.58}/camel/agents/multi_hop_generator_agent.py +0 -0
- {camel_ai-0.2.57 → camel_ai-0.2.58}/camel/agents/programmed_agent_instruction.py +0 -0
- {camel_ai-0.2.57 → camel_ai-0.2.58}/camel/agents/repo_agent.py +0 -0
- {camel_ai-0.2.57 → camel_ai-0.2.58}/camel/agents/role_assignment_agent.py +0 -0
- {camel_ai-0.2.57 → camel_ai-0.2.58}/camel/agents/search_agent.py +0 -0
- {camel_ai-0.2.57 → camel_ai-0.2.58}/camel/agents/task_agent.py +0 -0
- {camel_ai-0.2.57 → camel_ai-0.2.58}/camel/agents/tool_agents/__init__.py +0 -0
- {camel_ai-0.2.57 → camel_ai-0.2.58}/camel/agents/tool_agents/base.py +0 -0
- {camel_ai-0.2.57 → camel_ai-0.2.58}/camel/agents/tool_agents/hugging_face_tool_agent.py +0 -0
- {camel_ai-0.2.57 → camel_ai-0.2.58}/camel/benchmarks/__init__.py +0 -0
- {camel_ai-0.2.57 → camel_ai-0.2.58}/camel/benchmarks/apibank.py +0 -0
- {camel_ai-0.2.57 → camel_ai-0.2.58}/camel/benchmarks/apibench.py +0 -0
- {camel_ai-0.2.57 → camel_ai-0.2.58}/camel/benchmarks/base.py +0 -0
- {camel_ai-0.2.57 → camel_ai-0.2.58}/camel/benchmarks/gaia.py +0 -0
- {camel_ai-0.2.57 → camel_ai-0.2.58}/camel/benchmarks/nexus.py +0 -0
- {camel_ai-0.2.57 → camel_ai-0.2.58}/camel/benchmarks/ragbench.py +0 -0
- {camel_ai-0.2.57 → camel_ai-0.2.58}/camel/bots/__init__.py +0 -0
- {camel_ai-0.2.57 → camel_ai-0.2.58}/camel/bots/discord/__init__.py +0 -0
- {camel_ai-0.2.57 → camel_ai-0.2.58}/camel/bots/discord/discord_app.py +0 -0
- {camel_ai-0.2.57 → camel_ai-0.2.58}/camel/bots/discord/discord_installation.py +0 -0
- {camel_ai-0.2.57 → camel_ai-0.2.58}/camel/bots/discord/discord_store.py +0 -0
- {camel_ai-0.2.57 → camel_ai-0.2.58}/camel/bots/slack/__init__.py +0 -0
- {camel_ai-0.2.57 → camel_ai-0.2.58}/camel/bots/slack/models.py +0 -0
- {camel_ai-0.2.57 → camel_ai-0.2.58}/camel/bots/slack/slack_app.py +0 -0
- {camel_ai-0.2.57 → camel_ai-0.2.58}/camel/bots/telegram_bot.py +0 -0
- {camel_ai-0.2.57 → camel_ai-0.2.58}/camel/configs/__init__.py +0 -0
- {camel_ai-0.2.57 → camel_ai-0.2.58}/camel/configs/aiml_config.py +0 -0
- {camel_ai-0.2.57 → camel_ai-0.2.58}/camel/configs/anthropic_config.py +0 -0
- {camel_ai-0.2.57 → camel_ai-0.2.58}/camel/configs/base_config.py +0 -0
- {camel_ai-0.2.57 → camel_ai-0.2.58}/camel/configs/bedrock_config.py +0 -0
- {camel_ai-0.2.57 → camel_ai-0.2.58}/camel/configs/cohere_config.py +0 -0
- {camel_ai-0.2.57 → camel_ai-0.2.58}/camel/configs/deepseek_config.py +0 -0
- {camel_ai-0.2.57 → camel_ai-0.2.58}/camel/configs/gemini_config.py +0 -0
- {camel_ai-0.2.57 → camel_ai-0.2.58}/camel/configs/groq_config.py +0 -0
- {camel_ai-0.2.57 → camel_ai-0.2.58}/camel/configs/internlm_config.py +0 -0
- {camel_ai-0.2.57 → camel_ai-0.2.58}/camel/configs/litellm_config.py +0 -0
- {camel_ai-0.2.57 → camel_ai-0.2.58}/camel/configs/lmstudio_config.py +0 -0
- {camel_ai-0.2.57 → camel_ai-0.2.58}/camel/configs/mistral_config.py +0 -0
- {camel_ai-0.2.57 → camel_ai-0.2.58}/camel/configs/modelscope_config.py +0 -0
- {camel_ai-0.2.57 → camel_ai-0.2.58}/camel/configs/moonshot_config.py +0 -0
- {camel_ai-0.2.57 → camel_ai-0.2.58}/camel/configs/netmind_config.py +0 -0
- {camel_ai-0.2.57 → camel_ai-0.2.58}/camel/configs/novita_config.py +0 -0
- {camel_ai-0.2.57 → camel_ai-0.2.58}/camel/configs/nvidia_config.py +0 -0
- {camel_ai-0.2.57 → camel_ai-0.2.58}/camel/configs/ollama_config.py +0 -0
- {camel_ai-0.2.57 → camel_ai-0.2.58}/camel/configs/openai_config.py +0 -0
- {camel_ai-0.2.57 → camel_ai-0.2.58}/camel/configs/openrouter_config.py +0 -0
- {camel_ai-0.2.57 → camel_ai-0.2.58}/camel/configs/ppio_config.py +0 -0
- {camel_ai-0.2.57 → camel_ai-0.2.58}/camel/configs/qwen_config.py +0 -0
- {camel_ai-0.2.57 → camel_ai-0.2.58}/camel/configs/reka_config.py +0 -0
- {camel_ai-0.2.57 → camel_ai-0.2.58}/camel/configs/samba_config.py +0 -0
- {camel_ai-0.2.57 → camel_ai-0.2.58}/camel/configs/sglang_config.py +0 -0
- {camel_ai-0.2.57 → camel_ai-0.2.58}/camel/configs/siliconflow_config.py +0 -0
- {camel_ai-0.2.57 → camel_ai-0.2.58}/camel/configs/togetherai_config.py +0 -0
- {camel_ai-0.2.57 → camel_ai-0.2.58}/camel/configs/vllm_config.py +0 -0
- {camel_ai-0.2.57 → camel_ai-0.2.58}/camel/configs/watsonx_config.py +0 -0
- {camel_ai-0.2.57 → camel_ai-0.2.58}/camel/configs/yi_config.py +0 -0
- {camel_ai-0.2.57 → camel_ai-0.2.58}/camel/configs/zhipuai_config.py +0 -0
- {camel_ai-0.2.57 → camel_ai-0.2.58}/camel/data_collector/__init__.py +0 -0
- {camel_ai-0.2.57 → camel_ai-0.2.58}/camel/data_collector/alpaca_collector.py +0 -0
- {camel_ai-0.2.57 → camel_ai-0.2.58}/camel/data_collector/base.py +0 -0
- {camel_ai-0.2.57 → camel_ai-0.2.58}/camel/data_collector/sharegpt_collector.py +0 -0
- {camel_ai-0.2.57 → camel_ai-0.2.58}/camel/datagen/__init__.py +0 -0
- {camel_ai-0.2.57 → camel_ai-0.2.58}/camel/datagen/cot_datagen.py +0 -0
- {camel_ai-0.2.57 → camel_ai-0.2.58}/camel/datagen/evol_instruct/__init__.py +0 -0
- {camel_ai-0.2.57 → camel_ai-0.2.58}/camel/datagen/evol_instruct/evol_instruct.py +0 -0
- {camel_ai-0.2.57 → camel_ai-0.2.58}/camel/datagen/evol_instruct/scorer.py +0 -0
- {camel_ai-0.2.57 → camel_ai-0.2.58}/camel/datagen/evol_instruct/templates.py +0 -0
- {camel_ai-0.2.57 → camel_ai-0.2.58}/camel/datagen/self_improving_cot.py +0 -0
- {camel_ai-0.2.57 → camel_ai-0.2.58}/camel/datagen/self_instruct/__init__.py +0 -0
- {camel_ai-0.2.57 → camel_ai-0.2.58}/camel/datagen/self_instruct/filter/__init__.py +0 -0
- {camel_ai-0.2.57 → camel_ai-0.2.58}/camel/datagen/self_instruct/filter/filter_function.py +0 -0
- {camel_ai-0.2.57 → camel_ai-0.2.58}/camel/datagen/self_instruct/filter/filter_registry.py +0 -0
- {camel_ai-0.2.57 → camel_ai-0.2.58}/camel/datagen/self_instruct/filter/instruction_filter.py +0 -0
- {camel_ai-0.2.57 → camel_ai-0.2.58}/camel/datagen/self_instruct/self_instruct.py +0 -0
- {camel_ai-0.2.57 → camel_ai-0.2.58}/camel/datagen/self_instruct/templates.py +0 -0
- {camel_ai-0.2.57 → camel_ai-0.2.58}/camel/datagen/source2synth/__init__.py +0 -0
- {camel_ai-0.2.57 → camel_ai-0.2.58}/camel/datagen/source2synth/data_processor.py +0 -0
- {camel_ai-0.2.57 → camel_ai-0.2.58}/camel/datagen/source2synth/models.py +0 -0
- {camel_ai-0.2.57 → camel_ai-0.2.58}/camel/datagen/source2synth/user_data_processor_config.py +0 -0
- {camel_ai-0.2.57 → camel_ai-0.2.58}/camel/datahubs/__init__.py +0 -0
- {camel_ai-0.2.57 → camel_ai-0.2.58}/camel/datahubs/base.py +0 -0
- {camel_ai-0.2.57 → camel_ai-0.2.58}/camel/datahubs/huggingface.py +0 -0
- {camel_ai-0.2.57 → camel_ai-0.2.58}/camel/datahubs/models.py +0 -0
- {camel_ai-0.2.57 → camel_ai-0.2.58}/camel/datasets/__init__.py +0 -0
- {camel_ai-0.2.57 → camel_ai-0.2.58}/camel/datasets/base_generator.py +0 -0
- {camel_ai-0.2.57 → camel_ai-0.2.58}/camel/datasets/few_shot_generator.py +0 -0
- {camel_ai-0.2.57 → camel_ai-0.2.58}/camel/datasets/models.py +0 -0
- {camel_ai-0.2.57 → camel_ai-0.2.58}/camel/datasets/self_instruct_generator.py +0 -0
- {camel_ai-0.2.57 → camel_ai-0.2.58}/camel/datasets/static_dataset.py +0 -0
- {camel_ai-0.2.57 → camel_ai-0.2.58}/camel/embeddings/__init__.py +0 -0
- {camel_ai-0.2.57 → camel_ai-0.2.58}/camel/embeddings/azure_embedding.py +0 -0
- {camel_ai-0.2.57 → camel_ai-0.2.58}/camel/embeddings/base.py +0 -0
- {camel_ai-0.2.57 → camel_ai-0.2.58}/camel/embeddings/gemini_embedding.py +0 -0
- {camel_ai-0.2.57 → camel_ai-0.2.58}/camel/embeddings/jina_embedding.py +0 -0
- {camel_ai-0.2.57 → camel_ai-0.2.58}/camel/embeddings/mistral_embedding.py +0 -0
- {camel_ai-0.2.57 → camel_ai-0.2.58}/camel/embeddings/openai_compatible_embedding.py +0 -0
- {camel_ai-0.2.57 → camel_ai-0.2.58}/camel/embeddings/openai_embedding.py +0 -0
- {camel_ai-0.2.57 → camel_ai-0.2.58}/camel/embeddings/sentence_transformers_embeddings.py +0 -0
- {camel_ai-0.2.57 → camel_ai-0.2.58}/camel/embeddings/together_embedding.py +0 -0
- {camel_ai-0.2.57 → camel_ai-0.2.58}/camel/embeddings/vlm_embedding.py +0 -0
- {camel_ai-0.2.57 → camel_ai-0.2.58}/camel/environments/__init__.py +0 -0
- {camel_ai-0.2.57 → camel_ai-0.2.58}/camel/environments/models.py +0 -0
- {camel_ai-0.2.57 → camel_ai-0.2.58}/camel/environments/multi_step.py +0 -0
- {camel_ai-0.2.57 → camel_ai-0.2.58}/camel/environments/single_step.py +0 -0
- {camel_ai-0.2.57 → camel_ai-0.2.58}/camel/environments/tic_tac_toe.py +0 -0
- {camel_ai-0.2.57 → camel_ai-0.2.58}/camel/extractors/__init__.py +0 -0
- {camel_ai-0.2.57 → camel_ai-0.2.58}/camel/extractors/base.py +0 -0
- {camel_ai-0.2.57 → camel_ai-0.2.58}/camel/extractors/python_strategies.py +0 -0
- {camel_ai-0.2.57 → camel_ai-0.2.58}/camel/generators.py +0 -0
- {camel_ai-0.2.57 → camel_ai-0.2.58}/camel/human.py +0 -0
- {camel_ai-0.2.57 → camel_ai-0.2.58}/camel/interpreters/__init__.py +0 -0
- {camel_ai-0.2.57 → camel_ai-0.2.58}/camel/interpreters/base.py +0 -0
- {camel_ai-0.2.57 → camel_ai-0.2.58}/camel/interpreters/docker/Dockerfile +0 -0
- {camel_ai-0.2.57 → camel_ai-0.2.58}/camel/interpreters/docker_interpreter.py +0 -0
- {camel_ai-0.2.57 → camel_ai-0.2.58}/camel/interpreters/e2b_interpreter.py +0 -0
- {camel_ai-0.2.57 → camel_ai-0.2.58}/camel/interpreters/internal_python_interpreter.py +0 -0
- {camel_ai-0.2.57 → camel_ai-0.2.58}/camel/interpreters/interpreter_error.py +0 -0
- {camel_ai-0.2.57 → camel_ai-0.2.58}/camel/interpreters/ipython_interpreter.py +0 -0
- {camel_ai-0.2.57 → camel_ai-0.2.58}/camel/interpreters/subprocess_interpreter.py +0 -0
- {camel_ai-0.2.57 → camel_ai-0.2.58}/camel/loaders/apify_reader.py +0 -0
- {camel_ai-0.2.57 → camel_ai-0.2.58}/camel/loaders/base_io.py +0 -0
- {camel_ai-0.2.57 → camel_ai-0.2.58}/camel/loaders/chunkr_reader.py +0 -0
- {camel_ai-0.2.57 → camel_ai-0.2.58}/camel/loaders/crawl4ai_reader.py +0 -0
- {camel_ai-0.2.57 → camel_ai-0.2.58}/camel/loaders/firecrawl_reader.py +0 -0
- {camel_ai-0.2.57 → camel_ai-0.2.58}/camel/loaders/jina_url_reader.py +0 -0
- {camel_ai-0.2.57 → camel_ai-0.2.58}/camel/loaders/mineru_extractor.py +0 -0
- {camel_ai-0.2.57 → camel_ai-0.2.58}/camel/loaders/pandas_reader.py +0 -0
- {camel_ai-0.2.57 → camel_ai-0.2.58}/camel/loaders/scrapegraph_reader.py +0 -0
- {camel_ai-0.2.57 → camel_ai-0.2.58}/camel/loaders/unstructured_io.py +0 -0
- {camel_ai-0.2.57 → camel_ai-0.2.58}/camel/logger.py +0 -0
- {camel_ai-0.2.57 → camel_ai-0.2.58}/camel/memories/__init__.py +0 -0
- {camel_ai-0.2.57 → camel_ai-0.2.58}/camel/memories/agent_memories.py +0 -0
- {camel_ai-0.2.57 → camel_ai-0.2.58}/camel/memories/base.py +0 -0
- {camel_ai-0.2.57 → camel_ai-0.2.58}/camel/memories/blocks/__init__.py +0 -0
- {camel_ai-0.2.57 → camel_ai-0.2.58}/camel/memories/blocks/chat_history_block.py +0 -0
- {camel_ai-0.2.57 → camel_ai-0.2.58}/camel/memories/blocks/vectordb_block.py +0 -0
- {camel_ai-0.2.57 → camel_ai-0.2.58}/camel/memories/context_creators/__init__.py +0 -0
- {camel_ai-0.2.57 → camel_ai-0.2.58}/camel/memories/context_creators/score_based.py +0 -0
- {camel_ai-0.2.57 → camel_ai-0.2.58}/camel/memories/records.py +0 -0
- {camel_ai-0.2.57 → camel_ai-0.2.58}/camel/messages/__init__.py +0 -0
- {camel_ai-0.2.57 → camel_ai-0.2.58}/camel/messages/base.py +0 -0
- {camel_ai-0.2.57 → camel_ai-0.2.58}/camel/messages/conversion/__init__.py +0 -0
- {camel_ai-0.2.57 → camel_ai-0.2.58}/camel/messages/conversion/alpaca.py +0 -0
- {camel_ai-0.2.57 → camel_ai-0.2.58}/camel/messages/conversion/conversation_models.py +0 -0
- {camel_ai-0.2.57 → camel_ai-0.2.58}/camel/messages/conversion/sharegpt/__init__.py +0 -0
- {camel_ai-0.2.57 → camel_ai-0.2.58}/camel/messages/conversion/sharegpt/function_call_formatter.py +0 -0
- {camel_ai-0.2.57 → camel_ai-0.2.58}/camel/messages/conversion/sharegpt/hermes/__init__.py +0 -0
- {camel_ai-0.2.57 → camel_ai-0.2.58}/camel/messages/conversion/sharegpt/hermes/hermes_function_formatter.py +0 -0
- {camel_ai-0.2.57 → camel_ai-0.2.58}/camel/messages/func_message.py +0 -0
- {camel_ai-0.2.57 → camel_ai-0.2.58}/camel/models/__init__.py +0 -0
- {camel_ai-0.2.57 → camel_ai-0.2.58}/camel/models/_utils.py +0 -0
- {camel_ai-0.2.57 → camel_ai-0.2.58}/camel/models/aiml_model.py +0 -0
- {camel_ai-0.2.57 → camel_ai-0.2.58}/camel/models/anthropic_model.py +0 -0
- {camel_ai-0.2.57 → camel_ai-0.2.58}/camel/models/aws_bedrock_model.py +0 -0
- {camel_ai-0.2.57 → camel_ai-0.2.58}/camel/models/azure_openai_model.py +0 -0
- {camel_ai-0.2.57 → camel_ai-0.2.58}/camel/models/base_audio_model.py +0 -0
- {camel_ai-0.2.57 → camel_ai-0.2.58}/camel/models/base_model.py +0 -0
- {camel_ai-0.2.57 → camel_ai-0.2.58}/camel/models/cohere_model.py +0 -0
- {camel_ai-0.2.57 → camel_ai-0.2.58}/camel/models/deepseek_model.py +0 -0
- {camel_ai-0.2.57 → camel_ai-0.2.58}/camel/models/fish_audio_model.py +0 -0
- {camel_ai-0.2.57 → camel_ai-0.2.58}/camel/models/gemini_model.py +0 -0
- {camel_ai-0.2.57 → camel_ai-0.2.58}/camel/models/groq_model.py +0 -0
- {camel_ai-0.2.57 → camel_ai-0.2.58}/camel/models/internlm_model.py +0 -0
- {camel_ai-0.2.57 → camel_ai-0.2.58}/camel/models/litellm_model.py +0 -0
- {camel_ai-0.2.57 → camel_ai-0.2.58}/camel/models/lmstudio_model.py +0 -0
- {camel_ai-0.2.57 → camel_ai-0.2.58}/camel/models/mistral_model.py +0 -0
- {camel_ai-0.2.57 → camel_ai-0.2.58}/camel/models/model_factory.py +0 -0
- {camel_ai-0.2.57 → camel_ai-0.2.58}/camel/models/model_manager.py +0 -0
- {camel_ai-0.2.57 → camel_ai-0.2.58}/camel/models/modelscope_model.py +0 -0
- {camel_ai-0.2.57 → camel_ai-0.2.58}/camel/models/moonshot_model.py +0 -0
- {camel_ai-0.2.57 → camel_ai-0.2.58}/camel/models/nemotron_model.py +0 -0
- {camel_ai-0.2.57 → camel_ai-0.2.58}/camel/models/netmind_model.py +0 -0
- {camel_ai-0.2.57 → camel_ai-0.2.58}/camel/models/novita_model.py +0 -0
- {camel_ai-0.2.57 → camel_ai-0.2.58}/camel/models/nvidia_model.py +0 -0
- {camel_ai-0.2.57 → camel_ai-0.2.58}/camel/models/ollama_model.py +0 -0
- {camel_ai-0.2.57 → camel_ai-0.2.58}/camel/models/openai_audio_models.py +0 -0
- {camel_ai-0.2.57 → camel_ai-0.2.58}/camel/models/openai_model.py +0 -0
- {camel_ai-0.2.57 → camel_ai-0.2.58}/camel/models/openrouter_model.py +0 -0
- {camel_ai-0.2.57 → camel_ai-0.2.58}/camel/models/ppio_model.py +0 -0
- {camel_ai-0.2.57 → camel_ai-0.2.58}/camel/models/qwen_model.py +0 -0
- {camel_ai-0.2.57 → camel_ai-0.2.58}/camel/models/reka_model.py +0 -0
- {camel_ai-0.2.57 → camel_ai-0.2.58}/camel/models/reward/__init__.py +0 -0
- {camel_ai-0.2.57 → camel_ai-0.2.58}/camel/models/reward/base_reward_model.py +0 -0
- {camel_ai-0.2.57 → camel_ai-0.2.58}/camel/models/reward/evaluator.py +0 -0
- {camel_ai-0.2.57 → camel_ai-0.2.58}/camel/models/reward/nemotron_model.py +0 -0
- {camel_ai-0.2.57 → camel_ai-0.2.58}/camel/models/reward/skywork_model.py +0 -0
- {camel_ai-0.2.57 → camel_ai-0.2.58}/camel/models/samba_model.py +0 -0
- {camel_ai-0.2.57 → camel_ai-0.2.58}/camel/models/sglang_model.py +0 -0
- {camel_ai-0.2.57 → camel_ai-0.2.58}/camel/models/siliconflow_model.py +0 -0
- {camel_ai-0.2.57 → camel_ai-0.2.58}/camel/models/stub_model.py +0 -0
- {camel_ai-0.2.57 → camel_ai-0.2.58}/camel/models/togetherai_model.py +0 -0
- {camel_ai-0.2.57 → camel_ai-0.2.58}/camel/models/vllm_model.py +0 -0
- {camel_ai-0.2.57 → camel_ai-0.2.58}/camel/models/volcano_model.py +0 -0
- {camel_ai-0.2.57 → camel_ai-0.2.58}/camel/models/watsonx_model.py +0 -0
- {camel_ai-0.2.57 → camel_ai-0.2.58}/camel/models/yi_model.py +0 -0
- {camel_ai-0.2.57 → camel_ai-0.2.58}/camel/models/zhipuai_model.py +0 -0
- {camel_ai-0.2.57 → camel_ai-0.2.58}/camel/personas/__init__.py +0 -0
- {camel_ai-0.2.57 → camel_ai-0.2.58}/camel/personas/persona.py +0 -0
- {camel_ai-0.2.57 → camel_ai-0.2.58}/camel/personas/persona_hub.py +0 -0
- {camel_ai-0.2.57 → camel_ai-0.2.58}/camel/prompts/__init__.py +0 -0
- {camel_ai-0.2.57 → camel_ai-0.2.58}/camel/prompts/ai_society.py +0 -0
- {camel_ai-0.2.57 → camel_ai-0.2.58}/camel/prompts/base.py +0 -0
- {camel_ai-0.2.57 → camel_ai-0.2.58}/camel/prompts/code.py +0 -0
- {camel_ai-0.2.57 → camel_ai-0.2.58}/camel/prompts/evaluation.py +0 -0
- {camel_ai-0.2.57 → camel_ai-0.2.58}/camel/prompts/generate_text_embedding_data.py +0 -0
- {camel_ai-0.2.57 → camel_ai-0.2.58}/camel/prompts/image_craft.py +0 -0
- {camel_ai-0.2.57 → camel_ai-0.2.58}/camel/prompts/misalignment.py +0 -0
- {camel_ai-0.2.57 → camel_ai-0.2.58}/camel/prompts/multi_condition_image_craft.py +0 -0
- {camel_ai-0.2.57 → camel_ai-0.2.58}/camel/prompts/object_recognition.py +0 -0
- {camel_ai-0.2.57 → camel_ai-0.2.58}/camel/prompts/persona_hub.py +0 -0
- {camel_ai-0.2.57 → camel_ai-0.2.58}/camel/prompts/prompt_templates.py +0 -0
- {camel_ai-0.2.57 → camel_ai-0.2.58}/camel/prompts/role_description_prompt_template.py +0 -0
- {camel_ai-0.2.57 → camel_ai-0.2.58}/camel/prompts/solution_extraction.py +0 -0
- {camel_ai-0.2.57 → camel_ai-0.2.58}/camel/prompts/task_prompt_template.py +0 -0
- {camel_ai-0.2.57 → camel_ai-0.2.58}/camel/prompts/translation.py +0 -0
- {camel_ai-0.2.57 → camel_ai-0.2.58}/camel/prompts/video_description_prompt.py +0 -0
- {camel_ai-0.2.57 → camel_ai-0.2.58}/camel/py.typed +0 -0
- {camel_ai-0.2.57 → camel_ai-0.2.58}/camel/responses/__init__.py +0 -0
- {camel_ai-0.2.57 → camel_ai-0.2.58}/camel/responses/agent_responses.py +0 -0
- {camel_ai-0.2.57 → camel_ai-0.2.58}/camel/retrievers/__init__.py +0 -0
- {camel_ai-0.2.57 → camel_ai-0.2.58}/camel/retrievers/auto_retriever.py +0 -0
- {camel_ai-0.2.57 → camel_ai-0.2.58}/camel/retrievers/base.py +0 -0
- {camel_ai-0.2.57 → camel_ai-0.2.58}/camel/retrievers/bm25_retriever.py +0 -0
- {camel_ai-0.2.57 → camel_ai-0.2.58}/camel/retrievers/cohere_rerank_retriever.py +0 -0
- {camel_ai-0.2.57 → camel_ai-0.2.58}/camel/retrievers/hybrid_retrival.py +0 -0
- {camel_ai-0.2.57 → camel_ai-0.2.58}/camel/retrievers/vector_retriever.py +0 -0
- {camel_ai-0.2.57 → camel_ai-0.2.58}/camel/runtime/__init__.py +0 -0
- {camel_ai-0.2.57 → camel_ai-0.2.58}/camel/runtime/api.py +0 -0
- {camel_ai-0.2.57 → camel_ai-0.2.58}/camel/runtime/base.py +0 -0
- {camel_ai-0.2.57 → camel_ai-0.2.58}/camel/runtime/configs.py +0 -0
- {camel_ai-0.2.57 → camel_ai-0.2.58}/camel/runtime/daytona_runtime.py +0 -0
- {camel_ai-0.2.57 → camel_ai-0.2.58}/camel/runtime/docker_runtime.py +0 -0
- {camel_ai-0.2.57 → camel_ai-0.2.58}/camel/runtime/llm_guard_runtime.py +0 -0
- {camel_ai-0.2.57 → camel_ai-0.2.58}/camel/runtime/remote_http_runtime.py +0 -0
- {camel_ai-0.2.57 → camel_ai-0.2.58}/camel/runtime/ubuntu_docker_runtime.py +0 -0
- {camel_ai-0.2.57 → camel_ai-0.2.58}/camel/runtime/utils/__init__.py +0 -0
- {camel_ai-0.2.57 → camel_ai-0.2.58}/camel/runtime/utils/function_risk_toolkit.py +0 -0
- {camel_ai-0.2.57 → camel_ai-0.2.58}/camel/runtime/utils/ignore_risk_toolkit.py +0 -0
- {camel_ai-0.2.57 → camel_ai-0.2.58}/camel/schemas/__init__.py +0 -0
- {camel_ai-0.2.57 → camel_ai-0.2.58}/camel/schemas/base.py +0 -0
- {camel_ai-0.2.57 → camel_ai-0.2.58}/camel/schemas/openai_converter.py +0 -0
- {camel_ai-0.2.57 → camel_ai-0.2.58}/camel/schemas/outlines_converter.py +0 -0
- {camel_ai-0.2.57 → camel_ai-0.2.58}/camel/societies/__init__.py +0 -0
- {camel_ai-0.2.57 → camel_ai-0.2.58}/camel/societies/babyagi_playing.py +0 -0
- {camel_ai-0.2.57 → camel_ai-0.2.58}/camel/societies/role_playing.py +0 -0
- {camel_ai-0.2.57 → camel_ai-0.2.58}/camel/societies/workforce/__init__.py +0 -0
- {camel_ai-0.2.57 → camel_ai-0.2.58}/camel/societies/workforce/base.py +0 -0
- {camel_ai-0.2.57 → camel_ai-0.2.58}/camel/societies/workforce/prompts.py +0 -0
- {camel_ai-0.2.57 → camel_ai-0.2.58}/camel/societies/workforce/role_playing_worker.py +0 -0
- {camel_ai-0.2.57 → camel_ai-0.2.58}/camel/societies/workforce/single_agent_worker.py +0 -0
- {camel_ai-0.2.57 → camel_ai-0.2.58}/camel/societies/workforce/task_channel.py +0 -0
- {camel_ai-0.2.57 → camel_ai-0.2.58}/camel/societies/workforce/utils.py +0 -0
- {camel_ai-0.2.57 → camel_ai-0.2.58}/camel/societies/workforce/worker.py +0 -0
- {camel_ai-0.2.57 → camel_ai-0.2.58}/camel/storages/__init__.py +0 -0
- {camel_ai-0.2.57 → camel_ai-0.2.58}/camel/storages/graph_storages/__init__.py +0 -0
- {camel_ai-0.2.57 → camel_ai-0.2.58}/camel/storages/graph_storages/base.py +0 -0
- {camel_ai-0.2.57 → camel_ai-0.2.58}/camel/storages/graph_storages/graph_element.py +0 -0
- {camel_ai-0.2.57 → camel_ai-0.2.58}/camel/storages/graph_storages/nebula_graph.py +0 -0
- {camel_ai-0.2.57 → camel_ai-0.2.58}/camel/storages/graph_storages/neo4j_graph.py +0 -0
- {camel_ai-0.2.57 → camel_ai-0.2.58}/camel/storages/key_value_storages/__init__.py +0 -0
- {camel_ai-0.2.57 → camel_ai-0.2.58}/camel/storages/key_value_storages/base.py +0 -0
- {camel_ai-0.2.57 → camel_ai-0.2.58}/camel/storages/key_value_storages/in_memory.py +0 -0
- {camel_ai-0.2.57 → camel_ai-0.2.58}/camel/storages/key_value_storages/json.py +0 -0
- {camel_ai-0.2.57 → camel_ai-0.2.58}/camel/storages/key_value_storages/mem0_cloud.py +0 -0
- {camel_ai-0.2.57 → camel_ai-0.2.58}/camel/storages/key_value_storages/redis.py +0 -0
- {camel_ai-0.2.57 → camel_ai-0.2.58}/camel/storages/object_storages/__init__.py +0 -0
- {camel_ai-0.2.57 → camel_ai-0.2.58}/camel/storages/object_storages/amazon_s3.py +0 -0
- {camel_ai-0.2.57 → camel_ai-0.2.58}/camel/storages/object_storages/azure_blob.py +0 -0
- {camel_ai-0.2.57 → camel_ai-0.2.58}/camel/storages/object_storages/base.py +0 -0
- {camel_ai-0.2.57 → camel_ai-0.2.58}/camel/storages/object_storages/google_cloud.py +0 -0
- {camel_ai-0.2.57 → camel_ai-0.2.58}/camel/storages/vectordb_storages/__init__.py +0 -0
- {camel_ai-0.2.57 → camel_ai-0.2.58}/camel/storages/vectordb_storages/base.py +0 -0
- {camel_ai-0.2.57 → camel_ai-0.2.58}/camel/storages/vectordb_storages/milvus.py +0 -0
- {camel_ai-0.2.57 → camel_ai-0.2.58}/camel/storages/vectordb_storages/oceanbase.py +0 -0
- {camel_ai-0.2.57 → camel_ai-0.2.58}/camel/storages/vectordb_storages/qdrant.py +0 -0
- {camel_ai-0.2.57 → camel_ai-0.2.58}/camel/storages/vectordb_storages/tidb.py +0 -0
- {camel_ai-0.2.57 → camel_ai-0.2.58}/camel/tasks/__init__.py +0 -0
- {camel_ai-0.2.57 → camel_ai-0.2.58}/camel/tasks/task.py +0 -0
- {camel_ai-0.2.57 → camel_ai-0.2.58}/camel/tasks/task_prompt.py +0 -0
- {camel_ai-0.2.57 → camel_ai-0.2.58}/camel/terminators/__init__.py +0 -0
- {camel_ai-0.2.57 → camel_ai-0.2.58}/camel/terminators/base.py +0 -0
- {camel_ai-0.2.57 → camel_ai-0.2.58}/camel/terminators/response_terminator.py +0 -0
- {camel_ai-0.2.57 → camel_ai-0.2.58}/camel/terminators/token_limit_terminator.py +0 -0
- {camel_ai-0.2.57 → camel_ai-0.2.58}/camel/toolkits/aci_toolkit.py +0 -0
- {camel_ai-0.2.57 → camel_ai-0.2.58}/camel/toolkits/arxiv_toolkit.py +0 -0
- {camel_ai-0.2.57 → camel_ai-0.2.58}/camel/toolkits/ask_news_toolkit.py +0 -0
- {camel_ai-0.2.57 → camel_ai-0.2.58}/camel/toolkits/audio_analysis_toolkit.py +0 -0
- {camel_ai-0.2.57 → camel_ai-0.2.58}/camel/toolkits/code_execution.py +0 -0
- {camel_ai-0.2.57 → camel_ai-0.2.58}/camel/toolkits/dalle_toolkit.py +0 -0
- {camel_ai-0.2.57 → camel_ai-0.2.58}/camel/toolkits/dappier_toolkit.py +0 -0
- {camel_ai-0.2.57 → camel_ai-0.2.58}/camel/toolkits/data_commons_toolkit.py +0 -0
- {camel_ai-0.2.57 → camel_ai-0.2.58}/camel/toolkits/file_write_toolkit.py +0 -0
- {camel_ai-0.2.57 → camel_ai-0.2.58}/camel/toolkits/github_toolkit.py +0 -0
- {camel_ai-0.2.57 → camel_ai-0.2.58}/camel/toolkits/google_calendar_toolkit.py +0 -0
- {camel_ai-0.2.57 → camel_ai-0.2.58}/camel/toolkits/google_maps_toolkit.py +0 -0
- {camel_ai-0.2.57 → camel_ai-0.2.58}/camel/toolkits/google_scholar_toolkit.py +0 -0
- {camel_ai-0.2.57 → camel_ai-0.2.58}/camel/toolkits/human_toolkit.py +0 -0
- {camel_ai-0.2.57 → camel_ai-0.2.58}/camel/toolkits/image_analysis_toolkit.py +0 -0
- {camel_ai-0.2.57 → camel_ai-0.2.58}/camel/toolkits/jina_reranker_toolkit.py +0 -0
- {camel_ai-0.2.57 → camel_ai-0.2.58}/camel/toolkits/klavis_toolkit.py +0 -0
- {camel_ai-0.2.57 → camel_ai-0.2.58}/camel/toolkits/linkedin_toolkit.py +0 -0
- {camel_ai-0.2.57 → camel_ai-0.2.58}/camel/toolkits/math_toolkit.py +0 -0
- {camel_ai-0.2.57 → camel_ai-0.2.58}/camel/toolkits/memory_toolkit.py +0 -0
- {camel_ai-0.2.57 → camel_ai-0.2.58}/camel/toolkits/meshy_toolkit.py +0 -0
- {camel_ai-0.2.57 → camel_ai-0.2.58}/camel/toolkits/mineru_toolkit.py +0 -0
- {camel_ai-0.2.57 → camel_ai-0.2.58}/camel/toolkits/networkx_toolkit.py +0 -0
- {camel_ai-0.2.57 → camel_ai-0.2.58}/camel/toolkits/notion_toolkit.py +0 -0
- {camel_ai-0.2.57 → camel_ai-0.2.58}/camel/toolkits/open_api_specs/biztoc/__init__.py +0 -0
- {camel_ai-0.2.57 → camel_ai-0.2.58}/camel/toolkits/open_api_specs/biztoc/ai-plugin.json +0 -0
- {camel_ai-0.2.57 → camel_ai-0.2.58}/camel/toolkits/open_api_specs/biztoc/openapi.yaml +0 -0
- {camel_ai-0.2.57 → camel_ai-0.2.58}/camel/toolkits/open_api_specs/coursera/__init__.py +0 -0
- {camel_ai-0.2.57 → camel_ai-0.2.58}/camel/toolkits/open_api_specs/coursera/openapi.yaml +0 -0
- {camel_ai-0.2.57 → camel_ai-0.2.58}/camel/toolkits/open_api_specs/create_qr_code/__init__.py +0 -0
- {camel_ai-0.2.57 → camel_ai-0.2.58}/camel/toolkits/open_api_specs/create_qr_code/openapi.yaml +0 -0
- {camel_ai-0.2.57 → camel_ai-0.2.58}/camel/toolkits/open_api_specs/klarna/__init__.py +0 -0
- {camel_ai-0.2.57 → camel_ai-0.2.58}/camel/toolkits/open_api_specs/klarna/openapi.yaml +0 -0
- {camel_ai-0.2.57 → camel_ai-0.2.58}/camel/toolkits/open_api_specs/nasa_apod/__init__.py +0 -0
- {camel_ai-0.2.57 → camel_ai-0.2.58}/camel/toolkits/open_api_specs/nasa_apod/openapi.yaml +0 -0
- {camel_ai-0.2.57 → camel_ai-0.2.58}/camel/toolkits/open_api_specs/outschool/__init__.py +0 -0
- {camel_ai-0.2.57 → camel_ai-0.2.58}/camel/toolkits/open_api_specs/outschool/ai-plugin.json +0 -0
- {camel_ai-0.2.57 → camel_ai-0.2.58}/camel/toolkits/open_api_specs/outschool/openapi.yaml +0 -0
- {camel_ai-0.2.57 → camel_ai-0.2.58}/camel/toolkits/open_api_specs/outschool/paths/__init__.py +0 -0
- {camel_ai-0.2.57 → camel_ai-0.2.58}/camel/toolkits/open_api_specs/outschool/paths/get_classes.py +0 -0
- {camel_ai-0.2.57 → camel_ai-0.2.58}/camel/toolkits/open_api_specs/outschool/paths/search_teachers.py +0 -0
- {camel_ai-0.2.57 → camel_ai-0.2.58}/camel/toolkits/open_api_specs/security_config.py +0 -0
- {camel_ai-0.2.57 → camel_ai-0.2.58}/camel/toolkits/open_api_specs/speak/__init__.py +0 -0
- {camel_ai-0.2.57 → camel_ai-0.2.58}/camel/toolkits/open_api_specs/speak/openapi.yaml +0 -0
- {camel_ai-0.2.57 → camel_ai-0.2.58}/camel/toolkits/open_api_specs/web_scraper/__init__.py +0 -0
- {camel_ai-0.2.57 → camel_ai-0.2.58}/camel/toolkits/open_api_specs/web_scraper/ai-plugin.json +0 -0
- {camel_ai-0.2.57 → camel_ai-0.2.58}/camel/toolkits/open_api_specs/web_scraper/openapi.yaml +0 -0
- {camel_ai-0.2.57 → camel_ai-0.2.58}/camel/toolkits/open_api_specs/web_scraper/paths/__init__.py +0 -0
- {camel_ai-0.2.57 → camel_ai-0.2.58}/camel/toolkits/open_api_specs/web_scraper/paths/scraper.py +0 -0
- {camel_ai-0.2.57 → camel_ai-0.2.58}/camel/toolkits/open_api_toolkit.py +0 -0
- {camel_ai-0.2.57 → camel_ai-0.2.58}/camel/toolkits/openai_agent_toolkit.py +0 -0
- {camel_ai-0.2.57 → camel_ai-0.2.58}/camel/toolkits/openbb_toolkit.py +0 -0
- {camel_ai-0.2.57 → camel_ai-0.2.58}/camel/toolkits/page_script.js +0 -0
- {camel_ai-0.2.57 → camel_ai-0.2.58}/camel/toolkits/playwright_mcp_toolkit.py +0 -0
- {camel_ai-0.2.57 → camel_ai-0.2.58}/camel/toolkits/pubmed_toolkit.py +0 -0
- {camel_ai-0.2.57 → camel_ai-0.2.58}/camel/toolkits/pulse_mcp_search_toolkit.py +0 -0
- {camel_ai-0.2.57 → camel_ai-0.2.58}/camel/toolkits/pyautogui_toolkit.py +0 -0
- {camel_ai-0.2.57 → camel_ai-0.2.58}/camel/toolkits/reddit_toolkit.py +0 -0
- {camel_ai-0.2.57 → camel_ai-0.2.58}/camel/toolkits/retrieval_toolkit.py +0 -0
- {camel_ai-0.2.57 → camel_ai-0.2.58}/camel/toolkits/searxng_toolkit.py +0 -0
- {camel_ai-0.2.57 → camel_ai-0.2.58}/camel/toolkits/semantic_scholar_toolkit.py +0 -0
- {camel_ai-0.2.57 → camel_ai-0.2.58}/camel/toolkits/slack_toolkit.py +0 -0
- {camel_ai-0.2.57 → camel_ai-0.2.58}/camel/toolkits/stripe_toolkit.py +0 -0
- {camel_ai-0.2.57 → camel_ai-0.2.58}/camel/toolkits/sympy_toolkit.py +0 -0
- {camel_ai-0.2.57 → camel_ai-0.2.58}/camel/toolkits/terminal_toolkit.py +0 -0
- {camel_ai-0.2.57 → camel_ai-0.2.58}/camel/toolkits/thinking_toolkit.py +0 -0
- {camel_ai-0.2.57 → camel_ai-0.2.58}/camel/toolkits/twitter_toolkit.py +0 -0
- {camel_ai-0.2.57 → camel_ai-0.2.58}/camel/toolkits/video_analysis_toolkit.py +0 -0
- {camel_ai-0.2.57 → camel_ai-0.2.58}/camel/toolkits/video_download_toolkit.py +0 -0
- {camel_ai-0.2.57 → camel_ai-0.2.58}/camel/toolkits/weather_toolkit.py +0 -0
- {camel_ai-0.2.57 → camel_ai-0.2.58}/camel/toolkits/whatsapp_toolkit.py +0 -0
- {camel_ai-0.2.57 → camel_ai-0.2.58}/camel/toolkits/zapier_toolkit.py +0 -0
- {camel_ai-0.2.57 → camel_ai-0.2.58}/camel/types/agents/__init__.py +0 -0
- {camel_ai-0.2.57 → camel_ai-0.2.58}/camel/types/agents/tool_calling_record.py +0 -0
- {camel_ai-0.2.57 → camel_ai-0.2.58}/camel/types/openai_types.py +0 -0
- {camel_ai-0.2.57 → camel_ai-0.2.58}/camel/types/unified_model_type.py +0 -0
- {camel_ai-0.2.57 → camel_ai-0.2.58}/camel/utils/__init__.py +0 -0
- {camel_ai-0.2.57 → camel_ai-0.2.58}/camel/utils/async_func.py +0 -0
- {camel_ai-0.2.57 → camel_ai-0.2.58}/camel/utils/chunker/__init__.py +0 -0
- {camel_ai-0.2.57 → camel_ai-0.2.58}/camel/utils/chunker/base.py +0 -0
- {camel_ai-0.2.57 → camel_ai-0.2.58}/camel/utils/chunker/code_chunker.py +0 -0
- {camel_ai-0.2.57 → camel_ai-0.2.58}/camel/utils/chunker/uio_chunker.py +0 -0
- {camel_ai-0.2.57 → camel_ai-0.2.58}/camel/utils/commons.py +0 -0
- {camel_ai-0.2.57 → camel_ai-0.2.58}/camel/utils/constants.py +0 -0
- {camel_ai-0.2.57 → camel_ai-0.2.58}/camel/utils/deduplication.py +0 -0
- {camel_ai-0.2.57 → camel_ai-0.2.58}/camel/utils/filename.py +0 -0
- {camel_ai-0.2.57 → camel_ai-0.2.58}/camel/utils/mcp.py +0 -0
- {camel_ai-0.2.57 → camel_ai-0.2.58}/camel/utils/response_format.py +0 -0
- {camel_ai-0.2.57 → camel_ai-0.2.58}/camel/utils/token_counting.py +0 -0
- {camel_ai-0.2.57 → camel_ai-0.2.58}/camel/verifiers/__init__.py +0 -0
- {camel_ai-0.2.57 → camel_ai-0.2.58}/camel/verifiers/base.py +0 -0
- {camel_ai-0.2.57 → camel_ai-0.2.58}/camel/verifiers/math_verifier.py +0 -0
- {camel_ai-0.2.57 → camel_ai-0.2.58}/camel/verifiers/models.py +0 -0
- {camel_ai-0.2.57 → camel_ai-0.2.58}/camel/verifiers/physics_verifier.py +0 -0
- {camel_ai-0.2.57 → camel_ai-0.2.58}/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.58
|
|
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
|
|
@@ -65,6 +65,7 @@ Requires-Dist: ipykernel<7,>=6.0.0; extra == 'all'
|
|
|
65
65
|
Requires-Dist: jupyter-client<9,>=8.6.2; extra == 'all'
|
|
66
66
|
Requires-Dist: linkup-sdk<0.3,>=0.2.1; extra == 'all'
|
|
67
67
|
Requires-Dist: litellm<2,>=1.38.1; extra == 'all'
|
|
68
|
+
Requires-Dist: markitdown==0.1.1; extra == 'all'
|
|
68
69
|
Requires-Dist: math-verify<0.8,>=0.7.0; extra == 'all'
|
|
69
70
|
Requires-Dist: mcp>=1.3.0; extra == 'all'
|
|
70
71
|
Requires-Dist: mem0ai>=0.1.67; extra == 'all'
|
|
@@ -196,6 +197,7 @@ Requires-Dist: crawl4ai>=0.3.745; extra == 'document-tools'
|
|
|
196
197
|
Requires-Dist: docx2txt<0.9,>=0.8; extra == 'document-tools'
|
|
197
198
|
Requires-Dist: docx>=0.2.4; extra == 'document-tools'
|
|
198
199
|
Requires-Dist: fpdf>=1.7.2; extra == 'document-tools'
|
|
200
|
+
Requires-Dist: markitdown==0.1.1; extra == 'document-tools'
|
|
199
201
|
Requires-Dist: numpy~=1.26; extra == 'document-tools'
|
|
200
202
|
Requires-Dist: openapi-spec-validator<0.8,>=0.7.1; extra == 'document-tools'
|
|
201
203
|
Requires-Dist: openpyxl>=3.1.5; extra == 'document-tools'
|
|
@@ -598,7 +600,7 @@ Please reach out to us on [CAMEL discord](https://discord.camel-ai.org/) if you
|
|
|
598
600
|
|
|
599
601
|
<div align="center">
|
|
600
602
|
<a href="https://docs.camel-ai.org">
|
|
601
|
-
<img src="
|
|
603
|
+
<img src="https://camel-ai.github.io/camel_asset/graphics/techstack.png" alt="TechStack">
|
|
602
604
|
</a>
|
|
603
605
|
</div>
|
|
604
606
|
|
|
@@ -260,7 +260,7 @@ Please reach out to us on [CAMEL discord](https://discord.camel-ai.org/) if you
|
|
|
260
260
|
|
|
261
261
|
<div align="center">
|
|
262
262
|
<a href="https://docs.camel-ai.org">
|
|
263
|
-
<img src="
|
|
263
|
+
<img src="https://camel-ai.github.io/camel_asset/graphics/techstack.png" alt="TechStack">
|
|
264
264
|
</a>
|
|
265
265
|
</div>
|
|
266
266
|
|
|
@@ -442,6 +442,11 @@ class ChatAgent(BaseAgent):
|
|
|
442
442
|
new_tool = convert_to_function_tool(tool)
|
|
443
443
|
self._internal_tools[new_tool.get_function_name()] = new_tool
|
|
444
444
|
|
|
445
|
+
def add_tools(self, tools: List[Union[FunctionTool, Callable]]) -> None:
|
|
446
|
+
r"""Add a list of tools to the agent."""
|
|
447
|
+
for tool in tools:
|
|
448
|
+
self.add_tool(tool)
|
|
449
|
+
|
|
445
450
|
def add_external_tool(
|
|
446
451
|
self, tool: Union[FunctionTool, Callable, Dict[str, Any]]
|
|
447
452
|
) -> None:
|
|
@@ -462,6 +467,11 @@ class ChatAgent(BaseAgent):
|
|
|
462
467
|
return True
|
|
463
468
|
return False
|
|
464
469
|
|
|
470
|
+
def remove_tools(self, tool_names: List[str]) -> None:
|
|
471
|
+
r"""Remove a list of tools from the agent by name."""
|
|
472
|
+
for tool_name in tool_names:
|
|
473
|
+
self.remove_tool(tool_name)
|
|
474
|
+
|
|
465
475
|
def remove_external_tool(self, tool_name: str) -> bool:
|
|
466
476
|
r"""Remove an external tool from the agent by name.
|
|
467
477
|
|
|
@@ -0,0 +1,446 @@
|
|
|
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
|
+
|
|
15
|
+
import asyncio
|
|
16
|
+
import json
|
|
17
|
+
import platform
|
|
18
|
+
import re
|
|
19
|
+
from typing import Any, Callable, Dict, List, Optional, Union, cast
|
|
20
|
+
|
|
21
|
+
from camel.agents import ChatAgent
|
|
22
|
+
from camel.logger import get_logger
|
|
23
|
+
from camel.messages import BaseMessage
|
|
24
|
+
from camel.models import BaseModelBackend, ModelFactory
|
|
25
|
+
from camel.prompts import TextPrompt
|
|
26
|
+
from camel.responses import ChatAgentResponse
|
|
27
|
+
from camel.toolkits import FunctionTool, MCPToolkit
|
|
28
|
+
from camel.types import (
|
|
29
|
+
BaseMCPRegistryConfig,
|
|
30
|
+
MCPRegistryType,
|
|
31
|
+
ModelPlatformType,
|
|
32
|
+
ModelType,
|
|
33
|
+
RoleType,
|
|
34
|
+
)
|
|
35
|
+
|
|
36
|
+
# AgentOps decorator setting
|
|
37
|
+
try:
|
|
38
|
+
import os
|
|
39
|
+
|
|
40
|
+
if os.getenv("AGENTOPS_API_KEY") is not None:
|
|
41
|
+
from agentops import track_agent
|
|
42
|
+
else:
|
|
43
|
+
raise ImportError
|
|
44
|
+
except (ImportError, AttributeError):
|
|
45
|
+
from camel.utils import track_agent
|
|
46
|
+
|
|
47
|
+
logger = get_logger(__name__)
|
|
48
|
+
|
|
49
|
+
|
|
50
|
+
SYS_MSG_CONTENT = """
|
|
51
|
+
You are a helpful assistant, and you prefer to use tools provided by the user
|
|
52
|
+
to solve problems.
|
|
53
|
+
Using a tool, you will tell the user `server_idx`, `tool_name` and
|
|
54
|
+
`tool_args` formatted in JSON as following:
|
|
55
|
+
```json
|
|
56
|
+
{
|
|
57
|
+
"server_idx": idx,
|
|
58
|
+
"tool_name": "tool_name",
|
|
59
|
+
"tool_args": {
|
|
60
|
+
"arg1": value1,
|
|
61
|
+
"arg2": value2,
|
|
62
|
+
...
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
```
|
|
66
|
+
For example:
|
|
67
|
+
```json
|
|
68
|
+
{
|
|
69
|
+
"server_idx": 0,
|
|
70
|
+
"tool_name": "multiply",
|
|
71
|
+
"tool_args": {"a": 5, "b": 50}
|
|
72
|
+
}
|
|
73
|
+
```
|
|
74
|
+
Otherwise, you should respond to the user directly.
|
|
75
|
+
"""
|
|
76
|
+
|
|
77
|
+
|
|
78
|
+
TOOLS_PROMPT = """
|
|
79
|
+
## Available Tools:
|
|
80
|
+
|
|
81
|
+
{tools}
|
|
82
|
+
"""
|
|
83
|
+
|
|
84
|
+
FINAL_RESPONSE_PROMPT = """
|
|
85
|
+
The result `{results}` is provided by tools you proposed.
|
|
86
|
+
Please answer me according to the result directly.
|
|
87
|
+
"""
|
|
88
|
+
|
|
89
|
+
|
|
90
|
+
@track_agent(name="MCPAgent")
|
|
91
|
+
class MCPAgent(ChatAgent):
|
|
92
|
+
r"""A specialized agent designed to interact with MCP registries.
|
|
93
|
+
The MCPAgent enhances a base ChatAgent by integrating MCP tools from
|
|
94
|
+
various registries for search capabilities.
|
|
95
|
+
|
|
96
|
+
Attributes:
|
|
97
|
+
system_message (Optional[str]): The system message for the chat agent.
|
|
98
|
+
(default: :str:`"You are an assistant with search capabilities
|
|
99
|
+
using MCP tools."`)
|
|
100
|
+
model (BaseModelBackend): The model backend to use for generating
|
|
101
|
+
responses. (default: :obj:`ModelPlatformType.DEFAULT` with
|
|
102
|
+
`ModelType.DEFAULT`)
|
|
103
|
+
registry_configs (List[BaseMCPRegistryConfig]): List of registry
|
|
104
|
+
configurations (default: :obj:`None`)
|
|
105
|
+
local_config (Optional[Dict[str, Any]]): The local configuration for
|
|
106
|
+
the MCP agent. (default: :obj:`None`)
|
|
107
|
+
local_config_path (Optional[str]): The path to the local configuration
|
|
108
|
+
file for the MCP agent. (default: :obj:`None`)
|
|
109
|
+
function_calling_available (bool): Flag indicating whether the
|
|
110
|
+
model is equipped with the function calling ability.
|
|
111
|
+
(default: :obj:`True`)
|
|
112
|
+
**kwargs: Inherited from ChatAgent
|
|
113
|
+
"""
|
|
114
|
+
|
|
115
|
+
def __init__(
|
|
116
|
+
self,
|
|
117
|
+
system_message: Optional[Union[str, BaseMessage]] = (
|
|
118
|
+
"You are an assistant with search capabilities using MCP tools."
|
|
119
|
+
),
|
|
120
|
+
model: Optional[BaseModelBackend] = None,
|
|
121
|
+
registry_configs: Optional[
|
|
122
|
+
Union[List[BaseMCPRegistryConfig], BaseMCPRegistryConfig]
|
|
123
|
+
] = None,
|
|
124
|
+
local_config: Optional[Dict[str, Any]] = None,
|
|
125
|
+
local_config_path: Optional[str] = None,
|
|
126
|
+
tools: Optional[List[Union[FunctionTool, Callable]]] = None,
|
|
127
|
+
function_calling_available: bool = True,
|
|
128
|
+
**kwargs,
|
|
129
|
+
):
|
|
130
|
+
if model is None:
|
|
131
|
+
model = ModelFactory.create(
|
|
132
|
+
model_platform=ModelPlatformType.DEFAULT,
|
|
133
|
+
model_type=ModelType.DEFAULT,
|
|
134
|
+
)
|
|
135
|
+
|
|
136
|
+
if isinstance(registry_configs, BaseMCPRegistryConfig):
|
|
137
|
+
self.registry_configs = [registry_configs]
|
|
138
|
+
else:
|
|
139
|
+
self.registry_configs = registry_configs or []
|
|
140
|
+
|
|
141
|
+
if local_config_path:
|
|
142
|
+
with open(local_config_path, 'r') as f:
|
|
143
|
+
local_config = json.load(f)
|
|
144
|
+
|
|
145
|
+
self.local_config = local_config
|
|
146
|
+
self.function_calling_available = function_calling_available
|
|
147
|
+
|
|
148
|
+
if function_calling_available:
|
|
149
|
+
sys_msg_content = "You are a helpful assistant, and you prefer "
|
|
150
|
+
"to use tools provided by the user to solve problems."
|
|
151
|
+
else:
|
|
152
|
+
sys_msg_content = SYS_MSG_CONTENT
|
|
153
|
+
|
|
154
|
+
system_message = BaseMessage(
|
|
155
|
+
role_name="MCPRouter",
|
|
156
|
+
role_type=RoleType.ASSISTANT,
|
|
157
|
+
meta_dict=None,
|
|
158
|
+
content=sys_msg_content,
|
|
159
|
+
)
|
|
160
|
+
|
|
161
|
+
# Initialize the toolkit if configuration is provided
|
|
162
|
+
self.mcp_toolkit = self._initialize_mcp_toolkit()
|
|
163
|
+
|
|
164
|
+
super().__init__(
|
|
165
|
+
system_message=system_message,
|
|
166
|
+
model=model,
|
|
167
|
+
tools=tools,
|
|
168
|
+
**kwargs,
|
|
169
|
+
)
|
|
170
|
+
|
|
171
|
+
def _initialize_mcp_toolkit(self) -> MCPToolkit:
|
|
172
|
+
r"""Initialize the MCP toolkit from the provided configuration."""
|
|
173
|
+
config_dict = {}
|
|
174
|
+
for registry_config in self.registry_configs:
|
|
175
|
+
config_dict.update(registry_config.get_config())
|
|
176
|
+
|
|
177
|
+
if self.local_config:
|
|
178
|
+
config_dict.update(self.local_config)
|
|
179
|
+
|
|
180
|
+
return MCPToolkit(config_dict=config_dict)
|
|
181
|
+
|
|
182
|
+
def add_registry(self, registry_config: BaseMCPRegistryConfig) -> None:
|
|
183
|
+
r"""Add a new registry configuration to the agent.
|
|
184
|
+
|
|
185
|
+
Args:
|
|
186
|
+
registry_config (BaseMCPRegistryConfig): The registry
|
|
187
|
+
configuration to add.
|
|
188
|
+
"""
|
|
189
|
+
self.registry_configs.append(registry_config)
|
|
190
|
+
# Reinitialize the toolkit with the updated configurations
|
|
191
|
+
self.mcp_toolkit = self._initialize_mcp_toolkit()
|
|
192
|
+
|
|
193
|
+
# If already connected, reconnect to apply changes
|
|
194
|
+
if self.mcp_toolkit and self.mcp_toolkit.is_connected():
|
|
195
|
+
try:
|
|
196
|
+
asyncio.run(self.disconnect())
|
|
197
|
+
asyncio.run(self.connect())
|
|
198
|
+
except RuntimeError as e:
|
|
199
|
+
# Handle case where we're already in an event loop
|
|
200
|
+
logger.warning(
|
|
201
|
+
f"Could not reconnect synchronously: {e}. "
|
|
202
|
+
f"Manual reconnection may be required."
|
|
203
|
+
)
|
|
204
|
+
|
|
205
|
+
@classmethod
|
|
206
|
+
async def create(
|
|
207
|
+
cls,
|
|
208
|
+
config_path: Optional[str] = None,
|
|
209
|
+
registry_configs: Optional[
|
|
210
|
+
Union[List[BaseMCPRegistryConfig], BaseMCPRegistryConfig]
|
|
211
|
+
] = None,
|
|
212
|
+
model: Optional[BaseModelBackend] = None,
|
|
213
|
+
function_calling_available: bool = False,
|
|
214
|
+
**kwargs,
|
|
215
|
+
) -> "MCPAgent":
|
|
216
|
+
r"""Create and connect an MCPAgent instance.
|
|
217
|
+
|
|
218
|
+
Args:
|
|
219
|
+
config_path (Optional[str]): Path to the MCP configuration file.
|
|
220
|
+
If provided, will load registry configs from this file.
|
|
221
|
+
(default: :obj:`None`)
|
|
222
|
+
registry_configs (Optional[Union[List[BaseMCPRegistryConfig],
|
|
223
|
+
BaseMCPRegistryConfig]]): Registry configurations to use.
|
|
224
|
+
Can be a single config or list of configs. If both config_path
|
|
225
|
+
and registry_configs are provided, configs from both sources
|
|
226
|
+
will be combined. (default: :obj:`None`)
|
|
227
|
+
model (Optional[BaseModelBackend]): The model backend to use.
|
|
228
|
+
If None, will use the default model. (default: :obj:`None`)
|
|
229
|
+
function_calling_available (bool): Whether the model supports
|
|
230
|
+
function calling. (default: :obj:`False`)
|
|
231
|
+
**kwargs: Additional arguments to pass to MCPAgent constructor.
|
|
232
|
+
|
|
233
|
+
Returns:
|
|
234
|
+
MCPAgent: A connected MCPAgent instance ready to use.
|
|
235
|
+
|
|
236
|
+
Example:
|
|
237
|
+
>>> agent = await MCPAgent.create(
|
|
238
|
+
... config_path="path/to/config.json",
|
|
239
|
+
... function_calling_available=True
|
|
240
|
+
... )
|
|
241
|
+
>>> response = await agent.run("Hello!")
|
|
242
|
+
"""
|
|
243
|
+
# Initialize registry_configs list
|
|
244
|
+
final_registry_configs = []
|
|
245
|
+
|
|
246
|
+
# Add configs from registry_configs argument if provided
|
|
247
|
+
if registry_configs is not None:
|
|
248
|
+
if isinstance(registry_configs, BaseMCPRegistryConfig):
|
|
249
|
+
final_registry_configs.append(registry_configs)
|
|
250
|
+
else:
|
|
251
|
+
final_registry_configs.extend(registry_configs)
|
|
252
|
+
|
|
253
|
+
# Load additional configs from file if provided
|
|
254
|
+
if config_path:
|
|
255
|
+
try:
|
|
256
|
+
with open(config_path, 'r') as f:
|
|
257
|
+
config_data = json.load(f)
|
|
258
|
+
|
|
259
|
+
# Create registry configs from the loaded data
|
|
260
|
+
for _, server_config in config_data.get(
|
|
261
|
+
"mcpServers", {}
|
|
262
|
+
).items():
|
|
263
|
+
# Create a custom registry config for each server
|
|
264
|
+
registry_config = BaseMCPRegistryConfig(
|
|
265
|
+
type=MCPRegistryType.CUSTOM,
|
|
266
|
+
os=platform.system().lower(), # type: ignore [arg-type]
|
|
267
|
+
**server_config,
|
|
268
|
+
)
|
|
269
|
+
final_registry_configs.append(registry_config)
|
|
270
|
+
except Exception as e:
|
|
271
|
+
logger.error(f"Failed to load config from {config_path}: {e}")
|
|
272
|
+
raise
|
|
273
|
+
|
|
274
|
+
# Create the agent instance
|
|
275
|
+
agent = cls(
|
|
276
|
+
registry_configs=final_registry_configs,
|
|
277
|
+
model=model,
|
|
278
|
+
function_calling_available=function_calling_available,
|
|
279
|
+
**kwargs,
|
|
280
|
+
)
|
|
281
|
+
|
|
282
|
+
# Connect to MCP servers
|
|
283
|
+
try:
|
|
284
|
+
await agent.connect()
|
|
285
|
+
except Exception as e:
|
|
286
|
+
logger.error(f"Failed to connect to MCP servers: {e}")
|
|
287
|
+
await agent.disconnect() # Clean up if connection fails
|
|
288
|
+
raise
|
|
289
|
+
|
|
290
|
+
return agent
|
|
291
|
+
|
|
292
|
+
async def connect(self) -> None:
|
|
293
|
+
r"""Connect to the MCP servers."""
|
|
294
|
+
if self.mcp_toolkit:
|
|
295
|
+
await self.mcp_toolkit.connect()
|
|
296
|
+
if self.function_calling_available:
|
|
297
|
+
self.add_tools(
|
|
298
|
+
cast(
|
|
299
|
+
list[FunctionTool | Callable[..., Any]],
|
|
300
|
+
self.mcp_toolkit.get_tools(),
|
|
301
|
+
)
|
|
302
|
+
)
|
|
303
|
+
else:
|
|
304
|
+
prompt = TextPrompt(TOOLS_PROMPT)
|
|
305
|
+
self._text_tools = prompt.format(
|
|
306
|
+
tools=self.mcp_toolkit.get_text_tools()
|
|
307
|
+
)
|
|
308
|
+
|
|
309
|
+
async def disconnect(self) -> None:
|
|
310
|
+
r"""Disconnect from the MCP servers."""
|
|
311
|
+
if self.mcp_toolkit:
|
|
312
|
+
await self.mcp_toolkit.disconnect()
|
|
313
|
+
|
|
314
|
+
async def astep(
|
|
315
|
+
self, input_message: Union[BaseMessage, str], *args, **kwargs
|
|
316
|
+
) -> ChatAgentResponse:
|
|
317
|
+
r"""Asynchronous step function. Make sure MCP toolkit is connected
|
|
318
|
+
before proceeding.
|
|
319
|
+
|
|
320
|
+
Args:
|
|
321
|
+
input_message (Union[BaseMessage, str]): The input message.
|
|
322
|
+
*args: Additional arguments.
|
|
323
|
+
**kwargs: Additional keyword arguments.
|
|
324
|
+
|
|
325
|
+
Returns:
|
|
326
|
+
ChatAgentResponse: The response from the agent.
|
|
327
|
+
"""
|
|
328
|
+
if self.mcp_toolkit and not self.mcp_toolkit.is_connected():
|
|
329
|
+
await self.connect()
|
|
330
|
+
|
|
331
|
+
if self.function_calling_available:
|
|
332
|
+
return await super().astep(input_message, *args, **kwargs)
|
|
333
|
+
else:
|
|
334
|
+
task = f"## Task:\n {input_message}"
|
|
335
|
+
input_message = str(self._text_tools) + task
|
|
336
|
+
response = await super().astep(input_message, *args, **kwargs)
|
|
337
|
+
content = response.msgs[0].content.lower()
|
|
338
|
+
|
|
339
|
+
tool_calls = []
|
|
340
|
+
while "```json" in content:
|
|
341
|
+
json_match = re.search(r'```json', content)
|
|
342
|
+
if not json_match:
|
|
343
|
+
break
|
|
344
|
+
json_start = json_match.span()[1]
|
|
345
|
+
|
|
346
|
+
end_match = re.search(r'```', content[json_start:])
|
|
347
|
+
if not end_match:
|
|
348
|
+
break
|
|
349
|
+
json_end = end_match.span()[0] + json_start
|
|
350
|
+
|
|
351
|
+
tool_json = content[json_start:json_end].strip('\n')
|
|
352
|
+
try:
|
|
353
|
+
tool_calls.append(json.loads(tool_json))
|
|
354
|
+
except json.JSONDecodeError:
|
|
355
|
+
logger.warning(f"Failed to parse JSON: {tool_json}")
|
|
356
|
+
continue
|
|
357
|
+
content = content[json_end:]
|
|
358
|
+
|
|
359
|
+
if not tool_calls:
|
|
360
|
+
return response
|
|
361
|
+
else:
|
|
362
|
+
tools_results = []
|
|
363
|
+
for tool_call in tool_calls:
|
|
364
|
+
try:
|
|
365
|
+
server_idx = tool_call.get('server_idx')
|
|
366
|
+
tool_name = tool_call.get('tool_name')
|
|
367
|
+
tool_args = tool_call.get('tool_args', {})
|
|
368
|
+
|
|
369
|
+
# Validate required fields
|
|
370
|
+
if server_idx is None or tool_name is None:
|
|
371
|
+
logger.warning(
|
|
372
|
+
f"Missing required fields in tool "
|
|
373
|
+
f"call: {tool_call}"
|
|
374
|
+
)
|
|
375
|
+
continue
|
|
376
|
+
|
|
377
|
+
# Check server index is valid
|
|
378
|
+
if (
|
|
379
|
+
not isinstance(server_idx, int)
|
|
380
|
+
or server_idx < 0
|
|
381
|
+
or server_idx >= len(self.mcp_toolkit.servers)
|
|
382
|
+
):
|
|
383
|
+
logger.warning(
|
|
384
|
+
f"Invalid server index: {server_idx}"
|
|
385
|
+
)
|
|
386
|
+
continue
|
|
387
|
+
|
|
388
|
+
server = self.mcp_toolkit.servers[server_idx]
|
|
389
|
+
result = await server.call_tool(tool_name, tool_args)
|
|
390
|
+
|
|
391
|
+
# Safely access content
|
|
392
|
+
if result.content and len(result.content) > 0:
|
|
393
|
+
tools_results.append(
|
|
394
|
+
{tool_name: result.content[0].text}
|
|
395
|
+
)
|
|
396
|
+
else:
|
|
397
|
+
tools_results.append(
|
|
398
|
+
{tool_name: "No result content available"}
|
|
399
|
+
)
|
|
400
|
+
except Exception as e:
|
|
401
|
+
logger.error(f"Error processing tool call: {e}")
|
|
402
|
+
tools_results.append({"error": str(e)})
|
|
403
|
+
results = json.dumps(tools_results)
|
|
404
|
+
final_prompt = TextPrompt(FINAL_RESPONSE_PROMPT).format(
|
|
405
|
+
results=results
|
|
406
|
+
)
|
|
407
|
+
response = await self.astep(final_prompt)
|
|
408
|
+
return response
|
|
409
|
+
|
|
410
|
+
def step(
|
|
411
|
+
self, input_message: Union[BaseMessage, str], *args, **kwargs
|
|
412
|
+
) -> ChatAgentResponse:
|
|
413
|
+
r"""Synchronous step function. Make sure MCP toolkit is connected
|
|
414
|
+
before proceeding.
|
|
415
|
+
|
|
416
|
+
Args:
|
|
417
|
+
input_message (Union[BaseMessage, str]): The input message.
|
|
418
|
+
*args: Additional arguments.
|
|
419
|
+
**kwargs: Additional keyword arguments.
|
|
420
|
+
|
|
421
|
+
Returns:
|
|
422
|
+
ChatAgentResponse: The response from the agent.
|
|
423
|
+
"""
|
|
424
|
+
try:
|
|
425
|
+
loop = asyncio.get_running_loop()
|
|
426
|
+
except RuntimeError:
|
|
427
|
+
loop = None
|
|
428
|
+
|
|
429
|
+
if loop and loop.is_running():
|
|
430
|
+
# Running inside an existing loop (e.g., Jupyter/FastAPI)
|
|
431
|
+
# Use create_task and run with a future
|
|
432
|
+
coro = self.astep(input_message, *args, **kwargs)
|
|
433
|
+
future = asyncio.ensure_future(coro)
|
|
434
|
+
return asyncio.run_coroutine_threadsafe(future, loop).result()
|
|
435
|
+
else:
|
|
436
|
+
# Safe to run normally
|
|
437
|
+
return asyncio.run(self.astep(input_message, *args, **kwargs))
|
|
438
|
+
|
|
439
|
+
async def __aenter__(self):
|
|
440
|
+
r"""Async context manager entry."""
|
|
441
|
+
await self.connect()
|
|
442
|
+
return self
|
|
443
|
+
|
|
444
|
+
async def __aexit__(self, exc_type, exc_val, exc_tb):
|
|
445
|
+
r"""Async context manager exit."""
|
|
446
|
+
await self.disconnect()
|
|
@@ -18,6 +18,7 @@ from .chunkr_reader import ChunkrReader
|
|
|
18
18
|
from .crawl4ai_reader import Crawl4AI
|
|
19
19
|
from .firecrawl_reader import Firecrawl
|
|
20
20
|
from .jina_url_reader import JinaURLReader
|
|
21
|
+
from .markitdown import MarkItDownLoader
|
|
21
22
|
from .mineru_extractor import MinerU
|
|
22
23
|
from .pandas_reader import PandasReader
|
|
23
24
|
from .scrapegraph_reader import ScrapeGraphAI
|
|
@@ -35,5 +36,6 @@ __all__ = [
|
|
|
35
36
|
'PandasReader',
|
|
36
37
|
'MinerU',
|
|
37
38
|
'Crawl4AI',
|
|
39
|
+
'MarkItDownLoader',
|
|
38
40
|
'ScrapeGraphAI',
|
|
39
41
|
]
|