camel-ai 0.2.59__py3-none-any.whl → 0.2.82__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Potentially problematic release.
This version of camel-ai might be problematic. Click here for more details.
- camel/__init__.py +3 -3
- camel/agents/__init__.py +2 -2
- camel/agents/_types.py +9 -4
- camel/agents/_utils.py +40 -2
- camel/agents/base.py +2 -2
- camel/agents/chat_agent.py +5012 -902
- camel/agents/critic_agent.py +2 -2
- camel/agents/deductive_reasoner_agent.py +56 -56
- camel/agents/embodied_agent.py +2 -2
- camel/agents/knowledge_graph_agent.py +20 -20
- camel/agents/mcp_agent.py +39 -36
- camel/agents/multi_hop_generator_agent.py +3 -3
- camel/agents/programmed_agent_instruction.py +2 -2
- camel/agents/repo_agent.py +4 -3
- camel/agents/role_assignment_agent.py +2 -2
- camel/agents/search_agent.py +2 -2
- camel/agents/task_agent.py +2 -2
- camel/agents/tool_agents/__init__.py +2 -2
- camel/agents/tool_agents/base.py +2 -2
- camel/agents/tool_agents/hugging_face_tool_agent.py +3 -3
- camel/benchmarks/__init__.py +2 -2
- camel/benchmarks/apibank.py +5 -5
- camel/benchmarks/apibench.py +2 -2
- camel/benchmarks/base.py +2 -2
- camel/benchmarks/browsecomp.py +44 -33
- camel/benchmarks/gaia.py +17 -13
- camel/benchmarks/mock_website/README.md +94 -0
- camel/benchmarks/mock_website/mock_web.py +299 -0
- camel/benchmarks/mock_website/requirements.txt +3 -0
- camel/benchmarks/mock_website/shopping_mall/app.py +465 -0
- camel/benchmarks/mock_website/task.json +104 -0
- camel/benchmarks/nexus.py +3 -3
- camel/benchmarks/ragbench.py +2 -2
- camel/bots/__init__.py +2 -2
- camel/bots/discord/__init__.py +2 -2
- camel/bots/discord/discord_app.py +2 -2
- camel/bots/discord/discord_installation.py +2 -2
- camel/bots/discord/discord_store.py +3 -3
- camel/bots/slack/__init__.py +2 -2
- camel/bots/slack/models.py +4 -4
- camel/bots/slack/slack_app.py +2 -2
- camel/bots/telegram_bot.py +2 -2
- camel/configs/__init__.py +26 -2
- camel/configs/aihubmix_config.py +90 -0
- camel/configs/aiml_config.py +2 -2
- camel/configs/amd_config.py +70 -0
- camel/configs/anthropic_config.py +8 -7
- camel/configs/base_config.py +2 -2
- camel/configs/bedrock_config.py +5 -3
- camel/configs/cerebras_config.py +98 -0
- camel/configs/cohere_config.py +3 -3
- camel/configs/cometapi_config.py +106 -0
- camel/configs/crynux_config.py +94 -0
- camel/configs/deepseek_config.py +9 -8
- camel/configs/gemini_config.py +6 -4
- camel/configs/groq_config.py +6 -4
- camel/configs/internlm_config.py +6 -4
- camel/configs/litellm_config.py +2 -2
- camel/configs/lmstudio_config.py +6 -4
- camel/configs/minimax_config.py +95 -0
- camel/configs/mistral_config.py +3 -3
- camel/configs/modelscope_config.py +5 -3
- camel/configs/moonshot_config.py +2 -2
- camel/configs/nebius_config.py +105 -0
- camel/configs/netmind_config.py +2 -2
- camel/configs/novita_config.py +2 -2
- camel/configs/nvidia_config.py +2 -2
- camel/configs/ollama_config.py +2 -2
- camel/configs/openai_config.py +8 -3
- camel/configs/openrouter_config.py +6 -4
- camel/configs/ppio_config.py +2 -2
- camel/configs/qianfan_config.py +85 -0
- camel/configs/qwen_config.py +2 -2
- camel/configs/reka_config.py +3 -3
- camel/configs/samba_config.py +8 -6
- camel/configs/sglang_config.py +2 -2
- camel/configs/siliconflow_config.py +2 -2
- camel/configs/togetherai_config.py +2 -2
- camel/configs/vllm_config.py +4 -2
- camel/configs/watsonx_config.py +2 -2
- camel/configs/yi_config.py +6 -4
- camel/configs/zhipuai_config.py +6 -4
- camel/{data_collector → data_collectors}/__init__.py +2 -2
- camel/{data_collector → data_collectors}/alpaca_collector.py +19 -10
- camel/{data_collector → data_collectors}/base.py +2 -2
- camel/{data_collector → data_collectors}/sharegpt_collector.py +3 -3
- camel/datagen/__init__.py +2 -2
- camel/datagen/cot_datagen.py +32 -37
- camel/datagen/evol_instruct/__init__.py +2 -2
- camel/datagen/evol_instruct/evol_instruct.py +2 -2
- camel/datagen/evol_instruct/scorer.py +24 -25
- camel/datagen/evol_instruct/templates.py +48 -48
- camel/datagen/self_improving_cot.py +5 -5
- camel/datagen/self_instruct/__init__.py +2 -2
- camel/datagen/self_instruct/filter/__init__.py +2 -2
- camel/datagen/self_instruct/filter/filter_function.py +2 -2
- camel/datagen/self_instruct/filter/filter_registry.py +2 -2
- camel/datagen/self_instruct/filter/instruction_filter.py +2 -2
- camel/datagen/self_instruct/self_instruct.py +2 -2
- camel/datagen/self_instruct/templates.py +47 -47
- camel/datagen/source2synth/__init__.py +2 -2
- camel/datagen/source2synth/data_processor.py +2 -2
- camel/datagen/source2synth/models.py +2 -2
- camel/datagen/source2synth/user_data_processor_config.py +2 -2
- camel/datahubs/__init__.py +2 -2
- camel/datahubs/base.py +2 -2
- camel/datahubs/huggingface.py +2 -2
- camel/datahubs/models.py +2 -2
- camel/datasets/__init__.py +2 -2
- camel/datasets/base_generator.py +41 -12
- camel/datasets/few_shot_generator.py +18 -18
- camel/datasets/models.py +3 -3
- camel/datasets/self_instruct_generator.py +2 -2
- camel/datasets/static_dataset.py +152 -2
- camel/embeddings/__init__.py +2 -2
- camel/embeddings/azure_embedding.py +2 -2
- camel/embeddings/base.py +2 -2
- camel/embeddings/gemini_embedding.py +2 -2
- camel/embeddings/jina_embedding.py +10 -3
- camel/embeddings/mistral_embedding.py +2 -2
- camel/embeddings/openai_compatible_embedding.py +2 -2
- camel/embeddings/openai_embedding.py +2 -2
- camel/embeddings/sentence_transformers_embeddings.py +4 -4
- camel/embeddings/together_embedding.py +2 -2
- camel/embeddings/vlm_embedding.py +11 -4
- camel/environments/__init__.py +14 -2
- camel/environments/models.py +2 -2
- camel/environments/multi_step.py +2 -2
- camel/environments/rlcards_env.py +860 -0
- camel/environments/single_step.py +30 -5
- camel/environments/tic_tac_toe.py +3 -3
- camel/extractors/__init__.py +2 -2
- camel/extractors/base.py +2 -2
- camel/extractors/python_strategies.py +2 -2
- camel/generators.py +2 -2
- camel/human.py +2 -2
- camel/interpreters/__init__.py +4 -2
- camel/interpreters/base.py +16 -3
- camel/interpreters/docker/Dockerfile +53 -7
- camel/interpreters/docker_interpreter.py +70 -11
- camel/interpreters/e2b_interpreter.py +59 -11
- camel/interpreters/internal_python_interpreter.py +81 -4
- camel/interpreters/interpreter_error.py +2 -2
- camel/interpreters/ipython_interpreter.py +23 -5
- camel/interpreters/microsandbox_interpreter.py +395 -0
- camel/interpreters/subprocess_interpreter.py +36 -4
- camel/loaders/__init__.py +17 -5
- camel/loaders/apify_reader.py +2 -2
- camel/loaders/base_io.py +2 -2
- camel/loaders/base_loader.py +85 -0
- camel/loaders/chunkr_reader.py +128 -93
- camel/loaders/crawl4ai_reader.py +2 -2
- camel/loaders/firecrawl_reader.py +6 -6
- camel/loaders/jina_url_reader.py +2 -2
- camel/loaders/markitdown.py +2 -2
- camel/loaders/mineru_extractor.py +2 -2
- camel/loaders/mistral_reader.py +148 -0
- camel/loaders/scrapegraph_reader.py +2 -2
- camel/loaders/unstructured_io.py +2 -2
- camel/logger.py +5 -5
- camel/memories/__init__.py +2 -2
- camel/memories/agent_memories.py +86 -3
- camel/memories/base.py +36 -2
- camel/memories/blocks/__init__.py +2 -2
- camel/memories/blocks/chat_history_block.py +126 -9
- camel/memories/blocks/vectordb_block.py +10 -3
- camel/memories/context_creators/__init__.py +2 -2
- camel/memories/context_creators/score_based.py +31 -239
- camel/memories/records.py +98 -13
- camel/messages/__init__.py +2 -2
- camel/messages/base.py +193 -46
- camel/messages/conversion/__init__.py +2 -2
- camel/messages/conversion/alpaca.py +2 -2
- camel/messages/conversion/conversation_models.py +2 -2
- camel/messages/conversion/sharegpt/__init__.py +2 -2
- camel/messages/conversion/sharegpt/function_call_formatter.py +2 -2
- camel/messages/conversion/sharegpt/hermes/__init__.py +2 -2
- camel/messages/conversion/sharegpt/hermes/hermes_function_formatter.py +2 -2
- camel/messages/func_message.py +54 -17
- camel/models/__init__.py +18 -2
- camel/models/_utils.py +3 -3
- camel/models/aihubmix_model.py +83 -0
- camel/models/aiml_model.py +11 -18
- camel/models/amd_model.py +101 -0
- camel/models/anthropic_model.py +127 -20
- camel/models/aws_bedrock_model.py +12 -35
- camel/models/azure_openai_model.py +263 -63
- camel/models/base_audio_model.py +5 -3
- camel/models/base_model.py +195 -26
- camel/models/cerebras_model.py +83 -0
- camel/models/cohere_model.py +81 -21
- camel/models/cometapi_model.py +83 -0
- camel/models/crynux_model.py +87 -0
- camel/models/deepseek_model.py +61 -59
- camel/models/fish_audio_model.py +8 -2
- camel/models/gemini_model.py +439 -30
- camel/models/groq_model.py +11 -19
- camel/models/internlm_model.py +11 -18
- camel/models/litellm_model.py +94 -34
- camel/models/lmstudio_model.py +17 -20
- camel/models/minimax_model.py +83 -0
- camel/models/mistral_model.py +84 -19
- camel/models/model_factory.py +49 -6
- camel/models/model_manager.py +33 -11
- camel/models/modelscope_model.py +13 -193
- camel/models/moonshot_model.py +195 -21
- camel/models/nebius_model.py +83 -0
- camel/models/nemotron_model.py +19 -9
- camel/models/netmind_model.py +11 -18
- camel/models/novita_model.py +11 -18
- camel/models/nvidia_model.py +11 -18
- camel/models/ollama_model.py +14 -21
- camel/models/openai_audio_models.py +2 -2
- camel/models/openai_compatible_model.py +234 -27
- camel/models/openai_model.py +255 -39
- camel/models/openrouter_model.py +11 -19
- camel/models/ppio_model.py +11 -18
- camel/models/qianfan_model.py +89 -0
- camel/models/qwen_model.py +13 -193
- camel/models/reka_model.py +90 -21
- camel/models/reward/__init__.py +2 -2
- camel/models/reward/base_reward_model.py +2 -2
- camel/models/reward/evaluator.py +2 -2
- camel/models/reward/nemotron_model.py +2 -2
- camel/models/reward/skywork_model.py +2 -2
- camel/models/samba_model.py +117 -49
- camel/models/sglang_model.py +162 -42
- camel/models/siliconflow_model.py +12 -35
- camel/models/stub_model.py +10 -7
- camel/models/togetherai_model.py +11 -18
- camel/models/vllm_model.py +10 -18
- camel/models/volcano_model.py +16 -20
- camel/models/watsonx_model.py +69 -19
- camel/models/yi_model.py +11 -18
- camel/models/zhipuai_model.py +70 -18
- camel/parsers/__init__.py +18 -0
- camel/parsers/mcp_tool_call_parser.py +176 -0
- camel/personas/__init__.py +2 -2
- camel/personas/persona.py +2 -2
- camel/personas/persona_hub.py +2 -2
- camel/prompts/__init__.py +2 -2
- camel/prompts/ai_society.py +2 -2
- camel/prompts/base.py +2 -2
- camel/prompts/code.py +2 -2
- camel/prompts/evaluation.py +2 -2
- camel/prompts/generate_text_embedding_data.py +2 -2
- camel/prompts/image_craft.py +2 -2
- camel/prompts/misalignment.py +2 -2
- camel/prompts/multi_condition_image_craft.py +2 -2
- camel/prompts/object_recognition.py +2 -2
- camel/prompts/persona_hub.py +3 -3
- camel/prompts/prompt_templates.py +2 -2
- camel/prompts/role_description_prompt_template.py +2 -2
- camel/prompts/solution_extraction.py +8 -8
- camel/prompts/task_prompt_template.py +2 -2
- camel/prompts/translation.py +2 -2
- camel/prompts/video_description_prompt.py +3 -3
- camel/responses/__init__.py +2 -2
- camel/responses/agent_responses.py +2 -2
- camel/retrievers/__init__.py +2 -2
- camel/retrievers/auto_retriever.py +23 -3
- camel/retrievers/base.py +2 -2
- camel/retrievers/bm25_retriever.py +3 -4
- camel/retrievers/cohere_rerank_retriever.py +2 -2
- camel/retrievers/hybrid_retrival.py +4 -4
- camel/retrievers/vector_retriever.py +2 -2
- camel/runtimes/Dockerfile.multi-toolkit +90 -0
- camel/{runtime → runtimes}/__init__.py +2 -2
- camel/runtimes/api.py +153 -0
- camel/{runtime → runtimes}/base.py +2 -2
- camel/{runtime → runtimes}/configs.py +13 -13
- camel/{runtime → runtimes}/daytona_runtime.py +18 -19
- camel/{runtime → runtimes}/docker_runtime.py +13 -13
- camel/{runtime → runtimes}/llm_guard_runtime.py +28 -28
- camel/{runtime → runtimes}/remote_http_runtime.py +12 -12
- camel/{runtime → runtimes}/ubuntu_docker_runtime.py +3 -3
- camel/{runtime → runtimes}/utils/__init__.py +2 -2
- camel/{runtime → runtimes}/utils/function_risk_toolkit.py +2 -2
- camel/{runtime → runtimes}/utils/ignore_risk_toolkit.py +2 -2
- camel/schemas/__init__.py +2 -2
- camel/schemas/base.py +2 -2
- camel/schemas/openai_converter.py +3 -3
- camel/schemas/outlines_converter.py +2 -2
- camel/services/agent_openapi_server.py +380 -0
- camel/societies/__init__.py +4 -2
- camel/societies/babyagi_playing.py +2 -2
- camel/societies/role_playing.py +201 -80
- camel/societies/workforce/__init__.py +10 -3
- camel/societies/workforce/base.py +9 -5
- camel/societies/workforce/events.py +143 -0
- camel/societies/workforce/prompts.py +258 -33
- camel/societies/workforce/role_playing_worker.py +95 -30
- camel/societies/workforce/single_agent_worker.py +659 -30
- camel/societies/workforce/structured_output_handler.py +512 -0
- camel/societies/workforce/task_channel.py +182 -38
- camel/societies/workforce/utils.py +784 -18
- camel/societies/workforce/worker.py +96 -28
- camel/societies/workforce/workflow_memory_manager.py +1746 -0
- camel/societies/workforce/workforce.py +5730 -366
- camel/societies/workforce/workforce_callback.py +103 -0
- camel/societies/workforce/workforce_logger.py +647 -0
- camel/societies/workforce/workforce_metrics.py +33 -0
- camel/storages/__init__.py +10 -2
- camel/storages/graph_storages/__init__.py +2 -2
- camel/storages/graph_storages/base.py +2 -2
- camel/storages/graph_storages/graph_element.py +2 -2
- camel/storages/graph_storages/nebula_graph.py +4 -4
- camel/storages/graph_storages/neo4j_graph.py +7 -7
- camel/storages/key_value_storages/__init__.py +2 -2
- camel/storages/key_value_storages/base.py +2 -2
- camel/storages/key_value_storages/in_memory.py +2 -2
- camel/storages/key_value_storages/json.py +17 -4
- camel/storages/key_value_storages/mem0_cloud.py +50 -49
- camel/storages/key_value_storages/redis.py +2 -2
- camel/storages/object_storages/__init__.py +2 -2
- camel/storages/object_storages/amazon_s3.py +2 -2
- camel/storages/object_storages/azure_blob.py +2 -2
- camel/storages/object_storages/base.py +2 -2
- camel/storages/object_storages/google_cloud.py +3 -3
- camel/storages/vectordb_storages/__init__.py +12 -2
- camel/storages/vectordb_storages/base.py +2 -2
- camel/storages/vectordb_storages/chroma.py +731 -0
- camel/storages/vectordb_storages/faiss.py +712 -0
- camel/storages/vectordb_storages/milvus.py +2 -2
- camel/storages/vectordb_storages/oceanbase.py +16 -17
- camel/storages/vectordb_storages/pgvector.py +349 -0
- camel/storages/vectordb_storages/qdrant.py +6 -6
- camel/storages/vectordb_storages/surreal.py +372 -0
- camel/storages/vectordb_storages/tidb.py +11 -8
- camel/storages/vectordb_storages/weaviate.py +714 -0
- camel/tasks/__init__.py +2 -2
- camel/tasks/task.py +366 -27
- camel/tasks/task_prompt.py +3 -3
- camel/terminators/__init__.py +2 -2
- camel/terminators/base.py +2 -2
- camel/terminators/response_terminator.py +2 -2
- camel/terminators/token_limit_terminator.py +2 -2
- camel/toolkits/__init__.py +58 -10
- camel/toolkits/aci_toolkit.py +66 -21
- camel/toolkits/arxiv_toolkit.py +8 -8
- camel/toolkits/ask_news_toolkit.py +2 -2
- camel/toolkits/async_browser_toolkit.py +174 -575
- camel/toolkits/audio_analysis_toolkit.py +3 -3
- camel/toolkits/base.py +65 -7
- camel/toolkits/bohrium_toolkit.py +318 -0
- camel/toolkits/browser_toolkit.py +306 -566
- camel/toolkits/browser_toolkit_commons.py +568 -0
- camel/toolkits/code_execution.py +67 -11
- camel/toolkits/context_summarizer_toolkit.py +684 -0
- camel/toolkits/craw4ai_toolkit.py +93 -0
- camel/toolkits/dappier_toolkit.py +12 -8
- camel/toolkits/data_commons_toolkit.py +2 -2
- camel/toolkits/dingtalk.py +1135 -0
- camel/toolkits/earth_science_toolkit.py +5367 -0
- camel/toolkits/edgeone_pages_mcp_toolkit.py +49 -0
- camel/toolkits/excel_toolkit.py +910 -70
- camel/toolkits/file_toolkit.py +1402 -0
- camel/toolkits/function_tool.py +128 -20
- camel/toolkits/github_toolkit.py +148 -43
- camel/toolkits/gmail_toolkit.py +1839 -0
- camel/toolkits/google_calendar_toolkit.py +40 -6
- camel/toolkits/google_drive_mcp_toolkit.py +54 -0
- camel/toolkits/google_maps_toolkit.py +2 -2
- camel/toolkits/google_scholar_toolkit.py +2 -2
- camel/toolkits/human_toolkit.py +36 -12
- camel/toolkits/hybrid_browser_toolkit/__init__.py +18 -0
- camel/toolkits/hybrid_browser_toolkit/config_loader.py +185 -0
- camel/toolkits/hybrid_browser_toolkit/hybrid_browser_toolkit.py +246 -0
- camel/toolkits/hybrid_browser_toolkit/hybrid_browser_toolkit_ts.py +1973 -0
- camel/toolkits/hybrid_browser_toolkit/installer.py +203 -0
- camel/toolkits/hybrid_browser_toolkit/ts/package-lock.json +4589 -0
- camel/toolkits/hybrid_browser_toolkit/ts/package.json +33 -0
- camel/toolkits/hybrid_browser_toolkit/ts/src/browser-scripts.js +125 -0
- camel/toolkits/hybrid_browser_toolkit/ts/src/browser-session.ts +1929 -0
- camel/toolkits/hybrid_browser_toolkit/ts/src/config-loader.ts +233 -0
- camel/toolkits/hybrid_browser_toolkit/ts/src/hybrid-browser-toolkit.ts +589 -0
- camel/toolkits/hybrid_browser_toolkit/ts/src/index.ts +7 -0
- camel/toolkits/hybrid_browser_toolkit/ts/src/parent-child-filter.ts +226 -0
- camel/toolkits/hybrid_browser_toolkit/ts/src/snapshot-parser.ts +219 -0
- camel/toolkits/hybrid_browser_toolkit/ts/src/som-screenshot-injected.ts +543 -0
- camel/toolkits/hybrid_browser_toolkit/ts/src/types.ts +129 -0
- camel/toolkits/hybrid_browser_toolkit/ts/tsconfig.json +27 -0
- camel/toolkits/hybrid_browser_toolkit/ts/websocket-server.js +319 -0
- camel/toolkits/hybrid_browser_toolkit/ws_wrapper.py +1037 -0
- camel/toolkits/hybrid_browser_toolkit_py/__init__.py +17 -0
- camel/toolkits/hybrid_browser_toolkit_py/actions.py +575 -0
- camel/toolkits/hybrid_browser_toolkit_py/agent.py +311 -0
- camel/toolkits/hybrid_browser_toolkit_py/browser_session.py +787 -0
- camel/toolkits/hybrid_browser_toolkit_py/config_loader.py +490 -0
- camel/toolkits/hybrid_browser_toolkit_py/hybrid_browser_toolkit.py +2390 -0
- camel/toolkits/hybrid_browser_toolkit_py/snapshot.py +233 -0
- camel/toolkits/hybrid_browser_toolkit_py/stealth_script.js +0 -0
- camel/toolkits/hybrid_browser_toolkit_py/unified_analyzer.js +1043 -0
- camel/toolkits/image_analysis_toolkit.py +3 -3
- camel/toolkits/image_generation_toolkit.py +390 -0
- camel/toolkits/jina_reranker_toolkit.py +195 -79
- camel/toolkits/klavis_toolkit.py +7 -3
- camel/toolkits/linkedin_toolkit.py +2 -2
- camel/toolkits/markitdown_toolkit.py +104 -0
- camel/toolkits/math_toolkit.py +66 -12
- camel/toolkits/mcp_toolkit.py +841 -600
- camel/toolkits/memory_toolkit.py +7 -3
- camel/toolkits/meshy_toolkit.py +2 -2
- camel/toolkits/message_agent_toolkit.py +608 -0
- camel/toolkits/message_integration.py +724 -0
- camel/toolkits/mineru_toolkit.py +2 -2
- camel/toolkits/minimax_mcp_toolkit.py +195 -0
- camel/toolkits/networkx_toolkit.py +2 -2
- camel/toolkits/note_taking_toolkit.py +277 -0
- camel/toolkits/notion_mcp_toolkit.py +224 -0
- camel/toolkits/notion_toolkit.py +2 -2
- camel/toolkits/open_api_specs/biztoc/__init__.py +2 -2
- camel/toolkits/open_api_specs/biztoc/ai-plugin.json +1 -1
- camel/toolkits/open_api_specs/coursera/__init__.py +2 -2
- camel/toolkits/open_api_specs/create_qr_code/__init__.py +2 -2
- camel/toolkits/open_api_specs/klarna/__init__.py +2 -2
- camel/toolkits/open_api_specs/nasa_apod/__init__.py +2 -2
- camel/toolkits/open_api_specs/outschool/__init__.py +2 -2
- camel/toolkits/open_api_specs/outschool/ai-plugin.json +1 -1
- camel/toolkits/open_api_specs/outschool/openapi.yaml +1 -1
- camel/toolkits/open_api_specs/outschool/paths/__init__.py +2 -2
- camel/toolkits/open_api_specs/outschool/paths/get_classes.py +2 -2
- camel/toolkits/open_api_specs/outschool/paths/search_teachers.py +2 -2
- camel/toolkits/open_api_specs/security_config.py +2 -2
- camel/toolkits/open_api_specs/speak/__init__.py +2 -2
- camel/toolkits/open_api_specs/web_scraper/__init__.py +2 -2
- camel/toolkits/open_api_specs/web_scraper/ai-plugin.json +1 -1
- camel/toolkits/open_api_specs/web_scraper/paths/__init__.py +2 -2
- camel/toolkits/open_api_specs/web_scraper/paths/scraper.py +2 -2
- camel/toolkits/open_api_toolkit.py +2 -2
- camel/toolkits/openbb_toolkit.py +7 -3
- camel/toolkits/origene_mcp_toolkit.py +56 -0
- camel/toolkits/page_script.js +86 -74
- camel/toolkits/playwright_mcp_toolkit.py +27 -32
- camel/toolkits/pptx_toolkit.py +790 -0
- camel/toolkits/pubmed_toolkit.py +2 -2
- camel/toolkits/pulse_mcp_search_toolkit.py +2 -2
- camel/toolkits/pyautogui_toolkit.py +2 -2
- camel/toolkits/reddit_toolkit.py +2 -2
- camel/toolkits/resend_toolkit.py +168 -0
- camel/toolkits/retrieval_toolkit.py +2 -2
- camel/toolkits/screenshot_toolkit.py +213 -0
- camel/toolkits/search_toolkit.py +539 -146
- camel/toolkits/searxng_toolkit.py +2 -2
- camel/toolkits/semantic_scholar_toolkit.py +2 -2
- camel/toolkits/slack_toolkit.py +108 -58
- camel/toolkits/sql_toolkit.py +712 -0
- camel/toolkits/stripe_toolkit.py +2 -2
- camel/toolkits/sympy_toolkit.py +3 -3
- camel/toolkits/task_planning_toolkit.py +134 -0
- camel/toolkits/terminal_toolkit/__init__.py +18 -0
- camel/toolkits/terminal_toolkit/terminal_toolkit.py +1070 -0
- camel/toolkits/terminal_toolkit/utils.py +532 -0
- camel/toolkits/thinking_toolkit.py +3 -3
- camel/toolkits/twitter_toolkit.py +8 -3
- camel/toolkits/vertex_ai_veo_toolkit.py +590 -0
- camel/toolkits/video_analysis_toolkit.py +112 -29
- camel/toolkits/video_download_toolkit.py +22 -16
- camel/toolkits/weather_toolkit.py +2 -2
- camel/toolkits/web_deploy_toolkit.py +1219 -0
- camel/toolkits/wechat_official_toolkit.py +483 -0
- camel/toolkits/whatsapp_toolkit.py +2 -2
- camel/toolkits/wolfram_alpha_toolkit.py +53 -25
- camel/toolkits/zapier_toolkit.py +7 -3
- camel/types/__init__.py +4 -4
- camel/types/agents/__init__.py +2 -2
- camel/types/agents/tool_calling_record.py +6 -3
- camel/types/enums.py +454 -35
- camel/types/mcp_registries.py +2 -2
- camel/types/openai_types.py +4 -4
- camel/types/unified_model_type.py +43 -6
- camel/utils/__init__.py +20 -2
- camel/utils/async_func.py +2 -2
- camel/utils/chunker/__init__.py +2 -2
- camel/utils/chunker/base.py +2 -2
- camel/utils/chunker/code_chunker.py +2 -2
- camel/utils/chunker/uio_chunker.py +2 -2
- camel/utils/commons.py +65 -7
- camel/utils/constants.py +5 -2
- camel/utils/context_utils.py +1134 -0
- camel/utils/deduplication.py +2 -2
- camel/utils/filename.py +2 -2
- camel/utils/langfuse.py +258 -0
- camel/utils/mcp.py +140 -6
- camel/utils/mcp_client.py +1056 -0
- camel/utils/message_summarizer.py +148 -0
- camel/utils/response_format.py +2 -2
- camel/utils/token_counting.py +45 -22
- camel/utils/tool_result.py +44 -0
- camel/verifiers/__init__.py +2 -2
- camel/verifiers/base.py +2 -2
- camel/verifiers/math_verifier.py +2 -2
- camel/verifiers/models.py +2 -2
- camel/verifiers/physics_verifier.py +2 -2
- camel/verifiers/python_verifier.py +2 -2
- {camel_ai-0.2.59.dist-info → camel_ai-0.2.82.dist-info}/METADATA +349 -108
- camel_ai-0.2.82.dist-info/RECORD +507 -0
- {camel_ai-0.2.59.dist-info → camel_ai-0.2.82.dist-info}/WHEEL +1 -1
- {camel_ai-0.2.59.dist-info → camel_ai-0.2.82.dist-info}/licenses/LICENSE +1 -1
- camel/loaders/pandas_reader.py +0 -368
- camel/runtime/api.py +0 -97
- camel/toolkits/dalle_toolkit.py +0 -171
- camel/toolkits/file_write_toolkit.py +0 -395
- camel/toolkits/openai_agent_toolkit.py +0 -135
- camel/toolkits/terminal_toolkit.py +0 -1037
- camel_ai-0.2.59.dist-info/RECORD +0 -410
camel/toolkits/mineru_toolkit.py
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
# ========= Copyright 2023-
|
|
1
|
+
# ========= Copyright 2023-2025 @ CAMEL-AI.org. All Rights Reserved. =========
|
|
2
2
|
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
3
3
|
# you may not use this file except in compliance with the License.
|
|
4
4
|
# You may obtain a copy of the License at
|
|
@@ -10,7 +10,7 @@
|
|
|
10
10
|
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
11
11
|
# See the License for the specific language governing permissions and
|
|
12
12
|
# limitations under the License.
|
|
13
|
-
# ========= Copyright 2023-
|
|
13
|
+
# ========= Copyright 2023-2025 @ CAMEL-AI.org. All Rights Reserved. =========
|
|
14
14
|
|
|
15
15
|
from typing import Dict, List, Optional
|
|
16
16
|
|
|
@@ -0,0 +1,195 @@
|
|
|
1
|
+
# ========= Copyright 2023-2025 @ CAMEL-AI.org. All Rights Reserved. =========
|
|
2
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
3
|
+
# you may not use this file except in compliance with the License.
|
|
4
|
+
# You may obtain a copy of the License at
|
|
5
|
+
#
|
|
6
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
|
7
|
+
#
|
|
8
|
+
# Unless required by applicable law or agreed to in writing, software
|
|
9
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
|
10
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
11
|
+
# See the License for the specific language governing permissions and
|
|
12
|
+
# limitations under the License.
|
|
13
|
+
# ========= Copyright 2023-2025 @ CAMEL-AI.org. All Rights Reserved. =========
|
|
14
|
+
|
|
15
|
+
import os
|
|
16
|
+
from typing import Any, Dict, List, Optional
|
|
17
|
+
|
|
18
|
+
from camel.toolkits import BaseToolkit, FunctionTool
|
|
19
|
+
|
|
20
|
+
from .mcp_toolkit import MCPToolkit
|
|
21
|
+
|
|
22
|
+
|
|
23
|
+
class MinimaxMCPToolkit(BaseToolkit):
|
|
24
|
+
r"""MinimaxMCPToolkit provides an interface for interacting with
|
|
25
|
+
MiniMax AI services using the MiniMax MCP server.
|
|
26
|
+
|
|
27
|
+
This toolkit enables access to MiniMax's multimedia generation
|
|
28
|
+
capabilities including text-to-audio, voice cloning, video generation,
|
|
29
|
+
image generation, music generation, and voice design.
|
|
30
|
+
|
|
31
|
+
This toolkit can be used as an async context manager for automatic
|
|
32
|
+
connection management:
|
|
33
|
+
|
|
34
|
+
# Using explicit API key
|
|
35
|
+
async with MinimaxMCPToolkit(api_key="your-key") as toolkit:
|
|
36
|
+
tools = toolkit.get_tools()
|
|
37
|
+
# Toolkit is automatically disconnected when exiting
|
|
38
|
+
|
|
39
|
+
# Using environment variables (recommended for security)
|
|
40
|
+
# Set MINIMAX_API_KEY=your-key in environment
|
|
41
|
+
async with MinimaxMCPToolkit() as toolkit:
|
|
42
|
+
tools = toolkit.get_tools()
|
|
43
|
+
|
|
44
|
+
Environment Variables:
|
|
45
|
+
MINIMAX_API_KEY: MiniMax API key for authentication
|
|
46
|
+
MINIMAX_API_HOST: API host URL (default: https://api.minimax.io)
|
|
47
|
+
MINIMAX_MCP_BASE_PATH: Base path for output files
|
|
48
|
+
|
|
49
|
+
Attributes:
|
|
50
|
+
timeout (Optional[float]): Connection timeout in seconds.
|
|
51
|
+
(default: :obj:`None`)
|
|
52
|
+
"""
|
|
53
|
+
|
|
54
|
+
def __init__(
|
|
55
|
+
self,
|
|
56
|
+
api_key: Optional[str] = None,
|
|
57
|
+
api_host: str = "https://api.minimax.io",
|
|
58
|
+
base_path: Optional[str] = None,
|
|
59
|
+
timeout: Optional[float] = None,
|
|
60
|
+
) -> None:
|
|
61
|
+
r"""Initializes the MinimaxMCPToolkit.
|
|
62
|
+
|
|
63
|
+
Args:
|
|
64
|
+
api_key (Optional[str]): MiniMax API key for authentication.
|
|
65
|
+
If None, will attempt to read from MINIMAX_API_KEY
|
|
66
|
+
environment variable. (default: :obj:`None`)
|
|
67
|
+
api_host (str): MiniMax API host URL. Can be either
|
|
68
|
+
"https://api.minimax.io" (global) or
|
|
69
|
+
"https://api.minimaxi.com" (mainland China).
|
|
70
|
+
Can also be read from MINIMAX_API_HOST environment variable.
|
|
71
|
+
(default: :obj:`"https://api.minimax.io"`)
|
|
72
|
+
base_path (Optional[str]): Base path for output files.
|
|
73
|
+
If None, uses current working directory. Can also be read
|
|
74
|
+
from MINIMAX_MCP_BASE_PATH environment variable.
|
|
75
|
+
(default: :obj:`None`)
|
|
76
|
+
timeout (Optional[float]): Connection timeout in seconds.
|
|
77
|
+
(default: :obj:`None`)
|
|
78
|
+
"""
|
|
79
|
+
super().__init__(timeout=timeout)
|
|
80
|
+
|
|
81
|
+
# Read API key from parameter or environment variable
|
|
82
|
+
if api_key is None:
|
|
83
|
+
api_key = os.getenv("MINIMAX_API_KEY")
|
|
84
|
+
|
|
85
|
+
if not api_key:
|
|
86
|
+
raise ValueError(
|
|
87
|
+
"api_key must be provided either as a parameter or through "
|
|
88
|
+
"the MINIMAX_API_KEY environment variable"
|
|
89
|
+
)
|
|
90
|
+
|
|
91
|
+
# Read API host from environment variable if not overridden
|
|
92
|
+
env_api_host = os.getenv("MINIMAX_API_HOST")
|
|
93
|
+
if env_api_host:
|
|
94
|
+
api_host = env_api_host
|
|
95
|
+
|
|
96
|
+
# Read base path from environment variable if not provided
|
|
97
|
+
if base_path is None:
|
|
98
|
+
base_path = os.getenv("MINIMAX_MCP_BASE_PATH")
|
|
99
|
+
|
|
100
|
+
# Set up environment variables for the MCP server
|
|
101
|
+
env = {
|
|
102
|
+
"MINIMAX_API_KEY": api_key,
|
|
103
|
+
"MINIMAX_API_HOST": api_host,
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
if base_path:
|
|
107
|
+
env["MINIMAX_MCP_BASE_PATH"] = base_path
|
|
108
|
+
|
|
109
|
+
self._mcp_toolkit = MCPToolkit(
|
|
110
|
+
config_dict={
|
|
111
|
+
"mcpServers": {
|
|
112
|
+
"minimax": {
|
|
113
|
+
"command": "uvx",
|
|
114
|
+
"args": ["minimax-mcp", "-y"],
|
|
115
|
+
"env": env,
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
},
|
|
119
|
+
timeout=timeout,
|
|
120
|
+
)
|
|
121
|
+
|
|
122
|
+
async def connect(self):
|
|
123
|
+
r"""Explicitly connect to the MiniMax MCP server."""
|
|
124
|
+
await self._mcp_toolkit.connect()
|
|
125
|
+
|
|
126
|
+
async def disconnect(self):
|
|
127
|
+
r"""Explicitly disconnect from the MiniMax MCP server."""
|
|
128
|
+
await self._mcp_toolkit.disconnect()
|
|
129
|
+
|
|
130
|
+
@property
|
|
131
|
+
def is_connected(self) -> bool:
|
|
132
|
+
r"""Check if the toolkit is connected to the MCP server.
|
|
133
|
+
|
|
134
|
+
Returns:
|
|
135
|
+
bool: True if connected, False otherwise.
|
|
136
|
+
"""
|
|
137
|
+
return self._mcp_toolkit.is_connected
|
|
138
|
+
|
|
139
|
+
async def __aenter__(self) -> "MinimaxMCPToolkit":
|
|
140
|
+
r"""Async context manager entry point.
|
|
141
|
+
|
|
142
|
+
Returns:
|
|
143
|
+
MinimaxMCPToolkit: The connected toolkit instance.
|
|
144
|
+
|
|
145
|
+
Example:
|
|
146
|
+
async with MinimaxMCPToolkit(api_key="your-key") as toolkit:
|
|
147
|
+
tools = toolkit.get_tools()
|
|
148
|
+
"""
|
|
149
|
+
await self.connect()
|
|
150
|
+
return self
|
|
151
|
+
|
|
152
|
+
async def __aexit__(self, _exc_type, _exc_val, _exc_tb) -> None:
|
|
153
|
+
r"""Async context manager exit point.
|
|
154
|
+
|
|
155
|
+
Automatically disconnects from the MiniMax MCP server.
|
|
156
|
+
"""
|
|
157
|
+
await self.disconnect()
|
|
158
|
+
|
|
159
|
+
def get_tools(self) -> List[FunctionTool]:
|
|
160
|
+
r"""Returns a list of tools provided by the MiniMax MCP server.
|
|
161
|
+
|
|
162
|
+
This includes tools for:
|
|
163
|
+
- Text-to-audio conversion
|
|
164
|
+
- Voice cloning
|
|
165
|
+
- Video generation
|
|
166
|
+
- Image generation
|
|
167
|
+
- Music generation
|
|
168
|
+
- Voice design
|
|
169
|
+
|
|
170
|
+
Returns:
|
|
171
|
+
List[FunctionTool]: List of available MiniMax AI tools.
|
|
172
|
+
"""
|
|
173
|
+
return self._mcp_toolkit.get_tools()
|
|
174
|
+
|
|
175
|
+
def get_text_tools(self) -> str:
|
|
176
|
+
r"""Returns a string containing the descriptions of the tools.
|
|
177
|
+
|
|
178
|
+
Returns:
|
|
179
|
+
str: A string containing the descriptions of all MiniMax tools.
|
|
180
|
+
"""
|
|
181
|
+
return self._mcp_toolkit.get_text_tools()
|
|
182
|
+
|
|
183
|
+
async def call_tool(
|
|
184
|
+
self, tool_name: str, tool_args: Dict[str, Any]
|
|
185
|
+
) -> Any:
|
|
186
|
+
r"""Call a MiniMax tool by name.
|
|
187
|
+
|
|
188
|
+
Args:
|
|
189
|
+
tool_name (str): Name of the tool to call.
|
|
190
|
+
tool_args (Dict[str, Any]): Arguments to pass to the tool.
|
|
191
|
+
|
|
192
|
+
Returns:
|
|
193
|
+
Any: The result of the tool call.
|
|
194
|
+
"""
|
|
195
|
+
return await self._mcp_toolkit.call_tool(tool_name, tool_args)
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
# ========= Copyright 2023-
|
|
1
|
+
# ========= Copyright 2023-2025 @ CAMEL-AI.org. All Rights Reserved. =========
|
|
2
2
|
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
3
3
|
# you may not use this file except in compliance with the License.
|
|
4
4
|
# You may obtain a copy of the License at
|
|
@@ -10,7 +10,7 @@
|
|
|
10
10
|
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
11
11
|
# See the License for the specific language governing permissions and
|
|
12
12
|
# limitations under the License.
|
|
13
|
-
# ========= Copyright 2023-
|
|
13
|
+
# ========= Copyright 2023-2025 @ CAMEL-AI.org. All Rights Reserved. =========
|
|
14
14
|
|
|
15
15
|
import json
|
|
16
16
|
from typing import Any, Callable, Dict, List, Literal, Optional, Tuple, Union
|
|
@@ -0,0 +1,277 @@
|
|
|
1
|
+
# ========= Copyright 2023-2025 @ CAMEL-AI.org. All Rights Reserved. =========
|
|
2
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
3
|
+
# you may not use this file except in compliance with the License.
|
|
4
|
+
# You may obtain a copy of the License at
|
|
5
|
+
#
|
|
6
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
|
7
|
+
#
|
|
8
|
+
# Unless required by applicable law or agreed to in writing, software
|
|
9
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
|
10
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
11
|
+
# See the License for the specific language governing permissions and
|
|
12
|
+
# limitations under the License.
|
|
13
|
+
# ========= Copyright 2023-2025 @ CAMEL-AI.org. All Rights Reserved. =========
|
|
14
|
+
import os
|
|
15
|
+
import time
|
|
16
|
+
from pathlib import Path
|
|
17
|
+
from typing import List, Optional
|
|
18
|
+
|
|
19
|
+
from camel.toolkits.base import BaseToolkit
|
|
20
|
+
from camel.toolkits.function_tool import FunctionTool
|
|
21
|
+
|
|
22
|
+
|
|
23
|
+
class NoteTakingToolkit(BaseToolkit):
|
|
24
|
+
r"""A toolkit for managing and interacting with markdown note files.
|
|
25
|
+
|
|
26
|
+
This toolkit provides tools for creating, reading, appending to, and
|
|
27
|
+
listing notes. All notes are stored as `.md` files in a dedicated working
|
|
28
|
+
directory and are tracked in a registry.
|
|
29
|
+
"""
|
|
30
|
+
|
|
31
|
+
def __init__(
|
|
32
|
+
self,
|
|
33
|
+
working_directory: Optional[str] = None,
|
|
34
|
+
timeout: Optional[float] = None,
|
|
35
|
+
) -> None:
|
|
36
|
+
r"""Initialize the NoteTakingToolkit.
|
|
37
|
+
|
|
38
|
+
Args:
|
|
39
|
+
working_directory (str, optional): The directory path where notes
|
|
40
|
+
will be stored. If not provided, it will be determined by the
|
|
41
|
+
`CAMEL_WORKDIR` environment variable (if set). If the
|
|
42
|
+
environment variable is not set, it defaults to
|
|
43
|
+
`camel_working_dir`.
|
|
44
|
+
timeout (Optional[float]): The timeout for the toolkit.
|
|
45
|
+
"""
|
|
46
|
+
super().__init__(timeout=timeout)
|
|
47
|
+
camel_workdir = os.environ.get("CAMEL_WORKDIR")
|
|
48
|
+
if working_directory:
|
|
49
|
+
path = Path(working_directory)
|
|
50
|
+
elif camel_workdir:
|
|
51
|
+
path = Path(camel_workdir)
|
|
52
|
+
else:
|
|
53
|
+
path = Path("camel_working_dir")
|
|
54
|
+
|
|
55
|
+
self.working_directory = path
|
|
56
|
+
self.working_directory.mkdir(parents=True, exist_ok=True)
|
|
57
|
+
self.registry_file = self.working_directory / ".note_register"
|
|
58
|
+
self._load_registry()
|
|
59
|
+
|
|
60
|
+
def append_note(self, note_name: str, content: str) -> str:
|
|
61
|
+
r"""Appends content to a note.
|
|
62
|
+
|
|
63
|
+
If the note does not exist, it will be created with the given content.
|
|
64
|
+
If the note already exists, the new content will be added to the end of
|
|
65
|
+
the note.
|
|
66
|
+
|
|
67
|
+
Args:
|
|
68
|
+
note_name (str): The name of the note (without the .md extension).
|
|
69
|
+
content (str): The content to append to the note.
|
|
70
|
+
|
|
71
|
+
Returns:
|
|
72
|
+
str: A message confirming that the content was appended or the note
|
|
73
|
+
was created.
|
|
74
|
+
"""
|
|
75
|
+
try:
|
|
76
|
+
# Reload registry to get latest state
|
|
77
|
+
self._load_registry()
|
|
78
|
+
note_path = self.working_directory / f"{note_name}.md"
|
|
79
|
+
if note_name not in self.registry or not note_path.exists():
|
|
80
|
+
self.create_note(note_name, content)
|
|
81
|
+
return f"Note '{note_name}' created with content added."
|
|
82
|
+
|
|
83
|
+
with note_path.open("a", encoding="utf-8") as f:
|
|
84
|
+
f.write(content + "\n")
|
|
85
|
+
return f"Content successfully appended to '{note_name}.md'."
|
|
86
|
+
except Exception as e:
|
|
87
|
+
return f"Error appending note: {e}"
|
|
88
|
+
|
|
89
|
+
def _load_registry(self) -> None:
|
|
90
|
+
r"""Load the note registry from file."""
|
|
91
|
+
max_retries = 5
|
|
92
|
+
retry_delay = 0.1
|
|
93
|
+
|
|
94
|
+
for attempt in range(max_retries):
|
|
95
|
+
try:
|
|
96
|
+
if self.registry_file.exists():
|
|
97
|
+
content = self.registry_file.read_text(
|
|
98
|
+
encoding='utf-8'
|
|
99
|
+
).strip()
|
|
100
|
+
self.registry = content.split('\n') if content else []
|
|
101
|
+
else:
|
|
102
|
+
self.registry = []
|
|
103
|
+
return
|
|
104
|
+
except (IOError, OSError):
|
|
105
|
+
if attempt < max_retries - 1:
|
|
106
|
+
time.sleep(retry_delay * (attempt + 1))
|
|
107
|
+
else:
|
|
108
|
+
# If all retries failed, initialize with empty registry
|
|
109
|
+
self.registry = []
|
|
110
|
+
|
|
111
|
+
def _save_registry(self) -> None:
|
|
112
|
+
r"""Save the note registry to file using atomic write."""
|
|
113
|
+
max_retries = 5
|
|
114
|
+
retry_delay = 0.1
|
|
115
|
+
|
|
116
|
+
for attempt in range(max_retries):
|
|
117
|
+
try:
|
|
118
|
+
# Use atomic write with temporary file for all platforms
|
|
119
|
+
temp_file = self.registry_file.with_suffix('.tmp')
|
|
120
|
+
temp_file.write_text(
|
|
121
|
+
'\n'.join(self.registry), encoding='utf-8'
|
|
122
|
+
)
|
|
123
|
+
|
|
124
|
+
# Atomic rename - works on all platforms
|
|
125
|
+
temp_file.replace(self.registry_file)
|
|
126
|
+
return
|
|
127
|
+
except (IOError, OSError):
|
|
128
|
+
if attempt < max_retries - 1:
|
|
129
|
+
time.sleep(retry_delay * (attempt + 1))
|
|
130
|
+
else:
|
|
131
|
+
raise
|
|
132
|
+
|
|
133
|
+
def _register_note(self, note_name: str) -> None:
|
|
134
|
+
r"""Register a new note in the registry with thread-safe operations."""
|
|
135
|
+
# Reload registry to get latest state
|
|
136
|
+
self._load_registry()
|
|
137
|
+
if note_name not in self.registry:
|
|
138
|
+
self.registry.append(note_name)
|
|
139
|
+
self._save_registry()
|
|
140
|
+
|
|
141
|
+
def create_note(
|
|
142
|
+
self, note_name: str, content: str, overwrite: bool = False
|
|
143
|
+
) -> str:
|
|
144
|
+
r"""Creates a new note with a unique name.
|
|
145
|
+
|
|
146
|
+
This function will create a new file for your note.
|
|
147
|
+
By default, you must provide a `note_name` that does not already exist.
|
|
148
|
+
If you want to add content to an existing note, use the `append_note`
|
|
149
|
+
function instead. If you want to overwrite an existing note, set
|
|
150
|
+
`overwrite=True`.
|
|
151
|
+
|
|
152
|
+
Args:
|
|
153
|
+
note_name (str): The name for your new note (without the .md
|
|
154
|
+
extension). This name must be unique unless overwrite is True.
|
|
155
|
+
content (str): The initial content to write in the note.
|
|
156
|
+
overwrite (bool): Whether to overwrite an existing note.
|
|
157
|
+
Defaults to False.
|
|
158
|
+
|
|
159
|
+
Returns:
|
|
160
|
+
str: A message confirming the creation of the note or an error if
|
|
161
|
+
the note name is not valid or already exists
|
|
162
|
+
(when overwrite=False).
|
|
163
|
+
"""
|
|
164
|
+
try:
|
|
165
|
+
note_path = self.working_directory / f"{note_name}.md"
|
|
166
|
+
existed_before = note_path.exists()
|
|
167
|
+
|
|
168
|
+
if existed_before and not overwrite:
|
|
169
|
+
return f"Error: Note '{note_name}.md' already exists."
|
|
170
|
+
|
|
171
|
+
note_path.write_text(content, encoding="utf-8")
|
|
172
|
+
self._register_note(note_name)
|
|
173
|
+
|
|
174
|
+
if existed_before and overwrite:
|
|
175
|
+
return f"Note '{note_name}.md' successfully overwritten."
|
|
176
|
+
else:
|
|
177
|
+
return f"Note '{note_name}.md' successfully created."
|
|
178
|
+
except Exception as e:
|
|
179
|
+
return f"Error creating note: {e}"
|
|
180
|
+
|
|
181
|
+
def list_note(self) -> str:
|
|
182
|
+
r"""Lists all the notes you have created.
|
|
183
|
+
|
|
184
|
+
This function will show you a list of all your notes, along with their
|
|
185
|
+
sizes in bytes. This is useful for seeing what notes you have available
|
|
186
|
+
to read or append to.
|
|
187
|
+
|
|
188
|
+
Returns:
|
|
189
|
+
str: A string containing a list of available notes and their sizes,
|
|
190
|
+
or a message indicating that no notes have been created yet.
|
|
191
|
+
"""
|
|
192
|
+
try:
|
|
193
|
+
# Reload registry to get latest state
|
|
194
|
+
self._load_registry()
|
|
195
|
+
if not self.registry:
|
|
196
|
+
return "No notes have been created yet."
|
|
197
|
+
|
|
198
|
+
notes_info = []
|
|
199
|
+
for note_name in self.registry:
|
|
200
|
+
note_path = self.working_directory / f"{note_name}.md"
|
|
201
|
+
if note_path.exists():
|
|
202
|
+
size = note_path.stat().st_size
|
|
203
|
+
notes_info.append(f"- {note_name}.md ({size} bytes)")
|
|
204
|
+
else:
|
|
205
|
+
notes_info.append(f"- {note_name}.md (file missing)")
|
|
206
|
+
|
|
207
|
+
return "Available notes:\n" + "\n".join(notes_info)
|
|
208
|
+
except Exception as e:
|
|
209
|
+
return f"Error listing notes: {e}"
|
|
210
|
+
|
|
211
|
+
def read_note(self, note_name: Optional[str] = "all_notes") -> str:
|
|
212
|
+
r"""Reads the content of a specific note or all notes.
|
|
213
|
+
|
|
214
|
+
You can use this function in two ways:
|
|
215
|
+
1. **Read a specific note:** Provide the `note_name` (without the .md
|
|
216
|
+
extension) to get the content of that single note.
|
|
217
|
+
2. **Read all notes:** Use `note_name="all_notes"` (default), and this
|
|
218
|
+
function will return the content of all your notes, concatenated
|
|
219
|
+
together.
|
|
220
|
+
|
|
221
|
+
Args:
|
|
222
|
+
note_name (str, optional): The name of the note you want to read.
|
|
223
|
+
Defaults to "all_notes" which reads all notes.
|
|
224
|
+
|
|
225
|
+
Returns:
|
|
226
|
+
str: The content of the specified note(s), or an error message if
|
|
227
|
+
a note cannot be read.
|
|
228
|
+
"""
|
|
229
|
+
try:
|
|
230
|
+
# Reload registry to get latest state
|
|
231
|
+
self._load_registry()
|
|
232
|
+
if note_name and note_name != "all_notes":
|
|
233
|
+
if note_name not in self.registry:
|
|
234
|
+
return (
|
|
235
|
+
f"Error: Note '{note_name}' is not registered "
|
|
236
|
+
f"or was not created by this toolkit."
|
|
237
|
+
)
|
|
238
|
+
note_path = self.working_directory / f"{note_name}.md"
|
|
239
|
+
if not note_path.exists():
|
|
240
|
+
return f"Note file '{note_path.name}' does not exist."
|
|
241
|
+
return note_path.read_text(encoding="utf-8")
|
|
242
|
+
else:
|
|
243
|
+
if not self.registry:
|
|
244
|
+
return "No notes have been created yet."
|
|
245
|
+
|
|
246
|
+
all_notes = []
|
|
247
|
+
for registered_note in self.registry:
|
|
248
|
+
note_path = (
|
|
249
|
+
self.working_directory / f"{registered_note}.md"
|
|
250
|
+
)
|
|
251
|
+
if note_path.exists():
|
|
252
|
+
content = note_path.read_text(encoding="utf-8")
|
|
253
|
+
all_notes.append(
|
|
254
|
+
f"=== {registered_note}.md ===\n{content}"
|
|
255
|
+
)
|
|
256
|
+
else:
|
|
257
|
+
all_notes.append(
|
|
258
|
+
f"=== {registered_note}.md ===\n[File not found]"
|
|
259
|
+
)
|
|
260
|
+
|
|
261
|
+
return "\n\n".join(all_notes)
|
|
262
|
+
except Exception as e:
|
|
263
|
+
return f"Error reading note: {e}"
|
|
264
|
+
|
|
265
|
+
def get_tools(self) -> List[FunctionTool]:
|
|
266
|
+
r"""Return a list of FunctionTool objects representing the functions
|
|
267
|
+
in the toolkit.
|
|
268
|
+
|
|
269
|
+
Returns:
|
|
270
|
+
List[FunctionTool]: A list of FunctionTool objects.
|
|
271
|
+
"""
|
|
272
|
+
return [
|
|
273
|
+
FunctionTool(self.append_note),
|
|
274
|
+
FunctionTool(self.read_note),
|
|
275
|
+
FunctionTool(self.create_note),
|
|
276
|
+
FunctionTool(self.list_note),
|
|
277
|
+
]
|