pygpt-net 2.7.2__py3-none-any.whl → 2.7.4__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (48) hide show
  1. pygpt_net/CHANGELOG.txt +12 -0
  2. pygpt_net/__init__.py +3 -3
  3. pygpt_net/app.py +382 -350
  4. pygpt_net/controller/chat/attachment.py +5 -1
  5. pygpt_net/controller/chat/image.py +40 -5
  6. pygpt_net/controller/files/files.py +3 -1
  7. pygpt_net/controller/layout/layout.py +2 -2
  8. pygpt_net/controller/media/media.py +70 -1
  9. pygpt_net/controller/theme/nodes.py +2 -1
  10. pygpt_net/controller/ui/mode.py +5 -1
  11. pygpt_net/controller/ui/ui.py +17 -2
  12. pygpt_net/core/filesystem/url.py +4 -1
  13. pygpt_net/core/render/web/helpers.py +5 -0
  14. pygpt_net/data/config/config.json +5 -4
  15. pygpt_net/data/config/models.json +3 -3
  16. pygpt_net/data/config/settings.json +0 -14
  17. pygpt_net/data/css/web-blocks.css +3 -0
  18. pygpt_net/data/css/web-chatgpt.css +3 -0
  19. pygpt_net/data/locale/locale.de.ini +6 -0
  20. pygpt_net/data/locale/locale.en.ini +7 -1
  21. pygpt_net/data/locale/locale.es.ini +6 -0
  22. pygpt_net/data/locale/locale.fr.ini +6 -0
  23. pygpt_net/data/locale/locale.it.ini +6 -0
  24. pygpt_net/data/locale/locale.pl.ini +7 -1
  25. pygpt_net/data/locale/locale.uk.ini +6 -0
  26. pygpt_net/data/locale/locale.zh.ini +6 -0
  27. pygpt_net/launcher.py +115 -55
  28. pygpt_net/preload.py +243 -0
  29. pygpt_net/provider/api/google/image.py +317 -10
  30. pygpt_net/provider/api/google/video.py +160 -4
  31. pygpt_net/provider/api/openai/image.py +201 -93
  32. pygpt_net/provider/api/openai/video.py +99 -24
  33. pygpt_net/provider/api/x_ai/image.py +25 -2
  34. pygpt_net/provider/core/config/patch.py +17 -1
  35. pygpt_net/ui/layout/chat/input.py +20 -2
  36. pygpt_net/ui/layout/chat/painter.py +6 -4
  37. pygpt_net/ui/layout/toolbox/image.py +21 -11
  38. pygpt_net/ui/layout/toolbox/raw.py +2 -2
  39. pygpt_net/ui/layout/toolbox/video.py +22 -9
  40. pygpt_net/ui/main.py +84 -3
  41. pygpt_net/ui/widget/dialog/base.py +3 -10
  42. pygpt_net/ui/widget/option/combo.py +119 -1
  43. pygpt_net/ui/widget/textarea/input_extra.py +664 -0
  44. {pygpt_net-2.7.2.dist-info → pygpt_net-2.7.4.dist-info}/METADATA +27 -20
  45. {pygpt_net-2.7.2.dist-info → pygpt_net-2.7.4.dist-info}/RECORD +48 -46
  46. {pygpt_net-2.7.2.dist-info → pygpt_net-2.7.4.dist-info}/LICENSE +0 -0
  47. {pygpt_net-2.7.2.dist-info → pygpt_net-2.7.4.dist-info}/WHEEL +0 -0
  48. {pygpt_net-2.7.2.dist-info → pygpt_net-2.7.4.dist-info}/entry_points.txt +0 -0
pygpt_net/app.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: 2025.09.28 09:00:00 #
9
+ # Updated Date: 2025.12.31 17:00:00 #
10
10
  # ================================================== #
11
11
 
12
12
  import os
@@ -19,7 +19,7 @@ import pygpt_net.icons_rc
19
19
  from pygpt_net.utils import set_env
20
20
 
21
21
  # app env
22
- set_env("PYGPT_APP_ENV", "prod", allow_overwrite=True) # dev | prod
22
+ set_env("PYGPT_APP_ENV", "prod", allow_overwrite=True) # dev | prod
23
23
  # IF dev, JS will be loaded from `data/js/app/*` [js_rc.py], not from `data/js/app.min.js`
24
24
  # recompile js_rc.py with: bin/resources.sh, minify to app.min.js with: bin/minify.sh
25
25
 
@@ -64,152 +64,11 @@ def open_wrapper(file, mode='r', *args, **kwargs):
64
64
  return io.StringIO("")
65
65
  return _original_open(file, mode, *args, **kwargs)
66
66
 
67
+
67
68
  builtins.open = open_wrapper
68
69
 
69
- from pygpt_net.launcher import Launcher
70
-
71
- # plugins
72
- from pygpt_net.plugin.voice_control import Plugin as VoiceControlPlugin
73
- from pygpt_net.plugin.audio_output import Plugin as AudioOutputPlugin
74
- from pygpt_net.plugin.audio_input import Plugin as AudioInputPlugin
75
- from pygpt_net.plugin.cmd_api import Plugin as CmdApiPlugin
76
- from pygpt_net.plugin.cmd_code_interpreter import Plugin as CmdCodeInterpreterPlugin
77
- from pygpt_net.plugin.cmd_custom import Plugin as CmdCustomCommandPlugin
78
- from pygpt_net.plugin.cmd_files import Plugin as CmdFilesPlugin
79
- from pygpt_net.plugin.cmd_history import Plugin as CtxHistoryPlugin
80
- from pygpt_net.plugin.cmd_mouse_control import Plugin as CmdMousePlugin
81
- from pygpt_net.plugin.cmd_serial import Plugin as CmdSerialPlugin
82
- from pygpt_net.plugin.cmd_system import Plugin as CmdSystemPlugin
83
- from pygpt_net.plugin.cmd_web import Plugin as CmdWebPlugin
84
- from pygpt_net.plugin.crontab import Plugin as CrontabPlugin
85
- from pygpt_net.plugin.extra_prompt import Plugin as ExtraPromptPlugin
86
- from pygpt_net.plugin.experts import Plugin as ExpertsPlugin
87
- from pygpt_net.plugin.idx_llama_index import Plugin as IdxLlamaIndexPlugin
88
- from pygpt_net.plugin.openai_dalle import Plugin as OpenAIDallePlugin
89
- from pygpt_net.plugin.openai_vision import Plugin as OpenAIVisionPlugin
90
- from pygpt_net.plugin.real_time import Plugin as RealTimePlugin
91
- from pygpt_net.plugin.agent import Plugin as AgentPlugin
92
- from pygpt_net.plugin.mailer import Plugin as MailerPlugin
93
- from pygpt_net.plugin.google import Plugin as GooglePlugin
94
- from pygpt_net.plugin.twitter import Plugin as TwitterPlugin
95
- from pygpt_net.plugin.facebook import Plugin as FacebookPlugin
96
- from pygpt_net.plugin.telegram import Plugin as TelegramPlugin
97
- from pygpt_net.plugin.slack import Plugin as SlackPlugin
98
- from pygpt_net.plugin.github import Plugin as GithubPlugin
99
- from pygpt_net.plugin.bitbucket import Plugin as BitbucketPlugin
100
- from pygpt_net.plugin.server import Plugin as ServerPlugin
101
- from pygpt_net.plugin.tuya import Plugin as TuyaPlugin
102
- from pygpt_net.plugin.wikipedia import Plugin as WikipediaPlugin
103
- from pygpt_net.plugin.mcp import Plugin as MCPPlugin
104
- from pygpt_net.plugin.wolfram import Plugin as WolframPlugin
105
- from pygpt_net.plugin.osm import Plugin as OSMPlugin
106
-
107
- # agents (Llama-index)
108
- from pygpt_net.provider.agents.llama_index.legacy.openai_assistant import OpenAIAssistantAgent
109
- from pygpt_net.provider.agents.llama_index.planner_workflow import PlannerAgent as PlannerWorkflowAgent
110
- from pygpt_net.provider.agents.llama_index.openai_workflow import OpenAIAgent as OpenAIWorkflowAgent
111
- from pygpt_net.provider.agents.llama_index.react_workflow import ReactWorkflowAgent
112
- from pygpt_net.provider.agents.llama_index.codeact_workflow import CodeActAgent
113
- from pygpt_net.provider.agents.llama_index.supervisor_workflow import SupervisorAgent as LlamaSupervisorAgent
114
- from pygpt_net.provider.agents.llama_index.flow_from_schema import Agent as LlamaCustomAgent # builder schema
115
-
116
- # agents (OpenAI-Agents)
117
- from pygpt_net.provider.agents.openai.agent import Agent as OpenAIAgentsBase
118
- from pygpt_net.provider.agents.openai.agent_with_experts import Agent as OpenAIAgentsExperts
119
- from pygpt_net.provider.agents.openai.agent_with_experts_feedback import Agent as OpenAIAgentsExpertsFeedback
120
- from pygpt_net.provider.agents.openai.agent_with_feedback import Agent as OpenAIAgentFeedback
121
- from pygpt_net.provider.agents.openai.bot_researcher import Agent as OpenAIAgentBotResearcher
122
- from pygpt_net.provider.agents.openai.agent_planner import Agent as OpenAIAgentPlanner
123
- from pygpt_net.provider.agents.openai.evolve import Agent as OpenAIAgentsEvolve
124
- from pygpt_net.provider.agents.openai.agent_b2b import Agent as OpenAIAgentsB2B
125
- from pygpt_net.provider.agents.openai.supervisor import Agent as OpenAIAgentSupervisor
126
- from pygpt_net.provider.agents.openai.flow_from_schema import Agent as OpenAICustomAgent # builder schema
127
-
128
-
129
- # LLM wrapper providers (langchain, llama-index, embeddings)
130
- from pygpt_net.provider.llms.anthropic import AnthropicLLM
131
- from pygpt_net.provider.llms.azure_openai import AzureOpenAILLM
132
- from pygpt_net.provider.llms.deepseek_api import DeepseekApiLLM
133
- from pygpt_net.provider.llms.google import GoogleLLM
134
- # from pygpt_net.provider.llms.hugging_face import HuggingFaceLLM
135
- from pygpt_net.provider.llms.hugging_face_api import HuggingFaceApiLLM
136
- from pygpt_net.provider.llms.hugging_face_router import HuggingFaceRouterLLM
137
- from pygpt_net.provider.llms.local import LocalLLM
138
- from pygpt_net.provider.llms.mistral import MistralAILLM
139
- from pygpt_net.provider.llms.ollama import OllamaLLM
140
- from pygpt_net.provider.llms.openai import OpenAILLM
141
- from pygpt_net.provider.llms.perplexity import PerplexityLLM
142
- from pygpt_net.provider.llms.x_ai import xAILLM
143
- from pygpt_net.provider.llms.open_router import OpenRouterLLM
144
-
145
- # vector store providers (llama-index)
146
- from pygpt_net.provider.vector_stores.chroma import ChromaProvider
147
- from pygpt_net.provider.vector_stores.elasticsearch import ElasticsearchProvider
148
- from pygpt_net.provider.vector_stores.pinecode import PinecodeProvider
149
- from pygpt_net.provider.vector_stores.qdrant import QdrantProvider
150
- from pygpt_net.provider.vector_stores.redis import RedisProvider
151
- from pygpt_net.provider.vector_stores.simple import SimpleProvider
152
-
153
- # data loader providers (llama-index)
154
- from pygpt_net.provider.loaders.file_csv import Loader as CsvLoader
155
- from pygpt_net.provider.loaders.file_docx import Loader as DocxLoader
156
- from pygpt_net.provider.loaders.file_epub import Loader as EpubLoader
157
- from pygpt_net.provider.loaders.file_excel import Loader as ExcelLoader
158
- from pygpt_net.provider.loaders.file_html import Loader as HtmlLoader
159
- from pygpt_net.provider.loaders.file_image_vision import Loader as ImageVisionLoader
160
- from pygpt_net.provider.loaders.file_ipynb import Loader as IPYNBLoader
161
- from pygpt_net.provider.loaders.file_json import Loader as JsonLoader
162
- from pygpt_net.provider.loaders.file_markdown import Loader as MarkdownLoader
163
- from pygpt_net.provider.loaders.file_pdf import Loader as PdfLoader
164
- from pygpt_net.provider.loaders.file_video_audio import Loader as VideoAudioLoader
165
- from pygpt_net.provider.loaders.file_xml import Loader as XmlLoader
166
- from pygpt_net.provider.loaders.web_bitbucket import Loader as BitbucketRepoLoader
167
- from pygpt_net.provider.loaders.web_chatgpt_retrieval import Loader as ChatGptRetrievalLoader
168
- from pygpt_net.provider.loaders.web_database import Loader as DatabaseLoader
169
- from pygpt_net.provider.loaders.web_github_issues import Loader as GithubIssuesLoader
170
- from pygpt_net.provider.loaders.web_github_repo import Loader as GithubRepoLoader
171
- from pygpt_net.provider.loaders.web_google_calendar import Loader as GoogleCalendarLoader
172
- from pygpt_net.provider.loaders.web_google_docs import Loader as GoogleDocsLoader
173
- from pygpt_net.provider.loaders.web_google_drive import Loader as GoogleDriveLoader
174
- from pygpt_net.provider.loaders.web_google_gmail import Loader as GoogleGmailLoader
175
- from pygpt_net.provider.loaders.web_google_keep import Loader as GoogleKeepLoader
176
- from pygpt_net.provider.loaders.web_google_sheets import Loader as GoogleSheetsLoader
177
- from pygpt_net.provider.loaders.web_microsoft_onedrive import Loader as MicrosoftOneDriveLoader
178
- from pygpt_net.provider.loaders.web_rss import Loader as RssLoader
179
- from pygpt_net.provider.loaders.web_sitemap import Loader as SitemapLoader
180
- from pygpt_net.provider.loaders.web_twitter import Loader as TwitterLoader
181
- from pygpt_net.provider.loaders.web_page import Loader as WebPageLoader
182
- from pygpt_net.provider.loaders.web_yt import Loader as YouTubeLoader
183
-
184
- # audio providers (input, output)
185
- from pygpt_net.provider.audio_input.openai_whisper import OpenAIWhisper
186
- from pygpt_net.provider.audio_input.openai_whisper_local import OpenAIWhisperLocal
187
- from pygpt_net.provider.audio_input.google_speech_recognition import GoogleSpeechRecognition
188
- from pygpt_net.provider.audio_input.google_cloud_speech_recognition import GoogleCloudSpeechRecognition
189
- from pygpt_net.provider.audio_input.google_genai import GoogleGenAIAudioInput
190
- from pygpt_net.provider.audio_input.bing_speech_recognition import BingSpeechRecognition
191
- from pygpt_net.provider.audio_output.openai_tts import OpenAITextToSpeech
192
- from pygpt_net.provider.audio_output.ms_azure_tts import MSAzureTextToSpeech
193
- from pygpt_net.provider.audio_output.google_tts import GoogleTextToSpeech
194
- from pygpt_net.provider.audio_output.google_genai_tts import GoogleGenAITextToSpeech
195
- from pygpt_net.provider.audio_output.eleven_labs import ElevenLabsTextToSpeech
196
-
197
- # web search engine providers
198
- from pygpt_net.provider.web.google_custom_search import GoogleCustomSearch
199
- from pygpt_net.provider.web.microsoft_bing import MicrosoftBingSearch
200
- from pygpt_net.provider.web.duckduck_search import DuckDuckGoSearch
201
-
202
- # tools
203
- from pygpt_net.tools.indexer import IndexerTool
204
- from pygpt_net.tools.audio_transcriber import AudioTranscriber as AudioTranscriberTool
205
- from pygpt_net.tools.code_interpreter import CodeInterpreter as CodeInterpreterTool
206
- from pygpt_net.tools.image_viewer import ImageViewer as ImageViewerTool
207
- from pygpt_net.tools.media_player import MediaPlayer as MediaPlayerTool
208
- from pygpt_net.tools.text_editor import TextEditor as TextEditorTool
209
- from pygpt_net.tools.html_canvas import HtmlCanvas as HtmlCanvasTool
210
- from pygpt_net.tools.translator import Translator as TranslatorTool
211
- from pygpt_net.tools.web_browser import WebBrowser as WebBrowserTool
212
- from pygpt_net.tools.agent_builder import AgentBuilder as AgentBuilderTool
70
+ # -------------------------------------------------- #
71
+
213
72
 
214
73
  def run(**kwargs):
215
74
  """
@@ -332,209 +191,382 @@ def run(**kwargs):
332
191
  )
333
192
 
334
193
  """
335
- # initialize app launcher
336
- launcher = Launcher()
337
- launcher.init()
338
-
339
- # register audio providers
340
- launcher.add_audio_input(OpenAIWhisper())
341
- launcher.add_audio_input(OpenAIWhisperLocal())
342
- launcher.add_audio_input(GoogleSpeechRecognition())
343
- launcher.add_audio_input(GoogleCloudSpeechRecognition())
344
- launcher.add_audio_input(GoogleGenAIAudioInput())
345
- launcher.add_audio_input(BingSpeechRecognition())
346
- launcher.add_audio_output(OpenAITextToSpeech())
347
- launcher.add_audio_output(MSAzureTextToSpeech())
348
- launcher.add_audio_output(GoogleTextToSpeech())
349
- launcher.add_audio_output(GoogleGenAITextToSpeech())
350
- launcher.add_audio_output(ElevenLabsTextToSpeech())
351
-
352
- # register custom audio providers
353
- providers = kwargs.get('audio_input', None)
354
- if isinstance(providers, list):
355
- for provider in providers:
356
- launcher.add_audio_input(provider)
357
-
358
- providers = kwargs.get('audio_output', None)
359
- if isinstance(providers, list):
360
- for provider in providers:
361
- launcher.add_audio_output(provider)
362
-
363
- # register web providers
364
- launcher.add_web(GoogleCustomSearch())
365
- launcher.add_web(MicrosoftBingSearch())
366
- launcher.add_web(DuckDuckGoSearch())
367
-
368
- # register custom web providers
369
- providers = kwargs.get('web', None)
370
- if isinstance(providers, list):
371
- for provider in providers:
372
- launcher.add_web(provider)
373
-
374
- # register base data loaders (llama-index)
375
- launcher.add_loader(CsvLoader())
376
- launcher.add_loader(DocxLoader())
377
- launcher.add_loader(EpubLoader())
378
- launcher.add_loader(ExcelLoader())
379
- launcher.add_loader(HtmlLoader())
380
- launcher.add_loader(ImageVisionLoader())
381
- launcher.add_loader(IPYNBLoader())
382
- launcher.add_loader(JsonLoader())
383
- launcher.add_loader(MarkdownLoader())
384
- launcher.add_loader(PdfLoader())
385
- launcher.add_loader(VideoAudioLoader())
386
- launcher.add_loader(XmlLoader())
387
- launcher.add_loader(RssLoader())
388
- launcher.add_loader(SitemapLoader())
389
- launcher.add_loader(BitbucketRepoLoader())
390
- launcher.add_loader(ChatGptRetrievalLoader())
391
- launcher.add_loader(DatabaseLoader())
392
- launcher.add_loader(GithubIssuesLoader())
393
- launcher.add_loader(GithubRepoLoader())
394
- launcher.add_loader(GoogleCalendarLoader())
395
- launcher.add_loader(GoogleDocsLoader())
396
- launcher.add_loader(GoogleDriveLoader())
397
- launcher.add_loader(GoogleGmailLoader())
398
- launcher.add_loader(GoogleKeepLoader())
399
- launcher.add_loader(GoogleSheetsLoader())
400
- launcher.add_loader(MicrosoftOneDriveLoader())
401
- launcher.add_loader(TwitterLoader())
402
- launcher.add_loader(WebPageLoader())
403
- launcher.add_loader(YouTubeLoader())
404
-
405
- # register custom data loaders (llama-index)
406
- loaders = kwargs.get('loaders', None)
407
- if isinstance(loaders, list):
408
- for loader in loaders:
409
- launcher.add_loader(loader)
410
-
411
- # register base plugins
412
- launcher.add_plugin(VoiceControlPlugin())
413
- launcher.add_plugin(AgentPlugin())
414
- launcher.add_plugin(RealTimePlugin())
415
- launcher.add_plugin(ExpertsPlugin())
416
- launcher.add_plugin(ExtraPromptPlugin())
417
- launcher.add_plugin(AudioInputPlugin())
418
- launcher.add_plugin(AudioOutputPlugin())
419
- launcher.add_plugin(CmdWebPlugin())
420
- launcher.add_plugin(CmdFilesPlugin())
421
- launcher.add_plugin(CmdCodeInterpreterPlugin())
422
- launcher.add_plugin(CmdSystemPlugin())
423
- launcher.add_plugin(CmdCustomCommandPlugin())
424
- launcher.add_plugin(CmdApiPlugin())
425
- launcher.add_plugin(CmdSerialPlugin())
426
- launcher.add_plugin(CmdMousePlugin())
427
- launcher.add_plugin(CtxHistoryPlugin())
428
- launcher.add_plugin(OpenAIDallePlugin())
429
- launcher.add_plugin(OpenAIVisionPlugin())
430
- launcher.add_plugin(IdxLlamaIndexPlugin())
431
- launcher.add_plugin(MailerPlugin())
432
- launcher.add_plugin(CrontabPlugin())
433
- launcher.add_plugin(GooglePlugin())
434
- launcher.add_plugin(TwitterPlugin())
435
- launcher.add_plugin(FacebookPlugin())
436
- launcher.add_plugin(TelegramPlugin())
437
- launcher.add_plugin(SlackPlugin())
438
- launcher.add_plugin(GithubPlugin())
439
- launcher.add_plugin(BitbucketPlugin())
440
- launcher.add_plugin(ServerPlugin())
441
- launcher.add_plugin(TuyaPlugin())
442
- launcher.add_plugin(WikipediaPlugin())
443
- launcher.add_plugin(MCPPlugin())
444
- launcher.add_plugin(WolframPlugin())
445
- launcher.add_plugin(OSMPlugin())
446
-
447
- # register custom plugins
448
- plugins = kwargs.get('plugins', None)
449
- if isinstance(plugins, list):
450
- for plugin in plugins:
451
- launcher.add_plugin(plugin)
452
-
453
- # register LLMs
454
- launcher.add_llm(OpenAILLM())
455
- launcher.add_llm(AzureOpenAILLM())
456
- launcher.add_llm(AnthropicLLM())
457
- launcher.add_llm(GoogleLLM())
458
- # launcher.add_llm(HuggingFaceLLM())
459
- launcher.add_llm(HuggingFaceApiLLM())
460
- launcher.add_llm(HuggingFaceRouterLLM())
461
- launcher.add_llm(LocalLLM())
462
- launcher.add_llm(MistralAILLM())
463
- launcher.add_llm(OllamaLLM())
464
- launcher.add_llm(DeepseekApiLLM())
465
- launcher.add_llm(PerplexityLLM())
466
- launcher.add_llm(xAILLM())
467
- launcher.add_llm(OpenRouterLLM())
468
-
469
- # register LLMs
470
- llms = kwargs.get('llms', None)
471
- if isinstance(llms, list):
472
- for llm in llms:
473
- launcher.add_llm(llm)
474
-
475
- # register base vector store providers (llama-index)
476
- launcher.add_vector_store(ChromaProvider())
477
- launcher.add_vector_store(ElasticsearchProvider())
478
- launcher.add_vector_store(PinecodeProvider())
479
- launcher.add_vector_store(QdrantProvider())
480
- launcher.add_vector_store(RedisProvider())
481
- launcher.add_vector_store(SimpleProvider())
482
-
483
- # register custom vector store providers (llama-index)
484
- vector_stores = kwargs.get('vector_stores', None)
485
- if isinstance(vector_stores, list):
486
- for store in vector_stores:
487
- launcher.add_vector_store(store)
488
-
489
- # register base agents
490
- # launcher.add_agent(OpenAIAgent()) # llama-index
491
- launcher.add_agent(OpenAIWorkflowAgent()) # llama-index
492
- launcher.add_agent(OpenAIAssistantAgent()) # llama-index
493
- # launcher.add_agent(PlannerAgent()) # llama-index
494
- launcher.add_agent(PlannerWorkflowAgent()) # llama-index
495
- # launcher.add_agent(ReactAgent()) # llama-index
496
- launcher.add_agent(ReactWorkflowAgent()) # llama-index
497
- launcher.add_agent(CodeActAgent()) # llama-index
498
- launcher.add_agent(LlamaSupervisorAgent()) # llama-index
499
- launcher.add_agent(LlamaCustomAgent()) # llama-index
500
- launcher.add_agent(OpenAIAgentsBase()) # openai-agents
501
- launcher.add_agent(OpenAIAgentsExperts()) # openai-agents
502
- launcher.add_agent(OpenAIAgentFeedback()) # openai-agents
503
- launcher.add_agent(OpenAIAgentPlanner()) # openai-agents
504
- launcher.add_agent(OpenAIAgentBotResearcher()) # openai-agents
505
- launcher.add_agent(OpenAIAgentsExpertsFeedback()) # openai-agents
506
- launcher.add_agent(OpenAIAgentsEvolve()) # openai-agents
507
- launcher.add_agent(OpenAIAgentsB2B()) # openai-agents
508
- launcher.add_agent(OpenAIAgentSupervisor()) # openai-agents
509
- launcher.add_agent(OpenAICustomAgent()) # openai-agents
510
-
511
- # register custom agents
512
- agents = kwargs.get('agents', None)
513
- if isinstance(agents, list):
514
- for agent in agents:
515
- launcher.add_agent(agent)
516
-
517
- # register base tools
518
- launcher.add_tool(IndexerTool())
519
- launcher.add_tool(MediaPlayerTool())
520
- launcher.add_tool(ImageViewerTool())
521
- launcher.add_tool(TextEditorTool())
522
- launcher.add_tool(AudioTranscriberTool())
523
- launcher.add_tool(CodeInterpreterTool())
524
- launcher.add_tool(HtmlCanvasTool())
525
- launcher.add_tool(TranslatorTool())
526
- launcher.add_tool(WebBrowserTool())
527
- launcher.add_tool(AgentBuilderTool())
528
-
529
- # register custom tools
530
- tools = kwargs.get('tools', None)
531
- if isinstance(tools, list):
532
- for tool in tools:
533
- launcher.add_tool(tool)
534
-
535
- # run the app
536
- launcher.run()
537
-
194
+ import multiprocessing as mp
195
+
196
+ mp.freeze_support() # required for PyInstaller
197
+
198
+ # Start lightweight splash in a separate process (no interference with the main Qt app)
199
+ from pygpt_net.__init__ import __version__
200
+ from pygpt_net.preload import _start_preloader
201
+ _preloader = _start_preloader(title="PyGPT", message=f"v{__version__}")
202
+
203
+ from pygpt_net.launcher import Launcher
204
+
205
+ try:
206
+ # initialize app launcher
207
+ launcher = Launcher()
208
+
209
+ # Attach preloader to the launcher so it can be closed when the main window is actually ready
210
+ if _preloader:
211
+ launcher.attach_preloader(_preloader)
212
+
213
+ # plugins
214
+ from pygpt_net.plugin.voice_control import Plugin as VoiceControlPlugin
215
+ from pygpt_net.plugin.audio_output import Plugin as AudioOutputPlugin
216
+ from pygpt_net.plugin.audio_input import Plugin as AudioInputPlugin
217
+ from pygpt_net.plugin.cmd_api import Plugin as CmdApiPlugin
218
+ from pygpt_net.plugin.cmd_code_interpreter import Plugin as CmdCodeInterpreterPlugin
219
+ from pygpt_net.plugin.cmd_custom import Plugin as CmdCustomCommandPlugin
220
+ from pygpt_net.plugin.cmd_files import Plugin as CmdFilesPlugin
221
+ from pygpt_net.plugin.cmd_history import Plugin as CtxHistoryPlugin
222
+ from pygpt_net.plugin.cmd_mouse_control import Plugin as CmdMousePlugin
223
+ from pygpt_net.plugin.cmd_serial import Plugin as CmdSerialPlugin
224
+ from pygpt_net.plugin.cmd_system import Plugin as CmdSystemPlugin
225
+ from pygpt_net.plugin.cmd_web import Plugin as CmdWebPlugin
226
+ from pygpt_net.plugin.crontab import Plugin as CrontabPlugin
227
+ from pygpt_net.plugin.extra_prompt import Plugin as ExtraPromptPlugin
228
+ from pygpt_net.plugin.experts import Plugin as ExpertsPlugin
229
+ from pygpt_net.plugin.idx_llama_index import Plugin as IdxLlamaIndexPlugin
230
+ from pygpt_net.plugin.openai_dalle import Plugin as OpenAIDallePlugin
231
+ from pygpt_net.plugin.openai_vision import Plugin as OpenAIVisionPlugin
232
+ from pygpt_net.plugin.real_time import Plugin as RealTimePlugin
233
+ from pygpt_net.plugin.agent import Plugin as AgentPlugin
234
+ from pygpt_net.plugin.mailer import Plugin as MailerPlugin
235
+ from pygpt_net.plugin.google import Plugin as GooglePlugin
236
+ from pygpt_net.plugin.twitter import Plugin as TwitterPlugin
237
+ from pygpt_net.plugin.facebook import Plugin as FacebookPlugin
238
+ from pygpt_net.plugin.telegram import Plugin as TelegramPlugin
239
+ from pygpt_net.plugin.slack import Plugin as SlackPlugin
240
+ from pygpt_net.plugin.github import Plugin as GithubPlugin
241
+ from pygpt_net.plugin.bitbucket import Plugin as BitbucketPlugin
242
+ from pygpt_net.plugin.server import Plugin as ServerPlugin
243
+ from pygpt_net.plugin.tuya import Plugin as TuyaPlugin
244
+ from pygpt_net.plugin.wikipedia import Plugin as WikipediaPlugin
245
+ from pygpt_net.plugin.mcp import Plugin as MCPPlugin
246
+ from pygpt_net.plugin.wolfram import Plugin as WolframPlugin
247
+ from pygpt_net.plugin.osm import Plugin as OSMPlugin
248
+
249
+ # agents (Llama-index)
250
+ from pygpt_net.provider.agents.llama_index.legacy.openai_assistant import OpenAIAssistantAgent
251
+ from pygpt_net.provider.agents.llama_index.planner_workflow import PlannerAgent as PlannerWorkflowAgent
252
+ from pygpt_net.provider.agents.llama_index.openai_workflow import OpenAIAgent as OpenAIWorkflowAgent
253
+ from pygpt_net.provider.agents.llama_index.react_workflow import ReactWorkflowAgent
254
+ from pygpt_net.provider.agents.llama_index.codeact_workflow import CodeActAgent
255
+ from pygpt_net.provider.agents.llama_index.supervisor_workflow import SupervisorAgent as LlamaSupervisorAgent
256
+ from pygpt_net.provider.agents.llama_index.flow_from_schema import Agent as LlamaCustomAgent # builder schema
257
+
258
+ # agents (OpenAI-Agents)
259
+ from pygpt_net.provider.agents.openai.agent import Agent as OpenAIAgentsBase
260
+ from pygpt_net.provider.agents.openai.agent_with_experts import Agent as OpenAIAgentsExperts
261
+ from pygpt_net.provider.agents.openai.agent_with_experts_feedback import Agent as OpenAIAgentsExpertsFeedback
262
+ from pygpt_net.provider.agents.openai.agent_with_feedback import Agent as OpenAIAgentFeedback
263
+ from pygpt_net.provider.agents.openai.bot_researcher import Agent as OpenAIAgentBotResearcher
264
+ from pygpt_net.provider.agents.openai.agent_planner import Agent as OpenAIAgentPlanner
265
+ from pygpt_net.provider.agents.openai.evolve import Agent as OpenAIAgentsEvolve
266
+ from pygpt_net.provider.agents.openai.agent_b2b import Agent as OpenAIAgentsB2B
267
+ from pygpt_net.provider.agents.openai.supervisor import Agent as OpenAIAgentSupervisor
268
+ from pygpt_net.provider.agents.openai.flow_from_schema import Agent as OpenAICustomAgent # builder schema
269
+
270
+ # LLM wrapper providers (langchain, llama-index, embeddings)
271
+ from pygpt_net.provider.llms.anthropic import AnthropicLLM
272
+ from pygpt_net.provider.llms.azure_openai import AzureOpenAILLM
273
+ from pygpt_net.provider.llms.deepseek_api import DeepseekApiLLM
274
+ from pygpt_net.provider.llms.google import GoogleLLM
275
+ # from pygpt_net.provider.llms.hugging_face import HuggingFaceLLM
276
+ from pygpt_net.provider.llms.hugging_face_api import HuggingFaceApiLLM
277
+ from pygpt_net.provider.llms.hugging_face_router import HuggingFaceRouterLLM
278
+ from pygpt_net.provider.llms.local import LocalLLM
279
+ from pygpt_net.provider.llms.mistral import MistralAILLM
280
+ from pygpt_net.provider.llms.ollama import OllamaLLM
281
+ from pygpt_net.provider.llms.openai import OpenAILLM
282
+ from pygpt_net.provider.llms.perplexity import PerplexityLLM
283
+ from pygpt_net.provider.llms.x_ai import xAILLM
284
+ from pygpt_net.provider.llms.open_router import OpenRouterLLM
285
+
286
+ # vector store providers (llama-index)
287
+ from pygpt_net.provider.vector_stores.chroma import ChromaProvider
288
+ from pygpt_net.provider.vector_stores.elasticsearch import ElasticsearchProvider
289
+ from pygpt_net.provider.vector_stores.pinecode import PinecodeProvider
290
+ from pygpt_net.provider.vector_stores.qdrant import QdrantProvider
291
+ from pygpt_net.provider.vector_stores.redis import RedisProvider
292
+ from pygpt_net.provider.vector_stores.simple import SimpleProvider
293
+
294
+ # data loader providers (llama-index)
295
+ from pygpt_net.provider.loaders.file_csv import Loader as CsvLoader
296
+ from pygpt_net.provider.loaders.file_docx import Loader as DocxLoader
297
+ from pygpt_net.provider.loaders.file_epub import Loader as EpubLoader
298
+ from pygpt_net.provider.loaders.file_excel import Loader as ExcelLoader
299
+ from pygpt_net.provider.loaders.file_html import Loader as HtmlLoader
300
+ from pygpt_net.provider.loaders.file_image_vision import Loader as ImageVisionLoader
301
+ from pygpt_net.provider.loaders.file_ipynb import Loader as IPYNBLoader
302
+ from pygpt_net.provider.loaders.file_json import Loader as JsonLoader
303
+ from pygpt_net.provider.loaders.file_markdown import Loader as MarkdownLoader
304
+ from pygpt_net.provider.loaders.file_pdf import Loader as PdfLoader
305
+ from pygpt_net.provider.loaders.file_video_audio import Loader as VideoAudioLoader
306
+ from pygpt_net.provider.loaders.file_xml import Loader as XmlLoader
307
+ from pygpt_net.provider.loaders.web_bitbucket import Loader as BitbucketRepoLoader
308
+ from pygpt_net.provider.loaders.web_chatgpt_retrieval import Loader as ChatGptRetrievalLoader
309
+ from pygpt_net.provider.loaders.web_database import Loader as DatabaseLoader
310
+ from pygpt_net.provider.loaders.web_github_issues import Loader as GithubIssuesLoader
311
+ from pygpt_net.provider.loaders.web_github_repo import Loader as GithubRepoLoader
312
+ from pygpt_net.provider.loaders.web_google_calendar import Loader as GoogleCalendarLoader
313
+ from pygpt_net.provider.loaders.web_google_docs import Loader as GoogleDocsLoader
314
+ from pygpt_net.provider.loaders.web_google_drive import Loader as GoogleDriveLoader
315
+ from pygpt_net.provider.loaders.web_google_gmail import Loader as GoogleGmailLoader
316
+ from pygpt_net.provider.loaders.web_google_keep import Loader as GoogleKeepLoader
317
+ from pygpt_net.provider.loaders.web_google_sheets import Loader as GoogleSheetsLoader
318
+ from pygpt_net.provider.loaders.web_microsoft_onedrive import Loader as MicrosoftOneDriveLoader
319
+ from pygpt_net.provider.loaders.web_rss import Loader as RssLoader
320
+ from pygpt_net.provider.loaders.web_sitemap import Loader as SitemapLoader
321
+ from pygpt_net.provider.loaders.web_twitter import Loader as TwitterLoader
322
+ from pygpt_net.provider.loaders.web_page import Loader as WebPageLoader
323
+ from pygpt_net.provider.loaders.web_yt import Loader as YouTubeLoader
324
+
325
+ # audio providers (input, output)
326
+ from pygpt_net.provider.audio_input.openai_whisper import OpenAIWhisper
327
+ from pygpt_net.provider.audio_input.openai_whisper_local import OpenAIWhisperLocal
328
+ from pygpt_net.provider.audio_input.google_speech_recognition import GoogleSpeechRecognition
329
+ from pygpt_net.provider.audio_input.google_cloud_speech_recognition import GoogleCloudSpeechRecognition
330
+ from pygpt_net.provider.audio_input.google_genai import GoogleGenAIAudioInput
331
+ from pygpt_net.provider.audio_input.bing_speech_recognition import BingSpeechRecognition
332
+ from pygpt_net.provider.audio_output.openai_tts import OpenAITextToSpeech
333
+ from pygpt_net.provider.audio_output.ms_azure_tts import MSAzureTextToSpeech
334
+ from pygpt_net.provider.audio_output.google_tts import GoogleTextToSpeech
335
+ from pygpt_net.provider.audio_output.google_genai_tts import GoogleGenAITextToSpeech
336
+ from pygpt_net.provider.audio_output.eleven_labs import ElevenLabsTextToSpeech
337
+
338
+ # web search engine providers
339
+ from pygpt_net.provider.web.google_custom_search import GoogleCustomSearch
340
+ from pygpt_net.provider.web.microsoft_bing import MicrosoftBingSearch
341
+ from pygpt_net.provider.web.duckduck_search import DuckDuckGoSearch
342
+
343
+ # tools
344
+ from pygpt_net.tools.indexer import IndexerTool
345
+ from pygpt_net.tools.audio_transcriber import AudioTranscriber as AudioTranscriberTool
346
+ from pygpt_net.tools.code_interpreter import CodeInterpreter as CodeInterpreterTool
347
+ from pygpt_net.tools.image_viewer import ImageViewer as ImageViewerTool
348
+ from pygpt_net.tools.media_player import MediaPlayer as MediaPlayerTool
349
+ from pygpt_net.tools.text_editor import TextEditor as TextEditorTool
350
+ from pygpt_net.tools.html_canvas import HtmlCanvas as HtmlCanvasTool
351
+ from pygpt_net.tools.translator import Translator as TranslatorTool
352
+ from pygpt_net.tools.web_browser import WebBrowser as WebBrowserTool
353
+ from pygpt_net.tools.agent_builder import AgentBuilder as AgentBuilderTool
354
+
355
+ launcher.init()
356
+
357
+ # register audio providers
358
+ launcher.add_audio_input(OpenAIWhisper())
359
+ launcher.add_audio_input(OpenAIWhisperLocal())
360
+ launcher.add_audio_input(GoogleSpeechRecognition())
361
+ launcher.add_audio_input(GoogleCloudSpeechRecognition())
362
+ launcher.add_audio_input(GoogleGenAIAudioInput())
363
+ launcher.add_audio_input(BingSpeechRecognition())
364
+ launcher.add_audio_output(OpenAITextToSpeech())
365
+ launcher.add_audio_output(MSAzureTextToSpeech())
366
+ launcher.add_audio_output(GoogleTextToSpeech())
367
+ launcher.add_audio_output(GoogleGenAITextToSpeech())
368
+ launcher.add_audio_output(ElevenLabsTextToSpeech())
369
+
370
+ # register custom audio providers
371
+ providers = kwargs.get('audio_input', None)
372
+ if isinstance(providers, list):
373
+ for provider in providers:
374
+ launcher.add_audio_input(provider)
375
+
376
+ providers = kwargs.get('audio_output', None)
377
+ if isinstance(providers, list):
378
+ for provider in providers:
379
+ launcher.add_audio_output(provider)
380
+
381
+ # register web providers
382
+ launcher.add_web(GoogleCustomSearch())
383
+ launcher.add_web(MicrosoftBingSearch())
384
+ launcher.add_web(DuckDuckGoSearch())
385
+
386
+ # register custom web providers
387
+ providers = kwargs.get('web', None)
388
+ if isinstance(providers, list):
389
+ for provider in providers:
390
+ launcher.add_web(provider)
391
+
392
+ # register base data loaders (llama-index)
393
+ launcher.add_loader(CsvLoader())
394
+ launcher.add_loader(DocxLoader())
395
+ launcher.add_loader(EpubLoader())
396
+ launcher.add_loader(ExcelLoader())
397
+ launcher.add_loader(HtmlLoader())
398
+ launcher.add_loader(ImageVisionLoader())
399
+ launcher.add_loader(IPYNBLoader())
400
+ launcher.add_loader(JsonLoader())
401
+ launcher.add_loader(MarkdownLoader())
402
+ launcher.add_loader(PdfLoader())
403
+ launcher.add_loader(VideoAudioLoader())
404
+ launcher.add_loader(XmlLoader())
405
+ launcher.add_loader(RssLoader())
406
+ launcher.add_loader(SitemapLoader())
407
+ launcher.add_loader(BitbucketRepoLoader())
408
+ launcher.add_loader(ChatGptRetrievalLoader())
409
+ launcher.add_loader(DatabaseLoader())
410
+ launcher.add_loader(GithubIssuesLoader())
411
+ launcher.add_loader(GithubRepoLoader())
412
+ launcher.add_loader(GoogleCalendarLoader())
413
+ launcher.add_loader(GoogleDocsLoader())
414
+ launcher.add_loader(GoogleDriveLoader())
415
+ launcher.add_loader(GoogleGmailLoader())
416
+ launcher.add_loader(GoogleKeepLoader())
417
+ launcher.add_loader(GoogleSheetsLoader())
418
+ launcher.add_loader(MicrosoftOneDriveLoader())
419
+ launcher.add_loader(TwitterLoader())
420
+ launcher.add_loader(WebPageLoader())
421
+ launcher.add_loader(YouTubeLoader())
422
+
423
+ # register custom data loaders (llama-index)
424
+ loaders = kwargs.get('loaders', None)
425
+ if isinstance(loaders, list):
426
+ for loader in loaders:
427
+ launcher.add_loader(loader)
428
+
429
+ # register base plugins
430
+ launcher.add_plugin(VoiceControlPlugin())
431
+ launcher.add_plugin(AgentPlugin())
432
+ launcher.add_plugin(RealTimePlugin())
433
+ launcher.add_plugin(ExpertsPlugin())
434
+ launcher.add_plugin(ExtraPromptPlugin())
435
+ launcher.add_plugin(AudioInputPlugin())
436
+ launcher.add_plugin(AudioOutputPlugin())
437
+ launcher.add_plugin(CmdWebPlugin())
438
+ launcher.add_plugin(CmdFilesPlugin())
439
+ launcher.add_plugin(CmdCodeInterpreterPlugin())
440
+ launcher.add_plugin(CmdSystemPlugin())
441
+ launcher.add_plugin(CmdCustomCommandPlugin())
442
+ launcher.add_plugin(CmdApiPlugin())
443
+ launcher.add_plugin(CmdSerialPlugin())
444
+ launcher.add_plugin(CmdMousePlugin())
445
+ launcher.add_plugin(CtxHistoryPlugin())
446
+ launcher.add_plugin(OpenAIDallePlugin())
447
+ launcher.add_plugin(OpenAIVisionPlugin())
448
+ launcher.add_plugin(IdxLlamaIndexPlugin())
449
+ launcher.add_plugin(MailerPlugin())
450
+ launcher.add_plugin(CrontabPlugin())
451
+ launcher.add_plugin(GooglePlugin())
452
+ launcher.add_plugin(TwitterPlugin())
453
+ launcher.add_plugin(FacebookPlugin())
454
+ launcher.add_plugin(TelegramPlugin())
455
+ launcher.add_plugin(SlackPlugin())
456
+ launcher.add_plugin(GithubPlugin())
457
+ launcher.add_plugin(BitbucketPlugin())
458
+ launcher.add_plugin(ServerPlugin())
459
+ launcher.add_plugin(TuyaPlugin())
460
+ launcher.add_plugin(WikipediaPlugin())
461
+ launcher.add_plugin(MCPPlugin())
462
+ launcher.add_plugin(WolframPlugin())
463
+ launcher.add_plugin(OSMPlugin())
464
+
465
+ # register custom plugins
466
+ plugins = kwargs.get('plugins', None)
467
+ if isinstance(plugins, list):
468
+ for plugin in plugins:
469
+ launcher.add_plugin(plugin)
470
+
471
+ # register LLMs
472
+ launcher.add_llm(OpenAILLM())
473
+ launcher.add_llm(AzureOpenAILLM())
474
+ launcher.add_llm(AnthropicLLM())
475
+ launcher.add_llm(GoogleLLM())
476
+ # launcher.add_llm(HuggingFaceLLM())
477
+ launcher.add_llm(HuggingFaceApiLLM())
478
+ launcher.add_llm(HuggingFaceRouterLLM())
479
+ launcher.add_llm(LocalLLM())
480
+ launcher.add_llm(MistralAILLM())
481
+ launcher.add_llm(OllamaLLM())
482
+ launcher.add_llm(DeepseekApiLLM())
483
+ launcher.add_llm(PerplexityLLM())
484
+ launcher.add_llm(xAILLM())
485
+ launcher.add_llm(OpenRouterLLM())
486
+
487
+ # register LLMs
488
+ llms = kwargs.get('llms', None)
489
+ if isinstance(llms, list):
490
+ for llm in llms:
491
+ launcher.add_llm(llm)
492
+
493
+ # register base vector store providers (llama-index)
494
+ launcher.add_vector_store(ChromaProvider())
495
+ launcher.add_vector_store(ElasticsearchProvider())
496
+ launcher.add_vector_store(PinecodeProvider())
497
+ launcher.add_vector_store(QdrantProvider())
498
+ launcher.add_vector_store(RedisProvider())
499
+ launcher.add_vector_store(SimpleProvider())
500
+
501
+ # register custom vector store providers (llama-index)
502
+ vector_stores = kwargs.get('vector_stores', None)
503
+ if isinstance(vector_stores, list):
504
+ for store in vector_stores:
505
+ launcher.add_vector_store(store)
506
+
507
+ # register base agents
508
+ # launcher.add_agent(OpenAIAgent()) # llama-index
509
+ launcher.add_agent(OpenAIWorkflowAgent()) # llama-index
510
+ launcher.add_agent(OpenAIAssistantAgent()) # llama-index
511
+ # launcher.add_agent(PlannerAgent()) # llama-index
512
+ launcher.add_agent(PlannerWorkflowAgent()) # llama-index
513
+ # launcher.add_agent(ReactAgent()) # llama-index
514
+ launcher.add_agent(ReactWorkflowAgent()) # llama-index
515
+ launcher.add_agent(CodeActAgent()) # llama-index
516
+ launcher.add_agent(LlamaSupervisorAgent()) # llama-index
517
+ launcher.add_agent(LlamaCustomAgent()) # llama-index
518
+ launcher.add_agent(OpenAIAgentsBase()) # openai-agents
519
+ launcher.add_agent(OpenAIAgentsExperts()) # openai-agents
520
+ launcher.add_agent(OpenAIAgentFeedback()) # openai-agents
521
+ launcher.add_agent(OpenAIAgentPlanner()) # openai-agents
522
+ launcher.add_agent(OpenAIAgentBotResearcher()) # openai-agents
523
+ launcher.add_agent(OpenAIAgentsExpertsFeedback()) # openai-agents
524
+ launcher.add_agent(OpenAIAgentsEvolve()) # openai-agents
525
+ launcher.add_agent(OpenAIAgentsB2B()) # openai-agents
526
+ launcher.add_agent(OpenAIAgentSupervisor()) # openai-agents
527
+ launcher.add_agent(OpenAICustomAgent()) # openai-agents
528
+
529
+ # register custom agents
530
+ agents = kwargs.get('agents', None)
531
+ if isinstance(agents, list):
532
+ for agent in agents:
533
+ launcher.add_agent(agent)
534
+
535
+ # register base tools
536
+ launcher.add_tool(IndexerTool())
537
+ launcher.add_tool(MediaPlayerTool())
538
+ launcher.add_tool(ImageViewerTool())
539
+ launcher.add_tool(TextEditorTool())
540
+ launcher.add_tool(AudioTranscriberTool())
541
+ launcher.add_tool(CodeInterpreterTool())
542
+ launcher.add_tool(HtmlCanvasTool())
543
+ launcher.add_tool(TranslatorTool())
544
+ launcher.add_tool(WebBrowserTool())
545
+ launcher.add_tool(AgentBuilderTool())
546
+
547
+ # register custom tools
548
+ tools = kwargs.get('tools', None)
549
+ if isinstance(tools, list):
550
+ for tool in tools:
551
+ launcher.add_tool(tool)
552
+
553
+ # run the app
554
+ launcher.run()
555
+
556
+ except Exception as e:
557
+ #import traceback
558
+ print("Fatal error during application startup:")
559
+ print(e)
560
+ #traceback.print_exc()
561
+
562
+ finally:
563
+ # Ensure splash is closed on normal exit or any startup failure
564
+ if _preloader:
565
+ try:
566
+ _preloader.close(wait=False)
567
+ except Exception:
568
+ pass
569
+
538
570
 
539
571
  if __name__ == '__main__':
540
- run()
572
+ run()