Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
13 changes: 13 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -535,6 +535,7 @@ Options for indexing existing context history or enabling real-time indexing new
- ChromaVectorStore
- ElasticsearchStore
- PinecodeVectorStore
- QdrantVectorStore
- RedisVectorStore
- SimpleVectorStore
```
Expand Down Expand Up @@ -2973,6 +2974,7 @@ You can provide a single URI in the form of: `{scheme}://{user}:{password}@{host
- ChromaVectorStore
- ElasticsearchStore
- PinecodeVectorStore
- QdrantVectorStore
- RedisVectorStore
- SimpleVectorStore
```
Expand Down Expand Up @@ -3003,6 +3005,15 @@ Keyword arguments for Pinecone(`**kwargs`):
- `api_key`
- index_name (default: current index ID, already set, not required)

**QdrantVectorStore**

Keyword arguments for QdrantVectorStore(`**kwargs`):

- `url` - str, default: `http://localhost:6333`
- `api_key` - str, default: `None` (for Qdrant Cloud)
- `collection_name` (default: current index ID, already set, not required)
- any other keyword arguments provided on list

**RedisVectorStore**

Keyword arguments for RedisVectorStore(`**kwargs`):
Expand Down Expand Up @@ -3500,6 +3511,7 @@ You can create a custom vector store provider or data loader for your data and d
from pygpt_net.provider.vector_stores.chroma import ChromaProvider
from pygpt_net.provider.vector_stores.elasticsearch import ElasticsearchProvider
from pygpt_net.provider.vector_stores.pinecode import PinecodeProvider
from pygpt_net.provider.vector_stores.qdrant import QdrantProvider
from pygpt_net.provider.vector_stores.redis import RedisProvider
from pygpt_net.provider.vector_stores.simple import SimpleProvider

Expand All @@ -3509,6 +3521,7 @@ def run(**kwargs):
launcher.add_vector_store(ChromaProvider())
launcher.add_vector_store(ElasticsearchProvider())
launcher.add_vector_store(PinecodeProvider())
launcher.add_vector_store(QdrantProvider())
launcher.add_vector_store(RedisProvider())
launcher.add_vector_store(SimpleProvider())

Expand Down
10 changes: 10 additions & 0 deletions docs/source/configuration.rst
Original file line number Diff line number Diff line change
Expand Up @@ -729,6 +729,7 @@ Vector stores
* ChromaVectorStore
* ElasticsearchStore
* PinecodeVectorStore
* QdrantVectorStore
* RedisVectorStore
* SimpleVectorStore

Expand Down Expand Up @@ -758,6 +759,15 @@ Keyword arguments for Pinecone(``**kwargs``):
* ``api_key``
* index_name (default: current index ID, already set, not required)

**QdrantVectorStore**

Keyword arguments for QdrantVectorStore(``**kwargs``):

* ``url`` - str, default: `http://localhost:6333`
* ``api_key`` - str, default: `None` (for Qdrant Cloud)
* ``collection_name`` (default: current index ID, already set, not required)
* any other keyword arguments provided on list

**RedisVectorStore**

Keyword arguments for RedisVectorStore(``**kwargs``):
Expand Down
2 changes: 2 additions & 0 deletions docs/source/extending.rst
Original file line number Diff line number Diff line change
Expand Up @@ -412,6 +412,7 @@ You can create a custom vector store provider or data loader for your data and d
from pygpt_net.provider.vector_stores.chroma import ChromaProvider
from pygpt_net.provider.vector_stores.elasticsearch import ElasticsearchProvider
from pygpt_net.provider.vector_stores.pinecode import PinecodeProvider
from pygpt_net.provider.vector_stores.qdrant import QdrantProvider
from pygpt_net.provider.vector_stores.redis import RedisProvider
from pygpt_net.provider.vector_stores.simple import SimpleProvider
Expand All @@ -421,6 +422,7 @@ You can create a custom vector store provider or data loader for your data and d
launcher.add_vector_store(ChromaProvider())
launcher.add_vector_store(ElasticsearchProvider())
launcher.add_vector_store(PinecodeProvider())
launcher.add_vector_store(QdrantProvider())
launcher.add_vector_store(RedisProvider())
launcher.add_vector_store(SimpleProvider())
Expand Down
263 changes: 227 additions & 36 deletions poetry.lock

Large diffs are not rendered by default.

1 change: 1 addition & 0 deletions pyproject.toml
Original file line number Diff line number Diff line change
Expand Up @@ -106,6 +106,7 @@ pygame = "^2.6.1"
pypdf = "6.1.0"
pynput = "^1.8.1"
pyserial = "^3.5"
llama-index-vector-stores-qdrant = "^0.8.5"
PySide6 = "6.9.1"
python-markdown-math = "^0.8"
qasync = "^0.27.1"
Expand Down
226 changes: 96 additions & 130 deletions requirements.txt

Large diffs are not rendered by default.

1 change: 1 addition & 0 deletions setup.py
Original file line number Diff line number Diff line change
Expand Up @@ -90,6 +90,7 @@
'llama-index-vector-stores-chroma>=0.4.2,<0.5.0',
'llama-index-vector-stores-elasticsearch==0.4.0',
'llama-index-vector-stores-pinecone>=0.6.0,<0.7.0',
'llama-index-vector-stores-qdrant>=0.8.0,<0.9.0',
'llama-index-vector-stores-redis>=0.4.0,<0.5.0',
'llama-index-readers-chatgpt-plugin>=0.3.0,<0.4.0',
'llama-index-readers-database>=0.3.0,<0.4.0',
Expand Down
2 changes: 2 additions & 0 deletions src/pygpt_net/app.py
Original file line number Diff line number Diff line change
Expand Up @@ -146,6 +146,7 @@ def open_wrapper(file, mode='r', *args, **kwargs):
from pygpt_net.provider.vector_stores.chroma import ChromaProvider
from pygpt_net.provider.vector_stores.elasticsearch import ElasticsearchProvider
from pygpt_net.provider.vector_stores.pinecode import PinecodeProvider
from pygpt_net.provider.vector_stores.qdrant import QdrantProvider
from pygpt_net.provider.vector_stores.redis import RedisProvider
from pygpt_net.provider.vector_stores.simple import SimpleProvider

Expand Down Expand Up @@ -475,6 +476,7 @@ def run(**kwargs):
launcher.add_vector_store(ChromaProvider())
launcher.add_vector_store(ElasticsearchProvider())
launcher.add_vector_store(PinecodeProvider())
launcher.add_vector_store(QdrantProvider())
launcher.add_vector_store(RedisProvider())
launcher.add_vector_store(SimpleProvider())

Expand Down
117 changes: 117 additions & 0 deletions src/pygpt_net/provider/vector_stores/qdrant.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,117 @@
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
# ================================================== #
# This file is a part of PYGPT package #
# Website: https://pygpt.net #
# GitHub: https://github.com/szczyglis-dev/py-gpt #
# MIT License #
# Created By : Marcin Szczygliński #
# Updated Date: 2025.09.30 13:00:00 #
# ================================================== #

import datetime
import os.path
from typing import Optional

from llama_index.core.indices.base import BaseIndex
from llama_index.core import StorageContext

from pygpt_net.utils import parse_args
from .base import BaseStore


class QdrantProvider(BaseStore):
def __init__(self, *args, **kwargs):
super(QdrantProvider, self).__init__(*args, **kwargs)
"""
Qdrant vector store provider

:param args: args
:param kwargs: kwargs
"""
self.window = kwargs.get('window', None)
self.id = "QdrantVectorStore"
self.prefix = "qdrant_" # prefix for index directory
self.indexes = {}

def create(self, id: str):
"""
Create empty index

:param id: index name
"""
path = self.get_path(id)
if not os.path.exists(path):
os.makedirs(path, exist_ok=True)
self.store(id)

def get_qdrant_store(self, id: str):
"""
Get Qdrant vector store

:param id: index name
:return: QdrantVectorStore instance
"""
from llama_index.vector_stores.qdrant import QdrantVectorStore

additional_args = parse_args(
self.window.core.config.get('llama.idx.storage.args', []),
)

url = additional_args.get('url', 'http://localhost:6333')
api_key = additional_args.get('api_key', '')

store_args = {k: v for k, v in additional_args.items() if k not in ['url', 'api_key', 'collection_name']}

return QdrantVectorStore(
url=url,
api_key=api_key,
collection_name=id,
**store_args
)

def get(
self,
id: str,
llm: Optional = None,
embed_model: Optional = None,
) -> BaseIndex:
"""
Get index

:param id: index name
:param llm: LLM instance
:param embed_model: Embedding model instance
:return: index instance
"""
if not self.exists(id):
self.create(id)
vector_store = self.get_qdrant_store(id)
storage_context = StorageContext.from_defaults(
vector_store=vector_store,
)
self.indexes[id] = self.index_from_store(
vector_store=vector_store,
storage_context=storage_context,
llm=llm,
embed_model=embed_model,
)
return self.indexes[id]

def store(
self,
id: str,
index: Optional[BaseIndex] = None
):
"""
Store index

:param id: index name
:param index: index instance
"""
path = self.get_path(id)
os.makedirs(path, exist_ok=True)
lock_file = os.path.join(path, 'store.lock')
with open(lock_file, 'w') as f:
f.write(id + ': ' + str(datetime.datetime.now()))
self.indexes[id] = index