File size: 6,241 Bytes
ab0a6c9
b2d5b74
 
 
 
 
985f897
a312a60
ed8fc2e
84de7fa
985f897
4badfda
b2d5b74
 
 
8370475
a312a60
eadb379
 
 
 
 
f3b6ce8
 
 
 
 
eadb379
 
 
 
 
 
 
 
 
84de7fa
a312a60
eadb379
84de7fa
a312a60
 
 
 
eb2bf76
a312a60
 
 
eadb379
7bb14e7
eadb379
 
a312a60
eadb379
 
 
 
a312a60
eadb379
a312a60
 
 
 
 
 
 
 
eadb379
 
a312a60
 
 
 
 
 
 
 
 
 
eadb379
a312a60
 
 
 
eadb379
a312a60
eadb379
a312a60
 
 
 
eadb379
a312a60
eadb379
a312a60
 
 
 
 
7146f0f
a312a60
7146f0f
a6a6a1c
280aa9c
7146f0f
 
 
 
280aa9c
7146f0f
 
a312a60
a6a6a1c
7146f0f
 
a312a60
 
7146f0f
 
 
 
 
 
 
eadb379
 
 
 
 
 
3d06875
8caee6c
 
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
import gradio as gr
from services.llm_client import llm_service
from core.analyzer import PortfolioAnalyzer
from core.comparer import PortfolioComparer
from core.chat import ChatAssistant
from core.metrics import show_metrics_table
from core.visualization import build_alpha_chart
from core.crypto_dashboard import build_crypto_dashboard  # 🆕 новая вкладка

# === Model setup ===
MODEL_NAME = "meta-llama/Meta-Llama-3.1-8B-Instruct"

analyzer = PortfolioAnalyzer(llm_service, MODEL_NAME)
comparer = PortfolioComparer(llm_service, MODEL_NAME)
chatbot = ChatAssistant(llm_service, MODEL_NAME)

# === Theme ===
dark_theme = gr.themes.Base(
    primary_hue="violet",
    secondary_hue="gray",
    neutral_hue="zinc",
).set(
    body_background_fill="#0d1117",
    body_text_color="#e6edf3",
    block_background_fill="#161b22",
    block_border_color="#30363d",
    button_primary_background_fill="#4f46e5",
    button_primary_background_fill_hover="#6366f1",
    button_primary_text_color="#ffffff",
    input_background_fill="#0d1117",
    block_shadow="0 2px 6px rgba(0,0,0,0.3)",
    block_label_text_color="#9da5b4",
    block_label_text_size="sm",
)

with gr.Blocks(theme=dark_theme, css="""
#root, [data-testid="block-container"] {
    max-width: 1050px !important;
    margin: auto !important;
}
.gradio-container { font-family: 'Inter', sans-serif; background-color:#0d1117!important;}
#llm_comment_box textarea,#analysis_output textarea{
    min-height:520px!important;background-color:#161b22!important;color:#f0f6fc!important;
    border:1px solid #30363d!important;border-radius:6px!important;font-family:'JetBrains Mono',monospace!important;
}
.gr-dataframe table{width:100%!important;color:#c9d1d9!important;background:#161b22!important;}
.gr-dataframe th{background:#21262d!important;color:#f0f6fc!important;border-bottom:1px solid #30363d!important;}
.gr-dataframe td{border-top:1px solid #30363d!important;padding:8px!important;}
""") as demo:

    gr.Markdown("## Investment Portfolio Analyzer")
    gr.Markdown(
        "Professional AI-driven analytics for investment and crypto markets.",
        elem_classes="subtitle",
    )

    with gr.Tabs():
        # --- Analysis ---
        with gr.TabItem("Analysis"):
            portfolio_input = gr.Textbox(label="Portfolio ID or Link",
                                         placeholder="Enter portfolio ID (uuid)",
                                         value="b1ef37aa-5b9a-41b4-9394-8823f2de36bb")
            analyze_btn = gr.Button("Run Analysis", variant="primary")
            analyze_out = gr.Textbox(label="Analysis Result", lines=15, elem_id="analysis_output")
            analyze_btn.click(fn=analyzer.run, inputs=portfolio_input, outputs=analyze_out)

        # --- Comparison ---
        with gr.TabItem("Comparison Table"):
            from core.comparison_table import show_comparison_table
            pid_a = gr.Textbox(label="Portfolio A", value="3852a354-e66e-4bc5-97e9-55124e31e687")
            pid_b = gr.Textbox(label="Portfolio B", value="b1ef37aa-5b9a-41b4-9394-8823f2de36bb")
            compare_btn = gr.Button("Load Comparison", variant="primary")
            comp_table = gr.Dataframe(label="Comparative Metrics", wrap=True)
            comp_comment = gr.Textbox(label="AI Commentary", lines=14, elem_id="llm_comment_box")
            compare_btn.click(fn=show_comparison_table,
                              inputs=[pid_a, pid_b],
                              outputs=[comp_table, comp_comment])

        # --- Assistant ---
        with gr.TabItem("Assistant"):
            chat_in = gr.Textbox(label="Ask about investments or analysis")
            chat_btn = gr.Button("Send Question", variant="primary")
            chat_out = gr.Textbox(label="AI Response", lines=8)
            chat_btn.click(fn=chatbot.run, inputs=chat_in, outputs=chat_out)

        # --- Metrics ---
        with gr.TabItem("Metrics Table"):
            metrics_in = gr.Textbox(label="Portfolio ID", value="b1ef37aa-5b9a-41b4-9394-8823f2de36bb")
            metrics_btn = gr.Button("Load Metrics", variant="primary")
            metrics_out = gr.Dataframe(label="Portfolio Metrics", wrap=True)
            metrics_btn.click(fn=show_metrics_table, inputs=metrics_in, outputs=metrics_out)

        # --- AlphaBTC Chart ---
        with gr.TabItem("AlphaBTC Chart"):
            chart_in = gr.Textbox(label="Portfolio ID", value="3852a354-e66e-4bc5-97e9-55124e31e687")
            chart_btn = gr.Button("Generate Chart", variant="primary")
            chart_out = gr.Plot(label="Alpha vs BTC")
            chart_btn.click(fn=build_alpha_chart, inputs=chart_in, outputs=chart_out)

        # --- Crypto Intelligence Dashboard (refactored) ---
        with gr.TabItem("Crypto Intelligence Dashboard"):
            gr.Markdown("### 📊 Unified Market Intelligence (Binance + TradingView)")

            with gr.Row():
                assets_select = gr.CheckboxGroup(
                    label="Select assets",
                    choices=["BTCUSDT", "ETHUSDT", "BNBUSDT", "SOLUSDT", "DOGEUSDT"],
                    value=["BTCUSDT", "ETHUSDT"]
                )
                start_picker = gr.DatePicker(label="Start Date", value=(datetime.now() - timedelta(days=365*2)))
                end_picker = gr.DatePicker(label="End Date", value=datetime.now())
                load_btn = gr.Button("Load Market Data", variant="primary")

            price_plot = gr.Plot(label="Recent Market (Binance)")
            hist_plot = gr.Plot(label="Historical Chart (TradingView)")
            ai_summary = gr.Textbox(label="AI Market Summary", lines=8, elem_id="llm_comment_box")

            from core.crypto_dashboard import build_crypto_dashboard
            load_btn.click(
                fn=build_crypto_dashboard,
                inputs=[assets_select, start_picker, end_picker],
                outputs=[price_plot, hist_plot, ai_summary],
                show_progress="minimal",
            )

    gr.Markdown("---")
    gr.Markdown(
        "<center><small style='color:#6e7681;'>Developed with Featherless.ai • Powered by OpenAI-compatible API</small></center>",
        elem_classes="footer",
    )

if __name__ == "__main__":
    demo.launch()