File size: 5,756 Bytes
ce58fd6
11e4aa2
2762feb
 
5431ef4
2762feb
 
11e4aa2
2762feb
11e4aa2
2762feb
11e4aa2
 
2762feb
11e4aa2
 
2762feb
11e4aa2
ce58fd6
2762feb
11e4aa2
2762feb
 
11e4aa2
 
 
2762feb
ce58fd6
11e4aa2
2762feb
ce58fd6
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
11e4aa2
2762feb
 
11e4aa2
 
 
ce58fd6
11e4aa2
 
 
ce58fd6
 
11e4aa2
 
 
ce58fd6
11e4aa2
 
ce58fd6
2762feb
ce58fd6
 
 
 
11e4aa2
92bff3a
ce58fd6
 
 
 
 
11e4aa2
ce58fd6
11e4aa2
 
ce58fd6
92bff3a
ce58fd6
 
 
11e4aa2
ce58fd6
11e4aa2
92bff3a
ce58fd6
2762feb
11e4aa2
 
 
 
 
2762feb
 
92bff3a
2762feb
ce58fd6
11e4aa2
ce58fd6
11e4aa2
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
# FILE: main_web.py (Hugging Face Demo - FINAL, Mobile-First Pro Version)

import gradio as gr
import asyncio
import logging
import os
import sys
from typing import Optional, List, Dict, Any

# --- Basic Setup ---
APP_TITLE = "ZOTHEOS - Ethical Fusion AI"
logging.basicConfig(level=logging.INFO, format="%(asctime)s - %(name)s - %(levelname)s - %(message)s")
logger = logging.getLogger("ZOTHEOS_Interface_HF")

def get_asset_path(filename: str) -> str:
    return filename if os.path.exists(filename) else os.path.join('assets', filename)

logo_path_verified = get_asset_path("zotheos_logo.png")
GUMROAD_LINK = "https://zotheos.gumroad.com/l/jibfv" # Your actual Gumroad link

# --- Core Logic Imports ---
try:
    from modules.main_fusion_public import MainFusionPublic
except ImportError:
    MainFusionPublic = None
ai_system = MainFusionPublic() if MainFusionPublic else None

# --- ✅ DEFINITIVE "OBSIDIAN" MOBILE-FIRST CSS ---
zotheos_web_css = """
@import url('https://fonts.googleapis.com/css2?family=Bebas+Neue&family=Inter:wght@400;600;700&display=swap');

body {
    background: linear-gradient(135deg, #000000, #1c1c1c) !important;
    background-attachment: fixed !important;
    color: #f0f0f0 !important;
    font-family: 'Inter', sans-serif !important;
}
.gradio-container {
    background: transparent !important;
    max-width: 800px !important; /* Centered, comfortable width */
    margin: 0 auto !important; /* Horizontally center the entire app */
    padding: 1.5rem !important;
}
#main-column {
    display: flex;
    flex-direction: column;
    align-items: center; /* Center all content horizontally */
    width: 100%;
}
#header_logo img {
    max-height: 70px !important;
    filter: brightness(0) invert(1) !important;
    margin-bottom: 0.5rem !important;
}
#header_subtitle {
    font-family: 'Bebas Neue', cursive !important;
    font-size: 1.8rem !important; text-transform: uppercase !important;
    letter-spacing: 2px !important; text-align: center;
}
#header_tagline {
    color: #a0a0a0 !important; text-align: center;
    margin-top: -10px !important; margin-bottom: 2rem !important;
}
.gradio-accordion {
    background-color: #1a1a1a !important; border: 1px solid #333 !important;
}
.cta-button {
    background: #FFFFFF !important; color: #000000 !important;
    font-weight: bold !important;
}
.gradio-textbox textarea {
    font-size: 1.1rem !important;
}
#results_column { margin-top: 1.5rem; width: 100%; }
.result-box {
    background-color: rgba(18, 18, 18, 0.9) !important;
    border: 1px solid #333333 !important; padding: 1.5rem !important;
}
.result-box h2 {
    font-family: 'Bebas Neue', cursive !important; font-size: 1.5rem !important;
    border-bottom: 1px solid #333; padding-bottom: 0.75rem; margin-bottom: 1rem;
}
footer { display: none !important; }
"""

# --- Build Gradio Interface ---
def build_interface():
    zotheos_theme = gr.themes.Base(primary_hue=gr.themes.colors.neutral, secondary_hue=gr.themes.colors.neutral).set(
        button_primary_background_fill="white", button_primary_text_color="black", block_radius="12px"
    )

    with gr.Blocks(theme=zotheos_theme, css=zotheos_web_css, title=APP_TITLE) as demo:
        with gr.Column(elem_id="main-column"):
            # --- Header & CTA ---
            gr.Image(value=logo_path_verified, elem_id="header_logo", show_label=False, container=False, interactive=False)
            gr.Markdown("Ethical Fusion AI for Synthesized Intelligence", elem_id="header_subtitle")
            gr.Markdown("Fusing perspectives for deeper truth.", elem_id="header_tagline")

            with gr.Accordion("🔥 Get the Full Offline Desktop Version", open=True):
                gr.Markdown("This web demo uses smaller, slower models. For the full-power, GPU-accelerated, 100% private experience, download the ZOTHEOS Public Beta for your Windows PC.")
                gr.Button("Download Full Version on Gumroad", link=GUMROAD_LINK, elem_classes="cta-button")
            
            gr.Markdown("---")
            
            # --- Main Interaction ---
            query_input = gr.Textbox(label="Your Inquiry:", placeholder="e.g., What is universal peace?", lines=5)
            submit_button = gr.Button("Process Inquiry (Web Demo)", variant="primary")
            
            with gr.Column(elem_id="results_column", visible=False) as results_box:
                with gr.Column(elem_classes="result-box"):
                    synthesized_summary_output = gr.Markdown()
                with gr.Column(elem_classes="result-box", elem_id="fusion_output"):
                    fusion_output = gr.Markdown()

        # --- ✅ UNBREAKABLE EVENT HANDLER ---
        async def process_query_wrapper(query):
            if not ai_system:
                return gr.update(visible=True), "## SYSTEM OFFLINE\n\n[The AI engine failed to load.]", ""
            
            # Show a loading message
            yield gr.update(visible=True), "Synthesizing... Please wait.", ""

            response = await ai_system.process_query_with_fusion(query)
            summary = response.split("###")[0].strip()
            perspectives = "###" + response.split("###", 1)[1] if "###" in response else ""
            
            yield gr.update(visible=True), summary, perspectives

        submit_button.click(
            fn=process_query_wrapper,
            inputs=[query_input],
            outputs=[results_box, synthesized_summary_output, fusion_output]
        )
    return demo

# --- Main Execution Block ---
if __name__ == "__main__":
    logger.info("--- Initializing ZOTHEOS Hugging Face Demo (v2.1) ---")
    zotheos_interface = build_interface()
    logger.info("✅ HF Demo UI built successfully.")
    zotheos_interface.queue().launch()