pygpt-net 2.4.37__py3-none-any.whl → 2.4.42__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 (340) hide show
  1. CHANGELOG.md +37 -0
  2. README.md +176 -182
  3. pygpt_net/CHANGELOG.txt +37 -0
  4. pygpt_net/__init__.py +3 -3
  5. pygpt_net/app.py +3 -1
  6. pygpt_net/controller/__init__.py +7 -3
  7. pygpt_net/controller/access/control.py +1 -1
  8. pygpt_net/controller/access/voice.py +11 -5
  9. pygpt_net/controller/agent/experts.py +11 -6
  10. pygpt_net/controller/agent/legacy.py +8 -6
  11. pygpt_net/controller/agent/llama.py +4 -2
  12. pygpt_net/controller/assistant/__init__.py +9 -4
  13. pygpt_net/controller/assistant/batch.py +38 -21
  14. pygpt_net/controller/assistant/editor.py +7 -6
  15. pygpt_net/controller/assistant/files.py +23 -7
  16. pygpt_net/controller/assistant/store.py +20 -7
  17. pygpt_net/controller/assistant/threads.py +34 -8
  18. pygpt_net/controller/attachment.py +29 -10
  19. pygpt_net/controller/audio/__init__.py +26 -5
  20. pygpt_net/controller/calendar/__init__.py +23 -4
  21. pygpt_net/controller/calendar/note.py +57 -11
  22. pygpt_net/controller/camera.py +4 -12
  23. pygpt_net/controller/chat/__init__.py +5 -3
  24. pygpt_net/controller/chat/attachment.py +34 -7
  25. pygpt_net/controller/chat/audio.py +2 -2
  26. pygpt_net/controller/chat/command.py +4 -2
  27. pygpt_net/controller/chat/common.py +11 -4
  28. pygpt_net/controller/chat/files.py +10 -3
  29. pygpt_net/controller/chat/image.py +17 -5
  30. pygpt_net/controller/chat/input.py +10 -7
  31. pygpt_net/controller/chat/output.py +21 -6
  32. pygpt_net/controller/chat/render.py +100 -21
  33. pygpt_net/controller/chat/response.py +34 -7
  34. pygpt_net/controller/chat/stream.py +4 -2
  35. pygpt_net/controller/chat/text.py +6 -4
  36. pygpt_net/controller/command.py +11 -3
  37. pygpt_net/controller/config/__init__.py +34 -6
  38. pygpt_net/controller/config/field/checkbox.py +7 -4
  39. pygpt_net/controller/config/field/cmd.py +7 -5
  40. pygpt_net/controller/config/field/combo.py +14 -6
  41. pygpt_net/controller/config/field/dictionary.py +14 -11
  42. pygpt_net/controller/config/field/input.py +9 -6
  43. pygpt_net/controller/config/field/slider.py +11 -8
  44. pygpt_net/controller/config/field/textarea.py +8 -5
  45. pygpt_net/controller/config/placeholder.py +66 -21
  46. pygpt_net/controller/ctx/__init__.py +138 -49
  47. pygpt_net/controller/ctx/common.py +15 -4
  48. pygpt_net/controller/ctx/extra.py +11 -3
  49. pygpt_net/controller/ctx/summarizer.py +24 -5
  50. pygpt_net/controller/debug/__init__.py +27 -6
  51. pygpt_net/controller/dialogs/confirm.py +34 -7
  52. pygpt_net/controller/dialogs/debug.py +4 -2
  53. pygpt_net/controller/dialogs/info.py +7 -2
  54. pygpt_net/controller/files.py +48 -10
  55. pygpt_net/controller/finder.py +11 -5
  56. pygpt_net/controller/idx/__init__.py +10 -3
  57. pygpt_net/controller/idx/common.py +4 -2
  58. pygpt_net/controller/idx/indexer.py +25 -17
  59. pygpt_net/controller/idx/settings.py +9 -3
  60. pygpt_net/controller/kernel/__init__.py +34 -8
  61. pygpt_net/controller/kernel/reply.py +12 -3
  62. pygpt_net/controller/kernel/stack.py +5 -3
  63. pygpt_net/controller/lang/custom.py +2 -7
  64. pygpt_net/controller/lang/mapping.py +5 -3
  65. pygpt_net/controller/layout.py +2 -2
  66. pygpt_net/controller/mode.py +16 -4
  67. pygpt_net/controller/model/__init__.py +14 -3
  68. pygpt_net/controller/model/editor.py +8 -3
  69. pygpt_net/controller/notepad.py +26 -12
  70. pygpt_net/controller/painter/capture.py +23 -4
  71. pygpt_net/controller/painter/common.py +9 -7
  72. pygpt_net/controller/plugins/__init__.py +19 -5
  73. pygpt_net/controller/plugins/presets.py +15 -6
  74. pygpt_net/controller/plugins/settings.py +9 -3
  75. pygpt_net/controller/presets/__init__.py +55 -16
  76. pygpt_net/controller/presets/editor.py +26 -10
  77. pygpt_net/controller/settings/__init__.py +3 -2
  78. pygpt_net/controller/settings/editor.py +29 -7
  79. pygpt_net/controller/settings/profile.py +22 -5
  80. pygpt_net/controller/theme/__init__.py +54 -12
  81. pygpt_net/controller/theme/common.py +24 -2
  82. pygpt_net/controller/theme/markdown.py +32 -16
  83. pygpt_net/controller/theme/menu.py +26 -5
  84. pygpt_net/controller/theme/nodes.py +2 -5
  85. pygpt_net/controller/tools/__init__.py +40 -2
  86. pygpt_net/controller/ui/__init__.py +4 -6
  87. pygpt_net/controller/ui/mode.py +16 -21
  88. pygpt_net/controller/ui/tabs.py +363 -65
  89. pygpt_net/core/access/actions.py +6 -4
  90. pygpt_net/core/access/shortcuts.py +4 -3
  91. pygpt_net/core/access/voice.py +6 -5
  92. pygpt_net/core/agents/legacy.py +4 -2
  93. pygpt_net/core/agents/memory.py +7 -2
  94. pygpt_net/core/agents/observer/evaluation.py +15 -7
  95. pygpt_net/core/agents/provider.py +9 -4
  96. pygpt_net/core/agents/runner.py +61 -15
  97. pygpt_net/core/agents/tools.py +23 -5
  98. pygpt_net/core/assistants/__init__.py +6 -4
  99. pygpt_net/core/assistants/files.py +35 -12
  100. pygpt_net/core/assistants/store.py +20 -10
  101. pygpt_net/core/attachments/__init__.py +54 -15
  102. pygpt_net/core/attachments/context.py +92 -29
  103. pygpt_net/core/audio/__init__.py +74 -3
  104. pygpt_net/core/audio/context.py +7 -2
  105. pygpt_net/core/audio/whisper.py +37 -0
  106. pygpt_net/core/bridge/__init__.py +22 -6
  107. pygpt_net/core/bridge/context.py +5 -3
  108. pygpt_net/core/bridge/worker.py +2 -2
  109. pygpt_net/core/calendar/__init__.py +57 -11
  110. pygpt_net/core/chain/__init__.py +8 -2
  111. pygpt_net/core/chain/chat.py +10 -8
  112. pygpt_net/core/chain/completion.py +10 -7
  113. pygpt_net/core/command.py +62 -17
  114. pygpt_net/core/ctx/__init__.py +260 -58
  115. pygpt_net/core/ctx/bag.py +25 -4
  116. pygpt_net/core/ctx/container.py +28 -17
  117. pygpt_net/core/ctx/idx.py +45 -8
  118. pygpt_net/core/ctx/output.py +95 -74
  119. pygpt_net/core/ctx/reply.py +5 -2
  120. pygpt_net/core/db/__init__.py +8 -7
  121. pygpt_net/core/db/viewer.py +17 -11
  122. pygpt_net/core/debug/__init__.py +10 -9
  123. pygpt_net/core/debug/events.py +22 -10
  124. pygpt_net/core/debug/tabs.py +9 -3
  125. pygpt_net/core/docker/__init__.py +11 -5
  126. pygpt_net/core/docker/builder.py +11 -3
  127. pygpt_net/core/events/app.py +5 -3
  128. pygpt_net/core/events/base.py +11 -5
  129. pygpt_net/core/events/control.py +5 -3
  130. pygpt_net/core/events/event.py +17 -7
  131. pygpt_net/core/events/kernel.py +5 -3
  132. pygpt_net/core/events/render.py +5 -3
  133. pygpt_net/core/experts/__init__.py +5 -4
  134. pygpt_net/core/filesystem/__init__.py +52 -34
  135. pygpt_net/core/filesystem/actions.py +8 -5
  136. pygpt_net/core/filesystem/editor.py +13 -3
  137. pygpt_net/core/filesystem/types.py +12 -7
  138. pygpt_net/core/filesystem/url.py +7 -3
  139. pygpt_net/core/history.py +3 -2
  140. pygpt_net/core/idx/__init__.py +48 -27
  141. pygpt_net/core/idx/chat.py +51 -17
  142. pygpt_net/core/idx/context.py +6 -2
  143. pygpt_net/core/idx/indexing.py +107 -42
  144. pygpt_net/core/idx/llm.py +11 -3
  145. pygpt_net/core/idx/metadata.py +13 -3
  146. pygpt_net/core/idx/types/ctx.py +32 -6
  147. pygpt_net/core/idx/types/external.py +41 -7
  148. pygpt_net/core/idx/types/files.py +31 -6
  149. pygpt_net/core/image.py +15 -4
  150. pygpt_net/core/installer.py +2 -4
  151. pygpt_net/core/llm/__init__.py +13 -3
  152. pygpt_net/core/locale.py +34 -8
  153. pygpt_net/core/models.py +63 -17
  154. pygpt_net/core/modes.py +11 -13
  155. pygpt_net/core/notepad.py +10 -5
  156. pygpt_net/core/plugins.py +31 -19
  157. pygpt_net/core/presets.py +37 -17
  158. pygpt_net/core/profile.py +21 -7
  159. pygpt_net/core/prompt/__init__.py +10 -3
  160. pygpt_net/core/prompt/custom.py +7 -6
  161. pygpt_net/core/prompt/template.py +9 -3
  162. pygpt_net/core/render/base.py +117 -22
  163. pygpt_net/core/render/markdown/body.py +27 -7
  164. pygpt_net/core/render/markdown/renderer.py +119 -22
  165. pygpt_net/core/render/plain/body.py +22 -5
  166. pygpt_net/core/render/plain/renderer.py +97 -21
  167. pygpt_net/core/render/web/body.py +75 -25
  168. pygpt_net/core/render/web/parser.py +3 -1
  169. pygpt_net/core/render/web/renderer.py +313 -63
  170. pygpt_net/core/settings.py +10 -5
  171. pygpt_net/core/tabs/__init__.py +290 -103
  172. pygpt_net/core/tabs/tab.py +26 -5
  173. pygpt_net/core/tokens.py +47 -12
  174. pygpt_net/core/updater/__init__.py +20 -7
  175. pygpt_net/core/vision/analyzer.py +29 -6
  176. pygpt_net/core/{web.py → web/__init__.py} +29 -7
  177. pygpt_net/core/web/helpers.py +237 -0
  178. pygpt_net/data/config/config.json +15 -4
  179. pygpt_net/data/config/models.json +3 -3
  180. pygpt_net/data/config/modes.json +3 -3
  181. pygpt_net/data/config/settings.json +55 -10
  182. pygpt_net/data/config/settings_section.json +3 -0
  183. pygpt_net/data/css/style.light.css +1 -0
  184. pygpt_net/data/css/{web.css → web-blocks.css} +162 -133
  185. pygpt_net/data/css/{web.light.css → web-blocks.light.css} +7 -0
  186. pygpt_net/data/css/web-chatgpt.css +350 -0
  187. pygpt_net/data/css/web-chatgpt.dark.css +64 -0
  188. pygpt_net/data/css/web-chatgpt.light.css +75 -0
  189. pygpt_net/data/css/web-chatgpt_wide.css +350 -0
  190. pygpt_net/data/css/web-chatgpt_wide.dark.css +64 -0
  191. pygpt_net/data/css/web-chatgpt_wide.light.css +75 -0
  192. pygpt_net/data/icons/split_screen.svg +1 -0
  193. pygpt_net/data/locale/locale.de.ini +12 -0
  194. pygpt_net/data/locale/locale.en.ini +18 -2
  195. pygpt_net/data/locale/locale.es.ini +12 -0
  196. pygpt_net/data/locale/locale.fr.ini +12 -0
  197. pygpt_net/data/locale/locale.it.ini +12 -0
  198. pygpt_net/data/locale/locale.pl.ini +12 -0
  199. pygpt_net/data/locale/locale.uk.ini +12 -0
  200. pygpt_net/data/locale/locale.zh.ini +12 -0
  201. pygpt_net/data/locale/plugin.cmd_web.de.ini +2 -0
  202. pygpt_net/data/locale/plugin.cmd_web.en.ini +22 -10
  203. pygpt_net/data/locale/plugin.cmd_web.es.ini +2 -0
  204. pygpt_net/data/locale/plugin.cmd_web.fr.ini +2 -0
  205. pygpt_net/data/locale/plugin.cmd_web.it.ini +2 -0
  206. pygpt_net/data/locale/plugin.cmd_web.pl.ini +2 -0
  207. pygpt_net/data/locale/plugin.cmd_web.uk.ini +2 -0
  208. pygpt_net/data/locale/plugin.cmd_web.zh.ini +2 -0
  209. pygpt_net/data/locale/plugin.mailer.en.ini +21 -0
  210. pygpt_net/icons.qrc +1 -0
  211. pygpt_net/icons_rc.py +165 -136
  212. pygpt_net/item/ctx.py +58 -25
  213. pygpt_net/plugin/agent/__init__.py +7 -2
  214. pygpt_net/plugin/audio_input/simple.py +21 -5
  215. pygpt_net/plugin/audio_output/__init__.py +9 -1
  216. pygpt_net/plugin/base/config.py +4 -2
  217. pygpt_net/plugin/base/plugin.py +75 -23
  218. pygpt_net/plugin/base/worker.py +42 -11
  219. pygpt_net/plugin/cmd_code_interpreter/__init__.py +39 -37
  220. pygpt_net/plugin/cmd_code_interpreter/runner.py +25 -12
  221. pygpt_net/plugin/cmd_history/config.py +2 -2
  222. pygpt_net/plugin/cmd_web/__init__.py +48 -9
  223. pygpt_net/plugin/cmd_web/config.py +135 -41
  224. pygpt_net/plugin/cmd_web/websearch.py +74 -33
  225. pygpt_net/plugin/cmd_web/worker.py +142 -13
  226. pygpt_net/plugin/idx_llama_index/config.py +3 -3
  227. pygpt_net/plugin/mailer/__init__.py +123 -0
  228. pygpt_net/plugin/mailer/config.py +149 -0
  229. pygpt_net/plugin/mailer/runner.py +285 -0
  230. pygpt_net/plugin/mailer/worker.py +123 -0
  231. pygpt_net/provider/agents/base.py +5 -2
  232. pygpt_net/provider/agents/openai.py +4 -2
  233. pygpt_net/provider/agents/openai_assistant.py +4 -2
  234. pygpt_net/provider/agents/planner.py +4 -2
  235. pygpt_net/provider/agents/react.py +4 -2
  236. pygpt_net/provider/audio_output/openai_tts.py +5 -11
  237. pygpt_net/provider/core/assistant/base.py +5 -3
  238. pygpt_net/provider/core/assistant/json_file.py +8 -5
  239. pygpt_net/provider/core/assistant_file/base.py +4 -3
  240. pygpt_net/provider/core/assistant_file/db_sqlite/__init__.py +4 -3
  241. pygpt_net/provider/core/assistant_file/db_sqlite/storage.py +3 -2
  242. pygpt_net/provider/core/assistant_store/base.py +6 -4
  243. pygpt_net/provider/core/assistant_store/db_sqlite/__init__.py +5 -4
  244. pygpt_net/provider/core/assistant_store/db_sqlite/storage.py +5 -3
  245. pygpt_net/provider/core/attachment/base.py +5 -3
  246. pygpt_net/provider/core/attachment/json_file.py +4 -3
  247. pygpt_net/provider/core/calendar/base.py +5 -3
  248. pygpt_net/provider/core/calendar/db_sqlite/__init__.py +6 -5
  249. pygpt_net/provider/core/calendar/db_sqlite/storage.py +5 -4
  250. pygpt_net/provider/core/config/base.py +8 -6
  251. pygpt_net/provider/core/config/json_file.py +9 -7
  252. pygpt_net/provider/core/config/patch.py +43 -1
  253. pygpt_net/provider/core/ctx/base.py +30 -25
  254. pygpt_net/provider/core/ctx/db_sqlite/__init__.py +59 -34
  255. pygpt_net/provider/core/ctx/db_sqlite/storage.py +62 -30
  256. pygpt_net/provider/core/ctx/db_sqlite/utils.py +11 -9
  257. pygpt_net/provider/core/index/base.py +129 -23
  258. pygpt_net/provider/core/index/db_sqlite/__init__.py +130 -23
  259. pygpt_net/provider/core/index/db_sqlite/storage.py +130 -23
  260. pygpt_net/provider/core/index/db_sqlite/utils.py +4 -2
  261. pygpt_net/provider/core/mode/base.py +5 -3
  262. pygpt_net/provider/core/mode/json_file.py +7 -6
  263. pygpt_net/provider/core/model/base.py +6 -4
  264. pygpt_net/provider/core/model/json_file.py +9 -7
  265. pygpt_net/provider/core/notepad/base.py +5 -3
  266. pygpt_net/provider/core/notepad/db_sqlite/__init__.py +5 -4
  267. pygpt_net/provider/core/notepad/db_sqlite/storage.py +4 -3
  268. pygpt_net/provider/core/plugin_preset/base.py +4 -2
  269. pygpt_net/provider/core/plugin_preset/json_file.py +5 -3
  270. pygpt_net/provider/core/preset/base.py +6 -4
  271. pygpt_net/provider/core/preset/json_file.py +9 -9
  272. pygpt_net/provider/core/prompt/base.py +6 -3
  273. pygpt_net/provider/core/prompt/json_file.py +11 -6
  274. pygpt_net/provider/gpt/assistants.py +21 -11
  275. pygpt_net/provider/gpt/audio.py +6 -5
  276. pygpt_net/provider/gpt/chat.py +10 -7
  277. pygpt_net/provider/gpt/completion.py +11 -5
  278. pygpt_net/provider/gpt/image.py +9 -2
  279. pygpt_net/provider/gpt/store.py +53 -18
  280. pygpt_net/provider/gpt/vision.py +17 -11
  281. pygpt_net/provider/llms/anthropic.py +7 -2
  282. pygpt_net/provider/llms/azure_openai.py +26 -5
  283. pygpt_net/provider/llms/base.py +47 -9
  284. pygpt_net/provider/llms/google.py +7 -2
  285. pygpt_net/provider/llms/hugging_face.py +13 -3
  286. pygpt_net/provider/llms/hugging_face_api.py +18 -4
  287. pygpt_net/provider/llms/local.py +7 -2
  288. pygpt_net/provider/llms/ollama.py +30 -6
  289. pygpt_net/provider/llms/openai.py +32 -6
  290. pygpt_net/provider/vector_stores/__init__.py +45 -14
  291. pygpt_net/provider/vector_stores/base.py +35 -8
  292. pygpt_net/provider/vector_stores/chroma.py +13 -3
  293. pygpt_net/provider/vector_stores/ctx_attachment.py +31 -12
  294. pygpt_net/provider/vector_stores/elasticsearch.py +12 -3
  295. pygpt_net/provider/vector_stores/pinecode.py +12 -3
  296. pygpt_net/provider/vector_stores/redis.py +12 -3
  297. pygpt_net/provider/vector_stores/simple.py +12 -3
  298. pygpt_net/provider/vector_stores/temp.py +16 -4
  299. pygpt_net/provider/web/base.py +10 -3
  300. pygpt_net/provider/web/google_custom_search.py +9 -3
  301. pygpt_net/provider/web/microsoft_bing.py +9 -3
  302. pygpt_net/tools/__init__.py +20 -4
  303. pygpt_net/tools/audio_transcriber/__init__.py +4 -3
  304. pygpt_net/tools/base.py +28 -7
  305. pygpt_net/tools/code_interpreter/__init__.py +177 -77
  306. pygpt_net/tools/code_interpreter/ui/dialogs.py +21 -103
  307. pygpt_net/tools/code_interpreter/ui/widgets.py +284 -9
  308. pygpt_net/tools/html_canvas/__init__.py +81 -25
  309. pygpt_net/tools/html_canvas/ui/dialogs.py +46 -62
  310. pygpt_net/tools/html_canvas/ui/widgets.py +96 -3
  311. pygpt_net/tools/image_viewer/__init__.py +10 -4
  312. pygpt_net/tools/indexer/__init__.py +8 -7
  313. pygpt_net/tools/media_player/__init__.py +4 -3
  314. pygpt_net/tools/text_editor/__init__.py +36 -10
  315. pygpt_net/ui/base/context_menu.py +2 -2
  316. pygpt_net/ui/layout/chat/input.py +10 -18
  317. pygpt_net/ui/layout/chat/output.py +27 -45
  318. pygpt_net/ui/layout/ctx/ctx_list.py +13 -4
  319. pygpt_net/ui/layout/toolbox/footer.py +18 -2
  320. pygpt_net/ui/main.py +2 -2
  321. pygpt_net/ui/menu/audio.py +12 -1
  322. pygpt_net/ui/menu/config.py +7 -11
  323. pygpt_net/ui/menu/debug.py +11 -1
  324. pygpt_net/ui/menu/theme.py +9 -2
  325. pygpt_net/ui/widget/filesystem/explorer.py +2 -2
  326. pygpt_net/ui/widget/lists/context.py +27 -5
  327. pygpt_net/ui/widget/tabs/Input.py +2 -2
  328. pygpt_net/ui/widget/tabs/body.py +2 -1
  329. pygpt_net/ui/widget/tabs/layout.py +195 -0
  330. pygpt_net/ui/widget/tabs/output.py +218 -55
  331. pygpt_net/ui/widget/textarea/html.py +11 -1
  332. pygpt_net/ui/widget/textarea/output.py +10 -1
  333. pygpt_net/ui/widget/textarea/search_input.py +4 -1
  334. pygpt_net/ui/widget/textarea/web.py +49 -9
  335. {pygpt_net-2.4.37.dist-info → pygpt_net-2.4.42.dist-info}/METADATA +177 -183
  336. {pygpt_net-2.4.37.dist-info → pygpt_net-2.4.42.dist-info}/RECORD +340 -325
  337. /pygpt_net/data/css/{web.dark.css → web-blocks.dark.css} +0 -0
  338. {pygpt_net-2.4.37.dist-info → pygpt_net-2.4.42.dist-info}/LICENSE +0 -0
  339. {pygpt_net-2.4.37.dist-info → pygpt_net-2.4.42.dist-info}/WHEEL +0 -0
  340. {pygpt_net-2.4.37.dist-info → pygpt_net-2.4.42.dist-info}/entry_points.txt +0 -0
@@ -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.26 19:00:00 #
9
+ # Updated Date: 2024.12.14 00:00:00 #
10
10
  # ================================================== #
11
11
 
12
+ from typing import Any
13
+
12
14
  from pygpt_net.core.events import AppEvent
13
15
  from pygpt_net.item.ctx import CtxItem
14
16
 
@@ -64,7 +66,7 @@ class Chat:
64
66
  self.render.reload()
65
67
  self.attachment.reload()
66
68
 
67
- def handle_error(self, err: any):
69
+ def handle_error(self, err: Any):
68
70
  """
69
71
  Handle error
70
72
 
@@ -93,7 +95,7 @@ class Chat:
93
95
  else:
94
96
  self.log("[ctx] {}.".format(mode.upper()))
95
97
 
96
- def log(self, data: any):
98
+ def log(self, data: Any):
97
99
  """
98
100
  Log data to debug
99
101
 
@@ -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 os
13
+ from typing import List, Dict, Any
13
14
 
14
15
  from PySide6.QtCore import Slot, QObject
15
16
 
@@ -74,7 +75,11 @@ class Attachment(QObject):
74
75
  """Reload attachments"""
75
76
  self.setup()
76
77
 
77
- def handle(self, mode: str, text: str):
78
+ def handle(
79
+ self,
80
+ mode: str,
81
+ text: str
82
+ ):
78
83
  """
79
84
  Handle attachment upload
80
85
 
@@ -104,7 +109,12 @@ class Attachment(QObject):
104
109
  return True
105
110
  return False
106
111
 
107
- def upload(self, meta: CtxMeta, mode: str, prompt: str) -> bool:
112
+ def upload(
113
+ self,
114
+ meta: CtxMeta,
115
+ mode: str,
116
+ prompt: str
117
+ ) -> bool:
108
118
  """
109
119
  Upload attachments for meta
110
120
 
@@ -261,7 +271,11 @@ class Attachment(QObject):
261
271
  """
262
272
  return self.mode
263
273
 
264
- def get_context(self, ctx: CtxItem, history: list) -> str:
274
+ def get_context(
275
+ self,
276
+ ctx: CtxItem,
277
+ history: List[CtxItem]
278
+ ) -> str:
265
279
  """
266
280
  Get additional context for attachment
267
281
 
@@ -292,7 +306,10 @@ class Attachment(QObject):
292
306
  return "====================================\nADDITIONAL CONTEXT FROM ATTACHMENT(s): {}".format(content)
293
307
  return ""
294
308
 
295
- def get_uploaded_attachments(self, meta: CtxMeta) -> list:
309
+ def get_uploaded_attachments(
310
+ self,
311
+ meta: CtxMeta
312
+ ) -> List[Dict[str, Any]]:
296
313
  """
297
314
  Get uploaded attachments for meta
298
315
 
@@ -364,7 +381,12 @@ class Attachment(QObject):
364
381
  """Hide uploaded attachments"""
365
382
  self.window.ui.tabs['input'].setTabVisible(self.uploaded_tab_idx, False)
366
383
 
367
- def delete_by_idx(self, idx: int, force: bool = False, remove_local=True):
384
+ def delete_by_idx(
385
+ self,
386
+ idx: int,
387
+ force: bool = False,
388
+ remove_local: bool = True
389
+ ):
368
390
  """
369
391
  Delete attachment by index
370
392
 
@@ -388,7 +410,12 @@ class Attachment(QObject):
388
410
  self.window.core.attachments.context.delete(meta, item, delete_files=remove_local)
389
411
  self.update_list(meta)
390
412
 
391
- def clear(self, force: bool = False, remove_local=False, auto: bool = False):
413
+ def clear(
414
+ self,
415
+ force: bool = False,
416
+ remove_local: bool = False,
417
+ auto: bool = False
418
+ ):
392
419
  """
393
420
  Clear attachments list
394
421
 
@@ -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.26 19:00:00 #
9
+ # Updated Date: 2024.12.14 18:00:00 #
10
10
  # ================================================== #
11
11
 
12
12
  import base64
@@ -63,7 +63,7 @@ class Audio:
63
63
  :param ctx: Context item
64
64
  """
65
65
  wav_path = os.path.join(self.window.core.config.get_user_path(), self.audio_file)
66
- if ctx.is_audio and ctx.audio_output:
66
+ if ctx.is_audio and ctx.audio_output and ctx.audio_read_allowed():
67
67
  wav_bytes = base64.b64decode(ctx.audio_output)
68
68
  with open(wav_path, "wb") as f:
69
69
  f.write(wav_bytes)
@@ -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 Any
13
+
12
14
  from pygpt_net.core.types import (
13
15
  MODE_AGENT,
14
16
  )
@@ -79,7 +81,7 @@ class Command:
79
81
  })
80
82
  self.window.dispatch(event)
81
83
 
82
- def log(self, data: any):
84
+ def log(self, data: Any):
83
85
  """
84
86
  Log data to debug
85
87
 
@@ -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.21 20:00:00 #
9
+ # Updated Date: 2024.12.14 08:00:00 #
10
10
  # ================================================== #
11
11
 
12
12
  import os
@@ -113,7 +113,11 @@ class Common:
113
113
  self.window.ui.nodes['input'].setFocus()
114
114
  self.initialized = True
115
115
 
116
- def append_to_input(self, text: str, separator: str = "\n"):
116
+ def append_to_input(
117
+ self,
118
+ text: str,
119
+ separator: str = "\n"
120
+ ):
117
121
  """
118
122
  Append text to input
119
123
 
@@ -223,7 +227,6 @@ class Common:
223
227
  unlock = False
224
228
  return unlock
225
229
 
226
-
227
230
  def stop(self, exit: bool = False):
228
231
  """
229
232
  Stop all
@@ -358,7 +361,11 @@ class Common:
358
361
  else:
359
362
  self.img_enable_raw()
360
363
 
361
- def save_text(self, text: str, type: str = "txt"):
364
+ def save_text(
365
+ self,
366
+ text: str,
367
+ type: str = "txt"
368
+ ):
362
369
  """
363
370
  Save text to file
364
371
 
@@ -6,9 +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.23 00:00:00 #
9
+ # Updated Date: 2024.12.14 08:00:00 #
10
10
  # ================================================== #
11
11
 
12
+ from typing import Dict
13
+
14
+ from pygpt_net.item.attachment import AttachmentItem
12
15
  from pygpt_net.item.ctx import CtxItem
13
16
  from pygpt_net.utils import trans
14
17
 
@@ -22,7 +25,11 @@ class Files:
22
25
  """
23
26
  self.window = window
24
27
 
25
- def send(self, mode: str, ctx: CtxItem):
28
+ def send(
29
+ self,
30
+ mode: str,
31
+ ctx: CtxItem
32
+ ):
26
33
  """
27
34
  Send attachments
28
35
 
@@ -37,7 +44,7 @@ class Files:
37
44
  self.window.controller.chat.log("Uploaded attachments (Assistant): {}".format(len(attachments)))
38
45
  return attachments
39
46
 
40
- def upload(self, mode: str) -> dict:
47
+ def upload(self, mode: str) -> Dict[str, AttachmentItem]:
41
48
  """
42
49
  Upload attachments
43
50
 
@@ -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 21:00:00 #
9
+ # Updated Date: 2024.12.14 08:00:00 #
10
10
  # ================================================== #
11
11
 
12
+ from typing import Optional, List
13
+
12
14
  from PySide6.QtCore import Slot
13
15
 
14
16
  from pygpt_net.core.bridge.context import BridgeContext
@@ -30,8 +32,8 @@ class Image:
30
32
  def send(
31
33
  self,
32
34
  text: str,
33
- prev_ctx: CtxItem = None,
34
- parent_id: int = None,
35
+ prev_ctx: Optional[CtxItem] = None,
36
+ parent_id: Optional[int] = None,
35
37
  ) -> CtxItem:
36
38
  """
37
39
  Send prompt for image generate
@@ -116,7 +118,12 @@ class Image:
116
118
  return ctx
117
119
 
118
120
  @Slot(object, list, str)
119
- def handle_response(self, ctx: CtxItem, paths: list, prompt: str):
121
+ def handle_response(
122
+ self,
123
+ ctx: CtxItem,
124
+ paths: List[str],
125
+ prompt: str
126
+ ):
120
127
  """
121
128
  Handle response
122
129
 
@@ -161,7 +168,12 @@ class Image:
161
168
  self.window.controller.chat.common.unlock_input() # unlock input
162
169
 
163
170
  @Slot(object, list, str)
164
- def handle_response_inline(self, ctx: CtxItem, paths: list, prompt: str):
171
+ def handle_response_inline(
172
+ self,
173
+ ctx: CtxItem,
174
+ paths: List[str],
175
+ prompt: str
176
+ ):
165
177
  """
166
178
  Handle inline response
167
179
 
@@ -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.26 19:00:00 #
9
+ # Updated Date: 2024.12.14 08:00:00 #
10
10
  # ================================================== #
11
11
 
12
+ from typing import Optional, Any, Dict
13
+
12
14
  from pygpt_net.core.bridge import BridgeContext
13
15
  from pygpt_net.core.bridge.context import MultimodalContext
14
16
  from pygpt_net.core.events import Event, AppEvent, KernelEvent, RenderEvent
@@ -52,6 +54,7 @@ class Input:
52
54
  """
53
55
  self.window.controller.agent.experts.unlock() # unlock experts
54
56
  self.window.controller.agent.llama.reset_eval_step() # reset evaluation steps
57
+ self.window.controller.ui.tabs.switch_to_first_chat() # switch to first active chat tab
55
58
 
56
59
  # get text from input
57
60
  text = self.window.ui.nodes['input'].toPlainText().strip()
@@ -121,7 +124,7 @@ class Input:
121
124
  def send(
122
125
  self,
123
126
  context: BridgeContext,
124
- extra: dict,
127
+ extra: Dict[str, Any],
125
128
  ):
126
129
  """
127
130
  Send input wrapper
@@ -148,13 +151,13 @@ class Input:
148
151
 
149
152
  def execute(
150
153
  self,
151
- text: str = None,
154
+ text: str,
152
155
  force: bool = False,
153
156
  reply: bool = False,
154
157
  internal: bool = False,
155
- prev_ctx: CtxItem = None,
156
- parent_id: int = None,
157
- multimodal_ctx: MultimodalContext = None,
158
+ prev_ctx: Optional[CtxItem] = None,
159
+ parent_id: Optional[int] = None,
160
+ multimodal_ctx: Optional[MultimodalContext] = None,
158
161
  ):
159
162
  """
160
163
  Execute send input text to API
@@ -265,7 +268,7 @@ class Input:
265
268
  multimodal_ctx=multimodal_ctx,
266
269
  ) # text mode: OpenAI, Langchain, Llama, etc.
267
270
 
268
- def log(self, data: any):
271
+ def log(self, data: Any):
269
272
  """
270
273
  Log data to debug
271
274
 
@@ -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.26 19:00:00 #
9
+ # Updated Date: 2024.12.14 00:00:00 #
10
10
  # ================================================== #
11
11
 
12
+ from typing import Any
13
+
12
14
  from pygpt_net.core.types import (
13
15
  MODE_AGENT,
14
16
  MODE_ASSISTANT,
@@ -26,9 +28,17 @@ class Output:
26
28
  :param window: Window instance
27
29
  """
28
30
  self.window = window
29
- self.not_stream_modes = [MODE_ASSISTANT, MODE_IMAGE]
31
+ self.not_stream_modes = [
32
+ MODE_ASSISTANT,
33
+ MODE_IMAGE,
34
+ ]
30
35
 
31
- def handle(self, ctx: CtxItem, mode: str, stream_mode: bool = False):
36
+ def handle(
37
+ self,
38
+ ctx: CtxItem,
39
+ mode: str,
40
+ stream_mode: bool = False
41
+ ):
32
42
  """
33
43
  Handle response from LLM
34
44
 
@@ -133,7 +143,8 @@ class Output:
133
143
  mode: str,
134
144
  stream: bool = False,
135
145
  reply: bool = False,
136
- internal: bool = False):
146
+ internal: bool = False
147
+ ):
137
148
  """
138
149
  Post handle results
139
150
 
@@ -178,7 +189,11 @@ class Output:
178
189
  self.log("Calling for prepare context name...")
179
190
  self.window.controller.ctx.prepare_name(ctx) # async
180
191
 
181
- def handle_end(self, ctx: CtxItem, mode: str):
192
+ def handle_end(
193
+ self,
194
+ ctx: CtxItem,
195
+ mode: str
196
+ ):
182
197
  """
183
198
  Handle context end (finish output)
184
199
 
@@ -231,7 +246,7 @@ class Output:
231
246
  event = RenderEvent(RenderEvent.RELOAD)
232
247
  self.window.dispatch(event) # reload chat window
233
248
 
234
- def log(self, data: any):
249
+ def log(self, data: Any):
235
250
  """
236
251
  Log data to debug
237
252
 
@@ -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, List
13
+
12
14
  from PySide6.QtCore import Slot, QTimer
13
15
 
14
16
  from pygpt_net.core.events import RenderEvent
@@ -16,6 +18,7 @@ from pygpt_net.core.render.base import BaseRenderer
16
18
  from pygpt_net.core.render.markdown.renderer import Renderer as MarkdownRenderer
17
19
  from pygpt_net.core.render.plain.renderer import Renderer as PlainTextRenderer
18
20
  from pygpt_net.core.render.web.renderer import Renderer as WebRenderer
21
+ from pygpt_net.core.tabs.tab import Tab
19
22
  from pygpt_net.core.text.utils import output_html2text, output_clean_html
20
23
  from pygpt_net.item.ctx import CtxItem, CtxMeta
21
24
 
@@ -67,6 +70,7 @@ class Render:
67
70
  append = data.get("append", False)
68
71
  footer = data.get("footer", False)
69
72
  initialized = data.get("initialized", False)
73
+ tab = data.get("tab")
70
74
 
71
75
  if name == RenderEvent.BEGIN:
72
76
  self.begin(meta, ctx, stream)
@@ -87,7 +91,7 @@ class Render:
87
91
  self.stream_end(meta, ctx)
88
92
 
89
93
  elif name == RenderEvent.ON_PAGE_LOAD:
90
- self.on_page_loaded(meta)
94
+ self.on_page_loaded(meta, tab)
91
95
  elif name ==RenderEvent.ON_THEME_CHANGE:
92
96
  self.on_theme_change()
93
97
  elif name == RenderEvent.ON_LOAD:
@@ -148,7 +152,12 @@ class Render:
148
152
  """
149
153
  return self.instance().get_pid(meta)
150
154
 
151
- def begin(self, meta: CtxMeta, ctx: CtxItem, stream: bool = False):
155
+ def begin(
156
+ self,
157
+ meta: CtxMeta,
158
+ ctx: CtxItem,
159
+ stream: bool = False
160
+ ):
152
161
  """
153
162
  Render begin
154
163
 
@@ -159,7 +168,12 @@ class Render:
159
168
  self.instance().begin(meta, ctx, stream)
160
169
  self.update()
161
170
 
162
- def end(self, meta: CtxMeta, ctx: CtxItem, stream: bool = False):
171
+ def end(
172
+ self,
173
+ meta: CtxMeta,
174
+ ctx: CtxItem,
175
+ stream: bool = False
176
+ ):
163
177
  """
164
178
  Render end
165
179
 
@@ -170,7 +184,12 @@ class Render:
170
184
  self.instance().end(meta, ctx, stream)
171
185
  self.update()
172
186
 
173
- def end_extra(self, meta: CtxMeta, ctx: CtxItem, stream: bool = False):
187
+ def end_extra(
188
+ self,
189
+ meta: CtxMeta,
190
+ ctx: CtxItem,
191
+ stream: bool = False
192
+ ):
174
193
  """
175
194
  Render end extra
176
195
 
@@ -181,7 +200,11 @@ class Render:
181
200
  self.instance().end_extra(meta, ctx, stream)
182
201
  self.update()
183
202
 
184
- def stream_begin(self, meta: CtxMeta, ctx: CtxItem):
203
+ def stream_begin(
204
+ self,
205
+ meta: CtxMeta,
206
+ ctx: CtxItem
207
+ ):
185
208
  """
186
209
  Render stream begin
187
210
 
@@ -191,7 +214,11 @@ class Render:
191
214
  self.instance().stream_begin(meta, ctx)
192
215
  self.update()
193
216
 
194
- def stream_end(self, meta: CtxMeta, ctx: CtxItem):
217
+ def stream_end(
218
+ self,
219
+ meta: CtxMeta,
220
+ ctx: CtxItem
221
+ ):
195
222
  """
196
223
  Render stream end
197
224
 
@@ -201,7 +228,10 @@ class Render:
201
228
  self.instance().stream_end(meta, ctx)
202
229
  self.update()
203
230
 
204
- def clear_output(self, meta: CtxMeta = None):
231
+ def clear_output(
232
+ self,
233
+ meta: Optional[CtxMeta] = None
234
+ ):
205
235
  """
206
236
  Clear current active output
207
237
 
@@ -214,7 +244,10 @@ class Render:
214
244
  """Clear input"""
215
245
  self.instance().clear_input()
216
246
 
217
- def on_load(self, meta: CtxMeta = None):
247
+ def on_load(
248
+ self,
249
+ meta: Optional[CtxMeta] = None
250
+ ):
218
251
  """
219
252
  On load (meta)
220
253
 
@@ -224,7 +257,10 @@ class Render:
224
257
  self.update()
225
258
  self.window.controller.ui.tabs.update_tooltip(meta.name) # update tab tooltip
226
259
 
227
- def reset(self, meta: CtxMeta = None):
260
+ def reset(
261
+ self,
262
+ meta: Optional[CtxMeta] = None
263
+ ):
228
264
  """
229
265
  Reset current meta
230
266
 
@@ -238,7 +274,12 @@ class Render:
238
274
  self.instance().reload() # TODO: or all outputs?
239
275
  self.update()
240
276
 
241
- def append_context(self, meta: CtxMeta, items: list, clear: bool = True):
277
+ def append_context(
278
+ self,
279
+ meta: CtxMeta,
280
+ items: List[CtxItem],
281
+ clear: bool = True
282
+ ):
242
283
  """
243
284
  Append all context to output
244
285
 
@@ -249,7 +290,13 @@ class Render:
249
290
  self.instance().append_context(meta, items, clear)
250
291
  self.update()
251
292
 
252
- def append_input(self, meta: CtxMeta, ctx: CtxItem, flush: bool = True, append: bool = False):
293
+ def append_input(
294
+ self,
295
+ meta: CtxMeta,
296
+ ctx: CtxItem,
297
+ flush: bool = True,
298
+ append: bool = False
299
+ ):
253
300
  """
254
301
  Append text input to output
255
302
 
@@ -261,7 +308,11 @@ class Render:
261
308
  self.instance().append_input(meta, ctx, flush=flush, append=append)
262
309
  self.update()
263
310
 
264
- def append_output(self, meta: CtxMeta, ctx: CtxItem):
311
+ def append_output(
312
+ self,
313
+ meta: CtxMeta,
314
+ ctx: CtxItem
315
+ ):
265
316
  """
266
317
  Append text output to output
267
318
 
@@ -271,7 +322,12 @@ class Render:
271
322
  self.instance().append_output(meta, ctx)
272
323
  self.update()
273
324
 
274
- def append_extra(self, meta: CtxMeta, ctx: CtxItem, footer: bool = False):
325
+ def append_extra(
326
+ self,
327
+ meta: CtxMeta,
328
+ ctx: CtxItem,
329
+ footer: bool = False
330
+ ):
275
331
  """
276
332
  Append extra data (images, files, etc.) to output
277
333
 
@@ -282,7 +338,13 @@ class Render:
282
338
  self.instance().append_extra(meta, ctx, footer)
283
339
  self.update()
284
340
 
285
- def append_chunk(self, meta: CtxMeta, ctx: CtxItem, text_chunk: str, begin: bool = False):
341
+ def append_chunk(
342
+ self,
343
+ meta: CtxMeta,
344
+ ctx: CtxItem,
345
+ text_chunk: str,
346
+ begin: bool = False
347
+ ):
286
348
  """
287
349
  Append output stream chunk to output
288
350
 
@@ -375,13 +437,18 @@ class Render:
375
437
  self.instance().on_reply_submit(ctx)
376
438
  self.update()
377
439
 
378
- def on_page_loaded(self, meta: CtxMeta):
440
+ def on_page_loaded(
441
+ self,
442
+ meta: CtxMeta,
443
+ tab: Optional[Tab] = None
444
+ ):
379
445
  """
380
446
  On page loaded callback
381
447
 
382
448
  :param meta: context meta
449
+ :param tab: Tab
383
450
  """
384
- self.instance().on_page_loaded(meta) # TODO: send ID with callback
451
+ self.instance().on_page_loaded(meta, tab)
385
452
  self.update()
386
453
 
387
454
  def on_theme_change(self):
@@ -428,7 +495,11 @@ class Render:
428
495
  self.instance().clear_all()
429
496
  self.update()
430
497
 
431
- def tool_output_append(self, meta: CtxMeta, content: str):
498
+ def tool_output_append(
499
+ self,
500
+ meta: CtxMeta,
501
+ content: str
502
+ ):
432
503
  """
433
504
  Add tool output (append)
434
505
 
@@ -438,7 +509,11 @@ class Render:
438
509
  self.instance().tool_output_append(meta, content)
439
510
  self.update()
440
511
 
441
- def tool_output_update(self, meta: CtxMeta, content: str):
512
+ def tool_output_update(
513
+ self,
514
+ meta: CtxMeta,
515
+ content: str
516
+ ):
442
517
  """
443
518
  Replace tool output
444
519
 
@@ -491,7 +566,7 @@ class Render:
491
566
  if plain:
492
567
  self.window.controller.theme.markdown.clear()
493
568
  for pid in self.window.ui.nodes['output_plain']:
494
- if self.window.ui.nodes['output'][pid] is not None:
569
+ if self.window.ui.nodes['output_plain'][pid] is not None:
495
570
  self.window.ui.nodes['output'][pid].setVisible(False)
496
571
  self.window.ui.nodes['output_plain'][pid].setVisible(True)
497
572
  else:
@@ -518,7 +593,11 @@ class Render:
518
593
  return self.markdown_renderer
519
594
 
520
595
  @Slot(str, str)
521
- def handle_save_as(self, text: str, type: str = 'txt'):
596
+ def handle_save_as(
597
+ self,
598
+ text: str,
599
+ type: str = 'txt'
600
+ ):
522
601
  """
523
602
  Handle save as signal # TODO: move to another class
524
603