denizkaya2022 commited on
Commit
3d457bd
·
verified ·
1 Parent(s): 9a59114

Update src/app.py

Browse files
Files changed (1) hide show
  1. src/app.py +52 -36
src/app.py CHANGED
@@ -7,13 +7,6 @@ import json
7
  import streamlit as st
8
  import requests
9
 
10
- # In Hugging Face, 127.0.0.1 is used because the services are in the same container.
11
- # Scanning from environmental variables for AWS or Docker Compose.
12
- # app.py (Arayüz)
13
- import os
14
- import streamlit as st
15
-
16
- # 127.0.0.1 yerine 0.0.0.0 kullanarak Docker içindeki iç ağ sorununu çözüyoruz
17
  API_URL = "http://127.0.0.1:8000"
18
 
19
  # ─────────────────────────────────────────────────────────────
@@ -32,19 +25,18 @@ desteklenecektir.
32
  • Bal ve diğer arıcılık ürünlerinin işlenmesi ve paketlenmesi için, yararlanıcı, başvuru sırasında 5996 sayılı Veteriner
33
  Hizmetleri, Bitki Sağlığı, Gıda ve Yem Kanununa uygun gerekli üretim ve kayıt sertifikalarına sahip olmalıdır. Yeni
34
  işletmeler için bu prosedür nihai ödeme talebi sırasında tamamlanmalıdır.
35
-
36
  **Kaynak:** Tedbir 302 - Başvuru Çağrı Rehberi""",
37
  "sources": []
38
  },
39
  "Başvuru için gerekli belgeler nelerdir?": {
40
- "answer": """Başvuru sahibi aşağıdaki bilgi ve belgeleri Başvuru Paketi şeklinde sunmak zorundadır.
41
  Başvuru Paketi;
42
  (a) Başvuru Formu ve ekleri,
43
  (b) İ ş Planı,
44
- (c) Teknik Projeden oluşmaktadır.
45
- Başvuru Paketinin içeriğinde yer alan belgelere ilişkin ayrıntılı bilgiler ve dikkat edilmesi gereken hususlar TKDK
46
- web adresinde (www.tkdk.gov.tr) yayımlanan Başvuru Paketi İçeriğinde belirtilmiştir.
47
- İçerisinde Başvuru Formu, Seçilen ve Seçilmeyen Teklifler, İş Planı ve Teknik Proje yer almayan başvuru paketleri
48
  TKDK tarafından teslim alınmayacak ve başvuru kaydı yapılmayacaktır.
49
  Başvuru paketleri hazırlanırken, TKDK web adresinde (www.tkdk.gov.tr) yayımlanan;
50
  • Yatırım Kapsamında Uyulması Gereken Koşullar,
@@ -53,9 +45,7 @@ Başvuru paketleri hazırlanırken, TKDK web adresinde (www.tkdk.gov.tr) yayıml
53
  • İ ş Planı Hazırlama Rehberi,
54
  • Görünürlük Rehberi.
55
  • Bilgilendirme Dokümanlarında belirtilen hususlar dikkate alınmalıdır.
56
-
57
  Belge listesi başvurulan tedbir ve sektöre göre değişmektedir. Güncel ve kesin liste için ilgili çağrı rehberini incelemenizi tavsiye ederiz.
58
-
59
  **Kaynak:** Tedbir 101/103/302 - Başvuru Çağrı Rehberleri""",
60
  "sources": []
61
  },
@@ -64,7 +54,6 @@ Belge listesi başvurulan tedbir ve sektöre göre değişmektedir. Güncel ve k
64
  Paketinde (ÖTP) belirtilen verileri doğrulamak ve yatırımın uygulama süresi
65
  boyunca faydalanıcıya ait taahhütlerin ve yükümlülüklerin yerine getirilip
66
  getirilmediğini kontrol etmektir.
67
-
68
  **Kaynak:** IPARD III - Ödeme Öncesi Yerinde Kontrol Süreci Ve E3 Harcama Beyani Formu İçin Yönlendirici Rehber""",
69
  "sources": []
70
  },
@@ -88,15 +77,12 @@ if "legal_accept" not in st.session_state:
88
  if not st.session_state.legal_accept:
89
  st.markdown("""
90
  ## ⚠️ Kullanım Bilgilendirmesi
91
-
92
  Bu uygulama IPARD III belgeleri üzerinde çalışan **yapay zeka destekli bir bilgi sistemidir**.
93
-
94
  - Verilen yanıtlar otomatik oluşturulur.
95
  - Resmi kurum görüşü değildir.
96
  - Nihai ve bağlayıcı bilgi TKDK resmi belgeleridir.
97
  - Bu sistem bağımsız geliştirilmiştir ve kurumla resmi bir bağı yoktur.
98
  - Yalnızca kamuya açık belgeler kullanılır.
99
-
100
  Devam ederek bu koşulları kabul etmiş olursunuz.
101
  """)
102
 
@@ -126,7 +112,6 @@ st.markdown("""
126
  # Title and Warning
127
  # ─────────────────────────────────────────────────────────────
128
  st.markdown('<div class="main-header"><h1>🌾 IPARD III Belge Asistanı</h1><p>🤖 Yapay zeka destekli belge arama ve özetleme sistemi</p></div>', unsafe_allow_html=True)
129
-
130
  st.markdown('<div class="disclaimer">⚠️ <b>Sorumluluk Reddi:</b> Bu uygulama bağımsız bir sistemdir. Yanıtlar otomatiktir ve <b>resmi kurum görüşü değildir</b>. Nihai bilgi için <a href="https://www.tkdk.gov.tr" target="_blank">tkdk.gov.tr</a> esas alınmalıdır.</div>', unsafe_allow_html=True)
131
 
132
  # ─────────────────────────────────────────────────────────────
@@ -149,7 +134,6 @@ with st.sidebar:
149
  ]:
150
  if st.button(ex, use_container_width=True):
151
  if ex in HARDCODED_ANSWERS:
152
- # Direkt hardcoded cevabı göster, API çağrısı yapma
153
  hardcoded = HARDCODED_ANSWERS[ex]
154
  st.session_state.history.insert(0, {
155
  "query": ex,
@@ -165,36 +149,69 @@ with st.sidebar:
165
  # ─────────────────────────────────────────────────────────────
166
  # Question Input and Processing
167
  # ─────────────────────────────────────────────────────────────
168
- if "history" not in st.session_state: st.session_state.history = []
 
169
 
170
  query = st.text_area("Sorunuz", value=st.session_state.get("query_input", ""), height=90, placeholder="IPARD III hakkında merak ettiğiniz her şeyi sorabilirsiniz...")
171
  submit = st.button("🔍 Yapay Zekaya Sor", use_container_width=True)
172
 
173
  if submit and query.strip():
174
  st.session_state["query_input"] = ""
 
 
 
 
 
 
 
175
  try:
176
- # If the model in the backend expects a 'measure', we send it accordingly.
177
- with requests.post(f"{API_URL}/query/stream", json={"query": query, "measure": selected_tedbir, "doc_type": selected_doc_type}, stream=True, timeout=120) as resp:
 
 
 
 
178
  resp.raise_for_status()
179
- st.markdown(f"**🙋 Soru:** {query}")
180
- answer_placeholder = st.empty()
181
- answer_text = ""
182
- sources_received = []
183
 
184
  for line in resp.iter_lines():
185
- if not line: continue
 
186
  line = line.decode("utf-8")
187
- if not line.startswith("data: "): continue
 
188
  event = json.loads(line[6:])
189
 
190
- if event["type"] == "sources": sources_received = event["sources"]
 
191
  elif event["type"] == "token":
192
  answer_text += event["text"]
193
- answer_placeholder.markdown(f'<div class="answer-box">{answer_text}▌</div>', unsafe_allow_html=True)
 
 
 
194
  elif event["type"] == "done":
195
- answer_placeholder.markdown(f'<div class="answer-box">{answer_text}</div>', unsafe_allow_html=True)
196
- st.session_state.history.insert(0, {"query": query, "answer": answer_text, "sources": sources_received, "elapsed": event.get("elapsed_ms", 0)})
197
- st.rerun()
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
198
  except Exception as e:
199
  st.error(f"Bağlantı hatası: {e}. Lütfen servislerin çalıştığından emin olun.")
200
 
@@ -207,7 +224,6 @@ for item in st.session_state.history:
207
  st.markdown(f'<div class="answer-box">{item["answer"]}</div>', unsafe_allow_html=True)
208
  with st.expander(f"📄 Kaynaklar ({len(item['sources'])})"):
209
  for s in item["sources"]:
210
- # hybrid_score zaten 0-1 arası normalize (rerank %60 + rrf %40)
211
  norm = s.get("hybrid_score") or max(0.0, min(1.0, (s.get("rerank_score", 0) - (-10)) / 12))
212
  pct = int(norm * 100)
213
  color = "#2d8a45" if pct >= 60 else "#e6a817" if pct >= 40 else "#c0392b"
 
7
  import streamlit as st
8
  import requests
9
 
 
 
 
 
 
 
 
10
  API_URL = "http://127.0.0.1:8000"
11
 
12
  # ─────────────────────────────────────────────────────────────
 
25
  • Bal ve diğer arıcılık ürünlerinin işlenmesi ve paketlenmesi için, yararlanıcı, başvuru sırasında 5996 sayılı Veteriner
26
  Hizmetleri, Bitki Sağlığı, Gıda ve Yem Kanununa uygun gerekli üretim ve kayıt sertifikalarına sahip olmalıdır. Yeni
27
  işletmeler için bu prosedür nihai ödeme talebi sırasında tamamlanmalıdır.
 
28
  **Kaynak:** Tedbir 302 - Başvuru Çağrı Rehberi""",
29
  "sources": []
30
  },
31
  "Başvuru için gerekli belgeler nelerdir?": {
32
+ "answer": """Başvuru sahibi aşağıdaki bilgi ve belgeleri "Başvuru Paketi" şeklinde sunmak zorundadır.
33
  Başvuru Paketi;
34
  (a) Başvuru Formu ve ekleri,
35
  (b) İ ş Planı,
36
+ (c) Teknik Proje'den oluşmaktadır.
37
+ "Başvuru Paketi"nin içeriğinde yer alan belgelere ilişkin ayrıntılı bilgiler ve dikkat edilmesi gereken hususlar TKDK
38
+ web adresinde (www.tkdk.gov.tr) yayımlanan "Başvuru Paketi İçeriği"nde belirtilmiştir.
39
+ İçerisinde "Başvuru Formu, Seçilen ve Seçilmeyen Teklifler, İş Planı ve Teknik Proje" yer almayan başvuru paketleri
40
  TKDK tarafından teslim alınmayacak ve başvuru kaydı yapılmayacaktır.
41
  Başvuru paketleri hazırlanırken, TKDK web adresinde (www.tkdk.gov.tr) yayımlanan;
42
  • Yatırım Kapsamında Uyulması Gereken Koşullar,
 
45
  • İ ş Planı Hazırlama Rehberi,
46
  • Görünürlük Rehberi.
47
  • Bilgilendirme Dokümanlarında belirtilen hususlar dikkate alınmalıdır.
 
48
  Belge listesi başvurulan tedbir ve sektöre göre değişmektedir. Güncel ve kesin liste için ilgili çağrı rehberini incelemenizi tavsiye ederiz.
 
49
  **Kaynak:** Tedbir 101/103/302 - Başvuru Çağrı Rehberleri""",
50
  "sources": []
51
  },
 
54
  Paketinde (ÖTP) belirtilen verileri doğrulamak ve yatırımın uygulama süresi
55
  boyunca faydalanıcıya ait taahhütlerin ve yükümlülüklerin yerine getirilip
56
  getirilmediğini kontrol etmektir.
 
57
  **Kaynak:** IPARD III - Ödeme Öncesi Yerinde Kontrol Süreci Ve E3 Harcama Beyani Formu İçin Yönlendirici Rehber""",
58
  "sources": []
59
  },
 
77
  if not st.session_state.legal_accept:
78
  st.markdown("""
79
  ## ⚠️ Kullanım Bilgilendirmesi
 
80
  Bu uygulama IPARD III belgeleri üzerinde çalışan **yapay zeka destekli bir bilgi sistemidir**.
 
81
  - Verilen yanıtlar otomatik oluşturulur.
82
  - Resmi kurum görüşü değildir.
83
  - Nihai ve bağlayıcı bilgi TKDK resmi belgeleridir.
84
  - Bu sistem bağımsız geliştirilmiştir ve kurumla resmi bir bağı yoktur.
85
  - Yalnızca kamuya açık belgeler kullanılır.
 
86
  Devam ederek bu koşulları kabul etmiş olursunuz.
87
  """)
88
 
 
112
  # Title and Warning
113
  # ─────────────────────────────────────────────────────────────
114
  st.markdown('<div class="main-header"><h1>🌾 IPARD III Belge Asistanı</h1><p>🤖 Yapay zeka destekli belge arama ve özetleme sistemi</p></div>', unsafe_allow_html=True)
 
115
  st.markdown('<div class="disclaimer">⚠️ <b>Sorumluluk Reddi:</b> Bu uygulama bağımsız bir sistemdir. Yanıtlar otomatiktir ve <b>resmi kurum görüşü değildir</b>. Nihai bilgi için <a href="https://www.tkdk.gov.tr" target="_blank">tkdk.gov.tr</a> esas alınmalıdır.</div>', unsafe_allow_html=True)
116
 
117
  # ─────────────────────────────────────────────────────────────
 
134
  ]:
135
  if st.button(ex, use_container_width=True):
136
  if ex in HARDCODED_ANSWERS:
 
137
  hardcoded = HARDCODED_ANSWERS[ex]
138
  st.session_state.history.insert(0, {
139
  "query": ex,
 
149
  # ─────────────────────────────────────────────────────────────
150
  # Question Input and Processing
151
  # ─────────────────────────────────────────────────────────────
152
+ if "history" not in st.session_state:
153
+ st.session_state.history = []
154
 
155
  query = st.text_area("Sorunuz", value=st.session_state.get("query_input", ""), height=90, placeholder="IPARD III hakkında merak ettiğiniz her şeyi sorabilirsiniz...")
156
  submit = st.button("🔍 Yapay Zekaya Sor", use_container_width=True)
157
 
158
  if submit and query.strip():
159
  st.session_state["query_input"] = ""
160
+ st.markdown(f"**🙋 Soru:** {query}")
161
+ answer_placeholder = st.empty()
162
+ answer_text = ""
163
+ sources_received = []
164
+ elapsed_ms = 0
165
+ success = False
166
+
167
  try:
168
+ with requests.post(
169
+ f"{API_URL}/query/stream",
170
+ json={"query": query, "measure": selected_tedbir, "doc_type": selected_doc_type},
171
+ stream=True,
172
+ timeout=120
173
+ ) as resp:
174
  resp.raise_for_status()
 
 
 
 
175
 
176
  for line in resp.iter_lines():
177
+ if not line:
178
+ continue
179
  line = line.decode("utf-8")
180
+ if not line.startswith("data: "):
181
+ continue
182
  event = json.loads(line[6:])
183
 
184
+ if event["type"] == "sources":
185
+ sources_received = event["sources"]
186
  elif event["type"] == "token":
187
  answer_text += event["text"]
188
+ answer_placeholder.markdown(
189
+ f'<div class="answer-box">{answer_text}▌</div>',
190
+ unsafe_allow_html=True
191
+ )
192
  elif event["type"] == "done":
193
+ elapsed_ms = event.get("elapsed_ms", 0)
194
+ success = True
195
+ elif event["type"] == "error":
196
+ st.error(f"Hata: {event.get('detail', 'Bilinmeyen hata')}")
197
+ break
198
+
199
+ # Streaming bitti, son hali göster ve history'e ekle
200
+ if answer_text:
201
+ answer_placeholder.markdown(
202
+ f'<div class="answer-box">{answer_text}</div>',
203
+ unsafe_allow_html=True
204
+ )
205
+ st.session_state.history.insert(0, {
206
+ "query": query,
207
+ "answer": answer_text,
208
+ "sources": sources_received,
209
+ "elapsed": elapsed_ms
210
+ })
211
+ st.rerun()
212
+ elif success and not answer_text:
213
+ answer_placeholder.warning("Model boş cevap döndürdü.")
214
+
215
  except Exception as e:
216
  st.error(f"Bağlantı hatası: {e}. Lütfen servislerin çalıştığından emin olun.")
217
 
 
224
  st.markdown(f'<div class="answer-box">{item["answer"]}</div>', unsafe_allow_html=True)
225
  with st.expander(f"📄 Kaynaklar ({len(item['sources'])})"):
226
  for s in item["sources"]:
 
227
  norm = s.get("hybrid_score") or max(0.0, min(1.0, (s.get("rerank_score", 0) - (-10)) / 12))
228
  pct = int(norm * 100)
229
  color = "#2d8a45" if pct >= 60 else "#e6a817" if pct >= 40 else "#c0392b"