camel-ai 0.2.73a2__tar.gz → 0.2.73a3__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.73a2 → camel_ai-0.2.73a3}/PKG-INFO +1 -1
- {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/__init__.py +1 -1
- {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/toolkits/excel_toolkit.py +153 -64
- {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/toolkits/hybrid_browser_toolkit/ws_wrapper.py +76 -27
- {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/toolkits/message_integration.py +174 -47
- {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/pyproject.toml +1 -1
- {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/.gitignore +0 -0
- {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/LICENSE +0 -0
- {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/README.md +0 -0
- {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/agents/__init__.py +0 -0
- {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/agents/_types.py +0 -0
- {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/agents/_utils.py +0 -0
- {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/agents/base.py +0 -0
- {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/agents/chat_agent.py +0 -0
- {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/agents/critic_agent.py +0 -0
- {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/agents/deductive_reasoner_agent.py +0 -0
- {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/agents/embodied_agent.py +0 -0
- {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/agents/knowledge_graph_agent.py +0 -0
- {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/agents/mcp_agent.py +0 -0
- {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/agents/multi_hop_generator_agent.py +0 -0
- {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/agents/programmed_agent_instruction.py +0 -0
- {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/agents/repo_agent.py +0 -0
- {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/agents/role_assignment_agent.py +0 -0
- {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/agents/search_agent.py +0 -0
- {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/agents/task_agent.py +0 -0
- {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/agents/tool_agents/__init__.py +0 -0
- {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/agents/tool_agents/base.py +0 -0
- {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/agents/tool_agents/hugging_face_tool_agent.py +0 -0
- {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/benchmarks/__init__.py +0 -0
- {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/benchmarks/apibank.py +0 -0
- {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/benchmarks/apibench.py +0 -0
- {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/benchmarks/base.py +0 -0
- {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/benchmarks/browsecomp.py +0 -0
- {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/benchmarks/gaia.py +0 -0
- {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/benchmarks/mock_website/README.md +0 -0
- {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/benchmarks/mock_website/mock_web.py +0 -0
- {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/benchmarks/mock_website/requirements.txt +0 -0
- {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/benchmarks/mock_website/shopping_mall/app.py +0 -0
- {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/benchmarks/mock_website/task.json +0 -0
- {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/benchmarks/nexus.py +0 -0
- {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/benchmarks/ragbench.py +0 -0
- {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/bots/__init__.py +0 -0
- {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/bots/discord/__init__.py +0 -0
- {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/bots/discord/discord_app.py +0 -0
- {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/bots/discord/discord_installation.py +0 -0
- {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/bots/discord/discord_store.py +0 -0
- {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/bots/slack/__init__.py +0 -0
- {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/bots/slack/models.py +0 -0
- {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/bots/slack/slack_app.py +0 -0
- {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/bots/telegram_bot.py +0 -0
- {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/configs/__init__.py +0 -0
- {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/configs/aiml_config.py +0 -0
- {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/configs/anthropic_config.py +0 -0
- {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/configs/base_config.py +0 -0
- {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/configs/bedrock_config.py +0 -0
- {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/configs/cohere_config.py +0 -0
- {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/configs/crynux_config.py +0 -0
- {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/configs/deepseek_config.py +0 -0
- {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/configs/gemini_config.py +0 -0
- {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/configs/groq_config.py +0 -0
- {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/configs/internlm_config.py +0 -0
- {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/configs/litellm_config.py +0 -0
- {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/configs/lmstudio_config.py +0 -0
- {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/configs/mistral_config.py +0 -0
- {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/configs/modelscope_config.py +0 -0
- {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/configs/moonshot_config.py +0 -0
- {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/configs/netmind_config.py +0 -0
- {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/configs/novita_config.py +0 -0
- {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/configs/nvidia_config.py +0 -0
- {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/configs/ollama_config.py +0 -0
- {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/configs/openai_config.py +0 -0
- {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/configs/openrouter_config.py +0 -0
- {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/configs/ppio_config.py +0 -0
- {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/configs/qianfan_config.py +0 -0
- {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/configs/qwen_config.py +0 -0
- {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/configs/reka_config.py +0 -0
- {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/configs/samba_config.py +0 -0
- {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/configs/sglang_config.py +0 -0
- {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/configs/siliconflow_config.py +0 -0
- {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/configs/togetherai_config.py +0 -0
- {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/configs/vllm_config.py +0 -0
- {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/configs/watsonx_config.py +0 -0
- {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/configs/yi_config.py +0 -0
- {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/configs/zhipuai_config.py +0 -0
- {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/data_collectors/__init__.py +0 -0
- {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/data_collectors/alpaca_collector.py +0 -0
- {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/data_collectors/base.py +0 -0
- {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/data_collectors/sharegpt_collector.py +0 -0
- {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/datagen/__init__.py +0 -0
- {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/datagen/cot_datagen.py +0 -0
- {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/datagen/evol_instruct/__init__.py +0 -0
- {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/datagen/evol_instruct/evol_instruct.py +0 -0
- {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/datagen/evol_instruct/scorer.py +0 -0
- {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/datagen/evol_instruct/templates.py +0 -0
- {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/datagen/self_improving_cot.py +0 -0
- {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/datagen/self_instruct/__init__.py +0 -0
- {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/datagen/self_instruct/filter/__init__.py +0 -0
- {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/datagen/self_instruct/filter/filter_function.py +0 -0
- {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/datagen/self_instruct/filter/filter_registry.py +0 -0
- {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/datagen/self_instruct/filter/instruction_filter.py +0 -0
- {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/datagen/self_instruct/self_instruct.py +0 -0
- {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/datagen/self_instruct/templates.py +0 -0
- {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/datagen/source2synth/__init__.py +0 -0
- {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/datagen/source2synth/data_processor.py +0 -0
- {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/datagen/source2synth/models.py +0 -0
- {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/datagen/source2synth/user_data_processor_config.py +0 -0
- {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/datahubs/__init__.py +0 -0
- {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/datahubs/base.py +0 -0
- {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/datahubs/huggingface.py +0 -0
- {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/datahubs/models.py +0 -0
- {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/datasets/__init__.py +0 -0
- {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/datasets/base_generator.py +0 -0
- {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/datasets/few_shot_generator.py +0 -0
- {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/datasets/models.py +0 -0
- {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/datasets/self_instruct_generator.py +0 -0
- {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/datasets/static_dataset.py +0 -0
- {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/embeddings/__init__.py +0 -0
- {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/embeddings/azure_embedding.py +0 -0
- {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/embeddings/base.py +0 -0
- {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/embeddings/gemini_embedding.py +0 -0
- {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/embeddings/jina_embedding.py +0 -0
- {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/embeddings/mistral_embedding.py +0 -0
- {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/embeddings/openai_compatible_embedding.py +0 -0
- {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/embeddings/openai_embedding.py +0 -0
- {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/embeddings/sentence_transformers_embeddings.py +0 -0
- {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/embeddings/together_embedding.py +0 -0
- {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/embeddings/vlm_embedding.py +0 -0
- {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/environments/__init__.py +0 -0
- {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/environments/models.py +0 -0
- {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/environments/multi_step.py +0 -0
- {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/environments/rlcards_env.py +0 -0
- {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/environments/single_step.py +0 -0
- {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/environments/tic_tac_toe.py +0 -0
- {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/extractors/__init__.py +0 -0
- {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/extractors/base.py +0 -0
- {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/extractors/python_strategies.py +0 -0
- {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/generators.py +0 -0
- {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/human.py +0 -0
- {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/interpreters/__init__.py +0 -0
- {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/interpreters/base.py +0 -0
- {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/interpreters/docker/Dockerfile +0 -0
- {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/interpreters/docker_interpreter.py +0 -0
- {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/interpreters/e2b_interpreter.py +0 -0
- {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/interpreters/internal_python_interpreter.py +0 -0
- {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/interpreters/interpreter_error.py +0 -0
- {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/interpreters/ipython_interpreter.py +0 -0
- {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/interpreters/subprocess_interpreter.py +0 -0
- {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/loaders/__init__.py +0 -0
- {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/loaders/apify_reader.py +0 -0
- {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/loaders/base_io.py +0 -0
- {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/loaders/base_loader.py +0 -0
- {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/loaders/chunkr_reader.py +0 -0
- {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/loaders/crawl4ai_reader.py +0 -0
- {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/loaders/firecrawl_reader.py +0 -0
- {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/loaders/jina_url_reader.py +0 -0
- {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/loaders/markitdown.py +0 -0
- {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/loaders/mineru_extractor.py +0 -0
- {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/loaders/mistral_reader.py +0 -0
- {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/loaders/pandas_reader.py +0 -0
- {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/loaders/scrapegraph_reader.py +0 -0
- {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/loaders/unstructured_io.py +0 -0
- {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/logger.py +0 -0
- {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/memories/__init__.py +0 -0
- {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/memories/agent_memories.py +0 -0
- {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/memories/base.py +0 -0
- {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/memories/blocks/__init__.py +0 -0
- {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/memories/blocks/chat_history_block.py +0 -0
- {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/memories/blocks/vectordb_block.py +0 -0
- {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/memories/context_creators/__init__.py +0 -0
- {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/memories/context_creators/score_based.py +0 -0
- {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/memories/records.py +0 -0
- {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/messages/__init__.py +0 -0
- {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/messages/base.py +0 -0
- {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/messages/conversion/__init__.py +0 -0
- {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/messages/conversion/alpaca.py +0 -0
- {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/messages/conversion/conversation_models.py +0 -0
- {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/messages/conversion/sharegpt/__init__.py +0 -0
- {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/messages/conversion/sharegpt/function_call_formatter.py +0 -0
- {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/messages/conversion/sharegpt/hermes/__init__.py +0 -0
- {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/messages/conversion/sharegpt/hermes/hermes_function_formatter.py +0 -0
- {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/messages/func_message.py +0 -0
- {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/models/__init__.py +0 -0
- {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/models/_utils.py +0 -0
- {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/models/aiml_model.py +0 -0
- {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/models/anthropic_model.py +0 -0
- {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/models/aws_bedrock_model.py +0 -0
- {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/models/azure_openai_model.py +0 -0
- {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/models/base_audio_model.py +0 -0
- {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/models/base_model.py +0 -0
- {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/models/cohere_model.py +0 -0
- {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/models/crynux_model.py +0 -0
- {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/models/deepseek_model.py +0 -0
- {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/models/fish_audio_model.py +0 -0
- {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/models/gemini_model.py +0 -0
- {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/models/groq_model.py +0 -0
- {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/models/internlm_model.py +0 -0
- {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/models/litellm_model.py +0 -0
- {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/models/lmstudio_model.py +0 -0
- {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/models/mistral_model.py +0 -0
- {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/models/model_factory.py +0 -0
- {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/models/model_manager.py +0 -0
- {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/models/modelscope_model.py +0 -0
- {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/models/moonshot_model.py +0 -0
- {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/models/nemotron_model.py +0 -0
- {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/models/netmind_model.py +0 -0
- {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/models/novita_model.py +0 -0
- {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/models/nvidia_model.py +0 -0
- {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/models/ollama_model.py +0 -0
- {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/models/openai_audio_models.py +0 -0
- {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/models/openai_compatible_model.py +0 -0
- {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/models/openai_model.py +0 -0
- {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/models/openrouter_model.py +0 -0
- {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/models/ppio_model.py +0 -0
- {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/models/qianfan_model.py +0 -0
- {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/models/qwen_model.py +0 -0
- {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/models/reka_model.py +0 -0
- {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/models/reward/__init__.py +0 -0
- {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/models/reward/base_reward_model.py +0 -0
- {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/models/reward/evaluator.py +0 -0
- {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/models/reward/nemotron_model.py +0 -0
- {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/models/reward/skywork_model.py +0 -0
- {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/models/samba_model.py +0 -0
- {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/models/sglang_model.py +0 -0
- {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/models/siliconflow_model.py +0 -0
- {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/models/stub_model.py +0 -0
- {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/models/togetherai_model.py +0 -0
- {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/models/vllm_model.py +0 -0
- {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/models/volcano_model.py +0 -0
- {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/models/watsonx_model.py +0 -0
- {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/models/yi_model.py +0 -0
- {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/models/zhipuai_model.py +0 -0
- {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/personas/__init__.py +0 -0
- {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/personas/persona.py +0 -0
- {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/personas/persona_hub.py +0 -0
- {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/prompts/__init__.py +0 -0
- {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/prompts/ai_society.py +0 -0
- {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/prompts/base.py +0 -0
- {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/prompts/code.py +0 -0
- {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/prompts/evaluation.py +0 -0
- {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/prompts/generate_text_embedding_data.py +0 -0
- {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/prompts/image_craft.py +0 -0
- {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/prompts/misalignment.py +0 -0
- {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/prompts/multi_condition_image_craft.py +0 -0
- {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/prompts/object_recognition.py +0 -0
- {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/prompts/persona_hub.py +0 -0
- {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/prompts/prompt_templates.py +0 -0
- {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/prompts/role_description_prompt_template.py +0 -0
- {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/prompts/solution_extraction.py +0 -0
- {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/prompts/task_prompt_template.py +0 -0
- {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/prompts/translation.py +0 -0
- {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/prompts/video_description_prompt.py +0 -0
- {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/py.typed +0 -0
- {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/responses/__init__.py +0 -0
- {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/responses/agent_responses.py +0 -0
- {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/retrievers/__init__.py +0 -0
- {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/retrievers/auto_retriever.py +0 -0
- {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/retrievers/base.py +0 -0
- {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/retrievers/bm25_retriever.py +0 -0
- {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/retrievers/cohere_rerank_retriever.py +0 -0
- {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/retrievers/hybrid_retrival.py +0 -0
- {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/retrievers/vector_retriever.py +0 -0
- {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/runtimes/__init__.py +0 -0
- {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/runtimes/api.py +0 -0
- {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/runtimes/base.py +0 -0
- {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/runtimes/configs.py +0 -0
- {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/runtimes/daytona_runtime.py +0 -0
- {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/runtimes/docker_runtime.py +0 -0
- {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/runtimes/llm_guard_runtime.py +0 -0
- {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/runtimes/remote_http_runtime.py +0 -0
- {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/runtimes/ubuntu_docker_runtime.py +0 -0
- {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/runtimes/utils/__init__.py +0 -0
- {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/runtimes/utils/function_risk_toolkit.py +0 -0
- {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/runtimes/utils/ignore_risk_toolkit.py +0 -0
- {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/schemas/__init__.py +0 -0
- {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/schemas/base.py +0 -0
- {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/schemas/openai_converter.py +0 -0
- {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/schemas/outlines_converter.py +0 -0
- {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/services/agent_openapi_server.py +0 -0
- {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/societies/__init__.py +0 -0
- {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/societies/babyagi_playing.py +0 -0
- {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/societies/role_playing.py +0 -0
- {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/societies/workforce/__init__.py +0 -0
- {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/societies/workforce/base.py +0 -0
- {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/societies/workforce/prompts.py +0 -0
- {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/societies/workforce/role_playing_worker.py +0 -0
- {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/societies/workforce/single_agent_worker.py +0 -0
- {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/societies/workforce/structured_output_handler.py +0 -0
- {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/societies/workforce/task_channel.py +0 -0
- {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/societies/workforce/utils.py +0 -0
- {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/societies/workforce/worker.py +0 -0
- {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/societies/workforce/workforce.py +0 -0
- {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/societies/workforce/workforce_logger.py +0 -0
- {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/storages/__init__.py +0 -0
- {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/storages/graph_storages/__init__.py +0 -0
- {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/storages/graph_storages/base.py +0 -0
- {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/storages/graph_storages/graph_element.py +0 -0
- {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/storages/graph_storages/nebula_graph.py +0 -0
- {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/storages/graph_storages/neo4j_graph.py +0 -0
- {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/storages/key_value_storages/__init__.py +0 -0
- {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/storages/key_value_storages/base.py +0 -0
- {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/storages/key_value_storages/in_memory.py +0 -0
- {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/storages/key_value_storages/json.py +0 -0
- {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/storages/key_value_storages/mem0_cloud.py +0 -0
- {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/storages/key_value_storages/redis.py +0 -0
- {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/storages/object_storages/__init__.py +0 -0
- {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/storages/object_storages/amazon_s3.py +0 -0
- {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/storages/object_storages/azure_blob.py +0 -0
- {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/storages/object_storages/base.py +0 -0
- {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/storages/object_storages/google_cloud.py +0 -0
- {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/storages/vectordb_storages/__init__.py +0 -0
- {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/storages/vectordb_storages/base.py +0 -0
- {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/storages/vectordb_storages/chroma.py +0 -0
- {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/storages/vectordb_storages/faiss.py +0 -0
- {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/storages/vectordb_storages/milvus.py +0 -0
- {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/storages/vectordb_storages/oceanbase.py +0 -0
- {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/storages/vectordb_storages/pgvector.py +0 -0
- {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/storages/vectordb_storages/qdrant.py +0 -0
- {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/storages/vectordb_storages/surreal.py +0 -0
- {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/storages/vectordb_storages/tidb.py +0 -0
- {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/storages/vectordb_storages/weaviate.py +0 -0
- {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/tasks/__init__.py +0 -0
- {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/tasks/task.py +0 -0
- {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/tasks/task_prompt.py +0 -0
- {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/terminators/__init__.py +0 -0
- {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/terminators/base.py +0 -0
- {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/terminators/response_terminator.py +0 -0
- {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/terminators/token_limit_terminator.py +0 -0
- {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/toolkits/__init__.py +0 -0
- {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/toolkits/aci_toolkit.py +0 -0
- {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/toolkits/arxiv_toolkit.py +0 -0
- {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/toolkits/ask_news_toolkit.py +0 -0
- {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/toolkits/async_browser_toolkit.py +0 -0
- {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/toolkits/audio_analysis_toolkit.py +0 -0
- {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/toolkits/base.py +0 -0
- {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/toolkits/bohrium_toolkit.py +0 -0
- {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/toolkits/browser_toolkit.py +0 -0
- {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/toolkits/browser_toolkit_commons.py +0 -0
- {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/toolkits/code_execution.py +0 -0
- {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/toolkits/craw4ai_toolkit.py +0 -0
- {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/toolkits/dappier_toolkit.py +0 -0
- {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/toolkits/data_commons_toolkit.py +0 -0
- {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/toolkits/edgeone_pages_mcp_toolkit.py +0 -0
- {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/toolkits/file_write_toolkit.py +0 -0
- {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/toolkits/function_tool.py +0 -0
- {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/toolkits/github_toolkit.py +0 -0
- {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/toolkits/google_calendar_toolkit.py +0 -0
- {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/toolkits/google_drive_mcp_toolkit.py +0 -0
- {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/toolkits/google_maps_toolkit.py +0 -0
- {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/toolkits/google_scholar_toolkit.py +0 -0
- {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/toolkits/human_toolkit.py +0 -0
- {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/toolkits/hybrid_browser_toolkit/__init__.py +0 -0
- {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/toolkits/hybrid_browser_toolkit/config_loader.py +0 -0
- {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/toolkits/hybrid_browser_toolkit/hybrid_browser_toolkit.py +0 -0
- {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/toolkits/hybrid_browser_toolkit/hybrid_browser_toolkit_ts.py +0 -0
- {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/toolkits/hybrid_browser_toolkit/ts/package-lock.json +0 -0
- {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/toolkits/hybrid_browser_toolkit/ts/package.json +0 -0
- {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/toolkits/hybrid_browser_toolkit/ts/src/browser-scripts.js +0 -0
- {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/toolkits/hybrid_browser_toolkit/ts/src/browser-session.ts +0 -0
- {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/toolkits/hybrid_browser_toolkit/ts/src/config-loader.ts +0 -0
- {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/toolkits/hybrid_browser_toolkit/ts/src/hybrid-browser-toolkit.ts +0 -0
- {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/toolkits/hybrid_browser_toolkit/ts/src/index.ts +0 -0
- {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/toolkits/hybrid_browser_toolkit/ts/src/types.ts +0 -0
- {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/toolkits/hybrid_browser_toolkit/ts/tsconfig.json +0 -0
- {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/toolkits/hybrid_browser_toolkit/ts/websocket-server.js +0 -0
- {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/toolkits/hybrid_browser_toolkit_py/__init__.py +0 -0
- {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/toolkits/hybrid_browser_toolkit_py/actions.py +0 -0
- {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/toolkits/hybrid_browser_toolkit_py/agent.py +0 -0
- {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/toolkits/hybrid_browser_toolkit_py/browser_session.py +0 -0
- {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/toolkits/hybrid_browser_toolkit_py/config_loader.py +0 -0
- {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/toolkits/hybrid_browser_toolkit_py/hybrid_browser_toolkit.py +0 -0
- {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/toolkits/hybrid_browser_toolkit_py/snapshot.py +0 -0
- {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/toolkits/hybrid_browser_toolkit_py/stealth_script.js +0 -0
- {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/toolkits/hybrid_browser_toolkit_py/unified_analyzer.js +0 -0
- {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/toolkits/image_analysis_toolkit.py +0 -0
- {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/toolkits/jina_reranker_toolkit.py +0 -0
- {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/toolkits/klavis_toolkit.py +0 -0
- {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/toolkits/linkedin_toolkit.py +0 -0
- {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/toolkits/markitdown_toolkit.py +0 -0
- {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/toolkits/math_toolkit.py +0 -0
- {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/toolkits/mcp_toolkit.py +0 -0
- {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/toolkits/memory_toolkit.py +0 -0
- {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/toolkits/meshy_toolkit.py +0 -0
- {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/toolkits/message_agent_toolkit.py +0 -0
- {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/toolkits/mineru_toolkit.py +0 -0
- {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/toolkits/networkx_toolkit.py +0 -0
- {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/toolkits/note_taking_toolkit.py +0 -0
- {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/toolkits/notion_mcp_toolkit.py +0 -0
- {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/toolkits/notion_toolkit.py +0 -0
- {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/toolkits/open_api_specs/biztoc/__init__.py +0 -0
- {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/toolkits/open_api_specs/biztoc/ai-plugin.json +0 -0
- {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/toolkits/open_api_specs/biztoc/openapi.yaml +0 -0
- {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/toolkits/open_api_specs/coursera/__init__.py +0 -0
- {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/toolkits/open_api_specs/coursera/openapi.yaml +0 -0
- {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/toolkits/open_api_specs/create_qr_code/__init__.py +0 -0
- {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/toolkits/open_api_specs/create_qr_code/openapi.yaml +0 -0
- {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/toolkits/open_api_specs/klarna/__init__.py +0 -0
- {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/toolkits/open_api_specs/klarna/openapi.yaml +0 -0
- {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/toolkits/open_api_specs/nasa_apod/__init__.py +0 -0
- {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/toolkits/open_api_specs/nasa_apod/openapi.yaml +0 -0
- {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/toolkits/open_api_specs/outschool/__init__.py +0 -0
- {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/toolkits/open_api_specs/outschool/ai-plugin.json +0 -0
- {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/toolkits/open_api_specs/outschool/openapi.yaml +0 -0
- {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/toolkits/open_api_specs/outschool/paths/__init__.py +0 -0
- {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/toolkits/open_api_specs/outschool/paths/get_classes.py +0 -0
- {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/toolkits/open_api_specs/outschool/paths/search_teachers.py +0 -0
- {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/toolkits/open_api_specs/security_config.py +0 -0
- {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/toolkits/open_api_specs/speak/__init__.py +0 -0
- {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/toolkits/open_api_specs/speak/openapi.yaml +0 -0
- {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/toolkits/open_api_specs/web_scraper/__init__.py +0 -0
- {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/toolkits/open_api_specs/web_scraper/ai-plugin.json +0 -0
- {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/toolkits/open_api_specs/web_scraper/openapi.yaml +0 -0
- {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/toolkits/open_api_specs/web_scraper/paths/__init__.py +0 -0
- {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/toolkits/open_api_specs/web_scraper/paths/scraper.py +0 -0
- {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/toolkits/open_api_toolkit.py +0 -0
- {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/toolkits/openai_agent_toolkit.py +0 -0
- {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/toolkits/openai_image_toolkit.py +0 -0
- {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/toolkits/openbb_toolkit.py +0 -0
- {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/toolkits/origene_mcp_toolkit.py +0 -0
- {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/toolkits/page_script.js +0 -0
- {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/toolkits/playwright_mcp_toolkit.py +0 -0
- {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/toolkits/pptx_toolkit.py +0 -0
- {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/toolkits/pubmed_toolkit.py +0 -0
- {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/toolkits/pulse_mcp_search_toolkit.py +0 -0
- {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/toolkits/pyautogui_toolkit.py +0 -0
- {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/toolkits/reddit_toolkit.py +0 -0
- {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/toolkits/retrieval_toolkit.py +0 -0
- {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/toolkits/screenshot_toolkit.py +0 -0
- {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/toolkits/search_toolkit.py +0 -0
- {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/toolkits/searxng_toolkit.py +0 -0
- {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/toolkits/semantic_scholar_toolkit.py +0 -0
- {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/toolkits/slack_toolkit.py +0 -0
- {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/toolkits/stripe_toolkit.py +0 -0
- {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/toolkits/sympy_toolkit.py +0 -0
- {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/toolkits/task_planning_toolkit.py +0 -0
- {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/toolkits/terminal_toolkit.py +0 -0
- {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/toolkits/thinking_toolkit.py +0 -0
- {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/toolkits/twitter_toolkit.py +0 -0
- {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/toolkits/video_analysis_toolkit.py +0 -0
- {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/toolkits/video_download_toolkit.py +0 -0
- {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/toolkits/weather_toolkit.py +0 -0
- {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/toolkits/web_deploy_toolkit.py +0 -0
- {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/toolkits/whatsapp_toolkit.py +0 -0
- {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/toolkits/wolfram_alpha_toolkit.py +0 -0
- {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/toolkits/zapier_toolkit.py +0 -0
- {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/types/__init__.py +0 -0
- {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/types/agents/__init__.py +0 -0
- {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/types/agents/tool_calling_record.py +0 -0
- {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/types/enums.py +0 -0
- {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/types/mcp_registries.py +0 -0
- {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/types/openai_types.py +0 -0
- {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/types/unified_model_type.py +0 -0
- {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/utils/__init__.py +0 -0
- {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/utils/async_func.py +0 -0
- {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/utils/chunker/__init__.py +0 -0
- {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/utils/chunker/base.py +0 -0
- {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/utils/chunker/code_chunker.py +0 -0
- {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/utils/chunker/uio_chunker.py +0 -0
- {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/utils/commons.py +0 -0
- {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/utils/constants.py +0 -0
- {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/utils/deduplication.py +0 -0
- {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/utils/filename.py +0 -0
- {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/utils/langfuse.py +0 -0
- {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/utils/mcp.py +0 -0
- {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/utils/mcp_client.py +0 -0
- {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/utils/message_summarizer.py +0 -0
- {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/utils/response_format.py +0 -0
- {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/utils/token_counting.py +0 -0
- {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/utils/tool_result.py +0 -0
- {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/verifiers/__init__.py +0 -0
- {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/verifiers/base.py +0 -0
- {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/verifiers/math_verifier.py +0 -0
- {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/verifiers/models.py +0 -0
- {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/verifiers/physics_verifier.py +0 -0
- {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/camel/verifiers/python_verifier.py +0 -0
- {camel_ai-0.2.73a2 → camel_ai-0.2.73a3}/hatch_build_npm.py +0 -0
|
@@ -14,6 +14,7 @@
|
|
|
14
14
|
|
|
15
15
|
# Enables postponed evaluation of annotations (for string-based type hints)
|
|
16
16
|
import os
|
|
17
|
+
from pathlib import Path
|
|
17
18
|
from typing import TYPE_CHECKING, List, Optional, Union
|
|
18
19
|
|
|
19
20
|
from camel.logger import get_logger
|
|
@@ -41,7 +42,7 @@ class ExcelToolkit(BaseToolkit):
|
|
|
41
42
|
def __init__(
|
|
42
43
|
self,
|
|
43
44
|
timeout: Optional[float] = None,
|
|
44
|
-
|
|
45
|
+
working_directory: Optional[str] = None,
|
|
45
46
|
):
|
|
46
47
|
r"""Initializes a new instance of the ExcelToolkit class.
|
|
47
48
|
|
|
@@ -49,16 +50,28 @@ class ExcelToolkit(BaseToolkit):
|
|
|
49
50
|
timeout (Optional[float]): The timeout value for API requests
|
|
50
51
|
in seconds. If None, no timeout is applied.
|
|
51
52
|
(default: :obj:`None`)
|
|
52
|
-
|
|
53
|
-
|
|
53
|
+
working_directory (str, optional): The default directory for
|
|
54
|
+
output files. If not provided, it will be determined by the
|
|
55
|
+
`CAMEL_WORKDIR` environment variable (if set). If the
|
|
56
|
+
environment variable is not set, it defaults to
|
|
57
|
+
`camel_working_dir`.
|
|
54
58
|
"""
|
|
55
59
|
super().__init__(timeout=timeout)
|
|
56
|
-
self.file_path = file_path
|
|
57
60
|
self.wb = None
|
|
58
|
-
if
|
|
59
|
-
|
|
61
|
+
if working_directory:
|
|
62
|
+
self.working_directory = Path(working_directory).resolve()
|
|
63
|
+
else:
|
|
64
|
+
camel_workdir = os.environ.get("CAMEL_WORKDIR")
|
|
65
|
+
if camel_workdir:
|
|
66
|
+
self.working_directory = Path(camel_workdir).resolve()
|
|
67
|
+
else:
|
|
68
|
+
self.working_directory = Path("./camel_working_dir").resolve()
|
|
60
69
|
|
|
61
|
-
|
|
70
|
+
self.working_directory.mkdir(parents=True, exist_ok=True)
|
|
71
|
+
logger.info(
|
|
72
|
+
f"ExcelToolkit initialized with output directory: "
|
|
73
|
+
f"{self.working_directory}"
|
|
74
|
+
)
|
|
62
75
|
|
|
63
76
|
def _validate_file_path(self, file_path: str) -> bool:
|
|
64
77
|
r"""Validate file path for security.
|
|
@@ -232,12 +245,11 @@ class ExcelToolkit(BaseToolkit):
|
|
|
232
245
|
logger.error(f"Failed to process Excel file {document_path}: {e}")
|
|
233
246
|
return f"Failed to process Excel file {document_path}: {e}"
|
|
234
247
|
|
|
235
|
-
def _save_workbook(self, file_path:
|
|
248
|
+
def _save_workbook(self, file_path: str) -> str:
|
|
236
249
|
r"""Save the current workbook to file.
|
|
237
250
|
|
|
238
251
|
Args:
|
|
239
|
-
file_path (
|
|
240
|
-
If None, uses self.file_path.
|
|
252
|
+
file_path (str): The path to save the workbook.
|
|
241
253
|
|
|
242
254
|
Returns:
|
|
243
255
|
str: Success or error message.
|
|
@@ -245,23 +257,46 @@ class ExcelToolkit(BaseToolkit):
|
|
|
245
257
|
if not self.wb:
|
|
246
258
|
return "Error: No workbook loaded to save."
|
|
247
259
|
|
|
248
|
-
|
|
249
|
-
if not save_path:
|
|
250
|
-
return "Error: No file path specified for saving."
|
|
251
|
-
|
|
252
|
-
if not self._validate_file_path(save_path):
|
|
260
|
+
if not self._validate_file_path(file_path):
|
|
253
261
|
return "Error: Invalid file path for saving."
|
|
254
262
|
|
|
255
263
|
try:
|
|
256
|
-
self.wb.save(
|
|
257
|
-
return f"Workbook saved successfully to {
|
|
264
|
+
self.wb.save(file_path)
|
|
265
|
+
return f"Workbook saved successfully to {file_path}"
|
|
258
266
|
except Exception as e:
|
|
259
267
|
logger.error(f"Failed to save workbook: {e}")
|
|
260
268
|
return f"Error: Failed to save workbook: {e}"
|
|
261
269
|
|
|
270
|
+
def save_workbook(self, filename: str) -> str:
|
|
271
|
+
r"""Save the current in-memory workbook to a file.
|
|
272
|
+
|
|
273
|
+
Args:
|
|
274
|
+
filename (str): The filename to save the workbook. Must end with
|
|
275
|
+
.xlsx extension. The file will be saved in self.
|
|
276
|
+
working_directory.
|
|
277
|
+
|
|
278
|
+
Returns:
|
|
279
|
+
str: Success message or error details.
|
|
280
|
+
"""
|
|
281
|
+
if not self.wb:
|
|
282
|
+
return "Error: No workbook is currently loaded in memory."
|
|
283
|
+
|
|
284
|
+
# Validate filename
|
|
285
|
+
if not filename:
|
|
286
|
+
return "Error: Filename is required."
|
|
287
|
+
|
|
288
|
+
if not filename.endswith('.xlsx'):
|
|
289
|
+
return "Error: Filename must end with .xlsx extension."
|
|
290
|
+
|
|
291
|
+
# Create full path in working directory
|
|
292
|
+
file_path = self.working_directory / filename
|
|
293
|
+
resolved_file_path = str(file_path.resolve())
|
|
294
|
+
|
|
295
|
+
return self._save_workbook(resolved_file_path)
|
|
296
|
+
|
|
262
297
|
def create_workbook(
|
|
263
298
|
self,
|
|
264
|
-
|
|
299
|
+
filename: Optional[str] = None,
|
|
265
300
|
sheet_name: Optional[str] = None,
|
|
266
301
|
data: Optional[List[List[Union[str, int, float, None]]]] = None,
|
|
267
302
|
) -> str:
|
|
@@ -271,8 +306,9 @@ class ExcelToolkit(BaseToolkit):
|
|
|
271
306
|
toolkit to work with the new file and optionally adds initial data.
|
|
272
307
|
|
|
273
308
|
Args:
|
|
274
|
-
|
|
275
|
-
xlsx.
|
|
309
|
+
filename (Optional[str]): The filename for the workbook. Must end
|
|
310
|
+
with .xlsx extension. The file will be saved in
|
|
311
|
+
self.working_directory. (default: :obj:`None`)
|
|
276
312
|
sheet_name (Optional[str]): Name for the first sheet. If None,
|
|
277
313
|
creates "Sheet1". (default: :obj:`None`)
|
|
278
314
|
data (Optional[List[List[Union[str, int, float, None]]]]): Initial
|
|
@@ -284,14 +320,31 @@ class ExcelToolkit(BaseToolkit):
|
|
|
284
320
|
"""
|
|
285
321
|
from openpyxl import Workbook
|
|
286
322
|
|
|
287
|
-
|
|
323
|
+
# Validate filename
|
|
324
|
+
if filename is None:
|
|
325
|
+
return "Error: Filename is required."
|
|
326
|
+
|
|
327
|
+
if not filename.endswith('.xlsx'):
|
|
328
|
+
return "Error: Filename must end with .xlsx extension."
|
|
329
|
+
|
|
330
|
+
# Create full path in working directory
|
|
331
|
+
file_path = self.working_directory / filename
|
|
332
|
+
resolved_file_path = str(file_path.resolve())
|
|
333
|
+
|
|
334
|
+
if not self._validate_file_path(resolved_file_path):
|
|
288
335
|
return "Error: Invalid file path."
|
|
289
336
|
|
|
337
|
+
# Check if file already exists
|
|
338
|
+
if os.path.exists(resolved_file_path):
|
|
339
|
+
return (
|
|
340
|
+
f"Error: File {filename} already exists in "
|
|
341
|
+
f"{self.working_directory}."
|
|
342
|
+
)
|
|
343
|
+
|
|
290
344
|
try:
|
|
291
345
|
# Create a new workbook
|
|
292
346
|
wb = Workbook()
|
|
293
347
|
self.wb = wb
|
|
294
|
-
self.file_path = file_path
|
|
295
348
|
|
|
296
349
|
# Handle sheet creation safely
|
|
297
350
|
if sheet_name:
|
|
@@ -312,42 +365,55 @@ class ExcelToolkit(BaseToolkit):
|
|
|
312
365
|
ws.append(row)
|
|
313
366
|
|
|
314
367
|
# Save the workbook to the specified file path
|
|
315
|
-
wb.save(
|
|
368
|
+
wb.save(resolved_file_path)
|
|
316
369
|
|
|
317
|
-
return f"Workbook created successfully at {
|
|
370
|
+
return f"Workbook created successfully at {resolved_file_path}"
|
|
318
371
|
except Exception as e:
|
|
319
372
|
logger.error(f"Failed to create workbook: {e}")
|
|
320
373
|
return f"Error: Failed to create workbook: {e}"
|
|
321
374
|
|
|
322
|
-
def delete_workbook(self,
|
|
323
|
-
r"""Delete a spreadsheet file.
|
|
375
|
+
def delete_workbook(self, filename: str) -> str:
|
|
376
|
+
r"""Delete a spreadsheet file from the working directory.
|
|
324
377
|
|
|
325
378
|
Args:
|
|
326
|
-
|
|
327
|
-
|
|
379
|
+
filename (str): The filename to delete. Must end with .xlsx
|
|
380
|
+
extension. The file will be deleted from self.
|
|
381
|
+
working_directory.
|
|
328
382
|
|
|
329
383
|
Returns:
|
|
330
|
-
str: Success message.
|
|
384
|
+
str: Success message or error details.
|
|
331
385
|
"""
|
|
332
|
-
|
|
333
|
-
if not
|
|
334
|
-
return "Error:
|
|
386
|
+
# Validate filename
|
|
387
|
+
if not filename:
|
|
388
|
+
return "Error: Filename is required."
|
|
389
|
+
|
|
390
|
+
if not filename.endswith('.xlsx'):
|
|
391
|
+
return "Error: Filename must end with .xlsx extension."
|
|
392
|
+
|
|
393
|
+
# Create full path in working directory
|
|
394
|
+
file_path = self.working_directory / filename
|
|
395
|
+
target_path = str(file_path.resolve())
|
|
335
396
|
|
|
336
397
|
if not self._validate_file_path(target_path):
|
|
337
398
|
return "Error: Invalid file path."
|
|
338
399
|
|
|
339
400
|
if not os.path.exists(target_path):
|
|
340
|
-
return
|
|
401
|
+
return (
|
|
402
|
+
f"Error: File {filename} does not exist in "
|
|
403
|
+
f"{self.working_directory}."
|
|
404
|
+
)
|
|
341
405
|
|
|
342
406
|
try:
|
|
343
407
|
os.remove(target_path)
|
|
344
|
-
if
|
|
345
|
-
|
|
346
|
-
|
|
347
|
-
|
|
408
|
+
# Clean up workbook if one is loaded
|
|
409
|
+
self.wb = None
|
|
410
|
+
return (
|
|
411
|
+
f"Workbook {filename} deleted successfully from "
|
|
412
|
+
f"{self.working_directory}."
|
|
413
|
+
)
|
|
348
414
|
except Exception as e:
|
|
349
415
|
logger.error(f"Failed to delete workbook: {e}")
|
|
350
|
-
return f"Failed to delete workbook {
|
|
416
|
+
return f"Error: Failed to delete workbook {filename}: {e}"
|
|
351
417
|
|
|
352
418
|
def create_sheet(
|
|
353
419
|
self,
|
|
@@ -379,9 +445,6 @@ class ExcelToolkit(BaseToolkit):
|
|
|
379
445
|
for row in data:
|
|
380
446
|
ws.append(row)
|
|
381
447
|
|
|
382
|
-
save_result = self._save_workbook()
|
|
383
|
-
if save_result.startswith("Error"):
|
|
384
|
-
return save_result
|
|
385
448
|
return f"Sheet {sheet_name} created successfully."
|
|
386
449
|
except Exception as e:
|
|
387
450
|
logger.error(f"Failed to create sheet: {e}")
|
|
@@ -408,9 +471,6 @@ class ExcelToolkit(BaseToolkit):
|
|
|
408
471
|
try:
|
|
409
472
|
ws = self.wb[sheet_name]
|
|
410
473
|
self.wb.remove(ws)
|
|
411
|
-
save_result = self._save_workbook()
|
|
412
|
-
if save_result.startswith("Error"):
|
|
413
|
-
return save_result
|
|
414
474
|
return f"Sheet {sheet_name} deleted successfully."
|
|
415
475
|
except Exception as e:
|
|
416
476
|
logger.error(f"Failed to delete sheet: {e}")
|
|
@@ -439,9 +499,6 @@ class ExcelToolkit(BaseToolkit):
|
|
|
439
499
|
for cell in row:
|
|
440
500
|
cell.value = None
|
|
441
501
|
|
|
442
|
-
save_result = self._save_workbook()
|
|
443
|
-
if save_result.startswith("Error"):
|
|
444
|
-
return save_result
|
|
445
502
|
return f"Sheet {sheet_name} cleared successfully."
|
|
446
503
|
except Exception as e:
|
|
447
504
|
logger.error(f"Failed to clear sheet: {e}")
|
|
@@ -479,7 +536,6 @@ class ExcelToolkit(BaseToolkit):
|
|
|
479
536
|
num_rows = end_row - start_row + 1
|
|
480
537
|
ws.delete_rows(start_row, num_rows)
|
|
481
538
|
|
|
482
|
-
self._save_workbook()
|
|
483
539
|
return (
|
|
484
540
|
f"Deleted rows {start_row} to {end_row} from sheet "
|
|
485
541
|
f"{sheet_name} successfully."
|
|
@@ -518,7 +574,6 @@ class ExcelToolkit(BaseToolkit):
|
|
|
518
574
|
num_cols = end_col - start_col + 1
|
|
519
575
|
ws.delete_cols(start_col, num_cols)
|
|
520
576
|
|
|
521
|
-
self._save_workbook()
|
|
522
577
|
return (
|
|
523
578
|
f"Deleted columns {start_col} to {end_col} from sheet "
|
|
524
579
|
f"{sheet_name} successfully."
|
|
@@ -585,9 +640,6 @@ class ExcelToolkit(BaseToolkit):
|
|
|
585
640
|
ws[cell_reference].value = None
|
|
586
641
|
else:
|
|
587
642
|
ws[cell_reference] = value
|
|
588
|
-
save_result = self._save_workbook()
|
|
589
|
-
if save_result.startswith("Error"):
|
|
590
|
-
return save_result
|
|
591
643
|
return (
|
|
592
644
|
f"Cell {cell_reference} updated successfully in sheet "
|
|
593
645
|
f"{sheet_name}."
|
|
@@ -765,10 +817,9 @@ class ExcelToolkit(BaseToolkit):
|
|
|
765
817
|
if col_idx < len(values[row_idx]):
|
|
766
818
|
cell.value = values[row_idx][col_idx]
|
|
767
819
|
|
|
768
|
-
self._save_workbook()
|
|
769
820
|
return f"Values set for range {cell_range} in sheet {sheet_name}."
|
|
770
821
|
|
|
771
|
-
def export_sheet_to_csv(self, sheet_name: str,
|
|
822
|
+
def export_sheet_to_csv(self, sheet_name: str, csv_filename: str) -> str:
|
|
772
823
|
r"""Export a specific sheet to CSV format.
|
|
773
824
|
|
|
774
825
|
Use this to convert Excel sheets to CSV files for compatibility or
|
|
@@ -776,24 +827,63 @@ class ExcelToolkit(BaseToolkit):
|
|
|
776
827
|
|
|
777
828
|
Args:
|
|
778
829
|
sheet_name (str): Name of the sheet to export.
|
|
779
|
-
|
|
830
|
+
csv_filename (str): Filename for the CSV file. Must end with .csv
|
|
831
|
+
extension. The file will be saved in self.working_directory.
|
|
780
832
|
|
|
781
833
|
Returns:
|
|
782
834
|
str: Success confirmation message or error details.
|
|
783
835
|
"""
|
|
784
836
|
if not self.wb:
|
|
785
|
-
return
|
|
837
|
+
return (
|
|
838
|
+
"Error: No workbook is currently loaded. Use "
|
|
839
|
+
"extract_excel_content to load a workbook first."
|
|
840
|
+
)
|
|
786
841
|
|
|
787
842
|
if sheet_name not in self.wb.sheetnames:
|
|
788
|
-
return
|
|
843
|
+
return (
|
|
844
|
+
f"Error: Sheet {sheet_name} does not exist in the current "
|
|
845
|
+
"workbook."
|
|
846
|
+
)
|
|
789
847
|
|
|
790
|
-
|
|
848
|
+
# Validate filename
|
|
849
|
+
if not csv_filename:
|
|
850
|
+
return "Error: CSV filename is required."
|
|
791
851
|
|
|
792
|
-
|
|
793
|
-
|
|
794
|
-
df.to_csv(csv_path, index=False)
|
|
852
|
+
if not csv_filename.endswith('.csv'):
|
|
853
|
+
return "Error: CSV filename must end with .csv extension."
|
|
795
854
|
|
|
796
|
-
|
|
855
|
+
# Create full path in working directory
|
|
856
|
+
csv_path = self.working_directory / csv_filename
|
|
857
|
+
resolved_csv_path = str(csv_path.resolve())
|
|
858
|
+
|
|
859
|
+
if not self._validate_file_path(resolved_csv_path):
|
|
860
|
+
return "Error: Invalid file path."
|
|
861
|
+
|
|
862
|
+
try:
|
|
863
|
+
# Get the worksheet
|
|
864
|
+
ws = self.wb[sheet_name]
|
|
865
|
+
|
|
866
|
+
# Convert worksheet to list of lists
|
|
867
|
+
data = []
|
|
868
|
+
for row in ws.iter_rows(values_only=True):
|
|
869
|
+
data.append(list(row))
|
|
870
|
+
|
|
871
|
+
# Write to CSV
|
|
872
|
+
import csv
|
|
873
|
+
|
|
874
|
+
with open(
|
|
875
|
+
resolved_csv_path, 'w', newline='', encoding='utf-8'
|
|
876
|
+
) as csvfile:
|
|
877
|
+
writer = csv.writer(csvfile)
|
|
878
|
+
writer.writerows(data)
|
|
879
|
+
|
|
880
|
+
return (
|
|
881
|
+
f"Sheet {sheet_name} exported to {csv_filename} "
|
|
882
|
+
f"in {self.working_directory}."
|
|
883
|
+
)
|
|
884
|
+
except Exception as e:
|
|
885
|
+
logger.error(f"Failed to export sheet to CSV: {e}")
|
|
886
|
+
return f"Error: Failed to export sheet {sheet_name} to CSV: {e}"
|
|
797
887
|
|
|
798
888
|
def get_rows(
|
|
799
889
|
self,
|
|
@@ -862,7 +952,6 @@ class ExcelToolkit(BaseToolkit):
|
|
|
862
952
|
return f"Error: Sheet {sheet_name} does not exist."
|
|
863
953
|
ws = self.wb[sheet_name]
|
|
864
954
|
ws.append(row_data)
|
|
865
|
-
self._save_workbook()
|
|
866
955
|
return f"Row appended to sheet {sheet_name} successfully."
|
|
867
956
|
|
|
868
957
|
def update_row(
|
|
@@ -901,7 +990,6 @@ class ExcelToolkit(BaseToolkit):
|
|
|
901
990
|
for col_idx, value in enumerate(row_data, 1):
|
|
902
991
|
ws.cell(row=row_number, column=col_idx).value = value
|
|
903
992
|
|
|
904
|
-
self._save_workbook()
|
|
905
993
|
return f"Row {row_number} updated in sheet {sheet_name} successfully."
|
|
906
994
|
|
|
907
995
|
def get_tools(self) -> List[FunctionTool]:
|
|
@@ -916,6 +1004,7 @@ class ExcelToolkit(BaseToolkit):
|
|
|
916
1004
|
# File operations
|
|
917
1005
|
FunctionTool(self.extract_excel_content),
|
|
918
1006
|
FunctionTool(self.create_workbook),
|
|
1007
|
+
FunctionTool(self.save_workbook),
|
|
919
1008
|
FunctionTool(self.delete_workbook),
|
|
920
1009
|
FunctionTool(self.export_sheet_to_csv),
|
|
921
1010
|
# Sheet operations
|
|
@@ -110,6 +110,11 @@ class WebSocketBrowserWrapper:
|
|
|
110
110
|
self.process: Optional[subprocess.Popen] = None
|
|
111
111
|
self.websocket = None
|
|
112
112
|
self.server_port = None
|
|
113
|
+
self._send_lock = asyncio.Lock() # Lock for sending messages
|
|
114
|
+
self._receive_task = None # Background task for receiving messages
|
|
115
|
+
self._pending_responses: Dict[
|
|
116
|
+
str, asyncio.Future[Dict[str, Any]]
|
|
117
|
+
] = {} # Message ID -> Future
|
|
113
118
|
|
|
114
119
|
# Logging configuration
|
|
115
120
|
self.browser_log_to_file = (config or {}).get(
|
|
@@ -251,11 +256,22 @@ class WebSocketBrowserWrapper:
|
|
|
251
256
|
f"Failed to connect to WebSocket server: {e}"
|
|
252
257
|
) from e
|
|
253
258
|
|
|
259
|
+
# Start the background receiver task
|
|
260
|
+
self._receive_task = asyncio.create_task(self._receive_loop())
|
|
261
|
+
|
|
254
262
|
# Initialize the browser toolkit
|
|
255
263
|
await self._send_command('init', self.config)
|
|
256
264
|
|
|
257
265
|
async def stop(self):
|
|
258
266
|
"""Stop the WebSocket connection and server."""
|
|
267
|
+
# Cancel the receiver task
|
|
268
|
+
if self._receive_task and not self._receive_task.done():
|
|
269
|
+
self._receive_task.cancel()
|
|
270
|
+
try:
|
|
271
|
+
await self._receive_task
|
|
272
|
+
except asyncio.CancelledError:
|
|
273
|
+
pass
|
|
274
|
+
|
|
259
275
|
if self.websocket:
|
|
260
276
|
try:
|
|
261
277
|
await self._send_command('shutdown', {})
|
|
@@ -327,6 +343,39 @@ class WebSocketBrowserWrapper:
|
|
|
327
343
|
except Exception as e:
|
|
328
344
|
logger.error(f"Failed to write to log file: {e}")
|
|
329
345
|
|
|
346
|
+
async def _receive_loop(self):
|
|
347
|
+
r"""Background task to receive messages from WebSocket."""
|
|
348
|
+
try:
|
|
349
|
+
while self.websocket:
|
|
350
|
+
try:
|
|
351
|
+
response_data = await self.websocket.recv()
|
|
352
|
+
response = json.loads(response_data)
|
|
353
|
+
|
|
354
|
+
message_id = response.get('id')
|
|
355
|
+
if message_id and message_id in self._pending_responses:
|
|
356
|
+
# Set the result for the waiting coroutine
|
|
357
|
+
future = self._pending_responses.pop(message_id)
|
|
358
|
+
if not future.done():
|
|
359
|
+
future.set_result(response)
|
|
360
|
+
else:
|
|
361
|
+
# Log unexpected messages
|
|
362
|
+
logger.warning(
|
|
363
|
+
f"Received unexpected message: {response}"
|
|
364
|
+
)
|
|
365
|
+
|
|
366
|
+
except asyncio.CancelledError:
|
|
367
|
+
break
|
|
368
|
+
except Exception as e:
|
|
369
|
+
logger.error(f"Error in receive loop: {e}")
|
|
370
|
+
# Notify all pending futures of the error
|
|
371
|
+
for future in self._pending_responses.values():
|
|
372
|
+
if not future.done():
|
|
373
|
+
future.set_exception(e)
|
|
374
|
+
self._pending_responses.clear()
|
|
375
|
+
break
|
|
376
|
+
finally:
|
|
377
|
+
logger.debug("Receive loop terminated")
|
|
378
|
+
|
|
330
379
|
async def _ensure_connection(self) -> None:
|
|
331
380
|
"""Ensure WebSocket connection is alive."""
|
|
332
381
|
if not self.websocket:
|
|
@@ -350,39 +399,39 @@ class WebSocketBrowserWrapper:
|
|
|
350
399
|
message_id = str(uuid.uuid4())
|
|
351
400
|
message = {'id': message_id, 'command': command, 'params': params}
|
|
352
401
|
|
|
353
|
-
|
|
354
|
-
|
|
355
|
-
|
|
356
|
-
raise RuntimeError("WebSocket connection not established")
|
|
357
|
-
await self.websocket.send(json.dumps(message))
|
|
402
|
+
# Create a future for this message
|
|
403
|
+
future: asyncio.Future[Dict[str, Any]] = asyncio.Future()
|
|
404
|
+
self._pending_responses[message_id] = future
|
|
358
405
|
|
|
359
|
-
|
|
360
|
-
|
|
361
|
-
|
|
362
|
-
|
|
363
|
-
|
|
364
|
-
|
|
365
|
-
|
|
366
|
-
|
|
367
|
-
|
|
368
|
-
|
|
369
|
-
|
|
370
|
-
if response.get('id') == message_id:
|
|
371
|
-
if not response.get('success'):
|
|
372
|
-
raise RuntimeError(
|
|
373
|
-
f"Command failed: {response.get('error')}"
|
|
374
|
-
)
|
|
375
|
-
return response['result']
|
|
406
|
+
try:
|
|
407
|
+
# Use lock only for sending to prevent interleaved messages
|
|
408
|
+
async with self._send_lock:
|
|
409
|
+
if self.websocket is None:
|
|
410
|
+
raise RuntimeError("WebSocket connection not established")
|
|
411
|
+
await self.websocket.send(json.dumps(message))
|
|
412
|
+
|
|
413
|
+
# Wait for response (no lock needed, handled by background
|
|
414
|
+
# receiver)
|
|
415
|
+
try:
|
|
416
|
+
response = await asyncio.wait_for(future, timeout=60.0)
|
|
376
417
|
|
|
377
|
-
|
|
418
|
+
if not response.get('success'):
|
|
378
419
|
raise RuntimeError(
|
|
379
|
-
f"
|
|
420
|
+
f"Command failed: {response.get('error')}"
|
|
380
421
|
)
|
|
381
|
-
|
|
382
|
-
|
|
383
|
-
|
|
422
|
+
return response['result']
|
|
423
|
+
|
|
424
|
+
except asyncio.TimeoutError:
|
|
425
|
+
# Remove from pending if timeout
|
|
426
|
+
self._pending_responses.pop(message_id, None)
|
|
427
|
+
raise RuntimeError(
|
|
428
|
+
f"Timeout waiting for response to command: {command}"
|
|
429
|
+
)
|
|
384
430
|
|
|
385
431
|
except Exception as e:
|
|
432
|
+
# Clean up the pending response
|
|
433
|
+
self._pending_responses.pop(message_id, None)
|
|
434
|
+
|
|
386
435
|
# Check if it's a connection closed error
|
|
387
436
|
if (
|
|
388
437
|
"close frame" in str(e)
|