Skip to content
Snippets Groups Projects
Unverified Commit 1be69a5a authored by Anush's avatar Anush Committed by GitHub
Browse files

feat: Qdrant support (#42)

parent 6acccd2b
Branches
Tags
No related merge requests found
---
"create-llama": patch
---
Add Qdrant support
...@@ -108,6 +108,23 @@ const getVectorDBEnvs = (vectorDb: TemplateVectorDB) => { ...@@ -108,6 +108,23 @@ const getVectorDBEnvs = (vectorDb: TemplateVectorDB) => {
description: "The name of the collection in your Astra database", description: "The name of the collection in your Astra database",
}, },
]; ];
case "qdrant":
return [
{
name: "QDRANT_URL",
description:
"The qualified REST URL of the Qdrant server. Eg: http://localhost:6333",
},
{
name: "QDRANT_COLLECTION",
description: "The name of Qdrant collection to use.",
},
{
name: "QDRANT_API_KEY",
description:
"Optional API key for authenticating requests to Qdrant.",
},
];
default: default:
return []; return [];
} }
......
...@@ -10,7 +10,8 @@ export type TemplateVectorDB = ...@@ -10,7 +10,8 @@ export type TemplateVectorDB =
| "pg" | "pg"
| "pinecone" | "pinecone"
| "milvus" | "milvus"
| "astra"; | "astra"
| "qdrant";
export type TemplatePostInstallAction = export type TemplatePostInstallAction =
| "none" | "none"
| "VSCode" | "VSCode"
......
...@@ -102,6 +102,7 @@ const getVectorDbChoices = (framework: TemplateFramework) => { ...@@ -102,6 +102,7 @@ const getVectorDbChoices = (framework: TemplateFramework) => {
{ title: "Pinecone", value: "pinecone" }, { title: "Pinecone", value: "pinecone" },
{ title: "Milvus", value: "milvus" }, { title: "Milvus", value: "milvus" },
{ title: "Astra", value: "astra" }, { title: "Astra", value: "astra" },
{ title: "Qdrant", value: "qdrant" },
]; ];
const vectordbLang = framework === "fastapi" ? "python" : "typescript"; const vectordbLang = framework === "fastapi" ? "python" : "typescript";
......
import logging
import os
from app.engine.loaders import get_documents
from app.settings import init_settings
from dotenv import load_dotenv
from llama_index.core.indices import VectorStoreIndex
from llama_index.core.storage import StorageContext
from llama_index.vector_stores.qdrant import QdrantVectorStore
load_dotenv()
logging.basicConfig(level=logging.INFO)
logger = logging.getLogger()
def generate_datasource():
init_settings()
logger.info("Creating new index with Qdrant")
# load the documents and create the index
documents = get_documents()
store = QdrantVectorStore(
collection_name=os.getenv("QDRANT_COLLECTION"),
url=os.getenv("QDRANT_URL"),
api_key=os.getenv("QDRANT_API_KEY"),
)
storage_context = StorageContext.from_defaults(vector_store=store)
VectorStoreIndex.from_documents(
documents,
storage_context=storage_context,
show_progress=True, # this will show you a progress bar as the embeddings are created
)
logger.info(
f"Successfully uploaded documents to the {os.getenv('QDRANT_COLLECTION')} collection."
)
if __name__ == "__main__":
generate_datasource()
import logging
import os
from llama_index.core.indices import VectorStoreIndex
from llama_index.vector_stores.qdrant import QdrantVectorStore
logger = logging.getLogger("uvicorn")
def get_index():
logger.info("Connecting to Qdrant collection..")
store = QdrantVectorStore(
collection_name=os.getenv("QDRANT_COLLECTION"),
url=os.getenv("QDRANT_URL"),
api_key=os.getenv("QDRANT_API_KEY"),
)
index = VectorStoreIndex.from_vector_store(store)
logger.info("Finished connecting to Qdrant collection.")
return index
/* eslint-disable turbo/no-undeclared-env-vars */
import * as dotenv from "dotenv";
import {
QdrantVectorStore,
VectorStoreIndex,
storageContextFromDefaults,
} from "llamaindex";
import { getDocuments } from "./loader";
import { initSettings } from "./settings";
import { checkRequiredEnvVars, getQdrantClient } from "./shared";
dotenv.config();
const collectionName = process.env.QDRANT_COLLECTION;
async function loadAndIndex() {
// load objects from storage and convert them into LlamaIndex Document objects
const documents = await getDocuments();
// Connect to Qdrant
const vectorStore = new QdrantVectorStore(collectionName, getQdrantClient());
const storageContext = await storageContextFromDefaults({ vectorStore });
await VectorStoreIndex.fromDocuments(documents, {
storageContext: storageContext,
});
console.log(
`Successfully upload embeddings to Qdrant collection ${collectionName}.`,
);
}
(async () => {
checkRequiredEnvVars();
initSettings();
await loadAndIndex();
console.log("Finished generating storage.");
})();
import * as dotenv from "dotenv";
import { QdrantVectorStore, VectorStoreIndex } from "llamaindex";
import { checkRequiredEnvVars, getQdrantClient } from "./shared";
dotenv.config();
export async function getDataSource() {
checkRequiredEnvVars();
const collectionName = process.env.QDRANT_COLLECTION;
const store = new QdrantVectorStore(collectionName, getQdrantClient());
return await VectorStoreIndex.fromVectorStore(store);
}
import { QdrantClient } from "@qdrant/js-client-rest";
const REQUIRED_ENV_VARS = ["QDRANT_URL", "QDRANT_COLLECTION"]; // QDRANT_API_KEY is optional
export function getQdrantClient() {
const url = process.env.QDRANT_URL;
if (!url) {
throw new Error("QDRANT_URL environment variable is required");
}
const apiKey = process.env?.QDRANT_API_KEY;
return new QdrantClient({
url,
apiKey,
});
}
export function checkRequiredEnvVars() {
const missingEnvVars = REQUIRED_ENV_VARS.filter((envVar) => {
return !process.env[envVar];
});
if (missingEnvVars.length > 0) {
console.log(
`The following environment variables are required but missing: ${missingEnvVars.join(
", ",
)}`,
);
throw new Error(
`Missing environment variables: ${missingEnvVars.join(", ")}`,
);
}
}
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment