File size: 5,131 Bytes
0eb59fc
11e4aa2
2762feb
 
5431ef4
2762feb
 
11e4aa2
2762feb
11e4aa2
2762feb
11e4aa2
 
2762feb
11e4aa2
 
 
2762feb
11e4aa2
0fe887d
2762feb
11e4aa2
2762feb
 
11e4aa2
 
 
2762feb
11e4aa2
 
2762feb
11e4aa2
 
 
 
 
 
 
 
 
 
 
2762feb
 
11e4aa2
 
 
 
 
 
 
 
 
 
 
 
2762feb
11e4aa2
 
 
2762feb
11e4aa2
2762feb
11e4aa2
 
 
92bff3a
11e4aa2
 
 
 
 
 
 
 
 
 
92bff3a
11e4aa2
 
 
92bff3a
11e4aa2
2762feb
11e4aa2
 
 
 
 
2762feb
 
92bff3a
2762feb
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
# FILE: main_web.py (Hugging Face Demo)

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:
    # In Hugging Face Spaces, assets are in the root or /assets
    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"

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

# --- ✅ DEFINITIVE "OBSIDIAN" CSS THEME ---
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; font-family: 'Inter', sans-serif !important; }
.gradio-container { background: transparent !important; max-width: 900px !important; }
#header_logo img { max-height: 70px !important; filter: brightness(0) invert(1) !important; }
#header_subtitle { font-family: 'Bebas Neue', cursive !important; font-size: 1.8rem !important; text-transform: uppercase !important; letter-spacing: 2px !important; }
#header_tagline { color: #a0a0a0 !important; margin-top: -10px !important; margin-bottom: 1.5rem !important; }
.gradio-textbox textarea { font-size: 1.1rem !important; }
.result-box { background-color: rgba(18, 18, 18, 0.8) !important; border: 1px solid #333 !important; border-radius: 12px !important; padding: 1.5rem 2rem !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; }
.cta-button { background: #FFFFFF !important; color: #000000 !important; font-weight: bold !important; }
.cta-button:hover { background: #e0e0e0 !important; }
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"
    )

    with gr.Blocks(theme=zotheos_theme, css=zotheos_web_css, title=APP_TITLE) as demo:
        with gr.Column(elem_classes="gradio-container"):
            # --- ✅ UPGRADED HEADER WITH CALL TO ACTION ---
            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.")
                download_button = gr.Button("Download Full Version on Gumroad", link=GUMROAD_LINK, elem_classes="cta-button")
            
            gr.Markdown("---") # Separator

            # --- Main Interaction Area ---
            query_input = gr.Textbox(label="Your Inquiry:", placeholder="e.g., Analyze the ethical implications of AI in art...", lines=6)
            submit_button = gr.Button("Process Inquiry (Web Demo)", variant="primary")
            
            with gr.Column(visible=False) as results_box:
                gr.Markdown("## ✨ ZOTHEOS Final Synthesized Insight ✨")
                synthesized_summary_output = gr.Markdown()
                gr.Markdown("### 💬 Detailed Individual Perspectives")
                fusion_output = gr.Markdown()

        # --- Backend Logic ---
        async def process_query_wrapper(query):
            if not ai_system:
                return gr.update(visible=True), "[SYSTEM OFFLINE] The AI engine failed to load.", ""
            
            response = await ai_system.process_query_with_fusion(query)
            summary = response.split("###")[0].replace("## ✨ ZOTHEOS Final Synthesized Insight ✨", "").strip()
            perspectives = "###" + response.split("###", 1)[1] if "###" in response else ""
            
            return 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 ---")
    zotheos_interface = build_interface()
    logger.info("✅ HF Demo UI built.")
    zotheos_interface.queue().launch()