File size: 2,134 Bytes
e63adc7
fe31096
 
 
e545578
fe31096
e545578
e63adc7
 
 
 
380268b
f4f3f95
e63adc7
f4f3f95
 
e63adc7
 
f4f3f95
e63adc7
 
 
f4f3f95
e63adc7
 
 
 
 
f4f3f95
e63adc7
 
 
f4f3f95
e63adc7
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
# Анализ одного портфеля
import requests
from fetch import extract_portfolio_id
from prompts import SYSTEM_PROMPT
from openai import OpenAI

def analyze_portfolio_streaming(text: str, client:OpenAI):
    portfolio_id = extract_portfolio_id(text)
    if not portfolio_id:
        yield "❗ Укажите корректный portfolioId или ссылку."
        return

    try:
        # Получение JSON по API
        url = f"https://api.tradelink.pro/portfolio/get?portfolioId={portfolio_id}&extended=1&declaration=1&step=day&lang=en&incViews=1"
        response = requests.get(url)
        json_data = response.json()
        extended = json_data.get("data", {}).get("extended", {})

        if not extended:
            yield "❗ Метрики не найдены в ответе API."
            return

        # Передаём все числовые метрики, без фильтрации
        metrics = {k: v for k, v in extended.items() if isinstance(v, (int, float))}
        if not metrics:
            yield "❗ Нет числовых метрик для анализа."
            return

        metrics_text = ", ".join([f"{k}: {v}" for k, v in metrics.items()])
        prompt = f"""Вот метрики портфеля: {metrics_text}. 
Проанализируй их и объясни сильные и слабые стороны на русском языке, как финансовый аналитик."""

        # Запрос к модели
        response_llm = client.chat.completions.create(
            model="nasiruddin15/Mistral-dolphin-2.8-grok-instract-2-7B-slerp",
            messages=[
                {"role": "system", "content": SYSTEM_PROMPT},
                {"role": "user", "content": prompt}
            ],
            stream=True
        )

        partial = ""
        for chunk in response_llm:
            delta = chunk.choices[0].delta.content
            if delta:
                partial += delta
                yield partial

    except Exception as e:
        yield f"❌ Ошибка при обработке: {e}"