camel-ai 0.2.65__py3-none-any.whl → 0.2.83a6__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 +5107 -995
- 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 +35 -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 +1 -3
- camel/benchmarks/mock_website/mock_web.py +2 -2
- camel/benchmarks/mock_website/requirements.txt +1 -1
- camel/benchmarks/mock_website/shopping_mall/app.py +2 -2
- camel/benchmarks/mock_website/task.json +1 -1
- 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 +29 -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 +2 -2
- 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 +2 -2
- camel/configs/cometapi_config.py +106 -0
- camel/configs/crynux_config.py +2 -2
- camel/configs/deepseek_config.py +9 -8
- camel/configs/function_gemma_config.py +59 -0
- 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 +2 -2
- 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 +5 -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 +2 -2
- camel/configs/samba_config.py +6 -4
- 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_collectors/__init__.py +2 -2
- camel/data_collectors/alpaca_collector.py +18 -9
- camel/data_collectors/base.py +2 -2
- camel/data_collectors/sharegpt_collector.py +2 -2
- camel/datagen/__init__.py +2 -2
- camel/datagen/cot_datagen.py +3 -3
- camel/datagen/evol_instruct/__init__.py +2 -2
- camel/datagen/evol_instruct/evol_instruct.py +2 -2
- camel/datagen/evol_instruct/scorer.py +12 -12
- camel/datagen/evol_instruct/templates.py +16 -16
- 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 +2 -2
- camel/datasets/self_instruct_generator.py +2 -2
- camel/datasets/static_dataset.py +2 -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 +2 -2
- 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 +2 -2
- camel/embeddings/together_embedding.py +2 -2
- camel/embeddings/vlm_embedding.py +2 -2
- 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 +2 -2
- camel/interpreters/docker/Dockerfile +14 -24
- camel/interpreters/docker_interpreter.py +5 -4
- camel/interpreters/e2b_interpreter.py +36 -3
- camel/interpreters/internal_python_interpreter.py +53 -4
- camel/interpreters/interpreter_error.py +2 -2
- camel/interpreters/ipython_interpreter.py +2 -2
- camel/interpreters/microsandbox_interpreter.py +395 -0
- camel/interpreters/subprocess_interpreter.py +2 -2
- camel/loaders/__init__.py +13 -4
- 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 +11 -2
- 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 +2 -2
- 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 +125 -7
- camel/memories/blocks/vectordb_block.py +10 -3
- camel/memories/context_creators/__init__.py +2 -2
- camel/memories/context_creators/score_based.py +109 -230
- camel/memories/records.py +90 -10
- camel/messages/__init__.py +2 -2
- camel/messages/base.py +178 -43
- 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 +214 -115
- camel/models/base_audio_model.py +5 -3
- camel/models/base_model.py +378 -31
- camel/models/cerebras_model.py +83 -0
- camel/models/cohere_model.py +18 -49
- camel/models/cometapi_model.py +83 -0
- camel/models/crynux_model.py +11 -18
- camel/models/deepseek_model.py +20 -84
- camel/models/fish_audio_model.py +8 -2
- camel/models/function_gemma_model.py +889 -0
- camel/models/gemini_model.py +391 -52
- camel/models/groq_model.py +11 -19
- camel/models/internlm_model.py +11 -18
- camel/models/litellm_model.py +57 -49
- camel/models/lmstudio_model.py +17 -20
- camel/models/minimax_model.py +83 -0
- camel/models/mistral_model.py +20 -47
- camel/models/model_factory.py +39 -3
- camel/models/model_manager.py +26 -8
- camel/models/modelscope_model.py +13 -193
- camel/models/moonshot_model.py +183 -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 +190 -71
- camel/models/openai_model.py +192 -86
- 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 +23 -49
- 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 +50 -75
- camel/models/sglang_model.py +90 -68
- 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 +158 -19
- camel/models/watsonx_model.py +9 -47
- 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 +3 -2
- camel/retrievers/base.py +2 -2
- camel/retrievers/bm25_retriever.py +2 -2
- camel/retrievers/cohere_rerank_retriever.py +2 -2
- camel/retrievers/hybrid_retrival.py +2 -2
- camel/retrievers/vector_retriever.py +2 -2
- camel/runtimes/Dockerfile.multi-toolkit +90 -0
- camel/runtimes/__init__.py +2 -2
- camel/runtimes/api.py +79 -23
- camel/runtimes/base.py +2 -2
- camel/runtimes/configs.py +13 -13
- camel/runtimes/daytona_runtime.py +17 -18
- camel/runtimes/docker_runtime.py +12 -12
- camel/runtimes/llm_guard_runtime.py +26 -26
- camel/runtimes/remote_http_runtime.py +11 -11
- camel/runtimes/ubuntu_docker_runtime.py +2 -2
- camel/runtimes/utils/__init__.py +2 -2
- camel/runtimes/utils/function_risk_toolkit.py +2 -2
- camel/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 +2 -2
- camel/societies/workforce/events.py +145 -0
- camel/societies/workforce/prompts.py +259 -33
- camel/societies/workforce/role_playing_worker.py +88 -31
- camel/societies/workforce/single_agent_worker.py +638 -40
- camel/societies/workforce/structured_output_handler.py +512 -0
- camel/societies/workforce/task_channel.py +182 -38
- camel/societies/workforce/utils.py +780 -65
- camel/societies/workforce/worker.py +92 -26
- camel/societies/workforce/workflow_memory_manager.py +1746 -0
- camel/societies/workforce/workforce.py +5354 -372
- 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 +6 -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 +8 -2
- camel/storages/vectordb_storages/base.py +2 -2
- camel/storages/vectordb_storages/chroma.py +731 -0
- camel/storages/vectordb_storages/faiss.py +2 -2
- camel/storages/vectordb_storages/milvus.py +2 -2
- camel/storages/vectordb_storages/oceanbase.py +15 -15
- 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 +2 -2
- camel/tasks/__init__.py +2 -2
- camel/tasks/task.py +348 -26
- 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 +57 -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 +4 -4
- camel/toolkits/audio_analysis_toolkit.py +3 -3
- camel/toolkits/base.py +106 -6
- camel/toolkits/bohrium_toolkit.py +2 -2
- camel/toolkits/browser_toolkit.py +34 -21
- camel/toolkits/browser_toolkit_commons.py +4 -4
- camel/toolkits/code_execution.py +31 -4
- 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 +905 -71
- camel/toolkits/file_toolkit.py +1402 -0
- camel/toolkits/function_tool.py +205 -27
- camel/toolkits/github_toolkit.py +109 -22
- 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 +1958 -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 +1940 -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 +325 -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 -6
- camel/toolkits/image_generation_toolkit.py +390 -0
- camel/toolkits/jina_reranker_toolkit.py +5 -6
- 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 +412 -36
- 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 +728 -0
- camel/toolkits/microsoft_outlook_mail_toolkit.py +1885 -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 +53 -53
- camel/toolkits/playwright_mcp_toolkit.py +13 -31
- camel/toolkits/pptx_toolkit.py +36 -23
- 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 +606 -156
- 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 +5 -5
- camel/toolkits/terminal_toolkit/__init__.py +18 -0
- camel/toolkits/terminal_toolkit/terminal_toolkit.py +1281 -0
- camel/toolkits/terminal_toolkit/utils.py +659 -0
- camel/toolkits/thinking_toolkit.py +3 -3
- camel/toolkits/twitter_toolkit.py +2 -2
- camel/toolkits/vertex_ai_veo_toolkit.py +590 -0
- camel/toolkits/video_analysis_toolkit.py +109 -29
- camel/toolkits/video_download_toolkit.py +19 -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 +2 -2
- 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 +381 -41
- camel/types/mcp_registries.py +2 -2
- camel/types/openai_types.py +4 -4
- camel/types/unified_model_type.py +46 -10
- camel/utils/__init__.py +5 -2
- camel/utils/agent_context.py +41 -0
- 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 +38 -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 +18 -10
- camel/utils/mcp.py +140 -6
- camel/utils/mcp_client.py +48 -38
- 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.65.dist-info → camel_ai-0.2.83a6.dist-info}/METADATA +355 -117
- camel_ai-0.2.83a6.dist-info/RECORD +511 -0
- {camel_ai-0.2.65.dist-info → camel_ai-0.2.83a6.dist-info}/WHEEL +1 -1
- {camel_ai-0.2.65.dist-info → camel_ai-0.2.83a6.dist-info}/licenses/LICENSE +1 -1
- camel/loaders/pandas_reader.py +0 -368
- camel/toolkits/dalle_toolkit.py +0 -175
- camel/toolkits/file_write_toolkit.py +0 -444
- camel/toolkits/openai_agent_toolkit.py +0 -135
- camel/toolkits/terminal_toolkit.py +0 -1037
- camel_ai-0.2.65.dist-info/RECORD +0 -426
|
@@ -0,0 +1,483 @@
|
|
|
1
|
+
# ========= Copyright 2023-2026 @ 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-2026 @ CAMEL-AI.org. All Rights Reserved. =========
|
|
14
|
+
|
|
15
|
+
import os
|
|
16
|
+
import time
|
|
17
|
+
from typing import Any, Dict, List, Literal, Optional
|
|
18
|
+
|
|
19
|
+
import requests
|
|
20
|
+
|
|
21
|
+
from camel.logger import get_logger
|
|
22
|
+
from camel.toolkits import FunctionTool
|
|
23
|
+
from camel.toolkits.base import BaseToolkit
|
|
24
|
+
from camel.utils import MCPServer, api_keys_required, retry_on_error
|
|
25
|
+
|
|
26
|
+
logger = get_logger(__name__)
|
|
27
|
+
|
|
28
|
+
# Global variables for caching access token
|
|
29
|
+
_wechat_access_token = None
|
|
30
|
+
_wechat_access_token_expires_at = 0
|
|
31
|
+
|
|
32
|
+
|
|
33
|
+
@retry_on_error()
|
|
34
|
+
def _get_wechat_access_token() -> str:
|
|
35
|
+
r"""Retrieves or refreshes the WeChat Official Account access token.
|
|
36
|
+
|
|
37
|
+
Returns:
|
|
38
|
+
str: The valid access token.
|
|
39
|
+
|
|
40
|
+
Raises:
|
|
41
|
+
ValueError: If credentials are missing or token retrieval fails.
|
|
42
|
+
|
|
43
|
+
References:
|
|
44
|
+
https://developers.weixin.qq.com/doc/offiaccount/Basic_Information/Get_access_token.html
|
|
45
|
+
"""
|
|
46
|
+
global _wechat_access_token, _wechat_access_token_expires_at
|
|
47
|
+
|
|
48
|
+
if _wechat_access_token and _wechat_access_token_expires_at > time.time():
|
|
49
|
+
return _wechat_access_token
|
|
50
|
+
|
|
51
|
+
app_id = os.environ.get("WECHAT_APP_ID", "")
|
|
52
|
+
app_secret = os.environ.get("WECHAT_APP_SECRET", "")
|
|
53
|
+
|
|
54
|
+
url = (
|
|
55
|
+
"https://api.weixin.qq.com/cgi-bin/token?"
|
|
56
|
+
f"grant_type=client_credential&appid={app_id}&secret={app_secret}"
|
|
57
|
+
)
|
|
58
|
+
response = requests.get(url)
|
|
59
|
+
response.raise_for_status()
|
|
60
|
+
data = response.json()
|
|
61
|
+
|
|
62
|
+
if "access_token" in data:
|
|
63
|
+
_wechat_access_token = data["access_token"]
|
|
64
|
+
_wechat_access_token_expires_at = (
|
|
65
|
+
time.time() + data.get("expires_in", 7200) - 60
|
|
66
|
+
)
|
|
67
|
+
logger.info("WeChat access token refreshed.")
|
|
68
|
+
return _wechat_access_token
|
|
69
|
+
else:
|
|
70
|
+
errcode = data.get("errcode")
|
|
71
|
+
errmsg = data.get("errmsg", "Unknown error")
|
|
72
|
+
raise ValueError(f"Failed to get access token {errcode}: {errmsg}")
|
|
73
|
+
|
|
74
|
+
|
|
75
|
+
def _make_wechat_request(
|
|
76
|
+
method: Literal["GET", "POST"], endpoint: str, **kwargs
|
|
77
|
+
) -> Dict[str, Any]:
|
|
78
|
+
r"""Makes a request to WeChat API with proper error handling.
|
|
79
|
+
|
|
80
|
+
Args:
|
|
81
|
+
method (Literal["GET", "POST"]): HTTP method ('GET' or 'POST').
|
|
82
|
+
endpoint (str): API endpoint path.
|
|
83
|
+
**kwargs: Additional arguments for requests.
|
|
84
|
+
|
|
85
|
+
Returns:
|
|
86
|
+
Dict[str, Any]: API response data.
|
|
87
|
+
|
|
88
|
+
Raises:
|
|
89
|
+
requests.exceptions.RequestException: If request fails.
|
|
90
|
+
ValueError: If API returns an error.
|
|
91
|
+
"""
|
|
92
|
+
global _wechat_access_token, _wechat_access_token_expires_at
|
|
93
|
+
access_token = _get_wechat_access_token()
|
|
94
|
+
|
|
95
|
+
# Handle URL parameter concatenation
|
|
96
|
+
separator = "&" if "?" in endpoint else "?"
|
|
97
|
+
url = (
|
|
98
|
+
f"https://api.weixin.qq.com{endpoint}{separator}"
|
|
99
|
+
f"access_token={access_token}"
|
|
100
|
+
)
|
|
101
|
+
|
|
102
|
+
if method.upper() == "GET":
|
|
103
|
+
response = requests.get(url, **kwargs)
|
|
104
|
+
else:
|
|
105
|
+
response = requests.post(url, **kwargs)
|
|
106
|
+
|
|
107
|
+
response.raise_for_status()
|
|
108
|
+
data = response.json()
|
|
109
|
+
|
|
110
|
+
if data.get("errcode") and data.get("errcode") != 0:
|
|
111
|
+
errcode = data.get("errcode")
|
|
112
|
+
errmsg = data.get("errmsg", "Unknown error")
|
|
113
|
+
raise ValueError(f"WeChat API error {errcode}: {errmsg}")
|
|
114
|
+
|
|
115
|
+
return data
|
|
116
|
+
|
|
117
|
+
|
|
118
|
+
@MCPServer()
|
|
119
|
+
class WeChatOfficialToolkit(BaseToolkit):
|
|
120
|
+
r"""A toolkit for WeChat Official Account operations.
|
|
121
|
+
|
|
122
|
+
This toolkit provides methods to interact with the WeChat Official Account
|
|
123
|
+
API, allowing users to send messages, manage users, and handle media files.
|
|
124
|
+
|
|
125
|
+
References:
|
|
126
|
+
- Documentation: https://developers.weixin.qq.com/doc/offiaccount/Getting_Started/Overview.html
|
|
127
|
+
- Test Account: https://mp.weixin.qq.com/debug/cgi-bin/sandbox?t=sandbox/login
|
|
128
|
+
|
|
129
|
+
Notes:
|
|
130
|
+
Set environment variables: WECHAT_APP_ID, WECHAT_APP_SECRET
|
|
131
|
+
"""
|
|
132
|
+
|
|
133
|
+
def __init__(self, timeout: Optional[float] = None):
|
|
134
|
+
r"""Initializes the WeChatOfficialToolkit."""
|
|
135
|
+
super().__init__(timeout=timeout)
|
|
136
|
+
self.base_url = "https://api.weixin.qq.com"
|
|
137
|
+
|
|
138
|
+
# Validate credentials
|
|
139
|
+
app_id = os.environ.get("WECHAT_APP_ID", "")
|
|
140
|
+
app_secret = os.environ.get("WECHAT_APP_SECRET", "")
|
|
141
|
+
|
|
142
|
+
if not all([app_id, app_secret]):
|
|
143
|
+
raise ValueError(
|
|
144
|
+
"WeChat credentials missing. Set WECHAT_APP_ID and"
|
|
145
|
+
" WECHAT_APP_SECRET."
|
|
146
|
+
)
|
|
147
|
+
|
|
148
|
+
# Define full logic as class methods; top-level functions delegate here
|
|
149
|
+
|
|
150
|
+
@api_keys_required(
|
|
151
|
+
[
|
|
152
|
+
(None, "WECHAT_APP_ID"),
|
|
153
|
+
(None, "WECHAT_APP_SECRET"),
|
|
154
|
+
]
|
|
155
|
+
)
|
|
156
|
+
def send_customer_message(
|
|
157
|
+
self,
|
|
158
|
+
openid: str,
|
|
159
|
+
content: str,
|
|
160
|
+
msgtype: Literal[
|
|
161
|
+
"text",
|
|
162
|
+
"image",
|
|
163
|
+
"voice",
|
|
164
|
+
"video",
|
|
165
|
+
] = "text",
|
|
166
|
+
) -> str:
|
|
167
|
+
r"""Sends a customer service message to a WeChat user.
|
|
168
|
+
|
|
169
|
+
Args:
|
|
170
|
+
openid (str): The user's OpenID.
|
|
171
|
+
content (str): Message content or media_id for non-text messages.
|
|
172
|
+
msgtype (str): Message type: "text", "image", "voice", "video".
|
|
173
|
+
|
|
174
|
+
Returns:
|
|
175
|
+
str: Success or error message.
|
|
176
|
+
|
|
177
|
+
References:
|
|
178
|
+
https://developers.weixin.qq.com/doc/offiaccount/Message_Management/Service_Center_messages.html
|
|
179
|
+
"""
|
|
180
|
+
payload: Dict[str, Any] = {"touser": openid, "msgtype": msgtype}
|
|
181
|
+
if msgtype == "text":
|
|
182
|
+
payload["text"] = {"content": content}
|
|
183
|
+
elif msgtype in ["image", "voice"]:
|
|
184
|
+
payload[msgtype] = {"media_id": content}
|
|
185
|
+
elif msgtype == "video":
|
|
186
|
+
parts = content.split(",", 2)
|
|
187
|
+
payload["video"] = {
|
|
188
|
+
"media_id": parts[0],
|
|
189
|
+
"title": parts[1] if len(parts) > 1 else "",
|
|
190
|
+
"description": parts[2] if len(parts) > 2 else "",
|
|
191
|
+
}
|
|
192
|
+
else:
|
|
193
|
+
return f"Unsupported message type: {msgtype}"
|
|
194
|
+
|
|
195
|
+
_make_wechat_request(
|
|
196
|
+
"POST",
|
|
197
|
+
"/cgi-bin/message/custom/send",
|
|
198
|
+
headers={"Content-Type": "application/json"},
|
|
199
|
+
json=payload,
|
|
200
|
+
)
|
|
201
|
+
return f"Message sent successfully to {openid}."
|
|
202
|
+
|
|
203
|
+
@api_keys_required(
|
|
204
|
+
[
|
|
205
|
+
(None, "WECHAT_APP_ID"),
|
|
206
|
+
(None, "WECHAT_APP_SECRET"),
|
|
207
|
+
]
|
|
208
|
+
)
|
|
209
|
+
def get_user_info(
|
|
210
|
+
self,
|
|
211
|
+
openid: str,
|
|
212
|
+
lang: str = "zh_CN",
|
|
213
|
+
) -> Dict[str, Any]:
|
|
214
|
+
r"""Retrieves WeChat user information.
|
|
215
|
+
|
|
216
|
+
Args:
|
|
217
|
+
openid (str): The user's OpenID.
|
|
218
|
+
lang (str): Response language. Common values: "zh_CN", "zh_TW",
|
|
219
|
+
"en". (default: "zh_CN")
|
|
220
|
+
|
|
221
|
+
Returns:
|
|
222
|
+
Dict[str, Any]: User information as dictionary or error
|
|
223
|
+
information.
|
|
224
|
+
|
|
225
|
+
References:
|
|
226
|
+
https://developers.weixin.qq.com/doc/offiaccount/User_Management/
|
|
227
|
+
Getting_user_basic_information.html
|
|
228
|
+
"""
|
|
229
|
+
data = _make_wechat_request(
|
|
230
|
+
"GET", f"/cgi-bin/user/info?openid={openid}&lang={lang}"
|
|
231
|
+
)
|
|
232
|
+
return data
|
|
233
|
+
|
|
234
|
+
@api_keys_required(
|
|
235
|
+
[
|
|
236
|
+
(None, "WECHAT_APP_ID"),
|
|
237
|
+
(None, "WECHAT_APP_SECRET"),
|
|
238
|
+
]
|
|
239
|
+
)
|
|
240
|
+
def get_followers_list(
|
|
241
|
+
self,
|
|
242
|
+
next_openid: str = "",
|
|
243
|
+
) -> Dict[str, Any]:
|
|
244
|
+
r"""Retrieves list of followers' OpenIDs.
|
|
245
|
+
|
|
246
|
+
Args:
|
|
247
|
+
next_openid (str): Starting OpenID for pagination. (default: "")
|
|
248
|
+
|
|
249
|
+
Returns:
|
|
250
|
+
Dict[str, Any]: Followers list as dictionary or error information.
|
|
251
|
+
|
|
252
|
+
References:
|
|
253
|
+
https://developers.weixin.qq.com/doc/offiaccount/User_Management/
|
|
254
|
+
Getting_a_list_of_followers.html
|
|
255
|
+
"""
|
|
256
|
+
endpoint = "/cgi-bin/user/get"
|
|
257
|
+
if next_openid:
|
|
258
|
+
endpoint += f"?next_openid={next_openid}"
|
|
259
|
+
data = _make_wechat_request("GET", endpoint)
|
|
260
|
+
return data
|
|
261
|
+
|
|
262
|
+
@api_keys_required(
|
|
263
|
+
[
|
|
264
|
+
(None, "WECHAT_APP_ID"),
|
|
265
|
+
(None, "WECHAT_APP_SECRET"),
|
|
266
|
+
]
|
|
267
|
+
)
|
|
268
|
+
def upload_wechat_media(
|
|
269
|
+
self,
|
|
270
|
+
media_type: Literal[
|
|
271
|
+
"image",
|
|
272
|
+
"voice",
|
|
273
|
+
"video",
|
|
274
|
+
"thumb",
|
|
275
|
+
],
|
|
276
|
+
file_path: str,
|
|
277
|
+
permanent: bool = False,
|
|
278
|
+
description: Optional[str] = None,
|
|
279
|
+
) -> Dict[str, Any]:
|
|
280
|
+
r"""Uploads media file to WeChat.
|
|
281
|
+
|
|
282
|
+
Args:
|
|
283
|
+
media_type (str): Media type: "image", "voice", "video", "thumb".
|
|
284
|
+
file_path (str): Local file path.
|
|
285
|
+
permanent (bool): Whether to upload as permanent media.
|
|
286
|
+
(default: :obj:`False`)
|
|
287
|
+
description (Optional[str]): Video description in JSON format
|
|
288
|
+
for permanent upload. (default: :obj:`None`)
|
|
289
|
+
|
|
290
|
+
Returns:
|
|
291
|
+
Dict[str, Any]: Upload result with media_id or error information.
|
|
292
|
+
|
|
293
|
+
References:
|
|
294
|
+
- Temporary: https://developers.weixin.qq.com/doc/offiaccount/
|
|
295
|
+
Asset_Management/Adding_Temporary_Assets.html
|
|
296
|
+
- Permanent: https://developers.weixin.qq.com/doc/offiaccount/
|
|
297
|
+
Asset_Management/Adding_Permanent_Assets.html
|
|
298
|
+
"""
|
|
299
|
+
if permanent:
|
|
300
|
+
endpoint = f"/cgi-bin/material/add_material?type={media_type}"
|
|
301
|
+
data_payload = {}
|
|
302
|
+
if media_type == "video" and description:
|
|
303
|
+
data_payload["description"] = description
|
|
304
|
+
with open(file_path, "rb") as media_file:
|
|
305
|
+
files: Dict[str, Any] = {"media": media_file}
|
|
306
|
+
if media_type == "video" and description:
|
|
307
|
+
files["description"] = (None, description)
|
|
308
|
+
data = _make_wechat_request(
|
|
309
|
+
"POST", endpoint, files=files, data=data_payload
|
|
310
|
+
)
|
|
311
|
+
else:
|
|
312
|
+
endpoint = f"/cgi-bin/media/upload?type={media_type}"
|
|
313
|
+
with open(file_path, "rb") as f:
|
|
314
|
+
files = {"media": f}
|
|
315
|
+
data = _make_wechat_request("POST", endpoint, files=files)
|
|
316
|
+
|
|
317
|
+
return data
|
|
318
|
+
|
|
319
|
+
@api_keys_required(
|
|
320
|
+
[
|
|
321
|
+
(None, "WECHAT_APP_ID"),
|
|
322
|
+
(None, "WECHAT_APP_SECRET"),
|
|
323
|
+
]
|
|
324
|
+
)
|
|
325
|
+
def get_media_list(
|
|
326
|
+
self,
|
|
327
|
+
media_type: Literal[
|
|
328
|
+
"image",
|
|
329
|
+
"voice",
|
|
330
|
+
"video",
|
|
331
|
+
"news",
|
|
332
|
+
],
|
|
333
|
+
offset: int = 0,
|
|
334
|
+
count: int = 20,
|
|
335
|
+
) -> Dict[str, Any]:
|
|
336
|
+
r"""Gets list of permanent media files.
|
|
337
|
+
|
|
338
|
+
Args:
|
|
339
|
+
media_type (str): Media type: "image", "voice", "video", "news".
|
|
340
|
+
offset (int): Starting position. (default: :obj:`0`)
|
|
341
|
+
count (int): Number of items (1-20). (default: :obj:`20`)
|
|
342
|
+
|
|
343
|
+
Returns:
|
|
344
|
+
Dict[str, Any]: Media list as dictionary or error information.
|
|
345
|
+
|
|
346
|
+
References:
|
|
347
|
+
https://developers.weixin.qq.com/doc/offiaccount/Asset_Management/
|
|
348
|
+
Get_the_list_of_all_materials.html
|
|
349
|
+
"""
|
|
350
|
+
payload = {"type": media_type, "offset": offset, "count": count}
|
|
351
|
+
data = _make_wechat_request(
|
|
352
|
+
"POST",
|
|
353
|
+
"/cgi-bin/material/batchget_material",
|
|
354
|
+
headers={"Content-Type": "application/json"},
|
|
355
|
+
json=payload,
|
|
356
|
+
)
|
|
357
|
+
return data
|
|
358
|
+
|
|
359
|
+
@api_keys_required(
|
|
360
|
+
[
|
|
361
|
+
(None, "WECHAT_APP_ID"),
|
|
362
|
+
(None, "WECHAT_APP_SECRET"),
|
|
363
|
+
]
|
|
364
|
+
)
|
|
365
|
+
def send_mass_message_to_all(
|
|
366
|
+
self,
|
|
367
|
+
content: str,
|
|
368
|
+
msgtype: Literal[
|
|
369
|
+
"text",
|
|
370
|
+
"image",
|
|
371
|
+
"voice",
|
|
372
|
+
"video",
|
|
373
|
+
] = "text",
|
|
374
|
+
clientmsgid: Optional[str] = None,
|
|
375
|
+
send_ignore_reprint: Optional[int] = 0,
|
|
376
|
+
batch_size: int = 10000,
|
|
377
|
+
) -> Dict[str, Any]:
|
|
378
|
+
r"""Sends a mass message to all followers (by OpenID list).
|
|
379
|
+
|
|
380
|
+
This method paginates all follower OpenIDs and calls the
|
|
381
|
+
mass-send API in batches.
|
|
382
|
+
|
|
383
|
+
Args:
|
|
384
|
+
content (str): For text, the message content; for non-text,
|
|
385
|
+
the media_id.
|
|
386
|
+
msgtype (Literal["text","image","voice","video"]):
|
|
387
|
+
Message type. For "video", the mass API expects
|
|
388
|
+
"mpvideo" internally.
|
|
389
|
+
clientmsgid (Optional[str]): Idempotency key to avoid
|
|
390
|
+
duplicate mass jobs.
|
|
391
|
+
send_ignore_reprint (Optional[int]): Whether to continue
|
|
392
|
+
when a news article is judged as a reprint (reserved;
|
|
393
|
+
applies to news/mpnews).
|
|
394
|
+
batch_size (int): Max OpenIDs per request (WeChat limit
|
|
395
|
+
is up to 10000 per batch).
|
|
396
|
+
|
|
397
|
+
Returns:
|
|
398
|
+
Dict[str, Any]: Aggregated result including counts and
|
|
399
|
+
each batch response.
|
|
400
|
+
|
|
401
|
+
References:
|
|
402
|
+
- Mass send by OpenID list:
|
|
403
|
+
https://developers.weixin.qq.com/doc/service/api/notify/message/
|
|
404
|
+
api_masssend.html
|
|
405
|
+
"""
|
|
406
|
+
# 1) Collect all follower OpenIDs
|
|
407
|
+
all_openids: List[str] = []
|
|
408
|
+
next_openid = ""
|
|
409
|
+
while True:
|
|
410
|
+
endpoint = "/cgi-bin/user/get"
|
|
411
|
+
if next_openid:
|
|
412
|
+
endpoint += f"?next_openid={next_openid}"
|
|
413
|
+
page = _make_wechat_request("GET", endpoint)
|
|
414
|
+
data_block = page.get("data", {}) if isinstance(page, dict) else {}
|
|
415
|
+
openids = (
|
|
416
|
+
data_block.get("openid", [])
|
|
417
|
+
if isinstance(data_block, dict)
|
|
418
|
+
else []
|
|
419
|
+
)
|
|
420
|
+
if openids:
|
|
421
|
+
all_openids.extend(openids)
|
|
422
|
+
next_openid = (
|
|
423
|
+
page.get("next_openid", "") if isinstance(page, dict) else ""
|
|
424
|
+
)
|
|
425
|
+
if not next_openid:
|
|
426
|
+
break
|
|
427
|
+
|
|
428
|
+
# 2) Build and send batches
|
|
429
|
+
results: List[Dict[str, Any]] = []
|
|
430
|
+
if not all_openids:
|
|
431
|
+
return {
|
|
432
|
+
"total_openids": 0,
|
|
433
|
+
"batches": 0,
|
|
434
|
+
"results": results,
|
|
435
|
+
}
|
|
436
|
+
|
|
437
|
+
def build_payload(openid_batch: List[str]) -> Dict[str, Any]:
|
|
438
|
+
payload: Dict[str, Any] = {
|
|
439
|
+
"touser": openid_batch,
|
|
440
|
+
}
|
|
441
|
+
if msgtype == "text":
|
|
442
|
+
payload["msgtype"] = "text"
|
|
443
|
+
payload["text"] = {"content": content}
|
|
444
|
+
elif msgtype in ("image", "voice"):
|
|
445
|
+
payload["msgtype"] = msgtype
|
|
446
|
+
payload[msgtype] = {"media_id": content}
|
|
447
|
+
elif msgtype == "video":
|
|
448
|
+
# Mass API expects mpvideo
|
|
449
|
+
payload["msgtype"] = "mpvideo"
|
|
450
|
+
payload["mpvideo"] = {"media_id": content}
|
|
451
|
+
if clientmsgid:
|
|
452
|
+
payload["clientmsgid"] = clientmsgid
|
|
453
|
+
if send_ignore_reprint is not None:
|
|
454
|
+
payload["send_ignore_reprint"] = send_ignore_reprint
|
|
455
|
+
return payload
|
|
456
|
+
|
|
457
|
+
for i in range(0, len(all_openids), batch_size):
|
|
458
|
+
batch = all_openids[i : i + batch_size]
|
|
459
|
+
payload = build_payload(batch)
|
|
460
|
+
resp = _make_wechat_request(
|
|
461
|
+
"POST",
|
|
462
|
+
"/cgi-bin/message/mass/send",
|
|
463
|
+
headers={"Content-Type": "application/json"},
|
|
464
|
+
json=payload,
|
|
465
|
+
)
|
|
466
|
+
results.append(resp)
|
|
467
|
+
|
|
468
|
+
return {
|
|
469
|
+
"total_openids": len(all_openids),
|
|
470
|
+
"batches": (len(all_openids) + batch_size - 1) // batch_size,
|
|
471
|
+
"results": results,
|
|
472
|
+
}
|
|
473
|
+
|
|
474
|
+
def get_tools(self) -> List[FunctionTool]:
|
|
475
|
+
r"""Returns toolkit functions as tools."""
|
|
476
|
+
return [
|
|
477
|
+
FunctionTool(self.send_customer_message),
|
|
478
|
+
FunctionTool(self.get_user_info),
|
|
479
|
+
FunctionTool(self.get_followers_list),
|
|
480
|
+
FunctionTool(self.upload_wechat_media),
|
|
481
|
+
FunctionTool(self.get_media_list),
|
|
482
|
+
FunctionTool(self.send_mass_message_to_all),
|
|
483
|
+
]
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
# ========= Copyright 2023-
|
|
1
|
+
# ========= Copyright 2023-2026 @ CAMEL-AI.org. All Rights Reserved. =========
|
|
2
2
|
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
3
3
|
# you may not use this file except in compliance with the License.
|
|
4
4
|
# You may obtain a copy of the License at
|
|
@@ -10,7 +10,7 @@
|
|
|
10
10
|
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
11
11
|
# See the License for the specific language governing permissions and
|
|
12
12
|
# limitations under the License.
|
|
13
|
-
# ========= Copyright 2023-
|
|
13
|
+
# ========= Copyright 2023-2026 @ CAMEL-AI.org. All Rights Reserved. =========
|
|
14
14
|
|
|
15
15
|
import os
|
|
16
16
|
from typing import Any, Dict, List, Optional, Union
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
# ========= Copyright 2023-
|
|
1
|
+
# ========= Copyright 2023-2026 @ CAMEL-AI.org. All Rights Reserved. =========
|
|
2
2
|
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
3
3
|
# you may not use this file except in compliance with the License.
|
|
4
4
|
# You may obtain a copy of the License at
|
|
@@ -10,7 +10,7 @@
|
|
|
10
10
|
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
11
11
|
# See the License for the specific language governing permissions and
|
|
12
12
|
# limitations under the License.
|
|
13
|
-
# ========= Copyright 2023-
|
|
13
|
+
# ========= Copyright 2023-2026 @ CAMEL-AI.org. All Rights Reserved. =========
|
|
14
14
|
import os
|
|
15
15
|
import xml.etree.ElementTree as ET
|
|
16
16
|
from typing import Any, Dict, List
|
camel/toolkits/zapier_toolkit.py
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
# ========= Copyright 2023-
|
|
1
|
+
# ========= Copyright 2023-2026 @ CAMEL-AI.org. All Rights Reserved. =========
|
|
2
2
|
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
3
3
|
# you may not use this file except in compliance with the License.
|
|
4
4
|
# You may obtain a copy of the License at
|
|
@@ -10,7 +10,7 @@
|
|
|
10
10
|
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
11
11
|
# See the License for the specific language governing permissions and
|
|
12
12
|
# limitations under the License.
|
|
13
|
-
# ========= Copyright 2023-
|
|
13
|
+
# ========= Copyright 2023-2026 @ CAMEL-AI.org. All Rights Reserved. =========
|
|
14
14
|
|
|
15
15
|
import os
|
|
16
16
|
from typing import Any, Dict, List, Optional
|
|
@@ -19,7 +19,11 @@ import requests
|
|
|
19
19
|
|
|
20
20
|
from camel.toolkits.base import BaseToolkit
|
|
21
21
|
from camel.toolkits.function_tool import FunctionTool
|
|
22
|
-
from camel.utils import
|
|
22
|
+
from camel.utils import (
|
|
23
|
+
MCPServer,
|
|
24
|
+
api_keys_required,
|
|
25
|
+
dependencies_required,
|
|
26
|
+
)
|
|
23
27
|
|
|
24
28
|
|
|
25
29
|
@MCPServer()
|
camel/types/__init__.py
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
# ========= Copyright 2023-
|
|
1
|
+
# ========= Copyright 2023-2026 @ CAMEL-AI.org. All Rights Reserved. =========
|
|
2
2
|
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
3
3
|
# you may not use this file except in compliance with the License.
|
|
4
4
|
# You may obtain a copy of the License at
|
|
@@ -10,7 +10,7 @@
|
|
|
10
10
|
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
11
11
|
# See the License for the specific language governing permissions and
|
|
12
12
|
# limitations under the License.
|
|
13
|
-
# ========= Copyright 2023-
|
|
13
|
+
# ========= Copyright 2023-2026 @ CAMEL-AI.org. All Rights Reserved. =========
|
|
14
14
|
from .enums import (
|
|
15
15
|
AudioModelType,
|
|
16
16
|
EmbeddingModelType,
|
|
@@ -41,8 +41,8 @@ from .openai_types import (
|
|
|
41
41
|
ChatCompletionAssistantMessageParam,
|
|
42
42
|
ChatCompletionChunk,
|
|
43
43
|
ChatCompletionMessage,
|
|
44
|
+
ChatCompletionMessageFunctionToolCall,
|
|
44
45
|
ChatCompletionMessageParam,
|
|
45
|
-
ChatCompletionMessageToolCall,
|
|
46
46
|
ChatCompletionSystemMessageParam,
|
|
47
47
|
ChatCompletionToolMessageParam,
|
|
48
48
|
ChatCompletionUserMessageParam,
|
|
@@ -71,7 +71,7 @@ __all__ = [
|
|
|
71
71
|
'ChatCompletionUserMessageParam',
|
|
72
72
|
'ChatCompletionAssistantMessageParam',
|
|
73
73
|
'ChatCompletionToolMessageParam',
|
|
74
|
-
'
|
|
74
|
+
'ChatCompletionMessageFunctionToolCall',
|
|
75
75
|
'CompletionUsage',
|
|
76
76
|
'OpenAIImageType',
|
|
77
77
|
'OpenAIVisionDetailType',
|
camel/types/agents/__init__.py
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
# ========= Copyright 2023-
|
|
1
|
+
# ========= Copyright 2023-2026 @ CAMEL-AI.org. All Rights Reserved. =========
|
|
2
2
|
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
3
3
|
# you may not use this file except in compliance with the License.
|
|
4
4
|
# You may obtain a copy of the License at
|
|
@@ -10,7 +10,7 @@
|
|
|
10
10
|
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
11
11
|
# See the License for the specific language governing permissions and
|
|
12
12
|
# limitations under the License.
|
|
13
|
-
# ========= Copyright 2023-
|
|
13
|
+
# ========= Copyright 2023-2026 @ CAMEL-AI.org. All Rights Reserved. =========
|
|
14
14
|
from .tool_calling_record import ToolCallingRecord
|
|
15
15
|
|
|
16
16
|
__all__ = ["ToolCallingRecord"]
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
# ========= Copyright 2023-
|
|
1
|
+
# ========= Copyright 2023-2026 @ CAMEL-AI.org. All Rights Reserved. =========
|
|
2
2
|
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
3
3
|
# you may not use this file except in compliance with the License.
|
|
4
4
|
# You may obtain a copy of the License at
|
|
@@ -10,8 +10,8 @@
|
|
|
10
10
|
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
11
11
|
# See the License for the specific language governing permissions and
|
|
12
12
|
# limitations under the License.
|
|
13
|
-
# ========= Copyright 2023-
|
|
14
|
-
from typing import Any, Dict
|
|
13
|
+
# ========= Copyright 2023-2026 @ CAMEL-AI.org. All Rights Reserved. =========
|
|
14
|
+
from typing import Any, Dict, List, Optional
|
|
15
15
|
|
|
16
16
|
from pydantic import BaseModel
|
|
17
17
|
|
|
@@ -24,12 +24,15 @@ class ToolCallingRecord(BaseModel):
|
|
|
24
24
|
args (Dict[str, Any]): The dictionary of arguments passed to the tool.
|
|
25
25
|
result (Any): The execution result of calling this tool.
|
|
26
26
|
tool_call_id (str): The ID of the tool call, if available.
|
|
27
|
+
images (Optional[List[str]]): List of base64-encoded images returned
|
|
28
|
+
by the tool, if any.
|
|
27
29
|
"""
|
|
28
30
|
|
|
29
31
|
tool_name: str
|
|
30
32
|
args: Dict[str, Any]
|
|
31
33
|
result: Any
|
|
32
34
|
tool_call_id: str
|
|
35
|
+
images: Optional[List[str]] = None
|
|
33
36
|
|
|
34
37
|
def __str__(self) -> str:
|
|
35
38
|
r"""Overridden version of the string function.
|