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 03:00:00 #
9
+ # Updated Date: 2024.12.14 00:00:00 #
10
10
  # ================================================== #
11
11
 
12
12
  import os
@@ -16,6 +16,7 @@ import traceback
16
16
  import logging
17
17
 
18
18
  from pathlib import Path
19
+ from typing import Any, Tuple
19
20
 
20
21
  from pygpt_net.config import Config
21
22
 
@@ -125,7 +126,7 @@ class Debug:
125
126
  else:
126
127
  return "unknown"
127
128
 
128
- def info(self, message: any = None, console: bool = True):
129
+ def info(self, message: Any = None, console: bool = True):
129
130
  """
130
131
  Handle info message
131
132
 
@@ -139,7 +140,7 @@ class Debug:
139
140
  console=console,
140
141
  )
141
142
 
142
- def debug(self, message: any = None, console: bool = True):
143
+ def debug(self, message: Any = None, console: bool = True):
143
144
  """
144
145
  Handle debug message
145
146
 
@@ -152,7 +153,7 @@ class Debug:
152
153
  console=console,
153
154
  )
154
155
 
155
- def warning(self, message: any = None, console: bool = True):
156
+ def warning(self, message: Any = None, console: bool = True):
156
157
  """
157
158
  Handle warning message
158
159
 
@@ -165,7 +166,7 @@ class Debug:
165
166
  console=console,
166
167
  )
167
168
 
168
- def error(self, message: any = None, console: bool = True):
169
+ def error(self, message: Any = None, console: bool = True):
169
170
  """
170
171
  Handle error message
171
172
 
@@ -178,7 +179,7 @@ class Debug:
178
179
  console=console,
179
180
  )
180
181
 
181
- def log(self, message: any = None, level: int = logging.ERROR, console: bool = True):
182
+ def log(self, message: Any = None, level: int = logging.ERROR, console: bool = True):
182
183
  """
183
184
  Handle logger message (by level), default level is ERROR
184
185
 
@@ -227,7 +228,7 @@ class Debug:
227
228
  except Exception as e:
228
229
  pass
229
230
 
230
- def parse_exception(self, e = None, limit: int = 4) -> (bool, str):
231
+ def parse_exception(self, e: Any = None, limit: int = 4) -> Tuple[bool, str]:
231
232
  """
232
233
  Parse exception traceback
233
234
 
@@ -268,7 +269,7 @@ class Debug:
268
269
 
269
270
  return is_sys, data
270
271
 
271
- def parse_alert(self, msg: any) -> str:
272
+ def parse_alert(self, msg: Any) -> str:
272
273
  """
273
274
  Parse alert message
274
275
 
@@ -317,7 +318,7 @@ class Debug:
317
318
  """
318
319
  self.window.controller.dialogs.debug.end(id)
319
320
 
320
- def add(self, id: str, k: str, v: any):
321
+ def add(self, id: str, k: str, v: Any):
321
322
  """
322
323
  Append debug entry (debug window)
323
324
 
@@ -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.07 23:00:00 #
9
+ # Updated Date: 2024.12.12 01:00:00 #
10
10
  # ================================================== #
11
11
 
12
12
  class TabsDebug:
@@ -25,7 +25,10 @@ class TabsDebug:
25
25
  self.window.core.debug.add(self.id, 'current PID', str(self.window.controller.ui.tabs.get_current_pid()))
26
26
  self.window.core.debug.add(self.id, 'current IDX', str(self.window.controller.ui.tabs.get_current_idx()))
27
27
  self.window.core.debug.add(self.id, 'current Type', str(self.window.controller.ui.tabs.get_current_type()))
28
+ self.window.core.debug.add(self.id, 'current Column', str(self.window.controller.ui.tabs.get_current_column_idx()))
28
29
  self.window.core.debug.add(self.id, 'last_pid', str(self.window.core.tabs.last_pid))
30
+ self.window.core.debug.add(self.id, 'locked', str(self.window.controller.ui.tabs.locked))
31
+ self.window.core.debug.add(self.id, 'col', str(self.window.controller.ui.tabs.col))
29
32
  self.window.core.debug.add(self.id, 'count(pids)', str(len(self.window.core.tabs.pids)))
30
33
  self.window.core.debug.add(self.id, 'count(ctx bags)', str(len(self.window.core.ctx.container.bags)))
31
34
  self.window.core.debug.add(self.id, '----', '')
@@ -38,6 +41,6 @@ class TabsDebug:
38
41
 
39
42
  # mapping PID => meta.id
40
43
  self.window.core.debug.add(self.id, 'PID => meta.id', str(self.window.core.ctx.output.mapping))
41
- self.window.core.debug.add(self.id, '(last) PID => meta.id', str(self.window.core.ctx.output.last_pids))
44
+ self.window.core.debug.add(self.id, '(last) meta.id => PID', str(self.window.core.ctx.output.last_pids))
42
45
  self.window.core.debug.add(self.id, '(last) PID', str(self.window.core.ctx.output.last_pid))
43
46
  self.window.core.debug.end(self.id)
@@ -6,10 +6,12 @@
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.24 22:00:00 #
9
+ # Updated Date: 2024.12.14 00:00:00 #
10
10
  # ================================================== #
11
11
 
12
12
  import os
13
+ from typing import Optional, Any
14
+
13
15
  import docker
14
16
  import io
15
17
  import tarfile
@@ -65,8 +67,12 @@ class Docker:
65
67
  tar_stream.seek(0)
66
68
  return tar_stream
67
69
 
68
- def is_image(self):
69
- """Check if the Docker image exists."""
70
+ def is_image(self) -> bool:
71
+ """
72
+ Check if the Docker image exists.
73
+
74
+ :return: True if the image exists.
75
+ """
70
76
  client = self.get_docker_client()
71
77
  try:
72
78
  client.images.get(self.get_image_name())
@@ -334,7 +340,7 @@ class Docker:
334
340
  """
335
341
  return self.plugin.get_option_value('docker_entrypoint')
336
342
 
337
- def execute(self, cmd: str) -> bytes or None:
343
+ def execute(self, cmd: str) -> Optional[bytes]:
338
344
  """
339
345
  Execute command in Docker container.
340
346
 
@@ -394,7 +400,7 @@ class Docker:
394
400
  """
395
401
  self.signals = signals
396
402
 
397
- def log(self, msg):
403
+ def log(self, msg: Any):
398
404
  """
399
405
  Log the message.
400
406
 
@@ -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.24 22:00:00 #
9
+ # Updated Date: 2024.12.14 00:00:00 #
10
10
  # ================================================== #
11
11
 
12
+ from typing import Any
13
+
12
14
  from PySide6.QtCore import Signal, Slot, QObject
13
15
 
14
16
  from pygpt_net.core.events import RenderEvent
@@ -48,13 +50,19 @@ class Builder(QObject):
48
50
 
49
51
 
50
52
  @Slot(object)
51
- def handle_build_failed(self, error):
52
- """Handle build failed"""
53
+ def handle_build_failed(self, error: Any):
54
+ """
55
+ Handle build failed
56
+
57
+ :param error: error
58
+ """
53
59
  self.plugin.window.ui.dialogs.alert(str(error))
54
60
  self.plugin.window.update_status(str(error))
55
61
  self.plugin.window.controller.kernel.stop()
56
62
  event = RenderEvent(RenderEvent.END)
57
63
  self.plugin.window.dispatch(event)
64
+
65
+
58
66
  class WorkerSignals(BaseSignals):
59
67
  build_finished = Signal()
60
68
 
@@ -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.20 03:00:00 #
9
+ # Updated Date: 2024.12.14 08:00:00 #
10
10
  # ================================================== #
11
11
 
12
+ from typing import Optional
13
+
12
14
  from .base import BaseEvent
13
15
 
14
16
  class AppEvent(BaseEvent):
@@ -39,8 +41,8 @@ class AppEvent(BaseEvent):
39
41
 
40
42
  def __init__(
41
43
  self,
42
- name: str = None,
43
- data: dict = None,
44
+ name: Optional[str] = None,
45
+ data: Optional[dict] = None,
44
46
  ):
45
47
  """
46
48
  Event object class
@@ -6,17 +6,19 @@
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: 2024.12.14 08:00:00 #
10
10
  # ================================================== #
11
+
11
12
  import json
13
+ from typing import Optional, Dict, Any
12
14
 
13
15
  from pygpt_net.item.ctx import CtxItem
14
16
 
15
17
  class BaseEvent:
16
18
  def __init__(
17
19
  self,
18
- name: str = None,
19
- data: dict = None,
20
+ name: Optional[str] = None,
21
+ data: Optional[dict] = None,
20
22
  ctx: CtxItem = None
21
23
  ):
22
24
  """
@@ -39,10 +41,14 @@ class BaseEvent:
39
41
 
40
42
  @property
41
43
  def full_name(self) -> str:
42
- """Get full event name"""
44
+ """
45
+ Get full event name
46
+
47
+ :return: Full event name
48
+ """
43
49
  return self.id + ": " + self.name
44
50
 
45
- def to_dict(self) -> dict:
51
+ def to_dict(self) -> Dict[str, Any]:
46
52
  """Dump event to dict"""
47
53
  return {
48
54
  'name': self.name,
@@ -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.20 03:00:00 #
9
+ # Updated Date: 2024.12.14 08:00:00 #
10
10
  # ================================================== #
11
11
 
12
+ from typing import Optional
13
+
12
14
  from .base import BaseEvent
13
15
 
14
16
 
@@ -73,8 +75,8 @@ class ControlEvent(BaseEvent):
73
75
 
74
76
  def __init__(
75
77
  self,
76
- name: str = None,
77
- data: dict = None,
78
+ name: Optional[str] = None,
79
+ data: Optional[dict] = None,
78
80
  ):
79
81
  """
80
82
  Event object class
@@ -6,10 +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.29 23:00:00 #
9
+ # Updated Date: 2024.12.14 08:00:00 #
10
10
  # ================================================== #
11
11
 
12
12
  import json
13
+ from typing import Optional, Dict, Any
13
14
 
14
15
  from pygpt_net.item.ctx import CtxItem
15
16
  from .base import BaseEvent
@@ -61,9 +62,9 @@ class Event(BaseEvent):
61
62
 
62
63
  def __init__(
63
64
  self,
64
- name: str = None,
65
- data: dict = None,
66
- ctx: CtxItem = None
65
+ name: Optional[str] = None,
66
+ data: Optional[dict] = None,
67
+ ctx: Optional[CtxItem] = None
67
68
  ):
68
69
  """
69
70
  Event object class
@@ -84,8 +85,12 @@ class Event(BaseEvent):
84
85
  # internal event, not called from user
85
86
  # internal event is handled synchronously, ctx item has internal flag
86
87
 
87
- def to_dict(self) -> dict:
88
- """Dump event to dict"""
88
+ def to_dict(self) -> Dict[str, Any]:
89
+ """
90
+ Dump event to dict
91
+
92
+ :return: Event dict
93
+ """
89
94
  return {
90
95
  'name': self.name,
91
96
  'data': self.data,
@@ -106,5 +111,10 @@ class Event(BaseEvent):
106
111
  pass
107
112
  return ""
108
113
 
109
- def __str__(self):
114
+ def __str__(self) -> str:
115
+ """
116
+ String representation of event
117
+
118
+ :return: Event string
119
+ """
110
120
  return self.dump()
@@ -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 17:00:00 #
9
+ # Updated Date: 2024.12.14 08:00:00 #
10
10
  # ================================================== #
11
11
 
12
+ from typing import Optional
13
+
12
14
  from .base import BaseEvent
13
15
 
14
16
 
@@ -52,8 +54,8 @@ class KernelEvent(BaseEvent):
52
54
 
53
55
  def __init__(
54
56
  self,
55
- name: str = None,
56
- data: dict = None,
57
+ name: Optional[str] = None,
58
+ data: Optional[dict] = None,
57
59
  ):
58
60
  """
59
61
  Event object class
@@ -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.20 03:00:00 #
9
+ # Updated Date: 2024.12.14 08:00:00 #
10
10
  # ================================================== #
11
11
 
12
+ from typing import Optional
13
+
12
14
  from .base import BaseEvent
13
15
 
14
16
 
@@ -56,8 +58,8 @@ class RenderEvent(BaseEvent):
56
58
 
57
59
  def __init__(
58
60
  self,
59
- name: str = None,
60
- data: dict = None,
61
+ name: Optional[str] = None,
62
+ data: Optional[dict] = None,
61
63
  ):
62
64
  """
63
65
  Event object class
@@ -6,9 +6,10 @@
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.26 19:00:00 #
9
+ # Updated Date: 2024.12.14 08:00:00 #
10
10
  # ================================================== #
11
11
 
12
+ from typing import Dict, List
12
13
 
13
14
  from pygpt_net.core.types import (
14
15
  MODE_AGENT,
@@ -90,7 +91,7 @@ class Experts:
90
91
  """
91
92
  return self.window.core.presets.get_by_id(MODE_EXPERT, id)
92
93
 
93
- def get_experts(self) -> dict:
94
+ def get_experts(self) -> Dict[str, str]:
94
95
  """
95
96
  Get experts names with keys
96
97
 
@@ -191,7 +192,7 @@ class Experts:
191
192
  prompt = prompt.replace("{presets}", "\n".join(experts_list))
192
193
  return prompt
193
194
 
194
- def extract_calls(self, ctx: CtxItem) -> dict:
195
+ def extract_calls(self, ctx: CtxItem) -> Dict[str, str]:
195
196
  """
196
197
  Extract expert calls from context output
197
198
 
@@ -456,7 +457,7 @@ class Experts:
456
457
  })
457
458
  self.window.dispatch(event)
458
459
 
459
- def get_functions(self) -> list:
460
+ def get_functions(self) -> List[Dict[str, str]]:
460
461
  """
461
462
  Append call the expert commands
462
463
 
@@ -6,14 +6,14 @@
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.23 21:00:00 #
9
+ # Updated Date: 2024.12.14 08:00:00 #
10
10
  # ================================================== #
11
11
 
12
12
  import os
13
13
  import shutil
14
14
 
15
- from datetime import datetime
16
15
  from pathlib import PurePath
16
+ from typing import Tuple, Any, Union, List
17
17
  from uuid import uuid4
18
18
 
19
19
  from PySide6.QtCore import QUrl
@@ -38,18 +38,6 @@ class Filesystem:
38
38
  self.types = Types(window)
39
39
  self.url = Url(window)
40
40
  self.workdir_placeholder = "%workdir%"
41
- self.styles = [
42
- "style.css",
43
- "style.dark.css",
44
- "style.light.css",
45
- "markdown.css",
46
- "markdown.dark.css",
47
- "markdown.light.css",
48
- "web.css",
49
- "web.dark.css",
50
- "web.light.css",
51
- "fix_windows.css",
52
- ]
53
41
 
54
42
  def install(self):
55
43
  """Install provider data"""
@@ -77,9 +65,9 @@ class Filesystem:
77
65
 
78
66
  src_dir = os.path.join(self.window.core.config.get_app_path(), 'data', 'css')
79
67
  dst_dir = os.path.join(self.window.core.config.path, 'css')
80
-
68
+ app_styles = os.listdir(src_dir)
81
69
  try:
82
- for style in self.styles:
70
+ for style in app_styles:
83
71
  src = os.path.join(src_dir, style)
84
72
  dst = os.path.join(dst_dir, style)
85
73
  if (not os.path.exists(dst) or force) and os.path.exists(src):
@@ -91,7 +79,8 @@ class Filesystem:
91
79
  """Backup user custom css styles"""
92
80
  css_dir = os.path.join(self.window.core.config.path, 'css')
93
81
  backup_file_extension = '.backup'
94
- for style in self.styles:
82
+ user_styles = os.listdir(css_dir)
83
+ for style in user_styles:
95
84
  src = os.path.join(css_dir, style)
96
85
  dst = os.path.join(css_dir, style + backup_file_extension)
97
86
  if os.path.exists(src):
@@ -118,7 +107,7 @@ class Filesystem:
118
107
  """
119
108
  return [self.make_local(path) for path in paths]
120
109
 
121
- def make_local_list_img(self, paths: list) -> list:
110
+ def make_local_list_img(self, paths: List[str]) -> List[str]:
122
111
  """
123
112
  Make local placeholder paths for images
124
113
 
@@ -132,7 +121,7 @@ class Filesystem:
132
121
  result.append(self.make_local(path))
133
122
  return result
134
123
 
135
- def get_url(self, url) -> QUrl:
124
+ def get_url(self, url: str) -> QUrl:
136
125
  """
137
126
  Make current OS-specific URL to open file or directory
138
127
 
@@ -146,7 +135,7 @@ class Filesystem:
146
135
  else:
147
136
  return QUrl.fromLocalFile(url)
148
137
 
149
- def get_path(self, path) -> str:
138
+ def get_path(self, path: str) -> str:
150
139
  """
151
140
  Prepare current OS-specific path from given path
152
141
 
@@ -155,10 +144,10 @@ class Filesystem:
155
144
  """
156
145
  parts = PurePath(path).parts
157
146
  if len(parts) > 1:
158
- return os.path.join(*parts) # rebuild OS directory separators
147
+ return str(os.path.join(*parts)) # rebuild OS directory separators
159
148
  return path
160
149
 
161
- def to_workdir(self, path) -> str:
150
+ def to_workdir(self, path: str) -> str:
162
151
  """
163
152
  Replace user path with current workdir
164
153
 
@@ -189,7 +178,7 @@ class Filesystem:
189
178
  parts = path[dir_index:]
190
179
  return os.path.join(work_dir, parts)
191
180
 
192
- def extract_local_url(self, path) -> (str, str):
181
+ def extract_local_url(self, path: str) -> Tuple[str, str]:
193
182
  """
194
183
  Extract local url and path from url
195
184
 
@@ -250,7 +239,7 @@ class Filesystem:
250
239
  shutil.copyfile(path, upload_path)
251
240
  return upload_path
252
241
 
253
- def remove_upload(self, path: str) -> None:
242
+ def remove_upload(self, path: str):
254
243
  """
255
244
  Delete uploaded file
256
245
 
@@ -270,7 +259,7 @@ class Filesystem:
270
259
  """
271
260
  return path.startswith('file://') or path.startswith('http://') or path.startswith('https://')
272
261
 
273
- def sizeof_fmt(self, num, suffix='B'):
262
+ def sizeof_fmt(self, num: Any, suffix: str = 'B'):
274
263
  """
275
264
  Convert numbers to human-readable unit formats.
276
265
 
@@ -286,7 +275,11 @@ class Filesystem:
286
275
  num /= 1024.0
287
276
  return "{:.1f} {}{}".format(num, 'Yi', suffix).replace('.', ',')
288
277
 
289
- def get_directory_size(self, directory : str, human_readable: bool = True) -> str or int:
278
+ def get_directory_size(
279
+ self,
280
+ directory: str,
281
+ human_readable: bool = True
282
+ ) -> Union[str, int]:
290
283
  """
291
284
  Calculate the total size of the given directory
292
285
 
@@ -308,7 +301,11 @@ class Filesystem:
308
301
  return self.sizeof_fmt(total_size)
309
302
  return total_size
310
303
 
311
- def get_datadir_size(self, path: str, human_readable: bool = True) -> str or int:
304
+ def get_datadir_size(
305
+ self,
306
+ path: str,
307
+ human_readable: bool = True
308
+ ) -> Union[str, int]:
312
309
  """
313
310
  Calculate the total size of the given data directory
314
311
 
@@ -319,7 +316,11 @@ class Filesystem:
319
316
  data_dir = os.path.join(path, 'data')
320
317
  return self.get_directory_size(data_dir, human_readable)
321
318
 
322
- def get_db_size(self, path: str, human_readable: bool = True) -> str or int:
319
+ def get_db_size(
320
+ self,
321
+ path: str,
322
+ human_readable: bool = True
323
+ ) -> Union[str, int]:
323
324
  """
324
325
  Calculate the total size of the given database
325
326
 
@@ -337,7 +338,11 @@ class Filesystem:
337
338
  return self.sizeof_fmt(total_size)
338
339
  return total_size
339
340
 
340
- def get_free_disk_space(self, directory: str, human_readable: bool = True) -> str or int:
341
+ def get_free_disk_space(
342
+ self,
343
+ directory: str,
344
+ human_readable: bool = True
345
+ ) -> Union[str, int]:
341
346
  """
342
347
  Check free disk space in the given directory
343
348
 
@@ -350,7 +355,13 @@ class Filesystem:
350
355
  return self.sizeof_fmt(free)
351
356
  return free
352
357
 
353
- def copy_workdir(self, path: str, new_path: str, copy_db: bool = True, copy_datadir: bool = True) -> bool:
358
+ def copy_workdir(
359
+ self,
360
+ path: str,
361
+ new_path: str,
362
+ copy_db: bool = True,
363
+ copy_datadir: bool = True
364
+ ) -> bool:
354
365
  """
355
366
  Copy working directory
356
367
 
@@ -389,7 +400,12 @@ class Filesystem:
389
400
  os.remove(profile_file)
390
401
  return True
391
402
 
392
- def clear_workdir(self, path: str, remove_db: bool = True, remove_datadir: bool = True) -> bool:
403
+ def clear_workdir(
404
+ self,
405
+ path: str,
406
+ remove_db: bool = True,
407
+ remove_datadir: bool = True
408
+ ) -> bool:
393
409
  """
394
410
  Clear working directory
395
411
 
@@ -437,7 +453,11 @@ class Filesystem:
437
453
  """
438
454
  return len(os.listdir(path)) == 0
439
455
 
440
- def get_files_from_dir(self, path: str, recursive: bool = True) -> list:
456
+ def get_files_from_dir(
457
+ self,
458
+ path: str,
459
+ recursive: bool = True
460
+ ) -> list:
441
461
  """
442
462
  Get files from directory
443
463
 
@@ -457,5 +477,3 @@ class Filesystem:
457
477
  else:
458
478
  files = [os.path.join(path, f) for f in os.listdir(path) if os.path.isfile(os.path.join(path, f))]
459
479
  return files
460
-
461
-