pygpt-net 2.6.65__py3-none-any.whl → 2.6.67__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.
Files changed (50) hide show
  1. pygpt_net/CHANGELOG.txt +17 -0
  2. pygpt_net/__init__.py +3 -3
  3. pygpt_net/app.py +2 -0
  4. pygpt_net/controller/chat/chat.py +0 -0
  5. pygpt_net/controller/chat/handler/openai_stream.py +137 -7
  6. pygpt_net/controller/chat/render.py +0 -0
  7. pygpt_net/controller/config/field/checkbox_list.py +34 -1
  8. pygpt_net/controller/config/field/textarea.py +2 -2
  9. pygpt_net/controller/dialogs/info.py +2 -2
  10. pygpt_net/controller/media/media.py +48 -1
  11. pygpt_net/controller/model/editor.py +74 -9
  12. pygpt_net/controller/presets/presets.py +4 -1
  13. pygpt_net/controller/settings/editor.py +25 -1
  14. pygpt_net/controller/ui/mode.py +14 -10
  15. pygpt_net/controller/ui/ui.py +18 -1
  16. pygpt_net/core/image/image.py +34 -1
  17. pygpt_net/core/tabs/tabs.py +0 -0
  18. pygpt_net/core/types/image.py +70 -3
  19. pygpt_net/core/video/video.py +43 -3
  20. pygpt_net/data/config/config.json +4 -3
  21. pygpt_net/data/config/models.json +637 -38
  22. pygpt_net/data/locale/locale.de.ini +5 -0
  23. pygpt_net/data/locale/locale.en.ini +5 -0
  24. pygpt_net/data/locale/locale.es.ini +5 -0
  25. pygpt_net/data/locale/locale.fr.ini +5 -0
  26. pygpt_net/data/locale/locale.it.ini +5 -0
  27. pygpt_net/data/locale/locale.pl.ini +5 -0
  28. pygpt_net/data/locale/locale.uk.ini +5 -0
  29. pygpt_net/data/locale/locale.zh.ini +5 -0
  30. pygpt_net/item/model.py +15 -19
  31. pygpt_net/provider/agents/openai/agent.py +0 -0
  32. pygpt_net/provider/api/google/__init__.py +20 -9
  33. pygpt_net/provider/api/google/image.py +161 -28
  34. pygpt_net/provider/api/google/video.py +73 -36
  35. pygpt_net/provider/api/openai/__init__.py +21 -11
  36. pygpt_net/provider/api/openai/agents/client.py +0 -0
  37. pygpt_net/provider/api/openai/video.py +562 -0
  38. pygpt_net/provider/core/config/patch.py +7 -0
  39. pygpt_net/provider/core/model/patch.py +54 -3
  40. pygpt_net/provider/vector_stores/qdrant.py +117 -0
  41. pygpt_net/ui/dialog/models.py +10 -1
  42. pygpt_net/ui/layout/toolbox/raw.py +7 -1
  43. pygpt_net/ui/layout/toolbox/video.py +14 -6
  44. pygpt_net/ui/widget/option/checkbox_list.py +14 -2
  45. pygpt_net/ui/widget/option/input.py +3 -1
  46. {pygpt_net-2.6.65.dist-info → pygpt_net-2.6.67.dist-info}/METADATA +72 -25
  47. {pygpt_net-2.6.65.dist-info → pygpt_net-2.6.67.dist-info}/RECORD +45 -43
  48. {pygpt_net-2.6.65.dist-info → pygpt_net-2.6.67.dist-info}/LICENSE +0 -0
  49. {pygpt_net-2.6.65.dist-info → pygpt_net-2.6.67.dist-info}/WHEEL +0 -0
  50. {pygpt_net-2.6.65.dist-info → pygpt_net-2.6.67.dist-info}/entry_points.txt +0 -0
@@ -0,0 +1,117 @@
1
+ #!/usr/bin/env python3
2
+ # -*- coding: utf-8 -*-
3
+ # ================================================== #
4
+ # This file is a part of PYGPT package #
5
+ # Website: https://pygpt.net #
6
+ # GitHub: https://github.com/szczyglis-dev/py-gpt #
7
+ # MIT License #
8
+ # Created By : Marcin Szczygliński #
9
+ # Updated Date: 2025.09.30 13:00:00 #
10
+ # ================================================== #
11
+
12
+ import datetime
13
+ import os.path
14
+ from typing import Optional
15
+
16
+ from llama_index.core.indices.base import BaseIndex
17
+ from llama_index.core import StorageContext
18
+
19
+ from pygpt_net.utils import parse_args
20
+ from .base import BaseStore
21
+
22
+
23
+ class QdrantProvider(BaseStore):
24
+ def __init__(self, *args, **kwargs):
25
+ super(QdrantProvider, self).__init__(*args, **kwargs)
26
+ """
27
+ Qdrant vector store provider
28
+
29
+ :param args: args
30
+ :param kwargs: kwargs
31
+ """
32
+ self.window = kwargs.get('window', None)
33
+ self.id = "QdrantVectorStore"
34
+ self.prefix = "qdrant_" # prefix for index directory
35
+ self.indexes = {}
36
+
37
+ def create(self, id: str):
38
+ """
39
+ Create empty index
40
+
41
+ :param id: index name
42
+ """
43
+ path = self.get_path(id)
44
+ if not os.path.exists(path):
45
+ os.makedirs(path, exist_ok=True)
46
+ self.store(id)
47
+
48
+ def get_qdrant_store(self, id: str):
49
+ """
50
+ Get Qdrant vector store
51
+
52
+ :param id: index name
53
+ :return: QdrantVectorStore instance
54
+ """
55
+ from llama_index.vector_stores.qdrant import QdrantVectorStore
56
+
57
+ additional_args = parse_args(
58
+ self.window.core.config.get('llama.idx.storage.args', []),
59
+ )
60
+
61
+ url = additional_args.get('url', 'http://localhost:6333')
62
+ api_key = additional_args.get('api_key', '')
63
+
64
+ store_args = {k: v for k, v in additional_args.items() if k not in ['url', 'api_key', 'collection_name']}
65
+
66
+ return QdrantVectorStore(
67
+ url=url,
68
+ api_key=api_key,
69
+ collection_name=id,
70
+ **store_args
71
+ )
72
+
73
+ def get(
74
+ self,
75
+ id: str,
76
+ llm: Optional = None,
77
+ embed_model: Optional = None,
78
+ ) -> BaseIndex:
79
+ """
80
+ Get index
81
+
82
+ :param id: index name
83
+ :param llm: LLM instance
84
+ :param embed_model: Embedding model instance
85
+ :return: index instance
86
+ """
87
+ if not self.exists(id):
88
+ self.create(id)
89
+ vector_store = self.get_qdrant_store(id)
90
+ storage_context = StorageContext.from_defaults(
91
+ vector_store=vector_store,
92
+ )
93
+ self.indexes[id] = self.index_from_store(
94
+ vector_store=vector_store,
95
+ storage_context=storage_context,
96
+ llm=llm,
97
+ embed_model=embed_model,
98
+ )
99
+ return self.indexes[id]
100
+
101
+ def store(
102
+ self,
103
+ id: str,
104
+ index: Optional[BaseIndex] = None
105
+ ):
106
+ """
107
+ Store index
108
+
109
+ :param id: index name
110
+ :param index: index instance
111
+ """
112
+ path = self.get_path(id)
113
+ os.makedirs(path, exist_ok=True)
114
+ lock_file = os.path.join(path, 'store.lock')
115
+ with open(lock_file, 'w') as f:
116
+ f.write(id + ': ' + str(datetime.datetime.now()))
117
+ self.indexes[id] = index
@@ -6,7 +6,7 @@
6
6
  # GitHub: https://github.com/szczyglis-dev/py-gpt #
7
7
  # MIT License #
8
8
  # Created By : Marcin Szczygliński #
9
- # Updated Date: 2025.09.05 18:00:00 #
9
+ # Updated Date: 2025.12.26 13:00:00 #
10
10
  # ================================================== #
11
11
 
12
12
  import copy
@@ -166,11 +166,20 @@ class Models:
166
166
  self.window.ui.nodes['models.editor.search'].on_search = self._on_search_models
167
167
  self.window.ui.nodes['models.editor.search'].on_clear = self._on_clear_models # clear via "X" button
168
168
 
169
+ # provider select
170
+ option_provider = self.window.controller.model.editor.get_provider_option()
171
+ self.window.ui.config[parent_id]['provider_global'] = OptionCombo(self.window, parent_id, 'provider_global',
172
+ option_provider)
173
+ provider_keys = self.window.controller.config.placeholder.apply_by_id('llm_providers')
174
+ provider_keys.insert(0, {"-": trans("list.all")}) # add "All" option
175
+ self.window.ui.config[parent_id]['provider_global'].set_keys(provider_keys)
176
+
169
177
  # container for search + list (left panel)
170
178
  left_layout = QVBoxLayout()
171
179
  left_layout.setContentsMargins(0, 0, 0, 0)
172
180
  left_layout.setSpacing(6)
173
181
  left_layout.addWidget(self.window.ui.nodes['models.editor.search'])
182
+ left_layout.addWidget(self.window.ui.config[parent_id]['provider_global'])
174
183
  left_layout.addWidget(self.window.ui.nodes[id])
175
184
  left_widget = QWidget()
176
185
  left_widget.setLayout(left_layout)
@@ -6,11 +6,12 @@
6
6
  # GitHub: https://github.com/szczyglis-dev/py-gpt #
7
7
  # MIT License #
8
8
  # Created By : Marcin Szczygliński #
9
- # Updated Date: 2025.09.01 23:00:00 #
9
+ # Updated Date: 2025.12.25 20:00:00 #
10
10
  # ================================================== #
11
11
 
12
12
  from PySide6.QtWidgets import QVBoxLayout, QHBoxLayout, QWidget, QCheckBox
13
13
 
14
+ from pygpt_net.ui.widget.option.combo import OptionCombo
14
15
  from pygpt_net.utils import trans
15
16
 
16
17
 
@@ -39,7 +40,12 @@ class Raw:
39
40
  conf_global['img_raw'] = QCheckBox(trans("img.raw"), parent=container)
40
41
  conf_global['img_raw'].toggled.connect(self.window.controller.media.toggle_raw)
41
42
 
43
+ conf_global = ui.config['global']
44
+ option_modes = self.window.core.image.get_available_modes()
45
+ conf_global['img_mode'] = OptionCombo(self.window, 'global', 'img_mode', option_modes)
46
+
42
47
  cols = QHBoxLayout()
48
+ cols.addWidget(conf_global['img_mode'])
43
49
  cols.addWidget(conf_global['img_raw'])
44
50
 
45
51
  rows = QVBoxLayout()
@@ -6,12 +6,13 @@
6
6
  # GitHub: https://github.com/szczyglis-dev/py-gpt #
7
7
  # MIT License #
8
8
  # Created By : Marcin Szczygliński #
9
- # Updated Date: 2025.09.01 23:00:00 #
9
+ # Updated Date: 2025.12.26 12:00:00 #
10
10
  # ================================================== #
11
11
 
12
- from PySide6.QtWidgets import QVBoxLayout, QWidget
12
+ from PySide6.QtWidgets import QWidget, QHBoxLayout
13
13
 
14
14
  from pygpt_net.ui.widget.option.combo import OptionCombo
15
+ from pygpt_net.ui.widget.option.input import OptionInput
15
16
 
16
17
 
17
18
  class Video:
@@ -36,11 +37,18 @@ class Video:
36
37
  container = QWidget()
37
38
  ui.nodes['video.options'] = container
38
39
 
39
- option_resolutions = self.window.core.video.get_aspect_ratio_option()
40
- conf_global['video.aspect_ratio'] = OptionCombo(self.window, 'global', 'video.aspect_ratio', option_resolutions)
40
+ option_ratio = self.window.core.video.get_aspect_ratio_option()
41
+ option_resolution = self.window.core.video.get_resolution_option()
42
+ option_duration = self.window.core.video.get_duration_option()
41
43
 
42
- rows = QVBoxLayout()
43
- rows.addWidget(conf_global['video.aspect_ratio'])
44
+ conf_global['video.aspect_ratio'] = OptionCombo(self.window, 'global', 'video.aspect_ratio', option_ratio)
45
+ conf_global['video.resolution'] = OptionCombo(self.window, 'global', 'video.resolution', option_resolution)
46
+ conf_global['video.duration'] = OptionInput(self.window, 'global', 'video.duration', option_duration)
47
+
48
+ rows = QHBoxLayout()
49
+ rows.addWidget(conf_global['video.resolution'], 2)
50
+ rows.addWidget(conf_global['video.aspect_ratio'], 2)
51
+ rows.addWidget(conf_global['video.duration'], 1)
44
52
  rows.setContentsMargins(2, 5, 5, 5)
45
53
 
46
54
  container.setLayout(rows)
@@ -6,10 +6,10 @@
6
6
  # GitHub: https://github.com/szczyglis-dev/py-gpt #
7
7
  # MIT License #
8
8
  # Created By : Marcin Szczygliński #
9
- # Updated Date: 2025.08.24 23:00:00 #
9
+ # Updated Date: 2025.12.25 20:00:00 #
10
10
  # ================================================== #
11
11
 
12
- from PySide6.QtWidgets import QCheckBox, QWidget
12
+ from PySide6.QtWidgets import QCheckBox, QWidget, QPushButton
13
13
 
14
14
  from pygpt_net.ui.base.flow_layout import FlowLayout
15
15
  from pygpt_net.utils import trans
@@ -84,6 +84,18 @@ class OptionCheckboxList(QWidget):
84
84
  for widget in widgets:
85
85
  self.layout.addWidget(widget)
86
86
 
87
+ # select/unselect all button
88
+ btn_select = QPushButton("X", self)
89
+ btn_select.setToolTip(trans("action.select_unselect_all"))
90
+ btn_select.clicked.connect(
91
+ lambda: self.window.controller.config.checkbox_list.on_select_all(
92
+ self.parent_id,
93
+ self.id,
94
+ self.option
95
+ )
96
+ )
97
+ self.layout.addWidget(btn_select)
98
+
87
99
  self.layout.setContentsMargins(0, 0, 0, 0)
88
100
  self.setLayout(self.layout)
89
101
 
@@ -6,7 +6,7 @@
6
6
  # GitHub: https://github.com/szczyglis-dev/py-gpt #
7
7
  # MIT License #
8
8
  # Created By : Marcin Szczygliński #
9
- # Updated Date: 2025.08.24 23:00:00 #
9
+ # Updated Date: 2025.12.26 12:00:00 #
10
10
  # ================================================== #
11
11
 
12
12
  from PySide6.QtGui import QAction, QIcon
@@ -104,6 +104,8 @@ class OptionInput(QLineEdit):
104
104
  self.real_time = self.option["real_time"]
105
105
  if "read_only" in self.option and self.option["read_only"]:
106
106
  self.setReadOnly(True)
107
+ if "placeholder" in self.option and self.option["placeholder"]:
108
+ self.setPlaceholderText(self.option["placeholder"])
107
109
 
108
110
  # on update hook
109
111
  self.textChanged.connect(
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.3
2
2
  Name: pygpt-net
3
- Version: 2.6.65
3
+ Version: 2.6.67
4
4
  Summary: Desktop AI Assistant powered by: OpenAI GPT-5, GPT-4, o1, o3, Gemini, Claude, Grok, DeepSeek, and other models supported by Llama Index, and Ollama. Chatbot, agents, completion, image generation, vision analysis, speech-to-text, plugins, MCP, internet access, file handling, command execution and more.
5
5
  License: MIT
6
6
  Keywords: ai,api,api key,app,assistant,bielik,chat,chatbot,chatgpt,claude,dall-e,deepseek,desktop,gemini,gpt,gpt-3.5,gpt-4,gpt-4-vision,gpt-4o,gpt-5,gpt-oss,gpt3.5,gpt4,grok,langchain,llama-index,llama3,mistral,o1,o3,ollama,openai,presets,py-gpt,py_gpt,pygpt,pyside,qt,text completion,tts,ui,vision,whisper
@@ -24,44 +24,45 @@ Requires-Dist: Pygments (==2.19.2)
24
24
  Requires-Dist: SQLAlchemy (==2.0.43)
25
25
  Requires-Dist: SpeechRecognition (>=3.14.3,<4.0.0)
26
26
  Requires-Dist: Telethon (>=1.40.0,<2.0.0)
27
- Requires-Dist: anthropic (>=0.68.0,<0.69.0)
28
- Requires-Dist: azure-core (==1.35.1)
27
+ Requires-Dist: anthropic (>=0.75.0,<0.76.0)
28
+ Requires-Dist: azure-core (==1.37.0)
29
29
  Requires-Dist: beautifulsoup4 (==4.13.5)
30
+ Requires-Dist: charset-normalizer (>=2.0,!=3.2.0)
30
31
  Requires-Dist: chromadb (==1.1.0)
31
32
  Requires-Dist: croniter (>=2.0.7,<3.0.0)
32
33
  Requires-Dist: ddgs (>=9.5.5,<10.0.0)
33
34
  Requires-Dist: docker (>=7.1.0,<8.0.0)
34
35
  Requires-Dist: docx2txt (>=0.8,<0.9)
35
36
  Requires-Dist: gkeepapi (==0.15.1)
36
- Requires-Dist: google-api-python-client (==2.182.0)
37
- Requires-Dist: google-generativeai (==0.8.5)
37
+ Requires-Dist: google-api-python-client (==2.187.0)
38
+ Requires-Dist: google-genai (>=1.56.0,<2.0.0)
38
39
  Requires-Dist: grpcio (==1.75.0)
39
40
  Requires-Dist: httpx (==0.28.1)
40
41
  Requires-Dist: httpx-socks (>=0.10.1,<0.11.0)
41
42
  Requires-Dist: huggingface-hub (==0.35.0)
42
43
  Requires-Dist: ipykernel (>=6.30.1,<7.0.0)
43
44
  Requires-Dist: jupyter_client (>=8.6.3,<9.0.0)
44
- Requires-Dist: llama-index (==0.13.6)
45
- Requires-Dist: llama-index-core (==0.13.6)
45
+ Requires-Dist: llama-index (==0.14.10)
46
+ Requires-Dist: llama-index-core (==0.14.10)
46
47
  Requires-Dist: llama-index-embeddings-azure-openai (>=0.4.1,<0.5.0)
47
48
  Requires-Dist: llama-index-embeddings-gemini (>=0.4.1,<0.5.0)
48
49
  Requires-Dist: llama-index-embeddings-google-genai (>=0.3.1,<0.4.0)
49
50
  Requires-Dist: llama-index-embeddings-huggingface-api (>=0.4.1,<0.5.0)
50
51
  Requires-Dist: llama-index-embeddings-mistralai (>=0.4.1,<0.5.0)
51
- Requires-Dist: llama-index-embeddings-ollama (>=0.8.3,<0.9.0)
52
+ Requires-Dist: llama-index-embeddings-ollama (>=0.8.5,<0.9.0)
52
53
  Requires-Dist: llama-index-embeddings-openai (>=0.5.1,<0.6.0)
53
54
  Requires-Dist: llama-index-embeddings-openai-like (>=0.2.2,<0.3.0)
54
- Requires-Dist: llama-index-embeddings-voyageai (>=0.4.2,<0.5.0)
55
- Requires-Dist: llama-index-llms-anthropic (>=0.8.6,<0.9.0)
56
- Requires-Dist: llama-index-llms-azure-openai (>=0.4.1,<0.5.0)
55
+ Requires-Dist: llama-index-embeddings-voyageai (>=0.5.2,<0.6.0)
56
+ Requires-Dist: llama-index-llms-anthropic (>=0.10.4,<0.11.0)
57
+ Requires-Dist: llama-index-llms-azure-openai (>=0.4.2,<0.5.0)
57
58
  Requires-Dist: llama-index-llms-deepseek (>=0.2.2,<0.3.0)
58
59
  Requires-Dist: llama-index-llms-gemini (>=0.6.1,<0.7.0)
59
- Requires-Dist: llama-index-llms-google-genai (>=0.3.1,<0.4.0)
60
+ Requires-Dist: llama-index-llms-google-genai (>=0.8.2,<0.9.0)
60
61
  Requires-Dist: llama-index-llms-huggingface-api (>=0.6.1,<0.7.0)
61
- Requires-Dist: llama-index-llms-mistralai (>=0.7.1,<0.8.0)
62
- Requires-Dist: llama-index-llms-ollama (>=0.7.3,<0.8.0)
63
- Requires-Dist: llama-index-llms-openai (>=0.5.6,<0.6.0)
64
- Requires-Dist: llama-index-llms-openai-like (>=0.5.1,<0.6.0)
62
+ Requires-Dist: llama-index-llms-mistralai (>=0.9.0,<0.10.0)
63
+ Requires-Dist: llama-index-llms-ollama (>=0.9.1,<0.10.0)
64
+ Requires-Dist: llama-index-llms-openai (>=0.6.12,<0.7.0)
65
+ Requires-Dist: llama-index-llms-openai-like (>=0.5.3,<0.6.0)
65
66
  Requires-Dist: llama-index-llms-perplexity (>=0.4.1,<0.5.0)
66
67
  Requires-Dist: llama-index-multi-modal-llms-openai (>=0.6.1,<0.7.0)
67
68
  Requires-Dist: llama-index-readers-chatgpt-plugin (>=0.4.1,<0.5.0)
@@ -75,14 +76,15 @@ Requires-Dist: llama-index-readers-web (>=0.5.3,<0.6.0)
75
76
  Requires-Dist: llama-index-vector-stores-chroma (>=0.5.3,<0.6.0)
76
77
  Requires-Dist: llama-index-vector-stores-elasticsearch (==0.5.1)
77
78
  Requires-Dist: llama-index-vector-stores-pinecone (>=0.7.1,<0.8.0)
78
- Requires-Dist: llama-index-vector-stores-redis (>=0.6.1,<0.7.0)
79
+ Requires-Dist: llama-index-vector-stores-qdrant (>=0.8.5,<0.9.0)
80
+ Requires-Dist: llama-index-vector-stores-redis (>=0.6.2,<0.7.0)
79
81
  Requires-Dist: mcp (>=1.13.1,<2.0.0)
80
82
  Requires-Dist: mss (>=9.0.2,<10.0.0)
81
83
  Requires-Dist: nbconvert (>=7.16.6,<8.0.0)
82
84
  Requires-Dist: numpy (==1.26.4)
83
85
  Requires-Dist: onnxruntime (==1.22.1)
84
- Requires-Dist: openai (==1.108.2)
85
- Requires-Dist: openai-agents (>=0.2.3,<0.3.0)
86
+ Requires-Dist: openai (==2.14.0)
87
+ Requires-Dist: openai-agents (>=0.6.4,<0.7.0)
86
88
  Requires-Dist: opencv-python (>=4.11.0.86,<5.0.0.0)
87
89
  Requires-Dist: packaging (>=25.0,<26.0)
88
90
  Requires-Dist: pandas (==2.2.3)
@@ -104,7 +106,7 @@ Requires-Dist: tiktoken (==0.11.0)
104
106
  Requires-Dist: transformers (==4.56.2)
105
107
  Requires-Dist: urllib3 (==2.5.0)
106
108
  Requires-Dist: wikipedia (>=1.4.0,<2.0.0)
107
- Requires-Dist: xai-sdk (>=1.1.0,<2.0.0)
109
+ Requires-Dist: xai-sdk (>=1.5.0,<2.0.0)
108
110
  Requires-Dist: youtube-transcript-api (>=0.6.3,<0.7.0)
109
111
  Project-URL: Changelog, https://github.com/szczyglis-dev/py-gpt/blob/master/CHANGELOG.md
110
112
  Project-URL: Documentation, https://pygpt.readthedocs.io/
@@ -117,7 +119,7 @@ Description-Content-Type: text/markdown
117
119
 
118
120
  [![pygpt](https://snapcraft.io/pygpt/badge.svg)](https://snapcraft.io/pygpt)
119
121
 
120
- Release: **2.6.65** | build: **2025-09-28** | Python: **>=3.10, <3.14**
122
+ Release: **2.6.67** | build: **2025-12-26** | Python: **>=3.10, <3.14**
121
123
 
122
124
  > Official website: https://pygpt.net | Documentation: https://pygpt.readthedocs.io
123
125
  >
@@ -183,7 +185,8 @@ You can download compiled 64-bit versions for Windows and Linux here: https://py
183
185
  - Includes an node-based Agents Builder.
184
186
  - Supports multiple languages.
185
187
  - Requires no previous knowledge of using AI models.
186
- - Simplifies image generation using image models like `DALL-E` and `Imagen`.
188
+ - Image generation via models like `DALL-E`, `gpt-image`, `Imagen` and `Nano Banana`.
189
+ - Video generation via models like `Veo3` and `Sora2`.
187
190
  - Fully configurable.
188
191
  - Themes support.
189
192
  - Real-time code syntax highlighting.
@@ -650,6 +653,7 @@ Options for indexing existing context history or enabling real-time indexing new
650
653
  - ChromaVectorStore
651
654
  - ElasticsearchStore
652
655
  - PinecodeVectorStore
656
+ - QdrantVectorStore
653
657
  - RedisVectorStore
654
658
  - SimpleVectorStore
655
659
  ```
@@ -706,7 +710,10 @@ Plugin allows you to generate images in Chat mode:
706
710
 
707
711
  ![v3_img_chat](https://github.com/szczyglis-dev/py-gpt/raw/master/docs/source/images/v3_img_chat.png)
708
712
 
709
- **Video generation**: From version `2.6.32`, video generation (using `Google Veo 3`) is also available.
713
+ **Video generation**:
714
+
715
+ From version `2.6.32`, video generation (using `Google Veo 3`) is also available.
716
+ From version `2.6.66`, video generation (using `OpenAI Sora 2`) is also available.
710
717
 
711
718
  ### Multiple variants
712
719
 
@@ -1154,7 +1161,7 @@ The name of the currently active profile is shown as (Profile Name) in the windo
1154
1161
 
1155
1162
  ## Built-in models
1156
1163
 
1157
- PyGPT has a preconfigured list of models (as of 2025-08-31):
1164
+ PyGPT has a preconfigured list of models (as of 2025-12-25):
1158
1165
 
1159
1166
  - `bielik-11b-v2.3-instruct:Q4_K_M` (Ollama)
1160
1167
  - `chatgpt-4o-latest` (OpenAI)
@@ -1164,6 +1171,8 @@ PyGPT has a preconfigured list of models (as of 2025-08-31):
1164
1171
  - `claude-3-opus` (Anthropic)
1165
1172
  - `claude-opus-4-0` (Anthropic)
1166
1173
  - `claude-sonnet-4-0` (Anthropic)
1174
+ - `claude-opus-4-5` (Anthropic)
1175
+ - `claude-sonnet-4-5` (Anthropic)
1167
1176
  - `codellama` (Ollama)
1168
1177
  - `codex-mini` (OpenAI)
1169
1178
  - `dall-e-2` (OpenAI)
@@ -1180,6 +1189,9 @@ PyGPT has a preconfigured list of models (as of 2025-08-31):
1180
1189
  - `gemini-2.5-flash` (Google)
1181
1190
  - `gemini-2.5-flash-preview-native-audio-dialog` (Google, real-time)
1182
1191
  - `gemini-2.5-pro` (Google)
1192
+ - `gemini-3-flash-preview` (Google)
1193
+ - `gemini-3-pro-image-preview` (Google)
1194
+ - `gemini-3-pro-preview` (Google)
1183
1195
  - `gpt-3.5-turbo` (OpenAI)
1184
1196
  - `gpt-3.5-turbo-16k` (OpenAI)
1185
1197
  - `gpt-3.5-turbo-instruct` (OpenAI)
@@ -1196,7 +1208,9 @@ PyGPT has a preconfigured list of models (as of 2025-08-31):
1196
1208
  - `gpt-5` (OpenAI)
1197
1209
  - `gpt-5-mini` (OpenAI)
1198
1210
  - `gpt-5-nano` (OpenAI)
1211
+ - `gpt-5.2` (OpenAI)
1199
1212
  - `gpt-image-1` (OpenAI)
1213
+ - `gpt-image-1.5` (OpenAI)
1200
1214
  - `gpt-oss:20b` (OpenAI - via Ollama and HuggingFace Router)
1201
1215
  - `gpt-oss:120b` (OpenAI - via Ollama and HuggingFace Router)
1202
1216
  - `gpt-realtime` (OpenAI, real-time)
@@ -1212,6 +1226,7 @@ PyGPT has a preconfigured list of models (as of 2025-08-31):
1212
1226
  - `mistral` (Ollama)
1213
1227
  - `mistral-large` (Ollama)
1214
1228
  - `mistral-small3.1` (Ollama)
1229
+ - `nano-banana-pro-preview` (Google)
1215
1230
  - `o1` (OpenAI)
1216
1231
  - `o1-mini` (OpenAI)
1217
1232
  - `o1-pro` (OpenAI)
@@ -1231,11 +1246,14 @@ PyGPT has a preconfigured list of models (as of 2025-08-31):
1231
1246
  - `sonar-pro` (Perplexity)
1232
1247
  - `sonar-reasoning` (Perplexity)
1233
1248
  - `sonar-reasoning-pro` (Perplexity)
1249
+ - `sora-2` (OpenAI)
1234
1250
  - `veo-3.0-generate-preview` (Google)
1235
1251
  - `veo-3.0-fast-generate-preview` (Google)
1252
+ - `veo-3.1-generate-preview` (Google)
1253
+ - `veo-3.1-fast-generate-preview` (Google)
1236
1254
 
1237
1255
  All models are specified in the configuration file `models.json`, which you can customize.
1238
- This file is located in your working directory. You can add new models provided directly by `OpenAI API` (or compatible) and those supported by `LlamaIndex` or `Ollama` to this file. Configuration for LlamaIndex is placed in `llama_index` key.
1256
+ This file is located in your working directory. You can add new models provided directly by `OpenAI API` (or compatible), `Google Gen AI API`, `Anthropic API`, `xAI API`, and those supported by `LlamaIndex` or `Ollama` to this file. Configuration for LlamaIndex in placed in `llama_index` key.
1239
1257
 
1240
1258
  You can import new models by manually editing `models.json` or by using the model importer in the `Config -> Models -> Import` menu.
1241
1259
 
@@ -3088,6 +3106,7 @@ You can provide a single URI in the form of: `{scheme}://{user}:{password}@{host
3088
3106
  - ChromaVectorStore
3089
3107
  - ElasticsearchStore
3090
3108
  - PinecodeVectorStore
3109
+ - QdrantVectorStore
3091
3110
  - RedisVectorStore
3092
3111
  - SimpleVectorStore
3093
3112
  ```
@@ -3118,6 +3137,15 @@ Keyword arguments for Pinecone(`**kwargs`):
3118
3137
  - `api_key`
3119
3138
  - index_name (default: current index ID, already set, not required)
3120
3139
 
3140
+ **QdrantVectorStore**
3141
+
3142
+ Keyword arguments for QdrantVectorStore(`**kwargs`):
3143
+
3144
+ - `url` - str, default: `http://localhost:6333`
3145
+ - `api_key` - str, default: `None` (for Qdrant Cloud)
3146
+ - `collection_name` (default: current index ID, already set, not required)
3147
+ - any other keyword arguments provided on list
3148
+
3121
3149
  **RedisVectorStore**
3122
3150
 
3123
3151
  Keyword arguments for RedisVectorStore(`**kwargs`):
@@ -3615,6 +3643,7 @@ You can create a custom vector store provider or data loader for your data and d
3615
3643
  from pygpt_net.provider.vector_stores.chroma import ChromaProvider
3616
3644
  from pygpt_net.provider.vector_stores.elasticsearch import ElasticsearchProvider
3617
3645
  from pygpt_net.provider.vector_stores.pinecode import PinecodeProvider
3646
+ from pygpt_net.provider.vector_stores.qdrant import QdrantProvider
3618
3647
  from pygpt_net.provider.vector_stores.redis import RedisProvider
3619
3648
  from pygpt_net.provider.vector_stores.simple import SimpleProvider
3620
3649
 
@@ -3624,6 +3653,7 @@ def run(**kwargs):
3624
3653
  launcher.add_vector_store(ChromaProvider())
3625
3654
  launcher.add_vector_store(ElasticsearchProvider())
3626
3655
  launcher.add_vector_store(PinecodeProvider())
3656
+ launcher.add_vector_store(QdrantProvider())
3627
3657
  launcher.add_vector_store(RedisProvider())
3628
3658
  launcher.add_vector_store(SimpleProvider())
3629
3659
 
@@ -3723,6 +3753,23 @@ may consume additional tokens that are not displayed in the main window.
3723
3753
 
3724
3754
  ## Recent changes:
3725
3755
 
3756
+ **2.6.67 (2025-12-26)**
3757
+
3758
+ - Added a provider filter to the models editor.
3759
+ - Added video options (resolution, duration) to the toolbox.
3760
+ - Updated the models configuration.
3761
+
3762
+ **2.6.66 (2025-12-25)**
3763
+
3764
+ - Added Sora 2 support - #155.
3765
+ - Added Nano Banana support.
3766
+ - Added Qdrant Vector Store - merged PR #147 by @Anush008.
3767
+ - Added models: gpt-5.2, gpt-image-1.5, gemini-3, nano-banana-pro, sora-2, claude-sonnet-4.5, claude-opus-4.5, veo-3.1.
3768
+ - Added Select/unselect All option in checkbox lists.
3769
+ - OpenAI SDK upgraded to 2.14.0, Anthropic SDK upgraded to 0.75.0, xAI SDK upgraded to 1.5.0, Google GenAI upgraded to 1.56.0, LlamaIndex upgraded to 0.14.10.
3770
+ - Fix: charset-normalizer 3.2.0 circular import - #152.
3771
+ - Fix: Google client closed state.
3772
+
3726
3773
  **2.6.65 (2025-09-28)**
3727
3774
 
3728
3775
  - Added drag and drop functionality for files and directories from the filesystem in attachments and file explorer.