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,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.18 21:00:00 #
9
+ # Updated Date: 2024.12.15 01:00:00 #
10
10
  # ================================================== #
11
11
 
12
12
  import json
13
13
 
14
14
  from PySide6.QtCore import Slot
15
+
15
16
  from pygpt_net.plugin.base.worker import BaseWorker, BaseSignals
16
17
 
17
18
 
@@ -40,7 +41,7 @@ class Worker(BaseWorker):
40
41
  response = None
41
42
  try:
42
43
  if item["cmd"] == "web_search":
43
- response = self.cmd_web_search(item)
44
+ response = self.cmd_web_urls(item) # return URLs
44
45
 
45
46
  elif item["cmd"] == "web_url_open":
46
47
  response = self.cmd_web_url_open(item)
@@ -57,6 +58,15 @@ class Worker(BaseWorker):
57
58
  elif item["cmd"] == "web_index_query":
58
59
  response = self.cmd_web_index_query(item)
59
60
 
61
+ elif item["cmd"] == "web_extract_links":
62
+ response = self.cmd_web_extract_links(item)
63
+
64
+ elif item["cmd"] == "web_extract_images":
65
+ response = self.cmd_web_extract_images(item)
66
+
67
+ elif item["cmd"] == "web_request":
68
+ response = self.cmd_web_request(item)
69
+
60
70
  if response:
61
71
  responses.append(response)
62
72
 
@@ -91,7 +101,7 @@ class Worker(BaseWorker):
91
101
  prompt = self.get_param(item, "summarize_prompt")
92
102
 
93
103
  query = self.get_param(item, "query", "")
94
- content, total_found, current, url = self.websearch.make_query(
104
+ content, total_found, current, url, img = self.websearch.make_query(
95
105
  query,
96
106
  page,
97
107
  prompt,
@@ -105,8 +115,12 @@ class Worker(BaseWorker):
105
115
  'total_found': total_found,
106
116
  }
107
117
  if url:
108
- self.ctx.urls.append(url)
118
+ self.ctx.urls_before.append(url)
119
+ if img:
120
+ result["thumb_img"] = img
121
+ self.ctx.images_before.append(img)
109
122
 
123
+ self.ctx.save_reply = True # leave links in context
110
124
  return self.make_response(item, result)
111
125
 
112
126
  def cmd_web_url_open(self, item: dict) -> dict:
@@ -122,7 +136,7 @@ class Worker(BaseWorker):
122
136
  url = self.get_param(item, "url", "")
123
137
 
124
138
  self.msg = "Opening Web URL: '{}'".format(url)
125
- content, url = self.websearch.open_url(
139
+ content, url, img = self.websearch.open_url(
126
140
  url,
127
141
  prompt,
128
142
  )
@@ -130,9 +144,12 @@ class Worker(BaseWorker):
130
144
  'url': url,
131
145
  'content': content,
132
146
  }
133
- context = "From: " + url + ":\n--------------------------------\n" + content
147
+ context = "From: " + url + ":\n--------------------------------\n" + str(content)
134
148
  if url:
135
- self.ctx.urls.append(url)
149
+ self.ctx.urls_before.append(url)
150
+ if img:
151
+ result["thumb_img"] = img
152
+ self.ctx.images_before.append(img)
136
153
 
137
154
  extra = {
138
155
  "context": context,
@@ -148,16 +165,19 @@ class Worker(BaseWorker):
148
165
  """
149
166
  url = self.get_param(item, "url", "")
150
167
  self.msg = "Opening Web URL: '{}'".format(url)
151
- content, url = self.websearch.open_url_raw(
168
+ content, url, img = self.websearch.open_url_raw(
152
169
  url,
153
170
  )
154
171
  result = {
155
172
  'url': url,
156
173
  'content': content,
157
174
  }
158
- context = "From: " + url + ":\n--------------------------------\n" + content
175
+ context = "From: " + url + ":\n--------------------------------\n" + str(content)
159
176
  if url:
160
- self.ctx.urls.append(url)
177
+ self.ctx.urls_before.append(url)
178
+ if img:
179
+ result["thumb_img"] = img
180
+ self.ctx.images_before.append(img)
161
181
 
162
182
  extra = {
163
183
  "context": context,
@@ -201,7 +221,7 @@ class Worker(BaseWorker):
201
221
  }
202
222
  if urls:
203
223
  for url in urls:
204
- self.ctx.urls.append(url)
224
+ self.ctx.urls_before.append(url)
205
225
 
206
226
  return self.make_response(item, result)
207
227
 
@@ -247,7 +267,7 @@ class Worker(BaseWorker):
247
267
  'errors': errors,
248
268
  }
249
269
  if url and (url.startswith("http://") or url.startswith("https://")):
250
- self.ctx.urls.append(url)
270
+ self.ctx.urls_before.append(url)
251
271
 
252
272
  extra = {
253
273
  "url": url,
@@ -327,9 +347,118 @@ class Worker(BaseWorker):
327
347
 
328
348
  # add URL to context
329
349
  if url and (url.startswith("http://") or url.startswith("https://")):
330
- self.ctx.urls.append(url)
350
+ self.ctx.urls_before.append(url)
331
351
 
332
352
  extra = {
333
353
  "context": context,
334
354
  }
335
355
  return self.make_response(item, result, extra=extra)
356
+
357
+ def cmd_web_extract_links(self, item: dict) -> dict:
358
+ """
359
+ Web extract links command
360
+
361
+ :param item: command item
362
+ :return: response item
363
+ """
364
+ url = ""
365
+ if self.has_param(item, "url"):
366
+ url = self.get_param(item, "url")
367
+ if not url:
368
+ return self.make_response(item, "No URL provided")
369
+ links = self.plugin.window.core.web.helpers.get_links(url)
370
+ result = {
371
+ 'links': links,
372
+ }
373
+ self.ctx.urls_before.append(url)
374
+ return self.make_response(item, result)
375
+
376
+ def cmd_web_extract_images(self, item: dict) -> dict:
377
+ """
378
+ Web extract images command
379
+
380
+ :param item: command item
381
+ :return: response item
382
+ """
383
+ download = False
384
+ url = ""
385
+ if self.has_param(item, "url"):
386
+ url = self.get_param(item, "url")
387
+ if self.has_param(item, "download"):
388
+ download = bool(self.get_param(item, "download"))
389
+ if not url:
390
+ return self.make_response(item, "No URL provided")
391
+ images = self.plugin.window.core.web.helpers.get_images(url)
392
+ result = {
393
+ 'images': images,
394
+ }
395
+ if images and download:
396
+ for img in images:
397
+ try:
398
+ path = self.plugin.window.core.web.helpers.download_image(img)
399
+ if path:
400
+ self.ctx.images_before.append(path)
401
+ except Exception as e:
402
+ print(e)
403
+ self.ctx.urls_before.append(url)
404
+ return self.make_response(item, result)
405
+
406
+ def cmd_web_request(self, item: dict) -> dict:
407
+ """
408
+ Web request command
409
+
410
+ :param item: command item
411
+ :return: response item
412
+ """
413
+ url = ""
414
+ method = "GET"
415
+ data = None
416
+ raw = None
417
+ json = None
418
+ headers = None
419
+ params = None
420
+ cookies = None
421
+ files = None
422
+
423
+ if self.has_param(item, "url"):
424
+ url = self.get_param(item, "url")
425
+ if not url:
426
+ return self.make_response(item, "No URL provided")
427
+ if self.has_param(item, "method"):
428
+ method = self.get_param(item, "method")
429
+ if self.has_param(item, "data_form"):
430
+ data = self.get_param(item, "data_form")
431
+ if self.has_param(item, "data"):
432
+ raw = self.get_param(item, "data")
433
+ if self.has_param(item, "data_json"):
434
+ json = self.get_param(item, "data_json")
435
+ if self.has_param(item, "headers"):
436
+ headers = self.get_param(item, "headers")
437
+ if self.has_param(item, "params"):
438
+ params = self.get_param(item, "params")
439
+ if self.has_param(item, "cookies"):
440
+ cookies = self.get_param(item, "cookies")
441
+ if self.has_param(item, "files"):
442
+ files = self.get_param(item, "files")
443
+
444
+ code, response = self.window.core.web.helpers.request(
445
+ url=url,
446
+ method=method,
447
+ headers=headers,
448
+ params=params,
449
+ data=data if data else raw,
450
+ json=json,
451
+ cookies=cookies,
452
+ files=files,
453
+ timeout=self.plugin.get_option_value("timeout"),
454
+ disable_ssl_verify=self.plugin.get_option_value("disable_ssl"),
455
+ allow_redirects=True,
456
+ stream=False,
457
+ user_agent=self.plugin.get_option_value("user_agent"))
458
+ result = {
459
+ 'url': url,
460
+ 'code': code,
461
+ 'response': response,
462
+ }
463
+ self.ctx.urls_before.append(url)
464
+ return self.make_response(item, result)
@@ -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.18 19:00:00 #
9
+ # Updated Date: 2024.12.14 19:00:00 #
10
10
  # ================================================== #
11
11
 
12
12
  from pygpt_net.plugin.base.config import BaseConfig, BasePlugin
@@ -71,7 +71,7 @@ class Config(BaseConfig):
71
71
  "model_prepare_question",
72
72
  type="combo",
73
73
  use="models",
74
- value="gpt-3.5-turbo",
74
+ value="gpt-4o-mini",
75
75
  label="Model for question preparation",
76
76
  description="Model used to prepare question before asking Llama-index, default: gpt-3.5-turbo",
77
77
  tooltip="Model",
@@ -88,7 +88,7 @@ class Config(BaseConfig):
88
88
  plugin.add_option(
89
89
  "model_query",
90
90
  type="combo",
91
- value="gpt-3.5-turbo",
91
+ value="gpt-4o-mini",
92
92
  label="Model",
93
93
  description="Model used for querying Llama-index, default: gpt-3.5-turbo",
94
94
  tooltip="Query model",
@@ -0,0 +1,123 @@
1
+ #!/usr/bin/env python3
2
+ # -*- coding: utf-8 -*-
3
+ # ================================================== #
4
+ # This file is a part of PYGPT package #
5
+ # Website: https://pygpt.net #
6
+ # GitHub: https://github.com/szczyglis-dev/py-gpt #
7
+ # MIT License #
8
+ # Created By : Marcin Szczygliński #
9
+ # Updated Date: 2024.12.15 04:00:00 #
10
+ # ================================================== #
11
+
12
+ from pygpt_net.plugin.base.plugin import BasePlugin
13
+ from pygpt_net.core.events import Event
14
+ from pygpt_net.item.ctx import CtxItem
15
+
16
+ from .config import Config
17
+ from .runner import Runner
18
+ from .worker import Worker
19
+
20
+ from pygpt_net.utils import trans
21
+
22
+
23
+ class Plugin(BasePlugin):
24
+ def __init__(self, *args, **kwargs):
25
+ super(Plugin, self).__init__(*args, **kwargs)
26
+ self.id = "mailer"
27
+ self.name = "Mailer"
28
+ self.description = "Provides email sending"
29
+ self.prefix = "Email"
30
+ self.type = [
31
+ 'email',
32
+ ]
33
+ self.order = 100
34
+ self.allowed_cmds = [
35
+ "send_mail",
36
+ "get_emails",
37
+ "get_email_body",
38
+ ]
39
+ self.use_locale = True
40
+ self.runner = Runner(self)
41
+ self.worker = None
42
+ self.config = Config(self)
43
+ self.init_options()
44
+
45
+ def init_options(self):
46
+ """Initialize options"""
47
+ self.config.from_defaults(self)
48
+
49
+ def handle(self, event: Event, *args, **kwargs):
50
+ """
51
+ Handle dispatched event
52
+
53
+ :param event: event object
54
+ :param args: args
55
+ :param kwargs: kwargs
56
+ """
57
+ name = event.name
58
+ data = event.data
59
+ ctx = event.ctx
60
+ silent = data.get("silent", False)
61
+
62
+ if name == Event.CMD_SYNTAX:
63
+ self.cmd_syntax(data)
64
+
65
+ elif name == Event.CMD_EXECUTE:
66
+ self.cmd(
67
+ ctx,
68
+ data['commands'],
69
+ silent,
70
+ )
71
+
72
+ def cmd_syntax(self, data: dict):
73
+ """
74
+ Event: CMD_SYNTAX
75
+
76
+ :param data: event data dict
77
+ """
78
+ for item in self.allowed_cmds:
79
+ if self.has_cmd(item):
80
+ cmd = self.get_cmd(item)
81
+ data['cmd'].append(cmd) # append command
82
+
83
+ def cmd(self, ctx: CtxItem, cmds: list, silent: bool = False):
84
+ """
85
+ Event: CMD_EXECUTE
86
+
87
+ :param ctx: CtxItem
88
+ :param cmds: commands dict
89
+ :param silent: silent mode
90
+ """
91
+ is_cmd = False
92
+ force = False
93
+ my_commands = []
94
+ for item in cmds:
95
+ if item["cmd"] in self.allowed_cmds:
96
+ my_commands.append(item)
97
+ is_cmd = True
98
+ if "force" in item and item["force"]:
99
+ force = True # call from tool
100
+
101
+ if not is_cmd:
102
+ return
103
+
104
+ # set state: busy
105
+ if not silent:
106
+ self.cmd_prepare(ctx, my_commands)
107
+
108
+ try:
109
+ worker = Worker()
110
+ worker.from_defaults(self)
111
+ worker.cmds = my_commands
112
+ worker.ctx = ctx
113
+
114
+ # connect signals
115
+ self.runner.attach_signals(worker.signals)
116
+
117
+ if not self.is_async(ctx) and not force:
118
+ worker.run()
119
+ return
120
+ worker.run_async()
121
+
122
+ except Exception as e:
123
+ self.error(e)
@@ -0,0 +1,149 @@
1
+ #!/usr/bin/env python3
2
+ # -*- coding: utf-8 -*-
3
+ # ================================================== #
4
+ # This file is a part of PYGPT package #
5
+ # Website: https://pygpt.net #
6
+ # GitHub: https://github.com/szczyglis-dev/py-gpt #
7
+ # MIT License #
8
+ # Created By : Marcin Szczygliński #
9
+ # Updated Date: 2024.12.15 04:00:00 #
10
+ # ================================================== #
11
+
12
+ from pygpt_net.plugin.base.config import BaseConfig, BasePlugin
13
+
14
+
15
+ class Config(BaseConfig):
16
+ def __init__(self, plugin: BasePlugin = None, *args, **kwargs):
17
+ super(Config, self).__init__(plugin)
18
+ self.plugin = plugin
19
+
20
+ def from_defaults(self, plugin: BasePlugin = None):
21
+ """
22
+ Set default options for plugin
23
+
24
+ :param plugin: plugin instance
25
+ """
26
+ plugin.add_option(
27
+ "smtp_host",
28
+ type="text",
29
+ value="",
30
+ label="SMTP Host",
31
+ persist=True,
32
+ tab="smtp",
33
+ )
34
+ plugin.add_option(
35
+ "smtp_port_inbox",
36
+ type="int",
37
+ value=995,
38
+ label="SMTP Port (Inbox)",
39
+ persist=True,
40
+ tab="smtp",
41
+ )
42
+ plugin.add_option(
43
+ "smtp_port_outbox",
44
+ type="int",
45
+ value=465,
46
+ label="SMTP Port (Outbox)",
47
+ persist=True,
48
+ tab="smtp",
49
+ )
50
+ plugin.add_option(
51
+ "smtp_user",
52
+ type="text",
53
+ value="",
54
+ label="SMTP User",
55
+ persist=True,
56
+ tab="smtp",
57
+ )
58
+ plugin.add_option(
59
+ "smtp_password",
60
+ type="text",
61
+ value="",
62
+ label="SMTP Password",
63
+ secret=True,
64
+ persist=True,
65
+ tab="smtp",
66
+ )
67
+ plugin.add_option(
68
+ "from_email",
69
+ type="text",
70
+ value="",
71
+ label="From (email)",
72
+ )
73
+ plugin.add_cmd(
74
+ "send_email",
75
+ instruction="Send email to specified address",
76
+ params=[
77
+ {
78
+ "name": "recipient",
79
+ "type": "str",
80
+ "description": "Recipient email address",
81
+ "required": True,
82
+ },
83
+ {
84
+ "name": "subject",
85
+ "type": "str",
86
+ "description": "Email subject",
87
+ "required": True,
88
+ },
89
+ {
90
+ "name": "message",
91
+ "type": "str",
92
+ "description": "Email message",
93
+ "required": True,
94
+ },
95
+ ],
96
+ enabled=True,
97
+ description="Allows sending emails",
98
+ tab="general",
99
+ )
100
+ plugin.add_cmd(
101
+ "get_emails",
102
+ instruction="Retrieve emails from the inbox. Use this to access emails from the inbox when the user "
103
+ "requests fetching emails from their server.",
104
+ params=[
105
+ {
106
+ "name": "limit",
107
+ "type": "int",
108
+ "description": "Limit of emails to receive, default: 10",
109
+ "required": True,
110
+ },
111
+ {
112
+ "name": "offset",
113
+ "type": "int",
114
+ "description": "Offset of emails to receive, default: 0",
115
+ "required": False,
116
+ },
117
+ {
118
+ "name": "order",
119
+ "type": "text",
120
+ "description": "Sort order, default: desc, options: asc, desc",
121
+ "required": False,
122
+ },
123
+ ],
124
+ enabled=True,
125
+ description="Allows receiving emails",
126
+ tab="general",
127
+ )
128
+ plugin.add_cmd(
129
+ "get_email_body",
130
+ instruction="Retrieve the complete email content from the inbox. Use this to access the message body. "
131
+ "To obtain email IDs, use the 'get_emails' function first.",
132
+ params=[
133
+ {
134
+ "name": "id",
135
+ "type": "int",
136
+ "description": "Email ID (index)",
137
+ "required": True,
138
+ },
139
+ {
140
+ "name": "format",
141
+ "type": "text",
142
+ "description": "Display format, default: text, options: text, html",
143
+ "required": False,
144
+ },
145
+ ],
146
+ enabled=True,
147
+ description="Allows receiving email body",
148
+ tab="general",
149
+ )