camel-ai 0.2.65__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 +4835 -947
- 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 +35 -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 +1 -3
- camel/benchmarks/mock_website/mock_web.py +2 -2
- camel/benchmarks/mock_website/requirements.txt +1 -1
- camel/benchmarks/mock_website/shopping_mall/app.py +2 -2
- camel/benchmarks/mock_website/task.json +1 -1
- 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 +23 -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 +2 -2
- 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 +2 -2
- camel/configs/cometapi_config.py +106 -0
- camel/configs/crynux_config.py +2 -2
- 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 +2 -2
- 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 +5 -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 +2 -2
- camel/configs/samba_config.py +6 -4
- 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_collectors/__init__.py +2 -2
- camel/data_collectors/alpaca_collector.py +18 -9
- camel/data_collectors/base.py +2 -2
- camel/data_collectors/sharegpt_collector.py +2 -2
- camel/datagen/__init__.py +2 -2
- camel/datagen/cot_datagen.py +3 -3
- camel/datagen/evol_instruct/__init__.py +2 -2
- camel/datagen/evol_instruct/evol_instruct.py +2 -2
- camel/datagen/evol_instruct/scorer.py +12 -12
- camel/datagen/evol_instruct/templates.py +16 -16
- 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 +2 -2
- camel/datasets/self_instruct_generator.py +2 -2
- camel/datasets/static_dataset.py +2 -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 +2 -2
- 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 +2 -2
- camel/embeddings/together_embedding.py +2 -2
- camel/embeddings/vlm_embedding.py +2 -2
- 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 +2 -2
- camel/interpreters/docker/Dockerfile +14 -24
- camel/interpreters/docker_interpreter.py +5 -4
- camel/interpreters/e2b_interpreter.py +36 -3
- camel/interpreters/internal_python_interpreter.py +53 -4
- camel/interpreters/interpreter_error.py +2 -2
- camel/interpreters/ipython_interpreter.py +2 -2
- camel/interpreters/microsandbox_interpreter.py +395 -0
- camel/interpreters/subprocess_interpreter.py +2 -2
- camel/loaders/__init__.py +13 -4
- 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 +11 -2
- 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 +2 -2
- 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 +125 -7
- 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 +90 -10
- camel/messages/__init__.py +2 -2
- camel/messages/base.py +178 -43
- 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 +16 -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 +212 -89
- 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 +16 -21
- camel/models/cometapi_model.py +83 -0
- camel/models/crynux_model.py +11 -18
- camel/models/deepseek_model.py +18 -58
- camel/models/fish_audio_model.py +8 -2
- camel/models/gemini_model.py +389 -26
- camel/models/groq_model.py +11 -19
- camel/models/internlm_model.py +11 -18
- camel/models/litellm_model.py +56 -34
- camel/models/lmstudio_model.py +17 -20
- camel/models/minimax_model.py +83 -0
- camel/models/mistral_model.py +18 -19
- camel/models/model_factory.py +37 -3
- camel/models/model_manager.py +26 -8
- 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 +188 -45
- camel/models/openai_model.py +216 -71
- 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 +21 -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 +48 -47
- camel/models/sglang_model.py +88 -40
- 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 +7 -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 +3 -2
- camel/retrievers/base.py +2 -2
- camel/retrievers/bm25_retriever.py +2 -2
- camel/retrievers/cohere_rerank_retriever.py +2 -2
- camel/retrievers/hybrid_retrival.py +2 -2
- camel/retrievers/vector_retriever.py +2 -2
- camel/runtimes/Dockerfile.multi-toolkit +90 -0
- camel/runtimes/__init__.py +2 -2
- camel/runtimes/api.py +79 -23
- camel/runtimes/base.py +2 -2
- camel/runtimes/configs.py +13 -13
- camel/runtimes/daytona_runtime.py +17 -18
- camel/runtimes/docker_runtime.py +12 -12
- camel/runtimes/llm_guard_runtime.py +26 -26
- camel/runtimes/remote_http_runtime.py +11 -11
- camel/runtimes/ubuntu_docker_runtime.py +2 -2
- camel/runtimes/utils/__init__.py +2 -2
- camel/runtimes/utils/function_risk_toolkit.py +2 -2
- camel/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 +2 -2
- camel/societies/workforce/events.py +143 -0
- camel/societies/workforce/prompts.py +258 -33
- camel/societies/workforce/role_playing_worker.py +88 -31
- camel/societies/workforce/single_agent_worker.py +638 -40
- camel/societies/workforce/structured_output_handler.py +512 -0
- camel/societies/workforce/task_channel.py +182 -38
- camel/societies/workforce/utils.py +780 -65
- camel/societies/workforce/worker.py +92 -26
- camel/societies/workforce/workflow_memory_manager.py +1746 -0
- camel/societies/workforce/workforce.py +5276 -355
- 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 +6 -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 +8 -2
- camel/storages/vectordb_storages/base.py +2 -2
- camel/storages/vectordb_storages/chroma.py +731 -0
- camel/storages/vectordb_storages/faiss.py +2 -2
- camel/storages/vectordb_storages/milvus.py +2 -2
- camel/storages/vectordb_storages/oceanbase.py +15 -15
- 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 +2 -2
- camel/tasks/__init__.py +2 -2
- camel/tasks/task.py +348 -26
- 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 +54 -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 +4 -4
- camel/toolkits/audio_analysis_toolkit.py +3 -3
- camel/toolkits/base.py +65 -7
- camel/toolkits/bohrium_toolkit.py +2 -2
- camel/toolkits/browser_toolkit.py +34 -21
- camel/toolkits/browser_toolkit_commons.py +4 -4
- camel/toolkits/code_execution.py +31 -4
- 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 +905 -71
- camel/toolkits/file_toolkit.py +1402 -0
- camel/toolkits/function_tool.py +126 -18
- camel/toolkits/github_toolkit.py +109 -22
- 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 -6
- camel/toolkits/image_generation_toolkit.py +390 -0
- camel/toolkits/jina_reranker_toolkit.py +5 -6
- 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 +412 -36
- 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 +53 -53
- camel/toolkits/playwright_mcp_toolkit.py +13 -31
- camel/toolkits/pptx_toolkit.py +36 -23
- 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 +5 -5
- 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 +2 -2
- camel/toolkits/vertex_ai_veo_toolkit.py +590 -0
- camel/toolkits/video_analysis_toolkit.py +109 -29
- camel/toolkits/video_download_toolkit.py +19 -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 +2 -2
- 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 +378 -39
- camel/types/mcp_registries.py +2 -2
- camel/types/openai_types.py +4 -4
- camel/types/unified_model_type.py +38 -6
- camel/utils/__init__.py +2 -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 +38 -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 +2 -2
- camel/utils/mcp.py +140 -6
- camel/utils/mcp_client.py +48 -38
- 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.65.dist-info → camel_ai-0.2.82.dist-info}/METADATA +327 -94
- camel_ai-0.2.82.dist-info/RECORD +507 -0
- {camel_ai-0.2.65.dist-info → camel_ai-0.2.82.dist-info}/WHEEL +1 -1
- {camel_ai-0.2.65.dist-info → camel_ai-0.2.82.dist-info}/licenses/LICENSE +1 -1
- camel/loaders/pandas_reader.py +0 -368
- camel/toolkits/dalle_toolkit.py +0 -175
- camel/toolkits/file_write_toolkit.py +0 -444
- camel/toolkits/openai_agent_toolkit.py +0 -135
- camel/toolkits/terminal_toolkit.py +0 -1037
- camel_ai-0.2.65.dist-info/RECORD +0 -426
camel/loaders/markitdown.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
|
import os
|
|
15
15
|
from concurrent.futures import ThreadPoolExecutor, as_completed
|
|
16
16
|
from typing import ClassVar, Dict, List, Optional
|
|
@@ -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 os
|
|
16
16
|
import time
|
camel/loaders/mistral_reader.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
|
import os
|
|
15
15
|
from typing import TYPE_CHECKING, List, Optional
|
|
16
16
|
|
|
@@ -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 os
|
|
16
16
|
from typing import Any, Dict, Optional
|
camel/loaders/unstructured_io.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
|
import traceback
|
|
15
15
|
import uuid
|
|
16
16
|
import warnings
|
camel/logger.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
|
|
|
16
16
|
import logging
|
|
@@ -36,8 +36,8 @@ def _configure_library_logging():
|
|
|
36
36
|
f"CAMEL library logging has been configured "
|
|
37
37
|
f"(level: {_logger.getEffectiveLevel()}). "
|
|
38
38
|
f"To change level, use set_log_level() or "
|
|
39
|
-
"set CAMEL_LOGGING_LEVEL env var. To disable logging, "
|
|
40
|
-
"set CAMEL_LOGGING_DISABLED=true or use disable_logging()"
|
|
39
|
+
f"set CAMEL_LOGGING_LEVEL env var. To disable logging, "
|
|
40
|
+
f"set CAMEL_LOGGING_DISABLED=true or use disable_logging()"
|
|
41
41
|
)
|
|
42
42
|
else:
|
|
43
43
|
_logger.debug("Existing logger configuration found, using that.")
|
|
@@ -155,7 +155,7 @@ def set_log_level(level):
|
|
|
155
155
|
_logger.debug(f"Logging level set to: {logging.getLevelName(level)}")
|
|
156
156
|
|
|
157
157
|
|
|
158
|
-
def get_logger(name):
|
|
158
|
+
def get_logger(name: str):
|
|
159
159
|
r"""Get a logger with the specified name, prefixed with 'camel.'.
|
|
160
160
|
|
|
161
161
|
|
camel/memories/__init__.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 .agent_memories import (
|
|
16
16
|
ChatHistoryMemory,
|
camel/memories/agent_memories.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
|
import warnings
|
|
16
16
|
from typing import List, Optional
|
|
@@ -51,7 +51,9 @@ class ChatHistoryMemory(AgentMemory):
|
|
|
51
51
|
raise ValueError("`window_size` must be non-negative.")
|
|
52
52
|
self._context_creator = context_creator
|
|
53
53
|
self._window_size = window_size
|
|
54
|
-
self._chat_history_block = ChatHistoryBlock(
|
|
54
|
+
self._chat_history_block = ChatHistoryBlock(
|
|
55
|
+
storage=storage,
|
|
56
|
+
)
|
|
55
57
|
self._agent_id = agent_id
|
|
56
58
|
|
|
57
59
|
@property
|
|
@@ -88,6 +90,63 @@ class ChatHistoryMemory(AgentMemory):
|
|
|
88
90
|
def clear(self) -> None:
|
|
89
91
|
self._chat_history_block.clear()
|
|
90
92
|
|
|
93
|
+
def clean_tool_calls(self) -> None:
|
|
94
|
+
r"""Removes tool call messages from memory.
|
|
95
|
+
This method removes all FUNCTION/TOOL role messages and any ASSISTANT
|
|
96
|
+
messages that contain tool_calls in their meta_dict to save token
|
|
97
|
+
usage.
|
|
98
|
+
"""
|
|
99
|
+
from camel.types import OpenAIBackendRole
|
|
100
|
+
|
|
101
|
+
# Get all messages from storage
|
|
102
|
+
record_dicts = self._chat_history_block.storage.load()
|
|
103
|
+
if not record_dicts:
|
|
104
|
+
return
|
|
105
|
+
|
|
106
|
+
# Track indices to remove (reverse order for efficient deletion)
|
|
107
|
+
indices_to_remove = []
|
|
108
|
+
|
|
109
|
+
# Identify indices of tool-related messages
|
|
110
|
+
for i, record in enumerate(record_dicts):
|
|
111
|
+
role = record.get('role_at_backend')
|
|
112
|
+
|
|
113
|
+
# Mark FUNCTION messages for removal
|
|
114
|
+
if role == OpenAIBackendRole.FUNCTION.value:
|
|
115
|
+
indices_to_remove.append(i)
|
|
116
|
+
# Mark TOOL messages for removal
|
|
117
|
+
elif role == OpenAIBackendRole.TOOL.value:
|
|
118
|
+
indices_to_remove.append(i)
|
|
119
|
+
# Mark ASSISTANT messages with tool_calls for removal
|
|
120
|
+
elif role == OpenAIBackendRole.ASSISTANT.value:
|
|
121
|
+
message_dict = record.get('message', {})
|
|
122
|
+
# Check for tool_calls in message
|
|
123
|
+
has_tool_calls = 'tool_calls' in message_dict
|
|
124
|
+
is_func_calling = (
|
|
125
|
+
message_dict.get('__class__') == 'FunctionCallingMessage'
|
|
126
|
+
and 'args' in message_dict
|
|
127
|
+
)
|
|
128
|
+
|
|
129
|
+
if has_tool_calls or is_func_calling:
|
|
130
|
+
indices_to_remove.append(i)
|
|
131
|
+
|
|
132
|
+
# Remove records in-place
|
|
133
|
+
for i in reversed(indices_to_remove):
|
|
134
|
+
del record_dicts[i]
|
|
135
|
+
|
|
136
|
+
# Clear storage and save the modified records back
|
|
137
|
+
self._chat_history_block.storage.clear()
|
|
138
|
+
self._chat_history_block.storage.save(record_dicts)
|
|
139
|
+
|
|
140
|
+
def pop_records(self, count: int) -> List[MemoryRecord]:
|
|
141
|
+
r"""Removes the most recent records from chat history memory."""
|
|
142
|
+
return self._chat_history_block.pop_records(count)
|
|
143
|
+
|
|
144
|
+
def remove_records_by_indices(
|
|
145
|
+
self, indices: List[int]
|
|
146
|
+
) -> List[MemoryRecord]:
|
|
147
|
+
r"""Removes records at specified indices from chat history memory."""
|
|
148
|
+
return self._chat_history_block.remove_records_by_indices(indices)
|
|
149
|
+
|
|
91
150
|
|
|
92
151
|
class VectorDBMemory(AgentMemory):
|
|
93
152
|
r"""An agent memory wrapper of :obj:`VectorDBBlock`. This memory queries
|
|
@@ -152,6 +211,20 @@ class VectorDBMemory(AgentMemory):
|
|
|
152
211
|
r"""Removes all records from the vector database memory."""
|
|
153
212
|
self._vectordb_block.clear()
|
|
154
213
|
|
|
214
|
+
def pop_records(self, count: int) -> List[MemoryRecord]:
|
|
215
|
+
r"""Rolling back is unsupported for vector database memory."""
|
|
216
|
+
raise NotImplementedError(
|
|
217
|
+
"VectorDBMemory does not support removing historical records."
|
|
218
|
+
)
|
|
219
|
+
|
|
220
|
+
def remove_records_by_indices(
|
|
221
|
+
self, indices: List[int]
|
|
222
|
+
) -> List[MemoryRecord]:
|
|
223
|
+
r"""Removing by indices is unsupported for vector database memory."""
|
|
224
|
+
raise NotImplementedError(
|
|
225
|
+
"VectorDBMemory does not support removing records by indices."
|
|
226
|
+
)
|
|
227
|
+
|
|
155
228
|
|
|
156
229
|
class LongtermAgentMemory(AgentMemory):
|
|
157
230
|
r"""An implementation of the :obj:`AgentMemory` abstract base class for
|
|
@@ -236,3 +309,13 @@ class LongtermAgentMemory(AgentMemory):
|
|
|
236
309
|
r"""Removes all records from the memory."""
|
|
237
310
|
self.chat_history_block.clear()
|
|
238
311
|
self.vector_db_block.clear()
|
|
312
|
+
|
|
313
|
+
def pop_records(self, count: int) -> List[MemoryRecord]:
|
|
314
|
+
r"""Removes recent chat history records while leaving vector memory."""
|
|
315
|
+
return self.chat_history_block.pop_records(count)
|
|
316
|
+
|
|
317
|
+
def remove_records_by_indices(
|
|
318
|
+
self, indices: List[int]
|
|
319
|
+
) -> List[MemoryRecord]:
|
|
320
|
+
r"""Removes records at specified indices from chat history."""
|
|
321
|
+
return self.chat_history_block.remove_records_by_indices(indices)
|
camel/memories/base.py
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
# ========= Copyright 2023-
|
|
1
|
+
# ========= Copyright 2023-2025 @ CAMEL-AI.org. All Rights Reserved. =========
|
|
2
2
|
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
3
3
|
# you may not use this file except in compliance with the License.
|
|
4
4
|
# You may obtain a copy of the License at
|
|
@@ -10,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 abc import ABC, abstractmethod
|
|
16
16
|
from typing import List, Optional, Tuple
|
|
@@ -45,6 +45,32 @@ class MemoryBlock(ABC):
|
|
|
45
45
|
"""
|
|
46
46
|
self.write_records([record])
|
|
47
47
|
|
|
48
|
+
def pop_records(self, count: int) -> List[MemoryRecord]:
|
|
49
|
+
r"""Removes records from the memory and returns the removed records.
|
|
50
|
+
|
|
51
|
+
Args:
|
|
52
|
+
count (int): Number of records to remove.
|
|
53
|
+
|
|
54
|
+
Returns:
|
|
55
|
+
List[MemoryRecord]: The records that were removed from the memory
|
|
56
|
+
in their original order.
|
|
57
|
+
"""
|
|
58
|
+
raise NotImplementedError
|
|
59
|
+
|
|
60
|
+
def remove_records_by_indices(
|
|
61
|
+
self, indices: List[int]
|
|
62
|
+
) -> List[MemoryRecord]:
|
|
63
|
+
r"""Removes records at specified indices from the memory.
|
|
64
|
+
|
|
65
|
+
Args:
|
|
66
|
+
indices (List[int]): List of indices to remove. Indices should be
|
|
67
|
+
valid positions in the current record list.
|
|
68
|
+
|
|
69
|
+
Returns:
|
|
70
|
+
List[MemoryRecord]: The removed records in their original order.
|
|
71
|
+
"""
|
|
72
|
+
raise NotImplementedError
|
|
73
|
+
|
|
48
74
|
@abstractmethod
|
|
49
75
|
def clear(self) -> None:
|
|
50
76
|
r"""Clears all messages from the memory."""
|
|
@@ -149,6 +175,14 @@ class AgentMemory(MemoryBlock, ABC):
|
|
|
149
175
|
"""
|
|
150
176
|
return self.get_context_creator().create_context(self.retrieve())
|
|
151
177
|
|
|
178
|
+
def clean_tool_calls(self) -> None:
|
|
179
|
+
r"""Removes tool call messages from memory.
|
|
180
|
+
This is an optional method that can be overridden by subclasses
|
|
181
|
+
to implement cleaning of tool-related messages. By default, it
|
|
182
|
+
does nothing, maintaining backward compatibility.
|
|
183
|
+
"""
|
|
184
|
+
pass
|
|
185
|
+
|
|
152
186
|
def __repr__(self) -> str:
|
|
153
187
|
r"""Returns a string representation of the AgentMemory.
|
|
154
188
|
|
|
@@ -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 .chat_history_block import ChatHistoryBlock
|
|
16
16
|
from .vectordb_block import VectorDBBlock
|
|
@@ -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,8 +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-
|
|
14
|
-
import warnings
|
|
13
|
+
# ========= Copyright 2023-2025 @ CAMEL-AI.org. All Rights Reserved. =========
|
|
15
14
|
from typing import List, Optional
|
|
16
15
|
|
|
17
16
|
from camel.memories.base import MemoryBlock
|
|
@@ -39,7 +38,7 @@ class ChatHistoryBlock(MemoryBlock):
|
|
|
39
38
|
last message is 1.0, and with each step taken backward, the score
|
|
40
39
|
of the message is multiplied by the `keep_rate`. Higher `keep_rate`
|
|
41
40
|
leads to high possibility to keep history messages during context
|
|
42
|
-
creation.
|
|
41
|
+
creation. (default: :obj:`0.9`)
|
|
43
42
|
"""
|
|
44
43
|
|
|
45
44
|
def __init__(
|
|
@@ -70,7 +69,8 @@ class ChatHistoryBlock(MemoryBlock):
|
|
|
70
69
|
"""
|
|
71
70
|
record_dicts = self.storage.load()
|
|
72
71
|
if len(record_dicts) == 0:
|
|
73
|
-
|
|
72
|
+
# Empty memory is a valid state (e.g., during initialization).
|
|
73
|
+
# Users can check if memory is empty by checking the returned list.
|
|
74
74
|
return list()
|
|
75
75
|
|
|
76
76
|
if window_size is not None and window_size >= 0:
|
|
@@ -81,7 +81,10 @@ class ChatHistoryBlock(MemoryBlock):
|
|
|
81
81
|
if (
|
|
82
82
|
record_dicts
|
|
83
83
|
and record_dicts[0]['role_at_backend']
|
|
84
|
-
in {
|
|
84
|
+
in {
|
|
85
|
+
OpenAIBackendRole.SYSTEM.value,
|
|
86
|
+
OpenAIBackendRole.DEVELOPER.value,
|
|
87
|
+
}
|
|
85
88
|
)
|
|
86
89
|
else 0
|
|
87
90
|
)
|
|
@@ -90,7 +93,7 @@ class ChatHistoryBlock(MemoryBlock):
|
|
|
90
93
|
Message Processing Logic:
|
|
91
94
|
1. Preserve first system/developer message (if needed)
|
|
92
95
|
2. Keep latest window_size messages from the rest
|
|
93
|
-
|
|
96
|
+
|
|
94
97
|
Examples:
|
|
95
98
|
- Case 1: First message is SYSTEM, total 5 messages, window_size=2
|
|
96
99
|
Input: [system_msg, user_msg1, user_msg2, user_msg3, user_msg4]
|
|
@@ -164,3 +167,118 @@ class ChatHistoryBlock(MemoryBlock):
|
|
|
164
167
|
def clear(self) -> None:
|
|
165
168
|
r"""Clears all chat messages from the memory."""
|
|
166
169
|
self.storage.clear()
|
|
170
|
+
|
|
171
|
+
def pop_records(self, count: int) -> List[MemoryRecord]:
|
|
172
|
+
r"""Removes the most recent records from the memory.
|
|
173
|
+
|
|
174
|
+
Args:
|
|
175
|
+
count (int): Number of records to remove from the end of the
|
|
176
|
+
conversation history. A value of 0 results in no changes.
|
|
177
|
+
|
|
178
|
+
Returns:
|
|
179
|
+
List[MemoryRecord]: The removed records in chronological order.
|
|
180
|
+
"""
|
|
181
|
+
if not isinstance(count, int):
|
|
182
|
+
raise TypeError("`count` must be an integer.")
|
|
183
|
+
if count < 0:
|
|
184
|
+
raise ValueError("`count` must be non-negative.")
|
|
185
|
+
if count == 0:
|
|
186
|
+
return []
|
|
187
|
+
|
|
188
|
+
record_dicts = self.storage.load()
|
|
189
|
+
if not record_dicts:
|
|
190
|
+
return []
|
|
191
|
+
|
|
192
|
+
# Preserve initial system/developer instruction if present.
|
|
193
|
+
protected_prefix = (
|
|
194
|
+
1
|
|
195
|
+
if (
|
|
196
|
+
record_dicts
|
|
197
|
+
and record_dicts[0]['role_at_backend']
|
|
198
|
+
in {
|
|
199
|
+
OpenAIBackendRole.SYSTEM.value,
|
|
200
|
+
OpenAIBackendRole.DEVELOPER.value,
|
|
201
|
+
}
|
|
202
|
+
)
|
|
203
|
+
else 0
|
|
204
|
+
)
|
|
205
|
+
|
|
206
|
+
removable_count = max(len(record_dicts) - protected_prefix, 0)
|
|
207
|
+
if removable_count == 0:
|
|
208
|
+
return []
|
|
209
|
+
|
|
210
|
+
pop_count = min(count, removable_count)
|
|
211
|
+
split_index = len(record_dicts) - pop_count
|
|
212
|
+
|
|
213
|
+
popped_dicts = record_dicts[split_index:]
|
|
214
|
+
remaining_dicts = record_dicts[:split_index]
|
|
215
|
+
|
|
216
|
+
self.storage.clear()
|
|
217
|
+
if remaining_dicts:
|
|
218
|
+
self.storage.save(remaining_dicts)
|
|
219
|
+
|
|
220
|
+
return [MemoryRecord.from_dict(record) for record in popped_dicts]
|
|
221
|
+
|
|
222
|
+
def remove_records_by_indices(
|
|
223
|
+
self, indices: List[int]
|
|
224
|
+
) -> List[MemoryRecord]:
|
|
225
|
+
r"""Removes records at specified indices from the memory.
|
|
226
|
+
|
|
227
|
+
Args:
|
|
228
|
+
indices (List[int]): List of indices to remove. Indices are
|
|
229
|
+
positions in the current record list (0-based).
|
|
230
|
+
System/developer messages at index 0 are protected and will
|
|
231
|
+
not be removed.
|
|
232
|
+
|
|
233
|
+
Returns:
|
|
234
|
+
List[MemoryRecord]: The removed records in their original order.
|
|
235
|
+
"""
|
|
236
|
+
if not indices:
|
|
237
|
+
return []
|
|
238
|
+
|
|
239
|
+
record_dicts = self.storage.load()
|
|
240
|
+
if not record_dicts:
|
|
241
|
+
return []
|
|
242
|
+
|
|
243
|
+
# Preserve initial system/developer instruction if present.
|
|
244
|
+
protected_prefix = (
|
|
245
|
+
1
|
|
246
|
+
if (
|
|
247
|
+
record_dicts
|
|
248
|
+
and record_dicts[0]['role_at_backend']
|
|
249
|
+
in {
|
|
250
|
+
OpenAIBackendRole.SYSTEM.value,
|
|
251
|
+
OpenAIBackendRole.DEVELOPER.value,
|
|
252
|
+
}
|
|
253
|
+
)
|
|
254
|
+
else 0
|
|
255
|
+
)
|
|
256
|
+
|
|
257
|
+
# Filter out protected indices and invalid ones
|
|
258
|
+
valid_indices = sorted(
|
|
259
|
+
{
|
|
260
|
+
idx
|
|
261
|
+
for idx in indices
|
|
262
|
+
if idx >= protected_prefix and idx < len(record_dicts)
|
|
263
|
+
}
|
|
264
|
+
)
|
|
265
|
+
|
|
266
|
+
if not valid_indices:
|
|
267
|
+
return []
|
|
268
|
+
|
|
269
|
+
# Extract records to remove (in original order)
|
|
270
|
+
removed_records = [record_dicts[idx] for idx in valid_indices]
|
|
271
|
+
|
|
272
|
+
# Build remaining records by excluding removed indices
|
|
273
|
+
remaining_dicts = [
|
|
274
|
+
record
|
|
275
|
+
for idx, record in enumerate(record_dicts)
|
|
276
|
+
if idx not in valid_indices
|
|
277
|
+
]
|
|
278
|
+
|
|
279
|
+
# Save back to storage
|
|
280
|
+
self.storage.clear()
|
|
281
|
+
if remaining_dicts:
|
|
282
|
+
self.storage.save(remaining_dicts)
|
|
283
|
+
|
|
284
|
+
return [MemoryRecord.from_dict(record) for record in removed_records]
|
|
@@ -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 List, Optional
|
|
16
16
|
|
|
@@ -89,13 +89,20 @@ class VectorDBBlock(MemoryBlock):
|
|
|
89
89
|
records (List[MemoryRecord]): Memory records to be added to the
|
|
90
90
|
memory.
|
|
91
91
|
"""
|
|
92
|
+
# Filter out records with empty message content
|
|
93
|
+
valid_records = [
|
|
94
|
+
record
|
|
95
|
+
for record in records
|
|
96
|
+
if record.message.content and record.message.content.strip()
|
|
97
|
+
]
|
|
98
|
+
|
|
92
99
|
v_records = [
|
|
93
100
|
VectorRecord(
|
|
94
101
|
vector=self.embedding.embed(record.message.content),
|
|
95
102
|
payload=record.to_dict(),
|
|
96
103
|
id=str(record.uuid),
|
|
97
104
|
)
|
|
98
|
-
for record in
|
|
105
|
+
for record in valid_records
|
|
99
106
|
]
|
|
100
107
|
self.storage.add(v_records)
|
|
101
108
|
|
|
@@ -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 .score_based import ScoreBasedContextCreator
|
|
16
16
|
|