File size: 4,052 Bytes
ab0a6c9
d0db547
ed8fc2e
7f2f713
8caee6c
3ab96b9
c54262a
00ddeb7
4badfda
01ad962
9adb795
ed8fc2e
4badfda
c30b7eb
d0db547
 
 
 
8370475
4badfda
 
 
 
 
 
 
 
d02533f
 
a4c20c7
d02533f
 
 
 
 
 
 
 
 
 
 
 
 
a928dd2
 
d2b7cd0
d02533f
5e3de11
 
00ddeb7
 
d97fa05
 
 
 
 
4badfda
d97fa05
a928dd2
6067413
984eb4a
a928dd2
984eb4a
6067413
 
d97fa05
 
 
 
a928dd2
6067413
 
d97fa05
d02533f
 
a928dd2
6067413
a928dd2
6067413
06417df
bdea24d
 
 
 
4badfda
bdea24d
4badfda
7882463
ed8fc2e
7882463
ed8fc2e
7882463
01ad962
 
7882463
 
01ad962
7882463
 
 
ed8fc2e
 
7882463
ed8fc2e
3ab96b9
 
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
import gradio as gr
import os
import asyncio
from prompts import TRADELINK_CONTEXT
from openai import OpenAI
from fastapi import FastAPI
from analyzer import analyze_portfolio_streaming
from comparer import compare_portfolio
from table_view import get_metrics_dataframe
from alpha_chart import plot_alpha_btc_chart
from rest_api import app as rest_api_app


api_key = os.getenv("featherless")  #
client = OpenAI(
    base_url="https://api.featherless.ai/v1",
    api_key=api_key
)

def show_metrics_table(pid: str):
    try:
        df = asyncio.run(get_metrics_dataframe(pid))
        return df
    except Exception as e:
        return f"❌ Ошибка: {e}"


def handle_chat_streaming(user_input):
    response = client.chat.completions.create(
        model="meta-llama/Meta-Llama-3.1-8B-Instruct",
        messages=[
            {"role": "system", "content": TRADELINK_CONTEXT},
            {"role": "user", "content": user_input}
        ],
        stream=True
    )
    partial = ""
    for chunk in response:
        delta = chunk.choices[0].delta.content
        if delta:
            partial += delta
            yield partial

def analyze_one_portfolio(text):
    yield from analyze_portfolio_streaming(text, client)


def compare_analyze(text1, text2):
    yield from compare_portfolio(text1, text2, client)


# Gradio интерфейс
with gr.Blocks() as demo:
    gr.Markdown("## 🧠 Анализ и сравнение инвестиционных портфелей Tradelink")

    with gr.Tab("📊 Анализ"):

        portfolio_input = gr.Textbox(label="Введите ссылку или portfolioId", placeholder="ea856c1b-...")
        analyze_button = gr.Button("🔍 Проанализировать")
        output_box = gr.Textbox(label="📈 Результат анализа", lines=15)
        analyze_button.click(
            fn=analyze_one_portfolio,
            inputs=portfolio_input,
            outputs=output_box  # Textbox
        )

    with gr.Tab("⚖️ Сравнение"):
        compare_input_1 = gr.Textbox(label="Портфель 1", placeholder="ea856c1b-...")
        compare_input_2 = gr.Textbox(label="Портфель 2", placeholder="d52f55cc-...")
        compare_button = gr.Button("📊 Сравнить")
        compare_output = gr.Textbox(label="📉 Результат сравнения", lines=20)
        compare_button.click(fn=compare_analyze, inputs=[compare_input_1, compare_input_2], outputs=compare_output)

    with gr.Tab("💬 Диалог"):
        chat_input = gr.Textbox(label="Ваш вопрос", placeholder="Что такое TradeLink Passport?")
        chat_button = gr.Button("Отправить")
        chat_output = gr.Textbox(label="Ответ", lines=8)

        chat_button.click(fn=handle_chat_streaming, inputs=chat_input, outputs=chat_output)

    with gr.Tab("📋 Таблица метрик"):
        metrics_input = gr.Textbox(label="Введите portfolioId", placeholder="ea856c1b-...")
        metrics_button = gr.Button("📥 Показать метрики")
        metrics_output = gr.Dataframe(label="📊 Метрики портфеля", wrap=True)

        metrics_button.click(fn=show_metrics_table, inputs=metrics_input, outputs=metrics_output)


    with gr.Tab("📈 AlphaBTC график"):
        chart_input = gr.Textbox(label="Введите portfolioId", value="3852a354-e66e-4bc5-97e9-55124e31e687")
        chart_button = gr.Button("Построить график")
        chart_output = gr.Plot(label="График Alpha")


        def build_chart(portfolio_id):
            print(f"[DEBUG] Нажата кнопка, portfolio_id = {portfolio_id}")
            fig = plot_alpha_btc_chart(portfolio_id)
            if fig is None:
                raise gr.Error("График не построен: проверьте ID.")
            return fig


        chart_button.click(fn=build_chart, inputs=chart_input, outputs=chart_output)

demo.mount_api(rest_api_app)

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