pygpt-net 2.6.64__py3-none-any.whl → 2.6.66__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 (68) hide show
  1. pygpt_net/CHANGELOG.txt +21 -0
  2. pygpt_net/__init__.py +3 -3
  3. pygpt_net/app.py +5 -1
  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/files/files.py +71 -2
  9. pygpt_net/controller/media/media.py +20 -1
  10. pygpt_net/controller/presets/editor.py +137 -22
  11. pygpt_net/controller/presets/presets.py +4 -1
  12. pygpt_net/controller/ui/mode.py +14 -10
  13. pygpt_net/controller/ui/ui.py +18 -1
  14. pygpt_net/core/agents/custom/__init__.py +18 -2
  15. pygpt_net/core/agents/custom/runner.py +2 -2
  16. pygpt_net/core/attachments/clipboard.py +146 -0
  17. pygpt_net/core/image/image.py +34 -1
  18. pygpt_net/core/render/web/renderer.py +33 -11
  19. pygpt_net/core/tabs/tabs.py +0 -0
  20. pygpt_net/core/types/image.py +61 -3
  21. pygpt_net/data/config/config.json +4 -3
  22. pygpt_net/data/config/models.json +629 -41
  23. pygpt_net/data/css/style.dark.css +12 -0
  24. pygpt_net/data/css/style.light.css +12 -0
  25. pygpt_net/data/icons/pin2.svg +1 -0
  26. pygpt_net/data/icons/pin3.svg +3 -0
  27. pygpt_net/data/icons/point.svg +1 -0
  28. pygpt_net/data/icons/target.svg +1 -0
  29. pygpt_net/data/js/app/ui.js +19 -2
  30. pygpt_net/data/js/app/user.js +22 -54
  31. pygpt_net/data/js/app.min.js +7 -9
  32. pygpt_net/data/locale/locale.de.ini +4 -0
  33. pygpt_net/data/locale/locale.en.ini +8 -0
  34. pygpt_net/data/locale/locale.es.ini +4 -0
  35. pygpt_net/data/locale/locale.fr.ini +4 -0
  36. pygpt_net/data/locale/locale.it.ini +4 -0
  37. pygpt_net/data/locale/locale.pl.ini +4 -0
  38. pygpt_net/data/locale/locale.uk.ini +4 -0
  39. pygpt_net/data/locale/locale.zh.ini +4 -0
  40. pygpt_net/icons.qrc +4 -0
  41. pygpt_net/icons_rc.py +274 -137
  42. pygpt_net/item/model.py +15 -19
  43. pygpt_net/js_rc.py +2038 -2075
  44. pygpt_net/provider/agents/openai/agent.py +0 -0
  45. pygpt_net/provider/api/google/__init__.py +20 -9
  46. pygpt_net/provider/api/google/image.py +161 -28
  47. pygpt_net/provider/api/google/video.py +73 -36
  48. pygpt_net/provider/api/openai/__init__.py +21 -11
  49. pygpt_net/provider/api/openai/agents/client.py +0 -0
  50. pygpt_net/provider/api/openai/video.py +562 -0
  51. pygpt_net/provider/core/config/patch.py +15 -0
  52. pygpt_net/provider/core/model/patch.py +29 -3
  53. pygpt_net/provider/vector_stores/qdrant.py +117 -0
  54. pygpt_net/ui/__init__.py +6 -1
  55. pygpt_net/ui/dialog/preset.py +9 -4
  56. pygpt_net/ui/layout/chat/attachments.py +18 -1
  57. pygpt_net/ui/layout/status.py +3 -3
  58. pygpt_net/ui/layout/toolbox/raw.py +7 -1
  59. pygpt_net/ui/widget/element/status.py +55 -0
  60. pygpt_net/ui/widget/filesystem/explorer.py +116 -2
  61. pygpt_net/ui/widget/lists/context.py +26 -16
  62. pygpt_net/ui/widget/option/checkbox_list.py +14 -2
  63. pygpt_net/ui/widget/textarea/input.py +71 -17
  64. {pygpt_net-2.6.64.dist-info → pygpt_net-2.6.66.dist-info}/METADATA +76 -25
  65. {pygpt_net-2.6.64.dist-info → pygpt_net-2.6.66.dist-info}/RECORD +63 -55
  66. {pygpt_net-2.6.64.dist-info → pygpt_net-2.6.66.dist-info}/LICENSE +0 -0
  67. {pygpt_net-2.6.64.dist-info → pygpt_net-2.6.66.dist-info}/WHEEL +0 -0
  68. {pygpt_net-2.6.64.dist-info → pygpt_net-2.6.66.dist-info}/entry_points.txt +0 -0
@@ -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.26 12:00:00 #
9
+ # Updated Date: 2025.09.28 08:00:00 #
10
10
  # ================================================== #
11
11
 
12
12
  from typing import Optional
13
13
  import math
14
+ import os
14
15
 
15
16
  from PySide6.QtCore import Qt, QSize, QTimer, QEvent
16
17
  from PySide6.QtGui import QAction, QIcon, QImage
@@ -24,6 +25,8 @@ from PySide6.QtWidgets import (
24
25
 
25
26
  from pygpt_net.core.events import Event
26
27
  from pygpt_net.utils import trans
28
+ from pygpt_net.core.attachments.clipboard import AttachmentDropHandler
29
+
27
30
 
28
31
  class ChatInput(QTextEdit):
29
32
 
@@ -127,6 +130,12 @@ class ChatInput(QTextEdit):
127
130
  # Paste/input safety limits
128
131
  self._paste_max_chars = 1000000000 # hard cap to prevent pathological pastes from freezing/crashing
129
132
 
133
+ # One-shot guard to avoid duplicate attachment processing on drops that also insert text.
134
+ self._skip_clipboard_on_next_insert = False
135
+
136
+ # Drag & Drop: add as attachments; do not insert file paths into text
137
+ self._dnd_handler = AttachmentDropHandler(self.window, self, policy=AttachmentDropHandler.INPUT_MIX)
138
+
130
139
  def _on_text_changed_tokens(self):
131
140
  """Schedule token count update with debounce."""
132
141
  self._tokens_timer.start()
@@ -157,27 +166,46 @@ class ChatInput(QTextEdit):
157
166
  except Exception:
158
167
  return False
159
168
 
169
+ def _mime_has_local_file_urls(self, source) -> bool:
170
+ """
171
+ Detects whether mime data contains any local file/directory URLs.
172
+ """
173
+ try:
174
+ if source and source.hasUrls():
175
+ for url in source.urls():
176
+ if url.isLocalFile():
177
+ return True
178
+ except Exception:
179
+ pass
180
+ return False
181
+
160
182
  def insertFromMimeData(self, source):
161
183
  """
162
184
  Insert from mime data
163
185
 
164
186
  :param source: source
165
187
  """
166
- # Always process attachments first; never break input pipeline on errors.
167
- try:
168
- self.handle_clipboard(source)
169
- except Exception as e:
188
+ has_local_files = self._mime_has_local_file_urls(source)
189
+
190
+ # Avoid double-processing when drop is allowed to fall through to default insertion.
191
+ should_skip = bool(getattr(self, "_skip_clipboard_on_next_insert", False))
192
+ if should_skip:
193
+ self._skip_clipboard_on_next_insert = False
194
+ else:
195
+ # Always process attachments first; never break input pipeline on errors.
170
196
  try:
171
- self.window.core.debug.log(e)
172
- except Exception:
173
- pass
197
+ self.handle_clipboard(source)
198
+ except Exception as e:
199
+ try:
200
+ self.window.core.debug.log(e)
201
+ except Exception:
202
+ pass
174
203
 
175
- # If an image is present, we treat it as attachment-only and do not insert textual representation.
204
+ # Do not insert textual representation for images nor local file URLs (including directories).
176
205
  try:
177
- if source and source.hasImage():
206
+ if source and (source.hasImage() or has_local_files):
178
207
  return
179
208
  except Exception:
180
- # fallback to text extraction below
181
209
  pass
182
210
 
183
211
  # Insert only sanitized plain text (no HTML, no custom formats).
@@ -194,24 +222,27 @@ class ChatInput(QTextEdit):
194
222
  def _safe_text_from_mime(self, source) -> str:
195
223
  """
196
224
  Extracts plain text from QMimeData safely, normalizes and sanitizes it.
197
- Falls back to URLs joined by space if textual content is not provided.
225
+ Falls back to URLs joined by space only for non-local URLs.
198
226
  """
199
227
  try:
200
228
  if source is None:
201
229
  return ""
230
+ # Prefer real text if present
202
231
  if source.hasText():
203
232
  return self._sanitize_text(source.text())
233
+ # Fallback: for non-local URLs we allow insertion as text (e.g., http/https)
204
234
  if source.hasUrls():
205
235
  parts = []
206
236
  for url in source.urls():
207
237
  try:
208
238
  if url.isLocalFile():
209
- parts.append(url.toLocalFile())
210
- else:
211
- parts.append(url.toString())
239
+ # Skip local files/dirs textual fallback; they are handled as attachments
240
+ continue
241
+ parts.append(url.toString())
212
242
  except Exception:
213
243
  continue
214
- return self._sanitize_text(" ".join([p for p in parts if p]))
244
+ if parts:
245
+ return self._sanitize_text(" ".join([p for p in parts if p]))
215
246
  except Exception as e:
216
247
  try:
217
248
  self.window.core.debug.log(e)
@@ -286,13 +317,36 @@ class ChatInput(QTextEdit):
286
317
  image = source.imageData()
287
318
  if isinstance(image, QImage):
288
319
  self.window.controller.attachment.from_clipboard_image(image)
320
+ else:
321
+ # Some platforms provide QPixmap; convert to QImage if possible
322
+ try:
323
+ img = image.toImage()
324
+ if isinstance(img, QImage):
325
+ self.window.controller.attachment.from_clipboard_image(img)
326
+ except Exception:
327
+ pass
289
328
  elif source.hasUrls():
290
329
  urls = source.urls()
291
330
  for url in urls:
292
331
  try:
293
332
  if url.isLocalFile():
294
333
  local_path = url.toLocalFile()
295
- self.window.controller.attachment.from_clipboard_url(local_path)
334
+ if not local_path:
335
+ continue
336
+ if os.path.isdir(local_path):
337
+ # Recursively add all files from the dropped directory
338
+ for root, _, files in os.walk(local_path):
339
+ for name in files:
340
+ fpath = os.path.join(root, name)
341
+ try:
342
+ self.window.controller.attachment.from_clipboard_url(fpath, all=True)
343
+ except Exception:
344
+ continue
345
+ else:
346
+ self.window.controller.attachment.from_clipboard_url(local_path, all=True)
347
+ else:
348
+ # Non-local URLs are handled as text (if any) by _safe_text_from_mime
349
+ pass
296
350
  except Exception:
297
351
  # Ignore broken URL entries
298
352
  continue
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.3
2
2
  Name: pygpt-net
3
- Version: 2.6.64
3
+ Version: 2.6.66
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.64** | build: **2025-09-27** | Python: **>=3.10, <3.14**
122
+ Release: **2.6.66** | build: **2025-12-25** | 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,27 @@ may consume additional tokens that are not displayed in the main window.
3723
3753
 
3724
3754
  ## Recent changes:
3725
3755
 
3756
+ **2.6.66 (2025-12-25)**
3757
+
3758
+ - Added Sora 2 support - #155.
3759
+ - Added Nano Banana support.
3760
+ - Added Qdrant Vector Store - merged PR #147 by @Anush008.
3761
+ - 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.
3762
+ - Added Select/unselect All option in checkbox lists.
3763
+ - 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.
3764
+ - Fix: charset-normalizer 3.2.0 circular import - #152.
3765
+ - Fix: Google client closed state.
3766
+
3767
+ **2.6.65 (2025-09-28)**
3768
+
3769
+ - Added drag and drop functionality for files and directories from the filesystem in attachments and file explorer.
3770
+ - Added automatic thumbnail generation when uploading avatars.
3771
+ - Added a last status timer.
3772
+ - Added a fade effect to collapsed user messages.
3773
+ - Added a scroll area to the agent options in the presets editor.
3774
+ - Added a hover effect to lists.
3775
+ - Improved UI/UX.
3776
+
3726
3777
  **2.6.64 (2025-09-27)**
3727
3778
 
3728
3779
  - Added translations to agent headers.