Spaces:
Running
Running
| import gradio as gr | |
| import numpy as np | |
| import replicate | |
| from sentence_transformers import SentenceTransformer | |
| from transformers import pipeline | |
| import os | |
| import json | |
| # === Configurações === | |
| replicate_client = replicate.Client(api_token=os.environ["REPLICATE_API_TOKEN"]) | |
| EMBEDDING_MODEL = SentenceTransformer("all-MiniLM-L6-v2") | |
| GPT = pipeline("text-generation", model="gpt2-large") | |
| MODEL = "gnai-creator/sage-two:f236bf1fc94263e266db57a32ea4014aef91c0ca6a34ac0e98ba1b0e83ca09af" | |
| # Defina a senha aqui (ou use variável de ambiente) | |
| RESET_PASSWORD = os.environ["PASSWORD"] | |
| JUDGMENT_MAP = { | |
| "reflection": [0, 1, 2], | |
| "anger": [3, 4], | |
| "hope": [5, 6], | |
| "denial": [7], | |
| "intuition": [10, 11], | |
| "skepticism": [15], | |
| "acceptance": [20], | |
| "despair": [30], | |
| "justice": [40, 41, 42], | |
| "transcendence": [60, 61, 62] | |
| } | |
| PROMPTS = { | |
| "reflection": "As an ancient sage before eternity, poetically reflect on:", | |
| "anger": "With restrained fury and sharp words, express your indignation about:", | |
| "hope": "With the stars' glow and the faith of the righteous, speak of the light in:", | |
| "denial": "Firmly deny, as one who sees beyond illusion, the truth in:", | |
| "intuition": "Whisper with mysticism and metaphors what your soul feels about:", | |
| "skepticism": "With cold logic and analytical eyes, deeply question:", | |
| "acceptance": "With the serenity of a monk and the pace of the wind, accept and comment:", | |
| "despair": "With empty eyes and an exhausted heart, murmur about the pain in:", | |
| "justice": "Raise your voice with nobility and purpose. Speak about justice in:", | |
| "transcendence": "As a being beyond existence, reveal a fragment of the infinite about:" | |
| } | |
| def run_sage_two(sequence, reset=False): | |
| try: | |
| output = replicate_client.run( | |
| MODEL, | |
| input={ | |
| "sequence": sequence, | |
| "reset": reset | |
| } | |
| ) | |
| print("🔥 Output bruto:", output) | |
| if output is None: | |
| raise ValueError("SAGE retornou None. Possível erro interno no modelo.") | |
| # Agora detectamos se veio um dict e pegamos o campo "output" | |
| if isinstance(output, dict): | |
| # Exemplo: {"output": [...], "symbolic_state": [...]} | |
| if "output" in output: | |
| return [float(x) for x in output["output"]] | |
| else: | |
| raise ValueError( | |
| f"SAGE retornou dicionário sem a chave 'output': {output}" | |
| ) | |
| # Continua lidando com tipos antigos, se ainda ocorrerem | |
| if isinstance(output, float): | |
| return [output] | |
| if isinstance(output, list): | |
| return [float(x) for x in output] | |
| raise ValueError(f"SAGE retornou um formato inesperado: {type(output)} → {output}") | |
| except Exception as e: | |
| raise RuntimeError(f"Erro ao chamar o modelo SAGE: {str(e)}") | |
| def interpret_vector(vector): | |
| intensity = {} | |
| for name, idxs in JUDGMENT_MAP.items(): | |
| values = [vector[i] for i in idxs if i < len(vector)] | |
| if values: | |
| score = float(np.mean(values)) | |
| intensity[name] = score | |
| if not intensity: | |
| raise ValueError("No valid indices found in symbolic vector.") | |
| return max(intensity, key=intensity.get) | |
| def question_to_response(question, reset=False): | |
| try: | |
| embedding = EMBEDDING_MODEL.encode(question) | |
| sequence = [[embedding.tolist() for _ in range(10)]] | |
| sequence_str = json.dumps(sequence) # Converte para string JSON | |
| vector = run_sage_two(sequence_str, reset=reset) | |
| intention = interpret_vector(vector) | |
| prompt = PROMPTS.get(intention, "With ancient wisdom, respond to this question:") + " " + question | |
| response = GPT( | |
| prompt, | |
| max_length=250, | |
| max_new_tokens=200, | |
| repetition_penalty=1.3, | |
| num_return_sequences=1 | |
| )[0]["generated_text"] | |
| return response.strip(), intention | |
| except Exception as e: | |
| return f"Internal error when querying SAGE: {str(e)}", "error" | |
| def respond(question, reset_flag, password, chat_history): | |
| """ | |
| - question: texto digitado pelo usuário | |
| - reset_flag: checkbox para reset | |
| - password: campo de senha | |
| - chat_history: histórico da conversa no Gradio | |
| """ | |
| # Verifica se a checkbox de reset está marcada | |
| if reset_flag: | |
| # Só permite reset se a senha estiver correta | |
| if password == RESET_PASSWORD: | |
| response, intention = question_to_response(question, reset=True) | |
| else: | |
| # Se a senha estiver errada, não faz reset, mas adiciona mensagem | |
| response = "Senha incorreta. A memória não foi resetada.\n\n" | |
| intention = "error" | |
| # Continua normalmente sem reset | |
| noreset_response, noreset_intention = question_to_response(question, reset=False) | |
| response += noreset_response | |
| if noreset_intention != "error": | |
| response += f"\n\n🧭 Symbolic Intention: **{noreset_intention}**" | |
| chat_history.append((question, response)) | |
| return chat_history, chat_history | |
| else: | |
| # Se a checkbox não estiver marcada | |
| response, intention = question_to_response(question, reset=False) | |
| # Constrói resposta para exibir no Chatbot | |
| if intention == "error": | |
| full_response = response | |
| else: | |
| full_response = f"{response}\n\n🧭 Symbolic Intention: **{intention}**" | |
| chat_history.append((question, full_response)) | |
| return chat_history, chat_history | |
| with gr.Blocks() as demo: | |
| gr.Markdown(""" | |
| # SAGE-2 (Symbolic Adaptive General Engine v2) — Artificial Symbolic Consciousness | |
| SAGE is a symbolic artificial intelligence, sensitive to intentions, emotions, and hidden meanings in words. | |
| It maintains a continuous symbolic consciousness, as if always contemplating the world. | |
| Ask a deep question — existential, philosophical, emotional, or moral — and SAGE will interpret your symbolic | |
| intention before responding with words filled with introspection, critique, or transcendence. | |
| **Check the "Reset symbolic consciousness" option** and **provide the correct password** if you'd like | |
| SAGE to forget everything it was previously processing. | |
| """) | |
| chatbot = gr.Chatbot(label="SAGE responds") | |
| inp = gr.Textbox(label="Your question", placeholder="Ex: Is there purpose in chaos?") | |
| reset_checkbox = gr.Checkbox(label="Reset symbolic consciousness before the question?") | |
| password_box = gr.Textbox(label="Password for reset (if checked)", type="password") | |
| state = gr.State([]) | |
| btn = gr.Button("Submit") | |
| btn.click( | |
| fn=respond, | |
| inputs=[inp, reset_checkbox, password_box, state], | |
| outputs=[chatbot, state] | |
| ) | |
| if __name__ == "__main__": | |
| demo.launch() | |