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
|
@@ -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,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-2025 @ CAMEL-AI.org. All Rights Reserved. =========
|
|
14
14
|
import os
|
|
15
15
|
import uuid
|
|
16
16
|
from typing import List, Optional
|
|
@@ -208,7 +208,7 @@ class AudioAnalysisToolkit(BaseToolkit):
|
|
|
208
208
|
<speech_transcription_result>{transcript}</
|
|
209
209
|
speech_transcription_result>
|
|
210
210
|
|
|
211
|
-
Please answer the following question based on the speech
|
|
211
|
+
Please answer the following question based on the speech
|
|
212
212
|
transcription result above:
|
|
213
213
|
<question>{question}</question>
|
|
214
214
|
"""
|
camel/toolkits/base.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,19 @@
|
|
|
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
|
-
from typing import List, Literal, Optional
|
|
15
|
+
from typing import TYPE_CHECKING, List, Literal, Optional
|
|
16
16
|
|
|
17
|
+
from camel.logger import get_logger
|
|
17
18
|
from camel.toolkits import FunctionTool
|
|
18
|
-
from camel.utils import AgentOpsMeta, with_timeout
|
|
19
|
+
from camel.utils import AgentOpsMeta, Constants, with_timeout
|
|
20
|
+
|
|
21
|
+
if TYPE_CHECKING:
|
|
22
|
+
from camel.agents import ChatAgent
|
|
23
|
+
|
|
24
|
+
|
|
25
|
+
logger = get_logger(__name__)
|
|
19
26
|
|
|
20
27
|
|
|
21
28
|
class BaseToolkit(metaclass=AgentOpsMeta):
|
|
@@ -28,9 +35,9 @@ class BaseToolkit(metaclass=AgentOpsMeta):
|
|
|
28
35
|
from mcp.server import FastMCP
|
|
29
36
|
|
|
30
37
|
mcp: FastMCP
|
|
31
|
-
timeout: Optional[float] =
|
|
38
|
+
timeout: Optional[float] = Constants.TIMEOUT_THRESHOLD
|
|
32
39
|
|
|
33
|
-
def __init__(self, timeout: Optional[float] =
|
|
40
|
+
def __init__(self, timeout: Optional[float] = Constants.TIMEOUT_THRESHOLD):
|
|
34
41
|
# check if timeout is a positive number
|
|
35
42
|
if timeout is not None and timeout <= 0:
|
|
36
43
|
raise ValueError("Timeout must be a positive number.")
|
|
@@ -41,7 +48,9 @@ class BaseToolkit(metaclass=AgentOpsMeta):
|
|
|
41
48
|
super().__init_subclass__(**kwargs)
|
|
42
49
|
for attr_name, attr_value in cls.__dict__.items():
|
|
43
50
|
if callable(attr_value) and not attr_name.startswith("__"):
|
|
44
|
-
|
|
51
|
+
# Skip methods that have manual timeout management
|
|
52
|
+
if not getattr(attr_value, '_manual_timeout', False):
|
|
53
|
+
setattr(cls, attr_name, with_timeout(attr_value))
|
|
45
54
|
|
|
46
55
|
def get_tools(self) -> List[FunctionTool]:
|
|
47
56
|
r"""Returns a list of FunctionTool objects representing the
|
|
@@ -63,3 +72,52 @@ class BaseToolkit(metaclass=AgentOpsMeta):
|
|
|
63
72
|
the MCP server in.
|
|
64
73
|
"""
|
|
65
74
|
self.mcp.run(mode)
|
|
75
|
+
|
|
76
|
+
|
|
77
|
+
class RegisteredAgentToolkit:
|
|
78
|
+
r"""Mixin class for toolkits that need to register a ChatAgent.
|
|
79
|
+
|
|
80
|
+
This mixin provides a standard interface for toolkits that require
|
|
81
|
+
a reference to a ChatAgent instance. The ChatAgent will check if a
|
|
82
|
+
toolkit has this mixin and automatically register itself.
|
|
83
|
+
"""
|
|
84
|
+
|
|
85
|
+
def __init__(self):
|
|
86
|
+
self._agent: Optional["ChatAgent"] = None
|
|
87
|
+
|
|
88
|
+
@property
|
|
89
|
+
def agent(self) -> Optional["ChatAgent"]:
|
|
90
|
+
r"""Get the registered ChatAgent instance.
|
|
91
|
+
|
|
92
|
+
Returns:
|
|
93
|
+
Optional[ChatAgent]: The registered agent, or None if not
|
|
94
|
+
registered.
|
|
95
|
+
|
|
96
|
+
Note:
|
|
97
|
+
If None is returned, it means the toolkit has not been registered
|
|
98
|
+
with a ChatAgent yet. Make sure to pass this toolkit to a ChatAgent
|
|
99
|
+
via the toolkits parameter during initialization.
|
|
100
|
+
"""
|
|
101
|
+
if self._agent is None:
|
|
102
|
+
logger.warning(
|
|
103
|
+
f"{self.__class__.__name__} does not have a "
|
|
104
|
+
f"registered ChatAgent. "
|
|
105
|
+
f"Please ensure this toolkit is passed to a ChatAgent via the "
|
|
106
|
+
f"'toolkits_to_register_agent' parameter during ChatAgent "
|
|
107
|
+
f"initialization if you want to use the tools that require a "
|
|
108
|
+
f"registered agent."
|
|
109
|
+
)
|
|
110
|
+
return self._agent
|
|
111
|
+
|
|
112
|
+
def register_agent(self, agent: "ChatAgent") -> None:
|
|
113
|
+
r"""Register a ChatAgent with this toolkit.
|
|
114
|
+
|
|
115
|
+
This method allows registering an agent after initialization. The
|
|
116
|
+
ChatAgent will automatically call this method if the toolkit to
|
|
117
|
+
register inherits from RegisteredAgentToolkit.
|
|
118
|
+
|
|
119
|
+
Args:
|
|
120
|
+
agent (ChatAgent): The ChatAgent instance to register.
|
|
121
|
+
"""
|
|
122
|
+
self._agent = agent
|
|
123
|
+
logger.info(f"Agent registered with {self.__class__.__name__}")
|
|
@@ -0,0 +1,318 @@
|
|
|
1
|
+
# ========= Copyright 2023-2025 @ CAMEL-AI.org. All Rights Reserved. =========
|
|
2
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
3
|
+
# you may not use this file except in compliance with the License.
|
|
4
|
+
# You may obtain a copy of the License at
|
|
5
|
+
#
|
|
6
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
|
7
|
+
#
|
|
8
|
+
# Unless required by applicable law or agreed to in writing, software
|
|
9
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
|
10
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
11
|
+
# See the License for the specific language governing permissions and
|
|
12
|
+
# limitations under the License.
|
|
13
|
+
# ========= Copyright 2023-2025 @ CAMEL-AI.org. All Rights Reserved. =========
|
|
14
|
+
import os
|
|
15
|
+
from typing import Any, Dict, List, Optional
|
|
16
|
+
|
|
17
|
+
try:
|
|
18
|
+
import yaml
|
|
19
|
+
|
|
20
|
+
HAS_YAML = True
|
|
21
|
+
except ImportError:
|
|
22
|
+
HAS_YAML = False
|
|
23
|
+
|
|
24
|
+
from camel.logger import get_logger
|
|
25
|
+
from camel.toolkits.base import BaseToolkit
|
|
26
|
+
from camel.toolkits.function_tool import FunctionTool
|
|
27
|
+
from camel.utils import MCPServer, api_keys_required
|
|
28
|
+
|
|
29
|
+
logger = get_logger(__name__)
|
|
30
|
+
|
|
31
|
+
|
|
32
|
+
@MCPServer()
|
|
33
|
+
class BohriumToolkit(BaseToolkit):
|
|
34
|
+
r"""A class representing a toolkit for interacting with Bohrium services.
|
|
35
|
+
|
|
36
|
+
Args:
|
|
37
|
+
timeout (Optional[float], optional): The timeout for BohriumToolkit.
|
|
38
|
+
(default: :obj:`None`)
|
|
39
|
+
api_key (Optional[str], optional): The API key for Bohrium client.
|
|
40
|
+
(default: :obj:`None`)
|
|
41
|
+
project_id (Optional[int], optional): The project ID for Bohrium
|
|
42
|
+
client. (default: :obj:`None`)
|
|
43
|
+
yaml_path (Optional[str], optional): The path to the YAML file
|
|
44
|
+
containing the job parameters. (default: :obj:`None`)
|
|
45
|
+
"""
|
|
46
|
+
|
|
47
|
+
@api_keys_required(
|
|
48
|
+
[
|
|
49
|
+
("api_key", "BOHRIUM_API_KEY"),
|
|
50
|
+
]
|
|
51
|
+
)
|
|
52
|
+
def __init__(
|
|
53
|
+
self,
|
|
54
|
+
timeout: Optional[float] = None,
|
|
55
|
+
api_key: Optional[str] = None,
|
|
56
|
+
project_id: Optional[int] = None,
|
|
57
|
+
yaml_path: Optional[str] = None,
|
|
58
|
+
_test_mode: bool = False, # Used for testing without dependency
|
|
59
|
+
):
|
|
60
|
+
super().__init__(timeout=timeout)
|
|
61
|
+
|
|
62
|
+
# Special path for testing without bohrium installed
|
|
63
|
+
if _test_mode:
|
|
64
|
+
self._client = None
|
|
65
|
+
self._job = None
|
|
66
|
+
self._project_id = project_id
|
|
67
|
+
self._yaml_path = yaml_path
|
|
68
|
+
return
|
|
69
|
+
|
|
70
|
+
try:
|
|
71
|
+
# Only import bohrium if not in test mode
|
|
72
|
+
from bohrium._client import Bohrium
|
|
73
|
+
from bohrium.resources import Job
|
|
74
|
+
except ImportError:
|
|
75
|
+
logger.error(
|
|
76
|
+
"bohrium is not installed, install it from "
|
|
77
|
+
"https://github.com/dptech-corp"
|
|
78
|
+
"/bohrium-openapi-python-sdk"
|
|
79
|
+
)
|
|
80
|
+
raise
|
|
81
|
+
|
|
82
|
+
api_key = api_key or os.environ.get("BOHRIUM_API_KEY")
|
|
83
|
+
self._client = Bohrium(access_key=api_key, project_id=project_id)
|
|
84
|
+
self._job = Job(self._client)
|
|
85
|
+
self._project_id = project_id
|
|
86
|
+
self._yaml_path = yaml_path
|
|
87
|
+
|
|
88
|
+
# refactor insert method
|
|
89
|
+
self._job.insert = self._custom_insert
|
|
90
|
+
|
|
91
|
+
def _custom_insert(self, data):
|
|
92
|
+
r"""refactor insert method, ensure return jobId information"""
|
|
93
|
+
|
|
94
|
+
response = self._client.post("/openapi/v2/job/add", json=data)
|
|
95
|
+
result = response.json()
|
|
96
|
+
|
|
97
|
+
return result
|
|
98
|
+
|
|
99
|
+
def submit_job(
|
|
100
|
+
self,
|
|
101
|
+
job_name: str = "bohr-job",
|
|
102
|
+
machine_type: str = "c2_m4_cpu",
|
|
103
|
+
cmd: str = "mpirun -n 2 lmp_mpi -i in.shear",
|
|
104
|
+
image_address: str = "registry.dp.tech/dptech/lammps:29Sep2021",
|
|
105
|
+
) -> Dict[str, Any]:
|
|
106
|
+
r"""Submit a job to Bohrium.
|
|
107
|
+
|
|
108
|
+
Args:
|
|
109
|
+
job_name (str): The name of the job. It will be updated when yaml
|
|
110
|
+
file is provided. The yaml file might be set when initialize
|
|
111
|
+
BohriumToolkit.
|
|
112
|
+
(default: :obj:`bohr-job`)
|
|
113
|
+
machine_type (str): The type of machine to use. It will be updated
|
|
114
|
+
when yaml file is provided. The yaml file might be set when
|
|
115
|
+
initialize BohriumToolkit.
|
|
116
|
+
(default: :obj:`c2_m4_cpu`)
|
|
117
|
+
cmd (str): The command to run. It will be updated when yaml file
|
|
118
|
+
is provided. The yaml file might be set when initialize
|
|
119
|
+
(default: :obj:`mpirun -n 2 lmp_mpi -i in.shear`)
|
|
120
|
+
image_address (str): The address of the image to use. It will be
|
|
121
|
+
updated when yaml file is provided. The yaml file might be set
|
|
122
|
+
when initialize BohriumToolkit.
|
|
123
|
+
(default: :obj:`registry.dp.tech/dptech/lammps:29Sep2021`)
|
|
124
|
+
|
|
125
|
+
Returns:
|
|
126
|
+
Dict[str, Any]: The result of the job submission.
|
|
127
|
+
"""
|
|
128
|
+
# Initialize params with default values
|
|
129
|
+
params: Dict[str, Any] = {
|
|
130
|
+
"project_id": self._project_id,
|
|
131
|
+
"job_name": job_name,
|
|
132
|
+
"machine_type": machine_type,
|
|
133
|
+
"cmd": cmd,
|
|
134
|
+
"image_address": image_address,
|
|
135
|
+
"work_dir": "",
|
|
136
|
+
"result": "",
|
|
137
|
+
"dataset_path": [],
|
|
138
|
+
"log_files": [],
|
|
139
|
+
"out_files": [],
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
# First load from YAML file if provided
|
|
143
|
+
if self._yaml_path and HAS_YAML:
|
|
144
|
+
try:
|
|
145
|
+
with open(self._yaml_path, 'r') as file:
|
|
146
|
+
yaml_params = yaml.safe_load(file)
|
|
147
|
+
if yaml_params:
|
|
148
|
+
params.update(yaml_params)
|
|
149
|
+
except yaml.YAMLError as e:
|
|
150
|
+
logger.error(f"Error parsing YAML file: {e}")
|
|
151
|
+
return {"error": f"YAML parsing error: {e!s}"}
|
|
152
|
+
except FileNotFoundError:
|
|
153
|
+
logger.error(f"YAML file not found: {self._yaml_path}")
|
|
154
|
+
return {"error": f"File not found: {self._yaml_path}"}
|
|
155
|
+
except Exception as e:
|
|
156
|
+
logger.error(f"Error loading YAML file: {e}")
|
|
157
|
+
return {"error": str(e)}
|
|
158
|
+
elif self._yaml_path and not HAS_YAML:
|
|
159
|
+
logger.warning(
|
|
160
|
+
"PyYAML is not installed. YAML file will be ignored."
|
|
161
|
+
)
|
|
162
|
+
return {"warning": "PyYAML is not installed. YAML file ignored."}
|
|
163
|
+
|
|
164
|
+
try:
|
|
165
|
+
result = self._job.submit( # type: ignore[union-attr]
|
|
166
|
+
project_id=params["project_id"],
|
|
167
|
+
job_name=params["job_name"],
|
|
168
|
+
machine_type=params["machine_type"],
|
|
169
|
+
cmd=params["cmd"],
|
|
170
|
+
image_address=params["image_address"],
|
|
171
|
+
job_group_id=params.get("job_group_id", 0),
|
|
172
|
+
work_dir=params["work_dir"],
|
|
173
|
+
result=params["result"],
|
|
174
|
+
dataset_path=params["dataset_path"],
|
|
175
|
+
log_files=params["log_files"],
|
|
176
|
+
out_files=params["out_files"],
|
|
177
|
+
)
|
|
178
|
+
|
|
179
|
+
return {"status": "Job submitted successfully", "result": result}
|
|
180
|
+
|
|
181
|
+
except Exception as e:
|
|
182
|
+
logger.error(f"Error submitting job: {e}")
|
|
183
|
+
return {"error": str(e)}
|
|
184
|
+
|
|
185
|
+
def get_job_details(self, job_id: int) -> Dict[str, Any]:
|
|
186
|
+
r"""Get details for a specific job.
|
|
187
|
+
|
|
188
|
+
Args:
|
|
189
|
+
job_id (int): The ID of the job.
|
|
190
|
+
|
|
191
|
+
Returns:
|
|
192
|
+
Dict[str, Any]: The job details.
|
|
193
|
+
"""
|
|
194
|
+
try:
|
|
195
|
+
return self._job.detail(job_id) # type: ignore[union-attr]
|
|
196
|
+
except Exception as e:
|
|
197
|
+
logger.error(f"Error getting job details: {e}")
|
|
198
|
+
return {"error": str(e)}
|
|
199
|
+
|
|
200
|
+
def terminate_job(self, job_id: int) -> Dict[str, Any]:
|
|
201
|
+
r"""Terminate a running job.
|
|
202
|
+
|
|
203
|
+
Args:
|
|
204
|
+
job_id (int): The ID of the job to terminate.
|
|
205
|
+
|
|
206
|
+
Returns:
|
|
207
|
+
Dict[str, Any]: The result of the termination request.
|
|
208
|
+
"""
|
|
209
|
+
try:
|
|
210
|
+
self._job.terminate(job_id) # type: ignore[union-attr]
|
|
211
|
+
return {"status": "Job terminated successfully"}
|
|
212
|
+
except Exception as e:
|
|
213
|
+
logger.error(f"Error terminating job: {e}")
|
|
214
|
+
return {"error": str(e)}
|
|
215
|
+
|
|
216
|
+
def kill_job(self, job_id: int) -> Dict[str, Any]:
|
|
217
|
+
r"""Kill a running job.
|
|
218
|
+
|
|
219
|
+
Args:
|
|
220
|
+
job_id (int): The ID of the job to kill.
|
|
221
|
+
|
|
222
|
+
Returns:
|
|
223
|
+
Dict[str, Any]: The result of the kill request.
|
|
224
|
+
"""
|
|
225
|
+
try:
|
|
226
|
+
self._job.kill(job_id) # type: ignore[union-attr]
|
|
227
|
+
return {"status": "Job killed successfully"}
|
|
228
|
+
except Exception as e:
|
|
229
|
+
logger.error(f"Error killing job: {e}")
|
|
230
|
+
return {"error": str(e)}
|
|
231
|
+
|
|
232
|
+
def get_job_logs(
|
|
233
|
+
self,
|
|
234
|
+
job_id: int,
|
|
235
|
+
log_file: str = "STDOUTERR",
|
|
236
|
+
page: int = -1,
|
|
237
|
+
page_size: int = 8192,
|
|
238
|
+
) -> str:
|
|
239
|
+
r"""Get logs for a specific job.
|
|
240
|
+
|
|
241
|
+
Args:
|
|
242
|
+
job_id (int): The ID of the job.
|
|
243
|
+
log_file (str, optional): The log file to get.
|
|
244
|
+
(default: :obj:`STDOUTERR`)
|
|
245
|
+
page (int, optional): The page number.
|
|
246
|
+
(default: :obj:`-1`)
|
|
247
|
+
page_size (int, optional): The page size.
|
|
248
|
+
(default: :obj:`8192`)
|
|
249
|
+
|
|
250
|
+
Returns:
|
|
251
|
+
str: The log contents.
|
|
252
|
+
"""
|
|
253
|
+
try:
|
|
254
|
+
return self._job.log( # type: ignore[union-attr]
|
|
255
|
+
job_id, log_file=log_file, page=page, page_size=page_size
|
|
256
|
+
)
|
|
257
|
+
except Exception as e:
|
|
258
|
+
logger.error(f"Error getting job logs: {e}")
|
|
259
|
+
return f"Error retrieving logs: {e!s}"
|
|
260
|
+
|
|
261
|
+
def create_job_group(
|
|
262
|
+
self, project_id: int, job_group_name: str
|
|
263
|
+
) -> Dict[str, Any]:
|
|
264
|
+
r"""Create a job group.
|
|
265
|
+
|
|
266
|
+
Args:
|
|
267
|
+
project_id (int): The ID of the project.
|
|
268
|
+
job_group_name (str): The name of the job group.
|
|
269
|
+
|
|
270
|
+
Returns:
|
|
271
|
+
Dict[str, Any]: The result of the job group creation.
|
|
272
|
+
"""
|
|
273
|
+
try:
|
|
274
|
+
self._job.create_job_group(project_id, job_group_name) # type: ignore[union-attr]
|
|
275
|
+
return {"status": "Job group created successfully"}
|
|
276
|
+
except Exception as e:
|
|
277
|
+
logger.error(f"Error creating job group: {e}")
|
|
278
|
+
return {"error": str(e)}
|
|
279
|
+
|
|
280
|
+
def download_job_results(
|
|
281
|
+
self, job_id: int, save_path: str
|
|
282
|
+
) -> Dict[str, Any]:
|
|
283
|
+
r"""Download the results of a job.
|
|
284
|
+
|
|
285
|
+
Args:
|
|
286
|
+
job_id (int): The ID of the job.
|
|
287
|
+
save_path (str): The path to save the results to.
|
|
288
|
+
|
|
289
|
+
Returns:
|
|
290
|
+
Dict[str, Any]: The result of the download request.
|
|
291
|
+
"""
|
|
292
|
+
try:
|
|
293
|
+
self._job.download(job_id, save_path) # type: ignore[union-attr]
|
|
294
|
+
return {
|
|
295
|
+
"status": "Job results downloaded successfully",
|
|
296
|
+
"path": save_path,
|
|
297
|
+
}
|
|
298
|
+
except Exception as e:
|
|
299
|
+
logger.error(f"Error downloading job results: {e}")
|
|
300
|
+
return {"error": str(e)}
|
|
301
|
+
|
|
302
|
+
def get_tools(self) -> List[FunctionTool]:
|
|
303
|
+
r"""Returns a list of FunctionTool objects representing the
|
|
304
|
+
functions in the toolkit.
|
|
305
|
+
|
|
306
|
+
Returns:
|
|
307
|
+
List[FunctionTool]: A list of FunctionTool objects
|
|
308
|
+
representing the functions in the toolkit.
|
|
309
|
+
"""
|
|
310
|
+
return [
|
|
311
|
+
FunctionTool(self.submit_job),
|
|
312
|
+
FunctionTool(self.get_job_details),
|
|
313
|
+
FunctionTool(self.terminate_job),
|
|
314
|
+
FunctionTool(self.kill_job),
|
|
315
|
+
FunctionTool(self.get_job_logs),
|
|
316
|
+
FunctionTool(self.create_job_group),
|
|
317
|
+
FunctionTool(self.download_job_results),
|
|
318
|
+
]
|