@danhachuel/thunderbolt 0.3.67 → 0.3.68
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 -7
- package/README.md +1 -1
- package/app/influencers_ui.py +2 -4
- package/app/main.py +30 -29
- 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.68
|
|
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)
|
|
@@ -31,9 +31,9 @@ O MoneyPrinterTurbo declara Python 3.11 ou superior como requisito e documenta a
|
|
|
31
31
|
|
|
32
32
|
A área **AI Influencers > Personagens** permite criar personagens com nome, biografia, idioma, Instagram Business ID opcional, várias imagens de referência e ficheiros `.md`/`.json`. O campo **Idioma** é um selector e reutiliza exactamente a mesma lista, os códigos e os labels visuais de **Pipeline Vídeos > Criação de Vídeos**. No uploader, seleccione vários ficheiros de uma vez; cada imagem pode ser pré-visualizada e cada documento é validado como UTF-8, Markdown ou JSON válido. Os assets são deduplicados por SHA-256 e não são gravados como base64 dentro das tabelas.
|
|
33
33
|
|
|
34
|
-
O backend local predefinido é **SQLite**, pelo que Personagens e Geração de Conteúdo IA podem ser usados sem credenciais externas.
|
|
34
|
+
O backend local predefinido é **SQLite**, pelo que Personagens e Geração de Conteúdo IA podem ser usados sem credenciais externas. Em **Configurações > Configuração API > AI Influencers**, o selector **Backend da base de dados de AI Influencers** fica imediatamente abaixo da frase de estado. O card foi renomeado para **Supabase** e contém apenas **Supabase Project URL** e **Supabase API key**. Se seleccionar Supabase mas faltar qualquer uma dessas credenciais, o **Backend activo** permanece automaticamente em SQLite; só muda para Supabase quando ambas estão configuradas. Clique em **Testar ligação do backend** e, para uma base remota, aplique primeiro `seed/references/ai_influencers_schema.sql` no SQL Editor do projecto, exponha as quatro tabelas na Data API e configure permissões/RLS adequadas.
|
|
35
35
|
|
|
36
|
-
Se pretender trabalhar sem serviço externo, seleccione **SQLite** no selector da aba **Configuração API > AI Influencers
|
|
36
|
+
Se pretender trabalhar sem serviço externo, seleccione **SQLite** no selector da aba **Configuração API > AI Influencers**. O caminho `storage/state/ai_influencers.db` e a pasta `storage/influencers/` são geridos internamente, sem campos editáveis para o utilizador. Apenas um backend é usado de cada vez. A base fica na pasta persistente do Thunderbolt, fora da instalação temporária do pacote npm; numa actualização normal, personagens, assets e configurações são preservados. O instalador também procura uma base `ai_influencers.db` válida em instalações anteriores do cache npm e recupera-a sem substituir uma base persistente já existente.
|
|
37
37
|
|
|
38
38
|
Em **AI Influencers > Geração de Conteúdo IA**, utilize as subabas **Imagens**, **Vídeos** e **Motion Control**. Seleccione um personagem, prompt e destinos sociais. A subaba **Imagens** usa o pool de imagem configurado em **Imagem e Video**. A subaba **Vídeos** requer uma imagem inicial e usa o pool de vídeo; escolha o provider/modelo no cartão configurado, sem dependência obrigatória do Veo 3.1. KIE AI, Replicate e FAL AI podem usar tarefas assíncronas; o Thunderbolt consulta o estado e guarda o resultado local antes da revisão. Na Replicate, o campo Modelo deve ser o identificador do modelo ou da versão, e os inputs específicos dependem do modelo configurado.
|
|
39
39
|
|
|
@@ -128,13 +128,13 @@ Execute:
|
|
|
128
128
|
Windows PowerShell ou MobaXterm:
|
|
129
129
|
|
|
130
130
|
```powershell
|
|
131
|
-
npx.cmd --yes --prefer-online @danhachuel/thunderbolt@0.3.
|
|
131
|
+
npx.cmd --yes --prefer-online @danhachuel/thunderbolt@0.3.68 install
|
|
132
132
|
```
|
|
133
133
|
|
|
134
134
|
Linux/macOS:
|
|
135
135
|
|
|
136
136
|
```bash
|
|
137
|
-
npx --yes --prefer-online @danhachuel/thunderbolt@0.3.
|
|
137
|
+
npx --yes --prefer-online @danhachuel/thunderbolt@0.3.68 install
|
|
138
138
|
```
|
|
139
139
|
|
|
140
140
|
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.
|
|
@@ -142,7 +142,7 @@ A instalação normal é **segura para actualizações**: preserva `storage`, Bl
|
|
|
142
142
|
Se quiser apagar absolutamente tudo de forma intencional, use o comando destrutivo separado:
|
|
143
143
|
|
|
144
144
|
```powershell
|
|
145
|
-
npx.cmd --yes --prefer-online @danhachuel/thunderbolt@0.3.
|
|
145
|
+
npx.cmd --yes --prefer-online @danhachuel/thunderbolt@0.3.68 install --purge-data
|
|
146
146
|
```
|
|
147
147
|
|
|
148
148
|
O parâmetro `--purge-data` apaga Blueprints, Brandings, configurações, storage e artefactos locais. Não o use numa actualização normal.
|
|
@@ -568,7 +568,7 @@ Ao abrir a página, o Thunderbolt não prepara dados públicos, não descarrega
|
|
|
568
568
|
|
|
569
569
|
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.
|
|
570
570
|
|
|
571
|
-
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.
|
|
571
|
+
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.68 install`; o instalador detecta e reutiliza o que já estiver válido.
|
|
572
572
|
|
|
573
573
|
### Niche Finder Apify
|
|
574
574
|
|
package/README.md
CHANGED
|
@@ -32,7 +32,7 @@ A primeira versão implementa a camada UI independente com:
|
|
|
32
32
|
|
|
33
33
|
A área **AI Influencers > Personagens** permite guardar um personagem com nome, biografia, idioma, Instagram Business ID opcional, várias imagens de referência e documentos `.md` ou `.json`. O campo **Idioma** é um selector que reutiliza exactamente a lista, os códigos e os labels visuais de **Pipeline Vídeos > Criação de Vídeos**. Cada asset é validado, sanitizado, deduplicado por SHA-256 e guardado separado do perfil; imagens têm pré-visualização e documentos são mostrados como Markdown ou JSON estruturado.
|
|
34
34
|
|
|
35
|
-
O backend local predefinido é **SQLite**, por isso Personagens e Geração de Conteúdo IA funcionam imediatamente sem credenciais externas. Em **Configurações > Configuração API > AI Influencers
|
|
35
|
+
O backend local predefinido é **SQLite**, por isso Personagens e Geração de Conteúdo IA funcionam imediatamente sem credenciais externas. Em **Configurações > Configuração API > AI Influencers**, o selector **Backend da base de dados de AI Influencers** aparece logo abaixo do estado do backend. O card **Supabase** contém apenas **Supabase Project URL** e **Supabase API key**. Se **Supabase** estiver seleccionado mas faltar qualquer uma dessas credenciais, o **Backend activo** muda automaticamente para **SQLite**; quando ambas estão preenchidas, passa para Supabase. O SQLite usa internamente `storage/state/ai_influencers.db` e `storage/influencers/`, sem campos editáveis de caminho ou Storage bucket. O botão **Testar ligação do backend** é read-only e não bloqueia a utilização local. A base SQLite fica na pasta persistente do Thunderbolt, fora da instalação temporária do pacote npm; durante uma actualização normal, personagens, assets e configurações são preservados. Se uma versão anterior tiver guardado `ai_influencers.db` no cache npm, o instalador procura uma cópia válida e recupera-a sem substituir uma base persistente já existente.
|
|
36
36
|
|
|
37
37
|
A página **AI Influencers > Geração de Conteúdo IA** contém as subabas **Imagens**, **Vídeos** e **Motion Control**. Imagens usam os cartões activos do **Pool Imagem**; Vídeos usam os cartões activos do **Pool Vídeo** e exigem uma imagem inicial image-to-video. O selector de modelo não está preso ao Veo 3.1: pode utilizar KIE AI, Replicate, FAL AI, Pollinations ou outro cartão que declare suporte para vídeo. Para Replicate, o campo Modelo deve conter o identificador aceito pela API, como `owner/model` ou `owner/model:version`; a tarefa usa `POST /v1/predictions`, consulta o estado assíncrono e guarda o resultado localmente. A publicação para Instagram, TikTok, YouTube Shorts ou Facebook não é automática: os destinos são registados para revisão e o envio exige uma acção posterior explícita.
|
|
38
38
|
|
package/app/influencers_ui.py
CHANGED
|
@@ -103,9 +103,7 @@ def _provider_label(card: Mapping[str, Any]) -> str:
|
|
|
103
103
|
|
|
104
104
|
|
|
105
105
|
def render_ai_influencers_api_status(settings: dict[str, Any]) -> None:
|
|
106
|
-
"""Show backend status
|
|
107
|
-
st.subheader("AI Influencers")
|
|
108
|
-
st.caption("Estado do backend usado por Personagens e Geração de Conteúdo IA. O selector e as credenciais são editados nesta aba, em Banco de Dados Influencers.")
|
|
106
|
+
"""Show the effective backend status after selector and credentials are loaded."""
|
|
109
107
|
status = backend_status(settings)
|
|
110
108
|
cols = st.columns(3)
|
|
111
109
|
with cols[0]:
|
|
@@ -118,7 +116,7 @@ def render_ai_influencers_api_status(settings: dict[str, Any]) -> None:
|
|
|
118
116
|
st.info(f"{status['message']} Destino: `{status['target']}`")
|
|
119
117
|
else:
|
|
120
118
|
st.warning(status["message"])
|
|
121
|
-
st.markdown("A migração SQL idempotente está disponível em `seed/references/ai_influencers_schema.sql`. No Supabase, aplique-a no SQL Editor e confirme as políticas RLS
|
|
119
|
+
st.markdown("A migração SQL idempotente está disponível em `seed/references/ai_influencers_schema.sql`. No Supabase, aplique-a no SQL Editor e confirme as políticas RLS.")
|
|
122
120
|
if st.button("Testar backend AI Influencers", key="influencers_api_status_test"):
|
|
123
121
|
result = test_backend(settings)
|
|
124
122
|
if result.get("ok"):
|
package/app/main.py
CHANGED
|
@@ -5762,34 +5762,36 @@ def render_settings():
|
|
|
5762
5762
|
render_material_source_api_keys(settings)
|
|
5763
5763
|
|
|
5764
5764
|
with ai_influencers_tab:
|
|
5765
|
-
|
|
5766
|
-
st.
|
|
5767
|
-
|
|
5768
|
-
|
|
5769
|
-
|
|
5770
|
-
|
|
5771
|
-
|
|
5772
|
-
|
|
5773
|
-
|
|
5774
|
-
|
|
5775
|
-
|
|
5776
|
-
|
|
5777
|
-
|
|
5778
|
-
)
|
|
5779
|
-
|
|
5780
|
-
|
|
5781
|
-
|
|
5782
|
-
|
|
5783
|
-
|
|
5784
|
-
|
|
5785
|
-
|
|
5786
|
-
st.
|
|
5787
|
-
|
|
5788
|
-
|
|
5765
|
+
st.subheader("AI Influencers")
|
|
5766
|
+
st.caption("Estado do backend usado por Personagens e Geração de Conteúdo IA. O selector e as credenciais são editados nesta aba, em Banco de Dados Influencers.")
|
|
5767
|
+
saved_backend = str(settings.get("influencer_db_backend") or "SQLite").strip()
|
|
5768
|
+
backend_index = list(BACKEND_OPTIONS).index(saved_backend) if saved_backend in BACKEND_OPTIONS else list(BACKEND_OPTIONS).index("SQLite")
|
|
5769
|
+
influencer_db_backend = st.selectbox(
|
|
5770
|
+
"Backend da base de dados de AI Influencers",
|
|
5771
|
+
list(BACKEND_OPTIONS),
|
|
5772
|
+
index=backend_index,
|
|
5773
|
+
key="settings_influencer_db_backend",
|
|
5774
|
+
help="Seleccione Supabase para usar a base remota ou SQLite para guardar tudo localmente.",
|
|
5775
|
+
)
|
|
5776
|
+
with st.container(border=True):
|
|
5777
|
+
st.subheader("Supabase")
|
|
5778
|
+
st.caption("Configure apenas os dados da ligação Supabase. Se o selector estiver em Supabase mas faltar qualquer credencial, o backend activo permanece SQLite.")
|
|
5779
|
+
with st.form("influencer_database_settings_form"):
|
|
5780
|
+
db_cols = st.columns(2)
|
|
5781
|
+
with db_cols[0]:
|
|
5782
|
+
influencer_supabase_url = text_setting("Supabase Project URL", "influencer_supabase_url", help_text="URL do projecto, por exemplo https://project-id.supabase.co")
|
|
5783
|
+
with db_cols[1]:
|
|
5784
|
+
influencer_supabase_key = text_setting("Supabase API key", "influencer_supabase_key", secret=True, help_text="Use uma chave com as permissões RLS adequadas. Nunca é colocada no GitHub ou nos logs.")
|
|
5785
|
+
test_backend_clicked = st.form_submit_button("Testar ligação do backend", use_container_width=True)
|
|
5786
|
+
save_backend_clicked = st.form_submit_button("Guardar configuração do backend", type="primary", use_container_width=True)
|
|
5787
|
+
effective_settings = dict(settings)
|
|
5788
|
+
effective_settings.update({
|
|
5789
|
+
"influencer_db_backend": influencer_db_backend,
|
|
5790
|
+
"influencer_supabase_url": influencer_supabase_url,
|
|
5791
|
+
"influencer_supabase_key": influencer_supabase_key,
|
|
5792
|
+
})
|
|
5789
5793
|
if test_backend_clicked:
|
|
5790
|
-
|
|
5791
|
-
test_settings.update({"influencer_db_backend": influencer_db_backend, "influencer_supabase_url": influencer_supabase_url, "influencer_supabase_key": influencer_supabase_key, "influencer_supabase_bucket": influencer_supabase_bucket, "influencer_sqlite_path": influencer_sqlite_path})
|
|
5792
|
-
db_result = test_backend(test_settings)
|
|
5794
|
+
db_result = test_backend(effective_settings)
|
|
5793
5795
|
if db_result.get("ok"):
|
|
5794
5796
|
st.success(db_result.get("message") or "Backend disponível.")
|
|
5795
5797
|
else:
|
|
@@ -5799,12 +5801,11 @@ def render_settings():
|
|
|
5799
5801
|
"influencer_db_backend": influencer_db_backend,
|
|
5800
5802
|
"influencer_supabase_url": influencer_supabase_url.strip(),
|
|
5801
5803
|
"influencer_supabase_key": influencer_supabase_key.strip(),
|
|
5802
|
-
"influencer_supabase_bucket": influencer_supabase_bucket.strip() or "ai-influencers",
|
|
5803
|
-
"influencer_sqlite_path": influencer_sqlite_path.strip() or "storage/state/ai_influencers.db",
|
|
5804
5804
|
})
|
|
5805
5805
|
write_json("settings.json", settings)
|
|
5806
5806
|
st.success("Configuração do backend AI Influencers guardada.")
|
|
5807
5807
|
st.rerun()
|
|
5808
|
+
render_ai_influencers_api_status(effective_settings)
|
|
5808
5809
|
|
|
5809
5810
|
with voice_test_tab:
|
|
5810
5811
|
st.subheader("Teste de Voz")
|
package/package.json
CHANGED