@danhachuel/thunderbolt 0.3.47 → 0.3.48
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.
- package/MANUAL-INSTALACAO.md +7 -5
- package/README.md +3 -1
- package/app/main.py +77 -55
- package/package.json +1 -1
package/MANUAL-INSTALACAO.md
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
Este manual descreve a instalação local da UI Thunderbolt, baseada no MoneyPrinterTurbo, utilizando o pacote npm `@danhachuel/thunderbolt`. O fluxo recomendado instala automaticamente o ambiente Python, as dependências da aplicação, as dependências do MoneyPrinterTurbo, o Streamlit e o suporte FFmpeg através de `imageio-ffmpeg`.
|
|
4
4
|
|
|
5
|
-
> **Versão deste manual:** 0.3.
|
|
5
|
+
> **Versão deste manual:** 0.3.48
|
|
6
6
|
> **Pacote npm:** `@danhachuel/thunderbolt`
|
|
7
7
|
> **Porta padrão da UI:** `localhost:3030`
|
|
8
8
|
> **Repositório:** [github.com/DanHachuel/thunderbolt](https://github.com/DanHachuel/thunderbolt)
|
|
@@ -100,13 +100,13 @@ Execute:
|
|
|
100
100
|
Windows PowerShell ou MobaXterm:
|
|
101
101
|
|
|
102
102
|
```powershell
|
|
103
|
-
npx.cmd --yes --prefer-online @danhachuel/thunderbolt@0.3.
|
|
103
|
+
npx.cmd --yes --prefer-online @danhachuel/thunderbolt@0.3.48 install
|
|
104
104
|
```
|
|
105
105
|
|
|
106
106
|
Linux/macOS:
|
|
107
107
|
|
|
108
108
|
```bash
|
|
109
|
-
npx --yes --prefer-online @danhachuel/thunderbolt@0.3.
|
|
109
|
+
npx --yes --prefer-online @danhachuel/thunderbolt@0.3.48 install
|
|
110
110
|
```
|
|
111
111
|
|
|
112
112
|
A instalação normal é **segura para actualizações**: preserva `storage`, Blueprints, Brandings, configurações e artefactos do utilizador. Remove apenas `.venv`, o clone técnico do MoneyPrinterTurbo e dependências que serão recriadas. Uma pasta antiga sem dados do utilizador, como `C:\Users\<utilizador>\AppData\Local\hermes` da tentativa incompleta, pode ser removida; uma pasta antiga que contenha Blueprints, Brandings ou storage é preservada e apenas avisada no terminal. Feche processos Python, Node, Streamlit e MobaXterm que estejam a usar as pastas antes de executar.
|
|
@@ -114,7 +114,7 @@ A instalação normal é **segura para actualizações**: preserva `storage`, Bl
|
|
|
114
114
|
Se quiser apagar absolutamente tudo de forma intencional, use o comando destrutivo separado:
|
|
115
115
|
|
|
116
116
|
```powershell
|
|
117
|
-
npx.cmd --yes --prefer-online @danhachuel/thunderbolt@0.3.
|
|
117
|
+
npx.cmd --yes --prefer-online @danhachuel/thunderbolt@0.3.48 install --purge-data
|
|
118
118
|
```
|
|
119
119
|
|
|
120
120
|
O parâmetro `--purge-data` apaga Blueprints, Brandings, configurações, storage e artefactos locais. Não o use numa actualização normal.
|
|
@@ -365,6 +365,8 @@ O bloco **Limite LLM NVIDIA NIM** permite ligar **Activar limitador NVIDIA NIM
|
|
|
365
365
|
|
|
366
366
|
O expander **Imagem e Video** substitui o antigo bloco isolado da Nano Banana. Os cartões disponíveis são **Nano Banana**, **Pollinations.ai**, **Agnes AI**, **Hugging Face Inference API**, **Cloudflare Workers AI**, **InferencePort Proxy**, **阿里云 (Alibaba Cloud Model Studio)**, **KIE AI** e **FAL AI**. Em cada cartão, configure a API key/token, o modelo, a Base URL, o estado **Provider activo**, a participação no **Pool Imagem**, a participação no **Pool Vídeo** e a prioridade. **Image Size** e **Aspect Ratio** não aparecem nos cartões e não são editáveis: são defaults internos aplicados automaticamente no prompt da geração. O botão **Testar Chamada API** faz apenas uma verificação read-only; não inicia geração de imagem ou vídeo.
|
|
367
367
|
|
|
368
|
+
A área **Voz, TTS e música — Azure Speech, restantes serviços e Suno** está dividida em cartões independentes para **Azure Speech**, **ElevenLabs**, **SiliconFlow**, **MiniMax TTS**, **Chatterbox**, **Sonilo** e **Suno**. Cada cartão agrupa apenas as credenciais, parâmetros e diagnóstico do serviço correspondente. O Suno aparece num cartão próprio porque é uma integração de criação musical, enquanto os restantes providers são serviços de voz/TTS.
|
|
369
|
+
|
|
368
370
|
| Provider | Configuração mínima | Pool suportado |
|
|
369
371
|
|---|---|---|
|
|
370
372
|
| Nano Banana | API key e modelo Gemini; composição aplicada internamente | Imagem |
|
|
@@ -522,7 +524,7 @@ Ao abrir a página, o Thunderbolt não prepara dados públicos, não descarrega
|
|
|
522
524
|
|
|
523
525
|
Os parâmetros da UI são número de clusters entre 2 e 10, suporte mínimo entre 0,01 e 0,50, país, engagement, intervalo de datas e tags, todos dentro da área principal da aba. O núcleo normaliza os dados, calcula engagement, aplica filtros, faz transformação logarítmica e standardização, executa K-Means e calcula itemsets/regras com FP-Growth. Não são apresentados resultados até ao primeiro clique em **Analisar Nichos**; o mesmo botão aplica alterações posteriores aos filtros. Os resultados são DataFrames de clusters, itemsets frequentes, regras de associação e dados analisados; o gráfico de dispersão é criado nativamente com Plotly.
|
|
524
526
|
|
|
525
|
-
As dependências adicionais — `scikit-learn`, `mlxtend`, `plotly`, `seaborn`, `matplotlib` e `kagglehub` — são instaladas pelo procedimento normal de `npx`. Em instalações existentes, execute novamente `npx.cmd --yes --prefer-online @danhachuel/thunderbolt@0.3.
|
|
527
|
+
As dependências adicionais — `scikit-learn`, `mlxtend`, `plotly`, `seaborn`, `matplotlib` e `kagglehub` — são instaladas pelo procedimento normal de `npx`. Em instalações existentes, execute novamente `npx.cmd --yes --prefer-online @danhachuel/thunderbolt@0.3.48 install`; o instalador detecta e reutiliza o que já estiver válido.
|
|
526
528
|
|
|
527
529
|
### Niche Finder Apify
|
|
528
530
|
|
package/README.md
CHANGED
|
@@ -69,7 +69,7 @@ No topo da área principal da aplicação existe o menu nativo de idioma no padr
|
|
|
69
69
|
|
|
70
70
|
A UI suporta os temas **Dark** e **Light** através do menu nativo de três pontos do Streamlit, no local original do toolbar. Não existe um selector Theme adicional dentro da página. A configuração distribuída em `.streamlit/config.toml` disponibiliza as variantes nomeadas **Dark** e **Light**, e o menu nativo continua responsável por alternar entre os modos, seguindo o padrão do [MoneyPrinterTurbo](https://github.com/harry0703/MoneyPrinterTurbo). O CSS próprio do Thunderbolt usa cores semânticas, `currentColor` e `color-mix` para acompanhar o tema activo, sem alterar a posição nem a funcionalidade do toolbar, do botão Deploy e do menu principal.
|
|
71
71
|
|
|
72
|
-
## Navegação da UI 0.3.
|
|
72
|
+
## Navegação da UI 0.3.48
|
|
73
73
|
|
|
74
74
|
A barra lateral mantém os níveis principais, nesta ordem: **Início**, **Niche Finder**, **Pipeline**, **Pipeline TikTok**, **Automação**, **Edição**, **AI Influencers** e **Configurações**. **Pipeline Vídeos** é expansível e contém **Criação de Vídeos**, **Backlog Vídeos**, **Roteiros**, **Thumbnails** e **Upload**. **Pipeline Música** é expansível e contém **Criação de Músicas** e **Upload Música**. **Automação** também é expansível e contém **Automação Youtube**. **Edição** é expansível e contém **Limpador de Metadados**, **Cortes**, **Editor Python** e **Download Mídia**, nessa ordem. **AI Influencers** é expansível e contém **Personagens**, **Redes Sociais**, **Tutorial Meta** e **Tutorial Supabase**, nessa ordem. **Niche Finder** é expansível e contém **Niche Finder Kaggle** e **Niche Finder Apify**. **Configurações** é expansível e contém **Canais Youtube**, **Blueprints Youtube**, **MCP**, **Contas Google**, **Notificações**, **Logs** e **Configuração API**, nessa ordem. O Início reúne o dashboard e as filas do Pipeline, sem botões de acções rápidas.
|
|
75
75
|
|
|
@@ -85,6 +85,8 @@ Em **Configuração API > API Keys**, a subaba **Fontes de materiais** segue o p
|
|
|
85
85
|
|
|
86
86
|
A subaba **Serviços e modelos** mantém as credenciais de providers e serviços que não são fontes de materiais. A chave `gemini_image_api_key` da Nano Banana continua separada de `gemini_api_key` do LLM textual. `INNERTUBE_API_KEY` permanece exclusivamente em **Configurações > Contas Google**, no bloco de configuração global fora dos cartões, e não é duplicada em API Keys.
|
|
87
87
|
|
|
88
|
+
A área expansível **Voz, TTS e música — Azure Speech, restantes serviços e Suno** está organizada em cartões independentes para **Azure Speech**, **ElevenLabs**, **SiliconFlow**, **MiniMax TTS**, **Chatterbox**, **Sonilo** e **Suno**. Cada cartão contém apenas os campos do respectivo serviço e o seu próprio botão de diagnóstico; o Suno fica visualmente separado por ser um agente de criação musical, não um provider TTS.
|
|
89
|
+
|
|
88
90
|
Nos cartões de **LLM — providers e modelos**, o campo **Prioridade** define a ordem de tentativa do pool textual. O valor **1** é usado primeiro; em quota, timeout, erro de transporte ou falha transitória, o router tenta a prioridade **2**, depois **3** e assim sucessivamente. O checkbox antigo **LLM principal** deixou de existir. A chave interna de cartão activo continua apenas como espelho de compatibilidade para instalações antigas.
|
|
89
91
|
|
|
90
92
|
O expander **Imagem e Video** reúne cartões independentes para **Nano Banana**, **Pollinations.ai**, **Agnes AI**, **Hugging Face Inference API**, **Cloudflare Workers AI**, **InferencePort Proxy**, **阿里云 (Alibaba Cloud Model Studio)**, **KIE AI** e **FAL AI**. Cada cartão permite configurar API key/token quando necessário, modelo, Base URL, activar o provider, escolher participação no **Pool Imagem** e/ou **Pool Vídeo**, definir prioridade e executar **Testar Chamada API**. Os parâmetros técnicos de composição, como **Image Size** e **Aspect Ratio**, não são apresentados nem editáveis nos cartões: ficam como defaults internos e são acrescentados automaticamente ao prompt da geração de imagem e/ou vídeo. O InferencePort usa por defeito `http://localhost:8080/v1` e não exige chave; o Cloudflare requer Account ID; os restantes providers devem ser preenchidos de acordo com a conta e endpoint disponibilizados pelo serviço.
|
package/app/main.py
CHANGED
|
@@ -5336,76 +5336,98 @@ def render_settings():
|
|
|
5336
5336
|
render_media_provider_cards(settings, embedded=True)
|
|
5337
5337
|
|
|
5338
5338
|
with st.expander("Voz, TTS e música — Azure Speech, restantes serviços e Suno", expanded=False):
|
|
5339
|
-
|
|
5340
|
-
|
|
5339
|
+
st.caption("Cada serviço está separado no seu próprio cartão. Os botões de teste ficam dentro do cartão correspondente e fazem apenas diagnóstico, sem gerar áudio ou música.")
|
|
5340
|
+
|
|
5341
|
+
with st.container(border=True):
|
|
5342
|
+
st.markdown("#### Azure Speech")
|
|
5343
|
+
st.caption("TTS da Microsoft Azure para narração e catálogo de vozes.")
|
|
5341
5344
|
azure_speech_key = text_setting("Azure Speech key", "azure_speech_key", secret=True)
|
|
5342
5345
|
_render_credential_status(azure_speech_key)
|
|
5343
5346
|
azure_speech_region = text_setting("Azure Speech region", "azure_speech_region")
|
|
5344
|
-
siliconflow_tts_api_key = text_setting("SiliconFlow TTS API key", "siliconflow_tts_api_key", secret=True)
|
|
5345
|
-
_render_credential_status(siliconflow_tts_api_key)
|
|
5346
|
-
minimax_tts_api_key = text_setting("MiniMax TTS API key", "minimax_tts_api_key", secret=True)
|
|
5347
|
-
_render_credential_status(minimax_tts_api_key)
|
|
5348
|
-
minimax_tts_base_url = text_setting("MiniMax TTS Base URL", "minimax_tts_base_url")
|
|
5349
|
-
minimax_tts_model_id = text_setting("MiniMax TTS model", "minimax_tts_model_id")
|
|
5350
|
-
minimax_tts_voice_id = text_setting("MiniMax TTS voice ID", "minimax_tts_voice_id")
|
|
5351
|
-
with cols[1]:
|
|
5352
|
-
elevenlabs_api_key = text_setting("ElevenLabs API key", "elevenlabs_api_key", secret=True)
|
|
5353
|
-
_render_credential_status(elevenlabs_api_key)
|
|
5354
|
-
elevenlabs_model_id = text_setting("ElevenLabs model", "elevenlabs_model_id")
|
|
5355
|
-
chatterbox_base_url = text_setting("Chatterbox Base URL", "chatterbox_base_url")
|
|
5356
|
-
chatterbox_api_key = text_setting("Chatterbox API key", "chatterbox_api_key", secret=True)
|
|
5357
|
-
_render_credential_status(chatterbox_api_key, local=True, required=False)
|
|
5358
|
-
chatterbox_model_id = text_setting("Chatterbox model", "chatterbox_model_id")
|
|
5359
|
-
sonilo_api_key = text_setting("Sonilo API key", "sonilo_api_key", secret=True)
|
|
5360
|
-
_render_credential_status(sonilo_api_key)
|
|
5361
|
-
sonilo_base_url = text_setting("Sonilo Base URL", "sonilo_base_url")
|
|
5362
|
-
st.markdown("**Suno — agente musical opcional**")
|
|
5363
|
-
suno_api_key = text_setting("Suno API key", "suno_api_key", secret=True)
|
|
5364
|
-
_render_credential_status(suno_api_key)
|
|
5365
|
-
suno_api_base_url = text_setting("Suno API Base URL", "suno_api_base_url", help_text="Use o endpoint compatível fornecido pelo seu acesso Suno; não é inventado pelo Thunderbolt.")
|
|
5366
|
-
suno_api_endpoint = text_setting("Suno API endpoint", "suno_api_endpoint", help_text="Ex.: /api/generate")
|
|
5367
|
-
|
|
5368
|
-
st.markdown(f"**{ui_text('Testar credenciais TTS e música', current_ui_language())}**")
|
|
5369
|
-
voice_test_cols = st.columns(3)
|
|
5370
|
-
with voice_test_cols[0]:
|
|
5371
5347
|
_render_api_test_control(
|
|
5372
5348
|
settings,
|
|
5373
5349
|
"voice:azure_speech",
|
|
5374
5350
|
lambda: test_voice_provider("azure_speech", {"azure_speech_key": azure_speech_key, "azure_speech_region": azure_speech_region}),
|
|
5375
5351
|
widget_key="api_test_voice_azure",
|
|
5376
5352
|
)
|
|
5377
|
-
|
|
5378
|
-
|
|
5379
|
-
|
|
5380
|
-
|
|
5381
|
-
|
|
5382
|
-
)
|
|
5383
|
-
|
|
5384
|
-
settings,
|
|
5385
|
-
"voice:minimax",
|
|
5386
|
-
lambda: test_voice_provider("minimax", {"minimax_tts_api_key": minimax_tts_api_key, "minimax_tts_base_url": minimax_tts_base_url}),
|
|
5387
|
-
widget_key="api_test_voice_minimax",
|
|
5388
|
-
)
|
|
5389
|
-
with voice_test_cols[1]:
|
|
5353
|
+
|
|
5354
|
+
with st.container(border=True):
|
|
5355
|
+
st.markdown("#### ElevenLabs")
|
|
5356
|
+
st.caption("TTS ElevenLabs para vozes multilíngues.")
|
|
5357
|
+
elevenlabs_api_key = text_setting("ElevenLabs API key", "elevenlabs_api_key", secret=True)
|
|
5358
|
+
_render_credential_status(elevenlabs_api_key)
|
|
5359
|
+
elevenlabs_model_id = text_setting("ElevenLabs model", "elevenlabs_model_id")
|
|
5390
5360
|
_render_api_test_control(
|
|
5391
5361
|
settings,
|
|
5392
5362
|
"voice:elevenlabs",
|
|
5393
5363
|
lambda: test_voice_provider("elevenlabs", {"elevenlabs_api_key": elevenlabs_api_key}),
|
|
5394
5364
|
widget_key="api_test_voice_elevenlabs",
|
|
5395
5365
|
)
|
|
5396
|
-
|
|
5397
|
-
|
|
5398
|
-
|
|
5399
|
-
|
|
5400
|
-
|
|
5401
|
-
|
|
5402
|
-
|
|
5403
|
-
|
|
5404
|
-
|
|
5405
|
-
|
|
5406
|
-
|
|
5407
|
-
|
|
5408
|
-
|
|
5366
|
+
|
|
5367
|
+
tts_cols = st.columns(2)
|
|
5368
|
+
with tts_cols[0]:
|
|
5369
|
+
with st.container(border=True):
|
|
5370
|
+
st.markdown("#### SiliconFlow")
|
|
5371
|
+
st.caption("Provider TTS SiliconFlow.")
|
|
5372
|
+
siliconflow_tts_api_key = text_setting("SiliconFlow TTS API key", "siliconflow_tts_api_key", secret=True)
|
|
5373
|
+
_render_credential_status(siliconflow_tts_api_key)
|
|
5374
|
+
_render_api_test_control(
|
|
5375
|
+
settings,
|
|
5376
|
+
"voice:siliconflow",
|
|
5377
|
+
lambda: test_voice_provider("siliconflow", {"siliconflow_tts_api_key": siliconflow_tts_api_key}),
|
|
5378
|
+
widget_key="api_test_voice_siliconflow",
|
|
5379
|
+
)
|
|
5380
|
+
|
|
5381
|
+
with st.container(border=True):
|
|
5382
|
+
st.markdown("#### MiniMax TTS")
|
|
5383
|
+
st.caption("Provider MiniMax com endpoint, modelo e voz configuráveis.")
|
|
5384
|
+
minimax_tts_api_key = text_setting("MiniMax TTS API key", "minimax_tts_api_key", secret=True)
|
|
5385
|
+
_render_credential_status(minimax_tts_api_key)
|
|
5386
|
+
minimax_tts_base_url = text_setting("MiniMax TTS Base URL", "minimax_tts_base_url")
|
|
5387
|
+
minimax_tts_model_id = text_setting("MiniMax TTS model", "minimax_tts_model_id")
|
|
5388
|
+
minimax_tts_voice_id = text_setting("MiniMax TTS voice ID", "minimax_tts_voice_id")
|
|
5389
|
+
_render_api_test_control(
|
|
5390
|
+
settings,
|
|
5391
|
+
"voice:minimax",
|
|
5392
|
+
lambda: test_voice_provider("minimax", {"minimax_tts_api_key": minimax_tts_api_key, "minimax_tts_base_url": minimax_tts_base_url}),
|
|
5393
|
+
widget_key="api_test_voice_minimax",
|
|
5394
|
+
)
|
|
5395
|
+
|
|
5396
|
+
with tts_cols[1]:
|
|
5397
|
+
with st.container(border=True):
|
|
5398
|
+
st.markdown("#### Chatterbox")
|
|
5399
|
+
st.caption("Provider compatível com a API OpenAI; pode ser local e sem API key.")
|
|
5400
|
+
chatterbox_base_url = text_setting("Chatterbox Base URL", "chatterbox_base_url")
|
|
5401
|
+
chatterbox_api_key = text_setting("Chatterbox API key", "chatterbox_api_key", secret=True)
|
|
5402
|
+
_render_credential_status(chatterbox_api_key, local=True, required=False)
|
|
5403
|
+
chatterbox_model_id = text_setting("Chatterbox model", "chatterbox_model_id")
|
|
5404
|
+
_render_api_test_control(
|
|
5405
|
+
settings,
|
|
5406
|
+
"voice:chatterbox",
|
|
5407
|
+
lambda: test_voice_provider("chatterbox", {"chatterbox_api_key": chatterbox_api_key, "chatterbox_base_url": chatterbox_base_url}),
|
|
5408
|
+
widget_key="api_test_voice_chatterbox",
|
|
5409
|
+
)
|
|
5410
|
+
|
|
5411
|
+
with st.container(border=True):
|
|
5412
|
+
st.markdown("#### Sonilo")
|
|
5413
|
+
st.caption("Provider TTS Sonilo com endpoint próprio.")
|
|
5414
|
+
sonilo_api_key = text_setting("Sonilo API key", "sonilo_api_key", secret=True)
|
|
5415
|
+
_render_credential_status(sonilo_api_key)
|
|
5416
|
+
sonilo_base_url = text_setting("Sonilo Base URL", "sonilo_base_url")
|
|
5417
|
+
_render_api_test_control(
|
|
5418
|
+
settings,
|
|
5419
|
+
"voice:sonilo",
|
|
5420
|
+
lambda: test_voice_provider("sonilo", {"sonilo_api_key": sonilo_api_key, "sonilo_base_url": sonilo_base_url}),
|
|
5421
|
+
widget_key="api_test_voice_sonilo",
|
|
5422
|
+
)
|
|
5423
|
+
|
|
5424
|
+
with st.container(border=True):
|
|
5425
|
+
st.markdown("#### Suno — agente musical opcional")
|
|
5426
|
+
st.caption("Suno é utilizado para criação de música e fica separado dos providers de voz/TTS.")
|
|
5427
|
+
suno_api_key = text_setting("Suno API key", "suno_api_key", secret=True)
|
|
5428
|
+
_render_credential_status(suno_api_key)
|
|
5429
|
+
suno_api_base_url = text_setting("Suno API Base URL", "suno_api_base_url", help_text="Use o endpoint compatível fornecido pelo seu acesso Suno; não é inventado pelo Thunderbolt.")
|
|
5430
|
+
suno_api_endpoint = text_setting("Suno API endpoint", "suno_api_endpoint", help_text="Ex.: /api/generate")
|
|
5409
5431
|
_render_api_test_control(
|
|
5410
5432
|
settings,
|
|
5411
5433
|
"voice:suno",
|
package/package.json
CHANGED