pygpt-net 2.6.32__py3-none-any.whl → 2.6.34__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 (44) hide show
  1. pygpt_net/CHANGELOG.txt +12 -0
  2. pygpt_net/__init__.py +3 -3
  3. pygpt_net/controller/assistant/batch.py +14 -4
  4. pygpt_net/controller/assistant/files.py +1 -0
  5. pygpt_net/controller/assistant/store.py +195 -1
  6. pygpt_net/controller/camera/camera.py +1 -1
  7. pygpt_net/controller/chat/attachment.py +2 -0
  8. pygpt_net/controller/chat/common.py +50 -46
  9. pygpt_net/controller/config/placeholder.py +95 -75
  10. pygpt_net/controller/dialogs/confirm.py +3 -1
  11. pygpt_net/controller/media/media.py +11 -3
  12. pygpt_net/controller/painter/common.py +227 -10
  13. pygpt_net/controller/painter/painter.py +4 -12
  14. pygpt_net/core/assistants/files.py +18 -0
  15. pygpt_net/core/camera/camera.py +38 -93
  16. pygpt_net/core/camera/worker.py +430 -0
  17. pygpt_net/core/filesystem/url.py +3 -0
  18. pygpt_net/core/render/web/body.py +65 -9
  19. pygpt_net/core/text/utils.py +3 -0
  20. pygpt_net/data/config/config.json +234 -221
  21. pygpt_net/data/config/models.json +179 -180
  22. pygpt_net/data/config/settings.json +10 -5
  23. pygpt_net/data/locale/locale.de.ini +8 -6
  24. pygpt_net/data/locale/locale.en.ini +9 -5
  25. pygpt_net/data/locale/locale.es.ini +8 -6
  26. pygpt_net/data/locale/locale.fr.ini +8 -6
  27. pygpt_net/data/locale/locale.it.ini +8 -6
  28. pygpt_net/data/locale/locale.pl.ini +8 -6
  29. pygpt_net/data/locale/locale.uk.ini +8 -6
  30. pygpt_net/data/locale/locale.zh.ini +8 -6
  31. pygpt_net/item/assistant.py +13 -1
  32. pygpt_net/provider/api/google/__init__.py +32 -23
  33. pygpt_net/provider/api/openai/store.py +45 -1
  34. pygpt_net/provider/llms/google.py +4 -0
  35. pygpt_net/ui/dialog/assistant_store.py +213 -203
  36. pygpt_net/ui/layout/chat/input.py +3 -3
  37. pygpt_net/ui/widget/draw/painter.py +458 -75
  38. pygpt_net/ui/widget/option/combo.py +5 -1
  39. pygpt_net/ui/widget/textarea/input.py +273 -3
  40. {pygpt_net-2.6.32.dist-info → pygpt_net-2.6.34.dist-info}/METADATA +14 -2
  41. {pygpt_net-2.6.32.dist-info → pygpt_net-2.6.34.dist-info}/RECORD +44 -43
  42. {pygpt_net-2.6.32.dist-info → pygpt_net-2.6.34.dist-info}/LICENSE +0 -0
  43. {pygpt_net-2.6.32.dist-info → pygpt_net-2.6.34.dist-info}/WHEEL +0 -0
  44. {pygpt_net-2.6.32.dist-info → pygpt_net-2.6.34.dist-info}/entry_points.txt +0 -0
@@ -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.07.12 19:00:00 #
9
+ # Updated Date: 2025.09.02 16:00:00 #
10
10
  # ================================================== #
11
11
 
12
12
  from PySide6.QtCore import Qt
@@ -109,6 +109,8 @@ class OptionCombo(QWidget):
109
109
  for item in self.keys:
110
110
  if type(item) is dict:
111
111
  for key, value in item.items():
112
+ if not isinstance(key, str):
113
+ key = str(key)
112
114
  if key.startswith("separator::"):
113
115
  self.combo.addSeparator(value)
114
116
  else:
@@ -117,6 +119,8 @@ class OptionCombo(QWidget):
117
119
  self.combo.addItem(item, item)
118
120
  elif type(self.keys) is dict:
119
121
  for key, value in self.keys.items():
122
+ if not isinstance(key, str):
123
+ key = str(key)
120
124
  if key.startswith("separator::"):
121
125
  self.combo.addSeparator(value)
122
126
  else:
@@ -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.08.27 07:00:00 #
9
+ # Updated Date: 2025.09.03 00:00:00 #
10
10
  # ================================================== #
11
11
 
12
12
  from typing import Optional
13
+ import math
13
14
 
14
- from PySide6.QtCore import Qt, QSize
15
+ from PySide6.QtCore import Qt, QSize, QTimer, QEvent
15
16
  from PySide6.QtGui import QAction, QIcon, QImage
16
17
  from PySide6.QtWidgets import (
17
18
  QTextEdit,
@@ -90,6 +91,24 @@ class ChatInput(QTextEdit):
90
91
  # Apply initial margins (top padding + left space for icons)
91
92
  self._apply_margins()
92
93
 
94
+ # ---- Auto-resize config (input in splitter) ----
95
+ self._auto_max_lines = 10 # max lines for auto-expansion
96
+ self._auto_max_ratio = 0.25 # max fraction of main window height
97
+ self._auto_debounce_ms = 0 # coalesce updates in next event loop turn
98
+ self._auto_updating = False # reentrancy guard
99
+ self._splitter_resize_in_progress = False
100
+ self._splitter_connected = False
101
+ self._user_adjusting_splitter = False
102
+ self._auto_pause_ms_after_user_drag = 350
103
+ self._last_target_container_h = None
104
+
105
+ self._auto_timer = QTimer(self)
106
+ self._auto_timer.setSingleShot(True)
107
+ self._auto_timer.timeout.connect(self._auto_resize_tick)
108
+
109
+ # Trigger auto-resize on text changes (tokens update stays intact)
110
+ self.textChanged.connect(self._schedule_auto_resize)
111
+
93
112
  def _apply_text_top_padding(self):
94
113
  """Apply extra top padding inside the text area by using viewport margins."""
95
114
  # Left margin is computed in _apply_margins()
@@ -213,6 +232,9 @@ class ChatInput(QTextEdit):
213
232
  self.window.controller.chat.input.send_input()
214
233
  handled = True
215
234
  self.setFocus()
235
+ # Collapse to minimum after sending
236
+ if handled:
237
+ QTimer.singleShot(0, self.collapse_to_min)
216
238
  elif key == Qt.Key_Escape and self.window.controller.ctx.extra.is_editing():
217
239
  self.window.controller.ctx.extra.edit_cancel()
218
240
  handled = True
@@ -240,10 +262,17 @@ class ChatInput(QTextEdit):
240
262
  self.window.core.config.data['font_size.input'] = self.value
241
263
  self.window.core.config.save()
242
264
  self.window.controller.ui.update_font_size()
265
+ # Reflow may change number of lines; adjust auto-height next tick
266
+ QTimer.singleShot(0, self._schedule_auto_resize)
243
267
  event.accept()
244
268
  return
245
269
  super().wheelEvent(event)
246
270
 
271
+ def changeEvent(self, event):
272
+ super().changeEvent(event)
273
+ if event.type() == QEvent.FontChange:
274
+ self._schedule_auto_resize()
275
+
247
276
  def action_add_attachment(self):
248
277
  """Add attachment (button click)."""
249
278
  self.window.controller.attachment.open_add()
@@ -672,4 +701,245 @@ class ChatInput(QTextEdit):
672
701
  try:
673
702
  self._reposition_icon_bar()
674
703
  except Exception:
675
- pass
704
+ pass
705
+ # Recompute on width changes (word wrap may change line count)
706
+ if not self._splitter_resize_in_progress:
707
+ if self.hasFocus():
708
+ self._schedule_auto_resize()
709
+ else:
710
+ # Allow shrinking to minimum when content is single line
711
+ self._schedule_auto_resize(enforce_minimize_if_single=True)
712
+
713
+ # ================== Auto-resize inside QSplitter ==================
714
+
715
+ def _ensure_splitter_hook(self):
716
+ """Lazy-connect to main splitter to detect manual drags."""
717
+ if self._splitter_connected:
718
+ return
719
+ splitter = self._get_main_splitter()
720
+ if splitter is not None:
721
+ try:
722
+ splitter.splitterMoved.connect(self._on_splitter_moved_by_user)
723
+ self._splitter_connected = True
724
+ except Exception:
725
+ pass
726
+
727
+ def _on_splitter_moved_by_user(self, pos, index):
728
+ """Pause auto-resize briefly while the user drags the splitter."""
729
+ self._user_adjusting_splitter = True
730
+ QTimer.singleShot(self._auto_pause_ms_after_user_drag, self._reset_user_adjusting_flag)
731
+
732
+ def _reset_user_adjusting_flag(self):
733
+ self._user_adjusting_splitter = False
734
+
735
+ def _get_main_splitter(self):
736
+ """Get main vertical splitter from window registry."""
737
+ try:
738
+ return self.window.ui.splitters.get('main.output')
739
+ except Exception:
740
+ return None
741
+
742
+ def _find_container_in_splitter(self, splitter):
743
+ """Find the direct child of splitter that contains this ChatInput."""
744
+ if splitter is None:
745
+ return None, -1
746
+ for i in range(splitter.count()):
747
+ w = splitter.widget(i)
748
+ if w and w.isAncestorOf(self):
749
+ return w, i
750
+ return None, -1
751
+
752
+ def _schedule_auto_resize(self, force: bool = False, enforce_minimize_if_single: bool = False):
753
+ """Schedule auto-resize; multiple calls are coalesced."""
754
+ # Store flags for the next tick
755
+ self._pending_force = getattr(self, "_pending_force", False) or bool(force)
756
+ self._pending_minimize_if_single = getattr(self, "_pending_minimize_if_single", False) or bool(
757
+ enforce_minimize_if_single)
758
+ # Avoid scheduling when splitter drag in progress
759
+ if self._user_adjusting_splitter or self._splitter_resize_in_progress:
760
+ return
761
+ self._ensure_splitter_hook()
762
+ # Debounce to next event loop to ensure document layout is up to date
763
+ if not self._auto_timer.isActive():
764
+ self._auto_timer.start(self._auto_debounce_ms)
765
+
766
+ def _auto_resize_tick(self):
767
+ """Execute auto-resize once after debounce."""
768
+ force = getattr(self, "_pending_force", False)
769
+ minimize_if_single = getattr(self, "_pending_minimize_if_single", False)
770
+ self._pending_force = False
771
+ self._pending_minimize_if_single = False
772
+ try:
773
+ self._update_auto_height(force=force, minimize_if_single=minimize_if_single)
774
+ except Exception:
775
+ # Never break input pipeline on errors
776
+ pass
777
+
778
+ def _document_content_height(self) -> int:
779
+ """Return QTextDocument layout height in pixels."""
780
+ doc = self.document()
781
+ layout = doc.documentLayout()
782
+ if layout is not None:
783
+ h = layout.documentSize().height()
784
+ else:
785
+ h = doc.size().height()
786
+ return int(math.ceil(h))
787
+
788
+ def _line_spacing(self) -> int:
789
+ """Return current line spacing for font."""
790
+ return int(math.ceil(self.fontMetrics().lineSpacing()))
791
+
792
+ def _effective_lines(self, doc_h: int, line_h: int, doc_margin: float) -> float:
793
+ """Rough estimate of visible line count from document height."""
794
+ base = max(0.0, doc_h - 2.0 * float(doc_margin))
795
+ if line_h <= 0:
796
+ return 1.0
797
+ return max(1.0, base / float(line_h))
798
+
799
+ def _min_input_widget_height(self, non_viewport_h: int) -> int:
800
+ """Height of QTextEdit widget required to fit a single line without scrollbars."""
801
+ line_h = self._line_spacing()
802
+ doc_margin = float(self.document().documentMargin())
803
+ min_viewport_h = int(math.ceil(2.0 * doc_margin + line_h))
804
+ # Respect current minimum size hint to avoid jitter on some styles
805
+ min_hint = max(self.minimumSizeHint().height(), 0)
806
+ return max(min_hint, min_viewport_h + non_viewport_h)
807
+
808
+ def _max_input_widget_height_by_lines(self, non_viewport_h: int) -> int:
809
+ """Max widget height allowed by line count cap."""
810
+ line_h = self._line_spacing()
811
+ doc_margin = float(self.document().documentMargin())
812
+ max_viewport_h = int(math.ceil(2.0 * doc_margin + self._auto_max_lines * line_h))
813
+ return max_viewport_h + non_viewport_h
814
+
815
+ def _should_shrink_to_min(self, doc_h: int) -> bool:
816
+ """Decide if we should collapse to minimum (single line or empty)."""
817
+ line_h = self._line_spacing()
818
+ doc_margin = float(self.document().documentMargin())
819
+ threshold = 2.0 * doc_margin + 1.25 * line_h # small slack for layout rounding
820
+ return doc_h <= threshold
821
+
822
+ def _update_auto_height(self, force: bool = False, minimize_if_single: bool = False):
823
+ """
824
+ Core auto-resize routine:
825
+ - expand only when the input has focus (unless force=True),
826
+ - cap by max lines and 1/4 of main window height,
827
+ - shrink back to minimal only after send or when text is effectively one line.
828
+ """
829
+ if self._auto_updating or self._splitter_resize_in_progress:
830
+ return
831
+
832
+ splitter = self._get_main_splitter()
833
+ container, idx = self._find_container_in_splitter(splitter)
834
+ if splitter is None or container is None or idx < 0:
835
+ return # Not yet attached to the splitter
836
+
837
+ # Expansion only with focus unless forced
838
+ has_focus = self.hasFocus()
839
+ can_expand = force or has_focus
840
+ if self._user_adjusting_splitter and not force:
841
+ return
842
+
843
+ # Measure current layout and targets
844
+ doc_h = self._document_content_height()
845
+ non_viewport_h = self.height() - self.viewport().height()
846
+ needed_input_h = int(math.ceil(doc_h + non_viewport_h))
847
+ min_input_h = self._min_input_widget_height(non_viewport_h)
848
+ max_input_by_lines = self._max_input_widget_height_by_lines(non_viewport_h)
849
+
850
+ # Container overhead above the inner QTextEdit
851
+ container_overhead = max(0, container.height() - self.height())
852
+ needed_container_h = needed_input_h + container_overhead
853
+ min_container_h = min_input_h + container_overhead
854
+
855
+ # Max cap by window fraction
856
+ try:
857
+ max_container_by_ratio = int(self.window.height() * self._auto_max_ratio)
858
+ except Exception:
859
+ max_container_by_ratio = 0 # fallback disables ratio cap if window unavailable
860
+
861
+ max_container_by_lines = max_input_by_lines + container_overhead
862
+ cap_container_max = max_container_by_lines
863
+ if max_container_by_ratio > 0:
864
+ cap_container_max = min(cap_container_max, max_container_by_ratio)
865
+
866
+ current_sizes = splitter.sizes()
867
+ if idx >= len(current_sizes):
868
+ return
869
+ current_container_h = current_sizes[idx]
870
+
871
+ # Decide on action
872
+ target_container_h = None
873
+
874
+ # Shrink only when requested or effectively single line
875
+ if minimize_if_single or self._should_shrink_to_min(doc_h):
876
+ if current_container_h > min_container_h + 1:
877
+ target_container_h = min_container_h
878
+
879
+ # Expand if focused (or forced), but only up to caps
880
+ elif can_expand:
881
+ desired = min(needed_container_h, cap_container_max)
882
+ if desired > current_container_h + 1:
883
+ target_container_h = desired
884
+
885
+ # Apply if needed
886
+ if target_container_h is None:
887
+ return
888
+
889
+ total = sum(current_sizes)
890
+ # Clamp to splitter total height
891
+ target_container_h = max(0, min(target_container_h, total))
892
+
893
+ if abs(target_container_h - current_container_h) <= 1:
894
+ return
895
+
896
+ # Prepare new sizes (2 widgets expected: output at 0, input at 1)
897
+ new_sizes = list(current_sizes)
898
+ # Distribute delta to other panes; here we have exactly 2
899
+ other_total = total - current_container_h
900
+ new_other_total = total - target_container_h
901
+ if other_total <= 0:
902
+ # degenerate case; just set directly
903
+ pass
904
+ else:
905
+ # Scale other widgets proportionally
906
+ scale = new_other_total / float(other_total) if other_total > 0 else 1.0
907
+ for i in range(len(new_sizes)):
908
+ if i != idx:
909
+ new_sizes[i] = int(round(new_sizes[i] * scale))
910
+ new_sizes[idx] = int(target_container_h)
911
+
912
+ # Final clamp to preserve sum
913
+ diff = total - sum(new_sizes)
914
+ if diff != 0 and len(new_sizes) > 0:
915
+ # Adjust the first non-target pane to fix rounding
916
+ for i in range(len(new_sizes)):
917
+ if i != idx:
918
+ new_sizes[i] += diff
919
+ break
920
+
921
+ self._splitter_resize_in_progress = True
922
+ try:
923
+ old_block = splitter.blockSignals(True)
924
+ splitter.setSizes(new_sizes)
925
+ splitter.blockSignals(old_block)
926
+ finally:
927
+ self._splitter_resize_in_progress = False
928
+
929
+ # Keep stored sizes in sync with app expectations (mirrors ChatMain.on_splitter_moved)
930
+ try:
931
+ tabs = self.window.ui.tabs
932
+ if "input" in tabs:
933
+ t_idx = tabs['input'].currentIndex()
934
+ if t_idx != 0:
935
+ self.window.controller.ui.splitter_output_size_files = new_sizes
936
+ else:
937
+ self.window.controller.ui.splitter_output_size_input = new_sizes
938
+ except Exception:
939
+ pass
940
+
941
+ self._last_target_container_h = target_container_h
942
+
943
+ def collapse_to_min(self):
944
+ """Public helper to collapse input area to minimal height."""
945
+ self._schedule_auto_resize(force=True, enforce_minimize_if_single=True)
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.3
2
2
  Name: pygpt-net
3
- Version: 2.6.32
3
+ Version: 2.6.34
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, 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
@@ -118,7 +118,7 @@ Description-Content-Type: text/markdown
118
118
 
119
119
  [![pygpt](https://snapcraft.io/pygpt/badge.svg)](https://snapcraft.io/pygpt)
120
120
 
121
- Release: **2.6.32** | build: **2025-09-02** | Python: **>=3.10, <3.14**
121
+ Release: **2.6.34** | build: **2025-09-03** | Python: **>=3.10, <3.14**
122
122
 
123
123
  > Official website: https://pygpt.net | Documentation: https://pygpt.readthedocs.io
124
124
  >
@@ -3565,6 +3565,18 @@ may consume additional tokens that are not displayed in the main window.
3565
3565
 
3566
3566
  ## Recent changes:
3567
3567
 
3568
+ **2.6.34 (2025-09-03)**
3569
+
3570
+ - Added auto-resizing for input.
3571
+ - Added file management to the OpenAI Vector Stores tool.
3572
+ - Implemented removal of script tags when exporting HTML.
3573
+ - Enabled maintaining custom resolution in Painter.
3574
+
3575
+ **2.6.33 (2025-09-02)**
3576
+
3577
+ - Added a "crop" option, auto-resize canvas, and layer support to Painter.
3578
+ - Improved video capture from the camera.
3579
+
3568
3580
  **2.6.32 (2025-09-02)**
3569
3581
 
3570
3582
  - Added video generation and support for Google Veo 3 models.
@@ -1,6 +1,6 @@
1
- pygpt_net/CHANGELOG.txt,sha256=aSOxFRc4HWlYcTa0aRZk_ajvSHVDXXs3fEhTg0YArBU,103774
1
+ pygpt_net/CHANGELOG.txt,sha256=1wuPhOstkPgPaVN5t05LrBbHsOqOVSsFJseiATBGR8I,104136
2
2
  pygpt_net/LICENSE,sha256=dz9sfFgYahvu2NZbx4C1xCsVn9GVer2wXcMkFRBvqzY,1146
3
- pygpt_net/__init__.py,sha256=pLdUj_gpfawbbZokZWi30n-6q-VE5rbPxskGtELl5fw,1373
3
+ pygpt_net/__init__.py,sha256=Et-nRWbU0RxmMqIaYmt7uqCkIUBmBV2NUW1sN5tX_eM,1373
4
4
  pygpt_net/app.py,sha256=26N6af9L88rTeYmYIgP9amoPJB-o3Sc5_MFHLNckbWk,21817
5
5
  pygpt_net/app_core.py,sha256=y7mHzH_sdUg2yoG_BKvMdJA6v5jCBSHhwcXqIZfxXs4,4169
6
6
  pygpt_net/config.py,sha256=SCps_FfwdrynVAgpn37Ci1qTN8BFC05IGl9sYIi9e0w,16720
@@ -17,10 +17,10 @@ pygpt_net/controller/agent/legacy.py,sha256=iOr1SD-A83Jgr6olZQMjhMr7UiQ7iWum0YND
17
17
  pygpt_net/controller/agent/llama.py,sha256=_sF4cAzCnBwGqY7VGqj-rbkNu-c1ye3w02d0mdXW6LQ,6115
18
18
  pygpt_net/controller/assistant/__init__.py,sha256=y5uoiH6oZki5Q3N1vt8szAJmxXRK_98RfSSXqVbDmQ0,513
19
19
  pygpt_net/controller/assistant/assistant.py,sha256=89ailohb1O84MiPKHAvwP5lYx5tKa8qlhPsmz_7Vqj0,11516
20
- pygpt_net/controller/assistant/batch.py,sha256=UQfuR9_6HQeNbPa-p7Dy3oLvIXa8XHHps85tCjNKzlI,20692
20
+ pygpt_net/controller/assistant/batch.py,sha256=7bqlaTlRo00Op6_rHSD6gVhTLIpfnIr1zps3JWzr2UE,20973
21
21
  pygpt_net/controller/assistant/editor.py,sha256=3hqxZqtHAKil9YehBbxw8AQrkaaB6I1l11DamGdPeoQ,15473
22
- pygpt_net/controller/assistant/files.py,sha256=98lOuanAVciuV8goJ446XavuRHVhq-C2sD5kGxruOpQ,14766
23
- pygpt_net/controller/assistant/store.py,sha256=Gs6ncH746UOY3pqPt3tU1sTWg1o4PZKOkfWDxyzc_Vk,15771
22
+ pygpt_net/controller/assistant/files.py,sha256=skLSxtLltAKAZdE87GmrUHOxyCwIQEDbuceU_rB7v0Y,14833
23
+ pygpt_net/controller/assistant/store.py,sha256=3-FL_47pVVaIdjpldODQHXQXawkMFOPna-2Dvgpz4YM,22647
24
24
  pygpt_net/controller/assistant/threads.py,sha256=323xGbyfYio32_yGLml34i2e9l2_jU8m_4vib5nxqbc,22803
25
25
  pygpt_net/controller/attachment/__init__.py,sha256=-5owOyszPze-YLQuTtFLQnSwEj_ftTxFwAP_3jPNpss,514
26
26
  pygpt_net/controller/attachment/attachment.py,sha256=sxtJiMSZBMXkewrIp2mbltILWUObkBMWiy5-pCiP8pE,20867
@@ -31,13 +31,13 @@ pygpt_net/controller/calendar/__init__.py,sha256=AyzoNqYgxV35CMEzoi_SCSsQh4ehg_W
31
31
  pygpt_net/controller/calendar/calendar.py,sha256=s55RkCFQPFzdDoQ2zp3kohlNdpiWxdSxQtsaROeiigw,4424
32
32
  pygpt_net/controller/calendar/note.py,sha256=AkOQ0FslaDkQbNwXBg95XhtPi3KzhKiFd374L8kTKBA,10169
33
33
  pygpt_net/controller/camera/__init__.py,sha256=dwmea8rz2QwdwKT160NYaaOoWucCWeyuecWkEXIcvio,510
34
- pygpt_net/controller/camera/camera.py,sha256=ZZvNfKg1W5G9jJAQEzO-zwaY0ltyYys-9W2emffUCFY,16519
34
+ pygpt_net/controller/camera/camera.py,sha256=R9iQdt4k-V7sK4kuLSVoD-QtrSWZbECmXsBpHsILnwo,16526
35
35
  pygpt_net/controller/chat/__init__.py,sha256=lx8FfN-Uoet5Y91xFxrA95N65vt_v99HcZd3K-YlYlc,508
36
- pygpt_net/controller/chat/attachment.py,sha256=hU1Slpop6rebGcLTwln-zL5SjXxhDNJUCEtKRVRRa50,20897
36
+ pygpt_net/controller/chat/attachment.py,sha256=GfZaRluyIAiMThtc7xedAl3X8ZOkEuAUrH9LaKptGVs,21034
37
37
  pygpt_net/controller/chat/audio.py,sha256=NiUecZDVzLYyNDBfidI4uGczI457WkCU0T9P8UEGvDA,2889
38
38
  pygpt_net/controller/chat/chat.py,sha256=3cOxTeub6X7ui3TxoP9rAi4GPuwUeOEcLd-TG5ogbc4,3003
39
39
  pygpt_net/controller/chat/command.py,sha256=eKFQzP0tehZ3S_G7RoZVMTebQFSjPIpix3t7vDB7MWc,5291
40
- pygpt_net/controller/chat/common.py,sha256=1cI4QtsH5UX187NFCd0C6L50PXsTapWF5Upu_gBEgEs,16436
40
+ pygpt_net/controller/chat/common.py,sha256=pnnPve8XAXJ951ArAy5Z3-cjfNX8MAqYFIcHWvOvl64,15847
41
41
  pygpt_net/controller/chat/files.py,sha256=QZAi1Io57EU7htKt9M5I9OoGAFX51OH2V5-NsJktOto,2838
42
42
  pygpt_net/controller/chat/handler/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
43
43
  pygpt_net/controller/chat/handler/stream_worker.py,sha256=2zn8tGYXLLTvml3Rd7kk2SR0RlIiZCYUOePpAuUUuSI,42215
@@ -62,7 +62,7 @@ pygpt_net/controller/config/field/dictionary.py,sha256=m3nSL8xAp0NRnr_rVmTZA5uTQ
62
62
  pygpt_net/controller/config/field/input.py,sha256=Dx04ivrwM1KqA41uHYNGzwq1c7O-zPnU_NI-3I45hPY,3992
63
63
  pygpt_net/controller/config/field/slider.py,sha256=dYbICd3ID-aLlc2a-bvFgWS4jceVz2UliTQKYy7Pl1Q,4560
64
64
  pygpt_net/controller/config/field/textarea.py,sha256=Ln545IHzXBeFIjnfMIpmlUr-V3wNYjw4qGiz4NYRw34,2796
65
- pygpt_net/controller/config/placeholder.py,sha256=SCspRLmT3r20hNvVfdsGVma3VsFMhgTdhtV7FTXu4ps,16145
65
+ pygpt_net/controller/config/placeholder.py,sha256=-PWPNILPVkxMsY64aYnKTWvgUIvx7KA2Nwfd2LW_K30,16711
66
66
  pygpt_net/controller/ctx/__init__.py,sha256=0wH7ziC75WscBW8cxpeGBwEz5tolo_kCxGPoz2udI_E,507
67
67
  pygpt_net/controller/ctx/common.py,sha256=1jjRfEK1S4IqnzEGg1CIF-QqSN_83NLpaVtfB610NcM,6592
68
68
  pygpt_net/controller/ctx/ctx.py,sha256=1Vdkqv0WGgs9ufE3UK6YAh5_7yG62u6uUKP1Su3bkU0,39216
@@ -71,7 +71,7 @@ pygpt_net/controller/ctx/summarizer.py,sha256=UNsq-JTARblGNT97uSMpZEVzdUuDJ8YA2j
71
71
  pygpt_net/controller/debug/__init__.py,sha256=dOJGTICjvTtrPIEDOsxCzcOHsfu8AFPLpSKbdN0q0KI,509
72
72
  pygpt_net/controller/debug/debug.py,sha256=FHAz2sd75ucDtU3UN9FtZsW9YpC_ohkvrAj1N9cQet8,8879
73
73
  pygpt_net/controller/dialogs/__init__.py,sha256=jI2WisG3lzbeyf__1Y7g7wWrxlr1QnYBDDt4t_3eeYk,513
74
- pygpt_net/controller/dialogs/confirm.py,sha256=syeXN_a5v2IAl-QliGaSLxYKqeR5rCsz8Mg_N-73uME,16734
74
+ pygpt_net/controller/dialogs/confirm.py,sha256=PgVOJS31quY24Fs9XhFplcMnKweKbAxGWDKSjlBgLJU,16860
75
75
  pygpt_net/controller/dialogs/debug.py,sha256=v6E85vyCwfaDG9XZysxhBjRwlrDkbYC-NxUnDamNRpk,5980
76
76
  pygpt_net/controller/dialogs/dialogs.py,sha256=sJHyZxkAn9QKTegUqx_xETesN2ecMBkrtf-VsCubr2w,1008
77
77
  pygpt_net/controller/dialogs/info.py,sha256=mjQdj6cbTB09aIul5FChsnJsQoeqsRUQpKc3rP7lFeM,3757
@@ -99,7 +99,7 @@ pygpt_net/controller/launcher/launcher.py,sha256=zY2yIrSd7y5dhVtMJExKxHI4JhD1--P
99
99
  pygpt_net/controller/layout/__init__.py,sha256=0pxxzjAUa1hS27d80Q0SgDV1Uzs7A9mZrUxb1cs-oHs,510
100
100
  pygpt_net/controller/layout/layout.py,sha256=HlbfGK-_HXQrifSh5tWpPtu5JzWN2fktVmh8ofBDMfQ,13058
101
101
  pygpt_net/controller/media/__init__.py,sha256=N1UnDuteomgsBxRmVUd1Hm6UeGbHESYY9SowOhJj-YI,513
102
- pygpt_net/controller/media/media.py,sha256=myslmB-2E7vpQE8DyFApwkrPNu5ApWQZSakZ2BLPTEw,3886
102
+ pygpt_net/controller/media/media.py,sha256=Fox4li3HRGL0wI9yJ6WyaiFSBm5znuumET7roDnaJtc,4062
103
103
  pygpt_net/controller/mode/__init__.py,sha256=1Kcz0xHc2IW_if9S9eQozBUvIu69eLAe7T-Re2lJxhk,508
104
104
  pygpt_net/controller/mode/mode.py,sha256=WdaNA7-n6mTkkRkKIMUltxBC_vRAwWzkUEt9rOpIRBM,7840
105
105
  pygpt_net/controller/model/__init__.py,sha256=mQXq9u269D8TD3u_44J6DFFyHKkaZplk-tRFCssBGbE,509
@@ -110,8 +110,8 @@ pygpt_net/controller/notepad/__init__.py,sha256=ZbMh4D6nsGuI4AwYMdegfij5ubmUznEE
110
110
  pygpt_net/controller/notepad/notepad.py,sha256=Mn3XOrNq8_7EHq3Jf9fMyJ6YzHRawczRXfoZbn2f7L4,11155
111
111
  pygpt_net/controller/painter/__init__.py,sha256=ZNZE6YcKprDPqLK5kiwtcJVvcW3H-YkerFW0PwbeQ1Y,511
112
112
  pygpt_net/controller/painter/capture.py,sha256=X3TqnNypxT_wngkQ4ovfS9glQwoGHyM-peR5aLJQGvk,6666
113
- pygpt_net/controller/painter/common.py,sha256=gTRCIcmAsgYhueUWNfEIwIJo-40YBVhoNSksOY1Oj34,6395
114
- pygpt_net/controller/painter/painter.py,sha256=1Ekmr2a3irDkSb2wowiPXhW59rfdZOW1tdbxeubph-k,2747
113
+ pygpt_net/controller/painter/common.py,sha256=jOWrgvNCrF7Jm6uVIVRmuMAY5WINVV0XSqu6c3Sf1nw,15451
114
+ pygpt_net/controller/painter/painter.py,sha256=t81axkIUpaOqDjKHxrFJdjKOW-cpyPphYanQHwnLkww,2370
115
115
  pygpt_net/controller/plugins/__init__.py,sha256=iocY37De1H2Nh7HkC7ZYvUus2xzcckslgr5a4PwtQII,511
116
116
  pygpt_net/controller/plugins/plugins.py,sha256=DysPDatuIi8t1k-nnUfy8tLBFBberTAuL8YKNVXXZd0,14917
117
117
  pygpt_net/controller/plugins/presets.py,sha256=8EsEwpU2MjWMQu1kcY4JTcyqqN8pjBrcxA2uW2tFU_A,11674
@@ -169,7 +169,7 @@ pygpt_net/core/agents/runners/openai_workflow.py,sha256=9jajowBjD_LKmd417e5kkl9h
169
169
  pygpt_net/core/agents/tools.py,sha256=UW5-3q-cPpmx_FlDyuF2qymbgIJRmkklNmng3IokEUM,22116
170
170
  pygpt_net/core/assistants/__init__.py,sha256=FujLn0ia5S3-7nX-Td_0S5Zqiw6Yublh58c4Di7rRgY,514
171
171
  pygpt_net/core/assistants/assistants.py,sha256=JVseBSjDJh9vJYjxoZVwU93EFTBJk_rUtRh_Ml550H0,4391
172
- pygpt_net/core/assistants/files.py,sha256=bJLfYJ7eCOk4ZgZv01Ndhi45_wGU270VDQawDnkXRGg,10185
172
+ pygpt_net/core/assistants/files.py,sha256=A20fO1q-PJwSuh3NrEWeOila88QzRc6ECvqIU6AFKj8,10708
173
173
  pygpt_net/core/assistants/store.py,sha256=6019iiPdPehf-Klpft0Vyw4ieYQyZzin-l684UA9Fqo,8239
174
174
  pygpt_net/core/attachments/__init__.py,sha256=3bka_IoE6AoExlhFqDxcTaD6Uf1wM6VZzy_YX8Ry4f0,515
175
175
  pygpt_net/core/attachments/attachments.py,sha256=bUqvfPqlpdXiGf3GvS1kTE45A0Q1Eo3kpUKypnRwDpk,12919
@@ -204,7 +204,8 @@ pygpt_net/core/bridge/worker.py,sha256=9PsUeuGyM_RY6v6MNroFLEVyC4mt-KABzwAmJ6cAJ
204
204
  pygpt_net/core/calendar/__init__.py,sha256=AyzoNqYgxV35CMEzoi_SCSsQh4ehg_Wu_2nsK3xsbyg,512
205
205
  pygpt_net/core/calendar/calendar.py,sha256=ao9kQk6Xjse95m1TbL1Mlbo1k1Q8D9eGc10L-71G9TY,7227
206
206
  pygpt_net/core/camera/__init__.py,sha256=cny2EajFmwkFdo_pUkErJY4BhpyHp1kJVDcTCOOvkjY,510
207
- pygpt_net/core/camera/camera.py,sha256=4HbswGgP7s_GAHOdc7oP_Xivs6NvxenVO00aUM8FYxM,4423
207
+ pygpt_net/core/camera/camera.py,sha256=8-PZN3UEnhMQfT2whI4QvN_Qd8AYnkMWk4oo6cKtDEc,2263
208
+ pygpt_net/core/camera/worker.py,sha256=z2qXyslWh4-0gixJZI6qcmIFutZcLD55P2dTzAYbNaU,14063
208
209
  pygpt_net/core/chain/__init__.py,sha256=S-VLEzPrcT0l9YeiC2cYZkPBSnX4ZFHZeFqIbB43Gz8,509
209
210
  pygpt_net/core/chain/chain.py,sha256=C7Xm88bRblcyM4e0wZMFG-6SQCdw_frXN9kqnWzce60,3541
210
211
  pygpt_net/core/chain/chat.py,sha256=5LxPWHkocjrIAAwrdDH1ss6knAnh4_owfbHPsOQYSws,5238
@@ -263,7 +264,7 @@ pygpt_net/core/filesystem/opener.py,sha256=8EkieR_FwSz0HBykLcmV8TEw8Bn0e7WHqqiPT
263
264
  pygpt_net/core/filesystem/packer.py,sha256=9CmQgq-lja2QGtc0JFqh197mLLViJ7TDPc8fVWTok1w,2568
264
265
  pygpt_net/core/filesystem/parser.py,sha256=NqFwNbF8QJai34Oz9WFtAWZa6uPx6AfuUgM2ZdAOgbI,2960
265
266
  pygpt_net/core/filesystem/types.py,sha256=1HFubxAHYup_SLQ7SlR5EvZb3KgVyd8K8vBRUkTcqaA,3458
266
- pygpt_net/core/filesystem/url.py,sha256=A97SXzodjVKQR26xwUwUcRz1OuZIYzrGiBestdtQ8OA,3341
267
+ pygpt_net/core/filesystem/url.py,sha256=PAhO73dlw_jBu7HN5RKHSVbbtrXTR4FoU_S1tD7dGvU,3528
267
268
  pygpt_net/core/history/__init__.py,sha256=OVtJM8Cf-9WV9-WmB6x__qB3QK4ZGaYzjpl4Fk8RdWM,511
268
269
  pygpt_net/core/history/history.py,sha256=PDE5Ut03mEgY9YPLZjqrimKQAyxoE7itViuqFV-VQf0,3123
269
270
  pygpt_net/core/idx/__init__.py,sha256=8-HStPMODmgzC3dBaJB6MDqGJHCHnKxNdt30Vzyu3cM,507
@@ -337,7 +338,7 @@ pygpt_net/core/render/plain/helpers.py,sha256=tWbdJZBfjnuHLAUDVYLTfv3Vt-h7XN1tg6
337
338
  pygpt_net/core/render/plain/pid.py,sha256=Pz3v1tnLj-XI_9vcaVkCf9SZ2EgVs4LYV4qzelBMoOg,1119
338
339
  pygpt_net/core/render/plain/renderer.py,sha256=mb1d6UBbuOs_fotG9fZPdBk95i8n0UMCJNnF4an8E0o,15357
339
340
  pygpt_net/core/render/web/__init__.py,sha256=istp5dsn6EkLEP7lOBeDb8RjodUcWZqjcEvTroaTT-w,489
340
- pygpt_net/core/render/web/body.py,sha256=hKPbWSe0IBzzqvncNvv4qAOelbX-yBSrwHTY5VveY7w,56581
341
+ pygpt_net/core/render/web/body.py,sha256=NM3ha_HWK-rC7lBl4OtxRzYyKetVB2iGUUSOPyqKiRs,59762
341
342
  pygpt_net/core/render/web/helpers.py,sha256=KAmUNUuIk8gArCMkyWcK_Ak0uxJOuIULt5eOA-jnjJM,5757
342
343
  pygpt_net/core/render/web/parser.py,sha256=pDFc9Tf8P-jvrDilXyT1fukcQHbixHRJ9Dn9hF10Gko,12892
343
344
  pygpt_net/core/render/web/pid.py,sha256=pXBdPb8hw_aZS2Rtz3pLBpuybpXrzoqwYAFWBal9bLE,3685
@@ -351,7 +352,7 @@ pygpt_net/core/tabs/tabs.py,sha256=qppWQsyBDZTpi-D6SbPZaFOuEKzjrGn_dPLfilGvKFE,3
351
352
  pygpt_net/core/text/__init__.py,sha256=6aEjrckL5kWVfyxpi5mVpSPB6XWV83e_30g_V5meL1M,19
352
353
  pygpt_net/core/text/finder.py,sha256=NBzYUE_Av3oZH8RlCrSe6EeLcHpfz79WJV_vSK0P1jI,6656
353
354
  pygpt_net/core/text/text.py,sha256=WyQdXx4TpBGgr3XU6AhPILvhaipB57S2XtIs8FYif84,3217
354
- pygpt_net/core/text/utils.py,sha256=l452MLRHRMoMihQ8XRwf4yJApzSxNl-njon_0_xRP7M,4542
355
+ pygpt_net/core/text/utils.py,sha256=YjcGwnWsp7vmx0wcagO2aZkDwP8HMWLrewp93fjl75U,4637
355
356
  pygpt_net/core/text/web_finder.py,sha256=8Yex-Kmnz8KyStF0-koNC-0392SkUIsy0nRYLExlyHM,6600
356
357
  pygpt_net/core/tokens/__init__.py,sha256=rSSdzmBL-LmMUv14hodHi5b1HYcm9UU8DEbD7owk4BI,510
357
358
  pygpt_net/core/tokens/tokens.py,sha256=M-97eNqXqnlgoDdFYTydifF4VhStCbO5dSt9PoBCTpI,12354
@@ -382,8 +383,8 @@ pygpt_net/css_rc.py,sha256=i13kX7irhbYCWZ5yJbcMmnkFp_UfS4PYnvRFSPF7XXo,11349
382
383
  pygpt_net/data/audio/click_off.mp3,sha256=aNiRDP1pt-Jy7ija4YKCNFBwvGWbzU460F4pZWZDS90,65201
383
384
  pygpt_net/data/audio/click_on.mp3,sha256=qfdsSnthAEHVXzeyN4LlC0OvXuyW8p7stb7VXtlvZ1k,65201
384
385
  pygpt_net/data/audio/ok.mp3,sha256=LTiV32pEBkpUGBkKkcOdOFB7Eyt_QoP2Nv6c5AaXftk,32256
385
- pygpt_net/data/config/config.json,sha256=8RqLNsZOaZhrY-SS2AhUt3iZBP7Dkp_NtcWERAvykCs,30469
386
- pygpt_net/data/config/models.json,sha256=DJyYEVPcKxE842A9-GDkcBA7NgOqPZxSqtvEBbJzfbI,115756
386
+ pygpt_net/data/config/config.json,sha256=Jnz6iQ17hJ134uZV9jmW8_0aa-4as1Hc7SlkCuJzJDE,30217
387
+ pygpt_net/data/config/models.json,sha256=hKMXwMI0P4svzGm1qLucvIf0HET2LIJ343BsZrBXfgw,115730
387
388
  pygpt_net/data/config/modes.json,sha256=IpjLOm428_vs6Ma9U-YQTNKJNtZw-qyM1lwhh73xl1w,2111
388
389
  pygpt_net/data/config/presets/agent_code_act.json,sha256=GYHqhxtKFLUCvRI3IJAJ7Qe1k8yD9wGGNwManldWzlI,754
389
390
  pygpt_net/data/config/presets/agent_openai.json,sha256=bpDJgLRey_effQkzFRoOEGd4aHUrmzeODSDdNzrf62I,730
@@ -418,7 +419,7 @@ pygpt_net/data/config/presets/current.vision.json,sha256=x1ll5B3ROSKYQA6l27PRGXU
418
419
  pygpt_net/data/config/presets/dalle_white_cat.json,sha256=esqUb43cqY8dAo7B5u99tRC0MBV5lmlrVLnJhTSkL8w,552
419
420
  pygpt_net/data/config/presets/joke_agent.json,sha256=R6n9P7KRb0s-vZWZE7kHdlOfXAx1yYrPmUw8uLyw8OE,474
420
421
  pygpt_net/data/config/presets/joke_expert.json,sha256=jjcoIYEOaEp8kLoIbecxQROiq4J3Zess5w8_HmngPOY,671
421
- pygpt_net/data/config/settings.json,sha256=ZIdrYLhMbeqVdz_bk4ch21Jj2jNG13V4SYQAAFomkHM,77991
422
+ pygpt_net/data/config/settings.json,sha256=uD3K0gQqc38SQy5ecYLdZMoEyTrmiviwwzGyNuH1DTU,78126
422
423
  pygpt_net/data/config/settings_section.json,sha256=pcfOFk0_eIRaa4nKRxhSVzDXe531YxWJgVx5rLV0J9U,1150
423
424
  pygpt_net/data/css/fix_windows.css,sha256=Mks14Vg25ncbMqZJfAMStrhvZmgHF6kU75ohTWRZeI8,664
424
425
  pygpt_net/data/css/fix_windows.dark.css,sha256=7hGbT_qI5tphYC_WlFpJRDAcmjBb0AQ2Yc-y-_Zzf2M,161
@@ -1645,14 +1646,14 @@ pygpt_net/data/js/katex/fonts/KaTeX_Typewriter-Regular.woff2,sha256=cdUX1ngneHz6
1645
1646
  pygpt_net/data/js/katex/katex.min.css,sha256=lVaKnUaQNG4pI71WHffQZVALLQF4LMZEk4nOia8U9ow,23532
1646
1647
  pygpt_net/data/js/katex/katex.min.js,sha256=KLASOtKS2x8pUxWVzCDmlWJ4jhuLb0vtrgakbD6gDDo,276757
1647
1648
  pygpt_net/data/languages.csv,sha256=fvtER6vnTXFHQslCh-e0xCfZDQ-ijgW4GYpOJG4U7LY,8289
1648
- pygpt_net/data/locale/locale.de.ini,sha256=X4Z-6V0YsTWhJ4LOVIFhKO8zNjrdvp8dYRZlW2VSECI,104960
1649
- pygpt_net/data/locale/locale.en.ini,sha256=MRrOqLrfvL_aTb1cDpiWd-6ezracRwIDv6PUH_58K28,97251
1650
- pygpt_net/data/locale/locale.es.ini,sha256=7bR5a7m8UknAyp3Yt-DsjHV3uCCUwg-xTs7M4givXis,105620
1651
- pygpt_net/data/locale/locale.fr.ini,sha256=LuZoap8jeLsyntzbWJGDOWAIQDi9lNEPaLkZ6NjFL2c,108408
1652
- pygpt_net/data/locale/locale.it.ini,sha256=9VHb2dLKEpBYaXD4BiRuqeeWJHvUOCvRbPaCHa_WUFk,103350
1653
- pygpt_net/data/locale/locale.pl.ini,sha256=IJfOAlcC2TNA37eSZF2C6S7boCgpsHbrUDY-rFfFMx4,102927
1654
- pygpt_net/data/locale/locale.uk.ini,sha256=pfmpVRjYQh4pxpQCY-orkX1UIwpnD-J_RbDTByVYZX8,143879
1655
- pygpt_net/data/locale/locale.zh.ini,sha256=9S5GIBluVO1krwAiKdOQWyLPcwDCQUXVQzwueR2ZdWE,92045
1649
+ pygpt_net/data/locale/locale.de.ini,sha256=hjiIUlCbLk3LiLESJHTLuzThW2sVry4Uhg4vNqopt8U,105027
1650
+ pygpt_net/data/locale/locale.en.ini,sha256=TDZXEbmy4N9TgMWw_1pGASIlDEzu7GPACiUjFf0RAAA,97439
1651
+ pygpt_net/data/locale/locale.es.ini,sha256=V7ozh8vhtXdOz6Y5PW_Lt6jZfv_uyCmorv2qfnorKrg,105676
1652
+ pygpt_net/data/locale/locale.fr.ini,sha256=rmL9d98ByODCcvM5yUwqGHmPQ8yYzclkrqENTTIdWUk,108446
1653
+ pygpt_net/data/locale/locale.it.ini,sha256=7HmsSIOxYcQK0SCZDiuVnHu0ExGhyfYdSHWZFtEE66k,103422
1654
+ pygpt_net/data/locale/locale.pl.ini,sha256=U55ZIFKDFRm8-T0hNJiGSP-WkKLLjoJtvCCubPKQD6o,103027
1655
+ pygpt_net/data/locale/locale.uk.ini,sha256=sWeXl5DfRj3sBHp-CyJkNEJHX_VzHaKUAVmP6uhPjmM,143885
1656
+ pygpt_net/data/locale/locale.zh.ini,sha256=zeIVaIhDSLvjPJn0DsuoHo74bjAXv75iyWzk9kqNO_k,92109
1656
1657
  pygpt_net/data/locale/plugin.agent.de.ini,sha256=BY28KpfFvgfVYJzcw2o5ScWnR4uuErIYGyc3NVHlmTw,1714
1657
1658
  pygpt_net/data/locale/plugin.agent.en.ini,sha256=HwOWCI7e8uzlIgyRWRVyr1x6Xzs8Xjv5pfEc7jfLOo4,1728
1658
1659
  pygpt_net/data/locale/plugin.agent.es.ini,sha256=bqaJQne8HPKFVtZ8Ukzo1TSqVW41yhYbGUqW3j2x1p8,1680
@@ -1839,7 +1840,7 @@ pygpt_net/fonts_rc.py,sha256=EVwgIVDq-Sudy9DYpHbzuhQ_jd9pUuQ8e3-nycPzj3A,3238283
1839
1840
  pygpt_net/icons.qrc,sha256=7etxjwGtJm61IfTFIloyO7yonX06Jc1ZoSniGUFTho4,14981
1840
1841
  pygpt_net/icons_rc.py,sha256=FWRllE_kudX-jI4lOto-Pvf5NDCFDrpAxuQgXgldg6k,92180
1841
1842
  pygpt_net/item/__init__.py,sha256=jQQgG9u_ZLsZWXustoc1uvC-abUvj4RBKPAM30-f2Kc,488
1842
- pygpt_net/item/assistant.py,sha256=65NZlvvR2VHWi6ZbPGi46qX0n0iJpbGHF2AxWXAIQlU,9588
1843
+ pygpt_net/item/assistant.py,sha256=zQcTIXyivZ5PWjEf8rKZIQqKPOGqwMsspU_g4RWxlRg,9986
1843
1844
  pygpt_net/item/attachment.py,sha256=Wo-36L_R-P--JjDEpnpbaYo3vuIqr1s82m5rman9h28,2818
1844
1845
  pygpt_net/item/calendar_note.py,sha256=EBhAAS09E5tIO3XhW_iA_wofSUywLWlYtiiMJJzVc3g,2114
1845
1846
  pygpt_net/item/ctx.py,sha256=wvK7hipdqUht7HZ8o0XBzB3CE4Ef3KOcypA6L49bcVI,21055
@@ -2044,7 +2045,7 @@ pygpt_net/provider/agents/openai/evolve.py,sha256=hBsYIokVCWLWB0syHoLQqWgEiEfR9J
2044
2045
  pygpt_net/provider/agents/openai/supervisor.py,sha256=cUsVns-ZZ7kK78SNcHRt3UgfePjB6NWCOrauSfn_BnI,13229
2045
2046
  pygpt_net/provider/api/__init__.py,sha256=L8086E7nrFP_rLRRTpQfR46cHUxsoR5giHjVBAX1xps,879
2046
2047
  pygpt_net/provider/api/anthropic/__init__.py,sha256=YHUOyuaPp74t3MWgDVdcpEutsGta3Iasw940-S4uwkk,1975
2047
- pygpt_net/provider/api/google/__init__.py,sha256=F-MUCWTZmwWhgvFeyQE_FylJ-oMKhV56JHudEm33PQk,11786
2048
+ pygpt_net/provider/api/google/__init__.py,sha256=u9ZZwqODrA9PRXr3CJ8yeYvN2jkdpaYyFCFJ45fB440,12144
2048
2049
  pygpt_net/provider/api/google/audio.py,sha256=Ymq_Q3WofC-8TfYOGu5NmNuRW_omvl8UCS3Q0WEBxnA,4149
2049
2050
  pygpt_net/provider/api/google/chat.py,sha256=eLDh0k1DtDHZ7V1cfg0m75uICQffAKBH6IReHmuxy_Y,23057
2050
2051
  pygpt_net/provider/api/google/image.py,sha256=OSu4y5q36bVVirnw0Uh5k9PqmWHiXDuS8Api_MKSwt0,16794
@@ -2074,7 +2075,7 @@ pygpt_net/provider/api/openai/realtime/client.py,sha256=4_Evnlb0vobuNbJwNEej1oL9
2074
2075
  pygpt_net/provider/api/openai/realtime/realtime.py,sha256=tStZJwBHhzyp3yejLsr58LtNwATqpCgyCtvDM5ZqTSA,7424
2075
2076
  pygpt_net/provider/api/openai/remote_tools.py,sha256=WUoN5XrafwyLz8s58pslOE1YD9EViGPhQOzN24_n1gM,5677
2076
2077
  pygpt_net/provider/api/openai/responses.py,sha256=tfDbcnsG5rhdr8Wxlv9jjJjDptaiy46nhfg2lpHfqI4,29678
2077
- pygpt_net/provider/api/openai/store.py,sha256=mjhuc7jO6zikEkKox3fxHZ4lbPrvkntZ__No8AAu7Ag,17279
2078
+ pygpt_net/provider/api/openai/store.py,sha256=8H2SQH9wU9Yoeai6gqajbJ1N33CSv26IA5trqfWkJtQ,18692
2078
2079
  pygpt_net/provider/api/openai/summarizer.py,sha256=vuJz6mj9F9Psiat0d-fn1zNGgXc-WkXJyi0jrvijO6E,2978
2079
2080
  pygpt_net/provider/api/openai/tools.py,sha256=Oh9mnGIXfnwoRTx6f-9ZItD-v3loyr4OtcvhmgroyrY,3146
2080
2081
  pygpt_net/provider/api/openai/utils.py,sha256=O0H0EPb4lXUMfE1bFdWB56yuWLv7M5owVIGWRyDDv-E,855
@@ -2181,7 +2182,7 @@ pygpt_net/provider/llms/anthropic.py,sha256=rK0Gy5E_wzigc9GdkESMLCVyOACzp5YjVEfN
2181
2182
  pygpt_net/provider/llms/azure_openai.py,sha256=QxgK3KeqEEa38B-ezro6AJyd4D4bR9d8E3fW0a6Mc0Q,3812
2182
2183
  pygpt_net/provider/llms/base.py,sha256=D6GKahfZNUzihkCo7gQYGzkHG6XH8d_P5Y5iAnLboXM,6359
2183
2184
  pygpt_net/provider/llms/deepseek_api.py,sha256=Jljj6Ce123q3eCrIizfFPQIsf47OzRaBK4jIbNZdLzg,3267
2184
- pygpt_net/provider/llms/google.py,sha256=yPYQnEtauid1zVBuY6lllAisuiVThBZKZfLz7U01bvc,3422
2185
+ pygpt_net/provider/llms/google.py,sha256=NOjoZbnmvhDkuR0cRW4__u0OS6ME81ExLm-yp0eFyKo,3574
2185
2186
  pygpt_net/provider/llms/hugging_face.py,sha256=qWyGVqosDw9WVsKbZc5IG7j4jjfVPeCKr6gPAn8Tyus,1800
2186
2187
  pygpt_net/provider/llms/hugging_face_api.py,sha256=oY5dE-9rFv8Cd6Hv8ZriHvL46ZrT3KyvJFuLokNaNRY,3402
2187
2188
  pygpt_net/provider/llms/hugging_face_router.py,sha256=db_P5DktU0SNObKqumaFfzEcyR1Wn7f9FwoLVlN4u2U,4477
@@ -2332,7 +2333,7 @@ pygpt_net/ui/dialog/__init__.py,sha256=1SGZ5i2G1UnKQpyj_HYkN0t-HLepD6jU_ICw1waax
2332
2333
  pygpt_net/ui/dialog/about.py,sha256=6OCjEWJD10Fwz4ajx6qLh7D4oR0TsgDroczhneyGKEw,7072
2333
2334
  pygpt_net/ui/dialog/applog.py,sha256=jOevcc3-DMasNyWEtNB7MrXZ8TEcxcPEUCzgGqT1VaA,5140
2334
2335
  pygpt_net/ui/dialog/assistant.py,sha256=WJJvv9vSTd8sJNiWW5sVQb5YqpIvWgQH1eMTHvHfGAU,7614
2335
- pygpt_net/ui/dialog/assistant_store.py,sha256=F1fE3L2AnWT0IwRKeE7Z4eSXOIQrUY0t5jQ5ZORSfB8,22825
2336
+ pygpt_net/ui/dialog/assistant_store.py,sha256=Tr9NWcJZQSK8mqTMKLz-EEX_NyFNaBFt9SKu9JaCvFY,23032
2336
2337
  pygpt_net/ui/dialog/changelog.py,sha256=2ioUGq2gC1ANN5M6SFsnfIGMVbUt90IQ9aw9n7GqtMQ,1765
2337
2338
  pygpt_net/ui/dialog/create.py,sha256=YEsroy-uimsP29RPcewkOV5vytNEZoUFa21G3WreIHM,973
2338
2339
  pygpt_net/ui/dialog/db.py,sha256=N3Fn1ppeqrdLGGVgKbtLEUWfrY1IwvdtlVA5owMiNdU,18493
@@ -2365,7 +2366,7 @@ pygpt_net/ui/layout/chat/attachments_uploaded.py,sha256=MZA0aFOm9iKbYc6NrM7Ivg2i
2365
2366
  pygpt_net/ui/layout/chat/calendar.py,sha256=hE9Gl0h5kPXe0OUkimRfys2aFti0Y4wzKxhh1gyGnjs,6578
2366
2367
  pygpt_net/ui/layout/chat/chat.py,sha256=qB4RwT9N0eCtrbyasgO0Cxvcm2nXACck6MflGAoQqK0,2221
2367
2368
  pygpt_net/ui/layout/chat/explorer.py,sha256=Jg6aK5qTCTNgb4EXr-zeZXSexARQSzn4W8unqV1MGe8,1358
2368
- pygpt_net/ui/layout/chat/input.py,sha256=0EHzkZiZSzWXUuP_CSS5Fz1Ykx_TOgtEBMMipy1pjg0,9965
2369
+ pygpt_net/ui/layout/chat/input.py,sha256=Wnb29-1MQPD4AUU4CZN4vz6tba_L6tgIyJX-Xr4cgxY,9969
2369
2370
  pygpt_net/ui/layout/chat/markdown.py,sha256=hjYY8Da1z0IZZD086_csMcDY1wwagpuQTDZ-XfgeNgs,18656
2370
2371
  pygpt_net/ui/layout/chat/output.py,sha256=b1qY1C2Fs_k3fOA47JnkHXfvRDdptHbEZpMF6aiwA8g,7280
2371
2372
  pygpt_net/ui/layout/chat/painter.py,sha256=fOoGvVHnKpkpilK-3ZgZh6kCh9uxINNtsCT8NUtOarQ,5761
@@ -2446,7 +2447,7 @@ pygpt_net/ui/widget/dialog/update.py,sha256=YGUouxuEqvO8rkjI52F7wG4R8OgqcpJKB1FV
2446
2447
  pygpt_net/ui/widget/dialog/url.py,sha256=7I17Pp9P2c3G1pODEY5dum_AF0nFnu2BMfbWTgEES-M,8765
2447
2448
  pygpt_net/ui/widget/dialog/workdir.py,sha256=D-C3YIt-wCoI-Eh7z--Z4R6P1UvtpkxeiaVcI-ycFck,1523
2448
2449
  pygpt_net/ui/widget/draw/__init__.py,sha256=oSYKtNEGNL0vDjn3wCgdnBAbxUqNGIEIf-75I2DIn7Q,488
2449
- pygpt_net/ui/widget/draw/painter.py,sha256=iebz0L7U8eMMzw8FNtFaYe-2mXil8BkXcGRFmW7MCuw,10871
2450
+ pygpt_net/ui/widget/draw/painter.py,sha256=v3GUfhAY9pwHsVkb8-eEefRtY3XeGxvEsCOSZhf5Df8,27125
2450
2451
  pygpt_net/ui/widget/element/__init__.py,sha256=8HT4tQFqQogEEpGYTv2RplKBthlsFKcl5egnv4lzzEw,488
2451
2452
  pygpt_net/ui/widget/element/button.py,sha256=rhy8_RVHRV8xl0pegul31z9fNBjjIAi5Nd0hHGF6cF8,4393
2452
2453
  pygpt_net/ui/widget/element/checkbox.py,sha256=qyX6T31c3a8Wb8B4JZwhuejD9SUAFSesdIjZdj4tv8I,2948
@@ -2487,7 +2488,7 @@ pygpt_net/ui/widget/option/__init__.py,sha256=8HT4tQFqQogEEpGYTv2RplKBthlsFKcl5e
2487
2488
  pygpt_net/ui/widget/option/checkbox.py,sha256=duzgGPOVbHFnWILVEu5gDUa6sHeDOvQaaj9IsY-HbU8,3954
2488
2489
  pygpt_net/ui/widget/option/checkbox_list.py,sha256=j3lks2qPaZZdfZEV9EbN5kH8gEquVZFUDF_rq7uxjn0,5770
2489
2490
  pygpt_net/ui/widget/option/cmd.py,sha256=Ii_i9hR4oRmG4-TPZ-FHuTv3I1vL96YLcDP2QSKmAbI,5800
2490
- pygpt_net/ui/widget/option/combo.py,sha256=H_1Dkc-rrFFVXf1Mr6YSijOj1Ybt655gOxGGOOq2BsU,5406
2491
+ pygpt_net/ui/widget/option/combo.py,sha256=2hmiUcfDYLiP0WFlCSbLTIIQUq9HB2u17cIzXfeUk1I,5582
2491
2492
  pygpt_net/ui/widget/option/dictionary.py,sha256=67F-BGOMuH-MCEvdvE-cVqkyE8xR8euHH5zSkhRqUco,13517
2492
2493
  pygpt_net/ui/widget/option/input.py,sha256=xeTbKOO6JFRb1seZCJQTtvehW1uSJx-l8mYMf-HqA4E,9574
2493
2494
  pygpt_net/ui/widget/option/prompt.py,sha256=SgRd0acp13_c19tWjYYChcGgAwik9tsZKKsX1Ciqgp4,2818
@@ -2507,7 +2508,7 @@ pygpt_net/ui/widget/textarea/create.py,sha256=f4SrAW-2hjkKYIPrwVliSYH-LkgsQP8G13
2507
2508
  pygpt_net/ui/widget/textarea/editor.py,sha256=qCMFJk8T7f4u3TFYKi02r2kOFSzzwrasWm_zSMsisPE,5153
2508
2509
  pygpt_net/ui/widget/textarea/find.py,sha256=fQu6t-_LTZGFRNCkezywtMVsL-DocIkGBR_HbRFq61g,1534
2509
2510
  pygpt_net/ui/widget/textarea/html.py,sha256=4DOnUYtHBhN-6X5w13GK-ceAAvTPd8M4mH_N-c3L_h0,12344
2510
- pygpt_net/ui/widget/textarea/input.py,sha256=-to_Etv3W-8nxaUFEsRM_g1Z9Kj3HwbPkeax21I34mo,23799
2511
+ pygpt_net/ui/widget/textarea/input.py,sha256=TNJxS5y2-ih8uzoKR1IZjftByrSGbI0JCFSEH6URO0g,35392
2511
2512
  pygpt_net/ui/widget/textarea/name.py,sha256=vcyAY_pJWJoS_IJqdJjhIeDSniTL9rfpt8aaobWNFVY,1132
2512
2513
  pygpt_net/ui/widget/textarea/notepad.py,sha256=Yl2fvJyRzADxvZe0B44QG8E15LdZtPjwGcdM2iIcgu4,9858
2513
2514
  pygpt_net/ui/widget/textarea/output.py,sha256=krWta3GHwdlPOqcxLln150bo7iUOtbFL_yJzMucGOFU,6246
@@ -2518,8 +2519,8 @@ pygpt_net/ui/widget/textarea/web.py,sha256=cqs5i67bD19_BNgcYL7NXlwYBei4UYSL_IYPZ
2518
2519
  pygpt_net/ui/widget/vision/__init__.py,sha256=8HT4tQFqQogEEpGYTv2RplKBthlsFKcl5egnv4lzzEw,488
2519
2520
  pygpt_net/ui/widget/vision/camera.py,sha256=v1qEncaZr5pXocO5Cpk_lsgfCMvfFigdJmzsYfzvCl0,1877
2520
2521
  pygpt_net/utils.py,sha256=o3V8NLcTQm8XkP6n_M88jVbI7OjnryRmsvnvf7K136A,9100
2521
- pygpt_net-2.6.32.dist-info/LICENSE,sha256=rbPqNB_xxANH8hKayJyIcTwD4bj4Y2G-Mcm85r1OImM,1126
2522
- pygpt_net-2.6.32.dist-info/METADATA,sha256=srggNHv8vFYh0vJrvWzJtHHx25Dq9Pf6Ska4i1marlU,162075
2523
- pygpt_net-2.6.32.dist-info/WHEEL,sha256=b4K_helf-jlQoXBBETfwnf4B04YC67LOev0jo4fX5m8,88
2524
- pygpt_net-2.6.32.dist-info/entry_points.txt,sha256=qvpII6UHIt8XfokmQWnCYQrTgty8FeJ9hJvOuUFCN-8,43
2525
- pygpt_net-2.6.32.dist-info/RECORD,,
2522
+ pygpt_net-2.6.34.dist-info/LICENSE,sha256=rbPqNB_xxANH8hKayJyIcTwD4bj4Y2G-Mcm85r1OImM,1126
2523
+ pygpt_net-2.6.34.dist-info/METADATA,sha256=uCPhqefcBYO17_u8Os96gRv15SiO-1ne5eFVS_q8TY8,162445
2524
+ pygpt_net-2.6.34.dist-info/WHEEL,sha256=b4K_helf-jlQoXBBETfwnf4B04YC67LOev0jo4fX5m8,88
2525
+ pygpt_net-2.6.34.dist-info/entry_points.txt,sha256=qvpII6UHIt8XfokmQWnCYQrTgty8FeJ9hJvOuUFCN-8,43
2526
+ pygpt_net-2.6.34.dist-info/RECORD,,