pygpt-net 2.6.57__py3-none-any.whl → 2.6.59__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 +10 -0
- pygpt_net/__init__.py +3 -3
- pygpt_net/app.py +30 -25
- pygpt_net/controller/debug/debug.py +3 -3
- pygpt_net/controller/dialogs/info.py +6 -2
- pygpt_net/controller/ui/tabs.py +17 -0
- pygpt_net/core/agents/runners/llama_workflow.py +0 -0
- pygpt_net/core/filesystem/parser.py +37 -24
- pygpt_net/core/filesystem/url.py +5 -2
- pygpt_net/data/config/config.json +4 -3
- pygpt_net/data/config/models.json +3 -3
- pygpt_net/data/config/settings.json +41 -2
- pygpt_net/data/js/app/ui.js +1 -1
- pygpt_net/data/js/app.min.js +2 -2
- pygpt_net/data/locale/locale.de.ini +5 -1
- pygpt_net/data/locale/locale.en.ini +5 -1
- pygpt_net/data/locale/locale.es.ini +5 -1
- pygpt_net/data/locale/locale.fr.ini +5 -1
- pygpt_net/data/locale/locale.it.ini +5 -1
- pygpt_net/data/locale/locale.pl.ini +5 -1
- pygpt_net/data/locale/locale.uk.ini +5 -1
- pygpt_net/data/locale/locale.zh.ini +5 -1
- pygpt_net/data/locale/plugin.cmd_system.en.ini +68 -0
- pygpt_net/js_rc.py +5 -5
- pygpt_net/plugin/base/plugin.py +3 -5
- pygpt_net/plugin/cmd_system/config.py +377 -1
- pygpt_net/plugin/cmd_system/plugin.py +52 -8
- pygpt_net/plugin/cmd_system/runner.py +508 -32
- pygpt_net/plugin/cmd_system/winapi.py +481 -0
- pygpt_net/plugin/cmd_system/worker.py +88 -15
- pygpt_net/provider/agents/llama_index/workflow/supervisor.py +0 -0
- pygpt_net/provider/core/config/patch.py +8 -1
- pygpt_net/provider/llms/openai.py +6 -4
- pygpt_net/tools/code_interpreter/ui/html.py +2 -1
- pygpt_net/tools/html_canvas/ui/widgets.py +19 -18
- pygpt_net/tools/web_browser/__init__.py +12 -0
- pygpt_net/tools/web_browser/tool.py +232 -0
- pygpt_net/tools/web_browser/ui/__init__.py +0 -0
- pygpt_net/tools/web_browser/ui/dialogs.py +123 -0
- pygpt_net/tools/web_browser/ui/widgets.py +351 -0
- pygpt_net/ui/widget/textarea/html.py +172 -24
- pygpt_net/ui/widget/textarea/web.py +1 -1
- {pygpt_net-2.6.57.dist-info → pygpt_net-2.6.59.dist-info}/METADATA +81 -61
- {pygpt_net-2.6.57.dist-info → pygpt_net-2.6.59.dist-info}/RECORD +45 -39
- {pygpt_net-2.6.57.dist-info → pygpt_net-2.6.59.dist-info}/LICENSE +0 -0
- {pygpt_net-2.6.57.dist-info → pygpt_net-2.6.59.dist-info}/WHEEL +0 -0
- {pygpt_net-2.6.57.dist-info → pygpt_net-2.6.59.dist-info}/entry_points.txt +0 -0
pygpt_net/CHANGELOG.txt
CHANGED
|
@@ -1,3 +1,13 @@
|
|
|
1
|
+
2.6.59 (2025-09-23)
|
|
2
|
+
|
|
3
|
+
- LlamaIndex has been upgraded to v0.13.6.
|
|
4
|
+
- The Responses API is disabled by default in Agents (LlamaIndex) for compatibility.
|
|
5
|
+
- Added WinAPI support to the System (OS) plugin.
|
|
6
|
+
|
|
7
|
+
2.6.58 (2025-09-22)
|
|
8
|
+
|
|
9
|
+
- Added: internal Web Browser tool.
|
|
10
|
+
|
|
1
11
|
2.6.57 (2025-09-22)
|
|
2
12
|
|
|
3
13
|
- Changed: The web search icon has been moved to the input area.
|
pygpt_net/__init__.py
CHANGED
|
@@ -6,15 +6,15 @@
|
|
|
6
6
|
# GitHub: https://github.com/szczyglis-dev/py-gpt #
|
|
7
7
|
# MIT License #
|
|
8
8
|
# Created By : Marcin Szczygliński #
|
|
9
|
-
# Updated Date: 2025.09.
|
|
9
|
+
# Updated Date: 2025.09.23 00:00:00 #
|
|
10
10
|
# ================================================== #
|
|
11
11
|
|
|
12
12
|
__author__ = "Marcin Szczygliński"
|
|
13
13
|
__copyright__ = "Copyright 2025, Marcin Szczygliński"
|
|
14
14
|
__credits__ = ["Marcin Szczygliński"]
|
|
15
15
|
__license__ = "MIT"
|
|
16
|
-
__version__ = "2.6.
|
|
17
|
-
__build__ = "2025-09-
|
|
16
|
+
__version__ = "2.6.59"
|
|
17
|
+
__build__ = "2025-09-23"
|
|
18
18
|
__maintainer__ = "Marcin Szczygliński"
|
|
19
19
|
__github__ = "https://github.com/szczyglis-dev/py-gpt"
|
|
20
20
|
__report__ = "https://github.com/szczyglis-dev/py-gpt/issues"
|
pygpt_net/app.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.09.22
|
|
9
|
+
# Updated Date: 2025.09.22 19:00:00 #
|
|
10
10
|
# ================================================== #
|
|
11
11
|
|
|
12
12
|
import os
|
|
@@ -203,13 +203,14 @@ from pygpt_net.tools.media_player import MediaPlayer as MediaPlayerTool
|
|
|
203
203
|
from pygpt_net.tools.text_editor import TextEditor as TextEditorTool
|
|
204
204
|
from pygpt_net.tools.html_canvas import HtmlCanvas as HtmlCanvasTool
|
|
205
205
|
from pygpt_net.tools.translator import Translator as TranslatorTool
|
|
206
|
+
from pygpt_net.tools.web_browser import WebBrowser as WebBrowserTool
|
|
206
207
|
# from pygpt_net.tools.agent_builder import AgentBuilder as AgentBuilderTool
|
|
207
208
|
|
|
208
209
|
def run(**kwargs):
|
|
209
210
|
"""
|
|
210
|
-
PyGPT
|
|
211
|
+
PyGPT Launcher
|
|
211
212
|
|
|
212
|
-
:param kwargs:
|
|
213
|
+
:param kwargs: Keyword arguments for the launcher.
|
|
213
214
|
|
|
214
215
|
PyGPT can be extended with:
|
|
215
216
|
|
|
@@ -223,46 +224,48 @@ def run(**kwargs):
|
|
|
223
224
|
- Custom tools
|
|
224
225
|
- Custom agents
|
|
225
226
|
|
|
226
|
-
|
|
227
|
-
|
|
227
|
+
You can provide custom plugin instances, LLM wrappers, vector store providers, and more to the launcher.
|
|
228
|
+
This is useful for extending PyGPT with your own plugins, vector storage, LLMs, or other data providers.
|
|
228
229
|
|
|
229
|
-
|
|
230
|
+
--- HOW TO REGISTER CUSTOM EXTENSIONS ---
|
|
230
231
|
|
|
231
|
-
|
|
232
|
+
1. First, create a custom launcher file, such as "custom_launcher.py," and register your extensions in it.
|
|
232
233
|
|
|
233
|
-
|
|
234
|
+
To register a custom plugin, create the custom launcher (e.g., "custom_launcher.py") and:
|
|
235
|
+
|
|
236
|
+
- Pass a list containing the plugin instances as the `plugins` keyword argument.
|
|
234
237
|
|
|
235
238
|
To register a custom LLM wrapper:
|
|
236
239
|
|
|
237
|
-
- Pass a list
|
|
240
|
+
- Pass a list containing the LLM wrapper instances as the `llms` keyword argument.
|
|
238
241
|
|
|
239
242
|
To register a custom vector store provider:
|
|
240
243
|
|
|
241
|
-
- Pass a list
|
|
244
|
+
- Pass a list containing the vector store provider instances as the `vector_stores` keyword argument.
|
|
242
245
|
|
|
243
246
|
To register a custom data loader:
|
|
244
247
|
|
|
245
|
-
- Pass a list
|
|
248
|
+
- Pass a list containing the data loader instances as the `loaders` keyword argument.
|
|
246
249
|
|
|
247
250
|
To register a custom audio input provider:
|
|
248
251
|
|
|
249
|
-
- Pass a list
|
|
252
|
+
- Pass a list containing the audio input provider instances as the `audio_input` keyword argument.
|
|
250
253
|
|
|
251
254
|
To register a custom audio output provider:
|
|
252
255
|
|
|
253
|
-
- Pass a list
|
|
256
|
+
- Pass a list containing the audio output provider instances as the `audio_output` keyword argument.
|
|
254
257
|
|
|
255
258
|
To register a custom web provider:
|
|
256
259
|
|
|
257
|
-
- Pass a list
|
|
260
|
+
- Pass a list containing the web provider instances as the `web` keyword argument.
|
|
258
261
|
|
|
259
262
|
To register a custom agent:
|
|
260
263
|
|
|
261
|
-
- Pass a list
|
|
264
|
+
- Pass a list containing the agent instances as the `agents` keyword argument.
|
|
262
265
|
|
|
263
266
|
To register a custom tool:
|
|
264
267
|
|
|
265
|
-
- Pass a list
|
|
268
|
+
- Pass a list containing the tool instances as the `tools` keyword argument.
|
|
266
269
|
|
|
267
270
|
Example:
|
|
268
271
|
--------
|
|
@@ -271,15 +274,16 @@ def run(**kwargs):
|
|
|
271
274
|
# custom_launcher.py
|
|
272
275
|
|
|
273
276
|
from pygpt_net.app import run
|
|
274
|
-
|
|
275
|
-
from
|
|
276
|
-
from
|
|
277
|
-
from
|
|
278
|
-
from
|
|
279
|
-
from
|
|
280
|
-
from
|
|
281
|
-
from
|
|
282
|
-
from
|
|
277
|
+
|
|
278
|
+
from .my_plugins import CustomPlugin, OtherCustomPlugin
|
|
279
|
+
from .my_llms import CustomLLM
|
|
280
|
+
from .my_vector_stores import CustomVectorStore
|
|
281
|
+
from .my_loaders import CustomLoader
|
|
282
|
+
from .my_audio_input import CustomAudioInput
|
|
283
|
+
from .my_audio_output import CustomAudioOutput
|
|
284
|
+
from .my_web import CustomWebSearch
|
|
285
|
+
from .my_tools import CustomTool
|
|
286
|
+
from .my_agents import CustomAgent
|
|
283
287
|
|
|
284
288
|
plugins = [
|
|
285
289
|
CustomPlugin(),
|
|
@@ -511,6 +515,7 @@ def run(**kwargs):
|
|
|
511
515
|
launcher.add_tool(CodeInterpreterTool())
|
|
512
516
|
launcher.add_tool(HtmlCanvasTool())
|
|
513
517
|
launcher.add_tool(TranslatorTool())
|
|
518
|
+
launcher.add_tool(WebBrowserTool())
|
|
514
519
|
# launcher.add_tool(AgentBuilderTool())
|
|
515
520
|
|
|
516
521
|
# register custom tools
|
|
@@ -6,7 +6,7 @@
|
|
|
6
6
|
# GitHub: https://github.com/szczyglis-dev/py-gpt #
|
|
7
7
|
# MIT License #
|
|
8
8
|
# Created By : Marcin Szczygliński #
|
|
9
|
-
# Updated Date: 2025.09.
|
|
9
|
+
# Updated Date: 2025.09.22 19:00:00 #
|
|
10
10
|
# ================================================== #
|
|
11
11
|
|
|
12
12
|
from datetime import datetime
|
|
@@ -74,8 +74,8 @@ class Debug(QObject):
|
|
|
74
74
|
|
|
75
75
|
:param url: debug URL
|
|
76
76
|
"""
|
|
77
|
-
self.window.tools.get("
|
|
78
|
-
self.window.tools.get("
|
|
77
|
+
self.window.tools.get("web_browser").set_url(url)
|
|
78
|
+
self.window.tools.get("web_browser").auto_open(load=False)
|
|
79
79
|
|
|
80
80
|
def open_dev_tools(self) -> None:
|
|
81
81
|
"""
|
|
@@ -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.
|
|
9
|
+
# Updated Date: 2025.09.22 19:00:00 #
|
|
10
10
|
# ================================================== #
|
|
11
11
|
|
|
12
12
|
from PySide6.QtCore import QUrl
|
|
@@ -69,7 +69,11 @@ class Info:
|
|
|
69
69
|
:param url: URL to open
|
|
70
70
|
"""
|
|
71
71
|
if url:
|
|
72
|
-
|
|
72
|
+
if self.window.core.config.get("ctx.urls.internal", False):
|
|
73
|
+
self.window.tools.get("web_browser").set_url(url)
|
|
74
|
+
self.window.tools.get("web_browser").auto_open(load=False)
|
|
75
|
+
else:
|
|
76
|
+
QDesktopServices.openUrl(QUrl(url))
|
|
73
77
|
|
|
74
78
|
def goto_website(self):
|
|
75
79
|
"""Open project website"""
|
pygpt_net/controller/ui/tabs.py
CHANGED
|
@@ -688,6 +688,23 @@ class Tabs:
|
|
|
688
688
|
self.window.core.tabs.update_title(idx, title, tooltip)
|
|
689
689
|
self.debug()
|
|
690
690
|
|
|
691
|
+
def update_title_by_tab(self, tab: Tab, title: str):
|
|
692
|
+
"""
|
|
693
|
+
Update tab title by Tab instance
|
|
694
|
+
|
|
695
|
+
:param tab: Tab instance
|
|
696
|
+
:param title: new title
|
|
697
|
+
"""
|
|
698
|
+
if tab is None:
|
|
699
|
+
return
|
|
700
|
+
tabs = self.window.ui.layout.get_tabs_by_idx(tab.column_idx)
|
|
701
|
+
tooltip = title
|
|
702
|
+
tabs.setTabToolTip(tab.idx, tooltip)
|
|
703
|
+
if len(title) > self.TAB_CHAT_MAX_CHARS:
|
|
704
|
+
title = title[:self.TAB_CHAT_MAX_CHARS] + '...'
|
|
705
|
+
tabs.setTabText(tab.idx, title)
|
|
706
|
+
self.debug()
|
|
707
|
+
|
|
691
708
|
def update_title_current(self, title: str):
|
|
692
709
|
"""
|
|
693
710
|
Update current tab title
|
|
File without changes
|
|
@@ -26,28 +26,44 @@ class Parser:
|
|
|
26
26
|
|
|
27
27
|
def extract_data_paths(self, text: str) -> list:
|
|
28
28
|
"""
|
|
29
|
-
Extract file paths from text that contain 'data' segment.
|
|
30
|
-
|
|
31
|
-
:param text: input text
|
|
32
|
-
:return: list of file paths containing 'data' segment
|
|
29
|
+
Extract file paths from text that contain 'data' segment (case-insensitive).
|
|
30
|
+
Supports quoted and unquoted paths, POSIX/Windows, and ignores URLs.
|
|
33
31
|
"""
|
|
34
|
-
if text
|
|
32
|
+
if not text:
|
|
35
33
|
return []
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
34
|
+
|
|
35
|
+
def is_data_path(p: str) -> bool:
|
|
36
|
+
# 'data' (case-insensitive)
|
|
37
|
+
return re.search(r"(?i)(?:^|[\\/])data(?:[\\/]|$)", p) is not None
|
|
38
|
+
|
|
39
|
+
def is_url(p: str) -> bool:
|
|
40
|
+
return re.match(r"^[a-z][a-z0-9+.-]*://", p, re.I) is not None
|
|
41
|
+
|
|
42
|
+
results = []
|
|
43
|
+
|
|
44
|
+
quoted_pat = re.compile(r"(?P<q>['\"])(?P<p>(?:[A-Za-z]:)?[\\/](?:(?!\1).)+?)\1")
|
|
45
|
+
for m in quoted_pat.finditer(text):
|
|
46
|
+
p = m.group("p").strip()
|
|
47
|
+
if not is_url(p) and is_data_path(p):
|
|
48
|
+
results.append(p)
|
|
49
|
+
|
|
50
|
+
unquoted_pat = re.compile(r"(?P<p>(?:[A-Za-z]:)?(?:[\\/][^\s'\"),;]+)+)")
|
|
51
|
+
for m in unquoted_pat.finditer(text):
|
|
52
|
+
p = m.group("p").strip()
|
|
53
|
+
if not is_url(p) and is_data_path(p):
|
|
54
|
+
results.append(p)
|
|
55
|
+
|
|
56
|
+
seen = set()
|
|
57
|
+
out = []
|
|
58
|
+
for p in results:
|
|
59
|
+
if p not in seen:
|
|
60
|
+
seen.add(p)
|
|
61
|
+
out.append(p)
|
|
62
|
+
return out
|
|
63
|
+
|
|
64
|
+
def extract_data_files(self, ctx: "CtxItem", response: str) -> list:
|
|
45
65
|
"""
|
|
46
66
|
Extract files from tool outputs and return list of file paths.
|
|
47
|
-
|
|
48
|
-
:param ctx: CtxItem
|
|
49
|
-
:param response: response text containing file paths
|
|
50
|
-
:return: list of file paths
|
|
51
67
|
"""
|
|
52
68
|
if response is None:
|
|
53
69
|
return []
|
|
@@ -58,14 +74,11 @@ class Parser:
|
|
|
58
74
|
def replace_with_local(path):
|
|
59
75
|
"""
|
|
60
76
|
Replace the path with local data directory path.
|
|
61
|
-
|
|
62
|
-
:param path: original path
|
|
63
|
-
:return: modified path
|
|
64
77
|
"""
|
|
65
78
|
segments = re.split(r"[\\/]+", path)
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
79
|
+
# case-insensitive find of 'data'
|
|
80
|
+
data_index = next((i for i, s in enumerate(segments) if s.lower() == "data"), None)
|
|
81
|
+
if data_index is None:
|
|
69
82
|
return path
|
|
70
83
|
tail = segments[data_index + 1:]
|
|
71
84
|
new_path = os.path.join(local_data_dir, *tail) if tail else local_data_dir
|
pygpt_net/core/filesystem/url.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:
|
|
9
|
+
# Updated Date: 2025.09.22 19:00:00 #
|
|
10
10
|
# ================================================== #
|
|
11
11
|
|
|
12
12
|
from PySide6.QtCore import QUrl
|
|
@@ -85,7 +85,10 @@ class Url:
|
|
|
85
85
|
elif url.scheme() == 'extra-code-copy': # copy code block
|
|
86
86
|
id = url.toString().split(':')[1]
|
|
87
87
|
self.window.controller.ctx.extra.copy_code_block(int(id))
|
|
88
|
-
|
|
89
88
|
else:
|
|
90
89
|
# external link
|
|
90
|
+
if url.scheme().startswith('http'):
|
|
91
|
+
self.window.controller.dialogs.info.open_url(url.toString())
|
|
92
|
+
return
|
|
93
|
+
|
|
91
94
|
QDesktopServices.openUrl(url)
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
{
|
|
2
2
|
"__meta__": {
|
|
3
|
-
"version": "2.6.
|
|
4
|
-
"app.version": "2.6.
|
|
5
|
-
"updated_at": "2025-09-
|
|
3
|
+
"version": "2.6.59",
|
|
4
|
+
"app.version": "2.6.59",
|
|
5
|
+
"updated_at": "2025-09-23T00:00:00"
|
|
6
6
|
},
|
|
7
7
|
"access.audio.event.speech": false,
|
|
8
8
|
"access.audio.event.speech.disabled": [],
|
|
@@ -164,6 +164,7 @@
|
|
|
164
164
|
"ctx.search_content": true,
|
|
165
165
|
"ctx.search.string": "",
|
|
166
166
|
"ctx.sources": true,
|
|
167
|
+
"ctx.urls.internal": false,
|
|
167
168
|
"ctx.use_extra": true,
|
|
168
169
|
"current_model": {
|
|
169
170
|
"assistant": "gpt-4o",
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
{
|
|
2
2
|
"__meta__": {
|
|
3
|
-
"version": "2.6.
|
|
4
|
-
"app.version": "2.6.
|
|
5
|
-
"updated_at": "2025-09-
|
|
3
|
+
"version": "2.6.59",
|
|
4
|
+
"app.version": "2.6.59",
|
|
5
|
+
"updated_at": "2025-09-23T00:00:00"
|
|
6
6
|
},
|
|
7
7
|
"items": {
|
|
8
8
|
"SpeakLeash/bielik-11b-v2.3-instruct:Q4_K_M": {
|
|
@@ -14,7 +14,7 @@
|
|
|
14
14
|
"bold": true
|
|
15
15
|
},
|
|
16
16
|
"urls": {
|
|
17
|
-
"
|
|
17
|
+
"API Keys": "https://platform.openai.com/account/api-keys"
|
|
18
18
|
},
|
|
19
19
|
"secret": true,
|
|
20
20
|
"persist": true,
|
|
@@ -98,6 +98,9 @@
|
|
|
98
98
|
"extra": {
|
|
99
99
|
"bold": true
|
|
100
100
|
},
|
|
101
|
+
"urls": {
|
|
102
|
+
"API Keys": "https://aistudio.google.com/app/apikey"
|
|
103
|
+
},
|
|
101
104
|
"secret": true,
|
|
102
105
|
"persist": true,
|
|
103
106
|
"advanced": false,
|
|
@@ -207,6 +210,9 @@
|
|
|
207
210
|
"extra": {
|
|
208
211
|
"bold": true
|
|
209
212
|
},
|
|
213
|
+
"urls": {
|
|
214
|
+
"API Keys": "https://platform.claude.com/settings/keys"
|
|
215
|
+
},
|
|
210
216
|
"secret": true,
|
|
211
217
|
"persist": true,
|
|
212
218
|
"advanced": false,
|
|
@@ -256,6 +262,9 @@
|
|
|
256
262
|
"extra": {
|
|
257
263
|
"bold": true
|
|
258
264
|
},
|
|
265
|
+
"urls": {
|
|
266
|
+
"API Keys": "https://huggingface.co/settings/tokens"
|
|
267
|
+
},
|
|
259
268
|
"secret": true,
|
|
260
269
|
"persist": true,
|
|
261
270
|
"advanced": false,
|
|
@@ -290,6 +299,9 @@
|
|
|
290
299
|
"extra": {
|
|
291
300
|
"bold": true
|
|
292
301
|
},
|
|
302
|
+
"urls": {
|
|
303
|
+
"API Keys": "https://platform.deepseek.com/api_keys"
|
|
304
|
+
},
|
|
293
305
|
"secret": true,
|
|
294
306
|
"persist": true,
|
|
295
307
|
"advanced": false,
|
|
@@ -324,6 +336,9 @@
|
|
|
324
336
|
"extra": {
|
|
325
337
|
"bold": true
|
|
326
338
|
},
|
|
339
|
+
"urls": {
|
|
340
|
+
"API Keys": "https://console.x.ai"
|
|
341
|
+
},
|
|
327
342
|
"secret": true,
|
|
328
343
|
"persist": true,
|
|
329
344
|
"advanced": false,
|
|
@@ -405,6 +420,9 @@
|
|
|
405
420
|
"extra": {
|
|
406
421
|
"bold": true
|
|
407
422
|
},
|
|
423
|
+
"urls": {
|
|
424
|
+
"API Keys": "https://www.perplexity.ai/account/api/keys"
|
|
425
|
+
},
|
|
408
426
|
"secret": true,
|
|
409
427
|
"persist": true,
|
|
410
428
|
"advanced": false,
|
|
@@ -439,6 +457,9 @@
|
|
|
439
457
|
"extra": {
|
|
440
458
|
"bold": true
|
|
441
459
|
},
|
|
460
|
+
"urls": {
|
|
461
|
+
"API Keys": "https://admin.mistral.ai/organization/api-keys"
|
|
462
|
+
},
|
|
442
463
|
"secret": true,
|
|
443
464
|
"persist": true,
|
|
444
465
|
"advanced": false,
|
|
@@ -473,6 +494,9 @@
|
|
|
473
494
|
"extra": {
|
|
474
495
|
"bold": true
|
|
475
496
|
},
|
|
497
|
+
"urls": {
|
|
498
|
+
"API Keys": "https://dashboard.voyageai.com/organization/api-keys"
|
|
499
|
+
},
|
|
476
500
|
"secret": true,
|
|
477
501
|
"persist": true,
|
|
478
502
|
"advanced": false,
|
|
@@ -492,6 +516,9 @@
|
|
|
492
516
|
"extra": {
|
|
493
517
|
"bold": true
|
|
494
518
|
},
|
|
519
|
+
"urls": {
|
|
520
|
+
"API Keys": "https://openrouter.ai/settings/keys"
|
|
521
|
+
},
|
|
495
522
|
"secret": true,
|
|
496
523
|
"persist": true,
|
|
497
524
|
"advanced": false,
|
|
@@ -1139,7 +1166,19 @@
|
|
|
1139
1166
|
"step": null,
|
|
1140
1167
|
"advanced": false
|
|
1141
1168
|
},
|
|
1142
|
-
|
|
1169
|
+
"ctx.urls.internal": {
|
|
1170
|
+
"section": "ctx",
|
|
1171
|
+
"type": "bool",
|
|
1172
|
+
"slider": false,
|
|
1173
|
+
"label": "settings.ctx.urls.internal",
|
|
1174
|
+
"description": "settings.ctx.urls.internal.desc",
|
|
1175
|
+
"value": true,
|
|
1176
|
+
"min": null,
|
|
1177
|
+
"max": null,
|
|
1178
|
+
"multiplier": null,
|
|
1179
|
+
"step": null,
|
|
1180
|
+
"secret": false
|
|
1181
|
+
},
|
|
1143
1182
|
"ctx.convert_lists": {
|
|
1144
1183
|
"section": "ctx",
|
|
1145
1184
|
"type": "bool",
|
pygpt_net/data/js/app/ui.js
CHANGED
|
@@ -46,7 +46,7 @@ class UIManager {
|
|
|
46
46
|
'.msg-box.msg-user .msg .msg-copy-btn { position: absolute; top: 2px; right: 0px; z-index: 3;',
|
|
47
47
|
' opacity: 0; pointer-events: none; transition: opacity .15s ease, transform .15s ease, background-color .15s ease, border-color .15s ease;',
|
|
48
48
|
' border-radius: 6px; padding: 4px; line-height: 0; border: 1px solid transparent; background: transparent; }',
|
|
49
|
-
'.msg-box.msg-user
|
|
49
|
+
'.msg-box.msg-user .msg:hover .msg-copy-btn, .msg-box.msg-user .msg:focus-within .msg-copy-btn { opacity: 1; pointer-events: auto; }',
|
|
50
50
|
'.msg-box.msg-user .msg .msg-copy-btn:hover { transform: scale(1.06); background: var(--copy-btn-bg-hover, rgba(0,0,0,.86)); border-color: var(--copy-btn-border, rgba(0,0,0,.08)); }',
|
|
51
51
|
'.msg-box.msg-user .msg .msg-copy-btn.copied { background: var(--copy-btn-bg-copied, rgba(150,150,150,.12)); border-color: var(--copy-btn-border-copied, rgba(150,150,150,.35)); animation: msg-copy-pop .25s ease; }',
|
|
52
52
|
'.msg-box.msg-user .msg .msg-copy-btn img { display: block; width: 18px; height: 18px; }',
|
pygpt_net/data/js/app.min.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
/* app.min.js — generated on 2025-09-22
|
|
1
|
+
/* app.min.js — generated on 2025-09-22 22:18:13 by bin/minify_js.py using rjsmin */
|
|
2
2
|
|
|
3
3
|
/* data/js/app/async.js */
|
|
4
4
|
class AsyncRunner{constructor(cfg,raf){this.cfg=cfg||{};this.raf=raf||null;const A=this.cfg.ASYNC||{};this.SLICE_MS=Utils.g('ASYNC_SLICE_MS',A.SLICE_MS??12);this.SLICE_HIDDEN_MS=Utils.g('ASYNC_SLICE_HIDDEN_MS',A.SLICE_HIDDEN_MS??Math.min(this.SLICE_MS,6));this.MIN_YIELD_MS=Utils.g('ASYNC_MIN_YIELD_MS',A.MIN_YIELD_MS??0);this._opGen=new Map();}
|
|
@@ -803,7 +803,7 @@ toggle(id){const el=document.getElementById('msg-bot-'+id);if(!el)return;const o
|
|
|
803
803
|
/* data/js/app/ui.js */
|
|
804
804
|
class UIManager{updateCSS(styles){let style=document.getElementById('app-style');if(!style){style=document.createElement('style');style.id='app-style';document.head.appendChild(style);}
|
|
805
805
|
style.textContent=styles;}
|
|
806
|
-
ensureStickyHeaderStyle(){let style=document.getElementById('code-sticky-style');if(style)return;style=document.createElement('style');style.id='code-sticky-style';style.textContent=['.code-wrapper { position: relative; }','.code-wrapper .code-header-wrapper { position: sticky; top: var(--code-header-sticky-top, -2px); z-index: 2; box-shadow: 0 1px 0 rgba(0,0,0,.06); }','.code-wrapper pre { overflow: visible; margin-top: 0; }','.code-wrapper pre code { display: block; white-space: pre; max-height: 100dvh; overflow: auto;',' overscroll-behavior: contain; -webkit-overflow-scrolling: touch; overflow-anchor: none; scrollbar-gutter: stable both-edges; scroll-behavior: auto; }','#_loader_.hidden { display: none !important; visibility: hidden !important; }','#_loader_.visible { display: block; visibility: visible; }','.msg-box.msg-user .msg { position: relative; }','.msg-box.msg-user .msg > .uc-content { display: block; overflow: visible; }','.msg-box.msg-user .msg > .uc-content.uc-collapsed { max-height: 1000px; overflow: hidden; }','.msg-box.msg-user .msg > .uc-toggle { display: none; margin-top: 8px; text-align: center; cursor: pointer; user-select: none; }','.msg-box.msg-user .msg > .uc-toggle.visible { display: block; }','.msg-box.msg-user .msg > .uc-toggle img { width: var(--uc-toggle-icon-size, 26px); height: var(--uc-toggle-icon-size, 26px); opacity: .8; }','.msg-box.msg-user .msg > .uc-toggle:hover img { opacity: 1; }','.msg-box.msg-user .msg .msg-copy-btn { position: absolute; top: 2px; right: 0px; z-index: 3;',' opacity: 0; pointer-events: none; transition: opacity .15s ease, transform .15s ease, background-color .15s ease, border-color .15s ease;',' border-radius: 6px; padding: 4px; line-height: 0; border: 1px solid transparent; background: transparent; }','.msg-box.msg-user
|
|
806
|
+
ensureStickyHeaderStyle(){let style=document.getElementById('code-sticky-style');if(style)return;style=document.createElement('style');style.id='code-sticky-style';style.textContent=['.code-wrapper { position: relative; }','.code-wrapper .code-header-wrapper { position: sticky; top: var(--code-header-sticky-top, -2px); z-index: 2; box-shadow: 0 1px 0 rgba(0,0,0,.06); }','.code-wrapper pre { overflow: visible; margin-top: 0; }','.code-wrapper pre code { display: block; white-space: pre; max-height: 100dvh; overflow: auto;',' overscroll-behavior: contain; -webkit-overflow-scrolling: touch; overflow-anchor: none; scrollbar-gutter: stable both-edges; scroll-behavior: auto; }','#_loader_.hidden { display: none !important; visibility: hidden !important; }','#_loader_.visible { display: block; visibility: visible; }','.msg-box.msg-user .msg { position: relative; }','.msg-box.msg-user .msg > .uc-content { display: block; overflow: visible; }','.msg-box.msg-user .msg > .uc-content.uc-collapsed { max-height: 1000px; overflow: hidden; }','.msg-box.msg-user .msg > .uc-toggle { display: none; margin-top: 8px; text-align: center; cursor: pointer; user-select: none; }','.msg-box.msg-user .msg > .uc-toggle.visible { display: block; }','.msg-box.msg-user .msg > .uc-toggle img { width: var(--uc-toggle-icon-size, 26px); height: var(--uc-toggle-icon-size, 26px); opacity: .8; }','.msg-box.msg-user .msg > .uc-toggle:hover img { opacity: 1; }','.msg-box.msg-user .msg .msg-copy-btn { position: absolute; top: 2px; right: 0px; z-index: 3;',' opacity: 0; pointer-events: none; transition: opacity .15s ease, transform .15s ease, background-color .15s ease, border-color .15s ease;',' border-radius: 6px; padding: 4px; line-height: 0; border: 1px solid transparent; background: transparent; }','.msg-box.msg-user .msg:hover .msg-copy-btn, .msg-box.msg-user .msg:focus-within .msg-copy-btn { opacity: 1; pointer-events: auto; }','.msg-box.msg-user .msg .msg-copy-btn:hover { transform: scale(1.06); background: var(--copy-btn-bg-hover, rgba(0,0,0,.86)); border-color: var(--copy-btn-border, rgba(0,0,0,.08)); }','.msg-box.msg-user .msg .msg-copy-btn.copied { background: var(--copy-btn-bg-copied, rgba(150,150,150,.12)); border-color: var(--copy-btn-border-copied, rgba(150,150,150,.35)); animation: msg-copy-pop .25s ease; }','.msg-box.msg-user .msg .msg-copy-btn img { display: block; width: 18px; height: 18px; }','.code-wrapper .code-header-action.code-header-copy,','.code-wrapper .code-header-action.code-header-collapse { display: inline-flex; align-items: center; border-radius: 6px; padding: 2px; line-height: 0; border: 1px solid transparent; transition: transform .15s ease, background-color .15s ease, border-color .15s ease; }','.code-wrapper .code-header-action.code-header-copy:hover,','.code-wrapper .code-header-action.code-header-collapse:hover { transform: scale(1.06); background: var(--copy-btn-bg-hover, rgba(0,0,0,.76)); border-color: var(--copy-btn-border, rgba(0,0,0,.08)); }','.code-wrapper .code-header-action.copied { background: var(--copy-btn-bg-copied, rgba(150,150,150,.12)); border-color: var(--copy-btn-border-copied, rgba(150,150,150,.35)); animation: msg-copy-pop .25s ease; }','@keyframes msg-copy-pop { 0%{ transform: scale(1); } 60%{ transform: scale(1.1); } 100%{ transform: scale(1); } }'].join('\n');document.head.appendChild(style);}
|
|
807
807
|
enableEditIcons(){document.body&&document.body.classList.add('display-edit-icons');}
|
|
808
808
|
disableEditIcons(){document.body&&document.body.classList.remove('display-edit-icons');}
|
|
809
809
|
enableTimestamp(){document.body&&document.body.classList.add('display-timestamp');}
|
|
@@ -833,6 +833,7 @@ menu.tools.interpreter = Python-Code-Interpreter
|
|
|
833
833
|
menu.tools.media.player = Mediaplayer
|
|
834
834
|
menu.tools.text.editor = Texteditor
|
|
835
835
|
menu.tools.translator = Übersetzer
|
|
836
|
+
menu.tools.web_browser = Webbrowser (Chromium)
|
|
836
837
|
menu.tray.notepad = Notepad öffnen...
|
|
837
838
|
menu.tray.scheduled = Geplante Aufträge
|
|
838
839
|
menu.tray.screenshot = Fragen mit Screenshot...
|
|
@@ -1107,8 +1108,8 @@ settings.api_key.perplexity.desc = Erforderlich für die Perplexity API.
|
|
|
1107
1108
|
settings.api_key.xai = xAI API-SCHLÜSSEL
|
|
1108
1109
|
settings.api_key.xai.desc = Erforderlich für die xAI API und Grok-Modelle.
|
|
1109
1110
|
settings.api_proxy = Proxy verwenden
|
|
1110
|
-
settings.api_proxy.enabled = Proxy-Adresse
|
|
1111
1111
|
settings.api_proxy.desc = Optional, Proxy für API SDK, z.B. http://proxy.example.com oder socks5://user:pass@host:port
|
|
1112
|
+
settings.api_proxy.enabled = Proxy-Adresse
|
|
1112
1113
|
settings.api_proxy.enabled.desc = Aktivieren Sie diese Option, um einen Proxy für Verbindungen zu APIs zu verwenden
|
|
1113
1114
|
settings.api_use_responses = Verwenden Sie die Responses API im Chat-Modus
|
|
1114
1115
|
settings.api_use_responses.desc = Verwenden Sie die Responses API anstelle der ChatCompletions API im Chat-Modus
|
|
@@ -1182,6 +1183,8 @@ settings.ctx.search_content = Suche auch im Inhalt der Gespräche, nicht nur in
|
|
|
1182
1183
|
settings.ctx.search.desc = Aktiviere die Suche auch im Inhalt der Kontextelemente
|
|
1183
1184
|
settings.ctx.sources = Zeige Llama-Indexquellen
|
|
1184
1185
|
settings.ctx.sources.desc = Falls aktiviert, werden die genutzten Quellen in der Antwort angezeigt (falls verfügbar, funktioniert nicht im gestreamten Chat)
|
|
1186
|
+
settings.ctx.urls.internal = Öffne URLs im integrierten Browser
|
|
1187
|
+
settings.ctx.urls.internal.desc = Aktivieren Sie diese Option, um alle URLs im integrierten Browser (Chromium) und nicht in einem externen Browser zu öffnen.
|
|
1185
1188
|
settings.ctx.use_extra = Verwenden Sie zusätzlichen Kontextoutput
|
|
1186
1189
|
settings.ctx.use_extra.desc = Wenn aktiviert, wird die einfache Textausgabe (falls verfügbar) aus den Befehlsausgaben zusätzlich zur JSON-Ausgabe angezeigt.
|
|
1187
1190
|
settings.debug.show_menu = Debug-Menü anzeigen
|
|
@@ -1546,6 +1549,7 @@ tool.indexer.tab.web.loader = Datenlader
|
|
|
1546
1549
|
tool.indexer.tab.web.source = Datenquelle
|
|
1547
1550
|
tool.indexer.tab.web.tip = Wählen Sie einen Datenlader aus und definieren Sie die Laderparameter, um externe Daten aus dem Web einzubetten.
|
|
1548
1551
|
tool.indexer.title = Indexierer
|
|
1552
|
+
tool.web_browser.security.footer = SICHERHEITSHINWEIS: Zu Ihrem Schutz vermeiden Sie die Verwendung des integrierten Browsers für sensible oder kritische Aufgaben. Er ist nur für grundlegende Nutzung gedacht.
|
|
1549
1553
|
translator.btn.left = Übersetzen >>
|
|
1550
1554
|
translator.btn.right = << Übersetzen
|
|
1551
1555
|
translator.clear.confirm = Übersetzerausgabe löschen (beide Spalten)?
|
|
@@ -843,6 +843,7 @@ menu.tools.interpreter = Python Code Interpreter
|
|
|
843
843
|
menu.tools.media.player = Media Player
|
|
844
844
|
menu.tools.text.editor = Text Editor
|
|
845
845
|
menu.tools.translator = Translator
|
|
846
|
+
menu.tools.web_browser = Web Browser (Chromium)
|
|
846
847
|
menu.tray.notepad = Open Notepad...
|
|
847
848
|
menu.tray.scheduled = Scheduled tasks
|
|
848
849
|
menu.tray.screenshot = Ask with screenshot...
|
|
@@ -1149,8 +1150,8 @@ settings.api_native_google.use_vertex.desc = Enable to use VertexAI in Google Ge
|
|
|
1149
1150
|
settings.api_native_xai = Use native API SDK
|
|
1150
1151
|
settings.api_native_xai.desc = Use native xAI SDK instead of compatible OpenAI client
|
|
1151
1152
|
settings.api_proxy = Proxy address
|
|
1152
|
-
settings.api_proxy.enabled = Use proxy
|
|
1153
1153
|
settings.api_proxy.desc = Optional, proxy for API SDKs, e.g. http://proxy.example.com or socks5://user:pass@host:port
|
|
1154
|
+
settings.api_proxy.enabled = Use proxy
|
|
1154
1155
|
settings.api_proxy.enabled.desc = Enable this option to use a proxy for connections to APIs
|
|
1155
1156
|
settings.api_use_responses = Use Responses API in Chat mode
|
|
1156
1157
|
settings.api_use_responses.desc = Use Responses API instead of ChatCompletions API in Chat mode
|
|
@@ -1224,6 +1225,8 @@ settings.ctx.search_content = Search also in conversation content, not only in t
|
|
|
1224
1225
|
settings.ctx.search.desc = Enable search also in context items' content
|
|
1225
1226
|
settings.ctx.sources = Show LlamaIndex sources
|
|
1226
1227
|
settings.ctx.sources.desc = If enabled, sources used will be displayed in the response (if available, it will not work in streamed chat)
|
|
1228
|
+
settings.ctx.urls.internal = Open URLs in built-in browser
|
|
1229
|
+
settings.ctx.urls.internal.desc = Enable this option to open all URLs in the built-in browser (Chromium) instead of an external browser.
|
|
1227
1230
|
settings.ctx.use_extra = Use extra context output
|
|
1228
1231
|
settings.ctx.use_extra.desc = If enabled, plain text output (if available) from command results will be displayed alongside the JSON output.
|
|
1229
1232
|
settings.debug.show_menu = Show debug menu
|
|
@@ -1622,6 +1625,7 @@ tool.indexer.tab.web.loader = Data type
|
|
|
1622
1625
|
tool.indexer.tab.web.source = Data source
|
|
1623
1626
|
tool.indexer.tab.web.tip = Select a data loader and define the loader parameters to embed external data from the web.
|
|
1624
1627
|
tool.indexer.title = Indexer
|
|
1628
|
+
tool.web_browser.security.footer = SECURITY NOTICE: For your protection, avoid using the built-in browser for sensitive or critical tasks. It is intended for basic usage only.
|
|
1625
1629
|
translator.btn.left = Translate >>
|
|
1626
1630
|
translator.btn.right = << Translate
|
|
1627
1631
|
translator.clear.confirm = Clear translator output (both columns)?
|
|
@@ -834,6 +834,7 @@ menu.tools.interpreter = Intérprete de código Python
|
|
|
834
834
|
menu.tools.media.player = Reproductor de medios
|
|
835
835
|
menu.tools.text.editor = Editor de texto
|
|
836
836
|
menu.tools.translator = Traductor
|
|
837
|
+
menu.tools.web_browser = Navegador Web (Chromium)
|
|
837
838
|
menu.tray.notepad = Abrir Bloc de notas...
|
|
838
839
|
menu.tray.scheduled = Trabajos programados
|
|
839
840
|
menu.tray.screenshot = Preguntar con captura de pantalla...
|
|
@@ -1108,8 +1109,8 @@ settings.api_key.perplexity.desc = Requerido para la API Perplexity.
|
|
|
1108
1109
|
settings.api_key.xai = CLAVE API xAI
|
|
1109
1110
|
settings.api_key.xai.desc = Requerido para la API xAI y modelos Grok.
|
|
1110
1111
|
settings.api_proxy = Dirección proxy
|
|
1111
|
-
settings.api_proxy.enabled = Usar proxy
|
|
1112
1112
|
settings.api_proxy.desc = Opcional, proxy para API SDK, por ej. http://proxy.example.com o socks5://user:pass@host:port
|
|
1113
|
+
settings.api_proxy.enabled = Usar proxy
|
|
1113
1114
|
settings.api_proxy.enabled.desc = Habilita esta opción para usar un proxy para las conexiones a las API
|
|
1114
1115
|
settings.api_use_responses = Usar API de Respuestas en modo Chat
|
|
1115
1116
|
settings.api_use_responses.desc = Usar API de Respuestas en lugar de ChatCompletions API en modo Chat
|
|
@@ -1183,6 +1184,8 @@ settings.ctx.search_content = Buscar también en el contenido de las conversacio
|
|
|
1183
1184
|
settings.ctx.search.desc = Habilitar la búsqueda también en el contenido de los elementos de contexto
|
|
1184
1185
|
settings.ctx.sources = Mostrar fuentes del índice Llama
|
|
1185
1186
|
settings.ctx.sources.desc = Si está habilitado, las fuentes utilizadas se mostrarán en la respuesta (si están disponibles, no funcionará en el chat en vivo)
|
|
1187
|
+
settings.ctx.urls.internal = Abrir las URL en el navegador integrado
|
|
1188
|
+
settings.ctx.urls.internal.desc = Active esta opción para abrir todas las URL en el navegador integrado (Chromium) en lugar de un navegador externo.
|
|
1186
1189
|
settings.ctx.use_extra = Usar salida de contexto extra
|
|
1187
1190
|
settings.ctx.use_extra.desc = Si está habilitado, la salida de texto sin formato (si está disponible) de los resultados de los comandos se mostrará junto con la salida JSON.
|
|
1188
1191
|
settings.debug.show_menu = Mostrar menú de depuración
|
|
@@ -1547,6 +1550,7 @@ tool.indexer.tab.web.loader = Cargador
|
|
|
1547
1550
|
tool.indexer.tab.web.source = Fuente de datos
|
|
1548
1551
|
tool.indexer.tab.web.tip = Seleccione un cargador de datos y defina los parámetros del cargador para incrustar datos externos de la web.
|
|
1549
1552
|
tool.indexer.title = Indexador
|
|
1553
|
+
tool.web_browser.security.footer = AVISO DE SEGURIDAD: Para su protección, evite usar el navegador integrado para tareas sensibles o críticas. Está diseñado solo para uso básico.
|
|
1550
1554
|
translator.btn.left = Traducir >>
|
|
1551
1555
|
translator.btn.right = << Traducir
|
|
1552
1556
|
translator.clear.confirm = Borrar salida del traductor (ambas columnas)?
|