camel-ai 0.2.59__py3-none-any.whl → 0.2.82__py3-none-any.whl
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/__init__.py +3 -3
- camel/agents/__init__.py +2 -2
- camel/agents/_types.py +9 -4
- camel/agents/_utils.py +40 -2
- camel/agents/base.py +2 -2
- camel/agents/chat_agent.py +5012 -902
- camel/agents/critic_agent.py +2 -2
- camel/agents/deductive_reasoner_agent.py +56 -56
- camel/agents/embodied_agent.py +2 -2
- camel/agents/knowledge_graph_agent.py +20 -20
- camel/agents/mcp_agent.py +39 -36
- camel/agents/multi_hop_generator_agent.py +3 -3
- camel/agents/programmed_agent_instruction.py +2 -2
- camel/agents/repo_agent.py +4 -3
- camel/agents/role_assignment_agent.py +2 -2
- camel/agents/search_agent.py +2 -2
- camel/agents/task_agent.py +2 -2
- camel/agents/tool_agents/__init__.py +2 -2
- camel/agents/tool_agents/base.py +2 -2
- camel/agents/tool_agents/hugging_face_tool_agent.py +3 -3
- camel/benchmarks/__init__.py +2 -2
- camel/benchmarks/apibank.py +5 -5
- camel/benchmarks/apibench.py +2 -2
- camel/benchmarks/base.py +2 -2
- camel/benchmarks/browsecomp.py +44 -33
- camel/benchmarks/gaia.py +17 -13
- camel/benchmarks/mock_website/README.md +94 -0
- camel/benchmarks/mock_website/mock_web.py +299 -0
- camel/benchmarks/mock_website/requirements.txt +3 -0
- camel/benchmarks/mock_website/shopping_mall/app.py +465 -0
- camel/benchmarks/mock_website/task.json +104 -0
- camel/benchmarks/nexus.py +3 -3
- camel/benchmarks/ragbench.py +2 -2
- camel/bots/__init__.py +2 -2
- camel/bots/discord/__init__.py +2 -2
- camel/bots/discord/discord_app.py +2 -2
- camel/bots/discord/discord_installation.py +2 -2
- camel/bots/discord/discord_store.py +3 -3
- camel/bots/slack/__init__.py +2 -2
- camel/bots/slack/models.py +4 -4
- camel/bots/slack/slack_app.py +2 -2
- camel/bots/telegram_bot.py +2 -2
- camel/configs/__init__.py +26 -2
- camel/configs/aihubmix_config.py +90 -0
- camel/configs/aiml_config.py +2 -2
- camel/configs/amd_config.py +70 -0
- camel/configs/anthropic_config.py +8 -7
- camel/configs/base_config.py +2 -2
- camel/configs/bedrock_config.py +5 -3
- camel/configs/cerebras_config.py +98 -0
- camel/configs/cohere_config.py +3 -3
- camel/configs/cometapi_config.py +106 -0
- camel/configs/crynux_config.py +94 -0
- camel/configs/deepseek_config.py +9 -8
- camel/configs/gemini_config.py +6 -4
- camel/configs/groq_config.py +6 -4
- camel/configs/internlm_config.py +6 -4
- camel/configs/litellm_config.py +2 -2
- camel/configs/lmstudio_config.py +6 -4
- camel/configs/minimax_config.py +95 -0
- camel/configs/mistral_config.py +3 -3
- camel/configs/modelscope_config.py +5 -3
- camel/configs/moonshot_config.py +2 -2
- camel/configs/nebius_config.py +105 -0
- camel/configs/netmind_config.py +2 -2
- camel/configs/novita_config.py +2 -2
- camel/configs/nvidia_config.py +2 -2
- camel/configs/ollama_config.py +2 -2
- camel/configs/openai_config.py +8 -3
- camel/configs/openrouter_config.py +6 -4
- camel/configs/ppio_config.py +2 -2
- camel/configs/qianfan_config.py +85 -0
- camel/configs/qwen_config.py +2 -2
- camel/configs/reka_config.py +3 -3
- camel/configs/samba_config.py +8 -6
- camel/configs/sglang_config.py +2 -2
- camel/configs/siliconflow_config.py +2 -2
- camel/configs/togetherai_config.py +2 -2
- camel/configs/vllm_config.py +4 -2
- camel/configs/watsonx_config.py +2 -2
- camel/configs/yi_config.py +6 -4
- camel/configs/zhipuai_config.py +6 -4
- camel/{data_collector → data_collectors}/__init__.py +2 -2
- camel/{data_collector → data_collectors}/alpaca_collector.py +19 -10
- camel/{data_collector → data_collectors}/base.py +2 -2
- camel/{data_collector → data_collectors}/sharegpt_collector.py +3 -3
- camel/datagen/__init__.py +2 -2
- camel/datagen/cot_datagen.py +32 -37
- camel/datagen/evol_instruct/__init__.py +2 -2
- camel/datagen/evol_instruct/evol_instruct.py +2 -2
- camel/datagen/evol_instruct/scorer.py +24 -25
- camel/datagen/evol_instruct/templates.py +48 -48
- camel/datagen/self_improving_cot.py +5 -5
- camel/datagen/self_instruct/__init__.py +2 -2
- camel/datagen/self_instruct/filter/__init__.py +2 -2
- camel/datagen/self_instruct/filter/filter_function.py +2 -2
- camel/datagen/self_instruct/filter/filter_registry.py +2 -2
- camel/datagen/self_instruct/filter/instruction_filter.py +2 -2
- camel/datagen/self_instruct/self_instruct.py +2 -2
- camel/datagen/self_instruct/templates.py +47 -47
- camel/datagen/source2synth/__init__.py +2 -2
- camel/datagen/source2synth/data_processor.py +2 -2
- camel/datagen/source2synth/models.py +2 -2
- camel/datagen/source2synth/user_data_processor_config.py +2 -2
- camel/datahubs/__init__.py +2 -2
- camel/datahubs/base.py +2 -2
- camel/datahubs/huggingface.py +2 -2
- camel/datahubs/models.py +2 -2
- camel/datasets/__init__.py +2 -2
- camel/datasets/base_generator.py +41 -12
- camel/datasets/few_shot_generator.py +18 -18
- camel/datasets/models.py +3 -3
- camel/datasets/self_instruct_generator.py +2 -2
- camel/datasets/static_dataset.py +152 -2
- camel/embeddings/__init__.py +2 -2
- camel/embeddings/azure_embedding.py +2 -2
- camel/embeddings/base.py +2 -2
- camel/embeddings/gemini_embedding.py +2 -2
- camel/embeddings/jina_embedding.py +10 -3
- camel/embeddings/mistral_embedding.py +2 -2
- camel/embeddings/openai_compatible_embedding.py +2 -2
- camel/embeddings/openai_embedding.py +2 -2
- camel/embeddings/sentence_transformers_embeddings.py +4 -4
- camel/embeddings/together_embedding.py +2 -2
- camel/embeddings/vlm_embedding.py +11 -4
- camel/environments/__init__.py +14 -2
- camel/environments/models.py +2 -2
- camel/environments/multi_step.py +2 -2
- camel/environments/rlcards_env.py +860 -0
- camel/environments/single_step.py +30 -5
- camel/environments/tic_tac_toe.py +3 -3
- camel/extractors/__init__.py +2 -2
- camel/extractors/base.py +2 -2
- camel/extractors/python_strategies.py +2 -2
- camel/generators.py +2 -2
- camel/human.py +2 -2
- camel/interpreters/__init__.py +4 -2
- camel/interpreters/base.py +16 -3
- camel/interpreters/docker/Dockerfile +53 -7
- camel/interpreters/docker_interpreter.py +70 -11
- camel/interpreters/e2b_interpreter.py +59 -11
- camel/interpreters/internal_python_interpreter.py +81 -4
- camel/interpreters/interpreter_error.py +2 -2
- camel/interpreters/ipython_interpreter.py +23 -5
- camel/interpreters/microsandbox_interpreter.py +395 -0
- camel/interpreters/subprocess_interpreter.py +36 -4
- camel/loaders/__init__.py +17 -5
- camel/loaders/apify_reader.py +2 -2
- camel/loaders/base_io.py +2 -2
- camel/loaders/base_loader.py +85 -0
- camel/loaders/chunkr_reader.py +128 -93
- camel/loaders/crawl4ai_reader.py +2 -2
- camel/loaders/firecrawl_reader.py +6 -6
- camel/loaders/jina_url_reader.py +2 -2
- camel/loaders/markitdown.py +2 -2
- camel/loaders/mineru_extractor.py +2 -2
- camel/loaders/mistral_reader.py +148 -0
- camel/loaders/scrapegraph_reader.py +2 -2
- camel/loaders/unstructured_io.py +2 -2
- camel/logger.py +5 -5
- camel/memories/__init__.py +2 -2
- camel/memories/agent_memories.py +86 -3
- camel/memories/base.py +36 -2
- camel/memories/blocks/__init__.py +2 -2
- camel/memories/blocks/chat_history_block.py +126 -9
- camel/memories/blocks/vectordb_block.py +10 -3
- camel/memories/context_creators/__init__.py +2 -2
- camel/memories/context_creators/score_based.py +31 -239
- camel/memories/records.py +98 -13
- camel/messages/__init__.py +2 -2
- camel/messages/base.py +193 -46
- camel/messages/conversion/__init__.py +2 -2
- camel/messages/conversion/alpaca.py +2 -2
- camel/messages/conversion/conversation_models.py +2 -2
- camel/messages/conversion/sharegpt/__init__.py +2 -2
- camel/messages/conversion/sharegpt/function_call_formatter.py +2 -2
- camel/messages/conversion/sharegpt/hermes/__init__.py +2 -2
- camel/messages/conversion/sharegpt/hermes/hermes_function_formatter.py +2 -2
- camel/messages/func_message.py +54 -17
- camel/models/__init__.py +18 -2
- camel/models/_utils.py +3 -3
- camel/models/aihubmix_model.py +83 -0
- camel/models/aiml_model.py +11 -18
- camel/models/amd_model.py +101 -0
- camel/models/anthropic_model.py +127 -20
- camel/models/aws_bedrock_model.py +12 -35
- camel/models/azure_openai_model.py +263 -63
- camel/models/base_audio_model.py +5 -3
- camel/models/base_model.py +195 -26
- camel/models/cerebras_model.py +83 -0
- camel/models/cohere_model.py +81 -21
- camel/models/cometapi_model.py +83 -0
- camel/models/crynux_model.py +87 -0
- camel/models/deepseek_model.py +61 -59
- camel/models/fish_audio_model.py +8 -2
- camel/models/gemini_model.py +439 -30
- camel/models/groq_model.py +11 -19
- camel/models/internlm_model.py +11 -18
- camel/models/litellm_model.py +94 -34
- camel/models/lmstudio_model.py +17 -20
- camel/models/minimax_model.py +83 -0
- camel/models/mistral_model.py +84 -19
- camel/models/model_factory.py +49 -6
- camel/models/model_manager.py +33 -11
- camel/models/modelscope_model.py +13 -193
- camel/models/moonshot_model.py +195 -21
- camel/models/nebius_model.py +83 -0
- camel/models/nemotron_model.py +19 -9
- camel/models/netmind_model.py +11 -18
- camel/models/novita_model.py +11 -18
- camel/models/nvidia_model.py +11 -18
- camel/models/ollama_model.py +14 -21
- camel/models/openai_audio_models.py +2 -2
- camel/models/openai_compatible_model.py +234 -27
- camel/models/openai_model.py +255 -39
- camel/models/openrouter_model.py +11 -19
- camel/models/ppio_model.py +11 -18
- camel/models/qianfan_model.py +89 -0
- camel/models/qwen_model.py +13 -193
- camel/models/reka_model.py +90 -21
- camel/models/reward/__init__.py +2 -2
- camel/models/reward/base_reward_model.py +2 -2
- camel/models/reward/evaluator.py +2 -2
- camel/models/reward/nemotron_model.py +2 -2
- camel/models/reward/skywork_model.py +2 -2
- camel/models/samba_model.py +117 -49
- camel/models/sglang_model.py +162 -42
- camel/models/siliconflow_model.py +12 -35
- camel/models/stub_model.py +10 -7
- camel/models/togetherai_model.py +11 -18
- camel/models/vllm_model.py +10 -18
- camel/models/volcano_model.py +16 -20
- camel/models/watsonx_model.py +69 -19
- camel/models/yi_model.py +11 -18
- camel/models/zhipuai_model.py +70 -18
- camel/parsers/__init__.py +18 -0
- camel/parsers/mcp_tool_call_parser.py +176 -0
- camel/personas/__init__.py +2 -2
- camel/personas/persona.py +2 -2
- camel/personas/persona_hub.py +2 -2
- camel/prompts/__init__.py +2 -2
- camel/prompts/ai_society.py +2 -2
- camel/prompts/base.py +2 -2
- camel/prompts/code.py +2 -2
- camel/prompts/evaluation.py +2 -2
- camel/prompts/generate_text_embedding_data.py +2 -2
- camel/prompts/image_craft.py +2 -2
- camel/prompts/misalignment.py +2 -2
- camel/prompts/multi_condition_image_craft.py +2 -2
- camel/prompts/object_recognition.py +2 -2
- camel/prompts/persona_hub.py +3 -3
- camel/prompts/prompt_templates.py +2 -2
- camel/prompts/role_description_prompt_template.py +2 -2
- camel/prompts/solution_extraction.py +8 -8
- camel/prompts/task_prompt_template.py +2 -2
- camel/prompts/translation.py +2 -2
- camel/prompts/video_description_prompt.py +3 -3
- camel/responses/__init__.py +2 -2
- camel/responses/agent_responses.py +2 -2
- camel/retrievers/__init__.py +2 -2
- camel/retrievers/auto_retriever.py +23 -3
- camel/retrievers/base.py +2 -2
- camel/retrievers/bm25_retriever.py +3 -4
- camel/retrievers/cohere_rerank_retriever.py +2 -2
- camel/retrievers/hybrid_retrival.py +4 -4
- camel/retrievers/vector_retriever.py +2 -2
- camel/runtimes/Dockerfile.multi-toolkit +90 -0
- camel/{runtime → runtimes}/__init__.py +2 -2
- camel/runtimes/api.py +153 -0
- camel/{runtime → runtimes}/base.py +2 -2
- camel/{runtime → runtimes}/configs.py +13 -13
- camel/{runtime → runtimes}/daytona_runtime.py +18 -19
- camel/{runtime → runtimes}/docker_runtime.py +13 -13
- camel/{runtime → runtimes}/llm_guard_runtime.py +28 -28
- camel/{runtime → runtimes}/remote_http_runtime.py +12 -12
- camel/{runtime → runtimes}/ubuntu_docker_runtime.py +3 -3
- camel/{runtime → runtimes}/utils/__init__.py +2 -2
- camel/{runtime → runtimes}/utils/function_risk_toolkit.py +2 -2
- camel/{runtime → runtimes}/utils/ignore_risk_toolkit.py +2 -2
- camel/schemas/__init__.py +2 -2
- camel/schemas/base.py +2 -2
- camel/schemas/openai_converter.py +3 -3
- camel/schemas/outlines_converter.py +2 -2
- camel/services/agent_openapi_server.py +380 -0
- camel/societies/__init__.py +4 -2
- camel/societies/babyagi_playing.py +2 -2
- camel/societies/role_playing.py +201 -80
- camel/societies/workforce/__init__.py +10 -3
- camel/societies/workforce/base.py +9 -5
- camel/societies/workforce/events.py +143 -0
- camel/societies/workforce/prompts.py +258 -33
- camel/societies/workforce/role_playing_worker.py +95 -30
- camel/societies/workforce/single_agent_worker.py +659 -30
- camel/societies/workforce/structured_output_handler.py +512 -0
- camel/societies/workforce/task_channel.py +182 -38
- camel/societies/workforce/utils.py +784 -18
- camel/societies/workforce/worker.py +96 -28
- camel/societies/workforce/workflow_memory_manager.py +1746 -0
- camel/societies/workforce/workforce.py +5730 -366
- camel/societies/workforce/workforce_callback.py +103 -0
- camel/societies/workforce/workforce_logger.py +647 -0
- camel/societies/workforce/workforce_metrics.py +33 -0
- camel/storages/__init__.py +10 -2
- camel/storages/graph_storages/__init__.py +2 -2
- camel/storages/graph_storages/base.py +2 -2
- camel/storages/graph_storages/graph_element.py +2 -2
- camel/storages/graph_storages/nebula_graph.py +4 -4
- camel/storages/graph_storages/neo4j_graph.py +7 -7
- camel/storages/key_value_storages/__init__.py +2 -2
- camel/storages/key_value_storages/base.py +2 -2
- camel/storages/key_value_storages/in_memory.py +2 -2
- camel/storages/key_value_storages/json.py +17 -4
- camel/storages/key_value_storages/mem0_cloud.py +50 -49
- camel/storages/key_value_storages/redis.py +2 -2
- camel/storages/object_storages/__init__.py +2 -2
- camel/storages/object_storages/amazon_s3.py +2 -2
- camel/storages/object_storages/azure_blob.py +2 -2
- camel/storages/object_storages/base.py +2 -2
- camel/storages/object_storages/google_cloud.py +3 -3
- camel/storages/vectordb_storages/__init__.py +12 -2
- camel/storages/vectordb_storages/base.py +2 -2
- camel/storages/vectordb_storages/chroma.py +731 -0
- camel/storages/vectordb_storages/faiss.py +712 -0
- camel/storages/vectordb_storages/milvus.py +2 -2
- camel/storages/vectordb_storages/oceanbase.py +16 -17
- camel/storages/vectordb_storages/pgvector.py +349 -0
- camel/storages/vectordb_storages/qdrant.py +6 -6
- camel/storages/vectordb_storages/surreal.py +372 -0
- camel/storages/vectordb_storages/tidb.py +11 -8
- camel/storages/vectordb_storages/weaviate.py +714 -0
- camel/tasks/__init__.py +2 -2
- camel/tasks/task.py +366 -27
- camel/tasks/task_prompt.py +3 -3
- camel/terminators/__init__.py +2 -2
- camel/terminators/base.py +2 -2
- camel/terminators/response_terminator.py +2 -2
- camel/terminators/token_limit_terminator.py +2 -2
- camel/toolkits/__init__.py +58 -10
- camel/toolkits/aci_toolkit.py +66 -21
- camel/toolkits/arxiv_toolkit.py +8 -8
- camel/toolkits/ask_news_toolkit.py +2 -2
- camel/toolkits/async_browser_toolkit.py +174 -575
- camel/toolkits/audio_analysis_toolkit.py +3 -3
- camel/toolkits/base.py +65 -7
- camel/toolkits/bohrium_toolkit.py +318 -0
- camel/toolkits/browser_toolkit.py +306 -566
- camel/toolkits/browser_toolkit_commons.py +568 -0
- camel/toolkits/code_execution.py +67 -11
- camel/toolkits/context_summarizer_toolkit.py +684 -0
- camel/toolkits/craw4ai_toolkit.py +93 -0
- camel/toolkits/dappier_toolkit.py +12 -8
- camel/toolkits/data_commons_toolkit.py +2 -2
- camel/toolkits/dingtalk.py +1135 -0
- camel/toolkits/earth_science_toolkit.py +5367 -0
- camel/toolkits/edgeone_pages_mcp_toolkit.py +49 -0
- camel/toolkits/excel_toolkit.py +910 -70
- camel/toolkits/file_toolkit.py +1402 -0
- camel/toolkits/function_tool.py +128 -20
- camel/toolkits/github_toolkit.py +148 -43
- camel/toolkits/gmail_toolkit.py +1839 -0
- camel/toolkits/google_calendar_toolkit.py +40 -6
- camel/toolkits/google_drive_mcp_toolkit.py +54 -0
- camel/toolkits/google_maps_toolkit.py +2 -2
- camel/toolkits/google_scholar_toolkit.py +2 -2
- camel/toolkits/human_toolkit.py +36 -12
- camel/toolkits/hybrid_browser_toolkit/__init__.py +18 -0
- camel/toolkits/hybrid_browser_toolkit/config_loader.py +185 -0
- camel/toolkits/hybrid_browser_toolkit/hybrid_browser_toolkit.py +246 -0
- camel/toolkits/hybrid_browser_toolkit/hybrid_browser_toolkit_ts.py +1973 -0
- camel/toolkits/hybrid_browser_toolkit/installer.py +203 -0
- camel/toolkits/hybrid_browser_toolkit/ts/package-lock.json +4589 -0
- camel/toolkits/hybrid_browser_toolkit/ts/package.json +33 -0
- camel/toolkits/hybrid_browser_toolkit/ts/src/browser-scripts.js +125 -0
- camel/toolkits/hybrid_browser_toolkit/ts/src/browser-session.ts +1929 -0
- camel/toolkits/hybrid_browser_toolkit/ts/src/config-loader.ts +233 -0
- camel/toolkits/hybrid_browser_toolkit/ts/src/hybrid-browser-toolkit.ts +589 -0
- camel/toolkits/hybrid_browser_toolkit/ts/src/index.ts +7 -0
- camel/toolkits/hybrid_browser_toolkit/ts/src/parent-child-filter.ts +226 -0
- camel/toolkits/hybrid_browser_toolkit/ts/src/snapshot-parser.ts +219 -0
- camel/toolkits/hybrid_browser_toolkit/ts/src/som-screenshot-injected.ts +543 -0
- camel/toolkits/hybrid_browser_toolkit/ts/src/types.ts +129 -0
- camel/toolkits/hybrid_browser_toolkit/ts/tsconfig.json +27 -0
- camel/toolkits/hybrid_browser_toolkit/ts/websocket-server.js +319 -0
- camel/toolkits/hybrid_browser_toolkit/ws_wrapper.py +1037 -0
- camel/toolkits/hybrid_browser_toolkit_py/__init__.py +17 -0
- camel/toolkits/hybrid_browser_toolkit_py/actions.py +575 -0
- camel/toolkits/hybrid_browser_toolkit_py/agent.py +311 -0
- camel/toolkits/hybrid_browser_toolkit_py/browser_session.py +787 -0
- camel/toolkits/hybrid_browser_toolkit_py/config_loader.py +490 -0
- camel/toolkits/hybrid_browser_toolkit_py/hybrid_browser_toolkit.py +2390 -0
- camel/toolkits/hybrid_browser_toolkit_py/snapshot.py +233 -0
- camel/toolkits/hybrid_browser_toolkit_py/stealth_script.js +0 -0
- camel/toolkits/hybrid_browser_toolkit_py/unified_analyzer.js +1043 -0
- camel/toolkits/image_analysis_toolkit.py +3 -3
- camel/toolkits/image_generation_toolkit.py +390 -0
- camel/toolkits/jina_reranker_toolkit.py +195 -79
- camel/toolkits/klavis_toolkit.py +7 -3
- camel/toolkits/linkedin_toolkit.py +2 -2
- camel/toolkits/markitdown_toolkit.py +104 -0
- camel/toolkits/math_toolkit.py +66 -12
- camel/toolkits/mcp_toolkit.py +841 -600
- camel/toolkits/memory_toolkit.py +7 -3
- camel/toolkits/meshy_toolkit.py +2 -2
- camel/toolkits/message_agent_toolkit.py +608 -0
- camel/toolkits/message_integration.py +724 -0
- camel/toolkits/mineru_toolkit.py +2 -2
- camel/toolkits/minimax_mcp_toolkit.py +195 -0
- camel/toolkits/networkx_toolkit.py +2 -2
- camel/toolkits/note_taking_toolkit.py +277 -0
- camel/toolkits/notion_mcp_toolkit.py +224 -0
- camel/toolkits/notion_toolkit.py +2 -2
- camel/toolkits/open_api_specs/biztoc/__init__.py +2 -2
- camel/toolkits/open_api_specs/biztoc/ai-plugin.json +1 -1
- camel/toolkits/open_api_specs/coursera/__init__.py +2 -2
- camel/toolkits/open_api_specs/create_qr_code/__init__.py +2 -2
- camel/toolkits/open_api_specs/klarna/__init__.py +2 -2
- camel/toolkits/open_api_specs/nasa_apod/__init__.py +2 -2
- camel/toolkits/open_api_specs/outschool/__init__.py +2 -2
- camel/toolkits/open_api_specs/outschool/ai-plugin.json +1 -1
- camel/toolkits/open_api_specs/outschool/openapi.yaml +1 -1
- camel/toolkits/open_api_specs/outschool/paths/__init__.py +2 -2
- camel/toolkits/open_api_specs/outschool/paths/get_classes.py +2 -2
- camel/toolkits/open_api_specs/outschool/paths/search_teachers.py +2 -2
- camel/toolkits/open_api_specs/security_config.py +2 -2
- camel/toolkits/open_api_specs/speak/__init__.py +2 -2
- camel/toolkits/open_api_specs/web_scraper/__init__.py +2 -2
- camel/toolkits/open_api_specs/web_scraper/ai-plugin.json +1 -1
- camel/toolkits/open_api_specs/web_scraper/paths/__init__.py +2 -2
- camel/toolkits/open_api_specs/web_scraper/paths/scraper.py +2 -2
- camel/toolkits/open_api_toolkit.py +2 -2
- camel/toolkits/openbb_toolkit.py +7 -3
- camel/toolkits/origene_mcp_toolkit.py +56 -0
- camel/toolkits/page_script.js +86 -74
- camel/toolkits/playwright_mcp_toolkit.py +27 -32
- camel/toolkits/pptx_toolkit.py +790 -0
- camel/toolkits/pubmed_toolkit.py +2 -2
- camel/toolkits/pulse_mcp_search_toolkit.py +2 -2
- camel/toolkits/pyautogui_toolkit.py +2 -2
- camel/toolkits/reddit_toolkit.py +2 -2
- camel/toolkits/resend_toolkit.py +168 -0
- camel/toolkits/retrieval_toolkit.py +2 -2
- camel/toolkits/screenshot_toolkit.py +213 -0
- camel/toolkits/search_toolkit.py +539 -146
- camel/toolkits/searxng_toolkit.py +2 -2
- camel/toolkits/semantic_scholar_toolkit.py +2 -2
- camel/toolkits/slack_toolkit.py +108 -58
- camel/toolkits/sql_toolkit.py +712 -0
- camel/toolkits/stripe_toolkit.py +2 -2
- camel/toolkits/sympy_toolkit.py +3 -3
- camel/toolkits/task_planning_toolkit.py +134 -0
- camel/toolkits/terminal_toolkit/__init__.py +18 -0
- camel/toolkits/terminal_toolkit/terminal_toolkit.py +1070 -0
- camel/toolkits/terminal_toolkit/utils.py +532 -0
- camel/toolkits/thinking_toolkit.py +3 -3
- camel/toolkits/twitter_toolkit.py +8 -3
- camel/toolkits/vertex_ai_veo_toolkit.py +590 -0
- camel/toolkits/video_analysis_toolkit.py +112 -29
- camel/toolkits/video_download_toolkit.py +22 -16
- camel/toolkits/weather_toolkit.py +2 -2
- camel/toolkits/web_deploy_toolkit.py +1219 -0
- camel/toolkits/wechat_official_toolkit.py +483 -0
- camel/toolkits/whatsapp_toolkit.py +2 -2
- camel/toolkits/wolfram_alpha_toolkit.py +53 -25
- camel/toolkits/zapier_toolkit.py +7 -3
- camel/types/__init__.py +4 -4
- camel/types/agents/__init__.py +2 -2
- camel/types/agents/tool_calling_record.py +6 -3
- camel/types/enums.py +454 -35
- camel/types/mcp_registries.py +2 -2
- camel/types/openai_types.py +4 -4
- camel/types/unified_model_type.py +43 -6
- camel/utils/__init__.py +20 -2
- camel/utils/async_func.py +2 -2
- camel/utils/chunker/__init__.py +2 -2
- camel/utils/chunker/base.py +2 -2
- camel/utils/chunker/code_chunker.py +2 -2
- camel/utils/chunker/uio_chunker.py +2 -2
- camel/utils/commons.py +65 -7
- camel/utils/constants.py +5 -2
- camel/utils/context_utils.py +1134 -0
- camel/utils/deduplication.py +2 -2
- camel/utils/filename.py +2 -2
- camel/utils/langfuse.py +258 -0
- camel/utils/mcp.py +140 -6
- camel/utils/mcp_client.py +1056 -0
- camel/utils/message_summarizer.py +148 -0
- camel/utils/response_format.py +2 -2
- camel/utils/token_counting.py +45 -22
- camel/utils/tool_result.py +44 -0
- camel/verifiers/__init__.py +2 -2
- camel/verifiers/base.py +2 -2
- camel/verifiers/math_verifier.py +2 -2
- camel/verifiers/models.py +2 -2
- camel/verifiers/physics_verifier.py +2 -2
- camel/verifiers/python_verifier.py +2 -2
- {camel_ai-0.2.59.dist-info → camel_ai-0.2.82.dist-info}/METADATA +349 -108
- camel_ai-0.2.82.dist-info/RECORD +507 -0
- {camel_ai-0.2.59.dist-info → camel_ai-0.2.82.dist-info}/WHEEL +1 -1
- {camel_ai-0.2.59.dist-info → camel_ai-0.2.82.dist-info}/licenses/LICENSE +1 -1
- camel/loaders/pandas_reader.py +0 -368
- camel/runtime/api.py +0 -97
- camel/toolkits/dalle_toolkit.py +0 -171
- camel/toolkits/file_write_toolkit.py +0 -395
- camel/toolkits/openai_agent_toolkit.py +0 -135
- camel/toolkits/terminal_toolkit.py +0 -1037
- camel_ai-0.2.59.dist-info/RECORD +0 -410
|
@@ -0,0 +1,311 @@
|
|
|
1
|
+
# ========= Copyright 2023-2025 @ 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-2025 @ CAMEL-AI.org. All Rights Reserved. =========
|
|
14
|
+
import json
|
|
15
|
+
import re
|
|
16
|
+
from typing import TYPE_CHECKING, Any, Dict, List, Optional, Union
|
|
17
|
+
|
|
18
|
+
from camel.logger import get_logger
|
|
19
|
+
from camel.models import BaseModelBackend, ModelFactory
|
|
20
|
+
from camel.types import ModelPlatformType, ModelType
|
|
21
|
+
|
|
22
|
+
from .actions import ActionExecutor
|
|
23
|
+
from .browser_session import HybridBrowserSession
|
|
24
|
+
|
|
25
|
+
if TYPE_CHECKING:
|
|
26
|
+
from camel.agents import ChatAgent
|
|
27
|
+
|
|
28
|
+
logger = get_logger(__name__)
|
|
29
|
+
|
|
30
|
+
|
|
31
|
+
class PlaywrightLLMAgent:
|
|
32
|
+
r"""High-level orchestration: snapshot ↔ LLM ↔ action executor."""
|
|
33
|
+
|
|
34
|
+
# System prompt as class constant to avoid recreation
|
|
35
|
+
SYSTEM_PROMPT = """
|
|
36
|
+
You are a web automation assistant.
|
|
37
|
+
|
|
38
|
+
" Analyse the page snapshot and create a short high-level plan, "
|
|
39
|
+
"then output the FIRST action to start with.\n\n"
|
|
40
|
+
"Return a JSON object in *exactly* this shape:\n"
|
|
41
|
+
"Action format json_object examples:\n"
|
|
42
|
+
"{\n \"plan\": [\"Step 1\", \"Step 2\"],\n \"action\": {\n \"type\":
|
|
43
|
+
\"click\",\n \"ref\": \"e1\"\n }\n}\n\n"
|
|
44
|
+
"If task is already complete:\n"
|
|
45
|
+
"{\n \"plan\": [],\n \"action\": {\n \"type\": \"finish\",
|
|
46
|
+
\n \"ref\": null,\n \"summary\": \"Task was already completed. Summary
|
|
47
|
+
of what was found...\"\n }\n}"
|
|
48
|
+
|
|
49
|
+
Available action types:
|
|
50
|
+
- 'click': {"type": "click", "ref": "e1"} or {"type": "click", "text":
|
|
51
|
+
"Button Text"} or {"type": "click", "selector": "button"}
|
|
52
|
+
- 'type': {"type": "type", "ref": "e1", "text": "search text"} or {"type":
|
|
53
|
+
"type", "selector": "input", "text": "search text"}
|
|
54
|
+
- 'select': {"type": "select", "ref": "e1", "value": "option"} or {"type":
|
|
55
|
+
"select", "selector": "select", "value": "option"}
|
|
56
|
+
- 'wait': {"type": "wait", "timeout": 2000} or {"type": "wait", "selector":
|
|
57
|
+
"#element"}
|
|
58
|
+
- 'scroll': {"type": "scroll", "direction": "down", "amount": 300}
|
|
59
|
+
- 'enter': {"type": "enter", "ref": "e1"} or {"type": "enter", "selector":
|
|
60
|
+
"input[name=q]"} or {"type": "enter"}
|
|
61
|
+
- 'navigate': {"type": "navigate", "url": "https://example.com"}
|
|
62
|
+
- 'finish': {"type": "finish", "ref": null, "summary": "task completion
|
|
63
|
+
summary"}
|
|
64
|
+
|
|
65
|
+
IMPORTANT:
|
|
66
|
+
- For 'click': Use 'ref' from snapshot, or 'text' for visible text,
|
|
67
|
+
or 'selector' for CSS selectors
|
|
68
|
+
- For 'type'/'select': Use 'ref' from snapshot or 'selector' for CSS selectors
|
|
69
|
+
- Only use 'ref' values that exist in the snapshot (e.g., ref=e1, ref=e2, etc.)
|
|
70
|
+
- Use 'finish' when the task is completed successfully with a summary of
|
|
71
|
+
what was accomplished
|
|
72
|
+
- Use 'enter' to press the Enter key (optionally focus an element first)
|
|
73
|
+
- Use 'navigate' to open a new URL before interacting further
|
|
74
|
+
- click can choose radio, checkbox...
|
|
75
|
+
"""
|
|
76
|
+
|
|
77
|
+
def __init__(
|
|
78
|
+
self,
|
|
79
|
+
*,
|
|
80
|
+
user_data_dir: Optional[str] = None,
|
|
81
|
+
headless: bool = False,
|
|
82
|
+
stealth: bool = False,
|
|
83
|
+
model_backend: Optional[BaseModelBackend] = None,
|
|
84
|
+
default_timeout: Optional[int] = None,
|
|
85
|
+
short_timeout: Optional[int] = None,
|
|
86
|
+
):
|
|
87
|
+
self._session = HybridBrowserSession(
|
|
88
|
+
headless=headless,
|
|
89
|
+
user_data_dir=user_data_dir,
|
|
90
|
+
stealth=stealth,
|
|
91
|
+
default_timeout=default_timeout,
|
|
92
|
+
short_timeout=short_timeout,
|
|
93
|
+
)
|
|
94
|
+
from camel.agents import ChatAgent
|
|
95
|
+
|
|
96
|
+
# Populated lazily after first page load
|
|
97
|
+
self.action_history: List[Dict[str, Any]] = []
|
|
98
|
+
if model_backend is None:
|
|
99
|
+
model_backend = ModelFactory.create(
|
|
100
|
+
model_platform=ModelPlatformType.DEFAULT,
|
|
101
|
+
model_type=ModelType.DEFAULT,
|
|
102
|
+
model_config_dict={"temperature": 0, "top_p": 1},
|
|
103
|
+
)
|
|
104
|
+
self.model_backend = model_backend
|
|
105
|
+
# Reuse ChatAgent instance to avoid recreation overhead
|
|
106
|
+
self._chat_agent: Optional[ChatAgent] = None
|
|
107
|
+
|
|
108
|
+
async def navigate(self, url: str) -> str:
|
|
109
|
+
r"""Navigate to a URL and return the snapshot."""
|
|
110
|
+
try:
|
|
111
|
+
# HybridBrowserSession handles waits internally
|
|
112
|
+
logger.debug("Navigated to URL: %s", url)
|
|
113
|
+
await self._session.visit(url)
|
|
114
|
+
return await self._session.get_snapshot(force_refresh=True)
|
|
115
|
+
except Exception as exc:
|
|
116
|
+
error_msg = f"Error: could not navigate to {url} - {exc}"
|
|
117
|
+
logger.error(error_msg)
|
|
118
|
+
return error_msg
|
|
119
|
+
|
|
120
|
+
def _get_chat_agent(self) -> "ChatAgent":
|
|
121
|
+
r"""Get or create the ChatAgent instance."""
|
|
122
|
+
from camel.agents import ChatAgent
|
|
123
|
+
|
|
124
|
+
if self._chat_agent is None:
|
|
125
|
+
self._chat_agent = ChatAgent(
|
|
126
|
+
system_message=self.SYSTEM_PROMPT, model=self.model_backend
|
|
127
|
+
)
|
|
128
|
+
return self._chat_agent
|
|
129
|
+
|
|
130
|
+
def _safe_parse_json(self, content: str) -> Dict[str, Any]:
|
|
131
|
+
r"""Safely parse JSON from LLM response with multiple fallback
|
|
132
|
+
strategies.
|
|
133
|
+
"""
|
|
134
|
+
# First attempt: direct parsing
|
|
135
|
+
try:
|
|
136
|
+
return json.loads(content)
|
|
137
|
+
except json.JSONDecodeError:
|
|
138
|
+
pass
|
|
139
|
+
|
|
140
|
+
# Second attempt: extract JSON-like block using regex
|
|
141
|
+
# Look for content between outermost braces
|
|
142
|
+
json_pattern = re.compile(
|
|
143
|
+
r'\{[^{}]*(?:\{[^{}]*\}[^{}]*)*\}', re.DOTALL
|
|
144
|
+
)
|
|
145
|
+
json_matches = json_pattern.findall(content)
|
|
146
|
+
|
|
147
|
+
for match in json_matches:
|
|
148
|
+
try:
|
|
149
|
+
return json.loads(match)
|
|
150
|
+
except json.JSONDecodeError:
|
|
151
|
+
continue
|
|
152
|
+
|
|
153
|
+
# Third attempt: try to find and parse line by line
|
|
154
|
+
lines = content.split('\n')
|
|
155
|
+
json_lines = []
|
|
156
|
+
in_json = False
|
|
157
|
+
|
|
158
|
+
for line in lines:
|
|
159
|
+
line = line.strip()
|
|
160
|
+
if line.startswith('{'):
|
|
161
|
+
in_json = True
|
|
162
|
+
json_lines = [line]
|
|
163
|
+
elif in_json:
|
|
164
|
+
json_lines.append(line)
|
|
165
|
+
if line.endswith('}'):
|
|
166
|
+
try:
|
|
167
|
+
json_text = '\n'.join(json_lines)
|
|
168
|
+
return json.loads(json_text)
|
|
169
|
+
except json.JSONDecodeError:
|
|
170
|
+
pass
|
|
171
|
+
in_json = False
|
|
172
|
+
json_lines = []
|
|
173
|
+
|
|
174
|
+
# Fallback: return default structure
|
|
175
|
+
logger.warning(
|
|
176
|
+
"Could not parse JSON from LLM response: %s", content[:200]
|
|
177
|
+
)
|
|
178
|
+
return self._get_fallback_response("Parsing error")
|
|
179
|
+
|
|
180
|
+
def _get_fallback_response(self, error_msg: str) -> Dict[str, Any]:
|
|
181
|
+
r"""Generate a fallback response structure."""
|
|
182
|
+
return {
|
|
183
|
+
"plan": [f"Could not parse response: {error_msg}"],
|
|
184
|
+
"action": {
|
|
185
|
+
"type": "finish",
|
|
186
|
+
"ref": None,
|
|
187
|
+
"summary": f"Parsing error: {error_msg}",
|
|
188
|
+
},
|
|
189
|
+
}
|
|
190
|
+
|
|
191
|
+
def _llm_call(
|
|
192
|
+
self,
|
|
193
|
+
prompt: str,
|
|
194
|
+
snapshot: str,
|
|
195
|
+
is_initial: bool,
|
|
196
|
+
history: Optional[List[Dict[str, Any]]] = None,
|
|
197
|
+
) -> Dict[str, Any]:
|
|
198
|
+
r"""Call the LLM (via CAMEL ChatAgent) to get plan & next action."""
|
|
199
|
+
# Build user message
|
|
200
|
+
if is_initial:
|
|
201
|
+
user_content = f"Snapshot:\n{snapshot}\n\nTask: {prompt}"
|
|
202
|
+
else:
|
|
203
|
+
hist_lines = [
|
|
204
|
+
(
|
|
205
|
+
f"{i + 1}. {'✅' if h['success'] else '❌'} "
|
|
206
|
+
f"{h['action']['type']} -> {h['result']}"
|
|
207
|
+
)
|
|
208
|
+
for i, h in enumerate(history or [])
|
|
209
|
+
]
|
|
210
|
+
user_content = (
|
|
211
|
+
f"Snapshot:\n{snapshot}\n\nHistory:\n"
|
|
212
|
+
+ "\n".join(hist_lines)
|
|
213
|
+
+ f"\n\nTask: {prompt}"
|
|
214
|
+
)
|
|
215
|
+
|
|
216
|
+
# Run ChatAgent
|
|
217
|
+
chat_agent = self._get_chat_agent()
|
|
218
|
+
response = chat_agent.step(user_content)
|
|
219
|
+
content = response.msgs[0].content if response.msgs else "{}"
|
|
220
|
+
|
|
221
|
+
# Safely parse JSON response
|
|
222
|
+
return self._safe_parse_json(content)
|
|
223
|
+
|
|
224
|
+
async def process_command(self, prompt: str, max_steps: int = 15):
|
|
225
|
+
r"""Process a command using LLM-guided browser automation."""
|
|
226
|
+
# initial full snapshot
|
|
227
|
+
full_snapshot = await self._session.get_snapshot()
|
|
228
|
+
assert self._session.snapshot is not None
|
|
229
|
+
meta = self._session.snapshot.last_info
|
|
230
|
+
logger.info("Initial snapshot priorities=%s", meta["priorities"])
|
|
231
|
+
logger.debug("Full snapshot:\n%s", full_snapshot)
|
|
232
|
+
|
|
233
|
+
plan_resp = self._llm_call(
|
|
234
|
+
prompt, full_snapshot or "", is_initial=True
|
|
235
|
+
)
|
|
236
|
+
plan = plan_resp.get("plan", [])
|
|
237
|
+
action = plan_resp.get("action")
|
|
238
|
+
|
|
239
|
+
logger.info("Plan generated: %s", json.dumps(plan, ensure_ascii=False))
|
|
240
|
+
|
|
241
|
+
steps = 0
|
|
242
|
+
while action and steps < max_steps:
|
|
243
|
+
if action.get("type") == "finish":
|
|
244
|
+
logger.info("Task finished: %s", action.get("summary", "Done"))
|
|
245
|
+
break
|
|
246
|
+
|
|
247
|
+
result = await self._run_action(action)
|
|
248
|
+
logger.debug("Executed action: %s | Result: %s", action, result)
|
|
249
|
+
|
|
250
|
+
success = False
|
|
251
|
+
result_for_history = ""
|
|
252
|
+
|
|
253
|
+
if isinstance(result, str):
|
|
254
|
+
success = "Error" not in result
|
|
255
|
+
result_for_history = result
|
|
256
|
+
elif isinstance(result, dict):
|
|
257
|
+
success = result.get('success', False)
|
|
258
|
+
result_for_history = result.get('message', str(result))
|
|
259
|
+
else:
|
|
260
|
+
# Fallback case
|
|
261
|
+
success = False
|
|
262
|
+
result_for_history = str(result)
|
|
263
|
+
|
|
264
|
+
self.action_history.append(
|
|
265
|
+
{
|
|
266
|
+
"action": action,
|
|
267
|
+
"result": result_for_history,
|
|
268
|
+
"success": success,
|
|
269
|
+
}
|
|
270
|
+
)
|
|
271
|
+
|
|
272
|
+
diff_snapshot = await self._session.get_snapshot(
|
|
273
|
+
force_refresh=ActionExecutor.should_update_snapshot(action),
|
|
274
|
+
diff_only=True,
|
|
275
|
+
)
|
|
276
|
+
assert self._session.snapshot is not None
|
|
277
|
+
meta = self._session.snapshot.last_info
|
|
278
|
+
logger.debug(
|
|
279
|
+
"Snapshot after action (diff=%s):\n%s",
|
|
280
|
+
meta["is_diff"],
|
|
281
|
+
diff_snapshot,
|
|
282
|
+
)
|
|
283
|
+
|
|
284
|
+
# Update full snapshot if page changed
|
|
285
|
+
if meta["is_diff"] and not diff_snapshot.startswith(
|
|
286
|
+
"- Page Snapshot (no structural changes)"
|
|
287
|
+
):
|
|
288
|
+
assert self._session.snapshot is not None
|
|
289
|
+
full_snapshot = self._session.snapshot.snapshot_data or ""
|
|
290
|
+
|
|
291
|
+
action = self._llm_call(
|
|
292
|
+
prompt,
|
|
293
|
+
full_snapshot or "",
|
|
294
|
+
is_initial=False,
|
|
295
|
+
history=self.action_history,
|
|
296
|
+
).get("action")
|
|
297
|
+
steps += 1
|
|
298
|
+
|
|
299
|
+
logger.info("Process completed with %d steps", steps)
|
|
300
|
+
|
|
301
|
+
async def _run_action(
|
|
302
|
+
self, action: Dict[str, Any]
|
|
303
|
+
) -> Union[str, Dict[str, Any]]:
|
|
304
|
+
r"""Execute a single action and return the result."""
|
|
305
|
+
if action.get("type") == "navigate":
|
|
306
|
+
return await self.navigate(action.get("url", ""))
|
|
307
|
+
return await self._session.exec_action(action)
|
|
308
|
+
|
|
309
|
+
async def close(self):
|
|
310
|
+
r"""Clean up browser session and resources."""
|
|
311
|
+
await self._session.close()
|