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,14 +6,14 @@
|
|
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
13
|
import shutil
|
14
14
|
|
15
|
-
from datetime import datetime
|
16
15
|
from pathlib import PurePath
|
16
|
+
from typing import Tuple, Any, Union, List
|
17
17
|
from uuid import uuid4
|
18
18
|
|
19
19
|
from PySide6.QtCore import QUrl
|
@@ -38,18 +38,6 @@ class Filesystem:
|
|
38
38
|
self.types = Types(window)
|
39
39
|
self.url = Url(window)
|
40
40
|
self.workdir_placeholder = "%workdir%"
|
41
|
-
self.styles = [
|
42
|
-
"style.css",
|
43
|
-
"style.dark.css",
|
44
|
-
"style.light.css",
|
45
|
-
"markdown.css",
|
46
|
-
"markdown.dark.css",
|
47
|
-
"markdown.light.css",
|
48
|
-
"web.css",
|
49
|
-
"web.dark.css",
|
50
|
-
"web.light.css",
|
51
|
-
"fix_windows.css",
|
52
|
-
]
|
53
41
|
|
54
42
|
def install(self):
|
55
43
|
"""Install provider data"""
|
@@ -77,9 +65,9 @@ class Filesystem:
|
|
77
65
|
|
78
66
|
src_dir = os.path.join(self.window.core.config.get_app_path(), 'data', 'css')
|
79
67
|
dst_dir = os.path.join(self.window.core.config.path, 'css')
|
80
|
-
|
68
|
+
app_styles = os.listdir(src_dir)
|
81
69
|
try:
|
82
|
-
for style in
|
70
|
+
for style in app_styles:
|
83
71
|
src = os.path.join(src_dir, style)
|
84
72
|
dst = os.path.join(dst_dir, style)
|
85
73
|
if (not os.path.exists(dst) or force) and os.path.exists(src):
|
@@ -91,7 +79,8 @@ class Filesystem:
|
|
91
79
|
"""Backup user custom css styles"""
|
92
80
|
css_dir = os.path.join(self.window.core.config.path, 'css')
|
93
81
|
backup_file_extension = '.backup'
|
94
|
-
|
82
|
+
user_styles = os.listdir(css_dir)
|
83
|
+
for style in user_styles:
|
95
84
|
src = os.path.join(css_dir, style)
|
96
85
|
dst = os.path.join(css_dir, style + backup_file_extension)
|
97
86
|
if os.path.exists(src):
|
@@ -118,7 +107,7 @@ class Filesystem:
|
|
118
107
|
"""
|
119
108
|
return [self.make_local(path) for path in paths]
|
120
109
|
|
121
|
-
def make_local_list_img(self, paths:
|
110
|
+
def make_local_list_img(self, paths: List[str]) -> List[str]:
|
122
111
|
"""
|
123
112
|
Make local placeholder paths for images
|
124
113
|
|
@@ -132,7 +121,7 @@ class Filesystem:
|
|
132
121
|
result.append(self.make_local(path))
|
133
122
|
return result
|
134
123
|
|
135
|
-
def get_url(self, url) -> QUrl:
|
124
|
+
def get_url(self, url: str) -> QUrl:
|
136
125
|
"""
|
137
126
|
Make current OS-specific URL to open file or directory
|
138
127
|
|
@@ -146,7 +135,7 @@ class Filesystem:
|
|
146
135
|
else:
|
147
136
|
return QUrl.fromLocalFile(url)
|
148
137
|
|
149
|
-
def get_path(self, path) -> str:
|
138
|
+
def get_path(self, path: str) -> str:
|
150
139
|
"""
|
151
140
|
Prepare current OS-specific path from given path
|
152
141
|
|
@@ -155,10 +144,10 @@ class Filesystem:
|
|
155
144
|
"""
|
156
145
|
parts = PurePath(path).parts
|
157
146
|
if len(parts) > 1:
|
158
|
-
return os.path.join(*parts) # rebuild OS directory separators
|
147
|
+
return str(os.path.join(*parts)) # rebuild OS directory separators
|
159
148
|
return path
|
160
149
|
|
161
|
-
def to_workdir(self, path) -> str:
|
150
|
+
def to_workdir(self, path: str) -> str:
|
162
151
|
"""
|
163
152
|
Replace user path with current workdir
|
164
153
|
|
@@ -189,7 +178,7 @@ class Filesystem:
|
|
189
178
|
parts = path[dir_index:]
|
190
179
|
return os.path.join(work_dir, parts)
|
191
180
|
|
192
|
-
def extract_local_url(self, path) ->
|
181
|
+
def extract_local_url(self, path: str) -> Tuple[str, str]:
|
193
182
|
"""
|
194
183
|
Extract local url and path from url
|
195
184
|
|
@@ -250,7 +239,7 @@ class Filesystem:
|
|
250
239
|
shutil.copyfile(path, upload_path)
|
251
240
|
return upload_path
|
252
241
|
|
253
|
-
def remove_upload(self, path: str)
|
242
|
+
def remove_upload(self, path: str):
|
254
243
|
"""
|
255
244
|
Delete uploaded file
|
256
245
|
|
@@ -270,7 +259,7 @@ class Filesystem:
|
|
270
259
|
"""
|
271
260
|
return path.startswith('file://') or path.startswith('http://') or path.startswith('https://')
|
272
261
|
|
273
|
-
def sizeof_fmt(self, num, suffix='B'):
|
262
|
+
def sizeof_fmt(self, num: Any, suffix: str = 'B'):
|
274
263
|
"""
|
275
264
|
Convert numbers to human-readable unit formats.
|
276
265
|
|
@@ -286,7 +275,11 @@ class Filesystem:
|
|
286
275
|
num /= 1024.0
|
287
276
|
return "{:.1f} {}{}".format(num, 'Yi', suffix).replace('.', ',')
|
288
277
|
|
289
|
-
def get_directory_size(
|
278
|
+
def get_directory_size(
|
279
|
+
self,
|
280
|
+
directory: str,
|
281
|
+
human_readable: bool = True
|
282
|
+
) -> Union[str, int]:
|
290
283
|
"""
|
291
284
|
Calculate the total size of the given directory
|
292
285
|
|
@@ -308,7 +301,11 @@ class Filesystem:
|
|
308
301
|
return self.sizeof_fmt(total_size)
|
309
302
|
return total_size
|
310
303
|
|
311
|
-
def get_datadir_size(
|
304
|
+
def get_datadir_size(
|
305
|
+
self,
|
306
|
+
path: str,
|
307
|
+
human_readable: bool = True
|
308
|
+
) -> Union[str, int]:
|
312
309
|
"""
|
313
310
|
Calculate the total size of the given data directory
|
314
311
|
|
@@ -319,7 +316,11 @@ class Filesystem:
|
|
319
316
|
data_dir = os.path.join(path, 'data')
|
320
317
|
return self.get_directory_size(data_dir, human_readable)
|
321
318
|
|
322
|
-
def get_db_size(
|
319
|
+
def get_db_size(
|
320
|
+
self,
|
321
|
+
path: str,
|
322
|
+
human_readable: bool = True
|
323
|
+
) -> Union[str, int]:
|
323
324
|
"""
|
324
325
|
Calculate the total size of the given database
|
325
326
|
|
@@ -337,7 +338,11 @@ class Filesystem:
|
|
337
338
|
return self.sizeof_fmt(total_size)
|
338
339
|
return total_size
|
339
340
|
|
340
|
-
def get_free_disk_space(
|
341
|
+
def get_free_disk_space(
|
342
|
+
self,
|
343
|
+
directory: str,
|
344
|
+
human_readable: bool = True
|
345
|
+
) -> Union[str, int]:
|
341
346
|
"""
|
342
347
|
Check free disk space in the given directory
|
343
348
|
|
@@ -350,7 +355,13 @@ class Filesystem:
|
|
350
355
|
return self.sizeof_fmt(free)
|
351
356
|
return free
|
352
357
|
|
353
|
-
def copy_workdir(
|
358
|
+
def copy_workdir(
|
359
|
+
self,
|
360
|
+
path: str,
|
361
|
+
new_path: str,
|
362
|
+
copy_db: bool = True,
|
363
|
+
copy_datadir: bool = True
|
364
|
+
) -> bool:
|
354
365
|
"""
|
355
366
|
Copy working directory
|
356
367
|
|
@@ -389,7 +400,12 @@ class Filesystem:
|
|
389
400
|
os.remove(profile_file)
|
390
401
|
return True
|
391
402
|
|
392
|
-
def clear_workdir(
|
403
|
+
def clear_workdir(
|
404
|
+
self,
|
405
|
+
path: str,
|
406
|
+
remove_db: bool = True,
|
407
|
+
remove_datadir: bool = True
|
408
|
+
) -> bool:
|
393
409
|
"""
|
394
410
|
Clear working directory
|
395
411
|
|
@@ -437,7 +453,11 @@ class Filesystem:
|
|
437
453
|
"""
|
438
454
|
return len(os.listdir(path)) == 0
|
439
455
|
|
440
|
-
def get_files_from_dir(
|
456
|
+
def get_files_from_dir(
|
457
|
+
self,
|
458
|
+
path: str,
|
459
|
+
recursive: bool = True
|
460
|
+
) -> list:
|
441
461
|
"""
|
442
462
|
Get files from directory
|
443
463
|
|
@@ -457,5 +477,3 @@ class Filesystem:
|
|
457
477
|
else:
|
458
478
|
files = [os.path.join(path, f) for f in os.listdir(path) if os.path.isfile(os.path.join(path, f))]
|
459
479
|
return files
|
460
|
-
|
461
|
-
|
@@ -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
|
13
14
|
|
14
15
|
from PySide6.QtGui import QAction, QIcon
|
15
16
|
from PySide6.QtWidgets import QWidget
|
@@ -45,9 +46,10 @@ class Actions:
|
|
45
46
|
:param path: path to file
|
46
47
|
:return: True if file has preview
|
47
48
|
"""
|
48
|
-
return self.window.core.filesystem.types.is_image(path)
|
49
|
+
return (self.window.core.filesystem.types.is_image(path)
|
50
|
+
or self.window.core.filesystem.types.is_video(path))
|
49
51
|
|
50
|
-
def get_preview(self, parent: QWidget, path: str) ->
|
52
|
+
def get_preview(self, parent: QWidget, path: str) -> List[QAction]:
|
51
53
|
"""
|
52
54
|
Get preview actions for context menu
|
53
55
|
|
@@ -56,7 +58,8 @@ class Actions:
|
|
56
58
|
:return: list of context menu actions
|
57
59
|
"""
|
58
60
|
actions = []
|
59
|
-
if self.window.core.filesystem.types.is_video(path)
|
61
|
+
if (self.window.core.filesystem.types.is_video(path)
|
62
|
+
or self.window.core.filesystem.types.is_audio(path)):
|
60
63
|
action = QAction(
|
61
64
|
QIcon(":/icons/video.svg"),
|
62
65
|
trans('action.video.play'),
|
@@ -100,7 +103,7 @@ class Actions:
|
|
100
103
|
actions.append(action)
|
101
104
|
return actions
|
102
105
|
|
103
|
-
def get_use(self, parent: QWidget, path: str) ->
|
106
|
+
def get_use(self, parent: QWidget, path: str) -> List[QAction]:
|
104
107
|
"""
|
105
108
|
Get use actions for context menu
|
106
109
|
|
@@ -6,13 +6,15 @@
|
|
6
6
|
# GitHub: https://github.com/szczyglis-dev/py-gpt #
|
7
7
|
# MIT License #
|
8
8
|
# Created By : Marcin Szczygliński #
|
9
|
-
# Updated Date: 2024.
|
9
|
+
# Updated Date: 2024.12.14 08:00:00 #
|
10
10
|
# ================================================== #
|
11
11
|
|
12
12
|
import copy
|
13
13
|
import json
|
14
14
|
import os
|
15
15
|
|
16
|
+
from typing import Optional
|
17
|
+
|
16
18
|
|
17
19
|
class Editor:
|
18
20
|
def __init__(self, window=None):
|
@@ -63,7 +65,11 @@ class Editor:
|
|
63
65
|
"""
|
64
66
|
return self.window.ui.dialog[dialog_id].is_changed()
|
65
67
|
|
66
|
-
def load(
|
68
|
+
def load(
|
69
|
+
self,
|
70
|
+
dialog_id: str,
|
71
|
+
file: Optional[str] = None
|
72
|
+
):
|
67
73
|
"""
|
68
74
|
Load file to editor
|
69
75
|
|
@@ -87,7 +93,11 @@ class Editor:
|
|
87
93
|
self.window.core.debug.log(e)
|
88
94
|
self.window.update_status("Error loading file: {}".format(e))
|
89
95
|
|
90
|
-
def save(
|
96
|
+
def save(
|
97
|
+
self,
|
98
|
+
dialog_id: str,
|
99
|
+
path: Optional[str] = None
|
100
|
+
):
|
91
101
|
"""
|
92
102
|
Save file to disk
|
93
103
|
|
@@ -6,9 +6,12 @@
|
|
6
6
|
# GitHub: https://github.com/szczyglis-dev/py-gpt #
|
7
7
|
# MIT License #
|
8
8
|
# Created By : Marcin Szczygliński #
|
9
|
-
# Updated Date: 2024.
|
9
|
+
# Updated Date: 2024.12.14 08:00:00 #
|
10
10
|
# ================================================== #
|
11
11
|
|
12
|
+
from typing import List
|
13
|
+
|
14
|
+
|
12
15
|
class Types:
|
13
16
|
def __init__(self, window=None):
|
14
17
|
"""
|
@@ -45,7 +48,7 @@ class Types:
|
|
45
48
|
"""
|
46
49
|
return str(path).lower().endswith(tuple(self.get_audio_ext()))
|
47
50
|
|
48
|
-
def get_img_ext(self) ->
|
51
|
+
def get_img_ext(self) -> List[str]:
|
49
52
|
"""
|
50
53
|
Get image extensions
|
51
54
|
|
@@ -53,23 +56,25 @@ class Types:
|
|
53
56
|
"""
|
54
57
|
return ['.png', '.jpg', '.jpeg', '.gif', '.bmp', '.tiff', '.webp']
|
55
58
|
|
56
|
-
def get_video_ext(self) ->
|
59
|
+
def get_video_ext(self) -> List[str]:
|
57
60
|
"""
|
58
61
|
Get video extensions
|
59
62
|
|
60
63
|
:return: list with video extensions
|
61
64
|
"""
|
62
|
-
return ['.mp4', '.avi', '.mkv', '.webm', '.mov', '.flv', '.wmv',
|
65
|
+
return ['.mp4', '.avi', '.mkv', '.webm', '.mov', '.flv', '.wmv',
|
66
|
+
'.3gp', '.ogg', '.ogv', '.mpg', '.mpeg', '.m4v']
|
63
67
|
|
64
|
-
def get_audio_ext(self) ->
|
68
|
+
def get_audio_ext(self) -> List[str]:
|
65
69
|
"""
|
66
70
|
Get audio extensions
|
67
71
|
|
68
72
|
:return: list with audio extensions
|
69
73
|
"""
|
70
|
-
return ['.mp3', '.wav', '.flac', '.ogg', '.m4a', '.wma', '.aac',
|
74
|
+
return ['.mp3', '.wav', '.flac', '.ogg', '.m4a', '.wma', '.aac',
|
75
|
+
'.aiff', '.alac', '.dsd', '.pcm', '.mpc']
|
71
76
|
|
72
|
-
def get_excluded_extensions(self) ->
|
77
|
+
def get_excluded_extensions(self) -> List[str]:
|
73
78
|
"""
|
74
79
|
Get excluded extensions if no loader is available
|
75
80
|
|
pygpt_net/core/filesystem/url.py
CHANGED
@@ -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.09 03:00:00 #
|
10
10
|
# ================================================== #
|
11
11
|
|
12
12
|
from PySide6.QtCore import QUrl
|
@@ -38,14 +38,18 @@ class Url:
|
|
38
38
|
]
|
39
39
|
|
40
40
|
# JS bridge
|
41
|
-
if url.toString()
|
42
|
-
pid =
|
41
|
+
if url.toString().startswith('bridge://open_find'):
|
42
|
+
pid = int(url.toString().split(':')[2])
|
43
43
|
if pid in self.window.ui.nodes['output']:
|
44
44
|
self.window.ui.nodes['output'][pid].find_open()
|
45
45
|
return
|
46
46
|
elif url.toString() == 'bridge://escape':
|
47
47
|
self.window.controller.access.on_escape()
|
48
48
|
return
|
49
|
+
elif url.toString() == 'bridge://focus':
|
50
|
+
pid = self.window.controller.ui.tabs.get_current_pid()
|
51
|
+
if pid in self.window.ui.nodes['output']:
|
52
|
+
self.window.ui.nodes['output'][pid].on_focus_js()
|
49
53
|
|
50
54
|
# -------------
|
51
55
|
|
pygpt_net/core/history.py
CHANGED
@@ -6,11 +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 22:00:00 #
|
10
10
|
# ================================================== #
|
11
11
|
|
12
12
|
import datetime
|
13
13
|
import os
|
14
|
+
from typing import List
|
14
15
|
|
15
16
|
from pygpt_net.item.ctx import CtxItem
|
16
17
|
from pygpt_net.provider.core.history.txt_file import TxtFileProvider
|
@@ -46,7 +47,7 @@ class History:
|
|
46
47
|
# delete all txt history files from history dir
|
47
48
|
self.provider.truncate()
|
48
49
|
|
49
|
-
def remove_items(self, items:
|
50
|
+
def remove_items(self, items: List[CtxItem]):
|
50
51
|
"""
|
51
52
|
Remove items from history (txt files)
|
52
53
|
|
pygpt_net/core/idx/__init__.py
CHANGED
@@ -6,10 +6,12 @@
|
|
6
6
|
# GitHub: https://github.com/szczyglis-dev/py-gpt #
|
7
7
|
# MIT License #
|
8
8
|
# Created By : Marcin Szczygliński #
|
9
|
-
# Updated Date: 2024.
|
9
|
+
# Updated Date: 2024.12.14 22:00:00 #
|
10
10
|
# ================================================== #
|
11
11
|
|
12
12
|
import datetime
|
13
|
+
from typing import Optional, Tuple, List, Dict, Any
|
14
|
+
|
13
15
|
from packaging.version import Version
|
14
16
|
|
15
17
|
from pygpt_net.item.index import IndexItem
|
@@ -98,7 +100,11 @@ class Idx:
|
|
98
100
|
"""
|
99
101
|
self.storage.store(idx)
|
100
102
|
|
101
|
-
def remove_index(
|
103
|
+
def remove_index(
|
104
|
+
self,
|
105
|
+
idx: str = "base",
|
106
|
+
truncate: bool = False
|
107
|
+
) -> bool:
|
102
108
|
"""
|
103
109
|
Truncate index
|
104
110
|
|
@@ -125,10 +131,10 @@ class Idx:
|
|
125
131
|
def index_files(
|
126
132
|
self,
|
127
133
|
idx: str = "base",
|
128
|
-
path: str = None,
|
129
|
-
replace: bool = None,
|
130
|
-
recursive: bool = None,
|
131
|
-
) ->
|
134
|
+
path: Optional[str] = None,
|
135
|
+
replace: Optional[bool] = None,
|
136
|
+
recursive: Optional[bool] = None,
|
137
|
+
) -> Tuple[Dict, List[str]]:
|
132
138
|
"""
|
133
139
|
Index file or directory of files
|
134
140
|
|
@@ -165,7 +171,7 @@ class Idx:
|
|
165
171
|
idx: str = "base",
|
166
172
|
id: int = 0,
|
167
173
|
from_ts: int = 0
|
168
|
-
) ->
|
174
|
+
) -> Tuple[int, List[str]]:
|
169
175
|
"""
|
170
176
|
Index records from db by meta id
|
171
177
|
|
@@ -199,7 +205,7 @@ class Idx:
|
|
199
205
|
self,
|
200
206
|
idx: str = "base",
|
201
207
|
from_ts: int = 0
|
202
|
-
) ->
|
208
|
+
) -> Tuple[int, List[str]]:
|
203
209
|
"""
|
204
210
|
Index records from db by meta id
|
205
211
|
|
@@ -230,10 +236,10 @@ class Idx:
|
|
230
236
|
def index_urls(
|
231
237
|
self,
|
232
238
|
idx: str = "base",
|
233
|
-
urls:
|
239
|
+
urls: Optional[List[str]] = None,
|
234
240
|
type: str = "webpage",
|
235
|
-
extra_args:
|
236
|
-
) ->
|
241
|
+
extra_args: Optional[Dict[str, Any]] = None
|
242
|
+
) -> Tuple[int, List[str]]:
|
237
243
|
"""
|
238
244
|
Index URLs
|
239
245
|
|
@@ -269,10 +275,10 @@ class Idx:
|
|
269
275
|
self,
|
270
276
|
idx: str = "base",
|
271
277
|
type: str = "webpage",
|
272
|
-
params:
|
273
|
-
config:
|
274
|
-
replace: bool = None,
|
275
|
-
) ->
|
278
|
+
params: Optional[Dict[str, Any]] = None,
|
279
|
+
config: Optional[Dict[str, Any]] = None,
|
280
|
+
replace: Optional[bool] = None,
|
281
|
+
) -> Tuple[int, list]:
|
276
282
|
"""
|
277
283
|
Index URLs
|
278
284
|
|
@@ -310,7 +316,10 @@ class Idx:
|
|
310
316
|
self.log("Error: " + str(errors))
|
311
317
|
return n, errors
|
312
318
|
|
313
|
-
def get_idx_data(
|
319
|
+
def get_idx_data(
|
320
|
+
self,
|
321
|
+
idx: Optional[str] = None
|
322
|
+
) -> Dict[str, Dict]:
|
314
323
|
"""
|
315
324
|
Get indexed files data
|
316
325
|
|
@@ -329,7 +338,7 @@ class Idx:
|
|
329
338
|
indexes[idx] = self.items[store_id][idx].items
|
330
339
|
return indexes
|
331
340
|
|
332
|
-
def get_by_idx(self, idx: int) -> str:
|
341
|
+
def get_by_idx(self, idx: int) -> Optional[str]:
|
333
342
|
"""
|
334
343
|
Return idx by list index
|
335
344
|
|
@@ -341,7 +350,7 @@ class Idx:
|
|
341
350
|
if idx < len(items):
|
342
351
|
return items[idx]['id']
|
343
352
|
|
344
|
-
def get_idx_by_name(self, name: str) -> int:
|
353
|
+
def get_idx_by_name(self, name: str) -> Optional[int]:
|
345
354
|
"""
|
346
355
|
Return idx on list by name
|
347
356
|
|
@@ -354,7 +363,7 @@ class Idx:
|
|
354
363
|
if item['id'] == name:
|
355
364
|
return idx
|
356
365
|
|
357
|
-
def get_default_idx(self) -> str:
|
366
|
+
def get_default_idx(self) -> Optional[str]:
|
358
367
|
"""
|
359
368
|
Return default idx
|
360
369
|
|
@@ -375,7 +384,7 @@ class Idx:
|
|
375
384
|
return idx in self.items[store_id]
|
376
385
|
return False
|
377
386
|
|
378
|
-
def get(self, idx: str) -> IndexItem:
|
387
|
+
def get(self, idx: str) -> Optional[IndexItem]:
|
379
388
|
"""
|
380
389
|
Return index data from current storage
|
381
390
|
|
@@ -386,7 +395,7 @@ class Idx:
|
|
386
395
|
if store_id in self.items and idx in self.items[store_id]:
|
387
396
|
return self.items[store_id][idx]
|
388
397
|
|
389
|
-
def get_all(self) ->
|
398
|
+
def get_all(self) -> Dict[str, IndexItem]:
|
390
399
|
"""
|
391
400
|
Return all indexes in current store
|
392
401
|
|
@@ -397,12 +406,16 @@ class Idx:
|
|
397
406
|
return self.items[store_id]
|
398
407
|
return {}
|
399
408
|
|
400
|
-
def append(
|
409
|
+
def append(
|
410
|
+
self,
|
411
|
+
idx: str,
|
412
|
+
files: Dict[str, str]
|
413
|
+
):
|
401
414
|
"""
|
402
415
|
Append indexed files to index
|
403
416
|
|
404
417
|
:param idx: index name
|
405
|
-
:param files: dict of indexed files
|
418
|
+
:param files: dict of indexed files (path -> doc_id)
|
406
419
|
"""
|
407
420
|
# create store if not exists
|
408
421
|
store_id = self.get_current_store()
|
@@ -445,7 +458,11 @@ class Idx:
|
|
445
458
|
self.items[store_id][idx].items[file_id]["id"] = doc_id
|
446
459
|
self.items[store_id][idx].items[file_id]["indexed_ts"] = ts
|
447
460
|
|
448
|
-
def remove_doc(
|
461
|
+
def remove_doc(
|
462
|
+
self,
|
463
|
+
idx: str,
|
464
|
+
doc_id: str
|
465
|
+
):
|
449
466
|
"""
|
450
467
|
Remove document from index
|
451
468
|
|
@@ -456,7 +473,11 @@ class Idx:
|
|
456
473
|
if self.storage.remove_document(idx, doc_id):
|
457
474
|
self.log("Removed document from index: " + idx + " - " + doc_id)
|
458
475
|
|
459
|
-
def remove_file(
|
476
|
+
def remove_file(
|
477
|
+
self,
|
478
|
+
idx: str,
|
479
|
+
file: str
|
480
|
+
):
|
460
481
|
"""
|
461
482
|
Remove file from index
|
462
483
|
|
@@ -508,7 +529,7 @@ class Idx:
|
|
508
529
|
self.items[store_id][idx].id = idx
|
509
530
|
self.items[store_id][idx].name = idx
|
510
531
|
|
511
|
-
def get_idx_ids(self) ->
|
532
|
+
def get_idx_ids(self) -> List[str]:
|
512
533
|
"""
|
513
534
|
Get list of indexes
|
514
535
|
|
@@ -532,7 +553,7 @@ class Idx:
|
|
532
553
|
self.items[store_id][idx].items = {}
|
533
554
|
self.get_provider().truncate(store_id, idx)
|
534
555
|
|
535
|
-
def get_counters(self, type: str) ->
|
556
|
+
def get_counters(self, type: str) -> Dict[str, Dict[str, int]]:
|
536
557
|
"""
|
537
558
|
Get counters (stats, count items by type [file, ctx, external])
|
538
559
|
|