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
|
@@ -0,0 +1,372 @@
|
|
|
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 re
|
|
15
|
+
from typing import Any, Dict, List, Optional, cast
|
|
16
|
+
|
|
17
|
+
from camel.logger import get_logger
|
|
18
|
+
from camel.storages.vectordb_storages import (
|
|
19
|
+
BaseVectorStorage,
|
|
20
|
+
VectorDBQuery,
|
|
21
|
+
VectorDBQueryResult,
|
|
22
|
+
VectorDBStatus,
|
|
23
|
+
VectorRecord,
|
|
24
|
+
)
|
|
25
|
+
from camel.types import VectorDistance
|
|
26
|
+
from camel.utils import dependencies_required
|
|
27
|
+
|
|
28
|
+
logger = get_logger(__name__)
|
|
29
|
+
|
|
30
|
+
|
|
31
|
+
class SurrealStorage(BaseVectorStorage):
|
|
32
|
+
r"""An implementation of the `BaseVectorStorage` using SurrealDB,
|
|
33
|
+
a scalable, distributed database with WebSocket support, for
|
|
34
|
+
efficient vector storage and similarity search.
|
|
35
|
+
|
|
36
|
+
SurrealDB official site and documentation can be found at:
|
|
37
|
+
`SurrealDB <https://surrealdb.com>`_
|
|
38
|
+
|
|
39
|
+
Args:
|
|
40
|
+
url (str): WebSocket URL for connecting to SurrealDB
|
|
41
|
+
(default: "ws://localhost:8000/rpc").
|
|
42
|
+
table (str): Name of the table used for storing vectors
|
|
43
|
+
(default: "vector_store").
|
|
44
|
+
vector_dim (int): Dimensionality of the stored vectors.
|
|
45
|
+
distance (VectorDistance): Distance metric used for similarity
|
|
46
|
+
comparisons (default: VectorDistance.COSINE).
|
|
47
|
+
namespace (str): SurrealDB namespace to use (default: "default").
|
|
48
|
+
database (str): SurrealDB database name (default: "demo").
|
|
49
|
+
user (str): Username for authentication (default: "root").
|
|
50
|
+
password (str): Password for authentication (default: "root").
|
|
51
|
+
|
|
52
|
+
Notes:
|
|
53
|
+
- SurrealDB supports flexible schema and powerful querying capabilities
|
|
54
|
+
via SQL-like syntax over WebSocket.
|
|
55
|
+
- This implementation manages connection setup and ensures the target
|
|
56
|
+
table exists.
|
|
57
|
+
- Suitable for applications requiring distributed vector storage and
|
|
58
|
+
search with real-time updates.
|
|
59
|
+
"""
|
|
60
|
+
|
|
61
|
+
@dependencies_required('surrealdb')
|
|
62
|
+
def __init__(
|
|
63
|
+
self,
|
|
64
|
+
*,
|
|
65
|
+
url: str = "ws://localhost:8000/rpc",
|
|
66
|
+
table: str = "vector_store",
|
|
67
|
+
vector_dim: int = 786,
|
|
68
|
+
vector_type: str = "F64",
|
|
69
|
+
distance: VectorDistance = VectorDistance.COSINE,
|
|
70
|
+
hnsw_effort: int = 40,
|
|
71
|
+
namespace: str = "default",
|
|
72
|
+
database: str = "demo",
|
|
73
|
+
user: str = "root",
|
|
74
|
+
password: str = "root",
|
|
75
|
+
) -> None:
|
|
76
|
+
r"""Initialize SurrealStorage with connection settings and ensure
|
|
77
|
+
the target table exists.
|
|
78
|
+
|
|
79
|
+
Args:
|
|
80
|
+
url (str): WebSocket URL for connecting to SurrealDB.
|
|
81
|
+
(default: :obj:`"ws://localhost:8000/rpc"`)
|
|
82
|
+
table (str): Name of the table used for vector storage.
|
|
83
|
+
(default: :obj:`"vector_store"`)
|
|
84
|
+
vector_dim (int): Dimensionality of the stored vectors.
|
|
85
|
+
(default: :obj:`786`)
|
|
86
|
+
distance (VectorDistance): Distance metric for similarity
|
|
87
|
+
searches. (default: :obj:`VectorDistance.COSINE`)
|
|
88
|
+
namespace (str): SurrealDB namespace to use.
|
|
89
|
+
(default: :obj:`"default"`)
|
|
90
|
+
database (str): SurrealDB database name.
|
|
91
|
+
(default: :obj:`"demo"`)
|
|
92
|
+
user (str): Username for authentication.
|
|
93
|
+
(default: :obj:`"root"`)
|
|
94
|
+
password (str): Password for authentication.
|
|
95
|
+
(default: :obj:`"root"`)
|
|
96
|
+
"""
|
|
97
|
+
|
|
98
|
+
from surrealdb import Surreal
|
|
99
|
+
|
|
100
|
+
self.url = url
|
|
101
|
+
self.table = table
|
|
102
|
+
self.ns = namespace
|
|
103
|
+
self.db = database
|
|
104
|
+
self.user = user
|
|
105
|
+
self.password = password
|
|
106
|
+
self.vector_dim = vector_dim
|
|
107
|
+
self.vector_type = vector_type
|
|
108
|
+
self.distance = distance
|
|
109
|
+
self._hnsw_effort = hnsw_effort
|
|
110
|
+
self._surreal_client = Surreal(self.url)
|
|
111
|
+
self._surreal_client.signin({"username": user, "password": password})
|
|
112
|
+
self._surreal_client.use(namespace, database)
|
|
113
|
+
|
|
114
|
+
self._check_and_create_table()
|
|
115
|
+
|
|
116
|
+
def _table_exists(self) -> bool:
|
|
117
|
+
r"""Check whether the target table exists in the database.
|
|
118
|
+
|
|
119
|
+
Returns:
|
|
120
|
+
bool: True if the table exists, False otherwise.
|
|
121
|
+
"""
|
|
122
|
+
res = self._surreal_client.query("INFO FOR DB;")
|
|
123
|
+
res_dict = cast(Dict[str, Any], res)
|
|
124
|
+
tables = res_dict.get('tables', {})
|
|
125
|
+
logger.debug(f"_table_exists: {res!r}")
|
|
126
|
+
return self.table in tables
|
|
127
|
+
|
|
128
|
+
def _get_table_info(self) -> Dict[str, Optional[int]]:
|
|
129
|
+
r"""Retrieve dimension and record count from the table metadata.
|
|
130
|
+
|
|
131
|
+
Returns:
|
|
132
|
+
Dict[str, int]: A dictionary with 'dim' and 'count' keys.
|
|
133
|
+
"""
|
|
134
|
+
if not self._table_exists():
|
|
135
|
+
return {"dim": self.vector_dim, "count": 0}
|
|
136
|
+
res = self._surreal_client.query(f"INFO FOR TABLE {self.table};")
|
|
137
|
+
res_dict = cast(Dict[str, Any], res)
|
|
138
|
+
logger.debug(f"_get_table_info: {res!r}")
|
|
139
|
+
indexes = res_dict.get("indexes", {})
|
|
140
|
+
|
|
141
|
+
dim = self.vector_dim
|
|
142
|
+
idx_def = indexes.get("hnsw_idx")
|
|
143
|
+
if idx_def and isinstance(idx_def, str):
|
|
144
|
+
m = re.search(r"DIMENSION\s+(\d+)", idx_def)
|
|
145
|
+
if m:
|
|
146
|
+
dim = int(m.group(1))
|
|
147
|
+
cnt = self._surreal_client.query(
|
|
148
|
+
f"SELECT COUNT() FROM ONLY {self.table} GROUP ALL LIMIT 1;"
|
|
149
|
+
)
|
|
150
|
+
cnt_dict = cast(Dict[str, Any], cnt)
|
|
151
|
+
count = cnt_dict.get("count", 0)
|
|
152
|
+
return {"dim": dim, "count": count}
|
|
153
|
+
|
|
154
|
+
def _create_table(self):
|
|
155
|
+
r"""Define and create the vector storage table with HNSW index.
|
|
156
|
+
|
|
157
|
+
Documentation: https://surrealdb.com/docs/surrealdb/reference-guide/
|
|
158
|
+
vector-search#vector-search-cheat-sheet
|
|
159
|
+
"""
|
|
160
|
+
if self.distance.value not in ["cosine", "euclidean", "manhattan"]:
|
|
161
|
+
raise ValueError(
|
|
162
|
+
f"Unsupported distance metric: {self.distance.value}"
|
|
163
|
+
)
|
|
164
|
+
surql_query = f"""
|
|
165
|
+
DEFINE TABLE {self.table} SCHEMALESS;
|
|
166
|
+
DEFINE FIELD payload ON {self.table} FLEXIBLE TYPE object;
|
|
167
|
+
DEFINE FIELD embedding ON {self.table} TYPE array<float>;
|
|
168
|
+
DEFINE INDEX hnsw_idx ON {self.table}
|
|
169
|
+
FIELDS embedding
|
|
170
|
+
HNSW DIMENSION {self.vector_dim}
|
|
171
|
+
DIST {self.distance.value}
|
|
172
|
+
TYPE {self.vector_type}
|
|
173
|
+
EFC 150 M 12 M0 24;
|
|
174
|
+
"""
|
|
175
|
+
logger.debug(f"_create_table query: {surql_query}")
|
|
176
|
+
res = self._surreal_client.query_raw(surql_query)
|
|
177
|
+
logger.debug(f"_create_table response: {res}")
|
|
178
|
+
if "error" in res:
|
|
179
|
+
raise ValueError(f"Failed to create table: {res['error']}")
|
|
180
|
+
logger.info(f"Table '{self.table}' created successfully.")
|
|
181
|
+
|
|
182
|
+
def _drop_table(self):
|
|
183
|
+
r"""Drop the vector storage table if it exists."""
|
|
184
|
+
self._surreal_client.query_raw(f"REMOVE TABLE IF EXISTS {self.table};")
|
|
185
|
+
logger.info(f"Table '{self.table}' deleted successfully.")
|
|
186
|
+
|
|
187
|
+
def _check_and_create_table(self):
|
|
188
|
+
r"""Check if the table exists and matches the expected vector
|
|
189
|
+
dimension. If not, create a new table.
|
|
190
|
+
"""
|
|
191
|
+
if self._table_exists():
|
|
192
|
+
in_dim = self._get_table_info()["dim"]
|
|
193
|
+
if in_dim != self.vector_dim:
|
|
194
|
+
raise ValueError(
|
|
195
|
+
f"Table {self.table} exists with dimension {in_dim}, "
|
|
196
|
+
f"expected {self.vector_dim}"
|
|
197
|
+
)
|
|
198
|
+
else:
|
|
199
|
+
self._create_table()
|
|
200
|
+
|
|
201
|
+
def _validate_and_convert_records(
|
|
202
|
+
self, records: List[VectorRecord]
|
|
203
|
+
) -> List[Dict]:
|
|
204
|
+
r"""Validate and convert VectorRecord instances into
|
|
205
|
+
SurrealDB-compatible dictionaries.
|
|
206
|
+
|
|
207
|
+
Args:
|
|
208
|
+
records (List[VectorRecord]): List of vector records to insert.
|
|
209
|
+
|
|
210
|
+
Returns:
|
|
211
|
+
List[Dict]: Transformed list of dicts ready for insertion.
|
|
212
|
+
"""
|
|
213
|
+
validate_data = []
|
|
214
|
+
for record in records:
|
|
215
|
+
if len(record.vector) != self.vector_dim:
|
|
216
|
+
raise ValueError(
|
|
217
|
+
f"Vector dimension mismatch: expected {self.vector_dim}, "
|
|
218
|
+
f"got {len(record.vector)}"
|
|
219
|
+
)
|
|
220
|
+
record_dict = {
|
|
221
|
+
"payload": record.payload if record.payload else {},
|
|
222
|
+
"embedding": record.vector,
|
|
223
|
+
}
|
|
224
|
+
validate_data.append(record_dict)
|
|
225
|
+
|
|
226
|
+
return validate_data
|
|
227
|
+
|
|
228
|
+
def query(
|
|
229
|
+
self,
|
|
230
|
+
query: VectorDBQuery,
|
|
231
|
+
**kwargs: Any,
|
|
232
|
+
) -> List[VectorDBQueryResult]:
|
|
233
|
+
r"""Perform a top-k similarity search using the configured distance
|
|
234
|
+
metric.
|
|
235
|
+
|
|
236
|
+
Args:
|
|
237
|
+
query (VectorDBQuery): Query containing the query vector
|
|
238
|
+
and top_k value.
|
|
239
|
+
|
|
240
|
+
Returns:
|
|
241
|
+
List[VectorDBQueryResult]: Ranked list of matching records
|
|
242
|
+
with similarity scores.
|
|
243
|
+
"""
|
|
244
|
+
surql_query = f"""
|
|
245
|
+
SELECT id, embedding, payload, vector::distance::knn() AS dist
|
|
246
|
+
FROM {self.table}
|
|
247
|
+
WHERE embedding <|{query.top_k},{self._hnsw_effort}|> $vector
|
|
248
|
+
ORDER BY dist;
|
|
249
|
+
"""
|
|
250
|
+
logger.debug(
|
|
251
|
+
f"query surql: {surql_query} with $vector = {query.query_vector}"
|
|
252
|
+
)
|
|
253
|
+
|
|
254
|
+
query_params: Dict[str, Any] = {"vector": query.query_vector}
|
|
255
|
+
response = self._surreal_client.query(surql_query, query_params)
|
|
256
|
+
logger.debug(f"query response: {response!r}")
|
|
257
|
+
|
|
258
|
+
results: List[VectorDBQueryResult] = []
|
|
259
|
+
response_list = cast(List[Dict[str, Any]], response)
|
|
260
|
+
for row in response_list:
|
|
261
|
+
record_id = row["id"]
|
|
262
|
+
# SurrealDB RecordID has an 'id' attribute for the actual ID
|
|
263
|
+
actual_id = record_id.id if hasattr(record_id, 'id') else record_id
|
|
264
|
+
dist = float(row["dist"])
|
|
265
|
+
similarity = (
|
|
266
|
+
1.0 - dist if self.distance == VectorDistance.COSINE else -dist
|
|
267
|
+
)
|
|
268
|
+
results.append(
|
|
269
|
+
VectorDBQueryResult(
|
|
270
|
+
record=VectorRecord(
|
|
271
|
+
id=actual_id,
|
|
272
|
+
vector=row["embedding"],
|
|
273
|
+
payload=row["payload"],
|
|
274
|
+
),
|
|
275
|
+
similarity=similarity,
|
|
276
|
+
)
|
|
277
|
+
)
|
|
278
|
+
return results
|
|
279
|
+
|
|
280
|
+
def add(self, records: List[VectorRecord], **kwargs) -> None:
|
|
281
|
+
r"""Insert validated vector records into the SurrealDB table.
|
|
282
|
+
|
|
283
|
+
Args:
|
|
284
|
+
records (List[VectorRecord]): List of vector records to add.
|
|
285
|
+
"""
|
|
286
|
+
logger.info(
|
|
287
|
+
"Adding %d records to table '%s'.", len(records), self.table
|
|
288
|
+
)
|
|
289
|
+
try:
|
|
290
|
+
validated_records = self._validate_and_convert_records(records)
|
|
291
|
+
for record in validated_records:
|
|
292
|
+
self._surreal_client.create(self.table, record)
|
|
293
|
+
|
|
294
|
+
logger.info(
|
|
295
|
+
"Successfully added %d records to table '%s'.",
|
|
296
|
+
len(records),
|
|
297
|
+
self.table,
|
|
298
|
+
)
|
|
299
|
+
except Exception as e:
|
|
300
|
+
logger.error(
|
|
301
|
+
"Failed to add records to table '%s': %s",
|
|
302
|
+
self.table,
|
|
303
|
+
str(e),
|
|
304
|
+
exc_info=True,
|
|
305
|
+
)
|
|
306
|
+
raise
|
|
307
|
+
|
|
308
|
+
def delete(
|
|
309
|
+
self, ids: Optional[List[str]] = None, if_all: bool = False, **kwargs
|
|
310
|
+
) -> None:
|
|
311
|
+
r"""Delete specific records by ID or clear the entire table.
|
|
312
|
+
|
|
313
|
+
Args:
|
|
314
|
+
ids (Optional[List[str]]): List of record IDs to delete.
|
|
315
|
+
if_all (bool): Whether to delete all records in the table.
|
|
316
|
+
"""
|
|
317
|
+
from surrealdb.data.types.record_id import RecordID
|
|
318
|
+
|
|
319
|
+
try:
|
|
320
|
+
if if_all:
|
|
321
|
+
self._surreal_client.delete(self.table, **kwargs)
|
|
322
|
+
logger.info(f"Deleted all records from table '{self.table}'")
|
|
323
|
+
return
|
|
324
|
+
|
|
325
|
+
if not ids:
|
|
326
|
+
raise ValueError(
|
|
327
|
+
"Either `ids` must be provided or `if_all=True`"
|
|
328
|
+
)
|
|
329
|
+
|
|
330
|
+
for id_str in ids:
|
|
331
|
+
rec = RecordID(self.table, id_str)
|
|
332
|
+
self._surreal_client.delete(rec, **kwargs)
|
|
333
|
+
logger.info(f"Deleted record {rec}")
|
|
334
|
+
|
|
335
|
+
except Exception as e:
|
|
336
|
+
logger.exception("Error deleting records from SurrealDB")
|
|
337
|
+
raise RuntimeError(f"Failed to delete records {ids!r}") from e
|
|
338
|
+
|
|
339
|
+
def status(self) -> VectorDBStatus:
|
|
340
|
+
r"""Retrieve the status of the vector table including dimension and
|
|
341
|
+
count.
|
|
342
|
+
|
|
343
|
+
Returns:
|
|
344
|
+
VectorDBStatus: Object containing vector table metadata.
|
|
345
|
+
"""
|
|
346
|
+
status = self._get_table_info()
|
|
347
|
+
|
|
348
|
+
dim = status.get("dim")
|
|
349
|
+
count = status.get("count")
|
|
350
|
+
|
|
351
|
+
if dim is None or count is None:
|
|
352
|
+
raise ValueError("Vector dimension and count cannot be None")
|
|
353
|
+
|
|
354
|
+
return VectorDBStatus(
|
|
355
|
+
vector_dim=dim,
|
|
356
|
+
vector_count=count,
|
|
357
|
+
)
|
|
358
|
+
|
|
359
|
+
def clear(self) -> None:
|
|
360
|
+
r"""Reset the vector table by dropping and recreating it."""
|
|
361
|
+
self._drop_table()
|
|
362
|
+
self._create_table()
|
|
363
|
+
|
|
364
|
+
def load(self) -> None:
|
|
365
|
+
r"""Load the collection hosted on cloud service."""
|
|
366
|
+
# SurrealDB doesn't require explicit loading
|
|
367
|
+
raise NotImplementedError("SurrealDB does not support loading")
|
|
368
|
+
|
|
369
|
+
@property
|
|
370
|
+
def client(self) -> Any:
|
|
371
|
+
r"""Provides access to the underlying SurrealDB client."""
|
|
372
|
+
return self._surreal_client
|
|
@@ -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 json
|
|
15
15
|
import logging
|
|
16
16
|
import re
|
|
@@ -44,7 +44,7 @@ class TiDBStorage(BaseVectorStorage):
|
|
|
44
44
|
r"""An implementation of the `BaseVectorStorage` for interacting with TiDB.
|
|
45
45
|
|
|
46
46
|
The detailed information about TiDB is available at:
|
|
47
|
-
`TiDB Vector Search <https://
|
|
47
|
+
`TiDB Vector Search <https://pingcap.com/ai>`_
|
|
48
48
|
|
|
49
49
|
Args:
|
|
50
50
|
vector_dim (int): The dimension of storing vectors.
|
|
@@ -107,10 +107,10 @@ class TiDBStorage(BaseVectorStorage):
|
|
|
107
107
|
)
|
|
108
108
|
|
|
109
109
|
def _get_table_model(self, collection_name: str) -> Any:
|
|
110
|
+
from pytidb.datatype import JSON # type: ignore[import-not-found]
|
|
110
111
|
from pytidb.schema import Field, TableModel, VectorField
|
|
111
|
-
from sqlalchemy import JSON
|
|
112
112
|
|
|
113
|
-
class
|
|
113
|
+
class VectorDBRecordBase(TableModel, table=False):
|
|
114
114
|
id: Optional[str] = Field(None, primary_key=True)
|
|
115
115
|
vector: list[float] = VectorField(self.vector_dim)
|
|
116
116
|
payload: Optional[dict[str, Any]] = Field(None, sa_type=JSON)
|
|
@@ -119,7 +119,7 @@ class TiDBStorage(BaseVectorStorage):
|
|
|
119
119
|
# class names.
|
|
120
120
|
return type(
|
|
121
121
|
f"VectorDBRecord_{collection_name}",
|
|
122
|
-
(
|
|
122
|
+
(VectorDBRecordBase,),
|
|
123
123
|
{"__tablename__": collection_name},
|
|
124
124
|
table=True,
|
|
125
125
|
)
|
|
@@ -128,8 +128,10 @@ class TiDBStorage(BaseVectorStorage):
|
|
|
128
128
|
r"""Opens an existing table or creates a new table in TiDB."""
|
|
129
129
|
table = self._client.open_table(self.collection_name)
|
|
130
130
|
if table is None:
|
|
131
|
+
table_model = self._get_table_model(self.collection_name)
|
|
131
132
|
table = self._client.create_table(
|
|
132
|
-
schema=
|
|
133
|
+
schema=table_model,
|
|
134
|
+
if_exists="skip", # type: ignore[call-arg]
|
|
133
135
|
)
|
|
134
136
|
return table
|
|
135
137
|
|
|
@@ -166,6 +168,7 @@ class TiDBStorage(BaseVectorStorage):
|
|
|
166
168
|
table.
|
|
167
169
|
"""
|
|
168
170
|
vector_count = self._table.rows()
|
|
171
|
+
|
|
169
172
|
# Get vector dimension from table schema
|
|
170
173
|
columns = self._table.columns()
|
|
171
174
|
dim_value = None
|
|
@@ -303,7 +306,7 @@ class TiDBStorage(BaseVectorStorage):
|
|
|
303
306
|
for row in rows:
|
|
304
307
|
query_results.append(
|
|
305
308
|
VectorDBQueryResult.create(
|
|
306
|
-
similarity=float(row['
|
|
309
|
+
similarity=float(row['_score']),
|
|
307
310
|
id=str(row['id']),
|
|
308
311
|
payload=row['payload'],
|
|
309
312
|
vector=row['vector'],
|