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
camel/toolkits/function_tool.py
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
# ========= Copyright 2023-
|
|
1
|
+
# ========= Copyright 2023-2025 @ 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,12 +10,15 @@
|
|
|
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-2025 @ CAMEL-AI.org. All Rights Reserved. =========
|
|
14
14
|
import ast
|
|
15
|
+
import asyncio
|
|
16
|
+
import functools
|
|
15
17
|
import inspect
|
|
16
18
|
import logging
|
|
17
19
|
import textwrap
|
|
18
20
|
import warnings
|
|
21
|
+
from concurrent.futures import ThreadPoolExecutor
|
|
19
22
|
from inspect import Parameter, getsource, signature
|
|
20
23
|
from typing import Any, Callable, Dict, Mapping, Optional, Tuple, Type
|
|
21
24
|
|
|
@@ -31,6 +34,9 @@ from camel.utils import get_pydantic_object_schema, to_pascal
|
|
|
31
34
|
|
|
32
35
|
logger = logging.getLogger(__name__)
|
|
33
36
|
|
|
37
|
+
# Shared thread pool for running sync tools without blocking the event loop
|
|
38
|
+
_SYNC_TOOL_EXECUTOR = ThreadPoolExecutor(max_workers=64)
|
|
39
|
+
|
|
34
40
|
|
|
35
41
|
def _remove_a_key(d: Dict, remove_key: Any) -> None:
|
|
36
42
|
r"""Remove a key from a dictionary recursively."""
|
|
@@ -156,7 +162,12 @@ def get_openai_tool_schema(func: Callable) -> Dict[str, Any]:
|
|
|
156
162
|
if (name := param.arg_name) in parameters_dict["properties"] and (
|
|
157
163
|
description := param.description
|
|
158
164
|
):
|
|
159
|
-
|
|
165
|
+
# OpenAI does not allow descriptions on properties that use $ref.
|
|
166
|
+
# To avoid schema errors, we only add the description if "$ref" is
|
|
167
|
+
# not present.
|
|
168
|
+
prop = parameters_dict["properties"][name]
|
|
169
|
+
if "$ref" not in prop:
|
|
170
|
+
prop["description"] = description
|
|
160
171
|
|
|
161
172
|
short_description = docstring.short_description or ""
|
|
162
173
|
long_description = docstring.long_description or ""
|
|
@@ -190,7 +201,9 @@ def sanitize_and_enforce_required(parameters_dict):
|
|
|
190
201
|
r"""Cleans and updates the function schema to conform with OpenAI's
|
|
191
202
|
requirements:
|
|
192
203
|
- Removes invalid 'default' fields from the parameters schema.
|
|
193
|
-
- Ensures all fields
|
|
204
|
+
- Ensures all fields are marked as required or have null type for optional
|
|
205
|
+
fields.
|
|
206
|
+
- Recursively adds additionalProperties: false to all nested objects.
|
|
194
207
|
|
|
195
208
|
Args:
|
|
196
209
|
parameters_dict (dict): The dictionary representing the function
|
|
@@ -198,8 +211,38 @@ def sanitize_and_enforce_required(parameters_dict):
|
|
|
198
211
|
|
|
199
212
|
Returns:
|
|
200
213
|
dict: The updated dictionary with invalid defaults removed and all
|
|
201
|
-
fields
|
|
214
|
+
fields properly configured for strict mode.
|
|
202
215
|
"""
|
|
216
|
+
|
|
217
|
+
def _add_additional_properties_false(obj):
|
|
218
|
+
r"""Recursively add additionalProperties: false to all objects."""
|
|
219
|
+
if isinstance(obj, dict):
|
|
220
|
+
if (
|
|
221
|
+
obj.get("type") == "object"
|
|
222
|
+
and "additionalProperties" not in obj
|
|
223
|
+
):
|
|
224
|
+
obj["additionalProperties"] = False
|
|
225
|
+
|
|
226
|
+
# Process nested structures
|
|
227
|
+
for key, value in obj.items():
|
|
228
|
+
if key == "properties" and isinstance(value, dict):
|
|
229
|
+
for prop_value in value.values():
|
|
230
|
+
_add_additional_properties_false(prop_value)
|
|
231
|
+
elif key in [
|
|
232
|
+
"items",
|
|
233
|
+
"allOf",
|
|
234
|
+
"oneOf",
|
|
235
|
+
"anyOf",
|
|
236
|
+
] and isinstance(value, (dict, list)):
|
|
237
|
+
if isinstance(value, dict):
|
|
238
|
+
_add_additional_properties_false(value)
|
|
239
|
+
elif isinstance(value, list):
|
|
240
|
+
for item in value:
|
|
241
|
+
_add_additional_properties_false(item)
|
|
242
|
+
elif key == "$defs" and isinstance(value, dict):
|
|
243
|
+
for def_value in value.values():
|
|
244
|
+
_add_additional_properties_false(def_value)
|
|
245
|
+
|
|
203
246
|
# Check if 'function' and 'parameters' exist
|
|
204
247
|
if (
|
|
205
248
|
'function' in parameters_dict
|
|
@@ -209,12 +252,65 @@ def sanitize_and_enforce_required(parameters_dict):
|
|
|
209
252
|
parameters = parameters_dict['function']['parameters']
|
|
210
253
|
properties = parameters.get('properties', {})
|
|
211
254
|
|
|
212
|
-
#
|
|
213
|
-
|
|
214
|
-
|
|
255
|
+
# Track which fields should be required vs optional
|
|
256
|
+
required_fields = []
|
|
257
|
+
|
|
258
|
+
# Process each property
|
|
259
|
+
for field_name, field_schema in properties.items():
|
|
260
|
+
# Check if this field had a default value (making it optional)
|
|
261
|
+
had_default = 'default' in field_schema
|
|
262
|
+
|
|
263
|
+
# Remove 'default' key from field schema as required by OpenAI
|
|
264
|
+
field_schema.pop('default', None)
|
|
265
|
+
|
|
266
|
+
if had_default:
|
|
267
|
+
# This field is optional - add null to its type
|
|
268
|
+
current_type = field_schema.get('type')
|
|
269
|
+
has_ref = '$ref' in field_schema
|
|
270
|
+
has_any_of = 'anyOf' in field_schema
|
|
271
|
+
|
|
272
|
+
if has_ref:
|
|
273
|
+
# Fields with $ref shouldn't have additional type field
|
|
274
|
+
# The $ref itself defines the type structure
|
|
275
|
+
pass
|
|
276
|
+
elif has_any_of:
|
|
277
|
+
# Field already has anyOf
|
|
278
|
+
any_of_types = field_schema['anyOf']
|
|
279
|
+
has_null_type = any(
|
|
280
|
+
item.get('type') == 'null' for item in any_of_types
|
|
281
|
+
)
|
|
282
|
+
if not has_null_type:
|
|
283
|
+
# Add null type to anyOf
|
|
284
|
+
field_schema['anyOf'].append({'type': 'null'})
|
|
285
|
+
# Remove conflicting type field if it exists
|
|
286
|
+
if 'type' in field_schema:
|
|
287
|
+
del field_schema['type']
|
|
288
|
+
elif current_type:
|
|
289
|
+
if isinstance(current_type, str):
|
|
290
|
+
# Single type - convert to array with null
|
|
291
|
+
field_schema['type'] = [current_type, 'null']
|
|
292
|
+
elif (
|
|
293
|
+
isinstance(current_type, list)
|
|
294
|
+
and 'null' not in current_type
|
|
295
|
+
):
|
|
296
|
+
# Array of types - add null if not present
|
|
297
|
+
field_schema['type'] = [*current_type, 'null']
|
|
298
|
+
else:
|
|
299
|
+
# No type specified, add null type
|
|
300
|
+
field_schema['type'] = ['null']
|
|
301
|
+
|
|
302
|
+
# Optional fields are still marked as required in strict mode
|
|
303
|
+
# but with null type to indicate they can be omitted
|
|
304
|
+
required_fields.append(field_name)
|
|
305
|
+
else:
|
|
306
|
+
# This field is required
|
|
307
|
+
required_fields.append(field_name)
|
|
308
|
+
|
|
309
|
+
# Set all fields as required (strict mode requirement)
|
|
310
|
+
parameters['required'] = required_fields
|
|
215
311
|
|
|
216
|
-
#
|
|
217
|
-
parameters
|
|
312
|
+
# Recursively add additionalProperties: false to all objects
|
|
313
|
+
_add_additional_properties_false(parameters)
|
|
218
314
|
|
|
219
315
|
return parameters_dict
|
|
220
316
|
|
|
@@ -392,10 +488,15 @@ class FunctionTool:
|
|
|
392
488
|
result = self.func(*args, **kwargs)
|
|
393
489
|
return result
|
|
394
490
|
except Exception as e:
|
|
491
|
+
parts = []
|
|
492
|
+
if args:
|
|
493
|
+
parts.append(f"args={args}")
|
|
494
|
+
if kwargs:
|
|
495
|
+
parts.append(f"kwargs={kwargs}")
|
|
496
|
+
args_str = ", ".join(parts) if parts else "no arguments"
|
|
395
497
|
raise ValueError(
|
|
396
498
|
f"Execution of function {self.func.__name__} failed with "
|
|
397
|
-
f"
|
|
398
|
-
f"Error: {e}"
|
|
499
|
+
f"{args_str}. Error: {e}"
|
|
399
500
|
)
|
|
400
501
|
|
|
401
502
|
async def async_call(self, *args: Any, **kwargs: Any) -> Any:
|
|
@@ -405,7 +506,13 @@ class FunctionTool:
|
|
|
405
506
|
if self.is_async:
|
|
406
507
|
return await self.func(*args, **kwargs)
|
|
407
508
|
else:
|
|
408
|
-
|
|
509
|
+
# Run sync function in executor to avoid blocking event loop
|
|
510
|
+
# Use functools.partial to properly capture args/kwargs
|
|
511
|
+
loop = asyncio.get_running_loop()
|
|
512
|
+
return await loop.run_in_executor(
|
|
513
|
+
_SYNC_TOOL_EXECUTOR,
|
|
514
|
+
functools.partial(self.func, *args, **kwargs),
|
|
515
|
+
)
|
|
409
516
|
|
|
410
517
|
@property
|
|
411
518
|
def is_async(self) -> bool:
|
|
@@ -437,8 +544,8 @@ class FunctionTool:
|
|
|
437
544
|
|
|
438
545
|
# Check the function description, if no description then raise warming
|
|
439
546
|
if not openai_tool_schema["function"].get("description"):
|
|
440
|
-
warnings.warn(f"""Function description is missing for
|
|
441
|
-
{openai_tool_schema['function']['name']}. This may
|
|
547
|
+
warnings.warn(f"""Function description is missing for
|
|
548
|
+
{openai_tool_schema['function']['name']}. This may
|
|
442
549
|
affect the quality of tool calling.""")
|
|
443
550
|
|
|
444
551
|
# Validate whether parameters
|
|
@@ -459,9 +566,10 @@ class FunctionTool:
|
|
|
459
566
|
param_dict = properties[param_name]
|
|
460
567
|
if "description" not in param_dict:
|
|
461
568
|
warnings.warn(
|
|
462
|
-
f"Parameter description is missing "
|
|
463
|
-
f"
|
|
464
|
-
f"
|
|
569
|
+
f"Parameter description is missing for the "
|
|
570
|
+
f"function '{openai_tool_schema['function']['name']}'. "
|
|
571
|
+
f"The parameter definition is {param_dict}. "
|
|
572
|
+
f"This may affect the quality of tool calling."
|
|
465
573
|
)
|
|
466
574
|
|
|
467
575
|
def get_openai_tool_schema(self) -> Dict[str, Any]:
|
|
@@ -547,7 +655,7 @@ class FunctionTool:
|
|
|
547
655
|
"""
|
|
548
656
|
self.openai_tool_schema["function"]["description"] = description
|
|
549
657
|
|
|
550
|
-
def
|
|
658
|
+
def get_parameter_description(self, param_name: str) -> str:
|
|
551
659
|
r"""Gets the description of a specific parameter from the function
|
|
552
660
|
schema.
|
|
553
661
|
|
|
@@ -563,7 +671,7 @@ class FunctionTool:
|
|
|
563
671
|
param_name
|
|
564
672
|
]["description"]
|
|
565
673
|
|
|
566
|
-
def
|
|
674
|
+
def set_parameter_description(
|
|
567
675
|
self,
|
|
568
676
|
param_name: str,
|
|
569
677
|
description: str,
|
camel/toolkits/github_toolkit.py
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
# ========= Copyright 2023-
|
|
1
|
+
# ========= Copyright 2023-2025 @ 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,10 +10,11 @@
|
|
|
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-2025 @ CAMEL-AI.org. All Rights Reserved. =========
|
|
14
14
|
|
|
15
15
|
import logging
|
|
16
16
|
import os
|
|
17
|
+
import warnings
|
|
17
18
|
from typing import Dict, List, Literal, Optional, Union
|
|
18
19
|
|
|
19
20
|
from camel.toolkits import FunctionTool
|
|
@@ -32,7 +33,6 @@ class GithubToolkit(BaseToolkit):
|
|
|
32
33
|
specific issues, and creating pull requests in a GitHub repository.
|
|
33
34
|
|
|
34
35
|
Args:
|
|
35
|
-
repo_name (str): The name of the GitHub repository.
|
|
36
36
|
access_token (str, optional): The access token to authenticate with
|
|
37
37
|
GitHub. If not provided, it will be obtained using the
|
|
38
38
|
`get_github_access_token` method.
|
|
@@ -41,7 +41,6 @@ class GithubToolkit(BaseToolkit):
|
|
|
41
41
|
@dependencies_required('github')
|
|
42
42
|
def __init__(
|
|
43
43
|
self,
|
|
44
|
-
repo_name: str,
|
|
45
44
|
access_token: Optional[str] = None,
|
|
46
45
|
timeout: Optional[float] = None,
|
|
47
46
|
) -> None:
|
|
@@ -61,7 +60,6 @@ class GithubToolkit(BaseToolkit):
|
|
|
61
60
|
access_token = self.get_github_access_token()
|
|
62
61
|
|
|
63
62
|
self.github = Github(auth=Token(access_token))
|
|
64
|
-
self.repo = self.github.get_repo(repo_name)
|
|
65
63
|
|
|
66
64
|
def get_github_access_token(self) -> str:
|
|
67
65
|
r"""Retrieve the GitHub access token from environment variables.
|
|
@@ -83,8 +81,9 @@ class GithubToolkit(BaseToolkit):
|
|
|
83
81
|
)
|
|
84
82
|
return GITHUB_ACCESS_TOKEN
|
|
85
83
|
|
|
86
|
-
def
|
|
84
|
+
def github_create_pull_request(
|
|
87
85
|
self,
|
|
86
|
+
repo_name: str,
|
|
88
87
|
file_path: str,
|
|
89
88
|
new_content: str,
|
|
90
89
|
pr_title: str,
|
|
@@ -98,6 +97,7 @@ class GithubToolkit(BaseToolkit):
|
|
|
98
97
|
description contains information about the issue title and number.
|
|
99
98
|
|
|
100
99
|
Args:
|
|
100
|
+
repo_name (str): The name of the GitHub repository.
|
|
101
101
|
file_path (str): The path of the file to be updated in the
|
|
102
102
|
repository.
|
|
103
103
|
new_content (str): The specified new content of the specified file.
|
|
@@ -111,12 +111,13 @@ class GithubToolkit(BaseToolkit):
|
|
|
111
111
|
str: A formatted report of whether the pull request was created
|
|
112
112
|
successfully or not.
|
|
113
113
|
"""
|
|
114
|
-
|
|
114
|
+
repo = self.github.get_repo(repo_name)
|
|
115
|
+
default_branch = repo.get_branch(repo.default_branch)
|
|
115
116
|
from github.GithubException import GithubException
|
|
116
117
|
|
|
117
118
|
try:
|
|
118
|
-
|
|
119
|
-
ref=f"refs/heads/{branch_name}", sha=
|
|
119
|
+
repo.create_git_ref(
|
|
120
|
+
ref=f"refs/heads/{branch_name}", sha=default_branch.commit.sha
|
|
120
121
|
)
|
|
121
122
|
except GithubException as e:
|
|
122
123
|
if e.message == "Reference already exists":
|
|
@@ -128,19 +129,19 @@ class GithubToolkit(BaseToolkit):
|
|
|
128
129
|
else:
|
|
129
130
|
raise
|
|
130
131
|
|
|
131
|
-
file =
|
|
132
|
+
file = repo.get_contents(file_path)
|
|
132
133
|
|
|
133
134
|
from github.ContentFile import ContentFile
|
|
134
135
|
|
|
135
136
|
if isinstance(file, ContentFile):
|
|
136
|
-
|
|
137
|
+
repo.update_file(
|
|
137
138
|
file.path, body, new_content, file.sha, branch=branch_name
|
|
138
139
|
)
|
|
139
|
-
pr =
|
|
140
|
+
pr = repo.create_pull(
|
|
140
141
|
title=pr_title,
|
|
141
142
|
body=body,
|
|
142
143
|
head=branch_name,
|
|
143
|
-
base=
|
|
144
|
+
base=repo.default_branch,
|
|
144
145
|
)
|
|
145
146
|
|
|
146
147
|
if pr is not None:
|
|
@@ -150,14 +151,15 @@ class GithubToolkit(BaseToolkit):
|
|
|
150
151
|
else:
|
|
151
152
|
raise ValueError("PRs with multiple files aren't supported yet.")
|
|
152
153
|
|
|
153
|
-
def
|
|
154
|
-
self, state: Literal["open", "closed", "all"] = "all"
|
|
154
|
+
def github_get_issue_list(
|
|
155
|
+
self, repo_name: str, state: Literal["open", "closed", "all"] = "all"
|
|
155
156
|
) -> List[Dict[str, object]]:
|
|
156
157
|
r"""Retrieves all issues from the GitHub repository.
|
|
157
158
|
|
|
158
159
|
Args:
|
|
160
|
+
repo_name (str): The name of the GitHub repository.
|
|
159
161
|
state (Literal["open", "closed", "all"]): The state of pull
|
|
160
|
-
requests to retrieve. (default: :obj
|
|
162
|
+
requests to retrieve. (default: :obj:`all`)
|
|
161
163
|
Options are:
|
|
162
164
|
- "open": Retrieve only open pull requests.
|
|
163
165
|
- "closed": Retrieve only closed pull requests.
|
|
@@ -167,37 +169,43 @@ class GithubToolkit(BaseToolkit):
|
|
|
167
169
|
List[Dict[str, object]]: A list of dictionaries where each
|
|
168
170
|
dictionary contains the issue number and title.
|
|
169
171
|
"""
|
|
172
|
+
repo = self.github.get_repo(repo_name)
|
|
170
173
|
issues_info = []
|
|
171
|
-
issues =
|
|
174
|
+
issues = repo.get_issues(state=state)
|
|
172
175
|
|
|
173
176
|
for issue in issues:
|
|
174
177
|
issues_info.append({"number": issue.number, "title": issue.title})
|
|
175
178
|
|
|
176
179
|
return issues_info
|
|
177
180
|
|
|
178
|
-
def
|
|
181
|
+
def github_get_issue_content(
|
|
182
|
+
self, repo_name: str, issue_number: int
|
|
183
|
+
) -> str:
|
|
179
184
|
r"""Retrieves the content of a specific issue by its number.
|
|
180
185
|
|
|
181
186
|
Args:
|
|
187
|
+
repo_name (str): The name of the GitHub repository.
|
|
182
188
|
issue_number (int): The number of the issue to retrieve.
|
|
183
189
|
|
|
184
190
|
Returns:
|
|
185
191
|
str: issues content details.
|
|
186
192
|
"""
|
|
187
193
|
try:
|
|
188
|
-
|
|
194
|
+
repo = self.github.get_repo(repo_name)
|
|
195
|
+
issue = repo.get_issue(number=issue_number)
|
|
189
196
|
return issue.body
|
|
190
197
|
except Exception as e:
|
|
191
198
|
return f"can't get Issue number {issue_number}: {e!s}"
|
|
192
199
|
|
|
193
|
-
def
|
|
194
|
-
self, state: Literal["open", "closed", "all"] = "all"
|
|
200
|
+
def github_get_pull_request_list(
|
|
201
|
+
self, repo_name: str, state: Literal["open", "closed", "all"] = "all"
|
|
195
202
|
) -> List[Dict[str, object]]:
|
|
196
203
|
r"""Retrieves all pull requests from the GitHub repository.
|
|
197
204
|
|
|
198
205
|
Args:
|
|
206
|
+
repo_name (str): The name of the GitHub repository.
|
|
199
207
|
state (Literal["open", "closed", "all"]): The state of pull
|
|
200
|
-
requests to retrieve. (default: :obj
|
|
208
|
+
requests to retrieve. (default: :obj:`all`)
|
|
201
209
|
Options are:
|
|
202
210
|
- "open": Retrieve only open pull requests.
|
|
203
211
|
- "closed": Retrieve only closed pull requests.
|
|
@@ -207,18 +215,22 @@ class GithubToolkit(BaseToolkit):
|
|
|
207
215
|
list: A list of dictionaries where each dictionary contains the
|
|
208
216
|
pull request number and title.
|
|
209
217
|
"""
|
|
218
|
+
repo = self.github.get_repo(repo_name)
|
|
210
219
|
pull_requests_info = []
|
|
211
|
-
pull_requests =
|
|
220
|
+
pull_requests = repo.get_pulls(state=state)
|
|
212
221
|
|
|
213
222
|
for pr in pull_requests:
|
|
214
223
|
pull_requests_info.append({"number": pr.number, "title": pr.title})
|
|
215
224
|
|
|
216
225
|
return pull_requests_info
|
|
217
226
|
|
|
218
|
-
def
|
|
227
|
+
def github_get_pull_request_code(
|
|
228
|
+
self, repo_name: str, pr_number: int
|
|
229
|
+
) -> List[Dict[str, str]]:
|
|
219
230
|
r"""Retrieves the code changes of a specific pull request.
|
|
220
231
|
|
|
221
232
|
Args:
|
|
233
|
+
repo_name (str): The name of the GitHub repository.
|
|
222
234
|
pr_number (int): The number of the pull request to retrieve.
|
|
223
235
|
|
|
224
236
|
Returns:
|
|
@@ -226,8 +238,9 @@ class GithubToolkit(BaseToolkit):
|
|
|
226
238
|
contains the file name and the corresponding code changes
|
|
227
239
|
(patch).
|
|
228
240
|
"""
|
|
241
|
+
repo = self.github.get_repo(repo_name)
|
|
229
242
|
# Retrieve the specific pull request
|
|
230
|
-
pr =
|
|
243
|
+
pr = repo.get_pull(number=pr_number)
|
|
231
244
|
|
|
232
245
|
# Collect the file changes from the pull request
|
|
233
246
|
files_changed = []
|
|
@@ -243,20 +256,22 @@ class GithubToolkit(BaseToolkit):
|
|
|
243
256
|
|
|
244
257
|
return files_changed
|
|
245
258
|
|
|
246
|
-
def
|
|
247
|
-
self, pr_number: int
|
|
259
|
+
def github_get_pull_request_comments(
|
|
260
|
+
self, repo_name: str, pr_number: int
|
|
248
261
|
) -> List[Dict[str, str]]:
|
|
249
262
|
r"""Retrieves the comments from a specific pull request.
|
|
250
263
|
|
|
251
264
|
Args:
|
|
265
|
+
repo_name (str): The name of the GitHub repository.
|
|
252
266
|
pr_number (int): The number of the pull request to retrieve.
|
|
253
267
|
|
|
254
268
|
Returns:
|
|
255
269
|
List[Dict[str, str]]: A list of dictionaries where each dictionary
|
|
256
270
|
contains the user ID and the comment body.
|
|
257
271
|
"""
|
|
272
|
+
repo = self.github.get_repo(repo_name)
|
|
258
273
|
# Retrieve the specific pull request
|
|
259
|
-
pr =
|
|
274
|
+
pr = repo.get_pull(number=pr_number)
|
|
260
275
|
|
|
261
276
|
# Collect the comments from the pull request
|
|
262
277
|
comments = []
|
|
@@ -266,13 +281,16 @@ class GithubToolkit(BaseToolkit):
|
|
|
266
281
|
|
|
267
282
|
return comments
|
|
268
283
|
|
|
269
|
-
def
|
|
284
|
+
def github_get_all_file_paths(
|
|
285
|
+
self, repo_name: str, path: str = ""
|
|
286
|
+
) -> List[str]:
|
|
270
287
|
r"""Recursively retrieves all file paths in the GitHub repository.
|
|
271
288
|
|
|
272
289
|
Args:
|
|
290
|
+
repo_name (str): The name of the GitHub repository.
|
|
273
291
|
path (str): The repository path to start the traversal from.
|
|
274
292
|
empty string means starts from the root directory.
|
|
275
|
-
(default: :obj
|
|
293
|
+
(default: :obj:`""`)
|
|
276
294
|
|
|
277
295
|
Returns:
|
|
278
296
|
List[str]: A list of file paths within the specified directory
|
|
@@ -280,11 +298,13 @@ class GithubToolkit(BaseToolkit):
|
|
|
280
298
|
"""
|
|
281
299
|
from github.ContentFile import ContentFile
|
|
282
300
|
|
|
301
|
+
repo = self.github.get_repo(repo_name)
|
|
302
|
+
|
|
283
303
|
files: List[str] = []
|
|
284
304
|
|
|
285
305
|
# Retrieves all contents of the current directory
|
|
286
|
-
contents: Union[List[ContentFile], ContentFile] = (
|
|
287
|
-
|
|
306
|
+
contents: Union[List[ContentFile], ContentFile] = repo.get_contents(
|
|
307
|
+
path
|
|
288
308
|
)
|
|
289
309
|
|
|
290
310
|
if isinstance(contents, ContentFile):
|
|
@@ -293,16 +313,19 @@ class GithubToolkit(BaseToolkit):
|
|
|
293
313
|
for content in contents:
|
|
294
314
|
if content.type == "dir":
|
|
295
315
|
# If it's a directory, recursively retrieve its file paths
|
|
296
|
-
files.extend(self.
|
|
316
|
+
files.extend(self.github_get_all_file_paths(content.path))
|
|
297
317
|
else:
|
|
298
318
|
# If it's a file, add its path to the list
|
|
299
319
|
files.append(content.path)
|
|
300
320
|
return files
|
|
301
321
|
|
|
302
|
-
def
|
|
322
|
+
def github_retrieve_file_content(
|
|
323
|
+
self, repo_name: str, file_path: str
|
|
324
|
+
) -> str:
|
|
303
325
|
r"""Retrieves the content of a file from the GitHub repository.
|
|
304
326
|
|
|
305
327
|
Args:
|
|
328
|
+
repo_name (str): The name of the GitHub repository.
|
|
306
329
|
file_path (str): The path of the file to retrieve.
|
|
307
330
|
|
|
308
331
|
Returns:
|
|
@@ -310,7 +333,9 @@ class GithubToolkit(BaseToolkit):
|
|
|
310
333
|
"""
|
|
311
334
|
from github.ContentFile import ContentFile
|
|
312
335
|
|
|
313
|
-
|
|
336
|
+
repo = self.github.get_repo(repo_name)
|
|
337
|
+
|
|
338
|
+
file_content = repo.get_contents(file_path)
|
|
314
339
|
if isinstance(file_content, ContentFile):
|
|
315
340
|
return file_content.decoded_content.decode()
|
|
316
341
|
else:
|
|
@@ -325,12 +350,92 @@ class GithubToolkit(BaseToolkit):
|
|
|
325
350
|
the functions in the toolkit.
|
|
326
351
|
"""
|
|
327
352
|
return [
|
|
328
|
-
FunctionTool(self.
|
|
329
|
-
FunctionTool(self.
|
|
330
|
-
FunctionTool(self.
|
|
331
|
-
FunctionTool(self.
|
|
332
|
-
FunctionTool(self.
|
|
333
|
-
FunctionTool(self.
|
|
334
|
-
FunctionTool(self.
|
|
335
|
-
FunctionTool(self.
|
|
353
|
+
FunctionTool(self.github_create_pull_request),
|
|
354
|
+
FunctionTool(self.github_get_issue_list),
|
|
355
|
+
FunctionTool(self.github_get_issue_content),
|
|
356
|
+
FunctionTool(self.github_get_pull_request_list),
|
|
357
|
+
FunctionTool(self.github_get_pull_request_code),
|
|
358
|
+
FunctionTool(self.github_get_pull_request_comments),
|
|
359
|
+
FunctionTool(self.github_get_all_file_paths),
|
|
360
|
+
FunctionTool(self.github_retrieve_file_content),
|
|
336
361
|
]
|
|
362
|
+
|
|
363
|
+
# Deprecated method aliases for backward compatibility
|
|
364
|
+
def create_pull_request(self, *args, **kwargs):
|
|
365
|
+
r"""Deprecated: Use github_create_pull_request instead."""
|
|
366
|
+
warnings.warn(
|
|
367
|
+
"create_pull_request is deprecated. Use "
|
|
368
|
+
"github_create_pull_request instead.",
|
|
369
|
+
DeprecationWarning,
|
|
370
|
+
stacklevel=2,
|
|
371
|
+
)
|
|
372
|
+
return self.github_create_pull_request(*args, **kwargs)
|
|
373
|
+
|
|
374
|
+
def get_issue_list(self, *args, **kwargs):
|
|
375
|
+
r"""Deprecated: Use github_get_issue_list instead."""
|
|
376
|
+
warnings.warn(
|
|
377
|
+
"get_issue_list is deprecated. Use github_get_issue_list instead.",
|
|
378
|
+
DeprecationWarning,
|
|
379
|
+
stacklevel=2,
|
|
380
|
+
)
|
|
381
|
+
return self.github_get_issue_list(*args, **kwargs)
|
|
382
|
+
|
|
383
|
+
def get_issue_content(self, *args, **kwargs):
|
|
384
|
+
r"""Deprecated: Use github_get_issue_content instead."""
|
|
385
|
+
warnings.warn(
|
|
386
|
+
"get_issue_content is deprecated. Use "
|
|
387
|
+
"github_get_issue_content instead.",
|
|
388
|
+
DeprecationWarning,
|
|
389
|
+
stacklevel=2,
|
|
390
|
+
)
|
|
391
|
+
return self.github_get_issue_content(*args, **kwargs)
|
|
392
|
+
|
|
393
|
+
def get_pull_request_list(self, *args, **kwargs):
|
|
394
|
+
r"""Deprecated: Use github_get_pull_request_list instead."""
|
|
395
|
+
warnings.warn(
|
|
396
|
+
"get_pull_request_list is deprecated. "
|
|
397
|
+
"Use github_get_pull_request_list instead.",
|
|
398
|
+
DeprecationWarning,
|
|
399
|
+
stacklevel=2,
|
|
400
|
+
)
|
|
401
|
+
return self.github_get_pull_request_list(*args, **kwargs)
|
|
402
|
+
|
|
403
|
+
def get_pull_request_code(self, *args, **kwargs):
|
|
404
|
+
r"""Deprecated: Use github_get_pull_request_code instead."""
|
|
405
|
+
warnings.warn(
|
|
406
|
+
"get_pull_request_code is deprecated. Use "
|
|
407
|
+
"github_get_pull_request_code instead.",
|
|
408
|
+
DeprecationWarning,
|
|
409
|
+
stacklevel=2,
|
|
410
|
+
)
|
|
411
|
+
return self.github_get_pull_request_code(*args, **kwargs)
|
|
412
|
+
|
|
413
|
+
def get_pull_request_comments(self, *args, **kwargs):
|
|
414
|
+
r"""Deprecated: Use github_get_pull_request_comments instead."""
|
|
415
|
+
warnings.warn(
|
|
416
|
+
"get_pull_request_comments is deprecated. "
|
|
417
|
+
"Use github_get_pull_request_comments instead.",
|
|
418
|
+
DeprecationWarning,
|
|
419
|
+
stacklevel=2,
|
|
420
|
+
)
|
|
421
|
+
return self.github_get_pull_request_comments(*args, **kwargs)
|
|
422
|
+
|
|
423
|
+
def get_all_file_paths(self, *args, **kwargs):
|
|
424
|
+
r"""Deprecated: Use github_get_all_file_paths instead."""
|
|
425
|
+
warnings.warn(
|
|
426
|
+
"get_all_file_paths is deprecated. Use "
|
|
427
|
+
"github_get_all_file_paths instead.",
|
|
428
|
+
DeprecationWarning,
|
|
429
|
+
stacklevel=2,
|
|
430
|
+
)
|
|
431
|
+
return self.github_get_all_file_paths(*args, **kwargs)
|
|
432
|
+
|
|
433
|
+
def retrieve_file_content(self, *args, **kwargs):
|
|
434
|
+
r"""Deprecated: Use github_retrieve_file_content instead."""
|
|
435
|
+
warnings.warn(
|
|
436
|
+
"retrieve_file_content is deprecated. "
|
|
437
|
+
"Use github_retrieve_file_content instead.",
|
|
438
|
+
DeprecationWarning,
|
|
439
|
+
stacklevel=2,
|
|
440
|
+
)
|
|
441
|
+
return self.github_retrieve_file_content(*args, **kwargs)
|