pygpt-net 2.4.36.post1__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 (258) hide show
  1. CHANGELOG.md +38 -1
  2. README.md +71 -114
  3. pygpt_net/CHANGELOG.txt +38 -1
  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 +39 -44
  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 +217 -64
  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/bridge/worker.py +16 -2
  105. pygpt_net/core/calendar/__init__.py +57 -11
  106. pygpt_net/core/chain/__init__.py +8 -2
  107. pygpt_net/core/chain/chat.py +10 -8
  108. pygpt_net/core/chain/completion.py +10 -7
  109. pygpt_net/core/command.py +62 -17
  110. pygpt_net/core/ctx/__init__.py +260 -58
  111. pygpt_net/core/ctx/bag.py +25 -4
  112. pygpt_net/core/ctx/container.py +28 -17
  113. pygpt_net/core/ctx/idx.py +45 -8
  114. pygpt_net/core/ctx/output.py +95 -74
  115. pygpt_net/core/ctx/reply.py +5 -2
  116. pygpt_net/core/db/__init__.py +8 -7
  117. pygpt_net/core/db/viewer.py +17 -11
  118. pygpt_net/core/debug/__init__.py +10 -9
  119. pygpt_net/core/debug/tabs.py +5 -2
  120. pygpt_net/core/docker/__init__.py +11 -5
  121. pygpt_net/core/docker/builder.py +11 -3
  122. pygpt_net/core/events/app.py +5 -3
  123. pygpt_net/core/events/base.py +11 -5
  124. pygpt_net/core/events/control.py +5 -3
  125. pygpt_net/core/events/event.py +18 -7
  126. pygpt_net/core/events/kernel.py +5 -3
  127. pygpt_net/core/events/render.py +5 -3
  128. pygpt_net/core/experts/__init__.py +5 -4
  129. pygpt_net/core/filesystem/__init__.py +52 -34
  130. pygpt_net/core/filesystem/actions.py +8 -5
  131. pygpt_net/core/filesystem/editor.py +13 -3
  132. pygpt_net/core/filesystem/types.py +12 -7
  133. pygpt_net/core/filesystem/url.py +7 -3
  134. pygpt_net/core/idx/__init__.py +34 -25
  135. pygpt_net/core/idx/chat.py +60 -38
  136. pygpt_net/core/idx/context.py +6 -2
  137. pygpt_net/core/idx/indexing.py +84 -35
  138. pygpt_net/core/idx/llm.py +11 -3
  139. pygpt_net/core/idx/metadata.py +13 -3
  140. pygpt_net/core/idx/types/ctx.py +32 -6
  141. pygpt_net/core/idx/types/external.py +41 -7
  142. pygpt_net/core/idx/types/files.py +31 -6
  143. pygpt_net/core/image.py +15 -4
  144. pygpt_net/core/llm/__init__.py +13 -3
  145. pygpt_net/core/locale.py +34 -8
  146. pygpt_net/core/models.py +4 -3
  147. pygpt_net/core/notepad.py +9 -4
  148. pygpt_net/core/plugins.py +7 -6
  149. pygpt_net/core/presets.py +19 -10
  150. pygpt_net/core/profile.py +12 -6
  151. pygpt_net/core/prompt/__init__.py +10 -3
  152. pygpt_net/core/prompt/custom.py +7 -6
  153. pygpt_net/core/prompt/template.py +9 -3
  154. pygpt_net/core/render/base.py +117 -22
  155. pygpt_net/core/render/markdown/body.py +27 -7
  156. pygpt_net/core/render/markdown/renderer.py +119 -22
  157. pygpt_net/core/render/plain/body.py +22 -5
  158. pygpt_net/core/render/plain/renderer.py +97 -21
  159. pygpt_net/core/render/web/body.py +75 -25
  160. pygpt_net/core/render/web/renderer.py +313 -63
  161. pygpt_net/core/settings.py +9 -4
  162. pygpt_net/core/tabs/__init__.py +290 -103
  163. pygpt_net/core/tabs/tab.py +17 -4
  164. pygpt_net/core/tokens.py +44 -11
  165. pygpt_net/core/updater/__init__.py +20 -7
  166. pygpt_net/core/vision/analyzer.py +29 -6
  167. pygpt_net/core/web.py +130 -2
  168. pygpt_net/data/config/config.json +19 -6
  169. pygpt_net/data/config/models.json +3 -3
  170. pygpt_net/data/config/modes.json +3 -3
  171. pygpt_net/data/config/settings.json +81 -10
  172. pygpt_net/data/config/settings_section.json +3 -0
  173. pygpt_net/data/css/style.light.css +1 -0
  174. pygpt_net/data/css/{web.css → web-blocks.css} +162 -133
  175. pygpt_net/data/css/{web.light.css → web-blocks.light.css} +7 -0
  176. pygpt_net/data/css/web-chatgpt.css +350 -0
  177. pygpt_net/data/css/web-chatgpt.dark.css +64 -0
  178. pygpt_net/data/css/web-chatgpt.light.css +75 -0
  179. pygpt_net/data/css/web-chatgpt_wide.css +350 -0
  180. pygpt_net/data/css/web-chatgpt_wide.dark.css +64 -0
  181. pygpt_net/data/css/web-chatgpt_wide.light.css +75 -0
  182. pygpt_net/data/icons/split_screen.svg +1 -0
  183. pygpt_net/data/locale/locale.de.ini +19 -3
  184. pygpt_net/data/locale/locale.en.ini +30 -11
  185. pygpt_net/data/locale/locale.es.ini +19 -3
  186. pygpt_net/data/locale/locale.fr.ini +19 -3
  187. pygpt_net/data/locale/locale.it.ini +19 -3
  188. pygpt_net/data/locale/locale.pl.ini +20 -4
  189. pygpt_net/data/locale/locale.uk.ini +19 -3
  190. pygpt_net/data/locale/locale.zh.ini +20 -4
  191. pygpt_net/data/locale/plugin.cmd_web.de.ini +2 -0
  192. pygpt_net/data/locale/plugin.cmd_web.en.ini +20 -10
  193. pygpt_net/data/locale/plugin.cmd_web.es.ini +2 -0
  194. pygpt_net/data/locale/plugin.cmd_web.fr.ini +2 -0
  195. pygpt_net/data/locale/plugin.cmd_web.it.ini +2 -0
  196. pygpt_net/data/locale/plugin.cmd_web.pl.ini +2 -0
  197. pygpt_net/data/locale/plugin.cmd_web.uk.ini +2 -0
  198. pygpt_net/data/locale/plugin.cmd_web.zh.ini +2 -0
  199. pygpt_net/icons.qrc +1 -0
  200. pygpt_net/icons_rc.py +165 -136
  201. pygpt_net/item/ctx.py +46 -24
  202. pygpt_net/plugin/audio_input/simple.py +21 -5
  203. pygpt_net/plugin/audio_output/__init__.py +4 -1
  204. pygpt_net/plugin/base/config.py +4 -2
  205. pygpt_net/plugin/base/plugin.py +26 -6
  206. pygpt_net/plugin/base/worker.py +37 -9
  207. pygpt_net/plugin/cmd_code_interpreter/__init__.py +39 -37
  208. pygpt_net/plugin/cmd_code_interpreter/runner.py +25 -12
  209. pygpt_net/plugin/cmd_web/__init__.py +46 -6
  210. pygpt_net/plugin/cmd_web/config.py +74 -48
  211. pygpt_net/plugin/cmd_web/websearch.py +61 -28
  212. pygpt_net/plugin/cmd_web/worker.py +79 -13
  213. pygpt_net/plugin/idx_llama_index/__init__.py +2 -2
  214. pygpt_net/plugin/real_time/__init__.py +2 -2
  215. pygpt_net/provider/core/config/patch.py +54 -1
  216. pygpt_net/provider/core/ctx/base.py +4 -1
  217. pygpt_net/provider/core/ctx/db_sqlite/__init__.py +10 -1
  218. pygpt_net/provider/core/ctx/db_sqlite/storage.py +22 -1
  219. pygpt_net/provider/gpt/assistants.py +10 -9
  220. pygpt_net/provider/gpt/audio.py +3 -2
  221. pygpt_net/provider/gpt/chat.py +8 -7
  222. pygpt_net/provider/gpt/completion.py +6 -4
  223. pygpt_net/provider/gpt/image.py +9 -2
  224. pygpt_net/provider/gpt/store.py +14 -13
  225. pygpt_net/provider/gpt/vision.py +6 -5
  226. pygpt_net/tools/__init__.py +9 -1
  227. pygpt_net/tools/base.py +15 -1
  228. pygpt_net/tools/code_interpreter/__init__.py +174 -75
  229. pygpt_net/tools/code_interpreter/ui/dialogs.py +21 -103
  230. pygpt_net/tools/code_interpreter/ui/widgets.py +284 -9
  231. pygpt_net/tools/html_canvas/__init__.py +78 -23
  232. pygpt_net/tools/html_canvas/ui/dialogs.py +46 -62
  233. pygpt_net/tools/html_canvas/ui/widgets.py +96 -3
  234. pygpt_net/ui/base/context_menu.py +2 -2
  235. pygpt_net/ui/layout/chat/input.py +10 -18
  236. pygpt_net/ui/layout/chat/output.py +26 -44
  237. pygpt_net/ui/layout/ctx/ctx_list.py +13 -4
  238. pygpt_net/ui/layout/toolbox/footer.py +18 -2
  239. pygpt_net/ui/main.py +2 -2
  240. pygpt_net/ui/menu/config.py +7 -11
  241. pygpt_net/ui/menu/debug.py +11 -1
  242. pygpt_net/ui/menu/theme.py +9 -2
  243. pygpt_net/ui/widget/filesystem/explorer.py +2 -2
  244. pygpt_net/ui/widget/lists/context.py +27 -5
  245. pygpt_net/ui/widget/tabs/Input.py +2 -2
  246. pygpt_net/ui/widget/tabs/body.py +2 -1
  247. pygpt_net/ui/widget/tabs/layout.py +195 -0
  248. pygpt_net/ui/widget/tabs/output.py +218 -55
  249. pygpt_net/ui/widget/textarea/html.py +11 -1
  250. pygpt_net/ui/widget/textarea/output.py +10 -1
  251. pygpt_net/ui/widget/textarea/search_input.py +4 -1
  252. pygpt_net/ui/widget/textarea/web.py +49 -9
  253. {pygpt_net-2.4.36.post1.dist-info → pygpt_net-2.4.41.dist-info}/METADATA +72 -115
  254. {pygpt_net-2.4.36.post1.dist-info → pygpt_net-2.4.41.dist-info}/RECORD +258 -250
  255. /pygpt_net/data/css/{web.dark.css → web-blocks.dark.css} +0 -0
  256. {pygpt_net-2.4.36.post1.dist-info → pygpt_net-2.4.41.dist-info}/LICENSE +0 -0
  257. {pygpt_net-2.4.36.post1.dist-info → pygpt_net-2.4.41.dist-info}/WHEEL +0 -0
  258. {pygpt_net-2.4.36.post1.dist-info → pygpt_net-2.4.41.dist-info}/entry_points.txt +0 -0
@@ -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.26 19:00:00 #
9
+ # Updated Date: 2024.12.14 08:00:00 #
10
10
  # ================================================== #
11
11
 
12
12
  import os
13
+ from typing import Optional
13
14
 
14
15
  from pygpt_net.core.events import Event, BaseEvent
15
16
  from pygpt_net.item.ctx import CtxItem
@@ -29,7 +30,11 @@ class Audio:
29
30
  """Setup controller"""
30
31
  self.update()
31
32
 
32
- def toggle_input(self, state: bool, btn: bool = True):
33
+ def toggle_input(
34
+ self,
35
+ state: bool,
36
+ btn: bool = True
37
+ ):
33
38
  """
34
39
  Toggle audio input
35
40
 
@@ -155,7 +160,11 @@ class Audio:
155
160
  else:
156
161
  self.window.ui.menu['audio.control.global'].setChecked(False)
157
162
 
158
- def read_text(self, text: str, cache_file: str = None):
163
+ def read_text(
164
+ self,
165
+ text: str,
166
+ cache_file: Optional[str] = None
167
+ ):
159
168
  """
160
169
  Read text using audio output plugins
161
170
 
@@ -200,6 +209,14 @@ class Audio:
200
209
  }
201
210
  self.window.dispatch(event, all=True)
202
211
 
212
+ def stop_audio(self):
213
+ """Stop audio playback"""
214
+ ctx = CtxItem()
215
+ event = Event(Event.AUDIO_OUTPUT_STOP)
216
+ event.ctx = ctx
217
+ event.data = {}
218
+ self.window.dispatch(event, all=True)
219
+
203
220
  def play_sound(self, filename: str):
204
221
  """
205
222
  Play sound
@@ -210,7 +227,11 @@ class Audio:
210
227
  if path:
211
228
  self.play_audio(path)
212
229
 
213
- def play_event(self, text: str, event: BaseEvent = None):
230
+ def play_event(
231
+ self,
232
+ text: str,
233
+ event: Optional[BaseEvent] = None
234
+ ):
214
235
  """
215
236
  Play event (read text or play cached audio file)
216
237
 
@@ -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.05 23:00:00 #
9
+ # Updated Date: 2024.12.14 08:00:00 #
10
10
  # ================================================== #
11
11
 
12
+ from typing import Optional
13
+
12
14
  from pygpt_net.core.tabs.tab import Tab
13
15
 
14
16
  from .note import Note
@@ -48,6 +50,8 @@ class Calendar:
48
50
 
49
51
  :param all: reload all notes
50
52
  """
53
+ if not self.is_loaded():
54
+ return
51
55
  year = self.window.ui.calendar['select'].currentYear
52
56
  month = self.window.ui.calendar['select'].currentMonth
53
57
  self.on_page_changed(year, month, all=all) # load notes for current month
@@ -77,7 +81,12 @@ class Calendar:
77
81
  month = self.window.ui.calendar['select'].currentMonth
78
82
  self.window.core.calendar.load_by_month(year, month)
79
83
 
80
- def on_page_changed(self, year: int, month: int, all: bool = True):
84
+ def on_page_changed(
85
+ self,
86
+ year: int,
87
+ month: int,
88
+ all: bool = True
89
+ ):
81
90
  """
82
91
  On calendar page changed
83
92
 
@@ -90,7 +99,12 @@ class Calendar:
90
99
  self.note.refresh_ctx(year, month)
91
100
  self.note.refresh_num(year, month)
92
101
 
93
- def on_day_select(self, year: int, month: int, day: int):
102
+ def on_day_select(
103
+ self,
104
+ year: int,
105
+ month: int,
106
+ day: int
107
+ ):
94
108
  """
95
109
  On day select
96
110
 
@@ -104,7 +118,12 @@ class Calendar:
104
118
  self.note.update_content(year, month, day)
105
119
  self.note.update_label(year, month, day)
106
120
 
107
- def on_ctx_select(self, year: int, month: int, day: int):
121
+ def on_ctx_select(
122
+ self,
123
+ year: int,
124
+ month: int,
125
+ day: int
126
+ ):
108
127
  """
109
128
  On ctx select
110
129
 
@@ -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.05 23:00:00 #
9
+ # Updated Date: 2024.12.14 08:00:00 #
10
10
  # ================================================== #
11
11
 
12
12
  import datetime
13
+ from typing import Dict
13
14
 
14
15
  from PySide6.QtGui import QTextCursor
15
16
 
@@ -55,7 +56,12 @@ class Note:
55
56
 
56
57
  self.refresh_num(year, month) # update note cells when note is changed
57
58
 
58
- def update_content(self, year: int, month: int, day: int):
59
+ def update_content(
60
+ self,
61
+ year: int,
62
+ month: int,
63
+ day: int
64
+ ):
59
65
  """
60
66
  Update content
61
67
 
@@ -71,7 +77,12 @@ class Note:
71
77
  self.window.ui.calendar['note'].setPlainText(note.content)
72
78
  self.window.ui.calendar['note'].on_update()
73
79
 
74
- def update_label(self, year: int, month: int, day: int):
80
+ def update_label(
81
+ self,
82
+ year: int,
83
+ month: int,
84
+ day: int
85
+ ):
75
86
  """
76
87
  Update label
77
88
 
@@ -89,7 +100,13 @@ class Note:
89
100
  day = self.window.ui.calendar['select'].currentDay
90
101
  self.update_label(year, month, day)
91
102
 
92
- def update_status(self, status: str, year: int, month: int, day: int):
103
+ def update_status(
104
+ self,
105
+ status: str,
106
+ year: int,
107
+ month: int,
108
+ day: int
109
+ ):
93
110
  """
94
111
  Update status label
95
112
 
@@ -109,7 +126,11 @@ class Note:
109
126
 
110
127
  self.refresh_num(year, month) # update note cells when note is changed
111
128
 
112
- def get_counts_around_month(self, year: int, month: int) -> dict:
129
+ def get_counts_around_month(
130
+ self,
131
+ year: int,
132
+ month: int
133
+ ) -> Dict[str, int]:
113
134
  """
114
135
  Get counts around month
115
136
 
@@ -139,7 +160,11 @@ class Note:
139
160
  )
140
161
  return {**last, **current, **next} # combine counters
141
162
 
142
- def get_labels_counts_around_month(self, year: int, month: int) -> dict:
163
+ def get_labels_counts_around_month(
164
+ self,
165
+ year: int,
166
+ month: int
167
+ ) -> Dict[str, Dict[int, int]]:
143
168
  """
144
169
  Get counts around month
145
170
 
@@ -169,7 +194,11 @@ class Note:
169
194
  )
170
195
  return {**last, **current, **next} # combine counters
171
196
 
172
- def get_ctx_counters(self, year: int, month: int) -> dict:
197
+ def get_ctx_counters(
198
+ self,
199
+ year: int,
200
+ month: int
201
+ ) -> Dict[str, int]:
173
202
  """
174
203
  Get ctx counters
175
204
 
@@ -197,7 +226,11 @@ class Note:
197
226
  search_content=search_content,
198
227
  )
199
228
 
200
- def get_ctx_labels_counters(self, year: int, month: int) -> dict:
229
+ def get_ctx_labels_counters(
230
+ self,
231
+ year: int,
232
+ month: int
233
+ ) -> Dict[str, Dict[int, int]]:
201
234
  """
202
235
  Get ctx labels counters
203
236
 
@@ -225,7 +258,11 @@ class Note:
225
258
  search_content=search_content,
226
259
  )
227
260
 
228
- def refresh_ctx(self, year: int, month: int):
261
+ def refresh_ctx(
262
+ self,
263
+ year: int,
264
+ month: int
265
+ ):
229
266
  """
230
267
  Update calendar ctx cells
231
268
 
@@ -236,7 +273,12 @@ class Note:
236
273
  labels = self.get_labels_counts_around_month(year, month)
237
274
  self.window.ui.calendar['select'].update_ctx(count, labels)
238
275
 
239
- def create(self, year: int, month: int, day: int) -> CalendarNoteItem:
276
+ def create(
277
+ self,
278
+ year: int,
279
+ month: int,
280
+ day: int
281
+ ) -> CalendarNoteItem:
240
282
  """
241
283
  Create empty note
242
284
 
@@ -251,7 +293,11 @@ class Note:
251
293
  note.day = day
252
294
  return note
253
295
 
254
- def get_notes_existence_around_month(self, year: int, month: int) -> dict:
296
+ def get_notes_existence_around_month(
297
+ self,
298
+ year: int,
299
+ month: int
300
+ ) -> Dict[str, Dict[int, int]]:
255
301
  """
256
302
  Get notes existence around month
257
303
 
@@ -6,12 +6,13 @@
6
6
  # GitHub: https://github.com/szczyglis-dev/py-gpt #
7
7
  # MIT License #
8
8
  # Created By : Marcin Szczygliński #
9
- # Updated Date: 2024.11.23 00:00:00 #
9
+ # Updated Date: 2024.12.14 00:00:00 #
10
10
  # ================================================== #
11
11
 
12
12
  import datetime
13
13
  import os
14
14
  import time
15
+ from typing import Any
15
16
 
16
17
  import cv2
17
18
 
@@ -464,7 +465,7 @@ class Camera(QObject):
464
465
  self.window.dispatch(AppEvent(AppEvent.CAMERA_DISABLED)) # app event
465
466
 
466
467
  @Slot(object)
467
- def handle_error(self, err):
468
+ def handle_error(self, err: Any):
468
469
  """
469
470
  Handle thread error signal
470
471
 
@@ -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.26 04: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,26 +271,26 @@ class Attachment(QObject):
261
271
  """
262
272
  return self.mode
263
273
 
264
- def get_context(self, ctx: CtxItem) -> 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
 
268
282
  :param ctx: CtxItem instance
283
+ :param history Context items (history)
269
284
  :return: Additional context
270
285
  """
271
- content = ""
272
- meta = ctx.meta
273
286
  if self.mode != self.MODE_DISABLED:
274
287
  if self.is_verbose():
275
288
  print("\nPreparing additional context...\nContext Mode: {}".format(self.mode))
276
289
 
277
- self.window.core.attachments.context.reset()
278
- if self.mode == self.MODE_FULL_CONTEXT:
279
- content = self.get_full_context(ctx)
280
- elif self.mode == self.MODE_QUERY_CONTEXT:
281
- content = self.get_query_context(meta, str(ctx.input))
282
- elif self.mode == self.MODE_QUERY_CONTEXT_SUMMARY:
283
- content = self.get_context_summary(ctx)
290
+ self.window.core.attachments.context.reset() # reset used files and urls
291
+
292
+ # get additional context from attachments
293
+ content = self.window.core.attachments.context.get_context(self.mode, ctx, history)
284
294
 
285
295
  # append used files and urls to context
286
296
  files = self.window.core.attachments.context.get_used_files()
@@ -296,35 +306,10 @@ class Attachment(QObject):
296
306
  return "====================================\nADDITIONAL CONTEXT FROM ATTACHMENT(s): {}".format(content)
297
307
  return ""
298
308
 
299
- def get_full_context(self, ctx: CtxItem) -> str:
300
- """
301
- Get full context for attachment
302
-
303
- :param ctx: CtxItem instance
304
- :return: Full context
305
- """
306
- return self.window.core.attachments.context.get_context_text(ctx, filename=True)
307
-
308
- def get_query_context(self, meta: CtxMeta, query: str) -> str:
309
- """
310
- Get query context for attachment
311
-
312
- :param meta: CtxMeta instance
313
- :param query: Query string
314
- :return: Query context
315
- """
316
- return self.window.core.attachments.context.query_context(meta, query)
317
-
318
- def get_context_summary(self, ctx: CtxItem) -> str:
319
- """
320
- Get context summary
321
-
322
- :param ctx: CtxItem instance
323
- :return: Context summary
324
- """
325
- return self.window.core.attachments.context.summary_context(ctx, ctx.input)
326
-
327
- def get_uploaded_attachments(self, meta: CtxMeta) -> list:
309
+ def get_uploaded_attachments(
310
+ self,
311
+ meta: CtxMeta
312
+ ) -> List[Dict[str, Any]]:
328
313
  """
329
314
  Get uploaded attachments for meta
330
315
 
@@ -396,7 +381,12 @@ class Attachment(QObject):
396
381
  """Hide uploaded attachments"""
397
382
  self.window.ui.tabs['input'].setTabVisible(self.uploaded_tab_idx, False)
398
383
 
399
- 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
+ ):
400
390
  """
401
391
  Delete attachment by index
402
392
 
@@ -420,7 +410,12 @@ class Attachment(QObject):
420
410
  self.window.core.attachments.context.delete(meta, item, delete_files=remove_local)
421
411
  self.update_list(meta)
422
412
 
423
- 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
+ ):
424
419
  """
425
420
  Clear attachments list
426
421
 
@@ -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