contextsynapse 1.0.0__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.
- contextsynapse/__init__.py +107 -0
- contextsynapse/__main__.py +9 -0
- contextsynapse/a2a/__init__.py +28 -0
- contextsynapse/a2a/client.py +120 -0
- contextsynapse/a2a/discovery.py +128 -0
- contextsynapse/a2a/handlers.py +164 -0
- contextsynapse/a2a/models.py +246 -0
- contextsynapse/a2a/streaming.py +92 -0
- contextsynapse/a2a/task_manager.py +275 -0
- contextsynapse/adapters/__init__.py +98 -0
- contextsynapse/adapters/_base.py +298 -0
- contextsynapse/adapters/autogen/__init__.py +4 -0
- contextsynapse/adapters/autogen/tools.py +34 -0
- contextsynapse/adapters/crewai/__init__.py +4 -0
- contextsynapse/adapters/crewai/tools.py +63 -0
- contextsynapse/adapters/langchain/__init__.py +19 -0
- contextsynapse/adapters/langchain/message_history.py +17 -0
- contextsynapse/adapters/langchain/retriever.py +158 -0
- contextsynapse/adapters/langchain/tools.py +43 -0
- contextsynapse/adapters/langgraph/__init__.py +21 -0
- contextsynapse/adapters/langgraph/checkpoint.py +223 -0
- contextsynapse/adapters/langgraph/context_tools.py +341 -0
- contextsynapse/adapters/langgraph/message_history.py +138 -0
- contextsynapse/adapters/langgraph/tools.py +43 -0
- contextsynapse/adapters/llamaindex/__init__.py +4 -0
- contextsynapse/adapters/llamaindex/tools.py +64 -0
- contextsynapse/adapters/openai/__init__.py +24 -0
- contextsynapse/adapters/openai/tools.py +206 -0
- contextsynapse/adapters/pydantic_ai/__init__.py +4 -0
- contextsynapse/adapters/pydantic_ai/tools.py +36 -0
- contextsynapse/adapters/swarm/__init__.py +4 -0
- contextsynapse/adapters/swarm/tools.py +44 -0
- contextsynapse/agents/__init__.py +6 -0
- contextsynapse/agents/auto_capture.py +80 -0
- contextsynapse/agents/dispatcher.py +299 -0
- contextsynapse/agents/notifications.py +112 -0
- contextsynapse/aiql/__init__.py +71 -0
- contextsynapse/aiql/cache.py +341 -0
- contextsynapse/aiql/compiler/__init__.py +62 -0
- contextsynapse/aiql/compiler/optimizer.py +126 -0
- contextsynapse/aiql/compiler/planner.py +366 -0
- contextsynapse/aiql/compiler/statistics.py +235 -0
- contextsynapse/aiql/compiler/validator.py +425 -0
- contextsynapse/aiql/engine/__init__.py +11 -0
- contextsynapse/aiql/engine/chunk_storage.py +2584 -0
- contextsynapse/aiql/engine/executor.py +7737 -0
- contextsynapse/aiql/engine/extraction_integration.py +442 -0
- contextsynapse/aiql/engine/graph_builder.py +405 -0
- contextsynapse/aiql/engine/node_creation_from_normalized.py +691 -0
- contextsynapse/aiql/engine/performance_monitor.py +289 -0
- contextsynapse/aiql/engine/postprocessing.py +365 -0
- contextsynapse/aiql/engine/ray_stage_executors.py +918 -0
- contextsynapse/aiql/engine/redis_cache.py +106 -0
- contextsynapse/aiql/engine/streaming_json.py +366 -0
- contextsynapse/aiql/engine/streaming_parquet.py +568 -0
- contextsynapse/aiql/engine/streaming_ray_chunking.py +419 -0
- contextsynapse/aiql/grammar/__init__.py +14 -0
- contextsynapse/aiql/grammar/aiql_grammar.py +1822 -0
- contextsynapse/aiql/grammar/base.py +71 -0
- contextsynapse/aiql/parser/__init__.py +46 -0
- contextsynapse/aiql/parser/aiql_parser.py +11330 -0
- contextsynapse/aiql/parser/base_parser.py +47 -0
- contextsynapse/api/__init__.py +5 -0
- contextsynapse/api/a2a_router.py +233 -0
- contextsynapse/api/admin_router.py +140 -0
- contextsynapse/api/agent_worker_router.py +978 -0
- contextsynapse/api/algorithms_router.py +317 -0
- contextsynapse/api/api.py +4144 -0
- contextsynapse/api/audit.py +204 -0
- contextsynapse/api/auth.py +441 -0
- contextsynapse/api/auth_router.py +537 -0
- contextsynapse/api/billing.py +261 -0
- contextsynapse/api/billing_router.py +275 -0
- contextsynapse/api/boundary_router.py +452 -0
- contextsynapse/api/cognition_router.py +116 -0
- contextsynapse/api/connector_router.py +237 -0
- contextsynapse/api/context_router.py +1619 -0
- contextsynapse/api/dashboard_router.py +11367 -0
- contextsynapse/api/errors.py +183 -0
- contextsynapse/api/events.py +88 -0
- contextsynapse/api/experiment_bootstrap.py +321 -0
- contextsynapse/api/experiment_orchestrator.py +1078 -0
- contextsynapse/api/experiment_router.py +2089 -0
- contextsynapse/api/feature_gate.py +89 -0
- contextsynapse/api/federation_router.py +108 -0
- contextsynapse/api/integrations.py +567 -0
- contextsynapse/api/integrations_router.py +461 -0
- contextsynapse/api/intelligence_router.py +1028 -0
- contextsynapse/api/metering.py +155 -0
- contextsynapse/api/metrics.py +112 -0
- contextsynapse/api/models.py +38 -0
- contextsynapse/api/monitoring_router.py +174 -0
- contextsynapse/api/pipeline_router.py +1437 -0
- contextsynapse/api/playground_conn.py +116 -0
- contextsynapse/api/projects_router.py +131 -0
- contextsynapse/api/queries_router.py +282 -0
- contextsynapse/api/quota.py +95 -0
- contextsynapse/api/rate_limit.py +64 -0
- contextsynapse/api/search_router.py +261 -0
- contextsynapse/api/shield_router.py +447 -0
- contextsynapse/api/tenant_guard.py +103 -0
- contextsynapse/api/tenant_quotas.py +231 -0
- contextsynapse/api/tenants.py +305 -0
- contextsynapse/api/users.py +646 -0
- contextsynapse/api/v1.py +167 -0
- contextsynapse/api/vertical_builder_router.py +387 -0
- contextsynapse/benchmark/__init__.py +15 -0
- contextsynapse/benchmark/__main__.py +64 -0
- contextsynapse/benchmark/agents.py +338 -0
- contextsynapse/benchmark/live_ab.py +338 -0
- contextsynapse/benchmark/reporter.py +149 -0
- contextsynapse/benchmark/runner.py +264 -0
- contextsynapse/benchmark/savings.py +266 -0
- contextsynapse/benchmark/token_counter.py +212 -0
- contextsynapse/benchmark/workloads.py +289 -0
- contextsynapse/buffer/__init__.py +154 -0
- contextsynapse/buffer/base.py +257 -0
- contextsynapse/buffer/duckdb_buffer.py +246 -0
- contextsynapse/buffer/file_buffer.py +229 -0
- contextsynapse/buffer/lmdb_buffer.py +286 -0
- contextsynapse/buffer/local_buffer.py +154 -0
- contextsynapse/buffer/redis_buffer.py +211 -0
- contextsynapse/buffer/sqlite_buffer.py +266 -0
- contextsynapse/cache.py +2 -0
- contextsynapse/cli/__init__.py +40 -0
- contextsynapse/cli/cli.py +475 -0
- contextsynapse/cli/config_cli.py +177 -0
- contextsynapse/cli/scaffold.py +465 -0
- contextsynapse/cognition/__init__.py +31 -0
- contextsynapse/cognition/derivation.py +55 -0
- contextsynapse/cognition/events.py +135 -0
- contextsynapse/cognition/feedback.py +52 -0
- contextsynapse/cognition/hallucination.py +90 -0
- contextsynapse/cognition/invalidation.py +70 -0
- contextsynapse/cognition/read_tracker.py +50 -0
- contextsynapse/collaboration.py +2 -0
- contextsynapse/comparison.py +2 -0
- contextsynapse/config/__init__.py +10 -0
- contextsynapse/config/connectors/amfi_nav.yaml +18 -0
- contextsynapse/config/connectors/auto_sector.yaml +20 -0
- contextsynapse/config/connectors/banking_sector.yaml +20 -0
- contextsynapse/config/connectors/energy_sector.yaml +20 -0
- contextsynapse/config/connectors/fmcg_sector.yaml +20 -0
- contextsynapse/config/connectors/nsdl_fpi.yaml +9 -0
- contextsynapse/config/connectors/nse_price.yaml +61 -0
- contextsynapse/config/connectors/pharma_sector.yaml +20 -0
- contextsynapse/config/connectors/rbi_dbie.yaml +12 -0
- contextsynapse/config/context_presets/ai_research.json +25 -0
- contextsynapse/config/context_presets/chatgpt_conversations.json +19 -0
- contextsynapse/config/context_presets/claude_conversations.json +19 -0
- contextsynapse/config/context_presets/legal_compliance.json +21 -0
- contextsynapse/config/context_presets/meeting_notes.json +21 -0
- contextsynapse/config/context_presets/slack_engineering.json +21 -0
- contextsynapse/config/context_presets/tech_climate.json +24 -0
- contextsynapse/config/context_presets/toi_politics.json +25 -0
- contextsynapse/config/database_config.py +453 -0
- contextsynapse/config/deployment.py +221 -0
- contextsynapse/config/gpt_action_schema.json +164 -0
- contextsynapse/config/indicators/india_macro.yaml +213 -0
- contextsynapse/config/logging_config.py +88 -0
- contextsynapse/config/mode_config.py +223 -0
- contextsynapse/config/schemas/api_spec.yaml +48 -0
- contextsynapse/config/schemas/architecture_doc.yaml +51 -0
- contextsynapse/config/schemas/chat_history.yaml +90 -0
- contextsynapse/config/schemas/chatgpt_conversation.yaml +101 -0
- contextsynapse/config/schemas/claude_conversation.yaml +148 -0
- contextsynapse/config/schemas/contract.yaml +48 -0
- contextsynapse/config/schemas/conversation.yaml +167 -0
- contextsynapse/config/schemas/database.yaml +74 -0
- contextsynapse/config/schemas/decision.yaml +72 -0
- contextsynapse/config/schemas/ecommerce.yaml +56 -0
- contextsynapse/config/schemas/education.yaml +42 -0
- contextsynapse/config/schemas/healthcare.yaml +133 -0
- contextsynapse/config/schemas/hr_document.yaml +48 -0
- contextsynapse/config/schemas/invoice.yaml +40 -0
- contextsynapse/config/schemas/knowledge_base.yaml +75 -0
- contextsynapse/config/schemas/legal.yaml +42 -0
- contextsynapse/config/schemas/marketing_content.yaml +48 -0
- contextsynapse/config/schemas/meeting_notes.yaml +51 -0
- contextsynapse/config/schemas/news_article.yaml +61 -0
- contextsynapse/config/schemas/real_estate.yaml +49 -0
- contextsynapse/config/schemas/requirements_doc.yaml +48 -0
- contextsynapse/config/schemas/research_paper.yaml +56 -0
- contextsynapse/config/schemas/resume.yaml +49 -0
- contextsynapse/config/schemas/retail.yaml +42 -0
- contextsynapse/config/schemas/rule_meta.yaml +173 -0
- contextsynapse/config/schemas/rules.yaml +72 -0
- contextsynapse/config/schemas/screener_meta.yaml +236 -0
- contextsynapse/config/schemas/sdlc.yaml +103 -0
- contextsynapse/config/schemas/session_graph.yaml +172 -0
- contextsynapse/config/schemas/support_ticket.yaml +48 -0
- contextsynapse/config/schemas/web.yaml +64 -0
- contextsynapse/config/sensors/earnings_calendar.yaml +52 -0
- contextsynapse/config/sensors/global_risk.yaml +53 -0
- contextsynapse/config/sensors/government_policy.yaml +54 -0
- contextsynapse/config/sensors/supply_chain.yaml +50 -0
- contextsynapse/config/sensors/templates/behavioral.yaml +56 -0
- contextsynapse/config/sensors/templates/equity_sentiment.yaml +48 -0
- contextsynapse/config/sensors/templates/global_macro.yaml +47 -0
- contextsynapse/config/sensors/templates/market_data.yaml +118 -0
- contextsynapse/config/sensors/templates/sector_technical.yaml +47 -0
- contextsynapse/config/sensors/weather.yaml +52 -0
- contextsynapse/config/storage_strategy.py +202 -0
- contextsynapse/config/templates/competitive_intel.yaml +39 -0
- contextsynapse/config/templates/geopolitical_risk.yaml +46 -0
- contextsynapse/config/templates/market_analysis.yaml +58 -0
- contextsynapse/connectors/__init__.py +15 -0
- contextsynapse/connectors/api_router.py +121 -0
- contextsynapse/connectors/base.py +357 -0
- contextsynapse/connectors/financial/audio.py +170 -0
- contextsynapse/connectors/financial/youtube.py +272 -0
- contextsynapse/connectors/github.py +164 -0
- contextsynapse/connectors/jira.py +120 -0
- contextsynapse/connectors/kafka_connector.py +124 -0
- contextsynapse/connectors/pipeline_connector.py +747 -0
- contextsynapse/connectors/registry.py +116 -0
- contextsynapse/connectors/scheduler.py +87 -0
- contextsynapse/connectors/universal.py +360 -0
- contextsynapse/context/__init__.py +96 -0
- contextsynapse/context/__main__.py +4 -0
- contextsynapse/context/acl.py +125 -0
- contextsynapse/context/agent_card.py +201 -0
- contextsynapse/context/agent_memory.py +814 -0
- contextsynapse/context/agents.py +472 -0
- contextsynapse/context/agents_redis.py +391 -0
- contextsynapse/context/assembled.py +204 -0
- contextsynapse/context/attribution.py +113 -0
- contextsynapse/context/blob.py +184 -0
- contextsynapse/context/boundaries.py +187 -0
- contextsynapse/context/boundary.py +507 -0
- contextsynapse/context/bundle.py +155 -0
- contextsynapse/context/cli.py +519 -0
- contextsynapse/context/collaboration.py +165 -0
- contextsynapse/context/compiler.py +604 -0
- contextsynapse/context/composite.py +536 -0
- contextsynapse/context/compression.py +147 -0
- contextsynapse/context/context_manager.py +888 -0
- contextsynapse/context/context_schema.py +90 -0
- contextsynapse/context/context_schema.yaml +105 -0
- contextsynapse/context/context_units.py +891 -0
- contextsynapse/context/conversation.py +488 -0
- contextsynapse/context/dedup.py +207 -0
- contextsynapse/context/document_processor.py +698 -0
- contextsynapse/context/embedding_hooks.py +338 -0
- contextsynapse/context/execution_schema.py +274 -0
- contextsynapse/context/fan_out.py +138 -0
- contextsynapse/context/frozen.py +80 -0
- contextsynapse/context/gravity.py +227 -0
- contextsynapse/context/hub.py +1401 -0
- contextsynapse/context/ingest.py +391 -0
- contextsynapse/context/injection.py +226 -0
- contextsynapse/context/interaction_graphifier.py +562 -0
- contextsynapse/context/layers.py +574 -0
- contextsynapse/context/projection.py +1195 -0
- contextsynapse/context/promotion.py +634 -0
- contextsynapse/context/proof.py +131 -0
- contextsynapse/context/propagation.py +577 -0
- contextsynapse/context/pubsub.py +135 -0
- contextsynapse/context/quality.py +1054 -0
- contextsynapse/context/quality_tracker.py +270 -0
- contextsynapse/context/scoping.py +370 -0
- contextsynapse/context/seed.py +992 -0
- contextsynapse/context/session.py +1142 -0
- contextsynapse/context/session_graph.py +593 -0
- contextsynapse/context/session_memory.py +309 -0
- contextsynapse/context/session_resolver.py +111 -0
- contextsynapse/context/skill_learning.py +237 -0
- contextsynapse/context/smart_budget.py +129 -0
- contextsynapse/context/source_policy.py +242 -0
- contextsynapse/context/store_factory.py +53 -0
- contextsynapse/context/sync.py +648 -0
- contextsynapse/context/token.py +236 -0
- contextsynapse/context/vector_integration.py +297 -0
- contextsynapse/context/webhooks.py +194 -0
- contextsynapse/context/working_memory.py +224 -0
- contextsynapse/core/__init__.py +18 -0
- contextsynapse/core/archiver.py +237 -0
- contextsynapse/core/change_stream.py +282 -0
- contextsynapse/core/checkpoint.py +310 -0
- contextsynapse/core/cloud_storage.py +387 -0
- contextsynapse/core/context_state.py +651 -0
- contextsynapse/core/cron.py +324 -0
- contextsynapse/core/datasource.py +643 -0
- contextsynapse/core/db.py +289 -0
- contextsynapse/core/federation.py +283 -0
- contextsynapse/core/graph_coordinator.py +201 -0
- contextsynapse/core/graph_intelligence.py +388 -0
- contextsynapse/core/graph_structures.py +106 -0
- contextsynapse/core/graph_sync.py +157 -0
- contextsynapse/core/hybrid_graph_storage.py +2998 -0
- contextsynapse/core/lifecycle.py +691 -0
- contextsynapse/core/multiworker.py +378 -0
- contextsynapse/core/pruning.py +312 -0
- contextsynapse/core/redis_registry.py +524 -0
- contextsynapse/core/registry.py +1043 -0
- contextsynapse/core/registry_factory.py +51 -0
- contextsynapse/core/registry_metadata.py +294 -0
- contextsynapse/core/replay.py +354 -0
- contextsynapse/core/replication.py +339 -0
- contextsynapse/core/time_travel.py +260 -0
- contextsynapse/core/write_behind.py +152 -0
- contextsynapse/core/write_context.py +39 -0
- contextsynapse/db/__init__.py +1 -0
- contextsynapse/db/postgres.py +267 -0
- contextsynapse/db/profile.py +236 -0
- contextsynapse/db/rules.py +328 -0
- contextsynapse/demo/__init__.py +0 -0
- contextsynapse/demo/report.py +147 -0
- contextsynapse/demo/runner.py +520 -0
- contextsynapse/demo/scenario.py +165 -0
- contextsynapse/demo/session_demo.py +280 -0
- contextsynapse/demo/session_report.py +143 -0
- contextsynapse/demo/universal_runner.py +257 -0
- contextsynapse/engine/__init__.py +15 -0
- contextsynapse/engine/core.py +555 -0
- contextsynapse/extraction/__init__.py +69 -0
- contextsynapse/extraction/cli.py +274 -0
- contextsynapse/extraction/config.py +107 -0
- contextsynapse/extraction/examples/example_usage.py +118 -0
- contextsynapse/extraction/examples/sample_manifest.json +53 -0
- contextsynapse/extraction/examples/sample_normalized.json +185 -0
- contextsynapse/extraction/extract_engine.py +440 -0
- contextsynapse/extraction/extractors/__init__.py +37 -0
- contextsynapse/extraction/extractors/chat_export_extractor.py +189 -0
- contextsynapse/extraction/extractors/csv_extractor.py +83 -0
- contextsynapse/extraction/extractors/docx_extractor.py +129 -0
- contextsynapse/extraction/extractors/excel_extractor.py +152 -0
- contextsynapse/extraction/extractors/html_extractor.py +146 -0
- contextsynapse/extraction/extractors/pdf_extractor.py +635 -0
- contextsynapse/extraction/extractors/pdf_extractor_layoutparser.py +408 -0
- contextsynapse/extraction/extractors/register_extractors.py +63 -0
- contextsynapse/extraction/extractors/text_extractor.py +65 -0
- contextsynapse/extraction/extractors/txt_extractor.py +120 -0
- contextsynapse/extraction/extractors/website_extractor.py +246 -0
- contextsynapse/extraction/fact_extractor.py +236 -0
- contextsynapse/extraction/file_manager.py +353 -0
- contextsynapse/extraction/hierarchy.py +239 -0
- contextsynapse/extraction/id_generator.py +450 -0
- contextsynapse/extraction/layout_detector.py +409 -0
- contextsynapse/extraction/llm_entity_extractor.py +301 -0
- contextsynapse/extraction/normalized_store.py +480 -0
- contextsynapse/extraction/normalizer.py +594 -0
- contextsynapse/extraction/parquet_writer.py +598 -0
- contextsynapse/extraction/post_processors/__init__.py +40 -0
- contextsynapse/extraction/post_processors/column_reorganizer.py +507 -0
- contextsynapse/extraction/ray_normalization.py +233 -0
- contextsynapse/extraction/ray_runner.py +207 -0
- contextsynapse/extraction/redis_schema_registry.py +222 -0
- contextsynapse/extraction/registry.py +204 -0
- contextsynapse/extraction/schema_loader.py +663 -0
- contextsynapse/extraction/schema_registry.py +230 -0
- contextsynapse/extraction/semantic_normalizer.py +245 -0
- contextsynapse/extraction/version_manager.py +314 -0
- contextsynapse/gateway/__init__.py +24 -0
- contextsynapse/gateway/action_emitter.py +212 -0
- contextsynapse/gateway/cost_tracker.py +508 -0
- contextsynapse/gateway/gateway.py +377 -0
- contextsynapse/gateway/policy.py +303 -0
- contextsynapse/governance/__init__.py +13 -0
- contextsynapse/governance/layer.py +513 -0
- contextsynapse/ingestion/__init__.py +15 -0
- contextsynapse/ingestion/amplifier.py +288 -0
- contextsynapse/ingestion/async_ingest.py +463 -0
- contextsynapse/ingestion/chunker.py +303 -0
- contextsynapse/ingestion/chunking.py +58 -0
- contextsynapse/ingestion/cleaner.py +190 -0
- contextsynapse/ingestion/cleanse.py +252 -0
- contextsynapse/ingestion/connectors/__init__.py +38 -0
- contextsynapse/ingestion/connectors/base.py +300 -0
- contextsynapse/ingestion/connectors/chatgpt_memory.py +247 -0
- contextsynapse/ingestion/connectors/claude_memory.py +274 -0
- contextsynapse/ingestion/connectors/sap_ingestor.py +208 -0
- contextsynapse/ingestion/content_detector.py +80 -0
- contextsynapse/ingestion/content_monitor.py +502 -0
- contextsynapse/ingestion/dedup.py +106 -0
- contextsynapse/ingestion/feed.py +640 -0
- contextsynapse/ingestion/filters.py +461 -0
- contextsynapse/ingestion/graph_builder.py +705 -0
- contextsynapse/ingestion/input_classifier.py +307 -0
- contextsynapse/ingestion/job_manager.py +571 -0
- contextsynapse/ingestion/llm_extractor.py +610 -0
- contextsynapse/ingestion/orchestrator.py +116 -0
- contextsynapse/ingestion/parsers/__init__.py +19 -0
- contextsynapse/ingestion/parsers/graph_parser_registry.py +103 -0
- contextsynapse/ingestion/parsers/graphml_parser.py +141 -0
- contextsynapse/ingestion/parsers/jsonld_parser.py +171 -0
- contextsynapse/ingestion/parsers/rdf_parser.py +150 -0
- contextsynapse/ingestion/pipeline_context.py +228 -0
- contextsynapse/ingestion/pipeline_store.py +1195 -0
- contextsynapse/ingestion/queue.py +133 -0
- contextsynapse/ingestion/reprocess.py +179 -0
- contextsynapse/ingestion/scenario_router.py +224 -0
- contextsynapse/ingestion/schema_extractor.py +759 -0
- contextsynapse/ingestion/schema_validator.py +274 -0
- contextsynapse/ingestion/sdlc_ingest.py +87 -0
- contextsynapse/ingestion/smart_ingest.py +2451 -0
- contextsynapse/ingestion/source_connector.py +171 -0
- contextsynapse/ingestion/stage_executor.py +2095 -0
- contextsynapse/ingestion/stages/__init__.py +9 -0
- contextsynapse/ingestion/stages/tabular_to_graph.py +289 -0
- contextsynapse/ingestion/strategies.py +386 -0
- contextsynapse/ingestion/universal/__init__.py +4 -0
- contextsynapse/ingestion/universal/_operator_registry.py +59 -0
- contextsynapse/ingestion/universal/ingest_content.py +32 -0
- contextsynapse/ingestion/universal/operators/__init__.py +1 -0
- contextsynapse/ingestion/universal/operators/base.py +19 -0
- contextsynapse/ingestion/universal/operators/build_edges.py +75 -0
- contextsynapse/ingestion/universal/operators/cluster_topics.py +397 -0
- contextsynapse/ingestion/universal/operators/deduplicate.py +45 -0
- contextsynapse/ingestion/universal/operators/detect_signals.py +90 -0
- contextsynapse/ingestion/universal/operators/embed.py +80 -0
- contextsynapse/ingestion/universal/operators/extract_entities.py +253 -0
- contextsynapse/ingestion/universal/operators/extract_preferences.py +117 -0
- contextsynapse/ingestion/universal/operators/filter_content.py +69 -0
- contextsynapse/ingestion/universal/operators/index_bm25.py +52 -0
- contextsynapse/ingestion/universal/operators/infer_domains.py +69 -0
- contextsynapse/ingestion/universal/operators/link_cross_reference.py +210 -0
- contextsynapse/ingestion/universal/operators/parse_records.py +66 -0
- contextsynapse/ingestion/universal/operators/resolve_entities.py +261 -0
- contextsynapse/ingestion/universal/operators/scanners/__init__.py +16 -0
- contextsynapse/ingestion/universal/operators/scanners/edges.py +173 -0
- contextsynapse/ingestion/universal/operators/scanners/git.py +187 -0
- contextsynapse/ingestion/universal/operators/scanners/github.py +135 -0
- contextsynapse/ingestion/universal/operators/scanners/github_api.py +509 -0
- contextsynapse/ingestion/universal/operators/scanners/helpers.py +67 -0
- contextsynapse/ingestion/universal/operators/scanners/jira.py +65 -0
- contextsynapse/ingestion/universal/operators/scanners/llm_enrichment.py +82 -0
- contextsynapse/ingestion/universal/operators/scanners/repo.py +149 -0
- contextsynapse/ingestion/universal/operators/sdlc_scan.py +213 -0
- contextsynapse/ingestion/universal/operators/spec_scanner.py +149 -0
- contextsynapse/ingestion/universal/operators/store_documents.py +72 -0
- contextsynapse/ingestion/universal/operators/synthesize_cu.py +180 -0
- contextsynapse/ingestion/universal/operators/validate_gate.py +65 -0
- contextsynapse/ingestion/universal/parsers/__init__.py +5 -0
- contextsynapse/ingestion/universal/parsers/record_parser.py +203 -0
- contextsynapse/ingestion/universal/parsers/turn_parser.py +329 -0
- contextsynapse/ingestion/universal/shared_signals.py +161 -0
- contextsynapse/ingestion/universal/stage_executor.py +219 -0
- contextsynapse/ingestion/web_crawler.py +265 -0
- contextsynapse/intelligence/__init__.py +53 -0
- contextsynapse/intelligence/alerts.py +198 -0
- contextsynapse/intelligence/collector.py +655 -0
- contextsynapse/intelligence/comparison.py +198 -0
- contextsynapse/intelligence/config.py +56 -0
- contextsynapse/intelligence/conflict_detector.py +182 -0
- contextsynapse/intelligence/context_gaps.py +192 -0
- contextsynapse/intelligence/context_radar.py +135 -0
- contextsynapse/intelligence/correlation_engine.py +416 -0
- contextsynapse/intelligence/correlation_template.py +120 -0
- contextsynapse/intelligence/dedup.py +296 -0
- contextsynapse/intelligence/event_bus.py +91 -0
- contextsynapse/intelligence/feedback_loop.py +101 -0
- contextsynapse/intelligence/freshness.py +307 -0
- contextsynapse/intelligence/fundamental_feed.py +551 -0
- contextsynapse/intelligence/geo_data.py +170 -0
- contextsynapse/intelligence/geo_reference.py +112 -0
- contextsynapse/intelligence/graph_fusion.py +465 -0
- contextsynapse/intelligence/heuristics.py +176 -0
- contextsynapse/intelligence/impact_tracker.py +336 -0
- contextsynapse/intelligence/macro_indicators.py +319 -0
- contextsynapse/intelligence/ocr.py +104 -0
- contextsynapse/intelligence/persistence.py +267 -0
- contextsynapse/intelligence/pipeline_health.py +130 -0
- contextsynapse/intelligence/price_feed.py +221 -0
- contextsynapse/intelligence/rate_limiter.py +130 -0
- contextsynapse/intelligence/reactive.py +411 -0
- contextsynapse/intelligence/runtime_context.py +390 -0
- contextsynapse/intelligence/sentiment_decay.py +426 -0
- contextsynapse/intelligence/session.py +277 -0
- contextsynapse/intelligence/signal_hierarchy.py +438 -0
- contextsynapse/intelligence/signals.py +185 -0
- contextsynapse/intelligence/source_watcher.py +132 -0
- contextsynapse/intelligence/table_enricher.py +256 -0
- contextsynapse/intelligence/tagger.py +319 -0
- contextsynapse/intelligence/timeseries.py +209 -0
- contextsynapse/intelligence/tracker.py +318 -0
- contextsynapse/intelligence/watchdog.py +392 -0
- contextsynapse/intelligence/watchdog_manager.py +263 -0
- contextsynapse/intelligence/webhook_receiver.py +165 -0
- contextsynapse/intelligence/weight_learner.py +234 -0
- contextsynapse/llm/__init__.py +8 -0
- contextsynapse/llm/client.py +348 -0
- contextsynapse/llm/rate_limiter.py +166 -0
- contextsynapse/logging_config.py +2 -0
- contextsynapse/marketplace/__init__.py +7 -0
- contextsynapse/marketplace/registry.py +173 -0
- contextsynapse/mcp/__init__.py +11 -0
- contextsynapse/mcp/__main__.py +4 -0
- contextsynapse/mcp/auth_middleware.py +212 -0
- contextsynapse/mcp/connection_pool.py +128 -0
- contextsynapse/mcp/server.py +986 -0
- contextsynapse/mcp/session_context.py +67 -0
- contextsynapse/memory/__init__.py +34 -0
- contextsynapse/memory/engine.py +475 -0
- contextsynapse/memory/temporal.py +327 -0
- contextsynapse/metadata/__init__.py +12 -0
- contextsynapse/metadata/metadata_db.py +272 -0
- contextsynapse/metadata/metadata_query_tool.py +300 -0
- contextsynapse/metadata/metadata_tracker.py +425 -0
- contextsynapse/models/__init__.py +27 -0
- contextsynapse/models/embedding_service.py +360 -0
- contextsynapse/models/model_registry.py +228 -0
- contextsynapse/multiworker.py +2 -0
- contextsynapse/pipelines/__init__.py +1 -0
- contextsynapse/pipelines/executor.py +851 -0
- contextsynapse/pipelines/filters.py +189 -0
- contextsynapse/pipelines/models.py +176 -0
- contextsynapse/pipelines/scheduler.py +268 -0
- contextsynapse/playground/__init__.py +1 -0
- contextsynapse/playground/templates.py +85 -0
- contextsynapse/plugins/__init__.py +43 -0
- contextsynapse/plugins/api.py +66 -0
- contextsynapse/plugins/base.py +350 -0
- contextsynapse/plugins/domain_interface.py +508 -0
- contextsynapse/plugins/domain_loader.py +241 -0
- contextsynapse/plugins/loader.py +148 -0
- contextsynapse/plugins/registry.py +265 -0
- contextsynapse/project/__init__.py +11 -0
- contextsynapse/project/code_context.py +807 -0
- contextsynapse/project/connectors/__init__.py +4 -0
- contextsynapse/project/connectors/github_connector.py +113 -0
- contextsynapse/project/connectors/jira_connector.py +160 -0
- contextsynapse/project/graph.py +1023 -0
- contextsynapse/project/project_context.py +545 -0
- contextsynapse/project/scanner_registry.py +61 -0
- contextsynapse/project/schema_manager.py +322 -0
- contextsynapse/project/schemas/knowledge.yaml +59 -0
- contextsynapse/project/schemas/sdlc.yaml +369 -0
- contextsynapse/project/sdlc_schema.py +172 -0
- contextsynapse/project/spec_parser.py +85 -0
- contextsynapse/project/task_lock.py +181 -0
- contextsynapse/project/task_stream.py +203 -0
- contextsynapse/project/team_tools.py +537 -0
- contextsynapse/py.typed +0 -0
- contextsynapse/realtime/__init__.py +6 -0
- contextsynapse/realtime/collaboration.py +147 -0
- contextsynapse/rules/__init__.py +10 -0
- contextsynapse/rules/engine.py +116 -0
- contextsynapse/rules/evaluators/__init__.py +6 -0
- contextsynapse/rules/evaluators/aggregate.py +205 -0
- contextsynapse/rules/evaluators/custom.py +170 -0
- contextsynapse/rules/evaluators/pre_action.py +125 -0
- contextsynapse/rules/evaluators/temporal.py +129 -0
- contextsynapse/rules/loader.py +52 -0
- contextsynapse/rules/models.py +124 -0
- contextsynapse/rules/universal.py +393 -0
- contextsynapse/scheduler.py +229 -0
- contextsynapse/schema/__init__.py +42 -0
- contextsynapse/schema/compiler.py +252 -0
- contextsynapse/schema/composer.py +158 -0
- contextsynapse/schema/dedup.py +73 -0
- contextsynapse/schema/derivation.py +172 -0
- contextsynapse/schema/sdl.py +326 -0
- contextsynapse/schema/validation_gate.py +124 -0
- contextsynapse/sdk/__init__.py +63 -0
- contextsynapse/sdk/agent.py +214 -0
- contextsynapse/sdk/client.py +269 -0
- contextsynapse/sdk/exceptions.py +23 -0
- contextsynapse/sdk/models.py +78 -0
- contextsynapse/sdk/session.py +408 -0
- contextsynapse/sdk/tracked.py +218 -0
- contextsynapse/sdk/worker.py +266 -0
- contextsynapse/sdk/workspace_client.py +98 -0
- contextsynapse/sdk/ws.py +41 -0
- contextsynapse/search/__init__.py +20 -0
- contextsynapse/search/embedding_cache.py +140 -0
- contextsynapse/search/enhanced_search.py +152 -0
- contextsynapse/search/fulltext.py +130 -0
- contextsynapse/search/graph_search.py +634 -0
- contextsynapse/search/lmdb_index.py +1218 -0
- contextsynapse/search/nl_to_aiql.py +199 -0
- contextsynapse/search/rag.py +1346 -0
- contextsynapse/search/rag_cache.py +167 -0
- contextsynapse/search/reasoning_chain.py +231 -0
- contextsynapse/search/redis_search.py +207 -0
- contextsynapse/search/retrieval_quality.py +314 -0
- contextsynapse/search/semantic_query.py +455 -0
- contextsynapse/search/text_resolver.py +159 -0
- contextsynapse/search/whoosh_search.py +373 -0
- contextsynapse/security/__init__.py +17 -0
- contextsynapse/security/audit.py +297 -0
- contextsynapse/security/audit_logger.py +97 -0
- contextsynapse/security/audit_trail.py +270 -0
- contextsynapse/security/auth_unified.py +284 -0
- contextsynapse/security/auto_tagger.py +230 -0
- contextsynapse/security/data_security.py +218 -0
- contextsynapse/security/encryption.py +207 -0
- contextsynapse/security/identity.py +447 -0
- contextsynapse/security/jwt_identity.py +59 -0
- contextsynapse/security/middleware.py +336 -0
- contextsynapse/security/pii.py +233 -0
- contextsynapse/security/rbac.py +96 -0
- contextsynapse/security/rls.py +205 -0
- contextsynapse/security/sanitize.py +233 -0
- contextsynapse/security/scoped_encryption.py +131 -0
- contextsynapse/security/tenant.py +401 -0
- contextsynapse/shield/__init__.py +21 -0
- contextsynapse/shield/anomaly.py +56 -0
- contextsynapse/shield/permissions.py +99 -0
- contextsynapse/shield/profile.py +103 -0
- contextsynapse/shield/shield.py +108 -0
- contextsynapse/shield/trust_engine.py +69 -0
- contextsynapse/skills/__init__.py +14 -0
- contextsynapse/skills/engine.py +233 -0
- contextsynapse/skills/loader.py +59 -0
- contextsynapse/skills/models.py +139 -0
- contextsynapse/storage/__init__.py +7 -0
- contextsynapse/storage/cache.py +208 -0
- contextsynapse/storage/columnar_store_v2.py +178 -0
- contextsynapse/storage/csr_graph_storage.py +587 -0
- contextsynapse/storage/csr_store.py +388 -0
- contextsynapse/storage/document_store.py +491 -0
- contextsynapse/storage/hnsw_index.py +294 -0
- contextsynapse/storage/hybrid_store_v2.py +278 -0
- contextsynapse/storage/lmdb_graph_storage.py +366 -0
- contextsynapse/storage/migration.py +279 -0
- contextsynapse/storage/namespace_store.py +346 -0
- contextsynapse/storage/pure_graph_storage.py +185 -0
- contextsynapse/storage/redis_graph_adapter.py +186 -0
- contextsynapse/storage/redis_graph_storage.py +375 -0
- contextsynapse/storage/router/__init__.py +29 -0
- contextsynapse/storage/router/duckdb_store.py +398 -0
- contextsynapse/storage/router/factory.py +83 -0
- contextsynapse/storage/router/interface.py +125 -0
- contextsynapse/storage/router/postgres_store.py +339 -0
- contextsynapse/storage/router/resolver.py +192 -0
- contextsynapse/storage/router/router.py +300 -0
- contextsynapse/storage/single_file_storage.py +391 -0
- contextsynapse/storage/storage_manager.py +214 -0
- contextsynapse/storage/storage_query_optimizer.py +314 -0
- contextsynapse/storage/wal.py +359 -0
- contextsynapse/temporal/__init__.py +0 -0
- contextsynapse/temporal/storage.py +106 -0
- contextsynapse/tests/__init__.py +11 -0
- contextsynapse/tests/regression/__init__.py +1 -0
- contextsynapse/tests/regression/add_metadata.py +395 -0
- contextsynapse/tests/regression/add_skip_flags.py +85 -0
- contextsynapse/tests/regression/cases/test_basic_create_node.yaml +20 -0
- contextsynapse/tests/regression/cases/test_basic_select.yaml +21 -0
- contextsynapse/tests/regression/cases/test_blockchain_audit_trail.yaml +37 -0
- contextsynapse/tests/regression/cases/test_blockchain_audit_trail_filtered.yaml +39 -0
- contextsynapse/tests/regression/cases/test_blockchain_blocks_range.yaml +39 -0
- contextsynapse/tests/regression/cases/test_blockchain_get_block.yaml +35 -0
- contextsynapse/tests/regression/cases/test_blockchain_latest_block.yaml +35 -0
- contextsynapse/tests/regression/cases/test_blockchain_length.yaml +37 -0
- contextsynapse/tests/regression/cases/test_blockchain_merkle_root.yaml +37 -0
- contextsynapse/tests/regression/cases/test_blockchain_verify.yaml +35 -0
- contextsynapse/tests/regression/cases/test_blockchain_verify_block.yaml +35 -0
- contextsynapse/tests/regression/cases/test_create_edge.yaml +28 -0
- contextsynapse/tests/regression/cases/test_delete_edge_basic.yaml +29 -0
- contextsynapse/tests/regression/cases/test_delete_node_basic.yaml +29 -0
- contextsynapse/tests/regression/cases/test_evaluation_mrr.yaml +40 -0
- contextsynapse/tests/regression/cases/test_evaluation_ndcg.yaml +40 -0
- contextsynapse/tests/regression/cases/test_evaluation_precision.yaml +40 -0
- contextsynapse/tests/regression/cases/test_evaluation_recall.yaml +40 -0
- contextsynapse/tests/regression/cases/test_group_by_basic.yaml +56 -0
- contextsynapse/tests/regression/cases/test_match_node_basic.yaml +29 -0
- contextsynapse/tests/regression/cases/test_match_node_with_order_limit.yaml +31 -0
- contextsynapse/tests/regression/cases/test_namespace_switch.yaml +18 -0
- contextsynapse/tests/regression/cases/test_pipeline_cascaded.yaml +61 -0
- contextsynapse/tests/regression/cases/test_pipeline_fixed_size_chunking.yaml +48 -0
- contextsynapse/tests/regression/cases/test_pipeline_gpt4_chunking.yaml +54 -0
- contextsynapse/tests/regression/cases/test_pipeline_hybrid_indexing.yaml +57 -0
- contextsynapse/tests/regression/cases/test_pipeline_large_embedding.yaml +52 -0
- contextsynapse/tests/regression/cases/test_pipeline_paragraph_chunking.yaml +49 -0
- contextsynapse/tests/regression/cases/test_pipeline_recursive_chunking.yaml +47 -0
- contextsynapse/tests/regression/cases/test_pipeline_run_pipeline.yaml +56 -0
- contextsynapse/tests/regression/cases/test_pipeline_section_based_chunking.yaml +53 -0
- contextsynapse/tests/regression/cases/test_pipeline_semantic_chunking.yaml +51 -0
- contextsynapse/tests/regression/cases/test_pipeline_with_entity_extraction.yaml +57 -0
- contextsynapse/tests/regression/cases/test_pipeline_with_relationships.yaml +62 -0
- contextsynapse/tests/regression/cases/test_rag_evaluation.yaml +38 -0
- contextsynapse/tests/regression/cases/test_rag_graph_bfs_with_eval.yaml +48 -0
- contextsynapse/tests/regression/cases/test_rag_graph_centrality.yaml +40 -0
- contextsynapse/tests/regression/cases/test_rag_graph_centrality_eval.yaml +35 -0
- contextsynapse/tests/regression/cases/test_rag_graph_community.yaml +40 -0
- contextsynapse/tests/regression/cases/test_rag_graph_community_eval.yaml +35 -0
- contextsynapse/tests/regression/cases/test_rag_graph_dfs_with_eval.yaml +35 -0
- contextsynapse/tests/regression/cases/test_rag_graph_multi_hop_eval.yaml +35 -0
- contextsynapse/tests/regression/cases/test_rag_graph_path.yaml +40 -0
- contextsynapse/tests/regression/cases/test_rag_graph_search_basic.yaml +38 -0
- contextsynapse/tests/regression/cases/test_rag_graph_search_bfs.yaml +52 -0
- contextsynapse/tests/regression/cases/test_rag_graph_search_dfs.yaml +41 -0
- contextsynapse/tests/regression/cases/test_rag_graph_search_multi_hop.yaml +43 -0
- contextsynapse/tests/regression/cases/test_rag_graph_search_shortest_path.yaml +41 -0
- contextsynapse/tests/regression/cases/test_rag_graph_search_weighted.yaml +43 -0
- contextsynapse/tests/regression/cases/test_rag_graph_shortest_path_eval.yaml +35 -0
- contextsynapse/tests/regression/cases/test_rag_graph_traversal.yaml +30 -0
- contextsynapse/tests/regression/cases/test_rag_graph_weighted_eval.yaml +35 -0
- contextsynapse/tests/regression/cases/test_rag_hybrid_search.yaml +33 -0
- contextsynapse/tests/regression/cases/test_rag_hybrid_with_prompt_embedding.yaml +44 -0
- contextsynapse/tests/regression/cases/test_rag_keyword_search.yaml +32 -0
- contextsynapse/tests/regression/cases/test_rag_multi_hop_graph.yaml +32 -0
- contextsynapse/tests/regression/cases/test_rag_path_based.yaml +34 -0
- contextsynapse/tests/regression/cases/test_rag_profile_based.yaml +32 -0
- contextsynapse/tests/regression/cases/test_rag_vector_search.yaml +32 -0
- contextsynapse/tests/regression/cases/test_rag_weighted_graph.yaml +34 -0
- contextsynapse/tests/regression/cases/test_rag_weighted_hybrid.yaml +31 -0
- contextsynapse/tests/regression/cases/test_semantic_boundary_chunking.yaml +57 -0
- contextsynapse/tests/regression/cases/test_semantic_boundary_detection.yaml +33 -0
- contextsynapse/tests/regression/cases/test_semantic_hash_function.yaml +30 -0
- contextsynapse/tests/regression/cases/test_semantic_hash_with_model.yaml +31 -0
- contextsynapse/tests/regression/cases/test_tcs_ingestion_fixed_size.yaml +44 -0
- contextsynapse/tests/regression/cases/test_tcs_ingestion_recursive.yaml +46 -0
- contextsynapse/tests/regression/cases/test_tcs_ingestion_section.yaml +46 -0
- contextsynapse/tests/regression/cases/test_tcs_ingestion_semantic.yaml +44 -0
- contextsynapse/tests/regression/cases/test_time_travel_as_of.yaml +35 -0
- contextsynapse/tests/regression/cases/test_time_travel_at_commit.yaml +33 -0
- contextsynapse/tests/regression/cases/test_time_travel_at_timestamp.yaml +33 -0
- contextsynapse/tests/regression/cases/test_time_travel_for_system_time_all.yaml +37 -0
- contextsynapse/tests/regression/cases/test_time_travel_versions_between.yaml +39 -0
- contextsynapse/tests/regression/cases/test_traverse_basic.yaml +31 -0
- contextsynapse/tests/regression/cases/test_traverse_max_depth.yaml +34 -0
- contextsynapse/tests/regression/cases/test_update_edge_basic.yaml +29 -0
- contextsynapse/tests/regression/evaluation_metrics.py +227 -0
- contextsynapse/tests/regression/regression_runner.py +1081 -0
- contextsynapse/tests/regression/setup_regression_data.py +212 -0
- contextsynapse/tests/regression/test_basic_only.py +84 -0
- contextsynapse/tests/regression/test_namespace_creation.py +29 -0
- contextsynapse/tests/regression/test_single_fix.py +61 -0
- contextsynapse/tests/regression/test_single_query.py +20 -0
- contextsynapse/tests/regression/validate_test_syntax.py +179 -0
- contextsynapse/tests/test_advanced_features.py +347 -0
- contextsynapse/tests/test_aiql_summary.py +283 -0
- contextsynapse/tests/test_all_aiql_queries.py +948 -0
- contextsynapse/tests/test_all_create_queries.py +213 -0
- contextsynapse/tests/test_api_vs_native.py +280 -0
- contextsynapse/tests/test_chunking_dedup.py +199 -0
- contextsynapse/tests/test_connectors.py +171 -0
- contextsynapse/tests/test_edges_and_match.py +202 -0
- contextsynapse/tests/test_extraction_pipeline_integration.py +581 -0
- contextsynapse/tests/test_name_property.py +224 -0
- contextsynapse/tests/test_node_edge_metadata.py +250 -0
- contextsynapse/tests/test_playground_conn.py +114 -0
- contextsynapse/tests/test_query_cache.py +213 -0
- contextsynapse/tests/test_source_policy_auth.py +348 -0
- contextsynapse/tests/test_temporal_and_domain.py +224 -0
- contextsynapse/tests/test_time_travel_e2e.py +571 -0
- contextsynapse/tests/test_traversal_and_aggregation.py +275 -0
- contextsynapse/tools/__init__.py +36 -0
- contextsynapse/tools/a2a_tools.py +106 -0
- contextsynapse/tools/cognition_tools.py +118 -0
- contextsynapse/tools/context.py +905 -0
- contextsynapse/tools/formatting.py +92 -0
- contextsynapse/tools/gateway_tools.py +186 -0
- contextsynapse/tools/graph.py +1700 -0
- contextsynapse/tools/intelligence.py +235 -0
- contextsynapse/tools/memory.py +118 -0
- contextsynapse/tools/registry.py +373 -0
- contextsynapse/tools/shield_tools.py +159 -0
- contextsynapse/tools/tasks.py +341 -0
- contextsynapse/tools/workspace_tools.py +124 -0
- contextsynapse/utils/__init__.py +15 -0
- contextsynapse/utils/config_loader.py +198 -0
- contextsynapse/utils/env_loader.py +156 -0
- contextsynapse/utils/file_utils.py +288 -0
- contextsynapse/utils/logging_optimizer.py +119 -0
- contextsynapse/vector/__init__.py +30 -0
- contextsynapse/vector/chroma_vector_store.py +152 -0
- contextsynapse/vector/custom_vector_store.py +537 -0
- contextsynapse/vector/faiss_vector_store.py +296 -0
- contextsynapse/vector/qdrant_vector_store.py +163 -0
- contextsynapse/vector/vector_db.py +953 -0
- contextsynapse/vector/vector_db_manager.py +197 -0
- contextsynapse/workspace/__init__.py +27 -0
- contextsynapse/workspace/base.py +94 -0
- contextsynapse/workspace/git.py +228 -0
- contextsynapse/workspace/github.py +78 -0
- contextsynapse/workspace/local.py +73 -0
- contextsynapse/workspace/tools.py +222 -0
- contextsynapse-1.0.0.dist-info/METADATA +847 -0
- contextsynapse-1.0.0.dist-info/RECORD +776 -0
- contextsynapse-1.0.0.dist-info/WHEEL +5 -0
- contextsynapse-1.0.0.dist-info/entry_points.txt +4 -0
- contextsynapse-1.0.0.dist-info/licenses/LICENSE +200 -0
- contextsynapse-1.0.0.dist-info/top_level.txt +1 -0
|
@@ -0,0 +1,953 @@
|
|
|
1
|
+
"""
|
|
2
|
+
AIContextDB Universal Vector Database System
|
|
3
|
+
Self-contained universal vector database with multiple provider support.
|
|
4
|
+
Extracted and adapted from QGraph Universal Vector Database.
|
|
5
|
+
"""
|
|
6
|
+
|
|
7
|
+
import asyncio
|
|
8
|
+
import numpy as np
|
|
9
|
+
import logging
|
|
10
|
+
from typing import Dict, List, Any, Optional, Union, Tuple, Callable
|
|
11
|
+
from dataclasses import dataclass
|
|
12
|
+
from enum import Enum
|
|
13
|
+
import time
|
|
14
|
+
import hashlib
|
|
15
|
+
from datetime import datetime
|
|
16
|
+
import json
|
|
17
|
+
import threading
|
|
18
|
+
from collections import defaultdict
|
|
19
|
+
import os
|
|
20
|
+
|
|
21
|
+
# Try to import various vector database libraries
|
|
22
|
+
try:
|
|
23
|
+
import faiss
|
|
24
|
+
FAISS_AVAILABLE = True
|
|
25
|
+
except ImportError:
|
|
26
|
+
FAISS_AVAILABLE = False
|
|
27
|
+
|
|
28
|
+
try:
|
|
29
|
+
import chromadb
|
|
30
|
+
CHROMA_AVAILABLE = True
|
|
31
|
+
except ImportError:
|
|
32
|
+
CHROMA_AVAILABLE = False
|
|
33
|
+
|
|
34
|
+
try:
|
|
35
|
+
import pinecone
|
|
36
|
+
PINECONE_AVAILABLE = True
|
|
37
|
+
except ImportError:
|
|
38
|
+
PINECONE_AVAILABLE = False
|
|
39
|
+
|
|
40
|
+
try:
|
|
41
|
+
import weaviate
|
|
42
|
+
WEAVIATE_AVAILABLE = True
|
|
43
|
+
except ImportError:
|
|
44
|
+
WEAVIATE_AVAILABLE = False
|
|
45
|
+
|
|
46
|
+
try:
|
|
47
|
+
import qdrant_client
|
|
48
|
+
QDRANT_AVAILABLE = True
|
|
49
|
+
except ImportError:
|
|
50
|
+
QDRANT_AVAILABLE = False
|
|
51
|
+
|
|
52
|
+
logger = logging.getLogger(__name__)
|
|
53
|
+
|
|
54
|
+
class VectorDBProvider(Enum):
|
|
55
|
+
"""Supported vector database providers."""
|
|
56
|
+
FAISS = "faiss"
|
|
57
|
+
CHROMA = "chroma"
|
|
58
|
+
PINECONE = "pinecone"
|
|
59
|
+
WEAVIATE = "weaviate"
|
|
60
|
+
QDRANT = "qdrant"
|
|
61
|
+
CUSTOM = "custom"
|
|
62
|
+
|
|
63
|
+
@dataclass
|
|
64
|
+
class VectorDBCapabilities:
|
|
65
|
+
"""Vector database capabilities."""
|
|
66
|
+
supports_metadata: bool = True
|
|
67
|
+
supports_filtering: bool = True
|
|
68
|
+
supports_batch_operations: bool = True
|
|
69
|
+
supports_upsert: bool = True
|
|
70
|
+
supports_delete: bool = True
|
|
71
|
+
supports_update: bool = True
|
|
72
|
+
supports_similarity_search: bool = True
|
|
73
|
+
supports_hybrid_search: bool = False
|
|
74
|
+
supports_quantization: bool = False
|
|
75
|
+
supports_sharding: bool = False
|
|
76
|
+
max_dimensions: int = 2048
|
|
77
|
+
max_vectors: int = 1000000
|
|
78
|
+
|
|
79
|
+
@dataclass
|
|
80
|
+
class VectorDBConfig:
|
|
81
|
+
"""Configuration for universal vector database manager."""
|
|
82
|
+
default_provider: VectorDBProvider = VectorDBProvider.FAISS
|
|
83
|
+
providers: Dict[VectorDBProvider, Dict[str, Any]] = None
|
|
84
|
+
dimension: int = 768
|
|
85
|
+
metric: str = "cosine" # cosine, euclidean, dot
|
|
86
|
+
batch_size: int = 1000
|
|
87
|
+
enable_compression: bool = False
|
|
88
|
+
enable_quantization: bool = False
|
|
89
|
+
enable_sharding: bool = False
|
|
90
|
+
shard_count: int = 4
|
|
91
|
+
cache_size: int = 10000
|
|
92
|
+
enable_logging: bool = True
|
|
93
|
+
|
|
94
|
+
@dataclass
|
|
95
|
+
class VectorResult:
|
|
96
|
+
"""Result of vector database operation."""
|
|
97
|
+
success: bool
|
|
98
|
+
data: Any = None
|
|
99
|
+
error: Optional[str] = None
|
|
100
|
+
metadata: Dict[str, Any] = None
|
|
101
|
+
|
|
102
|
+
class AIContextDBUniversalVectorDBManager:
|
|
103
|
+
"""
|
|
104
|
+
AIContextDB Universal vector database manager that supports any vector database provider.
|
|
105
|
+
"""
|
|
106
|
+
|
|
107
|
+
def __init__(self, config: Optional[VectorDBConfig] = None):
|
|
108
|
+
self.config = config or VectorDBConfig()
|
|
109
|
+
self.providers = {} # provider -> instance
|
|
110
|
+
self.collections = {} # collection_name -> provider
|
|
111
|
+
self.usage_stats = defaultdict(int)
|
|
112
|
+
self.lock = threading.Lock()
|
|
113
|
+
|
|
114
|
+
# Initialize providers
|
|
115
|
+
self._initialize_providers()
|
|
116
|
+
|
|
117
|
+
logger.info("AIContextDB Universal Vector DB Manager initialized")
|
|
118
|
+
|
|
119
|
+
def _initialize_providers(self) -> None:
|
|
120
|
+
"""Initialize vector database providers."""
|
|
121
|
+
# FAISS
|
|
122
|
+
if FAISS_AVAILABLE:
|
|
123
|
+
self.providers[VectorDBProvider.FAISS] = self._create_faiss_provider()
|
|
124
|
+
|
|
125
|
+
# Chroma
|
|
126
|
+
if CHROMA_AVAILABLE:
|
|
127
|
+
self.providers[VectorDBProvider.CHROMA] = self._create_chroma_provider()
|
|
128
|
+
|
|
129
|
+
# Pinecone
|
|
130
|
+
if PINECONE_AVAILABLE:
|
|
131
|
+
self.providers[VectorDBProvider.PINECONE] = self._create_pinecone_provider()
|
|
132
|
+
|
|
133
|
+
# Weaviate
|
|
134
|
+
if WEAVIATE_AVAILABLE:
|
|
135
|
+
self.providers[VectorDBProvider.WEAVIATE] = self._create_weaviate_provider()
|
|
136
|
+
|
|
137
|
+
# Qdrant
|
|
138
|
+
if QDRANT_AVAILABLE:
|
|
139
|
+
self.providers[VectorDBProvider.QDRANT] = self._create_qdrant_provider()
|
|
140
|
+
|
|
141
|
+
def _create_faiss_provider(self) -> Dict[str, Any]:
|
|
142
|
+
"""Create FAISS provider."""
|
|
143
|
+
return {
|
|
144
|
+
"type": "faiss",
|
|
145
|
+
"indexes": {},
|
|
146
|
+
"capabilities": VectorDBCapabilities(
|
|
147
|
+
supports_metadata=True,
|
|
148
|
+
supports_filtering=False,
|
|
149
|
+
supports_batch_operations=True,
|
|
150
|
+
supports_upsert=True,
|
|
151
|
+
supports_delete=True,
|
|
152
|
+
supports_update=True,
|
|
153
|
+
supports_similarity_search=True,
|
|
154
|
+
supports_hybrid_search=False,
|
|
155
|
+
supports_quantization=True,
|
|
156
|
+
supports_sharding=False,
|
|
157
|
+
max_dimensions=2048,
|
|
158
|
+
max_vectors=1000000
|
|
159
|
+
)
|
|
160
|
+
}
|
|
161
|
+
|
|
162
|
+
def _create_chroma_provider(self) -> Dict[str, Any]:
|
|
163
|
+
"""Create Chroma provider."""
|
|
164
|
+
return {
|
|
165
|
+
"type": "chroma",
|
|
166
|
+
"client": None, # Will be initialized when needed
|
|
167
|
+
"capabilities": VectorDBCapabilities(
|
|
168
|
+
supports_metadata=True,
|
|
169
|
+
supports_filtering=True,
|
|
170
|
+
supports_batch_operations=True,
|
|
171
|
+
supports_upsert=True,
|
|
172
|
+
supports_delete=True,
|
|
173
|
+
supports_update=True,
|
|
174
|
+
supports_similarity_search=True,
|
|
175
|
+
supports_hybrid_search=True,
|
|
176
|
+
supports_quantization=False,
|
|
177
|
+
supports_sharding=True,
|
|
178
|
+
max_dimensions=2048,
|
|
179
|
+
max_vectors=10000000
|
|
180
|
+
)
|
|
181
|
+
}
|
|
182
|
+
|
|
183
|
+
def _create_pinecone_provider(self) -> Dict[str, Any]:
|
|
184
|
+
"""Create Pinecone provider."""
|
|
185
|
+
return {
|
|
186
|
+
"type": "pinecone",
|
|
187
|
+
"client": None, # Will be initialized when needed
|
|
188
|
+
"capabilities": VectorDBCapabilities(
|
|
189
|
+
supports_metadata=True,
|
|
190
|
+
supports_filtering=True,
|
|
191
|
+
supports_batch_operations=True,
|
|
192
|
+
supports_upsert=True,
|
|
193
|
+
supports_delete=True,
|
|
194
|
+
supports_update=True,
|
|
195
|
+
supports_similarity_search=True,
|
|
196
|
+
supports_hybrid_search=True,
|
|
197
|
+
supports_quantization=False,
|
|
198
|
+
supports_sharding=True,
|
|
199
|
+
max_dimensions=2048,
|
|
200
|
+
max_vectors=100000000
|
|
201
|
+
)
|
|
202
|
+
}
|
|
203
|
+
|
|
204
|
+
def _create_weaviate_provider(self) -> Dict[str, Any]:
|
|
205
|
+
"""Create Weaviate provider."""
|
|
206
|
+
return {
|
|
207
|
+
"type": "weaviate",
|
|
208
|
+
"client": None, # Will be initialized when needed
|
|
209
|
+
"capabilities": VectorDBCapabilities(
|
|
210
|
+
supports_metadata=True,
|
|
211
|
+
supports_filtering=True,
|
|
212
|
+
supports_batch_operations=True,
|
|
213
|
+
supports_upsert=True,
|
|
214
|
+
supports_delete=True,
|
|
215
|
+
supports_update=True,
|
|
216
|
+
supports_similarity_search=True,
|
|
217
|
+
supports_hybrid_search=True,
|
|
218
|
+
supports_quantization=False,
|
|
219
|
+
supports_sharding=True,
|
|
220
|
+
max_dimensions=2048,
|
|
221
|
+
max_vectors=100000000
|
|
222
|
+
)
|
|
223
|
+
}
|
|
224
|
+
|
|
225
|
+
def _create_qdrant_provider(self) -> Dict[str, Any]:
|
|
226
|
+
"""Create Qdrant provider."""
|
|
227
|
+
return {
|
|
228
|
+
"type": "qdrant",
|
|
229
|
+
"client": None, # Will be initialized when needed
|
|
230
|
+
"capabilities": VectorDBCapabilities(
|
|
231
|
+
supports_metadata=True,
|
|
232
|
+
supports_filtering=True,
|
|
233
|
+
supports_batch_operations=True,
|
|
234
|
+
supports_upsert=True,
|
|
235
|
+
supports_delete=True,
|
|
236
|
+
supports_update=True,
|
|
237
|
+
supports_similarity_search=True,
|
|
238
|
+
supports_hybrid_search=True,
|
|
239
|
+
supports_quantization=True,
|
|
240
|
+
supports_sharding=True,
|
|
241
|
+
max_dimensions=2048,
|
|
242
|
+
max_vectors=100000000
|
|
243
|
+
)
|
|
244
|
+
}
|
|
245
|
+
|
|
246
|
+
async def create_collection(self, collection_name: str,
|
|
247
|
+
dimension: Optional[int] = None,
|
|
248
|
+
provider: Optional[VectorDBProvider] = None) -> bool:
|
|
249
|
+
"""Create a new collection."""
|
|
250
|
+
try:
|
|
251
|
+
if provider is None:
|
|
252
|
+
provider = self.config.default_provider
|
|
253
|
+
|
|
254
|
+
if dimension is None:
|
|
255
|
+
dimension = self.config.dimension
|
|
256
|
+
|
|
257
|
+
# Check if collection already exists
|
|
258
|
+
if collection_name in self.collections:
|
|
259
|
+
logger.warning(f"Collection {collection_name} already exists")
|
|
260
|
+
return False
|
|
261
|
+
|
|
262
|
+
# Create collection with provider
|
|
263
|
+
success = await self._create_collection_with_provider(
|
|
264
|
+
collection_name, dimension, provider
|
|
265
|
+
)
|
|
266
|
+
|
|
267
|
+
if success:
|
|
268
|
+
self.collections[collection_name] = provider
|
|
269
|
+
self.usage_stats[f"collections_created_{provider.value}"] += 1
|
|
270
|
+
logger.info(f"Created collection {collection_name} with {provider.value}")
|
|
271
|
+
|
|
272
|
+
return success
|
|
273
|
+
|
|
274
|
+
except Exception as e:
|
|
275
|
+
logger.error(f"Error creating collection {collection_name}: {e}")
|
|
276
|
+
return False
|
|
277
|
+
|
|
278
|
+
async def _create_collection_with_provider(self, collection_name: str,
|
|
279
|
+
dimension: int,
|
|
280
|
+
provider: VectorDBProvider) -> bool:
|
|
281
|
+
"""Create collection with specific provider."""
|
|
282
|
+
if provider == VectorDBProvider.FAISS:
|
|
283
|
+
return await self._create_faiss_collection(collection_name, dimension)
|
|
284
|
+
elif provider == VectorDBProvider.CHROMA:
|
|
285
|
+
return await self._create_chroma_collection(collection_name, dimension)
|
|
286
|
+
elif provider == VectorDBProvider.PINECONE:
|
|
287
|
+
return await self._create_pinecone_collection(collection_name, dimension)
|
|
288
|
+
elif provider == VectorDBProvider.WEAVIATE:
|
|
289
|
+
return await self._create_weaviate_collection(collection_name, dimension)
|
|
290
|
+
elif provider == VectorDBProvider.QDRANT:
|
|
291
|
+
return await self._create_qdrant_collection(collection_name, dimension)
|
|
292
|
+
else:
|
|
293
|
+
raise ValueError(f"Unsupported provider: {provider}")
|
|
294
|
+
|
|
295
|
+
async def _create_faiss_collection(self, collection_name: str, dimension: int) -> bool:
|
|
296
|
+
"""Create FAISS collection."""
|
|
297
|
+
if not FAISS_AVAILABLE:
|
|
298
|
+
raise ImportError("FAISS library not available")
|
|
299
|
+
|
|
300
|
+
try:
|
|
301
|
+
# Create FAISS index
|
|
302
|
+
if self.config.metric == "cosine":
|
|
303
|
+
index = faiss.IndexFlatIP(dimension) # Inner product for cosine similarity
|
|
304
|
+
elif self.config.metric == "euclidean":
|
|
305
|
+
index = faiss.IndexFlatL2(dimension) # L2 distance for euclidean
|
|
306
|
+
else:
|
|
307
|
+
index = faiss.IndexFlatIP(dimension) # Default to inner product
|
|
308
|
+
|
|
309
|
+
# Store index
|
|
310
|
+
self.providers[VectorDBProvider.FAISS]["indexes"][collection_name] = {
|
|
311
|
+
"index": index,
|
|
312
|
+
"dimension": dimension,
|
|
313
|
+
"vectors": [],
|
|
314
|
+
"metadata": []
|
|
315
|
+
}
|
|
316
|
+
|
|
317
|
+
return True
|
|
318
|
+
|
|
319
|
+
except Exception as e:
|
|
320
|
+
logger.error(f"Error creating FAISS collection: {e}")
|
|
321
|
+
return False
|
|
322
|
+
|
|
323
|
+
async def _create_chroma_collection(self, collection_name: str, dimension: int) -> bool:
|
|
324
|
+
"""Create Chroma collection."""
|
|
325
|
+
if not CHROMA_AVAILABLE:
|
|
326
|
+
raise ImportError("Chroma library not available")
|
|
327
|
+
|
|
328
|
+
try:
|
|
329
|
+
# Initialize Chroma client if not already done
|
|
330
|
+
if self.providers[VectorDBProvider.CHROMA]["client"] is None:
|
|
331
|
+
client = chromadb.Client()
|
|
332
|
+
self.providers[VectorDBProvider.CHROMA]["client"] = client
|
|
333
|
+
|
|
334
|
+
client = self.providers[VectorDBProvider.CHROMA]["client"]
|
|
335
|
+
|
|
336
|
+
# Create collection
|
|
337
|
+
collection = client.create_collection(
|
|
338
|
+
name=collection_name,
|
|
339
|
+
metadata={"dimension": dimension}
|
|
340
|
+
)
|
|
341
|
+
|
|
342
|
+
# Store collection reference
|
|
343
|
+
self.providers[VectorDBProvider.CHROMA]["collections"] = self.providers[VectorDBProvider.CHROMA].get("collections", {})
|
|
344
|
+
self.providers[VectorDBProvider.CHROMA]["collections"][collection_name] = collection
|
|
345
|
+
|
|
346
|
+
return True
|
|
347
|
+
|
|
348
|
+
except Exception as e:
|
|
349
|
+
logger.error(f"Error creating Chroma collection: {e}")
|
|
350
|
+
return False
|
|
351
|
+
|
|
352
|
+
async def _create_pinecone_collection(self, collection_name: str, dimension: int) -> bool:
|
|
353
|
+
"""Create Pinecone collection."""
|
|
354
|
+
if not PINECONE_AVAILABLE:
|
|
355
|
+
raise ImportError("Pinecone library not available")
|
|
356
|
+
|
|
357
|
+
try:
|
|
358
|
+
# Initialize Pinecone client if not already done
|
|
359
|
+
if self.providers[VectorDBProvider.PINECONE]["client"] is None:
|
|
360
|
+
pinecone.init(
|
|
361
|
+
api_key=self.config.providers.get(VectorDBProvider.PINECONE, {}).get("api_key"),
|
|
362
|
+
environment=self.config.providers.get(VectorDBProvider.PINECONE, {}).get("environment")
|
|
363
|
+
)
|
|
364
|
+
client = pinecone.Index(collection_name)
|
|
365
|
+
self.providers[VectorDBProvider.PINECONE]["client"] = client
|
|
366
|
+
|
|
367
|
+
# Create index
|
|
368
|
+
pinecone.create_index(
|
|
369
|
+
name=collection_name,
|
|
370
|
+
dimension=dimension,
|
|
371
|
+
metric=self.config.metric
|
|
372
|
+
)
|
|
373
|
+
|
|
374
|
+
return True
|
|
375
|
+
|
|
376
|
+
except Exception as e:
|
|
377
|
+
logger.error(f"Error creating Pinecone collection: {e}")
|
|
378
|
+
return False
|
|
379
|
+
|
|
380
|
+
async def _create_weaviate_collection(self, collection_name: str, dimension: int) -> bool:
|
|
381
|
+
"""Create Weaviate collection."""
|
|
382
|
+
if not WEAVIATE_AVAILABLE:
|
|
383
|
+
raise ImportError("Weaviate library not available")
|
|
384
|
+
|
|
385
|
+
try:
|
|
386
|
+
# Initialize Weaviate client if not already done
|
|
387
|
+
if self.providers[VectorDBProvider.WEAVIATE]["client"] is None:
|
|
388
|
+
client = weaviate.Client(
|
|
389
|
+
url=self.config.providers.get(VectorDBProvider.WEAVIATE, {}).get("url", "http://localhost:8080")
|
|
390
|
+
)
|
|
391
|
+
self.providers[VectorDBProvider.WEAVIATE]["client"] = client
|
|
392
|
+
|
|
393
|
+
client = self.providers[VectorDBProvider.WEAVIATE]["client"]
|
|
394
|
+
|
|
395
|
+
# Create schema
|
|
396
|
+
schema = {
|
|
397
|
+
"class": collection_name,
|
|
398
|
+
"vectorizer": "none", # We'll provide vectors manually
|
|
399
|
+
"properties": [
|
|
400
|
+
{"name": "text", "dataType": ["text"]},
|
|
401
|
+
{"name": "metadata", "dataType": ["object"]}
|
|
402
|
+
]
|
|
403
|
+
}
|
|
404
|
+
|
|
405
|
+
client.schema.create_class(schema)
|
|
406
|
+
|
|
407
|
+
return True
|
|
408
|
+
|
|
409
|
+
except Exception as e:
|
|
410
|
+
logger.error(f"Error creating Weaviate collection: {e}")
|
|
411
|
+
return False
|
|
412
|
+
|
|
413
|
+
async def _create_qdrant_collection(self, collection_name: str, dimension: int) -> bool:
|
|
414
|
+
"""Create Qdrant collection."""
|
|
415
|
+
if not QDRANT_AVAILABLE:
|
|
416
|
+
raise ImportError("Qdrant library not available")
|
|
417
|
+
|
|
418
|
+
try:
|
|
419
|
+
# Initialize Qdrant client if not already done
|
|
420
|
+
if self.providers[VectorDBProvider.QDRANT]["client"] is None:
|
|
421
|
+
client = qdrant_client.QdrantClient(
|
|
422
|
+
url=self.config.providers.get(VectorDBProvider.QDRANT, {}).get("url", "http://localhost:6333")
|
|
423
|
+
)
|
|
424
|
+
self.providers[VectorDBProvider.QDRANT]["client"] = client
|
|
425
|
+
|
|
426
|
+
client = self.providers[VectorDBProvider.QDRANT]["client"]
|
|
427
|
+
|
|
428
|
+
# Create collection
|
|
429
|
+
client.create_collection(
|
|
430
|
+
collection_name=collection_name,
|
|
431
|
+
vectors_config=qdrant_client.VectorParams(
|
|
432
|
+
size=dimension,
|
|
433
|
+
distance=qdrant_client.Distance.COSINE if self.config.metric == "cosine" else qdrant_client.Distance.EUCLID
|
|
434
|
+
)
|
|
435
|
+
)
|
|
436
|
+
|
|
437
|
+
return True
|
|
438
|
+
|
|
439
|
+
except Exception as e:
|
|
440
|
+
logger.error(f"Error creating Qdrant collection: {e}")
|
|
441
|
+
return False
|
|
442
|
+
|
|
443
|
+
async def insert_vectors(self, collection_name: str,
|
|
444
|
+
vectors: List[List[float]],
|
|
445
|
+
ids: Optional[List[str]] = None,
|
|
446
|
+
metadata: Optional[List[Dict[str, Any]]] = None) -> bool:
|
|
447
|
+
"""Insert vectors into collection."""
|
|
448
|
+
try:
|
|
449
|
+
if collection_name not in self.collections:
|
|
450
|
+
logger.error(f"Collection {collection_name} does not exist")
|
|
451
|
+
return False
|
|
452
|
+
|
|
453
|
+
provider = self.collections[collection_name]
|
|
454
|
+
|
|
455
|
+
# Generate IDs if not provided
|
|
456
|
+
if ids is None:
|
|
457
|
+
ids = [f"vector_{i}_{int(time.time())}" for i in range(len(vectors))]
|
|
458
|
+
|
|
459
|
+
# Generate metadata if not provided
|
|
460
|
+
if metadata is None:
|
|
461
|
+
metadata = [{} for _ in range(len(vectors))]
|
|
462
|
+
|
|
463
|
+
# Insert with provider
|
|
464
|
+
success = await self._insert_vectors_with_provider(
|
|
465
|
+
collection_name, vectors, ids, metadata, provider
|
|
466
|
+
)
|
|
467
|
+
|
|
468
|
+
if success:
|
|
469
|
+
self.usage_stats[f"vectors_inserted_{provider.value}"] += len(vectors)
|
|
470
|
+
logger.info(f"Inserted {len(vectors)} vectors into {collection_name}")
|
|
471
|
+
|
|
472
|
+
return success
|
|
473
|
+
|
|
474
|
+
except Exception as e:
|
|
475
|
+
logger.error(f"Error inserting vectors: {e}")
|
|
476
|
+
return False
|
|
477
|
+
|
|
478
|
+
async def _insert_vectors_with_provider(self, collection_name: str,
|
|
479
|
+
vectors: List[List[float]],
|
|
480
|
+
ids: List[str],
|
|
481
|
+
metadata: List[Dict[str, Any]],
|
|
482
|
+
provider: VectorDBProvider) -> bool:
|
|
483
|
+
"""Insert vectors with specific provider."""
|
|
484
|
+
if provider == VectorDBProvider.FAISS:
|
|
485
|
+
return await self._insert_faiss_vectors(collection_name, vectors, ids, metadata)
|
|
486
|
+
elif provider == VectorDBProvider.CHROMA:
|
|
487
|
+
return await self._insert_chroma_vectors(collection_name, vectors, ids, metadata)
|
|
488
|
+
elif provider == VectorDBProvider.PINECONE:
|
|
489
|
+
return await self._insert_pinecone_vectors(collection_name, vectors, ids, metadata)
|
|
490
|
+
elif provider == VectorDBProvider.WEAVIATE:
|
|
491
|
+
return await self._insert_weaviate_vectors(collection_name, vectors, ids, metadata)
|
|
492
|
+
elif provider == VectorDBProvider.QDRANT:
|
|
493
|
+
return await self._insert_qdrant_vectors(collection_name, vectors, ids, metadata)
|
|
494
|
+
else:
|
|
495
|
+
raise ValueError(f"Unsupported provider: {provider}")
|
|
496
|
+
|
|
497
|
+
async def _insert_faiss_vectors(self, collection_name: str,
|
|
498
|
+
vectors: List[List[float]],
|
|
499
|
+
ids: List[str],
|
|
500
|
+
metadata: List[Dict[str, Any]]) -> bool:
|
|
501
|
+
"""Insert vectors into FAISS collection."""
|
|
502
|
+
try:
|
|
503
|
+
collection_data = self.providers[VectorDBProvider.FAISS]["indexes"][collection_name]
|
|
504
|
+
index = collection_data["index"]
|
|
505
|
+
|
|
506
|
+
# Convert to numpy array
|
|
507
|
+
vectors_array = np.array(vectors, dtype=np.float32)
|
|
508
|
+
|
|
509
|
+
# Add vectors to index
|
|
510
|
+
index.add(vectors_array)
|
|
511
|
+
|
|
512
|
+
# Store metadata
|
|
513
|
+
collection_data["vectors"].extend(vectors)
|
|
514
|
+
collection_data["metadata"].extend(metadata)
|
|
515
|
+
|
|
516
|
+
return True
|
|
517
|
+
|
|
518
|
+
except Exception as e:
|
|
519
|
+
logger.error(f"Error inserting FAISS vectors: {e}")
|
|
520
|
+
return False
|
|
521
|
+
|
|
522
|
+
async def _insert_chroma_vectors(self, collection_name: str,
|
|
523
|
+
vectors: List[List[float]],
|
|
524
|
+
ids: List[str],
|
|
525
|
+
metadata: List[Dict[str, Any]]) -> bool:
|
|
526
|
+
"""Insert vectors into Chroma collection."""
|
|
527
|
+
try:
|
|
528
|
+
collection = self.providers[VectorDBProvider.CHROMA]["collections"][collection_name]
|
|
529
|
+
|
|
530
|
+
# Prepare data for Chroma
|
|
531
|
+
documents = [meta.get("text", "") for meta in metadata]
|
|
532
|
+
metadatas = [meta for meta in metadata]
|
|
533
|
+
|
|
534
|
+
# Add vectors
|
|
535
|
+
collection.add(
|
|
536
|
+
embeddings=vectors,
|
|
537
|
+
documents=documents,
|
|
538
|
+
metadatas=metadatas,
|
|
539
|
+
ids=ids
|
|
540
|
+
)
|
|
541
|
+
|
|
542
|
+
return True
|
|
543
|
+
|
|
544
|
+
except Exception as e:
|
|
545
|
+
logger.error(f"Error inserting Chroma vectors: {e}")
|
|
546
|
+
return False
|
|
547
|
+
|
|
548
|
+
async def _insert_pinecone_vectors(self, collection_name: str,
|
|
549
|
+
vectors: List[List[float]],
|
|
550
|
+
ids: List[str],
|
|
551
|
+
metadata: List[Dict[str, Any]]) -> bool:
|
|
552
|
+
"""Insert vectors into Pinecone collection."""
|
|
553
|
+
try:
|
|
554
|
+
index = self.providers[VectorDBProvider.PINECONE]["client"]
|
|
555
|
+
|
|
556
|
+
# Prepare data for Pinecone
|
|
557
|
+
vectors_data = []
|
|
558
|
+
for i, (vector, vector_id, meta) in enumerate(zip(vectors, ids, metadata)):
|
|
559
|
+
vectors_data.append({
|
|
560
|
+
"id": vector_id,
|
|
561
|
+
"values": vector,
|
|
562
|
+
"metadata": meta
|
|
563
|
+
})
|
|
564
|
+
|
|
565
|
+
# Upsert vectors
|
|
566
|
+
index.upsert(vectors=vectors_data)
|
|
567
|
+
|
|
568
|
+
return True
|
|
569
|
+
|
|
570
|
+
except Exception as e:
|
|
571
|
+
logger.error(f"Error inserting Pinecone vectors: {e}")
|
|
572
|
+
return False
|
|
573
|
+
|
|
574
|
+
async def _insert_weaviate_vectors(self, collection_name: str,
|
|
575
|
+
vectors: List[List[float]],
|
|
576
|
+
ids: List[str],
|
|
577
|
+
metadata: List[Dict[str, Any]]) -> bool:
|
|
578
|
+
"""Insert vectors into Weaviate collection."""
|
|
579
|
+
try:
|
|
580
|
+
client = self.providers[VectorDBProvider.WEAVIATE]["client"]
|
|
581
|
+
|
|
582
|
+
# Prepare data for Weaviate
|
|
583
|
+
objects = []
|
|
584
|
+
for i, (vector, vector_id, meta) in enumerate(zip(vectors, ids, metadata)):
|
|
585
|
+
objects.append({
|
|
586
|
+
"class": collection_name,
|
|
587
|
+
"id": vector_id,
|
|
588
|
+
"vector": vector,
|
|
589
|
+
"properties": {
|
|
590
|
+
"text": meta.get("text", ""),
|
|
591
|
+
"metadata": meta
|
|
592
|
+
}
|
|
593
|
+
})
|
|
594
|
+
|
|
595
|
+
# Batch insert
|
|
596
|
+
client.batch.create_objects(objects)
|
|
597
|
+
|
|
598
|
+
return True
|
|
599
|
+
|
|
600
|
+
except Exception as e:
|
|
601
|
+
logger.error(f"Error inserting Weaviate vectors: {e}")
|
|
602
|
+
return False
|
|
603
|
+
|
|
604
|
+
async def _insert_qdrant_vectors(self, collection_name: str,
|
|
605
|
+
vectors: List[List[float]],
|
|
606
|
+
ids: List[str],
|
|
607
|
+
metadata: List[Dict[str, Any]]) -> bool:
|
|
608
|
+
"""Insert vectors into Qdrant collection."""
|
|
609
|
+
try:
|
|
610
|
+
client = self.providers[VectorDBProvider.QDRANT]["client"]
|
|
611
|
+
|
|
612
|
+
# Prepare data for Qdrant
|
|
613
|
+
points = []
|
|
614
|
+
for i, (vector, vector_id, meta) in enumerate(zip(vectors, ids, metadata)):
|
|
615
|
+
points.append(qdrant_client.PointStruct(
|
|
616
|
+
id=vector_id,
|
|
617
|
+
vector=vector,
|
|
618
|
+
payload=meta
|
|
619
|
+
))
|
|
620
|
+
|
|
621
|
+
# Upsert points
|
|
622
|
+
client.upsert(
|
|
623
|
+
collection_name=collection_name,
|
|
624
|
+
points=points
|
|
625
|
+
)
|
|
626
|
+
|
|
627
|
+
return True
|
|
628
|
+
|
|
629
|
+
except Exception as e:
|
|
630
|
+
logger.error(f"Error inserting Qdrant vectors: {e}")
|
|
631
|
+
return False
|
|
632
|
+
|
|
633
|
+
async def search_vectors(self, collection_name: str,
|
|
634
|
+
query_vector: List[float],
|
|
635
|
+
top_k: int = 10,
|
|
636
|
+
filter_conditions: Optional[Dict[str, Any]] = None) -> List[Dict[str, Any]]:
|
|
637
|
+
"""Search for similar vectors."""
|
|
638
|
+
try:
|
|
639
|
+
if collection_name not in self.collections:
|
|
640
|
+
logger.error(f"Collection {collection_name} does not exist")
|
|
641
|
+
return []
|
|
642
|
+
|
|
643
|
+
provider = self.collections[collection_name]
|
|
644
|
+
|
|
645
|
+
# Search with provider
|
|
646
|
+
results = await self._search_vectors_with_provider(
|
|
647
|
+
collection_name, query_vector, top_k, filter_conditions, provider
|
|
648
|
+
)
|
|
649
|
+
|
|
650
|
+
# Update usage stats
|
|
651
|
+
self.usage_stats[f"searches_performed_{provider.value}"] += 1
|
|
652
|
+
|
|
653
|
+
return results
|
|
654
|
+
|
|
655
|
+
except Exception as e:
|
|
656
|
+
logger.error(f"Error searching vectors: {e}")
|
|
657
|
+
return []
|
|
658
|
+
|
|
659
|
+
async def _search_vectors_with_provider(self, collection_name: str,
|
|
660
|
+
query_vector: List[float],
|
|
661
|
+
top_k: int,
|
|
662
|
+
filter_conditions: Optional[Dict[str, Any]],
|
|
663
|
+
provider: VectorDBProvider) -> List[Dict[str, Any]]:
|
|
664
|
+
"""Search vectors with specific provider."""
|
|
665
|
+
if provider == VectorDBProvider.FAISS:
|
|
666
|
+
return await self._search_faiss_vectors(collection_name, query_vector, top_k)
|
|
667
|
+
elif provider == VectorDBProvider.CHROMA:
|
|
668
|
+
return await self._search_chroma_vectors(collection_name, query_vector, top_k, filter_conditions)
|
|
669
|
+
elif provider == VectorDBProvider.PINECONE:
|
|
670
|
+
return await self._search_pinecone_vectors(collection_name, query_vector, top_k, filter_conditions)
|
|
671
|
+
elif provider == VectorDBProvider.WEAVIATE:
|
|
672
|
+
return await self._search_weaviate_vectors(collection_name, query_vector, top_k, filter_conditions)
|
|
673
|
+
elif provider == VectorDBProvider.QDRANT:
|
|
674
|
+
return await self._search_qdrant_vectors(collection_name, query_vector, top_k, filter_conditions)
|
|
675
|
+
else:
|
|
676
|
+
raise ValueError(f"Unsupported provider: {provider}")
|
|
677
|
+
|
|
678
|
+
async def _search_faiss_vectors(self, collection_name: str,
|
|
679
|
+
query_vector: List[float],
|
|
680
|
+
top_k: int) -> List[Dict[str, Any]]:
|
|
681
|
+
"""Search vectors in FAISS collection."""
|
|
682
|
+
try:
|
|
683
|
+
collection_data = self.providers[VectorDBProvider.FAISS]["indexes"][collection_name]
|
|
684
|
+
index = collection_data["index"]
|
|
685
|
+
|
|
686
|
+
# Convert query to numpy array
|
|
687
|
+
query_array = np.array([query_vector], dtype=np.float32)
|
|
688
|
+
|
|
689
|
+
# Search
|
|
690
|
+
distances, indices = index.search(query_array, top_k)
|
|
691
|
+
|
|
692
|
+
# Prepare results
|
|
693
|
+
results = []
|
|
694
|
+
for i, (distance, idx) in enumerate(zip(distances[0], indices[0])):
|
|
695
|
+
if idx < len(collection_data["vectors"]):
|
|
696
|
+
results.append({
|
|
697
|
+
"id": f"vector_{idx}",
|
|
698
|
+
"distance": float(distance),
|
|
699
|
+
"vector": collection_data["vectors"][idx],
|
|
700
|
+
"metadata": collection_data["metadata"][idx]
|
|
701
|
+
})
|
|
702
|
+
|
|
703
|
+
return results
|
|
704
|
+
|
|
705
|
+
except Exception as e:
|
|
706
|
+
logger.error(f"Error searching FAISS vectors: {e}")
|
|
707
|
+
return []
|
|
708
|
+
|
|
709
|
+
async def _search_chroma_vectors(self, collection_name: str,
|
|
710
|
+
query_vector: List[float],
|
|
711
|
+
top_k: int,
|
|
712
|
+
filter_conditions: Optional[Dict[str, Any]]) -> List[Dict[str, Any]]:
|
|
713
|
+
"""Search vectors in Chroma collection."""
|
|
714
|
+
try:
|
|
715
|
+
collection = self.providers[VectorDBProvider.CHROMA]["collections"][collection_name]
|
|
716
|
+
|
|
717
|
+
# Search
|
|
718
|
+
results = collection.query(
|
|
719
|
+
query_embeddings=[query_vector],
|
|
720
|
+
n_results=top_k,
|
|
721
|
+
where=filter_conditions
|
|
722
|
+
)
|
|
723
|
+
|
|
724
|
+
# Prepare results
|
|
725
|
+
search_results = []
|
|
726
|
+
for i in range(len(results["ids"][0])):
|
|
727
|
+
search_results.append({
|
|
728
|
+
"id": results["ids"][0][i],
|
|
729
|
+
"distance": results["distances"][0][i],
|
|
730
|
+
"vector": results["embeddings"][0][i],
|
|
731
|
+
"metadata": results["metadatas"][0][i]
|
|
732
|
+
})
|
|
733
|
+
|
|
734
|
+
return search_results
|
|
735
|
+
|
|
736
|
+
except Exception as e:
|
|
737
|
+
logger.error(f"Error searching Chroma vectors: {e}")
|
|
738
|
+
return []
|
|
739
|
+
|
|
740
|
+
async def _search_pinecone_vectors(self, collection_name: str,
|
|
741
|
+
query_vector: List[float],
|
|
742
|
+
top_k: int,
|
|
743
|
+
filter_conditions: Optional[Dict[str, Any]]) -> List[Dict[str, Any]]:
|
|
744
|
+
"""Search vectors in Pinecone collection."""
|
|
745
|
+
try:
|
|
746
|
+
index = self.providers[VectorDBProvider.PINECONE]["client"]
|
|
747
|
+
|
|
748
|
+
# Search
|
|
749
|
+
results = index.query(
|
|
750
|
+
vector=query_vector,
|
|
751
|
+
top_k=top_k,
|
|
752
|
+
include_metadata=True,
|
|
753
|
+
filter=filter_conditions
|
|
754
|
+
)
|
|
755
|
+
|
|
756
|
+
# Prepare results
|
|
757
|
+
search_results = []
|
|
758
|
+
for match in results["matches"]:
|
|
759
|
+
search_results.append({
|
|
760
|
+
"id": match["id"],
|
|
761
|
+
"distance": match["score"],
|
|
762
|
+
"vector": match["values"],
|
|
763
|
+
"metadata": match["metadata"]
|
|
764
|
+
})
|
|
765
|
+
|
|
766
|
+
return search_results
|
|
767
|
+
|
|
768
|
+
except Exception as e:
|
|
769
|
+
logger.error(f"Error searching Pinecone vectors: {e}")
|
|
770
|
+
return []
|
|
771
|
+
|
|
772
|
+
async def _search_weaviate_vectors(self, collection_name: str,
|
|
773
|
+
query_vector: List[float],
|
|
774
|
+
top_k: int,
|
|
775
|
+
filter_conditions: Optional[Dict[str, Any]]) -> List[Dict[str, Any]]:
|
|
776
|
+
"""Search vectors in Weaviate collection."""
|
|
777
|
+
try:
|
|
778
|
+
client = self.providers[VectorDBProvider.WEAVIATE]["client"]
|
|
779
|
+
|
|
780
|
+
# Search
|
|
781
|
+
results = client.query.get(
|
|
782
|
+
collection_name,
|
|
783
|
+
["text", "metadata"]
|
|
784
|
+
).with_near_vector({
|
|
785
|
+
"vector": query_vector
|
|
786
|
+
}).with_limit(top_k).do()
|
|
787
|
+
|
|
788
|
+
# Prepare results
|
|
789
|
+
search_results = []
|
|
790
|
+
for obj in results["data"]["Get"][collection_name]:
|
|
791
|
+
search_results.append({
|
|
792
|
+
"id": obj["_additional"]["id"],
|
|
793
|
+
"distance": obj["_additional"]["distance"],
|
|
794
|
+
"vector": query_vector, # Weaviate doesn't return the vector
|
|
795
|
+
"metadata": obj["metadata"]
|
|
796
|
+
})
|
|
797
|
+
|
|
798
|
+
return search_results
|
|
799
|
+
|
|
800
|
+
except Exception as e:
|
|
801
|
+
logger.error(f"Error searching Weaviate vectors: {e}")
|
|
802
|
+
return []
|
|
803
|
+
|
|
804
|
+
async def _search_qdrant_vectors(self, collection_name: str,
|
|
805
|
+
query_vector: List[float],
|
|
806
|
+
top_k: int,
|
|
807
|
+
filter_conditions: Optional[Dict[str, Any]]) -> List[Dict[str, Any]]:
|
|
808
|
+
"""Search vectors in Qdrant collection."""
|
|
809
|
+
try:
|
|
810
|
+
client = self.providers[VectorDBProvider.QDRANT]["client"]
|
|
811
|
+
|
|
812
|
+
# Search
|
|
813
|
+
results = client.search(
|
|
814
|
+
collection_name=collection_name,
|
|
815
|
+
query_vector=query_vector,
|
|
816
|
+
limit=top_k,
|
|
817
|
+
query_filter=filter_conditions
|
|
818
|
+
)
|
|
819
|
+
|
|
820
|
+
# Prepare results
|
|
821
|
+
search_results = []
|
|
822
|
+
for point in results:
|
|
823
|
+
search_results.append({
|
|
824
|
+
"id": point.id,
|
|
825
|
+
"distance": point.score,
|
|
826
|
+
"vector": point.vector,
|
|
827
|
+
"metadata": point.payload
|
|
828
|
+
})
|
|
829
|
+
|
|
830
|
+
return search_results
|
|
831
|
+
|
|
832
|
+
except Exception as e:
|
|
833
|
+
logger.error(f"Error searching Qdrant vectors: {e}")
|
|
834
|
+
return []
|
|
835
|
+
|
|
836
|
+
def get_collection_info(self, collection_name: str) -> Optional[Dict[str, Any]]:
|
|
837
|
+
"""Get information about a collection."""
|
|
838
|
+
if collection_name not in self.collections:
|
|
839
|
+
return None
|
|
840
|
+
|
|
841
|
+
provider = self.collections[collection_name]
|
|
842
|
+
capabilities = self.providers[provider]["capabilities"]
|
|
843
|
+
|
|
844
|
+
return {
|
|
845
|
+
"name": collection_name,
|
|
846
|
+
"provider": provider.value,
|
|
847
|
+
"capabilities": {
|
|
848
|
+
"supports_metadata": capabilities.supports_metadata,
|
|
849
|
+
"supports_filtering": capabilities.supports_filtering,
|
|
850
|
+
"supports_batch_operations": capabilities.supports_batch_operations,
|
|
851
|
+
"supports_upsert": capabilities.supports_upsert,
|
|
852
|
+
"supports_delete": capabilities.supports_delete,
|
|
853
|
+
"supports_update": capabilities.supports_update,
|
|
854
|
+
"supports_similarity_search": capabilities.supports_similarity_search,
|
|
855
|
+
"supports_hybrid_search": capabilities.supports_hybrid_search,
|
|
856
|
+
"supports_quantization": capabilities.supports_quantization,
|
|
857
|
+
"supports_sharding": capabilities.supports_sharding,
|
|
858
|
+
"max_dimensions": capabilities.max_dimensions,
|
|
859
|
+
"max_vectors": capabilities.max_vectors
|
|
860
|
+
}
|
|
861
|
+
}
|
|
862
|
+
|
|
863
|
+
def get_available_providers(self) -> List[VectorDBProvider]:
|
|
864
|
+
"""Get list of available providers."""
|
|
865
|
+
return list(self.providers.keys())
|
|
866
|
+
|
|
867
|
+
def get_usage_stats(self) -> Dict[str, Any]:
|
|
868
|
+
"""Get usage statistics."""
|
|
869
|
+
return {
|
|
870
|
+
"collections": len(self.collections),
|
|
871
|
+
"providers": {provider.value: "available" for provider in self.providers.keys()},
|
|
872
|
+
"usage_stats": dict(self.usage_stats)
|
|
873
|
+
}
|
|
874
|
+
|
|
875
|
+
async def close(self) -> None:
|
|
876
|
+
"""Close all connections."""
|
|
877
|
+
# Close provider connections
|
|
878
|
+
for provider in self.providers.values():
|
|
879
|
+
if provider.get("client"):
|
|
880
|
+
# Close client connections
|
|
881
|
+
pass
|
|
882
|
+
|
|
883
|
+
logger.info("AIContextDB Universal Vector DB Manager closed")
|
|
884
|
+
|
|
885
|
+
# Legacy compatibility classes
|
|
886
|
+
class VectorConfig(VectorDBConfig):
|
|
887
|
+
"""Legacy compatibility."""
|
|
888
|
+
pass
|
|
889
|
+
|
|
890
|
+
class AIContextDBVectorDB:
|
|
891
|
+
"""Legacy compatibility wrapper."""
|
|
892
|
+
|
|
893
|
+
def __init__(self, config: VectorConfig):
|
|
894
|
+
"""Initialize with legacy config."""
|
|
895
|
+
self.config = config
|
|
896
|
+
self.manager = AIContextDBUniversalVectorDBManager(config)
|
|
897
|
+
self.logger = logging.getLogger(f"{__name__}.AIContextDBVectorDB")
|
|
898
|
+
|
|
899
|
+
async def create_collection(self, name: str, dimension: int = None) -> VectorResult:
|
|
900
|
+
"""Create collection with legacy interface."""
|
|
901
|
+
try:
|
|
902
|
+
success = await self.manager.create_collection(name, dimension)
|
|
903
|
+
return VectorResult(success=success, data={"name": name} if success else None)
|
|
904
|
+
except Exception as e:
|
|
905
|
+
return VectorResult(success=False, error=str(e))
|
|
906
|
+
|
|
907
|
+
async def add_vector(self, collection: str, vector: List[float],
|
|
908
|
+
vector_id: str = None, metadata: Dict[str, Any] = None) -> VectorResult:
|
|
909
|
+
"""Add vector with legacy interface."""
|
|
910
|
+
try:
|
|
911
|
+
success = await self.manager.insert_vectors(
|
|
912
|
+
collection, [vector], [vector_id] if vector_id else None, [metadata] if metadata else None
|
|
913
|
+
)
|
|
914
|
+
return VectorResult(success=success, data={"id": vector_id} if success else None)
|
|
915
|
+
except Exception as e:
|
|
916
|
+
return VectorResult(success=False, error=str(e))
|
|
917
|
+
|
|
918
|
+
async def search_vectors(self, collection: str, query_vector: List[float],
|
|
919
|
+
top_k: int = 10, threshold: float = 0.0) -> VectorResult:
|
|
920
|
+
"""Search vectors with legacy interface."""
|
|
921
|
+
try:
|
|
922
|
+
results = await self.manager.search_vectors(collection, query_vector, top_k)
|
|
923
|
+
# Filter by threshold
|
|
924
|
+
filtered_results = [r for r in results if (1.0 - r.get("distance", 1.0)) >= threshold]
|
|
925
|
+
return VectorResult(success=True, data=filtered_results)
|
|
926
|
+
except Exception as e:
|
|
927
|
+
return VectorResult(success=False, error=str(e))
|
|
928
|
+
|
|
929
|
+
def get_collection_info(self, collection: str) -> VectorResult:
|
|
930
|
+
"""Get collection info with legacy interface."""
|
|
931
|
+
try:
|
|
932
|
+
info = self.manager.get_collection_info(collection)
|
|
933
|
+
return VectorResult(success=info is not None, data=info)
|
|
934
|
+
except Exception as e:
|
|
935
|
+
return VectorResult(success=False, error=str(e))
|
|
936
|
+
|
|
937
|
+
def get_stats(self) -> Dict[str, Any]:
|
|
938
|
+
"""Get stats with legacy interface."""
|
|
939
|
+
return self.manager.get_usage_stats()
|
|
940
|
+
|
|
941
|
+
# Global instances
|
|
942
|
+
def get_vector_db(config: VectorConfig) -> AIContextDBVectorDB:
|
|
943
|
+
"""Get a vector database instance."""
|
|
944
|
+
return AIContextDBVectorDB(config)
|
|
945
|
+
|
|
946
|
+
def create_vector_db(backend: VectorDBProvider, dimension: int = 768) -> AIContextDBVectorDB:
|
|
947
|
+
"""Create a vector database instance."""
|
|
948
|
+
config = VectorConfig(default_provider=backend, dimension=dimension)
|
|
949
|
+
return AIContextDBVectorDB(config)
|
|
950
|
+
|
|
951
|
+
def get_universal_vector_db(config: VectorDBConfig = None) -> AIContextDBUniversalVectorDBManager:
|
|
952
|
+
"""Get the universal vector database manager."""
|
|
953
|
+
return AIContextDBUniversalVectorDBManager(config)
|