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
pygpt_net/core/modes.py
CHANGED
@@ -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 22:00:00 #
|
10
10
|
# ================================================== #
|
11
11
|
|
12
|
+
from typing import Dict, List
|
13
|
+
|
12
14
|
from pygpt_net.provider.core.mode.json_file import JsonFileProvider
|
13
15
|
from pygpt_net.core.types import (
|
14
16
|
MODE_AGENT,
|
@@ -51,7 +53,7 @@ class Modes:
|
|
51
53
|
]
|
52
54
|
self.items = {}
|
53
55
|
|
54
|
-
def get_by_idx(self, idx):
|
56
|
+
def get_by_idx(self, idx) -> str:
|
55
57
|
"""
|
56
58
|
Return mode by index
|
57
59
|
|
@@ -61,7 +63,7 @@ class Modes:
|
|
61
63
|
modes = self.get_all()
|
62
64
|
return list(modes.keys())[idx]
|
63
65
|
|
64
|
-
def get_idx_by_name(self, name):
|
66
|
+
def get_idx_by_name(self, name) -> int:
|
65
67
|
"""
|
66
68
|
Return mode index by name
|
67
69
|
|
@@ -71,7 +73,7 @@ class Modes:
|
|
71
73
|
modes = self.get_all()
|
72
74
|
return list(modes.keys()).index(name)
|
73
75
|
|
74
|
-
def get_all(self):
|
76
|
+
def get_all(self) -> Dict[str, List[str]]:
|
75
77
|
"""
|
76
78
|
Return modes
|
77
79
|
|
@@ -79,7 +81,7 @@ class Modes:
|
|
79
81
|
"""
|
80
82
|
return self.items
|
81
83
|
|
82
|
-
def get_default(self):
|
84
|
+
def get_default(self) -> str:
|
83
85
|
"""
|
84
86
|
Return default mode name
|
85
87
|
|
@@ -89,7 +91,7 @@ class Modes:
|
|
89
91
|
if self.items[id].default:
|
90
92
|
return id
|
91
93
|
|
92
|
-
def get_next(self, mode: str):
|
94
|
+
def get_next(self, mode: str) -> str:
|
93
95
|
"""
|
94
96
|
Return next mode
|
95
97
|
|
@@ -103,7 +105,7 @@ class Modes:
|
|
103
105
|
return keys[idx + 1]
|
104
106
|
return keys[0]
|
105
107
|
|
106
|
-
def get_prev(self, mode: str):
|
108
|
+
def get_prev(self, mode: str) -> str:
|
107
109
|
"""
|
108
110
|
Return previous mode
|
109
111
|
|
@@ -118,13 +120,9 @@ class Modes:
|
|
118
120
|
return keys[-1]
|
119
121
|
|
120
122
|
def load(self):
|
121
|
-
"""
|
122
|
-
Load modes
|
123
|
-
"""
|
123
|
+
"""Load modes"""
|
124
124
|
self.items = self.provider.load()
|
125
125
|
|
126
126
|
def save(self):
|
127
|
-
"""
|
128
|
-
Save modes
|
129
|
-
"""
|
127
|
+
"""Save modes"""
|
130
128
|
self.provider.save(self.items)
|
pygpt_net/core/notepad.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 uuid
|
14
|
+
from typing import Optional, Dict
|
14
15
|
|
15
16
|
from packaging.version import Version
|
16
17
|
|
@@ -49,7 +50,7 @@ class Notepad:
|
|
49
50
|
"""Reset provider data"""
|
50
51
|
self.items = {}
|
51
52
|
|
52
|
-
def get_by_id(self, idx: int) -> NotepadItem
|
53
|
+
def get_by_id(self, idx: int) -> Optional[NotepadItem]:
|
53
54
|
"""
|
54
55
|
Get notepad by idx
|
55
56
|
|
@@ -60,7 +61,7 @@ class Notepad:
|
|
60
61
|
return self.items[idx]
|
61
62
|
return None
|
62
63
|
|
63
|
-
def get_all(self) ->
|
64
|
+
def get_all(self) -> Dict[int, NotepadItem]:
|
64
65
|
"""
|
65
66
|
Get all notepads
|
66
67
|
|
@@ -136,8 +137,12 @@ class Notepad:
|
|
136
137
|
"""Save all notepads"""
|
137
138
|
self.provider.save_all(self.items)
|
138
139
|
|
139
|
-
def import_from_db(self) -> dict
|
140
|
-
"""
|
140
|
+
def import_from_db(self) -> Optional[Dict[int, dict]]:
|
141
|
+
"""
|
142
|
+
Import notepad tabs from database
|
143
|
+
|
144
|
+
:return: dict with tabs
|
145
|
+
"""
|
141
146
|
self.load_all()
|
142
147
|
items = self.get_all()
|
143
148
|
if len(items) == 0:
|
pygpt_net/core/plugins.py
CHANGED
@@ -6,13 +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 22:00:00 #
|
10
10
|
# ================================================== #
|
11
11
|
|
12
12
|
import copy
|
13
13
|
import configparser
|
14
14
|
import io
|
15
15
|
import os
|
16
|
+
from typing import Optional, Dict, List, Any
|
16
17
|
|
17
18
|
from pygpt_net.provider.core.plugin_preset.json_file import JsonFileProvider
|
18
19
|
from pygpt_net.plugin.base.plugin import BasePlugin
|
@@ -48,7 +49,7 @@ class Plugins:
|
|
48
49
|
"""
|
49
50
|
return id in self.plugins
|
50
51
|
|
51
|
-
def all(self) ->
|
52
|
+
def all(self) -> Dict[str, BasePlugin]:
|
52
53
|
"""
|
53
54
|
Get all plugins
|
54
55
|
|
@@ -56,7 +57,7 @@ class Plugins:
|
|
56
57
|
"""
|
57
58
|
return self.plugins
|
58
59
|
|
59
|
-
def get_ids(self) ->
|
60
|
+
def get_ids(self) -> List[str]:
|
60
61
|
"""
|
61
62
|
Get all plugins ids
|
62
63
|
|
@@ -64,7 +65,7 @@ class Plugins:
|
|
64
65
|
"""
|
65
66
|
return list(self.plugins.keys())
|
66
67
|
|
67
|
-
def get(self, id: str) -> BasePlugin
|
68
|
+
def get(self, id: str) -> Optional[BasePlugin]:
|
68
69
|
"""
|
69
70
|
Get plugin by id
|
70
71
|
|
@@ -75,7 +76,7 @@ class Plugins:
|
|
75
76
|
return self.plugins[id]
|
76
77
|
return None
|
77
78
|
|
78
|
-
def get_option(self, id: str, key: str) ->
|
79
|
+
def get_option(self, id: str, key: str) -> Any:
|
79
80
|
"""
|
80
81
|
Get plugin option
|
81
82
|
|
@@ -142,7 +143,7 @@ class Plugins:
|
|
142
143
|
if removed:
|
143
144
|
self.window.core.config.save()
|
144
145
|
|
145
|
-
def register_options(self, id: str, options: dict):
|
146
|
+
def register_options(self, id: str, options: Dict[str, dict]):
|
146
147
|
"""
|
147
148
|
Register plugin options
|
148
149
|
|
@@ -171,7 +172,7 @@ class Plugins:
|
|
171
172
|
|
172
173
|
def enable(self, id: str):
|
173
174
|
"""
|
174
|
-
Enable plugin
|
175
|
+
Enable plugin by ID
|
175
176
|
|
176
177
|
:param id: plugin id
|
177
178
|
"""
|
@@ -182,7 +183,7 @@ class Plugins:
|
|
182
183
|
|
183
184
|
def disable(self, id: str):
|
184
185
|
"""
|
185
|
-
Disable plugin
|
186
|
+
Disable plugin by ID
|
186
187
|
|
187
188
|
:param id: plugin id
|
188
189
|
"""
|
@@ -276,7 +277,7 @@ class Plugins:
|
|
276
277
|
tooltip = trans('plugin.description', domain=domain)
|
277
278
|
return tooltip
|
278
279
|
|
279
|
-
def dump_locale(self, plugin, path: str):
|
280
|
+
def dump_locale(self, plugin: BasePlugin, path: str):
|
280
281
|
"""
|
281
282
|
Dump locale
|
282
283
|
|
@@ -317,7 +318,7 @@ class Plugins:
|
|
317
318
|
"""
|
318
319
|
return id in self.presets
|
319
320
|
|
320
|
-
def get_preset(self, id: str) ->
|
321
|
+
def get_preset(self, id: str) -> Dict[str, Any]:
|
321
322
|
"""
|
322
323
|
Get preset by id
|
323
324
|
|
@@ -327,7 +328,7 @@ class Plugins:
|
|
327
328
|
if self.has_preset(id):
|
328
329
|
return self.presets[id]
|
329
330
|
|
330
|
-
def set_preset(self, id: str, preset:
|
331
|
+
def set_preset(self, id: str, preset: Dict[str, Any]):
|
331
332
|
"""
|
332
333
|
Set config value
|
333
334
|
|
@@ -336,7 +337,7 @@ class Plugins:
|
|
336
337
|
"""
|
337
338
|
self.presets[id] = preset
|
338
339
|
|
339
|
-
def replace_presets(self, presets:
|
340
|
+
def replace_presets(self, presets: Dict[str, Any]):
|
340
341
|
"""
|
341
342
|
Replace presets
|
342
343
|
|
@@ -348,7 +349,7 @@ class Plugins:
|
|
348
349
|
"""Load presets"""
|
349
350
|
self.presets = self.provider.load()
|
350
351
|
|
351
|
-
def get_presets(self) ->
|
352
|
+
def get_presets(self) -> Dict[str, Any]:
|
352
353
|
"""
|
353
354
|
Return all presets
|
354
355
|
|
@@ -356,7 +357,11 @@ class Plugins:
|
|
356
357
|
"""
|
357
358
|
return self.presets
|
358
359
|
|
359
|
-
def reset_options(
|
360
|
+
def reset_options(
|
361
|
+
self,
|
362
|
+
plugin_id: str,
|
363
|
+
keys: List[str]
|
364
|
+
):
|
360
365
|
"""
|
361
366
|
Reset plugin options
|
362
367
|
|
@@ -407,7 +412,11 @@ class Plugins:
|
|
407
412
|
self.save_presets()
|
408
413
|
print("[FIX] Removed invalid keys from plugin presets.")
|
409
414
|
|
410
|
-
def remove_preset_values(
|
415
|
+
def remove_preset_values(
|
416
|
+
self,
|
417
|
+
plugin_id: str,
|
418
|
+
key: str
|
419
|
+
):
|
411
420
|
"""
|
412
421
|
Update preset value
|
413
422
|
|
@@ -430,7 +439,12 @@ class Plugins:
|
|
430
439
|
if updated:
|
431
440
|
self.save_presets()
|
432
441
|
|
433
|
-
def update_preset_values(
|
442
|
+
def update_preset_values(
|
443
|
+
self,
|
444
|
+
plugin_id: str,
|
445
|
+
key: str,
|
446
|
+
value: Any
|
447
|
+
):
|
434
448
|
"""
|
435
449
|
Update preset value
|
436
450
|
|
@@ -470,9 +484,7 @@ class Plugins:
|
|
470
484
|
self.dump_locale(self.plugins[id], path)
|
471
485
|
|
472
486
|
def dump_locales(self):
|
473
|
-
"""
|
474
|
-
Dump all locales
|
475
|
-
"""
|
487
|
+
"""Dump all locales"""
|
476
488
|
langs = ['en', 'pl']
|
477
489
|
for id in self.plugins:
|
478
490
|
domain = 'plugin.' + id
|
pygpt_net/core/presets.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 copy
|
13
13
|
import uuid
|
14
|
+
from typing import Optional, Tuple, Dict
|
14
15
|
|
15
16
|
from packaging.version import Version
|
16
17
|
from pygpt_net.core.types import (
|
@@ -47,7 +48,11 @@ class Presets:
|
|
47
48
|
self.provider.install()
|
48
49
|
|
49
50
|
def patch(self, app_version: Version):
|
50
|
-
"""
|
51
|
+
"""
|
52
|
+
Patch provider data
|
53
|
+
|
54
|
+
:param app_version: app version
|
55
|
+
"""
|
51
56
|
self.provider.patch(app_version)
|
52
57
|
|
53
58
|
def build(self) -> PresetItem:
|
@@ -188,6 +193,7 @@ class Presets:
|
|
188
193
|
"""
|
189
194
|
if id in self.items:
|
190
195
|
self.items[id].enabled = True
|
196
|
+
|
191
197
|
def disable(self, id: str):
|
192
198
|
"""
|
193
199
|
Disable preset
|
@@ -197,7 +203,7 @@ class Presets:
|
|
197
203
|
if id in self.items:
|
198
204
|
self.items[id].enabled = False
|
199
205
|
|
200
|
-
def get_first_mode(self, id: str) -> str
|
206
|
+
def get_first_mode(self, id: str) -> Optional[str]:
|
201
207
|
"""
|
202
208
|
Return first mode for preset
|
203
209
|
|
@@ -253,7 +259,7 @@ class Presets:
|
|
253
259
|
presets = self.get_by_mode(mode)
|
254
260
|
return list(presets.keys())[idx]
|
255
261
|
|
256
|
-
def get_by_id(self, mode: str, id: str) -> PresetItem
|
262
|
+
def get_by_id(self, mode: str, id: str) -> Optional[PresetItem]:
|
257
263
|
"""
|
258
264
|
Return preset by id
|
259
265
|
|
@@ -266,7 +272,7 @@ class Presets:
|
|
266
272
|
return presets[id]
|
267
273
|
return None
|
268
274
|
|
269
|
-
def get_by_uuid(self, uuid: str) -> PresetItem
|
275
|
+
def get_by_uuid(self, uuid: str) -> Optional[PresetItem]:
|
270
276
|
"""
|
271
277
|
Return preset by UUID
|
272
278
|
|
@@ -278,7 +284,7 @@ class Presets:
|
|
278
284
|
return self.items[id]
|
279
285
|
return None
|
280
286
|
|
281
|
-
def get_by_mode(self, mode: str) ->
|
287
|
+
def get_by_mode(self, mode: str) -> Dict[str, PresetItem]:
|
282
288
|
"""
|
283
289
|
Return presets for mode
|
284
290
|
|
@@ -317,7 +323,7 @@ class Presets:
|
|
317
323
|
i += 1
|
318
324
|
return 0
|
319
325
|
|
320
|
-
def get_default(self, mode: str) -> str
|
326
|
+
def get_default(self, mode: str) -> Optional[str]:
|
321
327
|
"""
|
322
328
|
Return default preset for mode
|
323
329
|
|
@@ -329,7 +335,7 @@ class Presets:
|
|
329
335
|
return None
|
330
336
|
return list(presets.keys())[0]
|
331
337
|
|
332
|
-
def get_duplicate_name(self, id: str) ->
|
338
|
+
def get_duplicate_name(self, id: str) -> Tuple[str, str]:
|
333
339
|
"""
|
334
340
|
Prepare name for duplicated preset
|
335
341
|
|
@@ -361,7 +367,11 @@ class Presets:
|
|
361
367
|
self.sort_by_name()
|
362
368
|
return id
|
363
369
|
|
364
|
-
def remove(
|
370
|
+
def remove(
|
371
|
+
self,
|
372
|
+
id: str,
|
373
|
+
remove_file: bool = True
|
374
|
+
):
|
365
375
|
"""
|
366
376
|
Delete preset
|
367
377
|
|
@@ -376,9 +386,7 @@ class Presets:
|
|
376
386
|
# self.load_presets()
|
377
387
|
|
378
388
|
def sort_by_name(self):
|
379
|
-
"""
|
380
|
-
Sort presets by name
|
381
|
-
"""
|
389
|
+
"""Sort presets by name"""
|
382
390
|
self.items = dict(
|
383
391
|
sorted(
|
384
392
|
self.items.items(),
|
@@ -403,7 +411,7 @@ class Presets:
|
|
403
411
|
self.items[preset.filename] = preset
|
404
412
|
self.save(preset.filename)
|
405
413
|
|
406
|
-
def get_all(self) ->
|
414
|
+
def get_all(self) -> Dict[str, PresetItem]:
|
407
415
|
"""
|
408
416
|
Return all presets
|
409
417
|
|
@@ -423,8 +431,12 @@ class Presets:
|
|
423
431
|
self.items[id] = base[id]
|
424
432
|
self.save(id)
|
425
433
|
|
426
|
-
def load_base(self):
|
427
|
-
"""
|
434
|
+
def load_base(self) -> Dict[str, PresetItem]:
|
435
|
+
"""
|
436
|
+
Load base presets
|
437
|
+
|
438
|
+
:return: base presets
|
439
|
+
"""
|
428
440
|
return self.provider.load_base()
|
429
441
|
|
430
442
|
def load(self):
|
@@ -451,7 +463,11 @@ class Presets:
|
|
451
463
|
"""Save all presets"""
|
452
464
|
self.provider.save_all(self.items)
|
453
465
|
|
454
|
-
def add_expert(
|
466
|
+
def add_expert(
|
467
|
+
self,
|
468
|
+
agent_uuid: str,
|
469
|
+
expert_uuid: str
|
470
|
+
):
|
455
471
|
"""
|
456
472
|
Add expert to agent
|
457
473
|
|
@@ -465,7 +481,11 @@ class Presets:
|
|
465
481
|
agent.experts.append(expert_uuid)
|
466
482
|
self.save(agent.filename)
|
467
483
|
|
468
|
-
def remove_expert(
|
484
|
+
def remove_expert(
|
485
|
+
self,
|
486
|
+
agent_uuid: str,
|
487
|
+
expert_uuid: str
|
488
|
+
):
|
469
489
|
"""
|
470
490
|
Remove expert from agent
|
471
491
|
:param agent_uuid: agent uuid
|
pygpt_net/core/profile.py
CHANGED
@@ -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.14 22:00:00 #
|
10
10
|
# ================================================== #
|
11
11
|
|
12
12
|
import json
|
13
13
|
import os
|
14
14
|
from pathlib import Path
|
15
|
+
from typing import Optional, Dict
|
15
16
|
from uuid import uuid4
|
16
17
|
|
17
18
|
|
@@ -44,7 +45,7 @@ class Profile:
|
|
44
45
|
self.load()
|
45
46
|
self.update_path()
|
46
47
|
|
47
|
-
def set_base_workdir(self, workdir):
|
48
|
+
def set_base_workdir(self, workdir: str):
|
48
49
|
"""
|
49
50
|
Set base workdir
|
50
51
|
|
@@ -119,7 +120,11 @@ class Profile:
|
|
119
120
|
with open(f, 'w', encoding='utf-8') as f:
|
120
121
|
f.write(json_data)
|
121
122
|
|
122
|
-
def add(
|
123
|
+
def add(
|
124
|
+
self,
|
125
|
+
name: str,
|
126
|
+
workdir: str
|
127
|
+
) -> str:
|
123
128
|
"""
|
124
129
|
Add new profile
|
125
130
|
|
@@ -162,7 +167,12 @@ class Profile:
|
|
162
167
|
return True
|
163
168
|
return False
|
164
169
|
|
165
|
-
def update_profile(
|
170
|
+
def update_profile(
|
171
|
+
self,
|
172
|
+
uuid: str,
|
173
|
+
name: str,
|
174
|
+
workdir: str
|
175
|
+
) -> bool:
|
166
176
|
"""
|
167
177
|
Update profile
|
168
178
|
|
@@ -188,7 +198,7 @@ class Profile:
|
|
188
198
|
"""
|
189
199
|
return self.current
|
190
200
|
|
191
|
-
def get(self, uuid: str) -> dict
|
201
|
+
def get(self, uuid: str) -> Optional[dict]:
|
192
202
|
"""
|
193
203
|
Get profile by uuid
|
194
204
|
|
@@ -199,7 +209,7 @@ class Profile:
|
|
199
209
|
return self.profiles[uuid]
|
200
210
|
return None
|
201
211
|
|
202
|
-
def get_all(self) ->
|
212
|
+
def get_all(self) -> Dict[str, Dict]:
|
203
213
|
"""
|
204
214
|
Get all profiles
|
205
215
|
|
@@ -222,7 +232,11 @@ class Profile:
|
|
222
232
|
return tmp_dir
|
223
233
|
return self.base_workdir
|
224
234
|
|
225
|
-
def append(
|
235
|
+
def append(
|
236
|
+
self,
|
237
|
+
uuid: str,
|
238
|
+
profile: Dict
|
239
|
+
):
|
226
240
|
"""
|
227
241
|
Append profile
|
228
242
|
|
@@ -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
|
from pygpt_net.core.events import Event
|
@@ -41,6 +41,12 @@ class Prompt:
|
|
41
41
|
return ""
|
42
42
|
|
43
43
|
def build_final_system_prompt(self, prompt: str) -> str:
|
44
|
+
"""
|
45
|
+
Build final system prompt
|
46
|
+
|
47
|
+
:param prompt: prompt
|
48
|
+
:return: final system prompt
|
49
|
+
"""
|
44
50
|
# tmp dispatch event: system prompt
|
45
51
|
event = Event(Event.SYSTEM_PROMPT, {
|
46
52
|
'mode': self.window.core.config.get('mode'),
|
@@ -50,7 +56,8 @@ class Prompt:
|
|
50
56
|
self.window.dispatch(event)
|
51
57
|
prompt = event.data['value']
|
52
58
|
|
53
|
-
if self.window.core.config.get('cmd')
|
59
|
+
if (self.window.core.config.get('cmd')
|
60
|
+
or self.window.controller.plugins.is_type_enabled("cmd.inline")):
|
54
61
|
|
55
62
|
# abort if native func call enabled
|
56
63
|
if self.window.core.command.is_native_enabled():
|
@@ -88,7 +95,7 @@ class Prompt:
|
|
88
95
|
internal: bool,
|
89
96
|
is_expert: bool = False,
|
90
97
|
disable_native_tool_calls: bool = False,
|
91
|
-
):
|
98
|
+
) -> str:
|
92
99
|
"""
|
93
100
|
Prepare system prompt
|
94
101
|
|
pygpt_net/core/prompt/custom.py
CHANGED
@@ -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 00:00:00 #
|
10
10
|
# ================================================== #
|
11
11
|
|
12
12
|
import copy
|
13
|
+
from typing import Optional
|
13
14
|
|
14
15
|
from PySide6.QtGui import QAction, QIcon
|
15
16
|
from packaging.version import Version
|
@@ -70,7 +71,7 @@ class Custom:
|
|
70
71
|
"""
|
71
72
|
return list(self.items.keys())
|
72
73
|
|
73
|
-
def get_id_by_idx(self, idx: int) -> str
|
74
|
+
def get_id_by_idx(self, idx: int) -> Optional[str]:
|
74
75
|
"""
|
75
76
|
Get ID by index
|
76
77
|
|
@@ -83,7 +84,7 @@ class Custom:
|
|
83
84
|
return id
|
84
85
|
i += 1
|
85
86
|
|
86
|
-
def get_by_id(self, id: str) -> PromptItem
|
87
|
+
def get_by_id(self, id: str) -> Optional[PromptItem]:
|
87
88
|
"""
|
88
89
|
Return prompt by ID
|
89
90
|
|
@@ -93,7 +94,7 @@ class Custom:
|
|
93
94
|
if id in self.items:
|
94
95
|
return self.items[id]
|
95
96
|
|
96
|
-
def get_by_idx(self, idx: int) -> PromptItem
|
97
|
+
def get_by_idx(self, idx: int) -> Optional[PromptItem]:
|
97
98
|
"""
|
98
99
|
Return item by index
|
99
100
|
|
@@ -114,8 +115,8 @@ class Custom:
|
|
114
115
|
|
115
116
|
def new(
|
116
117
|
self,
|
117
|
-
name: str = None,
|
118
|
-
content: str = None,
|
118
|
+
name: Optional[str] = None,
|
119
|
+
content: Optional[str] = None,
|
119
120
|
auto_save: bool = True
|
120
121
|
) -> PromptItem:
|
121
122
|
"""
|
@@ -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 00:00:00 #
|
10
10
|
# ================================================== #
|
11
11
|
|
12
12
|
import os
|
13
13
|
import csv
|
14
|
+
from typing import Optional
|
14
15
|
|
15
16
|
from PySide6.QtGui import QAction
|
16
17
|
from pygpt_net.utils import trans
|
@@ -62,7 +63,12 @@ class Template:
|
|
62
63
|
self.prompts = dict(sorted(self.prompts.items(), key=lambda item: item[1]['name']))
|
63
64
|
|
64
65
|
def to_menu_options(self, menu, parent: str = "global"):
|
65
|
-
"""
|
66
|
+
"""
|
67
|
+
Convert prompts to menu options
|
68
|
+
|
69
|
+
:param menu: Menu
|
70
|
+
:param parent: Parent menu
|
71
|
+
"""
|
66
72
|
self.init()
|
67
73
|
menu.addSeparator()
|
68
74
|
submenu = menu.addMenu(trans("preset.prompt.paste_template"))
|
@@ -82,7 +88,7 @@ class Template:
|
|
82
88
|
action.setToolTip(value['prompt'])
|
83
89
|
letter_submenus[letter].addAction(action)
|
84
90
|
|
85
|
-
def get_by_id(self, id: int) -> dict
|
91
|
+
def get_by_id(self, id: int) -> Optional[dict]:
|
86
92
|
"""
|
87
93
|
Get prompt by id
|
88
94
|
|