pygpt-net 2.4.37__py3-none-any.whl → 2.4.41__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 (255) hide show
  1. CHANGELOG.md +29 -0
  2. README.md +44 -115
  3. pygpt_net/CHANGELOG.txt +29 -0
  4. pygpt_net/__init__.py +3 -3
  5. pygpt_net/controller/__init__.py +7 -3
  6. pygpt_net/controller/access/control.py +1 -1
  7. pygpt_net/controller/access/voice.py +11 -5
  8. pygpt_net/controller/agent/experts.py +11 -6
  9. pygpt_net/controller/agent/legacy.py +8 -6
  10. pygpt_net/controller/agent/llama.py +4 -2
  11. pygpt_net/controller/assistant/__init__.py +9 -4
  12. pygpt_net/controller/assistant/batch.py +38 -21
  13. pygpt_net/controller/assistant/editor.py +7 -6
  14. pygpt_net/controller/assistant/files.py +23 -7
  15. pygpt_net/controller/assistant/store.py +20 -7
  16. pygpt_net/controller/assistant/threads.py +34 -8
  17. pygpt_net/controller/attachment.py +29 -10
  18. pygpt_net/controller/audio/__init__.py +25 -4
  19. pygpt_net/controller/calendar/__init__.py +23 -4
  20. pygpt_net/controller/calendar/note.py +57 -11
  21. pygpt_net/controller/camera.py +3 -2
  22. pygpt_net/controller/chat/__init__.py +5 -3
  23. pygpt_net/controller/chat/attachment.py +34 -7
  24. pygpt_net/controller/chat/command.py +4 -2
  25. pygpt_net/controller/chat/common.py +11 -4
  26. pygpt_net/controller/chat/files.py +10 -3
  27. pygpt_net/controller/chat/image.py +17 -5
  28. pygpt_net/controller/chat/input.py +10 -7
  29. pygpt_net/controller/chat/output.py +21 -6
  30. pygpt_net/controller/chat/render.py +100 -21
  31. pygpt_net/controller/chat/response.py +34 -7
  32. pygpt_net/controller/chat/stream.py +4 -2
  33. pygpt_net/controller/chat/text.py +6 -4
  34. pygpt_net/controller/command.py +11 -3
  35. pygpt_net/controller/config/__init__.py +34 -6
  36. pygpt_net/controller/config/field/checkbox.py +7 -4
  37. pygpt_net/controller/config/field/cmd.py +7 -5
  38. pygpt_net/controller/config/field/combo.py +14 -6
  39. pygpt_net/controller/config/field/dictionary.py +14 -11
  40. pygpt_net/controller/config/field/input.py +9 -6
  41. pygpt_net/controller/config/field/slider.py +11 -8
  42. pygpt_net/controller/config/field/textarea.py +8 -5
  43. pygpt_net/controller/config/placeholder.py +52 -21
  44. pygpt_net/controller/ctx/__init__.py +138 -49
  45. pygpt_net/controller/ctx/common.py +15 -4
  46. pygpt_net/controller/ctx/extra.py +11 -3
  47. pygpt_net/controller/ctx/summarizer.py +24 -5
  48. pygpt_net/controller/debug/__init__.py +27 -6
  49. pygpt_net/controller/dialogs/confirm.py +34 -7
  50. pygpt_net/controller/dialogs/debug.py +4 -2
  51. pygpt_net/controller/dialogs/info.py +7 -2
  52. pygpt_net/controller/files.py +48 -10
  53. pygpt_net/controller/finder.py +11 -5
  54. pygpt_net/controller/idx/__init__.py +10 -3
  55. pygpt_net/controller/idx/common.py +4 -2
  56. pygpt_net/controller/idx/indexer.py +25 -17
  57. pygpt_net/controller/idx/settings.py +9 -3
  58. pygpt_net/controller/kernel/__init__.py +34 -8
  59. pygpt_net/controller/kernel/reply.py +12 -3
  60. pygpt_net/controller/kernel/stack.py +5 -3
  61. pygpt_net/controller/lang/custom.py +2 -7
  62. pygpt_net/controller/lang/mapping.py +5 -3
  63. pygpt_net/controller/layout.py +2 -2
  64. pygpt_net/controller/mode.py +16 -4
  65. pygpt_net/controller/model/__init__.py +14 -3
  66. pygpt_net/controller/model/editor.py +8 -3
  67. pygpt_net/controller/notepad.py +26 -12
  68. pygpt_net/controller/painter/capture.py +23 -4
  69. pygpt_net/controller/painter/common.py +9 -7
  70. pygpt_net/controller/plugins/__init__.py +19 -5
  71. pygpt_net/controller/plugins/presets.py +15 -6
  72. pygpt_net/controller/plugins/settings.py +9 -3
  73. pygpt_net/controller/presets/__init__.py +55 -16
  74. pygpt_net/controller/presets/editor.py +26 -10
  75. pygpt_net/controller/settings/__init__.py +3 -2
  76. pygpt_net/controller/settings/editor.py +29 -7
  77. pygpt_net/controller/settings/profile.py +22 -5
  78. pygpt_net/controller/theme/__init__.py +54 -12
  79. pygpt_net/controller/theme/common.py +24 -2
  80. pygpt_net/controller/theme/markdown.py +32 -16
  81. pygpt_net/controller/theme/menu.py +26 -5
  82. pygpt_net/controller/theme/nodes.py +2 -5
  83. pygpt_net/controller/tools/__init__.py +40 -2
  84. pygpt_net/controller/ui/__init__.py +4 -6
  85. pygpt_net/controller/ui/tabs.py +363 -65
  86. pygpt_net/core/access/actions.py +6 -4
  87. pygpt_net/core/access/shortcuts.py +4 -3
  88. pygpt_net/core/access/voice.py +6 -5
  89. pygpt_net/core/agents/legacy.py +4 -2
  90. pygpt_net/core/agents/memory.py +7 -2
  91. pygpt_net/core/agents/observer/evaluation.py +15 -7
  92. pygpt_net/core/agents/provider.py +9 -4
  93. pygpt_net/core/agents/runner.py +61 -15
  94. pygpt_net/core/agents/tools.py +23 -5
  95. pygpt_net/core/assistants/__init__.py +6 -4
  96. pygpt_net/core/assistants/files.py +35 -12
  97. pygpt_net/core/assistants/store.py +20 -10
  98. pygpt_net/core/attachments/__init__.py +54 -15
  99. pygpt_net/core/attachments/context.py +92 -29
  100. pygpt_net/core/audio/__init__.py +71 -3
  101. pygpt_net/core/audio/context.py +7 -2
  102. pygpt_net/core/bridge/__init__.py +22 -6
  103. pygpt_net/core/bridge/context.py +5 -3
  104. pygpt_net/core/calendar/__init__.py +57 -11
  105. pygpt_net/core/chain/__init__.py +8 -2
  106. pygpt_net/core/chain/chat.py +10 -8
  107. pygpt_net/core/chain/completion.py +10 -7
  108. pygpt_net/core/command.py +62 -17
  109. pygpt_net/core/ctx/__init__.py +260 -58
  110. pygpt_net/core/ctx/bag.py +25 -4
  111. pygpt_net/core/ctx/container.py +28 -17
  112. pygpt_net/core/ctx/idx.py +45 -8
  113. pygpt_net/core/ctx/output.py +95 -74
  114. pygpt_net/core/ctx/reply.py +5 -2
  115. pygpt_net/core/db/__init__.py +8 -7
  116. pygpt_net/core/db/viewer.py +17 -11
  117. pygpt_net/core/debug/__init__.py +10 -9
  118. pygpt_net/core/debug/tabs.py +5 -2
  119. pygpt_net/core/docker/__init__.py +11 -5
  120. pygpt_net/core/docker/builder.py +11 -3
  121. pygpt_net/core/events/app.py +5 -3
  122. pygpt_net/core/events/base.py +11 -5
  123. pygpt_net/core/events/control.py +5 -3
  124. pygpt_net/core/events/event.py +17 -7
  125. pygpt_net/core/events/kernel.py +5 -3
  126. pygpt_net/core/events/render.py +5 -3
  127. pygpt_net/core/experts/__init__.py +5 -4
  128. pygpt_net/core/filesystem/__init__.py +52 -34
  129. pygpt_net/core/filesystem/actions.py +8 -5
  130. pygpt_net/core/filesystem/editor.py +13 -3
  131. pygpt_net/core/filesystem/types.py +12 -7
  132. pygpt_net/core/filesystem/url.py +7 -3
  133. pygpt_net/core/idx/__init__.py +34 -25
  134. pygpt_net/core/idx/chat.py +40 -16
  135. pygpt_net/core/idx/context.py +6 -2
  136. pygpt_net/core/idx/indexing.py +84 -35
  137. pygpt_net/core/idx/llm.py +11 -3
  138. pygpt_net/core/idx/metadata.py +13 -3
  139. pygpt_net/core/idx/types/ctx.py +32 -6
  140. pygpt_net/core/idx/types/external.py +41 -7
  141. pygpt_net/core/idx/types/files.py +31 -6
  142. pygpt_net/core/image.py +15 -4
  143. pygpt_net/core/llm/__init__.py +13 -3
  144. pygpt_net/core/locale.py +34 -8
  145. pygpt_net/core/models.py +4 -3
  146. pygpt_net/core/notepad.py +9 -4
  147. pygpt_net/core/plugins.py +7 -6
  148. pygpt_net/core/presets.py +19 -10
  149. pygpt_net/core/profile.py +12 -6
  150. pygpt_net/core/prompt/__init__.py +10 -3
  151. pygpt_net/core/prompt/custom.py +7 -6
  152. pygpt_net/core/prompt/template.py +9 -3
  153. pygpt_net/core/render/base.py +117 -22
  154. pygpt_net/core/render/markdown/body.py +27 -7
  155. pygpt_net/core/render/markdown/renderer.py +119 -22
  156. pygpt_net/core/render/plain/body.py +22 -5
  157. pygpt_net/core/render/plain/renderer.py +97 -21
  158. pygpt_net/core/render/web/body.py +75 -25
  159. pygpt_net/core/render/web/renderer.py +313 -63
  160. pygpt_net/core/settings.py +9 -4
  161. pygpt_net/core/tabs/__init__.py +290 -103
  162. pygpt_net/core/tabs/tab.py +17 -4
  163. pygpt_net/core/tokens.py +44 -11
  164. pygpt_net/core/updater/__init__.py +20 -7
  165. pygpt_net/core/vision/analyzer.py +29 -6
  166. pygpt_net/core/web.py +130 -2
  167. pygpt_net/data/config/config.json +15 -4
  168. pygpt_net/data/config/models.json +3 -3
  169. pygpt_net/data/config/modes.json +3 -3
  170. pygpt_net/data/config/settings.json +55 -10
  171. pygpt_net/data/config/settings_section.json +3 -0
  172. pygpt_net/data/css/style.light.css +1 -0
  173. pygpt_net/data/css/{web.css → web-blocks.css} +162 -133
  174. pygpt_net/data/css/{web.light.css → web-blocks.light.css} +7 -0
  175. pygpt_net/data/css/web-chatgpt.css +350 -0
  176. pygpt_net/data/css/web-chatgpt.dark.css +64 -0
  177. pygpt_net/data/css/web-chatgpt.light.css +75 -0
  178. pygpt_net/data/css/web-chatgpt_wide.css +350 -0
  179. pygpt_net/data/css/web-chatgpt_wide.dark.css +64 -0
  180. pygpt_net/data/css/web-chatgpt_wide.light.css +75 -0
  181. pygpt_net/data/icons/split_screen.svg +1 -0
  182. pygpt_net/data/locale/locale.de.ini +12 -0
  183. pygpt_net/data/locale/locale.en.ini +17 -2
  184. pygpt_net/data/locale/locale.es.ini +12 -0
  185. pygpt_net/data/locale/locale.fr.ini +12 -0
  186. pygpt_net/data/locale/locale.it.ini +12 -0
  187. pygpt_net/data/locale/locale.pl.ini +12 -0
  188. pygpt_net/data/locale/locale.uk.ini +12 -0
  189. pygpt_net/data/locale/locale.zh.ini +12 -0
  190. pygpt_net/data/locale/plugin.cmd_web.de.ini +2 -0
  191. pygpt_net/data/locale/plugin.cmd_web.en.ini +20 -10
  192. pygpt_net/data/locale/plugin.cmd_web.es.ini +2 -0
  193. pygpt_net/data/locale/plugin.cmd_web.fr.ini +2 -0
  194. pygpt_net/data/locale/plugin.cmd_web.it.ini +2 -0
  195. pygpt_net/data/locale/plugin.cmd_web.pl.ini +2 -0
  196. pygpt_net/data/locale/plugin.cmd_web.uk.ini +2 -0
  197. pygpt_net/data/locale/plugin.cmd_web.zh.ini +2 -0
  198. pygpt_net/icons.qrc +1 -0
  199. pygpt_net/icons_rc.py +165 -136
  200. pygpt_net/item/ctx.py +46 -24
  201. pygpt_net/plugin/audio_input/simple.py +21 -5
  202. pygpt_net/plugin/audio_output/__init__.py +4 -1
  203. pygpt_net/plugin/base/config.py +4 -2
  204. pygpt_net/plugin/base/plugin.py +26 -6
  205. pygpt_net/plugin/base/worker.py +37 -9
  206. pygpt_net/plugin/cmd_code_interpreter/__init__.py +39 -37
  207. pygpt_net/plugin/cmd_code_interpreter/runner.py +25 -12
  208. pygpt_net/plugin/cmd_web/__init__.py +46 -6
  209. pygpt_net/plugin/cmd_web/config.py +74 -48
  210. pygpt_net/plugin/cmd_web/websearch.py +61 -28
  211. pygpt_net/plugin/cmd_web/worker.py +79 -13
  212. pygpt_net/provider/core/config/patch.py +43 -1
  213. pygpt_net/provider/core/ctx/base.py +4 -1
  214. pygpt_net/provider/core/ctx/db_sqlite/__init__.py +10 -1
  215. pygpt_net/provider/core/ctx/db_sqlite/storage.py +22 -1
  216. pygpt_net/provider/gpt/assistants.py +10 -9
  217. pygpt_net/provider/gpt/audio.py +3 -2
  218. pygpt_net/provider/gpt/chat.py +8 -7
  219. pygpt_net/provider/gpt/completion.py +6 -4
  220. pygpt_net/provider/gpt/image.py +9 -2
  221. pygpt_net/provider/gpt/store.py +14 -13
  222. pygpt_net/provider/gpt/vision.py +6 -5
  223. pygpt_net/tools/__init__.py +9 -1
  224. pygpt_net/tools/base.py +15 -1
  225. pygpt_net/tools/code_interpreter/__init__.py +174 -75
  226. pygpt_net/tools/code_interpreter/ui/dialogs.py +21 -103
  227. pygpt_net/tools/code_interpreter/ui/widgets.py +284 -9
  228. pygpt_net/tools/html_canvas/__init__.py +78 -23
  229. pygpt_net/tools/html_canvas/ui/dialogs.py +46 -62
  230. pygpt_net/tools/html_canvas/ui/widgets.py +96 -3
  231. pygpt_net/ui/base/context_menu.py +2 -2
  232. pygpt_net/ui/layout/chat/input.py +10 -18
  233. pygpt_net/ui/layout/chat/output.py +26 -44
  234. pygpt_net/ui/layout/ctx/ctx_list.py +13 -4
  235. pygpt_net/ui/layout/toolbox/footer.py +18 -2
  236. pygpt_net/ui/main.py +2 -2
  237. pygpt_net/ui/menu/config.py +7 -11
  238. pygpt_net/ui/menu/debug.py +11 -1
  239. pygpt_net/ui/menu/theme.py +9 -2
  240. pygpt_net/ui/widget/filesystem/explorer.py +2 -2
  241. pygpt_net/ui/widget/lists/context.py +27 -5
  242. pygpt_net/ui/widget/tabs/Input.py +2 -2
  243. pygpt_net/ui/widget/tabs/body.py +2 -1
  244. pygpt_net/ui/widget/tabs/layout.py +195 -0
  245. pygpt_net/ui/widget/tabs/output.py +218 -55
  246. pygpt_net/ui/widget/textarea/html.py +11 -1
  247. pygpt_net/ui/widget/textarea/output.py +10 -1
  248. pygpt_net/ui/widget/textarea/search_input.py +4 -1
  249. pygpt_net/ui/widget/textarea/web.py +49 -9
  250. {pygpt_net-2.4.37.dist-info → pygpt_net-2.4.41.dist-info}/METADATA +45 -116
  251. {pygpt_net-2.4.37.dist-info → pygpt_net-2.4.41.dist-info}/RECORD +255 -247
  252. /pygpt_net/data/css/{web.dark.css → web-blocks.dark.css} +0 -0
  253. {pygpt_net-2.4.37.dist-info → pygpt_net-2.4.41.dist-info}/LICENSE +0 -0
  254. {pygpt_net-2.4.37.dist-info → pygpt_net-2.4.41.dist-info}/WHEEL +0 -0
  255. {pygpt_net-2.4.37.dist-info → pygpt_net-2.4.41.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.11.20 21:00:00 #
9
+ # Updated Date: 2024.12.14 08:00:00 #
10
10
  # ================================================== #
11
11
 
12
12
  import os
@@ -23,6 +23,7 @@ class Markdown:
23
23
  """
24
24
  self.window = window
25
25
  self.css = {} # external styles
26
+ self.web_style = ""
26
27
 
27
28
  def update(self, force: bool = False):
28
29
  """
@@ -60,7 +61,8 @@ class Markdown:
60
61
 
61
62
  :return: stylesheet
62
63
  """
63
- if "web" not in self.css:
64
+ web_style = self.window.core.config.get("theme.style", "blocks")
65
+ if "web" not in self.css or self.web_style != web_style:
64
66
  self.load()
65
67
  if "web" in self.css:
66
68
  return self.css["web"]
@@ -73,31 +75,41 @@ class Markdown:
73
75
  self.window.dispatch(event) # per current engine
74
76
  self.window.controller.ctx.refresh()
75
77
  self.window.controller.ctx.refresh_output()
76
- data = {
78
+ event = RenderEvent(RenderEvent.END, {
77
79
  "meta": meta,
78
- }
79
- event = RenderEvent(RenderEvent.END, data)
80
+ })
80
81
  self.window.dispatch(event)
81
82
 
82
83
  def load(self):
83
84
  """Load markdown styles"""
84
- parents = ["markdown", "web"]
85
+ parents = [
86
+ "markdown",
87
+ "web",
88
+ ]
89
+ web_style = self.window.core.config.get("theme.style", "blocks")
85
90
  for base_name in parents:
91
+ suffix = ""
92
+ if base_name == 'web':
93
+ suffix = "-" + web_style
94
+ self.web_style = web_style
86
95
  theme = self.window.core.config.get('theme')
87
96
  name = str(base_name)
88
- color_name = str(base_name)
89
97
  if theme.startswith('light'):
90
- color_name += '.light'
98
+ color = '.light'
91
99
  else:
92
- color_name += '.dark'
100
+ color = '.dark'
101
+
102
+ # load CSS, app + user
103
+ file_base = name + suffix + '.css'
104
+ file_color = name + suffix + color + '.css'
93
105
  paths = []
94
- paths.append(os.path.join(self.window.core.config.get_app_path(), 'data', 'css', name + '.css'))
95
- paths.append(os.path.join(self.window.core.config.get_app_path(), 'data', 'css', color_name + '.css'))
96
- paths.append(os.path.join(self.window.core.config.get_user_path(), 'css', name + '.css'))
97
- paths.append(os.path.join(self.window.core.config.get_user_path(), 'css', color_name + '.css'))
106
+ paths.append(os.path.join(self.window.core.config.get_app_path(), 'data', 'css', file_base))
107
+ paths.append(os.path.join(self.window.core.config.get_app_path(), 'data', 'css', file_color))
108
+ paths.append(os.path.join(self.window.core.config.get_user_path(), 'css', file_base))
109
+ paths.append(os.path.join(self.window.core.config.get_user_path(), 'css', file_color))
98
110
  content = ''
99
111
  for path in paths:
100
- if os.path.exists(path):
112
+ if os.path.exists(path) and os.path.isfile(path):
101
113
  with open(path, 'r') as file:
102
114
  content += file.read()
103
115
 
@@ -107,8 +119,12 @@ class Markdown:
107
119
  except KeyError as e: # ignore missing env vars
108
120
  pass
109
121
 
110
- def get_default(self):
111
- """Set default markdown CSS"""
122
+ def get_default(self) -> str:
123
+ """
124
+ Set default markdown CSS
125
+
126
+ :return: default CSS
127
+ """
112
128
  colors = {
113
129
  "dark": {
114
130
  "a": "#fff",
@@ -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.05 23:00:00 #
9
+ # Updated Date: 2024.12.07 21:00:00 #
10
10
  # ================================================== #
11
11
 
12
12
  from PySide6.QtGui import QAction
@@ -30,6 +30,18 @@ class Menu:
30
30
  # setup themes list menu
31
31
  if self.loaded:
32
32
  return
33
+
34
+ # styles
35
+ styles = self.window.controller.theme.common.get_styles_list()
36
+ for style in styles:
37
+ style_id = style.lower()
38
+ title = style.replace('_', ' ').title()
39
+ self.window.ui.menu['theme_style'][style_id] = QAction(title, self.window, checkable=True)
40
+ self.window.ui.menu['theme_style'][style_id].triggered.connect(
41
+ lambda checked=None, style=style_id: self.window.controller.theme.toggle_style(style))
42
+ self.window.ui.menu['theme.style'].addAction(self.window.ui.menu['theme_style'][style_id])
43
+
44
+ # color themes
33
45
  themes = self.window.controller.theme.common.get_themes_list()
34
46
  for theme in themes:
35
47
  name = self.window.controller.theme.common.translate(theme)
@@ -42,6 +54,7 @@ class Menu:
42
54
  self.window.ui.menu['theme.dark'].addAction(self.window.ui.menu['theme'][theme])
43
55
  elif theme.startswith('light'):
44
56
  self.window.ui.menu['theme.light'].addAction(self.window.ui.menu['theme'][theme])
57
+
45
58
  self.loaded = True
46
59
 
47
60
  def setup_syntax(self):
@@ -86,14 +99,22 @@ class Menu:
86
99
 
87
100
  def update_list(self):
88
101
  """Update theme list menu"""
89
- current = self.window.core.config.get('theme')
102
+ # styles
103
+ current_style = self.window.core.config.get('theme.style')
104
+ for style in self.window.ui.menu['theme_style']:
105
+ self.window.ui.menu['theme_style'][style].setChecked(False)
106
+ if current_style in self.window.ui.menu['theme_style']:
107
+ self.window.ui.menu['theme_style'][current_style].setChecked(True)
108
+
109
+ # color themes
110
+ current_theme = self.window.core.config.get('theme')
90
111
  for theme in self.window.ui.menu['theme']:
91
112
  self.window.ui.menu['theme'][theme].setChecked(False)
92
- if current in self.window.ui.menu['theme']:
93
- self.window.ui.menu['theme'][current].setChecked(True)
113
+ if current_theme in self.window.ui.menu['theme']:
114
+ self.window.ui.menu['theme'][current_theme].setChecked(True)
94
115
 
95
116
  def update_syntax(self):
96
- """Update syntax menu"""
117
+ """Update code syntax highlight menu"""
97
118
  current = self.window.core.config.get('render.code_syntax')
98
119
  for style in self.window.ui.menu['theme_syntax']:
99
120
  self.window.ui.menu['theme_syntax'][style].setChecked(False)
@@ -6,9 +6,9 @@
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 21:00:00 #
9
+ # Updated Date: 2024.12.12 01:00:00 #
10
10
  # ================================================== #
11
- #
11
+
12
12
  from pygpt_net.core.events import RenderEvent
13
13
 
14
14
 
@@ -93,9 +93,6 @@ class Nodes:
93
93
  continue
94
94
  self.apply(key, type)
95
95
 
96
- # self.window.interpreter.update_stylesheet(self.window.controller.theme.style('font.chat.output'))
97
- # self.window.ui.nodes['interpreter.input'].update_stylesheet(self.window.controller.theme.style('font.chat.input'))
98
-
99
96
  # apply to notepads
100
97
  num_notepads = self.window.controller.notepad.get_num_notepads()
101
98
  if num_notepads > 0:
@@ -6,10 +6,17 @@
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.07 23:00:00 #
9
+ # Updated Date: 2024.12.14 08:00:00 #
10
10
  # ================================================== #
11
11
 
12
+ from typing import Dict, List
13
+
14
+ from PySide6.QtGui import QAction, QIcon
15
+ from PySide6.QtWidgets import QTabWidget, QMenu
16
+
12
17
  from pygpt_net.core.tabs.tab import Tab
18
+ from pygpt_net.utils import trans
19
+
13
20
 
14
21
  class Tools:
15
22
  def __init__(self, window=None):
@@ -44,7 +51,38 @@ class Tools:
44
51
  if idx is not None:
45
52
  self.window.controller.ui.tabs.switch_tab_by_idx(idx)
46
53
 
47
- def get_tab_tools(self) -> dict:
54
+ def append_tab_menu(
55
+ self,
56
+ parent: QTabWidget,
57
+ menu: QMenu,
58
+ idx: int,
59
+ column_idx: int
60
+ ) -> QMenu:
61
+ """
62
+ Append tab menu
63
+
64
+ :param parent: parent widget
65
+ :param menu: menu
66
+ :param idx: tab index
67
+ :param column_idx: column index
68
+ :return: tab add submenu
69
+ """
70
+ submenu = menu.addMenu(QIcon(":/icons/add.svg"), trans("action.tab.add.tool"))
71
+ tools = self.window.tools.get_all()
72
+ for id in tools:
73
+ tool = tools[id]
74
+ if not tool.has_tab:
75
+ continue
76
+ icon = tool.tab_icon
77
+ title = trans(tool.tab_title)
78
+ action = QAction(QIcon(icon), title, parent)
79
+ action.triggered.connect(
80
+ lambda idx=idx, column_idx=column_idx, id=id: parent.add_tab(idx, column_idx, Tab.TAB_TOOL, id)
81
+ )
82
+ submenu.addAction(action)
83
+ return submenu
84
+
85
+ def get_tab_tools(self) -> Dict[str, List[str]]:
48
86
  """
49
87
  Get tab tools
50
88
 
@@ -6,9 +6,11 @@
6
6
  # GitHub: https://github.com/szczyglis-dev/py-gpt #
7
7
  # MIT License #
8
8
  # Created By : Marcin Szczygliński #
9
- # Updated Date: 2024.11.21 20:00:00 #
9
+ # Updated Date: 2024.12.14 00:00:00 #
10
10
  # ================================================== #
11
11
 
12
+ from typing import Optional
13
+
12
14
  from PySide6.QtGui import QColor
13
15
 
14
16
  from pygpt_net.utils import trans
@@ -47,10 +49,6 @@ class UI:
47
49
  self.update()
48
50
  self.init_toolbox()
49
51
 
50
- def pre_setup(self):
51
- """Post setup UI"""
52
- self.tabs.setup()
53
-
54
52
  def update(self):
55
53
  """Update all elements"""
56
54
 
@@ -149,7 +147,7 @@ class UI:
149
147
  model_str = str(model)
150
148
  self.window.ui.nodes['chat.model'].setText(model_str)
151
149
 
152
- def update_ctx_label(self, label: str = None):
150
+ def update_ctx_label(self, label: Optional[str] = None):
153
151
  """
154
152
  Update ctx label
155
153