camel-ai 0.2.71a6__tar.gz → 0.2.71a8__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Potentially problematic release.
This version of camel-ai might be problematic. Click here for more details.
- {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/PKG-INFO +1 -1
- {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/__init__.py +1 -1
- {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/societies/workforce/single_agent_worker.py +2 -0
- {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/societies/workforce/task_channel.py +4 -1
- {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/societies/workforce/worker.py +2 -0
- {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/societies/workforce/workforce.py +20 -20
- {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/toolkits/file_write_toolkit.py +198 -132
- {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/toolkits/hybrid_browser_toolkit/actions.py +28 -18
- {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/toolkits/hybrid_browser_toolkit/agent.py +7 -1
- {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/toolkits/hybrid_browser_toolkit/browser_session.py +48 -18
- camel_ai-0.2.71a8/camel/toolkits/hybrid_browser_toolkit/config_loader.py +447 -0
- {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/toolkits/hybrid_browser_toolkit/hybrid_browser_toolkit.py +272 -85
- {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/toolkits/hybrid_browser_toolkit/snapshot.py +5 -4
- camel_ai-0.2.71a8/camel/toolkits/hybrid_browser_toolkit/unified_analyzer.js +1002 -0
- {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/toolkits/note_taking_toolkit.py +24 -9
- {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/toolkits/pptx_toolkit.py +21 -8
- {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/toolkits/search_toolkit.py +15 -5
- {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/pyproject.toml +1 -1
- camel_ai-0.2.71a6/camel/toolkits/hybrid_browser_toolkit/stealth_config.py +0 -116
- camel_ai-0.2.71a6/camel/toolkits/hybrid_browser_toolkit/unified_analyzer.js +0 -447
- {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/.gitignore +0 -0
- {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/LICENSE +0 -0
- {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/README.md +0 -0
- {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/agents/__init__.py +0 -0
- {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/agents/_types.py +0 -0
- {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/agents/_utils.py +0 -0
- {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/agents/base.py +0 -0
- {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/agents/chat_agent.py +0 -0
- {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/agents/critic_agent.py +0 -0
- {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/agents/deductive_reasoner_agent.py +0 -0
- {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/agents/embodied_agent.py +0 -0
- {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/agents/knowledge_graph_agent.py +0 -0
- {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/agents/mcp_agent.py +0 -0
- {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/agents/multi_hop_generator_agent.py +0 -0
- {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/agents/programmed_agent_instruction.py +0 -0
- {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/agents/repo_agent.py +0 -0
- {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/agents/role_assignment_agent.py +0 -0
- {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/agents/search_agent.py +0 -0
- {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/agents/task_agent.py +0 -0
- {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/agents/tool_agents/__init__.py +0 -0
- {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/agents/tool_agents/base.py +0 -0
- {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/agents/tool_agents/hugging_face_tool_agent.py +0 -0
- {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/benchmarks/__init__.py +0 -0
- {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/benchmarks/apibank.py +0 -0
- {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/benchmarks/apibench.py +0 -0
- {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/benchmarks/base.py +0 -0
- {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/benchmarks/browsecomp.py +0 -0
- {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/benchmarks/gaia.py +0 -0
- {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/benchmarks/mock_website/README.md +0 -0
- {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/benchmarks/mock_website/mock_web.py +0 -0
- {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/benchmarks/mock_website/requirements.txt +0 -0
- {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/benchmarks/mock_website/shopping_mall/app.py +0 -0
- {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/benchmarks/mock_website/task.json +0 -0
- {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/benchmarks/nexus.py +0 -0
- {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/benchmarks/ragbench.py +0 -0
- {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/bots/__init__.py +0 -0
- {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/bots/discord/__init__.py +0 -0
- {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/bots/discord/discord_app.py +0 -0
- {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/bots/discord/discord_installation.py +0 -0
- {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/bots/discord/discord_store.py +0 -0
- {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/bots/slack/__init__.py +0 -0
- {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/bots/slack/models.py +0 -0
- {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/bots/slack/slack_app.py +0 -0
- {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/bots/telegram_bot.py +0 -0
- {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/configs/__init__.py +0 -0
- {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/configs/aiml_config.py +0 -0
- {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/configs/anthropic_config.py +0 -0
- {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/configs/base_config.py +0 -0
- {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/configs/bedrock_config.py +0 -0
- {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/configs/cohere_config.py +0 -0
- {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/configs/crynux_config.py +0 -0
- {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/configs/deepseek_config.py +0 -0
- {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/configs/gemini_config.py +0 -0
- {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/configs/groq_config.py +0 -0
- {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/configs/internlm_config.py +0 -0
- {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/configs/litellm_config.py +0 -0
- {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/configs/lmstudio_config.py +0 -0
- {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/configs/mistral_config.py +0 -0
- {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/configs/modelscope_config.py +0 -0
- {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/configs/moonshot_config.py +0 -0
- {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/configs/netmind_config.py +0 -0
- {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/configs/novita_config.py +0 -0
- {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/configs/nvidia_config.py +0 -0
- {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/configs/ollama_config.py +0 -0
- {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/configs/openai_config.py +0 -0
- {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/configs/openrouter_config.py +0 -0
- {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/configs/ppio_config.py +0 -0
- {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/configs/qianfan_config.py +0 -0
- {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/configs/qwen_config.py +0 -0
- {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/configs/reka_config.py +0 -0
- {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/configs/samba_config.py +0 -0
- {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/configs/sglang_config.py +0 -0
- {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/configs/siliconflow_config.py +0 -0
- {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/configs/togetherai_config.py +0 -0
- {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/configs/vllm_config.py +0 -0
- {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/configs/watsonx_config.py +0 -0
- {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/configs/yi_config.py +0 -0
- {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/configs/zhipuai_config.py +0 -0
- {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/data_collectors/__init__.py +0 -0
- {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/data_collectors/alpaca_collector.py +0 -0
- {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/data_collectors/base.py +0 -0
- {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/data_collectors/sharegpt_collector.py +0 -0
- {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/datagen/__init__.py +0 -0
- {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/datagen/cot_datagen.py +0 -0
- {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/datagen/evol_instruct/__init__.py +0 -0
- {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/datagen/evol_instruct/evol_instruct.py +0 -0
- {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/datagen/evol_instruct/scorer.py +0 -0
- {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/datagen/evol_instruct/templates.py +0 -0
- {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/datagen/self_improving_cot.py +0 -0
- {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/datagen/self_instruct/__init__.py +0 -0
- {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/datagen/self_instruct/filter/__init__.py +0 -0
- {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/datagen/self_instruct/filter/filter_function.py +0 -0
- {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/datagen/self_instruct/filter/filter_registry.py +0 -0
- {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/datagen/self_instruct/filter/instruction_filter.py +0 -0
- {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/datagen/self_instruct/self_instruct.py +0 -0
- {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/datagen/self_instruct/templates.py +0 -0
- {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/datagen/source2synth/__init__.py +0 -0
- {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/datagen/source2synth/data_processor.py +0 -0
- {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/datagen/source2synth/models.py +0 -0
- {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/datagen/source2synth/user_data_processor_config.py +0 -0
- {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/datahubs/__init__.py +0 -0
- {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/datahubs/base.py +0 -0
- {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/datahubs/huggingface.py +0 -0
- {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/datahubs/models.py +0 -0
- {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/datasets/__init__.py +0 -0
- {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/datasets/base_generator.py +0 -0
- {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/datasets/few_shot_generator.py +0 -0
- {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/datasets/models.py +0 -0
- {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/datasets/self_instruct_generator.py +0 -0
- {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/datasets/static_dataset.py +0 -0
- {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/embeddings/__init__.py +0 -0
- {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/embeddings/azure_embedding.py +0 -0
- {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/embeddings/base.py +0 -0
- {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/embeddings/gemini_embedding.py +0 -0
- {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/embeddings/jina_embedding.py +0 -0
- {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/embeddings/mistral_embedding.py +0 -0
- {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/embeddings/openai_compatible_embedding.py +0 -0
- {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/embeddings/openai_embedding.py +0 -0
- {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/embeddings/sentence_transformers_embeddings.py +0 -0
- {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/embeddings/together_embedding.py +0 -0
- {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/embeddings/vlm_embedding.py +0 -0
- {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/environments/__init__.py +0 -0
- {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/environments/models.py +0 -0
- {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/environments/multi_step.py +0 -0
- {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/environments/rlcards_env.py +0 -0
- {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/environments/single_step.py +0 -0
- {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/environments/tic_tac_toe.py +0 -0
- {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/extractors/__init__.py +0 -0
- {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/extractors/base.py +0 -0
- {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/extractors/python_strategies.py +0 -0
- {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/generators.py +0 -0
- {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/human.py +0 -0
- {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/interpreters/__init__.py +0 -0
- {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/interpreters/base.py +0 -0
- {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/interpreters/docker/Dockerfile +0 -0
- {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/interpreters/docker_interpreter.py +0 -0
- {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/interpreters/e2b_interpreter.py +0 -0
- {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/interpreters/internal_python_interpreter.py +0 -0
- {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/interpreters/interpreter_error.py +0 -0
- {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/interpreters/ipython_interpreter.py +0 -0
- {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/interpreters/subprocess_interpreter.py +0 -0
- {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/loaders/__init__.py +0 -0
- {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/loaders/apify_reader.py +0 -0
- {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/loaders/base_io.py +0 -0
- {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/loaders/base_loader.py +0 -0
- {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/loaders/chunkr_reader.py +0 -0
- {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/loaders/crawl4ai_reader.py +0 -0
- {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/loaders/firecrawl_reader.py +0 -0
- {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/loaders/jina_url_reader.py +0 -0
- {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/loaders/markitdown.py +0 -0
- {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/loaders/mineru_extractor.py +0 -0
- {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/loaders/mistral_reader.py +0 -0
- {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/loaders/pandas_reader.py +0 -0
- {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/loaders/scrapegraph_reader.py +0 -0
- {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/loaders/unstructured_io.py +0 -0
- {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/logger.py +0 -0
- {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/memories/__init__.py +0 -0
- {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/memories/agent_memories.py +0 -0
- {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/memories/base.py +0 -0
- {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/memories/blocks/__init__.py +0 -0
- {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/memories/blocks/chat_history_block.py +0 -0
- {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/memories/blocks/vectordb_block.py +0 -0
- {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/memories/context_creators/__init__.py +0 -0
- {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/memories/context_creators/score_based.py +0 -0
- {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/memories/records.py +0 -0
- {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/messages/__init__.py +0 -0
- {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/messages/base.py +0 -0
- {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/messages/conversion/__init__.py +0 -0
- {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/messages/conversion/alpaca.py +0 -0
- {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/messages/conversion/conversation_models.py +0 -0
- {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/messages/conversion/sharegpt/__init__.py +0 -0
- {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/messages/conversion/sharegpt/function_call_formatter.py +0 -0
- {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/messages/conversion/sharegpt/hermes/__init__.py +0 -0
- {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/messages/conversion/sharegpt/hermes/hermes_function_formatter.py +0 -0
- {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/messages/func_message.py +0 -0
- {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/models/__init__.py +0 -0
- {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/models/_utils.py +0 -0
- {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/models/aiml_model.py +0 -0
- {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/models/anthropic_model.py +0 -0
- {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/models/aws_bedrock_model.py +0 -0
- {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/models/azure_openai_model.py +0 -0
- {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/models/base_audio_model.py +0 -0
- {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/models/base_model.py +0 -0
- {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/models/cohere_model.py +0 -0
- {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/models/crynux_model.py +0 -0
- {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/models/deepseek_model.py +0 -0
- {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/models/fish_audio_model.py +0 -0
- {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/models/gemini_model.py +0 -0
- {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/models/groq_model.py +0 -0
- {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/models/internlm_model.py +0 -0
- {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/models/litellm_model.py +0 -0
- {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/models/lmstudio_model.py +0 -0
- {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/models/mistral_model.py +0 -0
- {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/models/model_factory.py +0 -0
- {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/models/model_manager.py +0 -0
- {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/models/modelscope_model.py +0 -0
- {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/models/moonshot_model.py +0 -0
- {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/models/nemotron_model.py +0 -0
- {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/models/netmind_model.py +0 -0
- {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/models/novita_model.py +0 -0
- {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/models/nvidia_model.py +0 -0
- {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/models/ollama_model.py +0 -0
- {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/models/openai_audio_models.py +0 -0
- {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/models/openai_compatible_model.py +0 -0
- {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/models/openai_model.py +0 -0
- {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/models/openrouter_model.py +0 -0
- {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/models/ppio_model.py +0 -0
- {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/models/qianfan_model.py +0 -0
- {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/models/qwen_model.py +0 -0
- {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/models/reka_model.py +0 -0
- {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/models/reward/__init__.py +0 -0
- {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/models/reward/base_reward_model.py +0 -0
- {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/models/reward/evaluator.py +0 -0
- {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/models/reward/nemotron_model.py +0 -0
- {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/models/reward/skywork_model.py +0 -0
- {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/models/samba_model.py +0 -0
- {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/models/sglang_model.py +0 -0
- {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/models/siliconflow_model.py +0 -0
- {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/models/stub_model.py +0 -0
- {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/models/togetherai_model.py +0 -0
- {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/models/vllm_model.py +0 -0
- {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/models/volcano_model.py +0 -0
- {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/models/watsonx_model.py +0 -0
- {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/models/yi_model.py +0 -0
- {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/models/zhipuai_model.py +0 -0
- {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/personas/__init__.py +0 -0
- {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/personas/persona.py +0 -0
- {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/personas/persona_hub.py +0 -0
- {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/prompts/__init__.py +0 -0
- {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/prompts/ai_society.py +0 -0
- {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/prompts/base.py +0 -0
- {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/prompts/code.py +0 -0
- {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/prompts/evaluation.py +0 -0
- {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/prompts/generate_text_embedding_data.py +0 -0
- {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/prompts/image_craft.py +0 -0
- {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/prompts/misalignment.py +0 -0
- {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/prompts/multi_condition_image_craft.py +0 -0
- {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/prompts/object_recognition.py +0 -0
- {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/prompts/persona_hub.py +0 -0
- {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/prompts/prompt_templates.py +0 -0
- {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/prompts/role_description_prompt_template.py +0 -0
- {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/prompts/solution_extraction.py +0 -0
- {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/prompts/task_prompt_template.py +0 -0
- {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/prompts/translation.py +0 -0
- {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/prompts/video_description_prompt.py +0 -0
- {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/py.typed +0 -0
- {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/responses/__init__.py +0 -0
- {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/responses/agent_responses.py +0 -0
- {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/retrievers/__init__.py +0 -0
- {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/retrievers/auto_retriever.py +0 -0
- {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/retrievers/base.py +0 -0
- {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/retrievers/bm25_retriever.py +0 -0
- {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/retrievers/cohere_rerank_retriever.py +0 -0
- {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/retrievers/hybrid_retrival.py +0 -0
- {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/retrievers/vector_retriever.py +0 -0
- {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/runtimes/__init__.py +0 -0
- {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/runtimes/api.py +0 -0
- {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/runtimes/base.py +0 -0
- {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/runtimes/configs.py +0 -0
- {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/runtimes/daytona_runtime.py +0 -0
- {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/runtimes/docker_runtime.py +0 -0
- {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/runtimes/llm_guard_runtime.py +0 -0
- {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/runtimes/remote_http_runtime.py +0 -0
- {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/runtimes/ubuntu_docker_runtime.py +0 -0
- {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/runtimes/utils/__init__.py +0 -0
- {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/runtimes/utils/function_risk_toolkit.py +0 -0
- {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/runtimes/utils/ignore_risk_toolkit.py +0 -0
- {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/schemas/__init__.py +0 -0
- {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/schemas/base.py +0 -0
- {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/schemas/openai_converter.py +0 -0
- {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/schemas/outlines_converter.py +0 -0
- {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/services/agent_openapi_server.py +0 -0
- {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/societies/__init__.py +0 -0
- {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/societies/babyagi_playing.py +0 -0
- {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/societies/role_playing.py +0 -0
- {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/societies/workforce/__init__.py +0 -0
- {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/societies/workforce/base.py +0 -0
- {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/societies/workforce/prompts.py +0 -0
- {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/societies/workforce/role_playing_worker.py +0 -0
- {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/societies/workforce/structured_output_handler.py +0 -0
- {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/societies/workforce/utils.py +0 -0
- {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/societies/workforce/workforce_logger.py +0 -0
- {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/storages/__init__.py +0 -0
- {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/storages/graph_storages/__init__.py +0 -0
- {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/storages/graph_storages/base.py +0 -0
- {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/storages/graph_storages/graph_element.py +0 -0
- {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/storages/graph_storages/nebula_graph.py +0 -0
- {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/storages/graph_storages/neo4j_graph.py +0 -0
- {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/storages/key_value_storages/__init__.py +0 -0
- {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/storages/key_value_storages/base.py +0 -0
- {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/storages/key_value_storages/in_memory.py +0 -0
- {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/storages/key_value_storages/json.py +0 -0
- {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/storages/key_value_storages/mem0_cloud.py +0 -0
- {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/storages/key_value_storages/redis.py +0 -0
- {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/storages/object_storages/__init__.py +0 -0
- {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/storages/object_storages/amazon_s3.py +0 -0
- {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/storages/object_storages/azure_blob.py +0 -0
- {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/storages/object_storages/base.py +0 -0
- {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/storages/object_storages/google_cloud.py +0 -0
- {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/storages/vectordb_storages/__init__.py +0 -0
- {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/storages/vectordb_storages/base.py +0 -0
- {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/storages/vectordb_storages/chroma.py +0 -0
- {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/storages/vectordb_storages/faiss.py +0 -0
- {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/storages/vectordb_storages/milvus.py +0 -0
- {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/storages/vectordb_storages/oceanbase.py +0 -0
- {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/storages/vectordb_storages/pgvector.py +0 -0
- {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/storages/vectordb_storages/qdrant.py +0 -0
- {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/storages/vectordb_storages/tidb.py +0 -0
- {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/storages/vectordb_storages/weaviate.py +0 -0
- {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/tasks/__init__.py +0 -0
- {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/tasks/task.py +0 -0
- {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/tasks/task_prompt.py +0 -0
- {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/terminators/__init__.py +0 -0
- {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/terminators/base.py +0 -0
- {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/terminators/response_terminator.py +0 -0
- {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/terminators/token_limit_terminator.py +0 -0
- {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/toolkits/__init__.py +0 -0
- {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/toolkits/aci_toolkit.py +0 -0
- {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/toolkits/arxiv_toolkit.py +0 -0
- {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/toolkits/ask_news_toolkit.py +0 -0
- {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/toolkits/async_browser_toolkit.py +0 -0
- {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/toolkits/audio_analysis_toolkit.py +0 -0
- {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/toolkits/base.py +0 -0
- {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/toolkits/bohrium_toolkit.py +0 -0
- {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/toolkits/browser_toolkit.py +0 -0
- {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/toolkits/browser_toolkit_commons.py +0 -0
- {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/toolkits/code_execution.py +0 -0
- {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/toolkits/craw4ai_toolkit.py +0 -0
- {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/toolkits/dappier_toolkit.py +0 -0
- {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/toolkits/data_commons_toolkit.py +0 -0
- {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/toolkits/edgeone_pages_mcp_toolkit.py +0 -0
- {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/toolkits/excel_toolkit.py +0 -0
- {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/toolkits/function_tool.py +0 -0
- {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/toolkits/github_toolkit.py +0 -0
- {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/toolkits/google_calendar_toolkit.py +0 -0
- {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/toolkits/google_drive_mcp_toolkit.py +0 -0
- {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/toolkits/google_maps_toolkit.py +0 -0
- {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/toolkits/google_scholar_toolkit.py +0 -0
- {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/toolkits/human_toolkit.py +0 -0
- {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/toolkits/hybrid_browser_toolkit/__init__.py +0 -0
- {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/toolkits/hybrid_browser_toolkit/stealth_script.js +0 -0
- {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/toolkits/image_analysis_toolkit.py +0 -0
- {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/toolkits/jina_reranker_toolkit.py +0 -0
- {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/toolkits/klavis_toolkit.py +0 -0
- {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/toolkits/linkedin_toolkit.py +0 -0
- {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/toolkits/markitdown_toolkit.py +0 -0
- {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/toolkits/math_toolkit.py +0 -0
- {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/toolkits/mcp_toolkit.py +0 -0
- {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/toolkits/memory_toolkit.py +0 -0
- {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/toolkits/meshy_toolkit.py +0 -0
- {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/toolkits/message_agent_toolkit.py +0 -0
- {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/toolkits/mineru_toolkit.py +0 -0
- {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/toolkits/networkx_toolkit.py +0 -0
- {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/toolkits/notion_toolkit.py +0 -0
- {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/toolkits/open_api_specs/biztoc/__init__.py +0 -0
- {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/toolkits/open_api_specs/biztoc/ai-plugin.json +0 -0
- {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/toolkits/open_api_specs/biztoc/openapi.yaml +0 -0
- {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/toolkits/open_api_specs/coursera/__init__.py +0 -0
- {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/toolkits/open_api_specs/coursera/openapi.yaml +0 -0
- {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/toolkits/open_api_specs/create_qr_code/__init__.py +0 -0
- {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/toolkits/open_api_specs/create_qr_code/openapi.yaml +0 -0
- {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/toolkits/open_api_specs/klarna/__init__.py +0 -0
- {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/toolkits/open_api_specs/klarna/openapi.yaml +0 -0
- {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/toolkits/open_api_specs/nasa_apod/__init__.py +0 -0
- {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/toolkits/open_api_specs/nasa_apod/openapi.yaml +0 -0
- {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/toolkits/open_api_specs/outschool/__init__.py +0 -0
- {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/toolkits/open_api_specs/outschool/ai-plugin.json +0 -0
- {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/toolkits/open_api_specs/outschool/openapi.yaml +0 -0
- {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/toolkits/open_api_specs/outschool/paths/__init__.py +0 -0
- {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/toolkits/open_api_specs/outschool/paths/get_classes.py +0 -0
- {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/toolkits/open_api_specs/outschool/paths/search_teachers.py +0 -0
- {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/toolkits/open_api_specs/security_config.py +0 -0
- {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/toolkits/open_api_specs/speak/__init__.py +0 -0
- {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/toolkits/open_api_specs/speak/openapi.yaml +0 -0
- {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/toolkits/open_api_specs/web_scraper/__init__.py +0 -0
- {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/toolkits/open_api_specs/web_scraper/ai-plugin.json +0 -0
- {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/toolkits/open_api_specs/web_scraper/openapi.yaml +0 -0
- {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/toolkits/open_api_specs/web_scraper/paths/__init__.py +0 -0
- {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/toolkits/open_api_specs/web_scraper/paths/scraper.py +0 -0
- {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/toolkits/open_api_toolkit.py +0 -0
- {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/toolkits/openai_agent_toolkit.py +0 -0
- {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/toolkits/openai_image_toolkit.py +0 -0
- {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/toolkits/openbb_toolkit.py +0 -0
- {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/toolkits/page_script.js +0 -0
- {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/toolkits/playwright_mcp_toolkit.py +0 -0
- {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/toolkits/pubmed_toolkit.py +0 -0
- {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/toolkits/pulse_mcp_search_toolkit.py +0 -0
- {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/toolkits/pyautogui_toolkit.py +0 -0
- {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/toolkits/reddit_toolkit.py +0 -0
- {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/toolkits/retrieval_toolkit.py +0 -0
- {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/toolkits/searxng_toolkit.py +0 -0
- {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/toolkits/semantic_scholar_toolkit.py +0 -0
- {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/toolkits/slack_toolkit.py +0 -0
- {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/toolkits/stripe_toolkit.py +0 -0
- {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/toolkits/sympy_toolkit.py +0 -0
- {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/toolkits/task_planning_toolkit.py +0 -0
- {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/toolkits/terminal_toolkit.py +0 -0
- {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/toolkits/thinking_toolkit.py +0 -0
- {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/toolkits/twitter_toolkit.py +0 -0
- {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/toolkits/video_analysis_toolkit.py +0 -0
- {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/toolkits/video_download_toolkit.py +0 -0
- {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/toolkits/weather_toolkit.py +0 -0
- {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/toolkits/whatsapp_toolkit.py +0 -0
- {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/toolkits/wolfram_alpha_toolkit.py +0 -0
- {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/toolkits/zapier_toolkit.py +0 -0
- {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/types/__init__.py +0 -0
- {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/types/agents/__init__.py +0 -0
- {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/types/agents/tool_calling_record.py +0 -0
- {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/types/enums.py +0 -0
- {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/types/mcp_registries.py +0 -0
- {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/types/openai_types.py +0 -0
- {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/types/unified_model_type.py +0 -0
- {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/utils/__init__.py +0 -0
- {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/utils/async_func.py +0 -0
- {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/utils/chunker/__init__.py +0 -0
- {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/utils/chunker/base.py +0 -0
- {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/utils/chunker/code_chunker.py +0 -0
- {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/utils/chunker/uio_chunker.py +0 -0
- {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/utils/commons.py +0 -0
- {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/utils/constants.py +0 -0
- {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/utils/deduplication.py +0 -0
- {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/utils/filename.py +0 -0
- {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/utils/langfuse.py +0 -0
- {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/utils/mcp.py +0 -0
- {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/utils/mcp_client.py +0 -0
- {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/utils/message_summarizer.py +0 -0
- {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/utils/response_format.py +0 -0
- {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/utils/token_counting.py +0 -0
- {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/utils/tool_result.py +0 -0
- {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/verifiers/__init__.py +0 -0
- {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/verifiers/base.py +0 -0
- {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/verifiers/math_verifier.py +0 -0
- {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/verifiers/models.py +0 -0
- {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/verifiers/physics_verifier.py +0 -0
- {camel_ai-0.2.71a6 → camel_ai-0.2.71a8}/camel/verifiers/python_verifier.py +0 -0
|
@@ -344,6 +344,8 @@ class SingleAgentWorker(Worker):
|
|
|
344
344
|
f"{Fore.RED}Error processing task {task.id}: "
|
|
345
345
|
f"{type(e).__name__}: {e}{Fore.RESET}"
|
|
346
346
|
)
|
|
347
|
+
# Store error information in task result
|
|
348
|
+
task.result = f"{type(e).__name__}: {e!s}"
|
|
347
349
|
return TaskState.FAILED
|
|
348
350
|
finally:
|
|
349
351
|
# Return agent to pool or let it be garbage collected
|
|
@@ -91,11 +91,14 @@ class TaskChannel:
|
|
|
91
91
|
"""
|
|
92
92
|
async with self._condition:
|
|
93
93
|
while True:
|
|
94
|
-
for packet in self._task_dict.
|
|
94
|
+
for task_id, packet in list(self._task_dict.items()):
|
|
95
95
|
if packet.publisher_id != publisher_id:
|
|
96
96
|
continue
|
|
97
97
|
if packet.status != PacketStatus.RETURNED:
|
|
98
98
|
continue
|
|
99
|
+
# Remove the task to prevent returning it again
|
|
100
|
+
del self._task_dict[task_id]
|
|
101
|
+
self._condition.notify_all()
|
|
99
102
|
return packet.task
|
|
100
103
|
await self._condition.wait()
|
|
101
104
|
|
|
@@ -103,6 +103,8 @@ class Worker(BaseNode, ABC):
|
|
|
103
103
|
await self._channel.return_task(task.id)
|
|
104
104
|
except Exception as e:
|
|
105
105
|
logger.error(f"Error processing task {task.id}: {e}")
|
|
106
|
+
# Store error information in task result
|
|
107
|
+
task.result = f"{type(e).__name__}: {e!s}"
|
|
106
108
|
task.set_state(TaskState.FAILED)
|
|
107
109
|
await self._channel.return_task(task.id)
|
|
108
110
|
finally:
|
|
@@ -551,6 +551,10 @@ class Workforce(BaseNode):
|
|
|
551
551
|
continue
|
|
552
552
|
|
|
553
553
|
if not memory_records:
|
|
554
|
+
logger.warning(
|
|
555
|
+
"No valid memory records could be reconstructed "
|
|
556
|
+
"for sharing"
|
|
557
|
+
)
|
|
554
558
|
return
|
|
555
559
|
|
|
556
560
|
# Share with coordinator agent
|
|
@@ -668,6 +672,12 @@ class Workforce(BaseNode):
|
|
|
668
672
|
if task_id in self._task_start_times:
|
|
669
673
|
del self._task_start_times[task_id]
|
|
670
674
|
|
|
675
|
+
if task_id in self._task_dependencies:
|
|
676
|
+
del self._task_dependencies[task_id]
|
|
677
|
+
|
|
678
|
+
if task_id in self._assignees:
|
|
679
|
+
del self._assignees[task_id]
|
|
680
|
+
|
|
671
681
|
def _decompose_task(self, task: Task) -> List[Task]:
|
|
672
682
|
r"""Decompose the task into subtasks. This method will also set the
|
|
673
683
|
relationship between the task and its subtasks.
|
|
@@ -991,8 +1001,13 @@ class Workforce(BaseNode):
|
|
|
991
1001
|
tasks_dict = {task.id: task for task in self._pending_tasks}
|
|
992
1002
|
|
|
993
1003
|
# Check if all provided IDs exist
|
|
994
|
-
|
|
995
|
-
|
|
1004
|
+
invalid_ids = [
|
|
1005
|
+
task_id for task_id in task_ids if task_id not in tasks_dict
|
|
1006
|
+
]
|
|
1007
|
+
if invalid_ids:
|
|
1008
|
+
logger.warning(
|
|
1009
|
+
f"Task IDs not found in pending tasks: {invalid_ids}"
|
|
1010
|
+
)
|
|
996
1011
|
return False
|
|
997
1012
|
|
|
998
1013
|
# Check if we have the same number of tasks
|
|
@@ -2057,7 +2072,6 @@ class Workforce(BaseNode):
|
|
|
2057
2072
|
logger.error(
|
|
2058
2073
|
f"JSON parsing error in worker creation: Invalid "
|
|
2059
2074
|
f"response format - {e}. Response content: "
|
|
2060
|
-
f"format - {e}. Response content: "
|
|
2061
2075
|
f"{response.msg.content[:100]}..."
|
|
2062
2076
|
)
|
|
2063
2077
|
raise RuntimeError(
|
|
@@ -2145,17 +2159,7 @@ class Workforce(BaseNode):
|
|
|
2145
2159
|
f"Current pending tasks: {len(self._pending_tasks)}, "
|
|
2146
2160
|
f"In-flight tasks: {self._in_flight_tasks}"
|
|
2147
2161
|
)
|
|
2148
|
-
logger.
|
|
2149
|
-
|
|
2150
|
-
if self._pending_tasks and self._assignees:
|
|
2151
|
-
for task in self._pending_tasks:
|
|
2152
|
-
if task.id in self._assignees:
|
|
2153
|
-
# Mark task as failed and decrement counter
|
|
2154
|
-
task.set_state(TaskState.FAILED)
|
|
2155
|
-
self._decrement_in_flight_tasks(
|
|
2156
|
-
task.id, "timeout/error in _get_returned_task"
|
|
2157
|
-
)
|
|
2158
|
-
return task
|
|
2162
|
+
logger.error(error_msg, exc_info=True)
|
|
2159
2163
|
return None
|
|
2160
2164
|
|
|
2161
2165
|
async def _post_ready_tasks(self) -> None:
|
|
@@ -2231,12 +2235,8 @@ class Workforce(BaseNode):
|
|
|
2231
2235
|
task.failure_count += 1
|
|
2232
2236
|
|
|
2233
2237
|
# Determine detailed failure information
|
|
2234
|
-
|
|
2235
|
-
|
|
2236
|
-
f"response: {task.result[:100] if task.result else ''}..."
|
|
2237
|
-
else:
|
|
2238
|
-
failure_reason = "Task marked as failed despite "
|
|
2239
|
-
f"having result: {(task.result or '')[:100]}..."
|
|
2238
|
+
# Use the actual error/result stored in task.result
|
|
2239
|
+
failure_reason = task.result or "Unknown error"
|
|
2240
2240
|
|
|
2241
2241
|
# Add context about the worker and task
|
|
2242
2242
|
worker_id = task.assigned_worker_id or "unknown"
|
|
@@ -11,13 +11,11 @@
|
|
|
11
11
|
# See the License for the specific language governing permissions and
|
|
12
12
|
# limitations under the License.
|
|
13
13
|
# ========= Copyright 2023-2024 @ CAMEL-AI.org. All Rights Reserved. =========
|
|
14
|
+
import os
|
|
14
15
|
import re
|
|
15
16
|
from datetime import datetime
|
|
16
17
|
from pathlib import Path
|
|
17
|
-
from typing import
|
|
18
|
-
|
|
19
|
-
if TYPE_CHECKING:
|
|
20
|
-
from reportlab.platypus import Table
|
|
18
|
+
from typing import List, Optional, Tuple, Union
|
|
21
19
|
|
|
22
20
|
from camel.logger import get_logger
|
|
23
21
|
from camel.toolkits.base import BaseToolkit
|
|
@@ -26,9 +24,6 @@ from camel.utils import MCPServer, dependencies_required
|
|
|
26
24
|
|
|
27
25
|
logger = get_logger(__name__)
|
|
28
26
|
|
|
29
|
-
# Default format when no extension is provided
|
|
30
|
-
DEFAULT_FORMAT = '.md'
|
|
31
|
-
|
|
32
27
|
|
|
33
28
|
@MCPServer()
|
|
34
29
|
class FileWriteToolkit(BaseToolkit):
|
|
@@ -43,7 +38,7 @@ class FileWriteToolkit(BaseToolkit):
|
|
|
43
38
|
|
|
44
39
|
def __init__(
|
|
45
40
|
self,
|
|
46
|
-
|
|
41
|
+
working_directory: Optional[str] = None,
|
|
47
42
|
timeout: Optional[float] = None,
|
|
48
43
|
default_encoding: str = "utf-8",
|
|
49
44
|
backup_enabled: bool = True,
|
|
@@ -51,8 +46,11 @@ class FileWriteToolkit(BaseToolkit):
|
|
|
51
46
|
r"""Initialize the FileWriteToolkit.
|
|
52
47
|
|
|
53
48
|
Args:
|
|
54
|
-
|
|
55
|
-
|
|
49
|
+
working_directory (str, optional): The default directory for
|
|
50
|
+
output files. If not provided, it will be determined by the
|
|
51
|
+
`CAMEL_WORKDIR` environment variable (if set). If the
|
|
52
|
+
environment variable is not set, it defaults to
|
|
53
|
+
`camel_working_dir`.
|
|
56
54
|
timeout (Optional[float]): The timeout for the toolkit.
|
|
57
55
|
(default: :obj:`None`)
|
|
58
56
|
default_encoding (str): Default character encoding for text
|
|
@@ -61,13 +59,20 @@ class FileWriteToolkit(BaseToolkit):
|
|
|
61
59
|
before overwriting. (default: :obj:`True`)
|
|
62
60
|
"""
|
|
63
61
|
super().__init__(timeout=timeout)
|
|
64
|
-
|
|
65
|
-
|
|
62
|
+
if working_directory:
|
|
63
|
+
self.working_directory = Path(working_directory).resolve()
|
|
64
|
+
else:
|
|
65
|
+
camel_workdir = os.environ.get("CAMEL_WORKDIR")
|
|
66
|
+
if camel_workdir:
|
|
67
|
+
self.working_directory = Path(camel_workdir).resolve()
|
|
68
|
+
else:
|
|
69
|
+
self.working_directory = Path("./camel_working_dir").resolve()
|
|
70
|
+
self.working_directory.mkdir(parents=True, exist_ok=True)
|
|
66
71
|
self.default_encoding = default_encoding
|
|
67
72
|
self.backup_enabled = backup_enabled
|
|
68
73
|
logger.info(
|
|
69
74
|
f"FileWriteToolkit initialized with output directory"
|
|
70
|
-
f": {self.
|
|
75
|
+
f": {self.working_directory}, encoding: {default_encoding}"
|
|
71
76
|
)
|
|
72
77
|
|
|
73
78
|
def _resolve_filepath(self, file_path: str) -> Path:
|
|
@@ -86,12 +91,28 @@ class FileWriteToolkit(BaseToolkit):
|
|
|
86
91
|
"""
|
|
87
92
|
path_obj = Path(file_path)
|
|
88
93
|
if not path_obj.is_absolute():
|
|
89
|
-
path_obj = self.
|
|
94
|
+
path_obj = self.working_directory / path_obj
|
|
90
95
|
|
|
91
96
|
sanitized_filename = self._sanitize_filename(path_obj.name)
|
|
92
97
|
path_obj = path_obj.parent / sanitized_filename
|
|
93
98
|
return path_obj.resolve()
|
|
94
99
|
|
|
100
|
+
def _sanitize_filename(self, filename: str) -> str:
|
|
101
|
+
r"""Sanitize a filename by replacing any character that is not
|
|
102
|
+
alphanumeric, a dot (.), hyphen (-), or underscore (_) with an
|
|
103
|
+
underscore (_).
|
|
104
|
+
|
|
105
|
+
Args:
|
|
106
|
+
filename (str): The original filename which may contain spaces or
|
|
107
|
+
special characters.
|
|
108
|
+
|
|
109
|
+
Returns:
|
|
110
|
+
str: The sanitized filename with disallowed characters replaced by
|
|
111
|
+
underscores.
|
|
112
|
+
"""
|
|
113
|
+
safe = re.sub(r'[^\w\-.]', '_', filename)
|
|
114
|
+
return safe
|
|
115
|
+
|
|
95
116
|
def _write_text_file(
|
|
96
117
|
self, file_path: Path, content: str, encoding: str = "utf-8"
|
|
97
118
|
) -> None:
|
|
@@ -104,7 +125,6 @@ class FileWriteToolkit(BaseToolkit):
|
|
|
104
125
|
"""
|
|
105
126
|
with file_path.open("w", encoding=encoding) as f:
|
|
106
127
|
f.write(content)
|
|
107
|
-
logger.debug(f"Wrote text to {file_path} with {encoding} encoding")
|
|
108
128
|
|
|
109
129
|
def _generate_unique_filename(self, file_path: Path) -> Path:
|
|
110
130
|
r"""Generate a unique filename if the target file already exists.
|
|
@@ -163,7 +183,6 @@ class FileWriteToolkit(BaseToolkit):
|
|
|
163
183
|
para.style = style
|
|
164
184
|
|
|
165
185
|
document.save(str(file_path))
|
|
166
|
-
logger.debug(f"Wrote DOCX to {file_path} with default formatting")
|
|
167
186
|
|
|
168
187
|
@dependencies_required('reportlab')
|
|
169
188
|
def _write_pdf_file(
|
|
@@ -331,9 +350,6 @@ class FileWriteToolkit(BaseToolkit):
|
|
|
331
350
|
isinstance(row, list) for row in content
|
|
332
351
|
):
|
|
333
352
|
# Content is a table (List[List[str]])
|
|
334
|
-
logger.debug(
|
|
335
|
-
f"Processing content as table with {len(content)} rows"
|
|
336
|
-
)
|
|
337
353
|
if content:
|
|
338
354
|
table = self._create_pdf_table(content)
|
|
339
355
|
story.append(table)
|
|
@@ -364,7 +380,6 @@ class FileWriteToolkit(BaseToolkit):
|
|
|
364
380
|
|
|
365
381
|
# Process content
|
|
366
382
|
lines = content.split('\n')
|
|
367
|
-
logger.debug(f"Processing {len(lines)} lines of content")
|
|
368
383
|
|
|
369
384
|
# Parse all tables from the content first
|
|
370
385
|
tables = self._parse_markdown_table(lines)
|
|
@@ -396,8 +411,6 @@ class FileWriteToolkit(BaseToolkit):
|
|
|
396
411
|
)
|
|
397
412
|
|
|
398
413
|
if current_table_idx < len(tables):
|
|
399
|
-
table_row_count = len(tables[current_table_idx])
|
|
400
|
-
logger.debug(f"Adding table with {table_row_count} rows")
|
|
401
414
|
try:
|
|
402
415
|
table = self._create_pdf_table(
|
|
403
416
|
tables[current_table_idx]
|
|
@@ -530,10 +543,8 @@ class FileWriteToolkit(BaseToolkit):
|
|
|
530
543
|
addMapping(font_name, 0, 1, font_name) # italic
|
|
531
544
|
addMapping(font_name, 1, 0, font_name) # bold
|
|
532
545
|
addMapping(font_name, 1, 1, font_name) # bold italic
|
|
533
|
-
logger.debug(f"Registered Chinese font: {font_path}")
|
|
534
546
|
return font_name
|
|
535
|
-
except Exception
|
|
536
|
-
logger.debug(f"Failed to register font {font_path}: {e}")
|
|
547
|
+
except Exception:
|
|
537
548
|
continue
|
|
538
549
|
|
|
539
550
|
# Fallback to Helvetica if no Chinese font found
|
|
@@ -559,38 +570,29 @@ class FileWriteToolkit(BaseToolkit):
|
|
|
559
570
|
|
|
560
571
|
# Check for table (Markdown-style)
|
|
561
572
|
if self._is_table_row(line):
|
|
562
|
-
logger.debug(f"Found table line: {line}")
|
|
563
|
-
|
|
564
573
|
if not in_table:
|
|
565
574
|
in_table = True
|
|
566
575
|
current_table_data = []
|
|
567
|
-
logger.debug("Starting new table")
|
|
568
576
|
|
|
569
577
|
# Skip separator lines (e.g., |---|---|)
|
|
570
578
|
if self._is_table_separator(line):
|
|
571
|
-
logger.debug("Skipping separator line")
|
|
572
579
|
continue
|
|
573
580
|
|
|
574
581
|
# Parse table row
|
|
575
582
|
cells = self._parse_table_row(line)
|
|
576
583
|
if cells:
|
|
577
584
|
current_table_data.append(cells)
|
|
578
|
-
logger.debug(f"Added table row: {cells}")
|
|
579
585
|
continue
|
|
580
586
|
|
|
581
587
|
# If we were in a table and now we're not, finalize the table
|
|
582
588
|
if in_table:
|
|
583
589
|
if current_table_data:
|
|
584
|
-
row_count = len(current_table_data)
|
|
585
|
-
logger.debug(f"Finalizing table with {row_count} rows")
|
|
586
590
|
tables.append(current_table_data)
|
|
587
591
|
current_table_data = []
|
|
588
592
|
in_table = False
|
|
589
593
|
|
|
590
594
|
# Add any remaining table
|
|
591
595
|
if in_table and current_table_data:
|
|
592
|
-
row_count = len(current_table_data)
|
|
593
|
-
logger.debug(f"Adding final table with {row_count} rows")
|
|
594
596
|
tables.append(current_table_data)
|
|
595
597
|
|
|
596
598
|
return tables
|
|
@@ -646,7 +648,7 @@ class FileWriteToolkit(BaseToolkit):
|
|
|
646
648
|
|
|
647
649
|
return cells
|
|
648
650
|
|
|
649
|
-
def _create_pdf_table(self, table_data: List[List[str]])
|
|
651
|
+
def _create_pdf_table(self, table_data: List[List[str]]):
|
|
650
652
|
r"""Create a formatted table for PDF.
|
|
651
653
|
|
|
652
654
|
Args:
|
|
@@ -656,40 +658,153 @@ class FileWriteToolkit(BaseToolkit):
|
|
|
656
658
|
Table: A formatted reportlab Table object.
|
|
657
659
|
"""
|
|
658
660
|
from reportlab.lib import colors
|
|
659
|
-
from reportlab.
|
|
661
|
+
from reportlab.lib.pagesizes import A4
|
|
662
|
+
from reportlab.lib.styles import ParagraphStyle
|
|
663
|
+
from reportlab.platypus import Paragraph, Table, TableStyle
|
|
660
664
|
|
|
661
665
|
try:
|
|
662
666
|
# Get Chinese font for table
|
|
663
667
|
chinese_font = self._register_chinese_font()
|
|
664
668
|
|
|
665
|
-
#
|
|
666
|
-
|
|
667
|
-
|
|
668
|
-
|
|
669
|
+
# Calculate available width (A4 width minus margins)
|
|
670
|
+
page_width = A4[0] # A4 width in points
|
|
671
|
+
margins = 144 # left + right margins (72 each)
|
|
672
|
+
available_width = page_width - margins
|
|
673
|
+
|
|
674
|
+
# Calculate column widths and font size based on content
|
|
675
|
+
if table_data:
|
|
676
|
+
num_columns = len(table_data[0])
|
|
677
|
+
|
|
678
|
+
# Calculate max content length for each column
|
|
679
|
+
max_lengths = [0] * num_columns
|
|
680
|
+
max_cell_length = 0
|
|
681
|
+
for row in table_data:
|
|
682
|
+
for i, cell in enumerate(row):
|
|
683
|
+
if i < len(max_lengths):
|
|
684
|
+
cell_length = len(str(cell))
|
|
685
|
+
max_lengths[i] = max(max_lengths[i], cell_length)
|
|
686
|
+
max_cell_length = max(max_cell_length, cell_length)
|
|
687
|
+
|
|
688
|
+
# Dynamic font size calculation based on columns and content
|
|
689
|
+
# Base font sizes
|
|
690
|
+
base_header_font = 9
|
|
691
|
+
base_body_font = 8
|
|
692
|
+
|
|
693
|
+
# Calculate font size factor based on columns and content
|
|
694
|
+
column_factors = {10: 0.6, 8: 0.7, 6: 0.8, 4: 0.9}
|
|
695
|
+
font_size_factor = next(
|
|
696
|
+
(
|
|
697
|
+
factor
|
|
698
|
+
for cols, factor in column_factors.items()
|
|
699
|
+
if num_columns > cols
|
|
700
|
+
),
|
|
701
|
+
1.0,
|
|
702
|
+
)
|
|
703
|
+
|
|
704
|
+
# Further adjust if max cell content is very long
|
|
705
|
+
if max_cell_length > 30:
|
|
706
|
+
font_size_factor *= 0.8
|
|
707
|
+
elif max_cell_length > 20:
|
|
708
|
+
font_size_factor *= 0.9
|
|
709
|
+
|
|
710
|
+
header_font_size = max(
|
|
711
|
+
5, int(base_header_font * font_size_factor)
|
|
712
|
+
)
|
|
713
|
+
body_font_size = max(5, int(base_body_font * font_size_factor))
|
|
714
|
+
|
|
715
|
+
# Calculate minimum column width based on font size
|
|
716
|
+
min_col_width = max(30, 40 * font_size_factor)
|
|
717
|
+
|
|
718
|
+
# Distribute width proportionally with minimum width
|
|
719
|
+
total_length = sum(max_lengths)
|
|
720
|
+
if total_length > 0:
|
|
721
|
+
# Calculate proportional widths
|
|
722
|
+
proportional_widths = [
|
|
723
|
+
(length / total_length) * available_width
|
|
724
|
+
for length in max_lengths
|
|
725
|
+
]
|
|
726
|
+
|
|
727
|
+
# Ensure minimum width and adjust if necessary
|
|
728
|
+
col_widths = []
|
|
729
|
+
total_width = 0
|
|
730
|
+
for width in proportional_widths:
|
|
731
|
+
adjusted_width = max(min_col_width, width)
|
|
732
|
+
col_widths.append(adjusted_width)
|
|
733
|
+
total_width += adjusted_width
|
|
734
|
+
|
|
735
|
+
# Scale down if total exceeds available width
|
|
736
|
+
if total_width > available_width:
|
|
737
|
+
scale_factor = available_width / total_width
|
|
738
|
+
col_widths = [w * scale_factor for w in col_widths]
|
|
739
|
+
else:
|
|
740
|
+
col_widths = [available_width / num_columns] * num_columns
|
|
741
|
+
|
|
742
|
+
# Adjust padding based on font size
|
|
743
|
+
h_padding = max(2, int(6 * font_size_factor))
|
|
744
|
+
v_padding = max(2, int(4 * font_size_factor))
|
|
745
|
+
else:
|
|
746
|
+
col_widths = None
|
|
747
|
+
header_font_size = 9
|
|
748
|
+
body_font_size = 8
|
|
749
|
+
h_padding = 6
|
|
750
|
+
v_padding = 4
|
|
751
|
+
|
|
752
|
+
# Create paragraph styles for wrapping text
|
|
753
|
+
header_style = ParagraphStyle(
|
|
754
|
+
'TableHeader',
|
|
755
|
+
fontName=chinese_font,
|
|
756
|
+
fontSize=header_font_size,
|
|
757
|
+
textColor=colors.whitesmoke,
|
|
758
|
+
alignment=0, # LEFT alignment
|
|
759
|
+
leading=header_font_size * 1.2,
|
|
760
|
+
)
|
|
761
|
+
|
|
762
|
+
body_style = ParagraphStyle(
|
|
763
|
+
'TableBody',
|
|
764
|
+
fontName=chinese_font,
|
|
765
|
+
fontSize=body_font_size,
|
|
766
|
+
textColor=colors.black,
|
|
767
|
+
alignment=0, # LEFT alignment
|
|
768
|
+
leading=body_font_size * 1.2,
|
|
769
|
+
)
|
|
770
|
+
|
|
771
|
+
# Convert table data to Paragraph objects for text wrapping
|
|
772
|
+
wrapped_data = []
|
|
773
|
+
for row_idx, row in enumerate(table_data):
|
|
774
|
+
wrapped_row = []
|
|
775
|
+
for cell in row:
|
|
776
|
+
cell_text = str(cell)
|
|
777
|
+
# Use header style for first row, body style for others
|
|
778
|
+
style = header_style if row_idx == 0 else body_style
|
|
779
|
+
# Escape special characters for XML
|
|
780
|
+
cell_text = (
|
|
781
|
+
cell_text.replace('&', '&')
|
|
782
|
+
.replace('<', '<')
|
|
783
|
+
.replace('>', '>')
|
|
784
|
+
)
|
|
785
|
+
para = Paragraph(cell_text, style)
|
|
786
|
+
wrapped_row.append(para)
|
|
787
|
+
wrapped_data.append(wrapped_row)
|
|
669
788
|
|
|
670
|
-
# Create table
|
|
671
|
-
table = Table(
|
|
789
|
+
# Create table with wrapped data
|
|
790
|
+
table = Table(wrapped_data, colWidths=col_widths, repeatRows=1)
|
|
672
791
|
|
|
673
|
-
# Style the table with
|
|
792
|
+
# Style the table with dynamic formatting
|
|
674
793
|
table.setStyle(
|
|
675
794
|
TableStyle(
|
|
676
795
|
[
|
|
677
796
|
('BACKGROUND', (0, 0), (-1, 0), colors.grey),
|
|
678
|
-
('
|
|
679
|
-
('
|
|
680
|
-
('
|
|
681
|
-
('
|
|
682
|
-
('
|
|
683
|
-
('
|
|
684
|
-
('
|
|
685
|
-
('FONTSIZE', (0, 1), (-1, -1), 9),
|
|
686
|
-
('GRID', (0, 0), (-1, -1), 1, colors.black),
|
|
687
|
-
('VALIGN', (0, 0), (-1, -1), 'MIDDLE'),
|
|
797
|
+
('BACKGROUND', (0, 1), (-1, -1), colors.white),
|
|
798
|
+
('GRID', (0, 0), (-1, -1), 0.5, colors.black),
|
|
799
|
+
('VALIGN', (0, 0), (-1, -1), 'TOP'),
|
|
800
|
+
('LEFTPADDING', (0, 0), (-1, -1), h_padding),
|
|
801
|
+
('RIGHTPADDING', (0, 0), (-1, -1), h_padding),
|
|
802
|
+
('TOPPADDING', (0, 0), (-1, -1), v_padding),
|
|
803
|
+
('BOTTOMPADDING', (0, 0), (-1, -1), v_padding),
|
|
688
804
|
]
|
|
689
805
|
)
|
|
690
806
|
)
|
|
691
807
|
|
|
692
|
-
logger.debug("Table created successfully")
|
|
693
808
|
return table
|
|
694
809
|
|
|
695
810
|
except Exception as e:
|
|
@@ -708,18 +823,20 @@ class FileWriteToolkit(BaseToolkit):
|
|
|
708
823
|
Returns:
|
|
709
824
|
str: Text with HTML formatting.
|
|
710
825
|
"""
|
|
711
|
-
#
|
|
712
|
-
|
|
713
|
-
|
|
714
|
-
|
|
715
|
-
|
|
716
|
-
|
|
717
|
-
|
|
718
|
-
|
|
719
|
-
|
|
826
|
+
# Define conversion patterns
|
|
827
|
+
conversions = [
|
|
828
|
+
(r'\*\*(.*?)\*\*', r'<b>\1</b>'), # Bold with **
|
|
829
|
+
(r'__(.*?)__', r'<b>\1</b>'), # Bold with __
|
|
830
|
+
(
|
|
831
|
+
r'(?<!\*)\*(?!\*)(.*?)(?<!\*)\*(?!\*)',
|
|
832
|
+
r'<i>\1</i>',
|
|
833
|
+
), # Italic with *
|
|
834
|
+
(r'(?<!_)_(?!_)(.*?)(?<!_)_(?!_)', r'<i>\1</i>'), # Italic with _
|
|
835
|
+
(r'`(.*?)`', r'<font name="Courier">\1</font>'), # Inline code
|
|
836
|
+
]
|
|
720
837
|
|
|
721
|
-
|
|
722
|
-
|
|
838
|
+
for pattern, replacement in conversions:
|
|
839
|
+
text = re.sub(pattern, replacement, text)
|
|
723
840
|
|
|
724
841
|
return text
|
|
725
842
|
|
|
@@ -745,7 +862,6 @@ class FileWriteToolkit(BaseToolkit):
|
|
|
745
862
|
else:
|
|
746
863
|
writer = csv.writer(f)
|
|
747
864
|
writer.writerows(content)
|
|
748
|
-
logger.debug(f"Wrote CSV to {file_path} with {encoding} encoding")
|
|
749
865
|
|
|
750
866
|
def _write_json_file(
|
|
751
867
|
self,
|
|
@@ -774,52 +890,19 @@ class FileWriteToolkit(BaseToolkit):
|
|
|
774
890
|
else:
|
|
775
891
|
# If not string, dump as JSON
|
|
776
892
|
json.dump(content, f, ensure_ascii=False)
|
|
777
|
-
logger.debug(f"Wrote JSON to {file_path} with {encoding} encoding")
|
|
778
|
-
|
|
779
|
-
def _write_yaml_file(
|
|
780
|
-
self,
|
|
781
|
-
file_path: Path,
|
|
782
|
-
content: str,
|
|
783
|
-
encoding: str = "utf-8",
|
|
784
|
-
) -> None:
|
|
785
|
-
r"""Write YAML content to a file.
|
|
786
|
-
|
|
787
|
-
Args:
|
|
788
|
-
file_path (Path): The target file path.
|
|
789
|
-
content (str): The YAML content as a string.
|
|
790
|
-
encoding (str): Character encoding to use. (default: :obj:`utf-8`)
|
|
791
|
-
"""
|
|
792
|
-
with file_path.open("w", encoding=encoding) as f:
|
|
793
|
-
f.write(content)
|
|
794
|
-
logger.debug(f"Wrote YAML to {file_path} with {encoding} encoding")
|
|
795
|
-
|
|
796
|
-
def _write_html_file(
|
|
797
|
-
self, file_path: Path, content: str, encoding: str = "utf-8"
|
|
798
|
-
) -> None:
|
|
799
|
-
r"""Write text content to an HTML file.
|
|
800
|
-
|
|
801
|
-
Args:
|
|
802
|
-
file_path (Path): The target file path.
|
|
803
|
-
content (str): The HTML content to write.
|
|
804
|
-
encoding (str): Character encoding to use. (default: :obj:`utf-8`)
|
|
805
|
-
"""
|
|
806
|
-
with file_path.open("w", encoding=encoding) as f:
|
|
807
|
-
f.write(content)
|
|
808
|
-
logger.debug(f"Wrote HTML to {file_path} with {encoding} encoding")
|
|
809
893
|
|
|
810
|
-
def
|
|
894
|
+
def _write_simple_text_file(
|
|
811
895
|
self, file_path: Path, content: str, encoding: str = "utf-8"
|
|
812
896
|
) -> None:
|
|
813
|
-
r"""Write text content to a Markdown
|
|
897
|
+
r"""Write text content to a file (used for HTML, Markdown, YAML, etc.).
|
|
814
898
|
|
|
815
899
|
Args:
|
|
816
900
|
file_path (Path): The target file path.
|
|
817
|
-
content (str): The
|
|
901
|
+
content (str): The content to write.
|
|
818
902
|
encoding (str): Character encoding to use. (default: :obj:`utf-8`)
|
|
819
903
|
"""
|
|
820
904
|
with file_path.open("w", encoding=encoding) as f:
|
|
821
905
|
f.write(content)
|
|
822
|
-
logger.debug(f"Wrote Markdown to {file_path} with {encoding} encoding")
|
|
823
906
|
|
|
824
907
|
def write_to_file(
|
|
825
908
|
self,
|
|
@@ -844,7 +927,7 @@ class FileWriteToolkit(BaseToolkit):
|
|
|
844
927
|
- CSV: string or list of lists
|
|
845
928
|
- JSON: string or serializable object
|
|
846
929
|
filename (str): The name or path of the file. If a relative path is
|
|
847
|
-
supplied, it is resolved to self.
|
|
930
|
+
supplied, it is resolved to self.working_directory.
|
|
848
931
|
encoding (Optional[str]): The character encoding to use. (default:
|
|
849
932
|
:obj: `None`)
|
|
850
933
|
use_latex (bool): Whether to use LaTeX for math rendering.
|
|
@@ -861,10 +944,10 @@ class FileWriteToolkit(BaseToolkit):
|
|
|
861
944
|
|
|
862
945
|
extension = file_path.suffix.lower()
|
|
863
946
|
|
|
864
|
-
# If no extension is provided, use
|
|
947
|
+
# If no extension is provided, use markdown as default
|
|
865
948
|
if extension == "":
|
|
866
|
-
file_path = file_path.with_suffix(
|
|
867
|
-
extension =
|
|
949
|
+
file_path = file_path.with_suffix('.md')
|
|
950
|
+
extension = '.md'
|
|
868
951
|
|
|
869
952
|
try:
|
|
870
953
|
# Get encoding or use default
|
|
@@ -884,16 +967,15 @@ class FileWriteToolkit(BaseToolkit):
|
|
|
884
967
|
content, # type: ignore[arg-type]
|
|
885
968
|
encoding=file_encoding,
|
|
886
969
|
)
|
|
887
|
-
elif extension in [
|
|
888
|
-
|
|
889
|
-
|
|
890
|
-
|
|
891
|
-
|
|
892
|
-
|
|
893
|
-
|
|
894
|
-
|
|
895
|
-
|
|
896
|
-
self._write_markdown_file(
|
|
970
|
+
elif extension in [
|
|
971
|
+
".yml",
|
|
972
|
+
".yaml",
|
|
973
|
+
".html",
|
|
974
|
+
".htm",
|
|
975
|
+
".md",
|
|
976
|
+
".markdown",
|
|
977
|
+
]:
|
|
978
|
+
self._write_simple_text_file(
|
|
897
979
|
file_path, str(content), encoding=file_encoding
|
|
898
980
|
)
|
|
899
981
|
else:
|
|
@@ -924,19 +1006,3 @@ class FileWriteToolkit(BaseToolkit):
|
|
|
924
1006
|
return [
|
|
925
1007
|
FunctionTool(self.write_to_file),
|
|
926
1008
|
]
|
|
927
|
-
|
|
928
|
-
def _sanitize_filename(self, filename: str) -> str:
|
|
929
|
-
r"""Sanitize a filename by replacing any character that is not
|
|
930
|
-
alphanumeric, a dot (.), hyphen (-), or underscore (_) with an
|
|
931
|
-
underscore (_).
|
|
932
|
-
|
|
933
|
-
Args:
|
|
934
|
-
filename (str): The original filename which may contain spaces or
|
|
935
|
-
special characters.
|
|
936
|
-
|
|
937
|
-
Returns:
|
|
938
|
-
str: The sanitized filename with disallowed characters replaced by
|
|
939
|
-
underscores.
|
|
940
|
-
"""
|
|
941
|
-
safe = re.sub(r'[^\w\-.]', '_', filename)
|
|
942
|
-
return safe
|