pygpt-net 2.6.52__py3-none-any.whl → 2.6.53__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (39) hide show
  1. pygpt_net/CHANGELOG.txt +5 -0
  2. pygpt_net/__init__.py +1 -1
  3. pygpt_net/controller/audio/audio.py +22 -1
  4. pygpt_net/controller/chat/chat.py +5 -1
  5. pygpt_net/controller/chat/remote_tools.py +116 -0
  6. pygpt_net/controller/lang/mapping.py +2 -1
  7. pygpt_net/controller/mode/mode.py +5 -2
  8. pygpt_net/controller/plugins/plugins.py +29 -3
  9. pygpt_net/controller/realtime/realtime.py +8 -3
  10. pygpt_net/controller/ui/mode.py +11 -5
  11. pygpt_net/core/render/web/renderer.py +3 -1
  12. pygpt_net/data/config/config.json +3 -2
  13. pygpt_net/data/config/models.json +2 -2
  14. pygpt_net/data/icons/web_off.svg +1 -0
  15. pygpt_net/data/icons/web_on.svg +1 -0
  16. pygpt_net/data/locale/locale.de.ini +1 -0
  17. pygpt_net/data/locale/locale.en.ini +3 -2
  18. pygpt_net/data/locale/locale.es.ini +1 -0
  19. pygpt_net/data/locale/locale.fr.ini +1 -0
  20. pygpt_net/data/locale/locale.it.ini +1 -0
  21. pygpt_net/data/locale/locale.pl.ini +1 -4
  22. pygpt_net/data/locale/locale.uk.ini +1 -0
  23. pygpt_net/data/locale/locale.zh.ini +1 -0
  24. pygpt_net/data/locale/plugin.mcp.en.ini +4 -4
  25. pygpt_net/icons.qrc +2 -0
  26. pygpt_net/icons_rc.py +232 -147
  27. pygpt_net/provider/api/anthropic/tools.py +4 -2
  28. pygpt_net/provider/api/google/__init__.py +3 -2
  29. pygpt_net/provider/api/openai/agents/remote_tools.py +14 -4
  30. pygpt_net/provider/api/openai/chat.py +14 -2
  31. pygpt_net/provider/api/openai/remote_tools.py +5 -2
  32. pygpt_net/provider/api/x_ai/remote.py +6 -1
  33. pygpt_net/provider/core/config/patch.py +8 -1
  34. pygpt_net/ui/layout/chat/output.py +7 -2
  35. {pygpt_net-2.6.52.dist-info → pygpt_net-2.6.53.dist-info}/METADATA +7 -2
  36. {pygpt_net-2.6.52.dist-info → pygpt_net-2.6.53.dist-info}/RECORD +39 -36
  37. {pygpt_net-2.6.52.dist-info → pygpt_net-2.6.53.dist-info}/LICENSE +0 -0
  38. {pygpt_net-2.6.52.dist-info → pygpt_net-2.6.53.dist-info}/WHEEL +0 -0
  39. {pygpt_net-2.6.52.dist-info → pygpt_net-2.6.53.dist-info}/entry_points.txt +0 -0
pygpt_net/CHANGELOG.txt CHANGED
@@ -1,3 +1,8 @@
1
+ 2.6.53 (2025-09-17)
2
+
3
+ - Added: An icon to enable/disable the web search remote tool in the icon bar, along with remote web search functionality in OpenRouter (#135).
4
+ - Added: The ability to mute audio in real-time mode via the audio icon.
5
+
1
6
  2.6.52 (2025-09-17)
2
7
 
3
8
  - Added MCP plugin: Provides access to remote tools via the Model Context Protocol (MCP), including stdio, SSE, and Streamable HTTP transports, with per-server allow/deny filtering, Authorization header support, and a tools cache.
pygpt_net/__init__.py CHANGED
@@ -13,7 +13,7 @@ __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.52"
16
+ __version__ = "2.6.53"
17
17
  __build__ = "2025-09-17"
18
18
  __maintainer__ = "Marcin Szczygliński"
19
19
  __github__ = "https://github.com/szczyglis-dev/py-gpt"
@@ -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.31 23:00:00 #
9
+ # Updated Date: 2025.09.17 07:00:00 #
10
10
  # ================================================== #
11
11
 
12
12
  import os
@@ -36,6 +36,7 @@ class Audio:
36
36
  Tab.TAB_CHAT,
37
37
  Tab.TAB_TOOL_CALENDAR,
38
38
  ]
39
+ self.muted = False
39
40
 
40
41
  def setup(self):
41
42
  """Setup controller"""
@@ -53,6 +54,26 @@ class Audio:
53
54
  if self.window.core.config.get("audio.input.loop", False):
54
55
  self.window.ui.nodes['audio.loop'].box.setChecked(True)
55
56
 
57
+ def is_muted(self) -> bool:
58
+ """
59
+ Check if audio output is muted
60
+
61
+ :return: True if muted
62
+ """
63
+ return self.muted
64
+
65
+ def set_muted(self, state: bool):
66
+ """
67
+ Set audio output muted state
68
+
69
+ :param state: True to mute, False to unmute
70
+ """
71
+ self.muted = state
72
+ if state:
73
+ self.toggle_output_icon(False)
74
+ else:
75
+ self.toggle_output_icon(True)
76
+
56
77
  def execute_input_stop(self):
57
78
  """Execute input stop (from UI)"""
58
79
  self.window.dispatch(Event(Event.AUDIO_INPUT_RECORD_TOGGLE, {
@@ -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.23 15:00:00 #
9
+ # Updated Date: 2025.09.17 05:00:00 #
10
10
  # ================================================== #
11
11
 
12
12
  from typing import Any
@@ -22,6 +22,7 @@ from .files import Files
22
22
  from .image import Image
23
23
  from .input import Input
24
24
  from .output import Output
25
+ from .remote_tools import RemoteTools
25
26
  from .render import Render
26
27
  from .response import Response
27
28
  from .stream import Stream
@@ -46,6 +47,7 @@ class Chat:
46
47
  self.image = Image(w)
47
48
  self.input = Input(w)
48
49
  self.output = Output(w)
50
+ self.remote_tools = RemoteTools(w)
49
51
  self.render = Render(w)
50
52
  self.response = Response(w)
51
53
  self.stream = Stream(w)
@@ -60,12 +62,14 @@ class Chat:
60
62
  """Setup"""
61
63
  self.common.setup()
62
64
  self.attachment.setup()
65
+ self.remote_tools.setup()
63
66
 
64
67
  def reload(self) -> None:
65
68
  """Reload"""
66
69
  self.common.setup()
67
70
  self.render.reload()
68
71
  self.attachment.reload()
72
+ self.remote_tools.setup()
69
73
 
70
74
  def handle_error(self, err: Any) -> None:
71
75
  """
@@ -0,0 +1,116 @@
1
+ #!/usr/bin/env python3
2
+ # -*- coding: utf-8 -*-
3
+ # ================================================== #
4
+ # This file is a part of PYGPT package #
5
+ # Website: https://pygpt.net #
6
+ # GitHub: https://github.com/szczyglis-dev/py-gpt #
7
+ # MIT License #
8
+ # Created By : Marcin Szczygliński #
9
+ # Updated Date: 2025.09.17 05:00:00 #
10
+ # ================================================== #
11
+
12
+ from typing import Union
13
+
14
+ from pygpt_net.item.model import ModelItem
15
+
16
+
17
+ class RemoteTools:
18
+ def __init__(self, window=None):
19
+ """
20
+ Remote tools controller
21
+
22
+ :param window: Window instance
23
+ """
24
+ self.window = window
25
+ self.enabled_global = {
26
+ "web_search": False,
27
+ }
28
+
29
+ def setup(self):
30
+ """
31
+ Setup remote tools
32
+
33
+ :return: None
34
+ """
35
+ cfg_get = self.window.core.config.get
36
+ self.enabled_global["web_search"] = cfg_get("remote_tools.global.web_search", False)
37
+ self.update_icons()
38
+
39
+ def enabled(self, model: Union[ModelItem, str], tool_name: str) -> bool:
40
+ """
41
+ Check if remote tool is enabled
42
+
43
+ :param model: ModelItem or model name
44
+ :param tool_name: Tool name
45
+ :return: True if enabled, False otherwise
46
+ """
47
+ if isinstance(model, str):
48
+ model = self.window.core.models.get(model)
49
+ if not model:
50
+ return False
51
+ if tool_name == "web_search":
52
+ return self.is_web(model)
53
+ return False
54
+
55
+ def is_web(self, model: ModelItem) -> bool:
56
+ """
57
+ Check if web search is enabled for the given provider
58
+
59
+ :param model: ModelItem
60
+ :return: True if web search is enabled, False otherwise
61
+ """
62
+ # at first, check provider-specific config
63
+ cfg_get = self.window.core.config.get
64
+ state = False
65
+ if model.provider == "openai": # native SDK, responses API
66
+ state = cfg_get("remote_tools.web_search", False)
67
+ elif model.provider == "google": # native SDK
68
+ state = cfg_get("remote_tools.google.web_search", False)
69
+ elif model.provider == "anthropic": # native SDK
70
+ state = cfg_get("remote_tools.anthropic.web_search", False)
71
+ elif model.provider == "x_ai": # native SDK
72
+ mode = cfg_get("remote_tools.xai.mode", "auto")
73
+ if mode not in ("auto", "on", "off"):
74
+ mode = "auto"
75
+ if mode == "auto" or mode == "on":
76
+ state = True
77
+
78
+ # if not enabled by default or other provider, then use global config
79
+ if not state:
80
+ state = self.enabled_global["web_search"]
81
+
82
+ return state
83
+
84
+ def update_icons(self):
85
+ """
86
+ Update remote tools icons in chat tabs
87
+ """
88
+ state = self.enabled_global["web_search"]
89
+ if state:
90
+ self.window.ui.nodes['icon.remote_tool.web'].set_icon(":/icons/web_on.svg")
91
+ else:
92
+ self.window.ui.nodes['icon.remote_tool.web'].set_icon(":/icons/web_off.svg")
93
+
94
+ def toggle(self, tool_name: str):
95
+ """
96
+ Toggle remote tool (for global toggle button)
97
+
98
+ :param tool_name: Tool name
99
+ """
100
+ cfg_set = self.window.core.config.set
101
+
102
+ # tool: web search
103
+ if tool_name == "web_search":
104
+ state = not self.enabled_global["web_search"]
105
+ self.enabled_global["web_search"] = state
106
+ cfg_set("remote_tools.global.web_search", state)
107
+ cfg_set("remote_tools.web_search", state)
108
+ cfg_set("remote_tools.google.web_search", state)
109
+ cfg_set("remote_tools.anthropic.web_search", state)
110
+
111
+ # xAI has 3 modes: auto, on, off
112
+ cfg_set("remote_tools.xai.mode", "auto" if state else "off")
113
+
114
+ # save config
115
+ self.window.core.config.save()
116
+ self.update_icons()
@@ -6,7 +6,7 @@
6
6
  # GitHub: https://github.com/szczyglis-dev/py-gpt #
7
7
  # MIT License #
8
8
  # Created By : Marcin Szczygliński #
9
- # Updated Date: 2025.08.15 23:00:00 #
9
+ # Updated Date: 2025.09.17 05:00:00 #
10
10
  # ================================================== #
11
11
 
12
12
  from typing import Dict
@@ -423,6 +423,7 @@ class Mapping:
423
423
  tooltips['icon.video.capture'] = 'icon.video.capture'
424
424
  tooltips['icon.audio.output'] = 'icon.audio.output'
425
425
  tooltips['icon.audio.input'] = 'icon.audio.input'
426
+ tooltips['icon.remote_tool.web'] = 'icon.remote_tool.web'
426
427
  tooltips['assistant.store.btn.refresh_status'] = 'dialog.assistant.store.btn.refresh_status'
427
428
  tooltips['agent.llama.loop.score'] = 'toolbox.agent.llama.loop.score.tooltip'
428
429
 
@@ -6,13 +6,13 @@
6
6
  # GitHub: https://github.com/szczyglis-dev/py-gpt #
7
7
  # MIT License #
8
8
  # Created By : Marcin Szczygliński #
9
- # Updated Date: 2025.08.28 09:00:00 #
9
+ # Updated Date: 2025.09.17 07:00:00 #
10
10
  # ================================================== #
11
11
 
12
12
  from pygpt_net.core.events import Event, AppEvent
13
13
  from pygpt_net.core.types import (
14
14
  MODE_ASSISTANT,
15
- MODE_CHAT,
15
+ MODE_CHAT, MODE_AUDIO,
16
16
  )
17
17
  from pygpt_net.item.ctx import CtxItem
18
18
  from pygpt_net.utils import trans
@@ -92,6 +92,9 @@ class Mode:
92
92
  else:
93
93
  c.assistant.select_current()
94
94
 
95
+ elif mode == MODE_AUDIO:
96
+ c.audio.set_muted(False) # un-mute and show audio output icon by default
97
+
95
98
  cfg.set('mode', mode)
96
99
 
97
100
  # reset model and preset at start
@@ -6,7 +6,7 @@
6
6
  # GitHub: https://github.com/szczyglis-dev/py-gpt #
7
7
  # MIT License #
8
8
  # Created By : Marcin Szczygliński #
9
- # Updated Date: 2025.09.05 18:00:00 #
9
+ # Updated Date: 2025.09.17 07:00:00 #
10
10
  # ================================================== #
11
11
 
12
12
  from typing import List, Dict, Any, Optional
@@ -14,7 +14,7 @@ from typing import List, Dict, Any, Optional
14
14
  from PySide6.QtGui import QAction
15
15
 
16
16
  from pygpt_net.core.types import (
17
- MODE_AGENT,
17
+ MODE_AGENT, MODE_AUDIO,
18
18
  )
19
19
  from pygpt_net.controller.plugins.presets import Presets
20
20
  from pygpt_net.controller.plugins.settings import Settings
@@ -194,20 +194,46 @@ class Plugins:
194
194
 
195
195
  def toggle(self, id: str):
196
196
  """
197
- Toggle plugin
197
+ Toggle plugin (from menu)
198
198
 
199
199
  :param id: plugin id
200
200
  """
201
201
  if self.window.core.plugins.is_registered(id):
202
202
  if self.is_enabled(id):
203
203
  self.disable(id)
204
+ if id == "audio_output":
205
+ self.window.controller.audio.set_muted(True)
204
206
  else:
205
207
  self.enable(id)
208
+ if id == "audio_output":
209
+ self.window.controller.audio.set_muted(False)
206
210
 
207
211
  self.window.controller.ui.update_tokens()
208
212
  self.window.controller.attachment.update()
209
213
  self.presets.save_current()
210
214
 
215
+ def toggle_audio_output(self):
216
+ """
217
+ Toggle plugin (from icon, audio output only)
218
+ """
219
+ id = "audio_output"
220
+ mode = self.window.core.config.get('mode')
221
+
222
+ if mode == MODE_AUDIO:
223
+ if not self.window.controller.audio.is_muted():
224
+ self.window.controller.audio.set_muted(True)
225
+ else:
226
+ self.window.controller.audio.set_muted(False)
227
+ return
228
+
229
+ if self.window.core.plugins.is_registered(id):
230
+ if self.is_enabled(id):
231
+ self.disable(id)
232
+ else:
233
+ self.enable(id)
234
+
235
+ self.presets.save_current()
236
+
211
237
  def set_by_tab(self, idx: int):
212
238
  """
213
239
  Set current plugin by tab index
@@ -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.31 23:00:00 #
9
+ # Updated Date: 2025.09.17 07:00:00 #
10
10
  # ================================================== #
11
11
 
12
12
  from PySide6.QtCore import Slot, QTimer
@@ -64,6 +64,8 @@ class Realtime:
64
64
 
65
65
  :param event: RealtimeEvent instance
66
66
  """
67
+ is_muted = self.window.controller.audio.is_muted() # global mute state
68
+
67
69
  # check if mode is supported
68
70
  if not self.is_supported() and isinstance(event, RealtimeEvent):
69
71
  event.stop = True # stop further propagation
@@ -75,7 +77,7 @@ class Realtime:
75
77
  if event.name == RealtimeEvent.RT_OUTPUT_AUDIO_DELTA:
76
78
  self.set_idle()
77
79
  payload = event.data.get("payload", None)
78
- if payload:
80
+ if payload and not is_muted: # do not play if muted
79
81
  self.window.core.audio.output.handle_realtime(payload, self.signals)
80
82
 
81
83
  # audio input chunk: send to the active realtime client
@@ -148,7 +150,10 @@ class Realtime:
148
150
 
149
151
  # volume change: update volume in audio output handler
150
152
  elif event.name == RealtimeEvent.RT_OUTPUT_AUDIO_VOLUME_CHANGED:
151
- volume = event.data.get("volume", 1.0)
153
+ if not is_muted:
154
+ volume = event.data.get("volume", 1.0)
155
+ else:
156
+ volume = 0.0
152
157
  self.window.controller.audio.ui.on_output_volume_change(volume)
153
158
 
154
159
  # error: audio output error
@@ -6,7 +6,7 @@
6
6
  # GitHub: https://github.com/szczyglis-dev/py-gpt #
7
7
  # MIT License #
8
8
  # Created By : Marcin Szczygliński #
9
- # Updated Date: 2025.09.01 23:00:00 #
9
+ # Updated Date: 2025.09.17 07:00:00 #
10
10
  # ================================================== #
11
11
 
12
12
  from pygpt_net.core.types import (
@@ -59,11 +59,17 @@ class Mode:
59
59
  is_audio = mode == MODE_AUDIO
60
60
 
61
61
  if not is_audio:
62
- self.window.ui.nodes['audio.auto_turn'].setVisible(False)
63
- self.window.ui.nodes["audio.loop"].setVisible(False)
62
+ ui_nodes['audio.auto_turn'].setVisible(False)
63
+ ui_nodes["audio.loop"].setVisible(False)
64
+ if not ctrl.plugins.is_enabled('audio_output'):
65
+ ctrl.audio.toggle_output_icon(False)
64
66
  else:
65
- self.window.ui.nodes['audio.auto_turn'].setVisible(True)
66
- self.window.ui.nodes["audio.loop"].setVisible(True)
67
+ ui_nodes['audio.auto_turn'].setVisible(True)
68
+ ui_nodes["audio.loop"].setVisible(True)
69
+ if not ctrl.audio.is_muted():
70
+ ctrl.audio.toggle_output_icon(True)
71
+ else:
72
+ ctrl.audio.toggle_output_icon(False)
67
73
 
68
74
  if not is_assistant:
69
75
  ui_nodes['presets.widget'].setVisible(True)
@@ -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.16 22:00:00 #
9
+ # Updated Date: 2025.09.17 05:00:00 #
10
10
  # ================================================== #
11
11
 
12
12
  import gc
@@ -1289,6 +1289,8 @@ class Renderer(BaseRenderer):
1289
1289
  :param meta: context meta
1290
1290
  """
1291
1291
  tab = node.get_tab()
1292
+ if tab is None:
1293
+ return
1292
1294
  layout = tab.child.layout()
1293
1295
  tab.unwrap(node)
1294
1296
  self.window.ui.nodes['output'].pop(tab.pid, None)
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "__meta__": {
3
- "version": "2.6.52",
4
- "app.version": "2.6.52",
3
+ "version": "2.6.53",
4
+ "app.version": "2.6.53",
5
5
  "updated_at": "2025-09-17T00:00:00"
6
6
  },
7
7
  "access.audio.event.speech": false,
@@ -417,6 +417,7 @@
417
417
  "remote_tools.computer_use.env": "",
418
418
  "remote_tools.file_search": false,
419
419
  "remote_tools.file_search.args": "",
420
+ "remote_tools.global.web_search": true,
420
421
  "remote_tools.google.code_interpreter": false,
421
422
  "remote_tools.google.url_ctx": false,
422
423
  "remote_tools.google.web_search": true,
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "__meta__": {
3
- "version": "2.6.52",
4
- "app.version": "2.6.52",
3
+ "version": "2.6.53",
4
+ "app.version": "2.6.53",
5
5
  "updated_at": "2025-09-17T08:03:34"
6
6
  },
7
7
  "items": {
@@ -0,0 +1 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" height="24px" viewBox="0 -960 960 960" width="24px" fill="#686868"><path d="M819-28 701-146q-48 32-103.5 49T480-80q-83 0-156-31.5T197-197q-54-54-85.5-127T80-480q0-62 17-117.5T146-701L27-820l57-57L876-85l-57 57ZM440-162v-78q-33 0-56.5-23.5T360-320v-40L168-552q-3 18-5.5 36t-2.5 36q0 121 79.5 212T440-162Zm374-99-58-58q21-37 32.5-77.5T800-480q0-98-54.5-179T600-776v16q0 33-23.5 56.5T520-680h-80v45L261-814q48-31 103-48.5T480-880q83 0 156 31.5T763-763q54 54 85.5 127T880-480q0 61-17.5 116T814-261Z"/></svg>
@@ -0,0 +1 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" height="24px" viewBox="0 -960 960 960" width="24px" fill="#686868"><path d="M480-80q-83 0-156-31.5T197-197q-54-54-85.5-127T80-480q0-83 31.5-156T197-763q54-54 127-85.5T480-880q83 0 156 31.5T763-763q54 54 85.5 127T880-480q0 83-31.5 156T763-197q-54 54-127 85.5T480-80Zm-40-82v-78q-33 0-56.5-23.5T360-320v-40L168-552q-3 18-5.5 36t-2.5 36q0 121 79.5 212T440-162Zm276-102q41-45 62.5-100.5T800-480q0-98-54.5-179T600-776v16q0 33-23.5 56.5T520-680h-80v80q0 17-11.5 28.5T400-560h-80v80h240q17 0 28.5 11.5T600-440v120h40q26 0 47 15.5t29 40.5Z"/></svg>
@@ -677,6 +677,7 @@ html_canvas.btn.edit = Quellcode bearbeiten
677
677
  html_canvas.clear.confirm = HTML-Canvas-Ausgabe löschen?
678
678
  icon.audio.input = Audioeingang aktivieren/deaktivieren
679
679
  icon.audio.output = Audioausgang aktivieren/deaktivieren
680
+ icon.remote_tool.web = Websuche (ferngesteuertes Werkzeug, kein lokales Werkzeug)
680
681
  icon.video.capture = Videoaufnahme von der Kamera aktivieren/deaktivieren
681
682
  idx.btn.clear = Index löschen
682
683
  idx.btn.index_all = Alles indizieren
@@ -680,6 +680,7 @@ html_canvas.btn.edit = Edit source
680
680
  html_canvas.clear.confirm = Clear HTML canvas output?
681
681
  icon.audio.input = Enable/disable audio input
682
682
  icon.audio.output = Enable/disable audio output
683
+ icon.remote_tool.web = Web Search (remote tool, not a local tool)
683
684
  icon.video.capture = Enable/disable camera capture
684
685
  idx.btn.clear = Clear index
685
686
  idx.btn.index_all = Index all
@@ -1391,6 +1392,8 @@ settings.render.code_syntax.stream_n_line.desc = Syntax highlight: highlight eve
1391
1392
  settings.render.engine = Rendering engine
1392
1393
  settings.render.memory.limit = Memory Limit
1393
1394
  settings.render.memory.limit.desc = Renderer memory limit; set to 0 to disable. If > 0, the app will try to free memory after the limit is reached. Accepted formats: 3.5GB, 2GB, 2048MB, 1_000_000. Minimum: 2GB.
1395
+ settings.render.msg.user.collapse.px = Auto-collapse user message (px)
1396
+ settings.render.msg.user.collapse.px.desc = Auto-collapse user message after N pixels of height, set to 0 to disable auto-collapse
1394
1397
  settings.render.open_gl = OpenGL hardware acceleration
1395
1398
  settings.render.plain = Disable markdown formatting in output (RAW plain text mode)
1396
1399
  settings.render.web.only.desc = WebEngine / Chromium rendering engine only
@@ -1649,5 +1652,3 @@ vision.capture.manual.captured.success = Image captured from the camera:
1649
1652
  vision.capture.name.prefix = Camera capture:
1650
1653
  vision.capture.options.title = Video capture
1651
1654
  vision.checkbox.tooltip = If checked, the vision model is active. It will be automatically activated upon image upload. You can deactivate it in real-time.
1652
- settings.render.msg.user.collapse.px = Auto-collapse user message (px)
1653
- settings.render.msg.user.collapse.px.desc = Auto-collapse user message after N pixels of height, set to 0 to disable auto-collapse
@@ -678,6 +678,7 @@ html_canvas.btn.edit = Editar código fuente
678
678
  html_canvas.clear.confirm = ¿Limpiar la salida del lienzo HTML?
679
679
  icon.audio.input = Activar/desactivar entrada de audio
680
680
  icon.audio.output = Activar/desactivar salida de audio
681
+ icon.remote_tool.web = Búsqueda en la Web (herramienta remota, no una herramienta local)
681
682
  icon.video.capture = Activar/desactivar captura de vídeo desde la cámara
682
683
  idx.btn.clear = Limpiar índice
683
684
  idx.btn.index_all = Indexar todo
@@ -677,6 +677,7 @@ html_canvas.btn.edit = Modifier le code source
677
677
  html_canvas.clear.confirm = Effacer la sortie du canevas HTML ?
678
678
  icon.audio.input = Activer/désactiver l'entrée audio
679
679
  icon.audio.output = Activer/désactiver la sortie audio
680
+ icon.remote_tool.web = Recherche sur le Web (outil distant, pas un outil local)
680
681
  icon.video.capture = Activer/désactiver la capture vidéo depuis la caméra
681
682
  idx.btn.clear = Effacer l'index
682
683
  idx.btn.index_all = Indexer tout
@@ -677,6 +677,7 @@ html_canvas.btn.edit = Modifica il codice sorgente
677
677
  html_canvas.clear.confirm = Cancellare l'output del canvas HTML?
678
678
  icon.audio.input = Attiva/disattiva ingresso audio
679
679
  icon.audio.output = Attiva/disattiva uscita audio
680
+ icon.remote_tool.web = Ricerca Web (strumento remoto, non uno strumento locale)
680
681
  icon.video.capture = Attiva/disattiva cattura video dalla fotocamera
681
682
  idx.btn.clear = Cancella indice
682
683
  idx.btn.index_all = Indicizza tutto
@@ -1,8 +1,4 @@
1
1
  [LOCALE]
2
-
3
-
4
-
5
-
6
2
  about.btn.github = GitHub
7
3
  about.btn.support = Wsparcie
8
4
  about.btn.website = WWW
@@ -682,6 +678,7 @@ html_canvas.btn.edit = Edytuj kod źródłowy
682
678
  html_canvas.clear.confirm = Wyczyścić wynik płótna HTML?
683
679
  icon.audio.input = Włącz/wyłącz wejście audio
684
680
  icon.audio.output = Włącz/wyłącz wyjście audio
681
+ icon.remote_tool.web = Wyszukiwanie w sieci (narzędzie zdalne, nie lokalne)
685
682
  icon.video.capture = Włącz/wyłącz przechwytywanie wideo z kamery
686
683
  idx.btn.clear = Wyczyść indeks
687
684
  idx.btn.index_all = Indeksuj wszystko
@@ -677,6 +677,7 @@ html_canvas.btn.edit = Редагувати вихідний код
677
677
  html_canvas.clear.confirm = Очистити вихідні дані HTML-канви?
678
678
  icon.audio.input = Увімкнути/вимкнути аудіовхід
679
679
  icon.audio.output = Увімкнути/вимкнути аудіовихід
680
+ icon.remote_tool.web = Пошук у мережі (віддалений інструмент, не локальний інструмент)
680
681
  icon.video.capture = Увімкнути/вимкнути захоплення відео з камери
681
682
  idx.btn.clear = Очистити індекс
682
683
  idx.btn.index_all = Індексувати все
@@ -677,6 +677,7 @@ html_canvas.btn.edit = 编辑源代码
677
677
  html_canvas.clear.confirm = 清除HTML画布输出?
678
678
  icon.audio.input = 啟用/禁用音頻輸入
679
679
  icon.audio.output = 啟用/禁用音頻輸出
680
+ icon.remote_tool.web = 网页搜索(远程工具,非本地工具)
680
681
  icon.video.capture = 啟用/禁用相機捕捉
681
682
  idx.btn.clear = 清除索引
682
683
  idx.btn.index_all = 全部索引
@@ -1,12 +1,12 @@
1
1
  [LOCALE]
2
+ plugin.description = Provides access to remote tools via the Model Context Protocol (MCP), including stdio, SSE, and Streamable HTTP transports, with per-server allow/deny filtering, Authorization header support, and a tools cache.
3
+ plugin.name = MCP
2
4
  servers.description = Configure MCP servers. Supported transports: 'stdio: <command ...>' for stdio servers, 'http(s)://...' for Streamable HTTP, and 'http(s)://.../sse' (or 'sse://', 'sse+http(s)://') for SSE. Use 'label' as a short, human-friendly server name used in tool names. Use 'authorization' to send an Authorization header for HTTP/SSE connections. Use 'allowed_commands' (comma-separated) to whitelist tools; if provided, only those tools are exposed. Use 'disabled_commands' to blacklist tools from this server.
3
5
  servers.label = MCP servers
4
6
  servers.tooltip = Requires the MCP Python SDK. Install: pip install "mcp[cli]"
5
- tools_cache_enabled.label = Cache tools list
6
7
  tools_cache_enabled.description = Enable an in-memory cache of discovered tools to avoid re-discovery on every prompt.
8
+ tools_cache_enabled.label = Cache tools list
7
9
  tools_cache_enabled.tooltip = If enabled, tool discovery results are cached per server for the TTL duration.
8
- tools_cache_ttl.label = Cache TTL (seconds)
9
10
  tools_cache_ttl.description = Time-to-live for the tools cache per server.
11
+ tools_cache_ttl.label = Cache TTL (seconds)
10
12
  tools_cache_ttl.tooltip = Set to 0 to disable TTL (not recommended).
11
- plugin.description = Provides access to remote tools via the Model Context Protocol (MCP), including stdio, SSE, and Streamable HTTP transports, with per-server allow/deny filtering, Authorization header support, and a tools cache.
12
- plugin.name = MCP
pygpt_net/icons.qrc CHANGED
@@ -145,6 +145,8 @@
145
145
  <file alias="voice.svg">data/icons/voice.svg</file>
146
146
  <file alias="volume.svg">data/icons/volume.svg</file>
147
147
  <file alias="warning.svg">data/icons/warning.svg</file>
148
+ <file alias="web_off.svg">data/icons/web_off.svg</file>
149
+ <file alias="web_on.svg">data/icons/web_on.svg</file>
148
150
  <file alias="webcam.svg">data/icons/webcam.svg</file>
149
151
  <file alias="webcam_off.svg">data/icons/webcam_off.svg</file>
150
152
  <file alias="width.svg">data/icons/width.svg</file>