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,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.03.25 10:00:00 #
9
+ # Updated Date: 2024.12.14 08:00:00 #
10
10
  # ================================================== #
11
11
 
12
12
  import os
13
+ from typing import List
13
14
 
14
15
  from PySide6.QtGui import QAction, QIcon
15
16
  from PySide6.QtWidgets import QWidget
@@ -45,9 +46,10 @@ class Actions:
45
46
  :param path: path to file
46
47
  :return: True if file has preview
47
48
  """
48
- return self.window.core.filesystem.types.is_image(path) or self.window.core.filesystem.types.is_video(path)
49
+ return (self.window.core.filesystem.types.is_image(path)
50
+ or self.window.core.filesystem.types.is_video(path))
49
51
 
50
- def get_preview(self, parent: QWidget, path: str) -> list:
52
+ def get_preview(self, parent: QWidget, path: str) -> List[QAction]:
51
53
  """
52
54
  Get preview actions for context menu
53
55
 
@@ -56,7 +58,8 @@ class Actions:
56
58
  :return: list of context menu actions
57
59
  """
58
60
  actions = []
59
- if self.window.core.filesystem.types.is_video(path) or self.window.core.filesystem.types.is_audio(path):
61
+ if (self.window.core.filesystem.types.is_video(path)
62
+ or self.window.core.filesystem.types.is_audio(path)):
60
63
  action = QAction(
61
64
  QIcon(":/icons/video.svg"),
62
65
  trans('action.video.play'),
@@ -100,7 +103,7 @@ class Actions:
100
103
  actions.append(action)
101
104
  return actions
102
105
 
103
- def get_use(self, parent: QWidget, path: str) -> list:
106
+ def get_use(self, parent: QWidget, path: str) -> List[QAction]:
104
107
  """
105
108
  Get use actions for context menu
106
109
 
@@ -6,13 +6,15 @@
6
6
  # GitHub: https://github.com/szczyglis-dev/py-gpt #
7
7
  # MIT License #
8
8
  # Created By : Marcin Szczygliński #
9
- # Updated Date: 2024.11.20 21:00:00 #
9
+ # Updated Date: 2024.12.14 08:00:00 #
10
10
  # ================================================== #
11
11
 
12
12
  import copy
13
13
  import json
14
14
  import os
15
15
 
16
+ from typing import Optional
17
+
16
18
 
17
19
  class Editor:
18
20
  def __init__(self, window=None):
@@ -63,7 +65,11 @@ class Editor:
63
65
  """
64
66
  return self.window.ui.dialog[dialog_id].is_changed()
65
67
 
66
- def load(self, dialog_id: str, file: str = None):
68
+ def load(
69
+ self,
70
+ dialog_id: str,
71
+ file: Optional[str] = None
72
+ ):
67
73
  """
68
74
  Load file to editor
69
75
 
@@ -87,7 +93,11 @@ class Editor:
87
93
  self.window.core.debug.log(e)
88
94
  self.window.update_status("Error loading file: {}".format(e))
89
95
 
90
- def save(self, dialog_id: str, path: str = None):
96
+ def save(
97
+ self,
98
+ dialog_id: str,
99
+ path: Optional[str] = None
100
+ ):
91
101
  """
92
102
  Save file to disk
93
103
 
@@ -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.03.19 01:00:00 #
9
+ # Updated Date: 2024.12.14 08:00:00 #
10
10
  # ================================================== #
11
11
 
12
+ from typing import List
13
+
14
+
12
15
  class Types:
13
16
  def __init__(self, window=None):
14
17
  """
@@ -45,7 +48,7 @@ class Types:
45
48
  """
46
49
  return str(path).lower().endswith(tuple(self.get_audio_ext()))
47
50
 
48
- def get_img_ext(self) -> list:
51
+ def get_img_ext(self) -> List[str]:
49
52
  """
50
53
  Get image extensions
51
54
 
@@ -53,23 +56,25 @@ class Types:
53
56
  """
54
57
  return ['.png', '.jpg', '.jpeg', '.gif', '.bmp', '.tiff', '.webp']
55
58
 
56
- def get_video_ext(self) -> list:
59
+ def get_video_ext(self) -> List[str]:
57
60
  """
58
61
  Get video extensions
59
62
 
60
63
  :return: list with video extensions
61
64
  """
62
- return ['.mp4', '.avi', '.mkv', '.webm', '.mov', '.flv', '.wmv', '.3gp', '.ogg', '.ogv', '.mpg', '.mpeg', '.m4v']
65
+ return ['.mp4', '.avi', '.mkv', '.webm', '.mov', '.flv', '.wmv',
66
+ '.3gp', '.ogg', '.ogv', '.mpg', '.mpeg', '.m4v']
63
67
 
64
- def get_audio_ext(self) -> list:
68
+ def get_audio_ext(self) -> List[str]:
65
69
  """
66
70
  Get audio extensions
67
71
 
68
72
  :return: list with audio extensions
69
73
  """
70
- return ['.mp3', '.wav', '.flac', '.ogg', '.m4a', '.wma', '.aac', '.aiff', '.alac', '.dsd', '.pcm', '.mpc']
74
+ return ['.mp3', '.wav', '.flac', '.ogg', '.m4a', '.wma', '.aac',
75
+ '.aiff', '.alac', '.dsd', '.pcm', '.mpc']
71
76
 
72
- def get_excluded_extensions(self) -> list[str]:
77
+ def get_excluded_extensions(self) -> List[str]:
73
78
  """
74
79
  Get excluded extensions if no loader is available
75
80
 
@@ -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.08 06:00:00 #
9
+ # Updated Date: 2024.12.09 03:00:00 #
10
10
  # ================================================== #
11
11
 
12
12
  from PySide6.QtCore import QUrl
@@ -38,14 +38,18 @@ class Url:
38
38
  ]
39
39
 
40
40
  # JS bridge
41
- if url.toString() == 'bridge://open_find':
42
- pid = self.window.controller.ui.tabs.get_current_pid()
41
+ if url.toString().startswith('bridge://open_find'):
42
+ pid = int(url.toString().split(':')[2])
43
43
  if pid in self.window.ui.nodes['output']:
44
44
  self.window.ui.nodes['output'][pid].find_open()
45
45
  return
46
46
  elif url.toString() == 'bridge://escape':
47
47
  self.window.controller.access.on_escape()
48
48
  return
49
+ elif url.toString() == 'bridge://focus':
50
+ pid = self.window.controller.ui.tabs.get_current_pid()
51
+ if pid in self.window.ui.nodes['output']:
52
+ self.window.ui.nodes['output'][pid].on_focus_js()
49
53
 
50
54
  # -------------
51
55
 
@@ -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.04.17 01:00:00 #
9
+ # Updated Date: 2024.12.14 08:00:00 #
10
10
  # ================================================== #
11
11
 
12
12
  import datetime
13
+ from typing import Optional, Tuple, List, Dict, Any
14
+
13
15
  from packaging.version import Version
14
16
 
15
17
  from pygpt_net.item.index import IndexItem
@@ -98,7 +100,11 @@ class Idx:
98
100
  """
99
101
  self.storage.store(idx)
100
102
 
101
- def remove_index(self, idx: str = "base", truncate: bool = False) -> bool:
103
+ def remove_index(
104
+ self,
105
+ idx: str = "base",
106
+ truncate: bool = False
107
+ ) -> bool:
102
108
  """
103
109
  Truncate index
104
110
 
@@ -125,10 +131,10 @@ class Idx:
125
131
  def index_files(
126
132
  self,
127
133
  idx: str = "base",
128
- path: str = None,
129
- replace: bool = None,
130
- recursive: bool = None,
131
- ) -> (dict, list):
134
+ path: Optional[str] = None,
135
+ replace: Optional[bool] = None,
136
+ recursive: Optional[bool] = None,
137
+ ) -> Tuple[Dict, List[str]]:
132
138
  """
133
139
  Index file or directory of files
134
140
 
@@ -165,7 +171,7 @@ class Idx:
165
171
  idx: str = "base",
166
172
  id: int = 0,
167
173
  from_ts: int = 0
168
- ) -> (int, list):
174
+ ) -> Tuple[int, List[str]]:
169
175
  """
170
176
  Index records from db by meta id
171
177
 
@@ -199,7 +205,7 @@ class Idx:
199
205
  self,
200
206
  idx: str = "base",
201
207
  from_ts: int = 0
202
- ) -> (int, list):
208
+ ) -> Tuple[int, List[str]]:
203
209
  """
204
210
  Index records from db by meta id
205
211
 
@@ -230,10 +236,10 @@ class Idx:
230
236
  def index_urls(
231
237
  self,
232
238
  idx: str = "base",
233
- urls: list = None,
239
+ urls: Optional[List[str]] = None,
234
240
  type: str = "webpage",
235
- extra_args: dict = None
236
- ) -> (dict, list):
241
+ extra_args: Optional[Dict[str, Any]] = None
242
+ ) -> Tuple[int, List[str]]:
237
243
  """
238
244
  Index URLs
239
245
 
@@ -269,10 +275,10 @@ class Idx:
269
275
  self,
270
276
  idx: str = "base",
271
277
  type: str = "webpage",
272
- params: dict = None,
273
- config: dict = None,
274
- replace: bool = None,
275
- ) -> (dict, list):
278
+ params: Optional[Dict[str, Any]] = None,
279
+ config: Optional[Dict[str, Any]] = None,
280
+ replace: Optional[bool] = None,
281
+ ) -> Tuple[int, list]:
276
282
  """
277
283
  Index URLs
278
284
 
@@ -310,7 +316,10 @@ class Idx:
310
316
  self.log("Error: " + str(errors))
311
317
  return n, errors
312
318
 
313
- def get_idx_data(self, idx: str = None) -> dict:
319
+ def get_idx_data(
320
+ self,
321
+ idx: Optional[str] = None
322
+ ) -> Dict[str, Dict]:
314
323
  """
315
324
  Get indexed files data
316
325
 
@@ -329,7 +338,7 @@ class Idx:
329
338
  indexes[idx] = self.items[store_id][idx].items
330
339
  return indexes
331
340
 
332
- def get_by_idx(self, idx: int) -> str:
341
+ def get_by_idx(self, idx: int) -> Optional[str]:
333
342
  """
334
343
  Return idx by list index
335
344
 
@@ -341,7 +350,7 @@ class Idx:
341
350
  if idx < len(items):
342
351
  return items[idx]['id']
343
352
 
344
- def get_idx_by_name(self, name: str) -> int:
353
+ def get_idx_by_name(self, name: str) -> Optional[int]:
345
354
  """
346
355
  Return idx on list by name
347
356
 
@@ -354,7 +363,7 @@ class Idx:
354
363
  if item['id'] == name:
355
364
  return idx
356
365
 
357
- def get_default_idx(self) -> str:
366
+ def get_default_idx(self) -> Optional[str]:
358
367
  """
359
368
  Return default idx
360
369
 
@@ -375,7 +384,7 @@ class Idx:
375
384
  return idx in self.items[store_id]
376
385
  return False
377
386
 
378
- def get(self, idx: str) -> IndexItem:
387
+ def get(self, idx: str) -> Optional[IndexItem]:
379
388
  """
380
389
  Return index data from current storage
381
390
 
@@ -386,7 +395,7 @@ class Idx:
386
395
  if store_id in self.items and idx in self.items[store_id]:
387
396
  return self.items[store_id][idx]
388
397
 
389
- def get_all(self) -> dict:
398
+ def get_all(self) -> Dict[str, IndexItem]:
390
399
  """
391
400
  Return all indexes in current store
392
401
 
@@ -397,12 +406,12 @@ class Idx:
397
406
  return self.items[store_id]
398
407
  return {}
399
408
 
400
- def append(self, idx: str, files: dict):
409
+ def append(self, idx: str, files: Dict[str, str]):
401
410
  """
402
411
  Append indexed files to index
403
412
 
404
413
  :param idx: index name
405
- :param files: dict of indexed files
414
+ :param files: dict of indexed files (path -> doc_id)
406
415
  """
407
416
  # create store if not exists
408
417
  store_id = self.get_current_store()
@@ -508,7 +517,7 @@ class Idx:
508
517
  self.items[store_id][idx].id = idx
509
518
  self.items[store_id][idx].name = idx
510
519
 
511
- def get_idx_ids(self) -> list:
520
+ def get_idx_ids(self) -> List[str]:
512
521
  """
513
522
  Get list of indexes
514
523
 
@@ -532,7 +541,7 @@ class Idx:
532
541
  self.items[store_id][idx].items = {}
533
542
  self.get_provider().truncate(store_id, idx)
534
543
 
535
- def get_counters(self, type: str) -> dict:
544
+ def get_counters(self, type: str) -> Dict[str, Dict[str, int]]:
536
545
  """
537
546
  Get counters (stats, count items by type [file, ctx, external])
538
547
 
@@ -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.23 21: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, List
13
14
 
14
15
  from llama_index.core.llms import ChatMessage, MessageRole
15
16
  from llama_index.core.prompts import ChatPromptTemplate
@@ -37,7 +38,11 @@ class Chat:
37
38
  self.storage = storage
38
39
  self.context = Context(window)
39
40
 
40
- def call(self, context: BridgeContext, extra: dict = None) -> bool:
41
+ def call(
42
+ self,
43
+ context: BridgeContext,
44
+ extra: Optional[Dict[str, Any]] = None
45
+ ) -> bool:
41
46
  """
42
47
  Call chat, complete or query mode
43
48
 
@@ -69,7 +74,11 @@ class Chat:
69
74
  extra=extra,
70
75
  ) # if not, use query mode
71
76
 
72
- def raw_query(self, context: BridgeContext, extra: dict = None) -> bool:
77
+ def raw_query(
78
+ self,
79
+ context: BridgeContext,
80
+ extra: Optional[Dict[str, Any]] = None
81
+ ) -> bool:
73
82
  """
74
83
  Raw query mode
75
84
 
@@ -82,7 +91,11 @@ class Chat:
82
91
  extra=extra,
83
92
  )
84
93
 
85
- def query(self, context: BridgeContext, extra: dict = None) -> bool:
94
+ def query(
95
+ self,
96
+ context: BridgeContext,
97
+ extra: Optional[Dict[str, Any]] = None
98
+ ) -> bool:
86
99
  """
87
100
  Query index mode (no chat, only single query) and append results to context
88
101
 
@@ -150,7 +163,11 @@ class Chat:
150
163
  return True
151
164
  return False
152
165
 
153
- def chat(self, context: BridgeContext, extra: dict = None) -> bool:
166
+ def chat(
167
+ self,
168
+ context: BridgeContext,
169
+ extra: Optional[Dict[str, Any]] = None
170
+ ) -> bool:
154
171
  """
155
172
  Chat mode (conversation, using context from index) and append result to the context
156
173
 
@@ -291,7 +308,7 @@ class Chat:
291
308
  ctx: CtxItem,
292
309
  path: str,
293
310
  query: str,
294
- model: ModelItem = None
311
+ model: Optional[ModelItem] = None
295
312
  ) -> str:
296
313
  """
297
314
  Query file using temp index (created on the fly)
@@ -345,7 +362,7 @@ class Chat:
345
362
  url: str,
346
363
  args: dict,
347
364
  query: str,
348
- model: ModelItem = None
365
+ model: Optional[ModelItem] = None
349
366
  ) -> str:
350
367
  """
351
368
  Query web using temp index (created on the fly)
@@ -405,8 +422,8 @@ class Chat:
405
422
  self,
406
423
  query: str,
407
424
  path: str,
408
- model: ModelItem = None,
409
- history: list = None,
425
+ model: Optional[ModelItem] = None,
426
+ history: Optional[List[CtxItem]] = None,
410
427
  verbose: bool = False,
411
428
  ) -> str:
412
429
  """
@@ -461,7 +478,7 @@ class Chat:
461
478
  self,
462
479
  query: str,
463
480
  idx: str,
464
- model: ModelItem = None
481
+ model: Optional[ModelItem] = None
465
482
  ) -> str:
466
483
  """
467
484
  Query attachment
@@ -486,7 +503,11 @@ class Chat:
486
503
  output = str(response)
487
504
  return output
488
505
 
489
- def get_memory_buffer(self, history: list, llm = None) -> ChatMemoryBuffer:
506
+ def get_memory_buffer(
507
+ self,
508
+ history: List[ChatMessage],
509
+ llm = None
510
+ ) -> ChatMemoryBuffer:
490
511
  """
491
512
  Get memory buffer
492
513
 
@@ -499,7 +520,10 @@ class Chat:
499
520
  llm=llm,
500
521
  )
501
522
 
502
- def get_custom_prompt(self, prompt: str = None) -> ChatPromptTemplate or None:
523
+ def get_custom_prompt(
524
+ self,
525
+ prompt: Optional[str] = None
526
+ ) -> Optional[ChatPromptTemplate]:
503
527
  """
504
528
  Get custom prompt template if sys prompt is not empty
505
529
 
@@ -528,12 +552,12 @@ class Chat:
528
552
  ]
529
553
  return ChatPromptTemplate(qa_msgs)
530
554
 
531
- def get_index(self, idx, model):
555
+ def get_index(self, idx: str, model: ModelItem):
532
556
  """
533
557
  Get index instance
534
558
 
535
559
  :param idx: idx name (id)
536
- :param model: model name
560
+ :param model: model instance
537
561
  :return:
538
562
  """
539
563
  # check if index exists
@@ -549,7 +573,7 @@ class Chat:
549
573
  index = self.storage.get(idx, service_context=service_context) # get index
550
574
  return index, service_context
551
575
 
552
- def get_metadata(self, source_nodes: list):
576
+ def get_metadata(self, source_nodes: Optional[list]) -> Dict[str, Any]:
553
577
  """
554
578
  Get metadata from source nodes
555
579
 
@@ -577,7 +601,7 @@ class Chat:
577
601
  break
578
602
  return metadata
579
603
 
580
- def parse_metadata(self, metadata: dict):
604
+ def parse_metadata(self, metadata: Optional[Dict]) -> Dict[str, Any]:
581
605
  """
582
606
  Parse metadata
583
607
 
@@ -6,11 +6,15 @@
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 Optional, List
13
+
12
14
  from llama_index.core.llms import ChatMessage, MessageRole
13
15
 
16
+ from pygpt_net.item.ctx import CtxItem
17
+
14
18
 
15
19
  class Context:
16
20
  def __init__(self, window=None):
@@ -25,7 +29,7 @@ class Context:
25
29
  self,
26
30
  input_prompt: str,
27
31
  system_prompt: str,
28
- history: list = None,
32
+ history: Optional[List[CtxItem]] = None,
29
33
  multimodal: bool = False
30
34
  ):
31
35
  """