camel-ai 0.2.69a1__tar.gz → 0.2.69a3__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.69a1 → camel_ai-0.2.69a3}/PKG-INFO +5 -1
- {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/__init__.py +1 -1
- {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/agents/chat_agent.py +27 -5
- {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/societies/workforce/single_agent_worker.py +11 -4
- {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/societies/workforce/workforce.py +7 -2
- {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/toolkits/function_tool.py +4 -3
- {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/toolkits/non_visual_browser_toolkit/browser_non_visual_toolkit.py +107 -79
- {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/toolkits/non_visual_browser_toolkit/nv_browser_session.py +28 -0
- {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/toolkits/non_visual_browser_toolkit/snapshot.py +58 -9
- {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/toolkits/video_analysis_toolkit.py +77 -3
- {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/pyproject.toml +7 -2
- {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/.gitignore +0 -0
- {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/LICENSE +0 -0
- {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/README.md +0 -0
- {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/agents/__init__.py +0 -0
- {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/agents/_types.py +0 -0
- {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/agents/_utils.py +0 -0
- {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/agents/base.py +0 -0
- {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/agents/critic_agent.py +0 -0
- {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/agents/deductive_reasoner_agent.py +0 -0
- {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/agents/embodied_agent.py +0 -0
- {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/agents/knowledge_graph_agent.py +0 -0
- {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/agents/mcp_agent.py +0 -0
- {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/agents/multi_hop_generator_agent.py +0 -0
- {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/agents/programmed_agent_instruction.py +0 -0
- {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/agents/repo_agent.py +0 -0
- {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/agents/role_assignment_agent.py +0 -0
- {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/agents/search_agent.py +0 -0
- {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/agents/task_agent.py +0 -0
- {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/agents/tool_agents/__init__.py +0 -0
- {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/agents/tool_agents/base.py +0 -0
- {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/agents/tool_agents/hugging_face_tool_agent.py +0 -0
- {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/benchmarks/__init__.py +0 -0
- {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/benchmarks/apibank.py +0 -0
- {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/benchmarks/apibench.py +0 -0
- {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/benchmarks/base.py +0 -0
- {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/benchmarks/browsecomp.py +0 -0
- {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/benchmarks/gaia.py +0 -0
- {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/benchmarks/mock_website/README.md +0 -0
- {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/benchmarks/mock_website/mock_web.py +0 -0
- {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/benchmarks/mock_website/requirements.txt +0 -0
- {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/benchmarks/mock_website/shopping_mall/app.py +0 -0
- {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/benchmarks/mock_website/task.json +0 -0
- {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/benchmarks/nexus.py +0 -0
- {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/benchmarks/ragbench.py +0 -0
- {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/bots/__init__.py +0 -0
- {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/bots/discord/__init__.py +0 -0
- {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/bots/discord/discord_app.py +0 -0
- {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/bots/discord/discord_installation.py +0 -0
- {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/bots/discord/discord_store.py +0 -0
- {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/bots/slack/__init__.py +0 -0
- {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/bots/slack/models.py +0 -0
- {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/bots/slack/slack_app.py +0 -0
- {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/bots/telegram_bot.py +0 -0
- {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/configs/__init__.py +0 -0
- {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/configs/aiml_config.py +0 -0
- {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/configs/anthropic_config.py +0 -0
- {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/configs/base_config.py +0 -0
- {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/configs/bedrock_config.py +0 -0
- {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/configs/cohere_config.py +0 -0
- {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/configs/crynux_config.py +0 -0
- {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/configs/deepseek_config.py +0 -0
- {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/configs/gemini_config.py +0 -0
- {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/configs/groq_config.py +0 -0
- {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/configs/internlm_config.py +0 -0
- {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/configs/litellm_config.py +0 -0
- {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/configs/lmstudio_config.py +0 -0
- {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/configs/mistral_config.py +0 -0
- {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/configs/modelscope_config.py +0 -0
- {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/configs/moonshot_config.py +0 -0
- {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/configs/netmind_config.py +0 -0
- {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/configs/novita_config.py +0 -0
- {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/configs/nvidia_config.py +0 -0
- {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/configs/ollama_config.py +0 -0
- {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/configs/openai_config.py +0 -0
- {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/configs/openrouter_config.py +0 -0
- {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/configs/ppio_config.py +0 -0
- {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/configs/qianfan_config.py +0 -0
- {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/configs/qwen_config.py +0 -0
- {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/configs/reka_config.py +0 -0
- {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/configs/samba_config.py +0 -0
- {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/configs/sglang_config.py +0 -0
- {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/configs/siliconflow_config.py +0 -0
- {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/configs/togetherai_config.py +0 -0
- {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/configs/vllm_config.py +0 -0
- {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/configs/watsonx_config.py +0 -0
- {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/configs/yi_config.py +0 -0
- {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/configs/zhipuai_config.py +0 -0
- {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/data_collectors/__init__.py +0 -0
- {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/data_collectors/alpaca_collector.py +0 -0
- {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/data_collectors/base.py +0 -0
- {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/data_collectors/sharegpt_collector.py +0 -0
- {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/datagen/__init__.py +0 -0
- {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/datagen/cot_datagen.py +0 -0
- {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/datagen/evol_instruct/__init__.py +0 -0
- {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/datagen/evol_instruct/evol_instruct.py +0 -0
- {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/datagen/evol_instruct/scorer.py +0 -0
- {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/datagen/evol_instruct/templates.py +0 -0
- {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/datagen/self_improving_cot.py +0 -0
- {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/datagen/self_instruct/__init__.py +0 -0
- {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/datagen/self_instruct/filter/__init__.py +0 -0
- {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/datagen/self_instruct/filter/filter_function.py +0 -0
- {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/datagen/self_instruct/filter/filter_registry.py +0 -0
- {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/datagen/self_instruct/filter/instruction_filter.py +0 -0
- {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/datagen/self_instruct/self_instruct.py +0 -0
- {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/datagen/self_instruct/templates.py +0 -0
- {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/datagen/source2synth/__init__.py +0 -0
- {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/datagen/source2synth/data_processor.py +0 -0
- {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/datagen/source2synth/models.py +0 -0
- {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/datagen/source2synth/user_data_processor_config.py +0 -0
- {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/datahubs/__init__.py +0 -0
- {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/datahubs/base.py +0 -0
- {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/datahubs/huggingface.py +0 -0
- {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/datahubs/models.py +0 -0
- {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/datasets/__init__.py +0 -0
- {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/datasets/base_generator.py +0 -0
- {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/datasets/few_shot_generator.py +0 -0
- {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/datasets/models.py +0 -0
- {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/datasets/self_instruct_generator.py +0 -0
- {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/datasets/static_dataset.py +0 -0
- {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/embeddings/__init__.py +0 -0
- {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/embeddings/azure_embedding.py +0 -0
- {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/embeddings/base.py +0 -0
- {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/embeddings/gemini_embedding.py +0 -0
- {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/embeddings/jina_embedding.py +0 -0
- {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/embeddings/mistral_embedding.py +0 -0
- {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/embeddings/openai_compatible_embedding.py +0 -0
- {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/embeddings/openai_embedding.py +0 -0
- {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/embeddings/sentence_transformers_embeddings.py +0 -0
- {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/embeddings/together_embedding.py +0 -0
- {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/embeddings/vlm_embedding.py +0 -0
- {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/environments/__init__.py +0 -0
- {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/environments/models.py +0 -0
- {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/environments/multi_step.py +0 -0
- {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/environments/rlcards_env.py +0 -0
- {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/environments/single_step.py +0 -0
- {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/environments/tic_tac_toe.py +0 -0
- {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/extractors/__init__.py +0 -0
- {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/extractors/base.py +0 -0
- {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/extractors/python_strategies.py +0 -0
- {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/generators.py +0 -0
- {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/human.py +0 -0
- {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/interpreters/__init__.py +0 -0
- {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/interpreters/base.py +0 -0
- {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/interpreters/docker/Dockerfile +0 -0
- {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/interpreters/docker_interpreter.py +0 -0
- {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/interpreters/e2b_interpreter.py +0 -0
- {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/interpreters/internal_python_interpreter.py +0 -0
- {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/interpreters/interpreter_error.py +0 -0
- {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/interpreters/ipython_interpreter.py +0 -0
- {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/interpreters/subprocess_interpreter.py +0 -0
- {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/loaders/__init__.py +0 -0
- {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/loaders/apify_reader.py +0 -0
- {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/loaders/base_io.py +0 -0
- {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/loaders/chunkr_reader.py +0 -0
- {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/loaders/crawl4ai_reader.py +0 -0
- {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/loaders/firecrawl_reader.py +0 -0
- {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/loaders/jina_url_reader.py +0 -0
- {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/loaders/markitdown.py +0 -0
- {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/loaders/mineru_extractor.py +0 -0
- {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/loaders/mistral_reader.py +0 -0
- {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/loaders/pandas_reader.py +0 -0
- {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/loaders/scrapegraph_reader.py +0 -0
- {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/loaders/unstructured_io.py +0 -0
- {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/logger.py +0 -0
- {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/memories/__init__.py +0 -0
- {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/memories/agent_memories.py +0 -0
- {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/memories/base.py +0 -0
- {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/memories/blocks/__init__.py +0 -0
- {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/memories/blocks/chat_history_block.py +0 -0
- {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/memories/blocks/vectordb_block.py +0 -0
- {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/memories/context_creators/__init__.py +0 -0
- {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/memories/context_creators/score_based.py +0 -0
- {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/memories/records.py +0 -0
- {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/messages/__init__.py +0 -0
- {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/messages/base.py +0 -0
- {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/messages/conversion/__init__.py +0 -0
- {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/messages/conversion/alpaca.py +0 -0
- {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/messages/conversion/conversation_models.py +0 -0
- {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/messages/conversion/sharegpt/__init__.py +0 -0
- {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/messages/conversion/sharegpt/function_call_formatter.py +0 -0
- {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/messages/conversion/sharegpt/hermes/__init__.py +0 -0
- {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/messages/conversion/sharegpt/hermes/hermes_function_formatter.py +0 -0
- {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/messages/func_message.py +0 -0
- {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/models/__init__.py +0 -0
- {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/models/_utils.py +0 -0
- {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/models/aiml_model.py +0 -0
- {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/models/anthropic_model.py +0 -0
- {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/models/aws_bedrock_model.py +0 -0
- {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/models/azure_openai_model.py +0 -0
- {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/models/base_audio_model.py +0 -0
- {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/models/base_model.py +0 -0
- {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/models/cohere_model.py +0 -0
- {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/models/crynux_model.py +0 -0
- {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/models/deepseek_model.py +0 -0
- {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/models/fish_audio_model.py +0 -0
- {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/models/gemini_model.py +0 -0
- {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/models/groq_model.py +0 -0
- {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/models/internlm_model.py +0 -0
- {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/models/litellm_model.py +0 -0
- {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/models/lmstudio_model.py +0 -0
- {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/models/mistral_model.py +0 -0
- {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/models/model_factory.py +0 -0
- {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/models/model_manager.py +0 -0
- {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/models/modelscope_model.py +0 -0
- {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/models/moonshot_model.py +0 -0
- {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/models/nemotron_model.py +0 -0
- {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/models/netmind_model.py +0 -0
- {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/models/novita_model.py +0 -0
- {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/models/nvidia_model.py +0 -0
- {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/models/ollama_model.py +0 -0
- {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/models/openai_audio_models.py +0 -0
- {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/models/openai_compatible_model.py +0 -0
- {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/models/openai_model.py +0 -0
- {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/models/openrouter_model.py +0 -0
- {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/models/ppio_model.py +0 -0
- {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/models/qianfan_model.py +0 -0
- {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/models/qwen_model.py +0 -0
- {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/models/reka_model.py +0 -0
- {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/models/reward/__init__.py +0 -0
- {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/models/reward/base_reward_model.py +0 -0
- {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/models/reward/evaluator.py +0 -0
- {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/models/reward/nemotron_model.py +0 -0
- {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/models/reward/skywork_model.py +0 -0
- {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/models/samba_model.py +0 -0
- {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/models/sglang_model.py +0 -0
- {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/models/siliconflow_model.py +0 -0
- {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/models/stub_model.py +0 -0
- {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/models/togetherai_model.py +0 -0
- {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/models/vllm_model.py +0 -0
- {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/models/volcano_model.py +0 -0
- {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/models/watsonx_model.py +0 -0
- {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/models/yi_model.py +0 -0
- {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/models/zhipuai_model.py +0 -0
- {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/personas/__init__.py +0 -0
- {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/personas/persona.py +0 -0
- {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/personas/persona_hub.py +0 -0
- {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/prompts/__init__.py +0 -0
- {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/prompts/ai_society.py +0 -0
- {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/prompts/base.py +0 -0
- {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/prompts/code.py +0 -0
- {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/prompts/evaluation.py +0 -0
- {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/prompts/generate_text_embedding_data.py +0 -0
- {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/prompts/image_craft.py +0 -0
- {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/prompts/misalignment.py +0 -0
- {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/prompts/multi_condition_image_craft.py +0 -0
- {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/prompts/object_recognition.py +0 -0
- {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/prompts/persona_hub.py +0 -0
- {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/prompts/prompt_templates.py +0 -0
- {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/prompts/role_description_prompt_template.py +0 -0
- {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/prompts/solution_extraction.py +0 -0
- {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/prompts/task_prompt_template.py +0 -0
- {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/prompts/translation.py +0 -0
- {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/prompts/video_description_prompt.py +0 -0
- {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/py.typed +0 -0
- {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/responses/__init__.py +0 -0
- {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/responses/agent_responses.py +0 -0
- {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/retrievers/__init__.py +0 -0
- {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/retrievers/auto_retriever.py +0 -0
- {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/retrievers/base.py +0 -0
- {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/retrievers/bm25_retriever.py +0 -0
- {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/retrievers/cohere_rerank_retriever.py +0 -0
- {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/retrievers/hybrid_retrival.py +0 -0
- {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/retrievers/vector_retriever.py +0 -0
- {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/runtimes/__init__.py +0 -0
- {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/runtimes/api.py +0 -0
- {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/runtimes/base.py +0 -0
- {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/runtimes/configs.py +0 -0
- {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/runtimes/daytona_runtime.py +0 -0
- {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/runtimes/docker_runtime.py +0 -0
- {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/runtimes/llm_guard_runtime.py +0 -0
- {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/runtimes/remote_http_runtime.py +0 -0
- {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/runtimes/ubuntu_docker_runtime.py +0 -0
- {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/runtimes/utils/__init__.py +0 -0
- {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/runtimes/utils/function_risk_toolkit.py +0 -0
- {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/runtimes/utils/ignore_risk_toolkit.py +0 -0
- {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/schemas/__init__.py +0 -0
- {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/schemas/base.py +0 -0
- {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/schemas/openai_converter.py +0 -0
- {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/schemas/outlines_converter.py +0 -0
- {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/societies/__init__.py +0 -0
- {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/societies/babyagi_playing.py +0 -0
- {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/societies/role_playing.py +0 -0
- {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/societies/workforce/__init__.py +0 -0
- {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/societies/workforce/base.py +0 -0
- {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/societies/workforce/prompts.py +0 -0
- {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/societies/workforce/role_playing_worker.py +0 -0
- {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/societies/workforce/task_channel.py +0 -0
- {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/societies/workforce/utils.py +0 -0
- {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/societies/workforce/worker.py +0 -0
- {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/societies/workforce/workforce_logger.py +0 -0
- {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/storages/__init__.py +0 -0
- {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/storages/graph_storages/__init__.py +0 -0
- {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/storages/graph_storages/base.py +0 -0
- {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/storages/graph_storages/graph_element.py +0 -0
- {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/storages/graph_storages/nebula_graph.py +0 -0
- {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/storages/graph_storages/neo4j_graph.py +0 -0
- {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/storages/key_value_storages/__init__.py +0 -0
- {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/storages/key_value_storages/base.py +0 -0
- {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/storages/key_value_storages/in_memory.py +0 -0
- {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/storages/key_value_storages/json.py +0 -0
- {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/storages/key_value_storages/mem0_cloud.py +0 -0
- {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/storages/key_value_storages/redis.py +0 -0
- {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/storages/object_storages/__init__.py +0 -0
- {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/storages/object_storages/amazon_s3.py +0 -0
- {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/storages/object_storages/azure_blob.py +0 -0
- {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/storages/object_storages/base.py +0 -0
- {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/storages/object_storages/google_cloud.py +0 -0
- {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/storages/vectordb_storages/__init__.py +0 -0
- {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/storages/vectordb_storages/base.py +0 -0
- {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/storages/vectordb_storages/faiss.py +0 -0
- {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/storages/vectordb_storages/milvus.py +0 -0
- {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/storages/vectordb_storages/oceanbase.py +0 -0
- {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/storages/vectordb_storages/qdrant.py +0 -0
- {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/storages/vectordb_storages/tidb.py +0 -0
- {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/storages/vectordb_storages/weaviate.py +0 -0
- {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/tasks/__init__.py +0 -0
- {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/tasks/task.py +0 -0
- {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/tasks/task_prompt.py +0 -0
- {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/terminators/__init__.py +0 -0
- {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/terminators/base.py +0 -0
- {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/terminators/response_terminator.py +0 -0
- {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/terminators/token_limit_terminator.py +0 -0
- {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/toolkits/__init__.py +0 -0
- {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/toolkits/aci_toolkit.py +0 -0
- {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/toolkits/arxiv_toolkit.py +0 -0
- {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/toolkits/ask_news_toolkit.py +0 -0
- {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/toolkits/async_browser_toolkit.py +0 -0
- {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/toolkits/audio_analysis_toolkit.py +0 -0
- {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/toolkits/base.py +0 -0
- {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/toolkits/bohrium_toolkit.py +0 -0
- {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/toolkits/browser_toolkit.py +0 -0
- {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/toolkits/browser_toolkit_commons.py +0 -0
- {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/toolkits/code_execution.py +0 -0
- {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/toolkits/dalle_toolkit.py +0 -0
- {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/toolkits/dappier_toolkit.py +0 -0
- {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/toolkits/data_commons_toolkit.py +0 -0
- {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/toolkits/excel_toolkit.py +0 -0
- {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/toolkits/file_write_toolkit.py +0 -0
- {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/toolkits/github_toolkit.py +0 -0
- {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/toolkits/google_calendar_toolkit.py +0 -0
- {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/toolkits/google_maps_toolkit.py +0 -0
- {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/toolkits/google_scholar_toolkit.py +0 -0
- {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/toolkits/human_toolkit.py +0 -0
- {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/toolkits/image_analysis_toolkit.py +0 -0
- {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/toolkits/jina_reranker_toolkit.py +0 -0
- {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/toolkits/klavis_toolkit.py +0 -0
- {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/toolkits/linkedin_toolkit.py +0 -0
- {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/toolkits/math_toolkit.py +0 -0
- {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/toolkits/mcp_toolkit.py +0 -0
- {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/toolkits/memory_toolkit.py +0 -0
- {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/toolkits/meshy_toolkit.py +0 -0
- {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/toolkits/mineru_toolkit.py +0 -0
- {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/toolkits/networkx_toolkit.py +0 -0
- {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/toolkits/non_visual_browser_toolkit/__init__.py +0 -0
- {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/toolkits/non_visual_browser_toolkit/actions.py +0 -0
- {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/toolkits/non_visual_browser_toolkit/agent.py +0 -0
- {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/toolkits/non_visual_browser_toolkit/snapshot.js +0 -0
- {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/toolkits/notion_toolkit.py +0 -0
- {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/toolkits/open_api_specs/biztoc/__init__.py +0 -0
- {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/toolkits/open_api_specs/biztoc/ai-plugin.json +0 -0
- {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/toolkits/open_api_specs/biztoc/openapi.yaml +0 -0
- {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/toolkits/open_api_specs/coursera/__init__.py +0 -0
- {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/toolkits/open_api_specs/coursera/openapi.yaml +0 -0
- {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/toolkits/open_api_specs/create_qr_code/__init__.py +0 -0
- {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/toolkits/open_api_specs/create_qr_code/openapi.yaml +0 -0
- {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/toolkits/open_api_specs/klarna/__init__.py +0 -0
- {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/toolkits/open_api_specs/klarna/openapi.yaml +0 -0
- {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/toolkits/open_api_specs/nasa_apod/__init__.py +0 -0
- {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/toolkits/open_api_specs/nasa_apod/openapi.yaml +0 -0
- {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/toolkits/open_api_specs/outschool/__init__.py +0 -0
- {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/toolkits/open_api_specs/outschool/ai-plugin.json +0 -0
- {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/toolkits/open_api_specs/outschool/openapi.yaml +0 -0
- {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/toolkits/open_api_specs/outschool/paths/__init__.py +0 -0
- {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/toolkits/open_api_specs/outschool/paths/get_classes.py +0 -0
- {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/toolkits/open_api_specs/outschool/paths/search_teachers.py +0 -0
- {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/toolkits/open_api_specs/security_config.py +0 -0
- {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/toolkits/open_api_specs/speak/__init__.py +0 -0
- {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/toolkits/open_api_specs/speak/openapi.yaml +0 -0
- {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/toolkits/open_api_specs/web_scraper/__init__.py +0 -0
- {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/toolkits/open_api_specs/web_scraper/ai-plugin.json +0 -0
- {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/toolkits/open_api_specs/web_scraper/openapi.yaml +0 -0
- {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/toolkits/open_api_specs/web_scraper/paths/__init__.py +0 -0
- {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/toolkits/open_api_specs/web_scraper/paths/scraper.py +0 -0
- {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/toolkits/open_api_toolkit.py +0 -0
- {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/toolkits/openai_agent_toolkit.py +0 -0
- {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/toolkits/openbb_toolkit.py +0 -0
- {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/toolkits/page_script.js +0 -0
- {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/toolkits/playwright_mcp_toolkit.py +0 -0
- {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/toolkits/pptx_toolkit.py +0 -0
- {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/toolkits/pubmed_toolkit.py +0 -0
- {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/toolkits/pulse_mcp_search_toolkit.py +0 -0
- {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/toolkits/pyautogui_toolkit.py +0 -0
- {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/toolkits/reddit_toolkit.py +0 -0
- {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/toolkits/retrieval_toolkit.py +0 -0
- {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/toolkits/search_toolkit.py +0 -0
- {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/toolkits/searxng_toolkit.py +0 -0
- {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/toolkits/semantic_scholar_toolkit.py +0 -0
- {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/toolkits/slack_toolkit.py +0 -0
- {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/toolkits/stripe_toolkit.py +0 -0
- {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/toolkits/sympy_toolkit.py +0 -0
- {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/toolkits/task_planning_toolkit.py +0 -0
- {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/toolkits/terminal_toolkit.py +0 -0
- {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/toolkits/thinking_toolkit.py +0 -0
- {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/toolkits/twitter_toolkit.py +0 -0
- {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/toolkits/video_download_toolkit.py +0 -0
- {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/toolkits/weather_toolkit.py +0 -0
- {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/toolkits/whatsapp_toolkit.py +0 -0
- {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/toolkits/wolfram_alpha_toolkit.py +0 -0
- {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/toolkits/zapier_toolkit.py +0 -0
- {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/types/__init__.py +0 -0
- {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/types/agents/__init__.py +0 -0
- {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/types/agents/tool_calling_record.py +0 -0
- {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/types/enums.py +0 -0
- {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/types/mcp_registries.py +0 -0
- {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/types/openai_types.py +0 -0
- {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/types/unified_model_type.py +0 -0
- {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/utils/__init__.py +0 -0
- {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/utils/async_func.py +0 -0
- {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/utils/chunker/__init__.py +0 -0
- {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/utils/chunker/base.py +0 -0
- {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/utils/chunker/code_chunker.py +0 -0
- {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/utils/chunker/uio_chunker.py +0 -0
- {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/utils/commons.py +0 -0
- {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/utils/constants.py +0 -0
- {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/utils/deduplication.py +0 -0
- {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/utils/filename.py +0 -0
- {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/utils/langfuse.py +0 -0
- {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/utils/mcp.py +0 -0
- {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/utils/mcp_client.py +0 -0
- {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/utils/response_format.py +0 -0
- {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/utils/token_counting.py +0 -0
- {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/verifiers/__init__.py +0 -0
- {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/verifiers/base.py +0 -0
- {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/verifiers/math_verifier.py +0 -0
- {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/verifiers/models.py +0 -0
- {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/verifiers/physics_verifier.py +0 -0
- {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/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.69a3
|
|
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
|
|
@@ -99,6 +99,7 @@ Requires-Dist: pymupdf<2,>=1.22.5; extra == 'all'
|
|
|
99
99
|
Requires-Dist: pyobvector>=0.1.18; extra == 'all'
|
|
100
100
|
Requires-Dist: pyowm<4,>=3.3.0; extra == 'all'
|
|
101
101
|
Requires-Dist: pytelegrambotapi<5,>=4.18.0; extra == 'all'
|
|
102
|
+
Requires-Dist: pytesseract>=0.3.13; extra == 'all'
|
|
102
103
|
Requires-Dist: pytest-asyncio<0.24,>=0.23.0; extra == 'all'
|
|
103
104
|
Requires-Dist: pytest-cov<5,>=4; extra == 'all'
|
|
104
105
|
Requires-Dist: pytest<8,>=7; extra == 'all'
|
|
@@ -226,6 +227,7 @@ Provides-Extra: media-tools
|
|
|
226
227
|
Requires-Dist: ffmpeg-python<0.3,>=0.2.0; extra == 'media-tools'
|
|
227
228
|
Requires-Dist: imageio[pyav]<3,>=2.34.2; extra == 'media-tools'
|
|
228
229
|
Requires-Dist: pydub<0.26,>=0.25.1; extra == 'media-tools'
|
|
230
|
+
Requires-Dist: pytesseract>=0.3.13; extra == 'media-tools'
|
|
229
231
|
Requires-Dist: scenedetect>=0.6.5.2; extra == 'media-tools'
|
|
230
232
|
Requires-Dist: yt-dlp<2025,>=2024.11.4; extra == 'media-tools'
|
|
231
233
|
Provides-Extra: model-platforms
|
|
@@ -252,6 +254,7 @@ Requires-Dist: ffmpeg-python<0.3,>=0.2.0; extra == 'owl'
|
|
|
252
254
|
Requires-Dist: fpdf>=1.7.2; extra == 'owl'
|
|
253
255
|
Requires-Dist: html2text>=2024.2.26; extra == 'owl'
|
|
254
256
|
Requires-Dist: imageio[pyav]<3,>=2.34.2; extra == 'owl'
|
|
257
|
+
Requires-Dist: markitdown==0.1.1; extra == 'owl'
|
|
255
258
|
Requires-Dist: mcp-server-fetch==2025.1.17; extra == 'owl'
|
|
256
259
|
Requires-Dist: mcp-simple-arxiv==0.2.2; extra == 'owl'
|
|
257
260
|
Requires-Dist: newspaper3k<0.3,>=0.2.8; extra == 'owl'
|
|
@@ -266,6 +269,7 @@ Requires-Dist: pyautogui<0.10,>=0.9.54; extra == 'owl'
|
|
|
266
269
|
Requires-Dist: pydub<0.26,>=0.25.1; extra == 'owl'
|
|
267
270
|
Requires-Dist: pylatex>=1.4.2; extra == 'owl'
|
|
268
271
|
Requires-Dist: pymupdf<2,>=1.22.5; extra == 'owl'
|
|
272
|
+
Requires-Dist: pytesseract>=0.3.13; extra == 'owl'
|
|
269
273
|
Requires-Dist: python-dotenv<2,>=1.0.0; extra == 'owl'
|
|
270
274
|
Requires-Dist: python-pptx>=1.0.2; extra == 'owl'
|
|
271
275
|
Requires-Dist: requests-oauthlib<2,>=1.3.1; extra == 'owl'
|
|
@@ -1904,12 +1904,36 @@ class ChatAgent(BaseAgent):
|
|
|
1904
1904
|
ChatAgent: A new instance of :obj:`ChatAgent` with the same
|
|
1905
1905
|
configuration.
|
|
1906
1906
|
"""
|
|
1907
|
+
import copy
|
|
1908
|
+
|
|
1907
1909
|
# Create a new instance with the same configuration
|
|
1908
1910
|
# If with_memory is True, set system_message to None
|
|
1909
1911
|
# If with_memory is False, use the original system message
|
|
1910
1912
|
# To avoid duplicated system memory.
|
|
1911
1913
|
system_message = None if with_memory else self._original_system_message
|
|
1912
1914
|
|
|
1915
|
+
# Create deep copies of tools to avoid shared state
|
|
1916
|
+
cloned_tools: List[Union[FunctionTool, Callable]] = []
|
|
1917
|
+
for tool in self._internal_tools.values():
|
|
1918
|
+
# Create a new FunctionTool instance to avoid sharing state
|
|
1919
|
+
cloned_tool = copy.deepcopy(tool)
|
|
1920
|
+
cloned_tools.append(cloned_tool)
|
|
1921
|
+
|
|
1922
|
+
# Create deep copies of external tool schemas
|
|
1923
|
+
cloned_external_tools: List[
|
|
1924
|
+
Union[FunctionTool, Callable, Dict[str, Any]]
|
|
1925
|
+
] = []
|
|
1926
|
+
for schema in self._external_tool_schemas.values():
|
|
1927
|
+
cloned_schema = copy.deepcopy(schema)
|
|
1928
|
+
cloned_external_tools.append(cloned_schema)
|
|
1929
|
+
|
|
1930
|
+
# Create deep copies of response terminators to avoid shared state
|
|
1931
|
+
cloned_terminators: List[ResponseTerminator] = []
|
|
1932
|
+
if self.response_terminators:
|
|
1933
|
+
for terminator in self.response_terminators:
|
|
1934
|
+
cloned_terminator = copy.deepcopy(terminator)
|
|
1935
|
+
cloned_terminators.append(cloned_terminator)
|
|
1936
|
+
|
|
1913
1937
|
new_agent = ChatAgent(
|
|
1914
1938
|
system_message=system_message,
|
|
1915
1939
|
model=self.model_backend.models, # Pass the existing model_backend
|
|
@@ -1919,11 +1943,9 @@ class ChatAgent(BaseAgent):
|
|
|
1919
1943
|
self.memory.get_context_creator(), "token_limit", None
|
|
1920
1944
|
),
|
|
1921
1945
|
output_language=self._output_language,
|
|
1922
|
-
tools=
|
|
1923
|
-
external_tools=
|
|
1924
|
-
|
|
1925
|
-
],
|
|
1926
|
-
response_terminators=self.response_terminators,
|
|
1946
|
+
tools=cloned_tools,
|
|
1947
|
+
external_tools=cloned_external_tools,
|
|
1948
|
+
response_terminators=cloned_terminators,
|
|
1927
1949
|
scheduling_strategy=self.model_backend.scheduling_strategy.__name__,
|
|
1928
1950
|
max_iteration=self.max_iteration,
|
|
1929
1951
|
stop_event=self.stop_event,
|
|
@@ -286,8 +286,8 @@ class SingleAgentWorker(Worker):
|
|
|
286
286
|
)
|
|
287
287
|
except Exception as e:
|
|
288
288
|
print(
|
|
289
|
-
f"{Fore.RED}Error
|
|
290
|
-
f"
|
|
289
|
+
f"{Fore.RED}Error processing task {task.id}: "
|
|
290
|
+
f"{type(e).__name__}: {e}{Fore.RESET}"
|
|
291
291
|
)
|
|
292
292
|
return TaskState.FAILED
|
|
293
293
|
finally:
|
|
@@ -336,8 +336,15 @@ class SingleAgentWorker(Worker):
|
|
|
336
336
|
|
|
337
337
|
print(f"======\n{Fore.GREEN}Reply from {self}:{Fore.RESET}")
|
|
338
338
|
|
|
339
|
-
|
|
340
|
-
|
|
339
|
+
try:
|
|
340
|
+
result_dict = json.loads(response.msg.content)
|
|
341
|
+
task_result = TaskResult(**result_dict)
|
|
342
|
+
except json.JSONDecodeError as e:
|
|
343
|
+
print(
|
|
344
|
+
f"{Fore.RED}JSON parsing error for task {task.id}: "
|
|
345
|
+
f"Invalid response format - {e}{Fore.RESET}"
|
|
346
|
+
)
|
|
347
|
+
return TaskState.FAILED
|
|
341
348
|
|
|
342
349
|
color = Fore.RED if task_result.failed else Fore.GREEN
|
|
343
350
|
print(
|
|
@@ -882,11 +882,16 @@ class Workforce(BaseNode):
|
|
|
882
882
|
self._task = task
|
|
883
883
|
self._state = WorkforceState.RUNNING
|
|
884
884
|
task.state = TaskState.FAILED # TODO: Add logic for OPEN
|
|
885
|
-
self._pending_tasks.append(task)
|
|
886
885
|
|
|
887
886
|
# Decompose the task into subtasks first
|
|
888
887
|
subtasks = self._decompose_task(task)
|
|
889
|
-
|
|
888
|
+
if subtasks:
|
|
889
|
+
# If decomposition happened, the original task becomes a container.
|
|
890
|
+
# We only execute its subtasks.
|
|
891
|
+
self._pending_tasks.extendleft(reversed(subtasks))
|
|
892
|
+
else:
|
|
893
|
+
# If no decomposition, execute the original task.
|
|
894
|
+
self._pending_tasks.append(task)
|
|
890
895
|
self.set_channel(TaskChannel())
|
|
891
896
|
|
|
892
897
|
# Save initial snapshot
|
|
@@ -531,9 +531,10 @@ class FunctionTool:
|
|
|
531
531
|
param_dict = properties[param_name]
|
|
532
532
|
if "description" not in param_dict:
|
|
533
533
|
warnings.warn(
|
|
534
|
-
f"Parameter description is missing "
|
|
535
|
-
f"
|
|
536
|
-
f"
|
|
534
|
+
f"Parameter description is missing for the "
|
|
535
|
+
f"function '{openai_tool_schema['function']['name']}'. "
|
|
536
|
+
f"The parameter definition is {param_dict}. "
|
|
537
|
+
f"This may affect the quality of tool calling."
|
|
537
538
|
)
|
|
538
539
|
|
|
539
540
|
def get_openai_tool_schema(self) -> Dict[str, Any]:
|
|
@@ -15,15 +15,16 @@ from __future__ import annotations
|
|
|
15
15
|
|
|
16
16
|
from typing import Any, Dict, List, Optional
|
|
17
17
|
|
|
18
|
+
from camel.logger import get_logger
|
|
18
19
|
from camel.models import BaseModelBackend
|
|
19
20
|
from camel.toolkits.base import BaseToolkit
|
|
20
21
|
from camel.toolkits.function_tool import FunctionTool
|
|
21
22
|
|
|
22
23
|
from .agent import PlaywrightLLMAgent
|
|
23
|
-
|
|
24
|
-
# session wrapper
|
|
25
24
|
from .nv_browser_session import NVBrowserSession
|
|
26
25
|
|
|
26
|
+
logger = get_logger(__name__)
|
|
27
|
+
|
|
27
28
|
|
|
28
29
|
class BrowserNonVisualToolkit(BaseToolkit):
|
|
29
30
|
r"""A lightweight, *non-visual* browser toolkit exposing primitive
|
|
@@ -52,24 +53,50 @@ class BrowserNonVisualToolkit(BaseToolkit):
|
|
|
52
53
|
self._agent: Optional[PlaywrightLLMAgent] = None
|
|
53
54
|
|
|
54
55
|
def __del__(self):
|
|
55
|
-
r"""
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
56
|
+
r"""Best-effort cleanup when toolkit is garbage collected.
|
|
57
|
+
|
|
58
|
+
1. We *avoid* running during the Python interpreter shutdown phase
|
|
59
|
+
(`sys.is_finalizing()`), because the import machinery and/or event
|
|
60
|
+
loop may already be torn down which leads to noisy exceptions such
|
|
61
|
+
as `ImportError: sys.meta_path is None` or
|
|
62
|
+
`RuntimeError: Event loop is closed`.
|
|
63
|
+
2. We protect all imports and event-loop operations with defensive
|
|
64
|
+
`try/except` blocks. This ensures that, even if cleanup cannot be
|
|
65
|
+
carried out, we silently ignore the failure instead of polluting
|
|
66
|
+
stderr on program exit.
|
|
67
|
+
"""
|
|
59
68
|
try:
|
|
60
|
-
|
|
69
|
+
import sys
|
|
70
|
+
|
|
71
|
+
if getattr(sys, "is_finalizing", lambda: False)():
|
|
72
|
+
return # Skip cleanup during interpreter shutdown
|
|
73
|
+
|
|
74
|
+
import asyncio
|
|
75
|
+
|
|
76
|
+
try:
|
|
77
|
+
loop = asyncio.get_event_loop()
|
|
78
|
+
except RuntimeError:
|
|
79
|
+
# No event loop in current thread → nothing to clean
|
|
80
|
+
return
|
|
81
|
+
|
|
82
|
+
if loop.is_closed():
|
|
83
|
+
# Event loop already closed → cannot run async cleanup
|
|
84
|
+
return
|
|
85
|
+
|
|
61
86
|
if loop.is_running():
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
87
|
+
try:
|
|
88
|
+
task = loop.create_task(self.close_browser())
|
|
89
|
+
del task # Fire-and-forget
|
|
90
|
+
except RuntimeError:
|
|
91
|
+
# Loop is running but not in this thread → ignore
|
|
92
|
+
pass
|
|
65
93
|
else:
|
|
94
|
+
# Own the loop → safe to run
|
|
66
95
|
asyncio.run(self.close_browser())
|
|
67
96
|
except Exception:
|
|
68
|
-
|
|
97
|
+
# Suppress *all* errors during garbage collection
|
|
98
|
+
pass
|
|
69
99
|
|
|
70
|
-
# ------------------------------------------------------------------
|
|
71
|
-
# Internal helpers
|
|
72
|
-
# ------------------------------------------------------------------
|
|
73
100
|
async def _ensure_browser(self):
|
|
74
101
|
await self._session.ensure_browser()
|
|
75
102
|
|
|
@@ -78,28 +105,26 @@ class BrowserNonVisualToolkit(BaseToolkit):
|
|
|
78
105
|
return await self._session.get_page()
|
|
79
106
|
|
|
80
107
|
def _validate_ref(self, ref: str, method_name: str) -> None:
|
|
81
|
-
"""Validate that ref parameter is a non-empty string."""
|
|
108
|
+
r"""Validate that ref parameter is a non-empty string."""
|
|
82
109
|
if not ref or not isinstance(ref, str):
|
|
83
|
-
|
|
110
|
+
logger.error(
|
|
84
111
|
f"{method_name}(): 'ref' must be a non-empty string, "
|
|
85
112
|
f"got: {ref}"
|
|
86
113
|
)
|
|
87
114
|
|
|
88
|
-
# ------------------------------------------------------------------
|
|
89
|
-
# Tool implementations
|
|
90
|
-
# ------------------------------------------------------------------
|
|
91
115
|
async def open_browser(
|
|
92
116
|
self, start_url: Optional[str] = None
|
|
93
117
|
) -> Dict[str, str]:
|
|
94
118
|
r"""Launch a Playwright browser session.
|
|
95
119
|
|
|
96
120
|
Args:
|
|
97
|
-
start_url (Optional[str]):
|
|
98
|
-
|
|
121
|
+
start_url (Optional[str]): Optional URL to navigate to immediately
|
|
122
|
+
after the browser launches. If not provided, the browser will
|
|
123
|
+
not navigate to any URL. (default: :obj:`None`)
|
|
99
124
|
|
|
100
125
|
Returns:
|
|
101
126
|
Dict[str, str]: Keys: ``result`` for action outcome,
|
|
102
|
-
|
|
127
|
+
``snapshot`` for full DOM snapshot.
|
|
103
128
|
"""
|
|
104
129
|
await self._session.ensure_browser()
|
|
105
130
|
if start_url:
|
|
@@ -128,16 +153,15 @@ class BrowserNonVisualToolkit(BaseToolkit):
|
|
|
128
153
|
await self._session.close()
|
|
129
154
|
return "Browser session closed."
|
|
130
155
|
|
|
131
|
-
# Navigation / page state ------------------------------------------------
|
|
132
156
|
async def visit_page(self, url: str) -> Dict[str, str]:
|
|
133
|
-
"""Navigate the current page to the specified URL.
|
|
157
|
+
r"""Navigate the current page to the specified URL.
|
|
134
158
|
|
|
135
159
|
Args:
|
|
136
160
|
url (str): The destination URL.
|
|
137
161
|
|
|
138
162
|
Returns:
|
|
139
163
|
Dict[str, str]: Keys: ``result`` for action outcome,
|
|
140
|
-
|
|
164
|
+
``snapshot`` for full DOM snapshot.
|
|
141
165
|
"""
|
|
142
166
|
if not url or not isinstance(url, str):
|
|
143
167
|
raise ValueError("visit_page(): 'url' must be a non-empty string")
|
|
@@ -155,10 +179,10 @@ class BrowserNonVisualToolkit(BaseToolkit):
|
|
|
155
179
|
|
|
156
180
|
Args:
|
|
157
181
|
force_refresh (bool): When ``True`` always re-generate the
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
diff_only (bool):
|
|
161
|
-
previous snapshot.
|
|
182
|
+
snapshot even if the URL has not changed. (default:
|
|
183
|
+
:obj:`False`)
|
|
184
|
+
diff_only (bool): When ``True`` return only the diff relative to
|
|
185
|
+
the previous snapshot. (default: :obj:`False`)
|
|
162
186
|
|
|
163
187
|
Returns:
|
|
164
188
|
str: Formatted snapshot string.
|
|
@@ -167,13 +191,12 @@ class BrowserNonVisualToolkit(BaseToolkit):
|
|
|
167
191
|
force_refresh=force_refresh, diff_only=diff_only
|
|
168
192
|
)
|
|
169
193
|
|
|
170
|
-
# Element-level wrappers -------------------------------------------------
|
|
171
194
|
async def click(self, *, ref: str) -> Dict[str, str]:
|
|
172
195
|
r"""Click an element identified by ``ref``
|
|
173
196
|
|
|
174
197
|
Args:
|
|
175
|
-
ref (str): Element reference ID extracted from snapshot
|
|
176
|
-
|
|
198
|
+
ref (str): Element reference ID extracted from snapshot
|
|
199
|
+
(e.g.``"e3"``).
|
|
177
200
|
|
|
178
201
|
Returns:
|
|
179
202
|
Dict[str, str]: Result message from ``ActionExecutor``.
|
|
@@ -187,8 +210,8 @@ class BrowserNonVisualToolkit(BaseToolkit):
|
|
|
187
210
|
r"""Type text into an input or textarea element.
|
|
188
211
|
|
|
189
212
|
Args:
|
|
190
|
-
ref (str): Element reference ID extracted from snapshot
|
|
191
|
-
|
|
213
|
+
ref (str): Element reference ID extracted from snapshot.
|
|
214
|
+
(e.g.``"e3"``).
|
|
192
215
|
text (str): The text to enter.
|
|
193
216
|
|
|
194
217
|
Returns:
|
|
@@ -218,67 +241,70 @@ class BrowserNonVisualToolkit(BaseToolkit):
|
|
|
218
241
|
r"""Scroll the page.
|
|
219
242
|
|
|
220
243
|
Args:
|
|
221
|
-
direction (str): ``"down"`` or
|
|
244
|
+
direction (str): Scroll direction, should be ``"down"`` or
|
|
245
|
+
``"up"``.
|
|
222
246
|
amount (int): Pixel distance to scroll.
|
|
223
247
|
|
|
224
248
|
Returns:
|
|
225
249
|
Dict[str, str]: Execution result message.
|
|
226
250
|
"""
|
|
227
251
|
if direction not in ("up", "down"):
|
|
228
|
-
|
|
252
|
+
logger.error("scroll(): 'direction' must be 'up' or 'down'")
|
|
253
|
+
return {
|
|
254
|
+
"result": "scroll() Error: 'direction' must be 'up' or 'down'"
|
|
255
|
+
}
|
|
229
256
|
|
|
230
257
|
action = {"type": "scroll", "direction": direction, "amount": amount}
|
|
231
258
|
return await self._exec_with_snapshot(action)
|
|
232
259
|
|
|
233
|
-
async def
|
|
234
|
-
|
|
235
|
-
) -> Dict[str, str]:
|
|
236
|
-
r"""Explicit wait utility.
|
|
260
|
+
async def enter(self, *, ref: str) -> Dict[str, str]:
|
|
261
|
+
r"""Press the Enter key.
|
|
237
262
|
|
|
238
263
|
Args:
|
|
239
|
-
|
|
240
|
-
selector (Optional[str]): Wait until this CSS selector appears
|
|
241
|
-
in DOM.
|
|
264
|
+
ref (str): Element reference ID to focus before pressing.
|
|
242
265
|
|
|
243
266
|
Returns:
|
|
244
267
|
Dict[str, str]: Execution result message.
|
|
245
268
|
"""
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
action: Dict[str, Any] = {"type": "wait"}
|
|
251
|
-
if timeout_ms is not None:
|
|
252
|
-
action["timeout"] = timeout_ms
|
|
253
|
-
if selector is not None:
|
|
254
|
-
action["selector"] = selector
|
|
269
|
+
self._validate_ref(ref, "enter")
|
|
270
|
+
|
|
271
|
+
action: Dict[str, Any] = {"type": "enter", "ref": ref}
|
|
255
272
|
return await self._exec_with_snapshot(action)
|
|
256
273
|
|
|
257
|
-
async def
|
|
258
|
-
r"""
|
|
274
|
+
async def wait_user(self, *, seconds: float = 1.0) -> Dict[str, str]:
|
|
275
|
+
r"""Pause execution for a given amount of *real* time and then
|
|
276
|
+
return a *full* page snapshot.
|
|
277
|
+
|
|
278
|
+
This is a convenience wrapper around the existing wait action for
|
|
279
|
+
scenarios where you encounter a CAPTCHA or need to pause for manual
|
|
280
|
+
user input, and want to retrieve the complete DOM snapshot afterward.
|
|
259
281
|
|
|
260
282
|
Args:
|
|
261
|
-
|
|
283
|
+
seconds (float): How long to sleep, expressed in seconds. Must
|
|
284
|
+
be a positive number. (default: :obj:`1.0`)
|
|
262
285
|
|
|
263
286
|
Returns:
|
|
264
|
-
Dict[str, str]:
|
|
287
|
+
Dict[str, str]: Keys ``result`` and ``snapshot``.
|
|
265
288
|
"""
|
|
266
|
-
|
|
267
|
-
|
|
289
|
+
if seconds is None or seconds <= 0:
|
|
290
|
+
logger.error("wait_time(): 'seconds' must be a positive number")
|
|
291
|
+
return {
|
|
292
|
+
"result": "wait_time(): 'seconds' must be a positive number"
|
|
293
|
+
}
|
|
268
294
|
|
|
269
|
-
|
|
270
|
-
|
|
295
|
+
# Reuse underlying ActionExecutor's ``wait`` implementation (expects
|
|
296
|
+
# ms)
|
|
297
|
+
timeout_ms = int(seconds * 1000)
|
|
298
|
+
action: Dict[str, Any] = {"type": "wait", "timeout": timeout_ms}
|
|
271
299
|
|
|
272
|
-
|
|
273
|
-
|
|
300
|
+
# Execute the sleep via ActionExecutor (no snapshot diff expected)
|
|
301
|
+
result = await self._exec(action)
|
|
274
302
|
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
action: Dict[str, Any] = {"type": "enter", "ref": ref}
|
|
281
|
-
return await self._exec_with_snapshot(action)
|
|
303
|
+
# Always return a *full* snapshot after the pause
|
|
304
|
+
snapshot = await self._session.get_snapshot(
|
|
305
|
+
force_refresh=True, diff_only=False
|
|
306
|
+
)
|
|
307
|
+
return {"result": result, "snapshot": snapshot}
|
|
282
308
|
|
|
283
309
|
# Helper to run through ActionExecutor
|
|
284
310
|
async def _exec(self, action: Dict[str, Any]) -> str:
|
|
@@ -308,9 +334,6 @@ class BrowserNonVisualToolkit(BaseToolkit):
|
|
|
308
334
|
|
|
309
335
|
return {"result": result, "snapshot": diff}
|
|
310
336
|
|
|
311
|
-
# ------------------------------------------------------------------
|
|
312
|
-
# Optional PlaywrightLLMAgent helpers
|
|
313
|
-
# ------------------------------------------------------------------
|
|
314
337
|
def _ensure_agent(self) -> PlaywrightLLMAgent:
|
|
315
338
|
r"""Create PlaywrightLLMAgent on first use if `web_agent_model`
|
|
316
339
|
provided."""
|
|
@@ -332,29 +355,34 @@ class BrowserNonVisualToolkit(BaseToolkit):
|
|
|
332
355
|
self, task_prompt: str, start_url: str, max_steps: int = 15
|
|
333
356
|
) -> str:
|
|
334
357
|
r"""Use LLM agent to autonomously complete the task (requires
|
|
335
|
-
`web_agent_model`).
|
|
358
|
+
`web_agent_model`).
|
|
359
|
+
|
|
360
|
+
Args:
|
|
361
|
+
task_prompt (str): The task prompt to complete.
|
|
362
|
+
start_url (str): The URL to navigate to.
|
|
363
|
+
max_steps (int): The maximum number of steps to take.
|
|
364
|
+
(default: :obj:`15`)
|
|
365
|
+
|
|
366
|
+
Returns:
|
|
367
|
+
str: The result of the task.
|
|
368
|
+
"""
|
|
336
369
|
|
|
337
370
|
agent = self._ensure_agent()
|
|
338
371
|
await agent.navigate(start_url)
|
|
339
372
|
await agent.process_command(task_prompt, max_steps=max_steps)
|
|
340
373
|
return "Task processing finished - see stdout for detailed trace."
|
|
341
374
|
|
|
342
|
-
# ------------------------------------------------------------------
|
|
343
|
-
# Toolkit registration
|
|
344
|
-
# ------------------------------------------------------------------
|
|
345
375
|
def get_tools(self) -> List[FunctionTool]:
|
|
346
376
|
base_tools = [
|
|
347
377
|
FunctionTool(self.open_browser),
|
|
348
378
|
FunctionTool(self.close_browser),
|
|
349
379
|
FunctionTool(self.visit_page),
|
|
350
|
-
FunctionTool(self.get_page_snapshot),
|
|
351
380
|
FunctionTool(self.click),
|
|
352
381
|
FunctionTool(self.type),
|
|
353
382
|
FunctionTool(self.select),
|
|
354
383
|
FunctionTool(self.scroll),
|
|
355
|
-
FunctionTool(self.wait),
|
|
356
|
-
FunctionTool(self.extract),
|
|
357
384
|
FunctionTool(self.enter),
|
|
385
|
+
FunctionTool(self.wait_user),
|
|
358
386
|
]
|
|
359
387
|
|
|
360
388
|
if self.web_agent_model is not None:
|
|
@@ -55,10 +55,23 @@ class NVBrowserSession:
|
|
|
55
55
|
self.snapshot: Optional[PageSnapshot] = None
|
|
56
56
|
self.executor: Optional[ActionExecutor] = None
|
|
57
57
|
|
|
58
|
+
# Protect browser initialisation against concurrent calls
|
|
59
|
+
import asyncio
|
|
60
|
+
|
|
61
|
+
self._ensure_lock: "asyncio.Lock" = asyncio.Lock()
|
|
62
|
+
|
|
58
63
|
# ------------------------------------------------------------------
|
|
59
64
|
# Browser lifecycle helpers
|
|
60
65
|
# ------------------------------------------------------------------
|
|
61
66
|
async def ensure_browser(self) -> None:
|
|
67
|
+
# Serialise initialisation to avoid race conditions where multiple
|
|
68
|
+
# concurrent coroutine calls create multiple browser instances for
|
|
69
|
+
# the same NVBrowserSession.
|
|
70
|
+
async with self._ensure_lock:
|
|
71
|
+
await self._ensure_browser_inner()
|
|
72
|
+
|
|
73
|
+
# Moved original logic to helper
|
|
74
|
+
async def _ensure_browser_inner(self) -> None:
|
|
62
75
|
from playwright.async_api import async_playwright
|
|
63
76
|
|
|
64
77
|
if self._page is not None:
|
|
@@ -80,12 +93,27 @@ class NVBrowserSession:
|
|
|
80
93
|
self._browser = await pl.chromium.launch(headless=self._headless)
|
|
81
94
|
self._context = await self._browser.new_context()
|
|
82
95
|
|
|
96
|
+
from camel.logger import get_logger
|
|
97
|
+
|
|
98
|
+
_dbg_logger = get_logger(__name__)
|
|
99
|
+
|
|
83
100
|
# Reuse an already open page (persistent context may restore last
|
|
84
101
|
# session)
|
|
85
102
|
if self._context.pages:
|
|
86
103
|
self._page = self._context.pages[0]
|
|
87
104
|
else:
|
|
88
105
|
self._page = await self._context.new_page()
|
|
106
|
+
|
|
107
|
+
# Debug information to help trace concurrency issues
|
|
108
|
+
_dbg_logger.debug(
|
|
109
|
+
"Session %s created browser=%s context=%s page=%s (url=%s)",
|
|
110
|
+
hex(id(self)),
|
|
111
|
+
hex(id(self._browser)) if self._browser else None,
|
|
112
|
+
hex(id(self._context)) if self._context else None,
|
|
113
|
+
hex(id(self._page)),
|
|
114
|
+
self._page.url if self._page else "<none>",
|
|
115
|
+
)
|
|
116
|
+
|
|
89
117
|
# helpers
|
|
90
118
|
self.snapshot = PageSnapshot(self._page)
|
|
91
119
|
self.executor = ActionExecutor(self._page)
|
{camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/toolkits/non_visual_browser_toolkit/snapshot.py
RENAMED
|
@@ -99,16 +99,65 @@ class PageSnapshot:
|
|
|
99
99
|
_snapshot_js_cache: Optional[str] = None # class-level cache
|
|
100
100
|
|
|
101
101
|
async def _get_snapshot_direct(self) -> Optional[str]:
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
102
|
+
r"""Evaluate the snapshot-extraction JS with simple retry logic.
|
|
103
|
+
|
|
104
|
+
Playwright throws *Execution context was destroyed* when a new page
|
|
105
|
+
navigation happens between scheduling and evaluating the JS. In that
|
|
106
|
+
case we retry a few times after waiting for the next DOMContentLoaded
|
|
107
|
+
event; for all other exceptions we abort immediately.
|
|
108
|
+
"""
|
|
109
|
+
|
|
110
|
+
# Load JS once and cache it at class level
|
|
111
|
+
if PageSnapshot._snapshot_js_cache is None:
|
|
112
|
+
js_path = Path(__file__).parent / "snapshot.js"
|
|
113
|
+
PageSnapshot._snapshot_js_cache = js_path.read_text(
|
|
114
|
+
encoding="utf-8"
|
|
115
|
+
)
|
|
116
|
+
|
|
117
|
+
js_code = PageSnapshot._snapshot_js_cache
|
|
118
|
+
|
|
119
|
+
retries: int = 3
|
|
120
|
+
while retries > 0:
|
|
121
|
+
try:
|
|
122
|
+
return await self.page.evaluate(js_code)
|
|
123
|
+
except Exception as e:
|
|
124
|
+
msg = str(e)
|
|
125
|
+
|
|
126
|
+
# Typical error when navigation happens between calls
|
|
127
|
+
nav_err = "Execution context was destroyed"
|
|
128
|
+
|
|
129
|
+
if (
|
|
130
|
+
nav_err in msg
|
|
131
|
+
or "Most likely because of a navigation" in msg
|
|
132
|
+
):
|
|
133
|
+
retries -= 1
|
|
134
|
+
logger.debug(
|
|
135
|
+
"Snapshot evaluate failed due to navigation; "
|
|
136
|
+
"retrying (%d left)…",
|
|
137
|
+
retries,
|
|
138
|
+
)
|
|
139
|
+
|
|
140
|
+
# Wait for next DOM stability before retrying
|
|
141
|
+
try:
|
|
142
|
+
await self.page.wait_for_load_state(
|
|
143
|
+
"domcontentloaded", timeout=self.MAX_TIMEOUT_MS
|
|
144
|
+
)
|
|
145
|
+
except Exception:
|
|
146
|
+
# Even if waiting fails, attempt retry to give it
|
|
147
|
+
# one more chance
|
|
148
|
+
pass
|
|
149
|
+
|
|
150
|
+
continue # retry the evaluate()
|
|
151
|
+
|
|
152
|
+
# Any other exception → abort
|
|
153
|
+
logger.warning(
|
|
154
|
+
"Failed to execute snapshot JavaScript: %s",
|
|
155
|
+
e,
|
|
107
156
|
)
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
157
|
+
return None
|
|
158
|
+
|
|
159
|
+
logger.warning("Failed to execute snapshot JavaScript after retries")
|
|
160
|
+
return None
|
|
112
161
|
|
|
113
162
|
@staticmethod
|
|
114
163
|
def _format_snapshot(text: str) -> str:
|