diff --git a/.gitignore b/.gitignore index 083db109c..61ef04cfa 100644 --- a/.gitignore +++ b/.gitignore @@ -1,4 +1,5 @@ .venv __pycache__/ .DS_Store -secrets.toml +.env +.streamlit/secrets.toml \ No newline at end of file diff --git a/.streamlit/secrets.toml b/.streamlit/secrets.toml new file mode 100644 index 000000000..b2c9d3c58 --- /dev/null +++ b/.streamlit/secrets.toml @@ -0,0 +1,3 @@ + +rabbitmq_user = "admin" +rabbitmq_user_password = "vini1804" \ No newline at end of file diff --git a/Chatbot.py b/Chatbot.py index 0a4f2df45..cbd64ad44 100644 --- a/Chatbot.py +++ b/Chatbot.py @@ -1,29 +1,1872 @@ from openai import OpenAI +import anthropic +from dotenv import load_dotenv import streamlit as st +import asyncio +from streamlit_product_card import product_card +from utils import ( + updateFile, + solicitaCargaBaseConhecimento, + listaDocumentos, + verificaDocumento, + getEstruturas, + getRecursos, + get_structure_prompt, + get_recurso_narrativo, + digitaPrompt, + getPersonagens, + getFatos, + get_prompt_fato, + carrega_fatos, + get_prompt_personagem, + get_instrucoes, + getComoComecar, + getComoComecarTexto, + getComoOrganizar, + getComoOrganizarTexto, + getComoEnsinar, + getComoEnsinarTexto, + getFormasContar, + getFormasContarTexto, + getEngajamentoCuriosidade, + getEngajamentoCuriosidadeTexto, + getTomVoz, + getTomVozTexto, + getClarezaAutoridade, + getClarezaAutoridadeTexto, + getPosicionamentoConexao, + getPosicionamentoConexaoTexto, + getRecursosExtras, + getRecursosExtrasTexto, + getPromptRecursoIniciante, + getPromptUsoHistoria, + getPromptPersonagemIniciante, + getPromptFatoIniciante, + getPromptTextoIniciante, + getPromptFinalTextoIniciante, + getPromptTextoIntermediario, + getPromptFatoIntermediario, + getPromptPersonagemIntermediario, + getEstruturasAvancadas, + getRecursosAvancados, + getPromptTextoAvancado, + getPromptFatoAvancado, + getPromptPersonagemAvancado +) +from streamlit_quill import st_quill +import json +import time +import re +from dataclasses import dataclass +from pydantic_ai import Agent, RunContext +from pydantic_ai.messages import ModelMessage +from pydantic_ai.usage import Usage, UsageLimits +from pydantic_ai import Agent, RunContext +from pydantic_ai.usage import UsageLimits +from typing import Dict, List, Union +from pydantic import BaseModel, Field +from pydantic_ai.models.openai import OpenAIModel +from pydantic_ai.providers.openai import OpenAIProvider +from pydantic_ai.providers.deepseek import DeepSeekProvider +from pydantic_ai.models.anthropic import AnthropicModel +from pydantic_ai.providers.anthropic import AnthropicProvider +from pydantic_ai.models.gemini import GeminiModel +from pydantic_ai.providers.google_gla import GoogleGLAProvider +load_dotenv() + +if 'openai_api_key' not in st.session_state: + st.session_state.openai_api_key = None + +if 'anthropic_api_key' not in st.session_state: + st.session_state.anthropic_api_key = None + +if 'deepseek_api_key' not in st.session_state: + st.session_state.deepseek_api_key = None + +if 'gemini_api_key' not in st.session_state: + st.session_state.gemini_api_key = None + +if 'openai_model' not in st.session_state: + st.session_state.openai_model = None + +if 'anthropic_model' not in st.session_state: + st.session_state.anthropic_model = None + +if 'deepseek_model' not in st.session_state: + st.session_state.deepseek_model = None + +if 'gemini_model' not in st.session_state: + st.session_state.gemini_model = None + +if 'recurso' not in st.session_state: + st.session_state.recurso = None + +if 'como_comecar' not in st.session_state: + st.session_state.como_comecar = None + +if 'como_organizar' not in st.session_state: + st.session_state.como_organizar = None + +if 'como_ensinar' not in st.session_state: + st.session_state.como_ensinar = None + +if 'formas_contar' not in st.session_state: + st.session_state.formas_contar = None + +if 'engajamento_curiosidade' not in st.session_state: + st.session_state.engajamento_curiosidade = None + +if 'tom_voz' not in st.session_state: + st.session_state.tom_voz = None + +if 'clareza_autoridade' not in st.session_state: + st.session_state.clareza_autoridade = None + +if 'posicionamento_conexao' not in st.session_state: + st.session_state.posicionamento_conexao = None + +if 'recursos_extras' not in st.session_state: + st.session_state.recursos_extras = None + +if 'tipo_estoria' not in st.session_state: + st.session_state.tipo_estoria = None + +if 'recurso_estoria' not in st.session_state: + st.session_state.recurso_estoria = None + +if 'uso_estoria' not in st.session_state: + st.session_state.uso_estoria = None + +if 'estrutura' not in st.session_state: + st.session_state.estrutura = None + +if 'conteudo_digitado' not in st.session_state: + st.session_state.conteudo_digitado = None + +if 'proposta_selecionada' not in st.session_state: + st.session_state.proposta_selecionada = None + +if 'modo_narracao' not in st.session_state: + st.session_state.modo_narracao = None + +if 'narrativa' not in st.session_state: + st.session_state.narrativa = None + +if 'autor' not in st.session_state: + st.session_state.autor = "rodrigo.almeida@gmail.com" + +if 'personagem' not in st.session_state: + st.session_state.personagem = None + +if 'fato' not in st.session_state: + st.session_state.fato = None + +if 'provedor' not in st.session_state: + st.session_state.provedor = None + +if 'idioma' not in st.session_state: + st.session_state.idioma = None + +if 'modelOpenAI' not in st.session_state: + st.session_state.modelOpenAI = None + +if 'modelAnthropic' not in st.session_state: + st.session_state.modelAnthropic = None + +if 'modelDeepseek' not in st.session_state: + st.session_state.modelDeepseek = None + +if 'modelGemini' not in st.session_state: + st.session_state.modelGemini = None + +if 'num_propostas' not in st.session_state: + st.session_state.num_propostas = 3 + +if 'narrativas' not in st.session_state: + st.session_state['narrativas'] = [] + +if 't1' not in st.session_state: + st.session_state.t1 = False + +if 't2' not in st.session_state: + st.session_state.t2 = False + +if 't3' not in st.session_state: + st.session_state.t3 = False + +if 't4' not in st.session_state: + st.session_state.t4 = False + +if 't5' not in st.session_state: + st.session_state.t5 = False + +if 't6' not in st.session_state: + st.session_state.t6 = False + +if 't7' not in st.session_state: + st.session_state.t7 = False + +if 't8' not in st.session_state: + st.session_state.t8 = False + +if 't9' not in st.session_state: + st.session_state.t9 = False + + +if 'e1' not in st.session_state: + st.session_state.e1 = False + +if 'e2' not in st.session_state: + st.session_state.e2 = False + +if 'e3' not in st.session_state: + st.session_state.e3 = False + +if 'e4' not in st.session_state: + st.session_state.e4 = False + +if 'e5' not in st.session_state: + st.session_state.e5 = False + +if 'e6' not in st.session_state: + st.session_state.e6 = False + +if 'e7' not in st.session_state: + st.session_state.e7 = False + +if 'e8' not in st.session_state: + st.session_state.e8 = False + +if 'e9' not in st.session_state: + st.session_state.e9 = False + +if 'e10' not in st.session_state: + st.session_state.e10 = False + +if 'e11' not in st.session_state: + st.session_state.e11 = False + +if 'e12' not in st.session_state: + st.session_state.e12 = False + + +if 'r1' not in st.session_state: + st.session_state.r1 = False + +if 'r2' not in st.session_state: + st.session_state.r2 = False + +if 'r3' not in st.session_state: + st.session_state.r3 = False + +if 'r4' not in st.session_state: + st.session_state.r4 = False + +if 'r5' not in st.session_state: + st.session_state.r5 = False + +if 'r6' not in st.session_state: + st.session_state.r6 = False + +if 'r7' not in st.session_state: + st.session_state.r7 = False + +if 'r8' not in st.session_state: + st.session_state.r8 = False + +if 'r9' not in st.session_state: + st.session_state.r9 = False + +if 'r10' not in st.session_state: + st.session_state.r10 = False + +if 'r11' not in st.session_state: + st.session_state.r11 = False + +if 'r12' not in st.session_state: + st.session_state.r12 = False + +if 'r13' not in st.session_state: + st.session_state.r13 = False + +OPENAI_MODELS_1 = ("gpt-4.1-2025-04-14", "gpt-4.1-mini-2025-04-14", "gpt-4.1-nano-2025-04-14", + "gpt-4o-2024-08-06", "gpt-4o-2024-11-20", "gpt-4o-2024-08-06", + "gpt-4o-realtime-preview-2024-12-17", "gpt-4o-realtime-preview-2024-10-01", + "gpt-4o-mini-2024-07-18", "gpt-4o-mini-realtime-preview-2024-12-17", + "o1-2024-12-17", "o1-preview-2024-09-12", "o3-2025-04-16", "o4-mini-2025-04-16", + "o3-mini-2025-01-31", "o1-mini-2024-09-12" , "--- PREMIUM MODELS ---", "o1-pro-2025-03-19", "gpt-4.5-preview-2025-02-27") + + +GEMINI_MODELS = ("gemini-2.0-flash", "gemini-2.0-flash-lite", "gemini-1.5-flash", "gemini-1.5-flash-8b", "gemini-1.5-pro") + +OPENAI_MODELS = ("gpt-4.1-2025-04-14", "gpt-4.1-mini-2025-04-14", "gpt-4.1-nano-2025-04-14", + "gpt-4o-2024-08-06", "gpt-4o-2024-11-20", "gpt-4o-2024-08-06", + "gpt-4o-realtime-preview-2024-12-17", "gpt-4o-realtime-preview-2024-10-01", + "gpt-4o-mini-2024-07-18", "gpt-4o-mini-realtime-preview-2024-12-17", + "o1-2024-12-17", "o1-preview-2024-09-12", "o4-mini-2025-04-16", + "o3-mini-2025-01-31", "o1-mini-2024-09-12" , "--- PREMIUM MODELS ---", "gpt-4.5-preview-2025-02-27") + + +# ANTHROPIC_MODELS = ("claude-opus-4-20250514", "claude-sonnet-4-20250514", "claude-3-7-sonnet-20250219", "claude-3-5-haiku-20241022") +ANTHROPIC_MODELS = ("claude-3-5-haiku-20241022") + +DEEPSEEK_MODELS = ("deepseek-chat") + +st.set_page_config(page_title='👾 VFN 1.0', layout='wide', + menu_items={ + 'Get Help': 'https://www.extremelycoolapp.com/help', + 'Report a bug': "https://www.extremelycoolapp.com/bug", + 'About': "# This is a header. This is an *extremely* cool app!" + } + # initial_sidebar_state=st.session_state.get('sidebar_state', 'collapsed'), +) + + +def toggle_recurso_avancado(): + if st.session_state.r1: + st.session_state.r2 = False + st.session_state.r3 = False + if st.session_state.r2: + st.session_state.r1 = False + st.session_state.r3 = False + if st.session_state.r3: + st.session_state.r2 = False + st.session_state.r1 = False + + if st.session_state.r4: + st.session_state.r5 = False + st.session_state.r6 = False + if st.session_state.r5: + st.session_state.r4 = False + st.session_state.r6 = False + if st.session_state.r6: + st.session_state.r4 = False + st.session_state.r5 = False + + if st.session_state.r7: + st.session_state.r8 = False + if st.session_state.r8: + st.session_state.r7 = False + + if st.session_state.r9: + st.session_state.r10 = False + st.session_state.r11 = False + if st.session_state.r10: + st.session_state.r9 = False + st.session_state.r11 = False + if st.session_state.r11: + st.session_state.r9 = False + st.session_state.r10 = False + + if st.session_state.r12: + st.session_state.r13 = False + if st.session_state.r13: + st.session_state.r12 = False + + + +def toggle_estrutura_avancada(): + if st.session_state.e1: + st.session_state.e2 = False + st.session_state.e3 = False + st.session_state.e4 = False + st.session_state.e5 = False + st.session_state.e6 = False + st.session_state.e7 = False + st.session_state.e8 = False + st.session_state.e9 = False + st.session_state.e10 = False + st.session_state.e11 = False + st.session_state.e12 = False + if st.session_state.e2: + st.session_state.e1 = False + st.session_state.e3 = False + st.session_state.e4 = False + st.session_state.e5 = False + st.session_state.e6 = False + st.session_state.e7 = False + st.session_state.e8 = False + st.session_state.e9 = False + st.session_state.e10 = False + st.session_state.e11 = False + st.session_state.e12 = False + if st.session_state.e3: + st.session_state.e1 = False + st.session_state.e2 = False + st.session_state.e4 = False + st.session_state.e5 = False + st.session_state.e6 = False + st.session_state.e7 = False + st.session_state.e8 = False + st.session_state.e9 = False + st.session_state.e10 = False + st.session_state.e11 = False + st.session_state.e12 = False + if st.session_state.e4: + st.session_state.e2 = False + st.session_state.e3 = False + st.session_state.e1 = False + st.session_state.e5 = False + st.session_state.e6 = False + st.session_state.e7 = False + st.session_state.e8 = False + st.session_state.e9 = False + st.session_state.e10 = False + st.session_state.e11 = False + st.session_state.e12 = False + if st.session_state.e5: + st.session_state.e2 = False + st.session_state.e3 = False + st.session_state.e4 = False + st.session_state.e1 = False + st.session_state.e6 = False + st.session_state.e7 = False + st.session_state.e8 = False + st.session_state.e9 = False + st.session_state.e10 = False + st.session_state.e11 = False + st.session_state.e12 = False + if st.session_state.e6: + st.session_state.e2 = False + st.session_state.e3 = False + st.session_state.e4 = False + st.session_state.e5 = False + st.session_state.e1 = False + st.session_state.e7 = False + st.session_state.e8 = False + st.session_state.e9 = False + st.session_state.e10 = False + st.session_state.e11 = False + st.session_state.e12 = False + if st.session_state.e7: + st.session_state.e2 = False + st.session_state.e3 = False + st.session_state.e4 = False + st.session_state.e5 = False + st.session_state.e6 = False + st.session_state.e1 = False + st.session_state.e8 = False + st.session_state.e9 = False + st.session_state.e10 = False + st.session_state.e11 = False + st.session_state.e12 = False + if st.session_state.e8: + st.session_state.e2 = False + st.session_state.e3 = False + st.session_state.e4 = False + st.session_state.e5 = False + st.session_state.e6 = False + st.session_state.e7 = False + st.session_state.e1 = False + st.session_state.e9 = False + st.session_state.e10 = False + st.session_state.e11 = False + st.session_state.e12 = False + if st.session_state.e9: + st.session_state.e2 = False + st.session_state.e3 = False + st.session_state.e4 = False + st.session_state.e5 = False + st.session_state.e6 = False + st.session_state.e7 = False + st.session_state.e8 = False + st.session_state.e1 = False + st.session_state.e10 = False + st.session_state.e11 = False + st.session_state.e12 = False + if st.session_state.e10: + st.session_state.e2 = False + st.session_state.e3 = False + st.session_state.e4 = False + st.session_state.e5 = False + st.session_state.e6 = False + st.session_state.e7 = False + st.session_state.e8 = False + st.session_state.e9 = False + st.session_state.e1 = False + st.session_state.e11 = False + st.session_state.e12 = False + if st.session_state.e11: + st.session_state.e2 = False + st.session_state.e3 = False + st.session_state.e4 = False + st.session_state.e5 = False + st.session_state.e6 = False + st.session_state.e7 = False + st.session_state.e8 = False + st.session_state.e9 = False + st.session_state.e10 = False + st.session_state.e1 = False + st.session_state.e12 = False + if st.session_state.e12: + st.session_state.e2 = False + st.session_state.e3 = False + st.session_state.e4 = False + st.session_state.e5 = False + st.session_state.e6 = False + st.session_state.e7 = False + st.session_state.e8 = False + st.session_state.e9 = False + st.session_state.e10 = False + st.session_state.e11 = False + st.session_state.e1 = False + + +def toggle_change_manager(): + # When toggle 1 is False, set toggle 2 to False + if st.session_state.t1: + st.session_state.t2 = False + st.session_state.t3 = False + + if st.session_state.t2: + st.session_state.t1 = False + st.session_state.t3 = False + + if st.session_state.t3: + st.session_state.t2 = False + st.session_state.t1 = False + + if st.session_state.t4: + st.session_state.t5 = False + st.session_state.t6 = False + st.session_state.t7 = False + st.session_state.t8 = False + st.session_state.t9 = False + + if st.session_state.t5: + st.session_state.t4 = False + st.session_state.t6 = False + st.session_state.t7 = False + st.session_state.t8 = False + st.session_state.t9 = False + + if st.session_state.t6: + st.session_state.t5 = False + st.session_state.t4 = False + st.session_state.t7 = False + st.session_state.t8 = False + st.session_state.t9 = False + + + if st.session_state.t7: + st.session_state.t5 = False + st.session_state.t6 = False + st.session_state.t4 = False + st.session_state.t8 = False + st.session_state.t9 = False + + if st.session_state.t8: + st.session_state.t5 = False + st.session_state.t6 = False + st.session_state.t7 = False + st.session_state.t4 = False + st.session_state.t9 = False + + if st.session_state.t9: + st.session_state.t5 = False + st.session_state.t6 = False + st.session_state.t7 = False + st.session_state.t8 = False + st.session_state.t4 = False + with st.sidebar: - openai_api_key = st.text_input("OpenAI API Key", key="chatbot_api_key", type="password") - "[Get an OpenAI API key](https://platform.openai.com/account/api-keys)" - "[View the source code](https://github.com/streamlit/llm-examples/blob/main/Chatbot.py)" - "[![Open in GitHub Codespaces](https://github.com/codespaces/badge.svg)](https://codespaces.new/streamlit/llm-examples?quickstart=1)" - -st.title("💬 Chatbot") -st.caption("🚀 A Streamlit chatbot powered by OpenAI") -if "messages" not in st.session_state: - st.session_state["messages"] = [{"role": "assistant", "content": "How can I help you?"}] - -for msg in st.session_state.messages: - st.chat_message(msg["role"]).write(msg["content"]) - -if prompt := st.chat_input(): - if not openai_api_key: - st.info("Please add your OpenAI API key to continue.") - st.stop() - - client = OpenAI(api_key=openai_api_key) - st.session_state.messages.append({"role": "user", "content": prompt}) - st.chat_message("user").write(prompt) - response = client.chat.completions.create(model="gpt-3.5-turbo", messages=st.session_state.messages) - msg = response.choices[0].message.content - st.session_state.messages.append({"role": "assistant", "content": msg}) - st.chat_message("assistant").write(msg) + st.session_state.openai_api_key = st.text_input("OpenAI API Key", key="chat_openai_api_key", type="password") + "[OpenAI Models Overview](https://platform.openai.com/docs/models)" + st.session_state.anthropic_api_key = st.text_input("Anthropic API Key", key="chat_anthropic_api_key", type="password") + "[Anthropic Models Overview](https://docs.anthropic.com/en/docs/about-claude/models/overview)" + st.session_state.deepseek_api_key = st.text_input("DeepSeek API Key", key="chat_deepseek_api_key", type="password") + "[DeepSeek Models Overview](https://api-docs.deepseek.com/quick_start/pricing)" + st.session_state.gemini_api_key = st.text_input("Gemini API Key", key="chat_gemini_api_key", type="password") + "[Gemini Models Overview](https://ai.google.dev/gemini-api/docs/models)" + + +# Classe com parametros necessários para construção das propostas narrativas +@dataclass +class SupportDependencies: + narrativa: str + personagem: str + fatos: str + tipo_estoria: str + uso_estoria: str + estrutura: str + recurso: str + count: int + idioma: str + +class SupportResult(BaseModel): + titulo: str = Field(description='Um titulo que resume a proposta.') + proposta: str = Field(description='Ideia que deverá evoluir com base no tipo de estoria, recurso e uso da estoria sugerido pelo usuário, escrita no idioma selecionado pelo usuario.') + # impacto: str = Field(description='Como a ideia impacta a jornada do personagem') + # abordagem_estrutural: str = Field(description="De que forma a ideia está relacionada à abordagem estrutural proposta? (Ex.: A alternância emocional é alcançada através das indecisões do personagem .....)") + # recurso_narrativo: str = Field(description="De que forma o recurso narrativo foi abordado? (ex.: incluí a Alegoria ao sugerir que o amor fosse representado através da relação entre o algodão e a desfiadeira....)") + # lugar_comum: str = Field(description='Como a proposta sugerida evita que o escritor caia no lugar comum em relação a seu conteúdo?') + + +class Extraction(BaseModel): + Support_Result: List[SupportResult] = Field(description="List of Support Results") + +@st.fragment() +def getTitulosPropostas(): + result = [] + for i in range(len(st.session_state['narrativas'])): + if st.session_state['narrativas'][i]["titulo"] is not None: + result.append(st.session_state['narrativas'][i]["titulo"]) + return result + +@st.fragment() +def getNarrativaSelecionada(): + result = None + for i in range(len(st.session_state['narrativas'])): + if st.session_state['narrativas'][i]["titulo"] == st.session_state.proposta_selecionada: + result = st.session_state['narrativas'][i] + break + return result + + +@st.fragment() +def trecho5(): + with st.chat_message("assistant"): + st.write(digitaPrompt("🛺 Selecione o Título da Proposta que você gostaria de ver a estória completa:")) + + +def callback_toggle(param): + if param == 1: + st.write("on_organizar") + st.toggle() + + + + +@st.fragment() +def escolheNarrativa(): + texto = "🧚🏼‍♀️" + trecho5() + titulos = getTitulosPropostas() + cols_titulos_propostas = st.columns(len(titulos)) + for j, option_titulos_propostas in enumerate(titulos): + if cols_titulos_propostas[j].button(option_titulos_propostas): + st.session_state.proposta_selecionada = option_titulos_propostas + if st.session_state.proposta_selecionada is not None: + texto = f"""🧚🏼‍♀️ Proposta Selecionada: {st.session_state.proposta_selecionada}""" + st.info(texto) + nova_historia_texto = getNarrativaSelecionada() + # st.write(nova_historia_texto) + + # prompt_instrucoes = get_instrucoes(nova_historia=nova_historia_texto, + # personagem = st.session_state.personagem, + # idioma=st.session_state.idioma) + + + uso_estoria = getPromptUsoHistoria(st.session_state.uso_estoria) + fatos = carrega_fatos(st.session_state.narrativa, st.session_state.personagem, st.session_state.autor) + prompt_instrucoes = getPromptFinalTextoIniciante(nova_historia=nova_historia_texto, + titulo=st.session_state.proposta_selecionada, + USO_HISTORIA=uso_estoria, + FACTS=fatos, + IDIOMA=st.session_state.idioma) + + result_narrativa = None + + if (st.session_state.provedor == "ANTHROPIC"): + support_agent_anthropic_narrativa = Agent( + st.session_state.modelAnthropic, + system_prompt=( + "Você é um ajudante na jornada de um escritor em melhorar a escrita de seu conteúdo." + ), + retries=2, + ) + with st.spinner(f"[ANTHROPIC {st.session_state.anthropic_model}] Gerando Narrativa....", show_time=True): + result_narrativa = support_agent_anthropic_narrativa.run_sync(prompt_instrucoes) + while result_narrativa is None: + time.sleep(1) + + if (st.session_state.provedor == "OPENAI"): + support_agent_openai_narrativa = Agent( + st.session_state.modelOpenAI, + system_prompt=( + "Você é um ajudante na jornada de um escritor em melhorar a escrita de seu conteúdo." + ), + retries=2, + ) + with st.spinner(f"[OPENAI {st.session_state.openai_model}] Gerando Narrativa....", show_time=True): + result_narrativa = support_agent_openai_narrativa.run_sync(prompt_instrucoes) + while result_narrativa is None: + time.sleep(1) + + if (st.session_state.provedor == "GEMINI"): + support_agent_gemini_narrativa = Agent( + st.session_state.modelGemini, + system_prompt=( + "Você é um ajudante na jornada de um escritor em melhorar a escrita de seu conteúdo." + ), + retries=2, + ) + with st.spinner(f"[GEMINI {st.session_state.gemini_model}] Gerando Narrativa....", show_time=True): + result_narrativa = support_agent_gemini_narrativa.run_sync(prompt_instrucoes) + while result_narrativa is None: + time.sleep(1) + + if (st.session_state.provedor == "DEEPSEEK"): + support_agent_deepseek_narrativa = Agent( + st.session_state.modelDeepseek, + system_prompt=( + "Você é um ajudante na jornada de um escritor em melhorar a escrita de seu conteúdo." + ), + retries=2, + ) + with st.spinner(f"[DEEPSEEK {st.session_state.deepseek_model}] Gerando Narrativa....", show_time=True): + result_narrativa = support_agent_deepseek_narrativa.run_sync(prompt_instrucoes) + while result_narrativa is None: + time.sleep(1) + + st.write(result_narrativa.output) + + +async def chat(): + st.image("./logo/ComfyUI_00309_2.png", use_container_width=True ) + st.title("💬 Validador de Fluxo Narrativo - VFN 1.0") + st.header("Cadastrar Narrativa Base 🧠") + with st.expander("Expanda para Cadastrar Narrativa Base"): + title = st.text_input("Título (evite caracteres especiais no título):", "") + # Remove aspas + title = title.replace('"', '') + st.session_state.conteudo_digitado = st_quill() + if st.button("Carregar", type="primary"): + updateFile(title, st.session_state.autor, st.session_state.conteudo_digitado) + solicitaCargaBaseConhecimento(title, st.session_state.autor,"NOVA_NARRATIVA","PT", "story_teller") + with st.spinner("Carregando Base de Conhecimento....", show_time=True): + while not verificaDocumento(title, st.session_state.autor): + time.sleep(1) + st.success("File successfully uploaded!") + + st.header("Parametrize a Contação de Estória 🎯") + container = st.container(border=True) + with container: + options = listaDocumentos(st.session_state.autor) + # cols = st.columns(len(options)) + st.session_state.narrativa = st.selectbox("Selecione uma Narrativa:", options=options, index=0, + help=f"Narrativas Carregadas pelo Autor", key="narrativa_box") + + if st.session_state.narrativa is not None: + col1, col2 = st.columns([1,1]) + with col1: + options_personagem = getPersonagens(st.session_state.autor, st.session_state.narrativa) + st.session_state.personagem = st.selectbox("Selecione um Personagem:", options=options_personagem, index=0, + help=f"Personagens presentes na narrativa {st.session_state.narrativa}", key="personagem_box") + with col2: + options_fatos = getFatos(st.session_state.autor, st.session_state.narrativa) + st.session_state.fato = st.selectbox("Selecione um Fato:", options=options_fatos, index=0, + help=f"Fatos presentes na narrativa {st.session_state.narrativa}") + + st.markdown(":green-badge[:material/star: Selecione uma Modalidade:]") + tab1, tab2, tab3 = st.tabs(["👶🏼 Iniciante", "🧒🏽 Intermediário", "👨🏾‍🦳 Avançado"]) + with tab1: + st.header("Modo Iniciante 👶🏼") + containerIniciante = st.container(border=True) + with containerIniciante: + st.subheader("Qual estória devemos contar?") + col1_select, col2_select, col3_select = st.columns([1,1,1]) + with col1_select: + clicked_select1 = product_card( + product_name=f"Uma estória com foco no Personagem", + description=f"Conte a estória de {st.session_state.personagem}", + price=f"", + product_image="https://alegoria.nyc3.digitaloceanspaces.com/COMUM/IMAGENS/MarkuryFLUX_00070_.png", + key="select_card1", + picture_position="right", + image_aspect_ratio="16/9", + image_object_fit="cover", + ) + + if clicked_select1: + st.session_state.tipo_estoria = "Personagem" + + with col2_select: + clicked_select2 = product_card( + product_name="Uma estória baseada no Texto Completo", + description=f"Utilize todo o conteúdo de \"{st.session_state.narrativa}\" para criar uma nova estória." , + price="", + product_image="https://alegoria.nyc3.digitaloceanspaces.com/COMUM/IMAGENS/MarkuryFLUX_00108_.png", + key="select_card2", + picture_position="right", + image_aspect_ratio="16/9", + image_object_fit="cover", + ) + + if clicked_select2: + st.session_state.tipo_estoria = "Texto" + + with col3_select: + clicked_select3 = product_card( + product_name=f"Uma estória com foco em um Fato", + description=f"Conte a estória com foco no fato \"{st.session_state.fato}\"", + price="", + product_image="https://alegoria.nyc3.digitaloceanspaces.com/COMUM/IMAGENS/MarkuryFLUX_00115_.png", + key="select_card3", + picture_position="right", + image_aspect_ratio="16/9", + image_object_fit="cover", + ) + + if clicked_select3: + st.session_state.tipo_estoria = "Fato" + + st.subheader("Como devemos contar a estória?") + + col1_how, col2_how, col3_how = st.columns([1,1,1]) + with col1_how: + clicked_basic = product_card( + product_name=f"Impacto Logo no Início", + description=f"Comece a estória com tudo! Essa estrutura é perfeita para redes sociais, vídeos curtos ou textos que precisam fisgar o leitor em segundos.", + price=f"", + product_image="https://alegoria.nyc3.digitaloceanspaces.com/COMUM/IMAGENS/MarkuryFLUX_01059_.png", + key="basic_card1", + picture_position="right", + image_aspect_ratio="16/9", + image_object_fit="cover", + ) + + if clicked_basic: + st.session_state.recurso_estoria = "IMPACTO_INICIO" + + with col2_how: + clicked_basic2 = product_card( + product_name="Minha Verdade", + description=f"Não é só um desabafo: é um posicionamento com narrativa. Funciona muito bem para influenciadores e especialistas." , + price="", + product_image="https://alegoria.nyc3.digitaloceanspaces.com/COMUM/IMAGENS/MarkuryFLUX_01121_.png", + key="basic_card2", + picture_position="right", + image_aspect_ratio="16/9", + image_object_fit="cover", + ) + + if clicked_basic2: + st.session_state.recurso_estoria = "MINHA_VERDADE" + + with col3_how: + clicked_basic3 = product_card( + product_name=f"Bastidores ou Segredos", + description=f"Revele algo inesperado, pouco falado ou mal compreendido sobre seu tema. Essa estrutura desperta curiosidade e posiciona você como alguém que traz conteúdo original.", + price="", + product_image="https://alegoria.nyc3.digitaloceanspaces.com/COMUM/IMAGENS/MarkuryFLUX_01128_.png", + key="basic_card3", + picture_position="right", + image_aspect_ratio="16/9", + image_object_fit="cover", + ) + + if clicked_basic3: + st.session_state.recurso_estoria = "BASTIDORES_SEGREDOS" + + col4_how, col5_how, col6_how = st.columns([1,1,1]) + with col4_how: + clicked_basic = product_card( + product_name=f"Ordem Cronológica", + description=f"Essa estrutura é ideal para mostrar uma sequência de eventos, como a trajetória de uma marca, a evolução de uma ideia, ou o passo a passo de uma jornada.", + price=f"", + product_image="https://alegoria.nyc3.digitaloceanspaces.com/COMUM/IMAGENS/MarkuryFLUX_00359_.png", + key="basic_card4", + picture_position="right", + image_aspect_ratio="16/9", + image_object_fit="cover", + ) + + if clicked_basic: + st.session_state.recurso_estoria = "ORDEM_CRONOLOGICA" + with col5_how: + clicked_basic2 = product_card( + product_name="Queda e Superação", + description=f"O personagem (ou você) enfrenta um desafio, passa por uma crise, mas encontra uma saída e termina em um lugar melhor. Boa para estórias inspiradoras e lições de vida." , + price="", + product_image="https://alegoria.nyc3.digitaloceanspaces.com/COMUM/IMAGENS/MarkuryFLUX_00326_.png", + key="basic_card5", + picture_position="right", + image_aspect_ratio="16/9", + image_object_fit="cover", + ) + + if clicked_basic2: + st.session_state.recurso_estoria = "QUEDA_SUPERACAO" + + with col6_how: + clicked_basic3 = product_card( + product_name=f"Aprendi do Jeito Difícil", + description=f"Conte sobre um erro que cometeu e como ele te ensinou algo valioso. Isso aproxima você do público e passa autoridade de forma autêntica.", + price="", + product_image="https://alegoria.nyc3.digitaloceanspaces.com/COMUM/IMAGENS/MarkuryFLUX_00367_.png", + key="basic_card6", + picture_position="right", + image_aspect_ratio="16/9", + image_object_fit="cover", + ) + + if clicked_basic3: + st.session_state.recurso_estoria = "APRENDI_DIFICIL" + + st.subheader("Como você deseja usar sua estória?") + col1_uso, col2_uso, col3_uso = st.columns([1,1,1]) + with col1_uso: + clicked_uso_estoria1 = product_card( + product_name=f"Rede Social", + description=f"A estória em formato de vídeo curto para ser divulgada em Plataformas Sociais", + price=f"", + product_image="https://alegoria.nyc3.digitaloceanspaces.com/COMUM/IMAGENS/MarkuryFLUX_00271_.png", + key="uso_estoria1", + picture_position="right", + image_aspect_ratio="16/9", + image_object_fit="cover", + ) + + if clicked_uso_estoria1: + st.session_state.uso_estoria = "REDE_SOCIAL" + + with col2_uso: + clicked_uso_estoria2 = product_card( + product_name="PodCast", + description=f"A estória em formato de áudio para ser aproveitada em um PodCast ou Similar." , + price="", + product_image="https://alegoria.nyc3.digitaloceanspaces.com/COMUM/IMAGENS/MarkuryFLUX_00302_.png", + key="uso_estoria2", + picture_position="right", + image_aspect_ratio="16/9", + image_object_fit="cover", + ) + + if clicked_uso_estoria2: + st.session_state.uso_estoria = "PODCAST" + + with col3_uso: + clicked_uso_estoria3 = product_card( + product_name=f"Conteúdo de Artefato", + description=f"A estória em formato de Texto para ser incluído em livros, panfletos, WebSites, etc..", + price="", + product_image="https://alegoria.nyc3.digitaloceanspaces.com/COMUM/IMAGENS/MarkuryFLUX_00327_.png", + key="uso_estoria3", + picture_position="right", + image_aspect_ratio="16/9", + image_object_fit="cover", + ) + + if clicked_uso_estoria3: + st.session_state.uso_estoria = "CONTEUDO" + + with tab2: + st.header("Modo Intermediário 🧒🏽") + containerEstrutura = st.container(border=True) + with containerEstrutura: + st.subheader("Qual estória devemos contar?") + col1_select_intermed, col2_select_intermed, col3_select_intermed = st.columns([1,1,1]) + with col1_select_intermed: + clicked_select_intermed1 = product_card( + product_name=f"Uma estória com foco no Personagem", + description=f"Conte a estória de {st.session_state.personagem}", + price=f"", + product_image="https://alegoria.nyc3.digitaloceanspaces.com/COMUM/IMAGENS/MarkuryFLUX_00070_.png", + key="select_intermed_card1", + picture_position="right", + image_aspect_ratio="16/9", + image_object_fit="cover", + ) + + if clicked_select_intermed1: + st.session_state.tipo_estoria = "Personagem" + + with col2_select_intermed: + clicked_select_intermed2 = product_card( + product_name="Uma estória baseada no Texto Completo", + description=f"Utilize todo o conteúdo de \"{st.session_state.narrativa}\" para criar uma nova estória." , + price="", + product_image="https://alegoria.nyc3.digitaloceanspaces.com/COMUM/IMAGENS/MarkuryFLUX_00108_.png", + key="select_intermed_card2", + picture_position="right", + image_aspect_ratio="16/9", + image_object_fit="cover", + ) + + if clicked_select_intermed2: + st.session_state.tipo_estoria = "Texto" + + with col3_select_intermed: + clicked_select_intermed3 = product_card( + product_name=f"Uma estória com foco em um Fato", + description=f"Conte a estória com foco no fato \"{st.session_state.fato}\"", + price="", + product_image="https://alegoria.nyc3.digitaloceanspaces.com/COMUM/IMAGENS/MarkuryFLUX_00115_.png", + key="select_intermed_card3", + picture_position="right", + image_aspect_ratio="16/9", + image_object_fit="cover", + ) + + if clicked_select_intermed3: + st.session_state.tipo_estoria = "Fato" + + col1_est, col2_est = st.columns([1,1]) + with col1_est: + st.subheader("Modelos de Estrutura de Conteúdo") + st.markdown(":green-badge[:material/star: O \"Formato\" da sua estória - **Habilite somente um grupo desse bloco**.]") + with col2_est: + with st.expander(f"**📖 O que é isso?**"): + st.markdown(''' + A estrutura é a **base da sua estória ou conteúdo**. + Pense como o “formato” que organiza o que você vai contar. + Selecione um dos seguintes Grupos de Estruturas para formatar sua estória. + ''') + + st.markdown(":gray-badge[:material/Start: **Grupo 1: Foque no Começo da Estória**]") + col0_comecar, col1_comecar, col2_comecar = st.columns([1,4,4]) + with col0_comecar: + on_comecar = st.toggle("Habilitar", key="t1", help=f"Clique para Habilitar o Grupo 1.", on_change=toggle_change_manager) + with col1_comecar: + st.session_state.como_comecar = st.selectbox("**Como você quer começar?**", options=getComoComecar(), index=0, + help=f"Selecione o melhor jeito de começar sua estória.", key="como_comecar_box") + with col2_comecar: + if st.session_state.como_comecar is not None: + with st.expander(f"**📖 O que significa {st.session_state.como_comecar}?**"): + st.markdown(getComoComecarTexto(st.session_state.como_comecar)) + + st.markdown(":gray-badge[:material/Start: **Grupo 2: Foque na Organização da estória**]") + col0_organizar, col1_organizar, col2_organizar = st.columns([1,4,4]) + with col0_organizar: + on_organizar = st.toggle("Habilitar", key="t2", help=f"Clique para Habilitar o Grupo 2.", on_change=toggle_change_manager) + with col1_organizar: + st.session_state.como_organizar = st.selectbox("**Como você quer organizar o Texto?**", options=getComoOrganizar(), index=0, + help=f"Selecione o melhor jeito de organizar sua estória.", key="como_organizar_box") + with col2_organizar: + if st.session_state.como_organizar is not None: + with st.expander(f"**📖 O que significa {st.session_state.como_organizar}?**"): + st.markdown(getComoOrganizarTexto(st.session_state.como_organizar)) + + st.markdown(":gray-badge[:material/Start: **Grupo 3: Foque na Proposta de Valor**]") + col0_ensinar, col1_ensinar, col2_ensinar = st.columns([1,4,4]) + with col0_ensinar: + on_ensinar = st.toggle("Habilitar", key="t3", help=f"Clique para Habilitar o Grupo 3.", on_change=toggle_change_manager) + with col1_ensinar: + st.session_state.como_ensinar = st.selectbox("**Como gerar Valor?**", options=getComoEnsinar(), index=0, + help=f"Selecione o melhor jeito de gerar Valor para sua estória.", key="como_ensinar_box") + with col2_ensinar: + if st.session_state.como_ensinar is not None: + with st.expander(f"**📖 O que significa {st.session_state.como_ensinar}?**"): + st.markdown(getComoEnsinarTexto(st.session_state.como_ensinar)) + + col1_rec, col2_rec = st.columns([1,1]) + with col1_rec: + st.subheader("Modelos de Recursos de Conteúdo") + st.markdown(":green-badge[:material/star: Os \"Temperos\" da sua estória - **Habilite somente um grupo desse bloco**.]") + with col2_rec: + with st.expander(f"**📖 O que é isso?**"): + st.markdown(''' + Os recursos deixam tudo mais interessante e efetivamente "temperam" sua estória. + ''') + st.markdown(":gray-badge[:material/Start: **Grupo 4: Deixe sua narrativa mais visual, criativa ou envolvente.**]") + col0_formas_contar, col1_formas_contar, col2_formas_contar = st.columns([1,4,4]) + with col0_formas_contar: + on_formas_contar = st.toggle("Habilitar",key="t4", on_change=toggle_change_manager, help=f"Clique para Habilitar o Grupo 4.") + with col1_formas_contar: + st.session_state.formas_contar = st.selectbox("**Formas de Contar**", options=getFormasContar(), index=0, + help=f"Selecione o melhor jeito de contar sua estória.", key="como_contar_box") + with col2_formas_contar: + if st.session_state.formas_contar is not None: + with st.expander(f"**📖 O que significa {st.session_state.formas_contar}?**"): + st.markdown(getFormasContarTexto(st.session_state.formas_contar)) + + st.markdown(":gray-badge[:material/Start: **Grupo 5: Prenda a atenção e provoque o leitor.**]") + col0_eng_cur, col1_eng_cur, col2_eng_cur = st.columns([1,4,4]) + with col0_eng_cur: + on_engajamento_curiosidade = st.toggle("Habilitar",key="t5", on_change=toggle_change_manager, help=f"Clique para Habilitar o Grupo 5.") + with col1_eng_cur: + st.session_state.engajamento_curiosidade = st.selectbox("**Engajamento e Curiosidade**", options=getEngajamentoCuriosidade(), index=0, + help=f"Selecione o melhor jeito de gerar Engajamento e Curiosidade.", key="como_engajar_curiosidade_box") + with col2_eng_cur: + if st.session_state.engajamento_curiosidade is not None: + with st.expander(f"**📖 O que significa {st.session_state.engajamento_curiosidade}?**"): + st.markdown(getEngajamentoCuriosidadeTexto(st.session_state.engajamento_curiosidade)) + + st.markdown(":gray-badge[:material/Start: **Grupo 6: Use sua personalidade como diferencial.**]") + col0_tom_voz, col1_tom_voz, col2_tom_voz = st.columns([1,4,4]) + with col0_tom_voz: + on_tom_voz = st.toggle("Habilitar",key="t6", on_change=toggle_change_manager, help=f"Clique para Habilitar o Grupo 6.") + with col1_tom_voz: + st.session_state.tom_voz = st.selectbox("**Tom e Voz**", options=getTomVoz(), index=0, + help=f"Selecione o melhor jeito de dar o tom para sua estória.", key="como_tom_voz_box") + with col2_tom_voz: + if st.session_state.tom_voz is not None: + with st.expander(f"**📖 O que significa {st.session_state.tom_voz}?**"): + st.markdown(getTomVozTexto(st.session_state.tom_voz)) + + st.markdown(":gray-badge[:material/Start: **Grupo 7: Passe segurança, ensine melhor, informe com base.**]") + col0_clareza, col1_clareza, col2_clareza = st.columns([1,4,4]) + with col0_clareza: + on_clareza = st.toggle("Habilitar",key="t7", on_change=toggle_change_manager, help=f"Clique para Habilitar o Grupo 7.") + with col1_clareza: + st.session_state.clareza_autoridade = st.selectbox("**Clareza e Autoridade**", options=getClarezaAutoridade(), index=0, + help=f"Selecione o melhor jeito de demonstrar clareza e autoridade.", key="como_clareza_autoridade_box") + with col2_clareza: + if st.session_state.clareza_autoridade is not None: + with st.expander(f"**📖 O que significa {st.session_state.clareza_autoridade}?**"): + st.markdown(getClarezaAutoridadeTexto(st.session_state.clareza_autoridade)) + + + st.markdown(":gray-badge[:material/Start: **Grupo 8: Mostre quem você é e com quem você fala.**]") + col0_conexao, col1_conexao, col2_conexao = st.columns([1,4,4]) + with col0_conexao: + on_conexao = st.toggle("Habilitar",key="t8", on_change=toggle_change_manager, help=f"Clique para Habilitar o Grupo 8.") + with col1_conexao: + st.session_state.posicionamento_conexao = st.selectbox("**Posicionamento e Conexão**", options=getPosicionamentoConexao(), index=0, + help=f"Selecione o melhor jeito de demonstrar Conexão com o Leitor.", key="como_conexao_box") + with col2_conexao: + if st.session_state.posicionamento_conexao is not None: + with st.expander(f"**📖 O que significa {st.session_state.posicionamento_conexao}?**"): + st.markdown(getPosicionamentoConexaoTexto(st.session_state.posicionamento_conexao)) + + st.markdown(":gray-badge[:material/Start: **Grupo 9: Recursos Extras.**]") + col0_recursos, col1_recursos, col2_recursos = st.columns([1,4,4]) + with col0_recursos: + on_recursos = st.toggle("Habilitar",key="t9", on_change=toggle_change_manager, help=f"Clique para Habilitar o Grupo 9.") + with col1_recursos: + st.session_state.recursos_extras = st.selectbox("**Recursos Extras**", options=getRecursosExtras(), index=0, + help=f"Adicione elementos interessantes à narrativa.", key="como_recursos_box") + with col2_recursos: + if st.session_state.recursos_extras is not None: + with st.expander(f"**📖 O que significa {st.session_state.recursos_extras}?**"): + st.markdown(getRecursosExtrasTexto(st.session_state.recursos_extras)) + + st.subheader("Como você deseja usar sua estória?") + col1_uso_intermed, col2_uso_intermed, col3_uso_intermed = st.columns([1,1,1]) + with col1_uso_intermed: + clicked_uso_intermed_estoria1 = product_card( + product_name=f"Rede Social", + description=f"A estória em formato de vídeo curto para ser divulgada em Plataformas Sociais", + price=f"", + product_image="https://alegoria.nyc3.digitaloceanspaces.com/COMUM/IMAGENS/MarkuryFLUX_00271_.png", + key="uso_intermed_estoria1", + picture_position="right", + image_aspect_ratio="16/9", + image_object_fit="cover", + ) + + if clicked_uso_intermed_estoria1: + st.session_state.uso_estoria = "REDE_SOCIAL" + + with col2_uso_intermed: + clicked_uso_intermed_estoria2 = product_card( + product_name="PodCast", + description=f"A estória em formato de áudio para ser aproveitada em um PodCast ou Similar." , + price="", + product_image="https://alegoria.nyc3.digitaloceanspaces.com/COMUM/IMAGENS/MarkuryFLUX_00302_.png", + key="uso_intermed_estoria2", + picture_position="right", + image_aspect_ratio="16/9", + image_object_fit="cover", + ) + + if clicked_uso_intermed_estoria2: + st.session_state.uso_estoria = "PODCAST" + + with col3_uso_intermed: + clicked_uso_intermed_estoria3 = product_card( + product_name=f"Conteúdo de Artefato", + description=f"A estória em formato de Texto para ser incluído em livros, panfletos, WebSites, etc..", + price="", + product_image="https://alegoria.nyc3.digitaloceanspaces.com/COMUM/IMAGENS/MarkuryFLUX_00327_.png", + key="uso_intermed_estoria3", + picture_position="right", + image_aspect_ratio="16/9", + image_object_fit="cover", + ) + + if clicked_uso_intermed_estoria3: + st.session_state.uso_estoria = "CONTEUDO" + + + with tab3: + st.header("Modo Avançado 👨🏾‍🦳") + containerAvancado = st.container(border=True) + with containerAvancado: + st.subheader("Qual estória devemos contar?") + col1_select_avancad, col2_select_avancad, col3_select_avancad = st.columns([1,1,1]) + with col1_select_avancad: + clicked_select_avancad1 = product_card( + product_name=f"Uma estória com foco no Personagem", + description=f"Conte a estória de {st.session_state.personagem}", + price=f"", + product_image="https://alegoria.nyc3.digitaloceanspaces.com/COMUM/IMAGENS/MarkuryFLUX_00070_.png", + key="select_avancad_card1", + picture_position="right", + image_aspect_ratio="16/9", + image_object_fit="cover", + ) + + if clicked_select_avancad1: + st.session_state.tipo_estoria = "Personagem" + + with col2_select_avancad: + clicked_select_avancad2 = product_card( + product_name="Uma estória baseada no Texto Completo", + description=f"Utilize todo o conteúdo de \"{st.session_state.narrativa}\" para criar uma nova estória." , + price="", + product_image="https://alegoria.nyc3.digitaloceanspaces.com/COMUM/IMAGENS/MarkuryFLUX_00108_.png", + key="select_avancad_card2", + picture_position="right", + image_aspect_ratio="16/9", + image_object_fit="cover", + ) + + if clicked_select_avancad2: + st.session_state.tipo_estoria = "Texto" + + with col3_select_avancad: + clicked_select_avancad3 = product_card( + product_name=f"Uma estória com foco em um Fato", + description=f"Conte a estória com foco no fato \"{st.session_state.fato}\"", + price="", + product_image="https://alegoria.nyc3.digitaloceanspaces.com/COMUM/IMAGENS/MarkuryFLUX_00115_.png", + key="select_avancad_card3", + picture_position="right", + image_aspect_ratio="16/9", + image_object_fit="cover", + ) + + if clicked_select_avancad3: + st.session_state.tipo_estoria = "Fato" + + col1_est, col2_est = st.columns([1,1]) + with col1_est: + st.subheader("Modelos de Estrutura de Conteúdo") + st.markdown(":green-badge[:material/star: O \"Formato\" da sua estória - **Habilite somente um grupo desse bloco**.]") + with col2_est: + with st.expander(f"**📖 O que é isso?**"): + st.markdown(''' + A estrutura é a **base da sua estória ou conteúdo**. + Pense como o “formato” que organiza o que você vai contar. + Selecione um dos seguintes Grupos de Estruturas para formatar sua estória. + ''') + + st.markdown(":gray-badge[:material/Start: **História em Ordem Cronológica**]") + col0_linha_tempo, col1_linha_tempo = st.columns([1,4]) + with col0_linha_tempo: + on_linha_tempo = st.toggle("Habilitar", key="e1", help=f"Clique para Habilitar o uso da Linha do Tempo.", on_change=toggle_estrutura_avancada) + with col1_linha_tempo: + st.markdown("Conte a sua história seguindo a ordem dos acontecimentos, do começo ao fim. Essa estrutura é ideal para mostrar uma sequência de eventos, como a trajetória de uma marca, a evolução de uma ideia, ou o passo a passo de uma jornada.") + + st.markdown(":gray-badge[:material/Start: **Montanha-Russa Emocional**]") + col0, col1 = st.columns([1,4]) + with col0: + on_montanha_russa = st.toggle("Habilitar", key="e2", help=f"Clique para Habilitar o uso da Alternância Emocional.", on_change=toggle_estrutura_avancada) + with col1: + st.markdown("Aqui, sua narrativa vai alternar entre altos e baixos emocionais. Um momento difícil dá espaço a uma conquista, ou uma tensão é quebrada com humor. Ideal para engajar o público e criar conexão emocional.") + + st.markdown(":gray-badge[:material/Start: **Impacto Logo no Início**]") + col0, col1 = st.columns([1,4]) + with col0: + on_impacto_inicio = st.toggle("Habilitar", key="e3", help=f"Clique para Habilitar o uso de Lead Forte.", on_change=toggle_estrutura_avancada) + with col1: + st.markdown("Você começa com tudo: uma revelação surpreendente, uma pergunta intrigante ou algo que prende a atenção de cara. Essa estrutura é perfeita para redes sociais, vídeos curtos ou textos que precisam fisgar o leitor em segundos.") + + st.markdown(":gray-badge[:material/Start: **Queda e Superação**]") + col0, col1 = st.columns([1,4]) + with col0: + on_queda_superacao = st.toggle("Habilitar", key="e4", help=f"Clique para Habilitar o uso do Homem no Buraco.", on_change=toggle_estrutura_avancada) + with col1: + st.markdown("A história começa bem, mas algo dá errado. O personagem (ou você) enfrenta um desafio, passa por uma crise, mas encontra uma saída e termina em um lugar melhor. Boa para histórias inspiradoras e lições de vida.") + + st.markdown(":gray-badge[:material/Start: **Descoberta de um Valor Escondido**]") + col0, col1 = st.columns([1,4]) + with col0: + on_valor_escondido = st.toggle("Habilitar", key="e5", help=f"Clique para Habilitar o uso dos Trapos à Riqueza.", on_change=toggle_estrutura_avancada) + with col1: + st.markdown("Tudo começa com algo que parece ruim, inútil ou sem valor. Mas ao longo da história, esse \"problema\" se revela uma grande força. Excelente para transformar percepções e mostrar crescimento.") + + st.markdown(":gray-badge[:material/Start: **Tentativa e Erro**]") + col0, col1 = st.columns([1,4]) + with col0: + on_tentativa_erro = st.toggle("Habilitar", key="e6", help=f"Clique para Habilitar o uso da Solução Errada.", on_change=toggle_estrutura_avancada) + with col1: + st.markdown("Você começa com um problema e tenta uma solução que parece funcionar... mas não funciona. Depois de um revés, encontra o caminho certo. Ideal para mostrar aprendizado, evolução e autenticidade.") + + st.markdown(":gray-badge[:material/Start: **Guia Prático**]") + col0, col1 = st.columns([1,4]) + with col0: + on_guia_pratico = st.toggle("Habilitar", key="e7", help=f"Clique para Habilitar o uso do Passo a Passo.", on_change=toggle_estrutura_avancada) + with col1: + st.markdown("Mostre como fazer algo, do início ao fim, em etapas claras. Ideal para tutoriais, dicas profissionais, ou mostrar seu processo criativo.") + + st.markdown(":gray-badge[:material/Start: **Transformação Visível**]") + col0, col1 = st.columns([1,4]) + with col0: + on_transformacao_visivel = st.toggle("Habilitar", key="e8", help=f"Clique para Habilitar o uso de Antes e Depois.", on_change=toggle_estrutura_avancada) + with col1: + st.markdown("Mostre uma mudança: de uma situação inicial para um resultado final impressionante. Pode ser uma mudança pessoal, profissional, estética ou de mentalidade. Muito usado por coaches, terapeutas, criadores de estilo ou fitness.") + + st.markdown(":gray-badge[:material/Start: **Comece com uma Pergunta**]") + col0, col1 = st.columns([1,4]) + with col0: + on_comece_pergunta = st.toggle("Habilitar", key="e9", help=f"Clique para Habilitar o uso de Pergunta e Resposta.", on_change=toggle_estrutura_avancada) + with col1: + st.markdown("Inicie com uma dúvida comum do seu público e responda de forma clara, objetiva ou criativa. Boa para criar conexão direta e gerar engajamento rápido.") + + + st.markdown(":gray-badge[:material/Start: **Opinião com Contexto**]") + col0, col1 = st.columns([1,4]) + with col0: + on_opiniao_contexto = st.toggle("Habilitar", key="e10", help=f"Clique para Habilitar o uso do Minha Verdade.", on_change=toggle_estrutura_avancada) + with col1: + st.markdown("Compartilhe sua visão sobre um tema com base na sua vivência ou experiência. Não é só um desabafo: é um posicionamento com história. Funciona muito bem para influenciadores e especialistas.") + + st.markdown(":gray-badge[:material/Start: **Aprendi do Jeito Difícil**]") + col0, col1 = st.columns([1,4]) + with col0: + on_jeito_dificil = st.toggle("Habilitar", key="e11", help=f"Clique para Habilitar o uso do Erro que Virei Mestre.", on_change=toggle_estrutura_avancada) + with col1: + st.markdown("Conte sobre um erro que cometeu e como ele te ensinou algo valioso. Isso aproxima você do público e passa autoridade de forma autêntica.") + + st.markdown(":gray-badge[:material/Start: **Bastidores ou Segredos**]") + col0, col1 = st.columns([1,4]) + with col0: + on_bastidores_segredos = st.toggle("Habilitar", key="e12", help=f"Clique para Habilitar o uso do O que Ninguém Te Conta.", on_change=toggle_estrutura_avancada) + with col1: + st.markdown("Revele algo inesperado, pouco falado ou mal compreendido sobre seu tema. Essa estrutura desperta curiosidade e posiciona você como alguém que traz conteúdo original.") + col1_rec, col2_rec = st.columns([1,1]) + with col1_rec: + st.subheader("Modelos de Recursos de Conteúdo") + st.markdown(":green-badge[:material/star: Os \"Temperos\" da sua estória.]") + with col2_rec: + with st.expander(f"**📖 O que é isso?**"): + st.markdown(''' + Os recursos deixam tudo mais interessante e efetivamente "temperam" sua estória. Use algumas para dar uma maior variabilidade para a sua história. + ''') + st.markdown(":gray-badge[:material/Start: **Formas de Contar: Recursos ajudam a deixar o conteúdo mais criativo ou visual - Habilite somente um grupo desse bloco.**]") + col0, col1 = st.columns([1,4]) + with col0: + on_historia_rapida = st.toggle("Habilitar", key="r1", help=f"Clique para Habilitar o uso da História Rápida.", on_change=toggle_recurso_avancado) + with col1: + st.markdown("Use uma história curta ou inventada (real ou não) para explicar algo de forma mais envolvente.") + + col0, col1 = st.columns([1,4]) + with col0: + on_comparacao_simples = st.toggle("Habilitar", key="r2", help=f"Clique para Habilitar o uso do Comparação Simples .", on_change=toggle_recurso_avancado) + with col1: + st.markdown("Compare o tema com algo que todo mundo entende. Pode ser uma metáfora, um símbolo ou até dar “vida” a um conceito.") + + col0, col1 = st.columns([1,4]) + with col0: + on_antes_depois = st.toggle("Habilitar", key="r3", help=f"Clique para Habilitar o uso do Antes e Depois.", on_change=toggle_recurso_avancado) + with col1: + st.markdown("Mostre a diferença entre duas situações. Pode ser o que mudou, melhorou ou piorou. Isso dá força à sua mensagem.") + + st.markdown(":gray-badge[:material/Start: **Engajamento e Curiosidade: Recursos que criam expectativa, envolvem ou desafiam o leitor - Habilite somente um grupo desse bloco.**]") + + col0, col1 = st.columns([1,4]) + with col0: + on_antes_depois = st.toggle("Habilitar", key="r4", help=f"Clique para Habilitar o uso do Pergunta ou Curiosidade.", on_change=toggle_recurso_avancado) + with col1: + st.markdown("Faça uma pergunta que desperte o interesse ou sugira que você tem uma informação escondida.") + + + col0, col1 = st.columns([1,4]) + with col0: + on_antes_depois = st.toggle("Habilitar", key="r5", help=f"Clique para Habilitar o uso de Surpresa ou Reviravolta.", on_change=toggle_recurso_avancado) + with col1: + st.markdown("Traga algo inesperado ou mude o rumo do conteúdo no final. Isso segura a atenção.") + + col0, col1 = st.columns([1,4]) + with col0: + on_antes_depois = st.toggle("Habilitar", key="r6", help=f"Clique para Habilitar o uso de Gancho Final.", on_change=toggle_recurso_avancado) + with col1: + st.markdown("Termine com algo que deixa o leitor querendo mais: uma pergunta, promessa ou continuação.") + + + st.markdown(":gray-badge[:material/Start: **Tom e Voz: Escolhas que afetam o estilo, humor ou forma de falar - Habilite somente um grupo desse bloco.**]") + + col0, col1 = st.columns([1,4]) + with col0: + on_antes_depois = st.toggle("Habilitar", key="r7", help=f"Clique para Habilitar o uso de Tom Pessoal.", on_change=toggle_recurso_avancado) + with col1: + st.markdown("Use sua voz. Fale como você. Pode ser contando em primeira pessoa, explicando diretamente ao leitor ou fazendo piada com a própria narrativa.") + + col0, col1 = st.columns([1,4]) + with col0: + on_antes_depois = st.toggle("Habilitar", key="r8", help=f"Clique para Habilitar o uso de Alívio Cômico.", on_change=toggle_recurso_avancado) + with col1: + st.markdown("Use humor para deixar tudo mais leve. Pode ser uma piada, uma quebra engraçada ou algo inesperado.") + + + st.markdown(":gray-badge[:material/Start: **Clareza e Autoridade: Recursos para reforçar credibilidade, instruir ou informar melhor - Habilite somente um grupo desse bloco.**]") + + col0, col1 = st.columns([1,4]) + with col0: + on_antes_depois = st.toggle("Habilitar", key="r9", help=f"Clique para Habilitar o uso de Contexto Rápido.", on_change=toggle_recurso_avancado) + with col1: + st.markdown("Explique o básico de forma simples: o que está acontecendo? Onde? Com quem? Por quê?") + + col0, col1 = st.columns([1,4]) + with col0: + on_antes_depois = st.toggle("Habilitar", key="r10", help=f"Clique para Habilitar o uso de Prova com Dados .", on_change=toggle_recurso_avancado) + with col1: + st.markdown("Traga um número ou dado interessante que sustente seu ponto ou surpreenda.") + + col0, col1 = st.columns([1,4]) + with col0: + on_antes_depois = st.toggle("Habilitar", key="r11", help=f"Clique para Habilitar o uso de Dica Prática.", on_change=toggle_recurso_avancado) + with col1: + st.markdown("Liste passos fáceis ou ofereça uma solução rápida. Ideal para conteúdos úteis e objetivos.") + + st.markdown(":gray-badge[:material/Start: **Posicionamento: Recursos que ajudam o criador a tomar uma posição clara no conteúdo - Habilite somente um grupo desse bloco.**]") + + col0, col1 = st.columns([1,4]) + with col0: + on_antes_depois = st.toggle("Habilitar", key="r12", help=f"Clique para Habilitar o uso de Discordância Construtiva.", on_change=toggle_recurso_avancado) + with col1: + st.markdown("Mostre um ponto de vista diferente do comum, questione ideias ou se posicione contra algo — com respeito e argumentos.") + + col0, col1 = st.columns([1,4]) + with col0: + on_antes_depois = st.toggle("Habilitar", key="r13", help=f"Clique para Habilitar o uso de Conexão com o Leitor.", on_change=toggle_recurso_avancado) + with col1: + st.markdown("Mostre como o conteúdo tem a ver com quem está lendo e incentive a pessoa a comentar, pensar ou agir.") + + st.subheader("Como você deseja usar sua estória?") + col1_uso_avanc, col2_uso_avanc, col3_uso_avanc = st.columns([1,1,1]) + with col1_uso_avanc: + clicked_uso_avanc_estoria1 = product_card( + product_name=f"Rede Social", + description=f"A estória em formato de vídeo curto para ser divulgada em Plataformas Sociais", + price=f"", + product_image="https://alegoria.nyc3.digitaloceanspaces.com/COMUM/IMAGENS/MarkuryFLUX_00271_.png", + key="uso_avanc_estoria1", + picture_position="right", + image_aspect_ratio="16/9", + image_object_fit="cover", + ) + + if clicked_uso_avanc_estoria1: + st.session_state.uso_estoria = "REDE_SOCIAL" + + with col2_uso_avanc: + clicked_uso_avanc_estoria2 = product_card( + product_name="PodCast", + description=f"A estória em formato de áudio para ser aproveitada em um PodCast ou Similar." , + price="", + product_image="https://alegoria.nyc3.digitaloceanspaces.com/COMUM/IMAGENS/MarkuryFLUX_00302_.png", + key="uso_avanc_estoria2", + picture_position="right", + image_aspect_ratio="16/9", + image_object_fit="cover", + ) + + if clicked_uso_avanc_estoria2: + st.session_state.uso_estoria = "PODCAST" + + with col3_uso_avanc: + clicked_uso_avanc_estoria3 = product_card( + product_name=f"Conteúdo de Artefato", + description=f"A estória em formato de Texto para ser incluído em livros, panfletos, WebSites, etc..", + price="", + product_image="https://alegoria.nyc3.digitaloceanspaces.com/COMUM/IMAGENS/MarkuryFLUX_00327_.png", + key="uso_avanc_estoria3", + picture_position="right", + image_aspect_ratio="16/9", + image_object_fit="cover", + ) + + if clicked_uso_avanc_estoria3: + st.session_state.uso_estoria = "CONTEUDO" + + + + col1, col2, col3, col4 = st.columns([1,1,1,1]) + with col1: + st.session_state.openai_model = st.selectbox("Modelo OpenAI:",OPENAI_MODELS, key="openai_model_box") + with col2: + st.session_state.anthropic_model = st.selectbox("Modelo Anthropic:",ANTHROPIC_MODELS,key="anthropic_model_box") + with col3: + st.session_state.deepseek_model = st.selectbox("Modelo DeepSeek:",DEEPSEEK_MODELS,key="deepseek_model_box") + with col4: + st.session_state.gemini_model = st.selectbox("Modelo Gemini:",GEMINI_MODELS,key="gemini_model_box") + + col1, col2, col3 = st.columns([1,1,1]) + with col1: + st.session_state.idioma = st.selectbox("Selecione o Idioma:",("PORTUGUES", "INGLES", "ESPANHOL", "ITALIANO", "FRANCES"),key="idiomas_box") + with col2: + st.session_state.provedor = st.selectbox("Selecione um Provedor de Modelos de IA:",("OPENAI", "ANTHROPIC", "DEEPSEEK", "GEMINI"),key="provedores_box") + with col3: + st.session_state.modo_narracao = st.selectbox("Selecione um Modo de Narração:",("Iniciante", "Intermediário", "Avançado"),key="modo_narracao_box") + + containerSumario = st.container(border=True) + + with containerSumario: + st.subheader("Sumário") + if (st.session_state.modo_narracao == "Iniciante"): + st.write(f"Proposta Narrativa: {st.session_state.narrativa}") + st.write(f"Tipo de Historia: {st.session_state.tipo_estoria}") + st.write(f"Recurso de Historia: {st.session_state.recurso_estoria}") + st.write(f"Uso de Historia: {st.session_state.uso_estoria}") + st.write(f"Idioma: {st.session_state.idioma}") + st.write(f"Modo de Narração: {st.session_state.modo_narracao}") + if (st.session_state.modo_narracao == "Intermediário"): + st.write(f"Proposta Narrativa: {st.session_state.narrativa}") + st.write(f"Tipo de Historia: {st.session_state.tipo_estoria}") + if st.session_state.t1: + st.write(f"Estrutura: {st.session_state.como_comecar}") + if st.session_state.t2: + st.write(f"Estrutura: {st.session_state.como_organizar}") + if st.session_state.t3: + st.write(f"Estrutura: {st.session_state.como_ensinar}") + if st.session_state.t4: + st.write(f"Recurso: {st.session_state.formas_contar}") + if st.session_state.t5: + st.write(f"Recurso: {st.session_state.engajamento_curiosidade}") + if st.session_state.t6: + st.write(f"Recurso: {st.session_state.tom_voz}") + if st.session_state.t7: + st.write(f"Recurso: {st.session_state.clareza_autoridade}") + if st.session_state.t8: + st.write(f"Recurso: {st.session_state.posicionamento_conexao}") + if st.session_state.t9: + st.write(f"Recurso: {st.session_state.recursos_extras}") + st.write(f"Uso de Historia: {st.session_state.uso_estoria}") + st.write(f"Idioma: {st.session_state.idioma}") + st.write(f"Modo de Narração: {st.session_state.modo_narracao}") + if (st.session_state.modo_narracao == "Avançado"): + st.write(f"Proposta Narrativa: {st.session_state.narrativa}") + st.write(f"Tipo de Historia: {st.session_state.tipo_estoria}") + st.write(f"######## ESTRUTURAS #######") + if st.session_state.e1: + st.write(f"Estrutura: História em Ordem Cronológica") + if st.session_state.e2: + st.write(f"Estrutura: Montanha-Russa Emocional") + if st.session_state.e3: + st.write(f"Estrutura: Impacto Logo no Início") + if st.session_state.e4: + st.write(f"Estrutura: Queda e Superação") + if st.session_state.e5: + st.write(f"Estrutura: Descoberta de um Valor Escondido") + if st.session_state.e6: + st.write(f"Estrutura: Tentativa e Erro") + if st.session_state.e7: + st.write(f"Estrutura: Guia Prático") + if st.session_state.e8: + st.write(f"Estrutura: Transformação Visível") + if st.session_state.e9: + st.write(f"Estrutura: Comece com uma Pergunta") + if st.session_state.e10: + st.write(f"Estrutura: Opinião com Contexto") + if st.session_state.e11: + st.write(f"Estrutura: Aprendi do Jeito Difícil") + if st.session_state.e12: + st.write(f"Estrutura: Bastidores ou Segredos") + st.write(f"######## RECURSOS #######") + if st.session_state.r1: + st.write(f"Recurso: História Rápida") + if st.session_state.r2: + st.write(f"Recurso: Comparação Simples") + if st.session_state.r3: + st.write(f"Recurso: Antes e Depois") + if st.session_state.r4: + st.write(f"Recurso: Queda e Superação") + if st.session_state.r5: + st.write(f"Recurso: Surpresa ou Reviravolta") + if st.session_state.r6: + st.write(f"Recurso: Gancho Final") + if st.session_state.r7: + st.write(f"Recurso: Tom Pessoal") + if st.session_state.r8: + st.write(f"Recurso: Alívio Cômico") + if st.session_state.r9: + st.write(f"Recurso: Contexto Rápido") + if st.session_state.r10: + st.write(f"Recurso: Prova com Dados") + if st.session_state.r11: + st.write(f"Recurso: Dica Prática") + if st.session_state.r12: + st.write(f"Recurso: Discordância Construtiva") + if st.session_state.r13: + st.write(f"Recurso: Conexão com o Leitor") + + st.write(f"Uso de Historia: {st.session_state.uso_estoria}") + st.write(f"Idioma: {st.session_state.idioma}") + st.write(f"Modo de Narração: {st.session_state.modo_narracao}") + + + + if st.button("Gerar Algumas Propostas de Estórias", type="primary"): + if st.session_state.openai_api_key is None or st.session_state.anthropic_api_key is None or st.session_state.gemini_api_key is None or st.session_state.deepseek_api_key is None: + st.write(digitaPrompt("Please add API key to continue.")) + st.stop() + results = [] + + prompt = "" + + + if st.session_state.modo_narracao == "Avançado": + fatos = carrega_fatos(st.session_state.narrativa, st.session_state.personagem, st.session_state.autor) + recurso_iniciante = getPromptRecursoIniciante(st.session_state.recurso_estoria) + uso_estoria = getPromptUsoHistoria(st.session_state.uso_estoria) + estruturas = getEstruturasAvancadas(st.session_state.e1, + st.session_state.e2, + st.session_state.e3, + st.session_state.e4, + st.session_state.e5, + st.session_state.e6, + st.session_state.e7, + st.session_state.e8, + st.session_state.e9, + st.session_state.e10, + st.session_state.e11, + st.session_state.e12) + + recursos = getRecursosAvancados(st.session_state.r1, + st.session_state.r2, + st.session_state.r3, + st.session_state.r4, + st.session_state.r5, + st.session_state.r6, + st.session_state.r7, + st.session_state.r8, + st.session_state.r9, + st.session_state.r10, + st.session_state.r11, + st.session_state.r12, + st.session_state.r13) + + deps = SupportDependencies(st.session_state.narrativa, + st.session_state.personagem, + fatos, + st.session_state.tipo_estoria, + uso_estoria, + estruturas, + recursos, + st.session_state.num_propostas, + st.session_state.idioma) + + if (st.session_state.tipo_estoria == "Personagem"): + prompt = getPromptPersonagemAvancado(COUNT=st.session_state.num_propostas, + PERSONAGEM=st.session_state.personagem, + RECURSO=recursos, + ESTRUTURA=estruturas, + USO_HISTORIA=uso_estoria, + FACTS=fatos, + IDIOMA=st.session_state.idioma) + + + if (st.session_state.tipo_estoria == "Fato"): + prompt = getPromptFatoAvancado(COUNT=st.session_state.num_propostas, + FATO=st.session_state.fato, + RECURSO=recursos, + ESTRUTURA=estruturas, + USO_HISTORIA=uso_estoria, + FACTS=fatos, + IDIOMA=st.session_state.idioma) + + if (st.session_state.tipo_estoria == "Texto"): + prompt = getPromptTextoAvancado(COUNT=st.session_state.num_propostas, + RECURSO=recursos, + ESTRUTURA=estruturas, + USO_HISTORIA=uso_estoria, + FACTS=fatos, + IDIOMA=st.session_state.idioma) + + if st.session_state.modo_narracao == "Iniciante": + estrutura = "" + fatos = carrega_fatos(st.session_state.narrativa, st.session_state.personagem, st.session_state.autor) + recurso_iniciante = getPromptRecursoIniciante(st.session_state.recurso_estoria) + uso_estoria = getPromptUsoHistoria(st.session_state.uso_estoria) + deps = SupportDependencies(st.session_state.narrativa, + st.session_state.personagem, + fatos, + st.session_state.tipo_estoria, + uso_estoria, + estrutura, + recurso_iniciante, + st.session_state.num_propostas, + st.session_state.idioma) + + + + if (st.session_state.tipo_estoria == "Personagem"): + prompt = getPromptPersonagemIniciante(COUNT=st.session_state.num_propostas, + PERSONAGEM=st.session_state.personagem, + RECURSO_INICIANTE=recurso_iniciante, + USO_HISTORIA=uso_estoria, + FACTS=fatos, + IDIOMA=st.session_state.idioma) + + + if (st.session_state.tipo_estoria == "Fato"): + prompt = getPromptFatoIniciante(COUNT=st.session_state.num_propostas, + FATO=st.session_state.fato, + RECURSO_INICIANTE=recurso_iniciante, + USO_HISTORIA=uso_estoria, + FACTS=fatos, + IDIOMA=st.session_state.idioma) + + if (st.session_state.tipo_estoria == "Texto"): + prompt = getPromptTextoIniciante(COUNT=st.session_state.num_propostas, + RECURSO_INICIANTE=recurso_iniciante, + USO_HISTORIA=uso_estoria, + FACTS=fatos, + IDIOMA=st.session_state.idioma) + + if st.session_state.modo_narracao == "Intermediário": + fatos = carrega_fatos(st.session_state.narrativa, st.session_state.personagem, st.session_state.autor) + uso_estoria = getPromptUsoHistoria(st.session_state.uso_estoria) + # ESTRUTURAS + estrutura = "" + if st.session_state.t1: + estrutura = getComoComecarTexto(st.session_state.como_comecar) + if st.session_state.t2: + estrutura = getComoOrganizarTexto(st.session_state.como_organizar) + if st.session_state.t3: + estrutura = getComoEnsinarTexto(st.session_state.como_ensinar) + # RECURSOS + recurso = "" + if st.session_state.t4: + recurso = getFormasContarTexto(st.session_state.formas_contar) + if st.session_state.t5: + recurso = getEngajamentoCuriosidadeTexto(st.session_state.engajamento_curiosidade) + if st.session_state.t6: + recurso = getTomVozTexto(st.session_state.tom_voz) + if st.session_state.t7: + recurso = getClarezaAutoridadeTexto(st.session_state.clareza_autoridade) + if st.session_state.t8: + recurso = getPosicionamentoConexaoTexto(st.session_state.posicionamento_conexao) + if st.session_state.t9: + recurso = getRecursosExtrasTexto(st.session_state.recursos_extras) + + deps = SupportDependencies(st.session_state.narrativa, + st.session_state.personagem, + fatos, + st.session_state.tipo_estoria, + uso_estoria, + estrutura, + recurso, + st.session_state.num_propostas, + st.session_state.idioma) + + prompt = "" + + if (st.session_state.tipo_estoria == "Personagem"): + prompt = getPromptPersonagemIntermediario(COUNT=st.session_state.num_propostas, + PERSONAGEM=st.session_state.personagem, + RECURSO=recurso, + ESTRUTURA=estrutura, + USO_HISTORIA=uso_estoria, + FACTS=fatos, + IDIOMA=st.session_state.idioma) + + + if (st.session_state.tipo_estoria == "Fato"): + prompt = getPromptFatoIntermediario(COUNT=st.session_state.num_propostas, + FATO=st.session_state.fato, + RECURSO=recurso, + ESTRUTURA=estrutura, + USO_HISTORIA=uso_estoria, + FACTS=fatos, + IDIOMA=st.session_state.idioma) + + if (st.session_state.tipo_estoria == "Texto"): + prompt = getPromptTextoIntermediario(COUNT=st.session_state.num_propostas, + RECURSO=recurso, + ESTRUTURA=estrutura, + USO_HISTORIA=uso_estoria, + FACTS=fatos, + IDIOMA=st.session_state.idioma) + + result = None + + if (st.session_state.provedor == "GEMINI"): + st.write(digitaPrompt(f"🙅🏽‍♀️ Ok! A partir de agora vamos apresentar as propostas {st.session_state.narrativa}. Narrativas geradas com o Provedor {st.session_state.provedor} usando o modelo {st.session_state.gemini_model}" )) + st.session_state.modelGemini = GeminiModel(st.session_state.gemini_model, provider=GoogleGLAProvider(api_key=st.session_state.gemini_api_key)) + support_agent_gemini = Agent( + st.session_state.modelGemini, + deps_type=SupportDependencies, + result_type=Extraction, + system_prompt=( + "Voce é um agente de suporte responsável por criar narrativas." + ), + retries=2, + ) + with st.spinner(f"[GEMINI {st.session_state.gemini_model}] Gerando Propostas....", show_time=True): + result = await support_agent_gemini.run(prompt) + while result is None: + time.sleep(1) + + if (st.session_state.provedor == "OPENAI"): + st.write(digitaPrompt(f"🙅🏽‍♀️ Ok! A partir de agora vamos apresentar as propostas {st.session_state.narrativa}. Narrativas geradas com o Provedor {st.session_state.provedor} usando o modelo {st.session_state.openai_model}" )) + st.session_state.modelOpenAI = OpenAIModel(st.session_state.openai_model, provider=OpenAIProvider(api_key=st.session_state.openai_api_key)) + support_agent_openai = Agent( + st.session_state.modelOpenAI, + deps_type=SupportDependencies, + result_type=Extraction, + system_prompt=( + "Voce é um agente de suporte responsável por criar narrativas." + ), + retries=2, + ) + with st.spinner(f"[OPENAI {st.session_state.openai_model}] Gerando Propostas....", show_time=True): + result = await support_agent_openai.run(prompt) + while result is None: + time.sleep(1) + + if (st.session_state.provedor == "ANTHROPIC"): + st.write(digitaPrompt(f"🙅🏽‍♀️ Ok! A partir de agora vamos apresentar as propostas {st.session_state.narrativa}. Narrativas geradas com o Provedor {st.session_state.provedor} usando o modelo {st.session_state.anthropic_model}" )) + st.session_state.modelAnthropic = AnthropicModel(st.session_state.anthropic_model, provider=AnthropicProvider(api_key=st.session_state.anthropic_api_key)) + support_agent_anthropic = Agent( + st.session_state.modelAnthropic, + deps_type=SupportDependencies, + output_type=Extraction, + system_prompt=( + "Voce é um agente de suporte responsável por criar narrativas. " + ), + retries=2, + ) + with st.spinner(f"[ANTHROPIC {st.session_state.anthropic_model}] Gerando Propostas....", show_time=True): + result = await support_agent_anthropic.run(prompt) + while result is None: + time.sleep(1) + + if (st.session_state.provedor == "DEEPSEEK"): + st.write(digitaPrompt(f"🙅🏽‍♀️ Ok! A partir de agora vamos apresentar as propostas {st.session_state.narrativa}. Narrativas geradas com o Provedor {st.session_state.provedor} usando o modelo {st.session_state.deepseek_model}" )) + st.session_state.modelDeepseek = OpenAIModel(st.session_state.deepseek_model, provider=DeepSeekProvider(api_key=st.session_state.deepseek_api_key ),) + support_agent_deepseek = Agent( + st.session_state.modelDeepseek, + deps_type=SupportDependencies, + result_type=Extraction, + system_prompt=( + "Voce é um agente de suporte responsável por criar narrativas." + ), + retries=2, + ) + with st.spinner(f"[DEEPSEEK {st.session_state.deepseek_model}] Gerando Propostas....", show_time=True): + result = await support_agent_deepseek.run(prompt) + while result is None: + time.sleep(1) + + with open("content223.txt", "w", encoding="utf-8") as f: + f.write(str(result.output)) + with open("content223.txt", "r", encoding="utf-8") as file: + # Read the contents of the file + content = file.read() + content = content.strip() + # Regular expression to match each SupportResult block + pattern = r"SupportResult\((.*?)\)" + + # Find all matches + matches = re.findall(pattern, content, re.DOTALL) + + # Process each match into a dictionary + + for match in matches: + fields = re.findall(r"(\w+)=\'(.*?)\'", match, re.DOTALL) + result_dict = {key: value for key, value in fields} + results.append(result_dict) + st.session_state['narrativas'] = results + st.write(st.session_state['narrativas']) + escolheNarrativa() + + + +if __name__ == "__main__": + asyncio.run(chat()) \ No newline at end of file diff --git a/README.md b/README.md index 03030f229..829a6a02f 100644 --- a/README.md +++ b/README.md @@ -48,3 +48,12 @@ source .venv/bin/activate pip install -r requirements.txt streamlit run Chatbot.py ``` + + +O chanceler do governo Lula, Mauro Vieira, afirmou nesta quarta-feira que o interesse nacional está sempre em primeiro lugar nas relações com outros países. Vieira deu essa declaração ao ser perguntado por alguns parlamentares sobre as ameaças do governo do presidente americano, Donald Trump, ao ministro do Supremo Tribunal Federal (STF), Alexandre de Moraes. + +— Queria relembrar as palavras que disse, em que fiz referência ao Barão do Rio Branco, dizendo que o Brasil não tem alianças, não tem parcerias incondicionais. O principal é o interesse nacional, que está sempre em primeiro lugar — afirmou, em audiência pública na Comissão de Relações Exteriores e Defesa Nacional da Câmara dos Deputados, Mauro Vieira também foi questionado sobre o anúncio feito pelo secretário de Estado dos EUA, Marco Rubio, de que haverá restrição na concessão de vistos para autoridades estrangeiras. Rubio não citou alvos, mas bolsonaristas acreditam que entre os alvos estão ministros do STF. + +— A política de visto é de cada Estrado, cada um toma as decisões de conceder ou não conceder. É uma decisão soberana de cada país — disse ele, sem citar nomes que poderiam ser afetados com a medida. + +Na semana passada, Marco Rubio declarou que há possibilidade de Moraes sofrer sanções dos EUA, como ser proibido de entrar no país. O chefe da diplomacia americana causou preocupação ao governo brasileiro, que afirmou a Washington que as relações bilaterais serão negativamente afetadas. \ No newline at end of file diff --git a/app_test.py b/app_test.py deleted file mode 100644 index 829f04856..000000000 --- a/app_test.py +++ /dev/null @@ -1,56 +0,0 @@ -import datetime -from unittest.mock import patch -from streamlit.testing.v1 import AppTest -from openai.types.chat import ChatCompletionMessage -from openai.types.chat.chat_completion import ChatCompletion, Choice - - -# See https://github.com/openai/openai-python/issues/715#issuecomment-1809203346 -def create_chat_completion(response: str, role: str = "assistant") -> ChatCompletion: - return ChatCompletion( - id="foo", - model="gpt-3.5-turbo", - object="chat.completion", - choices=[ - Choice( - finish_reason="stop", - index=0, - message=ChatCompletionMessage( - content=response, - role=role, - ), - ) - ], - created=int(datetime.datetime.now().timestamp()), - ) - - -@patch("openai.resources.chat.Completions.create") -def test_Chatbot(openai_create): - at = AppTest.from_file("Chatbot.py").run() - assert not at.exception - at.chat_input[0].set_value("Do you know any jokes?").run() - assert at.info[0].value == "Please add your OpenAI API key to continue." - - JOKE = "Why did the chicken cross the road? To get to the other side." - openai_create.return_value = create_chat_completion(JOKE) - at.text_input(key="chatbot_api_key").set_value("sk-...") - at.chat_input[0].set_value("Do you know any jokes?").run() - print(at) - assert at.chat_message[1].markdown[0].value == "Do you know any jokes?" - assert at.chat_message[2].markdown[0].value == JOKE - assert at.chat_message[2].avatar == "assistant" - assert not at.exception - - -@patch("langchain.llms.OpenAI.__call__") -def test_Langchain_Quickstart(langchain_llm): - at = AppTest.from_file("pages/3_Langchain_Quickstart.py").run() - assert at.info[0].value == "Please add your OpenAI API key to continue." - - RESPONSE = "1. The best way to learn how to code is by practicing..." - langchain_llm.return_value = RESPONSE - at.sidebar.text_input[0].set_value("sk-...") - at.button[0].set_value(True).run() - print(at) - assert at.info[0].value == RESPONSE diff --git a/content223.txt b/content223.txt new file mode 100644 index 000000000..10feeaaad --- /dev/null +++ b/content223.txt @@ -0,0 +1 @@ +Support_Result=[SupportResult(titulo='O Jogo de Xadrez de Moraes', proposta='Mostrar a jornada de Alexandre de Moraes como um jogo de xadrez, onde cada movimento (ameaça, sanção, decisão) é uma peça que influencia o resultado final. A alegoria do jogo de xadrez representa a complexidade da situação e a necessidade de estratégias precisas para proteger a soberania nacional.', impacto='A jornada de Alexandre de Moraes é impactada pela crescente pressão internacional e pela necessidade de tomar decisões estratégicas em meio a um cenário de ameaças e incertezas. Suas ações e reações podem revelar aspectos de sua personalidade e seus métodos de lidar com crises de grande magnitude.', abordagem_estrutural='A abordagem estrutural, baseada em linha do tempo, permite que a narrativa acompanhe a evolução da situação de Alexandre de Moraes, desde as ameaças de Trump até as possíveis sanções dos EUA, mostrando o impacto crescente desses eventos em sua vida e decisões.', recurso_narrativo='O recurso narrativo da alegoria é usado ao comparar a situação política a um jogo de xadrez. As ameaças e sanções representam as peças e movimentos do oponente, e as decisões de Moraes representam suas estratégias de defesa.', lugar_comum='A proposta evita o lugar comum ao se aprofundar nas nuances psicológicas e políticas da situação. Ao invés de simplesmente descrever os eventos, a narrativa explora os dilemas internos de Moraes, os cálculos políticos envolvidos e as possíveis consequências de suas escolhas. A alegoria adiciona uma camada de complexidade que evita clichês políticos.'), SupportResult(titulo='A Maré Alta', proposta="Apresentar a narrativa sob a perspectiva de Alexandre de Moraes, usando a alegoria da 'maré alta' para representar o aumento da pressão política. O nível da água (pressão) sobe gradualmente ao longo da linha do tempo, ameaçando submergir Moraes (e o Brasil).", impacto='A jornada de Alexandre de Moraes é mostrada sob a perspectiva de seu desgaste emocional e psicológico, mostrando como a pressão externa afeta suas decisões e seu bem-estar. A narrativa acompanha sua resiliência ou fragilidade diante do conflito.', abordagem_estrutural='A linha do tempo permite acompanhar a escalada das tensões entre Brasil e EUA, focando no impacto emocional e psicológico em Alexandre de Moraes. Começando com as declarações iniciais e culminando nas possíveis sanções, acompanhamos a evolução de seus sentimentos e ações.', recurso_narrativo="A alegoria da 'maré alta' simboliza a crescente pressão internacional sobre Moraes e o Brasil. A altura da maré representa a intensidade das ameaças, culminando em uma possível 'inundação' (sanções).", lugar_comum='Evita o lugar comum ao mostrar a dimensão humana da situação. Em vez de focar apenas na política, a narrativa explora o custo pessoal para Moraes, humanizando o personagem e adicionando profundidade à narrativa. A alegoria da pressão crescente como uma maré alta adiciona uma camada de dramaticidade.'), SupportResult(titulo='A Teia', proposta='Descrever a situação como uma teia de aranha, com Moraes no centro. Cada fio representa uma declaração, ameaça ou ação, e cada cruzamento afeta o resultado final. A alegoria da teia de aranha mostra a interconexão de todos os elementos e a fragilidade da situação.', impacto='A jornada de Alexandre de Moraes é marcada pela constante necessidade de tomar decisões em um ambiente hostil e sob pressão. Cada ato de seus oponentes o força a se adaptar e encontrar novas estratégias.', abordagem_estrutural='A linha do tempo permite construir o suspense, mostrando como as declarações e ameaças se conectam e evoluem. A narrativa detalha cada etapa, desde as primeiras declarações até as potenciais consequências, criando um arco narrativo completo.', recurso_narrativo='A alegoria da teia de aranha representa a complexidade da situação geopolítica, mostrando como cada ação (uma linha da teia) se conecta a outras e cria uma estrutura delicada e frágil.', lugar_comum="Evita o lugar comum ao focar nas nuances da estratégia política e nas implicações de cada ação. Ao invés de uma simples sequência de eventos, a narrativa explora as motivações por trás das ações e as possíveis respostas, evitando a visão simplista de 'herói' versus 'vilão'. A alegoria da teia de aranha reforça a complexidade da situação.")] \ No newline at end of file diff --git a/killloop.py b/killloop.py new file mode 100644 index 000000000..945cc2538 --- /dev/null +++ b/killloop.py @@ -0,0 +1,8 @@ +import asyncio + +async def my_async_function(): + print("Running async function") + +# Stop the current event loop +loop = asyncio.get_event_loop() +loop.stop() \ No newline at end of file diff --git a/logo/ComfyUI_00309_2.png b/logo/ComfyUI_00309_2.png new file mode 100644 index 000000000..641af226d Binary files /dev/null and b/logo/ComfyUI_00309_2.png differ diff --git a/pages/1_File_Q&A.py b/pages/1_File_Q&A.py deleted file mode 100644 index 417474c4f..000000000 --- a/pages/1_File_Q&A.py +++ /dev/null @@ -1,33 +0,0 @@ -import streamlit as st -import anthropic - -with st.sidebar: - anthropic_api_key = st.text_input("Anthropic API Key", key="file_qa_api_key", type="password") - "[View the source code](https://github.com/streamlit/llm-examples/blob/main/pages/1_File_Q%26A.py)" - "[![Open in GitHub Codespaces](https://github.com/codespaces/badge.svg)](https://codespaces.new/streamlit/llm-examples?quickstart=1)" - -st.title("📝 File Q&A with Anthropic") -uploaded_file = st.file_uploader("Upload an article", type=("txt", "md")) -question = st.text_input( - "Ask something about the article", - placeholder="Can you give me a short summary?", - disabled=not uploaded_file, -) - -if uploaded_file and question and not anthropic_api_key: - st.info("Please add your Anthropic API key to continue.") - -if uploaded_file and question and anthropic_api_key: - article = uploaded_file.read().decode() - prompt = f"""{anthropic.HUMAN_PROMPT} Here's an article:\n\n
- {article}\n\n
\n\n{question}{anthropic.AI_PROMPT}""" - - client = anthropic.Client(api_key=anthropic_api_key) - response = client.completions.create( - prompt=prompt, - stop_sequences=[anthropic.HUMAN_PROMPT], - model="claude-v1", # "claude-2" for Claude 2 model - max_tokens_to_sample=100, - ) - st.write("### Answer") - st.write(response.completion) diff --git a/pages/2_Chat_with_search.py b/pages/2_Chat_with_search.py deleted file mode 100644 index 399c58219..000000000 --- a/pages/2_Chat_with_search.py +++ /dev/null @@ -1,48 +0,0 @@ -import streamlit as st - -from langchain.agents import initialize_agent, AgentType -from langchain.callbacks import StreamlitCallbackHandler -from langchain.chat_models import ChatOpenAI -from langchain.tools import DuckDuckGoSearchRun - -with st.sidebar: - openai_api_key = st.text_input( - "OpenAI API Key", key="langchain_search_api_key_openai", type="password" - ) - "[Get an OpenAI API key](https://platform.openai.com/account/api-keys)" - "[View the source code](https://github.com/streamlit/llm-examples/blob/main/pages/2_Chat_with_search.py)" - "[![Open in GitHub Codespaces](https://github.com/codespaces/badge.svg)](https://codespaces.new/streamlit/llm-examples?quickstart=1)" - -st.title("🔎 LangChain - Chat with search") - -""" -In this example, we're using `StreamlitCallbackHandler` to display the thoughts and actions of an agent in an interactive Streamlit app. -Try more LangChain 🤝 Streamlit Agent examples at [github.com/langchain-ai/streamlit-agent](https://github.com/langchain-ai/streamlit-agent). -""" - -if "messages" not in st.session_state: - st.session_state["messages"] = [ - {"role": "assistant", "content": "Hi, I'm a chatbot who can search the web. How can I help you?"} - ] - -for msg in st.session_state.messages: - st.chat_message(msg["role"]).write(msg["content"]) - -if prompt := st.chat_input(placeholder="Who won the Women's U.S. Open in 2018?"): - st.session_state.messages.append({"role": "user", "content": prompt}) - st.chat_message("user").write(prompt) - - if not openai_api_key: - st.info("Please add your OpenAI API key to continue.") - st.stop() - - llm = ChatOpenAI(model_name="gpt-3.5-turbo", openai_api_key=openai_api_key, streaming=True) - search = DuckDuckGoSearchRun(name="Search") - search_agent = initialize_agent( - [search], llm, agent=AgentType.ZERO_SHOT_REACT_DESCRIPTION, handle_parsing_errors=True - ) - with st.chat_message("assistant"): - st_cb = StreamlitCallbackHandler(st.container(), expand_new_thoughts=False) - response = search_agent.run(st.session_state.messages, callbacks=[st_cb]) - st.session_state.messages.append({"role": "assistant", "content": response}) - st.write(response) diff --git a/pages/3_Langchain_Quickstart.py b/pages/3_Langchain_Quickstart.py deleted file mode 100644 index 38c820f24..000000000 --- a/pages/3_Langchain_Quickstart.py +++ /dev/null @@ -1,22 +0,0 @@ -import streamlit as st -from langchain.llms import OpenAI - -st.title("🦜🔗 Langchain Quickstart App") - -with st.sidebar: - openai_api_key = st.text_input("OpenAI API Key", type="password") - "[Get an OpenAI API key](https://platform.openai.com/account/api-keys)" - - -def generate_response(input_text): - llm = OpenAI(temperature=0.7, openai_api_key=openai_api_key) - st.info(llm(input_text)) - - -with st.form("my_form"): - text = st.text_area("Enter text:", "What are 3 key advice for learning how to code?") - submitted = st.form_submit_button("Submit") - if not openai_api_key: - st.info("Please add your OpenAI API key to continue.") - elif submitted: - generate_response(text) diff --git a/pages/4_Langchain_PromptTemplate.py b/pages/4_Langchain_PromptTemplate.py deleted file mode 100644 index 3755419ea..000000000 --- a/pages/4_Langchain_PromptTemplate.py +++ /dev/null @@ -1,29 +0,0 @@ -import streamlit as st -from langchain.llms import OpenAI -from langchain.prompts import PromptTemplate - -st.title("🦜🔗 Langchain - Blog Outline Generator App") - -openai_api_key = st.sidebar.text_input("OpenAI API Key", type="password") - - -def blog_outline(topic): - # Instantiate LLM model - llm = OpenAI(model_name="text-davinci-003", openai_api_key=openai_api_key) - # Prompt - template = "As an experienced data scientist and technical writer, generate an outline for a blog about {topic}." - prompt = PromptTemplate(input_variables=["topic"], template=template) - prompt_query = prompt.format(topic=topic) - # Run LLM model - response = llm(prompt_query) - # Print results - return st.info(response) - - -with st.form("myform"): - topic_text = st.text_input("Enter prompt:", "") - submitted = st.form_submit_button("Submit") - if not openai_api_key: - st.info("Please add your OpenAI API key to continue.") - elif submitted: - blog_outline(topic_text) diff --git a/pages/5_Chat_with_user_feedback.py b/pages/5_Chat_with_user_feedback.py deleted file mode 100644 index 5f58f139c..000000000 --- a/pages/5_Chat_with_user_feedback.py +++ /dev/null @@ -1,65 +0,0 @@ -from openai import OpenAI -import streamlit as st -from streamlit_feedback import streamlit_feedback -import trubrics - -with st.sidebar: - openai_api_key = st.text_input("OpenAI API Key", key="feedback_api_key", type="password") - "[Get an OpenAI API key](https://platform.openai.com/account/api-keys)" - "[View the source code](https://github.com/streamlit/llm-examples/blob/main/pages/5_Chat_with_user_feedback.py)" - "[![Open in GitHub Codespaces](https://github.com/codespaces/badge.svg)](https://codespaces.new/streamlit/llm-examples?quickstart=1)" - -st.title("📝 Chat with feedback (Trubrics)") - -""" -In this example, we're using [streamlit-feedback](https://github.com/trubrics/streamlit-feedback) and Trubrics to collect and store feedback -from the user about the LLM responses. -""" - -if "messages" not in st.session_state: - st.session_state.messages = [ - {"role": "assistant", "content": "How can I help you? Leave feedback to help me improve!"} - ] -if "response" not in st.session_state: - st.session_state["response"] = None - -messages = st.session_state.messages -for msg in messages: - st.chat_message(msg["role"]).write(msg["content"]) - -if prompt := st.chat_input(placeholder="Tell me a joke about sharks"): - messages.append({"role": "user", "content": prompt}) - st.chat_message("user").write(prompt) - - if not openai_api_key: - st.info("Please add your OpenAI API key to continue.") - st.stop() - client = OpenAI(api_key=openai_api_key) - response = client.chat.completions.create(model="gpt-3.5-turbo", messages=messages) - st.session_state["response"] = response.choices[0].message.content - with st.chat_message("assistant"): - messages.append({"role": "assistant", "content": st.session_state["response"]}) - st.write(st.session_state["response"]) - -if st.session_state["response"]: - feedback = streamlit_feedback( - feedback_type="thumbs", - optional_text_label="[Optional] Please provide an explanation", - key=f"feedback_{len(messages)}", - ) - # This app is logging feedback to Trubrics backend, but you can send it anywhere. - # The return value of streamlit_feedback() is just a dict. - # Configure your own account at https://trubrics.streamlit.app/ - if feedback and "TRUBRICS_EMAIL" in st.secrets: - config = trubrics.init( - email=st.secrets.TRUBRICS_EMAIL, - password=st.secrets.TRUBRICS_PASSWORD, - ) - collection = trubrics.collect( - component_name="default", - model="gpt", - response=feedback, - metadata={"chat": messages}, - ) - trubrics.save(config, collection) - st.toast("Feedback recorded!", icon="📝") diff --git a/requirements.txt b/requirements.txt index 36459684e..3f8097bed 100644 --- a/requirements.txt +++ b/requirements.txt @@ -6,3 +6,15 @@ anthropic>=0.3.0 trubrics>=1.4.3 streamlit-feedback langchain-community +python-dotenv +pika +langchain_anthropic +pymongo +typing +pydantic_ai +py2neo +jsonlite +python-dotenv +boto3 +streamlit_quill +streamlit-product-card \ No newline at end of file diff --git a/utils.py b/utils.py new file mode 100644 index 000000000..4e8cf8d4a --- /dev/null +++ b/utils.py @@ -0,0 +1,1401 @@ +import streamlit as st +import os +import boto3 +from botocore.client import Config +import pika +import json +import time +import re +from dotenv import load_dotenv +from py2neo import Graph + +load_dotenv() + +@st.fragment() +def getFatos(autor, documento): + NEO4J_URI = st.secrets.NEO4J_URI + NEO4J_USER = st.secrets.NEO4J_USER + NEO4J_PASSWORD = st.secrets.NEO4J_PASSWORD + # Connect to the Neo4j database + graph = Graph(NEO4J_URI, auth=(NEO4J_USER, NEO4J_PASSWORD)) + query = f""" + MATCH (a:AtomicFact)<-[:HAS_ATOMIC_FACT]-(c:Chunk)<-[:HAS_CHUNK]-(d:Document) + WHERE d.autor = \"{autor}\" and d.id = \"{documento}\" + RETURN DISTINCT a.text as fato + """ + + results = graph.run(query) + + retorno = [] + + for fatos in results: + retorno.append(fatos["fato"]) + + return retorno + +@st.fragment() +def getPersonagens(autor, documento): + NEO4J_URI = st.secrets.NEO4J_URI + NEO4J_USER = st.secrets.NEO4J_USER + NEO4J_PASSWORD = st.secrets.NEO4J_PASSWORD + # Connect to the Neo4j database + graph = Graph(NEO4J_URI, auth=(NEO4J_USER, NEO4J_PASSWORD)) + query = f""" + MATCH (k:Character)<-[:Character]-(a:AtomicFact)<-[:HAS_ATOMIC_FACT]-(c:Chunk)<-[:HAS_CHUNK]-(d:Document) + WHERE d.autor = \"{autor}\" and d.id = \"{documento}\" + RETURN DISTINCT k.text as character + """ + + results = graph.run(query) + + retorno = [] + + for character in results: + retorno.append(character["character"]) + + return retorno + +def verificaDocumento(documento, autor): + NEO4J_URI = st.secrets.NEO4J_URI + NEO4J_USER = st.secrets.NEO4J_USER + NEO4J_PASSWORD = st.secrets.NEO4J_PASSWORD + # Connect to the Neo4j database + graph = Graph(NEO4J_URI, auth=(NEO4J_USER, NEO4J_PASSWORD)) + query = f""" + MATCH (d:Document) + WHERE d.autor = "{autor}" AND d.id = "{documento}" + RETURN COUNT(d) > 0 AS documentExists + """ + result = graph.run(query) + record = result.evaluate() + + return record + +# True se tiver que retornar narrativas com mais de um personagem. Por padrão, Falso. +def listaDocumentos(autor, maisUmPersonagem = False): + NEO4J_URI = st.secrets.NEO4J_URI + NEO4J_USER = st.secrets.NEO4J_USER + NEO4J_PASSWORD = st.secrets.NEO4J_PASSWORD + # Connect to the Neo4j database + graph = Graph(NEO4J_URI, auth=(NEO4J_USER, NEO4J_PASSWORD)) + query = "" + + + if (maisUmPersonagem): + query = f""" + MATCH (k:Character)<-[:Character]-(a:AtomicFact)<-[:HAS_ATOMIC_FACT]-(c:Chunk)<-[:HAS_CHUNK]-(d:Document) + WHERE d.autor = \"{autor}\" and d.contexto = 'NOVA_NARRATIVA' + WITH d.id AS conteudo, COUNT(DISTINCT k) AS characterCount + WHERE characterCount > 1 + RETURN conteudo + """ + else: + query = f""" + MATCH (d:Document) + WHERE d.autor = \"{autor}\" and d.contexto = 'NOVA_NARRATIVA' + RETURN DISTINCT d.id as conteudo + """ + + + results = graph.run(query) + + retorno = [] + + for x in results: + retorno.append(x["conteudo"]) + + return retorno + + +@st.fragment() +def sanitize_string(input_string): + # Define the regex pattern + pattern = r'^[a-zA-Z0-9.\-_]{1,255}$' + + # Check if the string matches the regex + if re.match(pattern, input_string): + return input_string # String is already valid + + # Sanitize the string: remove invalid characters + sanitized = re.sub(r'[^a-zA-Z0-9.\-_]', '', input_string) + + # Truncate to 255 characters if necessary + return sanitized[:255] + +@st.fragment() +def updateFile(filename, usuario, content): + # st.write(content) + session = boto3.session.Session() + client = session.client('s3', + endpoint_url=st.secrets.BUCKET_ENDPOINT, + config=Config(s3={'addressing_style': 'virtual'}), + region_name=st.secrets.BUCKET_REGION_NAME, + aws_access_key_id=st.secrets.BUCKET_ACCESS_ID, + aws_secret_access_key=st.secrets.BUCKET_ACCESS_KEY) + + + userspace = sanitize_string(usuario) + path = userspace + "/" + filename + + isCreated = False + r = client.list_objects(Bucket=st.secrets.BUCKET_NAME) + if r.get('Contents') is not None: + for n in r.get('Contents'): + if path in n['Key']: + isCreated = True + break + + # Create a new Space. + if not isCreated: + client.put_object(Bucket=st.secrets.BUCKET_NAME, + Key=path, # Object key, referenced whenever you want to access this file later. + Body=content, # The object's contents. + ACL='private', # Defines Access-control List (ACL) permissions, such as private or public. + Metadata={ # Defines metadata tags. + 'user': usuario + } + ) + +@st.fragment() +def solicitaCargaBaseConhecimento(document_name, AUTOR, CONTEXTO, IDIOMA, PERSONA): + + message = { + "DOCUMENT_NAME": document_name, + "AUTOR": AUTOR, + "CONTEXTO": CONTEXTO, + "IDIOMA": IDIOMA, + "PERSONA": PERSONA + } + # Convert the message to a JSON string + message_json = json.dumps(message) + + credentials = pika.PlainCredentials(st.secrets.rabbitmq_user, st.secrets.rabbitmq_user_password) + connection = pika.BlockingConnection(pika.ConnectionParameters(st.secrets.rabbitmq_server, credentials=credentials)) + channel = connection.channel() + # Declare a queue + channel.queue_declare(queue=st.secrets.QUEUE_KNOWLEDGE_DB) + + # Publish the JSON message to the queue + channel.basic_publish(exchange='', + routing_key=st.secrets.QUEUE_KNOWLEDGE_DB, + body=message_json) + connection.close() + + +def carrega_fatos(documento, personagem, autor) -> str: + fatos = "" + NEO4J_URI = st.secrets.NEO4J_URI + NEO4J_USER = st.secrets.NEO4J_USER + NEO4J_PASSWORD = st.secrets.NEO4J_PASSWORD + + graph = Graph(NEO4J_URI, auth=(NEO4J_USER, NEO4J_PASSWORD)) + + # Fatos Atomicos mais relevantes para um personagem especifico + qry_Relevant_Facts_About_Character = f""" + MATCH (c:Character) + WHERE c.text = \"{personagem}\" + WITH c + MATCH (a:AtomicFact) + WHERE (a)-[:Character]->(c) + WITH a + MATCH (k:Chunk) + WHERE (k)-[:HAS_ATOMIC_FACT]->(a) + WITH k,a + MATCH (d:Document) + WHERE (d)-[:HAS_CHUNK]->(k) and d.id = \"{documento}\" and d.autor = \"{autor}\" + RETURN a.text as texto + """ + + results = graph.run(qry_Relevant_Facts_About_Character) + # Process and print the results + for record in results: + texto = record["texto"] + fatos += f"Fato: {texto}\n" + + return fatos + + +instrucoes = """ +Iremos construir um filme juntos! Para isso vamos construir uma história narrativa separada em cenas e com foco em um personagem. + +O Personagem foco da história é: {personagem}. + +A história deverá se basear nas seguintes propostas diretivas: {nova_historia}. + +O tom da narrativa deve estar alinhado com o estilo geral da proposta, seja ele comico, esperançoso, trágico, misterioso ou aberto. + +IMPORTANTE: O RESULTADO DA HISTÓRIA DEVE SER NUM FORMATO DE CENAS OU ATOS SEPARADOS POR PARÁGRAFOS E DE FORMA A SER POSSIVEL CONSTRUIR UM VIDEO/FILME A PARTIR DA NARRATIVA. LOGO AS CENAS DEVEM SER VISUALMENTE INTERESSANTES. + +IMPORTANTE: SOMENTE O TEXTO DEVE SER A SAÍDA! NÃO INCLUIR QUALQUER REFERENCIA AS DECISÕES TOMADAS, SOBRE OS PARAMETROS DE ENTRADA E QUALQUER OUTRA INFORMAÇÃO QUE NÃO SEJA ESTRITAMENTE SOBRE A HISTÓRIA!!! + +NÃO INCLUIR O TITULO NA NARRATIVA FINAL. + +IMPORTANTE: O RESULTADO DEVE SER ESCRITO NO IDIOMA: {IDIOMA} + +""" + + +PROMPT_FINAL_TEXTO_INICIANTE = """ + +Você é uma inteligência artificial especialista em storytelling. + +Sua missão é criar narrativas envolventes, originais e bem estruturadas com base nos elementos fornecidos. + +Use criatividade, coerência e emoção para transformar ideias em histórias que conectam, inspiram e prendem a atenção do público. + +O titulo da nova historia é: {titulo} + +A narrativa deve ser baseada na seguinte proposta: +{nova_historia} + +################################ + +AS NARRATIVAS ESTÃO SENDO CRIADAS PELO SEGUINTE MOTIVO/OBJETIVO: + +{USO_HISTORIA} + + +OS FATOS QUE SUBSIDIAM A NARRATIVA SAO OS SEGUINTES: + +{FACTS} + +IMPORTANTE: O RESULTADO DEVE SER ESCRITO NO IDIOMA: {IDIOMA} + +""" + + + +PROMPT_PERSONAGEM = """ + +VOCE É UM CONTADOR DE ESTÓRIAS, ESPECIALISTA EM SUGERIR IDEIAS DE COMO UM TEXTO PODE SE TRANSFORMAR EM UMA BOA ESTORIA. + +PRECISO QUE ME DÊ {COUNT} IDÉIAS DE COMO AVANÇAR COM A ESCRITA DO MEU LIVRO/CONTO. + +O FOCO DA SUGESTAO DEVE SER NO PERSONAGEM: {PERSONAGEM}. + + +PARA CADA UMA DAS {COUNT} IDEIAS, CONSIDERE: + +################################ +CONSIDERE A SEGUINTE ABORDAGEM ESTRUTURAL PARA CONDUZIR A PROPOSTA DE IDEIAS/SUGESTÕES PARA EVOLUIR A NARRATIVA: + +{STRUCTURE} + +################################ +CONSIDERE O SEGUINTE RECURSO NARRATIVO PARA CONDUZIR A PROPOSTA DE IDEIAS/SUGESTÕES DA NARRATIVA: +{RECURSO} + +################################ +A NARRATIVA RESUMIDA ESTÁ A SEGUIR + +{NARRATIVE} + +################################ +FATOS MAIS RELEVANTES QUE DEVEM SER CONSIDERADOS NA SUA SUGESTÃO: + +{FACTS} + +O tom das sugestões deve estar alinhado com o estilo geral da história, seja ele esperançoso, trágico, misterioso ou aberto. + + +Ao final, apresente ao usuário as seguintes informações por tópicos: + + +IMPORTANTE: MANTER REFERENCIA A NARRATIVA E A PERSONAGEM NA PROPOSTA GERADA!! + +- Titulo: Um titulo que resume a ideia proposta. +- Proposta: Ideia que deverá evoluir com base na NARRATIVA, na PERSONAGEM, estrutura e recurso narrativo sugerido pelo usuário. +- Personagem: Como a ideia impacta a jornada do personagem? +- De que forma a ideia está relacionada à abordagem estrutural proposta? (Ex.: A alternância emocional é alcançada através das indecisões do personagem .....) +- De que forma o recurso narrativo foi abordado? (ex.: incluí a Alegoria ao sugerir que o amor fosse representado através da relação entre o algodão e a desfiadeira....) +- Como a proposta sugerida evita que o escritor caia no lugar comum em relação a seu conteúdo? + +IMPORTANTE: O RESULTADO DEVE SER ESCRITO NO IDIOMA: {IDIOMA} + +""" + +PROMPT_FATO = """ + +VOCE É UM CONTADOR DE ESTÓRIAS, ESPECIALISTA EM SUGERIR IDEIAS DE COMO UM TEXTO PODE SE TRANSFORMAR EM UMA BOA ESTORIA. + +PRECISO QUE ME DÊ {COUNT} IDÉIAS DE COMO AVANÇAR COM A ESCRITA DO MEU LIVRO/CONTO. + +O FOCO DA SUGESTAO DEVE SER NO FATO: {FATO}. + +PARA CADA UMA DAS {COUNT} IDEIAS, CONSIDERE: + +################################ +CONSIDERE A SEGUINTE ABORDAGEM ESTRUTURAL PARA CONDUZIR A PROPOSTA DE IDEIAS/SUGESTÕES PARA EVOLUIR A NARRATIVA: + +{STRUCTURE} + +################################ +CONSIDERE O SEGUINTE RECURSO NARRATIVO PARA CONDUZIR A PROPOSTA DE IDEIAS/SUGESTÕES DA NARRATIVA: +{RECURSO} + +################################ +A NARRATIVA RESUMIDA ESTÁ A SEGUIR + +{NARRATIVE} + +################################ +FATOS MAIS RELEVANTES QUE DEVEM SER CONSIDERADOS NA SUA SUGESTÃO: + +{FACTS} + +O tom das sugestões deve estar alinhado com o estilo geral da história, seja ele esperançoso, trágico, misterioso ou aberto. + + +Ao final, apresente ao usuário as seguintes informações por tópicos: + + +IMPORTANTE: MANTER REFERENCIA A NARRATIVA E A PERSONAGEM NA PROPOSTA GERADA!! + +- Titulo: Um titulo que resume a ideia proposta. +- Proposta: Ideia que deverá evoluir com base na NARRATIVA, na PERSONAGEM, estrutura e recurso narrativo sugerido pelo usuário. +- Personagem: Como a ideia impacta a jornada do personagem? +- De que forma a ideia está relacionada à abordagem estrutural proposta? (Ex.: A alternância emocional é alcançada através das indecisões do personagem .....) +- De que forma o recurso narrativo foi abordado? (ex.: incluí a Alegoria ao sugerir que o amor fosse representado através da relação entre o algodão e a desfiadeira....) +- Como a proposta sugerida evita que o escritor caia no lugar comum em relação a seu conteúdo? + +IMPORTANTE: O RESULTADO DEVE SER ESCRITO NO IDIOMA: {IDIOMA} + + + +""" + +PROMPT_TEXTO_AVANCADO = """ +Você é uma inteligência artificial especialista em storytelling. + +Sua missão é criar narrativas envolventes, originais e bem estruturadas com base nos elementos fornecidos. + +Use criatividade, coerência e emoção para transformar ideias em histórias que conectam, inspiram e prendem a atenção do público. + +PRECISO QUE ME DÊ {COUNT} PROPOSTAS DE COMO CRIAR NARRATIVAS. + +################################ +ESTRUTURA(S) DAS NARRATIVAS PROPOSTAS DA SEGUINTE FORMA: +{ESTRUTURA} + + +################################ +RECURSOS DAS NARRATIVAS PROPOSTAS DA SEGUINTE FORMA: +{RECURSO} + +################################ +AS NARRATIVAS ESTÃO SENDO CRIADAS PELO SEGUINTE MOTIVO/OBJETIVO: + +{USO_HISTORIA} + +################################ +FATOS MAIS RELEVANTES QUE DEVEM SER CONSIDERADOS NA CONSTRUÇÃO DAS NARRATIVAS PROPOSTAS: + +{FACTS} + +Ao final, apresente ao usuário as seguintes informações por NARRATIVA PROPOSTA: + +- Titulo: Um titulo que resume a narrativa proposta. +- Proposta: Proposta que deverá evoluir com base na NARRATIVA, na PERSONAGEM, estrutura e recurso narrativo e motivo/objetivo sugerido pelo usuário. + + +IMPORTANTE: O RESULTADO DEVE SER ESCRITO NO IDIOMA: {IDIOMA} + +""" + + +PROMPT_TEXTO_INTERMEDIARIO = """ +Você é uma inteligência artificial especialista em storytelling. + +Sua missão é criar narrativas envolventes, originais e bem estruturadas com base nos elementos fornecidos. + +Use criatividade, coerência e emoção para transformar ideias em histórias que conectam, inspiram e prendem a atenção do público. + +PRECISO QUE ME DÊ {COUNT} PROPOSTAS DE COMO CRIAR NARRATIVAS. + + +################################ +ESTRUTURA DAS NARRATIVAS PROPOSTAS DA SEGUINTE FORMA: +{ESTRUTURA} + + +################################ +RECURSOS DAS NARRATIVAS PROPOSTAS DA SEGUINTE FORMA: +{RECURSO} + +################################ +AS NARRATIVAS ESTÃO SENDO CRIADAS PELO SEGUINTE MOTIVO/OBJETIVO: + +{USO_HISTORIA} + +################################ +FATOS MAIS RELEVANTES QUE DEVEM SER CONSIDERADOS NA CONSTRUÇÃO DAS NARRATIVAS PROPOSTAS: + +{FACTS} + +Ao final, apresente ao usuário as seguintes informações por NARRATIVA PROPOSTA: + +- Titulo: Um titulo que resume a narrativa proposta. +- Proposta: Proposta que deverá evoluir com base na NARRATIVA, na PERSONAGEM, estrutura e recurso narrativo e motivo/objetivo sugerido pelo usuário. + + +IMPORTANTE: O RESULTADO DEVE SER ESCRITO NO IDIOMA: {IDIOMA} + +""" + + +PROMPT_FATO_AVANCADO = """ +Você é uma inteligência artificial especialista em storytelling. + +Sua missão é criar narrativas envolventes, originais e bem estruturadas com base nos elementos fornecidos. + +Use criatividade, coerência e emoção para transformar ideias em histórias que conectam, inspiram e prendem a atenção do público. + +PRECISO QUE ME DÊ {COUNT} PROPOSTAS DE COMO CRIAR NARRATIVAS. + +Todas as Narrativas PROPOSTAS possuem foco no fato: {FATO} + +################################ +ESTRUTURAS DAS NARRATIVAS PROPOSTAS DA SEGUINTE FORMA: +{ESTRUTURA} + + +################################ +RECURSOS DAS NARRATIVAS PROPOSTAS DA SEGUINTE FORMA: +{RECURSO} + +################################ +AS NARRATIVAS ESTÃO SENDO CRIADAS PELO SEGUINTE MOTIVO/OBJETIVO: + +{USO_HISTORIA} + +################################ +FATOS MAIS RELEVANTES QUE DEVEM SER CONSIDERADOS NA CONSTRUÇÃO DAS NARRATIVAS PROPOSTAS: + +{FACTS} + +Ao final, apresente ao usuário as seguintes informações por NARRATIVA PROPOSTA: + +- Titulo: Um titulo que resume a narrativa proposta. +- Proposta: Proposta que deverá evoluir com base na NARRATIVA, na PERSONAGEM, estrutura e recurso narrativo e motivo/objetivo sugerido pelo usuário. + + +IMPORTANTE: O RESULTADO DEVE SER ESCRITO NO IDIOMA: {IDIOMA} + +""" + +PROMPT_FATO_INTERMEDIARIO = """ +Você é uma inteligência artificial especialista em storytelling. + +Sua missão é criar narrativas envolventes, originais e bem estruturadas com base nos elementos fornecidos. + +Use criatividade, coerência e emoção para transformar ideias em histórias que conectam, inspiram e prendem a atenção do público. + +PRECISO QUE ME DÊ {COUNT} PROPOSTAS DE COMO CRIAR NARRATIVAS. + +Todas as Narrativas PROPOSTAS possuem foco no fato: {FATO} + +################################ +ESTRUTURA DAS NARRATIVAS PROPOSTAS DA SEGUINTE FORMA: +{ESTRUTURA} + + +################################ +RECURSOS DAS NARRATIVAS PROPOSTAS DA SEGUINTE FORMA: +{RECURSO} + +################################ +AS NARRATIVAS ESTÃO SENDO CRIADAS PELO SEGUINTE MOTIVO/OBJETIVO: + +{USO_HISTORIA} + +################################ +FATOS MAIS RELEVANTES QUE DEVEM SER CONSIDERADOS NA CONSTRUÇÃO DAS NARRATIVAS PROPOSTAS: + +{FACTS} + +Ao final, apresente ao usuário as seguintes informações por NARRATIVA PROPOSTA: + +- Titulo: Um titulo que resume a narrativa proposta. +- Proposta: Proposta que deverá evoluir com base na NARRATIVA, na PERSONAGEM, estrutura e recurso narrativo e motivo/objetivo sugerido pelo usuário. + + +IMPORTANTE: O RESULTADO DEVE SER ESCRITO NO IDIOMA: {IDIOMA} + +""" + + +PROMPT_PERSONAGEM_AVANCADO = """ +Você é uma inteligência artificial especialista em storytelling. + +Sua missão é criar narrativas envolventes, originais e bem estruturadas com base nos elementos fornecidos. + +Use criatividade, coerência e emoção para transformar ideias em histórias que conectam, inspiram e prendem a atenção do público. + +PRECISO QUE ME DÊ {COUNT} PROPOSTAS DE COMO CRIAR NARRATIVAS. + +Todas as Narrativas PROPOSTAS possuem foco no personagem: {PERSONAGEM} + +################################ +ESTRUTURAS DAS NARRATIVAS PROPOSTAS DA SEGUINTE FORMA: +{ESTRUTURA} + + +################################ +RECURSOS DAS NARRATIVAS PROPOSTAS DA SEGUINTE FORMA: +{RECURSO} + +################################ +AS NARRATIVAS ESTÃO SENDO CRIADAS PELO SEGUINTE MOTIVO/OBJETIVO: +{USO_HISTORIA} + +################################ +FATOS MAIS RELEVANTES QUE DEVEM SER CONSIDERADOS NA CONSTRUÇÃO DAS NARRATIVAS PROPOSTAS: +{FACTS} + +Ao final, apresente ao usuário as seguintes informações por NARRATIVA PROPOSTA: + +- Titulo: Um titulo que resume a narrativa proposta. +- Proposta: Proposta que deverá evoluir com base na NARRATIVA, na PERSONAGEM, estrutura e recurso narrativo e motivo/objetivo sugerido pelo usuário. + + +IMPORTANTE: O RESULTADO DEVE SER ESCRITO NO IDIOMA: {IDIOMA} + +""" + +PROMPT_PERSONAGEM_INTERMEDIARIO = """ +Você é uma inteligência artificial especialista em storytelling. + +Sua missão é criar narrativas envolventes, originais e bem estruturadas com base nos elementos fornecidos. + +Use criatividade, coerência e emoção para transformar ideias em histórias que conectam, inspiram e prendem a atenção do público. + +PRECISO QUE ME DÊ {COUNT} PROPOSTAS DE COMO CRIAR NARRATIVAS. + +Todas as Narrativas PROPOSTAS possuem foco no personagem: {PERSONAGEM} + +################################ +ESTRUTURA DAS NARRATIVAS PROPOSTAS DA SEGUINTE FORMA: +{ESTRUTURA} + + +################################ +RECURSOS DAS NARRATIVAS PROPOSTAS DA SEGUINTE FORMA: +{RECURSO} + +################################ +AS NARRATIVAS ESTÃO SENDO CRIADAS PELO SEGUINTE MOTIVO/OBJETIVO: +{USO_HISTORIA} + +################################ +FATOS MAIS RELEVANTES QUE DEVEM SER CONSIDERADOS NA CONSTRUÇÃO DAS NARRATIVAS PROPOSTAS: +{FACTS} + +Ao final, apresente ao usuário as seguintes informações por NARRATIVA PROPOSTA: + +- Titulo: Um titulo que resume a narrativa proposta. +- Proposta: Proposta que deverá evoluir com base na NARRATIVA, na PERSONAGEM, estrutura e recurso narrativo e motivo/objetivo sugerido pelo usuário. + + +IMPORTANTE: O RESULTADO DEVE SER ESCRITO NO IDIOMA: {IDIOMA} + +""" + + +PROMPT_PERSONAGEM_INICIANTE = """ +Você é uma inteligência artificial especialista em storytelling. + +Sua missão é criar narrativas envolventes, originais e bem estruturadas com base nos elementos fornecidos. + +Use criatividade, coerência e emoção para transformar ideias em histórias que conectam, inspiram e prendem a atenção do público. + +PRECISO QUE ME DÊ {COUNT} PROPOSTAS DE COMO CRIAR NARRATIVAS. + +Todas as Narrativas PROPOSTAS possuem foco no personagem: {PERSONAGEM} + +################################ +ESTRUTURA E RECURSOS DAS NARRATIVAS PROPOSTAS DA SEGUINTE FORMA: + + +{RECURSO_INICIANTE} + +################################ +AS NARRATIVAS ESTÃO SENDO CRIADAS PELO SEGUINTE MOTIVO/OBJETIVO: + +{USO_HISTORIA} + +################################ +FATOS MAIS RELEVANTES QUE DEVEM SER CONSIDERADOS NA CONSTRUÇÃO DAS NARRATIVAS PROPOSTAS: + +{FACTS} + +Ao final, apresente ao usuário as seguintes informações por NARRATIVA PROPOSTA: + +- Titulo: Um titulo que resume a narrativa proposta. +- Proposta: Proposta que deverá evoluir com base na NARRATIVA, na PERSONAGEM, estrutura e recurso narrativo e motivo/objetivo sugerido pelo usuário. + + +IMPORTANTE: O RESULTADO DEVE SER ESCRITO NO IDIOMA: {IDIOMA} + +""" + + +PROMPT_FATO_INICIANTE = """ +Você é uma inteligência artificial especialista em storytelling. + +Sua missão é criar narrativas envolventes, originais e bem estruturadas com base nos elementos fornecidos. + +Use criatividade, coerência e emoção para transformar ideias em histórias que conectam, inspiram e prendem a atenção do público. + +PRECISO QUE ME DÊ {COUNT} PROPOSTAS DE COMO CRIAR NARRATIVAS. + +Todas as Narrativas PROPOSTAS possuem foco no fato: {FATO} + +################################ +ESTRUTURA E RECURSOS DAS NARRATIVAS PROPOSTAS DA SEGUINTE FORMA: + + +{RECURSO_INICIANTE} + +################################ +AS NARRATIVAS ESTÃO SENDO CRIADAS PELO SEGUINTE MOTIVO/OBJETIVO: + +{USO_HISTORIA} + +################################ +FATOS MAIS RELEVANTES QUE DEVEM SER CONSIDERADOS NA CONSTRUÇÃO DAS NARRATIVAS PROPOSTAS: + +{FACTS} + +Ao final, apresente ao usuário as seguintes informações por NARRATIVA PROPOSTA: + +- Titulo: Um titulo que resume a narrativa proposta. +- Proposta: Proposta que deverá evoluir com base na NARRATIVA, na PERSONAGEM, estrutura e recurso narrativo e motivo/objetivo sugerido pelo usuário. + + +IMPORTANTE: O RESULTADO DEVE SER ESCRITO NO IDIOMA: {IDIOMA} + +""" + + +PROMPT_TEXTO_INICIANTE = """ +Você é uma inteligência artificial especialista em storytelling. + +Sua missão é criar narrativas envolventes, originais e bem estruturadas com base nos elementos fornecidos. + +Use criatividade, coerência e emoção para transformar ideias em histórias que conectam, inspiram e prendem a atenção do público. + +PRECISO QUE ME DÊ {COUNT} PROPOSTAS DE COMO CRIAR NARRATIVAS. + + +################################ +ESTRUTURA E RECURSOS DAS NARRATIVAS PROPOSTAS DA SEGUINTE FORMA: + + +{RECURSO_INICIANTE} + +################################ +AS NARRATIVAS ESTÃO SENDO CRIADAS PELO SEGUINTE MOTIVO/OBJETIVO: + +{USO_HISTORIA} + +################################ +FATOS MAIS RELEVANTES QUE DEVEM SER CONSIDERADOS NA CONSTRUÇÃO DAS NARRATIVAS PROPOSTAS: + +{FACTS} + +Ao final, apresente ao usuário as seguintes informações por NARRATIVA PROPOSTA: + +- Titulo: Um titulo que resume a narrativa proposta. +- Proposta: Proposta que deverá evoluir com base na NARRATIVA, na PERSONAGEM, estrutura e recurso narrativo e motivo/objetivo sugerido pelo usuário. + + +IMPORTANTE: O RESULTADO DEVE SER ESCRITO NO IDIOMA: {IDIOMA} + +""" + +def getPromptPersonagemIniciante(COUNT, PERSONAGEM, RECURSO_INICIANTE, USO_HISTORIA, FACTS, IDIOMA): + return PROMPT_PERSONAGEM_INICIANTE.format( + COUNT=COUNT, + PERSONAGEM=PERSONAGEM, + RECURSO_INICIANTE=RECURSO_INICIANTE, + USO_HISTORIA=USO_HISTORIA, + FACTS=FACTS, + IDIOMA=IDIOMA + ) + +def getPromptPersonagemIntermediario(COUNT, PERSONAGEM, RECURSO, ESTRUTURA, USO_HISTORIA, FACTS, IDIOMA): + return PROMPT_PERSONAGEM_INTERMEDIARIO.format( + COUNT=COUNT, + PERSONAGEM=PERSONAGEM, + RECURSO=RECURSO, + ESTRUTURA=ESTRUTURA, + USO_HISTORIA=USO_HISTORIA, + FACTS=FACTS, + IDIOMA=IDIOMA + ) + +def getPromptPersonagemAvancado(COUNT, PERSONAGEM, RECURSO, ESTRUTURA, USO_HISTORIA, FACTS, IDIOMA): + return PROMPT_PERSONAGEM_AVANCADO.format( + COUNT=COUNT, + PERSONAGEM=PERSONAGEM, + RECURSO=RECURSO, + ESTRUTURA=ESTRUTURA, + USO_HISTORIA=USO_HISTORIA, + FACTS=FACTS, + IDIOMA=IDIOMA + ) + +def getPromptFatoIniciante(COUNT, FATO, RECURSO_INICIANTE, USO_HISTORIA, FACTS, IDIOMA): + return PROMPT_FATO_INICIANTE.format( + COUNT=COUNT, + FATO=FATO, + RECURSO_INICIANTE=RECURSO_INICIANTE, + USO_HISTORIA=USO_HISTORIA, + FACTS=FACTS, + IDIOMA=IDIOMA + ) + +def getPromptFatoIntermediario(COUNT, FATO, RECURSO, ESTRUTURA, USO_HISTORIA, FACTS, IDIOMA): + return PROMPT_FATO_INTERMEDIARIO.format( + COUNT=COUNT, + FATO=FATO, + RECURSO=RECURSO, + ESTRUTURA=ESTRUTURA, + USO_HISTORIA=USO_HISTORIA, + FACTS=FACTS, + IDIOMA=IDIOMA + ) + +def getPromptFatoAvancado(COUNT, FATO, RECURSO, ESTRUTURA, USO_HISTORIA, FACTS, IDIOMA): + return PROMPT_FATO_AVANCADO.format( + COUNT=COUNT, + FATO=FATO, + RECURSO=RECURSO, + ESTRUTURA=ESTRUTURA, + USO_HISTORIA=USO_HISTORIA, + FACTS=FACTS, + IDIOMA=IDIOMA + ) + +def getPromptTextoIniciante(COUNT, RECURSO_INICIANTE, USO_HISTORIA, FACTS, IDIOMA): + return PROMPT_TEXTO_INICIANTE.format( + COUNT=COUNT, + RECURSO_INICIANTE=RECURSO_INICIANTE, + USO_HISTORIA=USO_HISTORIA, + FACTS=FACTS, + IDIOMA=IDIOMA + ) + + +def getPromptTextoIntermediario(COUNT, RECURSO,ESTRUTURA, USO_HISTORIA, FACTS, IDIOMA): + return PROMPT_TEXTO_INTERMEDIARIO.format( + COUNT=COUNT, + RECURSO=RECURSO, + ESTRUTURA=ESTRUTURA, + USO_HISTORIA=USO_HISTORIA, + FACTS=FACTS, + IDIOMA=IDIOMA + ) + +def getPromptTextoAvancado(COUNT, RECURSO,ESTRUTURA, USO_HISTORIA, FACTS, IDIOMA): + return PROMPT_TEXTO_AVANCADO.format( + COUNT=COUNT, + RECURSO=RECURSO, + ESTRUTURA=ESTRUTURA, + USO_HISTORIA=USO_HISTORIA, + FACTS=FACTS, + IDIOMA=IDIOMA + ) + +def getPromptFinalTextoIniciante(nova_historia,titulo, USO_HISTORIA, FACTS, IDIOMA): + return PROMPT_FINAL_TEXTO_INICIANTE.format( + nova_historia = nova_historia, + titulo=titulo, + USO_HISTORIA=USO_HISTORIA, + FACTS=FACTS, + IDIOMA=IDIOMA + ) + + +# def getPromptTipoHistoria(tipo, personagem, fato): +# saida = "" +# if uso == "Personagem": +# saida = f"Crie uma narrativa envolvente a partir da história de {personagem}." +# elif uso == "Texto": +# saida = f"Crie uma narrativa " +# elif uso == "Fato": +# saida = f"Crie uma narrativa envolvente a partir do fato \"{fato}\"." +# return saida + +def getPromptUsoHistoria(uso): + saida = "" + if uso == "REDE_SOCIAL": + saida = "Crie uma narrativa envolvente e concisa, desenvolvida especificamente para o formato de vídeo curto (como Reels, TikTok ou Shorts). A história deve capturar a atenção nos primeiros segundos, desenvolver-se com ritmo ágil e terminar com uma mensagem clara ou emocionalmente marcante. Ideal para gerar conexão e engajamento em plataformas sociais." + elif uso == "PODCAST": + saida = "Crie uma narrativa pensada especificamente para o formato de áudio, como podcasts, audioclipes ou narrativas faladas. A história deve ser envolvente desde os primeiros segundos, com ritmo fluido, linguagem acessível e imagens mentais fortes, explorando recursos como entonação, pausa e emoção para manter o ouvinte conectado até o fim." + elif uso == "CONTEUDO": + saida = "Crie uma narrativa clara, envolvente e bem estruturada, desenvolvida especialmente para ser utilizada em formato de texto escrito — como em livros, panfletos, websites ou materiais institucionais. A história deve ser adaptada ao suporte escolhido, com atenção ao tom, à organização das ideias e ao impacto da mensagem, garantindo leitura fluida e conexão com o público-alvo." + return saida + + +# Prompt para Recursos Iniciantes + +def getPromptRecursoIniciante(recurso): + saida = "" + if recurso == "IMPACTO_INICIO": + saida = "Crie uma narrativa que comece de forma impactante e envolvente, com uma cena ou acontecimento que prenda imediatamente a atenção do leitor. Pense em estruturas ideais para redes sociais, vídeos curtos ou qualquer formato que exija impacto nos primeiros segundos. A história deve despertar curiosidade, emoção ou surpresa logo nas primeiras linhas." + elif recurso == "MINHA_VERDADE": + saida = "Crie uma narrativa em forma de posicionamento pessoal que vá além de um simples desabafo. A mensagem deve revelar valores, opiniões ou princípios do narrador, estruturada de forma clara e intencional. Ideal para especialistas ou influenciadores que desejam se conectar com seu público com autenticidade, autoridade e propósito." + elif recurso == "BASTIDORES_SEGREDOS": + saida = "Construa uma narrativa revelando um aspecto inesperado, pouco discutido ou comumente mal compreendido do seu tema principal. A história deve surpreender, esclarecer ou provocar reflexão, destacando um ponto de vista original e autêntico. Ideal para conteúdos que buscam diferenciar-se por profundidade e frescor intelectual." + elif recurso == "ORDEM_CRONOLOGICA": + saida == "Desenvolva uma narrativa que destaque uma sequência de eventos marcantes, como a trajetória de uma marca, a evolução de uma ideia ao longo do tempo ou o passo a passo de uma jornada transformadora. A história deve apresentar progressão clara, com marcos importantes, aprendizados e momentos de virada, permitindo que o leitor acompanhe a construção de algo significativo do início ao fim." + elif recurso == "QUEDA_SUPERACAO": + saida == "Crie uma narrativa onde o personagem (ou narrador) enfrenta um desafio significativo, atravessa um período de crise e, através de escolhas ou descobertas, encontra uma solução que o leva a um lugar emocional, pessoal ou profissionalmente melhor. A história deve transmitir superação, aprendizado e inspiração, sendo ideal para compartilhar lições de vida autênticas e transformadoras." + elif recurso == "APRENDI_DIFICIL": + saida == "Elabore uma narrativa pessoal centrada em um erro que você cometeu. Descreva o contexto da situação, o impacto desse equívoco e, principalmente, a lição valiosa que ele trouxe. A história deve transmitir vulnerabilidade e autenticidade, ao mesmo tempo em que fortalece sua autoridade e conexão com o público." + return saida + +def get_instrucoes(nova_historia, personagem, idioma): + return instrucoes.format( + nova_historia = nova_historia, + personagem=personagem, + IDIOMA=idioma + ) + +def digitaPrompt(texto): + for word in texto.split(" "): + yield word + " " + time.sleep(0.02) + +@staticmethod +def get_prompt_fato(count, narrativa, fato, structure, facts, recurso, idioma): + return PROMPT_FATO.format( + COUNT=count, + NARRATIVE=narrativa, + FATO=fato, + STRUCTURE=structure, + FACTS=facts, + RECURSO=recurso, + IDIOMA=idioma + ) + +@staticmethod +def get_prompt_personagem(count, personagem, narrativa, structure, facts, recurso, idioma): + return PROMPT_PERSONAGEM.format( + COUNT=count, + PERSONAGEM=personagem.upper(), + NARRATIVE=narrativa.upper(), + STRUCTURE=structure.upper(), + FACTS=facts.upper(), + RECURSO=recurso.upper(), + IDIOMA=idioma.upper() + ) + + +como_comecar = ["Impacto logo no início", "Comece com uma Pergunta", "Opinião com Contexto", "O que Quase Ninguém Sabe"] + +def getComoComecar(): + return como_comecar + + +COMO_COMECAR_1 = "Comece com uma revelação surpreendente, uma pergunta forte ou algo que prende atenção nos primeiros segundos. Ideal para redes sociais, vídeos curtos e conteúdos que precisam chamar atenção rápido." +COMO_COMECAR_2 = "Inicie com uma dúvida comum do seu público e responda de forma simples, direta ou criativa. Boa para criar conexão e gerar engajamento." +COMO_COMECAR_3 = "Dê sua visão sobre um tema com base na sua experiência. Vai além do desabafo: é um posicionamento pessoal com história. Funciona muito bem para influenciadores, especialistas e criadores com propósito." +COMO_COMECAR_4 = "Mostre algo que as pessoas raramente contam: um segredo, bastidor ou erro comum. Desperta curiosidade e posiciona você como alguém autêntico." + +def getComoComecarTexto(como_comecar_param) -> str: + saida = "" + if como_comecar_param == como_comecar[0]: + saida = COMO_COMECAR_1 + elif como_comecar_param == como_comecar[1]: + saida = COMO_COMECAR_2 + elif como_comecar_param == como_comecar[2]: + saida = COMO_COMECAR_3 + elif como_comecar_param == como_comecar[3]: + saida = COMO_COMECAR_4 + return saida + +como_organizar = ["História em Ordem Cronológica", "Emoções em Alta e Baixa", "Queda e Superação", "Tentei, Errei, Acertei", "Guia Prático", "Transformação Visível"] + +def getComoOrganizar(): + return como_organizar + +COMO_ORGANIZAR_1 = "Conte sua história na sequência em que tudo aconteceu: começo, meio e fim. Ótimo para mostrar uma jornada, trajetória ou processo de crescimento." +COMO_ORGANIZAR_2 = "Alterne momentos de desafio e superação, tensão e humor. Ideal para criar conexão emocional e engajar o público." +COMO_ORGANIZAR_3 = "A história começa bem, depois algo dá errado. Você enfrenta um problema, supera e aprende com isso. Excelente para histórias inspiradoras." +COMO_ORGANIZAR_4 = "Mostre que tentou uma solução que não deu certo, até encontrar o caminho ideal. Ensina com autenticidade e humaniza a narrativa." +COMO_ORGANIZAR_5 = "Explique como fazer algo com etapas claras. Ideal para tutoriais, passo a passo e mostrar seu método." +COMO_ORGANIZAR_6 = "Mostre uma mudança clara entre o “antes” e o “depois”. Pode ser uma mudança pessoal, estética, de mentalidade ou de resultados." + + +def getComoOrganizarTexto(como_organizar_param) -> str: + saida = "" + if como_organizar_param == como_organizar[0]: + saida = COMO_ORGANIZAR_1 + elif como_organizar_param == como_organizar[1]: + saida = COMO_ORGANIZAR_2 + elif como_organizar_param == como_organizar[2]: + saida = COMO_ORGANIZAR_3 + elif como_organizar_param == como_organizar[3]: + saida = COMO_ORGANIZAR_4 + elif como_organizar_param == como_organizar[4]: + saida = COMO_ORGANIZAR_5 + elif como_organizar_param == como_organizar[5]: + saida = COMO_ORGANIZAR_6 + return saida + + + +como_ensinar = ["Aprendi do Jeito Difícil", "O Problema Era a Solução"] + +def getComoEnsinar(): + return como_ensinar + +COMO_ENSINAR_1 = "Compartilhe um erro que cometeu e o que ele te ensinou. Mostra vulnerabilidade e autoridade ao mesmo tempo." +COMO_ENSINAR_2 = "Comece com algo que parecia ruim, mas acabou sendo um ponto forte. Mostra crescimento e mudança de visão." + +def getComoEnsinarTexto(como_ensinar_param) -> str: + saida = "" + if como_ensinar_param == como_ensinar[0]: + saida = COMO_ENSINAR_1 + elif como_ensinar_param == como_ensinar[1]: + saida = COMO_ENSINAR_2 + return saida + + +formas_contar = ["História Rápida", "Comparação Simples", "Antes e Depois"] + +def getFormasContar(): + return formas_contar + +FORMAS_CONTAR_1 = "Conte uma mini-história (real ou fictícia) para ilustrar uma ideia." +FORMAS_CONTAR_2 = "Compare seu tema com algo fácil de entender. Pode usar metáforas, analogias ou dar vida a um conceito." +FORMAS_CONTAR_3 = "Mostre uma transformação ou contraste entre duas situações. Isso dá impacto à sua mensagem." + +def getFormasContarTexto(formas_contar_param) -> str: + saida = "" + if formas_contar_param == formas_contar[0]: + saida = FORMAS_CONTAR_1 + elif formas_contar_param == formas_contar[1]: + saida = FORMAS_CONTAR_2 + elif formas_contar_param == formas_contar[2]: + saida = FORMAS_CONTAR_3 + return saida + + +engajamento_curiosidade = ["Pergunta ou Curiosidade", "Surpresa ou Reviravolta", "Gancho Final"] + +def getEngajamentoCuriosidade(): + return engajamento_curiosidade + +ENGAJAMENTO_CURIOSIDADE_1 = "Abra com uma pergunta ou deixe uma “pulga atrás da orelha”." +ENGAJAMENTO_CURIOSIDADE_2 = "Traga algo inesperado no meio ou fim do conteúdo. Quebre a expectativa." +ENGAJAMENTO_CURIOSIDADE_3 = "Termine com uma pergunta, provocação ou promessa de continuação. Deixe o leitor querendo mais." + +def getEngajamentoCuriosidadeTexto(eng_curiosidade_param) -> str: + saida = "" + if eng_curiosidade_param == engajamento_curiosidade[0]: + saida = ENGAJAMENTO_CURIOSIDADE_1 + elif eng_curiosidade_param == engajamento_curiosidade[1]: + saida = ENGAJAMENTO_CURIOSIDADE_2 + elif eng_curiosidade_param == engajamento_curiosidade[2]: + saida = ENGAJAMENTO_CURIOSIDADE_3 + return saida + + +tom_voz = ["Tom Pessoal","Alívio Cômico"] + +def getTomVoz(): + return tom_voz + +TOM_VOZ_1 = "Fale como você fala na vida real. Conte do seu ponto de vista e com sua voz." +TOM_VOZ_2 = "Use humor ou ironia para deixar o conteúdo mais leve e humano." + +def getTomVozTexto(tom_voz_param) -> str: + saida = "" + if tom_voz_param == tom_voz[0]: + saida = TOM_VOZ_1 + elif tom_voz_param == tom_voz[1]: + saida = TOM_VOZ_2 + return saida + + +clareza_autoridade = ["Contexto Rápido", "Prova com Dados", "Dica Prática"] + +def getClarezaAutoridade(): + return clareza_autoridade + +CLAREZA_AUTORIDADE_1 = "Explique o básico para quem está chegando agora. Onde, quando, por quê?" +CLAREZA_AUTORIDADE_2 = "Inclua um número, dado ou fato que sustente o que você está dizendo." +CLAREZA_AUTORIDADE_3 = "Entregue um passo simples, uma dica fácil ou um mini tutorial útil." + +def getClarezaAutoridadeTexto(clareza_autoridade_param) -> str: + saida = "" + if clareza_autoridade_param == clareza_autoridade[0]: + saida = CLAREZA_AUTORIDADE_1 + elif clareza_autoridade_param == clareza_autoridade[1]: + saida = CLAREZA_AUTORIDADE_2 + elif clareza_autoridade_param == clareza_autoridade[2]: + saida = CLAREZA_AUTORIDADE_3 + + return saida + +posicionamento_conexao = ["Discordância Construtiva","Conexão com o Leitor"] + +def getPosicionamentoConexao(): + return posicionamento_conexao + +POSICIONAMENTO_CONEXAO_1 = "Questione ideias comuns de forma respeitosa. Mostre sua visão." +POSICIONAMENTO_CONEXAO_2 = "Mostre como aquilo afeta quem está lendo. Convide à interação." + +def getPosicionamentoConexaoTexto(posicionamento_conexao_param) -> str: + saida = "" + if posicionamento_conexao_param == posicionamento_conexao[0]: + saida = POSICIONAMENTO_CONEXAO_1 + elif posicionamento_conexao_param == posicionamento_conexao[1]: + saida = POSICIONAMENTO_CONEXAO_2 + return saida + + +recursos_extras = ["Minha Experiência","Tradução Simples"] + +def getRecursosExtras(): + return recursos_extras + +RECURSOS_EXTRAS_1 = "Fale de algo que você viveu relacionado ao tema. Traz autenticidade e proximidade." +RECURSOS_EXTRAS_2 = "Explique um conceito difícil com palavras simples, como se falasse com um amigo." + +def getRecursosExtrasTexto(param) -> str: + saida = "" + if param == recursos_extras[0]: + saida = RECURSOS_EXTRAS_1 + elif param == recursos_extras[1]: + saida = RECURSOS_EXTRAS_2 + return saida + + +estruturas = ["LINHA DO TEMPO", "ALTERNÂNCIA EMOCIONAL","LEAD", "O HOMEM NO BURACO", "DOS TRAPOS À RIQUEZA", "SOLUÇÃO ERRADA"] + +tamanho_texto = ["Muito Pequeno", "Pequeno", "Medio", "Grande"] + + +def getTamanhoTexto(): + return tamanho_texto + +def getEstruturas(): + return estruturas + + +def getRecursos(): + return recursos + + +STRUCTURE_1 = """ + +LINHA DO TEMPO: A NARRATIVA IRÁ SE DESENROLAR EM TORNO DE UMA LINHA DO TEMPO. A SEQUENCIA NARRATIVA DEVE SER TEMPORAL, CONSIDERANDO QUE OS EVENTOS OCORREM EM UMA ORDEM CRONOLÓGICA. + +""" + +STRUCTURE_2 = """ + +ALTERNÂNCIA EMOCIONAL: A NARRATIVA TORNA-SE UMA JORNADA EMOCIONAL. DESSA FORMA, AO ALTERNAR EMOÇÕES POSITIVAS E NEGATIVAS, O ENREDO AVANÇA: UMA DERROTA DÁ LUGAR A UMA VITÓRIA; UM ALÍVIO CÔMICO QUEBRA UM MOMENTO DE TENSÃO. + +""" + + +STRUCTURE_3 = """ + +LEAD: A O COMEÇO TORNA-SE A PARTE MAIS IMPORTANTE DA NARRATIVA. LOGO NO COMEÇO CRIAM-SE CURIOSIDADES, INTRIGA-SE OS LEITORES OU AINDA SUGERE-SE O QUE ESTÁ POR VIR. + +""" + +STRUCTURE_4 = """ + +O HOMEM NO BURACO: A NARRATIVA COMEÇA EM UM LUGAR POSITIVO (ZONA DE CONFORTO) PARA LOGO EM SEGUIDA UM PROBLEMA INESPERADO OCORRER (GATILHO). A CRISE SE INSTAURA, CAUSANDO MEDO, AFLIÇÃO, RAIVA OU DESESPERO. MAS LOGO É POSSÍVEL ENCONTRAR UMA SOLUÇÃO OU UM CAMINHO. POR FIM, MOSTRA-SE QUE O MOMENTO DIFÍCIL FOI PASSAGEIRO E QUE O FIM DA NARRATIVA É EM UM LUGAR MELHOR. + +""" + + +STRUCTURE_5 = """ + +DOS TRAPOS À RIQUEZA: AQUI A NARRATIVA SE INICIA COM UM VALOR OCULTO, ONDE ALGO É VISTO COMO NEGATIVO (uma habilidade, uma emoção, um pensamento, um objeto, etc...), entretanto percebe-se que isso pode ser um erro. O elemento negativo é colocado à prova (ASCENÇÃO) e, para a surpresa do leitor, ele se mostra como algo extremamente valioso. + +""" + +STRUCTURE_6 = """ + +SOLUÇÃO ERRADA: A NARRATIVA COMEÇA EM UM LUGAR NEGATIVO, E UMA PRIMEIRA SOLUÇÃO PARECER SER CORRETA. ENTRETANTO, ELA SE MOSTRA FALHA (REVÉS) e a situação é agravada. APÓS ENCONTRAR A RECUPERAÇÃO, A SOLUÇÃO VERDADEIRA É ENCONTRADA. Por fim, aprendemos a tomar melhores decisões. + +""" + +STRUCTURE_DEFAULT = """ + +NÃO É NECESSÁRIO ADOTAR UMA ESTRUTURA PREDEFINIDA. + +""" + +RECURSO_DEFAULT = """ + +NÃO É NECESSÁRIO ADOTAR UM RECURSO + +""" + + +recursos = ["ALEGORIA", "ALIVIO COMICO", "CONTEXTO", "COMPARAÇÃO", "CONTRASTE", "CURIOSIDADE", "DADOS VALIDADORES", "DISCORDÂNCIA", + "GANCHO", "IDENTIFICAÇÃO", "INTERAÇÃO", "METALINGUAGEM", "MISTÉRIO", "NÚMERO MÁGICO", "PERSONIFICAÇÃO", "PLOT TWIST", + "PONTO DE VISTA","PRENÚNCIO", "QUEBRA DE PADRÃO", "RELATO", "REVELAÇÃO", "SURPRESA", "TEMPO", "VITÓRIA RÁPIDA", "VIDA PREGRESSA", + "ANTAGONISMO", "ANEDOTA","ALUSÃO"] + +RECURSO_1 = """ +ALEGORIA: Representar. Figurar. Simular. Descreva um cenário ou enredo ficcional que claramente remeta à realidade da narrativa. +""" +RECURSO_2 = """ +ALÍVIO CÔMICO: Brincar. Divertir. Fruir. Faça uma observação espirituosa, quebre a quarta parede ou conte uma piada. +""" +RECURSO_3 = """ +CONTEXTO: Situar. Explicar. Conectar. Faça uma contextualização que seja útil, explorando as perguntas: Quem? O quê? Onde? Como? Por quê? +""" +RECURSO_4 = """ +COMPARAÇÃO: Comparar. Simbolizar. Imaginar. Encontre a comparação capaz de fazer a explicação avançar com velocidade, seja por metáfora, analogia, e que explore um +elemento mais simples que já se encontra no imaginário coletivo. +""" +RECURSO_5 = """ +CONTRASTE: Contrastar. Divergir. Diferenciar. O antes e o depois, o que é e o que não é, a mentira e a verdade, isso e aquilo. Encontre elementos que se contrapõem +no intuito de reforçar um argumento. +""" +RECURSO_6 = """ +CURIOSIDADE: Questionar. Instigar. Esconder. Faça uma pergunta engenhosa ou sugeria possuir uma informação que o outro desconheça. Qual a resposta? O que virá a seguir? +""" +RECURSO_7 = """ +DADOS VALIDADORES: Comprovar. Concluir. Espantar. Utilize um número que é essencial para reforçar um ponto ou que cause espanto. Preserve a credibilidade apoiando-se +em fontes confiáveis. +""" +RECURSO_8 = """ +DISCORDÂNCIA: Divergir. Contrariar. Opor. Pondere sobre a questão e exponha sua discordância, ajudando a enxergar um outro ponto de vista. +""" +RECURSO_9 = """ +GANCHO: Instigar. Entusiasmar. Amarrar. Nos últimos instantes, deixe uma pergunta em aberto ou introduza uma informação inédita à narrativa, prometendo conclusões em uma próxima +criação. +""" +RECURSO_10 = """ +IDENTIFICAÇÃO: Retratar. Conectar. Traduzir. Desperte o interesse ao apontar como o assunto do enredo se conecta de uma forma ou outra com crenças, comportamentos ou com +a jornada da narrativa. +""" + +RECURSO_11 = """ +INTERAÇÃO: Motivar. Convocar. Desafiar. Abra espaço para participação ou peça opinião. Especificidade e clareza em relação ao que se espera é importante para +aumentar a percepção de valor do leitor. +""" +RECURSO_12 = """ +METALINGUAGEM: Referenciar. Analisar. Explicar. Tente ser conciso e claro, sem abrir mão da praticidade. Explore a metalinguagem para fazer sua narrativa autorreferente. +""" +RECURSO_13 = """ +MISTÉRIO: Investigar. Insinuar. Cadenciar. Caminhe no sentido de uma investigação, cadenciando as informações conforme avança. Vez ou outra insinue o que está por vir. +""" +RECURSO_14 = """ +NÚMERO MÁGICO: Facilitar. Listar. Adequar. Apresente um numero que pode ser referenciado em vários contextos para que os leitores possam lembrar com facilidade o que foi comunicado. +""" + +RECURSO_15 = """ +PERSONIFICAÇÃO: Fantasiar. Atribuir. Adjetivar. Dê um adjetivo inventivo ao assunto. Caso julgue pertinente, pode antropomorfizar a narrativa. +""" + +RECURSO_16 = """ +PLOT TWIST: Mudar. Transformar. Surpreender. Próximo ao fim, uma reviravolta modifica o enredo. Por algum tempo, conduza a narrativa em uma direção. Então, subverta a +expectativa trocando o dispositivo temático ou apresentação de uma informação que dá outro sentido a tudo que foi dito antes. +""" +RECURSO_17 = """ +PONTO DE VISTA: Distinguir. Narrar. Representar. Use a primeira pessoa (eu) para transmitir pessoalidade e intimismo, a segunda pessoa (você) para transformar o leitor +em participante ativo do enredo, ou a terceira pessoa (ele/ela) para dar a sensação de distância e neutralidade. +""" + +RECURSO_18 = """ +PRENÚNCIO: Sugerir. Insinuar. Apontar. Faça uma promessa ou sugestão que indique o que acontece no final, de forma a cativar o interesse do leitor no desfecho da narrativa. +""" + +RECURSO_19 = """ +QUEBRA DE PADRÃO: Diferenciar. Subverter. Modificar. Seja um estilo, um discurso, ou um ponto de vista, não hesite em desconstruí-los. +""" + +RECURSO_20 = """ +RELATO: Apresentar. Descrever. Divulgar. Relate passagens selecionadas na vida de figuras ilustres ou bons conhecidos capazes de ilustrar com perfeição o ponto da narrativa. +""" + +RECURSO_21 = """ +REVELAÇÃO: Revelar. Declarar. Exibir. Há uma revelação que é necessária ser feita. Após construir o mistério ou a curiosidade, deixe o leitor satisfeito fechando o ciclo +que foi aberto através de uma revelação. +""" + +RECURSO_22 = """ +SURPRESA: Supreender. Impressionar. Cativar. Apresente uma informação inesperada, faça uma conexão improvável ou introduza um novo elemento à narrativa. +""" + + +RECURSO_23 = """ +Vitória Rápida: Facilitar. Instrumentalizar. Resumir. Ofereça utilidades práticas em forma de resumo, instruções ou orientações em passos que ajude o leitor a +superar sua provações. +""" +RECURSO_24 = """ +Vida Pregressa: Contar. Descrever. Contextualizar. Utilize elementos do passado da jornada como exemplo, pontuando um aprendizado, uma queda ou uma conquista que +reforçe a narrativa. +""" + +RECURSO_25 = """ +ANTAGONISMO: Expor. Combater. Derrotar. Ideias, crenças, desejos, sentimentos, pessoas, ou uma mistura disso tudo podem ser escalados ao papel de antagonista no enredo +proposto. +""" + +RECURSO_26 = """ +ANEDOTA: Recortar. Evidenciar. Distinguir. Seja um fato curioso, um acontecimento que faz rir ou repleto de significado, utilize-o. +""" + +RECURSO_27 = """ +ALUSÃO: Referenciar. Adaptar. Relacionar. Referencie os clássicos, os modismos, as tendências ou as obras de nicho para cativar o leitor. +""" + +RECURSO_28 = """ +TEMPO: Retornar. Relembrar. Especular. Volte ao passado remoto em busca de elementos há muito esquecidos ou ao passado recente para despertar a nostalgia. +""" + + +def get_structure_prompt(estrutura) -> str: + saida = "" + if estrutura == estruturas[0]: + saida = STRUCTURE_1 + elif estrutura == estruturas[1]: + saida = STRUCTURE_2 + elif estrutura == estruturas[2]: + saida = STRUCTURE_3 + elif estrutura == estruturas[3]: + saida = STRUCTURE_4 + elif estrutura == estruturas[4]: + saida = STRUCTURE_5 + elif estrutura == estruturas[5]: + saida = STRUCTURE_6 + + return saida + + +def get_recurso_narrativo(recurso) -> str: + saida = "" + if recurso == recursos[0]: + saida = RECURSO_1 + elif recurso == recursos[1]: + saida = RECURSO_2 + elif recurso == recursos[2]: + saida = RECURSO_3 + elif recurso == recursos[3]: + saida = RECURSO_4 + elif recurso == recursos[4]: + saida = RECURSO_5 + elif recurso == recursos[5]: + saida = RECURSO_6 + elif recurso == recursos[6]: + saida = RECURSO_7 + elif recurso == recursos[7]: + saida = RECURSO_8 + elif recurso == recursos[8]: + saida = RECURSO_9 + elif recurso == recursos[9]: + saida = RECURSO_10 + elif recurso == recursos[10]: + saida = RECURSO_11 + elif recurso == recursos[11]: + saida = RECURSO_12 + elif recurso == recursos[12]: + saida = RECURSO_13 + elif recurso == recursos[13]: + saida = RECURSO_14 + elif recurso == recursos[14]: + saida = RECURSO_15 + elif recurso == recursos[15]: + saida = RECURSO_16 + elif recurso == recursos[16]: + saida = RECURSO_17 + elif recurso == recursos[17]: + saida = RECURSO_18 + elif recurso == recursos[18]: + saida = RECURSO_19 + elif recurso == recursos[19]: + saida = RECURSO_20 + elif recurso == recursos[20]: + saida = RECURSO_21 + elif recurso == recursos[21]: + saida = RECURSO_22 + elif recurso == recursos[22]: + saida = RECURSO_23 + elif recurso == recursos[23]: + saida = RECURSO_24 + elif recurso == recursos[24]: + saida = RECURSO_25 + elif recurso == recursos[25]: + saida = RECURSO_26 + elif recurso == recursos[26]: + saida = RECURSO_27 + elif recurso == recursos[27]: + saida = RECURSO_28 + return saida + + + +def getRecursosAvancados(r1,r2,r3,r4,r5,r6,r7,r8,r9,r10,r11,r12,r13): + saida = [] + if r1: + saida.append("Use uma história curta ou inventada (real ou não) para explicar algo de forma mais envolvente.") + if r2: + saida.append("Compare o tema com algo que todo mundo entende. Pode ser uma metáfora, um símbolo ou até dar “vida” a um conceito.") + if r3: + saida.append("Mostre a diferença entre duas situações. Pode ser o que mudou, melhorou ou piorou. Isso dá força à sua mensagem.") + if r4: + saida.append("Faça uma pergunta que desperte o interesse ou sugira que você tem uma informação escondida.") + if r5: + saida.append("Traga algo inesperado ou mude o rumo do conteúdo no final. Isso segura a atenção.") + if r6: + saida.append("Termine com algo que deixa o leitor querendo mais: uma pergunta, promessa ou continuação.") + if r7: + saida.append("Use sua voz. Fale como você. Pode ser contando em primeira pessoa, explicando diretamente ao leitor ou fazendo piada com a própria narrativa.") + if r8: + saida.append("Use humor para deixar tudo mais leve. Pode ser uma piada, uma quebra engraçada ou algo inesperado.") + if r9: + saida.append("Explique o básico de forma simples: o que está acontecendo? Onde? Com quem? Por quê?") + if r10: + saida.append("Traga um número ou dado interessante que sustente seu ponto ou surpreenda.") + if r11: + saida.append("Liste passos fáceis ou ofereça uma solução rápida. Ideal para conteúdos úteis e objetivos.") + if r12: + saida.append("Mostre um ponto de vista diferente do comum, questione ideias ou se posicione contra algo — com respeito e argumentos.") + if r13: + saida.append("Mostre como o conteúdo tem a ver com quem está lendo e incentive a pessoa a comentar, pensar ou agir.") + return saida + + +def getEstruturasAvancadas(e1,e2,e3,e4,e5,e6,e7,e8,e9,e10,e11,e12): + saida = [] + if e1: + saida.append("Conte a sua história seguindo a ordem dos acontecimentos, do começo ao fim. Essa estrutura é ideal para mostrar uma sequência de eventos, como a trajetória de uma marca, a evolução de uma ideia, ou o passo a passo de uma jornada. \n") + if e2: + saida.append("Aqui, sua narrativa vai alternar entre altos e baixos emocionais. Um momento difícil dá espaço a uma conquista, ou uma tensão é quebrada com humor. Ideal para engajar o público e criar conexão emocional. \n") + if e3: + saida.append("Você começa com tudo: uma revelação surpreendente, uma pergunta intrigante ou algo que prende a atenção de cara. Essa estrutura é perfeita para redes sociais, vídeos curtos ou textos que precisam fisgar o leitor em segundos. \n") + if e4: + saida.append("A história começa bem, mas algo dá errado. O personagem (ou você) enfrenta um desafio, passa por uma crise, mas encontra uma saída e termina em um lugar melhor. Boa para histórias inspiradoras e lições de vida. \n") + if e5: + saida.append("Tudo começa com algo que parece ruim, inútil ou sem valor. Mas ao longo da história, esse \"problema\" se revela uma grande força. Excelente para transformar percepções e mostrar crescimento. \n") + if e6: + saida.append("Você começa com um problema e tenta uma solução que parece funcionar... mas não funciona. Depois de um revés, encontra o caminho certo. Ideal para mostrar aprendizado, evolução e autenticidade. \n") + if e7: + saida.append("Mostre como fazer algo, do início ao fim, em etapas claras. Ideal para tutoriais, dicas profissionais, ou mostrar seu processo criativo. \n") + if e8: + saida.append("Mostre uma mudança: de uma situação inicial para um resultado final impressionante. Pode ser uma mudança pessoal, profissional, estética ou de mentalidade. Muito usado por coaches, terapeutas, criadores de estilo ou fitness. \n") + if e9: + saida.append("Inicie com uma dúvida comum do seu público e responda de forma clara, objetiva ou criativa. Boa para criar conexão direta e gerar engajamento rápido. \n") + if e10: + saida.append("Compartilhe sua visão sobre um tema com base na sua vivência ou experiência. Não é só um desabafo: é um posicionamento com história. Funciona muito bem para influenciadores e especialistas. \n") + if e11: + saida.append("Conte sobre um erro que cometeu e como ele te ensinou algo valioso. Isso aproxima você do público e passa autoridade de forma autêntica. \n") + if e12: + saida.append("Revele algo inesperado, pouco falado ou mal compreendido sobre seu tema. Essa estrutura desperta curiosidade e posiciona você como alguém que traz conteúdo original. \n") + + return saida + \ No newline at end of file