File size: 4,530 Bytes
cc21f11
 
 
4c198b1
cc21f11
 
c4e9c8e
 
0303b9b
 
cc21f11
4c198b1
 
 
 
31be26a
4c198b1
 
 
 
 
31be26a
138dc70
31be26a
60263a2
468903e
96bc60c
99e492b
96bc60c
 
 
 
 
 
 
99e492b
cc21f11
99e492b
cc21f11
99e492b
cc21f11
99e492b
c4e9c8e
 
4c198b1
c4e9c8e
 
 
 
 
 
 
cc21f11
99e492b
 
31be26a
cc21f11
138dc70
cc21f11
 
0303b9b
cc21f11
 
 
4c198b1
0303b9b
fe09770
cc21f11
4c198b1
138dc70
4c198b1
cc21f11
 
0303b9b
 
 
 
 
 
4c198b1
0303b9b
4c198b1
c4e9c8e
 
4c198b1
c4e9c8e
 
 
4c198b1
 
 
 
 
c4e9c8e
 
4c198b1
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
135
136
import os
import requests
from dotenv import load_dotenv
from utils import chunk_text_by_tokens

load_dotenv()
api_key = os.getenv("OPENROUTER_API_KEY")

if not api_key or not api_key.strip():
    raise RuntimeError("❌ OPENROUTER_API_KEY bulunamadı. Hugging Face Secrets kısmına eklenmeli.")

class SummaryException(Exception):
    pass

def build_prompt(text, mode, lang_mode="Otomatik", is_table=False, model_name=""):
    lang_instruction = ""

    if lang_mode == "Türkçeye Çevir":
        lang_instruction = "\n\nSonuç Türkçeye çevrilsin."
    elif lang_mode == "İngilizceye Çevir":
        lang_instruction = "\n\nSonuç İngilizceye çevrilsin."

    if is_table:
        instruction = "Aşağıdaki tabloyu analiz et ve teknik bir şekilde özetle."
        return f"{instruction}{lang_instruction}\n\n{text}"

    if "Karma" in mode:
        instruction = """
Aşağıdaki metni 3 ayrı biçimde özetle:

1. Teknik bir özet ver.
2. Herkesin anlayacağı şekilde sade bir açıklama yaz.
3. Madde madde önemli notları çıkar.
"""
    elif "Sade" in mode:
        instruction = "Bu metni herkesin anlayacağı şekilde sadeleştir."
    elif "Eleştir" in mode:
        instruction = "Metni eleştir, eksik ve güçlü yönlerini değerlendir."
    elif "Başlık" in mode:
        instruction = "Metne uygun başlık önerileri üret."
    elif "Not" in mode:
        instruction = "Bu metinden önemli notlar çıkar."
    elif "Chat" in mode:
        instruction = """
Aşağıdaki yazışmaları veya serbest notları oku ve şunları çıkar:

- Ana konuşma başlıkları
- Varsa karar verilen noktalar 
- Belirgin fikir veya öneriler

Yazım sade ve maddeli olsun.
"""
    else:
        instruction = "Metni kısa ve teknik bir şekilde özetle."

    return f"{instruction}{lang_instruction}\n\nMetin:\n{text}"

def summarize_text(text, mode, model_name="anthropic/claude-3-haiku", lang_mode="Otomatik", is_table=False):
    url = "https://openrouter.ai/api/v1/chat/completions"
    headers = {
        "Authorization": f"Bearer {api_key.strip()}",
        "Content-Type": "application/json"
    }

    prompt = build_prompt(text, mode, lang_mode, is_table, model_name)
    payload = {
        "model": model_name,
        "messages": [
            {"role": "user", "content": prompt}
        ],
        "max_tokens": 500
    }

    try:
        response = requests.post(url, headers=headers, json=payload)
        response.raise_for_status()
        result = response.json()
        return result['choices'][0]['message']['content'].strip()
    except requests.exceptions.HTTPError as e:
        raise SummaryException(f"❌ HTTP Hatası: {e} | Yanıt: {response.text}")
    except Exception as e:
        raise SummaryException(f"❌ Sistemsel Hata: {str(e)}")

def summarize_long_text(text, mode, model_name="anthropic/claude-3-haiku", lang_mode="Otomatik", is_table=False):
    chunks = chunk_text_by_tokens(text, max_tokens=800)

    summaries = []
    for chunk in chunks:
        try:
            summary = summarize_text(chunk, mode, model_name, lang_mode, is_table)
            summaries.append(summary)
        except SummaryException as e:
            summaries.append(str(e))

    return "\n\n".join(summaries)

def generate_answer(query, source_tuples, chat_history=None, model_name="anthropic/claude-3-haiku"):
    url = "https://openrouter.ai/api/v1/chat/completions"
    headers = {
        "Authorization": f"Bearer {api_key.strip()}",
        "Content-Type": "application/json"
    }

    context_block = "\n\n".join([f"({i+1}) {txt}" for i, (_, txt) in enumerate(source_tuples)])
    
    history_prompt = ""
    if chat_history:
        for q, a in chat_history:
            history_prompt += f"Q: {q}\nA: {a}\n\n"

    prompt = f"""{history_prompt}
Aşağıdaki kaynak metinlere dayanarak kullanıcıdan gelen soruyu yanıtla:

{context_block}

Soru: {query}
Yanıt:"""

    payload = {
        "model": model_name,
        "messages": [
            {"role": "user", "content": prompt.strip()}
        ],
        "max_tokens": 1500
    }

    try:
        response = requests.post(url, headers=headers, json=payload)
        response.raise_for_status()
        result = response.json()
        return result['choices'][0]['message']['content'].strip()
    except requests.exceptions.HTTPError as e:
        raise SummaryException(f"❌ HTTP Hatası: {e} | Yanıt: {response.text}")
    except Exception as e:
        raise SummaryException(f"❌ Sistemsel Hata: {str(e)}")