File size: 2,054 Bytes
e63adc7
fe31096
 
bd902db
e545578
fe31096
e545578
e63adc7
 
bd902db
e63adc7
380268b
f4f3f95
e63adc7
bd902db
f4f3f95
e63adc7
 
f4f3f95
e63adc7
 
 
f4f3f95
e63adc7
 
 
 
 
f4f3f95
e63adc7
f24b05a
f4f3f95
e63adc7
 
23af882
 
e63adc7
bd902db
e63adc7
 
 
 
 
 
 
a928dd2
 
 
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
# Анализ одного портфеля
import requests
from fetch import extract_portfolio_id
from prompts import ONE_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",
            model="meta-llama/Meta-Llama-3.1-8B-Instruct",
            messages=[
                {"role": "system", "content": ONE_PROMPT},
                {"role": "user", "content": prompt}
            ],
            stream=True
        )

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


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