@danhachuel/thunderbolt 0.3.74 → 0.3.75

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.
@@ -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.74
5
+ > **Versão deste manual:** 0.3.75
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)
@@ -132,13 +132,13 @@ Execute:
132
132
  Windows PowerShell ou MobaXterm:
133
133
 
134
134
  ```powershell
135
- npx.cmd --yes --prefer-online @danhachuel/thunderbolt@0.3.74 install
135
+ npx.cmd --yes --prefer-online @danhachuel/thunderbolt@0.3.75 install
136
136
  ```
137
137
 
138
138
  Linux/macOS:
139
139
 
140
140
  ```bash
141
- npx --yes --prefer-online @danhachuel/thunderbolt@0.3.74 install
141
+ npx --yes --prefer-online @danhachuel/thunderbolt@0.3.75 install
142
142
  ```
143
143
 
144
144
  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.
@@ -146,7 +146,7 @@ A instalação normal é **segura para actualizações**: preserva `storage`, Bl
146
146
  Se quiser apagar absolutamente tudo de forma intencional, use o comando destrutivo separado:
147
147
 
148
148
  ```powershell
149
- npx.cmd --yes --prefer-online @danhachuel/thunderbolt@0.3.74 install --purge-data
149
+ npx.cmd --yes --prefer-online @danhachuel/thunderbolt@0.3.75 install --purge-data
150
150
  ```
151
151
 
152
152
  O parâmetro `--purge-data` apaga Blueprints, Brandings, configurações, storage e artefactos locais. Não o use numa actualização normal.
@@ -574,7 +574,7 @@ Ao abrir a página, o Thunderbolt não prepara dados públicos, não descarrega
574
574
 
575
575
  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.
576
576
 
577
- 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.74 install`; o instalador detecta e reutiliza o que já estiver válido.
577
+ 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.75 install`; o instalador detecta e reutiliza o que já estiver válido.
578
578
 
579
579
  ### Niche Finder Apify
580
580
 
@@ -808,3 +808,6 @@ O grupo **Growth** inclui agora as abas **Analista Facebook Pages** e **Analista
808
808
  Consulte [`docs/api-internal.md`](docs/api-internal.md) no repositório GitHub para os contratos internos, diagramas de sequência, escritas atómicas de JSON, health check de `sessionInfo` e orquestrador em cascata.
809
809
 
810
810
  O worker local guarda a etapa actual e os artefactos de cada tarefa. Ao reiniciar, retoma a primeira etapa pendente; não deve regenerar ficheiros válidos já persistidos. O `sessionInfo` do Upload directo é monitorizado com uma janela preventiva de 24–48 horas, por defeito 36 horas. A renovação é manual em **Contas Google**.
811
+
812
+ ### Selector de modelos LLM
813
+ No card **OpenAI / NVIDIA NIM**, o campo **Modelo** é uma lista suspensa. Use **Consultar modelos** para actualizar as opções do endpoint; se o identificador não estiver disponível, escolha **Escrever modelo manualmente**.
package/README.md CHANGED
@@ -107,7 +107,7 @@ No topo da área principal da aplicação existe o menu nativo de idioma no padr
107
107
 
108
108
  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.
109
109
 
110
- ## Navegação da UI 0.3.74
110
+ ## Navegação da UI 0.3.75
111
111
 
112
112
  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**, **Geração de Conteúdo IA**, **Motion Control**, **UGC Products**, **Redes Sociais**, **Tutorial Meta** e **Tutorial Supabase**, nessa ordem. A criação de Motion Control e UGC Products ocorre nas páginas standalone e guarda os artefactos localmente; não existem tabs duplicadas dentro de Geração de Conteúdo IA.
113
113
  **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.
@@ -423,3 +423,6 @@ As páginas **Analista Facebook Pages** e **Analista Bilibili** foram adicionada
423
423
  A documentação de API interna, os contratos de persistência, o health check de `sessionInfo` e os diagramas de sequência estão em [`docs/api-internal.md`](docs/api-internal.md). Os ficheiros Mermaid editáveis ficam em [`docs/diagrams/`](docs/diagrams/).
424
424
 
425
425
  A pipeline do worker usa agora um orquestrador local em cascata, com artefactos retomáveis e transições persistidas. As escritas de estado JSON e de Blueprints usam substituição atómica para evitar documentos truncados após interrupções.
426
+
427
+ ## Selector de modelos LLM
428
+ O campo **Modelo** em **Configuração API > API Keys > LLM — providers e modelos** é apresentado como lista suspensa permanente. A lista usa os modelos descobertos pelo endpoint e preserva o modelo guardado; a opção manual continua disponível apenas como fallback explícito.
package/app/main.py CHANGED
@@ -5439,20 +5439,31 @@ def _render_llm_card(settings: dict[str, Any], cards: list[dict[str, Any]], inde
5439
5439
  api_key = ""
5440
5440
  with model_col:
5441
5441
  model_catalog = st.session_state.get(f"llm_model_catalog_{card_id}", [])
5442
- current_model = str(card.get("model") or "")
5443
- if model_catalog:
5444
- manual_model = "__manual_model__"
5445
- options = [manual_model, *[str(item) for item in model_catalog]]
5446
- selected = st.selectbox(
5447
- "Modelo",
5448
- options,
5449
- index=options.index(current_model) if current_model in options else 0,
5450
- format_func=lambda value: "Escrever modelo manualmente" if value == manual_model else value,
5451
- key=f"llm_card_{card_id}_model_select",
5452
- )
5453
- model = st.text_input("Modelo manual", value=current_model if selected == manual_model and current_model not in model_catalog else "", key=f"llm_card_{card_id}_model_manual") if selected == manual_model else selected
5454
- else:
5455
- model = st.text_input("Modelo", value=current_model, help="ID do modelo usado pelo endpoint Chat Completions.", key=f"llm_card_{card_id}_model")
5442
+ if not isinstance(model_catalog, list):
5443
+ model_catalog = []
5444
+ current_model = str(card.get("model") or "").strip()
5445
+ manual_model = "__manual_model__"
5446
+ discovered_models = [str(item).strip() for item in model_catalog if str(item).strip()]
5447
+ options = list(dict.fromkeys(discovered_models))
5448
+ # Mantém modelos guardados mesmo quando a descoberta ainda não foi
5449
+ # executada ou quando o provider deixou de os devolver temporariamente.
5450
+ if current_model and current_model not in options:
5451
+ options.insert(0, current_model)
5452
+ options.append(manual_model)
5453
+ selected = st.selectbox(
5454
+ "Modelo",
5455
+ options,
5456
+ index=options.index(current_model) if current_model in options else len(options) - 1,
5457
+ format_func=lambda value: "Escrever modelo manualmente" if value == manual_model else value,
5458
+ help="Seleccione um modelo descoberto pelo provider. Use a opção manual apenas quando o endpoint exigir um identificador que não esteja na lista.",
5459
+ key=f"llm_card_{card_id}_model_select",
5460
+ )
5461
+ model = st.text_input(
5462
+ "Modelo manual",
5463
+ value=current_model if selected == manual_model and current_model not in discovered_models else "",
5464
+ help="ID do modelo usado pelo endpoint Chat Completions.",
5465
+ key=f"llm_card_{card_id}_model_manual",
5466
+ ) if selected == manual_model else selected
5456
5467
  base_url = str(card.get("base_url") or definition.default_base_url)
5457
5468
  endpoint_col, action_col = st.columns([1.65, 1.05])
5458
5469
  with endpoint_col:
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@danhachuel/thunderbolt",
3
- "version": "0.3.74",
3
+ "version": "0.3.75",
4
4
  "description": "Thunderbolt — interface local para operação de canais faceless e motor MoneyPrinterTurbo",
5
5
  "license": "MIT",
6
6
  "main": "scripts/cli.mjs",