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.
- CHANGELOG.md +37 -0
- README.md +176 -182
- pygpt_net/CHANGELOG.txt +37 -0
- pygpt_net/__init__.py +3 -3
- pygpt_net/app.py +3 -1
- pygpt_net/controller/__init__.py +7 -3
- pygpt_net/controller/access/control.py +1 -1
- pygpt_net/controller/access/voice.py +11 -5
- pygpt_net/controller/agent/experts.py +11 -6
- pygpt_net/controller/agent/legacy.py +8 -6
- pygpt_net/controller/agent/llama.py +4 -2
- pygpt_net/controller/assistant/__init__.py +9 -4
- pygpt_net/controller/assistant/batch.py +38 -21
- pygpt_net/controller/assistant/editor.py +7 -6
- pygpt_net/controller/assistant/files.py +23 -7
- pygpt_net/controller/assistant/store.py +20 -7
- pygpt_net/controller/assistant/threads.py +34 -8
- pygpt_net/controller/attachment.py +29 -10
- pygpt_net/controller/audio/__init__.py +26 -5
- pygpt_net/controller/calendar/__init__.py +23 -4
- pygpt_net/controller/calendar/note.py +57 -11
- pygpt_net/controller/camera.py +4 -12
- pygpt_net/controller/chat/__init__.py +5 -3
- pygpt_net/controller/chat/attachment.py +34 -7
- pygpt_net/controller/chat/audio.py +2 -2
- pygpt_net/controller/chat/command.py +4 -2
- pygpt_net/controller/chat/common.py +11 -4
- pygpt_net/controller/chat/files.py +10 -3
- pygpt_net/controller/chat/image.py +17 -5
- pygpt_net/controller/chat/input.py +10 -7
- pygpt_net/controller/chat/output.py +21 -6
- pygpt_net/controller/chat/render.py +100 -21
- pygpt_net/controller/chat/response.py +34 -7
- pygpt_net/controller/chat/stream.py +4 -2
- pygpt_net/controller/chat/text.py +6 -4
- pygpt_net/controller/command.py +11 -3
- pygpt_net/controller/config/__init__.py +34 -6
- pygpt_net/controller/config/field/checkbox.py +7 -4
- pygpt_net/controller/config/field/cmd.py +7 -5
- pygpt_net/controller/config/field/combo.py +14 -6
- pygpt_net/controller/config/field/dictionary.py +14 -11
- pygpt_net/controller/config/field/input.py +9 -6
- pygpt_net/controller/config/field/slider.py +11 -8
- pygpt_net/controller/config/field/textarea.py +8 -5
- pygpt_net/controller/config/placeholder.py +66 -21
- pygpt_net/controller/ctx/__init__.py +138 -49
- pygpt_net/controller/ctx/common.py +15 -4
- pygpt_net/controller/ctx/extra.py +11 -3
- pygpt_net/controller/ctx/summarizer.py +24 -5
- pygpt_net/controller/debug/__init__.py +27 -6
- pygpt_net/controller/dialogs/confirm.py +34 -7
- pygpt_net/controller/dialogs/debug.py +4 -2
- pygpt_net/controller/dialogs/info.py +7 -2
- pygpt_net/controller/files.py +48 -10
- pygpt_net/controller/finder.py +11 -5
- pygpt_net/controller/idx/__init__.py +10 -3
- pygpt_net/controller/idx/common.py +4 -2
- pygpt_net/controller/idx/indexer.py +25 -17
- pygpt_net/controller/idx/settings.py +9 -3
- pygpt_net/controller/kernel/__init__.py +34 -8
- pygpt_net/controller/kernel/reply.py +12 -3
- pygpt_net/controller/kernel/stack.py +5 -3
- pygpt_net/controller/lang/custom.py +2 -7
- pygpt_net/controller/lang/mapping.py +5 -3
- pygpt_net/controller/layout.py +2 -2
- pygpt_net/controller/mode.py +16 -4
- pygpt_net/controller/model/__init__.py +14 -3
- pygpt_net/controller/model/editor.py +8 -3
- pygpt_net/controller/notepad.py +26 -12
- pygpt_net/controller/painter/capture.py +23 -4
- pygpt_net/controller/painter/common.py +9 -7
- pygpt_net/controller/plugins/__init__.py +19 -5
- pygpt_net/controller/plugins/presets.py +15 -6
- pygpt_net/controller/plugins/settings.py +9 -3
- pygpt_net/controller/presets/__init__.py +55 -16
- pygpt_net/controller/presets/editor.py +26 -10
- pygpt_net/controller/settings/__init__.py +3 -2
- pygpt_net/controller/settings/editor.py +29 -7
- pygpt_net/controller/settings/profile.py +22 -5
- pygpt_net/controller/theme/__init__.py +54 -12
- pygpt_net/controller/theme/common.py +24 -2
- pygpt_net/controller/theme/markdown.py +32 -16
- pygpt_net/controller/theme/menu.py +26 -5
- pygpt_net/controller/theme/nodes.py +2 -5
- pygpt_net/controller/tools/__init__.py +40 -2
- pygpt_net/controller/ui/__init__.py +4 -6
- pygpt_net/controller/ui/mode.py +16 -21
- pygpt_net/controller/ui/tabs.py +363 -65
- pygpt_net/core/access/actions.py +6 -4
- pygpt_net/core/access/shortcuts.py +4 -3
- pygpt_net/core/access/voice.py +6 -5
- pygpt_net/core/agents/legacy.py +4 -2
- pygpt_net/core/agents/memory.py +7 -2
- pygpt_net/core/agents/observer/evaluation.py +15 -7
- pygpt_net/core/agents/provider.py +9 -4
- pygpt_net/core/agents/runner.py +61 -15
- pygpt_net/core/agents/tools.py +23 -5
- pygpt_net/core/assistants/__init__.py +6 -4
- pygpt_net/core/assistants/files.py +35 -12
- pygpt_net/core/assistants/store.py +20 -10
- pygpt_net/core/attachments/__init__.py +54 -15
- pygpt_net/core/attachments/context.py +92 -29
- pygpt_net/core/audio/__init__.py +74 -3
- pygpt_net/core/audio/context.py +7 -2
- pygpt_net/core/audio/whisper.py +37 -0
- pygpt_net/core/bridge/__init__.py +22 -6
- pygpt_net/core/bridge/context.py +5 -3
- pygpt_net/core/bridge/worker.py +2 -2
- pygpt_net/core/calendar/__init__.py +57 -11
- pygpt_net/core/chain/__init__.py +8 -2
- pygpt_net/core/chain/chat.py +10 -8
- pygpt_net/core/chain/completion.py +10 -7
- pygpt_net/core/command.py +62 -17
- pygpt_net/core/ctx/__init__.py +260 -58
- pygpt_net/core/ctx/bag.py +25 -4
- pygpt_net/core/ctx/container.py +28 -17
- pygpt_net/core/ctx/idx.py +45 -8
- pygpt_net/core/ctx/output.py +95 -74
- pygpt_net/core/ctx/reply.py +5 -2
- pygpt_net/core/db/__init__.py +8 -7
- pygpt_net/core/db/viewer.py +17 -11
- pygpt_net/core/debug/__init__.py +10 -9
- pygpt_net/core/debug/events.py +22 -10
- pygpt_net/core/debug/tabs.py +9 -3
- pygpt_net/core/docker/__init__.py +11 -5
- pygpt_net/core/docker/builder.py +11 -3
- pygpt_net/core/events/app.py +5 -3
- pygpt_net/core/events/base.py +11 -5
- pygpt_net/core/events/control.py +5 -3
- pygpt_net/core/events/event.py +17 -7
- pygpt_net/core/events/kernel.py +5 -3
- pygpt_net/core/events/render.py +5 -3
- pygpt_net/core/experts/__init__.py +5 -4
- pygpt_net/core/filesystem/__init__.py +52 -34
- pygpt_net/core/filesystem/actions.py +8 -5
- pygpt_net/core/filesystem/editor.py +13 -3
- pygpt_net/core/filesystem/types.py +12 -7
- pygpt_net/core/filesystem/url.py +7 -3
- pygpt_net/core/history.py +3 -2
- pygpt_net/core/idx/__init__.py +48 -27
- pygpt_net/core/idx/chat.py +51 -17
- pygpt_net/core/idx/context.py +6 -2
- pygpt_net/core/idx/indexing.py +107 -42
- pygpt_net/core/idx/llm.py +11 -3
- pygpt_net/core/idx/metadata.py +13 -3
- pygpt_net/core/idx/types/ctx.py +32 -6
- pygpt_net/core/idx/types/external.py +41 -7
- pygpt_net/core/idx/types/files.py +31 -6
- pygpt_net/core/image.py +15 -4
- pygpt_net/core/installer.py +2 -4
- pygpt_net/core/llm/__init__.py +13 -3
- pygpt_net/core/locale.py +34 -8
- pygpt_net/core/models.py +63 -17
- pygpt_net/core/modes.py +11 -13
- pygpt_net/core/notepad.py +10 -5
- pygpt_net/core/plugins.py +31 -19
- pygpt_net/core/presets.py +37 -17
- pygpt_net/core/profile.py +21 -7
- pygpt_net/core/prompt/__init__.py +10 -3
- pygpt_net/core/prompt/custom.py +7 -6
- pygpt_net/core/prompt/template.py +9 -3
- pygpt_net/core/render/base.py +117 -22
- pygpt_net/core/render/markdown/body.py +27 -7
- pygpt_net/core/render/markdown/renderer.py +119 -22
- pygpt_net/core/render/plain/body.py +22 -5
- pygpt_net/core/render/plain/renderer.py +97 -21
- pygpt_net/core/render/web/body.py +75 -25
- pygpt_net/core/render/web/parser.py +3 -1
- pygpt_net/core/render/web/renderer.py +313 -63
- pygpt_net/core/settings.py +10 -5
- pygpt_net/core/tabs/__init__.py +290 -103
- pygpt_net/core/tabs/tab.py +26 -5
- pygpt_net/core/tokens.py +47 -12
- pygpt_net/core/updater/__init__.py +20 -7
- pygpt_net/core/vision/analyzer.py +29 -6
- pygpt_net/core/{web.py → web/__init__.py} +29 -7
- pygpt_net/core/web/helpers.py +237 -0
- pygpt_net/data/config/config.json +15 -4
- pygpt_net/data/config/models.json +3 -3
- pygpt_net/data/config/modes.json +3 -3
- pygpt_net/data/config/settings.json +55 -10
- pygpt_net/data/config/settings_section.json +3 -0
- pygpt_net/data/css/style.light.css +1 -0
- pygpt_net/data/css/{web.css → web-blocks.css} +162 -133
- pygpt_net/data/css/{web.light.css → web-blocks.light.css} +7 -0
- pygpt_net/data/css/web-chatgpt.css +350 -0
- pygpt_net/data/css/web-chatgpt.dark.css +64 -0
- pygpt_net/data/css/web-chatgpt.light.css +75 -0
- pygpt_net/data/css/web-chatgpt_wide.css +350 -0
- pygpt_net/data/css/web-chatgpt_wide.dark.css +64 -0
- pygpt_net/data/css/web-chatgpt_wide.light.css +75 -0
- pygpt_net/data/icons/split_screen.svg +1 -0
- pygpt_net/data/locale/locale.de.ini +12 -0
- pygpt_net/data/locale/locale.en.ini +18 -2
- pygpt_net/data/locale/locale.es.ini +12 -0
- pygpt_net/data/locale/locale.fr.ini +12 -0
- pygpt_net/data/locale/locale.it.ini +12 -0
- pygpt_net/data/locale/locale.pl.ini +12 -0
- pygpt_net/data/locale/locale.uk.ini +12 -0
- pygpt_net/data/locale/locale.zh.ini +12 -0
- pygpt_net/data/locale/plugin.cmd_web.de.ini +2 -0
- pygpt_net/data/locale/plugin.cmd_web.en.ini +22 -10
- pygpt_net/data/locale/plugin.cmd_web.es.ini +2 -0
- pygpt_net/data/locale/plugin.cmd_web.fr.ini +2 -0
- pygpt_net/data/locale/plugin.cmd_web.it.ini +2 -0
- pygpt_net/data/locale/plugin.cmd_web.pl.ini +2 -0
- pygpt_net/data/locale/plugin.cmd_web.uk.ini +2 -0
- pygpt_net/data/locale/plugin.cmd_web.zh.ini +2 -0
- pygpt_net/data/locale/plugin.mailer.en.ini +21 -0
- pygpt_net/icons.qrc +1 -0
- pygpt_net/icons_rc.py +165 -136
- pygpt_net/item/ctx.py +58 -25
- pygpt_net/plugin/agent/__init__.py +7 -2
- pygpt_net/plugin/audio_input/simple.py +21 -5
- pygpt_net/plugin/audio_output/__init__.py +9 -1
- pygpt_net/plugin/base/config.py +4 -2
- pygpt_net/plugin/base/plugin.py +75 -23
- pygpt_net/plugin/base/worker.py +42 -11
- pygpt_net/plugin/cmd_code_interpreter/__init__.py +39 -37
- pygpt_net/plugin/cmd_code_interpreter/runner.py +25 -12
- pygpt_net/plugin/cmd_history/config.py +2 -2
- pygpt_net/plugin/cmd_web/__init__.py +48 -9
- pygpt_net/plugin/cmd_web/config.py +135 -41
- pygpt_net/plugin/cmd_web/websearch.py +74 -33
- pygpt_net/plugin/cmd_web/worker.py +142 -13
- pygpt_net/plugin/idx_llama_index/config.py +3 -3
- pygpt_net/plugin/mailer/__init__.py +123 -0
- pygpt_net/plugin/mailer/config.py +149 -0
- pygpt_net/plugin/mailer/runner.py +285 -0
- pygpt_net/plugin/mailer/worker.py +123 -0
- pygpt_net/provider/agents/base.py +5 -2
- pygpt_net/provider/agents/openai.py +4 -2
- pygpt_net/provider/agents/openai_assistant.py +4 -2
- pygpt_net/provider/agents/planner.py +4 -2
- pygpt_net/provider/agents/react.py +4 -2
- pygpt_net/provider/audio_output/openai_tts.py +5 -11
- pygpt_net/provider/core/assistant/base.py +5 -3
- pygpt_net/provider/core/assistant/json_file.py +8 -5
- pygpt_net/provider/core/assistant_file/base.py +4 -3
- pygpt_net/provider/core/assistant_file/db_sqlite/__init__.py +4 -3
- pygpt_net/provider/core/assistant_file/db_sqlite/storage.py +3 -2
- pygpt_net/provider/core/assistant_store/base.py +6 -4
- pygpt_net/provider/core/assistant_store/db_sqlite/__init__.py +5 -4
- pygpt_net/provider/core/assistant_store/db_sqlite/storage.py +5 -3
- pygpt_net/provider/core/attachment/base.py +5 -3
- pygpt_net/provider/core/attachment/json_file.py +4 -3
- pygpt_net/provider/core/calendar/base.py +5 -3
- pygpt_net/provider/core/calendar/db_sqlite/__init__.py +6 -5
- pygpt_net/provider/core/calendar/db_sqlite/storage.py +5 -4
- pygpt_net/provider/core/config/base.py +8 -6
- pygpt_net/provider/core/config/json_file.py +9 -7
- pygpt_net/provider/core/config/patch.py +43 -1
- pygpt_net/provider/core/ctx/base.py +30 -25
- pygpt_net/provider/core/ctx/db_sqlite/__init__.py +59 -34
- pygpt_net/provider/core/ctx/db_sqlite/storage.py +62 -30
- pygpt_net/provider/core/ctx/db_sqlite/utils.py +11 -9
- pygpt_net/provider/core/index/base.py +129 -23
- pygpt_net/provider/core/index/db_sqlite/__init__.py +130 -23
- pygpt_net/provider/core/index/db_sqlite/storage.py +130 -23
- pygpt_net/provider/core/index/db_sqlite/utils.py +4 -2
- pygpt_net/provider/core/mode/base.py +5 -3
- pygpt_net/provider/core/mode/json_file.py +7 -6
- pygpt_net/provider/core/model/base.py +6 -4
- pygpt_net/provider/core/model/json_file.py +9 -7
- pygpt_net/provider/core/notepad/base.py +5 -3
- pygpt_net/provider/core/notepad/db_sqlite/__init__.py +5 -4
- pygpt_net/provider/core/notepad/db_sqlite/storage.py +4 -3
- pygpt_net/provider/core/plugin_preset/base.py +4 -2
- pygpt_net/provider/core/plugin_preset/json_file.py +5 -3
- pygpt_net/provider/core/preset/base.py +6 -4
- pygpt_net/provider/core/preset/json_file.py +9 -9
- pygpt_net/provider/core/prompt/base.py +6 -3
- pygpt_net/provider/core/prompt/json_file.py +11 -6
- pygpt_net/provider/gpt/assistants.py +21 -11
- pygpt_net/provider/gpt/audio.py +6 -5
- pygpt_net/provider/gpt/chat.py +10 -7
- pygpt_net/provider/gpt/completion.py +11 -5
- pygpt_net/provider/gpt/image.py +9 -2
- pygpt_net/provider/gpt/store.py +53 -18
- pygpt_net/provider/gpt/vision.py +17 -11
- pygpt_net/provider/llms/anthropic.py +7 -2
- pygpt_net/provider/llms/azure_openai.py +26 -5
- pygpt_net/provider/llms/base.py +47 -9
- pygpt_net/provider/llms/google.py +7 -2
- pygpt_net/provider/llms/hugging_face.py +13 -3
- pygpt_net/provider/llms/hugging_face_api.py +18 -4
- pygpt_net/provider/llms/local.py +7 -2
- pygpt_net/provider/llms/ollama.py +30 -6
- pygpt_net/provider/llms/openai.py +32 -6
- pygpt_net/provider/vector_stores/__init__.py +45 -14
- pygpt_net/provider/vector_stores/base.py +35 -8
- pygpt_net/provider/vector_stores/chroma.py +13 -3
- pygpt_net/provider/vector_stores/ctx_attachment.py +31 -12
- pygpt_net/provider/vector_stores/elasticsearch.py +12 -3
- pygpt_net/provider/vector_stores/pinecode.py +12 -3
- pygpt_net/provider/vector_stores/redis.py +12 -3
- pygpt_net/provider/vector_stores/simple.py +12 -3
- pygpt_net/provider/vector_stores/temp.py +16 -4
- pygpt_net/provider/web/base.py +10 -3
- pygpt_net/provider/web/google_custom_search.py +9 -3
- pygpt_net/provider/web/microsoft_bing.py +9 -3
- pygpt_net/tools/__init__.py +20 -4
- pygpt_net/tools/audio_transcriber/__init__.py +4 -3
- pygpt_net/tools/base.py +28 -7
- pygpt_net/tools/code_interpreter/__init__.py +177 -77
- pygpt_net/tools/code_interpreter/ui/dialogs.py +21 -103
- pygpt_net/tools/code_interpreter/ui/widgets.py +284 -9
- pygpt_net/tools/html_canvas/__init__.py +81 -25
- pygpt_net/tools/html_canvas/ui/dialogs.py +46 -62
- pygpt_net/tools/html_canvas/ui/widgets.py +96 -3
- pygpt_net/tools/image_viewer/__init__.py +10 -4
- pygpt_net/tools/indexer/__init__.py +8 -7
- pygpt_net/tools/media_player/__init__.py +4 -3
- pygpt_net/tools/text_editor/__init__.py +36 -10
- pygpt_net/ui/base/context_menu.py +2 -2
- pygpt_net/ui/layout/chat/input.py +10 -18
- pygpt_net/ui/layout/chat/output.py +27 -45
- pygpt_net/ui/layout/ctx/ctx_list.py +13 -4
- pygpt_net/ui/layout/toolbox/footer.py +18 -2
- pygpt_net/ui/main.py +2 -2
- pygpt_net/ui/menu/audio.py +12 -1
- pygpt_net/ui/menu/config.py +7 -11
- pygpt_net/ui/menu/debug.py +11 -1
- pygpt_net/ui/menu/theme.py +9 -2
- pygpt_net/ui/widget/filesystem/explorer.py +2 -2
- pygpt_net/ui/widget/lists/context.py +27 -5
- pygpt_net/ui/widget/tabs/Input.py +2 -2
- pygpt_net/ui/widget/tabs/body.py +2 -1
- pygpt_net/ui/widget/tabs/layout.py +195 -0
- pygpt_net/ui/widget/tabs/output.py +218 -55
- pygpt_net/ui/widget/textarea/html.py +11 -1
- pygpt_net/ui/widget/textarea/output.py +10 -1
- pygpt_net/ui/widget/textarea/search_input.py +4 -1
- pygpt_net/ui/widget/textarea/web.py +49 -9
- {pygpt_net-2.4.37.dist-info → pygpt_net-2.4.42.dist-info}/METADATA +177 -183
- {pygpt_net-2.4.37.dist-info → pygpt_net-2.4.42.dist-info}/RECORD +340 -325
- /pygpt_net/data/css/{web.dark.css → web-blocks.dark.css} +0 -0
- {pygpt_net-2.4.37.dist-info → pygpt_net-2.4.42.dist-info}/LICENSE +0 -0
- {pygpt_net-2.4.37.dist-info → pygpt_net-2.4.42.dist-info}/WHEEL +0 -0
- {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.
|
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.
|
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.
|
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.
|
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.
|
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.
|
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.
|
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.
|
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.
|
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-
|
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-
|
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
|
+
)
|