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,9 +6,11 @@
|
|
6
6
|
# GitHub: https://github.com/szczyglis-dev/py-gpt #
|
7
7
|
# MIT License #
|
8
8
|
# Created By : Marcin Szczygliński #
|
9
|
-
# Updated Date: 2024.
|
9
|
+
# Updated Date: 2024.12.14 00:00:00 #
|
10
10
|
# ================================================== #
|
11
11
|
|
12
|
+
from typing import Any
|
13
|
+
|
12
14
|
from pygpt_net.core.events import AppEvent
|
13
15
|
from pygpt_net.item.ctx import CtxItem
|
14
16
|
|
@@ -64,7 +66,7 @@ class Chat:
|
|
64
66
|
self.render.reload()
|
65
67
|
self.attachment.reload()
|
66
68
|
|
67
|
-
def handle_error(self, err:
|
69
|
+
def handle_error(self, err: Any):
|
68
70
|
"""
|
69
71
|
Handle error
|
70
72
|
|
@@ -93,7 +95,7 @@ class Chat:
|
|
93
95
|
else:
|
94
96
|
self.log("[ctx] {}.".format(mode.upper()))
|
95
97
|
|
96
|
-
def log(self, data:
|
98
|
+
def log(self, data: Any):
|
97
99
|
"""
|
98
100
|
Log data to debug
|
99
101
|
|
@@ -6,10 +6,11 @@
|
|
6
6
|
# GitHub: https://github.com/szczyglis-dev/py-gpt #
|
7
7
|
# MIT License #
|
8
8
|
# Created By : Marcin Szczygliński #
|
9
|
-
# Updated Date: 2024.
|
9
|
+
# Updated Date: 2024.12.14 08:00:00 #
|
10
10
|
# ================================================== #
|
11
11
|
|
12
12
|
import os
|
13
|
+
from typing import List, Dict, Any
|
13
14
|
|
14
15
|
from PySide6.QtCore import Slot, QObject
|
15
16
|
|
@@ -74,7 +75,11 @@ class Attachment(QObject):
|
|
74
75
|
"""Reload attachments"""
|
75
76
|
self.setup()
|
76
77
|
|
77
|
-
def handle(
|
78
|
+
def handle(
|
79
|
+
self,
|
80
|
+
mode: str,
|
81
|
+
text: str
|
82
|
+
):
|
78
83
|
"""
|
79
84
|
Handle attachment upload
|
80
85
|
|
@@ -104,7 +109,12 @@ class Attachment(QObject):
|
|
104
109
|
return True
|
105
110
|
return False
|
106
111
|
|
107
|
-
def upload(
|
112
|
+
def upload(
|
113
|
+
self,
|
114
|
+
meta: CtxMeta,
|
115
|
+
mode: str,
|
116
|
+
prompt: str
|
117
|
+
) -> bool:
|
108
118
|
"""
|
109
119
|
Upload attachments for meta
|
110
120
|
|
@@ -261,7 +271,11 @@ class Attachment(QObject):
|
|
261
271
|
"""
|
262
272
|
return self.mode
|
263
273
|
|
264
|
-
def get_context(
|
274
|
+
def get_context(
|
275
|
+
self,
|
276
|
+
ctx: CtxItem,
|
277
|
+
history: List[CtxItem]
|
278
|
+
) -> str:
|
265
279
|
"""
|
266
280
|
Get additional context for attachment
|
267
281
|
|
@@ -292,7 +306,10 @@ class Attachment(QObject):
|
|
292
306
|
return "====================================\nADDITIONAL CONTEXT FROM ATTACHMENT(s): {}".format(content)
|
293
307
|
return ""
|
294
308
|
|
295
|
-
def get_uploaded_attachments(
|
309
|
+
def get_uploaded_attachments(
|
310
|
+
self,
|
311
|
+
meta: CtxMeta
|
312
|
+
) -> List[Dict[str, Any]]:
|
296
313
|
"""
|
297
314
|
Get uploaded attachments for meta
|
298
315
|
|
@@ -364,7 +381,12 @@ class Attachment(QObject):
|
|
364
381
|
"""Hide uploaded attachments"""
|
365
382
|
self.window.ui.tabs['input'].setTabVisible(self.uploaded_tab_idx, False)
|
366
383
|
|
367
|
-
def delete_by_idx(
|
384
|
+
def delete_by_idx(
|
385
|
+
self,
|
386
|
+
idx: int,
|
387
|
+
force: bool = False,
|
388
|
+
remove_local: bool = True
|
389
|
+
):
|
368
390
|
"""
|
369
391
|
Delete attachment by index
|
370
392
|
|
@@ -388,7 +410,12 @@ class Attachment(QObject):
|
|
388
410
|
self.window.core.attachments.context.delete(meta, item, delete_files=remove_local)
|
389
411
|
self.update_list(meta)
|
390
412
|
|
391
|
-
def clear(
|
413
|
+
def clear(
|
414
|
+
self,
|
415
|
+
force: bool = False,
|
416
|
+
remove_local: bool = False,
|
417
|
+
auto: bool = False
|
418
|
+
):
|
392
419
|
"""
|
393
420
|
Clear attachments list
|
394
421
|
|
@@ -6,7 +6,7 @@
|
|
6
6
|
# GitHub: https://github.com/szczyglis-dev/py-gpt #
|
7
7
|
# MIT License #
|
8
8
|
# Created By : Marcin Szczygliński #
|
9
|
-
# Updated Date: 2024.
|
9
|
+
# Updated Date: 2024.12.14 18:00:00 #
|
10
10
|
# ================================================== #
|
11
11
|
|
12
12
|
import base64
|
@@ -63,7 +63,7 @@ class Audio:
|
|
63
63
|
:param ctx: Context item
|
64
64
|
"""
|
65
65
|
wav_path = os.path.join(self.window.core.config.get_user_path(), self.audio_file)
|
66
|
-
if ctx.is_audio and ctx.audio_output:
|
66
|
+
if ctx.is_audio and ctx.audio_output and ctx.audio_read_allowed():
|
67
67
|
wav_bytes = base64.b64decode(ctx.audio_output)
|
68
68
|
with open(wav_path, "wb") as f:
|
69
69
|
f.write(wav_bytes)
|
@@ -6,9 +6,11 @@
|
|
6
6
|
# GitHub: https://github.com/szczyglis-dev/py-gpt #
|
7
7
|
# MIT License #
|
8
8
|
# Created By : Marcin Szczygliński #
|
9
|
-
# Updated Date: 2024.
|
9
|
+
# Updated Date: 2024.12.14 00:00:00 #
|
10
10
|
# ================================================== #
|
11
11
|
|
12
|
+
from typing import Any
|
13
|
+
|
12
14
|
from pygpt_net.core.types import (
|
13
15
|
MODE_AGENT,
|
14
16
|
)
|
@@ -79,7 +81,7 @@ class Command:
|
|
79
81
|
})
|
80
82
|
self.window.dispatch(event)
|
81
83
|
|
82
|
-
def log(self, data:
|
84
|
+
def log(self, data: Any):
|
83
85
|
"""
|
84
86
|
Log data to debug
|
85
87
|
|
@@ -6,7 +6,7 @@
|
|
6
6
|
# GitHub: https://github.com/szczyglis-dev/py-gpt #
|
7
7
|
# MIT License #
|
8
8
|
# Created By : Marcin Szczygliński #
|
9
|
-
# Updated Date: 2024.
|
9
|
+
# Updated Date: 2024.12.14 08:00:00 #
|
10
10
|
# ================================================== #
|
11
11
|
|
12
12
|
import os
|
@@ -113,7 +113,11 @@ class Common:
|
|
113
113
|
self.window.ui.nodes['input'].setFocus()
|
114
114
|
self.initialized = True
|
115
115
|
|
116
|
-
def append_to_input(
|
116
|
+
def append_to_input(
|
117
|
+
self,
|
118
|
+
text: str,
|
119
|
+
separator: str = "\n"
|
120
|
+
):
|
117
121
|
"""
|
118
122
|
Append text to input
|
119
123
|
|
@@ -223,7 +227,6 @@ class Common:
|
|
223
227
|
unlock = False
|
224
228
|
return unlock
|
225
229
|
|
226
|
-
|
227
230
|
def stop(self, exit: bool = False):
|
228
231
|
"""
|
229
232
|
Stop all
|
@@ -358,7 +361,11 @@ class Common:
|
|
358
361
|
else:
|
359
362
|
self.img_enable_raw()
|
360
363
|
|
361
|
-
def save_text(
|
364
|
+
def save_text(
|
365
|
+
self,
|
366
|
+
text: str,
|
367
|
+
type: str = "txt"
|
368
|
+
):
|
362
369
|
"""
|
363
370
|
Save text to file
|
364
371
|
|
@@ -6,9 +6,12 @@
|
|
6
6
|
# GitHub: https://github.com/szczyglis-dev/py-gpt #
|
7
7
|
# MIT License #
|
8
8
|
# Created By : Marcin Szczygliński #
|
9
|
-
# Updated Date: 2024.
|
9
|
+
# Updated Date: 2024.12.14 08:00:00 #
|
10
10
|
# ================================================== #
|
11
11
|
|
12
|
+
from typing import Dict
|
13
|
+
|
14
|
+
from pygpt_net.item.attachment import AttachmentItem
|
12
15
|
from pygpt_net.item.ctx import CtxItem
|
13
16
|
from pygpt_net.utils import trans
|
14
17
|
|
@@ -22,7 +25,11 @@ class Files:
|
|
22
25
|
"""
|
23
26
|
self.window = window
|
24
27
|
|
25
|
-
def send(
|
28
|
+
def send(
|
29
|
+
self,
|
30
|
+
mode: str,
|
31
|
+
ctx: CtxItem
|
32
|
+
):
|
26
33
|
"""
|
27
34
|
Send attachments
|
28
35
|
|
@@ -37,7 +44,7 @@ class Files:
|
|
37
44
|
self.window.controller.chat.log("Uploaded attachments (Assistant): {}".format(len(attachments)))
|
38
45
|
return attachments
|
39
46
|
|
40
|
-
def upload(self, mode: str) ->
|
47
|
+
def upload(self, mode: str) -> Dict[str, AttachmentItem]:
|
41
48
|
"""
|
42
49
|
Upload attachments
|
43
50
|
|
@@ -6,9 +6,11 @@
|
|
6
6
|
# GitHub: https://github.com/szczyglis-dev/py-gpt #
|
7
7
|
# MIT License #
|
8
8
|
# Created By : Marcin Szczygliński #
|
9
|
-
# Updated Date: 2024.
|
9
|
+
# Updated Date: 2024.12.14 08:00:00 #
|
10
10
|
# ================================================== #
|
11
11
|
|
12
|
+
from typing import Optional, List
|
13
|
+
|
12
14
|
from PySide6.QtCore import Slot
|
13
15
|
|
14
16
|
from pygpt_net.core.bridge.context import BridgeContext
|
@@ -30,8 +32,8 @@ class Image:
|
|
30
32
|
def send(
|
31
33
|
self,
|
32
34
|
text: str,
|
33
|
-
prev_ctx: CtxItem = None,
|
34
|
-
parent_id: int = None,
|
35
|
+
prev_ctx: Optional[CtxItem] = None,
|
36
|
+
parent_id: Optional[int] = None,
|
35
37
|
) -> CtxItem:
|
36
38
|
"""
|
37
39
|
Send prompt for image generate
|
@@ -116,7 +118,12 @@ class Image:
|
|
116
118
|
return ctx
|
117
119
|
|
118
120
|
@Slot(object, list, str)
|
119
|
-
def handle_response(
|
121
|
+
def handle_response(
|
122
|
+
self,
|
123
|
+
ctx: CtxItem,
|
124
|
+
paths: List[str],
|
125
|
+
prompt: str
|
126
|
+
):
|
120
127
|
"""
|
121
128
|
Handle response
|
122
129
|
|
@@ -161,7 +168,12 @@ class Image:
|
|
161
168
|
self.window.controller.chat.common.unlock_input() # unlock input
|
162
169
|
|
163
170
|
@Slot(object, list, str)
|
164
|
-
def handle_response_inline(
|
171
|
+
def handle_response_inline(
|
172
|
+
self,
|
173
|
+
ctx: CtxItem,
|
174
|
+
paths: List[str],
|
175
|
+
prompt: str
|
176
|
+
):
|
165
177
|
"""
|
166
178
|
Handle inline response
|
167
179
|
|
@@ -6,9 +6,11 @@
|
|
6
6
|
# GitHub: https://github.com/szczyglis-dev/py-gpt #
|
7
7
|
# MIT License #
|
8
8
|
# Created By : Marcin Szczygliński #
|
9
|
-
# Updated Date: 2024.
|
9
|
+
# Updated Date: 2024.12.14 08:00:00 #
|
10
10
|
# ================================================== #
|
11
11
|
|
12
|
+
from typing import Optional, Any, Dict
|
13
|
+
|
12
14
|
from pygpt_net.core.bridge import BridgeContext
|
13
15
|
from pygpt_net.core.bridge.context import MultimodalContext
|
14
16
|
from pygpt_net.core.events import Event, AppEvent, KernelEvent, RenderEvent
|
@@ -52,6 +54,7 @@ class Input:
|
|
52
54
|
"""
|
53
55
|
self.window.controller.agent.experts.unlock() # unlock experts
|
54
56
|
self.window.controller.agent.llama.reset_eval_step() # reset evaluation steps
|
57
|
+
self.window.controller.ui.tabs.switch_to_first_chat() # switch to first active chat tab
|
55
58
|
|
56
59
|
# get text from input
|
57
60
|
text = self.window.ui.nodes['input'].toPlainText().strip()
|
@@ -121,7 +124,7 @@ class Input:
|
|
121
124
|
def send(
|
122
125
|
self,
|
123
126
|
context: BridgeContext,
|
124
|
-
extra:
|
127
|
+
extra: Dict[str, Any],
|
125
128
|
):
|
126
129
|
"""
|
127
130
|
Send input wrapper
|
@@ -148,13 +151,13 @@ class Input:
|
|
148
151
|
|
149
152
|
def execute(
|
150
153
|
self,
|
151
|
-
text: str
|
154
|
+
text: str,
|
152
155
|
force: bool = False,
|
153
156
|
reply: bool = False,
|
154
157
|
internal: bool = False,
|
155
|
-
prev_ctx: CtxItem = None,
|
156
|
-
parent_id: int = None,
|
157
|
-
multimodal_ctx: MultimodalContext = None,
|
158
|
+
prev_ctx: Optional[CtxItem] = None,
|
159
|
+
parent_id: Optional[int] = None,
|
160
|
+
multimodal_ctx: Optional[MultimodalContext] = None,
|
158
161
|
):
|
159
162
|
"""
|
160
163
|
Execute send input text to API
|
@@ -265,7 +268,7 @@ class Input:
|
|
265
268
|
multimodal_ctx=multimodal_ctx,
|
266
269
|
) # text mode: OpenAI, Langchain, Llama, etc.
|
267
270
|
|
268
|
-
def log(self, data:
|
271
|
+
def log(self, data: Any):
|
269
272
|
"""
|
270
273
|
Log data to debug
|
271
274
|
|
@@ -6,9 +6,11 @@
|
|
6
6
|
# GitHub: https://github.com/szczyglis-dev/py-gpt #
|
7
7
|
# MIT License #
|
8
8
|
# Created By : Marcin Szczygliński #
|
9
|
-
# Updated Date: 2024.
|
9
|
+
# Updated Date: 2024.12.14 00:00:00 #
|
10
10
|
# ================================================== #
|
11
11
|
|
12
|
+
from typing import Any
|
13
|
+
|
12
14
|
from pygpt_net.core.types import (
|
13
15
|
MODE_AGENT,
|
14
16
|
MODE_ASSISTANT,
|
@@ -26,9 +28,17 @@ class Output:
|
|
26
28
|
:param window: Window instance
|
27
29
|
"""
|
28
30
|
self.window = window
|
29
|
-
self.not_stream_modes = [
|
31
|
+
self.not_stream_modes = [
|
32
|
+
MODE_ASSISTANT,
|
33
|
+
MODE_IMAGE,
|
34
|
+
]
|
30
35
|
|
31
|
-
def handle(
|
36
|
+
def handle(
|
37
|
+
self,
|
38
|
+
ctx: CtxItem,
|
39
|
+
mode: str,
|
40
|
+
stream_mode: bool = False
|
41
|
+
):
|
32
42
|
"""
|
33
43
|
Handle response from LLM
|
34
44
|
|
@@ -133,7 +143,8 @@ class Output:
|
|
133
143
|
mode: str,
|
134
144
|
stream: bool = False,
|
135
145
|
reply: bool = False,
|
136
|
-
internal: bool = False
|
146
|
+
internal: bool = False
|
147
|
+
):
|
137
148
|
"""
|
138
149
|
Post handle results
|
139
150
|
|
@@ -178,7 +189,11 @@ class Output:
|
|
178
189
|
self.log("Calling for prepare context name...")
|
179
190
|
self.window.controller.ctx.prepare_name(ctx) # async
|
180
191
|
|
181
|
-
def handle_end(
|
192
|
+
def handle_end(
|
193
|
+
self,
|
194
|
+
ctx: CtxItem,
|
195
|
+
mode: str
|
196
|
+
):
|
182
197
|
"""
|
183
198
|
Handle context end (finish output)
|
184
199
|
|
@@ -231,7 +246,7 @@ class Output:
|
|
231
246
|
event = RenderEvent(RenderEvent.RELOAD)
|
232
247
|
self.window.dispatch(event) # reload chat window
|
233
248
|
|
234
|
-
def log(self, data:
|
249
|
+
def log(self, data: Any):
|
235
250
|
"""
|
236
251
|
Log data to debug
|
237
252
|
|
@@ -6,9 +6,11 @@
|
|
6
6
|
# GitHub: https://github.com/szczyglis-dev/py-gpt #
|
7
7
|
# MIT License #
|
8
8
|
# Created By : Marcin Szczygliński #
|
9
|
-
# Updated Date: 2024.
|
9
|
+
# Updated Date: 2024.12.14 08:00:00 #
|
10
10
|
# ================================================== #
|
11
11
|
|
12
|
+
from typing import Optional, List
|
13
|
+
|
12
14
|
from PySide6.QtCore import Slot, QTimer
|
13
15
|
|
14
16
|
from pygpt_net.core.events import RenderEvent
|
@@ -16,6 +18,7 @@ from pygpt_net.core.render.base import BaseRenderer
|
|
16
18
|
from pygpt_net.core.render.markdown.renderer import Renderer as MarkdownRenderer
|
17
19
|
from pygpt_net.core.render.plain.renderer import Renderer as PlainTextRenderer
|
18
20
|
from pygpt_net.core.render.web.renderer import Renderer as WebRenderer
|
21
|
+
from pygpt_net.core.tabs.tab import Tab
|
19
22
|
from pygpt_net.core.text.utils import output_html2text, output_clean_html
|
20
23
|
from pygpt_net.item.ctx import CtxItem, CtxMeta
|
21
24
|
|
@@ -67,6 +70,7 @@ class Render:
|
|
67
70
|
append = data.get("append", False)
|
68
71
|
footer = data.get("footer", False)
|
69
72
|
initialized = data.get("initialized", False)
|
73
|
+
tab = data.get("tab")
|
70
74
|
|
71
75
|
if name == RenderEvent.BEGIN:
|
72
76
|
self.begin(meta, ctx, stream)
|
@@ -87,7 +91,7 @@ class Render:
|
|
87
91
|
self.stream_end(meta, ctx)
|
88
92
|
|
89
93
|
elif name == RenderEvent.ON_PAGE_LOAD:
|
90
|
-
self.on_page_loaded(meta)
|
94
|
+
self.on_page_loaded(meta, tab)
|
91
95
|
elif name ==RenderEvent.ON_THEME_CHANGE:
|
92
96
|
self.on_theme_change()
|
93
97
|
elif name == RenderEvent.ON_LOAD:
|
@@ -148,7 +152,12 @@ class Render:
|
|
148
152
|
"""
|
149
153
|
return self.instance().get_pid(meta)
|
150
154
|
|
151
|
-
def begin(
|
155
|
+
def begin(
|
156
|
+
self,
|
157
|
+
meta: CtxMeta,
|
158
|
+
ctx: CtxItem,
|
159
|
+
stream: bool = False
|
160
|
+
):
|
152
161
|
"""
|
153
162
|
Render begin
|
154
163
|
|
@@ -159,7 +168,12 @@ class Render:
|
|
159
168
|
self.instance().begin(meta, ctx, stream)
|
160
169
|
self.update()
|
161
170
|
|
162
|
-
def end(
|
171
|
+
def end(
|
172
|
+
self,
|
173
|
+
meta: CtxMeta,
|
174
|
+
ctx: CtxItem,
|
175
|
+
stream: bool = False
|
176
|
+
):
|
163
177
|
"""
|
164
178
|
Render end
|
165
179
|
|
@@ -170,7 +184,12 @@ class Render:
|
|
170
184
|
self.instance().end(meta, ctx, stream)
|
171
185
|
self.update()
|
172
186
|
|
173
|
-
def end_extra(
|
187
|
+
def end_extra(
|
188
|
+
self,
|
189
|
+
meta: CtxMeta,
|
190
|
+
ctx: CtxItem,
|
191
|
+
stream: bool = False
|
192
|
+
):
|
174
193
|
"""
|
175
194
|
Render end extra
|
176
195
|
|
@@ -181,7 +200,11 @@ class Render:
|
|
181
200
|
self.instance().end_extra(meta, ctx, stream)
|
182
201
|
self.update()
|
183
202
|
|
184
|
-
def stream_begin(
|
203
|
+
def stream_begin(
|
204
|
+
self,
|
205
|
+
meta: CtxMeta,
|
206
|
+
ctx: CtxItem
|
207
|
+
):
|
185
208
|
"""
|
186
209
|
Render stream begin
|
187
210
|
|
@@ -191,7 +214,11 @@ class Render:
|
|
191
214
|
self.instance().stream_begin(meta, ctx)
|
192
215
|
self.update()
|
193
216
|
|
194
|
-
def stream_end(
|
217
|
+
def stream_end(
|
218
|
+
self,
|
219
|
+
meta: CtxMeta,
|
220
|
+
ctx: CtxItem
|
221
|
+
):
|
195
222
|
"""
|
196
223
|
Render stream end
|
197
224
|
|
@@ -201,7 +228,10 @@ class Render:
|
|
201
228
|
self.instance().stream_end(meta, ctx)
|
202
229
|
self.update()
|
203
230
|
|
204
|
-
def clear_output(
|
231
|
+
def clear_output(
|
232
|
+
self,
|
233
|
+
meta: Optional[CtxMeta] = None
|
234
|
+
):
|
205
235
|
"""
|
206
236
|
Clear current active output
|
207
237
|
|
@@ -214,7 +244,10 @@ class Render:
|
|
214
244
|
"""Clear input"""
|
215
245
|
self.instance().clear_input()
|
216
246
|
|
217
|
-
def on_load(
|
247
|
+
def on_load(
|
248
|
+
self,
|
249
|
+
meta: Optional[CtxMeta] = None
|
250
|
+
):
|
218
251
|
"""
|
219
252
|
On load (meta)
|
220
253
|
|
@@ -224,7 +257,10 @@ class Render:
|
|
224
257
|
self.update()
|
225
258
|
self.window.controller.ui.tabs.update_tooltip(meta.name) # update tab tooltip
|
226
259
|
|
227
|
-
def reset(
|
260
|
+
def reset(
|
261
|
+
self,
|
262
|
+
meta: Optional[CtxMeta] = None
|
263
|
+
):
|
228
264
|
"""
|
229
265
|
Reset current meta
|
230
266
|
|
@@ -238,7 +274,12 @@ class Render:
|
|
238
274
|
self.instance().reload() # TODO: or all outputs?
|
239
275
|
self.update()
|
240
276
|
|
241
|
-
def append_context(
|
277
|
+
def append_context(
|
278
|
+
self,
|
279
|
+
meta: CtxMeta,
|
280
|
+
items: List[CtxItem],
|
281
|
+
clear: bool = True
|
282
|
+
):
|
242
283
|
"""
|
243
284
|
Append all context to output
|
244
285
|
|
@@ -249,7 +290,13 @@ class Render:
|
|
249
290
|
self.instance().append_context(meta, items, clear)
|
250
291
|
self.update()
|
251
292
|
|
252
|
-
def append_input(
|
293
|
+
def append_input(
|
294
|
+
self,
|
295
|
+
meta: CtxMeta,
|
296
|
+
ctx: CtxItem,
|
297
|
+
flush: bool = True,
|
298
|
+
append: bool = False
|
299
|
+
):
|
253
300
|
"""
|
254
301
|
Append text input to output
|
255
302
|
|
@@ -261,7 +308,11 @@ class Render:
|
|
261
308
|
self.instance().append_input(meta, ctx, flush=flush, append=append)
|
262
309
|
self.update()
|
263
310
|
|
264
|
-
def append_output(
|
311
|
+
def append_output(
|
312
|
+
self,
|
313
|
+
meta: CtxMeta,
|
314
|
+
ctx: CtxItem
|
315
|
+
):
|
265
316
|
"""
|
266
317
|
Append text output to output
|
267
318
|
|
@@ -271,7 +322,12 @@ class Render:
|
|
271
322
|
self.instance().append_output(meta, ctx)
|
272
323
|
self.update()
|
273
324
|
|
274
|
-
def append_extra(
|
325
|
+
def append_extra(
|
326
|
+
self,
|
327
|
+
meta: CtxMeta,
|
328
|
+
ctx: CtxItem,
|
329
|
+
footer: bool = False
|
330
|
+
):
|
275
331
|
"""
|
276
332
|
Append extra data (images, files, etc.) to output
|
277
333
|
|
@@ -282,7 +338,13 @@ class Render:
|
|
282
338
|
self.instance().append_extra(meta, ctx, footer)
|
283
339
|
self.update()
|
284
340
|
|
285
|
-
def append_chunk(
|
341
|
+
def append_chunk(
|
342
|
+
self,
|
343
|
+
meta: CtxMeta,
|
344
|
+
ctx: CtxItem,
|
345
|
+
text_chunk: str,
|
346
|
+
begin: bool = False
|
347
|
+
):
|
286
348
|
"""
|
287
349
|
Append output stream chunk to output
|
288
350
|
|
@@ -375,13 +437,18 @@ class Render:
|
|
375
437
|
self.instance().on_reply_submit(ctx)
|
376
438
|
self.update()
|
377
439
|
|
378
|
-
def on_page_loaded(
|
440
|
+
def on_page_loaded(
|
441
|
+
self,
|
442
|
+
meta: CtxMeta,
|
443
|
+
tab: Optional[Tab] = None
|
444
|
+
):
|
379
445
|
"""
|
380
446
|
On page loaded callback
|
381
447
|
|
382
448
|
:param meta: context meta
|
449
|
+
:param tab: Tab
|
383
450
|
"""
|
384
|
-
self.instance().on_page_loaded(meta)
|
451
|
+
self.instance().on_page_loaded(meta, tab)
|
385
452
|
self.update()
|
386
453
|
|
387
454
|
def on_theme_change(self):
|
@@ -428,7 +495,11 @@ class Render:
|
|
428
495
|
self.instance().clear_all()
|
429
496
|
self.update()
|
430
497
|
|
431
|
-
def tool_output_append(
|
498
|
+
def tool_output_append(
|
499
|
+
self,
|
500
|
+
meta: CtxMeta,
|
501
|
+
content: str
|
502
|
+
):
|
432
503
|
"""
|
433
504
|
Add tool output (append)
|
434
505
|
|
@@ -438,7 +509,11 @@ class Render:
|
|
438
509
|
self.instance().tool_output_append(meta, content)
|
439
510
|
self.update()
|
440
511
|
|
441
|
-
def tool_output_update(
|
512
|
+
def tool_output_update(
|
513
|
+
self,
|
514
|
+
meta: CtxMeta,
|
515
|
+
content: str
|
516
|
+
):
|
442
517
|
"""
|
443
518
|
Replace tool output
|
444
519
|
|
@@ -491,7 +566,7 @@ class Render:
|
|
491
566
|
if plain:
|
492
567
|
self.window.controller.theme.markdown.clear()
|
493
568
|
for pid in self.window.ui.nodes['output_plain']:
|
494
|
-
if self.window.ui.nodes['
|
569
|
+
if self.window.ui.nodes['output_plain'][pid] is not None:
|
495
570
|
self.window.ui.nodes['output'][pid].setVisible(False)
|
496
571
|
self.window.ui.nodes['output_plain'][pid].setVisible(True)
|
497
572
|
else:
|
@@ -518,7 +593,11 @@ class Render:
|
|
518
593
|
return self.markdown_renderer
|
519
594
|
|
520
595
|
@Slot(str, str)
|
521
|
-
def handle_save_as(
|
596
|
+
def handle_save_as(
|
597
|
+
self,
|
598
|
+
text: str,
|
599
|
+
type: str = 'txt'
|
600
|
+
):
|
522
601
|
"""
|
523
602
|
Handle save as signal # TODO: move to another class
|
524
603
|
|