camel-ai 0.2.59__py3-none-any.whl → 0.2.82__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Potentially problematic release.
This version of camel-ai might be problematic. Click here for more details.
- camel/__init__.py +3 -3
- camel/agents/__init__.py +2 -2
- camel/agents/_types.py +9 -4
- camel/agents/_utils.py +40 -2
- camel/agents/base.py +2 -2
- camel/agents/chat_agent.py +5012 -902
- camel/agents/critic_agent.py +2 -2
- camel/agents/deductive_reasoner_agent.py +56 -56
- camel/agents/embodied_agent.py +2 -2
- camel/agents/knowledge_graph_agent.py +20 -20
- camel/agents/mcp_agent.py +39 -36
- camel/agents/multi_hop_generator_agent.py +3 -3
- camel/agents/programmed_agent_instruction.py +2 -2
- camel/agents/repo_agent.py +4 -3
- camel/agents/role_assignment_agent.py +2 -2
- camel/agents/search_agent.py +2 -2
- camel/agents/task_agent.py +2 -2
- camel/agents/tool_agents/__init__.py +2 -2
- camel/agents/tool_agents/base.py +2 -2
- camel/agents/tool_agents/hugging_face_tool_agent.py +3 -3
- camel/benchmarks/__init__.py +2 -2
- camel/benchmarks/apibank.py +5 -5
- camel/benchmarks/apibench.py +2 -2
- camel/benchmarks/base.py +2 -2
- camel/benchmarks/browsecomp.py +44 -33
- camel/benchmarks/gaia.py +17 -13
- camel/benchmarks/mock_website/README.md +94 -0
- camel/benchmarks/mock_website/mock_web.py +299 -0
- camel/benchmarks/mock_website/requirements.txt +3 -0
- camel/benchmarks/mock_website/shopping_mall/app.py +465 -0
- camel/benchmarks/mock_website/task.json +104 -0
- camel/benchmarks/nexus.py +3 -3
- camel/benchmarks/ragbench.py +2 -2
- camel/bots/__init__.py +2 -2
- camel/bots/discord/__init__.py +2 -2
- camel/bots/discord/discord_app.py +2 -2
- camel/bots/discord/discord_installation.py +2 -2
- camel/bots/discord/discord_store.py +3 -3
- camel/bots/slack/__init__.py +2 -2
- camel/bots/slack/models.py +4 -4
- camel/bots/slack/slack_app.py +2 -2
- camel/bots/telegram_bot.py +2 -2
- camel/configs/__init__.py +26 -2
- camel/configs/aihubmix_config.py +90 -0
- camel/configs/aiml_config.py +2 -2
- camel/configs/amd_config.py +70 -0
- camel/configs/anthropic_config.py +8 -7
- camel/configs/base_config.py +2 -2
- camel/configs/bedrock_config.py +5 -3
- camel/configs/cerebras_config.py +98 -0
- camel/configs/cohere_config.py +3 -3
- camel/configs/cometapi_config.py +106 -0
- camel/configs/crynux_config.py +94 -0
- camel/configs/deepseek_config.py +9 -8
- camel/configs/gemini_config.py +6 -4
- camel/configs/groq_config.py +6 -4
- camel/configs/internlm_config.py +6 -4
- camel/configs/litellm_config.py +2 -2
- camel/configs/lmstudio_config.py +6 -4
- camel/configs/minimax_config.py +95 -0
- camel/configs/mistral_config.py +3 -3
- camel/configs/modelscope_config.py +5 -3
- camel/configs/moonshot_config.py +2 -2
- camel/configs/nebius_config.py +105 -0
- camel/configs/netmind_config.py +2 -2
- camel/configs/novita_config.py +2 -2
- camel/configs/nvidia_config.py +2 -2
- camel/configs/ollama_config.py +2 -2
- camel/configs/openai_config.py +8 -3
- camel/configs/openrouter_config.py +6 -4
- camel/configs/ppio_config.py +2 -2
- camel/configs/qianfan_config.py +85 -0
- camel/configs/qwen_config.py +2 -2
- camel/configs/reka_config.py +3 -3
- camel/configs/samba_config.py +8 -6
- camel/configs/sglang_config.py +2 -2
- camel/configs/siliconflow_config.py +2 -2
- camel/configs/togetherai_config.py +2 -2
- camel/configs/vllm_config.py +4 -2
- camel/configs/watsonx_config.py +2 -2
- camel/configs/yi_config.py +6 -4
- camel/configs/zhipuai_config.py +6 -4
- camel/{data_collector → data_collectors}/__init__.py +2 -2
- camel/{data_collector → data_collectors}/alpaca_collector.py +19 -10
- camel/{data_collector → data_collectors}/base.py +2 -2
- camel/{data_collector → data_collectors}/sharegpt_collector.py +3 -3
- camel/datagen/__init__.py +2 -2
- camel/datagen/cot_datagen.py +32 -37
- camel/datagen/evol_instruct/__init__.py +2 -2
- camel/datagen/evol_instruct/evol_instruct.py +2 -2
- camel/datagen/evol_instruct/scorer.py +24 -25
- camel/datagen/evol_instruct/templates.py +48 -48
- camel/datagen/self_improving_cot.py +5 -5
- camel/datagen/self_instruct/__init__.py +2 -2
- camel/datagen/self_instruct/filter/__init__.py +2 -2
- camel/datagen/self_instruct/filter/filter_function.py +2 -2
- camel/datagen/self_instruct/filter/filter_registry.py +2 -2
- camel/datagen/self_instruct/filter/instruction_filter.py +2 -2
- camel/datagen/self_instruct/self_instruct.py +2 -2
- camel/datagen/self_instruct/templates.py +47 -47
- camel/datagen/source2synth/__init__.py +2 -2
- camel/datagen/source2synth/data_processor.py +2 -2
- camel/datagen/source2synth/models.py +2 -2
- camel/datagen/source2synth/user_data_processor_config.py +2 -2
- camel/datahubs/__init__.py +2 -2
- camel/datahubs/base.py +2 -2
- camel/datahubs/huggingface.py +2 -2
- camel/datahubs/models.py +2 -2
- camel/datasets/__init__.py +2 -2
- camel/datasets/base_generator.py +41 -12
- camel/datasets/few_shot_generator.py +18 -18
- camel/datasets/models.py +3 -3
- camel/datasets/self_instruct_generator.py +2 -2
- camel/datasets/static_dataset.py +152 -2
- camel/embeddings/__init__.py +2 -2
- camel/embeddings/azure_embedding.py +2 -2
- camel/embeddings/base.py +2 -2
- camel/embeddings/gemini_embedding.py +2 -2
- camel/embeddings/jina_embedding.py +10 -3
- camel/embeddings/mistral_embedding.py +2 -2
- camel/embeddings/openai_compatible_embedding.py +2 -2
- camel/embeddings/openai_embedding.py +2 -2
- camel/embeddings/sentence_transformers_embeddings.py +4 -4
- camel/embeddings/together_embedding.py +2 -2
- camel/embeddings/vlm_embedding.py +11 -4
- camel/environments/__init__.py +14 -2
- camel/environments/models.py +2 -2
- camel/environments/multi_step.py +2 -2
- camel/environments/rlcards_env.py +860 -0
- camel/environments/single_step.py +30 -5
- camel/environments/tic_tac_toe.py +3 -3
- camel/extractors/__init__.py +2 -2
- camel/extractors/base.py +2 -2
- camel/extractors/python_strategies.py +2 -2
- camel/generators.py +2 -2
- camel/human.py +2 -2
- camel/interpreters/__init__.py +4 -2
- camel/interpreters/base.py +16 -3
- camel/interpreters/docker/Dockerfile +53 -7
- camel/interpreters/docker_interpreter.py +70 -11
- camel/interpreters/e2b_interpreter.py +59 -11
- camel/interpreters/internal_python_interpreter.py +81 -4
- camel/interpreters/interpreter_error.py +2 -2
- camel/interpreters/ipython_interpreter.py +23 -5
- camel/interpreters/microsandbox_interpreter.py +395 -0
- camel/interpreters/subprocess_interpreter.py +36 -4
- camel/loaders/__init__.py +17 -5
- camel/loaders/apify_reader.py +2 -2
- camel/loaders/base_io.py +2 -2
- camel/loaders/base_loader.py +85 -0
- camel/loaders/chunkr_reader.py +128 -93
- camel/loaders/crawl4ai_reader.py +2 -2
- camel/loaders/firecrawl_reader.py +6 -6
- camel/loaders/jina_url_reader.py +2 -2
- camel/loaders/markitdown.py +2 -2
- camel/loaders/mineru_extractor.py +2 -2
- camel/loaders/mistral_reader.py +148 -0
- camel/loaders/scrapegraph_reader.py +2 -2
- camel/loaders/unstructured_io.py +2 -2
- camel/logger.py +5 -5
- camel/memories/__init__.py +2 -2
- camel/memories/agent_memories.py +86 -3
- camel/memories/base.py +36 -2
- camel/memories/blocks/__init__.py +2 -2
- camel/memories/blocks/chat_history_block.py +126 -9
- camel/memories/blocks/vectordb_block.py +10 -3
- camel/memories/context_creators/__init__.py +2 -2
- camel/memories/context_creators/score_based.py +31 -239
- camel/memories/records.py +98 -13
- camel/messages/__init__.py +2 -2
- camel/messages/base.py +193 -46
- camel/messages/conversion/__init__.py +2 -2
- camel/messages/conversion/alpaca.py +2 -2
- camel/messages/conversion/conversation_models.py +2 -2
- camel/messages/conversion/sharegpt/__init__.py +2 -2
- camel/messages/conversion/sharegpt/function_call_formatter.py +2 -2
- camel/messages/conversion/sharegpt/hermes/__init__.py +2 -2
- camel/messages/conversion/sharegpt/hermes/hermes_function_formatter.py +2 -2
- camel/messages/func_message.py +54 -17
- camel/models/__init__.py +18 -2
- camel/models/_utils.py +3 -3
- camel/models/aihubmix_model.py +83 -0
- camel/models/aiml_model.py +11 -18
- camel/models/amd_model.py +101 -0
- camel/models/anthropic_model.py +127 -20
- camel/models/aws_bedrock_model.py +12 -35
- camel/models/azure_openai_model.py +263 -63
- camel/models/base_audio_model.py +5 -3
- camel/models/base_model.py +195 -26
- camel/models/cerebras_model.py +83 -0
- camel/models/cohere_model.py +81 -21
- camel/models/cometapi_model.py +83 -0
- camel/models/crynux_model.py +87 -0
- camel/models/deepseek_model.py +61 -59
- camel/models/fish_audio_model.py +8 -2
- camel/models/gemini_model.py +439 -30
- camel/models/groq_model.py +11 -19
- camel/models/internlm_model.py +11 -18
- camel/models/litellm_model.py +94 -34
- camel/models/lmstudio_model.py +17 -20
- camel/models/minimax_model.py +83 -0
- camel/models/mistral_model.py +84 -19
- camel/models/model_factory.py +49 -6
- camel/models/model_manager.py +33 -11
- camel/models/modelscope_model.py +13 -193
- camel/models/moonshot_model.py +195 -21
- camel/models/nebius_model.py +83 -0
- camel/models/nemotron_model.py +19 -9
- camel/models/netmind_model.py +11 -18
- camel/models/novita_model.py +11 -18
- camel/models/nvidia_model.py +11 -18
- camel/models/ollama_model.py +14 -21
- camel/models/openai_audio_models.py +2 -2
- camel/models/openai_compatible_model.py +234 -27
- camel/models/openai_model.py +255 -39
- camel/models/openrouter_model.py +11 -19
- camel/models/ppio_model.py +11 -18
- camel/models/qianfan_model.py +89 -0
- camel/models/qwen_model.py +13 -193
- camel/models/reka_model.py +90 -21
- camel/models/reward/__init__.py +2 -2
- camel/models/reward/base_reward_model.py +2 -2
- camel/models/reward/evaluator.py +2 -2
- camel/models/reward/nemotron_model.py +2 -2
- camel/models/reward/skywork_model.py +2 -2
- camel/models/samba_model.py +117 -49
- camel/models/sglang_model.py +162 -42
- camel/models/siliconflow_model.py +12 -35
- camel/models/stub_model.py +10 -7
- camel/models/togetherai_model.py +11 -18
- camel/models/vllm_model.py +10 -18
- camel/models/volcano_model.py +16 -20
- camel/models/watsonx_model.py +69 -19
- camel/models/yi_model.py +11 -18
- camel/models/zhipuai_model.py +70 -18
- camel/parsers/__init__.py +18 -0
- camel/parsers/mcp_tool_call_parser.py +176 -0
- camel/personas/__init__.py +2 -2
- camel/personas/persona.py +2 -2
- camel/personas/persona_hub.py +2 -2
- camel/prompts/__init__.py +2 -2
- camel/prompts/ai_society.py +2 -2
- camel/prompts/base.py +2 -2
- camel/prompts/code.py +2 -2
- camel/prompts/evaluation.py +2 -2
- camel/prompts/generate_text_embedding_data.py +2 -2
- camel/prompts/image_craft.py +2 -2
- camel/prompts/misalignment.py +2 -2
- camel/prompts/multi_condition_image_craft.py +2 -2
- camel/prompts/object_recognition.py +2 -2
- camel/prompts/persona_hub.py +3 -3
- camel/prompts/prompt_templates.py +2 -2
- camel/prompts/role_description_prompt_template.py +2 -2
- camel/prompts/solution_extraction.py +8 -8
- camel/prompts/task_prompt_template.py +2 -2
- camel/prompts/translation.py +2 -2
- camel/prompts/video_description_prompt.py +3 -3
- camel/responses/__init__.py +2 -2
- camel/responses/agent_responses.py +2 -2
- camel/retrievers/__init__.py +2 -2
- camel/retrievers/auto_retriever.py +23 -3
- camel/retrievers/base.py +2 -2
- camel/retrievers/bm25_retriever.py +3 -4
- camel/retrievers/cohere_rerank_retriever.py +2 -2
- camel/retrievers/hybrid_retrival.py +4 -4
- camel/retrievers/vector_retriever.py +2 -2
- camel/runtimes/Dockerfile.multi-toolkit +90 -0
- camel/{runtime → runtimes}/__init__.py +2 -2
- camel/runtimes/api.py +153 -0
- camel/{runtime → runtimes}/base.py +2 -2
- camel/{runtime → runtimes}/configs.py +13 -13
- camel/{runtime → runtimes}/daytona_runtime.py +18 -19
- camel/{runtime → runtimes}/docker_runtime.py +13 -13
- camel/{runtime → runtimes}/llm_guard_runtime.py +28 -28
- camel/{runtime → runtimes}/remote_http_runtime.py +12 -12
- camel/{runtime → runtimes}/ubuntu_docker_runtime.py +3 -3
- camel/{runtime → runtimes}/utils/__init__.py +2 -2
- camel/{runtime → runtimes}/utils/function_risk_toolkit.py +2 -2
- camel/{runtime → runtimes}/utils/ignore_risk_toolkit.py +2 -2
- camel/schemas/__init__.py +2 -2
- camel/schemas/base.py +2 -2
- camel/schemas/openai_converter.py +3 -3
- camel/schemas/outlines_converter.py +2 -2
- camel/services/agent_openapi_server.py +380 -0
- camel/societies/__init__.py +4 -2
- camel/societies/babyagi_playing.py +2 -2
- camel/societies/role_playing.py +201 -80
- camel/societies/workforce/__init__.py +10 -3
- camel/societies/workforce/base.py +9 -5
- camel/societies/workforce/events.py +143 -0
- camel/societies/workforce/prompts.py +258 -33
- camel/societies/workforce/role_playing_worker.py +95 -30
- camel/societies/workforce/single_agent_worker.py +659 -30
- camel/societies/workforce/structured_output_handler.py +512 -0
- camel/societies/workforce/task_channel.py +182 -38
- camel/societies/workforce/utils.py +784 -18
- camel/societies/workforce/worker.py +96 -28
- camel/societies/workforce/workflow_memory_manager.py +1746 -0
- camel/societies/workforce/workforce.py +5730 -366
- camel/societies/workforce/workforce_callback.py +103 -0
- camel/societies/workforce/workforce_logger.py +647 -0
- camel/societies/workforce/workforce_metrics.py +33 -0
- camel/storages/__init__.py +10 -2
- camel/storages/graph_storages/__init__.py +2 -2
- camel/storages/graph_storages/base.py +2 -2
- camel/storages/graph_storages/graph_element.py +2 -2
- camel/storages/graph_storages/nebula_graph.py +4 -4
- camel/storages/graph_storages/neo4j_graph.py +7 -7
- camel/storages/key_value_storages/__init__.py +2 -2
- camel/storages/key_value_storages/base.py +2 -2
- camel/storages/key_value_storages/in_memory.py +2 -2
- camel/storages/key_value_storages/json.py +17 -4
- camel/storages/key_value_storages/mem0_cloud.py +50 -49
- camel/storages/key_value_storages/redis.py +2 -2
- camel/storages/object_storages/__init__.py +2 -2
- camel/storages/object_storages/amazon_s3.py +2 -2
- camel/storages/object_storages/azure_blob.py +2 -2
- camel/storages/object_storages/base.py +2 -2
- camel/storages/object_storages/google_cloud.py +3 -3
- camel/storages/vectordb_storages/__init__.py +12 -2
- camel/storages/vectordb_storages/base.py +2 -2
- camel/storages/vectordb_storages/chroma.py +731 -0
- camel/storages/vectordb_storages/faiss.py +712 -0
- camel/storages/vectordb_storages/milvus.py +2 -2
- camel/storages/vectordb_storages/oceanbase.py +16 -17
- camel/storages/vectordb_storages/pgvector.py +349 -0
- camel/storages/vectordb_storages/qdrant.py +6 -6
- camel/storages/vectordb_storages/surreal.py +372 -0
- camel/storages/vectordb_storages/tidb.py +11 -8
- camel/storages/vectordb_storages/weaviate.py +714 -0
- camel/tasks/__init__.py +2 -2
- camel/tasks/task.py +366 -27
- camel/tasks/task_prompt.py +3 -3
- camel/terminators/__init__.py +2 -2
- camel/terminators/base.py +2 -2
- camel/terminators/response_terminator.py +2 -2
- camel/terminators/token_limit_terminator.py +2 -2
- camel/toolkits/__init__.py +58 -10
- camel/toolkits/aci_toolkit.py +66 -21
- camel/toolkits/arxiv_toolkit.py +8 -8
- camel/toolkits/ask_news_toolkit.py +2 -2
- camel/toolkits/async_browser_toolkit.py +174 -575
- camel/toolkits/audio_analysis_toolkit.py +3 -3
- camel/toolkits/base.py +65 -7
- camel/toolkits/bohrium_toolkit.py +318 -0
- camel/toolkits/browser_toolkit.py +306 -566
- camel/toolkits/browser_toolkit_commons.py +568 -0
- camel/toolkits/code_execution.py +67 -11
- camel/toolkits/context_summarizer_toolkit.py +684 -0
- camel/toolkits/craw4ai_toolkit.py +93 -0
- camel/toolkits/dappier_toolkit.py +12 -8
- camel/toolkits/data_commons_toolkit.py +2 -2
- camel/toolkits/dingtalk.py +1135 -0
- camel/toolkits/earth_science_toolkit.py +5367 -0
- camel/toolkits/edgeone_pages_mcp_toolkit.py +49 -0
- camel/toolkits/excel_toolkit.py +910 -70
- camel/toolkits/file_toolkit.py +1402 -0
- camel/toolkits/function_tool.py +128 -20
- camel/toolkits/github_toolkit.py +148 -43
- camel/toolkits/gmail_toolkit.py +1839 -0
- camel/toolkits/google_calendar_toolkit.py +40 -6
- camel/toolkits/google_drive_mcp_toolkit.py +54 -0
- camel/toolkits/google_maps_toolkit.py +2 -2
- camel/toolkits/google_scholar_toolkit.py +2 -2
- camel/toolkits/human_toolkit.py +36 -12
- camel/toolkits/hybrid_browser_toolkit/__init__.py +18 -0
- camel/toolkits/hybrid_browser_toolkit/config_loader.py +185 -0
- camel/toolkits/hybrid_browser_toolkit/hybrid_browser_toolkit.py +246 -0
- camel/toolkits/hybrid_browser_toolkit/hybrid_browser_toolkit_ts.py +1973 -0
- camel/toolkits/hybrid_browser_toolkit/installer.py +203 -0
- camel/toolkits/hybrid_browser_toolkit/ts/package-lock.json +4589 -0
- camel/toolkits/hybrid_browser_toolkit/ts/package.json +33 -0
- camel/toolkits/hybrid_browser_toolkit/ts/src/browser-scripts.js +125 -0
- camel/toolkits/hybrid_browser_toolkit/ts/src/browser-session.ts +1929 -0
- camel/toolkits/hybrid_browser_toolkit/ts/src/config-loader.ts +233 -0
- camel/toolkits/hybrid_browser_toolkit/ts/src/hybrid-browser-toolkit.ts +589 -0
- camel/toolkits/hybrid_browser_toolkit/ts/src/index.ts +7 -0
- camel/toolkits/hybrid_browser_toolkit/ts/src/parent-child-filter.ts +226 -0
- camel/toolkits/hybrid_browser_toolkit/ts/src/snapshot-parser.ts +219 -0
- camel/toolkits/hybrid_browser_toolkit/ts/src/som-screenshot-injected.ts +543 -0
- camel/toolkits/hybrid_browser_toolkit/ts/src/types.ts +129 -0
- camel/toolkits/hybrid_browser_toolkit/ts/tsconfig.json +27 -0
- camel/toolkits/hybrid_browser_toolkit/ts/websocket-server.js +319 -0
- camel/toolkits/hybrid_browser_toolkit/ws_wrapper.py +1037 -0
- camel/toolkits/hybrid_browser_toolkit_py/__init__.py +17 -0
- camel/toolkits/hybrid_browser_toolkit_py/actions.py +575 -0
- camel/toolkits/hybrid_browser_toolkit_py/agent.py +311 -0
- camel/toolkits/hybrid_browser_toolkit_py/browser_session.py +787 -0
- camel/toolkits/hybrid_browser_toolkit_py/config_loader.py +490 -0
- camel/toolkits/hybrid_browser_toolkit_py/hybrid_browser_toolkit.py +2390 -0
- camel/toolkits/hybrid_browser_toolkit_py/snapshot.py +233 -0
- camel/toolkits/hybrid_browser_toolkit_py/stealth_script.js +0 -0
- camel/toolkits/hybrid_browser_toolkit_py/unified_analyzer.js +1043 -0
- camel/toolkits/image_analysis_toolkit.py +3 -3
- camel/toolkits/image_generation_toolkit.py +390 -0
- camel/toolkits/jina_reranker_toolkit.py +195 -79
- camel/toolkits/klavis_toolkit.py +7 -3
- camel/toolkits/linkedin_toolkit.py +2 -2
- camel/toolkits/markitdown_toolkit.py +104 -0
- camel/toolkits/math_toolkit.py +66 -12
- camel/toolkits/mcp_toolkit.py +841 -600
- camel/toolkits/memory_toolkit.py +7 -3
- camel/toolkits/meshy_toolkit.py +2 -2
- camel/toolkits/message_agent_toolkit.py +608 -0
- camel/toolkits/message_integration.py +724 -0
- camel/toolkits/mineru_toolkit.py +2 -2
- camel/toolkits/minimax_mcp_toolkit.py +195 -0
- camel/toolkits/networkx_toolkit.py +2 -2
- camel/toolkits/note_taking_toolkit.py +277 -0
- camel/toolkits/notion_mcp_toolkit.py +224 -0
- camel/toolkits/notion_toolkit.py +2 -2
- camel/toolkits/open_api_specs/biztoc/__init__.py +2 -2
- camel/toolkits/open_api_specs/biztoc/ai-plugin.json +1 -1
- camel/toolkits/open_api_specs/coursera/__init__.py +2 -2
- camel/toolkits/open_api_specs/create_qr_code/__init__.py +2 -2
- camel/toolkits/open_api_specs/klarna/__init__.py +2 -2
- camel/toolkits/open_api_specs/nasa_apod/__init__.py +2 -2
- camel/toolkits/open_api_specs/outschool/__init__.py +2 -2
- camel/toolkits/open_api_specs/outschool/ai-plugin.json +1 -1
- camel/toolkits/open_api_specs/outschool/openapi.yaml +1 -1
- camel/toolkits/open_api_specs/outschool/paths/__init__.py +2 -2
- camel/toolkits/open_api_specs/outschool/paths/get_classes.py +2 -2
- camel/toolkits/open_api_specs/outschool/paths/search_teachers.py +2 -2
- camel/toolkits/open_api_specs/security_config.py +2 -2
- camel/toolkits/open_api_specs/speak/__init__.py +2 -2
- camel/toolkits/open_api_specs/web_scraper/__init__.py +2 -2
- camel/toolkits/open_api_specs/web_scraper/ai-plugin.json +1 -1
- camel/toolkits/open_api_specs/web_scraper/paths/__init__.py +2 -2
- camel/toolkits/open_api_specs/web_scraper/paths/scraper.py +2 -2
- camel/toolkits/open_api_toolkit.py +2 -2
- camel/toolkits/openbb_toolkit.py +7 -3
- camel/toolkits/origene_mcp_toolkit.py +56 -0
- camel/toolkits/page_script.js +86 -74
- camel/toolkits/playwright_mcp_toolkit.py +27 -32
- camel/toolkits/pptx_toolkit.py +790 -0
- camel/toolkits/pubmed_toolkit.py +2 -2
- camel/toolkits/pulse_mcp_search_toolkit.py +2 -2
- camel/toolkits/pyautogui_toolkit.py +2 -2
- camel/toolkits/reddit_toolkit.py +2 -2
- camel/toolkits/resend_toolkit.py +168 -0
- camel/toolkits/retrieval_toolkit.py +2 -2
- camel/toolkits/screenshot_toolkit.py +213 -0
- camel/toolkits/search_toolkit.py +539 -146
- camel/toolkits/searxng_toolkit.py +2 -2
- camel/toolkits/semantic_scholar_toolkit.py +2 -2
- camel/toolkits/slack_toolkit.py +108 -58
- camel/toolkits/sql_toolkit.py +712 -0
- camel/toolkits/stripe_toolkit.py +2 -2
- camel/toolkits/sympy_toolkit.py +3 -3
- camel/toolkits/task_planning_toolkit.py +134 -0
- camel/toolkits/terminal_toolkit/__init__.py +18 -0
- camel/toolkits/terminal_toolkit/terminal_toolkit.py +1070 -0
- camel/toolkits/terminal_toolkit/utils.py +532 -0
- camel/toolkits/thinking_toolkit.py +3 -3
- camel/toolkits/twitter_toolkit.py +8 -3
- camel/toolkits/vertex_ai_veo_toolkit.py +590 -0
- camel/toolkits/video_analysis_toolkit.py +112 -29
- camel/toolkits/video_download_toolkit.py +22 -16
- camel/toolkits/weather_toolkit.py +2 -2
- camel/toolkits/web_deploy_toolkit.py +1219 -0
- camel/toolkits/wechat_official_toolkit.py +483 -0
- camel/toolkits/whatsapp_toolkit.py +2 -2
- camel/toolkits/wolfram_alpha_toolkit.py +53 -25
- camel/toolkits/zapier_toolkit.py +7 -3
- camel/types/__init__.py +4 -4
- camel/types/agents/__init__.py +2 -2
- camel/types/agents/tool_calling_record.py +6 -3
- camel/types/enums.py +454 -35
- camel/types/mcp_registries.py +2 -2
- camel/types/openai_types.py +4 -4
- camel/types/unified_model_type.py +43 -6
- camel/utils/__init__.py +20 -2
- camel/utils/async_func.py +2 -2
- camel/utils/chunker/__init__.py +2 -2
- camel/utils/chunker/base.py +2 -2
- camel/utils/chunker/code_chunker.py +2 -2
- camel/utils/chunker/uio_chunker.py +2 -2
- camel/utils/commons.py +65 -7
- camel/utils/constants.py +5 -2
- camel/utils/context_utils.py +1134 -0
- camel/utils/deduplication.py +2 -2
- camel/utils/filename.py +2 -2
- camel/utils/langfuse.py +258 -0
- camel/utils/mcp.py +140 -6
- camel/utils/mcp_client.py +1056 -0
- camel/utils/message_summarizer.py +148 -0
- camel/utils/response_format.py +2 -2
- camel/utils/token_counting.py +45 -22
- camel/utils/tool_result.py +44 -0
- camel/verifiers/__init__.py +2 -2
- camel/verifiers/base.py +2 -2
- camel/verifiers/math_verifier.py +2 -2
- camel/verifiers/models.py +2 -2
- camel/verifiers/physics_verifier.py +2 -2
- camel/verifiers/python_verifier.py +2 -2
- {camel_ai-0.2.59.dist-info → camel_ai-0.2.82.dist-info}/METADATA +349 -108
- camel_ai-0.2.82.dist-info/RECORD +507 -0
- {camel_ai-0.2.59.dist-info → camel_ai-0.2.82.dist-info}/WHEEL +1 -1
- {camel_ai-0.2.59.dist-info → camel_ai-0.2.82.dist-info}/licenses/LICENSE +1 -1
- camel/loaders/pandas_reader.py +0 -368
- camel/runtime/api.py +0 -97
- camel/toolkits/dalle_toolkit.py +0 -171
- camel/toolkits/file_write_toolkit.py +0 -395
- camel/toolkits/openai_agent_toolkit.py +0 -135
- camel/toolkits/terminal_toolkit.py +0 -1037
- camel_ai-0.2.59.dist-info/RECORD +0 -410
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
# ========= Copyright 2023-
|
|
1
|
+
# ========= Copyright 2023-2025 @ CAMEL-AI.org. All Rights Reserved. =========
|
|
2
2
|
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
3
3
|
# you may not use this file except in compliance with the License.
|
|
4
4
|
# You may obtain a copy of the License at
|
|
@@ -10,7 +10,7 @@
|
|
|
10
10
|
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
11
11
|
# See the License for the specific language governing permissions and
|
|
12
12
|
# limitations under the License.
|
|
13
|
-
# ========= Copyright 2023-
|
|
13
|
+
# ========= Copyright 2023-2025 @ CAMEL-AI.org. All Rights Reserved. =========
|
|
14
14
|
import logging
|
|
15
15
|
import re
|
|
16
16
|
from datetime import datetime
|
|
@@ -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,14 +10,12 @@
|
|
|
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
|
import logging
|
|
17
17
|
from typing import TYPE_CHECKING, Any, Dict, List, Literal, Optional
|
|
18
18
|
|
|
19
|
-
from sqlalchemy import JSON, Column, Integer
|
|
20
|
-
|
|
21
19
|
if TYPE_CHECKING:
|
|
22
20
|
from pyobvector.client import ObVecClient
|
|
23
21
|
|
|
@@ -76,10 +74,10 @@ class OceanBaseStorage(BaseVectorStorage):
|
|
|
76
74
|
ObVecClient,
|
|
77
75
|
)
|
|
78
76
|
from pyobvector.client.index_param import (
|
|
79
|
-
IndexParam,
|
|
80
77
|
IndexParams,
|
|
81
78
|
)
|
|
82
79
|
from pyobvector.schema import VECTOR
|
|
80
|
+
from sqlalchemy import JSON, Column, Integer
|
|
83
81
|
|
|
84
82
|
self.vector_dim: int = vector_dim
|
|
85
83
|
self.table_name: str = table_name
|
|
@@ -113,20 +111,21 @@ class OceanBaseStorage(BaseVectorStorage):
|
|
|
113
111
|
|
|
114
112
|
# Create vector index
|
|
115
113
|
index_params: IndexParams = IndexParams()
|
|
116
|
-
index_params.
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
ef_construction=256,
|
|
124
|
-
)
|
|
114
|
+
index_params.add_index(
|
|
115
|
+
field_name="embedding",
|
|
116
|
+
index_type="hnsw",
|
|
117
|
+
index_name="embedding_idx",
|
|
118
|
+
distance=self.distance,
|
|
119
|
+
m=16,
|
|
120
|
+
ef_construction=256,
|
|
125
121
|
)
|
|
126
122
|
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
123
|
+
# Get the first index parameter
|
|
124
|
+
first_index_param = next(iter(index_params), None)
|
|
125
|
+
if first_index_param is not None:
|
|
126
|
+
self._client.create_vidx_with_vec_index_param(
|
|
127
|
+
table_name=self.table_name, vidx_param=first_index_param
|
|
128
|
+
)
|
|
130
129
|
|
|
131
130
|
logger.info(f"Created table {self.table_name} with vector index")
|
|
132
131
|
else:
|
|
@@ -0,0 +1,349 @@
|
|
|
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 json
|
|
16
|
+
from typing import Any, Dict, List, Optional
|
|
17
|
+
|
|
18
|
+
from camel.logger import get_logger
|
|
19
|
+
from camel.storages.vectordb_storages import (
|
|
20
|
+
BaseVectorStorage,
|
|
21
|
+
VectorDBQuery,
|
|
22
|
+
VectorDBQueryResult,
|
|
23
|
+
VectorDBStatus,
|
|
24
|
+
VectorRecord,
|
|
25
|
+
)
|
|
26
|
+
from camel.types import VectorDistance
|
|
27
|
+
from camel.utils import dependencies_required
|
|
28
|
+
|
|
29
|
+
logger = get_logger(__name__)
|
|
30
|
+
|
|
31
|
+
|
|
32
|
+
class PgVectorStorage(BaseVectorStorage):
|
|
33
|
+
r"""PgVectorStorage is an implementation of BaseVectorStorage for
|
|
34
|
+
PostgreSQL with pgvector extension.
|
|
35
|
+
|
|
36
|
+
This class provides methods to add, delete, query, and manage vector
|
|
37
|
+
records in a PostgreSQL database using the pgvector extension.
|
|
38
|
+
It supports different distance metrics for similarity search.
|
|
39
|
+
|
|
40
|
+
Args:
|
|
41
|
+
vector_dim (int): The dimension of the vectors to be stored.
|
|
42
|
+
conn_info (Dict[str, Any]): Connection information for
|
|
43
|
+
psycopg2.connect.
|
|
44
|
+
table_name (str, optional): Name of the table to store vectors.
|
|
45
|
+
(default: :obj:`None`)
|
|
46
|
+
distance (VectorDistance, optional): Distance metric for vector
|
|
47
|
+
comparison. (default: :obj:`VectorDistance.COSINE`)
|
|
48
|
+
"""
|
|
49
|
+
|
|
50
|
+
@dependencies_required('psycopg', 'pgvector')
|
|
51
|
+
def __init__(
|
|
52
|
+
self,
|
|
53
|
+
vector_dim: int,
|
|
54
|
+
conn_info: Dict[str, Any],
|
|
55
|
+
table_name: Optional[str] = None,
|
|
56
|
+
distance: VectorDistance = VectorDistance.COSINE,
|
|
57
|
+
**kwargs: Any,
|
|
58
|
+
) -> None:
|
|
59
|
+
r"""Initialize PgVectorStorage.
|
|
60
|
+
|
|
61
|
+
Args:
|
|
62
|
+
vector_dim (int): The dimension of the vectors.
|
|
63
|
+
conn_info (Dict[str, Any]): Connection info for psycopg2.connect.
|
|
64
|
+
table_name (str, optional): Table name. (default: :obj:`None`)
|
|
65
|
+
distance (VectorDistance, optional): Distance metric.
|
|
66
|
+
(default: :obj:`VectorDistance.COSINE`)
|
|
67
|
+
"""
|
|
68
|
+
import psycopg
|
|
69
|
+
from pgvector.psycopg import register_vector
|
|
70
|
+
|
|
71
|
+
if vector_dim <= 0:
|
|
72
|
+
raise ValueError("vector_dim must be positive")
|
|
73
|
+
|
|
74
|
+
self.vector_dim = vector_dim
|
|
75
|
+
self.conn_info = conn_info
|
|
76
|
+
self.table_name = table_name or 'vectors'
|
|
77
|
+
self.distance = distance
|
|
78
|
+
|
|
79
|
+
try:
|
|
80
|
+
self._conn = psycopg.connect(**conn_info)
|
|
81
|
+
register_vector(self._conn)
|
|
82
|
+
self._ensure_table()
|
|
83
|
+
self._ensure_index()
|
|
84
|
+
except Exception as e:
|
|
85
|
+
logger.error(f"Failed to initialize PgVectorStorage: {e}")
|
|
86
|
+
raise
|
|
87
|
+
|
|
88
|
+
def _ensure_table(self) -> None:
|
|
89
|
+
r"""Ensure the vector table exists in the database.
|
|
90
|
+
Creates the table if it does not exist.
|
|
91
|
+
"""
|
|
92
|
+
try:
|
|
93
|
+
from psycopg.sql import SQL, Identifier, Literal
|
|
94
|
+
|
|
95
|
+
with self._conn.cursor() as cur:
|
|
96
|
+
query = SQL("""
|
|
97
|
+
CREATE TABLE IF NOT EXISTS {table} (
|
|
98
|
+
id VARCHAR PRIMARY KEY,
|
|
99
|
+
vector vector({dim}),
|
|
100
|
+
payload JSONB
|
|
101
|
+
)
|
|
102
|
+
""").format(
|
|
103
|
+
table=Identifier(self.table_name),
|
|
104
|
+
dim=Literal(self.vector_dim),
|
|
105
|
+
)
|
|
106
|
+
cur.execute(query)
|
|
107
|
+
self._conn.commit()
|
|
108
|
+
except Exception as e:
|
|
109
|
+
logger.error(f"Failed to create table {self.table_name}: {e}")
|
|
110
|
+
raise
|
|
111
|
+
|
|
112
|
+
def _ensure_index(self) -> None:
|
|
113
|
+
r"""Ensure vector similarity search index exists for better
|
|
114
|
+
performance.
|
|
115
|
+
"""
|
|
116
|
+
try:
|
|
117
|
+
from psycopg.sql import SQL, Identifier
|
|
118
|
+
|
|
119
|
+
with self._conn.cursor() as cur:
|
|
120
|
+
index_name = f"{self.table_name}_vector_idx"
|
|
121
|
+
query = SQL("""
|
|
122
|
+
CREATE INDEX IF NOT EXISTS {index_name}
|
|
123
|
+
ON {table}
|
|
124
|
+
USING hnsw (vector vector_cosine_ops)
|
|
125
|
+
""").format(
|
|
126
|
+
index_name=Identifier(index_name),
|
|
127
|
+
table=Identifier(self.table_name),
|
|
128
|
+
)
|
|
129
|
+
cur.execute(query)
|
|
130
|
+
self._conn.commit()
|
|
131
|
+
except Exception as e:
|
|
132
|
+
logger.warning(f"Failed to create vector index: {e}")
|
|
133
|
+
|
|
134
|
+
def add(self, records: List[VectorRecord], **kwargs: Any) -> None:
|
|
135
|
+
r"""Add or update vector records in the database.
|
|
136
|
+
|
|
137
|
+
Args:
|
|
138
|
+
records (List[VectorRecord]): List of vector records to
|
|
139
|
+
add or update.
|
|
140
|
+
"""
|
|
141
|
+
if not records:
|
|
142
|
+
return
|
|
143
|
+
|
|
144
|
+
try:
|
|
145
|
+
with self._conn.cursor() as cur:
|
|
146
|
+
# Use batch insert for better performance
|
|
147
|
+
batch_data = []
|
|
148
|
+
for rec in records:
|
|
149
|
+
if len(rec.vector) != self.vector_dim:
|
|
150
|
+
raise ValueError(
|
|
151
|
+
f"Vector dimension mismatch: expected "
|
|
152
|
+
f"{self.vector_dim}, got {len(rec.vector)}"
|
|
153
|
+
)
|
|
154
|
+
|
|
155
|
+
batch_data.append(
|
|
156
|
+
(
|
|
157
|
+
rec.id,
|
|
158
|
+
rec.vector,
|
|
159
|
+
json.dumps(rec.payload)
|
|
160
|
+
if rec.payload is not None
|
|
161
|
+
else None,
|
|
162
|
+
)
|
|
163
|
+
)
|
|
164
|
+
|
|
165
|
+
# Use executemany for efficient batch insert
|
|
166
|
+
from psycopg.sql import SQL, Identifier
|
|
167
|
+
|
|
168
|
+
query = SQL("""
|
|
169
|
+
INSERT INTO {table} (id, vector, payload)
|
|
170
|
+
VALUES (%s, %s, %s)
|
|
171
|
+
ON CONFLICT (id) DO UPDATE SET
|
|
172
|
+
vector=EXCLUDED.vector,
|
|
173
|
+
payload=EXCLUDED.payload
|
|
174
|
+
""").format(table=Identifier(self.table_name))
|
|
175
|
+
|
|
176
|
+
cur.executemany(query, batch_data)
|
|
177
|
+
self._conn.commit()
|
|
178
|
+
except Exception as e:
|
|
179
|
+
self._conn.rollback()
|
|
180
|
+
logger.error(f"Failed to add records: {e}")
|
|
181
|
+
raise
|
|
182
|
+
|
|
183
|
+
def delete(self, ids: List[str], **kwargs: Any) -> None:
|
|
184
|
+
r"""Delete vector records from the database by their IDs.
|
|
185
|
+
|
|
186
|
+
Args:
|
|
187
|
+
ids (List[str]): List of record IDs to delete.
|
|
188
|
+
"""
|
|
189
|
+
from psycopg.sql import SQL, Identifier
|
|
190
|
+
|
|
191
|
+
if not ids:
|
|
192
|
+
return
|
|
193
|
+
|
|
194
|
+
try:
|
|
195
|
+
with self._conn.cursor() as cur:
|
|
196
|
+
query = SQL("DELETE FROM {table} WHERE id = ANY(%s)").format(
|
|
197
|
+
table=Identifier(self.table_name)
|
|
198
|
+
)
|
|
199
|
+
cur.execute(query, (ids,))
|
|
200
|
+
self._conn.commit()
|
|
201
|
+
except Exception as e:
|
|
202
|
+
self._conn.rollback()
|
|
203
|
+
logger.error(f"Failed to delete records: {e}")
|
|
204
|
+
raise
|
|
205
|
+
|
|
206
|
+
def query(
|
|
207
|
+
self, query: VectorDBQuery, **kwargs: Any
|
|
208
|
+
) -> List[VectorDBQueryResult]:
|
|
209
|
+
r"""Query the database for the most similar vectors to the given
|
|
210
|
+
query vector.
|
|
211
|
+
|
|
212
|
+
Args:
|
|
213
|
+
query (VectorDBQuery): Query object containing the query
|
|
214
|
+
vector and top_k.
|
|
215
|
+
**kwargs (Any): Additional keyword arguments for the query.
|
|
216
|
+
|
|
217
|
+
Returns:
|
|
218
|
+
List[VectorDBQueryResult]: List of query results sorted by
|
|
219
|
+
similarity.
|
|
220
|
+
"""
|
|
221
|
+
if len(query.query_vector) != self.vector_dim:
|
|
222
|
+
raise ValueError(
|
|
223
|
+
f"Query vector dimension mismatch: "
|
|
224
|
+
f"expected {self.vector_dim}, got {len(query.query_vector)}"
|
|
225
|
+
)
|
|
226
|
+
|
|
227
|
+
try:
|
|
228
|
+
with self._conn.cursor() as cur:
|
|
229
|
+
# Fix distance metric mapping
|
|
230
|
+
metric_info = {
|
|
231
|
+
VectorDistance.COSINE: ('<=>', 'ASC'), # Cosine distance
|
|
232
|
+
VectorDistance.EUCLIDEAN: (
|
|
233
|
+
'<->',
|
|
234
|
+
'ASC',
|
|
235
|
+
), # Euclidean distance
|
|
236
|
+
VectorDistance.DOT: (
|
|
237
|
+
'<#>',
|
|
238
|
+
'DESC',
|
|
239
|
+
), # Negative dot product (higher is better)
|
|
240
|
+
}
|
|
241
|
+
|
|
242
|
+
if self.distance not in metric_info:
|
|
243
|
+
raise ValueError(
|
|
244
|
+
f"Unsupported distance metric: {self.distance}"
|
|
245
|
+
)
|
|
246
|
+
|
|
247
|
+
metric, order = metric_info[self.distance]
|
|
248
|
+
|
|
249
|
+
from psycopg.sql import SQL, Identifier, Literal
|
|
250
|
+
|
|
251
|
+
query_sql = SQL("""
|
|
252
|
+
SELECT id, vector, payload, (vector {} %s::vector)
|
|
253
|
+
AS similarity
|
|
254
|
+
FROM {}
|
|
255
|
+
ORDER BY similarity {}
|
|
256
|
+
LIMIT %s
|
|
257
|
+
""").format(
|
|
258
|
+
Literal(metric),
|
|
259
|
+
Identifier(self.table_name),
|
|
260
|
+
Literal(order),
|
|
261
|
+
)
|
|
262
|
+
|
|
263
|
+
cur.execute(query_sql, (query.query_vector, query.top_k))
|
|
264
|
+
results = []
|
|
265
|
+
for row in cur.fetchall():
|
|
266
|
+
id, vector, payload, similarity = row
|
|
267
|
+
results.append(
|
|
268
|
+
VectorDBQueryResult.create(
|
|
269
|
+
similarity=float(similarity),
|
|
270
|
+
vector=list(vector),
|
|
271
|
+
id=id,
|
|
272
|
+
payload=payload,
|
|
273
|
+
)
|
|
274
|
+
)
|
|
275
|
+
return results
|
|
276
|
+
except Exception as e:
|
|
277
|
+
logger.error(f"Failed to query vectors: {e}")
|
|
278
|
+
raise
|
|
279
|
+
|
|
280
|
+
def status(self, **kwargs: Any) -> VectorDBStatus:
|
|
281
|
+
r"""Get the status of the vector database, including vector
|
|
282
|
+
dimension and count.
|
|
283
|
+
|
|
284
|
+
Args:
|
|
285
|
+
**kwargs (Any): Additional keyword arguments for the query.
|
|
286
|
+
|
|
287
|
+
Returns:
|
|
288
|
+
VectorDBStatus: Status object with vector dimension and count.
|
|
289
|
+
"""
|
|
290
|
+
try:
|
|
291
|
+
with self._conn.cursor() as cur:
|
|
292
|
+
from psycopg.sql import SQL, Identifier
|
|
293
|
+
|
|
294
|
+
query = SQL('SELECT COUNT(*) FROM {}').format(
|
|
295
|
+
Identifier(self.table_name)
|
|
296
|
+
)
|
|
297
|
+
cur.execute(query)
|
|
298
|
+
result = cur.fetchone()
|
|
299
|
+
count = result[0] if result else 0
|
|
300
|
+
return VectorDBStatus(
|
|
301
|
+
vector_dim=self.vector_dim, vector_count=count
|
|
302
|
+
)
|
|
303
|
+
except Exception as e:
|
|
304
|
+
logger.error(f"Failed to get status: {e}")
|
|
305
|
+
raise
|
|
306
|
+
|
|
307
|
+
def clear(self) -> None:
|
|
308
|
+
r"""Remove all vectors from the storage by truncating the table."""
|
|
309
|
+
try:
|
|
310
|
+
with self._conn.cursor() as cur:
|
|
311
|
+
from psycopg.sql import SQL, Identifier
|
|
312
|
+
|
|
313
|
+
query = SQL("TRUNCATE TABLE {table}").format(
|
|
314
|
+
table=Identifier(self.table_name)
|
|
315
|
+
)
|
|
316
|
+
cur.execute(query)
|
|
317
|
+
self._conn.commit()
|
|
318
|
+
except Exception as e:
|
|
319
|
+
self._conn.rollback()
|
|
320
|
+
logger.error(f"Failed to clear table: {e}")
|
|
321
|
+
raise
|
|
322
|
+
|
|
323
|
+
def load(self) -> None:
|
|
324
|
+
r"""Load the collection hosted on cloud service (no-op for pgvector).
|
|
325
|
+
This method is provided for interface compatibility.
|
|
326
|
+
"""
|
|
327
|
+
# For PostgreSQL local/managed instances, no loading is required
|
|
328
|
+
pass
|
|
329
|
+
|
|
330
|
+
def close(self) -> None:
|
|
331
|
+
r"""Close the database connection."""
|
|
332
|
+
if hasattr(self, '_conn') and self._conn:
|
|
333
|
+
try:
|
|
334
|
+
self._conn.close()
|
|
335
|
+
except Exception as e:
|
|
336
|
+
logger.warning(f"Error closing connection: {e}")
|
|
337
|
+
|
|
338
|
+
def __del__(self) -> None:
|
|
339
|
+
r"""Ensure connection is closed when object is destroyed."""
|
|
340
|
+
self.close()
|
|
341
|
+
|
|
342
|
+
@property
|
|
343
|
+
def client(self) -> Any:
|
|
344
|
+
r"""Provides access to the underlying vector database client.
|
|
345
|
+
|
|
346
|
+
Returns:
|
|
347
|
+
Any: The underlying psycopg connection object.
|
|
348
|
+
"""
|
|
349
|
+
return self._conn
|
|
@@ -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,10 +10,11 @@
|
|
|
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 logging
|
|
15
15
|
from datetime import datetime
|
|
16
16
|
from typing import TYPE_CHECKING, Any, Dict, List, Optional, Tuple, Union, cast
|
|
17
|
+
from uuid import UUID
|
|
17
18
|
|
|
18
19
|
if TYPE_CHECKING:
|
|
19
20
|
from qdrant_client import QdrantClient
|
|
@@ -251,7 +252,6 @@ class QdrantStorage(BaseVectorStorage):
|
|
|
251
252
|
else None,
|
|
252
253
|
"vector_count": collection_info.points_count,
|
|
253
254
|
"status": collection_info.status,
|
|
254
|
-
"vectors_count": collection_info.vectors_count,
|
|
255
255
|
"config": collection_info.config,
|
|
256
256
|
}
|
|
257
257
|
|
|
@@ -304,12 +304,12 @@ class QdrantStorage(BaseVectorStorage):
|
|
|
304
304
|
"""
|
|
305
305
|
from qdrant_client.http.models import PointIdsList, UpdateStatus
|
|
306
306
|
|
|
307
|
-
points = cast(List[Union[str,
|
|
307
|
+
points = cast(List[Union[int, str, UUID]], ids)
|
|
308
308
|
|
|
309
309
|
op_info = self._client.set_payload(
|
|
310
310
|
collection_name=self.collection_name,
|
|
311
311
|
payload=payload,
|
|
312
|
-
points=PointIdsList(points=points),
|
|
312
|
+
points=PointIdsList(points=points), # type: ignore[arg-type]
|
|
313
313
|
**kwargs,
|
|
314
314
|
)
|
|
315
315
|
if op_info.status != UpdateStatus.COMPLETED:
|
|
@@ -376,7 +376,7 @@ class QdrantStorage(BaseVectorStorage):
|
|
|
376
376
|
op_info = self._client.delete(
|
|
377
377
|
collection_name=self.collection_name,
|
|
378
378
|
points_selector=PointIdsList(
|
|
379
|
-
points=cast(List[Union[int, str]], ids)
|
|
379
|
+
points=cast(List[Union[int, str, UUID]], ids) # type: ignore[arg-type]
|
|
380
380
|
),
|
|
381
381
|
**kwargs,
|
|
382
382
|
)
|