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.
- pygpt_net/CHANGELOG.txt +6 -0
- pygpt_net/__init__.py +3 -3
- pygpt_net/controller/__init__.py +8 -2
- pygpt_net/controller/ctx/ctx.py +2 -2
- pygpt_net/controller/mode/mode.py +3 -2
- pygpt_net/controller/settings/profile.py +16 -3
- pygpt_net/controller/settings/workdir.py +184 -124
- pygpt_net/controller/theme/theme.py +11 -5
- pygpt_net/core/agents/runners/llama_workflow.py +0 -2
- pygpt_net/core/render/plain/body.py +10 -19
- pygpt_net/core/render/plain/renderer.py +27 -27
- pygpt_net/data/config/config.json +5 -5
- pygpt_net/data/config/models.json +3 -3
- pygpt_net/ui/__init__.py +12 -10
- pygpt_net/ui/base/config_dialog.py +15 -10
- pygpt_net/ui/dialog/about.py +26 -18
- pygpt_net/ui/dialog/settings.py +75 -87
- pygpt_net/ui/dialog/workdir.py +7 -2
- pygpt_net/ui/main.py +5 -1
- pygpt_net/ui/widget/textarea/web.py +22 -16
- {pygpt_net-2.6.16.dist-info → pygpt_net-2.6.17.post1.dist-info}/METADATA +12 -5
- {pygpt_net-2.6.16.dist-info → pygpt_net-2.6.17.post1.dist-info}/RECORD +25 -25
- {pygpt_net-2.6.16.dist-info → pygpt_net-2.6.17.post1.dist-info}/LICENSE +0 -0
- {pygpt_net-2.6.16.dist-info → pygpt_net-2.6.17.post1.dist-info}/WHEEL +0 -0
- {pygpt_net-2.6.16.dist-info → pygpt_net-2.6.17.post1.dist-info}/entry_points.txt +0 -0
pygpt_net/ui/dialog/settings.py
CHANGED
|
@@ -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 =
|
|
78
|
+
fields = options_get(section_id)
|
|
78
79
|
is_general = False
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
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
|
-
|
|
101
|
-
|
|
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
|
-
|
|
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
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
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
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
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
|
|
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)
|
|
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 !=
|
|
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
|
|
173
|
-
|
|
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
|
-
|
|
189
|
-
|
|
190
|
-
groups[tab_id].
|
|
191
|
-
|
|
192
|
-
|
|
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(
|
|
202
|
-
self.window.ui.groups[group_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
|
-
|
|
218
|
-
|
|
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
|
|
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
|
-
|
|
320
|
-
|
|
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
|
-
|
|
326
|
-
|
|
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
|
-
|
|
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):
|
pygpt_net/ui/dialog/workdir.py
CHANGED
|
@@ -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:
|
|
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.
|
|
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
|
|
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
|
-
|
|
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.
|
|
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
|
[](https://snapcraft.io/pygpt)
|
|
110
111
|
|
|
111
|
-
Release: **2.6.
|
|
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
|
|
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
|
|
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
|
|
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=
|
|
1
|
+
pygpt_net/CHANGELOG.txt,sha256=aXQoY6LAxf31oH_P5FXlA6aQiRtYOhfPCZOfAPk110Y,100454
|
|
2
2
|
pygpt_net/LICENSE,sha256=dz9sfFgYahvu2NZbx4C1xCsVn9GVer2wXcMkFRBvqzY,1146
|
|
3
|
-
pygpt_net/__init__.py,sha256=
|
|
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=
|
|
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=
|
|
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=
|
|
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=
|
|
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=
|
|
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=
|
|
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=
|
|
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=
|
|
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=
|
|
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=
|
|
347
|
-
pygpt_net/data/config/models.json,sha256=
|
|
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=
|
|
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=
|
|
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=
|
|
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=
|
|
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=
|
|
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=
|
|
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=
|
|
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.
|
|
2441
|
-
pygpt_net-2.6.
|
|
2442
|
-
pygpt_net-2.6.
|
|
2443
|
-
pygpt_net-2.6.
|
|
2444
|
-
pygpt_net-2.6.
|
|
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,,
|
|
File without changes
|
|
File without changes
|
|
File without changes
|