pygpt-net 2.6.45__py3-none-any.whl → 2.6.46__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 (71) hide show
  1. pygpt_net/CHANGELOG.txt +7 -0
  2. pygpt_net/__init__.py +3 -3
  3. pygpt_net/app.py +0 -5
  4. pygpt_net/controller/debug/debug.py +11 -9
  5. pygpt_net/controller/dialogs/debug.py +40 -29
  6. pygpt_net/core/debug/agent.py +19 -14
  7. pygpt_net/core/debug/assistants.py +22 -24
  8. pygpt_net/core/debug/attachments.py +11 -7
  9. pygpt_net/core/debug/config.py +22 -23
  10. pygpt_net/core/debug/context.py +63 -63
  11. pygpt_net/core/debug/db.py +1 -4
  12. pygpt_net/core/debug/events.py +14 -11
  13. pygpt_net/core/debug/indexes.py +41 -76
  14. pygpt_net/core/debug/kernel.py +11 -8
  15. pygpt_net/core/debug/models.py +20 -15
  16. pygpt_net/core/debug/plugins.py +9 -6
  17. pygpt_net/core/debug/presets.py +16 -11
  18. pygpt_net/core/debug/tabs.py +28 -22
  19. pygpt_net/core/debug/ui.py +25 -22
  20. pygpt_net/core/render/web/renderer.py +3 -2
  21. pygpt_net/core/tabs/tab.py +14 -1
  22. pygpt_net/data/config/config.json +3 -3
  23. pygpt_net/data/config/models.json +3 -3
  24. pygpt_net/data/config/settings.json +15 -17
  25. pygpt_net/data/css/style.dark.css +6 -0
  26. pygpt_net/data/css/web-blocks.css +4 -0
  27. pygpt_net/data/css/web-blocks.light.css +1 -1
  28. pygpt_net/data/css/web-chatgpt.css +4 -0
  29. pygpt_net/data/css/web-chatgpt.light.css +1 -1
  30. pygpt_net/data/css/web-chatgpt_wide.css +4 -0
  31. pygpt_net/data/css/web-chatgpt_wide.light.css +1 -1
  32. pygpt_net/data/js/app.js +720 -636
  33. pygpt_net/data/locale/locale.de.ini +1 -1
  34. pygpt_net/data/locale/locale.en.ini +1 -1
  35. pygpt_net/data/locale/locale.es.ini +1 -1
  36. pygpt_net/data/locale/locale.fr.ini +1 -1
  37. pygpt_net/data/locale/locale.it.ini +1 -1
  38. pygpt_net/data/locale/locale.pl.ini +2 -2
  39. pygpt_net/data/locale/locale.uk.ini +1 -1
  40. pygpt_net/data/locale/locale.zh.ini +1 -1
  41. pygpt_net/item/model.py +4 -1
  42. pygpt_net/js_rc.py +12824 -12612
  43. pygpt_net/provider/api/anthropic/__init__.py +3 -1
  44. pygpt_net/provider/api/anthropic/tools.py +1 -1
  45. pygpt_net/provider/api/google/__init__.py +7 -1
  46. pygpt_net/provider/api/x_ai/__init__.py +5 -1
  47. pygpt_net/provider/core/config/patch.py +14 -1
  48. pygpt_net/provider/llms/anthropic.py +37 -5
  49. pygpt_net/provider/llms/azure_openai.py +3 -1
  50. pygpt_net/provider/llms/base.py +13 -1
  51. pygpt_net/provider/llms/deepseek_api.py +13 -3
  52. pygpt_net/provider/llms/google.py +14 -1
  53. pygpt_net/provider/llms/hugging_face_api.py +105 -24
  54. pygpt_net/provider/llms/hugging_face_embedding.py +88 -0
  55. pygpt_net/provider/llms/hugging_face_router.py +28 -16
  56. pygpt_net/provider/llms/local.py +2 -0
  57. pygpt_net/provider/llms/mistral.py +60 -3
  58. pygpt_net/provider/llms/open_router.py +4 -2
  59. pygpt_net/provider/llms/openai.py +4 -1
  60. pygpt_net/provider/llms/perplexity.py +66 -5
  61. pygpt_net/provider/llms/utils.py +39 -0
  62. pygpt_net/provider/llms/voyage.py +50 -0
  63. pygpt_net/provider/llms/x_ai.py +70 -10
  64. pygpt_net/ui/widget/lists/db.py +1 -0
  65. pygpt_net/ui/widget/lists/debug.py +1 -0
  66. pygpt_net/ui/widget/tabs/body.py +12 -1
  67. {pygpt_net-2.6.45.dist-info → pygpt_net-2.6.46.dist-info}/METADATA +11 -4
  68. {pygpt_net-2.6.45.dist-info → pygpt_net-2.6.46.dist-info}/RECORD +71 -68
  69. {pygpt_net-2.6.45.dist-info → pygpt_net-2.6.46.dist-info}/LICENSE +0 -0
  70. {pygpt_net-2.6.45.dist-info → pygpt_net-2.6.46.dist-info}/WHEEL +0 -0
  71. {pygpt_net-2.6.45.dist-info → pygpt_net-2.6.46.dist-info}/entry_points.txt +0 -0
@@ -6,7 +6,7 @@
6
6
  # GitHub: https://github.com/szczyglis-dev/py-gpt #
7
7
  # MIT License #
8
8
  # Created By : Marcin Szczygliński #
9
- # Updated Date: 2024.12.14 19:00:00 #
9
+ # Updated Date: 2025.09.14 20:00:00 #
10
10
  # ================================================== #
11
11
 
12
12
  from pygpt_net.core.events import (
@@ -31,16 +31,19 @@ class EventsDebug:
31
31
 
32
32
  def update(self):
33
33
  """Update debug window."""
34
- self.window.core.debug.begin(self.id)
35
- self.window.core.debug.add(self.id, 'App Events:', str(self.extract_events(AppEvent)))
36
- self.window.core.debug.add(self.id, 'Control Events:', str(self.extract_events(ControlEvent)))
37
- self.window.core.debug.add(self.id, 'Kernel Events:', str(self.extract_events(KernelEvent)))
38
- self.window.core.debug.add(self.id, 'Render Events:', str(self.extract_events(RenderEvent)))
39
- self.window.core.debug.add(self.id, 'Plugin Events:', str(self.extract_events(Event)))
40
- self.window.core.debug.add(self.id, '----', '')
41
- self.window.core.debug.add(self.id, 'Voice Cmds (all):', str(self.window.core.access.voice.commands))
42
- self.window.core.debug.add(self.id, 'Voice Cmds (allowed):', str(self.window.core.access.voice.get_commands()))
43
- self.window.core.debug.end(self.id)
34
+ debug = self.window.core.debug
35
+ access_voice = self.window.core.access.voice
36
+
37
+ debug.begin(self.id)
38
+ debug.add(self.id, 'App Events:', str(self.extract_events(AppEvent)))
39
+ debug.add(self.id, 'Control Events:', str(self.extract_events(ControlEvent)))
40
+ debug.add(self.id, 'Kernel Events:', str(self.extract_events(KernelEvent)))
41
+ debug.add(self.id, 'Render Events:', str(self.extract_events(RenderEvent)))
42
+ debug.add(self.id, 'Plugin Events:', str(self.extract_events(Event)))
43
+ debug.add(self.id, '----', '')
44
+ debug.add(self.id, 'Voice Cmds (all):', str(access_voice.commands))
45
+ debug.add(self.id, 'Voice Cmds (allowed):', str(access_voice.get_commands()))
46
+ debug.end(self.id)
44
47
 
45
48
  def extract_events(self, events: BaseEvent) -> dict:
46
49
  """
@@ -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: 2024.08.25 04:00:00 #
9
+ # Updated Date: 2025.09.14 20:00:00 #
10
10
  # ================================================== #
11
11
 
12
12
  import datetime
@@ -24,91 +24,56 @@ class IndexesDebug:
24
24
 
25
25
  def update(self):
26
26
  """Update debug window."""
27
- self.window.core.debug.begin(self.id)
28
- self.window.core.debug.add(self.id, 'Current storage:', str(self.window.core.idx.get_current_store()))
29
- self.window.core.debug.add(self.id, 'Current idx:', str(self.window.controller.idx.current_idx))
30
- self.window.core.debug.add(self.id, 'Current mode:', str(self.window.controller.idx.current_mode))
31
- self.window.core.debug.add(self.id, 'Chat mode:', str(self.window.core.config.get("llama.idx.chat.mode")))
32
- self.window.core.debug.add(self.id, 'Indexes (list):', str(list(self.window.core.config.get("llama.idx.list"))))
27
+ debug = self.window.core.debug
28
+ idx_core = self.window.core.idx
29
+ idx_controller = self.window.controller.idx
30
+ config = self.window.core.config
31
+ storage = idx_core.storage
32
+ indexing = idx_core.indexing
33
+
34
+ debug.begin(self.id)
35
+ debug.add(self.id, 'Current storage:', str(idx_core.get_current_store()))
36
+ debug.add(self.id, 'Current idx:', str(idx_controller.current_idx))
37
+ debug.add(self.id, 'Current mode:', str(idx_controller.current_mode))
38
+ debug.add(self.id, 'Chat mode:', str(config.get("llama.idx.chat.mode")))
39
+ debug.add(self.id, 'Indexes (list):', str(list(config.get("llama.idx.list"))))
33
40
 
34
41
  # count items in DB
35
- db_counter = {}
36
- db_counter["ctx"] = self.window.core.idx.get_counters("ctx")
37
- db_counter["file"] = self.window.core.idx.get_counters("file")
38
- db_counter["external"] = self.window.core.idx.get_counters("external")
42
+ db_counter = {
43
+ "ctx": idx_core.get_counters("ctx"),
44
+ "file": idx_core.get_counters("file"),
45
+ "external": idx_core.get_counters("external")
46
+ }
39
47
 
40
- for store in self.window.core.idx.items:
48
+ for store in idx_core.items:
41
49
  name = "Items (files): " + store
42
- indexes_data = {}
43
- for idx in self.window.core.idx.items[store]:
44
- indexes_data[idx] = len(self.window.core.idx.items[store][idx].items)
45
- if len(indexes_data) > 0:
46
- self.window.core.debug.add(self.id, name, str(indexes_data))
50
+ indexes_data = {idx: len(idx_core.items[store][idx].items)
51
+ for idx in idx_core.items[store]}
52
+ if indexes_data:
53
+ debug.add(self.id, name, str(indexes_data))
47
54
 
48
55
  # DB items counters
49
- self.window.core.debug.add(self.id, 'DB items (ctx):',
50
- str(db_counter["ctx"]))
51
- self.window.core.debug.add(self.id, 'DB items (external/web):',
52
- str(db_counter["external"]))
53
- self.window.core.debug.add(self.id, 'DB items (file):',
54
- str(db_counter["file"]))
56
+ debug.add(self.id, 'DB items (ctx):', str(db_counter["ctx"]))
57
+ debug.add(self.id, 'DB items (external/web):', str(db_counter["external"]))
58
+ debug.add(self.id, 'DB items (file):', str(db_counter["file"]))
55
59
 
56
- self.window.core.debug.add(self.id, 'Storage (storages):',
57
- str(list(self.window.core.idx.storage.storages.keys())))
58
- self.window.core.debug.add(self.id, 'Temp (in-memory) indices:',
59
- str(self.window.core.idx.storage.count_tmp()))
60
+ debug.add(self.id, 'Storage (storages):', str(list(storage.storages.keys())))
61
+ debug.add(self.id, 'Temp (in-memory) indices:', str(storage.count_tmp()))
60
62
 
61
63
  # loaders
62
- self.window.core.debug.add(self.id, 'Offline loaders [files]:',
63
- str(sorted(list(self.window.core.idx.indexing.loaders["file"].keys()))))
64
- self.window.core.debug.add(self.id, 'Offline loaders [web]:',
65
- str(sorted(list(self.window.core.idx.indexing.loaders["web"].keys()))))
66
- self.window.core.debug.add(self.id, 'External instructions [web]:',
67
- str(self.window.core.idx.indexing.external_instructions))
64
+ debug.add(self.id, 'Offline loaders [files]:', str(sorted(list(indexing.loaders["file"].keys()))))
65
+ debug.add(self.id, 'Offline loaders [web]:', str(sorted(list(indexing.loaders["web"].keys()))))
66
+ debug.add(self.id, 'External instructions [web]:', str(indexing.external_instructions))
68
67
 
69
- excluded = self.window.core.config.get("llama.idx.excluded.ext").replace(" ", "").split(',')
70
- self.window.core.debug.add(self.id, 'Excluded (ext):', str(excluded))
71
- self.window.core.debug.add(self.id, 'Force exclude:',
72
- str(self.window.core.config.get("llama.idx.excluded.force")))
73
- self.window.core.debug.add(self.id, 'Custom metadata:',
74
- str(self.window.core.config.get("llama.idx.custom_meta")))
68
+ excluded = config.get("llama.idx.excluded.ext").replace(" ", "").split(',')
69
+ debug.add(self.id, 'Excluded (ext):', str(excluded))
70
+ debug.add(self.id, 'Force exclude:', str(config.get("llama.idx.excluded.force")))
71
+ debug.add(self.id, 'Custom metadata:', str(config.get("llama.idx.custom_meta")))
75
72
 
76
73
  # ctx
77
- self.window.core.debug.add(self.id, 'CTX [auto]:',
78
- str(self.window.core.config.get("llama.idx.auto")))
79
- last_str = "-"
80
- last_ctx = int(self.window.core.config.get("llama.idx.db.last"))
81
- if last_ctx > 0:
82
- last_str = datetime.datetime.fromtimestamp(last_ctx).strftime('%Y-%m-%d %H:%M:%S') + " (" + str(last_ctx) + ")"
83
- self.window.core.debug.add(self.id, 'CTX [db.last]:', str(last_str))
84
-
85
- # indexes
86
- """
87
- indexes = self.window.core.idx.get_all()
88
- for key in list(indexes):
89
- path = os.path.join(self.window.core.config.get_user_dir('idx'), key)
90
- idx = indexes[key]
91
- self.window.core.debug.add(self.id, '----', '')
92
- idx_data = {
93
- 'id': idx.id,
94
- 'store': idx.store,
95
- 'path': path,
96
- 'items': len(idx.items),
97
- }
98
- self.window.core.debug.add(self.id, 'IDX: [' + str(key) + ']', str(idx_data))
99
-
100
- # files
101
- items = idx.items
102
- for item_id in items:
103
- item = items[item_id]
104
- indexed_dt = datetime.datetime.fromtimestamp(item['indexed_ts'])
105
- data = {
106
- 'id': item['id'],
107
- 'path': item['path'],
108
- 'indexed_at': str(item['indexed_ts']) + ' (' + str(indexed_dt) + ')',
109
- 'file_id': item_id,
110
- }
111
- self.window.core.debug.add(self.id, item_id, str(data))
112
- """
74
+ debug.add(self.id, 'CTX [auto]:', str(config.get("llama.idx.auto")))
75
+ last_ctx = int(config.get("llama.idx.db.last"))
76
+ last_str = "-" if last_ctx <= 0 else f"{datetime.datetime.fromtimestamp(last_ctx).strftime('%Y-%m-%d %H:%M:%S')} ({last_ctx})"
77
+ debug.add(self.id, 'CTX [db.last]:', str(last_str))
113
78
 
114
- self.window.core.debug.end(self.id)
79
+ debug.end(self.id)
@@ -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: 2024.11.20 03:00:00 #
9
+ # Updated Date: 2025.09.14 20:00:00 #
10
10
  # ================================================== #
11
11
 
12
12
  class KernelDebug:
@@ -21,10 +21,13 @@ class KernelDebug:
21
21
 
22
22
  def update(self):
23
23
  """Update debug window."""
24
- self.window.core.debug.begin(self.id)
25
- self.window.core.debug.add(self.id, 'Busy:', str(self.window.controller.kernel.busy))
26
- self.window.core.debug.add(self.id, 'Halt:', str(self.window.controller.kernel.halt))
27
- self.window.core.debug.add(self.id, 'Status:', str(self.window.controller.kernel.status))
28
- self.window.core.debug.add(self.id, 'State:', str(self.window.controller.kernel.state))
29
- self.window.core.debug.add(self.id, 'Stack:', str(self.window.controller.kernel.last_stack))
30
- self.window.core.debug.end(self.id)
24
+ debug = self.window.core.debug
25
+ kernel_controller = self.window.controller.kernel
26
+
27
+ debug.begin(self.id)
28
+ debug.add(self.id, 'Busy:', str(kernel_controller.busy))
29
+ debug.add(self.id, 'Halt:', str(kernel_controller.halt))
30
+ debug.add(self.id, 'Status:', str(kernel_controller.status))
31
+ debug.add(self.id, 'State:', str(kernel_controller.state))
32
+ debug.add(self.id, 'Stack:', str(kernel_controller.last_stack))
33
+ debug.end(self.id)
@@ -6,12 +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: 2025.07.23 15:00:00 #
9
+ # Updated Date: 2025.09.14 20:00:00 #
10
10
  # ================================================== #
11
11
 
12
12
  import os
13
13
 
14
-
15
14
  class ModelsDebug:
16
15
  def __init__(self, window=None):
17
16
  """
@@ -24,30 +23,36 @@ class ModelsDebug:
24
23
 
25
24
  def update(self):
26
25
  """Update debug window."""
27
- self.window.core.debug.begin(self.id)
26
+ debug = self.window.core.debug
27
+ models_controller = self.window.controller.models
28
+ models_core = self.window.core.models
29
+ command_core = self.window.core.command
30
+ config_core = self.window.core.config
31
+
32
+ debug.begin(self.id)
28
33
 
29
- path = os.path.join(self.window.core.config.path, '', 'models.json')
30
- self.window.core.debug.add(self.id, 'Models File', str(path))
31
- self.window.core.debug.add(self.id, 'editor.selected[]', str(self.window.controller.models.editor.selected))
32
- self.window.core.debug.add(self.id, '[func] is_native_enabled()', str(self.window.core.command.is_native_enabled()))
34
+ path = os.path.join(config_core.path, '', 'models.json')
35
+ debug.add(self.id, 'Models File', str(path))
36
+ debug.add(self.id, 'editor.selected[]', str(models_controller.editor.selected))
37
+ debug.add(self.id, '[func] is_native_enabled()', str(command_core.is_native_enabled()))
33
38
 
34
- self.window.core.debug.add(
39
+ debug.add(
35
40
  self.id, 'Options',
36
- str(self.window.controller.model.editor.get_options())
41
+ str(models_controller.model.editor.get_options())
37
42
  )
38
43
 
39
44
  # models
40
- for key in self.window.core.models.items:
45
+ for key in models_core.items:
41
46
  if key == '__meta__':
42
- self.window.core.debug.add(self.id, '__meta__', str(self.window.core.models.items[key]))
47
+ debug.add(self.id, '__meta__', str(models_core.items[key]))
43
48
  continue
44
- model = self.window.core.models.items[key]
49
+
50
+ model = models_core.items[key]
45
51
  data = {
46
52
  'id': model.id,
47
53
  'name': model.name,
48
54
  'provider': model.provider,
49
55
  'mode': model.mode,
50
- # 'multimodal': model.multimodal,
51
56
  'input': model.input,
52
57
  'output': model.output,
53
58
  'langchain': model.langchain,
@@ -58,6 +63,6 @@ class ModelsDebug:
58
63
  'default': model.default,
59
64
  'imported': model.imported,
60
65
  }
61
- self.window.core.debug.add(self.id, str(key), str(data))
66
+ debug.add(self.id, str(key), str(data))
62
67
 
63
- self.window.core.debug.end(self.id)
68
+ debug.end(self.id)
@@ -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: 2024.02.25 22:00:00 #
9
+ # Updated Date: 2025.09.14 20:00:00 #
10
10
  # ================================================== #
11
11
 
12
12
 
@@ -22,17 +22,20 @@ class PluginsDebug:
22
22
 
23
23
  def update(self):
24
24
  """Update debug window."""
25
- self.window.core.debug.begin(self.id)
25
+ debug = self.window.core.debug
26
+ plugins_dict = self.window.core.plugins.plugins
26
27
 
27
- plugins = list(self.window.core.plugins.plugins.keys())
28
+ debug.begin(self.id)
29
+
30
+ plugins = list(plugins_dict.keys())
28
31
  for key in plugins:
29
- plugin = self.window.core.plugins.plugins[key]
32
+ plugin = plugins_dict[key]
30
33
  data = {
31
34
  'id': plugin.id,
32
35
  'name': plugin.name,
33
36
  'description': plugin.description,
34
37
  'options': plugin.options
35
38
  }
36
- self.window.core.debug.add(self.id, str(key), str(data))
39
+ debug.add(self.id, str(key), str(data))
37
40
 
38
- self.window.core.debug.end(self.id)
41
+ debug.end(self.id)
@@ -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.28 09:00:00 #
9
+ # Updated Date: 2025.09.14 20:00:00 #
10
10
  # ================================================== #
11
11
 
12
12
  import os
@@ -39,19 +39,24 @@ class PresetsDebug:
39
39
 
40
40
  def update(self):
41
41
  """Update debug window."""
42
- self.window.core.debug.begin(self.id)
42
+ debug = self.window.core.debug
43
+ presets_controller = self.window.controller.presets
44
+ presets_core = self.window.core.presets
45
+ config_path = self.window.core.config.path
43
46
 
44
- self.window.core.debug.add(
47
+ debug.begin(self.id)
48
+
49
+ debug.add(
45
50
  self.id, 'Options',
46
- str(self.window.controller.presets.editor.get_options())
51
+ str(presets_controller.editor.get_options())
47
52
  )
48
53
 
49
- self.window.core.debug.add(self.id, 'selected[]', str(self.window.controller.presets.selected))
54
+ debug.add(self.id, 'selected[]', str(presets_controller.selected))
50
55
 
51
- # presets
52
- for key in list(dict(self.window.core.presets.items)):
53
- preset = self.window.core.presets.items[key]
54
- path = os.path.join(self.window.core.config.path, 'presets', key + '.json')
56
+ # Presets
57
+ for key in list(dict(presets_core.items)):
58
+ preset = presets_core.items[key]
59
+ path = os.path.join(config_path, 'presets', f"{key}.json")
55
60
  data = {
56
61
  'id': key,
57
62
  'file': path,
@@ -75,6 +80,6 @@ class PresetsDebug:
75
80
  'temperature': preset.temperature,
76
81
  'version': preset.version,
77
82
  }
78
- self.window.core.debug.add(self.id, str(key), str(data))
83
+ debug.add(self.id, str(key), str(data))
79
84
 
80
- self.window.core.debug.end(self.id)
85
+ debug.end(self.id)
@@ -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: 2024.12.14 17:00:00 #
9
+ # Updated Date: 2025.09.14 20:00:00 #
10
10
  # ================================================== #
11
11
 
12
12
  class TabsDebug:
@@ -21,29 +21,35 @@ class TabsDebug:
21
21
 
22
22
  def update(self):
23
23
  """Update debug window."""
24
- self.window.core.debug.begin(self.id)
25
- self.window.core.debug.add(self.id, 'current Col', str(self.window.controller.ui.tabs.get_current_column_idx()))
26
- self.window.core.debug.add(self.id, 'current IDX', str(self.window.controller.ui.tabs.get_current_idx()))
27
- self.window.core.debug.add(self.id, 'current Tab', str(self.window.controller.ui.tabs.get_current_tab()))
28
- self.window.core.debug.add(self.id, 'current PID', str(self.window.controller.ui.tabs.get_current_pid()))
29
- self.window.core.debug.add(self.id, 'current Type', str(self.window.controller.ui.tabs.get_current_type()))
30
- self.window.core.debug.add(self.id, '----', '')
31
- self.window.core.debug.add(self.id, 'last_pid', str(self.window.core.tabs.last_pid))
32
- self.window.core.debug.add(self.id, 'locked', str(self.window.controller.ui.tabs.locked))
33
- self.window.core.debug.add(self.id, 'col', str(self.window.controller.ui.tabs.col))
34
- self.window.core.debug.add(self.id, 'count(pids)', str(len(self.window.core.tabs.pids)))
35
- self.window.core.debug.add(self.id, 'count(ctx bags)', str(len(self.window.core.ctx.container.bags)))
36
- self.window.core.debug.add(self.id, '----', '')
24
+ debug = self.window.core.debug
25
+ tabs_controller = self.window.controller.ui.tabs
26
+ tabs_core = self.window.core.tabs
27
+ ctx_output = self.window.core.ctx.output
28
+ ctx_container = self.window.core.ctx.container
29
+
30
+ debug.begin(self.id)
31
+ debug.add(self.id, 'current Col', str(tabs_controller.get_current_column_idx()))
32
+ debug.add(self.id, 'current IDX', str(tabs_controller.get_current_idx()))
33
+ debug.add(self.id, 'current Tab', str(tabs_controller.get_current_tab()))
34
+ debug.add(self.id, 'current PID', str(tabs_controller.get_current_pid()))
35
+ debug.add(self.id, 'current Type', str(tabs_controller.get_current_type()))
36
+ debug.add(self.id, '----', '')
37
+ debug.add(self.id, 'last_pid', str(tabs_core.last_pid))
38
+ debug.add(self.id, 'locked', str(tabs_controller.locked))
39
+ debug.add(self.id, 'col', str(tabs_controller.col))
40
+ debug.add(self.id, 'count(pids)', str(len(tabs_core.pids)))
41
+ debug.add(self.id, 'count(ctx bags)', str(len(ctx_container.bags)))
42
+ debug.add(self.id, '----', '')
37
43
 
38
44
  # PIDs
39
- for pid in list(self.window.core.tabs.pids):
40
- tab = self.window.core.tabs.pids[pid]
45
+ for pid in list(tabs_core.pids):
46
+ tab = tabs_core.pids[pid]
41
47
  data = tab.to_dict()
42
- self.window.core.debug.add(self.id, "PID ["+str(pid)+"]", str(data))
48
+ debug.add(self.id, f"PID [{pid}]", str(data))
43
49
 
44
50
  # mapping PID => meta.id
45
- self.window.core.debug.add(self.id, '----', '')
46
- self.window.core.debug.add(self.id, 'PID => meta.id', str(self.window.core.ctx.output.mapping))
47
- self.window.core.debug.add(self.id, '(last) meta.id => PID', str(self.window.core.ctx.output.last_pids))
48
- self.window.core.debug.add(self.id, '(last) PID', str(self.window.core.ctx.output.last_pid))
49
- self.window.core.debug.end(self.id)
51
+ debug.add(self.id, '----', '')
52
+ debug.add(self.id, 'PID => meta.id', str(ctx_output.mapping))
53
+ debug.add(self.id, '(last) meta.id => PID', str(ctx_output.last_pids))
54
+ debug.add(self.id, '(last) PID', str(ctx_output.last_pid))
55
+ debug.end(self.id)
@@ -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: 2024.02.25 22:00:00 #
9
+ # Updated Date: 2025.09.14 20:00:00 #
10
10
  # ================================================== #
11
11
 
12
12
 
@@ -45,30 +45,33 @@ class UIDebug:
45
45
  :param items: items
46
46
  :param name: name
47
47
  """
48
- self.window.core.debug.add(self.id, 'ui.' + name, str(self.map_structure(items)))
48
+ self.window.core.debug.add(self.id, f"ui.{name}", str(self.map_structure(items)))
49
49
 
50
50
  def update(self):
51
51
  """Update debug window"""
52
- self.window.core.debug.begin(self.id)
52
+ # Local references
53
+ debug = self.window.core.debug
54
+ lang_mapping = self.window.controller.lang.mapping.get_mapping()
55
+ ui = self.window.ui
53
56
 
54
- self.window.core.debug.add(
55
- self.id, '*lang_mapping',
56
- str(self.map_structure(self.window.controller.lang.mapping.get_mapping(), True))
57
- )
57
+ debug.begin(self.id)
58
58
 
59
- self.update_section(self.window.ui.config, 'config')
60
- self.update_section(self.window.ui.debug, 'debug')
61
- self.update_section(self.window.ui.dialog, 'dialog')
62
- self.update_section(self.window.ui.editor, 'editor')
63
- self.update_section(self.window.ui.groups, 'groups')
64
- self.update_section(self.window.ui.hooks, 'hooks')
65
- self.update_section(self.window.ui.menu, 'menu')
66
- self.update_section(self.window.ui.models, 'models')
67
- self.update_section(self.window.ui.nodes, 'nodes')
68
- self.update_section(self.window.ui.notepad, 'notepad')
69
- self.update_section(self.window.ui.paths, 'paths')
70
- self.update_section(self.window.ui.plugin_addon, 'plugin_addon')
71
- self.update_section(self.window.ui.splitters, 'splitters')
72
- self.update_section(self.window.ui.tabs, 'tabs')
59
+ debug.add(self.id, '*lang_mapping', str(self.map_structure(lang_mapping, True)))
73
60
 
74
- self.window.core.debug.end(self.id)
61
+ # Update sections using local 'ui' reference
62
+ self.update_section(ui.config, 'config')
63
+ self.update_section(ui.debug, 'debug')
64
+ self.update_section(ui.dialog, 'dialog')
65
+ self.update_section(ui.editor, 'editor')
66
+ self.update_section(ui.groups, 'groups')
67
+ self.update_section(ui.hooks, 'hooks')
68
+ self.update_section(ui.menu, 'menu')
69
+ self.update_section(ui.models, 'models')
70
+ self.update_section(ui.nodes, 'nodes')
71
+ self.update_section(ui.notepad, 'notepad')
72
+ self.update_section(ui.paths, 'paths')
73
+ self.update_section(ui.plugin_addon, 'plugin_addon')
74
+ self.update_section(ui.splitters, 'splitters')
75
+ self.update_section(ui.tabs, 'tabs')
76
+
77
+ debug.end(self.id)
@@ -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.13 06:10:00 #
9
+ # Updated Date: 2025.09.14 20:00:00 #
10
10
  # ================================================== #
11
11
 
12
12
  import gc
@@ -884,6 +884,7 @@ class Renderer(BaseRenderer):
884
884
  :param pid: context PID
885
885
  :param payload: payload to append
886
886
  :param flush: True if flush immediately (legacy HTML path)
887
+ :param replace: True if replace whole output (legacy HTML path)
887
888
  """
888
889
  if self.pids[pid].loaded and not self.pids[pid].use_buffer:
889
890
  self.clear_chunks(pid)
@@ -1291,10 +1292,10 @@ class Renderer(BaseRenderer):
1291
1292
  :param meta: context meta
1292
1293
  """
1293
1294
  tab = node.get_tab()
1295
+ tab.delete_ref(node)
1294
1296
  layout = tab.child.layout()
1295
1297
  layout.removeWidget(node)
1296
1298
  self.window.ui.nodes['output'].pop(tab.pid, None)
1297
- tab.child.delete_refs()
1298
1299
 
1299
1300
  node.on_delete()
1300
1301
 
@@ -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.14 20:00:00 #
10
10
  # ================================================== #
11
11
 
12
12
  from datetime import datetime
@@ -140,6 +140,19 @@ class Tab:
140
140
  ref.deleteLater()
141
141
  del self.refs[:]
142
142
 
143
+ def delete_ref(self, widget: Any) -> None:
144
+ """
145
+ Unpin reference to widget in this tab
146
+
147
+ :param widget: widget reference
148
+ """
149
+ for ref in self.refs:
150
+ if ref and ref is widget:
151
+ self.refs.remove(ref)
152
+ break
153
+ if self.child and hasattr(self.child, 'delete_ref'):
154
+ self.child.delete_ref(widget)
155
+
143
156
  def to_dict(self) -> Dict[str, Any]:
144
157
  """
145
158
  Convert to dict
@@ -1,8 +1,8 @@
1
1
  {
2
2
  "__meta__": {
3
- "version": "2.6.45",
4
- "app.version": "2.6.45",
5
- "updated_at": "2025-09-13T00:00:00"
3
+ "version": "2.6.46",
4
+ "app.version": "2.6.46",
5
+ "updated_at": "2025-09-15T00:00:00"
6
6
  },
7
7
  "access.audio.event.speech": false,
8
8
  "access.audio.event.speech.disabled": [],
@@ -1,8 +1,8 @@
1
1
  {
2
2
  "__meta__": {
3
- "version": "2.6.45",
4
- "app.version": "2.6.45",
5
- "updated_at": "2025-09-13T08:03:34"
3
+ "version": "2.6.46",
4
+ "app.version": "2.6.46",
5
+ "updated_at": "2025-09-15T08:03:34"
6
6
  },
7
7
  "items": {
8
8
  "SpeakLeash/bielik-11b-v2.3-instruct:Q4_K_M": {
@@ -53,22 +53,7 @@
53
53
  "secret": false,
54
54
  "advanced": false,
55
55
  "tab": "OpenAI"
56
- },
57
- "api_proxy": {
58
- "section": "api_keys",
59
- "type": "text",
60
- "slider": false,
61
- "label": "settings.api_proxy",
62
- "description": "settings.api_proxy.desc",
63
- "value": "",
64
- "min": null,
65
- "max": null,
66
- "multiplier": null,
67
- "step": null,
68
- "secret": false,
69
- "advanced": false,
70
- "tab": "OpenAI"
71
- },
56
+ },
72
57
  "api_use_responses": {
73
58
  "section": "api_keys",
74
59
  "type": "bool",
@@ -593,7 +578,20 @@
593
578
  "multiplier": 1,
594
579
  "step": 1,
595
580
  "advanced": false
596
- },
581
+ },
582
+ "api_proxy": {
583
+ "section": "general",
584
+ "type": "text",
585
+ "slider": false,
586
+ "label": "settings.api_proxy",
587
+ "description": "settings.api_proxy.desc",
588
+ "value": "",
589
+ "min": null,
590
+ "max": null,
591
+ "multiplier": null,
592
+ "step": null,
593
+ "secret": false
594
+ },
597
595
  "theme.style": {
598
596
  "section": "layout",
599
597
  "type": "combo",
@@ -133,4 +133,10 @@ QCalendarWidget QAbstractItemView::item:hover {{
133
133
  }}
134
134
  .file-explorer QTreeView::branch {{
135
135
  background: #262a2e;
136
+ }}
137
+
138
+ .DebugList::item:selected,
139
+ .DebugList::item:selected:focus {{
140
+ color: #000;
141
+ selection-color: #000000;
136
142
  }}