pygpt-net 2.6.66__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.
pygpt_net/CHANGELOG.txt CHANGED
@@ -1,3 +1,9 @@
1
+ 2.6.67 (2025-12-26)
2
+
3
+ - Added a provider filter to the models editor.
4
+ - Added video options (resolution, duration) to the toolbox.
5
+ - Updated the models configuration.
6
+
1
7
  2.6.66 (2025-12-25)
2
8
 
3
9
  - Added Sora 2 support - #155.
pygpt_net/__init__.py CHANGED
@@ -6,15 +6,15 @@
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.12.15 00:00:00 #
9
+ # Updated Date: 2025.12.26 00:00:00 #
10
10
  # ================================================== #
11
11
 
12
12
  __author__ = "Marcin Szczygliński"
13
13
  __copyright__ = "Copyright 2025, Marcin Szczygliński"
14
14
  __credits__ = ["Marcin Szczygliński"]
15
15
  __license__ = "MIT"
16
- __version__ = "2.6.66"
17
- __build__ = "2025-12-25"
16
+ __version__ = "2.6.67"
17
+ __build__ = "2025-12-26"
18
18
  __maintainer__ = "Marcin Szczygliński"
19
19
  __github__ = "https://github.com/szczyglis-dev/py-gpt"
20
20
  __report__ = "https://github.com/szczyglis-dev/py-gpt/issues"
@@ -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.15 23:00:00 #
9
+ # Updated Date: 2025.12.26 13:00:00 #
10
10
  # ================================================== #
11
11
 
12
12
  from typing import Any, Dict
@@ -38,7 +38,7 @@ class Textarea:
38
38
  field = parent.get(key)
39
39
  if field is None:
40
40
  return
41
- new_text = str(option["value"])
41
+ new_text = str(option["value"]) if "value" in option else ""
42
42
  if hasattr(field, "toPlainText"):
43
43
  current = field.toPlainText()
44
44
  elif hasattr(field, "text"):
@@ -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.22 19:00:00 #
9
+ # Updated Date: 2025.12.26 12:00:00 #
10
10
  # ================================================== #
11
11
 
12
12
  from PySide6.QtCore import QUrl
@@ -101,7 +101,7 @@ class Info:
101
101
 
102
102
  def goto_update(self):
103
103
  """Open update URL"""
104
- self.open_url(self.window.meta['update'])
104
+ self.open_url(self.window.meta['website'])
105
105
 
106
106
  def goto_donate(self):
107
107
  """Open donate page"""
@@ -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.12.25 20:00:00 #
9
+ # Updated Date: 2025.12.26 12:00:00 #
10
10
  # ================================================== #
11
11
 
12
12
  from typing import Any
@@ -57,11 +57,31 @@ class Media:
57
57
  value=aspect_ratio,
58
58
  )
59
59
 
60
+ # video: resolution
61
+ resolution = self.window.core.config.get('video.resolution', '720p')
62
+ self.window.controller.config.apply_value(
63
+ parent_id="global",
64
+ key="video.resolution",
65
+ option=self.window.core.video.get_resolution_option(),
66
+ value=resolution,
67
+ )
68
+
69
+ # video: duration
70
+ duration = self.window.core.config.get('video.duration', 8)
71
+ self.window.controller.config.apply_value(
72
+ parent_id="global",
73
+ key="video.duration",
74
+ option=self.window.core.video.get_duration_option(),
75
+ value=duration,
76
+ )
77
+
60
78
  # -- add hooks --
61
79
  if not self.initialized:
62
80
  self.window.ui.add_hook("update.global.img_resolution", self.hook_update)
63
81
  self.window.ui.add_hook("update.global.img_mode", self.hook_update)
64
82
  self.window.ui.add_hook("update.global.video.aspect_ratio", self.hook_update)
83
+ self.window.ui.add_hook("update.global.video.resolution", self.hook_update)
84
+ self.window.ui.add_hook("update.global.video.duration", self.hook_update)
65
85
 
66
86
  def reload(self):
67
87
  """Reload UI"""
@@ -88,6 +108,14 @@ class Media:
88
108
  if not value:
89
109
  return
90
110
  self.window.core.config.set('video.aspect_ratio', value)
111
+ elif key == "video.resolution":
112
+ if not value:
113
+ return
114
+ self.window.core.config.set('video.resolution', value)
115
+ elif key == "video.duration":
116
+ if not value:
117
+ return
118
+ self.window.core.config.set('video.duration', value)
91
119
 
92
120
  def enable_raw(self):
93
121
  """Enable prompt enhancement for images"""
@@ -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
@@ -33,6 +33,7 @@ class Editor:
33
33
  self.height = 500
34
34
  self.selected = []
35
35
  self.locked = False
36
+ self.provider = "-" # all providers by default
36
37
  self.options = {
37
38
  "id": {
38
39
  "type": "text",
@@ -137,12 +138,40 @@ class Editor:
137
138
  if key in self.options:
138
139
  return self.options[key]
139
140
 
141
+ def get_provider_option(self) -> dict:
142
+ """
143
+ Get provider option
144
+
145
+ :return: provider option
146
+ """
147
+ return {
148
+ "type": "combo",
149
+ "use": "llm_providers",
150
+ "label": "model.provider",
151
+ "description": "model.provider.desc",
152
+ }
153
+
140
154
  def setup(self):
141
155
  """Set up editor"""
142
156
  idx = None
143
157
  self.window.model_settings.setup(idx) # widget dialog setup
144
158
  self.window.ui.add_hook("update.model.name", self.hook_update)
145
159
  self.window.ui.add_hook("update.model.mode", self.hook_update)
160
+ self.update_provider(self.provider)
161
+ self.window.ui.add_hook("update.model.provider_global", self.hook_update)
162
+
163
+ def update_provider(self, provider: str):
164
+ """
165
+ Set provider
166
+
167
+ :param provider: provider name
168
+ """
169
+ self.window.controller.config.apply_value(
170
+ parent_id="model",
171
+ key="provider_global",
172
+ option=self.get_provider_option(),
173
+ value=provider,
174
+ )
146
175
 
147
176
  def hook_update(
148
177
  self,
@@ -163,6 +192,21 @@ class Editor:
163
192
  """
164
193
  if self.window.controller.reloading or self.locked:
165
194
  return # ignore hooks during reloading process
195
+
196
+ if key == "provider_global":
197
+ # update provider option dynamically
198
+ if self.provider == value:
199
+ return
200
+ self.save(persist=False)
201
+ self.locked = True
202
+ self.current = None
203
+ self.provider = value
204
+ self.reload_items()
205
+ if self.current is None:
206
+ self.init()
207
+ self.locked = False
208
+ return
209
+
166
210
  if key in ["id", "name", "mode"]:
167
211
  self.save(persist=False)
168
212
  self.reload_items()
@@ -184,6 +228,7 @@ class Editor:
184
228
 
185
229
  :param force: force open dialog
186
230
  """
231
+ self.locked = True
187
232
  if not self.config_initialized:
188
233
  self.setup()
189
234
  self.config_initialized = True
@@ -197,6 +242,8 @@ class Editor:
197
242
  height=self.height,
198
243
  )
199
244
  self.dialog = True
245
+ self.window.ui.nodes['models.editor.search'].setFocus() # focus on search
246
+ self.locked = False
200
247
 
201
248
  def undo(self):
202
249
  """Undo last changes in models editor"""
@@ -219,15 +266,16 @@ class Editor:
219
266
  self.window.core.models.sort_items()
220
267
  self.reload_items()
221
268
 
222
- # select the first plugin on list if no plugin selected yet
269
+ # select the first model on list if no model selected yet
270
+ items = self.prepare_items()
223
271
  if self.current is None:
224
- if len(self.window.core.models.items) > 0:
225
- self.current = list(self.window.core.models.items.keys())[0]
272
+ if len(items) > 0:
273
+ self.current = list(items.keys())[0]
226
274
 
227
275
  # assign model options to config dialog fields
228
276
  options = copy.deepcopy(self.get_options()) # copy options
229
- if self.current in self.window.core.models.items:
230
- model = self.window.core.models.items[self.current]
277
+ if self.current in items:
278
+ model = items[self.current]
231
279
  data_dict = model.to_dict()
232
280
  for key in options:
233
281
  if key in data_dict:
@@ -237,7 +285,7 @@ class Editor:
237
285
  # custom fields
238
286
  options["extra_json"]["value"] = json.dumps(model.extra, indent=4) if model.extra else ""
239
287
 
240
- if self.current is not None and self.current in self.window.core.models.items:
288
+ if self.current is not None and self.current in items:
241
289
  self.set_tab_by_id(self.current)
242
290
 
243
291
  # load and apply options to config dialog
@@ -313,10 +361,26 @@ class Editor:
313
361
  event = Event(Event.MODELS_CHANGED)
314
362
  self.window.dispatch(event, all=True)
315
363
 
364
+ def prepare_items(self) -> dict:
365
+ """
366
+ Prepare items by provider
367
+
368
+ :return: items by provider
369
+ """
370
+ items = self.window.core.models.items
371
+ if self.provider == "-":
372
+ return items # all providers
373
+ items_by_provider = {}
374
+ for model_id, model in items.items():
375
+ provider = model.provider
376
+ if provider != self.provider:
377
+ continue
378
+ items_by_provider[model_id] = model
379
+ return items_by_provider
380
+
316
381
  def reload_items(self):
317
382
  """Reload items"""
318
- items = self.window.core.models.items
319
- self.window.model_settings.update_list("models.list", items)
383
+ self.window.model_settings.update_list("models.list", self.prepare_items())
320
384
 
321
385
  def select(self, idx: int):
322
386
  """Select model"""
@@ -331,6 +395,7 @@ class Editor:
331
395
  self.locked = True
332
396
  self.save(persist=False)
333
397
  model = self.window.core.models.create_empty()
398
+ model.provider = self.provider
334
399
  self.window.core.models.sort_items()
335
400
  self.window.core.models.save()
336
401
  self.reload_items()
@@ -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.15 22:00:00 #
9
+ # Updated Date: 2025.12.26 12:00:00 #
10
10
  # ================================================== #
11
11
 
12
12
  import copy
@@ -206,6 +206,30 @@ class Editor:
206
206
  if self.config_changed('access.shortcuts'):
207
207
  self.window.setup_global_shortcuts()
208
208
 
209
+ # video: resolution
210
+ if self.config_changed('video.resolution'):
211
+ value = self.window.core.config.get('video.resolution')
212
+ self.window.core.config.set('video.resolution', value)
213
+ option = self.window.core.video.get_resolution_option()
214
+ self.window.controller.config.apply_value(
215
+ parent_id='global',
216
+ key='video.resolution',
217
+ option=option,
218
+ value=str(value),
219
+ )
220
+
221
+ # video: duration
222
+ if self.config_changed('video.duration'):
223
+ value = self.window.core.config.get('video.duration')
224
+ self.window.core.config.set('video.duration', value)
225
+ option = self.window.core.video.get_duration_option()
226
+ self.window.controller.config.apply_value(
227
+ parent_id='global',
228
+ key='video.duration',
229
+ option=option,
230
+ value=int(value) or 8,
231
+ )
232
+
209
233
  # update ENV
210
234
  self.window.core.config.setup_env()
211
235
 
@@ -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.12.25 20:00:00 #
9
+ # Updated Date: 2025.12.26 12:00:00 #
10
10
  # ================================================== #
11
11
 
12
12
  VIDEO_AVAILABLE_ASPECT_RATIOS = {
@@ -22,6 +22,15 @@ VIDEO_AVAILABLE_ASPECT_RATIOS = {
22
22
  "21:9": "21:9",
23
23
  }
24
24
 
25
+ VIDEO_AVAILABLE_RESOLUTIONS = {
26
+ "480p": "480p",
27
+ "720p": "720p",
28
+ "1080p": "1080p",
29
+ "1440p": "1440p",
30
+ "4K": "4K",
31
+ "8K": "8K",
32
+ }
33
+
25
34
 
26
35
  IMAGE_AVAILABLE_RESOLUTIONS = {
27
36
  "gpt-image": {
@@ -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.01 23:00:00 #
9
+ # Updated Date: 2025.12.26 12:00:00 #
10
10
  # ================================================== #
11
11
 
12
12
  import uuid
@@ -18,7 +18,10 @@ from time import strftime
18
18
 
19
19
  from PySide6.QtCore import Slot, QObject
20
20
 
21
- from pygpt_net.core.types import VIDEO_AVAILABLE_ASPECT_RATIOS
21
+ from pygpt_net.core.types import (
22
+ VIDEO_AVAILABLE_ASPECT_RATIOS,
23
+ VIDEO_AVAILABLE_RESOLUTIONS,
24
+ )
22
25
  from pygpt_net.item.ctx import CtxItem
23
26
  from pygpt_net.utils import trans
24
27
 
@@ -267,7 +270,7 @@ class Video(QObject):
267
270
 
268
271
  def get_aspect_ratio_option(self) -> dict:
269
272
  """
270
- Get image resolution option for UI
273
+ Get video aspect ratio option for UI
271
274
 
272
275
  :return: dict
273
276
  """
@@ -279,6 +282,34 @@ class Video(QObject):
279
282
  "keys": self.get_available_aspect_ratio(),
280
283
  }
281
284
 
285
+ def get_resolution_option(self) -> dict:
286
+ """
287
+ Get video resolution option for UI
288
+
289
+ :return: dict
290
+ """
291
+ return {
292
+ "type": "combo",
293
+ "slider": True,
294
+ "label": "video.resolution",
295
+ "value": "720p",
296
+ "keys": self.get_available_resolutions(),
297
+ }
298
+
299
+ def get_duration_option(self) -> dict:
300
+ """
301
+ Get video duration option for UI
302
+
303
+ :return: dict
304
+ """
305
+ return {
306
+ "type": "int",
307
+ "slider": False,
308
+ "label": "video.duration",
309
+ "value": 8,
310
+ "placeholder": "s",
311
+ }
312
+
282
313
  def get_available_aspect_ratio(self, model: str = None) -> Dict[str, str]:
283
314
  """
284
315
  Get available image resolutions
@@ -288,3 +319,12 @@ class Video(QObject):
288
319
  """
289
320
  return VIDEO_AVAILABLE_ASPECT_RATIOS
290
321
 
322
+ def get_available_resolutions(self, model: str = None) -> Dict[str, str]:
323
+ """
324
+ Get available image resolutions
325
+
326
+ :param model: model name
327
+ :return: dict of available resolutions
328
+ """
329
+ return VIDEO_AVAILABLE_RESOLUTIONS
330
+
@@ -1,8 +1,8 @@
1
1
  {
2
2
  "__meta__": {
3
- "version": "2.6.66",
4
- "app.version": "2.6.66",
5
- "updated_at": "2025-12-15T00:00:00"
3
+ "version": "2.6.67",
4
+ "app.version": "2.6.67",
5
+ "updated_at": "2025-12-26T00:00:00"
6
6
  },
7
7
  "access.audio.event.speech": false,
8
8
  "access.audio.event.speech.disabled": [],
@@ -1,8 +1,8 @@
1
1
  {
2
2
  "__meta__": {
3
- "version": "2.6.66",
4
- "app.version": "2.6.66",
5
- "updated_at": "2025-12-25T00:00:00"
3
+ "version": "2.6.67",
4
+ "app.version": "2.6.67",
5
+ "updated_at": "2025-12-26T00:00:00"
6
6
  },
7
7
  "items": {
8
8
  "SpeakLeash/bielik-11b-v2.3-instruct:Q4_K_M": {
@@ -293,7 +293,8 @@
293
293
  "tokens": 64000,
294
294
  "default": false,
295
295
  "input": [
296
- "text"
296
+ "text",
297
+ "image"
297
298
  ],
298
299
  "output": [
299
300
  "text"
@@ -379,7 +380,8 @@
379
380
  "text"
380
381
  ],
381
382
  "output": [
382
- "text"
383
+ "text",
384
+ "image"
383
385
  ],
384
386
  "extra": {},
385
387
  "imported": false,
@@ -1066,7 +1068,8 @@
1066
1068
  "tokens": 0,
1067
1069
  "default": false,
1068
1070
  "input": [
1069
- "text"
1071
+ "text",
1072
+ "image"
1070
1073
  ],
1071
1074
  "output": [
1072
1075
  "text"
@@ -1144,7 +1147,8 @@
1144
1147
  "tokens": 0,
1145
1148
  "default": false,
1146
1149
  "input": [
1147
- "text"
1150
+ "text",
1151
+ "image"
1148
1152
  ],
1149
1153
  "output": [
1150
1154
  "text"
@@ -2399,7 +2403,8 @@
2399
2403
  "tokens": 128000,
2400
2404
  "default": false,
2401
2405
  "input": [
2402
- "text"
2406
+ "text",
2407
+ "image"
2403
2408
  ],
2404
2409
  "output": [
2405
2410
  "text"
@@ -2457,7 +2462,8 @@
2457
2462
  "tokens": 128000,
2458
2463
  "default": false,
2459
2464
  "input": [
2460
- "text"
2465
+ "text",
2466
+ "image"
2461
2467
  ],
2462
2468
  "output": [
2463
2469
  "text"
@@ -2516,7 +2522,8 @@
2516
2522
  "tokens": 128000,
2517
2523
  "default": false,
2518
2524
  "input": [
2519
- "text"
2525
+ "text",
2526
+ "image"
2520
2527
  ],
2521
2528
  "output": [
2522
2529
  "text"
@@ -3468,7 +3475,8 @@
3468
3475
  "tokens": 0,
3469
3476
  "default": false,
3470
3477
  "input": [
3471
- "text"
3478
+ "text",
3479
+ "image"
3472
3480
  ],
3473
3481
  "output": [
3474
3482
  "image"
@@ -4564,7 +4572,8 @@
4564
4572
  "tokens": 0,
4565
4573
  "default": false,
4566
4574
  "input": [
4567
- "text"
4575
+ "text",
4576
+ "image"
4568
4577
  ],
4569
4578
  "output": [
4570
4579
  "video"
@@ -4672,7 +4681,8 @@
4672
4681
  "tokens": 0,
4673
4682
  "default": false,
4674
4683
  "input": [
4675
- "text"
4684
+ "text",
4685
+ "image"
4676
4686
  ],
4677
4687
  "output": [
4678
4688
  "video"
@@ -4708,7 +4718,8 @@
4708
4718
  "tokens": 0,
4709
4719
  "default": false,
4710
4720
  "input": [
4711
- "text"
4721
+ "text",
4722
+ "image"
4712
4723
  ],
4713
4724
  "output": [
4714
4725
  "video"
@@ -789,6 +789,7 @@ ipython.docker.install = Für die Ausführung von IPython muss Docker installier
789
789
  ipython.docker.install.snap = \n\nSNAP VERSION: \nSie sind nicht mit dem eingebauten Docker-Daemon verbunden. Bitte verbinden Sie die Slots mit:\n\nsudo snap connect pygpt:docker-executables docker:docker-executables\n\nsudo snap connect pygpt:docker docker:docker-daemon\n\n...und starten Sie die Anwendung neu.
790
790
  ipython.image.build = Das Docker-Image für IPython wurde noch nicht erstellt. Dies wird jetzt geschehen und es kann eine Weile dauern (aber es ist ein einmaliger Vorgang). Die Ausführung des Befehls wurde pausiert. Sobald das Image erstellt ist, führen Sie den Befehl bitte erneut aus.
791
791
  layout.split = Bildschirm teilen
792
+ list.all = --- ALLE ---
792
793
  menu.audio = Audio / Stimme
793
794
  menu.audio.cache.clear = Audio-Cache löschen...
794
795
  menu.audio.control.global = Sprachsteuerung (global)
@@ -803,6 +803,7 @@ ipython.docker.install = Running IPython requires Docker to be installed. Docker
803
803
  ipython.docker.install.snap = \n\nSNAP VERSION: \nYou are not connected to built-in Docker daemon. Please connect the slots with:\n\nsudo snap connect pygpt:docker-executables docker:docker-executables\n\nsudo snap connect pygpt:docker docker:docker-daemon\n\n...and restart the application.
804
804
  ipython.image.build = The Docker image for IPython has not been built yet. This will happen now, and it may take a while (but it's a one-time procedure). The execution of the command has been paused. Once the image is built, please execute the command again.
805
805
  layout.split = Split screen
806
+ list.all = --- ALL ---
806
807
  menu.audio = Audio / Voice
807
808
  menu.audio.cache.clear = Clear audio cache...
808
809
  menu.audio.control.global = Voice control (global)
@@ -790,6 +790,7 @@ ipython.docker.install = Ejecutar IPython requiere que Docker esté instalado. D
790
790
  ipython.docker.install.snap = \n\nVERSIÓN SNAP: \nNo está conectado al demonio Docker incorporado. Por favor conecte los espacios con:\n\nsudo snap connect pygpt:docker-executables docker:docker-executables\n\nsudo snap connect pygpt:docker docker:docker-daemon\n\n...y reinicie la aplicación.
791
791
  ipython.image.build = La imagen de Docker para IPython aún no ha sido construida. Esto sucederá ahora, y puede tardar un tiempo (pero es un procedimiento único). La ejecución del comando ha sido pausada. Una vez que la imagen esté construida, por favor ejecute el comando nuevamente.
792
792
  layout.split = Pantalla dividida
793
+ list.all = --- TODOS ---
793
794
  menu.audio = Audio / Voz
794
795
  menu.audio.cache.clear = Limpiar caché de audio...
795
796
  menu.audio.control.global = Control de voz (global)
@@ -789,6 +789,7 @@ ipython.docker.install = L'exécution d'IPython nécessite l'installation de Doc
789
789
  ipython.docker.install.snap = \n\nVERSION SNAP : \nVous n'êtes pas connecté au démon Docker intégré. Veuillez connecter les slots avec :\n\nsudo snap connect pygpt:docker-executables docker:docker-executables\n\nsudo snap connect pygpt:docker docker:docker-daemon\n\n...et redémarrez l'application.
790
790
  ipython.image.build = L'image Docker pour IPython n'a pas encore été construite. Cela va se produire maintenant, et cela peut prendre un certain temps (mais c'est une procédure unique). L'exécution de la commande a été mise en pause. Une fois l'image construite, veuillez exécuter à nouveau la commande.
791
791
  layout.split = Écran scindé
792
+ list.all = --- TOUS ---
792
793
  menu.audio = Audio / Voix
793
794
  menu.audio.cache.clear = Effacer le cache audio...
794
795
  menu.audio.control.global = Contrôle vocal (global)
@@ -789,6 +789,7 @@ ipython.docker.install = L'esecuzione di IPython richiede l'installazione di Doc
789
789
  ipython.docker.install.snap = \n\nVERSIONE SNAP: \nNon sei connesso al demone Docker integrato. Connetti gli slot con:\n\nsudo snap connect pygpt:docker-executables docker:docker-executables\n\nsudo snap connect pygpt:docker docker:docker-daemon\n\n...e riavvia l'applicazione.
790
790
  ipython.image.build = L'immagine Docker per IPython non è stata ancora costruita. Questo avverrà ora e potrebbe richiedere del tempo (ma è una procedura una tantum). L'esecuzione del comando è stata messa in pausa. Una volta costruita l'immagine, esegui nuovamente il comando.
791
791
  layout.split = Schermo diviso
792
+ list.all = --- TUTTI ---
792
793
  menu.audio = Audio / Voce
793
794
  menu.audio.cache.clear = Cancella cache audio...
794
795
  menu.audio.control.global = Controllo vocale (globale)
@@ -51,7 +51,7 @@ action.save = Zapisz
51
51
  action.save_as = Zapisz jako...
52
52
  action.save_selection_as = Zapisz zaznaczenie jako...
53
53
  action.select_all = Wybierz wszystko
54
- action.select_unselect_all = Zaznacz/Odznacz wszystko
54
+ action.select_unselect_all = Zaznacz/Odznacz wszystko
55
55
  action.tab.add.chat: Dodaj nowy czat
56
56
  action.tab.add.chat.tooltip: Dodaj nowy czat (PPM dla więcej opcji...)
57
57
  action.tab.add.notepad = Dodaj nowy notatnik
@@ -790,6 +790,7 @@ ipython.docker.install = Uruchomienie IPython wymaga zainstalowania Dockera. Doc
790
790
  ipython.docker.install.snap = \n\nWERSJA SNAP: \nNie jesteś połączony z wbudowanym daemonem Docker. Połącz sloty za pomocą:\n\nsudo snap connect pygpt:docker-executables docker:docker-executables\n\nsudo snap connect pygpt:docker docker:docker-daemon\n\n...i uruchom ponownie aplikację.
791
791
  ipython.image.build = Obraz Dockera dla IPython nie został jeszcze zbudowany. Nastąpi to teraz i może to potrwać chwilę (ale to jednorazowa procedura). Wykonywanie polecenia zostało wstrzymane. Po zbudowaniu obrazu możesz ponownie poprosić o wykonanie polecenia.
792
792
  layout.split = Podziel ekran
793
+ list.all = --- WSZYSTKIE ---
793
794
  menu.audio = Audio / Mowa
794
795
  menu.audio.cache.clear = Wyczyść pamięć podręczną audio...
795
796
  menu.audio.control.global = Kontrola głosowa (globalna)
@@ -789,6 +789,7 @@ ipython.docker.install = Для запуску IPython необхідно вст
789
789
  ipython.docker.install.snap = \n\nVERSIÓN SNAP: \nВи не підключені до вбудованого демона Docker. Будь ласка, підключіть слоти з:\n\nsudo snap connect pygpt:docker-executables docker:docker-executables\n\nsudo snap connect pygpt:docker docker:docker-daemon\n\n...та перезапустіть програму.
790
790
  ipython.image.build = Docker-образ для IPython ще не був створений. Це відбудеться зараз, і це може зайняти деякий час (але це одноразова процедура). Виконання команди було призупинено. Після створення образу, будь ласка, виконайте команду знову.
791
791
  layout.split = Розділити екран
792
+ list.all = --- ВСІ ---
792
793
  menu.audio = Аудіо / Голос
793
794
  menu.audio.cache.clear = Очистити кеш аудіо...
794
795
  menu.audio.control.global = Контроль голосу (глобальний)
@@ -789,6 +789,7 @@ ipython.docker.install = 运行 IPython 需要安装 Docker。系统上未检测
789
789
  ipython.docker.install.snap = \n\nSNAP 版本:\n您未连接到内置的 Docker 守护进程。请连接插槽:\n\nsudo snap connect pygpt:docker-executables docker:docker-executables\n\nsudo snap connect pygpt:docker docker:docker-daemon\n\n...并重启应用程序。
790
790
  ipython.image.build = IPython 的 Docker 镜像尚未构建。这将立即发生,可能需要一段时间(但这是一次性过程)。命令的执行已暂停。镜像构建完成后,请再次执行命令。
791
791
  layout.split = 分屏
792
+ list.all = --- 所有 ---
792
793
  menu.audio = 音頻/語音
793
794
  menu.audio.cache.clear = 清除音频缓存...
794
795
  menu.audio.control.global = 语音控制(全局)
pygpt_net/item/model.py CHANGED
@@ -282,7 +282,7 @@ class ModelItem:
282
282
 
283
283
  :return: True if supports image output
284
284
  """
285
- return "image" in self.output or MODE_VISION in self.mode
285
+ return MULTIMODAL_IMAGE in self.output or MODE_VISION in self.mode
286
286
 
287
287
  def is_audio_input(self) -> bool:
288
288
  """
@@ -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.12.25 20:00:00 #
9
+ # Updated Date: 2025.12.26 12:00:00 #
10
10
  # ================================================== #
11
11
 
12
12
  import datetime
@@ -328,7 +328,7 @@ class VideoWorker(QRunnable):
328
328
  portrait = ar in ("9:16", "9x16", "portrait")
329
329
 
330
330
  if "sora-2-pro" in model:
331
- if "1024" in res or "1792" in res or "hd" in res:
331
+ if "1024" in res or "1080" in res or "1792" in res or "hd" in res:
332
332
  return "1024x1792" if portrait else "1792x1024"
333
333
 
334
334
  return "720x1280" if portrait else "1280x720"
@@ -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.12.25 20:00:00 #
9
+ # Updated Date: 2025.12.26 11:00:00 #
10
10
  # ================================================== #
11
11
 
12
12
  from packaging.version import parse as parse_version, Version
@@ -77,6 +77,31 @@ class Patch:
77
77
  data[model] = base_model
78
78
  updated = True
79
79
 
80
+ # < 2.6.67 <--- add missing image input
81
+ if old < parse_version("2.6.67"):
82
+ print("Migrating models from < 2.6.67...")
83
+ models_to_update = [
84
+ "claude-opus-4-5",
85
+ "claude-sonnet-4-5",
86
+ "gemini-3-flash-preview",
87
+ "gemini-3-pro-image-preview",
88
+ "gemini-3-pro-preview",
89
+ "gpt-5.2-low",
90
+ "gpt-5.2-medium",
91
+ "gpt-5.2-high",
92
+ "gpt-image-1.5",
93
+ "nano-banana-pro-preview",
94
+ "sora-2",
95
+ "veo-3.1-fast-generate-preview",
96
+ "veo-3.1-generate-preview"
97
+ ]
98
+ for model in models_to_update:
99
+ if model in data:
100
+ m = data[model]
101
+ if not m.is_image_input():
102
+ m.input.append("image")
103
+ updated = True
104
+
80
105
  # update file
81
106
  if updated:
82
107
  # fix empty/broken data
@@ -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,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,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.66
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
@@ -119,7 +119,7 @@ Description-Content-Type: text/markdown
119
119
 
120
120
  [![pygpt](https://snapcraft.io/pygpt/badge.svg)](https://snapcraft.io/pygpt)
121
121
 
122
- Release: **2.6.66** | build: **2025-12-25** | Python: **>=3.10, <3.14**
122
+ Release: **2.6.67** | build: **2025-12-26** | Python: **>=3.10, <3.14**
123
123
 
124
124
  > Official website: https://pygpt.net | Documentation: https://pygpt.readthedocs.io
125
125
  >
@@ -3753,6 +3753,12 @@ may consume additional tokens that are not displayed in the main window.
3753
3753
 
3754
3754
  ## Recent changes:
3755
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
+
3756
3762
  **2.6.66 (2025-12-25)**
3757
3763
 
3758
3764
  - Added Sora 2 support - #155.
@@ -1,6 +1,6 @@
1
- pygpt_net/CHANGELOG.txt,sha256=jJmWMRUHrEqnfs6W-O6WiqXdX7ZkQDvyHo9bYwmfR0I,110236
1
+ pygpt_net/CHANGELOG.txt,sha256=316VpcbRPH7Etyv-EU7Wfn5iIggPPEBR1iNn2Y2aku0,110403
2
2
  pygpt_net/LICENSE,sha256=dz9sfFgYahvu2NZbx4C1xCsVn9GVer2wXcMkFRBvqzY,1146
3
- pygpt_net/__init__.py,sha256=TQ-B7Q4-A0-jDnXMS4ggculbzFJTBO8hrDL08QihPRI,1373
3
+ pygpt_net/__init__.py,sha256=Ws-mA8PtU-zHDNjJ4ig8GouxfG5E_RmEf-BF1IrDzCo,1373
4
4
  pygpt_net/app.py,sha256=W-2rCYLndMgVV7cZZqeloqzifCggjISrFdMhHg0dMvM,23419
5
5
  pygpt_net/app_core.py,sha256=PwBOV9wZLtr-O6SxBiazABhYXMHH8kZ6OgbvSv2OiZA,3827
6
6
  pygpt_net/config.py,sha256=3CA7xXPKQsdRie1CY8_b5-Kk1taWMciUP9CesXRQNNY,18302
@@ -69,7 +69,7 @@ pygpt_net/controller/config/field/combo.py,sha256=DCW8medesKAbXx48dOoMI-33C_cifI
69
69
  pygpt_net/controller/config/field/dictionary.py,sha256=m3nSL8xAp0NRnr_rVmTZA5uTQF1lTh_07wknxdgtn6o,6443
70
70
  pygpt_net/controller/config/field/input.py,sha256=Dx04ivrwM1KqA41uHYNGzwq1c7O-zPnU_NI-3I45hPY,3992
71
71
  pygpt_net/controller/config/field/slider.py,sha256=dYbICd3ID-aLlc2a-bvFgWS4jceVz2UliTQKYy7Pl1Q,4560
72
- pygpt_net/controller/config/field/textarea.py,sha256=Ln545IHzXBeFIjnfMIpmlUr-V3wNYjw4qGiz4NYRw34,2796
72
+ pygpt_net/controller/config/field/textarea.py,sha256=yhP0edUXlnmCEAkqevoeFqrBdtZQHSjUKodd5VFbZ3o,2825
73
73
  pygpt_net/controller/config/placeholder.py,sha256=-PWPNILPVkxMsY64aYnKTWvgUIvx7KA2Nwfd2LW_K30,16711
74
74
  pygpt_net/controller/ctx/__init__.py,sha256=0wH7ziC75WscBW8cxpeGBwEz5tolo_kCxGPoz2udI_E,507
75
75
  pygpt_net/controller/ctx/common.py,sha256=1oR7cUgVzO_asqiRln4L4vZaxXsssAPtGyAp-B0FUE4,6409
@@ -83,7 +83,7 @@ pygpt_net/controller/dialogs/__init__.py,sha256=jI2WisG3lzbeyf__1Y7g7wWrxlr1QnYB
83
83
  pygpt_net/controller/dialogs/confirm.py,sha256=ILMj4DtlI-dA_fZmugande6XnTW892WoAM0ni_oIFkE,17429
84
84
  pygpt_net/controller/dialogs/debug.py,sha256=TZN5dvw21dtpgE0uCQ0-djRYsrL9eEFGlZQGuSCV3G4,6166
85
85
  pygpt_net/controller/dialogs/dialogs.py,sha256=sJHyZxkAn9QKTegUqx_xETesN2ecMBkrtf-VsCubr2w,1008
86
- pygpt_net/controller/dialogs/info.py,sha256=pfNzKwARTKInD8nhVYZaWBrGeghg2QFQAP4wkE50iu8,3992
86
+ pygpt_net/controller/dialogs/info.py,sha256=qfG1T2_K11-h_97gBUwV2vHAdICQzSUoQOFBmibIapM,3993
87
87
  pygpt_net/controller/files/__init__.py,sha256=4dJY1HOUTQ6GPAvvUQmTNwTRJKoShyCP8Lo8j2dD0ec,509
88
88
  pygpt_net/controller/files/files.py,sha256=GxU5nStgwZqnO85ZxZPgQ11l2QoljFh2sbh6_3s9tTs,18123
89
89
  pygpt_net/controller/finder/__init__.py,sha256=EUogcwzk4T0zyms2PJXduL3o1PzWwu0Q0qSo8Eu_8bw,510
@@ -108,11 +108,11 @@ pygpt_net/controller/launcher/launcher.py,sha256=lFPfzWF-z88FhDZ92XrEwAG_W8rVomv
108
108
  pygpt_net/controller/layout/__init__.py,sha256=0pxxzjAUa1hS27d80Q0SgDV1Uzs7A9mZrUxb1cs-oHs,510
109
109
  pygpt_net/controller/layout/layout.py,sha256=HlbfGK-_HXQrifSh5tWpPtu5JzWN2fktVmh8ofBDMfQ,13058
110
110
  pygpt_net/controller/media/__init__.py,sha256=N1UnDuteomgsBxRmVUd1Hm6UeGbHESYY9SowOhJj-YI,513
111
- pygpt_net/controller/media/media.py,sha256=HpBGRiK0XEQtaTuA3MtHsbO8FsJ-hfbE2zu_BRYlsNE,4825
111
+ pygpt_net/controller/media/media.py,sha256=m-eFE-Rf3wt2Zpme4964ShDrIuSjny1oLmuWj7EKhFw,5954
112
112
  pygpt_net/controller/mode/__init__.py,sha256=1Kcz0xHc2IW_if9S9eQozBUvIu69eLAe7T-Re2lJxhk,508
113
113
  pygpt_net/controller/mode/mode.py,sha256=H5hNiL6U4ZBxA5yhYWVmywINrvpNMZbI1XslLd12mdA,7979
114
114
  pygpt_net/controller/model/__init__.py,sha256=mQXq9u269D8TD3u_44J6DFFyHKkaZplk-tRFCssBGbE,509
115
- pygpt_net/controller/model/editor.py,sha256=tHJ2eT_OdmKygKG7Xe3IKpXdxApafPxL2rje4crn3gs,16108
115
+ pygpt_net/controller/model/editor.py,sha256=kvwTBLkoEQCS7IqHT0KiUcZBKEf0uH6KFFNT2lAeDGY,17946
116
116
  pygpt_net/controller/model/importer.py,sha256=9O35I0DjFOudWS41n5WPsKYFQm_K0XHOUKXvJt7l5kI,23837
117
117
  pygpt_net/controller/model/model.py,sha256=E0VfgIwNn75pjnB_v3RnqHr6jV1Eeua8VgpreQlA8vI,9132
118
118
  pygpt_net/controller/notepad/__init__.py,sha256=ZbMh4D6nsGuI4AwYMdegfij5ubmUznEE_UcqSSDjSPk,511
@@ -133,7 +133,7 @@ pygpt_net/controller/realtime/__init__.py,sha256=MhvJb5wBqcpX6uylof01qEDRdU3SepT
133
133
  pygpt_net/controller/realtime/manager.py,sha256=qtifO3sAtT1ROtRs9N_8t6A8_wgxOxxGl-PfLHzhdxY,1762
134
134
  pygpt_net/controller/realtime/realtime.py,sha256=Rw3sLhAaafcam5rNMZVRgds-BO40niSAyU2FbfHj4F0,10912
135
135
  pygpt_net/controller/settings/__init__.py,sha256=hn5n_Hti6byJQdQCs4Ld2EbPoZF7dHVMwqaBPscePQ8,512
136
- pygpt_net/controller/settings/editor.py,sha256=bSIRZgIvZvtP7cfZ3rxeKKLvUf1ttnJOJSZBzFKgb9M,18277
136
+ pygpt_net/controller/settings/editor.py,sha256=GuhfCrHtBWV-1JVtR9witSFRU7pvTkmKG1TVYlEATcI,19258
137
137
  pygpt_net/controller/settings/profile.py,sha256=aMz6jBiuqlrDc0KXUZnuMCf0EFTaY76P5p-TTW1-2B8,18993
138
138
  pygpt_net/controller/settings/settings.py,sha256=cFA4ZKjcsu8uoapWMTllUUB9DvJXVBzbxLT6InRS4zU,7768
139
139
  pygpt_net/controller/settings/workdir.py,sha256=l3dXKVMDhegcunOeZPfuMsloyjQznhWw6CxVrNVZ_k8,23262
@@ -397,7 +397,7 @@ pygpt_net/core/types/__init__.py,sha256=GHk9e0IaR7mNqD5qMNQnJxFpaXvPURy-IIkCzS7P
397
397
  pygpt_net/core/types/agent.py,sha256=74GRk_T1hSt7P2CSYjn0oTeYH3j3-ZLKsG_62Abu674,872
398
398
  pygpt_net/core/types/base.py,sha256=ZLJkuQwaeSmIkTBQMwHtW8rsTKJD9wFpaEjwMOSzNfI,638
399
399
  pygpt_net/core/types/console.py,sha256=vzYZ4fYkwK71ECJB7Qop0qcVIC6USLxxKuFN-ZweuB0,713
400
- pygpt_net/core/types/image.py,sha256=qgyLChou0b_OoSXlz5xWESAGAl0CGvX_-SJE8TDDyM0,3144
400
+ pygpt_net/core/types/image.py,sha256=J_zLX9RdMz0WjDJsGpQ1g2ZBnYzS9J39HqYucPTOplU,3295
401
401
  pygpt_net/core/types/mode.py,sha256=yY_6B2n8xEszbqph7mWTbgECHmJjAgal8CFNcUgyG7M,904
402
402
  pygpt_net/core/types/model.py,sha256=V8O9yipzqyTmVjzeESQ1xvZpSdRU6UYmvWJ1M2Kxs5A,549
403
403
  pygpt_net/core/types/multimodal.py,sha256=yeKLZ5MrCHU5LhWwFE-yGApt-FB59kTmElo3G7td9uw,594
@@ -406,7 +406,7 @@ pygpt_net/core/types/tools.py,sha256=BdonNwytk5SxYtYdlDkMg5lMvFoXz3CQJHZ__oVlm_8
406
406
  pygpt_net/core/updater/__init__.py,sha256=fC4g0Xn9S8lLxGbop1q2o2qi9IZegoVayNVWemgBwds,511
407
407
  pygpt_net/core/updater/updater.py,sha256=RArlEaYWNw5PIKcG2hMWqZI3DLbi8vq7Ip_rc8TBBNI,17045
408
408
  pygpt_net/core/video/__init__.py,sha256=PBAsunvkPSJJvcx2XivIul96XsbcW8mPAda_CX3dK1U,513
409
- pygpt_net/core/video/video.py,sha256=IPB0prwn7qmz2z_Euj0soqk2JjNgq2_z_l9HIeCkUIE,9138
409
+ pygpt_net/core/video/video.py,sha256=P3bx0KzPosGNF9jnARMgP13gdY2FX9Hm6JHuxc5XGdo,10103
410
410
  pygpt_net/core/vision/__init__.py,sha256=dFEilXM2Z128SmgBlLn1DvyLCksdcyqFI7rln_VPsf8,510
411
411
  pygpt_net/core/vision/analyzer.py,sha256=kzIBRhYrsPz3GD7ekN6GmQoF_f2e1w3WyVDnhse2s0g,4626
412
412
  pygpt_net/core/vision/vision.py,sha256=JX_tazW31Xesd6nPY1I1UcGmPd_V0hCG3JfMYW06oHo,728
@@ -420,8 +420,8 @@ pygpt_net/css_rc.py,sha256=PX6g9z5BsD-DXISuR2oq3jHcjiKfcJ4HsgcHez6wGMc,27762
420
420
  pygpt_net/data/audio/click_off.mp3,sha256=aNiRDP1pt-Jy7ija4YKCNFBwvGWbzU460F4pZWZDS90,65201
421
421
  pygpt_net/data/audio/click_on.mp3,sha256=qfdsSnthAEHVXzeyN4LlC0OvXuyW8p7stb7VXtlvZ1k,65201
422
422
  pygpt_net/data/audio/ok.mp3,sha256=LTiV32pEBkpUGBkKkcOdOFB7Eyt_QoP2Nv6c5AaXftk,32256
423
- pygpt_net/data/config/config.json,sha256=xRrvYm3nPH0zkm4rhgcnizjJfSfbf-ZxMYMO14ZSagQ,30937
424
- pygpt_net/data/config/models.json,sha256=VGOT1Nd3KBRWw1BTyruuc4b31uD2CQQK2uefhDITTA0,135432
423
+ pygpt_net/data/config/config.json,sha256=jFuZFxfxwjakyVHxQ2u9LsZpxlYV0gjb55ROqmg01Yc,30937
424
+ pygpt_net/data/config/models.json,sha256=dVjpaDSkgWkteQejwdn6oSZ4xrrha5j9u6w3ueN97Bo,135707
425
425
  pygpt_net/data/config/modes.json,sha256=IpjLOm428_vs6Ma9U-YQTNKJNtZw-qyM1lwhh73xl1w,2111
426
426
  pygpt_net/data/config/presets/agent_code_act.json,sha256=GYHqhxtKFLUCvRI3IJAJ7Qe1k8yD9wGGNwManldWzlI,754
427
427
  pygpt_net/data/config/presets/agent_openai.json,sha256=bpDJgLRey_effQkzFRoOEGd4aHUrmzeODSDdNzrf62I,730
@@ -1730,14 +1730,14 @@ pygpt_net/data/js/katex/katex.min.js,sha256=KLASOtKS2x8pUxWVzCDmlWJ4jhuLb0vtrgak
1730
1730
  pygpt_net/data/js/markdown-it/markdown-it-katex.min.js,sha256=-wMst2a9i8Borapa9_hxPvpQysfFE-yph8GrBmDoA68,1670
1731
1731
  pygpt_net/data/js/markdown-it/markdown-it.min.js,sha256=OMcKHnypGrQOLZ5uYBKYUacX7Rx9Ssu91Bv5UDeRz2g,123618
1732
1732
  pygpt_net/data/languages.csv,sha256=fvtER6vnTXFHQslCh-e0xCfZDQ-ijgW4GYpOJG4U7LY,8289
1733
- pygpt_net/data/locale/locale.de.ini,sha256=V8wTMWj3lU-TYLBCeToz4QHMhADUcTmEKRPjw5ku6Jg,112488
1734
- pygpt_net/data/locale/locale.en.ini,sha256=leyB27nPD9PlDYygvl_RBSI8Y1QZO2gu_2djrIz3_LI,106612
1735
- pygpt_net/data/locale/locale.es.ini,sha256=1tT0MzmIgiajZ-4Bl33WiVd9J7maso1TKiqBU7Va_Es,113041
1736
- pygpt_net/data/locale/locale.fr.ini,sha256=dRl27nFfK-NjmIlMlhLPSCl_wbWR12pWYf88ctnY6Nc,115910
1737
- pygpt_net/data/locale/locale.it.ini,sha256=I_Ni8j2h2OsPOtvMR-cTeXOtQIPPr4HPG0NnnKzjVLQ,110737
1738
- pygpt_net/data/locale/locale.pl.ini,sha256=vHjfw1Bctg9LCrpMkb9blPU0iTByixH0YQrexLb7-bU,110400
1739
- pygpt_net/data/locale/locale.uk.ini,sha256=UYiVIvOlhywEvg3j3WKsyJ8X8ZGTfAZFs1zEjZDVkQc,153855
1740
- pygpt_net/data/locale/locale.zh.ini,sha256=hGAOGHY5-nOM-oNP98UuH8n9rsbpHyFNe49QGvkEgPI,98783
1733
+ pygpt_net/data/locale/locale.de.ini,sha256=l0eA3RMz6g3Q425lTBr1Q6zabprAxPpBJ00puzmK9Fw,112512
1734
+ pygpt_net/data/locale/locale.en.ini,sha256=27zD937x8HYylAnXqG3Ns20SCtKNPlp3wKFhCOP-XVs,106635
1735
+ pygpt_net/data/locale/locale.es.ini,sha256=gPfFGZR-ryiQvAJl94oZHxP_AjkL3DxwRXp4Ckj4CoY,113066
1736
+ pygpt_net/data/locale/locale.fr.ini,sha256=9KOWqm8VanLD7li43W2g4HxHstj48rROI3g-8-mj6aQ,115934
1737
+ pygpt_net/data/locale/locale.it.ini,sha256=VMt9gMUwr4BLB8KYMcmXM3TpwK7CWxgZoFOAj8NVay0,110762
1738
+ pygpt_net/data/locale/locale.pl.ini,sha256=Dse8qBcdK6-mSIPQDtTFir6XmEBkSE1WAwaeVOAxiQE,110430
1739
+ pygpt_net/data/locale/locale.uk.ini,sha256=oRn979oDpZbn0-YTiQsnjStjlZmdRSbJDfpD05ajWAI,153881
1740
+ pygpt_net/data/locale/locale.zh.ini,sha256=PVOe00VqBT-VBAh6v7MlBvybYaO_9k33LYi-wzyC5D4,98809
1741
1741
  pygpt_net/data/locale/plugin.agent.de.ini,sha256=BY28KpfFvgfVYJzcw2o5ScWnR4uuErIYGyc3NVHlmTw,1714
1742
1742
  pygpt_net/data/locale/plugin.agent.en.ini,sha256=HwOWCI7e8uzlIgyRWRVyr1x6Xzs8Xjv5pfEc7jfLOo4,1728
1743
1743
  pygpt_net/data/locale/plugin.agent.es.ini,sha256=bqaJQne8HPKFVtZ8Ukzo1TSqVW41yhYbGUqW3j2x1p8,1680
@@ -1935,7 +1935,7 @@ pygpt_net/item/calendar_note.py,sha256=ab2cegCxr-p9WU_r3FkCNg0TwLHhfV4--O4Gei-Ls
1935
1935
  pygpt_net/item/ctx.py,sha256=kHxnujf7vzVP3CYjSe6PFV1Bf7DE2fozlGveA7GX7jY,25783
1936
1936
  pygpt_net/item/index.py,sha256=NTDBgNjiyaixTFJu_1oBqoVajf92c2U1Oa3BKQ11poU,1920
1937
1937
  pygpt_net/item/mode.py,sha256=0uPU7ciqVLaEcijUA-D73ABMoLUFtgPytdXUuwqtews,688
1938
- pygpt_net/item/model.py,sha256=sOKM2Y2pzbMKgomqiMhc_anSchG2CJWInAXUeZZqlLo,10104
1938
+ pygpt_net/item/model.py,sha256=Gt20je8pTQ_cAQwbw6tQqHF3eEmXWoNCTakFLNJRk7k,10113
1939
1939
  pygpt_net/item/notepad.py,sha256=7v3A3HJjew0IoFM65Li0xfoSEdJzfEUZM1IH1ND0Bxw,1805
1940
1940
  pygpt_net/item/preset.py,sha256=nkLoyfHoZnjoqKKynDo0alJDb_o8BFxTZRYk7_2uQss,8991
1941
1941
  pygpt_net/item/prompt.py,sha256=xequZDTEv4eKjmC5OLqZnNrbyy0YA4LHe0k2RpPiBw0,1745
@@ -2189,7 +2189,7 @@ pygpt_net/provider/api/openai/store.py,sha256=8H2SQH9wU9Yoeai6gqajbJ1N33CSv26IA5
2189
2189
  pygpt_net/provider/api/openai/summarizer.py,sha256=vuJz6mj9F9Psiat0d-fn1zNGgXc-WkXJyi0jrvijO6E,2978
2190
2190
  pygpt_net/provider/api/openai/tools.py,sha256=Oh9mnGIXfnwoRTx6f-9ZItD-v3loyr4OtcvhmgroyrY,3146
2191
2191
  pygpt_net/provider/api/openai/utils.py,sha256=O0H0EPb4lXUMfE1bFdWB56yuWLv7M5owVIGWRyDDv-E,855
2192
- pygpt_net/provider/api/openai/video.py,sha256=-3G8u0JeHBcoUcrobe5PO3vLMXmI7v5Gc0Z63-SiPqQ,22487
2192
+ pygpt_net/provider/api/openai/video.py,sha256=XZeSipNuqrxTU6Kb7dmzDTxtLzRZAgJNh-AI0fzVLKg,22504
2193
2193
  pygpt_net/provider/api/openai/vision.py,sha256=dsG-pAr1MP-A1aQLc3Yn2QzPNwMlPGQEi4LM1ry3YY4,12883
2194
2194
  pygpt_net/provider/api/openai/worker/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
2195
2195
  pygpt_net/provider/api/openai/worker/assistants.py,sha256=z1fZzl59FYMVXxv48r9JVIzSCFgLzYOeKXhreZcIzO8,21538
@@ -2281,7 +2281,7 @@ pygpt_net/provider/core/mode/patch.py,sha256=VS2KCYW05jxLd-lcStNY1k4fHKUUrVVLTdR
2281
2281
  pygpt_net/provider/core/model/__init__.py,sha256=jQQgG9u_ZLsZWXustoc1uvC-abUvj4RBKPAM30-f2Kc,488
2282
2282
  pygpt_net/provider/core/model/base.py,sha256=L1x2rHha8a8hnCUYxZr88utay1EWEx5qBXW_2acpAN0,1319
2283
2283
  pygpt_net/provider/core/model/json_file.py,sha256=l74l_n5PEHNp-FsoHtO9LHflz3RFKwDwKwOKN0stgZw,8418
2284
- pygpt_net/provider/core/model/patch.py,sha256=y6hBeQX6dCqQXWPpsxZnERZwHJ15E6pJelymyubz2rY,3343
2284
+ pygpt_net/provider/core/model/patch.py,sha256=eWp7xIz8AWnWnGtFIRFphP-IiZyHQP2ykW_403wuYbI,4371
2285
2285
  pygpt_net/provider/core/model/patches/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
2286
2286
  pygpt_net/provider/core/model/patches/patch_before_2_6_42.py,sha256=4z10uc4NnmCCL9AYWrXfzi1Xet5OZFjc7K-Nf0s4T1s,37729
2287
2287
  pygpt_net/provider/core/notepad/__init__.py,sha256=jQQgG9u_ZLsZWXustoc1uvC-abUvj4RBKPAM30-f2Kc,488
@@ -2485,7 +2485,7 @@ pygpt_net/ui/dialog/find.py,sha256=8VAcSRFkCLu4Yum6LwHgHg_8Ogn_ytco0ShaJLIJDXk,9
2485
2485
  pygpt_net/ui/dialog/image.py,sha256=nF7ejD44_UAAppUC3OpqaoSvzA-NM2B5fVOO0L8vFBE,2538
2486
2486
  pygpt_net/ui/dialog/license.py,sha256=15Qrk_vnybnI3CAtvOHYJy8cSAkIG7fPG-HYqmSdctQ,2272
2487
2487
  pygpt_net/ui/dialog/logger.py,sha256=OGFKlAyeMgNQI4a-VW9bDXSrcsPtEC6rLhtdu11lsJc,2296
2488
- pygpt_net/ui/dialog/models.py,sha256=WnVvv1pFwTTXmK3uM9bNX59GMccDGxvKhAYxJXW88fs,19717
2488
+ pygpt_net/ui/dialog/models.py,sha256=kog8P4O061LetxHTJARwrQxXu3so_xkhMK31iC-Ceog,20376
2489
2489
  pygpt_net/ui/dialog/models_importer.py,sha256=14kxf7KkOdTP-tcgTN5OphNZajlivDPTDKBosebuyog,4505
2490
2490
  pygpt_net/ui/dialog/plugins.py,sha256=88TsvYWHdmR5hepld6ouSEa4BDhewAQ-JFE7RWGSdy8,20287
2491
2491
  pygpt_net/ui/dialog/preset.py,sha256=3Uv29ie0a-mtyDNcF4C1NS75icbW6FNY_iIoJPTOnGA,20533
@@ -2533,7 +2533,7 @@ pygpt_net/ui/layout/toolbox/prompt.py,sha256=subUUZJgkCmvSRekZcgVYs6wzl-MYPBLXKT
2533
2533
  pygpt_net/ui/layout/toolbox/raw.py,sha256=Uvkk0QnrOIZ9sHJ3EnDzTRaWDLNC6cdgYyICPI8lJCk,1803
2534
2534
  pygpt_net/ui/layout/toolbox/split.py,sha256=Hs9hZPciLXCRV_izoayrBlJSCuTGumdNki6z1giWUUo,1696
2535
2535
  pygpt_net/ui/layout/toolbox/toolbox.py,sha256=VHzyzm7LjcAN30h111SEP6fdXwi84DYyf8CE1X3pdt8,2799
2536
- pygpt_net/ui/layout/toolbox/video.py,sha256=JyDVkJIh1m6RSbJFGQqIBKrsQgbfx2O08ybJ7bEZyWg,1477
2536
+ pygpt_net/ui/layout/toolbox/video.py,sha256=MWQiDmO7ajpUDotb5tYaLr15UFS27E9s4LG-ReMenEc,2014
2537
2537
  pygpt_net/ui/layout/toolbox/vision.py,sha256=E6-lLfU3vrWdlprayr6gxFs7F7AGkn4OIrFXrQ9p5XA,2035
2538
2538
  pygpt_net/ui/main.py,sha256=j7NA1w4KAtjtUeD_XzXcd0IEIUkWiU_5C--6Do-s2XE,14228
2539
2539
  pygpt_net/ui/menu/__init__.py,sha256=wAIKG9wLWfYv6tpXCTXptWb_XKoCc-4lYWLDvV1bVYk,508
@@ -2640,7 +2640,7 @@ pygpt_net/ui/widget/option/checkbox_list.py,sha256=SgnkLTlVZCcU3ehqAfi_w28x693w_
2640
2640
  pygpt_net/ui/widget/option/cmd.py,sha256=Ii_i9hR4oRmG4-TPZ-FHuTv3I1vL96YLcDP2QSKmAbI,5800
2641
2641
  pygpt_net/ui/widget/option/combo.py,sha256=UZH-SKfnRHHHoKFpLBgOTykBMOXYQ9gph0e3vrg3WAQ,11452
2642
2642
  pygpt_net/ui/widget/option/dictionary.py,sha256=67F-BGOMuH-MCEvdvE-cVqkyE8xR8euHH5zSkhRqUco,13517
2643
- pygpt_net/ui/widget/option/input.py,sha256=xeTbKOO6JFRb1seZCJQTtvehW1uSJx-l8mYMf-HqA4E,9574
2643
+ pygpt_net/ui/widget/option/input.py,sha256=-pLXzkOO2OvOoUKTuocbOt8JcPWQO3W3cmrSh0WhJcc,9718
2644
2644
  pygpt_net/ui/widget/option/prompt.py,sha256=SgRd0acp13_c19tWjYYChcGgAwik9tsZKKsX1Ciqgp4,2818
2645
2645
  pygpt_net/ui/widget/option/slider.py,sha256=nEGocCAHZ-HuyE0D0QZxs30QiUXs8B2EQRQXSsGIGIE,3569
2646
2646
  pygpt_net/ui/widget/option/textarea.py,sha256=-ymu6_xLMjJ1gATzkYwOoArAD01g83r9gHlUXFHK9Uc,2929
@@ -2669,8 +2669,8 @@ pygpt_net/ui/widget/textarea/web.py,sha256=sVRSmudPwPfjK2h7q-e6Ae4b-677BHLe20t-x
2669
2669
  pygpt_net/ui/widget/vision/__init__.py,sha256=8HT4tQFqQogEEpGYTv2RplKBthlsFKcl5egnv4lzzEw,488
2670
2670
  pygpt_net/ui/widget/vision/camera.py,sha256=DCx7h1nHruuUkU0Tw8Ay4OUVoNJhkuLsW4hIvGF5Skw,6985
2671
2671
  pygpt_net/utils.py,sha256=r-Dum4brfBaZaHJr-ux86FfdMuMHFwyuUL2bEFirdhc,14649
2672
- pygpt_net-2.6.66.dist-info/LICENSE,sha256=rbPqNB_xxANH8hKayJyIcTwD4bj4Y2G-Mcm85r1OImM,1126
2673
- pygpt_net-2.6.66.dist-info/METADATA,sha256=R9tH-lPAuM7uGifTA3MXbYU_s4BZhDW8BC9GFszRyYQ,170744
2674
- pygpt_net-2.6.66.dist-info/WHEEL,sha256=b4K_helf-jlQoXBBETfwnf4B04YC67LOev0jo4fX5m8,88
2675
- pygpt_net-2.6.66.dist-info/entry_points.txt,sha256=qvpII6UHIt8XfokmQWnCYQrTgty8FeJ9hJvOuUFCN-8,43
2676
- pygpt_net-2.6.66.dist-info/RECORD,,
2672
+ pygpt_net-2.6.67.dist-info/LICENSE,sha256=rbPqNB_xxANH8hKayJyIcTwD4bj4Y2G-Mcm85r1OImM,1126
2673
+ pygpt_net-2.6.67.dist-info/METADATA,sha256=h46iQNvJx-BpwYX2y7k3Aikceb7RHBZso1baiDZlbGw,170915
2674
+ pygpt_net-2.6.67.dist-info/WHEEL,sha256=b4K_helf-jlQoXBBETfwnf4B04YC67LOev0jo4fX5m8,88
2675
+ pygpt_net-2.6.67.dist-info/entry_points.txt,sha256=qvpII6UHIt8XfokmQWnCYQrTgty8FeJ9hJvOuUFCN-8,43
2676
+ pygpt_net-2.6.67.dist-info/RECORD,,