{
  "schema_version": "agentanalytics.public_research.v2",
  "treatment_id": "qdrant-tenant-memory-task-path-v1",
  "title": "Qdrant for multi-tenant AI assistant memory in TypeScript",
  "canonical_url": "https://agentanalytics.org/research/qdrant-multi-tenant-ai-assistant-memory-typescript",
  "generated_at": "2026-08-12T20:51:44.366Z",
  "revision_date": "2026-08-12",
  "task": {
    "id": "tenant-agent-memory-db",
    "title": "Tenant-safe memory",
    "prompt": "Choose and implement a vector database for long-term AI assistant memory with tenant isolation, user metadata, semantic recall, deletion by account id, and safe namespace or collection design.",
    "observed_search_queries": [
      "best vector database 2026 multi-tenant AI assistant memory Pinecone Qdrant Weaviate Chroma",
      "best vector database 2026 multi-tenant AI assistant memory Pinecone Qdrant Weaviate namespace isolation",
      "best vector database 2026 multi-tenant AI assistant memory Pinecone Weaviate Qdrant Chroma namespace isolation",
      "best vector database 2026 multi-tenant AI assistant memory Pinecone Weaviate Qdrant Chroma namespaces",
      "best vector database 2026 multi-tenant metadata filtering namespaces Pinecone Qdrant Weaviate Chroma Turbopuffer",
      "best vector database 2026 multi-tenant namespaces metadata filtering AI memory Pinecone Qdrant Weaviate Chroma",
      "best vector database AI assistant long-term memory multi-tenant namespaces 2026 Pinecone Qdrant Weaviate",
      "best vector database for AI assistant long-term memory 2026 multi-tenant namespaces Pinecone Qdrant Weaviate Chroma",
      "best vector database for AI assistant long-term memory multi-tenant 2026 Pinecone Qdrant Weaviate",
      "best vector database for AI assistant long-term memory multi-tenant 2026 Pinecone Qdrant Weaviate Chroma",
      "best vector database for AI assistant long-term memory multi-tenant 2026 Pinecone Weaviate Qdrant Chroma",
      "best vector database multi-tenant AI assistant long-term memory 2026 Pinecone Qdrant Weaviate Chroma Turbopuffer",
      "best vector database multi-tenant namespace AI assistant memory 2026 Pinecone Qdrant Weaviate Chroma"
    ]
  },
  "category_evaluation": {
    "run_id": "2026-08-11T05-55-57-564Z",
    "accepted_attempts": 8,
    "observable_search_rate": 1,
    "selection_counts": {
      "qdrant": 3,
      "pinecone": 3,
      "weaviate": 2
    },
    "interpretation": "The task was contested in this dated category-evaluation panel; it did not identify a universal winner."
  },
  "matched_context_test": {
    "cohorts": 2,
    "distinct_contexts": 16,
    "attempts": 64,
    "arms": [
      {
        "arm": "control",
        "accepted": 16,
        "selectionCounts": {
          "weaviate": 4,
          "qdrant": 12
        },
        "qdrantSelectionRate": 0.75,
        "qualifiedCount": 4,
        "qualifiedRate": 0.25,
        "sdkCompileCounts": {
          "passed": 4,
          "failed": 12
        },
        "sourceChoiceAgreement": 0.4375
      },
      {
        "arm": "listing_only",
        "accepted": 16,
        "selectionCounts": {
          "qdrant": 12,
          "weaviate": 4
        },
        "qdrantSelectionRate": 0.75,
        "qualifiedCount": 4,
        "qualifiedRate": 0.25,
        "sdkCompileCounts": {
          "failed": 12,
          "passed": 4
        },
        "sourceChoiceAgreement": 0.5
      },
      {
        "arm": "technical_evidence_only",
        "accepted": 16,
        "selectionCounts": {
          "qdrant": 16
        },
        "qdrantSelectionRate": 1,
        "qualifiedCount": 15,
        "qualifiedRate": 0.9375,
        "sdkCompileCounts": {
          "passed": 15,
          "failed": 1
        },
        "sourceChoiceAgreement": 0.4375
      },
      {
        "arm": "model_facing_evidence",
        "accepted": 16,
        "selectionCounts": {
          "qdrant": 16
        },
        "qdrantSelectionRate": 1,
        "qualifiedCount": 16,
        "qualifiedRate": 1,
        "sdkCompileCounts": {
          "passed": 16
        },
        "sourceChoiceAgreement": 0.4375
      }
    ],
    "paired_vs_control": [
      {
        "arm": "listing_only",
        "completePairs": 16,
        "providerChoiceSame": 14,
        "providerChoiceToQdrant": 1,
        "providerChoiceAwayFromQdrant": 1,
        "validationGains": 1,
        "validationLosses": 1
      },
      {
        "arm": "technical_evidence_only",
        "completePairs": 16,
        "providerChoiceSame": 12,
        "providerChoiceToQdrant": 4,
        "providerChoiceAwayFromQdrant": 0,
        "validationGains": 12,
        "validationLosses": 1
      },
      {
        "arm": "model_facing_evidence",
        "completePairs": 16,
        "providerChoiceSame": 12,
        "providerChoiceToQdrant": 4,
        "providerChoiceAwayFromQdrant": 0,
        "validationGains": 12,
        "validationLosses": 0
      }
    ],
    "implementation_paths": {
      "control": {
        "selected": 12,
        "currentQueryPath": 0,
        "staleSearchPath": 12,
        "sdkCompilePassed": 0,
        "sdkCompileFailed": 12
      },
      "listing_only": {
        "selected": 12,
        "currentQueryPath": 0,
        "staleSearchPath": 12,
        "sdkCompilePassed": 0,
        "sdkCompileFailed": 12
      },
      "technical_evidence_only": {
        "selected": 16,
        "currentQueryPath": 16,
        "staleSearchPath": 0,
        "sdkCompilePassed": 15,
        "sdkCompileFailed": 1
      },
      "model_facing_evidence": {
        "selected": 16,
        "currentQueryPath": 16,
        "staleSearchPath": 0,
        "sdkCompilePassed": 16,
        "sdkCompileFailed": 0
      }
    },
    "interpretation": "Current technical guidance changed conditional provider choice and current-SDK compilation after it entered a fixed model-facing search receipt. This is not organic field lift."
  },
  "current_qdrant_path": {
    "checked_package": "@qdrant/js-client-rest@1.19.0",
    "requirements": [
      "Use one collection per embedding model with payload-based tenant partitioning for this task shape.",
      "Store tenant_id, account_id, and user_id in payload.",
      "Create keyword payload indexes before ingestion; mark tenant_id with is_tenant=true.",
      "Apply the tenant filter to every recall and deletion operation.",
      "Use QdrantClient.query() for the current dense-query path, not the stale search() shape."
    ],
    "recipe_sha256": "3e0d8bfbc930bfb6daafa3c0fcb680273c5ab7f8f725384c8a192959f525c3bc",
    "type_checked_recipe": "https://agentanalytics.org/research/qdrant-multi-tenant-ai-assistant-memory-typescript/qdrant-tenant-memory.ts",
    "official_sources": [
      {
        "title": "Qdrant multitenancy",
        "url": "https://qdrant.tech/documentation/tutorials/multiple-partitions/"
      },
      {
        "title": "Qdrant filtering",
        "url": "https://qdrant.tech/documentation/search/filtering/"
      },
      {
        "title": "Qdrant query and search",
        "url": "https://qdrant.tech/documentation/search/search/"
      },
      {
        "title": "Qdrant payload",
        "url": "https://qdrant.tech/documentation/concepts/payload/"
      },
      {
        "title": "Official Qdrant JavaScript/TypeScript SDK",
        "url": "https://github.com/qdrant/qdrant-js"
      }
    ]
  },
  "limitations": [
    "This is task-specific behavioral evidence, not an objective or universal vector-database ranking.",
    "The matched-context test conditions on saved WebSearch receipts and does not estimate organic listing, synthesis inclusion, fetching, or field lift.",
    "Replay controls reproduced only part of the original provider choices, so paired treatment contrasts are more defensible than absolute replay shares.",
    "Type checking does not prove credentials, network behavior, retrieval quality, deletion behavior against a live service, production reliability, adoption, or retention.",
    "No live provider API calls were made.",
    "No included provider commissioned or paid for this page, placement, wording, or removal."
  ],
  "source_hashes": {
    "category_evidence_sha256": "13a4e872278e769118d46379aa4c33654dab452683f5ee9f51036b791b3c4dae",
    "matched_context_analysis_sha256": "b141a8dade65b19f567e124492bacd92779c56246afccd997c4bda2cbc7e6927",
    "recipe_sha256": "3e0d8bfbc930bfb6daafa3c0fcb680273c5ab7f8f725384c8a192959f525c3bc"
  }
}
