pygpt-net 2.6.16__py3-none-any.whl → 2.6.17.post1__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.
@@ -65,6 +65,7 @@ class Settings(BaseConfigDialog):
65
65
 
66
66
  # settings section tabs
67
67
  self.window.ui.tabs['settings.section'] = QTabWidget()
68
+ options_get = self.window.controller.settings.editor.get_options
68
69
 
69
70
  # build settings tabs
70
71
  for section_id in sections:
@@ -74,21 +75,26 @@ class Settings(BaseConfigDialog):
74
75
  first_tab = "general"
75
76
 
76
77
  # get settings options for section
77
- fields = self.window.controller.settings.editor.get_options(section_id)
78
+ fields = options_get(section_id)
78
79
  is_general = False
79
- for key in fields:
80
- if 'tab' in fields[key]:
81
- tab = fields[key]['tab']
80
+
81
+ tab_by_key = {}
82
+ for key, field in fields.items():
83
+ if 'tab' in field:
84
+ tab = field['tab']
82
85
  if tab is not None:
83
86
  if first_tab == "general":
84
87
  first_tab = tab
85
- if tab.lower() == "general":
88
+ if isinstance(tab, str) and tab.lower() == "general":
86
89
  is_general = True
87
- break
88
90
  else:
89
91
  is_general = True
90
- break
91
92
 
93
+ tab_id = field['tab'] if field.get('tab') not in (None, "") else "general"
94
+ tab_by_key[key] = tab_id
95
+
96
+ if field.get('advanced'):
97
+ advanced_keys.setdefault(tab_id, []).append(key)
92
98
 
93
99
  # extract tab ids, general is default
94
100
  tab_ids = self.extract_option_tabs(fields)
@@ -97,109 +103,85 @@ class Settings(BaseConfigDialog):
97
103
  tab_ids += extra_tabs
98
104
  for tab_id in tab_ids:
99
105
  content_tabs[tab_id] = QVBoxLayout()
100
- scroll_tabs[tab_id] = QScrollArea()
101
- scroll_tabs[tab_id].setWidgetResizable(True)
102
-
103
- # prepare advanced options keys
104
- for key in fields:
105
- if 'advanced' in fields[key] and fields[key]['advanced']:
106
- tab_id = "general"
107
- if 'tab' in fields[key]:
108
- tab = fields[key]['tab']
109
- if tab is not None and tab != "":
110
- tab_id = tab
111
- if tab_id not in advanced_keys:
112
- advanced_keys[tab_id] = []
113
- advanced_keys[tab_id].append(key)
106
+ s = QScrollArea()
107
+ s.setWidgetResizable(True)
108
+ scroll_tabs[tab_id] = s
114
109
 
115
110
  # build settings widgets
116
111
  widgets = self.build_widgets(self.id, fields)
117
112
 
118
113
  # apply settings widgets
119
- for key in widgets:
120
- self.window.ui.config[self.id][key] = widgets[key]
114
+ self.window.ui.config[self.id].update(widgets)
121
115
 
122
116
  # apply widgets to layouts
123
117
  options = {}
124
- for key in widgets:
125
- if fields[key]["type"] == 'text' or fields[key]["type"] == 'int' or fields[key]["type"] == 'float':
126
- options[key] = self.add_option(widgets[key], fields[key])
127
- elif fields[key]["type"] == 'textarea':
128
- options[key] = self.add_row_option(widgets[key], fields[key])
129
- elif fields[key]["type"] == 'bool':
130
- options[key] = self.add_raw_option(widgets[key], fields[key])
131
- elif fields[key]['type'] == 'dict':
132
- options[key] = self.add_row_option(widgets[key], fields[key]) # dict
133
- # register dict to editor:
134
- self.window.ui.dialogs.register_dictionary(
135
- key,
136
- parent="config",
137
- option=fields[key],
138
- )
139
- elif fields[key]['type'] == 'combo':
140
- options[key] = self.add_option(widgets[key], fields[key]) # combobox
141
- elif fields[key]['type'] == 'bool_list':
142
- options[key] = self.add_option(widgets[key], fields[key]) # bool list
143
-
144
- #self.window.ui.nodes['settings.api_key.label'].setMinimumHeight(60)
118
+ add_option = self.add_option
119
+ add_row_option = self.add_row_option
120
+ add_raw_option = self.add_raw_option
121
+ register_dictionary = self.window.ui.dialogs.register_dictionary
122
+
123
+ for key, widget in widgets.items():
124
+ f = fields[key]
125
+ t = f['type']
126
+ if t in ('text', 'int', 'float', 'combo', 'bool_list'):
127
+ options[key] = add_option(widget, f)
128
+ elif t in ('textarea', 'dict'):
129
+ options[key] = add_row_option(widget, f)
130
+ if t == 'dict':
131
+ # register dict to editor:
132
+ register_dictionary(
133
+ key,
134
+ parent="config",
135
+ option=f,
136
+ )
137
+ elif t == 'bool':
138
+ options[key] = add_raw_option(widget, f)
139
+
140
+ # self.window.ui.nodes['settings.api_key.label'].setMinimumHeight(60)
145
141
 
146
142
  # append widgets options layouts to scroll area
147
- for key in options:
148
- option = options[key]
149
- tab_id = "general"
150
- if 'tab' in fields[key]:
151
- tab = fields[key]['tab']
152
- if tab is not None and tab != "":
153
- tab_id = tab
143
+ advanced_membership = {tid: set(keys) for tid, keys in advanced_keys.items()}
144
+ last_option_key = next(reversed(options)) if options else None
145
+
146
+ for key, option in options.items():
147
+ tab_id = tab_by_key.get(key, "general")
154
148
 
155
149
  # hide advanced options
156
- if tab_id in advanced_keys and key in advanced_keys[tab_id]:
150
+ if tab_id in advanced_membership and key in advanced_membership[tab_id]:
157
151
  continue
158
152
 
159
- content_tabs[tab_id].addLayout(option) # add
153
+ content_tabs[tab_id].addLayout(option)
160
154
 
161
155
  # append URLs
162
156
  if 'urls' in fields[key]:
163
157
  content_tabs[tab_id].addWidget(self.add_urls(fields[key]['urls']))
164
158
 
165
159
  # check if not last option
166
- if key != list(options.keys())[-1] or tab_id in advanced_keys:
160
+ if key != last_option_key or tab_id in advanced_keys:
167
161
  content_tabs[tab_id].addWidget(self.add_line())
168
162
 
169
163
  # append advanced options at the end
170
164
  if len(advanced_keys) > 0:
171
165
  groups = {}
172
- for key in options:
173
- tab_id = "general"
174
- if 'tab' in fields[key]:
175
- tab = fields[key]['tab']
176
- if tab is not None and tab != "":
177
- tab_id = tab
178
-
179
- if tab_id not in advanced_keys:
180
- continue
181
-
182
- # ignore non-advanced options
183
- if key not in advanced_keys[tab_id]:
166
+ for tab_id, adv_list in advanced_keys.items():
167
+ if not adv_list:
184
168
  continue
185
169
 
186
170
  group_id = 'settings.advanced.' + section_id + '.' + tab_id
171
+ groups[tab_id] = CollapsedGroup(self.window, group_id, None, False, None)
172
+ groups[tab_id].box.setText(trans('settings.advanced.collapse'))
187
173
 
188
- if tab_id not in groups:
189
- groups[tab_id] = CollapsedGroup(self.window, group_id, None, False, None)
190
- groups[tab_id].box.setText(trans('settings.advanced.collapse'))
191
-
192
- groups[tab_id].add_layout(options[key]) # add option to group
193
-
194
- # add line if not last option
195
- if key != advanced_keys[tab_id][-1]:
196
- groups[tab_id].add_widget(self.add_line())
174
+ last_idx = len(adv_list) - 1
175
+ for idx, key in enumerate(adv_list):
176
+ groups[tab_id].add_layout(options[key])
177
+ if idx != last_idx:
178
+ groups[tab_id].add_widget(self.add_line())
197
179
 
198
180
  # add advanced options group to scrolls
199
- for tab_id in groups:
181
+ for tab_id, group in groups.items():
200
182
  group_id = 'settings.advanced.' + section_id + '.' + tab_id
201
- content_tabs[tab_id].addWidget(groups[tab_id])
202
- self.window.ui.groups[group_id] = groups[tab_id]
183
+ content_tabs[tab_id].addWidget(group)
184
+ self.window.ui.groups[group_id] = group
203
185
 
204
186
  # add extra features buttons
205
187
  self.append_extra(content_tabs, section_id, options, fields)
@@ -214,10 +196,10 @@ class Settings(BaseConfigDialog):
214
196
  tab_widget = QTabWidget()
215
197
 
216
198
  # sort to make general tab first if exists
217
- if "general" in content_tabs:
218
- content_tabs = {"general": content_tabs.pop("general")} | content_tabs
199
+ tab_order = (["general"] + [tid for tid in content_tabs if
200
+ tid != "general"]) if "general" in content_tabs else list(content_tabs)
219
201
 
220
- for tab_id in content_tabs:
202
+ for tab_id in tab_order:
221
203
  if tab_id == "general":
222
204
  name_key = trans("settings.section.tab.general")
223
205
  else:
@@ -315,21 +297,27 @@ class Settings(BaseConfigDialog):
315
297
  :return: list with keys
316
298
  """
317
299
  keys = []
300
+ seen = set()
318
301
  is_default = False
319
- for key in options:
320
- option = options[key]
302
+
303
+ for option in options.values():
321
304
  if 'tab' in option:
322
305
  tab = option['tab']
323
306
  if tab == "" or tab is None:
324
307
  is_default = True
325
- if tab not in keys:
326
- keys.append(tab)
308
+ try:
309
+ if tab not in seen:
310
+ seen.add(tab)
311
+ keys.append(tab)
312
+ except TypeError:
313
+ if tab not in keys:
314
+ keys.append(tab)
327
315
  else:
328
316
  is_default = True
329
317
 
330
- # add default general tab if not exists
331
- if len(keys) == 0 or (is_default and "general" not in keys):
318
+ if not keys or (is_default and "general" not in keys):
332
319
  keys.append("general")
320
+
333
321
  return keys
334
322
 
335
323
  def append_extra(self, content: dict, section_id: str, widgets: dict, options: dict):
@@ -6,11 +6,11 @@
6
6
  # GitHub: https://github.com/szczyglis-dev/py-gpt #
7
7
  # MIT License #
8
8
  # Created By : Marcin Szczygliński #
9
- # Updated Date: 2024.03.25 12:00:00 #
9
+ # Updated Date: 2025.08.20 23:00:00 #
10
10
  # ================================================== #
11
11
 
12
12
  from PySide6.QtCore import Qt
13
- from PySide6.QtWidgets import QPushButton, QHBoxLayout, QLabel, QVBoxLayout, QSizePolicy
13
+ from PySide6.QtWidgets import QPushButton, QHBoxLayout, QLabel, QVBoxLayout, QSizePolicy, QApplication
14
14
 
15
15
  from pygpt_net.ui.widget.dialog.workdir import WorkdirDialog
16
16
  from pygpt_net.ui.widget.option.input import DirectoryInput
@@ -72,6 +72,7 @@ class Workdir:
72
72
  """Prepare workdir change dialog"""
73
73
  size_needed = self.window.core.filesystem.get_directory_size(self.window.core.config.get_user_path())
74
74
  self.window.ui.nodes['workdir.change.info'].setText(trans("dialog.workdir.tip").format(size=size_needed))
75
+ QApplication.processEvents()
75
76
 
76
77
  def show_status(self, status: str):
77
78
  """
@@ -81,11 +82,13 @@ class Workdir:
81
82
  """
82
83
  self.window.ui.nodes['workdir.change.status'].setText(status)
83
84
  self.window.ui.nodes['workdir.change.status'].setVisible(True)
85
+ QApplication.processEvents()
84
86
 
85
87
  def hide_status(self):
86
88
  """Hide status message"""
87
89
  self.window.ui.nodes['workdir.change.status'].setText("")
88
90
  self.window.ui.nodes['workdir.change.status'].setVisible(False)
91
+ QApplication.processEvents()
89
92
 
90
93
  def change_directory(self):
91
94
  """Update working directory"""
@@ -96,6 +99,7 @@ class Workdir:
96
99
  current = self.window.core.config.get_user_path()
97
100
  self.path.value = current
98
101
  self.path.setText(current)
102
+ QApplication.processEvents()
99
103
 
100
104
  def set_path(self, path: str):
101
105
  """
@@ -106,3 +110,4 @@ class Workdir:
106
110
  self.path.setText(path)
107
111
  self.path.value = path
108
112
  self.path.update()
113
+ QApplication.processEvents()
pygpt_net/ui/main.py CHANGED
@@ -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.19 07:00:00 #
9
+ # Updated Date: 2025.08.20 20:00:00 #
10
10
  # ================================================== #
11
11
 
12
12
  import os
@@ -225,6 +225,10 @@ class MainWindow(QMainWindow, QtStyleTools):
225
225
  self.ui.post_setup()
226
226
  self.tools.post_setup()
227
227
 
228
+ def showEvent(self, e):
229
+ super().showEvent(e)
230
+ QTimer.singleShot(0, self.ui.on_show)
231
+
228
232
  def update(self):
229
233
  """Called on every update (real-time)"""
230
234
  self.controller.on_update()
@@ -9,13 +9,12 @@
9
9
  # Updated Date: 2025.08.19 07:00:00 #
10
10
  # ================================================== #
11
11
 
12
- from PySide6 import QtCore
13
12
  from PySide6.QtCore import Qt, QObject, Signal, Slot, QEvent, QTimer
14
13
  from PySide6.QtWebChannel import QWebChannel
15
14
  from PySide6.QtWebEngineCore import QWebEngineSettings, QWebEnginePage, QWebEngineProfile
16
15
  from PySide6.QtWebEngineWidgets import QWebEngineView
17
16
  from PySide6.QtGui import QAction, QIcon
18
- from PySide6.QtWidgets import QMenu, QApplication
17
+ from PySide6.QtWidgets import QMenu
19
18
 
20
19
  from pygpt_net.core.events import RenderEvent
21
20
  from pygpt_net.item.ctx import CtxMeta
@@ -23,14 +22,6 @@ from pygpt_net.core.text.web_finder import WebFinder
23
22
  from pygpt_net.ui.widget.tabs.layout import FocusEventFilter
24
23
  from pygpt_net.utils import trans, mem_clean
25
24
 
26
- def make_shared_profile():
27
- prof = QWebEngineProfile("app", None)
28
- prof.setHttpCacheType(QWebEngineProfile.MemoryHttpCache)
29
- prof.setHttpCacheMaximumSize(32 * 1024 * 1024) # 32MB
30
- prof.setPersistentCookiesPolicy(QWebEngineProfile.NoPersistentCookies)
31
- prof.setSpellCheckEnabled(False)
32
- return prof
33
-
34
25
  SHARED_PROFILE = None
35
26
 
36
27
  import pygpt_net.icons_rc
@@ -51,21 +42,35 @@ class ChatWebOutput(QWebEngineView):
51
42
  self.setContextMenuPolicy(Qt.CustomContextMenu)
52
43
  self.filter = FocusEventFilter(self, self.on_focus)
53
44
  self.installEventFilter(self)
54
-
55
- global SHARED_PROFILE
56
- if not SHARED_PROFILE:
57
- SHARED_PROFILE = make_shared_profile()
58
-
59
45
  self.plain = None
60
46
  self.html_content = None
61
47
  self.meta = None
62
48
  self.tab = None
63
49
  self.setProperty('class', 'layout-output-web')
64
50
 
51
+ # OpenGL widgets
65
52
  self._glwidget = None
66
53
  self._glwidget_filter_installed = False
67
54
 
68
- self.setPage(CustomWebEnginePage(self.window, self, profile=SHARED_PROFILE))
55
+ # set the page with a shared profile
56
+ self.setUpdatesEnabled(False) # disable updates until the page is set, re-enable in `on_page_loaded`
57
+ self.setPage(CustomWebEnginePage(self.window, self, profile=self._make_shared_profile()))
58
+
59
+ def _make_shared_profile(self) -> QWebEngineProfile:
60
+ """
61
+ Create a shared QWebEngineProfile
62
+
63
+ :return: QWebEngineProfile - shared profile instance
64
+ """
65
+ global SHARED_PROFILE
66
+ if not SHARED_PROFILE:
67
+ prof = QWebEngineProfile("app", None)
68
+ # prof.setHttpCacheType(QWebEngineProfile.MemoryHttpCache)
69
+ # prof.setHttpCacheMaximumSize(32 * 1024 * 1024) # 32MB
70
+ prof.setPersistentCookiesPolicy(QWebEngineProfile.NoPersistentCookies)
71
+ prof.setSpellCheckEnabled(False)
72
+ SHARED_PROFILE = prof
73
+ return SHARED_PROFILE
69
74
 
70
75
  def _detach_gl_event_filter(self):
71
76
  """Detach OpenGL widget event filter if installed"""
@@ -421,6 +426,7 @@ class ChatWebOutput(QWebEngineView):
421
426
  "tab": self.tab,
422
427
  })
423
428
  self.window.dispatch(event)
429
+ self.setUpdatesEnabled(True)
424
430
 
425
431
  def get_selected_text(self) -> str:
426
432
  p = self.page()
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.3
2
2
  Name: pygpt-net
3
- Version: 2.6.16
3
+ Version: 2.6.17.post1
4
4
  Summary: Desktop AI Assistant powered by: OpenAI GPT-5, o1, o3, GPT-4, 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: py_gpt,py-gpt,pygpt,desktop,app,o1,o3,gpt-5,gpt,gpt4,gpt-4o,gpt-4v,gpt3.5,gpt-4,gpt-4-vision,gpt-3.5,llama3,mistral,gemini,grok,deepseek,bielik,claude,tts,whisper,vision,chatgpt,dall-e,chat,chatbot,assistant,text completion,image generation,ai,api,openai,api key,langchain,llama-index,ollama,presets,ui,qt,pyside
@@ -82,6 +82,7 @@ Requires-Dist: packaging (>=24.2,<25.0)
82
82
  Requires-Dist: pandas (>=2.2.3,<3.0.0)
83
83
  Requires-Dist: pillow (>=10.4.0,<11.0.0)
84
84
  Requires-Dist: pinecone-client (>=3.2.2,<4.0.0)
85
+ Requires-Dist: psutil (>=7.0.0,<8.0.0)
85
86
  Requires-Dist: pydub (>=0.25.1,<0.26.0)
86
87
  Requires-Dist: pygame (>=2.6.1,<3.0.0)
87
88
  Requires-Dist: pynput (>=1.8.1,<2.0.0)
@@ -108,7 +109,7 @@ Description-Content-Type: text/markdown
108
109
 
109
110
  [![pygpt](https://snapcraft.io/pygpt/badge.svg)](https://snapcraft.io/pygpt)
110
111
 
111
- Release: **2.6.16** | build: **2025-08-20** | Python: **>=3.10, <3.14**
112
+ Release: **2.6.17** | build: **2025-08-21** | Python: **>=3.10, <3.14**
112
113
 
113
114
  > Official website: https://pygpt.net | Documentation: https://pygpt.readthedocs.io
114
115
  >
@@ -3589,7 +3590,7 @@ Enable/disable remote tools, like Web Search or Image generation to use in OpenA
3589
3590
 
3590
3591
  - `Index to use`: Only if sub-mode is llama_index (Chat with files), choose the index to use in both Agent and Expert modes.
3591
3592
 
3592
- - `Use native API function calls`: Use API function calls to run commands from plugins instead of using command prompts - Autonomous agent mode only, default: False
3593
+ - `Use native API function calls`: Use API function calls to run tools from plugins instead of using command prompts - Autonomous agent mode only, default: False
3593
3594
 
3594
3595
  - `Use Responses API in Agent mode`: Use Responses API instead of ChatCompletions API in Agent (autonomous) mode. OpenAI models only. Default: False
3595
3596
 
@@ -3597,9 +3598,9 @@ Enable/disable remote tools, like Web Search or Image generation to use in OpenA
3597
3598
 
3598
3599
  - `Sub-mode for experts`: Sub-mode to use in Experts mode (chat, llama_index, etc.). Default: chat.
3599
3600
 
3600
- - `Use agent for expert reasoning`: If enabled, the Planner agent will be used for expert calls and expert reasoning. Default: False
3601
+ - `Use agent for expert reasoning`: If enabled, the ReAct agent will be used for expert calls and expert reasoning. Default: True
3601
3602
 
3602
- - `Use native API function calls`: Use API function calls to run commands from plugins instead of using command prompts - Experts only, default: False
3603
+ - `Use native API function calls`: Use API function calls to run tools from plugins instead of using command prompts - Experts only, default: False
3603
3604
 
3604
3605
  - `Use Responses API in Experts mode (master)`: Use Responses API instead of ChatCompletions API in Experts (master model). OpenAI models only. Default: False
3605
3606
 
@@ -4566,6 +4567,12 @@ may consume additional tokens that are not displayed in the main window.
4566
4567
 
4567
4568
  ## Recent changes:
4568
4569
 
4570
+ **2.6.17 (2025-08-21)**
4571
+
4572
+ - Optimized profile switching.
4573
+ - Fixed: setting initial splitter size on first launch.
4574
+ - Added smoother view reload.
4575
+
4569
4576
  **2.6.16 (2025-08-20)**
4570
4577
 
4571
4578
  - Fixed: Attachment string joining.
@@ -1,10 +1,10 @@
1
- pygpt_net/CHANGELOG.txt,sha256=fEGXitN6NrcJKyGof7KHvchcHN0Yu7GjdXPB7Y7af50,100315
1
+ pygpt_net/CHANGELOG.txt,sha256=aXQoY6LAxf31oH_P5FXlA6aQiRtYOhfPCZOfAPk110Y,100454
2
2
  pygpt_net/LICENSE,sha256=dz9sfFgYahvu2NZbx4C1xCsVn9GVer2wXcMkFRBvqzY,1146
3
- pygpt_net/__init__.py,sha256=rmHqGkQwYxTuEBs2sAqrSt2yi08x26bOdCxMBp22w-g,1373
3
+ pygpt_net/__init__.py,sha256=KBVlmPZoJBZ0ZSOuNxYfSTzmFKuN4GEBujL1PtlqWus,1373
4
4
  pygpt_net/app.py,sha256=2IXjjYJ0tm-iFn3pHu3-JGoFAnN9YvmXGHPmeOhpU3Y,20999
5
5
  pygpt_net/config.py,sha256=LCKrqQfePVNrAvH3EY_1oZx1Go754sDoyUneJ0iGWFI,16660
6
6
  pygpt_net/container.py,sha256=NsMSHURaEC_eW8vrCNdztwqkxB7jui3yVlzUOMYvCHg,4124
7
- pygpt_net/controller/__init__.py,sha256=FiAP-Md0a57HSH1sSFflB4aq6Jho9M1lejk9VJxM8is,5969
7
+ pygpt_net/controller/__init__.py,sha256=UAYJmyXJG1_kawo23FRH0IjU8S8YBbIuJrPkrsOy9Eo,6199
8
8
  pygpt_net/controller/access/__init__.py,sha256=_XZxGy5U93JGU49GbIB9E_I26_uRV_Zbz18lcp7u23A,510
9
9
  pygpt_net/controller/access/access.py,sha256=nPttwQf6RZHJAlXZ-3fnlcplwXxcJWp8ciq3FMsSssI,3974
10
10
  pygpt_net/controller/access/control.py,sha256=nMGWzg60jNJMVAHIrism0_APzVMpbLAOcXG6mJuOSJ8,17332
@@ -62,7 +62,7 @@ pygpt_net/controller/config/field/textarea.py,sha256=Ln545IHzXBeFIjnfMIpmlUr-V3w
62
62
  pygpt_net/controller/config/placeholder.py,sha256=Q4csMg6q1xpV5Yz8jb2eh33lqdvqE5AAUg7L9ProRRY,16030
63
63
  pygpt_net/controller/ctx/__init__.py,sha256=0wH7ziC75WscBW8cxpeGBwEz5tolo_kCxGPoz2udI_E,507
64
64
  pygpt_net/controller/ctx/common.py,sha256=_ygKbwotFfbG12vm247WFXPgDH5TnjZuv_0jUCgEShs,6591
65
- pygpt_net/controller/ctx/ctx.py,sha256=ROoTAOrDRC1GrB8p6EWjEJ4rYGgqzU1WTbMJIInNKO4,36098
65
+ pygpt_net/controller/ctx/ctx.py,sha256=I9L7gZFQcKeiLu6vHYZfTvjss7Kufv-uoF3dWZ4z3OI,36107
66
66
  pygpt_net/controller/ctx/extra.py,sha256=WApWjnIfl3SoI0VZVbptvjjqhFPJl-dSfqW12tlBHrY,8599
67
67
  pygpt_net/controller/ctx/summarizer.py,sha256=dO-LqIclwI7gIot1yjNo9eZ0HxakWCSoqePORgCLOk8,3072
68
68
  pygpt_net/controller/debug/__init__.py,sha256=dOJGTICjvTtrPIEDOsxCzcOHsfu8AFPLpSKbdN0q0KI,509
@@ -96,7 +96,7 @@ pygpt_net/controller/launcher/launcher.py,sha256=zY2yIrSd7y5dhVtMJExKxHI4JhD1--P
96
96
  pygpt_net/controller/layout/__init__.py,sha256=0pxxzjAUa1hS27d80Q0SgDV1Uzs7A9mZrUxb1cs-oHs,510
97
97
  pygpt_net/controller/layout/layout.py,sha256=HlbfGK-_HXQrifSh5tWpPtu5JzWN2fktVmh8ofBDMfQ,13058
98
98
  pygpt_net/controller/mode/__init__.py,sha256=1Kcz0xHc2IW_if9S9eQozBUvIu69eLAe7T-Re2lJxhk,508
99
- pygpt_net/controller/mode/mode.py,sha256=fhTqLhMrMRMh-ycnx4Is1TdcgNVb-ctGWyAnKKtxPIo,7401
99
+ pygpt_net/controller/mode/mode.py,sha256=F3rERGN_sAgAqDITFYd1Nj56_4MiBIS9TwjjSPH1uEc,7437
100
100
  pygpt_net/controller/model/__init__.py,sha256=mQXq9u269D8TD3u_44J6DFFyHKkaZplk-tRFCssBGbE,509
101
101
  pygpt_net/controller/model/editor.py,sha256=_WDVFTrgZKM5Y8MZiWur4e5oSuRbXr-Q3PDozVtZ9fw,16384
102
102
  pygpt_net/controller/model/importer.py,sha256=WMJmsGRapTagET4tySUTPDHRC5Ojg9wrmR4YYhfj0Lk,22094
@@ -117,15 +117,15 @@ pygpt_net/controller/presets/experts.py,sha256=dfPKmAPO-7gaUD2ILs3lR005ir32G5vV-
117
117
  pygpt_net/controller/presets/presets.py,sha256=Tq9AIgr042ALu6hEQunBxnUZTzLdzmp4IStWprzmyjg,21918
118
118
  pygpt_net/controller/settings/__init__.py,sha256=hn5n_Hti6byJQdQCs4Ld2EbPoZF7dHVMwqaBPscePQ8,512
119
119
  pygpt_net/controller/settings/editor.py,sha256=vpXhDDrr8Jn5-dn2KXMbjlu-Dawrq9s7TdEYaAdq-fE,18772
120
- pygpt_net/controller/settings/profile.py,sha256=Zom4qT2j71lZadB2nbJvn5Ewoek8jdf5fc9HERwUZtE,20049
120
+ pygpt_net/controller/settings/profile.py,sha256=cGva5H30npAfmMgq7k5r856-yVps6rU0nDw13U_7O-8,20525
121
121
  pygpt_net/controller/settings/settings.py,sha256=cFA4ZKjcsu8uoapWMTllUUB9DvJXVBzbxLT6InRS4zU,7768
122
- pygpt_net/controller/settings/workdir.py,sha256=YEMCMR_IFIPKU4SRvMQ6JZCUQfnPGMWzVjNAARHlpCg,20031
122
+ pygpt_net/controller/settings/workdir.py,sha256=h1-S6xU4_naPvfOCOtonOUrSnPlhX3_y7km_oD43D0Y,22163
123
123
  pygpt_net/controller/theme/__init__.py,sha256=-HMDkTGRa7Q6_AGomkZPVyasIOgNCqeez0Ocw_z9gMc,509
124
124
  pygpt_net/controller/theme/common.py,sha256=z5mzpMnfkTeFstKm_uodDboAa3xj5vTpMKGCZzvkX9A,7114
125
125
  pygpt_net/controller/theme/markdown.py,sha256=iH34dsZWyXCtIZuuRBHiAV__W0P4bY-7OuzEwehizr0,6064
126
126
  pygpt_net/controller/theme/menu.py,sha256=3EjDVatt4lYNePHwHaEr0tZGbO2MljqY5uzkYVvtH5E,5962
127
127
  pygpt_net/controller/theme/nodes.py,sha256=cnoZKp8gRczmWgsAC5liLB53YgsArAPvOWRLmyeAn1o,5463
128
- pygpt_net/controller/theme/theme.py,sha256=LuGIpAHH4EK56TCROHp3DBZKu_xuNQQNtbhU0pRv7xI,7828
128
+ pygpt_net/controller/theme/theme.py,sha256=0nA-zqylU6GtIsxg-IFPWPWTLEZk-plOd7Na2BCwW_c,8055
129
129
  pygpt_net/controller/tools/__init__.py,sha256=ds63rOuwLEIe-SlY_sQkhWSdXS0lfVwseUiHkg2NTD4,509
130
130
  pygpt_net/controller/tools/tools.py,sha256=GfDcAVyAiF1CcZ8ATnSJgfCwXYOaGQ1xoxXztVvU3qc,2905
131
131
  pygpt_net/controller/ui/__init__.py,sha256=cxfh2SYeEDATGAZpcYDqCxYfp4KReQ1CYehevSf89EU,507
@@ -155,7 +155,7 @@ pygpt_net/core/agents/runners/helpers.py,sha256=0iQQlSg_pJfxY_gQEWImnyAVkTUQYYSW
155
155
  pygpt_net/core/agents/runners/llama_assistant.py,sha256=a_Abkc8u1S8vr6lUIDRrzTM9sQnEvyZA8nZxXaYp05w,2492
156
156
  pygpt_net/core/agents/runners/llama_plan.py,sha256=CC3WPG9KUxd_dRjPZROOrmPQrWQ_u8C0nRx0TCzi9bE,13391
157
157
  pygpt_net/core/agents/runners/llama_steps.py,sha256=1SBLp5t4TUsxpYIUtSSnBy5Sd2AxheDlv2AXimls-Vg,7328
158
- pygpt_net/core/agents/runners/llama_workflow.py,sha256=BtjKY2dIP6-Z99VZ66uBXeSG2cFD_0jIh4pehboWcHM,12184
158
+ pygpt_net/core/agents/runners/llama_workflow.py,sha256=kU_Gju08e3rAFb_DVyDpGHhTurC49_oAGdMWcL6wZHQ,12136
159
159
  pygpt_net/core/agents/runners/loop.py,sha256=opcVGx8WFjJesLlmMzoCBgP06Ajh6j_Taat4zCTumHg,6022
160
160
  pygpt_net/core/agents/runners/openai_workflow.py,sha256=J47INptxu8Uc40UfAWNRRiHRYL6ZM6lPojoqeHsC-mc,7989
161
161
  pygpt_net/core/agents/tools.py,sha256=6V2IjSF0m8cNY0HI7vW9bTLjKzR1KtcP0XTcHBvrPjU,21727
@@ -298,10 +298,10 @@ pygpt_net/core/render/markdown/parser.py,sha256=4lCC_pCWmi-SUli4nnDH-FZEbBi0SnVl
298
298
  pygpt_net/core/render/markdown/pid.py,sha256=bRAOdL8bS-LSfOKReWK3nu-BUZ2qfNchrAsrkxRKlHU,851
299
299
  pygpt_net/core/render/markdown/renderer.py,sha256=PER4BxQUU2zjyMq-flM83_cNcjFyJrRHx2VNa7FN5-I,19488
300
300
  pygpt_net/core/render/plain/__init__.py,sha256=19xPDIYeoDn3Sf1tpcvXtxLaaKkjs0nDQ7-4GqTfeRk,489
301
- pygpt_net/core/render/plain/body.py,sha256=i2iQ8VGzh2E3r32XHPTArAQA1Lu-Xlr1tAjJyUwBZd8,4226
301
+ pygpt_net/core/render/plain/body.py,sha256=qupyjx_P5DG_82qV0xf5LJ9Fr9y5w2sseVwu6dPG8xE,3866
302
302
  pygpt_net/core/render/plain/helpers.py,sha256=CMF84kSeuQnkgZVHmN_9YWaL5BC958tDE9ZWfZWhAzg,1630
303
303
  pygpt_net/core/render/plain/pid.py,sha256=Pz3v1tnLj-XI_9vcaVkCf9SZ2EgVs4LYV4qzelBMoOg,1119
304
- pygpt_net/core/render/plain/renderer.py,sha256=Zzo4O-jo59outV3WuUUd6DNkpq0rkZPbvS-Y3HW7qWo,15781
304
+ pygpt_net/core/render/plain/renderer.py,sha256=CVCdwuDUZEpYna3tkwDlZLN7bwRMu-fBX636k5blqxM,15637
305
305
  pygpt_net/core/render/web/__init__.py,sha256=istp5dsn6EkLEP7lOBeDb8RjodUcWZqjcEvTroaTT-w,489
306
306
  pygpt_net/core/render/web/body.py,sha256=rybg76GiLWowR-qEvM0Y64woSsO4KSBnww4f8BU7GgI,54872
307
307
  pygpt_net/core/render/web/helpers.py,sha256=ivrXrCqRIUWHDmu3INu-i6XUlB2W9IOO8iYyqpbnSRU,5438
@@ -343,8 +343,8 @@ pygpt_net/css_rc.py,sha256=i13kX7irhbYCWZ5yJbcMmnkFp_UfS4PYnvRFSPF7XXo,11349
343
343
  pygpt_net/data/audio/click_off.mp3,sha256=aNiRDP1pt-Jy7ija4YKCNFBwvGWbzU460F4pZWZDS90,65201
344
344
  pygpt_net/data/audio/click_on.mp3,sha256=qfdsSnthAEHVXzeyN4LlC0OvXuyW8p7stb7VXtlvZ1k,65201
345
345
  pygpt_net/data/audio/ok.mp3,sha256=LTiV32pEBkpUGBkKkcOdOFB7Eyt_QoP2Nv6c5AaXftk,32256
346
- pygpt_net/data/config/config.json,sha256=2DfLNPTfo-v7ul1dIy_q9hMJWIYDliwmUAo5pbdNx-I,24923
347
- pygpt_net/data/config/models.json,sha256=Lv5nfuyBXzfcjDUPHyZaOp7Dhp0kVTBJg7aeyX309Zg,109650
346
+ pygpt_net/data/config/config.json,sha256=7mM-UAbuZUlNbgaebZQ_up3QtEIDNTmN-eM29h-wc6A,24923
347
+ pygpt_net/data/config/models.json,sha256=4koERZ-cITcGIcSngINcHB0SO238C2VJSYd1zxS0WFo,109650
348
348
  pygpt_net/data/config/modes.json,sha256=M882iiqX_R2sNQl9cqZ3k-uneEvO9wpARtHRMLx_LHw,2265
349
349
  pygpt_net/data/config/presets/agent_code_act.json,sha256=GYHqhxtKFLUCvRI3IJAJ7Qe1k8yD9wGGNwManldWzlI,754
350
350
  pygpt_net/data/config/presets/agent_openai.json,sha256=bpDJgLRey_effQkzFRoOEGd4aHUrmzeODSDdNzrf62I,730
@@ -2246,13 +2246,13 @@ pygpt_net/tools/translator/tool.py,sha256=3QIv50Bc7TgrkVQ-7qcuxIERAJz5e4Vy22Uj8K
2246
2246
  pygpt_net/tools/translator/ui/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
2247
2247
  pygpt_net/tools/translator/ui/dialogs.py,sha256=qC-dCNtOLbOe-h586iBmsBTlv4KlUoxCkPqYOq8336k,4137
2248
2248
  pygpt_net/tools/translator/ui/widgets.py,sha256=2wQa1T0oWAkoQGTDntzFUE6r1slW-an5uretGxMAJeo,17540
2249
- pygpt_net/ui/__init__.py,sha256=jNQKiNb5lXFVFoHe6SGqS-1LvCg9LOkmKnoyyPnctOE,9225
2249
+ pygpt_net/ui/__init__.py,sha256=OoyVKGWLxPSlwTnEJ-fpwe5EH1GLdRGbTaNHwDoJ7PI,9313
2250
2250
  pygpt_net/ui/base/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
2251
- pygpt_net/ui/base/config_dialog.py,sha256=DHRN6NyvvMxPIiyTzTFgZailBgFW21hgeLLPcQ5x1FE,8322
2251
+ pygpt_net/ui/base/config_dialog.py,sha256=djIXuMBC6AJN1WrUx-z35jjtZJyQvpwc7pYwNHN6Oqs,8584
2252
2252
  pygpt_net/ui/base/context_menu.py,sha256=WqFYyAXJ0fguJ5LF5uOTSLyC38-DbewV2cDJVBYNWyk,4369
2253
2253
  pygpt_net/ui/base/flow_layout.py,sha256=t6TeNSdmScs0NQKlIdzbFmR6oLogekzJGKPOYJUvXls,2803
2254
2254
  pygpt_net/ui/dialog/__init__.py,sha256=1SGZ5i2G1UnKQpyj_HYkN0t-HLepD6jU_ICw1waaxlk,488
2255
- pygpt_net/ui/dialog/about.py,sha256=1fa4g6MdPio0_Fhj037uZ_UPgFulcH4Het7K9VBRiTk,7356
2255
+ pygpt_net/ui/dialog/about.py,sha256=6OCjEWJD10Fwz4ajx6qLh7D4oR0TsgDroczhneyGKEw,7072
2256
2256
  pygpt_net/ui/dialog/applog.py,sha256=jOevcc3-DMasNyWEtNB7MrXZ8TEcxcPEUCzgGqT1VaA,5140
2257
2257
  pygpt_net/ui/dialog/assistant.py,sha256=WJJvv9vSTd8sJNiWW5sVQb5YqpIvWgQH1eMTHvHfGAU,7614
2258
2258
  pygpt_net/ui/dialog/assistant_store.py,sha256=F1fE3L2AnWT0IwRKeE7Z4eSXOIQrUY0t5jQ5ZORSfB8,22825
@@ -2273,12 +2273,12 @@ pygpt_net/ui/dialog/preset.py,sha256=qSckSNtx57Ij4im1sj1XnAy7QhmmHSOQ1qtyLnfChjk
2273
2273
  pygpt_net/ui/dialog/preset_plugins.py,sha256=ynqc0aWjU7MTL4jxcVKaRH_tC9uzeWJCUzUjI74ADb0,3796
2274
2274
  pygpt_net/ui/dialog/profile.py,sha256=Xk9NNQmr1A5pRUxdedu7ePEBq5OYhLT8UInuRWYBktU,4105
2275
2275
  pygpt_net/ui/dialog/rename.py,sha256=Spb7cUVq1ivy3Zg28SBACJ7p_GwJ1gm82Oz9Ld_a_FU,973
2276
- pygpt_net/ui/dialog/settings.py,sha256=KHVx_S99oTa7VIf_zEhrb0hVGs4LF8tLYImsq9EB_m0,16051
2276
+ pygpt_net/ui/dialog/settings.py,sha256=h8zo60D_t8jYMnhMwQS0R3HGXqwBA9s1XDjQlS_FOkA,15280
2277
2277
  pygpt_net/ui/dialog/snap.py,sha256=LQlDsF4E-ernI8GFL1T-q9wZnoo57xyYpg5HKmeSbg4,1065
2278
2278
  pygpt_net/ui/dialog/start.py,sha256=FPka-hcBepFtjEFKnkbUWH017xVZ7TBhNUA7wkY0E2M,2650
2279
2279
  pygpt_net/ui/dialog/update.py,sha256=wJDe2D55XqlAd30vHLeWAuGmgaElwhTd82GIxzvqf4w,842
2280
2280
  pygpt_net/ui/dialog/url.py,sha256=SziMn4Wzyld7Os6b4QdaYAxjwcIWfydmorhTSG7WeUo,949
2281
- pygpt_net/ui/dialog/workdir.py,sha256=_ihXPwDY3KcR7L7v-Hc4Pp7f1pXVIb93rHIV1Rq6Xpw,4275
2281
+ pygpt_net/ui/dialog/workdir.py,sha256=byvyoe3FtQZzo73KTdezOEmufnym31x3CsfllybK1oA,4474
2282
2282
  pygpt_net/ui/dialogs.py,sha256=7EQUZZB0fYJPOKrkLyx4x3OendPUMOqa7NvaBFCgjPo,9846
2283
2283
  pygpt_net/ui/layout/__init__.py,sha256=8HT4tQFqQogEEpGYTv2RplKBthlsFKcl5egnv4lzzEw,488
2284
2284
  pygpt_net/ui/layout/chat/__init__.py,sha256=WgwrBeowDL94ACYqFkzXoOvqceHgsBNGod4exeaAuck,508
@@ -2312,7 +2312,7 @@ pygpt_net/ui/layout/toolbox/presets.py,sha256=praww59pJLD7l5TITJh--B5H7V_OH1_8t3
2312
2312
  pygpt_net/ui/layout/toolbox/prompt.py,sha256=jebF-q1S1Et6ISa9vI0_nM4sb7liDesAXJHtZ5Ll7ZI,4006
2313
2313
  pygpt_net/ui/layout/toolbox/toolbox.py,sha256=zEZr_XDz9QbPKL0u0KMSt1b8yOG-ao1gmZPvWWVpuVs,3392
2314
2314
  pygpt_net/ui/layout/toolbox/vision.py,sha256=GZY-N2z8re1LN1ntsy-3Ius8OY4DujmJpyJ1qP2ZRxs,2447
2315
- pygpt_net/ui/main.py,sha256=ycgY02hqLqBFo9Sy8M5EnOXIEBHfmVwBpRhXgeUyKR4,14066
2315
+ pygpt_net/ui/main.py,sha256=7H3aGExUEECo5zoY-CDeLOcQZgTVigEe_Bpe_mS0pHo,14170
2316
2316
  pygpt_net/ui/menu/__init__.py,sha256=wAIKG9wLWfYv6tpXCTXptWb_XKoCc-4lYWLDvV1bVYk,508
2317
2317
  pygpt_net/ui/menu/about.py,sha256=Y5Ok96MVsFPekvL4dPYK01QPGUUbZvfAsZztcxQhXh8,7232
2318
2318
  pygpt_net/ui/menu/audio.py,sha256=Sb8NTAyMnPj4johTvBKwocHzq67XypIdw7K7hjf2760,3494
@@ -2433,12 +2433,12 @@ pygpt_net/ui/widget/textarea/output.py,sha256=8T2spzqVYHKopSB83p1ULazGZ14nFJhXLB
2433
2433
  pygpt_net/ui/widget/textarea/rename.py,sha256=NwuGRIeWMo7WfsMguAFpTqdOz1eTiXbxrDXGsbWF_TY,1358
2434
2434
  pygpt_net/ui/widget/textarea/search_input.py,sha256=phEXf50VcfCRBen0p2iEAzuX2zmrSE3nWVRfWmtHKpo,5228
2435
2435
  pygpt_net/ui/widget/textarea/url.py,sha256=xbNQxoM5fYI1ZWbvybQkPmNPrIq3yhtNPBOSOWftZCg,1337
2436
- pygpt_net/ui/widget/textarea/web.py,sha256=3XA7Ue8PtxYkVbZRaOPIGjpC5Iko37RlxfO358UEdrk,19425
2436
+ pygpt_net/ui/widget/textarea/web.py,sha256=xGI-47bZ5M_vf_jMc2R9sB1-vuHJbgd5FxE5tbKXj-Q,19815
2437
2437
  pygpt_net/ui/widget/vision/__init__.py,sha256=8HT4tQFqQogEEpGYTv2RplKBthlsFKcl5egnv4lzzEw,488
2438
2438
  pygpt_net/ui/widget/vision/camera.py,sha256=T8b5cmK6uhf_WSSxzPt_Qod8JgMnst6q8sQqRvgQiSA,2584
2439
2439
  pygpt_net/utils.py,sha256=gGbw-lBTodGg_uBx6zKEwa58GaVNZN1I9zY_ZDyJ9xg,8872
2440
- pygpt_net-2.6.16.dist-info/LICENSE,sha256=rbPqNB_xxANH8hKayJyIcTwD4bj4Y2G-Mcm85r1OImM,1126
2441
- pygpt_net-2.6.16.dist-info/METADATA,sha256=KdVcE2-cd3IEx2wKM3gwciqjrbIbkl2vyLRNNpa5-I8,189995
2442
- pygpt_net-2.6.16.dist-info/WHEEL,sha256=b4K_helf-jlQoXBBETfwnf4B04YC67LOev0jo4fX5m8,88
2443
- pygpt_net-2.6.16.dist-info/entry_points.txt,sha256=qvpII6UHIt8XfokmQWnCYQrTgty8FeJ9hJvOuUFCN-8,43
2444
- pygpt_net-2.6.16.dist-info/RECORD,,
2440
+ pygpt_net-2.6.17.post1.dist-info/LICENSE,sha256=rbPqNB_xxANH8hKayJyIcTwD4bj4Y2G-Mcm85r1OImM,1126
2441
+ pygpt_net-2.6.17.post1.dist-info/METADATA,sha256=ZDr1FygM_EXSpN2s5pNAfYofoKCiydQ5UI6jzNEIx2c,190174
2442
+ pygpt_net-2.6.17.post1.dist-info/WHEEL,sha256=b4K_helf-jlQoXBBETfwnf4B04YC67LOev0jo4fX5m8,88
2443
+ pygpt_net-2.6.17.post1.dist-info/entry_points.txt,sha256=qvpII6UHIt8XfokmQWnCYQrTgty8FeJ9hJvOuUFCN-8,43
2444
+ pygpt_net-2.6.17.post1.dist-info/RECORD,,