@danhachuel/thunderbolt 0.6.97 → 0.6.98
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/app/influencers_ui.py +12 -12
- package/app/main.py +214 -214
- package/app/social_networks_ui.py +19 -19
- package/hermes_ui/growth_bilibili.py +1 -1
- package/hermes_ui/growth_facebook_pages.py +3 -3
- package/hermes_ui/growth_instagram.py +3 -3
- package/hermes_ui/growth_tiktok.py +3 -3
- package/package.json +1 -1
package/app/influencers_ui.py
CHANGED
|
@@ -222,7 +222,7 @@ def render_ai_influencer_characters(
|
|
|
222
222
|
key="influencer_new_assets",
|
|
223
223
|
help="Pode seleccionar várias imagens e ficheiros .md/.json no mesmo upload.",
|
|
224
224
|
)
|
|
225
|
-
create = st.form_submit_button("Guardar personagem", type="primary",
|
|
225
|
+
create = st.form_submit_button("Guardar personagem", type="primary", width="stretch")
|
|
226
226
|
if create:
|
|
227
227
|
try:
|
|
228
228
|
record = repository.create_influencer({"name": name, "bio": bio, "language": language, "instagram_business_id": instagram_id})
|
|
@@ -281,7 +281,7 @@ def render_ai_influencer_characters(
|
|
|
281
281
|
accept_multiple_files=True,
|
|
282
282
|
key=f"influencer_append_assets_{selected_id}",
|
|
283
283
|
)
|
|
284
|
-
append_assets = st.form_submit_button("Adicionar assets ao personagem",
|
|
284
|
+
append_assets = st.form_submit_button("Adicionar assets ao personagem", width="stretch")
|
|
285
285
|
if append_assets:
|
|
286
286
|
try:
|
|
287
287
|
saved_assets = 0
|
|
@@ -307,7 +307,7 @@ def render_ai_influencer_characters(
|
|
|
307
307
|
st.caption(_asset_label(asset))
|
|
308
308
|
path = _local_asset_path(asset)
|
|
309
309
|
if str(asset.get("asset_type") or "") == "image" and path:
|
|
310
|
-
st.image(str(path),
|
|
310
|
+
st.image(str(path), width="stretch")
|
|
311
311
|
elif str(asset.get("asset_type") or "") == "document":
|
|
312
312
|
raw = str(asset.get("document_json") or "")
|
|
313
313
|
try:
|
|
@@ -336,7 +336,7 @@ def _render_content_history(repository: Any, influencer_id: str = "") -> None:
|
|
|
336
336
|
preview_col, detail_col = st.columns([1.25, 2.75])
|
|
337
337
|
with preview_col:
|
|
338
338
|
if artifact.is_file() and content_type == "image":
|
|
339
|
-
st.image(str(artifact), caption=f"{type_label} gerada",
|
|
339
|
+
st.image(str(artifact), caption=f"{type_label} gerada", width="stretch")
|
|
340
340
|
elif artifact.is_file() and content_type == "video":
|
|
341
341
|
st.video(str(artifact))
|
|
342
342
|
else:
|
|
@@ -356,7 +356,7 @@ def _render_content_history(repository: Any, influencer_id: str = "") -> None:
|
|
|
356
356
|
file_name=artifact.name,
|
|
357
357
|
mime=mime,
|
|
358
358
|
key=f"influencer_content_download_{content_type}_{content_id}",
|
|
359
|
-
|
|
359
|
+
width="stretch",
|
|
360
360
|
)
|
|
361
361
|
|
|
362
362
|
|
|
@@ -405,7 +405,7 @@ def render_motion_control(settings: dict[str, Any]) -> None:
|
|
|
405
405
|
image_upload = st.file_uploader("Imagem de referência", type=["jpg", "jpeg", "png"], key="motion_control_image")
|
|
406
406
|
prompt = st.text_area("Prompt (opcional)", height=120, max_chars=2500, placeholder="Descreva como preservar a identidade da imagem e aplicar o movimento…", key="motion_control_prompt")
|
|
407
407
|
provider_id = st.selectbox("Provider / modelo", card_options, format_func=lambda value: _provider_label(next(card for card in cards if str(card.get("id")) == value)), key="motion_control_provider")
|
|
408
|
-
generate = st.form_submit_button("Gerar Motion Control", type="primary",
|
|
408
|
+
generate = st.form_submit_button("Gerar Motion Control", type="primary", width="stretch")
|
|
409
409
|
if generate:
|
|
410
410
|
if video_upload is None or image_upload is None:
|
|
411
411
|
st.error("Seleccione o vídeo original e a imagem de referência.")
|
|
@@ -517,8 +517,8 @@ def render_ugc_products(settings: dict[str, Any]) -> None:
|
|
|
517
517
|
else:
|
|
518
518
|
video_provider_id = st.selectbox("Provider / modelo de vídeo", video_options, format_func=lambda value: _provider_label(next(card for card in video_cards if str(card.get("id")) == value)), key="ugc_products_video_provider") if video_cards else ""
|
|
519
519
|
script = st.text_area("Roteiro de vídeo (UGC)", height=150, key="ugc_products_script", placeholder="O roteiro gerado pela IA aparecerá aqui; também pode editá-lo antes de gerar.")
|
|
520
|
-
generate_script = st.button("Gerar roteiro com IA",
|
|
521
|
-
generate = st.button("Gerar Mídia (Foto/Vídeo)", type="primary",
|
|
520
|
+
generate_script = st.button("Gerar roteiro com IA", width="stretch", key="ugc_products_generate_script")
|
|
521
|
+
generate = st.button("Gerar Mídia (Foto/Vídeo)", type="primary", width="stretch", key="ugc_products_generate")
|
|
522
522
|
if generate_script:
|
|
523
523
|
context = "\n".join(
|
|
524
524
|
item for item in [
|
|
@@ -598,7 +598,7 @@ def render_ugc_products(settings: dict[str, Any]) -> None:
|
|
|
598
598
|
preview_col, detail_col, edit_col, download_col = st.columns([1.2, 2.7, 0.35, 0.9])
|
|
599
599
|
with preview_col:
|
|
600
600
|
if artifact.is_file() and str(item.get("content_type") or "") == "image":
|
|
601
|
-
st.image(str(artifact),
|
|
601
|
+
st.image(str(artifact), width="stretch")
|
|
602
602
|
elif artifact.is_file():
|
|
603
603
|
st.video(str(artifact))
|
|
604
604
|
else:
|
|
@@ -613,7 +613,7 @@ def render_ugc_products(settings: dict[str, Any]) -> None:
|
|
|
613
613
|
with download_col:
|
|
614
614
|
if artifact.is_file() and str(item.get("state") or "") == "completed":
|
|
615
615
|
mime = mimetypes.guess_type(artifact.name)[0] or ("image/png" if str(item.get("content_type") or "") == "image" else "video/mp4")
|
|
616
|
-
st.download_button("Download", data=artifact.read_bytes(), file_name=artifact.name, mime=mime, key=f"ugc_ready_download_{content_id}",
|
|
616
|
+
st.download_button("Download", data=artifact.read_bytes(), file_name=artifact.name, mime=mime, key=f"ugc_ready_download_{content_id}", width="stretch")
|
|
617
617
|
if st.session_state.get(f"ugc_ready_editing_{content_id}"):
|
|
618
618
|
with st.form(f"ugc_ready_rename_form_{content_id}"):
|
|
619
619
|
renamed = st.text_input("Nome da mídia", value=title, key=f"ugc_ready_name_{content_id}")
|
|
@@ -655,7 +655,7 @@ def render_ai_influencer_content(settings: dict[str, Any]) -> None:
|
|
|
655
655
|
caption = st.text_area("Legenda/caption (opcional)", height=90, key="content_image_caption")
|
|
656
656
|
platforms = st.multiselect("Redes sociais de destino", PLATFORM_OPTIONS, default=["Instagram"], key="content_image_platforms")
|
|
657
657
|
provider_id = st.selectbox("Provider / modelo", provider_options, format_func=lambda value: _provider_label(next(card for card in cards if str(card.get("id")) == value)), key="content_image_provider") if cards else ""
|
|
658
|
-
generate = st.form_submit_button("Gerar imagem", type="primary",
|
|
658
|
+
generate = st.form_submit_button("Gerar imagem", type="primary", width="stretch")
|
|
659
659
|
if generate:
|
|
660
660
|
if not prompt.strip():
|
|
661
661
|
st.error("Informe o prompt da imagem.")
|
|
@@ -703,7 +703,7 @@ def render_ai_influencer_content(settings: dict[str, Any]) -> None:
|
|
|
703
703
|
caption = st.text_area("Legenda/caption (opcional)", height=90, key="content_video_caption")
|
|
704
704
|
platforms = st.multiselect("Redes sociais de destino", PLATFORM_OPTIONS, default=["Instagram", "TikTok"], key="content_video_platforms")
|
|
705
705
|
provider_id = st.selectbox("Provider / modelo de vídeo", provider_options, format_func=lambda value: _provider_label(next(card for card in cards if str(card.get("id")) == value)), key="content_video_provider") if cards else ""
|
|
706
|
-
generate = st.form_submit_button("Gerar vídeo", type="primary",
|
|
706
|
+
generate = st.form_submit_button("Gerar vídeo", type="primary", width="stretch")
|
|
707
707
|
if generate:
|
|
708
708
|
if not prompt.strip():
|
|
709
709
|
st.error("Informe o prompt de movimento.")
|